summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:16:42 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:16:42 +0000
commita3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (patch)
treef4a8a34f904c1bb86adcc3ae0e14434badc6dbe4 /Build/source
parent6c0eafbb1395d426a72a74538e0b2a95e8344ca6 (diff)
utils 1
git-svn-id: svn://tug.org/texlive/trunk@1484 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
-rw-r--r--Build/source/utils/README33
-rw-r--r--Build/source/utils/bzip2/CHANGES253
-rw-r--r--Build/source/utils/bzip2/LICENSE39
-rw-r--r--Build/source/utils/bzip2/README181
-rw-r--r--Build/source/utils/bzip2/README.COMPILATION.PROBLEMS130
-rw-r--r--Build/source/utils/bzip2/Y2K_INFO34
-rw-r--r--Build/source/utils/bzip2/blocksort.c1141
-rw-r--r--Build/source/utils/bzip2/bz2lib.rc34
-rw-r--r--Build/source/utils/bzip2/bzdiff76
-rw-r--r--Build/source/utils/bzip2/bzdiff.147
-rw-r--r--Build/source/utils/bzip2/bzgrep71
-rw-r--r--Build/source/utils/bzip2/bzgrep.156
-rw-r--r--Build/source/utils/bzip2/bzip2.1453
-rw-r--r--Build/source/utils/bzip2/bzip2.1.preformatted398
-rw-r--r--Build/source/utils/bzip2/bzip2.c2104
-rw-r--r--Build/source/utils/bzip2/bzip2.txt390
-rw-r--r--Build/source/utils/bzip2/bzip2recover.c546
-rw-r--r--Build/source/utils/bzip2/bzlib.c1594
-rw-r--r--Build/source/utils/bzip2/bzlib.h321
-rw-r--r--Build/source/utils/bzip2/bzlib_private.h537
-rw-r--r--Build/source/utils/bzip2/bzmore61
-rw-r--r--Build/source/utils/bzip2/bzmore.1152
-rw-r--r--Build/source/utils/bzip2/compress.c714
-rw-r--r--Build/source/utils/bzip2/crctable.c144
-rw-r--r--Build/source/utils/bzip2/decompress.c660
-rw-r--r--Build/source/utils/bzip2/depend.mak46
-rw-r--r--Build/source/utils/bzip2/dlltest.c176
-rw-r--r--Build/source/utils/bzip2/dlltest.dsp93
-rw-r--r--Build/source/utils/bzip2/huffman.c228
-rw-r--r--Build/source/utils/bzip2/libbz2.def27
-rw-r--r--Build/source/utils/bzip2/libbz2.dsp130
-rw-r--r--Build/source/utils/bzip2/makefile.msc63
-rw-r--r--Build/source/utils/bzip2/manual.pdfbin0 -> 196584 bytes
-rw-r--r--Build/source/utils/bzip2/manual.ps3991
-rw-r--r--Build/source/utils/bzip2/manual.texi2243
-rw-r--r--Build/source/utils/bzip2/manual_1.html81
-rw-r--r--Build/source/utils/bzip2/manual_2.html579
-rw-r--r--Build/source/utils/bzip2/manual_3.html1855
-rw-r--r--Build/source/utils/bzip2/manual_4.html530
-rw-r--r--Build/source/utils/bzip2/manual_abt.html201
-rw-r--r--Build/source/utils/bzip2/manual_ovr.html54
-rw-r--r--Build/source/utils/bzip2/manual_toc.html163
-rw-r--r--Build/source/utils/bzip2/mk251.c16
-rw-r--r--Build/source/utils/bzip2/randtable.c124
-rw-r--r--Build/source/utils/bzip2/sample1.bz2bin0 -> 32348 bytes
-rw-r--r--Build/source/utils/bzip2/sample1.refbin0 -> 98696 bytes
-rw-r--r--Build/source/utils/bzip2/sample2.bz2bin0 -> 73732 bytes
-rw-r--r--Build/source/utils/bzip2/sample2.refbin0 -> 212340 bytes
-rw-r--r--Build/source/utils/bzip2/sample3.ref30007
-rw-r--r--Build/source/utils/bzip2/spewG.c39
-rw-r--r--Build/source/utils/bzip2/unzcrash.c126
-rw-r--r--Build/source/utils/bzip2/win32.mak96
-rw-r--r--Build/source/utils/bzip2/words05
-rw-r--r--Build/source/utils/bzip2/words14
-rw-r--r--Build/source/utils/bzip2/words25
-rw-r--r--Build/source/utils/bzip2/words323
-rw-r--r--Build/source/utils/dialog/COPYING339
-rw-r--r--Build/source/utils/dialog/Makefile.in162
-rw-r--r--Build/source/utils/dialog/README148
-rw-r--r--Build/source/utils/dialog/checklist.c358
-rw-r--r--Build/source/utils/dialog/colors.h219
-rwxr-xr-xBuild/source/utils/dialog/configure1793
-rw-r--r--Build/source/utils/dialog/configure.in20
-rw-r--r--Build/source/utils/dialog/dialog.c610
-rw-r--r--Build/source/utils/dialog/dialog.h247
-rw-r--r--Build/source/utils/dialog/dialog.man217
-rw-r--r--Build/source/utils/dialog/dialogconfig.h.in8
-rw-r--r--Build/source/utils/dialog/gauge.c114
-rw-r--r--Build/source/utils/dialog/inputbox.c230
-rw-r--r--Build/source/utils/dialog/menubox.c316
-rwxr-xr-xBuild/source/utils/dialog/mkinstalldirs40
-rw-r--r--Build/source/utils/dialog/msgbox.c81
-rw-r--r--Build/source/utils/dialog/radiolist.c352
-rw-r--r--Build/source/utils/dialog/rc.c377
-rw-r--r--Build/source/utils/dialog/rc.h223
-rw-r--r--Build/source/utils/dialog/strcasecmp.c31
-rw-r--r--Build/source/utils/dialog/textbox.c709
-rw-r--r--Build/source/utils/dialog/yesno.c112
-rw-r--r--Build/source/utils/gzip/COPYING339
-rw-r--r--Build/source/utils/gzip/ChangeLog587
-rw-r--r--Build/source/utils/gzip/INSTALL273
-rw-r--r--Build/source/utils/gzip/Makefile.in386
-rw-r--r--Build/source/utils/gzip/NEWS221
-rw-r--r--Build/source/utils/gzip/README143
-rw-r--r--Build/source/utils/gzip/THANKS276
-rw-r--r--Build/source/utils/gzip/TODO58
-rw-r--r--Build/source/utils/gzip/_gztest3350
-rw-r--r--Build/source/utils/gzip/algorithm.doc164
-rw-r--r--Build/source/utils/gzip/amiga/Makefile.gcc62
-rw-r--r--Build/source/utils/gzip/amiga/Makefile.sasc59
-rw-r--r--Build/source/utils/gzip/amiga/match.a175
-rw-r--r--Build/source/utils/gzip/amiga/tailor.c183
-rw-r--r--Build/source/utils/gzip/amiga/utime.h15
-rw-r--r--Build/source/utils/gzip/atari/Makefile.st48
-rw-r--r--Build/source/utils/gzip/bits.c205
-rwxr-xr-xBuild/source/utils/gzip/configure826
-rw-r--r--Build/source/utils/gzip/configure.in98
-rw-r--r--Build/source/utils/gzip/crypt.c6
-rw-r--r--Build/source/utils/gzip/crypt.h12
-rw-r--r--Build/source/utils/gzip/deflate.c763
-rw-r--r--Build/source/utils/gzip/depend.mak82
-rw-r--r--Build/source/utils/gzip/getopt.c757
-rw-r--r--Build/source/utils/gzip/getopt.h127
-rw-r--r--Build/source/utils/gzip/gpl.texinfo394
-rw-r--r--Build/source/utils/gzip/gzexe.143
-rw-r--r--Build/source/utils/gzip/gzexe.in151
-rw-r--r--Build/source/utils/gzip/gzip.1478
-rw-r--r--Build/source/utils/gzip/gzip.c1744
-rw-r--r--Build/source/utils/gzip/gzip.doc350
-rw-r--r--Build/source/utils/gzip/gzip.h319
-rw-r--r--Build/source/utils/gzip/gzip.texi478
-rw-r--r--Build/source/utils/gzip/gzip_1.html459
-rw-r--r--Build/source/utils/gzip/gzip_2.html119
-rw-r--r--Build/source/utils/gzip/gzip_3.html71
-rw-r--r--Build/source/utils/gzip/gzip_4.html206
-rw-r--r--Build/source/utils/gzip/gzip_5.html104
-rw-r--r--Build/source/utils/gzip/gzip_6.html38
-rw-r--r--Build/source/utils/gzip/gzip_7.html44
-rw-r--r--Build/source/utils/gzip/gzip_8.html29
-rw-r--r--Build/source/utils/gzip/gzip_9.html64
-rw-r--r--Build/source/utils/gzip/gzip_toc.html34
-rw-r--r--Build/source/utils/gzip/inflate.c954
-rw-r--r--Build/source/utils/gzip/lzw.c26
-rw-r--r--Build/source/utils/gzip/lzw.h42
-rw-r--r--Build/source/utils/gzip/man.ps0
-rw-r--r--Build/source/utils/gzip/msdos/Makefile.bor118
-rw-r--r--Build/source/utils/gzip/msdos/Makefile.djg224
-rw-r--r--Build/source/utils/gzip/msdos/Makefile.msc108
-rwxr-xr-xBuild/source/utils/gzip/msdos/doturboc.bat18
-rw-r--r--Build/source/utils/gzip/msdos/gzip.prj17
-rw-r--r--Build/source/utils/gzip/msdos/match.asm240
-rw-r--r--Build/source/utils/gzip/msdos/tailor.c58
-rw-r--r--Build/source/utils/gzip/nt/Makefile.nt66
-rw-r--r--Build/source/utils/gzip/os2/Makefile.os281
-rw-r--r--Build/source/utils/gzip/os2/gzip.def3
-rw-r--r--Build/source/utils/gzip/os2/gzip16.def2
-rw-r--r--Build/source/utils/gzip/primos/build.cpl76
-rw-r--r--Build/source/utils/gzip/primos/ci.opts6
-rw-r--r--Build/source/utils/gzip/primos/include/errno.h17
-rw-r--r--Build/source/utils/gzip/primos/include/fcntl.h22
-rw-r--r--Build/source/utils/gzip/primos/include/stdlib.h16
-rw-r--r--Build/source/utils/gzip/primos/include/sysStat.h92
-rw-r--r--Build/source/utils/gzip/primos/include/sysTypes.h25
-rw-r--r--Build/source/utils/gzip/primos/primos.c122
-rw-r--r--Build/source/utils/gzip/primos/readme27
-rw-r--r--Build/source/utils/gzip/revision.h16
-rw-r--r--Build/source/utils/gzip/sample/add.c57
-rw-r--r--Build/source/utils/gzip/sample/makecrc.c63
-rw-r--r--Build/source/utils/gzip/sample/sub.c88
-rw-r--r--Build/source/utils/gzip/sample/zfile28
-rw-r--r--Build/source/utils/gzip/sample/zread.c53
-rw-r--r--Build/source/utils/gzip/sample/ztouch15
-rw-r--r--Build/source/utils/gzip/tailor.h342
-rw-r--r--Build/source/utils/gzip/trees.c1075
-rw-r--r--Build/source/utils/gzip/unlzh.c401
-rw-r--r--Build/source/utils/gzip/unlzw-new.c377
-rw-r--r--Build/source/utils/gzip/unlzw.c377
-rw-r--r--Build/source/utils/gzip/unpack.c239
-rw-r--r--Build/source/utils/gzip/unzip.c199
-rw-r--r--Build/source/utils/gzip/util.c466
-rw-r--r--Build/source/utils/gzip/vms/Makefile.gcc131
-rw-r--r--Build/source/utils/gzip/vms/Makefile.mms122
-rw-r--r--Build/source/utils/gzip/vms/Makefile.vms133
-rw-r--r--Build/source/utils/gzip/vms/Readme.vms87
-rw-r--r--Build/source/utils/gzip/vms/gzip.hlp297
-rwxr-xr-xBuild/source/utils/gzip/vms/makegzip.com71
-rw-r--r--Build/source/utils/gzip/vms/vms.c102
-rw-r--r--Build/source/utils/gzip/win32.mak88
-rw-r--r--Build/source/utils/gzip/zdiff.144
-rw-r--r--Build/source/utils/gzip/zdiff.in70
-rw-r--r--Build/source/utils/gzip/zforce.120
-rw-r--r--Build/source/utils/gzip/zforce.in42
-rw-r--r--Build/source/utils/gzip/zgrep.144
-rw-r--r--Build/source/utils/gzip/zgrep.in67
-rw-r--r--Build/source/utils/gzip/zip.c117
-rw-r--r--Build/source/utils/gzip/zmore.1145
-rw-r--r--Build/source/utils/gzip/zmore.in52
-rw-r--r--Build/source/utils/gzip/znew.139
-rw-r--r--Build/source/utils/gzip/znew.in146
-rw-r--r--Build/source/utils/jpeg2ps/Makefile68
-rw-r--r--Build/source/utils/jpeg2ps/asc85ec.c129
-rw-r--r--Build/source/utils/jpeg2ps/depend.mak13
-rw-r--r--Build/source/utils/jpeg2ps/descrip.mms40
-rw-r--r--Build/source/utils/jpeg2ps/getopt.c119
-rw-r--r--Build/source/utils/jpeg2ps/jpeg2ps.c422
-rw-r--r--Build/source/utils/jpeg2ps/jpeg2ps.dsp86
-rw-r--r--Build/source/utils/jpeg2ps/jpeg2ps.pdf110
-rw-r--r--Build/source/utils/jpeg2ps/jpeg2ps.txt338
-rw-r--r--Build/source/utils/jpeg2ps/psimage.h48
-rw-r--r--Build/source/utils/jpeg2ps/readjpeg.c323
-rw-r--r--Build/source/utils/jpeg2ps/win32.mak46
-rw-r--r--Build/source/utils/lcdf-typetools/7t.enc65
-rw-r--r--Build/source/utils/lcdf-typetools/COPYING416
-rw-r--r--Build/source/utils/lcdf-typetools/ChangeLog2420
-rw-r--r--Build/source/utils/lcdf-typetools/INSTALL176
-rw-r--r--Build/source/utils/lcdf-typetools/Makefile.am71
-rw-r--r--Build/source/utils/lcdf-typetools/Makefile.in679
-rw-r--r--Build/source/utils/lcdf-typetools/NEWS718
-rw-r--r--Build/source/utils/lcdf-typetools/ONEWS433
-rw-r--r--Build/source/utils/lcdf-typetools/README140
-rw-r--r--Build/source/utils/lcdf-typetools/aclocal.m41084
-rw-r--r--Build/source/utils/lcdf-typetools/cfftot1/Makefile.am15
-rw-r--r--Build/source/utils/lcdf-typetools/cfftot1/Makefile.in474
-rw-r--r--Build/source/utils/lcdf-typetools/cfftot1/cfftot1.187
-rw-r--r--Build/source/utils/lcdf-typetools/cfftot1/cfftot1.cc257
-rw-r--r--Build/source/utils/lcdf-typetools/cfftot1/maket1font.cc545
-rw-r--r--Build/source/utils/lcdf-typetools/cfftot1/maket1font.hh10
-rw-r--r--Build/source/utils/lcdf-typetools/config.h.in208
-rwxr-xr-xBuild/source/utils/lcdf-typetools/configure9953
-rw-r--r--Build/source/utils/lcdf-typetools/configure.in475
-rw-r--r--Build/source/utils/lcdf-typetools/depcomp522
-rw-r--r--Build/source/utils/lcdf-typetools/glyphlist.txt4423
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/afm.hh59
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/afmparse.hh64
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/afmw.hh29
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/amfm.hh153
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/cff.hh452
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/encoding.hh27
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/findmet.hh114
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/metrics.hh177
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otf.hh376
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otfcmap.hh48
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otfdata.hh119
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otfgpos.hh231
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otfgsub.hh396
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otfname.hh125
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/otfos2.hh69
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/pairop.hh113
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/psres.hh74
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1bounds.hh93
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1cs.hh339
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1csgen.hh119
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1font.hh167
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1interp.hh239
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1item.hh268
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1mm.hh108
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1rw.hh232
-rw-r--r--Build/source/utils/lcdf-typetools/include/efont/t1unparser.hh39
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/bezier.hh136
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/clp.h167
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/error.hh187
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/filename.hh41
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/globmatch.hh8
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/hashmap.cc187
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/hashmap.hh223
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/inttypes.h34
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/landmark.hh39
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/permstr.hh167
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/point.hh185
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/slurper.hh63
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/straccum.hh279
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/string.hh460
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/strtonum.h10
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/transform.hh162
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/vector.cc130
-rw-r--r--Build/source/utils/lcdf-typetools/include/lcdf/vector.hh255
-rwxr-xr-xBuild/source/utils/lcdf-typetools/install-sh322
-rw-r--r--Build/source/utils/lcdf-typetools/lcdf-typetools.spec89
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/Makefile.am48
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/Makefile.in467
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/afm.cc586
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/afmparse.cc365
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/afmw.cc190
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/amfm.cc850
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/cff.cc1684
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/encoding.cc29
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/findmet.cc321
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/metrics.cc130
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otf.cc1237
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfcmap.cc447
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfdata.cc43
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfdescrip.cc611
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfgpos.cc295
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfgsub.cc1139
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfname.cc67
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/otfos2.cc48
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/pairop.cc153
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/psres.cc422
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1bounds.cc161
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1cs.cc364
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1csgen.cc568
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1font.cc887
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1fontskel.cc412
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1interp.cc1376
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1item.cc861
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1mm.cc392
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1rw.cc610
-rw-r--r--Build/source/utils/lcdf-typetools/libefont/t1unparser.cc137
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/Makefile.am44
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/Makefile.in460
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/bezier.cc376
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/clp.c1624
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/error.cc883
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/filename.cc130
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/fixlibc.c64
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/globmatch.cc116
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/landmark.cc36
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/permstr.cc370
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/point.cc57
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/slurper.cc187
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/straccum.cc180
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/string.cc548
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/strtonum.c31
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/transform.cc167
-rw-r--r--Build/source/utils/lcdf-typetools/liblcdf/vectorv.cc110
-rw-r--r--Build/source/utils/lcdf-typetools/missing353
-rwxr-xr-xBuild/source/utils/lcdf-typetools/mkinstalldirs99
-rw-r--r--Build/source/utils/lcdf-typetools/mmafm/Makefile.am14
-rw-r--r--Build/source/utils/lcdf-typetools/mmafm/Makefile.in467
-rw-r--r--Build/source/utils/lcdf-typetools/mmafm/main.cc433
-rw-r--r--Build/source/utils/lcdf-typetools/mmafm/mmafm.1183
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/Makefile.am17
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/Makefile.in479
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/main.cc462
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/mmpfb.1211
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/myfont.cc300
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/myfont.hh31
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/t1minimize.cc43
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/t1minimize.hh7
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.cc922
-rw-r--r--Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.hh68
-rw-r--r--Build/source/utils/lcdf-typetools/otfinfo/Makefile.am16
-rw-r--r--Build/source/utils/lcdf-typetools/otfinfo/Makefile.in469
-rw-r--r--Build/source/utils/lcdf-typetools/otfinfo/otfinfo.1143
-rw-r--r--Build/source/utils/lcdf-typetools/otfinfo/otfinfo.cc485
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/Makefile.am28
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/Makefile.in511
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/automatic.cc652
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/automatic.hh23
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.cc795
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.hh103
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.cc235
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.hh110
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.c70
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.h18
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/md5.c354
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/md5.h48
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/metrics.cc1410
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/metrics.hh254
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/otftotfm.11473
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/otftotfm.cc1945
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/otftotfm.hh18
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/secondary.cc514
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/secondary.hh47
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/uniprop.cc340
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/uniprop.hh34
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/util.cc232
-rw-r--r--Build/source/utils/lcdf-typetools/otftotfm/util.hh29
-rw-r--r--Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.am14
-rw-r--r--Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.in467
-rw-r--r--Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.196
-rw-r--r--Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.cc410
-rw-r--r--Build/source/utils/lcdf-typetools/t1lint/Makefile.am15
-rw-r--r--Build/source/utils/lcdf-typetools/t1lint/Makefile.in474
-rw-r--r--Build/source/utils/lcdf-typetools/t1lint/cscheck.cc457
-rw-r--r--Build/source/utils/lcdf-typetools/t1lint/cscheck.hh50
-rw-r--r--Build/source/utils/lcdf-typetools/t1lint/t1lint.148
-rw-r--r--Build/source/utils/lcdf-typetools/t1lint/t1lint.cc437
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/Makefile.am16
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/Makefile.in491
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/md5.c354
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/md5.h48
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/t1reencode.1149
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/t1reencode.cc657
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/util.cc77
-rw-r--r--Build/source/utils/lcdf-typetools/t1reencode/util.hh10
-rw-r--r--Build/source/utils/lcdf-typetools/t1testpage/Makefile.am14
-rw-r--r--Build/source/utils/lcdf-typetools/t1testpage/Makefile.in467
-rw-r--r--Build/source/utils/lcdf-typetools/t1testpage/t1testpage.162
-rw-r--r--Build/source/utils/lcdf-typetools/t1testpage/t1testpage.cc664
-rw-r--r--Build/source/utils/pdfopen/Makefile.am11
-rw-r--r--Build/source/utils/pdfopen/Makefile.in527
-rw-r--r--Build/source/utils/pdfopen/README75
-rw-r--r--Build/source/utils/pdfopen/aclocal.m4850
-rwxr-xr-xBuild/source/utils/pdfopen/config/depcomp522
-rwxr-xr-xBuild/source/utils/pdfopen/config/install-sh323
-rwxr-xr-xBuild/source/utils/pdfopen/config/missing353
-rwxr-xr-xBuild/source/utils/pdfopen/config/mkinstalldirs150
-rwxr-xr-xBuild/source/utils/pdfopen/configure5636
-rw-r--r--Build/source/utils/pdfopen/configure.ac25
-rw-r--r--Build/source/utils/pdfopen/pdfclose.c48
-rw-r--r--Build/source/utils/pdfopen/pdfopen.c71
-rw-r--r--Build/source/utils/pdfopen/sendx.c290
-rw-r--r--Build/source/utils/psutils/LICENSE47
-rw-r--r--Build/source/utils/psutils/Makefile.bcc108
-rw-r--r--Build/source/utils/psutils/Makefile.in229
-rw-r--r--Build/source/utils/psutils/Makefile.msc108
-rw-r--r--Build/source/utils/psutils/Makefile.nt146
-rw-r--r--Build/source/utils/psutils/Makefile.os2245
-rw-r--r--Build/source/utils/psutils/Makefile.sc108
-rw-r--r--Build/source/utils/psutils/Makefile.unix250
-rw-r--r--Build/source/utils/psutils/Makefile.wat108
-rw-r--r--Build/source/utils/psutils/README245
-rw-r--r--Build/source/utils/psutils/config.h33
-rwxr-xr-xBuild/source/utils/psutils/configure1317
-rw-r--r--Build/source/utils/psutils/configure.in14
-rw-r--r--Build/source/utils/psutils/depend.mak58
-rw-r--r--Build/source/utils/psutils/descrip.mms63
-rw-r--r--Build/source/utils/psutils/epsffit.c190
-rw-r--r--Build/source/utils/psutils/epsffit.man51
-rw-r--r--Build/source/utils/psutils/extractres.man47
-rw-r--r--Build/source/utils/psutils/extractres.pl96
-rw-r--r--Build/source/utils/psutils/fixdlsrps.man24
-rw-r--r--Build/source/utils/psutils/fixdlsrps.pl54
-rw-r--r--Build/source/utils/psutils/fixfmps.man24
-rw-r--r--Build/source/utils/psutils/fixfmps.pl21
-rw-r--r--Build/source/utils/psutils/fixmacps.man27
-rw-r--r--Build/source/utils/psutils/fixmacps.pl95
-rw-r--r--Build/source/utils/psutils/fixpsditps.man24
-rw-r--r--Build/source/utils/psutils/fixpsditps.pl25
-rw-r--r--Build/source/utils/psutils/fixpspps.man24
-rw-r--r--Build/source/utils/psutils/fixpspps.pl58
-rw-r--r--Build/source/utils/psutils/fixscribeps.man24
-rw-r--r--Build/source/utils/psutils/fixscribeps.pl19
-rw-r--r--Build/source/utils/psutils/fixtpps.man24
-rw-r--r--Build/source/utils/psutils/fixtpps.pl28
-rw-r--r--Build/source/utils/psutils/fixwfwps.man24
-rw-r--r--Build/source/utils/psutils/fixwfwps.pl33
-rw-r--r--Build/source/utils/psutils/fixwpps.man24
-rw-r--r--Build/source/utils/psutils/fixwpps.pl31
-rw-r--r--Build/source/utils/psutils/fixwwps.man24
-rw-r--r--Build/source/utils/psutils/fixwwps.pl20
-rw-r--r--Build/source/utils/psutils/getafm.man29
-rw-r--r--Build/source/utils/psutils/getafm.sh358
-rw-r--r--Build/source/utils/psutils/includeres.man41
-rw-r--r--Build/source/utils/psutils/includeres.pl46
-rw-r--r--Build/source/utils/psutils/maketext51
-rw-r--r--Build/source/utils/psutils/md68_0.ps437
-rw-r--r--Build/source/utils/psutils/md71_0.ps461
-rw-r--r--Build/source/utils/psutils/patchlev.h.in6
-rw-r--r--Build/source/utils/psutils/psbook.c111
-rw-r--r--Build/source/utils/psutils/psbook.man42
-rw-r--r--Build/source/utils/psutils/pserror.c122
-rw-r--r--Build/source/utils/psutils/pserror.h20
-rw-r--r--Build/source/utils/psutils/psmerge.man36
-rw-r--r--Build/source/utils/psutils/psmerge.pl85
-rw-r--r--Build/source/utils/psutils/psnup.c336
-rw-r--r--Build/source/utils/psutils/psnup.man160
-rw-r--r--Build/source/utils/psutils/psresize.c180
-rw-r--r--Build/source/utils/psutils/psresize.man81
-rw-r--r--Build/source/utils/psutils/psselect.c239
-rw-r--r--Build/source/utils/psutils/psselect.man84
-rw-r--r--Build/source/utils/psutils/psspec.c249
-rw-r--r--Build/source/utils/psutils/psspec.h30
-rw-r--r--Build/source/utils/psutils/pstops.c198
-rw-r--r--Build/source/utils/psutils/pstops.man166
-rw-r--r--Build/source/utils/psutils/psutil.c344
-rw-r--r--Build/source/utils/psutils/psutil.h52
-rw-r--r--Build/source/utils/psutils/showchar.sh118
-rw-r--r--Build/source/utils/psutils/win32.mak195
-rw-r--r--Build/source/utils/t1utils/INSTALL176
-rw-r--r--Build/source/utils/t1utils/Makefile.am49
-rw-r--r--Build/source/utils/t1utils/Makefile.in693
-rw-r--r--Build/source/utils/t1utils/NEWS285
-rw-r--r--Build/source/utils/t1utils/README81
-rw-r--r--Build/source/utils/t1utils/aclocal.m41044
-rw-r--r--Build/source/utils/t1utils/clp.c1533
-rwxr-xr-xBuild/source/utils/t1utils/config.guess1465
-rw-r--r--Build/source/utils/t1utils/config.h.in98
-rwxr-xr-xBuild/source/utils/t1utils/config.sub1579
-rwxr-xr-xBuild/source/utils/t1utils/configure6751
-rw-r--r--Build/source/utils/t1utils/configure.in110
-rw-r--r--Build/source/utils/t1utils/depcomp520
-rw-r--r--Build/source/utils/t1utils/include/lcdf/clp.h153
-rw-r--r--Build/source/utils/t1utils/include/lcdf/inttypes.h34
-rwxr-xr-xBuild/source/utils/t1utils/install-sh295
-rwxr-xr-xBuild/source/utils/t1utils/missing360
-rwxr-xr-xBuild/source/utils/t1utils/mkinstalldirs111
-rw-r--r--Build/source/utils/t1utils/strerror.c25
-rw-r--r--Build/source/utils/t1utils/t1ascii.151
-rw-r--r--Build/source/utils/t1utils/t1ascii.c306
-rw-r--r--Build/source/utils/t1utils/t1asm.196
-rw-r--r--Build/source/utils/t1utils/t1asm.c812
-rw-r--r--Build/source/utils/t1utils/t1binary.142
-rw-r--r--Build/source/utils/t1utils/t1binary.c283
-rw-r--r--Build/source/utils/t1utils/t1disasm.196
-rw-r--r--Build/source/utils/t1utils/t1disasm.c777
-rw-r--r--Build/source/utils/t1utils/t1lib.c441
-rw-r--r--Build/source/utils/t1utils/t1lib.h49
-rw-r--r--Build/source/utils/t1utils/t1mac.162
-rw-r--r--Build/source/utils/t1utils/t1mac.c1022
-rw-r--r--Build/source/utils/t1utils/t1unmac.171
-rw-r--r--Build/source/utils/t1utils/t1unmac.c923
-rw-r--r--Build/source/utils/t1utils/t1utils.spec53
-rw-r--r--Build/source/utils/texi2html/AUTHORS5
-rw-r--r--Build/source/utils/texi2html/COPYING340
-rw-r--r--Build/source/utils/texi2html/ChangeLog2180
-rw-r--r--Build/source/utils/texi2html/INSTALL182
-rw-r--r--Build/source/utils/texi2html/INTRODUCTION88
-rw-r--r--Build/source/utils/texi2html/Makefile.am125
-rw-r--r--Build/source/utils/texi2html/Makefile.in817
-rw-r--r--Build/source/utils/texi2html/MySimple.pm236
-rw-r--r--Build/source/utils/texi2html/MySimple.pod187
-rw-r--r--Build/source/utils/texi2html/NEWS399
-rw-r--r--Build/source/utils/texi2html/README113
-rw-r--r--Build/source/utils/texi2html/T2h_i18n.pm400
-rw-r--r--Build/source/utils/texi2html/TODO89
-rw-r--r--Build/source/utils/texi2html/Tests/Makefile.am24
-rw-r--r--Build/source/utils/texi2html/Tests/Makefile.in293
-rw-r--r--Build/source/utils/texi2html/Tests/README112
-rw-r--r--Build/source/utils/texi2html/aclocal.m4750
-rwxr-xr-xBuild/source/utils/texi2html/autogen.sh14
-rwxr-xr-xBuild/source/utils/texi2html/check_texinfo.pl.in83
-rwxr-xr-xBuild/source/utils/texi2html/config.guess1465
-rwxr-xr-xBuild/source/utils/texi2html/config.sub1579
-rwxr-xr-xBuild/source/utils/texi2html/configure2924
-rw-r--r--Build/source/utils/texi2html/configure.ac73
-rw-r--r--Build/source/utils/texi2html/doc/Makefile.am41
-rw-r--r--Build/source/utils/texi2html/doc/Makefile.in512
-rw-r--r--Build/source/utils/texi2html/doc/TODO5
-rwxr-xr-xBuild/source/utils/texi2html/doc/mdate-sh92
-rw-r--r--Build/source/utils/texi2html/doc/stamp-vti4
-rw-r--r--Build/source/utils/texi2html/doc/texi2html.html6072
-rw-r--r--Build/source/utils/texi2html/doc/texi2html.info176
-rw-r--r--Build/source/utils/texi2html/doc/texi2html.info-11299
-rw-r--r--Build/source/utils/texi2html/doc/texi2html.info-21262
-rw-r--r--Build/source/utils/texi2html/doc/texi2html.info-31085
-rw-r--r--Build/source/utils/texi2html/doc/texi2html.texi3426
-rw-r--r--Build/source/utils/texi2html/doc/texinfo.tex6882
-rw-r--r--Build/source/utils/texi2html/doc/version.texi4
-rw-r--r--Build/source/utils/texi2html/examples/book.init197
-rw-r--r--Build/source/utils/texi2html/examples/chm.init366
-rw-r--r--Build/source/utils/texi2html/examples/html32.init205
-rw-r--r--Build/source/utils/texi2html/examples/inlinestyle.init39
-rw-r--r--Build/source/utils/texi2html/examples/makeinfo.init147
-rw-r--r--Build/source/utils/texi2html/examples/noheaders.init137
-rw-r--r--Build/source/utils/texi2html/examples/roff.init1165
-rw-r--r--Build/source/utils/texi2html/examples/utf8.init27
-rw-r--r--Build/source/utils/texi2html/examples/xhtml.init188
-rw-r--r--Build/source/utils/texi2html/i18n/de114
-rw-r--r--Build/source/utils/texi2html/i18n/en110
-rw-r--r--Build/source/utils/texi2html/i18n/es114
-rw-r--r--Build/source/utils/texi2html/i18n/fr139
-rw-r--r--Build/source/utils/texi2html/i18n/nl114
-rw-r--r--Build/source/utils/texi2html/i18n/no114
-rw-r--r--Build/source/utils/texi2html/i18n/pt114
-rw-r--r--Build/source/utils/texi2html/images/COPYING6
-rw-r--r--Build/source/utils/texi2html/images/Mybg.gifbin0 -> 857 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_begin.gifbin0 -> 915 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_begin_na.gifbin0 -> 909 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_document.gifbin0 -> 927 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_document_na.gifbin0 -> 926 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_empty.gifbin0 -> 879 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_end.gifbin0 -> 918 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_end_na.gifbin0 -> 915 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_help.gifbin0 -> 908 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_help_na.gifbin0 -> 912 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_index.gifbin0 -> 931 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_index_na.gifbin0 -> 943 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_left.gifbin0 -> 900 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_left_na.gifbin0 -> 896 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_leftdouble.gifbin0 -> 916 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_leftdouble_na.gifbin0 -> 916 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_page.gifbin0 -> 921 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_page_na.gifbin0 -> 919 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_right.gifbin0 -> 905 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_right_na.gifbin0 -> 904 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_rightdouble.gifbin0 -> 918 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_rightdouble_na.gifbin0 -> 924 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_search.gifbin0 -> 932 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_search_na.gifbin0 -> 931 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_searchdoc.gifbin0 -> 960 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_searchdoc_na.gifbin0 -> 941 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_tableofcon.gifbin0 -> 932 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_tableofcon_na.gifbin0 -> 944 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_top.gifbin0 -> 900 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_top_na.gifbin0 -> 901 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_up.gifbin0 -> 894 bytes
-rwxr-xr-xBuild/source/utils/texi2html/images/a_up_na.gifbin0 -> 894 bytes
-rw-r--r--Build/source/utils/texi2html/images/bg.jpgbin0 -> 2572 bytes
-rw-r--r--Build/source/utils/texi2html/images/bg_left.gifbin0 -> 160 bytes
-rw-r--r--Build/source/utils/texi2html/images/bg_right.gifbin0 -> 374 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_dir.gifbin0 -> 244 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_down.gifbin0 -> 141 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_grab.gifbin0 -> 169 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_help.gifbin0 -> 155 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_next.gifbin0 -> 138 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_nnext.gifbin0 -> 161 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_pprev.gifbin0 -> 165 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_prev.gifbin0 -> 138 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_readme.gifbin0 -> 245 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_top.gifbin0 -> 161 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_up.gifbin0 -> 140 bytes
-rw-r--r--Build/source/utils/texi2html/images/blue_uup.gifbin0 -> 165 bytes
-rw-r--r--Build/source/utils/texi2html/images/contents_motif.gifbin0 -> 225 bytes
-rw-r--r--Build/source/utils/texi2html/images/index_motif.gifbin0 -> 180 bytes
-rw-r--r--Build/source/utils/texi2html/images/next_motif.gifbin0 -> 172 bytes
-rw-r--r--Build/source/utils/texi2html/images/next_motif_gr.gifbin0 -> 172 bytes
-rw-r--r--Build/source/utils/texi2html/images/previous_motif.gifbin0 -> 220 bytes
-rw-r--r--Build/source/utils/texi2html/images/previous_motif_gr.gifbin0 -> 220 bytes
-rw-r--r--Build/source/utils/texi2html/images/spacer3.gifbin0 -> 45 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_contents.gifbin0 -> 120 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_foot.gifbin0 -> 73 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_next.gifbin0 -> 115 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_next_gr.gifbin0 -> 110 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_nextsection.gifbin0 -> 137 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_nextsection_gr.gifbin0 -> 131 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_previous.gifbin0 -> 113 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_previous_gr.gifbin0 -> 110 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_previoussection.gifbin0 -> 136 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_previoussection_gr.gifbin0 -> 132 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_up.gifbin0 -> 107 bytes
-rw-r--r--Build/source/utils/texi2html/images/xy_up_gr.gifbin0 -> 101 bytes
-rwxr-xr-xBuild/source/utils/texi2html/install-sh251
-rw-r--r--Build/source/utils/texi2html/l2h.init168
-rwxr-xr-xBuild/source/utils/texi2html/manage_i18n.pl397
-rwxr-xr-xBuild/source/utils/texi2html/mdate-sh92
-rwxr-xr-xBuild/source/utils/texi2html/missing265
-rwxr-xr-xBuild/source/utils/texi2html/missing-texi2html96
-rwxr-xr-xBuild/source/utils/texi2html/mkinstalldirs40
-rw-r--r--Build/source/utils/texi2html/texi2html.1.in164
-rw-r--r--Build/source/utils/texi2html/texi2html.init4254
-rwxr-xr-xBuild/source/utils/texi2html/texi2html.pl11827
-rw-r--r--Build/source/utils/texi2html/texi2html.spec65
-rw-r--r--Build/source/utils/texi2html/texi2html.spec.in65
-rw-r--r--Build/source/utils/texi2html/translations.pl819
-rw-r--r--Build/source/utils/texinfo/ABOUT-NLS768
-rw-r--r--Build/source/utils/texinfo/AUTHORS31
-rw-r--r--Build/source/utils/texinfo/COPYING340
-rw-r--r--Build/source/utils/texinfo/ChangeLog5008
-rw-r--r--Build/source/utils/texinfo/ChangeLog.4612516
-rw-r--r--Build/source/utils/texinfo/INSTALL45
-rw-r--r--Build/source/utils/texinfo/INSTALL.generic231
-rw-r--r--Build/source/utils/texinfo/INTRODUCTION108
-rw-r--r--Build/source/utils/texinfo/Makefile.am55
-rw-r--r--Build/source/utils/texinfo/Makefile.in679
-rw-r--r--Build/source/utils/texinfo/NEWS728
-rw-r--r--Build/source/utils/texinfo/README112
-rw-r--r--Build/source/utils/texinfo/README.dev44
-rw-r--r--Build/source/utils/texinfo/TODO181
-rw-r--r--Build/source/utils/texinfo/acinclude.m489
-rw-r--r--Build/source/utils/texinfo/aclocal.m41090
-rwxr-xr-xBuild/source/utils/texinfo/config.guess1465
-rw-r--r--Build/source/utils/texinfo/config.in420
-rwxr-xr-xBuild/source/utils/texinfo/config.rpath548
-rwxr-xr-xBuild/source/utils/texinfo/config.sub1579
-rwxr-xr-xBuild/source/utils/texinfo/configure14795
-rw-r--r--Build/source/utils/texinfo/configure.ac224
-rwxr-xr-xBuild/source/utils/texinfo/depcomp522
-rw-r--r--Build/source/utils/texinfo/djgpp/README431
-rwxr-xr-xBuild/source/utils/texinfo/djgpp/config.bat240
-rw-r--r--Build/source/utils/texinfo/djgpp/config.sed67
-rw-r--r--Build/source/utils/texinfo/djgpp/config.site53
-rw-r--r--Build/source/utils/texinfo/doc/Makefile.am80
-rw-r--r--Build/source/utils/texinfo/doc/Makefile.in772
-rw-r--r--Build/source/utils/texinfo/doc/README44
-rw-r--r--Build/source/utils/texinfo/doc/epsf.tex547
-rw-r--r--Build/source/utils/texinfo/doc/fdl.texi452
-rwxr-xr-xBuild/source/utils/texinfo/doc/help2man559
-rw-r--r--Build/source/utils/texinfo/doc/info-stnd.texi2203
-rw-r--r--Build/source/utils/texinfo/doc/info.189
-rw-r--r--Build/source/utils/texinfo/doc/info.572
-rw-r--r--Build/source/utils/texinfo/doc/info.texi1498
-rw-r--r--Build/source/utils/texinfo/doc/infokey.141
-rw-r--r--Build/source/utils/texinfo/doc/install-info.178
-rw-r--r--Build/source/utils/texinfo/doc/makeinfo.1205
-rwxr-xr-xBuild/source/utils/texinfo/doc/mdate-sh170
-rw-r--r--Build/source/utils/texinfo/doc/pdfcolor.tex158
-rw-r--r--Build/source/utils/texinfo/doc/stamp-14
-rw-r--r--Build/source/utils/texinfo/doc/stamp-vti4
-rw-r--r--Build/source/utils/texinfo/doc/texi2dvi.195
-rw-r--r--Build/source/utils/texinfo/doc/texindex.147
-rw-r--r--Build/source/utils/texinfo/doc/texinfo.561
-rw-r--r--Build/source/utils/texinfo/doc/texinfo.tex7217
-rw-r--r--Build/source/utils/texinfo/doc/texinfo.txi20513
-rw-r--r--Build/source/utils/texinfo/doc/txi-cs.tex74
-rw-r--r--Build/source/utils/texinfo/doc/txi-de.tex79
-rw-r--r--Build/source/utils/texinfo/doc/txi-en.tex69
-rw-r--r--Build/source/utils/texinfo/doc/txi-es.tex58
-rw-r--r--Build/source/utils/texinfo/doc/txi-fr.tex73
-rw-r--r--Build/source/utils/texinfo/doc/txi-it.tex69
-rw-r--r--Build/source/utils/texinfo/doc/txi-nl.tex68
-rw-r--r--Build/source/utils/texinfo/doc/txi-no.tex69
-rw-r--r--Build/source/utils/texinfo/doc/txi-pl.tex73
-rw-r--r--Build/source/utils/texinfo/doc/txi-pt.tex69
-rw-r--r--Build/source/utils/texinfo/doc/txi-tr.tex82
-rw-r--r--Build/source/utils/texinfo/doc/version-stnd.texi4
-rw-r--r--Build/source/utils/texinfo/doc/version.texi4
-rw-r--r--Build/source/utils/texinfo/doc/win32.mak41
-rw-r--r--Build/source/utils/texinfo/info/Makefile.am74
-rw-r--r--Build/source/utils/texinfo/info/Makefile.in584
-rw-r--r--Build/source/utils/texinfo/info/README30
-rw-r--r--Build/source/utils/texinfo/info/dir.c290
-rw-r--r--Build/source/utils/texinfo/info/display.c646
-rw-r--r--Build/source/utils/texinfo/info/display.h78
-rw-r--r--Build/source/utils/texinfo/info/doc.h103
-rw-r--r--Build/source/utils/texinfo/info/dribble.c68
-rw-r--r--Build/source/utils/texinfo/info/dribble.h41
-rw-r--r--Build/source/utils/texinfo/info/echo-area.c1524
-rw-r--r--Build/source/utils/texinfo/info/echo-area.h85
-rw-r--r--Build/source/utils/texinfo/info/filesys.c711
-rw-r--r--Build/source/utils/texinfo/info/filesys.h92
-rw-r--r--Build/source/utils/texinfo/info/footnotes.c268
-rw-r--r--Build/source/utils/texinfo/info/footnotes.h43
-rw-r--r--Build/source/utils/texinfo/info/gc.c92
-rw-r--r--Build/source/utils/texinfo/info/gc.h37
-rw-r--r--Build/source/utils/texinfo/info/indices.c735
-rw-r--r--Build/source/utils/texinfo/info/indices.h45
-rw-r--r--Build/source/utils/texinfo/info/info-utils.c701
-rw-r--r--Build/source/utils/texinfo/info/info-utils.h136
-rw-r--r--Build/source/utils/texinfo/info/info.c685
-rw-r--r--Build/source/utils/texinfo/info/info.h160
-rw-r--r--Build/source/utils/texinfo/info/infodoc.c1200
-rw-r--r--Build/source/utils/texinfo/info/infokey.c924
-rw-r--r--Build/source/utils/texinfo/info/infokey.h128
-rw-r--r--Build/source/utils/texinfo/info/infomap.c1831
-rw-r--r--Build/source/utils/texinfo/info/infomap.h82
-rw-r--r--Build/source/utils/texinfo/info/key.h35
-rw-r--r--Build/source/utils/texinfo/info/m-x.c214
-rw-r--r--Build/source/utils/texinfo/info/makedoc.c578
-rw-r--r--Build/source/utils/texinfo/info/man.c734
-rw-r--r--Build/source/utils/texinfo/info/man.h39
-rw-r--r--Build/source/utils/texinfo/info/nodemenu.c347
-rw-r--r--Build/source/utils/texinfo/info/nodes.c1263
-rw-r--r--Build/source/utils/texinfo/info/nodes.h156
-rw-r--r--Build/source/utils/texinfo/info/pcterm.c759
-rw-r--r--Build/source/utils/texinfo/info/search.c497
-rw-r--r--Build/source/utils/texinfo/info/search.h75
-rw-r--r--Build/source/utils/texinfo/info/session.c5039
-rw-r--r--Build/source/utils/texinfo/info/session.h237
-rw-r--r--Build/source/utils/texinfo/info/signals.c295
-rw-r--r--Build/source/utils/texinfo/info/signals.h96
-rw-r--r--Build/source/utils/texinfo/info/termdep.h59
-rw-r--r--Build/source/utils/texinfo/info/terminal.c873
-rw-r--r--Build/source/utils/texinfo/info/terminal.h130
-rw-r--r--Build/source/utils/texinfo/info/tilde.c342
-rw-r--r--Build/source/utils/texinfo/info/tilde.h54
-rw-r--r--Build/source/utils/texinfo/info/variables.c305
-rw-r--r--Build/source/utils/texinfo/info/variables.h66
-rw-r--r--Build/source/utils/texinfo/info/window.c1554
-rw-r--r--Build/source/utils/texinfo/info/window.h241
-rwxr-xr-xBuild/source/utils/texinfo/install-sh323
-rw-r--r--Build/source/utils/texinfo/intl/ChangeLog4
-rw-r--r--Build/source/utils/texinfo/intl/Makefile.in493
-rw-r--r--Build/source/utils/texinfo/intl/VERSION1
-rw-r--r--Build/source/utils/texinfo/intl/bindtextdom.c363
-rwxr-xr-xBuild/source/utils/texinfo/intl/config.charset608
-rw-r--r--Build/source/utils/texinfo/intl/dcgettext.c56
-rw-r--r--Build/source/utils/texinfo/intl/dcigettext.c1219
-rw-r--r--Build/source/utils/texinfo/intl/dcngettext.c57
-rw-r--r--Build/source/utils/texinfo/intl/dgettext.c58
-rw-r--r--Build/source/utils/texinfo/intl/dngettext.c59
-rw-r--r--Build/source/utils/texinfo/intl/eval-plural.h108
-rw-r--r--Build/source/utils/texinfo/intl/explodename.c185
-rw-r--r--Build/source/utils/texinfo/intl/finddomain.c192
-rw-r--r--Build/source/utils/texinfo/intl/gettext.c63
-rw-r--r--Build/source/utils/texinfo/intl/gettextP.h215
-rw-r--r--Build/source/utils/texinfo/intl/gmo.h149
-rw-r--r--Build/source/utils/texinfo/intl/hash-string.h48
-rw-r--r--Build/source/utils/texinfo/intl/intl-compat.c131
-rw-r--r--Build/source/utils/texinfo/intl/l10nflist.c421
-rw-r--r--Build/source/utils/texinfo/intl/libgnuintl.h.in383
-rw-r--r--Build/source/utils/texinfo/intl/loadinfo.h145
-rw-r--r--Build/source/utils/texinfo/intl/loadmsgcat.c1420
-rw-r--r--Build/source/utils/texinfo/intl/localcharset.c398
-rw-r--r--Build/source/utils/texinfo/intl/localcharset.h42
-rw-r--r--Build/source/utils/texinfo/intl/locale.alias78
-rw-r--r--Build/source/utils/texinfo/intl/localealias.c414
-rw-r--r--Build/source/utils/texinfo/intl/localename.c1142
-rw-r--r--Build/source/utils/texinfo/intl/log.c98
-rw-r--r--Build/source/utils/texinfo/intl/ngettext.c65
-rw-r--r--Build/source/utils/texinfo/intl/os2compat.c98
-rw-r--r--Build/source/utils/texinfo/intl/os2compat.h46
-rw-r--r--Build/source/utils/texinfo/intl/osdep.c24
-rw-r--r--Build/source/utils/texinfo/intl/plural-exp.c154
-rw-r--r--Build/source/utils/texinfo/intl/plural-exp.h118
-rw-r--r--Build/source/utils/texinfo/intl/plural.c1490
-rw-r--r--Build/source/utils/texinfo/intl/plural.y381
-rw-r--r--Build/source/utils/texinfo/intl/printf-args.c119
-rw-r--r--Build/source/utils/texinfo/intl/printf-args.h137
-rw-r--r--Build/source/utils/texinfo/intl/printf-parse.c537
-rw-r--r--Build/source/utils/texinfo/intl/printf-parse.h75
-rw-r--r--Build/source/utils/texinfo/intl/printf.c371
-rw-r--r--Build/source/utils/texinfo/intl/ref-add.sin31
-rw-r--r--Build/source/utils/texinfo/intl/ref-del.sin26
-rw-r--r--Build/source/utils/texinfo/intl/relocatable.c449
-rw-r--r--Build/source/utils/texinfo/intl/relocatable.h77
-rw-r--r--Build/source/utils/texinfo/intl/textdomain.c141
-rw-r--r--Build/source/utils/texinfo/intl/vasnprintf.c887
-rw-r--r--Build/source/utils/texinfo/intl/vasnprintf.h61
-rw-r--r--Build/source/utils/texinfo/intl/vasnwprintf.h46
-rw-r--r--Build/source/utils/texinfo/intl/wprintf-parse.h75
-rw-r--r--Build/source/utils/texinfo/intl/xsize.h109
-rw-r--r--Build/source/utils/texinfo/lib/Makefile.am26
-rw-r--r--Build/source/utils/texinfo/lib/Makefile.in474
-rw-r--r--Build/source/utils/texinfo/lib/README13
-rw-r--r--Build/source/utils/texinfo/lib/alloca.c491
-rw-r--r--Build/source/utils/texinfo/lib/depend.mak43
-rw-r--r--Build/source/utils/texinfo/lib/getopt.c1234
-rw-r--r--Build/source/utils/texinfo/lib/getopt.h10
-rw-r--r--Build/source/utils/texinfo/lib/getopt1.c171
-rw-r--r--Build/source/utils/texinfo/lib/getopt_.h176
-rw-r--r--Build/source/utils/texinfo/lib/getopt_int.h129
-rw-r--r--Build/source/utils/texinfo/lib/gettext.h68
-rw-r--r--Build/source/utils/texinfo/lib/memcpy.c38
-rw-r--r--Build/source/utils/texinfo/lib/memmove.c28
-rw-r--r--Build/source/utils/texinfo/lib/mkstemp.c42
-rw-r--r--Build/source/utils/texinfo/lib/strcase.h35
-rw-r--r--Build/source/utils/texinfo/lib/strcasecmp.c66
-rw-r--r--Build/source/utils/texinfo/lib/strdup.c56
-rw-r--r--Build/source/utils/texinfo/lib/strdup.h29
-rw-r--r--Build/source/utils/texinfo/lib/strerror.c49
-rw-r--r--Build/source/utils/texinfo/lib/strncasecmp.c2
-rw-r--r--Build/source/utils/texinfo/lib/substring.c35
-rw-r--r--Build/source/utils/texinfo/lib/system.h291
-rw-r--r--Build/source/utils/texinfo/lib/tempname.c344
-rw-r--r--Build/source/utils/texinfo/lib/win32.mak46
-rw-r--r--Build/source/utils/texinfo/lib/xalloc.h90
-rw-r--r--Build/source/utils/texinfo/lib/xexit.c87
-rw-r--r--Build/source/utils/texinfo/lib/xmalloc.c61
-rw-r--r--Build/source/utils/texinfo/lib/xstrdup.c33
-rw-r--r--Build/source/utils/texinfo/m4/ChangeLog51
-rw-r--r--Build/source/utils/texinfo/m4/Makefile.am24
-rw-r--r--Build/source/utils/texinfo/m4/Makefile.in360
-rw-r--r--Build/source/utils/texinfo/m4/check-decl.m475
-rw-r--r--Build/source/utils/texinfo/m4/codeset.m423
-rw-r--r--Build/source/utils/texinfo/m4/gettext.m4487
-rw-r--r--Build/source/utils/texinfo/m4/glibc21.m432
-rw-r--r--Build/source/utils/texinfo/m4/iconv.m4103
-rw-r--r--Build/source/utils/texinfo/m4/intdiv0.m472
-rw-r--r--Build/source/utils/texinfo/m4/intmax.m432
-rw-r--r--Build/source/utils/texinfo/m4/inttypes-pri.m432
-rw-r--r--Build/source/utils/texinfo/m4/inttypes.m427
-rw-r--r--Build/source/utils/texinfo/m4/inttypes_h.m428
-rw-r--r--Build/source/utils/texinfo/m4/isc-posix.m426
-rw-r--r--Build/source/utils/texinfo/m4/lcmessage.m432
-rw-r--r--Build/source/utils/texinfo/m4/lib-ld.m4112
-rw-r--r--Build/source/utils/texinfo/m4/lib-link.m4551
-rw-r--r--Build/source/utils/texinfo/m4/lib-prefix.m4155
-rw-r--r--Build/source/utils/texinfo/m4/longdouble.m430
-rw-r--r--Build/source/utils/texinfo/m4/longlong.m425
-rw-r--r--Build/source/utils/texinfo/m4/mkstemp.m466
-rw-r--r--Build/source/utils/texinfo/m4/nls.m449
-rw-r--r--Build/source/utils/texinfo/m4/onceonly.m463
-rw-r--r--Build/source/utils/texinfo/m4/onceonly_2_57.m486
-rw-r--r--Build/source/utils/texinfo/m4/po.m4426
-rw-r--r--Build/source/utils/texinfo/m4/prereq.m4129
-rw-r--r--Build/source/utils/texinfo/m4/printf-posix.m446
-rw-r--r--Build/source/utils/texinfo/m4/progtest.m491
-rw-r--r--Build/source/utils/texinfo/m4/signed.m419
-rw-r--r--Build/source/utils/texinfo/m4/size_max.m461
-rw-r--r--Build/source/utils/texinfo/m4/stdint_h.m428
-rw-r--r--Build/source/utils/texinfo/m4/strcase.m439
-rw-r--r--Build/source/utils/texinfo/m4/uintmax_t.m432
-rw-r--r--Build/source/utils/texinfo/m4/ulonglong.m425
-rw-r--r--Build/source/utils/texinfo/m4/wchar_t.m422
-rw-r--r--Build/source/utils/texinfo/m4/wint_t.m422
-rw-r--r--Build/source/utils/texinfo/m4/xsize.m414
-rw-r--r--Build/source/utils/texinfo/makeinfo/Makefile.am28
-rw-r--r--Build/source/utils/texinfo/makeinfo/Makefile.in600
-rw-r--r--Build/source/utils/texinfo/makeinfo/README17
-rw-r--r--Build/source/utils/texinfo/makeinfo/cmds.c1883
-rw-r--r--Build/source/utils/texinfo/makeinfo/cmds.h213
-rw-r--r--Build/source/utils/texinfo/makeinfo/defun.c720
-rw-r--r--Build/source/utils/texinfo/makeinfo/defun.h31
-rw-r--r--Build/source/utils/texinfo/makeinfo/depend.mak203
-rw-r--r--Build/source/utils/texinfo/makeinfo/files.c784
-rw-r--r--Build/source/utils/texinfo/makeinfo/files.h70
-rw-r--r--Build/source/utils/texinfo/makeinfo/float.c430
-rw-r--r--Build/source/utils/texinfo/makeinfo/float.h56
-rw-r--r--Build/source/utils/texinfo/makeinfo/footnote.c391
-rw-r--r--Build/source/utils/texinfo/makeinfo/footnote.h38
-rw-r--r--Build/source/utils/texinfo/makeinfo/html.c822
-rw-r--r--Build/source/utils/texinfo/makeinfo/html.h65
-rw-r--r--Build/source/utils/texinfo/makeinfo/index.c964
-rw-r--r--Build/source/utils/texinfo/makeinfo/index.h93
-rw-r--r--Build/source/utils/texinfo/makeinfo/insertion.c2376
-rw-r--r--Build/source/utils/texinfo/makeinfo/insertion.h78
-rw-r--r--Build/source/utils/texinfo/makeinfo/lang.c1020
-rw-r--r--Build/source/utils/texinfo/makeinfo/lang.h148
-rw-r--r--Build/source/utils/texinfo/makeinfo/macro.c1108
-rw-r--r--Build/source/utils/texinfo/makeinfo/macro.h77
-rw-r--r--Build/source/utils/texinfo/makeinfo/makeinfo.c4157
-rw-r--r--Build/source/utils/texinfo/makeinfo/makeinfo.h386
-rw-r--r--Build/source/utils/texinfo/makeinfo/makeinfo.rc36
-rw-r--r--Build/source/utils/texinfo/makeinfo/multi.c638
-rw-r--r--Build/source/utils/texinfo/makeinfo/multi.h28
-rw-r--r--Build/source/utils/texinfo/makeinfo/node.c1943
-rw-r--r--Build/source/utils/texinfo/makeinfo/node.h129
-rw-r--r--Build/source/utils/texinfo/makeinfo/sectioning.c831
-rw-r--r--Build/source/utils/texinfo/makeinfo/sectioning.h103
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/Makefile.am36
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/Makefile.in447
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/accent34
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/accent-text.txi73
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/accent.txi10
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/accentenc24
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/accentenc.txi11
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/cond33
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/cond.txi40
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/copying13
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/copying.txi4
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/defxcond16
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/defxcond.txi18
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-docdesc12
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/html-docdesc.txi14
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-extrali15
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/html-extrali.txi11
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-manuals13
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-min8
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/html-min.txi12
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-para8
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/html-para.txi24
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-title13
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/html-title.txi12
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/html-top13
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/html-top.txi7
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/incl-incl.txi1
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/include-value22
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/include-value.txi32
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/macro-at8
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/macro-at.txi38
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/menu-whitespace72
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/menu-whitespace.txi18
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/no-headers9
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/node-expand12
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/node-expand.txi64
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/node-value12
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/node-value.txi15
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/node-whitespace12
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/node-whitespace.txi30
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/top11
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/top.txi25
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/top212
-rw-r--r--Build/source/utils/texinfo/makeinfo/tests/top2.txi7
-rwxr-xr-xBuild/source/utils/texinfo/makeinfo/tests/twofiles23
-rw-r--r--Build/source/utils/texinfo/makeinfo/texinfo.dtd337
-rw-r--r--Build/source/utils/texinfo/makeinfo/texinfo.xsl242
-rw-r--r--Build/source/utils/texinfo/makeinfo/toc.c388
-rw-r--r--Build/source/utils/texinfo/makeinfo/toc.h45
-rw-r--r--Build/source/utils/texinfo/makeinfo/win32.mak66
-rw-r--r--Build/source/utils/texinfo/makeinfo/xml.c2328
-rw-r--r--Build/source/utils/texinfo/makeinfo/xml.h159
-rw-r--r--Build/source/utils/texinfo/makeinfo/xref.c620
-rw-r--r--Build/source/utils/texinfo/makeinfo/xref.h30
-rwxr-xr-xBuild/source/utils/texinfo/missing353
-rwxr-xr-xBuild/source/utils/texinfo/mkinstalldirs150
-rw-r--r--Build/source/utils/texinfo/po/ChangeLog14
-rw-r--r--Build/source/utils/texinfo/po/LINGUAS19
-rw-r--r--Build/source/utils/texinfo/po/Makefile.in.in366
-rw-r--r--Build/source/utils/texinfo/po/Makevars41
-rw-r--r--Build/source/utils/texinfo/po/POTFILES.in47
-rw-r--r--Build/source/utils/texinfo/po/Rules-quot47
-rw-r--r--Build/source/utils/texinfo/po/boldquot.sed10
-rw-r--r--Build/source/utils/texinfo/po/cs.gmobin0 -> 38319 bytes
-rw-r--r--Build/source/utils/texinfo/po/cs.po3206
-rw-r--r--Build/source/utils/texinfo/po/da.gmobin0 -> 58319 bytes
-rw-r--r--Build/source/utils/texinfo/po/da.po3101
-rw-r--r--Build/source/utils/texinfo/po/de.gmobin0 -> 79236 bytes
-rw-r--r--Build/source/utils/texinfo/po/de.po3267
-rw-r--r--Build/source/utils/texinfo/po/de_AT.gmobin0 -> 431 bytes
-rw-r--r--Build/source/utils/texinfo/po/de_AT.po2788
-rw-r--r--Build/source/utils/texinfo/po/eo.gmobin0 -> 61416 bytes
-rw-r--r--Build/source/utils/texinfo/po/eo.po3115
-rw-r--r--Build/source/utils/texinfo/po/fr.gmobin0 -> 78442 bytes
-rw-r--r--Build/source/utils/texinfo/po/fr.po3524
-rw-r--r--Build/source/utils/texinfo/po/he.gmobin0 -> 54894 bytes
-rw-r--r--Build/source/utils/texinfo/po/he.po3074
-rw-r--r--Build/source/utils/texinfo/po/hr.gmobin0 -> 35680 bytes
-rw-r--r--Build/source/utils/texinfo/po/hr.po3092
-rw-r--r--Build/source/utils/texinfo/po/insert-header.sin23
-rw-r--r--Build/source/utils/texinfo/po/ja.gmobin0 -> 46062 bytes
-rw-r--r--Build/source/utils/texinfo/po/ja.po3355
-rw-r--r--Build/source/utils/texinfo/po/nb.gmobin0 -> 73021 bytes
-rw-r--r--Build/source/utils/texinfo/po/nb.po3108
-rw-r--r--Build/source/utils/texinfo/po/nl.gmobin0 -> 25421 bytes
-rw-r--r--Build/source/utils/texinfo/po/nl.po3273
-rw-r--r--Build/source/utils/texinfo/po/no.gmobin0 -> 63334 bytes
-rw-r--r--Build/source/utils/texinfo/po/no.po3123
-rw-r--r--Build/source/utils/texinfo/po/pl.gmobin0 -> 75698 bytes
-rw-r--r--Build/source/utils/texinfo/po/pl.po3111
-rw-r--r--Build/source/utils/texinfo/po/quot.sed6
-rw-r--r--Build/source/utils/texinfo/po/remove-potcdate.sin19
-rw-r--r--Build/source/utils/texinfo/po/ro.gmobin0 -> 75177 bytes
-rw-r--r--Build/source/utils/texinfo/po/ro.po3125
-rw-r--r--Build/source/utils/texinfo/po/ru.gmobin0 -> 75348 bytes
-rw-r--r--Build/source/utils/texinfo/po/ru.po3115
-rw-r--r--Build/source/utils/texinfo/po/stamp-po1
-rw-r--r--Build/source/utils/texinfo/po/sv.gmobin0 -> 73730 bytes
-rw-r--r--Build/source/utils/texinfo/po/sv.po3369
-rw-r--r--Build/source/utils/texinfo/po/texinfo.pot2787
-rw-r--r--Build/source/utils/texinfo/po/tr.gmobin0 -> 73295 bytes
-rw-r--r--Build/source/utils/texinfo/po/tr.po3123
-rw-r--r--Build/source/utils/texinfo/po/zh_CN.gmobin0 -> 50487 bytes
-rw-r--r--Build/source/utils/texinfo/po/zh_CN.po3050
-rw-r--r--Build/source/utils/texinfo/po/zh_TW.gmobin0 -> 31062 bytes
-rw-r--r--Build/source/utils/texinfo/po/zh_TW.po3111
-rw-r--r--Build/source/utils/texinfo/util/Makefile.am45
-rw-r--r--Build/source/utils/texinfo/util/Makefile.in579
-rw-r--r--Build/source/utils/texinfo/util/README14
-rw-r--r--Build/source/utils/texinfo/util/depend.mak17
-rw-r--r--Build/source/utils/texinfo/util/deref.c209
-rw-r--r--Build/source/utils/texinfo/util/dir-example482
-rwxr-xr-xBuild/source/utils/texinfo/util/fix-info-dir317
-rwxr-xr-xBuild/source/utils/texinfo/util/fixfonts84
-rw-r--r--Build/source/utils/texinfo/util/fixref.gawk145
-rw-r--r--Build/source/utils/texinfo/util/gdoc914
-rwxr-xr-xBuild/source/utils/texinfo/util/gen-dir-node212
-rwxr-xr-xBuild/source/utils/texinfo/util/gendocs.sh285
-rwxr-xr-xBuild/source/utils/texinfo/util/gendocs_template100
-rwxr-xr-xBuild/source/utils/texinfo/util/infosrch104
-rw-r--r--Build/source/utils/texinfo/util/install-info-html157
-rw-r--r--Build/source/utils/texinfo/util/install-info.c1590
-rw-r--r--Build/source/utils/texinfo/util/outline.gawk145
-rw-r--r--Build/source/utils/texinfo/util/prepinfo.awk356
-rwxr-xr-xBuild/source/utils/texinfo/util/tex3patch70
-rw-r--r--Build/source/utils/texinfo/util/texi-docstring-magic.el347
-rwxr-xr-xBuild/source/utils/texinfo/util/texi2dvi836
-rwxr-xr-xBuild/source/utils/texinfo/util/texi2pdf19
-rw-r--r--Build/source/utils/texinfo/util/texindex.c1628
-rw-r--r--Build/source/utils/texinfo/util/texindex.rc36
-rw-r--r--Build/source/utils/texinfo/util/texinfo-cat.in3
-rw-r--r--Build/source/utils/texinfo/util/texinfo.dtd484
-rw-r--r--Build/source/utils/texinfo/util/texinfo.xsl242
-rwxr-xr-xBuild/source/utils/texinfo/util/txitextest77
-rw-r--r--Build/source/utils/texinfo/util/win32.mak60
-rw-r--r--Build/source/utils/texinfo/win32.mak33
-rw-r--r--Build/source/utils/vlna/Makefile53
-rw-r--r--Build/source/utils/vlna/README68
-rw-r--r--Build/source/utils/vlna/csmac.tex63
-rw-r--r--Build/source/utils/vlna/depend.mak3
-rw-r--r--Build/source/utils/vlna/vlna.c827
-rw-r--r--Build/source/utils/vlna/vlna.dvibin0 -> 6968 bytes
-rwxr-xr-xBuild/source/utils/vlna/vlna.exebin0 -> 13666 bytes
-rw-r--r--Build/source/utils/vlna/vlna.man130
-rw-r--r--Build/source/utils/vlna/vlna.txt121
-rw-r--r--Build/source/utils/vlna/vlna.w1003
-rw-r--r--Build/source/utils/vlna/win32.mak56
-rw-r--r--Build/source/utils/win32.mak39
1029 files changed, 472850 insertions, 0 deletions
diff --git a/Build/source/utils/README b/Build/source/utils/README
new file mode 100644
index 00000000000..6704a36e2af
--- /dev/null
+++ b/Build/source/utils/README
@@ -0,0 +1,33 @@
+Public domain. Originally created by Karl Berry, 2005.
+
+Extra utilities we compile for TeX Live, at least sometimes.
+
+bzip2 1.0.3 - only compiled for Windows, so skip update
+ http://bzip.org
+
+gzip - only for Windows
+
+jpeg2ps - only for Windows
+
+dialog - seems to be a v1.0 in debian, asked te 5jun05
+ http://hightek.org/dialog/
+ http://packages.debian.org/cgi-bin/search_packages.pl?searchon=names&version=all&exact=1&keywords=dialog
+
+lcdf-typetools 2.34 - ok 12jun05
+ http://www.lcdf.org/~eddietwo/type/
+
+pdfopen 0.4 - ok 1jul05
+ http://tex.aanhet.net/pdfopen
+
+psutils p17 - ok (Fabrice made small modifications for Windows, it seems)
+ http://www.ctan.org/tex-archive/support/psutils/
+
+t1utils 1.32 - ok (even though README says 1.30)
+ http://www.lcdf.org/~eddietwo/type/
+
+texi2html 1.76 - ok 5jun05
+ https://texi2html.cvshome.org/servlets/ProjectDocumentList
+
+texinfo 4.8 - ok 5jun05
+
+vlna - only for Windows
diff --git a/Build/source/utils/bzip2/CHANGES b/Build/source/utils/bzip2/CHANGES
new file mode 100644
index 00000000000..d9843954366
--- /dev/null
+++ b/Build/source/utils/bzip2/CHANGES
@@ -0,0 +1,253 @@
+
+
+0.9.0
+~~~~~
+First version.
+
+
+0.9.0a
+~~~~~~
+Removed 'ranlib' from Makefile, since most modern Unix-es
+don't need it, or even know about it.
+
+
+0.9.0b
+~~~~~~
+Fixed a problem with error reporting in bzip2.c. This does not effect
+the library in any way. Problem is: versions 0.9.0 and 0.9.0a (of the
+program proper) compress and decompress correctly, but give misleading
+error messages (internal panics) when an I/O error occurs, instead of
+reporting the problem correctly. This shouldn't give any data loss
+(as far as I can see), but is confusing.
+
+Made the inline declarations disappear for non-GCC compilers.
+
+
+0.9.0c
+~~~~~~
+Fixed some problems in the library pertaining to some boundary cases.
+This makes the library behave more correctly in those situations. The
+fixes apply only to features (calls and parameters) not used by
+bzip2.c, so the non-fixedness of them in previous versions has no
+effect on reliability of bzip2.c.
+
+In bzlib.c:
+ * made zero-length BZ_FLUSH work correctly in bzCompress().
+ * fixed bzWrite/bzRead to ignore zero-length requests.
+ * fixed bzread to correctly handle read requests after EOF.
+ * wrong parameter order in call to bzDecompressInit in
+ bzBuffToBuffDecompress. Fixed.
+
+In compress.c:
+ * changed setting of nGroups in sendMTFValues() so as to
+ do a bit better on small files. This _does_ effect
+ bzip2.c.
+
+
+0.9.5a
+~~~~~~
+Major change: add a fallback sorting algorithm (blocksort.c)
+to give reasonable behaviour even for very repetitive inputs.
+Nuked --repetitive-best and --repetitive-fast since they are
+no longer useful.
+
+Minor changes: mostly a whole bunch of small changes/
+bugfixes in the driver (bzip2.c). Changes pertaining to the
+user interface are:
+
+ allow decompression of symlink'd files to stdout
+ decompress/test files even without .bz2 extension
+ give more accurate error messages for I/O errors
+ when compressing/decompressing to stdout, don't catch control-C
+ read flags from BZIP2 and BZIP environment variables
+ decline to break hard links to a file unless forced with -f
+ allow -c flag even with no filenames
+ preserve file ownerships as far as possible
+ make -s -1 give the expected block size (100k)
+ add a flag -q --quiet to suppress nonessential warnings
+ stop decoding flags after --, so files beginning in - can be handled
+ resolved inconsistent naming: bzcat or bz2cat ?
+ bzip2 --help now returns 0
+
+Programming-level changes are:
+
+ fixed syntax error in GET_LL4 for Borland C++ 5.02
+ let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC}
+ fix overshoot of mode-string end in bzopen_or_bzdopen
+ wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... }
+ close file handles under all error conditions
+ added minor mods so it compiles with DJGPP out of the box
+ fixed Makefile so it doesn't give problems with BSD make
+ fix uninitialised memory reads in dlltest.c
+
+0.9.5b
+~~~~~~
+Open stdin/stdout in binary mode for DJGPP.
+
+0.9.5c
+~~~~~~
+Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1. The + 1
+version could cause the sorted order to be wrong in some extremely
+obscure cases. Also changed setting of quadrant in blocksort.c.
+
+0.9.5d
+~~~~~~
+The only functional change is to make bzlibVersion() in the library
+return the correct string. This has no effect whatsoever on the
+functioning of the bzip2 program or library. Added a couple of casts
+so the library compiles without warnings at level 3 in MS Visual
+Studio 6.0. Included a Y2K statement in the file Y2K_INFO. All other
+changes are minor documentation changes.
+
+1.0
+~~~
+Several minor bugfixes and enhancements:
+
+* Large file support. The library uses 64-bit counters to
+ count the volume of data passing through it. bzip2.c
+ is now compiled with -D_FILE_OFFSET_BITS=64 to get large
+ file support from the C library. -v correctly prints out
+ file sizes greater than 4 gigabytes. All these changes have
+ been made without assuming a 64-bit platform or a C compiler
+ which supports 64-bit ints, so, except for the C library
+ aspect, they are fully portable.
+
+* Decompression robustness. The library/program should be
+ robust to any corruption of compressed data, detecting and
+ handling _all_ corruption, instead of merely relying on
+ the CRCs. What this means is that the program should
+ never crash, given corrupted data, and the library should
+ always return BZ_DATA_ERROR.
+
+* Fixed an obscure race-condition bug only ever observed on
+ Solaris, in which, if you were very unlucky and issued
+ control-C at exactly the wrong time, both input and output
+ files would be deleted.
+
+* Don't run out of file handles on test/decompression when
+ large numbers of files have invalid magic numbers.
+
+* Avoid library namespace pollution. Prefix all exported
+ symbols with BZ2_.
+
+* Minor sorting enhancements from my DCC2000 paper.
+
+* Advance the version number to 1.0, so as to counteract the
+ (false-in-this-case) impression some people have that programs
+ with version numbers less than 1.0 are in some way, experimental,
+ pre-release versions.
+
+* Create an initial Makefile-libbz2_so to build a shared library.
+ Yes, I know I should really use libtool et al ...
+
+* Make the program exit with 2 instead of 0 when decompression
+ fails due to a bad magic number (ie, an invalid bzip2 header).
+ Also exit with 1 (as the manual claims :-) whenever a diagnostic
+ message would have been printed AND the corresponding operation
+ is aborted, for example
+ bzip2: Output file xx already exists.
+ When a diagnostic message is printed but the operation is not
+ aborted, for example
+ bzip2: Can't guess original name for wurble -- using wurble.out
+ then the exit value 0 is returned, unless some other problem is
+ also detected.
+
+ I think it corresponds more closely to what the manual claims now.
+
+
+1.0.1
+~~~~~
+* Modified dlltest.c so it uses the new BZ2_ naming scheme.
+* Modified makefile-msc to fix minor build probs on Win2k.
+* Updated README.COMPILATION.PROBLEMS.
+
+There are no functionality changes or bug fixes relative to version
+1.0.0. This is just a documentation update + a fix for minor Win32
+build problems. For almost everyone, upgrading from 1.0.0 to 1.0.1 is
+utterly pointless. Don't bother.
+
+
+1.0.2
+~~~~~
+A bug fix release, addressing various minor issues which have appeared
+in the 18 or so months since 1.0.1 was released. Most of the fixes
+are to do with file-handling or documentation bugs. To the best of my
+knowledge, there have been no data-loss-causing bugs reported in the
+compression/decompression engine of 1.0.0 or 1.0.1.
+
+Note that this release does not improve the rather crude build system
+for Unix platforms. The general plan here is to autoconfiscate/
+libtoolise 1.0.2 soon after release, and release the result as 1.1.0
+or perhaps 1.2.0. That, however, is still just a plan at this point.
+
+Here are the changes in 1.0.2. Bug-reporters and/or patch-senders in
+parentheses.
+
+* Fix an infinite segfault loop in 1.0.1 when a directory is
+ encountered in -f (force) mode.
+ (Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt)
+
+* Avoid double fclose() of output file on certain I/O error paths.
+ (Solar Designer)
+
+* Don't fail with internal error 1007 when fed a long stream (> 48MB)
+ of byte 251. Also print useful message suggesting that 1007s may be
+ caused by bad memory.
+ (noticed by Juan Pedro Vallejo, fixed by me)
+
+* Fix uninitialised variable silly bug in demo prog dlltest.c.
+ (Jorj Bauer)
+
+* Remove 512-MB limitation on recovered file size for bzip2recover
+ on selected platforms which support 64-bit ints. At the moment
+ all GCC supported platforms, and Win32.
+ (me, Alson van der Meulen)
+
+* Hard-code header byte values, to give correct operation on platforms
+ using EBCDIC as their native character set (IBM's OS/390).
+ (Leland Lucius)
+
+* Copy file access times correctly.
+ (Marty Leisner)
+
+* Add distclean and check targets to Makefile.
+ (Michael Carmack)
+
+* Parameterise use of ar and ranlib in Makefile. Also add $(LDFLAGS).
+ (Rich Ireland, Bo Thorsen)
+
+* Pass -p (create parent dirs as needed) to mkdir during make install.
+ (Jeremy Fusco)
+
+* Dereference symlinks when copying file permissions in -f mode.
+ (Volker Schmidt)
+
+* Majorly simplify implementation of uInt64_qrm10.
+ (Bo Lindbergh)
+
+* Check the input file still exists before deleting the output one,
+ when aborting in cleanUpAndFail().
+ (Joerg Prante, Robert Linden, Matthias Krings)
+
+Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer
+of bzip2:
+
+* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore.
+
+* Spelling changes and minor enhancements in bzip2.1.
+
+* Avoid race condition between creating the output file and setting its
+ interim permissions safely, by using fopen_output_safely().
+ No changes to bzip2recover since there is no issue with file
+ permissions there.
+
+* do not print senseless report with -v when compressing an empty
+ file.
+
+* bzcat -f works on non-bzip2 files.
+
+* do not try to escape shell meta-characters on unix (the shell takes
+ care of these).
+
+* added --fast and --best aliases for -1 -9 for gzip compatibility.
+
diff --git a/Build/source/utils/bzip2/LICENSE b/Build/source/utils/bzip2/LICENSE
new file mode 100644
index 00000000000..9d4fa437908
--- /dev/null
+++ b/Build/source/utils/bzip2/LICENSE
@@ -0,0 +1,39 @@
+
+This program, "bzip2" and associated library "libbzip2", are
+copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Julian Seward, Cambridge, UK.
+jseward@acm.org
+bzip2/libbzip2 version 1.0.2 of 30 December 2001
+
diff --git a/Build/source/utils/bzip2/README b/Build/source/utils/bzip2/README
new file mode 100644
index 00000000000..07505d8f3d6
--- /dev/null
+++ b/Build/source/utils/bzip2/README
@@ -0,0 +1,181 @@
+
+This is the README for bzip2, a block-sorting file compressor, version
+1.0.2. This version is fully compatible with the previous public
+releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0 and 1.0.1.
+
+bzip2-1.0.2 is distributed under a BSD-style license. For details,
+see the file LICENSE.
+
+Complete documentation is available in Postscript form (manual.ps),
+PDF (manual.pdf, amazingly enough) or html (manual_toc.html). A
+plain-text version of the manual page is available as bzip2.txt.
+A statement about Y2K issues is now included in the file Y2K_INFO.
+
+
+HOW TO BUILD -- UNIX
+
+Type `make'. This builds the library libbz2.a and then the
+programs bzip2 and bzip2recover. Six self-tests are run.
+If the self-tests complete ok, carry on to installation:
+
+To install in /usr/bin, /usr/lib, /usr/man and /usr/include, type
+ make install
+To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type
+ make install PREFIX=/xxx/yyy
+If you are (justifiably) paranoid and want to see what 'make install'
+is going to do, you can first do
+ make -n install or
+ make -n install PREFIX=/xxx/yyy respectively.
+The -n instructs make to show the commands it would execute, but
+not actually execute them.
+
+
+HOW TO BUILD -- UNIX, shared library libbz2.so.
+
+Do 'make -f Makefile-libbz2_so'. This Makefile seems to work for
+Linux-ELF (RedHat 7.2 on an x86 box), with gcc. I make no claims
+that it works for any other platform, though I suspect it probably
+will work for most platforms employing both ELF and gcc.
+
+bzip2-shared, a client of the shared library, is also built, but not
+self-tested. So I suggest you also build using the normal Makefile,
+since that conducts a self-test. A second reason to prefer the
+version statically linked to the library is that, on x86 platforms,
+building shared objects makes a valuable register (%ebx) unavailable
+to gcc, resulting in a slowdown of 10%-20%, at least for bzip2.
+
+Important note for people upgrading .so's from 0.9.0/0.9.5 to version
+1.0.X. All the functions in the library have been renamed, from (eg)
+bzCompress to BZ2_bzCompress, to avoid namespace pollution.
+Unfortunately this means that the libbz2.so created by
+Makefile-libbz2_so will not work with any program which used an older
+version of the library. Sorry. I do encourage library clients to
+make the effort to upgrade to use version 1.0, since it is both faster
+and more robust than previous versions.
+
+
+HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc.
+
+It's difficult for me to support compilation on all these platforms.
+My approach is to collect binaries for these platforms, and put them
+on the master web page (http://sources.redhat.com/bzip2). Look there.
+However (FWIW), bzip2-1.0.X is very standard ANSI C and should compile
+unmodified with MS Visual C. If you have difficulties building, you
+might want to read README.COMPILATION.PROBLEMS.
+
+At least using MS Visual C++ 6, you can build from the unmodified
+sources by issuing, in a command shell:
+ nmake -f makefile.msc
+(you may need to first run the MSVC-provided script VCVARS32.BAT
+ so as to set up paths to the MSVC tools correctly).
+
+
+VALIDATION
+
+Correct operation, in the sense that a compressed file can always be
+decompressed to reproduce the original, is obviously of paramount
+importance. To validate bzip2, I used a modified version of Mark
+Nelson's churn program. Churn is an automated test driver which
+recursively traverses a directory structure, using bzip2 to compress
+and then decompress each file it encounters, and checking that the
+decompressed data is the same as the original. There are more details
+in Section 4 of the user guide.
+
+
+
+Please read and be aware of the following:
+
+WARNING:
+
+ This program (attempts to) compress data by performing several
+ non-trivial transformations on it. Unless you are 100% familiar
+ with *all* the algorithms contained herein, and with the
+ consequences of modifying them, you should NOT meddle with the
+ compression or decompression machinery. Incorrect changes can and
+ very likely *will* lead to disastrous loss of data.
+
+
+DISCLAIMER:
+
+ I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE
+ USE OF THIS PROGRAM, HOWSOEVER CAUSED.
+
+ Every compression of a file implies an assumption that the
+ compressed file can be decompressed to reproduce the original.
+ Great efforts in design, coding and testing have been made to
+ ensure that this program works correctly. However, the complexity
+ of the algorithms, and, in particular, the presence of various
+ special cases in the code which occur with very low but non-zero
+ probability make it impossible to rule out the possibility of bugs
+ remaining in the program. DO NOT COMPRESS ANY DATA WITH THIS
+ PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER
+ SMALL, THAT THE DATA WILL NOT BE RECOVERABLE.
+
+ That is not to say this program is inherently unreliable. Indeed,
+ I very much hope the opposite is true. bzip2 has been carefully
+ constructed and extensively tested.
+
+
+PATENTS:
+
+ To the best of my knowledge, bzip2 does not use any patented
+ algorithms. However, I do not have the resources available to
+ carry out a full patent search. Therefore I cannot give any
+ guarantee of the above statement.
+
+End of legalities.
+
+
+WHAT'S NEW IN 0.9.0 (as compared to 0.1pl2) ?
+
+ * Approx 10% faster compression, 30% faster decompression
+ * -t (test mode) is a lot quicker
+ * Can decompress concatenated compressed files
+ * Programming interface, so programs can directly read/write .bz2 files
+ * Less restrictive (BSD-style) licensing
+ * Flag handling more compatible with GNU gzip
+ * Much more documentation, i.e., a proper user manual
+ * Hopefully, improved portability (at least of the library)
+
+WHAT'S NEW IN 0.9.5 ?
+
+ * Compression speed is much less sensitive to the input
+ data than in previous versions. Specifically, the very
+ slow performance caused by repetitive data is fixed.
+ * Many small improvements in file and flag handling.
+ * A Y2K statement.
+
+WHAT'S NEW IN 1.0.0 ?
+
+ See the CHANGES file.
+
+WHAT'S NEW IN 1.0.2 ?
+
+ See the CHANGES file.
+
+
+I hope you find bzip2 useful. Feel free to contact me at
+ jseward@acm.org
+if you have any suggestions or queries. Many people mailed me with
+comments, suggestions and patches after the releases of bzip-0.15,
+bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0 and 1.0.1,
+and the changes in bzip2 are largely a result of this feedback.
+I thank you for your comments.
+
+At least for the time being, bzip2's "home" is (or can be reached via)
+http://sources.redhat.com/bzip2.
+
+Julian Seward
+jseward@acm.org
+
+Cambridge, UK (and what a great town this is!)
+
+18 July 1996 (version 0.15)
+25 August 1996 (version 0.21)
+ 7 August 1997 (bzip2, version 0.1)
+29 August 1997 (bzip2, version 0.1pl2)
+23 August 1998 (bzip2, version 0.9.0)
+ 8 June 1999 (bzip2, version 0.9.5)
+ 4 Sept 1999 (bzip2, version 0.9.5d)
+ 5 May 2000 (bzip2, version 1.0pre8)
+30 December 2001 (bzip2, version 1.0.2pre1) \ No newline at end of file
diff --git a/Build/source/utils/bzip2/README.COMPILATION.PROBLEMS b/Build/source/utils/bzip2/README.COMPILATION.PROBLEMS
new file mode 100644
index 00000000000..bd1822dffbd
--- /dev/null
+++ b/Build/source/utils/bzip2/README.COMPILATION.PROBLEMS
@@ -0,0 +1,130 @@
+
+bzip2-1.0 should compile without problems on the vast majority of
+platforms. Using the supplied Makefile, I've built and tested it
+myself for x86-linux, sparc-solaris, alpha-linux, x86-cygwin32 and
+alpha-tru64unix. With makefile.msc, Visual C++ 6.0 and nmake, you can
+build a native Win32 version too. Large file support seems to work
+correctly on at least alpha-tru64unix and x86-cygwin32 (on Windows
+2000).
+
+When I say "large file" I mean a file of size 2,147,483,648 (2^31)
+bytes or above. Many older OSs can't handle files above this size,
+but many newer ones can. Large files are pretty huge -- most files
+you'll encounter are not Large Files.
+
+Earlier versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide
+variety of platforms without difficulty, and I hope this version will
+continue in that tradition. However, in order to support large files,
+I've had to include the define -D_FILE_OFFSET_BITS=64 in the Makefile.
+This can cause problems.
+
+The technique of adding -D_FILE_OFFSET_BITS=64 to get large file
+support is, as far as I know, the Recommended Way to get correct large
+file support. For more details, see the Large File Support
+Specification, published by the Large File Summit, at
+ http://www.sas.com/standard/large.file/
+
+As a general comment, if you get compilation errors which you think
+are related to large file support, try removing the above define from
+the Makefile, ie, delete the line
+ BIGFILES=-D_FILE_OFFSET_BITS=64
+from the Makefile, and do 'make clean ; make'. This will give you a
+version of bzip2 without large file support, which, for most
+applications, is probably not a problem.
+
+Alternatively, try some of the platform-specific hints listed below.
+
+You can use the spewG.c program to generate huge files to test bzip2's
+large file support, if you are feeling paranoid. Be aware though that
+any compilation problems which affect bzip2 will also affect spewG.c,
+alas.
+
+
+Known problems as of 1.0pre8:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* HP/UX 10.20 and 11.00, using gcc (2.7.2.3 and 2.95.2): A large
+ number of warnings appear, including the following:
+
+ /usr/include/sys/resource.h: In function `getrlimit':
+ /usr/include/sys/resource.h:168:
+ warning: implicit declaration of function `__getrlimit64'
+ /usr/include/sys/resource.h: In function `setrlimit':
+ /usr/include/sys/resource.h:170:
+ warning: implicit declaration of function `__setrlimit64'
+
+ This would appear to be a problem with large file support, header
+ files and gcc. gcc may or may not give up at this point. If it
+ fails, you might be able to improve matters by adding
+ -D__STDC_EXT__=1
+ to the BIGFILES variable in the Makefile (ie, change its definition
+ to
+ BIGFILES=-D_FILE_OFFSET_BITS=64 -D__STDC_EXT__=1
+
+ Even if gcc does produce a binary which appears to work (ie passes
+ its self-tests), you might want to test it to see if it works properly
+ on large files.
+
+
+* HP/UX 10.20 and 11.00, using HP's cc compiler.
+
+ No specific problems for this combination, except that you'll need to
+ specify the -Ae flag, and zap the gcc-specific stuff
+ -Wall -Winline -O2 -fomit-frame-pointer -fno-strength-reduce.
+ You should retain -D_FILE_OFFSET_BITS=64 in order to get large
+ file support -- which is reported to work ok for this HP/UX + cc
+ combination.
+
+
+* SunOS 4.1.X.
+
+ Amazingly, there are still people out there using this venerable old
+ banger. I shouldn't be too rude -- I started life on SunOS, and
+ it was a pretty darn good OS, way back then. Anyway:
+
+ SunOS doesn't seem to have strerror(), so you'll have to use
+ perror(), perhaps by doing adding this (warning: UNTESTED CODE):
+
+ char* strerror ( int errnum )
+ {
+ if (errnum < 0 || errnum >= sys_nerr)
+ return "Unknown error";
+ else
+ return sys_errlist[errnum];
+ }
+
+ Or you could comment out the relevant calls to strerror; they're
+ not mission-critical. Or you could upgrade to Solaris. Ha ha ha!
+ (what?? you think I've got Bad Attitude?)
+
+
+* Making a shared library on Solaris. (Not really a compilation
+ problem, but many people ask ...)
+
+ Firstly, if you have Solaris 8, either you have libbz2.so already
+ on your system, or you can install it from the Solaris CD.
+
+ Secondly, be aware that there are potential naming conflicts
+ between the .so file supplied with Solaris 8, and the .so file
+ which Makefile-libbz2_so will make. Makefile-libbz2_so creates
+ a .so which has the names which I intend to be "official" as
+ of version 1.0.0 and onwards. Unfortunately, the .so in
+ Solaris 8 appeared before I decided on the final names, so
+ the two libraries are incompatible. We have since communicated
+ and I hope that the problems will have been solved in the next
+ version of Solaris, whenever that might appear.
+
+ All that said: you might be able to get somewhere
+ by finding the line in Makefile-libbz2_so which says
+
+ $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.2 $(OBJS)
+
+ and replacing with
+
+ $(CC) -G -shared -o libbz2.so.1.0.2 -h libbz2.so.1.0 $(OBJS)
+
+ If gcc objects to the combination -fpic -fPIC, get rid of
+ the second one, leaving just "-fpic".
+
+
+That's the end of the currently known compilation problems.
diff --git a/Build/source/utils/bzip2/Y2K_INFO b/Build/source/utils/bzip2/Y2K_INFO
new file mode 100644
index 00000000000..55fd56a2edb
--- /dev/null
+++ b/Build/source/utils/bzip2/Y2K_INFO
@@ -0,0 +1,34 @@
+
+Y2K status of bzip2 and libbzip2, versions 0.1, 0.9.0 and 0.9.5
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Informally speaking:
+ bzip2 is a compression program built on top of libbzip2,
+ a library which does the real work of compression and
+ decompression. As far as I am aware, libbzip2 does not have
+ any date-related code at all.
+
+ bzip2 itself copies dates from source to destination files
+ when compressing or decompressing, using the 'stat' and 'utime'
+ UNIX system calls. It doesn't examine, manipulate or store the
+ dates in any way. So as far as I can see, there shouldn't be any
+ problem with bzip2 providing 'stat' and 'utime' work correctly
+ on your system.
+
+ On non-unix platforms (those for which BZ_UNIX in bzip2.c is
+ not set to 1), bzip2 doesn't even do the date copying.
+
+ Overall, informally speaking, I don't think bzip2 or libbzip2
+ have a Y2K problem.
+
+Formally speaking:
+ I am not prepared to offer you any assurance whatsoever
+ regarding Y2K issues in my software. You alone assume the
+ entire risk of using the software. The disclaimer of liability
+ in the LICENSE file in the bzip2 source distribution continues
+ to apply on this issue as with every other issue pertaining
+ to the software.
+
+Julian Seward
+Cambridge, UK
+25 August 1999
diff --git a/Build/source/utils/bzip2/blocksort.c b/Build/source/utils/bzip2/blocksort.c
new file mode 100644
index 00000000000..aba3efcd312
--- /dev/null
+++ b/Build/source/utils/bzip2/blocksort.c
@@ -0,0 +1,1141 @@
+
+/*-------------------------------------------------------------*/
+/*--- Block sorting machinery ---*/
+/*--- blocksort.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+
+ To get some idea how the block sorting algorithms in this file
+ work, read my paper
+ On the Performance of BWT Sorting Algorithms
+ in Proceedings of the IEEE Data Compression Conference 2000,
+ Snowbird, Utah, USA, 27-30 March 2000. The main sort in this
+ file implements the algorithm called cache in the paper.
+--*/
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------*/
+/*--- Fallback O(N log(N)^2) sorting ---*/
+/*--- algorithm, for repetitive blocks ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+__inline__
+void fallbackSimpleSort ( UInt32* fmap,
+ UInt32* eclass,
+ Int32 lo,
+ Int32 hi )
+{
+ Int32 i, j, tmp;
+ UInt32 ec_tmp;
+
+ if (lo == hi) return;
+
+ if (hi - lo > 3) {
+ for ( i = hi-4; i >= lo; i-- ) {
+ tmp = fmap[i];
+ ec_tmp = eclass[tmp];
+ for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 )
+ fmap[j-4] = fmap[j];
+ fmap[j-4] = tmp;
+ }
+ }
+
+ for ( i = hi-1; i >= lo; i-- ) {
+ tmp = fmap[i];
+ ec_tmp = eclass[tmp];
+ for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ )
+ fmap[j-1] = fmap[j];
+ fmap[j-1] = tmp;
+ }
+}
+
+
+/*---------------------------------------------*/
+#define fswap(zz1, zz2) \
+ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define fvswap(zzp1, zzp2, zzn) \
+{ \
+ Int32 yyp1 = (zzp1); \
+ Int32 yyp2 = (zzp2); \
+ Int32 yyn = (zzn); \
+ while (yyn > 0) { \
+ fswap(fmap[yyp1], fmap[yyp2]); \
+ yyp1++; yyp2++; yyn--; \
+ } \
+}
+
+
+#define fmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define fpush(lz,hz) { stackLo[sp] = lz; \
+ stackHi[sp] = hz; \
+ sp++; }
+
+#define fpop(lz,hz) { sp--; \
+ lz = stackLo[sp]; \
+ hz = stackHi[sp]; }
+
+#define FALLBACK_QSORT_SMALL_THRESH 10
+#define FALLBACK_QSORT_STACK_SIZE 100
+
+
+static
+void fallbackQSort3 ( UInt32* fmap,
+ UInt32* eclass,
+ Int32 loSt,
+ Int32 hiSt )
+{
+ Int32 unLo, unHi, ltLo, gtHi, n, m;
+ Int32 sp, lo, hi;
+ UInt32 med, r, r3;
+ Int32 stackLo[FALLBACK_QSORT_STACK_SIZE];
+ Int32 stackHi[FALLBACK_QSORT_STACK_SIZE];
+
+ r = 0;
+
+ sp = 0;
+ fpush ( loSt, hiSt );
+
+ while (sp > 0) {
+
+ AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 );
+
+ fpop ( lo, hi );
+ if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) {
+ fallbackSimpleSort ( fmap, eclass, lo, hi );
+ continue;
+ }
+
+ /* Random partitioning. Median of 3 sometimes fails to
+ avoid bad cases. Median of 9 seems to help but
+ looks rather expensive. This too seems to work but
+ is cheaper. Guidance for the magic constants
+ 7621 and 32768 is taken from Sedgewick's algorithms
+ book, chapter 35.
+ */
+ r = ((r * 7621) + 1) % 32768;
+ r3 = r % 3;
+ if (r3 == 0) med = eclass[fmap[lo]]; else
+ if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else
+ med = eclass[fmap[hi]];
+
+ unLo = ltLo = lo;
+ unHi = gtHi = hi;
+
+ while (1) {
+ while (1) {
+ if (unLo > unHi) break;
+ n = (Int32)eclass[fmap[unLo]] - (Int32)med;
+ if (n == 0) {
+ fswap(fmap[unLo], fmap[ltLo]);
+ ltLo++; unLo++;
+ continue;
+ };
+ if (n > 0) break;
+ unLo++;
+ }
+ while (1) {
+ if (unLo > unHi) break;
+ n = (Int32)eclass[fmap[unHi]] - (Int32)med;
+ if (n == 0) {
+ fswap(fmap[unHi], fmap[gtHi]);
+ gtHi--; unHi--;
+ continue;
+ };
+ if (n < 0) break;
+ unHi--;
+ }
+ if (unLo > unHi) break;
+ fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--;
+ }
+
+ AssertD ( unHi == unLo-1, "fallbackQSort3(2)" );
+
+ if (gtHi < ltLo) continue;
+
+ n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n);
+ m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m);
+
+ n = lo + unLo - ltLo - 1;
+ m = hi - (gtHi - unHi) + 1;
+
+ if (n - lo > hi - m) {
+ fpush ( lo, n );
+ fpush ( m, hi );
+ } else {
+ fpush ( m, hi );
+ fpush ( lo, n );
+ }
+ }
+}
+
+#undef fmin
+#undef fpush
+#undef fpop
+#undef fswap
+#undef fvswap
+#undef FALLBACK_QSORT_SMALL_THRESH
+#undef FALLBACK_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+ nblock > 0
+ eclass exists for [0 .. nblock-1]
+ ((UChar*)eclass) [0 .. nblock-1] holds block
+ ptr exists for [0 .. nblock-1]
+
+ Post:
+ ((UChar*)eclass) [0 .. nblock-1] holds block
+ All other areas of eclass destroyed
+ fmap [0 .. nblock-1] holds sorted order
+ bhtab [ 0 .. 2+(nblock/32) ] destroyed
+*/
+
+#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31))
+#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31))
+#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31)))
+#define WORD_BH(zz) bhtab[(zz) >> 5]
+#define UNALIGNED_BH(zz) ((zz) & 0x01f)
+
+static
+void fallbackSort ( UInt32* fmap,
+ UInt32* eclass,
+ UInt32* bhtab,
+ Int32 nblock,
+ Int32 verb )
+{
+ Int32 ftab[257];
+ Int32 ftabCopy[256];
+ Int32 H, i, j, k, l, r, cc, cc1;
+ Int32 nNotDone;
+ Int32 nBhtab;
+ UChar* eclass8 = (UChar*)eclass;
+
+ /*--
+ Initial 1-char radix sort to generate
+ initial fmap and initial BH bits.
+ --*/
+ if (verb >= 4)
+ VPrintf0 ( " bucket sorting ...\n" );
+ for (i = 0; i < 257; i++) ftab[i] = 0;
+ for (i = 0; i < nblock; i++) ftab[eclass8[i]]++;
+ for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i];
+ for (i = 1; i < 257; i++) ftab[i] += ftab[i-1];
+
+ for (i = 0; i < nblock; i++) {
+ j = eclass8[i];
+ k = ftab[j] - 1;
+ ftab[j] = k;
+ fmap[k] = i;
+ }
+
+ nBhtab = 2 + (nblock / 32);
+ for (i = 0; i < nBhtab; i++) bhtab[i] = 0;
+ for (i = 0; i < 256; i++) SET_BH(ftab[i]);
+
+ /*--
+ Inductively refine the buckets. Kind-of an
+ "exponential radix sort" (!), inspired by the
+ Manber-Myers suffix array construction algorithm.
+ --*/
+
+ /*-- set sentinel bits for block-end detection --*/
+ for (i = 0; i < 32; i++) {
+ SET_BH(nblock + 2*i);
+ CLEAR_BH(nblock + 2*i + 1);
+ }
+
+ /*-- the log(N) loop --*/
+ H = 1;
+ while (1) {
+
+ if (verb >= 4)
+ VPrintf1 ( " depth %6d has ", H );
+
+ j = 0;
+ for (i = 0; i < nblock; i++) {
+ if (ISSET_BH(i)) j = i;
+ k = fmap[i] - H; if (k < 0) k += nblock;
+ eclass[k] = j;
+ }
+
+ nNotDone = 0;
+ r = -1;
+ while (1) {
+
+ /*-- find the next non-singleton bucket --*/
+ k = r + 1;
+ while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+ if (ISSET_BH(k)) {
+ while (WORD_BH(k) == 0xffffffff) k += 32;
+ while (ISSET_BH(k)) k++;
+ }
+ l = k - 1;
+ if (l >= nblock) break;
+ while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+ if (!ISSET_BH(k)) {
+ while (WORD_BH(k) == 0x00000000) k += 32;
+ while (!ISSET_BH(k)) k++;
+ }
+ r = k - 1;
+ if (r >= nblock) break;
+
+ /*-- now [l, r] bracket current bucket --*/
+ if (r > l) {
+ nNotDone += (r - l + 1);
+ fallbackQSort3 ( fmap, eclass, l, r );
+
+ /*-- scan bucket and generate header bits-- */
+ cc = -1;
+ for (i = l; i <= r; i++) {
+ cc1 = eclass[fmap[i]];
+ if (cc != cc1) { SET_BH(i); cc = cc1; };
+ }
+ }
+ }
+
+ if (verb >= 4)
+ VPrintf1 ( "%6d unresolved strings\n", nNotDone );
+
+ H *= 2;
+ if (H > nblock || nNotDone == 0) break;
+ }
+
+ /*--
+ Reconstruct the original block in
+ eclass8 [0 .. nblock-1], since the
+ previous phase destroyed it.
+ --*/
+ if (verb >= 4)
+ VPrintf0 ( " reconstructing block ...\n" );
+ j = 0;
+ for (i = 0; i < nblock; i++) {
+ while (ftabCopy[j] == 0) j++;
+ ftabCopy[j]--;
+ eclass8[fmap[i]] = (UChar)j;
+ }
+ AssertH ( j < 256, 1005 );
+}
+
+#undef SET_BH
+#undef CLEAR_BH
+#undef ISSET_BH
+#undef WORD_BH
+#undef UNALIGNED_BH
+
+
+/*---------------------------------------------*/
+/*--- The main, O(N^2 log(N)) sorting ---*/
+/*--- algorithm. Faster for "normal" ---*/
+/*--- non-repetitive blocks. ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+__inline__
+Bool mainGtU ( UInt32 i1,
+ UInt32 i2,
+ UChar* block,
+ UInt16* quadrant,
+ UInt32 nblock,
+ Int32* budget )
+{
+ Int32 k;
+ UChar c1, c2;
+ UInt16 s1, s2;
+
+ AssertD ( i1 != i2, "mainGtU" );
+ /* 1 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 2 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 3 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 4 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 5 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 6 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 7 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 8 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 9 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 10 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 11 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+ /* 12 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ i1++; i2++;
+
+ k = nblock + 8;
+
+ do {
+ /* 1 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 2 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 3 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 4 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 5 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 6 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 7 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+ /* 8 */
+ c1 = block[i1]; c2 = block[i2];
+ if (c1 != c2) return (c1 > c2);
+ s1 = quadrant[i1]; s2 = quadrant[i2];
+ if (s1 != s2) return (s1 > s2);
+ i1++; i2++;
+
+ if (i1 >= nblock) i1 -= nblock;
+ if (i2 >= nblock) i2 -= nblock;
+
+ k -= 8;
+ (*budget)--;
+ }
+ while (k >= 0);
+
+ return False;
+}
+
+
+/*---------------------------------------------*/
+/*--
+ Knuth's increments seem to work better
+ than Incerpi-Sedgewick here. Possibly
+ because the number of elems to sort is
+ usually small, typically <= 20.
+--*/
+static
+Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
+ 9841, 29524, 88573, 265720,
+ 797161, 2391484 };
+
+static
+void mainSimpleSort ( UInt32* ptr,
+ UChar* block,
+ UInt16* quadrant,
+ Int32 nblock,
+ Int32 lo,
+ Int32 hi,
+ Int32 d,
+ Int32* budget )
+{
+ Int32 i, j, h, bigN, hp;
+ UInt32 v;
+
+ bigN = hi - lo + 1;
+ if (bigN < 2) return;
+
+ hp = 0;
+ while (incs[hp] < bigN) hp++;
+ hp--;
+
+ for (; hp >= 0; hp--) {
+ h = incs[hp];
+
+ i = lo + h;
+ while (True) {
+
+ /*-- copy 1 --*/
+ if (i > hi) break;
+ v = ptr[i];
+ j = i;
+ while ( mainGtU (
+ ptr[j-h]+d, v+d, block, quadrant, nblock, budget
+ ) ) {
+ ptr[j] = ptr[j-h];
+ j = j - h;
+ if (j <= (lo + h - 1)) break;
+ }
+ ptr[j] = v;
+ i++;
+
+ /*-- copy 2 --*/
+ if (i > hi) break;
+ v = ptr[i];
+ j = i;
+ while ( mainGtU (
+ ptr[j-h]+d, v+d, block, quadrant, nblock, budget
+ ) ) {
+ ptr[j] = ptr[j-h];
+ j = j - h;
+ if (j <= (lo + h - 1)) break;
+ }
+ ptr[j] = v;
+ i++;
+
+ /*-- copy 3 --*/
+ if (i > hi) break;
+ v = ptr[i];
+ j = i;
+ while ( mainGtU (
+ ptr[j-h]+d, v+d, block, quadrant, nblock, budget
+ ) ) {
+ ptr[j] = ptr[j-h];
+ j = j - h;
+ if (j <= (lo + h - 1)) break;
+ }
+ ptr[j] = v;
+ i++;
+
+ if (*budget < 0) return;
+ }
+ }
+}
+
+
+/*---------------------------------------------*/
+/*--
+ The following is an implementation of
+ an elegant 3-way quicksort for strings,
+ described in a paper "Fast Algorithms for
+ Sorting and Searching Strings", by Robert
+ Sedgewick and Jon L. Bentley.
+--*/
+
+#define mswap(zz1, zz2) \
+ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define mvswap(zzp1, zzp2, zzn) \
+{ \
+ Int32 yyp1 = (zzp1); \
+ Int32 yyp2 = (zzp2); \
+ Int32 yyn = (zzn); \
+ while (yyn > 0) { \
+ mswap(ptr[yyp1], ptr[yyp2]); \
+ yyp1++; yyp2++; yyn--; \
+ } \
+}
+
+static
+__inline__
+UChar mmed3 ( UChar a, UChar b, UChar c )
+{
+ UChar t;
+ if (a > b) { t = a; a = b; b = t; };
+ if (b > c) {
+ b = c;
+ if (a > b) b = a;
+ }
+ return b;
+}
+
+#define mmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define mpush(lz,hz,dz) { stackLo[sp] = lz; \
+ stackHi[sp] = hz; \
+ stackD [sp] = dz; \
+ sp++; }
+
+#define mpop(lz,hz,dz) { sp--; \
+ lz = stackLo[sp]; \
+ hz = stackHi[sp]; \
+ dz = stackD [sp]; }
+
+
+#define mnextsize(az) (nextHi[az]-nextLo[az])
+
+#define mnextswap(az,bz) \
+ { Int32 tz; \
+ tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \
+ tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \
+ tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; }
+
+
+#define MAIN_QSORT_SMALL_THRESH 20
+#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
+#define MAIN_QSORT_STACK_SIZE 100
+
+static
+void mainQSort3 ( UInt32* ptr,
+ UChar* block,
+ UInt16* quadrant,
+ Int32 nblock,
+ Int32 loSt,
+ Int32 hiSt,
+ Int32 dSt,
+ Int32* budget )
+{
+ Int32 unLo, unHi, ltLo, gtHi, n, m, med;
+ Int32 sp, lo, hi, d;
+
+ Int32 stackLo[MAIN_QSORT_STACK_SIZE];
+ Int32 stackHi[MAIN_QSORT_STACK_SIZE];
+ Int32 stackD [MAIN_QSORT_STACK_SIZE];
+
+ Int32 nextLo[3];
+ Int32 nextHi[3];
+ Int32 nextD [3];
+
+ sp = 0;
+ mpush ( loSt, hiSt, dSt );
+
+ while (sp > 0) {
+
+ AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 );
+
+ mpop ( lo, hi, d );
+ if (hi - lo < MAIN_QSORT_SMALL_THRESH ||
+ d > MAIN_QSORT_DEPTH_THRESH) {
+ mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
+ if (*budget < 0) return;
+ continue;
+ }
+
+ med = (Int32)
+ mmed3 ( block[ptr[ lo ]+d],
+ block[ptr[ hi ]+d],
+ block[ptr[ (lo+hi)>>1 ]+d] );
+
+ unLo = ltLo = lo;
+ unHi = gtHi = hi;
+
+ while (True) {
+ while (True) {
+ if (unLo > unHi) break;
+ n = ((Int32)block[ptr[unLo]+d]) - med;
+ if (n == 0) {
+ mswap(ptr[unLo], ptr[ltLo]);
+ ltLo++; unLo++; continue;
+ };
+ if (n > 0) break;
+ unLo++;
+ }
+ while (True) {
+ if (unLo > unHi) break;
+ n = ((Int32)block[ptr[unHi]+d]) - med;
+ if (n == 0) {
+ mswap(ptr[unHi], ptr[gtHi]);
+ gtHi--; unHi--; continue;
+ };
+ if (n < 0) break;
+ unHi--;
+ }
+ if (unLo > unHi) break;
+ mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--;
+ }
+
+ AssertD ( unHi == unLo-1, "mainQSort3(2)" );
+
+ if (gtHi < ltLo) {
+ mpush(lo, hi, d+1 );
+ continue;
+ }
+
+ n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n);
+ m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m);
+
+ n = lo + unLo - ltLo - 1;
+ m = hi - (gtHi - unHi) + 1;
+
+ nextLo[0] = lo; nextHi[0] = n; nextD[0] = d;
+ nextLo[1] = m; nextHi[1] = hi; nextD[1] = d;
+ nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1;
+
+ if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+ if (mnextsize(1) < mnextsize(2)) mnextswap(1,2);
+ if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+
+ AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" );
+ AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" );
+
+ mpush (nextLo[0], nextHi[0], nextD[0]);
+ mpush (nextLo[1], nextHi[1], nextD[1]);
+ mpush (nextLo[2], nextHi[2], nextD[2]);
+ }
+}
+
+#undef mswap
+#undef mvswap
+#undef mpush
+#undef mpop
+#undef mmin
+#undef mnextsize
+#undef mnextswap
+#undef MAIN_QSORT_SMALL_THRESH
+#undef MAIN_QSORT_DEPTH_THRESH
+#undef MAIN_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+ nblock > N_OVERSHOOT
+ block32 exists for [0 .. nblock-1 +N_OVERSHOOT]
+ ((UChar*)block32) [0 .. nblock-1] holds block
+ ptr exists for [0 .. nblock-1]
+
+ Post:
+ ((UChar*)block32) [0 .. nblock-1] holds block
+ All other areas of block32 destroyed
+ ftab [0 .. 65536 ] destroyed
+ ptr [0 .. nblock-1] holds sorted order
+ if (*budget < 0), sorting was abandoned
+*/
+
+#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8])
+#define SETMASK (1 << 21)
+#define CLEARMASK (~(SETMASK))
+
+static
+void mainSort ( UInt32* ptr,
+ UChar* block,
+ UInt16* quadrant,
+ UInt32* ftab,
+ Int32 nblock,
+ Int32 verb,
+ Int32* budget )
+{
+ Int32 i, j, k, ss, sb;
+ Int32 runningOrder[256];
+ Bool bigDone[256];
+ Int32 copyStart[256];
+ Int32 copyEnd [256];
+ UChar c1;
+ Int32 numQSorted;
+ UInt16 s;
+ if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" );
+
+ /*-- set up the 2-byte frequency table --*/
+ for (i = 65536; i >= 0; i--) ftab[i] = 0;
+
+ j = block[0] << 8;
+ i = nblock-1;
+ for (; i >= 3; i -= 4) {
+ quadrant[i] = 0;
+ j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+ ftab[j]++;
+ quadrant[i-1] = 0;
+ j = (j >> 8) | ( ((UInt16)block[i-1]) << 8);
+ ftab[j]++;
+ quadrant[i-2] = 0;
+ j = (j >> 8) | ( ((UInt16)block[i-2]) << 8);
+ ftab[j]++;
+ quadrant[i-3] = 0;
+ j = (j >> 8) | ( ((UInt16)block[i-3]) << 8);
+ ftab[j]++;
+ }
+ for (; i >= 0; i--) {
+ quadrant[i] = 0;
+ j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+ ftab[j]++;
+ }
+
+ /*-- (emphasises close relationship of block & quadrant) --*/
+ for (i = 0; i < BZ_N_OVERSHOOT; i++) {
+ block [nblock+i] = block[i];
+ quadrant[nblock+i] = 0;
+ }
+
+ if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" );
+
+ /*-- Complete the initial radix sort --*/
+ for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1];
+
+ s = block[0] << 8;
+ i = nblock-1;
+ for (; i >= 3; i -= 4) {
+ s = (s >> 8) | (block[i] << 8);
+ j = ftab[s] -1;
+ ftab[s] = j;
+ ptr[j] = i;
+ s = (s >> 8) | (block[i-1] << 8);
+ j = ftab[s] -1;
+ ftab[s] = j;
+ ptr[j] = i-1;
+ s = (s >> 8) | (block[i-2] << 8);
+ j = ftab[s] -1;
+ ftab[s] = j;
+ ptr[j] = i-2;
+ s = (s >> 8) | (block[i-3] << 8);
+ j = ftab[s] -1;
+ ftab[s] = j;
+ ptr[j] = i-3;
+ }
+ for (; i >= 0; i--) {
+ s = (s >> 8) | (block[i] << 8);
+ j = ftab[s] -1;
+ ftab[s] = j;
+ ptr[j] = i;
+ }
+
+ /*--
+ Now ftab contains the first loc of every small bucket.
+ Calculate the running order, from smallest to largest
+ big bucket.
+ --*/
+ for (i = 0; i <= 255; i++) {
+ bigDone [i] = False;
+ runningOrder[i] = i;
+ }
+
+ {
+ Int32 vv;
+ Int32 h = 1;
+ do h = 3 * h + 1; while (h <= 256);
+ do {
+ h = h / 3;
+ for (i = h; i <= 255; i++) {
+ vv = runningOrder[i];
+ j = i;
+ while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) {
+ runningOrder[j] = runningOrder[j-h];
+ j = j - h;
+ if (j <= (h - 1)) goto zero;
+ }
+ zero:
+ runningOrder[j] = vv;
+ }
+ } while (h != 1);
+ }
+
+ /*--
+ The main sorting loop.
+ --*/
+
+ numQSorted = 0;
+
+ for (i = 0; i <= 255; i++) {
+
+ /*--
+ Process big buckets, starting with the least full.
+ Basically this is a 3-step process in which we call
+ mainQSort3 to sort the small buckets [ss, j], but
+ also make a big effort to avoid the calls if we can.
+ --*/
+ ss = runningOrder[i];
+
+ /*--
+ Step 1:
+ Complete the big bucket [ss] by quicksorting
+ any unsorted small buckets [ss, j], for j != ss.
+ Hopefully previous pointer-scanning phases have already
+ completed many of the small buckets [ss, j], so
+ we don't have to sort them at all.
+ --*/
+ for (j = 0; j <= 255; j++) {
+ if (j != ss) {
+ sb = (ss << 8) + j;
+ if ( ! (ftab[sb] & SETMASK) ) {
+ Int32 lo = ftab[sb] & CLEARMASK;
+ Int32 hi = (ftab[sb+1] & CLEARMASK) - 1;
+ if (hi > lo) {
+ if (verb >= 4)
+ VPrintf4 ( " qsort [0x%x, 0x%x] "
+ "done %d this %d\n",
+ ss, j, numQSorted, hi - lo + 1 );
+ mainQSort3 (
+ ptr, block, quadrant, nblock,
+ lo, hi, BZ_N_RADIX, budget
+ );
+ numQSorted += (hi - lo + 1);
+ if (*budget < 0) return;
+ }
+ }
+ ftab[sb] |= SETMASK;
+ }
+ }
+
+ AssertH ( !bigDone[ss], 1006 );
+
+ /*--
+ Step 2:
+ Now scan this big bucket [ss] so as to synthesise the
+ sorted order for small buckets [t, ss] for all t,
+ including, magically, the bucket [ss,ss] too.
+ This will avoid doing Real Work in subsequent Step 1's.
+ --*/
+ {
+ for (j = 0; j <= 255; j++) {
+ copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK;
+ copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1;
+ }
+ for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) {
+ k = ptr[j]-1; if (k < 0) k += nblock;
+ c1 = block[k];
+ if (!bigDone[c1])
+ ptr[ copyStart[c1]++ ] = k;
+ }
+ for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
+ k = ptr[j]-1; if (k < 0) k += nblock;
+ c1 = block[k];
+ if (!bigDone[c1])
+ ptr[ copyEnd[c1]-- ] = k;
+ }
+ }
+
+ AssertH ( (copyStart[ss]-1 == copyEnd[ss])
+ ||
+ /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
+ Necessity for this case is demonstrated by compressing
+ a sequence of approximately 48.5 million of character
+ 251; 1.0.0/1.0.1 will then die here. */
+ (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
+ 1007 )
+
+ for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
+
+ /*--
+ Step 3:
+ The [ss] big bucket is now done. Record this fact,
+ and update the quadrant descriptors. Remember to
+ update quadrants in the overshoot area too, if
+ necessary. The "if (i < 255)" test merely skips
+ this updating for the last bucket processed, since
+ updating for the last bucket is pointless.
+
+ The quadrant array provides a way to incrementally
+ cache sort orderings, as they appear, so as to
+ make subsequent comparisons in fullGtU() complete
+ faster. For repetitive blocks this makes a big
+ difference (but not big enough to be able to avoid
+ the fallback sorting mechanism, exponential radix sort).
+
+ The precise meaning is: at all times:
+
+ for 0 <= i < nblock and 0 <= j <= nblock
+
+ if block[i] != block[j],
+
+ then the relative values of quadrant[i] and
+ quadrant[j] are meaningless.
+
+ else {
+ if quadrant[i] < quadrant[j]
+ then the string starting at i lexicographically
+ precedes the string starting at j
+
+ else if quadrant[i] > quadrant[j]
+ then the string starting at j lexicographically
+ precedes the string starting at i
+
+ else
+ the relative ordering of the strings starting
+ at i and j has not yet been determined.
+ }
+ --*/
+ bigDone[ss] = True;
+
+ if (i < 255) {
+ Int32 bbStart = ftab[ss << 8] & CLEARMASK;
+ Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart;
+ Int32 shifts = 0;
+
+ while ((bbSize >> shifts) > 65534) shifts++;
+
+ for (j = bbSize-1; j >= 0; j--) {
+ Int32 a2update = ptr[bbStart + j];
+ UInt16 qVal = (UInt16)(j >> shifts);
+ quadrant[a2update] = qVal;
+ if (a2update < BZ_N_OVERSHOOT)
+ quadrant[a2update + nblock] = qVal;
+ }
+ AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 );
+ }
+
+ }
+
+ if (verb >= 4)
+ VPrintf3 ( " %d pointers, %d sorted, %d scanned\n",
+ nblock, numQSorted, nblock - numQSorted );
+}
+
+#undef BIGFREQ
+#undef SETMASK
+#undef CLEARMASK
+
+
+/*---------------------------------------------*/
+/* Pre:
+ nblock > 0
+ arr2 exists for [0 .. nblock-1 +N_OVERSHOOT]
+ ((UChar*)arr2) [0 .. nblock-1] holds block
+ arr1 exists for [0 .. nblock-1]
+
+ Post:
+ ((UChar*)arr2) [0 .. nblock-1] holds block
+ All other areas of block destroyed
+ ftab [ 0 .. 65536 ] destroyed
+ arr1 [0 .. nblock-1] holds sorted order
+*/
+void BZ2_blockSort ( EState* s )
+{
+ UInt32* ptr = s->ptr;
+ UChar* block = s->block;
+ UInt32* ftab = s->ftab;
+ Int32 nblock = s->nblock;
+ Int32 verb = s->verbosity;
+ Int32 wfact = s->workFactor;
+ UInt16* quadrant;
+ Int32 budget;
+ Int32 budgetInit;
+ Int32 i;
+
+ if (nblock < 10000) {
+ fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+ } else {
+ /* Calculate the location for quadrant, remembering to get
+ the alignment right. Assumes that &(block[0]) is at least
+ 2-byte aligned -- this should be ok since block is really
+ the first section of arr2.
+ */
+ i = nblock+BZ_N_OVERSHOOT;
+ if (i & 1) i++;
+ quadrant = (UInt16*)(&(block[i]));
+
+ /* (wfact-1) / 3 puts the default-factor-30
+ transition point at very roughly the same place as
+ with v0.1 and v0.9.0.
+ Not that it particularly matters any more, since the
+ resulting compressed stream is now the same regardless
+ of whether or not we use the main sort or fallback sort.
+ */
+ if (wfact < 1 ) wfact = 1;
+ if (wfact > 100) wfact = 100;
+ budgetInit = nblock * ((wfact-1) / 3);
+ budget = budgetInit;
+
+ mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
+ if (verb >= 3)
+ VPrintf3 ( " %d work, %d block, ratio %5.2f\n",
+ budgetInit - budget,
+ nblock,
+ (float)(budgetInit - budget) /
+ (float)(nblock==0 ? 1 : nblock) );
+ if (budget < 0) {
+ if (verb >= 2)
+ VPrintf0 ( " too repetitive; using fallback"
+ " sorting algorithm\n" );
+ fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+ }
+ }
+
+ s->origPtr = -1;
+ for (i = 0; i < s->nblock; i++)
+ if (ptr[i] == 0)
+ { s->origPtr = i; break; };
+
+ AssertH( s->origPtr != -1, 1003 );
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end blocksort.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/bz2lib.rc b/Build/source/utils/bzip2/bz2lib.rc
new file mode 100644
index 00000000000..be4e5e938ec
--- /dev/null
+++ b/Build/source/utils/bzip2/bz2lib.rc
@@ -0,0 +1,34 @@
+/* bz2lib.rc -*- C -*-
+
+ Copyright (C) 1996-2003 Fabrice Popineau <fabrice.popineau@supelec.fr>
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ This file is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this file; if not, write to the Free Software
+ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#define VER_FILEVERSION TEXLIVE_MAJOR_VERSION,TEXLIVE_MINOR_VERSION,TEXLIVE_BETA_NUMBER,TEXLIVE_ALPHA_NUMBER
+#define VER_FILEVERSION_STR TEXLIVE_PRODUCTVERSION_STR " BZip2 library 1.0.2, 30-Dec-2001"
+
+#define VER_INTERNALNAME_STR "bz2lib"
+#define VER_ORIGINALFILENAME_STR "bz2lib.dll"
+
+#define VER_LEGALCOPYRIGHT_STR "(C) 1996-2002 Julian R Seward\0"
+
+#define VER_FILEDESCRIPTION_STR "BZip2 data compression library"
+
+#define VER_FILETYPE VFT_DLL
+
+#include <texlive.version>
+
+/* bz2lib.rc ends here */
diff --git a/Build/source/utils/bzip2/bzdiff b/Build/source/utils/bzip2/bzdiff
new file mode 100644
index 00000000000..3c2eb859fca
--- /dev/null
+++ b/Build/source/utils/bzip2/bzdiff
@@ -0,0 +1,76 @@
+#!/bin/sh
+# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
+
+# Bzcmp/diff wrapped for bzip2,
+# adapted from zdiff by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
+
+# Bzcmp and bzdiff are used to invoke the cmp or the diff pro-
+# gram on compressed files. All options specified are passed
+# directly to cmp or diff. If only 1 file is specified, then
+# the files compared are file1 and an uncompressed file1.gz.
+# If two files are specified, then they are uncompressed (if
+# necessary) and fed to cmp or diff. The exit status from cmp
+# or diff is preserved.
+
+PATH="/usr/bin:$PATH"; export PATH
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+ *cmp) comp=${CMP-cmp} ;;
+ *) comp=${DIFF-diff} ;;
+esac
+
+OPTIONS=
+FILES=
+for ARG
+do
+ case "$ARG" in
+ -*) OPTIONS="$OPTIONS $ARG";;
+ *) if test -f "$ARG"; then
+ FILES="$FILES $ARG"
+ else
+ echo "${prog}: $ARG not found or not a regular file"
+ exit 1
+ fi ;;
+ esac
+done
+if test -z "$FILES"; then
+ echo "Usage: $prog [${comp}_options] file [file]"
+ exit 1
+fi
+tmp=`tempfile -d /tmp -p bz` || {
+ echo 'cannot create a temporary file' >&2
+ exit 1
+}
+set $FILES
+if test $# -eq 1; then
+ FILE=`echo "$1" | sed 's/.bz2$//'`
+ bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
+ STAT="$?"
+
+elif test $# -eq 2; then
+ case "$1" in
+ *.bz2)
+ case "$2" in
+ *.bz2)
+ F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
+ bzip2 -cdfq "$2" > $tmp
+ bzip2 -cdfq "$1" | $comp $OPTIONS - $tmp
+ STAT="$?"
+ /bin/rm -f $tmp;;
+
+ *) bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
+ STAT="$?";;
+ esac;;
+ *) case "$2" in
+ *.bz2)
+ bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
+ STAT="$?";;
+ *) $comp $OPTIONS "$1" "$2"
+ STAT="$?";;
+ esac;;
+ esac
+ exit "$STAT"
+else
+ echo "Usage: $prog [${comp}_options] file [file]"
+ exit 1
+fi
diff --git a/Build/source/utils/bzip2/bzdiff.1 b/Build/source/utils/bzip2/bzdiff.1
new file mode 100644
index 00000000000..adb7a8e724e
--- /dev/null
+++ b/Build/source/utils/bzip2/bzdiff.1
@@ -0,0 +1,47 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
+\"for Debian GNU/Linux
+.TH BZDIFF 1
+.SH NAME
+bzcmp, bzdiff \- compare bzip2 compressed files
+.SH SYNOPSIS
+.B bzcmp
+[ cmp_options ] file1
+[ file2 ]
+.br
+.B bzdiff
+[ diff_options ] file1
+[ file2 ]
+.SH DESCRIPTION
+.I Bzcmp
+and
+.I bzdiff
+are used to invoke the
+.I cmp
+or the
+.I diff
+program on bzip2 compressed files. All options specified are passed
+directly to
+.I cmp
+or
+.IR diff "."
+If only 1 file is specified, then the files compared are
+.I file1
+and an uncompressed
+.IR file1 ".bz2."
+If two files are specified, then they are uncompressed if necessary and fed to
+.I cmp
+or
+.IR diff "."
+The exit status from
+.I cmp
+or
+.I diff
+is preserved.
+.SH "SEE ALSO"
+cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
+.SH BUGS
+Messages from the
+.I cmp
+or
+.I diff
+programs refer to temporary filenames instead of those specified.
diff --git a/Build/source/utils/bzip2/bzgrep b/Build/source/utils/bzip2/bzgrep
new file mode 100644
index 00000000000..dbfc00e8dbe
--- /dev/null
+++ b/Build/source/utils/bzip2/bzgrep
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+# Bzgrep wrapped for bzip2,
+# adapted from zgrep by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
+## zgrep notice:
+## zgrep -- a wrapper around a grep program that decompresses files as needed
+## Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+ *egrep) grep=${EGREP-egrep} ;;
+ *fgrep) grep=${FGREP-fgrep} ;;
+ *) grep=${GREP-grep} ;;
+esac
+pat=""
+while test $# -ne 0; do
+ case "$1" in
+ -e | -f) opt="$opt $1"; shift; pat="$1"
+ if test "$grep" = grep; then # grep is buggy with -e on SVR4
+ grep=egrep
+ fi;;
+ -A | -B) opt="$opt $1 $2"; shift;;
+ -*) opt="$opt $1";;
+ *) if test -z "$pat"; then
+ pat="$1"
+ else
+ break;
+ fi;;
+ esac
+ shift
+done
+
+if test -z "$pat"; then
+ echo "grep through bzip2 files"
+ echo "usage: $prog [grep_options] pattern [files]"
+ exit 1
+fi
+
+list=0
+silent=0
+op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$op" in
+ *l*) list=1
+esac
+case "$op" in
+ *h*) silent=1
+esac
+
+if test $# -eq 0; then
+ bzip2 -cdfq | $grep $opt "$pat"
+ exit $?
+fi
+
+res=0
+for i do
+ if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
+ if test $list -eq 1; then
+ bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
+ r=$?
+ elif test $# -eq 1 -o $silent -eq 1; then
+ bzip2 -cdfq "$i" | $grep $opt "$pat"
+ r=$?
+ else
+ bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${i}:|"
+ r=$?
+ fi
+ test "$r" -ne 0 && res="$r"
+done
+exit $res
diff --git a/Build/source/utils/bzip2/bzgrep.1 b/Build/source/utils/bzip2/bzgrep.1
new file mode 100644
index 00000000000..930af8c7fcb
--- /dev/null
+++ b/Build/source/utils/bzip2/bzgrep.1
@@ -0,0 +1,56 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
+\"for Debian GNU/Linux
+.TH BZGREP 1
+.SH NAME
+bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
+.SH SYNOPSIS
+.B bzgrep
+[ grep_options ]
+.BI [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzegrep
+[ egrep_options ]
+.BI [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzfgrep
+[ fgrep_options ]
+.BI [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.SH DESCRIPTION
+.IR Bzgrep
+is used to invoke the
+.I grep
+on bzip2-compressed files. All options specified are passed directly to
+.I grep.
+If no file is specified, then the standard input is decompressed
+if necessary and fed to grep.
+Otherwise the given files are uncompressed if necessary and fed to
+.I grep.
+.PP
+If
+.I bzgrep
+is invoked as
+.I bzegrep
+or
+.I bzfgrep
+then
+.I egrep
+or
+.I fgrep
+is used instead of
+.I grep.
+If the GREP environment variable is set,
+.I bzgrep
+uses it as the
+.I grep
+program to be invoked. For example:
+
+ for sh: GREP=fgrep bzgrep string files
+ for csh: (setenv GREP fgrep; bzgrep string files)
+.SH AUTHOR
+Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
+Troin <phil@fifi.org> for Debian GNU/Linux.
+.SH "SEE ALSO"
+grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
diff --git a/Build/source/utils/bzip2/bzip2.1 b/Build/source/utils/bzip2/bzip2.1
new file mode 100644
index 00000000000..623435c2427
--- /dev/null
+++ b/Build/source/utils/bzip2/bzip2.1
@@ -0,0 +1,453 @@
+.PU
+.TH bzip2 1
+.SH NAME
+bzip2, bunzip2 \- a block-sorting file compressor, v1.0.2
+.br
+bzcat \- decompresses files to stdout
+.br
+bzip2recover \- recovers data from damaged bzip2 files
+
+.SH SYNOPSIS
+.ll +8
+.B bzip2
+.RB [ " \-cdfkqstvzVL123456789 " ]
+[
+.I "filenames \&..."
+]
+.ll -8
+.br
+.B bunzip2
+.RB [ " \-fkvsVL " ]
+[
+.I "filenames \&..."
+]
+.br
+.B bzcat
+.RB [ " \-s " ]
+[
+.I "filenames \&..."
+]
+.br
+.B bzip2recover
+.I "filename"
+
+.SH DESCRIPTION
+.I bzip2
+compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding. Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+
+The command-line options are deliberately very similar to
+those of
+.I GNU gzip,
+but they are not identical.
+
+.I bzip2
+expects a list of file names to accompany the
+command-line flags. Each file is replaced by a compressed version of
+itself, with the name "original_name.bz2".
+Each compressed file
+has the same modification date, permissions, and, when possible,
+ownership as the corresponding original, so that these properties can
+be correctly restored at decompression time. File name handling is
+naive in the sense that there is no mechanism for preserving original
+file names, permissions, ownerships or dates in filesystems which lack
+these concepts, or have serious file name length restrictions, such as
+MS-DOS.
+
+.I bzip2
+and
+.I bunzip2
+will by default not overwrite existing
+files. If you want this to happen, specify the \-f flag.
+
+If no file names are specified,
+.I bzip2
+compresses from standard
+input to standard output. In this case,
+.I bzip2
+will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+.I bunzip2
+(or
+.I bzip2 \-d)
+decompresses all
+specified files. Files which were not created by
+.I bzip2
+will be detected and ignored, and a warning issued.
+.I bzip2
+attempts to guess the filename for the decompressed file
+from that of the compressed file as follows:
+
+ filename.bz2 becomes filename
+ filename.bz becomes filename
+ filename.tbz2 becomes filename.tar
+ filename.tbz becomes filename.tar
+ anyothername becomes anyothername.out
+
+If the file does not end in one of the recognised endings,
+.I .bz2,
+.I .bz,
+.I .tbz2
+or
+.I .tbz,
+.I bzip2
+complains that it cannot
+guess the name of the original file, and uses the original name
+with
+.I .out
+appended.
+
+As with compression, supplying no
+filenames causes decompression from
+standard input to standard output.
+
+.I bunzip2
+will correctly decompress a file which is the
+concatenation of two or more compressed files. The result is the
+concatenation of the corresponding uncompressed files. Integrity
+testing (\-t)
+of concatenated
+compressed files is also supported.
+
+You can also compress or decompress files to the standard output by
+giving the \-c flag. Multiple files may be compressed and
+decompressed like this. The resulting outputs are fed sequentially to
+stdout. Compression of multiple files
+in this manner generates a stream
+containing multiple compressed file representations. Such a stream
+can be decompressed correctly only by
+.I bzip2
+version 0.9.0 or
+later. Earlier versions of
+.I bzip2
+will stop after decompressing
+the first file in the stream.
+
+.I bzcat
+(or
+.I bzip2 -dc)
+decompresses all specified files to
+the standard output.
+
+.I bzip2
+will read arguments from the environment variables
+.I BZIP2
+and
+.I BZIP,
+in that order, and will process them
+before any arguments read from the command line. This gives a
+convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed
+file is slightly
+larger than the original. Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes. Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+
+As a self-check for your protection,
+.I
+bzip2
+uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original. This guards against corruption of the compressed data, and
+against undetected bugs in
+.I bzip2
+(hopefully very unlikely). The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed. Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong. It can't help you
+recover the original uncompressed
+data. You can use
+.I bzip2recover
+to try to recover data from
+damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused
+.I bzip2
+to panic.
+
+.SH OPTIONS
+.TP
+.B \-c --stdout
+Compress or decompress to standard output.
+.TP
+.B \-d --decompress
+Force decompression.
+.I bzip2,
+.I bunzip2
+and
+.I bzcat
+are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used. This flag overrides that
+mechanism, and forces
+.I bzip2
+to decompress.
+.TP
+.B \-z --compress
+The complement to \-d: forces compression, regardless of the
+invocation name.
+.TP
+.B \-t --test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+.TP
+.B \-f --force
+Force overwrite of output files. Normally,
+.I bzip2
+will not overwrite
+existing output files. Also forces
+.I bzip2
+to break hard links
+to files, which it otherwise wouldn't do.
+
+bzip2 normally declines to decompress files which don't have the
+correct magic header bytes. If forced (-f), however, it will pass
+such files through unmodified. This is how GNU gzip behaves.
+.TP
+.B \-k --keep
+Keep (don't delete) input files during compression
+or decompression.
+.TP
+.B \-s --small
+Reduce memory usage, for compression, decompression and testing. Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte. This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+
+During compression, \-s selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio. In short, if your machine is low on memory (8 megabytes or
+less), use \-s for everything. See MEMORY MANAGEMENT below.
+.TP
+.B \-q --quiet
+Suppress non-essential warning messages. Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+.TP
+.B \-v --verbose
+Verbose mode -- show the compression ratio for each file processed.
+Further \-v's increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+.TP
+.B \-L --license -V --version
+Display the software version, license terms and conditions.
+.TP
+.B \-1 (or \-\-fast) to \-9 (or \-\-best)
+Set the block size to 100 k, 200 k .. 900 k when compressing. Has no
+effect when decompressing. See MEMORY MANAGEMENT below.
+The \-\-fast and \-\-best aliases are primarily for GNU gzip
+compatibility. In particular, \-\-fast doesn't make things
+significantly faster.
+And \-\-best merely selects the default behaviour.
+.TP
+.B \--
+Treats all subsequent arguments as file names, even if they start
+with a dash. This is so you can handle files with names beginning
+with a dash, for example: bzip2 \-- \-myfilename.
+.TP
+.B \--repetitive-fast --repetitive-best
+These flags are redundant in versions 0.9.5 and above. They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful. 0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+
+.SH MEMORY MANAGEMENT
+.I bzip2
+compresses large files in blocks. The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression. The flags \-1 through \-9
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively. At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+.I bunzip2
+then allocates itself just enough memory to decompress
+the file. Since block sizes are stored in compressed files, it follows
+that the flags \-1 to \-9 are irrelevant to and so ignored
+during decompression.
+
+Compression and decompression requirements,
+in bytes, can be estimated as:
+
+ Compression: 400k + ( 8 x block size )
+
+ Decompression: 100k + ( 4 x block size ), or
+ 100k + ( 2.5 x block size )
+
+Larger block sizes give rapidly diminishing marginal returns. Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using
+.I bzip2
+on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+
+For files compressed with the default 900k block size,
+.I bunzip2
+will require about 3700 kbytes to decompress. To support decompression
+of any file on a 4 megabyte machine,
+.I bunzip2
+has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes. Decompression speed is also halved, so you should use this
+option only where necessary. The relevant flag is -s.
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved. Compression and
+decompression speed are virtually unaffected by block size.
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size. The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block. For example, compressing a file
+20,000 bytes long with the flag -9 will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it. Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+
+Here is a table which summarises the maximum memory usage for different
+block sizes. Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes. This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+
+ Compress Decompress Decompress Corpus
+ Flag usage usage -s usage Size
+
+ -1 1200k 500k 350k 914704
+ -2 2000k 900k 600k 877703
+ -3 2800k 1300k 850k 860338
+ -4 3600k 1700k 1100k 846899
+ -5 4400k 2100k 1350k 845160
+ -6 5200k 2500k 1600k 838626
+ -7 6100k 2900k 1850k 834096
+ -8 6800k 3300k 2100k 828642
+ -9 7600k 3700k 2350k 828642
+
+.SH RECOVERING DATA FROM DAMAGED FILES
+.I bzip2
+compresses files in blocks, usually 900kbytes long. Each
+block is handled independently. If a media or transmission error causes
+a multi-block .bz2
+file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty. Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+
+.I bzip2recover
+is a simple program whose purpose is to search for
+blocks in .bz2 files, and write each block out into its own .bz2
+file. You can then use
+.I bzip2
+\-t
+to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+
+.I bzip2recover
+takes a single argument, the name of the damaged file,
+and writes a number of files "rec00001file.bz2",
+"rec00002file.bz2", etc, containing the extracted blocks.
+The output filenames are designed so that the use of
+wildcards in subsequent processing -- for example,
+"bzip2 -dc rec*file.bz2 > recovered_data" -- processes the files in
+the correct order.
+
+.I bzip2recover
+should be of most use dealing with large .bz2
+files, as these will contain many blocks. It is clearly
+futile to use it on damaged single-block files, since a
+damaged block cannot be recovered. If you wish to minimise
+any potential data loss through media or transmission errors,
+you might consider compressing with a smaller
+block size.
+
+.SH PERFORMANCE NOTES
+The sorting phase of compression gathers together similar strings in the
+file. Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..." (repeated several hundred times) may
+compress more slowly than normal. Versions 0.9.5 and above fare much
+better than previous versions in this respect. The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1. You can use the
+\-vvvv option to monitor progress in great detail, if you want.
+
+Decompression speed is unaffected by these phenomena.
+
+.I bzip2
+usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion. This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine
+.I bzip2
+will perform best on machines with very large caches.
+
+.SH CAVEATS
+I/O error messages are not as helpful as they could be.
+.I bzip2
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+
+This manual page pertains to version 1.0.2 of
+.I bzip2.
+Compressed data created by this version is entirely forwards and
+backwards compatible with the previous public releases, versions
+0.1pl2, 0.9.0, 0.9.5, 1.0.0 and 1.0.1, but with the following
+exception: 0.9.0 and above can correctly decompress multiple
+concatenated compressed files. 0.1pl2 cannot do this; it will stop
+after decompressing just the first file in the stream.
+
+.I bzip2recover
+versions prior to this one, 1.0.2, used 32-bit integers to represent
+bit positions in compressed files, so it could not handle compressed
+files more than 512 megabytes long. Version 1.0.2 and above uses
+64-bit ints on some platforms which support them (GNU supported
+targets, and Windows). To establish whether or not bzip2recover was
+built with such a limitation, run it without arguments. In any event
+you can build yourself an unlimited version if you can recompile it
+with MaybeUInt64 set to be an unsigned 64-bit integer.
+
+
+
+.SH AUTHOR
+Julian Seward, jseward@acm.org.
+
+http://sources.redhat.com/bzip2
+
+The ideas embodied in
+.I bzip2
+are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original
+.I bzip,
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+.I bzip).
+I am much
+indebted for their help, support and advice. See the manual in the
+source distribution for pointers to sources of documentation. Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression. Bela Lubkin encouraged me to improve the
+worst-case compression performance.
+The bz* scripts are derived from those of GNU gzip.
+Many people sent patches, helped
+with portability problems, lent machines, gave advice and were generally
+helpful.
diff --git a/Build/source/utils/bzip2/bzip2.1.preformatted b/Build/source/utils/bzip2/bzip2.1.preformatted
new file mode 100644
index 00000000000..0f20cb5a2b2
--- /dev/null
+++ b/Build/source/utils/bzip2/bzip2.1.preformatted
@@ -0,0 +1,398 @@
+bzip2(1) bzip2(1)
+
+
+
+NNAAMMEE
+ bzip2, bunzip2 - a block-sorting file compressor, v1.0.2
+ bzcat - decompresses files to stdout
+ bzip2recover - recovers data from damaged bzip2 files
+
+
+SSYYNNOOPPSSIISS
+ bbzziipp22 [ --ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._. ]
+ bbuunnzziipp22 [ --ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._. ]
+ bbzzccaatt [ --ss ] [ _f_i_l_e_n_a_m_e_s _._._. ]
+ bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
+
+
+DDEESSCCRRIIPPTTIIOONN
+ _b_z_i_p_2 compresses files using the Burrows-Wheeler block
+ sorting text compression algorithm, and Huffman coding.
+ Compression is generally considerably better than that
+ achieved by more conventional LZ77/LZ78-based compressors,
+ and approaches the performance of the PPM family of sta­
+ tistical compressors.
+
+ The command-line options are deliberately very similar to
+ those of _G_N_U _g_z_i_p_, but they are not identical.
+
+ _b_z_i_p_2 expects a list of file names to accompany the com­
+ mand-line flags. Each file is replaced by a compressed
+ version of itself, with the name "original_name.bz2".
+ Each compressed file has the same modification date, per­
+ missions, and, when possible, ownership as the correspond­
+ ing original, so that these properties can be correctly
+ restored at decompression time. File name handling is
+ naive in the sense that there is no mechanism for preserv­
+ ing original file names, permissions, ownerships or dates
+ in filesystems which lack these concepts, or have serious
+ file name length restrictions, such as MS-DOS.
+
+ _b_z_i_p_2 and _b_u_n_z_i_p_2 will by default not overwrite existing
+ files. If you want this to happen, specify the -f flag.
+
+ If no file names are specified, _b_z_i_p_2 compresses from
+ standard input to standard output. In this case, _b_z_i_p_2
+ will decline to write compressed output to a terminal, as
+ this would be entirely incomprehensible and therefore
+ pointless.
+
+ _b_u_n_z_i_p_2 (or _b_z_i_p_2 _-_d_) decompresses all specified files.
+ Files which were not created by _b_z_i_p_2 will be detected and
+ ignored, and a warning issued. _b_z_i_p_2 attempts to guess
+ the filename for the decompressed file from that of the
+ compressed file as follows:
+
+ filename.bz2 becomes filename
+ filename.bz becomes filename
+ filename.tbz2 becomes filename.tar
+ filename.tbz becomes filename.tar
+ anyothername becomes anyothername.out
+
+ If the file does not end in one of the recognised endings,
+ _._b_z_2_, _._b_z_, _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
+ guess the name of the original file, and uses the original
+ name with _._o_u_t appended.
+
+ As with compression, supplying no filenames causes decom­
+ pression from standard input to standard output.
+
+ _b_u_n_z_i_p_2 will correctly decompress a file which is the con­
+ catenation of two or more compressed files. The result is
+ the concatenation of the corresponding uncompressed files.
+ Integrity testing (-t) of concatenated compressed files is
+ also supported.
+
+ You can also compress or decompress files to the standard
+ output by giving the -c flag. Multiple files may be com­
+ pressed and decompressed like this. The resulting outputs
+ are fed sequentially to stdout. Compression of multiple
+ files in this manner generates a stream containing multi­
+ ple compressed file representations. Such a stream can be
+ decompressed correctly only by _b_z_i_p_2 version 0.9.0 or
+ later. Earlier versions of _b_z_i_p_2 will stop after decom­
+ pressing the first file in the stream.
+
+ _b_z_c_a_t (or _b_z_i_p_2 _-_d_c_) decompresses all specified files to
+ the standard output.
+
+ _b_z_i_p_2 will read arguments from the environment variables
+ _B_Z_I_P_2 and _B_Z_I_P_, in that order, and will process them
+ before any arguments read from the command line. This
+ gives a convenient way to supply default arguments.
+
+ Compression is always performed, even if the compressed
+ file is slightly larger than the original. Files of less
+ than about one hundred bytes tend to get larger, since the
+ compression mechanism has a constant overhead in the
+ region of 50 bytes. Random data (including the output of
+ most file compressors) is coded at about 8.05 bits per
+ byte, giving an expansion of around 0.5%.
+
+ As a self-check for your protection, _b_z_i_p_2 uses 32-bit
+ CRCs to make sure that the decompressed version of a file
+ is identical to the original. This guards against corrup­
+ tion of the compressed data, and against undetected bugs
+ in _b_z_i_p_2 (hopefully very unlikely). The chances of data
+ corruption going undetected is microscopic, about one
+ chance in four billion for each file processed. Be aware,
+ though, that the check occurs upon decompression, so it
+ can only tell you that something is wrong. It can't help
+ you recover the original uncompressed data. You can use
+ _b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
+
+ Return values: 0 for a normal exit, 1 for environmental
+ problems (file not found, invalid flags, I/O errors, &c),
+ 2 to indicate a corrupt compressed file, 3 for an internal
+ consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
+
+
+OOPPTTIIOONNSS
+ --cc ----ssttddoouutt
+ Compress or decompress to standard output.
+
+ --dd ----ddeeccoommpprreessss
+ Force decompression. _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
+ really the same program, and the decision about
+ what actions to take is done on the basis of which
+ name is used. This flag overrides that mechanism,
+ and forces _b_z_i_p_2 to decompress.
+
+ --zz ----ccoommpprreessss
+ The complement to -d: forces compression,
+ regardless of the invocation name.
+
+ --tt ----tteesstt
+ Check integrity of the specified file(s), but don't
+ decompress them. This really performs a trial
+ decompression and throws away the result.
+
+ --ff ----ffoorrccee
+ Force overwrite of output files. Normally, _b_z_i_p_2
+ will not overwrite existing output files. Also
+ forces _b_z_i_p_2 to break hard links to files, which it
+ otherwise wouldn't do.
+
+ bzip2 normally declines to decompress files which
+ don't have the correct magic header bytes. If
+ forced (-f), however, it will pass such files
+ through unmodified. This is how GNU gzip behaves.
+
+ --kk ----kkeeeepp
+ Keep (don't delete) input files during compression
+ or decompression.
+
+ --ss ----ssmmaallll
+ Reduce memory usage, for compression, decompression
+ and testing. Files are decompressed and tested
+ using a modified algorithm which only requires 2.5
+ bytes per block byte. This means any file can be
+ decompressed in 2300k of memory, albeit at about
+ half the normal speed.
+
+ During compression, -s selects a block size of
+ 200k, which limits memory use to around the same
+ figure, at the expense of your compression ratio.
+ In short, if your machine is low on memory (8
+ megabytes or less), use -s for everything. See
+ MEMORY MANAGEMENT below.
+
+ --qq ----qquuiieett
+ Suppress non-essential warning messages. Messages
+ pertaining to I/O errors and other critical events
+ will not be suppressed.
+
+ --vv ----vveerrbboossee
+ Verbose mode -- show the compression ratio for each
+ file processed. Further -v's increase the ver­
+ bosity level, spewing out lots of information which
+ is primarily of interest for diagnostic purposes.
+
+ --LL ----lliicceennssee --VV ----vveerrssiioonn
+ Display the software version, license terms and
+ conditions.
+
+ --11 ((oorr ----ffaasstt)) ttoo --99 ((oorr ----bbeesstt))
+ Set the block size to 100 k, 200 k .. 900 k when
+ compressing. Has no effect when decompressing.
+ See MEMORY MANAGEMENT below. The --fast and --best
+ aliases are primarily for GNU gzip compatibility.
+ In particular, --fast doesn't make things signifi­
+ cantly faster. And --best merely selects the
+ default behaviour.
+
+ ---- Treats all subsequent arguments as file names, even
+ if they start with a dash. This is so you can han­
+ dle files with names beginning with a dash, for
+ example: bzip2 -- -myfilename.
+
+ ----rreeppeettiittiivvee--ffaasstt ----rreeppeettiittiivvee--bbeesstt
+ These flags are redundant in versions 0.9.5 and
+ above. They provided some coarse control over the
+ behaviour of the sorting algorithm in earlier ver­
+ sions, which was sometimes useful. 0.9.5 and above
+ have an improved algorithm which renders these
+ flags irrelevant.
+
+
+MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
+ _b_z_i_p_2 compresses large files in blocks. The block size
+ affects both the compression ratio achieved, and the
+ amount of memory needed for compression and decompression.
+ The flags -1 through -9 specify the block size to be
+ 100,000 bytes through 900,000 bytes (the default) respec­
+ tively. At decompression time, the block size used for
+ compression is read from the header of the compressed
+ file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
+ to decompress the file. Since block sizes are stored in
+ compressed files, it follows that the flags -1 to -9 are
+ irrelevant to and so ignored during decompression.
+
+ Compression and decompression requirements, in bytes, can
+ be estimated as:
+
+ Compression: 400k + ( 8 x block size )
+
+ Decompression: 100k + ( 4 x block size ), or
+ 100k + ( 2.5 x block size )
+
+ Larger block sizes give rapidly diminishing marginal
+ returns. Most of the compression comes from the first two
+ or three hundred k of block size, a fact worth bearing in
+ mind when using _b_z_i_p_2 on small machines. It is also
+ important to appreciate that the decompression memory
+ requirement is set at compression time by the choice of
+ block size.
+
+ For files compressed with the default 900k block size,
+ _b_u_n_z_i_p_2 will require about 3700 kbytes to decompress. To
+ support decompression of any file on a 4 megabyte machine,
+ _b_u_n_z_i_p_2 has an option to decompress using approximately
+ half this amount of memory, about 2300 kbytes. Decompres­
+ sion speed is also halved, so you should use this option
+ only where necessary. The relevant flag is -s.
+
+ In general, try and use the largest block size memory con­
+ straints allow, since that maximises the compression
+ achieved. Compression and decompression speed are virtu­
+ ally unaffected by block size.
+
+ Another significant point applies to files which fit in a
+ single block -- that means most files you'd encounter
+ using a large block size. The amount of real memory
+ touched is proportional to the size of the file, since the
+ file is smaller than a block. For example, compressing a
+ file 20,000 bytes long with the flag -9 will cause the
+ compressor to allocate around 7600k of memory, but only
+ touch 400k + 20000 * 8 = 560 kbytes of it. Similarly, the
+ decompressor will allocate 3700k but only touch 100k +
+ 20000 * 4 = 180 kbytes.
+
+ Here is a table which summarises the maximum memory usage
+ for different block sizes. Also recorded is the total
+ compressed size for 14 files of the Calgary Text Compres­
+ sion Corpus totalling 3,141,622 bytes. This column gives
+ some feel for how compression varies with block size.
+ These figures tend to understate the advantage of larger
+ block sizes for larger files, since the Corpus is domi­
+ nated by smaller files.
+
+ Compress Decompress Decompress Corpus
+ Flag usage usage -s usage Size
+
+ -1 1200k 500k 350k 914704
+ -2 2000k 900k 600k 877703
+ -3 2800k 1300k 850k 860338
+ -4 3600k 1700k 1100k 846899
+ -5 4400k 2100k 1350k 845160
+ -6 5200k 2500k 1600k 838626
+ -7 6100k 2900k 1850k 834096
+ -8 6800k 3300k 2100k 828642
+ -9 7600k 3700k 2350k 828642
+
+
+RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
+ _b_z_i_p_2 compresses files in blocks, usually 900kbytes long.
+ Each block is handled independently. If a media or trans­
+ mission error causes a multi-block .bz2 file to become
+ damaged, it may be possible to recover data from the
+ undamaged blocks in the file.
+
+ The compressed representation of each block is delimited
+ by a 48-bit pattern, which makes it possible to find the
+ block boundaries with reasonable certainty. Each block
+ also carries its own 32-bit CRC, so damaged blocks can be
+ distinguished from undamaged ones.
+
+ _b_z_i_p_2_r_e_c_o_v_e_r is a simple program whose purpose is to
+ search for blocks in .bz2 files, and write each block out
+ into its own .bz2 file. You can then use _b_z_i_p_2 -t to test
+ the integrity of the resulting files, and decompress those
+ which are undamaged.
+
+ _b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam­
+ aged file, and writes a number of files
+ "rec00001file.bz2", "rec00002file.bz2", etc, containing
+ the extracted blocks. The output filenames are
+ designed so that the use of wildcards in subsequent pro­
+ cessing -- for example, "bzip2 -dc rec*file.bz2 > recov­
+ ered_data" -- processes the files in the correct order.
+
+ _b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
+ files, as these will contain many blocks. It is clearly
+ futile to use it on damaged single-block files, since a
+ damaged block cannot be recovered. If you wish to min­
+ imise any potential data loss through media or transmis­
+ sion errors, you might consider compressing with a smaller
+ block size.
+
+
+PPEERRFFOORRMMAANNCCEE NNOOTTEESS
+ The sorting phase of compression gathers together similar
+ strings in the file. Because of this, files containing
+ very long runs of repeated symbols, like "aabaabaabaab
+ ..." (repeated several hundred times) may compress more
+ slowly than normal. Versions 0.9.5 and above fare much
+ better than previous versions in this respect. The ratio
+ between worst-case and average-case compression time is in
+ the region of 10:1. For previous versions, this figure
+ was more like 100:1. You can use the -vvvv option to mon­
+ itor progress in great detail, if you want.
+
+ Decompression speed is unaffected by these phenomena.
+
+ _b_z_i_p_2 usually allocates several megabytes of memory to
+ operate in, and then charges all over it in a fairly ran­
+ dom fashion. This means that performance, both for com­
+ pressing and decompressing, is largely determined by the
+ speed at which your machine can service cache misses.
+ Because of this, small changes to the code to reduce the
+ miss rate have been observed to give disproportionately
+ large performance improvements. I imagine _b_z_i_p_2 will per­
+ form best on machines with very large caches.
+
+
+CCAAVVEEAATTSS
+ I/O error messages are not as helpful as they could be.
+ _b_z_i_p_2 tries hard to detect I/O errors and exit cleanly,
+ but the details of what the problem is sometimes seem
+ rather misleading.
+
+ This manual page pertains to version 1.0.2 of _b_z_i_p_2_. Com­
+ pressed data created by this version is entirely forwards
+ and backwards compatible with the previous public
+ releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0 and 1.0.1,
+ but with the following exception: 0.9.0 and above can cor­
+ rectly decompress multiple concatenated compressed files.
+ 0.1pl2 cannot do this; it will stop after decompressing
+ just the first file in the stream.
+
+ _b_z_i_p_2_r_e_c_o_v_e_r versions prior to this one, 1.0.2, used
+ 32-bit integers to represent bit positions in compressed
+ files, so it could not handle compressed files more than
+ 512 megabytes long. Version 1.0.2 and above uses 64-bit
+ ints on some platforms which support them (GNU supported
+ targets, and Windows). To establish whether or not
+ bzip2recover was built with such a limitation, run it
+ without arguments. In any event you can build yourself an
+ unlimited version if you can recompile it with MaybeUInt64
+ set to be an unsigned 64-bit integer.
+
+
+
+
+AAUUTTHHOORR
+ Julian Seward, jseward@acm.org.
+
+ http://sources.redhat.com/bzip2
+
+ The ideas embodied in _b_z_i_p_2 are due to (at least) the fol­
+ lowing people: Michael Burrows and David Wheeler (for the
+ block sorting transformation), David Wheeler (again, for
+ the Huffman coder), Peter Fenwick (for the structured cod­
+ ing model in the original _b_z_i_p_, and many refinements), and
+ Alistair Moffat, Radford Neal and Ian Witten (for the
+ arithmetic coder in the original _b_z_i_p_)_. I am much
+ indebted for their help, support and advice. See the man­
+ ual in the source distribution for pointers to sources of
+ documentation. Christian von Roques encouraged me to look
+ for faster sorting algorithms, so as to speed up compres­
+ sion. Bela Lubkin encouraged me to improve the worst-case
+ compression performance. The bz* scripts are derived from
+ those of GNU gzip. Many people sent patches, helped with
+ portability problems, lent machines, gave advice and were
+ generally helpful.
+
+
+
+ bzip2(1)
diff --git a/Build/source/utils/bzip2/bzip2.c b/Build/source/utils/bzip2/bzip2.c
new file mode 100644
index 00000000000..d661d38a224
--- /dev/null
+++ b/Build/source/utils/bzip2/bzip2.c
@@ -0,0 +1,2104 @@
+
+/*-----------------------------------------------------------*/
+/*--- A block-sorting, lossless compressor bzip2.c ---*/
+/*-----------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+/*----------------------------------------------------*/
+/*--- IMPORTANT ---*/
+/*----------------------------------------------------*/
+
+/*--
+ WARNING:
+ This program and library (attempts to) compress data by
+ performing several non-trivial transformations on it.
+ Unless you are 100% familiar with *all* the algorithms
+ contained herein, and with the consequences of modifying them,
+ you should NOT meddle with the compression or decompression
+ machinery. Incorrect changes can and very likely *will*
+ lead to disasterous loss of data.
+
+ DISCLAIMER:
+ I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE
+ USE OF THIS PROGRAM, HOWSOEVER CAUSED.
+
+ Every compression of a file implies an assumption that the
+ compressed file can be decompressed to reproduce the original.
+ Great efforts in design, coding and testing have been made to
+ ensure that this program works correctly. However, the
+ complexity of the algorithms, and, in particular, the presence
+ of various special cases in the code which occur with very low
+ but non-zero probability make it impossible to rule out the
+ possibility of bugs remaining in the program. DO NOT COMPRESS
+ ANY DATA WITH THIS PROGRAM AND/OR LIBRARY UNLESS YOU ARE PREPARED
+ TO ACCEPT THE POSSIBILITY, HOWEVER SMALL, THAT THE DATA WILL
+ NOT BE RECOVERABLE.
+
+ That is not to say this program is inherently unreliable.
+ Indeed, I very much hope the opposite is true. bzip2/libbzip2
+ has been carefully constructed and extensively tested.
+
+ PATENTS:
+ To the best of my knowledge, bzip2/libbzip2 does not use any
+ patented algorithms. However, I do not have the resources
+ available to carry out a full patent search. Therefore I cannot
+ give any guarantee of the above statement.
+--*/
+
+
+
+/*----------------------------------------------------*/
+/*--- and now for something much more pleasant :-) ---*/
+/*----------------------------------------------------*/
+
+/*---------------------------------------------*/
+/*--
+ Place a 1 beside your platform, and 0 elsewhere.
+--*/
+
+/*--
+ Generic 32-bit Unix.
+ Also works on 64-bit Unix boxes.
+ This is the default.
+--*/
+#define BZ_UNIX 1
+
+/*--
+ Win32, as seen by Jacob Navia's excellent
+ port of (Chris Fraser & David Hanson)'s excellent
+ lcc compiler. Or with MS Visual C.
+ This is selected automatically if compiled by a compiler which
+ defines _WIN32, not including the Cygwin GCC.
+--*/
+#define BZ_LCCWIN32 0
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#undef BZ_LCCWIN32
+#define BZ_LCCWIN32 1
+#undef BZ_UNIX
+#define BZ_UNIX 0
+#endif
+
+
+/*---------------------------------------------*/
+/*--
+ Some stuff for all platforms.
+--*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <math.h>
+#include <errno.h>
+#include <ctype.h>
+#include "bzlib.h"
+
+#define ERROR_IF_EOF(i) { if ((i) == EOF) ioError(); }
+#define ERROR_IF_NOT_ZERO(i) { if ((i) != 0) ioError(); }
+#define ERROR_IF_MINUS_ONE(i) { if ((i) == (-1)) ioError(); }
+
+
+/*---------------------------------------------*/
+/*--
+ Platform-specific stuff.
+--*/
+
+#if BZ_UNIX
+# include <fcntl.h>
+# include <sys/types.h>
+# include <utime.h>
+# include <unistd.h>
+# include <sys/stat.h>
+# include <sys/times.h>
+
+# define PATH_SEP '/'
+# define MY_LSTAT lstat
+# define MY_STAT stat
+# define MY_S_ISREG S_ISREG
+# define MY_S_ISDIR S_ISDIR
+
+# define APPEND_FILESPEC(root, name) \
+ root=snocString((root), (name))
+
+# define APPEND_FLAG(root, name) \
+ root=snocString((root), (name))
+
+# define SET_BINARY_MODE(fd) /**/
+
+# ifdef __GNUC__
+# define NORETURN __attribute__ ((noreturn))
+# else
+# define NORETURN /**/
+# endif
+
+# ifdef __DJGPP__
+# include <io.h>
+# include <fcntl.h>
+# undef MY_LSTAT
+# undef MY_STAT
+# define MY_LSTAT stat
+# define MY_STAT stat
+# undef SET_BINARY_MODE
+# define SET_BINARY_MODE(fd) \
+ do { \
+ int retVal = setmode ( fileno ( fd ), \
+ O_BINARY ); \
+ ERROR_IF_MINUS_ONE ( retVal ); \
+ } while ( 0 )
+# endif
+
+# ifdef __CYGWIN__
+# include <io.h>
+# include <fcntl.h>
+# undef SET_BINARY_MODE
+# define SET_BINARY_MODE(fd) \
+ do { \
+ int retVal = setmode ( fileno ( fd ), \
+ O_BINARY ); \
+ ERROR_IF_MINUS_ONE ( retVal ); \
+ } while ( 0 )
+# endif
+#endif /* BZ_UNIX */
+
+
+
+#if BZ_LCCWIN32
+# include <io.h>
+# include <fcntl.h>
+# include <sys\stat.h>
+# include <oldnames.h>
+
+# define NORETURN /**/
+# define PATH_SEP '\\'
+# define MY_LSTAT _stat
+# define MY_STAT _stat
+# define MY_S_ISREG(x) ((x) & _S_IFREG)
+# define MY_S_ISDIR(x) ((x) & _S_IFDIR)
+
+# define APPEND_FLAG(root, name) \
+ root=snocString((root), (name))
+
+# define APPEND_FILESPEC(root, name) \
+ root = snocString ((root), (name))
+
+# define SET_BINARY_MODE(fd) \
+ do { \
+ int retVal = setmode ( fileno ( fd ), \
+ O_BINARY ); \
+ ERROR_IF_MINUS_ONE ( retVal ); \
+ } while ( 0 )
+
+#endif /* BZ_LCCWIN32 */
+
+
+/*---------------------------------------------*/
+/*--
+ Some more stuff for all platforms :-)
+--*/
+
+typedef char Char;
+typedef unsigned char Bool;
+typedef unsigned char UChar;
+typedef int Int32;
+typedef unsigned int UInt32;
+typedef short Int16;
+typedef unsigned short UInt16;
+
+#define True ((Bool)1)
+#define False ((Bool)0)
+
+/*--
+ IntNative is your platform's `native' int size.
+ Only here to avoid probs with 64-bit platforms.
+--*/
+typedef int IntNative;
+
+
+/*---------------------------------------------------*/
+/*--- Misc (file handling) data decls ---*/
+/*---------------------------------------------------*/
+
+Int32 verbosity;
+Bool keepInputFiles, smallMode, deleteOutputOnInterrupt;
+Bool forceOverwrite, testFailsExist, unzFailsExist, noisy;
+Int32 numFileNames, numFilesProcessed, blockSize100k;
+Int32 exitValue;
+
+/*-- source modes; F==file, I==stdin, O==stdout --*/
+#define SM_I2O 1
+#define SM_F2O 2
+#define SM_F2F 3
+
+/*-- operation modes --*/
+#define OM_Z 1
+#define OM_UNZ 2
+#define OM_TEST 3
+
+Int32 opMode;
+Int32 srcMode;
+
+#define FILE_NAME_LEN 1034
+
+Int32 longestFileName;
+Char inName [FILE_NAME_LEN];
+Char outName[FILE_NAME_LEN];
+Char tmpName[FILE_NAME_LEN];
+Char *progName;
+Char progNameReally[FILE_NAME_LEN];
+FILE *outputHandleJustInCase;
+Int32 workFactor;
+
+static void panic ( Char* ) NORETURN;
+static void ioError ( void ) NORETURN;
+static void outOfMemory ( void ) NORETURN;
+static void configError ( void ) NORETURN;
+static void crcError ( void ) NORETURN;
+static void cleanUpAndFail ( Int32 ) NORETURN;
+static void compressedStreamEOF ( void ) NORETURN;
+
+static void copyFileName ( Char*, Char* );
+static void* myMalloc ( Int32 );
+
+
+
+/*---------------------------------------------------*/
+/*--- An implementation of 64-bit ints. Sigh. ---*/
+/*--- Roll on widespread deployment of ANSI C9X ! ---*/
+/*---------------------------------------------------*/
+
+typedef
+ struct { UChar b[8]; }
+ UInt64;
+
+
+static
+void uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
+{
+ n->b[7] = (UChar)((hi32 >> 24) & 0xFF);
+ n->b[6] = (UChar)((hi32 >> 16) & 0xFF);
+ n->b[5] = (UChar)((hi32 >> 8) & 0xFF);
+ n->b[4] = (UChar) (hi32 & 0xFF);
+ n->b[3] = (UChar)((lo32 >> 24) & 0xFF);
+ n->b[2] = (UChar)((lo32 >> 16) & 0xFF);
+ n->b[1] = (UChar)((lo32 >> 8) & 0xFF);
+ n->b[0] = (UChar) (lo32 & 0xFF);
+}
+
+
+static
+double uInt64_to_double ( UInt64* n )
+{
+ Int32 i;
+ double base = 1.0;
+ double sum = 0.0;
+ for (i = 0; i < 8; i++) {
+ sum += base * (double)(n->b[i]);
+ base *= 256.0;
+ }
+ return sum;
+}
+
+
+static
+Bool uInt64_isZero ( UInt64* n )
+{
+ Int32 i;
+ for (i = 0; i < 8; i++)
+ if (n->b[i] != 0) return 0;
+ return 1;
+}
+
+
+/* Divide *n by 10, and return the remainder. */
+static
+Int32 uInt64_qrm10 ( UInt64* n )
+{
+ UInt32 rem, tmp;
+ Int32 i;
+ rem = 0;
+ for (i = 7; i >= 0; i--) {
+ tmp = rem * 256 + n->b[i];
+ n->b[i] = tmp / 10;
+ rem = tmp % 10;
+ }
+ return rem;
+}
+
+
+/* ... and the Whole Entire Point of all this UInt64 stuff is
+ so that we can supply the following function.
+*/
+static
+void uInt64_toAscii ( char* outbuf, UInt64* n )
+{
+ Int32 i, q;
+ UChar buf[32];
+ Int32 nBuf = 0;
+ UInt64 n_copy = *n;
+ do {
+ q = uInt64_qrm10 ( &n_copy );
+ buf[nBuf] = q + '0';
+ nBuf++;
+ } while (!uInt64_isZero(&n_copy));
+ outbuf[nBuf] = 0;
+ for (i = 0; i < nBuf; i++)
+ outbuf[i] = buf[nBuf-i-1];
+}
+
+
+/*---------------------------------------------------*/
+/*--- Processing of complete files and streams ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+Bool myfeof ( FILE* f )
+{
+ Int32 c = fgetc ( f );
+ if (c == EOF) return True;
+ ungetc ( c, f );
+ return False;
+}
+
+
+/*---------------------------------------------*/
+static
+void compressStream ( FILE *stream, FILE *zStream )
+{
+ BZFILE* bzf = NULL;
+ UChar ibuf[5000];
+ Int32 nIbuf;
+ UInt32 nbytes_in_lo32, nbytes_in_hi32;
+ UInt32 nbytes_out_lo32, nbytes_out_hi32;
+ Int32 bzerr, bzerr_dummy, ret;
+
+ SET_BINARY_MODE(stream);
+ SET_BINARY_MODE(zStream);
+
+ if (ferror(stream)) goto errhandler_io;
+ if (ferror(zStream)) goto errhandler_io;
+
+ bzf = BZ2_bzWriteOpen ( &bzerr, zStream,
+ blockSize100k, verbosity, workFactor );
+ if (bzerr != BZ_OK) goto errhandler;
+
+ if (verbosity >= 2) fprintf ( stderr, "\n" );
+
+ while (True) {
+
+ if (myfeof(stream)) break;
+ nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
+ if (ferror(stream)) goto errhandler_io;
+ if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
+ if (bzerr != BZ_OK) goto errhandler;
+
+ }
+
+ BZ2_bzWriteClose64 ( &bzerr, bzf, 0,
+ &nbytes_in_lo32, &nbytes_in_hi32,
+ &nbytes_out_lo32, &nbytes_out_hi32 );
+ if (bzerr != BZ_OK) goto errhandler;
+
+ if (ferror(zStream)) goto errhandler_io;
+ ret = fflush ( zStream );
+ if (ret == EOF) goto errhandler_io;
+ if (zStream != stdout) {
+ ret = fclose ( zStream );
+ outputHandleJustInCase = NULL;
+ if (ret == EOF) goto errhandler_io;
+ }
+ outputHandleJustInCase = NULL;
+ if (ferror(stream)) goto errhandler_io;
+ ret = fclose ( stream );
+ if (ret == EOF) goto errhandler_io;
+
+ if (verbosity >= 1) {
+ if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
+ fprintf ( stderr, " no data compressed.\n");
+ } else {
+ Char buf_nin[32], buf_nout[32];
+ UInt64 nbytes_in, nbytes_out;
+ double nbytes_in_d, nbytes_out_d;
+ uInt64_from_UInt32s ( &nbytes_in,
+ nbytes_in_lo32, nbytes_in_hi32 );
+ uInt64_from_UInt32s ( &nbytes_out,
+ nbytes_out_lo32, nbytes_out_hi32 );
+ nbytes_in_d = uInt64_to_double ( &nbytes_in );
+ nbytes_out_d = uInt64_to_double ( &nbytes_out );
+ uInt64_toAscii ( buf_nin, &nbytes_in );
+ uInt64_toAscii ( buf_nout, &nbytes_out );
+ fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+ "%5.2f%% saved, %s in, %s out.\n",
+ nbytes_in_d / nbytes_out_d,
+ (8.0 * nbytes_out_d) / nbytes_in_d,
+ 100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+ buf_nin,
+ buf_nout
+ );
+ }
+ }
+
+ return;
+
+ errhandler:
+ BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1,
+ &nbytes_in_lo32, &nbytes_in_hi32,
+ &nbytes_out_lo32, &nbytes_out_hi32 );
+ switch (bzerr) {
+ case BZ_CONFIG_ERROR:
+ configError(); break;
+ case BZ_MEM_ERROR:
+ outOfMemory (); break;
+ case BZ_IO_ERROR:
+ errhandler_io:
+ ioError(); break;
+ default:
+ panic ( "compress:unexpected error" );
+ }
+
+ panic ( "compress:end" );
+ /*notreached*/
+}
+
+
+
+/*---------------------------------------------*/
+static
+Bool uncompressStream ( FILE *zStream, FILE *stream )
+{
+ BZFILE* bzf = NULL;
+ Int32 bzerr, bzerr_dummy, ret, nread, streamNo, i;
+ UChar obuf[5000];
+ UChar unused[BZ_MAX_UNUSED];
+ Int32 nUnused;
+ UChar* unusedTmp;
+
+ nUnused = 0;
+ streamNo = 0;
+
+ SET_BINARY_MODE(stream);
+ SET_BINARY_MODE(zStream);
+
+ if (ferror(stream)) goto errhandler_io;
+ if (ferror(zStream)) goto errhandler_io;
+
+ while (True) {
+
+ bzf = BZ2_bzReadOpen (
+ &bzerr, zStream, verbosity,
+ (int)smallMode, unused, nUnused
+ );
+ if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+ streamNo++;
+
+ while (bzerr == BZ_OK) {
+ nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+ if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
+ if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
+ fwrite ( obuf, sizeof(UChar), nread, stream );
+ if (ferror(stream)) goto errhandler_io;
+ }
+ if (bzerr != BZ_STREAM_END) goto errhandler;
+
+ BZ2_bzReadGetUnused ( &bzerr, bzf, (void**)(&unusedTmp), &nUnused );
+ if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+ for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+ BZ2_bzReadClose ( &bzerr, bzf );
+ if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+ if (nUnused == 0 && myfeof(zStream)) break;
+ }
+
+ closeok:
+ if (ferror(zStream)) goto errhandler_io;
+ ret = fclose ( zStream );
+ if (ret == EOF) goto errhandler_io;
+
+ if (ferror(stream)) goto errhandler_io;
+ ret = fflush ( stream );
+ if (ret != 0) goto errhandler_io;
+ if (stream != stdout) {
+ ret = fclose ( stream );
+ outputHandleJustInCase = NULL;
+ if (ret == EOF) goto errhandler_io;
+ }
+ outputHandleJustInCase = NULL;
+ if (verbosity >= 2) fprintf ( stderr, "\n " );
+ return True;
+
+ trycat:
+ if (forceOverwrite) {
+ rewind(zStream);
+ while (True) {
+ if (myfeof(zStream)) break;
+ nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+ if (ferror(zStream)) goto errhandler_io;
+ if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+ if (ferror(stream)) goto errhandler_io;
+ }
+ goto closeok;
+ }
+
+ errhandler:
+ BZ2_bzReadClose ( &bzerr_dummy, bzf );
+ switch (bzerr) {
+ case BZ_CONFIG_ERROR:
+ configError(); break;
+ case BZ_IO_ERROR:
+ errhandler_io:
+ ioError(); break;
+ case BZ_DATA_ERROR:
+ crcError();
+ case BZ_MEM_ERROR:
+ outOfMemory();
+ case BZ_UNEXPECTED_EOF:
+ compressedStreamEOF();
+ case BZ_DATA_ERROR_MAGIC:
+ if (zStream != stdin) fclose(zStream);
+ if (stream != stdout) fclose(stream);
+ if (streamNo == 1) {
+ return False;
+ } else {
+ if (noisy)
+ fprintf ( stderr,
+ "\n%s: %s: trailing garbage after EOF ignored\n",
+ progName, inName );
+ return True;
+ }
+ default:
+ panic ( "decompress:unexpected error" );
+ }
+
+ panic ( "decompress:end" );
+ return True; /*notreached*/
+}
+
+
+/*---------------------------------------------*/
+static
+Bool testStream ( FILE *zStream )
+{
+ BZFILE* bzf = NULL;
+ Int32 bzerr, bzerr_dummy, ret, nread, streamNo, i;
+ UChar obuf[5000];
+ UChar unused[BZ_MAX_UNUSED];
+ Int32 nUnused;
+ UChar* unusedTmp;
+
+ nUnused = 0;
+ streamNo = 0;
+
+ SET_BINARY_MODE(zStream);
+ if (ferror(zStream)) goto errhandler_io;
+
+ while (True) {
+
+ bzf = BZ2_bzReadOpen (
+ &bzerr, zStream, verbosity,
+ (int)smallMode, unused, nUnused
+ );
+ if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+ streamNo++;
+
+ while (bzerr == BZ_OK) {
+ nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+ if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
+ }
+ if (bzerr != BZ_STREAM_END) goto errhandler;
+
+ BZ2_bzReadGetUnused ( &bzerr, bzf, (void**)(&unusedTmp), &nUnused );
+ if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+
+ for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+ BZ2_bzReadClose ( &bzerr, bzf );
+ if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+ if (nUnused == 0 && myfeof(zStream)) break;
+
+ }
+
+ if (ferror(zStream)) goto errhandler_io;
+ ret = fclose ( zStream );
+ if (ret == EOF) goto errhandler_io;
+
+ if (verbosity >= 2) fprintf ( stderr, "\n " );
+ return True;
+
+ errhandler:
+ BZ2_bzReadClose ( &bzerr_dummy, bzf );
+ if (verbosity == 0)
+ fprintf ( stderr, "%s: %s: ", progName, inName );
+ switch (bzerr) {
+ case BZ_CONFIG_ERROR:
+ configError(); break;
+ case BZ_IO_ERROR:
+ errhandler_io:
+ ioError(); break;
+ case BZ_DATA_ERROR:
+ fprintf ( stderr,
+ "data integrity (CRC) error in data\n" );
+ return False;
+ case BZ_MEM_ERROR:
+ outOfMemory();
+ case BZ_UNEXPECTED_EOF:
+ fprintf ( stderr,
+ "file ends unexpectedly\n" );
+ return False;
+ case BZ_DATA_ERROR_MAGIC:
+ if (zStream != stdin) fclose(zStream);
+ if (streamNo == 1) {
+ fprintf ( stderr,
+ "bad magic number (file not created by bzip2)\n" );
+ return False;
+ } else {
+ if (noisy)
+ fprintf ( stderr,
+ "trailing garbage after EOF ignored\n" );
+ return True;
+ }
+ default:
+ panic ( "test:unexpected error" );
+ }
+
+ panic ( "test:end" );
+ return True; /*notreached*/
+}
+
+
+/*---------------------------------------------------*/
+/*--- Error [non-] handling grunge ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+void setExit ( Int32 v )
+{
+ if (v > exitValue) exitValue = v;
+}
+
+
+/*---------------------------------------------*/
+static
+void cadvise ( void )
+{
+ if (noisy)
+ fprintf (
+ stderr,
+ "\nIt is possible that the compressed file(s) have become corrupted.\n"
+ "You can use the -tvv option to test integrity of such files.\n\n"
+ "You can use the `bzip2recover' program to attempt to recover\n"
+ "data from undamaged sections of corrupted files.\n\n"
+ );
+}
+
+
+/*---------------------------------------------*/
+static
+void showFileNames ( void )
+{
+ if (noisy)
+ fprintf (
+ stderr,
+ "\tInput file = %s, output file = %s\n",
+ inName, outName
+ );
+}
+
+
+/*---------------------------------------------*/
+static
+void cleanUpAndFail ( Int32 ec )
+{
+ IntNative retVal;
+ struct MY_STAT statBuf;
+
+ if ( srcMode == SM_F2F
+ && opMode != OM_TEST
+ && deleteOutputOnInterrupt ) {
+
+ /* Check whether input file still exists. Delete output file
+ only if input exists to avoid loss of data. Joerg Prante, 5
+ January 2002. (JRS 06-Jan-2002: other changes in 1.0.2 mean
+ this is less likely to happen. But to be ultra-paranoid, we
+ do the check anyway.) */
+ retVal = MY_STAT ( inName, &statBuf );
+ if (retVal == 0) {
+ if (noisy)
+ fprintf ( stderr,
+ "%s: Deleting output file %s, if it exists.\n",
+ progName, outName );
+ if (outputHandleJustInCase != NULL)
+ fclose ( outputHandleJustInCase );
+ retVal = remove ( outName );
+ if (retVal != 0)
+ fprintf ( stderr,
+ "%s: WARNING: deletion of output file "
+ "(apparently) failed.\n",
+ progName );
+ } else {
+ fprintf ( stderr,
+ "%s: WARNING: deletion of output file suppressed\n",
+ progName );
+ fprintf ( stderr,
+ "%s: since input file no longer exists. Output file\n",
+ progName );
+ fprintf ( stderr,
+ "%s: `%s' may be incomplete.\n",
+ progName, outName );
+ fprintf ( stderr,
+ "%s: I suggest doing an integrity test (bzip2 -tv)"
+ " of it.\n",
+ progName );
+ }
+ }
+
+ if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
+ fprintf ( stderr,
+ "%s: WARNING: some files have not been processed:\n"
+ "%s: %d specified on command line, %d not processed yet.\n\n",
+ progName, progName,
+ numFileNames, numFileNames - numFilesProcessed );
+ }
+ setExit(ec);
+ exit(exitValue);
+}
+
+
+/*---------------------------------------------*/
+static
+void panic ( Char* s )
+{
+ fprintf ( stderr,
+ "\n%s: PANIC -- internal consistency error:\n"
+ "\t%s\n"
+ "\tThis is a BUG. Please report it to me at:\n"
+ "\tjseward@acm.org\n",
+ progName, s );
+ showFileNames();
+ cleanUpAndFail( 3 );
+}
+
+
+/*---------------------------------------------*/
+static
+void crcError ( void )
+{
+ fprintf ( stderr,
+ "\n%s: Data integrity error when decompressing.\n",
+ progName );
+ showFileNames();
+ cadvise();
+ cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static
+void compressedStreamEOF ( void )
+{
+ if (noisy) {
+ fprintf ( stderr,
+ "\n%s: Compressed file ends unexpectedly;\n\t"
+ "perhaps it is corrupted? *Possible* reason follows.\n",
+ progName );
+ perror ( progName );
+ showFileNames();
+ cadvise();
+ }
+ cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static
+void ioError ( void )
+{
+ fprintf ( stderr,
+ "\n%s: I/O or other error, bailing out. "
+ "Possible reason follows.\n",
+ progName );
+ perror ( progName );
+ showFileNames();
+ cleanUpAndFail( 1 );
+}
+
+
+/*---------------------------------------------*/
+static
+void __cdecl mySignalCatcher ( IntNative n )
+{
+ fprintf ( stderr,
+ "\n%s: Control-C or similar caught, quitting.\n",
+ progName );
+ cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static
+void __cdecl mySIGSEGVorSIGBUScatcher ( IntNative n )
+{
+ if (opMode == OM_Z)
+ fprintf (
+ stderr,
+ "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"
+ "\n"
+ " Possible causes are (most likely first):\n"
+ " (1) This computer has unreliable memory or cache hardware\n"
+ " (a surprisingly common problem; try a different machine.)\n"
+ " (2) A bug in the compiler used to create this executable\n"
+ " (unlikely, if you didn't compile bzip2 yourself.)\n"
+ " (3) A real bug in bzip2 -- I hope this should never be the case.\n"
+ " The user's manual, Section 4.3, has more info on (1) and (2).\n"
+ " \n"
+ " If you suspect this is a bug in bzip2, or are unsure about (1)\n"
+ " or (2), feel free to report it to me at: jseward@acm.org.\n"
+ " Section 4.3 of the user's manual describes the info a useful\n"
+ " bug report should have. If the manual is available on your\n"
+ " system, please try and read it before mailing me. If you don't\n"
+ " have the manual or can't be bothered to read it, mail me anyway.\n"
+ "\n",
+ progName );
+ else
+ fprintf (
+ stderr,
+ "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"
+ "\n"
+ " Possible causes are (most likely first):\n"
+ " (1) The compressed data is corrupted, and bzip2's usual checks\n"
+ " failed to detect this. Try bzip2 -tvv my_file.bz2.\n"
+ " (2) This computer has unreliable memory or cache hardware\n"
+ " (a surprisingly common problem; try a different machine.)\n"
+ " (3) A bug in the compiler used to create this executable\n"
+ " (unlikely, if you didn't compile bzip2 yourself.)\n"
+ " (4) A real bug in bzip2 -- I hope this should never be the case.\n"
+ " The user's manual, Section 4.3, has more info on (2) and (3).\n"
+ " \n"
+ " If you suspect this is a bug in bzip2, or are unsure about (2)\n"
+ " or (3), feel free to report it to me at: jseward@acm.org.\n"
+ " Section 4.3 of the user's manual describes the info a useful\n"
+ " bug report should have. If the manual is available on your\n"
+ " system, please try and read it before mailing me. If you don't\n"
+ " have the manual or can't be bothered to read it, mail me anyway.\n"
+ "\n",
+ progName );
+
+ showFileNames();
+ if (opMode == OM_Z)
+ cleanUpAndFail( 3 ); else
+ { cadvise(); cleanUpAndFail( 2 ); }
+}
+
+
+/*---------------------------------------------*/
+static
+void outOfMemory ( void )
+{
+ fprintf ( stderr,
+ "\n%s: couldn't allocate enough memory\n",
+ progName );
+ showFileNames();
+ cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static
+void configError ( void )
+{
+ fprintf ( stderr,
+ "bzip2: I'm not configured correctly for this platform!\n"
+ "\tI require Int32, Int16 and Char to have sizes\n"
+ "\tof 4, 2 and 1 bytes to run properly, and they don't.\n"
+ "\tProbably you can fix this by defining them correctly,\n"
+ "\tand recompiling. Bye!\n" );
+ setExit(3);
+ exit(exitValue);
+}
+
+
+/*---------------------------------------------------*/
+/*--- The main driver machinery ---*/
+/*---------------------------------------------------*/
+
+/* All rather crufty. The main problem is that input files
+ are stat()d multiple times before use. This should be
+ cleaned up.
+*/
+
+/*---------------------------------------------*/
+static
+void pad ( Char *s )
+{
+ Int32 i;
+ if ( (Int32)strlen(s) >= longestFileName ) return;
+ for (i = 1; i <= longestFileName - (Int32)strlen(s); i++)
+ fprintf ( stderr, " " );
+}
+
+
+/*---------------------------------------------*/
+static
+void copyFileName ( Char* to, Char* from )
+{
+ if ( strlen(from) > FILE_NAME_LEN-10 ) {
+ fprintf (
+ stderr,
+ "bzip2: file name\n`%s'\n"
+ "is suspiciously (more than %d chars) long.\n"
+ "Try using a reasonable file name instead. Sorry! :-)\n",
+ from, FILE_NAME_LEN-10
+ );
+ setExit(1);
+ exit(exitValue);
+ }
+
+ strncpy(to,from,FILE_NAME_LEN-10);
+ to[FILE_NAME_LEN-10]='\0';
+}
+
+
+/*---------------------------------------------*/
+static
+Bool fileExists ( Char* name )
+{
+ FILE *tmp = fopen ( name, "rb" );
+ Bool exists = (tmp != NULL);
+ if (tmp != NULL) fclose ( tmp );
+ return exists;
+}
+
+
+/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions.
+ This avoids a race condition in versions < 1.0.2, in which
+ the file was first opened and then had its interim permissions
+ set safely. We instead use open() to create the file with
+ the interim permissions required. (--- --- rw-).
+
+ For non-Unix platforms, if we are not worrying about
+ security issues, simple this simply behaves like fopen.
+*/
+FILE* fopen_output_safely ( Char* name, const char* mode )
+{
+# if BZ_UNIX
+ FILE* fp;
+ IntNative fh;
+ fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
+ if (fh == -1) return NULL;
+ fp = fdopen(fh, mode);
+ if (fp == NULL) close(fh);
+ return fp;
+# else
+ return fopen(name, mode);
+# endif
+}
+
+
+/*---------------------------------------------*/
+/*--
+ if in doubt, return True
+--*/
+static
+Bool notAStandardFile ( Char* name )
+{
+ IntNative i;
+ struct MY_STAT statBuf;
+
+ i = MY_LSTAT ( name, &statBuf );
+ if (i != 0) return True;
+ if (MY_S_ISREG(statBuf.st_mode)) return False;
+ return True;
+}
+
+
+/*---------------------------------------------*/
+/*--
+ rac 11/21/98 see if file has hard links to it
+--*/
+static
+Int32 countHardLinks ( Char* name )
+{
+ IntNative i;
+ struct MY_STAT statBuf;
+
+ i = MY_LSTAT ( name, &statBuf );
+ if (i != 0) return 0;
+ return (statBuf.st_nlink - 1);
+}
+
+
+/*---------------------------------------------*/
+/* Copy modification date, access date, permissions and owner from the
+ source to destination file. We have to copy this meta-info off
+ into fileMetaInfo before starting to compress / decompress it,
+ because doing it afterwards means we get the wrong access time.
+
+ To complicate matters, in compress() and decompress() below, the
+ sequence of tests preceding the call to saveInputFileMetaInfo()
+ involves calling fileExists(), which in turn establishes its result
+ by attempting to fopen() the file, and if successful, immediately
+ fclose()ing it again. So we have to assume that the fopen() call
+ does not cause the access time field to be updated.
+
+ Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
+ to imply that merely doing open() will not affect the access time.
+ Therefore we merely need to hope that the C library only does
+ open() as a result of fopen(), and not any kind of read()-ahead
+ cleverness.
+
+ It sounds pretty fragile to me. Whether this carries across
+ robustly to arbitrary Unix-like platforms (or even works robustly
+ on this one, RedHat 7.2) is unknown to me. Nevertheless ...
+*/
+#if BZ_UNIX
+static
+struct MY_STAT fileMetaInfo;
+#endif
+
+static
+void saveInputFileMetaInfo ( Char *srcName )
+{
+# if BZ_UNIX
+ IntNative retVal;
+ /* Note use of stat here, not lstat. */
+ retVal = MY_STAT( srcName, &fileMetaInfo );
+ ERROR_IF_NOT_ZERO ( retVal );
+# endif
+}
+
+
+static
+void applySavedMetaInfoToOutputFile ( Char *dstName )
+{
+# if BZ_UNIX
+ IntNative retVal;
+ struct utimbuf uTimBuf;
+
+ uTimBuf.actime = fileMetaInfo.st_atime;
+ uTimBuf.modtime = fileMetaInfo.st_mtime;
+
+ retVal = chmod ( dstName, fileMetaInfo.st_mode );
+ ERROR_IF_NOT_ZERO ( retVal );
+
+ retVal = utime ( dstName, &uTimBuf );
+ ERROR_IF_NOT_ZERO ( retVal );
+
+ retVal = chown ( dstName, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
+ /* chown() will in many cases return with EPERM, which can
+ be safely ignored.
+ */
+# endif
+}
+
+
+/*---------------------------------------------*/
+static
+Bool containsDubiousChars ( Char* name )
+{
+# if BZ_UNIX
+ /* On unix, files can contain any characters and the file expansion
+ * is performed by the shell.
+ */
+ return False;
+# else /* ! BZ_UNIX */
+ /* On non-unix (Win* platforms), wildcard characters are not allowed in
+ * filenames.
+ */
+ for (; *name != '\0'; name++)
+ if (*name == '?' || *name == '*') return True;
+ return False;
+# endif /* BZ_UNIX */
+}
+
+
+/*---------------------------------------------*/
+#define BZ_N_SUFFIX_PAIRS 4
+
+Char* zSuffix[BZ_N_SUFFIX_PAIRS]
+ = { ".bz2", ".bz", ".tbz2", ".tbz" };
+Char* unzSuffix[BZ_N_SUFFIX_PAIRS]
+ = { "", "", ".tar", ".tar" };
+
+static
+Bool hasSuffix ( Char* s, Char* suffix )
+{
+ Int32 ns = strlen(s);
+ Int32 nx = strlen(suffix);
+ if (ns < nx) return False;
+ if (strcmp(s + ns - nx, suffix) == 0) return True;
+ return False;
+}
+
+static
+Bool mapSuffix ( Char* name,
+ Char* oldSuffix, Char* newSuffix )
+{
+ if (!hasSuffix(name,oldSuffix)) return False;
+ name[strlen(name)-strlen(oldSuffix)] = 0;
+ strcat ( name, newSuffix );
+ return True;
+}
+
+
+/*---------------------------------------------*/
+static
+void compress ( Char *name )
+{
+ FILE *inStr;
+ FILE *outStr;
+ Int32 n, i;
+ struct MY_STAT statBuf;
+
+ deleteOutputOnInterrupt = False;
+
+ if (name == NULL && srcMode != SM_I2O)
+ panic ( "compress: bad modes\n" );
+
+ switch (srcMode) {
+ case SM_I2O:
+ copyFileName ( inName, "(stdin)" );
+ copyFileName ( outName, "(stdout)" );
+ break;
+ case SM_F2F:
+ copyFileName ( inName, name );
+ copyFileName ( outName, name );
+ strcat ( outName, ".bz2" );
+ break;
+ case SM_F2O:
+ copyFileName ( inName, name );
+ copyFileName ( outName, "(stdout)" );
+ break;
+ }
+
+ if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+ if (noisy)
+ fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+ progName, inName );
+ setExit(1);
+ return;
+ }
+ if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+ fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+ progName, inName, strerror(errno) );
+ setExit(1);
+ return;
+ }
+ for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++) {
+ if (hasSuffix(inName, zSuffix[i])) {
+ if (noisy)
+ fprintf ( stderr,
+ "%s: Input file %s already has %s suffix.\n",
+ progName, inName, zSuffix[i] );
+ setExit(1);
+ return;
+ }
+ }
+ if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+ MY_STAT(inName, &statBuf);
+ if ( MY_S_ISDIR(statBuf.st_mode) ) {
+ fprintf( stderr,
+ "%s: Input file %s is a directory.\n",
+ progName,inName);
+ setExit(1);
+ return;
+ }
+ }
+ if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+ if (noisy)
+ fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+ progName, inName );
+ setExit(1);
+ return;
+ }
+ if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+ if (forceOverwrite) {
+ remove(outName);
+ } else {
+ fprintf ( stderr, "%s: Output file %s already exists.\n",
+ progName, outName );
+ setExit(1);
+ return;
+ }
+ }
+ if ( srcMode == SM_F2F && !forceOverwrite &&
+ (n=countHardLinks ( inName )) > 0) {
+ fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+ progName, inName, n, n > 1 ? "s" : "" );
+ setExit(1);
+ return;
+ }
+
+ if ( srcMode == SM_F2F ) {
+ /* Save the file's meta-info before we open it. Doing it later
+ means we mess up the access times. */
+ saveInputFileMetaInfo ( inName );
+ }
+
+ switch ( srcMode ) {
+
+ case SM_I2O:
+ inStr = stdin;
+ outStr = stdout;
+ if ( isatty ( fileno ( stdout ) ) ) {
+ fprintf ( stderr,
+ "%s: I won't write compressed data to a terminal.\n",
+ progName );
+ fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+ progName, progName );
+ setExit(1);
+ return;
+ };
+ break;
+
+ case SM_F2O:
+ inStr = fopen ( inName, "rb" );
+ outStr = stdout;
+ if ( isatty ( fileno ( stdout ) ) ) {
+ fprintf ( stderr,
+ "%s: I won't write compressed data to a terminal.\n",
+ progName );
+ fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+ progName, progName );
+ if ( inStr != NULL ) fclose ( inStr );
+ setExit(1);
+ return;
+ };
+ if ( inStr == NULL ) {
+ fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+ progName, inName, strerror(errno) );
+ setExit(1);
+ return;
+ };
+ break;
+
+ case SM_F2F:
+ inStr = fopen ( inName, "rb" );
+ outStr = fopen_output_safely ( outName, "wb" );
+ if ( outStr == NULL) {
+ fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+ progName, outName, strerror(errno) );
+ if ( inStr != NULL ) fclose ( inStr );
+ setExit(1);
+ return;
+ }
+ if ( inStr == NULL ) {
+ fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+ progName, inName, strerror(errno) );
+ if ( outStr != NULL ) fclose ( outStr );
+ setExit(1);
+ return;
+ };
+ break;
+
+ default:
+ panic ( "compress: bad srcMode" );
+ break;
+ }
+
+ if (verbosity >= 1) {
+ fprintf ( stderr, " %s: ", inName );
+ pad ( inName );
+ fflush ( stderr );
+ }
+
+ /*--- Now the input and output handles are sane. Do the Biz. ---*/
+ outputHandleJustInCase = outStr;
+ deleteOutputOnInterrupt = True;
+ compressStream ( inStr, outStr );
+ outputHandleJustInCase = NULL;
+
+ /*--- If there was an I/O error, we won't get here. ---*/
+ if ( srcMode == SM_F2F ) {
+ applySavedMetaInfoToOutputFile ( outName );
+ deleteOutputOnInterrupt = False;
+ if ( !keepInputFiles ) {
+ IntNative retVal = remove ( inName );
+ ERROR_IF_NOT_ZERO ( retVal );
+ }
+ }
+
+ deleteOutputOnInterrupt = False;
+}
+
+
+/*---------------------------------------------*/
+static
+void uncompress ( Char *name )
+{
+ FILE *inStr;
+ FILE *outStr;
+ Int32 n, i;
+ Bool magicNumberOK;
+ Bool cantGuess;
+ struct MY_STAT statBuf;
+
+ deleteOutputOnInterrupt = False;
+
+ if (name == NULL && srcMode != SM_I2O)
+ panic ( "uncompress: bad modes\n" );
+
+ cantGuess = False;
+ switch (srcMode) {
+ case SM_I2O:
+ copyFileName ( inName, "(stdin)" );
+ copyFileName ( outName, "(stdout)" );
+ break;
+ case SM_F2F:
+ copyFileName ( inName, name );
+ copyFileName ( outName, name );
+ for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++)
+ if (mapSuffix(outName,zSuffix[i],unzSuffix[i]))
+ goto zzz;
+ cantGuess = True;
+ strcat ( outName, ".out" );
+ break;
+ case SM_F2O:
+ copyFileName ( inName, name );
+ copyFileName ( outName, "(stdout)" );
+ break;
+ }
+
+ zzz:
+ if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+ if (noisy)
+ fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+ progName, inName );
+ setExit(1);
+ return;
+ }
+ if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+ fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+ progName, inName, strerror(errno) );
+ setExit(1);
+ return;
+ }
+ if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+ MY_STAT(inName, &statBuf);
+ if ( MY_S_ISDIR(statBuf.st_mode) ) {
+ fprintf( stderr,
+ "%s: Input file %s is a directory.\n",
+ progName,inName);
+ setExit(1);
+ return;
+ }
+ }
+ if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+ if (noisy)
+ fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+ progName, inName );
+ setExit(1);
+ return;
+ }
+ if ( /* srcMode == SM_F2F implied && */ cantGuess ) {
+ if (noisy)
+ fprintf ( stderr,
+ "%s: Can't guess original name for %s -- using %s\n",
+ progName, inName, outName );
+ /* just a warning, no return */
+ }
+ if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+ if (forceOverwrite) {
+ remove(outName);
+ } else {
+ fprintf ( stderr, "%s: Output file %s already exists.\n",
+ progName, outName );
+ setExit(1);
+ return;
+ }
+ }
+ if ( srcMode == SM_F2F && !forceOverwrite &&
+ (n=countHardLinks ( inName ) ) > 0) {
+ fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+ progName, inName, n, n > 1 ? "s" : "" );
+ setExit(1);
+ return;
+ }
+
+ if ( srcMode == SM_F2F ) {
+ /* Save the file's meta-info before we open it. Doing it later
+ means we mess up the access times. */
+ saveInputFileMetaInfo ( inName );
+ }
+
+ switch ( srcMode ) {
+
+ case SM_I2O:
+ inStr = stdin;
+ outStr = stdout;
+ if ( isatty ( fileno ( stdin ) ) ) {
+ fprintf ( stderr,
+ "%s: I won't read compressed data from a terminal.\n",
+ progName );
+ fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+ progName, progName );
+ setExit(1);
+ return;
+ };
+ break;
+
+ case SM_F2O:
+ inStr = fopen ( inName, "rb" );
+ outStr = stdout;
+ if ( inStr == NULL ) {
+ fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+ progName, inName, strerror(errno) );
+ if ( inStr != NULL ) fclose ( inStr );
+ setExit(1);
+ return;
+ };
+ break;
+
+ case SM_F2F:
+ inStr = fopen ( inName, "rb" );
+ outStr = fopen_output_safely ( outName, "wb" );
+ if ( outStr == NULL) {
+ fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+ progName, outName, strerror(errno) );
+ if ( inStr != NULL ) fclose ( inStr );
+ setExit(1);
+ return;
+ }
+ if ( inStr == NULL ) {
+ fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+ progName, inName, strerror(errno) );
+ if ( outStr != NULL ) fclose ( outStr );
+ setExit(1);
+ return;
+ };
+ break;
+
+ default:
+ panic ( "uncompress: bad srcMode" );
+ break;
+ }
+
+ if (verbosity >= 1) {
+ fprintf ( stderr, " %s: ", inName );
+ pad ( inName );
+ fflush ( stderr );
+ }
+
+ /*--- Now the input and output handles are sane. Do the Biz. ---*/
+ outputHandleJustInCase = outStr;
+ deleteOutputOnInterrupt = True;
+ magicNumberOK = uncompressStream ( inStr, outStr );
+ outputHandleJustInCase = NULL;
+
+ /*--- If there was an I/O error, we won't get here. ---*/
+ if ( magicNumberOK ) {
+ if ( srcMode == SM_F2F ) {
+ applySavedMetaInfoToOutputFile ( outName );
+ deleteOutputOnInterrupt = False;
+ if ( !keepInputFiles ) {
+ IntNative retVal = remove ( inName );
+ ERROR_IF_NOT_ZERO ( retVal );
+ }
+ }
+ } else {
+ unzFailsExist = True;
+ deleteOutputOnInterrupt = False;
+ if ( srcMode == SM_F2F ) {
+ IntNative retVal = remove ( outName );
+ ERROR_IF_NOT_ZERO ( retVal );
+ }
+ }
+ deleteOutputOnInterrupt = False;
+
+ if ( magicNumberOK ) {
+ if (verbosity >= 1)
+ fprintf ( stderr, "done\n" );
+ } else {
+ setExit(2);
+ if (verbosity >= 1)
+ fprintf ( stderr, "not a bzip2 file.\n" ); else
+ fprintf ( stderr,
+ "%s: %s is not a bzip2 file.\n",
+ progName, inName );
+ }
+
+}
+
+
+/*---------------------------------------------*/
+static
+void testf ( Char *name )
+{
+ FILE *inStr;
+ Bool allOK;
+ struct MY_STAT statBuf;
+
+ deleteOutputOnInterrupt = False;
+
+ if (name == NULL && srcMode != SM_I2O)
+ panic ( "testf: bad modes\n" );
+
+ copyFileName ( outName, "(none)" );
+ switch (srcMode) {
+ case SM_I2O: copyFileName ( inName, "(stdin)" ); break;
+ case SM_F2F: copyFileName ( inName, name ); break;
+ case SM_F2O: copyFileName ( inName, name ); break;
+ }
+
+ if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+ if (noisy)
+ fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+ progName, inName );
+ setExit(1);
+ return;
+ }
+ if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+ fprintf ( stderr, "%s: Can't open input %s: %s.\n",
+ progName, inName, strerror(errno) );
+ setExit(1);
+ return;
+ }
+ if ( srcMode != SM_I2O ) {
+ MY_STAT(inName, &statBuf);
+ if ( MY_S_ISDIR(statBuf.st_mode) ) {
+ fprintf( stderr,
+ "%s: Input file %s is a directory.\n",
+ progName,inName);
+ setExit(1);
+ return;
+ }
+ }
+
+ switch ( srcMode ) {
+
+ case SM_I2O:
+ if ( isatty ( fileno ( stdin ) ) ) {
+ fprintf ( stderr,
+ "%s: I won't read compressed data from a terminal.\n",
+ progName );
+ fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+ progName, progName );
+ setExit(1);
+ return;
+ };
+ inStr = stdin;
+ break;
+
+ case SM_F2O: case SM_F2F:
+ inStr = fopen ( inName, "rb" );
+ if ( inStr == NULL ) {
+ fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+ progName, inName, strerror(errno) );
+ setExit(1);
+ return;
+ };
+ break;
+
+ default:
+ panic ( "testf: bad srcMode" );
+ break;
+ }
+
+ if (verbosity >= 1) {
+ fprintf ( stderr, " %s: ", inName );
+ pad ( inName );
+ fflush ( stderr );
+ }
+
+ /*--- Now the input handle is sane. Do the Biz. ---*/
+ outputHandleJustInCase = NULL;
+ allOK = testStream ( inStr );
+
+ if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
+ if (!allOK) testFailsExist = True;
+}
+
+
+/*---------------------------------------------*/
+static
+void license ( void )
+{
+ fprintf ( stderr,
+
+ "bzip2, a block-sorting file compressor. "
+ "Version %s.\n"
+ " \n"
+ " Copyright (C) 1996-2002 by Julian Seward.\n"
+ " \n"
+ " This program is free software; you can redistribute it and/or modify\n"
+ " it under the terms set out in the LICENSE file, which is included\n"
+ " in the bzip2-1.0 source distribution.\n"
+ " \n"
+ " This program is distributed in the hope that it will be useful,\n"
+ " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ " LICENSE file for more details.\n"
+ " \n",
+ BZ2_bzlibVersion()
+ );
+}
+
+
+/*---------------------------------------------*/
+static
+void usage ( Char *fullProgName )
+{
+ fprintf (
+ stderr,
+ "bzip2, a block-sorting file compressor. "
+ "Version %s.\n"
+ "\n usage: %s [flags and input files in any order]\n"
+ "\n"
+ " -h --help print this message\n"
+ " -d --decompress force decompression\n"
+ " -z --compress force compression\n"
+ " -k --keep keep (don't delete) input files\n"
+ " -f --force overwrite existing output files\n"
+ " -t --test test compressed file integrity\n"
+ " -c --stdout output to standard out\n"
+ " -q --quiet suppress noncritical error messages\n"
+ " -v --verbose be verbose (a 2nd -v gives more)\n"
+ " -L --license display software version & license\n"
+ " -V --version display software version & license\n"
+ " -s --small use less memory (at most 2500k)\n"
+ " -1 .. -9 set block size to 100k .. 900k\n"
+ " --fast alias for -1\n"
+ " --best alias for -9\n"
+ "\n"
+ " If invoked as `bzip2', default action is to compress.\n"
+ " as `bunzip2', default action is to decompress.\n"
+ " as `bzcat', default action is to decompress to stdout.\n"
+ "\n"
+ " If no file names are given, bzip2 compresses or decompresses\n"
+ " from standard input to standard output. You can combine\n"
+ " short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
+# if BZ_UNIX
+ "\n"
+# endif
+ ,
+
+ BZ2_bzlibVersion(),
+ fullProgName
+ );
+}
+
+
+/*---------------------------------------------*/
+static
+void redundant ( Char* flag )
+{
+ fprintf (
+ stderr,
+ "%s: %s is redundant in versions 0.9.5 and above\n",
+ progName, flag );
+}
+
+
+/*---------------------------------------------*/
+/*--
+ All the garbage from here to main() is purely to
+ implement a linked list of command-line arguments,
+ into which main() copies argv[1 .. argc-1].
+
+ The purpose of this exercise is to facilitate
+ the expansion of wildcard characters * and ? in
+ filenames for OSs which don't know how to do it
+ themselves, like MSDOS, Windows 95 and NT.
+
+ The actual Dirty Work is done by the platform-
+ specific macro APPEND_FILESPEC.
+--*/
+
+typedef
+ struct zzzz {
+ Char *name;
+ struct zzzz *link;
+ }
+ Cell;
+
+
+/*---------------------------------------------*/
+static
+void *myMalloc ( Int32 n )
+{
+ void* p;
+
+ p = malloc ( (size_t)n );
+ if (p == NULL) outOfMemory ();
+ return p;
+}
+
+
+/*---------------------------------------------*/
+static
+Cell *mkCell ( void )
+{
+ Cell *c;
+
+ c = (Cell*) myMalloc ( sizeof ( Cell ) );
+ c->name = NULL;
+ c->link = NULL;
+ return c;
+}
+
+
+/*---------------------------------------------*/
+static
+Cell *snocString ( Cell *root, Char *name )
+{
+ if (root == NULL) {
+ Cell *tmp = mkCell();
+ tmp->name = (Char*) myMalloc ( 5 + strlen(name) );
+ strcpy ( tmp->name, name );
+ return tmp;
+ } else {
+ Cell *tmp = root;
+ while (tmp->link != NULL) tmp = tmp->link;
+ tmp->link = snocString ( tmp->link, name );
+ return root;
+ }
+}
+
+
+/*---------------------------------------------*/
+static
+void addFlagsFromEnvVar ( Cell** argList, Char* varName )
+{
+ Int32 i, j, k;
+ Char *envbase, *p;
+
+ envbase = getenv(varName);
+ if (envbase != NULL) {
+ p = envbase;
+ i = 0;
+ while (True) {
+ if (p[i] == 0) break;
+ p += i;
+ i = 0;
+ while (isspace((Int32)(p[0]))) p++;
+ while (p[i] != 0 && !isspace((Int32)(p[i]))) i++;
+ if (i > 0) {
+ k = i; if (k > FILE_NAME_LEN-10) k = FILE_NAME_LEN-10;
+ for (j = 0; j < k; j++) tmpName[j] = p[j];
+ tmpName[k] = 0;
+ APPEND_FLAG(*argList, tmpName);
+ }
+ }
+ }
+}
+
+
+/*---------------------------------------------*/
+#define ISFLAG(s) (strcmp(aa->name, (s))==0)
+
+IntNative main ( IntNative argc, Char *argv[] )
+{
+ Int32 i, j;
+ Char *tmp;
+ Cell *argList;
+ Cell *aa;
+ Bool decode;
+
+ /*-- Be really really really paranoid :-) --*/
+ if (sizeof(Int32) != 4 || sizeof(UInt32) != 4 ||
+ sizeof(Int16) != 2 || sizeof(UInt16) != 2 ||
+ sizeof(Char) != 1 || sizeof(UChar) != 1)
+ configError();
+
+ /*-- Initialise --*/
+ outputHandleJustInCase = NULL;
+ smallMode = False;
+ keepInputFiles = False;
+ forceOverwrite = False;
+ noisy = True;
+ verbosity = 0;
+ blockSize100k = 9;
+ testFailsExist = False;
+ unzFailsExist = False;
+ numFileNames = 0;
+ numFilesProcessed = 0;
+ workFactor = 30;
+ deleteOutputOnInterrupt = False;
+ exitValue = 0;
+ i = j = 0; /* avoid bogus warning from egcs-1.1.X */
+
+ /*-- Set up signal handlers for mem access errors --*/
+ signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
+# if BZ_UNIX
+# ifndef __DJGPP__
+ signal (SIGBUS, mySIGSEGVorSIGBUScatcher);
+# endif
+# endif
+
+ copyFileName ( inName, "(none)" );
+ copyFileName ( outName, "(none)" );
+
+ copyFileName ( progNameReally, argv[0] );
+ progName = &progNameReally[0];
+ for (tmp = &progNameReally[0]; *tmp != '\0'; tmp++)
+ if (*tmp == PATH_SEP) progName = tmp + 1;
+
+
+ /*-- Copy flags from env var BZIP2, and
+ expand filename wildcards in arg list.
+ --*/
+ argList = NULL;
+ addFlagsFromEnvVar ( &argList, "BZIP2" );
+ addFlagsFromEnvVar ( &argList, "BZIP" );
+ for (i = 1; i <= argc-1; i++)
+ APPEND_FILESPEC(argList, argv[i]);
+
+
+ /*-- Find the length of the longest filename --*/
+ longestFileName = 7;
+ numFileNames = 0;
+ decode = True;
+ for (aa = argList; aa != NULL; aa = aa->link) {
+ if (ISFLAG("--")) { decode = False; continue; }
+ if (aa->name[0] == '-' && decode) continue;
+ numFileNames++;
+ if (longestFileName < (Int32)strlen(aa->name) )
+ longestFileName = (Int32)strlen(aa->name);
+ }
+
+
+ /*-- Determine source modes; flag handling may change this too. --*/
+ if (numFileNames == 0)
+ srcMode = SM_I2O; else srcMode = SM_F2F;
+
+
+ /*-- Determine what to do (compress/uncompress/test/cat). --*/
+ /*-- Note that subsequent flag handling may change this. --*/
+ opMode = OM_Z;
+
+ if ( (strstr ( progName, "unzip" ) != 0) ||
+ (strstr ( progName, "UNZIP" ) != 0) )
+ opMode = OM_UNZ;
+
+ if ( (strstr ( progName, "z2cat" ) != 0) ||
+ (strstr ( progName, "Z2CAT" ) != 0) ||
+ (strstr ( progName, "zcat" ) != 0) ||
+ (strstr ( progName, "ZCAT" ) != 0) ) {
+ opMode = OM_UNZ;
+ srcMode = (numFileNames == 0) ? SM_I2O : SM_F2O;
+ }
+
+
+ /*-- Look at the flags. --*/
+ for (aa = argList; aa != NULL; aa = aa->link) {
+ if (ISFLAG("--")) break;
+ if (aa->name[0] == '-' && aa->name[1] != '-') {
+ for (j = 1; aa->name[j] != '\0'; j++) {
+ switch (aa->name[j]) {
+ case 'c': srcMode = SM_F2O; break;
+ case 'd': opMode = OM_UNZ; break;
+ case 'z': opMode = OM_Z; break;
+ case 'f': forceOverwrite = True; break;
+ case 't': opMode = OM_TEST; break;
+ case 'k': keepInputFiles = True; break;
+ case 's': smallMode = True; break;
+ case 'q': noisy = False; break;
+ case '1': blockSize100k = 1; break;
+ case '2': blockSize100k = 2; break;
+ case '3': blockSize100k = 3; break;
+ case '4': blockSize100k = 4; break;
+ case '5': blockSize100k = 5; break;
+ case '6': blockSize100k = 6; break;
+ case '7': blockSize100k = 7; break;
+ case '8': blockSize100k = 8; break;
+ case '9': blockSize100k = 9; break;
+ case 'V':
+ case 'L': license(); break;
+ case 'v': verbosity++; break;
+ case 'h': usage ( progName );
+ exit ( 0 );
+ break;
+ default: fprintf ( stderr, "%s: Bad flag `%s'\n",
+ progName, aa->name );
+ usage ( progName );
+ exit ( 1 );
+ break;
+ }
+ }
+ }
+ }
+
+ /*-- And again ... --*/
+ for (aa = argList; aa != NULL; aa = aa->link) {
+ if (ISFLAG("--")) break;
+ if (ISFLAG("--stdout")) srcMode = SM_F2O; else
+ if (ISFLAG("--decompress")) opMode = OM_UNZ; else
+ if (ISFLAG("--compress")) opMode = OM_Z; else
+ if (ISFLAG("--force")) forceOverwrite = True; else
+ if (ISFLAG("--test")) opMode = OM_TEST; else
+ if (ISFLAG("--keep")) keepInputFiles = True; else
+ if (ISFLAG("--small")) smallMode = True; else
+ if (ISFLAG("--quiet")) noisy = False; else
+ if (ISFLAG("--version")) license(); else
+ if (ISFLAG("--license")) license(); else
+ if (ISFLAG("--exponential")) workFactor = 1; else
+ if (ISFLAG("--repetitive-best")) redundant(aa->name); else
+ if (ISFLAG("--repetitive-fast")) redundant(aa->name); else
+ if (ISFLAG("--fast")) blockSize100k = 1; else
+ if (ISFLAG("--best")) blockSize100k = 9; else
+ if (ISFLAG("--verbose")) verbosity++; else
+ if (ISFLAG("--help")) { usage ( progName ); exit ( 0 ); }
+ else
+ if (strncmp ( aa->name, "--", 2) == 0) {
+ fprintf ( stderr, "%s: Bad flag `%s'\n", progName, aa->name );
+ usage ( progName );
+ exit ( 1 );
+ }
+ }
+
+ if (verbosity > 4) verbosity = 4;
+ if (opMode == OM_Z && smallMode && blockSize100k > 2)
+ blockSize100k = 2;
+
+ if (opMode == OM_TEST && srcMode == SM_F2O) {
+ fprintf ( stderr, "%s: -c and -t cannot be used together.\n",
+ progName );
+ exit ( 1 );
+ }
+
+ if (srcMode == SM_F2O && numFileNames == 0)
+ srcMode = SM_I2O;
+
+ if (opMode != OM_Z) blockSize100k = 0;
+
+ if (srcMode == SM_F2F) {
+ signal (SIGINT, mySignalCatcher);
+ signal (SIGTERM, mySignalCatcher);
+# if BZ_UNIX
+ signal (SIGHUP, mySignalCatcher);
+# endif
+ }
+
+ if (opMode == OM_Z) {
+ if (srcMode == SM_I2O) {
+ compress ( NULL );
+ } else {
+ decode = True;
+ for (aa = argList; aa != NULL; aa = aa->link) {
+ if (ISFLAG("--")) { decode = False; continue; }
+ if (aa->name[0] == '-' && decode) continue;
+ numFilesProcessed++;
+ compress ( aa->name );
+ }
+ }
+ }
+ else
+
+ if (opMode == OM_UNZ) {
+ unzFailsExist = False;
+ if (srcMode == SM_I2O) {
+ uncompress ( NULL );
+ } else {
+ decode = True;
+ for (aa = argList; aa != NULL; aa = aa->link) {
+ if (ISFLAG("--")) { decode = False; continue; }
+ if (aa->name[0] == '-' && decode) continue;
+ numFilesProcessed++;
+ uncompress ( aa->name );
+ }
+ }
+ if (unzFailsExist) {
+ setExit(2);
+ exit(exitValue);
+ }
+ }
+
+ else {
+ testFailsExist = False;
+ if (srcMode == SM_I2O) {
+ testf ( NULL );
+ } else {
+ decode = True;
+ for (aa = argList; aa != NULL; aa = aa->link) {
+ if (ISFLAG("--")) { decode = False; continue; }
+ if (aa->name[0] == '-' && decode) continue;
+ numFilesProcessed++;
+ testf ( aa->name );
+ }
+ }
+ if (testFailsExist && noisy) {
+ fprintf ( stderr,
+ "\n"
+ "You can use the `bzip2recover' program to attempt to recover\n"
+ "data from undamaged sections of corrupted files.\n\n"
+ );
+ setExit(2);
+ exit(exitValue);
+ }
+ }
+
+ /* Free the argument list memory to mollify leak detectors
+ (eg) Purify, Checker. Serves no other useful purpose.
+ */
+ aa = argList;
+ while (aa != NULL) {
+ Cell* aa2 = aa->link;
+ if (aa->name != NULL) free(aa->name);
+ free(aa);
+ aa = aa2;
+ }
+
+ return exitValue;
+}
+
+
+/*-----------------------------------------------------------*/
+/*--- end bzip2.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/bzip2.txt b/Build/source/utils/bzip2/bzip2.txt
new file mode 100644
index 00000000000..6afe3588675
--- /dev/null
+++ b/Build/source/utils/bzip2/bzip2.txt
@@ -0,0 +1,390 @@
+
+NAME
+ bzip2, bunzip2 - a block-sorting file compressor, v1.0.2
+ bzcat - decompresses files to stdout
+ bzip2recover - recovers data from damaged bzip2 files
+
+
+SYNOPSIS
+ bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]
+ bunzip2 [ -fkvsVL ] [ filenames ... ]
+ bzcat [ -s ] [ filenames ... ]
+ bzip2recover filename
+
+
+DESCRIPTION
+ bzip2 compresses files using the Burrows-Wheeler block
+ sorting text compression algorithm, and Huffman coding.
+ Compression is generally considerably better than that
+ achieved by more conventional LZ77/LZ78-based compressors,
+ and approaches the performance of the PPM family of sta­
+ tistical compressors.
+
+ The command-line options are deliberately very similar to
+ those of GNU gzip, but they are not identical.
+
+ bzip2 expects a list of file names to accompany the com­
+ mand-line flags. Each file is replaced by a compressed
+ version of itself, with the name "original_name.bz2".
+ Each compressed file has the same modification date, per­
+ missions, and, when possible, ownership as the correspond­
+ ing original, so that these properties can be correctly
+ restored at decompression time. File name handling is
+ naive in the sense that there is no mechanism for preserv­
+ ing original file names, permissions, ownerships or dates
+ in filesystems which lack these concepts, or have serious
+ file name length restrictions, such as MS-DOS.
+
+ bzip2 and bunzip2 will by default not overwrite existing
+ files. If you want this to happen, specify the -f flag.
+
+ If no file names are specified, bzip2 compresses from
+ standard input to standard output. In this case, bzip2
+ will decline to write compressed output to a terminal, as
+ this would be entirely incomprehensible and therefore
+ pointless.
+
+ bunzip2 (or bzip2 -d) decompresses all specified files.
+ Files which were not created by bzip2 will be detected and
+ ignored, and a warning issued. bzip2 attempts to guess
+ the filename for the decompressed file from that of the
+ compressed file as follows:
+
+ filename.bz2 becomes filename
+ filename.bz becomes filename
+ filename.tbz2 becomes filename.tar
+ filename.tbz becomes filename.tar
+ anyothername becomes anyothername.out
+
+ If the file does not end in one of the recognised endings,
+ .bz2, .bz, .tbz2 or .tbz, bzip2 complains that it cannot
+ guess the name of the original file, and uses the original
+ name with .out appended.
+
+ As with compression, supplying no filenames causes decom­
+ pression from standard input to standard output.
+
+ bunzip2 will correctly decompress a file which is the con­
+ catenation of two or more compressed files. The result is
+ the concatenation of the corresponding uncompressed files.
+ Integrity testing (-t) of concatenated compressed files is
+ also supported.
+
+ You can also compress or decompress files to the standard
+ output by giving the -c flag. Multiple files may be com­
+ pressed and decompressed like this. The resulting outputs
+ are fed sequentially to stdout. Compression of multiple
+ files in this manner generates a stream containing multi­
+ ple compressed file representations. Such a stream can be
+ decompressed correctly only by bzip2 version 0.9.0 or
+ later. Earlier versions of bzip2 will stop after decom­
+ pressing the first file in the stream.
+
+ bzcat (or bzip2 -dc) decompresses all specified files to
+ the standard output.
+
+ bzip2 will read arguments from the environment variables
+ BZIP2 and BZIP, in that order, and will process them
+ before any arguments read from the command line. This
+ gives a convenient way to supply default arguments.
+
+ Compression is always performed, even if the compressed
+ file is slightly larger than the original. Files of less
+ than about one hundred bytes tend to get larger, since the
+ compression mechanism has a constant overhead in the
+ region of 50 bytes. Random data (including the output of
+ most file compressors) is coded at about 8.05 bits per
+ byte, giving an expansion of around 0.5%.
+
+ As a self-check for your protection, bzip2 uses 32-bit
+ CRCs to make sure that the decompressed version of a file
+ is identical to the original. This guards against corrup­
+ tion of the compressed data, and against undetected bugs
+ in bzip2 (hopefully very unlikely). The chances of data
+ corruption going undetected is microscopic, about one
+ chance in four billion for each file processed. Be aware,
+ though, that the check occurs upon decompression, so it
+ can only tell you that something is wrong. It can't help
+ you recover the original uncompressed data. You can use
+ bzip2recover to try to recover data from damaged files.
+
+ Return values: 0 for a normal exit, 1 for environmental
+ problems (file not found, invalid flags, I/O errors, &c),
+ 2 to indicate a corrupt compressed file, 3 for an internal
+ consistency error (eg, bug) which caused bzip2 to panic.
+
+
+OPTIONS
+ -c --stdout
+ Compress or decompress to standard output.
+
+ -d --decompress
+ Force decompression. bzip2, bunzip2 and bzcat are
+ really the same program, and the decision about
+ what actions to take is done on the basis of which
+ name is used. This flag overrides that mechanism,
+ and forces bzip2 to decompress.
+
+ -z --compress
+ The complement to -d: forces compression,
+ regardless of the invocation name.
+
+ -t --test
+ Check integrity of the specified file(s), but don't
+ decompress them. This really performs a trial
+ decompression and throws away the result.
+
+ -f --force
+ Force overwrite of output files. Normally, bzip2
+ will not overwrite existing output files. Also
+ forces bzip2 to break hard links to files, which it
+ otherwise wouldn't do.
+
+ bzip2 normally declines to decompress files which
+ don't have the correct magic header bytes. If
+ forced (-f), however, it will pass such files
+ through unmodified. This is how GNU gzip behaves.
+
+ -k --keep
+ Keep (don't delete) input files during compression
+ or decompression.
+
+ -s --small
+ Reduce memory usage, for compression, decompression
+ and testing. Files are decompressed and tested
+ using a modified algorithm which only requires 2.5
+ bytes per block byte. This means any file can be
+ decompressed in 2300k of memory, albeit at about
+ half the normal speed.
+
+ During compression, -s selects a block size of
+ 200k, which limits memory use to around the same
+ figure, at the expense of your compression ratio.
+ In short, if your machine is low on memory (8
+ megabytes or less), use -s for everything. See
+ MEMORY MANAGEMENT below.
+
+ -q --quiet
+ Suppress non-essential warning messages. Messages
+ pertaining to I/O errors and other critical events
+ will not be suppressed.
+
+ -v --verbose
+ Verbose mode -- show the compression ratio for each
+ file processed. Further -v's increase the ver­
+ bosity level, spewing out lots of information which
+ is primarily of interest for diagnostic purposes.
+
+ -L --license -V --version
+ Display the software version, license terms and
+ conditions.
+
+ -1 (or --fast) to -9 (or --best)
+ Set the block size to 100 k, 200 k .. 900 k when
+ compressing. Has no effect when decompressing.
+ See MEMORY MANAGEMENT below. The --fast and --best
+ aliases are primarily for GNU gzip compatibility.
+ In particular, --fast doesn't make things signifi­
+ cantly faster. And --best merely selects the
+ default behaviour.
+
+ -- Treats all subsequent arguments as file names, even
+ if they start with a dash. This is so you can han­
+ dle files with names beginning with a dash, for
+ example: bzip2 -- -myfilename.
+
+ --repetitive-fast --repetitive-best
+ These flags are redundant in versions 0.9.5 and
+ above. They provided some coarse control over the
+ behaviour of the sorting algorithm in earlier ver­
+ sions, which was sometimes useful. 0.9.5 and above
+ have an improved algorithm which renders these
+ flags irrelevant.
+
+
+MEMORY MANAGEMENT
+ bzip2 compresses large files in blocks. The block size
+ affects both the compression ratio achieved, and the
+ amount of memory needed for compression and decompression.
+ The flags -1 through -9 specify the block size to be
+ 100,000 bytes through 900,000 bytes (the default) respec­
+ tively. At decompression time, the block size used for
+ compression is read from the header of the compressed
+ file, and bunzip2 then allocates itself just enough memory
+ to decompress the file. Since block sizes are stored in
+ compressed files, it follows that the flags -1 to -9 are
+ irrelevant to and so ignored during decompression.
+
+ Compression and decompression requirements, in bytes, can
+ be estimated as:
+
+ Compression: 400k + ( 8 x block size )
+
+ Decompression: 100k + ( 4 x block size ), or
+ 100k + ( 2.5 x block size )
+
+ Larger block sizes give rapidly diminishing marginal
+ returns. Most of the compression comes from the first two
+ or three hundred k of block size, a fact worth bearing in
+ mind when using bzip2 on small machines. It is also
+ important to appreciate that the decompression memory
+ requirement is set at compression time by the choice of
+ block size.
+
+ For files compressed with the default 900k block size,
+ bunzip2 will require about 3700 kbytes to decompress. To
+ support decompression of any file on a 4 megabyte machine,
+ bunzip2 has an option to decompress using approximately
+ half this amount of memory, about 2300 kbytes. Decompres­
+ sion speed is also halved, so you should use this option
+ only where necessary. The relevant flag is -s.
+
+ In general, try and use the largest block size memory con­
+ straints allow, since that maximises the compression
+ achieved. Compression and decompression speed are virtu­
+ ally unaffected by block size.
+
+ Another significant point applies to files which fit in a
+ single block -- that means most files you'd encounter
+ using a large block size. The amount of real memory
+ touched is proportional to the size of the file, since the
+ file is smaller than a block. For example, compressing a
+ file 20,000 bytes long with the flag -9 will cause the
+ compressor to allocate around 7600k of memory, but only
+ touch 400k + 20000 * 8 = 560 kbytes of it. Similarly, the
+ decompressor will allocate 3700k but only touch 100k +
+ 20000 * 4 = 180 kbytes.
+
+ Here is a table which summarises the maximum memory usage
+ for different block sizes. Also recorded is the total
+ compressed size for 14 files of the Calgary Text Compres­
+ sion Corpus totalling 3,141,622 bytes. This column gives
+ some feel for how compression varies with block size.
+ These figures tend to understate the advantage of larger
+ block sizes for larger files, since the Corpus is domi­
+ nated by smaller files.
+
+ Compress Decompress Decompress Corpus
+ Flag usage usage -s usage Size
+
+ -1 1200k 500k 350k 914704
+ -2 2000k 900k 600k 877703
+ -3 2800k 1300k 850k 860338
+ -4 3600k 1700k 1100k 846899
+ -5 4400k 2100k 1350k 845160
+ -6 5200k 2500k 1600k 838626
+ -7 6100k 2900k 1850k 834096
+ -8 6800k 3300k 2100k 828642
+ -9 7600k 3700k 2350k 828642
+
+
+RECOVERING DATA FROM DAMAGED FILES
+ bzip2 compresses files in blocks, usually 900kbytes long.
+ Each block is handled independently. If a media or trans­
+ mission error causes a multi-block .bz2 file to become
+ damaged, it may be possible to recover data from the
+ undamaged blocks in the file.
+
+ The compressed representation of each block is delimited
+ by a 48-bit pattern, which makes it possible to find the
+ block boundaries with reasonable certainty. Each block
+ also carries its own 32-bit CRC, so damaged blocks can be
+ distinguished from undamaged ones.
+
+ bzip2recover is a simple program whose purpose is to
+ search for blocks in .bz2 files, and write each block out
+ into its own .bz2 file. You can then use bzip2 -t to test
+ the integrity of the resulting files, and decompress those
+ which are undamaged.
+
+ bzip2recover takes a single argument, the name of the dam­
+ aged file, and writes a number of files
+ "rec00001file.bz2", "rec00002file.bz2", etc, containing
+ the extracted blocks. The output filenames are
+ designed so that the use of wildcards in subsequent pro­
+ cessing -- for example, "bzip2 -dc rec*file.bz2 > recov­
+ ered_data" -- processes the files in the correct order.
+
+ bzip2recover should be of most use dealing with large .bz2
+ files, as these will contain many blocks. It is clearly
+ futile to use it on damaged single-block files, since a
+ damaged block cannot be recovered. If you wish to min­
+ imise any potential data loss through media or transmis­
+ sion errors, you might consider compressing with a smaller
+ block size.
+
+
+PERFORMANCE NOTES
+ The sorting phase of compression gathers together similar
+ strings in the file. Because of this, files containing
+ very long runs of repeated symbols, like "aabaabaabaab
+ ..." (repeated several hundred times) may compress more
+ slowly than normal. Versions 0.9.5 and above fare much
+ better than previous versions in this respect. The ratio
+ between worst-case and average-case compression time is in
+ the region of 10:1. For previous versions, this figure
+ was more like 100:1. You can use the -vvvv option to mon­
+ itor progress in great detail, if you want.
+
+ Decompression speed is unaffected by these phenomena.
+
+ bzip2 usually allocates several megabytes of memory to
+ operate in, and then charges all over it in a fairly ran­
+ dom fashion. This means that performance, both for com­
+ pressing and decompressing, is largely determined by the
+ speed at which your machine can service cache misses.
+ Because of this, small changes to the code to reduce the
+ miss rate have been observed to give disproportionately
+ large performance improvements. I imagine bzip2 will per­
+ form best on machines with very large caches.
+
+
+CAVEATS
+ I/O error messages are not as helpful as they could be.
+ bzip2 tries hard to detect I/O errors and exit cleanly,
+ but the details of what the problem is sometimes seem
+ rather misleading.
+
+ This manual page pertains to version 1.0.2 of bzip2. Com­
+ pressed data created by this version is entirely forwards
+ and backwards compatible with the previous public
+ releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0 and 1.0.1,
+ but with the following exception: 0.9.0 and above can cor­
+ rectly decompress multiple concatenated compressed files.
+ 0.1pl2 cannot do this; it will stop after decompressing
+ just the first file in the stream.
+
+ bzip2recover versions prior to this one, 1.0.2, used
+ 32-bit integers to represent bit positions in compressed
+ files, so it could not handle compressed files more than
+ 512 megabytes long. Version 1.0.2 and above uses 64-bit
+ ints on some platforms which support them (GNU supported
+ targets, and Windows). To establish whether or not
+ bzip2recover was built with such a limitation, run it
+ without arguments. In any event you can build yourself an
+ unlimited version if you can recompile it with MaybeUInt64
+ set to be an unsigned 64-bit integer.
+
+
+AUTHOR
+ Julian Seward, jseward@acm.org.
+
+ http://sources.redhat.com/bzip2
+
+ The ideas embodied in bzip2 are due to (at least) the fol­
+ lowing people: Michael Burrows and David Wheeler (for the
+ block sorting transformation), David Wheeler (again, for
+ the Huffman coder), Peter Fenwick (for the structured cod­
+ ing model in the original bzip, and many refinements), and
+ Alistair Moffat, Radford Neal and Ian Witten (for the
+ arithmetic coder in the original bzip). I am much
+ indebted for their help, support and advice. See the man­
+ ual in the source distribution for pointers to sources of
+ documentation. Christian von Roques encouraged me to look
+ for faster sorting algorithms, so as to speed up compres­
+ sion. Bela Lubkin encouraged me to improve the worst-case
+ compression performance. The bz* scripts are derived from
+ those of GNU gzip. Many people sent patches, helped with
+ portability problems, lent machines, gave advice and were
+ generally helpful.
+
diff --git a/Build/source/utils/bzip2/bzip2recover.c b/Build/source/utils/bzip2/bzip2recover.c
new file mode 100644
index 00000000000..286873b8c07
--- /dev/null
+++ b/Build/source/utils/bzip2/bzip2recover.c
@@ -0,0 +1,546 @@
+
+/*-----------------------------------------------------------*/
+/*--- Block recoverer program for bzip2 ---*/
+/*--- bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
+
+/*--
+ This program is bzip2recover, a program to attempt data
+ salvage from damaged files created by the accompanying
+ bzip2-1.0 program.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+--*/
+
+/*--
+ This program is a complete hack and should be rewritten
+ properly. It isn't very complicated.
+--*/
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* This program records bit locations in the file to be recovered.
+ That means that if 64-bit ints are not supported, we will not
+ be able to recover .bz2 files over 512MB (2^32 bits) long.
+ On GNU supported platforms, we take advantage of the 64-bit
+ int support to circumvent this problem. Ditto MSVC.
+
+ This change occurred in version 1.0.2; all prior versions have
+ the 512MB limitation.
+*/
+#ifdef __GNUC__
+ typedef unsigned long long int MaybeUInt64;
+# define MaybeUInt64_FMT "%Lu"
+#else
+#ifdef _MSC_VER
+ typedef unsigned __int64 MaybeUInt64;
+# define MaybeUInt64_FMT "%I64u"
+#else
+ typedef unsigned int MaybeUInt64;
+# define MaybeUInt64_FMT "%u"
+#endif
+#endif
+
+typedef unsigned int UInt32;
+typedef int Int32;
+typedef unsigned char UChar;
+typedef char Char;
+typedef unsigned char Bool;
+#define True ((Bool)1)
+#define False ((Bool)0)
+
+
+#define BZ_MAX_FILENAME 2000
+
+Char inFileName[BZ_MAX_FILENAME];
+Char outFileName[BZ_MAX_FILENAME];
+Char progName[BZ_MAX_FILENAME];
+
+MaybeUInt64 bytesOut = 0;
+MaybeUInt64 bytesIn = 0;
+
+
+/*---------------------------------------------------*/
+/*--- Header bytes ---*/
+/*---------------------------------------------------*/
+
+#define BZ_HDR_B 0x42 /* 'B' */
+#define BZ_HDR_Z 0x5a /* 'Z' */
+#define BZ_HDR_h 0x68 /* 'h' */
+#define BZ_HDR_0 0x30 /* '0' */
+
+
+/*---------------------------------------------------*/
+/*--- I/O errors ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+void readError ( void )
+{
+ fprintf ( stderr,
+ "%s: I/O error reading `%s', possible reason follows.\n",
+ progName, inFileName );
+ perror ( progName );
+ fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+ progName );
+ exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+void writeError ( void )
+{
+ fprintf ( stderr,
+ "%s: I/O error reading `%s', possible reason follows.\n",
+ progName, inFileName );
+ perror ( progName );
+ fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+ progName );
+ exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+void mallocFail ( Int32 n )
+{
+ fprintf ( stderr,
+ "%s: malloc failed on request for %d bytes.\n",
+ progName, n );
+ fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+ progName );
+ exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+void tooManyBlocks ( Int32 max_handled_blocks )
+{
+ fprintf ( stderr,
+ "%s: `%s' appears to contain more than %d blocks\n",
+ progName, inFileName, max_handled_blocks );
+ fprintf ( stderr,
+ "%s: and cannot be handled. To fix, increase\n",
+ progName );
+ fprintf ( stderr,
+ "%s: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.\n",
+ progName );
+ exit ( 1 );
+}
+
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O ---*/
+/*---------------------------------------------------*/
+
+typedef
+ struct {
+ FILE* handle;
+ Int32 buffer;
+ Int32 buffLive;
+ Char mode;
+ }
+ BitStream;
+
+
+/*---------------------------------------------*/
+BitStream* bsOpenReadStream ( FILE* stream )
+{
+ BitStream *bs = malloc ( sizeof(BitStream) );
+ if (bs == NULL) mallocFail ( sizeof(BitStream) );
+ bs->handle = stream;
+ bs->buffer = 0;
+ bs->buffLive = 0;
+ bs->mode = 'r';
+ return bs;
+}
+
+
+/*---------------------------------------------*/
+BitStream* bsOpenWriteStream ( FILE* stream )
+{
+ BitStream *bs = malloc ( sizeof(BitStream) );
+ if (bs == NULL) mallocFail ( sizeof(BitStream) );
+ bs->handle = stream;
+ bs->buffer = 0;
+ bs->buffLive = 0;
+ bs->mode = 'w';
+ return bs;
+}
+
+
+/*---------------------------------------------*/
+void bsPutBit ( BitStream* bs, Int32 bit )
+{
+ if (bs->buffLive == 8) {
+ Int32 retVal = putc ( (UChar) bs->buffer, bs->handle );
+ if (retVal == EOF) writeError();
+ bytesOut++;
+ bs->buffLive = 1;
+ bs->buffer = bit & 0x1;
+ } else {
+ bs->buffer = ( (bs->buffer << 1) | (bit & 0x1) );
+ bs->buffLive++;
+ };
+}
+
+
+/*---------------------------------------------*/
+/*--
+ Returns 0 or 1, or 2 to indicate EOF.
+--*/
+Int32 bsGetBit ( BitStream* bs )
+{
+ if (bs->buffLive > 0) {
+ bs->buffLive --;
+ return ( ((bs->buffer) >> (bs->buffLive)) & 0x1 );
+ } else {
+ Int32 retVal = getc ( bs->handle );
+ if ( retVal == EOF ) {
+ if (errno != 0) readError();
+ return 2;
+ }
+ bs->buffLive = 7;
+ bs->buffer = retVal;
+ return ( ((bs->buffer) >> 7) & 0x1 );
+ }
+}
+
+
+/*---------------------------------------------*/
+void bsClose ( BitStream* bs )
+{
+ Int32 retVal;
+
+ if ( bs->mode == 'w' ) {
+ while ( bs->buffLive < 8 ) {
+ bs->buffLive++;
+ bs->buffer <<= 1;
+ };
+ retVal = putc ( (UChar) (bs->buffer), bs->handle );
+ if (retVal == EOF) writeError();
+ bytesOut++;
+ retVal = fflush ( bs->handle );
+ if (retVal == EOF) writeError();
+ }
+ retVal = fclose ( bs->handle );
+ if (retVal == EOF) {
+ if (bs->mode == 'w') writeError(); else readError();
+ }
+ free ( bs );
+}
+
+
+/*---------------------------------------------*/
+void bsPutUChar ( BitStream* bs, UChar c )
+{
+ Int32 i;
+ for (i = 7; i >= 0; i--)
+ bsPutBit ( bs, (((UInt32) c) >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+void bsPutUInt32 ( BitStream* bs, UInt32 c )
+{
+ Int32 i;
+
+ for (i = 31; i >= 0; i--)
+ bsPutBit ( bs, (c >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+Bool endsInBz2 ( Char* name )
+{
+ Int32 n = strlen ( name );
+ if (n <= 4) return False;
+ return
+ (name[n-4] == '.' &&
+ name[n-3] == 'b' &&
+ name[n-2] == 'z' &&
+ name[n-1] == '2');
+}
+
+
+/*---------------------------------------------------*/
+/*--- ---*/
+/*---------------------------------------------------*/
+
+/* This logic isn't really right when it comes to Cygwin. */
+#ifdef _WIN32
+# define BZ_SPLIT_SYM '\\' /* path splitter on Windows platform */
+#else
+# define BZ_SPLIT_SYM '/' /* path splitter on Unix platform */
+#endif
+
+#define BLOCK_HEADER_HI 0x00003141UL
+#define BLOCK_HEADER_LO 0x59265359UL
+
+#define BLOCK_ENDMARK_HI 0x00001772UL
+#define BLOCK_ENDMARK_LO 0x45385090UL
+
+/* Increase if necessary. However, a .bz2 file with > 50000 blocks
+ would have an uncompressed size of at least 40GB, so the chances
+ are low you'll need to up this.
+*/
+#define BZ_MAX_HANDLED_BLOCKS 50000
+
+MaybeUInt64 bStart [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 bEnd [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbStart[BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbEnd [BZ_MAX_HANDLED_BLOCKS];
+
+Int32 main ( Int32 argc, Char** argv )
+{
+ FILE* inFile;
+ FILE* outFile;
+ BitStream* bsIn, *bsWr;
+ Int32 b, wrBlock, currBlock, rbCtr;
+ MaybeUInt64 bitsRead;
+
+ UInt32 buffHi, buffLo, blockCRC;
+ Char* p;
+
+ strcpy ( progName, argv[0] );
+ inFileName[0] = outFileName[0] = 0;
+
+ fprintf ( stderr,
+ "bzip2recover 1.0.2: extracts blocks from damaged .bz2 files.\n" );
+
+ if (argc != 2) {
+ fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
+ progName, progName );
+ switch (sizeof(MaybeUInt64)) {
+ case 8:
+ fprintf(stderr,
+ "\trestrictions on size of recovered file: None\n");
+ break;
+ case 4:
+ fprintf(stderr,
+ "\trestrictions on size of recovered file: 512 MB\n");
+ fprintf(stderr,
+ "\tto circumvent, recompile with MaybeUInt64 as an\n"
+ "\tunsigned 64-bit int.\n");
+ break;
+ default:
+ fprintf(stderr,
+ "\tsizeof(MaybeUInt64) is not 4 or 8 -- "
+ "configuration error.\n");
+ break;
+ }
+ exit(1);
+ }
+
+ if (strlen(argv[1]) >= BZ_MAX_FILENAME-20) {
+ fprintf ( stderr,
+ "%s: supplied filename is suspiciously (>= %d chars) long. Bye!\n",
+ progName, strlen(argv[1]) );
+ exit(1);
+ }
+
+ strcpy ( inFileName, argv[1] );
+
+ inFile = fopen ( inFileName, "rb" );
+ if (inFile == NULL) {
+ fprintf ( stderr, "%s: can't read `%s'\n", progName, inFileName );
+ exit(1);
+ }
+
+ bsIn = bsOpenReadStream ( inFile );
+ fprintf ( stderr, "%s: searching for block boundaries ...\n", progName );
+
+ bitsRead = 0;
+ buffHi = buffLo = 0;
+ currBlock = 0;
+ bStart[currBlock] = 0;
+
+ rbCtr = 0;
+
+ while (True) {
+ b = bsGetBit ( bsIn );
+ bitsRead++;
+ if (b == 2) {
+ if (bitsRead >= bStart[currBlock] &&
+ (bitsRead - bStart[currBlock]) >= 40) {
+ bEnd[currBlock] = bitsRead-1;
+ if (currBlock > 0)
+ fprintf ( stderr, " block %d runs from " MaybeUInt64_FMT
+ " to " MaybeUInt64_FMT " (incomplete)\n",
+ currBlock, bStart[currBlock], bEnd[currBlock] );
+ } else
+ currBlock--;
+ break;
+ }
+ buffHi = (buffHi << 1) | (buffLo >> 31);
+ buffLo = (buffLo << 1) | (b & 1);
+ if ( ( (buffHi & 0x0000ffff) == BLOCK_HEADER_HI
+ && buffLo == BLOCK_HEADER_LO)
+ ||
+ ( (buffHi & 0x0000ffff) == BLOCK_ENDMARK_HI
+ && buffLo == BLOCK_ENDMARK_LO)
+ ) {
+ if (bitsRead > 49) {
+ bEnd[currBlock] = bitsRead-49;
+ } else {
+ bEnd[currBlock] = 0;
+ }
+ if (currBlock > 0 &&
+ (bEnd[currBlock] - bStart[currBlock]) >= 130) {
+ fprintf ( stderr, " block %d runs from " MaybeUInt64_FMT
+ " to " MaybeUInt64_FMT "\n",
+ rbCtr+1, bStart[currBlock], bEnd[currBlock] );
+ rbStart[rbCtr] = bStart[currBlock];
+ rbEnd[rbCtr] = bEnd[currBlock];
+ rbCtr++;
+ }
+ if (currBlock >= BZ_MAX_HANDLED_BLOCKS)
+ tooManyBlocks(BZ_MAX_HANDLED_BLOCKS);
+ currBlock++;
+
+ bStart[currBlock] = bitsRead;
+ }
+ }
+
+ bsClose ( bsIn );
+
+ /*-- identified blocks run from 1 to rbCtr inclusive. --*/
+
+ if (rbCtr < 1) {
+ fprintf ( stderr,
+ "%s: sorry, I couldn't find any block boundaries.\n",
+ progName );
+ exit(1);
+ };
+
+ fprintf ( stderr, "%s: splitting into blocks\n", progName );
+
+ inFile = fopen ( inFileName, "rb" );
+ if (inFile == NULL) {
+ fprintf ( stderr, "%s: can't open `%s'\n", progName, inFileName );
+ exit(1);
+ }
+ bsIn = bsOpenReadStream ( inFile );
+
+ /*-- placate gcc's dataflow analyser --*/
+ blockCRC = 0; bsWr = 0;
+
+ bitsRead = 0;
+ outFile = NULL;
+ wrBlock = 0;
+ while (True) {
+ b = bsGetBit(bsIn);
+ if (b == 2) break;
+ buffHi = (buffHi << 1) | (buffLo >> 31);
+ buffLo = (buffLo << 1) | (b & 1);
+ if (bitsRead == 47+rbStart[wrBlock])
+ blockCRC = (buffHi << 16) | (buffLo >> 16);
+
+ if (outFile != NULL && bitsRead >= rbStart[wrBlock]
+ && bitsRead <= rbEnd[wrBlock]) {
+ bsPutBit ( bsWr, b );
+ }
+
+ bitsRead++;
+
+ if (bitsRead == rbEnd[wrBlock]+1) {
+ if (outFile != NULL) {
+ bsPutUChar ( bsWr, 0x17 ); bsPutUChar ( bsWr, 0x72 );
+ bsPutUChar ( bsWr, 0x45 ); bsPutUChar ( bsWr, 0x38 );
+ bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
+ bsPutUInt32 ( bsWr, blockCRC );
+ bsClose ( bsWr );
+ }
+ if (wrBlock >= rbCtr) break;
+ wrBlock++;
+ } else
+ if (bitsRead == rbStart[wrBlock]) {
+ /* Create the output file name, correctly handling leading paths.
+ (31.10.2001 by Sergey E. Kusikov) */
+ Char* split;
+ Int32 ofs, k;
+ for (k = 0; k < BZ_MAX_FILENAME; k++)
+ outFileName[k] = 0;
+ strcpy (outFileName, inFileName);
+ split = strrchr (outFileName, BZ_SPLIT_SYM);
+ if (split == NULL) {
+ split = outFileName;
+ } else {
+ ++split;
+ }
+ /* Now split points to the start of the basename. */
+ ofs = split - outFileName;
+ sprintf (split, "rec%5d", wrBlock+1);
+ for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
+ strcat (outFileName, inFileName + ofs);
+
+ if ( !endsInBz2(outFileName)) strcat ( outFileName, ".bz2" );
+
+ fprintf ( stderr, " writing block %d to `%s' ...\n",
+ wrBlock+1, outFileName );
+
+ outFile = fopen ( outFileName, "wb" );
+ if (outFile == NULL) {
+ fprintf ( stderr, "%s: can't write `%s'\n",
+ progName, outFileName );
+ exit(1);
+ }
+ bsWr = bsOpenWriteStream ( outFile );
+ bsPutUChar ( bsWr, BZ_HDR_B );
+ bsPutUChar ( bsWr, BZ_HDR_Z );
+ bsPutUChar ( bsWr, BZ_HDR_h );
+ bsPutUChar ( bsWr, BZ_HDR_0 + 9 );
+ bsPutUChar ( bsWr, 0x31 ); bsPutUChar ( bsWr, 0x41 );
+ bsPutUChar ( bsWr, 0x59 ); bsPutUChar ( bsWr, 0x26 );
+ bsPutUChar ( bsWr, 0x53 ); bsPutUChar ( bsWr, 0x59 );
+ }
+ }
+
+ fprintf ( stderr, "%s: finished\n", progName );
+ return 0;
+}
+
+
+
+/*-----------------------------------------------------------*/
+/*--- end bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/bzlib.c b/Build/source/utils/bzip2/bzlib.c
new file mode 100644
index 00000000000..e0ff51f8f0a
--- /dev/null
+++ b/Build/source/utils/bzip2/bzlib.c
@@ -0,0 +1,1594 @@
+
+/*-------------------------------------------------------------*/
+/*--- Library top-level functions. ---*/
+/*--- bzlib.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+/*--
+ CHANGES
+ ~~~~~~~
+ 0.9.0 -- original version.
+
+ 0.9.0a/b -- no changes in this file.
+
+ 0.9.0c
+ * made zero-length BZ_FLUSH work correctly in bzCompress().
+ * fixed bzWrite/bzRead to ignore zero-length requests.
+ * fixed bzread to correctly handle read requests after EOF.
+ * wrong parameter order in call to bzDecompressInit in
+ bzBuffToBuffDecompress. Fixed.
+--*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Compression stuff ---*/
+/*---------------------------------------------------*/
+
+
+/*---------------------------------------------------*/
+#ifndef BZ_NO_STDIO
+void BZ2_bz__AssertH__fail ( int errcode )
+{
+ fprintf(stderr,
+ "\n\nbzip2/libbzip2: internal error number %d.\n"
+ "This is a bug in bzip2/libbzip2, %s.\n"
+ "Please report it to me at: jseward@acm.org. If this happened\n"
+ "when you were using some program which uses libbzip2 as a\n"
+ "component, you should also report this bug to the author(s)\n"
+ "of that program. Please make an effort to report this bug;\n"
+ "timely and accurate bug reports eventually lead to higher\n"
+ "quality software. Thanks. Julian Seward, 30 December 2001.\n\n",
+ errcode,
+ BZ2_bzlibVersion()
+ );
+
+ if (errcode == 1007) {
+ fprintf(stderr,
+ "\n*** A special note about internal error number 1007 ***\n"
+ "\n"
+ "Experience suggests that a common cause of i.e. 1007\n"
+ "is unreliable memory or other hardware. The 1007 assertion\n"
+ "just happens to cross-check the results of huge numbers of\n"
+ "memory reads/writes, and so acts (unintendedly) as a stress\n"
+ "test of your memory system.\n"
+ "\n"
+ "I suggest the following: try compressing the file again,\n"
+ "possibly monitoring progress in detail with the -vv flag.\n"
+ "\n"
+ "* If the error cannot be reproduced, and/or happens at different\n"
+ " points in compression, you may have a flaky memory system.\n"
+ " Try a memory-test program. I have used Memtest86\n"
+ " (www.memtest86.com). At the time of writing it is free (GPLd).\n"
+ " Memtest86 tests memory much more thorougly than your BIOSs\n"
+ " power-on test, and may find failures that the BIOS doesn't.\n"
+ "\n"
+ "* If the error can be repeatably reproduced, this is a bug in\n"
+ " bzip2, and I would very much like to hear about it. Please\n"
+ " let me know, and, ideally, save a copy of the file causing the\n"
+ " problem -- without which I will be unable to investigate it.\n"
+ "\n"
+ );
+ }
+
+ exit(3);
+}
+#endif
+
+
+/*---------------------------------------------------*/
+static
+int bz_config_ok ( void )
+{
+ if (sizeof(int) != 4) return 0;
+ if (sizeof(short) != 2) return 0;
+ if (sizeof(char) != 1) return 0;
+ return 1;
+}
+
+
+/*---------------------------------------------------*/
+static
+void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
+{
+ void* v = malloc ( items * size );
+ return v;
+}
+
+static
+void default_bzfree ( void* opaque, void* addr )
+{
+ if (addr != NULL) free ( addr );
+}
+
+
+/*---------------------------------------------------*/
+static
+void prepare_new_block ( EState* s )
+{
+ Int32 i;
+ s->nblock = 0;
+ s->numZ = 0;
+ s->state_out_pos = 0;
+ BZ_INITIALISE_CRC ( s->blockCRC );
+ for (i = 0; i < 256; i++) s->inUse[i] = False;
+ s->blockNo++;
+}
+
+
+/*---------------------------------------------------*/
+static
+void init_RL ( EState* s )
+{
+ s->state_in_ch = 256;
+ s->state_in_len = 0;
+}
+
+
+static
+Bool isempty_RL ( EState* s )
+{
+ if (s->state_in_ch < 256 && s->state_in_len > 0)
+ return False; else
+ return True;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressInit)
+ ( bz_stream* strm,
+ int blockSize100k,
+ int verbosity,
+ int workFactor )
+{
+ Int32 n;
+ EState* s;
+
+ if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+ if (strm == NULL ||
+ blockSize100k < 1 || blockSize100k > 9 ||
+ workFactor < 0 || workFactor > 250)
+ return BZ_PARAM_ERROR;
+
+ if (workFactor == 0) workFactor = 30;
+ if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+ if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+ s = BZALLOC( sizeof(EState) );
+ if (s == NULL) return BZ_MEM_ERROR;
+ s->strm = strm;
+
+ s->arr1 = NULL;
+ s->arr2 = NULL;
+ s->ftab = NULL;
+
+ n = 100000 * blockSize100k;
+ s->arr1 = BZALLOC( n * sizeof(UInt32) );
+ s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
+ s->ftab = BZALLOC( 65537 * sizeof(UInt32) );
+
+ if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
+ if (s->arr1 != NULL) BZFREE(s->arr1);
+ if (s->arr2 != NULL) BZFREE(s->arr2);
+ if (s->ftab != NULL) BZFREE(s->ftab);
+ if (s != NULL) BZFREE(s);
+ return BZ_MEM_ERROR;
+ }
+
+ s->blockNo = 0;
+ s->state = BZ_S_INPUT;
+ s->mode = BZ_M_RUNNING;
+ s->combinedCRC = 0;
+ s->blockSize100k = blockSize100k;
+ s->nblockMAX = 100000 * blockSize100k - 19;
+ s->verbosity = verbosity;
+ s->workFactor = workFactor;
+
+ s->block = (UChar*)s->arr2;
+ s->mtfv = (UInt16*)s->arr1;
+ s->zbits = NULL;
+ s->ptr = (UInt32*)s->arr1;
+
+ strm->state = s;
+ strm->total_in_lo32 = 0;
+ strm->total_in_hi32 = 0;
+ strm->total_out_lo32 = 0;
+ strm->total_out_hi32 = 0;
+ init_RL ( s );
+ prepare_new_block ( s );
+ return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+static
+void add_pair_to_block ( EState* s )
+{
+ Int32 i;
+ UChar ch = (UChar)(s->state_in_ch);
+ for (i = 0; i < s->state_in_len; i++) {
+ BZ_UPDATE_CRC( s->blockCRC, ch );
+ }
+ s->inUse[s->state_in_ch] = True;
+ switch (s->state_in_len) {
+ case 1:
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ break;
+ case 2:
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ break;
+ case 3:
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ break;
+ default:
+ s->inUse[s->state_in_len-4] = True;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = (UChar)ch; s->nblock++;
+ s->block[s->nblock] = ((UChar)(s->state_in_len-4));
+ s->nblock++;
+ break;
+ }
+}
+
+
+/*---------------------------------------------------*/
+static
+void flush_RL ( EState* s )
+{
+ if (s->state_in_ch < 256) add_pair_to_block ( s );
+ init_RL ( s );
+}
+
+
+/*---------------------------------------------------*/
+#define ADD_CHAR_TO_BLOCK(zs,zchh0) \
+{ \
+ UInt32 zchh = (UInt32)(zchh0); \
+ /*-- fast track the common case --*/ \
+ if (zchh != zs->state_in_ch && \
+ zs->state_in_len == 1) { \
+ UChar ch = (UChar)(zs->state_in_ch); \
+ BZ_UPDATE_CRC( zs->blockCRC, ch ); \
+ zs->inUse[zs->state_in_ch] = True; \
+ zs->block[zs->nblock] = (UChar)ch; \
+ zs->nblock++; \
+ zs->state_in_ch = zchh; \
+ } \
+ else \
+ /*-- general, uncommon cases --*/ \
+ if (zchh != zs->state_in_ch || \
+ zs->state_in_len == 255) { \
+ if (zs->state_in_ch < 256) \
+ add_pair_to_block ( zs ); \
+ zs->state_in_ch = zchh; \
+ zs->state_in_len = 1; \
+ } else { \
+ zs->state_in_len++; \
+ } \
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_input_until_stop ( EState* s )
+{
+ Bool progress_in = False;
+
+ if (s->mode == BZ_M_RUNNING) {
+
+ /*-- fast track the common case --*/
+ while (True) {
+ /*-- block full? --*/
+ if (s->nblock >= s->nblockMAX) break;
+ /*-- no input? --*/
+ if (s->strm->avail_in == 0) break;
+ progress_in = True;
+ ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) );
+ s->strm->next_in++;
+ s->strm->avail_in--;
+ s->strm->total_in_lo32++;
+ if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+ }
+
+ } else {
+
+ /*-- general, uncommon case --*/
+ while (True) {
+ /*-- block full? --*/
+ if (s->nblock >= s->nblockMAX) break;
+ /*-- no input? --*/
+ if (s->strm->avail_in == 0) break;
+ /*-- flush/finish end? --*/
+ if (s->avail_in_expect == 0) break;
+ progress_in = True;
+ ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) );
+ s->strm->next_in++;
+ s->strm->avail_in--;
+ s->strm->total_in_lo32++;
+ if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+ s->avail_in_expect--;
+ }
+ }
+ return progress_in;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_output_until_stop ( EState* s )
+{
+ Bool progress_out = False;
+
+ while (True) {
+
+ /*-- no output space? --*/
+ if (s->strm->avail_out == 0) break;
+
+ /*-- block done? --*/
+ if (s->state_out_pos >= s->numZ) break;
+
+ progress_out = True;
+ *(s->strm->next_out) = s->zbits[s->state_out_pos];
+ s->state_out_pos++;
+ s->strm->avail_out--;
+ s->strm->next_out++;
+ s->strm->total_out_lo32++;
+ if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+ }
+
+ return progress_out;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool handle_compress ( bz_stream* strm )
+{
+ Bool progress_in = False;
+ Bool progress_out = False;
+ EState* s = strm->state;
+
+ while (True) {
+
+ if (s->state == BZ_S_OUTPUT) {
+ progress_out |= copy_output_until_stop ( s );
+ if (s->state_out_pos < s->numZ) break;
+ if (s->mode == BZ_M_FINISHING &&
+ s->avail_in_expect == 0 &&
+ isempty_RL(s)) break;
+ prepare_new_block ( s );
+ s->state = BZ_S_INPUT;
+ if (s->mode == BZ_M_FLUSHING &&
+ s->avail_in_expect == 0 &&
+ isempty_RL(s)) break;
+ }
+
+ if (s->state == BZ_S_INPUT) {
+ progress_in |= copy_input_until_stop ( s );
+ if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
+ flush_RL ( s );
+ BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
+ s->state = BZ_S_OUTPUT;
+ }
+ else
+ if (s->nblock >= s->nblockMAX) {
+ BZ2_compressBlock ( s, False );
+ s->state = BZ_S_OUTPUT;
+ }
+ else
+ if (s->strm->avail_in == 0) {
+ break;
+ }
+ }
+
+ }
+
+ return progress_in || progress_out;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
+{
+ Bool progress;
+ EState* s;
+ if (strm == NULL) return BZ_PARAM_ERROR;
+ s = strm->state;
+ if (s == NULL) return BZ_PARAM_ERROR;
+ if (s->strm != strm) return BZ_PARAM_ERROR;
+
+ preswitch:
+ switch (s->mode) {
+
+ case BZ_M_IDLE:
+ return BZ_SEQUENCE_ERROR;
+
+ case BZ_M_RUNNING:
+ if (action == BZ_RUN) {
+ progress = handle_compress ( strm );
+ return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
+ }
+ else
+ if (action == BZ_FLUSH) {
+ s->avail_in_expect = strm->avail_in;
+ s->mode = BZ_M_FLUSHING;
+ goto preswitch;
+ }
+ else
+ if (action == BZ_FINISH) {
+ s->avail_in_expect = strm->avail_in;
+ s->mode = BZ_M_FINISHING;
+ goto preswitch;
+ }
+ else
+ return BZ_PARAM_ERROR;
+
+ case BZ_M_FLUSHING:
+ if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
+ if (s->avail_in_expect != s->strm->avail_in)
+ return BZ_SEQUENCE_ERROR;
+ progress = handle_compress ( strm );
+ if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+ s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
+ s->mode = BZ_M_RUNNING;
+ return BZ_RUN_OK;
+
+ case BZ_M_FINISHING:
+ if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
+ if (s->avail_in_expect != s->strm->avail_in)
+ return BZ_SEQUENCE_ERROR;
+ progress = handle_compress ( strm );
+ if (!progress) return BZ_SEQUENCE_ERROR;
+ if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+ s->state_out_pos < s->numZ) return BZ_FINISH_OK;
+ s->mode = BZ_M_IDLE;
+ return BZ_STREAM_END;
+ }
+ return BZ_OK; /*--not reached--*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm )
+{
+ EState* s;
+ if (strm == NULL) return BZ_PARAM_ERROR;
+ s = strm->state;
+ if (s == NULL) return BZ_PARAM_ERROR;
+ if (s->strm != strm) return BZ_PARAM_ERROR;
+
+ if (s->arr1 != NULL) BZFREE(s->arr1);
+ if (s->arr2 != NULL) BZFREE(s->arr2);
+ if (s->ftab != NULL) BZFREE(s->ftab);
+ BZFREE(strm->state);
+
+ strm->state = NULL;
+
+ return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/*--- Decompression stuff ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressInit)
+ ( bz_stream* strm,
+ int verbosity,
+ int small )
+{
+ DState* s;
+
+ if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+ if (strm == NULL) return BZ_PARAM_ERROR;
+ if (small != 0 && small != 1) return BZ_PARAM_ERROR;
+ if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
+
+ if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+ if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+ s = BZALLOC( sizeof(DState) );
+ if (s == NULL) return BZ_MEM_ERROR;
+ s->strm = strm;
+ strm->state = s;
+ s->state = BZ_X_MAGIC_1;
+ s->bsLive = 0;
+ s->bsBuff = 0;
+ s->calculatedCombinedCRC = 0;
+ strm->total_in_lo32 = 0;
+ strm->total_in_hi32 = 0;
+ strm->total_out_lo32 = 0;
+ strm->total_out_hi32 = 0;
+ s->smallDecompress = (Bool)small;
+ s->ll4 = NULL;
+ s->ll16 = NULL;
+ s->tt = NULL;
+ s->currBlockNo = 0;
+ s->verbosity = verbosity;
+
+ return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+static
+void unRLE_obuf_to_output_FAST ( DState* s )
+{
+ UChar k1;
+
+ if (s->blockRandomised) {
+
+ while (True) {
+ /* try to finish existing run */
+ while (True) {
+ if (s->strm->avail_out == 0) return;
+ if (s->state_out_len == 0) break;
+ *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+ BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+ s->state_out_len--;
+ s->strm->next_out++;
+ s->strm->avail_out--;
+ s->strm->total_out_lo32++;
+ if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+ }
+
+ /* can a new run be started? */
+ if (s->nblock_used == s->save_nblock+1) return;
+
+
+ s->state_out_len = 1;
+ s->state_out_ch = s->k0;
+ BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ s->state_out_len = 2;
+ BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ s->state_out_len = 3;
+ BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ s->state_out_len = ((Int32)k1) + 4;
+ BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK;
+ s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+ }
+
+ } else {
+
+ /* restore */
+ UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC;
+ UChar c_state_out_ch = s->state_out_ch;
+ Int32 c_state_out_len = s->state_out_len;
+ Int32 c_nblock_used = s->nblock_used;
+ Int32 c_k0 = s->k0;
+ UInt32* c_tt = s->tt;
+ UInt32 c_tPos = s->tPos;
+ char* cs_next_out = s->strm->next_out;
+ unsigned int cs_avail_out = s->strm->avail_out;
+ /* end restore */
+
+ UInt32 avail_out_INIT = cs_avail_out;
+ Int32 s_save_nblockPP = s->save_nblock+1;
+ unsigned int total_out_lo32_old;
+
+ while (True) {
+
+ /* try to finish existing run */
+ if (c_state_out_len > 0) {
+ while (True) {
+ if (cs_avail_out == 0) goto return_notr;
+ if (c_state_out_len == 1) break;
+ *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+ BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+ c_state_out_len--;
+ cs_next_out++;
+ cs_avail_out--;
+ }
+ s_state_out_len_eq_one:
+ {
+ if (cs_avail_out == 0) {
+ c_state_out_len = 1; goto return_notr;
+ };
+ *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+ BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+ cs_next_out++;
+ cs_avail_out--;
+ }
+ }
+ /* can a new run be started? */
+ if (c_nblock_used == s_save_nblockPP) {
+ c_state_out_len = 0; goto return_notr;
+ };
+ c_state_out_ch = c_k0;
+ BZ_GET_FAST_C(k1); c_nblock_used++;
+ if (k1 != c_k0) {
+ c_k0 = k1; goto s_state_out_len_eq_one;
+ };
+ if (c_nblock_used == s_save_nblockPP)
+ goto s_state_out_len_eq_one;
+
+ c_state_out_len = 2;
+ BZ_GET_FAST_C(k1); c_nblock_used++;
+ if (c_nblock_used == s_save_nblockPP) continue;
+ if (k1 != c_k0) { c_k0 = k1; continue; };
+
+ c_state_out_len = 3;
+ BZ_GET_FAST_C(k1); c_nblock_used++;
+ if (c_nblock_used == s_save_nblockPP) continue;
+ if (k1 != c_k0) { c_k0 = k1; continue; };
+
+ BZ_GET_FAST_C(k1); c_nblock_used++;
+ c_state_out_len = ((Int32)k1) + 4;
+ BZ_GET_FAST_C(c_k0); c_nblock_used++;
+ }
+
+ return_notr:
+ total_out_lo32_old = s->strm->total_out_lo32;
+ s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
+ if (s->strm->total_out_lo32 < total_out_lo32_old)
+ s->strm->total_out_hi32++;
+
+ /* save */
+ s->calculatedBlockCRC = c_calculatedBlockCRC;
+ s->state_out_ch = c_state_out_ch;
+ s->state_out_len = c_state_out_len;
+ s->nblock_used = c_nblock_used;
+ s->k0 = c_k0;
+ s->tt = c_tt;
+ s->tPos = c_tPos;
+ s->strm->next_out = cs_next_out;
+ s->strm->avail_out = cs_avail_out;
+ /* end save */
+ }
+}
+
+
+
+/*---------------------------------------------------*/
+__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
+{
+ Int32 nb, na, mid;
+ nb = 0;
+ na = 256;
+ do {
+ mid = (nb + na) >> 1;
+ if (indx >= cftab[mid]) nb = mid; else na = mid;
+ }
+ while (na - nb != 1);
+ return nb;
+}
+
+
+/*---------------------------------------------------*/
+static
+void unRLE_obuf_to_output_SMALL ( DState* s )
+{
+ UChar k1;
+
+ if (s->blockRandomised) {
+
+ while (True) {
+ /* try to finish existing run */
+ while (True) {
+ if (s->strm->avail_out == 0) return;
+ if (s->state_out_len == 0) break;
+ *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+ BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+ s->state_out_len--;
+ s->strm->next_out++;
+ s->strm->avail_out--;
+ s->strm->total_out_lo32++;
+ if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+ }
+
+ /* can a new run be started? */
+ if (s->nblock_used == s->save_nblock+1) return;
+
+
+ s->state_out_len = 1;
+ s->state_out_ch = s->k0;
+ BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ s->state_out_len = 2;
+ BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ s->state_out_len = 3;
+ BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
+ k1 ^= BZ_RAND_MASK; s->nblock_used++;
+ s->state_out_len = ((Int32)k1) + 4;
+ BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK;
+ s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+ }
+
+ } else {
+
+ while (True) {
+ /* try to finish existing run */
+ while (True) {
+ if (s->strm->avail_out == 0) return;
+ if (s->state_out_len == 0) break;
+ *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+ BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+ s->state_out_len--;
+ s->strm->next_out++;
+ s->strm->avail_out--;
+ s->strm->total_out_lo32++;
+ if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+ }
+
+ /* can a new run be started? */
+ if (s->nblock_used == s->save_nblock+1) return;
+
+ s->state_out_len = 1;
+ s->state_out_ch = s->k0;
+ BZ_GET_SMALL(k1); s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ s->state_out_len = 2;
+ BZ_GET_SMALL(k1); s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ s->state_out_len = 3;
+ BZ_GET_SMALL(k1); s->nblock_used++;
+ if (s->nblock_used == s->save_nblock+1) continue;
+ if (k1 != s->k0) { s->k0 = k1; continue; };
+
+ BZ_GET_SMALL(k1); s->nblock_used++;
+ s->state_out_len = ((Int32)k1) + 4;
+ BZ_GET_SMALL(s->k0); s->nblock_used++;
+ }
+
+ }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
+{
+ DState* s;
+ if (strm == NULL) return BZ_PARAM_ERROR;
+ s = strm->state;
+ if (s == NULL) return BZ_PARAM_ERROR;
+ if (s->strm != strm) return BZ_PARAM_ERROR;
+
+ while (True) {
+ if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
+ if (s->state == BZ_X_OUTPUT) {
+ if (s->smallDecompress)
+ unRLE_obuf_to_output_SMALL ( s ); else
+ unRLE_obuf_to_output_FAST ( s );
+ if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
+ BZ_FINALISE_CRC ( s->calculatedBlockCRC );
+ if (s->verbosity >= 3)
+ VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC,
+ s->calculatedBlockCRC );
+ if (s->verbosity >= 2) VPrintf0 ( "]" );
+ if (s->calculatedBlockCRC != s->storedBlockCRC)
+ return BZ_DATA_ERROR;
+ s->calculatedCombinedCRC
+ = (s->calculatedCombinedCRC << 1) |
+ (s->calculatedCombinedCRC >> 31);
+ s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
+ s->state = BZ_X_BLKHDR_1;
+ } else {
+ return BZ_OK;
+ }
+ }
+ if (s->state >= BZ_X_MAGIC_1) {
+ Int32 r = BZ2_decompress ( s );
+ if (r == BZ_STREAM_END) {
+ if (s->verbosity >= 3)
+ VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x",
+ s->storedCombinedCRC, s->calculatedCombinedCRC );
+ if (s->calculatedCombinedCRC != s->storedCombinedCRC)
+ return BZ_DATA_ERROR;
+ return r;
+ }
+ if (s->state != BZ_X_OUTPUT) return r;
+ }
+ }
+
+ AssertH ( 0, 6001 );
+
+ return 0; /*NOTREACHED*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm )
+{
+ DState* s;
+ if (strm == NULL) return BZ_PARAM_ERROR;
+ s = strm->state;
+ if (s == NULL) return BZ_PARAM_ERROR;
+ if (s->strm != strm) return BZ_PARAM_ERROR;
+
+ if (s->tt != NULL) BZFREE(s->tt);
+ if (s->ll16 != NULL) BZFREE(s->ll16);
+ if (s->ll4 != NULL) BZFREE(s->ll4);
+
+ BZFREE(strm->state);
+ strm->state = NULL;
+
+ return BZ_OK;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+/*--- File I/O stuff ---*/
+/*---------------------------------------------------*/
+
+#define BZ_SETERR(eee) \
+{ \
+ if (bzerror != NULL) *bzerror = eee; \
+ if (bzf != NULL) bzf->lastErr = eee; \
+}
+
+typedef
+ struct {
+ FILE* handle;
+ Char buf[BZ_MAX_UNUSED];
+ Int32 bufN;
+ Bool writing;
+ bz_stream strm;
+ Int32 lastErr;
+ Bool initialisedOk;
+ }
+ bzFile;
+
+
+/*---------------------------------------------*/
+static Bool myfeof ( FILE* f )
+{
+ Int32 c = fgetc ( f );
+ if (c == EOF) return True;
+ ungetc ( c, f );
+ return False;
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzWriteOpen)
+ ( int* bzerror,
+ FILE* f,
+ int blockSize100k,
+ int verbosity,
+ int workFactor )
+{
+ Int32 ret;
+ bzFile* bzf = NULL;
+
+ BZ_SETERR(BZ_OK);
+
+ if (f == NULL ||
+ (blockSize100k < 1 || blockSize100k > 9) ||
+ (workFactor < 0 || workFactor > 250) ||
+ (verbosity < 0 || verbosity > 4))
+ { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+ if (ferror(f))
+ { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+ bzf = malloc ( sizeof(bzFile) );
+ if (bzf == NULL)
+ { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+ BZ_SETERR(BZ_OK);
+ bzf->initialisedOk = False;
+ bzf->bufN = 0;
+ bzf->handle = f;
+ bzf->writing = True;
+ bzf->strm.bzalloc = NULL;
+ bzf->strm.bzfree = NULL;
+ bzf->strm.opaque = NULL;
+
+ if (workFactor == 0) workFactor = 30;
+ ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k,
+ verbosity, workFactor );
+ if (ret != BZ_OK)
+ { BZ_SETERR(ret); free(bzf); return NULL; };
+
+ bzf->strm.avail_in = 0;
+ bzf->initialisedOk = True;
+ return bzf;
+}
+
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWrite)
+ ( int* bzerror,
+ BZFILE* b,
+ void* buf,
+ int len )
+{
+ Int32 n, n2, ret;
+ bzFile* bzf = (bzFile*)b;
+
+ BZ_SETERR(BZ_OK);
+ if (bzf == NULL || buf == NULL || len < 0)
+ { BZ_SETERR(BZ_PARAM_ERROR); return; };
+ if (!(bzf->writing))
+ { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+ if (ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return; };
+
+ if (len == 0)
+ { BZ_SETERR(BZ_OK); return; };
+
+ bzf->strm.avail_in = len;
+ bzf->strm.next_in = buf;
+
+ while (True) {
+ bzf->strm.avail_out = BZ_MAX_UNUSED;
+ bzf->strm.next_out = bzf->buf;
+ ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
+ if (ret != BZ_RUN_OK)
+ { BZ_SETERR(ret); return; };
+
+ if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+ n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+ n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),
+ n, bzf->handle );
+ if (n != n2 || ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return; };
+ }
+
+ if (bzf->strm.avail_in == 0)
+ { BZ_SETERR(BZ_OK); return; };
+ }
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWriteClose)
+ ( int* bzerror,
+ BZFILE* b,
+ int abandon,
+ unsigned int* nbytes_in,
+ unsigned int* nbytes_out )
+{
+ BZ2_bzWriteClose64 ( bzerror, b, abandon,
+ nbytes_in, NULL, nbytes_out, NULL );
+}
+
+
+void BZ_API(BZ2_bzWriteClose64)
+ ( int* bzerror,
+ BZFILE* b,
+ int abandon,
+ unsigned int* nbytes_in_lo32,
+ unsigned int* nbytes_in_hi32,
+ unsigned int* nbytes_out_lo32,
+ unsigned int* nbytes_out_hi32 )
+{
+ Int32 n, n2, ret;
+ bzFile* bzf = (bzFile*)b;
+
+ if (bzf == NULL)
+ { BZ_SETERR(BZ_OK); return; };
+ if (!(bzf->writing))
+ { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+ if (ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return; };
+
+ if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
+ if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
+ if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
+ if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
+
+ if ((!abandon) && bzf->lastErr == BZ_OK) {
+ while (True) {
+ bzf->strm.avail_out = BZ_MAX_UNUSED;
+ bzf->strm.next_out = bzf->buf;
+ ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
+ if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
+ { BZ_SETERR(ret); return; };
+
+ if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+ n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+ n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),
+ n, bzf->handle );
+ if (n != n2 || ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return; };
+ }
+
+ if (ret == BZ_STREAM_END) break;
+ }
+ }
+
+ if ( !abandon && !ferror ( bzf->handle ) ) {
+ fflush ( bzf->handle );
+ if (ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return; };
+ }
+
+ if (nbytes_in_lo32 != NULL)
+ *nbytes_in_lo32 = bzf->strm.total_in_lo32;
+ if (nbytes_in_hi32 != NULL)
+ *nbytes_in_hi32 = bzf->strm.total_in_hi32;
+ if (nbytes_out_lo32 != NULL)
+ *nbytes_out_lo32 = bzf->strm.total_out_lo32;
+ if (nbytes_out_hi32 != NULL)
+ *nbytes_out_hi32 = bzf->strm.total_out_hi32;
+
+ BZ_SETERR(BZ_OK);
+ BZ2_bzCompressEnd ( &(bzf->strm) );
+ free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzReadOpen)
+ ( int* bzerror,
+ FILE* f,
+ int verbosity,
+ int small,
+ void* unused,
+ int nUnused )
+{
+ bzFile* bzf = NULL;
+ int ret;
+
+ BZ_SETERR(BZ_OK);
+
+ if (f == NULL ||
+ (small != 0 && small != 1) ||
+ (verbosity < 0 || verbosity > 4) ||
+ (unused == NULL && nUnused != 0) ||
+ (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
+ { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+ if (ferror(f))
+ { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+ bzf = malloc ( sizeof(bzFile) );
+ if (bzf == NULL)
+ { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+ BZ_SETERR(BZ_OK);
+
+ bzf->initialisedOk = False;
+ bzf->handle = f;
+ bzf->bufN = 0;
+ bzf->writing = False;
+ bzf->strm.bzalloc = NULL;
+ bzf->strm.bzfree = NULL;
+ bzf->strm.opaque = NULL;
+
+ while (nUnused > 0) {
+ bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
+ unused = ((void*)( 1 + ((UChar*)(unused)) ));
+ nUnused--;
+ }
+
+ ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
+ if (ret != BZ_OK)
+ { BZ_SETERR(ret); free(bzf); return NULL; };
+
+ bzf->strm.avail_in = bzf->bufN;
+ bzf->strm.next_in = bzf->buf;
+
+ bzf->initialisedOk = True;
+ return bzf;
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
+{
+ bzFile* bzf = (bzFile*)b;
+
+ BZ_SETERR(BZ_OK);
+ if (bzf == NULL)
+ { BZ_SETERR(BZ_OK); return; };
+
+ if (bzf->writing)
+ { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+
+ if (bzf->initialisedOk)
+ (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
+ free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzRead)
+ ( int* bzerror,
+ BZFILE* b,
+ void* buf,
+ int len )
+{
+ Int32 n, ret;
+ bzFile* bzf = (bzFile*)b;
+
+ BZ_SETERR(BZ_OK);
+
+ if (bzf == NULL || buf == NULL || len < 0)
+ { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
+
+ if (bzf->writing)
+ { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
+
+ if (len == 0)
+ { BZ_SETERR(BZ_OK); return 0; };
+
+ bzf->strm.avail_out = len;
+ bzf->strm.next_out = buf;
+
+ while (True) {
+
+ if (ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return 0; };
+
+ if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) {
+ n = fread ( bzf->buf, sizeof(UChar),
+ BZ_MAX_UNUSED, bzf->handle );
+ if (ferror(bzf->handle))
+ { BZ_SETERR(BZ_IO_ERROR); return 0; };
+ bzf->bufN = n;
+ bzf->strm.avail_in = bzf->bufN;
+ bzf->strm.next_in = bzf->buf;
+ }
+
+ ret = BZ2_bzDecompress ( &(bzf->strm) );
+
+ if (ret != BZ_OK && ret != BZ_STREAM_END)
+ { BZ_SETERR(ret); return 0; };
+
+ if (ret == BZ_OK && myfeof(bzf->handle) &&
+ bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
+ { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
+
+ if (ret == BZ_STREAM_END)
+ { BZ_SETERR(BZ_STREAM_END);
+ return len - bzf->strm.avail_out; };
+ if (bzf->strm.avail_out == 0)
+ { BZ_SETERR(BZ_OK); return len; };
+
+ }
+
+ return 0; /*not reached*/
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadGetUnused)
+ ( int* bzerror,
+ BZFILE* b,
+ void** unused,
+ int* nUnused )
+{
+ bzFile* bzf = (bzFile*)b;
+ if (bzf == NULL)
+ { BZ_SETERR(BZ_PARAM_ERROR); return; };
+ if (bzf->lastErr != BZ_STREAM_END)
+ { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+ if (unused == NULL || nUnused == NULL)
+ { BZ_SETERR(BZ_PARAM_ERROR); return; };
+
+ BZ_SETERR(BZ_OK);
+ *nUnused = bzf->strm.avail_in;
+ *unused = bzf->strm.next_in;
+}
+#endif
+
+
+/*---------------------------------------------------*/
+/*--- Misc convenience stuff ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffCompress)
+ ( char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int blockSize100k,
+ int verbosity,
+ int workFactor )
+{
+ bz_stream strm;
+ int ret;
+
+ if (dest == NULL || destLen == NULL ||
+ source == NULL ||
+ blockSize100k < 1 || blockSize100k > 9 ||
+ verbosity < 0 || verbosity > 4 ||
+ workFactor < 0 || workFactor > 250)
+ return BZ_PARAM_ERROR;
+
+ if (workFactor == 0) workFactor = 30;
+ strm.bzalloc = NULL;
+ strm.bzfree = NULL;
+ strm.opaque = NULL;
+ ret = BZ2_bzCompressInit ( &strm, blockSize100k,
+ verbosity, workFactor );
+ if (ret != BZ_OK) return ret;
+
+ strm.next_in = source;
+ strm.next_out = dest;
+ strm.avail_in = sourceLen;
+ strm.avail_out = *destLen;
+
+ ret = BZ2_bzCompress ( &strm, BZ_FINISH );
+ if (ret == BZ_FINISH_OK) goto output_overflow;
+ if (ret != BZ_STREAM_END) goto errhandler;
+
+ /* normal termination */
+ *destLen -= strm.avail_out;
+ BZ2_bzCompressEnd ( &strm );
+ return BZ_OK;
+
+ output_overflow:
+ BZ2_bzCompressEnd ( &strm );
+ return BZ_OUTBUFF_FULL;
+
+ errhandler:
+ BZ2_bzCompressEnd ( &strm );
+ return ret;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffDecompress)
+ ( char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int small,
+ int verbosity )
+{
+ bz_stream strm;
+ int ret;
+
+ if (dest == NULL || destLen == NULL ||
+ source == NULL ||
+ (small != 0 && small != 1) ||
+ verbosity < 0 || verbosity > 4)
+ return BZ_PARAM_ERROR;
+
+ strm.bzalloc = NULL;
+ strm.bzfree = NULL;
+ strm.opaque = NULL;
+ ret = BZ2_bzDecompressInit ( &strm, verbosity, small );
+ if (ret != BZ_OK) return ret;
+
+ strm.next_in = source;
+ strm.next_out = dest;
+ strm.avail_in = sourceLen;
+ strm.avail_out = *destLen;
+
+ ret = BZ2_bzDecompress ( &strm );
+ if (ret == BZ_OK) goto output_overflow_or_eof;
+ if (ret != BZ_STREAM_END) goto errhandler;
+
+ /* normal termination */
+ *destLen -= strm.avail_out;
+ BZ2_bzDecompressEnd ( &strm );
+ return BZ_OK;
+
+ output_overflow_or_eof:
+ if (strm.avail_out > 0) {
+ BZ2_bzDecompressEnd ( &strm );
+ return BZ_UNEXPECTED_EOF;
+ } else {
+ BZ2_bzDecompressEnd ( &strm );
+ return BZ_OUTBUFF_FULL;
+ };
+
+ errhandler:
+ BZ2_bzDecompressEnd ( &strm );
+ return ret;
+}
+
+
+/*---------------------------------------------------*/
+/*--
+ Code contributed by Yoshioka Tsuneo
+ (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp),
+ to support better zlib compatibility.
+ This code is not _officially_ part of libbzip2 (yet);
+ I haven't tested it, documented it, or considered the
+ threading-safeness of it.
+ If this code breaks, please contact both Yoshioka and me.
+--*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+/*--
+ return version like "0.9.0c".
+--*/
+const char * BZ_API(BZ2_bzlibVersion)(void)
+{
+ return BZ_VERSION;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+
+#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
+# include <fcntl.h>
+# include <io.h>
+# include <oldnames.h>
+# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+static
+BZFILE * bzopen_or_bzdopen
+ ( const char *path, /* no use when bzdopen */
+ int fd, /* no use when bzdopen */
+ const char *mode,
+ int open_mode) /* bzopen: 0, bzdopen:1 */
+{
+ int bzerr;
+ char unused[BZ_MAX_UNUSED];
+ int blockSize100k = 9;
+ int writing = 0;
+ char mode2[10] = "";
+ FILE *fp = NULL;
+ BZFILE *bzfp = NULL;
+ int verbosity = 0;
+ int workFactor = 30;
+ int smallMode = 0;
+ int nUnused = 0;
+
+ if (mode == NULL) return NULL;
+ while (*mode) {
+ switch (*mode) {
+ case 'r':
+ writing = 0; break;
+ case 'w':
+ writing = 1; break;
+ case 's':
+ smallMode = 1; break;
+ default:
+ if (isdigit((int)(*mode))) {
+ blockSize100k = *mode-BZ_HDR_0;
+ }
+ }
+ mode++;
+ }
+ strcat(mode2, writing ? "w" : "r" );
+ strcat(mode2,"b"); /* binary mode */
+
+ if (open_mode==0) {
+ if (path==NULL || strcmp(path,"")==0) {
+ fp = (writing ? stdout : stdin);
+ SET_BINARY_MODE(fp);
+ } else {
+ fp = fopen(path,mode2);
+ }
+ } else {
+#ifdef BZ_STRICT_ANSI
+ fp = NULL;
+#else
+ fp = fdopen(fd,mode2);
+#endif
+ }
+ if (fp == NULL) return NULL;
+
+ if (writing) {
+ /* Guard against total chaos and anarchy -- JRS */
+ if (blockSize100k < 1) blockSize100k = 1;
+ if (blockSize100k > 9) blockSize100k = 9;
+ bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
+ verbosity,workFactor);
+ } else {
+ bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
+ unused,nUnused);
+ }
+ if (bzfp == NULL) {
+ if (fp != stdin && fp != stdout) fclose(fp);
+ return NULL;
+ }
+ return bzfp;
+}
+
+
+/*---------------------------------------------------*/
+/*--
+ open file for read or write.
+ ex) bzopen("file","w9")
+ case path="" or NULL => use stdin or stdout.
+--*/
+BZFILE * BZ_API(BZ2_bzopen)
+ ( const char *path,
+ const char *mode )
+{
+ return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
+}
+
+
+/*---------------------------------------------------*/
+BZFILE * BZ_API(BZ2_bzdopen)
+ ( int fd,
+ const char *mode )
+{
+ return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
+{
+ int bzerr, nread;
+ if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
+ nread = BZ2_bzRead(&bzerr,b,buf,len);
+ if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
+ return nread;
+ } else {
+ return -1;
+ }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
+{
+ int bzerr;
+
+ BZ2_bzWrite(&bzerr,b,buf,len);
+ if(bzerr == BZ_OK){
+ return len;
+ }else{
+ return -1;
+ }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzflush) (BZFILE *b)
+{
+ /* do nothing now... */
+ return 0;
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzclose) (BZFILE* b)
+{
+ int bzerr;
+ FILE *fp = ((bzFile *)b)->handle;
+
+ if (b==NULL) {return;}
+ if(((bzFile*)b)->writing){
+ BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
+ if(bzerr != BZ_OK){
+ BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
+ }
+ }else{
+ BZ2_bzReadClose(&bzerr,b);
+ }
+ if(fp!=stdin && fp!=stdout){
+ fclose(fp);
+ }
+}
+
+
+/*---------------------------------------------------*/
+/*--
+ return last error code
+--*/
+static char *bzerrorstrings[] = {
+ "OK"
+ ,"SEQUENCE_ERROR"
+ ,"PARAM_ERROR"
+ ,"MEM_ERROR"
+ ,"DATA_ERROR"
+ ,"DATA_ERROR_MAGIC"
+ ,"IO_ERROR"
+ ,"UNEXPECTED_EOF"
+ ,"OUTBUFF_FULL"
+ ,"CONFIG_ERROR"
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+};
+
+
+const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
+{
+ int err = ((bzFile *)b)->lastErr;
+
+ if(err>0) err = 0;
+ *errnum = err;
+ return bzerrorstrings[err*-1];
+}
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end bzlib.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/bzlib.h b/Build/source/utils/bzip2/bzlib.h
new file mode 100644
index 00000000000..5b4ce18ac23
--- /dev/null
+++ b/Build/source/utils/bzip2/bzlib.h
@@ -0,0 +1,321 @@
+
+/*-------------------------------------------------------------*/
+/*--- Public header file for the library. ---*/
+/*--- bzlib.h ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+#ifndef _BZLIB_H
+#define _BZLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BZ_RUN 0
+#define BZ_FLUSH 1
+#define BZ_FINISH 2
+
+#define BZ_OK 0
+#define BZ_RUN_OK 1
+#define BZ_FLUSH_OK 2
+#define BZ_FINISH_OK 3
+#define BZ_STREAM_END 4
+#define BZ_SEQUENCE_ERROR (-1)
+#define BZ_PARAM_ERROR (-2)
+#define BZ_MEM_ERROR (-3)
+#define BZ_DATA_ERROR (-4)
+#define BZ_DATA_ERROR_MAGIC (-5)
+#define BZ_IO_ERROR (-6)
+#define BZ_UNEXPECTED_EOF (-7)
+#define BZ_OUTBUFF_FULL (-8)
+#define BZ_CONFIG_ERROR (-9)
+
+typedef
+ struct {
+ char *next_in;
+ unsigned int avail_in;
+ unsigned int total_in_lo32;
+ unsigned int total_in_hi32;
+
+ char *next_out;
+ unsigned int avail_out;
+ unsigned int total_out_lo32;
+ unsigned int total_out_hi32;
+
+ void *state;
+
+ void *(*bzalloc)(void *,int,int);
+ void (*bzfree)(void *,void *);
+ void *opaque;
+ }
+ bz_stream;
+
+
+#ifndef BZ_IMPORT
+#define BZ_EXPORT
+#endif
+
+/* Need a definitition for FILE */
+#include <stdio.h>
+
+#ifdef _WIN32
+# include <windows.h>
+# ifdef small
+ /* windows.h define small to char */
+# undef small
+# endif
+# ifdef BZ_EXPORT
+# define BZ_API(func) WINAPI func
+# define BZ_EXTERN extern __declspec(dllexport)
+# else
+ /* import windows dll dynamically */
+# define BZ_API(func) (WINAPI * func)
+# define BZ_EXTERN __declspec(dllimport)
+# endif
+#else
+# define BZ_API(func) func
+# define BZ_EXTERN extern
+#endif
+
+
+/*-- Core (low-level) library functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressInit) (
+ bz_stream* strm,
+ int blockSize100k,
+ int verbosity,
+ int workFactor
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompress) (
+ bz_stream* strm,
+ int action
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) (
+ bz_stream* strm
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) (
+ bz_stream *strm,
+ int verbosity,
+ int small
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompress) (
+ bz_stream* strm
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) (
+ bz_stream *strm
+ );
+
+
+
+/*-- High(er) level library functions --*/
+
+#ifndef BZ_NO_STDIO
+#define BZ_MAX_UNUSED 5000
+
+typedef void BZFILE;
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) (
+ int* bzerror,
+ FILE* f,
+ int verbosity,
+ int small,
+ void* unused,
+ int nUnused
+ );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadClose) (
+ int* bzerror,
+ BZFILE* b
+ );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) (
+ int* bzerror,
+ BZFILE* b,
+ void** unused,
+ int* nUnused
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzRead) (
+ int* bzerror,
+ BZFILE* b,
+ void* buf,
+ int len
+ );
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) (
+ int* bzerror,
+ FILE* f,
+ int blockSize100k,
+ int verbosity,
+ int workFactor
+ );
+
+BZ_EXTERN void BZ_API(BZ2_bzWrite) (
+ int* bzerror,
+ BZFILE* b,
+ void* buf,
+ int len
+ );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose) (
+ int* bzerror,
+ BZFILE* b,
+ int abandon,
+ unsigned int* nbytes_in,
+ unsigned int* nbytes_out
+ );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) (
+ int* bzerror,
+ BZFILE* b,
+ int abandon,
+ unsigned int* nbytes_in_lo32,
+ unsigned int* nbytes_in_hi32,
+ unsigned int* nbytes_out_lo32,
+ unsigned int* nbytes_out_hi32
+ );
+#endif
+
+
+/*-- Utility functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) (
+ char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int blockSize100k,
+ int verbosity,
+ int workFactor
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) (
+ char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int small,
+ int verbosity
+ );
+
+
+/*--
+ Code contributed by Yoshioka Tsuneo
+ (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp),
+ to support better zlib compatibility.
+ This code is not _officially_ part of libbzip2 (yet);
+ I haven't tested it, documented it, or considered the
+ threading-safeness of it.
+ If this code breaks, please contact both Yoshioka and me.
+--*/
+
+BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
+ void
+ );
+
+#ifndef BZ_NO_STDIO
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
+ const char *path,
+ const char *mode
+ );
+
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
+ int fd,
+ const char *mode
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzread) (
+ BZFILE* b,
+ void* buf,
+ int len
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzwrite) (
+ BZFILE* b,
+ void* buf,
+ int len
+ );
+
+BZ_EXTERN int BZ_API(BZ2_bzflush) (
+ BZFILE* b
+ );
+
+BZ_EXTERN void BZ_API(BZ2_bzclose) (
+ BZFILE* b
+ );
+
+BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
+ BZFILE *b,
+ int *errnum
+ );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/*-------------------------------------------------------------*/
+/*--- end bzlib.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/bzlib_private.h b/Build/source/utils/bzip2/bzlib_private.h
new file mode 100644
index 00000000000..ff973c3bfd0
--- /dev/null
+++ b/Build/source/utils/bzip2/bzlib_private.h
@@ -0,0 +1,537 @@
+
+/*-------------------------------------------------------------*/
+/*--- Private header file for the library. ---*/
+/*--- bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+#ifndef _BZLIB_PRIVATE_H
+#define _BZLIB_PRIVATE_H
+
+#include <stdlib.h>
+
+#ifndef BZ_NO_STDIO
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#endif
+
+#include "bzlib.h"
+
+
+
+/*-- General stuff. --*/
+
+#define BZ_VERSION "1.0.2, 30-Dec-2001"
+
+typedef char Char;
+typedef unsigned char Bool;
+typedef unsigned char UChar;
+typedef int Int32;
+typedef unsigned int UInt32;
+typedef short Int16;
+typedef unsigned short UInt16;
+
+#define True ((Bool)1)
+#define False ((Bool)0)
+
+#ifndef __GNUC__
+#define __inline__ /* */
+#endif
+
+#ifndef BZ_NO_STDIO
+extern void BZ2_bz__AssertH__fail ( int errcode );
+#define AssertH(cond,errcode) \
+ { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
+#if BZ_DEBUG
+#define AssertD(cond,msg) \
+ { if (!(cond)) { \
+ fprintf ( stderr, \
+ "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
+ exit(1); \
+ }}
+#else
+#define AssertD(cond,msg) /* */
+#endif
+#define VPrintf0(zf) \
+ fprintf(stderr,zf)
+#define VPrintf1(zf,za1) \
+ fprintf(stderr,zf,za1)
+#define VPrintf2(zf,za1,za2) \
+ fprintf(stderr,zf,za1,za2)
+#define VPrintf3(zf,za1,za2,za3) \
+ fprintf(stderr,zf,za1,za2,za3)
+#define VPrintf4(zf,za1,za2,za3,za4) \
+ fprintf(stderr,zf,za1,za2,za3,za4)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) \
+ fprintf(stderr,zf,za1,za2,za3,za4,za5)
+#else
+extern void bz_internal_error ( int errcode );
+#define AssertH(cond,errcode) \
+ { if (!(cond)) bz_internal_error ( errcode ); }
+#define AssertD(cond,msg) /* */
+#define VPrintf0(zf) /* */
+#define VPrintf1(zf,za1) /* */
+#define VPrintf2(zf,za1,za2) /* */
+#define VPrintf3(zf,za1,za2,za3) /* */
+#define VPrintf4(zf,za1,za2,za3,za4) /* */
+#define VPrintf5(zf,za1,za2,za3,za4,za5) /* */
+#endif
+
+
+#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
+#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp))
+
+
+/*-- Header bytes. --*/
+
+#define BZ_HDR_B 0x42 /* 'B' */
+#define BZ_HDR_Z 0x5a /* 'Z' */
+#define BZ_HDR_h 0x68 /* 'h' */
+#define BZ_HDR_0 0x30 /* '0' */
+
+/*-- Constants for the back end. --*/
+
+#define BZ_MAX_ALPHA_SIZE 258
+#define BZ_MAX_CODE_LEN 23
+
+#define BZ_RUNA 0
+#define BZ_RUNB 1
+
+#define BZ_N_GROUPS 6
+#define BZ_G_SIZE 50
+#define BZ_N_ITERS 4
+
+#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
+
+
+
+/*-- Stuff for randomising repetitive blocks. --*/
+
+extern Int32 BZ2_rNums[512];
+
+#define BZ_RAND_DECLS \
+ Int32 rNToGo; \
+ Int32 rTPos \
+
+#define BZ_RAND_INIT_MASK \
+ s->rNToGo = 0; \
+ s->rTPos = 0 \
+
+#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
+
+#define BZ_RAND_UPD_MASK \
+ if (s->rNToGo == 0) { \
+ s->rNToGo = BZ2_rNums[s->rTPos]; \
+ s->rTPos++; \
+ if (s->rTPos == 512) s->rTPos = 0; \
+ } \
+ s->rNToGo--;
+
+
+
+/*-- Stuff for doing CRCs. --*/
+
+extern UInt32 BZ2_crc32Table[256];
+
+#define BZ_INITIALISE_CRC(crcVar) \
+{ \
+ crcVar = 0xffffffffL; \
+}
+
+#define BZ_FINALISE_CRC(crcVar) \
+{ \
+ crcVar = ~(crcVar); \
+}
+
+#define BZ_UPDATE_CRC(crcVar,cha) \
+{ \
+ crcVar = (crcVar << 8) ^ \
+ BZ2_crc32Table[(crcVar >> 24) ^ \
+ ((UChar)cha)]; \
+}
+
+
+
+/*-- States and modes for compression. --*/
+
+#define BZ_M_IDLE 1
+#define BZ_M_RUNNING 2
+#define BZ_M_FLUSHING 3
+#define BZ_M_FINISHING 4
+
+#define BZ_S_OUTPUT 1
+#define BZ_S_INPUT 2
+
+#define BZ_N_RADIX 2
+#define BZ_N_QSORT 12
+#define BZ_N_SHELL 18
+#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
+
+
+
+
+/*-- Structure holding all the compression-side stuff. --*/
+
+typedef
+ struct {
+ /* pointer back to the struct bz_stream */
+ bz_stream* strm;
+
+ /* mode this stream is in, and whether inputting */
+ /* or outputting data */
+ Int32 mode;
+ Int32 state;
+
+ /* remembers avail_in when flush/finish requested */
+ UInt32 avail_in_expect;
+
+ /* for doing the block sorting */
+ UInt32* arr1;
+ UInt32* arr2;
+ UInt32* ftab;
+ Int32 origPtr;
+
+ /* aliases for arr1 and arr2 */
+ UInt32* ptr;
+ UChar* block;
+ UInt16* mtfv;
+ UChar* zbits;
+
+ /* for deciding when to use the fallback sorting algorithm */
+ Int32 workFactor;
+
+ /* run-length-encoding of the input */
+ UInt32 state_in_ch;
+ Int32 state_in_len;
+ BZ_RAND_DECLS;
+
+ /* input and output limits and current posns */
+ Int32 nblock;
+ Int32 nblockMAX;
+ Int32 numZ;
+ Int32 state_out_pos;
+
+ /* map of bytes used in block */
+ Int32 nInUse;
+ Bool inUse[256];
+ UChar unseqToSeq[256];
+
+ /* the buffer for bit stream creation */
+ UInt32 bsBuff;
+ Int32 bsLive;
+
+ /* block and combined CRCs */
+ UInt32 blockCRC;
+ UInt32 combinedCRC;
+
+ /* misc administratium */
+ Int32 verbosity;
+ Int32 blockNo;
+ Int32 blockSize100k;
+
+ /* stuff for coding the MTF values */
+ Int32 nMTF;
+ Int32 mtfFreq [BZ_MAX_ALPHA_SIZE];
+ UChar selector [BZ_MAX_SELECTORS];
+ UChar selectorMtf[BZ_MAX_SELECTORS];
+
+ UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ /* second dimension: only 3 needed; 4 makes index calculations faster */
+ UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4];
+
+ }
+ EState;
+
+
+
+/*-- externs for compression. --*/
+
+extern void
+BZ2_blockSort ( EState* );
+
+extern void
+BZ2_compressBlock ( EState*, Bool );
+
+extern void
+BZ2_bsInitWrite ( EState* );
+
+extern void
+BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
+
+extern void
+BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
+
+
+
+/*-- states for decompression. --*/
+
+#define BZ_X_IDLE 1
+#define BZ_X_OUTPUT 2
+
+#define BZ_X_MAGIC_1 10
+#define BZ_X_MAGIC_2 11
+#define BZ_X_MAGIC_3 12
+#define BZ_X_MAGIC_4 13
+#define BZ_X_BLKHDR_1 14
+#define BZ_X_BLKHDR_2 15
+#define BZ_X_BLKHDR_3 16
+#define BZ_X_BLKHDR_4 17
+#define BZ_X_BLKHDR_5 18
+#define BZ_X_BLKHDR_6 19
+#define BZ_X_BCRC_1 20
+#define BZ_X_BCRC_2 21
+#define BZ_X_BCRC_3 22
+#define BZ_X_BCRC_4 23
+#define BZ_X_RANDBIT 24
+#define BZ_X_ORIGPTR_1 25
+#define BZ_X_ORIGPTR_2 26
+#define BZ_X_ORIGPTR_3 27
+#define BZ_X_MAPPING_1 28
+#define BZ_X_MAPPING_2 29
+#define BZ_X_SELECTOR_1 30
+#define BZ_X_SELECTOR_2 31
+#define BZ_X_SELECTOR_3 32
+#define BZ_X_CODING_1 33
+#define BZ_X_CODING_2 34
+#define BZ_X_CODING_3 35
+#define BZ_X_MTF_1 36
+#define BZ_X_MTF_2 37
+#define BZ_X_MTF_3 38
+#define BZ_X_MTF_4 39
+#define BZ_X_MTF_5 40
+#define BZ_X_MTF_6 41
+#define BZ_X_ENDHDR_2 42
+#define BZ_X_ENDHDR_3 43
+#define BZ_X_ENDHDR_4 44
+#define BZ_X_ENDHDR_5 45
+#define BZ_X_ENDHDR_6 46
+#define BZ_X_CCRC_1 47
+#define BZ_X_CCRC_2 48
+#define BZ_X_CCRC_3 49
+#define BZ_X_CCRC_4 50
+
+
+
+/*-- Constants for the fast MTF decoder. --*/
+
+#define MTFA_SIZE 4096
+#define MTFL_SIZE 16
+
+
+
+/*-- Structure holding all the decompression-side stuff. --*/
+
+typedef
+ struct {
+ /* pointer back to the struct bz_stream */
+ bz_stream* strm;
+
+ /* state indicator for this stream */
+ Int32 state;
+
+ /* for doing the final run-length decoding */
+ UChar state_out_ch;
+ Int32 state_out_len;
+ Bool blockRandomised;
+ BZ_RAND_DECLS;
+
+ /* the buffer for bit stream reading */
+ UInt32 bsBuff;
+ Int32 bsLive;
+
+ /* misc administratium */
+ Int32 blockSize100k;
+ Bool smallDecompress;
+ Int32 currBlockNo;
+ Int32 verbosity;
+
+ /* for undoing the Burrows-Wheeler transform */
+ Int32 origPtr;
+ UInt32 tPos;
+ Int32 k0;
+ Int32 unzftab[256];
+ Int32 nblock_used;
+ Int32 cftab[257];
+ Int32 cftabCopy[257];
+
+ /* for undoing the Burrows-Wheeler transform (FAST) */
+ UInt32 *tt;
+
+ /* for undoing the Burrows-Wheeler transform (SMALL) */
+ UInt16 *ll16;
+ UChar *ll4;
+
+ /* stored and calculated CRCs */
+ UInt32 storedBlockCRC;
+ UInt32 storedCombinedCRC;
+ UInt32 calculatedBlockCRC;
+ UInt32 calculatedCombinedCRC;
+
+ /* map of bytes used in block */
+ Int32 nInUse;
+ Bool inUse[256];
+ Bool inUse16[16];
+ UChar seqToUnseq[256];
+
+ /* for decoding the MTF values */
+ UChar mtfa [MTFA_SIZE];
+ Int32 mtfbase[256 / MTFL_SIZE];
+ UChar selector [BZ_MAX_SELECTORS];
+ UChar selectorMtf[BZ_MAX_SELECTORS];
+ UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+
+ Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ Int32 minLens[BZ_N_GROUPS];
+
+ /* save area for scalars in the main decompress code */
+ Int32 save_i;
+ Int32 save_j;
+ Int32 save_t;
+ Int32 save_alphaSize;
+ Int32 save_nGroups;
+ Int32 save_nSelectors;
+ Int32 save_EOB;
+ Int32 save_groupNo;
+ Int32 save_groupPos;
+ Int32 save_nextSym;
+ Int32 save_nblockMAX;
+ Int32 save_nblock;
+ Int32 save_es;
+ Int32 save_N;
+ Int32 save_curr;
+ Int32 save_zt;
+ Int32 save_zn;
+ Int32 save_zvec;
+ Int32 save_zj;
+ Int32 save_gSel;
+ Int32 save_gMinlen;
+ Int32* save_gLimit;
+ Int32* save_gBase;
+ Int32* save_gPerm;
+
+ }
+ DState;
+
+
+
+/*-- Macros for decompression. --*/
+
+#define BZ_GET_FAST(cccc) \
+ s->tPos = s->tt[s->tPos]; \
+ cccc = (UChar)(s->tPos & 0xff); \
+ s->tPos >>= 8;
+
+#define BZ_GET_FAST_C(cccc) \
+ c_tPos = c_tt[c_tPos]; \
+ cccc = (UChar)(c_tPos & 0xff); \
+ c_tPos >>= 8;
+
+#define SET_LL4(i,n) \
+ { if (((i) & 0x1) == 0) \
+ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \
+ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \
+ }
+
+#define GET_LL4(i) \
+ ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
+
+#define SET_LL(i,n) \
+ { s->ll16[i] = (UInt16)(n & 0x0000ffff); \
+ SET_LL4(i, n >> 16); \
+ }
+
+#define GET_LL(i) \
+ (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
+
+#define BZ_GET_SMALL(cccc) \
+ cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \
+ s->tPos = GET_LL(s->tPos);
+
+
+/*-- externs for decompression. --*/
+
+extern Int32
+BZ2_indexIntoF ( Int32, Int32* );
+
+extern Int32
+BZ2_decompress ( DState* );
+
+extern void
+BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
+ Int32, Int32, Int32 );
+
+
+#endif
+
+
+/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
+
+#ifdef BZ_NO_STDIO
+#ifndef NULL
+#define NULL 0
+#endif
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/bzmore b/Build/source/utils/bzip2/bzmore
new file mode 100644
index 00000000000..d3140434049
--- /dev/null
+++ b/Build/source/utils/bzip2/bzmore
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+# Bzmore wrapped for bzip2,
+# adapted from zmore by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+ *less) more=less ;;
+ *) more=more ;;
+esac
+
+if test "`echo -n a`" = "-n a"; then
+ # looks like a SysV system:
+ n1=''; n2='\c'
+else
+ n1='-n'; n2=''
+fi
+oldtty=`stty -g 2>/dev/null`
+if stty -cbreak 2>/dev/null; then
+ cb='cbreak'; ncb='-cbreak'
+else
+ # 'stty min 1' resets eof to ^a on both SunOS and SysV!
+ cb='min 1 -icanon'; ncb='icanon eof ^d'
+fi
+if test $? -eq 0 -a -n "$oldtty"; then
+ trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
+else
+ trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
+fi
+
+if test $# = 0; then
+ if test -t 0; then
+ echo usage: $prog files...
+ else
+ bzip2 -cdfq | eval $more
+ fi
+else
+ FIRST=1
+ for FILE
+ do
+ if test $FIRST -eq 0; then
+ echo $n1 "--More--(Next file: $FILE)$n2"
+ stty $cb -echo 2>/dev/null
+ ANS=`dd bs=1 count=1 2>/dev/null`
+ stty $ncb echo 2>/dev/null
+ echo " "
+ if test "$ANS" = 'e' -o "$ANS" = 'q'; then
+ exit
+ fi
+ fi
+ if test "$ANS" != 's'; then
+ echo "------> $FILE <------"
+ bzip2 -cdfq "$FILE" | eval $more
+ fi
+ if test -t; then
+ FIRST=0
+ fi
+ done
+fi
diff --git a/Build/source/utils/bzip2/bzmore.1 b/Build/source/utils/bzip2/bzmore.1
new file mode 100644
index 00000000000..b437d3b031f
--- /dev/null
+++ b/Build/source/utils/bzip2/bzmore.1
@@ -0,0 +1,152 @@
+.\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
+.\"for Debian GNU/Linux
+.TH BZMORE 1
+.SH NAME
+bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
+.SH SYNOPSIS
+.B bzmore
+[ name ... ]
+.br
+.B bzless
+[ name ... ]
+.SH NOTE
+In the following description,
+.I bzless
+and
+.I less
+can be used interchangeably with
+.I bzmore
+and
+.I more.
+.SH DESCRIPTION
+.I Bzmore
+is a filter which allows examination of compressed or plain text files
+one screenful at a time on a soft-copy terminal.
+.I bzmore
+works on files compressed with
+.I bzip2
+and also on uncompressed files.
+If a file does not exist,
+.I bzmore
+looks for a file of the same name with the addition of a .bz2 suffix.
+.PP
+.I Bzmore
+normally pauses after each screenful, printing --More--
+at the bottom of the screen.
+If the user then types a carriage return, one more line is displayed.
+If the user hits a space,
+another screenful is displayed. Other possibilities are enumerated later.
+.PP
+.I Bzmore
+looks in the file
+.I /etc/termcap
+to determine terminal characteristics,
+and to determine the default window size.
+On a terminal capable of displaying 24 lines,
+the default window size is 22 lines.
+Other sequences which may be typed when
+.I bzmore
+pauses, and their effects, are as follows (\fIi\fP is an optional integer
+argument, defaulting to 1) :
+.PP
+.IP \fIi\|\fP<space>
+display
+.I i
+more lines, (or another screenful if no argument is given)
+.PP
+.IP ^D
+display 11 more lines (a ``scroll'').
+If
+.I i
+is given, then the scroll size is set to \fIi\|\fP.
+.PP
+.IP d
+same as ^D (control-D)
+.PP
+.IP \fIi\|\fPz
+same as typing a space except that \fIi\|\fP, if present, becomes the new
+window size. Note that the window size reverts back to the default at the
+end of the current file.
+.PP
+.IP \fIi\|\fPs
+skip \fIi\|\fP lines and print a screenful of lines
+.PP
+.IP \fIi\|\fPf
+skip \fIi\fP screenfuls and print a screenful of lines
+.PP
+.IP "q or Q"
+quit reading the current file; go on to the next (if any)
+.PP
+.IP "e or q"
+When the prompt --More--(Next file:
+.IR file )
+is printed, this command causes bzmore to exit.
+.PP
+.IP s
+When the prompt --More--(Next file:
+.IR file )
+is printed, this command causes bzmore to skip the next file and continue.
+.PP
+.IP =
+Display the current line number.
+.PP
+.IP \fIi\|\fP/expr
+search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
+If the pattern is not found,
+.I bzmore
+goes on to the next file (if any).
+Otherwise, a screenful is displayed, starting two lines before the place
+where the expression was found.
+The user's erase and kill characters may be used to edit the regular
+expression.
+Erasing back past the first column cancels the search command.
+.PP
+.IP \fIi\|\fPn
+search for the \fIi\|\fP-th occurrence of the last regular expression entered.
+.PP
+.IP !command
+invoke a shell with \fIcommand\|\fP.
+The character `!' in "command" are replaced with the
+previous shell command. The sequence "\\!" is replaced by "!".
+.PP
+.IP ":q or :Q"
+quit reading the current file; go on to the next (if any)
+(same as q or Q).
+.PP
+.IP .
+(dot) repeat the previous command.
+.PP
+The commands take effect immediately, i.e., it is not necessary to
+type a carriage return.
+Up to the time when the command character itself is given,
+the user may hit the line kill character to cancel the numerical
+argument being formed.
+In addition, the user may hit the erase character to redisplay the
+--More-- message.
+.PP
+At any time when output is being sent to the terminal, the user can
+hit the quit key (normally control\-\\).
+.I Bzmore
+will stop sending output, and will display the usual --More--
+prompt.
+The user may then enter one of the above commands in the normal manner.
+Unfortunately, some output is lost when this is done, due to the
+fact that any characters waiting in the terminal's output queue
+are flushed when the quit signal occurs.
+.PP
+The terminal is set to
+.I noecho
+mode by this program so that the output can be continuous.
+What you type will thus not show on your terminal, except for the / and !
+commands.
+.PP
+If the standard output is not a teletype, then
+.I bzmore
+acts just like
+.I bzcat,
+except that a header is printed before each file.
+.SH FILES
+.DT
+/etc/termcap Terminal data base
+.SH "SEE ALSO"
+more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
diff --git a/Build/source/utils/bzip2/compress.c b/Build/source/utils/bzip2/compress.c
new file mode 100644
index 00000000000..56501c11553
--- /dev/null
+++ b/Build/source/utils/bzip2/compress.c
@@ -0,0 +1,714 @@
+
+/*-------------------------------------------------------------*/
+/*--- Compression machinery (not incl block sorting) ---*/
+/*--- compress.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+/*--
+ CHANGES
+ ~~~~~~~
+ 0.9.0 -- original version.
+
+ 0.9.0a/b -- no changes in this file.
+
+ 0.9.0c
+ * changed setting of nGroups in sendMTFValues() so as to
+ do a bit better on small files
+--*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+void BZ2_bsInitWrite ( EState* s )
+{
+ s->bsLive = 0;
+ s->bsBuff = 0;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsFinishWrite ( EState* s )
+{
+ while (s->bsLive > 0) {
+ s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
+ s->numZ++;
+ s->bsBuff <<= 8;
+ s->bsLive -= 8;
+ }
+}
+
+
+/*---------------------------------------------------*/
+#define bsNEEDW(nz) \
+{ \
+ while (s->bsLive >= 8) { \
+ s->zbits[s->numZ] \
+ = (UChar)(s->bsBuff >> 24); \
+ s->numZ++; \
+ s->bsBuff <<= 8; \
+ s->bsLive -= 8; \
+ } \
+}
+
+
+/*---------------------------------------------------*/
+static
+__inline__
+void bsW ( EState* s, Int32 n, UInt32 v )
+{
+ bsNEEDW ( n );
+ s->bsBuff |= (v << (32 - s->bsLive - n));
+ s->bsLive += n;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUInt32 ( EState* s, UInt32 u )
+{
+ bsW ( s, 8, (u >> 24) & 0xffL );
+ bsW ( s, 8, (u >> 16) & 0xffL );
+ bsW ( s, 8, (u >> 8) & 0xffL );
+ bsW ( s, 8, u & 0xffL );
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUChar ( EState* s, UChar c )
+{
+ bsW( s, 8, (UInt32)c );
+}
+
+
+/*---------------------------------------------------*/
+/*--- The back end proper ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+static
+void makeMaps_e ( EState* s )
+{
+ Int32 i;
+ s->nInUse = 0;
+ for (i = 0; i < 256; i++)
+ if (s->inUse[i]) {
+ s->unseqToSeq[i] = s->nInUse;
+ s->nInUse++;
+ }
+}
+
+
+/*---------------------------------------------------*/
+static
+void generateMTFValues ( EState* s )
+{
+ UChar yy[256];
+ Int32 i, j;
+ Int32 zPend;
+ Int32 wr;
+ Int32 EOB;
+
+ /*
+ After sorting (eg, here),
+ s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
+ and
+ ((UChar*)s->arr2) [ 0 .. s->nblock-1 ]
+ holds the original block data.
+
+ The first thing to do is generate the MTF values,
+ and put them in
+ ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
+ Because there are strictly fewer or equal MTF values
+ than block values, ptr values in this area are overwritten
+ with MTF values only when they are no longer needed.
+
+ The final compressed bitstream is generated into the
+ area starting at
+ (UChar*) (&((UChar*)s->arr2)[s->nblock])
+
+ These storage aliases are set up in bzCompressInit(),
+ except for the last one, which is arranged in
+ compressBlock().
+ */
+ UInt32* ptr = s->ptr;
+ UChar* block = s->block;
+ UInt16* mtfv = s->mtfv;
+
+ makeMaps_e ( s );
+ EOB = s->nInUse+1;
+
+ for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
+
+ wr = 0;
+ zPend = 0;
+ for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
+
+ for (i = 0; i < s->nblock; i++) {
+ UChar ll_i;
+ AssertD ( wr <= i, "generateMTFValues(1)" );
+ j = ptr[i]-1; if (j < 0) j += s->nblock;
+ ll_i = s->unseqToSeq[block[j]];
+ AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
+
+ if (yy[0] == ll_i) {
+ zPend++;
+ } else {
+
+ if (zPend > 0) {
+ zPend--;
+ while (True) {
+ if (zPend & 1) {
+ mtfv[wr] = BZ_RUNB; wr++;
+ s->mtfFreq[BZ_RUNB]++;
+ } else {
+ mtfv[wr] = BZ_RUNA; wr++;
+ s->mtfFreq[BZ_RUNA]++;
+ }
+ if (zPend < 2) break;
+ zPend = (zPend - 2) / 2;
+ };
+ zPend = 0;
+ }
+ {
+ register UChar rtmp;
+ register UChar* ryy_j;
+ register UChar rll_i;
+ rtmp = yy[1];
+ yy[1] = yy[0];
+ ryy_j = &(yy[1]);
+ rll_i = ll_i;
+ while ( rll_i != rtmp ) {
+ register UChar rtmp2;
+ ryy_j++;
+ rtmp2 = rtmp;
+ rtmp = *ryy_j;
+ *ryy_j = rtmp2;
+ };
+ yy[0] = rtmp;
+ j = ryy_j - &(yy[0]);
+ mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
+ }
+
+ }
+ }
+
+ if (zPend > 0) {
+ zPend--;
+ while (True) {
+ if (zPend & 1) {
+ mtfv[wr] = BZ_RUNB; wr++;
+ s->mtfFreq[BZ_RUNB]++;
+ } else {
+ mtfv[wr] = BZ_RUNA; wr++;
+ s->mtfFreq[BZ_RUNA]++;
+ }
+ if (zPend < 2) break;
+ zPend = (zPend - 2) / 2;
+ };
+ zPend = 0;
+ }
+
+ mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
+
+ s->nMTF = wr;
+}
+
+
+/*---------------------------------------------------*/
+#define BZ_LESSER_ICOST 0
+#define BZ_GREATER_ICOST 15
+
+static
+void sendMTFValues ( EState* s )
+{
+ Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
+ Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
+ Int32 nGroups, nBytes;
+
+ /*--
+ UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ is a global since the decoder also needs it.
+
+ Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+ are also globals only used in this proc.
+ Made global to keep stack frame size small.
+ --*/
+
+
+ UInt16 cost[BZ_N_GROUPS];
+ Int32 fave[BZ_N_GROUPS];
+
+ UInt16* mtfv = s->mtfv;
+
+ if (s->verbosity >= 3)
+ VPrintf3( " %d in block, %d after MTF & 1-2 coding, "
+ "%d+2 syms in use\n",
+ s->nblock, s->nMTF, s->nInUse );
+
+ alphaSize = s->nInUse+2;
+ for (t = 0; t < BZ_N_GROUPS; t++)
+ for (v = 0; v < alphaSize; v++)
+ s->len[t][v] = BZ_GREATER_ICOST;
+
+ /*--- Decide how many coding tables to use ---*/
+ AssertH ( s->nMTF > 0, 3001 );
+ if (s->nMTF < 200) nGroups = 2; else
+ if (s->nMTF < 600) nGroups = 3; else
+ if (s->nMTF < 1200) nGroups = 4; else
+ if (s->nMTF < 2400) nGroups = 5; else
+ nGroups = 6;
+
+ /*--- Generate an initial set of coding tables ---*/
+ {
+ Int32 nPart, remF, tFreq, aFreq;
+
+ nPart = nGroups;
+ remF = s->nMTF;
+ gs = 0;
+ while (nPart > 0) {
+ tFreq = remF / nPart;
+ ge = gs-1;
+ aFreq = 0;
+ while (aFreq < tFreq && ge < alphaSize-1) {
+ ge++;
+ aFreq += s->mtfFreq[ge];
+ }
+
+ if (ge > gs
+ && nPart != nGroups && nPart != 1
+ && ((nGroups-nPart) % 2 == 1)) {
+ aFreq -= s->mtfFreq[ge];
+ ge--;
+ }
+
+ if (s->verbosity >= 3)
+ VPrintf5( " initial group %d, [%d .. %d], "
+ "has %d syms (%4.1f%%)\n",
+ nPart, gs, ge, aFreq,
+ (100.0 * (float)aFreq) / (float)(s->nMTF) );
+
+ for (v = 0; v < alphaSize; v++)
+ if (v >= gs && v <= ge)
+ s->len[nPart-1][v] = BZ_LESSER_ICOST; else
+ s->len[nPart-1][v] = BZ_GREATER_ICOST;
+
+ nPart--;
+ gs = ge+1;
+ remF -= aFreq;
+ }
+ }
+
+ /*---
+ Iterate up to BZ_N_ITERS times to improve the tables.
+ ---*/
+ for (iter = 0; iter < BZ_N_ITERS; iter++) {
+
+ for (t = 0; t < nGroups; t++) fave[t] = 0;
+
+ for (t = 0; t < nGroups; t++)
+ for (v = 0; v < alphaSize; v++)
+ s->rfreq[t][v] = 0;
+
+ /*---
+ Set up an auxiliary length table which is used to fast-track
+ the common case (nGroups == 6).
+ ---*/
+ if (nGroups == 6) {
+ for (v = 0; v < alphaSize; v++) {
+ s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
+ s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
+ s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
+ }
+ }
+
+ nSelectors = 0;
+ totc = 0;
+ gs = 0;
+ while (True) {
+
+ /*--- Set group start & end marks. --*/
+ if (gs >= s->nMTF) break;
+ ge = gs + BZ_G_SIZE - 1;
+ if (ge >= s->nMTF) ge = s->nMTF-1;
+
+ /*--
+ Calculate the cost of this group as coded
+ by each of the coding tables.
+ --*/
+ for (t = 0; t < nGroups; t++) cost[t] = 0;
+
+ if (nGroups == 6 && 50 == ge-gs+1) {
+ /*--- fast track the common case ---*/
+ register UInt32 cost01, cost23, cost45;
+ register UInt16 icv;
+ cost01 = cost23 = cost45 = 0;
+
+# define BZ_ITER(nn) \
+ icv = mtfv[gs+(nn)]; \
+ cost01 += s->len_pack[icv][0]; \
+ cost23 += s->len_pack[icv][1]; \
+ cost45 += s->len_pack[icv][2]; \
+
+ BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4);
+ BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9);
+ BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
+ BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
+ BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
+ BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
+ BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
+ BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
+ BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
+ BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
+
+# undef BZ_ITER
+
+ cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
+ cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
+ cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
+
+ } else {
+ /*--- slow version which correctly handles all situations ---*/
+ for (i = gs; i <= ge; i++) {
+ UInt16 icv = mtfv[i];
+ for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
+ }
+ }
+
+ /*--
+ Find the coding table which is best for this group,
+ and record its identity in the selector table.
+ --*/
+ bc = 999999999; bt = -1;
+ for (t = 0; t < nGroups; t++)
+ if (cost[t] < bc) { bc = cost[t]; bt = t; };
+ totc += bc;
+ fave[bt]++;
+ s->selector[nSelectors] = bt;
+ nSelectors++;
+
+ /*--
+ Increment the symbol frequencies for the selected table.
+ --*/
+ if (nGroups == 6 && 50 == ge-gs+1) {
+ /*--- fast track the common case ---*/
+
+# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
+
+ BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4);
+ BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9);
+ BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
+ BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
+ BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
+ BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
+ BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
+ BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
+ BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
+ BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
+
+# undef BZ_ITUR
+
+ } else {
+ /*--- slow version which correctly handles all situations ---*/
+ for (i = gs; i <= ge; i++)
+ s->rfreq[bt][ mtfv[i] ]++;
+ }
+
+ gs = ge+1;
+ }
+ if (s->verbosity >= 3) {
+ VPrintf2 ( " pass %d: size is %d, grp uses are ",
+ iter+1, totc/8 );
+ for (t = 0; t < nGroups; t++)
+ VPrintf1 ( "%d ", fave[t] );
+ VPrintf0 ( "\n" );
+ }
+
+ /*--
+ Recompute the tables based on the accumulated frequencies.
+ --*/
+ for (t = 0; t < nGroups; t++)
+ BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),
+ alphaSize, 20 );
+ }
+
+
+ AssertH( nGroups < 8, 3002 );
+ AssertH( nSelectors < 32768 &&
+ nSelectors <= (2 + (900000 / BZ_G_SIZE)),
+ 3003 );
+
+
+ /*--- Compute MTF values for the selectors. ---*/
+ {
+ UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
+ for (i = 0; i < nGroups; i++) pos[i] = i;
+ for (i = 0; i < nSelectors; i++) {
+ ll_i = s->selector[i];
+ j = 0;
+ tmp = pos[j];
+ while ( ll_i != tmp ) {
+ j++;
+ tmp2 = tmp;
+ tmp = pos[j];
+ pos[j] = tmp2;
+ };
+ pos[0] = tmp;
+ s->selectorMtf[i] = j;
+ }
+ };
+
+ /*--- Assign actual codes for the tables. --*/
+ for (t = 0; t < nGroups; t++) {
+ minLen = 32;
+ maxLen = 0;
+ for (i = 0; i < alphaSize; i++) {
+ if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+ if (s->len[t][i] < minLen) minLen = s->len[t][i];
+ }
+ AssertH ( !(maxLen > 20), 3004 );
+ AssertH ( !(minLen < 1), 3005 );
+ BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]),
+ minLen, maxLen, alphaSize );
+ }
+
+ /*--- Transmit the mapping table. ---*/
+ {
+ Bool inUse16[16];
+ for (i = 0; i < 16; i++) {
+ inUse16[i] = False;
+ for (j = 0; j < 16; j++)
+ if (s->inUse[i * 16 + j]) inUse16[i] = True;
+ }
+
+ nBytes = s->numZ;
+ for (i = 0; i < 16; i++)
+ if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
+
+ for (i = 0; i < 16; i++)
+ if (inUse16[i])
+ for (j = 0; j < 16; j++) {
+ if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
+ }
+
+ if (s->verbosity >= 3)
+ VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes );
+ }
+
+ /*--- Now the selectors. ---*/
+ nBytes = s->numZ;
+ bsW ( s, 3, nGroups );
+ bsW ( s, 15, nSelectors );
+ for (i = 0; i < nSelectors; i++) {
+ for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
+ bsW(s,1,0);
+ }
+ if (s->verbosity >= 3)
+ VPrintf1( "selectors %d, ", s->numZ-nBytes );
+
+ /*--- Now the coding tables. ---*/
+ nBytes = s->numZ;
+
+ for (t = 0; t < nGroups; t++) {
+ Int32 curr = s->len[t][0];
+ bsW ( s, 5, curr );
+ for (i = 0; i < alphaSize; i++) {
+ while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
+ while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
+ bsW ( s, 1, 0 );
+ }
+ }
+
+ if (s->verbosity >= 3)
+ VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
+
+ /*--- And finally, the block data proper ---*/
+ nBytes = s->numZ;
+ selCtr = 0;
+ gs = 0;
+ while (True) {
+ if (gs >= s->nMTF) break;
+ ge = gs + BZ_G_SIZE - 1;
+ if (ge >= s->nMTF) ge = s->nMTF-1;
+ AssertH ( s->selector[selCtr] < nGroups, 3006 );
+
+ if (nGroups == 6 && 50 == ge-gs+1) {
+ /*--- fast track the common case ---*/
+ UInt16 mtfv_i;
+ UChar* s_len_sel_selCtr
+ = &(s->len[s->selector[selCtr]][0]);
+ Int32* s_code_sel_selCtr
+ = &(s->code[s->selector[selCtr]][0]);
+
+# define BZ_ITAH(nn) \
+ mtfv_i = mtfv[gs+(nn)]; \
+ bsW ( s, \
+ s_len_sel_selCtr[mtfv_i], \
+ s_code_sel_selCtr[mtfv_i] )
+
+ BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4);
+ BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9);
+ BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
+ BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
+ BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
+ BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
+ BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
+ BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
+ BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
+ BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
+
+# undef BZ_ITAH
+
+ } else {
+ /*--- slow version which correctly handles all situations ---*/
+ for (i = gs; i <= ge; i++) {
+ bsW ( s,
+ s->len [s->selector[selCtr]] [mtfv[i]],
+ s->code [s->selector[selCtr]] [mtfv[i]] );
+ }
+ }
+
+
+ gs = ge+1;
+ selCtr++;
+ }
+ AssertH( selCtr == nSelectors, 3007 );
+
+ if (s->verbosity >= 3)
+ VPrintf1( "codes %d\n", s->numZ-nBytes );
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_compressBlock ( EState* s, Bool is_last_block )
+{
+ if (s->nblock > 0) {
+
+ BZ_FINALISE_CRC ( s->blockCRC );
+ s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
+ s->combinedCRC ^= s->blockCRC;
+ if (s->blockNo > 1) s->numZ = 0;
+
+ if (s->verbosity >= 2)
+ VPrintf4( " block %d: crc = 0x%8x, "
+ "combined CRC = 0x%8x, size = %d\n",
+ s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
+
+ BZ2_blockSort ( s );
+ }
+
+ s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
+
+ /*-- If this is the first block, create the stream header. --*/
+ if (s->blockNo == 1) {
+ BZ2_bsInitWrite ( s );
+ bsPutUChar ( s, BZ_HDR_B );
+ bsPutUChar ( s, BZ_HDR_Z );
+ bsPutUChar ( s, BZ_HDR_h );
+ bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
+ }
+
+ if (s->nblock > 0) {
+
+ bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
+ bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
+ bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
+
+ /*-- Now the block's CRC, so it is in a known place. --*/
+ bsPutUInt32 ( s, s->blockCRC );
+
+ /*--
+ Now a single bit indicating (non-)randomisation.
+ As of version 0.9.5, we use a better sorting algorithm
+ which makes randomisation unnecessary. So always set
+ the randomised bit to 'no'. Of course, the decoder
+ still needs to be able to handle randomised blocks
+ so as to maintain backwards compatibility with
+ older versions of bzip2.
+ --*/
+ bsW(s,1,0);
+
+ bsW ( s, 24, s->origPtr );
+ generateMTFValues ( s );
+ sendMTFValues ( s );
+ }
+
+
+ /*-- If this is the last block, add the stream trailer. --*/
+ if (is_last_block) {
+
+ bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
+ bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
+ bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
+ bsPutUInt32 ( s, s->combinedCRC );
+ if (s->verbosity >= 2)
+ VPrintf1( " final combined CRC = 0x%x\n ", s->combinedCRC );
+ bsFinishWrite ( s );
+ }
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end compress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/crctable.c b/Build/source/utils/bzip2/crctable.c
new file mode 100644
index 00000000000..b16746ae194
--- /dev/null
+++ b/Build/source/utils/bzip2/crctable.c
@@ -0,0 +1,144 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for doing CRCs ---*/
+/*--- crctable.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+#include "bzlib_private.h"
+
+/*--
+ I think this is an implementation of the AUTODIN-II,
+ Ethernet & FDDI 32-bit CRC standard. Vaguely derived
+ from code by Rob Warnock, in Section 51 of the
+ comp.compression FAQ.
+--*/
+
+UInt32 BZ2_crc32Table[256] = {
+
+ /*-- Ugly, innit? --*/
+
+ 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
+ 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
+ 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
+ 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
+ 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
+ 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
+ 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
+ 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
+ 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
+ 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
+ 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
+ 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
+ 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
+ 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
+ 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
+ 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
+ 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
+ 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
+ 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
+ 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
+ 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
+ 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
+ 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
+ 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
+ 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
+ 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
+ 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
+ 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
+ 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
+ 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
+ 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
+ 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
+ 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
+ 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
+ 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
+ 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
+ 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
+ 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
+ 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
+ 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
+ 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
+ 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
+ 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
+ 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
+ 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
+ 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
+ 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
+ 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
+ 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
+ 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
+ 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
+ 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
+ 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
+ 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
+ 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
+ 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
+ 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
+ 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
+ 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
+ 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
+ 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
+ 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
+ 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
+ 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end crctable.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/decompress.c b/Build/source/utils/bzip2/decompress.c
new file mode 100644
index 00000000000..e9213473acf
--- /dev/null
+++ b/Build/source/utils/bzip2/decompress.c
@@ -0,0 +1,660 @@
+
+/*-------------------------------------------------------------*/
+/*--- Decompression machinery ---*/
+/*--- decompress.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+static
+void makeMaps_d ( DState* s )
+{
+ Int32 i;
+ s->nInUse = 0;
+ for (i = 0; i < 256; i++)
+ if (s->inUse[i]) {
+ s->seqToUnseq[s->nInUse] = i;
+ s->nInUse++;
+ }
+}
+
+
+/*---------------------------------------------------*/
+#define RETURN(rrr) \
+ { retVal = rrr; goto save_state_and_return; };
+
+#define GET_BITS(lll,vvv,nnn) \
+ case lll: s->state = lll; \
+ while (True) { \
+ if (s->bsLive >= nnn) { \
+ UInt32 v; \
+ v = (s->bsBuff >> \
+ (s->bsLive-nnn)) & ((1 << nnn)-1); \
+ s->bsLive -= nnn; \
+ vvv = v; \
+ break; \
+ } \
+ if (s->strm->avail_in == 0) RETURN(BZ_OK); \
+ s->bsBuff \
+ = (s->bsBuff << 8) | \
+ ((UInt32) \
+ (*((UChar*)(s->strm->next_in)))); \
+ s->bsLive += 8; \
+ s->strm->next_in++; \
+ s->strm->avail_in--; \
+ s->strm->total_in_lo32++; \
+ if (s->strm->total_in_lo32 == 0) \
+ s->strm->total_in_hi32++; \
+ }
+
+#define GET_UCHAR(lll,uuu) \
+ GET_BITS(lll,uuu,8)
+
+#define GET_BIT(lll,uuu) \
+ GET_BITS(lll,uuu,1)
+
+/*---------------------------------------------------*/
+#define GET_MTF_VAL(label1,label2,lval) \
+{ \
+ if (groupPos == 0) { \
+ groupNo++; \
+ if (groupNo >= nSelectors) \
+ RETURN(BZ_DATA_ERROR); \
+ groupPos = BZ_G_SIZE; \
+ gSel = s->selector[groupNo]; \
+ gMinlen = s->minLens[gSel]; \
+ gLimit = &(s->limit[gSel][0]); \
+ gPerm = &(s->perm[gSel][0]); \
+ gBase = &(s->base[gSel][0]); \
+ } \
+ groupPos--; \
+ zn = gMinlen; \
+ GET_BITS(label1, zvec, zn); \
+ while (1) { \
+ if (zn > 20 /* the longest code */) \
+ RETURN(BZ_DATA_ERROR); \
+ if (zvec <= gLimit[zn]) break; \
+ zn++; \
+ GET_BIT(label2, zj); \
+ zvec = (zvec << 1) | zj; \
+ }; \
+ if (zvec - gBase[zn] < 0 \
+ || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \
+ RETURN(BZ_DATA_ERROR); \
+ lval = gPerm[zvec - gBase[zn]]; \
+}
+
+
+/*---------------------------------------------------*/
+Int32 BZ2_decompress ( DState* s )
+{
+ UChar uc;
+ Int32 retVal;
+ Int32 minLen, maxLen;
+ bz_stream* strm = s->strm;
+
+ /* stuff that needs to be saved/restored */
+ Int32 i;
+ Int32 j;
+ Int32 t;
+ Int32 alphaSize;
+ Int32 nGroups;
+ Int32 nSelectors;
+ Int32 EOB;
+ Int32 groupNo;
+ Int32 groupPos;
+ Int32 nextSym;
+ Int32 nblockMAX;
+ Int32 nblock;
+ Int32 es;
+ Int32 N;
+ Int32 curr;
+ Int32 zt;
+ Int32 zn;
+ Int32 zvec;
+ Int32 zj;
+ Int32 gSel;
+ Int32 gMinlen;
+ Int32* gLimit;
+ Int32* gBase;
+ Int32* gPerm;
+
+ if (s->state == BZ_X_MAGIC_1) {
+ /*initialise the save area*/
+ s->save_i = 0;
+ s->save_j = 0;
+ s->save_t = 0;
+ s->save_alphaSize = 0;
+ s->save_nGroups = 0;
+ s->save_nSelectors = 0;
+ s->save_EOB = 0;
+ s->save_groupNo = 0;
+ s->save_groupPos = 0;
+ s->save_nextSym = 0;
+ s->save_nblockMAX = 0;
+ s->save_nblock = 0;
+ s->save_es = 0;
+ s->save_N = 0;
+ s->save_curr = 0;
+ s->save_zt = 0;
+ s->save_zn = 0;
+ s->save_zvec = 0;
+ s->save_zj = 0;
+ s->save_gSel = 0;
+ s->save_gMinlen = 0;
+ s->save_gLimit = NULL;
+ s->save_gBase = NULL;
+ s->save_gPerm = NULL;
+ }
+
+ /*restore from the save area*/
+ i = s->save_i;
+ j = s->save_j;
+ t = s->save_t;
+ alphaSize = s->save_alphaSize;
+ nGroups = s->save_nGroups;
+ nSelectors = s->save_nSelectors;
+ EOB = s->save_EOB;
+ groupNo = s->save_groupNo;
+ groupPos = s->save_groupPos;
+ nextSym = s->save_nextSym;
+ nblockMAX = s->save_nblockMAX;
+ nblock = s->save_nblock;
+ es = s->save_es;
+ N = s->save_N;
+ curr = s->save_curr;
+ zt = s->save_zt;
+ zn = s->save_zn;
+ zvec = s->save_zvec;
+ zj = s->save_zj;
+ gSel = s->save_gSel;
+ gMinlen = s->save_gMinlen;
+ gLimit = s->save_gLimit;
+ gBase = s->save_gBase;
+ gPerm = s->save_gPerm;
+
+ retVal = BZ_OK;
+
+ switch (s->state) {
+
+ GET_UCHAR(BZ_X_MAGIC_1, uc);
+ if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
+
+ GET_UCHAR(BZ_X_MAGIC_2, uc);
+ if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
+
+ GET_UCHAR(BZ_X_MAGIC_3, uc)
+ if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
+
+ GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
+ if (s->blockSize100k < (BZ_HDR_0 + 1) ||
+ s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
+ s->blockSize100k -= BZ_HDR_0;
+
+ if (s->smallDecompress) {
+ s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
+ s->ll4 = BZALLOC(
+ ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)
+ );
+ if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
+ } else {
+ s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
+ if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
+ }
+
+ GET_UCHAR(BZ_X_BLKHDR_1, uc);
+
+ if (uc == 0x17) goto endhdr_2;
+ if (uc != 0x31) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_BLKHDR_2, uc);
+ if (uc != 0x41) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_BLKHDR_3, uc);
+ if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_BLKHDR_4, uc);
+ if (uc != 0x26) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_BLKHDR_5, uc);
+ if (uc != 0x53) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_BLKHDR_6, uc);
+ if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+
+ s->currBlockNo++;
+ if (s->verbosity >= 2)
+ VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo );
+
+ s->storedBlockCRC = 0;
+ GET_UCHAR(BZ_X_BCRC_1, uc);
+ s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+ GET_UCHAR(BZ_X_BCRC_2, uc);
+ s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+ GET_UCHAR(BZ_X_BCRC_3, uc);
+ s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+ GET_UCHAR(BZ_X_BCRC_4, uc);
+ s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+
+ GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
+
+ s->origPtr = 0;
+ GET_UCHAR(BZ_X_ORIGPTR_1, uc);
+ s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+ GET_UCHAR(BZ_X_ORIGPTR_2, uc);
+ s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+ GET_UCHAR(BZ_X_ORIGPTR_3, uc);
+ s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+
+ if (s->origPtr < 0)
+ RETURN(BZ_DATA_ERROR);
+ if (s->origPtr > 10 + 100000*s->blockSize100k)
+ RETURN(BZ_DATA_ERROR);
+
+ /*--- Receive the mapping table ---*/
+ for (i = 0; i < 16; i++) {
+ GET_BIT(BZ_X_MAPPING_1, uc);
+ if (uc == 1)
+ s->inUse16[i] = True; else
+ s->inUse16[i] = False;
+ }
+
+ for (i = 0; i < 256; i++) s->inUse[i] = False;
+
+ for (i = 0; i < 16; i++)
+ if (s->inUse16[i])
+ for (j = 0; j < 16; j++) {
+ GET_BIT(BZ_X_MAPPING_2, uc);
+ if (uc == 1) s->inUse[i * 16 + j] = True;
+ }
+ makeMaps_d ( s );
+ if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
+ alphaSize = s->nInUse+2;
+
+ /*--- Now the selectors ---*/
+ GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
+ if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
+ GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
+ if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
+ for (i = 0; i < nSelectors; i++) {
+ j = 0;
+ while (True) {
+ GET_BIT(BZ_X_SELECTOR_3, uc);
+ if (uc == 0) break;
+ j++;
+ if (j >= nGroups) RETURN(BZ_DATA_ERROR);
+ }
+ s->selectorMtf[i] = j;
+ }
+
+ /*--- Undo the MTF values for the selectors. ---*/
+ {
+ UChar pos[BZ_N_GROUPS], tmp, v;
+ for (v = 0; v < nGroups; v++) pos[v] = v;
+
+ for (i = 0; i < nSelectors; i++) {
+ v = s->selectorMtf[i];
+ tmp = pos[v];
+ while (v > 0) { pos[v] = pos[v-1]; v--; }
+ pos[0] = tmp;
+ s->selector[i] = tmp;
+ }
+ }
+
+ /*--- Now the coding tables ---*/
+ for (t = 0; t < nGroups; t++) {
+ GET_BITS(BZ_X_CODING_1, curr, 5);
+ for (i = 0; i < alphaSize; i++) {
+ while (True) {
+ if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
+ GET_BIT(BZ_X_CODING_2, uc);
+ if (uc == 0) break;
+ GET_BIT(BZ_X_CODING_3, uc);
+ if (uc == 0) curr++; else curr--;
+ }
+ s->len[t][i] = curr;
+ }
+ }
+
+ /*--- Create the Huffman decoding tables ---*/
+ for (t = 0; t < nGroups; t++) {
+ minLen = 32;
+ maxLen = 0;
+ for (i = 0; i < alphaSize; i++) {
+ if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+ if (s->len[t][i] < minLen) minLen = s->len[t][i];
+ }
+ BZ2_hbCreateDecodeTables (
+ &(s->limit[t][0]),
+ &(s->base[t][0]),
+ &(s->perm[t][0]),
+ &(s->len[t][0]),
+ minLen, maxLen, alphaSize
+ );
+ s->minLens[t] = minLen;
+ }
+
+ /*--- Now the MTF values ---*/
+
+ EOB = s->nInUse+1;
+ nblockMAX = 100000 * s->blockSize100k;
+ groupNo = -1;
+ groupPos = 0;
+
+ for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
+
+ /*-- MTF init --*/
+ {
+ Int32 ii, jj, kk;
+ kk = MTFA_SIZE-1;
+ for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
+ for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+ s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
+ kk--;
+ }
+ s->mtfbase[ii] = kk + 1;
+ }
+ }
+ /*-- end MTF init --*/
+
+ nblock = 0;
+ GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
+
+ while (True) {
+
+ if (nextSym == EOB) break;
+
+ if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
+
+ es = -1;
+ N = 1;
+ do {
+ if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
+ if (nextSym == BZ_RUNB) es = es + (1+1) * N;
+ N = N * 2;
+ GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
+ }
+ while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
+
+ es++;
+ uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
+ s->unzftab[uc] += es;
+
+ if (s->smallDecompress)
+ while (es > 0) {
+ if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+ s->ll16[nblock] = (UInt16)uc;
+ nblock++;
+ es--;
+ }
+ else
+ while (es > 0) {
+ if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+ s->tt[nblock] = (UInt32)uc;
+ nblock++;
+ es--;
+ };
+
+ continue;
+
+ } else {
+
+ if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+
+ /*-- uc = MTF ( nextSym-1 ) --*/
+ {
+ Int32 ii, jj, kk, pp, lno, off;
+ UInt32 nn;
+ nn = (UInt32)(nextSym - 1);
+
+ if (nn < MTFL_SIZE) {
+ /* avoid general-case expense */
+ pp = s->mtfbase[0];
+ uc = s->mtfa[pp+nn];
+ while (nn > 3) {
+ Int32 z = pp+nn;
+ s->mtfa[(z) ] = s->mtfa[(z)-1];
+ s->mtfa[(z)-1] = s->mtfa[(z)-2];
+ s->mtfa[(z)-2] = s->mtfa[(z)-3];
+ s->mtfa[(z)-3] = s->mtfa[(z)-4];
+ nn -= 4;
+ }
+ while (nn > 0) {
+ s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
+ };
+ s->mtfa[pp] = uc;
+ } else {
+ /* general case */
+ lno = nn / MTFL_SIZE;
+ off = nn % MTFL_SIZE;
+ pp = s->mtfbase[lno] + off;
+ uc = s->mtfa[pp];
+ while (pp > s->mtfbase[lno]) {
+ s->mtfa[pp] = s->mtfa[pp-1]; pp--;
+ };
+ s->mtfbase[lno]++;
+ while (lno > 0) {
+ s->mtfbase[lno]--;
+ s->mtfa[s->mtfbase[lno]]
+ = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
+ lno--;
+ }
+ s->mtfbase[0]--;
+ s->mtfa[s->mtfbase[0]] = uc;
+ if (s->mtfbase[0] == 0) {
+ kk = MTFA_SIZE-1;
+ for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
+ for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+ s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
+ kk--;
+ }
+ s->mtfbase[ii] = kk + 1;
+ }
+ }
+ }
+ }
+ /*-- end uc = MTF ( nextSym-1 ) --*/
+
+ s->unzftab[s->seqToUnseq[uc]]++;
+ if (s->smallDecompress)
+ s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
+ s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]);
+ nblock++;
+
+ GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
+ continue;
+ }
+ }
+
+ /* Now we know what nblock is, we can do a better sanity
+ check on s->origPtr.
+ */
+ if (s->origPtr < 0 || s->origPtr >= nblock)
+ RETURN(BZ_DATA_ERROR);
+
+ s->state_out_len = 0;
+ s->state_out_ch = 0;
+ BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
+ s->state = BZ_X_OUTPUT;
+ if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
+
+ /*-- Set up cftab to facilitate generation of T^(-1) --*/
+ s->cftab[0] = 0;
+ for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
+ for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
+
+ if (s->smallDecompress) {
+
+ /*-- Make a copy of cftab, used in generation of T --*/
+ for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
+
+ /*-- compute the T vector --*/
+ for (i = 0; i < nblock; i++) {
+ uc = (UChar)(s->ll16[i]);
+ SET_LL(i, s->cftabCopy[uc]);
+ s->cftabCopy[uc]++;
+ }
+
+ /*-- Compute T^(-1) by pointer reversal on T --*/
+ i = s->origPtr;
+ j = GET_LL(i);
+ do {
+ Int32 tmp = GET_LL(j);
+ SET_LL(j, i);
+ i = j;
+ j = tmp;
+ }
+ while (i != s->origPtr);
+
+ s->tPos = s->origPtr;
+ s->nblock_used = 0;
+ if (s->blockRandomised) {
+ BZ_RAND_INIT_MASK;
+ BZ_GET_SMALL(s->k0); s->nblock_used++;
+ BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
+ } else {
+ BZ_GET_SMALL(s->k0); s->nblock_used++;
+ }
+
+ } else {
+
+ /*-- compute the T^(-1) vector --*/
+ for (i = 0; i < nblock; i++) {
+ uc = (UChar)(s->tt[i] & 0xff);
+ s->tt[s->cftab[uc]] |= (i << 8);
+ s->cftab[uc]++;
+ }
+
+ s->tPos = s->tt[s->origPtr] >> 8;
+ s->nblock_used = 0;
+ if (s->blockRandomised) {
+ BZ_RAND_INIT_MASK;
+ BZ_GET_FAST(s->k0); s->nblock_used++;
+ BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
+ } else {
+ BZ_GET_FAST(s->k0); s->nblock_used++;
+ }
+
+ }
+
+ RETURN(BZ_OK);
+
+
+
+ endhdr_2:
+
+ GET_UCHAR(BZ_X_ENDHDR_2, uc);
+ if (uc != 0x72) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_ENDHDR_3, uc);
+ if (uc != 0x45) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_ENDHDR_4, uc);
+ if (uc != 0x38) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_ENDHDR_5, uc);
+ if (uc != 0x50) RETURN(BZ_DATA_ERROR);
+ GET_UCHAR(BZ_X_ENDHDR_6, uc);
+ if (uc != 0x90) RETURN(BZ_DATA_ERROR);
+
+ s->storedCombinedCRC = 0;
+ GET_UCHAR(BZ_X_CCRC_1, uc);
+ s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+ GET_UCHAR(BZ_X_CCRC_2, uc);
+ s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+ GET_UCHAR(BZ_X_CCRC_3, uc);
+ s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+ GET_UCHAR(BZ_X_CCRC_4, uc);
+ s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+
+ s->state = BZ_X_IDLE;
+ RETURN(BZ_STREAM_END);
+
+ default: AssertH ( False, 4001 );
+ }
+
+ AssertH ( False, 4002 );
+
+ save_state_and_return:
+
+ s->save_i = i;
+ s->save_j = j;
+ s->save_t = t;
+ s->save_alphaSize = alphaSize;
+ s->save_nGroups = nGroups;
+ s->save_nSelectors = nSelectors;
+ s->save_EOB = EOB;
+ s->save_groupNo = groupNo;
+ s->save_groupPos = groupPos;
+ s->save_nextSym = nextSym;
+ s->save_nblockMAX = nblockMAX;
+ s->save_nblock = nblock;
+ s->save_es = es;
+ s->save_N = N;
+ s->save_curr = curr;
+ s->save_zt = zt;
+ s->save_zn = zn;
+ s->save_zvec = zvec;
+ s->save_zj = zj;
+ s->save_gSel = gSel;
+ s->save_gMinlen = gMinlen;
+ s->save_gLimit = gLimit;
+ s->save_gBase = gBase;
+ s->save_gPerm = gPerm;
+
+ return retVal;
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end decompress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/depend.mak b/Build/source/utils/bzip2/depend.mak
new file mode 100644
index 00000000000..da948ec1e18
--- /dev/null
+++ b/Build/source/utils/bzip2/depend.mak
@@ -0,0 +1,46 @@
+$(objdir)/mk251.obj: \
+
+
+$(objdir)/dlltest.obj: \
+ bzlib.h
+
+$(objdir)/huffman.obj: \
+ bzlib_private.h \
+ bzlib.h
+
+$(objdir)/crctable.obj: \
+ bzlib_private.h \
+ bzlib.h
+
+$(objdir)/compress.obj: \
+ bzlib_private.h \
+ bzlib.h
+
+$(objdir)/unzcrash.obj: \
+ bzlib.h
+
+$(objdir)/bzip2recover.obj: \
+
+
+$(objdir)/randtable.obj: \
+ bzlib_private.h \
+ bzlib.h
+
+$(objdir)/bzip2.obj: \
+ bzlib.h
+
+$(objdir)/spewG.obj: \
+
+
+$(objdir)/bzlib.obj: \
+ bzlib_private.h \
+ bzlib.h
+
+$(objdir)/decompress.obj: \
+ bzlib_private.h \
+ bzlib.h
+
+$(objdir)/blocksort.obj: \
+ bzlib_private.h \
+ bzlib.h
+
diff --git a/Build/source/utils/bzip2/dlltest.c b/Build/source/utils/bzip2/dlltest.c
new file mode 100644
index 00000000000..eb86bb61a59
--- /dev/null
+++ b/Build/source/utils/bzip2/dlltest.c
@@ -0,0 +1,176 @@
+/*
+ minibz2
+ libbz2.dll test program.
+ by Yoshioka Tsuneo(QWF00133@nifty.ne.jp/tsuneo-y@is.aist-nara.ac.jp)
+ This file is Public Domain.
+ welcome any email to me.
+
+ usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
+*/
+
+#define BZ_IMPORT
+#include <stdio.h>
+#include <stdlib.h>
+#include "bzlib.h"
+#ifdef _WIN32
+#include <io.h>
+#endif
+
+
+#ifdef _WIN32
+
+#define BZ2_LIBNAME "libbz2-1.0.2.DLL"
+
+#include <windows.h>
+static int BZ2DLLLoaded = 0;
+static HINSTANCE BZ2DLLhLib;
+int BZ2DLLLoadLibrary(void)
+{
+ HINSTANCE hLib;
+
+ if(BZ2DLLLoaded==1){return 0;}
+ hLib=LoadLibrary(BZ2_LIBNAME);
+ if(hLib == NULL){
+ fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
+ return -1;
+ }
+ BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
+ BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
+ BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
+ BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
+ BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
+ BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
+ BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
+ BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
+
+ if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
+ || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
+ || !BZ2_bzclose || !BZ2_bzerror) {
+ fprintf(stderr,"GetProcAddress failed.\n");
+ return -1;
+ }
+ BZ2DLLLoaded=1;
+ BZ2DLLhLib=hLib;
+ return 0;
+
+}
+int BZ2DLLFreeLibrary(void)
+{
+ if(BZ2DLLLoaded==0){return 0;}
+ FreeLibrary(BZ2DLLhLib);
+ BZ2DLLLoaded=0;
+}
+#endif /* WIN32 */
+
+void usage(void)
+{
+ puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
+}
+
+int main(int argc,char *argv[])
+{
+ int decompress = 0;
+ int level = 9;
+ char *fn_r = NULL;
+ char *fn_w = NULL;
+
+#ifdef _WIN32
+ if(BZ2DLLLoadLibrary()<0){
+ fprintf(stderr,"Loading of %s failed. Giving up.\n", BZ2_LIBNAME);
+ exit(1);
+ }
+ printf("Loading of %s succeeded. Library version is %s.\n",
+ BZ2_LIBNAME, BZ2_bzlibVersion() );
+#endif
+ while(++argv,--argc){
+ if(**argv =='-' || **argv=='/'){
+ char *p;
+
+ for(p=*argv+1;*p;p++){
+ if(*p=='d'){
+ decompress = 1;
+ }else if('1'<=*p && *p<='9'){
+ level = *p - '0';
+ }else{
+ usage();
+ exit(1);
+ }
+ }
+ }else{
+ break;
+ }
+ }
+ if(argc>=1){
+ fn_r = *argv;
+ argc--;argv++;
+ }else{
+ fn_r = NULL;
+ }
+ if(argc>=1){
+ fn_w = *argv;
+ argc--;argv++;
+ }else{
+ fn_w = NULL;
+ }
+ {
+ int len;
+ char buff[0x1000];
+ char mode[10];
+
+ if(decompress){
+ BZFILE *BZ2fp_r = NULL;
+ FILE *fp_w = NULL;
+
+ if(fn_w){
+ if((fp_w = fopen(fn_w,"wb"))==NULL){
+ printf("can't open [%s]\n",fn_w);
+ perror("reason:");
+ exit(1);
+ }
+ }else{
+ fp_w = stdout;
+ }
+ if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
+ || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
+ printf("can't bz2openstream\n");
+ exit(1);
+ }
+ while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
+ fwrite(buff,1,len,fp_w);
+ }
+ BZ2_bzclose(BZ2fp_r);
+ if(fp_w != stdout) fclose(fp_w);
+ }else{
+ BZFILE *BZ2fp_w = NULL;
+ FILE *fp_r = NULL;
+
+ if(fn_r){
+ if((fp_r = fopen(fn_r,"rb"))==NULL){
+ printf("can't open [%s]\n",fn_r);
+ perror("reason:");
+ exit(1);
+ }
+ }else{
+ fp_r = stdin;
+ }
+ mode[0]='w';
+ mode[1] = '0' + level;
+ mode[2] = '\0';
+
+ if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
+ || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
+ printf("can't bz2openstream\n");
+ exit(1);
+ }
+ while((len=fread(buff,1,0x1000,fp_r))>0){
+ BZ2_bzwrite(BZ2fp_w,buff,len);
+ }
+ BZ2_bzclose(BZ2fp_w);
+ if(fp_r!=stdin)fclose(fp_r);
+ }
+ }
+#ifdef _WIN32
+ BZ2DLLFreeLibrary();
+#endif
+ return 0;
+}
diff --git a/Build/source/utils/bzip2/dlltest.dsp b/Build/source/utils/bzip2/dlltest.dsp
new file mode 100644
index 00000000000..04819a49563
--- /dev/null
+++ b/Build/source/utils/bzip2/dlltest.dsp
@@ -0,0 +1,93 @@
+# Microsoft Developer Studio Project File - Name="dlltest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ŇW‚ľ‚Č‚˘‚Ĺ‚­‚ž‚ł‚˘ **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=dlltest - Win32 Debug
+!MESSAGE ‚ą‚ę‚Í—LŒř‚ČҲ¸Ě§˛Ů‚Ĺ‚Í‚ ‚č‚Ü‚š‚ńB ‚ą‚ĚĚß۟ު¸Ä‚đËŢŮÄނˇ‚é‚˝‚ß‚É‚Í NMAKE ‚đŽg—p‚ľ‚Ä‚­‚ž‚ł‚˘B
+!MESSAGE [Ҳ¸Ě§˛Ů‚Ě´¸˝Îß°Ä] şĎÝÄނđŽg—p‚ľ‚ÄŽŔs‚ľ‚Ä‚­‚ž‚ł‚˘
+!MESSAGE
+!MESSAGE NMAKE /f "dlltest.mak".
+!MESSAGE
+!MESSAGE NMAKE ‚ĚŽŔsŽž‚ɍ\Ź‚đŽw’č‚Ĺ‚Ť‚Ü‚ˇ
+!MESSAGE şĎÝÄŢ ×˛Ýă‚Ĺϸۂ̐ݒč‚đ’č‹`‚ľ‚Ü‚ˇB—á:
+!MESSAGE
+!MESSAGE NMAKE /f "dlltest.mak" CFG="dlltest - Win32 Debug"
+!MESSAGE
+!MESSAGE ‘I‘đ‰Â”\‚ČËŢŮÄŢ Ó°ÄŢ:
+!MESSAGE
+!MESSAGE "dlltest - Win32 Release" ("Win32 (x86) Console Application" —p)
+!MESSAGE "dlltest - Win32 Debug" ("Win32 (x86) Console Application" —p)
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "dlltest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"minibz2.exe"
+
+!ELSEIF "$(CFG)" == "dlltest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "dlltest_"
+# PROP BASE Intermediate_Dir "dlltest_"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "dlltest_"
+# PROP Intermediate_Dir "dlltest_"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"minibz2.exe" /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "dlltest - Win32 Release"
+# Name "dlltest - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dlltest.c
+# End Source File
+# End Target
+# End Project
diff --git a/Build/source/utils/bzip2/huffman.c b/Build/source/utils/bzip2/huffman.c
new file mode 100644
index 00000000000..293095c170c
--- /dev/null
+++ b/Build/source/utils/bzip2/huffman.c
@@ -0,0 +1,228 @@
+
+/*-------------------------------------------------------------*/
+/*--- Huffman coding low-level stuff ---*/
+/*--- huffman.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------------*/
+#define WEIGHTOF(zz0) ((zz0) & 0xffffff00)
+#define DEPTHOF(zz1) ((zz1) & 0x000000ff)
+#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
+
+#define ADDWEIGHTS(zw1,zw2) \
+ (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \
+ (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
+
+#define UPHEAP(z) \
+{ \
+ Int32 zz, tmp; \
+ zz = z; tmp = heap[zz]; \
+ while (weight[tmp] < weight[heap[zz >> 1]]) { \
+ heap[zz] = heap[zz >> 1]; \
+ zz >>= 1; \
+ } \
+ heap[zz] = tmp; \
+}
+
+#define DOWNHEAP(z) \
+{ \
+ Int32 zz, yy, tmp; \
+ zz = z; tmp = heap[zz]; \
+ while (True) { \
+ yy = zz << 1; \
+ if (yy > nHeap) break; \
+ if (yy < nHeap && \
+ weight[heap[yy+1]] < weight[heap[yy]]) \
+ yy++; \
+ if (weight[tmp] < weight[heap[yy]]) break; \
+ heap[zz] = heap[yy]; \
+ zz = yy; \
+ } \
+ heap[zz] = tmp; \
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbMakeCodeLengths ( UChar *len,
+ Int32 *freq,
+ Int32 alphaSize,
+ Int32 maxLen )
+{
+ /*--
+ Nodes and heap entries run from 1. Entry 0
+ for both the heap and nodes is a sentinel.
+ --*/
+ Int32 nNodes, nHeap, n1, n2, i, j, k;
+ Bool tooLong;
+
+ Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ];
+ Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
+ Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ];
+
+ for (i = 0; i < alphaSize; i++)
+ weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
+
+ while (True) {
+
+ nNodes = alphaSize;
+ nHeap = 0;
+
+ heap[0] = 0;
+ weight[0] = 0;
+ parent[0] = -2;
+
+ for (i = 1; i <= alphaSize; i++) {
+ parent[i] = -1;
+ nHeap++;
+ heap[nHeap] = i;
+ UPHEAP(nHeap);
+ }
+
+ AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
+
+ while (nHeap > 1) {
+ n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+ n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+ nNodes++;
+ parent[n1] = parent[n2] = nNodes;
+ weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
+ parent[nNodes] = -1;
+ nHeap++;
+ heap[nHeap] = nNodes;
+ UPHEAP(nHeap);
+ }
+
+ AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
+
+ tooLong = False;
+ for (i = 1; i <= alphaSize; i++) {
+ j = 0;
+ k = i;
+ while (parent[k] >= 0) { k = parent[k]; j++; }
+ len[i-1] = j;
+ if (j > maxLen) tooLong = True;
+ }
+
+ if (! tooLong) break;
+
+ for (i = 1; i < alphaSize; i++) {
+ j = weight[i] >> 8;
+ j = 1 + (j / 2);
+ weight[i] = j << 8;
+ }
+ }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbAssignCodes ( Int32 *code,
+ UChar *length,
+ Int32 minLen,
+ Int32 maxLen,
+ Int32 alphaSize )
+{
+ Int32 n, vec, i;
+
+ vec = 0;
+ for (n = minLen; n <= maxLen; n++) {
+ for (i = 0; i < alphaSize; i++)
+ if (length[i] == n) { code[i] = vec; vec++; };
+ vec <<= 1;
+ }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbCreateDecodeTables ( Int32 *limit,
+ Int32 *base,
+ Int32 *perm,
+ UChar *length,
+ Int32 minLen,
+ Int32 maxLen,
+ Int32 alphaSize )
+{
+ Int32 pp, i, j, vec;
+
+ pp = 0;
+ for (i = minLen; i <= maxLen; i++)
+ for (j = 0; j < alphaSize; j++)
+ if (length[j] == i) { perm[pp] = j; pp++; };
+
+ for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
+ for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
+
+ for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
+
+ for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
+ vec = 0;
+
+ for (i = minLen; i <= maxLen; i++) {
+ vec += (base[i+1] - base[i]);
+ limit[i] = vec-1;
+ vec <<= 1;
+ }
+ for (i = minLen + 1; i <= maxLen; i++)
+ base[i] = ((limit[i-1] + 1) << 1) - base[i];
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end huffman.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/libbz2.def b/Build/source/utils/bzip2/libbz2.def
new file mode 100644
index 00000000000..4f83fcc6102
--- /dev/null
+++ b/Build/source/utils/bzip2/libbz2.def
@@ -0,0 +1,27 @@
+LIBRARY LIBBZ2
+DESCRIPTION "libbzip2: library for data compression"
+EXPORTS
+ BZ2_bzCompressInit
+ BZ2_bzCompress
+ BZ2_bzCompressEnd
+ BZ2_bzDecompressInit
+ BZ2_bzDecompress
+ BZ2_bzDecompressEnd
+ BZ2_bzReadOpen
+ BZ2_bzReadClose
+ BZ2_bzReadGetUnused
+ BZ2_bzRead
+ BZ2_bzWriteOpen
+ BZ2_bzWrite
+ BZ2_bzWriteClose
+ BZ2_bzWriteClose64
+ BZ2_bzBuffToBuffCompress
+ BZ2_bzBuffToBuffDecompress
+ BZ2_bzlibVersion
+ BZ2_bzopen
+ BZ2_bzdopen
+ BZ2_bzread
+ BZ2_bzwrite
+ BZ2_bzflush
+ BZ2_bzclose
+ BZ2_bzerror
diff --git a/Build/source/utils/bzip2/libbz2.dsp b/Build/source/utils/bzip2/libbz2.dsp
new file mode 100644
index 00000000000..06c1d376251
--- /dev/null
+++ b/Build/source/utils/bzip2/libbz2.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="libbz2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ŇW‚ľ‚Č‚˘‚Ĺ‚­‚ž‚ł‚˘ **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libbz2 - Win32 Debug
+!MESSAGE ‚ą‚ę‚Í—LŒř‚ČҲ¸Ě§˛Ů‚Ĺ‚Í‚ ‚č‚Ü‚š‚ńB ‚ą‚ĚĚß۟ު¸Ä‚đËŢŮÄނˇ‚é‚˝‚ß‚É‚Í NMAKE ‚đŽg—p‚ľ‚Ä‚­‚ž‚ł‚˘B
+!MESSAGE [Ҳ¸Ě§˛Ů‚Ě´¸˝Îß°Ä] şĎÝÄނđŽg—p‚ľ‚ÄŽŔs‚ľ‚Ä‚­‚ž‚ł‚˘
+!MESSAGE
+!MESSAGE NMAKE /f "libbz2.mak".
+!MESSAGE
+!MESSAGE NMAKE ‚ĚŽŔsŽž‚ɍ\Ź‚đŽw’č‚Ĺ‚Ť‚Ü‚ˇ
+!MESSAGE şĎÝÄŢ ×˛Ýă‚Ĺϸۂ̐ݒč‚đ’č‹`‚ľ‚Ü‚ˇB—á:
+!MESSAGE
+!MESSAGE NMAKE /f "libbz2.mak" CFG="libbz2 - Win32 Debug"
+!MESSAGE
+!MESSAGE ‘I‘đ‰Â”\‚ČËŢŮÄŢ Ó°ÄŢ:
+!MESSAGE
+!MESSAGE "libbz2 - Win32 Release" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE "libbz2 - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "libbz2 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"libbz2.dll"
+
+!ELSEIF "$(CFG)" == "libbz2 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"libbz2.dll" /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "libbz2 - Win32 Release"
+# Name "libbz2 - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\blocksort.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib_private.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\crctable.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\decompress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\libbz2.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\randtable.c
+# End Source File
+# End Target
+# End Project
diff --git a/Build/source/utils/bzip2/makefile.msc b/Build/source/utils/bzip2/makefile.msc
new file mode 100644
index 00000000000..6a628a753a0
--- /dev/null
+++ b/Build/source/utils/bzip2/makefile.msc
@@ -0,0 +1,63 @@
+# Makefile for Microsoft Visual C++ 6.0
+# usage: nmake -f makefile.msc
+# K.M. Syring (syring@gsf.de)
+# Fixed up by JRS for bzip2-0.9.5d release.
+
+CC=cl
+CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo
+
+OBJS= blocksort.obj \
+ huffman.obj \
+ crctable.obj \
+ randtable.obj \
+ compress.obj \
+ decompress.obj \
+ bzlib.obj
+
+all: lib bzip2 test
+
+bzip2: lib
+ $(CC) $(CFLAGS) -o bzip2 bzip2.c libbz2.lib setargv.obj
+ $(CC) $(CFLAGS) -o bzip2recover bzip2recover.c
+
+lib: $(OBJS)
+ lib /out:libbz2.lib $(OBJS)
+
+test: bzip2
+ type words1
+ .\\bzip2 -1 < sample1.ref > sample1.rb2
+ .\\bzip2 -2 < sample2.ref > sample2.rb2
+ .\\bzip2 -3 < sample3.ref > sample3.rb2
+ .\\bzip2 -d < sample1.bz2 > sample1.tst
+ .\\bzip2 -d < sample2.bz2 > sample2.tst
+ .\\bzip2 -ds < sample3.bz2 > sample3.tst
+ @echo All six of the fc's should find no differences.
+ @echo If fc finds an error on sample3.bz2, this could be
+ @echo because WinZip's 'TAR file smart CR/LF conversion'
+ @echo is too clever for its own good. Disable this option.
+ @echo The correct size for sample3.ref is 120,244. If it
+ @echo is 150,251, WinZip has messed it up.
+ fc sample1.bz2 sample1.rb2
+ fc sample2.bz2 sample2.rb2
+ fc sample3.bz2 sample3.rb2
+ fc sample1.tst sample1.ref
+ fc sample2.tst sample2.ref
+ fc sample3.tst sample3.ref
+
+
+
+clean:
+ del *.obj
+ del libbz2.lib
+ del bzip2.exe
+ del bzip2recover.exe
+ del sample1.rb2
+ del sample2.rb2
+ del sample3.rb2
+ del sample1.tst
+ del sample2.tst
+ del sample3.tst
+
+.c.obj:
+ $(CC) $(CFLAGS) -c $*.c -o $*.obj
+
diff --git a/Build/source/utils/bzip2/manual.pdf b/Build/source/utils/bzip2/manual.pdf
new file mode 100644
index 00000000000..3688da2ccf1
--- /dev/null
+++ b/Build/source/utils/bzip2/manual.pdf
Binary files differ
diff --git a/Build/source/utils/bzip2/manual.ps b/Build/source/utils/bzip2/manual.ps
new file mode 100644
index 00000000000..41d1a7e44ff
--- /dev/null
+++ b/Build/source/utils/bzip2/manual.ps
@@ -0,0 +1,3991 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: manual.dvi
+%%Pages: 40
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -o manual.ps manual.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 2002.01.05:0052
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (manual.dvi)
+@start
+%DVIPSBitmapFont: Fa cmbxti10 14.4 1
+/Fa 1 47 df<13FCEA03FF000F13804813C05AA25AA2B5FCA31480A214006C5A6C5A6C5A
+EA0FE0121271912B>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmti10 10.95 26
+/Fb 26 122 df<DA0780150EDA3FE0151FDA7870153F4A6C157E902601E03C15FC902603
+C01CEC01F8902607801EEC07F0010FD91F80130F90271F001DE0EB7FE0923A1CFC07FFC0
+013E91391FFF9F80933903F83F004991C7123E6001FC16FC494B5A4D5A033C495A000102
+38495A495E4DC7FC03785B0370137E495D00039138F001F84B485A02015C00014A485A91
+3803800F0207495A4B48C8FC020E137E2600F01E5B4A5B9039787001F090383FE0039027
+0F8007E013F090C7390FC007FC92391F800F0E92393F001E07033E133C4B903878038003
+FC13F0913801F801913903F003E0EC07E091390FC007C0158091391F000F805C027E131F
+4A1400495A494815074A4914004948133E130F49485D49C7140E017E143C49027C131E49
+161C4848163C0003033C133848485E484816F048485E48C8495A003EED1E03484C5A00FC
+DB0F0EC7FC48ED07FC0070ED01F0404974C34A>37 D<EA01E0EA07F8120FA2EA1FFCA4EA
+0FF8EA0798EA001813381330A21370136013E013C01201EA0380EA07001206120E5A5A5A
+5A5A0E1C7A891C>44 D<120FEA3FC0127FA212FFA31380EA7F00123C0A0A77891C>46
+D<15FE913807FF8091381F07C091387C01F0ECF000494813F8494813780107147C495A49
+C7FC167E133E137EA25BA2485AA2000315FEA25B000715FCA2491301120FA34848EB03F8
+A44848EB07F0A448C7EA0FE0A316C0007E141F12FE1680153FA2481500A2157EA25DA25D
+4813015D6C495A127C4A5A4A5A6C49C7FC143E6C5B380FC1F03803FFC0C648C8FC273F76
+BC2E>48 D<15031507150F151F151E153E157EEC01FEEC03FC1407141FEB01FF90380FFB
+F8EB1FC3EB0E07130015F0A2140FA215E0A2141FA215C0A2143FA21580A2147FA21500A2
+5CA25CA21301A25CA21303A25CA21307A25CA2130FA25CA2131FA25CEB7FE0B612F0A215
+E0203D77BC2E>I<EB03C0EB07F0130FEB1FF8133FA214F0EB1FE014C0EB078090C7FCB3
+EA01E0EA07F0487EA2121FA46C5AEA07B0EA003013701360A213E05B12015B120348C7FC
+1206120E5A5A123012705A5A15397AA61C>59 D<147E49B47E903907C1C38090391F80EF
+C090383F00FF017E137F4914804848133F485AA248481400120F5B001F5C157E485AA215
+FE007F5C90C7FCA21401485C5AA21403EDF0385AA21407EDE078020F1370127C021F13F0
+007E013F13E0003E137FECF3E1261F01E313C03A0F8781E3803A03FF00FF00D800FC133E
+252977A72E>97 D<EB1FC0EA0FFF5CA2EA003FA291C7FCA25BA2137EA213FEA25BA21201
+A25BA21203A25B147E3907F1FF809038F783E09038EF01F013FE390FF800F8A24913FC49
+137C485A157E5B15FE123FA290C7FCA248130115FC127EA2140300FE14F85AA2EC07F0A2
+15E048130F15C0141F15800078EB3F00127C147E003C5B383E01F8381E03E06C485A6CB4
+C7FCEA01F81F4076BE2A>I<EC1FC0ECFFF0903803F03C903807C01E90381F800E90383F
+000F017E133F4913FF485A485A000714FE5B000F14FC48481300A2485AA3127F90C8FCA3
+5A5AA6481403007E1407150F151E003E143C15786C14F0EC03E0390F800F803903E07E00
+3801FFF838003FC0202977A72A>I<EE3F80ED1FFF1700A2ED007FA2167EA216FEA25EA2
+1501A25EA21503A25EA21507A25E147E903801FF8F903807C1CF90391F80EFC090383F00
+FF017E137F5B48486D5A485AA2485A000F92C7FC5B001F5CA24848137EA215FE127F90C7
+5AA214015A485CA2140316384814F0A21407167891380FE070127C021F13F0007E013F5B
+003E137FECF3E1261F01E35B3A0F8781E3802703FF00FFC7FCD800FC133E294077BE2E>
+I<EC3F80903801FFE0903807E0F890381F803CEB3E0001FC131E485A485A12074848133E
+49133C121F4848137C15F8EC03F0397F000FE0ECFF809038FFFC00B512C048C8FCA45AA6
+1506150E151E007C143C15786C14F0EC01E06CEB07C0390F801F003807C0FC3801FFF038
+007F801F2976A72A>I<167C4BB4FC923807C78092380F83C0ED1F87161FED3F3FA2157E
+A21780EE0E004BC7FCA414015DA414035DA30103B512F8A390260007E0C7FCA3140F5DA5
+141F5DA4143F92C8FCA45C147EA414FE5CA413015CA4495AA4495AA4495A121E127F5C12
+FF49C9FCA2EAFE1EEAF83C1270EA7878EA3FE0EA0F802A5383BF1C>I<EB01FC13FF5CA2
+1303A25CA21307A25CA2130FA25CA2131FA25CA2133FA291C8FCEC03F890387F0FFE9138
+3E0F80D97E7813C0ECE007D9FFC013E014801400A2485A5BA25B0003140F16C05BA20007
+141F16805BA2000F143F16005B5D001F147EEDFE074913FCA2003F0101130FEDF80E1300
+161E48ECF01CA2007E1538A200FE1570020013E048EC7FC00038EC1F0028407ABE2E>
+104 D<1478EB01FCA21303A314F8EB00E01400AD137C48B4FC38038F80EA0707000E13C0
+121E121CEA3C0F1238A2EA781F00701380A2EAF03F140012005B137E13FE5BA212015BA2
+12035B1438120713E0000F1378EBC070A214F0EB80E0A2EB81C01383148038078700EA03
+FEEA00F8163E79BC1C>I<EB07F0EA03FF14E0A2EA000FA214C0A2131FA21480A2133FA2
+1400A25BA2137EA213FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121FA2
+5BA2123FA290C7FCA25A1307127EA2EAFE0F130E12FCA2131E131CA2EA7C381378EA3C70
+EA1FE0EA0780144079BE17>108 D<D801F0D93F80137F3D07FC01FFE003FFC03D0F3E07
+C1F80F83F03D0E1F0F00FC1E01F8001E011C90387C3800001C49D97E707F003C01F05C00
+38157F4A5C26783FC05C12704A91C7FC91C7127E00F003FE1301494A5CEA007EA2030114
+0301FE5F495CA203031407000160495C180F03075D0003051F13E0494A1480A2030FEC3F
+810007F001C0495CA2031F91383E0380120F494AEC0700A2033F150E001FEF1E1C4991C7
+EA0FF80007C7000EEC03E0432979A74A>I<D801F0EB3F803A07FC01FFE03A0F3E07C1F8
+3A0E1F0F00FC001E011C137C001C49137E003C13F012385C38783FC012705C91C7FC00F0
+15FE495CEA007EA2150101FE5C5BA2150300015D5B15075E0003020F13704914C0A2031F
+13F00007ED80E05B1681EE01C0120F49EC0380A2EE0700001FEC0F0E49EB07FC0007C7EA
+01F02C2979A733>I<EC1FC0ECFFF8903803F07C90380FC01FEB1F8090393F000F80017E
+14C0491307484814E0485A12075B000F15F0485AA2485AA2ED0FE0127F90C7FCA2151F48
+15C05AA2ED3F80A2ED7F00A248147E007C5C007E13015D4A5A003E495A6C495A4A5A260F
+803EC7FC3807C0FC3801FFF038003F80242977A72E>I<903903E001F890390FF807FE90
+3A1E7C1E0F80903A1C3E3C07C0013C137801389038E003E0EB783F017001C013F0ED8001
+9038F07F0001E015F8147E1603000113FEA2C75AA20101140717F05CA20103140F17E05C
+A20107EC1FC0A24A1480163F010F15005E167E5E131F4B5A6E485A4B5A90393FB80F80DA
+9C1FC7FCEC0FFCEC03E049C9FCA2137EA213FEA25BA21201A25BA21203A2387FFFE0B5FC
+A22D3A80A72E>I<D801F013FC3A07FC07FF803A0F3E0F03C0260E1F1C13E0001EEB380F
+001C1370003CEBE01F123814C0D8783F14C00070903880070092C7FC91C8FC12F05BEA00
+7EA313FE5BA312015BA312035BA312075BA3120F5BA3121F5B0007C9FC232979A726>
+114 D<EC7F80903801FFE0903807C0F890381F003C013E131C013C131E017C133E49137E
+15FEA2000114FCA215706D13007FEBFFC014FC6C13FF15806D13C06D13E0010F13F01300
+140F14071403120C123F387F80011403D8FF0013E0A300FCEB07C000F0EB0F8012700078
+EB1F006C133C381F01F83807FFE0C690C7FC1F297AA725>I<EB01C0EB03F01307A25CA2
+130FA25CA2131FA25CA2133FA291C7FCA2007FB51280B6FC1500D8007EC7FC13FEA25BA2
+1201A25BA21203A25BA21207A25BA2120FA25BA2121F141C1380A2003F133C1438EB0078
+147014F05C495AEA1F03495A6C48C7FCEA07FCEA01F0193A78B81E>I<137C48B4141C26
+038F80137EEA0707000E7F001E15FE121CD83C0F5C12381501EA781F007001805BA2D8F0
+3F1303140000005D5B017E1307A201FE5C5B150F1201495CA2151F0003EDC1C0491481A2
+153F1683EE0380A2ED7F07000102FF13005C01F8EBDF0F00009038079F0E90397C0F0F1C
+90391FFC07F8903907F001F02A2979A731>I<017CEB01C048B4EB07F038038F80EA0707
+000E01C013F8121E001C1403EA3C0F0038EC01F0A2D8781F130000705BA2EAF03F91C712
+E012005B017E130116C013FE5B1503000115805BA2ED07001203495B150EA25DA25D1578
+000114706D5B0000495A6D485AD97E0FC7FCEB1FFEEB03F0252979A72A>I<017C167048
+B491387001FC3A038F8001F8EA0707000E01C015FE001E1403001CEDF000EA3C0F003817
+7C1507D8781F4A133C00701380A2D8F03F130F020049133812005B017E011F14784C1370
+13FE5B033F14F0000192C712E05BA2170100034A14C049137E17031880A2EF070015FE17
+0E00010101141E01F86D131C0000D9039F5BD9FC076D5A903A3E0F07C1E0903A1FFC03FF
+C0902703F0007FC7FC372979A73C>I<137C48B4143826038F8013FCEA0707000E7F001E
+1401001C15F8EA3C0F12381503D8781F14F000701380A2D8F03F1307020013E012005B01
+7E130F16C013FE5B151F1201491480A2153F000315005BA25D157EA315FE5D00011301EB
+F8030000130790387C1FF8EB3FF9EB07E1EB00035DA21407000E5CEA3F80007F495AA24A
+5AD8FF0090C7FC143E007C137E00705B387801F0383803E0381E0FC06CB4C8FCEA03F826
+3B79A72C>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmtt12 14.4 10
+/Fc 10 123 df<EC3FF80103B57E010F14E0013F14F84914FE48B7FC4816C048D9C01F7F
+270FFE00017F49EB007FD81FF0EC1FF848486E7E160748486E7E4914018300FF81A26D16
+80177FA36C5AA26CC9FCCAFCA217FF1800A25E5F16035F16075F160F4C5A163F4C5A5F4C
+5A4B90C7FCED07FE4B5A4B5A4B5A4B5A4B5A4A5B4A90C8FCEC0FFE4A5AEC3FF04A5A4A5A
+495B4990C9FCEB0FFC495A495A495A4948143F485B4890C8EA7F80EA0FFC485A48B8FC5A
+B9FCA36C17007E314A7AC93E>50 D<383FFF805AB57EA37E7EEA003FAEED07FC92383FFF
+8092B512E002C314F802CF8002DF8091B7FCDBF80F1380DBC00113C092C713E04A143F4A
+EC1FF04A15F84A140F4AEC07FCA217034A15FE1701A318FF83A95F18FEA280170318FC6E
+140718F86E140FEF1FF06E143F6EEC7FE06EECFFC0DBC0031380EDF01F92B6120002DF14
+FC02CF5C02C35CD91F8114C090260F807F90C7FC90C7EA0FF8384A7FC83E>98
+D<923803FFF85D4B7FA38181ED0003AEEC1FF0ECFFFE0103EBFF83010F14E34914F3017F
+14FB90B7FC48EBF80F48EBC00191C7FC4848143F4848141F5B4848140F491407123F4914
+03127F5BA312FF90C8FCA97F127FA216077F123F6D140FA26C6C141F6D143F000F157F6C
+6C14FF01FF5B6C6D5A6CD9F01FEBFFFC6C90B500FB13FE6D02F313FF6D14E3010F14C36D
+020113FE010101FC14FC9026003FE0C8FC384A7CC83E>100 D<143E147F4A7E497FA56D
+5B6EC8FC143E91C9FCAC003FB57E5A81A47EC7123FB3B3007FB71280B812C0A56C16802A
+4A76C93E>105 D<007FB512C0B6FC81A47EC7121FB3B3B3A5007FB712F8B812FCA56C16
+F82E4978C83E>108 D<EC1FF0ECFFFE01036D7E010F14E04980017F14FC90B67E489038
+F01FFFECC00748D90001138048486D13C04848EC7FE049143F4848EC1FF049140F003F16
+F8491407A24848EC03FCA448C8EA01FEAA6D1403007F16FCA26D1407A2003F16F86D140F
+6C6CEC1FF0A26C6CEC3FE06D147F6C6CECFFC06D5B6CD9C00713806CD9F01F13006C90B5
+5A6D5C6D5C010F14E001031480010049C7FCEC1FF02F3679B43E>111
+D<ED07FC3B3FFF803FFF804891B512E0B500C314F802CF8002DF806C90B7FC6CDAF80F13
+80D8003FD9C00113C092C713E04A143F4AEC1FF04A15F84A140F4AEC07FCA217034A15FE
+1701A318FF83A95F18FEA280170318FC6E140718F86E140FEF1FF06E143F6EEC7FE06EEC
+FFC0DBC0031380EDF01F92B6120002DF14FC02CF5C02C35C02C114C0DAC07F90C7FCED0F
+F892C9FCB3003FB512C04880B67EA36C5C6C5C384F7FB33E>I<903901FFF00F011F9038
+FE1F8090B612BF000315FF5A5A5A393FFE003F01F01307D87FC0130190C8FC5A48157FA4
+7EEE3F00D87FC091C7FC13F0EA3FFE381FFFF06CEBFFC06C14FE6C6E7EC615E0013F14F8
+010780D9003F7F02007F03071380030013C0003EED3FE0007F151F48150F17F06D1407A3
+7FA26D140F6D15E0161F01FCEC3FC06D14FF9026FFC00F138091B612005E485D013F5C6D
+14E0D8FC0714802778007FF8C7FC2C3677B43E>115 D<147C14FC497EAD003FB712FC5A
+B87EA36C5EA2260001FEC9FCB3A6173FA2EF7F80A76E14FF6D16006F5A9238C007FE9138
+7FF01F92B55A6E5C6E5C6E5C6E1480020149C7FC9138003FF031437DC13E>I<000FB812
+804817C04817E0A418C001C0C712014C13804C1300EE1FFE4C5AEE7FF06C484A5A4B5BC8
+485B4B90C7FC4B5A4B5A4B5A4B5A4B5A4A5B4A5B4A90C8FC4A5A4A5A4A5A4A5A4A5A495B
+495B4990C9FC495A495A4948EC0FC0495A4948EC1FE0485B00075B4890C8FCEA1FFC485A
+485A90B8FCB9FCA46C17C07E33337CB23E>122 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmtt12 13.14 31
+/Fd 31 123 df<903801FFC0010F13F8013F13FF4914C048B67E48814815FC4801007FD8
+1FF8130F01E0EB03FF48480100138049EC7FC0007F153F90C8121F4816E0160F17F07F16
+07A36CC8FC123EC9FCA2160F17E0A2161F17C0163FA2EE7F80EEFF00A24B5A4B5A15074B
+5A4B5A4B5A4B5A4B5A020390C7FC4A5A4A5A4A5A4A5AEC7FC049485A4990C8FC495A495A
+495AEB3FE0EBFFC04849EB03E04890C7EA07F0485A485AEA1FF048B7FC5AB8FCA37E6C16
+E02C447AC338>50 D<003FB6FC4815E0B712F882826C816C16802701FC000113C0923800
+7FE0161FEE0FF0A2160717F81603A6160717F0A2160FEE1FE0163FEE7FC0923801FF8003
+0F130090B65A5E16F08216FEEEFF8017C001FCC7EA7FE0EE1FF0EE07F8160317FCEE01FE
+1600A217FF177FA717FF17FE16011603EE07FC160FEE3FF8EEFFF0003FB7FC4816E0B812
+C01780EEFE006C15F86C15C030437DC238>66 D<DA07FC133C91393FFF807E91B512E001
+03ECF8FE4914FC4914FF5B90383FFE0390387FF000D9FFC0133F4849131F91C7120F4848
+1407485A49140348481401A2485AA248481400A25BA2007F167C90CAFCA35A5AAD7E7EA3
+7F003F167C17FE7FA26C7EA26C6C140117FC6C7E6D14036C6C15F86C6C14076EEB0FF06C
+6D131FD97FF0EB7FE0903A3FFE03FFC06DB612806D15006D5C6D5C010014F0023F13C0DA
+07FCC7FC2F457CC338>I<007FB512F8B7FC16C08216F8826C813A03F8001FFF15070301
+13806F13C0167FEE3FE0161FEE0FF0A2EE07F8A2EE03FCA21601A217FE1600A4177FAD17
+FF17FEA4160117FCA2160317F81607A2EE0FF0161FEE3FE0167FEEFFC04B13805D031F13
+00007FB65AB75A5E5E16C093C7FC6C14F830437DC238>I<007FB712FCB87EA57ED801FC
+C8FCA9177C94C7FCA6ED07C04B7EA590B6FCA79038FC000FA56F5A92C9FCA7EF0F80EF1F
+C0AA007FB8FCB9FCA56C178032437DC238>I<91391FF003C091397FFC07E049B5FC0107
+14CF4914EF4914FF5B90387FF81F9038FFE00748EB800191C7FC4848147F485A49143F48
+5A161F485AA249140F123F5BA2127F90C8EA07C093C7FCA35A5AAA923807FFFC4B13FE4B
+13FF7E7E6F13FE6F13FC9238000FE07F003F151FA27F121F7F163F6C7EA26C6C147F7F6C
+6C14FF6C6C5B6E5A6C6D5A90387FF81F6DB6FC6D14EF6D14CF6D148F0101140F903A007F
+FC07C0DA1FF0C7FC30457CC338>71 D<007FB612F0B712F8A56C15F0260001FCC7FCB3B3
+B1007FB612F0B712F8A56C15F0254377C238>73 D<90380FFFFE90B612E0000315F84881
+48814881A2273FFE000F138001F01301497F49147F4848EC3FC0A290C8121FA44816E0A2
+48150FB3AC6C151FA36C16C0A36D143FA36C6CEC7F806D14FF6D5B01FE130F6CB71200A2
+6C5D6C5D6C5DC615E0010F49C7FC2B457AC338>79 D<003FB512F04814FEB77E16E0826C
+816C813A01FC003FFEED07FF03017F81707E163F161F83160FA7161F5F163F167F4C5A5D
+030790C7FCED3FFE90B65A5E5E5EA282829038FC001FED07FC6F7E150115008282AA18E0
+EF01F0EF03F8A31783EE3F87263FFFE0ECC7F0486D14FFB56C7F18E07013C06C496D1380
+6C496D1300CA12FC35447EC238>82 D<003FB8FC481780B9FCA53BFE0007F0003FA9007C
+EE1F00C792C7FCB3B3A70107B512F04980A56D5C31437DC238>84
+D<267FFFF090387FFFF0B56C90B512F8A56C496D13F0D801FCC73801FC00B3B3A66D1403
+00005EA36D14076D5D6E130F6D6C495A6E133F6D6C495A6D6C495AECFF076D90B5C7FC6D
+5C6D5C6D5C023F13E0020F1380DA03FEC8FC35447FC238>I<D83FFE913803FFE0486C4A
+13F0B56C4913F8A36C90C76C13F06C486E13E0D80FC09138001F80A36C6CED3F00A86C6C
+157EA86C6C5DEC01FC4A7EA24A7EA4D800FC9038DF01F8020F1381A3158F021F13C1A201
+7C5DA2017E14C31507023F13E3A490263E3E035BA2027E13F3A2EC7C01013F14F7A3011F
+5DEC7800A202F813FFA34A137F010F5DA24A133F6D486DC7FC35447FC238>87
+D<001FB712F04816F85AA417F090C8121F17E0EE3FC0167F1780EEFF00A24B5A4B5A123E
+C8485A4B5AA24B5A4B5AA24B5A4BC7FCA24A5A14035D4A5A140F5D4A5A143F5D4A5A14FF
+92C8FC495A13035C495AA2495A495AA2495A495A17F849C7EA01FC485AA2485A485AA248
+5A121F5B485A127F90B7FCB8FCA56C16F82E437BC238>90 D<003FB712804816C0B812E0
+A46C16C06C16802B087A7D38>95 D<EB1FFF90B512E0000314F84814FE4880824881D9F0
+017F9138003FF0ED0FF815076C486D7E6C481301C87FA21500A4EC03FF147F0107B5FC13
+1F90B6FC5A000714C048EBE0004890C7FCEA3FF813E0EA7F8090C8FC5A5AA415017E6C6C
+13036D13076C6CEB3FFFD9FC01B6FC6CB812807E6C816C4A7E6CECF80F6C6CD9C0031300
+D90FFCC9FC31327AB038>97 D<EA3FFE487EB5FCA37E7EC67EACED3FC0913801FFF80207
+13FE021F7F4A804A8091B67E03C07F9139FE001FF802F86D7E4A13034A6D7E5C707E4A80
+188091C8123FA318C0171FA9173F6E1580A2177FA26EECFF00A26E495A6E13034C5A6E49
+5A02FE133F6E6CB45A92B55A6E5C6E5C6E91C7FC6D6C13FCD91E0313F090C7EA7F803244
+7FC238>I<EC3FFF49B512E0010714F8011F8049805B90B7FC48EBE001481300485AEA0F
+F8496D5A4848147C93C7FC485A5B127F90CAFCA35A5AA97E7EA27F123F6D141F6DEC3F80
+121F6C7E01FC147F6C6CECFF006C6C6C5A6C9038F00FFE91B55A6C6C5C6D5C6D5C010714
+80010149C7FC9038003FF0293278B038>I<ED1FFF4B7F5DA38181ED003FACEC7F809038
+03FFF0010F13FC013F13FF4914BF90B7FC5A48EBC07F48EB000FD80FFC7F497F48487F49
+7F485A167F485A163F90C8FCA25A5AA97E6C157FA36D14FF123F6D5B6C7E5D6C6C5B01FC
+5B6C6C133F2603FFC0B6FC6C90B712806C03BF13C06D143F6D13FC6D01F814800107D9E0
+1F1300010090C9FC32447CC238>I<EC3FE0903801FFFC010713FF011F14C04980498090
+B67E489038E03FFC4890380007FE48481301D80FF86D7E49804848158049143F003F16C0
+49141F127F90C8FC17E0160F5A90B7FCA617C048CAFC7E7EA27FA26C7EEE07C06C6CEC0F
+E07F6C7ED807FE141F6DEC3FC06C01C013FF6CD9FC0713806C90B612006D5C6D5C010F5C
+010314E001001480DA1FFCC7FC2B327AB038>I<ED1FF8ED7FFE4AB5FC020714804A14C0
+5C5C91387FF07F15809139FF003F804AEB1F00010191C7FC5CA9003FB612FE4881B8FCA4
+6C5D260001FCC8FCB3AF003FB612E04881A56C5D2A447CC338>I<14F0497E497E497EA4
+6D5A6D5A6D5A91C8FCAB383FFFFC487FB5FCA37E7EC7FCB3AF007FB612F0B712F816FCA3
+16F86C15F0264476C338>105 D<387FFFFEB6FCA57EC77EB3B3B1007FB7FCB81280A56C
+1600294379C238>108 D<023FEB07E03B3FE0FFC01FF8D87FF39038E07FFCD8FFF76D48
+7E90B500F97F15FB6C91B612806C01C1EBF83F00030100EBE01F4902C013C0A24990387F
+800FA2491400A349137EB3A73C3FFF03FFE07FFC4801879038F0FFFEB500C76D13FFA36C
+01874913FE6C01039038E07FFC383080AF38>I<ED7FC03A3FFE01FFF8267FFF0713FEB5
+001F7F4A805C6C90B67E6CECC07F3B007FFE001FE002F8130F4A805C16075C5CA391C7FC
+B3A6273FFFFE03B512E0486D4814F0B6008F14F8A36C020714F06C496C14E035307FAF38
+>I<EC7FC0903803FFF8010F13FE497F017F14C090B67E4881489038C07FF8489038001F
+FC01FC130748486D7E49130148486D7E4980003F168049143F007F16C090C8121FA300FE
+ED0FE0A96C151FA26C16C0A26D143FA26C6CEC7F80A26C6CECFF006D5B6C6C495A6D1307
+6CB4EB1FFC6C9038C07FF86C90B55A6C5D6D5C6D5C010F49C7FC010313F89038007FC02B
+327AB038>I<ED3FC03A3FFE01FFF8267FFF0713FEB5001F7F4A804A806C90B67E6C02C0
+7F3B007FFE001FF802F86D7E4A13034A6D7E5C707E4A80188091C8123FA318C0171FA917
+3F6E1580A2177FA26EECFF00A26E495A6E13034C5A6E495A02FE133F6E6CB45A92B55A6E
+5C6E5C6E91C7FC6E13FC020313F09138007F8092C9FCB0383FFFFE487FB67EA36C91C9FC
+6C5B32487FAF38>I<EEFFC0277FFFC00713F8B5D8E01F13FC037F13FE92B5FC02E114FF
+14E36C01E713813A000FEFFC019139FFF000FE4B137C0380130092C8FCA25C5CA25CA25C
+A45CB2007FB67EB77E82A35E6C5D30307CAF38>114 D<903907FF80F0017FEBF1F848B5
+12FD000714FF5A5A5AEBFC00D87FE0131F0180130F48C71207481403A5007FEC01F001C0
+90C7FCEA3FF013FE381FFFF86CEBFFC0000314F8C614FF013F1480010714E0D9003F13F0
+020013F8ED0FFC1503003CEC01FE007E140000FE15FF167F7EA37F6D14FF16FE01F01303
+6DEB07FC01FF137F91B512F816F016E04815C0D8FC3F1400010F13FCD8780113E0283278
+B038>I<EB01E0497E1307AB003FB712804816C0B8FCA46C1680260007F0C8FCB3A4EE03
+E0EE07F0A66E130F17E06D6C131F6EEB3FC0903901FF81FF92B512806D15006E5B6E5B6E
+13F002075B020190C7FC2C3D7DBB38>I<D83FFE903803FFE0486C497FB55BA36C806C80
+C66CEB0007B3A9160FA2161F163F6E137F6D6C13FFDAF007EBFFE091B712F06D16F87F6D
+14E76D02C713F00100020313E0DA3FF8C8FC35307FAE38>I<000FB712FC4816FE5AA417
+FC0180C7EA1FF8EE3FF0EE7FE0EEFFC04B13804B13006CC7485AC8485A4B5A4B5A4B5A4B
+5A4A5B4A90C7FCEC07FC4A5A4A5A4A5A4A5A49485A4990C8FC495A495A495A495A494814
+7C494814FE485B4890C8FC485A485A485A485A48B7FCB8FCA56C16FC2F2F7DAE38>122
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmbx12 13.14 53
+/Fe 53 122 df<923803FFE092B512FC020714FF021F81027F9038007FC0DAFFF0EB0FE0
+010301C0804990C7EA3FF84948147F4A81494814FF495AA2137F5CA2715A715A715AEF07
+8094C8FCA8EF07FCB9FCA526007FF0C7123F171FB3B3003FB5D8E00FB512F8A53D4D7ECC
+44>12 D<B7FCAA200A7F9C29>45 D<EA07E0EA1FF8EA3FFCEA7FFEA2B5FCA6EA7FFEA2EA
+3FFCEA1FF8EA07E01010778F22>I<177817F8EE01FCA21603A2EE07F8A217F0160FA217
+E0161FA2EE3FC0A21780167FA217005EA24B5AA25E1503A24B5AA25E150FA25E151FA24B
+5AA25E157FA24BC7FCA25D1401A25D1403A24A5AA25D140FA24A5AA25D143FA25D147FA2
+4AC8FCA25C1301A25C1303A2495AA25C130FA2495AA25C133FA25C137FA249C9FCA25B12
+01A2485AA25B1207A25B120FA2485AA25B123FA25B127FA248CAFCA25AA2127CA22E6D79
+D13D>I<15F014011407141F147FEB03FF137FB6FCA313FC1380C7FCB3B3B2007FB712E0
+A52B4777C63D>49 D<ECFFF80107EBFF80013F14F090B612FC4881480101EBFF802707F8
+003F13C0D80FE0010F13E0D81F806D13F0003F80D87FF06D13F86D15FC6D7F00FF16FE6D
+147FA217FF82A36C5A6C5A6C5A6C5AC95A17FEA3EEFFFCA24B13F817F05D17E04B13C017
+804B13004B5A4B5A5EED7FE04B5A4A5B4A90C7FCEC07FC4A5A4A5A4B131FEC3F804AC7FC
+14FE4948143E495AEB07E0495A4948147E49C8FC017E15FE90B7FC4816FC5A5A5A5A5A5A
+B8FC17F8A430477AC63D>I<EC3FFE0103B512E0010F14FC013F14FF90267FE01F7F9026
+FF000713E0D801FC6D7FD803F07F486C6D7FD80FFE817F486D80167FA3805C16FF7E91C7
+5B6C5A6C5AD80020495B90C75C5D5F4B5B5F031F90C7FCED3FFC4AB45A49B512E0168016
+E016FC90C7EA3FFF030713C06F7F6F7F6F7F83707E83A2701380A318C0EA07E0EA1FF848
+7E487EA2B5FCA31880A25E491600127F494A5A6C485D01E05B001F4A5BD80FFC495B2707
+FFC03F13C06C90B65AC64BC7FC013F14F8010714E09026007FFEC8FC32487BC63D>I<EE
+07E0160FA2161F163F167F16FFA25D5D5DA25D5D5DA2157D15FDEC01F915F1EC03E11407
+EC0FC1EC1F811501143F147E14FC14F8EB01F01303EB07E014C0EB0F80131FEB3F00133E
+5B13FC485A485A5B1207485A485A90C7FC123E127E5AB912FCA5C80003EBE000AD023FB6
+12FCA536487DC73D>I<D8038015E001E0140301FC143F9039FFE003FF91B612C0178017
+00A25E5E16F05E5E93C7FC15FC15F001E790C8FC01E0C9FCAAEC1FFC01E1B512C001E714
+F001EF14FC9039FFE01FFFDA0007138001FC6D13C001F06D13E04915F0497F17F8C913FC
+167F17FEA417FFA3EA0FC0EA3FF0487EA2487EA317FEA34914FF6C4815FC5B018015F86C
+C74813F07F6C6C4913E0D80FF04913C0D807FC011F13806CB46CB512006C90B512FC6C5D
+013F14C0010F91C7FC010113F030487AC63D>I<ED7FF8913807FFFE021F6D7E027F8090
+3A01FFF01FE0010790388003F04948486C7E49486D7ED93FF013074948130F01FF4A7E48
+49133F5C5A4890C7FCA25A705A48486E5A705A003F92C8FCA3485AA21520913807FFE002
+1F13FC00FF497F4A6D7EDAFC017F9026FDF0007F4A6D7ED9FFC06D7E4A6D7E8391C7FC83
+82491680A318C05BA3127FA6123FA27F001F1780A3000F4B1300A26C6C5DA26C6D495A6C
+6D5C6C6D495A6D6C48485A90263FFC075B6DB65A6D4AC7FC01035C010014F0020F90C8FC
+32487BC63D>I<121F7F7F13FE90B812E0A45A18C0188018005F5FA25F485E90C8EA07E0
+007E4B5A5F007C151F4CC7FC167E5E485D15014B5A4B5AC8485A4B5AA24BC8FC157EA25D
+1401A24A5A1407A24A5AA2141FA24A5AA2147FA314FFA3495BA45BA55BAA6D5BA26D90C9
+FCEB007C334B79C93D>I<EC1FFF49B512F0010714FC011F14FF90263FF00713C049C77F
+01FCEC3FF04848EC0FF848481407000782491403000F821601A2121F7FA27F13FE6D1403
+02C05C14F002FC495A6C6D130FDAFF805B9238E01FE06C6E485A9238FCFF806C91B5C7FC
+6C15FC6C5D7F6D14FE6D806D15C06D81011F81017F81D9FFDF804813072603FE01804848
+6C804848133F4848010F1480003F8049130148486D6C13C0161F824848140382A282A217
+7FA218807F127FEFFF007F6C6C4A5AA2D81FFC4A5A6C6CEC0FF86C6C6CEB3FF06C9039F0
+03FFE06C90B612806C6C92C7FC011F14FC010714E09026003FFEC8FC32487BC63D>I<EC
+1FFE49B512C0010F14F04914FC90397FFC0FFE903AFFE003FF804849C67F48496D7E4890
+C7FC486F7E484881161F003F825B007F82A28300FF81A31880A518C0A45E127FA3003F5D
+7F121F5E120F6C6C91B5FC6C90388001EF6CEBC0036C9038E00FCF6DB5128F011F140F01
+0701FE1480010113F8903800010091C7FCA24C1300A3D803F85D487E487E486C4A5AA25F
+4C5AA24C5A49495B6C485D49010790C7FC01E0495AD807F8EB3FFC6CB448B45A6C90B55A
+6C15C06D91C8FC011F13FC010313C032487BC63D>I<EE01F8A24C7EA34C7EA24C7EA34C
+7FA24C7FA34C7FA293B57EA34B8016F303038016E316E103078016C0030F805E83031F81
+4C7E4B81153E83037E81037C7F03FC815D830201824B7F0203825D830207824B7F020F82
+5D84021F8392B8FC4A83A34A83027CC8120F02FC835C840101844A810103845C84010784
+4A81010F845C85011F85496C82B600C091B712F0A5544D7CCC5D>65
+D<93261FFF80EB01C00307B500F81303033F02FE13074AB7EA800F0207EEE01F021F903A
+FE007FF83F027F01E0903807FC7F91B5C73801FEFF010301FCEC007F4901F0814901C015
+0F4949814990C97E494882495A48498248197F5C48193F5C48191F5C48190FA2485BA21A
+075AA391CDFCA2B5FCAD7EA280F207C0A27EA36C7F1A0F6C1A80806C191F6E18006C6180
+6C197E6C6D177C6D6C17FC6D6C4C5A6D6D4B5A6D6D4B5A6D01F0ED1FC06D01FC4B5A0100
+01FF03FFC7FC6E01E0EB07FE021F01FEEB3FFC020790B612F0020116C0DA003F92C8FC03
+0714F8DB001F13804A4D79CB59>67 D<B912F0F0FF8019F019FC19FFD8001F9026800001
+14C0DD001F7F060713F806017F726C7E737E737F737F737F8587737F8587A2747EA38786
+A21C80A51CC0A586A462A51C80A51C00A26263A2631AFF636163614F5B634F5B073F90C7
+FC4F5A4F5A06035B061F5B4DB512C0BBC8FC19FC19F0198006F0C9FC524B7CCA5E>I<BB
+12C0A486D8000F01E0C77E18071801F0007F193F191F190F1907861903A31901A3EF0F80
+A2737EA497C7FC171FA2173F177F17FF160392B6FCA5EDE0031600177F173F171FA2050F
+EC0F80A3F21F00A494C8FC621A3EA21A7EA31AFE6219011903A21907190FF13FF819FF18
+03183FBBFCA262A3494A7CC951>I<BBFCA41A80D8001F01C0C7FC181F18038484197F19
+3F191F1AC0190FA31907A4171FF103E0A496C7FCA25FA25F5F5E160792B6FCA5EDC00716
+01828383A283A794C9FCB1B8FCA5434A7CC94D>I<93261FFF80EB01C00307B500F81303
+033F02FE13074AB7EA800F0207EEE01F021F903AFE007FF83F027F01E0903807FC7F91B5
+C73801FEFF010301FCEC007F4901F0814901C0150F4949814990C97E494882495A484982
+48197F5C48193F5C48191F5C48190FA2485BA21A075AA391CEFCA2B5FCAD7E050FB712C0
+80A37E94C7001FEBC000807EA27E807E807E806C7F7E6D7E6D7E6D7F6D01E05D6D6D5D6D
+13FC010001FF4AB5FC6E01E0EB07F9021F01FFEB3FF0020791B5EAE07F0201EEC01FDA00
+3FED0007030702F81301DB001F018090C8FC524D79CB60>I<B7D8FC01B712FCA5D8001F
+01C0C8001FEBC000B3AA92B9FCA503C0C8121FB3AEB7D8FC01B712FCA5564B7BCA60>I<
+B712FEA5D8000FEBE000B3B3B3ABB712FEA5274B7DCA2E>I<B8FCA5D8001F01C0C9FCB3
+B3A4193EA4197E197CA519FCA31801A2F003F8A21807180F181F183F187FEF01FF170717
+3FBA12F0A53F4B7BCA4A>76 D<B600E04DB612806F5FA26F5FA2D8001F09FCC7FC6FEF0F
+7FA2DABFFE171EA2DA9FFF173CA3028F6D1678A202876D16F0A202836DED01E0A302816D
+ED03C0A202806DED0780A26F6CED0F00A36F6C151EA26F6C5DA26F6D5CA26F6D5CA36F6D
+495AA26F6D495AA26F6D495AA3706C49C7FCA2706C131EA2706C5BA3706D5AA2706D5AA2
+70EBE1E0A370EBF3C0A270EBFF80A27190C8FCA2715AA3715AA2715A497EB600F06D4801
+03B71280A3715A715A694B7BCA74>I<B600E092B612FC8181A281D8001F6D9239001FE0
+006F705A82A28202BF7F029F7FA2028F7F02877F02837F8214810280806F7F6F7F83816F
+7F6F7F6F7F83816F80707F707F8482707F707F707FA2707F7014807113C019E0837113F0
+7113F87113FC19FE837113FF71148F7213CF1AEF847213FF8484A284848485A2858585A2
+85858585497EB600F8167F1A3F1A1F1A0FA2564B7BCA60>I<EEFFF8031FEBFFC04AB612
+FC020715FF021FD9C01F13C091277FFE000313F0902601FFF09038007FFC49496E7E4901
+80EC0FFF4990C86C7F49486F7F49486F7F017F8449486F7F4849707EA24849707E4885A2
+4849701380A2481AC04A82A2481AE0A34890CA6C13F0A5B519F8AE6C1AF0A26E5EA36C1A
+E0A26E5E6C1AC0A26C1A806E5E6C1A006E5E6C616E16FF6C616C6D4B5B6D6C4B5B6E5D6D
+6D4A5B6D6D4A5B01076D4A90C7FC6D01F8ECFFFE6D01FE01035B9028007FFFC01F13F002
+1F90B612C0020793C8FC020115FCDA001F14C0030101FCC9FC4D4D79CB5C>I<B912C018
+FCF0FF8019F085D8001F902680000713FE05007F063F1380060F13C07213E01AF0841AF8
+A27213FCA31AFEA81AFCA34E13F8A21AF0601AE04E13C0063F138095B51200050713FC92
+B75A19E096C7FC18F803C0CAFCB3ABB712FCA5474B7BCA54>I<B9FC18F8F0FF8019E019
+F8D8000F9026C0000713FE9439007FFF80061F7F727F727F727F84868684A286A862A24E
+5BA2624E5B4E5B4E5B4E5B95B5C8FC050713FC92B712F0198006FCC9FC18FF9226C0003F
+13C0050713F0717F717F717F187F85727FA28486A786A71C3E86A28474137E72157C726D
+13FCB700FC6D9038FE01F872EBFF8373EBFFF0071F14E007031480CD383FFE00574C7CCA
+5C>82 D<DA7FFCEB01C00103B5EAC003011FECF00749ECFC0F90B7121F48D9E00F13BF48
+90C713FFD807FC141F4848804848140382484880177F485A173F171F12FFA2170F7FA217
+077F7F7F6D92C7FC6D7E6C13F014FF15F86CECFF8016F86C15FF6C16C0836C826C826C82
+6C82013F816D1680010716C01300020F15E01400030714F0ED007F160F16037013F88217
+7F127800F8163FA3171FA27E18F0A27EA26CEE3FE07F18C001E0157F6DEDFF8001FC1600
+01FF140302E0EB0FFED97FFEEB3FFC486CB612F0D8FC0F5DD8F803158048C66C49C7FC48
+010313F0354D79CB44>I<003FBB12C0A5DA80019038FC001FD9FC001601D87FF0943800
+7FE001C0183F49181F90C7170FA2007E1907A3007C1903A500FC1AF0481901A5C894C7FC
+B3B3A749B812FCA54C4A7CC955>I<B700F8023FB512F8A5D8001F01C0C9380FE000745A
+B3B3AD6D180F63811A1F6D96C7FC626D7F1A7E6D7F6D606E6C4B5A6E6CED07F06E6C4B5A
+6E01C0EC3FC06E01F049B45A020101FF011F90C8FC6E91B55A033F15F8030715E0030092
+C9FC040713F0554C7CCA5E>I<B700F00203B6FCA5D8001F01E0C93803FC00745A6D6181
+1A036D6D5F1A076D6D5F1A0F6D616F161FA26D6D94C7FC626E6D153E1A7E6E177C7015FC
+6E5F8219016E6D5D19036E5F7014076E5F82190F6E6D5D191F6E6D92C8FC616F153E8319
+7E6F6D137C19FC6F6D5B18016F5DEFF003A26F01F85B18076F01FC5B180F6F5DEFFE1F6F
+92C9FC17FF607013BE18FE705BA2705BA3705BA2705BA2705BA3705BA27090CAFCA2177E
+A2584C7ECA5D>I<B700F84AB6FCA5D8001F01F0C93803FC006F705A6D4E5A6D6D4C5A81
+6D4E5A6D6D4C5A826D4EC7FC6E6D5D70157E6E5F6E7F704A5A6E4C5A6E7F704A5A6E4C5A
+6E7F71495A6E4CC8FC6F7F71137E6F5D6F7F71485A6F4A5A6F13FC71485A6F4A5A6F13FF
+F09F806F02BFC9FC7013FF60705B8260705B8260B3A7037FB612FEA5584B7ECA5D>89
+D<ECFFFC010FEBFFC0017F14F090B612FC489038803FFF2703FC00077F486C6D7F486C6D
+7F6E7E83707EA3707E6C90C7FC6C5A6C5AC9FCA4ED1FFF021FB5FC49B6FC130F013FEBC0
+3F9038FFFE00000313F04813C04890C7FC485A485AA2485AA2485AA4167FA26D14FF007F
+15EF6D01017F6C6C903907CFFF806C6CD90F8F13FE6C9038E07F076C9038FFFE0300014A
+7ED8003F9038F0007F0103018090C7FC37337CB13C>97 D<EB7FC0B5FCA512037EB3A2ED
+0FFF037F13F002C1B512FC02C714FF9126CFF80F7F9126FFC00113E092C76C7E02FC6E7E
+4A6E7E5C4A6E7E84831980A219C083A319E0AC19C0A25F1980A34D1300606E141F606E4A
+5A6E4A5A02BF4A5A91261F80035B9027FE0FF01F5B496CB548C7FC496C14F849C614E0C8
+D80FFEC8FC3B4D7CCB44>I<91380FFF8091B512F8010314FF010F158090263FFE0013C0
+D97FF8EB1FE0D9FFE0EB3FF04849EB7FF8484913FF4890C7FC5A5B121F5B003FED7FF0EE
+3FE0007FED1FC093C7FC5BA212FFAC127F7FA2123FA26D153E121F6D157E6C167C6C6D14
+FC6C16F86C6D13036C01F0EB07F0D97FFCEB1FE06DB4EBFFC0010F90B5120001035C0100
+14F0020F13802F337CB137>I<EF1FF0EE3FFFA51600177FB3A2EC0FFF91B512E0010314
+F8010F14FE013FEB01FF903A7FF8003FFFD9FFE0130F48497F48497F4890C77E4881485A
+A2485AA3127F5BA212FFAC127FA37F123FA2121F7F000F5D6C6C5C5E6C6D5B6C01E0497F
+6C6D017FEBFFE090393FFE03FE6DB512F801075C010114C09027001FFC00EBC0003B4D7C
+CB44>I<EC0FFF91B512F0010314FC010F14FF90263FFE077F90267FF0007F4948EB3FE0
+4801806D7E48824890C76C7E4848140783485A003F6F7EA3485A701380A312FFA290B8FC
+A401F8CAFCA5127FA27FA2123FA26C6CED0F80A2000F161F6C6C16006E5C6C6D147E6C6D
+5C6C6D495AD97FFCEB07F0903A1FFF803FE06D90B55A010392C7FCD9007F13FC020713C0
+31337DB138>I<ED7FE0913807FFFC021F7F027F7F902601FFE0138049018113C0902607
+FE0113E049485A14F8131FEB3FF0A26F13C0EB7FE06F1380EE3E0093C7FCADB77EA52600
+7FF0C8FCB3B3A2003FB512F8A52B4D7DCC26>I<DA7FFCEB0FF00103B538807FF8011F91
+38F1FFFC4991B512FE90267FF01F13F32701FFC007138348EB0001A248486DEBC1FC000F
+EEE0F849027F1300A2001F82A8000F5EA26D14FF00075E6C6C495BA26CD9C00790C7FC6C
+9038F01FFC4890B55A5ED803C314809026C07FFCC8FC000790CAFCA47FA27F13FC90B612
+FCEEFFC06C16F817FE6C8218806C17C06D16E00003B812F0120FD81FFCC7000F13F8D83F
+F0140049153F4848ED1FFC00FF160F491507A56D150F007F17F86D151F6C6CED3FF06C6C
+ED7FE0D80FFE913801FFC06C6C6C010713806C01F8017F1300C690B612FC013F15F00107
+1580D9003F01F0C7FC37487DB03D>I<EB7FC0B5FCA512037EB3A2923801FFC0030F13F8
+033F13FE4B7F9126C1FE077F9126C3F0037F9138C7C001DACF8080150002DE7F02FC81A2
+5CA25CA35CB3A9B6D8C07FEBFFE0A53B4C7BCB44>I<13FCEA03FF487F487FA2487FA66C
+5BA26C5B6C90C7FCEA00FC90C8FCACEB7FC0B5FCA512037EB3B3B61280A5194D7BCC22>
+I<EB7FC0B5FCA512037EB3B3B3AAB61280A5194C7BCB22>108 D<90287FC001FFE0EC7F
+F8B5010F01FC0103B5FC033F6D010F804B6D6C4814E0DBFE079026C03F817F9126C3F001
+9138FC007F0003D9C7E0DAE1F8806CDA8000D9F1E06D7E02CFC7EBF3C002DE91267FF780
+131F02FC03FFC77FA24A5DA24A5DA34A5DB3A9B6D8C03FB5D8F00FB512FCA55E317BB067
+>I<903A7FC001FFC0B5010F13F8033F13FE4B7F9126C1FE077F9126C3F0037F00039038
+C7C0016CD9CF8080150002DE7F02FC81A25CA25CA35CB3A9B6D8C07FEBFFE0A53B317BB0
+44>I<913807FF80027F13F80103B6FC010F15C090261FFE017F903A7FF0003FF8D9FFC0
+EB0FFC48496D7E4890C76C7E4817804980000F17C048486E13E0A2003F17F049157FA200
+7F17F8A400FF17FCAB007F17F8A36C6CEDFFF0A3001F17E06D5C000F17C06C6C4A13806C
+17006C6D495A6C01E0EB1FFC6D6C495A903A3FFE01FFF0010FB612C0010392C7FCD9007F
+13F80207138036337DB13D>I<90397FC00FFFB5017F13F002C1B512FC02C714FF9126CF
+F80F7F9126FFC00313E0000391C77F6C01FC6E7E4A6E7E5C4A6E7E848319808319C0A471
+13E0AC4D13C0A319805FA219004D5A804D5A6E4A5A6E4A5A02FF495BDB80075B9126EFF0
+1F5B02E7B548C7FC02E314F802E014E0DB0FFEC8FC92CAFCAFB612C0A53B467CB044>I<
+9039FF803FE0B5EBFFF8028113FE02837FDA87E11380EC8F830003D99F0713C06C139E14
+BCA214F8A24A6C13806F13004A6C5A93C7FCA45CB3A7B612E0A52A317CB032>114
+D<90390FFF8070017FEBF1F048B6FC1207380FFC01391FE0003F4848130F491307127F90
+C712035A1501A27FA213E06D90C7FC13FE387FFFF0ECFFC015F06C14FC6C14FF6C15806C
+15C06C15E0C615F0013F14F8010714FCEB007F14019138003FFE150F0078140700F81403
+A26C1401A37E16FC6C14036D14F87F6DEB07F001F8EB1FE001FFEBFFC091B51280D8FC7F
+1400D8F81F13FCD8E00313C027337CB130>I<14F8A61301A41303A21307A2130FA2131F
+133F137F13FF1203000F90B512F0B7FCA426007FF8C7FCB3A6167CAA013F14F880A29039
+1FFE01F0010F1303903907FF87E06DEBFFC06D14806D6C1300EC0FFC26467EC430>I<D9
+7FE0EC3FF0B5EC7FFFA5000315016C81B3AB5EA25EA25E7E6EEB0F7F017F021E7F6E017C
+EBFFE090393FFE01F86DB512F0010714E0010114C09027003FFE00EBC0003B327BB044>
+I<B66C90B512C0A5000101E0C73807F0006E5D6C5F6E140F017F5E80171F013F93C7FC6E
+5C011F153E6E147E6D157C6F13FC6D5DEDC001A26D01E05B16036D5DEDF0076D5DEDF80F
+027F5CEDFC1F023F91C8FC15FE5E021F133EEDFF7E6E137C16FC6E5BA26E5BA36E5BA26E
+5BA26F5AA26FC9FCA23A317DAF41>I<B60081B500FC90387FFFF0A500019026E0000301
+80903803FC006E715A6C6F5E6E6F1303017F61A26E496D1307013F616E6F130F011F4A5E
+A26E6F131F6D4A93C7FCDD9FFC5B6DD9801F153E170F03C06E137E6D023F157C93383E07
+FFDBE07E15FC6DDA7C035C03F015816D02FC5D4C7E03F815C3DA7FF95E9226FDF00013E7
+DA3FFF5E4C137F19FF6E5F4C7FA26E496D90C8FCA26E5E93C7120FA26E486E5AA202015E
+4B1403A26E486E5A54317EAF59>I<007FB500C090387FFFE0A5C601F0C73803F8006E5D
+017F5E6E1407013F5E6E140F011F5E6E141FA26D6D91C7FC5F6D153E6F137E6D157C6F13
+FC6D5DEDF0016D5DEDF803027F5C15FC1607DA3FFE5B160F021F5CEDFF1F6E91C8FC16BF
+6E13BE16FE6E5BA36E5BA26E5BA26F5AA26F5AA26F5AA393C9FC5D153E157E157CD81F80
+13FC486C5B387FE001D8FFF05B14035D14074A5A49485A007F49CAFCEBC07E383F81FC6C
+B45A6C5B6C13C0C648CBFC3B467EAF41>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmtt12 17.28 6
+/Ff 6 123 df<913803FFC0023F13FC49B67E010715F04981013F15FE498190B812C048
+8348D9FC0180489026E0001F7F480180130391C87F48486F7E49153F4848ED0FFF834848
+178083496F13C012FF8319E07FA2187FA36C5A6C5A6C5ACBFCA218FFA219C05FA219805F
+A24D13005F604D5A173F4D5A4D5AA24C5B4C5B4C5B041F90C7FC4C5A4C5A4C5A4B5B4B5B
+4B5B031F5B4B90C8FC4B5AEDFFF84A5B4A5B4A5B021F5B4A90C9FCEC7FFC4A5A495B495B
+010F5B495B4948CAFC4948ED1F804948ED3FC04849ED7FE0485B000F5B4890C9FC4890B8
+FC5ABAFCA56C18C06C18803B5A79D94A>50 D<383FFFF0487F80B5FCA37EA27EEA000FB0
+EE0FFC93B57E030714E0031F14F84B14FE92B7FC02FD8291B87E85DCE01F7FEE000703FC
+01017F4B6D7F03E0143F4B6E7E4B140F8592C87E4A6F1380A34A6F13C0A284A21AE0A219
+7FAA19FFA21AC0A26E5DA24E138080606F1600606F4A5A6F143F6F4A5A6F4A5A6F130303
+FF010F5BDCC03F5B93B65A6102FD93C7FC02FC5D6F5C031F14F0902607F80714C0902603
+F00191C8FC90C8EA3FF043597FD74A>98 D<EC01F0EC07FC4A7EA24A7EA56E5AA26E5AEC
+01F091CAFCAE001FB512FC4880815AA37EA27EC71203B3B3A8003FB812C04817E0A2B912
+F0A36C17E0A26C17C0345974D84A>105 D<003FB512FE4880B77EA57E7EC71201B3B3B3
+B0003FB812FC4817FEBAFCA56C17FE6C17FC385877D74A>108 D<EE0FFC263FFFF090B5
+7E48D9F80714E0DAFC1F14F8B54914FE92B7FC02FD826C90B87E856CDBE01F7FD8000FEC
+000703FC01017F4B6D7F03E0143F4B6E7E4B140F8592C87E4A6F1380A34A6F13C0A284A2
+1AE0A2197FAA19FFA21AC0A26E5DA24E138080606F1600606F4A5A6F143F6F4A5A6F4A5A
+6F130303FF010F5BDCC03F5B93B65A6102FD93C7FC02FC5D6F5C031F14F0030714C00301
+91C8FC9238003FF093CAFCB3A4003FB6FC4881A2B77EA36C5DA26C92CAFC435F7FBE4A>
+112 D<000FB912E04818F04818F8A619F001F0C8000313E04D13C04D13804D13004D5A4D
+5A4D5A6C484A5B6C484A5BC9000F5B4C5B4C90C7FC4C5A4C5A4B5B4B5B4B5B4B5B4B5B4B
+90C8FC4B5A4B5A4A5B4A5B4A5B4A5B4A5B4A90C9FC4A5A4A5A495B495B495B4949EC07E0
+4949EC0FF04948C8EA1FF8495A495A485B485B485B485B4890C9FC485A48B9FCBAFCA66C
+18F06C18E03D3E7BBD4A>122 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmbx12 17.28 28
+/Fg 28 120 df<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007
+C7FCB3B3B3B3007FB91280A6395E74DD51>49 D<913801FFF8021FEBFFC091B612F80103
+15FF010F16C0013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F8
+6E148048486E14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380
+A219FFA283A36C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D
+13E0A294B512C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B
+13804B90C8FC4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC
+7F8092C9FC02FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A
+5A5A5A5ABAFCA219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F001
+0FD9C01F13FC90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0
+486D826E806E82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A61
+4C91C7FC604C5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F8
+17FF91C7003F13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A3
+1AC0EA03FCEA0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485B
+D81FF85F000F5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90
+B65A011F16F0010716C001014BC8FCD9001F14F0020149C9FC426079DD51>I<F01F804E
+7E187F18FFA25F5F5F5FA25F5F5FA294B5FC5E5E5EA25E5EEE3FBFEE7F3FA216FEED01FC
+ED03F8ED07F0A2ED0FE0ED1FC0ED3F8016005D15FE4A5A4A5AA24A5A4A5A4A5A4A5AA24A
+C7FC14FE495A5C1303495A495A495A5C133F49C8FC13FE485AA2485A485A485A5B121F48
+5A48C9FC12FEBCFCA6CA6CEBC000B1037FB8FCA6485E7CDD51>I<4DB5ED03C0057F02F0
+14070407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F033F9127F8007FFE
+13FF92B6C73807FF814A02F0020113C3020702C09138007FE74A91C9001FB5FC023F01FC
+16074A01F08291B54882490280824991CB7E49498449498449498449865D49498490B5FC
+484A84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C7FCA25CA3B5FCB07E
+A380A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E1A00A26C6E616D1BFE6D
+7F6F4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A6E6DEFFF806E01FC4C90
+C7FC020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF913803FFE0033F02F8013F
+1380030F91B648C8FC030117F86F6C16E004071680DC007F02F8C9FC050191CAFC626677
+E375>67 D<B96C90B91280A6D8000102C0C9000102C0C7FCB3B3A293BBFCA604C0C91201
+B3B3A6B96C90B91280A671627AE17E>72 D<B912E0A6C702E0C7FCB3B3B3B3AEB912E0A6
+33627CE13C>I<B700C0083FB612F070627097B7FCA37061D800010DF8C7FC70F103EFA2
+02FD6DF107CFA202FC6DF10F8FA36F6DF01F0FA26F6D183EA26F6D187CA26F6D18F8A36F
+6DEF01F0A26F6DEF03E0A26F6DEF07C0A26F6DEF0F80A3706DEE1F00A2706D163EA2706D
+5EA2706D5EA3706D4B5AA2706D4B5AA2706D4B5AA2706D4B5AA3716D4AC7FCA2716D143E
+A2716D5CA2716D5CA3716D495AA2716D495AA2716D495AA2716D495AA3726D48C8FCA272
+EBC03EA2726D5AA2726D5AA372EBF9F0A272EBFFE0A2725CA2725CA37390C9FCA2735AA2
+735A90381FFFC0B700F86E480207B812F0A3735AA2735A8C627AE199>77
+D<BB7E1AFCF2FFC01BF81BFE757ED800010280C7001F80070114F0736C7F081F7F747F74
+7F7414807414C0A27414E0A21DF0A27513F8A41DFCA91DF8A498B512F0A21DE0A25014C0
+1D8062501400505B505B087F5B4FB512E0071F5C93B9C7FC1BFC1BF01B8008F0C8FC04C0
+CCFCB3B3A2B97EA65E627AE16E>80 D<001FBEFCA64849C79126E0000F148002E0180091
+C8171F498601F81A0349864986A2491B7FA2491B3F007F1DC090C9181FA4007E1C0FA600
+FE1DE0481C07A5CA95C7FCB3B3B3A3021FBAFCA663617AE070>84
+D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD97FE001077F
+D9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D5AEB1FC090
+C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048B512C04891
+C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01F96C6DD903
+F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E011F02FC13
+0F010302F001011400D9001F90CBFC49437CC14E>97 D<903807FF80B6FCA6C6FC7F7FB3
+A8EFFFF8040FEBFF80047F14F00381B612FC038715FF038F010014C0DBBFF0011F7FDBFF
+C001077F93C76C7F4B02007F03F8824B6F7E4B6F13804B17C0851BE0A27313F0A21BF8A3
+7313FCA41BFEAE1BFCA44F13F8A31BF0A24F13E0A24F13C06F17804F1300816F4B5A6F4A
+5B4AB402075B4A6C6C495B9126F83FE0013F13C09127F00FFC03B55A4A6CB648C7FCDAC0
+0115F84A6C15E091C7001F91C8FC90C8000313E04F657BE35A>I<92380FFFF04AB67E02
+0F15F0023F15FC91B77E01039039FE001FFF4901F8010113804901E0010713C049018049
+13E0017F90C7FC49484A13F0A2485B485B5A5C5A7113E0485B7113C048701380943800FE
+0095C7FC485BA4B5FCAE7EA280A27EA2806C18FCA26C6D150119F87E6C6D15036EED07F0
+6C18E06C6D150F6D6DEC1FC06D01E0EC7F806D6DECFF00010701FCEB03FE6D9039FFC03F
+FC010091B512F0023F5D020F1580020102FCC7FCDA000F13C03E437BC148>I<F17FF805
+0FB5FCA6EF000F8484B3A892380FFF804AB512F8020F14FE023FECFF8391B712E3010391
+38807FF3499039F8000FFB011F01E00103B5FC494913004990C87E49488148498148834A
+815A485BA2485BA25AA3485BA4B5FCAE7EA46C7FA37EA26C7FA26C5F806C5F6C6D5D6C6D
+5D017F93B5FC6D6C6C0103806D6D49806D01F0D91FF7EBFFFE6D9039FE01FFE7010190B6
+12876D6CECFE07021F14F8020314E09127003FFE00ECC0004F657BE35A>I<92380FFFC0
+4AB512FC020FECFF80023F15E091B712F80103D9FE037F499039F0007FFF011F01C0011F
+7F49496D7F4990C76C7F49486E7F48498048844A804884485B727E5A5C48717EA35A5C72
+1380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E160FF11F806C183F6C7FF1
+7F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D6DEC3FE0010301FC49B45A
+6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092C8FC030713F041437CC14A
+>I<EE3FFC0307B51280033F14C04AB612F0020715F84A9038F03FFC4AEB807F913A7FFE
+00FFFE4A5A4B4813FF4913F05B4913E0A24913C0A27013FE4949EB7FFCEF3FF8EF1FF0EF
+07C094C7FCB0B812C0A6D8001F01C0C8FCB3B3B0007FB612FCA638657CE431>I<F107F8
+DB7FFEEC3FFE020FB5D8F001B5FC027FDAFE03148049B7128F49DCDFFD13C0010FD9F00F
+EBFFC149D9800114014990C7EBFC0349486E6C7E4948EC3FFF48496E0181138007801300
+48F0C03E97C7FC48496E7FA34884A96C60A36C6D4A5BA26C60A26C6D4A90C8FC6D6C4A5A
+6D6C4A5A6D6D485BDBF00F5B4990B612C060D97C7F4AC9FCD9FC0F14F09126007FFECAFC
+92CCFC1201A47FA27F8014F091B77E18FE6CEFFFC019F06D17FC19FF6D846D846D846D84
+013F8490BAFC0003854801E0C712014890C9000F7F484816014848EE007F4848717E8512
+FF5B85A56D5F007F616D173F003F616D177F6C6C4D5A6C01C003035B6C6D4B5B6C01F803
+1F5BC601FF92B5C7FC6D01F8011F5B011F90B712F8010717E0010094C8FC020F15F0DA00
+3F01FCC9FC4A607CC151>I<903807FF80B6FCA6C6FC7F7FB3A8EF1FFF94B512F0040714
+FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7FDB87F07FDB8FC0814C7F03
+9FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651647BE35A>I<EB
+0FE0EB3FF8497E48B5FCA24880A24880A76C5CA26C91C7FCA238007FFC6D5AEB0FE090C9
+FCAF903807FF80007FB5FCA6C6FC7F7FB3B3AEB712C0A622657BE42C>I<903807FF80B6
+FCA6C6FC7F7FB3B3B3B3ADB712E0A623647BE32C>108 D<902607FF80D91FFFEEFFF8B6
+91B500F00207EBFF80040702FC023F14E0041F02FF91B612F84C6F488193267FE07F6D48
+01037F922781FE001F9027E00FF0007FC6DA83F86D9026F01FC06D7F6DD987F06D4A487F
+6DD98FC0DBF87EC7804C6D027C80039FC76E488203BEEEFDF003BC6E4A8003FC04FF834B
+5FA24B5FA24B94C8FCA44B5EB3B2B7D8F007B7D8803FB612FCA67E417BC087>I<902607
+FF80EB1FFFB691B512F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FC6DA83
+F86D7F6DD987F07F6DD98FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2
+B7D8F007B71280A651417BC05A>I<923807FFE092B6FC020715E0021F15F8027F15FE49
+4848C66C6C7E010701F0010F13E04901C001037F49496D7F4990C87F49486F7E49486F7E
+48496F13804819C04A814819E048496F13F0A24819F8A348496F13FCA34819FEA4B518FF
+AD6C19FEA46C6D4B13FCA36C19F8A26C6D4B13F0A26C19E06C6D4B13C0A26C6D4B13806C
+6D4B13006D6C4B5A6D6D495B6D6D495B010701F0010F13E06D01FE017F5B010090B7C7FC
+023F15FC020715E0020092C8FC030713E048437CC151>I<D90FFFEB0FFCB690383FFF80
+93B512E04B14F04B14F8923907FC7FFC92390FE0FFFEC6EC1F806DD93F0113FF6D133E15
+7E157C15F8A215F07013FEA24BEB7FFCEF3FF8EF0FE04B90C7FCA55DB3B0B712F8A63841
+7BC042>114 D<913A3FFF8007800107B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0
+014890C7121FD80FFC1407D81FF0801600485A007F167F49153FA212FF171FA27F7F7F6D
+92C7FC13FF14E014FF6C14F8EDFFC06C15FC16FF6C16C06C16F06C826C826C826C82013F
+1680010F16C01303D9007F15E0020315F0EC001F1500041F13F81607007C150100FC8117
+7F6C163FA2171F7EA26D16F0A27F173F6D16E06D157F6D16C001FEEDFF806D0203130002
+C0EB0FFE02FCEB7FFC01DFB65A010F5DD8FE0315C026F8007F49C7FC48010F13E035437B
+C140>I<EC07E0A6140FA5141FA3143FA2147FA214FF5BA25B5B5B5B137F48B5FC000F91
+B512FEB8FCA5D8001F01E0C8FCB3AFEF0FC0AC171F6D6D1480A2173F6D16006F5B6D6D13
+7E6D6D5B6DEBFF836EEBFFF86E5C020F14C002035C9126003FFCC7FC325C7DDA3F>I<90
+2607FFC0ED3FFEB60207B5FCA6C6EE00076D826D82B3B3A260A360A2607F60183E6D6D14
+7E4E7F6D6D4948806D6DD907F0ECFF806D01FFEB3FE06D91B55A6E1500021F5C020314F8
+DA003F018002F0C7FC51427BC05A>I<B70081B600FC0103B512FCA6C66C0180C701FCC8
+381FFE006F6FED03F86D047F5F856F6E16076D646F70140F6D705F866F6E161F6D646F4A
+6D143F6D99C7FC4E7F6F616D1B7E6F4A6D14FE6D6395B57E7001FC15016E62DCC0016E13
+036EDBF87F5D05038004E0496C14076E62DCF007ED800F6E4B6C5D050F15C004F8496C14
+1F6E62DCFC1FEDE03F6E4B6C92C8FC053F15F004FE496C5C6E197E7048EDF8FE6E027E6D
+5C05FE15FC4D6D13FD6F601BFF6F496E5BA24D806F60A26F496E5BA24D806F60A26F496E
+90C9FCA294C87E6F5FA26F486F5A047C6F5A6E417DBF75>119 D
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmsy10 10.95 1
+/Fh 1 16 df<EB0FFCEB3FFF90B512C0000314F04880488048804880A2481580A3B712C0
+AA6C1580A36C1500A26C5C6C5C6C5C6C5CC614C0013F90C7FCEB0FFC22227BA72D>15
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmtt10 10.95 89
+/Fi 89 127 df<121C127FEAFF80B3EA7F00B2123EC7FCA8121C127FA2EAFF80A3EA7F00
+A2121C09396DB830>33 D<00101304007C131F00FEEB3F80A26C137FA248133FB2007E14
+00007C7F003C131E00101304191C75B830>I<903907C007C0A2496C487EA8011F131FA2
+02C05BA3007FB7FCA2B81280A36C16006C5D3A007F807F80A2020090C7FCA9495BA2003F
+90B512FE4881B81280A36C1600A22701FC01FCC7FCA300031303A201F85BA76C486C5AA2
+29387DB730>I<EB07E0EB1FF8497E137F497E803801FC7F497E810003131F13F0A6143F
+92C8FC91387F0FFF9026F87E1F1380000113FEEBF9FC13FB4A6C1300D9FFF013C06C13E0
+151F02C05BEB7F809038FF003F4892C7FC485C48EB807E5A15FE391FDFC0FC383F8FE014
+E1397F07F1F8EB03F300FEEBFBF0EB01FF5D7FEDC006027F130F91393F801F8015C06C13
+7F6CEBFFE049EBF83F018701FC1300263FFFFBB5FC6C01F15B14E06C9038C03FFC000390
+38001FF8D801FCEB07E0293A7DB830>38 D<EA07C0EA0FF0EA1FF8A213FCA213FE120F12
+07EA007EA513FE13FCA2120113F81203EA07F0120FEA1FE0127FEAFFC013801300127C12
+380F1D70B730>I<141E147F14FF5BEB03FEEB07FCEB0FF0EB1FE0EB3FC0EB7F80EBFF00
+485A5B12035B485A120F5BA2485AA2123F5BA2127F90C7FCA412FEAD127FA47F123FA27F
+121FA26C7EA27F12076C7E7F12017F6C7EEB7F80EB3FC0EB1FE0EB0FF0EB07FCEB03FEEB
+01FF7F147F141E184771BE30>I<127812FE7E7F6C7E6C7EEA0FF06C7E6C7E6C7E6C7EEB
+7F80133F14C0131FEB0FE014F01307A2EB03F8A214FC1301A214FE1300A4147FAD14FEA4
+130114FCA2130314F8A2EB07F0A2130F14E0EB1FC0133F1480137FEBFF00485A485A485A
+485AEA3FE0485A485A90C7FC5A1278184778BE30>I<14E0497E497EA60038EC0380007E
+EC0FC0D8FF83EB3FE001C3137F9038F3F9FF267FFBFB13C06CB61280000FECFE00000314
+F86C5C6C6C13C0011F90C7FC017F13C048B512F04880000F14FE003FECFF80267FFBFB13
+C026FFF3F913E09038C3F87F0183133FD87E03EB0FC00038EC0380000091C7FCA66D5A6D
+5A23277AAE30>I<143EA2147FAF007FB7FCA2B81280A36C1600A2C76CC8FCAF143EA229
+297DAF30>I<EA03E0EA0FF0EA1FF813FCEA3FFEA213FFA27EA27E1203EA007FA2137E13
+FEEA01FC1203EA07F8EA3FF0127FEAFFE0EA7F801300123C1019708B30>I<007FB612F0
+A2B712F8A36C15F0A225077B9E30>I<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0
+EA0F000C0C6E8B30>I<16F01501ED03F8A21507A2ED0FF0A2ED1FE0A2ED3FC0A2ED7F80
+A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA24A5AA24A5AA24AC7FCA2495AA25C13
+03A2495AA2495AA2495AA2495AA2495AA249C8FCA2485AA25B1203A2485AA2485AA2485A
+A2485AA2485AA248C9FCA25AA2127CA225477BBE30>I<14FE903807FFC0497F013F13F8
+497F90B57E48EB83FF4848C6138049137F4848EB3FC04848EB1FE049130F001F15F04913
+07A24848EB03F8A290C712014815FCA400FEEC00FEAD6C14016C15FCA36D1303003F15F8
+A26D1307001F15F0A26D130F6C6CEB1FE0A26C6CEB3FC06C6CEB7F806D13FF2601FF8313
+006CEBFFFE6D5B6D5B010F13E06D5BD900FEC7FC273A7CB830>I<EB03C0497EA2130FA2
+131FA2133F137F13FF1203123FB5FCA213EF138FEA7E0F1200B3B0003FB512F84814FCB6
+12FEA26C14FC6C14F81F3977B830>I<EB07FC90383FFFC090B512F00003804814FE4880
+261FF80F1380263FE00113C09038C0007F4848EB3FE090C7121FED0FF04814075A6C15F8
+1503A3127E1218C8FCA2150716F0150F16E0151F16C0153FED7F8015FF4A13005DEC07FC
+4A5A4A5A4A5A4A5A4A5A4990C7FC495A495AEB0FF0EB3FE0495A495A4890C8FC4848EB01
+F04848EB03F8485AEA1FE048B6FCB7FCA37E6C15F025397BB830>I<EB03FF013F13E090
+B512F84814FE4880481580260FFE0113C09038F0007F4848EB1FE0150F16F01507A26C5A
+6C5AC8FC150F16E0A2151FED3FC0157FEDFF8002071300903807FFFE495B5D8115FF6D14
+80D9000113C09138003FE0ED1FF0ED07F8150316FC150116FE1500A21218127EB4FCA215
+0116FC4814036C15F86C6C13076DEB1FF0D83FF0133F3A1FFE01FFE06CB612C06C15806C
+ECFE00C65C013F13F001031380273A7CB830>I<EC03FC4A7E140F141FA2143F147F157E
+14FEA2EB01FCEB03F8A2EB07F0A2EB0FE0EB1FC0A2EB3F80A2EB7F0013FEA2485A485AA2
+485AA2485A485AA2485AA248C7FC12FEB8FC1780A46C1600C8007EC7FCAA91387FFFFE91
+B6FCA46E5B29397DB830>I<000FB612804815C05AA316800180C8FCAEEB83FF019F13C0
+90B512F015FC8181D9FE0313809039F0007FC049133F0180EB1FE06CC7120F000E15F0C8
+1207A216F81503A31218127EA2B4FC150716F048140F6C15E06C141F6DEB3FC06D137F3A
+3FE001FF80261FFC0F13006CB55A6C5C6C5C6C14E06C6C1380D90FFCC7FC25397BB730>
+I<EC0FF8EC7FFF49B51280010714E0131F4914F090387FF80F9039FFC007F84813803803
+FE005B485A4848EB03F0ED01E0484890C7FC5B123F5BA2127FEB000C903803FFE0010F13
+F8D8FF3F13FE48B6FCB7128016C09039FE007FE001F8EB1FF001E0130F49EB07F849EB03
+FCA290C7120116FE1500A37EA46C7E15016D14FC121F6D1303000FEC07F86D130F6C6CEB
+1FF06DEB3FE03A03FF81FFC06C90B512806C15006D5B011F13F8010713E001011380273A
+7CB830>I<127CB712FC16FEA416FC48C7EA0FF816F0ED1FE0007CEC3FC0C8EA7F80EDFF
+00A24A5A4A5A5D14075D140F5D4A5AA24A5AA24AC7FCA25C5C13015CA213035CA213075C
+A4495AA6131F5CA96D5A6DC8FC273A7CB830>I<49B4FC011F13F0017F13FC90B57E0003
+ECFF804815C048010113E03A1FF8003FF049131FD83FC0EB07F8A24848EB03FC90C71201
+A56D1303003F15F86D13076C6CEB0FF06C6CEB1FE0D807FCEB7FC03A03FF83FF806C90B5
+12006C6C13FC011F13F0497F90B512FE48802607FE0013C0D80FF8EB3FE0D81FE0EB0FF0
+4848EB07F8491303007F15FC90C712014815FE481400A66C14016C15FC6D1303003F15F8
+6D1307D81FF0EB1FF06D133F3A0FFF01FFE06C90B512C06C1580C6ECFE006D5B011F13F0
+010190C7FC273A7CB830>I<49B4FC010F13E0013F13F890B57E4880488048010113803A
+0FFC007FC0D81FF0EB3FE04848131F49EB0FF048481307A290C7EA03F85A4815FC1501A4
+16FEA37E7E6D1303A26C6C13076C6C130F6D133FD80FFC13FF6CB6FC7E6C14FE6C14F901
+3FEBE1FC010F138190380060011400ED03F8A2150716F0150F000F15E0486C131F486CEB
+3FC0157FEDFF804A1300EC07FE391FF01FFC90B55A6C5C6C5C6C1480C649C7FCEB3FF027
+3A7CB830>I<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F00C7FCAF120FEA3F
+C0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C276EA630>I<EA03C0EA0FF0EA1FF8A2
+EA3FFCA4EA1FF8A2EA0FF0EA03C0C7FCAFEA03C0EA0FF0121F13F8123F13FCA3121FA212
+0F12031200120113F8120313F01207EA1FE0123FEA7FC0EAFF80EA7F00127E12380E3470
+A630>I<16F01503ED07F8151F157FEDFFF014034A13C0021F138091383FFE00ECFFF849
+5B010713C0495BD93FFEC7FC495A3801FFF0485B000F13804890C8FCEA7FFC5BEAFFE05B
+7FEA7FF87FEA1FFF6C7F000313E06C7F38007FFC6D7E90380FFF806D7F010113F06D7FEC
+3FFE91381FFF80020713C06E13F01400ED7FF8151F1507ED03F01500252F7BB230>I<00
+7FB7FCA2B81280A36C16006C5DCBFCA7003FB612FE4881B81280A36C1600A229157DA530
+>I<1278127EB4FC13C07FEA7FF813FEEA1FFF6C13C000037F6C13F86C6C7EEB1FFF6D7F
+010313E06D7F9038007FFC6E7E91380FFF806E13C0020113F080ED3FF8151F153FEDFFF0
+5C020713C04A138091383FFE004A5A903801FFF0495B010F13804990C7FCEB7FFC48485A
+4813E0000F5B4890C8FCEA7FFE13F8EAFFE05B90C9FC127E1278252F7BB230>I<EC1FE0
+ECFFF8010313FE010F7F4914804914C090397FF03FE09038FF800F4890380007F0D803FC
+13033A07F801FBF89038F007FF380FE01F4A13FCEA1FC0495A003FEBFF0F903800FE0790
+3901FC03FE007FEBF801EA7E03ECF000A2EAFE0700FC49137EAA00FE6D13FED87E0314FC
+A2ECF801D87F0114F8003FEBFC03903900FE07F0903880FF0F001F90387FFFE06D6C13C0
+EA0FE06E13803A07F007FE009038F801F86C6CC7127C6CB414FE6CEB800390387FF01F6D
+B512FC6D14F86D14E0010314C00100EBFE00EC1FF0273A7CB830>64
+D<147F4A7EA2497FA4497F14F7A401077F14E3A3010F7FA314C1A2011F7FA490383F80FE
+A590387F007FA4498049133F90B6FCA34881A39038FC001F00038149130FA40007814913
+07A2D87FFFEB7FFFB56CB51280A46C496C130029397DB830>I<007FB512F0B612FE6F7E
+82826C813A03F8001FF815076F7E1501A26F7EA615015EA24B5A1507ED1FF0ED7FE090B6
+5A5E4BC7FC6F7E16E0829039F8000FF8ED03FC6F7E1500167FA3EE3F80A6167F1700A25E
+4B5A1503ED1FFC007FB6FCB75A5E16C05E6C02FCC7FC29387EB730>I<91387F803C9039
+03FFF03E49EBFC7E011F13FE49EBFFFE5B9038FFE07F48EB801F3903FE000F484813075B
+48481303A2484813015B123F491300A2127F90C8FC167C16005A5AAC7E7EA2167C6D14FE
+123FA27F121F6D13016C6C14FCA26C6CEB03F86D13076C6CEB0FF03901FF801F6C9038E0
+7FE06DB512C06D14806D1400010713FC6D13F09038007FC0273A7CB830>I<003FB512E0
+4814FCB67E6F7E6C816C813A03F8007FF0ED1FF8150F6F7E6F7E15016F7EA2EE7F80A216
+3F17C0161FA4EE0FE0AC161F17C0A3163F1780A2167F17005E4B5A15034B5A150F4B5AED
+7FF0003FB65A485DB75A93C7FC6C14FC6C14E02B387FB730>I<007FB7FCB81280A47ED8
+03F8C7123FA8EE1F0093C7FCA4157C15FEA490B5FCA6EBF800A4157C92C8FCA5EE07C0EE
+0FE0A9007FB7FCB8FCA46C16C02B387EB730>I<003FB712804816C0B8FCA27E7ED801FC
+C7121FA8EE0F8093C7FCA5153E157FA490B6FCA69038FC007FA4153E92C8FCAE383FFFF8
+487FB5FCA27E6C5B2A387EB730>I<02FF13F00103EBC0F8010F13F1013F13FD4913FF90
+B6FC4813C1EC007F4848133F4848131F49130F485A491307121F5B123F491303A2127F90
+C7FC6F5A92C8FC5A5AA892B5FC4A14805CA26C7F6C6D1400ED03F8A27F003F1407A27F12
+1F6D130F120F7F6C6C131FA2D803FE133F6C6C137FECC1FF6C90B5FC7F6D13FB010F13F3
+0103EBC1F0010090C8FC293A7DB830>I<3B3FFF800FFFE0486D4813F0B56C4813F8A26C
+496C13F06C496C13E0D803F8C7EAFE00B290B6FCA601F8C7FCB3A23B3FFF800FFFE0486D
+4813F0B56C4813F8A26C496C13F06C496C13E02D387FB730>I<007FB6FCB71280A46C15
+00260007F0C7FCB3B3A8007FB6FCB71280A46C1500213879B730>I<49B512F04914F85B
+A27F6D14F090C7EAFE00B3B3123C127EB4FCA24A5A1403EB8007397FF01FF86CB55A5D6C
+5C00075C000149C7FC38003FF025397AB730>I<D83FFF90380FFF80486D4813C0B56C5A
+A26C497E6C496C1380D803F0903803F8004B5A4B5A151F4B5A5E4BC7FC15FE14014A5A5D
+4A5A4A5A141F5D4A5A4AC8FC5C13F18101F37F13F790B57E14EFECC7F01483EC03F81401
+01FE7F496C7E5B157F497F82151F82150F826F7EA26F7E1501821500D83FFF903803FFC0
+486D4813E0B56C5AA26C497E6C496C13C02B387FB730>I<383FFFF8487FB57EA26C5B6C
+5BD801FCC9FCB3B0EE0F80EE1FC0A9003FB7FC5AB8FCA27E6C16802A387EB730>I<D83F
+F8ECFFE0486C4913F0486C4913F8A2007F16F06C6C4913E00007160001EF14BFEC800FA3
+9039E7C01F3FA4ECE03F01E3133EA2ECF07EA201E1137CA2ECF8FCA201E013F8A214FDEC
+7DF0A3147FEC3FE0A3EC1FC0A2EC070091C7FCADD83FFC903801FFE0486C4913F0B54913
+F8A26C486D13F06C486D13E02D387FB730>I<D83FFC90381FFF80486C4913C0B54913E0
+A26C6D6C13C06C6E13800003913801F800EBF7C0A3EBF3E0A314F013F1A214F8A213F014
+FCA2147C147EA2143E143FA2141FA21581A2140F15C1A2140715E1A2140315F1A21401A2
+15F91400A3157DA3153FEA3FFF481380B5EAC01FA26CEB800F6C496C5A2B387EB730>I<
+90383FFFE048B512FC000714FF4815804815C04815E0EBF80001E0133FD87F80EB0FF0A2
+90C71207A44815F8481403B3A96C1407A26C15F0A36D130FA26D131F6C6CEB3FE001F813
+FF90B6FC6C15C06C15806C1500000114FCD8003F13E0253A7BB830>I<007FB512F0B612
+FE6F7E16E0826C813903F8003FED0FFCED03FE15016F7EA2821780163FA6167F17005EA2
+4B5A1503ED0FFCED3FF890B6FC5E5E16804BC7FC15F001F8C9FCB0387FFFC0B57EA46C5B
+29387EB730>I<90383FFFE048B512FC000714FF4815804815C04815E0EBF80001E0133F
+4848EB1FF049130F90C71207A44815F8481403B3A8147E14FE6CEBFF076C15F0EC7F87A2
+EC3FC7018013CF9038C01FFFD83FE014E0EBF80F90B6FC6C15C06C15806C1500000114FC
+D8003F7FEB00016E7EA21680157F16C0153F16E0151F16F0150FED07E025467BB830>I<
+003FB57E4814F0B612FC15FF6C816C812603F8017F9138003FF0151F6F7E150715038215
+01A515035E1507150F4B5A153F4AB45A90B65A5E93C7FC5D8182D9F8007FED3FE0151F15
+0F821507A817F8EEF1FCA53A3FFF8003FB4801C0EBFFF8B56C7E17F06C496C13E06C49EB
+7FC0C9EA1F002E397FB730>I<90390FF803C0D97FFF13E048B512C74814F74814FF5A38
+1FF80F383FE001497E4848137F90C7123F5A48141FA2150FA37EED07C06C91C7FC7F7FEA
+3FF0EA1FFEEBFFF06C13FF6C14E0000114F86C80011F13FF01031480D9003F13C0140191
+38007FE0151FED0FF0A2ED07F8A2007C140312FEA56C140716F07F6DEB0FE06D131F01F8
+EB3FC001FF13FF91B51280160000FD5CD8FC7F13F8D8F81F5BD878011380253A7BB830>
+I<003FB712C04816E0B8FCA43AFE003F800FA8007CED07C0C791C7FCB3B1011FB5FC4980
+A46D91C7FC2B387EB730>I<3B7FFFC007FFFCB56C4813FEA46C496C13FCD803F8C7EA3F
+80B3B16D147F00011600A36C6C14FE6D13016D5CEC800390393FE00FF890391FF83FF06D
+B55A6D5C6D5C6D91C7FC9038007FFCEC1FF02F3980B730>I<D87FFE90380FFFC0B54913
+E06E5AA24A7E6C486D13C0D807F0903801FC00A26D130300035DA46C6C495AA46C6C495A
+A46D131F6D5CA3EC803F013F5CA46D6C48C7FCA490380FE0FEA401075B14F1A301035BA3
+14FB01015BA314FFA26D5BA46E5A6E5A2B397EB730>I<D83FFC903801FFE0486C4913F0
+00FF16F8A2007F16F06C486D13E0D81FC09038001FC0000F1680A76D143F00071600A700
+0390380F803E9039F01FC07EEC3FE0A3EC7FF0A2147D0001157CA29039F8FDF8FCA314F8
+A300005D01F913FCA2ECF07CA201FD137DA2017D5CECE03DA3017F133FA2ECC01FA2013F
+5CA2EC800F6D486C5A2D397FB730>I<3A3FFF01FFF84801837F02C77FA202835B6C0101
+5B3A01FC007F806D91C7FC00005C6D5BEB7F01EC81FCEB3F8314C3011F5B14E7010F5B14
+FF6D5BA26D5BA26D5BA26D90C8FCA4497FA2497FA2815B81EB0FE781EB1FC381EB3F8181
+EB7F0081497F49800001143F49800003141F49800007140FD87FFEEB7FFFB590B5128080
+A25C6C486D130029387DB730>I<D87FFF90381FFFC0B56C4813E0A46C496C13C0D803F8
+903803F8006D1307A26C6C495AA26C6C5C151F6D5CEC803F013F5CECC07F011F91C7FCA2
+90380FE0FEA214F101075BA2903803FBF8A201015B14FF6D5BA26E5AA36E5AB1903803FF
+F8497F497FA26D5B6D5B2B387EB730>I<001FB612FC4815FE5AA490C7EA03FCED07F816
+F0150FED1FE016C0153FED7F80003E1500C85A4A5A5D14034A5A5D140F4A5A5D143F4A5A
+92C7FC5C495A5C1303495A5C130F495A5C133F495A91C8FC5B4848147C4914FE1203485A
+5B120F485A5B123F485A90B6FCB7FCA46C15FC27387CB730>I<007FB5FCB61280A41500
+48C8FCB3B3B3A5B6FC1580A46C140019476DBE30>I<007FB5FCB61280A47EC7123FB3B3
+B3A5007FB5FCB6FCA46C140019477DBE30>93 D<1307EB1FC0EB7FF0497E000313FE000F
+EBFF80003F14E0D87FFD13F039FFF07FF8EBC01FEB800F38FE0003007CEB01F00010EB00
+401D0E77B730>I<007FB612F0A2B712F8A36C15F0A225077B7D30>I<EB7FF80003B5FC48
+14C04880488048809038E01FFC9038C003FE14016E7E6C487F6CC77FC8123FA491B5FC13
+0F137F48B6FC12075A48EB803F383FF800EA7FE0138048C7FC5AA4157F7E6C6C13FFEBC0
+03263FF01FEBFF8090B712C07E6C14EF000314876CD9FE01138026003FE0C8FC2A2A7BA8
+30>97 D<EA3FFC487E12FFA2127F123F1200AAEC03FE91381FFF80027F13E091B57E90B6
+12FC82ECFE079138F001FF4A6C13804A137F4AEB3FC091C7121F17E049140FA217F01607
+A8160FA217E07F161F6EEB3FC0A26EEB7F806E13FFDAF00313009138FC0FFE91B55A5E49
+5CD97E7F13C0D93C1F90C7FC90380003FC2C3980B730>I<ECFFE0010713FC011F7F017F
+7F90B612804815C048EB807F3907FC003F485A485A49EB1F804848EB0F004990C7FC127F
+90C9FCA25A5AA87E7EA27F003FEC07C06DEB0FE06C7E6D131F6C6C14C0D807FE133F9039
+FFC0FF806C90B5FCC615006D5B011F13F801075B01011380232A7AA830>I<913801FFE0
+4A7F5CA28080EC0007AAEB03FE90381FFF874913E790B6FC5A5A481303380FFC00D81FF0
+133F49131F485A150F4848130790C7FCA25AA25AA87E6C140FA27F003F141F6D133F6C7E
+6D137F390FF801FF2607FE07EBFFC06CB712E06C16F06C14F76D01C713E0011F010313C0
+D907FCC8FC2C397DB730>I<49B4FC010713E0011F13F8017F7F90B57E48804801811380
+3A07FC007FC04848133FD81FE0EB1FE0150F484814F0491307127F90C7FCED03F85A5AB7
+FCA516F048C9FC7E7EA27F003FEC01F06DEB03F86C7E6C7E6D1307D807FEEB1FF03A03FF
+C07FE06C90B5FC6C15C0013F14806DEBFE00010713F8010013C0252A7CA830>I<EDFF80
+020713E0021F13F05C4A13F891B5FC491387903803FE079138FC03F0903907F800C04A13
+00A8003FB612C04815E0B7FCA36C15C0260007F0C7FCB3A9003FB512FE4880B71280A26C
+15006C5C25397DB830>I<D903FC13FF90261FFF8713C04913DF90B712E05A5A2607FE07
+138F903AF801FE07C048486C6CC7FCA2497F001F8149133FA56D137F000F92C7FC6D5BA2
+6C6C485AEBFE0790B55A5D485C15C001DF5BD9C3FCC8FC01C0C9FCA37F7F6CB512F015FF
+6C15C04815F0488148813A3FE0001FFE0180130148C8127F007E8100FE168048151FA56C
+153F007FED7F006D5C6C6C495A01F013076CB4EB7FFC6C90B55A6C5D000115C06C6C91C7
+FC011F13FC010113C02B3E7DA730>I<EA3FFC487E12FFA2127F123F1200AAEC01FE9138
+0FFF80023F13E091B57E90B67EA29138FE07FCECF8039138E001FE14C0EC8000A291C7FC
+A25BB3A23B3FFFF81FFFF8486D4813FCB500FE14FEA26C01FC14FC6C496C13F82F3880B7
+30>I<14E0EB03F8A2497EA36D5AA2EB00E091C8FCA9381FFFF8487F5AA27E7EEA0001B3
+A9003FB612C04815E0B7FCA27E6C15C023397AB830>I<EC01C0EC07F0A2EC0FF8A3EC07
+F0A2EC01C091C7FCA990B512F04814F8A47EEB0003B3B3A5EC07F0A2123C007EEB0FE0B4
+131FEC3FC0147F90B512806C14005C6C5B000F13F0000313C01D4E7CB830>I<EA7FF848
+7EA4127F1200AB0203B512804A14C017E0A217C06E14809139001FE0004B5A4B5A4BC7FC
+4A5A4A5AEC0FF84A5A4A5A4A5A4A5A01FD7F90B57E8114F7ECE3F8ECC1FCEC81FEEC00FF
+497F496D7E6F7E826F7E15076F7E6F7E3B7FFFF81FFFE0B56C4813F017F8A217F06C496C
+13E02D387FB730>I<387FFFF8B57EA47EEA0001B3B3A8007FB612F0B712F8A46C15F025
+387BB730>I<02FC137E3B7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F
+13872607FE07EB03F801FC13FE9039F803FC01A201F013F8A301E013F0B3A23C7FFE0FFF
+07FF80B548018F13C0A46C486C01071380322881A730>I<EC01FE3A3FFC0FFF80267FFE
+3F13E000FF90B57E90B67E7E6C9038FE07FCC6EBF8039138E001FE14C0EC8000A291C7FC
+A25BB3A23B3FFFF81FFFF8486D4813FCB500FE14FEA26C01FC14FC6C496C13F82F2880A7
+30>I<49B4FC010F13E0013F13F8497F90B57E0003ECFF8014013A07FC007FC04848EB3F
+E0D81FE0EB0FF0A24848EB07F8491303007F15FC90C71201A300FEEC00FEA86C14016C15
+FCA26D1303003F15F86D13076D130F6C6CEB1FF06C6CEB3FE06D137F3A07FF01FFC06C90
+B512806C15006C6C13FC6D5B010F13E0010190C7FC272A7CA830>I<EC03FE3A3FFC1FFF
+80267FFE7F13E000FF90B57E90B612FC6C816CEBFE07C69038F001FF4A6C13804A137F4A
+EB3FC091C7121F17E049140FA217F01607A8160FA217E07F161F6EEB3FC0A26EEB7F806E
+13FFDAF00313009138FC0FFE91B55A5E495C6E13C0021F90C7FCEC03FC91C9FCAD383FFF
+F8487FB57EA26C5B6C5B2C3C80A730>I<49B413F8010FEBC1FC013F13F14913FD48B6FC
+5A481381390FFC007F49131F4848130F491307485A491303127F90C7FC15015A5AA77E7E
+15037FA26C6C1307150F6C6C131F6C6C133F01FC137F3907FF01FF6C90B5FC6C14FD6C14
+F9013F13F1010F13C1903803FE0190C7FCAD92B512F84A14FCA46E14F82E3C7DA730>I<
+ED07F83A3FFF803FFF486DB51280B512C302CF14C06C13DF6C9038FFFC3FD8001F13E092
+38801F809238000F004A90C7FC5C5C5CA25CA45CAF003FB512FC4880B7FCA26C5C6C5C2A
+287EA730>I<90381FFC1E48B5129F000714FF5A5A5A387FF007EB800100FEC7FC4880A4
+6C143E007F91C7FC13E06CB4FC6C13FC6CEBFF806C14E0000114F86C6C7F01037F903800
+0FFF02001380007C147F00FEEC1FC0A2150F7EA27F151F6DEB3F806D137F9039FC03FF00
+90B6FC5D5D00FC14F0D8F83F13C026780FFEC7FC222A79A830>I<EB0780497E131FA900
+3FB612E04815F0B7FCA36C15E026001FC0C7FCB216F8ED01FCA5ECE003010FEB07F814F0
+9138FC1FF06DB512E06D14C016806D14009038007FFCEC1FF026337EB130>I<D83FFCEB
+3FFC486C497E00FF14FFA2007F147F003F143F00001400B3A41501A2150315076D130F90
+3A7FC07FFFF891B612FC6D15FE7F6D4913FC6D9038F87FF8010001C0C7FC2F2880A630>
+I<3B3FFFC07FFF80486DB512C0B515E0A26C16C06C496C13803B01F80003F000A26D1307
+00005DA26D130F017E5CA2017F131F6D5CA2EC803F011F91C7FCA26E5A010F137EA2ECE0
+FE01075BA214F101035BA3903801FBF0A314FF6D5BA36E5A6E5A2B277EA630>I<3B3FFF
+C01FFFE0486D4813F0B515F8A26C16F06C496C13E0D807E0C7EA3F00A26D5C0003157EA5
+6D14FE00015DEC0F80EC1FC0EC3FE0A33A00FC7FF1F8A2147DA2ECFDF9017C5C14F8A301
+7E13FBA290393FF07FE0A3ECE03FA2011F5C90390F800F802D277FA630>I<3A3FFF81FF
+FC4801C37FB580A26C5D6C01815BC648C66CC7FC137FEC80FE90383F81FC90381FC3F8EB
+0FE3ECE7F06DB45A6D5B7F6D5B92C8FC147E147F5C497F81903803F7E0EB07E790380FE3
+F0ECC1F890381F81FC90383F80FE90387F007E017E137F01FE6D7E48486D7E267FFF80B5
+FCB500C1148014E3A214C16C0180140029277DA630>I<3B3FFFC07FFF80486DB512C0B5
+15E0A26C16C06C496C13803B01FC0003F000A2000014076D5C137E150F017F5C7F151FD9
+1F805BA214C0010F49C7FCA214E00107137EA2EB03F0157C15FCEB01F85DA2EB00F9ECFD
+F0147D147FA26E5AA36E5AA35DA2143F92C8FCA25C147EA2000F13FE486C5AEA3FC1EBC3
+F81387EB8FF0EBFFE06C5B5C6C90C9FC6C5AEA01F02B3C7EA630>I<001FB612FC4815FE
+5AA316FC90C7EA0FF8ED1FF0ED3FE0ED7FC0EDFF80003E491300C7485A4A5A4A5A4A5A4A
+5A4A5A4A5A4990C7FC495A495A495A495A495A495A4948133E4890C7127F485A485A485A
+485A485A48B7FCB8FCA46C15FE28277DA630>I<ED3FF0913803FFF8140F5C147F16F091
+38FFF00092C7FC495A5CB3A21303495A133F383FFFF0B55A5C91C8FC14C080003F7F3800
+3FF813076D7E1301B3A2806D7E15F091387FFFF016F8141F8014039138003FF025477BBE
+30>I<127CA212FEB3B3B3AD127CA207476CBE30>I<EA7FE0EAFFFE6D7E8014F07EC66C7E
+13076D7E1301B3A2806D7E15E091387FFFE06E13F8801407141F5C4A13E09138FFE00092
+C7FC495A5CB3A21303495A137F387FFFF0B5FC14C05C49C8FCEA7FE025477BBE30>I<01
+7C133848B4137C48EB80FE4813C14813C348EBEFFC397FEFFFF0D8FF8713E0010713C048
+6C1380D87C0113003838007C1F0C78B730>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmb10 10.95 87
+/Fj 87 125 df<DA07FFEB0FFC027F9038E07FFF49B500F3B51280010791B612C090261F
+FE039038FC7FE0D93FF002F013F0494848EBE0FF4948485B02805C481300A24848923800
+7FE06FEC3FC0F01F806F91C7FC81A9B97EA50003D900010180C7FCB3ACB5D8F83FEBFF80
+A53C407FBF35>11 D<EC07FF027F13C049B512F001078090391FFE03FC90393FF001FE90
+387FE0034948487E4A5A481300A2485AA36F5A6F5AED00F093C7FCA616FFB8FCA50003EB
+000781B3ABB5D8F87F13FCA52E407EBF33>I<EC07FF027F13FF49B6FC130790381FFE07
+90383FF00FEB7FE0EBFFC04A5A48497EA2485A8181ABB8FCA50003EB0003B3ACB500FCB5
+12FCA52E407EBF33>I<913B07FF8003FF80027FD9E03F13E049B56CB512F8010702FB80
+011F0103B5EA01FE90263FF8019038F800FF90267FE003495A4948484948138002804A5A
+48010014805D481600497FA26F6E13006F6E5AF0007896C7FCA6F17F80BBFCA50003D900
+01EB800384B3ABB5D8F83FD9FC3F13FEA547407EBF4C>I<EA0FC0EA1FE0EA3FF0EA7FF8
+EAFFFCA7EA7FF8A8EA3FF0A7EA1FE0A8EA0FC0A71207C7FCA8EA0FC0EA1FE0EA3FF0EA7F
+F8EAFFFCA6EA7FF8EA3FF0EA1FE0EA0FC00E4079BF1C>33 D<D80FC0137E486C13FF486C
+481380486C4813C0486C4813E0A301FE14F0A3007F7F003F7F001F7FD80FDE137ED8001E
+1300A2013E1301013C14E0A2017C1303A2017814C001F813074914800001140F4848EB1F
+004848133EA2D81F8013FC90C75A001E5C000C146024207DBE31>I<D93F801507D9FFE0
+ED1F8000037F486D153F260FF1FC157F261FF07F4BC7FC01E06DEB03FE003FD93FE0130F
+01C001FCEB3FFC007F6DB65AA2031F5C00FFD90F83EBEFE0923880000F4D5A60173F4DC8
+FCA217FE4C5AA24C5A4C5AA2007F4948485A4C5AA2003F49495AD9E03E91C9FC001F017E
+5BD9F07C13FE380FF1FC6CB448485A6C49485AC613E090273F8007F0EB3F8090C74848EB
+FFE005037F4B48487F923A3F800FF1FC94381FF07CDB7F00EBE07E037E013F133E03FEEC
+C03F4A48017F7FA24A5A4A4801FFEB0F80A24A5A4A5AA24A5A4AC7FCA214FE5C1301495A
+A24948027FEB1F00495AA24948023F5B4948EDE03E051F137E49C8EBF07C017E92380FF1
+FC01FE6FB45A496F5B017C03005B0138EE3F8041497BC34C>37 D<EC0FE0EC3FF8ECFFFC
+5B903803FC3E49487EEB0FF0131F6F7EEB3FE0A3137FA3151F93C9FCA2153E14F05D5D14
+F15D90263FFBE090387FFFFCECFFC05D92C7FC6D5A4A913800FC006E5D17016D6C4A5A60
+6F1307495E017F6D130F90B56C495A4894C7FCD803F96D5BD807F86D133E000F167E4848
+6C6C5B003F6E5B91383FFF01007F6D5CEE83E000FF6D13C76EEBEFC06E5C16FF6E91C8FC
+6E5B037F15F86D6D7E007F6E7F6FEBC0016C6C013F9038E003F092B5EAF007261FFE0791
+38FC1FE06CB5D8FC7FB512C06CDAF81F14800001DAE00714006C6CD980005BD91FF8C7EA
+1FF03E417CBF47>I<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA313FEA3127F123F121FEA0F
+DEEA001EA2133E133CA2137CA2137813F813F01201EA03E0EA07C0A2EA0F80EA1F00121E
+120C0F207BBE19>I<147814F81301EB03F0EB07E0EB0FC0A2EB1F80133FEB7F00A213FE
+A2485A1203A25B1207A2485AA3121F5BA2123FA4485AA612FFB3A2127FA66C7EA4121FA2
+7F120FA36C7EA212037FA212016C7EA2137FA2EB3F80131FEB0FC0A2EB07E0EB03F0EB01
+F813001478155A78C323>I<127012F87E127E7E6C7EA26C7E7F6C7EA26C7EA26C7E7FA2
+12007FA2EB7F80A314C0133FA214E0A4EB1FF0A614F8B3A214F0A6EB3FE0A414C0A2137F
+1480A3EBFF00A25B1201A25B485AA2485AA2485A5B485AA248C7FC127E5A5A1270155A7B
+C323>I<EB01E0EB07F8A2497E13075CA3001E141E007FEC3F80903883F07FD8FFC3EBFF
+C0EBE3F1EBF3F3267FFBF713806D5A001FB5EAFE00000314F0C66C1380D91FFEC7FCA290
+387FFF800003B512F0001F14FE3A7FFDEFFF80497E26FFF3F313C0EBE3F1EBC3F0D87F83
+EB7F80903807F83F001EEC1E00000091C7FCA380130F6D5AA2EB01E022287BC32D>I<EA
+0FC0EA1FE0EA3FF0EA7FF8EAFFFCA313FEA3127F123F121FEA0FDEEA001EA2133E133CA2
+137CA2137813F813F01201EA03E0EA07C0A2EA0F80EA1F00121E120C0F207B8D19>44
+D<B512FEA917097F981E>I<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA6EA7FF8EA3FF0EA1F
+E0EA0FC00E0E7B8D19>I<ED0380ED07C0150FA2151F1680A2153F1600A25D157EA215FE
+5DA214015DA214035DA214075DA2140F5DA2141F5DA2143F92C7FCA25C147EA214FE5CA2
+13015CA213035CA313075CA2130F5CA2131F5CA2133F91C8FCA25B137EA213FE5BA21201
+5BA212035BA212075BA2120F5BA2121F5BA2123F90C9FCA25A127EA212FE5AA25A127822
+5B7BC32D>I<EB01FE90380FFFC0013F13F090B512FC48EB87FE3903FE01FF48486C1380
+A24848EB7FC0001F15E049133FA2003F15F0A3007F15F8A500FF15FCB3A3007F15F8A600
+3F15F0A36C6CEB7FE0A2000F15C06D13FF000715806C6C4813003901FF87FE6CEBFFFC01
+3F13F06D5BD901FEC7FC263D7DBB2D>I<143C147CEB01FC1307131FEA03FFB5FCA4EAFC
+1F1200B3B3A8007FB6FCA5203C7ABB2D>I<EB0FFC90387FFF8048B512E04814F8488039
+0FF07FFE391F801FFF48486C1380387FC00701E014C0486C6C13E013F88016F0A4EA7FF0
+EA3FE0EA1FC0EA0700C7FC16E05CA216C04A1380A24A13005D4A5A5D4A5A5D4A5A4A5A49
+90C7FC5CEB03F8903907F001F0EB0FE014C090391F8003E0EB3F00137E5B491307485A48
+B6FC4815C05AA25A5A5AB7FC1680A4243C7CBB2D>I<EB0FFC90383FFFC090B512F04880
+3903F83FFC3907E00FFED80FC07F486C6C138013F801FC14C0123F13FEA5EA1FFC1680EA
+0FF8D803E01400C75A5D5D4A5A5DEC7FE090381FFFC092C7FC15C015F09038003FF8EC0F
+FE816E1380A216C06E13E0A316F0EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA416E0A2495A00
+7F15C013F0263FC00F13801600391FF83FFE6CB55A6C5C000114E06C6C1380D90FFCC7FC
+243D7CBB2D>I<ED1F80A2153F157FA215FF5C5CA25C5CA25C5CA25C91B5FC14FBEB01F3
+1303EB07E314C3EB0F83131F1403133E137E137C13F8120113F0EA03E01207EA0FC01380
+EA1F005A123E5A12FCB8FCA5C700071380AA010FB6FCA5283C7EBB2D>I<000E1407D80F
+80133F9038F801FF90B6FC5D5DA25D5D5D158092C7FC14FC14F00180C8FCA9EB87FE9038
+9FFFC090B512F0819038FC0FFC9038F007FE9038C003FF0180148016C0497EC714E0A416
+F0A21207EA1FC0EA3FE0EA7FF012FF13F8A316E013F0A26C484813C01380D87E0014806C
+491300391FC00FFE390FF03FFC6CB55A6C5C6C14C06C91C7FCEB1FF8243D7CBB2D>I<EC
+3FE0903801FFF801077F011F7F90383FF07F90397FC01F809038FF807F48EB00FF484913
+C048485AA2EA0FFCA2121FA2003F6D1380496C1300157E007F91C7FCA314309038F9FF80
+D8FFFB13E090B512F881EC07FE496C7E496C1380A216C0A201F814E0A316F0A6127FA512
+3F16E0A2121F16C0EA0FFC168000075B01FE14003903FF0FFE6CEBFFFC6C5C013F5B6D13
+C0D903FEC7FC243D7CBB2D>I<121F7F13F090B612FCA45A16F816F016E0A216C016805A
+007EC7EA3F00157E007C147C15FC4A5A4A5A485C14074A5AC75B141F4AC7FCA25C14FEA2
+1301A2495AA31307A2130FA25C131FA3133FA6137FAA6D5A6D5A6D5A263F7BBD2D>I<EB
+07FE90381FFFC0017F13F090B57E3901FE0FFC3903F803FE48486C7E000F6D1380A2485A
+ED7FC0123FA37FA27F7F6DEBFF806D7E6E13006C13F1ECFBFE6CEBFFFC5D6C14E0A26C14
+F86C806C80814815805AD807FB14C0EA0FF048486C13E0003F131F497E007F010313F080
+00FF7F49137F153FA2151FA416E06C7E153F6D14C0003F147F6D14803A1FF801FF00390F
+FE07FE6CB55A6C5CC65C013F13C0D907FEC7FC243D7CBB2D>I<EB07FE90383FFF8090B5
+12E0488048EB0FF848486C7E48486C7E001F80497E003F1580A2127F16C0A212FF16E0A5
+16F0A6127FA3003F5BA2121FA26C6C5A6C6C5A6CB6FC7E38007FFDD91FF913E0EB00C114
+01A3D807E014C0EA0FF0486C5AD83FFC1480A316004A5AA249485AD81FF05B9038E03FF0
+000F495A90B55A6C5C6C91C7FCC613FCEB3FE0243D7CBB2D>I<EA0FC0EA1FE0EA3FF0EA
+7FF8EAFFFCA6EA7FF8EA3FF0EA1FE0EA0FC0C7FCACEA0FC0EA1FE0EA3FF0EA7FF8EAFFFC
+A6EA7FF8EA3FF0EA1FE0EA0FC00E287BA719>I<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA6
+EA7FF8EA3FF0EA1FE0EA0FC0C7FCACEA0FC0EA1FE0EA3FF0127FEAFFF8A213FCA4127F12
+3F121F120FEA003CA2137C1378A313F813F0120113E0120313C01207EA0F80121F130012
+1E120C0E3A7BA719>I<007FB912E0BA12F0A4003F18E0CDFCB0003FB912E0BA12F0A46C
+18E03C1C7BA447>61 D<EB3FFC48B512804814E0000F14F0391FF03FF8393F801FFC007F
+EB0FFE13C0D8FFE013FF13F0A5EA7FE015FE383FC01FD80F0013FCC7123FEC7FF815F0EC
+FFC015804913005C5C495AA25C495AA35CAA90C8FCA8EB0FC0497E497E497E497EA66D5A
+6D5A6D5A6D5A20407BBF2B>63 D<ED07804B7E4B7EA34B7EA34B7EA34B7EA34A7FA34A7F
+A24A8015CFA2020F801587A2021F801503A2023F80EC3E01A2027E80EC7C00A24A6D7EA2
+0101814A133FA20103814A7FA249B77EA34982A29138800007011F8291C77EA2496E7F13
+3EA2496E7FA201FC8249157FB500F0013FB512FCA53E3F7DBE45>65
+D<B712FEEEFFE017F817FE83C69026F0001F1380040713C07013E0A27013F0A28218F8A7
+18F05EA218E05E18C04C1380041F1300EE7FFC91B612F017C017F817FE913AF00007FF80
+7013C07013E07013F018F8177F18FCA318FEA3173F177FA418FCA217FF18F85E18F04C13
+E0160FB912C018005F17F01780373E7CBD41>I<DB7FF8130E0207B5131E023FECC03E91
+B6EAF07E0103EDF9FE499038F807FF011FEBC0004990C7123FD97FFC141F4948140F4849
+1407484914035C484914015A91C9FC5A187E485AA3007F173EA25BA200FF1700AE127F18
+3E7FA2123FA2187E6C7E187C7E6E15FC6C6D15F86C16016EEC03F06C7F6C6DEC07E06D6C
+EC0FC06DB4EC3F806D01C0EBFF0001079038F807FE6D90B55A010015F0023F5C02071480
+9126007FF8C7FC37407BBE42>I<B712FCEEFFC017F017FC17FFC69026F0003F7F04077F
+040113F082717E717E717E170F84831980A219C083A219E0A519F0A483A55FA419E0A519
+C0A25F1980A24D1300A24D5A4D5A177F4D5A4C5B04075B043F5BB9C7FC5F17F817C004FC
+C8FC3C3E7CBD46>I<B812FEA483C69038F8003F16071601828383A2EF1F80A3170FED01
+F0A3EF07C0A3150394C7FCA21507151F91B5FCA5ECF81F1507150318F8A21501EF01F0A5
+92C71203A218E0A21707A2170F171F18C0173F17FF1603161FB9FCA21880A3353D7CBC3C
+>I<B812F8A417FCC69038F8007F161F1607160316011600A2177EA3173EA2ED03E0A217
+1FA417001507A2150F153F91B5FCA5ECF83F150F1507A21503A792C8FCACB612FEA5303D
+7CBC39>I<DB7FF0131C912607FFFE133C023F9038FF807C91B6EAE0FC010315F3010F90
+38F80FFF49EBC0014948C7127F4948143FD9FFF0141F4849140F4816075C484914035A91
+C812015A1700485AA3007F177CA25BA200FF94C7FCAC0303B612F0A2127FA27F92C7387F
+FC00123FA36C7EA27E807E6C7F806C7F6C7F6D6C14FF6DB45B6DEBC0036DEBF80F010390
+B512E7010015C1023FEC807C02079038FE001C9126007FF090C7FC3C407BBE47>I<B6D8
+F87FB512FCA5C601F8C7387FFC00B3A491B7FCA502F8C7127FB3A7B6D8F87FB512FCA53E
+3E7CBD47>I<B612F8A5C6EBF800B3B3B0B612F8A51D3E7DBD24>I<010FB61280A5D90001
+EBE000B3B3A4EA1FE0EA3FF0EA7FF8A2EAFFFCA44A5BA26C48485B01F091C7FC6C48485A
+391FF03FFC6CB55A6C5C000114C026001FFCC8FC293F81BD2F>I<B600F890B512F8A5C6
+01F8C73803F8004D5A4D5A4D5A4D5A4DC7FC17FE4C5A4C5A4C5A4C5A4C5A4C5A4CC8FC16
+FE4B5A4B5A4B5A4B5A151F4B7E4B7EA24B7E14F902FB7F91B6FC15DF039F7F158F030F7F
+4A6C7F4A7E02F880816F7F83167F83707E82848284707F82848284707F177F84B6D8F80F
+B512FCA53E3E7CBD47>I<B7FCA5C601F8C8FCB3AD177CA417FC17F8A41601A3160317F0
+1607A2160F161F163F16FF1503B8FC17E0A42E3E7CBD37>I<B500FC93B512F86E5DA36E
+5DC6F1F800A26FEC07BFA301FD6DEC0F3FA201FC6D141EA36E6C143CA36E6C1478A36E6C
+14F0A26E6CEB01E0A36E6CEB03C0A36E9038800780A36E9038C00F00A26EEBE01EA36F6C
+5AA36F6C5AA36F6C5AA26FB45AA36F5BA36F5BA36F90C7FCA26F5AB500FC033FB512F8A2
+167CA216384D3E7CBD56>I<B500F891B512FC80A28080C6933800FC008181A28181A201
+FD7F01FC7FA26E7E6E7E80826E7F80826E7F6E7FA26E7F6F7EA26F7E6F1380A26F13C06F
+13E0A26F13F06F13F8A26F13FCEE7FFEA2EE3FFF82A28282A2828282A2177F173FA2171F
+170FA21707B500FC1403A217011700A23E3E7CBD47>I<913801FFC0021F13FC91B67E01
+0315E04901807F903A1FFE003FFCD93FF8EB0FFE49486D7E49486D7F48496D7F48834A7F
+48834890C86C7EA2488349153FA2003F83A249151F007F83A400FF1880AE007F1800A36D
+5DA2003F5FA36C6C4B5AA26C5F6E14FF6C5F6C6D495B6E5B6C5F6C6D495B6D6C4990C7FC
+D93FFEEB3FFE6D6C6CB45A010790B512F06D5D01001580021F01FCC8FC020113C039407B
+BE44>I<B712F816FF17E08317FCC6D9F0007FEE1FFF7013808218C08218E0A318F0A818
+E0A318C05E18804C13005EEEFFFE91B612F85F17C04CC7FC02F8C9FCB3A4B612F8A5343E
+7CBD3E>I<913801FFC0021F13FC91B67E010315E04901807F903A1FFE003FFCD93FF8EB
+0FFE49486D7E49486D7F48496D7F48496D7FA24890C86C7E488349153F001F83A249151F
+003F83A3007F834981A300FF1880AE007F1800A46D5D003F5FA36C6C4B5AA2000F027F5C
+903AFF01FF807F6C4901E05B6C01876D485A15C16C9026CF80795B6C9026EF007F5B6DB4
+6D90C7FC6D5D6D01805B01079038C0FFF06D90B55A0100ED8001021FED03800201EBCFC0
+91C7EA0FE01807EFF81F94B5FCA3701400A4705BA2705B60705B715AEF1FC039517BBE44
+>I<B712E016FF17C017F883C69039F0007FFE93381FFF801607707F84A2707FA284A860
+A24C5BA2604C5B041F90C7FCEEFFFE91B612F817E094C8FC17C0DAF00113F06F6C7E707E
+83161F83A2707FA684A6191F18E0A282F0F03FB6D8F003143E70EBF87E70EBFFFC053F13
+F8050F13F0CB13C0403F7CBD45>I<D907FE133890393FFFC07890B5EAF0F84814F90007
+14FF380FFE07EBF0004848133F4848131F150F007F1407491303A212FF1501A36D1300A2
+7F7F6D140013FE387FFFE014FEECFFE06C14FC816CECFF806C15C06C15E016F012016C15
+F86D14FC131F010114FEEB001F14019138003FFF150F81A200788012F8A281A27EA216FE
+7E15036C15FC7F6DEB07F813F001FCEB1FF09039FFC07FE091B512C000FC1580D8F83F14
+00D8F00713FC48C613E028407BBE33>I<003FB812FCA5D9FC03EBE01FD87FE0ED07FE01
+C01501018015001300007E177EA3007C173EA400FC173F48171FA5C71600B3AF013FB612
+FEA5383D7DBC3F>I<B600F890B512F8A5C601F8C8EAF800B3B3A5017F150160A280013F
+1503606D6C1407010F4B5A6E4A5A6D6D133F6D6D01FFC7FC6D9038F807FE6D6CB55A6E5C
+020F14E0020314809126003FFCC8FC3D3F7CBD46>I<B600F0010FB5FCA5C601F8C8EA1F
+00A26E5D017F163EA26E157E013F167C6E15FC6D5EA26F13016D5EA26D6D495AA26F1307
+6D5EA26F130F6D5E816D4BC7FCA26F5B027F143EA26F137E023F147C6F13FC6E5CA21681
+6E5CA216C36E5C16E76E5CA216FF6E5CA36E91C8FCA26F5AA36F5AA36F5AA26F5AA36F5A
+A2403F7EBD45>I<B600E0B6D8F007B51280A500019026F0000101F8C73807C00070160F
+6C6D6184177F6D6C4EC7FC84173F6D6C183E177F846E187E6D92B5147C856F17FC6D4A5E
+05F77F03C016016D02035E05E313E003E016036D02075E05C113F003F016076D61DC0F80
+13F803F8160F6D6193391F007FFC03FC161F027F95C8FC4C14FE043E013F5BDA3FFE163E
+047E14FF047C6D137EDA1FFF167C04FC15FC4C7F6E5FA24C7F6E5FA24C7F6E5FA24C7F6E
+5FA24C7F6E5FA293C8127FA26F93C9FC037E81033E153E593F7EBD5E>I<003FB5D8FC0F
+B512F0A5D8003F90C7380FC0006D6D495A4DC7FC6D7F6D6D137E5F6D7F4C5A6D6D485A6D
+13FC4C5ADA7FFE5B160F6E6C485A6E139F04BFC8FC6E13FEA26E5B6E5BA28082806F7EA2
+6F7E83A24B7F92B5FC83DA01FB7FEC03F303F17FEC07E1DA0FC07F707EEC1F804B6C7E5C
+027E6D7F707F5C49486D7FA249486D7F49486D7FA249486D7F49486E7EA2B6011FB6FCA5
+403E7EBD45>I<B600F80103B512C0A5C66C48C8380F80006E151F6D4CC7FC816D167E6D
+7F6F5C6D5E6F13016D5E6F13036D4B5A6D7F6F495A027F5D6F131F6E92C8FC6E6D5AEEC0
+7E80705A80EEF1F86E5C6E13FBEEFFE0805F815F6F90C9FC815EB3A2021FB6FCA5423E7F
+BD45>I<003FB712F8A5DAC00313F09026FC000713E05B01E04913C05B49491380127F90
+C74813004B5A127E4B5AA24A5B127C4A5B5C5E4A5BC7FC4A5BA24A90C7FC5C5D4A5AA249
+5BA2495B5B5D4949137CA2495BA24990C7FC4915FC4A14F8495AA2485B1601485BA24849
+1303485B16074849130F161F4890C7123FEEFFF04848130FB8FCA52E3E7BBD38>I<EAFF
+FEA6EAFC00B3B3B3B3A7EAFFFEA60F5B78C319>I<0160130301F0EB07800001140F0003
+141FD807C0EB3E00A248485B48C75A001E5C003E1301003C5C007C1303A200785CA200F8
+1307485CA2D8F7E013BFD8FFF0EBFF8001F814C001FC14E001FE14F0A3007F7FA36C486C
+13E06C486C13C06C48EB7F806C48EB3F00242077BE31>I<EAFFFEA6EA007EB3B3B3B3A7
+EAFFFEA60F5B7FC319>I<EB0FFE90387FFFC048B512F04814FC3907FC0FFE48486C7E6D
+6C7F486C7E82A26E7FA36C5A6C5AEA01E0C8FC5C49B5FC131F90B6FC000313F84813C048
+1300EA1FFC485A127F5B12FF5BA45CA26C6C5A16F83B3FF807BFFF80391FFC1F3F390FFF
+FE1F6C497E0001EBF80326003FE0C8FC292B7EA92C>97 D<13FFB5FCA512077EAFEC03FE
+91381FFFC0027F13F091B57E9138FE0FFE9138F003FF4A7E02C014804A6C13C017E0A3EE
+7FF0A317F8AC17F0A3EEFFE0A217C05D02C014806E4813006E485A9138FC1FFC01FCB55A
+496C13E0D9F01F1380C7D807FCC7FC2D407EBE33>I<EB03FF011F13E0017F13F890B57E
+48EB83FE3903FE01FF00075B4848481380121F13F8123FA2127F496C13006E5AEC007800
+FF91C7FCAC127FA27F003FEC07C0A26C6C130F16806C6C131F000715006C6C137F6CEBC1
+FE6CEBFFFC6D13F0011F5B010390C7FC222B7DA928>I<ED01FEEC01FFA5EC000F1507AF
+EB01FF011F13C7017F13F790B6FC4813C148EB007F4848131F485A001F140F5B123FA248
+5AA312FFAC127FA36C7EA3001F141F6C7E00074A7E6D90B512F83803FF83C690B6FC6D13
+EF011F13CF903A03FE0FF8002D407DBE33>I<49B47E010F13F0013F7F90B512FE48EBC3
+FF48010013804848EB7FC04848133F001F15E05B003FEC1FF0A2485A150F16F8A212FFA2
+90B6FCA401F0C8FCA5127FA37F003F15F8A26C6C1301000F15F06D13036C6CEB07E06C90
+38800FC06C9038F07F806C6CB512006D5B010F13F8010013C0252B7EA92A>I<EC1FF8EC
+FFFE01077F491480D91FF813C0D93FE013E0EB7FC1EBFF81481301A348486C13C0ED7F80
+ED3F0092C7FCAAB6FCA5000390C8FCB3ACB6FCA523407EBF1C>I<D907FE13FC90393FFF
+C3FE90B5EAF7FF4891B5128048130F3907FC03FE3A0FF801FF7F001FEDFF00496C13BE16
+80003F81A7001F5DA26D5A000F92C7FC6C6C485A3903FF0FFCECFFF8485CD80F3F13C0D9
+07FEC8FC90CAFC5AA27FA213E090B512F015FF6C15C0826C816C8182120F4881393FE000
+3FD87F80EB07FF150148C7FC81A56D5B007F5D6D13036C6C495AD81FF8EB1FF86CB4EBFF
+F06C90B55A000115806C6C49C7FC010713E0293D7EA82D>I<13FFB5FCA512077EAFED7F
+E0913801FFF802077F4A7F91381FC3FFDA3E031380147CEC780102F014C014E0A214C0A3
+1480B3A4B5D8FE1F13FFA5303F7EBE33>I<EA01F8487E487E487E481380A66C13006C5A
+6C5A6C5AC8FCA913FFB5FCA512077EB3ABB512F8A515407EBF19>I<EC1F80EC3FC0EC7F
+E0ECFFF04913F8A66D13F0EC7FE0EC3FC0EC1F8091C7FCA9EC07F8EB0FFFA5EB003F141F
+B3B3A2EA1F80EA3FC0EA7FE0EAFFF015F0143FA2EC7FE015C0397FE0FF80D83FC113006C
+B45A6C5B6C13F0C613801D5387BF1C>I<13FFB5FCA512077EB092B512E0A592380FE000
+4B5A4B5A4BC7FC15FE4A5A4A5A4A5A4A5A4A5A143FECFFE0A28181A2ECDFFCEC8FFE140F
+6E7E6E7FA26E7F6E7FA26F7E6F7EA26F7E6F7EB539FC7FFFF8A52D3F7FBE30>I<13FFB5
+FCA512077EB3B3AFB512FCA5163F7EBE19>I<01FFD97FE0EB3FF0B52601FFF8EBFFFC02
+07D9FC037F4A6D487F91281FC3FF0FE17FDA3E03D99F017F0007017C14BE6CD97801EBBC
+0002F002F88002E05CA202C05CA302805CB3A4B5D8FE1FD9FF0FEBFF80A549297EA84C>
+I<01FFEB7FE0B53801FFF802077F4A7F91381FC3FFDA3E0313800007137C6CEB780102F0
+14C014E0A214C0A31480B3A4B5D8FE1F13FFA530297EA833>I<49B47E010F13F0013F13
+FC90B6FC48018113803A03FE007FC04848EB3FE0000F15F049131F001F15F8A24848EB0F
+FCA2007F15FEA400FF15FFAB007F15FEA3003F15FC6D131F001F15F8A26C6CEB3FF00007
+15E06C6CEB7FC03A01FF81FF806C90B51200013F13FC010F13F001011380282B7EA92D>
+I<9038FF03FEB5381FFFC0027F13F091B57E9138FE1FFE9138F007FF0007497E6C01C014
+804A6C13C017E081A217F0A2167F17F8ACEEFFF0A317E05D17C0A26E4813806E4813006E
+485A9138FC1FFC91B55A16E0029F1380DA87FCC7FC0280C8FCACB512FEA52D3B7EA833>
+I<49B4131E010FEBC03E013FEBE07E90B5EAF0FE48EBC1F948EB807F48EB003F485A4848
+131FA2003F140F5B127F1507A2485AAC127F7FA2123F150F6C7E151F6C7E0007143F6C6C
+13FF6C13C36C90B5FC6D13EF011F138F903803FE0F90C7FCAC0203B512F8A52D3B7DA830
+>I<3901FE07F800FFEB0FFE91383FFF804A13C0EC7C7F9138F8FFE03807FFF06C5B5CA2
+ED7FC09138803F80ED1F0092C7FCA291C8FCB3A3B6FCA523297FA827>I<90387FE1E038
+03FFFB4813FF5A381FE07F383F801F387F000F007E130712FE1403A27EA26DC7FC13F013
+FF6C13F014FC6C13FF15806C14C07E6C14E0000114F06C7E010313F8EB003F140F007813
+0712F814037EA36C14F06C1307A29038800FE09038F03FC090B51280150000F813FC38E0
+3FF01D2B7DA924>I<131FA65BA55BA25BA25A5A5A001FEBFFC0B6FCA4000790C7FCB3EC
+03E0A97EEC87C0A26CEBCF806C13FF6D1300EB1FFEEB07F81B3B7EB923>I<D9FF80EB7F
+C0B5EB7FFFA5000714036C80B3A55DA35D7E4B13E0DAC01E13FF6CEBE07E6DB45A6D5B01
+0F13E0010101801300302A7EA833>I<B539FC1FFFE0A5000390398000F800ECC0016C5D
+A2ECE0036C5D1507D97FF05BA2ECF80F013F5CA2ECFC1F011F91C7FC5D90380FFE3EA215
+7E903807FF7CA215FC6D5BA26D5BA36D5BA36E5AA26E5AA36EC8FC2B287EA730>I<B500
+E1B53887FFF8A50007903B801FF0003F006C6F133E150F02C0157E6C4A6C137CA26C01E0
+5D4B7EA2D97FF04A5AED7FFF157DD93FF84A5A03FD138303F81387D91FFCECC7C014FD92
+38F07FCFD90FFFECEF80A29238E03FFF6D93C7FCA24B7E6D5DA2ED800F6D5DA2ED00076D
+5DA24A1303027E5C027C13013D287EA742>I<3B7FFFFC7FFFE0A5C69039E007E0004B5A
+90387FF01FD93FF85B4BC7FC90381FFC7EEB0FFE5D6D6C5A7F5D6D5B7FA26E7E143F814A
+7E14FF81497FEB03F301078002E17FEB0FC049487F6F7E90383F003F017E806F7EB500E0
+B512F8A52D287FA730>I<B539FC1FFFE0A5000390398000F800ECC0016C5DA2ECE0036C
+5D1507D97FF05BA2ECF80F013F5CA2ECFC1F011F91C7FC5D90380FFE3EA2157E903807FF
+7CA215FC6D5BA26D5BA36D5BA36E5AA26E5AA36EC8FCA25C143EA2000E5BEA3F80387FC0
+FC486C5AA2EBE1F0A2EBE3E013C7387FCFC0387D3F80D83FFFC9FC5BEA0FF8EA07E02B3B
+7EA730>I<001FB61280A4D9F80F1300EBE01F01C05B49485A130048495A4A5AA2D83E01
+5B5B5D495BA2C64890C7FC5B5C495A017FEB0F8014F8EBFFF0A248EBE01F48150014C048
+1380A248495A485A5D48485B007F5B9038F80FFEB6FCA421287EA728>I<B812F0A42C04
+809A2D>I<BE12C0A45A04809A5B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmbx12 14.4 49
+/Fk 49 122 df<EEFFFC031FEBFF804AB612E0020781021F9038C00FF8913A7FFE0003FC
+DAFFF0EB00FE4949EB03FF4901805B4990C7487F49485CA2495A4D7F013F6F5B5CA37190
+C7FC715AEF01F894C9FCA90403B512C0BAFCA526003FFCC7120783B3B3A6003FB5D8FC03
+B612C0A542547DD34B>12 D<B712F0AB240B7F9F2D>45 D<EA07F0487E487E487E487EB5
+1280A76C13006C5A6C5A6C5A6C5A1111769025>I<913803FFC0023F13FC91B6FC010315
+C0010F018113F0903A1FFC003FF849486D7E49486D7E49486D7E48496D138048496D13C0
+A24817E04890C813F0A34817F8A24817FC49157FA3007F17FEA600FF17FFB3A5007F17FE
+A6003F17FCA26D15FFA26C17F8A36C17F0A26C6D4913E0A26C6D4913C06C17806E5B6C6D
+4913006D6C495AD91FFCEB3FF8903A0FFF81FFF06D90B55A01011580D9003F01FCC7FC02
+0313C0384F7BCD43>48 D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0
+EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43>I<EC3FFE0103B512E0010F14FC013F
+14FF90B712C048D9C07F7F2703FE000F13F8D807F801037FD80FE06D7F48486D7F484880
+01F01680486C6E13C07F486C6E13E07FA27013F0A56C5AA26C5AEA0FF0EA03C0C914E05E
+A218C05E1880A24C13005F4C5A4B5B5F4B5B5F4B5B4B90C7FC4B5A5E4B5AED7FE04B5A4A
+5B4A48C8FC4A5A5D4A48EB01F04A5AEC3F804AC7FC02FEEC03E0495A495A495A495AD91F
+80140749C8FC013E150F017FB7FC90B812C05A5A5A5A5A5A5AB9FC1880A4344E79CD43>
+I<91380FFFC091B512FC0107ECFF80011F15E090263FF8077F9026FF800113FC4848C76C
+7ED803F86E7E491680D807FC8048B416C080486D15E0A4805CA36C17C06C5B6C90C75AD8
+01FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E016FCEE
+FF80DA000713E0030113F89238007FFE707E7013807013C018E07013F0A218F8A27013FC
+A218FEA2EA03E0EA0FF8487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C6C4816
+E001F04A13C06C484A1380D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D011F15
+80010302FCC7FCD9001F1380374F7ACD43>I<177C17FEA2160116031607160FA2161F16
+3F167FA216FF5D5DA25D5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407EC0FC0
+1580EC1F005C147E147C5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B485A12
+07485A485A90C8FC123E127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE43>I<
+D80380150ED807E0157E01FEEC03FED9FFF0137F91B65A5F5F5F5F5F94C7FC5E5E16F016
+C093C8FC15F801E190C9FC01E0CAFCABEC0FFF027F13F001E3B512FE01E76E7E9026FFF8
+077FDAC0017F49C713F8496E7E49143F4981496E7E6C481680C9FC18C08218E0A418F0A3
+EA0FE0487E487E487E487EA418E0A35B6C484A13C05B491680003EC85A003F17006C6C4A
+5A6D5D6C6C4A5AD807F8495BD803FE01075B2701FFC03F5B6C90B65A013F4AC7FC6D14F8
+010314C09026007FF8C8FC344F79CD43>I<ED0FFF92B512E0020780021F14FC91397FFE
+03FE903A01FFF0007F4901C0EB3F804990C7121F4948EC7FC0494814FF49484913E04948
+5B01FF5C485BA2485B5AA2486F13C04A6D1380486F1300177E94C7FC5AA291CAFC5AA215
+08913801FFF8020713FFB54814C04A14F04AC66C7E023C6D7E4A6D7E4A6D7E7013804A15
+C0A24A15E07013F05C18F8A491C714FCA37EA67EA46C17F880A27E18F06C5D18E06C6D15
+C07E6E4913806C6D15006D6C495A6D6CEB7FFC6DB448485A6D90B55A010315C0010092C7
+FC023F13FC020713C0364F7ACD43>I<121F7F7FEBFF8091B81280A45A1900606060A260
+6060485F0180C86CC7FC007EC95A4C5A007C4B5A5F4C5A160F4C5A484B5A4C5A94C8FC16
+FEC812014B5A5E4B5A150F4B5AA24B5AA24B5A15FFA24A90C9FCA25C5D1407A2140FA25D
+141FA2143FA4147F5DA314FFA55BAC6D5BA2EC3FC06E5A395279D043>I<913807FFC002
+7F13FC0103B67E010F15E090261FFC0113F8903A3FE0003FFCD97F80EB0FFE49C76C7E48
+488048486E1380000717C04980120F18E0177FA2121F7FA27F7F6E14FF02E015C014F802
+FE4913806C7FDBC00313009238F007FE6C02F85B9238FE1FF86C9138FFBFF06CEDFFE017
+806C4BC7FC6D806D81010F15E06D81010115FC010781011F81491680EBFFE748018115C0
+48D9007F14E04848011F14F048487F48481303030014F8484880161F4848020713FC1601
+824848157F173FA2171FA2170FA218F8A27F007F17F06D151FA26C6CED3FE0001F17C06D
+157F6C6CEDFF806C6C6C010313006C01E0EB0FFE6C01FCEBFFFC6C6CB612F06D5D010F15
+80010102FCC7FCD9000F13C0364F7ACD43>I<91B5FC010F14F8017F14FF90B712C00003
+D9C00F7F2707FC00017FD80FE06D7F48486E7E48C87FD87FE06E7E7F7F486C1680A66C5A
+18006C485C6C5AC9485A5F4B5B4B5B4B5B4B5B4B90C7FC16FC4B5A4B5A16C04B5A93C8FC
+4A5A5D14035D5D14075DA25D140FA25DAB91CAFCAAEC1FC04A7EECFFF8497FA2497FA76D
+5BA26D5BEC3FE06E5A315479D340>63 D<BA7E19FCF1FF801AF01AFCD8000701F0C7000F
+13FF060014C0071F7F070713F807017F737F747E747F747F86747F747F8886888688A275
+7EA31D8087A21DC0A51DE0A387A963A31DC0A51D80A2631D00A3515AA2646264505B6264
+505B505B5090C7FCF2FFFE4F5B07075B071F5B96B512C0060F91C8FCBB5A1AF01AC007FC
+C9FC19805B527CD167>68 D<BC1280A5D8000701F8C7000114C0F0001F19071901851A7F
+1A3F1A1FA2F20FE0A21A07A31A03A318F81BF01A01A497C7FC1701A317031707170F177F
+92B6FCA59238F8007F170F170717031701A317001B3EA31B7CA395C8FCA21BFCA21BF8A2
+1A01A31A031BF01A071A0FA21A1F1A3FF27FE0F101FF1907191F0603B5FCBCFCA21BC0A3
+4F517CD058>I<BB12FEA5D8000701F8C700077FF0007F191F190785858586861B80A21A
+1FA31A0FA41BC006F81307A497C7FCA31701A317031707170F177F92B6FCA59238F8007F
+170F170717031701A31700A795C9FCB3B812F8A54A517CD055>I<B8D8C003B8FCA5D800
+0701F8C9001FEBE000B3AE92BAFCA503F8C9121FB3B1B8D8C003B8FCA560527CD169>72
+D<B812C0A5D8000701F8C7FCB3B3B3B2B812C0A52A527CD132>I<027FB71280A591C76C
+90C7FCB3B3B3EA07F0EA1FFC487E487EA2B57EA44C5AA34A485B7E49495BD83FF8495BD8
+1FE05DD80FFC011F5B2707FF807F90C8FC000190B512FC6C6C14F0011F14C0010101F8C9
+FC39537DD145>I<B812F8A5D8000701F8CAFCB3B3A91A7CA41AFC1AF8A51901A31903A2
+19071AF0190FA2191F193F197F19FF180360183F4DB5FCBB12E0A546527CD151>76
+D<B600FC073FB512FE6F61A26F96B6FCA2D80007F5C00070EF01EFA202EF6DEF03CFA202
+E76DEF078FA202E36DEF0F0FA202E16D171EA302E06D173CA26F6C1778A26F6C17F0A26F
+6DED01E0A26F6DED03C0A36F6DED0780A26F6DED0F00A26F6D151EA26F6D5DA3706C5DA2
+706C5DA2706D495AA2706D495AA2706D495AA3706D49C7FCA2706D131EA2706D5BA2716C
+5BA3716C5BA271EB81E0A271EBC3C0A271EBE780A27101FFC8FCA3715BA2715BA2725AA2
+725AA2D93FFC6F5AB74DB712FEA2725AA2725A77527CD180>I<BAFC19F819FF1AE086D8
+000701F0C7001F13FC060113FF726C13807313C0070F13E01BF0857313F81BFCA27313FE
+A41BFFA81BFEA31BFC61A21BF84F13F04F13E0614F13C04F13004E485A061F5B92B812F0
+1AC04FC7FC19E003F8CBFCB3AEB812C0A550527CD15C>80 D<B912F0F0FF8019F819FF1A
+C0D8000701F0C714F0060F7F060113FE727F737F737F85737F87A2737FA387A863A26163
+63A24F5B4F5B4F90C8FC4F5A06035B060F13F095B512C092B8C9FC19F819E019F89226F0
+000313FE9439007FFF80727F727F727F727F727F8684A28684A787A71D1C75133EA38575
+137E73157C7513FC731401B86C6D9038F803F807039038FE07F07390B512E0736C14C008
+0F1400CEEA7FFC5F537CD164>82 D<91260FFF80130791B500F85B010702FF5B011FEDC0
+3F49EDF07F9026FFFC006D5A4801E0EB0FFD4801800101B5FC4848C87E48488149150F00
+1F824981123F4981007F82A28412FF84A27FA26D82A27F7F6D93C7FC14C06C13F014FF15
+F86CECFF8016FC6CEDFFC017F06C16FC6C16FF6C17C06C836C836D826D82010F82130301
+0082021F16801400030F15C0ED007F040714E01600173F050F13F08383A200788200F882
+A3187FA27EA219E07EA26CEFFFC0A27F6D4B13806D17006D5D01FC4B5A01FF4B5A02C04A
+5A02F8EC7FF0903B1FFFC003FFE0486C90B65AD8FC0393C7FC48C66C14FC48010F14F048
+D9007F90C8FC3C5479D24B>I<003FBC1280A59126C0003F9038C0007F49C71607D87FF8
+060113C001E08449197F49193F90C8171FA2007E1A0FA3007C1A07A500FC1BE0481A03A6
+C994C7FCB3B3AC91B912F0A553517BD05E>I<B800C00103B612FCA5D8000701F8CAEBF0
+00F31F80B3B3B11B3FA26D97C7FC81637F1B7E6D6D17FE505A6E7E505A6E6D15076E4D5A
+6E6D4B5A6E6D4B5A6E01F84B5A6E6DDA03FFC8FC6E6CB46CEB0FFE6F9039F001FFF8030F
+90B65A030316C0DB007F92C9FC040F14F8DC007F13805E537CD167>I<B700FC017FB600
+FE91B612F0A5D8003F01C0C8001F01E0C9EBF8006F71EE0FC06D7161876F1C1F6D7196C7
+FC6F8373606D1E3E6F836D7160876F1CFC6D666F4B801F016D66704A806E525A88704A17
+076E059F5F70021F80080F160F6E6570023F806EDC3E074CC8FC8870027E5F6EDC7C0316
+3E7002FC804F6C167E6E1C7C700101814F6C16FC6E745B70010317016E4C6D5D060716C0
+0580496D14036F63DDC00F16E04F6D14076F07F05BDDE01F170F6F92C76C5D1DF8DDF03E
+6E141F6F98C9FCDDF87E16FC067C6E5C6FF1FE3EDDFCFC177E6F4A6E147C1DFFDDFFF06E
+14FC6F62A24E816F62A270496F5BA24E817061A295C97E7061A270487090CAFCA3704870
+5AA24D1601040360A27048705A84537DD18B>87 D<EC7FFF0107B512F0013F14FE90B77E
+48D9E00F7F2703FE000113F0486C6D7F6EEB3FFC48826E131F83707FA36C496D7FA26C90
+C7FC6C5AC9FCA6037FB5FC020FB6FC91B7FC01071487013FEBF0074913803901FFFC0048
+13F0485B485B485B4890C7FC5A5BA2485AA45EA26D5C007F151D163D6C6C02797F6C6D01
+F113F86C9026C003E1EBFFE06C9026F81FC014F06C90B5487EC6ED001F011F01FC010713
+E0010101E090C8FC3C387CB641>97 D<EB3FF0B5FCA51203C6FCB3A4923801FFE0030F13
+FE033FEBFFC092B612F002F301017F913AF7F8003FFEDAFFE0EB0FFF03806D7F92C76C7F
+4A6E7F4A824A6E7FA2727EA285A28584A31A80AC1A00A44E5AA36118FF616E4A5BA26E4A
+5B6E4A5B6F495BDACFC04990C7FCDA87F0EB7FFC913A03FE03FFF849C6B612E0496D1480
+49011F01FCC8FC90C7000313C041547BD24B>I<913801FFF8021FEBFF8091B612F00103
+15FC010F9038C00FFE903A1FFE0001FFD97FFC491380D9FFF05B4817C048495B5C5A485B
+A2486F138091C7FC486F1300705A4892C8FC5BA312FFAD127F7FA27EA2EF03E06C7F1707
+6C6D15C07E6E140F6CEE1F806C6DEC3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01F
+F0010390B55A01001580023F49C7FC020113E033387CB63C>I<4DB47E0407B5FCA5EE00
+1F1707B3A4913801FFE0021F13FC91B6FC010315C7010F9038E03FE74990380007F7D97F
+FC0101B5FC49487F4849143F484980485B83485B5A91C8FC5AA3485AA412FFAC127FA36C
+7EA37EA26C7F5F6C6D5C7E6C6D5C6C6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0F
+FFC07FCF6D90B5128F0101ECFE0FD9003F13F8020301C049C7FC41547CD24B>I<913803
+FFC0023F13FC49B6FC010715C04901817F903A3FFC007FF849486D7E49486D7E4849130F
+48496D7E48178048497F18C0488191C7FC4817E0A248815B18F0A212FFA490B8FCA318E0
+49CAFCA6127FA27F7EA218E06CEE01F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C
+6DEC3F806D6CECFF00D91FFEEB03FE903A0FFFC03FF8010390B55A010015C0021F49C7FC
+020113F034387CB63D>I<ED3FFC0203B5FC020F14C0023F14E09139FFF81FF0499038C0
+3FF849EB807F49903800FFFC495A495AA2495AA2EE7FF8495AEE3FF0EE0FC093C7FCAEB7
+12E0A526007FF8C8FCB3B3A7007FB512FEA52E547CD329>I<DA3FFF14FF0103B5D8F007
+13C0010FDAFC1F13E0013FECFF7F90267FFC0F9038FF9FF09026FFE001EBF83F48496C13
+E0484990387FF01F4890C7D83FF813E0489338FC0FC0F0078048486E6CC7FCA2003F82A9
+001F5EA26C6C4A5AA26C5E6C6D495A6C6D495A6C6D485BDAFC0F5B4890B6C8FCD803EF14
+FC01C314F02607C03F90C9FC91CBFCA2120FA37FA213F813FE90B7FC6C16F817FF18C06C
+836C836C836D828448B9FC12074848C700031480D81FF8EC003F4848150748486F13C083
+485A83A56D5D007F18806D5D003F18006C6C4B5AD80FFEED1FFC6C6C6CEC7FF86C01E049
+485A6C01FE011F5B6C6CB71280010F03FCC7FC010115E0D9000F01FCC8FC3C4F7CB543>
+I<EB3FF0B5FCA51203C6FCB3A4EE1FFC93B512C0030314F0030F8092391FE07FFC92393F
+001FFE037C8003F07FDAF1E081ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3ACB6D8F807
+B612C0A542537BD24B>I<137F497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC
+90C8FCADEB3FF0B5FCA512017EB3B3A6B612E0A51B547BD325>I<EB3FF0B5FCA51203C6
+FCB3A54CB512F8A59339003FFE00EF1FF0EF3FC04D5A4DC7FCEE03FEEE07F84C5A4C5AEE
+7FC04CC8FC4B5A4B5AED0FF8ED1FE04B7E4B7EECF1FF02F37F02F77F91B6FC83159F030F
+7F02FE80DAF8077F4A7E6F7F6F7F83707E82707F84707F707F82707F84707F177F717E4D
+13C0B6D8F003B6FCA540537CD247>107 D<EB3FF0B5FCA512017EB3B3B3B1B612F0A51C
+537BD225>I<D93FF0D91FFCEDFFE0B591B500C0010713FE030302F0011F6D7E030F6E01
+7F8092271FE07FFCD9FF037F922A3F001FFE01F8007F0003027C9126FF03E080C602F06D
+D90780137FDAF1E0038FC77FDAF3C0159EDAF7806D01BC143F07FC8102FFC75C4A5EA24A
+5EA44A5EB3ACB6D8F807B6D8C03FB512FEA567367BB570>I<D93FF0EB1FFCB591B512C0
+030314F0030F8092391FE07FFC92393F001FFE0003027C80C602F07FDAF1E081ECF3C0DA
+F7807F8502FFC7FC5CA25CA45CB3ACB6D8F807B612C0A542367BB54B>I<913801FFE002
+1F13FE91B612C0010315F0010F9038807FFC903A1FFC000FFED97FF86D6C7E49486D7F48
+496D7F48496D7F4A147F48834890C86C7EA24883A248486F7EA3007F1880A400FF18C0AC
+007F1880A3003F18006D5DA26C5FA26C5F6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C
+495BD93FFE011F90C7FC903A0FFF807FFC6D90B55A010015C0023F91C8FC020113E03A38
+7CB643>I<903A3FF001FFE0B5010F13FE033FEBFFC092B612F002F301017F913AF7F800
+7FFE0003D9FFE0EB1FFFC602806D7F92C76C7F4A824A6E7F4A6E7FA2717FA285187F85A4
+721380AC1A0060A36118FFA2615F616E4A5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EB
+FFFC9126FBFE075B02F8B612E06F1480031F01FCC8FC030313C092CBFCB1B612F8A5414D
+7BB54B>I<90397FE003FEB590380FFF80033F13E04B13F09238FE1FF89139E1F83FFC00
+03D9E3E013FEC6ECC07FECE78014EF150014EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA5
+5CB3AAB612FCA52F367CB537>114 D<903903FFF00F013FEBFE1F90B7FC120348EB003F
+D80FF81307D81FE0130148487F4980127F90C87EA24881A27FA27F01F091C7FC13FCEBFF
+C06C13FF15F86C14FF16C06C15F06C816C816C81C681013F1580010F15C01300020714E0
+EC003F030713F015010078EC007F00F8153F161F7E160FA27E17E07E6D141F17C07F6DEC
+3F8001F8EC7F0001FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7
+FC2C387CB635>I<143EA6147EA414FEA21301A313031307A2130F131F133F13FF5A000F
+90B6FCB8FCA426003FFEC8FCB3A9EE07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6D
+EBF0FC6DEBFFF86D6C5B021F5B020313802A4D7ECB34>I<D93FF8913801FFC0B50207B5
+FCA50003ED001FC61607B3AE5FA35FA2017F5D173B177B6D6C14F3DC01E313F06D6CD907
+C3EBFFC0903A0FFFC03F836D90B51203010114FE6D6C13F8020701E091C7FC42377BB54B
+>I<B600F00107B5FCA5000101F8C8EA7FE06C6DED3F00A2017F163E6E157E013F167C6E
+15FC6D5E6F13016D5E8117036D5E6F13076D5E6F130F6D5E6F131F6D93C7FC815F6E6C13
+3E177E023F147C6F13FC6E5C16816E5C16C3A26EEBE3E016E76E5C16FF6E5CA26E91C8FC
+A26F5AA36F5AA26F5AA26F5AA26F5A6F5A40367DB447>I<B6D8E07FB5D8C003B512C0A5
+000101F0C701F0C7381FF8006E027FED07E06C715DA26E023F150F017F705DA26E181F01
+3F4B6C92C7FC6E606D70143E94B5FC6F177E6D4A6E137C03C001F315FC6D715B160303E0
+01E114016D020702E05B03F013C06D71485A160F03F8D9807F13076D05F85B93381F003F
+03FC160F027F4902FC5BDBFE3E011F131F023F04FE90C8FC167EDBFF7C010F5B6E01FCEC
+FF3E4C6D137E6E5FA24C7F6E5F4C7F6E5FA24C7F6E5F4C147FA26E5F93C8123F6F5EA203
+3E6FC9FC5A367DB461>I<B600F00107B5FCA5C601F8C8EA7FE06EED3F00A26D6C153E18
+7E013F167C6E15FC6D5E6F13016D5E6F13036D5E8117076D6D5C170F6D6D5C171F6D93C7
+FC6F5B027F143E6F137E023F147C6F13FCA26E6D5A16816EEBC1F016C36E5C16E76E5C16
+FF6E5CA26E91C8FCA36F5AA26F5AA26F5AA26F5AA26F5AA35E150F5E151F93C9FC5DD81F
+C0133E486C137E486C137C486C13FC5D14015D14034A5A6C48485A49485A263FC07FCAFC
+EB81FE6CB45A6C13F000035BC690CBFC404D7DB447>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmr10 10.95 51
+/Fl 51 122 df<EC03FE91383FFF809138FE03E0903903F800F0D90FE013384948137C90
+393F8001FE90387F00035B5BA2485A6F5AED007093C7FCAA16FEB7FCA33901FC00031501
+1500B3AC486C497EB5D8F87F13FCA32E407EBF33>12 D<1430147014E0EB01C0EB038013
+07EB0F00131E133E133C5B13F85B12015B1203A2485AA2120F5BA2121F90C7FCA25AA312
+3E127EA6127C12FCB2127C127EA6123E123FA37EA27F120FA27F1207A26C7EA212017F12
+007F13787F133E131E7FEB07801303EB01C0EB00E014701430145A77C323>40
+D<12C07E12707E7E121E7E6C7E7F12036C7E7F12007F1378137CA27FA2133F7FA2148013
+0FA214C0A3130714E0A6130314F0B214E01307A614C0130FA31480A2131F1400A25B133E
+A25BA2137813F85B12015B485A12075B48C7FC121E121C5A5A5A5A145A7BC323>I<B512
+FEA617067F961E>45 D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A798919>I<EB01
+FE90380FFFC090383F03F090387C00F849137C48487F48487F4848EB0F80A2000F15C048
+48EB07E0A3003F15F0A290C712034815F8A64815FCB3A26C15F8A56C6CEB07F0A3001F15
+E0A36C6CEB0FC0A26C6CEB1F80000315006C6C133E6C6C5B017C5B90383F03F090380FFF
+C0D901FEC7FC263F7DBC2D>48 D<EB01C013031307131F137FEA07FFB5FC139FEAF81F12
+00B3B3ACEB7FF0B612F8A31D3D78BC2D>I<EB07FC90383FFF8090B512E03903F01FF839
+07C007FC390F0001FE001E6D7E001C1580003CEC7FC05AED3FE01270B4FC6DEB1FF07FA5
+6C5A6CC7FC120CC813E0153FA216C0157F168015FF16004A5A5D4A5A4A5A5D4A5A4A5A4A
+C7FC147E147C5C495A495A495A495A49C71270133E133C5B4914E0485A485A485A48C712
+0148B6FCA25A4815C0B7FCA3243D7CBC2D>I<EB07FC90383FFF809038F80FE03901E003
+F839078001FCD80F007F000E6D7E001E1580D81F80137F486C14C07FA27F5BA2121F6C5A
+C8138015FF1600A24A5AA24A5A5DEC07E04A5A023FC7FCEB1FFCECFF809038000FE0EC07
+F86E7E6E7E6E7E1680ED7FC0A216E0153FA216F0A2120C123F487E487EA316E0A249137F
+6CC713C01278EDFF807E6C4913006C495A3907C007FC3903F80FF0C6B55A013F1380D907
+F8C7FC243F7CBC2D>I<150E151E153EA2157EA215FE1401A21403EC077E1406140E141C
+A214381470A214E0EB01C0A2EB0380EB0700A2130E5BA25B5BA25B5B1201485A90C7FC5A
+120E120C121C5AA25A5AB8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D>I<00061403D8
+0780131F01F813FE90B5FC5D5D5D15C092C7FC14FCEB3FE090C9FCACEB01FE90380FFF80
+90383E03E090387001F8496C7E49137E497F90C713800006141FC813C0A216E0150FA316
+F0A3120C127F7F12FFA416E090C7121F12FC007015C012780038EC3F80123C6CEC7F0000
+1F14FE6C6C485A6C6C485A3903F80FE0C6B55A013F90C7FCEB07F8243F7CBC2D>I<EC1F
+E0ECFFF8903803F03E90380FC00F90391F000780133E017EEB1FC049133F4848137F1203
+5B12074848EB3F80ED1F00001F91C7FC5BA2123FA3485AA214FE903887FF8039FF8F07E0
+90389C01F09038B800FC01B0137E13F0497F16804914C0A2ED1FE0A34914F0A5127FA612
+3F6D14E0A2121FED3FC0A26C6C1480A20007EC7F006C6C137E6C6C5B6C6C485A90387E07
+F06DB45A010F1380D903FCC7FC243F7CBC2D>I<1238123C123F90B612FCA316F85A16F0
+16E00078C712010070EC03C0ED078016005D48141E151C153C5DC8127015F04A5A5D1403
+4A5A92C7FC5C141EA25CA2147C147814F8A213015C1303A31307A3130F5CA2131FA6133F
+AA6D5A0107C8FC26407BBD2D>I<EB03FC90381FFF8090387C07E09038F001F83901E000
+7C48487F48487F48C7FCED0F80121E16C0003E1407A4123FA26DEB0F807F6C6C131F6D14
+0001FC133E6C6C5B9038FF80786C6D5A6CEBF3E06CEBFF806C91C7FC133F6D13C06D7F01
+3F13F801787F48486C7E3903E01FFF48486C1380260F800313C048487E489038007FE000
+3E143F007E141F007CEC0FF01507481403A31501A46C15E0007C1403A2007E15C06C1407
+6CEC0F806DEB1F006C6C133ED807F05B3901FC03F86CB512E0011F1380D903FCC7FC243F
+7CBC2D>I<EB03FCEB1FFF90387E07C09038FC03F048486C7E48486C7E4848137C000F14
+7E4848137F81003F15805B007F15C0A2151F12FF16E0A516F0A5127F153FA36C7EA2001F
+147F120F6C6C13FF6D13DF000313013900F8039F90387E0F1FD91FFE13E0EB07F090C7FC
+A2ED3FC0A41680157FD80F801400487E486C13FEA24A5A5D49485AEB8007391E000FE000
+1F495A260FC07FC7FC3803FFFE6C13F838003FC0243F7CBC2D>I<121EEA7F80A2EAFFC0
+A4EA7F80A2EA1E00C7FCB3121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2779A619>I<DB
+3FF01306912603FFFE130E020F9038FF801E913A3FF007E03E9139FF8000F8D903FEC7EA
+7C7ED907F8EC1EFE4948140FD93FE0140749481403495A91C81201484815001203484816
+7E5B000F173EA24848161EA2123F5B180E127FA349160012FFAC127F7F180EA2123FA27F
+001F171E181C6C7EA20007173C6D16386C6C1678000117706C6C16F06EEC01E06D6C15C0
+6D6C1403D90FF0EC07806D6CEC1F00D903FE143E902600FF8013F891393FF007F0020FB5
+12C0020391C7FC9138003FF037427BBF42>67 D<B712FCEEFF8017E000019039C0001FF8
+6C6C48EB03FEEE00FF717E717EEF0FE084717E717E170184717EA21980187F19C0A3F03F
+E0A519F0AB19E0A5F07FC0A21980A218FF19004D5AA24D5A6017074D5A4D5AEF7FC04DC7
+FCEE03FE48486CEB1FF8B85A178004FCC8FC3C3E7DBD45>I<B912E0A300019038C00001
+6C6C48EB001FEF0FF01703A217011700A31870A418381638A41800A21678A216F8150115
+0791B5FCA3EC8007150115001678A21638A2180EA3181C93C7FCA4183C1838A21878A318
+F8EF01F0A21707170F173F48486CEB03FFB912E0A3373E7DBD3E>I<B6D8C01FB512F8A3
+000101E0C7383FFC0026007F80EC0FF0B3A691B7FCA30280C7120FB3A92601FFE0EC3FFC
+B6D8C01FB512F8A33D3E7DBD44>72 D<B612F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0
+A31C3E7EBD21>I<011FB512FCA3D9000713006E5A1401B3B3A6123FEA7F80EAFFC0A44A
+5A1380D87F005B007C130700385C003C495A6C495A6C495A2603E07EC7FC3800FFF8EB3F
+C026407CBD2F>I<B612F8A3000101E0C9FC38007F80B3B0EF0380A517071800A45FA35F
+A25F5F5F4C5A160748486C133FB8FCA3313E7DBD39>76 D<B500C093B512C0A300016D4B
+EBE000D8007F1880D977F0ED03BFA3D973F8ED073FA3D971FC150EA2D970FE151CA3027F
+1538A36E6C1470A36E6C14E0A26E6CEB01C0A36E6CEB0380A36E6CEB0700A26E6C130EA3
+6E6C5BA3037F5BA26F6C5AA36F6C5AA392380FE1C0A3923807F380A26FB4C7FCA36F5AA2
+13F8486C6D5AD807FFEFFFE0B500F80178017FEBFFC0A34A3E7CBD53>I<B56C91B512F8
+8080D8007F030713006EEC01FC6E6E5A1870EB77FCEB73FEA2EB71FF01707FA26E7E6E7E
+A26E7E6E7EA26E7E6E7EA26E7E6E7FA26F7E6F7EA26F7E6F7EA26F7E6F7EA26F7E6F1380
+A2EE7FC0EE3FE0A2EE1FF0EE0FF8A2EE07FCEE03FEA2EE01FF7013F0A2177F173FA2171F
+170FA2170701F81503487ED807FF1501B500F81400A218703D3E7DBD44>I<B712F8EEFF
+8017E000019039C0003FF86C6C48EB07FCEE01FE707EEF7F80EF3FC018E0A2EF1FF0A218
+F8A818F0A2EF3FE0A218C0EF7F80EFFF004C5AEE07FCEE3FF091B612C04CC7FC0280C9FC
+B3A73801FFE0B612C0A3353E7DBD3E>80 D<D907FC131890391FFF8038017FEBE0783901
+FC03F83A03F0007CF8D807C0133F4848130F001F140748C7FC003E1403007E1401A2007C
+140012FC1678A46C1538A27EA26C6C14007F7FEA3FF8EBFF806C13F86CEBFF806C14F06C
+14FC6C14FF6C15C0013F14E0010714F0EB007F020713F89138007FFC150FED07FE150315
+01ED00FFA200E0157FA3163FA27EA3163E7E167E6C157C6C15FC6C15F86D13016DEB03F0
+6DEB07E0D8F9FCEB0FC03AF07F803F8090391FFFFE00D8E00713F839C0007FC028427BBF
+33>83 D<003FB91280A3903AF0007FE001018090393FC0003F48C7ED1FC0007E1707127C
+00781703A300701701A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC42>
+I<B66C0103B51280A3000101F0C8EBF8006C6C48ED3FC0725A013F041EC7FC6D7E606D6C
+15386D6C1578606D6C5D6E14016D5E6D6D1303606E6C49C8FC6E6C5B170E6E6C131E171C
+6E6C5B6E6C137817706E6C13F06F5B6E13016EEB83C05FED7FC7DB3FE7C9FC16EFED1FFE
+5E150F6F5AB3A4ED1FFC020FB512FCA3413E7FBD44>89 D<EB0FF8EBFFFE3903F01F8039
+078007E0000F6D7E9038E001F8D81FF07F6E7EA3157F6C5AEA0380C8FCA4EC1FFF0103B5
+FC90381FF87FEB7F803801FC00EA07F8EA0FE0485A485AA248C7FCEE038012FEA315FFA3
+007F5BEC03BF3B3F80071F8700261FC00E13CF3A07F03C0FFE3A01FFF807FC3A003FC001
+F0292A7DA82D>97 D<EA01FC12FFA3120712031201B1EC03FC91381FFF8091387C07E090
+39FDE001F09039FFC000FC4A137E91C77E49158049141F17C0EE0FE0A217F0A2160717F8
+AA17F0A2160FA217E0161F17C06D1580EE3F006D5C6E13FE9039F3C001F89039F1E003F0
+9039E0780FC09026C03FFFC7FCC7EA07F82D407EBE33>I<49B4FC010F13E090383F00F8
+017C131E4848131F4848137F0007ECFF80485A5B121FA24848EB7F00151C007F91C7FCA2
+90C9FC5AAB6C7EA3003FEC01C07F001F140316806C6C13076C6C14000003140E6C6C131E
+6C6C137890383F01F090380FFFC0D901FEC7FC222A7DA828>I<ED01FC15FFA315071503
+1501B114FF010713E190381F80F990387E003D49131FD803F81307485A49130348481301
+121F123F5B127FA290C7FCA25AAA7E7FA2123FA26C7E000F14037F000714076C6C497E6C
+6C497ED8007C017913F890383F01F190380FFFC1903A01FE01FC002D407DBE33>I<EB01
+FE90380FFFC090383F03F09038FC01F848486C7E4848137E48487F000F158049131F001F
+15C04848130FA2127F16E090C7FCA25AA290B6FCA290C9FCA67EA27F123F16E06C7E1501
+000F15C06C6C13036DEB07806C6C1400C66C131E017E5B90381F80F8903807FFE0010090
+C7FC232A7EA828>I<EC1FC0EC7FF8903801F83C903807E07E90380FC0FFEB1FC1EB3F81
+1401137FEC00FE01FE137C1500AEB6FCA3C648C7FCB3AE487E007F13FFA320407EBF1C>
+I<167C903903F801FF903A1FFF078F8090397E0FDE1F9038F803F83803F001A23B07E000
+FC0600000F6EC7FC49137E001F147FA8000F147E6D13FE00075C6C6C485AA23901F803E0
+3903FE0FC026071FFFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C
+15E06C810003813A0FC0001FFC48C7EA01FE003E140048157E825A82A46C5D007C153E00
+7E157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C029
+3D7EA82D>I<EA01FC12FFA3120712031201B1EC01FE913807FFC091381E07E091387803
+F09138E001F8D9FDC07F148001FF6D7E91C7FCA25BA25BB3A6486C497EB5D8F87F13FCA3
+2E3F7DBE33>I<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCACEA01FC127FA312071203
+1201B3AC487EB512F0A3143E7DBD1A>I<EA01FC12FFA3120712031201B3B3B1487EB512
+F8A3153F7DBE1A>108 D<2701F801FE14FF00FF902707FFC00313E0913B1E07E00F03F0
+913B7803F03C01F80007903BE001F87000FC2603F9C06D487F000101805C01FBD900FF14
+7F91C75B13FF4992C7FCA2495CB3A6486C496CECFF80B5D8F87FD9FC3F13FEA347287DA7
+4C>I<3901F801FE00FF903807FFC091381E07E091387803F000079038E001F82603F9C0
+7F0001138001FB6D7E91C7FC13FF5BA25BB3A6486C497EB5D8F87F13FCA32E287DA733>
+I<14FF010713E090381F81F890387E007E01F8131F4848EB0F804848EB07C04848EB03E0
+000F15F04848EB01F8A2003F15FCA248C812FEA44815FFA96C15FEA36C6CEB01FCA3001F
+15F86C6CEB03F0A26C6CEB07E06C6CEB0FC06C6CEB1F80D8007EEB7E0090383F81FC9038
+0FFFF0010090C7FC282A7EA82D>I<3901FC03FC00FF90381FFF8091387C0FE09039FDE0
+03F03A07FFC001FC6C496C7E6C90C7127F49EC3F805BEE1FC017E0A2EE0FF0A3EE07F8AA
+EE0FF0A4EE1FE0A2EE3FC06D1580EE7F007F6E13FE9138C001F89039FDE007F09039FC78
+0FC0DA3FFFC7FCEC07F891C9FCAD487EB512F8A32D3A7EA733>I<3901F807E000FFEB1F
+F8EC787CECE1FE3807F9C100031381EA01FB1401EC00FC01FF1330491300A35BB3A5487E
+B512FEA31F287EA724>114 D<90383FC0603901FFF8E03807C03F381F000F003E130700
+3C1303127C0078130112F81400A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F6C14
+80000114C0D8003F13E0010313F0EB001FEC0FF800E01303A214017E1400A27E15F07E14
+016C14E06CEB03C0903880078039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<131CA6
+133CA4137CA213FCA2120112031207001FB512C0B6FCA2D801FCC7FCB3A215E0A9120090
+38FE01C0A2EB7F03013F138090381F8700EB07FEEB01F81B397EB723>I<D801FC14FE00
+FF147FA3000714030003140100011400B3A51501A31503120015076DEB06FF017E010E13
+806D4913FC90381FC078903807FFE00100903880FE002E297DA733>I<B539E00FFFE0A3
+2707FE000313006C48EB00FC5E00015D7F00005DA26D13016D5CA26D6C485AA2ECC00701
+1F91C7FCA290380FE00EA2ECF01E0107131CA26D6C5AA2ECFC7801011370A2ECFEF00100
+5BA2EC7FC0A36E5AA26EC8FCA3140E2B287EA630>I<B53BC3FFFE03FFF8A3290FFE003F
+E00013C06C486D48EB3F806C4817006D010F141E00016F131C15076D163C00004A6C1338
+A2017F5E4B7E151DD93F805DED3DFC1538D91FC04A5AED78FE9238707E03D90FE0017F5B
+EDE03F02F0140701070387C7FC9138F1C01F02F9148F010315CE9138FB800F02FF14DE6D
+15FCED00076D5DA24A1303027E5CA2027C1301023C5C023813003D287EA642>I<B539F0
+1FFFE0A30003D9C00F1300C690388007F8D97F0013E002805BD93FC05B011F49C7FC9038
+0FE00EECF01E6D6C5A01035B6D6C5A6E5AEB00FF6E5A6E5A81141F814A7E81147BECF1FC
+903801E1FEECC0FF01037F49486C7ED90F007F011E6D7E013E130F496D7E01FC80486C80
+000F4A7EB539803FFFF8A32D277FA630>I<B539E00FFFE0A32707FE000313006C48EB01
+FC6F5A00015D7F00005DA2017F495AA2EC8003013F5CA26D6C48C7FCA26E5A010F130EA2
+6D6C5AA2ECF83C01031338A26D6C5AA2ECFEF001005BA2EC7FC0A36E5AA36EC8FCA2140E
+A2141E141C143C1438A2147800181370127EB45BA2495AA248485AD87E07C9FCEA780EEA
+3C3CEA1FF8EA07E02B3A7EA630>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmbx12 20.736 9
+/Fm 9 123 df<92380FFFE04AB67E020F15F0027F15FE49B87E4917E0010F17F8013F83
+49D9C01F14FF9027FFFC0001814801E06D6C80480180021F804890C86C8048486F804848
+6F8001FF6F804801C06E8002F081486D18806E816E18C0B5821BE06E81A37214F0A56C5B
+A36C5B6C5B6C5B000313C0C690C9FC90CA15E060A34E14C0A21B80601B0060626295B55A
+5F624D5C624D5C4D91C7FC614D5B4D13F04D5B6194B55A4C49C8FC4C5B4C5B4C13E04C5B
+604C90C9FCEE7FFC4C5A4B5B4B5B4B0180EC0FF04B90C8FC4B5A4B5A4B48ED1FE0EDFFE0
+4A5B4A5B4A90C9FC4A48163F4A5ADA3FF017C05D4A48167F4A5A4990CA12FFD903FC1607
+49BAFC5B4919805B5B90BBFC5A5A5A5A481A005A5ABCFCA462A44C7176F061>50
+D<92383FFFF80207B612E0027F15FC49B87E010717E0011F83499026F0007F13FC4948C7
+000F7F90B502036D7E486E6D806F6D80727F486E6E7F8486727FA28684A26C5C72806C5C
+6D90C8FC6D5AEB0FF8EB03E090CAFCA70507B6FC041FB7FC0303B8FC157F0203B9FC021F
+ECFE0391B612800103ECF800010F14C04991C7FC017F13FC90B512F04814C0485C4891C8
+FC485B5A485B5C5A5CA2B5FC5CA360A36E5DA26C5F6E5D187E6C6D846E4A48806C6D4A48
+14FC6C6ED90FF0ECFFFC6C02E090263FE07F14FE00019139FC03FFC06C91B6487E013F4B
+487E010F4B1307010303F01301D9003F0280D9003F13FC020101F8CBFC57507ACE5E>97
+D<903801FFFCB6FCA8C67E131F7FB3ADF0FFFC050FEBFFE0057F14FE0403B77E040F16E0
+043F16F84CD9007F13FE9226FDFFF001077F92B500C001018094C86C13E004FC6F7F4C6F
+7F04E06F7F4C6F7F5E747F93C915804B7014C0A27414E0A21DF087A21DF8A31DFC87A41D
+FEAF1DFCA4631DF8A31DF098B5FC1DE0A25014C0A26F1980501400705D705F704B5B505B
+704B5B04FC4B5BDBE7FE92B55A9226C3FF8001035C038101E0011F49C7FC9226807FFC90
+B55A4B6CB712F04A010F16C04A010393C8FC4A010015F84A023F14C090C9000301F0C9FC
+5F797AF76C>I<97380FFFE00607B6FCA8F00003190086B3AD93383FFF800307B512F803
+3F14FF4AB712C0020716F0021F16FC027F9039FE007FFE91B500F0EB0FFF010302800101
+90B5FC4949C87E49498149498149498149498190B548814884484A8192CAFC5AA2485BA2
+5A5C5AA35A5CA4B5FCAF7EA4807EA37EA2807EA26C7F616C6E5D6C606C80616D6D5D6D6D
+5D6D6D92B67E6D6D4A15FC010301FF0207EDFFFE6D02C0EB3FFE6D6C9039FC01FFF86E90
+B65A020F16C002031600DA007F14FC030F14E09226007FFEC749C7FC5F797AF76C>100
+D<EB01FCEB07FF011F13C0497F497F90B57EA24880A24880A76C5CA26C5CA26D5B6D5B6D
+5B010790C8FCEB01FC90CAFCB2903801FFFC007FB5FCA8C67E131F7FB3B3B3A5B81280A8
+297979F835>105 D<903801FFFCB6FCA8C67E131F7FB3B3B3B3B3ABB812C0A82A7879F7
+35>108 D<902601FFF891380FFFE0B692B512FE05036E7E050F15E0053F15F84D819327
+01FFF01F7F4CD900077FDC07FC6D80C66CDA0FF06D80011FDA1FC07F6D4A48824CC8FC04
+7E6F7F5EEDF9F85E03FB707F5E15FF5EA25EA293C9FCA45DB3B3A6B8D8E003B81280A861
+4E79CD6C>110 D<902601FFFCEC7FFEB6020FB512F0057F14FE4CB712C0040716F0041F
+82047F16FE93B5C66C7F92B500F0010F14C0C66C0380010380011F4AC76C806D4A6E8004
+F06F7F4C6F7F4C6F7F4C8193C915804B7014C0861DE0A27414F0A27414F8A47513FCA575
+13FEAF5113FCA598B512F8A31DF0621DE0621DC0621D806F5E701800704B5B505B704B5B
+7092B55A04FC4A5C704A5C706C010F5C05E0013F49C7FC9227FE7FFC01B55A70B712F004
+0F16C0040393C8FC040015F8053F14C0050301F0C9FC94CCFCB3A6B812E0A85F6F7ACD6C
+>112 D<0007BA12FE1AFFA503E0C76C13FE4AC8B512FC4801F04A14F84A5C4A17F091C8
+4814E04D14C0495D4918804D1400494B5B94B5FC61494A5C4C5C5E61001F4B5C494A5C5E
+96C7FC4C5B93B55A5DC85D4B5C4B5C5D604B5C4B91C8FC5D5F92B55A4A5C5C4D14FF4A5C
+4A5C5C5F4A91C75A4A4915FE91B5FC5E495C495C4917035E495C495C49170793C8FC4949
+ED0FFC90B55A48181F5D484A153F484A157F4818FF4B1403484A140F4891C8123F480407
+B5FC92B8FCBB12F8A57E484D7BCC56>122 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 150 1318 a Fm(bzip2)64 b(and)g(libbzip2)p 150
+1418 3600 34 v 2010 1515 a Fl(a)31 b(program)f(and)g(library)e(for)i
+(data)h(compression)2198 1623 y(cop)m(yrigh)m(t)f(\(C\))h(1996-2002)j
+(Julian)28 b(Sew)m(ard)2394 1731 y(v)m(ersion)i(1.0.2)i(of)f(30)g
+(Decem)m(b)s(er)g(2001)150 5091 y Fk(Julian)46 b(Sew)l(ard)p
+150 5141 3600 17 v eop
+%%Page: 1 2
+1 1 bop 3705 -116 a Fl(1)150 299 y(The)40 b(follo)m(wing)f(text)i(is)f
+(the)h(License)f(for)g(this)f(soft)m(w)m(are.)73 b(Y)-8
+b(ou)41 b(should)d(\014nd)h(it)h(iden)m(tical)f(to)i(that)150
+408 y(con)m(tained)31 b(in)e(the)h(\014le)g(LICENSE)f(in)g(the)h
+(source)h(distribution.)150 565 y Fj(||||||)f(ST)-8 b(AR)g(T)30
+b(OF)h(THE)f(LICENSE)f(||||||)150 722 y(This)24 b(program,)i
+Fi(bzip2)p Fj(,)f(and)f(asso)s(ciated)h(library)g Fi(libbzip2)p
+Fj(,)e(are)i(Cop)m(yrigh)m(t)h(\(C\))f(1996-2002)j(Julian)150
+832 y(R)i(Sew)m(ard.)41 b(All)30 b(righ)m(ts)h(reserv)m(ed.)150
+989 y(Redistribution)46 b(and)f(use)g(in)g(source)h(and)f(binary)f
+(forms,)50 b(with)45 b(or)h(without)g(mo)s(di\014cation,)j(are)150
+1098 y(p)s(ermitted)31 b(pro)m(vided)f(that)h(the)g(follo)m(wing)g
+(conditions)g(are)g(met:)225 1255 y Fh(\017)60 b Fj(Redistributions)44
+b(of)g(source)g(co)s(de)f(m)m(ust)h(retain)g(the)g(ab)s(o)m(v)m(e)h
+(cop)m(yrigh)m(t)g(notice,)k(this)43 b(list)i(of)330
+1365 y(conditions)31 b(and)e(the)i(follo)m(wing)h(disclaimer.)225
+1499 y Fh(\017)60 b Fj(The)32 b(origin)g(of)g(this)g(soft)m(w)m(are)h
+(m)m(ust)f(not)g(b)s(e)f(misrepresen)m(ted;)j(y)m(ou)e(m)m(ust)g(not)g
+(claim)g(that)h(y)m(ou)330 1609 y(wrote)d(the)f(original)h(soft)m(w)m
+(are.)42 b(If)29 b(y)m(ou)g(use)g(this)g(soft)m(w)m(are)i(in)d(a)h(pro)
+s(duct,)g(an)g(ac)m(kno)m(wledgmen)m(t)330 1718 y(in)h(the)h(pro)s
+(duct)e(do)s(cumen)m(tation)j(w)m(ould)e(b)s(e)f(appreciated)j(but)d
+(is)i(not)g(required.)225 1853 y Fh(\017)60 b Fj(Altered)36
+b(source)g(v)m(ersions)g(m)m(ust)f(b)s(e)f(plainly)i(mark)m(ed)f(as)g
+(suc)m(h,)i(and)d(m)m(ust)h(not)h(b)s(e)f(misrepre-)330
+1962 y(sen)m(ted)c(as)f(b)s(eing)g(the)h(original)h(soft)m(w)m(are.)225
+2097 y Fh(\017)60 b Fj(The)25 b(name)g(of)g(the)g(author)g(ma)m(y)h
+(not)f(b)s(e)f(used)h(to)g(endorse)g(or)h(promote)g(pro)s(ducts)e
+(deriv)m(ed)h(from)330 2206 y(this)30 b(soft)m(w)m(are)i(without)f(sp)s
+(eci\014c)f(prior)g(written)h(p)s(ermission.)150 2388
+y(THIS)36 b(SOFTW)-10 b(ARE)35 b(IS)h(PR)m(O)m(VIDED)g(BY)f(THE)h(A)m
+(UTHOR)h(\\AS)f(IS")g(AND)f(ANY)h(EXPRESS)150 2498 y(OR)29
+b(IMPLIED)g(W)-10 b(ARRANTIES,)28 b(INCLUDING,)h(BUT)g(NOT)g(LIMITED)g
+(TO,)h(THE)e(IMPLIED)150 2607 y(W)-10 b(ARRANTIES)60
+b(OF)h(MER)m(CHANT)-8 b(ABILITY)61 b(AND)g(FITNESS)f(F)m(OR)i(A)f(P)-8
+b(AR)g(TICULAR)150 2717 y(PURPOSE)40 b(ARE)g(DISCLAIMED.)f(IN)i(NO)g
+(EVENT)f(SHALL)f(THE)i(A)m(UTHOR)g(BE)f(LIABLE)150 2827
+y(F)m(OR)d(ANY)f(DIRECT,)g(INDIRECT,)g(INCIDENT)-8 b(AL,)37
+b(SPECIAL,)d(EXEMPLAR)-8 b(Y,)36 b(OR)h(CON-)150 2936
+y(SEQUENTIAL)30 b(D)m(AMA)m(GES)h(\(INCLUDING,)h(BUT)e(NOT)i(LIMITED)f
+(TO,)h(PR)m(OCUREMENT)150 3046 y(OF)55 b(SUBSTITUTE)e(GOODS)i(OR)f(SER)
+-10 b(VICES;)53 b(LOSS)g(OF)i(USE,)f(D)m(A)-8 b(T)g(A,)55
+b(OR)g(PR)m(OFITS;)150 3155 y(OR)e(BUSINESS)d(INTERR)m(UPTION\))k(HO)m
+(WEVER)e(CA)m(USED)f(AND)h(ON)h(ANY)f(THEOR)-8 b(Y)150
+3265 y(OF)71 b(LIABILITY,)f(WHETHER)g(IN)h(CONTRA)m(CT,)g(STRICT)g
+(LIABILITY,)e(OR)i(TOR)-8 b(T)150 3374 y(\(INCLUDING)45
+b(NEGLIGENCE)g(OR)g(OTHER)-10 b(WISE\))45 b(ARISING)g(IN)g(ANY)g(W)-10
+b(A)i(Y)44 b(OUT)i(OF)150 3484 y(THE)i(USE)f(OF)h(THIS)g(SOFTW)-10
+b(ARE,)47 b(EVEN)g(IF)h(AD)m(VISED)e(OF)i(THE)g(POSSIBILITY)f(OF)150
+3594 y(SUCH)30 b(D)m(AMA)m(GE.)150 3750 y(Julian)g(Sew)m(ard,)g(Cam)m
+(bridge,)h(UK.)150 3907 y Fi(jseward@acm.org)150 4064
+y(bzip2)p Fj(/)p Fi(libbzip2)c Fj(v)m(ersion)k(1.0.2)i(of)d(30)h(Decem)
+m(b)s(er)g(2001.)150 4221 y(||||||)f(END)g(OF)g(THE)g(LICENSE)f(||||||)
+150 4378 y(W)-8 b(eb)31 b(sites:)150 4535 y Fi
+(http://sources.redhat.co)o(m/bz)o(ip2)150 4691 y
+(http://www.cacheprof.org)150 4848 y Fj(P)-8 b(A)g(TENTS:)40
+b(T)-8 b(o)40 b(the)f(b)s(est)g(of)g(m)m(y)h(kno)m(wledge,)i
+Fi(bzip2)c Fj(do)s(es)h(not)g(use)g(an)m(y)h(paten)m(ted)g(algorithms.)
+150 4958 y(Ho)m(w)m(ev)m(er,)31 b(I)c(do)h(not)g(ha)m(v)m(e)g(the)g
+(resources)h(a)m(v)-5 b(ailable)29 b(to)f(carry)g(out)g(a)g(full)f
+(paten)m(t)i(searc)m(h.)40 b(Therefore)150 5067 y(I)30
+b(cannot)h(giv)m(e)h(an)m(y)f(guaran)m(tee)g(of)g(the)g(ab)s(o)m(v)m(e)
+g(statemen)m(t.)p eop
+%%Page: 2 3
+2 2 bop 150 -116 a Fl(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2591
+b(2)150 299 y Fg(1)80 b(In)l(tro)t(duction)150 555 y
+Fi(bzip2)40 b Fj(compresses)h(\014les)g(using)g(the)g(Burro)m
+(ws-Wheeler)h(blo)s(c)m(k-sorting)h(text)f(compression)f(algo-)150
+665 y(rithm,)54 b(and)49 b(Hu\013man)f(co)s(ding.)98
+b(Compression)49 b(is)h(generally)h(considerably)e(b)s(etter)h(than)f
+(that)150 775 y(ac)m(hiev)m(ed)43 b(b)m(y)f(more)g(con)m(v)m(en)m
+(tional)i(LZ77/LZ78-based)e(compressors,)j(and)40 b(approac)m(hes)i
+(the)g(p)s(er-)150 884 y(formance)31 b(of)f(the)h(PPM)g(family)f(of)h
+(statistical)i(compressors.)150 1041 y Fi(bzip2)g Fj(is)h(built)h(on)f
+(top)h(of)f Fi(libbzip2)p Fj(,)f(a)i(\015exible)f(library)h(for)f
+(handling)g(compressed)g(data)h(in)f(the)150 1151 y Fi(bzip2)29
+b Fj(format.)41 b(This)30 b(man)m(ual)g(describ)s(es)g(b)s(oth)f(ho)m
+(w)i(to)g(use)f(the)g(program)h(and)e(ho)m(w)h(to)h(w)m(ork)g(with)150
+1260 y(the)26 b(library)f(in)m(terface.)41 b(Most)26
+b(of)f(the)h(man)m(ual)f(is)g(dev)m(oted)i(to)f(this)f(library)-8
+b(,)27 b(not)f(the)g(program,)g(whic)m(h)150 1370 y(is)k(go)s(o)s(d)h
+(news)e(if)i(y)m(our)f(in)m(terest)i(is)f(only)f(in)g(the)h(program.)
+150 1527 y(Chapter)45 b(2)h(describ)s(es)e(ho)m(w)i(to)g(use)f
+Fi(bzip2)p Fj(;)51 b(this)46 b(is)f(the)h(only)f(part)g(y)m(ou)h(need)f
+(to)h(read)f(if)h(y)m(ou)150 1636 y(just)39 b(w)m(an)m(t)g(to)h(kno)m
+(w)f(ho)m(w)h(to)f(op)s(erate)h(the)g(program.)67 b(Chapter)38
+b(3)i(describ)s(es)e(the)i(programming)150 1746 y(in)m(terfaces)27
+b(in)f(detail,)i(and)d(Chapter)g(4)h(records)g(some)g(miscellaneous)h
+(notes)f(whic)m(h)g(I)g(though)m(t)g(ough)m(t)150 1855
+y(to)31 b(b)s(e)f(recorded)h(somewhere.)p eop
+%%Page: 3 4
+3 3 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(3)150 299 y Fg(2)80 b(Ho)l(w)53
+b(to)g(use)g Ff(bzip2)150 566 y Fj(This)30 b(c)m(hapter)h(con)m(tains)h
+(a)e(cop)m(y)h(of)g(the)g Fi(bzip2)d Fj(man)i(page,)h(and)f(nothing)g
+(else.)390 818 y Fe(NAME)570 1004 y Fi(bzip2)p Fj(,)f
+Fi(bunzip2)g Fj(-)h(a)h(blo)s(c)m(k-sorting)h(\014le)e(compressor,)h
+(v1.0.2)570 1136 y Fi(bzcat)e Fj(-)i(decompresses)f(\014les)h(to)g
+(stdout)570 1267 y Fi(bzip2recover)c Fj(-)k(reco)m(v)m(ers)h(data)f
+(from)f(damaged)g(bzip2)h(\014les)390 1519 y Fe(SYNOPSIS)570
+1706 y Fi(bzip2)e Fj([)i(-cdfkqstvzVL123456789)j(])d([)g(\014lenames)f
+(...)41 b(])570 1837 y Fi(bunzip2)28 b Fj([)j(-fkvsVL)f(])g([)h
+(\014lenames)f(...)41 b(])570 1968 y Fi(bzcat)29 b Fj([)i(-s)f(])h([)g
+(\014lenames)f(...)41 b(])570 2100 y Fi(bzip2recover)27
+b Fj(\014lename)390 2352 y Fe(DESCRIPTION)390 2538 y
+Fi(bzip2)e Fj(compresses)i(\014les)f(using)g(the)h(Burro)m(ws-Wheeler)g
+(blo)s(c)m(k)f(sorting)i(text)f(compres-)390 2642 y(sion)39
+b(algorithm,)k(and)38 b(Hu\013man)h(co)s(ding.)67 b(Compression)39
+b(is)g(generally)i(considerably)390 2746 y(b)s(etter)23
+b(than)g(that)g(ac)m(hiev)m(ed)h(b)m(y)f(more)g(con)m(v)m(en)m(tional)i
+(LZ77/LZ78-based)e(compressors,)390 2850 y(and)k(approac)m(hes)i(the)f
+(p)s(erformance)g(of)h(the)f(PPM)h(family)f(of)h(statistical)h
+(compressors.)390 3001 y(The)c(command-line)g(options)g(are)g(delib)s
+(erately)h(v)m(ery)f(similar)h(to)f(those)h(of)f(GNU)g
+Fi(gzip)p Fj(,)390 3104 y(but)k(they)g(are)h(not)g(iden)m(tical.)390
+3255 y Fi(bzip2)e Fj(exp)s(ects)j(a)f(list)h(of)f(\014le)g(names)f(to)i
+(accompan)m(y)g(the)f(command-line)g(\015ags.)43 b(Eac)m(h)390
+3359 y(\014le)d(is)h(replaced)g(b)m(y)f(a)g(compressed)h(v)m(ersion)g
+(of)f(itself,)k(with)d(the)f(name)g Fi(original_)390
+3463 y(name.bz2)p Fj(.)45 b(Eac)m(h)33 b(compressed)g(\014le)g(has)f
+(the)h(same)g(mo)s(di\014cation)g(date,)h(p)s(ermissions,)390
+3567 y(and,)47 b(when)c(p)s(ossible,)k(o)m(wnership)c(as)h(the)g
+(corresp)s(onding)g(original,)49 b(so)44 b(that)g(these)390
+3671 y(prop)s(erties)37 b(can)g(b)s(e)g(correctly)i(restored)f(at)g
+(decompression)f(time.)62 b(File)39 b(name)d(han-)390
+3774 y(dling)e(is)g(naiv)m(e)h(in)f(the)g(sense)g(that)h(there)f(is)g
+(no)g(mec)m(hanism)g(for)h(preserving)f(original)390
+3878 y(\014le)41 b(names,)i(p)s(ermissions,)g(o)m(wnerships)d(or)h
+(dates)g(in)g(\014lesystems)g(whic)m(h)f(lac)m(k)i(these)390
+3982 y(concepts,)32 b(or)e(ha)m(v)m(e)i(serious)e(\014le)h(name)f
+(length)h(restrictions,)h(suc)m(h)e(as)g(MS-DOS.)390
+4133 y Fi(bzip2)24 b Fj(and)i Fi(bunzip2)d Fj(will)k(b)m(y)f(default)f
+(not)i(o)m(v)m(erwrite)h(existing)f(\014les.)39 b(If)26
+b(y)m(ou)g(w)m(an)m(t)h(this)390 4237 y(to)k(happ)s(en,)e(sp)s(ecify)h
+(the)h Fi(-f)e Fj(\015ag.)390 4388 y(If)k(no)f(\014le)h(names)f(are)i
+(sp)s(eci\014ed,)e Fi(bzip2)g Fj(compresses)h(from)f(standard)g(input)g
+(to)i(stan-)390 4491 y(dard)d(output.)44 b(In)32 b(this)f(case,)i
+Fi(bzip2)e Fj(will)h(decline)g(to)h(write)f(compressed)g(output)f(to)i
+(a)390 4595 y(terminal,)e(as)g(this)f(w)m(ould)g(b)s(e)g(en)m(tirely)i
+(incomprehensible)e(and)g(therefore)h(p)s(oin)m(tless.)390
+4746 y Fi(bunzip2)j Fj(\(or)j Fi(bzip2)29 b(-d)p Fj(\))36
+b(decompresses)g(all)h(sp)s(eci\014ed)e(\014les.)58 b(Files)37
+b(whic)m(h)f(w)m(ere)h(not)390 4850 y(created)f(b)m(y)e
+Fi(bzip2)g Fj(will)g(b)s(e)g(detected)j(and)c(ignored,)k(and)c(a)i(w)m
+(arning)g(issued.)52 b Fi(bzip2)390 4954 y Fj(attempts)29
+b(to)f(guess)g(the)g(\014lename)f(for)h(the)g(decompressed)f(\014le)h
+(from)f(that)h(of)g(the)g(com-)390 5058 y(pressed)i(\014le)g(as)h
+(follo)m(ws:)570 5209 y Fi(filename.bz2)57 b Fj(b)s(ecomes)31
+b Fi(filename)570 5340 y(filename.bz)58 b Fj(b)s(ecomes)30
+b Fi(filename)p eop
+%%Page: 4 5
+4 4 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(4)570 299 y Fi(filename.tbz2)27
+b Fj(b)s(ecomes)j Fi(filename.tar)570 470 y(filename.tbz)57
+b Fj(b)s(ecomes)31 b Fi(filename.tar)570 641 y(anyothername)57
+b Fj(b)s(ecomes)31 b Fi(anyothername.out)390 859 y Fj(If)i(the)g
+(\014le)f(do)s(es)h(not)g(end)f(in)g(one)i(of)e(the)h(recognised)h
+(endings,)f Fi(.bz2)p Fj(,)g Fi(.bz)p Fj(,)f Fi(.tbz2)g
+Fj(or)390 963 y Fi(.tbz)p Fj(,)h Fi(bzip2)g Fj(complains)g(that)h(it)h
+(cannot)f(guess)f(the)h(name)g(of)f(the)h(original)h(\014le,)g(and)390
+1067 y(uses)30 b(the)h(original)g(name)f(with)h Fi(.out)e
+Fj(app)s(ended.)390 1218 y(As)g(with)h(compression,)h(supplying)e(no)h
+(\014lenames)f(causes)i(decompression)f(from)g(stan-)390
+1321 y(dard)f(input)h(to)h(standard)f(output.)390 1472
+y Fi(bunzip2)h Fj(will)j(correctly)i(decompress)d(a)h(\014le)f(whic)m
+(h)g(is)h(the)g(concatenation)h(of)f(t)m(w)m(o)h(or)390
+1576 y(more)i(compressed)g(\014les.)61 b(The)37 b(result)g(is)g(the)g
+(concatenation)i(of)e(the)g(corresp)s(onding)390 1680
+y(uncompressed)c(\014les.)52 b(In)m(tegrit)m(y)37 b(testing)e(\()p
+Fi(-t)p Fj(\))f(of)h(concatenated)h(compressed)e(\014les)g(is)390
+1784 y(also)d(supp)s(orted.)390 1935 y(Y)-8 b(ou)38 b(can)g(also)g
+(compress)g(or)g(decompress)g(\014les)f(to)i(the)f(standard)f(output)g
+(b)m(y)h(giving)390 2039 y(the)44 b Fi(-c)e Fj(\015ag.)79
+b(Multiple)44 b(\014les)g(ma)m(y)f(b)s(e)g(compressed)g(and)f
+(decompressed)h(lik)m(e)i(this.)390 2142 y(The)31 b(resulting)h
+(outputs)e(are)i(fed)f(sequen)m(tially)h(to)g(stdout.)43
+b(Compression)31 b(of)g(m)m(ultiple)390 2246 y(\014les)43
+b(in)g(this)g(manner)g(generates)i(a)e(stream)h(con)m(taining)g(m)m
+(ultiple)h(compressed)e(\014le)390 2350 y(represen)m(tations.)48
+b(Suc)m(h)32 b(a)g(stream)h(can)f(b)s(e)g(decompressed)g(correctly)j
+(only)d(b)m(y)g Fi(bzip2)390 2454 y Fj(v)m(ersion)h(0.9.0)h(or)f
+(later.)48 b(Earlier)33 b(v)m(ersions)g(of)g Fi(bzip2)e
+Fj(will)i(stop)g(after)g(decompressing)390 2558 y(the)e(\014rst)f
+(\014le)g(in)g(the)h(stream.)390 2709 y Fi(bzcat)e Fj(\(or)i
+Fi(bzip2)e(-dc)p Fj(\))h(decompresses)g(all)h(sp)s(eci\014ed)f(\014les)
+g(to)i(the)e(standard)g(output.)390 2860 y Fi(bzip2)c
+Fj(will)j(read)e(argumen)m(ts)i(from)e(the)h(en)m(vironmen)m(t)h(v)-5
+b(ariables)28 b Fi(BZIP2)f Fj(and)g Fi(BZIP)p Fj(,)g(in)390
+2963 y(that)21 b(order,)i(and)d(will)h(pro)s(cess)f(them)h(b)s(efore)g
+(an)m(y)f(argumen)m(ts)h(read)g(from)f(the)h(command)390
+3067 y(line.)41 b(This)30 b(giv)m(es)i(a)e(con)m(v)m(enien)m(t)j(w)m(a)
+m(y)e(to)g(supply)e(default)i(argumen)m(ts.)390 3218
+y(Compression)e(is)h(alw)m(a)m(ys)h(p)s(erformed,)e(ev)m(en)h(if)g(the)
+g(compressed)f(\014le)h(is)g(sligh)m(tly)h(larger)390
+3322 y(than)24 b(the)h(original.)40 b(Files)25 b(of)f(less)h(than)f(ab)
+s(out)g(one)h(h)m(undred)d(b)m(ytes)j(tend)g(to)g(get)h(larger,)390
+3426 y(since)33 b(the)g(compression)f(mec)m(hanism)h(has)f(a)h(constan)
+m(t)g(o)m(v)m(erhead)h(in)e(the)h(region)g(of)g(50)390
+3529 y(b)m(ytes.)50 b(Random)33 b(data)h(\(including)f(the)h(output)f
+(of)g(most)h(\014le)g(compressors\))g(is)f(co)s(ded)390
+3633 y(at)e(ab)s(out)f(8.05)i(bits)e(p)s(er)g(b)m(yte,)h(giving)h(an)e
+(expansion)g(of)g(around)f(0.5\045.)390 3784 y(As)f(a)h(self-c)m(hec)m
+(k)i(for)e(y)m(our)g(protection,)i Fi(bzip2)d Fj(uses)g(32-bit)i(CR)m
+(Cs)f(to)g(mak)m(e)h(sure)e(that)390 3888 y(the)43 b(decompressed)g(v)m
+(ersion)h(of)f(a)g(\014le)f(is)h(iden)m(tical)i(to)f(the)f(original.)79
+b(This)43 b(guards)390 3992 y(against)h(corruption)f(of)h(the)f
+(compressed)g(data,)k(and)42 b(against)i(undetected)g(bugs)e(in)390
+4096 y Fi(bzip2)33 b Fj(\(hop)s(efully)i(v)m(ery)g(unlik)m(ely\).)55
+b(The)35 b(c)m(hances)h(of)f(data)g(corruption)g(going)h(unde-)390
+4199 y(tected)e(is)f(microscopic,)h(ab)s(out)e(one)h(c)m(hance)g(in)g
+(four)f(billion)g(for)h(eac)m(h)g(\014le)g(pro)s(cessed.)390
+4303 y(Be)j(a)m(w)m(are,)k(though,)d(that)g(the)g(c)m(hec)m(k)h(o)s
+(ccurs)e(up)s(on)f(decompression,)j(so)f(it)f(can)h(only)390
+4407 y(tell)28 b(y)m(ou)e(that)h(something)g(is)g(wrong.)39
+b(It)27 b(can't)g(help)f(y)m(ou)h(reco)m(v)m(er)i(the)d(original)i
+(uncom-)390 4511 y(pressed)f(data.)40 b(Y)-8 b(ou)27
+b(can)g(use)h Fi(bzip2recover)23 b Fj(to)29 b(try)e(to)i(reco)m(v)m(er)
+g(data)f(from)f(damaged)390 4614 y(\014les.)390 4766
+y(Return)42 b(v)-5 b(alues:)65 b(0)42 b(for)h(a)f(normal)g(exit,)47
+b(1)c(for)f(en)m(vironmen)m(tal)i(problems)e(\(\014le)h(not)390
+4869 y(found,)29 b(in)m(v)-5 b(alid)30 b(\015ags,)g(I/O)h(errors,)g
+(&c\),)f(2)h(to)f(indicate)h(a)f(corrupt)g(compressed)g(\014le,)h(3)390
+4973 y(for)f(an)g(in)m(ternal)i(consistency)f(error)g(\(eg,)h(bug\))e
+(whic)m(h)g(caused)g Fi(bzip2)f Fj(to)i(panic.)390 5304
+y Fe(OPTIONS)p eop
+%%Page: 5 6
+5 5 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(5)390 299 y Fi(-c)30
+b(--stdout)870 403 y Fj(Compress)g(or)g(decompress)h(to)g(standard)e
+(output.)390 550 y Fi(-d)h(--decompress)870 653 y Fj(F)-8
+b(orce)42 b(decompression.)72 b Fi(bzip2)p Fj(,)43 b
+Fi(bunzip2)38 b Fj(and)i Fi(bzcat)g Fj(are)h(really)h(the)870
+757 y(same)26 b(program,)i(and)d(the)h(decision)h(ab)s(out)f(what)g
+(actions)h(to)g(tak)m(e)h(is)e(done)870 861 y(on)j(the)h(basis)f(of)g
+(whic)m(h)h(name)f(is)g(used.)40 b(This)29 b(\015ag)g(o)m(v)m(errides)i
+(that)f(mec)m(h-)870 965 y(anism,)g(and)g(forces)h(bzip2)f(to)h
+(decompress.)390 1112 y Fi(-z)f(--compress)870 1215 y
+Fj(The)37 b(complemen)m(t)h(to)g Fi(-d)p Fj(:)54 b(forces)37
+b(compression,)j(regardless)d(of)h(the)f(in-)870 1319
+y(v)m(ok)-5 b(ation)32 b(name.)390 1466 y Fi(-t)e(--test)66
+b Fj(Chec)m(k)26 b(in)m(tegrit)m(y)i(of)e(the)g(sp)s(eci\014ed)f
+(\014le\(s\),)i(but)e(don't)h(decompress)g(them.)870
+1570 y(This)39 b(really)h(p)s(erforms)f(a)g(trial)h(decompression)g
+(and)e(thro)m(ws)i(a)m(w)m(a)m(y)h(the)870 1674 y(result.)390
+1821 y Fi(-f)30 b(--force)870 1924 y Fj(F)-8 b(orce)27
+b(o)m(v)m(erwrite)h(of)e(output)g(\014les.)39 b(Normally)-8
+b(,)28 b Fi(bzip2)c Fj(will)j(not)f(o)m(v)m(erwrite)870
+2028 y(existing)i(output)e(\014les.)40 b(Also)27 b(forces)g
+Fi(bzip2)f Fj(to)h(break)g(hard)f(links)g(to)i(\014les,)870
+2132 y(whic)m(h)i(it)h(otherwise)g(w)m(ouldn't)g(do.)870
+2257 y Fi(bzip2)h Fj(normally)h(declines)h(to)f(decompress)h(\014les)f
+(whic)m(h)f(don't)i(ha)m(v)m(e)g(the)870 2361 y(correct)39
+b(magic)g(header)e(b)m(ytes.)63 b(If)38 b(forced)g(\()p
+Fi(-f)p Fj(\),)h(ho)m(w)m(ev)m(er,)i(it)e(will)f(pass)870
+2465 y(suc)m(h)30 b(\014les)g(through)g(unmo)s(di\014ed.)39
+b(This)30 b(is)h(ho)m(w)f(GNU)h Fi(gzip)e Fj(b)s(eha)m(v)m(es.)390
+2612 y Fi(-k)h(--keep)66 b Fj(Keep)34 b(\(don't)g(delete\))h(input)d
+(\014les)i(during)e(compression)i(or)f(decompres-)870
+2716 y(sion.)390 2863 y Fi(-s)d(--small)870 2966 y Fj(Reduce)35
+b(memory)g(usage,)i(for)e(compression,)i(decompression)e(and)f(test-)
+870 3070 y(ing.)40 b(Files)29 b(are)f(decompressed)g(and)f(tested)i
+(using)f(a)g(mo)s(di\014ed)f(algorithm)870 3174 y(whic)m(h)32
+b(only)g(requires)h(2.5)g(b)m(ytes)g(p)s(er)f(blo)s(c)m(k)g(b)m(yte.)48
+b(This)32 b(means)f(an)m(y)i(\014le)870 3278 y(can)d(b)s(e)f
+(decompressed)g(in)h(2300k)h(of)f(memory)-8 b(,)31 b(alb)s(eit)f(at)g
+(ab)s(out)f(half)h(the)870 3381 y(normal)g(sp)s(eed.)870
+3507 y(During)35 b(compression,)j Fi(-s)d Fj(selects)j(a)e(blo)s(c)m(k)
+h(size)f(of)h(200k,)h(whic)m(h)e(limits)870 3611 y(memory)43
+b(use)f(to)h(around)e(the)i(same)f(\014gure,)k(at)d(the)f(exp)s(ense)g
+(of)h(y)m(our)870 3714 y(compression)32 b(ratio.)47 b(In)31
+b(short,)i(if)e(y)m(our)i(mac)m(hine)f(is)g(lo)m(w)g(on)g(memory)g(\(8)
+870 3818 y(megab)m(ytes)39 b(or)e(less\),)j(use)d(-s)g(for)g(ev)m
+(erything.)62 b(See)38 b(MEMOR)-8 b(Y)37 b(MAN-)870 3922
+y(A)m(GEMENT)31 b(b)s(elo)m(w.)390 4069 y Fi(-q)f(--quiet)870
+4173 y Fj(Suppress)h(non-essen)m(tial)j(w)m(arning)f(messages.)49
+b(Messages)34 b(p)s(ertaining)f(to)870 4276 y(I/O)e(errors)g(and)e
+(other)i(critical)i(ev)m(en)m(ts)f(will)e(not)h(b)s(e)f(suppressed.)390
+4423 y Fi(-v)g(--verbose)870 4527 y Fj(V)-8 b(erb)s(ose)25
+b(mo)s(de)f({)h(sho)m(w)f(the)h(compression)g(ratio)g(for)g(eac)m(h)g
+(\014le)g(pro)s(cessed.)870 4631 y(F)-8 b(urther)27 b
+Fi(-v)p Fj('s)g(increase)h(the)g(v)m(erb)s(osit)m(y)g(lev)m(el,)i(sp)s
+(ewing)d(out)g(lots)h(of)g(infor-)870 4735 y(mation)j(whic)m(h)f(is)g
+(primarily)h(of)f(in)m(terest)i(for)f(diagnostic)g(purp)s(oses.)390
+4882 y Fi(-L)f(--license)e(-V)h(--version)870 4985 y
+Fj(Displa)m(y)i(the)f(soft)m(w)m(are)i(v)m(ersion,)g(license)f(terms)g
+(and)e(conditions.)390 5132 y Fi(-1)h(\(or)f(--fast\))g(to)g(-9)h(\(or)
+g(--best\))870 5236 y Fj(Set)h(the)g(blo)s(c)m(k)g(size)g(to)h(100)g
+(k,)e(200)i(k)f(..)41 b(900)32 b(k)f(when)e(compressing.)42
+b(Has)870 5340 y(no)37 b(e\013ect)i(when)d(decompressing.)62
+b(See)37 b(MEMOR)-8 b(Y)38 b(MANA)m(GEMENT)p eop
+%%Page: 6 7
+6 6 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(6)870 299 y Fj(b)s(elo)m(w.)83
+b(The)44 b Fi(--fast)f Fj(and)g Fi(--best)g Fj(aliases)i(are)g
+(primarily)f(for)g(GNU)870 403 y Fi(gzip)27 b Fj(compatibilit)m(y)-8
+b(.)43 b(In)28 b(particular,)i Fi(--fast)d Fj(do)s(esn't)h(mak)m(e)i
+(things)e(sig-)870 506 y(ni\014can)m(tly)d(faster.)40
+b(And)23 b Fi(--best)g Fj(merely)i(selects)h(the)f(default)g(b)s(eha)m
+(viour.)390 674 y Fi(--)384 b Fj(T)-8 b(reats)38 b(all)f(subsequen)m(t)
+f(argumen)m(ts)g(as)h(\014le)f(names,)i(ev)m(en)f(if)f(they)h(start)870
+778 y(with)31 b(a)h(dash.)42 b(This)31 b(is)h(so)f(y)m(ou)h(can)f
+(handle)g(\014les)g(with)h(names)f(b)s(eginning)870 881
+y(with)f(a)h(dash,)e(for)i(example:)41 b Fi(bzip2)29
+b(--)h(-myfilename)p Fj(.)390 1049 y Fi(--repetitive-fast)390
+1185 y(--repetitive-best)870 1288 y Fj(These)j(\015ags)g(are)g
+(redundan)m(t)f(in)h(v)m(ersions)g(0.9.5)i(and)d(ab)s(o)m(v)m(e.)49
+b(They)33 b(pro-)870 1392 y(vided)g(some)h(coarse)h(con)m(trol)g(o)m(v)
+m(er)g(the)f(b)s(eha)m(viour)f(of)h(the)g(sorting)g(algo-)870
+1496 y(rithm)j(in)g(earlier)h(v)m(ersions,)i(whic)m(h)d(w)m(as)g
+(sometimes)h(useful.)61 b(0.9.5)39 b(and)870 1600 y(ab)s(o)m(v)m(e)31
+b(ha)m(v)m(e)f(an)g(impro)m(v)m(ed)g(algorithm)h(whic)m(h)e(renders)g
+(these)h(\015ags)g(irrel-)870 1704 y(ev)-5 b(an)m(t.)390
+1964 y Fe(MEMOR)-10 b(Y)40 b(MANA)m(GEMENT)390 2151 y
+Fi(bzip2)23 b Fj(compresses)i(large)h(\014les)e(in)g(blo)s(c)m(ks.)40
+b(The)24 b(blo)s(c)m(k)h(size)h(a\013ects)g(b)s(oth)e(the)g(compres-)
+390 2255 y(sion)38 b(ratio)g(ac)m(hiev)m(ed,)k(and)36
+b(the)i(amoun)m(t)g(of)g(memory)g(needed)f(for)h(compression)g(and)390
+2358 y(decompression.)57 b(The)35 b(\015ags)h Fi(-1)f
+Fj(through)g Fi(-9)g Fj(sp)s(ecify)g(the)h(blo)s(c)m(k)g(size)h(to)f(b)
+s(e)f(100,000)390 2462 y(b)m(ytes)25 b(through)f(900,000)j(b)m(ytes)e
+(\(the)h(default\))e(resp)s(ectiv)m(ely)-8 b(.)41 b(A)m(t)25
+b(decompression)g(time,)390 2566 y(the)k(blo)s(c)m(k)h(size)g(used)f
+(for)g(compression)g(is)g(read)h(from)f(the)g(header)g(of)g(the)h
+(compressed)390 2670 y(\014le,)j(and)f Fi(bunzip2)f Fj(then)h(allo)s
+(cates)i(itself)g(just)e(enough)g(memory)h(to)g(decompress)g(the)390
+2773 y(\014le.)40 b(Since)27 b(blo)s(c)m(k)h(sizes)h(are)f(stored)g(in)
+f(compressed)g(\014les,)h(it)h(follo)m(ws)f(that)g(the)g(\015ags)g
+Fi(-1)390 2877 y Fj(to)j Fi(-9)f Fj(are)h(irrelev)-5
+b(an)m(t)32 b(to)f(and)f(so)g(ignored)h(during)e(decompression.)390
+3028 y(Compression)h(and)f(decompression)i(requiremen)m(ts,)g(in)f(b)m
+(ytes,)i(can)e(b)s(e)g(estimated)i(as:)869 3179 y Fi(Compression:)140
+b(400k)46 b(+)i(\()f(8)h(x)f(block)f(size)h(\))869 3387
+y(Decompression:)d(100k)i(+)i(\()f(4)h(x)f(block)f(size)h(\),)g(or)1585
+3491 y(100k)f(+)i(\()f(2.5)g(x)g(block)g(size)f(\))390
+3642 y Fj(Larger)27 b(blo)s(c)m(k)f(sizes)h(giv)m(e)h(rapidly)e
+(diminishing)f(marginal)i(returns.)39 b(Most)27 b(of)f(the)h(com-)390
+3745 y(pression)e(comes)i(from)f(the)g(\014rst)f(t)m(w)m(o)i(or)f
+(three)h(h)m(undred)d(k)h(of)h(blo)s(c)m(k)g(size,)i(a)e(fact)h(w)m
+(orth)390 3849 y(b)s(earing)32 b(in)g(mind)f(when)g(using)h
+Fi(bzip2)f Fj(on)h(small)g(mac)m(hines.)47 b(It)32 b(is)h(also)f(imp)s
+(ortan)m(t)h(to)390 3953 y(appreciate)f(that)g(the)f(decompression)g
+(memory)g(requiremen)m(t)h(is)f(set)g(at)h(compression)390
+4057 y(time)f(b)m(y)f(the)h(c)m(hoice)h(of)f(blo)s(c)m(k)g(size.)390
+4208 y(F)-8 b(or)43 b(\014les)f(compressed)h(with)f(the)g(default)h
+(900k)g(blo)s(c)m(k)g(size,)k Fi(bunzip2)40 b Fj(will)j(require)390
+4311 y(ab)s(out)28 b(3700)i(kb)m(ytes)f(to)h(decompress.)40
+b(T)-8 b(o)29 b(supp)s(ort)e(decompression)i(of)g(an)m(y)f(\014le)h(on)
+f(a)h(4)390 4415 y(megab)m(yte)h(mac)m(hine,)g Fi(bunzip2)c
+Fj(has)i(an)h(option)g(to)g(decompress)g(using)f(appro)m(ximately)390
+4519 y(half)33 b(this)g(amoun)m(t)h(of)f(memory)-8 b(,)35
+b(ab)s(out)d(2300)j(kb)m(ytes.)50 b(Decompression)34
+b(sp)s(eed)e(is)h(also)390 4623 y(halv)m(ed,)h(so)f(y)m(ou)g(should)e
+(use)i(this)f(option)h(only)g(where)g(necessary)-8 b(.)48
+b(The)33 b(relev)-5 b(an)m(t)34 b(\015ag)390 4727 y(is)c
+Fi(-s)p Fj(.)390 4878 y(In)i(general,)i(try)f(and)e(use)h(the)h
+(largest)h(blo)s(c)m(k)f(size)g(memory)g(constrain)m(ts)g(allo)m(w,)i
+(since)390 4981 y(that)43 b(maximises)g(the)g(compression)f(ac)m(hiev)m
+(ed.)79 b(Compression)42 b(and)g(decompression)390 5085
+y(sp)s(eed)30 b(are)g(virtually)h(una\013ected)g(b)m(y)f(blo)s(c)m(k)h
+(size.)390 5236 y(Another)24 b(signi\014can)m(t)i(p)s(oin)m(t)e
+(applies)g(to)i(\014les)e(whic)m(h)g(\014t)h(in)f(a)g(single)h(blo)s(c)
+m(k)g({)g(that)g(means)390 5340 y(most)g(\014les)f(y)m(ou'd)h(encoun)m
+(ter)g(using)f(a)g(large)i(blo)s(c)m(k)f(size.)39 b(The)25
+b(amoun)m(t)f(of)h(real)g(memory)p eop
+%%Page: 7 8
+7 7 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(7)390 299 y Fj(touc)m(hed)36
+b(is)g(prop)s(ortional)g(to)g(the)g(size)h(of)f(the)g(\014le,)h(since)f
+(the)g(\014le)g(is)f(smaller)i(than)e(a)390 403 y(blo)s(c)m(k.)48
+b(F)-8 b(or)33 b(example,)h(compressing)f(a)g(\014le)f(20,000)j(b)m
+(ytes)f(long)f(with)f(the)h(\015ag)g Fi(-9)f Fj(will)390
+506 y(cause)26 b(the)g(compressor)f(to)i(allo)s(cate)g(around)e(7600k)i
+(of)f(memory)-8 b(,)27 b(but)e(only)g(touc)m(h)i(400k)390
+610 y Fi(+)h Fj(20000)i(*)f(8)g(=)f(560)h(kb)m(ytes)g(of)g(it.)40
+b(Similarly)-8 b(,)30 b(the)f(decompressor)f(will)h(allo)s(cate)h
+(3700k)390 714 y(but)g(only)g(touc)m(h)h(100k)h Fi(+)e
+Fj(20000)j(*)d(4)h(=)f(180)i(kb)m(ytes.)390 865 y(Here)39
+b(is)f(a)g(table)h(whic)m(h)f(summarises)f(the)i(maxim)m(um)e(memory)h
+(usage)h(for)f(di\013eren)m(t)390 969 y(blo)s(c)m(k)c(sizes.)50
+b(Also)33 b(recorded)g(is)h(the)f(total)i(compressed)e(size)h(for)g(14)
+g(\014les)f(of)g(the)h(Cal-)390 1073 y(gary)39 b(T)-8
+b(ext)39 b(Compression)f(Corpus)g(totalling)i(3,141,622)i(b)m(ytes.)65
+b(This)38 b(column)h(giv)m(es)390 1176 y(some)g(feel)f(for)h(ho)m(w)f
+(compression)g(v)-5 b(aries)39 b(with)f(blo)s(c)m(k)g(size.)65
+b(These)38 b(\014gures)g(tend)g(to)390 1280 y(understate)28
+b(the)g(adv)-5 b(an)m(tage)29 b(of)f(larger)h(blo)s(c)m(k)g(sizes)f
+(for)g(larger)h(\014les,)g(since)f(the)g(Corpus)390 1384
+y(is)i(dominated)h(b)m(y)f(smaller)h(\014les.)1107 1535
+y Fi(Compress)141 b(Decompress)g(Decompress)f(Corpus)773
+1639 y(Flag)238 b(usage)285 b(usage)332 b(-s)48 b(usage)237
+b(Size)821 1846 y(-1)286 b(1200k)332 b(500k)429 b(350k)285
+b(914704)821 1950 y(-2)h(2000k)332 b(900k)429 b(600k)285
+b(877703)821 2054 y(-3)h(2800k)f(1300k)428 b(850k)285
+b(860338)821 2158 y(-4)h(3600k)f(1700k)380 b(1100k)285
+b(846899)821 2261 y(-5)h(4400k)f(2100k)380 b(1350k)285
+b(845160)821 2365 y(-6)h(5200k)f(2500k)380 b(1600k)285
+b(838626)821 2469 y(-7)h(6100k)f(2900k)380 b(1850k)285
+b(834096)821 2573 y(-8)h(6800k)f(3300k)380 b(2100k)285
+b(828642)821 2676 y(-9)h(7600k)f(3700k)380 b(2350k)285
+b(828642)390 2992 y Fe(RECO)m(VERING)38 b(D)m(A)-10 b(T)g(A)40
+b(FR)m(OM)h(D)m(AMA)m(GED)f(FILES)390 3179 y Fi(bzip2)24
+b Fj(compresses)i(\014les)g(in)f(blo)s(c)m(ks,)i(usually)e(900kb)m
+(ytes)j(long.)40 b(Eac)m(h)25 b(blo)s(c)m(k)h(is)g(handled)390
+3283 y(indep)s(enden)m(tly)-8 b(.)42 b(If)31 b(a)g(media)g(or)h
+(transmission)f(error)g(causes)g(a)g(m)m(ulti-blo)s(c)m(k)i
+Fi(.bz2)d Fj(\014le)390 3387 y(to)35 b(b)s(ecome)f(damaged,)i(it)e(ma)m
+(y)h(b)s(e)e(p)s(ossible)h(to)h(reco)m(v)m(er)h(data)f(from)f(the)g
+(undamaged)390 3491 y(blo)s(c)m(ks)d(in)f(the)h(\014le.)390
+3642 y(The)g(compressed)g(represen)m(tation)i(of)f(eac)m(h)g(blo)s(c)m
+(k)g(is)f(delimited)h(b)m(y)f(a)h(48-bit)g(pattern,)390
+3745 y(whic)m(h)27 b(mak)m(es)g(it)h(p)s(ossible)e(to)i(\014nd)d(the)j
+(blo)s(c)m(k)f(b)s(oundaries)e(with)i(reasonable)h(certain)m(t)m(y)-8
+b(.)390 3849 y(Eac)m(h)33 b(blo)s(c)m(k)g(also)h(carries)g(its)f(o)m
+(wn)g(32-bit)h(CR)m(C,)f(so)g(damaged)g(blo)s(c)m(ks)h(can)f(b)s(e)f
+(distin-)390 3953 y(guished)e(from)g(undamaged)f(ones.)390
+4104 y Fi(bzip2recover)36 b Fj(is)j(a)g(simple)f(program)h(whose)g
+(purp)s(ose)f(is)h(to)g(searc)m(h)h(for)f(blo)s(c)m(ks)g(in)390
+4208 y Fi(.bz2)33 b Fj(\014les,)j(and)e(write)h(eac)m(h)h(blo)s(c)m(k)f
+(out)g(in)m(to)g(its)g(o)m(wn)g Fi(.bz2)e Fj(\014le.)54
+b(Y)-8 b(ou)34 b(can)h(then)f(use)390 4311 y Fi(bzip2)29
+b(-t)23 b Fj(to)h(test)h(the)f(in)m(tegrit)m(y)i(of)d(the)h(resulting)g
+(\014les,)h(and)e(decompress)g(those)h(whic)m(h)390 4415
+y(are)31 b(undamaged.)390 4566 y Fi(bzip2recover)40 b
+Fj(tak)m(es)45 b(a)f(single)g(argumen)m(t,)j(the)d(name)g(of)f(the)h
+(damaged)g(\014le,)j(and)390 4670 y(writes)33 b(a)f(n)m(um)m(b)s(er)f
+(of)h(\014les)h Fi(rec00001file.bz2)p Fj(,)28 b Fi(rec00002file.bz2)p
+Fj(,)g(etc,)34 b(con)m(tain-)390 4774 y(ing)29 b(the)g(extracted)i(blo)
+s(c)m(ks.)40 b(The)29 b(output)g(\014lenames)g(are)g(designed)g(so)g
+(that)g(the)g(use)g(of)390 4878 y(wildcards)h(in)f(subsequen)m(t)h(pro)
+s(cessing)g({)h(for)f(example,)h Fi(bzip2)e(-dc)g(rec*file.bz2)e(>)390
+4981 y(recovered_data)f Fj({)31 b(pro)s(cesses)g(the)f(\014les)h(in)f
+(the)h(correct)h(order.)390 5132 y Fi(bzip2recover)37
+b Fj(should)i(b)s(e)h(of)h(most)f(use)g(dealing)h(with)f(large)i
+Fi(.bz2)d Fj(\014les,)k(as)d(these)390 5236 y(will)31
+b(con)m(tain)i(man)m(y)e(blo)s(c)m(ks.)43 b(It)32 b(is)f(clearly)h
+(futile)g(to)g(use)f(it)g(on)g(damaged)g(single-blo)s(c)m(k)390
+5340 y(\014les,)g(since)g(a)g(damaged)f(blo)s(c)m(k)h(cannot)h(b)s(e)e
+(reco)m(v)m(ered.)43 b(If)31 b(y)m(ou)g(wish)f(to)h(minimise)g(an)m(y)p
+eop
+%%Page: 8 9
+8 8 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(8)390 299 y Fj(p)s(oten)m(tial)36
+b(data)f(loss)f(through)g(media)h(or)g(transmission)f(errors,)i(y)m(ou)
+e(migh)m(t)i(consider)390 403 y(compressing)31 b(with)f(a)g(smaller)h
+(blo)s(c)m(k)g(size.)390 711 y Fe(PERF)m(ORMANCE)39 b(NOTES)390
+897 y Fj(The)c(sorting)i(phase)e(of)g(compression)h(gathers)g(together)
+i(similar)e(strings)g(in)f(the)h(\014le.)390 1001 y(Because)51
+b(of)g(this,)57 b(\014les)51 b(con)m(taining)h(v)m(ery)f(long)h(runs)d
+(of)j(rep)s(eated)f(sym)m(b)s(ols,)56 b(lik)m(e)390 1105
+y Fi(")p Fj(aabaabaabaab)c(...)p Fi(")h Fj(\(rep)s(eated)g(sev)m(eral)h
+(h)m(undred)c(times\))k(ma)m(y)f(compress)f(more)390
+1209 y(slo)m(wly)33 b(than)f(normal.)45 b(V)-8 b(ersions)33
+b(0.9.5)g(and)e(ab)s(o)m(v)m(e)i(fare)g(m)m(uc)m(h)f(b)s(etter)g(than)g
+(previous)390 1312 y(v)m(ersions)54 b(in)g(this)g(resp)s(ect.)111
+b(The)54 b(ratio)h(b)s(et)m(w)m(een)g(w)m(orst-case)g(and)e(a)m(v)m
+(erage-case)390 1416 y(compression)39 b(time)g(is)g(in)f(the)h(region)h
+(of)e(10:1.)67 b(F)-8 b(or)40 b(previous)e(v)m(ersions,)k(this)c
+(\014gure)390 1520 y(w)m(as)j(more)g(lik)m(e)g(100:1.)74
+b(Y)-8 b(ou)40 b(can)h(use)f(the)h Fi(-vvvv)e Fj(option)i(to)g(monitor)
+g(progress)g(in)390 1624 y(great)32 b(detail,)f(if)g(y)m(ou)f(w)m(an)m
+(t.)390 1775 y(Decompression)h(sp)s(eed)e(is)i(una\013ected)g(b)m(y)f
+(these)h(phenomena.)390 1926 y Fi(bzip2)g Fj(usually)i(allo)s(cates)i
+(sev)m(eral)f(megab)m(ytes)g(of)f(memory)g(to)h(op)s(erate)g(in,)f(and)
+f(then)390 2030 y(c)m(harges)37 b(all)f(o)m(v)m(er)h(it)f(in)f(a)h
+(fairly)g(random)f(fashion.)55 b(This)36 b(means)f(that)h(p)s
+(erformance,)390 2133 y(b)s(oth)f(for)g(compressing)h(and)e
+(decompressing,)j(is)f(largely)g(determined)g(b)m(y)f(the)h(sp)s(eed)
+390 2237 y(at)27 b(whic)m(h)e(y)m(our)h(mac)m(hine)h(can)f(service)h
+(cac)m(he)g(misses.)39 b(Because)27 b(of)f(this,)h(small)f(c)m(hanges)
+390 2341 y(to)31 b(the)f(co)s(de)h(to)g(reduce)f(the)h(miss)e(rate)i
+(ha)m(v)m(e)g(b)s(een)f(observ)m(ed)h(to)g(giv)m(e)g(disprop)s(ortion-)
+390 2445 y(ately)i(large)h(p)s(erformance)e(impro)m(v)m(emen)m(ts.)47
+b(I)33 b(imagine)g Fi(bzip2)d Fj(will)j(p)s(erform)e(b)s(est)h(on)390
+2548 y(mac)m(hines)f(with)f(v)m(ery)h(large)g(cac)m(hes.)390
+2856 y Fe(CA)-14 b(VEA)k(TS)390 3043 y Fj(I/O)45 b(error)f(messages)h
+(are)f(not)h(as)f(helpful)f(as)h(they)g(could)g(b)s(e.)81
+b Fi(bzip2)43 b Fj(tries)i(hard)390 3147 y(to)37 b(detect)g(I/O)f
+(errors)h(and)d(exit)j(cleanly)-8 b(,)39 b(but)c(the)h(details)h(of)f
+(what)f(the)h(problem)g(is)390 3251 y(sometimes)c(seem)e(rather)h
+(misleading.)390 3402 y(This)c(man)m(ual)f(page)i(p)s(ertains)e(to)i(v)
+m(ersion)g(1.0.2)h(of)e Fi(bzip2)p Fj(.)38 b(Compressed)26
+b(data)i(created)390 3505 y(b)m(y)22 b(this)h(v)m(ersion)g(is)f(en)m
+(tirely)i(forw)m(ards)f(and)e(bac)m(kw)m(ards)i(compatible)g(with)f
+(the)h(previous)390 3609 y(public)g(releases,)k(v)m(ersions)d(0.1pl2,)i
+(0.9.0,)h(0.9.5,)g(1.0.0)f(and)d(1.0.1,)k(but)c(with)g(the)h(follo)m
+(w-)390 3713 y(ing)h(exception:)39 b(0.9.0)27 b(and)c(ab)s(o)m(v)m(e)j
+(can)f(correctly)i(decompress)d(m)m(ultiple)i(concatenated)390
+3817 y(compressed)36 b(\014les.)59 b(0.1pl2)37 b(cannot)g(do)f(this;)k
+(it)d(will)f(stop)h(after)g(decompressing)f(just)390
+3921 y(the)31 b(\014rst)f(\014le)g(in)g(the)h(stream.)390
+4072 y Fi(bzip2recover)19 b Fj(v)m(ersions)j(prior)g(to)h(this)f(one,)i
+(1.0.2,)h(used)c(32-bit)j(in)m(tegers)f(to)g(represen)m(t)390
+4175 y(bit)32 b(p)s(ositions)g(in)f(compressed)h(\014les,)g(so)g(it)g
+(could)g(not)g(handle)f(compressed)h(\014les)f(more)390
+4279 y(than)39 b(512)h(megab)m(ytes)h(long.)68 b(V)-8
+b(ersion)39 b(1.0.2)i(and)d(ab)s(o)m(v)m(e)j(uses)d(64-bit)j(in)m(ts)e
+(on)h(some)390 4383 y(platforms)e(whic)m(h)g(supp)s(ort)f(them)i(\(GNU)
+g(supp)s(orted)e(targets,)42 b(and)c(Windo)m(ws\).)64
+b(T)-8 b(o)390 4487 y(establish)27 b(whether)g(or)f(not)i
+Fi(bzip2recover)23 b Fj(w)m(as)k(built)f(with)h(suc)m(h)f(a)h
+(limitation,)j(run)25 b(it)390 4591 y(without)33 b(argumen)m(ts.)50
+b(In)33 b(an)m(y)g(ev)m(en)m(t)i(y)m(ou)e(can)h(build)e(y)m(ourself)h
+(an)g(unlimited)g(v)m(ersion)390 4694 y(if)28 b(y)m(ou)h(can)g
+(recompile)h(it)f(with)f Fi(MaybeUInt64)e Fj(set)j(to)g(b)s(e)f(an)g
+(unsigned)g(64-bit)i(in)m(teger.)390 5002 y Fe(A)m(UTHOR)390
+5189 y Fj(Julian)g(Sew)m(ard,)g Fi(jseward@acm.org)p
+Fj(.)390 5340 y Fi(http://sources.redhat.co)o(m/bz)o(ip2)p
+eop
+%%Page: 9 10
+9 9 bop 150 -116 a Fl(Chapter)30 b(2:)41 b(Ho)m(w)31
+b(to)g(use)f Fi(bzip2)2375 b Fl(9)390 299 y Fj(The)22
+b(ideas)h(em)m(b)s(o)s(died)f(in)g Fi(bzip2)f Fj(are)i(due)e(to)j(\(at)
+f(least\))h(the)f(follo)m(wing)g(p)s(eople:)37 b(Mic)m(hael)390
+403 y(Burro)m(ws)45 b(and)g(Da)m(vid)h(Wheeler)g(\(for)g(the)g(blo)s(c)
+m(k)h(sorting)f(transformation\),)51 b(Da)m(vid)390 506
+y(Wheeler)42 b(\(again,)j(for)c(the)h(Hu\013man)e(co)s(der\),)45
+b(P)m(eter)e(F)-8 b(en)m(wic)m(k)43 b(\(for)e(the)h(structured)390
+610 y(co)s(ding)34 b(mo)s(del)h(in)f(the)g(original)i
+Fi(bzip)p Fj(,)e(and)g(man)m(y)g(re\014nemen)m(ts\),)i(and)e(Alistair)h
+(Mof-)390 714 y(fat,)45 b(Radford)d(Neal)g(and)f(Ian)h(Witten)h(\(for)f
+(the)h(arithmetic)g(co)s(der)f(in)g(the)g(original)390
+818 y Fi(bzip)p Fj(\).)d(I)26 b(am)h(m)m(uc)m(h)g(indebted)f(for)h
+(their)g(help,)g(supp)s(ort)e(and)h(advice.)40 b(See)27
+b(the)g(man)m(ual)390 922 y(in)k(the)h(source)f(distribution)h(for)f(p)
+s(oin)m(ters)h(to)g(sources)f(of)h(do)s(cumen)m(tation.)44
+b(Christian)390 1025 y(v)m(on)27 b(Ro)s(ques)f(encouraged)g(me)h(to)g
+(lo)s(ok)g(for)f(faster)h(sorting)g(algorithms,)h(so)e(as)h(to)g(sp)s
+(eed)390 1129 y(up)32 b(compression.)50 b(Bela)34 b(Lubkin)d
+(encouraged)j(me)g(to)g(impro)m(v)m(e)g(the)g(w)m(orst-case)h(com-)390
+1233 y(pression)e(p)s(erformance.)51 b(The)34 b Fi(bz*)f
+Fj(scripts)h(are)g(deriv)m(ed)g(from)g(those)g(of)g(GNU)h
+Fi(gzip)p Fj(.)390 1337 y(Man)m(y)40 b(p)s(eople)f(sen)m(t)h(patc)m
+(hes,)i(help)s(ed)c(with)h(p)s(ortabilit)m(y)i(problems,)g(len)m(t)f
+(mac)m(hines,)390 1440 y(ga)m(v)m(e)32 b(advice)f(and)f(w)m(ere)h
+(generally)h(helpful.)p eop
+%%Page: 10 11
+10 10 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(10)150 299 y Fg(3)80 b(Programming)53
+b(with)h Ff(libbzip2)150 568 y Fj(This)30 b(c)m(hapter)h(describ)s(es)f
+(the)h(programming)f(in)m(terface)i(to)g Fi(libbzip2)p
+Fj(.)150 725 y(F)-8 b(or)33 b(general)g(bac)m(kground)f(information,)h
+(particularly)f(ab)s(out)g(memory)g(use)g(and)f(p)s(erformance)h(as-)
+150 834 y(p)s(ects,)f(y)m(ou'd)f(b)s(e)g(w)m(ell)h(advised)f(to)i(read)
+e(Chapter)g(2)h(as)f(w)m(ell.)150 1124 y Fk(3.1)68 b(T)-11
+b(op-lev)l(el)46 b(structure)150 1316 y Fi(libbzip2)32
+b Fj(is)i(a)g(\015exible)h(library)f(for)g(compressing)g(and)g
+(decompressing)g(data)h(in)e(the)i Fi(bzip2)e Fj(data)150
+1426 y(format.)38 b(Although)22 b(pac)m(k)-5 b(aged)24
+b(as)e(a)g(single)h(en)m(tit)m(y)-8 b(,)26 b(it)d(helps)f(to)h(regard)f
+(the)h(library)f(as)g(three)h(separate)150 1535 y(parts:)41
+b(the)30 b(lo)m(w)h(lev)m(el)i(in)m(terface,)f(and)d(the)i(high)f(lev)m
+(el)i(in)m(terface,)h(and)c(some)i(utilit)m(y)h(functions.)150
+1692 y(The)37 b(structure)g(of)g Fi(libbzip2)p Fj('s)e(in)m(terfaces)j
+(is)f(similar)g(to)h(that)f(of)g(Jean-loup)g(Gailly's)i(and)d(Mark)150
+1802 y(Adler's)30 b(excellen)m(t)j Fi(zlib)c Fj(library)-8
+b(.)150 1959 y(All)29 b(externally)h(visible)g(sym)m(b)s(ols)e(ha)m(v)m
+(e)i(names)f(b)s(eginning)f Fi(BZ2_)p Fj(.)39 b(This)29
+b(is)g(new)f(in)h(v)m(ersion)h(1.0.)41 b(The)150 2068
+y(in)m(ten)m(tion)32 b(is)f(to)g(minimise)f(p)s(ollution)h(of)f(the)h
+(namespaces)f(of)h(library)f(clien)m(ts.)150 2321 y Fe(3.1.1)63
+b(Lo)m(w-lev)m(el)39 b(summary)150 2514 y Fj(This)52
+b(in)m(terface)i(pro)m(vides)e(services)h(for)f(compressing)g(and)g
+(decompressing)g(data)g(in)g(memory)-8 b(.)150 2623 y(There's)42
+b(no)g(pro)m(vision)g(for)g(dealing)g(with)f(\014les,)k(streams)d(or)g
+(an)m(y)g(other)g(I/O)h(mec)m(hanisms,)h(just)150 2733
+y(straigh)m(t)51 b(memory-to-memory)g(w)m(ork.)98 b(In)48
+b(fact,)55 b(this)49 b(part)h(of)f(the)h(library)f(can)g(b)s(e)f
+(compiled)150 2843 y(without)31 b(inclusion)f(of)g Fi(stdio.h)p
+Fj(,)f(whic)m(h)h(ma)m(y)h(b)s(e)f(helpful)f(for)i(em)m(b)s(edded)e
+(applications.)150 2999 y(The)h(lo)m(w-lev)m(el)k(part)c(of)h(the)f
+(library)g(has)g(no)h(global)g(v)-5 b(ariables)31 b(and)e(is)i
+(therefore)g(thread-safe.)150 3156 y(Six)26 b(routines)h(mak)m(e)h(up)e
+(the)h(lo)m(w)g(lev)m(el)i(in)m(terface:)41 b Fi(BZ2_bzCompressInit)p
+Fj(,)22 b Fi(BZ2_bzCompress)p Fj(,)i(and)150 3266 y Fi
+(BZ2_bzCompressEnd)i Fj(for)k(compression,)h(and)f(a)g(corresp)s
+(onding)g(trio)h Fi(BZ2_bzDecompressInit)p Fj(,)150 3375
+y Fi(BZ2_bzDecompress)36 b Fj(and)j Fi(BZ2_bzDecompressEnd)c
+Fj(for)41 b(decompression.)70 b(The)40 b Fi(*Init)f Fj(functions)150
+3485 y(allo)s(cate)k(memory)e(for)g(compression/decompression)h(and)e
+(do)h(other)h(initialisations,)k(whilst)41 b(the)150
+3595 y Fi(*End)29 b Fj(functions)h(close)i(do)m(wn)e(op)s(erations)h
+(and)e(release)j(memory)-8 b(.)150 3751 y(The)35 b(real)h(w)m(ork)f(is)
+g(done)g(b)m(y)g Fi(BZ2_bzCompress)d Fj(and)i Fi(BZ2_bzDecompress)p
+Fj(.)50 b(These)36 b(compress)f(and)150 3861 y(decompress)28
+b(data)g(from)f(a)h(user-supplied)e(input)h(bu\013er)g(to)h(a)g
+(user-supplied)e(output)i(bu\013er.)39 b(These)150 3971
+y(bu\013ers)31 b(can)g(b)s(e)g(an)m(y)h(size;)h(arbitrary)f(quan)m
+(tities)h(of)f(data)g(are)g(handled)e(b)m(y)i(making)f(rep)s(eated)h
+(calls)150 4080 y(to)g(these)g(functions.)43 b(This)31
+b(is)g(a)h(\015exible)f(mec)m(hanism)h(allo)m(wing)g(a)g(consumer-pull)
+f(st)m(yle)h(of)g(activit)m(y)-8 b(,)150 4190 y(or)31
+b(pro)s(ducer-push,)d(or)j(a)f(mixture)h(of)f(b)s(oth.)150
+4443 y Fe(3.1.2)63 b(High-lev)m(el)41 b(summary)150 4635
+y Fj(This)c(in)m(terface)i(pro)m(vides)e(some)h(handy)e(wrapp)s(ers)f
+(around)i(the)g(lo)m(w-lev)m(el)j(in)m(terface)f(to)f(facilitate)150
+4745 y(reading)25 b(and)f(writing)h Fi(bzip2)f Fj(format)h(\014les)g
+(\()p Fi(.bz2)f Fj(\014les\).)39 b(The)25 b(routines)h(pro)m(vide)f(ho)
+s(oks)g(to)g(facilitate)150 4854 y(reading)42 b(\014les)f(in)g(whic)m
+(h)h(the)g Fi(bzip2)e Fj(data)i(stream)g(is)f(em)m(b)s(edded)g(within)g
+(some)h(larger-scale)i(\014le)150 4964 y(structure,)31
+b(or)g(where)f(there)h(are)g(m)m(ultiple)g Fi(bzip2)e
+Fj(data)h(streams)h(concatenated)i(end-to-end.)150 5121
+y(F)-8 b(or)31 b(reading)g(\014les,)f Fi(BZ2_bzReadOpen)p
+Fj(,)d Fi(BZ2_bzRead)p Fj(,)h Fi(BZ2_bzReadClose)e Fj(and)150
+5230 y Fi(BZ2_bzReadGetUnused)18 b Fj(are)23 b(supplied.)37
+b(F)-8 b(or)24 b(writing)f(\014les,)i Fi(BZ2_bzWriteOpen)p
+Fj(,)20 b Fi(BZ2_bzWrite)g Fj(and)150 5340 y Fi(BZ2_bzWriteFinish)26
+b Fj(are)k(a)m(v)-5 b(ailable.)p eop
+%%Page: 11 12
+11 11 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(11)150 299 y Fj(As)32
+b(with)h(the)g(lo)m(w-lev)m(el)j(library)-8 b(,)33 b(no)g(global)h(v)-5
+b(ariables)33 b(are)g(used)f(so)h(the)g(library)g(is)g(p)s(er)f(se)h
+(thread-)150 408 y(safe.)62 b(Ho)m(w)m(ev)m(er,)41 b(if)c(I/O)h(errors)
+g(o)s(ccur)f(whilst)g(reading)h(or)f(writing)h(the)f(underlying)g
+(compressed)150 518 y(\014les,)j(y)m(ou)e(ma)m(y)h(ha)m(v)m(e)f(to)h
+(consult)g Fi(errno)d Fj(to)j(determine)f(the)h(cause)f(of)g(the)g
+(error.)64 b(In)37 b(that)i(case,)150 628 y(y)m(ou'd)30
+b(need)h(a)f(C)g(library)g(whic)m(h)g(correctly)j(supp)s(orts)c
+Fi(errno)g Fj(in)h(a)g(m)m(ultithreaded)h(en)m(vironmen)m(t.)150
+784 y(T)-8 b(o)77 b(mak)m(e)f(the)g(library)g(a)f(little)j(simpler)e
+(and)e(more)j(p)s(ortable,)87 b Fi(BZ2_bzReadOpen)72
+b Fj(and)150 894 y Fi(BZ2_bzWriteOpen)34 b Fj(require)39
+b(y)m(ou)g(to)g(pass)f(them)h(\014le)f(handles)g(\()p
+Fi(FILE*)p Fj(s\))f(whic)m(h)h(ha)m(v)m(e)i(previously)150
+1004 y(b)s(een)56 b(op)s(ened)g(for)h(reading)f(or)h(writing)g(resp)s
+(ectiv)m(ely)-8 b(.)122 b(That)57 b(a)m(v)m(oids)h(p)s(ortabilit)m(y)f
+(problems)150 1113 y(asso)s(ciated)33 b(with)g(\014le)f(op)s(erations)h
+(and)e(\014le)i(attributes,)h(whilst)e(not)h(b)s(eing)f(m)m(uc)m(h)g
+(of)h(an)f(imp)s(osition)150 1223 y(on)e(the)h(programmer.)150
+1474 y Fe(3.1.3)63 b(Utilit)m(y)40 b(functions)h(summary)150
+1666 y Fj(F)-8 b(or)43 b(v)m(ery)h(simple)e(needs,)k
+Fi(BZ2_bzBuffToBuffCompres)o(s)36 b Fj(and)42 b Fi
+(BZ2_bzBuffToBuffDecompres)o(s)150 1776 y Fj(are)26 b(pro)m(vided.)39
+b(These)26 b(compress)f(data)h(in)f(memory)h(from)f(one)h(bu\013er)f
+(to)h(another)g(bu\013er)f(in)g(a)g(single)150 1885 y(function)37
+b(call.)62 b(Y)-8 b(ou)38 b(should)e(assess)h(whether)g(these)h
+(functions)f(ful\014ll)f(y)m(our)i(memory-to-memory)150
+1995 y(compression/decompression)22 b(requiremen)m(ts)g(b)s(efore)f(in)
+m(v)m(esting)i(e\013ort)f(in)f(understanding)f(the)h(more)150
+2105 y(general)31 b(but)f(more)h(complex)g(lo)m(w-lev)m(el)i(in)m
+(terface.)150 2261 y(Y)-8 b(oshiok)j(a)47 b(Tsuneo)g(\()p
+Fi(QWF00133@niftyserve.or.jp)40 b Fj(/)47 b Fi
+(tsuneo-y@is.aist-nara.ac)o(.jp)p Fj(\))40 b(has)150
+2371 y(con)m(tributed)f(some)f(functions)g(to)h(giv)m(e)h(b)s(etter)e
+Fi(zlib)f Fj(compatibilit)m(y)-8 b(.)67 b(These)38 b(functions)g(are)g
+Fi(BZ2_)150 2481 y(bzopen)p Fj(,)g Fi(BZ2_bzread)p Fj(,)f
+Fi(BZ2_bzwrite)p Fj(,)g Fi(BZ2_bzflush)p Fj(,)g Fi(BZ2_bzclose)p
+Fj(,)g Fi(BZ2_bzerror)e Fj(and)i Fi(BZ2_)150 2590 y(bzlibVersion)p
+Fj(.)44 b(Y)-8 b(ou)33 b(ma)m(y)g(\014nd)e(these)i(functions)g(more)g
+(con)m(v)m(enien)m(t)i(for)e(simple)f(\014le)h(reading)g(and)150
+2700 y(writing,)d(than)g(those)g(in)f(the)h(high-lev)m(el)i(in)m
+(terface.)42 b(These)30 b(functions)f(are)h(not)g(\(y)m(et\))i
+(o\016cially)f(part)150 2809 y(of)h(the)g(library)-8
+b(,)33 b(and)e(are)h(minimally)g(do)s(cumen)m(ted)g(here.)45
+b(If)31 b(they)h(break,)h(y)m(ou)f(get)h(to)g(k)m(eep)f(all)h(the)150
+2919 y(pieces.)42 b(I)30 b(hop)s(e)g(to)h(do)s(cumen)m(t)f(them)h(prop)
+s(erly)e(when)h(time)h(p)s(ermits.)150 3076 y(Y)-8 b(oshiok)j(a)27
+b(also)g(con)m(tributed)g(mo)s(di\014cations)g(to)g(allo)m(w)h(the)e
+(library)h(to)g(b)s(e)f(built)g(as)g(a)h(Windo)m(ws)f(DLL.)150
+3362 y Fk(3.2)68 b(Error)45 b(handling)150 3554 y Fj(The)22
+b(library)g(is)g(designed)g(to)i(reco)m(v)m(er)g(cleanly)f(in)f(all)h
+(situations,)i(including)c(the)i(w)m(orst-case)h(situation)150
+3664 y(of)k(decompressing)g(random)f(data.)40 b(I'm)27
+b(not)h(100\045)h(sure)e(that)i(it)f(can)g(alw)m(a)m(ys)g(do)g(this,)g
+(so)g(y)m(ou)g(migh)m(t)150 3774 y(w)m(an)m(t)i(to)g(add)e(a)i(signal)f
+(handler)g(to)h(catc)m(h)g(segmen)m(tation)i(violations)f(during)d
+(decompression)h(if)h(y)m(ou)150 3883 y(are)c(feeling)g(esp)s(ecially)g
+(paranoid.)39 b(I)25 b(w)m(ould)g(b)s(e)g(in)m(terested)i(in)e(hearing)
+g(more)h(ab)s(out)f(the)h(robustness)150 3993 y(of)31
+b(the)f(library)h(to)g(corrupted)f(compressed)g(data.)150
+4150 y(V)-8 b(ersion)38 b(1.0)h(is)e(m)m(uc)m(h)h(more)g(robust)f(in)g
+(this)h(resp)s(ect)g(than)f(0.9.0)i(or)f(0.9.5.)64 b(In)m(v)m
+(estigations)40 b(with)150 4259 y(Chec)m(k)m(er)30 b(\(a)f(to)s(ol)h
+(for)f(detecting)h(problems)f(with)f(memory)h(managemen)m(t,)i(similar)
+e(to)h(Purify\))e(indi-)150 4369 y(cate)34 b(that,)g(at)f(least)g(for)g
+(the)g(few)f(\014les)g(I)h(tested,)h(all)f(single-bit)h(errors)e(in)g
+(the)h(decompressed)g(data)150 4478 y(are)28 b(caugh)m(t)h(prop)s(erly)
+-8 b(,)29 b(with)f(no)g(segmen)m(tation)i(faults,)f(no)f(reads)g(of)g
+(uninitialised)g(data)g(and)g(no)g(out)150 4588 y(of)j(range)h(reads)f
+(or)h(writes.)44 b(So)31 b(it's)h(certainly)h(m)m(uc)m(h)e(impro)m(v)m
+(ed,)i(although)e(I)h(w)m(ouldn't)f(claim)h(it)g(to)150
+4698 y(b)s(e)e(totally)i(b)s(om)m(bpro)s(of.)150 4854
+y(The)24 b(\014le)g Fi(bzlib.h)e Fj(con)m(tains)j(all)f(de\014nitions)g
+(needed)g(to)g(use)g(the)g(library)-8 b(.)39 b(In)24
+b(particular,)i(y)m(ou)e(should)150 4964 y(de\014nitely)31
+b(not)f(include)h Fi(bzlib_private.h)p Fj(.)150 5121
+y(In)38 b Fi(bzlib.h)p Fj(,)g(the)g(v)-5 b(arious)38
+b(return)g(v)-5 b(alues)38 b(are)g(de\014ned.)62 b(The)38
+b(follo)m(wing)i(list)f(is)f(not)g(in)m(tended)g(as)150
+5230 y(an)33 b(exhaustiv)m(e)h(description)g(of)g(the)g(circumstances)g
+(in)f(whic)m(h)g(a)h(giv)m(en)g(v)-5 b(alue)34 b(ma)m(y)g(b)s(e)f
+(returned)g({)150 5340 y(those)h(descriptions)f(are)h(giv)m(en)g
+(later.)50 b(Rather,)34 b(it)g(is)f(in)m(tended)g(to)h(con)m(v)m(ey)h
+(the)e(rough)g(meaning)g(of)p eop
+%%Page: 12 13
+12 12 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(12)150 299 y Fj(eac)m(h)35
+b(return)f(v)-5 b(alue.)53 b(The)34 b(\014rst)g(\014v)m(e)h(actions)g
+(are)g(normal)f(and)f(not)i(in)m(tended)f(to)i(denote)f(an)e(error)150
+408 y(situation.)150 592 y Fi(BZ_OK)240 b Fj(The)30 b(requested)h
+(action)h(w)m(as)e(completed)i(successfully)-8 b(.)150
+756 y Fi(BZ_RUN_OK)150 866 y(BZ_FLUSH_OK)150 975 y(BZ_FINISH_OK)630
+1085 y Fj(In)22 b Fi(BZ2_bzCompress)p Fj(,)e(the)j(requested)g
+(\015ush/\014nish/nothing-sp)s(ecial)e(action)j(w)m(as)e(com-)630
+1194 y(pleted)31 b(successfully)-8 b(.)150 1358 y Fi(BZ_STREAM_END)630
+1468 y Fj(Compression)38 b(of)g(data)h(w)m(as)f(completed,)j(or)e(the)f
+(logical)j(stream)e(end)e(w)m(as)h(detected)630 1577
+y(during)29 b(decompression.)150 1761 y(The)h(follo)m(wing)i(return)e
+(v)-5 b(alues)31 b(indicate)g(an)f(error)h(of)f(some)h(kind.)150
+1945 y Fi(BZ_CONFIG_ERROR)630 2055 y Fj(Indicates)46
+b(that)h(the)f(library)f(has)h(b)s(een)f(improp)s(erly)g(compiled)h(on)
+g(y)m(our)g(platform)630 2164 y({)k(a)h(ma)5 b(jor)50
+b(con\014guration)h(error.)100 b(Sp)s(eci\014cally)-8
+b(,)56 b(it)51 b(means)e(that)i Fi(sizeof\(char\))p Fj(,)630
+2274 y Fi(sizeof\(short\))43 b Fj(and)i Fi(sizeof\(int\))e
+Fj(are)k(not)g(1,)k(2)46 b(and)g(4)h(resp)s(ectiv)m(ely)-8
+b(,)52 b(as)47 b(they)630 2384 y(should)26 b(b)s(e.)38
+b(Note)29 b(that)e(the)g(library)f(should)g(still)h(w)m(ork)g(prop)s
+(erly)f(on)h(64-bit)h(platforms)630 2493 y(whic)m(h)43
+b(follo)m(w)h(the)g(LP64)f(programming)h(mo)s(del)e({)i(that)g(is,)i
+(where)d Fi(sizeof\(long\))630 2603 y Fj(and)32 b Fi(sizeof\(void*\))e
+Fj(are)j(8.)50 b(Under)32 b(LP64,)j Fi(sizeof\(int\))30
+b Fj(is)j(still)h(4,)h(so)e Fi(libbzip2)p Fj(,)630 2712
+y(whic)m(h)d(do)s(esn't)g(use)h(the)f Fi(long)f Fj(t)m(yp)s(e,)i(is)g
+(OK.)150 2876 y Fi(BZ_SEQUENCE_ERROR)630 2986 y Fj(When)41
+b(using)g(the)h(library)-8 b(,)45 b(it)d(is)g(imp)s(ortan)m(t)g(to)g
+(call)h(the)f(functions)f(in)g(the)h(correct)630 3095
+y(sequence)25 b(and)f(with)g(data)h(structures)g(\(bu\013ers)f(etc\))i
+(in)f(the)g(correct)h(states.)40 b Fi(libbzip2)630 3205
+y Fj(c)m(hec)m(ks)25 b(as)e(m)m(uc)m(h)g(as)g(it)h(can)f(to)h(ensure)f
+(this)g(is)g(happ)s(ening,)g(and)g(returns)f Fi(BZ_SEQUENCE_)630
+3314 y(ERROR)35 b Fj(if)i(not.)59 b(Co)s(de)36 b(whic)m(h)h(complies)g
+(precisely)h(with)e(the)h(function)f(seman)m(tics,)k(as)630
+3424 y(detailed)c(b)s(elo)m(w,)h(should)e(nev)m(er)g(receiv)m(e)j(this)
+d(v)-5 b(alue;)38 b(suc)m(h)d(an)g(ev)m(en)m(t)i(denotes)f(buggy)630
+3534 y(co)s(de)31 b(whic)m(h)f(y)m(ou)g(should)g(in)m(v)m(estigate.)150
+3697 y Fi(BZ_PARAM_ERROR)630 3807 y Fj(Returned)41 b(when)f(a)h
+(parameter)h(to)g(a)g(function)f(call)h(is)f(out)h(of)f(range)h(or)f
+(otherwise)630 3917 y(manifestly)35 b(incorrect.)55 b(As)34
+b(with)g Fi(BZ_SEQUENCE_ERROR)p Fj(,)d(this)k(denotes)g(a)f(bug)g(in)h
+(the)630 4026 y(clien)m(t)24 b(co)s(de.)38 b(The)22 b(distinction)h(b)s
+(et)m(w)m(een)f Fi(BZ_PARAM_ERROR)d Fj(and)i Fi(BZ_SEQUENCE_ERROR)630
+4136 y Fj(is)30 b(a)h(bit)f(hazy)-8 b(,)32 b(but)d(still)j(w)m(orth)e
+(making.)150 4300 y Fi(BZ_MEM_ERROR)630 4409 y Fj(Returned)44
+b(when)g(a)h(request)g(to)g(allo)s(cate)i(memory)e(failed.)83
+b(Note)46 b(that)g(the)f(quan-)630 4519 y(tit)m(y)d(of)f(memory)f
+(needed)g(to)i(decompress)e(a)g(stream)h(cannot)g(b)s(e)f(determined)h
+(un)m(til)630 4628 y(the)f(stream's)h(header)e(has)h(b)s(een)f(read.)69
+b(So)39 b Fi(BZ2_bzDecompress)d Fj(and)j Fi(BZ2_bzRead)630
+4738 y Fj(ma)m(y)29 b(return)f Fi(BZ_MEM_ERROR)d Fj(ev)m(en)30
+b(though)e(some)h(of)g(the)g(compressed)g(data)g(has)f(b)s(een)630
+4847 y(read.)76 b(The)42 b(same)g(is)g(not)g(true)g(for)h(compression;)
+48 b(once)43 b Fi(BZ2_bzCompressInit)37 b Fj(or)630 4957
+y Fi(BZ2_bzWriteOpen)26 b Fj(ha)m(v)m(e)32 b(successfully)e(completed,)
+i Fi(BZ_MEM_ERROR)27 b Fj(cannot)k(o)s(ccur.)150 5121
+y Fi(BZ_DATA_ERROR)630 5230 y Fj(Returned)d(when)g(a)h(data)g(in)m
+(tegrit)m(y)i(error)e(is)g(detected)h(during)d(decompression.)41
+b(Most)630 5340 y(imp)s(ortan)m(tly)-8 b(,)32 b(this)e(means)g(when)f
+(stored)i(and)e(computed)h(CR)m(Cs)g(for)g(the)h(data)f(do)h(not)p
+eop
+%%Page: 13 14
+13 13 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(13)630 299 y Fj(matc)m(h.)41
+b(This)28 b(v)-5 b(alue)28 b(is)h(also)g(returned)e(up)s(on)g
+(detection)j(of)f(an)m(y)f(other)h(anomaly)g(in)f(the)630
+408 y(compressed)i(data.)150 560 y Fi(BZ_DATA_ERROR_MAGIC)630
+670 y Fj(As)j(a)g(sp)s(ecial)g(case)h(of)f Fi(BZ_DATA_ERROR)p
+Fj(,)d(it)k(is)f(sometimes)h(useful)f(to)h(kno)m(w)f(when)f(the)630
+779 y(compressed)c(stream)g(do)s(es)g(not)g(start)g(with)g(the)g
+(correct)i(magic)e(b)m(ytes)h(\()p Fi('B')h('Z')f('h')p
+Fj(\).)150 931 y Fi(BZ_IO_ERROR)630 1040 y Fj(Returned)h(b)m(y)h
+Fi(BZ2_bzRead)d Fj(and)h Fi(BZ2_bzWrite)f Fj(when)i(there)h(is)g(an)f
+(error)h(reading)g(or)630 1150 y(writing)e(in)f(the)h(compressed)g
+(\014le,)g(and)f(b)m(y)h Fi(BZ2_bzReadOpen)24 b Fj(and)k
+Fi(BZ2_bzWriteOpen)630 1259 y Fj(for)h(attempts)i(to)f(use)f(a)h
+(\014le)f(for)h(whic)m(h)f(the)h(error)f(indicator)i(\(viz,)f
+Fi(ferror\(f\))p Fj(\))e(is)h(set.)630 1369 y(On)h(receipt)i(of)f
+Fi(BZ_IO_ERROR)p Fj(,)c(the)k(caller)h(should)e(consult)h
+Fi(errno)e Fj(and/or)h Fi(perror)f Fj(to)630 1479 y(acquire)i(op)s
+(erating-system)h(sp)s(eci\014c)e(information)h(ab)s(out)f(the)g
+(problem.)150 1630 y Fi(BZ_UNEXPECTED_EOF)630 1740 y
+Fj(Returned)j(b)m(y)g Fi(BZ2_bzRead)e Fj(when)h(the)i(compressed)f
+(\014le)h(\014nishes)e(b)s(efore)h(the)h(logical)630
+1849 y(end)c(of)g(stream)h(is)g(detected.)150 2001 y
+Fi(BZ_OUTBUFF_FULL)630 2110 y Fj(Returned)d(b)m(y)g Fi
+(BZ2_bzBuffToBuffCompress)22 b Fj(and)27 b Fi
+(BZ2_bzBuffToBuffDecompres)o(s)630 2220 y Fj(to)k(indicate)h(that)f
+(the)f(output)g(data)h(will)g(not)g(\014t)f(in)m(to)h(the)g(output)f
+(bu\013er)g(pro)m(vided.)150 2492 y Fk(3.3)68 b(Lo)l(w-lev)l(el)47
+b(in)l(terface)150 2766 y Fe(3.3.1)63 b Fd(BZ2_bzCompressInit)390
+2953 y Fi(typedef)533 3057 y(struct)46 b({)676 3161 y(char)h(*next_in;)
+676 3264 y(unsigned)f(int)h(avail_in;)676 3368 y(unsigned)f(int)h
+(total_in_lo32;)676 3472 y(unsigned)f(int)h(total_in_hi32;)676
+3680 y(char)g(*next_out;)676 3783 y(unsigned)f(int)h(avail_out;)676
+3887 y(unsigned)f(int)h(total_out_lo32;)676 3991 y(unsigned)f(int)h
+(total_out_hi32;)676 4198 y(void)g(*state;)676 4406 y(void)g
+(*\(*bzalloc\)\(void)c(*,int,int\);)676 4510 y(void)k
+(\(*bzfree\)\(void)d(*,void)i(*\);)676 4614 y(void)h(*opaque;)533
+4717 y(})533 4821 y(bz_stream;)390 5029 y(int)g(BZ2_bzCompressInit)c
+(\()k(bz_stream)e(*strm,)1583 5132 y(int)i(blockSize100k,)1583
+5236 y(int)g(verbosity,)1583 5340 y(int)g(workFactor)e(\);)p
+eop
+%%Page: 14 15
+14 14 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(14)150 456 y Fj(Prepares)31
+b(for)g(compression.)42 b(The)30 b Fi(bz_stream)e Fj(structure)j(holds)
+g(all)g(data)g(p)s(ertaining)g(to)g(the)g(com-)150 565
+y(pression)k(activit)m(y)-8 b(.)59 b(A)35 b Fi(bz_stream)d
+Fj(structure)k(should)e(b)s(e)h(allo)s(cated)i(and)e(initialised)h
+(prior)f(to)i(the)150 675 y(call.)65 b(The)38 b(\014elds)g(of)g
+Fi(bz_stream)e Fj(comprise)i(the)h(en)m(tiret)m(y)h(of)f(the)f
+(user-visible)h(data.)64 b Fi(state)37 b Fj(is)h(a)150
+784 y(p)s(oin)m(ter)31 b(to)g(the)g(priv)-5 b(ate)31
+b(data)f(structures)h(required)f(for)h(compression.)150
+941 y(Custom)36 b(memory)g(allo)s(cators)i(are)f(supp)s(orted,)f(via)h
+(\014elds)e Fi(bzalloc)p Fj(,)h Fi(bzfree)p Fj(,)g(and)g
+Fi(opaque)p Fj(.)56 b(The)150 1051 y(v)-5 b(alue)32 b
+Fi(opaque)e Fj(is)i(passed)f(to)i(as)f(the)g(\014rst)g(argumen)m(t)g
+(to)h(all)f(calls)h(to)g Fi(bzalloc)d Fj(and)h Fi(bzfree)p
+Fj(,)g(but)g(is)150 1160 y(otherwise)c(ignored)g(b)m(y)g(the)g(library)
+-8 b(.)39 b(The)27 b(call)g Fi(bzalloc)i(\()h(opaque,)e(n,)i(m)g(\))c
+Fj(is)h(exp)s(ected)g(to)g(return)150 1270 y(a)h(p)s(oin)m(ter)g
+Fi(p)f Fj(to)i Fi(n)h(*)g(m)d Fj(b)m(ytes)h(of)g(memory)-8
+b(,)29 b(and)e Fi(bzfree)h(\()i(opaque,)f(p)h(\))d Fj(should)g(free)h
+(that)g(memory)-8 b(.)150 1427 y(If)32 b(y)m(ou)h(don't)g(w)m(an)m(t)g
+(to)h(use)e(a)h(custom)g(memory)g(allo)s(cator,)i(set)e
+Fi(bzalloc)p Fj(,)f Fi(bzfree)e Fj(and)i Fi(opaque)f
+Fj(to)150 1537 y Fi(NULL)p Fj(,)e(and)h(the)h(library)f(will)h(then)f
+(use)g(the)h(standard)e Fi(malloc)p Fj(/)p Fi(free)f
+Fj(routines.)150 1693 y(Before)37 b(calling)h Fi(BZ2_bzCompressInit)p
+Fj(,)33 b(\014elds)k Fi(bzalloc)p Fj(,)f Fi(bzfree)f
+Fj(and)h Fi(opaque)e Fj(should)i(b)s(e)g(\014lled)150
+1803 y(appropriately)-8 b(,)35 b(as)e(just)f(describ)s(ed.)48
+b(Up)s(on)31 b(return,)j(the)f(in)m(ternal)h(state)g(will)f(ha)m(v)m(e)
+h(b)s(een)e(allo)s(cated)150 1913 y(and)43 b(initialised,)49
+b(and)43 b Fi(total_in_lo32)p Fj(,)h Fi(total_in_hi32)p
+Fj(,)g Fi(total_out_lo32)c Fj(and)j Fi(total_out_)150
+2022 y(hi32)35 b Fj(will)i(ha)m(v)m(e)g(b)s(een)f(set)h(to)g(zero.)59
+b(These)37 b(four)f(\014elds)f(are)i(used)f(b)m(y)g(the)g(library)h(to)
+g(inform)f(the)150 2132 y(caller)41 b(of)e(the)h(total)h(amoun)m(t)f
+(of)f(data)h(passed)e(in)m(to)j(and)d(out)i(of)f(the)h(library)-8
+b(,)42 b(resp)s(ectiv)m(ely)-8 b(.)70 b(Y)-8 b(ou)150
+2241 y(should)34 b(not)h(try)h(to)g(c)m(hange)g(them.)55
+b(As)34 b(of)h(v)m(ersion)h(1.0,)i(64-bit)e(coun)m(ts)g(are)f(main)m
+(tained,)i(ev)m(en)f(on)150 2351 y(32-bit)j(platforms,)g(using)e(the)h
+Fi(_hi32)d Fj(\014elds)i(to)h(store)h(the)e(upp)s(er)f(32)i(bits)f(of)h
+(the)f(coun)m(t.)63 b(So,)39 b(for)150 2460 y(example,)31
+b(the)g(total)h(amoun)m(t)f(of)f(data)h(in)f(is)g Fi(\(total_in_hi32)d
+(<<)j(32\))f(+)h(total_in_lo32)p Fj(.)150 2617 y(P)m(arameter)37
+b Fi(blockSize100k)31 b Fj(sp)s(eci\014es)k(the)h(blo)s(c)m(k)g(size)g
+(to)g(b)s(e)e(used)h(for)g(compression.)55 b(It)36 b(should)150
+2727 y(b)s(e)27 b(a)h(v)-5 b(alue)28 b(b)s(et)m(w)m(een)g(1)g(and)f(9)h
+(inclusiv)m(e,)i(and)c(the)i(actual)h(blo)s(c)m(k)f(size)h(used)e(is)g
+(100000)k(x)c(this)h(\014gure.)150 2836 y(9)j(giv)m(es)h(the)e(b)s(est)
+g(compression)h(but)f(tak)m(es)h(most)g(memory)-8 b(.)150
+2993 y(P)m(arameter)28 b Fi(verbosity)c Fj(should)h(b)s(e)g(set)i(to)g
+(a)g(n)m(um)m(b)s(er)e(b)s(et)m(w)m(een)i(0)f(and)g(4)g(inclusiv)m(e.)
+41 b(0)26 b(is)g(silen)m(t,)j(and)150 3103 y(greater)d(n)m(um)m(b)s
+(ers)e(giv)m(e)i(increasingly)g(v)m(erb)s(ose)f(monitoring/debugging)h
+(output.)38 b(If)25 b(the)g(library)f(has)150 3212 y(b)s(een)30
+b(compiled)h(with)f Fi(-DBZ_NO_STDIO)p Fj(,)d(no)j(suc)m(h)g(output)g
+(will)h(app)s(ear)f(for)g(an)m(y)g(v)m(erb)s(osit)m(y)i(setting.)150
+3369 y(P)m(arameter)g Fi(workFactor)c Fj(con)m(trols)k(ho)m(w)f(the)g
+(compression)g(phase)f(b)s(eha)m(v)m(es)h(when)e(presen)m(ted)i(with)
+150 3479 y(w)m(orst)38 b(case,)j(highly)c(rep)s(etitiv)m(e,)42
+b(input)37 b(data.)62 b(If)38 b(compression)g(runs)e(in)m(to)i
+(di\016culties)h(caused)e(b)m(y)150 3588 y(rep)s(etitiv)m(e)46
+b(data,)i(the)c(library)f(switc)m(hes)i(from)f(the)g(standard)f
+(sorting)h(algorithm)h(to)g(a)f(fallbac)m(k)150 3698
+y(algorithm.)c(The)27 b(fallbac)m(k)g(is)f(slo)m(w)m(er)i(than)d(the)i
+(standard)e(algorithm)j(b)m(y)e(p)s(erhaps)e(a)i(factor)i(of)e(three,)
+150 3808 y(but)k(alw)m(a)m(ys)h(b)s(eha)m(v)m(es)g(reasonably)-8
+b(,)31 b(no)f(matter)i(ho)m(w)e(bad)g(the)g(input.)150
+3965 y(Lo)m(w)m(er)23 b(v)-5 b(alues)23 b(of)g Fi(workFactor)c
+Fj(reduce)k(the)g(amoun)m(t)g(of)f(e\013ort)i(the)f(standard)f
+(algorithm)h(will)g(exp)s(end)150 4074 y(b)s(efore)h(resorting)g(to)h
+(the)f(fallbac)m(k.)39 b(Y)-8 b(ou)24 b(should)f(set)h(this)g
+(parameter)g(carefully;)j(to)s(o)d(lo)m(w,)i(and)d(man)m(y)150
+4184 y(inputs)32 b(will)h(b)s(e)f(handled)g(b)m(y)h(the)g(fallbac)m(k)g
+(algorithm)h(and)e(so)h(compress)g(rather)g(slo)m(wly)-8
+b(,)35 b(to)s(o)f(high,)150 4293 y(and)41 b(y)m(our)g(a)m(v)m
+(erage-to-w)m(orst)46 b(case)d(compression)e(times)h(can)g(b)s(ecome)g
+(v)m(ery)g(large.)74 b(The)42 b(default)150 4403 y(v)-5
+b(alue)31 b(of)f(30)h(giv)m(es)h(reasonable)f(b)s(eha)m(viour)f(o)m(v)m
+(er)i(a)f(wide)f(range)h(of)f(circumstances.)150 4560
+y(Allo)m(w)m(able)j(v)-5 b(alues)31 b(range)g(from)g(0)g(to)h(250)g
+(inclusiv)m(e.)44 b(0)31 b(is)g(a)g(sp)s(ecial)h(case,)g(equiv)-5
+b(alen)m(t)32 b(to)g(using)f(the)150 4669 y(default)f(v)-5
+b(alue)31 b(of)g(30.)150 4826 y(Note)k(that)e(the)h(compressed)f
+(output)g(generated)h(is)f(the)h(same)f(regardless)h(of)f(whether)g(or)
+g(not)h(the)150 4936 y(fallbac)m(k)d(algorithm)h(is)e(used.)150
+5093 y(Be)f(a)m(w)m(are)g(also)h(that)f(this)f(parameter)i(ma)m(y)f
+(disapp)s(ear)e(en)m(tirely)j(in)e(future)g(v)m(ersions)i(of)e(the)h
+(library)-8 b(.)150 5202 y(In)43 b(principle)h(it)g(should)f(b)s(e)g(p)
+s(ossible)h(to)g(devise)h(a)f(go)s(o)s(d)f(w)m(a)m(y)i(to)f
+(automatically)i(c)m(ho)s(ose)f(whic)m(h)150 5312 y(algorithm)32
+b(to)f(use.)40 b(Suc)m(h)30 b(a)g(mec)m(hanism)h(w)m(ould)f(render)g
+(the)h(parameter)g(obsolete.)p eop
+%%Page: 15 16
+15 15 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(15)150 299 y Fj(P)m(ossible)32
+b(return)e(v)-5 b(alues:)572 450 y Fi(BZ_CONFIG_ERROR)663
+554 y Fj(if)30 b(the)h(library)f(has)g(b)s(een)g(mis-compiled)572
+657 y Fi(BZ_PARAM_ERROR)663 761 y Fj(if)g Fi(strm)f Fj(is)i
+Fi(NULL)663 865 y Fj(or)f Fi(blockSize)e(<)i Fj(1)h(or)g
+Fi(blockSize)c(>)k Fj(9)663 969 y(or)f Fi(verbosity)e(<)i
+Fj(0)h(or)g Fi(verbosity)c(>)k Fj(4)663 1073 y(or)f Fi(workFactor)e(<)i
+Fj(0)h(or)f Fi(workFactor)e(>)i Fj(250)572 1176 y Fi(BZ_MEM_ERROR)663
+1280 y Fj(if)g(not)h(enough)f(memory)h(is)f(a)m(v)-5
+b(ailable)572 1384 y Fi(BZ_OK)663 1488 y Fj(otherwise)150
+1645 y(Allo)m(w)m(able)32 b(next)f(actions:)572 1796
+y Fi(BZ2_bzCompress)663 1899 y Fj(if)f Fi(BZ_OK)f Fj(is)h(returned)572
+2003 y(no)g(sp)s(eci\014c)g(action)i(needed)e(in)g(case)h(of)g(error)
+150 2255 y Fe(3.3.2)63 b Fd(BZ2_bzCompress)533 2441 y
+Fi(int)47 b(BZ2_bzCompress)d(\()j(bz_stream)f(*strm,)g(int)h(action)f
+(\);)150 2598 y Fj(Pro)m(vides)27 b(more)f(input)f(and/or)h(output)g
+(bu\013er)f(space)h(for)g(the)h(library)-8 b(.)39 b(The)26
+b(caller)h(main)m(tains)g(input)150 2708 y(and)j(output)g(bu\013ers,)g
+(and)f(calls)i Fi(BZ2_bzCompress)c Fj(to)k(transfer)f(data)h(b)s(et)m
+(w)m(een)g(them.)150 2865 y(Before)h(eac)m(h)h(call)g(to)f
+Fi(BZ2_bzCompress)p Fj(,)d Fi(next_in)h Fj(should)g(p)s(oin)m(t)i(at)h
+(the)f(data)g(to)h(b)s(e)e(compressed,)150 2974 y(and)40
+b Fi(avail_in)f Fj(should)h(indicate)i(ho)m(w)f(man)m(y)g(b)m(ytes)h
+(the)f(library)g(ma)m(y)g(read.)73 b Fi(BZ2_bzCompress)150
+3084 y Fj(up)s(dates)29 b Fi(next_in)p Fj(,)g Fi(avail_in)f
+Fj(and)i Fi(total_in)e Fj(to)j(re\015ect)g(the)g(n)m(um)m(b)s(er)e(of)i
+(b)m(ytes)g(it)g(has)f(read.)150 3241 y(Similarly)-8
+b(,)30 b Fi(next_out)d Fj(should)h(p)s(oin)m(t)h(to)h(a)f(bu\013er)f
+(in)h(whic)m(h)g(the)g(compressed)g(data)g(is)g(to)h(b)s(e)e(placed,)
+150 3350 y(with)k Fi(avail_out)f Fj(indicating)i(ho)m(w)g(m)m(uc)m(h)f
+(output)h(space)g(is)f(a)m(v)-5 b(ailable.)49 b Fi(BZ2_bzCompress)29
+b Fj(up)s(dates)150 3460 y Fi(next_out)p Fj(,)f Fi(avail_out)g
+Fj(and)i Fi(total_out)e Fj(to)j(re\015ect)g(the)g(n)m(um)m(b)s(er)e(of)
+i(b)m(ytes)g(output.)150 3617 y(Y)-8 b(ou)39 b(ma)m(y)g(pro)m(vide)g
+(and)f(remo)m(v)m(e)i(as)f(little)i(or)e(as)g(m)m(uc)m(h)f(data)h(as)g
+(y)m(ou)g(lik)m(e)h(on)f(eac)m(h)g(call)h(of)f Fi(BZ2_)150
+3726 y(bzCompress)p Fj(.)46 b(In)32 b(the)i(limit,)h(it)e(is)g
+(acceptable)i(to)f(supply)e(and)g(remo)m(v)m(e)j(data)e(one)g(b)m(yte)h
+(at)g(a)f(time,)150 3836 y(although)27 b(this)g(w)m(ould)f(b)s(e)g
+(terribly)i(ine\016cien)m(t.)40 b(Y)-8 b(ou)27 b(should)f(alw)m(a)m(ys)
+i(ensure)e(that)h(at)g(least)h(one)f(b)m(yte)150 3946
+y(of)k(output)f(space)g(is)h(a)m(v)-5 b(ailable)32 b(at)f(eac)m(h)g
+(call.)150 4102 y(A)36 b(second)g(purp)s(ose)f(of)i Fi(BZ2_bzCompress)
+32 b Fj(is)37 b(to)g(request)g(a)f(c)m(hange)h(of)g(mo)s(de)f(of)g(the)
+h(compressed)150 4212 y(stream.)150 4369 y(Conceptually)-8
+b(,)24 b(a)d(compressed)g(stream)g(can)g(b)s(e)f(in)h(one)g(of)g(four)f
+(states:)38 b(IDLE,)20 b(R)m(UNNING,)i(FLUSH-)150 4478
+y(ING)34 b(and)d(FINISHING.)k(Before)e(initialisation)i(\()p
+Fi(BZ2_bzCompressInit)p Fj(\))28 b(and)k(after)i(termination)150
+4588 y(\()p Fi(BZ2_bzCompressEnd)p Fj(\),)27 b(a)j(stream)h(is)f
+(regarded)h(as)f(IDLE.)150 4745 y(Up)s(on)j(initialisation)i(\()p
+Fi(BZ2_bzCompressInit)p Fj(\),)c(the)j(stream)g(is)g(placed)g(in)f(the)
+h(R)m(UNNING)h(state.)150 4854 y(Subsequen)m(t)k(calls)h(to)h
+Fi(BZ2_bzCompress)36 b Fj(should)i(pass)i Fi(BZ_RUN)e
+Fj(as)h(the)h(requested)g(action;)46 b(other)150 4964
+y(actions)31 b(are)g(illegal)i(and)c(will)i(result)g(in)f
+Fi(BZ_SEQUENCE_ERROR)p Fj(.)150 5121 y(A)m(t)37 b(some)f(p)s(oin)m(t,)i
+(the)e(calling)h(program)f(will)h(ha)m(v)m(e)g(pro)m(vided)e(all)i(the)
+f(input)g(data)g(it)g(w)m(an)m(ts)h(to.)58 b(It)150 5230
+y(will)30 b(then)f(w)m(an)m(t)h(to)g(\014nish)e(up)g({)i(in)f
+(e\013ect,)j(asking)d(the)h(library)f(to)h(pro)s(cess)g(an)m(y)f(data)h
+(it)g(migh)m(t)g(ha)m(v)m(e)150 5340 y(bu\013ered)23
+b(in)m(ternally)-8 b(.)40 b(In)24 b(this)g(state,)j Fi(BZ2_bzCompress)
+20 b Fj(will)k(no)g(longer)h(attempt)g(to)g(read)f(data)g(from)p
+eop
+%%Page: 16 17
+16 16 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(16)150 299 y Fi(next_in)p
+Fj(,)32 b(but)g(it)i(will)f(w)m(an)m(t)h(to)g(write)g(data)f(to)h
+Fi(next_out)p Fj(.)46 b(Because)34 b(the)f(output)g(bu\013er)f
+(supplied)150 408 y(b)m(y)d(the)g(user)g(can)g(b)s(e)f(arbitrarily)i
+(small,)g(the)f(\014nishing-up)f(op)s(eration)h(cannot)h(necessarily)g
+(b)s(e)e(done)150 518 y(with)i(a)h(single)g(call)g(of)g
+Fi(BZ2_bzCompress)p Fj(.)150 675 y(Instead,)47 b(the)d(calling)g
+(program)g(passes)f Fi(BZ_FINISH)e Fj(as)i(an)g(action)i(to)f
+Fi(BZ2_bzCompress)p Fj(.)76 b(This)150 784 y(c)m(hanges)26
+b(the)g(stream's)g(state)h(to)f(FINISHING.)h(An)m(y)e(remaining)h
+(input)e(\(ie,)k Fi(next_in[0)g(..)i(avail_)150 894 y(in-1])p
+Fj(\))k(is)h(compressed)g(and)f(transferred)h(to)h(the)f(output)g
+(bu\013er.)54 b(T)-8 b(o)36 b(do)f(this,)i Fi(BZ2_bzCompress)150
+1004 y Fj(m)m(ust)h(b)s(e)f(called)i(rep)s(eatedly)g(un)m(til)f(all)g
+(the)h(output)f(has)f(b)s(een)g(consumed.)63 b(A)m(t)38
+b(that)h(p)s(oin)m(t,)h Fi(BZ2_)150 1113 y(bzCompress)g
+Fj(returns)i Fi(BZ_STREAM_END)p Fj(,)g(and)f(the)i(stream's)g(state)h
+(is)e(set)h(bac)m(k)g(to)h(IDLE.)d Fi(BZ2_)150 1223 y(bzCompressEnd)27
+b Fj(should)i(then)h(b)s(e)g(called.)150 1380 y(Just)g(to)i(mak)m(e)f
+(sure)f(the)h(calling)g(program)g(do)s(es)f(not)h(c)m(heat,)h(the)f
+(library)f(mak)m(es)h(a)g(note)g(of)g Fi(avail_)150 1489
+y(in)i Fj(at)h(the)g(time)h(of)e(the)h(\014rst)g(call)g(to)h
+Fi(BZ2_bzCompress)30 b Fj(whic)m(h)j(has)g Fi(BZ_FINISH)e
+Fj(as)j(an)f(action)i(\(ie,)150 1599 y(at)g(the)g(time)h(the)e(program)
+h(has)f(announced)g(its)h(in)m(ten)m(tion)h(to)g(not)f(supply)e(an)m(y)
+h(more)h(input\).)53 b(By)150 1708 y(comparing)30 b(this)f(v)-5
+b(alue)29 b(with)h(that)f(of)h Fi(avail_in)d Fj(o)m(v)m(er)k(subsequen)
+m(t)d(calls)j(to)f Fi(BZ2_bzCompress)p Fj(,)c(the)150
+1818 y(library)k(can)f(detect)j(an)m(y)e(attempts)h(to)f(slip)g(in)f
+(more)h(data)g(to)h(compress.)41 b(An)m(y)29 b(calls)i(for)e(whic)m(h)h
+(this)150 1928 y(is)h(detected)i(will)f(return)f Fi(BZ_SEQUENCE_ERROR)p
+Fj(.)39 b(This)31 b(indicates)i(a)e(programming)g(mistak)m(e)i(whic)m
+(h)150 2037 y(should)c(b)s(e)h(corrected.)150 2194 y(Instead)36
+b(of)g(asking)h(to)g(\014nish,)f(the)h(calling)g(program)f(ma)m(y)h
+(ask)f Fi(BZ2_bzCompress)c Fj(to)37 b(tak)m(e)h(all)f(the)150
+2304 y(remaining)f(input,)g(compress)f(it)h(and)f(terminate)h(the)g
+(curren)m(t)g(\(Burro)m(ws-Wheeler\))h(compression)150
+2413 y(blo)s(c)m(k.)j(This)25 b(could)h(b)s(e)g(useful)f(for)h(error)g
+(con)m(trol)i(purp)s(oses.)38 b(The)26 b(mec)m(hanism)g(is)g(analogous)
+h(to)f(that)150 2523 y(for)35 b(\014nishing:)48 b(call)35
+b Fi(BZ2_bzCompress)c Fj(with)k(an)f(action)i(of)f Fi(BZ_FLUSH)p
+Fj(,)f(remo)m(v)m(e)i(output)f(data,)h(and)150 2632 y(p)s(ersist)i
+(with)g(the)h Fi(BZ_FLUSH)d Fj(action)k(un)m(til)e(the)h(v)-5
+b(alue)39 b Fi(BZ_RUN)d Fj(is)j(returned.)64 b(As)38
+b(with)g(\014nishing,)150 2742 y Fi(BZ2_bzCompress)21
+b Fj(detects)27 b(an)m(y)f(attempt)g(to)h(pro)m(vide)e(more)h(input)f
+(data)g(once)i(the)e(\015ush)f(has)h(b)s(egun.)150 2899
+y(Once)31 b(the)g(\015ush)d(is)j(complete,)h(the)f(stream)f(returns)g
+(to)i(the)e(normal)h(R)m(UNNING)h(state.)150 3056 y(This)f(all)g
+(sounds)f(prett)m(y)i(complex,)g(but)f(isn't)g(really)-8
+b(.)44 b(Here's)32 b(a)f(table)h(whic)m(h)e(sho)m(ws)h(whic)m(h)g
+(actions)150 3165 y(are)d(allo)m(w)m(able)i(in)e(eac)m(h)h(state,)h
+(what)d(action)j(will)e(b)s(e)f(tak)m(en,)j(what)d(the)i(next)f(state)h
+(is,)g(and)e(what)h(the)150 3275 y(non-error)g(return)f(v)-5
+b(alues)28 b(are.)40 b(Note)30 b(that)e(y)m(ou)g(can't)g(explicitly)i
+(ask)d(what)h(state)h(the)f(stream)g(is)g(in,)150 3384
+y(but)h(nor)h(do)f(y)m(ou)h(need)g(to)g({)h(it)f(can)g(b)s(e)f
+(inferred)g(from)h(the)g(v)-5 b(alues)30 b(returned)f(b)m(y)h
+Fi(BZ2_bzCompress)p Fj(.)390 3535 y(IDLE/)p Fi(any)572
+3639 y Fj(Illegal.)63 b(IDLE)29 b(state)j(only)e(exists)h(after)g
+Fi(BZ2_bzCompressEnd)26 b Fj(or)572 3743 y(b)s(efore)k
+Fi(BZ2_bzCompressInit)p Fj(.)572 3847 y(Return)g(v)-5
+b(alue)31 b(=)f Fi(BZ_SEQUENCE_ERROR)390 4054 y Fj(R)m(UNNING/)p
+Fi(BZ_RUN)572 4158 y Fj(Compress)g(from)g Fi(next_in)e
+Fj(to)j Fi(next_out)d Fj(as)j(m)m(uc)m(h)f(as)h(p)s(ossible.)572
+4262 y(Next)g(state)h(=)e(R)m(UNNING)572 4366 y(Return)g(v)-5
+b(alue)31 b(=)f Fi(BZ_RUN_OK)390 4573 y Fj(R)m(UNNING/)p
+Fi(BZ_FLUSH)572 4677 y Fj(Remem)m(b)s(er)g(curren)m(t)h(v)-5
+b(alue)31 b(of)f Fi(next_in)p Fj(.)59 b(Compress)30 b(from)g
+Fi(next_in)572 4781 y Fj(to)h Fi(next_out)d Fj(as)j(m)m(uc)m(h)f(as)g
+(p)s(ossible,)g(but)g(do)h(not)f(accept)i(an)m(y)e(more)h(input.)572
+4885 y(Next)g(state)h(=)e(FLUSHING)572 4988 y(Return)g(v)-5
+b(alue)31 b(=)f Fi(BZ_FLUSH_OK)390 5196 y Fj(R)m(UNNING/)p
+Fi(BZ_FINISH)572 5300 y Fj(Remem)m(b)s(er)g(curren)m(t)h(v)-5
+b(alue)31 b(of)f Fi(next_in)p Fj(.)59 b(Compress)30 b(from)g
+Fi(next_in)p eop
+%%Page: 17 18
+17 17 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(17)572 299 y Fj(to)31
+b Fi(next_out)d Fj(as)j(m)m(uc)m(h)f(as)g(p)s(ossible,)g(but)g(do)h
+(not)f(accept)i(an)m(y)e(more)h(input.)572 403 y(Next)g(state)h(=)e
+(FINISHING)572 506 y(Return)g(v)-5 b(alue)31 b(=)f Fi(BZ_FINISH_OK)390
+714 y Fj(FLUSHING/)p Fi(BZ_FLUSH)572 818 y Fj(Compress)g(from)g
+Fi(next_in)e Fj(to)j Fi(next_out)d Fj(as)j(m)m(uc)m(h)f(as)h(p)s
+(ossible,)572 922 y(but)f(do)g(not)h(accept)g(an)m(y)g(more)g(input.)
+572 1025 y(If)f(all)h(the)g(existing)g(input)f(has)g(b)s(een)f(used)h
+(up)f(and)h(all)h(compressed)572 1129 y(output)f(has)g(b)s(een)g(remo)m
+(v)m(ed)663 1233 y(Next)h(state)h(=)e(R)m(UNNING;)i(Return)e(v)-5
+b(alue)31 b(=)f Fi(BZ_RUN_OK)572 1337 y Fj(else)663 1440
+y(Next)h(state)h(=)e(FLUSHING;)g(Return)h(v)-5 b(alue)30
+b(=)g Fi(BZ_FLUSH_OK)390 1648 y Fj(FLUSHING/other)572
+1752 y(Illegal.)572 1856 y(Return)g(v)-5 b(alue)31 b(=)f
+Fi(BZ_SEQUENCE_ERROR)390 2063 y Fj(FINISHING/)p Fi(BZ_FINISH)572
+2167 y Fj(Compress)g(from)g Fi(next_in)e Fj(to)j Fi(next_out)d
+Fj(as)j(m)m(uc)m(h)f(as)h(p)s(ossible,)572 2271 y(but)f(to)h(not)g
+(accept)g(an)m(y)g(more)g(input.)572 2374 y(If)f(all)h(the)g(existing)g
+(input)f(has)g(b)s(een)f(used)h(up)f(and)h(all)h(compressed)572
+2478 y(output)f(has)g(b)s(een)g(remo)m(v)m(ed)663 2582
+y(Next)h(state)h(=)e(IDLE;)f(Return)i(v)-5 b(alue)30
+b(=)g Fi(BZ_STREAM_END)572 2686 y Fj(else)663 2790 y(Next)h(state)h(=)e
+(FINISHING;)h(Return)g(v)-5 b(alue)30 b(=)g Fi(BZ_FINISHING)390
+2997 y Fj(FINISHING/other)572 3101 y(Illegal.)572 3205
+y(Return)g(v)-5 b(alue)31 b(=)f Fi(BZ_SEQUENCE_ERROR)150
+3361 y Fj(That)23 b(still)h(lo)s(oks)g(complicated?)39
+b(W)-8 b(ell,)26 b(fair)d(enough.)39 b(The)23 b(usual)f(sequence)h(of)h
+(calls)g(for)f(compressing)150 3471 y(a)30 b(load)h(of)g(data)f(is:)225
+3628 y Fh(\017)60 b Fj(Get)32 b(started)f(with)f Fi(BZ2_bzCompressInit)
+p Fj(.)225 3774 y Fh(\017)60 b Fj(Sho)m(v)m(el)37 b(data)g(in)f(and)g
+(shlurp)f(out)i(its)f(compressed)h(form)f(using)g(zero)i(or)e(more)h
+(calls)h(of)e Fi(BZ2_)330 3884 y(bzCompress)28 b Fj(with)i(action)h(=)f
+Fi(BZ_RUN)p Fj(.)225 4030 y Fh(\017)60 b Fj(Finish)24
+b(up.)38 b(Rep)s(eatedly)25 b(call)h Fi(BZ2_bzCompress)21
+b Fj(with)k(action)h(=)e Fi(BZ_FINISH)p Fj(,)g(cop)m(ying)h(out)h(the)
+330 4139 y(compressed)k(output,)h(un)m(til)g Fi(BZ_STREAM_END)26
+b Fj(is)31 b(returned.)225 4285 y Fh(\017)60 b Fj(Close)31
+b(up)e(and)h(go)h(home.)41 b(Call)30 b Fi(BZ2_bzCompressEnd)p
+Fj(.)150 4478 y(If)23 b(the)g(data)g(y)m(ou)h(w)m(an)m(t)g(to)f
+(compress)g(\014ts)g(in)m(to)h(y)m(our)g(input)e(bu\013er)g(all)i(at)f
+(once,)j(y)m(ou)d(can)g(skip)g(the)g(calls)150 4588 y(of)37
+b Fi(BZ2_bzCompress)26 b(\()k(...,)f(BZ_RUN)g(\))36 b
+Fj(and)g(just)g(do)g(the)h Fi(BZ2_bzCompress)26 b(\()k(...,)f
+(BZ_FINISH)150 4698 y(\))h Fj(calls.)150 4854 y(All)35
+b(required)g(memory)h(is)f(allo)s(cated)i(b)m(y)e Fi
+(BZ2_bzCompressInit)p Fj(.)51 b(The)35 b(compression)h(library)f(can)
+150 4964 y(accept)f(an)m(y)e(data)h(at)g(all)h(\(ob)m(viously\).)48
+b(So)32 b(y)m(ou)h(shouldn't)f(get)i(an)m(y)f(error)g(return)f(v)-5
+b(alues)32 b(from)h(the)150 5074 y Fi(BZ2_bzCompress)28
+b Fj(calls.)48 b(If)32 b(y)m(ou)g(do,)h(they)g(will)g(b)s(e)e
+Fi(BZ_SEQUENCE_ERROR)p Fj(,)e(and)i(indicate)i(a)g(bug)e(in)150
+5183 y(y)m(our)g(programming.)150 5340 y(T)-8 b(rivial)32
+b(other)f(p)s(ossible)f(return)g(v)-5 b(alues:)p eop
+%%Page: 18 19
+18 18 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(18)572 299 y Fi(BZ_PARAM_ERROR)663
+403 y Fj(if)30 b Fi(strm)f Fj(is)i Fi(NULL)p Fj(,)e(or)i
+Fi(strm->s)d Fj(is)j Fi(NULL)150 652 y Fe(3.3.3)63 b
+Fd(BZ2_bzCompressEnd)390 839 y Fi(int)47 b(BZ2_bzCompressEnd)c(\()k
+(bz_stream)f(*strm)g(\);)150 996 y Fj(Releases)32 b(all)f(memory)f
+(asso)s(ciated)i(with)e(a)h(compression)f(stream.)150
+1153 y(P)m(ossible)i(return)e(v)-5 b(alues:)481 1304
+y Fi(BZ_PARAM_ERROR)117 b Fj(if)31 b Fi(strm)e Fj(is)h
+Fi(NULL)f Fj(or)i Fi(strm->s)d Fj(is)j Fi(NULL)481 1408
+y(BZ_OK)120 b Fj(otherwise)150 1657 y Fe(3.3.4)63 b Fd
+(BZ2_bzDecompressInit)390 1844 y Fi(int)47 b(BZ2_bzDecompressInit)42
+b(\()48 b(bz_stream)d(*strm,)h(int)h(verbosity,)e(int)i(small)f(\);)150
+2001 y Fj(Prepares)39 b(for)f(decompression.)65 b(As)38
+b(with)h Fi(BZ2_bzCompressInit)p Fj(,)c(a)k Fi(bz_stream)d
+Fj(record)j(should)150 2110 y(b)s(e)30 b(allo)s(cated)j(and)d
+(initialised)i(b)s(efore)f(the)g(call.)44 b(Fields)31
+b Fi(bzalloc)p Fj(,)e Fi(bzfree)g Fj(and)h Fi(opaque)g
+Fj(should)g(b)s(e)150 2220 y(set)35 b(if)f(a)g(custom)h(memory)f(allo)s
+(cator)i(is)e(required,)h(or)g(made)f Fi(NULL)f Fj(for)h(the)g(normal)g
+Fi(malloc)p Fj(/)p Fi(free)150 2330 y Fj(routines.)72
+b(Up)s(on)40 b(return,)j(the)e(in)m(ternal)h(state)g(will)g(ha)m(v)m(e)
+f(b)s(een)f(initialised,)45 b(and)40 b Fi(total_in)f
+Fj(and)150 2439 y Fi(total_out)28 b Fj(will)j(b)s(e)e(zero.)150
+2596 y(F)-8 b(or)31 b(the)g(meaning)f(of)h(parameter)g
+Fi(verbosity)p Fj(,)d(see)j Fi(BZ2_bzCompressInit)p Fj(.)150
+2753 y(If)26 b Fi(small)f Fj(is)i(nonzero,)h(the)f(library)f(will)h
+(use)f(an)g(alternativ)m(e)j(decompression)e(algorithm)g(whic)m(h)f
+(uses)150 2862 y(less)42 b(memory)h(but)e(at)i(the)f(cost)i(of)e
+(decompressing)g(more)h(slo)m(wly)g(\(roughly)f(sp)s(eaking,)j(half)d
+(the)150 2972 y(sp)s(eed,)29 b(but)f(the)h(maxim)m(um)f(memory)i
+(requiremen)m(t)f(drops)f(to)i(around)e(2300k\).)42 b(See)29
+b(Chapter)g(2)g(for)150 3082 y(more)i(information)g(on)f(memory)g
+(managemen)m(t.)150 3238 y(Note)37 b(that)f(the)g(amoun)m(t)g(of)g
+(memory)g(needed)f(to)h(decompress)g(a)g(stream)g(cannot)g(b)s(e)f
+(determined)150 3348 y(un)m(til)41 b(the)f(stream's)h(header)f(has)g(b)
+s(een)f(read,)k(so)e(ev)m(en)g(if)f Fi(BZ2_bzDecompressInit)35
+b Fj(succeeds,)43 b(a)150 3458 y(subsequen)m(t)30 b Fi
+(BZ2_bzDecompress)c Fj(could)k(fail)h(with)f Fi(BZ_MEM_ERROR)p
+Fj(.)150 3614 y(P)m(ossible)i(return)e(v)-5 b(alues:)572
+3765 y Fi(BZ_CONFIG_ERROR)663 3869 y Fj(if)30 b(the)h(library)f(has)g
+(b)s(een)g(mis-compiled)572 3973 y Fi(BZ_PARAM_ERROR)663
+4077 y Fj(if)g Fi(\(small)46 b(!=)h(0)h(&&)f(small)f(!=)h(1\))663
+4181 y Fj(or)30 b Fi(\(verbosity)45 b(<)j(0)f(||)g(verbosity)f(>)h(4\))
+572 4284 y(BZ_MEM_ERROR)663 4388 y Fj(if)30 b(insu\016cien)m(t)h
+(memory)f(is)h(a)m(v)-5 b(ailable)150 4545 y(Allo)m(w)m(able)32
+b(next)f(actions:)572 4696 y Fi(BZ2_bzDecompress)663
+4800 y Fj(if)f Fi(BZ_OK)f Fj(w)m(as)h(returned)572 4904
+y(no)g(sp)s(eci\014c)g(action)i(required)e(in)g(case)h(of)g(error)150
+5153 y Fe(3.3.5)63 b Fd(BZ2_bzDecompress)390 5340 y Fi(int)47
+b(BZ2_bzDecompress)c(\()48 b(bz_stream)d(*strm)h(\);)p
+eop
+%%Page: 19 20
+19 19 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(19)150 299 y Fj(Pro)m(vides)41
+b(more)g(input)f(and/out)g(output)h(bu\013er)e(space)i(for)f(the)h
+(library)-8 b(.)71 b(The)41 b(caller)h(main)m(tains)150
+408 y(input)30 b(and)f(output)h(bu\013ers,)g(and)g(uses)g
+Fi(BZ2_bzDecompress)25 b Fj(to)32 b(transfer)e(data)h(b)s(et)m(w)m(een)
+g(them.)150 565 y(Before)45 b(eac)m(h)h(call)f(to)h Fi
+(BZ2_bzDecompress)p Fj(,)e Fi(next_in)e Fj(should)i(p)s(oin)m(t)h(at)g
+(the)g(compressed)f(data,)150 675 y(and)33 b Fi(avail_in)e
+Fj(should)i(indicate)i(ho)m(w)e(man)m(y)h(b)m(ytes)g(the)g(library)g
+(ma)m(y)g(read.)50 b Fi(BZ2_bzDecompress)150 784 y Fj(up)s(dates)29
+b Fi(next_in)p Fj(,)g Fi(avail_in)f Fj(and)i Fi(total_in)e
+Fj(to)j(re\015ect)g(the)g(n)m(um)m(b)s(er)e(of)i(b)m(ytes)g(it)g(has)f
+(read.)150 941 y(Similarly)-8 b(,)40 b Fi(next_out)34
+b Fj(should)i(p)s(oin)m(t)h(to)h(a)f(bu\013er)f(in)h(whic)m(h)g(the)g
+(uncompressed)f(output)h(is)g(to)h(b)s(e)150 1051 y(placed,)f(with)e
+Fi(avail_out)e Fj(indicating)j(ho)m(w)f(m)m(uc)m(h)h(output)f(space)g
+(is)h(a)m(v)-5 b(ailable.)57 b Fi(BZ2_bzCompress)150
+1160 y Fj(up)s(dates)29 b Fi(next_out)p Fj(,)g Fi(avail_out)f
+Fj(and)h Fi(total_out)f Fj(to)j(re\015ect)h(the)e(n)m(um)m(b)s(er)g(of)
+g(b)m(ytes)h(output.)150 1317 y(Y)-8 b(ou)39 b(ma)m(y)g(pro)m(vide)g
+(and)f(remo)m(v)m(e)i(as)f(little)i(or)e(as)g(m)m(uc)m(h)f(data)h(as)g
+(y)m(ou)g(lik)m(e)h(on)f(eac)m(h)g(call)h(of)f Fi(BZ2_)150
+1427 y(bzDecompress)p Fj(.)d(In)27 b(the)h(limit,)h(it)f(is)f
+(acceptable)i(to)f(supply)e(and)g(remo)m(v)m(e)j(data)f(one)g(b)m(yte)g
+(at)f(a)h(time,)150 1537 y(although)f(this)g(w)m(ould)f(b)s(e)g
+(terribly)i(ine\016cien)m(t.)40 b(Y)-8 b(ou)27 b(should)f(alw)m(a)m(ys)
+i(ensure)e(that)h(at)g(least)h(one)f(b)m(yte)150 1646
+y(of)k(output)f(space)g(is)h(a)m(v)-5 b(ailable)32 b(at)f(eac)m(h)g
+(call.)150 1803 y(Use)g(of)f Fi(BZ2_bzDecompress)c Fj(is)k(simpler)h
+(than)f Fi(BZ2_bzCompress)p Fj(.)150 1960 y(Y)-8 b(ou)28
+b(should)f(pro)m(vide)i(input)f(and)f(remo)m(v)m(e)j(output)e(as)g
+(describ)s(ed)g(ab)s(o)m(v)m(e,)i(and)d(rep)s(eatedly)i(call)g
+Fi(BZ2_)150 2069 y(bzDecompress)k Fj(un)m(til)k Fi(BZ_STREAM_END)c
+Fj(is)k(returned.)59 b(App)s(earance)36 b(of)g Fi(BZ_STREAM_END)d
+Fj(denotes)150 2179 y(that)45 b Fi(BZ2_bzDecompress)40
+b Fj(has)45 b(detected)h(the)f(logical)i(end)d(of)g(the)h(compressed)g
+(stream.)84 b Fi(BZ2_)150 2289 y(bzDecompress)27 b Fj(will)k(not)g(pro)
+s(duce)e Fi(BZ_STREAM_END)e Fj(un)m(til)k(all)g(output)g(data)f(has)g
+(b)s(een)g(placed)h(in)m(to)150 2398 y(the)k(output)f(bu\013er,)i(so)e
+(once)i Fi(BZ_STREAM_END)31 b Fj(app)s(ears,)k(y)m(ou)g(are)g(guaran)m
+(teed)g(to)h(ha)m(v)m(e)f(a)m(v)-5 b(ailable)150 2508
+y(all)31 b(the)g(decompressed)f(output,)h(and)e Fi(BZ2_bzDecompressEnd)
+c Fj(can)31 b(safely)f(b)s(e)g(called.)150 2665 y(If)38
+b(case)i(of)f(an)f(error)h(return)f(v)-5 b(alue,)42 b(y)m(ou)d(should)e
+(call)j Fi(BZ2_bzDecompressEnd)33 b Fj(to)40 b(clean)f(up)f(and)150
+2774 y(release)32 b(memory)-8 b(.)150 2931 y(P)m(ossible)32
+b(return)e(v)-5 b(alues:)572 3082 y Fi(BZ_PARAM_ERROR)663
+3186 y Fj(if)30 b Fi(strm)f Fj(is)i Fi(NULL)e Fj(or)i
+Fi(strm->s)d Fj(is)i Fi(NULL)663 3290 y Fj(or)g Fi(strm->avail_out)44
+b(<)j(1)572 3393 y(BZ_DATA_ERROR)663 3497 y Fj(if)30
+b(a)h(data)f(in)m(tegrit)m(y)j(error)e(is)f(detected)i(in)e(the)h
+(compressed)g(stream)572 3601 y Fi(BZ_DATA_ERROR_MAGIC)663
+3705 y Fj(if)f(the)h(compressed)f(stream)h(do)s(esn't)f(b)s(egin)g
+(with)h(the)f(righ)m(t)i(magic)f(b)m(ytes)572 3808 y
+Fi(BZ_MEM_ERROR)663 3912 y Fj(if)f(there)h(w)m(asn't)g(enough)f(memory)
+h(a)m(v)-5 b(ailable)572 4016 y Fi(BZ_STREAM_END)663
+4120 y Fj(if)30 b(the)h(logical)h(end)e(of)h(the)f(data)h(stream)g(w)m
+(as)f(detected)i(and)e(all)663 4224 y(output)g(in)g(has)g(b)s(een)g
+(consumed,)g(eg)h Fi(s->avail_out)44 b(>)k(0)572 4327
+y(BZ_OK)663 4431 y Fj(otherwise)150 4588 y(Allo)m(w)m(able)32
+b(next)f(actions:)572 4739 y Fi(BZ2_bzDecompress)663
+4843 y Fj(if)f Fi(BZ_OK)f Fj(w)m(as)h(returned)572 4946
+y Fi(BZ2_bzDecompressEnd)663 5050 y Fj(otherwise)p eop
+%%Page: 20 21
+20 20 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(20)150 299 y Fe(3.3.6)63
+b Fd(BZ2_bzDecompressEnd)390 486 y Fi(int)47 b(BZ2_bzDecompressEnd)42
+b(\()48 b(bz_stream)d(*strm)i(\);)150 643 y Fj(Releases)32
+b(all)f(memory)f(asso)s(ciated)i(with)e(a)h(decompression)f(stream.)150
+799 y(P)m(ossible)i(return)e(v)-5 b(alues:)572 950 y
+Fi(BZ_PARAM_ERROR)663 1054 y Fj(if)30 b Fi(strm)f Fj(is)i
+Fi(NULL)e Fj(or)i Fi(strm->s)d Fj(is)i Fi(NULL)572 1158
+y(BZ_OK)663 1262 y Fj(otherwise)150 1419 y(Allo)m(w)m(able)i(next)f
+(actions:)572 1570 y(None.)150 1857 y Fk(3.4)68 b(High-lev)l(el)47
+b(in)l(terface)150 2050 y Fj(This)35 b(in)m(terface)i(pro)m(vides)e
+(functions)g(for)g(reading)g(and)f(writing)i Fi(bzip2)d
+Fj(format)j(\014les.)55 b(First,)37 b(some)150 2159 y(general)31
+b(p)s(oin)m(ts.)225 2316 y Fh(\017)60 b Fj(All)35 b(of)g(the)h
+(functions)e(tak)m(e)j(an)d Fi(int*)g Fj(\014rst)h(argumen)m(t,)i
+Fi(bzerror)p Fj(.)52 b(After)36 b(eac)m(h)f(call,)j Fi(bzerror)330
+2426 y Fj(should)23 b(b)s(e)f(consulted)i(\014rst)f(to)i(determine)f
+(the)g(outcome)h(of)e(the)h(call.)40 b(If)23 b Fi(bzerror)e
+Fj(is)j Fi(BZ_OK)p Fj(,)g(the)330 2535 y(call)35 b(completed)g
+(successfully)-8 b(,)36 b(and)d(only)i(then)e(should)h(the)g(return)g
+(v)-5 b(alue)34 b(of)g(the)h(function)f(\(if)330 2645
+y(an)m(y\))27 b(b)s(e)e(consulted.)40 b(If)26 b Fi(bzerror)f
+Fj(is)h Fi(BZ_IO_ERROR)p Fj(,)e(there)j(w)m(as)g(an)e(error)i
+(reading/writing)h(the)330 2754 y(underlying)k(compressed)h(\014le,)h
+(and)e(y)m(ou)h(should)f(then)h(consult)g Fi(errno)p
+Fj(/)p Fi(perror)e Fj(to)i(determine)330 2864 y(the)k(cause)f(of)h(the)
+f(di\016cult)m(y)-8 b(.)60 b Fi(bzerror)34 b Fj(ma)m(y)j(also)g(b)s(e)e
+(set)i(to)g(v)-5 b(arious)37 b(other)g(v)-5 b(alues;)39
+b(precise)330 2974 y(details)31 b(are)g(giv)m(en)g(on)g(a)f(p)s
+(er-function)g(basis)g(b)s(elo)m(w.)225 3111 y Fh(\017)60
+b Fj(If)39 b Fi(bzerror)e Fj(indicates)i(an)g(error)g(\(ie,)k(an)m
+(ything)c(except)h Fi(BZ_OK)d Fj(and)i Fi(BZ_STREAM_END)p
+Fj(\),)f(y)m(ou)330 3220 y(should)56 b(immediately)i(call)g
+Fi(BZ2_bzReadClose)53 b Fj(\(or)58 b Fi(BZ2_bzWriteClose)p
+Fj(,)h(dep)s(ending)d(on)330 3330 y(whether)37 b(y)m(ou)h(are)f
+(attempting)i(to)f(read)f(or)h(to)g(write\))g(to)g(free)g(up)e(all)i
+(resources)g(asso)s(ciated)330 3439 y(with)44 b(the)g(stream.)83
+b(Once)44 b(an)g(error)h(has)e(b)s(een)h(indicated,)k(b)s(eha)m(viour)c
+(of)g(all)h(calls)g(except)330 3549 y Fi(BZ2_bzReadClose)h
+Fj(\()p Fi(BZ2_bzWriteClose)p Fj(\))h(is)j(unde\014ned.)99
+b(The)51 b(implication)g(is)g(that)g(\(1\))330 3659 y
+Fi(bzerror)42 b Fj(should)i(b)s(e)f(c)m(hec)m(k)m(ed)k(after)e(eac)m(h)
+g(call,)k(and)43 b(\(2\))j(if)e Fi(bzerror)e Fj(indicates)j(an)f
+(error,)330 3768 y Fi(BZ2_bzReadClose)26 b Fj(\()p Fi(BZ2_bzWriteClose)
+p Fj(\))h(should)i(then)h(b)s(e)g(called)i(to)f(clean)g(up.)225
+3905 y Fh(\017)60 b Fj(The)32 b Fi(FILE*)f Fj(argumen)m(ts)i(passed)f
+(to)h Fi(BZ2_bzReadOpen)p Fj(/)p Fi(BZ2_bzWriteO)o(pen)26
+b Fj(should)31 b(b)s(e)h(set)h(to)330 4015 y(binary)22
+b(mo)s(de.)38 b(Most)24 b(Unix)f(systems)g(will)g(do)g(this)g(b)m(y)g
+(default,)i(but)d(other)i(platforms,)g(including)330
+4124 y(Windo)m(ws)41 b(and)g(Mac,)46 b(will)c(not.)76
+b(If)41 b(y)m(ou)i(omit)f(this,)j(y)m(ou)e(ma)m(y)f(encoun)m(ter)h
+(problems)e(when)330 4234 y(mo)m(ving)31 b(co)s(de)g(to)g(new)f
+(platforms.)225 4371 y Fh(\017)60 b Fj(Memory)45 b(allo)s(cation)h
+(requests)f(are)g(handled)e(b)m(y)h Fi(malloc)p Fj(/)p
+Fi(free)p Fj(.)80 b(A)m(t)45 b(presen)m(t)g(there)g(is)f(no)330
+4481 y(facilit)m(y)39 b(for)f(user-de\014ned)e(memory)h(allo)s(cators)j
+(in)d(the)g(\014le)h(I/O)g(functions)f(\(could)g(easily)i(b)s(e)330
+4590 y(added,)30 b(though\).)150 4842 y Fe(3.4.1)63 b
+Fd(BZ2_bzReadOpen)533 5029 y Fi(typedef)46 b(void)h(BZFILE;)533
+5236 y(BZFILE)f(*BZ2_bzReadOpen)e(\()j(int)g(*bzerror,)f(FILE)g(*f,)
+1726 5340 y(int)h(small,)f(int)h(verbosity,)p eop
+%%Page: 21 22
+21 21 bop 150 -116 a Fl(Chapter)30 b(3:)h(Programming)e(with)g
+Fi(libbzip2)1891 b Fl(21)1726 299 y Fi(void)47 b(*unused,)f(int)g
+(nUnused)g(\);)150 456 y Fj(Prepare)27 b(to)g(read)f(compressed)h(data)
+g(from)f(\014le)g(handle)g Fi(f)p Fj(.)39 b Fi(f)26 b
+Fj(should)g(refer)g(to)i(a)e(\014le)h(whic)m(h)f(has)g(b)s(een)150
+565 y(op)s(ened)i(for)g(reading,)i(and)d(for)i(whic)m(h)f(the)h(error)g
+(indicator)h(\()p Fi(ferror\(f\))p Fj(\)is)c(not)j(set.)41
+b(If)29 b Fi(small)e Fj(is)h(1,)150 675 y(the)j(library)f(will)h(try)f
+(to)i(decompress)e(using)g(less)h(memory)-8 b(,)31 b(at)g(the)f(exp)s
+(ense)g(of)h(sp)s(eed.)150 832 y(F)-8 b(or)37 b(reasons)f(explained)h
+(b)s(elo)m(w,)h Fi(BZ2_bzRead)33 b Fj(will)k(decompress)f(the)h
+Fi(nUnused)d Fj(b)m(ytes)j(starting)g(at)150 941 y Fi(unused)p
+Fj(,)j(b)s(efore)f(starting)h(to)g(read)f(from)g(the)h(\014le)f
+Fi(f)p Fj(.)67 b(A)m(t)40 b(most)g Fi(BZ_MAX_UNUSED)35
+b Fj(b)m(ytes)40 b(ma)m(y)g(b)s(e)150 1051 y(supplied)34
+b(lik)m(e)i(this.)54 b(If)34 b(this)h(facilit)m(y)i(is)e(not)g
+(required,)h(y)m(ou)f(should)f(pass)g Fi(NULL)f Fj(and)h
+Fi(0)h Fj(for)g Fi(unused)150 1160 y Fj(and)30 b(n)p
+Fi(Unused)e Fj(resp)s(ectiv)m(ely)-8 b(.)150 1317 y(F)g(or)31
+b(the)g(meaning)f(of)h(parameters)g Fi(small)e Fj(and)g
+Fi(verbosity)p Fj(,)f(see)j Fi(BZ2_bzDecompressInit)p
+Fj(.)150 1474 y(The)i(amoun)m(t)g(of)f(memory)h(needed)g(to)g
+(decompress)g(a)g(\014le)g(cannot)g(b)s(e)f(determined)h(un)m(til)g
+(the)g(\014le's)150 1584 y(header)h(has)f(b)s(een)g(read.)51
+b(So)33 b(it)i(is)e(p)s(ossible)h(that)g Fi(BZ2_bzReadOpen)c
+Fj(returns)j Fi(BZ_OK)g Fj(but)g(a)h(subse-)150 1693
+y(quen)m(t)d(call)g(of)g Fi(BZ2_bzRead)c Fj(will)k(return)f
+Fi(BZ_MEM_ERROR)p Fj(.)150 1850 y(P)m(ossible)i(assignmen)m(ts)e(to)i
+Fi(bzerror)p Fj(:)572 2001 y Fi(BZ_CONFIG_ERROR)663 2105
+y Fj(if)e(the)h(library)f(has)g(b)s(een)g(mis-compiled)572
+2209 y Fi(BZ_PARAM_ERROR)663 2313 y Fj(if)g Fi(f)g Fj(is)h
+Fi(NULL)663 2416 y Fj(or)f Fi(small)f Fj(is)i(neither)g
+Fi(0)f Fj(nor)g Fi(1)663 2520 y Fj(or)g Fi(\(unused)46
+b(==)h(NULL)g(&&)g(nUnused)f(!=)h(0\))663 2624 y Fj(or)30
+b Fi(\(unused)46 b(!=)h(NULL)g(&&)g(!\(0)g(<=)g(nUnused)f(<=)h
+(BZ_MAX_UNUSED\)\))572 2728 y(BZ_IO_ERROR)663 2831 y
+Fj(if)30 b Fi(ferror\(f\))e Fj(is)i(nonzero)572 2935
+y Fi(BZ_MEM_ERROR)663 3039 y Fj(if)g(insu\016cien)m(t)h(memory)f(is)h
+(a)m(v)-5 b(ailable)572 3143 y Fi(BZ_OK)663 3247 y Fj(otherwise.)150
+3403 y(P)m(ossible)32 b(return)e(v)-5 b(alues:)572 3554
+y(P)m(oin)m(ter)32 b(to)f(an)f(abstract)i Fi(BZFILE)663
+3658 y Fj(if)e Fi(bzerror)e Fj(is)j Fi(BZ_OK)572 3762
+y(NULL)663 3866 y Fj(otherwise)150 4023 y(Allo)m(w)m(able)h(next)f
+(actions:)572 4174 y Fi(BZ2_bzRead)663 4277 y Fj(if)f
+Fi(bzerror)e Fj(is)j Fi(BZ_OK)572 4381 y(BZ2_bzClose)663
+4485 y Fj(otherwise)150 4887 y Fe(3.4.2)63 b Fd(BZ2_bzRead)533
+5074 y Fi(int)47 b(BZ2_bzRead)e(\()j(int)e(*bzerror,)g(BZFILE)g(*b,)h
+(void)f(*buf,)h(int)g(len)g(\);)150 5230 y Fj(Reads)33
+b(up)e(to)j Fi(len)d Fj(\(uncompressed\))i(b)m(ytes)g(from)f(the)h
+(compressed)g(\014le)g Fi(b)f Fj(in)m(to)i(the)f(bu\013er)f
+Fi(buf)p Fj(.)46 b(If)150 5340 y(the)28 b(read)f(w)m(as)h(successful,)g
+Fi(bzerror)d Fj(is)j(set)g(to)g Fi(BZ_OK)f Fj(and)f(the)i(n)m(um)m(b)s
+(er)e(of)i(b)m(ytes)g(read)g(is)f(returned.)p eop
+%%Page: 22 23
+22 22 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(22)150 299 y Fj(If)32
+b(the)g(logical)i(end-of-stream)e(w)m(as)g(detected,)i
+Fi(bzerror)c Fj(will)i(b)s(e)g(set)g(to)h Fi(BZ_STREAM_END)p
+Fj(,)c(and)i(the)150 408 y(n)m(um)m(b)s(er)e(of)i(b)m(ytes)g(read)f(is)
+h(returned.)40 b(All)30 b(other)h Fi(bzerror)e Fj(v)-5
+b(alues)30 b(denote)h(an)f(error.)150 565 y Fi(BZ2_bzRead)k
+Fj(will)k(supply)e Fi(len)g Fj(b)m(ytes,)k(unless)d(the)g(logical)j
+(stream)d(end)g(is)g(detected)i(or)f(an)e(error)150 675
+y(o)s(ccurs.)70 b(Because)40 b(of)g(this,)j(it)e(is)f(p)s(ossible)f(to)
+i(detect)h(the)e(stream)h(end)e(b)m(y)h(observing)h(when)e(the)150
+784 y(n)m(um)m(b)s(er)24 b(of)h(b)m(ytes)h(returned)e(is)h(less)h(than)
+e(the)i(n)m(um)m(b)s(er)e(requested.)39 b(Nev)m(ertheless,)29
+b(this)c(is)g(regarded)150 894 y(as)37 b(inadvisable;)i(y)m(ou)e
+(should)f(instead)h(c)m(hec)m(k)h Fi(bzerror)c Fj(after)k(ev)m(ery)f
+(call)h(and)e(w)m(atc)m(h)h(out)g(for)g Fi(BZ_)150 1004
+y(STREAM_END)p Fj(.)150 1160 y(In)m(ternally)-8 b(,)47
+b Fi(BZ2_bzRead)39 b Fj(copies)k(data)f(from)g(the)g(compressed)g
+(\014le)g(in)g(c)m(h)m(unks)g(of)g(size)h Fi(BZ_MAX_)150
+1270 y(UNUSED)28 b Fj(b)m(ytes)j(b)s(efore)e(decompressing)h(it.)41
+b(If)30 b(the)g(\014le)g(con)m(tains)h(more)f(b)m(ytes)h(than)e
+(strictly)i(needed)150 1380 y(to)46 b(reac)m(h)g(the)f(logical)i
+(end-of-stream,)j Fi(BZ2_bzRead)42 b Fj(will)j(almost)h(certainly)g
+(read)f(some)g(of)h(the)150 1489 y(trailing)f(data)g(b)s(efore)f
+(signalling)h Fi(BZ_SEQUENCE_END)p Fj(.)78 b(T)-8 b(o)45
+b(collect)i(the)d(read)g(but)g(un)m(used)f(data)150 1599
+y(once)27 b Fi(BZ_SEQUENCE_END)22 b Fj(has)k(app)s(eared,)g(call)h
+Fi(BZ2_bzReadGetUnused)21 b Fj(immediately)28 b(b)s(efore)e
+Fi(BZ2_)150 1708 y(bzReadClose)p Fj(.)150 1865 y(P)m(ossible)32
+b(assignmen)m(ts)e(to)i Fi(bzerror)p Fj(:)572 2016 y
+Fi(BZ_PARAM_ERROR)663 2120 y Fj(if)e Fi(b)g Fj(is)h Fi(NULL)e
+Fj(or)h Fi(buf)g Fj(is)g Fi(NULL)f Fj(or)i Fi(len)47
+b(<)g(0)572 2224 y(BZ_SEQUENCE_ERROR)663 2328 y Fj(if)30
+b Fi(b)g Fj(w)m(as)h(op)s(ened)e(with)h Fi(BZ2_bzWriteOpen)572
+2431 y(BZ_IO_ERROR)663 2535 y Fj(if)g(there)h(is)f(an)g(error)h
+(reading)g(from)f(the)h(compressed)f(\014le)572 2639
+y Fi(BZ_UNEXPECTED_EOF)663 2743 y Fj(if)g(the)h(compressed)f(\014le)h
+(ended)e(b)s(efore)i(the)f(logical)j(end-of-stream)e(w)m(as)g(detected)
+572 2847 y Fi(BZ_DATA_ERROR)663 2950 y Fj(if)f(a)h(data)f(in)m(tegrit)m
+(y)j(error)e(w)m(as)g(detected)g(in)g(the)f(compressed)h(stream)572
+3054 y Fi(BZ_DATA_ERROR_MAGIC)663 3158 y Fj(if)f(the)h(stream)g(do)s
+(es)f(not)g(b)s(egin)g(with)h(the)f(requisite)i(header)e(b)m(ytes)h
+(\(ie,)h(is)e(not)663 3262 y(a)g Fi(bzip2)f Fj(data)i(\014le\).)61
+b(This)30 b(is)h(really)g(a)f(sp)s(ecial)h(case)g(of)g
+Fi(BZ_DATA_ERROR)p Fj(.)572 3365 y Fi(BZ_MEM_ERROR)663
+3469 y Fj(if)f(insu\016cien)m(t)h(memory)f(w)m(as)h(a)m(v)-5
+b(ailable)572 3573 y Fi(BZ_STREAM_END)663 3677 y Fj(if)30
+b(the)h(logical)h(end)e(of)h(stream)g(w)m(as)f(detected.)572
+3781 y Fi(BZ_OK)663 3884 y Fj(otherwise.)150 4041 y(P)m(ossible)i
+(return)e(v)-5 b(alues:)572 4192 y(n)m(um)m(b)s(er)29
+b(of)i(b)m(ytes)g(read)663 4296 y(if)f Fi(bzerror)e Fj(is)j
+Fi(BZ_OK)e Fj(or)h Fi(BZ_STREAM_END)572 4400 y Fj(unde\014ned)663
+4503 y(otherwise)150 4660 y(Allo)m(w)m(able)i(next)f(actions:)572
+4811 y(collect)i(data)d(from)h Fi(buf)p Fj(,)e(then)i
+Fi(BZ2_bzRead)c Fj(or)k Fi(BZ2_bzReadClose)663 4915 y
+Fj(if)f Fi(bzerror)e Fj(is)j Fi(BZ_OK)572 5019 y Fj(collect)i(data)d
+(from)h Fi(buf)p Fj(,)e(then)i Fi(BZ2_bzReadClose)26
+b Fj(or)k Fi(BZ2_bzReadGetUnused)663 5123 y Fj(if)g Fi(bzerror)e
+Fj(is)j Fi(BZ_SEQUENCE_END)572 5226 y(BZ2_bzReadClose)663
+5330 y Fj(otherwise)p eop
+%%Page: 23 24
+23 23 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(23)150 299 y Fe(3.4.3)63
+b Fd(BZ2_bzReadGetUnused)533 486 y Fi(void)47 b(BZ2_bzReadGetUnused)42
+b(\()48 b(int*)e(bzerror,)g(BZFILE)g(*b,)1822 589 y(void**)g(unused,)g
+(int*)g(nUnused)g(\);)150 746 y Fj(Returns)35 b(data)g(whic)m(h)f(w)m
+(as)i(read)e(from)h(the)g(compressed)g(\014le)g(but)g(w)m(as)g(not)g
+(needed)g(to)h(get)g(to)g(the)150 856 y(logical)44 b(end-of-stream.)76
+b Fi(*unused)39 b Fj(is)j(set)h(to)f(the)g(address)f(of)h(the)g(data,)k
+(and)40 b Fi(*nUnused)g Fj(to)j(the)150 965 y(n)m(um)m(b)s(er)28
+b(of)h(b)m(ytes.)41 b Fi(*nUnused)27 b Fj(will)i(b)s(e)g(set)g(to)h(a)f
+(v)-5 b(alue)30 b(b)s(et)m(w)m(een)g Fi(0)e Fj(and)g
+Fi(BZ_MAX_UNUSED)e Fj(inclusiv)m(e.)150 1122 y(This)f(function)g(ma)m
+(y)h(only)f(b)s(e)g(called)h(once)g Fi(BZ2_bzRead)d Fj(has)i(signalled)
+h Fi(BZ_STREAM_END)21 b Fj(but)k(b)s(efore)150 1232 y
+Fi(BZ2_bzReadClose)p Fj(.)150 1389 y(P)m(ossible)32 b(assignmen)m(ts)e
+(to)i Fi(bzerror)p Fj(:)572 1540 y Fi(BZ_PARAM_ERROR)663
+1644 y Fj(if)e Fi(b)g Fj(is)h Fi(NULL)663 1747 y Fj(or)f
+Fi(unused)f Fj(is)h Fi(NULL)g Fj(or)g Fi(nUnused)f Fj(is)h
+Fi(NULL)572 1851 y(BZ_SEQUENCE_ERROR)663 1955 y Fj(if)g
+Fi(BZ_STREAM_END)d Fj(has)j(not)g(b)s(een)g(signalled)663
+2059 y(or)g(if)h Fi(b)f Fj(w)m(as)g(op)s(ened)g(with)g
+Fi(BZ2_bzWriteOpen)542 2162 y(BZ_OK)663 2266 y Fj(otherwise)150
+2423 y(Allo)m(w)m(able)i(next)f(actions:)572 2574 y Fi(BZ2_bzReadClose)
+150 2882 y Fe(3.4.4)63 b Fd(BZ2_bzReadClose)533 3068
+y Fi(void)47 b(BZ2_bzReadClose)c(\()48 b(int)f(*bzerror,)e(BZFILE)h(*b)
+h(\);)150 3225 y Fj(Releases)35 b(all)e(memory)h(p)s(ertaining)f(to)h
+(the)f(compressed)h(\014le)f Fi(b)p Fj(.)49 b Fi(BZ2_bzReadClose)29
+b Fj(do)s(es)j(not)i(call)150 3335 y Fi(fclose)d Fj(on)h(the)g
+(underlying)g(\014le)g(handle,)h(so)f(y)m(ou)h(should)e(do)h(that)h(y)m
+(ourself)g(if)f(appropriate.)47 b Fi(BZ2_)150 3445 y(bzReadClose)27
+b Fj(should)j(b)s(e)f(called)j(to)f(clean)g(up)e(after)i(all)g(error)g
+(situations.)150 3601 y(P)m(ossible)h(assignmen)m(ts)e(to)i
+Fi(bzerror)p Fj(:)572 3752 y Fi(BZ_SEQUENCE_ERROR)663
+3856 y Fj(if)e Fi(b)g Fj(w)m(as)h(op)s(ened)e(with)h
+Fi(BZ2_bzOpenWrite)572 3960 y(BZ_OK)663 4064 y Fj(otherwise)150
+4221 y(Allo)m(w)m(able)i(next)f(actions:)572 4372 y(none)150
+4679 y Fe(3.4.5)63 b Fd(BZ2_bzWriteOpen)533 4866 y Fi(BZFILE)46
+b(*BZ2_bzWriteOpen)e(\()j(int)g(*bzerror,)e(FILE)i(*f,)1774
+4970 y(int)g(blockSize100k,)d(int)j(verbosity,)1774 5074
+y(int)g(workFactor)e(\);)150 5230 y Fj(Prepare)31 b(to)h(write)g
+(compressed)f(data)g(to)h(\014le)f(handle)f Fi(f)p Fj(.)42
+b Fi(f)30 b Fj(should)g(refer)i(to)f(a)h(\014le)f(whic)m(h)f(has)h(b)s
+(een)150 5340 y(op)s(ened)f(for)g(writing,)h(and)f(for)g(whic)m(h)g
+(the)h(error)g(indicator)g(\()p Fi(ferror\(f\))p Fj(\)is)e(not)h(set.)p
+eop
+%%Page: 24 25
+24 24 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(24)150 299 y Fj(F)-8 b(or)31
+b(the)g(meaning)f(of)h(parameters)g Fi(blockSize100k)p
+Fj(,)c Fi(verbosity)h Fj(and)h Fi(workFactor)p Fj(,)f(see)150
+408 y Fi(BZ2_bzCompressInit)p Fj(.)150 565 y(All)38 b(required)g
+(memory)g(is)g(allo)s(cated)i(at)e(this)h(stage,)i(so)d(if)g(the)h
+(call)g(completes)g(successfully)-8 b(,)41 b Fi(BZ_)150
+675 y(MEM_ERROR)28 b Fj(cannot)j(b)s(e)e(signalled)i(b)m(y)g(a)f
+(subsequen)m(t)g(call)h(to)h Fi(BZ2_bzWrite)p Fj(.)150
+832 y(P)m(ossible)g(assignmen)m(ts)e(to)i Fi(bzerror)p
+Fj(:)572 983 y Fi(BZ_CONFIG_ERROR)663 1087 y Fj(if)e(the)h(library)f
+(has)g(b)s(een)g(mis-compiled)572 1190 y Fi(BZ_PARAM_ERROR)663
+1294 y Fj(if)g Fi(f)g Fj(is)h Fi(NULL)663 1398 y Fj(or)f
+Fi(blockSize100k)45 b(<)i(1)30 b Fj(or)h Fi(blockSize100k)44
+b(>)j(9)572 1502 y(BZ_IO_ERROR)663 1605 y Fj(if)30 b
+Fi(ferror\(f\))e Fj(is)i(nonzero)572 1709 y Fi(BZ_MEM_ERROR)663
+1813 y Fj(if)g(insu\016cien)m(t)h(memory)f(is)h(a)m(v)-5
+b(ailable)572 1917 y Fi(BZ_OK)663 2021 y Fj(otherwise)150
+2177 y(P)m(ossible)32 b(return)e(v)-5 b(alues:)572 2328
+y(P)m(oin)m(ter)32 b(to)f(an)f(abstract)i Fi(BZFILE)663
+2432 y Fj(if)e Fi(bzerror)e Fj(is)j Fi(BZ_OK)572 2536
+y(NULL)663 2640 y Fj(otherwise)150 2797 y(Allo)m(w)m(able)h(next)f
+(actions:)572 2948 y Fi(BZ2_bzWrite)663 3051 y Fj(if)f
+Fi(bzerror)e Fj(is)j Fi(BZ_OK)597 3155 y Fj(\(y)m(ou)24
+b(could)f(go)h(directly)g(to)g Fi(BZ2_bzWriteClose)p
+Fj(,)19 b(but)j(this)h(w)m(ould)g(b)s(e)g(prett)m(y)h(p)s(oin)m
+(tless\))572 3259 y Fi(BZ2_bzWriteClose)663 3363 y Fj(otherwise)150
+3852 y Fe(3.4.6)63 b Fd(BZ2_bzWrite)533 4039 y Fi(void)47
+b(BZ2_bzWrite)e(\()i(int)g(*bzerror,)e(BZFILE)h(*b,)h(void)g(*buf,)f
+(int)h(len)g(\);)150 4196 y Fj(Absorbs)35 b Fi(len)h
+Fj(b)m(ytes)h(from)f(the)h(bu\013er)f Fi(buf)p Fj(,)h(ev)m(en)m(tually)
+i(to)e(b)s(e)f(compressed)g(and)g(written)h(to)h(the)150
+4306 y(\014le.)150 4463 y(P)m(ossible)32 b(assignmen)m(ts)e(to)i
+Fi(bzerror)p Fj(:)572 4614 y Fi(BZ_PARAM_ERROR)663 4717
+y Fj(if)e Fi(b)g Fj(is)h Fi(NULL)e Fj(or)h Fi(buf)g Fj(is)g
+Fi(NULL)f Fj(or)i Fi(len)47 b(<)g(0)572 4821 y(BZ_SEQUENCE_ERROR)663
+4925 y Fj(if)30 b(b)g(w)m(as)g(op)s(ened)g(with)g Fi(BZ2_bzReadOpen)572
+5029 y(BZ_IO_ERROR)663 5132 y Fj(if)g(there)h(is)f(an)g(error)h
+(writing)g(the)g(compressed)f(\014le.)572 5236 y Fi(BZ_OK)663
+5340 y Fj(otherwise)p eop
+%%Page: 25 26
+25 25 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(25)150 299 y Fe(3.4.7)63
+b Fd(BZ2_bzWriteClose)533 486 y Fi(void)47 b(BZ2_bzWriteClose)c(\()48
+b(int)f(*bzerror,)e(BZFILE*)h(f,)1679 589 y(int)h(abandon,)1679
+693 y(unsigned)e(int*)i(nbytes_in,)1679 797 y(unsigned)e(int*)i
+(nbytes_out)e(\);)533 1005 y(void)i(BZ2_bzWriteClose64)c(\()k(int)g
+(*bzerror,)e(BZFILE*)h(f,)1774 1108 y(int)h(abandon,)1774
+1212 y(unsigned)f(int*)g(nbytes_in_lo32,)1774 1316 y(unsigned)g(int*)g
+(nbytes_in_hi32,)1774 1420 y(unsigned)g(int*)g(nbytes_out_lo32,)1774
+1523 y(unsigned)g(int*)g(nbytes_out_hi32)e(\);)150 1680
+y Fj(Compresses)38 b(and)f(\015ushes)g(to)i(the)g(compressed)f(\014le)h
+(all)f(data)h(so)g(far)f(supplied)f(b)m(y)h Fi(BZ2_bzWrite)p
+Fj(.)150 1790 y(The)h(logical)i(end-of-stream)e(mark)m(ers)h(are)f
+(also)g(written,)j(so)d(subsequen)m(t)g(calls)g(to)h
+Fi(BZ2_bzWrite)150 1899 y Fj(are)31 b(illegal.)45 b(All)31
+b(memory)g(asso)s(ciated)h(with)f(the)g(compressed)g(\014le)h
+Fi(b)e Fj(is)h(released.)44 b Fi(fflush)29 b Fj(is)i(called)150
+2009 y(on)f(the)h(compressed)f(\014le,)h(but)f(it)h(is)f(not)h
+Fi(fclose)p Fj('d.)150 2166 y(If)g Fi(BZ2_bzWriteClose)d
+Fj(is)j(called)i(to)f(clean)g(up)f(after)h(an)f(error,)i(the)f(only)g
+(action)h(is)e(to)i(release)g(the)150 2275 y(memory)-8
+b(.)40 b(The)28 b(library)g(records)g(the)g(error)g(co)s(des)g(issued)f
+(b)m(y)g(previous)h(calls,)h(so)f(this)g(situation)h(will)150
+2385 y(b)s(e)37 b(detected)i(automatically)-8 b(.)64
+b(There)38 b(is)f(no)h(attempt)g(to)h(complete)g(the)e(compression)h
+(op)s(eration,)150 2495 y(nor)f(to)h Fi(fflush)e Fj(the)h(compressed)g
+(\014le.)62 b(Y)-8 b(ou)37 b(can)g(force)h(this)g(b)s(eha)m(viour)e(to)
+i(happ)s(en)e(ev)m(en)i(in)f(the)150 2604 y(case)31 b(of)g(no)f(error,)
+h(b)m(y)f(passing)g(a)h(nonzero)g(v)-5 b(alue)30 b(to)i
+Fi(abandon)p Fj(.)150 2761 y(If)h Fi(nbytes_in)d Fj(is)j(non-n)m(ull,)g
+Fi(*nbytes_in)d Fj(will)j(b)s(e)f(set)i(to)f(b)s(e)g(the)g(total)h(v)m
+(olume)g(of)f(uncompressed)150 2871 y(data)k(handled.)58
+b(Similarly)-8 b(,)38 b Fi(nbytes_out)c Fj(will)j(b)s(e)f(set)h(to)g
+(the)g(total)h(v)m(olume)g(of)e(compressed)h(data)150
+2980 y(written.)i(F)-8 b(or)24 b(compatibilit)m(y)i(with)d(older)h(v)m
+(ersions)g(of)g(the)g(library)-8 b(,)25 b Fi(BZ2_bzWriteClose)19
+b Fj(only)24 b(yields)150 3090 y(the)39 b(lo)m(w)m(er)i(32)e(bits)g(of)
+g(these)g(coun)m(ts.)67 b(Use)39 b Fi(BZ2_bzWriteClose64)34
+b Fj(if)39 b(y)m(ou)g(w)m(an)m(t)g(the)h(full)e(64)i(bit)150
+3199 y(coun)m(ts.)h(These)31 b(t)m(w)m(o)h(functions)e(are)h(otherwise)
+g(absolutely)g(iden)m(tical.)150 3356 y(P)m(ossible)h(assignmen)m(ts)e
+(to)i Fi(bzerror)p Fj(:)572 3507 y Fi(BZ_SEQUENCE_ERROR)663
+3611 y Fj(if)e Fi(b)g Fj(w)m(as)h(op)s(ened)e(with)h
+Fi(BZ2_bzReadOpen)572 3715 y(BZ_IO_ERROR)663 3819 y Fj(if)g(there)h(is)
+f(an)g(error)h(writing)g(the)g(compressed)f(\014le)572
+3922 y Fi(BZ_OK)663 4026 y Fj(otherwise)150 4296 y Fe(3.4.8)63
+b(Handling)41 b(em)m(b)s(edded)g(compressed)h(data)e(streams)150
+4489 y Fj(The)i(high-lev)m(el)h(library)e(facilitates)k(use)c(of)h
+Fi(bzip2)e Fj(data)i(streams)g(whic)m(h)f(form)g(some)h(part)g(of)g(a)
+150 4598 y(surrounding,)29 b(larger)i(data)g(stream.)225
+4755 y Fh(\017)60 b Fj(F)-8 b(or)49 b(writing,)k(the)c(library)f(tak)m
+(es)i(an)e(op)s(en)f(\014le)i(handle,)j(writes)d(compressed)f(data)h
+(to)g(it,)330 4865 y Fi(fflush)p Fj(es)37 b(it)h(but)f(do)s(es)h(not)g
+Fi(fclose)f Fj(it.)64 b(The)38 b(calling)h(application)g(can)f(write)g
+(its)h(o)m(wn)f(data)330 4974 y(b)s(efore)30 b(and)g(after)h(the)g
+(compressed)f(data)h(stream,)g(using)f(that)h(same)f(\014le)h(handle.)
+225 5121 y Fh(\017)60 b Fj(Reading)33 b(is)g(more)g(complex,)h(and)e
+(the)h(facilities)i(are)e(not)g(as)g(general)h(as)f(they)g(could)f(b)s
+(e)h(since)330 5230 y(generalit)m(y)e(is)d(hard)g(to)h(reconcile)i
+(with)d(e\016ciency)-8 b(.)42 b Fi(BZ2_bzRead)25 b Fj(reads)k(from)f
+(the)h(compressed)330 5340 y(\014le)39 b(in)g(blo)s(c)m(ks)g(of)h(size)
+f Fi(BZ_MAX_UNUSED)d Fj(b)m(ytes,)42 b(and)c(in)h(doing)g(so)g
+(probably)g(will)g(o)m(v)m(ersho)s(ot)p eop
+%%Page: 26 27
+26 26 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(26)330 299 y Fj(the)37
+b(logical)i(end)e(of)g(compressed)g(stream.)60 b(T)-8
+b(o)38 b(reco)m(v)m(er)i(this)c(data)i(once)f(decompression)g(has)330
+408 y(ended,)27 b(call)h Fi(BZ2_bzReadGetUnused)21 b
+Fj(after)27 b(the)g(last)h(call)f(of)g Fi(BZ2_bzRead)d
+Fj(\(the)j(one)g(returning)330 518 y Fi(BZ_STREAM_END)p
+Fj(\))g(but)j(b)s(efore)g(calling)i Fi(BZ2_bzReadClose)p
+Fj(.)150 702 y(This)j(mec)m(hanism)h(mak)m(es)g(it)h(easy)f(to)g
+(decompress)g(m)m(ultiple)g Fi(bzip2)e Fj(streams)i(placed)g
+(end-to-end.)150 812 y(As)67 b(the)h(end)g(of)f(one)i(stream,)77
+b(when)67 b Fi(BZ2_bzRead)e Fj(returns)j Fi(BZ_STREAM_END)p
+Fj(,)73 b(call)c Fi(BZ2_)150 921 y(bzReadGetUnused)34
+b Fj(to)40 b(collect)h(the)e(un)m(used)e(data)i(\(cop)m(y)g(it)g(in)m
+(to)h(y)m(our)f(o)m(wn)f(bu\013er)g(somewhere\).)150
+1031 y(That)52 b(data)h(forms)f(the)g(start)h(of)f(the)h(next)f
+(compressed)g(stream.)107 b(T)-8 b(o)53 b(start)g(uncompressing)150
+1140 y(that)61 b(next)f(stream,)68 b(call)62 b Fi(BZ2_bzReadOpen)56
+b Fj(again,)68 b(feeding)61 b(in)e(the)i(un)m(used)e(data)h(via)h(the)
+150 1250 y Fi(unused)p Fj(/)p Fi(nUnused)28 b Fj(parameters.)45
+b(Keep)32 b(doing)f(this)h(un)m(til)g Fi(BZ_STREAM_END)c
+Fj(return)j(coincides)h(with)150 1360 y(the)j(ph)m(ysical)g(end)f(of)h
+(\014le)f(\()p Fi(feof\(f\))p Fj(\).)52 b(In)34 b(this)h(situation)g
+Fi(BZ2_bzReadGetUnused)30 b Fj(will)35 b(of)f(course)150
+1469 y(return)c(no)g(data.)150 1626 y(This)24 b(should)g(giv)m(e)i
+(some)f(feel)h(for)f(ho)m(w)g(the)g(high-lev)m(el)h(in)m(terface)h(can)
+d(b)s(e)g(used.)38 b(If)25 b(y)m(ou)g(require)g(extra)150
+1736 y(\015exibilit)m(y)-8 b(,)32 b(y)m(ou'll)g(ha)m(v)m(e)f(to)g(bite)
+g(the)g(bullet)g(and)e(get)j(to)f(grips)f(with)h(the)f(lo)m(w-lev)m(el)
+k(in)m(terface.)150 1987 y Fe(3.4.9)63 b(Standard)40
+b(\014le-reading/writing)j(co)s(de)150 2179 y Fj(Here's)31
+b(ho)m(w)g(y)m(ou'd)f(write)h(data)g(to)g(a)g(compressed)f(\014le:)390
+2538 y Fi(FILE*)142 b(f;)390 2642 y(BZFILE*)46 b(b;)390
+2746 y(int)238 b(nBuf;)390 2849 y(char)190 b(buf[)46
+b(/*)i(whatever)d(size)i(you)g(like)f(*/)i(];)390 2953
+y(int)238 b(bzerror;)390 3057 y(int)g(nWritten;)390 3264
+y(f)47 b(=)h(fopen)e(\()i("myfile.bz2",)c("w")j(\);)390
+3368 y(if)g(\(!f\))g({)533 3472 y(/*)g(handle)f(error)h(*/)390
+3576 y(})390 3680 y(b)g(=)h(BZ2_bzWriteOpen)c(\()j(&bzerror,)e(f,)i(9)h
+(\);)390 3783 y(if)f(\(bzerror)f(!=)h(BZ_OK\))f({)533
+3887 y(BZ2_bzWriteClose)e(\()j(b)g(\);)533 3991 y(/*)g(handle)f(error)h
+(*/)390 4095 y(})390 4302 y(while)f(\()i(/*)f(condition)e(*/)i(\))h({)
+533 4406 y(/*)f(get)g(data)g(to)g(write)f(into)h(buf,)g(and)g(set)g
+(nBuf)f(appropriately)e(*/)533 4510 y(nWritten)i(=)h(BZ2_bzWrite)e(\()i
+(&bzerror,)f(b,)h(buf,)f(nBuf)h(\);)533 4614 y(if)g(\(bzerror)f(==)h
+(BZ_IO_ERROR\))e({)676 4717 y(BZ2_bzWriteClose)f(\()j(&bzerror,)e(b)j
+(\);)676 4821 y(/*)g(handle)e(error)g(*/)533 4925 y(})390
+5029 y(})390 5236 y(BZ2_bzWriteClose)d(\()48 b(&bzerror,)d(b)j(\);)390
+5340 y(if)f(\(bzerror)f(==)h(BZ_IO_ERROR\))d({)p eop
+%%Page: 27 28
+27 27 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(27)533 299 y Fi(/*)47
+b(handle)f(error)h(*/)390 403 y(})150 559 y Fj(And)29
+b(to)i(read)g(from)f(a)g(compressed)h(\014le:)390 711
+y Fi(FILE*)142 b(f;)390 814 y(BZFILE*)46 b(b;)390 918
+y(int)238 b(nBuf;)390 1022 y(char)190 b(buf[)46 b(/*)i(whatever)d(size)
+i(you)g(like)f(*/)i(];)390 1126 y(int)238 b(bzerror;)390
+1229 y(int)g(nWritten;)390 1437 y(f)47 b(=)h(fopen)e(\()i
+("myfile.bz2",)c("r")j(\);)390 1541 y(if)g(\(!f\))g({)533
+1645 y(/*)g(handle)f(error)h(*/)390 1748 y(})390 1852
+y(b)g(=)h(BZ2_bzReadOpen)c(\()j(&bzerror,)f(f,)h(0,)g(NULL,)f(0)i(\);)
+390 1956 y(if)f(\(bzerror)f(!=)h(BZ_OK\))f({)533 2060
+y(BZ2_bzReadClose)e(\()j(&bzerror,)f(b)h(\);)533 2163
+y(/*)g(handle)f(error)h(*/)390 2267 y(})390 2475 y(bzerror)f(=)h
+(BZ_OK;)390 2579 y(while)f(\(bzerror)g(==)h(BZ_OK)f(&&)i(/*)f
+(arbitrary)e(other)h(conditions)f(*/\))i({)533 2682 y(nBuf)g(=)g
+(BZ2_bzRead)e(\()j(&bzerror,)d(b,)i(buf,)g(/*)g(size)g(of)g(buf)g(*/)g
+(\);)533 2786 y(if)g(\(bzerror)f(==)h(BZ_OK\))f({)676
+2890 y(/*)i(do)f(something)e(with)i(buf[0)f(..)h(nBuf-1])f(*/)533
+2994 y(})390 3097 y(})390 3201 y(if)h(\(bzerror)f(!=)h(BZ_STREAM_END\))
+d({)533 3305 y(BZ2_bzReadClose)g(\()j(&bzerror,)f(b)h(\);)533
+3409 y(/*)g(handle)f(error)h(*/)390 3513 y(})g(else)g({)533
+3616 y(BZ2_bzReadClose)d(\()j(&bzerror)f(\);)390 3720
+y(})150 3991 y Fk(3.5)68 b(Utilit)l(y)47 b(functions)150
+4264 y Fe(3.5.1)63 b Fd(BZ2_bzBuffToBuffCompress)533
+4451 y Fi(int)47 b(BZ2_bzBuffToBuffCompress\()41 b(char*)428
+b(dest,)1965 4555 y(unsigned)46 b(int*)g(destLen,)1965
+4658 y(char*)428 b(source,)1965 4762 y(unsigned)46 b(int)94
+b(sourceLen,)1965 4866 y(int)524 b(blockSize100k,)1965
+4970 y(int)g(verbosity,)1965 5074 y(int)g(workFactor)45
+b(\);)150 5230 y Fj(A)m(ttempts)32 b(to)f(compress)f(the)h(data)g(in)f
+Fi(source[0)e(..)i(sourceLen-1])d Fj(in)m(to)k(the)g(destination)g
+(bu\013er,)150 5340 y Fi(dest[0)e(..)g(*destLen-1])p
+Fj(.)36 b(If)25 b(the)g(destination)h(bu\013er)e(is)h(big)f(enough,)i
+Fi(*destLen)d Fj(is)i(set)g(to)h(the)f(size)p eop
+%%Page: 28 29
+28 28 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(28)150 299 y Fj(of)27
+b(the)f(compressed)h(data,)h(and)d Fi(BZ_OK)g Fj(is)i(returned.)38
+b(If)27 b(the)f(compressed)h(data)g(w)m(on't)g(\014t,)g
+Fi(*destLen)150 408 y Fj(is)j(unc)m(hanged,)g(and)g Fi(BZ_OUTBUFF_FULL)
+c Fj(is)31 b(returned.)150 565 y(Compression)22 b(in)h(this)f(manner)g
+(is)h(a)f(one-shot)i(ev)m(en)m(t,)i(done)d(with)f(a)h(single)g(call)h
+(to)f(this)g(function.)38 b(The)150 675 y(resulting)26
+b(compressed)g(data)f(is)h(a)g(complete)h Fi(bzip2)d
+Fj(format)i(data)g(stream.)39 b(There)26 b(is)f(no)h(mec)m(hanism)150
+784 y(for)d(making)g(additional)h(calls)f(to)h(pro)m(vide)g(extra)f
+(input)g(data.)38 b(If)23 b(y)m(ou)g(w)m(an)m(t)h(that)f(kind)f(of)i
+(mec)m(hanism,)150 894 y(use)30 b(the)h(lo)m(w-lev)m(el)i(in)m
+(terface.)150 1051 y(F)-8 b(or)31 b(the)g(meaning)f(of)h(parameters)g
+Fi(blockSize100k)p Fj(,)c Fi(verbosity)h Fj(and)h Fi(workFactor)p
+Fj(,)150 1160 y(see)i Fi(BZ2_bzCompressInit)p Fj(.)150
+1317 y(T)-8 b(o)37 b(guaran)m(tee)h(that)f(the)f(compressed)h(data)f
+(will)h(\014t)f(in)g(its)h(bu\013er,)g(allo)s(cate)h(an)e(output)g
+(bu\013er)g(of)150 1427 y(size)31 b(1\045)g(larger)g(than)f(the)h
+(uncompressed)e(data,)i(plus)f(six)g(h)m(undred)f(extra)i(b)m(ytes.)150
+1584 y Fi(BZ2_bzBuffToBuffDecompre)o(ss)24 b Fj(will)31
+b(not)g(write)g(data)f(at)h(or)g(b)s(ey)m(ond)e Fi(dest[*destLen])p
+Fj(,)e(ev)m(en)k(in)150 1693 y(case)g(of)g(bu\013er)e(o)m(v)m(er\015o)m
+(w.)150 1850 y(P)m(ossible)j(return)e(v)-5 b(alues:)572
+2001 y Fi(BZ_CONFIG_ERROR)663 2105 y Fj(if)30 b(the)h(library)f(has)g
+(b)s(een)g(mis-compiled)572 2209 y Fi(BZ_PARAM_ERROR)663
+2313 y Fj(if)g Fi(dest)f Fj(is)i Fi(NULL)e Fj(or)i Fi(destLen)d
+Fj(is)i Fi(NULL)663 2416 y Fj(or)g Fi(blockSize100k)45
+b(<)i(1)30 b Fj(or)h Fi(blockSize100k)44 b(>)j(9)663
+2520 y Fj(or)30 b Fi(verbosity)46 b(<)h(0)30 b Fj(or)h
+Fi(verbosity)45 b(>)i(4)663 2624 y Fj(or)30 b Fi(workFactor)45
+b(<)j(0)30 b Fj(or)g Fi(workFactor)45 b(>)j(250)572 2728
+y(BZ_MEM_ERROR)663 2831 y Fj(if)30 b(insu\016cien)m(t)h(memory)f(is)h
+(a)m(v)-5 b(ailable)572 2935 y Fi(BZ_OUTBUFF_FULL)663
+3039 y Fj(if)30 b(the)h(size)g(of)g(the)f(compressed)h(data)f(exceeds)i
+Fi(*destLen)572 3143 y(BZ_OK)663 3247 y Fj(otherwise)150
+3616 y Fe(3.5.2)63 b Fd(BZ2_bzBuffToBuffDecompress)533
+3803 y Fi(int)47 b(BZ2_bzBuffToBuffDecompres)o(s)42 b(\()47
+b(char*)428 b(dest,)2108 3906 y(unsigned)46 b(int*)g(destLen,)2108
+4010 y(char*)428 b(source,)2108 4114 y(unsigned)46 b(int)94
+b(sourceLen,)2108 4218 y(int)524 b(small,)2108 4322 y(int)g(verbosity)
+46 b(\);)150 4478 y Fj(A)m(ttempts)22 b(to)g(decompress)f(the)h(data)f
+(in)g Fi(source[0)28 b(..)i(sourceLen-1])18 b Fj(in)m(to)k(the)f
+(destination)h(bu\013er,)150 4588 y Fi(dest[0)29 b(..)g(*destLen-1])p
+Fj(.)61 b(If)37 b(the)h(destination)h(bu\013er)e(is)h(big)g(enough,)i
+Fi(*destLen)35 b Fj(is)j(set)h(to)g(the)150 4698 y(size)e(of)e(the)h
+(uncompressed)f(data,)j(and)c Fi(BZ_OK)h Fj(is)g(returned.)56
+b(If)36 b(the)g(compressed)f(data)h(w)m(on't)h(\014t,)150
+4807 y Fi(*destLen)28 b Fj(is)j(unc)m(hanged,)f(and)f
+Fi(BZ_OUTBUFF_FULL)d Fj(is)31 b(returned.)150 4964 y
+Fi(source)e Fj(is)h(assumed)f(to)j(hold)e(a)g(complete)i
+Fi(bzip2)d Fj(format)i(data)g(stream.)150 5074 y Fi
+(BZ2_bzBuffToBuffDecompre)o(ss)38 b Fj(tries)46 b(to)f(decompress)f
+(the)h(en)m(tiret)m(y)i(of)d(the)h(stream)g(in)m(to)h(the)150
+5183 y(output)30 b(bu\013er.)150 5340 y(F)-8 b(or)31
+b(the)g(meaning)f(of)h(parameters)g Fi(small)e Fj(and)g
+Fi(verbosity)p Fj(,)f(see)j Fi(BZ2_bzDecompressInit)p
+Fj(.)p eop
+%%Page: 29 30
+29 29 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(29)150 299 y Fj(Because)31
+b(the)g(compression)g(ratio)g(of)g(the)g(compressed)f(data)h(cannot)g
+(b)s(e)f(kno)m(wn)g(in)g(adv)-5 b(ance,)31 b(there)150
+408 y(is)g(no)f(easy)i(w)m(a)m(y)f(to)h(guaran)m(tee)g(that)f(the)g
+(output)g(bu\013er)f(will)h(b)s(e)f(big)h(enough.)42
+b(Y)-8 b(ou)30 b(ma)m(y)i(of)e(course)150 518 y(mak)m(e)j(arrangemen)m
+(ts)h(in)e(y)m(our)h(co)s(de)f(to)i(record)f(the)g(size)g(of)g(the)g
+(uncompressed)e(data,)j(but)e(suc)m(h)g(a)150 628 y(mec)m(hanism)e(is)h
+(b)s(ey)m(ond)f(the)g(scop)s(e)h(of)f(this)h(library)-8
+b(.)150 784 y Fi(BZ2_bzBuffToBuffDecompre)o(ss)24 b Fj(will)31
+b(not)g(write)g(data)f(at)h(or)g(b)s(ey)m(ond)e Fi(dest[*destLen])p
+Fj(,)e(ev)m(en)k(in)150 894 y(case)g(of)g(bu\013er)e(o)m(v)m(er\015o)m
+(w.)150 1051 y(P)m(ossible)j(return)e(v)-5 b(alues:)572
+1202 y Fi(BZ_CONFIG_ERROR)663 1306 y Fj(if)30 b(the)h(library)f(has)g
+(b)s(een)g(mis-compiled)572 1409 y Fi(BZ_PARAM_ERROR)663
+1513 y Fj(if)g Fi(dest)f Fj(is)i Fi(NULL)e Fj(or)i Fi(destLen)d
+Fj(is)i Fi(NULL)663 1617 y Fj(or)g Fi(small)47 b(!=)g(0)g(&&)h(small)e
+(!=)h(1)663 1721 y Fj(or)30 b Fi(verbosity)46 b(<)h(0)30
+b Fj(or)h Fi(verbosity)45 b(>)i(4)572 1825 y(BZ_MEM_ERROR)663
+1928 y Fj(if)30 b(insu\016cien)m(t)h(memory)f(is)h(a)m(v)-5
+b(ailable)572 2032 y Fi(BZ_OUTBUFF_FULL)663 2136 y Fj(if)30
+b(the)h(size)g(of)g(the)f(compressed)h(data)f(exceeds)i
+Fi(*destLen)572 2240 y(BZ_DATA_ERROR)663 2343 y Fj(if)e(a)h(data)f(in)m
+(tegrit)m(y)j(error)e(w)m(as)g(detected)g(in)g(the)f(compressed)h(data)
+572 2447 y Fi(BZ_DATA_ERROR_MAGIC)663 2551 y Fj(if)f(the)h(compressed)f
+(data)h(do)s(esn't)f(b)s(egin)g(with)g(the)h(righ)m(t)g(magic)h(b)m
+(ytes)572 2655 y Fi(BZ_UNEXPECTED_EOF)663 2759 y Fj(if)e(the)h
+(compressed)f(data)h(ends)e(unexp)s(ectedly)572 2862
+y Fi(BZ_OK)663 2966 y Fj(otherwise)150 3370 y Fk(3.6)68
+b Fc(zlib)43 b Fk(compatibilit)l(y)k(functions)150 3563
+y Fj(Y)-8 b(oshiok)j(a)32 b(Tsuneo)f(has)f(con)m(tributed)i(some)f
+(functions)g(to)h(giv)m(e)h(b)s(etter)e Fi(zlib)f Fj(compatibilit)m(y)
+-8 b(.)46 b(These)150 3673 y(functions)37 b(are)g Fi(BZ2_bzopen)p
+Fj(,)f Fi(BZ2_bzread)p Fj(,)g Fi(BZ2_bzwrite)p Fj(,)g
+Fi(BZ2_bzflush)p Fj(,)f Fi(BZ2_bzclose)p Fj(,)h Fi(BZ2_)150
+3782 y(bzerror)22 b Fj(and)g Fi(BZ2_bzlibVersion)p Fj(.)34
+b(These)24 b(functions)f(are)h(not)g(\(y)m(et\))h(o\016cially)g(part)f
+(of)g(the)f(library)-8 b(.)150 3892 y(If)30 b(they)h(break,)f(y)m(ou)h
+(get)h(to)f(k)m(eep)g(all)g(the)g(pieces.)41 b(Nev)m(ertheless,)33
+b(I)e(think)f(they)g(w)m(ork)h(ok.)390 4043 y Fi(typedef)46
+b(void)g(BZFILE;)390 4250 y(const)g(char)h(*)g(BZ2_bzlibVersion)d(\()j
+(void)g(\);)150 4407 y Fj(Returns)30 b(a)h(string)f(indicating)h(the)g
+(library)f(v)m(ersion.)390 4558 y Fi(BZFILE)46 b(*)i(BZ2_bzopen)92
+b(\()48 b(const)e(char)h(*path,)f(const)g(char)h(*mode)f(\);)390
+4662 y(BZFILE)g(*)i(BZ2_bzdopen)c(\()k(int)381 b(fd,)190
+b(const)46 b(char)h(*mode)f(\);)150 4819 y Fj(Op)s(ens)36
+b(a)i Fi(.bz2)e Fj(\014le)i(for)f(reading)h(or)f(writing,)j(using)d
+(either)h(its)g(name)f(or)h(a)g(pre-existing)g(\014le)g(de-)150
+4928 y(scriptor.)j(Analogous)31 b(to)g Fi(fopen)e Fj(and)h
+Fi(fdopen)p Fj(.)390 5079 y Fi(int)47 b(BZ2_bzread)93
+b(\()47 b(BZFILE*)f(b,)h(void*)f(buf,)h(int)g(len)g(\);)390
+5183 y(int)g(BZ2_bzwrite)e(\()i(BZFILE*)f(b,)h(void*)f(buf,)h(int)g
+(len)g(\);)150 5340 y Fj(Reads/writes)31 b(data)g(from/to)g(a)g
+(previously)f(op)s(ened)f Fi(BZFILE)p Fj(.)39 b(Analogous)31
+b(to)g Fi(fread)e Fj(and)g Fi(fwrite)p Fj(.)p eop
+%%Page: 30 31
+30 30 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(30)390 299 y Fi(int)95
+b(BZ2_bzflush)44 b(\()k(BZFILE*)e(b)h(\);)390 403 y(void)g(BZ2_bzclose)
+d(\()k(BZFILE*)e(b)h(\);)150 559 y Fj(Flushes/closes)29
+b(a)f Fi(BZFILE)p Fj(.)38 b Fi(BZ2_bzflush)25 b Fj(do)s(esn't)j
+(actually)h(do)f(an)m(ything.)41 b(Analogous)28 b(to)h
+Fi(fflush)150 669 y Fj(and)h Fi(fclose)p Fj(.)390 820
+y Fi(const)46 b(char)h(*)g(BZ2_bzerror)e(\()j(BZFILE)e(*b,)h(int)g
+(*errnum)e(\))150 977 y Fj(Returns)29 b(a)h(string)g(describing)g(the)f
+(more)i(recen)m(t)g(error)f(status)g(of)f Fi(b)p Fj(,)h(and)f(also)h
+(sets)g Fi(*errnum)e Fj(to)i(its)150 1087 y(n)m(umerical)h(v)-5
+b(alue.)150 1411 y Fk(3.7)68 b(Using)46 b(the)f(library)g(in)g(a)g
+Fc(stdio)p Fk(-free)f(en)l(vironmen)l(t)150 1723 y Fe(3.7.1)63
+b(Getting)41 b(rid)g(of)g Fd(stdio)150 1915 y Fj(In)g(a)g(deeply)h(em)m
+(b)s(edded)e(application,)46 b(y)m(ou)41 b(migh)m(t)i(w)m(an)m(t)f(to)g
+(use)f(just)g(the)h(memory-to-memory)150 2025 y(functions.)d(Y)-8
+b(ou)27 b(can)g(do)g(this)g(con)m(v)m(enien)m(tly)j(b)m(y)d(compiling)h
+(the)f(library)g(with)g(prepro)s(cessor)g(sym)m(b)s(ol)150
+2135 y Fi(BZ_NO_STDIO)34 b Fj(de\014ned.)60 b(Doing)38
+b(this)f(giv)m(es)i(y)m(ou)e(a)h(library)f(con)m(taining)i(only)e(the)h
+(follo)m(wing)g(eigh)m(t)150 2244 y(functions:)150 2401
+y Fi(BZ2_bzCompressInit)p Fj(,)26 b Fi(BZ2_bzCompress)p
+Fj(,)g Fi(BZ2_bzCompressEnd)150 2511 y(BZ2_bzDecompressInit)p
+Fj(,)f Fi(BZ2_bzDecompress)p Fj(,)h Fi(BZ2_bzDecompressEnd)150
+2620 y(BZ2_bzBuffToBuffCompress)o Fj(,)f Fi(BZ2_bzBuffToBuffDecompre)o
+(ss)150 2777 y Fj(When)30 b(compiled)h(lik)m(e)g(this,)g(all)g
+(functions)f(will)h(ignore)g Fi(verbosity)d Fj(settings.)150
+3053 y Fe(3.7.2)63 b(Critical)40 b(error)h(handling)150
+3246 y Fi(libbzip2)18 b Fj(con)m(tains)k(a)f(n)m(um)m(b)s(er)e(of)i(in)
+m(ternal)h(assertion)f(c)m(hec)m(ks)h(whic)m(h)f(should,)g(needless)g
+(to)h(sa)m(y)-8 b(,)23 b(nev)m(er)150 3355 y(b)s(e)35
+b(activ)-5 b(ated.)58 b(Nev)m(ertheless,)40 b(if)35 b(an)h(assertion)g
+(should)f(fail,)i(b)s(eha)m(viour)f(dep)s(ends)e(on)h(whether)h(or)150
+3465 y(not)31 b(the)f(library)h(w)m(as)f(compiled)h(with)f
+Fi(BZ_NO_STDIO)e Fj(set.)150 3622 y(F)-8 b(or)31 b(a)g(normal)f
+(compile,)i(an)e(assertion)h(failure)f(yields)h(the)g(message)533
+3773 y Fi(bzip2/libbzip2:)44 b(internal)h(error)i(number)f(N.)533
+3877 y(This)h(is)g(a)g(bug)g(in)h(bzip2/libbzip2,)43
+b(1.0.2,)j(30-Dec-2001.)533 3980 y(Please)g(report)g(it)i(to)f(me)g
+(at:)g(jseward@acm.org.)91 b(If)47 b(this)g(happened)533
+4084 y(when)g(you)g(were)f(using)h(some)f(program)g(which)h(uses)f
+(libbzip2)g(as)h(a)533 4188 y(component,)e(you)i(should)f(also)h
+(report)f(this)h(bug)f(to)i(the)f(author\(s\))533 4292
+y(of)g(that)g(program.)93 b(Please)46 b(make)h(an)g(effort)f(to)h
+(report)g(this)f(bug;)533 4395 y(timely)g(and)h(accurate)f(bug)h
+(reports)e(eventually)g(lead)i(to)g(higher)533 4499 y(quality)f
+(software.)93 b(Thanks.)h(Julian)46 b(Seward,)f(30)j(December)d(2001.)
+150 4656 y Fj(where)33 b Fi(N)g Fj(is)g(some)g(error)h(co)s(de)f(n)m
+(um)m(b)s(er.)48 b(If)32 b Fi(N)e(==)g(1007)p Fj(,)j(it)h(also)f(prin)m
+(ts)g(some)h(extra)g(text)g(advising)150 4766 y(the)e(reader)f(that)h
+(unreliable)f(memory)h(is)f(often)h(asso)s(ciated)g(with)f(in)m(ternal)
+h(error)g(1007.)45 b(\(This)32 b(is)f(a)150 4875 y(frequen)m
+(tly-observ)m(ed-phenomenon)g(with)f(v)m(ersions)h(1.0.0/1.0.1\).)150
+5032 y Fi(exit\(3\))d Fj(is)j(then)f(called.)150 5189
+y(F)-8 b(or)31 b(a)g Fi(stdio)p Fj(-free)e(library)-8
+b(,)31 b(assertion)h(failures)e(result)h(in)f(a)g(call)i(to)f(a)f
+(function)h(declared)f(as:)533 5340 y Fi(extern)46 b(void)h
+(bz_internal_error)c(\()k(int)g(errcode)f(\);)p eop
+%%Page: 31 32
+31 31 bop 150 -116 a Fl(Chapter)30 b(3:)41 b(Programming)29
+b(with)g Fi(libbzip2)1881 b Fl(31)150 299 y Fj(The)30
+b(relev)-5 b(an)m(t)32 b(co)s(de)f(is)f(passed)g(as)g(a)h(parameter.)41
+b(Y)-8 b(ou)31 b(should)e(supply)g(suc)m(h)h(a)g(function.)150
+456 y(In)f(either)h(case,)g(once)g(an)f(assertion)h(failure)f(has)f(o)s
+(ccurred,)i(an)m(y)f Fi(bz_stream)e Fj(records)i(in)m(v)m(olv)m(ed)i
+(can)150 565 y(b)s(e)f(regarded)g(as)h(in)m(v)-5 b(alid.)41
+b(Y)-8 b(ou)30 b(should)f(not)i(attempt)h(to)f(resume)f(normal)h(op)s
+(eration)g(with)f(them.)150 722 y(Y)-8 b(ou)27 b(ma)m(y)-8
+b(,)28 b(of)f(course,)h(c)m(hange)f(critical)i(error)e(handling)f(to)h
+(suit)g(y)m(our)g(needs.)39 b(As)26 b(I)h(said)f(ab)s(o)m(v)m(e,)j
+(crit-)150 832 y(ical)f(errors)g(indicate)g(bugs)e(in)h(the)h(library)f
+(and)f(should)g(not)i(o)s(ccur.)40 b(All)27 b Fi(")p
+Fj(normal)p Fi(")g Fj(error)g(situations)150 941 y(are)k(indicated)g
+(via)f(error)h(return)f(co)s(des)h(from)f(functions,)g(and)g(can)g(b)s
+(e)g(reco)m(v)m(ered)i(from.)150 1221 y Fk(3.8)68 b(Making)45
+b(a)g(Windo)l(ws)h(DLL)150 1414 y Fj(Ev)m(erything)31
+b(related)g(to)h(Windo)m(ws)e(has)f(b)s(een)h(con)m(tributed)h(b)m(y)f
+(Y)-8 b(oshiok)j(a)32 b(Tsuneo)150 1523 y(\()p Fi
+(QWF00133@niftyserve.or.jp)45 b Fj(/)53 b Fi(tsuneo-y@is.aist-nara.a)o
+(c.jp)o Fj(\),)f(so)g(y)m(ou)h(should)e(send)150 1633
+y(y)m(our)31 b(queries)f(to)h(him)f(\(but)g(p)s(erhaps)f(Cc:)41
+b(me,)31 b Fi(jseward@acm.org)p Fj(\).)150 1790 y(My)42
+b(v)-5 b(ague)43 b(understanding)d(of)i(what)g(to)h(do)f(is:)64
+b(using)41 b(Visual)h(C)p Fi(++)f Fj(5.0,)46 b(op)s(en)c(the)g(pro)5
+b(ject)43 b(\014le)150 1899 y Fi(libbz2.dsp)p Fj(,)28
+b(and)h(build.)40 b(That's)31 b(all.)150 2056 y(If)39
+b(y)m(ou)g(can't)h(op)s(en)f(the)g(pro)5 b(ject)40 b(\014le)f(for)g
+(some)h(reason,)i(mak)m(e)e(a)f(new)f(one,)k(naming)d(these)h(\014les:)
+150 2166 y Fi(blocksort.c)p Fj(,)28 b Fi(bzlib.c)p Fj(,)g
+Fi(compress.c)p Fj(,)g Fi(crctable.c)p Fj(,)g Fi(decompress.c)p
+Fj(,)f Fi(huffman.c)p Fj(,)150 2275 y Fi(randtable.c)32
+b Fj(and)h Fi(libbz2.def)p Fj(.)51 b(Y)-8 b(ou)35 b(will)g(also)g(need)
+f(to)i(name)e(the)h(header)g(\014les)f Fi(bzlib.h)f Fj(and)150
+2385 y Fi(bzlib_private.h)p Fj(.)150 2542 y(If)d(y)m(ou)h(don't)f(use)h
+(V)m(C)p Fi(++)p Fj(,)e(y)m(ou)i(ma)m(y)g(need)f(to)h(de\014ne)f(the)h
+(propro)s(cessor)f(sym)m(b)s(ol)g Fi(_WIN32)p Fj(.)150
+2698 y(Finally)-8 b(,)30 b Fi(dlltest.c)25 b Fj(is)j(a)g(sample)g
+(program)h(using)e(the)i(DLL.)e(It)h(has)g(a)g(pro)5
+b(ject)29 b(\014le,)g Fi(dlltest.dsp)p Fj(.)150 2855
+y(If)h(y)m(ou)h(just)f(w)m(an)m(t)h(a)f(mak)m(e\014le)i(for)e(Visual)g
+(C,)g(ha)m(v)m(e)i(a)e(lo)s(ok)h(at)g Fi(makefile.msc)p
+Fj(.)150 3012 y(Be)j(a)m(w)m(are)i(that)f(if)g(y)m(ou)f(compile)i
+Fi(bzip2)d Fj(itself)i(on)g(Win32,)h(y)m(ou)f(m)m(ust)f(set)i
+Fi(BZ_UNIX)c Fj(to)j(0)g(and)f Fi(BZ_)150 3122 y(LCCWIN32)25
+b Fj(to)j(1,)g(in)f(the)h(\014le)f Fi(bzip2.c)p Fj(,)f(b)s(efore)h
+(compiling.)41 b(Otherwise)27 b(the)h(resulting)g(binary)e(w)m(on't)150
+3231 y(w)m(ork)31 b(correctly)-8 b(.)150 3388 y(I)30
+b(ha)m(v)m(en't)i(tried)f(an)m(y)f(of)h(this)f(stu\013)g(m)m(yself,)i
+(but)d(it)i(all)g(lo)s(oks)g(plausible.)p eop
+%%Page: 32 33
+32 32 bop 150 -116 a Fl(Chapter)30 b(4:)41 b(Miscellanea)2586
+b(32)150 299 y Fg(4)80 b(Miscellanea)150 549 y Fj(These)31
+b(are)f(just)g(some)h(random)f(though)m(ts)h(of)f(mine.)41
+b(Y)-8 b(our)30 b(mileage)i(ma)m(y)f(v)-5 b(ary)d(.)150
+826 y Fk(4.1)68 b(Limitations)47 b(of)e(the)g(compressed)g(\014le)h
+(format)150 1018 y Fi(bzip2-1.0)p Fj(,)c Fi(0.9.5)e Fj(and)h
+Fi(0.9.0)f Fj(use)i(exactly)h(the)f(same)g(\014le)g(format)g(as)f(the)h
+(previous)g(v)m(ersion,)150 1128 y Fi(bzip2-0.1)p Fj(.)72
+b(This)41 b(decision)h(w)m(as)g(made)f(in)g(the)h(in)m(terests)h(of)f
+(stabilit)m(y)-8 b(.)76 b(Creating)43 b(y)m(et)g(another)150
+1238 y(incompatible)i(compressed)g(\014le)g(format)g(w)m(ould)f(create)
+i(further)e(confusion)h(and)e(disruption)h(for)150 1347
+y(users.)150 1504 y(Nev)m(ertheless,)30 b(this)d(is)f(not)h(a)g
+(painless)g(decision.)40 b(Dev)m(elopmen)m(t)28 b(w)m(ork)f(since)h
+(the)f(release)h(of)f Fi(bzip2-)150 1614 y(0.1)g Fj(in)h(August)g(1997)
+i(has)d(sho)m(wn)h(complexities)i(in)e(the)g(\014le)g(format)h(whic)m
+(h)f(slo)m(w)h(do)m(wn)e(decompres-)150 1723 y(sion)j(and,)g(in)g
+(retrosp)s(ect,)i(are)f(unnecessary)-8 b(.)41 b(These)30
+b(are:)225 1880 y Fh(\017)60 b Fj(The)33 b(run-length)g(enco)s(der,)h
+(whic)m(h)f(is)g(the)h(\014rst)f(of)g(the)h(compression)f
+(transformations,)i(is)e(en-)330 1990 y(tirely)h(irrelev)-5
+b(an)m(t.)48 b(The)32 b(original)i(purp)s(ose)d(w)m(as)i(to)g(protect)h
+(the)f(sorting)g(algorithm)g(from)g(the)330 2099 y(v)m(ery)26
+b(w)m(orst)g(case)h(input:)37 b(a)26 b(string)g(of)f(rep)s(eated)h(sym)
+m(b)s(ols.)39 b(But)25 b(algorithm)h(steps)g(Q6a)g(and)f(Q6b)330
+2209 y(in)j(the)g(original)i(Burro)m(ws-Wheeler)e(tec)m(hnical)i(rep)s
+(ort)f(\(SR)m(C-124\))h(sho)m(w)e(ho)m(w)g(rep)s(eats)g(can)h(b)s(e)330
+2318 y(handled)g(without)i(di\016cult)m(y)g(in)f(blo)s(c)m(k)h
+(sorting.)225 2451 y Fh(\017)60 b Fj(The)27 b(randomisation)h(mec)m
+(hanism)f(do)s(esn't)g(really)i(need)e(to)h(b)s(e)e(there.)41
+b(Udi)27 b(Man)m(b)s(er)g(and)f(Gene)330 2561 y(My)m(ers)31
+b(published)d(a)j(su\016x)e(arra)m(y)h(construction)i(algorithm)f(a)f
+(few)g(y)m(ears)h(bac)m(k,)g(whic)m(h)e(can)i(b)s(e)330
+2670 y(emplo)m(y)m(ed)26 b(to)g(sort)f(an)m(y)g(blo)s(c)m(k,)i(no)e
+(matter)h(ho)m(w)f(rep)s(etitiv)m(e,)j(in)c(O\(N)i(log)g(N\))f(time.)40
+b(Subsequen)m(t)330 2780 y(w)m(ork)24 b(b)m(y)f(Kunihik)m(o)g(Sadak)-5
+b(ane)23 b(has)g(pro)s(duced)e(a)j(deriv)-5 b(ativ)m(e)25
+b(O\(N)f(\(log)g(N\))p Fi(^)p Fj(2\))h(algorithm)f(whic)m(h)330
+2890 y(usually)30 b(outp)s(erforms)g(the)g(Man)m(b)s(er-My)m(ers)i
+(algorithm.)330 3023 y(I)f(could)f(ha)m(v)m(e)i(c)m(hanged)f(to)g
+(Sadak)-5 b(ane's)30 b(algorithm,)i(but)e(I)h(\014nd)e(it)i(to)g(b)s(e)
+f(slo)m(w)m(er)i(than)e Fi(bzip2)p Fj('s)330 3132 y(existing)39
+b(algorithm)f(for)g(most)g(inputs,)h(and)d(the)i(randomisation)g(mec)m
+(hanism)g(protects)h(ade-)330 3242 y(quately)34 b(against)g(bad)f
+(cases.)50 b(I)33 b(didn't)g(think)g(it)h(w)m(as)f(a)h(go)s(o)s(d)f
+(tradeo\013)h(to)g(mak)m(e.)50 b(P)m(artly)35 b(this)330
+3351 y(is)40 b(due)f(to)i(the)f(fact)h(that)f(I)g(w)m(as)g(not)g(\015o)
+s(o)s(ded)f(with)g(email)i(complain)m(ts)g(ab)s(out)e
+Fi(bzip2-0.1)p Fj('s)330 3461 y(p)s(erformance)30 b(on)g(rep)s(etitiv)m
+(e)j(data,)e(so)f(p)s(erhaps)f(it)i(isn't)g(a)f(problem)g(for)h(real)g
+(inputs.)330 3594 y(Probably)g(the)h(b)s(est)f(long-term)i(solution,)f
+(and)f(the)g(one)h(I)f(ha)m(v)m(e)i(incorp)s(orated)e(in)m(to)i(0.9.5)g
+(and)330 3704 y(ab)s(o)m(v)m(e,)41 b(is)d(to)h(use)f(the)h(existing)g
+(sorting)g(algorithm)g(initially)-8 b(,)42 b(and)37 b(fall)i(bac)m(k)g
+(to)f(a)h(O\(N)f(\(log)330 3813 y(N\))p Fi(^)p Fj(2\))31
+b(algorithm)h(if)e(the)h(standard)e(algorithm)j(gets)f(in)m(to)h
+(di\016culties.)225 3946 y Fh(\017)60 b Fj(The)29 b(compressed)g
+(\014le)g(format)h(w)m(as)f(nev)m(er)g(designed)g(to)h(b)s(e)e(handled)
+g(b)m(y)h(a)g(library)-8 b(,)30 b(and)e(I)h(ha)m(v)m(e)330
+4056 y(had)e(to)h(jump)e(though)h(some)h(ho)s(ops)e(to)i(pro)s(duce)f
+(an)g(e\016cien)m(t)i(implemen)m(tation)g(of)e(decompres-)330
+4165 y(sion.)39 b(It's)24 b(a)h(bit)f(hairy)-8 b(.)39
+b(T)-8 b(ry)24 b(passing)g Fi(decompress.c)d Fj(through)i(the)i(C)e
+(prepro)s(cessor)i(and)e(y)m(ou'll)330 4275 y(see)31
+b(what)e(I)h(mean.)41 b(Muc)m(h)30 b(of)g(this)g(complexit)m(y)i(could)
+e(ha)m(v)m(e)g(b)s(een)g(a)m(v)m(oided)h(if)f(the)g(compressed)330
+4384 y(size)h(of)g(eac)m(h)g(blo)s(c)m(k)g(of)g(data)f(w)m(as)h
+(recorded)f(in)h(the)f(data)h(stream.)225 4517 y Fh(\017)60
+b Fj(An)29 b(Adler-32)j(c)m(hec)m(ksum,)f(rather)g(than)f(a)g(CR)m(C32)
+h(c)m(hec)m(ksum,)h(w)m(ould)e(b)s(e)g(faster)h(to)g(compute.)150
+4698 y(It)45 b(w)m(ould)g(b)s(e)f(fair)h(to)h(sa)m(y)f(that)g(the)h
+Fi(bzip2)d Fj(format)i(w)m(as)g(frozen)g(b)s(efore)g(I)g(prop)s(erly)f
+(and)g(fully)150 4807 y(understo)s(o)s(d)29 b(the)i(p)s(erformance)f
+(consequences)h(of)f(doing)h(so.)150 4964 y(Impro)m(v)m(emen)m(ts)25
+b(whic)m(h)d(I)i(w)m(as)f(able)g(to)h(incorp)s(orate)g(in)m(to)g
+(0.9.0,)j(despite)d(using)e(the)i(same)f(\014le)g(format,)150
+5074 y(are:)225 5230 y Fh(\017)60 b Fj(Single)30 b(arra)m(y)g(implemen)
+m(tation)i(of)d(the)h(in)m(v)m(erse)h(BWT.)f(This)f(signi\014can)m(tly)
+i(sp)s(eeds)e(up)f(decom-)330 5340 y(pression,)i(presumably)f(b)s
+(ecause)i(it)g(reduces)f(the)h(n)m(um)m(b)s(er)e(of)i(cac)m(he)g
+(misses.)p eop
+%%Page: 33 34
+33 33 bop 150 -116 a Fl(Chapter)30 b(4:)41 b(Miscellanea)2586
+b(33)225 299 y Fh(\017)60 b Fj(F)-8 b(aster)25 b(in)m(v)m(erse)f(MTF)g
+(transform)f(for)g(large)i(MTF)f(v)-5 b(alues.)38 b(The)23
+b(new)g(implemen)m(tation)i(is)f(based)330 408 y(on)30
+b(the)h(notion)g(of)f(sliding)h(blo)s(c)m(ks)g(of)f(v)-5
+b(alues.)225 544 y Fh(\017)60 b Fi(bzip2-0.9.0)23 b Fj(no)m(w)j(reads)g
+(and)f(writes)h(\014les)g(with)g Fi(fread)f Fj(and)g
+Fi(fwrite)p Fj(;)h(v)m(ersion)h(0.1)g(used)e Fi(putc)330
+653 y Fj(and)30 b Fi(getc)p Fj(.)39 b(Duh!)g(W)-8 b(ell,)32
+b(y)m(ou)f(liv)m(e)g(and)f(learn.)150 836 y(F)-8 b(urther)28
+b(ahead,)h(it)g(w)m(ould)f(b)s(e)g(nice)g(to)i(b)s(e)d(able)i(to)g(do)f
+(random)f(access)j(in)m(to)f(\014les.)40 b(This)28 b(will)h(require)150
+945 y(some)i(careful)g(design)f(of)g(compressed)h(\014le)f(formats.)150
+1227 y Fk(4.2)68 b(P)l(ortabilit)l(y)47 b(issues)150
+1419 y Fj(After)33 b(some)h(consideration,)h(I)e(ha)m(v)m(e)h(decided)f
+(not)g(to)h(use)f(GNU)g Fi(autoconf)e Fj(to)j(con\014gure)f(0.9.5)i(or)
+150 1529 y(1.0.)150 1686 y Fi(autoconf)p Fj(,)30 b(admirable)i(and)e(w)
+m(onderful)h(though)h(it)g(is,)h(mainly)e(assists)h(with)g(p)s
+(ortabilit)m(y)g(problems)150 1795 y(b)s(et)m(w)m(een)46
+b(Unix-lik)m(e)h(platforms.)85 b(But)45 b Fi(bzip2)f
+Fj(do)s(esn't)h(ha)m(v)m(e)h(m)m(uc)m(h)g(in)f(the)g(w)m(a)m(y)h(of)g
+(p)s(ortabilit)m(y)150 1905 y(problems)21 b(on)h(Unix;)j(most)d(of)g
+(the)g(di\016culties)g(app)s(ear)f(when)g(p)s(orting)h(to)g(the)h(Mac,)
+h(or)e(to)h(Microsoft's)150 2015 y(op)s(erating)j(systems.)40
+b Fi(autoconf)23 b Fj(do)s(esn't)j(help)f(in)g(those)i(cases,)g(and)e
+(brings)g(in)h(a)g(whole)f(load)i(of)e(new)150 2124 y(complexit)m(y)-8
+b(.)150 2281 y(Most)34 b(p)s(eople)e(should)g(b)s(e)g(able)h(to)g
+(compile)h(the)f(library)f(and)g(program)h(under)e(Unix)h(straigh)m(t)i
+(out-)150 2391 y(of-the-b)s(o)m(x,)e(so)e(to)i(sp)s(eak,)e(esp)s
+(ecially)h(if)f(y)m(ou)h(ha)m(v)m(e)g(a)g(v)m(ersion)g(of)g(GNU)g(C)e
+(a)m(v)-5 b(ailable.)150 2547 y(There)31 b(are)h(a)f(couple)g(of)g
+Fi(__inline__)e Fj(directiv)m(es)k(in)d(the)i(co)s(de.)42
+b(GNU)32 b(C)f(\()p Fi(gcc)p Fj(\))f(should)g(b)s(e)h(able)g(to)150
+2657 y(handle)23 b(them.)38 b(If)23 b(y)m(ou're)h(not)g(using)f(GNU)h
+(C,)f(y)m(our)h(C)e(compiler)j(shouldn't)d(see)i(them)g(at)g(all.)39
+b(If)23 b(y)m(our)150 2767 y(compiler)30 b(do)s(es,)f(for)f(some)h
+(reason,)h(see)f(them)g(and)f(do)s(esn't)g(lik)m(e)i(them,)g(just)e
+Fi(#define)f(__inline__)150 2876 y Fj(to)37 b(b)s(e)f
+Fi(/*)29 b(*/)p Fj(.)58 b(One)36 b(easy)h(w)m(a)m(y)f(to)i(do)e(this)g
+(is)g(to)h(compile)g(with)f(the)h(\015ag)f Fi(-D__inline__=)p
+Fj(,)e(whic)m(h)150 2986 y(should)29 b(b)s(e)h(understo)s(o)s(d)f(b)m
+(y)h(most)h(Unix)f(compilers.)150 3143 y(If)k(y)m(ou)g(still)h(ha)m(v)m
+(e)g(di\016culties,)h(try)e(compiling)g(with)g(the)g(macro)h
+Fi(BZ_STRICT_ANSI)30 b Fj(de\014ned.)50 b(This)150 3252
+y(should)27 b(enable)i(y)m(ou)g(to)g(build)e(the)i(library)f(in)g(a)g
+(strictly)i(ANSI)e(complian)m(t)i(en)m(vironmen)m(t.)41
+b(Building)150 3362 y(the)22 b(program)h(itself)g(lik)m(e)g(this)f(is)g
+(dangerous)g(and)f(not)h(supp)s(orted,)h(since)f(y)m(ou)h(remo)m(v)m(e)
+h Fi(bzip2)p Fj('s)c(c)m(hec)m(ks)150 3471 y(against)27
+b(compressing)g(directories,)i(sym)m(b)s(olic)d(links,)h(devices,)h
+(and)e(other)h(not-really-a-\014le)i(en)m(tities.)150
+3581 y(This)h(could)g(cause)h(\014lesystem)g(corruption!)150
+3738 y(One)c(other)h(thing:)40 b(if)27 b(y)m(ou)h(create)h(a)e
+Fi(bzip2)f Fj(binary)h(for)g(public)g(distribution,)h(please)g(try)g
+(and)e(link)h(it)150 3847 y(statically)g(\()p Fi(gcc)j(-s)p
+Fj(\).)39 b(This)24 b(a)m(v)m(oids)j(all)e(sorts)h(of)f(library-v)m
+(ersion)h(issues)e(that)i(others)g(ma)m(y)f(encoun)m(ter)150
+3957 y(later)32 b(on.)150 4114 y(If)d(y)m(ou)g(build)e
+Fi(bzip2)h Fj(on)g(Win32,)i(y)m(ou)f(m)m(ust)g(set)h
+Fi(BZ_UNIX)c Fj(to)k(0)f(and)f Fi(BZ_LCCWIN32)e Fj(to)k(1,)f(in)g(the)g
+(\014le)150 4223 y Fi(bzip2.c)p Fj(,)g(b)s(efore)h(compiling.)41
+b(Otherwise)31 b(the)g(resulting)g(binary)f(w)m(on't)h(w)m(ork)g
+(correctly)-8 b(.)150 4505 y Fk(4.3)68 b(Rep)t(orting)46
+b(bugs)150 4698 y Fj(I)23 b(tried)g(prett)m(y)h(hard)e(to)i(mak)m(e)f
+(sure)g Fi(bzip2)e Fj(is)i(bug)f(free,)j(b)s(oth)d(b)m(y)h(design)g
+(and)f(b)m(y)h(testing.)39 b(Hop)s(efully)150 4807 y(y)m(ou'll)31
+b(nev)m(er)g(need)g(to)g(read)f(this)h(section)g(for)g(real.)150
+4964 y(Nev)m(ertheless,)j(if)d Fi(bzip2)f Fj(dies)h(with)g(a)g(segmen)m
+(tation)j(fault,)e(a)f(bus)f(error)i(or)f(an)g(in)m(ternal)h(assertion)
+150 5074 y(failure,)j(it)f(will)f(ask)h(y)m(ou)g(to)g(email)g(me)g(a)f
+(bug)g(rep)s(ort.)50 b(Exp)s(erience)33 b(with)g(v)m(ersion)i(0.1)f
+(sho)m(ws)f(that)150 5183 y(almost)e(all)g(these)g(problems)f(can)h(b)s
+(e)e(traced)j(to)f(either)g(compiler)g(bugs)f(or)h(hardw)m(are)f
+(problems.)225 5340 y Fh(\017)60 b Fj(Recompile)22 b(the)f(program)f
+(with)h(no)f(optimisation,)k(and)c(see)h(if)g(it)g(w)m(orks.)38
+b(And/or)20 b(try)g(a)h(di\013eren)m(t)p eop
+%%Page: 34 35
+34 34 bop 150 -116 a Fl(Chapter)30 b(4:)41 b(Miscellanea)2586
+b(34)330 299 y Fj(compiler.)74 b(I)41 b(heard)f(all)i(sorts)f(of)g
+(stories)i(ab)s(out)d(v)-5 b(arious)41 b(\015a)m(v)m(ours)g(of)h(GNU)f
+(C)g(\(and)f(other)330 408 y(compilers\))45 b(generating)g(bad)e(co)s
+(de)g(for)h Fi(bzip2)p Fj(,)i(and)d(I'v)m(e)i(run)d(across)i(t)m(w)m(o)
+h(suc)m(h)f(examples)330 518 y(m)m(yself.)330 716 y(2.7.X)i(v)m
+(ersions)f(of)g(GNU)h(C)e(are)h(kno)m(wn)g(to)g(generate)i(bad)d(co)s
+(de)h(from)f(time)i(to)g(time,)j(at)330 825 y(high)32
+b(optimisation)h(lev)m(els.)47 b(If)31 b(y)m(ou)i(get)g(problems,)f
+(try)g(using)f(the)i(\015ags)f Fi(-O2)f(-fomit-frame-)330
+935 y(pointer)d(-fno-strength-reduce)p Fj(.)36 b(Y)-8
+b(ou)30 b(should)f(sp)s(eci\014cally)i Fb(not)40 b Fj(use)30
+b Fi(-funroll-loops)p Fj(.)330 1132 y(Y)-8 b(ou)36 b(ma)m(y)g(notice)i
+(that)e(the)g(Mak)m(e\014le)i(runs)d(six)g(tests)i(as)f(part)g(of)g
+(the)h(build)e(pro)s(cess.)57 b(If)36 b(the)330 1242
+y(program)42 b(passes)g(all)h(of)f(these,)k(it's)d(a)f(prett)m(y)i(go)s
+(o)s(d)e(\(but)g(not)g(100\045\))i(indication)f(that)g(the)330
+1352 y(compiler)31 b(has)f(done)g(its)h(job)f(correctly)-8
+b(.)225 1549 y Fh(\017)60 b Fj(If)32 b Fi(bzip2)e Fj(crashes)j
+(randomly)-8 b(,)32 b(and)f(the)i(crashes)f(are)g(not)h(rep)s(eatable,)
+g(y)m(ou)g(ma)m(y)f(ha)m(v)m(e)h(a)f(\015aky)330 1659
+y(memory)37 b(subsystem.)57 b Fi(bzip2)35 b Fj(really)i(hammers)f(y)m
+(our)h(memory)f(hierarc)m(h)m(y)-8 b(,)39 b(and)d(if)g(it's)h(a)g(bit)
+330 1768 y(marginal,)c(y)m(ou)g(ma)m(y)g(get)g(these)g(problems.)46
+b(Ditto)34 b(if)e(y)m(our)h(disk)f(or)g(I/O)h(subsystem)f(is)g(slo)m
+(wly)330 1878 y(failing.)41 b(Y)-8 b(up,)30 b(this)g(really)i(do)s(es)e
+(happ)s(en.)330 2075 y(T)-8 b(ry)27 b(using)f(a)h(di\013eren)m(t)h(mac)
+m(hine)f(of)g(the)g(same)g(t)m(yp)s(e,)h(and)e(see)h(if)g(y)m(ou)g(can)
+g(rep)s(eat)g(the)g(problem.)225 2273 y Fh(\017)60 b
+Fj(This)21 b(isn't)h(really)g(a)g(bug,)h(but)d(...)39
+b(If)21 b Fi(bzip2)f Fj(tells)i(y)m(ou)g(y)m(our)g(\014le)f(is)h
+(corrupted)f(on)g(decompression,)330 2383 y(and)g(y)m(ou)h(obtained)g
+(the)h(\014le)f(via)g(FTP)-8 b(,)23 b(there)f(is)g(a)g(p)s(ossibilit)m
+(y)h(that)f(y)m(ou)h(forgot)g(to)g(tell)g(FTP)f(to)h(do)330
+2492 y(a)31 b(binary)g(mo)s(de)g(transfer.)43 b(That)31
+b(absolutely)h(will)g(cause)f(the)h(\014le)f(to)h(b)s(e)e
+(non-decompressible.)330 2602 y(Y)-8 b(ou'll)31 b(ha)m(v)m(e)g(to)h
+(transfer)e(it)h(again.)150 2847 y(If)e(y)m(ou'v)m(e)i(incorp)s(orated)
+e Fi(libbzip2)e Fj(in)m(to)k(y)m(our)e(o)m(wn)g(program)h(and)e(are)i
+(getting)h(problems,)e(please,)150 2956 y(please,)e(please,)g(c)m(hec)m
+(k)f(that)g(the)f(parameters)h(y)m(ou)f(are)h(passing)e(in)h(calls)h
+(to)f(the)h(library)-8 b(,)26 b(are)g(correct,)150 3066
+y(and)g(in)g(accordance)i(with)f(what)f(the)h(do)s(cumen)m(tation)h(sa)
+m(ys)f(is)f(allo)m(w)m(able.)42 b(I)27 b(ha)m(v)m(e)g(tried)h(to)f(mak)
+m(e)h(the)150 3175 y(library)i(robust)g(against)h(suc)m(h)g(problems,)f
+(but)g(I'm)g(sure)g(I)g(ha)m(v)m(en't)i(succeeded.)150
+3332 y(Finally)-8 b(,)33 b(if)f(the)h(ab)s(o)m(v)m(e)g(commen)m(ts)g
+(don't)f(help,)g(y)m(ou'll)h(ha)m(v)m(e)g(to)g(send)e(me)h(a)g(bug)f
+(rep)s(ort.)46 b(No)m(w,)33 b(it's)150 3442 y(just)d(amazing)h(ho)m(w)f
+(man)m(y)h(p)s(eople)f(will)h(send)e(me)i(a)f(bug)g(rep)s(ort)h(sa)m
+(ying)g(something)g(lik)m(e)481 3593 y(bzip2)f(crashed)g(with)h(segmen)
+m(tation)h(fault)f(on)f(m)m(y)g(mac)m(hine)150 3750 y(and)h(absolutely)
+h(nothing)g(else.)45 b(Needless)33 b(to)f(sa)m(y)-8 b(,)33
+b(a)f(suc)m(h)f(a)h(rep)s(ort)g(is)f Fb(total)5 b(ly,)36
+b(utterly,)e(c)-5 b(ompletely)150 3859 y(and)27 b(c)-5
+b(ompr)g(ehensively)29 b(100\045)f(useless;)g(a)f(waste)g(of)g(your)g
+(time,)h(my)e(time,)i(and)f(net)g(b)-5 b(andwidth)p Fj(.)41
+b(With)150 3969 y(no)30 b(details)i(at)f(all,)g(there's)g(no)f(w)m(a)m
+(y)h(I)g(can)f(p)s(ossibly)g(b)s(egin)g(to)h(\014gure)f(out)h(what)f
+(the)g(problem)h(is.)150 4126 y(The)e(rules)f(of)h(the)g(game)h(are:)40
+b(facts,)30 b(facts,)g(facts.)41 b(Don't)29 b(omit)h(them)f(b)s(ecause)
+f Fi(")p Fj(oh,)h(they)g(w)m(on't)h(b)s(e)150 4235 y(relev)-5
+b(an)m(t)p Fi(")p Fj(.)42 b(A)m(t)31 b(the)g(bare)f(minim)m(um:)481
+4386 y(Mac)m(hine)h(t)m(yp)s(e.)62 b(Op)s(erating)30
+b(system)h(v)m(ersion.)481 4490 y(Exact)g(v)m(ersion)g(of)g
+Fi(bzip2)d Fj(\(do)j Fi(bzip2)46 b(-V)p Fj(\).)481 4594
+y(Exact)31 b(v)m(ersion)g(of)g(the)f(compiler)h(used.)481
+4698 y(Flags)g(passed)f(to)h(the)g(compiler.)150 4854
+y(Ho)m(w)m(ev)m(er,)f(the)e(most)g(imp)s(ortan)m(t)f(single)h(thing)g
+(that)f(will)h(help)f(me)g(is)g(the)h(\014le)f(that)h(y)m(ou)f(w)m(ere)
+h(trying)150 4964 y(to)35 b(compress)f(or)g(decompress)g(at)g(the)h
+(time)f(the)h(problem)e(happ)s(ened.)50 b(Without)34
+b(that,)i(m)m(y)e(abilit)m(y)150 5074 y(to)d(do)g(an)m(ything)f(more)h
+(than)f(sp)s(eculate)h(ab)s(out)f(the)h(cause,)f(is)h(limited.)150
+5230 y(Please)h(remem)m(b)s(er)g(that)g(I)f(connect)h(to)g(the)g(In)m
+(ternet)g(with)f(a)h(mo)s(dem,)f(so)g(y)m(ou)h(should)e(con)m(tact)k
+(me)150 5340 y(b)s(efore)c(mailing)h(me)g(h)m(uge)f(\014les.)p
+eop
+%%Page: 35 36
+35 35 bop 150 -116 a Fl(Chapter)30 b(4:)41 b(Miscellanea)2586
+b(35)150 299 y Fk(4.4)68 b(Did)45 b(y)l(ou)g(get)h(the)f(righ)l(t)h
+(pac)l(k)-7 b(age?)150 491 y Fi(bzip2)33 b Fj(is)h(a)h(resource)g(hog.)
+54 b(It)35 b(soaks)f(up)g(large)h(amoun)m(ts)g(of)f(CPU)h(cycles)g(and)
+f(memory)-8 b(.)53 b(Also,)36 b(it)150 601 y(giv)m(es)25
+b(v)m(ery)e(large)i(latencies.)40 b(In)23 b(the)g(w)m(orst)h(case,)i(y)
+m(ou)d(can)h(feed)f(man)m(y)g(megab)m(ytes)i(of)e(uncompressed)150
+711 y(data)42 b(in)m(to)h(the)f(library)g(b)s(efore)f(getting)j(an)m(y)
+e(compressed)g(output,)i(so)e(this)g(probably)f(rules)h(out)150
+820 y(applications)31 b(requiring)g(in)m(teractiv)m(e)i(b)s(eha)m
+(viour.)150 977 y(These)j(aren't)h(faults)f(of)g(m)m(y)g(implemen)m
+(tation,)j(I)d(hop)s(e,)h(but)f(more)g(an)g(in)m(trinsic)g(prop)s(ert)m
+(y)g(of)h(the)150 1087 y(Burro)m(ws-Wheeler)31 b(transform)f
+(\(unfortunately\).)41 b(Ma)m(yb)s(e)31 b(this)f(isn't)h(what)f(y)m(ou)
+h(w)m(an)m(t.)150 1244 y(If)f(y)m(ou)g(w)m(an)m(t)h(a)f(compressor)g
+(and/or)g(library)g(whic)m(h)g(is)g(faster,)h(uses)f(less)g(memory)g
+(but)g(gets)h(prett)m(y)150 1353 y(go)s(o)s(d)f(compression,)g(and)g
+(has)f(minimal)h(latency)-8 b(,)32 b(consider)e(Jean-loup)g(Gailly's)i
+(and)d(Mark)h(Adler's)150 1463 y(w)m(ork,)h Fi(zlib-1.1.3)d
+Fj(and)h Fi(gzip-1.2.4)p Fj(.)38 b(Lo)s(ok)30 b(for)h(them)f(at)150
+1620 y Fi(http://www.zlib.org)25 b Fj(and)30 b Fi(http://www.gzip.org)
+25 b Fj(resp)s(ectiv)m(ely)-8 b(.)150 1776 y(F)g(or)30
+b(something)h(faster)f(and)e(ligh)m(ter)k(still,)f(y)m(ou)f(migh)m(t)g
+(try)g(Markus)f(F)h(X)f(J)h(Ob)s(erh)m(umer's)e Fi(LZO)h
+Fj(real-)150 1886 y(time)i(compression/decompression)h(library)-8
+b(,)31 b(at)150 1996 y Fi(http://wildsau.idv.uni-l)o(inz.)o(ac.a)o(t/m)
+o(fx/l)o(zo.h)o(tml)o Fj(.)150 2152 y(If)37 b(y)m(ou)h(w)m(an)m(t)h(to)
+f(use)f(the)h Fi(bzip2)e Fj(algorithms)j(to)f(compress)g(small)g(blo)s
+(c)m(ks)f(of)h(data,)i(64k)e(b)m(ytes)h(or)150 2262 y(smaller,)h(for)e
+(example)g(on)g(an)g(on-the-\015y)g(disk)f(compressor,)j(y)m(ou'd)e(b)s
+(e)f(w)m(ell)i(advised)e(not)i(to)f(use)150 2372 y(this)k(library)-8
+b(.)74 b(Instead,)45 b(I'v)m(e)d(made)g(a)f(sp)s(ecial)h(library)g
+(tuned)f(for)g(that)h(kind)f(of)h(use.)74 b(It's)42 b(part)150
+2481 y(of)d Fi(e2compr-0.40)p Fj(,)e(an)i(on-the-\015y)g(disk)f
+(compressor)h(for)g(the)g(Lin)m(ux)e Fi(ext2)h Fj(\014lesystem.)66
+b(Lo)s(ok)38 b(at)150 2591 y Fi(http://www.netspace.net.)o(au/~)o(reit)
+o(er/)o(e2co)o(mpr)p Fj(.)150 2880 y Fk(4.5)68 b(T)-11
+b(esting)150 3072 y Fj(A)30 b(record)h(of)f(the)h(tests)h(I'v)m(e)f
+(done.)150 3229 y(First,)g(some)g(data)g(sets:)225 3386
+y Fh(\017)60 b Fj(B:)29 b(a)g(directory)h(con)m(taining)h(6001)f
+(\014les,)g(one)f(for)g(ev)m(ery)h(length)g(in)e(the)i(range)f(0)g(to)h
+(6000)h(b)m(ytes.)330 3496 y(The)f(\014les)h(con)m(tain)g(random)f(lo)m
+(w)m(ercase)j(letters.)42 b(18.7)32 b(megab)m(ytes.)225
+3633 y Fh(\017)60 b Fj(H:)33 b(m)m(y)h(home)f(directory)h(tree.)50
+b(Do)s(cumen)m(ts,)34 b(source)f(co)s(de,)h(mail)g(\014les,)g
+(compressed)f(data.)49 b(H)330 3743 y(con)m(tains)39
+b(B,)e(and)g(also)i(a)e(directory)i(of)f(\014les)g(designed)f(as)h(b)s
+(oundary)e(cases)i(for)g(the)g(sorting;)330 3853 y(mostly)31
+b(v)m(ery)g(rep)s(etitiv)m(e,)i(nast)m(y)e(\014les.)40
+b(565)32 b(megab)m(ytes.)225 3990 y Fh(\017)60 b Fj(A:)40
+b(directory)i(tree)g(holding)e(v)-5 b(arious)41 b(applications)g(built)
+g(from)f(source:)62 b Fi(egcs)p Fj(,)42 b Fi(gcc-2.8.1)p
+Fj(,)330 4100 y(KDE,)30 b(GTK,)h(Octa)m(v)m(e,)j(etc.)42
+b(2200)32 b(megab)m(ytes.)150 4285 y(The)i(tests)h(conducted)f(are)h
+(as)f(follo)m(ws.)53 b(Eac)m(h)34 b(test)i(means)d(compressing)i(\(a)f
+(cop)m(y)h(of)10 b(\))35 b(eac)m(h)g(\014le)f(in)150
+4394 y(the)d(data)f(set,)i(decompressing)e(it)h(and)f(comparing)h(it)g
+(against)g(the)g(original.)150 4551 y(First,)36 b(a)f(bunc)m(h)f(of)h
+(tests)g(with)g(blo)s(c)m(k)g(sizes)g(and)f(in)m(ternal)i(bu\013er)e
+(sizes)h(set)g(v)m(ery)h(small,)g(to)f(detect)150 4661
+y(an)m(y)h(problems)g(with)h(the)f(blo)s(c)m(king)h(and)f(bu\013ering)g
+(mec)m(hanisms.)59 b(This)36 b(required)g(mo)s(difying)g(the)150
+4770 y(source)31 b(co)s(de)f(so)h(as)f(to)i(try)e(to)i(break)e(it.)199
+4927 y(1.)61 b(Data)31 b(set)g(H,)g(with)f(bu\013er)g(size)h(of)f(1)h
+(b)m(yte,)h(and)d(blo)s(c)m(k)i(size)g(of)g(23)g(b)m(ytes.)199
+5065 y(2.)61 b(Data)31 b(set)g(B,)f(bu\013er)g(sizes)h(1)g(b)m(yte,)g
+(blo)s(c)m(k)g(size)g(1)g(b)m(yte.)199 5202 y(3.)61 b(As)30
+b(\(2\))h(but)f(small-mo)s(de)h(decompression.)199 5340
+y(4.)61 b(As)30 b(\(2\))h(with)g(blo)s(c)m(k)f(size)i(2)e(b)m(ytes.)p
+eop
+%%Page: 36 37
+36 36 bop 150 -116 a Fl(Chapter)30 b(4:)41 b(Miscellanea)2586
+b(36)199 299 y Fj(5.)61 b(As)30 b(\(2\))h(with)g(blo)s(c)m(k)f(size)i
+(3)e(b)m(ytes.)199 431 y(6.)61 b(As)30 b(\(2\))h(with)g(blo)s(c)m(k)f
+(size)i(4)e(b)m(ytes.)199 564 y(7.)61 b(As)30 b(\(2\))h(with)g(blo)s(c)
+m(k)f(size)i(5)e(b)m(ytes.)199 697 y(8.)61 b(As)30 b(\(2\))h(with)g
+(blo)s(c)m(k)f(size)i(6)e(b)m(ytes)h(and)f(small-mo)s(de)h
+(decompression.)199 829 y(9.)61 b(H)31 b(with)f(bu\013er)f(size)j(of)e
+(1)h(b)m(yte,)g(but)f(normal)g(blo)s(c)m(k)h(size)h(\(up)d(to)j(900000)
+h(b)m(ytes\).)150 1009 y(Then)d(some)h(tests)g(with)f(unmo)s(di\014ed)f
+(source)h(co)s(de.)199 1166 y(1.)61 b(H,)31 b(all)g(settings)g(normal.)
+199 1299 y(2.)61 b(As)30 b(\(1\),)i(with)e(small-mo)s(de)g(decompress.)
+199 1431 y(3.)61 b(H,)31 b(compress)f(with)g(\015ag)h
+Fi(-1)p Fj(.)199 1564 y(4.)61 b(H,)31 b(compress)f(with)g(\015ag)h
+Fi(-s)p Fj(,)f(decompress)g(with)g(\015ag)h Fi(-s)p Fj(.)199
+1697 y(5.)61 b(F)-8 b(orw)m(ards)31 b(compatibilit)m(y:)43
+b(H,)31 b Fi(bzip2-0.1pl2)d Fj(compressing,)j Fi(bzip2-0.9.5)c
+Fj(decompressing,)330 1806 y(all)k(settings)h(normal.)199
+1939 y(6.)61 b(Bac)m(kw)m(ards)38 b(compatibilit)m(y:)59
+b(H,)39 b Fi(bzip2-0.9.5)c Fj(compressing,)41 b Fi(bzip2-0.1pl2)35
+b Fj(decompress-)330 2048 y(ing,)c(all)g(settings)g(normal.)199
+2181 y(7.)61 b(Bigger)31 b(tests:)42 b(A,)30 b(all)h(settings)h
+(normal.)199 2314 y(8.)61 b(As)30 b(\(7\),)i(using)d(the)i(fallbac)m(k)
+g(\(Sadak)-5 b(ane-lik)m(e\))33 b(sorting)e(algorithm.)199
+2446 y(9.)61 b(As)30 b(\(8\),)i(compress)e(with)g(\015ag)h
+Fi(-1)p Fj(,)f(decompress)g(with)g(\015ag)h Fi(-s)p Fj(.)154
+2579 y(10.)61 b(H,)31 b(using)f(the)g(fallbac)m(k)i(sorting)f
+(algorithm.)154 2711 y(11.)61 b(F)-8 b(orw)m(ards)31
+b(compatibilit)m(y:)44 b(A,)31 b Fi(bzip2-0.1pl2)d Fj(compressing,)k
+Fi(bzip2-0.9.5)27 b Fj(decompressing,)330 2821 y(all)k(settings)h
+(normal.)154 2954 y(12.)61 b(Bac)m(kw)m(ards)39 b(compatibilit)m(y:)59
+b(A,)39 b Fi(bzip2-0.9.5)c Fj(compressing,)41 b Fi(bzip2-0.1pl2)36
+b Fj(decompress-)330 3063 y(ing,)31 b(all)g(settings)g(normal.)154
+3196 y(13.)61 b(Misc)38 b(test:)57 b(ab)s(out)37 b(400)i(megab)m(ytes)g
+(of)f Fi(.tar)f Fj(\014les)g(with)h Fi(bzip2)e Fj(compiled)i(with)g
+(Chec)m(k)m(er)g(\(a)330 3305 y(memory)31 b(access)g(error)g(detector,)
+h(lik)m(e)g(Purify\).)154 3438 y(14.)61 b(Misc)31 b(tests)h(to)f(mak)m
+(e)g(sure)f(it)h(builds)e(and)h(runs)f(ok)h(on)h(non-Lin)m(ux/x86)f
+(platforms.)150 3618 y(These)k(tests)g(w)m(ere)h(conducted)e(on)h(a)f
+(225)i(MHz)f(IDT)g(WinChip)e(mac)m(hine,)j(running)d(Lin)m(ux)g
+(2.0.36.)150 3728 y(They)c(represen)m(t)h(nearly)g(a)f(w)m(eek)h(of)f
+(con)m(tin)m(uous)h(computation.)41 b(All)29 b(tests)g(completed)g
+(successfully)-8 b(.)150 4003 y Fk(4.6)68 b(F)-11 b(urther)44
+b(reading)150 4196 y Fi(bzip2)26 b Fj(is)h(not)h(researc)m(h)g(w)m
+(ork,)g(in)f(the)h(sense)f(that)h(it)g(do)s(esn't)f(presen)m(t)h(an)m
+(y)f(new)g(ideas.)40 b(Rather,)28 b(it's)150 4306 y(an)i(engineering)h
+(exercise)h(based)e(on)g(existing)i(ideas.)150 4463 y(F)-8
+b(our)31 b(do)s(cumen)m(ts)f(describ)s(e)g(essen)m(tially)i(all)f(the)g
+(ideas)f(b)s(ehind)f Fi(bzip2)p Fj(:)390 4614 y Fi(Michael)46
+b(Burrows)g(and)h(D.)g(J.)g(Wheeler:)485 4717 y("A)h(block-sorting)c
+(lossless)h(data)i(compression)e(algorithm")533 4821
+y(10th)i(May)g(1994.)533 4925 y(Digital)f(SRC)h(Research)e(Report)i
+(124.)533 5029 y(ftp://ftp.digital.com/pub)o(/DEC)o(/SR)o(C/re)o(sear)o
+(ch-)o(repo)o(rts/)o(SRC)o(-124)o(.ps.)o(gz)533 5132
+y(If)g(you)g(have)g(trouble)f(finding)g(it,)g(try)h(searching)f(at)h
+(the)533 5236 y(New)g(Zealand)f(Digital)g(Library,)f
+(http://www.nzdl.org.)p eop
+%%Page: 37 38
+37 37 bop 150 -116 a Fl(Chapter)30 b(4:)41 b(Miscellanea)2586
+b(37)390 299 y Fi(Daniel)46 b(S.)h(Hirschberg)e(and)i(Debra)g(A.)g
+(LeLewer)485 403 y("Efficient)e(Decoding)h(of)h(Prefix)f(Codes")533
+506 y(Communications)e(of)j(the)g(ACM,)g(April)f(1990,)h(Vol)f(33,)h
+(Number)f(4.)533 610 y(You)h(might)f(be)i(able)e(to)h(get)g(an)h
+(electronic)d(copy)h(of)h(this)676 714 y(from)g(the)g(ACM)g(Digital)f
+(Library.)390 922 y(David)g(J.)i(Wheeler)533 1025 y(Program)e(bred3.c)g
+(and)h(accompanying)d(document)i(bred3.ps.)533 1129 y(This)h(contains)e
+(the)i(idea)g(behind)f(the)h(multi-table)e(Huffman)533
+1233 y(coding)h(scheme.)533 1337 y(ftp://ftp.cl.cam.ac.uk/us)o(ers/)o
+(djw)o(3/)390 1544 y(Jon)h(L.)g(Bentley)f(and)h(Robert)f(Sedgewick)485
+1648 y("Fast)h(Algorithms)e(for)i(Sorting)f(and)g(Searching)g(Strings")
+533 1752 y(Available)f(from)i(Sedgewick's)e(web)i(page,)533
+1856 y(www.cs.princeton.edu/~rs)150 2012 y Fj(The)29
+b(follo)m(wing)h(pap)s(er)d(giv)m(es)j(v)-5 b(aluable)29
+b(additional)g(insigh)m(ts)g(in)m(to)h(the)f(algorithm,)h(but)e(is)h
+(not)g(imme-)150 2122 y(diately)i(the)g(basis)f(of)h(an)m(y)f(co)s(de)h
+(used)e(in)h(bzip2.)390 2273 y Fi(Peter)46 b(Fenwick:)533
+2377 y(Block)h(Sorting)e(Text)i(Compression)533 2481
+y(Proceedings)e(of)i(the)g(19th)g(Australasian)d(Computer)i(Science)f
+(Conference,)629 2584 y(Melbourne,)g(Australia.)92 b(Jan)47
+b(31)g(-)h(Feb)f(2,)g(1996.)533 2688 y(ftp://ftp.cs.auckland.ac.)o
+(nz/p)o(ub/)o(pete)o(r-f/)o(ACS)o(C96p)o(aper)o(.ps)150
+2845 y Fj(Kunihik)m(o)30 b(Sadak)-5 b(ane's)30 b(sorting)i(algorithm,)f
+(men)m(tioned)g(ab)s(o)m(v)m(e,)h(is)e(a)m(v)-5 b(ailable)32
+b(from:)390 2996 y Fi(http://naomi.is.s.u-toky)o(o.ac)o(.jp/)o(~sa)o
+(da/p)o(aper)o(s/S)o(ada9)o(8b.p)o(s.g)o(z)150 3153 y
+Fj(The)38 b(Man)m(b)s(er-My)m(ers)h(su\016x)e(arra)m(y)i(construction)g
+(algorithm)h(is)e(describ)s(ed)f(in)h(a)g(pap)s(er)f(a)m(v)-5
+b(ailable)150 3262 y(from:)390 3413 y Fi(http://www.cs.arizona.ed)o
+(u/pe)o(ople)o(/ge)o(ne/P)o(APER)o(S/s)o(uffi)o(x.ps)150
+3570 y Fj(Finally)d(,)33 b(the)e(follo)m(wing)i(pap)s(er)d(do)s(cumen)m
+(ts)h(some)g(recen)m(t)i(in)m(v)m(estigations)h(I)d(made)g(in)m(to)i
+(the)e(p)s(erfor-)150 3680 y(mance)g(of)f(sorting)h(algorithms:)390
+3831 y Fi(Julian)46 b(Seward:)533 3935 y(On)h(the)g(Performance)e(of)i
+(BWT)g(Sorting)f(Algorithms)533 4038 y(Proceedings)f(of)i(the)g(IEEE)g
+(Data)f(Compression)f(Conference)g(2000)629 4142 y(Snowbird,)g(Utah.)94
+b(28-30)46 b(March)h(2000.)p eop
+%%Page: -1 39
+-1 38 bop 3725 -116 a Fl(i)150 299 y Fg(T)-13 b(able)54
+b(of)g(Con)l(ten)l(ts)150 641 y Fk(1)135 b(In)l(tro)t(duction)15
+b Fa(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f
+(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)60
+b Fk(2)150 911 y(2)135 b(Ho)l(w)45 b(to)h(use)f Fc(bzip2)31
+b Fa(.)19 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g
+(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)78 b Fk(3)1047
+1048 y Fj(NAME)18 b Fb(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fl(3)1047
+1157 y Fj(SYNOPSIS)18 b Fb(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fl(3)1047 1267 y Fj(DESCRIPTION)28
+b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)59
+b Fl(3)1047 1377 y Fj(OPTIONS)16 b Fb(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Fl(4)1047
+1486 y Fj(MEMOR)-8 b(Y)31 b(MANA)m(GEMENT)9 b Fb(.)16
+b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)39 b Fl(6)1047 1596 y Fj(RECO)m(VERING)30 b(D)m(A)-8
+b(T)g(A)31 b(FR)m(OM)g(D)m(AMA)m(GED)g(FILES)1256 1705
+y Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Fl(7)1047 1815 y
+Fj(PERF)m(ORMANCE)30 b(NOTES)10 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40
+b Fl(8)1047 1924 y Fj(CA)-10 b(VEA)i(TS)12 b Fb(.)h(.)i(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42
+b Fl(8)1047 2034 y Fj(A)m(UTHOR)22 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)52 b
+Fl(8)150 2276 y Fk(3)135 b(Programming)46 b(with)f Fc(libbzip2)27
+b Fa(.)16 b(.)j(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)72
+b Fk(10)449 2413 y Fj(3.1)92 b(T)-8 b(op-lev)m(el)33
+b(structure)18 b Fb(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)47 b Fl(10)748 2523 y Fj(3.1.1)93
+b(Lo)m(w-lev)m(el)32 b(summary)20 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)50 b Fl(10)748 2633 y Fj(3.1.2)93 b(High-lev)m(el)32
+b(summary)27 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57
+b Fl(10)748 2742 y Fj(3.1.3)93 b(Utilit)m(y)32 b(functions)e(summary)10
+b Fb(.)k(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)39 b Fl(11)449 2852 y Fj(3.2)92 b(Error)30
+b(handling)15 b Fb(.)f(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)44 b Fl(11)449
+2961 y Fj(3.3)92 b(Lo)m(w-lev)m(el)32 b(in)m(terface)26
+b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)53 b Fl(13)748 3071 y Fj(3.3.1)93 b Fi(BZ2_bzCompressInit)
+21 b Fb(.)9 b(.)15 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)50 b Fl(13)748
+3181 y Fj(3.3.2)93 b Fi(BZ2_bzCompress)9 b Fb(.)h(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Fl(15)748
+3290 y Fj(3.3.3)93 b Fi(BZ2_bzCompressEnd)23 b Fb(.)10
+b(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)52 b Fl(18)748 3400
+y Fj(3.3.4)93 b Fi(BZ2_bzDecompressInit)16 b Fb(.)9 b(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)45 b Fl(18)748 3509 y Fj(3.3.5)93
+b Fi(BZ2_bzDecompress)21 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)55 b Fl(18)748 3619 y Fj(3.3.6)93 b Fi(BZ2_bzDecompressEnd)18
+b Fb(.)10 b(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fl(20)449
+3729 y Fj(3.4)92 b(High-lev)m(el)33 b(in)m(terface)9
+b Fb(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)38 b Fl(20)748 3838 y Fj(3.4.1)93 b Fi(BZ2_bzReadOpen)9
+b Fb(.)h(.)15 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38
+b Fl(20)748 3948 y Fj(3.4.2)93 b Fi(BZ2_bzRead)18 b Fb(.)12
+b(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47
+b Fl(21)748 4057 y Fj(3.4.3)93 b Fi(BZ2_bzReadGetUnused)18
+b Fb(.)10 b(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fl(23)748
+4167 y Fj(3.4.4)93 b Fi(BZ2_bzReadClose)23 b Fb(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Fl(23)748
+4276 y Fj(3.4.5)93 b Fi(BZ2_bzWriteOpen)23 b Fb(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Fl(23)748
+4386 y Fj(3.4.6)93 b Fi(BZ2_bzWrite)16 b Fb(.)11 b(.)k(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)45 b Fl(24)748
+4496 y Fj(3.4.7)93 b Fi(BZ2_bzWriteClose)21 b Fb(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Fl(25)748
+4605 y Fj(3.4.8)93 b(Handling)30 b(em)m(b)s(edded)f(compressed)h(data)h
+(streams)9 b Fb(.)15 b(.)g(.)g(.)38 b Fl(25)748 4715
+y Fj(3.4.9)93 b(Standard)29 b(\014le-reading/writing)j(co)s(de)16
+b Fb(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)45
+b Fl(26)449 4824 y Fj(3.5)92 b(Utilit)m(y)32 b(functions)c
+Fb(.)15 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)57 b Fl(27)748 4934 y Fj(3.5.1)93
+b Fi(BZ2_bzBuffToBuffCompres)o(s)22 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)57 b Fl(27)748
+5044 y Fj(3.5.2)93 b Fi(BZ2_bzBuffToBuffDecompr)o(ess)17
+b Fb(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+53 b Fl(28)449 5153 y Fj(3.6)92 b Fi(zlib)29 b Fj(compatibilit)m(y)k
+(functions)23 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)52
+b Fl(29)449 5263 y Fj(3.7)92 b(Using)30 b(the)h(library)f(in)g(a)h
+Fi(stdio)p Fj(-free)f(en)m(vironmen)m(t)12 b Fb(.)k(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)41 b Fl(30)p eop
+%%Page: -2 40
+-2 39 bop 3699 -116 a Fl(ii)748 83 y Fj(3.7.1)93 b(Getting)32
+b(rid)e(of)g Fi(stdio)17 b Fb(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46
+b Fl(30)748 193 y Fj(3.7.2)93 b(Critical)31 b(error)g(handling)18
+b Fb(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Fl(30)449 302 y
+Fj(3.8)92 b(Making)31 b(a)f(Windo)m(ws)g(DLL)17 b Fb(.)d(.)h(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Fl(31)150
+545 y Fk(4)135 b(Miscellanea)11 b Fa(.)21 b(.)f(.)f(.)h(.)f(.)g(.)h(.)f
+(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)g(.)h(.)56 b Fk(32)449 682 y Fj(4.1)92 b(Limitations)31
+b(of)g(the)g(compressed)f(\014le)g(format)c Fb(.)15 b(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)54 b Fl(32)449
+791 y Fj(4.2)92 b(P)m(ortabilit)m(y)33 b(issues)12 b
+Fb(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)41 b Fl(33)449 901 y Fj(4.3)92 b(Rep)s(orting)31
+b(bugs)24 b Fb(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Fl(33)449 1010
+y Fj(4.4)92 b(Did)30 b(y)m(ou)g(get)i(the)f(righ)m(t)g(pac)m(k)-5
+b(age?)18 b Fb(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)47 b Fl(35)449
+1120 y Fj(4.5)92 b(T)-8 b(esting)16 b Fb(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)46 b Fl(35)449 1230 y Fj(4.6)92 b(F)-8
+b(urther)30 b(reading)17 b Fb(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b
+Fl(36)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/Build/source/utils/bzip2/manual.texi b/Build/source/utils/bzip2/manual.texi
new file mode 100644
index 00000000000..5bc27d5f9f9
--- /dev/null
+++ b/Build/source/utils/bzip2/manual.texi
@@ -0,0 +1,2243 @@
+\input texinfo @c -*- Texinfo -*-
+@setfilename bzip2.info
+
+@ignore
+This file documents bzip2 version 1.0.2, and associated library
+libbzip2, written by Julian Seward (jseward@acm.org).
+
+Copyright (C) 1996-2002 Julian R Seward
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for verbatim copies.
+@end ignore
+
+@ifinfo
+@format
+START-INFO-DIR-ENTRY
+* Bzip2: (bzip2). A program and library for data compression.
+END-INFO-DIR-ENTRY
+@end format
+
+@end ifinfo
+
+@iftex
+@c @finalout
+@settitle bzip2 and libbzip2
+@titlepage
+@title bzip2 and libbzip2
+@subtitle a program and library for data compression
+@subtitle copyright (C) 1996-2002 Julian Seward
+@subtitle version 1.0.2 of 30 December 2001
+@author Julian Seward
+
+@end titlepage
+
+@parindent 0mm
+@parskip 2mm
+
+@end iftex
+@node Top,,, (dir)
+
+The following text is the License for this software. You should
+find it identical to that contained in the file LICENSE in the
+source distribution.
+
+@bf{------------------ START OF THE LICENSE ------------------}
+
+This program, @code{bzip2},
+and associated library @code{libbzip2}, are
+Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+@itemize @bullet
+@item
+ Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+@item
+ The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+@item
+ Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+@item
+ The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+@end itemize
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Julian Seward, Cambridge, UK.
+
+@code{jseward@@acm.org}
+
+@code{bzip2}/@code{libbzip2} version 1.0.2 of 30 December 2001.
+
+@bf{------------------ END OF THE LICENSE ------------------}
+
+Web sites:
+
+@code{http://sources.redhat.com/bzip2}
+
+@code{http://www.cacheprof.org}
+
+PATENTS: To the best of my knowledge, @code{bzip2} does not use any patented
+algorithms. However, I do not have the resources available to carry out
+a full patent search. Therefore I cannot give any guarantee of the
+above statement.
+
+
+
+
+
+
+
+@chapter Introduction
+
+@code{bzip2} compresses files using the Burrows-Wheeler
+block-sorting text compression algorithm, and Huffman coding.
+Compression is generally considerably better than that
+achieved by more conventional LZ77/LZ78-based compressors,
+and approaches the performance of the PPM family of statistical compressors.
+
+@code{bzip2} is built on top of @code{libbzip2}, a flexible library
+for handling compressed data in the @code{bzip2} format. This manual
+describes both how to use the program and
+how to work with the library interface. Most of the
+manual is devoted to this library, not the program,
+which is good news if your interest is only in the program.
+
+Chapter 2 describes how to use @code{bzip2}; this is the only part
+you need to read if you just want to know how to operate the program.
+Chapter 3 describes the programming interfaces in detail, and
+Chapter 4 records some miscellaneous notes which I thought
+ought to be recorded somewhere.
+
+
+@chapter How to use @code{bzip2}
+
+This chapter contains a copy of the @code{bzip2} man page,
+and nothing else.
+
+@quotation
+
+@unnumberedsubsubsec NAME
+@itemize
+@item @code{bzip2}, @code{bunzip2}
+- a block-sorting file compressor, v1.0.2
+@item @code{bzcat}
+- decompresses files to stdout
+@item @code{bzip2recover}
+- recovers data from damaged bzip2 files
+@end itemize
+
+@unnumberedsubsubsec SYNOPSIS
+@itemize
+@item @code{bzip2} [ -cdfkqstvzVL123456789 ] [ filenames ... ]
+@item @code{bunzip2} [ -fkvsVL ] [ filenames ... ]
+@item @code{bzcat} [ -s ] [ filenames ... ]
+@item @code{bzip2recover} filename
+@end itemize
+
+@unnumberedsubsubsec DESCRIPTION
+
+@code{bzip2} compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding. Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+
+The command-line options are deliberately very similar to those of GNU
+@code{gzip}, but they are not identical.
+
+@code{bzip2} expects a list of file names to accompany the command-line
+flags. Each file is replaced by a compressed version of itself, with
+the name @code{original_name.bz2}. Each compressed file has the same
+modification date, permissions, and, when possible, ownership as the
+corresponding original, so that these properties can be correctly
+restored at decompression time. File name handling is naive in the
+sense that there is no mechanism for preserving original file names,
+permissions, ownerships or dates in filesystems which lack these
+concepts, or have serious file name length restrictions, such as MS-DOS.
+
+@code{bzip2} and @code{bunzip2} will by default not overwrite existing
+files. If you want this to happen, specify the @code{-f} flag.
+
+If no file names are specified, @code{bzip2} compresses from standard
+input to standard output. In this case, @code{bzip2} will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+@code{bunzip2} (or @code{bzip2 -d}) decompresses all
+specified files. Files which were not created by @code{bzip2}
+will be detected and ignored, and a warning issued.
+@code{bzip2} attempts to guess the filename for the decompressed file
+from that of the compressed file as follows:
+@itemize
+@item @code{filename.bz2 } becomes @code{filename}
+@item @code{filename.bz } becomes @code{filename}
+@item @code{filename.tbz2} becomes @code{filename.tar}
+@item @code{filename.tbz } becomes @code{filename.tar}
+@item @code{anyothername } becomes @code{anyothername.out}
+@end itemize
+If the file does not end in one of the recognised endings,
+@code{.bz2}, @code{.bz},
+@code{.tbz2} or @code{.tbz}, @code{bzip2} complains that it cannot
+guess the name of the original file, and uses the original name
+with @code{.out} appended.
+
+As with compression, supplying no
+filenames causes decompression from standard input to standard output.
+
+@code{bunzip2} will correctly decompress a file which is the
+concatenation of two or more compressed files. The result is the
+concatenation of the corresponding uncompressed files. Integrity
+testing (@code{-t}) of concatenated compressed files is also supported.
+
+You can also compress or decompress files to the standard output by
+giving the @code{-c} flag. Multiple files may be compressed and
+decompressed like this. The resulting outputs are fed sequentially to
+stdout. Compression of multiple files in this manner generates a stream
+containing multiple compressed file representations. Such a stream
+can be decompressed correctly only by @code{bzip2} version 0.9.0 or
+later. Earlier versions of @code{bzip2} will stop after decompressing
+the first file in the stream.
+
+@code{bzcat} (or @code{bzip2 -dc}) decompresses all specified files to
+the standard output.
+
+@code{bzip2} will read arguments from the environment variables
+@code{BZIP2} and @code{BZIP}, in that order, and will process them
+before any arguments read from the command line. This gives a
+convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed file is slightly
+larger than the original. Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes. Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+
+As a self-check for your protection, @code{bzip2} uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original. This guards against corruption of the compressed data, and
+against undetected bugs in @code{bzip2} (hopefully very unlikely). The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed. Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong. It can't help you recover the original uncompressed
+data. You can use @code{bzip2recover} to try to recover data from
+damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused @code{bzip2} to panic.
+
+
+@unnumberedsubsubsec OPTIONS
+@table @code
+@item -c --stdout
+Compress or decompress to standard output.
+@item -d --decompress
+Force decompression. @code{bzip2}, @code{bunzip2} and @code{bzcat} are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used. This flag overrides that
+mechanism, and forces bzip2 to decompress.
+@item -z --compress
+The complement to @code{-d}: forces compression, regardless of the
+invokation name.
+@item -t --test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+@item -f --force
+Force overwrite of output files. Normally, @code{bzip2} will not overwrite
+existing output files. Also forces @code{bzip2} to break hard links
+to files, which it otherwise wouldn't do.
+
+@code{bzip2} normally declines to decompress files which don't have the
+correct magic header bytes. If forced (@code{-f}), however, it will
+pass such files through unmodified. This is how GNU @code{gzip}
+behaves.
+@item -k --keep
+Keep (don't delete) input files during compression
+or decompression.
+@item -s --small
+Reduce memory usage, for compression, decompression and testing. Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte. This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+
+During compression, @code{-s} selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio. In short, if your machine is low on memory (8 megabytes or
+less), use -s for everything. See MEMORY MANAGEMENT below.
+@item -q --quiet
+Suppress non-essential warning messages. Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+@item -v --verbose
+Verbose mode -- show the compression ratio for each file processed.
+Further @code{-v}'s increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+@item -L --license -V --version
+Display the software version, license terms and conditions.
+@item -1 (or --fast) to -9 (or --best)
+Set the block size to 100 k, 200 k .. 900 k when compressing. Has no
+effect when decompressing. See MEMORY MANAGEMENT below.
+The @code{--fast} and @code{--best} aliases are primarily for GNU
+@code{gzip} compatibility. In particular, @code{--fast} doesn't make
+things significantly faster. And @code{--best} merely selects the
+default behaviour.
+@item --
+Treats all subsequent arguments as file names, even if they start
+with a dash. This is so you can handle files with names beginning
+with a dash, for example: @code{bzip2 -- -myfilename}.
+@item --repetitive-fast
+@item --repetitive-best
+These flags are redundant in versions 0.9.5 and above. They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful. 0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+@end table
+
+
+@unnumberedsubsubsec MEMORY MANAGEMENT
+
+@code{bzip2} compresses large files in blocks. The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression. The flags @code{-1} through @code{-9}
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively. At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+@code{bunzip2} then allocates itself just enough memory to decompress
+the file. Since block sizes are stored in compressed files, it follows
+that the flags @code{-1} to @code{-9} are irrelevant to and so ignored
+during decompression.
+
+Compression and decompression requirements, in bytes, can be estimated
+as:
+@example
+ Compression: 400k + ( 8 x block size )
+
+ Decompression: 100k + ( 4 x block size ), or
+ 100k + ( 2.5 x block size )
+@end example
+Larger block sizes give rapidly diminishing marginal returns. Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using @code{bzip2} on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+
+For files compressed with the default 900k block size, @code{bunzip2}
+will require about 3700 kbytes to decompress. To support decompression
+of any file on a 4 megabyte machine, @code{bunzip2} has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes. Decompression speed is also halved, so you should use this
+option only where necessary. The relevant flag is @code{-s}.
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved. Compression and
+decompression speed are virtually unaffected by block size.
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size. The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block. For example, compressing a file
+20,000 bytes long with the flag @code{-9} will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it. Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+
+Here is a table which summarises the maximum memory usage for different
+block sizes. Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes. This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+@example
+ Compress Decompress Decompress Corpus
+ Flag usage usage -s usage Size
+
+ -1 1200k 500k 350k 914704
+ -2 2000k 900k 600k 877703
+ -3 2800k 1300k 850k 860338
+ -4 3600k 1700k 1100k 846899
+ -5 4400k 2100k 1350k 845160
+ -6 5200k 2500k 1600k 838626
+ -7 6100k 2900k 1850k 834096
+ -8 6800k 3300k 2100k 828642
+ -9 7600k 3700k 2350k 828642
+@end example
+
+@unnumberedsubsubsec RECOVERING DATA FROM DAMAGED FILES
+
+@code{bzip2} compresses files in blocks, usually 900kbytes long. Each
+block is handled independently. If a media or transmission error causes
+a multi-block @code{.bz2} file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty. Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+
+@code{bzip2recover} is a simple program whose purpose is to search for
+blocks in @code{.bz2} files, and write each block out into its own
+@code{.bz2} file. You can then use @code{bzip2 -t} to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+
+@code{bzip2recover}
+takes a single argument, the name of the damaged file, and writes a
+number of files @code{rec00001file.bz2}, @code{rec00002file.bz2}, etc,
+containing the extracted blocks. The output filenames are designed so
+that the use of wildcards in subsequent processing -- for example,
+@code{bzip2 -dc rec*file.bz2 > recovered_data} -- processes the files in
+the correct order.
+
+@code{bzip2recover} should be of most use dealing with large @code{.bz2}
+files, as these will contain many blocks. It is clearly futile to use
+it on damaged single-block files, since a damaged block cannot be
+recovered. If you wish to minimise any potential data loss through
+media or transmission errors, you might consider compressing with a
+smaller block size.
+
+
+@unnumberedsubsubsec PERFORMANCE NOTES
+
+The sorting phase of compression gathers together similar strings in the
+file. Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..." (repeated several hundred times) may
+compress more slowly than normal. Versions 0.9.5 and above fare much
+better than previous versions in this respect. The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1. You can use the
+@code{-vvvv} option to monitor progress in great detail, if you want.
+
+Decompression speed is unaffected by these phenomena.
+
+@code{bzip2} usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion. This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine @code{bzip2} will perform best on machines with very large
+caches.
+
+
+@unnumberedsubsubsec CAVEATS
+
+I/O error messages are not as helpful as they could be. @code{bzip2}
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+
+This manual page pertains to version 1.0.2 of @code{bzip2}. Compressed
+data created by this version is entirely forwards and backwards
+compatible with the previous public releases, versions 0.1pl2, 0.9.0,
+0.9.5, 1.0.0 and 1.0.1, but with the following exception: 0.9.0 and
+above can correctly decompress multiple concatenated compressed files.
+0.1pl2 cannot do this; it will stop after decompressing just the first
+file in the stream.
+
+@code{bzip2recover} versions prior to this one, 1.0.2, used 32-bit
+integers to represent bit positions in compressed files, so it could not
+handle compressed files more than 512 megabytes long. Version 1.0.2 and
+above uses 64-bit ints on some platforms which support them (GNU
+supported targets, and Windows). To establish whether or not
+@code{bzip2recover} was built with such a limitation, run it without
+arguments. In any event you can build yourself an unlimited version if
+you can recompile it with @code{MaybeUInt64} set to be an unsigned
+64-bit integer.
+
+
+
+@unnumberedsubsubsec AUTHOR
+Julian Seward, @code{jseward@@acm.org}.
+
+@code{http://sources.redhat.com/bzip2}
+
+The ideas embodied in @code{bzip2} are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original @code{bzip},
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original @code{bzip}). I am much
+indebted for their help, support and advice. See the manual in the
+source distribution for pointers to sources of documentation. Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression. Bela Lubkin encouraged me to improve the
+worst-case compression performance. The @code{bz*} scripts are derived
+from those of GNU @code{gzip}. Many people sent patches, helped with
+portability problems, lent machines, gave advice and were generally
+helpful.
+
+@end quotation
+
+
+
+
+@chapter Programming with @code{libbzip2}
+
+This chapter describes the programming interface to @code{libbzip2}.
+
+For general background information, particularly about memory
+use and performance aspects, you'd be well advised to read Chapter 2
+as well.
+
+@section Top-level structure
+
+@code{libbzip2} is a flexible library for compressing and decompressing
+data in the @code{bzip2} data format. Although packaged as a single
+entity, it helps to regard the library as three separate parts: the low
+level interface, and the high level interface, and some utility
+functions.
+
+The structure of @code{libbzip2}'s interfaces is similar to
+that of Jean-loup Gailly's and Mark Adler's excellent @code{zlib}
+library.
+
+All externally visible symbols have names beginning @code{BZ2_}.
+This is new in version 1.0. The intention is to minimise pollution
+of the namespaces of library clients.
+
+@subsection Low-level summary
+
+This interface provides services for compressing and decompressing
+data in memory. There's no provision for dealing with files, streams
+or any other I/O mechanisms, just straight memory-to-memory work.
+In fact, this part of the library can be compiled without inclusion
+of @code{stdio.h}, which may be helpful for embedded applications.
+
+The low-level part of the library has no global variables and
+is therefore thread-safe.
+
+Six routines make up the low level interface:
+@code{BZ2_bzCompressInit}, @code{BZ2_bzCompress}, and @* @code{BZ2_bzCompressEnd}
+for compression,
+and a corresponding trio @code{BZ2_bzDecompressInit}, @* @code{BZ2_bzDecompress}
+and @code{BZ2_bzDecompressEnd} for decompression.
+The @code{*Init} functions allocate
+memory for compression/decompression and do other
+initialisations, whilst the @code{*End} functions close down operations
+and release memory.
+
+The real work is done by @code{BZ2_bzCompress} and @code{BZ2_bzDecompress}.
+These compress and decompress data from a user-supplied input buffer
+to a user-supplied output buffer. These buffers can be any size;
+arbitrary quantities of data are handled by making repeated calls
+to these functions. This is a flexible mechanism allowing a
+consumer-pull style of activity, or producer-push, or a mixture of
+both.
+
+
+
+@subsection High-level summary
+
+This interface provides some handy wrappers around the low-level
+interface to facilitate reading and writing @code{bzip2} format
+files (@code{.bz2} files). The routines provide hooks to facilitate
+reading files in which the @code{bzip2} data stream is embedded
+within some larger-scale file structure, or where there are
+multiple @code{bzip2} data streams concatenated end-to-end.
+
+For reading files, @code{BZ2_bzReadOpen}, @code{BZ2_bzRead},
+@code{BZ2_bzReadClose} and @* @code{BZ2_bzReadGetUnused} are supplied. For
+writing files, @code{BZ2_bzWriteOpen}, @code{BZ2_bzWrite} and
+@code{BZ2_bzWriteFinish} are available.
+
+As with the low-level library, no global variables are used
+so the library is per se thread-safe. However, if I/O errors
+occur whilst reading or writing the underlying compressed files,
+you may have to consult @code{errno} to determine the cause of
+the error. In that case, you'd need a C library which correctly
+supports @code{errno} in a multithreaded environment.
+
+To make the library a little simpler and more portable,
+@code{BZ2_bzReadOpen} and @code{BZ2_bzWriteOpen} require you to pass them file
+handles (@code{FILE*}s) which have previously been opened for reading or
+writing respectively. That avoids portability problems associated with
+file operations and file attributes, whilst not being much of an
+imposition on the programmer.
+
+
+
+@subsection Utility functions summary
+For very simple needs, @code{BZ2_bzBuffToBuffCompress} and
+@code{BZ2_bzBuffToBuffDecompress} are provided. These compress
+data in memory from one buffer to another buffer in a single
+function call. You should assess whether these functions
+fulfill your memory-to-memory compression/decompression
+requirements before investing effort in understanding the more
+general but more complex low-level interface.
+
+Yoshioka Tsuneo (@code{QWF00133@@niftyserve.or.jp} /
+@code{tsuneo-y@@is.aist-nara.ac.jp}) has contributed some functions to
+give better @code{zlib} compatibility. These functions are
+@code{BZ2_bzopen}, @code{BZ2_bzread}, @code{BZ2_bzwrite}, @code{BZ2_bzflush},
+@code{BZ2_bzclose},
+@code{BZ2_bzerror} and @code{BZ2_bzlibVersion}. You may find these functions
+more convenient for simple file reading and writing, than those in the
+high-level interface. These functions are not (yet) officially part of
+the library, and are minimally documented here. If they break, you
+get to keep all the pieces. I hope to document them properly when time
+permits.
+
+Yoshioka also contributed modifications to allow the library to be
+built as a Windows DLL.
+
+
+@section Error handling
+
+The library is designed to recover cleanly in all situations, including
+the worst-case situation of decompressing random data. I'm not
+100% sure that it can always do this, so you might want to add
+a signal handler to catch segmentation violations during decompression
+if you are feeling especially paranoid. I would be interested in
+hearing more about the robustness of the library to corrupted
+compressed data.
+
+Version 1.0 is much more robust in this respect than
+0.9.0 or 0.9.5. Investigations with Checker (a tool for
+detecting problems with memory management, similar to Purify)
+indicate that, at least for the few files I tested, all single-bit
+errors in the decompressed data are caught properly, with no
+segmentation faults, no reads of uninitialised data and no
+out of range reads or writes. So it's certainly much improved,
+although I wouldn't claim it to be totally bombproof.
+
+The file @code{bzlib.h} contains all definitions needed to use
+the library. In particular, you should definitely not include
+@code{bzlib_private.h}.
+
+In @code{bzlib.h}, the various return values are defined. The following
+list is not intended as an exhaustive description of the circumstances
+in which a given value may be returned -- those descriptions are given
+later. Rather, it is intended to convey the rough meaning of each
+return value. The first five actions are normal and not intended to
+denote an error situation.
+@table @code
+@item BZ_OK
+The requested action was completed successfully.
+@item BZ_RUN_OK
+@itemx BZ_FLUSH_OK
+@itemx BZ_FINISH_OK
+In @code{BZ2_bzCompress}, the requested flush/finish/nothing-special action
+was completed successfully.
+@item BZ_STREAM_END
+Compression of data was completed, or the logical stream end was
+detected during decompression.
+@end table
+
+The following return values indicate an error of some kind.
+@table @code
+@item BZ_CONFIG_ERROR
+Indicates that the library has been improperly compiled on your
+platform -- a major configuration error. Specifically, it means
+that @code{sizeof(char)}, @code{sizeof(short)} and @code{sizeof(int)}
+are not 1, 2 and 4 respectively, as they should be. Note that the
+library should still work properly on 64-bit platforms which follow
+the LP64 programming model -- that is, where @code{sizeof(long)}
+and @code{sizeof(void*)} are 8. Under LP64, @code{sizeof(int)} is
+still 4, so @code{libbzip2}, which doesn't use the @code{long} type,
+is OK.
+@item BZ_SEQUENCE_ERROR
+When using the library, it is important to call the functions in the
+correct sequence and with data structures (buffers etc) in the correct
+states. @code{libbzip2} checks as much as it can to ensure this is
+happening, and returns @code{BZ_SEQUENCE_ERROR} if not. Code which
+complies precisely with the function semantics, as detailed below,
+should never receive this value; such an event denotes buggy code
+which you should investigate.
+@item BZ_PARAM_ERROR
+Returned when a parameter to a function call is out of range
+or otherwise manifestly incorrect. As with @code{BZ_SEQUENCE_ERROR},
+this denotes a bug in the client code. The distinction between
+@code{BZ_PARAM_ERROR} and @code{BZ_SEQUENCE_ERROR} is a bit hazy, but still worth
+making.
+@item BZ_MEM_ERROR
+Returned when a request to allocate memory failed. Note that the
+quantity of memory needed to decompress a stream cannot be determined
+until the stream's header has been read. So @code{BZ2_bzDecompress} and
+@code{BZ2_bzRead} may return @code{BZ_MEM_ERROR} even though some of
+the compressed data has been read. The same is not true for
+compression; once @code{BZ2_bzCompressInit} or @code{BZ2_bzWriteOpen} have
+successfully completed, @code{BZ_MEM_ERROR} cannot occur.
+@item BZ_DATA_ERROR
+Returned when a data integrity error is detected during decompression.
+Most importantly, this means when stored and computed CRCs for the
+data do not match. This value is also returned upon detection of any
+other anomaly in the compressed data.
+@item BZ_DATA_ERROR_MAGIC
+As a special case of @code{BZ_DATA_ERROR}, it is sometimes useful to
+know when the compressed stream does not start with the correct
+magic bytes (@code{'B' 'Z' 'h'}).
+@item BZ_IO_ERROR
+Returned by @code{BZ2_bzRead} and @code{BZ2_bzWrite} when there is an error
+reading or writing in the compressed file, and by @code{BZ2_bzReadOpen}
+and @code{BZ2_bzWriteOpen} for attempts to use a file for which the
+error indicator (viz, @code{ferror(f)}) is set.
+On receipt of @code{BZ_IO_ERROR}, the caller should consult
+@code{errno} and/or @code{perror} to acquire operating-system
+specific information about the problem.
+@item BZ_UNEXPECTED_EOF
+Returned by @code{BZ2_bzRead} when the compressed file finishes
+before the logical end of stream is detected.
+@item BZ_OUTBUFF_FULL
+Returned by @code{BZ2_bzBuffToBuffCompress} and
+@code{BZ2_bzBuffToBuffDecompress} to indicate that the output data
+will not fit into the output buffer provided.
+@end table
+
+
+
+@section Low-level interface
+
+@subsection @code{BZ2_bzCompressInit}
+@example
+typedef
+ struct @{
+ char *next_in;
+ unsigned int avail_in;
+ unsigned int total_in_lo32;
+ unsigned int total_in_hi32;
+
+ char *next_out;
+ unsigned int avail_out;
+ unsigned int total_out_lo32;
+ unsigned int total_out_hi32;
+
+ void *state;
+
+ void *(*bzalloc)(void *,int,int);
+ void (*bzfree)(void *,void *);
+ void *opaque;
+ @}
+ bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm,
+ int blockSize100k,
+ int verbosity,
+ int workFactor );
+
+@end example
+
+Prepares for compression. The @code{bz_stream} structure
+holds all data pertaining to the compression activity.
+A @code{bz_stream} structure should be allocated and initialised
+prior to the call.
+The fields of @code{bz_stream}
+comprise the entirety of the user-visible data. @code{state}
+is a pointer to the private data structures required for compression.
+
+Custom memory allocators are supported, via fields @code{bzalloc},
+@code{bzfree},
+and @code{opaque}. The value
+@code{opaque} is passed to as the first argument to
+all calls to @code{bzalloc} and @code{bzfree}, but is
+otherwise ignored by the library.
+The call @code{bzalloc ( opaque, n, m )} is expected to return a
+pointer @code{p} to
+@code{n * m} bytes of memory, and @code{bzfree ( opaque, p )}
+should free
+that memory.
+
+If you don't want to use a custom memory allocator, set @code{bzalloc},
+@code{bzfree} and
+@code{opaque} to @code{NULL},
+and the library will then use the standard @code{malloc}/@code{free}
+routines.
+
+Before calling @code{BZ2_bzCompressInit}, fields @code{bzalloc},
+@code{bzfree} and @code{opaque} should
+be filled appropriately, as just described. Upon return, the internal
+state will have been allocated and initialised, and @code{total_in_lo32},
+@code{total_in_hi32}, @code{total_out_lo32} and
+@code{total_out_hi32} will have been set to zero.
+These four fields are used by the library
+to inform the caller of the total amount of data passed into and out of
+the library, respectively. You should not try to change them.
+As of version 1.0, 64-bit counts are maintained, even on 32-bit
+platforms, using the @code{_hi32} fields to store the upper 32 bits
+of the count. So, for example, the total amount of data in
+is @code{(total_in_hi32 << 32) + total_in_lo32}.
+
+Parameter @code{blockSize100k} specifies the block size to be used for
+compression. It should be a value between 1 and 9 inclusive, and the
+actual block size used is 100000 x this figure. 9 gives the best
+compression but takes most memory.
+
+Parameter @code{verbosity} should be set to a number between 0 and 4
+inclusive. 0 is silent, and greater numbers give increasingly verbose
+monitoring/debugging output. If the library has been compiled with
+@code{-DBZ_NO_STDIO}, no such output will appear for any verbosity
+setting.
+
+Parameter @code{workFactor} controls how the compression phase behaves
+when presented with worst case, highly repetitive, input data. If
+compression runs into difficulties caused by repetitive data, the
+library switches from the standard sorting algorithm to a fallback
+algorithm. The fallback is slower than the standard algorithm by
+perhaps a factor of three, but always behaves reasonably, no matter how
+bad the input.
+
+Lower values of @code{workFactor} reduce the amount of effort the
+standard algorithm will expend before resorting to the fallback. You
+should set this parameter carefully; too low, and many inputs will be
+handled by the fallback algorithm and so compress rather slowly, too
+high, and your average-to-worst case compression times can become very
+large. The default value of 30 gives reasonable behaviour over a wide
+range of circumstances.
+
+Allowable values range from 0 to 250 inclusive. 0 is a special case,
+equivalent to using the default value of 30.
+
+Note that the compressed output generated is the same regardless of
+whether or not the fallback algorithm is used.
+
+Be aware also that this parameter may disappear entirely in future
+versions of the library. In principle it should be possible to devise a
+good way to automatically choose which algorithm to use. Such a
+mechanism would render the parameter obsolete.
+
+Possible return values:
+@display
+ @code{BZ_CONFIG_ERROR}
+ if the library has been mis-compiled
+ @code{BZ_PARAM_ERROR}
+ if @code{strm} is @code{NULL}
+ or @code{blockSize} < 1 or @code{blockSize} > 9
+ or @code{verbosity} < 0 or @code{verbosity} > 4
+ or @code{workFactor} < 0 or @code{workFactor} > 250
+ @code{BZ_MEM_ERROR}
+ if not enough memory is available
+ @code{BZ_OK}
+ otherwise
+@end display
+Allowable next actions:
+@display
+ @code{BZ2_bzCompress}
+ if @code{BZ_OK} is returned
+ no specific action needed in case of error
+@end display
+
+@subsection @code{BZ2_bzCompress}
+@example
+ int BZ2_bzCompress ( bz_stream *strm, int action );
+@end example
+Provides more input and/or output buffer space for the library. The
+caller maintains input and output buffers, and calls @code{BZ2_bzCompress} to
+transfer data between them.
+
+Before each call to @code{BZ2_bzCompress}, @code{next_in} should point at
+the data to be compressed, and @code{avail_in} should indicate how many
+bytes the library may read. @code{BZ2_bzCompress} updates @code{next_in},
+@code{avail_in} and @code{total_in} to reflect the number of bytes it
+has read.
+
+Similarly, @code{next_out} should point to a buffer in which the
+compressed data is to be placed, with @code{avail_out} indicating how
+much output space is available. @code{BZ2_bzCompress} updates
+@code{next_out}, @code{avail_out} and @code{total_out} to reflect the
+number of bytes output.
+
+You may provide and remove as little or as much data as you like on each
+call of @code{BZ2_bzCompress}. In the limit, it is acceptable to supply and
+remove data one byte at a time, although this would be terribly
+inefficient. You should always ensure that at least one byte of output
+space is available at each call.
+
+A second purpose of @code{BZ2_bzCompress} is to request a change of mode of the
+compressed stream.
+
+Conceptually, a compressed stream can be in one of four states: IDLE,
+RUNNING, FLUSHING and FINISHING. Before initialisation
+(@code{BZ2_bzCompressInit}) and after termination (@code{BZ2_bzCompressEnd}), a
+stream is regarded as IDLE.
+
+Upon initialisation (@code{BZ2_bzCompressInit}), the stream is placed in the
+RUNNING state. Subsequent calls to @code{BZ2_bzCompress} should pass
+@code{BZ_RUN} as the requested action; other actions are illegal and
+will result in @code{BZ_SEQUENCE_ERROR}.
+
+At some point, the calling program will have provided all the input data
+it wants to. It will then want to finish up -- in effect, asking the
+library to process any data it might have buffered internally. In this
+state, @code{BZ2_bzCompress} will no longer attempt to read data from
+@code{next_in}, but it will want to write data to @code{next_out}.
+Because the output buffer supplied by the user can be arbitrarily small,
+the finishing-up operation cannot necessarily be done with a single call
+of @code{BZ2_bzCompress}.
+
+Instead, the calling program passes @code{BZ_FINISH} as an action to
+@code{BZ2_bzCompress}. This changes the stream's state to FINISHING. Any
+remaining input (ie, @code{next_in[0 .. avail_in-1]}) is compressed and
+transferred to the output buffer. To do this, @code{BZ2_bzCompress} must be
+called repeatedly until all the output has been consumed. At that
+point, @code{BZ2_bzCompress} returns @code{BZ_STREAM_END}, and the stream's
+state is set back to IDLE. @code{BZ2_bzCompressEnd} should then be
+called.
+
+Just to make sure the calling program does not cheat, the library makes
+a note of @code{avail_in} at the time of the first call to
+@code{BZ2_bzCompress} which has @code{BZ_FINISH} as an action (ie, at the
+time the program has announced its intention to not supply any more
+input). By comparing this value with that of @code{avail_in} over
+subsequent calls to @code{BZ2_bzCompress}, the library can detect any
+attempts to slip in more data to compress. Any calls for which this is
+detected will return @code{BZ_SEQUENCE_ERROR}. This indicates a
+programming mistake which should be corrected.
+
+Instead of asking to finish, the calling program may ask
+@code{BZ2_bzCompress} to take all the remaining input, compress it and
+terminate the current (Burrows-Wheeler) compression block. This could
+be useful for error control purposes. The mechanism is analogous to
+that for finishing: call @code{BZ2_bzCompress} with an action of
+@code{BZ_FLUSH}, remove output data, and persist with the
+@code{BZ_FLUSH} action until the value @code{BZ_RUN} is returned. As
+with finishing, @code{BZ2_bzCompress} detects any attempt to provide more
+input data once the flush has begun.
+
+Once the flush is complete, the stream returns to the normal RUNNING
+state.
+
+This all sounds pretty complex, but isn't really. Here's a table
+which shows which actions are allowable in each state, what action
+will be taken, what the next state is, and what the non-error return
+values are. Note that you can't explicitly ask what state the
+stream is in, but nor do you need to -- it can be inferred from the
+values returned by @code{BZ2_bzCompress}.
+@display
+IDLE/@code{any}
+ Illegal. IDLE state only exists after @code{BZ2_bzCompressEnd} or
+ before @code{BZ2_bzCompressInit}.
+ Return value = @code{BZ_SEQUENCE_ERROR}
+
+RUNNING/@code{BZ_RUN}
+ Compress from @code{next_in} to @code{next_out} as much as possible.
+ Next state = RUNNING
+ Return value = @code{BZ_RUN_OK}
+
+RUNNING/@code{BZ_FLUSH}
+ Remember current value of @code{next_in}. Compress from @code{next_in}
+ to @code{next_out} as much as possible, but do not accept any more input.
+ Next state = FLUSHING
+ Return value = @code{BZ_FLUSH_OK}
+
+RUNNING/@code{BZ_FINISH}
+ Remember current value of @code{next_in}. Compress from @code{next_in}
+ to @code{next_out} as much as possible, but do not accept any more input.
+ Next state = FINISHING
+ Return value = @code{BZ_FINISH_OK}
+
+FLUSHING/@code{BZ_FLUSH}
+ Compress from @code{next_in} to @code{next_out} as much as possible,
+ but do not accept any more input.
+ If all the existing input has been used up and all compressed
+ output has been removed
+ Next state = RUNNING; Return value = @code{BZ_RUN_OK}
+ else
+ Next state = FLUSHING; Return value = @code{BZ_FLUSH_OK}
+
+FLUSHING/other
+ Illegal.
+ Return value = @code{BZ_SEQUENCE_ERROR}
+
+FINISHING/@code{BZ_FINISH}
+ Compress from @code{next_in} to @code{next_out} as much as possible,
+ but to not accept any more input.
+ If all the existing input has been used up and all compressed
+ output has been removed
+ Next state = IDLE; Return value = @code{BZ_STREAM_END}
+ else
+ Next state = FINISHING; Return value = @code{BZ_FINISHING}
+
+FINISHING/other
+ Illegal.
+ Return value = @code{BZ_SEQUENCE_ERROR}
+@end display
+
+That still looks complicated? Well, fair enough. The usual sequence
+of calls for compressing a load of data is:
+@itemize @bullet
+@item Get started with @code{BZ2_bzCompressInit}.
+@item Shovel data in and shlurp out its compressed form using zero or more
+calls of @code{BZ2_bzCompress} with action = @code{BZ_RUN}.
+@item Finish up.
+Repeatedly call @code{BZ2_bzCompress} with action = @code{BZ_FINISH},
+copying out the compressed output, until @code{BZ_STREAM_END} is returned.
+@item Close up and go home. Call @code{BZ2_bzCompressEnd}.
+@end itemize
+If the data you want to compress fits into your input buffer all
+at once, you can skip the calls of @code{BZ2_bzCompress ( ..., BZ_RUN )} and
+just do the @code{BZ2_bzCompress ( ..., BZ_FINISH )} calls.
+
+All required memory is allocated by @code{BZ2_bzCompressInit}. The
+compression library can accept any data at all (obviously). So you
+shouldn't get any error return values from the @code{BZ2_bzCompress} calls.
+If you do, they will be @code{BZ_SEQUENCE_ERROR}, and indicate a bug in
+your programming.
+
+Trivial other possible return values:
+@display
+ @code{BZ_PARAM_ERROR}
+ if @code{strm} is @code{NULL}, or @code{strm->s} is @code{NULL}
+@end display
+
+@subsection @code{BZ2_bzCompressEnd}
+@example
+int BZ2_bzCompressEnd ( bz_stream *strm );
+@end example
+Releases all memory associated with a compression stream.
+
+Possible return values:
+@display
+ @code{BZ_PARAM_ERROR} if @code{strm} is @code{NULL} or @code{strm->s} is @code{NULL}
+ @code{BZ_OK} otherwise
+@end display
+
+
+@subsection @code{BZ2_bzDecompressInit}
+@example
+int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
+@end example
+Prepares for decompression. As with @code{BZ2_bzCompressInit}, a
+@code{bz_stream} record should be allocated and initialised before the
+call. Fields @code{bzalloc}, @code{bzfree} and @code{opaque} should be
+set if a custom memory allocator is required, or made @code{NULL} for
+the normal @code{malloc}/@code{free} routines. Upon return, the internal
+state will have been initialised, and @code{total_in} and
+@code{total_out} will be zero.
+
+For the meaning of parameter @code{verbosity}, see @code{BZ2_bzCompressInit}.
+
+If @code{small} is nonzero, the library will use an alternative
+decompression algorithm which uses less memory but at the cost of
+decompressing more slowly (roughly speaking, half the speed, but the
+maximum memory requirement drops to around 2300k). See Chapter 2 for
+more information on memory management.
+
+Note that the amount of memory needed to decompress
+a stream cannot be determined until the stream's header has been read,
+so even if @code{BZ2_bzDecompressInit} succeeds, a subsequent
+@code{BZ2_bzDecompress} could fail with @code{BZ_MEM_ERROR}.
+
+Possible return values:
+@display
+ @code{BZ_CONFIG_ERROR}
+ if the library has been mis-compiled
+ @code{BZ_PARAM_ERROR}
+ if @code{(small != 0 && small != 1)}
+ or @code{(verbosity < 0 || verbosity > 4)}
+ @code{BZ_MEM_ERROR}
+ if insufficient memory is available
+@end display
+
+Allowable next actions:
+@display
+ @code{BZ2_bzDecompress}
+ if @code{BZ_OK} was returned
+ no specific action required in case of error
+@end display
+
+
+
+@subsection @code{BZ2_bzDecompress}
+@example
+int BZ2_bzDecompress ( bz_stream *strm );
+@end example
+Provides more input and/out output buffer space for the library. The
+caller maintains input and output buffers, and uses @code{BZ2_bzDecompress}
+to transfer data between them.
+
+Before each call to @code{BZ2_bzDecompress}, @code{next_in}
+should point at the compressed data,
+and @code{avail_in} should indicate how many bytes the library
+may read. @code{BZ2_bzDecompress} updates @code{next_in}, @code{avail_in}
+and @code{total_in}
+to reflect the number of bytes it has read.
+
+Similarly, @code{next_out} should point to a buffer in which the uncompressed
+output is to be placed, with @code{avail_out} indicating how much output space
+is available. @code{BZ2_bzCompress} updates @code{next_out},
+@code{avail_out} and @code{total_out} to reflect
+the number of bytes output.
+
+You may provide and remove as little or as much data as you like on
+each call of @code{BZ2_bzDecompress}.
+In the limit, it is acceptable to
+supply and remove data one byte at a time, although this would be
+terribly inefficient. You should always ensure that at least one
+byte of output space is available at each call.
+
+Use of @code{BZ2_bzDecompress} is simpler than @code{BZ2_bzCompress}.
+
+You should provide input and remove output as described above, and
+repeatedly call @code{BZ2_bzDecompress} until @code{BZ_STREAM_END} is
+returned. Appearance of @code{BZ_STREAM_END} denotes that
+@code{BZ2_bzDecompress} has detected the logical end of the compressed
+stream. @code{BZ2_bzDecompress} will not produce @code{BZ_STREAM_END} until
+all output data has been placed into the output buffer, so once
+@code{BZ_STREAM_END} appears, you are guaranteed to have available all
+the decompressed output, and @code{BZ2_bzDecompressEnd} can safely be
+called.
+
+If case of an error return value, you should call @code{BZ2_bzDecompressEnd}
+to clean up and release memory.
+
+Possible return values:
+@display
+ @code{BZ_PARAM_ERROR}
+ if @code{strm} is @code{NULL} or @code{strm->s} is @code{NULL}
+ or @code{strm->avail_out < 1}
+ @code{BZ_DATA_ERROR}
+ if a data integrity error is detected in the compressed stream
+ @code{BZ_DATA_ERROR_MAGIC}
+ if the compressed stream doesn't begin with the right magic bytes
+ @code{BZ_MEM_ERROR}
+ if there wasn't enough memory available
+ @code{BZ_STREAM_END}
+ if the logical end of the data stream was detected and all
+ output in has been consumed, eg @code{s->avail_out > 0}
+ @code{BZ_OK}
+ otherwise
+@end display
+Allowable next actions:
+@display
+ @code{BZ2_bzDecompress}
+ if @code{BZ_OK} was returned
+ @code{BZ2_bzDecompressEnd}
+ otherwise
+@end display
+
+
+@subsection @code{BZ2_bzDecompressEnd}
+@example
+int BZ2_bzDecompressEnd ( bz_stream *strm );
+@end example
+Releases all memory associated with a decompression stream.
+
+Possible return values:
+@display
+ @code{BZ_PARAM_ERROR}
+ if @code{strm} is @code{NULL} or @code{strm->s} is @code{NULL}
+ @code{BZ_OK}
+ otherwise
+@end display
+
+Allowable next actions:
+@display
+ None.
+@end display
+
+
+@section High-level interface
+
+This interface provides functions for reading and writing
+@code{bzip2} format files. First, some general points.
+
+@itemize @bullet
+@item All of the functions take an @code{int*} first argument,
+ @code{bzerror}.
+ After each call, @code{bzerror} should be consulted first to determine
+ the outcome of the call. If @code{bzerror} is @code{BZ_OK},
+ the call completed
+ successfully, and only then should the return value of the function
+ (if any) be consulted. If @code{bzerror} is @code{BZ_IO_ERROR},
+ there was an error
+ reading/writing the underlying compressed file, and you should
+ then consult @code{errno}/@code{perror} to determine the
+ cause of the difficulty.
+ @code{bzerror} may also be set to various other values; precise details are
+ given on a per-function basis below.
+@item If @code{bzerror} indicates an error
+ (ie, anything except @code{BZ_OK} and @code{BZ_STREAM_END}),
+ you should immediately call @code{BZ2_bzReadClose} (or @code{BZ2_bzWriteClose},
+ depending on whether you are attempting to read or to write)
+ to free up all resources associated
+ with the stream. Once an error has been indicated, behaviour of all calls
+ except @code{BZ2_bzReadClose} (@code{BZ2_bzWriteClose}) is undefined.
+ The implication is that (1) @code{bzerror} should
+ be checked after each call, and (2) if @code{bzerror} indicates an error,
+ @code{BZ2_bzReadClose} (@code{BZ2_bzWriteClose}) should then be called to clean up.
+@item The @code{FILE*} arguments passed to
+ @code{BZ2_bzReadOpen}/@code{BZ2_bzWriteOpen}
+ should be set to binary mode.
+ Most Unix systems will do this by default, but other platforms,
+ including Windows and Mac, will not. If you omit this, you may
+ encounter problems when moving code to new platforms.
+@item Memory allocation requests are handled by
+ @code{malloc}/@code{free}.
+ At present
+ there is no facility for user-defined memory allocators in the file I/O
+ functions (could easily be added, though).
+@end itemize
+
+
+
+@subsection @code{BZ2_bzReadOpen}
+@example
+ typedef void BZFILE;
+
+ BZFILE *BZ2_bzReadOpen ( int *bzerror, FILE *f,
+ int small, int verbosity,
+ void *unused, int nUnused );
+@end example
+Prepare to read compressed data from file handle @code{f}. @code{f}
+should refer to a file which has been opened for reading, and for which
+the error indicator (@code{ferror(f)})is not set. If @code{small} is 1,
+the library will try to decompress using less memory, at the expense of
+speed.
+
+For reasons explained below, @code{BZ2_bzRead} will decompress the
+@code{nUnused} bytes starting at @code{unused}, before starting to read
+from the file @code{f}. At most @code{BZ_MAX_UNUSED} bytes may be
+supplied like this. If this facility is not required, you should pass
+@code{NULL} and @code{0} for @code{unused} and n@code{Unused}
+respectively.
+
+For the meaning of parameters @code{small} and @code{verbosity},
+see @code{BZ2_bzDecompressInit}.
+
+The amount of memory needed to decompress a file cannot be determined
+until the file's header has been read. So it is possible that
+@code{BZ2_bzReadOpen} returns @code{BZ_OK} but a subsequent call of
+@code{BZ2_bzRead} will return @code{BZ_MEM_ERROR}.
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_CONFIG_ERROR}
+ if the library has been mis-compiled
+ @code{BZ_PARAM_ERROR}
+ if @code{f} is @code{NULL}
+ or @code{small} is neither @code{0} nor @code{1}
+ or @code{(unused == NULL && nUnused != 0)}
+ or @code{(unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED))}
+ @code{BZ_IO_ERROR}
+ if @code{ferror(f)} is nonzero
+ @code{BZ_MEM_ERROR}
+ if insufficient memory is available
+ @code{BZ_OK}
+ otherwise.
+@end display
+
+Possible return values:
+@display
+ Pointer to an abstract @code{BZFILE}
+ if @code{bzerror} is @code{BZ_OK}
+ @code{NULL}
+ otherwise
+@end display
+
+Allowable next actions:
+@display
+ @code{BZ2_bzRead}
+ if @code{bzerror} is @code{BZ_OK}
+ @code{BZ2_bzClose}
+ otherwise
+@end display
+
+
+@subsection @code{BZ2_bzRead}
+@example
+ int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
+@end example
+Reads up to @code{len} (uncompressed) bytes from the compressed file
+@code{b} into
+the buffer @code{buf}. If the read was successful,
+@code{bzerror} is set to @code{BZ_OK}
+and the number of bytes read is returned. If the logical end-of-stream
+was detected, @code{bzerror} will be set to @code{BZ_STREAM_END},
+and the number
+of bytes read is returned. All other @code{bzerror} values denote an error.
+
+@code{BZ2_bzRead} will supply @code{len} bytes,
+unless the logical stream end is detected
+or an error occurs. Because of this, it is possible to detect the
+stream end by observing when the number of bytes returned is
+less than the number
+requested. Nevertheless, this is regarded as inadvisable; you should
+instead check @code{bzerror} after every call and watch out for
+@code{BZ_STREAM_END}.
+
+Internally, @code{BZ2_bzRead} copies data from the compressed file in chunks
+of size @code{BZ_MAX_UNUSED} bytes
+before decompressing it. If the file contains more bytes than strictly
+needed to reach the logical end-of-stream, @code{BZ2_bzRead} will almost certainly
+read some of the trailing data before signalling @code{BZ_SEQUENCE_END}.
+To collect the read but unused data once @code{BZ_SEQUENCE_END} has
+appeared, call @code{BZ2_bzReadGetUnused} immediately before @code{BZ2_bzReadClose}.
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_PARAM_ERROR}
+ if @code{b} is @code{NULL} or @code{buf} is @code{NULL} or @code{len < 0}
+ @code{BZ_SEQUENCE_ERROR}
+ if @code{b} was opened with @code{BZ2_bzWriteOpen}
+ @code{BZ_IO_ERROR}
+ if there is an error reading from the compressed file
+ @code{BZ_UNEXPECTED_EOF}
+ if the compressed file ended before the logical end-of-stream was detected
+ @code{BZ_DATA_ERROR}
+ if a data integrity error was detected in the compressed stream
+ @code{BZ_DATA_ERROR_MAGIC}
+ if the stream does not begin with the requisite header bytes (ie, is not
+ a @code{bzip2} data file). This is really a special case of @code{BZ_DATA_ERROR}.
+ @code{BZ_MEM_ERROR}
+ if insufficient memory was available
+ @code{BZ_STREAM_END}
+ if the logical end of stream was detected.
+ @code{BZ_OK}
+ otherwise.
+@end display
+
+Possible return values:
+@display
+ number of bytes read
+ if @code{bzerror} is @code{BZ_OK} or @code{BZ_STREAM_END}
+ undefined
+ otherwise
+@end display
+
+Allowable next actions:
+@display
+ collect data from @code{buf}, then @code{BZ2_bzRead} or @code{BZ2_bzReadClose}
+ if @code{bzerror} is @code{BZ_OK}
+ collect data from @code{buf}, then @code{BZ2_bzReadClose} or @code{BZ2_bzReadGetUnused}
+ if @code{bzerror} is @code{BZ_SEQUENCE_END}
+ @code{BZ2_bzReadClose}
+ otherwise
+@end display
+
+
+
+@subsection @code{BZ2_bzReadGetUnused}
+@example
+ void BZ2_bzReadGetUnused ( int* bzerror, BZFILE *b,
+ void** unused, int* nUnused );
+@end example
+Returns data which was read from the compressed file but was not needed
+to get to the logical end-of-stream. @code{*unused} is set to the address
+of the data, and @code{*nUnused} to the number of bytes. @code{*nUnused} will
+be set to a value between @code{0} and @code{BZ_MAX_UNUSED} inclusive.
+
+This function may only be called once @code{BZ2_bzRead} has signalled
+@code{BZ_STREAM_END} but before @code{BZ2_bzReadClose}.
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_PARAM_ERROR}
+ if @code{b} is @code{NULL}
+ or @code{unused} is @code{NULL} or @code{nUnused} is @code{NULL}
+ @code{BZ_SEQUENCE_ERROR}
+ if @code{BZ_STREAM_END} has not been signalled
+ or if @code{b} was opened with @code{BZ2_bzWriteOpen}
+ @code{BZ_OK}
+ otherwise
+@end display
+
+Allowable next actions:
+@display
+ @code{BZ2_bzReadClose}
+@end display
+
+
+@subsection @code{BZ2_bzReadClose}
+@example
+ void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
+@end example
+Releases all memory pertaining to the compressed file @code{b}.
+@code{BZ2_bzReadClose} does not call @code{fclose} on the underlying file
+handle, so you should do that yourself if appropriate.
+@code{BZ2_bzReadClose} should be called to clean up after all error
+situations.
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_SEQUENCE_ERROR}
+ if @code{b} was opened with @code{BZ2_bzOpenWrite}
+ @code{BZ_OK}
+ otherwise
+@end display
+
+Allowable next actions:
+@display
+ none
+@end display
+
+
+
+@subsection @code{BZ2_bzWriteOpen}
+@example
+ BZFILE *BZ2_bzWriteOpen ( int *bzerror, FILE *f,
+ int blockSize100k, int verbosity,
+ int workFactor );
+@end example
+Prepare to write compressed data to file handle @code{f}.
+@code{f} should refer to
+a file which has been opened for writing, and for which the error
+indicator (@code{ferror(f)})is not set.
+
+For the meaning of parameters @code{blockSize100k},
+@code{verbosity} and @code{workFactor}, see
+@* @code{BZ2_bzCompressInit}.
+
+All required memory is allocated at this stage, so if the call
+completes successfully, @code{BZ_MEM_ERROR} cannot be signalled by a
+subsequent call to @code{BZ2_bzWrite}.
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_CONFIG_ERROR}
+ if the library has been mis-compiled
+ @code{BZ_PARAM_ERROR}
+ if @code{f} is @code{NULL}
+ or @code{blockSize100k < 1} or @code{blockSize100k > 9}
+ @code{BZ_IO_ERROR}
+ if @code{ferror(f)} is nonzero
+ @code{BZ_MEM_ERROR}
+ if insufficient memory is available
+ @code{BZ_OK}
+ otherwise
+@end display
+
+Possible return values:
+@display
+ Pointer to an abstract @code{BZFILE}
+ if @code{bzerror} is @code{BZ_OK}
+ @code{NULL}
+ otherwise
+@end display
+
+Allowable next actions:
+@display
+ @code{BZ2_bzWrite}
+ if @code{bzerror} is @code{BZ_OK}
+ (you could go directly to @code{BZ2_bzWriteClose}, but this would be pretty pointless)
+ @code{BZ2_bzWriteClose}
+ otherwise
+@end display
+
+
+
+@subsection @code{BZ2_bzWrite}
+@example
+ void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
+@end example
+Absorbs @code{len} bytes from the buffer @code{buf}, eventually to be
+compressed and written to the file.
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_PARAM_ERROR}
+ if @code{b} is @code{NULL} or @code{buf} is @code{NULL} or @code{len < 0}
+ @code{BZ_SEQUENCE_ERROR}
+ if b was opened with @code{BZ2_bzReadOpen}
+ @code{BZ_IO_ERROR}
+ if there is an error writing the compressed file.
+ @code{BZ_OK}
+ otherwise
+@end display
+
+
+
+
+@subsection @code{BZ2_bzWriteClose}
+@example
+ void BZ2_bzWriteClose ( int *bzerror, BZFILE* f,
+ int abandon,
+ unsigned int* nbytes_in,
+ unsigned int* nbytes_out );
+
+ void BZ2_bzWriteClose64 ( int *bzerror, BZFILE* f,
+ int abandon,
+ unsigned int* nbytes_in_lo32,
+ unsigned int* nbytes_in_hi32,
+ unsigned int* nbytes_out_lo32,
+ unsigned int* nbytes_out_hi32 );
+@end example
+
+Compresses and flushes to the compressed file all data so far supplied
+by @code{BZ2_bzWrite}. The logical end-of-stream markers are also written, so
+subsequent calls to @code{BZ2_bzWrite} are illegal. All memory associated
+with the compressed file @code{b} is released.
+@code{fflush} is called on the
+compressed file, but it is not @code{fclose}'d.
+
+If @code{BZ2_bzWriteClose} is called to clean up after an error, the only
+action is to release the memory. The library records the error codes
+issued by previous calls, so this situation will be detected
+automatically. There is no attempt to complete the compression
+operation, nor to @code{fflush} the compressed file. You can force this
+behaviour to happen even in the case of no error, by passing a nonzero
+value to @code{abandon}.
+
+If @code{nbytes_in} is non-null, @code{*nbytes_in} will be set to be the
+total volume of uncompressed data handled. Similarly, @code{nbytes_out}
+will be set to the total volume of compressed data written. For
+compatibility with older versions of the library, @code{BZ2_bzWriteClose}
+only yields the lower 32 bits of these counts. Use
+@code{BZ2_bzWriteClose64} if you want the full 64 bit counts. These
+two functions are otherwise absolutely identical.
+
+
+Possible assignments to @code{bzerror}:
+@display
+ @code{BZ_SEQUENCE_ERROR}
+ if @code{b} was opened with @code{BZ2_bzReadOpen}
+ @code{BZ_IO_ERROR}
+ if there is an error writing the compressed file
+ @code{BZ_OK}
+ otherwise
+@end display
+
+@subsection Handling embedded compressed data streams
+
+The high-level library facilitates use of
+@code{bzip2} data streams which form some part of a surrounding, larger
+data stream.
+@itemize @bullet
+@item For writing, the library takes an open file handle, writes
+compressed data to it, @code{fflush}es it but does not @code{fclose} it.
+The calling application can write its own data before and after the
+compressed data stream, using that same file handle.
+@item Reading is more complex, and the facilities are not as general
+as they could be since generality is hard to reconcile with efficiency.
+@code{BZ2_bzRead} reads from the compressed file in blocks of size
+@code{BZ_MAX_UNUSED} bytes, and in doing so probably will overshoot
+the logical end of compressed stream.
+To recover this data once decompression has
+ended, call @code{BZ2_bzReadGetUnused} after the last call of @code{BZ2_bzRead}
+(the one returning @code{BZ_STREAM_END}) but before calling
+@code{BZ2_bzReadClose}.
+@end itemize
+
+This mechanism makes it easy to decompress multiple @code{bzip2}
+streams placed end-to-end. As the end of one stream, when @code{BZ2_bzRead}
+returns @code{BZ_STREAM_END}, call @code{BZ2_bzReadGetUnused} to collect the
+unused data (copy it into your own buffer somewhere).
+That data forms the start of the next compressed stream.
+To start uncompressing that next stream, call @code{BZ2_bzReadOpen} again,
+feeding in the unused data via the @code{unused}/@code{nUnused}
+parameters.
+Keep doing this until @code{BZ_STREAM_END} return coincides with the
+physical end of file (@code{feof(f)}). In this situation
+@code{BZ2_bzReadGetUnused}
+will of course return no data.
+
+This should give some feel for how the high-level interface can be used.
+If you require extra flexibility, you'll have to bite the bullet and get
+to grips with the low-level interface.
+
+@subsection Standard file-reading/writing code
+Here's how you'd write data to a compressed file:
+@example @code
+FILE* f;
+BZFILE* b;
+int nBuf;
+char buf[ /* whatever size you like */ ];
+int bzerror;
+int nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if (!f) @{
+ /* handle error */
+@}
+b = BZ2_bzWriteOpen ( &bzerror, f, 9 );
+if (bzerror != BZ_OK) @{
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+@}
+
+while ( /* condition */ ) @{
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) @{
+ BZ2_bzWriteClose ( &bzerror, b );
+ /* handle error */
+ @}
+@}
+
+BZ2_bzWriteClose ( &bzerror, b );
+if (bzerror == BZ_IO_ERROR) @{
+ /* handle error */
+@}
+@end example
+And to read from a compressed file:
+@example
+FILE* f;
+BZFILE* b;
+int nBuf;
+char buf[ /* whatever size you like */ ];
+int bzerror;
+int nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if (!f) @{
+ /* handle error */
+@}
+b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 );
+if (bzerror != BZ_OK) @{
+ BZ2_bzReadClose ( &bzerror, b );
+ /* handle error */
+@}
+
+bzerror = BZ_OK;
+while (bzerror == BZ_OK && /* arbitrary other conditions */) @{
+ nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ );
+ if (bzerror == BZ_OK) @{
+ /* do something with buf[0 .. nBuf-1] */
+ @}
+@}
+if (bzerror != BZ_STREAM_END) @{
+ BZ2_bzReadClose ( &bzerror, b );
+ /* handle error */
+@} else @{
+ BZ2_bzReadClose ( &bzerror );
+@}
+@end example
+
+
+
+@section Utility functions
+@subsection @code{BZ2_bzBuffToBuffCompress}
+@example
+ int BZ2_bzBuffToBuffCompress( char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int blockSize100k,
+ int verbosity,
+ int workFactor );
+@end example
+Attempts to compress the data in @code{source[0 .. sourceLen-1]}
+into the destination buffer, @code{dest[0 .. *destLen-1]}.
+If the destination buffer is big enough, @code{*destLen} is
+set to the size of the compressed data, and @code{BZ_OK} is
+returned. If the compressed data won't fit, @code{*destLen}
+is unchanged, and @code{BZ_OUTBUFF_FULL} is returned.
+
+Compression in this manner is a one-shot event, done with a single call
+to this function. The resulting compressed data is a complete
+@code{bzip2} format data stream. There is no mechanism for making
+additional calls to provide extra input data. If you want that kind of
+mechanism, use the low-level interface.
+
+For the meaning of parameters @code{blockSize100k}, @code{verbosity}
+and @code{workFactor}, @* see @code{BZ2_bzCompressInit}.
+
+To guarantee that the compressed data will fit in its buffer, allocate
+an output buffer of size 1% larger than the uncompressed data, plus
+six hundred extra bytes.
+
+@code{BZ2_bzBuffToBuffDecompress} will not write data at or
+beyond @code{dest[*destLen]}, even in case of buffer overflow.
+
+Possible return values:
+@display
+ @code{BZ_CONFIG_ERROR}
+ if the library has been mis-compiled
+ @code{BZ_PARAM_ERROR}
+ if @code{dest} is @code{NULL} or @code{destLen} is @code{NULL}
+ or @code{blockSize100k < 1} or @code{blockSize100k > 9}
+ or @code{verbosity < 0} or @code{verbosity > 4}
+ or @code{workFactor < 0} or @code{workFactor > 250}
+ @code{BZ_MEM_ERROR}
+ if insufficient memory is available
+ @code{BZ_OUTBUFF_FULL}
+ if the size of the compressed data exceeds @code{*destLen}
+ @code{BZ_OK}
+ otherwise
+@end display
+
+
+
+@subsection @code{BZ2_bzBuffToBuffDecompress}
+@example
+ int BZ2_bzBuffToBuffDecompress ( char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int small,
+ int verbosity );
+@end example
+Attempts to decompress the data in @code{source[0 .. sourceLen-1]}
+into the destination buffer, @code{dest[0 .. *destLen-1]}.
+If the destination buffer is big enough, @code{*destLen} is
+set to the size of the uncompressed data, and @code{BZ_OK} is
+returned. If the compressed data won't fit, @code{*destLen}
+is unchanged, and @code{BZ_OUTBUFF_FULL} is returned.
+
+@code{source} is assumed to hold a complete @code{bzip2} format
+data stream. @* @code{BZ2_bzBuffToBuffDecompress} tries to decompress
+the entirety of the stream into the output buffer.
+
+For the meaning of parameters @code{small} and @code{verbosity},
+see @code{BZ2_bzDecompressInit}.
+
+Because the compression ratio of the compressed data cannot be known in
+advance, there is no easy way to guarantee that the output buffer will
+be big enough. You may of course make arrangements in your code to
+record the size of the uncompressed data, but such a mechanism is beyond
+the scope of this library.
+
+@code{BZ2_bzBuffToBuffDecompress} will not write data at or
+beyond @code{dest[*destLen]}, even in case of buffer overflow.
+
+Possible return values:
+@display
+ @code{BZ_CONFIG_ERROR}
+ if the library has been mis-compiled
+ @code{BZ_PARAM_ERROR}
+ if @code{dest} is @code{NULL} or @code{destLen} is @code{NULL}
+ or @code{small != 0 && small != 1}
+ or @code{verbosity < 0} or @code{verbosity > 4}
+ @code{BZ_MEM_ERROR}
+ if insufficient memory is available
+ @code{BZ_OUTBUFF_FULL}
+ if the size of the compressed data exceeds @code{*destLen}
+ @code{BZ_DATA_ERROR}
+ if a data integrity error was detected in the compressed data
+ @code{BZ_DATA_ERROR_MAGIC}
+ if the compressed data doesn't begin with the right magic bytes
+ @code{BZ_UNEXPECTED_EOF}
+ if the compressed data ends unexpectedly
+ @code{BZ_OK}
+ otherwise
+@end display
+
+
+
+@section @code{zlib} compatibility functions
+Yoshioka Tsuneo has contributed some functions to
+give better @code{zlib} compatibility. These functions are
+@code{BZ2_bzopen}, @code{BZ2_bzread}, @code{BZ2_bzwrite}, @code{BZ2_bzflush},
+@code{BZ2_bzclose},
+@code{BZ2_bzerror} and @code{BZ2_bzlibVersion}.
+These functions are not (yet) officially part of
+the library. If they break, you get to keep all the pieces.
+Nevertheless, I think they work ok.
+@example
+typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );
+@end example
+Returns a string indicating the library version.
+@example
+BZFILE * BZ2_bzopen ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int fd, const char *mode );
+@end example
+Opens a @code{.bz2} file for reading or writing, using either its name
+or a pre-existing file descriptor.
+Analogous to @code{fopen} and @code{fdopen}.
+@example
+int BZ2_bzread ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
+@end example
+Reads/writes data from/to a previously opened @code{BZFILE}.
+Analogous to @code{fread} and @code{fwrite}.
+@example
+int BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );
+@end example
+Flushes/closes a @code{BZFILE}. @code{BZ2_bzflush} doesn't actually do
+anything. Analogous to @code{fflush} and @code{fclose}.
+
+@example
+const char * BZ2_bzerror ( BZFILE *b, int *errnum )
+@end example
+Returns a string describing the more recent error status of
+@code{b}, and also sets @code{*errnum} to its numerical value.
+
+
+@section Using the library in a @code{stdio}-free environment
+
+@subsection Getting rid of @code{stdio}
+
+In a deeply embedded application, you might want to use just
+the memory-to-memory functions. You can do this conveniently
+by compiling the library with preprocessor symbol @code{BZ_NO_STDIO}
+defined. Doing this gives you a library containing only the following
+eight functions:
+
+@code{BZ2_bzCompressInit}, @code{BZ2_bzCompress}, @code{BZ2_bzCompressEnd} @*
+@code{BZ2_bzDecompressInit}, @code{BZ2_bzDecompress}, @code{BZ2_bzDecompressEnd} @*
+@code{BZ2_bzBuffToBuffCompress}, @code{BZ2_bzBuffToBuffDecompress}
+
+When compiled like this, all functions will ignore @code{verbosity}
+settings.
+
+@subsection Critical error handling
+@code{libbzip2} contains a number of internal assertion checks which
+should, needless to say, never be activated. Nevertheless, if an
+assertion should fail, behaviour depends on whether or not the library
+was compiled with @code{BZ_NO_STDIO} set.
+
+For a normal compile, an assertion failure yields the message
+@example
+ bzip2/libbzip2: internal error number N.
+ This is a bug in bzip2/libbzip2, 1.0.2, 30-Dec-2001.
+ Please report it to me at: jseward@@acm.org. If this happened
+ when you were using some program which uses libbzip2 as a
+ component, you should also report this bug to the author(s)
+ of that program. Please make an effort to report this bug;
+ timely and accurate bug reports eventually lead to higher
+ quality software. Thanks. Julian Seward, 30 December 2001.
+@end example
+where @code{N} is some error code number. If @code{N == 1007}, it also
+prints some extra text advising the reader that unreliable memory is
+often associated with internal error 1007. (This is a
+frequently-observed-phenomenon with versions 1.0.0/1.0.1).
+
+@code{exit(3)} is then called.
+
+For a @code{stdio}-free library, assertion failures result
+in a call to a function declared as:
+@example
+ extern void bz_internal_error ( int errcode );
+@end example
+The relevant code is passed as a parameter. You should supply
+such a function.
+
+In either case, once an assertion failure has occurred, any
+@code{bz_stream} records involved can be regarded as invalid.
+You should not attempt to resume normal operation with them.
+
+You may, of course, change critical error handling to suit
+your needs. As I said above, critical errors indicate bugs
+in the library and should not occur. All "normal" error
+situations are indicated via error return codes from functions,
+and can be recovered from.
+
+
+@section Making a Windows DLL
+Everything related to Windows has been contributed by Yoshioka Tsuneo
+@* (@code{QWF00133@@niftyserve.or.jp} /
+@code{tsuneo-y@@is.aist-nara.ac.jp}), so you should send your queries to
+him (but perhaps Cc: me, @code{jseward@@acm.org}).
+
+My vague understanding of what to do is: using Visual C++ 5.0,
+open the project file @code{libbz2.dsp}, and build. That's all.
+
+If you can't
+open the project file for some reason, make a new one, naming these files:
+@code{blocksort.c}, @code{bzlib.c}, @code{compress.c},
+@code{crctable.c}, @code{decompress.c}, @code{huffman.c}, @*
+@code{randtable.c} and @code{libbz2.def}. You will also need
+to name the header files @code{bzlib.h} and @code{bzlib_private.h}.
+
+If you don't use VC++, you may need to define the proprocessor symbol
+@code{_WIN32}.
+
+Finally, @code{dlltest.c} is a sample program using the DLL. It has a
+project file, @code{dlltest.dsp}.
+
+If you just want a makefile for Visual C, have a look at
+@code{makefile.msc}.
+
+Be aware that if you compile @code{bzip2} itself on Win32, you must set
+@code{BZ_UNIX} to 0 and @code{BZ_LCCWIN32} to 1, in the file
+@code{bzip2.c}, before compiling. Otherwise the resulting binary won't
+work correctly.
+
+I haven't tried any of this stuff myself, but it all looks plausible.
+
+
+
+@chapter Miscellanea
+
+These are just some random thoughts of mine. Your mileage may
+vary.
+
+@section Limitations of the compressed file format
+@code{bzip2-1.0}, @code{0.9.5} and @code{0.9.0}
+use exactly the same file format as the previous
+version, @code{bzip2-0.1}. This decision was made in the interests of
+stability. Creating yet another incompatible compressed file format
+would create further confusion and disruption for users.
+
+Nevertheless, this is not a painless decision. Development
+work since the release of @code{bzip2-0.1} in August 1997
+has shown complexities in the file format which slow down
+decompression and, in retrospect, are unnecessary. These are:
+@itemize @bullet
+@item The run-length encoder, which is the first of the
+ compression transformations, is entirely irrelevant.
+ The original purpose was to protect the sorting algorithm
+ from the very worst case input: a string of repeated
+ symbols. But algorithm steps Q6a and Q6b in the original
+ Burrows-Wheeler technical report (SRC-124) show how
+ repeats can be handled without difficulty in block
+ sorting.
+@item The randomisation mechanism doesn't really need to be
+ there. Udi Manber and Gene Myers published a suffix
+ array construction algorithm a few years back, which
+ can be employed to sort any block, no matter how
+ repetitive, in O(N log N) time. Subsequent work by
+ Kunihiko Sadakane has produced a derivative O(N (log N)^2)
+ algorithm which usually outperforms the Manber-Myers
+ algorithm.
+
+ I could have changed to Sadakane's algorithm, but I find
+ it to be slower than @code{bzip2}'s existing algorithm for
+ most inputs, and the randomisation mechanism protects
+ adequately against bad cases. I didn't think it was
+ a good tradeoff to make. Partly this is due to the fact
+ that I was not flooded with email complaints about
+ @code{bzip2-0.1}'s performance on repetitive data, so
+ perhaps it isn't a problem for real inputs.
+
+ Probably the best long-term solution,
+ and the one I have incorporated into 0.9.5 and above,
+ is to use the existing sorting
+ algorithm initially, and fall back to a O(N (log N)^2)
+ algorithm if the standard algorithm gets into difficulties.
+@item The compressed file format was never designed to be
+ handled by a library, and I have had to jump though
+ some hoops to produce an efficient implementation of
+ decompression. It's a bit hairy. Try passing
+ @code{decompress.c} through the C preprocessor
+ and you'll see what I mean. Much of this complexity
+ could have been avoided if the compressed size of
+ each block of data was recorded in the data stream.
+@item An Adler-32 checksum, rather than a CRC32 checksum,
+ would be faster to compute.
+@end itemize
+It would be fair to say that the @code{bzip2} format was frozen
+before I properly and fully understood the performance
+consequences of doing so.
+
+Improvements which I was able to incorporate into
+0.9.0, despite using the same file format, are:
+@itemize @bullet
+@item Single array implementation of the inverse BWT. This
+ significantly speeds up decompression, presumably
+ because it reduces the number of cache misses.
+@item Faster inverse MTF transform for large MTF values. The
+ new implementation is based on the notion of sliding blocks
+ of values.
+@item @code{bzip2-0.9.0} now reads and writes files with @code{fread}
+ and @code{fwrite}; version 0.1 used @code{putc} and @code{getc}.
+ Duh! Well, you live and learn.
+
+@end itemize
+Further ahead, it would be nice
+to be able to do random access into files. This will
+require some careful design of compressed file formats.
+
+
+
+@section Portability issues
+After some consideration, I have decided not to use
+GNU @code{autoconf} to configure 0.9.5 or 1.0.
+
+@code{autoconf}, admirable and wonderful though it is,
+mainly assists with portability problems between Unix-like
+platforms. But @code{bzip2} doesn't have much in the way
+of portability problems on Unix; most of the difficulties appear
+when porting to the Mac, or to Microsoft's operating systems.
+@code{autoconf} doesn't help in those cases, and brings in a
+whole load of new complexity.
+
+Most people should be able to compile the library and program
+under Unix straight out-of-the-box, so to speak, especially
+if you have a version of GNU C available.
+
+There are a couple of @code{__inline__} directives in the code. GNU C
+(@code{gcc}) should be able to handle them. If you're not using
+GNU C, your C compiler shouldn't see them at all.
+If your compiler does, for some reason, see them and doesn't
+like them, just @code{#define} @code{__inline__} to be @code{/* */}. One
+easy way to do this is to compile with the flag @code{-D__inline__=},
+which should be understood by most Unix compilers.
+
+If you still have difficulties, try compiling with the macro
+@code{BZ_STRICT_ANSI} defined. This should enable you to build the
+library in a strictly ANSI compliant environment. Building the program
+itself like this is dangerous and not supported, since you remove
+@code{bzip2}'s checks against compressing directories, symbolic links,
+devices, and other not-really-a-file entities. This could cause
+filesystem corruption!
+
+One other thing: if you create a @code{bzip2} binary for public
+distribution, please try and link it statically (@code{gcc -s}). This
+avoids all sorts of library-version issues that others may encounter
+later on.
+
+If you build @code{bzip2} on Win32, you must set @code{BZ_UNIX} to 0 and
+@code{BZ_LCCWIN32} to 1, in the file @code{bzip2.c}, before compiling.
+Otherwise the resulting binary won't work correctly.
+
+
+
+@section Reporting bugs
+I tried pretty hard to make sure @code{bzip2} is
+bug free, both by design and by testing. Hopefully
+you'll never need to read this section for real.
+
+Nevertheless, if @code{bzip2} dies with a segmentation
+fault, a bus error or an internal assertion failure, it
+will ask you to email me a bug report. Experience with
+version 0.1 shows that almost all these problems can
+be traced to either compiler bugs or hardware problems.
+@itemize @bullet
+@item
+Recompile the program with no optimisation, and see if it
+works. And/or try a different compiler.
+I heard all sorts of stories about various flavours
+of GNU C (and other compilers) generating bad code for
+@code{bzip2}, and I've run across two such examples myself.
+
+2.7.X versions of GNU C are known to generate bad code from
+time to time, at high optimisation levels.
+If you get problems, try using the flags
+@code{-O2} @code{-fomit-frame-pointer} @code{-fno-strength-reduce}.
+You should specifically @emph{not} use @code{-funroll-loops}.
+
+You may notice that the Makefile runs six tests as part of
+the build process. If the program passes all of these, it's
+a pretty good (but not 100%) indication that the compiler has
+done its job correctly.
+@item
+If @code{bzip2} crashes randomly, and the crashes are not
+repeatable, you may have a flaky memory subsystem. @code{bzip2}
+really hammers your memory hierarchy, and if it's a bit marginal,
+you may get these problems. Ditto if your disk or I/O subsystem
+is slowly failing. Yup, this really does happen.
+
+Try using a different machine of the same type, and see if
+you can repeat the problem.
+@item This isn't really a bug, but ... If @code{bzip2} tells
+you your file is corrupted on decompression, and you
+obtained the file via FTP, there is a possibility that you
+forgot to tell FTP to do a binary mode transfer. That absolutely
+will cause the file to be non-decompressible. You'll have to transfer
+it again.
+@end itemize
+
+If you've incorporated @code{libbzip2} into your own program
+and are getting problems, please, please, please, check that the
+parameters you are passing in calls to the library, are
+correct, and in accordance with what the documentation says
+is allowable. I have tried to make the library robust against
+such problems, but I'm sure I haven't succeeded.
+
+Finally, if the above comments don't help, you'll have to send
+me a bug report. Now, it's just amazing how many people will
+send me a bug report saying something like
+@display
+ bzip2 crashed with segmentation fault on my machine
+@end display
+and absolutely nothing else. Needless to say, a such a report
+is @emph{totally, utterly, completely and comprehensively 100% useless;
+a waste of your time, my time, and net bandwidth}.
+With no details at all, there's no way I can possibly begin
+to figure out what the problem is.
+
+The rules of the game are: facts, facts, facts. Don't omit
+them because "oh, they won't be relevant". At the bare
+minimum:
+@display
+ Machine type. Operating system version.
+ Exact version of @code{bzip2} (do @code{bzip2 -V}).
+ Exact version of the compiler used.
+ Flags passed to the compiler.
+@end display
+However, the most important single thing that will help me is
+the file that you were trying to compress or decompress at the
+time the problem happened. Without that, my ability to do anything
+more than speculate about the cause, is limited.
+
+Please remember that I connect to the Internet with a modem, so
+you should contact me before mailing me huge files.
+
+
+@section Did you get the right package?
+
+@code{bzip2} is a resource hog. It soaks up large amounts of CPU cycles
+and memory. Also, it gives very large latencies. In the worst case, you
+can feed many megabytes of uncompressed data into the library before
+getting any compressed output, so this probably rules out applications
+requiring interactive behaviour.
+
+These aren't faults of my implementation, I hope, but more
+an intrinsic property of the Burrows-Wheeler transform (unfortunately).
+Maybe this isn't what you want.
+
+If you want a compressor and/or library which is faster, uses less
+memory but gets pretty good compression, and has minimal latency,
+consider Jean-loup
+Gailly's and Mark Adler's work, @code{zlib-1.1.3} and
+@code{gzip-1.2.4}. Look for them at
+
+@code{http://www.zlib.org} and
+@code{http://www.gzip.org} respectively.
+
+For something faster and lighter still, you might try Markus F X J
+Oberhumer's @code{LZO} real-time compression/decompression library, at
+@* @code{http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html}.
+
+If you want to use the @code{bzip2} algorithms to compress small blocks
+of data, 64k bytes or smaller, for example on an on-the-fly disk
+compressor, you'd be well advised not to use this library. Instead,
+I've made a special library tuned for that kind of use. It's part of
+@code{e2compr-0.40}, an on-the-fly disk compressor for the Linux
+@code{ext2} filesystem. Look at
+@code{http://www.netspace.net.au/~reiter/e2compr}.
+
+
+
+@section Testing
+
+A record of the tests I've done.
+
+First, some data sets:
+@itemize @bullet
+@item B: a directory containing 6001 files, one for every length in the
+ range 0 to 6000 bytes. The files contain random lowercase
+ letters. 18.7 megabytes.
+@item H: my home directory tree. Documents, source code, mail files,
+ compressed data. H contains B, and also a directory of
+ files designed as boundary cases for the sorting; mostly very
+ repetitive, nasty files. 565 megabytes.
+@item A: directory tree holding various applications built from source:
+ @code{egcs}, @code{gcc-2.8.1}, KDE, GTK, Octave, etc.
+ 2200 megabytes.
+@end itemize
+The tests conducted are as follows. Each test means compressing
+(a copy of) each file in the data set, decompressing it and
+comparing it against the original.
+
+First, a bunch of tests with block sizes and internal buffer
+sizes set very small,
+to detect any problems with the
+blocking and buffering mechanisms.
+This required modifying the source code so as to try to
+break it.
+@enumerate
+@item Data set H, with
+ buffer size of 1 byte, and block size of 23 bytes.
+@item Data set B, buffer sizes 1 byte, block size 1 byte.
+@item As (2) but small-mode decompression.
+@item As (2) with block size 2 bytes.
+@item As (2) with block size 3 bytes.
+@item As (2) with block size 4 bytes.
+@item As (2) with block size 5 bytes.
+@item As (2) with block size 6 bytes and small-mode decompression.
+@item H with buffer size of 1 byte, but normal block
+ size (up to 900000 bytes).
+@end enumerate
+Then some tests with unmodified source code.
+@enumerate
+@item H, all settings normal.
+@item As (1), with small-mode decompress.
+@item H, compress with flag @code{-1}.
+@item H, compress with flag @code{-s}, decompress with flag @code{-s}.
+@item Forwards compatibility: H, @code{bzip2-0.1pl2} compressing,
+ @code{bzip2-0.9.5} decompressing, all settings normal.
+@item Backwards compatibility: H, @code{bzip2-0.9.5} compressing,
+ @code{bzip2-0.1pl2} decompressing, all settings normal.
+@item Bigger tests: A, all settings normal.
+@item As (7), using the fallback (Sadakane-like) sorting algorithm.
+@item As (8), compress with flag @code{-1}, decompress with flag
+ @code{-s}.
+@item H, using the fallback sorting algorithm.
+@item Forwards compatibility: A, @code{bzip2-0.1pl2} compressing,
+ @code{bzip2-0.9.5} decompressing, all settings normal.
+@item Backwards compatibility: A, @code{bzip2-0.9.5} compressing,
+ @code{bzip2-0.1pl2} decompressing, all settings normal.
+@item Misc test: about 400 megabytes of @code{.tar} files with
+ @code{bzip2} compiled with Checker (a memory access error
+ detector, like Purify).
+@item Misc tests to make sure it builds and runs ok on non-Linux/x86
+ platforms.
+@end enumerate
+These tests were conducted on a 225 MHz IDT WinChip machine, running
+Linux 2.0.36. They represent nearly a week of continuous computation.
+All tests completed successfully.
+
+
+@section Further reading
+@code{bzip2} is not research work, in the sense that it doesn't present
+any new ideas. Rather, it's an engineering exercise based on existing
+ideas.
+
+Four documents describe essentially all the ideas behind @code{bzip2}:
+@example
+Michael Burrows and D. J. Wheeler:
+ "A block-sorting lossless data compression algorithm"
+ 10th May 1994.
+ Digital SRC Research Report 124.
+ ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz
+ If you have trouble finding it, try searching at the
+ New Zealand Digital Library, http://www.nzdl.org.
+
+Daniel S. Hirschberg and Debra A. LeLewer
+ "Efficient Decoding of Prefix Codes"
+ Communications of the ACM, April 1990, Vol 33, Number 4.
+ You might be able to get an electronic copy of this
+ from the ACM Digital Library.
+
+David J. Wheeler
+ Program bred3.c and accompanying document bred3.ps.
+ This contains the idea behind the multi-table Huffman
+ coding scheme.
+ ftp://ftp.cl.cam.ac.uk/users/djw3/
+
+Jon L. Bentley and Robert Sedgewick
+ "Fast Algorithms for Sorting and Searching Strings"
+ Available from Sedgewick's web page,
+ www.cs.princeton.edu/~rs
+@end example
+The following paper gives valuable additional insights into the
+algorithm, but is not immediately the basis of any code
+used in bzip2.
+@example
+Peter Fenwick:
+ Block Sorting Text Compression
+ Proceedings of the 19th Australasian Computer Science Conference,
+ Melbourne, Australia. Jan 31 - Feb 2, 1996.
+ ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps
+@end example
+Kunihiko Sadakane's sorting algorithm, mentioned above,
+is available from:
+@example
+http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz
+@end example
+The Manber-Myers suffix array construction
+algorithm is described in a paper
+available from:
+@example
+http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps
+@end example
+Finally, the following paper documents some recent investigations
+I made into the performance of sorting algorithms:
+@example
+Julian Seward:
+ On the Performance of BWT Sorting Algorithms
+ Proceedings of the IEEE Data Compression Conference 2000
+ Snowbird, Utah. 28-30 March 2000.
+@end example
+
+
+@contents
+
+@bye
+
diff --git a/Build/source/utils/bzip2/manual_1.html b/Build/source/utils/bzip2/manual_1.html
new file mode 100644
index 00000000000..15f86c9972a
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_1.html
@@ -0,0 +1,81 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: 1. Introduction</TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: 1. Introduction">
+<META NAME="keywords" CONTENT="Untitled Document: 1. Introduction">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 1. Introduction </H1>
+<!--docid::SEC1::-->
+<P>
+
+<CODE>bzip2</CODE> compresses files using the Burrows-Wheeler
+block-sorting text compression algorithm, and Huffman coding.
+Compression is generally considerably better than that
+achieved by more conventional LZ77/LZ78-based compressors,
+and approaches the performance of the PPM family of statistical compressors.
+</P><P>
+
+<CODE>bzip2</CODE> is built on top of <CODE>libbzip2</CODE>, a flexible library
+for handling compressed data in the <CODE>bzip2</CODE> format. This manual
+describes both how to use the program and
+how to work with the library interface. Most of the
+manual is devoted to this library, not the program,
+which is good news if your interest is only in the program.
+</P><P>
+
+Chapter 2 describes how to use <CODE>bzip2</CODE>; this is the only part
+you need to read if you just want to know how to operate the program.
+Chapter 3 describes the programming interfaces in detail, and
+Chapter 4 records some miscellaneous notes which I thought
+ought to be recorded somewhere.
+</P><P>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/manual_2.html b/Build/source/utils/bzip2/manual_2.html
new file mode 100644
index 00000000000..a3bebc3f2d5
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_2.html
@@ -0,0 +1,579 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: 2. How to use <CODE>bzip2</CODE></TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: 2. How to use <CODE>bzip2</CODE>">
+<META NAME="keywords" CONTENT="Untitled Document: 2. How to use <CODE>bzip2</CODE>">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_1.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 2. How to use <CODE>bzip2</CODE> </H1>
+<!--docid::SEC2::-->
+<P>
+
+This chapter contains a copy of the <CODE>bzip2</CODE> man page,
+and nothing else.
+</P><P>
+
+<BLOCKQUOTE>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> NAME </H4>
+<!--docid::SEC3::-->
+<UL>
+<LI><CODE>bzip2</CODE>, <CODE>bunzip2</CODE>
+- a block-sorting file compressor, v1.0.2
+<LI><CODE>bzcat</CODE>
+- decompresses files to stdout
+<LI><CODE>bzip2recover</CODE>
+- recovers data from damaged bzip2 files
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> SYNOPSIS </H4>
+<!--docid::SEC4::-->
+<UL>
+<LI><CODE>bzip2</CODE> [ -cdfkqstvzVL123456789 ] [ filenames ... ]
+<LI><CODE>bunzip2</CODE> [ -fkvsVL ] [ filenames ... ]
+<LI><CODE>bzcat</CODE> [ -s ] [ filenames ... ]
+<LI><CODE>bzip2recover</CODE> filename
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> DESCRIPTION </H4>
+<!--docid::SEC5::-->
+<P>
+
+<CODE>bzip2</CODE> compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding. Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+</P><P>
+
+The command-line options are deliberately very similar to those of GNU
+<CODE>gzip</CODE>, but they are not identical.
+</P><P>
+
+<CODE>bzip2</CODE> expects a list of file names to accompany the command-line
+flags. Each file is replaced by a compressed version of itself, with
+the name <CODE>original_name.bz2</CODE>. Each compressed file has the same
+modification date, permissions, and, when possible, ownership as the
+corresponding original, so that these properties can be correctly
+restored at decompression time. File name handling is naive in the
+sense that there is no mechanism for preserving original file names,
+permissions, ownerships or dates in filesystems which lack these
+concepts, or have serious file name length restrictions, such as MS-DOS.
+</P><P>
+
+<CODE>bzip2</CODE> and <CODE>bunzip2</CODE> will by default not overwrite existing
+files. If you want this to happen, specify the <CODE>-f</CODE> flag.
+</P><P>
+
+If no file names are specified, <CODE>bzip2</CODE> compresses from standard
+input to standard output. In this case, <CODE>bzip2</CODE> will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+</P><P>
+
+<CODE>bunzip2</CODE> (or <CODE>bzip2 -d</CODE>) decompresses all
+specified files. Files which were not created by <CODE>bzip2</CODE>
+will be detected and ignored, and a warning issued.
+<CODE>bzip2</CODE> attempts to guess the filename for the decompressed file
+from that of the compressed file as follows:
+<UL>
+<LI><CODE>filename.bz2 </CODE> becomes <CODE>filename</CODE>
+<LI><CODE>filename.bz </CODE> becomes <CODE>filename</CODE>
+<LI><CODE>filename.tbz2</CODE> becomes <CODE>filename.tar</CODE>
+<LI><CODE>filename.tbz </CODE> becomes <CODE>filename.tar</CODE>
+<LI><CODE>anyothername </CODE> becomes <CODE>anyothername.out</CODE>
+</UL>
+If the file does not end in one of the recognised endings,
+<CODE>.bz2</CODE>, <CODE>.bz</CODE>,
+<CODE>.tbz2</CODE> or <CODE>.tbz</CODE>, <CODE>bzip2</CODE> complains that it cannot
+guess the name of the original file, and uses the original name
+with <CODE>.out</CODE> appended.
+<P>
+
+As with compression, supplying no
+filenames causes decompression from standard input to standard output.
+</P><P>
+
+<CODE>bunzip2</CODE> will correctly decompress a file which is the
+concatenation of two or more compressed files. The result is the
+concatenation of the corresponding uncompressed files. Integrity
+testing (<CODE>-t</CODE>) of concatenated compressed files is also supported.
+</P><P>
+
+You can also compress or decompress files to the standard output by
+giving the <CODE>-c</CODE> flag. Multiple files may be compressed and
+decompressed like this. The resulting outputs are fed sequentially to
+stdout. Compression of multiple files in this manner generates a stream
+containing multiple compressed file representations. Such a stream
+can be decompressed correctly only by <CODE>bzip2</CODE> version 0.9.0 or
+later. Earlier versions of <CODE>bzip2</CODE> will stop after decompressing
+the first file in the stream.
+</P><P>
+
+<CODE>bzcat</CODE> (or <CODE>bzip2 -dc</CODE>) decompresses all specified files to
+the standard output.
+</P><P>
+
+<CODE>bzip2</CODE> will read arguments from the environment variables
+<CODE>BZIP2</CODE> and <CODE>BZIP</CODE>, in that order, and will process them
+before any arguments read from the command line. This gives a
+convenient way to supply default arguments.
+</P><P>
+
+Compression is always performed, even if the compressed file is slightly
+larger than the original. Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes. Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+</P><P>
+
+As a self-check for your protection, <CODE>bzip2</CODE> uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original. This guards against corruption of the compressed data, and
+against undetected bugs in <CODE>bzip2</CODE> (hopefully very unlikely). The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed. Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong. It can't help you recover the original uncompressed
+data. You can use <CODE>bzip2recover</CODE> to try to recover data from
+damaged files.
+</P><P>
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &#38;c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused <CODE>bzip2</CODE> to panic.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> OPTIONS </H4>
+<!--docid::SEC6::-->
+<DL COMPACT>
+<DT><CODE>-c --stdout</CODE>
+<DD>Compress or decompress to standard output.
+<DT><CODE>-d --decompress</CODE>
+<DD>Force decompression. <CODE>bzip2</CODE>, <CODE>bunzip2</CODE> and <CODE>bzcat</CODE> are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used. This flag overrides that
+mechanism, and forces bzip2 to decompress.
+<DT><CODE>-z --compress</CODE>
+<DD>The complement to <CODE>-d</CODE>: forces compression, regardless of the
+invokation name.
+<DT><CODE>-t --test</CODE>
+<DD>Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+<DT><CODE>-f --force</CODE>
+<DD>Force overwrite of output files. Normally, <CODE>bzip2</CODE> will not overwrite
+existing output files. Also forces <CODE>bzip2</CODE> to break hard links
+to files, which it otherwise wouldn't do.
+<P>
+
+<CODE>bzip2</CODE> normally declines to decompress files which don't have the
+correct magic header bytes. If forced (<CODE>-f</CODE>), however, it will
+pass such files through unmodified. This is how GNU <CODE>gzip</CODE>
+behaves.
+<DT><CODE>-k --keep</CODE>
+<DD>Keep (don't delete) input files during compression
+or decompression.
+<DT><CODE>-s --small</CODE>
+<DD>Reduce memory usage, for compression, decompression and testing. Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte. This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+<P>
+
+During compression, <CODE>-s</CODE> selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio. In short, if your machine is low on memory (8 megabytes or
+less), use -s for everything. See MEMORY MANAGEMENT below.
+<DT><CODE>-q --quiet</CODE>
+<DD>Suppress non-essential warning messages. Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+<DT><CODE>-v --verbose</CODE>
+<DD>Verbose mode -- show the compression ratio for each file processed.
+Further <CODE>-v</CODE>'s increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+<DT><CODE>-L --license -V --version</CODE>
+<DD>Display the software version, license terms and conditions.
+<DT><CODE>-1 (or --fast) to -9 (or --best)</CODE>
+<DD>Set the block size to 100 k, 200 k .. 900 k when compressing. Has no
+effect when decompressing. See MEMORY MANAGEMENT below.
+The <CODE>--fast</CODE> and <CODE>--best</CODE> aliases are primarily for GNU
+<CODE>gzip</CODE> compatibility. In particular, <CODE>--fast</CODE> doesn't make
+things significantly faster. And <CODE>--best</CODE> merely selects the
+default behaviour.
+<DT><CODE>--</CODE>
+<DD>Treats all subsequent arguments as file names, even if they start
+with a dash. This is so you can handle files with names beginning
+with a dash, for example: <CODE>bzip2 -- -myfilename</CODE>.
+<DT><CODE>--repetitive-fast</CODE>
+<DD><DT><CODE>--repetitive-best</CODE>
+<DD>These flags are redundant in versions 0.9.5 and above. They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful. 0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> MEMORY MANAGEMENT </H4>
+<!--docid::SEC7::-->
+<P>
+
+<CODE>bzip2</CODE> compresses large files in blocks. The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression. The flags <CODE>-1</CODE> through <CODE>-9</CODE>
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively. At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+<CODE>bunzip2</CODE> then allocates itself just enough memory to decompress
+the file. Since block sizes are stored in compressed files, it follows
+that the flags <CODE>-1</CODE> to <CODE>-9</CODE> are irrelevant to and so ignored
+during decompression.
+</P><P>
+
+Compression and decompression requirements, in bytes, can be estimated
+as:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> Compression: 400k + ( 8 x block size )
+
+ Decompression: 100k + ( 4 x block size ), or
+ 100k + ( 2.5 x block size )
+</pre></td></tr></table>Larger block sizes give rapidly diminishing marginal returns. Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using <CODE>bzip2</CODE> on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+</P><P>
+
+For files compressed with the default 900k block size, <CODE>bunzip2</CODE>
+will require about 3700 kbytes to decompress. To support decompression
+of any file on a 4 megabyte machine, <CODE>bunzip2</CODE> has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes. Decompression speed is also halved, so you should use this
+option only where necessary. The relevant flag is <CODE>-s</CODE>.
+</P><P>
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved. Compression and
+decompression speed are virtually unaffected by block size.
+</P><P>
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size. The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block. For example, compressing a file
+20,000 bytes long with the flag <CODE>-9</CODE> will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it. Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+</P><P>
+
+Here is a table which summarises the maximum memory usage for different
+block sizes. Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes. This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> Compress Decompress Decompress Corpus
+ Flag usage usage -s usage Size
+
+ -1 1200k 500k 350k 914704
+ -2 2000k 900k 600k 877703
+ -3 2800k 1300k 850k 860338
+ -4 3600k 1700k 1100k 846899
+ -5 4400k 2100k 1350k 845160
+ -6 5200k 2500k 1600k 838626
+ -7 6100k 2900k 1850k 834096
+ -8 6800k 3300k 2100k 828642
+ -9 7600k 3700k 2350k 828642
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> RECOVERING DATA FROM DAMAGED FILES </H4>
+<!--docid::SEC8::-->
+<P>
+
+<CODE>bzip2</CODE> compresses files in blocks, usually 900kbytes long. Each
+block is handled independently. If a media or transmission error causes
+a multi-block <CODE>.bz2</CODE> file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+</P><P>
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty. Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+</P><P>
+
+<CODE>bzip2recover</CODE> is a simple program whose purpose is to search for
+blocks in <CODE>.bz2</CODE> files, and write each block out into its own
+<CODE>.bz2</CODE> file. You can then use <CODE>bzip2 -t</CODE> to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+</P><P>
+
+<CODE>bzip2recover</CODE>
+takes a single argument, the name of the damaged file, and writes a
+number of files <CODE>rec00001file.bz2</CODE>, <CODE>rec00002file.bz2</CODE>, etc,
+containing the extracted blocks. The output filenames are designed so
+that the use of wildcards in subsequent processing -- for example,
+<CODE>bzip2 -dc rec*file.bz2 &#62; recovered_data</CODE> -- processes the files in
+the correct order.
+</P><P>
+
+<CODE>bzip2recover</CODE> should be of most use dealing with large <CODE>.bz2</CODE>
+files, as these will contain many blocks. It is clearly futile to use
+it on damaged single-block files, since a damaged block cannot be
+recovered. If you wish to minimise any potential data loss through
+media or transmission errors, you might consider compressing with a
+smaller block size.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> PERFORMANCE NOTES </H4>
+<!--docid::SEC9::-->
+<P>
+
+The sorting phase of compression gathers together similar strings in the
+file. Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..." (repeated several hundred times) may
+compress more slowly than normal. Versions 0.9.5 and above fare much
+better than previous versions in this respect. The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1. You can use the
+<CODE>-vvvv</CODE> option to monitor progress in great detail, if you want.
+</P><P>
+
+Decompression speed is unaffected by these phenomena.
+</P><P>
+
+<CODE>bzip2</CODE> usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion. This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine <CODE>bzip2</CODE> will perform best on machines with very large
+caches.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> CAVEATS </H4>
+<!--docid::SEC10::-->
+<P>
+
+I/O error messages are not as helpful as they could be. <CODE>bzip2</CODE>
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+</P><P>
+
+This manual page pertains to version 1.0.2 of <CODE>bzip2</CODE>. Compressed
+data created by this version is entirely forwards and backwards
+compatible with the previous public releases, versions 0.1pl2, 0.9.0,
+0.9.5, 1.0.0 and 1.0.1, but with the following exception: 0.9.0 and
+above can correctly decompress multiple concatenated compressed files.
+0.1pl2 cannot do this; it will stop after decompressing just the first
+file in the stream.
+</P><P>
+
+<CODE>bzip2recover</CODE> versions prior to this one, 1.0.2, used 32-bit
+integers to represent bit positions in compressed files, so it could not
+handle compressed files more than 512 megabytes long. Version 1.0.2 and
+above uses 64-bit ints on some platforms which support them (GNU
+supported targets, and Windows). To establish whether or not
+<CODE>bzip2recover</CODE> was built with such a limitation, run it without
+arguments. In any event you can build yourself an unlimited version if
+you can recompile it with <CODE>MaybeUInt64</CODE> set to be an unsigned
+64-bit integer.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> AUTHOR </H4>
+<!--docid::SEC11::-->
+Julian Seward, <CODE>jseward@acm.org</CODE>.
+<P>
+
+<CODE>http://sources.redhat.com/bzip2</CODE>
+</P><P>
+
+The ideas embodied in <CODE>bzip2</CODE> are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original <CODE>bzip</CODE>,
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original <CODE>bzip</CODE>). I am much
+indebted for their help, support and advice. See the manual in the
+source distribution for pointers to sources of documentation. Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression. Bela Lubkin encouraged me to improve the
+worst-case compression performance. The <CODE>bz*</CODE> scripts are derived
+from those of GNU <CODE>gzip</CODE>. Many people sent patches, helped with
+portability problems, lent machines, gave advice and were generally
+helpful.
+</P><P>
+
+</BLOCKQUOTE>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/manual_3.html b/Build/source/utils/bzip2/manual_3.html
new file mode 100644
index 00000000000..841d14d3e8c
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_3.html
@@ -0,0 +1,1855 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: 3. Programming with <CODE>libbzip2</CODE></TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: 3. Programming with <CODE>libbzip2</CODE>">
+<META NAME="keywords" CONTENT="Untitled Document: 3. Programming with <CODE>libbzip2</CODE>">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_2.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 3. Programming with <CODE>libbzip2</CODE> </H1>
+<!--docid::SEC12::-->
+<P>
+
+This chapter describes the programming interface to <CODE>libbzip2</CODE>.
+</P><P>
+
+For general background information, particularly about memory
+use and performance aspects, you'd be well advised to read Chapter 2
+as well.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.1 Top-level structure </H2>
+<!--docid::SEC13::-->
+<P>
+
+<CODE>libbzip2</CODE> is a flexible library for compressing and decompressing
+data in the <CODE>bzip2</CODE> data format. Although packaged as a single
+entity, it helps to regard the library as three separate parts: the low
+level interface, and the high level interface, and some utility
+functions.
+</P><P>
+
+The structure of <CODE>libbzip2</CODE>'s interfaces is similar to
+that of Jean-loup Gailly's and Mark Adler's excellent <CODE>zlib</CODE>
+library.
+</P><P>
+
+All externally visible symbols have names beginning <CODE>BZ2_</CODE>.
+This is new in version 1.0. The intention is to minimise pollution
+of the namespaces of library clients.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.1.1 Low-level summary </H3>
+<!--docid::SEC14::-->
+<P>
+
+This interface provides services for compressing and decompressing
+data in memory. There's no provision for dealing with files, streams
+or any other I/O mechanisms, just straight memory-to-memory work.
+In fact, this part of the library can be compiled without inclusion
+of <CODE>stdio.h</CODE>, which may be helpful for embedded applications.
+</P><P>
+
+The low-level part of the library has no global variables and
+is therefore thread-safe.
+</P><P>
+
+Six routines make up the low level interface:
+<CODE>BZ2_bzCompressInit</CODE>, <CODE>BZ2_bzCompress</CODE>, and <BR> <CODE>BZ2_bzCompressEnd</CODE>
+for compression,
+and a corresponding trio <CODE>BZ2_bzDecompressInit</CODE>, <BR> <CODE>BZ2_bzDecompress</CODE>
+and <CODE>BZ2_bzDecompressEnd</CODE> for decompression.
+The <CODE>*Init</CODE> functions allocate
+memory for compression/decompression and do other
+initialisations, whilst the <CODE>*End</CODE> functions close down operations
+and release memory.
+</P><P>
+
+The real work is done by <CODE>BZ2_bzCompress</CODE> and <CODE>BZ2_bzDecompress</CODE>.
+These compress and decompress data from a user-supplied input buffer
+to a user-supplied output buffer. These buffers can be any size;
+arbitrary quantities of data are handled by making repeated calls
+to these functions. This is a flexible mechanism allowing a
+consumer-pull style of activity, or producer-push, or a mixture of
+both.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.1.2 High-level summary </H3>
+<!--docid::SEC15::-->
+<P>
+
+This interface provides some handy wrappers around the low-level
+interface to facilitate reading and writing <CODE>bzip2</CODE> format
+files (<CODE>.bz2</CODE> files). The routines provide hooks to facilitate
+reading files in which the <CODE>bzip2</CODE> data stream is embedded
+within some larger-scale file structure, or where there are
+multiple <CODE>bzip2</CODE> data streams concatenated end-to-end.
+</P><P>
+
+For reading files, <CODE>BZ2_bzReadOpen</CODE>, <CODE>BZ2_bzRead</CODE>,
+<CODE>BZ2_bzReadClose</CODE> and <BR> <CODE>BZ2_bzReadGetUnused</CODE> are supplied. For
+writing files, <CODE>BZ2_bzWriteOpen</CODE>, <CODE>BZ2_bzWrite</CODE> and
+<CODE>BZ2_bzWriteFinish</CODE> are available.
+</P><P>
+
+As with the low-level library, no global variables are used
+so the library is per se thread-safe. However, if I/O errors
+occur whilst reading or writing the underlying compressed files,
+you may have to consult <CODE>errno</CODE> to determine the cause of
+the error. In that case, you'd need a C library which correctly
+supports <CODE>errno</CODE> in a multithreaded environment.
+</P><P>
+
+To make the library a little simpler and more portable,
+<CODE>BZ2_bzReadOpen</CODE> and <CODE>BZ2_bzWriteOpen</CODE> require you to pass them file
+handles (<CODE>FILE*</CODE>s) which have previously been opened for reading or
+writing respectively. That avoids portability problems associated with
+file operations and file attributes, whilst not being much of an
+imposition on the programmer.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.1.3 Utility functions summary </H3>
+<!--docid::SEC16::-->
+For very simple needs, <CODE>BZ2_bzBuffToBuffCompress</CODE> and
+<CODE>BZ2_bzBuffToBuffDecompress</CODE> are provided. These compress
+data in memory from one buffer to another buffer in a single
+function call. You should assess whether these functions
+fulfill your memory-to-memory compression/decompression
+requirements before investing effort in understanding the more
+general but more complex low-level interface.
+<P>
+
+Yoshioka Tsuneo (<CODE>QWF00133@niftyserve.or.jp</CODE> /
+<CODE>tsuneo-y@is.aist-nara.ac.jp</CODE>) has contributed some functions to
+give better <CODE>zlib</CODE> compatibility. These functions are
+<CODE>BZ2_bzopen</CODE>, <CODE>BZ2_bzread</CODE>, <CODE>BZ2_bzwrite</CODE>, <CODE>BZ2_bzflush</CODE>,
+<CODE>BZ2_bzclose</CODE>,
+<CODE>BZ2_bzerror</CODE> and <CODE>BZ2_bzlibVersion</CODE>. You may find these functions
+more convenient for simple file reading and writing, than those in the
+high-level interface. These functions are not (yet) officially part of
+the library, and are minimally documented here. If they break, you
+get to keep all the pieces. I hope to document them properly when time
+permits.
+</P><P>
+
+Yoshioka also contributed modifications to allow the library to be
+built as a Windows DLL.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.2 Error handling </H2>
+<!--docid::SEC17::-->
+<P>
+
+The library is designed to recover cleanly in all situations, including
+the worst-case situation of decompressing random data. I'm not
+100% sure that it can always do this, so you might want to add
+a signal handler to catch segmentation violations during decompression
+if you are feeling especially paranoid. I would be interested in
+hearing more about the robustness of the library to corrupted
+compressed data.
+</P><P>
+
+Version 1.0 is much more robust in this respect than
+0.9.0 or 0.9.5. Investigations with Checker (a tool for
+detecting problems with memory management, similar to Purify)
+indicate that, at least for the few files I tested, all single-bit
+errors in the decompressed data are caught properly, with no
+segmentation faults, no reads of uninitialised data and no
+out of range reads or writes. So it's certainly much improved,
+although I wouldn't claim it to be totally bombproof.
+</P><P>
+
+The file <CODE>bzlib.h</CODE> contains all definitions needed to use
+the library. In particular, you should definitely not include
+<CODE>bzlib_private.h</CODE>.
+</P><P>
+
+In <CODE>bzlib.h</CODE>, the various return values are defined. The following
+list is not intended as an exhaustive description of the circumstances
+in which a given value may be returned -- those descriptions are given
+later. Rather, it is intended to convey the rough meaning of each
+return value. The first five actions are normal and not intended to
+denote an error situation.
+<DL COMPACT>
+<DT><CODE>BZ_OK</CODE>
+<DD>The requested action was completed successfully.
+<DT><CODE>BZ_RUN_OK</CODE>
+<DD><DT><CODE>BZ_FLUSH_OK</CODE>
+<DD><DT><CODE>BZ_FINISH_OK</CODE>
+<DD>In <CODE>BZ2_bzCompress</CODE>, the requested flush/finish/nothing-special action
+was completed successfully.
+<DT><CODE>BZ_STREAM_END</CODE>
+<DD>Compression of data was completed, or the logical stream end was
+detected during decompression.
+</DL>
+<P>
+
+The following return values indicate an error of some kind.
+<DL COMPACT>
+<DT><CODE>BZ_CONFIG_ERROR</CODE>
+<DD>Indicates that the library has been improperly compiled on your
+platform -- a major configuration error. Specifically, it means
+that <CODE>sizeof(char)</CODE>, <CODE>sizeof(short)</CODE> and <CODE>sizeof(int)</CODE>
+are not 1, 2 and 4 respectively, as they should be. Note that the
+library should still work properly on 64-bit platforms which follow
+the LP64 programming model -- that is, where <CODE>sizeof(long)</CODE>
+and <CODE>sizeof(void*)</CODE> are 8. Under LP64, <CODE>sizeof(int)</CODE> is
+still 4, so <CODE>libbzip2</CODE>, which doesn't use the <CODE>long</CODE> type,
+is OK.
+<DT><CODE>BZ_SEQUENCE_ERROR</CODE>
+<DD>When using the library, it is important to call the functions in the
+correct sequence and with data structures (buffers etc) in the correct
+states. <CODE>libbzip2</CODE> checks as much as it can to ensure this is
+happening, and returns <CODE>BZ_SEQUENCE_ERROR</CODE> if not. Code which
+complies precisely with the function semantics, as detailed below,
+should never receive this value; such an event denotes buggy code
+which you should investigate.
+<DT><CODE>BZ_PARAM_ERROR</CODE>
+<DD>Returned when a parameter to a function call is out of range
+or otherwise manifestly incorrect. As with <CODE>BZ_SEQUENCE_ERROR</CODE>,
+this denotes a bug in the client code. The distinction between
+<CODE>BZ_PARAM_ERROR</CODE> and <CODE>BZ_SEQUENCE_ERROR</CODE> is a bit hazy, but still worth
+making.
+<DT><CODE>BZ_MEM_ERROR</CODE>
+<DD>Returned when a request to allocate memory failed. Note that the
+quantity of memory needed to decompress a stream cannot be determined
+until the stream's header has been read. So <CODE>BZ2_bzDecompress</CODE> and
+<CODE>BZ2_bzRead</CODE> may return <CODE>BZ_MEM_ERROR</CODE> even though some of
+the compressed data has been read. The same is not true for
+compression; once <CODE>BZ2_bzCompressInit</CODE> or <CODE>BZ2_bzWriteOpen</CODE> have
+successfully completed, <CODE>BZ_MEM_ERROR</CODE> cannot occur.
+<DT><CODE>BZ_DATA_ERROR</CODE>
+<DD>Returned when a data integrity error is detected during decompression.
+Most importantly, this means when stored and computed CRCs for the
+data do not match. This value is also returned upon detection of any
+other anomaly in the compressed data.
+<DT><CODE>BZ_DATA_ERROR_MAGIC</CODE>
+<DD>As a special case of <CODE>BZ_DATA_ERROR</CODE>, it is sometimes useful to
+know when the compressed stream does not start with the correct
+magic bytes (<CODE>'B' 'Z' 'h'</CODE>).
+<DT><CODE>BZ_IO_ERROR</CODE>
+<DD>Returned by <CODE>BZ2_bzRead</CODE> and <CODE>BZ2_bzWrite</CODE> when there is an error
+reading or writing in the compressed file, and by <CODE>BZ2_bzReadOpen</CODE>
+and <CODE>BZ2_bzWriteOpen</CODE> for attempts to use a file for which the
+error indicator (viz, <CODE>ferror(f)</CODE>) is set.
+On receipt of <CODE>BZ_IO_ERROR</CODE>, the caller should consult
+<CODE>errno</CODE> and/or <CODE>perror</CODE> to acquire operating-system
+specific information about the problem.
+<DT><CODE>BZ_UNEXPECTED_EOF</CODE>
+<DD>Returned by <CODE>BZ2_bzRead</CODE> when the compressed file finishes
+before the logical end of stream is detected.
+<DT><CODE>BZ_OUTBUFF_FULL</CODE>
+<DD>Returned by <CODE>BZ2_bzBuffToBuffCompress</CODE> and
+<CODE>BZ2_bzBuffToBuffDecompress</CODE> to indicate that the output data
+will not fit into the output buffer provided.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.3 Low-level interface </H2>
+<!--docid::SEC18::-->
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.3.1 <CODE>BZ2_bzCompressInit</CODE> </H3>
+<!--docid::SEC19::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>typedef
+ struct {
+ char *next_in;
+ unsigned int avail_in;
+ unsigned int total_in_lo32;
+ unsigned int total_in_hi32;
+
+ char *next_out;
+ unsigned int avail_out;
+ unsigned int total_out_lo32;
+ unsigned int total_out_hi32;
+
+ void *state;
+
+ void *(*bzalloc)(void *,int,int);
+ void (*bzfree)(void *,void *);
+ void *opaque;
+ }
+ bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm,
+ int blockSize100k,
+ int verbosity,
+ int workFactor );
+
+</pre></td></tr></table><P>
+
+Prepares for compression. The <CODE>bz_stream</CODE> structure
+holds all data pertaining to the compression activity.
+A <CODE>bz_stream</CODE> structure should be allocated and initialised
+prior to the call.
+The fields of <CODE>bz_stream</CODE>
+comprise the entirety of the user-visible data. <CODE>state</CODE>
+is a pointer to the private data structures required for compression.
+</P><P>
+
+Custom memory allocators are supported, via fields <CODE>bzalloc</CODE>,
+<CODE>bzfree</CODE>,
+and <CODE>opaque</CODE>. The value
+<CODE>opaque</CODE> is passed to as the first argument to
+all calls to <CODE>bzalloc</CODE> and <CODE>bzfree</CODE>, but is
+otherwise ignored by the library.
+The call <CODE>bzalloc ( opaque, n, m )</CODE> is expected to return a
+pointer <CODE>p</CODE> to
+<CODE>n * m</CODE> bytes of memory, and <CODE>bzfree ( opaque, p )</CODE>
+should free
+that memory.
+</P><P>
+
+If you don't want to use a custom memory allocator, set <CODE>bzalloc</CODE>,
+<CODE>bzfree</CODE> and
+<CODE>opaque</CODE> to <CODE>NULL</CODE>,
+and the library will then use the standard <CODE>malloc</CODE>/<CODE>free</CODE>
+routines.
+</P><P>
+
+Before calling <CODE>BZ2_bzCompressInit</CODE>, fields <CODE>bzalloc</CODE>,
+<CODE>bzfree</CODE> and <CODE>opaque</CODE> should
+be filled appropriately, as just described. Upon return, the internal
+state will have been allocated and initialised, and <CODE>total_in_lo32</CODE>,
+<CODE>total_in_hi32</CODE>, <CODE>total_out_lo32</CODE> and
+<CODE>total_out_hi32</CODE> will have been set to zero.
+These four fields are used by the library
+to inform the caller of the total amount of data passed into and out of
+the library, respectively. You should not try to change them.
+As of version 1.0, 64-bit counts are maintained, even on 32-bit
+platforms, using the <CODE>_hi32</CODE> fields to store the upper 32 bits
+of the count. So, for example, the total amount of data in
+is <CODE>(total_in_hi32 &#60;&#60; 32) + total_in_lo32</CODE>.
+</P><P>
+
+Parameter <CODE>blockSize100k</CODE> specifies the block size to be used for
+compression. It should be a value between 1 and 9 inclusive, and the
+actual block size used is 100000 x this figure. 9 gives the best
+compression but takes most memory.
+</P><P>
+
+Parameter <CODE>verbosity</CODE> should be set to a number between 0 and 4
+inclusive. 0 is silent, and greater numbers give increasingly verbose
+monitoring/debugging output. If the library has been compiled with
+<CODE>-DBZ_NO_STDIO</CODE>, no such output will appear for any verbosity
+setting.
+</P><P>
+
+Parameter <CODE>workFactor</CODE> controls how the compression phase behaves
+when presented with worst case, highly repetitive, input data. If
+compression runs into difficulties caused by repetitive data, the
+library switches from the standard sorting algorithm to a fallback
+algorithm. The fallback is slower than the standard algorithm by
+perhaps a factor of three, but always behaves reasonably, no matter how
+bad the input.
+</P><P>
+
+Lower values of <CODE>workFactor</CODE> reduce the amount of effort the
+standard algorithm will expend before resorting to the fallback. You
+should set this parameter carefully; too low, and many inputs will be
+handled by the fallback algorithm and so compress rather slowly, too
+high, and your average-to-worst case compression times can become very
+large. The default value of 30 gives reasonable behaviour over a wide
+range of circumstances.
+</P><P>
+
+Allowable values range from 0 to 250 inclusive. 0 is a special case,
+equivalent to using the default value of 30.
+</P><P>
+
+Note that the compressed output generated is the same regardless of
+whether or not the fallback algorithm is used.
+</P><P>
+
+Be aware also that this parameter may disappear entirely in future
+versions of the library. In principle it should be possible to devise a
+good way to automatically choose which algorithm to use. Such a
+mechanism would render the parameter obsolete.
+</P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_CONFIG_ERROR</CODE>
+ if the library has been mis-compiled
+ <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>strm</CODE> is <CODE>NULL</CODE>
+ or <CODE>blockSize</CODE> &#60; 1 or <CODE>blockSize</CODE> &#62; 9
+ or <CODE>verbosity</CODE> &#60; 0 or <CODE>verbosity</CODE> &#62; 4
+ or <CODE>workFactor</CODE> &#60; 0 or <CODE>workFactor</CODE> &#62; 250
+ <CODE>BZ_MEM_ERROR</CODE>
+ if not enough memory is available
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table>Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ2_bzCompress</CODE>
+ if <CODE>BZ_OK</CODE> is returned
+ no specific action needed in case of error
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.3.2 <CODE>BZ2_bzCompress</CODE> </H3>
+<!--docid::SEC20::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> int BZ2_bzCompress ( bz_stream *strm, int action );
+</pre></td></tr></table>Provides more input and/or output buffer space for the library. The
+caller maintains input and output buffers, and calls <CODE>BZ2_bzCompress</CODE> to
+transfer data between them.
+<P>
+
+Before each call to <CODE>BZ2_bzCompress</CODE>, <CODE>next_in</CODE> should point at
+the data to be compressed, and <CODE>avail_in</CODE> should indicate how many
+bytes the library may read. <CODE>BZ2_bzCompress</CODE> updates <CODE>next_in</CODE>,
+<CODE>avail_in</CODE> and <CODE>total_in</CODE> to reflect the number of bytes it
+has read.
+</P><P>
+
+Similarly, <CODE>next_out</CODE> should point to a buffer in which the
+compressed data is to be placed, with <CODE>avail_out</CODE> indicating how
+much output space is available. <CODE>BZ2_bzCompress</CODE> updates
+<CODE>next_out</CODE>, <CODE>avail_out</CODE> and <CODE>total_out</CODE> to reflect the
+number of bytes output.
+</P><P>
+
+You may provide and remove as little or as much data as you like on each
+call of <CODE>BZ2_bzCompress</CODE>. In the limit, it is acceptable to supply and
+remove data one byte at a time, although this would be terribly
+inefficient. You should always ensure that at least one byte of output
+space is available at each call.
+</P><P>
+
+A second purpose of <CODE>BZ2_bzCompress</CODE> is to request a change of mode of the
+compressed stream.
+</P><P>
+
+Conceptually, a compressed stream can be in one of four states: IDLE,
+RUNNING, FLUSHING and FINISHING. Before initialisation
+(<CODE>BZ2_bzCompressInit</CODE>) and after termination (<CODE>BZ2_bzCompressEnd</CODE>), a
+stream is regarded as IDLE.
+</P><P>
+
+Upon initialisation (<CODE>BZ2_bzCompressInit</CODE>), the stream is placed in the
+RUNNING state. Subsequent calls to <CODE>BZ2_bzCompress</CODE> should pass
+<CODE>BZ_RUN</CODE> as the requested action; other actions are illegal and
+will result in <CODE>BZ_SEQUENCE_ERROR</CODE>.
+</P><P>
+
+At some point, the calling program will have provided all the input data
+it wants to. It will then want to finish up -- in effect, asking the
+library to process any data it might have buffered internally. In this
+state, <CODE>BZ2_bzCompress</CODE> will no longer attempt to read data from
+<CODE>next_in</CODE>, but it will want to write data to <CODE>next_out</CODE>.
+Because the output buffer supplied by the user can be arbitrarily small,
+the finishing-up operation cannot necessarily be done with a single call
+of <CODE>BZ2_bzCompress</CODE>.
+</P><P>
+
+Instead, the calling program passes <CODE>BZ_FINISH</CODE> as an action to
+<CODE>BZ2_bzCompress</CODE>. This changes the stream's state to FINISHING. Any
+remaining input (ie, <CODE>next_in[0 .. avail_in-1]</CODE>) is compressed and
+transferred to the output buffer. To do this, <CODE>BZ2_bzCompress</CODE> must be
+called repeatedly until all the output has been consumed. At that
+point, <CODE>BZ2_bzCompress</CODE> returns <CODE>BZ_STREAM_END</CODE>, and the stream's
+state is set back to IDLE. <CODE>BZ2_bzCompressEnd</CODE> should then be
+called.
+</P><P>
+
+Just to make sure the calling program does not cheat, the library makes
+a note of <CODE>avail_in</CODE> at the time of the first call to
+<CODE>BZ2_bzCompress</CODE> which has <CODE>BZ_FINISH</CODE> as an action (ie, at the
+time the program has announced its intention to not supply any more
+input). By comparing this value with that of <CODE>avail_in</CODE> over
+subsequent calls to <CODE>BZ2_bzCompress</CODE>, the library can detect any
+attempts to slip in more data to compress. Any calls for which this is
+detected will return <CODE>BZ_SEQUENCE_ERROR</CODE>. This indicates a
+programming mistake which should be corrected.
+</P><P>
+
+Instead of asking to finish, the calling program may ask
+<CODE>BZ2_bzCompress</CODE> to take all the remaining input, compress it and
+terminate the current (Burrows-Wheeler) compression block. This could
+be useful for error control purposes. The mechanism is analogous to
+that for finishing: call <CODE>BZ2_bzCompress</CODE> with an action of
+<CODE>BZ_FLUSH</CODE>, remove output data, and persist with the
+<CODE>BZ_FLUSH</CODE> action until the value <CODE>BZ_RUN</CODE> is returned. As
+with finishing, <CODE>BZ2_bzCompress</CODE> detects any attempt to provide more
+input data once the flush has begun.
+</P><P>
+
+Once the flush is complete, the stream returns to the normal RUNNING
+state.
+</P><P>
+
+This all sounds pretty complex, but isn't really. Here's a table
+which shows which actions are allowable in each state, what action
+will be taken, what the next state is, and what the non-error return
+values are. Note that you can't explicitly ask what state the
+stream is in, but nor do you need to -- it can be inferred from the
+values returned by <CODE>BZ2_bzCompress</CODE>.
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">IDLE/<CODE>any</CODE>
+ Illegal. IDLE state only exists after <CODE>BZ2_bzCompressEnd</CODE> or
+ before <CODE>BZ2_bzCompressInit</CODE>.
+ Return value = <CODE>BZ_SEQUENCE_ERROR</CODE>
+
+RUNNING/<CODE>BZ_RUN</CODE>
+ Compress from <CODE>next_in</CODE> to <CODE>next_out</CODE> as much as possible.
+ Next state = RUNNING
+ Return value = <CODE>BZ_RUN_OK</CODE>
+
+RUNNING/<CODE>BZ_FLUSH</CODE>
+ Remember current value of <CODE>next_in</CODE>. Compress from <CODE>next_in</CODE>
+ to <CODE>next_out</CODE> as much as possible, but do not accept any more input.
+ Next state = FLUSHING
+ Return value = <CODE>BZ_FLUSH_OK</CODE>
+
+RUNNING/<CODE>BZ_FINISH</CODE>
+ Remember current value of <CODE>next_in</CODE>. Compress from <CODE>next_in</CODE>
+ to <CODE>next_out</CODE> as much as possible, but do not accept any more input.
+ Next state = FINISHING
+ Return value = <CODE>BZ_FINISH_OK</CODE>
+
+FLUSHING/<CODE>BZ_FLUSH</CODE>
+ Compress from <CODE>next_in</CODE> to <CODE>next_out</CODE> as much as possible,
+ but do not accept any more input.
+ If all the existing input has been used up and all compressed
+ output has been removed
+ Next state = RUNNING; Return value = <CODE>BZ_RUN_OK</CODE>
+ else
+ Next state = FLUSHING; Return value = <CODE>BZ_FLUSH_OK</CODE>
+
+FLUSHING/other
+ Illegal.
+ Return value = <CODE>BZ_SEQUENCE_ERROR</CODE>
+
+FINISHING/<CODE>BZ_FINISH</CODE>
+ Compress from <CODE>next_in</CODE> to <CODE>next_out</CODE> as much as possible,
+ but to not accept any more input.
+ If all the existing input has been used up and all compressed
+ output has been removed
+ Next state = IDLE; Return value = <CODE>BZ_STREAM_END</CODE>
+ else
+ Next state = FINISHING; Return value = <CODE>BZ_FINISHING</CODE>
+
+FINISHING/other
+ Illegal.
+ Return value = <CODE>BZ_SEQUENCE_ERROR</CODE>
+</pre></td></tr></table></P><P>
+
+That still looks complicated? Well, fair enough. The usual sequence
+of calls for compressing a load of data is:
+<UL>
+<LI>Get started with <CODE>BZ2_bzCompressInit</CODE>.
+<LI>Shovel data in and shlurp out its compressed form using zero or more
+calls of <CODE>BZ2_bzCompress</CODE> with action = <CODE>BZ_RUN</CODE>.
+<LI>Finish up.
+Repeatedly call <CODE>BZ2_bzCompress</CODE> with action = <CODE>BZ_FINISH</CODE>,
+copying out the compressed output, until <CODE>BZ_STREAM_END</CODE> is returned.
+<LI>Close up and go home. Call <CODE>BZ2_bzCompressEnd</CODE>.
+</UL>
+If the data you want to compress fits into your input buffer all
+at once, you can skip the calls of <CODE>BZ2_bzCompress ( ..., BZ_RUN )</CODE> and
+just do the <CODE>BZ2_bzCompress ( ..., BZ_FINISH )</CODE> calls.
+<P>
+
+All required memory is allocated by <CODE>BZ2_bzCompressInit</CODE>. The
+compression library can accept any data at all (obviously). So you
+shouldn't get any error return values from the <CODE>BZ2_bzCompress</CODE> calls.
+If you do, they will be <CODE>BZ_SEQUENCE_ERROR</CODE>, and indicate a bug in
+your programming.
+</P><P>
+
+Trivial other possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>strm</CODE> is <CODE>NULL</CODE>, or <CODE>strm-&#62;s</CODE> is <CODE>NULL</CODE>
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.3.3 <CODE>BZ2_bzCompressEnd</CODE> </H3>
+<!--docid::SEC21::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>int BZ2_bzCompressEnd ( bz_stream *strm );
+</pre></td></tr></table>Releases all memory associated with a compression stream.
+<P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE> if <CODE>strm</CODE> is <CODE>NULL</CODE> or <CODE>strm-&#62;s</CODE> is <CODE>NULL</CODE>
+ <CODE>BZ_OK</CODE> otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.3.4 <CODE>BZ2_bzDecompressInit</CODE> </H3>
+<!--docid::SEC22::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
+</pre></td></tr></table>Prepares for decompression. As with <CODE>BZ2_bzCompressInit</CODE>, a
+<CODE>bz_stream</CODE> record should be allocated and initialised before the
+call. Fields <CODE>bzalloc</CODE>, <CODE>bzfree</CODE> and <CODE>opaque</CODE> should be
+set if a custom memory allocator is required, or made <CODE>NULL</CODE> for
+the normal <CODE>malloc</CODE>/<CODE>free</CODE> routines. Upon return, the internal
+state will have been initialised, and <CODE>total_in</CODE> and
+<CODE>total_out</CODE> will be zero.
+<P>
+
+For the meaning of parameter <CODE>verbosity</CODE>, see <CODE>BZ2_bzCompressInit</CODE>.
+</P><P>
+
+If <CODE>small</CODE> is nonzero, the library will use an alternative
+decompression algorithm which uses less memory but at the cost of
+decompressing more slowly (roughly speaking, half the speed, but the
+maximum memory requirement drops to around 2300k). See Chapter 2 for
+more information on memory management.
+</P><P>
+
+Note that the amount of memory needed to decompress
+a stream cannot be determined until the stream's header has been read,
+so even if <CODE>BZ2_bzDecompressInit</CODE> succeeds, a subsequent
+<CODE>BZ2_bzDecompress</CODE> could fail with <CODE>BZ_MEM_ERROR</CODE>.
+</P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_CONFIG_ERROR</CODE>
+ if the library has been mis-compiled
+ <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>(small != 0 &#38;&#38; small != 1)</CODE>
+ or <CODE>(verbosity &#60; 0 || verbosity &#62; 4)</CODE>
+ <CODE>BZ_MEM_ERROR</CODE>
+ if insufficient memory is available
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ2_bzDecompress</CODE>
+ if <CODE>BZ_OK</CODE> was returned
+ no specific action required in case of error
+</pre></td></tr></table></P><P>
+
+
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.3.5 <CODE>BZ2_bzDecompress</CODE> </H3>
+<!--docid::SEC23::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>int BZ2_bzDecompress ( bz_stream *strm );
+</pre></td></tr></table>Provides more input and/out output buffer space for the library. The
+caller maintains input and output buffers, and uses <CODE>BZ2_bzDecompress</CODE>
+to transfer data between them.
+<P>
+
+Before each call to <CODE>BZ2_bzDecompress</CODE>, <CODE>next_in</CODE>
+should point at the compressed data,
+and <CODE>avail_in</CODE> should indicate how many bytes the library
+may read. <CODE>BZ2_bzDecompress</CODE> updates <CODE>next_in</CODE>, <CODE>avail_in</CODE>
+and <CODE>total_in</CODE>
+to reflect the number of bytes it has read.
+</P><P>
+
+Similarly, <CODE>next_out</CODE> should point to a buffer in which the uncompressed
+output is to be placed, with <CODE>avail_out</CODE> indicating how much output space
+is available. <CODE>BZ2_bzCompress</CODE> updates <CODE>next_out</CODE>,
+<CODE>avail_out</CODE> and <CODE>total_out</CODE> to reflect
+the number of bytes output.
+</P><P>
+
+You may provide and remove as little or as much data as you like on
+each call of <CODE>BZ2_bzDecompress</CODE>.
+In the limit, it is acceptable to
+supply and remove data one byte at a time, although this would be
+terribly inefficient. You should always ensure that at least one
+byte of output space is available at each call.
+</P><P>
+
+Use of <CODE>BZ2_bzDecompress</CODE> is simpler than <CODE>BZ2_bzCompress</CODE>.
+</P><P>
+
+You should provide input and remove output as described above, and
+repeatedly call <CODE>BZ2_bzDecompress</CODE> until <CODE>BZ_STREAM_END</CODE> is
+returned. Appearance of <CODE>BZ_STREAM_END</CODE> denotes that
+<CODE>BZ2_bzDecompress</CODE> has detected the logical end of the compressed
+stream. <CODE>BZ2_bzDecompress</CODE> will not produce <CODE>BZ_STREAM_END</CODE> until
+all output data has been placed into the output buffer, so once
+<CODE>BZ_STREAM_END</CODE> appears, you are guaranteed to have available all
+the decompressed output, and <CODE>BZ2_bzDecompressEnd</CODE> can safely be
+called.
+</P><P>
+
+If case of an error return value, you should call <CODE>BZ2_bzDecompressEnd</CODE>
+to clean up and release memory.
+</P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>strm</CODE> is <CODE>NULL</CODE> or <CODE>strm-&#62;s</CODE> is <CODE>NULL</CODE>
+ or <CODE>strm-&#62;avail_out &#60; 1</CODE>
+ <CODE>BZ_DATA_ERROR</CODE>
+ if a data integrity error is detected in the compressed stream
+ <CODE>BZ_DATA_ERROR_MAGIC</CODE>
+ if the compressed stream doesn't begin with the right magic bytes
+ <CODE>BZ_MEM_ERROR</CODE>
+ if there wasn't enough memory available
+ <CODE>BZ_STREAM_END</CODE>
+ if the logical end of the data stream was detected and all
+ output in has been consumed, eg <CODE>s-&#62;avail_out &#62; 0</CODE>
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table>Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ2_bzDecompress</CODE>
+ if <CODE>BZ_OK</CODE> was returned
+ <CODE>BZ2_bzDecompressEnd</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.3.6 <CODE>BZ2_bzDecompressEnd</CODE> </H3>
+<!--docid::SEC24::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>int BZ2_bzDecompressEnd ( bz_stream *strm );
+</pre></td></tr></table>Releases all memory associated with a decompression stream.
+<P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>strm</CODE> is <CODE>NULL</CODE> or <CODE>strm-&#62;s</CODE> is <CODE>NULL</CODE>
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> None.
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC26"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.4 High-level interface </H2>
+<!--docid::SEC25::-->
+<P>
+
+This interface provides functions for reading and writing
+<CODE>bzip2</CODE> format files. First, some general points.
+</P><P>
+
+<UL>
+<LI>All of the functions take an <CODE>int*</CODE> first argument,
+ <CODE>bzerror</CODE>.
+ After each call, <CODE>bzerror</CODE> should be consulted first to determine
+ the outcome of the call. If <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE>,
+ the call completed
+ successfully, and only then should the return value of the function
+ (if any) be consulted. If <CODE>bzerror</CODE> is <CODE>BZ_IO_ERROR</CODE>,
+ there was an error
+ reading/writing the underlying compressed file, and you should
+ then consult <CODE>errno</CODE>/<CODE>perror</CODE> to determine the
+ cause of the difficulty.
+ <CODE>bzerror</CODE> may also be set to various other values; precise details are
+ given on a per-function basis below.
+<LI>If <CODE>bzerror</CODE> indicates an error
+ (ie, anything except <CODE>BZ_OK</CODE> and <CODE>BZ_STREAM_END</CODE>),
+ you should immediately call <CODE>BZ2_bzReadClose</CODE> (or <CODE>BZ2_bzWriteClose</CODE>,
+ depending on whether you are attempting to read or to write)
+ to free up all resources associated
+ with the stream. Once an error has been indicated, behaviour of all calls
+ except <CODE>BZ2_bzReadClose</CODE> (<CODE>BZ2_bzWriteClose</CODE>) is undefined.
+ The implication is that (1) <CODE>bzerror</CODE> should
+ be checked after each call, and (2) if <CODE>bzerror</CODE> indicates an error,
+ <CODE>BZ2_bzReadClose</CODE> (<CODE>BZ2_bzWriteClose</CODE>) should then be called to clean up.
+<LI>The <CODE>FILE*</CODE> arguments passed to
+ <CODE>BZ2_bzReadOpen</CODE>/<CODE>BZ2_bzWriteOpen</CODE>
+ should be set to binary mode.
+ Most Unix systems will do this by default, but other platforms,
+ including Windows and Mac, will not. If you omit this, you may
+ encounter problems when moving code to new platforms.
+<LI>Memory allocation requests are handled by
+ <CODE>malloc</CODE>/<CODE>free</CODE>.
+ At present
+ there is no facility for user-defined memory allocators in the file I/O
+ functions (could easily be added, though).
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC26"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC25"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC27"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.1 <CODE>BZ2_bzReadOpen</CODE> </H3>
+<!--docid::SEC26::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> typedef void BZFILE;
+
+ BZFILE *BZ2_bzReadOpen ( int *bzerror, FILE *f,
+ int small, int verbosity,
+ void *unused, int nUnused );
+</pre></td></tr></table>Prepare to read compressed data from file handle <CODE>f</CODE>. <CODE>f</CODE>
+should refer to a file which has been opened for reading, and for which
+the error indicator (<CODE>ferror(f)</CODE>)is not set. If <CODE>small</CODE> is 1,
+the library will try to decompress using less memory, at the expense of
+speed.
+<P>
+
+For reasons explained below, <CODE>BZ2_bzRead</CODE> will decompress the
+<CODE>nUnused</CODE> bytes starting at <CODE>unused</CODE>, before starting to read
+from the file <CODE>f</CODE>. At most <CODE>BZ_MAX_UNUSED</CODE> bytes may be
+supplied like this. If this facility is not required, you should pass
+<CODE>NULL</CODE> and <CODE>0</CODE> for <CODE>unused</CODE> and n<CODE>Unused</CODE>
+respectively.
+</P><P>
+
+For the meaning of parameters <CODE>small</CODE> and <CODE>verbosity</CODE>,
+see <CODE>BZ2_bzDecompressInit</CODE>.
+</P><P>
+
+The amount of memory needed to decompress a file cannot be determined
+until the file's header has been read. So it is possible that
+<CODE>BZ2_bzReadOpen</CODE> returns <CODE>BZ_OK</CODE> but a subsequent call of
+<CODE>BZ2_bzRead</CODE> will return <CODE>BZ_MEM_ERROR</CODE>.
+</P><P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_CONFIG_ERROR</CODE>
+ if the library has been mis-compiled
+ <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>f</CODE> is <CODE>NULL</CODE>
+ or <CODE>small</CODE> is neither <CODE>0</CODE> nor <CODE>1</CODE>
+ or <CODE>(unused == NULL &#38;&#38; nUnused != 0)</CODE>
+ or <CODE>(unused != NULL &#38;&#38; !(0 &#60;= nUnused &#60;= BZ_MAX_UNUSED))</CODE>
+ <CODE>BZ_IO_ERROR</CODE>
+ if <CODE>ferror(f)</CODE> is nonzero
+ <CODE>BZ_MEM_ERROR</CODE>
+ if insufficient memory is available
+ <CODE>BZ_OK</CODE>
+ otherwise.
+</pre></td></tr></table></P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> Pointer to an abstract <CODE>BZFILE</CODE>
+ if <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE>
+ <CODE>NULL</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ2_bzRead</CODE>
+ if <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE>
+ <CODE>BZ2_bzClose</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC27"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC26"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC28"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.2 <CODE>BZ2_bzRead</CODE> </H3>
+<!--docid::SEC27::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
+</pre></td></tr></table>Reads up to <CODE>len</CODE> (uncompressed) bytes from the compressed file
+<CODE>b</CODE> into
+the buffer <CODE>buf</CODE>. If the read was successful,
+<CODE>bzerror</CODE> is set to <CODE>BZ_OK</CODE>
+and the number of bytes read is returned. If the logical end-of-stream
+was detected, <CODE>bzerror</CODE> will be set to <CODE>BZ_STREAM_END</CODE>,
+and the number
+of bytes read is returned. All other <CODE>bzerror</CODE> values denote an error.
+<P>
+
+<CODE>BZ2_bzRead</CODE> will supply <CODE>len</CODE> bytes,
+unless the logical stream end is detected
+or an error occurs. Because of this, it is possible to detect the
+stream end by observing when the number of bytes returned is
+less than the number
+requested. Nevertheless, this is regarded as inadvisable; you should
+instead check <CODE>bzerror</CODE> after every call and watch out for
+<CODE>BZ_STREAM_END</CODE>.
+</P><P>
+
+Internally, <CODE>BZ2_bzRead</CODE> copies data from the compressed file in chunks
+of size <CODE>BZ_MAX_UNUSED</CODE> bytes
+before decompressing it. If the file contains more bytes than strictly
+needed to reach the logical end-of-stream, <CODE>BZ2_bzRead</CODE> will almost certainly
+read some of the trailing data before signalling <CODE>BZ_SEQUENCE_END</CODE>.
+To collect the read but unused data once <CODE>BZ_SEQUENCE_END</CODE> has
+appeared, call <CODE>BZ2_bzReadGetUnused</CODE> immediately before <CODE>BZ2_bzReadClose</CODE>.
+</P><P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>b</CODE> is <CODE>NULL</CODE> or <CODE>buf</CODE> is <CODE>NULL</CODE> or <CODE>len &#60; 0</CODE>
+ <CODE>BZ_SEQUENCE_ERROR</CODE>
+ if <CODE>b</CODE> was opened with <CODE>BZ2_bzWriteOpen</CODE>
+ <CODE>BZ_IO_ERROR</CODE>
+ if there is an error reading from the compressed file
+ <CODE>BZ_UNEXPECTED_EOF</CODE>
+ if the compressed file ended before the logical end-of-stream was detected
+ <CODE>BZ_DATA_ERROR</CODE>
+ if a data integrity error was detected in the compressed stream
+ <CODE>BZ_DATA_ERROR_MAGIC</CODE>
+ if the stream does not begin with the requisite header bytes (ie, is not
+ a <CODE>bzip2</CODE> data file). This is really a special case of <CODE>BZ_DATA_ERROR</CODE>.
+ <CODE>BZ_MEM_ERROR</CODE>
+ if insufficient memory was available
+ <CODE>BZ_STREAM_END</CODE>
+ if the logical end of stream was detected.
+ <CODE>BZ_OK</CODE>
+ otherwise.
+</pre></td></tr></table></P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> number of bytes read
+ if <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE> or <CODE>BZ_STREAM_END</CODE>
+ undefined
+ otherwise
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> collect data from <CODE>buf</CODE>, then <CODE>BZ2_bzRead</CODE> or <CODE>BZ2_bzReadClose</CODE>
+ if <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE>
+ collect data from <CODE>buf</CODE>, then <CODE>BZ2_bzReadClose</CODE> or <CODE>BZ2_bzReadGetUnused</CODE>
+ if <CODE>bzerror</CODE> is <CODE>BZ_SEQUENCE_END</CODE>
+ <CODE>BZ2_bzReadClose</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC28"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC27"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC29"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.3 <CODE>BZ2_bzReadGetUnused</CODE> </H3>
+<!--docid::SEC28::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> void BZ2_bzReadGetUnused ( int* bzerror, BZFILE *b,
+ void** unused, int* nUnused );
+</pre></td></tr></table>Returns data which was read from the compressed file but was not needed
+to get to the logical end-of-stream. <CODE>*unused</CODE> is set to the address
+of the data, and <CODE>*nUnused</CODE> to the number of bytes. <CODE>*nUnused</CODE> will
+be set to a value between <CODE>0</CODE> and <CODE>BZ_MAX_UNUSED</CODE> inclusive.
+<P>
+
+This function may only be called once <CODE>BZ2_bzRead</CODE> has signalled
+<CODE>BZ_STREAM_END</CODE> but before <CODE>BZ2_bzReadClose</CODE>.
+</P><P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>b</CODE> is <CODE>NULL</CODE>
+ or <CODE>unused</CODE> is <CODE>NULL</CODE> or <CODE>nUnused</CODE> is <CODE>NULL</CODE>
+ <CODE>BZ_SEQUENCE_ERROR</CODE>
+ if <CODE>BZ_STREAM_END</CODE> has not been signalled
+ or if <CODE>b</CODE> was opened with <CODE>BZ2_bzWriteOpen</CODE>
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ2_bzReadClose</CODE>
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC29"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC28"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC30"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.4 <CODE>BZ2_bzReadClose</CODE> </H3>
+<!--docid::SEC29::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
+</pre></td></tr></table>Releases all memory pertaining to the compressed file <CODE>b</CODE>.
+<CODE>BZ2_bzReadClose</CODE> does not call <CODE>fclose</CODE> on the underlying file
+handle, so you should do that yourself if appropriate.
+<CODE>BZ2_bzReadClose</CODE> should be called to clean up after all error
+situations.
+<P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_SEQUENCE_ERROR</CODE>
+ if <CODE>b</CODE> was opened with <CODE>BZ2_bzOpenWrite</CODE>
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> none
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC30"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC29"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC31"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.5 <CODE>BZ2_bzWriteOpen</CODE> </H3>
+<!--docid::SEC30::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> BZFILE *BZ2_bzWriteOpen ( int *bzerror, FILE *f,
+ int blockSize100k, int verbosity,
+ int workFactor );
+</pre></td></tr></table>Prepare to write compressed data to file handle <CODE>f</CODE>.
+<CODE>f</CODE> should refer to
+a file which has been opened for writing, and for which the error
+indicator (<CODE>ferror(f)</CODE>)is not set.
+<P>
+
+For the meaning of parameters <CODE>blockSize100k</CODE>,
+<CODE>verbosity</CODE> and <CODE>workFactor</CODE>, see
+<BR> <CODE>BZ2_bzCompressInit</CODE>.
+</P><P>
+
+All required memory is allocated at this stage, so if the call
+completes successfully, <CODE>BZ_MEM_ERROR</CODE> cannot be signalled by a
+subsequent call to <CODE>BZ2_bzWrite</CODE>.
+</P><P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_CONFIG_ERROR</CODE>
+ if the library has been mis-compiled
+ <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>f</CODE> is <CODE>NULL</CODE>
+ or <CODE>blockSize100k &#60; 1</CODE> or <CODE>blockSize100k &#62; 9</CODE>
+ <CODE>BZ_IO_ERROR</CODE>
+ if <CODE>ferror(f)</CODE> is nonzero
+ <CODE>BZ_MEM_ERROR</CODE>
+ if insufficient memory is available
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> Pointer to an abstract <CODE>BZFILE</CODE>
+ if <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE>
+ <CODE>NULL</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+Allowable next actions:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ2_bzWrite</CODE>
+ if <CODE>bzerror</CODE> is <CODE>BZ_OK</CODE>
+ (you could go directly to <CODE>BZ2_bzWriteClose</CODE>, but this would be pretty pointless)
+ <CODE>BZ2_bzWriteClose</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC31"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC30"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC32"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.6 <CODE>BZ2_bzWrite</CODE> </H3>
+<!--docid::SEC31::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
+</pre></td></tr></table>Absorbs <CODE>len</CODE> bytes from the buffer <CODE>buf</CODE>, eventually to be
+compressed and written to the file.
+<P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>b</CODE> is <CODE>NULL</CODE> or <CODE>buf</CODE> is <CODE>NULL</CODE> or <CODE>len &#60; 0</CODE>
+ <CODE>BZ_SEQUENCE_ERROR</CODE>
+ if b was opened with <CODE>BZ2_bzReadOpen</CODE>
+ <CODE>BZ_IO_ERROR</CODE>
+ if there is an error writing the compressed file.
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC32"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC31"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC33"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.7 <CODE>BZ2_bzWriteClose</CODE> </H3>
+<!--docid::SEC32::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> void BZ2_bzWriteClose ( int *bzerror, BZFILE* f,
+ int abandon,
+ unsigned int* nbytes_in,
+ unsigned int* nbytes_out );
+
+ void BZ2_bzWriteClose64 ( int *bzerror, BZFILE* f,
+ int abandon,
+ unsigned int* nbytes_in_lo32,
+ unsigned int* nbytes_in_hi32,
+ unsigned int* nbytes_out_lo32,
+ unsigned int* nbytes_out_hi32 );
+</pre></td></tr></table><P>
+
+Compresses and flushes to the compressed file all data so far supplied
+by <CODE>BZ2_bzWrite</CODE>. The logical end-of-stream markers are also written, so
+subsequent calls to <CODE>BZ2_bzWrite</CODE> are illegal. All memory associated
+with the compressed file <CODE>b</CODE> is released.
+<CODE>fflush</CODE> is called on the
+compressed file, but it is not <CODE>fclose</CODE>'d.
+</P><P>
+
+If <CODE>BZ2_bzWriteClose</CODE> is called to clean up after an error, the only
+action is to release the memory. The library records the error codes
+issued by previous calls, so this situation will be detected
+automatically. There is no attempt to complete the compression
+operation, nor to <CODE>fflush</CODE> the compressed file. You can force this
+behaviour to happen even in the case of no error, by passing a nonzero
+value to <CODE>abandon</CODE>.
+</P><P>
+
+If <CODE>nbytes_in</CODE> is non-null, <CODE>*nbytes_in</CODE> will be set to be the
+total volume of uncompressed data handled. Similarly, <CODE>nbytes_out</CODE>
+will be set to the total volume of compressed data written. For
+compatibility with older versions of the library, <CODE>BZ2_bzWriteClose</CODE>
+only yields the lower 32 bits of these counts. Use
+<CODE>BZ2_bzWriteClose64</CODE> if you want the full 64 bit counts. These
+two functions are otherwise absolutely identical.
+</P><P>
+
+Possible assignments to <CODE>bzerror</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_SEQUENCE_ERROR</CODE>
+ if <CODE>b</CODE> was opened with <CODE>BZ2_bzReadOpen</CODE>
+ <CODE>BZ_IO_ERROR</CODE>
+ if there is an error writing the compressed file
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC33"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC32"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC34"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.8 Handling embedded compressed data streams </H3>
+<!--docid::SEC33::-->
+<P>
+
+The high-level library facilitates use of
+<CODE>bzip2</CODE> data streams which form some part of a surrounding, larger
+data stream.
+<UL>
+<LI>For writing, the library takes an open file handle, writes
+compressed data to it, <CODE>fflush</CODE>es it but does not <CODE>fclose</CODE> it.
+The calling application can write its own data before and after the
+compressed data stream, using that same file handle.
+<LI>Reading is more complex, and the facilities are not as general
+as they could be since generality is hard to reconcile with efficiency.
+<CODE>BZ2_bzRead</CODE> reads from the compressed file in blocks of size
+<CODE>BZ_MAX_UNUSED</CODE> bytes, and in doing so probably will overshoot
+the logical end of compressed stream.
+To recover this data once decompression has
+ended, call <CODE>BZ2_bzReadGetUnused</CODE> after the last call of <CODE>BZ2_bzRead</CODE>
+(the one returning <CODE>BZ_STREAM_END</CODE>) but before calling
+<CODE>BZ2_bzReadClose</CODE>.
+</UL>
+<P>
+
+This mechanism makes it easy to decompress multiple <CODE>bzip2</CODE>
+streams placed end-to-end. As the end of one stream, when <CODE>BZ2_bzRead</CODE>
+returns <CODE>BZ_STREAM_END</CODE>, call <CODE>BZ2_bzReadGetUnused</CODE> to collect the
+unused data (copy it into your own buffer somewhere).
+That data forms the start of the next compressed stream.
+To start uncompressing that next stream, call <CODE>BZ2_bzReadOpen</CODE> again,
+feeding in the unused data via the <CODE>unused</CODE>/<CODE>nUnused</CODE>
+parameters.
+Keep doing this until <CODE>BZ_STREAM_END</CODE> return coincides with the
+physical end of file (<CODE>feof(f)</CODE>). In this situation
+<CODE>BZ2_bzReadGetUnused</CODE>
+will of course return no data.
+</P><P>
+
+This should give some feel for how the high-level interface can be used.
+If you require extra flexibility, you'll have to bite the bullet and get
+to grips with the low-level interface.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC34"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC33"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC35"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.9 Standard file-reading/writing code </H3>
+<!--docid::SEC34::-->
+Here's how you'd write data to a compressed file:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>FILE* f;
+BZFILE* b;
+int nBuf;
+char buf[ /* whatever size you like */ ];
+int bzerror;
+int nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if (!f) {
+ /* handle error */
+}
+b = BZ2_bzWriteOpen ( &#38;bzerror, f, 9 );
+if (bzerror != BZ_OK) {
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+}
+
+while ( /* condition */ ) {
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &#38;bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) {
+ BZ2_bzWriteClose ( &#38;bzerror, b );
+ /* handle error */
+ }
+}
+
+BZ2_bzWriteClose ( &#38;bzerror, b );
+if (bzerror == BZ_IO_ERROR) {
+ /* handle error */
+}
+</pre></td></tr></table>And to read from a compressed file:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>FILE* f;
+BZFILE* b;
+int nBuf;
+char buf[ /* whatever size you like */ ];
+int bzerror;
+int nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if (!f) {
+ /* handle error */
+}
+b = BZ2_bzReadOpen ( &#38;bzerror, f, 0, NULL, 0 );
+if (bzerror != BZ_OK) {
+ BZ2_bzReadClose ( &#38;bzerror, b );
+ /* handle error */
+}
+
+bzerror = BZ_OK;
+while (bzerror == BZ_OK &#38;&#38; /* arbitrary other conditions */) {
+ nBuf = BZ2_bzRead ( &#38;bzerror, b, buf, /* size of buf */ );
+ if (bzerror == BZ_OK) {
+ /* do something with buf[0 .. nBuf-1] */
+ }
+}
+if (bzerror != BZ_STREAM_END) {
+ BZ2_bzReadClose ( &#38;bzerror, b );
+ /* handle error */
+} else {
+ BZ2_bzReadClose ( &#38;bzerror );
+}
+</pre></td></tr></table><P>
+
+<HR SIZE="6">
+<A NAME="SEC35"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC34"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC36"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.5 Utility functions </H2>
+<!--docid::SEC35::-->
+<HR SIZE="6">
+<A NAME="SEC36"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC35"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC37"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.1 <CODE>BZ2_bzBuffToBuffCompress</CODE> </H3>
+<!--docid::SEC36::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> int BZ2_bzBuffToBuffCompress( char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int blockSize100k,
+ int verbosity,
+ int workFactor );
+</pre></td></tr></table>Attempts to compress the data in <CODE>source[0 .. sourceLen-1]</CODE>
+into the destination buffer, <CODE>dest[0 .. *destLen-1]</CODE>.
+If the destination buffer is big enough, <CODE>*destLen</CODE> is
+set to the size of the compressed data, and <CODE>BZ_OK</CODE> is
+returned. If the compressed data won't fit, <CODE>*destLen</CODE>
+is unchanged, and <CODE>BZ_OUTBUFF_FULL</CODE> is returned.
+<P>
+
+Compression in this manner is a one-shot event, done with a single call
+to this function. The resulting compressed data is a complete
+<CODE>bzip2</CODE> format data stream. There is no mechanism for making
+additional calls to provide extra input data. If you want that kind of
+mechanism, use the low-level interface.
+</P><P>
+
+For the meaning of parameters <CODE>blockSize100k</CODE>, <CODE>verbosity</CODE>
+and <CODE>workFactor</CODE>, <BR> see <CODE>BZ2_bzCompressInit</CODE>.
+</P><P>
+
+To guarantee that the compressed data will fit in its buffer, allocate
+an output buffer of size 1% larger than the uncompressed data, plus
+six hundred extra bytes.
+</P><P>
+
+<CODE>BZ2_bzBuffToBuffDecompress</CODE> will not write data at or
+beyond <CODE>dest[*destLen]</CODE>, even in case of buffer overflow.
+</P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_CONFIG_ERROR</CODE>
+ if the library has been mis-compiled
+ <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>dest</CODE> is <CODE>NULL</CODE> or <CODE>destLen</CODE> is <CODE>NULL</CODE>
+ or <CODE>blockSize100k &#60; 1</CODE> or <CODE>blockSize100k &#62; 9</CODE>
+ or <CODE>verbosity &#60; 0</CODE> or <CODE>verbosity &#62; 4</CODE>
+ or <CODE>workFactor &#60; 0</CODE> or <CODE>workFactor &#62; 250</CODE>
+ <CODE>BZ_MEM_ERROR</CODE>
+ if insufficient memory is available
+ <CODE>BZ_OUTBUFF_FULL</CODE>
+ if the size of the compressed data exceeds <CODE>*destLen</CODE>
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC37"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC36"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC38"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.2 <CODE>BZ2_bzBuffToBuffDecompress</CODE> </H3>
+<!--docid::SEC37::-->
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> int BZ2_bzBuffToBuffDecompress ( char* dest,
+ unsigned int* destLen,
+ char* source,
+ unsigned int sourceLen,
+ int small,
+ int verbosity );
+</pre></td></tr></table>Attempts to decompress the data in <CODE>source[0 .. sourceLen-1]</CODE>
+into the destination buffer, <CODE>dest[0 .. *destLen-1]</CODE>.
+If the destination buffer is big enough, <CODE>*destLen</CODE> is
+set to the size of the uncompressed data, and <CODE>BZ_OK</CODE> is
+returned. If the compressed data won't fit, <CODE>*destLen</CODE>
+is unchanged, and <CODE>BZ_OUTBUFF_FULL</CODE> is returned.
+<P>
+
+<CODE>source</CODE> is assumed to hold a complete <CODE>bzip2</CODE> format
+data stream. <BR> <CODE>BZ2_bzBuffToBuffDecompress</CODE> tries to decompress
+the entirety of the stream into the output buffer.
+</P><P>
+
+For the meaning of parameters <CODE>small</CODE> and <CODE>verbosity</CODE>,
+see <CODE>BZ2_bzDecompressInit</CODE>.
+</P><P>
+
+Because the compression ratio of the compressed data cannot be known in
+advance, there is no easy way to guarantee that the output buffer will
+be big enough. You may of course make arrangements in your code to
+record the size of the uncompressed data, but such a mechanism is beyond
+the scope of this library.
+</P><P>
+
+<CODE>BZ2_bzBuffToBuffDecompress</CODE> will not write data at or
+beyond <CODE>dest[*destLen]</CODE>, even in case of buffer overflow.
+</P><P>
+
+Possible return values:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> <CODE>BZ_CONFIG_ERROR</CODE>
+ if the library has been mis-compiled
+ <CODE>BZ_PARAM_ERROR</CODE>
+ if <CODE>dest</CODE> is <CODE>NULL</CODE> or <CODE>destLen</CODE> is <CODE>NULL</CODE>
+ or <CODE>small != 0 &#38;&#38; small != 1</CODE>
+ or <CODE>verbosity &#60; 0</CODE> or <CODE>verbosity &#62; 4</CODE>
+ <CODE>BZ_MEM_ERROR</CODE>
+ if insufficient memory is available
+ <CODE>BZ_OUTBUFF_FULL</CODE>
+ if the size of the compressed data exceeds <CODE>*destLen</CODE>
+ <CODE>BZ_DATA_ERROR</CODE>
+ if a data integrity error was detected in the compressed data
+ <CODE>BZ_DATA_ERROR_MAGIC</CODE>
+ if the compressed data doesn't begin with the right magic bytes
+ <CODE>BZ_UNEXPECTED_EOF</CODE>
+ if the compressed data ends unexpectedly
+ <CODE>BZ_OK</CODE>
+ otherwise
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC38"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC37"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC39"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.6 <CODE>zlib</CODE> compatibility functions </H2>
+<!--docid::SEC38::-->
+Yoshioka Tsuneo has contributed some functions to
+give better <CODE>zlib</CODE> compatibility. These functions are
+<CODE>BZ2_bzopen</CODE>, <CODE>BZ2_bzread</CODE>, <CODE>BZ2_bzwrite</CODE>, <CODE>BZ2_bzflush</CODE>,
+<CODE>BZ2_bzclose</CODE>,
+<CODE>BZ2_bzerror</CODE> and <CODE>BZ2_bzlibVersion</CODE>.
+These functions are not (yet) officially part of
+the library. If they break, you get to keep all the pieces.
+Nevertheless, I think they work ok.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );
+</pre></td></tr></table>Returns a string indicating the library version.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>BZFILE * BZ2_bzopen ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int fd, const char *mode );
+</pre></td></tr></table>Opens a <CODE>.bz2</CODE> file for reading or writing, using either its name
+or a pre-existing file descriptor.
+Analogous to <CODE>fopen</CODE> and <CODE>fdopen</CODE>.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>int BZ2_bzread ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
+</pre></td></tr></table>Reads/writes data from/to a previously opened <CODE>BZFILE</CODE>.
+Analogous to <CODE>fread</CODE> and <CODE>fwrite</CODE>.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>int BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );
+</pre></td></tr></table>Flushes/closes a <CODE>BZFILE</CODE>. <CODE>BZ2_bzflush</CODE> doesn't actually do
+anything. Analogous to <CODE>fflush</CODE> and <CODE>fclose</CODE>.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>const char * BZ2_bzerror ( BZFILE *b, int *errnum )
+</pre></td></tr></table>Returns a string describing the more recent error status of
+<CODE>b</CODE>, and also sets <CODE>*errnum</CODE> to its numerical value.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC39"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC38"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC40"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.7 Using the library in a <CODE>stdio</CODE>-free environment </H2>
+<!--docid::SEC39::-->
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC40"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC39"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC41"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.1 Getting rid of <CODE>stdio</CODE> </H3>
+<!--docid::SEC40::-->
+<P>
+
+In a deeply embedded application, you might want to use just
+the memory-to-memory functions. You can do this conveniently
+by compiling the library with preprocessor symbol <CODE>BZ_NO_STDIO</CODE>
+defined. Doing this gives you a library containing only the following
+eight functions:
+</P><P>
+
+<CODE>BZ2_bzCompressInit</CODE>, <CODE>BZ2_bzCompress</CODE>, <CODE>BZ2_bzCompressEnd</CODE> <BR>
+<CODE>BZ2_bzDecompressInit</CODE>, <CODE>BZ2_bzDecompress</CODE>, <CODE>BZ2_bzDecompressEnd</CODE> <BR>
+<CODE>BZ2_bzBuffToBuffCompress</CODE>, <CODE>BZ2_bzBuffToBuffDecompress</CODE>
+</P><P>
+
+When compiled like this, all functions will ignore <CODE>verbosity</CODE>
+settings.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC41"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC40"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC42"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.2 Critical error handling </H3>
+<!--docid::SEC41::-->
+<CODE>libbzip2</CODE> contains a number of internal assertion checks which
+should, needless to say, never be activated. Nevertheless, if an
+assertion should fail, behaviour depends on whether or not the library
+was compiled with <CODE>BZ_NO_STDIO</CODE> set.
+<P>
+
+For a normal compile, an assertion failure yields the message
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> bzip2/libbzip2: internal error number N.
+ This is a bug in bzip2/libbzip2, 1.0.2, 30-Dec-2001.
+ Please report it to me at: jseward@acm.org. If this happened
+ when you were using some program which uses libbzip2 as a
+ component, you should also report this bug to the author(s)
+ of that program. Please make an effort to report this bug;
+ timely and accurate bug reports eventually lead to higher
+ quality software. Thanks. Julian Seward, 30 December 2001.
+</pre></td></tr></table>where <CODE>N</CODE> is some error code number. If <CODE>N == 1007</CODE>, it also
+prints some extra text advising the reader that unreliable memory is
+often associated with internal error 1007. (This is a
+frequently-observed-phenomenon with versions 1.0.0/1.0.1).
+</P><P>
+
+<CODE>exit(3)</CODE> is then called.
+</P><P>
+
+For a <CODE>stdio</CODE>-free library, assertion failures result
+in a call to a function declared as:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> extern void bz_internal_error ( int errcode );
+</pre></td></tr></table>The relevant code is passed as a parameter. You should supply
+such a function.
+</P><P>
+
+In either case, once an assertion failure has occurred, any
+<CODE>bz_stream</CODE> records involved can be regarded as invalid.
+You should not attempt to resume normal operation with them.
+</P><P>
+
+You may, of course, change critical error handling to suit
+your needs. As I said above, critical errors indicate bugs
+in the library and should not occur. All "normal" error
+situations are indicated via error return codes from functions,
+and can be recovered from.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC42"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC41"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC43"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.8 Making a Windows DLL </H2>
+<!--docid::SEC42::-->
+Everything related to Windows has been contributed by Yoshioka Tsuneo
+<BR> (<CODE>QWF00133@niftyserve.or.jp</CODE> /
+<CODE>tsuneo-y@is.aist-nara.ac.jp</CODE>), so you should send your queries to
+him (but perhaps Cc: me, <CODE>jseward@acm.org</CODE>).
+<P>
+
+My vague understanding of what to do is: using Visual C++ 5.0,
+open the project file <CODE>libbz2.dsp</CODE>, and build. That's all.
+</P><P>
+
+If you can't
+open the project file for some reason, make a new one, naming these files:
+<CODE>blocksort.c</CODE>, <CODE>bzlib.c</CODE>, <CODE>compress.c</CODE>,
+<CODE>crctable.c</CODE>, <CODE>decompress.c</CODE>, <CODE>huffman.c</CODE>, <BR>
+<CODE>randtable.c</CODE> and <CODE>libbz2.def</CODE>. You will also need
+to name the header files <CODE>bzlib.h</CODE> and <CODE>bzlib_private.h</CODE>.
+</P><P>
+
+If you don't use VC++, you may need to define the proprocessor symbol
+<CODE>_WIN32</CODE>.
+</P><P>
+
+Finally, <CODE>dlltest.c</CODE> is a sample program using the DLL. It has a
+project file, <CODE>dlltest.dsp</CODE>.
+</P><P>
+
+If you just want a makefile for Visual C, have a look at
+<CODE>makefile.msc</CODE>.
+</P><P>
+
+Be aware that if you compile <CODE>bzip2</CODE> itself on Win32, you must set
+<CODE>BZ_UNIX</CODE> to 0 and <CODE>BZ_LCCWIN32</CODE> to 1, in the file
+<CODE>bzip2.c</CODE>, before compiling. Otherwise the resulting binary won't
+work correctly.
+</P><P>
+
+I haven't tried any of this stuff myself, but it all looks plausible.
+</P><P>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/manual_4.html b/Build/source/utils/bzip2/manual_4.html
new file mode 100644
index 00000000000..fbe3938a823
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_4.html
@@ -0,0 +1,530 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: 4. Miscellanea</TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: 4. Miscellanea">
+<META NAME="keywords" CONTENT="Untitled Document: 4. Miscellanea">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC43"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_3.html#SEC42"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC44"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 4. Miscellanea </H1>
+<!--docid::SEC43::-->
+<P>
+
+These are just some random thoughts of mine. Your mileage may
+vary.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC44"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC43"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC45"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.1 Limitations of the compressed file format </H2>
+<!--docid::SEC44::-->
+<CODE>bzip2-1.0</CODE>, <CODE>0.9.5</CODE> and <CODE>0.9.0</CODE>
+use exactly the same file format as the previous
+version, <CODE>bzip2-0.1</CODE>. This decision was made in the interests of
+stability. Creating yet another incompatible compressed file format
+would create further confusion and disruption for users.
+<P>
+
+Nevertheless, this is not a painless decision. Development
+work since the release of <CODE>bzip2-0.1</CODE> in August 1997
+has shown complexities in the file format which slow down
+decompression and, in retrospect, are unnecessary. These are:
+<UL>
+<LI>The run-length encoder, which is the first of the
+ compression transformations, is entirely irrelevant.
+ The original purpose was to protect the sorting algorithm
+ from the very worst case input: a string of repeated
+ symbols. But algorithm steps Q6a and Q6b in the original
+ Burrows-Wheeler technical report (SRC-124) show how
+ repeats can be handled without difficulty in block
+ sorting.
+<LI>The randomisation mechanism doesn't really need to be
+ there. Udi Manber and Gene Myers published a suffix
+ array construction algorithm a few years back, which
+ can be employed to sort any block, no matter how
+ repetitive, in O(N log N) time. Subsequent work by
+ Kunihiko Sadakane has produced a derivative O(N (log N)^2)
+ algorithm which usually outperforms the Manber-Myers
+ algorithm.
+<P>
+
+ I could have changed to Sadakane's algorithm, but I find
+ it to be slower than <CODE>bzip2</CODE>'s existing algorithm for
+ most inputs, and the randomisation mechanism protects
+ adequately against bad cases. I didn't think it was
+ a good tradeoff to make. Partly this is due to the fact
+ that I was not flooded with email complaints about
+ <CODE>bzip2-0.1</CODE>'s performance on repetitive data, so
+ perhaps it isn't a problem for real inputs.
+</P><P>
+
+ Probably the best long-term solution,
+ and the one I have incorporated into 0.9.5 and above,
+ is to use the existing sorting
+ algorithm initially, and fall back to a O(N (log N)^2)
+ algorithm if the standard algorithm gets into difficulties.
+<LI>The compressed file format was never designed to be
+ handled by a library, and I have had to jump though
+ some hoops to produce an efficient implementation of
+ decompression. It's a bit hairy. Try passing
+ <CODE>decompress.c</CODE> through the C preprocessor
+ and you'll see what I mean. Much of this complexity
+ could have been avoided if the compressed size of
+ each block of data was recorded in the data stream.
+<LI>An Adler-32 checksum, rather than a CRC32 checksum,
+ would be faster to compute.
+</UL>
+It would be fair to say that the <CODE>bzip2</CODE> format was frozen
+before I properly and fully understood the performance
+consequences of doing so.
+<P>
+
+Improvements which I was able to incorporate into
+0.9.0, despite using the same file format, are:
+<UL>
+<LI>Single array implementation of the inverse BWT. This
+ significantly speeds up decompression, presumably
+ because it reduces the number of cache misses.
+<LI>Faster inverse MTF transform for large MTF values. The
+ new implementation is based on the notion of sliding blocks
+ of values.
+<LI><CODE>bzip2-0.9.0</CODE> now reads and writes files with <CODE>fread</CODE>
+ and <CODE>fwrite</CODE>; version 0.1 used <CODE>putc</CODE> and <CODE>getc</CODE>.
+ Duh! Well, you live and learn.
+<P>
+
+</UL>
+Further ahead, it would be nice
+to be able to do random access into files. This will
+require some careful design of compressed file formats.
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC45"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC44"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC46"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.2 Portability issues </H2>
+<!--docid::SEC45::-->
+After some consideration, I have decided not to use
+GNU <CODE>autoconf</CODE> to configure 0.9.5 or 1.0.
+<P>
+
+<CODE>autoconf</CODE>, admirable and wonderful though it is,
+mainly assists with portability problems between Unix-like
+platforms. But <CODE>bzip2</CODE> doesn't have much in the way
+of portability problems on Unix; most of the difficulties appear
+when porting to the Mac, or to Microsoft's operating systems.
+<CODE>autoconf</CODE> doesn't help in those cases, and brings in a
+whole load of new complexity.
+</P><P>
+
+Most people should be able to compile the library and program
+under Unix straight out-of-the-box, so to speak, especially
+if you have a version of GNU C available.
+</P><P>
+
+There are a couple of <CODE>__inline__</CODE> directives in the code. GNU C
+(<CODE>gcc</CODE>) should be able to handle them. If you're not using
+GNU C, your C compiler shouldn't see them at all.
+If your compiler does, for some reason, see them and doesn't
+like them, just <CODE>#define</CODE> <CODE>__inline__</CODE> to be <CODE>/* */</CODE>. One
+easy way to do this is to compile with the flag <CODE>-D__inline__=</CODE>,
+which should be understood by most Unix compilers.
+</P><P>
+
+If you still have difficulties, try compiling with the macro
+<CODE>BZ_STRICT_ANSI</CODE> defined. This should enable you to build the
+library in a strictly ANSI compliant environment. Building the program
+itself like this is dangerous and not supported, since you remove
+<CODE>bzip2</CODE>'s checks against compressing directories, symbolic links,
+devices, and other not-really-a-file entities. This could cause
+filesystem corruption!
+</P><P>
+
+One other thing: if you create a <CODE>bzip2</CODE> binary for public
+distribution, please try and link it statically (<CODE>gcc -s</CODE>). This
+avoids all sorts of library-version issues that others may encounter
+later on.
+</P><P>
+
+If you build <CODE>bzip2</CODE> on Win32, you must set <CODE>BZ_UNIX</CODE> to 0 and
+<CODE>BZ_LCCWIN32</CODE> to 1, in the file <CODE>bzip2.c</CODE>, before compiling.
+Otherwise the resulting binary won't work correctly.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC46"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC45"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC47"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.3 Reporting bugs </H2>
+<!--docid::SEC46::-->
+I tried pretty hard to make sure <CODE>bzip2</CODE> is
+bug free, both by design and by testing. Hopefully
+you'll never need to read this section for real.
+<P>
+
+Nevertheless, if <CODE>bzip2</CODE> dies with a segmentation
+fault, a bus error or an internal assertion failure, it
+will ask you to email me a bug report. Experience with
+version 0.1 shows that almost all these problems can
+be traced to either compiler bugs or hardware problems.
+<UL>
+<LI>
+Recompile the program with no optimisation, and see if it
+works. And/or try a different compiler.
+I heard all sorts of stories about various flavours
+of GNU C (and other compilers) generating bad code for
+<CODE>bzip2</CODE>, and I've run across two such examples myself.
+<P>
+
+2.7.X versions of GNU C are known to generate bad code from
+time to time, at high optimisation levels.
+If you get problems, try using the flags
+<CODE>-O2</CODE> <CODE>-fomit-frame-pointer</CODE> <CODE>-fno-strength-reduce</CODE>.
+You should specifically <EM>not</EM> use <CODE>-funroll-loops</CODE>.
+</P><P>
+
+You may notice that the Makefile runs six tests as part of
+the build process. If the program passes all of these, it's
+a pretty good (but not 100%) indication that the compiler has
+done its job correctly.
+<LI>
+If <CODE>bzip2</CODE> crashes randomly, and the crashes are not
+repeatable, you may have a flaky memory subsystem. <CODE>bzip2</CODE>
+really hammers your memory hierarchy, and if it's a bit marginal,
+you may get these problems. Ditto if your disk or I/O subsystem
+is slowly failing. Yup, this really does happen.
+<P>
+
+Try using a different machine of the same type, and see if
+you can repeat the problem.
+<LI>This isn't really a bug, but ... If <CODE>bzip2</CODE> tells
+you your file is corrupted on decompression, and you
+obtained the file via FTP, there is a possibility that you
+forgot to tell FTP to do a binary mode transfer. That absolutely
+will cause the file to be non-decompressible. You'll have to transfer
+it again.
+</UL>
+<P>
+
+If you've incorporated <CODE>libbzip2</CODE> into your own program
+and are getting problems, please, please, please, check that the
+parameters you are passing in calls to the library, are
+correct, and in accordance with what the documentation says
+is allowable. I have tried to make the library robust against
+such problems, but I'm sure I haven't succeeded.
+</P><P>
+
+Finally, if the above comments don't help, you'll have to send
+me a bug report. Now, it's just amazing how many people will
+send me a bug report saying something like
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> bzip2 crashed with segmentation fault on my machine
+</pre></td></tr></table>and absolutely nothing else. Needless to say, a such a report
+is <EM>totally, utterly, completely and comprehensively 100% useless;
+a waste of your time, my time, and net bandwidth</EM>.
+With no details at all, there's no way I can possibly begin
+to figure out what the problem is.
+</P><P>
+
+The rules of the game are: facts, facts, facts. Don't omit
+them because "oh, they won't be relevant". At the bare
+minimum:
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"> Machine type. Operating system version.
+ Exact version of <CODE>bzip2</CODE> (do <CODE>bzip2 -V</CODE>).
+ Exact version of the compiler used.
+ Flags passed to the compiler.
+</pre></td></tr></table>However, the most important single thing that will help me is
+the file that you were trying to compress or decompress at the
+time the problem happened. Without that, my ability to do anything
+more than speculate about the cause, is limited.
+</P><P>
+
+Please remember that I connect to the Internet with a modem, so
+you should contact me before mailing me huge files.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC47"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC46"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC48"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.4 Did you get the right package? </H2>
+<!--docid::SEC47::-->
+<P>
+
+<CODE>bzip2</CODE> is a resource hog. It soaks up large amounts of CPU cycles
+and memory. Also, it gives very large latencies. In the worst case, you
+can feed many megabytes of uncompressed data into the library before
+getting any compressed output, so this probably rules out applications
+requiring interactive behaviour.
+</P><P>
+
+These aren't faults of my implementation, I hope, but more
+an intrinsic property of the Burrows-Wheeler transform (unfortunately).
+Maybe this isn't what you want.
+</P><P>
+
+If you want a compressor and/or library which is faster, uses less
+memory but gets pretty good compression, and has minimal latency,
+consider Jean-loup
+Gailly's and Mark Adler's work, <CODE>zlib-1.1.3</CODE> and
+<CODE>gzip-1.2.4</CODE>. Look for them at
+</P><P>
+
+<CODE>http://www.zlib.org</CODE> and
+<CODE>http://www.gzip.org</CODE> respectively.
+</P><P>
+
+For something faster and lighter still, you might try Markus F X J
+Oberhumer's <CODE>LZO</CODE> real-time compression/decompression library, at
+<BR> <CODE>http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html</CODE>.
+</P><P>
+
+If you want to use the <CODE>bzip2</CODE> algorithms to compress small blocks
+of data, 64k bytes or smaller, for example on an on-the-fly disk
+compressor, you'd be well advised not to use this library. Instead,
+I've made a special library tuned for that kind of use. It's part of
+<CODE>e2compr-0.40</CODE>, an on-the-fly disk compressor for the Linux
+<CODE>ext2</CODE> filesystem. Look at
+<CODE>http://www.netspace.net.au/~reiter/e2compr</CODE>.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC48"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC47"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC49"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.5 Testing </H2>
+<!--docid::SEC48::-->
+<P>
+
+A record of the tests I've done.
+</P><P>
+
+First, some data sets:
+<UL>
+<LI>B: a directory containing 6001 files, one for every length in the
+ range 0 to 6000 bytes. The files contain random lowercase
+ letters. 18.7 megabytes.
+<LI>H: my home directory tree. Documents, source code, mail files,
+ compressed data. H contains B, and also a directory of
+ files designed as boundary cases for the sorting; mostly very
+ repetitive, nasty files. 565 megabytes.
+<LI>A: directory tree holding various applications built from source:
+ <CODE>egcs</CODE>, <CODE>gcc-2.8.1</CODE>, KDE, GTK, Octave, etc.
+ 2200 megabytes.
+</UL>
+The tests conducted are as follows. Each test means compressing
+(a copy of) each file in the data set, decompressing it and
+comparing it against the original.
+<P>
+
+First, a bunch of tests with block sizes and internal buffer
+sizes set very small,
+to detect any problems with the
+blocking and buffering mechanisms.
+This required modifying the source code so as to try to
+break it.
+<OL>
+<LI>Data set H, with
+ buffer size of 1 byte, and block size of 23 bytes.
+<LI>Data set B, buffer sizes 1 byte, block size 1 byte.
+<LI>As (2) but small-mode decompression.
+<LI>As (2) with block size 2 bytes.
+<LI>As (2) with block size 3 bytes.
+<LI>As (2) with block size 4 bytes.
+<LI>As (2) with block size 5 bytes.
+<LI>As (2) with block size 6 bytes and small-mode decompression.
+<LI>H with buffer size of 1 byte, but normal block
+ size (up to 900000 bytes).
+</OL>
+Then some tests with unmodified source code.
+<OL>
+<LI>H, all settings normal.
+<LI>As (1), with small-mode decompress.
+<LI>H, compress with flag <CODE>-1</CODE>.
+<LI>H, compress with flag <CODE>-s</CODE>, decompress with flag <CODE>-s</CODE>.
+<LI>Forwards compatibility: H, <CODE>bzip2-0.1pl2</CODE> compressing,
+ <CODE>bzip2-0.9.5</CODE> decompressing, all settings normal.
+<LI>Backwards compatibility: H, <CODE>bzip2-0.9.5</CODE> compressing,
+ <CODE>bzip2-0.1pl2</CODE> decompressing, all settings normal.
+<LI>Bigger tests: A, all settings normal.
+<LI>As (7), using the fallback (Sadakane-like) sorting algorithm.
+<LI>As (8), compress with flag <CODE>-1</CODE>, decompress with flag
+ <CODE>-s</CODE>.
+<LI>H, using the fallback sorting algorithm.
+<LI>Forwards compatibility: A, <CODE>bzip2-0.1pl2</CODE> compressing,
+ <CODE>bzip2-0.9.5</CODE> decompressing, all settings normal.
+<LI>Backwards compatibility: A, <CODE>bzip2-0.9.5</CODE> compressing,
+ <CODE>bzip2-0.1pl2</CODE> decompressing, all settings normal.
+<LI>Misc test: about 400 megabytes of <CODE>.tar</CODE> files with
+ <CODE>bzip2</CODE> compiled with Checker (a memory access error
+ detector, like Purify).
+<LI>Misc tests to make sure it builds and runs ok on non-Linux/x86
+ platforms.
+</OL>
+These tests were conducted on a 225 MHz IDT WinChip machine, running
+Linux 2.0.36. They represent nearly a week of continuous computation.
+All tests completed successfully.
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC49"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_4.html#SEC48"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.6 Further reading </H2>
+<!--docid::SEC49::-->
+<CODE>bzip2</CODE> is not research work, in the sense that it doesn't present
+any new ideas. Rather, it's an engineering exercise based on existing
+ideas.
+<P>
+
+Four documents describe essentially all the ideas behind <CODE>bzip2</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Michael Burrows and D. J. Wheeler:
+ "A block-sorting lossless data compression algorithm"
+ 10th May 1994.
+ Digital SRC Research Report 124.
+ ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz
+ If you have trouble finding it, try searching at the
+ New Zealand Digital Library, http://www.nzdl.org.
+
+Daniel S. Hirschberg and Debra A. LeLewer
+ "Efficient Decoding of Prefix Codes"
+ Communications of the ACM, April 1990, Vol 33, Number 4.
+ You might be able to get an electronic copy of this
+ from the ACM Digital Library.
+
+David J. Wheeler
+ Program bred3.c and accompanying document bred3.ps.
+ This contains the idea behind the multi-table Huffman
+ coding scheme.
+ ftp://ftp.cl.cam.ac.uk/users/djw3/
+
+Jon L. Bentley and Robert Sedgewick
+ "Fast Algorithms for Sorting and Searching Strings"
+ Available from Sedgewick's web page,
+ www.cs.princeton.edu/~rs
+</pre></td></tr></table>The following paper gives valuable additional insights into the
+algorithm, but is not immediately the basis of any code
+used in bzip2.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Peter Fenwick:
+ Block Sorting Text Compression
+ Proceedings of the 19th Australasian Computer Science Conference,
+ Melbourne, Australia. Jan 31 - Feb 2, 1996.
+ ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps
+</pre></td></tr></table>Kunihiko Sadakane's sorting algorithm, mentioned above,
+is available from:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz
+</pre></td></tr></table>The Manber-Myers suffix array construction
+algorithm is described in a paper
+available from:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps
+</pre></td></tr></table>Finally, the following paper documents some recent investigations
+I made into the performance of sorting algorithms:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Julian Seward:
+ On the Performance of BWT Sorting Algorithms
+ Proceedings of the IEEE Data Compression Conference 2000
+ Snowbird, Utah. 28-30 March 2000.
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/manual_abt.html b/Build/source/utils/bzip2/manual_abt.html
new file mode 100644
index 00000000000..d7f54723603
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_abt.html
@@ -0,0 +1,201 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: About this document</TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: About this document">
+<META NAME="keywords" CONTENT="Untitled Document: About this document">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of
+the following structure:
+<UL>
+<LI> 1. Section One </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/manual_ovr.html b/Build/source/utils/bzip2/manual_ovr.html
new file mode 100644
index 00000000000..3b102b9e1a8
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_ovr.html
@@ -0,0 +1,54 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: Short Table of Contents</TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: Short Table of Contents">
+<META NAME="keywords" CONTENT="Untitled Document: Short Table of Contents">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="manual_1.html#SEC1">1. Introduction</A>
+<BR>
+<A NAME="TOC2" HREF="manual_2.html#SEC2">2. How to use <CODE>bzip2</CODE></A>
+<BR>
+<A NAME="TOC12" HREF="manual_3.html#SEC12">3. Programming with <CODE>libbzip2</CODE></A>
+<BR>
+<A NAME="TOC43" HREF="manual_4.html#SEC43">4. Miscellanea</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/manual_toc.html b/Build/source/utils/bzip2/manual_toc.html
new file mode 100644
index 00000000000..bc087059769
--- /dev/null
+++ b/Build/source/utils/bzip2/manual_toc.html
@@ -0,0 +1,163 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on January, 5 2002 by texi2html 1.64 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+
+-->
+<HEAD>
+<TITLE>Untitled Document: Table of Contents</TITLE>
+
+<META NAME="description" CONTENT="Untitled Document: Table of Contents">
+<META NAME="keywords" CONTENT="Untitled Document: Table of Contents">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="manual_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="manual_1.html#SEC1">1. Introduction</A>
+<BR>
+<A NAME="TOC2" HREF="manual_2.html#SEC2">2. How to use <CODE>bzip2</CODE></A>
+<BR>
+<UL>
+<UL>
+<UL>
+<A NAME="TOC3" HREF="manual_2.html#SEC3">NAME</A>
+<BR>
+<A NAME="TOC4" HREF="manual_2.html#SEC4">SYNOPSIS</A>
+<BR>
+<A NAME="TOC5" HREF="manual_2.html#SEC5">DESCRIPTION</A>
+<BR>
+<A NAME="TOC6" HREF="manual_2.html#SEC6">OPTIONS</A>
+<BR>
+<A NAME="TOC7" HREF="manual_2.html#SEC7">MEMORY MANAGEMENT</A>
+<BR>
+<A NAME="TOC8" HREF="manual_2.html#SEC8">RECOVERING DATA FROM DAMAGED FILES</A>
+<BR>
+<A NAME="TOC9" HREF="manual_2.html#SEC9">PERFORMANCE NOTES</A>
+<BR>
+<A NAME="TOC10" HREF="manual_2.html#SEC10">CAVEATS</A>
+<BR>
+<A NAME="TOC11" HREF="manual_2.html#SEC11">AUTHOR</A>
+<BR>
+</UL>
+</UL>
+</UL>
+<A NAME="TOC12" HREF="manual_3.html#SEC12">3. Programming with <CODE>libbzip2</CODE></A>
+<BR>
+<UL>
+<A NAME="TOC13" HREF="manual_3.html#SEC13">3.1 Top-level structure</A>
+<BR>
+<UL>
+<A NAME="TOC14" HREF="manual_3.html#SEC14">3.1.1 Low-level summary</A>
+<BR>
+<A NAME="TOC15" HREF="manual_3.html#SEC15">3.1.2 High-level summary</A>
+<BR>
+<A NAME="TOC16" HREF="manual_3.html#SEC16">3.1.3 Utility functions summary</A>
+<BR>
+</UL>
+<A NAME="TOC17" HREF="manual_3.html#SEC17">3.2 Error handling</A>
+<BR>
+<A NAME="TOC18" HREF="manual_3.html#SEC18">3.3 Low-level interface</A>
+<BR>
+<UL>
+<A NAME="TOC19" HREF="manual_3.html#SEC19">3.3.1 <CODE>BZ2_bzCompressInit</CODE></A>
+<BR>
+<A NAME="TOC20" HREF="manual_3.html#SEC20">3.3.2 <CODE>BZ2_bzCompress</CODE></A>
+<BR>
+<A NAME="TOC21" HREF="manual_3.html#SEC21">3.3.3 <CODE>BZ2_bzCompressEnd</CODE></A>
+<BR>
+<A NAME="TOC22" HREF="manual_3.html#SEC22">3.3.4 <CODE>BZ2_bzDecompressInit</CODE></A>
+<BR>
+<A NAME="TOC23" HREF="manual_3.html#SEC23">3.3.5 <CODE>BZ2_bzDecompress</CODE></A>
+<BR>
+<A NAME="TOC24" HREF="manual_3.html#SEC24">3.3.6 <CODE>BZ2_bzDecompressEnd</CODE></A>
+<BR>
+</UL>
+<A NAME="TOC25" HREF="manual_3.html#SEC25">3.4 High-level interface</A>
+<BR>
+<UL>
+<A NAME="TOC26" HREF="manual_3.html#SEC26">3.4.1 <CODE>BZ2_bzReadOpen</CODE></A>
+<BR>
+<A NAME="TOC27" HREF="manual_3.html#SEC27">3.4.2 <CODE>BZ2_bzRead</CODE></A>
+<BR>
+<A NAME="TOC28" HREF="manual_3.html#SEC28">3.4.3 <CODE>BZ2_bzReadGetUnused</CODE></A>
+<BR>
+<A NAME="TOC29" HREF="manual_3.html#SEC29">3.4.4 <CODE>BZ2_bzReadClose</CODE></A>
+<BR>
+<A NAME="TOC30" HREF="manual_3.html#SEC30">3.4.5 <CODE>BZ2_bzWriteOpen</CODE></A>
+<BR>
+<A NAME="TOC31" HREF="manual_3.html#SEC31">3.4.6 <CODE>BZ2_bzWrite</CODE></A>
+<BR>
+<A NAME="TOC32" HREF="manual_3.html#SEC32">3.4.7 <CODE>BZ2_bzWriteClose</CODE></A>
+<BR>
+<A NAME="TOC33" HREF="manual_3.html#SEC33">3.4.8 Handling embedded compressed data streams</A>
+<BR>
+<A NAME="TOC34" HREF="manual_3.html#SEC34">3.4.9 Standard file-reading/writing code</A>
+<BR>
+</UL>
+<A NAME="TOC35" HREF="manual_3.html#SEC35">3.5 Utility functions</A>
+<BR>
+<UL>
+<A NAME="TOC36" HREF="manual_3.html#SEC36">3.5.1 <CODE>BZ2_bzBuffToBuffCompress</CODE></A>
+<BR>
+<A NAME="TOC37" HREF="manual_3.html#SEC37">3.5.2 <CODE>BZ2_bzBuffToBuffDecompress</CODE></A>
+<BR>
+</UL>
+<A NAME="TOC38" HREF="manual_3.html#SEC38">3.6 <CODE>zlib</CODE> compatibility functions</A>
+<BR>
+<A NAME="TOC39" HREF="manual_3.html#SEC39">3.7 Using the library in a <CODE>stdio</CODE>-free environment</A>
+<BR>
+<UL>
+<A NAME="TOC40" HREF="manual_3.html#SEC40">3.7.1 Getting rid of <CODE>stdio</CODE></A>
+<BR>
+<A NAME="TOC41" HREF="manual_3.html#SEC41">3.7.2 Critical error handling</A>
+<BR>
+</UL>
+<A NAME="TOC42" HREF="manual_3.html#SEC42">3.8 Making a Windows DLL</A>
+<BR>
+</UL>
+<A NAME="TOC43" HREF="manual_4.html#SEC43">4. Miscellanea</A>
+<BR>
+<UL>
+<A NAME="TOC44" HREF="manual_4.html#SEC44">4.1 Limitations of the compressed file format</A>
+<BR>
+<A NAME="TOC45" HREF="manual_4.html#SEC45">4.2 Portability issues</A>
+<BR>
+<A NAME="TOC46" HREF="manual_4.html#SEC46">4.3 Reporting bugs</A>
+<BR>
+<A NAME="TOC47" HREF="manual_4.html#SEC47">4.4 Did you get the right package?</A>
+<BR>
+<A NAME="TOC48" HREF="manual_4.html#SEC48">4.5 Testing</A>
+<BR>
+<A NAME="TOC49" HREF="manual_4.html#SEC49">4.6 Further reading</A>
+<BR>
+</UL>
+</UL>
+<HR SIZE=1>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Julian Seward</I> on <I>January, 5 2002</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/Build/source/utils/bzip2/mk251.c b/Build/source/utils/bzip2/mk251.c
new file mode 100644
index 00000000000..205778a84e6
--- /dev/null
+++ b/Build/source/utils/bzip2/mk251.c
@@ -0,0 +1,16 @@
+
+/* Spew out a long sequence of the byte 251. When fed to bzip2
+ versions 1.0.0 or 1.0.1, causes it to die with internal error
+ 1007 in blocksort.c. This assertion misses an extremely rare
+ case, which is fixed in this version (1.0.2) and above.
+*/
+
+#include <stdio.h>
+
+int main ()
+{
+ int i;
+ for (i = 0; i < 48500000 ; i++)
+ putchar(251);
+ return 0;
+}
diff --git a/Build/source/utils/bzip2/randtable.c b/Build/source/utils/bzip2/randtable.c
new file mode 100644
index 00000000000..5c922e94f3c
--- /dev/null
+++ b/Build/source/utils/bzip2/randtable.c
@@ -0,0 +1,124 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for randomising repetitive blocks ---*/
+/*--- randtable.c ---*/
+/*-------------------------------------------------------------*/
+
+/*--
+ This file is a part of bzip2 and/or libbzip2, a program and
+ library for lossless, block-sorting data compression.
+
+ Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Julian Seward, Cambridge, UK.
+ jseward@acm.org
+ bzip2/libbzip2 version 1.0 of 21 March 2000
+
+ This program is based on (at least) the work of:
+ Mike Burrows
+ David Wheeler
+ Peter Fenwick
+ Alistair Moffat
+ Radford Neal
+ Ian H. Witten
+ Robert Sedgewick
+ Jon L. Bentley
+
+ For more information on these sources, see the manual.
+--*/
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------*/
+Int32 BZ2_rNums[512] = {
+ 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
+ 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
+ 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
+ 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
+ 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
+ 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
+ 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
+ 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
+ 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
+ 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
+ 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
+ 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
+ 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
+ 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
+ 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
+ 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
+ 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
+ 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
+ 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
+ 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
+ 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
+ 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
+ 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
+ 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
+ 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
+ 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
+ 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
+ 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
+ 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
+ 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
+ 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
+ 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
+ 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
+ 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
+ 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
+ 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
+ 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
+ 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
+ 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
+ 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
+ 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
+ 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
+ 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
+ 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
+ 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
+ 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
+ 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
+ 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
+ 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
+ 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
+ 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
+ 936, 638
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end randtable.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/Build/source/utils/bzip2/sample1.bz2 b/Build/source/utils/bzip2/sample1.bz2
new file mode 100644
index 00000000000..18dea60043b
--- /dev/null
+++ b/Build/source/utils/bzip2/sample1.bz2
Binary files differ
diff --git a/Build/source/utils/bzip2/sample1.ref b/Build/source/utils/bzip2/sample1.ref
new file mode 100644
index 00000000000..a56e52b77f9
--- /dev/null
+++ b/Build/source/utils/bzip2/sample1.ref
Binary files differ
diff --git a/Build/source/utils/bzip2/sample2.bz2 b/Build/source/utils/bzip2/sample2.bz2
new file mode 100644
index 00000000000..d5a6160ba20
--- /dev/null
+++ b/Build/source/utils/bzip2/sample2.bz2
Binary files differ
diff --git a/Build/source/utils/bzip2/sample2.ref b/Build/source/utils/bzip2/sample2.ref
new file mode 100644
index 00000000000..34af95839a0
--- /dev/null
+++ b/Build/source/utils/bzip2/sample2.ref
Binary files differ
diff --git a/Build/source/utils/bzip2/sample3.ref b/Build/source/utils/bzip2/sample3.ref
new file mode 100644
index 00000000000..775a2f68e21
--- /dev/null
+++ b/Build/source/utils/bzip2/sample3.ref
@@ -0,0 +1,30007 @@
+This file is exceedingly boring. If you find yourself
+reading it, please (1) take it from me that you can safely
+guess what the rest of the file says, and (2) seek professional
+help.
+
+ps. there are no further sarcastic remarks in this file.
+
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
+ugh
diff --git a/Build/source/utils/bzip2/spewG.c b/Build/source/utils/bzip2/spewG.c
new file mode 100644
index 00000000000..7934e765818
--- /dev/null
+++ b/Build/source/utils/bzip2/spewG.c
@@ -0,0 +1,39 @@
+
+/* spew out a thoroughly gigantic file designed so that bzip2
+ can compress it reasonably rapidly. This is to help test
+ support for large files (> 2GB) in a reasonable amount of time.
+ I suggest you use the undocumented --exponential option to
+ bzip2 when compressing the resulting file; this saves a bit of
+ time. Note: *don't* bother with --exponential when compressing
+ Real Files; it'll just waste a lot of CPU time :-)
+ (but is otherwise harmless).
+*/
+
+#define _FILE_OFFSET_BITS 64
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* The number of megabytes of junk to spew out (roughly) */
+#define MEGABYTES 5000
+
+#define N_BUF 1000000
+char buf[N_BUF];
+
+int main ( int argc, char** argv )
+{
+ int ii, kk, p;
+ srandom(1);
+ setbuffer ( stdout, buf, N_BUF );
+ for (kk = 0; kk < MEGABYTES * 515; kk+=3) {
+ p = 25+random()%50;
+ for (ii = 0; ii < p; ii++)
+ printf ( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" );
+ for (ii = 0; ii < p-1; ii++)
+ printf ( "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" );
+ for (ii = 0; ii < p+1; ii++)
+ printf ( "ccccccccccccccccccccccccccccccccccccc" );
+ }
+ fflush(stdout);
+ return 0;
+}
diff --git a/Build/source/utils/bzip2/unzcrash.c b/Build/source/utils/bzip2/unzcrash.c
new file mode 100644
index 00000000000..f0f17fcca53
--- /dev/null
+++ b/Build/source/utils/bzip2/unzcrash.c
@@ -0,0 +1,126 @@
+
+/* A test program written to test robustness to decompression of
+ corrupted data. Usage is
+ unzcrash filename
+ and the program will read the specified file, compress it (in memory),
+ and then repeatedly decompress it, each time with a different bit of
+ the compressed data inverted, so as to test all possible one-bit errors.
+ This should not cause any invalid memory accesses. If it does,
+ I want to know about it!
+
+ p.s. As you can see from the above description, the process is
+ incredibly slow. A file of size eg 5KB will cause it to run for
+ many hours.
+*/
+
+#include <stdio.h>
+#include <assert.h>
+#include "bzlib.h"
+
+#define M_BLOCK 1000000
+
+typedef unsigned char uchar;
+
+#define M_BLOCK_OUT (M_BLOCK + 1000000)
+uchar inbuf[M_BLOCK];
+uchar outbuf[M_BLOCK_OUT];
+uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)];
+
+int nIn, nOut, nZ;
+
+static char *bzerrorstrings[] = {
+ "OK"
+ ,"SEQUENCE_ERROR"
+ ,"PARAM_ERROR"
+ ,"MEM_ERROR"
+ ,"DATA_ERROR"
+ ,"DATA_ERROR_MAGIC"
+ ,"IO_ERROR"
+ ,"UNEXPECTED_EOF"
+ ,"OUTBUFF_FULL"
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+ ,"???" /* for future */
+};
+
+void flip_bit ( int bit )
+{
+ int byteno = bit / 8;
+ int bitno = bit % 8;
+ uchar mask = 1 << bitno;
+ //fprintf ( stderr, "(byte %d bit %d mask %d)",
+ // byteno, bitno, (int)mask );
+ zbuf[byteno] ^= mask;
+}
+
+int main ( int argc, char** argv )
+{
+ FILE* f;
+ int r;
+ int bit;
+ int i;
+
+ if (argc != 2) {
+ fprintf ( stderr, "usage: unzcrash filename\n" );
+ return 1;
+ }
+
+ f = fopen ( argv[1], "r" );
+ if (!f) {
+ fprintf ( stderr, "unzcrash: can't open %s\n", argv[1] );
+ return 1;
+ }
+
+ nIn = fread ( inbuf, 1, M_BLOCK, f );
+ fprintf ( stderr, "%d bytes read\n", nIn );
+
+ nZ = M_BLOCK;
+ r = BZ2_bzBuffToBuffCompress (
+ zbuf, &nZ, inbuf, nIn, 9, 0, 30 );
+
+ assert (r == BZ_OK);
+ fprintf ( stderr, "%d after compression\n", nZ );
+
+ for (bit = 0; bit < nZ*8; bit++) {
+ fprintf ( stderr, "bit %d ", bit );
+ flip_bit ( bit );
+ nOut = M_BLOCK_OUT;
+ r = BZ2_bzBuffToBuffDecompress (
+ outbuf, &nOut, zbuf, nZ, 0, 0 );
+ fprintf ( stderr, " %d %s ", r, bzerrorstrings[-r] );
+
+ if (r != BZ_OK) {
+ fprintf ( stderr, "\n" );
+ } else {
+ if (nOut != nIn) {
+ fprintf(stderr, "nIn/nOut mismatch %d %d\n", nIn, nOut );
+ return 1;
+ } else {
+ for (i = 0; i < nOut; i++)
+ if (inbuf[i] != outbuf[i]) {
+ fprintf(stderr, "mismatch at %d\n", i );
+ return 1;
+ }
+ if (i == nOut) fprintf(stderr, "really ok!\n" );
+ }
+ }
+
+ flip_bit ( bit );
+ }
+
+#if 0
+ assert (nOut == nIn);
+ for (i = 0; i < nOut; i++) {
+ if (inbuf[i] != outbuf[i]) {
+ fprintf ( stderr, "difference at %d !\n", i );
+ return 1;
+ }
+ }
+#endif
+
+ fprintf ( stderr, "all ok\n" );
+ return 0;
+}
diff --git a/Build/source/utils/bzip2/win32.mak b/Build/source/utils/bzip2/win32.mak
new file mode 100644
index 00000000000..dc0c2089306
--- /dev/null
+++ b/Build/source/utils/bzip2/win32.mak
@@ -0,0 +1,96 @@
+################################################################################
+#
+# Makefile : Bzip2
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <04/03/14 19:28:04 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+USE_GNUW32 = 1
+USE_BZIP2 = 1
+MAKE_BZIP2 = 1
+
+!include <msvc/common.mak>
+
+programs = $(bzip2dll) $(objdir)\bzip2.exe $(objdir)\bzip2recover.exe
+libfiles = $(bzip2lib)
+includefiles = bzlib.h
+manfiles = bzip2.1
+infofiles = manual.info
+pdfdocfiles = manual.pdf
+docsubdir = bzip2
+installinfoflags = --entry="* Bzip2 (bzip2): An enhance compressor"\
+ --section="Miscellaneous"
+
+objects= $(objdir)\blocksort.obj \
+ $(objdir)\huffman.obj \
+ $(objdir)\crctable.obj \
+ $(objdir)\randtable.obj \
+ $(objdir)\compress.obj \
+ $(objdir)\decompress.obj \
+ $(objdir)\bzlib.obj
+
+default: all
+
+all: $(objdir) $(libfiles) $(programs)
+
+lib: $(objdir) $(libfiles)
+
+!ifdef BZIP2_DLL
+
+$(bzip2lib): $(objdir) $(objects)
+ $(archive) /DEF $(objects)
+
+$(bzip2dll): $(bzip2lib) $(objects) $(objdir)\bz2lib.res $(gnuw32lib)
+ $(link_dll) $(**) $(bzip2lib:.lib=.exp) $(conlibs)
+!else
+
+$(bzip2lib): $(objdir) $(objects)
+ $(archive) $(objects)
+!endif
+
+$(objdir)\bzip2.exe: $(objdir)\bzip2.obj $(bzip2lib)
+ $(link) $(**) $(setargvobj) $(conlibs)
+
+$(objdir)\bzip2recover.exe: $(objdir)\bzip2recover.obj $(bzip2lib)
+ $(link) $(**) $(setargvobj) $(conlibs)
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+makeinfo_flags = $(makeinfo_flags) --force
+
+install:: install-exec install-lib install-include
+
+test: $(objdir)\bzip2.exe
+ @type words1
+ .\$(objdir)\bzip2 -1 < sample1.ref > sample1.rb2
+ .\$(objdir)\bzip2 -2 < sample2.ref > sample2.rb2
+ .\$(objdir)\bzip2 -d < sample1.bz2 > sample1.tst
+ .\$(objdir)\bzip2 -d < sample2.bz2 > sample2.tst
+ @type words2
+ fc sample1.bz2 sample1.rb2
+ fc sample2.bz2 sample2.rb2
+ fc sample1.tst sample1.ref
+ fc sample2.tst sample2.ref
+ @type words3
+
+!include <msvc/clean.mak>
+
+clean::
+ -@$(del) sample1.rb2 sample2.rb2 sample1.tst sample2.tst
+
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/bzip2/words0 b/Build/source/utils/bzip2/words0
new file mode 100644
index 00000000000..164a8ed287a
--- /dev/null
+++ b/Build/source/utils/bzip2/words0
@@ -0,0 +1,5 @@
+
+If compilation produces errors, or a large number of warnings,
+please read README.COMPILATION.PROBLEMS -- you might be able to
+adjust the flags in this Makefile to improve matters.
+
diff --git a/Build/source/utils/bzip2/words1 b/Build/source/utils/bzip2/words1
new file mode 100644
index 00000000000..2e83de9f083
--- /dev/null
+++ b/Build/source/utils/bzip2/words1
@@ -0,0 +1,4 @@
+
+Doing 6 tests (3 compress, 3 uncompress) ...
+If there's a problem, things might stop at this point.
+
diff --git a/Build/source/utils/bzip2/words2 b/Build/source/utils/bzip2/words2
new file mode 100644
index 00000000000..203ee39c4c2
--- /dev/null
+++ b/Build/source/utils/bzip2/words2
@@ -0,0 +1,5 @@
+
+Checking test results. If any of the four "cmp"s which follow
+report any differences, something is wrong. If you can't easily
+figure out what, please let me know (jseward@acm.org).
+
diff --git a/Build/source/utils/bzip2/words3 b/Build/source/utils/bzip2/words3
new file mode 100644
index 00000000000..7a6b462443c
--- /dev/null
+++ b/Build/source/utils/bzip2/words3
@@ -0,0 +1,23 @@
+
+If you got this far and the "cmp"s didn't complain, it looks
+like you're in business.
+
+To install in /usr/bin, /usr/lib, /usr/man and /usr/include, type
+ make install
+To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type
+ make install PREFIX=/xxx/yyy
+If you are (justifiably) paranoid and want to see what 'make install'
+is going to do, you can first do
+ make -n install or
+ make -n install PREFIX=/xxx/yyy respectively.
+The -n instructs make to show the commands it would execute, but
+not actually execute them.
+
+Instructions for use are in the preformatted manual page, in the file
+bzip2.txt. For more detailed documentation, read the full manual.
+It is available in Postscript form (manual.ps), PDF form (manual.pdf),
+and HTML form (manual_toc.html).
+
+You can also do "bzip2 --help" to see some helpful information.
+"bzip2 -L" displays the software license.
+
diff --git a/Build/source/utils/dialog/COPYING b/Build/source/utils/dialog/COPYING
new file mode 100644
index 00000000000..a43ea2126fb
--- /dev/null
+++ b/Build/source/utils/dialog/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/utils/dialog/Makefile.in b/Build/source/utils/dialog/Makefile.in
new file mode 100644
index 00000000000..5f0eaa2df6d
--- /dev/null
+++ b/Build/source/utils/dialog/Makefile.in
@@ -0,0 +1,162 @@
+# Copyright (C) 1988,89,91,92,93,94,95,96 Free Software Foundation, Inc.
+# This file is part of dialog.
+#
+# dialog is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# dialog is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with dialog; see the file COPYING. If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#
+# Makefile for dialog
+#
+
+# Ultrix 2.2 make doesn't expand the value of VPATH.
+VPATH = @srcdir@
+# This must repeat the value, because configure will remove `VPATH = .'.
+srcdir = @srcdir@
+
+CC = @CC@
+
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@ @CURSESCPPFLAGS@
+LDFLAGS = @LDFLAGS@
+
+NCURSESDIR=../../libs/ncurses
+NCURSESSRCDIR=$(srcdir)/$(NCURSESDIR)
+CURSESDEFS = -DHAVE_NCURSES -DUSE_COLORS
+LDCURSESLIB = @LDCURSESLIB@
+CURSESDEP = @CURSESDEP@
+
+defines = @DEFS@ $(CURSESDEFS) -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\"
+
+# Common prefix for machine-independent installed files.
+prefix = @prefix@
+# Common prefix for machine-dependent installed files.
+exec_prefix = @exec_prefix@
+
+# Directory to install `make' in.
+bindir = @bindir@
+# Directory to find libraries in for `-lXXX'.
+libdir = $(exec_prefix)/lib
+# Directory to search by default for included makefiles.
+includedir = $(prefix)/include
+# Directory to install the Info files in.
+infodir = $(prefix)/info
+# Directory to install the man page in.
+mandir = @mandir@
+man1dir = $(mandir)/man$(manext)
+# Number to put on the man page filename.
+manext = 1
+
+# Program to install `make'.
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+# Program to install the man page.
+INSTALL_DATA = @INSTALL_DATA@
+# Generic install program.
+INSTALL = @INSTALL@
+
+# Program to format Texinfo source into Info files.
+MAKEINFO = makeinfo
+# Program to format Texinfo source into DVI files.
+TEXI2DVI = texi2dvi
+
+# Programs to make tags files.
+ETAGS = etags -w
+CTAGS = ctags -w
+
+objs = dialog.o checklist.o inputbox.o menubox.o msgbox.o textbox.o yesno.o radiolist.o gauge.o rc.o strcasecmp.o
+srcs = $(srcdir)/dialog.c $(srcdir)/checklist.c $(srcdir)/inputbox.c \
+ $(srcdir)/menubox.c $(srcdir)/msgbox.c $(srcdir)/textbox.c \
+ $(srcdir)/yesno.c $(srcdir)/radiolist.c $(srcdir)/gauge.c \
+ $(srcdir)/rc.c $(srcdir)/strcasecmp.c
+
+default all: dialog
+
+.SUFFIXES:
+.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
+
+info:
+dvi:
+# Some makes apparently use .PHONY as the default goal if it is before `all'.
+.PHONY: all check info dvi
+
+dialog: $(CURSESDEP) $(objs)
+ $(CC) $(LDFLAGS) $(objs) -o dialog $(LDCURSESLIB)
+
+$(NCURSESDIR)/lib/libncurses.a:
+ cd $(NCURSESDIR); $(MAKE)
+
+.c.o:
+ $(CC) $(defines) -c -I. -I$(srcdir) \
+ $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
+
+# For some losing Unix makes.
+SHELL = /bin/sh
+@SET_MAKE@
+
+.PHONY: install installdirs install-exec
+install: install-exec $(man1dir)/tcdialog.$(manext)
+
+install-exec: installdirs $(bindir)/tcdialog
+
+installdirs:
+ $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(man1dir)
+
+$(bindir)/tcdialog: dialog
+ $(INSTALL_PROGRAM) dialog $@
+
+$(man1dir)/tcdialog.$(manext): dialog.man
+ $(INSTALL_DATA) $(srcdir)/dialog.man $@
+
+
+check:
+uninstall:
+ -rm -f $(bindir)/tcdialog $(man1dir)/tcdialog.$(manext)
+
+
+.PHONY: clean realclean distclean mostlyclean
+clean:
+ -rm -f dialog *.o core
+distclean: clean
+ -rm -f Makefile config.status build.sh stamp-config
+ -rm -f config.log config.cache
+ -rm -f TAGS tags dialogconfig.h
+realclean: distclean
+mostlyclean: clean
+
+Makefile: config.status $(srcdir)/Makefile.in
+ $(SHELL) config.status
+config.h: stamp-config ;
+stamp-config: config.status $(srcdir)/config.h.in
+ $(SHELL) config.status
+ touch stamp-config
+
+# This tells versions [3.59,3.63) of GNU make not to export all variables.
+.NOEXPORT:
+
+# The automatically generated dependencies below may omit config.h
+# because it is included with ``#include <config.h>'' rather than
+# ``#include "config.h"''. So we add the explicit dependency to make sure.
+$(objs):
+
+# Automatically generated dependencies will be put at the end of the file.
+checklist.o: checklist.c dialog.h
+dialog.o: dialog.c dialog.h
+gauge.o: gauge.c dialog.h
+inputbox.o: inputbox.c dialog.h
+menubox.o: menubox.c dialog.h
+msgbox.o: msgbox.c dialog.h
+radiolist.o: radiolist.c dialog.h
+rc.o: rc.c
+strcasecmp.o: strcasecmp.c dialogconfig.h
+textbox.o: textbox.c dialog.h
+yesno.o: yesno.c dialog.h
diff --git a/Build/source/utils/dialog/README b/Build/source/utils/dialog/README
new file mode 100644
index 00000000000..49d27e64c2b
--- /dev/null
+++ b/Build/source/utils/dialog/README
@@ -0,0 +1,148 @@
+ dialog - Display dialog boxes in shell script (version 0.5)
+ ===========================================================
+
+This is a program that will enable you to present a variety of questions or
+display messages using dialog boxes from a shell script. Currently, these
+types of dialog boxes are implemented: yes/no box, menu box, input box,
+message box, text box, info box, checklist box. The idea of writing this
+program came from the fact that most questions asked in a shell script (and
+many interactive programs as well) can be classified into these few types:
+
+
+ 1) One that requires the user to answer either yes or no.
+
+ 2) One that presents a number of options for the user to choose.
+
+ 3) One that requires the user to input a string.
+
+ 4) One that displays a message and optionally wait for a key press
+ before continuing.
+
+ 5) One that presents a list of options that can be turned on or off.
+
+
+The program 'dialog' can, say for example, be called in a shell script to
+present the first type of questions like this:
+
+
+ if dialog --yesno <question text> <height> <width>
+ then
+ ...
+ fi
+
+
+ e.g. if dialog --yesno "Do you want to continue?" 7 51
+ then
+ echo "Continuing..."
+ else
+ echo "Aborting..."
+ fi
+
+
+I've included a sample shell script for each type of boxes in the directory
+samples. The program requires ncurses to compile. Running 'dialog' without
+arguments will display the usage.
+
+
+
+FEATURES
+--------
+
+ * Friendly dialog box interface with buttons, etc.
+
+ * Auto wrap around of question text if it's too long to fit on
+ one line.
+
+ * "\n" can be inserted in question text to control line breaking
+ explicitly. The real newline character '\n' can also be used.
+ (note - using \n means that you have to do all layout yourself,
+ as this isn't handled by the word-wrap routine - Stuart)
+
+ * run-time configruation of color settings and other options using
+ a configuration file.
+
+WHAT'S NEW SINCE VERSION 0.4?
+-----------------------------
+
+ * New guage widget to display progress meter-like stuff.
+
+ * New dialog.pl perl interface to dialog. Makes using
+ dialog from perl simple and powerful.
+
+ * inputbox widgets now accept an initial string to display
+
+ * Added --separate-output option which affects the output of
+ checklist widgets. Each selected item is printed on an
+ individual line, with no quotes. This makes processing of
+ the output a snap.
+
+ * Word wrap is still broken (see samples/yesno) but wordwrap
+ using dialog.pl works nicely.
+
+WHAT'S NEW SINCE VERSION 0.3?
+-----------------------------
+
+ * dialog works with ncurses 1.8.5 now (patch is supplied to fix
+ ncurses 1.8.5 as well)
+
+ * word-wrap in infobox's etc has been fixed (so long as you don't
+ use \n in your prompts.
+
+ * new default colour scheme (sort of 3D look now)
+
+ * radiolist option added (same as a menu, but with radio buttons)
+
+ * backtitle option added (place a title on the background - can be
+ used with --title, or instead of it)
+
+
+WHAT'S NEW SINCE VERSION 0.21?
+------------------------------
+
+ * some changes for faster screen update.
+
+ * much more flexible color settings. Can use all 16 colors
+ (8 normal, 8 highlight) of the Linux console.
+
+ * added run-time configuration using configuration file.
+
+ * some minor bug fixes and cleanups for menubox, checklist and
+ textbox.
+
+ * added a man page.
+
+ * some changes for easier porting to other Unix systems (tested
+ on Ultrix, SunOS and HPUX)
+
+
+Savio Lam (lam836@cs.cuhk.hk)
+
+
+COMMENTS
+--------
+
+ * This release is primarily to fix dialog for use with ncurses
+ 1.8.5, and to include the two new options.
+
+ * This release includes the 8-bit-clean patches, and is derived from
+ the Slackware sources, rather than from the copy on sunsite.
+
+ * I understand that Savio no longer maintains dialog. To the best
+ of my knowledge, I've fixed all the remaining bugs in dialog.
+
+ * My quoted email address is only valid until the end of June, 1994.
+ This means that I'm not in a position to maintain this release :(
+
+Stuart Herbert,
+S.Herbert@Sheffield.ac.uk
+
+
+MORE COMMENTS
+-------------
+
+The 0.5 release was made by me (Marc Ewing). Neither Savio nor Stuart are
+maintaining dialog any longer. Please don't bother them with any problems
+created by my own alterations!
+
+Marc Ewing
+marc@redhat.com
diff --git a/Build/source/utils/dialog/checklist.c b/Build/source/utils/dialog/checklist.c
new file mode 100644
index 00000000000..4ae65fd3443
--- /dev/null
+++ b/Build/source/utils/dialog/checklist.c
@@ -0,0 +1,358 @@
+/*
+ * checklist.c -- implements the checklist box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected);
+
+
+static int list_width, check_x, item_x;
+
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ */
+int dialog_checklist(char *title, char *prompt, int height, int width, int list_height, int item_no, char **items)
+{
+ int i, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
+ scrolli = 0, max_choice, *status;
+ WINDOW *dialog, *list;
+
+ /* Allocate space for storing item on/off status */
+ if ((status = malloc(sizeof(int)*item_no)) == NULL) {
+ endwin();
+ fprintf(stderr, "\nCan't allocate memory in dialog_checklist().\n");
+ exit(-1);
+ }
+ /* Initializes status */
+ for (i = 0; i < item_no; i++)
+ status[i] = !strcasecmp(items[i*3 + 2], "on");
+
+ max_choice = MIN(list_height, item_no);
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width, 1, 3);
+
+ list_width = width-6;
+ getyx(dialog, cur_y, cur_x);
+ box_y = cur_y + 1;
+ box_x = (width - list_width)/2 - 1;
+
+ /* create new window for the list */
+ list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1);
+ keypad(list, TRUE);
+
+ /* draw a box around the list items */
+ draw_box(dialog, box_y, box_x, list_height+2, list_width+2, menubox_border_attr, menubox_attr);
+
+ check_x = 0;
+ item_x = 0;
+ /* Find length of longest item in order to center checklist */
+ for (i = 0; i < item_no; i++) {
+ check_x = MAX(check_x, strlen(items[i*3]) + strlen(items[i*3 + 1]) + 6);
+ item_x = MAX(item_x, strlen(items[i*3]));
+ }
+ check_x = (list_width - check_x) / 2;
+ item_x = check_x + item_x + 6;
+
+ /* Print the list */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[i*3], items[i*3 + 1], status[i], i, i == choice);
+ wnoutrefresh(list);
+
+ if (list_height < item_no) {
+ wattrset(dialog, darrow_attr);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 5);
+ waddch(dialog, ACS_DARROW);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 6);
+ waddstr(dialog, "(+)");
+ }
+
+ x = width/2-11;
+ y = height-2;
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wrefresh(dialog);
+
+ while (key != ESC) {
+ key = wgetch(dialog);
+ /* Check if key pressed matches first character of any item tag in list */
+ for (i = 0; i < max_choice; i++)
+ if (toupper(key) == toupper(items[(scrolli+i)*3][0]))
+ break;
+
+ if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) ||
+ key == KEY_UP || key == KEY_DOWN || key == ' ' ||
+ key == '+' || key == '-' ) {
+ if (key >= '1' && key <= MIN('9', '0'+max_choice))
+ i = key - '1';
+ else if (key == KEY_UP || key == '-') {
+ if (!choice) {
+ if (scrolli) {
+#ifdef BROKEN_WSCRL
+ /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation
+ violation when scrolling windows of height = 4, so scrolling is not
+ used for now */
+ scrolli--;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ /* Reprint list to scroll down */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scrolli+i)*3], items[(scrolli+i)*3 + 1], status[scrolli+i], i, i == choice);
+
+#else
+
+ /* Scroll list down */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current first item before scrolling down */
+ print_item(list, items[scrolli*3], items[scrolli*3 + 1], status[scrolli], 0, FALSE);
+ scrollok(list, TRUE);
+ wscrl(list, -1);
+ scrollok(list, FALSE);
+ }
+ scrolli--;
+ print_item(list, items[scrolli*3], items[scrolli*3 + 1], status[scrolli], 0, TRUE);
+#endif
+ wnoutrefresh(list);
+
+ /* print the up/down arrows */
+ wmove(dialog, box_y, box_x + check_x + 5);
+ wattrset(dialog, scrolli ? uarrow_attr : menubox_attr);
+ waddch(dialog, scrolli ? ACS_UARROW : ACS_HLINE);
+ wmove(dialog, box_y, box_x + check_x + 6);
+ waddch(dialog, scrolli ? '(' : ACS_HLINE);
+ wmove(dialog, box_y, box_x + check_x + 7);
+ waddch(dialog, scrolli ? '-' : ACS_HLINE);
+ wmove(dialog, box_y, box_x + check_x + 8);
+ waddch(dialog, scrolli ? ')' : ACS_HLINE);
+ wattrset(dialog, darrow_attr);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 5);
+ waddch(dialog, ACS_DARROW);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 6);
+ waddch(dialog, '(');
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 7);
+ waddch(dialog, '+');
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 8);
+ waddch(dialog, ')');
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice - 1;
+ }
+ else if (key == KEY_DOWN || key == '+') {
+ if (choice == max_choice - 1) {
+ if (scrolli+choice < item_no-1) {
+#ifdef BROKEN_WSCRL
+ /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation
+ violation when scrolling windows of height = 4, so scrolling is not
+ used for now */
+ scrolli++;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ /* Reprint list to scroll up */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scrolli+i)*3], items[(scrolli+i)*3 + 1], status[scrolli+i], i, i == choice);
+
+#else
+
+ /* Scroll list up */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current last item before scrolling up */
+ print_item(list, items[(scrolli+max_choice-1)*3], items[(scrolli+max_choice-1)*3 + 1], status[scrolli+max_choice-1], max_choice-1, FALSE);
+ scrollok(list, TRUE);
+ scroll(list);
+ scrollok(list, FALSE);
+ }
+ scrolli++;
+ print_item(list, items[(scrolli+max_choice-1)*3], items[(scrolli+max_choice-1)*3 + 1], status[scrolli+max_choice-1], max_choice-1, TRUE);
+#endif
+ wnoutrefresh(list);
+
+ /* print the up/down arrows */
+ wattrset(dialog, uarrow_attr);
+ wmove(dialog, box_y, box_x + check_x + 5);
+ waddch(dialog, ACS_UARROW);
+ wmove(dialog, box_y, box_x + check_x + 6);
+ waddstr(dialog, "(-)");
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 5);
+ wattrset(dialog, scrolli+choice < item_no-1 ? darrow_attr : menubox_border_attr);
+ waddch(dialog, scrolli+choice < item_no-1 ? ACS_DARROW : ACS_HLINE);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 6);
+ waddch(dialog, scrolli+choice < item_no-1 ? '(' : ACS_HLINE);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 7);
+ waddch(dialog, scrolli+choice < item_no-1 ? '+' : ACS_HLINE);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 8);
+ waddch(dialog, scrolli+choice < item_no-1 ? ')' : ACS_HLINE);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice + 1;
+ }
+ else if (key == ' ') { /* Toggle item status */
+ status[scrolli+choice] = !status[scrolli+choice];
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ wmove(list, choice, check_x);
+ wattrset(list, check_selected_attr);
+ wprintw(list, "[%c]", status[scrolli+choice] ? 'X' : ' ');
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ continue; /* wait for another key press */
+ }
+
+ if (i != choice) {
+ /* De-highlight current item */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ print_item(list, items[(scrolli+choice)*3], items[(scrolli+choice)*3 + 1], status[scrolli+choice], choice, FALSE);
+
+ /* Highlight new item */
+ choice = i;
+ print_item(list, items[(scrolli+choice)*3], items[(scrolli+choice)*3 + 1], status[scrolli+choice], choice, TRUE);
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+
+ switch (key) {
+ case 'O':
+ case 'o':
+ delwin(dialog);
+ for (i = 0; i < item_no; i++)
+ if (status[i]) {
+ if (separate_output) {
+ fprintf(stderr, "%s\n", items[i*3]);
+ } else {
+ fprintf(stderr, "\"%s\" ", items[i*3]);
+ }
+ }
+ free(status);
+ return 0;
+ case 'C':
+ case 'c':
+ delwin(dialog);
+ free(status);
+ return 1;
+ case TAB:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ if (!button) {
+ button = 1; /* Indicates "Cancel" button is selected */
+ print_button(dialog, " OK ", y, x, FALSE);
+ print_button(dialog, "Cancel", y, x+14, TRUE);
+ }
+ else {
+ button = 0; /* Indicates "OK" button is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ }
+ wrefresh(dialog);
+ break;
+ case ' ':
+ case '\n':
+ delwin(dialog);
+ if (!button)
+ for (i = 0; i < item_no; i++)
+ if (status[i]) {
+ if (separate_output) {
+ fprintf(stderr, "%s\n", items[i*3]);
+ } else {
+ fprintf(stderr, "\"%s\" ", items[i*3]);
+ }
+ }
+ free(status);
+ return button;
+ case ESC:
+ break;
+ }
+ }
+
+ delwin(dialog);
+ free(status);
+ return -1; /* ESC pressed */
+}
+/* End of dialog_checklist() */
+
+
+/*
+ * Print list item
+ */
+static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected)
+{
+ int i;
+
+ /* Clear 'residue' of last item */
+ wattrset(win, menubox_attr);
+ wmove(win, choice, 0);
+ for (i = 0; i < list_width; i++)
+ waddch(win, ' ');
+ wmove(win, choice, check_x);
+ wattrset(win, selected ? check_selected_attr : check_attr);
+ wprintw(win, "[%c]", status ? 'X' : ' ');
+ wattrset(win, menubox_attr);
+ waddch(win, ' ');
+ wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
+ waddch(win, tag[0]);
+ wattrset(win, selected ? tag_selected_attr : tag_attr);
+ waddstr(win, tag + 1);
+ wmove(win, choice, item_x);
+ wattrset(win, selected ? item_selected_attr : item_attr);
+ waddstr(win, item);
+}
+/* End of print_item() */
diff --git a/Build/source/utils/dialog/colors.h b/Build/source/utils/dialog/colors.h
new file mode 100644
index 00000000000..7ccac4838d3
--- /dev/null
+++ b/Build/source/utils/dialog/colors.h
@@ -0,0 +1,219 @@
+/*
+ * colors.h -- color attribute definitions
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * Default color definitions
+ *
+ * *_FG = foreground
+ * *_BG = background
+ * *_HL = highlight?
+ */
+#define SCREEN_FG COLOR_CYAN
+#define SCREEN_BG COLOR_BLUE
+#define SCREEN_HL TRUE
+
+#define SHADOW_FG COLOR_BLACK
+#define SHADOW_BG COLOR_BLACK
+#define SHADOW_HL TRUE
+
+#define DIALOG_FG COLOR_BLACK
+#define DIALOG_BG COLOR_WHITE
+#define DIALOG_HL FALSE
+
+#define TITLE_FG COLOR_YELLOW
+#define TITLE_BG COLOR_WHITE
+#define TITLE_HL TRUE
+
+#define BORDER_FG COLOR_WHITE
+#define BORDER_BG COLOR_WHITE
+#define BORDER_HL TRUE
+
+#define BUTTON_ACTIVE_FG COLOR_WHITE
+#define BUTTON_ACTIVE_BG COLOR_BLUE
+#define BUTTON_ACTIVE_HL TRUE
+
+#define BUTTON_INACTIVE_FG COLOR_BLACK
+#define BUTTON_INACTIVE_BG COLOR_WHITE
+#define BUTTON_INACTIVE_HL FALSE
+
+#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
+#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
+#define BUTTON_KEY_ACTIVE_HL TRUE
+
+#define BUTTON_KEY_INACTIVE_FG COLOR_RED
+#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
+#define BUTTON_KEY_INACTIVE_HL FALSE
+
+#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
+#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
+#define BUTTON_LABEL_ACTIVE_HL TRUE
+
+#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
+#define BUTTON_LABEL_INACTIVE_HL TRUE
+
+#define INPUTBOX_FG COLOR_BLACK
+#define INPUTBOX_BG COLOR_WHITE
+#define INPUTBOX_HL FALSE
+
+#define INPUTBOX_BORDER_FG COLOR_BLACK
+#define INPUTBOX_BORDER_BG COLOR_WHITE
+#define INPUTBOX_BORDER_HL FALSE
+
+#define SEARCHBOX_FG COLOR_BLACK
+#define SEARCHBOX_BG COLOR_WHITE
+#define SEARCHBOX_HL FALSE
+
+#define SEARCHBOX_TITLE_FG COLOR_YELLOW
+#define SEARCHBOX_TITLE_BG COLOR_WHITE
+#define SEARCHBOX_TITLE_HL TRUE
+
+#define SEARCHBOX_BORDER_FG COLOR_WHITE
+#define SEARCHBOX_BORDER_BG COLOR_WHITE
+#define SEARCHBOX_BORDER_HL TRUE
+
+#define POSITION_INDICATOR_FG COLOR_YELLOW
+#define POSITION_INDICATOR_BG COLOR_WHITE
+#define POSITION_INDICATOR_HL TRUE
+
+#define MENUBOX_FG COLOR_BLACK
+#define MENUBOX_BG COLOR_WHITE
+#define MENUBOX_HL FALSE
+
+#define MENUBOX_BORDER_FG COLOR_WHITE
+#define MENUBOX_BORDER_BG COLOR_WHITE
+#define MENUBOX_BORDER_HL TRUE
+
+#define ITEM_FG COLOR_BLACK
+#define ITEM_BG COLOR_WHITE
+#define ITEM_HL FALSE
+
+#define ITEM_SELECTED_FG COLOR_WHITE
+#define ITEM_SELECTED_BG COLOR_BLUE
+#define ITEM_SELECTED_HL TRUE
+
+#define TAG_FG COLOR_YELLOW
+#define TAG_BG COLOR_WHITE
+#define TAG_HL TRUE
+
+#define TAG_SELECTED_FG COLOR_YELLOW
+#define TAG_SELECTED_BG COLOR_BLUE
+#define TAG_SELECTED_HL TRUE
+
+#define TAG_KEY_FG COLOR_RED
+#define TAG_KEY_BG COLOR_WHITE
+#define TAG_KEY_HL TRUE
+
+#define TAG_KEY_SELECTED_FG COLOR_RED
+#define TAG_KEY_SELECTED_BG COLOR_BLUE
+#define TAG_KEY_SELECTED_HL TRUE
+
+#define CHECK_FG COLOR_BLACK
+#define CHECK_BG COLOR_WHITE
+#define CHECK_HL FALSE
+
+#define CHECK_SELECTED_FG COLOR_WHITE
+#define CHECK_SELECTED_BG COLOR_BLUE
+#define CHECK_SELECTED_HL TRUE
+
+#define UARROW_FG COLOR_GREEN
+#define UARROW_BG COLOR_WHITE
+#define UARROW_HL TRUE
+
+#define DARROW_FG COLOR_GREEN
+#define DARROW_BG COLOR_WHITE
+#define DARROW_HL TRUE
+
+/* End of default color definitions */
+
+#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
+#define COLOR_NAME_LEN 10
+#define COLOR_COUNT 8
+
+
+/*
+ * Global variables
+ */
+
+typedef struct {
+ char name[COLOR_NAME_LEN];
+ int value;
+} color_names_st;
+
+
+#ifdef __DIALOG_MAIN__
+
+/*
+ * For matching color names with color values
+ */
+color_names_st color_names[] = {
+ {"BLACK", COLOR_BLACK},
+ {"RED", COLOR_RED},
+ {"GREEN", COLOR_GREEN},
+ {"YELLOW", COLOR_YELLOW},
+ {"BLUE", COLOR_BLUE},
+ {"MAGENTA", COLOR_MAGENTA},
+ {"CYAN", COLOR_CYAN},
+ {"WHITE", COLOR_WHITE},
+}; /* color names */
+
+
+/*
+ * Table of color values
+ */
+int color_table[][3] = {
+ {SCREEN_FG, SCREEN_BG, SCREEN_HL },
+ {SHADOW_FG, SHADOW_BG, SHADOW_HL },
+ {DIALOG_FG, DIALOG_BG, DIALOG_HL },
+ {TITLE_FG, TITLE_BG, TITLE_HL },
+ {BORDER_FG, BORDER_BG, BORDER_HL },
+ {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL },
+ {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL },
+ {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL },
+ {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL },
+ {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL },
+ {BUTTON_LABEL_INACTIVE_FG,BUTTON_LABEL_INACTIVE_BG,BUTTON_LABEL_INACTIVE_HL},
+ {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL },
+ {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL },
+ {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL },
+ {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL },
+ {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL },
+ {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL },
+ {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL },
+ {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL },
+ {ITEM_FG, ITEM_BG, ITEM_HL },
+ {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL },
+ {TAG_FG, TAG_BG, TAG_HL },
+ {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL },
+ {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL },
+ {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL },
+ {CHECK_FG, CHECK_BG, CHECK_HL },
+ {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL },
+ {UARROW_FG, UARROW_BG, UARROW_HL },
+ {DARROW_FG, DARROW_BG, DARROW_HL },
+}; /* color_table */
+
+#else
+
+extern color_names_st color_names[];
+extern int color_table[][3];
+
+#endif /* __DIALOG_MAIN__ */
diff --git a/Build/source/utils/dialog/configure b/Build/source/utils/dialog/configure
new file mode 100755
index 00000000000..d9789c7aa2c
--- /dev/null
+++ b/Build/source/utils/dialog/configure
@@ -0,0 +1,1793 @@
+#! /bin/sh
+
+
+
+
+
+
+
+
+
+# Find a program when cross-compiling, or use a default when not.
+# $1 = variable which records the outcome
+# $2 = program to look for when cross-compiling
+# $3 = program to use when not cross-compiling
+
+
+# Set BUILD$1 to $2 when cross-compiling, to $($1) if not.
+# Example: KPSE_CROSS_BUILD_VAR([CC], [cc]) sets 'BUILDCC' to 'cc'
+# if cross-compiling, and to '$(CC)' if not.
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-system-ncurses check for installed ncurses"
+ac_help="$ac_help
+ --with-ncurses-libdir=DIR
+ Specify directory where the ncurses library resides."
+ac_help="$ac_help
+ --with-ncurses-include=DIR
+ Specify the ncurses header files location."
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=dialog.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in ../../config $srcdir/../../config; do
+ if test -f $ac_dir/install-sh; then
+ case $ac_dir in
+ /*|[A-z]:/*) ac_aux_dir=$ac_dir;;
+ *) ac_aux_dir=`pwd`/$ac_dir;;
+ esac
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ case $ac_dir in
+ /*|[A-z]:/*) ac_aux_dir=$ac_dir;;
+ *) ac_aux_dir=`pwd`/$ac_dir;;
+ esac
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in ../../config $srcdir/../../config" 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:581: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:612: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:664: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:697: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 708 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:713: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:739: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:744: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:753: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:772: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:804: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 819 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:825: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 836 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:842: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 853 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:859: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:885: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat > conftest.$ac_ext <<EOF
+#line 891 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+else
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat > conftest.$ac_ext <<EOF
+#line 909 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:931: checking for POSIXized ISC" >&5
+if test -d /etc/conf/kconfig.d &&
+ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+ echo "$ac_t""yes" 1>&6
+ ISC=yes # If later tests want to check for ISC.
+ cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+ if test "$GCC" = yes; then
+ CC="$CC -posix"
+ else
+ CC="$CC -Xp"
+ fi
+else
+ echo "$ac_t""no" 1>&6
+ ISC=
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:963: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ # Hack for MSDOS and descendants.
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test $ac_x $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1018: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+for ac_func in strcasecmp
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1048: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1053 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+try_ncurses=no
+# Check whether --with-system-ncurses or --without-system-ncurses was given.
+if test "${with_system_ncurses+set}" = set; then
+ withval="$with_system_ncurses"
+ test "$withval" = "yes" && try_ncurses=yes
+else
+ try_ncurses=no
+fi
+
+
+# Check whether --with-ncurses_libdir or --without-ncurses_libdir was given.
+if test "${with_ncurses_libdir+set}" = set; then
+ withval="$with_ncurses_libdir"
+ :
+fi
+
+
+# Check whether --with-ncurses_include or --without-ncurses_include was given.
+if test "${with_ncurses_include+set}" = set; then
+ withval="$with_ncurses_include"
+ :
+fi
+
+
+
+if test "$needs_ncurses" = no; then
+ CURSESCPPFLAGS=
+ LDCURSESLIB=
+ CURSESDEP=
+else
+ #
+ # Check for ncurses.
+ #
+ have_ncurses=no
+ HAVE_NCURSES_CURSES_H=no
+
+ EXTRA_NCURSES_INCLUDE=
+ EXTRA_NCURSES_LIBDIR=
+
+ if test "$with_system_ncurses" = yes; then
+ if test "x$with_ncurses_libdir" != x; then
+ EXTRA_NCURSES_LIBDIR="-L$with_ncurses_libdir"
+ fi
+ if test "x$with_ncurses_include" != x; then
+ EXTRA_NCURSES_INCLUDE="-I$with_ncurses_include"
+ fi
+ fi
+
+ OLD_LDFLAGS=$LDFLAGS
+ OLD_CPP=$CPP
+ OLD_LIBS=$LIBS
+
+ LDFLAGS="$LDFLAGS $EXTRA_NCURSES_LIBDIR"
+ CPP="$CPP $EXTRA_NCURSES_INCLUDE"
+
+ CURSESCPPFLAGS=
+ if test "$try_ncurses" = yes; then
+ echo $ac_n "checking for wresize in -lncurses""... $ac_c" 1>&6
+echo "configure:1159: checking for wresize in -lncurses" >&5
+ac_lib_var=`echo ncurses'_'wresize | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lncurses $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1167 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char wresize();
+
+int main() {
+wresize()
+; return 0; }
+EOF
+if { (eval echo configure:1178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ have_ncurses=yes
+else
+ echo "$ac_t""no" 1>&6
+have_ncurses=no
+fi
+
+ if test "${have_ncurses}" = "yes" ; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_NCURSES 1
+EOF
+
+ if (
+ for ac_hdr in ncurses/curses.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1209: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1214 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1219: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ HAVE_NCURSES_CURSES_H=yes
+else
+ echo "$ac_t""no" 1>&6
+HAVE_NCURSES_CURSES_H=no
+fi
+done
+
+ test $HAVE_NCURSES_CURSES_H = yes && exit 0
+ exit 1
+ )
+ then
+ HAVE_NCURSES_CURSES_H=yes
+ else
+ HAVE_NCURSES_CURSES_H=no
+ fi
+
+ if (
+ for ac_hdr in ncurses.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1260: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1265 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1270: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ HAVE_NCURSES_H=yes
+else
+ echo "$ac_t""no" 1>&6
+HAVE_NCURSES_H=no
+fi
+done
+
+ test $HAVE_NCURSES_H = yes && exit 0
+ exit 1
+ )
+ then
+ HAVE_NCURSES_H=yes
+ else
+ HAVE_NCURSES_H=no
+ fi
+
+ if test "${HAVE_NCURSES_CURSES_H}" = no && test "${HAVE_NCURSES_H}" = no; then
+ # Try again, and check for the bogus ncurses/ include bug.
+ # (i.e. ncurses/curses.h bogusly includes <unctrl.h> instead of
+ # <ncurses/unctrl.h>)
+ echo "$ac_t""Trying again with -I/usr/include/ncurses..." 1>&6
+ OLD_CPP="${CPP}"
+ CPP="${CPP} -I/usr/include/ncurses"
+ if (
+ for ac_hdr in ncurses/curses.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1318: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1323 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1328: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ HAVE_NCURSES_CURSES_H=yes
+else
+ echo "$ac_t""no" 1>&6
+HAVE_NCURSES_CURSES_H=no
+fi
+done
+
+ test $HAVE_NCURSES_CURSES_H = yes && exit 0
+ exit 1
+ )
+ then
+ HAVE_NCURSES_CURSES_H=yes
+ else
+ HAVE_NCURSES_CURSES_H=no
+ fi
+
+ if test "${HAVE_NCURSES_CURSES_H}" = "yes" ; then
+ CURSESCPPFLAGS=-I/usr/include/ncurses
+ echo "$ac_t"" Your system has the bogus ncurses include bug." 1>&6
+ else
+ CPP="${OLD_CPP}"
+ fi
+ fi
+ fi
+ fi
+
+ LDFLAGS=$OLD_LDFLAGS
+ CPP=$OLD_CPP
+ LIBS=$OLD_LIBS
+
+ if test "${have_ncurses}" = yes && { test "${HAVE_NCURSES_CURSES_H}" = yes || test "${HAVE_NCURSES_H}" = yes; }; then
+ LDCURSESLIB="$EXTRA_NCURSES_LIBDIR -lncurses"
+ CURSESDEP=
+ CURSESCPPFLAGS="$CURSESCPPFLAGS $EXTRA_NCURSES_INCLUDE"
+ using_system_ncurses=yes
+ else
+ CURSESCPPFLAGS='-I$(NCURSESDIR)/include -I$(NCURSESSRCDIR)/include'
+ LDCURSESLIB='$(NCURSESDIR)/lib/libncurses.a'
+ CURSESDEP='$(NCURSESDIR)/lib/libncurses.a'
+ using_system_ncurses=no
+ fi
+fi
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile dialogconfig.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CURSESCPPFLAGS@%$CURSESCPPFLAGS%g
+s%@LDCURSESLIB@%$LDCURSESLIB%g
+s%@CURSESDEP@%$CURSESDEP%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*|[A-z]:/*) # Absolute path.
+ srcdir="$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ "") ;;
+ [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
+ # Replace lines of the form ac_include foo with the contents of foo:
+ # first, from the ac_include lines construct a list of file names.
+ # From that list, we construct a second list of those files that exist.
+ # Then we construct lists of sed commands for including those files,
+ # and a sed command that removes the ac_include lines. We don't attempt
+ # to read non-existent files because some (buggy) versions of sed choke
+ # on this. Have to use sed because old (Ultrix, SunOS) awk does not support
+ # getline or system. (Anyway, configure scripts aren't supposed to use awk.)
+ # Can't use only one -e and commands {dr foo} because foo has to be last.
+ # Be careful, because the filename may contain /. Be careful with
+ # whitespace; we need to use echo.
+ #
+ # No support for the multiple-output file :-separated stuff.
+ #
+ file_substs=`sed -n \
+'/^ac_include/s%ac_include[ ]*\(.*\)%\1%p' \
+ "$ac_given_srcdir/$ac_file_in"`
+ # Create the sed command line ...
+ file_subst_cmd='sed'
+ for ac_inc in $file_substs; do
+ if test -f "$ac_given_srcdir/$ac_inc"; then
+ ac_mung=`echo $ac_inc | sed 's,/,%,g'`
+ file_subst_cmd="$file_subst_cmd -e '/^ac_include $ac_mung$/r $ac_inc'"
+ fi
+ done
+ file_subst_cmd="$file_subst_cmd -e '/^ac_include/d'"
+ # ... and fix the whitespace and escaped slashes.
+ file_subst_cmd=`echo "$file_subst_cmd" | sed -e 's,%,\\\/,g' \
+-e 's/ac_include /ac_include[ ]*/g'`
+ # cd into the srcdir because the files being included more or less
+ # must be part of the distribution. I can't find any way to do
+ # variable substitution in the sed commands (so the user could have,
+ # e.g., $top_srcdir in their ac_include line).
+ (cd $ac_given_srcdir && eval $file_subst_cmd $ac_file_in) \
+ | sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ].*$%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="dialogconfig.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/Build/source/utils/dialog/configure.in b/Build/source/utils/dialog/configure.in
new file mode 100644
index 00000000000..41b0cef8fd1
--- /dev/null
+++ b/Build/source/utils/dialog/configure.in
@@ -0,0 +1,20 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(dialog.c)
+
+AC_CONFIG_AUX_DIR(../../config)
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_GCC_TRADITIONAL
+AC_ISC_POSIX
+AC_PROG_INSTALL
+AC_SET_MAKE
+AC_CONFIG_HEADER(dialogconfig.h)
+AC_CHECK_FUNCS(strcasecmp)
+
+sinclude(../../libs/ncurses/withenable.ac)
+sinclude(../../libs/ncurses/ncurses.ac)
+
+dnl ac_configure_args=`echo "$ac_configure_args" | sed 's@--prefix=[[^ ]]*@@'`
+
+AC_OUTPUT(Makefile)
diff --git a/Build/source/utils/dialog/dialog.c b/Build/source/utils/dialog/dialog.c
new file mode 100644
index 00000000000..485bd3368a1
--- /dev/null
+++ b/Build/source/utils/dialog/dialog.c
@@ -0,0 +1,610 @@
+/*
+ * dialog - Display simple dialog boxes from shell scripts
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * HISTORY:
+ *
+ * 17/12/93 - Version 0.1 released.
+ *
+ * 19/12/93 - menu will now scroll if there are more items than can fit
+ * on the screen.
+ * - added 'checklist', a dialog box with a list of options that
+ * can be turned on or off. A list of options that are on is
+ * returned on exit.
+ *
+ * 20/12/93 - Version 0.15 released.
+ *
+ * 29/12/93 - Incorporated patch from Patrick J. Volkerding
+ * (volkerdi@mhd1.moorhead.msus.edu) that made these changes:
+ * - increased MAX_LEN to 2048
+ * - added 'infobox', equivalent to a message box without pausing
+ * - added option '--clear' that will clear the screen
+ * - Explicit line breaking when printing prompt text can be
+ * invoked by real newline '\n' besides the string "\n"
+ * - an optional parameter '--title <string>' can be used to
+ * specify a title string for the dialog box
+ *
+ * 03/01/94 - added 'textbox', a dialog box for displaying text from a file.
+ * - Version 0.2 released.
+ *
+ * 04/01/94 - some fixes and improvements for 'textbox':
+ * - fixed a bug that will cause a segmentation violation when a
+ * line is longer than MAX_LEN characters. Lines will now be
+ * truncated if they are longer than MAX_LEN characters.
+ * - removed wrefresh() from print_line(). This will increase
+ * efficiency of print_page() which calls print_line().
+ * - display current position in the form of percentage into file.
+ * - Version 0.21 released.
+ *
+ * 05/01/94 - some changes for faster screen update.
+ *
+ * 07/01/94 - much more flexible color settings. Can use all 16 colors
+ * (8 normal, 8 highlight) of the Linux console.
+ *
+ * 08/01/94 - added run-time configuration using configuration file.
+ *
+ * 09/01/94 - some minor bug fixes and cleanups for menubox, checklist and
+ * textbox.
+ *
+ * 11/01/94 - added a man page.
+ *
+ * 13/01/94 - some changes for easier porting to other Unix systems (tested
+ * on Ultrix, SunOS and HPUX)
+ * - Version 0.3 released.
+ *
+ * 08/06/94 - Patches by Stuart Herbert - S.Herbert@shef.ac.uk
+ * Fixed attr_clear and the textbox stuff to work with ncurses 1.8.5
+ * Fixed the wordwrap routine - it'll actually wrap properly now
+ * Added a more 3D look to everything - having your own rc file could
+ * prove 'interesting' to say the least :-)
+ * Added radiolist option
+ * Added backtitle option
+ * - Version 0.4 released.
+ *
+ * 10/10/94 - Patches by Marc Ewing - marc@redhat.com
+ * Added --separate-output
+ * Added init val to inputbox
+ * Added guage widget
+ */
+
+
+#define __DIALOG_MAIN__
+
+
+#include "dialog.h"
+#ifdef HAVE_NCURSES
+#include "colors.h"
+#endif
+
+static char *backtitle = NULL;
+int separate_output = 0;
+
+int main(int argc, char *argv[])
+{
+ int offset = 0, clear_screen = 0, end_common_opts = 0, retval;
+ char *title = NULL;
+
+#if defined(LOCALE)
+ (void) setlocale(LC_ALL, "");
+#endif
+
+ if (argc < 2) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ else if (!strcmp(argv[1], "--create-rc")) {
+#ifdef HAVE_NCURSES
+ if (argc != 3) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ create_rc(argv[2]);
+ return 0;
+#else
+ fprintf(stderr, "\nThis option is currently unsupported on your system.\n");
+ return -1;
+#endif
+ }
+
+ while (offset < argc-1 && !end_common_opts) { /* Common options */
+ if (!strcmp(argv[offset+1], "--title")) {
+ if (argc-offset < 3 || title != NULL) { /* No two "--title" please! */
+ Usage(argv[0]);
+ exit(-1);
+ }
+ else {
+ title = argv[offset+2];
+ offset += 2;
+ }
+ }
+ else if (!strcmp(argv[offset+1], "--backtitle" ))
+ {
+ if (backtitle != NULL)
+ {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ else
+ {
+ backtitle = argv[offset+2];
+ offset += 2;
+ }
+ }
+ else if (!strcmp(argv[offset+1], "--separate-output" ))
+ {
+ separate_output = 1;
+ offset++;
+ }
+ else if (!strcmp(argv[offset+1], "--clear")) {
+ if (clear_screen) { /* Hey, "--clear" can't appear twice! */
+ Usage(argv[0]);
+ exit(-1);
+ }
+ else if (argc == 2) { /* we only want to clear the screen */
+ init_dialog();
+ refresh(); /* init_dialog() will clear the screen for us */
+ endwin();
+ return 0;
+ }
+ else {
+ clear_screen = 1;
+ offset++;
+ }
+ }
+ else /* no more common options */
+ end_common_opts = 1;
+ }
+
+ if (argc-1 == offset) { /* no more options */
+ Usage(argv[0]);
+ exit(-1);
+ }
+
+ /* Box options */
+
+ if (!strcmp(argv[offset+1], "--yesno")) {
+ if (argc-offset != 5) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_yesno(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]));
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--msgbox")) {
+ if (argc-offset != 5) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_msgbox(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]), 1);
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--infobox")) {
+ if (argc-offset != 5) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_msgbox(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]), 0);
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--textbox")) {
+ if (argc-offset != 5) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_textbox(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]));
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--menu")) {
+ if (argc-offset < 8 || ((argc-offset) % 2)) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_menu(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]), atoi(argv[offset+5]),
+ (argc-offset-6)/2, argv+offset + 6);
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--checklist")) {
+ if (argc-offset < 9 || ((argc-offset-6) % 3)) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_checklist(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]), atoi(argv[offset+5]),
+ (argc-offset-6)/3, argv+offset + 6);
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--radiolist")) {
+ if (argc-offset < 9 || ((argc-offset-6) % 3)) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_radiolist(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]), atoi(argv[offset+5]),
+ (argc-offset-6)/3, argv+offset + 6);
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--guage")) {
+ if (argc-offset != 6) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_guage(title, argv[offset+2],
+ atoi(argv[offset+3]), atoi(argv[offset+4]),
+ atoi(argv[offset+5]));
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+ else if (!strcmp(argv[offset+1], "--inputbox")) {
+ if (argc-offset < 5 || argc-offset > 6) {
+ Usage(argv[0]);
+ exit(-1);
+ }
+ init_dialog();
+ retval = dialog_inputbox(title, argv[offset+2], atoi(argv[offset+3]),
+ atoi(argv[offset+4]),
+ (argc-offset == 6) ? argv[offset+5] : (char *)NULL);
+
+ if (clear_screen) { /* clear screen before exit */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+ refresh();
+ }
+ endwin();
+ return retval;
+ }
+
+ Usage(argv[0]);
+ exit(-1);
+}
+/* End of main() */
+
+
+/*
+ * Print program usage
+ */
+void Usage(char *name)
+{
+ fprintf(stderr, "\
+\ndialog version 0.3, by Savio Lam (lam836@cs.cuhk.hk).\
+\n patched to version %s by Stuart Herbert (S.Herbert@shef.ac.uk)\
+\n\
+\n* Display dialog boxes from shell scripts *\
+\n\
+\nUsage: %s --clear\
+\n %s --create-rc <file>\
+\n %s [--title <title>] [--separate-output] [--backtitle <backtitle>] [--clear] <Box options>\
+\n\
+\nBox options:\
+\n\
+\n --yesno <text> <height> <width>\
+\n --msgbox <text> <height> <width>\
+\n --infobox <text> <height> <width>\
+\n --inputbox <text> <height> <width> [<init>]\
+\n --textbox <file> <height> <width>\
+\n --menu <text> <height> <width> <menu height> <tag1> <item1>...\
+\n --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
+\n --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
+\n --guage <text> <height> <width> <percent>\n", VERSION, name, name, name);
+}
+/* End of Usage() */
+
+
+/*
+ * Do some initialization for dialog
+ */
+void init_dialog(void)
+{
+ int i;
+
+#ifdef HAVE_NCURSES
+ if (parse_rc() == -1) /* Read the configuration file */
+ exit(-1);
+#endif
+
+ initscr(); /* Init curses */
+ keypad(stdscr, TRUE);
+ cbreak();
+ noecho();
+
+#ifdef HAVE_NCURSES
+ if (use_colors || use_shadow) /* Set up colors */
+ color_setup();
+#endif
+
+ /* Set screen to screen attribute */
+ attr_clear(stdscr, LINES, COLS, screen_attr);
+
+ /* Display background title if it exists ... - SLH */
+ if (backtitle != NULL)
+ {
+ wattrset(stdscr, screen_attr);
+ wmove(stdscr, 0, 1);
+ waddstr(stdscr,backtitle);
+ wmove(stdscr, 1, 1);
+ for(i=1; i<COLS-1; i++)
+ waddch(stdscr, ACS_HLINE);
+ }
+
+ wnoutrefresh(stdscr);
+}
+/* End of init_dialog() */
+
+
+#ifdef HAVE_NCURSES
+/*
+ * Setup for color display
+ */
+void color_setup(void)
+{
+ int i;
+
+ if (has_colors()) { /* Terminal supports color? */
+ start_color();
+
+ /* Initialize color pairs */
+ for (i = 0; i < ATTRIBUTE_COUNT; i++)
+ init_pair(i+1, color_table[i][0], color_table[i][1]);
+
+ /* Setup color attributes */
+ for (i = 0; i < ATTRIBUTE_COUNT; i++)
+ attributes[i] = C_ATTR(color_table[i][2], i+1);
+ }
+}
+/* End of color_setup() */
+#endif
+
+
+/*
+ * Set window to attribute 'attr'
+ */
+void attr_clear(WINDOW *win, int height, int width, chtype attr)
+{
+/* ifdef HAVE_NCURSES
+ wattrset(win, attr); Set window to attribute 'attr'
+ werase(win);
+else */
+ int i, j;
+
+ wattrset(win, attr); /* Set window to attribute 'attr' */
+ for (i = 0; i < height; i++) {
+ wmove(win, i, 0);
+ for (j = 0; j < width; j++)
+ waddch(win, ' ');
+ }
+ touchwin(win);
+/* endif */
+}
+/* End of attr_clear() */
+
+
+/*
+ * Print a string of text in a window, automatically wrap around to the
+ * next line if the string is too long to fit on one line. Note that the
+ * string may contain "\n" to represent a newline character or the real
+ * newline '\n', but in that case, auto wrap around will be disabled.
+ */
+void print_autowrap(WINDOW *win, char *prompt, int width, int y, int x)
+{
+ int first = 1, cur_x, cur_y;
+ char tempstr[MAX_LEN+1], *word, *tempptr, *tempptr1;
+
+ strcpy(tempstr, prompt);
+ if ((strstr(tempstr, "\\n") != NULL) ||
+ (strchr(tempstr, '\n') != NULL)) { /* Prompt contains "\n" or '\n' */
+ word = tempstr;
+ cur_y = y;
+ wmove(win, cur_y, x);
+ while (1) {
+ tempptr = strstr(word, "\\n");
+ tempptr1 = strchr(word, '\n');
+ if (tempptr == NULL && tempptr1 == NULL)
+ break;
+ else if (tempptr == NULL) { /* No more "\n" */
+ tempptr = tempptr1;
+ tempptr[0] = '\0';
+ }
+ else if (tempptr1 == NULL) { /* No more '\n' */
+ tempptr[0] = '\0';
+ tempptr++;
+ }
+ else { /* Prompt contains both "\n" and '\n' */
+ if (strlen(tempptr)-2 < strlen(tempptr1)-1) {
+ tempptr = tempptr1;
+ tempptr[0] = '\0';
+ }
+ else {
+ tempptr[0] = '\0';
+ tempptr++;
+ }
+ }
+
+ waddstr(win, word);
+ word = tempptr + 1;
+ wmove(win, ++cur_y, x);
+ }
+ waddstr(win, word);
+ }
+ else if (strlen(tempstr) <= width-x*2) { /* If prompt is short */
+ wmove(win, y, (width - strlen(tempstr)) / 2);
+ waddstr(win, tempstr);
+ }
+ else {
+ cur_x = x;
+ cur_y = y;
+ /* Print prompt word by word, wrap around if necessary */
+ while ((word = strtok(first ? tempstr : NULL, " ")) != NULL) {
+ if (first) /* First iteration */
+ first = 0;
+ if (cur_x+strlen(word) > width) { /* wrap around to next line */
+ cur_y++;
+ cur_x = x;
+ }
+ wmove(win, cur_y, cur_x);
+ waddstr(win, word);
+ getyx(win, cur_y, cur_x);
+ cur_x++;
+ }
+ }
+}
+/* End of print_autowrap() */
+
+
+/*
+ * Print a button
+ */
+void print_button(WINDOW *win, char *label, int y, int x, int selected)
+{
+ int i, temp;
+
+ wmove(win, y, x);
+ wattrset(win, selected ? button_active_attr : button_inactive_attr);
+ waddstr(win, "<");
+ temp = strspn(label, " ");
+ label += temp;
+ wattrset(win, selected ? button_label_active_attr : button_label_inactive_attr);
+ for (i = 0; i < temp; i++)
+ waddch(win, ' ');
+ wattrset(win, selected ? button_key_active_attr : button_key_inactive_attr);
+ waddch(win, label[0]);
+ wattrset(win, selected ? button_label_active_attr : button_label_inactive_attr);
+ waddstr(win, label+1);
+ wattrset(win, selected ? button_active_attr : button_inactive_attr);
+ waddstr(win, ">");
+ wmove(win, y, x+temp+1);
+}
+/* End of print_button() */
+
+
+/*
+ * Draw a rectangular box with line drawing characters
+ */
+void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border)
+{
+ int i, j;
+
+ wattrset(win, 0);
+ for (i = 0; i < height; i++) {
+ wmove(win, y + i, x);
+ for (j = 0; j < width; j++)
+ if (!i && !j)
+ waddch(win, border | ACS_ULCORNER);
+ else if (i == height-1 && !j)
+ waddch(win, border | ACS_LLCORNER);
+ else if (!i && j == width-1)
+ waddch(win, box | ACS_URCORNER);
+ else if (i == height-1 && j == width-1)
+ waddch(win, box | ACS_LRCORNER);
+ else if (!i)
+ waddch(win, border | ACS_HLINE);
+ else if (i == height-1)
+ waddch(win, box | ACS_HLINE);
+ else if (!j)
+ waddch(win, border | ACS_VLINE);
+ else if (j == width-1)
+ waddch(win, box | ACS_VLINE);
+ else
+ waddch(win, box | ' ');
+ }
+}
+/* End of draw_box() */
+
+
+#ifdef HAVE_NCURSES
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes
+ */
+void draw_shadow(WINDOW *win, int y, int x, int height, int width)
+{
+ int i;
+
+ if (has_colors()) { /* Whether terminal supports color? */
+ wattrset(win, shadow_attr);
+ wmove(win, y + height, x + 2);
+ for (i = 0; i < width; i++)
+ waddch(win, winch(win) & A_CHARTEXT);
+ for (i = y + 1; i < y + height + 1; i++) {
+ wmove(win, i, x + width);
+ waddch(win, winch(win) & A_CHARTEXT);
+ waddch(win, winch(win) & A_CHARTEXT);
+ }
+ wnoutrefresh(win);
+ }
+}
+/* End of draw_shadow() */
+#endif
diff --git a/Build/source/utils/dialog/dialog.h b/Build/source/utils/dialog/dialog.h
new file mode 100644
index 00000000000..ddf4cac3ee4
--- /dev/null
+++ b/Build/source/utils/dialog/dialog.h
@@ -0,0 +1,247 @@
+/*
+ * dialog.h -- common declarations for all dialog modules
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <dialogconfig.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_NCURSES
+#ifdef HAVE_NCURSES_H
+#include <ncurses.h>
+#else
+#include <ncurses/curses.h>
+#endif
+#else
+
+#ifdef ultrix
+#include <cursesX.h>
+#else
+#include <curses.h>
+#endif
+
+#endif
+
+#if defined(LOCALE)
+#include <locale.h>
+#endif
+
+/*
+ * Change these if you want
+ */
+#ifndef USE_SHADOW
+#define USE_SHADOW FALSE
+#endif
+#ifndef USE_COLORS
+#define USE_COLORS TRUE
+#endif
+
+
+
+#define VERSION "0.4"
+#define ESC 27
+#define TAB 9
+#define MAX_LEN 2048
+#define BUF_SIZE (10*1024)
+#define MIN(x,y) (x < y ? x : y)
+#define MAX(x,y) (x > y ? x : y)
+
+#ifndef HAVE_NCURSES
+#ifndef ACS_ULCORNER
+#define ACS_ULCORNER '+'
+#endif
+#ifndef ACS_LLCORNER
+#define ACS_LLCORNER '+'
+#endif
+#ifndef ACS_URCORNER
+#define ACS_URCORNER '+'
+#endif
+#ifndef ACS_LRCORNER
+#define ACS_LRCORNER '+'
+#endif
+#ifndef ACS_HLINE
+#define ACS_HLINE '-'
+#endif
+#ifndef ACS_VLINE
+#define ACS_VLINE '|'
+#endif
+#ifndef ACS_LTEE
+#define ACS_LTEE '+'
+#endif
+#ifndef ACS_RTEE
+#define ACS_RTEE '+'
+#endif
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+#ifndef ACS_DARROW
+#define ACS_DARROW 'v'
+#endif
+#endif /* HAVE_NCURSES */
+
+
+/*
+ * Attribute names
+ */
+#define screen_attr attributes[0]
+#define shadow_attr attributes[1]
+#define dialog_attr attributes[2]
+#define title_attr attributes[3]
+#define border_attr attributes[4]
+#define button_active_attr attributes[5]
+#define button_inactive_attr attributes[6]
+#define button_key_active_attr attributes[7]
+#define button_key_inactive_attr attributes[8]
+#define button_label_active_attr attributes[9]
+#define button_label_inactive_attr attributes[10]
+#define inputbox_attr attributes[11]
+#define inputbox_border_attr attributes[12]
+#define searchbox_attr attributes[13]
+#define searchbox_title_attr attributes[14]
+#define searchbox_border_attr attributes[15]
+#define position_indicator_attr attributes[16]
+#define menubox_attr attributes[17]
+#define menubox_border_attr attributes[18]
+#define item_attr attributes[19]
+#define item_selected_attr attributes[20]
+#define tag_attr attributes[21]
+#define tag_selected_attr attributes[22]
+#define tag_key_attr attributes[23]
+#define tag_key_selected_attr attributes[24]
+#define check_attr attributes[25]
+#define check_selected_attr attributes[26]
+#define uarrow_attr attributes[27]
+#define darrow_attr attributes[28]
+
+/* number of attributes */
+#define ATTRIBUTE_COUNT 29
+
+
+/*
+ * Global variables
+ */
+#ifdef __DIALOG_MAIN__
+
+#ifdef HAVE_NCURSES
+
+/* use colors by default? */
+bool use_colors = USE_COLORS;
+
+/* shadow dialog boxes by default?
+ Note that 'use_shadow' implies 'use_colors' */
+bool use_shadow = USE_SHADOW;
+
+#endif
+
+/*
+ * Attribute values, default is for mono display
+ */
+chtype attributes[] = {
+ A_NORMAL, /* screen_attr */
+ A_NORMAL, /* shadow_attr */
+ A_REVERSE, /* dialog_attr */
+ A_REVERSE, /* title_attr */
+ A_REVERSE, /* border_attr */
+ A_BOLD, /* button_active_attr */
+ A_DIM, /* button_inactive_attr */
+ A_UNDERLINE, /* button_key_active_attr */
+ A_UNDERLINE, /* button_key_inactive_attr */
+ A_NORMAL, /* button_label_active_attr */
+ A_NORMAL, /* button_label_inactive_attr */
+ A_REVERSE, /* inputbox_attr */
+ A_REVERSE, /* inputbox_border_attr */
+ A_REVERSE, /* searchbox_attr */
+ A_REVERSE, /* searchbox_title_attr */
+ A_REVERSE, /* searchbox_border_attr */
+ A_REVERSE, /* position_indicator_attr */
+ A_REVERSE, /* menubox_attr */
+ A_REVERSE, /* menubox_border_attr */
+ A_REVERSE, /* item_attr */
+ A_NORMAL, /* item_selected_attr */
+ A_REVERSE, /* tag_attr */
+ A_REVERSE, /* tag_selected_attr */
+ A_NORMAL, /* tag_key_attr */
+ A_BOLD, /* tag_key_selected_attr */
+ A_REVERSE, /* check_attr */
+ A_REVERSE, /* check_selected_attr */
+ A_REVERSE, /* uarrow_attr */
+ A_REVERSE /* darrow_attr */
+};
+
+#else
+
+#ifdef HAVE_NCURSES
+extern bool use_colors;
+extern bool use_shadow;
+#endif
+
+extern chtype attributes[];
+
+#endif /* __DIALOG_MAIN__ */
+
+/* Governs printing of checklist and radiobox output */
+extern int separate_output;
+
+
+#ifdef HAVE_NCURSES
+
+/*
+ * Function prototypes
+ */
+#ifdef __DIALOG_MAIN__
+
+extern void create_rc(char *filename);
+extern int parse_rc(void);
+
+#endif /* __DIALOG_MAIN__ */
+
+#endif
+
+
+void Usage(char *name);
+void init_dialog(void);
+#ifdef HAVE_NCURSES
+void color_setup(void);
+#endif
+void attr_clear(WINDOW *win, int height, int width, chtype attr);
+void print_autowrap(WINDOW *win, char *prompt, int width, int y, int x);
+void print_button(WINDOW *win, char *label, int y, int x, int selected);
+void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border);
+#ifdef HAVE_NCURSES
+void draw_shadow(WINDOW *win, int y, int x, int height, int width);
+#endif
+
+#ifndef HAVE_STRCASECMP
+extern int strcasecmp();
+#endif
+
+int dialog_yesno(char *title, char *prompt, int height, int width);
+int dialog_msgbox(char *title, char *prompt, int height, int width, int pause);
+int dialog_textbox(char *title, char *file, int height, int width);
+int dialog_menu(char *title, char *prompt, int height, int width, int menu_height, int item_no, char **items);
+int dialog_checklist(char *title, char *prompt, int height, int width, int list_height, int item_no, char **items);
+int dialog_radiolist(char *title, char *prompt, int height, int width, int list_height, int item_no, char **items);
+int dialog_inputbox(char *title, char *prompt, int height, int width, char *init);
+int dialog_guage(char *title, char *prompt, int height, int width, int percent);
+
diff --git a/Build/source/utils/dialog/dialog.man b/Build/source/utils/dialog/dialog.man
new file mode 100644
index 00000000000..73931f1c4ca
--- /dev/null
+++ b/Build/source/utils/dialog/dialog.man
@@ -0,0 +1,217 @@
+.TH DIALOG 1 "10 January 1994"
+.SH NAME
+dialog \- display dialog boxes from shell scripts
+.SH SYNOPSIS
+.B dialog --clear
+.br
+.BI "dialog --create-rc " file
+.br
+.B dialog
+[
+.B \-\-title
+.I title
+]
+[
+.B \-\-clear
+]
+.B box-options
+.SH DESCRIPTION
+.B Dialog
+is a program that will let you to present a variety of questions or
+display messages using dialog boxes from a shell script. Currently,
+these types of dialog boxes are implemented:
+.LP
+.BR yes/no " box," " menu" " box," " input" " box,"
+.BR message " box," " text" " box," " info" " box, and"
+.BR checklist " box."
+.SH OPTIONS
+.TP
+.B \-\-clear
+The screen will be cleared to the
+.BR "screen attribute" " on exit."
+.TP
+.BI \-\-create-rc " file"
+.RB "Since " dialog " supports run-time configuration,"
+this can be used to dump a sample configuration file to the file specified
+by
+.IR file "."
+.TP
+.BI \-\-title " title"
+Specifies a
+.I title
+string to be displayed at the top of the dialog box.
+.TP
+.B Box Options
+.TP
+.BI \-\-yesno " text height width"
+.RB A " yes/no" " dialog box of size"
+.I height
+rows by
+.I width
+columns will be displayed. The string specified by
+.I text
+is displayed inside the dialog box. If this string is too long to be fitted
+in one line, it will be automatically divided into multiple lines at
+appropriate places. The
+.I text
+string may also contain the sub-string
+.I
+"\en"
+or newline characters
+.I `\en\'
+to control line breaking explicitly. This dialog box is useful for
+asking questions that require the user to answer either yes or no.
+.RB "The dialog box has a" " Yes" " button and a " No
+button, in which the user can switch between by pressing the
+.IR TAB " key."
+.TP
+.BI \-\-msgbox " text height width"
+.RB A " message" " box is very similar to a" " yes/no" " box."
+The only difference between a
+.B message
+box and a
+.B yes/no
+box is that a
+.B message
+box has only a single
+.B OK
+button. You can use this dialog box to display any message you like.
+After reading the message, the user can press the
+.I ENTER
+key so that
+.B dialog
+will exit and the calling shell script can continue its operation.
+.TP
+.BI \-\-infobox " text height width"
+.RB An " info" " box is basically a" " message" " box."
+However, in this case,
+.B dialog
+will exit immediately after displaying the message to the user. The
+screen is not cleared when
+.B dialog
+exits, so that the message will remain on the screen until the calling
+shell script clears it later. This is useful when you want to inform
+the user that some operations are carrying on that may require some
+time to finish.
+.TP
+.BI \-\-inputbox " text height width"
+.RB "An " input " box is useful when you want to ask questions that"
+require the user to input a string as the answer. When inputing the
+string, the
+.I BACKSPACE
+key can be used to correct typing errors. If the input string is longer than
+can be fitted in the dialog box, the input field will be scrolled. On exit,
+the input string will be printed on
+.IR stderr "."
+.TP
+.BI \-\-textbox " file height width"
+.RB A " text" " box lets you display the contents of a text file in a"
+dialog box. It is like a simple text file viewer. The user can move
+through the file by using the
+.IR UP/DOWN ", " PGUP/PGDN
+.RI and " HOME/END" " keys available on most keyboards."
+If the lines are too long to be displayed in the box, the
+.I LEFT/RIGHT
+keys can be used to scroll the text region horizontally. For more
+convenience, forward and backward searching functions are also provided.
+.IP "\fB\-\-menu \fItext height width menu-height \fR[ \fItag item \fR] \fI..."
+As its name suggests, a
+.B menu
+box is a dialog box that can be used to present a list of choices in
+the form of a menu for the user to choose. Each menu entry consists of a
+.IR tag " string and an " item " string. The"
+.I tag
+gives the entry a name to distinguish it from the other entries in the
+menu. The
+.I item
+is a short description of the option that the entry represents. The
+user can move between the menu entries by pressing the
+.I UP/DOWN
+keys, the first letter of the
+.I tag
+as a hot-key, or the number keys
+.IR 1-9 ". There are"
+.I menu-height
+entries displayed in the menu at one time, but the menu will be
+scrolled if there are more entries than that. When
+.B dialog
+exits, the
+.I tag
+of the chosen menu entry will be printed on
+.IR stderr "."
+.IP "\fB\-\-checklist \fItext height width list-height \fR[ \fItag item status \fR] \fI..."
+.RB "A " checklist " box is similar to a " menu " box in that there are"
+multiple entries presented in the form of a menu. Instead of choosing
+one entry among the entries, each entry can be turned on or off by the
+user. The initial on/off state of each entry is specified by
+.IR status "."
+On exit, a list of the
+.I tag
+strings of those entries that are turned on will be printed on
+.IR stderr "."
+.SH "RUN-TIME CONFIGURATION"
+.TP 4
+1.
+Create a sample configuration file by typing:
+.LP
+.in +1i
+"dialog --create-rc <file>"
+.TP 4
+2.
+At start,
+.B dialog
+determines the settings to use as follows:
+.RS
+.TP 4
+a)
+if environment variable
+.B DIALOGRC
+is set, it's value determines the name of the configuration file.
+.TP 4
+b)
+if the file in (a) can't be found, use the file
+.I $HOME/.dialogrc
+as the configuration file.
+.TP 4
+c)
+if the file in (b) can't be found, use compiled in defaults.
+.RE
+.TP 4
+3.
+Edit the sample configuration file and copy it to some place that
+.B dialog
+can find, as stated in step 2 above.
+.SH ENVIROMENT
+.TP 15
+.B DIALOGRC
+Define this variable if you want to specify the name of the configuration file
+to use.
+.SH FILES
+.TP 20
+.I $HOME/.dialogrc
+default configuration file
+.SH DIAGNOSTICS
+Exit status is 0 if
+.BR dialog " is exited by pressing the " Yes " or " OK
+button, and 1 if the
+.BR No " or " Cancel
+button is pressed. Otherwise, if errors occur inside
+.B dialog
+or
+.B dialog
+is exited by pressing the
+.I ESC
+key, the exit status is -1.
+.SH BUGS
+Text files containing
+.I tab
+characters may cause problems with
+.B text
+box.
+.I Tab
+characters in text files must first be expanded to spaces before being
+.RB "displayed by " text " box."
+.TP
+Screen update is too slow.
+.SH AUTHOR
+Savio Lam <lam836@cs.cuhk.hk>
diff --git a/Build/source/utils/dialog/dialogconfig.h.in b/Build/source/utils/dialog/dialogconfig.h.in
new file mode 100644
index 00000000000..2b439069cef
--- /dev/null
+++ b/Build/source/utils/dialog/dialogconfig.h.in
@@ -0,0 +1,8 @@
+/* Define if you have <ncurses/curses.h> */
+#undef HAVE_NCURSES_CURSES_H
+
+/* Define if you have <ncurses.h> */
+#undef HAVE_NCURSES_H
+
+/* Define if you have the strcasecmp function */
+#undef HAVE_STRCASECMP
diff --git a/Build/source/utils/dialog/gauge.c b/Build/source/utils/dialog/gauge.c
new file mode 100644
index 00000000000..ec357db2736
--- /dev/null
+++ b/Build/source/utils/dialog/gauge.c
@@ -0,0 +1,114 @@
+/*
+ * guage.c -- implements the guage dialog
+ *
+ * AUTHOR: Marc Ewing, Red Hat Software
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+#define BUFLEN 1024
+/*
+ * Display a guage, or progress meter. Starts at percent% and
+ * reads stdin. If stdin is not XXX, then it is interpreted as
+ * a percentage, and the display is updated accordingly. Otherwise
+ * the next line is the percentage, and subsequent lines up to
+ * another XXX are used for the new prompt. Note that the size
+ * of the window never changes, so the prompt can not get any
+ * larger than the height and width specified.
+ */
+int dialog_guage(char *title, char *prompt, int height, int width, int percent)
+{
+ int i, x, y;
+ char buf[BUFLEN];
+ char prompt_buf[BUFLEN];
+ WINDOW *dialog;
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ do {
+ werase(dialog);
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width-2, 1, 2);
+
+ draw_box(dialog, height - 4, 3, 3, width - 6, dialog_attr, border_attr);
+
+ wmove(dialog, height - 3, 4);
+ wattrset(dialog, title_attr);
+ for (i = 0; i < (width - 8); i++) {
+ waddch(dialog, ' ');
+ }
+
+ wattrset(dialog, title_attr);
+ wmove(dialog, height - 3, (width / 2) - 2);
+ sprintf(buf, "%3d%%", percent);
+ waddstr(dialog, buf);
+
+ x = (percent * (width - 8)) / 100;
+ wattrset(dialog, item_selected_attr);
+ wmove(dialog, height - 3, 4);
+ for (i = 0; i < x; i++) {
+ waddch(dialog, winch(dialog));
+ }
+
+ wrefresh(dialog);
+
+ if (feof(stdin)) {
+ break;
+ }
+
+ fgets(buf, BUFLEN, stdin);
+ if (buf[0] == 'X') {
+ /* Next line is percentage */
+ fgets(buf, BUFLEN, stdin);
+ percent = atoi(buf);
+
+ /* Rest is message text */
+ prompt_buf[0] = '\0';
+ while (strncmp(fgets(buf, BUFLEN, stdin), "XXX", 3)) {
+ strcat(prompt_buf, buf);
+ }
+ prompt = prompt_buf;
+ } else {
+ percent = atoi(buf);
+ }
+ } while (1);
+
+ delwin(dialog);
+ return(0);
+}
+/* End of dialog_msgbox() */
diff --git a/Build/source/utils/dialog/inputbox.c b/Build/source/utils/dialog/inputbox.c
new file mode 100644
index 00000000000..e6eb98e02ad
--- /dev/null
+++ b/Build/source/utils/dialog/inputbox.c
@@ -0,0 +1,230 @@
+/*
+ * inputbox.c -- implements the input box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+/*
+ * Display a dialog box for inputing a string
+ */
+int dialog_inputbox(char *title, char *prompt, int height, int width,
+ char *init)
+{
+ int i, x, y, box_y, box_x, box_width,
+ input_x = 0, scroll = 0, key = 0, button = -1;
+ unsigned char instr[MAX_LEN+1];
+ WINDOW *dialog;
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width, 1, 3);
+
+ /* Draw the input field box */
+ box_width = width-6;
+ getyx(dialog, y, x);
+ box_y = y + 2;
+ box_x = (width - box_width)/2;
+ draw_box(dialog, y+1, box_x-1, 3, box_width+2, border_attr, dialog_attr);
+
+ x = width/2-11;
+ y = height-2;
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+
+ /* Set up the initial value */
+ wmove(dialog, box_y, box_x);
+ wattrset(dialog, inputbox_attr);
+ if (!init) {
+ instr[0] = '\0';
+ } else {
+ strcpy((char*)instr, init);
+ }
+ input_x = strlen((char*)instr);
+ if (input_x >= box_width) {
+ scroll = input_x - box_width + 1;
+ input_x = box_width - 1;
+ for (i = 0; i < box_width-1; i++) {
+ waddch(dialog, instr[scroll+i]);
+ }
+ } else {
+ waddstr(dialog, (char*)instr);
+ }
+ wmove(dialog, box_y, box_x + input_x);
+
+ wrefresh(dialog);
+ while (key != ESC) {
+ key = wgetch(dialog);
+
+ if (button == -1) { /* Input box selected */
+ switch (key) {
+ case TAB:
+ case KEY_UP:
+ case KEY_DOWN:
+ break;
+ case KEY_LEFT:
+ continue;
+ case KEY_RIGHT:
+ continue;
+ case KEY_BACKSPACE:
+ if (input_x || scroll) {
+ wattrset(dialog, inputbox_attr);
+ if (!input_x) {
+ scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
+ wmove(dialog, box_y, box_x);
+ for (i = 0; i < box_width; i++)
+ waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' ');
+ input_x = strlen((char*)instr) - scroll;
+ }
+ else
+ input_x--;
+ instr[scroll+input_x] = '\0';
+ wmove(dialog, box_y, input_x + box_x);
+ waddch(dialog, ' ');
+ wmove(dialog, box_y, input_x + box_x);
+ wrefresh(dialog);
+ }
+ continue;
+ default:
+ if (key < 0x100 && isprint(key)) {
+ if (scroll+input_x < MAX_LEN) {
+ wattrset(dialog, inputbox_attr);
+ instr[scroll+input_x] = key;
+ instr[scroll+input_x+1] = '\0';
+ if (input_x == box_width-1) {
+ scroll++;
+ wmove(dialog, box_y, box_x);
+ for (i = 0; i < box_width-1; i++)
+ waddch(dialog, instr[scroll+i]);
+ }
+ else {
+ wmove(dialog, box_y, input_x++ + box_x);
+ waddch(dialog, key);
+ }
+ wrefresh(dialog);
+ } else
+ flash(); /* Alarm user about overflow */
+ continue;
+ }
+ }
+ }
+
+ switch (key) {
+ case 'O':
+ case 'o':
+ delwin(dialog);
+ fprintf(stderr, (char*)instr);
+ return 0;
+ case 'C':
+ case 'c':
+ delwin(dialog);
+ return 1;
+ case KEY_UP:
+ case KEY_LEFT:
+ switch (button) {
+ case -1:
+ button = 1; /* Indicates "Cancel" button is selected */
+ print_button(dialog, " OK ", y, x, FALSE);
+ print_button(dialog, "Cancel", y, x+14, TRUE);
+ wrefresh(dialog);
+ break;
+ case 0:
+ button = -1; /* Indicates input box is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wmove(dialog, box_y, box_x + input_x);
+ wrefresh(dialog);
+ break;
+ case 1:
+ button = 0; /* Indicates "OK" button is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wrefresh(dialog);
+ break;
+ }
+ break;
+ case TAB:
+ case KEY_DOWN:
+ case KEY_RIGHT:
+ switch (button) {
+ case -1:
+ button = 0; /* Indicates "OK" button is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wrefresh(dialog);
+ break;
+ case 0:
+ button = 1; /* Indicates "Cancel" button is selected */
+ print_button(dialog, " OK ", y, x, FALSE);
+ print_button(dialog, "Cancel", y, x+14, TRUE);
+ wrefresh(dialog);
+ break;
+ case 1:
+ button = -1; /* Indicates input box is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wmove(dialog, box_y, box_x + input_x);
+ wrefresh(dialog);
+ break;
+ }
+ break;
+ case ' ':
+ case '\n':
+ delwin(dialog);
+ fprintf(stderr, (char*)instr);
+ return (button == -1 ? 0 : button);
+ case ESC:
+ break;
+ }
+ }
+
+ delwin(dialog);
+ return -1; /* ESC pressed */
+}
+/* End of dialog_inputbox() */
diff --git a/Build/source/utils/dialog/menubox.c b/Build/source/utils/dialog/menubox.c
new file mode 100644
index 00000000000..06d7d9f767d
--- /dev/null
+++ b/Build/source/utils/dialog/menubox.c
@@ -0,0 +1,316 @@
+/*
+ * menubox.c -- implements the menu box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+static void print_item(WINDOW *win, char *tag, char *item, int choice, int selected);
+
+
+static int menu_width, tag_x, item_x;
+
+
+/*
+ * Display a menu for choosing among a number of options
+ */
+int dialog_menu(char *title, char *prompt, int height, int width, int menu_height, int item_no, char **items)
+{
+ int i, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
+ scrolli = 0, max_choice;
+ WINDOW *dialog, *menu;
+
+ max_choice = MIN(menu_height, item_no);
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width, 1, 3);
+
+ menu_width = width-6;
+ getyx(dialog, cur_y, cur_x);
+ box_y = cur_y + 1;
+ box_x = (width - menu_width)/2 - 1;
+
+ /* create new window for the menu */
+ menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1);
+ keypad(menu, TRUE);
+
+ /* draw a box around the menu items */
+ draw_box(dialog, box_y, box_x, menu_height+2, menu_width+2, menubox_border_attr, menubox_attr);
+
+ tag_x = 0;
+ item_x = 0;
+ /* Find length of longest item in order to center menu */
+ for (i = 0; i < item_no; i++) {
+ tag_x = MAX(tag_x, strlen(items[i*2]) + strlen(items[i*2 + 1]) + 2);
+ item_x = MAX(item_x, strlen(items[i*2]));
+ }
+ tag_x = (menu_width - tag_x) / 2;
+ item_x = tag_x + item_x + 2;
+
+ /* Print the menu */
+ for (i = 0; i < max_choice; i++)
+ print_item(menu, items[i*2], items[i*2 + 1], i, i == choice);
+ wnoutrefresh(menu);
+
+ if (menu_height < item_no) {
+ wattrset(dialog, darrow_attr);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 1);
+ waddch(dialog, ACS_DARROW);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 2);
+ waddstr(dialog,"(+)");
+ }
+
+ x = width/2-11;
+ y = height-2;
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wrefresh(dialog);
+
+ while (key != ESC) {
+ key = wgetch(dialog);
+ /* Check if key pressed matches first character of any item tag in menu */
+ for (i = 0; i < max_choice; i++)
+ if (toupper(key) == toupper(items[(scrolli+i)*2][0]))
+ break;
+/* i = (choice+scrolli+1) % max_choice ;
+ while (i != choice+scrolli) {
+ if (toupper(key) == toupper(items[i*2][0]))
+ break;
+ i = (i + 1) % max_choice;
+ }
+ */
+
+ if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) ||
+ key == KEY_UP || key == KEY_DOWN || key == '-' || key == '+') {
+ if (key >= '1' && key <= MIN('9', '0'+max_choice))
+ i = key - '1';
+ else if (key == KEY_UP || key == '-') {
+ if (!choice) {
+ if (scrolli) {
+#ifdef BROKEN_WSCRL
+ /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation
+ violation when scrolling windows of height = 4, so scrolling is not
+ used for now */
+ scrolli--;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ /* Reprint menu to scroll down */
+ for (i = 0; i < max_choice; i++)
+ print_item(menu, items[(scrolli+i)*2], items[(scrolli+i)*2 + 1], i, i == choice);
+
+#else
+
+ /* Scroll menu down */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (menu_height > 1) {
+ /* De-highlight current first item before scrolling down */
+ print_item(menu, items[scrolli*2], items[scrolli*2 + 1], 0, FALSE);
+ scrollok(menu, TRUE);
+ wscrl(menu, -1);
+ scrollok(menu, FALSE);
+ }
+ scrolli--;
+ print_item(menu, items[scrolli*2], items[scrolli*2 + 1], 0, TRUE);
+#endif
+ wnoutrefresh(menu);
+
+ /* print the up/down arrows */
+ wmove(dialog, box_y, box_x + tag_x + 1);
+ wattrset(dialog, scrolli ? uarrow_attr : menubox_attr);
+ waddch(dialog, scrolli ? ACS_UARROW : ACS_HLINE);
+ wmove(dialog, box_y, box_x + tag_x + 2);
+ waddch(dialog, scrolli ? '(' : ACS_HLINE);
+ wmove(dialog, box_y, box_x + tag_x + 3);
+ waddch(dialog, scrolli ? '-' : ACS_HLINE);
+ wmove(dialog, box_y, box_x + tag_x + 4);
+ waddch(dialog, scrolli ? ')' : ACS_HLINE);
+ wattrset(dialog, darrow_attr);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 1);
+ waddch(dialog, ACS_DARROW);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 2);
+ waddstr(dialog,"(+)");
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice - 1;
+ }
+ else if (key == KEY_DOWN || key == '+')
+ if (choice == max_choice - 1) {
+ if (scrolli+choice < item_no-1) {
+#ifdef BROKEN_WSCRL
+ /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation
+ violation when scrolling windows of height = 4, so scrolling is not
+ used for now */
+ scrolli++;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ /* Reprint menu to scroll up */
+ for (i = 0; i < max_choice; i++)
+ print_item(menu, items[(scrolli+i)*2], items[(scrolli+i)*2 + 1], i, i == choice);
+
+#else
+
+ /* Scroll menu up */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (menu_height > 1) {
+ /* De-highlight current last item before scrolling up */
+ print_item(menu, items[(scrolli+max_choice-1)*2], items[(scrolli+max_choice-1)*2 + 1], max_choice-1, FALSE);
+ scrollok(menu, TRUE);
+ scroll(menu);
+ scrollok(menu, FALSE);
+ }
+ scrolli++;
+ print_item(menu, items[(scrolli+max_choice-1)*2], items[(scrolli+max_choice-1)*2 + 1], max_choice-1, TRUE);
+#endif
+ wnoutrefresh(menu);
+
+ /* print the up/down arrows */
+ wattrset(dialog, uarrow_attr);
+ wmove(dialog, box_y, box_x + tag_x + 1);
+ waddch(dialog, ACS_UARROW);
+ wmove(dialog, box_y, box_x + tag_x + 2);
+ waddstr(dialog,"(-)");
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 1);
+ wattrset(dialog, scrolli+choice < item_no-1 ? darrow_attr : menubox_border_attr);
+ waddch(dialog, scrolli+choice < item_no-1 ? ACS_DARROW : ACS_HLINE);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 2);
+ waddch(dialog, scrolli+choice < item_no-1 ? '(' : ACS_HLINE);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 3);
+ waddch(dialog, scrolli+choice < item_no-1 ? '+' : ACS_HLINE);
+ wmove(dialog, box_y + menu_height + 1, box_x + tag_x + 4);
+ waddch(dialog, scrolli+choice < item_no-1 ? ')' : ACS_HLINE);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice + 1;
+
+ if (i != choice) {
+ /* De-highlight current item */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ print_item(menu, items[(scrolli+choice)*2], items[(scrolli+choice)*2 + 1], choice, FALSE);
+
+ /* Highlight new item */
+ choice = i;
+ print_item(menu, items[(scrolli+choice)*2], items[(scrolli+choice)*2 + 1], choice, TRUE);
+ wnoutrefresh(menu);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+
+ switch (key) {
+ case 'O':
+ case 'o':
+ delwin(dialog);
+ fprintf(stderr, items[(scrolli+choice)*2]);
+ return 0;
+ case 'C':
+ case 'c':
+ delwin(dialog);
+ return 1;
+ case TAB:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ if (!button) {
+ button = 1; /* Indicates "Cancel" button is selected */
+ print_button(dialog, " OK ", y, x, FALSE);
+ print_button(dialog, "Cancel", y, x+14, TRUE);
+ }
+ else {
+ button = 0; /* Indicates "OK" button is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ }
+ wrefresh(dialog);
+ break;
+ case ' ':
+ case '\n':
+ delwin(dialog);
+ if (!button)
+ fprintf(stderr, items[(scrolli+choice)*2]);
+ return button;
+ case ESC:
+ break;
+ }
+ }
+
+ delwin(dialog);
+ return -1; /* ESC pressed */
+}
+/* End of dialog_menu() */
+
+
+/*
+ * Print menu item
+ */
+static void print_item(WINDOW *win, char *tag, char *item, int choice, int selected)
+{
+ int i;
+
+ /* Clear 'residue' of last item */
+ wattrset(win, menubox_attr);
+ wmove(win, choice, 0);
+ for (i = 0; i < menu_width; i++)
+ waddch(win, ' ');
+ wmove(win, choice, tag_x);
+ wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
+ waddch(win, tag[0]);
+ wattrset(win, selected ? tag_selected_attr : tag_attr);
+ waddstr(win, tag + 1);
+ wmove(win, choice, item_x);
+ wattrset(win, selected ? item_selected_attr : item_attr);
+ waddstr(win, item);
+}
+/* End of print_item() */
diff --git a/Build/source/utils/dialog/mkinstalldirs b/Build/source/utils/dialog/mkinstalldirs
new file mode 100755
index 00000000000..a01481be436
--- /dev/null
+++ b/Build/source/utils/dialog/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.10 1996/05/03 07:37:52 friedman Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/Build/source/utils/dialog/msgbox.c b/Build/source/utils/dialog/msgbox.c
new file mode 100644
index 00000000000..3a908654bb4
--- /dev/null
+++ b/Build/source/utils/dialog/msgbox.c
@@ -0,0 +1,81 @@
+/*
+ * msgbox.c -- implements the message box and info box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+/*
+ * Display a message box. Program will pause and display an "OK" button
+ * if the parameter 'pause' is non-zero.
+ */
+int dialog_msgbox(char *title, char *prompt, int height, int width, int pause)
+{
+ int i, x, y, key = 0;
+ WINDOW *dialog;
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width-2, 1, 2);
+
+ if (pause) {
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+ print_button(dialog, " OK ", height-2, width/2-4, TRUE);
+ wrefresh(dialog);
+ while (key != ESC && key != '\n' && key != ' ')
+ key = wgetch(dialog);
+ }
+ else {
+ key = '\n';
+ wrefresh(dialog);
+ }
+
+ delwin(dialog);
+ return (key == ESC ? -1 : 0);
+}
+/* End of dialog_msgbox() */
diff --git a/Build/source/utils/dialog/radiolist.c b/Build/source/utils/dialog/radiolist.c
new file mode 100644
index 00000000000..5ca62b7b20f
--- /dev/null
+++ b/Build/source/utils/dialog/radiolist.c
@@ -0,0 +1,352 @@
+/*
+ * radiolist.c -- implements the radiolist box
+ *
+ * AUTHOR: Stuart Herbert - S.Herbert@sheffield.ac.uk
+ * (from checklist.c by Savio Lam (lam836@cs.cuhk.hk))
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected);
+
+
+static int list_width, check_x, item_x;
+
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ */
+int dialog_radiolist(char *title, char *prompt, int height, int width, int list_height, int item_no, char **items)
+{
+ int i, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
+ scrolli = 0, max_choice, *status;
+ WINDOW *dialog, *list;
+
+ /* Allocate space for storing item on/off status */
+ if ((status = malloc(sizeof(int)*item_no)) == NULL) {
+ endwin();
+ fprintf(stderr, "\nCan't allocate memory in dialog_radiolist().\n");
+ exit(-1);
+ }
+ /* Initializes status */
+ for (i = 0; i < item_no; i++)
+ status[i] = !strcasecmp(items[i*3 + 2], "on");
+
+ max_choice = MIN(list_height, item_no);
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width-2, 1, 3);
+
+ list_width = width-6;
+ getyx(dialog, cur_y, cur_x);
+ box_y = cur_y + 1;
+ box_x = (width - list_width)/2 - 1;
+
+ /* create new window for the list */
+ list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1);
+ keypad(list, TRUE);
+
+ /* draw a box around the list items */
+ draw_box(dialog, box_y, box_x, list_height+2, list_width+2, menubox_border_attr, menubox_attr);
+
+ check_x = 0;
+ item_x = 0;
+ /* Find length of longest item in order to center radiolist */
+ for (i = 0; i < item_no; i++) {
+ check_x = MAX(check_x, strlen(items[i*3]) + strlen(items[i*3 + 1]) + 6);
+ item_x = MAX(item_x, strlen(items[i*3]));
+ }
+ check_x = (list_width - check_x) / 2;
+ item_x = check_x + item_x + 6;
+
+ /* Print the list */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[i*3], items[i*3 + 1], status[i], i, i == choice);
+ wnoutrefresh(list);
+
+ if (list_height < item_no) {
+ wattrset(dialog, darrow_attr);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 5);
+ waddch(dialog, ACS_DARROW);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 6);
+ waddstr(dialog, "(+)");
+ }
+
+ x = width/2-11;
+ y = height-2;
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ wrefresh(dialog);
+
+ while (key != ESC) {
+ key = wgetch(dialog);
+ /* Check if key pressed matches first character of any item tag in list */
+ for (i = 0; i < max_choice; i++)
+ if (toupper(key) == toupper(items[(scrolli+i)*3][0]))
+ break;
+
+ if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) ||
+ key == KEY_UP || key == KEY_DOWN || key == ' ' ||
+ key == '+' || key == '-' ) {
+ if (key >= '1' && key <= MIN('9', '0'+max_choice))
+ i = key - '1';
+ else if (key == KEY_UP || key == '-') {
+ if (!choice) {
+ if (scrolli) {
+#ifdef BROKEN_WSCRL
+ /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation
+ violation when scrolling windows of height = 4, so scrolling is not
+ used for now */
+ scrolli--;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ /* Reprint list to scroll down */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scrolli+i)*3], items[(scrolli+i)*3 + 1], status[scrolli+i], i, i == choice);
+
+#else
+
+ /* Scroll list down */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current first item before scrolling down */
+ print_item(list, items[scrolli*3], items[scrolli*3 + 1], status[scrolli], 0, FALSE);
+ scrollok(list, TRUE);
+ wscrl(list, -1);
+ scrollok(list, FALSE);
+ }
+ scrolli--;
+ print_item(list, items[scrolli*3], items[scrolli*3 + 1], status[scrolli], 0, TRUE);
+#endif
+ wnoutrefresh(list);
+
+ /* print the up/down arrows */
+ wmove(dialog, box_y, box_x + check_x + 5);
+ wattrset(dialog, scrolli ? uarrow_attr : menubox_attr);
+ waddch(dialog, scrolli ? ACS_UARROW : ACS_HLINE);
+ wmove(dialog, box_y, box_x + check_x + 6);
+ waddch(dialog, scrolli ? '(' : ACS_HLINE);
+ wmove(dialog, box_y, box_x + check_x + 7);
+ waddch(dialog, scrolli ? '-' : ACS_HLINE);
+ wmove(dialog, box_y, box_x + check_x + 8);
+ waddch(dialog, scrolli ? ')' : ACS_HLINE);
+ wattrset(dialog, darrow_attr);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 5);
+ waddch(dialog, ACS_DARROW);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 6);
+ waddch(dialog, '(');
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 7);
+ waddch(dialog, '+');
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 8);
+ waddch(dialog, ')');
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice - 1;
+ }
+ else if (key == KEY_DOWN || key == '+') {
+ if (choice == max_choice - 1) {
+ if (scrolli+choice < item_no-1) {
+#ifdef BROKEN_WSCRL
+ /* wscrl() in ncurses 1.8.1 seems to be broken, causing a segmentation
+ violation when scrolling windows of height = 4, so scrolling is not
+ used for now */
+ scrolli++;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ /* Reprint list to scroll up */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scrolli+i)*3], items[(scrolli+i)*3 + 1], status[scrolli+i], i, i == choice);
+
+#else
+
+ /* Scroll list up */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current last item before scrolling up */
+ print_item(list, items[(scrolli+max_choice-1)*3], items[(scrolli+max_choice-1)*3 + 1], status[scrolli+max_choice-1], max_choice-1, FALSE);
+ scrollok(list, TRUE);
+ scroll(list);
+ scrollok(list, FALSE);
+ }
+ scrolli++;
+ print_item(list, items[(scrolli+max_choice-1)*3], items[(scrolli+max_choice-1)*3 + 1], status[scrolli+max_choice-1], max_choice-1, TRUE);
+#endif
+ wnoutrefresh(list);
+
+ /* print the up/down arrows */
+ wattrset(dialog, uarrow_attr);
+ wmove(dialog, box_y, box_x + check_x + 5);
+ waddch(dialog, ACS_UARROW);
+ wmove(dialog, box_y, box_x + check_x + 6);
+ waddstr(dialog, "(-)");
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 5);
+ wattrset(dialog, scrolli+choice < item_no-1 ? darrow_attr : menubox_border_attr);
+ waddch(dialog, scrolli+choice < item_no-1 ? ACS_DARROW : ACS_HLINE);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 6);
+ waddch(dialog, scrolli+choice < item_no-1 ? '(' : ACS_HLINE);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 7);
+ waddch(dialog, scrolli+choice < item_no-1 ? '+' : ACS_HLINE);
+ wmove(dialog, box_y + list_height + 1, box_x + check_x + 8);
+ waddch(dialog, scrolli+choice < item_no-1 ? ')' : ACS_HLINE);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice + 1;
+ }
+ else if (key == ' ') { /* Toggle item status */
+ if (!status[scrolli+choice])
+ {
+ for (i=0; i<item_no; i++)
+ status[i]=0;
+ status[scrolli+choice]=1;
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scrolli+i)*3], items[(scrolli+i)*3 + 1], status[scrolli+i], i, i == choice);
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+
+ if (i != choice) {
+ /* De-highlight current item */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ print_item(list, items[(scrolli+choice)*3], items[(scrolli+choice)*3 +1], status[scrolli+choice], choice, FALSE);
+ /* Highlight new item */
+ choice = i;
+ print_item(list, items[(scrolli+choice)*3], items[(scrolli+choice)*3 + 1], status[scrolli+choice], choice, TRUE);
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+
+ switch (key) {
+ case 'O':
+ case 'o':
+ delwin(dialog);
+ for (i = 0; i < item_no; i++)
+ if (status[i])
+ fprintf(stderr, "%s", items[i*3]);
+ free(status);
+ return 0;
+ case 'C':
+ case 'c':
+ delwin(dialog);
+ free(status);
+ return 1;
+ case TAB:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ if (!button) {
+ button = 1; /* Indicates "Cancel" button is selected */
+ print_button(dialog, " OK ", y, x, FALSE);
+ print_button(dialog, "Cancel", y, x+14, TRUE);
+ }
+ else {
+ button = 0; /* Indicates "OK" button is selected */
+ print_button(dialog, "Cancel", y, x+14, FALSE);
+ print_button(dialog, " OK ", y, x, TRUE);
+ }
+ wrefresh(dialog);
+ break;
+ case ' ':
+ case '\n':
+ delwin(dialog);
+ if (!button)
+ for (i = 0; i < item_no; i++)
+ if (status[i])
+ fprintf(stderr, items[i*3]);
+ free(status);
+ return button;
+ case ESC:
+ break;
+ }
+ }
+
+ delwin(dialog);
+ free(status);
+ return -1; /* ESC pressed */
+}
+/* End of dialog_radiolist() */
+
+
+/*
+ * Print list item
+ */
+static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected)
+{
+ int i;
+
+ /* Clear 'residue' of last item */
+ wattrset(win, menubox_attr);
+ wmove(win, choice, 0);
+ for (i = 0; i < list_width; i++)
+ waddch(win, ' ');
+ wmove(win, choice, check_x);
+ wattrset(win, selected ? check_selected_attr : check_attr);
+ wprintw(win, "(%c)", status ? '*' : ' ');
+ wattrset(win, menubox_attr);
+ waddch(win, ' ');
+ wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
+ waddch(win, tag[0]);
+ wattrset(win, selected ? tag_selected_attr : tag_attr);
+ waddstr(win, tag + 1);
+ wmove(win, choice, item_x);
+ wattrset(win, selected ? item_selected_attr : item_attr);
+ waddstr(win, item);
+}
+/* End of print_item() */
diff --git a/Build/source/utils/dialog/rc.c b/Build/source/utils/dialog/rc.c
new file mode 100644
index 00000000000..6b956a66255
--- /dev/null
+++ b/Build/source/utils/dialog/rc.c
@@ -0,0 +1,377 @@
+/*
+ * rc.c -- routines for processing the configuration file
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef HAVE_NCURSES
+
+#include "dialog.h"
+#include "colors.h"
+#include "rc.h"
+
+
+static char *attr_to_str(int fg, int bg, int hl);
+static int str_to_attr(char *str, int *fg, int *bg, int *hl);
+static int parse_line(char *line, char **var, char **value);
+
+
+/*
+ * Create the configuration file
+ */
+void create_rc(char *filename)
+{
+ int i;
+ FILE *rc_file;
+
+ if ((rc_file = fopen(filename, "wt")) == NULL) {
+ fprintf(stderr, "\nError opening file for writing in create_rc().\n");
+ exit(-1);
+ }
+
+ fprintf(rc_file, "#\
+\n# Run-time configuration file for dialog\
+\n#\
+\n# Automatically generated by \"dialog --create-rc <file>\"\
+\n#\
+\n#\
+\n# Types of values:\
+\n#\
+\n# Number - <number>\
+\n# String - \"string\"\
+\n# Boolean - <ON|OFF>\
+\n# Attribute - (foreground,background,highlight?)\
+\n#\n\n");
+
+ /* Print an entry for each configuration variable */
+ for (i = 0; i < VAR_COUNT; i++) {
+ fprintf(rc_file, "\n# %s\n", vars[i].comment); /* print comment */
+ switch (vars[i].type) {
+ case VAL_INT:
+ fprintf(rc_file, "%s = %d\n", vars[i].name, *((int *) vars[i].var));
+ break;
+ case VAL_STR:
+ fprintf(rc_file, "%s = \"%s\"\n", vars[i].name, (char *) vars[i].var);
+ break;
+ case VAL_BOOL:
+ fprintf(rc_file, "%s = %s\n", vars[i].name, *((bool *) vars[i].var) ? "ON" : "OFF");
+ break;
+ case VAL_ATTR:
+ fprintf(rc_file, "%s = %s\n", vars[i].name, attr_to_str(((int *) vars[i].var)[0], ((int *) vars[i].var)[1], ((int *) vars[i].var)[2]));
+ break;
+ }
+ }
+
+ fclose(rc_file);
+}
+/* End of create_rc() */
+
+
+/*
+ * Parse the configuration file and set up variables
+ */
+int parse_rc(void)
+{
+ int i, l = 1, parse, fg, bg, hl;
+ char str[MAX_LEN+1], *var, *value, *tempptr;
+ FILE *rc_file;
+
+ /*
+ *
+ * At start, 'dialog' determines the settings to use as follows:
+ *
+ * a) if environment variable DIALOGRC is set, it's value determines the
+ * name of the configuration file.
+ *
+ * b) if the file in (a) can't be found, use the file $HOME/.dialogrc
+ * as the configuration file.
+ *
+ * c) if the file in (b) can't be found, use compiled in defaults.
+ *
+ */
+
+ if ((tempptr = getenv("DIALOGRC")) != NULL)
+ rc_file = fopen(tempptr, "rt");
+
+ if (tempptr == NULL || rc_file == NULL) { /* step (a) failed? */
+ /* try step (b) */
+ if ((tempptr = getenv("HOME")) == NULL)
+ return 0; /* step (b) failed, use default values */
+
+ if (tempptr[0] == '\0' || lastch(tempptr) == '/')
+ sprintf(str, "%s%s", tempptr, DIALOGRC);
+ else
+ sprintf(str, "%s/%s", tempptr, DIALOGRC);
+
+ if ((rc_file = fopen(str, "rt")) == NULL)
+ return 0; /* step (b) failed, use default values */
+ }
+
+ /* Scan each line and set variables */
+ while (fgets(str, MAX_LEN, rc_file) != NULL) {
+ if (lastch(str) != '\n') { /* ignore rest of file if line too long */
+ fprintf(stderr, "\nParse error: line %d of configuration file too long.\n", l);
+ fclose(rc_file);
+ return -1; /* parse aborted */
+ }
+ else {
+ lastch(str) = '\0';
+ parse = parse_line(str, &var, &value); /* parse current line */
+
+ switch (parse) {
+ case LINE_BLANK: /* ignore blank lines and comments */
+ case LINE_COMMENT:
+ break;
+ case LINE_OK:
+ /* search table for matching config variable name */
+ for (i = 0; i < VAR_COUNT && strcmp(vars[i].name, var); i++);
+
+ if (i == VAR_COUNT) { /* no match */
+ fprintf(stderr, "\nParse error: unknown variable at line %d of configuration file.\n", l);
+ return -1; /* parse aborted */
+ }
+ else { /* variable found in table, set run time variables */
+ switch (vars[i].type) {
+ case VAL_INT:
+ *((int *) vars[i].var) = atoi(value);
+ break;
+ case VAL_STR:
+ if (!isquote(value[0]) || !isquote(lastch(value)) || strlen(value) < 2) {
+ fprintf(stderr, "\nParse error: string value expected at line %d of configuration file.\n", l);
+ return -1; /* parse aborted */
+ }
+ else {
+ /* remove the (") quotes */
+ value++;
+ lastch(value) = '\0';
+ strcpy((char *) vars[i].var, value);
+ }
+ break;
+ case VAL_BOOL:
+ if (!strcasecmp(value, "ON"))
+ *((bool *) vars[i].var) = TRUE;
+ else if (!strcasecmp(value, "OFF"))
+ *((bool *) vars[i].var) = FALSE;
+ else {
+ fprintf(stderr, "\nParse error: boolean value expected at line %d of configuration file.\n", l);
+ return -1; /* parse aborted */
+ }
+ break;
+ case VAL_ATTR:
+ if (str_to_attr(value, &fg, &bg, &hl) == -1) {
+ fprintf(stderr, "\nParse error: attribute value expected at line %d of configuration file.\n", l);
+ return -1; /* parse aborted */
+ }
+ ((int *) vars[i].var)[0] = fg;
+ ((int *) vars[i].var)[1] = bg;
+ ((int *) vars[i].var)[2] = hl;
+ break;
+ }
+ }
+ break;
+ case LINE_ERROR:
+ fprintf(stderr, "\nParse error: syntax error at line %d of configuration file.\n", l);
+ return -1; /* parse aborted */
+ }
+ }
+
+ l++; /* next line */
+ }
+
+ fclose(rc_file);
+ return 0; /* parse successful */
+}
+/* End of parse_rc() */
+
+
+/*
+ * Convert an attribute to a string representation like this:
+ *
+ * "(foreground,background,highlight)"
+ */
+static char *attr_to_str(int fg, int bg, int hl)
+{
+ int i;
+ static char str[MAX_LEN+1];
+
+ strcpy(str, "(");
+ /* foreground */
+ for (i = 0; fg != color_names[i].value; i++);
+ strcat(str, color_names[i].name);
+ strcat(str, ",");
+
+ /* background */
+ for (i = 0; bg != color_names[i].value; i++);
+ strcat(str, color_names[i].name);
+
+ /* highlight */
+ strcat(str, hl ? ",ON)" : ",OFF)");
+
+ return str;
+}
+/* End of attr_to_str() */
+
+
+/*
+ * Extract the foreground, background and highlight values from an attribute
+ * represented as a string in this form:
+ *
+ * "(foreground,background,highlight)"
+ */
+static int str_to_attr(char *str, int *fg, int *bg, int *hl)
+{
+ int i = 0, j, get_fg = 1;
+ char tempstr[MAX_LEN+1], *part;
+
+ if (str[0] != '(' || lastch(str) != ')')
+ return -1; /* invalid representation */
+
+ /* remove the parenthesis */
+ strcpy(tempstr, str + 1);
+ lastch(tempstr) = '\0';
+
+
+ /* get foreground and background */
+
+ while (1) {
+ /* skip white space before fg/bg string */
+ while (whitespace(tempstr[i]) && tempstr[i] != '\0') i++;
+ if (tempstr[i] == '\0')
+ return -1; /* invalid representation */
+ part = tempstr + i; /* set 'part' to start of fg/bg string */
+
+ /* find end of fg/bg string */
+ while(!whitespace(tempstr[i]) && tempstr[i] != ',' && tempstr[i] != '\0') i++;
+
+ if (tempstr[i] == '\0')
+ return -1; /* invalid representation */
+ else if (whitespace(tempstr[i])) { /* not yet ',' */
+ tempstr[i++] = '\0';
+
+ /* skip white space before ',' */
+ while(whitespace(tempstr[i]) && tempstr[i] != '\0') i++;
+
+ if (tempstr[i] != ',')
+ return -1; /* invalid representation */
+ }
+
+ tempstr[i++] = '\0'; /* skip the ',' */
+ for (j = 0; j < COLOR_COUNT && strcasecmp(part, color_names[j].name); j++);
+ if (j == COLOR_COUNT) /* invalid color name */
+ return -1;
+ if (get_fg) {
+ *fg = color_names[j].value;
+ get_fg = 0; /* next we have to get the background */
+ }
+ else {
+ *bg = color_names[j].value;
+ break;
+ }
+ } /* got foreground and background */
+
+
+ /* get highlight */
+
+ /* skip white space before highlight string */
+ while (whitespace(tempstr[i]) && tempstr[i] != '\0') i++;
+ if (tempstr[i] == '\0')
+ return -1; /* invalid representation */
+ part = tempstr + i; /* set 'part' to start of highlight string */
+
+ /* trim trailing white space from highlight string */
+ i = strlen(part) - 1;
+ while(whitespace(part[i])) i--;
+ part[i+1] = '\0';
+
+ if (!strcasecmp(part, "ON"))
+ *hl = TRUE;
+ else if (!strcasecmp(part, "OFF"))
+ *hl = FALSE;
+ else
+ return -1; /* invalid highlight value */
+
+ return 0;
+}
+/* End of str_to_attr() */
+
+
+/*
+ * Parse a line in the configuration file
+ *
+ * Each line is of the form: "variable = value". On exit, 'var' will contain
+ * the variable name, and 'value' will contain the value string.
+ *
+ * Return values:
+ *
+ * LINE_BLANK - line is blank
+ * LINE_COMMENT - line is comment
+ * LINE_OK - line is ok
+ * LINE_ERROR - syntax error in line
+ */
+static int parse_line(char *line, char **var, char **value)
+{
+ int i = 0;
+
+ /* ignore white space at beginning of line */
+ while(whitespace(line[i]) && line[i] != '\0') i++;
+
+ if (line[i] == '\0') /* line is blank */
+ return LINE_BLANK;
+ else if (line[i] == '#') /* line is comment */
+ return LINE_COMMENT;
+ else if (line[i] == '=') /* variables names can't strart with a '=' */
+ return LINE_ERROR;
+
+ /* set 'var' to variable name */
+ *var = line + i++; /* skip to next character */
+
+ /* find end of variable name */
+ while(!whitespace(line[i]) && line[i] != '=' && line[i] != '\0') i++;
+
+ if (line[i] == '\0') /* syntax error */
+ return LINE_ERROR;
+ else if (line[i] == '=')
+ line[i++] = '\0';
+ else {
+ line[i++] = '\0';
+
+ /* skip white space before '=' */
+ while(whitespace(line[i]) && line[i] != '\0') i++;
+
+ if (line[i] != '=') /* syntax error */
+ return LINE_ERROR;
+ else
+ i++; /* skip the '=' */
+ }
+
+ /* skip white space after '=' */
+ while(whitespace(line[i]) && line[i] != '\0') i++;
+
+ if (line[i] == '\0')
+ return LINE_ERROR;
+ else
+ *value = line + i; /* set 'value' to value string */
+
+ /* trim trailing white space from 'value' */
+ i = strlen(*value) - 1;
+ while(whitespace((*value)[i])) i--;
+ (*value)[i+1] = '\0';
+
+ return LINE_OK; /* no syntax error in line */
+}
+/* End of parse_line() */
+#endif
diff --git a/Build/source/utils/dialog/rc.h b/Build/source/utils/dialog/rc.h
new file mode 100644
index 00000000000..7be701b66e4
--- /dev/null
+++ b/Build/source/utils/dialog/rc.h
@@ -0,0 +1,223 @@
+/*
+ * rc.h -- declarations for configuration file processing
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#define DIALOGRC ".dialogrc"
+#define VAR_LEN 30
+#define COMMENT_LEN 70
+
+/* Types of values */
+#define VAL_INT 0
+#define VAL_STR 1
+#define VAL_BOOL 2
+#define VAL_ATTR 3
+
+/* Type of line in configuration file */
+#define LINE_BLANK 2
+#define LINE_COMMENT 1
+#define LINE_OK 0
+#define LINE_ERROR -1
+
+/* number of configuration variables */
+#define VAR_COUNT (sizeof(vars) / sizeof(vars_st))
+
+/* check if character is white space */
+#define whitespace(c) (c == ' ' || c == '\t')
+
+/* check if character is string quoting characters */
+#define isquote(c) (c == '"' || c == '\'')
+
+/* get last character of string */
+#define lastch(str) str[strlen(str)-1]
+
+/*
+ * Configuration variables
+ */
+typedef struct {
+ char name[VAR_LEN]; /* name of configuration variable as in DIALOGRC */
+ void *var; /* address of actually variable to change */
+ int type; /* type of value */
+ char comment[COMMENT_LEN]; /* comment to put in "rc" file */
+} vars_st;
+
+vars_st vars[] = {
+ { "use_shadow",
+ &use_shadow,
+ VAL_BOOL,
+ "Shadow dialog boxes? This also turns on color." },
+
+ { "use_colors",
+ &use_colors,
+ VAL_BOOL,
+ "Turn color support ON or OFF" },
+
+ { "screen_color",
+ color_table[0],
+ VAL_ATTR,
+ "Screen color" },
+
+ { "shadow_color",
+ color_table[1],
+ VAL_ATTR,
+ "Shadow color" },
+
+ { "dialog_color",
+ color_table[2],
+ VAL_ATTR,
+ "Dialog box color" },
+
+ { "title_color",
+ color_table[3],
+ VAL_ATTR,
+ "Dialog box title color" },
+
+ { "border_color",
+ color_table[4],
+ VAL_ATTR,
+ "Dialog box border color" },
+
+ { "button_active_color",
+ color_table[5],
+ VAL_ATTR,
+ "Active button color" },
+
+ { "button_inactive_color",
+ color_table[6],
+ VAL_ATTR,
+ "Inactive button color" },
+
+ { "button_key_active_color",
+ color_table[7],
+ VAL_ATTR,
+ "Active button key color" },
+
+ { "button_key_inactive_color",
+ color_table[8],
+ VAL_ATTR,
+ "Inactive button key color" },
+
+ { "button_label_active_color",
+ color_table[9],
+ VAL_ATTR,
+ "Active button label color" },
+
+ { "button_label_inactive_color",
+ color_table[10],
+ VAL_ATTR,
+ "Inactive button label color" },
+
+ { "inputbox_color",
+ color_table[11],
+ VAL_ATTR,
+ "Input box color" },
+
+ { "inputbox_border_color",
+ color_table[12],
+ VAL_ATTR,
+ "Input box border color" },
+
+ { "searchbox_color",
+ color_table[13],
+ VAL_ATTR,
+ "Search box color" },
+
+ { "searchbox_title_color",
+ color_table[14],
+ VAL_ATTR,
+ "Search box title color" },
+
+ { "searchbox_border_color",
+ color_table[15],
+ VAL_ATTR,
+ "Search box border color" },
+
+ { "position_indicator_color",
+ color_table[16],
+ VAL_ATTR,
+ "File position indicator color" },
+
+ { "menubox_color",
+ color_table[17],
+ VAL_ATTR,
+ "Menu box color" },
+
+ { "menubox_border_color",
+ color_table[18],
+ VAL_ATTR,
+ "Menu box border color" },
+
+ { "item_color",
+ color_table[19],
+ VAL_ATTR,
+ "Item color" },
+
+ { "item_selected_color",
+ color_table[20],
+ VAL_ATTR,
+ "Selected item color" },
+
+ { "tag_color",
+ color_table[21],
+ VAL_ATTR,
+ "Tag color" },
+
+ { "tag_selected_color",
+ color_table[22],
+ VAL_ATTR,
+ "Selected tag color" },
+
+ { "tag_key_color",
+ color_table[23],
+ VAL_ATTR,
+ "Tag key color" },
+
+ { "tag_key_selected_color",
+ color_table[24],
+ VAL_ATTR,
+ "Selected tag key color" },
+
+ { "check_color",
+ color_table[25],
+ VAL_ATTR,
+ "Check box color" },
+
+ { "check_selected_color",
+ color_table[26],
+ VAL_ATTR,
+ "Selected check box color" },
+
+ { "uarrow_color",
+ color_table[27],
+ VAL_ATTR,
+ "Up arrow color" },
+
+ { "darrow_color",
+ color_table[28],
+ VAL_ATTR,
+ "Down arrow color" }
+}; /* vars */
+
+
+
+/*
+ * Routines to process configuration file
+ */
+void create_rc(char *filename);
+int parse_rc(void);
diff --git a/Build/source/utils/dialog/strcasecmp.c b/Build/source/utils/dialog/strcasecmp.c
new file mode 100644
index 00000000000..24cae771aaf
--- /dev/null
+++ b/Build/source/utils/dialog/strcasecmp.c
@@ -0,0 +1,31 @@
+#include "dialogconfig.h"
+
+/* GNU Library doesn't have toupper(). Until GNU gets this fixed, I will
+ have to do it. */
+#ifndef toupper
+#define toupper(c) ((c) - 32)
+#endif
+
+#define coerce_to_upper(c) ((islower(c) ? toupper(c) : (c)))
+
+#if !defined (HAVE_STRCASECMP)
+int strcasecmp (char *string1, char * string2)
+{
+ char ch1, ch2;
+
+ for (;;)
+ {
+ ch1 = *string1++;
+ ch2 = *string2++;
+
+ if (!(ch1 | ch2))
+ return (0);
+
+ ch1 = coerce_to_upper (ch1);
+ ch2 = coerce_to_upper (ch2);
+
+ if (ch1 != ch2)
+ return (ch1 - ch2);
+ }
+}
+#endif /* !HAVE_STRCASECMP */
diff --git a/Build/source/utils/dialog/textbox.c b/Build/source/utils/dialog/textbox.c
new file mode 100644
index 00000000000..a26d9cc596c
--- /dev/null
+++ b/Build/source/utils/dialog/textbox.c
@@ -0,0 +1,709 @@
+/*
+ * textbox.c -- implements the text box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+static void back_lines(int n);
+static void print_page(WINDOW *win, int height, int width);
+static void print_line(WINDOW *win, int row, int width);
+static char *get_line(void);
+static int get_search_term(WINDOW *win, char *search_term, int height, int width);
+static void print_position(WINDOW *win, int height, int width);
+
+
+static int hscroll = 0, fd, file_size, bytes_read, begin_reached = 1,
+ end_reached = 0, page_length;
+static char *buf, *page;
+
+
+/*
+ * Display text from a file in a dialog box.
+ */
+int dialog_textbox(char *title, char *file, int height, int width)
+{
+ int i, x, y, cur_x, cur_y, fpos, key = 0, dir, temp, temp1;
+#ifdef HAVE_NCURSES
+ int passed_end;
+#endif
+ char search_term[MAX_LEN+1], *tempptr, *found;
+ WINDOW *dialog, *text;
+
+ search_term[0] = '\0'; /* no search term entered yet */
+
+ /* Open input file for reading */
+ if ((fd = open(file, O_RDONLY)) == -1) {
+ endwin();
+ fprintf(stderr, "\nCan't open input file in dialog_textbox().\n");
+ exit(-1);
+ }
+ /* Get file size. Actually, 'file_size' is the real file size - 1,
+ since it's only the last byte offset from the beginning */
+ if ((file_size = lseek(fd, 0, SEEK_END)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError getting file size in dialog_textbox().\n");
+ exit(-1);
+ }
+ /* Restore file pointer to beginning of file after getting file size */
+ if (lseek(fd, 0, SEEK_SET) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ /* Allocate space for read buffer */
+ if ((buf = malloc(BUF_SIZE+1)) == NULL) {
+ endwin();
+ fprintf(stderr, "\nCan't allocate memory in dialog_textbox().\n");
+ exit(-1);
+ }
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0'; /* mark end of valid data */
+ page = buf; /* page is pointer to start of page to be displayed */
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ /* Create window for text region, used for scrolling text */
+/* text = newwin(height-4, width-2, y+1, x+1); */
+ text = subwin(dialog, height-4, width-2, y+1, x+1);
+ keypad(text, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ print_button(dialog, " EXIT ", height-2, width/2-4, TRUE);
+ wnoutrefresh(dialog);
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+
+ /* Print first page of text */
+ attr_clear(text, height-4, width-2, dialog_attr);
+ print_page(text, height-4, width-2);
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+
+ while ((key != ESC) && (key != '\n')) {
+ key = wgetch(dialog);
+ switch (key) {
+ case 'E': /* Exit */
+ case 'e':
+ delwin(dialog);
+ free(buf);
+ close(fd);
+ return 0;
+ case 'g': /* First page */
+ case KEY_HOME:
+ if (!begin_reached) {
+ begin_reached = 1;
+ /* First page not in buffer? */
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ if (fpos > bytes_read) { /* Yes, we have to read it in */
+ if (lseek(fd, 0, SEEK_SET) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0';
+ }
+ page = buf;
+ print_page(text, height-4, width-2);
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case 'G': /* Last page */
+#ifdef HAVE_NCURSES
+ case KEY_END:
+#endif
+ end_reached = 1;
+ /* Last page not in buffer? */
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ if (fpos < file_size) { /* Yes, we have to read it in */
+ if (lseek(fd, -BUF_SIZE, SEEK_END) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0';
+ }
+ page = buf + bytes_read;
+ back_lines(height-4);
+ print_page(text, height-4, width-2);
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ break;
+ case 'K': /* Previous line */
+ case 'k':
+ case KEY_UP:
+ if (!begin_reached) {
+ back_lines(page_length+1);
+#ifdef HAVE_NCURSES
+ /* We don't call print_page() here but use scrolling to ensure
+ faster screen update. However, 'end_reached' and 'page_length'
+ should still be updated, and 'page' should point to start of
+ next page. This is done by calling get_line() in the following
+ 'for' loop. */
+ scrollok(text, TRUE);
+ wscrl(text, -1); /* Scroll text region down one line */
+ scrollok(text, FALSE);
+ page_length = 0;
+ passed_end = 0;
+ for (i = 0; i < height-4; i++) {
+ if (!i) {
+ print_line(text, 0, width-2); /* print first line of page */
+ wnoutrefresh(text);
+ }
+ else
+ get_line(); /* Called to update 'end_reached' and 'page' */
+ if (!passed_end)
+ page_length++;
+ if (end_reached && !passed_end)
+ passed_end = 1;
+ }
+#else
+ print_page(text, height-4, width-2);
+#endif
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case 'B': /* Previous page */
+ case 'b':
+ case KEY_PPAGE:
+ if (!begin_reached) {
+ back_lines(page_length + height-4);
+ print_page(text, height-4, width-2);
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case 'J': /* Next line */
+ case 'j':
+ case KEY_DOWN:
+ if (!end_reached) {
+ begin_reached = 0;
+ scrollok(text, TRUE);
+ scroll(text); /* Scroll text region up one line */
+ scrollok(text, FALSE);
+ print_line(text, height-5, width-2);
+#ifndef HAVE_NCURSES
+ wmove(text, height-5, 0);
+ waddch(text, ' ');
+ wmove(text, height-5, width-3);
+ waddch(text, ' ');
+#endif
+ wnoutrefresh(text);
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case ' ': /* Next page */
+ case KEY_NPAGE:
+ if (!end_reached) {
+ begin_reached = 0;
+ print_page(text, height-4, width-2);
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case '0': /* Beginning of line */
+ case 'H': /* Scroll left */
+ case 'h':
+ case KEY_LEFT:
+ if (hscroll > 0) {
+ if (key == '0')
+ hscroll = 0;
+ else
+ hscroll--;
+ /* Reprint current page to scroll horizontally */
+ back_lines(page_length);
+ print_page(text, height-4, width-2);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case 'L': /* Scroll right */
+ case 'l':
+ case KEY_RIGHT:
+ if (hscroll < MAX_LEN) {
+ hscroll++;
+ /* Reprint current page to scroll horizontally */
+ back_lines(page_length);
+ print_page(text, height-4, width-2);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ break;
+ case '/': /* Forward search */
+ case 'n': /* Repeat forward search */
+ case '?': /* Backward search */
+ case 'N': /* Repeat backward search */
+ /* set search direction */
+ dir = (key == '/' || key == 'n') ? 1 : 0;
+ if (dir ? !end_reached : !begin_reached) {
+ if (key == 'n' || key == 'N') {
+ if (search_term[0] == '\0') { /* No search term yet */
+ fprintf(stderr, "\a"); /* beep */
+ break;
+ }
+ }
+ else /* Get search term from user */
+ if (get_search_term(text, search_term, height-4, width-2) == -1) {
+ /* ESC pressed in get_search_term(). Reprint page to clear box */
+ wattrset(text, dialog_attr);
+ back_lines(page_length);
+ print_page(text, height-4, width-2);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ break;
+ }
+ /* Save variables for restoring in case search term can't be found */
+ tempptr = page;
+ temp = begin_reached;
+ temp1 = end_reached;
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ fpos -= bytes_read;
+ /* update 'page' to point to next (previous) line before
+ forward (backward) searching */
+ back_lines(dir ? page_length-1 : page_length+1);
+ found = NULL;
+ if (dir) /* Forward search */
+ while((found = strstr(get_line(), search_term)) == NULL) {
+ if (end_reached)
+ break;
+ }
+ else /* Backward search */
+ while((found = strstr(get_line(), search_term)) == NULL) {
+ if (begin_reached)
+ break;
+ back_lines(2);
+ }
+ if (found == NULL) { /* not found */
+ fprintf(stderr, "\a"); /* beep */
+ /* Restore program state to that before searching */
+ if (lseek(fd, fpos, SEEK_SET) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+ exit(-1);
+ }
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0';
+ page = tempptr;
+ begin_reached = temp;
+ end_reached = temp1;
+ /* move 'page' to point to start of current page in order to
+ re-print current page. Note that 'page' always points to
+ start of next page, so this is necessary */
+ back_lines(page_length);
+ }
+ else /* Search term found */
+ back_lines(1);
+ /* Reprint page */
+ wattrset(text, dialog_attr);
+ print_page(text, height-4, width-2);
+ if (found != NULL)
+ print_position(dialog, height, width);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
+ wrefresh(dialog);
+ }
+ else /* no need to find */
+ fprintf(stderr, "\a"); /* beep */
+ break;
+ case ESC:
+ break;
+ }
+ }
+
+ delwin(dialog);
+ free(buf);
+ close(fd);
+ return -1; /* ESC pressed */
+}
+/* End of dialog_textbox() */
+
+
+/*
+ * Go back 'n' lines in text file. Called by dialog_textbox().
+ * 'page' will be updated to point to the desired line in 'buf'.
+ */
+static void back_lines(int n)
+{
+ int i, fpos;
+
+ begin_reached = 0;
+ /* We have to distinguish between end_reached and !end_reached since at end
+ of file, the line is not ended by a '\n'. The code inside 'if' basically
+ does a '--page' to move one character backward so as to skip '\n' of the
+ previous line */
+ if (!end_reached) {
+ /* Either beginning of buffer or beginning of file reached? */
+ if (page == buf) {
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+ exit(-1);
+ }
+ if (fpos > bytes_read) { /* Not beginning of file yet */
+ /* We've reached beginning of buffer, but not beginning of file yet,
+ so read previous part of file into buffer. Note that we only
+ move backward for BUF_SIZE/2 bytes, but not BUF_SIZE bytes to
+ avoid re-reading again in print_page() later */
+ /* Really possible to move backward BUF_SIZE/2 bytes? */
+ if (fpos < BUF_SIZE/2 + bytes_read) {
+ /* No, move less then */
+ if (lseek(fd, 0, SEEK_SET) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+ exit(-1);
+ }
+ page = buf + fpos - bytes_read;
+ }
+ else { /* Move backward BUF_SIZE/2 bytes */
+ if (lseek(fd, -(BUF_SIZE/2 + bytes_read), SEEK_CUR) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+ exit(-1);
+ }
+ page = buf + BUF_SIZE/2;
+ }
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in back_lines().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0';
+ }
+ else { /* Beginning of file reached */
+ begin_reached = 1;
+ return;
+ }
+ }
+ if (*(--page) != '\n') { /* '--page' here */
+ /* Something's wrong... */
+ endwin();
+ fprintf(stderr, "\nInternal error in back_lines().\n");
+ exit(-1);
+ }
+ }
+
+ /* Go back 'n' lines */
+ for (i = 0; i < n; i++)
+ do {
+ if (page == buf) {
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+ exit(-1);
+ }
+ if (fpos > bytes_read) {
+ /* Really possible to move backward BUF_SIZE/2 bytes? */
+ if (fpos < BUF_SIZE/2 + bytes_read) {
+ /* No, move less then */
+ if (lseek(fd, 0, SEEK_SET) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+ exit(-1);
+ }
+ page = buf + fpos - bytes_read;
+ }
+ else { /* Move backward BUF_SIZE/2 bytes */
+ if (lseek(fd, -(BUF_SIZE/2 + bytes_read), SEEK_CUR) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+ exit(-1);
+ }
+ page = buf + BUF_SIZE/2;
+ }
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in back_lines().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0';
+ }
+ else { /* Beginning of file reached */
+ begin_reached = 1;
+ return;
+ }
+ }
+ } while (*(--page) != '\n');
+ page++;
+}
+/* End of back_lines() */
+
+
+/*
+ * Print a new page of text. Called by dialog_textbox().
+ */
+static void print_page(WINDOW *win, int height, int width)
+{
+ int i, passed_end = 0;
+
+ page_length = 0;
+ for (i = 0; i < height; i++) {
+ print_line(win, i, width);
+ if (!passed_end)
+ page_length++;
+ if (end_reached && !passed_end)
+ passed_end = 1;
+ }
+ wnoutrefresh(win);
+}
+/* End of print_page() */
+
+
+/*
+ * Print a new line of text. Called by dialog_textbox() and print_page().
+ */
+static void print_line(WINDOW *win, int row, int width)
+{
+ int i, y, x;
+ char *line;
+
+ line = get_line();
+ line += MIN(strlen(line),hscroll); /* Scroll horizontally */
+ wmove(win, row, 0); /* move cursor to correct line */
+ waddch(win,' ');
+#ifdef HAVE_NCURSES
+ waddnstr(win, line, MIN(strlen(line),width-2));
+#else
+ line[MIN(strlen(line),width-2)] = '\0';
+ waddstr(win, line);
+#endif
+
+ getyx(win, y, x);
+ /* Clear 'residue' of previous line */
+ for (i = 0; i < width-x; i++)
+ waddch(win, ' ');
+}
+/* End of print_line() */
+
+
+/*
+ * Return current line of text. Called by dialog_textbox() and print_line().
+ * 'page' should point to start of current line before calling, and will be
+ * updated to point to start of next line.
+ */
+static char *get_line(void)
+{
+ int i = 0, fpos;
+ static char line[MAX_LEN+1];
+
+ end_reached = 0;
+ while (*page != '\n') {
+ if (*page == '\0') { /* Either end of file or end of buffer reached */
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in get_line().\n");
+ exit(-1);
+ }
+ if (fpos < file_size) { /* Not end of file yet */
+ /* We've reached end of buffer, but not end of file yet, so read next
+ part of file into buffer */
+ if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError reading file in get_line().\n");
+ exit(-1);
+ }
+ buf[bytes_read] = '\0';
+ page = buf;
+ }
+ else {
+ if (!end_reached)
+ end_reached = 1;
+ break;
+ }
+ }
+ else
+ if (i < MAX_LEN)
+ line[i++] = *(page++);
+ else {
+ if (i == MAX_LEN) /* Truncate lines longer than MAX_LEN characters */
+ line[i++] = '\0';
+ page++;
+ }
+ }
+ if (i <= MAX_LEN)
+ line[i] = '\0';
+ if (!end_reached)
+ page++; /* move pass '\n' */
+
+ return line;
+}
+/* End of get_line() */
+
+
+/*
+ * Display a dialog box and get the search term from user
+ */
+static int get_search_term(WINDOW *win, char *search_term, int height, int width)
+{
+ int i, x, y, input_x = 0, scroll = 0, key = 0,
+ box_height = 3, box_width = 30;
+
+ x = (width - box_width)/2;
+ y = (height - box_height)/2;
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(win, y, x, box_height, box_width);
+#endif
+ draw_box(win, y, x, box_height, box_width, dialog_attr, searchbox_border_attr);
+ wattrset(win, searchbox_title_attr);
+ wmove(win, y, x+box_width/2-4);
+ waddstr(win, " Search ");
+
+ box_width -= 2;
+ wmove(win, y+1, x+1);
+ wrefresh(win);
+ search_term[0] = '\0';
+ wattrset(win, searchbox_attr);
+ while (key != ESC) {
+ key = wgetch(win);
+ switch (key) {
+ case '\n':
+ if (search_term[0] != '\0')
+ return 0;
+ break;
+ case KEY_BACKSPACE:
+ if (input_x || scroll) {
+ if (!input_x) {
+ scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
+ wmove(win, y+1, x+1);
+ for (i = 0; i < box_width; i++)
+ waddch(win, search_term[scroll+input_x+i] ?
+ search_term[scroll+input_x+i] : ' ');
+ input_x = strlen(search_term) - scroll;
+ }
+ else
+ input_x--;
+ search_term[scroll+input_x] = '\0';
+ wmove(win, y+1, input_x + x+1);
+ waddch(win, ' ');
+ wmove(win, y+1, input_x + x+1);
+ wrefresh(win);
+ }
+ break;
+ case ESC:
+ break;
+ default:
+ if (isprint(key))
+ if (scroll+input_x < MAX_LEN) {
+ search_term[scroll+input_x] = key;
+ search_term[scroll+input_x+1] = '\0';
+ if (input_x == box_width-1) {
+ scroll++;
+ wmove(win, y+1, x+1);
+ for (i = 0; i < box_width-1; i++)
+ waddch(win, search_term[scroll+i]);
+ }
+ else {
+ wmove(win, y+1, input_x++ + x+1);
+ waddch(win, key);
+ }
+ wrefresh(win);
+ }
+ }
+ }
+
+ return -1; /* ESC pressed */
+}
+/* End of get_search_term() */
+
+
+/*
+ * Print current position
+ */
+static void print_position(WINDOW *win, int height, int width)
+{
+ int fpos, percent;
+
+ if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+ endwin();
+ fprintf(stderr, "\nError moving file pointer in print_position().\n");
+ exit(-1);
+ }
+ wattrset(win, position_indicator_attr);
+ percent = !file_size ? 100 : ((fpos-bytes_read+page-buf)*100)/file_size;
+ wmove(win, height-3, width-9);
+ wprintw(win, "(%3d%%)", percent);
+}
+/* End of print_position() */
diff --git a/Build/source/utils/dialog/yesno.c b/Build/source/utils/dialog/yesno.c
new file mode 100644
index 00000000000..53e1452ecda
--- /dev/null
+++ b/Build/source/utils/dialog/yesno.c
@@ -0,0 +1,112 @@
+/*
+ * yesno.c -- implements the yes/no box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dialog.h"
+
+
+/*
+ * Display a dialog box with two buttons - Yes and No
+ */
+int dialog_yesno(char *title, char * prompt, int height, int width)
+{
+ int i, x, y, key = 0, button = 0;
+ WINDOW *dialog;
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ print_autowrap(dialog, prompt, width, 1, 3);
+
+ x = width/2-10;
+ y = height-2;
+ print_button(dialog, " No ", y, x+13, FALSE);
+ print_button(dialog, " Yes ", y, x, TRUE);
+ wrefresh(dialog);
+
+ while (key != ESC) {
+ key = wgetch(dialog);
+ switch (key) {
+ case 'Y':
+ case 'y':
+ delwin(dialog);
+ return 0;
+ case 'N':
+ case 'n':
+ delwin(dialog);
+ return 1;
+ case TAB:
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ if (!button) {
+ button = 1; /* Indicates "No" button is selected */
+ print_button(dialog, " Yes ", y, x, FALSE);
+ print_button(dialog, " No ", y, x+13, TRUE);
+ }
+ else {
+ button = 0; /* Indicates "Yes" button is selected */
+ print_button(dialog, " No ", y, x+13, FALSE);
+ print_button(dialog, " Yes ", y, x, TRUE);
+ }
+ wrefresh(dialog);
+ break;
+ case ' ':
+ case '\n':
+ delwin(dialog);
+ return button;
+ case ESC:
+ break;
+ }
+ }
+
+ delwin(dialog);
+ return -1; /* ESC pressed */
+}
+/* End of dialog_yesno() */
diff --git a/Build/source/utils/gzip/COPYING b/Build/source/utils/gzip/COPYING
new file mode 100644
index 00000000000..a43ea2126fb
--- /dev/null
+++ b/Build/source/utils/gzip/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/utils/gzip/ChangeLog b/Build/source/utils/gzip/ChangeLog
new file mode 100644
index 00000000000..7dd0f865165
--- /dev/null
+++ b/Build/source/utils/gzip/ChangeLog
@@ -0,0 +1,587 @@
+Wed Aug 18 09:34:23 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.2.4
+ By default, do not restore file name and timestamp from those saved
+ inside the .gz file (behave as 'compress'). Added the --name option
+ to force name and timestamp restoration.
+ Accept - as synonym for stdin.
+ Use manlinks=so or ln to support either hard links or .so in man pages
+ Accept foo.gz~ in zdiff.
+ Added support for Windows NT
+ Handle ENAMETOOLONG for strict Posix systems
+ Use --recursive instead of --recurse to comply with Webster and
+ the GNU stdandard.
+ Allow installation of shell scripts with a g prefix: make G=g install
+ Install by default zcat as gzcat if gzcat already exists in path.
+ Let zmore behave as more when invoked without parameters (give help)
+ Let gzip --list reject files not in gzip format even with --force.
+ Don't complain about non gzip files for options -rt or -rl.
+ Added advice in INSTALL for several systems.
+ Added makefile entries for NeXTstep 3.1 (if configure fails)
+ Avoid problem with memcpy on Pyramid (gave crc error on some files)
+ Support the -r option when compiled with Borland C++ on msdos.
+ Force lower case file names only for FAT file systems (not HPFS)
+ Rewrite one expression in inflate.c to avoid cc bug on Solaris x86.
+ In the msdos makefiles, get match.asm from the msdos subdirectory.
+ Catch SIGTERM and SIGHUP only if they are not ignored.
+ getopt.c: on Amiga, "#if !defined(const)" does not compile.
+ Use register parameters on Amiga.
+ Do not force names to lower case on Amiga.
+ Fix support of Atari TOS (Makefile.st and tailor.h)
+ In unlzw.c, do not suggest using zcat if zcat already used.
+ In INSTALL, suggest using bsdinst for HPUX.
+ Document Turbo C++ 1.0 bug in INSTALL.
+ Improved the documentation relative to the --no-name option.
+ Avoid signed/unsigned warnings in several files.
+ Added pointer to jka-compr19.el in README.
+ Added pointer to OS/2 executables in README.
+ Added --block-compress in tar -z example (gzip.1 and gzip.texi).
+ Don't keep rcsid in executable (avoid compilation warnings).
+ Check also the correctness of the first byte of an .Z file.
+ Return non zero status for an invalid option.
+ Remove "NEWFILES" from os2/gzip.def for Borland C++ on OS/2.
+ Remove "time stamp restored" message (just obey the -N request).
+
+Thu Jun 24 10:27:57 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.2.3
+ Don't display the output name when decompressing except with --verbose.
+ Remove usage of alloca in getopt.c and all makefiles.
+ Use ASCPP instead of CPP to avoid breaking AC_HEADER_CHECK on RiscOS.
+ Added the zfile shell script in subdirectory sample.
+ Moved the list of compiler bugs from README to INSTALL.
+ Added vms/Readme.vms.
+ Fix DIST_BUFSIZE check in unlzh.c for 16 bit machines.
+ Fix REGSIGTYP macro in configure.in.
+ Use 'define' instead of == in vms/gzip.hlp.
+ Avoid warnings in unlzh.c
+ Allow separate installation of binaries and man pages.
+ Simplified handling of file names with spaces in zgrep and znew.
+ Fix dependencies and remove rule for trees.c in amiga/Makefile.sasc
+ Add missing quote in gzexe.
+
+Thu Jun 17 13:47:05 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.2.2
+ Fix a compilation error in gzip.c on Sun with cc (worked with gcc).
+
+Wed Jun 16 11:20:27 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.2.1
+ Let zmore act as more if the data is not gzipped.
+ By default, display output name only when name was actually truncated.
+ Use absolute path names in gzexe'd programs for better security.
+ In gzexe, use chmod 700 instead of 755 and don't gzexe tail,rm,etc...
+ Update vms/gzip.hlp.
+ Added a note about the fast options (-1 to -3) in algorithm.doc.
+ Improved man page for zgrep.
+ Minor fixes to gzip.texi.
+ Always set LC_ALL and LANG in configure (for tr on HPUX)
+
+Mon Jun 14 10:03:24 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.2
+ Added the --list option to display the file characteristics.
+ Added the --no-name option: do not save or restore original filename
+ Save the original name by default.
+ Allow gunzip --suffix "" to attempt decompression on any file
+ regardless of its extension if an original name is present.
+ Add support for the SCO compress -H format.
+ gzip --fast now compresses faster (speed close to that of compress)
+ with degraded compression ratio (but still better than compress).
+ Default level changed to -6 (acts exactly as previous level -5) to
+ be a better indication of its placement in the speed/ratio range.
+ Use smart name truncation: 123456789012.c -> 123456789.c.gz
+ instead of 12345678901.gz
+ With --force, let zcat pass non gzip'ed data unchanged (zcat == cat)
+ Added the zgrep shell script.
+ Made sub.c useful for 16 bit sound, 24 bit images, etc..
+ Supress warnings about suffix for gunzip -r, except with --verbose.
+ Moved the sample programs to a subdirectory sample.
+ On MSDOS, use .gz extension when possible (files without extension)
+ Added a "Special targets" section in INSTALL.
+ Use stty -g correctly in zmore.in.
+ Use cheaper test for gzipness in zforce.in.
+ Remove space before $ in match.S (no longer accepted by gas 2.x)
+ For the shell scripts, do not assume that gzip is in the path.
+ Fix syntax error and define lnk$library in vms/Makefile.mms
+ REGSIGTYPE is void on the Amiga.
+ Do not write empty line when decompressing stdin with --verbose.
+ Fix the 1.1.2 fix for VMS (bug in get_suffix)
+ Added warning in README about compiler bug on Solaris 2.1 for x86.
+ Added warning about 'rehash' in INSTALL.
+ Removed default value of read_buf in bits.c (supermax doesn't like).
+ In tailor.h, added support for Borland C and Zortech C on OS/2.
+ Added warning in gzexe about Ultrix buggy sh (use /bin/sh5 instead).
+ Added warning in zdiff about AIX buggy sh (use /bin/ksh instead).
+ In configure.in, do not try the asm code if DEFS contains NO_ASM
+
+Fri Jun 4 09:49:33 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.1.2
+ Fix serious bug for VMS (-gz not removed when decompressing).
+ Allow suffix other than .gz in znew.
+ Do not display compression ratio when decompressing stdin.
+ In zmore.in, work around brain damaged stty -g (Ultrix).
+ Display a correct compression ratio for .Z files.
+ Added .z to .gz renaming script in INTALL.
+ Allow setting CFLAGS in configure.
+ Add warning in README about bug in Concentrix cc compiler.
+ Avoid || in Makefile.in (at least one make doesn't support this).
+ Disable useless --ascii option for the Amiga.
+ Add a pointer to the Primos executable in README.
+ Added description of extra field in algorithm.doc.
+ Do not redefine NULL in alloca.c.
+ Added check for unsupported compression methods.
+ Avoid getopt redeclaration on OSF/1.
+
+Tue Jun 1 09:07:15 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.1.1
+ Fix serious bug in vms.c (== instead of =).
+ Added --ascii option.
+ Add workaround in configure.in for Ultrix (quote eval argument)
+ Do not use unset in znew (not supported on Ultrix)
+ Use tar.gz instead of tar.z for the distribution of gzip.
+ Add missing menu item in gzip.texi.
+ Use size_t instead of unsigned, add AC_SIZE_T in configure.in.
+
+Fri May 28 11:40:01 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.1
+ Use .gz suffix by default, add --suffix option.
+ Let gunzip accept a "_z" suffix (used by one 'compress' on Vax/VMS).
+ Quit when reading garbage from stdin instead of reporting an error.
+ Added sub.c and add.c for compression of 8 bit images.
+ Added makefile for VAX/MMS and support for wildcards on VMS.
+ Added support for MSC under OS/2.
+ Added support for Prime/PRIMOS.
+ Display compression ratio also when decompressing.
+ Quit after --version (GNU standard)
+ Use --force to bypass isatty() check.
+ Accept --silent as synonym for --quiet (see longopts.table)
+ Accept --to-stdout as synonym for --stdout (see longopts.table)
+ Accept -H and -? in addition to -h and --help.
+ Added comparison of zip and gzip in the readme file.
+ Return an error code in all main compression/decompression functions.
+ Continue processing other files in case of recoverable error.
+ Add description of -f in znew.1.
+ Do not keep uncompressed version for znew -t if .gz already exists.
+ On Unix, use only st_ino and st_dev in same_file().
+ Use S_IRUSR and S_IWUSR if they exist.
+ "test $1 = -d" -> "test x$1 = x-d" in gzexe.
+ In match.S, use symbol sysV68 to detect the Motorola Delta.
+ Do not include memory.h with gcc (conflicting declarations on Sun).
+ Fix more typos.
+ On VMS, define unlink as delete also for gcc.
+ In "make check", unset LANG because "wc -c" fails on Kanji.
+ Renamed shdir as scriptdir.
+ Use the 68020 code instead of 68000 code on the NeXT.
+ Documented --uncompress as synonym for --decompress.
+ Include the standard header files before gzip.h (needed on Bull).
+ Do not assume that _POSIX_VERSION implies dirent.h present.
+ Removed gzip-tar.patch since tar 1.11.2 handles gzip directly.
+ Use less memory when compiled with -DSMALL_MEM (for MSDOS).
+ Optimized updcrc().
+ Don't complain if cc -E does not work correctly.
+ Do not attempt reading 64K bytes on 16 bit Unix systems.
+ Do not use the variable name 'overhead' which is reserved on Lynx!
+ One BULL compiler does not like *p++ in inflate.c => *p, p++.
+ Use casts on free and memcmp to avoid warnings.
+ Remove the "off by more than one minute" time stamp kludge, but
+ document how to avoid saving the time stamp on pipes if desired.
+ Include crypt.h in inflate.c (one system predefines the CRYPT symbol).
+ Add links to gunzip and (g)zcat in the default make rule.
+ Create installation directories if they do not exist.
+ Clarified --prefix option in INSTALL.
+ Use symbol mc68k in match.S for the DIAB DS90.
+ Guard against zero length _match.s in configure.in.
+ In zmore, restore all tty options using stty -g.
+ Added support for MacOS
+ Simplified makecrc.c.
+ Avoid warnings in getopt.c, util.c, unlzw.c.
+ Use autoconf 1.4, in particular for INSTALL and AC_HAVE_POUNDBANG
+ Use .so instead of hard links for zcat.1, gunzip.1 and zcmp.1.
+ Fixed declration of sig_type.
+ Make consistency check in fcfree.
+ Added ztouch.
+ Do not complain if utime fails on a directory (for OS/2).
+
+Thu Mar 18 18:56:43 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.7
+ Allow zmore to read from standard input (like more).
+ Support the 68000 (Atari ST) in match.S.
+ Retry partial writes (required on Linux when gzip is suspended in
+ a pipe).
+ Allow full pathnames and renamings in gzexe.
+ Don't let gzexe compress setuid executables or gzip itself.
+ Added vms/Makefile.gcc for gcc on the Vax.
+ Give a pointer to Solaris and VMS executables of gzip in README.
+ Allow installation of binaries and shell scripts in different dirs.
+ Do not use alloca on the Cray.
+ Provide strspn and strcspn if string.h does not exist.
+ Define O_CREAT and O_EXCL from FCREAT and FEXCL if necessary.
+ Remove gzip.doc in make realclean.
+ Fixed many typos. (Corrections to my English are welcome.)
+ Put "make manext=l install" at the correct place in INSTALL.
+ Fix incorrect examples in INSTALL and give more examples.
+ Include zdiff.1 for install and uninstall.
+ Allows complex PAGER variable in zmore (e.g.: PAGER="col -x | more")
+ Avoid warning on unused indfound in getopt.c.
+ Cast memset arg to void* (required by some buggy compilers).
+ Include sys/types.h before dirent.h in acgeneral.m4.
+ Fix acgeneral.m4 AC_COMPILE_CHECK to avoid warnings.
+ Don't use alloca.c with gcc. (One NeXT user did not have alloca.h).
+ Change all error messages according to GNU standards.
+ Restore time stamp only if off by more than one minute.
+ Allow installation of zcat as gzcat.
+ Suppress help message and send compressed data to the terminal when
+ gzip is invoked without parameters and without redirection.
+ (Explicit request from Noah Friedman.)
+ Add compile option GNU_STANDARD to respect the GNU coding standards:
+ with -DGNU_STANDARD, behave as gzip even if invoked under the
+ name gunzip. (Complaints to /dev/null or the FSF, not to me!)
+
+Fri Mar 10 13:27:18 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.6
+ Let gzexe detect executables that are already gzexe'd.
+ Don't try restoring record format on VMS (the simple 1.0.5 code
+ worked correctly only on fixed-512 files). Suppress text_mode.
+ Added asm version for 68000 in amiga/match.a.
+ Use asm version for Atari TT.
+ Fix "make clean" in vms/Makefile.vms.
+ For OS/2, assume HPFS by default, add flag OS2FAT if necessary.
+ Fixed some bugs in zdiff and define zcmp as a link to zdiff.
+ Added zdiff.1
+ Remove configure hack for NeXT; add general fix to autoconf instead
+ Do not strip a ".z" extension if this results in an empty name.
+ Avoid array overflow in get_prefix() for extensions > 10 chars.
+ Accept either q or e to quit zmore.
+ In zmore, try restoring tty mode in all cases.
+ Use Motorola style for match.S on the NeXT.
+ configure.in: unsetenv *hangs* with the Siemens csh...
+ Update vms/gzip.hlp.
+
+Thu Mar 4 14:13:34 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.5
+ For VMS, restore the file type for variable record format, otherwise
+ extract in fixed length format (not perfect, but better than
+ forcing all files to be in stream_LF format).
+ Use "-z" suffix for VMS.
+ Use only .z, .*-z, .tgz, .taz as valid gzip extensions; update
+ zforce accordingly.
+ Allow a version number in input file names for VMS.
+ Added sample program zread.c.
+ Fix "make check" for some implementations of /bin/sh.
+ Don't rely on stat() for filenames with extension > 3 chars
+ on MSDOS, OS2 and Atari.
+ Garbage collect files in /tmp created by gzexe.
+ Quote $opt in znew.
+ Use TOUCH env variable in znew if it exists.
+ Better error message for gunzip on empty or truncated file.
+ Allow prototypes in getopt.h when __STDC__ defined but 0.
+ Added "make clean" in vms/Makefile.vms.
+ Removed -g from default CFLAGS (with Noah's permission!)
+ Avoid too many HAVE_xxx_H for most systems; use common defaults.
+ Moved default Atari flags into tailor.h for consistency.
+ Use memzero() to clear the hash table.
+ Update vms/gzip.hlp to reflect the VMS behavior.
+ Fix OS_CODE (to fit in a byte).
+ Add utime.h for the Amiga.
+ Add gcc support for the Amiga.
+ Work around incorrect dirent.h for NeXT 2.0.
+ Added Makefile entry for Coherent.
+
+Fri Feb 22 11:20:49 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.4
+ Added optimized asm version for 68020.
+ Add support for DJGPP.
+ Add support for the Atari ST.
+ Added zforce to rename gzip'ed files with truncated names.
+ Do not install with name uncompress (some systems rely on the
+ absence of any check in the old uncompress).
+ Added missing function (fcfree) in msdos/tailor.c
+ Let gunzip handle .tgz files, and let gzip skip them.
+ Added 'stty min 1' in zmore for SysV and fixed trap code.
+ Suppress .PHONY in Makefile.in, which breaks old makes.
+ Added documentation about pcat and unpack in INSTALL.
+ Add cast to getenv for systems without stdlib.h.
+ Use VAXC instead of VMS to avoid confusion for gcc.
+ Add -K to znew.1.
+ Add gzexe.1.
+ Try preserving file permissions in gzexe.
+ Added -d option for gzexe.
+ Guard against spaces in file names in gzexe.
+ Use CMP env. variable in zcmp.
+ Return a warning exit status for gzip of file with .z suffix.
+ Suppress usage of d_ino which is not portable to all systems.
+ Use #ifdef instead of #if for consistency.
+ For VMS, use "cc util.c" instead of "cc util" (pb with logical names)
+ Added utime() for Amiga.
+ Renamed gzcat.1 as zcat.1.
+ Include fcntl.h for Amiga (for read and write).
+ For VMS, add definition of symbols and links in the makefiles.
+ Give a VMS look to vms/gzip.hlp.
+ Save the original name only when necessary.
+ Add a mode parameter for open in read mode (required by VMS).
+ For VMS, remove the version suffix from the original name.
+ Accept both / and \ as path separator for MSDOS.
+ Let gunzip extract stored .zip files correctly.
+ Added warning about VFC format in vms/gzip.hlp.
+ In znew, skip a bad file but process the others.
+ Cleanup tailor.h.
+ Use GZIP_OPT for VMS to avoid conflict with program name.
+ Added description of GZIP variable in gzip.texi.
+
+Thu Feb 11 17:21:32 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.3
+ Add -K option for znew to keep old .Z files if smaller.
+ Add -q option (quiet) to cancel -v in GZIP env variable.
+ For Turbo C, normalize pointers before freeing them.
+ Add more safety checks in add_envopt().
+ Add do_exit() for uniform exit path (always free memory).
+ Reduce MAX_PATH_LEN for MSDOS.
+ Include sys/types.h before signal.h
+ Avoid strdup, the NeXT does not have it.
+ Made gzexe safer on systems with filename limitation to 14 chars.
+
+Fri Feb 10 09:45:49 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.2
+ Added env variable GZIP for default options.
+ Added support for the Amiga.
+ znew now keeps the old .Z if it is smaller than the .z file.
+ Added gzexe to compress rarely used executables.
+ Reduce memory usage when using static allocation (no DYN_ALLOC).
+ Better separation of warning and error return codes.
+ Fix unlzw.c to make DYN_ALLOC and MAXSEG_64K independent options.
+ Allow INBUFSIZ to be >= 32K in unlzw (don't use sign of rsize)
+ Generate tar file in old format to avoid problems with old systems.
+ Preserve time stamp in znew -P if touch -r works.
+ Use ${PAGER-more} instead of ${PAGER:-more} in zmore.
+ Do not use unsigned instead of mode_t.
+ Better error message for trailing garbage in .z file; ignore this
+ garbage on VMS.
+ In zmore, use icanon instead of -cbreak on SYSV.
+ Add trap handler in zmore.
+ Use char* instead of void* for non STDC compilers.
+ Added makefile entry for Xenix on 286.
+ Return an error code when existing file was not overwritten.
+ Use prototype of lzw.h for lzw.c.
+ Fix znew with -P option alone.
+ Give warning for directories even without -v.
+ Close output file before unlink() in case of error.
+ Suppress all target dependent ifdef from the portable files.
+ Free all dynamically allocated variables upon exit.
+
+Thu Feb 4 18:23:56 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0.1
+ Fixed some trivial errors in msdos/Makefile.bor
+
+Thu Feb 4 10:00:59 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * version 1.0
+ gzip now runs on Vax/VMS (Amiga support will come in next version).
+ Do not overwrite files without -f when using /bin/sh.
+ Support the test option -t for compressed (.Z) files.
+ Flush output for bad compressed files. Add warning in README.
+ Added makefiles for MSDOS.
+ Don't rely on presence of csh in configure
+ Added gunzip.1 and gzcat.1.
+ Updated znew.1.
+ Check reserved flags in unlzw().
+ Return dummy value in main to avoid lint warning.
+ Define OF in lzw.h for lint.
+ Allow both "znew -v -t" and "znew -vt".
+ Don't overwrite the output file name for multiple parts.
+ Echo just a warning if configure is out of date.
+ Use ; instead of , in trees.c (confuses the SAS Amiga compiler).
+ In INSTALL, document "DEFS='-DM_XENIX' ./configure".
+ Use OTHER_PATH_SEP for more portability (DOS, OS2, VMS, AMIGA).
+ Make all directories world writable for broken versions of tar.
+ Use gzip -cd instead of zcat in zmore, zcmp, zdiff.
+ Don't use GNU tar for distributions, some systems can't untar.
+ Do not exit() for gzip --version.
+
+Mon Jan 26 10:26:42 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.8.2
+ Avoid 'far' declarations for MSDOS.
+ Use test -f instead of test -x in configure.in (for Ultrix)
+ Add empty else part to if in Makefile.in for broken shells.
+ Use NO_UNDERLINE instead of UNDERLINE (pb with Linux cpp)
+ Accept continuation files with -ff (for damage recovery)
+ Small patch to Makefile.os2
+ Use memzero instead of bzero to avoid potential conflicts
+ Document restriction on extraction of zip files.
+ Fix quoting in ACL_HAVE_SHELL_HACK.
+ Do not check file size on MSDOS because of bug in DIET.
+ Allow zcat on a file with multiple links.
+ Add fix in inflate.c for compatibility with pkzip 2.04c.
+ Release gzip in tar.z and tar format. (No tar.Z).
+
+Fri Jan 22 10:04:13 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.8.1
+ Fixed Makefile.os2
+ Fixed #if directives that TurboC does not like.
+ Don't rely on uncompress in znew, use gzip -d.
+ Add the pipe option -P in znew.
+ Add some more ideas in TODO.
+ Support both NDIR and SYSNDIR.
+
+Sat Jan 21 15:46:38 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.8
+ Support unpack.
+ Check for _match.o in configure.in in addition to return status.
+ Include <sys/types.h> in zip.c
+ Define local variables and functions as local.
+ Accept more alternative names for the program (pcat, gzcat, ...).
+ Accept .exe as well as .EXE.
+ Uncompress files with multiple links only with -f.
+ Better error message for gunzip of non-existent file.z.
+ Fix the entry for /etc/magic in INSTALL.
+ Use AC_HAVE_HEADERS uniformly instead of special macros.
+ Install the man pages as .1 by default instead of .l.
+ Document crypt++.el in README.
+ Fix for unlzw() on 16-bit machines (bitmask must be unsigned).
+ Complain if input and output files are identical.
+ Create a correct output name for files of exactly 13 chars.
+ Do not overwrite CPP if set
+ Check for i386 before trying to assemble match.s
+ Check for underline in external name before assembling
+ Add patch for tar 1.11.1.
+
+Mon Jan 5 10:16:24 1993 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.7
+ Use "make check" instead of "make test".
+ Do not rely on dirname in znew.
+ Keep time stamp and pass options to gzip in znew.
+ Rename .l files back to .1 to avoid conflict with lex
+ Do not create .z.z files with gzip -r.
+ Use nice_match in match.asm
+ Unroll loops in deflate.c
+ Do not attempt matches beyond the window end
+ Allow again gunzip .zip files (was working in 0.5)
+ Allow again compilation with TurboC 2.0 (was working in 0.4)
+
+Tue Dec 30 20:00:19 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.6
+ The .z extension is used by pack, not compact (README, gzip.1)
+ Accept gzcat in addition to zcat.
+ Use PAGER in zmore if defined.
+ Man pages for /usr/local/man/manl should have extension .l.
+ Don't redefine bzero on the NeXT
+ Allow incomplete Huffman table if there is only one code.
+ Don't lookahead more than 7 bits (caused premature EOF).
+ Added "make test" to check for compiler bugs.
+ Don't rely on `i386`; try to assemble directly
+ Change magic header to avoid conflict with freeze 1.x.
+ Added entry for /etc/magic in INSTALL.
+ Do not destroy an input .zip file with more than one member.
+ Display "untested" instead of "OK" for gzip -t foo.Z
+ With -t, skip stdin in .Z format
+ Allow multiple compressed members in an input file.
+ Ignore a zero time stamp.
+ Made znew safer.
+
+Tue Dec 29 10:00:19 1992 Noah Friedman (friedman@gnu.ai.mit.edu)
+
+ Added test for #!/bin/sh in configure.in.
+ Fix some references to $srcdir in Makefile.in
+
+Mon Dec 21 17:33:35 1992 Jean-Loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.5
+ Put RCS ids in all files.
+ Added znew to recompress old .Z files with gzip.
+ Avoid "already .z suffix" messages for -r and no -v.
+ Put back check for d_ino in treat_dir().
+ Use HAVE_STRING_H instead of USG.
+ Added os2/Makefile.os2
+ Use SYSUTIME on OS/2.
+ Info dir is $(prefix)/info, not $(prefix)/lib/info.
+ Support long options, added getopt and alloca
+ Support -V and -t
+ Reorder configure.in according to suggestions in autoconf.info
+ Allow links when not removing original file
+ Allow either .z or .Z in zdiff
+
+Wed Nov 25 11:40:04 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.4.1
+ Save only the original base name, don't include any directory prefix.
+ Don't use HAVE_LONG_FILE_NAMES (support multiple file system types).
+ Fix declaration of abort_gzip in gzip.h.
+ Include unistd.h when it exists to avoid warnings with gcc -Wall.
+
+Mon Nov 23 12:39:01 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.4
+ Lots of cleanup
+ Use autoconf generated 'configure'
+ Fixed the NO_MULTIPLE_DOTS code
+ Fixed the save_orig_name code
+ Support for MSDOS (Turbo C)
+
+Thu Nov 19 15:18:22 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Beta version 0.3
+ Added auto configuration. Just type "make" now.
+ Don't overwrite compress by default in "make install". Use
+ "make install_compress" to overwrite.
+ Add match.s for 386 boxes.
+ Added documentation in texinfo format.
+ Provide help for "gunzip" invoked without redirected input.
+ Save original file name when necessary.
+ Support OS/2 (Kai-Uwe Rommel).
+
+Tue Nov 17 14:32:53 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Alpha version 0.2.4
+ Return 0 in get_istat() when ok (caused error with zcat).
+ Don't update crc on compressed data (caused crc errors on
+ large files).
+
+Fri Nov 13 15:04:12 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Alpha version 0.2.3
+ Initialize rsize in unlzw.c
+ Initialize ofd for zcat.
+ Do not use volatile ifname as argument of treat_dir.
+ Add -1 to -9 in gzip.1.
+
+Sat Oct 31 18:30:00 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Alpha version 0.2.2.
+ Fix error messages.
+ Accept gunzip on zip files.
+
+Sat Oct 31 17:15:00 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Alpha version 0.2.1
+ Use ctype.h in util.c (problem on SysV).
+ Create BINDIR if it does not exist.
+ Use cc by default.
+ Added zcmp, zmore, zdiff.
+ Fixed the man page gzip.1.
+
+Sat Oct 31 17:00:00 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Alpha version 0.2
+ Fixed compilation problems with gcc
+
+Sat Oct 31 12:46:00 1992 Jean-loup Gailly (jloup@chorus.fr)
+
+ * Alpha version 0.1 released (under time pressure), so it's not
+ much tested, sorry.
+
diff --git a/Build/source/utils/gzip/INSTALL b/Build/source/utils/gzip/INSTALL
new file mode 100644
index 00000000000..b20116541d5
--- /dev/null
+++ b/Build/source/utils/gzip/INSTALL
@@ -0,0 +1,273 @@
+This is a generic INSTALL file for utilities distributions.
+Some features specific to gzip have been added.
+
+To compile this package:
+
+1. Configure the package for your system. In the directory that this
+file is in, type `./configure'. If you're using `csh' on an old
+version of System V, you might need to type `sh configure' instead to
+prevent `csh' from trying to execute `configure' itself. If you
+are using Ultrix, you might need to type `sh5 configure' to avoid
+bugs in /bin/sh. Note that 'sh -x configure' may give different results
+than 'sh configure', making it difficult to debug configure scripts.
+
+The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation, and
+creates the Makefile(s) (one in each subdirectory of the source
+directory). In some packages it creates a C header file containing
+system-dependent definitions. It also creates a file `config.status'
+that you can run in the future to recreate the current configuration.
+
+Running `configure' takes a minute or two. While it is running, it
+prints some messages that tell what it is doing. If you don't want to
+see the messages, run `configure' with its standard output redirected
+to `/dev/null'; for example, `./configure >/dev/null'.
+
+To compile the package in a different directory from the one
+containing the source code, you must use a version of `make' that
+supports the VPATH variable, such as GNU `make'. `cd' to the directory
+where you want the object files and executables to go and run
+`configure'. `configure' automatically checks for the source code in
+the directory that `configure' is in and in `..'. If for some reason
+`configure' is not in the source code directory that you are
+configuring, then it will report that it can't find the source code.
+In that case, run `configure' with the option `--srcdir=DIR', where
+DIR is the directory that contains the source code.
+
+By default, `make install' will install the package's files in
+/usr/local/bin, /usr/local/lib, /usr/local/man, etc. You can specify an
+installation prefix other than /usr/local by giving `configure' the option
+`--prefix=PATH'. Alternately, you can do so by consistently giving a value
+for the `prefix' variable when you run `make', e.g.,
+ make prefix=/usr/gnu
+ make prefix=/usr/gnu install
+
+You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If
+you give `configure' the option `--exec-prefix=PATH' or set the
+`make' variable `exec_prefix' to PATH, the package will use PATH as
+the prefix for installing programs and libraries. Data files and
+documentation will still use the regular prefix. Normally, all files
+are installed using the regular prefix.
+
+Another `configure' option is useful mainly in `Makefile' rules for
+updating `config.status' and `Makefile'. The `--no-create' option
+figures out the configuration for your system and records it in
+`config.status', without actually configuring the package (creating
+`Makefile's and perhaps a configuration header file). Later, you can
+run `./config.status' to actually configure the package. You can also
+give `config.status' the `--recheck' option, which makes it re-run
+`configure' with the same arguments you used before. This option is
+useful if you change `configure'.
+
+`configure' ignores any other arguments that you give it.
+
+If your system requires unusual options for compilation or linking
+that `configure' doesn't know about, you can give `configure' initial
+values for some variables by setting them in the environment. In
+Bourne-compatible shells, you can do that on the command line like
+this:
+ CC='gcc -traditional' DEFS=-D_POSIX_SOURCE ./configure
+
+For csh compatible shells, you can do something like this:
+
+ (setenv CC 'gcc -traditional' ; ./configure)
+
+The `make' variables that you might want to override with environment
+variables when running `configure' are:
+
+(For these variables, any value given in the environment overrides the
+value that `configure' would choose:)
+CC C compiler program.
+ Default is `cc', or `gcc' if `gcc' is in your PATH.
+INSTALL Program to use to install files.
+ Default is `install' if you have it, `cp' otherwise.
+ If you have an non-standard `install', use INSTALL="cp -p"
+
+(For these variables, any value given in the environment is added to
+the value that `configure' chooses:)
+DEFS Configuration options, in the form `-Dfoo -Dbar ...'
+CFLAGS Compiler options, such as `-O -g ...'
+LIBS Libraries to link with, in the form `-lfoo -lbar ...'
+
+If you need to do unusual things to compile the package, we encourage
+you to figure out how `configure' could check whether to do them, and
+mail diffs or instructions to the address given in the README so we
+can include them in the next release.
+
+2. Type `make' to compile the package. If you want, you can override
+the `make' variables CFLAGS and LDFLAGS like this:
+
+ make CFLAGS=-O2 LDFLAGS=-s
+
+3. The package comes with self-tests. If you want to run them,
+type `make check'.
+
+4. Type `make install' to install programs, data files, and
+documentation. This creates links between gzip, gunzip and zcat.
+You can create additional links uncompress, ungzip and gzcat if
+you prefer these names. You can also create links to unpack and pcat
+if your system uses packed files by default and you want to transform
+them transparently to gzip'ed files.
+
+If you wish to use only the name gzcat and not overwrite an existing zcat, use:
+
+ make ZCAT=gzcat install
+
+The man pages are installed by default with an extension `.1' (one).
+If you want the extension `.l' (lower case L) use:
+
+ make manext=l install
+
+If you are using csh or tcsh, you must type `rehash' after `make install'
+to make sure that the command `gzip' will invoke the new executable.
+
+5. You can remove the program binaries and object files from the
+source directory by typing `make clean'. To also remove the
+Makefile(s), the header file containing system-dependent definitions
+(if the package uses one), and `config.status' (all the files that
+`configure' created), type `make distclean'.
+
+The file `configure.in' is used as a template to create `configure' by
+a program called `autoconf'. You will only need it if you want to
+regenerate `configure' using a newer version of `autoconf'.
+
+6. You can add the following lines to your /etc/magic file so that
+file(1), if your system supports it, will recognize files created by
+gzip:
+
+0 string \037\213 gzip compressed data
+>2 byte 8 - deflate method
+>3 byte &0x1 , ascii
+>3 byte &0x2 , continuation
+>3 byte &0x4 , extra field
+>3 byte &0x8 , original file name
+>3 byte &0x10 , comment
+>3 byte &0x20 , encrypted
+>8 byte 2 , max compression
+>8 byte 4 , max speed
+
+If your version of 'file' does not accept octal numbers in strings, replace the
+first line with one of these:
+
+0 short 0x8b1f gzip compressed data
+0 short 0105437 gzip compressed data
+
+0 short 0x1f8b gzip compressed data
+0 short 017613 gzip compressed data
+
+Use the first or second form if your machine is a 386 or a Vax or a
+MIPS configured in little-endian mode or any other little-endian
+machine. Use the third or fourth form on big-endian machines.
+On some systems, the field separators must contain only tabs (no spaces).
+
+7. To rename .z files with the new .gz suffix, you can use or adapt
+ the following shell script:
+
+#!/bin/sh
+find . -name '*.z' -type f -print | while read i
+do
+ new=`echo "$i" | sed 's/\.z$/.gz/'`
+ mv "$i" "$new" || echo Failed renaming $i to $new
+done
+
+If you wish to keep the old .z suffix as default without setting the
+GZIP environment variable to "--suffix .z", you can compile gzip with:
+
+ make CFLAGS='-DZ_SUFFIX=\".z\"'
+
+
+8. Special targets
+
+- For MSDOS, OS/2, VMS, Atari, Amiga, Primos, use the makefile or command
+ file provided in the appropriate subdirectory. For Turbo C++ 1.0, read
+ the warning at the top of Makefile.bor.
+
+- On some systems memcpy() may not work as expected. (Problem found on
+ Pyramid only so far.) If you get "crc error" on some .gz files, add
+ -DNOMEMCPY to CFLAGS and recompile inflate.o. For example:
+ rm -f inflate.o
+ make CFLAGS="-O2 -DNOMEMCPY"
+
+ The memcpy problem affects only gunzip, not gzip. You can safely define
+ -DNOMEMCPY on all systems, but this may degrade performance of gunzip.
+
+- If your system is a pure BSD system but incorrectly links string.h to
+ strings.h, you may get undefined mem* and str* symbols. Try recompiling with
+
+ make clean
+ make CFLAGS="-DNO_STRING_H"
+
+- On some systems (reported on Dec Ultrix), "cc -E" and /lib/cpp behave
+ differently. If you have trouble with the default configuration, try:
+
+ CPP=/lib/cpp ./configure
+ make clean
+ make
+
+- On Ultrix, /bin/sh is too buggy. Use "sh5 configure" instead of "configure".
+
+- On Mips Dec Ultrix, gunzip behaves non-deterministically with regard
+ to some .gz files. The same command either succeeds or gives a CRC error.
+ This problem is still being investigated. The files produced by gzip
+ are correct (can reliably be extracted on other systems).
+
+- On Xenix, some preprocessors do not define M_XENIX. You may have to do:
+
+ DEFS='-DM_XENIX' ./configure
+
+- On Xenix 2.3.2 for 286, do: make xenix_286
+
+- On Coherent, do: make coherent
+
+- On NeXTstep 3.1, many people (but not all) have had trouble with
+ configure. Try first
+
+ (setenv DEFS -DNO_UTIME_H; ./configure)
+ make test
+
+ If this fails, then try "make next". configure should work correctly
+ on NeXTstep versions up to 3.0.
+
+ To build a gzip package that can run on either the m68k or i386 family,
+ use configure then "make next-fat".
+
+ On some versions of NeXT, either "cc -finline-functions" or "cc -O4"
+ is broken. gzip produces valid .gz files but they are much too large
+ because the string matching code misses most matches. Use "cc -O" instead.
+
+- There is an optimization bug in the IRIX 4.0.5 IDO 4.1 assembler which is
+ triggered by GCC -O. IDO 4.1.1 should fix this. If you have to use IDO 4.1
+ then you can avoid the bug in one of the following ways:
+
+ 1. Use SGI CC
+ 2. Add the -noasmopt flag to GCC
+ 3. Reconfigure GCC with the "mips-sgi-irix4loser" target which effectively
+ does the same as specifying "-noasmopt" all by default.
+ 4. Don't use -O at all with GCC.
+
+- On Solaris 2.1 for x86, the January 1993 "OEM" compiler release
+ generates bad code. This is fixed in the June 1993 "FCS" release.
+
+- on Sparc with SunOS 4.1.1 and the SC1.0 compiler, the optimizer
+ works up to -O3 but -O4 does not work.
+
+- MSC 5.1 with -Ox and -DDYN_ALLOC generates bad code in inflate.c.
+ The default is static allocation (no DYN_ALLOC) and -Ox works on inflate.c.
+ But -Ox does not work on util.c and unlzh.c, so you must use -Oait -Gs.
+
+- The exit() function in Turbo C++ 1.0 seems to be broken. gzip crashes
+ even if exit(0) is the first statement in main(). The problem is avoided
+ by adding -Dexit=_exit to CFLAGS in Makefile.bor.
+
+- On dnix 5.3 2.2 cc version 2.37c is buggy. Version 2.38d works.
+
+- On an Alliant running Concentrix, cc (even without optimization) generates
+ incorrect code. You have to use gcc.
+
+- On Cray running CSOS 1.0 with compiler version dev-125, you must compile
+ with the flag "-hnoopt" to avoid an optimizer bug.
+
+- On HPUX, configure can't find a correct install. Use:
+
+ INSTALL=/usr/local/bin/bsdinst ./configure
diff --git a/Build/source/utils/gzip/Makefile.in b/Build/source/utils/gzip/Makefile.in
new file mode 100644
index 00000000000..40906a2be81
--- /dev/null
+++ b/Build/source/utils/gzip/Makefile.in
@@ -0,0 +1,386 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# $Id: Makefile.in,v 0.23 1993/06/24 11:51:47 jloup Exp $
+
+#### Start of system configuration section. ####
+
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+CC = @CC@
+ASCPP = @ASCPP@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+# Things you might add to DEFS (configure usually figures out what to do):
+# -DGNU_STANDARD Behave as gzip even if invoked as gunzip (GNU standard)
+# -DDIRENT Use <dirent.h> for recursion (-r)
+# -DSYSDIR Use <sys/dir.h> for recursion (-r)
+# -DSYSNDIR Use <sys/ndir.h> for recursion (-r)
+# -DNDIR Use <ndir.h> for recursion (-r)
+# -DSTDC_HEADERS Use <stdlib.h>
+# -DHAVE_UNISTD_H Use <unistd.h>
+# -DNO_FCNTL_H Don't use <fcntl.h>
+# -DNO_UTIME_H Don't use <utime.h>
+# -DHAVE_SYSUTIME_H Use <sys/utime.h>
+# -DNO_MEMORY_H Don't use <memory.h>. Not needed if STDC_HEADERS.
+# -DNO_STRING_H Use strings.h, not string.h. Not needed if STDC_HEADERS
+# -DRETSIGTYPE=int Define this if signal handlers must return an int.
+# -DNO_SYMLINK OS defines S_IFLNK but does not support symbolic links
+# -DNO_MULTIPLE_DOTS System does not allow file names with multiple dots
+# -DNO_UTIME System does not support setting file modification time
+# -DNO_CHOWN System does not support setting file owner
+# -DNO_DIR System does not support readdir()
+# -DPROTO Force function prototypes even if __STDC__ not defined
+# -DASMV Use asm version match.S
+# -DMSDOS MSDOS specific
+# -DOS2 OS/2 specific
+# -DVAXC Vax/VMS with Vax C compiler
+# -DVMS Vax/VMS with gcc
+# -DDEBUG Debug code
+# -DDYN_ALLOC Use dynamic allocation of large data structures
+# -DMAXSEG_64K Maximum array size is 64K (for 16 bit system)
+# -DRECORD_IO read() and write() are rounded to record sizes.
+# -DNO_STDIN_FSTAT fstat() is not available on stdin
+# -DNO_FSTAT fstat() is not available
+# -DNO_SIZE_CHECK stat() does not give a reliable file size
+
+DEFS = @DEFS@
+LIBS = @LIBS@
+
+# additional assembly sources for particular systems may be required.
+OBJA = @OBJA@
+
+SEDCMD = @SEDCMD@
+
+CFLAGS = @CFLAGS@
+# If you want debug on by default, use: CFLAGS="-g" ./configure
+LDFLAGS = $(CFLAGS)
+
+G=@G@
+# To install znew, zmore, etc... as gznew, gzmore... use: G=g
+
+ZCAT=@ZCAT@
+# To install zcat executable and man page as gzcat, use: ZCAT=gzcat
+
+X=
+# For OS/2 or MSDOS, use: X=.exe
+
+O=.o
+# For OS/2 or MSDOS, use: O=.obj
+
+prefix = /usr/local
+exec_prefix = $(prefix)
+
+bindir = $(exec_prefix)/bin
+scriptdir = $(bindir)
+# scriptdir is the directory in which shell scripts should be installed
+datadir = $(prefix)/lib
+libdir = $(prefix)/lib
+infodir = $(prefix)/info
+
+# Extension (not including `.') for the installed manual page filenames.
+manext = 1
+# Where to install the manual pages.
+mandir = $(prefix)/man/man$(manext)
+# Use manlinks=so to use the .so method instead of hard links
+manlinks = ln
+
+alldirs = $(bindir) $(scriptdir) $(datadir) $(libdir) $(infodir) $(mandir)
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+LOADLIBES = $(LIBS)
+
+TAR = tar
+
+SRCS = gzip.c zip.c deflate.c trees.c bits.c unzip.c inflate.c util.c crypt.c\
+ lzw.c unlzw.c unpack.c unlzh.c getopt.c match.S
+
+OBJS = gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O util$O \
+ crypt$O lzw$O unlzw$O unpack$O unlzh$O getopt$O $(OBJA)
+
+HDRS = gzip.h lzw.h tailor.h revision.h crypt.h getopt.h
+
+GENFILES = README NEWS INSTALL Makefile.in configure.in configure COPYING \
+ TODO THANKS ChangeLog $(SRCS) $(HDRS) zmore.in znew.in zdiff.in zgrep.in \
+ zforce.in gzexe.in gzip.1 zdiff.1 zgrep.1 zmore.1 znew.1 gzexe.1 zforce.1 \
+ gzip.doc algorithm.doc gzip.texi texinfo.tex gpl.texinfo gzip.info
+
+sampleFILES = sample/makecrc.c sample/zread.c sample/add.c sample/sub.c \
+ sample/ztouch sample/zfile
+
+msdosFILES = msdos/tailor.c msdos/match.asm msdos/gzip.prj msdos/doturboc.bat \
+ msdos/Makefile.msc msdos/Makefile.bor msdos/Makefile.djg
+
+os2FILES = os2/Makefile.os2 os2/gzip.def os2/gzip16.def
+
+ntFILES = nt/Makefile.nt
+
+vmsFILES = vms/Readme.vms vms/Makefile.vms vms/Makefile.gcc vms/makegzip.com \
+ vms/Makefile.mms vms/vms.c vms/gzip.hlp
+
+amigaFILES = amiga/Makefile.sasc amiga/Makefile.gcc amiga/tailor.c \
+ amiga/utime.h amiga/match.a
+
+atariFILES = atari/Makefile.st
+
+primosFILES = primos/readme primos/primos.c primos/ci.opts \
+ primos/build.cpl primos/include/errno.h primos/include/fcntl.h \
+ primos/include/stdlib.h primos/include/sysStat.h primos/include/sysTypes.h
+
+DISTFILES = $(GENFILES) $(sampleFILES) $(msdosFILES) $(os2FILES) $(ntFILES)\
+ $(vmsFILES) $(amigaFILES) $(atariFILES) $(primosFILES)
+
+SCRIPTS = $(G)zdiff $(G)zgrep $(G)zmore $(G)znew $(G)zforce gzexe
+
+.c$O:
+ $(CC) -c $(DEFS) $(CFLAGS) $<
+
+#.PHONY: default all force test check
+
+default: gzip$X
+all: gzip$X $(G)zdiff $(G)zgrep $(G)zmore $(G)znew $(G)zforce gzexe
+force:
+
+#### Start of specific targets section. ####
+#
+# 'configure' works only on Unix systems. For other systems able to make
+# sense of this makefile, you can define target specific entries here.
+# For other systems such as MSDOS, separate Makefiles are
+# provided in subdirectories.
+
+# NeXT 2.x, 3.0, 3.1 thin. For gcc, replace -bsd with -D__STRICT_BSD__.
+next:
+ $(MAKE) all CFLAGS="-O -bsd -DASMV" \
+ DEFS="-DNO_STDLIB_H -DNO_STRING_H -DNO_UTIME_H -DSYSDIR -DRETSIGTYPE=int"
+
+# NeXT 3.1 fat (68k + 386). For gcc, replace -bsd with -D__STRICT_BSD__.
+next-fat:
+ $(MAKE) all OBJA=match-next.o \
+ CFLAGS="-O2 -bsd -DASMV -fno-builtin -arch m68k -arch i386" \
+ DEFS="-DNO_STDLIB_H -DNO_STRING_H -DNO_UTIME_H -DSYSDIR -DRETSIGTYPE=int"
+
+match-next.o: match.S
+ cat $(srcdir)/match.S > match-next.s
+ $(CC) -arch m68k -arch i386 -c match-next.s
+ rm -f match-next.s
+
+# gcc with emx 0.8f kit (use by preference os2/Makefile.os2)
+os2_gcc:
+ $(MAKE) all CC=gcc CFLAGS="-O -DOS2" X=".exe"
+
+# Xenix 2.3.2 for 286:
+xenix_286:
+ $(MAKE) all CFLAGS="-LARGE -M2l"
+
+# Coherent (with broken /bin/sh):
+coherent:
+ $(MAKE) all OBJA=match.o DEFS=\
+ "-DASMV -DSTDC_HEADERS=1 -DHAVE_UNISTD_H=1 -DDIRENT=1"
+
+#### End of specific targets section. ####
+
+install: installdirs installbin installman
+
+installbin: all
+ $(INSTALL_PROGRAM) gzip$X $(bindir)/gzip$X
+ for f in $(SCRIPTS); do \
+ $(INSTALL_PROGRAM) $${f} $(scriptdir)/$${f}; done
+ rm -f $(scriptdir)/$(G)zcmp; \
+ ln $(scriptdir)/$(G)zdiff $(scriptdir)/$(G)zcmp
+ for f in gunzip$X ungzip$X $(ZCAT)$X ; do \
+ rm -f $(bindir)/$${f}; done
+ @if echo $(DEFS) | grep GNU_STANDARD > /dev/null; then \
+ echo 'exec gzip -d $${1+"$$@"}' > $(bindir)/gunzip$X; \
+ echo 'exec gzip -dc $${1+"$$@"}' > $(bindir)/$(ZCAT)$X; \
+ chmod 755 $(bindir)/gunzip$X $(bindir)/$(ZCAT)$X; \
+ else \
+ ln $(bindir)/gzip$X $(bindir)/gunzip$X; \
+ ln $(bindir)/gzip$X $(bindir)/$(ZCAT)$X; \
+ fi
+
+installman: gzip.info
+ for f in gzip gunzip $(ZCAT) $(SCRIPTS) $(G)zcmp; do \
+ rm -f $(mandir)/$${f}.$(manext); done
+ -cd $(srcdir); for f in gzip gzexe; do \
+ $(INSTALL_DATA) $${f}.1 $(mandir)/$${f}.$(manext); done
+ -cd $(srcdir); for f in zdiff zgrep zmore znew zforce; do \
+ $(INSTALL_DATA) $${f}.1 $(mandir)/$(G)$${f}.$(manext); done
+ -cd $(mandir); if test $(manlinks) = so; then \
+ echo .so man$(manext)/gzip.$(manext) > $(ZCAT).$(manext);\
+ echo .so man$(manext)/$(G)zdiff.$(manext) > $(G)zcmp.$(manext);\
+ echo .so man$(manext)/gzip.$(manext) > gunzip.$(manext);\
+ chmod 644 $(ZCAT).$(manext) $(G)zcmp.$(manext) gunzip.$(manext);\
+ else \
+ ln gzip.$(manext) $(ZCAT).$(manext);\
+ ln $(G)zdiff.$(manext) $(G)zcmp.$(manext);\
+ ln gzip.$(manext) gunzip.$(manext);\
+ fi
+ -cd $(srcdir); for f in gzip.info* ; do $(INSTALL_DATA) $${f} \
+ $(infodir)/$${f}; done
+
+uninstall: force
+ -cd $(bindir); rm -f gzip$X gunzip$X $(ZCAT)$X
+ -cd $(scriptdir); rm -f $(SCRIPTS) $(G)zcmp
+ -for f in gzip gunzip $(ZCAT) $(SCRIPTS) $(G)zcmp; do \
+ rm -f $(mandir)/$${f}.$(manext); done
+ -cd $(infodir); rm -f gzip.info*
+
+# install all files and replace compress (not recommended)
+install_compress: install
+ -test -f $(bindir)/compress.old || \
+ mv $(bindir)/compress$X $(bindir)/compress.old
+ ln $(bindir)/gzip$X $(bindir)/compress$X
+ rm -f $(bindir)/uncompress$X
+ ln $(bindir)/gzip$X $(bindir)/uncompress$X
+
+# Make sure all installation directories, e.g. $(bindir) actually exist by
+# making them if necessary. At most one level is created (except for man).
+installdirs:
+ -if test ! -d $(prefix)/man; then \
+ mkdir $(prefix)/man; fi
+ -for dir in $(alldirs) ; do \
+ if test ! -d $${dir}; then \
+ mkdir $${dir}; fi; \
+ done
+
+test: check
+check: gzip$X
+ ./gzip -6 < $(srcdir)/texinfo.tex > _gztest.gz
+ @LANG=""; export LANG; if test `wc -c < _gztest.gz` -eq 30890; then \
+ true; \
+ else \
+ echo FAILED gzip test: incorrect size; \
+ fi
+ rm -f _gztest
+ ./gzip -d _gztest.gz
+ @if cmp _gztest $(srcdir)/texinfo.tex; then \
+ echo gzip test OK; \
+ else \
+ echo FAILED gzip test: incorrect decompress; \
+ fi
+ rm -f _gztest*
+
+TAGS: $(SRCS) $(HDRS)
+ cd $(srcdir); etags $(SRCS) $(HDRS)
+
+Makefile: Makefile.in ./config.status
+ ./config.status
+
+./config.status: configure
+ $(srcdir)/configure --srcdir=$(srcdir) --no-create
+
+configure: configure.in
+ @echo Warning: configure is out of date
+# cd $(srcdir); autoconf
+
+clean:
+ rm -f *$O gzip$X gunzip$X ungzip$X $(ZCAT)$X add$X sub$X a.out core
+ rm -f $(G)zcmp $(SCRIPTS) _gztest*
+ rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log
+ rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs
+
+mostlyclean: clean
+
+distclean: clean
+ rm -f Makefile config.status
+
+realclean: distclean
+ rm -f TAGS gzip.info* gzip.doc
+
+dist: $(DISTFILES) Makefile
+ d=gzip-`sed -e '/VERSION/!d' -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
+ -e q revision.h` ; \
+ rm -f ../$$d; \
+ ln -s `pwd` ../$$d; \
+ cd ..; \
+ files=""; \
+ for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
+ GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
+ rm -f $$d
+
+zipdist: $(DISTFILES) Makefile
+ zip -u9T gzip`sed -e '/VERSION/!d' -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
+ -e s/[.]//g -e q revision.h` $(DISTFILES)
+
+# Actual build-related targets
+
+gzip$X: Makefile $(OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+ rm -f gunzip$X $(ZCAT)$X
+ ln gzip$X gunzip$X
+ ln gzip$X $(ZCAT)$X
+
+gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O: gzip.h tailor.h
+util$O lzw$O unlzw$O unpack$O unlzh$O crypt$O: gzip.h tailor.h
+
+gzip$O unlzw$O: revision.h lzw.h
+
+bits$O unzip$O util$O zip$O: crypt.h
+
+gzip$O getopt$O: getopt.h
+
+match$O: match.S
+ $(ASCPP) $(srcdir)/match.S > _match.s
+ $(CC) -c _match.s
+ mv _match$O match$O
+ rm -f _match.s
+
+$(G)zdiff: zdiff.in
+ sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zdiff.in > $@
+ chmod 755 $@
+
+$(G)zgrep: zgrep.in
+ sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zgrep.in > $@
+ chmod 755 $@
+
+$(G)zmore: zmore.in
+ sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zmore.in > $@
+ chmod 755 $@
+
+$(G)znew: znew.in
+ sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/znew.in > $@
+ chmod 755 $@
+
+$(G)zforce: zforce.in
+ sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zforce.in > $@
+ chmod 755 $@
+
+gzexe: gzexe.in
+ sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/gzexe.in > $@
+ chmod 755 $@
+
+gzip.info: gzip.texi
+ cd $(srcdir); makeinfo gzip.texi
+
+gzip.dvi: gzip.texi
+ cd $(srcdir); texi2dvi gzip.texi
+
+gzip.doc: gzip.1
+ nroff -man $(srcdir)/gzip.1 | col -b | uniq > gzip.doc
+
+# Prevent GNU make v3 from overflowing arg limit on SysV.
+.NOEXPORT:
+
+# end of file
diff --git a/Build/source/utils/gzip/NEWS b/Build/source/utils/gzip/NEWS
new file mode 100644
index 00000000000..ef5f83359ee
--- /dev/null
+++ b/Build/source/utils/gzip/NEWS
@@ -0,0 +1,221 @@
+Current Version: 1.2.4.
+See the file ChangeLog for the details of all changes.
+
+Major changes from 1.2.3 to 1.2.4
+* By default, do not restore file name and timestamp from those saved
+ inside the .gz file (behave as 'compress'). Added the --name option
+ to force name and timestamp restoration.
+* Accept - as synonym for stdin.
+* Use manlinks=so or ln to support either hard links or .so in man pages
+* Accept foo.gz~ in zdiff.
+* Added support for Windows NT
+* Handle ENAMETOOLONG for strict Posix systems
+* Use --recursive instead of --recurse to comply with Webster and
+ the GNU stdandard.
+* Allow installation of shell scripts with a g prefix: make G=g install
+* Install by default zcat as gzcat if gzcat already exists in path.
+* Let zmore behave as more when invoked without parameters (give help)
+* Let gzip --list reject files not in gzip format even with --force.
+* Don't complain about non gzip files for options -rt or -rl.
+* Added advice in INSTALL for several systems.
+
+Major changes from 1.2.2 to 1.2.3
+* Don't display the output name when decompressing except with --verbose.
+* Remove usage of alloca in getopt.c and all makefiles.
+* Added the zfile shell script in subdirectory sample.
+* Moved the list of compiler bugs from README to INSTALL.
+* Added vms/Readme.vms.
+
+Major changes from 1.2.1 to 1.2.2
+* Fix a compilation error on Sun with cc (worked with gcc).
+
+Major changes from 1.2 to 1.2.1
+* Let zmore act as more if the data is not gzipped.
+* made gzexe more secure (don't rely on PATH).
+* By default, display output name only when the name was actually truncated.
+
+Major changes from 1.1.2 to 1.2
+* Added the --list option to display the file characteristics.
+* Added the --no-name option: do not save or restore original filename
+ Save the original name by default.
+* Allow gunzip --suffix "" to attempt decompression on any file
+ regardless of its extension if an original name is present.
+* Add support for the SCO compress -H format.
+* gzip --fast now compresses faster (speed close to that of compress)
+ with degraded compression ratio (but still better than compress).
+ Default level changed to -6 (acts exactly as previous level -5) to
+ be a better indication of its placement in the speed/ratio range.
+* Use smart name truncation: 123456789012.c -> 123456789.c.gz
+ instead of 12345678901.gz
+* With --force, let zcat pass non gzip'ed data unchanged (zcat == cat)
+* Added the zgrep shell script.
+* Made sub.c useful for 16 bit sound, 24 bit images, etc..
+* Supress warnings about suffix for gunzip -r, except with --verbose.
+* On MSDOS, use .gz extension when possible (files without extension)
+* Moved the sample programs to a subdirectory sample.
+* Added a "Special targets" section in INSTALL.
+
+Major changes from 1.1.1 to 1.1.2.
+* Fix serious bug for VMS (-gz not removed when decompressing).
+* Allow suffix other than .gz in znew.
+* Do not display compression ratio when decompressing stdin.
+* In zmore.in, work around brain damaged stty -g (Ultrix).
+* Display a correct compression ratio for .Z files.
+* Added .z to .gz renaming script in INTALL.
+* Allow setting CFLAGS in configure.
+
+Major changes from 1.1 to 1.1.1.
+* Fix serious bug in vms.c (affects Vax/VMS only).
+* Added --ascii option.
+* Add workaround in configure.in for Ultrix (quote eval argument)
+
+Major changes from 1.0.7 to 1.1.
+* Use .gz suffix by default, add --suffix option.
+* Let gunzip accept a "_z" suffix (used by one 'compress' on Vax/VMS).
+* Quit when reading garbage from stdin instead of reporting an error.
+* Added makefile for VAX/MMS and support for wildcards on VMS.
+* Added support for MSC under OS/2.
+* Added support for Prime/PRIMOS.
+* Display compression ratio also when decompressing (with --verbose).
+* Quit after --version (GNU standard)
+* Use --force to bypass isatty() check
+* Continue processing other files in case of recoverable error.
+* Added comparison of zip and gzip in the readme file.
+* Added small sample programs (ztouch, sub, add)
+* Use less memory when compiled with -DSMALL_MEM (for MSDOS).
+* Remove the "off by more than one minute" time stamp kludge
+
+Major changes from 1.0.6 to 1.0.7.
+* Allow zmore to read from standard input (like more).
+* Support the 68000 (Atari ST) in match.S.
+* Retry partial writes (required on Linux when gzip is suspended in a pipe).
+* Allow full pathnames and renamings in gzexe.
+* Don't let gzexe compress setuid executables or gzip itself.
+* Added vms/Makefile.gcc for gcc on the Vax.
+* Allow installation of binaries and shell scripts in different dirs.
+* Allows complex PAGER variable in zmore (e.g.: PAGER="col -x | more")
+* Allow installation of zcat as gzcat.
+* Several small changes for portability to old or weird systems.
+* Suppress help message and send compressed data to the terminal when
+ gzip is invoked without parameters and without redirection.
+* Add compile option GNU_STANDARD to respect the GNU coding standards:
+ with -DGNU_STANDARD, behave as gzip even if invoked under the name gunzip.
+(I don't like the last two changes, which were requested by the FSF.)
+
+Major changes from 1.0.5 to 1.0.6.
+* Let gzexe detect executables that are already gzexe'd.
+* Keep file attributes in znew and gzexe if cpmod is available.
+* Don't try restoring record format on VMS (1.0.5 did not work correctly)
+* Added asm version for 68000 in amiga/match.a.
+ Use asm version for Atari TT and NeXT.
+* For OS/2, assume HPFS by default, add flag OS2FAT if necessary.
+* Fixed some bugs in zdiff and define zcmp as a link to zdiff.
+
+
+Major changes from 1.0.4 to 1.0.5.
+* For VMS, restore the file type for variable record format, otherwise
+ extract in fixed length format (not perfect, but better than
+ forcing all files to be in stream_LF format).
+* For VMS, use "-z" default suffix and accept a version number in file names.
+* For Unix, allow compression of files with name ending in 'z'. Use only
+ .z, .*-z, .tgz, .taz as valid gzip extensions. In the last two cases,
+ extract to .tar by default.
+* On some versions of MSDOS, files with a 3 character extension could not
+ be compressed.
+* Garbage collect files in /tmp created by gzexe.
+* Fix the 'OS code' byte in the gzip header.
+* For the Amiga, add the missing utime.h and add support for gcc.
+
+
+Major changes from 1.0.3 to 1.0.4.
+* Added optimized asm version for 68020.
+* Add support for DJGPP.
+
+* Add support for the Atari ST.
+* Added zforce to rename gzip'ed files with truncated names.
+* Do not install with name uncompress (some systems rely on the
+ absence of any check in the old uncompress).
+* Added missing function (fcfree) in msdos/tailor.c
+* Let gunzip handle .tgz files, and let gzip skip them.
+* Added -d option (decompress) for gzexe and try preserving file permissions.
+* Suppress all warnings with -q.
+* Use GZIP_OPT for VMS to avoid conflict with program name.
+* ... and many other small changes (see ChangeLog)
+
+
+Major changes from 1.0.2 to 1.0.3
+* Added -K option for znew to keep old .Z files if smaller
+* Added -q option (quiet) to cancel -v in GZIP env variable.
+* Made gzexe safer on systems with filename limitation to 14 chars.
+* Fixed bugs in handling of GZIP env variable and incorrect free with Turbo C.
+
+
+Major changes from 1.0.1 to 1.0.2
+* Added env variable GZIP for default options. Example:
+ for sh: GZIP="-8 -v"; export GZIP
+ for csh: setenv GZIP "-8 -v"
+* Added support for the Amiga.
+* znew now keeps the old .Z if it is smaller than the .z file.
+ This can happen for some large and very redundant files.
+* Do not complain about trailing garbage for record oriented IO (Vax/VMS).
+ This implies however that multi-part gzip files are not supported
+ on such systems.
+* Added gzexe to compress rarely used executables.
+* Reduce memory usage (required for MSDOS and useful on all systems).
+* Preserve time stamp in znew -P (pipe option) if touch -r works.
+
+
+Major changes from 1.0 to 1.0.1
+* fix trivial errors in the Borland makefile (msdos/Makefile.bor)
+
+
+Major changes from 0.8.2 to 1.0
+* gzip now runs on Vax/VMS
+* gzip will not not overwrite files without -f when using /bin/sh in
+ background.
+* Support the test option -t for compressed (.Z) files.
+ Allow some data recovery for bad .Z files.
+* Added makefiles for MSDOS (Only tested for MSC, not Borland).
+* still more changes to configure for several systems
+
+
+Major changes from 0.8.1 to 0.8.2:
+* yet more changes to configure for Linux and other systems
+* Allow zcat on a file with multiple links.
+
+
+Major changes from 0.8 to 0.8.1:
+* znew has now a pipe option -P to reduce the disk space requirements,
+ but this option does not preserve timestamps.
+* Fixed some #if directives for compilation with TurboC.
+
+
+Major changes from 0.7 to 0.8:
+* gzip can now extract .z files created by 'pack'.
+* configure should no longer believe that every machine is a 386
+* Fix the entry for /etc/magic in INSTALL.
+* Add patch for GNU tar 1.11.1 and a pointer to crypt++.el
+* Uncompress files with multiple links only with -f.
+* Fix for uncompress of .Z files on 16-bit machines
+* Create a correct output name for file names of exactly N-1 chars when
+ the system has a limit of N chars.
+
+
+Major changes from 0.6 to 0.7:
+* Use "make check" instead of "make test".
+* Keep time stamp and pass options to gzip in znew.
+* Do not create .z.z files with gzip -r.
+* Allow again gunzip .zip files (was working in 0.5)
+* Allow again compilation with TurboC 2.0 (was working in 0.4)
+
+
+Major changes form 0.5 to 0.6:
+* gunzip reported an error when extracting certain .z files. The .z files
+ produced by gzip 0.5 are correct and can be read by gunzip 0.6.
+* gunzip now supports multiple compressed members within a single .z file.
+* Fix the check for i386 in configure.
+* Added "make test" to check for compiler bugs. (gcc -finline-functions
+ is broken at least on the NeXT.)
+* Use environment variable PAGER in zmore if it is defined.
+* Accept gzcat in addition to zcat for people having /usr/bin before
+ /usr/local/bin in their path.
diff --git a/Build/source/utils/gzip/README b/Build/source/utils/gzip/README
new file mode 100644
index 00000000000..e6f425191dd
--- /dev/null
+++ b/Build/source/utils/gzip/README
@@ -0,0 +1,143 @@
+This is the file README for the gzip distribution, version 1.2.4.
+
+gzip (GNU zip) is a compression utility designed to be a replacement
+for 'compress'. Its main advantages over compress are much better
+compression and freedom from patented algorithms. The GNU Project
+uses it as the standard compression program for its system.
+
+gzip currently uses by default the LZ77 algorithm used in zip 1.9 (the
+portable pkzip compatible archiver). The gzip format was however
+designed to accommodate several compression algorithms. See below
+for a comparison of zip and gzip.
+
+gunzip can currently decompress files created by gzip, compress or
+pack. The detection of the input format is automatic. For the
+gzip format, gunzip checks a 32 bit CRC. For pack, gunzip checks the
+uncompressed length. The 'compress' format was not designed to allow
+consistency checks. However gunzip is sometimes able to detect a bad
+.Z file because there is some redundancy in the .Z compression format.
+If you get an error when uncompressing a .Z file, do not assume that
+the .Z file is correct simply because the standard uncompress does not
+complain. This generally means that the standard uncompress does not
+check its input, and happily generates garbage output.
+
+gzip produces files with a .gz extension. Previous versions of gzip
+used the .z extension, which was already used by the 'pack'
+Huffman encoder. gunzip is able to decompress .z files (packed
+or gzip'ed).
+
+Several planned features are not yet supported (see the file TODO).
+See the file NEWS for a summary of changes since 0.5. See the file
+INSTALL for installation instructions. Some answers to frequently
+asked questions are given in the file INSTALL, please read it. (In
+particular, please don't ask me once more for an /etc/magic entry.)
+
+WARNING: on several systems, compiler bugs cause gzip to fail, in
+particular when optimization options are on. See the section "Special
+targets" at the end of the INSTALL file for a list of known problems.
+For all machines, use "make check" to check that gzip was compiled
+correctly. Try compiling gzip without any optimization if you have a
+problem.
+
+Please send all comments and bug reports by electronic mail to
+<bug-gzip@gnu.org>.
+
+Bug reports should ideally include:
+
+ * The complete output of "gzip -V" (or the contents of revision.h
+ if you can't get gzip to compile)
+ * The hardware and operating system (try "uname -a")
+ * The compiler used to compile (if it is gcc, use "gcc -v")
+ * A description of the bug behavior
+ * The input to gzip, that triggered the bug
+
+If you send me patches for machines I don't have access to, please test them
+very carefully. gzip is used for backups, it must be extremely reliable.
+
+The package crypt++.el is highly recommended to manipulate gzip'ed
+file from emacs. It recognizes automatically encrypted and compressed
+files when they are first visited or written. It is available via
+anonymous ftp to roebling.poly.edu [128.238.5.31] in /pub/crypt++.el.
+The same directory contains also patches to dired, ange-ftp and info.
+GNU tar 1.11.2 has a -z option to invoke directly gzip, so you don't have to
+patch it. The package ftp.uu.net:/languages/emacs-lisp/misc/jka-compr19.el.Z
+also supports gzip'ed files.
+
+The znew and gzexe shell scripts provided with gzip benefit from
+(but do not require) the cpmod utility to transfer file attributes.
+It is available by anonymous ftp on gatekeeper.dec.com in
+/.0/usenet/comp.sources.unix/volume11/cpmod.Z.
+
+The sample programs zread.c, sub.c and add.c in subdirectory sample
+are provided as examples of useful complements to gzip. Read the
+comments inside each source file. The perl script ztouch is also
+provided as example (not installed by default since it relies on perl).
+
+
+gzip is free software, you can redistribute it and/or modify it under
+the terms of the GNU General Public License, a copy of which is
+provided under the name COPYING. The latest version of gzip are always
+available by ftp in prep.ai.mit.edu:/pub/gnu, or in any of the prep
+mirror sites:
+
+- sources in gzip-*.tar (or .shar or .tar.gz).
+- Solaris 2 executables in sparc-sun-solaris2/gzip-binaries-*.tar
+- MSDOS lha self-extracting exe in gzip-msdos-*.exe. Once extracted,
+ copy gzip.exe to gunzip.exe and zcat.exe, or use "gzip -d" to decompress.
+ gzip386.exe runs much faster but only on 386 and above; it is compiled with
+ djgpp 1.10 available in directory omnigate.clarkson.edu:/pub/msdos/djgpp.
+
+A VMS executable is available in ftp.spc.edu:[.macro32.savesets]gzip-1-*.zip
+(use [.macro32]unzip.exe to extract). A PRIMOS executable is available
+in ftp.lysator.liu.se:/pub/primos/run/gzip.run.
+OS/2 executables (16 and 32 bits versions) are available in
+ftp.tu-muenchen.de:/pub/comp/os/os2/archiver/gz*-[16,32].zip
+
+Some ftp servers can automatically make a tar.Z from a tar file. If
+you are getting gzip for the first time, you can ask for a tar.Z file
+instead of the much larger tar file.
+
+Many thanks to those who provided me with bug reports and feedback.
+See the files THANKS and ChangeLog for more details.
+
+
+ Note about zip vs. gzip:
+
+The name 'gzip' was a very unfortunate choice, because zip and gzip
+are two really different programs, although the actual compression and
+decompression sources were written by the same persons. A different
+name should have been used for gzip, but it is too late to change now.
+
+zip is an archiver: it compresses several files into a single archive
+file. gzip is a simple compressor: each file is compressed separately.
+Both share the same compression and decompression code for the
+'deflate' method. unzip can also decompress old zip archives
+(implode, shrink and reduce methods). gunzip can also decompress files
+created by compress and pack. zip 1.9 and gzip do not support
+compression methods other than deflation. (zip 1.0 supports shrink and
+implode). Better compression methods may be added in future versions
+of gzip. zip will always stick to absolute compatibility with pkzip,
+it is thus constrained by PKWare, which is a commercial company. The
+gzip header format is deliberately different from that of pkzip to
+avoid such a constraint.
+
+On Unix, gzip is mostly useful in combination with tar. GNU tar
+1.11.2 has a -z option to invoke gzip automatically. "tar -z"
+compresses better than zip, since gzip can then take advantage of
+redundancy between distinct files. The drawback is that you must
+scan the whole tar.gz file in order to extract a single file near
+the end; unzip can directly seek to the end of the zip file. There
+is no overhead when you extract the whole archive anyway.
+If a member of a .zip archive is damaged, other files can still
+be recovered. If a .tar.gz file is damaged, files beyond the failure
+point cannot be recovered. (Future versions of gzip will have
+error recovery features.)
+
+gzip and gunzip are distributed as a single program. zip and unzip
+are, for historical reasons, two separate programs, although the
+authors of these two programs work closely together in the info-zip
+team. zip and unzip are not associated with the GNU project.
+The sources are available by ftp in
+
+ oak.oakland.edu:/pub/misc/unix/zip19p1.zip
+ oak.oakland.edu:/pub/misc/unix/unz50p1.tar-z
diff --git a/Build/source/utils/gzip/THANKS b/Build/source/utils/gzip/THANKS
new file mode 100644
index 00000000000..dd8f7bfd8b3
--- /dev/null
+++ b/Build/source/utils/gzip/THANKS
@@ -0,0 +1,276 @@
+gzip was written by Jean-loup Gailly <gzip@gnu.org>, with portions
+written by Mark Adler (inflate.c), Peter Jannesen (unlzw.c) and
+Haruhiko Okumura (unlzh.c). The zip deflate format was defined by Phil Katz.
+Thanks to those who reported problems and suggested various
+improvements. Here is a partial list of them:
+
+Robert Abramovitz bromo@cougar.tandem.com
+Jay Adams jka@ece.cmu.edu
+Mark Adler madler@cco.caltech.edu
+Edwin Allum edwin@csri.toronto.edu
+Joseph Arceneaux jla@gnu.ai.mit.edu
+Tim Auckland tda10@cus.cam.ac.uk
+Ken-ichiro Aoki aoki@madonna.physics.ucla.edu
+David Ascher da@marlowe.cog.brown.edu
+Eric Backus ericb@lsid.hp.com
+Becky A. Badgett badgett@cs.utexas.edu
+Bo Nygaard Bai bai@iesd.auc.dk
+Dave Barber dbarber@apocalypse.bbn.com
+Rene Beaulieu reneb@distri.hydro.qc.ca
+Neal Becker neal@ctd.comsat.com
+Dieter Becker becker@med-in.uni-sb.de
+Nelson H. F. Beebe beebe@geronimo.math.utah.edu
+Jeff Beadles jeff@onion.rain.com
+David J. N. Begley dbegley@st.nepean.uws.edu.au
+Bob Beresh rberesh@rd.hydro.on.ca
+Jim Bernard jbernard@iola.mines.colorado.edu
+Karl Berry karl@cs.umb.edu
+James W. Birdsall jwbirdsa@picarefy.picarefy.com
+Scott Bolte scott@craycos.com
+Wayne E. Bouchard web@paladine.hacks.arizona.edu
+Marc Boucher marc@cam.org
+Ola Brahammar pt90ob@pt.hk-r.se
+Dave Brennan brennan@hal.com
+Alan Brown dogbowl@dogbox.acme.gen.nz
+Michael L. Brown brown@wi.extrel.com
+Rodney Brown rdb@mel.cocam.oz.au
+Bruce bde@runx.oz.au
+Bill Bumgarner bbum@stone.com
+Leila Burrell-Davis leilabd@syma.sussex.ac.uk
+Roger Butenuth butenuth@ira.uka.de
+Jon Cargille jcargill@cs.wisc.edu
+Bud Carlson bud@isle.pegasus.com
+Lim Fung Chai fclim@i1sin.daq.semi.harris.com
+Wes Chalfant wes@kofax.com
+Andrew A. Chernov ache@astral.msk.su
+Paul Close pdc@lunch.wpd.sgi.com
+Jeff Coffler coffler@jac.enet.dec.com
+Will Colley wcc3@occs.cs.oberlin.edu
+Roger Cornelius sherpa!rac@uunet.uu.net
+Kevin Cosgrove kevinc@tekig6.pen.tek.com
+Stephen J Cowley s.j.cowley@amtp.cam.ac.uk
+Ron Cox roncox@indirect.com
+Frank Crawford frank@photon.ansto.gov.au
+James R. Crawford qralston@cislabs.pitt.edu
+Lawrence Crowl crowl@research.cs.orst.edu
+Klaus Dahlenburg kdburg@incoahe.hanse.de
+William E Davidsen davidsen@ariel.crd.ge.com
+John M. DeDourek dedourek@aixive2.cs.unb.ca
+Jeff Deifik jdeifik@isi.edu
+Vince DeMarco vince@whatnxt.cuc.ab.ca
+Michael De La Rue p91152@cplab.physics.edinburgh.ac.uk
+Jeff Delinck delinck@pa621a.inland.com
+John DeRoo deroo@grout.adv.shr.dec.com
+Jim Diamond zsd@axe.drea.dnd.ca
+Stefano Diomedi sd@teculx.tecsiel.it
+Lawrence R. Dodd dodd@roebling.poly.edu
+Matthew Donadio donadio@mxd120.rh.psu.edu
+Andy Dougherty andy@crystal.phys.lafayette.edu
+Darrell Duane dduane@mason1.gmu.edu
+John Eaton jwe@che.utexas.edu
+Will Edgington wedgingt@ptolemy.arc.nasa.gov
+Brian Edmonds edmonds@edmonds.home.cs.ubc.ca
+Paul Eggert eggert@twinsun.com
+Enami enami@sys.ptg.sony.co.jp
+Kristoffer Eriksson ske@pkmab.se
+Daniel Eriksson m91der@bellatrix.tdb.uu.se
+Rik Faith faith@cs.unc.edu
+Larry Fahnoe fahnoe@c1mpls.mn.org
+Cristian Ferretti cfs@poincare.mat.puc.cl
+Karl-Jose Filler pla_jfi@pki-nbg.philips.de
+Valery Fine fine@vxcern.cern.ch
+Bob Fischer bobf@milne.geology.yale.edu
+Per Foreby perf@efd.lth.se
+Alexander Fraser alex@cs.umb.edu
+Noah Friedman friedman@gnu.ai.mit.edu
+Bob Friesenhahn bfriesen@iphase.com
+Gerhard Friesland-Koepke frieslan@rzdspc3.informatik.uni-hamburg.de
+Andy Fyfe andy@scp.caltech.edu
+Geoff geoff@frs.faxon.com
+Arnd Gerns gerns@informatik.uni-hildesheim.de
+Kaveh R. Ghazi ghazi@staccato.rutgers.edu
+Torbjorn Granlund tege@sics.se
+Carl Greco cgreco@parrot.creighton.edu
+Bruno Haible haible@ma2s2.mathematik.uni-karlsruhe.de
+Junio Hamano junio@shadow.twinsun.com
+Harald Hanche-Olsen hanche@ams.sunysb.edu
+Darrel R. Hankerson hankedr@mail.auburn.edu
+Mark Hanning-Lee markhl@romeo.caltech.edu
+Lars Hecking st000002@hrz1.hrz.th-darmstadt.de
+Ruediger Helsch ruediger@ramz.ing.tu-bs.de
+Mark C. Henderson mch@sqwest.wimsey.bc.ca
+Karl Heuer karl@kelp.boston.ma.us
+Jarkko Hietaniemi jhi@dol-guldur.hut.fi
+Thomas Hiller hiller@fzi.de
+Eiji Hirai hirai@cc.swarthmore.edu
+Kjetil Torgrim Homme kjetilho@ifi.uio.no
+Robert D. Houk rdh@sli.com
+Jim Howard jim_howard@mentorg.com
+Preston Hunt gt5708a@prism.gatech.edu
+Shane C Hutchins sch@nymph.msel.unh.edu
+Hutch hutchinson@wrair-emh1.army.mil
+Lester Ingber ingber@alumni.caltech.edu
+Ken Ishii ishii@sni-usa.com
+Per Steinar Iversen iversen@vsfys1.fi.uib.no
+Chris Jacobsen jacobsen@xray1.physics.sunysb.edu
+Michal Jaegermann ntomczak@vm.ucs.ualberta.ca
+Brian Jones brianj@skat.usc.edu
+Denny de Jonge witaddj@dutrex.tudelft.nl
+Arne H. Juul arnej@lise.unit.no
+Dana Jacobsen jacobsd@solar.cor2.epa.gov
+Peter Jannesen peter@ncs.nl
+Brian D. Johnston johnstonb@med.ge.com
+Walter W. Jones wwj@candela.cfr.nist.gov
+Tom Judson judson@scf.usc.edu
+Henry G. Juengst juengst@saph2.physik.uni-bonn.de
+Sarantos Kapidakis sarantos%manteion@ics.forth.gr
+Amir J. Katz amir@matis.ingr.com
+Steve Kelem kelem@castor.xilinx.com
+Steven Kimball kimball@shrew.sanders.lockheed.com
+Randy Kirchhof rkk@posms.aus.tx.us
+Ned Kittlitz kittlitz@seagoon.sw.stratus.com
+Sakai Kiyotaka ksakai@mtl.t.u-tokyo.ac.jp
+Philip C Kizer pckizer@gonzo.tamu.edu
+Pete Klammer pklammer@ouray.denver.colorado.edu
+Fritz Kleemann kleemann@informatik.uni-wuerzburg.dbp.de
+Wilhelm B. Kloke wb@ifado.arb-phys.uni-dortmund.de
+Tom Kloos tk@sequent.com
+Carsten Koch carsten.koch@icem.de
+Winfried Koenig win@in.rhein-main.de
+Mathias Koerber mathias@solomon.technet.sg
+Steph Konigsdorfer s.konigsdorfer@frmy.bull.fr
+Leif Kornstaedt leif@rumtifsl.ruessel.sub.org
+Michael D. Lawler mdlawler@bsu-cs.bsu.edu
+Kevin Layer layer@franz.com
+Howard D. Leadmon howardl@wb3ffv.ampr.org
+Alexander Lehmann alex@hal.rhein-main.de
+Simon Leinen simon@lia.di.epfl.ch
+Burt Leland burt@molecular.com
+Tony Leneis tony@plaza.adp.ds.com
+Hugues Leroy hugues.leroy@irisa.fr
+Marty Leisner leisner@eso.mc.xerox.com
+Charles Levert charles@aramis.comm.polymtl.ca
+Richard Levitte levitte@e.kth.se
+Torbj|rn Lindh toobii@elixir.e.kth.se
+David R. Linn drl@vuse.vanderbilt.edu
+Antonio Lioy cat@athena.polito.it
+Jamie Lokier u90jl@ecs.oxford.ac.uk
+Richard Lloyd R.K.Lloyd@csc.liv.ac.uk
+David J. MacKenzie djm@eng.umd.edu
+John R MacMillan john@chance.gts.org
+Ron Male male@eso.mc.xerox.com
+Don R. Maszle maze@bea.lbl.gov
+Jaye Mathisen osyjm@cs.montana.edu
+Telly Mavroidis mavroidi@acf2.nyu.edu
+Imed Eddine Mbarki mbarki@pacific.cmpe.psu.edu
+Steeve McCauley steeve@pooh.geophys.mcgill.ca
+Tom McConnell tmcconne@sedona.intel.com
+Tod McQuillin mcquill@ccit05.duq.edu
+Tye McQueen tye@spillman.com
+Bernd Melchers melchers@chemie.fu-berlin.de
+Jason Merrill jason@jarthur.claremont.edu
+Dean S. Messing deanm@medulla.labs.tek.com
+M. Mesturino mesturino@cselt.stet.it
+Luke Mewburn zak@rmit.edu.au
+Jim Meyering meyering@cs.utexas.edu
+Dragan Milicic milicic@math.utah.edu
+Frederic Miserey none.fred@applelink.apple.com
+Marcel J.E. Mol marcel@duteca.et.tudelft.nl
+Soren Juul Moller sjm@dde.dk
+Chris Moore moore@src.bae.co.uk
+Dan Mosedale mosedale@genome.stanford.edu
+Helmut Muelner hmuelner@fiicmds04.tu-graz.ac.at
+Urban D Mueller umueller@amiga.physik.unizh.ch
+Ulrich Mueller ulm@vsnhdb.cern.ch
+Timothy Murphy tim@maths.tcd.ie
+Greg Naber greg@squally.halcyon.com
+Jay Nayegandhi jayng@bbiv02.enet.dec.com
+Paul K. Neville II pkn2@idsi.com
+Karl L. Noell noell@informatik.fh-wiesbaden.dbp.de
+Demizu Noritoshi nori-d@is.aist-nara.ac.jp
+Todd Ogasawara todd@protege.pegasus.com
+Helge Oldach helge.oldach@stollmann.de
+Arthur David Olson ado@elsie.nci.nih.gov
+Piet van Oostrum piet@cs.ruu.nl
+Rafael R. Pappalardo rafapa@obelix.cica.es
+Mike Pearlman canuck@masc38.rice.edu
+Yves Perrenoud pyves@nuga.alphanet.ch
+Hal Peterson hrp@pecan.cray.com
+Pascal Petit petit@cadillac.ibp.fr
+Bruno Pillard bp@chorus.fr
+Franc,ois Pinard pinard@iro.umontreal.ca
+Jay Pinkos pinkos@butyng.bu.edu
+Thomas Plass thomas@cogsci.ed.ac.uk
+Mike Polo mikep@cfsmo.honeywell.com
+Francesco Potorti pot@fly.cnuce.cnr.it
+Will Priest bpriest@lobby.ti.com
+David Purves purves@apogee.com
+Andreas Raab ar@nvmr.robin.de
+Eric S. Raymond esr@snark.thyrsus.com
+Klaus Reimann kr@cip.physik.uni-stuttgart.de
+Michael Rendell michael@mercury.cs.mun.ca
+Hal Render render@massive.uccs.edu
+Julian F. Reschke julian@math.uni-muenster.de
+Phil Richards Phil.Richards@prg.oxford.ac.uk
+Roland B Roberts roberts@nsrl31.nsrl.rochester.edu
+Arnold Robbins arnold@cc.gatech.edu
+Kevin Rodgers kevin@rolling-stone.den.mmc.com
+Kai Uwe Rommel rommel@informatik.tu-muenchen.de
+Paul Rubin phr@america.telebit.com
+Wolfgang Rupprecht wolfgang@wsrcc.com
+Jonathan Ryshpan jon@amito.hitachi.com
+Paul A Sand pas@unh.edu
+Tony Sanders sanders@bsdi.com
+Mike Sangrey mike@sojurn.lns.pa.us
+Niimi Satoshi a01309@cfi.waseda.ac.jp
+Marc Schaefer sysadm@alphanet.ch
+Andreas Schwab schwab@lamothe.informatik.uni-dortmund.de
+Eric Schenk schenk@cs.toronto.edu
+Eric P. Scott eps@cs.sfsu.edu
+Olaf Seibert rhialto@mbfys.kun.nl
+Sunando Sen sens@fasecon.econ.nyu.edu
+Harry Shamansky hts@hertz.eng.ohio-state.edu
+Amos Shapira amoss@cs.huji.ac.il
+Rick Sladkey jrs@world.std.com
+Daniel L Smith dls@autodesk.com
+Fred Smith fredex%fcshome@merk.merk.com
+Stephen Soliday soliday@ncat.edu
+Paul Southworth pauls@css.itd.umich.edu
+Rob Spencer robbie@winkle.bhpese.oz.au
+Richard Stallman rms@gnu.ai.mit.edu
+Carsten Steger carsten.steger@informatik.tu-muenchen.de
+David Sundstrom sunds@anon.asic.sc.ti.com
+Ed Sznyter ews@babel.babel.com
+Hideaki Tanabe arctanx@iyeyasu.ynl.t.u-tokyo.ac.jp
+Andrew Telford ajt@peregrin.resmel.bhp.com.au
+Glenn E. Thobe thobe@getunx.info.com
+Kei Thomsen kt@keihh.hanse.de
+Karsten Thygesen karthy@dannug.dk
+Mark Towfiq towfiq@microdyne.com
+Jeff Treece treece@sabbagh.com
+Oliver Trepte oliver@ikaros.fysik4.kth.se
+Stephane Tsacas slt@is21.isoft.fr
+Stephen Tweedie sct@dcs.ed.ac.uk
+John R. Vanderpool fish@daacdev1.stx.com
+Sotiris Vassilopoulos vassilopoulos@virginia.edu
+Pedro A. M. Vazquez vazquez@iqm.unicamp.br
+Arjan de Vet devet@win.tue.nl
+Larry W. Virden lvirden@cas.org
+Vadim V. Vlasov vvlasov@inucres.msk.su
+Eduard Vopicka eduard.vopicka@vse.cs
+Theo Vosse vosse@ruls41.leidenuniv.nl
+Darin Wayrynen darin@pcg.uucp
+Marcel Waldvogel marcel@nice.usergroup.ethz.ch
+Stephen J. Walick steve@nshore.org
+Gray Watson gray@antaire.com
+David Watt dmwatt@smersh.cambridge.ma.us
+Scott Weikart scott@igc.apc.org
+Ivo Welch iwelch@agsm.ucla.edu
+Jochen Wiedmann zrawi01@zmcipdec1.zdv.uni-tuebingen.de
+Gijsb. Wiesenekker wiesenecker@sara.nl
+Wietze van Winden wietze@swi.psy.uva.nl
+Frank Wuebbeling wuebbel@math.uni-muenster.de
+Larry W. Virden lwv26@cas.org
+Bill Wohler wohler@sap-ag.de
+Jamie Zawinski jwz@lucid.com
+Christos Zoulas christos@deshaw.com
diff --git a/Build/source/utils/gzip/TODO b/Build/source/utils/gzip/TODO
new file mode 100644
index 00000000000..1335e632d18
--- /dev/null
+++ b/Build/source/utils/gzip/TODO
@@ -0,0 +1,58 @@
+TODO file for gzip.
+
+Some of the planned features include:
+
+- Structure the sources so that the compression and decompression code
+ form a library usable by any program, and write both gzip and zip on
+ top of this library. This would ideally be a reentrant (thread safe)
+ library, but this would degrade performance. In the meantime, you can
+ look at the sample program zread.c.
+
+ The library should have one mode in which compressed data is sent
+ as soon as input is available, instead of waiting for complete
+ blocks. This can be useful for sending compressed data to/from interactive
+ programs.
+
+- Make it convenient to define alternative user interfaces (in
+ particular for windowing environments).
+
+- Support in-memory compression for arbitrarily large amounts of data
+ (zip currently supports in-memory compression only for a single buffer.)
+
+- Map files in memory when possible, this is generally much faster
+ than read/write. (zip currently maps entire files at once, this
+ should be done in chunks to reduce memory usage.)
+
+- Add a super-fast compression method, suitable for implementing
+ file systems with transparent compression. One problem is that the
+ best candidate (lzrw1) is patented twice (Waterworth 4,701,745
+ and Gibson & Graybill 5,049,881). The lzrw series of algorithms
+ are available by ftp in ftp.adelaide.edu.au:/pub/compression/lzrw*.
+
+- Add a super-tight (but slow) compression method, suitable for long
+ term archives. One problem is that the best versions of arithmetic
+ coding are patented (4,286,256 4,295,125 4,463,342 4,467,317
+ 4,633,490 4,652,856 4,891,643 4,905,297 4,935,882 4,973,961
+ 5,023,611 5,025,258).
+
+ Note: I will introduce new compression methods only if they are
+ significantly better in either speed or compression ratio than the
+ existing method(s). So the total number of different methods should
+ reasonably not exceed 3. (The current 9 compression levels are just
+ tuning parameters for a single method, deflation.)
+
+- Add optional error correction. One problem is that the current version
+ of ecc cannot recover from inserted or missing bytes. It would be
+ nice to recover from the most common error (transfer of a binary
+ file in ascii mode).
+
+- Add a block size (-b) option to improve error recovery in case of
+ failure of a complete sector. Each block could be extracted
+ independently, but this reduces the compression ratio.
+
+- Use a larger window size to deal with some large redundant files that
+ 'compress' currently handles better than gzip.
+
+- Implement the -e (encrypt) option.
+
+Send comments to <bug-gzip@gnu.org>.
diff --git a/Build/source/utils/gzip/_gztest b/Build/source/utils/gzip/_gztest
new file mode 100644
index 00000000000..203dca72c22
--- /dev/null
+++ b/Build/source/utils/gzip/_gztest
@@ -0,0 +1,3350 @@
+%% TeX macros to handle texinfo files
+
+% Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc.
+
+%This texinfo.tex file is free software; you can redistribute it and/or
+%modify it under the terms of the GNU General Public License as
+%published by the Free Software Foundation; either version 2, or (at
+%your option) any later version.
+
+%This texinfo.tex file is distributed in the hope that it will be
+%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%General Public License for more details.
+
+%You should have received a copy of the GNU General Public License
+%along with this texinfo.tex file; see the file COPYING. If not, write
+%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
+%USA.
+
+
+%In other words, you are welcome to use, share and improve this program.
+%You are forbidden to forbid anyone else to use, share and improve
+%what you give them. Help stamp out software-hoarding!
+
+\def\texinfoversion{2.73}
+\message{Loading texinfo package [Version \texinfoversion]:}
+\message{}
+
+% Print the version number if in a .fmt file.
+\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+
+% Save some parts of plain tex whose names we will redefine.
+
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexdots=\dots
+\let\ptexdot=\.
+\let\ptexstar=\*
+\let\ptexend=\end
+\let\ptexbullet=\bullet
+\let\ptexb=\b
+\let\ptexc=\c
+\let\ptexi=\i
+\let\ptext=\t
+\let\ptexl=\l
+\let\ptexL=\L
+
+\def\tie{\penalty 10000\ } % Save plain tex definition of ~.
+
+\message{Basics,}
+\chardef\other=12
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen \bindingoffset \bindingoffset=0pt
+\newdimen \normaloffset \normaloffset=\hoffset
+\newdimen\pagewidth \newdimen\pageheight
+\pagewidth=\hsize \pageheight=\vsize
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{\tracingcommands2 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+
+%---------------------Begin change-----------------------
+%
+%%%% For @cropmarks command.
+% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\cornerlong \newdimen\cornerthick
+\newdimen \topandbottommargin
+\newdimen \outerhsize \newdimen \outervsize
+\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
+\outerhsize=7in
+%\outervsize=9.5in
+% Alternative @smallbook page size is 9.25in
+\outervsize=9.25in
+\topandbottommargin=.75in
+%
+%---------------------End change-----------------------
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions itself, but you have to call it yourself.
+\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}}
+\def\onepageout#1{\hoffset=\normaloffset
+\ifodd\pageno \advance\hoffset by \bindingoffset
+\else \advance\hoffset by -\bindingoffset\fi
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
+{\let\hsize=\pagewidth \makefootline}}}%
+\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+
+%%%% For @cropmarks command %%%%
+
+% Here is a modification of the main output routine for Near East Publications
+% This provides right-angle cropmarks at all four corners.
+% The contents of the page are centerlined into the cropmarks,
+% and any desired binding offset is added as an \hskip on either
+% site of the centerlined box. (P. A. MacKay, 12 November, 1986)
+%
+\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
+ \shipout
+ \vbox to \outervsize{\hsize=\outerhsize
+ \vbox{\line{\ewtop\hfill\ewtop}}
+ \nointerlineskip
+ \line{\vbox{\moveleft\cornerthick\nstop}
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}}
+ \vskip \topandbottommargin
+ \centerline{\ifodd\pageno\hskip\bindingoffset\fi
+ \vbox{
+ {\let\hsize=\pagewidth \makeheadline}
+ \pagebody{#1}
+ {\let\hsize=\pagewidth \makefootline}}
+ \ifodd\pageno\else\hskip\bindingoffset\fi}
+ \vskip \topandbottommargin plus1fill minus1fill
+ \boxmaxdepth\cornerthick
+ \line{\vbox{\moveleft\cornerthick\nsbot}
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}}
+ \nointerlineskip
+ \vbox{\line{\ewbot\hfill\ewbot}}
+ }
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+%
+% Do @cropmarks to get crop marks
+\def\cropmarks{\let\onepageout=\croppageout }
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+%
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.
+% The argument can be delimited with [...] or with "..." or braces
+% or it can be a whole line.
+% #1 should be a macro which expects
+% an ordinary undelimited TeX argument.
+
+\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}
+
+\def\parseargx{%
+\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
+\aftergroup \parseargline %
+\fi \endgroup}
+
+{\obeyspaces %
+\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}
+
+\gdef\obeyedspace{\ }
+
+\def\parseargline{\begingroup \obeylines \parsearglinex}
+{\obeylines %
+\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment. Type Return to continue.}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Type <Return> to continue}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+%% @end foo executes the definition of \Efoo.
+%% foo can be delimited by doublequotes or brackets.
+
+\def\end{\parsearg\endxxx}
+
+\def\endxxx #1{%
+\expandafter\ifx\csname E#1\endcsname\relax
+\expandafter\ifx\csname #1\endcsname\relax
+\errmessage{Undefined command @end #1}\else
+\errorE{#1}\fi\fi
+\csname E#1\endcsname}
+\def\errorE#1{
+{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}}
+
+% Single-spacing is done by various environments.
+
+\newskip\singlespaceskip \singlespaceskip = \baselineskip
+\def\singlespace{%
+{\advance \baselineskip by -\singlespaceskip
+\kern \baselineskip}%
+\baselineskip=\singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt \char '100}}
+
+% Define @` and @' to be the same as ` and '
+% but suppressing ligatures.
+\def\`{{`}}
+\def\'{{'}}
+
+% Used to generate quoted braces.
+
+\def\mylbrace {{\tt \char '173}}
+\def\myrbrace {{\tt \char '175}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+\def\group{\begingroup
+ \ifnum\catcode13=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \def\Egroup{\egroup\endgroup}%
+ \vtop\bgroup
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Go into vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % Don't add any leading before our big empty box, but allow a page
+ % break, since the best break might be right here.
+ \allowbreak
+ \nointerlineskip
+ \vtop to #1\mil{\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output some dots
+
+\def\dots{$\ldots$}
+
+% @page forces the start of a new page
+
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+%\hbox{{\rm#1}}\hfil\break}}
+
+% @include file insert text of that file as input.
+
+\def\include{\parsearg\includezzz}
+\def\includezzz #1{{\def\thisfile{#1}\input #1
+}}
+
+\def\thisfile{}
+
+% @center line outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\par \vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+\parsearg \commentxxx}
+
+\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+
+\let\c=\comment
+
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+\let\chapter=\relax
+\let\unnumbered=\relax
+\let\top=\relax
+\let\unnumberedsec=\relax
+\let\unnumberedsection=\relax
+\let\unnumberedsubsec=\relax
+\let\unnumberedsubsection=\relax
+\let\unnumberedsubsubsec=\relax
+\let\unnumberedsubsubsection=\relax
+\let\section=\relax
+\let\subsec=\relax
+\let\subsubsec=\relax
+\let\subsection=\relax
+\let\subsubsection=\relax
+\let\appendix=\relax
+\let\appendixsec=\relax
+\let\appendixsection=\relax
+\let\appendixsubsec=\relax
+\let\appendixsubsection=\relax
+\let\appendixsubsubsec=\relax
+\let\appendixsubsubsection=\relax
+\let\contents=\relax
+\let\smallbook=\relax
+\let\titlepage=\relax
+}
+
+\def\ignore{\begingroup\ignoresections
+% Make sure that spaces turn into tokens that match what \ignorexxx wants.
+\catcode32=10
+\ignorexxx}
+\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces}
+
+\def\direntry{\begingroup\direntryxxx}
+\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces}
+
+% Conditionals to test whether a flag is set.
+
+\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}
+
+\def\ifsetxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
+\else \let\temp=\relax \fi
+\temp}
+\def\Eifset{}
+\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
+\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces}
+
+\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}
+
+\def\ifclearxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
+\else \let\temp=\ifclearfail \fi
+\temp}
+\def\Eifclear{}
+\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
+\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces}
+
+% @set foo to set the flag named foo.
+% @clear foo to clear the flag named foo.
+\def\set{\parsearg\setxxx}
+\def\setxxx #1{
+\expandafter\let\csname IF#1\endcsname=\set}
+
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx #1{
+\expandafter\let\csname IF#1\endcsname=\relax}
+
+% Some texinfo constructs that are trivial in tex
+
+\def\iftex{}
+\def\Eiftex{}
+\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
+\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces}
+
+\long\def\menu #1\end menu{}
+\def\asis#1{#1}
+
+% @math means output in math mode.
+% We don't use $'s directly in the definition of \math because control
+% sequences like \math are expanded when the toc file is written. Then,
+% we read the toc file back, the $'s will be normal characters (as they
+% should be, according to the definition of Texinfo). So we must use a
+% control sequence to switch into and out of math mode.
+%
+% This isn't quite enough for @math to work properly in indices, but it
+% seems unlikely it will ever be needed there.
+%
+\let\implicitmath = $
+\def\math#1{\implicitmath #1\implicitmath}
+
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\lastnode=\relax
+
+\def\donoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\unnumbnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\appendixnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\let\refill=\relax
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \readauxfile
+ \opencontents
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ \comment % Ignore the actual filename.
+}
+
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}},
+ node \samp{\losespace#1{}}}
+\def\losespace #1{#1}
+
+\message{fonts,}
+
+% Font-change commands.
+
+% Texinfo supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+%% Try out Computer Modern fonts at \magstephalf
+\let\mainmagstep=\magstephalf
+
+\ifx\bigger\relax
+\let\mainmagstep=\magstep1
+\font\textrm=cmr12
+\font\texttt=cmtt12
+\else
+\font\textrm=cmr10 scaled \mainmagstep
+\font\texttt=cmtt10 scaled \mainmagstep
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\font\textbf=cmb10 scaled \mainmagstep
+\font\textit=cmti10 scaled \mainmagstep
+\font\textsl=cmsl10 scaled \mainmagstep
+\font\textsf=cmss10 scaled \mainmagstep
+\font\textsc=cmcsc10 scaled \mainmagstep
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\font\defbf=cmbx10 scaled \magstep1 %was 1314
+\font\deftt=cmtt10 scaled \magstep1
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices and small examples.
+% We actually use the slanted font rather than the italic,
+% because texinfo normally uses the slanted fonts for that.
+% Do not make many font distinctions in general in the index, since they
+% aren't very useful.
+\font\ninett=cmtt9
+\font\indrm=cmr9
+\font\indit=cmsl9
+\let\indsl=\indit
+\let\indtt=\ninett
+\let\indsf=\indrm
+\let\indbf=\indrm
+\let\indsc=\indrm
+\font\indi=cmmi9
+\font\indsy=cmsy9
+
+% Fonts for headings
+\font\chaprm=cmbx12 scaled \magstep2
+\font\chapit=cmti12 scaled \magstep2
+\font\chapsl=cmsl12 scaled \magstep2
+\font\chaptt=cmtt12 scaled \magstep2
+\font\chapsf=cmss12 scaled \magstep2
+\let\chapbf=\chaprm
+\font\chapsc=cmcsc10 scaled\magstep3
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+\font\secrm=cmbx12 scaled \magstep1
+\font\secit=cmti12 scaled \magstep1
+\font\secsl=cmsl12 scaled \magstep1
+\font\sectt=cmtt12 scaled \magstep1
+\font\secsf=cmss12 scaled \magstep1
+\font\secbf=cmbx12 scaled \magstep1
+\font\secsc=cmcsc10 scaled\magstep2
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad.
+% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded.
+% \font\ssecsl=cmsl10 scaled \magstep1
+% \font\ssectt=cmtt10 scaled \magstep1
+% \font\ssecsf=cmss10 scaled \magstep1
+
+%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx.
+%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than
+%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1.
+%\font\ssectt=cmtt10 scaled 1315
+%\font\ssecsf=cmss10 scaled 1315
+
+%\let\ssecbf=\ssecrm
+
+\font\ssecrm=cmbx12 scaled \magstephalf
+\font\ssecit=cmti12 scaled \magstephalf
+\font\ssecsl=cmsl12 scaled \magstephalf
+\font\ssectt=cmtt12 scaled \magstephalf
+\font\ssecsf=cmss12 scaled \magstephalf
+\font\ssecbf=cmbx12 scaled \magstephalf
+\font\ssecsc=cmcsc10 scaled \magstep1
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled \magstep1
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% Fonts for title page:
+\font\titlerm = cmbx12 scaled \magstep3
+\let\authorrm = \secrm
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts, we
+% don't bother to reset \scriptfont and \scriptscriptfont (which would
+% also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
+ \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
+ \textfont\ttfam = \tentt \textfont\sffam = \tensf
+}
+
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current. Plain TeX does, for example,
+% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need
+% to redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \resetmathfonts}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \resetmathfonts}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \resetmathfonts}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \resetmathfonts}
+\def\indexfonts{%
+ \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+ \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+ \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
+ \resetmathfonts}
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\font\shortcontrm=cmr12
+\font\shortcontbf=cmbx12
+\font\shortcontsl=cmsl12
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartitalic
+\let\dfn=\smartitalic
+\let\emph=\smartitalic
+\let\cite=\smartitalic
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null}
+\let\ttfont = \t
+%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
+\def\samp #1{`\tclose{#1}'\null}
+\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+\let\file=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\newdimen\tclosesave
+\newdimen\tcloserm
+\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font
+\fontdimen2\font=\tcloserm
+% prevent breaking lines at hyphens.
+\exhyphenpenalty=10000
+\def\ {{\fontdimen2\font=\tclosesave{} }}%
+ \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null}
+\let\code=\tclose
+%\let\exp=\tclose %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else\tclose{\look}\fi
+\else\tclose{\look}\fi}
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of
+% @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+\def\l#1{{\li #1}\null} %
+
+\def\r#1{{\rm #1}} % roman font
+% Use of \lowercase was suggested.
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\def\titlefont#1{{\titlerm #1}}
+
+\newtoks\realeverypar
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+% I deinstalled the following change because \cmr12 is undefined.
+% This change was not in the ChangeLog anyway. --rms.
+% \let\subtitlerm=\cmr12
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefont{##1}}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ \HEADINGSon
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks \evenheadline % Token sequence for heading line of even pages
+\newtoks \oddheadline % Token sequence for heading line of odd pages
+\newtoks \evenfootline % Token sequence for footing line of even pages
+\newtoks \oddfootline % Token sequence for footing line of odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
+\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
+\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+% Subroutines used in generating headings
+% Produces Day Month Year style of output.
+\def\today{\number\day\space
+\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\year}
+
+% Use this if you want the Month Day, Year style of output.
+%\def\today{\ifcase\month\or
+%January\or February\or March\or April\or May\or June\or
+%July\or August\or September\or October\or November\or December\fi
+%\space\number\day, \number\year}
+
+% @settitle line... specifies the title of the document, for headings
+% It generates no output of its own
+
+\def\thistitle{No Title}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+\message{tables,}
+
+% @tabs -- simple alignment
+
+% These don't work. For one thing, \+ is defined as outer.
+% So these macros cannot even be defined.
+
+%\def\tabs{\parsearg\tabszzz}
+%\def\tabszzz #1{\settabs\+#1\cr}
+%\def\tabline{\parsearg\tablinezzz}
+%\def\tablinezzz #1{\+#1\cr}
+%\def\&{&}
+
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\par \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\par \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % Be sure we are not still in the middle of a paragraph.
+ \parskip=0in
+ \par
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0
+ \nobreak
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line. Since that
+ % text will be indented by \tableindent, we make the item text be in
+ % a zero-width box.
+ \noindent
+ \rlap{\hskip -\tableindent\box0}%
+ \fi
+ \endgroup
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+%% Contains a kludge to get @end[description] to work
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1 \endtabley
+\def\Evtable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Neccessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\endgroup\afterenvbreak}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemsize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\endgroup\afterenvbreak}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+ \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{\in hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+
+\def\newindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#1}}
+}
+
+% @defindex foo == \newindex{foo}
+
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+
+\def\newcodeindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#1}}
+}
+
+\def\defcodeindex{\parsearg\newcodeindex}
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+\def\synindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#2}}%
+}
+
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+\def\syncodeindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#2}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+\def\indexdummies{%
+\def\_{{\realbackslash _}}%
+\def\w{\realbackslash w }%
+\def\bf{\realbackslash bf }%
+\def\rm{\realbackslash rm }%
+\def\sl{\realbackslash sl }%
+\def\sf{\realbackslash sf}%
+\def\tt{\realbackslash tt}%
+\def\gtr{\realbackslash gtr}%
+\def\less{\realbackslash less}%
+\def\hat{\realbackslash hat}%
+\def\char{\realbackslash char}%
+\def\TeX{\realbackslash TeX}%
+\def\dots{\realbackslash dots }%
+\def\copyright{\realbackslash copyright }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\t##1{\realbackslash r {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\b##1{\realbackslash b {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+}
+
+% \indexnofonts no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+\let\w=\indexdummyfont
+\let\t=\indexdummyfont
+\let\r=\indexdummyfont
+\let\i=\indexdummyfont
+\let\b=\indexdummyfont
+\let\emph=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\sc=\indexdummyfont
+%Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |...
+%\let\tt=\indexdummyfont
+\let\tclose=\indexdummyfont
+\let\code=\indexdummyfont
+\let\file=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\var=\indexdummyfont
+\let\TeX=\indexdummytex
+\let\dots=\indexdummydots
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
+{\catcode`\@=0 \catcode`\\=\other
+@gdef@realbackslash{\}}
+
+\let\indexbackslash=0 %overridden during \printindex.
+
+\def\doind #1#2{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0% Expand all macros now EXCEPT \folio
+\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+% so it will be output as is; and it will print as backslash in the indx.
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}}}%
+\temp }%
+}\penalty\count10}}
+
+\def\dosubind #1#2#3{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0%
+\def\rawbackslashxx{\indexbackslash}%
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2 #3}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+\temp }%
+}\penalty\count10}}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% This is what you call to cause a particular index to get printed.
+% Write
+% @unnumbered Function Index
+% @printindex fn
+
+\def\printindex{\parsearg\doprintindex}
+
+\def\doprintindex#1{%
+ \tex
+ \dobreak \chapheadingskip {10000}
+ \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
+ \catcode`\$=\other\catcode`\_=\other
+ \catcode`\~=\other
+ %
+ % The following don't help, since the chars were translated
+ % when the raw index was written, and their fonts were discarded
+ % due to \indexnofonts.
+ %\catcode`\"=\active
+ %\catcode`\^=\active
+ %\catcode`\_=\active
+ %\catcode`\|=\active
+ %\catcode`\<=\active
+ %\catcode`\>=\active
+ % %
+ \def\indexbackslash{\rawbackslashxx}
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+ \begindoublecolumns
+ %
+ % See if the index file exists and is nonempty.
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ (Index is nonexistent)
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ (Index is empty)
+ \else
+ \input \jobname.#1s
+ \fi
+ \fi
+ \closein 1
+ \enddoublecolumns
+ \Etex
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+% Same as \bigskipamount except no shrink.
+% \balancecolumns gets confused if there is any shrink.
+\newskip\initialskipamount \initialskipamount 12pt plus4pt
+
+\def\initial #1{%
+{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+\ifdim\lastskip<\initialskipamount
+\removelastskip \penalty-200 \vskip \initialskipamount\fi
+\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
+
+\def\entry #1#2{\begingroup
+ \parfillskip=0in \parskip=0in \parindent=0in
+ %
+ % \hangindent is only relevant when the page number and the entry text
+ % don't fit on one line. In that case, bob suggests starting the dots
+ % pretty far over on the line.
+ % \hangafter is reset to 1 at the start of each paragraph.
+ \hangindent=.75\hsize
+ \noindent
+ %
+ % Don't break the text of the index entry.
+ \hbox{#1}%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without, a spurious underfull \hbox ensues.
+ \ #2% The page number ends the paragraph.
+ \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+
+\def\secondary #1#2{
+{\parfillskip=0in \parskip=0in
+\hangindent =1in \hangafter=1
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
+}}
+
+%% Define two-column mode, which is used in indexes.
+%% Adapted from the TeXBook, page 416
+\catcode `\@=11
+
+\newbox\partialpage
+
+\newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in
+\newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in
+\newdimen\availdimen@
+
+\def\begindoublecolumns{\begingroup
+ \output={\global\setbox\partialpage=
+ \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
+ \output={\doublecolumnout}%
+ \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
+\def\enddoublecolumns{\output={\balancecolumns}\eject
+ \endgroup \pagegoal=\vsize}
+
+\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
+\def\pagesofar{\unvbox\partialpage %
+ \hsize=\doublecolumnhsize % have to restore this since output routine
+% changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
+ \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
+\def\balancecolumns{%
+% Unset the glue.
+ \setbox255=\vbox{\unvbox255}
+ \dimen@=\ht255
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage
+% If the remaining data is too big for one page,
+% output one page normally, then work with what remains.
+ \ifdim \dimen@>\availdimen@
+ {
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ }
+% Recompute size of what remains, in case we just output some of it.
+ \dimen@=\ht255
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2
+ \fi
+ \setbox0=\vbox{\unvbox255}
+ \splittopskip=\topskip
+ {\vbadness=10000 \loop \global\setbox3=\copy0
+ \global\setbox1=\vsplit3 to\dimen@
+ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
+ \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3}
+ \pagesofar}
+
+\catcode `\@=\other
+\message{sectioning,}
+% Define chapters, sections, etc.
+
+\newcount \chapno
+\newcount \secno \secno=0
+\newcount \subsecno \subsecno=0
+\newcount \subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount \appendixno \appendixno = `\@
+\def\appendixletter{\char\the\appendixno}
+
+\newwrite \contentsfile
+% This is called from \setfilename.
+\def\opencontents{\openout \contentsfile = \jobname.toc}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise
+
+\def\thischapter{} \def\thissection{}
+\def\seccheck#1{\if \pageno<0 %
+\errmessage{@#1 not allowed after generating table of contents}\fi
+%
+}
+
+\def\chapternofonts{%
+\let\rawbackslash=\relax%
+\let\frenchspacing=\relax%
+\def\result{\realbackslash result}
+\def\equiv{\realbackslash equiv}
+\def\expansion{\realbackslash expansion}
+\def\print{\realbackslash print}
+\def\TeX{\realbackslash TeX}
+\def\dots{\realbackslash dots}
+\def\copyright{\realbackslash copyright}
+\def\tt{\realbackslash tt}
+\def\bf{\realbackslash bf }
+\def\w{\realbackslash w}
+\def\less{\realbackslash less}
+\def\gtr{\realbackslash gtr}
+\def\hat{\realbackslash hat}
+\def\char{\realbackslash char}
+\def\tclose##1{\realbackslash tclose {##1}}
+\def\code##1{\realbackslash code {##1}}
+\def\samp##1{\realbackslash samp {##1}}
+\def\r##1{\realbackslash r {##1}}
+\def\b##1{\realbackslash b {##1}}
+\def\key##1{\realbackslash key {##1}}
+\def\file##1{\realbackslash file {##1}}
+\def\kbd##1{\realbackslash kbd {##1}}
+% These are redefined because @smartitalic wouldn't work inside xdef.
+\def\i##1{\realbackslash i {##1}}
+\def\cite##1{\realbackslash cite {##1}}
+\def\var##1{\realbackslash var {##1}}
+\def\emph##1{\realbackslash emph {##1}}
+\def\dfn##1{\realbackslash dfn {##1}}
+}
+
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapterzzz}
+\def\chapterzzz #1{\seccheck{chapter}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\chapmacro {#1}{\the\chapno}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+% We don't substitute the actual chapter name into \thischapter
+% because we don't want its macros evaluated now.
+\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}}
+
+\outer\def\appendix{\parsearg\appendixzzz}
+\def\appendixzzz #1{\seccheck{appendix}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
+\chapmacro {#1}{Appendix \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry
+ {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\global\let\section = \appendixsec
+\global\let\subsection = \appendixsubsec
+\global\let\subsubsection = \appendixsubsubsec
+}}
+
+\outer\def\top{\parsearg\unnumberedzzz}
+\outer\def\unnumbered{\parsearg\unnumberedzzz}
+\def\unnumberedzzz #1{\seccheck{unnumbered}%
+\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}}
+
+\outer\def\numberedsec{\parsearg\seczzz}
+\def\seczzz #1{\seccheck{section}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsection{\parsearg\appendixsectionzzz}
+\outer\def\appendixsec{\parsearg\appendixsectionzzz}
+\def\appendixsectionzzz #1{\seccheck{appendixsection}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
+\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsec{\parsearg\numberedsubseczzz}
+\def\numberedsubseczzz #1{\seccheck{subsection}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
+\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz}
+\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry %
+ {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+ {\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
+\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry{#1}%
+ {\appendixletter}
+ {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and
+% such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+{\advance\chapheadingskip by 10pt \chapbreak }%
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\heading{\parsearg\secheadingi}
+
+\def\subheading{\parsearg\subsecheadingi}
+
+\def\subsubheading{\parsearg\subsubsecheadingi}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain}
+
+\def\chfplain #1#2{%
+ \pchapsepmacro
+ {%
+ \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #2\enspace #1}%
+ }%
+ \bigskip
+ \penalty5000
+}
+
+\def\unnchfplain #1{%
+\pchapsepmacro %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen}
+
+% Parameter controlling skip before section headings.
+
+\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+
+\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+
+% @paragraphindent is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
+% Section fonts are the base font at magstep2, which produces
+% a size a bit more than 14 points in the default situation.
+
+\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
+\def\plainsecheading #1{\secheadingi {#1}}
+\def\secheadingi #1{{\advance \secheadingskip by \parskip %
+\secheadingbreak}%
+{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+
+% Subsection fonts are the base font at magstep1,
+% which produces a size of 12 points.
+
+\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
+\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
+ % Perhaps make sssec fonts scaled
+ % magstep half
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
+\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+
+
+\message{toc printing,}
+
+% Finish up the main text and prepare to read what we've written
+% to \contentsfile.
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\def\startcontents#1{%
+ \pagealignmacro
+ \immediate\closeout \contentsfile
+ \ifnum \pageno>0
+ \pageno = -1 % Request roman numbered pages.
+ \fi
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+}
+
+
+% Normal (long) toc.
+\outer\def\contents{%
+ \startcontents{Table of Contents}%
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+
+% And just the chapters.
+\outer\def\summarycontents{%
+ \startcontents{Short Contents}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+ \rm
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\unnumbsecentry ##1##2{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+\let\shortcontents = \summarycontents
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapter-level things, for both the long and short contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+
+% See comments in \dochapentry re vbox and related settings
+\def\shortchapentry#1#2#3{%
+ \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright
+ {#2\labelspace #1}\dotfill\doshortpageno{#3}}%
+}
+
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{%
+ \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright
+ #1\dotfill\doshortpageno{#2}}%
+}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we would want to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip\baselineskip
+ % This \vbox (and similar ones in dosecentry etc.) used to be a
+ % \line; changed to permit linebreaks for long headings. See
+ % comments above \majorheading. Here we also use \strut to
+ % keep the top end of the vbox from jamming up against the previous
+ % entry in the table of contents.
+ \vbox{\chapentryfonts
+ \hyphenpenalty=10000\tolerance=5000 % this line and next introduced
+ \parindent=0pt\strut\raggedright % with \line -> \vbox change
+ #1\dotfill
+ \dopageno{#2}}%
+ \nobreak\vskip .25\baselineskip
+}
+
+\def\dosecentry#1#2{%
+ \vbox{\secentryfonts \leftskip=\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+\def\dosubsecentry#1#2{%
+ \vbox{\subsecentryfonts \leftskip=2\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+\def\dosubsubsecentry#1#2{%
+ \vbox{\subsubsecentryfonts \leftskip=3\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox \newbox\longdblarrowbox
+\newbox\pushcharbox \newbox\bullbox
+\newbox\equivbox \newbox\errorbox
+
+\let\ptexequiv = \equiv
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
+% depth .1ex\hfil}
+%}
+
+\def\point{$\star$}
+
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% Adapted from the TeXbook's \boxit.
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+
+% The @error{} command.
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+\catcode `\%=14
+\catcode 43=12
+\catcode`\"=12
+\catcode`\==12
+\catcode`\|=12
+\catcode`\<=12
+\catcode`\>=12
+\escapechar=`\\
+%
+\let\{=\ptexlbrace
+\let\}=\ptexrbrace
+\let\.=\ptexdot
+\let\*=\ptexstar
+\let\dots=\ptexdots
+\def\@{@}%
+\let\bullet=\ptexbullet
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
+\let\L=\ptexL
+%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^M gets inside @lisp
+% phr: changed space to \null, to avoid overfull hbox problems.
+{\obeyspaces%
+\gdef\lisppar{\null\endgraf}}
+
+% Cause \obeyspaces to make each Space cause a word-separation
+% rather than the default which is that it acts punctuation.
+% This is because space in tt font looks funny.
+{\obeyspaces %
+\gdef\sepspaces{\def {\ }}}
+
+\newskip\aboveenvskipamount \aboveenvskipamount= 0pt
+\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip
+\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}}
+
+\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \cartouche: draw rectangle w/rounded corners around argument
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\long\def\cartouche{%
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+\def\lisp{\aboveenvbreak
+\begingroup\inENV % This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Elisp{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines \tt \rawbackslash
+\def\next##1{}\next}
+
+
+\let\example=\lisp
+\def\Eexample{\Elisp}
+
+\let\smallexample=\lisp
+\def\Esmallexample{\Elisp}
+
+% Macro for 9 pt. examples, necessary to print with 5" lines.
+% From Pavel@xerox. This is not really used unless the
+% @smallbook command is given.
+
+\def\smalllispx{\aboveenvbreak\begingroup\inENV
+% This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Esmalllisp{\endgroup\afterenvbreak}%
+%%%% Smaller baseline skip for small examples.
+\baselineskip 10pt
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslash
+\def\next##1{}\next}
+
+% This is @display; same as @lisp except use roman font.
+
+\def\display{\begingroup\inENV %This group ends at the end of the @display body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Edisplay{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% This is @format; same as @lisp except use roman font and don't narrow margins
+
+\def\format{\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Eformat{\endgroup\afterenvbreak}
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @flushleft and @flushright
+
+\def\flushleft{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushleft{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+\def\flushright{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushright{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\advance \leftskip by 0pt plus 1fill
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @quotation - narrow the margins.
+
+\def\quotation{%
+\begingroup\inENV %This group ends at the end of the @quotation body
+{\parskip=0pt % because we will skip by \parskip too, later
+\aboveenvbreak}%
+\singlespace
+\parindent=0pt
+\def\Equotation{\par\endgroup\afterenvbreak}%
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\advance \rightskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\nonarrowing=\relax
+\fi}
+
+\message{defuns,}
+% Define formatter for defuns
+% First, allow user to change definition object font (\df) internally
+\def\setdeffont #1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\def\activeparens{%
+\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
+\catcode`\[=\active \catcode`\]=\active}
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
+\global\advance\parencount by 1 }
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+% also in that case restore the outer-level definition of (.
+\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+\global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
+\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\dimen3=\rightskip
+\advance\dimen3 by -\defbodyindent
+\noindent %
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000
+\advance\leftskip by -\defbodyindent
+\exdentamount=\defbodyindent
+{\df #1}\enskip % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+% such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\activeparens\spacesplit#3}
+
+\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+
+\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+\def\defvrparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#4}}}
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+
+{\obeylines
+\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs #1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\hyphenchar\tensl=0
+#1%
+\hyphenchar\tensl=45
+\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\functionparens
+\code{#1}%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Function}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\code{#1} #2}{Function}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup\defname {\code{#2} #3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Macro}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Special Form}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% This definition is run if you use @defunx
+% anywhere other than immediately after a @defun or @defunx.
+
+\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
+\def\defunx #1 {\errmessage{@defunx in invalid context}}
+\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
+\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
+\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+
+% @defmethod, and so on
+
+% @defop {Funny Method} foo-class frobnicate argument
+
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+
+\def\defopheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype{} on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defmethod == @defop Method
+
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+
+\def\defmethodheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+\begingroup\defname {#2}{Method on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype{} of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar == @defcv {Instance Variable}
+
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+
+\def\defivarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{Instance Variable of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% These definitions are run if you use @defmethodx, etc.,
+% anywhere other than immediately after a @defmethod, etc.
+
+\def\defopx #1 {\errmessage{@defopx in invalid context}}
+\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
+\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
+\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
+
+% Now @defvar
+
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{Variable}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{User Option}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name.
+\def\deftypevarheader #1#2{%
+\doind {vr}{\code{#2}}% Make entry in variables index
+\begingroup\defname {\code{#1} #2}{Variable}%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
+\begingroup\defname {\code{#2} #3}{#1}
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% This definition is run if you use @defvarx
+% anywhere other than immediately after a @defvar or @defvarx.
+
+\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
+\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% This definition is run if you use @deftpx, etc
+% anywhere other than immediately after a @deftp, etc.
+
+\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
+\message{cross reference,}
+% Define cross-reference macros
+\newwrite \auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% \setref{foo} defines a cross-reference point named foo.
+
+\def\setref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ysectionnumberandtype}}
+
+\def\unnumbsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ynothing}}
+
+\def\appendixsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Yappendixletterandtype}}
+
+% \xref, \pxref, and \ref generate cross-references to specified points.
+% For \xrefX, #1 is the node name, #2 the name of the Info
+% cross-reference, #3 the printed node name, #4 the name of the Info
+% file, #5 the name of the printed manual. All but the node name can be
+% omitted.
+%
+\def\pxref#1{see \xrefX[#1,,,,,,,]}
+\def\xref#1{See \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup%
+\def\printedmanual{\ignorespaces #5}%
+\def\printednodename{\ignorespaces #3}%
+%
+\setbox1=\hbox{\printedmanual}%
+\setbox0=\hbox{\printednodename}%
+\ifdim \wd0=0pt%
+\def\printednodename{\ignorespaces #1}%
+%%% Uncommment the following line to make the actual chapter or section title
+%%% appear inside the square brackets.
+%\def\printednodename{#1-title}%
+\fi%
+%
+%
+% If we use \unhbox0 and \unhbox1 to print the node names, TeX does
+% not insert empty discretionaries after hyphens, which means that it
+% will not find a line break at a hyphen in a node names. Since some
+% manuals are best written with fairly long node names, containing
+% hyphens, this is a loss. Therefore, we simply give the text of
+% the node name again, so it is as if TeX is seeing it for the first
+% time.
+\ifdim \wd1>0pt
+section ``\printednodename'' in \cite{\printedmanual}%
+\else%
+\turnoffactive%
+\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
+\fi
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \turnoffactive so that punctuation chars such as underscore
+% work in node names.
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
+\next}}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq
+
+\def\Ypagenumber{\folio}
+
+\def\Ytitle{\thischapter}
+
+\def\Ynothing{}
+
+\def\Ysectionnumberandtype{%
+\ifnum\secno=0 Chapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Non-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+
+\def\refx#1#2{%
+ \expandafter\ifx\csname X#1\endcsname\relax
+ % If not defined, say something at least.
+ $\langle$un\-de\-fined$\rangle$%
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \csname X#1\endcsname
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+
+% This is the macro invoked by entries in the aux file.
+\def\xrdef #1#2{
+{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
+
+\def\readauxfile{%
+\begingroup
+\catcode `\^^@=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\^^C=\other
+\catcode `\^^D=\other
+\catcode `\^^E=\other
+\catcode `\^^F=\other
+\catcode `\^^G=\other
+\catcode `\^^H=\other
+\catcode `\ =\other
+\catcode `\^^L=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode 26=\other
+\catcode `\^^[=\other
+\catcode `\^^\=\other
+\catcode `\^^]=\other
+\catcode `\^^^=\other
+\catcode `\^^_=\other
+\catcode `\@=\other
+\catcode `\^=\other
+\catcode `\~=\other
+\catcode `\[=\other
+\catcode `\]=\other
+\catcode`\"=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode `\$=\other
+\catcode `\#=\other
+\catcode `\&=\other
+% the aux file uses ' as the escape.
+% Turn off \ as an escape so we do not lose on
+% entries which were dumped with control sequences in their names.
+% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
+% Reference to such entries still does not work the way one would wish,
+% but at least they do not bomb out when the aux file is read in.
+\catcode `\{=1 \catcode `\}=2
+\catcode `\%=\other
+\catcode `\'=0
+\catcode `\\=\other
+\openin 1 \jobname.aux
+\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
+\fi
+% Open the new aux file. Tex will close it automatically at exit.
+\openout \auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed.
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only..
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+\long\gdef\footnote #1{\global\advance \footnoteno by \@ne
+\unskip
+\edef\thisfootno{$^{\the\footnoteno}$}%
+\let\@sf\empty
+\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+\thisfootno\@sf \footnotezzz{#1}}
+% \parsearg\footnotezzz}
+
+\long\gdef\footnotezzz #1{\insert\footins{
+\interlinepenalty\interfootnotelinepenalty
+\splittopskip\ht\strutbox % top baseline for broken footnotes
+\splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}}
+
+}%end \catcode `\@=11
+
+% End of control word definitions.
+
+\message{and turning on texinfo input format.}
+
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% Set some numeric style parameters, for 8.5 x 11 format.
+
+%\hsize = 6.5in
+\newdimen\defaultparindent \defaultparindent = 15pt
+\parindent = \defaultparindent
+\parskip 18pt plus 1pt
+\baselineskip 15pt
+\advance\topskip by 1.2cm
+
+% Prevent underfull vbox error messages.
+\vbadness=10000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. This makes it come to about 9pt for the 8.5x11 format.
+%
+\ifx\emergencystretch\thisisundefined \else
+ \emergencystretch = \hsize
+ \divide\emergencystretch by 45
+\fi
+
+% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
+\def\smallbook{
+\global\lispnarrowing = 0.3in
+\global\baselineskip 12pt
+\advance\topskip by -1cm
+\global\parskip 3pt plus 1pt
+\global\hsize = 5in
+\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in
+\global\vsize=7.5in
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\contentsrightmargin=0pt
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+
+\global\let\smalllisp=\smalllispx
+\global\let\smallexample=\smalllispx
+\global\def\Esmallexample{\Esmalllisp}
+}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\baselineskip=12pt
+\global\parskip 15pt plus 1pt
+
+\global\vsize= 53\baselineskip
+\advance\vsize by \topskip
+%\global\hsize= 5.85in % A4 wide 10pt
+\global\hsize= 6.5in
+\global\outerhsize=\hsize
+\global\advance\outerhsize by 0.5in
+\global\outervsize=\vsize
+\global\advance\outervsize by 0.6in
+\global\doublecolumnhsize=\hsize
+\global\divide\doublecolumnhsize by 2
+\global\advance\doublecolumnhsize by -0.1in
+\global\doublecolumnvsize=\vsize
+\global\multiply\doublecolumnvsize by 2
+\global\advance\doublecolumnvsize by 0.1in
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+}
+
+%% For a final copy, take out the rectangles
+%% that mark overfull boxes (in case you have decided
+%% that the text looks ok even though it passes the margin).
+\def\finalout{\overfullrule=0pt}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt \char '042}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt \char '176}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+% \lvvmode is equivalent in function to \leavevmode.
+% Using \leavevmode runs into trouble when written out to
+% an index file due to the expansion of \leavevmode into ``\unhbox
+% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
+% magic tricks with @.
+\def\lvvmode{\vbox to 0pt{}}
+
+\catcode`\|=\active
+\def|{{\tt \char '174}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+\def\turnoffactive{\let"=\normaldoublequote
+\let~=\normaltilde
+\let^=\normalcaret
+\let_=\normalunderscore
+\let|=\normalverticalbar
+\let<=\normalless
+\let>=\normalgreater
+\let+=\normalplus}
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`\@=0
+
+% \rawbackslashxx output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
+%@gdef@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
+@gdef@rawbackslash{@let\=@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% Say @foo, not \foo, in error messages.
+\escapechar=`\@
+
+% \catcode 17=0 % Define control-q
+\catcode`\\=\active
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+%
+@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
+
+%% These look ok in all fonts, so just make them not special. The @rm below
+%% makes sure that the current font starts out as the newly loaded cmr10
+@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
+
+@textfonts
+@rm
+
+@c Local variables:
+@c page-delimiter: "^\\\\message"
+@c End:
diff --git a/Build/source/utils/gzip/algorithm.doc b/Build/source/utils/gzip/algorithm.doc
new file mode 100644
index 00000000000..1e371c246c5
--- /dev/null
+++ b/Build/source/utils/gzip/algorithm.doc
@@ -0,0 +1,164 @@
+1. Algorithm
+
+The deflation algorithm used by zip and gzip is a variation of LZ77
+(Lempel-Ziv 1977, see reference below). It finds duplicated strings in
+the input data. The second occurrence of a string is replaced by a
+pointer to the previous string, in the form of a pair (distance,
+length). Distances are limited to 32K bytes, and lengths are limited
+to 258 bytes. When a string does not occur anywhere in the previous
+32K bytes, it is emitted as a sequence of literal bytes. (In this
+description, 'string' must be taken as an arbitrary sequence of bytes,
+and is not restricted to printable characters.)
+
+Literals or match lengths are compressed with one Huffman tree, and
+match distances are compressed with another tree. The trees are stored
+in a compact form at the start of each block. The blocks can have any
+size (except that the compressed data for one block must fit in
+available memory). A block is terminated when zip determines that it
+would be useful to start another block with fresh trees. (This is
+somewhat similar to compress.)
+
+Duplicated strings are found using a hash table. All input strings of
+length 3 are inserted in the hash table. A hash index is computed for
+the next 3 bytes. If the hash chain for this index is not empty, all
+strings in the chain are compared with the current input string, and
+the longest match is selected.
+
+The hash chains are searched starting with the most recent strings, to
+favor small distances and thus take advantage of the Huffman encoding.
+The hash chains are singly linked. There are no deletions from the
+hash chains, the algorithm simply discards matches that are too old.
+
+To avoid a worst-case situation, very long hash chains are arbitrarily
+truncated at a certain length, determined by a runtime option (zip -1
+to -9). So zip does not always find the longest possible match but
+generally finds a match which is long enough.
+
+zip also defers the selection of matches with a lazy evaluation
+mechanism. After a match of length N has been found, zip searches for a
+longer match at the next input byte. If a longer match is found, the
+previous match is truncated to a length of one (thus producing a single
+literal byte) and the longer match is emitted afterwards. Otherwise,
+the original match is kept, and the next match search is attempted only
+N steps later.
+
+The lazy match evaluation is also subject to a runtime parameter. If
+the current match is long enough, zip reduces the search for a longer
+match, thus speeding up the whole process. If compression ratio is more
+important than speed, zip attempts a complete second search even if
+the first match is already long enough.
+
+The lazy match evaluation is not performed for the fastest compression
+modes (speed options -1 to -3). For these fast modes, new strings
+are inserted in the hash table only when no match was found, or
+when the match is not too long. This degrades the compression ratio
+but saves time since there are both fewer insertions and fewer searches.
+
+
+2. gzip file format
+
+The pkzip format imposes a lot of overhead in various headers, which
+are useful for an archiver but not necessary when only one file is
+compressed. gzip uses a much simpler structure. Numbers are in little
+endian format, and bit 0 is the least significant bit.
+A gzip file is a sequence of compressed members. Each member has the
+following structure:
+
+2 bytes magic header 0x1f, 0x8b (\037 \213)
+1 byte compression method (0..7 reserved, 8 = deflate)
+1 byte flags
+ bit 0 set: file probably ascii text
+ bit 1 set: continuation of multi-part gzip file
+ bit 2 set: extra field present
+ bit 3 set: original file name present
+ bit 4 set: file comment present
+ bit 5 set: file is encrypted
+ bit 6,7: reserved
+4 bytes file modification time in Unix format
+1 byte extra flags (depend on compression method)
+1 byte operating system on which compression took place
+
+2 bytes optional part number (second part=1)
+2 bytes optional extra field length
+? bytes optional extra field
+? bytes optional original file name, zero terminated
+? bytes optional file comment, zero terminated
+12 bytes optional encryption header
+? bytes compressed data
+4 bytes crc32
+4 bytes uncompressed input size modulo 2^32
+
+The format was designed to allow single pass compression without any
+backwards seek, and without a priori knowledge of the uncompressed
+input size or the available size on the output media. If input does
+not come from a regular disk file, the file modification time is set
+to the time at which compression started.
+
+The time stamp is useful mainly when one gzip file is transferred over
+a network. In this case it would not help to keep ownership
+attributes. In the local case, the ownership attributes are preserved
+by gzip when compressing/decompressing the file. A time stamp of zero
+is ignored.
+
+Bit 0 in the flags is only an optional indication, which can be set by
+a small lookahead in the input data. In case of doubt, the flag is
+cleared indicating binary data. For systems which have different
+file formats for ascii text and binary data, the decompressor can
+use the flag to choose the appropriate format.
+
+The extra field, if present, must consist of one or more subfields,
+each with the following format:
+
+ subfield id : 2 bytes
+ subfield size : 2 bytes (little-endian format)
+ subfield data
+
+The subfield id can consist of two letters with some mnemonic value.
+Please send any such id to <gzip@gnu.org>. Ids with a zero second
+byte are reserved for future use. The following ids are defined:
+
+ Ap (0x41, 0x70) : Apollo file type information
+
+The subfield size is the size of the subfield data and does not
+include the id and the size itself. The field 'extra field length' is
+the total size of the extra field, including subfield ids and sizes.
+
+It must be possible to detect the end of the compressed data with any
+compression format, regardless of the actual size of the compressed
+data. If the compressed data cannot fit in one file (in particular for
+diskettes), each part starts with a header as described above, but
+only the last part has the crc32 and uncompressed size. A decompressor
+may prompt for additional data for multipart compressed files. It is
+desirable but not mandatory that multiple parts be extractable
+independently so that partial data can be recovered if one of the
+parts is damaged. This is possible only if no compression state is
+kept from one part to the other. The compression-type dependent flags
+can indicate this.
+
+If the file being compressed is on a file system with case insensitive
+names, the original name field must be forced to lower case. There is
+no original file name if the data was compressed from standard input.
+
+Compression is always performed, even if the compressed file is
+slightly larger than the original. The worst case expansion is
+a few bytes for the gzip file header, plus 5 bytes every 32K block,
+or an expansion ratio of 0.015% for large files. Note that the actual
+number of used disk blocks almost never increases.
+
+The encryption is that of zip 1.9. For the encryption check, the
+last byte of the decoded encryption header must be zero. The time
+stamp of an encrypted file might be set to zero to avoid giving a clue
+about the construction of the random header.
+
+Jean-loup Gailly
+gzip@gnu.org
+
+References:
+
+[LZ77] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data
+Compression", IEEE Transactions on Information Theory", Vol. 23, No. 3,
+pp. 337-343.
+
+APPNOTE.TXT documentation file in PKZIP 1.93a. It is available by
+ftp in ftp.cso.uiuc.edu:/pc/exec-pc/pkz193a.exe [128.174.5.59]
+Use "unzip pkz193a.exe APPNOTE.TXT" to extract (note: unzip, not gunzip).
diff --git a/Build/source/utils/gzip/amiga/Makefile.gcc b/Build/source/utils/gzip/amiga/Makefile.gcc
new file mode 100644
index 00000000000..98635c1ae4e
--- /dev/null
+++ b/Build/source/utils/gzip/amiga/Makefile.gcc
@@ -0,0 +1,62 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
+
+# Amiga GCC version, written by Preston Hunt <gt5708a@prism.gatech.edu>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+CC = gcc
+CPP = cpp
+
+CFLAGS = -m68020 -m68881 -O2
+#CFLAGS = -m68000 -O2
+#for the 68000, set below: OBJA=
+CPPFLAGS = -Dmc68020
+LDFLAGS =
+O = .o
+
+SRCS = gzip.c zip.c deflate.c trees.c bits.c unzip.c inflate.c util.c crypt.c\
+ lzw.c unlzw.c unpack.c unlzh.c makecrc.c getopt.c match.S
+
+OBJA = match$O
+
+OBJS = gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O util$O \
+ crypt$O lzw$O unlzw$O unpack$O unlzh$O getopt$O match$O
+
+HDRS = gzip.h lzw.h tailor.h revision.h crypt.h getopt.h
+
+.c.o:
+ $(CC) -c $(DEFS) $(CFLAGS) $<
+
+.PHONY: default all
+all: gzip
+
+gzip: $(OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+
+gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O: gzip.h tailor.h
+util$O lzw$O unlzw$O unpack$O unlzh$O crypt$O: gzip.h tailor.h
+
+gzip$O unlzw$O: revision.h lzw.h
+
+bits$O unzip$O util$O zip$O: crypt.h
+
+gzip$O getopt$O: getopt.h
+
+match$O: match.S
+ $(CPP) $(CPPFLAGS) match.S > _match.s
+ $(CC) -c _match.s
+ mv _match$O match$O
+ rm -f _match.s
diff --git a/Build/source/utils/gzip/amiga/Makefile.sasc b/Build/source/utils/gzip/amiga/Makefile.sasc
new file mode 100644
index 00000000000..faf15fd3e87
--- /dev/null
+++ b/Build/source/utils/gzip/amiga/Makefile.sasc
@@ -0,0 +1,59 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# This Makefile is for SAS/C 6.3 on the Amiga
+# Don't use it with SAS/C 6.2 or earlier versions. These versions will
+# produce incorrect code for trees.c because of a bug in the optimizer.
+# Made by Carsten Steger (carsten.steger@informatik.tu-muenchen.de)
+
+# Some notes on gzip for the Amiga:
+# Due to a strange implementation of the RAM-Disk on Commodore's part
+# you should not use gzip -r on a directory in the RAM-Disk. To zip all
+# files in a directory 'dir' in the RAM-Disk use something like
+# gzip ram:dir/#? ram:dir/#?/#? ...
+# where the number of '#?'s reflects the depth of the directory 'dir'.
+#
+# Alas, the program has it's full functionality only if you have
+# Kickstart 2.0 or higher installed. This affects the expansion of
+# wildcards and the preservation of file access times. You should use
+# a shell that does wildcard expansion under Kickstart 1.3.
+
+
+CC = sc
+
+# If you have a 68020 or more you can define UNALIGNED_OK below
+DEFS = DEF=AMIGA
+LIBS = LIB LIB:scnb.lib
+
+CFLAGS = DATA=FAR NOSTKCHK PARM=R IDIR=
+OPTFLAGS = OPT OPTGO OPTPEEP OPTCOMP=3 OPTDEP=3 OPTRDEP=3
+LDFLAGS = FROM LIB:c.o
+
+OBJS = gzip.o zip.o deflate.o trees.o bits.o unzip.o inflate.o util.o \
+ crypt.o lzw.o unlzw.o unpack.o unlzh.o getopt.o tailor.o match.o
+
+.c.o:
+ $(CC) $(DEFS) $(CFLAGS) $(OPTFLAGS) $<
+.a.o:
+ $(CC) $(DEFS) $(CFLAGS) $<
+
+all: gzip
+
+gzip: $(OBJS)
+ slink $(LDFLAGS) $(OBJS) TO $@ $(LIBS)
+
+gzip.o: gzip.c gzip.h tailor.h revision.h lzw.h getopt.h
+zip.o: zip.c gzip.h tailor.h crypt.h
+deflate.o: deflate.c gzip.h tailor.h lzw.h
+trees.o: trees.c gzip.h tailor.h
+bits.o: bits.c gzip.h tailor.h crypt.h
+unzip.o: unzip.c gzip.h tailor.h crypt.h
+inflate.o: inflate.c gzip.h tailor.h
+util.o: util.c gzip.h tailor.h crypt.h
+lzw.o: lzw.c lzw.h gzip.h tailor.h
+unlzw.o: unlzw.c gzip.h tailor.h lzw.h
+unpack.o: unpack.c gzip.h tailor.h crypt.h
+unlzh.o: unlzh.c gzip.h tailor.h lzw.h
+crypt.o: crypt.c
+getopt.o: getopt.c getopt.h
+tailor.o: tailor.c
+
+match.o: match.a
diff --git a/Build/source/utils/gzip/amiga/match.a b/Build/source/utils/gzip/amiga/match.a
new file mode 100644
index 00000000000..0b458d2bf61
--- /dev/null
+++ b/Build/source/utils/gzip/amiga/match.a
@@ -0,0 +1,175 @@
+; match.a -- optional optimized asm version of longest match in deflate.c
+; Copyright (C) 1992-1993 Jean-loup Gailly
+; This is free software; you can redistribute it and/or modify it under the
+; terms of the GNU General Public License, see the file COPYING.
+
+; $Id: match.a,v 1.1 1993/03/11 16:05:57 jloup Exp $
+;
+; Adapted for the Amiga by Carsten Steger <stegerc@informatik.tu-muenchen.de>
+; using the code in match.S.
+; The major change in this code consists of removing all unaligned
+; word accesses, because they cause 68000-based Amigas to crash.
+; For maximum speed, UNALIGNED_OK can be defined in Makefile.sasc.
+; The program will then only run on 68020-based Amigas, though.
+;
+; This code will run with registerized parameters too, unless SAS
+; changes parameter passing conventions between new releases of SAS/C.
+
+
+Cur_Match reg d0 ; Must be in d0!
+Best_Len reg d1
+Loop_Counter reg d2
+Scan_Start reg d3
+Scan_End reg d4
+Limit reg d5
+Chain_Length reg d6
+Scan_Test reg d7
+Scan reg a0
+Match reg a1
+Prev_Address reg a2
+Scan_Ini reg a3
+Match_Ini reg a4
+
+MAX_MATCH equ 258
+MIN_MATCH equ 3
+WSIZE equ 32768
+MAX_DIST equ WSIZE-MAX_MATCH-MIN_MATCH-1
+
+
+ xref _max_chain_length
+ xref _prev_length
+ xref _prev
+ xref _window
+ xref _strstart
+ xref _good_match
+ xref _match_start
+ xref _nice_match
+
+
+ section match,code
+
+ xdef _match_init
+ xdef @match_init
+ xdef _longest_match
+ xdef @longest_match
+
+
+_match_init:
+@match_init:
+ rts
+
+
+_longest_match:
+ move.l 4(sp),Cur_Match
+@longest_match:
+ ifd UNALIGNED_OK
+ movem.l d2-d6/a2-a4,-(sp)
+ else
+ movem.l d2-d7/a2-a4,-(sp)
+ endc
+ move.l _max_chain_length,Chain_Length
+ move.l _prev_length,Best_Len
+ lea _prev,Prev_Address
+ lea _window+MIN_MATCH,Match_Ini
+ move.l _strstart,Limit
+ move.l Match_Ini,Scan_Ini
+ add.l Limit,Scan_Ini
+ subi.w #MAX_DIST,Limit
+ bhi.b limit_ok
+ moveq #0,Limit
+limit_ok:
+ cmp.l _good_match,Best_Len
+ bcs.b length_ok
+ lsr.l #2,Chain_Length
+length_ok:
+ subq.l #1,Chain_Length
+
+ ifd UNALIGNED_OK
+
+ move.w -MIN_MATCH(Scan_Ini),Scan_Start
+ move.w -MIN_MATCH-1(Scan_Ini,Best_Len),Scan_End
+
+ else
+
+ move.b -MIN_MATCH(Scan_Ini),Scan_Start
+ lsl.w #8,Scan_Start
+ move.b -MIN_MATCH+1(Scan_Ini),Scan_Start
+ move.b -MIN_MATCH-1(Scan_Ini,Best_Len),Scan_End
+ lsl.w #8,Scan_End
+ move.b -MIN_MATCH(Scan_Ini,Best_Len),Scan_End
+
+ endc
+
+ bra.b do_scan
+
+long_loop:
+
+ ifd UNALIGNED_OK
+
+ move.w -MIN_MATCH-1(Scan_Ini,Best_Len),Scan_End
+
+ else
+
+ move.b -MIN_MATCH-1(Scan_Ini,Best_Len),Scan_End
+ lsl.w #8,Scan_End
+ move.b -MIN_MATCH(Scan_Ini,Best_Len),Scan_End
+
+ endc
+
+short_loop:
+ lsl.w #1,Cur_Match
+ move.w 0(Prev_Address,Cur_Match),Cur_Match
+ cmp.w Limit,Cur_Match
+ dbls Chain_Length,do_scan
+ bra.b return
+
+do_scan:
+ move.l Match_Ini,Match
+ add.l Cur_Match,Match
+
+ ifd UNALIGNED_OK
+
+ cmp.w -MIN_MATCH-1(Match,Best_Len),Scan_End
+ bne.b short_loop
+ cmp.w -MIN_MATCH(Match),Scan_Start
+ bne.b short_loop
+
+ else
+
+ move.b -MIN_MATCH-1(Match,Best_Len),Scan_Test
+ lsl.w #8,Scan_Test
+ move.b -MIN_MATCH(Match,Best_Len),Scan_Test
+ cmp.w Scan_Test,Scan_End
+ bne.b short_loop
+ move.b -MIN_MATCH(Match),Scan_Test
+ lsl.w #8,Scan_Test
+ move.b -MIN_MATCH+1(Match),Scan_Test
+ cmp.w Scan_Test,Scan_Start
+ bne.b short_loop
+
+ endc
+
+ move.w #(MAX_MATCH-MIN_MATCH),Loop_Counter
+ move.l Scan_Ini,Scan
+scan_loop:
+ cmpm.b (Match)+,(Scan)+
+ dbne Loop_Counter,scan_loop
+
+ sub.l Scan_Ini,Scan
+ addq.l #(MIN_MATCH-1),Scan
+ cmp.l Best_Len,Scan
+ bls.b short_loop
+ move.l Scan,Best_Len
+ move.l Cur_Match,_match_start
+ cmp.l _nice_match,Best_Len
+ bcs.b long_loop
+return:
+ move.l Best_Len,d0
+ ifd UNALIGNED_OK
+ movem.l (sp)+,d2-d6/a2-a4
+ else
+ movem.l (sp)+,d2-d7/a2-a4
+ endc
+ rts
+
+ end
diff --git a/Build/source/utils/gzip/amiga/tailor.c b/Build/source/utils/gzip/amiga/tailor.c
new file mode 100644
index 00000000000..9f14cc45b6c
--- /dev/null
+++ b/Build/source/utils/gzip/amiga/tailor.c
@@ -0,0 +1,183 @@
+/* tailor.c -- target dependent functions
+ * Copyright (C) 1993 Carsten Steger (carsten.steger@informatik.tu-muenchen.de)
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+/*
+ * This file contains Amiga specific functions for gzip.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <error.h>
+#include <time.h>
+#include <utime.h>
+#include <exec/types.h>
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+#include <dos/dosasl.h>
+#include <proto/dos.h>
+
+#define MAXPATH 1024
+#define MAXARGS 512
+
+extern struct DosLibrary *DOSBase;
+
+extern void *xmalloc(unsigned int size);
+
+static char *expand_next_file (char *pattern);
+static int in_prev_args (char *arg, char **argv, int argc);
+extern void _expand_args (int *oargc, char ***oargv);
+
+
+static char *expand_next_file (pattern)
+ char *pattern;
+{
+ long err;
+ char *pathname;
+ static struct AnchorPath *an = NULL;
+
+ pathname = NULL;
+ if (pattern == NULL)
+ err = -1;
+ else
+ do
+ {
+ if (an == NULL)
+ {
+ an = xmalloc (sizeof (struct AnchorPath) + MAXPATH);
+ memset (an, 0, sizeof (struct AnchorPath) + MAXPATH);
+ an->ap_BreakBits = SIGBREAKF_CTRL_C;
+ an->ap_Strlen = MAXPATH;
+ an->ap_Flags = APF_DOWILD;
+ err = MatchFirst (pattern, an);
+ }
+ else
+ err = MatchNext (an);
+
+ pathname = an->ap_Buf;
+ } while (err == 0 && pathname == NULL);
+
+ if (err)
+ {
+ MatchEnd (an);
+ free (an);
+ an = NULL;
+ return NULL;
+ }
+ else
+ return pathname;
+}
+
+
+static int in_prev_args (arg, argv, argc)
+ char *arg, **argv;
+ int argc;
+{
+ int i, is_in_args;
+
+ is_in_args = 0;
+ for (i = 1; i < argc - 1; i++)
+ if (stricmp (arg, argv[i]) == 0)
+ is_in_args = 1;
+ return is_in_args;
+}
+
+
+void _expand_args (oargc, oargv)
+ int *oargc;
+ char ***oargv;
+{
+ int i;
+ char *str, **argv;
+ static char buf[MAXPATH];
+ int argc, no_match_at_all, num_matches, contains_wildcards;
+
+ /* With Kickstart 1.3 wildcards can't be expanded. */
+ if (DOSBase->dl_lib.lib_Version < 37) return;
+
+ no_match_at_all = 1;
+ contains_wildcards = 0;
+ argc = 0;
+ argv = xmalloc (MAXARGS * sizeof (char *));
+
+ argv[argc++] = (*oargv)[0];
+ for (i = 1; i < *oargc; i++)
+ {
+ if (ParsePattern ((*oargv)[i], buf, MAXPATH))
+ {
+ contains_wildcards = 1;
+ num_matches = 0;
+ while (str = expand_next_file ((*oargv)[i]))
+ if (argc >= MAXARGS)
+ {
+ expand_next_file (NULL);
+ fprintf (stderr,"Too many files.\n");
+ exit (20);
+ }
+ else
+ {
+ /* Avoid duplicate entries */
+ if (!in_prev_args (str, argv, argc))
+ {
+ argv[argc++] = strdup (str);
+ num_matches++;
+ }
+ }
+ if (num_matches != 0)
+ no_match_at_all = 0;
+ }
+ else
+ if (argc >= MAXARGS)
+ {
+ fprintf (stderr,"Too many files.\n");
+ exit (20);
+ }
+ else
+ {
+ if (!in_prev_args ((*oargv)[i], argv, argc))
+ argv[argc++] = (*oargv)[i];
+ }
+ }
+ *oargc = argc;
+ *oargv = argv;
+ if (no_match_at_all && contains_wildcards) {
+ fprintf (stderr,"No match.\n");
+ exit (20);
+ }
+}
+
+
+int utime (path, times)
+ char *path;
+ struct utimbuf *times;
+{
+ struct DateStamp date;
+ LONG error;
+ time_t modtime;
+
+ /* With Kickstart 1.3 setting the filedate could be done, I guess.
+ * Maybe someone else will implement and test the code for this
+ * case (I don't have Kickstart 1.3). */
+ if (DOSBase->dl_lib.lib_Version < 37) return 0;
+
+ /* Amiga dates are counted from 1. Jan 1978 as opposed to 1. Jan 1970
+ * on Unix. Therefore we have to subtract 2922 days (8*365+2). We also
+ * have to subtract the value of __timezone since SAS/C uses "CST+06"
+ * as the default value. */
+ modtime = times->modtime - __timezone;
+ date.ds_Days = (modtime / 86400) - 2922;
+ modtime %= 86400;
+ date.ds_Minute = modtime / 60;
+ modtime %= 60;
+ date.ds_Tick = modtime * TICKS_PER_SECOND;
+ error = SetFileDate (path, &date);
+ if (error == DOSFALSE)
+ {
+ errno = EOSERR;
+ return -1;
+ }
+ return 0;
+}
diff --git a/Build/source/utils/gzip/amiga/utime.h b/Build/source/utils/gzip/amiga/utime.h
new file mode 100644
index 00000000000..8c35a1aac09
--- /dev/null
+++ b/Build/source/utils/gzip/amiga/utime.h
@@ -0,0 +1,15 @@
+#ifndef _UTIME_H
+#define _UTIME_H 1
+
+#ifndef _TIME_H
+#include <time.h>
+#endif
+
+struct utimbuf {
+ time_t actime;
+ time_t modtime;
+};
+
+extern int utime (char *path, struct utimbuf *times);
+
+#endif
diff --git a/Build/source/utils/gzip/atari/Makefile.st b/Build/source/utils/gzip/atari/Makefile.st
new file mode 100644
index 00000000000..c32fe9a4b51
--- /dev/null
+++ b/Build/source/utils/gzip/atari/Makefile.st
@@ -0,0 +1,48 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# This is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License, see the file COPYING.
+
+# Simple Atari-specific makefile for gcc.
+# Written by Daniel Eriksson <den@hgs.se>
+# Modified by Andreas Schwab <schwab@ls5.informatik.uni-dortmund.de>
+# and Robert Fischer <fischer-robert@cs.yale.edu>.
+
+# This Makefile is configured by default for the Atari ST using the
+# Minix filesytem. It can be modified (for efficiency) for an Atari TT
+# according to the instructions given below. It must be modified
+# for building a TOS-filesystem version.
+
+CC=gcc
+BASIC_FLAGS = -O2 -DATARI
+
+# Use this for a TT-only version
+#TT_FLAGS = -m68020
+
+# CFLAGS for building a Minix-filesystem version
+CFLAGS = $(BASIC_FLAGS) $(TT_FLAGS)
+
+# CFLAGS for building a TOS-filesystem version
+#CFLAGS = $(BASIC_FLAGS) $(TT_FLAGS) -DTOSFS
+
+AS=$(CC) -c
+ASFLAGS = $(CFLAGS)
+LDFLAGS =
+
+OBJA = match.o
+OBJS = bits.o crypt.o deflate.o getopt.o gzip.o inflate.o lzw.o \
+ trees.o unlzw.o unpack.o unlzh.o unzip.o util.o zip.o $(OBJA)
+
+gzip.ttp: $(OBJS)
+ $(CC) $(LDFLAGS) -o gzip.ttp $(OBJS)
+
+gzip.o zip.o deflate.o trees.o bits.o unzip.o inflate.o: gzip.h tailor.h
+util.o lzw.o unlzw.o unpack.o unlzh.o crypt.o: gzip.h tailor.h
+
+gzip.o unlzw.o: revision.h lzw.h
+
+bits.o unzip.o util.o zip.o: crypt.h
+
+gzip.o getopt.o: getopt.h
+
+match.o: match.S
+ $(AS) $(ASLAGS) match.S
diff --git a/Build/source/utils/gzip/bits.c b/Build/source/utils/gzip/bits.c
new file mode 100644
index 00000000000..544d6da9d39
--- /dev/null
+++ b/Build/source/utils/gzip/bits.c
@@ -0,0 +1,205 @@
+/* bits.c -- output variable-length bit strings
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+
+/*
+ * PURPOSE
+ *
+ * Output variable-length bit strings. Compression can be done
+ * to a file or to memory. (The latter is not supported in this version.)
+ *
+ * DISCUSSION
+ *
+ * The PKZIP "deflate" file format interprets compressed file data
+ * as a sequence of bits. Multi-bit strings in the file may cross
+ * byte boundaries without restriction.
+ *
+ * The first bit of each byte is the low-order bit.
+ *
+ * The routines in this file allow a variable-length bit value to
+ * be output right-to-left (useful for literal values). For
+ * left-to-right output (useful for code strings from the tree routines),
+ * the bits must have been reversed first with bi_reverse().
+ *
+ * For in-memory compression, the compressed bit stream goes directly
+ * into the requested output buffer. The input data is read in blocks
+ * by the mem_read() function. The buffer is limited to 64K on 16 bit
+ * machines.
+ *
+ * INTERFACE
+ *
+ * void bi_init (FILE *zipfile)
+ * Initialize the bit string routines.
+ *
+ * void send_bits (int value, int length)
+ * Write out a bit string, taking the source bits right to
+ * left.
+ *
+ * int bi_reverse (int value, int length)
+ * Reverse the bits of a bit string, taking the source bits left to
+ * right and emitting them right to left.
+ *
+ * void bi_windup (void)
+ * Write out any remaining bits in an incomplete byte.
+ *
+ * void copy_block(char *buf, unsigned len, int header)
+ * Copy a stored block to the zip file, storing first the length and
+ * its one's complement if requested.
+ *
+ */
+
+#include "tailor.h"
+#include "gzip.h"
+#include "crypt.h"
+
+#ifdef DEBUG
+# include <stdio.h>
+#endif
+
+#ifdef RCSID
+static char rcsid[] = "$Id: bits.c,v 0.9 1993/06/11 10:16:58 jloup Exp $";
+#endif
+
+/* ===========================================================================
+ * Local data used by the "bit string" routines.
+ */
+
+local file_t zfile; /* output gzip file */
+
+local unsigned short bi_buf;
+/* Output buffer. bits are inserted starting at the bottom (least significant
+ * bits).
+ */
+
+#define Buf_size (8 * 2*sizeof(char))
+/* Number of bits used within bi_buf. (bi_buf might be implemented on
+ * more than 16 bits on some systems.)
+ */
+
+local int bi_valid;
+/* Number of valid bits in bi_buf. All bits above the last valid bit
+ * are always zero.
+ */
+
+int (*read_buf) OF((char *buf, unsigned size));
+/* Current input function. Set to mem_read for in-memory compression */
+
+#ifdef DEBUG
+ ulg bits_sent; /* bit length of the compressed data */
+#endif
+
+/* ===========================================================================
+ * Initialize the bit string routines.
+ */
+void bi_init (zipfile)
+ file_t zipfile; /* output zip file, NO_FILE for in-memory compression */
+{
+ zfile = zipfile;
+ bi_buf = 0;
+ bi_valid = 0;
+#ifdef DEBUG
+ bits_sent = 0L;
+#endif
+
+ /* Set the defaults for file compression. They are set by memcompress
+ * for in-memory compression.
+ */
+ if (zfile != NO_FILE) {
+ read_buf = file_read;
+ }
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+void send_bits(value, length)
+ int value; /* value to send */
+ int length; /* number of bits */
+{
+#ifdef DEBUG
+ Tracev((stderr," l %2d v %4x ", length, value));
+ Assert(length > 0 && length <= 15, "invalid length");
+ bits_sent += (ulg)length;
+#endif
+ /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+ * unused bits in value.
+ */
+ if (bi_valid > (int)Buf_size - length) {
+ bi_buf |= (value << bi_valid);
+ put_short(bi_buf);
+ bi_buf = (ush)value >> (Buf_size - bi_valid);
+ bi_valid += length - Buf_size;
+ } else {
+ bi_buf |= value << bi_valid;
+ bi_valid += length;
+ }
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+unsigned bi_reverse(code, len)
+ unsigned code; /* the value to invert */
+ int len; /* its bit length */
+{
+ register unsigned res = 0;
+ do {
+ res |= code & 1;
+ code >>= 1, res <<= 1;
+ } while (--len > 0);
+ return res >> 1;
+}
+
+/* ===========================================================================
+ * Write out any remaining bits in an incomplete byte.
+ */
+void bi_windup()
+{
+ if (bi_valid > 8) {
+ put_short(bi_buf);
+ } else if (bi_valid > 0) {
+ put_byte(bi_buf);
+ }
+ bi_buf = 0;
+ bi_valid = 0;
+#ifdef DEBUG
+ bits_sent = (bits_sent+7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Copy a stored block to the zip file, storing first the length and its
+ * one's complement if requested.
+ */
+void copy_block(buf, len, header)
+ char *buf; /* the input data */
+ unsigned len; /* its length */
+ int header; /* true if block header must be written */
+{
+ bi_windup(); /* align on byte boundary */
+
+ if (header) {
+ put_short((ush)len);
+ put_short((ush)~len);
+#ifdef DEBUG
+ bits_sent += 2*16;
+#endif
+ }
+#ifdef DEBUG
+ bits_sent += (ulg)len<<3;
+#endif
+ while (len--) {
+#ifdef CRYPT
+ int t;
+ if (key) zencode(*buf, t);
+#endif
+ put_byte(*buf++);
+ }
+}
diff --git a/Build/source/utils/gzip/configure b/Build/source/utils/gzip/configure
new file mode 100755
index 00000000000..df9eab3615e
--- /dev/null
+++ b/Build/source/utils/gzip/configure
@@ -0,0 +1,826 @@
+#!/bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf.
+# Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# Usage: configure [--srcdir=DIR] [--host=HOST] [--gas] [--nfp] [--no-create]
+# [--prefix=PREFIX] [--exec-prefix=PREFIX] [--with-PACKAGE] [TARGET]
+# Ignores all args except --srcdir, --prefix, --exec-prefix, --no-create, and
+# --with-PACKAGE unless this script has special code to handle it.
+
+
+for arg
+do
+ # Handle --exec-prefix with a space before the argument.
+ if test x$next_exec_prefix = xyes; then exec_prefix=$arg; next_exec_prefix=
+ # Handle --host with a space before the argument.
+ elif test x$next_host = xyes; then next_host=
+ # Handle --prefix with a space before the argument.
+ elif test x$next_prefix = xyes; then prefix=$arg; next_prefix=
+ # Handle --srcdir with a space before the argument.
+ elif test x$next_srcdir = xyes; then srcdir=$arg; next_srcdir=
+ else
+ case $arg in
+ # For backward compatibility, also recognize exact --exec_prefix.
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* | --exe=* | --ex=* | --e=*)
+ exec_prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;;
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e)
+ next_exec_prefix=yes ;;
+
+ -gas | --gas | --ga | --g) ;;
+
+ -host=* | --host=* | --hos=* | --ho=* | --h=*) ;;
+ -host | --host | --hos | --ho | --h)
+ next_host=yes ;;
+
+ -nfp | --nfp | --nf) ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre | --no-cr | --no-c | --no- | --no)
+ no_create=1 ;;
+
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ next_prefix=yes ;;
+
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*)
+ srcdir=`echo $arg | sed 's/[-a-z_]*=//'` ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr | --s)
+ next_srcdir=yes ;;
+
+ -with-* | --with-*)
+ package=`echo $arg|sed 's/-*with-//'`
+ # Delete all the valid chars; see if any are left.
+ if test -n "`echo $package|sed 's/[-a-zA-Z0-9_]*//g'`"; then
+ echo "configure: $package: invalid package name" >&2; exit 1
+ fi
+ eval "with_`echo $package|sed s/-/_/g`=1" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb | --ver | --ve | --v)
+ verbose=yes ;;
+
+ *) ;;
+ esac
+ fi
+done
+
+trap 'rm -f conftest* core; exit 1' 1 3 15
+
+# Needed for some versions of `tr' so that character classes in `[]' work.
+if test "${LANG+set}" = "set" ; then
+ LANG=C
+ LC_ALL=C
+ export LANG LC_ALL
+fi
+
+rm -f conftest*
+compile='${CC-cc} $CFLAGS $DEFS conftest.c -o conftest $LIBS >/dev/null 2>&1'
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+unique_file=gzip.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ srcdirdefaulted=yes
+ # Try the directory containing this script, then `..'.
+ prog=$0
+ confdir=`echo $prog|sed 's%/[^/][^/]*$%%'`
+ test "X$confdir" = "X$prog" && confdir=.
+ srcdir=$confdir
+ if test ! -r $srcdir/$unique_file; then
+ srcdir=..
+ fi
+fi
+if test ! -r $srcdir/$unique_file; then
+ if test x$srcdirdefaulted = xyes; then
+ echo "configure: Can not find sources in \`${confdir}' or \`..'." 1>&2
+ else
+ echo "configure: Can not find sources in \`${srcdir}'." 1>&2
+ fi
+ exit 1
+fi
+# Preserve a srcdir of `.' to avoid automounter screwups with pwd.
+# But we can't avoid them for `..', to make subdirectories work.
+case $srcdir in
+ .|/*|~*) ;;
+ *) srcdir=`cd $srcdir; pwd` ;; # Make relative path absolute.
+esac
+
+if test -z "$CC"; then
+ # Extract the first word of `gcc', so it can be a program name with args.
+ set dummy gcc; word=$2
+ echo checking for $word
+ IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:"
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/$word; then
+ CC="gcc"
+ break
+ fi
+ done
+ IFS="$saveifs"
+fi
+test -z "$CC" && CC="cc"
+test -n "$CC" -a -n "$verbose" && echo " setting CC to $CC"
+
+# Find out if we are using GNU C, under whatever name.
+cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes
+#endif
+EOF
+${CC-cc} -E conftest.c > conftest.out 2>&1
+if egrep yes conftest.out >/dev/null 2>&1; then
+ GCC=1 # For later tests.
+ CFLAGS="${CFLAGS--O}"
+fi
+rm -f conftest*
+
+echo checking how to run the C preprocessor
+if test -z "$CPP"; then
+ CPP='${CC-cc} -E'
+ cat > conftest.c <<EOF
+#include <stdio.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ :
+else
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+
+echo checking for underline in external names
+test -z "$ASCPP" -a -f /lib/cpp && ASCPP=/lib/cpp
+test -z "$ASCPP" && ASCPP="$CC -E"
+cat > conftest.c <<EOF
+int foo() {return 0;}
+EOF
+eval "$CC -c conftest.c > /dev/null 2>&1"
+if nm conftest.o | grep _foo > /dev/null 2>&1 ; then
+ :
+else
+ ASCPP="${ASCPP} -DNO_UNDERLINE"
+fi
+rm -f _match.o conftest.c conftest.o
+if echo "$DEFS" | grep NO_ASM >/dev/null; then
+ :
+else
+ echo checking for assembler
+ OBJA=""
+ if eval "$ASCPP $srcdir/match.S > _match.s 2>/dev/null"; then
+ if test ! -s _match.s || grep error < _match.s > /dev/null; then
+ :
+ elif eval "$CC -c _match.s >/dev/null 2>&1" && test -f _match.o; then
+ DEFS="${DEFS} -DASMV"
+ OBJA=match.o
+ fi
+ fi
+ rm -f _match.s _match.o
+fi
+# Make sure to not get the incompatible SysV /etc/install and
+# /usr/sbin/install, which might be in PATH before a BSD-like install,
+# or the SunOS /usr/etc/install directory, or the AIX /bin/install,
+# or the AFS install, which mishandles nonexistent args, or
+# /usr/ucb/install on SVR4, which tries to use the nonexistent group
+# `staff'. On most BSDish systems install is in /usr/bin, not /usr/ucb
+# anyway. Sigh.
+if test "z${INSTALL}" = "z" ; then
+ echo checking for install
+ IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:"
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ case $dir in
+ /etc|/usr/sbin|/usr/etc|/usr/afsws/bin|/usr/ucb) ;;
+ *)
+ if test -f $dir/installbsd; then
+ INSTALL="$dir/installbsd -c" # OSF1
+ INSTALL_PROGRAM='$(INSTALL)'
+ INSTALL_DATA='$(INSTALL) -m 644'
+ break
+ fi
+ if test -f $dir/install; then
+ if grep dspmsg $dir/install >/dev/null 2>&1; then
+ : # AIX
+ else
+ INSTALL="$dir/install -c"
+ INSTALL_PROGRAM='$(INSTALL)'
+ INSTALL_DATA='$(INSTALL) -m 644'
+ break
+ fi
+ fi
+ ;;
+ esac
+ done
+ IFS="$saveifs"
+fi
+INSTALL=${INSTALL-cp}
+INSTALL_PROGRAM=${INSTALL_PROGRAM-'$(INSTALL)'}
+INSTALL_DATA=${INSTALL_DATA-'$(INSTALL)'}
+
+echo checking for AIX
+cat > conftest.c <<EOF
+#ifdef _AIX
+ yes
+#endif
+
+EOF
+eval "$CPP \$DEFS conftest.c > conftest.out 2>&1"
+if egrep "yes" conftest.out >/dev/null 2>&1; then
+ {
+test -n "$verbose" && \
+echo ' defining' _ALL_SOURCE
+DEFS="$DEFS -D_ALL_SOURCE=1"
+}
+
+fi
+rm -f conftest*
+
+
+echo checking for minix/config.h
+cat > conftest.c <<EOF
+#include <minix/config.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ MINIX=1
+fi
+rm -f conftest*
+
+# The Minix shell can't assign to the same variable on the same line!
+if test -n "$MINIX"; then
+ {
+test -n "$verbose" && \
+echo ' defining' _POSIX_SOURCE
+DEFS="$DEFS -D_POSIX_SOURCE=1"
+}
+
+ {
+test -n "$verbose" && \
+echo ' defining' _POSIX_1_SOURCE to be '2'
+DEFS="$DEFS -D_POSIX_1_SOURCE=2"
+}
+
+ {
+test -n "$verbose" && \
+echo ' defining' _MINIX
+DEFS="$DEFS -D_MINIX=1"
+}
+
+fi
+
+echo checking for POSIXized ISC
+if test -d /etc/conf/kconfig.d &&
+ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+ ISC=1 # If later tests want to check for ISC.
+ {
+test -n "$verbose" && \
+echo ' defining' _POSIX_SOURCE
+DEFS="$DEFS -D_POSIX_SOURCE=1"
+}
+
+ if test -n "$GCC"; then
+ CC="$CC -posix"
+ else
+ CC="$CC -Xp"
+ fi
+fi
+
+echo checking for DYNIX/ptx libseq
+cat > conftest.c <<EOF
+#if defined(_SEQUENT_)
+ yes
+#endif
+
+EOF
+eval "$CPP \$DEFS conftest.c > conftest.out 2>&1"
+if egrep "yes" conftest.out >/dev/null 2>&1; then
+ SEQUENT=1
+fi
+rm -f conftest*
+
+test -n "$SEQUENT" && test -f /usr/lib/libseq.a &&
+ LIBS="$LIBS -lseq"
+
+echo checking for ANSI C header files
+cat > conftest.c <<EOF
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+echo '#include <string.h>' > conftest.c
+eval "$CPP \$DEFS conftest.c > conftest.out 2>&1"
+if egrep "memchr" conftest.out >/dev/null 2>&1; then
+ # SGI's /bin/cc from Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+cat > conftest.c <<EOF
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e,f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+eval $compile
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+ {
+test -n "$verbose" && \
+echo ' defining' STDC_HEADERS
+DEFS="$DEFS -DSTDC_HEADERS=1"
+}
+
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+
+fi
+rm -f conftest*
+
+echo checking for string.h
+cat > conftest.c <<EOF
+#include <string.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_STRING_H
+DEFS="$DEFS -DNO_STRING_H=1"
+}
+
+fi
+rm -f conftest*
+
+echo checking for stdlib.h
+cat > conftest.c <<EOF
+#include <stdlib.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_STDLIB_H
+DEFS="$DEFS -DNO_STDLIB_H=1"
+}
+
+fi
+rm -f conftest*
+
+echo checking for memory.h
+cat > conftest.c <<EOF
+#include <memory.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_MEMORY_H
+DEFS="$DEFS -DNO_MEMORY_H=1"
+}
+
+fi
+rm -f conftest*
+
+echo checking for fcntl.h
+cat > conftest.c <<EOF
+#include <fcntl.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_FCNTL_H
+DEFS="$DEFS -DNO_FCNTL_H=1"
+}
+
+fi
+rm -f conftest*
+
+echo checking for time.h
+cat > conftest.c <<EOF
+#include <time.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_TIME_H
+DEFS="$DEFS -DNO_TIME_H=1"
+}
+
+fi
+rm -f conftest*
+
+for hdr in unistd.h
+do
+trhdr=HAVE_`echo $hdr | tr '[a-z]./' '[A-Z]__'`
+echo checking for ${hdr}
+cat > conftest.c <<EOF
+#include <${hdr}>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ {
+test -n "$verbose" && \
+echo ' defining' ${trhdr}
+DEFS="$DEFS -D${trhdr}=1"
+}
+
+fi
+rm -f conftest*
+done
+
+utime=0
+echo checking for utime.h
+cat > conftest.c <<EOF
+#include <utime.h>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ utime=1
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_UTIME_H
+DEFS="$DEFS -DNO_UTIME_H=1"
+}
+
+fi
+rm -f conftest*
+
+if test $utime -eq 0; then
+ for hdr in sys/utime.h
+do
+trhdr=HAVE_`echo $hdr | tr '[a-z]./' '[A-Z]__'`
+echo checking for ${hdr}
+cat > conftest.c <<EOF
+#include <${hdr}>
+EOF
+err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"`
+if test -z "$err"; then
+ {
+test -n "$verbose" && \
+echo ' defining' ${trhdr}
+DEFS="$DEFS -D${trhdr}=1"
+}
+
+fi
+rm -f conftest*
+done
+
+fi
+echo checking for directory library header
+dirheader=
+if test -z "$dirheader"; then
+ echo checking for dirent.h
+cat > conftest.c <<EOF
+#include <sys/types.h>
+#include <dirent.h>
+int main() { exit(0); }
+int t() { DIR *dirp = opendir ("/"); }
+EOF
+if eval $compile; then
+ {
+test -n "$verbose" && \
+echo ' defining' DIRENT
+DEFS="$DEFS -DDIRENT=1"
+}
+ dirheader=dirent.h
+fi
+rm -f conftest*
+fi
+if test -z "$dirheader"; then
+ echo checking for sys/ndir.h
+cat > conftest.c <<EOF
+#include <sys/types.h>
+#include <sys/ndir.h>
+int main() { exit(0); }
+int t() { DIR *dirp = opendir ("/"); }
+EOF
+if eval $compile; then
+ {
+test -n "$verbose" && \
+echo ' defining' SYSNDIR
+DEFS="$DEFS -DSYSNDIR=1"
+}
+ dirheader=sys/ndir.h
+fi
+rm -f conftest*
+fi
+if test -z "$dirheader"; then
+ echo checking for sys/dir.h
+cat > conftest.c <<EOF
+#include <sys/types.h>
+#include <sys/dir.h>
+int main() { exit(0); }
+int t() { DIR *dirp = opendir ("/"); }
+EOF
+if eval $compile; then
+ {
+test -n "$verbose" && \
+echo ' defining' SYSDIR
+DEFS="$DEFS -DSYSDIR=1"
+}
+ dirheader=sys/dir.h
+fi
+rm -f conftest*
+fi
+if test -z "$dirheader"; then
+ echo checking for ndir.h
+cat > conftest.c <<EOF
+#include <sys/types.h>
+#include <ndir.h>
+int main() { exit(0); }
+int t() { DIR *dirp = opendir ("/"); }
+EOF
+if eval $compile; then
+ {
+test -n "$verbose" && \
+echo ' defining' NDIR
+DEFS="$DEFS -DNDIR=1"
+}
+ dirheader=ndir.h
+fi
+rm -f conftest*
+fi
+
+echo checking for closedir return value
+cat > conftest.c <<EOF
+#include <sys/types.h>
+#include <$dirheader>
+int closedir(); main() { exit(closedir(opendir(".")) != 0); }
+EOF
+eval $compile
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' VOID_CLOSEDIR
+DEFS="$DEFS -DVOID_CLOSEDIR=1"
+}
+
+fi
+rm -f conftest*
+
+echo checking for Xenix
+cat > conftest.c <<EOF
+#if defined(M_XENIX) && !defined(M_UNIX)
+ yes
+#endif
+
+EOF
+eval "$CPP \$DEFS conftest.c > conftest.out 2>&1"
+if egrep "yes" conftest.out >/dev/null 2>&1; then
+ XENIX=1
+fi
+rm -f conftest*
+
+if test -n "$XENIX"; then
+ LIBS="$LIBS -lx"
+ case "$DEFS" in
+ *SYSNDIR*) ;;
+ *) LIBS="-ldir $LIBS" ;; # Make sure -ldir precedes any -lx.
+ esac
+fi
+
+echo checking for return type of signal handlers
+cat > conftest.c <<EOF
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();
+int main() { exit(0); }
+int t() { int i; }
+EOF
+if eval $compile; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' RETSIGTYPE to be 'int'
+DEFS="$DEFS -DRETSIGTYPE=int"
+}
+
+fi
+rm -f conftest*
+
+
+echo checking for size_t in sys/types.h
+echo '#include <sys/types.h>' > conftest.c
+eval "$CPP \$DEFS conftest.c > conftest.out 2>&1"
+if egrep "size_t" conftest.out >/dev/null 2>&1; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' size_t to be 'unsigned'
+DEFS="$DEFS -Dsize_t=unsigned"
+}
+
+fi
+rm -f conftest*
+
+echo '#include <sys/types.h>' > conftest.c
+eval "$CPP \$DEFS conftest.c > conftest.out 2>&1"
+if egrep "off_t" conftest.out >/dev/null 2>&1; then
+ :
+else
+ {
+test -n "$verbose" && \
+echo ' defining' NO_OFF_T
+DEFS="$DEFS -DNO_OFF_T=1"
+}
+
+fi
+rm -f conftest*
+
+echo "checking if \`#!' works in shell scripts"
+cat <<'__EOF__' > conftest.csh
+#!/bin/csh -f
+setenv SHELL /bin/csh
+# Avoid tcsh bug 'Bad Hertz Value':
+setenv HZ 60
+# Make sure foo doesn't get exported into the environment
+# Astoundingly, some versions of csh don't have unsetenv.
+if (${?foo}) unsetenv foo >& /dev/null
+if (${?foo}) unset foo
+set output="`./conftest.sh`"
+if ( "$output" == "foo=bar" ) then
+ exit 0
+endif
+exit 1
+__EOF__
+cat <<'__EOF__' > conftest.sh
+#!/bin/sh
+set foo=bar
+echo "$*"
+__EOF__
+chmod 777 conftest.csh conftest.sh
+(csh -f ./conftest.csh) 2> /dev/null
+if test $? = 0 ; then
+ :; SEDCMD="1d"
+else
+ :; SEDCMD=""
+fi
+rm -f conftest.csh conftest.sh
+
+if test -z "$prefix"
+then
+ echo checking for gzip to derive installation directory prefix
+ IFS="${IFS= }"; saveifs="$IFS"; IFS="$IFS:"
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test $dir != . && test -f $dir/gzip; then
+ # Not all systems have dirname.
+ prefix=`echo $dir|sed 's%/[^/][^/]*$%%'`
+ break
+ fi
+ done
+ IFS="$saveifs"
+ echo " chose installation directory prefix ${prefix}"
+fi
+
+if test -z "$G" -a -n "$prefix" -a -f $prefix/bin/gznew; then
+ G=g
+fi
+if test -z "$ZCAT"; then
+ if test -n "$prefix" -a -f $prefix/bin/gzcat; then
+ ZCAT=gzcat
+ else
+ ZCAT=${G}zcat
+ fi
+fi
+if test -n "$prefix"; then
+ test -z "$exec_prefix" && exec_prefix='${prefix}'
+ prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%"
+fi
+if test -n "$exec_prefix"; then
+ prsub="$prsub
+s%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%\
+exec_prefix\\1=\\2$exec_prefix%"
+fi
+cat >conftest.def <<EOF
+$DEFS
+EOF
+escape_ampersand_and_backslash='s%[&\\]%\\&%g'
+DEFS=`sed "$escape_ampersand_and_backslash" <conftest.def`
+rm -f conftest.def
+
+trap 'rm -f config.status; exit 1' 1 3 15
+echo creating config.status
+rm -f config.status
+cat > config.status <<EOF
+#!/bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $*
+
+for arg
+do
+ case "\$arg" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ exec /bin/sh $0 $* ;;
+ *) echo "Usage: config.status --recheck" 2>&1; exit 1 ;;
+ esac
+done
+
+trap 'rm -f Makefile; exit 1' 1 3 15
+CC='$CC'
+CPP='$CPP'
+INSTALL='$INSTALL'
+INSTALL_PROGRAM='$INSTALL_PROGRAM'
+INSTALL_DATA='$INSTALL_DATA'
+ZCAT='$ZCAT'
+G='$G'
+CFLAGS='$CFLAGS'
+ASCPP='$ASCPP'
+OBJA='$OBJA'
+SEDCMD='$SEDCMD'
+LIBS='$LIBS'
+srcdir='$srcdir'
+DEFS='$DEFS'
+prefix='$prefix'
+exec_prefix='$exec_prefix'
+prsub='$prsub'
+EOF
+cat >> config.status <<\EOF
+
+top_srcdir=$srcdir
+
+# Allow make-time overrides of the generated file list.
+test -n "$gen_files" || gen_files="Makefile"
+
+for file in .. $gen_files; do if [ "x$file" != "x.." ]; then
+ srcdir=$top_srcdir
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ dir=`echo $file|sed 's%/[^/][^/]*$%%'`
+ if test "$dir" != "$file"; then
+ test "$top_srcdir" != . && srcdir=$top_srcdir/$dir
+ test ! -d $dir && mkdir $dir
+ fi
+ echo creating $file
+ rm -f $file
+ echo "# Generated automatically from `echo $file|sed 's|.*/||'`.in by configure." > $file
+ sed -e "
+$prsub
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL@%$INSTALL%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@ZCAT@%$ZCAT%g
+s%@G@%$G%g
+s%@CFLAGS@%$CFLAGS%g
+s%@ASCPP@%$ASCPP%g
+s%@OBJA@%$OBJA%g
+s%@SEDCMD@%$SEDCMD%g
+s%@LIBS@%$LIBS%g
+s%@srcdir@%$srcdir%g
+s%@DEFS@%$DEFS%
+" $top_srcdir/${file}.in >> $file
+fi; done
+
+exit 0
+EOF
+chmod +x config.status
+test -n "$no_create" || ./config.status
+
diff --git a/Build/source/utils/gzip/configure.in b/Build/source/utils/gzip/configure.in
new file mode 100644
index 00000000000..7f8a4535b15
--- /dev/null
+++ b/Build/source/utils/gzip/configure.in
@@ -0,0 +1,98 @@
+dnl Process this file with autoconf to produce a configure script for gzip
+dnl
+dnl Same as AC_RETSIGTYPE, but use a void default.
+dnl
+define(AC_RETSIGTYP,
+[AC_COMPILE_CHECK([return type of signal handlers],
+[#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();],
+[int i;],
+[],
+[AC_DEFINE(RETSIGTYPE, int)],
+)]
+)dnl
+dnl
+dnl End of local macros
+dnl
+AC_INIT(gzip.c)
+AC_PROG_CC
+AC_PROG_CPP
+dnl
+dnl Try to assemble match.S with and without leading underline.
+dnl cc -E produces incorrect asm files on SVR4, we must use /lib/cpp.
+dnl Also, "gcc -E match.s" ignores -E, so we must use match.S.
+echo checking for underline in external names
+test -z "$ASCPP" -a -f /lib/cpp && ASCPP=/lib/cpp
+test -z "$ASCPP" && ASCPP="$CC -E"
+cat > conftest.c <<EOF
+int foo() {return 0;}
+EOF
+eval "$CC -c conftest.c > /dev/null 2>&1"
+if nm conftest.o | grep _foo > /dev/null 2>&1 ; then
+ :
+else
+ ASCPP="${ASCPP} -DNO_UNDERLINE"
+fi
+rm -f _match.o conftest.c conftest.o
+if echo "$DEFS" | grep NO_ASM >/dev/null; then
+ :
+else
+ echo checking for assembler
+ OBJA=""
+ if eval "$ASCPP $srcdir/match.S > _match.s 2>/dev/null"; then
+ if test ! -s _match.s || grep error < _match.s > /dev/null; then
+ :
+ elif eval "$CC -c _match.s >/dev/null 2>&1" && test -f _match.o; then
+ DEFS="${DEFS} -DASMV"
+ OBJA=match.o
+ fi
+ fi
+ rm -f _match.s _match.o
+fi
+dnl
+AC_PROG_INSTALL
+AC_AIX
+AC_MINIX
+AC_ISC_POSIX
+AC_DYNIX_SEQ
+AC_STDC_HEADERS
+dnl if STDC_HEADERS can't be defined, look for special files:
+AC_HEADER_CHECK(string.h, ,AC_DEFINE(NO_STRING_H))
+AC_HEADER_CHECK(stdlib.h, ,AC_DEFINE(NO_STDLIB_H))
+AC_HEADER_CHECK(memory.h, ,AC_DEFINE(NO_MEMORY_H))
+AC_HEADER_CHECK(fcntl.h, ,AC_DEFINE(NO_FCNTL_H))
+AC_HEADER_CHECK(time.h, ,AC_DEFINE(NO_TIME_H))
+AC_HAVE_HEADERS(unistd.h)
+utime=0
+AC_HEADER_CHECK(utime.h, utime=1 ,AC_DEFINE(NO_UTIME_H))
+if test $utime -eq 0; then
+ AC_HAVE_HEADERS(sys/utime.h)
+fi
+AC_DIR_HEADER
+AC_XENIX_DIR
+AC_RETSIGTYP
+AC_SIZE_T
+AC_HEADER_EGREP(off_t, sys/types.h, ,AC_DEFINE(NO_OFF_T))
+AC_HAVE_POUNDBANG([SEDCMD="1d"], [SEDCMD=""])
+AC_PREFIX(gzip)
+if test -z "$G" -a -n "$prefix" -a -f $prefix/bin/gznew; then
+ G=g
+fi
+if test -z "$ZCAT"; then
+ if test -n "$prefix" -a -f $prefix/bin/gzcat; then
+ ZCAT=gzcat
+ else
+ ZCAT=${G}zcat
+ fi
+fi
+AC_SUBST(ZCAT)dnl
+AC_SUBST(G)dnl
+AC_SUBST(CFLAGS)dnl
+AC_SUBST(ASCPP)dnl
+AC_SUBST(OBJA)dnl
+AC_SUBST(SEDCMD)dnl
+AC_OUTPUT(Makefile)
diff --git a/Build/source/utils/gzip/crypt.c b/Build/source/utils/gzip/crypt.c
new file mode 100644
index 00000000000..cbce024a01a
--- /dev/null
+++ b/Build/source/utils/gzip/crypt.c
@@ -0,0 +1,6 @@
+/* crypt.c (dummy version) -- do not perform encryption
+ * Hardly worth copyrighting :-)
+ */
+#ifdef RCSID
+static char rcsid[] = "$Id: crypt.c,v 0.6 1993/03/22 09:48:47 jloup Exp $";
+#endif
diff --git a/Build/source/utils/gzip/crypt.h b/Build/source/utils/gzip/crypt.h
new file mode 100644
index 00000000000..2a4c203caa7
--- /dev/null
+++ b/Build/source/utils/gzip/crypt.h
@@ -0,0 +1,12 @@
+/* crypt.h (dummy version) -- do not perform encryption
+ * Hardly worth copyrighting :-)
+ */
+
+#ifdef CRYPT
+# undef CRYPT /* dummy version */
+#endif
+
+#define RAND_HEAD_LEN 12 /* length of encryption random header */
+
+#define zencode
+#define zdecode
diff --git a/Build/source/utils/gzip/deflate.c b/Build/source/utils/gzip/deflate.c
new file mode 100644
index 00000000000..7f52b64fa75
--- /dev/null
+++ b/Build/source/utils/gzip/deflate.c
@@ -0,0 +1,763 @@
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+/*
+ * PURPOSE
+ *
+ * Identify new text as repetitions of old text within a fixed-
+ * length sliding window trailing behind the new text.
+ *
+ * DISCUSSION
+ *
+ * The "deflation" process depends on being able to identify portions
+ * of the input text which are identical to earlier input (within a
+ * sliding window trailing behind the input currently being processed).
+ *
+ * The most straightforward technique turns out to be the fastest for
+ * most input files: try all possible matches and select the longest.
+ * The key feature of this algorithm is that insertions into the string
+ * dictionary are very simple and thus fast, and deletions are avoided
+ * completely. Insertions are performed at each input character, whereas
+ * string matches are performed only when the previous match ends. So it
+ * is preferable to spend more time in matches to allow very fast string
+ * insertions and avoid deletions. The matching algorithm for small
+ * strings is inspired from that of Rabin & Karp. A brute force approach
+ * is used to find longer strings when a small match has been found.
+ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ * (by Leonid Broukhis).
+ * A previous version of this file used a more sophisticated algorithm
+ * (by Fiala and Greene) which is guaranteed to run in linear amortized
+ * time, but has a larger average cost, uses more memory and is patented.
+ * However the F&G algorithm may be faster for some highly redundant
+ * files if the parameter max_chain_length (described below) is too large.
+ *
+ * ACKNOWLEDGEMENTS
+ *
+ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ * I found it in 'freeze' written by Leonid Broukhis.
+ * Thanks to many info-zippers for bug reports and testing.
+ *
+ * REFERENCES
+ *
+ * APPNOTE.TXT documentation file in PKZIP 1.93a distribution.
+ *
+ * A description of the Rabin and Karp algorithm is given in the book
+ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ * Fiala,E.R., and Greene,D.H.
+ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ * INTERFACE
+ *
+ * void lm_init (int pack_level, ush *flags)
+ * Initialize the "longest match" routines for a new file
+ *
+ * ulg deflate (void)
+ * Processes a new input file and return its compressed length. Sets
+ * the compressed length, crc, deflate flags and internal file
+ * attributes.
+ */
+
+#include <stdio.h>
+
+#include "tailor.h"
+#include "gzip.h"
+#include "lzw.h" /* just for consistency checking */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: deflate.c,v 0.15 1993/06/24 10:53:53 jloup Exp $";
+#endif
+
+/* ===========================================================================
+ * Configuration parameters
+ */
+
+/* Compile with MEDIUM_MEM to reduce the memory requirements or
+ * with SMALL_MEM to use as little memory as possible. Use BIG_MEM if the
+ * entire input file can be held in memory (not possible on 16 bit systems).
+ * Warning: defining these symbols affects HASH_BITS (see below) and thus
+ * affects the compression ratio. The compressed output
+ * is still correct, and might even be smaller in some cases.
+ */
+
+#ifdef SMALL_MEM
+# define HASH_BITS 13 /* Number of bits used to hash strings */
+#endif
+#ifdef MEDIUM_MEM
+# define HASH_BITS 14
+#endif
+#ifndef HASH_BITS
+# define HASH_BITS 15
+ /* For portability to 16 bit machines, do not use values above 15. */
+#endif
+
+/* To save space (see unlzw.c), we overlay prev+head with tab_prefix and
+ * window with tab_suffix. Check that we can do this:
+ */
+#if (WSIZE<<1) > (1<<BITS)
+ error: cannot overlay window with tab_suffix and prev with tab_prefix0
+#endif
+#if HASH_BITS > BITS-1
+ error: cannot overlay head with tab_prefix1
+#endif
+
+#define HASH_SIZE (unsigned)(1<<HASH_BITS)
+#define HASH_MASK (HASH_SIZE-1)
+#define WMASK (WSIZE-1)
+/* HASH_SIZE and WSIZE must be powers of two */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#define FAST 4
+#define SLOW 2
+/* speed options for the general purpose bit flag */
+
+#ifndef TOO_FAR
+# define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+/* ===========================================================================
+ * Local data used by the "longest match" routines.
+ */
+
+typedef ush Pos;
+typedef unsigned IPos;
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+/* DECLARE(uch, window, 2L*WSIZE); */
+/* Sliding window. Input bytes are read into the second half of the window,
+ * and move to the first half later to keep a dictionary of at least WSIZE
+ * bytes. With this organization, matches are limited to a distance of
+ * WSIZE-MAX_MATCH bytes, but this ensures that IO is always
+ * performed with a length multiple of the block size. Also, it limits
+ * the window size to 64K, which is quite useful on MSDOS.
+ * To do: limit the window size to WSIZE+BSZ if SMALL_MEM (the code would
+ * be less efficient).
+ */
+
+/* DECLARE(Pos, prev, WSIZE); */
+/* Link to older string with same hash index. To limit the size of this
+ * array to 64K, this link is maintained only for the last 32K strings.
+ * An index in this array is thus a window index modulo 32K.
+ */
+
+/* DECLARE(Pos, head, 1<<HASH_BITS); */
+/* Heads of the hash chains or NIL. */
+
+ulg window_size = (ulg)2*WSIZE;
+/* window size, 2*WSIZE except for MMAP or BIG_MEM, where it is the
+ * input file length plus MIN_LOOKAHEAD.
+ */
+
+long block_start;
+/* window position at the beginning of the current output block. Gets
+ * negative when the window is moved backwards.
+ */
+
+local unsigned ins_h; /* hash index of string to be inserted */
+
+#define H_SHIFT ((HASH_BITS+MIN_MATCH-1)/MIN_MATCH)
+/* Number of bits by which ins_h and del_h must be shifted at each
+ * input step. It must be such that after MIN_MATCH steps, the oldest
+ * byte no longer takes part in the hash key, that is:
+ * H_SHIFT * MIN_MATCH >= HASH_BITS
+ */
+
+unsigned int near prev_length;
+/* Length of the best match at previous step. Matches not greater than this
+ * are discarded. This is used in the lazy match evaluation.
+ */
+
+ unsigned near strstart; /* start of string to insert */
+ unsigned near match_start; /* start of matching string */
+local int eofile; /* flag set at end of input file */
+local unsigned lookahead; /* number of valid bytes ahead in window */
+
+unsigned near max_chain_length;
+/* To speed up deflation, hash chains are never searched beyond this length.
+ * A higher limit improves compression ratio but degrades the speed.
+ */
+
+local unsigned int max_lazy_match;
+/* Attempt to find a better match only when the current match is strictly
+ * smaller than this value. This mechanism is used only for compression
+ * levels >= 4.
+ */
+#define max_insert_length max_lazy_match
+/* Insert new strings in the hash table only if the match length
+ * is not greater than this length. This saves time but degrades compression.
+ * max_insert_length is used only for compression levels <= 3.
+ */
+
+local int compr_level;
+/* compression level (1..9) */
+
+unsigned near good_match;
+/* Use a faster search when the previous match is longer than this */
+
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+
+typedef struct config {
+ ush good_length; /* reduce lazy search above this match length */
+ ush max_lazy; /* do not perform lazy search above this match length */
+ ush nice_length; /* quit search above this match length */
+ ush max_chain;
+} config;
+
+#ifdef FULL_SEARCH
+# define nice_match MAX_MATCH
+#else
+ int near nice_match; /* Stop searching when current match exceeds this */
+#endif
+
+local config configuration_table[10] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0}, /* store only */
+/* 1 */ {4, 4, 8, 4}, /* maximum speed, no lazy matches */
+/* 2 */ {4, 5, 16, 8},
+/* 3 */ {4, 6, 32, 32},
+
+/* 4 */ {4, 4, 16, 16}, /* lazy matches */
+/* 5 */ {8, 16, 32, 32},
+/* 6 */ {8, 16, 128, 128},
+/* 7 */ {8, 32, 128, 256},
+/* 8 */ {32, 128, 258, 1024},
+/* 9 */ {32, 258, 258, 4096}}; /* maximum compression */
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+/* ===========================================================================
+ * Prototypes for local functions.
+ */
+local void fill_window OF((void));
+local ulg deflate_fast OF((void));
+
+ int longest_match OF((IPos cur_match));
+#ifdef ASMV
+ void match_init OF((void)); /* asm code initialization */
+#endif
+
+#ifdef DEBUG
+local void check_match OF((IPos start, IPos match, int length));
+#endif
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN assertion: all calls to to UPDATE_HASH are made with consecutive
+ * input characters, so that a running hash key can be computed from the
+ * previous key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(h,c) (h = (((h)<<H_SHIFT) ^ (c)) & HASH_MASK)
+
+/* ===========================================================================
+ * Insert string s in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * IN assertion: all calls to to INSERT_STRING are made with consecutive
+ * input characters and the first MIN_MATCH bytes of s are valid
+ * (except for the last MIN_MATCH-1 bytes of the input file).
+ */
+#define INSERT_STRING(s, match_head) \
+ (UPDATE_HASH(ins_h, window[(s) + MIN_MATCH-1]), \
+ prev[(s) & WMASK] = match_head = head[ins_h], \
+ head[ins_h] = (s))
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new file
+ */
+void lm_init (pack_level, flags)
+ int pack_level; /* 0: store, 1: best speed, 9: best compression */
+ ush *flags; /* general purpose bit flag */
+{
+ register unsigned j;
+
+ if (pack_level < 1 || pack_level > 9) error("bad pack level");
+ compr_level = pack_level;
+
+ /* Initialize the hash table. */
+#if defined(MAXSEG_64K) && HASH_BITS == 15
+ for (j = 0; j < HASH_SIZE; j++) head[j] = NIL;
+#else
+ memzero((char*)head, HASH_SIZE*sizeof(*head));
+#endif
+ /* prev will be initialized on the fly */
+
+ /* Set the default configuration parameters:
+ */
+ max_lazy_match = configuration_table[pack_level].max_lazy;
+ good_match = configuration_table[pack_level].good_length;
+#ifndef FULL_SEARCH
+ nice_match = configuration_table[pack_level].nice_length;
+#endif
+ max_chain_length = configuration_table[pack_level].max_chain;
+ if (pack_level == 1) {
+ *flags |= FAST;
+ } else if (pack_level == 9) {
+ *flags |= SLOW;
+ }
+ /* ??? reduce max_chain_length for binary files */
+
+ strstart = 0;
+ block_start = 0L;
+#ifdef ASMV
+ match_init(); /* initialize the asm code */
+#endif
+
+ lookahead = read_buf((char*)window,
+ sizeof(int) <= 2 ? (unsigned)WSIZE : 2*WSIZE);
+
+ if (lookahead == 0 || lookahead == (unsigned)EOF) {
+ eofile = 1, lookahead = 0;
+ return;
+ }
+ eofile = 0;
+ /* Make sure that we always have enough lookahead. This is important
+ * if input comes from a device such as a tty.
+ */
+ while (lookahead < MIN_LOOKAHEAD && !eofile) fill_window();
+
+ ins_h = 0;
+ for (j=0; j<MIN_MATCH-1; j++) UPDATE_HASH(ins_h, window[j]);
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but this is
+ * not important since only literal bytes will be emitted.
+ */
+}
+
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ */
+#ifndef ASMV
+/* For MSDOS, OS/2 and 386 Unix, an optimized version is in match.asm or
+ * match.s. The code is functionally equivalent, so you can use the C version
+ * if desired.
+ */
+int longest_match(cur_match)
+ IPos cur_match; /* current match */
+{
+ unsigned chain_length = max_chain_length; /* max hash chain length */
+ register uch *scan = window + strstart; /* current string */
+ register uch *match; /* matched string */
+ register int len; /* length of current match */
+ int best_len = prev_length; /* best match length so far */
+ IPos limit = strstart > (IPos)MAX_DIST ? strstart - (IPos)MAX_DIST : NIL;
+ /* Stop when cur_match becomes <= limit. To simplify the code,
+ * we prevent matches with the string of window index 0.
+ */
+
+/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+#if HASH_BITS < 8 || MAX_MATCH != 258
+ error: Code too clever
+#endif
+
+#ifdef UNALIGNED_OK
+ /* Compare two bytes at a time. Note: this is not always beneficial.
+ * Try with and without -DUNALIGNED_OK to check.
+ */
+ register uch *strend = window + strstart + MAX_MATCH - 1;
+ register ush scan_start = *(ush*)scan;
+ register ush scan_end = *(ush*)(scan+best_len-1);
+#else
+ register uch *strend = window + strstart + MAX_MATCH;
+ register uch scan_end1 = scan[best_len-1];
+ register uch scan_end = scan[best_len];
+#endif
+
+ /* Do not waste too much time if we already have a good match: */
+ if (prev_length >= good_match) {
+ chain_length >>= 2;
+ }
+ Assert(strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead");
+
+ do {
+ Assert(cur_match < strstart, "no future");
+ match = window + cur_match;
+
+ /* Skip to next match if the match length cannot increase
+ * or if the match length is less than 2:
+ */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+ /* This code assumes sizeof(unsigned short) == 2. Do not use
+ * UNALIGNED_OK if your compiler uses a different size.
+ */
+ if (*(ush*)(match+best_len-1) != scan_end ||
+ *(ush*)match != scan_start) continue;
+
+ /* It is not necessary to compare scan[2] and match[2] since they are
+ * always equal when the other bytes match, given that the hash keys
+ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+ * strstart+3, +5, ... up to strstart+257. We check for insufficient
+ * lookahead only every 4th comparison; the 128th check will be made
+ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+ * necessary to put more guard bytes at the end of the window, or
+ * to check more often for insufficient lookahead.
+ */
+ scan++, match++;
+ do {
+ } while (*(ush*)(scan+=2) == *(ush*)(match+=2) &&
+ *(ush*)(scan+=2) == *(ush*)(match+=2) &&
+ *(ush*)(scan+=2) == *(ush*)(match+=2) &&
+ *(ush*)(scan+=2) == *(ush*)(match+=2) &&
+ scan < strend);
+ /* The funny "do {}" generates better code on most compilers */
+
+ /* Here, scan <= window+strstart+257 */
+ Assert(scan <= window+(unsigned)(window_size-1), "wild scan");
+ if (*scan == *match) scan++;
+
+ len = (MAX_MATCH - 1) - (int)(strend-scan);
+ scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+ if (match[best_len] != scan_end ||
+ match[best_len-1] != scan_end1 ||
+ *match != *scan ||
+ *++match != scan[1]) continue;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match++;
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ len = MAX_MATCH - (int)(strend - scan);
+ scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+ if (len > best_len) {
+ match_start = cur_match;
+ best_len = len;
+ if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+ scan_end = *(ush*)(scan+best_len-1);
+#else
+ scan_end1 = scan[best_len-1];
+ scan_end = scan[best_len];
+#endif
+ }
+ } while ((cur_match = prev[cur_match & WMASK]) > limit
+ && --chain_length != 0);
+
+ return best_len;
+}
+#endif /* ASMV */
+
+#ifdef DEBUG
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(start, match, length)
+ IPos start, match;
+ int length;
+{
+ /* check that the match is indeed a match */
+ if (memcmp((char*)window + match,
+ (char*)window + start, length) != EQUAL) {
+ fprintf(stderr,
+ " start %d, match %d, length %d\n",
+ start, match, length);
+ error("invalid match");
+ }
+ if (verbose > 1) {
+ fprintf(stderr,"\\[%d,%d]", start-match, length);
+ do { putc(window[start++], stderr); } while (--length != 0);
+ }
+}
+#else
+# define check_match(start, match, length)
+#endif
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead, and sets eofile if end of input file.
+ * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0
+ * OUT assertions: at least one byte has been read, or eofile is set;
+ * file reads are performed for at least two bytes (required for the
+ * translate_eol option).
+ */
+local void fill_window()
+{
+ register unsigned n, m;
+ unsigned more = (unsigned)(window_size - (ulg)lookahead - (ulg)strstart);
+ /* Amount of free space at the end of the window. */
+
+ /* If the window is almost full and there is insufficient lookahead,
+ * move the upper half to the lower one to make room in the upper half.
+ */
+ if (more == (unsigned)EOF) {
+ /* Very unlikely, but possible on 16 bit machine if strstart == 0
+ * and lookahead == 1 (input done one byte at time)
+ */
+ more--;
+ } else if (strstart >= WSIZE+MAX_DIST) {
+ /* By the IN assertion, the window is not empty so we can't confuse
+ * more == 0 with more == 64K on a 16 bit machine.
+ */
+ Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM");
+
+ memcpy((char*)window, (char*)window+WSIZE, (unsigned)WSIZE);
+ match_start -= WSIZE;
+ strstart -= WSIZE; /* we now have strstart >= MAX_DIST: */
+
+ block_start -= (long) WSIZE;
+
+ for (n = 0; n < HASH_SIZE; n++) {
+ m = head[n];
+ head[n] = (Pos)(m >= WSIZE ? m-WSIZE : NIL);
+ }
+ for (n = 0; n < WSIZE; n++) {
+ m = prev[n];
+ prev[n] = (Pos)(m >= WSIZE ? m-WSIZE : NIL);
+ /* If n is not on any hash chain, prev[n] is garbage but
+ * its value will never be used.
+ */
+ }
+ more += WSIZE;
+ }
+ /* At this point, more >= 2 */
+ if (!eofile) {
+ n = read_buf((char*)window+strstart+lookahead, more);
+ if (n == 0 || n == (unsigned)EOF) {
+ eofile = 1;
+ } else {
+ lookahead += n;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK(eof) \
+ flush_block(block_start >= 0L ? (char*)&window[(unsigned)block_start] : \
+ (char*)NULL, (long)strstart - block_start, (eof))
+
+/* ===========================================================================
+ * Processes a new input file and return its compressed length. This
+ * function does not perform lazy evaluationof matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local ulg deflate_fast()
+{
+ IPos hash_head; /* head of the hash chain */
+ int flush; /* set if current block must be flushed */
+ unsigned match_length = 0; /* length of best match */
+
+ prev_length = MIN_MATCH-1;
+ while (lookahead != 0) {
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ INSERT_STRING(strstart, hash_head);
+
+ /* Find the longest match, discarding those <= prev_length.
+ * At this point we have always match_length < MIN_MATCH
+ */
+ if (hash_head != NIL && strstart - hash_head <= MAX_DIST) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ match_length = longest_match (hash_head);
+ /* longest_match() sets match_start */
+ if (match_length > lookahead) match_length = lookahead;
+ }
+ if (match_length >= MIN_MATCH) {
+ check_match(strstart, match_start, match_length);
+
+ flush = ct_tally(strstart-match_start, match_length - MIN_MATCH);
+
+ lookahead -= match_length;
+
+ /* Insert new strings in the hash table only if the match length
+ * is not too large. This saves time but degrades compression.
+ */
+ if (match_length <= max_insert_length) {
+ match_length--; /* string at strstart already in hash table */
+ do {
+ strstart++;
+ INSERT_STRING(strstart, hash_head);
+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+ * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
+ * these bytes are garbage, but it does not matter since
+ * the next lookahead bytes will be emitted as literals.
+ */
+ } while (--match_length != 0);
+ strstart++;
+ } else {
+ strstart += match_length;
+ match_length = 0;
+ ins_h = window[strstart];
+ UPDATE_HASH(ins_h, window[strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ }
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c",window[strstart]));
+ flush = ct_tally (0, window[strstart]);
+ lookahead--;
+ strstart++;
+ }
+ if (flush) FLUSH_BLOCK(0), block_start = strstart;
+
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ while (lookahead < MIN_LOOKAHEAD && !eofile) fill_window();
+
+ }
+ return FLUSH_BLOCK(1); /* eof */
+}
+
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+ulg deflate()
+{
+ IPos hash_head; /* head of hash chain */
+ IPos prev_match; /* previous match */
+ int flush; /* set if current block must be flushed */
+ int match_available = 0; /* set if previous match exists */
+ register unsigned match_length = MIN_MATCH-1; /* length of best match */
+#ifdef DEBUG
+ extern long isize; /* byte length of input file, for debug only */
+#endif
+
+ if (compr_level <= 3) return deflate_fast(); /* optimized for speed */
+
+ /* Process the input block. */
+ while (lookahead != 0) {
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ INSERT_STRING(strstart, hash_head);
+
+ /* Find the longest match, discarding those <= prev_length.
+ */
+ prev_length = match_length, prev_match = match_start;
+ match_length = MIN_MATCH-1;
+
+ if (hash_head != NIL && prev_length < max_lazy_match &&
+ strstart - hash_head <= MAX_DIST) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ match_length = longest_match (hash_head);
+ /* longest_match() sets match_start */
+ if (match_length > lookahead) match_length = lookahead;
+
+ /* Ignore a length 3 match if it is too distant: */
+ if (match_length == MIN_MATCH && strstart-match_start > TOO_FAR){
+ /* If prev_match is also MIN_MATCH, match_start is garbage
+ * but we will ignore the current match anyway.
+ */
+ match_length--;
+ }
+ }
+ /* If there was a match at the previous step and the current
+ * match is not better, output the previous match:
+ */
+ if (prev_length >= MIN_MATCH && match_length <= prev_length) {
+
+ check_match(strstart-1, prev_match, prev_length);
+
+ flush = ct_tally(strstart-1-prev_match, prev_length - MIN_MATCH);
+
+ /* Insert in hash table all strings up to the end of the match.
+ * strstart-1 and strstart are already inserted.
+ */
+ lookahead -= prev_length-1;
+ prev_length -= 2;
+ do {
+ strstart++;
+ INSERT_STRING(strstart, hash_head);
+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+ * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
+ * these bytes are garbage, but it does not matter since the
+ * next lookahead bytes will always be emitted as literals.
+ */
+ } while (--prev_length != 0);
+ match_available = 0;
+ match_length = MIN_MATCH-1;
+ strstart++;
+ if (flush) FLUSH_BLOCK(0), block_start = strstart;
+
+ } else if (match_available) {
+ /* If there was no match at the previous position, output a
+ * single literal. If there was a match but the current match
+ * is longer, truncate the previous match to a single literal.
+ */
+ Tracevv((stderr,"%c",window[strstart-1]));
+ if (ct_tally (0, window[strstart-1])) {
+ FLUSH_BLOCK(0), block_start = strstart;
+ }
+ strstart++;
+ lookahead--;
+ } else {
+ /* There is no previous match to compare with, wait for
+ * the next step to decide.
+ */
+ match_available = 1;
+ strstart++;
+ lookahead--;
+ }
+ Assert (strstart <= isize && lookahead <= isize, "a bit too far");
+
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ while (lookahead < MIN_LOOKAHEAD && !eofile) fill_window();
+ }
+ if (match_available) ct_tally (0, window[strstart-1]);
+
+ return FLUSH_BLOCK(1); /* eof */
+}
diff --git a/Build/source/utils/gzip/depend.mak b/Build/source/utils/gzip/depend.mak
new file mode 100644
index 00000000000..f7a62228848
--- /dev/null
+++ b/Build/source/utils/gzip/depend.mak
@@ -0,0 +1,82 @@
+$(objdir)/unlzw.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ lzw.h
+
+$(objdir)/unlzw-new.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ lzw.h
+
+$(objdir)/unlzh.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ lzw.h
+
+$(objdir)/lzw.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ lzw.h
+
+$(objdir)/unpack.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ crypt.h
+
+$(objdir)/gzip.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ lzw.h \
+ revision.h \
+ getopt.h
+
+$(objdir)/zip.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ crypt.h
+
+$(objdir)/getopt.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h
+
+$(objdir)/util.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ crypt.h
+
+$(objdir)/bits.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ crypt.h
+
+$(objdir)/deflate.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ lzw.h
+
+$(objdir)/trees.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h
+
+$(objdir)/inflate.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h
+
+$(objdir)/unzip.obj: \
+ tailor.h \
+ $(gnuw32dir)/win32lib.h \
+ gzip.h \
+ crypt.h
+
diff --git a/Build/source/utils/gzip/getopt.c b/Build/source/utils/gzip/getopt.c
new file mode 100644
index 00000000000..d7831eac11a
--- /dev/null
+++ b/Build/source/utils/gzip/getopt.c
@@ -0,0 +1,757 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+ before changing it!
+
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef __STDC__
+# ifndef const
+# define const
+# endif
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+#include "tailor.h"
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+#include <stdlib.h>
+#endif /* GNU C library. */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+ long-named option. Because this is not POSIX.2 compliant, it is
+ being phased out. */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable POSIXLY_CORRECT disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* XXX 1003.2 says this must be 1 before any call. */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+#define BAD_OPTION '\0'
+int optopt = BAD_OPTION;
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we scan,
+ so that eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written to
+ expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were written
+ to expect options and other ARGV-elements in any order and that care about
+ the ordering of the two. We describe each non-option ARGV-element
+ as if it were the argument of an option with character code 1.
+ Using `-' as the first character of the list of option characters
+ selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return EOF with `optind' != ARGC. */
+
+static enum
+{
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+ because there are many ways it can cause trouble.
+ On some systems, it contains special magic macros that don't work
+ in GCC. */
+#include <string.h>
+#define my_index strchr
+#define my_strlen strlen
+#else
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+#if __STDC__ || defined(PROTO)
+#ifndef WIN32
+extern char *getenv(const char *name);
+extern int strcmp (const char *s1, const char *s2);
+extern int strncmp(const char *s1, const char *s2, int n);
+#endif
+
+static int my_strlen(const char *s);
+static char *my_index (const char *str, int chr);
+#else
+extern char *getenv ();
+#endif
+
+static int
+my_strlen (str)
+ const char *str;
+{
+ int n = 0;
+ while (*str++)
+ n++;
+ return n;
+}
+
+static char *
+my_index (str, chr)
+ const char *str;
+ int chr;
+{
+ while (*str)
+ {
+ if (*str == chr)
+ return (char *) str;
+ str++;
+ }
+ return 0;
+}
+
+#endif /* GNU C library. */
+
+/* Handle permutation of arguments. */
+
+/* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first of them;
+ `last_nonopt' is the index after the last of them. */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved.
+
+ To perform the swap, we first reverse the order of all elements. So
+ all options now come before all non options, but they are in the
+ wrong order. So we put back the options and non options in original
+ order by reversing them again. For example:
+ original input: a b c -x -y
+ reverse all: -y -x c b a
+ reverse options: -x -y c b a
+ reverse non options: -x -y a b c
+*/
+
+#if __STDC__ || defined(PROTO)
+static void exchange (char **argv);
+#endif
+
+static void
+exchange (argv)
+ char **argv;
+{
+ char *temp, **first, **last;
+
+ /* Reverse all the elements [first_nonopt, optind) */
+ first = &argv[first_nonopt];
+ last = &argv[optind-1];
+ while (first < last) {
+ temp = *first; *first = *last; *last = temp; first++; last--;
+ }
+ /* Put back the options in order */
+ first = &argv[first_nonopt];
+ first_nonopt += (optind - last_nonopt);
+ last = &argv[first_nonopt - 1];
+ while (first < last) {
+ temp = *first; *first = *last; *last = temp; first++; last--;
+ }
+
+ /* Put back the non options in order */
+ first = &argv[first_nonopt];
+ last_nonopt = optind;
+ last = &argv[last_nonopt-1];
+ while (first < last) {
+ temp = *first; *first = *last; *last = temp; first++; last--;
+ }
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns `EOF'.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return BAD_OPTION after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return BAD_OPTION.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+ const struct option *longopts;
+ int *longind;
+ int long_only;
+{
+ int option_index;
+
+ optarg = 0;
+
+ /* Initialize the internal data when the first call is made.
+ Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ if (optind == 0)
+ {
+ first_nonopt = last_nonopt = optind = 1;
+
+ nextchar = NULL;
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (getenv ("POSIXLY_CORRECT") != NULL)
+ ordering = REQUIRE_ORDER;
+ else
+ ordering = PERMUTE;
+ }
+
+ if (nextchar == NULL || *nextchar == '\0')
+ {
+ if (ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (last_nonopt != optind)
+ first_nonopt = optind;
+
+ /* Now skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (optind < argc
+ && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ optind++;
+ last_nonopt = optind;
+ }
+
+ /* Special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (optind != argc && !strcmp (argv[optind], "--"))
+ {
+ optind++;
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (first_nonopt == last_nonopt)
+ first_nonopt = optind;
+ last_nonopt = argc;
+
+ optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (first_nonopt != last_nonopt)
+ optind = first_nonopt;
+ return EOF;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ {
+ if (ordering == REQUIRE_ORDER)
+ return EOF;
+ optarg = argv[optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Start decoding its characters. */
+
+ nextchar = (argv[optind] + 1
+ + (longopts != NULL && argv[optind][1] == '-'));
+ }
+
+ if (longopts != NULL
+ && ((argv[optind][0] == '-'
+ && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ ))
+ {
+ const struct option *p;
+ char *s = nextchar;
+ int exact = 0;
+ int ambig = 0;
+ const struct option *pfound = NULL;
+ int indfound = 0;
+
+ while (*s && *s != '=')
+ s++;
+
+ /* Test all options for either exact match or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name;
+ p++, option_index++)
+ if (!strncmp (p->name, nextchar, s - nextchar))
+ {
+ if (s - nextchar == my_strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous\n",
+ argv[0], argv[optind]);
+ nextchar += my_strlen (nextchar);
+ optind++;
+ return BAD_OPTION;
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ optind++;
+ if (*s)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ optarg = s + 1;
+ else
+ {
+ if (opterr)
+ {
+ if (argv[optind - 1][1] == '-')
+ /* --option */
+ fprintf (stderr,
+ "%s: option `--%s' doesn't allow an argument\n",
+ argv[0], pfound->name);
+ else
+ /* +option or -option */
+ fprintf (stderr,
+ "%s: option `%c%s' doesn't allow an argument\n",
+ argv[0], argv[optind - 1][0], pfound->name);
+ }
+ nextchar += my_strlen (nextchar);
+ return BAD_OPTION;
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (optind < argc)
+ optarg = argv[optind++];
+ else
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' requires an argument\n",
+ argv[0], argv[optind - 1]);
+ nextchar += my_strlen (nextchar);
+ return optstring[0] == ':' ? ':' : BAD_OPTION;
+ }
+ }
+ nextchar += my_strlen (nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ || my_index (optstring, *nextchar) == NULL)
+ {
+ if (opterr)
+ {
+ if (argv[optind][1] == '-')
+ /* --option */
+ fprintf (stderr, "%s: unrecognized option `--%s'\n",
+ argv[0], nextchar);
+ else
+ /* +option or -option */
+ fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+ argv[0], argv[optind][0], nextchar);
+ }
+ nextchar = (char *) "";
+ optind++;
+ return BAD_OPTION;
+ }
+ }
+
+ /* Look at and handle the next option-character. */
+
+ {
+ char c = *nextchar++;
+ char *temp = my_index (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*nextchar == '\0')
+ ++optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (opterr)
+ {
+#if 0
+ if (c < 040 || c >= 0177)
+ fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+ argv[0], c);
+ else
+ fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+ }
+ optopt = c;
+ return BAD_OPTION;
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ optind++;
+ }
+ else
+ optarg = 0;
+ nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ optind++;
+ }
+ else if (optind == argc)
+ {
+ if (opterr)
+ {
+#if 0
+ fprintf (stderr, "%s: option `-%c' requires an argument\n",
+ argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: option requires an argument -- %c\n",
+ argv[0], c);
+#endif
+ }
+ optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = BAD_OPTION;
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ optarg = argv[optind++];
+ nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+getopt (argc, argv, optstring)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0);
+}
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case BAD_OPTION:
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/Build/source/utils/gzip/getopt.h b/Build/source/utils/gzip/getopt.h
new file mode 100644
index 00000000000..0abce6e921d
--- /dev/null
+++ b/Build/source/utils/gzip/getopt.h
@@ -0,0 +1,127 @@
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__ || defined(PROTO)
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/Build/source/utils/gzip/gpl.texinfo b/Build/source/utils/gzip/gpl.texinfo
new file mode 100644
index 00000000000..6fb0afb4c06
--- /dev/null
+++ b/Build/source/utils/gzip/gpl.texinfo
@@ -0,0 +1,394 @@
+@setfilename gpl.info
+
+@unnumbered GNU GENERAL PUBLIC LICENSE
+@center Version 2, June 1991
+
+@display
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+675 Mass Ave, Cambridge, MA 02139, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@unnumberedsec Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software---to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+@iftex
+@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end iftex
+@ifinfo
+@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end ifinfo
+
+@enumerate
+@item
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The ``Program'', below,
+refers to any such program or work, and a ``work based on the Program''
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term ``modification''.) Each licensee is addressed as ``you''.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+@item
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+@item
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+@item
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+@end enumerate
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+@enumerate a
+@item
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+@item
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+@item
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+@end enumerate
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+@item
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and ``any
+later version'', you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+@item
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+@iftex
+@heading NO WARRANTY
+@end iftex
+@ifinfo
+@center NO WARRANTY
+@end ifinfo
+
+@item
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+@item
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+@end ifinfo
+
+@page
+@unnumberedsec How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and an idea of what it does.}
+Copyright (C) 19@var{yy} @var{name of author}
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+@smallexample
+Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than @samp{show w} and
+@samp{show c}; they could even be mouse-clicks or menu items---whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary. Here is a sample; alter the names:
+
+@example
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+@var{signature of Ty Coon}, 1 April 1989
+Ty Coon, President of Vice
+@end example
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/utils/gzip/gzexe.1 b/Build/source/utils/gzip/gzexe.1
new file mode 100644
index 00000000000..8b62cd60637
--- /dev/null
+++ b/Build/source/utils/gzip/gzexe.1
@@ -0,0 +1,43 @@
+.TH GZEXE 1
+.SH NAME
+gzexe \- compress executable files in place
+.SH SYNOPSIS
+.B gzexe
+[ name ... ]
+.SH DESCRIPTION
+The
+.I gzexe
+utility allows you to compress executables in place and have them
+automatically uncompress and execute when you run them (at a penalty
+in performance). For example if you execute ``gzexe /bin/cat'' it
+will create the following two files:
+.nf
+.br
+ -r-xr-xr-x 1 root bin 9644 Feb 11 11:16 /bin/cat
+ -r-xr-xr-x 1 bin bin 24576 Nov 23 13:21 /bin/cat~
+.fi
+/bin/cat~ is the original file and /bin/cat is the self-uncompressing
+executable file. You can remove /bin/cat~ once you are sure that
+/bin/cat works properly.
+.PP
+This utility is most useful on systems with very small disks.
+.SH OPTIONS
+.TP
+.B \-d
+Decompress the given executables instead of compressing them.
+.SH "SEE ALSO"
+gzip(1), znew(1), zmore(1), zcmp(1), zforce(1)
+.SH CAVEATS
+The compressed executable is a shell script. This may create some
+security holes. In particular, the compressed executable relies
+on the PATH environment variable to find
+.I gzip
+and some other utilities
+.I (tail, chmod, ln, sleep).
+.SH "BUGS"
+.I gzexe
+attempts to retain the original file attributes on the compressed executable,
+but you may have to fix them manually in some cases, using
+.I chmod
+or
+.I chown.
diff --git a/Build/source/utils/gzip/gzexe.in b/Build/source/utils/gzip/gzexe.in
new file mode 100644
index 00000000000..fcba5afe15c
--- /dev/null
+++ b/Build/source/utils/gzip/gzexe.in
@@ -0,0 +1,151 @@
+:
+#!/bin/sh
+# gzexe: compressor for Unix executables.
+# Use this only for binaries that you do not use frequently.
+#
+# The compressed version is a shell script which decompresses itself after
+# skipping $skip lines of shell commands. We try invoking the compressed
+# executable with the original name (for programs looking at their name).
+# We also try to retain the original file permissions on the compressed file.
+# For safety reasons, gzexe will not create setuid or setgid shell scripts.
+
+# WARNING: the first line of this file must be either : or #!/bin/sh
+# The : is required for some old versions of csh.
+# On Ultrix, /bin/sh is too buggy, change the first line to: #!/bin/sh5
+
+x=`basename $0`
+if test $# = 0; then
+ echo compress executables. original file foo is renamed to foo~
+ echo usage: ${x} [-d] files...
+ echo " -d decompress the executables"
+ exit 1
+fi
+
+tmp=gz$$
+trap "rm -f $tmp; exit 1" 1 2 3 5 10 13 15
+
+decomp=0
+res=0
+test "$x" = "ungzexe" && decomp=1
+if test "x$1" = "x-d"; then
+ decomp=1
+ shift
+fi
+
+echo hi > zfoo1$$
+echo hi > zfoo2$$
+if test -z "`(${CPMOD-cpmod} zfoo1$$ zfoo2$$) 2>&1`"; then
+ cpmod=${CPMOD-cpmod}
+fi
+rm -f zfoo[12]$$
+
+tail=""
+IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:"
+for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/tail; then
+ tail="$dir/tail"
+ break
+ fi
+done
+IFS="$saveifs"
+if test -z "$tail"; then
+ echo cannot find tail
+ exit 1
+fi
+
+for i do
+ if test ! -f "$i" ; then
+ echo ${x}: $i not a file
+ res=1
+ continue
+ fi
+ if test $decomp -eq 0; then
+ if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
+ echo "${x}: $i is already gzexe'd"
+ continue
+ fi
+ fi
+ if ls -l "$i" | grep '^...[sS]' > /dev/null; then
+ echo "${x}: $i has setuid permission, unchanged"
+ continue
+ fi
+ if ls -l "$i" | grep '^......[sS]' > /dev/null; then
+ echo "${x}: $i has setgid permission, unchanged"
+ continue
+ fi
+ case "`basename $i`" in
+ gzip | tail | chmod | ln | sleep | rm)
+ echo "${x}: $i would depend on itself"; continue ;;
+ esac
+ if test -z "$cpmod"; then
+ cp -p "$i" $tmp 2>/dev/null || cp "$i" $tmp
+ if test -w $tmp 2>/dev/null; then
+ writable=1
+ else
+ writable=0
+ chmod u+w $tmp 2>/dev/null
+ fi
+ fi
+ if test $decomp -eq 0; then
+ sed 1q $0 > $tmp
+ sed "s|^if tail|if $tail|" >> $tmp <<'EOF'
+skip=18
+if tail +$skip $0 | "BINDIR"/gzip -cd > /tmp/gztmp$$; then
+ /bin/chmod 700 /tmp/gztmp$$
+ prog="`echo $0 | /bin/sed 's|^.*/||'`"
+ if /bin/ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then
+ trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0
+ (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null &
+ /tmp/"$prog" ${1+"$@"}; res=$?
+ else
+ trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0
+ (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null &
+ /tmp/gztmp$$ ${1+"$@"}; res=$?
+ fi
+else
+ echo Cannot decompress $0; exit 1
+fi; exit $res
+EOF
+ "BINDIR"/gzip -cv9 "$i" >> $tmp || {
+ /bin/rm -f $tmp
+ echo ${x}: compression not possible for $i, file unchanged.
+ res=1
+ continue
+ }
+
+ else
+ # decompression
+ skip=18
+ if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
+ eval `sed -e 1d -e 2q "$i"`
+ fi
+ if tail +$skip "$i" | "BINDIR"/gzip -cd > $tmp; then
+ :
+ else
+ echo ${x}: $i probably not in gzexe format, file unchanged.
+ res=1
+ continue
+ fi
+ fi
+ rm -f "$i~"
+ mv "$i" "$i~" || {
+ echo ${x}: cannot backup $i as $i~
+ rm -f $tmp
+ res=1
+ continue
+ }
+ mv $tmp "$i" || cp -p $tmp "$i" 2>/dev/null || cp $tmp "$i" || {
+ echo ${x}: cannot create $i
+ rm -f $tmp
+ res=1
+ continue
+ }
+ rm -f $tmp
+ if test -n "$cpmod"; then
+ $cpmod "$i~" "$i" 2>/dev/null
+ elif test $writable -eq 0; then
+ chmod u-w $i 2>/dev/null
+ fi
+done
+exit $res
diff --git a/Build/source/utils/gzip/gzip.1 b/Build/source/utils/gzip/gzip.1
new file mode 100644
index 00000000000..6fa79862bfc
--- /dev/null
+++ b/Build/source/utils/gzip/gzip.1
@@ -0,0 +1,478 @@
+.PU
+.TH GZIP 1 local
+.SH NAME
+gzip, gunzip, zcat \- compress or expand files
+.SH SYNOPSIS
+.ll +8
+.B gzip
+.RB [ " \-acdfhlLnNrtvV19 " ]
+.RB [ \-S\ suffix ]
+[
+.I "name \&..."
+]
+.ll -8
+.br
+.B gunzip
+.RB [ " \-acfhlLnNrtvV " ]
+.RB [ \-S\ suffix ]
+[
+.I "name \&..."
+]
+.br
+.B zcat
+.RB [ " \-fhLV " ]
+[
+.I "name \&..."
+]
+.SH DESCRIPTION
+.I Gzip
+reduces the size of the named files using Lempel-Ziv coding (LZ77).
+Whenever possible,
+each file is replaced by one with the extension
+.B "\&.gz,"
+while keeping the same ownership modes, access and modification times.
+(The default extension is
+.B "\-gz"
+for VMS,
+.B "z"
+for MSDOS, OS/2 FAT, Windows NT FAT and Atari.)
+If no files are specified, or if a file name is "-", the standard input is
+compressed to the standard output.
+.I Gzip
+will only attempt to compress regular files.
+In particular, it will ignore symbolic links.
+.PP
+If the compressed file name is too long for its file system,
+.I gzip
+truncates it.
+.I Gzip
+attempts to truncate only the parts of the file name longer than 3 characters.
+(A part is delimited by dots.) If the name consists of small parts only,
+the longest parts are truncated. For example, if file names are limited
+to 14 characters, gzip.msdos.exe is compressed to gzi.msd.exe.gz.
+Names are not truncated on systems which do not have a limit on file name
+length.
+.PP
+By default,
+.I gzip
+keeps the original file name and timestamp in the compressed file. These
+are used when decompressing the file with the
+.B \-N
+option. This is useful when the compressed file name was truncated or
+when the time stamp was not preserved after a file transfer.
+.PP
+Compressed files can be restored to their original form using
+.I gzip -d
+or
+.I gunzip
+or
+.I zcat.
+If the original name saved in the compressed file is not suitable for its
+file system, a new name is constructed from the original one to make it
+legal.
+.PP
+.I gunzip
+takes a list of files on its command line and replaces each
+file whose name ends with .gz, -gz, .z, -z, _z or .Z
+and which begins with the correct magic number with an uncompressed
+file without the original extension.
+.I gunzip
+also recognizes the special extensions
+.B "\&.tgz"
+and
+.B "\&.taz"
+as shorthands for
+.B "\&.tar.gz"
+and
+.B "\&.tar.Z"
+respectively.
+When compressing,
+.I gzip
+uses the
+.B "\&.tgz"
+extension if necessary instead of truncating a file with a
+.B "\&.tar"
+extension.
+.PP
+.I gunzip
+can currently decompress files created by
+.I gzip, zip, compress, compress -H
+or
+.I pack.
+The detection of the input format is automatic. When using
+the first two formats,
+.I gunzip
+checks a 32 bit CRC. For
+.I pack, gunzip
+checks the uncompressed length. The standard
+.I compress
+format was not designed to allow consistency checks. However
+.I gunzip
+is sometimes able to detect a bad .Z file. If you get an error
+when uncompressing a .Z file, do not assume that the .Z file is
+correct simply because the standard
+.I uncompress
+does not complain. This generally means that the standard
+.I uncompress
+does not check its input, and happily generates garbage output.
+The SCO compress -H format (lzh compression method) does not include a CRC
+but also allows some consistency checks.
+.PP
+Files created by
+.I zip
+can be uncompressed by gzip only if they have a single member compressed
+with the 'deflation' method. This feature is only intended to help
+conversion of tar.zip files to the tar.gz format. To extract zip files
+with several members, use
+.I unzip
+instead of
+.I gunzip.
+.PP
+.I zcat
+is identical to
+.I gunzip
+.B \-c.
+(On some systems,
+.I zcat
+may be installed as
+.I gzcat
+to preserve the original link to
+.I compress.)
+.I zcat
+uncompresses either a list of files on the command line or its
+standard input and writes the uncompressed data on standard output.
+.I zcat
+will uncompress files that have the correct magic number whether
+they have a
+.B "\&.gz"
+suffix or not.
+.PP
+.I Gzip
+uses the Lempel-Ziv algorithm used in
+.I zip
+and PKZIP.
+The amount of compression obtained depends on the size of the
+input and the distribution of common substrings.
+Typically, text such as source code or English
+is reduced by 60\-70%.
+Compression is generally much better than that achieved by
+LZW (as used in
+.IR compress ),
+Huffman coding (as used in
+.IR pack ),
+or adaptive Huffman coding
+.RI ( compact ).
+.PP
+Compression is always performed, even if the compressed file is
+slightly larger than the original. The worst case expansion is
+a few bytes for the gzip file header, plus 5 bytes every 32K block,
+or an expansion ratio of 0.015% for large files. Note that the actual
+number of used disk blocks almost never increases.
+.I gzip
+preserves the mode, ownership and timestamps of files when compressing
+or decompressing.
+
+.SH OPTIONS
+.TP
+.B \-a --ascii
+Ascii text mode: convert end-of-lines using local conventions. This option
+is supported only on some non-Unix systems. For MSDOS, CR LF is converted
+to LF when compressing, and LF is converted to CR LF when decompressing.
+.TP
+.B \-c --stdout --to-stdout
+Write output on standard output; keep original files unchanged.
+If there are several input files, the output consists of a sequence of
+independently compressed members. To obtain better compression,
+concatenate all input files before compressing them.
+.TP
+.B \-d --decompress --uncompress
+Decompress.
+.TP
+.B \-f --force
+Force compression or decompression even if the file has multiple links
+or the corresponding file already exists, or if the compressed data
+is read from or written to a terminal. If the input data is not in
+a format recognized by
+.I gzip,
+and if the option --stdout is also given, copy the input data without change
+to the standard ouput: let
+.I zcat
+behave as
+.I cat.
+If
+.B \-f
+is not given,
+and when not running in the background,
+.I gzip
+prompts to verify whether an existing file should be overwritten.
+.TP
+.B \-h --help
+Display a help screen and quit.
+.TP
+.B \-l --list
+For each compressed file, list the following fields:
+
+ compressed size: size of the compressed file
+ uncompressed size: size of the uncompressed file
+ ratio: compression ratio (0.0% if unknown)
+ uncompressed_name: name of the uncompressed file
+
+The uncompressed size is given as -1 for files not in gzip format,
+such as compressed .Z files. To get the uncompressed size for such a file,
+you can use:
+
+ zcat file.Z | wc -c
+
+In combination with the --verbose option, the following fields are also
+displayed:
+
+ method: compression method
+ crc: the 32-bit CRC of the uncompressed data
+ date & time: time stamp for the uncompressed file
+
+The compression methods currently supported are deflate, compress, lzh
+(SCO compress -H) and pack. The crc is given as ffffffff for a file
+not in gzip format.
+
+With --name, the uncompressed name, date and time are
+those stored within the compress file if present.
+
+With --verbose, the size totals and compression ratio for all files
+is also displayed, unless some sizes are unknown. With --quiet,
+the title and totals lines are not displayed.
+.TP
+.B \-L --license
+Display the
+.I gzip
+license and quit.
+.TP
+.B \-n --no-name
+When compressing, do not save the original file name and time stamp by
+default. (The original name is always saved if the name had to be
+truncated.) When decompressing, do not restore the original file name
+if present (remove only the
+.I gzip
+suffix from the compressed file name) and do not restore the original
+time stamp if present (copy it from the compressed file). This option
+is the default when decompressing.
+.TP
+.B \-N --name
+When compressing, always save the original file name and time stamp; this
+is the default. When decompressing, restore the original file name and
+time stamp if present. This option is useful on systems which have
+a limit on file name length or when the time stamp has been lost after
+a file transfer.
+.TP
+.B \-q --quiet
+Suppress all warnings.
+.TP
+.B \-r --recursive
+Travel the directory structure recursively. If any of the file names
+specified on the command line are directories,
+.I gzip
+will descend into the directory and compress all the files it finds there
+(or decompress them in the case of
+.I gunzip
+).
+.TP
+.B \-S .suf --suffix .suf
+Use suffix .suf instead of .gz. Any suffix can be given, but suffixes
+other than .z and .gz should be avoided to avoid confusion when files
+are transferred to other systems. A null suffix forces gunzip to try
+decompression on all given files regardless of suffix, as in:
+
+ gunzip -S "" * (*.* for MSDOS)
+
+Previous versions of gzip used
+the .z suffix. This was changed to avoid a conflict with
+.IR pack "(1)".
+.TP
+.B \-t --test
+Test. Check the compressed file integrity.
+.TP
+.B \-v --verbose
+Verbose. Display the name and percentage reduction for each file compressed
+or decompressed.
+.TP
+.B \-V --version
+Version. Display the version number and compilation options then quit.
+.TP
+.B \-# --fast --best
+Regulate the speed of compression using the specified digit
+.IR # ,
+where
+.B \-1
+or
+.B \-\-fast
+indicates the fastest compression method (less compression)
+and
+.B \-9
+or
+.B \-\-best
+indicates the slowest compression method (best compression).
+The default compression level is
+.BR \-6
+(that is, biased towards high compression at expense of speed).
+.SH "ADVANCED USAGE"
+Multiple compressed files can be concatenated. In this case,
+.I gunzip
+will extract all members at once. For example:
+
+ gzip -c file1 > foo.gz
+ gzip -c file2 >> foo.gz
+
+Then
+ gunzip -c foo
+
+is equivalent to
+
+ cat file1 file2
+
+In case of damage to one member of a .gz file, other members can
+still be recovered (if the damaged member is removed). However,
+you can get better compression by compressing all members at once:
+
+ cat file1 file2 | gzip > foo.gz
+
+compresses better than
+
+ gzip -c file1 file2 > foo.gz
+
+If you want to recompress concatenated files to get better compression, do:
+
+ gzip -cd old.gz | gzip > new.gz
+
+If a compressed file consists of several members, the uncompressed
+size and CRC reported by the --list option applies to the last member
+only. If you need the uncompressed size for all members, you can use:
+
+ gzip -cd file.gz | wc -c
+
+If you wish to create a single archive file with multiple members so
+that members can later be extracted independently, use an archiver
+such as tar or zip. GNU tar supports the -z option to invoke gzip
+transparently. gzip is designed as a complement to tar, not as a
+replacement.
+.SH "ENVIRONMENT"
+The environment variable
+.B GZIP
+can hold a set of default options for
+.I gzip.
+These options are interpreted first and can be overwritten by
+explicit command line parameters. For example:
+ for sh: GZIP="-8v --name"; export GZIP
+ for csh: setenv GZIP "-8v --name"
+ for MSDOS: set GZIP=-8v --name
+
+On Vax/VMS, the name of the environment variable is GZIP_OPT, to
+avoid a conflict with the symbol set for invocation of the program.
+.SH "SEE ALSO"
+znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), zip(1), unzip(1), compress(1),
+pack(1), compact(1)
+.SH "DIAGNOSTICS"
+Exit status is normally 0;
+if an error occurs, exit status is 1. If a warning occurs, exit status is 2.
+.PP
+Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+.in +8
+Invalid options were specified on the command line.
+.in -8
+.IR file :
+not in gzip format
+.in +8
+The file specified to
+.I gunzip
+has not been compressed.
+.in -8
+.IR file:
+Corrupt input. Use zcat to recover some data.
+.in +8
+The compressed file has been damaged. The data up to the point of failure
+can be recovered using
+.in +8
+zcat file > recover
+.in -16
+.IR file :
+compressed with
+.I xx
+bits, can only handle
+.I yy
+bits
+.in +8
+.I File
+was compressed (using LZW) by a program that could deal with
+more
+.I bits
+than the decompress code on this machine.
+Recompress the file with gzip, which compresses better and uses
+less memory.
+.in -8
+.IR file :
+already has .gz suffix -- no change
+.in +8
+The file is assumed to be already compressed.
+Rename the file and try again.
+.in -8
+.I file
+already exists; do you wish to overwrite (y or n)?
+.in +8
+Respond "y" if you want the output file to be replaced; "n" if not.
+.in -8
+gunzip: corrupt input
+.in +8
+A SIGSEGV violation was detected which usually means that the input file has
+been corrupted.
+.in -8
+.I "xx.x%"
+.in +8
+Percentage of the input saved by compression.
+(Relevant only for
+.BR \-v
+and
+.BR \-l \.)
+.in -8
+-- not a regular file or directory: ignored
+.in +8
+When the input file is not a regular file or directory,
+(e.g. a symbolic link, socket, FIFO, device file), it is
+left unaltered.
+.in -8
+-- has
+.I xx
+other links: unchanged
+.in +8
+The input file has links; it is left unchanged. See
+.IR ln "(1)"
+for more information. Use the
+.B \-f
+flag to force compression of multiply-linked files.
+.in -8
+.SH CAVEATS
+When writing compressed data to a tape, it is generally necessary to
+pad the output with zeroes up to a block boundary. When the data is
+read and the whole block is passed to
+.I gunzip
+for decompression,
+.I gunzip
+detects that there is extra trailing garbage after the compressed data
+and emits a warning by default. You have to use the --quiet option to
+suppress the warning. This option can be set in the
+.B GZIP
+environment variable as in:
+ for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
+ for csh: (setenv GZIP -q; tar -xfz --block-compr /dev/rst0
+
+In the above example, gzip is invoked implicitly by the -z option of
+GNU tar. Make sure that the same block size (-b option of tar) is used
+for reading and writing compressed data on tapes. (This example
+assumes you are using the GNU version of tar.)
+.SH BUGS
+The --list option reports incorrect sizes if they exceed 2 gigabytes.
+The --list option reports sizes as -1 and crc as ffffffff if the
+compressed file is on a non seekable media.
+
+In some rare cases, the --best option gives worse compression than
+the default compression level (-6). On some highly redundant files,
+.I compress
+compresses better than
+.I gzip.
diff --git a/Build/source/utils/gzip/gzip.c b/Build/source/utils/gzip/gzip.c
new file mode 100644
index 00000000000..68f0c36d67c
--- /dev/null
+++ b/Build/source/utils/gzip/gzip.c
@@ -0,0 +1,1744 @@
+/* gzip (GNU zip) -- compress files with zip algorithm and 'compress' interface
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * The unzip code was written and put in the public domain by Mark Adler.
+ * Portions of the lzw code are derived from the public domain 'compress'
+ * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies,
+ * Ken Turkowski, Dave Mack and Peter Jannesen.
+ *
+ * See the license_msg below and the file COPYING for the software license.
+ * See the file algorithm.doc for the compression algorithms and file formats.
+ */
+
+static char *license_msg[] = {
+" Copyright (C) 1992-1993 Jean-loup Gailly",
+" This program is free software; you can redistribute it and/or modify",
+" it under the terms of the GNU General Public License as published by",
+" the Free Software Foundation; either version 2, or (at your option)",
+" any later version.",
+"",
+" This program is distributed in the hope that it will be useful,",
+" but WITHOUT ANY WARRANTY; without even the implied warranty of",
+" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
+" GNU General Public License for more details.",
+"",
+" You should have received a copy of the GNU General Public License",
+" along with this program; if not, write to the Free Software",
+" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.",
+0};
+
+/* Compress files with zip algorithm and 'compress' interface.
+ * See usage() and help() functions below for all options.
+ * Outputs:
+ * file.gz: compressed file with same mode, owner, and utimes
+ * or stdout with -c option or if stdin used as input.
+ * If the output file name had to be truncated, the original name is kept
+ * in the compressed file.
+ * On MSDOS, file.tmp -> file.tmz. On VMS, file.tmp -> file.tmp-gz.
+ *
+ * Using gz on MSDOS would create too many file name conflicts. For
+ * example, foo.txt -> foo.tgz (.tgz must be reserved as shorthand for
+ * tar.gz). Similarly, foo.dir and foo.doc would both be mapped to foo.dgz.
+ * I also considered 12345678.txt -> 12345txt.gz but this truncates the name
+ * too heavily. There is no ideal solution given the MSDOS 8+3 limitation.
+ *
+ * For the meaning of all compilation flags, see comments in Makefile.in.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: gzip.c,v 0.24 1993/06/24 10:52:07 jloup Exp $";
+#endif
+
+#include <ctype.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "tailor.h"
+#include "gzip.h"
+#include "lzw.h"
+#include "revision.h"
+#include "getopt.h"
+
+ /* configuration */
+
+#ifdef NO_TIME_H
+# include <sys/time.h>
+#else
+# include <time.h>
+#endif
+
+#ifndef NO_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if defined(STDC_HEADERS) || !defined(NO_STDLIB_H)
+# include <stdlib.h>
+#else
+ extern int errno;
+#endif
+
+#if defined(DIRENT)
+# include <dirent.h>
+ typedef struct dirent dir_type;
+# define NLENGTH(dirent) ((int)strlen((dirent)->d_name))
+# define DIR_OPT "DIRENT"
+#else
+# define NLENGTH(dirent) ((dirent)->d_namlen)
+# ifdef SYSDIR
+# include <sys/dir.h>
+ typedef struct direct dir_type;
+# define DIR_OPT "SYSDIR"
+# else
+# ifdef SYSNDIR
+# include <sys/ndir.h>
+ typedef struct direct dir_type;
+# define DIR_OPT "SYSNDIR"
+# else
+# ifdef NDIR
+# include <ndir.h>
+ typedef struct direct dir_type;
+# define DIR_OPT "NDIR"
+# else
+# define NO_DIR
+# define DIR_OPT "NO_DIR"
+# endif
+# endif
+# endif
+#endif
+
+#ifndef NO_UTIME
+# ifndef NO_UTIME_H
+# include <utime.h>
+# define TIME_OPT "UTIME"
+# else
+# ifdef HAVE_SYS_UTIME_H
+# include <sys/utime.h>
+# define TIME_OPT "SYS_UTIME"
+# else
+ struct utimbuf {
+ time_t actime;
+ time_t modtime;
+ };
+# define TIME_OPT ""
+# endif
+# endif
+#else
+# define TIME_OPT "NO_UTIME"
+#endif
+
+#if !defined(S_ISDIR) && defined(S_IFDIR)
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+#if !defined(S_ISREG) && defined(S_IFREG)
+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif
+
+typedef RETSIGTYPE (__cdecl *sig_type) OF((int));
+
+#ifndef O_BINARY
+# define O_BINARY 0 /* creation mode for open() */
+#endif
+
+#ifndef O_CREAT
+ /* Pure BSD system? */
+# include <sys/file.h>
+# ifndef O_CREAT
+# define O_CREAT FCREAT
+# endif
+# ifndef O_EXCL
+# define O_EXCL FEXCL
+# endif
+#endif
+
+#ifndef S_IRUSR
+# define S_IRUSR 0400
+#endif
+#ifndef S_IWUSR
+# define S_IWUSR 0200
+#endif
+#define RW_USER (S_IRUSR | S_IWUSR) /* creation mode for open() */
+
+#ifndef MAX_PATH_LEN
+# define MAX_PATH_LEN 1024 /* max pathname length */
+#endif
+
+#ifndef SEEK_END
+# define SEEK_END 2
+#endif
+
+#ifdef NO_OFF_T
+ typedef long off_t;
+ off_t lseek OF((int fd, off_t offset, int whence));
+#endif
+
+/* Separator for file name parts (see shorten_name()) */
+#ifdef NO_MULTIPLE_DOTS
+# define PART_SEP "-"
+#else
+# define PART_SEP "."
+#endif
+
+ /* global buffers */
+
+DECLARE(uch, inbuf, INBUFSIZ +INBUF_EXTRA);
+DECLARE(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA);
+DECLARE(ush, d_buf, DIST_BUFSIZE);
+DECLARE(uch, window, 2L*WSIZE);
+#ifndef MAXSEG_64K
+ DECLARE(ush, tab_prefix, 1L<<BITS);
+#else
+ DECLARE(ush, tab_prefix0, 1L<<(BITS-1));
+ DECLARE(ush, tab_prefix1, 1L<<(BITS-1));
+#endif
+
+ /* local variables */
+
+int ascii = 0; /* convert end-of-lines to local OS conventions */
+int to_stdout = 0; /* output to stdout (-c) */
+int decompress = 0; /* decompress (-d) */
+int force = 0; /* don't ask questions, compress links (-f) */
+int no_name = -1; /* don't save or restore the original file name */
+int no_time = -1; /* don't save or restore the original file time */
+int recursive = 0; /* recurse through directories (-r) */
+int list = 0; /* list the file contents (-l) */
+int verbose = 0; /* be verbose (-v) */
+int quiet = 0; /* be very quiet (-q) */
+int do_lzw = 0; /* generate output compatible with old compress (-Z) */
+int test = 0; /* test .gz file integrity */
+int foreground; /* set if program run in foreground */
+char *progname; /* program name */
+int maxbits = BITS; /* max bits per code for LZW */
+int method = DEFLATED;/* compression method */
+int level = 6; /* compression level */
+int exit_code = OK; /* program exit code */
+int save_orig_name; /* set if original name must be saved */
+int last_member; /* set for .zip and .Z files */
+int part_nb; /* number of parts in .gz file */
+long time_stamp; /* original time stamp (modification time) */
+long ifile_size; /* input file size, -1 for devices (debug only) */
+char *env; /* contents of GZIP env variable */
+char **args = NULL; /* argv pointer if GZIP env variable defined */
+char z_suffix[MAX_SUFFIX+1]; /* default suffix (can be set with --suffix) */
+int z_len; /* strlen(z_suffix) */
+
+long bytes_in; /* number of input bytes */
+long bytes_out; /* number of output bytes */
+long total_in = 0; /* input bytes for all files */
+long total_out = 0; /* output bytes for all files */
+char ifname[MAX_PATH_LEN]; /* input file name */
+char ofname[MAX_PATH_LEN]; /* output file name */
+int remove_ofname = 0; /* remove output file on error */
+struct stat istat; /* status for input file */
+int ifd; /* input file descriptor */
+int ofd; /* output file descriptor */
+unsigned insize; /* valid bytes in inbuf */
+unsigned inptr; /* index of next byte to be processed in inbuf */
+unsigned outcnt; /* bytes in output buffer */
+
+struct option longopts[] =
+{
+ /* { name has_arg *flag val } */
+ {"ascii", 0, 0, 'a'}, /* ascii text mode */
+ {"to-stdout", 0, 0, 'c'}, /* write output on standard output */
+ {"stdout", 0, 0, 'c'}, /* write output on standard output */
+ {"decompress", 0, 0, 'd'}, /* decompress */
+ {"uncompress", 0, 0, 'd'}, /* decompress */
+ /* {"encrypt", 0, 0, 'e'}, encrypt */
+ {"force", 0, 0, 'f'}, /* force overwrite of output file */
+ {"help", 0, 0, 'h'}, /* give help */
+ /* {"pkzip", 0, 0, 'k'}, force output in pkzip format */
+ {"list", 0, 0, 'l'}, /* list .gz file contents */
+ {"license", 0, 0, 'L'}, /* display software license */
+ {"no-name", 0, 0, 'n'}, /* don't save or restore original name & time */
+ {"name", 0, 0, 'N'}, /* save or restore original name & time */
+ {"quiet", 0, 0, 'q'}, /* quiet mode */
+ {"silent", 0, 0, 'q'}, /* quiet mode */
+ {"recursive", 0, 0, 'r'}, /* recurse through directories */
+ {"suffix", 1, 0, 'S'}, /* use given suffix instead of .gz */
+ {"test", 0, 0, 't'}, /* test compressed file integrity */
+ {"no-time", 0, 0, 'T'}, /* don't save or restore the time stamp */
+ {"verbose", 0, 0, 'v'}, /* verbose mode */
+ {"version", 0, 0, 'V'}, /* display version number */
+ {"fast", 0, 0, '1'}, /* compress faster */
+ {"best", 0, 0, '9'}, /* compress better */
+ {"lzw", 0, 0, 'Z'}, /* make output compatible with old compress */
+ {"bits", 1, 0, 'b'}, /* max number of bits per code (implies -Z) */
+ { 0, 0, 0, 0 }
+};
+
+/* local functions */
+
+local void usage OF((void));
+local void help OF((void));
+local void license OF((void));
+local void version OF((void));
+local void treat_stdin OF((void));
+local void treat_file OF((char *iname));
+local int create_outfile OF((void));
+local int do_stat OF((char *name, struct stat *sbuf));
+local char *get_suffix OF((char *name));
+local int get_istat OF((char *iname, struct stat *sbuf));
+local int make_ofname OF((void));
+local int same_file OF((struct stat *stat1, struct stat *stat2));
+local int name_too_long OF((char *name, struct stat *statb));
+local void shorten_name OF((char *name));
+local int get_method OF((int in));
+local void do_list OF((int ifd, int method));
+local int check_ofname OF((void));
+local void copy_stat OF((struct stat *ifstat));
+local void do_exit OF((int exitcode));
+ int main OF((int argc, char **argv));
+int (*work) OF((int infile, int outfile)) = zip; /* function to call */
+
+#ifndef NO_DIR
+local void treat_dir OF((char *dir));
+#endif
+#ifndef NO_UTIME
+local void reset_times OF((char *name, struct stat *statb));
+#endif
+
+#define strequ(s1, s2) (strcmp((s1),(s2)) == 0)
+
+/* ======================================================================== */
+local void usage()
+{
+ fprintf(stderr, "usage: %s [-%scdfhlLnN%stvV19] [-S suffix] [file ...]\n",
+ progname,
+#if O_BINARY
+ "a",
+#else
+ "",
+#endif
+#ifdef NO_DIR
+ ""
+#else
+ "r"
+#endif
+ );
+}
+
+/* ======================================================================== */
+local void help()
+{
+ static char *help_msg[] = {
+#if O_BINARY
+ " -a --ascii ascii text; convert end-of-lines using local conventions",
+#endif
+ " -c --stdout write on standard output, keep original files unchanged",
+ " -d --decompress decompress",
+/* -e --encrypt encrypt */
+ " -f --force force overwrite of output file and compress links",
+ " -h --help give this help",
+/* -k --pkzip force output in pkzip format */
+ " -l --list list compressed file contents",
+ " -L --license display software license",
+#ifdef UNDOCUMENTED
+ " -m --no-time do not save or restore the original modification time",
+ " -M --time save or restore the original modification time",
+#endif
+ " -n --no-name do not save or restore the original name and time stamp",
+ " -N --name save or restore the original name and time stamp",
+ " -q --quiet suppress all warnings",
+#ifndef NO_DIR
+ " -r --recursive operate recursively on directories",
+#endif
+ " -S .suf --suffix .suf use suffix .suf on compressed files",
+ " -t --test test compressed file integrity",
+ " -v --verbose verbose mode",
+ " -V --version display version number",
+ " -1 --fast compress faster",
+ " -9 --best compress better",
+#ifdef LZW
+ " -Z --lzw produce output compatible with old compress",
+ " -b --bits maxbits max number of bits per code (implies -Z)",
+#endif
+ " file... files to (de)compress. If none given, use standard input.",
+ 0};
+ char **p = help_msg;
+
+ fprintf(stderr,"%s %s (%s)\n", progname, VERSION, REVDATE);
+ usage();
+ while (*p) fprintf(stderr, "%s\n", *p++);
+}
+
+/* ======================================================================== */
+local void license()
+{
+ char **p = license_msg;
+
+ fprintf(stderr,"%s %s (%s)\n", progname, VERSION, REVDATE);
+ while (*p) fprintf(stderr, "%s\n", *p++);
+}
+
+/* ======================================================================== */
+local void version()
+{
+ fprintf(stderr,"%s %s (%s)\n", progname, VERSION, REVDATE);
+
+ fprintf(stderr, "Compilation options:\n%s %s ", DIR_OPT, TIME_OPT);
+#ifdef STDC_HEADERS
+ fprintf(stderr, "STDC_HEADERS ");
+#endif
+#ifdef HAVE_UNISTD_H
+ fprintf(stderr, "HAVE_UNISTD_H ");
+#endif
+#ifdef NO_MEMORY_H
+ fprintf(stderr, "NO_MEMORY_H ");
+#endif
+#ifdef NO_STRING_H
+ fprintf(stderr, "NO_STRING_H ");
+#endif
+#ifdef NO_SYMLINK
+ fprintf(stderr, "NO_SYMLINK ");
+#endif
+#ifdef NO_MULTIPLE_DOTS
+ fprintf(stderr, "NO_MULTIPLE_DOTS ");
+#endif
+#ifdef NO_CHOWN
+ fprintf(stderr, "NO_CHOWN ");
+#endif
+#ifdef PROTO
+ fprintf(stderr, "PROTO ");
+#endif
+#ifdef ASMV
+ fprintf(stderr, "ASMV ");
+#endif
+#ifdef DEBUG
+ fprintf(stderr, "DEBUG ");
+#endif
+#ifdef DYN_ALLOC
+ fprintf(stderr, "DYN_ALLOC ");
+#endif
+#ifdef MAXSEG_64K
+ fprintf(stderr, "MAXSEG_64K");
+#endif
+ fprintf(stderr, "\n");
+}
+
+/* ======================================================================== */
+int main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int file_count; /* number of files to precess */
+ int proglen; /* length of progname */
+ int optc; /* current option */
+
+ EXPAND(argc, argv); /* wild card expansion if necessary */
+
+ progname = basename(argv[0]);
+ proglen = strlen(progname);
+
+ /* Suppress .exe for MSDOS, OS/2 and VMS: */
+ if (proglen > 4 && strequ(progname+proglen-4, ".exe")) {
+ progname[proglen-4] = '\0';
+ }
+
+ /* Add options in GZIP environment variable if there is one */
+ env = add_envopt(&argc, &argv, OPTIONS_VAR);
+ if (env != NULL) args = argv;
+
+ foreground = signal(SIGINT, SIG_IGN) != SIG_IGN;
+ if (foreground) {
+ (void) signal (SIGINT, (sig_type)abort_gzip);
+ }
+#ifdef SIGTERM
+ if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
+ (void) signal(SIGTERM, (sig_type)abort_gzip);
+ }
+#endif
+#ifdef SIGHUP
+ if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
+ (void) signal(SIGHUP, (sig_type)abort_gzip);
+ }
+#endif
+
+#ifndef GNU_STANDARD
+ /* For compatibility with old compress, use program name as an option.
+ * If you compile with -DGNU_STANDARD, this program will behave as
+ * gzip even if it is invoked under the name gunzip or zcat.
+ *
+ * Systems which do not support links can still use -d or -dc.
+ * Ignore an .exe extension for MSDOS, OS/2 and VMS.
+ */
+ if ( strncmp(progname, "un", 2) == 0 /* ungzip, uncompress */
+ || strncmp(progname, "gun", 3) == 0) { /* gunzip */
+ decompress = 1;
+ } else if (strequ(progname+1, "cat") /* zcat, pcat, gcat */
+ || strequ(progname, "gzcat")) { /* gzcat */
+ decompress = to_stdout = 1;
+ }
+#endif
+
+ strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix)-1);
+ z_len = strlen(z_suffix);
+
+ while ((optc = getopt_long (argc, argv, "ab:cdfhH?lLmMnNqrS:tvVZ123456789",
+ longopts, (int *)0)) != EOF) {
+ switch (optc) {
+ case 'a':
+ ascii = 1; break;
+ case 'b':
+ maxbits = atoi(optarg);
+ break;
+ case 'c':
+ to_stdout = 1; break;
+ case 'd':
+ decompress = 1; break;
+ case 'f':
+ force++; break;
+ case 'h': case 'H': case '?':
+ help(); do_exit(OK); break;
+ case 'l':
+ list = decompress = to_stdout = 1; break;
+ case 'L':
+ license(); do_exit(OK); break;
+ case 'm': /* undocumented, may change later */
+ no_time = 1; break;
+ case 'M': /* undocumented, may change later */
+ no_time = 0; break;
+ case 'n':
+ no_name = no_time = 1; break;
+ case 'N':
+ no_name = no_time = 0; break;
+ case 'q':
+ quiet = 1; verbose = 0; break;
+ case 'r':
+#ifdef NO_DIR
+ fprintf(stderr, "%s: -r not supported on this system\n", progname);
+ usage();
+ do_exit(ERROR); break;
+#else
+ recursive = 1; break;
+#endif
+ case 'S':
+#ifdef NO_MULTIPLE_DOTS
+ if (*optarg == '.') optarg++;
+#endif
+ z_len = strlen(optarg);
+ strcpy(z_suffix, optarg);
+ break;
+ case 't':
+ test = decompress = to_stdout = 1;
+ break;
+ case 'v':
+ verbose++; quiet = 0; break;
+ case 'V':
+ version(); do_exit(OK); break;
+ case 'Z':
+#ifdef LZW
+ do_lzw = 1; break;
+#else
+ fprintf(stderr, "%s: -Z not supported in this version\n",
+ progname);
+ usage();
+ do_exit(ERROR); break;
+#endif
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ level = optc - '0';
+ break;
+ default:
+ /* Error message already emitted by getopt_long. */
+ usage();
+ do_exit(ERROR);
+ }
+ } /* loop on all arguments */
+
+ /* By default, save name and timestamp on compression but do not
+ * restore them on decompression.
+ */
+ if (no_time < 0) no_time = decompress;
+ if (no_name < 0) no_name = decompress;
+
+ file_count = argc - optind;
+
+#if O_BINARY
+#else
+ if (ascii && !quiet) {
+ fprintf(stderr, "%s: option --ascii ignored on this system\n",
+ progname);
+ }
+#endif
+ if ((z_len == 0 && !decompress) || z_len > MAX_SUFFIX) {
+ fprintf(stderr, "%s: incorrect suffix '%s'\n",
+ progname, optarg);
+ do_exit(ERROR);
+ }
+ if (do_lzw && !decompress) work = lzw;
+
+ /* Allocate all global buffers (for DYN_ALLOC option) */
+ ALLOC(uch, inbuf, INBUFSIZ +INBUF_EXTRA);
+ ALLOC(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA);
+ ALLOC(ush, d_buf, DIST_BUFSIZE);
+ ALLOC(uch, window, 2L*WSIZE);
+#ifndef MAXSEG_64K
+ ALLOC(ush, tab_prefix, 1L<<BITS);
+#else
+ ALLOC(ush, tab_prefix0, 1L<<(BITS-1));
+ ALLOC(ush, tab_prefix1, 1L<<(BITS-1));
+#endif
+
+ /* And get to work */
+ if (file_count != 0) {
+ if (to_stdout && !test && !list && (!decompress || !ascii)) {
+ SET_BINARY_MODE(fileno(stdout));
+ }
+ while (optind < argc) {
+ treat_file(argv[optind++]);
+ }
+ } else { /* Standard input */
+ treat_stdin();
+ }
+ if (list && !quiet && file_count > 1) {
+ do_list(-1, -1); /* print totals */
+ }
+ do_exit(exit_code);
+ return exit_code; /* just to avoid lint warning */
+}
+
+/* ========================================================================
+ * Compress or decompress stdin
+ */
+local void treat_stdin()
+{
+ if (!force && !list &&
+ isatty(fileno((FILE *)(decompress ? stdin : stdout)))) {
+ /* Do not send compressed data to the terminal or read it from
+ * the terminal. We get here when user invoked the program
+ * without parameters, so be helpful. According to the GNU standards:
+ *
+ * If there is one behavior you think is most useful when the output
+ * is to a terminal, and another that you think is most useful when
+ * the output is a file or a pipe, then it is usually best to make
+ * the default behavior the one that is useful with output to a
+ * terminal, and have an option for the other behavior.
+ *
+ * Here we use the --force option to get the other behavior.
+ */
+ fprintf(stderr,
+ "%s: compressed data not %s a terminal. Use -f to force %scompression.\n",
+ progname, decompress ? "read from" : "written to",
+ decompress ? "de" : "");
+ fprintf(stderr,"For help, type: %s -h\n", progname);
+ do_exit(ERROR);
+ }
+
+ if (decompress || !ascii) {
+ SET_BINARY_MODE(fileno(stdin));
+ }
+ if (!test && !list && (!decompress || !ascii)) {
+ SET_BINARY_MODE(fileno(stdout));
+ }
+ strcpy(ifname, "stdin");
+ strcpy(ofname, "stdout");
+
+ /* Get the time stamp on the input file. */
+ time_stamp = 0; /* time unknown by default */
+
+#ifndef NO_STDIN_FSTAT
+ if (list || !no_time) {
+ if (fstat(fileno(stdin), &istat) != 0) {
+ error("fstat(stdin)");
+ }
+# ifdef NO_PIPE_TIMESTAMP
+ if (S_ISREG(istat.st_mode))
+# endif
+ time_stamp = istat.st_mtime;
+#endif /* NO_STDIN_FSTAT */
+ }
+ ifile_size = -1L; /* convention for unknown size */
+
+ clear_bufs(); /* clear input and output buffers */
+ to_stdout = 1;
+ part_nb = 0;
+
+ if (decompress) {
+ method = get_method(ifd);
+ if (method < 0) {
+ do_exit(exit_code); /* error message already emitted */
+ }
+ }
+ if (list) {
+ do_list(ifd, method);
+ return;
+ }
+
+ /* Actually do the compression/decompression. Loop over zipped members.
+ */
+ for (;;) {
+ if ((*work)(fileno(stdin), fileno(stdout)) != OK) return;
+
+ if (!decompress || last_member || inptr == insize) break;
+ /* end of file */
+
+ method = get_method(ifd);
+ if (method < 0) return; /* error message already emitted */
+ bytes_out = 0; /* required for length check */
+ }
+
+ if (verbose) {
+ if (test) {
+ fprintf(stderr, " OK\n");
+
+ } else if (!decompress) {
+ display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
+ fprintf(stderr, "\n");
+#ifdef DISPLAY_STDIN_RATIO
+ } else {
+ display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
+ fprintf(stderr, "\n");
+#endif
+ }
+ }
+}
+
+/* ========================================================================
+ * Compress or decompress the given file
+ */
+local void treat_file(iname)
+ char *iname;
+{
+ /* Accept "-" as synonym for stdin */
+ if (strequ(iname, "-")) {
+ int cflag = to_stdout;
+ treat_stdin();
+ to_stdout = cflag;
+ return;
+ }
+
+ /* Check if the input file is present, set ifname and istat: */
+ if (get_istat(iname, &istat) != OK) return;
+
+ /* If the input name is that of a directory, recurse or ignore: */
+ if (S_ISDIR(istat.st_mode)) {
+#ifndef NO_DIR
+ if (recursive) {
+ struct stat st;
+ st = istat;
+ treat_dir(iname);
+ /* Warning: ifname is now garbage */
+# ifndef NO_UTIME
+ reset_times (iname, &st);
+# endif
+ } else
+#endif
+ WARN((stderr,"%s: %s is a directory -- ignored\n", progname, ifname));
+ return;
+ }
+ if (!S_ISREG(istat.st_mode)) {
+ WARN((stderr,
+ "%s: %s is not a directory or a regular file - ignored\n",
+ progname, ifname));
+ return;
+ }
+ if (istat.st_nlink > 1 && !to_stdout && !force) {
+ WARN((stderr, "%s: %s has %d other link%c -- unchanged\n",
+ progname, ifname,
+ (int)istat.st_nlink - 1, istat.st_nlink > 2 ? 's' : ' '));
+ return;
+ }
+
+ ifile_size = istat.st_size;
+ time_stamp = no_time && !list ? 0 : istat.st_mtime;
+
+ /* Generate output file name. For -r and (-t or -l), skip files
+ * without a valid gzip suffix (check done in make_ofname).
+ */
+ if (to_stdout && !list && !test) {
+ strcpy(ofname, "stdout");
+
+ } else if (make_ofname() != OK) {
+ return;
+ }
+
+ /* Open the input file and determine compression method. The mode
+ * parameter is ignored but required by some systems (VMS) and forbidden
+ * on other systems (MacOS).
+ */
+ ifd = OPEN(ifname, ascii && !decompress ? O_RDONLY : O_RDONLY | O_BINARY,
+ RW_USER);
+ if (ifd == -1) {
+ fprintf(stderr, "%s: ", progname);
+ perror(ifname);
+ exit_code = ERROR;
+ return;
+ }
+ clear_bufs(); /* clear input and output buffers */
+ part_nb = 0;
+
+ if (decompress) {
+ method = get_method(ifd); /* updates ofname if original given */
+ if (method < 0) {
+ close(ifd);
+ return; /* error message already emitted */
+ }
+ }
+ if (list) {
+ do_list(ifd, method);
+ close(ifd);
+ return;
+ }
+
+ /* If compressing to a file, check if ofname is not ambiguous
+ * because the operating system truncates names. Otherwise, generate
+ * a new ofname and save the original name in the compressed file.
+ */
+ if (to_stdout) {
+ ofd = fileno(stdout);
+ /* keep remove_ofname as zero */
+ } else {
+ if (create_outfile() != OK) return;
+
+ if (!decompress && save_orig_name && !verbose && !quiet) {
+ fprintf(stderr, "%s: %s compressed to %s\n",
+ progname, ifname, ofname);
+ }
+ }
+ /* Keep the name even if not truncated except with --no-name: */
+ if (!save_orig_name) save_orig_name = !no_name;
+
+ if (verbose) {
+ fprintf(stderr, "%s:\t%s", ifname, (int)strlen(ifname) >= 15 ?
+ "" : ((int)strlen(ifname) >= 7 ? "\t" : "\t\t"));
+ }
+
+ /* Actually do the compression/decompression. Loop over zipped members.
+ */
+ for (;;) {
+ if ((*work)(ifd, ofd) != OK) {
+ method = -1; /* force cleanup */
+ break;
+ }
+ if (!decompress || last_member || inptr == insize) break;
+ /* end of file */
+
+ method = get_method(ifd);
+ if (method < 0) break; /* error message already emitted */
+ bytes_out = 0; /* required for length check */
+ }
+
+ close(ifd);
+ if (!to_stdout && close(ofd)) {
+ write_error();
+ }
+ if (method == -1) {
+ if (!to_stdout) unlink (ofname);
+ return;
+ }
+ /* Display statistics */
+ if(verbose) {
+ if (test) {
+ fprintf(stderr, " OK");
+ } else if (decompress) {
+ display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
+ } else {
+ display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
+ }
+ if (!test && !to_stdout) {
+ fprintf(stderr, " -- replaced with %s", ofname);
+ }
+ fprintf(stderr, "\n");
+ }
+ /* Copy modes, times, ownership, and remove the input file */
+ if (!to_stdout) {
+ copy_stat(&istat);
+ }
+}
+
+/* ========================================================================
+ * Create the output file. Return OK or ERROR.
+ * Try several times if necessary to avoid truncating the z_suffix. For
+ * example, do not create a compressed file of name "1234567890123."
+ * Sets save_orig_name to true if the file name has been truncated.
+ * IN assertions: the input file has already been open (ifd is set) and
+ * ofname has already been updated if there was an original name.
+ * OUT assertions: ifd and ofd are closed in case of error.
+ */
+local int create_outfile()
+{
+ struct stat ostat; /* stat for ofname */
+ int flags = O_WRONLY | O_CREAT | O_EXCL | O_BINARY;
+
+ if (ascii && decompress) {
+ flags &= ~O_BINARY; /* force ascii text mode */
+ }
+ for (;;) {
+ /* Make sure that ofname is not an existing file */
+ if (check_ofname() != OK) {
+ close(ifd);
+ return ERROR;
+ }
+ /* Create the output file */
+ remove_ofname = 1;
+ ofd = OPEN(ofname, flags, RW_USER);
+ if (ofd == -1) {
+ perror(ofname);
+ close(ifd);
+ exit_code = ERROR;
+ return ERROR;
+ }
+
+ /* Check for name truncation on new file (1234567890123.gz) */
+#ifdef NO_FSTAT
+ if (stat(ofname, &ostat) != 0) {
+#else
+ if (fstat(ofd, &ostat) != 0) {
+#endif
+ fprintf(stderr, "%s: ", progname);
+ perror(ofname);
+ close(ifd); close(ofd);
+ unlink(ofname);
+ exit_code = ERROR;
+ return ERROR;
+ }
+ if (!name_too_long(ofname, &ostat)) return OK;
+
+ if (decompress) {
+ /* name might be too long if an original name was saved */
+ WARN((stderr, "%s: %s: warning, name truncated\n",
+ progname, ofname));
+ return OK;
+ }
+ close(ofd);
+ unlink(ofname);
+#ifdef NO_MULTIPLE_DOTS
+ /* Should never happen, see check_ofname() */
+ fprintf(stderr, "%s: %s: name too long\n", progname, ofname);
+ do_exit(ERROR);
+#endif
+ shorten_name(ofname);
+ }
+}
+
+/* ========================================================================
+ * Use lstat if available, except for -c or -f. Use stat otherwise.
+ * This allows links when not removing the original file.
+ */
+local int do_stat(name, sbuf)
+ char *name;
+ struct stat *sbuf;
+{
+ errno = 0;
+#if (defined(S_IFLNK) || defined (S_ISLNK)) && !defined(NO_SYMLINK)
+ if (!to_stdout && !force) {
+ return lstat(name, sbuf);
+ }
+#endif
+ return stat(name, sbuf);
+}
+
+/* ========================================================================
+ * Return a pointer to the 'z' suffix of a file name, or NULL. For all
+ * systems, ".gz", ".z", ".Z", ".taz", ".tgz", "-gz", "-z" and "_z" are
+ * accepted suffixes, in addition to the value of the --suffix option.
+ * ".tgz" is a useful convention for tar.z files on systems limited
+ * to 3 characters extensions. On such systems, ".?z" and ".??z" are
+ * also accepted suffixes. For Unix, we do not want to accept any
+ * .??z suffix as indicating a compressed file; some people use .xyz
+ * to denote volume data.
+ * On systems allowing multiple versions of the same file (such as VMS),
+ * this function removes any version suffix in the given name.
+ */
+local char *get_suffix(name)
+ char *name;
+{
+ int nlen, slen;
+ char suffix[MAX_SUFFIX+3]; /* last chars of name, forced to lower case */
+ static char *known_suffixes[] =
+ {z_suffix, ".gz", ".z", ".taz", ".tgz", "-gz", "-z", "_z",
+#ifdef MAX_EXT_CHARS
+ "z",
+#endif
+ NULL};
+ char **suf = known_suffixes;
+
+ if (strequ(z_suffix, "z")) suf++; /* check long suffixes first */
+
+#ifdef SUFFIX_SEP
+ /* strip a version number from the file name */
+ {
+ char *v = strrchr(name, SUFFIX_SEP);
+ if (v != NULL) *v = '\0';
+ }
+#endif
+ nlen = strlen(name);
+ if (nlen <= MAX_SUFFIX+2) {
+ strcpy(suffix, name);
+ } else {
+ strcpy(suffix, name+nlen-MAX_SUFFIX-2);
+ }
+ strlwr(suffix);
+ slen = strlen(suffix);
+ do {
+ int s = strlen(*suf);
+ if (slen > s && suffix[slen-s-1] != PATH_SEP
+ && strequ(suffix + slen - s, *suf)) {
+ return name+nlen-s;
+ }
+ } while (*++suf != NULL);
+
+ return NULL;
+}
+
+
+/* ========================================================================
+ * Set ifname to the input file name (with a suffix appended if necessary)
+ * and istat to its stats. For decompression, if no file exists with the
+ * original name, try adding successively z_suffix, .gz, .z, -z and .Z.
+ * For MSDOS, we try only z_suffix and z.
+ * Return OK or ERROR.
+ */
+local int get_istat(iname, sbuf)
+ char *iname;
+ struct stat *sbuf;
+{
+ int ilen; /* strlen(ifname) */
+ static char *suffixes[] = {z_suffix, ".gz", ".z", "-z", ".Z", NULL};
+ char **suf = suffixes;
+ char *s;
+#ifdef NO_MULTIPLE_DOTS
+ char *dot; /* pointer to ifname extension, or NULL */
+#endif
+
+ strcpy(ifname, iname);
+
+ /* If input file exists, return OK. */
+ if (do_stat(ifname, sbuf) == 0) return OK;
+
+ if (!decompress || errno != ENOENT) {
+ perror(ifname);
+ exit_code = ERROR;
+ return ERROR;
+ }
+ /* file.ext doesn't exist, try adding a suffix (after removing any
+ * version number for VMS).
+ */
+ s = get_suffix(ifname);
+ if (s != NULL) {
+ perror(ifname); /* ifname already has z suffix and does not exist */
+ exit_code = ERROR;
+ return ERROR;
+ }
+#ifdef NO_MULTIPLE_DOTS
+ dot = strrchr(ifname, '.');
+ if (dot == NULL) {
+ strcat(ifname, ".");
+ dot = strrchr(ifname, '.');
+ }
+#endif
+ ilen = strlen(ifname);
+ if (strequ(z_suffix, ".gz")) suf++;
+
+ /* Search for all suffixes */
+ do {
+ s = *suf;
+#ifdef NO_MULTIPLE_DOTS
+ if (*s == '.') s++;
+#endif
+#ifdef MAX_EXT_CHARS
+ strcpy(ifname, iname);
+ /* Needed if the suffixes are not sorted by increasing length */
+
+ if (*dot == '\0') strcpy(dot, ".");
+ dot[MAX_EXT_CHARS+1-strlen(s)] = '\0';
+#endif
+ strcat(ifname, s);
+ if (do_stat(ifname, sbuf) == 0) return OK;
+ ifname[ilen] = '\0';
+ } while (*++suf != NULL);
+
+ /* No suffix found, complain using z_suffix: */
+#ifdef MAX_EXT_CHARS
+ strcpy(ifname, iname);
+ if (*dot == '\0') strcpy(dot, ".");
+ dot[MAX_EXT_CHARS+1-z_len] = '\0';
+#endif
+ strcat(ifname, z_suffix);
+ perror(ifname);
+ exit_code = ERROR;
+ return ERROR;
+}
+
+/* ========================================================================
+ * Generate ofname given ifname. Return OK, or WARNING if file must be skipped.
+ * Sets save_orig_name to true if the file name has been truncated.
+ */
+local int make_ofname()
+{
+ char *suff; /* ofname z suffix */
+
+ strcpy(ofname, ifname);
+ /* strip a version number if any and get the gzip suffix if present: */
+ suff = get_suffix(ofname);
+
+ if (decompress) {
+ if (suff == NULL) {
+ /* Whith -t or -l, try all files (even without .gz suffix)
+ * except with -r (behave as with just -dr).
+ */
+ if (!recursive && (list || test)) return OK;
+
+ /* Avoid annoying messages with -r */
+ if (verbose || (!recursive && !quiet)) {
+ WARN((stderr,"%s: %s: unknown suffix -- ignored\n",
+ progname, ifname));
+ }
+ return WARNING;
+ }
+ /* Make a special case for .tgz and .taz: */
+ strlwr(suff);
+ if (strequ(suff, ".tgz") || strequ(suff, ".taz")) {
+ strcpy(suff, ".tar");
+ } else {
+ *suff = '\0'; /* strip the z suffix */
+ }
+ /* ofname might be changed later if infile contains an original name */
+
+ } else if (suff != NULL) {
+ /* Avoid annoying messages with -r (see treat_dir()) */
+ if (verbose || (!recursive && !quiet)) {
+ fprintf(stderr, "%s: %s already has %s suffix -- unchanged\n",
+ progname, ifname, suff);
+ }
+ if (exit_code == OK) exit_code = WARNING;
+ return WARNING;
+ } else {
+ save_orig_name = 0;
+
+#ifdef NO_MULTIPLE_DOTS
+ suff = strrchr(ofname, '.');
+ if (suff == NULL) {
+ strcat(ofname, ".");
+# ifdef MAX_EXT_CHARS
+ if (strequ(z_suffix, "z")) {
+ strcat(ofname, "gz"); /* enough room */
+ return OK;
+ }
+ /* On the Atari and some versions of MSDOS, name_too_long()
+ * does not work correctly because of a bug in stat(). So we
+ * must truncate here.
+ */
+ } else if (strlen(suff)-1 + z_len > MAX_SUFFIX) {
+ suff[MAX_SUFFIX+1-z_len] = '\0';
+ save_orig_name = 1;
+# endif
+ }
+#endif /* NO_MULTIPLE_DOTS */
+ strcat(ofname, z_suffix);
+
+ } /* decompress ? */
+ return OK;
+}
+
+
+/* ========================================================================
+ * Check the magic number of the input file and update ofname if an
+ * original name was given and to_stdout is not set.
+ * Return the compression method, -1 for error, -2 for warning.
+ * Set inptr to the offset of the next byte to be processed.
+ * Updates time_stamp if there is one and --no-time is not used.
+ * This function may be called repeatedly for an input file consisting
+ * of several contiguous gzip'ed members.
+ * IN assertions: there is at least one remaining compressed member.
+ * If the member is a zip file, it must be the only one.
+ */
+local int get_method(in)
+ int in; /* input file descriptor */
+{
+ uch flags; /* compression flags */
+ char magic[2]; /* magic header */
+ ulg stamp; /* time stamp */
+
+ /* If --force and --stdout, zcat == cat, so do not complain about
+ * premature end of file: use try_byte instead of get_byte.
+ */
+ if (force && to_stdout) {
+ magic[0] = (char)try_byte();
+ magic[1] = (char)try_byte();
+ /* If try_byte returned EOF, magic[1] == 0xff */
+ } else {
+ magic[0] = (char)get_byte();
+ magic[1] = (char)get_byte();
+ }
+ method = -1; /* unknown yet */
+ part_nb++; /* number of parts in gzip file */
+ header_bytes = 0;
+ last_member = RECORD_IO;
+ /* assume multiple members in gzip file except for record oriented I/O */
+
+ if (memcmp(magic, GZIP_MAGIC, 2) == 0
+ || memcmp(magic, OLD_GZIP_MAGIC, 2) == 0) {
+
+ method = (int)get_byte();
+ if (method != DEFLATED) {
+ fprintf(stderr,
+ "%s: %s: unknown method %d -- get newer version of gzip\n",
+ progname, ifname, method);
+ exit_code = ERROR;
+ return -1;
+ }
+ work = unzip;
+ flags = (uch)get_byte();
+
+ if ((flags & ENCRYPTED) != 0) {
+ fprintf(stderr,
+ "%s: %s is encrypted -- get newer version of gzip\n",
+ progname, ifname);
+ exit_code = ERROR;
+ return -1;
+ }
+ if ((flags & CONTINUATION) != 0) {
+ fprintf(stderr,
+ "%s: %s is a a multi-part gzip file -- get newer version of gzip\n",
+ progname, ifname);
+ exit_code = ERROR;
+ if (force <= 1) return -1;
+ }
+ if ((flags & RESERVED) != 0) {
+ fprintf(stderr,
+ "%s: %s has flags 0x%x -- get newer version of gzip\n",
+ progname, ifname, flags);
+ exit_code = ERROR;
+ if (force <= 1) return -1;
+ }
+ stamp = (ulg)get_byte();
+ stamp |= ((ulg)get_byte()) << 8;
+ stamp |= ((ulg)get_byte()) << 16;
+ stamp |= ((ulg)get_byte()) << 24;
+ if (stamp != 0 && !no_time) time_stamp = stamp;
+
+ (void)get_byte(); /* Ignore extra flags for the moment */
+ (void)get_byte(); /* Ignore OS type for the moment */
+
+ if ((flags & CONTINUATION) != 0) {
+ unsigned part = (unsigned)get_byte();
+ part |= ((unsigned)get_byte())<<8;
+ if (verbose) {
+ fprintf(stderr,"%s: %s: part number %u\n",
+ progname, ifname, part);
+ }
+ }
+ if ((flags & EXTRA_FIELD) != 0) {
+ unsigned len = (unsigned)get_byte();
+ len |= ((unsigned)get_byte())<<8;
+ if (verbose) {
+ fprintf(stderr,"%s: %s: extra field of %u bytes ignored\n",
+ progname, ifname, len);
+ }
+ while (len--) (void)get_byte();
+ }
+
+ /* Get original file name if it was truncated */
+ if ((flags & ORIG_NAME) != 0) {
+ if (no_name || (to_stdout && !list) || part_nb > 1) {
+ /* Discard the old name */
+ char c; /* dummy used for NeXTstep 3.0 cc optimizer bug */
+ do {c=get_byte();} while (c != 0);
+ } else {
+ /* Copy the base name. Keep a directory prefix intact. */
+ char *p = basename(ofname);
+ char *base = p;
+ for (;;) {
+ *p = (char)get_char();
+ if (*p++ == '\0') break;
+ if (p >= ofname+sizeof(ofname)) {
+ error("corrupted input -- file name too large");
+ }
+ }
+ /* If necessary, adapt the name to local OS conventions: */
+ if (!list) {
+ MAKE_LEGAL_NAME(base);
+ if (base) list=0; /* avoid warning about unused variable */
+ }
+ } /* no_name || to_stdout */
+ } /* ORIG_NAME */
+
+ /* Discard file comment if any */
+ if ((flags & COMMENT) != 0) {
+ while (get_char() != 0) /* null */ ;
+ }
+ if (part_nb == 1) {
+ header_bytes = inptr + 2*sizeof(long); /* include crc and size */
+ }
+
+ } else if (memcmp(magic, PKZIP_MAGIC, 2) == 0 && inptr == 2
+ && memcmp((char*)inbuf, PKZIP_MAGIC, 4) == 0) {
+ /* To simplify the code, we support a zip file when alone only.
+ * We are thus guaranteed that the entire local header fits in inbuf.
+ */
+ inptr = 0;
+ work = unzip;
+ if (check_zipfile(in) != OK) return -1;
+ /* check_zipfile may get ofname from the local header */
+ last_member = 1;
+
+ } else if (memcmp(magic, PACK_MAGIC, 2) == 0) {
+ work = unpack;
+ method = PACKED;
+
+ } else if (memcmp(magic, LZW_MAGIC, 2) == 0) {
+ work = unlzw;
+ method = COMPRESSED;
+ last_member = 1;
+
+ } else if (memcmp(magic, LZH_MAGIC, 2) == 0) {
+ work = unlzh;
+ method = LZHED;
+ last_member = 1;
+
+ } else if (force && to_stdout && !list) { /* pass input unchanged */
+ method = STORED;
+ work = copy;
+ inptr = 0;
+ last_member = 1;
+ }
+ if (method >= 0) return method;
+
+ if (part_nb == 1) {
+ fprintf(stderr, "\n%s: %s: not in gzip format\n", progname, ifname);
+ exit_code = ERROR;
+ return -1;
+ } else {
+ WARN((stderr, "\n%s: %s: decompression OK, trailing garbage ignored\n",
+ progname, ifname));
+ return -2;
+ }
+}
+
+/* ========================================================================
+ * Display the characteristics of the compressed file.
+ * If the given method is < 0, display the accumulated totals.
+ * IN assertions: time_stamp, header_bytes and ifile_size are initialized.
+ */
+local void do_list(ifd, method)
+ int ifd; /* input file descriptor */
+ int method; /* compression method */
+{
+ ulg crc; /* original crc */
+ static int first_time = 1;
+ static char* methods[MAX_METHODS] = {
+ "store", /* 0 */
+ "compr", /* 1 */
+ "pack ", /* 2 */
+ "lzh ", /* 3 */
+ "", "", "", "", /* 4 to 7 reserved */
+ "defla"}; /* 8 */
+ char *date;
+
+ if (first_time && method >= 0) {
+ first_time = 0;
+ if (verbose) {
+ printf("method crc date time ");
+ }
+ if (!quiet) {
+ printf("compressed uncompr. ratio uncompressed_name\n");
+ }
+ } else if (method < 0) {
+ if (total_in <= 0 || total_out <= 0) return;
+ if (verbose) {
+ printf(" %9lu %9lu ",
+ total_in, total_out);
+ } else if (!quiet) {
+ printf("%9ld %9ld ", total_in, total_out);
+ }
+ display_ratio(total_out-(total_in-header_bytes), total_out, stdout);
+ /* header_bytes is not meaningful but used to ensure the same
+ * ratio if there is a single file.
+ */
+ printf(" (totals)\n");
+ return;
+ }
+ crc = (ulg)~0; /* unknown */
+ bytes_out = -1L;
+ bytes_in = ifile_size;
+
+#if RECORD_IO == 0
+ if (method == DEFLATED && !last_member) {
+ /* Get the crc and uncompressed size for gzip'ed (not zip'ed) files.
+ * If the lseek fails, we could use read() to get to the end, but
+ * --list is used to get quick results.
+ * Use "gunzip < foo.gz | wc -c" to get the uncompressed size if
+ * you are not concerned about speed.
+ */
+ bytes_in = (long)lseek(ifd, (off_t)(-8), SEEK_END);
+ if (bytes_in != -1L) {
+ uch buf[8];
+ bytes_in += 8L;
+ if (read(ifd, (char*)buf, sizeof(buf)) != sizeof(buf)) {
+ read_error();
+ }
+ crc = LG(buf);
+ bytes_out = LG(buf+4);
+ }
+ }
+#endif /* RECORD_IO */
+ date = ctime((time_t*)&time_stamp) + 4; /* skip the day of the week */
+ date[12] = '\0'; /* suppress the 1/100sec and the year */
+ if (verbose) {
+ printf("%5s %08lx %11s ", methods[method], crc, date);
+ }
+ printf("%9ld %9ld ", bytes_in, bytes_out);
+ if (bytes_in == -1L) {
+ total_in = -1L;
+ bytes_in = bytes_out = header_bytes = 0;
+ } else if (total_in >= 0) {
+ total_in += bytes_in;
+ }
+ if (bytes_out == -1L) {
+ total_out = -1L;
+ bytes_in = bytes_out = header_bytes = 0;
+ } else if (total_out >= 0) {
+ total_out += bytes_out;
+ }
+ display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out, stdout);
+ printf(" %s\n", ofname);
+}
+
+/* ========================================================================
+ * Return true if the two stat structures correspond to the same file.
+ */
+local int same_file(stat1, stat2)
+ struct stat *stat1;
+ struct stat *stat2;
+{
+ return stat1->st_ino == stat2->st_ino
+ && stat1->st_dev == stat2->st_dev
+#ifdef NO_ST_INO
+ /* Can't rely on st_ino and st_dev, use other fields: */
+ && stat1->st_mode == stat2->st_mode
+ && stat1->st_uid == stat2->st_uid
+ && stat1->st_gid == stat2->st_gid
+ && stat1->st_size == stat2->st_size
+ && stat1->st_atime == stat2->st_atime
+ && stat1->st_mtime == stat2->st_mtime
+ && stat1->st_ctime == stat2->st_ctime
+#endif
+ ;
+}
+
+/* ========================================================================
+ * Return true if a file name is ambiguous because the operating system
+ * truncates file names.
+ */
+local int name_too_long(name, statb)
+ char *name; /* file name to check */
+ struct stat *statb; /* stat buf for this file name */
+{
+ int s = strlen(name);
+ char c = name[s-1];
+ struct stat tstat; /* stat for truncated name */
+ int res;
+
+ tstat = *statb; /* Just in case OS does not fill all fields */
+ name[s-1] = '\0';
+ res = stat(name, &tstat) == 0 && same_file(statb, &tstat);
+ name[s-1] = c;
+ Trace((stderr, " too_long(%s) => %d\n", name, res));
+ return res;
+}
+
+/* ========================================================================
+ * Shorten the given name by one character, or replace a .tar extension
+ * with .tgz. Truncate the last part of the name which is longer than
+ * MIN_PART characters: 1234.678.012.gz -> 123.678.012.gz. If the name
+ * has only parts shorter than MIN_PART truncate the longest part.
+ * For decompression, just remove the last character of the name.
+ *
+ * IN assertion: for compression, the suffix of the given name is z_suffix.
+ */
+local void shorten_name(name)
+ char *name;
+{
+ int len; /* length of name without z_suffix */
+ char *trunc = NULL; /* character to be truncated */
+ int plen; /* current part length */
+ int min_part = MIN_PART; /* current minimum part length */
+ char *p;
+
+ len = strlen(name);
+ if (decompress) {
+ if (len <= 1) error("name too short");
+ name[len-1] = '\0';
+ return;
+ }
+ p = get_suffix(name);
+ if (p == NULL) error("can't recover suffix\n");
+ *p = '\0';
+ save_orig_name = 1;
+
+ /* compress 1234567890.tar to 1234567890.tgz */
+ if (len > 4 && strequ(p-4, ".tar")) {
+ strcpy(p-4, ".tgz");
+ return;
+ }
+ /* Try keeping short extensions intact:
+ * 1234.678.012.gz -> 123.678.012.gz
+ */
+ do {
+ p = strrchr(name, PATH_SEP);
+ p = p ? p+1 : name;
+ while (*p) {
+ plen = strcspn(p, PART_SEP);
+ p += plen;
+ if (plen > min_part) trunc = p-1;
+ if (*p) p++;
+ }
+ } while (trunc == NULL && --min_part != 0);
+
+ if (trunc != NULL) {
+ do {
+ trunc[0] = trunc[1];
+ } while (*trunc++);
+ trunc--;
+ } else {
+ trunc = strrchr(name, PART_SEP[0]);
+ if (trunc == NULL) error("internal error in shorten_name");
+ if (trunc[1] == '\0') trunc--; /* force truncation */
+ }
+ strcpy(trunc, z_suffix);
+}
+
+/* ========================================================================
+ * If compressing to a file, check if ofname is not ambiguous
+ * because the operating system truncates names. Otherwise, generate
+ * a new ofname and save the original name in the compressed file.
+ * If the compressed file already exists, ask for confirmation.
+ * The check for name truncation is made dynamically, because different
+ * file systems on the same OS might use different truncation rules (on SVR4
+ * s5 truncates to 14 chars and ufs does not truncate).
+ * This function returns -1 if the file must be skipped, and
+ * updates save_orig_name if necessary.
+ * IN assertions: save_orig_name is already set if ofname has been
+ * already truncated because of NO_MULTIPLE_DOTS. The input file has
+ * already been open and istat is set.
+ */
+local int check_ofname()
+{
+ struct stat ostat; /* stat for ofname */
+
+#ifdef ENAMETOOLONG
+ /* Check for strictly conforming Posix systems (which return ENAMETOOLONG
+ * instead of silently truncating filenames).
+ */
+ errno = 0;
+ while (stat(ofname, &ostat) != 0) {
+ if (errno != ENAMETOOLONG) return 0; /* ofname does not exist */
+ shorten_name(ofname);
+ }
+#else
+ if (stat(ofname, &ostat) != 0) return 0;
+#endif
+ /* Check for name truncation on existing file. Do this even on systems
+ * defining ENAMETOOLONG, because on most systems the strict Posix
+ * behavior is disabled by default (silent name truncation allowed).
+ */
+ if (!decompress && name_too_long(ofname, &ostat)) {
+ shorten_name(ofname);
+ if (stat(ofname, &ostat) != 0) return 0;
+ }
+
+ /* Check that the input and output files are different (could be
+ * the same by name truncation or links).
+ */
+ if (same_file(&istat, &ostat)) {
+ if (strequ(ifname, ofname)) {
+ fprintf(stderr, "%s: %s: cannot %scompress onto itself\n",
+ progname, ifname, decompress ? "de" : "");
+ } else {
+ fprintf(stderr, "%s: %s and %s are the same file\n",
+ progname, ifname, ofname);
+ }
+ exit_code = ERROR;
+ return ERROR;
+ }
+ /* Ask permission to overwrite the existing file */
+ if (!force) {
+ char response[80];
+ strcpy(response,"n");
+ fprintf(stderr, "%s: %s already exists;", progname, ofname);
+ if (foreground && isatty(fileno(stdin))) {
+ fprintf(stderr, " do you wish to overwrite (y or n)? ");
+ fflush(stderr);
+ (void)fgets(response, sizeof(response)-1, stdin);
+ }
+ if (tolow(*response) != 'y') {
+ fprintf(stderr, "\tnot overwritten\n");
+ if (exit_code == OK) exit_code = WARNING;
+ return ERROR;
+ }
+ }
+ (void) chmod(ofname, 0777);
+ if (unlink(ofname)) {
+ fprintf(stderr, "%s: ", progname);
+ perror(ofname);
+ exit_code = ERROR;
+ return ERROR;
+ }
+ return OK;
+}
+
+
+#ifndef NO_UTIME
+/* ========================================================================
+ * Set the access and modification times from the given stat buffer.
+ */
+local void reset_times (name, statb)
+ char *name;
+ struct stat *statb;
+{
+ struct utimbuf timep;
+
+ /* Copy the time stamp */
+ timep.actime = statb->st_atime;
+ timep.modtime = statb->st_mtime;
+
+ /* Some systems (at least OS/2) do not support utime on directories */
+ if (utime(name, &timep) && !S_ISDIR(statb->st_mode)) {
+ WARN((stderr, "%s: ", progname));
+ if (!quiet) perror(ofname);
+ }
+}
+#endif
+
+
+/* ========================================================================
+ * Copy modes, times, ownership from input file to output file.
+ * IN assertion: to_stdout is false.
+ */
+local void copy_stat(ifstat)
+ struct stat *ifstat;
+{
+#ifndef NO_UTIME
+ if (decompress && time_stamp != 0 && ifstat->st_mtime != time_stamp) {
+ ifstat->st_mtime = time_stamp;
+ if (verbose > 1) {
+ fprintf(stderr, "%s: time stamp restored\n", ofname);
+ }
+ }
+ reset_times(ofname, ifstat);
+#endif
+ /* Copy the protection modes */
+ if (chmod(ofname, ifstat->st_mode & 07777)) {
+ WARN((stderr, "%s: ", progname));
+ if (!quiet) perror(ofname);
+ }
+#ifndef NO_CHOWN
+ chown(ofname, ifstat->st_uid, ifstat->st_gid); /* Copy ownership */
+#endif
+ remove_ofname = 0;
+ /* It's now safe to remove the input file: */
+ (void) chmod(ifname, 0777);
+ if (unlink(ifname)) {
+ WARN((stderr, "%s: ", progname));
+ if (!quiet) perror(ifname);
+ }
+}
+
+#ifndef NO_DIR
+
+/* ========================================================================
+ * Recurse through the given directory. This code is taken from ncompress.
+ */
+local void treat_dir(dir)
+ char *dir;
+{
+ dir_type *dp;
+ DIR *dirp;
+ char nbuf[MAX_PATH_LEN];
+ int len;
+
+ dirp = opendir(dir);
+
+ if (dirp == NULL) {
+ fprintf(stderr, "%s: %s unreadable\n", progname, dir);
+ exit_code = ERROR;
+ return ;
+ }
+ /*
+ ** WARNING: the following algorithm could occasionally cause
+ ** compress to produce error warnings of the form "<filename>.gz
+ ** already has .gz suffix - ignored". This occurs when the
+ ** .gz output file is inserted into the directory below
+ ** readdir's current pointer.
+ ** These warnings are harmless but annoying, so they are suppressed
+ ** with option -r (except when -v is on). An alternative
+ ** to allowing this would be to store the entire directory
+ ** list in memory, then compress the entries in the stored
+ ** list. Given the depth-first recursive algorithm used here,
+ ** this could use up a tremendous amount of memory. I don't
+ ** think it's worth it. -- Dave Mack
+ ** (An other alternative might be two passes to avoid depth-first.)
+ */
+
+ while ((dp = readdir(dirp)) != NULL) {
+
+ if (strequ(dp->d_name,".") || strequ(dp->d_name,"..")) {
+ continue;
+ }
+ len = strlen(dir);
+ if (len + NLENGTH(dp) + 1 < MAX_PATH_LEN - 1) {
+ strcpy(nbuf,dir);
+ if (len != 0 /* dir = "" means current dir on Amiga */
+#ifdef PATH_SEP2
+ && dir[len-1] != PATH_SEP2
+#endif
+#ifdef PATH_SEP3
+ && dir[len-1] != PATH_SEP3
+#endif
+ ) {
+ nbuf[len++] = PATH_SEP;
+ }
+ strcpy(nbuf+len, dp->d_name);
+ treat_file(nbuf);
+ } else {
+ fprintf(stderr,"%s: %s/%s: pathname too long\n",
+ progname, dir, dp->d_name);
+ exit_code = ERROR;
+ }
+ }
+ closedir(dirp);
+}
+#endif /* ? NO_DIR */
+
+/* ========================================================================
+ * Free all dynamically allocated variables and exit with the given code.
+ */
+local void do_exit(exitcode)
+ int exitcode;
+{
+ static int in_exit = 0;
+
+ if (in_exit) exit(exitcode);
+ in_exit = 1;
+ if (env != NULL) free(env), env = NULL;
+ if (args != NULL) free((char*)args), args = NULL;
+ FREE(inbuf);
+ FREE(outbuf);
+ FREE(d_buf);
+ FREE(window);
+#ifndef MAXSEG_64K
+ FREE(tab_prefix);
+#else
+ FREE(tab_prefix0);
+ FREE(tab_prefix1);
+#endif
+ exit(exitcode);
+}
+
+/* ========================================================================
+ * Signal and error handler.
+ */
+RETSIGTYPE abort_gzip()
+{
+ if (remove_ofname) {
+ close(ofd);
+ unlink (ofname);
+ }
+ do_exit(ERROR);
+}
diff --git a/Build/source/utils/gzip/gzip.doc b/Build/source/utils/gzip/gzip.doc
new file mode 100644
index 00000000000..5b2238b6831
--- /dev/null
+++ b/Build/source/utils/gzip/gzip.doc
@@ -0,0 +1,350 @@
+
+GZIP(1) USER COMMANDS GZIP(1)
+
+NAME
+ gzip, gunzip, zcat - compress or expand files
+
+SYNOPSIS
+ gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ]
+ gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ... ]
+ zcat [ -fhLV ] [ name ... ]
+
+DESCRIPTION
+ Gzip reduces the size of the named files using Lempel-Ziv
+ coding (LZ77). Whenever possible, each file is replaced by
+ one with the extension .gz, while keeping the same ownership
+ modes, access and modification times. (The default exten-
+ sion is -gz for VMS, z for MSDOS, OS/2 FAT, Windows NT FAT
+ and Atari.) If no files are specified, or if a file name is
+ "-", the standard input is compressed to the standard out-
+ put. Gzip will only attempt to compress regular files. In
+ particular, it will ignore symbolic links.
+
+ If the compressed file name is too long for its file system,
+ gzip truncates it. Gzip attempts to truncate only the parts
+ of the file name longer than 3 characters. (A part is del-
+ imited by dots.) If the name consists of small parts only,
+ the longest parts are truncated. For example, if file names
+ are limited to 14 characters, gzip.msdos.exe is compressed
+ to gzi.msd.exe.gz. Names are not truncated on systems which
+ do not have a limit on file name length.
+
+ By default, gzip keeps the original file name and timestamp
+ in the compressed file. These are used when decompressing
+ the file with the -N option. This is useful when the
+ compressed file name was truncated or when the time stamp
+ was not preserved after a file transfer.
+
+ Compressed files can be restored to their original form
+ using gzip -d or gunzip or zcat. If the original name saved
+ in the compressed file is not suitable for its file system,
+ a new name is constructed from the original one to make it
+ legal.
+
+ gunzip takes a list of files on its command line and
+ replaces each file whose name ends with .gz, -gz, .z, -z, _z
+ or .Z and which begins with the correct magic number with an
+ uncompressed file without the original extension. gunzip
+ also recognizes the special extensions .tgz and .taz as
+ shorthands for .tar.gz and .tar.Z respectively. When
+ compressing, gzip uses the .tgz extension if necessary
+ instead of truncating a file with a .tar extension.
+
+ gunzip can currently decompress files created by gzip, zip,
+ compress, compress -H or pack. The detection of the input
+ format is automatic. When using the first two formats,
+ gunzip checks a 32 bit CRC. For pack, gunzip checks the
+ uncompressed length. The standard compress format was not
+ designed to allow consistency checks. However gunzip is
+ sometimes able to detect a bad .Z file. If you get an error
+ when uncompressing a .Z file, do not assume that the .Z file
+ is correct simply because the standard uncompress does not
+ complain. This generally means that the standard uncompress
+ does not check its input, and happily generates garbage out-
+ put. The SCO compress -H format (lzh compression method)
+ does not include a CRC but also allows some consistency
+ checks.
+
+ Files created by zip can be uncompressed by gzip only if
+ they have a single member compressed with the 'deflation'
+ method. This feature is only intended to help conversion of
+ tar.zip files to the tar.gz format. To extract zip files
+ with several members, use unzip instead of gunzip.
+
+ zcat is identical to gunzip -c. (On some systems, zcat may
+ be installed as gzcat to preserve the original link to
+ compress.) zcat uncompresses either a list of files on the
+ command line or its standard input and writes the
+ uncompressed data on standard output. zcat will uncompress
+ files that have the correct magic number whether they have a
+ .gz suffix or not.
+
+ Gzip uses the Lempel-Ziv algorithm used in zip and PKZIP.
+ The amount of compression obtained depends on the size of
+ the input and the distribution of common substrings. Typi-
+ cally, text such as source code or English is reduced by
+ 60-70%. Compression is generally much better than that
+ achieved by LZW (as used in compress), Huffman coding (as
+ used in pack), or adaptive Huffman coding (compact).
+
+ Compression is always performed, even if the compressed file
+ is slightly larger than the original. The worst case expan-
+ sion is a few bytes for the gzip file header, plus 5 bytes
+ every 32K block, or an expansion ratio of 0.015% for large
+ files. Note that the actual number of used disk blocks
+ almost never increases. gzip preserves the mode, ownership
+ and timestamps of files when compressing or decompressing.
+
+OPTIONS
+ -a --ascii
+ Ascii text mode: convert end-of-lines using local con-
+ ventions. This option is supported only on some non-
+ Unix systems. For MSDOS, CR LF is converted to LF when
+ compressing, and LF is converted to CR LF when
+ decompressing.
+
+ -c --stdout --to-stdout
+ Write output on standard output; keep original files
+ unchanged. If there are several input files, the out-
+ put consists of a sequence of independently compressed
+ members. To obtain better compression, concatenate all
+ input files before compressing them.
+
+ -d --decompress --uncompress
+ Decompress.
+
+ -f --force
+ Force compression or decompression even if the file has
+ multiple links or the corresponding file already
+ exists, or if the compressed data is read from or writ-
+ ten to a terminal. If the input data is not in a format
+ recognized by gzip, and if the option --stdout is also
+ given, copy the input data without change to the stan-
+ dard ouput: let zcat behave as cat. If -f is not given,
+ and when not running in the background, gzip prompts to
+ verify whether an existing file should be overwritten.
+
+ -h --help
+ Display a help screen and quit.
+
+ -l --list
+ For each compressed file, list the following fields:
+
+ compressed size: size of the compressed file
+ uncompressed size: size of the uncompressed file
+ ratio: compression ratio (0.0% if unknown)
+ uncompressed_name: name of the uncompressed file
+
+ The uncompressed size is given as -1 for files not in
+ gzip format, such as compressed .Z files. To get the
+ uncompressed size for such a file, you can use:
+
+ zcat file.Z | wc -c
+
+ In combination with the --verbose option, the following
+ fields are also displayed:
+
+ method: compression method
+ crc: the 32-bit CRC of the uncompressed data
+ date & time: time stamp for the uncompressed file
+
+ The compression methods currently supported are
+ deflate, compress, lzh (SCO compress -H) and pack. The
+ crc is given as ffffffff for a file not in gzip format.
+
+ With --name, the uncompressed name, date and time are
+ those stored within the compress file if present.
+
+ With --verbose, the size totals and compression ratio
+ for all files is also displayed, unless some sizes are
+ unknown. With --quiet, the title and totals lines are
+ not displayed.
+
+ -L --license
+ Display the gzip license and quit.
+
+ -n --no-name
+ When compressing, do not save the original file name
+ and time stamp by default. (The original name is always
+ saved if the name had to be truncated.) When
+ decompressing, do not restore the original file name if
+ present (remove only the gzip suffix from the
+ compressed file name) and do not restore the original
+ time stamp if present (copy it from the compressed
+ file). This option is the default when decompressing.
+
+ -N --name
+ When compressing, always save the original file name
+ and time stamp; this is the default. When decompress-
+ ing, restore the original file name and time stamp if
+ present. This option is useful on systems which have a
+ limit on file name length or when the time stamp has
+ been lost after a file transfer.
+
+ -q --quiet
+ Suppress all warnings.
+
+ -r --recursive
+ Travel the directory structure recursively. If any of
+ the file names specified on the command line are direc-
+ tories, gzip will descend into the directory and
+ compress all the files it finds there (or decompress
+ them in the case of gunzip ).
+
+ -S .suf --suffix .suf
+ Use suffix .suf instead of .gz. Any suffix can be
+ given, but suffixes other than .z and .gz should be
+ avoided to avoid confusion when files are transferred
+ to other systems. A null suffix forces gunzip to try
+ decompression on all given files regardless of suffix,
+ as in:
+
+ gunzip -S "" * (*.* for MSDOS)
+
+ Previous versions of gzip used the .z suffix. This was
+ changed to avoid a conflict with pack(1).
+
+ -t --test
+ Test. Check the compressed file integrity.
+
+ -v --verbose
+ Verbose. Display the name and percentage reduction for
+ each file compressed or decompressed.
+
+ -V --version
+ Version. Display the version number and compilation
+ options then quit.
+
+ -# --fast --best
+ Regulate the speed of compression using the specified
+ digit #, where -1 or --fast indicates the fastest
+ compression method (less compression) and -9 or --best
+ indicates the slowest compression method (best compres-
+ sion). The default compression level is -6 (that is,
+ biased towards high compression at expense of speed).
+
+ADVANCED USAGE
+ Multiple compressed files can be concatenated. In this case,
+ gunzip will extract all members at once. For example:
+
+ gzip -c file1 > foo.gz
+ gzip -c file2 >> foo.gz
+
+ Then
+ gunzip -c foo
+
+ is equivalent to
+
+ cat file1 file2
+
+ In case of damage to one member of a .gz file, other members
+ can still be recovered (if the damaged member is removed).
+ However, you can get better compression by compressing all
+ members at once:
+
+ cat file1 file2 | gzip > foo.gz
+
+ compresses better than
+
+ gzip -c file1 file2 > foo.gz
+
+ If you want to recompress concatenated files to get better
+ compression, do:
+
+ gzip -cd old.gz | gzip > new.gz
+
+ If a compressed file consists of several members, the
+ uncompressed size and CRC reported by the --list option
+ applies to the last member only. If you need the
+ uncompressed size for all members, you can use:
+
+ gzip -cd file.gz | wc -c
+
+ If you wish to create a single archive file with multiple
+ members so that members can later be extracted indepen-
+ dently, use an archiver such as tar or zip. GNU tar supports
+ the -z option to invoke gzip transparently. gzip is designed
+ as a complement to tar, not as a replacement.
+
+ENVIRONMENT
+ The environment variable GZIP can hold a set of default
+ options for gzip. These options are interpreted first and
+ can be overwritten by explicit command line parameters. For
+ example:
+ for sh: GZIP="-8v --name"; export GZIP
+ for csh: setenv GZIP "-8v --name"
+ for MSDOS: set GZIP=-8v --name
+
+ On Vax/VMS, the name of the environment variable is
+ GZIP_OPT, to avoid a conflict with the symbol set for invo-
+ cation of the program.
+
+SEE ALSO
+ znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), zip(1),
+ unzip(1), compress(1), pack(1), compact(1)
+
+DIAGNOSTICS
+ Exit status is normally 0; if an error occurs, exit status
+ is 1. If a warning occurs, exit status is 2.
+
+ Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+ Invalid options were specified on the command line.
+ file: not in gzip format
+ The file specified to gunzip has not been
+ compressed.
+ file: Corrupt input. Use zcat to recover some data.
+ The compressed file has been damaged. The data up to
+ the point of failure can be recovered using
+ zcat file > recover
+ file: compressed with xx bits, can only handle yy bits
+ File was compressed (using LZW) by a program that
+ could deal with more bits than the decompress code
+ on this machine. Recompress the file with gzip,
+ which compresses better and uses less memory.
+ file: already has .gz suffix -- no change
+ The file is assumed to be already compressed.
+ Rename the file and try again.
+ file already exists; do you wish to overwrite (y or n)?
+ Respond "y" if you want the output file to be
+ replaced; "n" if not.
+ gunzip: corrupt input
+ A SIGSEGV violation was detected which usually means
+ that the input file has been corrupted.
+ xx.x%
+ Percentage of the input saved by compression.
+ (Relevant only for -v and -l.)
+ -- not a regular file or directory: ignored
+ When the input file is not a regular file or direc-
+ tory, (e.g. a symbolic link, socket, FIFO, device
+ file), it is left unaltered.
+ -- has xx other links: unchanged
+ The input file has links; it is left unchanged. See
+ ln(1) for more information. Use the -f flag to force
+ compression of multiply-linked files.
+
+CAVEATS
+ When writing compressed data to a tape, it is generally
+ necessary to pad the output with zeroes up to a block boun-
+ dary. When the data is read and the whole block is passed to
+ gunzip for decompression, gunzip detects that there is extra
+ trailing garbage after the compressed data and emits a warn-
+ ing by default. You have to use the --quiet option to
+ suppress the warning. This option can be set in the GZIP
+ environment variable as in:
+ for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
+ for csh: (setenv GZIP -q; tar -xfz --block-compr /dev/rst0
+
+ In the above example, gzip is invoked implicitly by the -z
+ option of GNU tar. Make sure that the same block size (-b
+ option of tar) is used for reading and writing compressed
+ data on tapes. (This example assumes you are using the GNU
+ version of tar.)
+
+BUGS
+ The --list option reports incorrect sizes if they exceed 2
+ gigabytes. The --list option reports sizes as -1 and crc as
+ ffffffff if the compressed file is on a non seekable media.
+
+ In some rare cases, the --best option gives worse compres-
+ sion than the default compression level (-6). On some highly
+ redundant files, compress compresses better than gzip.
diff --git a/Build/source/utils/gzip/gzip.h b/Build/source/utils/gzip/gzip.h
new file mode 100644
index 00000000000..25297ef4eb5
--- /dev/null
+++ b/Build/source/utils/gzip/gzip.h
@@ -0,0 +1,319 @@
+/* gzip.h -- common declarations for all gzip modules
+ * Copyright (C) 1992-1993 Jean-loup Gailly.
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+#if defined(__STDC__) || defined(PROTO)
+# define OF(args) args
+#else
+# define OF(args) ()
+#endif
+
+#ifdef __STDC__
+ typedef void *voidp;
+#else
+ typedef char *voidp;
+#endif
+
+/* I don't like nested includes, but the string and io functions are used
+ * too often
+ */
+#include <stdio.h>
+#if !defined(NO_STRING_H) || defined(STDC_HEADERS)
+# include <string.h>
+# if !defined(STDC_HEADERS) && !defined(NO_MEMORY_H) && !defined(__GNUC__)
+# include <memory.h>
+# endif
+# define memzero(s, n) memset ((voidp)(s), 0, (n))
+#else
+# include <strings.h>
+# define strchr index
+# define strrchr rindex
+# define memcpy(d, s, n) bcopy((s), (d), (n))
+# define memcmp(s1, s2, n) bcmp((s1), (s2), (n))
+# define memzero(s, n) bzero((s), (n))
+#endif
+
+#ifndef RETSIGTYPE
+# define RETSIGTYPE void
+#endif
+
+#define local static
+
+typedef unsigned char uch;
+typedef unsigned short ush;
+typedef unsigned long ulg;
+
+/* Return codes from gzip */
+#define OK 0
+#define ERROR 1
+#define WARNING 2
+
+/* Compression methods (see algorithm.doc) */
+#define STORED 0
+#define COMPRESSED 1
+#define PACKED 2
+#define LZHED 3
+/* methods 4 to 7 reserved */
+#define DEFLATED 8
+#define MAX_METHODS 9
+extern int method; /* compression method */
+
+/* To save memory for 16 bit systems, some arrays are overlaid between
+ * the various modules:
+ * deflate: prev+head window d_buf l_buf outbuf
+ * unlzw: tab_prefix tab_suffix stack inbuf outbuf
+ * inflate: window inbuf
+ * unpack: window inbuf prefix_len
+ * unlzh: left+right window c_table inbuf c_len
+ * For compression, input is done in window[]. For decompression, output
+ * is done in window except for unlzw.
+ */
+
+#ifndef INBUFSIZ
+# ifdef SMALL_MEM
+# define INBUFSIZ 0x2000 /* input buffer size */
+# else
+# define INBUFSIZ 0x8000 /* input buffer size */
+# endif
+#endif
+#define INBUF_EXTRA 64 /* required by unlzw() */
+
+#ifndef OUTBUFSIZ
+# ifdef SMALL_MEM
+# define OUTBUFSIZ 8192 /* output buffer size */
+# else
+# define OUTBUFSIZ 16384 /* output buffer size */
+# endif
+#endif
+#define OUTBUF_EXTRA 2048 /* required by unlzw() */
+
+#ifndef DIST_BUFSIZE
+# ifdef SMALL_MEM
+# define DIST_BUFSIZE 0x2000 /* buffer for distances, see trees.c */
+# else
+# define DIST_BUFSIZE 0x8000 /* buffer for distances, see trees.c */
+# endif
+#endif
+
+#ifdef DYN_ALLOC
+# define EXTERN(type, array) extern type * near array
+# define DECLARE(type, array, size) type * near array
+# define ALLOC(type, array, size) { \
+ array = (type*)fcalloc((size_t)(((size)+1L)/2), 2*sizeof(type)); \
+ if (array == NULL) error("insufficient memory"); \
+ }
+# define FREE(array) {if (array != NULL) fcfree(array), array=NULL;}
+#else
+# define EXTERN(type, array) extern type array[]
+# define DECLARE(type, array, size) type array[size]
+# define ALLOC(type, array, size)
+# define FREE(array)
+#endif
+
+EXTERN(uch, inbuf); /* input buffer */
+EXTERN(uch, outbuf); /* output buffer */
+EXTERN(ush, d_buf); /* buffer for distances, see trees.c */
+EXTERN(uch, window); /* Sliding window and suffix table (unlzw) */
+#define tab_suffix window
+#ifndef MAXSEG_64K
+# define tab_prefix prev /* hash link (see deflate.c) */
+# define head (prev+WSIZE) /* hash head (see deflate.c) */
+ EXTERN(ush, tab_prefix); /* prefix code (see unlzw.c) */
+#else
+# define tab_prefix0 prev
+# define head tab_prefix1
+ EXTERN(ush, tab_prefix0); /* prefix for even codes */
+ EXTERN(ush, tab_prefix1); /* prefix for odd codes */
+#endif
+
+extern unsigned insize; /* valid bytes in inbuf */
+extern unsigned inptr; /* index of next byte to be processed in inbuf */
+extern unsigned outcnt; /* bytes in output buffer */
+
+extern long bytes_in; /* number of input bytes */
+extern long bytes_out; /* number of output bytes */
+extern long header_bytes;/* number of bytes in gzip header */
+
+#define isize bytes_in
+/* for compatibility with old zip sources (to be cleaned) */
+
+extern int ifd; /* input file descriptor */
+extern int ofd; /* output file descriptor */
+extern char ifname[]; /* input file name or "stdin" */
+extern char ofname[]; /* output file name or "stdout" */
+extern char *progname; /* program name */
+
+extern long time_stamp; /* original time stamp (modification time) */
+extern long ifile_size; /* input file size, -1 for devices (debug only) */
+
+typedef int file_t; /* Do not use stdio */
+#define NO_FILE (-1) /* in memory compression */
+
+
+#define PACK_MAGIC "\037\036" /* Magic header for packed files */
+#define GZIP_MAGIC "\037\213" /* Magic header for gzip files, 1F 8B */
+#define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */
+#define LZH_MAGIC "\037\240" /* Magic header for SCO LZH Compress files*/
+#define PKZIP_MAGIC "\120\113\003\004" /* Magic header for pkzip files */
+
+/* gzip flag byte */
+#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
+#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
+#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
+#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
+#define COMMENT 0x10 /* bit 4 set: file comment present */
+#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
+#define RESERVED 0xC0 /* bit 6,7: reserved */
+
+/* internal file attribute */
+#define UNKNOWN 0xffff
+#define BINARY 0
+#define ASCII 1
+
+#ifndef WSIZE
+# define WSIZE 0x8000 /* window size--must be a power of two, and */
+#endif /* at least 32K for zip's deflate method */
+
+#define MIN_MATCH 3
+#define MAX_MATCH 258
+/* The minimum and maximum match lengths */
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST (WSIZE-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+extern int decrypt; /* flag to turn on decryption */
+extern int exit_code; /* program exit code */
+extern int verbose; /* be verbose (-v) */
+extern int quiet; /* be quiet (-q) */
+extern int level; /* compression level */
+extern int test; /* check .z file integrity */
+extern int to_stdout; /* output to stdout (-c) */
+extern int save_orig_name; /* set if original name must be saved */
+
+#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(0))
+#define try_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(1))
+
+/* put_byte is used for the compressed output, put_ubyte for the
+ * uncompressed output. However unlzw() uses window for its
+ * suffix table instead of its output buffer, so it does not use put_ubyte
+ * (to be cleaned up).
+ */
+#define put_byte(c) {outbuf[outcnt++]=(uch)(c); if (outcnt==OUTBUFSIZ)\
+ flush_outbuf();}
+#define put_ubyte(c) {window[outcnt++]=(uch)(c); if (outcnt==WSIZE)\
+ flush_window();}
+
+/* Output a 16 bit value, lsb first */
+#define put_short(w) \
+{ if (outcnt < OUTBUFSIZ-2) { \
+ outbuf[outcnt++] = (uch) ((w) & 0xff); \
+ outbuf[outcnt++] = (uch) ((ush)(w) >> 8); \
+ } else { \
+ put_byte((uch)((w) & 0xff)); \
+ put_byte((uch)((ush)(w) >> 8)); \
+ } \
+}
+
+/* Output a 32 bit value to the bit stream, lsb first */
+#define put_long(n) { \
+ put_short((n) & 0xffff); \
+ put_short(((ulg)(n)) >> 16); \
+}
+
+#define seekable() 0 /* force sequential output */
+#define translate_eol 0 /* no option -a yet */
+
+#define tolow(c) (isupper(c) ? (c)-'A'+'a' : (c)) /* force to lower case */
+
+/* Macros for getting two-byte and four-byte header values */
+#define SH(p) ((ush)(uch)((p)[0]) | ((ush)(uch)((p)[1]) << 8))
+#define LG(p) ((ulg)(SH(p)) | ((ulg)(SH((p)+2)) << 16))
+
+/* Diagnostic functions */
+#ifdef DEBUG
+# define Assert(cond,msg) {if(!(cond)) error(msg);}
+# define Trace(x) fprintf x
+# define Tracev(x) {if (verbose) fprintf x ;}
+# define Tracevv(x) {if (verbose>1) fprintf x ;}
+# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
+# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
+#else
+# define Assert(cond,msg)
+# define Trace(x)
+# define Tracev(x)
+# define Tracevv(x)
+# define Tracec(c,x)
+# define Tracecv(c,x)
+#endif
+
+#define WARN(msg) {if (!quiet) fprintf msg ; \
+ if (exit_code == OK) exit_code = WARNING;}
+
+ /* in zip.c: */
+extern int zip OF((int in, int out));
+extern int file_read OF((char *buf, unsigned size));
+
+ /* in unzip.c */
+extern int unzip OF((int in, int out));
+extern int check_zipfile OF((int in));
+
+ /* in unpack.c */
+extern int unpack OF((int in, int out));
+
+ /* in unlzh.c */
+extern int unlzh OF((int in, int out));
+
+ /* in gzip.c */
+RETSIGTYPE abort_gzip OF((void));
+
+ /* in deflate.c */
+void lm_init OF((int pack_level, ush *flags));
+ulg deflate OF((void));
+
+ /* in trees.c */
+void ct_init OF((ush *attr, int *method));
+int ct_tally OF((int dist, int lc));
+ulg flush_block OF((char *buf, ulg stored_len, int eof));
+
+ /* in bits.c */
+void bi_init OF((file_t zipfile));
+void send_bits OF((int value, int length));
+unsigned bi_reverse OF((unsigned value, int length));
+void bi_windup OF((void));
+void copy_block OF((char *buf, unsigned len, int header));
+extern int (*read_buf) OF((char *buf, unsigned size));
+
+ /* in util.c: */
+extern int copy OF((int in, int out));
+extern ulg updcrc OF((uch *s, unsigned n));
+extern void clear_bufs OF((void));
+extern int fill_inbuf OF((int eof_ok));
+extern void flush_outbuf OF((void));
+extern void flush_window OF((void));
+extern void write_buf OF((int fd, voidp buf, unsigned cnt));
+#if defined(WIN32) && defined(strlwr)
+#undef strlwr
+extern char *strlwr OF((char *s));
+#endif
+extern char *basename OF((char *fname));
+extern void make_simple_name OF((char *name));
+extern char *add_envopt OF((int *argcp, char ***argvp, char *env));
+extern void error OF((char *m));
+extern void warn OF((char *a, char *b));
+extern void read_error OF((void));
+extern void write_error OF((void));
+extern void display_ratio OF((long num, long den, FILE *file));
+#ifndef WIN32
+extern voidp xmalloc OF((unsigned int size));
+#endif
+ /* in inflate.c */
+extern int inflate OF((void));
diff --git a/Build/source/utils/gzip/gzip.texi b/Build/source/utils/gzip/gzip.texi
new file mode 100644
index 00000000000..c60f7a69e9b
--- /dev/null
+++ b/Build/source/utils/gzip/gzip.texi
@@ -0,0 +1,478 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename gzip.info
+@settitle Gzip User's Manual
+@finalout
+@setchapternewpage odd
+@c %**end of header
+
+@ifinfo
+This file documents the the GNU @code{gzip} command for compressing files.
+
+Copyright (C) 1992-1993 Jean-loup Gailly
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end ifinfo
+
+@titlepage
+@title gzip
+@subtitle The data compression program
+@subtitle Edition 1.2.4, for Gzip Version 1.2.4
+@subtitle July 1993
+@author by Jean-loup Gailly
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1992-1993 Jean-loup Gailly
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end titlepage
+
+@node Top, , , (dir)
+
+@ifinfo
+This file documents the @code{gzip} command to compress files.
+@end ifinfo
+
+@menu
+* Copying:: How you can copy and share @code{gzip}.
+* Overview:: Preliminary information.
+* Sample:: Sample output from @code{gzip}.
+* Invoking gzip:: How to run @code{gzip}.
+* Advanced usage:: Concatenated files.
+* Environment:: The @code{GZIP} environment variable
+* Tapes:: Using @code{gzip} on tapes.
+* Problems:: Reporting bugs.
+* Concept Index:: Index of concepts.
+@end menu
+
+@node Copying, Overview, , Top
+@include gpl.texinfo
+
+@node Overview, Sample, Copying, Top
+@chapter Overview
+@cindex overview
+
+@code{gzip} reduces the size of the named files using Lempel-Ziv coding
+(LZ77). Whenever possible, each file is replaced by one with the
+extension @samp{.gz}, while keeping the same ownership modes, access and
+modification times. (The default extension is @samp{-gz} for VMS,
+@samp{z} for MSDOS, OS/2 FAT and Atari.) If no files are specified or
+if a file name is "-", the standard input is compressed to the standard
+output. @code{gzip} will only attempt to compress regular files. In
+particular, it will ignore symbolic links.
+
+If the new file name is too long for its file system, @code{gzip}
+truncates it. @code{gzip} attempts to truncate only the parts of the
+file name longer than 3 characters. (A part is delimited by dots.) If
+the name consists of small parts only, the longest parts are truncated.
+For example, if file names are limited to 14 characters, gzip.msdos.exe
+is compressed to gzi.msd.exe.gz. Names are not truncated on systems
+which do not have a limit on file name length.
+
+By default, @code{gzip} keeps the original file name and timestamp in
+the compressed file. These are used when decompressing the file with the
+@samp{-N} option. This is useful when the compressed file name was
+truncated or when the time stamp was not preserved after a file
+transfer.
+
+Compressed files can be restored to their original form using @samp{gzip -d}
+or @code{gunzip} or @code{zcat}. If the original name saved in the
+compressed file is not suitable for its file system, a new name is
+constructed from the original one to make it legal.
+
+@code{gunzip} takes a list of files on its command line and replaces
+each file whose name ends with @samp{.gz}, @samp{.z}, @samp{.Z},
+@samp{-gz}, @samp{-z} or @samp{_z} and which begins with the correct
+magic number with an uncompressed file without the original extension.
+@code{gunzip} also recognizes the special extensions @samp{.tgz} and
+@samp{.taz} as shorthands for @samp{.tar.gz} and @samp{.tar.Z}
+respectively. When compressing, @code{gzip} uses the @samp{.tgz}
+extension if necessary instead of truncating a file with a @samp{.tar}
+extension.
+
+@code{gunzip} can currently decompress files created by @code{gzip},
+@code{zip}, @code{compress} or @code{pack}. The detection of the input
+format is automatic. When using the first two formats, @code{gunzip}
+checks a 32 bit CRC (cyclic redundancy check). For @code{pack},
+@code{gunzip} checks the uncompressed length. The @code{compress} format
+was not designed to allow consistency checks. However @code{gunzip} is
+sometimes able to detect a bad @samp{.Z} file. If you get an error when
+uncompressing a @samp{.Z} file, do not assume that the @samp{.Z} file is
+correct simply because the standard @code{uncompress} does not complain.
+This generally means that the standard @code{uncompress} does not check
+its input, and happily generates garbage output. The SCO @samp{compress
+-H} format (@code{lzh} compression method) does not include a CRC but
+also allows some consistency checks.
+
+Files created by @code{zip} can be uncompressed by @code{gzip} only if
+they have a single member compressed with the 'deflation' method. This
+feature is only intended to help conversion of @code{tar.zip} files to
+the @code{tar.gz} format. To extract @code{zip} files with several
+members, use @code{unzip} instead of @code{gunzip}.
+
+@code{zcat} is identical to @samp{gunzip -c}. @code{zcat}
+uncompresses either a list of files on the command line or its standard
+input and writes the uncompressed data on standard output. @code{zcat}
+will uncompress files that have the correct magic number whether they
+have a @samp{.gz} suffix or not.
+
+@code{gzip} uses the Lempel-Ziv algorithm used in @code{zip} and PKZIP.
+The amount of compression obtained depends on the size of the input and
+the distribution of common substrings. Typically, text such as source
+code or English is reduced by 60-70%. Compression is generally much
+better than that achieved by LZW (as used in @code{compress}), Huffman
+coding (as used in @code{pack}), or adaptive Huffman coding
+(@code{compact}).
+
+Compression is always performed, even if the compressed file is slightly
+larger than the original. The worst case expansion is a few bytes for
+the @code{gzip} file header, plus 5 bytes every 32K block, or an expansion
+ratio of 0.015% for large files. Note that the actual number of used
+disk blocks almost never increases. @code{gzip} preserves the mode,
+ownership and timestamps of files when compressing or decompressing.
+
+@node Sample, Invoking gzip, Overview, Top
+@chapter Sample Output
+@cindex sample
+
+Here are some realistic examples of running @code{gzip}.
+
+This is the output of the command @samp{gzip -h}:
+
+@example
+gzip 1.2.4 (18 Aug 93)
+usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+ -c --stdout write on standard output, keep original files unchanged
+ -d --decompress decompress
+ -f --force force overwrite of output file and compress links
+ -h --help give this help
+ -l --list list compressed file contents
+ -L --license display software license
+ -n --no-name do not save or restore the original name and time stamp
+ -N --name save or restore the original name and time stamp
+ -q --quiet suppress all warnings
+ -r --recursive operate recursively on directories
+ -S .suf --suffix .suf use suffix .suf on compressed files
+ -t --test test compressed file integrity
+ -v --verbose verbose mode
+ -V --version display version number
+ -1 --fast compress faster
+ -9 --best compress better
+ file... files to (de)compress. If none given, use standard input.
+@end example
+
+This is the output of the command @samp{gzip -v texinfo.tex}:
+
+@example
+texinfo.tex: 71.6% -- replaced with texinfo.tex.gz
+@end example
+
+The following command will find all @code{gzip} files in the current
+directory and subdirectories, and extract them in place without
+destroying the original:
+
+@example
+find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip < "&" > "\1"/' | sh
+@end example
+
+@node Invoking gzip, Advanced usage, Sample, Top
+@chapter Invoking @code{gzip}
+@cindex invoking
+@cindex options
+
+The format for running the @code{gzip} program is:
+
+@example
+gzip @var{option} @dots{}
+@end example
+
+@code{gzip} supports the following options:
+
+@table @samp
+@item --stdout
+@itemx --to-stdout
+@itemx -c
+Write output on standard output; keep original files unchanged.
+If there are several input files, the output consists of a sequence of
+independently compressed members. To obtain better compression,
+concatenate all input files before compressing them.
+
+@item --decompress
+@itemx --uncompress
+@itemx -d
+Decompress.
+
+@item --force
+@itemx -f
+Force compression or decompression even if the file has multiple links
+or the corresponding file already exists, or if the compressed data
+is read from or written to a terminal. If the input data is not in
+a format recognized by @code{gzip}, and if the option @samp{--stdout} is also
+given, copy the input data without change to the standard output: let
+@code{zcat} behave as @code{cat}. If @samp{-f} is not given, and
+when not running in the background, @code{gzip} prompts to verify
+whether an existing file should be overwritten.
+
+@item --help
+@itemx -h
+Print an informative help message describing the options then quit.
+
+@item --list
+@itemx -l
+For each compressed file, list the following fields:
+
+@example
+compressed size: size of the compressed file
+uncompressed size: size of the uncompressed file
+ratio: compression ratio (0.0% if unknown)
+uncompressed_name: name of the uncompressed file
+@end example
+
+The uncompressed size is given as @samp{-1} for files not in @code{gzip}
+format, such as compressed @samp{.Z} files. To get the uncompressed size for
+such a file, you can use:
+
+@example
+zcat file.Z | wc -c
+@end example
+
+In combination with the @samp{--verbose} option, the following fields are also
+displayed:
+
+@example
+method: compression method (deflate,compress,lzh,pack)
+crc: the 32-bit CRC of the uncompressed data
+date & time: time stamp for the uncompressed file
+@end example
+
+The crc is given as ffffffff for a file not in gzip format.
+
+With @samp{--verbose}, the size totals and compression ratio for all files
+is also displayed, unless some sizes are unknown. With @samp{--quiet},
+the title and totals lines are not displayed.
+
+@item --license
+@itemx -L
+Display the @code{gzip} license then quit.
+
+@item --no-name
+@itemx -n
+When compressing, do not save the original file name and time stamp by
+default. (The original name is always saved if the name had to be
+truncated.) When decompressing, do not restore the original file name
+if present (remove only the @code{gzip}
+suffix from the compressed file name) and do not restore the original
+time stamp if present (copy it from the compressed file). This option
+is the default when decompressing.
+
+@item --name
+@itemx -N
+When compressing, always save the original file name and time stamp; this
+is the default. When decompressing, restore the original file name and
+time stamp if present. This option is useful on systems which have
+a limit on file name length or when the time stamp has been lost after
+a file transfer.
+
+@item --quiet
+@itemx -q
+Suppress all warning messages.
+
+@item --recursive
+@itemx -r
+Travel the directory structure recursively. If any of the file names
+specified on the command line are directories, @code{gzip} will descend
+into the directory and compress all the files it finds there (or
+decompress them in the case of @code{gunzip}).
+
+@item --suffix @var{suf}
+@itemx -S @var{suf}
+Use suffix @samp{@var{suf}} instead of @samp{.gz}. Any suffix can be
+given, but suffixes other than @samp{.z} and @samp{.gz} should be
+avoided to avoid confusion when files are transferred to other systems.
+A null suffix forces gunzip to try decompression on all given files
+regardless of suffix, as in:
+
+@example
+gunzip -S "" * (*.* for MSDOS)
+@end example
+
+Previous versions of gzip used the @samp{.z} suffix. This was changed to
+avoid a conflict with @code{pack}.
+
+@item --test
+@itemx -t
+Test. Check the compressed file integrity.
+
+@item --verbose
+@itemx -v
+Verbose. Display the name and percentage reduction for each file compressed.
+
+@item --version
+@itemx -V
+Version. Display the version number and compilation options, then quit.
+
+@item --fast
+@itemx --best
+@itemx -@var{n}
+Regulate the speed of compression using the specified digit @var{n},
+where @samp{-1} or @samp{--fast} indicates the fastest compression
+method (less compression) and @samp{--best} or @samp{-9} indicates the
+slowest compression method (optimal compression). The default
+compression level is @samp{-6} (that is, biased towards high compression at
+expense of speed).
+@end table
+
+@node Advanced usage, Environment, Invoking gzip, Top
+@chapter Advanced usage
+@cindex concatenated files
+
+Multiple compressed files can be concatenated. In this case,
+@code{gunzip} will extract all members at once. If one member is
+damaged, other members might still be recovered after removal of the
+damaged member. Better compression can be usually obtained if all
+members are decompressed and then recompressed in a single step.
+
+This is an example of concatenating @code{gzip} files:
+
+@example
+gzip -c file1 > foo.gz
+gzip -c file2 >> foo.gz
+@end example
+
+Then
+
+@example
+gunzip -c foo
+@end example
+
+is equivalent to
+
+@example
+cat file1 file2
+@end example
+
+In case of damage to one member of a @samp{.gz} file, other members can
+still be recovered (if the damaged member is removed). However,
+you can get better compression by compressing all members at once:
+
+@example
+cat file1 file2 | gzip > foo.gz
+@end example
+
+compresses better than
+
+@example
+gzip -c file1 file2 > foo.gz
+@end example
+
+If you want to recompress concatenated files to get better compression, do:
+
+@example
+zcat old.gz | gzip > new.gz
+@end example
+
+If a compressed file consists of several members, the uncompressed
+size and CRC reported by the @samp{--list} option applies to the last member
+only. If you need the uncompressed size for all members, you can use:
+
+@example
+zcat file.gz | wc -c
+@end example
+
+If you wish to create a single archive file with multiple members so
+that members can later be extracted independently, use an archiver such
+as @code{tar} or @code{zip}. GNU @code{tar} supports the @samp{-z}
+option to invoke @code{gzip} transparently. @code{gzip} is designed as a
+complement to @code{tar}, not as a replacement.
+
+@node Environment, Tapes, Advanced usage, Top
+@chapter Environment
+@cindex Environment
+
+The environment variable @code{GZIP} can hold a set of default options for
+@code{gzip}. These options are interpreted first and can be overwritten by
+explicit command line parameters. For example:
+
+@example
+for sh: GZIP="-8v --name"; export GZIP
+for csh: setenv GZIP "-8v --name"
+for MSDOS: set GZIP=-8v --name
+@end example
+
+On Vax/VMS, the name of the environment variable is @code{GZIP_OPT}, to
+avoid a conflict with the symbol set for invocation of the program.
+
+@node Tapes, Problems, Environment, Top
+@chapter Using @code{gzip} on tapes
+@cindex tapes
+
+When writing compressed data to a tape, it is generally necessary to pad
+the output with zeroes up to a block boundary. When the data is read and
+the whole block is passed to @code{gunzip} for decompression,
+@code{gunzip} detects that there is extra trailing garbage after the
+compressed data and emits a warning by default. You have to use the
+@samp{--quiet} option to suppress the warning. This option can be set in the
+@code{GZIP} environment variable, as in:
+
+@example
+for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
+for csh: (setenv GZIP "-q"; tar -xfz --block-compress /dev/rst0)
+@end example
+
+In the above example, @code{gzip} is invoked implicitly by the @samp{-z}
+option of GNU @code{tar}. Make sure that the same block size (@samp{-b}
+option of @code{tar}) is used for reading and writing compressed data on
+tapes. (This example assumes you are using the GNU version of
+@code{tar}.)
+
+@node Problems, Concept Index, Tapes, Top
+@chapter Reporting Bugs
+@cindex bugs
+
+If you find a bug in @code{gzip}, please send electronic mail to
+@w{@samp{bug-gzip@@gnu.org}}. Include the version number,
+which you can find by running @w{@samp{gzip -V}}. Also include in your
+message the hardware and operating system, the compiler used to compile
+@code{gzip},
+a description of the bug behavior, and the input to @code{gzip} that triggered
+the bug.@refill
+
+@node Concept Index, , Problems, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@contents
+@bye
diff --git a/Build/source/utils/gzip/gzip_1.html b/Build/source/utils/gzip/gzip_1.html
new file mode 100644
index 00000000000..1e93cda7877
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_1.html
@@ -0,0 +1,459 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - GNU GENERAL PUBLIC LICENSE</TITLE>
+</HEAD>
+<BODY>
+Go to the first, previous, <A HREF="gzip_2.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+
+<H1><A NAME="SEC1" HREF="gzip_toc.html#TOC1">GNU GENERAL PUBLIC LICENSE</A></H1>
+<P>
+Version 2, June 1991
+
+
+
+<PRE>
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+675 Mass Ave, Cambridge, MA 02139, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+
+
+
+<H2><A NAME="SEC2" HREF="gzip_toc.html#TOC2">Preamble</A></H2>
+
+<P>
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+
+<P>
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+
+<P>
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+
+<P>
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+
+<P>
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+
+<P>
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+
+<P>
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+
+<P>
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+<P>
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+
+
+<OL>
+<LI>
+
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+<LI>
+
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+<LI>
+
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+
+<OL>
+<LI>
+
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+<LI>
+
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+<LI>
+
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+</OL>
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+<LI>
+
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+<OL>
+<LI>
+
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+<LI>
+
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+<LI>
+
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+</OL>
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+<LI>
+
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+<LI>
+
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+<LI>
+
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+<LI>
+
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+<LI>
+
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+<LI>
+
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+<LI>
+
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+<LI>
+
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+<LI>
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+</OL>
+
+<P>
+END OF TERMS AND CONDITIONS
+
+
+
+
+<H2><A NAME="SEC3" HREF="gzip_toc.html#TOC3">How to Apply These Terms to Your New Programs</A></H2>
+
+<P>
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+
+<P>
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+
+<PRE>
+<VAR>one line to give the program's name and an idea of what it does.</VAR>
+Copyright (C) 19<VAR>yy</VAR> <VAR>name of author</VAR>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+</PRE>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+
+<P>
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+
+
+<PRE>
+Gnomovision version 69, Copyright (C) 19<VAR>yy</VAR> <VAR>name of author</VAR>
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+</PRE>
+
+<P>
+The hypothetical commands <SAMP>`show w'</SAMP> and <SAMP>`show c'</SAMP> should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than <SAMP>`show w'</SAMP> and
+<SAMP>`show c'</SAMP>; they could even be mouse-clicks or menu items--whatever
+suits your program.
+
+
+<P>
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+
+
+<PRE>
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+<VAR>signature of Ty Coon</VAR>, 1 April 1989
+Ty Coon, President of Vice
+</PRE>
+
+<P>
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+
+<P><HR><P>
+Go to the first, previous, <A HREF="gzip_2.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_2.html b/Build/source/utils/gzip/gzip_2.html
new file mode 100644
index 00000000000..197bc4ffc7f
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_2.html
@@ -0,0 +1,119 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 1. Overview</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_1.html">previous</A>, <A HREF="gzip_3.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC4" HREF="gzip_toc.html#TOC4">1. Overview</A></H1>
+<P>
+<A NAME="IDX1"></A>
+
+
+<P>
+<CODE>gzip</CODE> reduces the size of the named files using Lempel-Ziv coding
+(LZ77). Whenever possible, each file is replaced by one with the
+extension <SAMP>`.gz'</SAMP>, while keeping the same ownership modes, access and
+modification times. (The default extension is <SAMP>`-gz'</SAMP> for VMS,
+<SAMP>`z'</SAMP> for MSDOS, OS/2 FAT and Atari.) If no files are specified or
+if a file name is "-", the standard input is compressed to the standard
+output. <CODE>gzip</CODE> will only attempt to compress regular files. In
+particular, it will ignore symbolic links.
+
+
+<P>
+If the new file name is too long for its file system, <CODE>gzip</CODE>
+truncates it. <CODE>gzip</CODE> attempts to truncate only the parts of the
+file name longer than 3 characters. (A part is delimited by dots.) If
+the name consists of small parts only, the longest parts are truncated.
+For example, if file names are limited to 14 characters, gzip.msdos.exe
+is compressed to gzi.msd.exe.gz. Names are not truncated on systems
+which do not have a limit on file name length.
+
+
+<P>
+By default, <CODE>gzip</CODE> keeps the original file name and timestamp in
+the compressed file. These are used when decompressing the file with the
+<SAMP>`-N'</SAMP> option. This is useful when the compressed file name was
+truncated or when the time stamp was not preserved after a file
+transfer.
+
+
+<P>
+Compressed files can be restored to their original form using <SAMP>`gzip -d'</SAMP>
+or <CODE>gunzip</CODE> or <CODE>zcat</CODE>. If the original name saved in the
+compressed file is not suitable for its file system, a new name is
+constructed from the original one to make it legal.
+
+
+<P>
+<CODE>gunzip</CODE> takes a list of files on its command line and replaces
+each file whose name ends with <SAMP>`.gz'</SAMP>, <SAMP>`.z'</SAMP>, <SAMP>`.Z'</SAMP>,
+<SAMP>`-gz'</SAMP>, <SAMP>`-z'</SAMP> or <SAMP>`_z'</SAMP> and which begins with the correct
+magic number with an uncompressed file without the original extension.
+<CODE>gunzip</CODE> also recognizes the special extensions <SAMP>`.tgz'</SAMP> and
+<SAMP>`.taz'</SAMP> as shorthands for <SAMP>`.tar.gz'</SAMP> and <SAMP>`.tar.Z'</SAMP>
+respectively. When compressing, <CODE>gzip</CODE> uses the <SAMP>`.tgz'</SAMP>
+extension if necessary instead of truncating a file with a <SAMP>`.tar'</SAMP>
+extension.
+
+
+<P>
+<CODE>gunzip</CODE> can currently decompress files created by <CODE>gzip</CODE>,
+<CODE>zip</CODE>, <CODE>compress</CODE> or <CODE>pack</CODE>. The detection of the input
+format is automatic. When using the first two formats, <CODE>gunzip</CODE>
+checks a 32 bit CRC (cyclic redundancy check). For <CODE>pack</CODE>,
+<CODE>gunzip</CODE> checks the uncompressed length. The <CODE>compress</CODE> format
+was not designed to allow consistency checks. However <CODE>gunzip</CODE> is
+sometimes able to detect a bad <SAMP>`.Z'</SAMP> file. If you get an error when
+uncompressing a <SAMP>`.Z'</SAMP> file, do not assume that the <SAMP>`.Z'</SAMP> file is
+correct simply because the standard <CODE>uncompress</CODE> does not complain.
+This generally means that the standard <CODE>uncompress</CODE> does not check
+its input, and happily generates garbage output. The SCO <SAMP>`compress
+-H'</SAMP> format (<CODE>lzh</CODE> compression method) does not include a CRC but
+also allows some consistency checks.
+
+
+<P>
+Files created by <CODE>zip</CODE> can be uncompressed by <CODE>gzip</CODE> only if
+they have a single member compressed with the 'deflation' method. This
+feature is only intended to help conversion of <CODE>tar.zip</CODE> files to
+the <CODE>tar.gz</CODE> format. To extract <CODE>zip</CODE> files with several
+members, use <CODE>unzip</CODE> instead of <CODE>gunzip</CODE>.
+
+
+<P>
+<CODE>zcat</CODE> is identical to <SAMP>`gunzip -c'</SAMP>. <CODE>zcat</CODE>
+uncompresses either a list of files on the command line or its standard
+input and writes the uncompressed data on standard output. <CODE>zcat</CODE>
+will uncompress files that have the correct magic number whether they
+have a <SAMP>`.gz'</SAMP> suffix or not.
+
+
+<P>
+<CODE>gzip</CODE> uses the Lempel-Ziv algorithm used in <CODE>zip</CODE> and PKZIP.
+The amount of compression obtained depends on the size of the input and
+the distribution of common substrings. Typically, text such as source
+code or English is reduced by 60-70%. Compression is generally much
+better than that achieved by LZW (as used in <CODE>compress</CODE>), Huffman
+coding (as used in <CODE>pack</CODE>), or adaptive Huffman coding
+(<CODE>compact</CODE>).
+
+
+<P>
+Compression is always performed, even if the compressed file is slightly
+larger than the original. The worst case expansion is a few bytes for
+the <CODE>gzip</CODE> file header, plus 5 bytes every 32K block, or an expansion
+ratio of 0.015% for large files. Note that the actual number of used
+disk blocks almost never increases. <CODE>gzip</CODE> preserves the mode,
+ownership and timestamps of files when compressing or decompressing.
+
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_1.html">previous</A>, <A HREF="gzip_3.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_3.html b/Build/source/utils/gzip/gzip_3.html
new file mode 100644
index 00000000000..c2827426fc6
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_3.html
@@ -0,0 +1,71 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 2. Sample Output</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_2.html">previous</A>, <A HREF="gzip_4.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC5" HREF="gzip_toc.html#TOC5">2. Sample Output</A></H1>
+<P>
+<A NAME="IDX2"></A>
+
+
+<P>
+Here are some realistic examples of running <CODE>gzip</CODE>.
+
+
+<P>
+This is the output of the command <SAMP>`gzip -h'</SAMP>:
+
+
+
+<PRE>
+gzip 1.2.4 (18 Aug 93)
+usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+ -c --stdout write on standard output, keep original files unchanged
+ -d --decompress decompress
+ -f --force force overwrite of output file and compress links
+ -h --help give this help
+ -l --list list compressed file contents
+ -L --license display software license
+ -n --no-name do not save or restore the original name and time stamp
+ -N --name save or restore the original name and time stamp
+ -q --quiet suppress all warnings
+ -r --recursive operate recursively on directories
+ -S .suf --suffix .suf use suffix .suf on compressed files
+ -t --test test compressed file integrity
+ -v --verbose verbose mode
+ -V --version display version number
+ -1 --fast compress faster
+ -9 --best compress better
+ file... files to (de)compress. If none given, use standard input.
+</PRE>
+
+<P>
+This is the output of the command <SAMP>`gzip -v texinfo.tex'</SAMP>:
+
+
+
+<PRE>
+texinfo.tex: 71.6% -- replaced with texinfo.tex.gz
+</PRE>
+
+<P>
+The following command will find all <CODE>gzip</CODE> files in the current
+directory and subdirectories, and extract them in place without
+destroying the original:
+
+
+
+<PRE>
+find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip &#60; "&#38;" &#62; "\1"/' | sh
+</PRE>
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_2.html">previous</A>, <A HREF="gzip_4.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_4.html b/Build/source/utils/gzip/gzip_4.html
new file mode 100644
index 00000000000..89942ef313c
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_4.html
@@ -0,0 +1,206 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 3. Invoking gzip</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_3.html">previous</A>, <A HREF="gzip_5.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC6" HREF="gzip_toc.html#TOC6">3. Invoking <CODE>gzip</CODE></A></H1>
+<P>
+<A NAME="IDX3"></A>
+<A NAME="IDX4"></A>
+
+
+<P>
+The format for running the <CODE>gzip</CODE> program is:
+
+
+
+<PRE>
+gzip <VAR>option</VAR> ...
+</PRE>
+
+<P>
+<CODE>gzip</CODE> supports the following options:
+
+
+<DL COMPACT>
+
+<DT><SAMP>`--stdout'</SAMP>
+<DD>
+<DT><SAMP>`--to-stdout'</SAMP>
+<DD>
+<DT><SAMP>`-c'</SAMP>
+<DD>
+Write output on standard output; keep original files unchanged.
+If there are several input files, the output consists of a sequence of
+independently compressed members. To obtain better compression,
+concatenate all input files before compressing them.
+
+<DT><SAMP>`--decompress'</SAMP>
+<DD>
+<DT><SAMP>`--uncompress'</SAMP>
+<DD>
+<DT><SAMP>`-d'</SAMP>
+<DD>
+Decompress.
+
+<DT><SAMP>`--force'</SAMP>
+<DD>
+<DT><SAMP>`-f'</SAMP>
+<DD>
+Force compression or decompression even if the file has multiple links
+or the corresponding file already exists, or if the compressed data
+is read from or written to a terminal. If the input data is not in
+a format recognized by <CODE>gzip</CODE>, and if the option <SAMP>`--stdout'</SAMP> is also
+given, copy the input data without change to the standard output: let
+<CODE>zcat</CODE> behave as <CODE>cat</CODE>. If <SAMP>`-f'</SAMP> is not given, and
+when not running in the background, <CODE>gzip</CODE> prompts to verify
+whether an existing file should be overwritten.
+
+<DT><SAMP>`--help'</SAMP>
+<DD>
+<DT><SAMP>`-h'</SAMP>
+<DD>
+Print an informative help message describing the options then quit.
+
+<DT><SAMP>`--list'</SAMP>
+<DD>
+<DT><SAMP>`-l'</SAMP>
+<DD>
+For each compressed file, list the following fields:
+
+
+<PRE>
+compressed size: size of the compressed file
+uncompressed size: size of the uncompressed file
+ratio: compression ratio (0.0% if unknown)
+uncompressed_name: name of the uncompressed file
+</PRE>
+
+The uncompressed size is given as <SAMP>`-1'</SAMP> for files not in <CODE>gzip</CODE>
+format, such as compressed <SAMP>`.Z'</SAMP> files. To get the uncompressed size for
+such a file, you can use:
+
+
+<PRE>
+zcat file.Z | wc -c
+</PRE>
+
+In combination with the <SAMP>`--verbose'</SAMP> option, the following fields are also
+displayed:
+
+
+<PRE>
+method: compression method (deflate,compress,lzh,pack)
+crc: the 32-bit CRC of the uncompressed data
+date &#38; time: time stamp for the uncompressed file
+</PRE>
+
+The crc is given as ffffffff for a file not in gzip format.
+
+With <SAMP>`--verbose'</SAMP>, the size totals and compression ratio for all files
+is also displayed, unless some sizes are unknown. With <SAMP>`--quiet'</SAMP>,
+the title and totals lines are not displayed.
+
+<DT><SAMP>`--license'</SAMP>
+<DD>
+<DT><SAMP>`-L'</SAMP>
+<DD>
+Display the <CODE>gzip</CODE> license then quit.
+
+<DT><SAMP>`--no-name'</SAMP>
+<DD>
+<DT><SAMP>`-n'</SAMP>
+<DD>
+When compressing, do not save the original file name and time stamp by
+default. (The original name is always saved if the name had to be
+truncated.) When decompressing, do not restore the original file name
+if present (remove only the <CODE>gzip</CODE>
+suffix from the compressed file name) and do not restore the original
+time stamp if present (copy it from the compressed file). This option
+is the default when decompressing.
+
+<DT><SAMP>`--name'</SAMP>
+<DD>
+<DT><SAMP>`-N'</SAMP>
+<DD>
+When compressing, always save the original file name and time stamp; this
+is the default. When decompressing, restore the original file name and
+time stamp if present. This option is useful on systems which have
+a limit on file name length or when the time stamp has been lost after
+a file transfer.
+
+<DT><SAMP>`--quiet'</SAMP>
+<DD>
+<DT><SAMP>`-q'</SAMP>
+<DD>
+Suppress all warning messages.
+
+<DT><SAMP>`--recursive'</SAMP>
+<DD>
+<DT><SAMP>`-r'</SAMP>
+<DD>
+Travel the directory structure recursively. If any of the file names
+specified on the command line are directories, <CODE>gzip</CODE> will descend
+into the directory and compress all the files it finds there (or
+decompress them in the case of <CODE>gunzip</CODE>).
+
+<DT><SAMP>`--suffix <VAR>suf</VAR>'</SAMP>
+<DD>
+<DT><SAMP>`-S <VAR>suf</VAR>'</SAMP>
+<DD>
+Use suffix <SAMP>`<VAR>suf</VAR>'</SAMP> instead of <SAMP>`.gz'</SAMP>. Any suffix can be
+given, but suffixes other than <SAMP>`.z'</SAMP> and <SAMP>`.gz'</SAMP> should be
+avoided to avoid confusion when files are transferred to other systems.
+A null suffix forces gunzip to try decompression on all given files
+regardless of suffix, as in:
+
+
+<PRE>
+gunzip -S "" * (*.* for MSDOS)
+</PRE>
+
+Previous versions of gzip used the <SAMP>`.z'</SAMP> suffix. This was changed to
+avoid a conflict with <CODE>pack</CODE>.
+
+<DT><SAMP>`--test'</SAMP>
+<DD>
+<DT><SAMP>`-t'</SAMP>
+<DD>
+Test. Check the compressed file integrity.
+
+<DT><SAMP>`--verbose'</SAMP>
+<DD>
+<DT><SAMP>`-v'</SAMP>
+<DD>
+Verbose. Display the name and percentage reduction for each file compressed.
+
+<DT><SAMP>`--version'</SAMP>
+<DD>
+<DT><SAMP>`-V'</SAMP>
+<DD>
+Version. Display the version number and compilation options, then quit.
+
+<DT><SAMP>`--fast'</SAMP>
+<DD>
+<DT><SAMP>`--best'</SAMP>
+<DD>
+<DT><SAMP>`-<VAR>n</VAR>'</SAMP>
+<DD>
+Regulate the speed of compression using the specified digit <VAR>n</VAR>,
+where <SAMP>`-1'</SAMP> or <SAMP>`--fast'</SAMP> indicates the fastest compression
+method (less compression) and <SAMP>`--best'</SAMP> or <SAMP>`-9'</SAMP> indicates the
+slowest compression method (optimal compression). The default
+compression level is <SAMP>`-6'</SAMP> (that is, biased towards high compression at
+expense of speed).
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_3.html">previous</A>, <A HREF="gzip_5.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_5.html b/Build/source/utils/gzip/gzip_5.html
new file mode 100644
index 00000000000..1d92e6e1354
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_5.html
@@ -0,0 +1,104 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 4. Advanced usage</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_4.html">previous</A>, <A HREF="gzip_6.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC7" HREF="gzip_toc.html#TOC7">4. Advanced usage</A></H1>
+<P>
+<A NAME="IDX5"></A>
+
+
+<P>
+Multiple compressed files can be concatenated. In this case,
+<CODE>gunzip</CODE> will extract all members at once. If one member is
+damaged, other members might still be recovered after removal of the
+damaged member. Better compression can be usually obtained if all
+members are decompressed and then recompressed in a single step.
+
+
+<P>
+This is an example of concatenating <CODE>gzip</CODE> files:
+
+
+
+<PRE>
+gzip -c file1 &#62; foo.gz
+gzip -c file2 &#62;&#62; foo.gz
+</PRE>
+
+<P>
+Then
+
+
+
+<PRE>
+gunzip -c foo
+</PRE>
+
+<P>
+is equivalent to
+
+
+
+<PRE>
+cat file1 file2
+</PRE>
+
+<P>
+In case of damage to one member of a <SAMP>`.gz'</SAMP> file, other members can
+still be recovered (if the damaged member is removed). However,
+you can get better compression by compressing all members at once:
+
+
+
+<PRE>
+cat file1 file2 | gzip &#62; foo.gz
+</PRE>
+
+<P>
+compresses better than
+
+
+
+<PRE>
+gzip -c file1 file2 &#62; foo.gz
+</PRE>
+
+<P>
+If you want to recompress concatenated files to get better compression, do:
+
+
+
+<PRE>
+zcat old.gz | gzip &#62; new.gz
+</PRE>
+
+<P>
+If a compressed file consists of several members, the uncompressed
+size and CRC reported by the <SAMP>`--list'</SAMP> option applies to the last member
+only. If you need the uncompressed size for all members, you can use:
+
+
+
+<PRE>
+zcat file.gz | wc -c
+</PRE>
+
+<P>
+If you wish to create a single archive file with multiple members so
+that members can later be extracted independently, use an archiver such
+as <CODE>tar</CODE> or <CODE>zip</CODE>. GNU <CODE>tar</CODE> supports the <SAMP>`-z'</SAMP>
+option to invoke <CODE>gzip</CODE> transparently. <CODE>gzip</CODE> is designed as a
+complement to <CODE>tar</CODE>, not as a replacement.
+
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_4.html">previous</A>, <A HREF="gzip_6.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_6.html b/Build/source/utils/gzip/gzip_6.html
new file mode 100644
index 00000000000..f3e92251cd3
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_6.html
@@ -0,0 +1,38 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 5. Environment</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_5.html">previous</A>, <A HREF="gzip_7.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC8" HREF="gzip_toc.html#TOC8">5. Environment</A></H1>
+<P>
+<A NAME="IDX6"></A>
+
+
+<P>
+The environment variable <CODE>GZIP</CODE> can hold a set of default options for
+<CODE>gzip</CODE>. These options are interpreted first and can be overwritten by
+explicit command line parameters. For example:
+
+
+
+<PRE>
+for sh: GZIP="-8v --name"; export GZIP
+for csh: setenv GZIP "-8v --name"
+for MSDOS: set GZIP=-8v --name
+</PRE>
+
+<P>
+On Vax/VMS, the name of the environment variable is <CODE>GZIP_OPT</CODE>, to
+avoid a conflict with the symbol set for invocation of the program.
+
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_5.html">previous</A>, <A HREF="gzip_7.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_7.html b/Build/source/utils/gzip/gzip_7.html
new file mode 100644
index 00000000000..b095fe2d1f0
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_7.html
@@ -0,0 +1,44 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 6. Using gzip on tapes</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_6.html">previous</A>, <A HREF="gzip_8.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC9" HREF="gzip_toc.html#TOC9">6. Using <CODE>gzip</CODE> on tapes</A></H1>
+<P>
+<A NAME="IDX7"></A>
+
+
+<P>
+When writing compressed data to a tape, it is generally necessary to pad
+the output with zeroes up to a block boundary. When the data is read and
+the whole block is passed to <CODE>gunzip</CODE> for decompression,
+<CODE>gunzip</CODE> detects that there is extra trailing garbage after the
+compressed data and emits a warning by default. You have to use the
+<SAMP>`--quiet'</SAMP> option to suppress the warning. This option can be set in the
+<CODE>GZIP</CODE> environment variable, as in:
+
+
+
+<PRE>
+for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
+for csh: (setenv GZIP "-q"; tar -xfz --block-compress /dev/rst0)
+</PRE>
+
+<P>
+In the above example, <CODE>gzip</CODE> is invoked implicitly by the <SAMP>`-z'</SAMP>
+option of GNU <CODE>tar</CODE>. Make sure that the same block size (<SAMP>`-b'</SAMP>
+option of <CODE>tar</CODE>) is used for reading and writing compressed data on
+tapes. (This example assumes you are using the GNU version of
+<CODE>tar</CODE>.)
+
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_6.html">previous</A>, <A HREF="gzip_8.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_8.html b/Build/source/utils/gzip/gzip_8.html
new file mode 100644
index 00000000000..717aa26408e
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_8.html
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - 7. Reporting Bugs</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_7.html">previous</A>, <A HREF="gzip_9.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC10" HREF="gzip_toc.html#TOC10">7. Reporting Bugs</A></H1>
+<P>
+<A NAME="IDX8"></A>
+
+
+<P>
+If you find a bug in <CODE>gzip</CODE>, please send electronic mail to
+<SAMP>`bug-gzip@gnu.org'</SAMP>. Include the version number,
+which you can find by running <SAMP>`gzip -V'</SAMP>. Also include in your
+message the hardware and operating system, the compiler used to compile
+<CODE>gzip</CODE>,
+a description of the bug behavior, and the input to <CODE>gzip</CODE> that triggered
+the bug.
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_7.html">previous</A>, <A HREF="gzip_9.html">next</A>, <A HREF="gzip_9.html">last</A> section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_9.html b/Build/source/utils/gzip/gzip_9.html
new file mode 100644
index 00000000000..aee94e72e0e
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_9.html
@@ -0,0 +1,64 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - Concept Index</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_8.html">previous</A>, next, last section, <A HREF="gzip_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC11" HREF="gzip_toc.html#TOC11">Concept Index</A></H1>
+
+<P>
+Jump to:
+<A HREF="#cindex_b">b</A>
+-
+<A HREF="#cindex_c">c</A>
+-
+<A HREF="#cindex_e">e</A>
+-
+<A HREF="#cindex_i">i</A>
+-
+<A HREF="#cindex_o">o</A>
+-
+<A HREF="#cindex_s">s</A>
+-
+<A HREF="#cindex_t">t</A>
+<P>
+<H2><A NAME="cindex_b">b</A></H2>
+<DIR>
+<LI><A HREF="gzip_8.html#IDX8">bugs</A>
+</DIR>
+<H2><A NAME="cindex_c">c</A></H2>
+<DIR>
+<LI><A HREF="gzip_5.html#IDX5">concatenated files</A>
+</DIR>
+<H2><A NAME="cindex_e">e</A></H2>
+<DIR>
+<LI><A HREF="gzip_6.html#IDX6">Environment</A>
+</DIR>
+<H2><A NAME="cindex_i">i</A></H2>
+<DIR>
+<LI><A HREF="gzip_4.html#IDX3">invoking</A>
+</DIR>
+<H2><A NAME="cindex_o">o</A></H2>
+<DIR>
+<LI><A HREF="gzip_4.html#IDX4">options</A>
+<LI><A HREF="gzip_2.html#IDX1">overview</A>
+</DIR>
+<H2><A NAME="cindex_s">s</A></H2>
+<DIR>
+<LI><A HREF="gzip_3.html#IDX2">sample</A>
+</DIR>
+<H2><A NAME="cindex_t">t</A></H2>
+<DIR>
+<LI><A HREF="gzip_7.html#IDX7">tapes</A>
+</DIR>
+
+
+<P><HR><P>
+Go to the <A HREF="gzip_1.html">first</A>, <A HREF="gzip_8.html">previous</A>, next, last section, <A HREF="gzip_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/gzip_toc.html b/Build/source/utils/gzip/gzip_toc.html
new file mode 100644
index 00000000000..85fe87dc289
--- /dev/null
+++ b/Build/source/utils/gzip/gzip_toc.html
@@ -0,0 +1,34 @@
+<HTML>
+<HEAD>
+<!-- Created by texi2html 1.56k from gzip.texi on 9 August 2001 -->
+
+<TITLE>Gzip User's Manual - Table of Contents</TITLE>
+</HEAD>
+<BODY>
+<H1>gzip</H1>
+<H2>The data compression program</H2>
+<H2>Edition 1.2.4, for Gzip Version 1.2.4</H2>
+<H2>July 1993</H2>
+<ADDRESS>by Jean-loup Gailly</ADDRESS>
+<P>
+<P><HR><P>
+<UL>
+<LI><A NAME="TOC1" HREF="gzip_1.html#SEC1">GNU GENERAL PUBLIC LICENSE</A>
+<UL>
+<LI><A NAME="TOC2" HREF="gzip_1.html#SEC2">Preamble</A>
+<LI><A NAME="TOC3" HREF="gzip_1.html#SEC3">How to Apply These Terms to Your New Programs</A>
+</UL>
+<LI><A NAME="TOC4" HREF="gzip_2.html#SEC4">1. Overview</A>
+<LI><A NAME="TOC5" HREF="gzip_3.html#SEC5">2. Sample Output</A>
+<LI><A NAME="TOC6" HREF="gzip_4.html#SEC6">3. Invoking <CODE>gzip</CODE></A>
+<LI><A NAME="TOC7" HREF="gzip_5.html#SEC7">4. Advanced usage</A>
+<LI><A NAME="TOC8" HREF="gzip_6.html#SEC8">5. Environment</A>
+<LI><A NAME="TOC9" HREF="gzip_7.html#SEC9">6. Using <CODE>gzip</CODE> on tapes</A>
+<LI><A NAME="TOC10" HREF="gzip_8.html#SEC10">7. Reporting Bugs</A>
+<LI><A NAME="TOC11" HREF="gzip_9.html#SEC11">Concept Index</A>
+</UL>
+<P><HR><P>
+This document was generated on 9 August 2001 using
+<A HREF="http://wwwinfo.cern.ch/dis/texi2html/">texi2html</A>&nbsp;1.56k.
+</BODY>
+</HTML>
diff --git a/Build/source/utils/gzip/inflate.c b/Build/source/utils/gzip/inflate.c
new file mode 100644
index 00000000000..ede365622b4
--- /dev/null
+++ b/Build/source/utils/gzip/inflate.c
@@ -0,0 +1,954 @@
+/* inflate.c -- Not copyrighted 1992 by Mark Adler
+ version c10p1, 10 January 1993 */
+
+/* You can do whatever you like with this source file, though I would
+ prefer that if you modify it and redistribute it that you include
+ comments to that effect with your name and the date. Thank you.
+ [The history has been moved to the file ChangeLog.]
+ */
+
+/*
+ Inflate deflated (PKZIP's method 8 compressed) data. The compression
+ method searches for as much of the current string of bytes (up to a
+ length of 258) in the previous 32K bytes. If it doesn't find any
+ matches (of at least length 3), it codes the next byte. Otherwise, it
+ codes the length of the matched string and its distance backwards from
+ the current position. There is a single Huffman code that codes both
+ single bytes (called "literals") and match lengths. A second Huffman
+ code codes the distance information, which follows a length code. Each
+ length or distance code actually represents a base value and a number
+ of "extra" (sometimes zero) bits to get to add to the base value. At
+ the end of each deflated block is a special end-of-block (EOB) literal/
+ length code. The decoding process is basically: get a literal/length
+ code; if EOB then done; if a literal, emit the decoded byte; if a
+ length then get the distance and emit the referred-to bytes from the
+ sliding window of previously emitted data.
+
+ There are (currently) three kinds of inflate blocks: stored, fixed, and
+ dynamic. The compressor deals with some chunk of data at a time, and
+ decides which method to use on a chunk-by-chunk basis. A chunk might
+ typically be 32K or 64K. If the chunk is uncompressible, then the
+ "stored" method is used. In this case, the bytes are simply stored as
+ is, eight bits per byte, with none of the above coding. The bytes are
+ preceded by a count, since there is no longer an EOB code.
+
+ If the data is compressible, then either the fixed or dynamic methods
+ are used. In the dynamic method, the compressed data is preceded by
+ an encoding of the literal/length and distance Huffman codes that are
+ to be used to decode this block. The representation is itself Huffman
+ coded, and so is preceded by a description of that code. These code
+ descriptions take up a little space, and so for small blocks, there is
+ a predefined set of codes, called the fixed codes. The fixed method is
+ used if the block codes up smaller that way (usually for quite small
+ chunks), otherwise the dynamic method is used. In the latter case, the
+ codes are customized to the probabilities in the current block, and so
+ can code it much better than the pre-determined fixed codes.
+
+ The Huffman codes themselves are decoded using a mutli-level table
+ lookup, in order to maximize the speed of decoding plus the speed of
+ building the decoding tables. See the comments below that precede the
+ lbits and dbits tuning parameters.
+ */
+
+
+/*
+ Notes beyond the 1.93a appnote.txt:
+
+ 1. Distance pointers never point before the beginning of the output
+ stream.
+ 2. Distance pointers can point back across blocks, up to 32k away.
+ 3. There is an implied maximum of 7 bits for the bit length table and
+ 15 bits for the actual data.
+ 4. If only one code exists, then it is encoded using one bit. (Zero
+ would be more efficient, but perhaps a little confusing.) If two
+ codes exist, they are coded using one bit each (0 and 1).
+ 5. There is no way of sending zero distance codes--a dummy must be
+ sent if there are none. (History: a pre 2.0 version of PKZIP would
+ store blocks with no distance codes, but this was discovered to be
+ too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
+ zero distance codes, which is sent as one code of zero bits in
+ length.
+ 6. There are up to 286 literal/length codes. Code 256 represents the
+ end-of-block. Note however that the static length tree defines
+ 288 codes just to fill out the Huffman codes. Codes 286 and 287
+ cannot be used though, since there is no length base or extra bits
+ defined for them. Similarly, there are up to 30 distance codes.
+ However, static trees define 32 codes (all 5 bits) to fill out the
+ Huffman codes, but the last two had better not show up in the data.
+ 7. Unzip can check dynamic Huffman blocks for complete code sets.
+ The exception is that a single code would not be complete (see #4).
+ 8. The five bits following the block type is really the number of
+ literal codes sent minus 257.
+ 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
+ (1+6+6). Therefore, to output three times the length, you output
+ three codes (1+1+1), whereas to output four times the same length,
+ you only need two codes (1+3). Hmm.
+ 10. In the tree reconstruction algorithm, Code = Code + Increment
+ only if BitLength(i) is not zero. (Pretty obvious.)
+ 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
+ 12. Note: length code 284 can represent 227-258, but length code 285
+ really is 258. The last length deserves its own, short code
+ since it gets used a lot in very redundant files. The length
+ 258 is special since 258 - 3 (the min match length) is 255.
+ 13. The literal/length and distance code bit lengths are read as a
+ single stream of lengths. It is possible (and advantageous) for
+ a repeat code (16, 17, or 18) to go across the boundary between
+ the two sets of lengths.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp $";
+#endif
+
+#include <sys/types.h>
+
+#include "tailor.h"
+
+#if defined(STDC_HEADERS) || !defined(NO_STDLIB_H)
+# include <stdlib.h>
+#endif
+
+#include "gzip.h"
+#define slide window
+
+/* Huffman code lookup table entry--this entry is four bytes for machines
+ that have 16-bit pointers (e.g. PC's in the small or medium model).
+ Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16
+ means that v is a literal, 16 < e < 32 means that v is a pointer to
+ the next table, which codes e - 16 bits, and lastly e == 99 indicates
+ an unused code. If a code with e == 99 is looked up, this implies an
+ error in the data. */
+struct huft {
+ uch e; /* number of extra bits or operation */
+ uch b; /* number of bits in this code or subcode */
+ union {
+ ush n; /* literal, length base, or distance base */
+ struct huft *t; /* pointer to next level of table */
+ } v;
+};
+
+
+/* Function prototypes */
+int huft_build OF((unsigned *, unsigned, unsigned, ush *, ush *,
+ struct huft **, int *));
+int huft_free OF((struct huft *));
+int inflate_codes OF((struct huft *, struct huft *, int, int));
+int inflate_stored OF((void));
+int inflate_fixed OF((void));
+int inflate_dynamic OF((void));
+int inflate_block OF((int *));
+int inflate OF((void));
+
+
+/* The inflate algorithm uses a sliding 32K byte window on the uncompressed
+ stream to find repeated byte strings. This is implemented here as a
+ circular buffer. The index is updated simply by incrementing and then
+ and'ing with 0x7fff (32K-1). */
+/* It is left to other modules to supply the 32K area. It is assumed
+ to be usable as if it were declared "uch slide[32768];" or as just
+ "uch *slide;" and then malloc'ed in the latter case. The definition
+ must be in unzip.h, included above. */
+/* unsigned wp; current position in slide */
+#define wp outcnt
+#define flush_output(w) (wp=(w),flush_window())
+
+/* Tables for deflate from PKZIP's appnote.txt. */
+static unsigned border[] = { /* Order of the bit length code lengths */
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+static ush cplens[] = { /* Copy lengths for literal codes 257..285 */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ /* note: see note #13 above about the 258 in this list. */
+static ush cplext[] = { /* Extra bits for literal codes 257..285 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */
+static ush cpdist[] = { /* Copy offsets for distance codes 0..29 */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577};
+static ush cpdext[] = { /* Extra bits for distance codes */
+ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+ 12, 12, 13, 13};
+
+
+
+/* Macros for inflate() bit peeking and grabbing.
+ The usage is:
+
+ NEEDBITS(j)
+ x = b & mask_bits[j];
+ DUMPBITS(j)
+
+ where NEEDBITS makes sure that b has at least j bits in it, and
+ DUMPBITS removes the bits from b. The macros use the variable k
+ for the number of bits in b. Normally, b and k are register
+ variables for speed, and are initialized at the beginning of a
+ routine that uses these macros from a global bit buffer and count.
+
+ If we assume that EOB will be the longest code, then we will never
+ ask for bits with NEEDBITS that are beyond the end of the stream.
+ So, NEEDBITS should not read any more bytes than are needed to
+ meet the request. Then no bytes need to be "returned" to the buffer
+ at the end of the last block.
+
+ However, this assumption is not true for fixed blocks--the EOB code
+ is 7 bits, but the other literal/length codes can be 8 or 9 bits.
+ (The EOB code is shorter than other codes because fixed blocks are
+ generally short. So, while a block always has an EOB, many other
+ literal/length codes have a significantly lower probability of
+ showing up at all.) However, by making the first table have a
+ lookup of seven bits, the EOB code will be found in that first
+ lookup, and so will not require that too many bits be pulled from
+ the stream.
+ */
+
+ulg bb; /* bit buffer */
+unsigned bk; /* bits in bit buffer */
+
+ush mask_bits[] = {
+ 0x0000,
+ 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
+ 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
+};
+
+#ifdef CRYPT
+ uch cc;
+# define NEXTBYTE() \
+ (decrypt ? (cc = get_byte(), zdecode(cc), cc) : get_byte())
+#else
+# define NEXTBYTE() (uch)get_byte()
+#endif
+#define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
+#define DUMPBITS(n) {b>>=(n);k-=(n);}
+
+
+/*
+ Huffman code decoding is performed using a multi-level table lookup.
+ The fastest way to decode is to simply build a lookup table whose
+ size is determined by the longest code. However, the time it takes
+ to build this table can also be a factor if the data being decoded
+ is not very long. The most common codes are necessarily the
+ shortest codes, so those codes dominate the decoding time, and hence
+ the speed. The idea is you can have a shorter table that decodes the
+ shorter, more probable codes, and then point to subsidiary tables for
+ the longer codes. The time it costs to decode the longer codes is
+ then traded against the time it takes to make longer tables.
+
+ This results of this trade are in the variables lbits and dbits
+ below. lbits is the number of bits the first level table for literal/
+ length codes can decode in one step, and dbits is the same thing for
+ the distance codes. Subsequent tables are also less than or equal to
+ those sizes. These values may be adjusted either when all of the
+ codes are shorter than that, in which case the longest code length in
+ bits is used, or when the shortest code is *longer* than the requested
+ table size, in which case the length of the shortest code in bits is
+ used.
+
+ There are two different values for the two tables, since they code a
+ different number of possibilities each. The literal/length table
+ codes 286 possible values, or in a flat code, a little over eight
+ bits. The distance table codes 30 possible values, or a little less
+ than five bits, flat. The optimum values for speed end up being
+ about one bit more than those, so lbits is 8+1 and dbits is 5+1.
+ The optimum values may differ though from machine to machine, and
+ possibly even between compilers. Your mileage may vary.
+ */
+
+
+int lbits = 9; /* bits in base literal/length lookup table */
+int dbits = 6; /* bits in base distance lookup table */
+
+
+/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
+#define BMAX 16 /* maximum bit length of any code (16 for explode) */
+#define N_MAX 288 /* maximum number of codes in any set */
+
+
+unsigned hufts; /* track memory usage */
+
+
+int huft_build(b, n, s, d, e, t, m)
+unsigned *b; /* code lengths in bits (all assumed <= BMAX) */
+unsigned n; /* number of codes (assumed <= N_MAX) */
+unsigned s; /* number of simple-valued codes (0..s-1) */
+ush *d; /* list of base values for non-simple codes */
+ush *e; /* list of extra bits for non-simple codes */
+struct huft **t; /* result: starting table */
+int *m; /* maximum lookup bits, returns actual */
+/* Given a list of code lengths and a maximum table size, make a set of
+ tables to decode that set of codes. Return zero on success, one if
+ the given code set is incomplete (the tables are still built in this
+ case), two if the input is invalid (all zero length codes or an
+ oversubscribed set of lengths), and three if not enough memory. */
+{
+ unsigned a; /* counter for codes of length k */
+ unsigned c[BMAX+1]; /* bit length count table */
+ unsigned f; /* i repeats in table every f entries */
+ int g; /* maximum code length */
+ int h; /* table level */
+ register unsigned i; /* counter, current code */
+ register unsigned j; /* counter */
+ register int k; /* number of bits in current code */
+ int l; /* bits per table (returned in m) */
+ register unsigned *p; /* pointer into c[], b[], or v[] */
+ register struct huft *q; /* points to current table */
+ struct huft r; /* table entry for structure assignment */
+ struct huft *u[BMAX]; /* table stack */
+ unsigned v[N_MAX]; /* values in order of bit length */
+ register int w; /* bits before this table == (l * h) */
+ unsigned x[BMAX+1]; /* bit offsets, then code stack */
+ unsigned *xp; /* pointer into x */
+ int y; /* number of dummy codes added */
+ unsigned z; /* number of entries in current table */
+
+
+ /* Generate counts for each bit length */
+ memzero(c, sizeof(c));
+ p = b; i = n;
+ do {
+ Tracecv(*p, (stderr, (n-i >= ' ' && n-i <= '~' ? "%c %d\n" : "0x%x %d\n"),
+ n-i, *p));
+ c[*p]++; /* assume all entries <= BMAX */
+ p++; /* Can't combine with above line (Solaris bug) */
+ } while (--i);
+ if (c[0] == n) /* null input--all zero length codes */
+ {
+ *t = (struct huft *)NULL;
+ *m = 0;
+ return 0;
+ }
+
+
+ /* Find minimum and maximum length, bound *m by those */
+ l = *m;
+ for (j = 1; j <= BMAX; j++)
+ if (c[j])
+ break;
+ k = j; /* minimum code length */
+ if ((unsigned)l < j)
+ l = j;
+ for (i = BMAX; i; i--)
+ if (c[i])
+ break;
+ g = i; /* maximum code length */
+ if ((unsigned)l > i)
+ l = i;
+ *m = l;
+
+
+ /* Adjust last length count to fill out codes, if needed */
+ for (y = 1 << j; j < i; j++, y <<= 1)
+ if ((y -= c[j]) < 0)
+ return 2; /* bad input: more codes than bits */
+ if ((y -= c[i]) < 0)
+ return 2;
+ c[i] += y;
+
+
+ /* Generate starting offsets into the value table for each length */
+ x[1] = j = 0;
+ p = c + 1; xp = x + 2;
+ while (--i) { /* note that i == g from above */
+ *xp++ = (j += *p++);
+ }
+
+
+ /* Make a table of values in order of bit lengths */
+ p = b; i = 0;
+ do {
+ if ((j = *p++) != 0)
+ v[x[j]++] = i;
+ } while (++i < n);
+
+
+ /* Generate the Huffman codes and for each, make the table entries */
+ x[0] = i = 0; /* first Huffman code is zero */
+ p = v; /* grab values in bit order */
+ h = -1; /* no tables yet--level -1 */
+ w = -l; /* bits decoded == (l * h) */
+ u[0] = (struct huft *)NULL; /* just to keep compilers happy */
+ q = (struct huft *)NULL; /* ditto */
+ z = 0; /* ditto */
+
+ /* go through the bit lengths (k already is bits in shortest code) */
+ for (; k <= g; k++)
+ {
+ a = c[k];
+ while (a--)
+ {
+ /* here i is the Huffman code of length k bits for value *p */
+ /* make tables up to required level */
+ while (k > w + l)
+ {
+ h++;
+ w += l; /* previous table always l bits */
+
+ /* compute minimum size table less than or equal to l bits */
+ z = (z = g - w) > (unsigned)l ? l : z; /* upper limit on table size */
+ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
+ { /* too few codes for k-w bit table */
+ f -= a + 1; /* deduct codes from patterns left */
+ xp = c + k;
+ while (++j < z) /* try smaller tables up to z bits */
+ {
+ if ((f <<= 1) <= *++xp)
+ break; /* enough codes to use up j bits */
+ f -= *xp; /* else deduct codes from patterns */
+ }
+ }
+ z = 1 << j; /* table entries for j-bit table */
+
+ /* allocate and link in new table */
+ if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) ==
+ (struct huft *)NULL)
+ {
+ if (h)
+ huft_free(u[0]);
+ return 3; /* not enough memory */
+ }
+ hufts += z + 1; /* track memory usage */
+ *t = q + 1; /* link to list for huft_free() */
+ *(t = &(q->v.t)) = (struct huft *)NULL;
+ u[h] = ++q; /* table starts after link */
+
+ /* connect to last table, if there is one */
+ if (h)
+ {
+ x[h] = i; /* save pattern for backing up */
+ r.b = (uch)l; /* bits to dump before this table */
+ r.e = (uch)(16 + j); /* bits in this table */
+ r.v.t = q; /* pointer to this table */
+ j = i >> (w - l); /* (get around Turbo C bug) */
+ u[h-1][j] = r; /* connect to last table */
+ }
+ }
+
+ /* set up table entry in r */
+ r.b = (uch)(k - w);
+ if (p >= v + n)
+ r.e = 99; /* out of values--invalid code */
+ else if (*p < s)
+ {
+ r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */
+ r.v.n = (ush)(*p); /* simple code is just the value */
+ p++; /* one compiler does not like *p++ */
+ }
+ else
+ {
+ r.e = (uch)e[*p - s]; /* non-simple--look up in lists */
+ r.v.n = d[*p++ - s];
+ }
+
+ /* fill code-like entries with r */
+ f = 1 << (k - w);
+ for (j = i >> w; j < z; j += f)
+ q[j] = r;
+
+ /* backwards increment the k-bit code i */
+ for (j = 1 << (k - 1); i & j; j >>= 1)
+ i ^= j;
+ i ^= j;
+
+ /* backup over finished tables */
+ while ((i & ((1 << w) - 1)) != x[h])
+ {
+ h--; /* don't need to update q */
+ w -= l;
+ }
+ }
+ }
+
+
+ /* Return true (1) if we were given an incomplete table */
+ return y != 0 && g != 1;
+}
+
+
+
+int huft_free(t)
+struct huft *t; /* table to free */
+/* Free the malloc'ed tables built by huft_build(), which makes a linked
+ list of the tables it made, with the links in a dummy first entry of
+ each table. */
+{
+ register struct huft *p, *q;
+
+
+ /* Go through linked list, freeing from the malloced (t[-1]) address. */
+ p = t;
+ while (p != (struct huft *)NULL)
+ {
+ q = (--p)->v.t;
+ free((char*)p);
+ p = q;
+ }
+ return 0;
+}
+
+
+int inflate_codes(tl, td, bl, bd)
+struct huft *tl, *td; /* literal/length and distance decoder tables */
+int bl, bd; /* number of bits decoded by tl[] and td[] */
+/* inflate (decompress) the codes in a deflated (compressed) block.
+ Return an error code or zero if it all goes ok. */
+{
+ register unsigned e; /* table entry flag/number of extra bits */
+ unsigned n, d; /* length and index for copy */
+ unsigned w; /* current window position */
+ struct huft *t; /* pointer to table entry */
+ unsigned ml, md; /* masks for bl and bd bits */
+ register ulg b; /* bit buffer */
+ register unsigned k; /* number of bits in bit buffer */
+
+
+ /* make local copies of globals */
+ b = bb; /* initialize bit buffer */
+ k = bk;
+ w = wp; /* initialize window position */
+
+ /* inflate the coded data */
+ ml = mask_bits[bl]; /* precompute masks for speed */
+ md = mask_bits[bd];
+ for (;;) /* do until end of block */
+ {
+ NEEDBITS((unsigned)bl)
+ if ((e = (t = tl + ((unsigned)b & ml))->e) > 16)
+ do {
+ if (e == 99)
+ return 1;
+ DUMPBITS(t->b)
+ e -= 16;
+ NEEDBITS(e)
+ } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);
+ DUMPBITS(t->b)
+ if (e == 16) /* then it's a literal */
+ {
+ slide[w++] = (uch)t->v.n;
+ Tracevv((stderr, "%c", slide[w-1]));
+ if (w == WSIZE)
+ {
+ flush_output(w);
+ w = 0;
+ }
+ }
+ else /* it's an EOB or a length */
+ {
+ /* exit if end of block */
+ if (e == 15)
+ break;
+
+ /* get length of block to copy */
+ NEEDBITS(e)
+ n = t->v.n + ((unsigned)b & mask_bits[e]);
+ DUMPBITS(e);
+
+ /* decode distance of block to copy */
+ NEEDBITS((unsigned)bd)
+ if ((e = (t = td + ((unsigned)b & md))->e) > 16)
+ do {
+ if (e == 99)
+ return 1;
+ DUMPBITS(t->b)
+ e -= 16;
+ NEEDBITS(e)
+ } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);
+ DUMPBITS(t->b)
+ NEEDBITS(e)
+ d = w - t->v.n - ((unsigned)b & mask_bits[e]);
+ DUMPBITS(e)
+ Tracevv((stderr,"\\[%d,%d]", w-d, n));
+
+ /* do the copy */
+ do {
+ n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e);
+#if !defined(NOMEMCPY) && !defined(DEBUG)
+ if (w - d >= e) /* (this test assumes unsigned comparison) */
+ {
+ memcpy(slide + w, slide + d, e);
+ w += e;
+ d += e;
+ }
+ else /* do it slow to avoid memcpy() overlap */
+#endif /* !NOMEMCPY */
+ do {
+ slide[w++] = slide[d++];
+ Tracevv((stderr, "%c", slide[w-1]));
+ } while (--e);
+ if (w == WSIZE)
+ {
+ flush_output(w);
+ w = 0;
+ }
+ } while (n);
+ }
+ }
+
+
+ /* restore the globals from the locals */
+ wp = w; /* restore global window pointer */
+ bb = b; /* restore global bit buffer */
+ bk = k;
+
+ /* done */
+ return 0;
+}
+
+
+
+int inflate_stored()
+/* "decompress" an inflated type 0 (stored) block. */
+{
+ unsigned n; /* number of bytes in block */
+ unsigned w; /* current window position */
+ register ulg b; /* bit buffer */
+ register unsigned k; /* number of bits in bit buffer */
+
+
+ /* make local copies of globals */
+ b = bb; /* initialize bit buffer */
+ k = bk;
+ w = wp; /* initialize window position */
+
+
+ /* go to byte boundary */
+ n = k & 7;
+ DUMPBITS(n);
+
+
+ /* get the length and its complement */
+ NEEDBITS(16)
+ n = ((unsigned)b & 0xffff);
+ DUMPBITS(16)
+ NEEDBITS(16)
+ if (n != (unsigned)((~b) & 0xffff))
+ return 1; /* error in compressed data */
+ DUMPBITS(16)
+
+
+ /* read and output the compressed data */
+ while (n--)
+ {
+ NEEDBITS(8)
+ slide[w++] = (uch)b;
+ if (w == WSIZE)
+ {
+ flush_output(w);
+ w = 0;
+ }
+ DUMPBITS(8)
+ }
+
+
+ /* restore the globals from the locals */
+ wp = w; /* restore global window pointer */
+ bb = b; /* restore global bit buffer */
+ bk = k;
+ return 0;
+}
+
+
+
+int inflate_fixed()
+/* decompress an inflated type 1 (fixed Huffman codes) block. We should
+ either replace this with a custom decoder, or at least precompute the
+ Huffman tables. */
+{
+ int i; /* temporary variable */
+ struct huft *tl; /* literal/length code table */
+ struct huft *td; /* distance code table */
+ int bl; /* lookup bits for tl */
+ int bd; /* lookup bits for td */
+ unsigned l[288]; /* length list for huft_build */
+
+
+ /* set up literal table */
+ for (i = 0; i < 144; i++)
+ l[i] = 8;
+ for (; i < 256; i++)
+ l[i] = 9;
+ for (; i < 280; i++)
+ l[i] = 7;
+ for (; i < 288; i++) /* make a complete, but wrong code set */
+ l[i] = 8;
+ bl = 7;
+ if ((i = huft_build(l, 288, 257, cplens, cplext, &tl, &bl)) != 0)
+ return i;
+
+
+ /* set up distance table */
+ for (i = 0; i < 30; i++) /* make an incomplete code set */
+ l[i] = 5;
+ bd = 5;
+ if ((i = huft_build(l, 30, 0, cpdist, cpdext, &td, &bd)) > 1)
+ {
+ huft_free(tl);
+ return i;
+ }
+
+
+ /* decompress until an end-of-block code */
+ if (inflate_codes(tl, td, bl, bd))
+ return 1;
+
+
+ /* free the decoding tables, return */
+ huft_free(tl);
+ huft_free(td);
+ return 0;
+}
+
+
+
+int inflate_dynamic()
+/* decompress an inflated type 2 (dynamic Huffman codes) block. */
+{
+ int i; /* temporary variables */
+ unsigned j;
+ unsigned l; /* last length */
+ unsigned m; /* mask for bit lengths table */
+ unsigned n; /* number of lengths to get */
+ struct huft *tl; /* literal/length code table */
+ struct huft *td; /* distance code table */
+ int bl; /* lookup bits for tl */
+ int bd; /* lookup bits for td */
+ unsigned nb; /* number of bit length codes */
+ unsigned nl; /* number of literal/length codes */
+ unsigned nd; /* number of distance codes */
+#ifdef PKZIP_BUG_WORKAROUND
+ unsigned ll[288+32]; /* literal/length and distance code lengths */
+#else
+ unsigned ll[286+30]; /* literal/length and distance code lengths */
+#endif
+ register ulg b; /* bit buffer */
+ register unsigned k; /* number of bits in bit buffer */
+
+
+ /* make local bit buffer */
+ b = bb;
+ k = bk;
+
+
+ /* read in table lengths */
+ NEEDBITS(5)
+ nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */
+ DUMPBITS(5)
+ NEEDBITS(5)
+ nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */
+ DUMPBITS(5)
+ NEEDBITS(4)
+ nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */
+ DUMPBITS(4)
+#ifdef PKZIP_BUG_WORKAROUND
+ if (nl > 288 || nd > 32)
+#else
+ if (nl > 286 || nd > 30)
+#endif
+ return 1; /* bad lengths */
+
+
+ /* read in bit-length-code lengths */
+ for (j = 0; j < nb; j++)
+ {
+ NEEDBITS(3)
+ ll[border[j]] = (unsigned)b & 7;
+ DUMPBITS(3)
+ }
+ for (; j < 19; j++)
+ ll[border[j]] = 0;
+
+
+ /* build decoding table for trees--single level, 7 bit lookup */
+ bl = 7;
+ if ((i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0)
+ {
+ if (i == 1)
+ huft_free(tl);
+ return i; /* incomplete code set */
+ }
+
+
+ /* read in literal and distance code lengths */
+ n = nl + nd;
+ m = mask_bits[bl];
+ i = l = 0;
+ while ((unsigned)i < n)
+ {
+ NEEDBITS((unsigned)bl)
+ j = (td = tl + ((unsigned)b & m))->b;
+ DUMPBITS(j)
+ j = td->v.n;
+ if (j < 16) /* length of code in bits (0..15) */
+ ll[i++] = l = j; /* save last length in l */
+ else if (j == 16) /* repeat last length 3 to 6 times */
+ {
+ NEEDBITS(2)
+ j = 3 + ((unsigned)b & 3);
+ DUMPBITS(2)
+ if ((unsigned)i + j > n)
+ return 1;
+ while (j--)
+ ll[i++] = l;
+ }
+ else if (j == 17) /* 3 to 10 zero length codes */
+ {
+ NEEDBITS(3)
+ j = 3 + ((unsigned)b & 7);
+ DUMPBITS(3)
+ if ((unsigned)i + j > n)
+ return 1;
+ while (j--)
+ ll[i++] = 0;
+ l = 0;
+ }
+ else /* j == 18: 11 to 138 zero length codes */
+ {
+ NEEDBITS(7)
+ j = 11 + ((unsigned)b & 0x7f);
+ DUMPBITS(7)
+ if ((unsigned)i + j > n)
+ return 1;
+ while (j--)
+ ll[i++] = 0;
+ l = 0;
+ }
+ }
+
+
+ /* free decoding table for trees */
+ huft_free(tl);
+
+
+ /* restore the global bit buffer */
+ bb = b;
+ bk = k;
+
+
+ /* build the decoding tables for literal/length and distance codes */
+ bl = lbits;
+ if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0)
+ {
+ if (i == 1) {
+ fprintf(stderr, " incomplete literal tree\n");
+ huft_free(tl);
+ }
+ return i; /* incomplete code set */
+ }
+ bd = dbits;
+ if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0)
+ {
+ if (i == 1) {
+ fprintf(stderr, " incomplete distance tree\n");
+#ifdef PKZIP_BUG_WORKAROUND
+ i = 0;
+ }
+#else
+ huft_free(td);
+ }
+ huft_free(tl);
+ return i; /* incomplete code set */
+#endif
+ }
+
+
+ /* decompress until an end-of-block code */
+ if (inflate_codes(tl, td, bl, bd))
+ return 1;
+
+
+ /* free the decoding tables, return */
+ huft_free(tl);
+ huft_free(td);
+ return 0;
+}
+
+
+
+int inflate_block(e)
+int *e; /* last block flag */
+/* decompress an inflated block */
+{
+ unsigned t; /* block type */
+ register ulg b; /* bit buffer */
+ register unsigned k; /* number of bits in bit buffer */
+
+
+ /* make local bit buffer */
+ b = bb;
+ k = bk;
+
+
+ /* read in last block bit */
+ NEEDBITS(1)
+ *e = (int)b & 1;
+ DUMPBITS(1)
+
+
+ /* read in block type */
+ NEEDBITS(2)
+ t = (unsigned)b & 3;
+ DUMPBITS(2)
+
+
+ /* restore the global bit buffer */
+ bb = b;
+ bk = k;
+
+
+ /* inflate that block type */
+ if (t == 2)
+ return inflate_dynamic();
+ if (t == 0)
+ return inflate_stored();
+ if (t == 1)
+ return inflate_fixed();
+
+
+ /* bad block type */
+ return 2;
+}
+
+
+
+int inflate()
+/* decompress an inflated entry */
+{
+ int e; /* last block flag */
+ int r; /* result code */
+ unsigned h; /* maximum struct huft's malloc'ed */
+
+
+ /* initialize window, bit buffer */
+ wp = 0;
+ bk = 0;
+ bb = 0;
+
+
+ /* decompress until the last block */
+ h = 0;
+ do {
+ hufts = 0;
+ if ((r = inflate_block(&e)) != 0)
+ return r;
+ if (hufts > h)
+ h = hufts;
+ } while (!e);
+
+ /* Undo too much lookahead. The next read will be byte aligned so we
+ * can discard unused bits in the last meaningful byte.
+ */
+ while (bk >= 8) {
+ bk -= 8;
+ inptr--;
+ }
+
+ /* flush out slide */
+ flush_output(wp);
+
+
+ /* return success */
+#ifdef DEBUG
+ fprintf(stderr, "<%u> ", h);
+#endif /* DEBUG */
+ return 0;
+}
diff --git a/Build/source/utils/gzip/lzw.c b/Build/source/utils/gzip/lzw.c
new file mode 100644
index 00000000000..12bf5c611d0
--- /dev/null
+++ b/Build/source/utils/gzip/lzw.c
@@ -0,0 +1,26 @@
+/* lzw.c -- compress files in LZW format.
+ * This is a dummy version avoiding patent problems.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: lzw.c,v 0.9 1993/06/10 13:27:31 jloup Exp $";
+#endif
+
+#include "tailor.h"
+#include "gzip.h"
+#include "lzw.h"
+
+static int msg_done = 0;
+
+/* Compress in to out with lzw method. */
+int lzw(in, out)
+ int in, out;
+{
+ if (msg_done) return ERROR;
+ msg_done = 1;
+ fprintf(stderr,"output in compress .Z format not supported\n");
+ if (in != out) { /* avoid warnings on unused variables */
+ exit_code = ERROR;
+ }
+ return ERROR;
+}
diff --git a/Build/source/utils/gzip/lzw.h b/Build/source/utils/gzip/lzw.h
new file mode 100644
index 00000000000..4b7ac8680e1
--- /dev/null
+++ b/Build/source/utils/gzip/lzw.h
@@ -0,0 +1,42 @@
+/* lzw.h -- define the lzw functions.
+ * Copyright (C) 1992-1993 Jean-loup Gailly.
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+#if !defined(OF) && defined(lint)
+# include "gzip.h"
+#endif
+
+#ifndef BITS
+# define BITS 16
+#endif
+#define INIT_BITS 9 /* Initial number of bits per code */
+
+#define LZW_MAGIC "\037\235" /* Magic header for lzw files, 1F 9D */
+
+#define BIT_MASK 0x1f /* Mask for 'number of compression bits' */
+/* Mask 0x20 is reserved to mean a fourth header byte, and 0x40 is free.
+ * It's a pity that old uncompress does not check bit 0x20. That makes
+ * extension of the format actually undesirable because old compress
+ * would just crash on the new format instead of giving a meaningful
+ * error message. It does check the number of bits, but it's more
+ * helpful to say "unsupported format, get a new version" than
+ * "can only handle 16 bits".
+ */
+
+#define BLOCK_MODE 0x80
+/* Block compression: if table is full and compression rate is dropping,
+ * clear the dictionary.
+ */
+
+#define LZW_RESERVED 0x60 /* reserved bits */
+
+#define CLEAR 256 /* flush the dictionary */
+#define FIRST (CLEAR+1) /* first free entry */
+
+extern int maxbits; /* max bits per code for LZW */
+extern int block_mode; /* block compress mode -C compatible with 2.0 */
+
+extern int lzw OF((int in, int out));
+extern int unlzw OF((int in, int out));
diff --git a/Build/source/utils/gzip/man.ps b/Build/source/utils/gzip/man.ps
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Build/source/utils/gzip/man.ps
diff --git a/Build/source/utils/gzip/msdos/Makefile.bor b/Build/source/utils/gzip/msdos/Makefile.bor
new file mode 100644
index 00000000000..1165b7cff52
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/Makefile.bor
@@ -0,0 +1,118 @@
+# Makefile for gzip
+# Borland (Turbo) C++.
+# Warning: this file is not suitable for Turbo C 2.0. In this case, read
+# then invoke the file doturboc.bat.
+
+# To use, do "make -fmakefile.bor"
+
+# Turbo C++ 1.0 seems to have a buggy exit() function. You must add
+# to CFLAGS: -Dexit=_exit
+
+# WARNING: the small model is not supported. The compact model is used
+# here. If you want to use the large model, add -D__LARGE__ to ASFLAGS
+# Add -DSMALL_MEM to CFLAGS if you wish to reduce the memory
+# requirements. Add -DNO_ASM to CFLAGS and remove match.obj from OBJA if
+# you do not have tasm.
+
+# ------------- Turbo C++, Borland C++ -------------
+MODEL=-mc
+#CFLAGS=-w -w-eff -w-def -w-sig -w-cln -a -d -G -O -Z $(MODEL)
+CFLAGS=-O2 -Z $(MODEL)
+CC=bcc
+LD=bcc
+# replace bcc with tcc for Turbo C++ 1.0
+LDFLAGS=$(MODEL)
+AS=tasm
+ASFLAGS=-ml -t -DDYN_ALLOC -DSS_NEQ_DS
+LIB = c:\bcc\lib
+
+# ------------- Common declarations:
+STRIP=rem
+# If you don't have lzexe, get it (by ftp on wuarchive.wustl.edu
+# in /mirrors/msdos/filutl/lzexe91e.zip). Then define:
+#STRIP=lzexe
+# Or if you've registered PKLITE, then define:
+#STRIP=pklite
+# This makes a big difference in .exe size (and possibly load time)
+
+O=.obj
+OBJA=match$(O) tailor$(O) $(LIB)\wildargs.obj
+
+# ------------- Used by install rule
+# set BIN to the directory you want to install the executables to
+BIN = c:\bin
+
+# variables
+OBJ1 = gzip$(O) zip$(O) deflate$(O) trees$(O) bits$(O) unzip$(O) inflate$(O) \
+ util$(O)
+OBJ2 = crypt$(O) lzw$(O) unlzw$(O) unpack$(O) unlzh$(O) getopt$(O) $(OBJA)
+
+all: gzip.exe
+
+gzip.obj: gzip.c gzip.h tailor.h crypt.h revision.h lzw.h
+ $(CC) -c $(CFLAGS) $*.c
+
+zip.obj: zip.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+deflate.obj: deflate.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+trees.obj: trees.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+bits.obj: bits.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unzip.obj: unzip.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inflate.obj: inflate.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+util.obj: util.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+crypt.obj: crypt.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+lzw.obj: lzw.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unlzw.obj: unlzw.c gzip.h tailor.h lzw.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unpack.obj: unpack.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unlzh.obj: unlzh.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+tailor.obj: msdos\tailor.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) msdos\$*.c
+
+getopt.obj: getopt.c getopt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+match.obj: msdos\match.asm
+ $(AS) $(ASFLAGS) msdos\match, match;
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+gzip.exe: $(OBJ1) $(OBJ2)
+ echo $(OBJ1) > gzip.rsp
+ echo $(OBJ2) >> gzip.rsp
+ $(LD) $(LDFLAGS) @gzip.rsp
+ del gzip.rsp
+ $(STRIP) gzip.exe
+# If you use Borland make, you can use instead:
+# $(LD) $(LDFLAGS) @&&|
+#$**
+#|
+
+install: gzip.exe
+ copy /b gzip.exe $(BIN)
+ copy /b gzip.exe $(BIN)\gunzip.exe
+
+clean:
+ del *.obj
+ del *.exe
diff --git a/Build/source/utils/gzip/msdos/Makefile.djg b/Build/source/utils/gzip/msdos/Makefile.djg
new file mode 100644
index 00000000000..514d963d9e4
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/Makefile.djg
@@ -0,0 +1,224 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
+# Modified for GNUish make/MS_SH200/DJGPP 1.09+ by Eric Backus
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# $Id: Makefile.djg,v 1.3 1993/06/22 15:43:24 jloup Exp $
+
+#### Start of system configuration section. ####
+
+.SUFFIXES: .o
+LONGARGS = gcc:rm
+
+srcdir = .
+VPATH = .
+
+CC = gcc
+CPP = gcc -O -E
+
+INSTALL = install -c
+INSTALL_PROGRAM = $(INSTALL)
+INSTALL_DATA = $(INSTALL) -m 644
+
+# tailor.h defines things for DJGPP so nothing is needed here
+DEFS =
+LIBS =
+
+# additional assembly sources for particular systems may be required.
+OBJA = match.o
+
+SEDCMD = 1d
+
+CFLAGS = -O2 -finline-functions -fomit-frame-pointer
+LDFLAGS = -s
+
+X=.exe
+# For OS/2 or MSDOS, use: X=.exe
+
+O=.o
+# For OS/2 or MSDOS, use: O=.obj
+
+prefix = /usr/local
+exec_prefix = $(prefix)
+
+bindir = $(exec_prefix)/bin
+datadir = $(prefix)/lib
+libdir = $(prefix)/lib
+infodir = $(prefix)/info
+
+# Extension (not including `.') for the installed manual page filenames.
+manext = 1
+# Where to install the manual pages.
+mandir = $(prefix)/man/man$(manext)
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+LOADLIBES = $(LIBS)
+
+TAR = tar
+
+SRCS = gzip.c zip.c deflate.c trees.c bits.c unzip.c inflate.c util.c crypt.c\
+ lzw.c unlzw.c unpack.c unlzh.c makecrc.c getopt.c match.S
+
+OBJ1 = gzip$(O) zip$(O) deflate$(O) trees$(O) bits$(O) unzip$(O) inflate$(O) \
+ util$(O)
+OBJ2 = crypt$(O) lzw$(O) unlzw$(O) unpack$(O) unlzh$(O) getopt$(O) $(OBJA)
+
+HDRS = gzip.h lzw.h tailor.h revision.h crypt.h getopt.h
+
+.c$O:
+ $(CC) -c $(DEFS) $(CFLAGS) $<
+
+#.PHONY: default all force test check
+
+default: all
+all: gzip$X zcmp zdiff zmore znew zforce gzexe
+force:
+
+install: all
+ for f in gzip$X zcmp zdiff zmore znew zforce gzexe; do \
+ $(INSTALL_PROGRAM) $${f} $(bindir)/$${f}; done
+ for f in gunzip$X zcat$X ; do \
+ rm -f $(bindir)/$${f}; ln $(bindir)/gzip$X $(bindir)/$${f}; done
+ -cd $(srcdir); \
+ for f in gzip gunzip zcat zcmp zmore znew zforce gzexe; do \
+ rm -f $(mandir)/$${f}.$(manext); \
+ $(INSTALL_DATA) $${f}.1 $(mandir)/$${f}.$(manext); done
+ -cd $(srcdir); for f in gzip.info* ; do $(INSTALL_DATA) $${f} \
+ $(infodir)/$${f}; done
+
+uninstall: force
+ -cd $(bindir); rm -f gzip$X gunzip$X zcat$X \
+ zcmp zdiff zmore znew zforce gzexe
+ -for f in gzip gunzip zcat zcmp zmore znew gzexe; do \
+ rm -f $(mandir)/$${f}.$(manext); done
+ -cd $(infodir); rm -f gzip.info*
+
+# install all files and replace compress (not recommended)
+install_compress: install
+ -test -f $(bindir)/compress.old || \
+ mv $(bindir)/compress$X $(bindir)/compress.old
+ ln $(bindir)/gzip$X $(bindir)/compress$X
+ rm -f $(bindir)/uncompress$X
+ ln $(bindir)/gzip$X $(bindir)/uncompress$X
+
+test: check
+check: all
+ ./gzip -5 < $(srcdir)/texinfo.tex > _gztest.z
+ # Either GNUish make or MS_SH has trouble with backquotes
+ #@if test `wc -c < _gztest.z` -ne 30890; then \
+ # echo FAILED gzip test: incorrect size; rm -f _gztest*; exit 1; \
+ # else :; fi
+ @echo Should be 30890:\\c
+ @wc -c < _gztest.z
+ rm -f _gztest
+ ./gzip -d _gztest.z
+ @if cmp _gztest $(srcdir)/texinfo.tex; then \
+ echo gzip test OK; \
+ else \
+ echo FAILED gzip test: incorrect decompress; \
+ fi
+ rm -f _gztest*
+
+TAGS: $(SRCS) $(HDRS)
+ cd $(srcdir); etags $(SRCS) $(HDRS)
+
+Makefile: Makefile.in ./config.status
+ ./config.status
+
+./config.status: configure
+ $(srcdir)/configure --srcdir=$(srcdir) --no-create
+
+configure: configure.in
+ @echo Warning: configure is out of date
+# cd $(srcdir); autoconf
+
+clean:
+ rm -f *$O gzip$X gunzip$X zcat$X a.out core gzip
+ rm -f zcmp zdiff zmore znew zforce gzexe _gztest*
+ rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log
+ rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs
+
+mostlyclean: clean
+
+distclean: clean
+ rm -f Makefile config.status
+
+realclean: distclean
+ rm -f TAGS gzip.info*
+
+# Actual build-related targets
+
+gzip$X: gzip
+ aout2exe gzip
+
+gzip: $(OBJ1) $(OBJ2)
+ echo $(OBJ1) > gzip.rsp
+ echo $(OBJ2) $(LIBS) >> gzip.rsp
+ $(CC) $(LDFLAGS) -o $@ @gzip.rsp
+ del gzip.rsp
+
+gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O: gzip.h tailor.h
+util$O lzw$O unlzw$O unpack$O unlzh$O crypt$O: gzip.h tailor.h
+
+gzip$O unlzw$O: revision.h lzw.h
+
+bits$O unzip$O util$O zip$O: crypt.h
+
+gzip$O getopt$O: getopt.h
+
+match$O: match.S
+ $(CC) -c match.S
+
+zcmp: zcmp.in
+ sed "$(SEDCMD)" $(srcdir)/zcmp.in > zcmp
+ chmod 755 zcmp
+
+zdiff: zdiff.in
+ sed "$(SEDCMD)" $(srcdir)/zdiff.in > zdiff
+ chmod 755 zdiff
+
+zmore: zmore.in
+ sed "$(SEDCMD)" $(srcdir)/zmore.in > zmore
+ chmod 755 zmore
+
+znew: znew.in
+ sed "$(SEDCMD)" $(srcdir)/znew.in > znew
+ chmod 755 znew
+
+zforce: zforce.in
+ sed "$(SEDCMD)" $(srcdir)/zforce.in > zforce
+ chmod 755 zforce
+
+gzexe: gzexe.in
+ sed "$(SEDCMD)" $(srcdir)/gzexe.in > gzexe
+ chmod 755 gzexe
+
+gzip.info: gzip.texi
+ cd $(srcdir); makeinfo gzip.texi
+
+gzip.dvi: gzip.texi
+ cd $(srcdir); texi2dvi gzip.texi
+
+gzip.doc: gzip.1
+ cd $(srcdir); nroff -man gzip.1 | col -b | uniq > gzip.doc
+
+# Prevent GNU make v3 from overflowing arg limit on SysV.
+.NOEXPORT:
+
+# end of file
diff --git a/Build/source/utils/gzip/msdos/Makefile.msc b/Build/source/utils/gzip/msdos/Makefile.msc
new file mode 100644
index 00000000000..e2aceba1bb8
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/Makefile.msc
@@ -0,0 +1,108 @@
+# Makefile for gzip
+# Microsoft C 5.1 or 6.0.
+
+# To use, do "make makefile.msc"
+
+# WARNING: the small model is not supported. The compact model is used
+# here. If you want to use the large model, add -D__LARGE__ to ASFLAGS
+# Add -DSMALL_MEM to CFLAGS if you wish to reduce the memory
+# requirements. Add -DNO_ASM to CFLAGS and remove match.obj from OBJI if
+# you do not have masm.
+
+# ------------- Microsoft C 5.1 and later -------------
+MODEL=-AC
+FP=
+CFLAGS=-Ox -nologo $(MODEL)
+BFLAGS=-Oait -Gs -nologo $(MODEL)
+# BFLAGS are the 'bug workaround' flags.
+CC=cl
+LD=link
+LDFLAGS=/e/st:0x1000/noe
+# If you use lzexe as recommended, remove /e from LDFLAGS
+AS=masm
+# For MSC 6.0, use: AS=ml
+ASFLAGS=-ml -t
+# Add -DDYN_ALLOC to ASFLAGS if you have defined it in tailor.h or CFLAGS
+LIB = c:\c51\lib
+
+# ------------- Common declarations:
+STRIP=rem
+# If you don't have lzexe, get it (by ftp on wuarchive.wustl.edu
+# in /mirrors/msdos/filutl/lzexe91e.zip). Then define:
+#STRIP=lzexe
+# Or if you've registered PKLITE, then define:
+#STRIP=pklite
+# This makes a big difference in .exe size (and possibly load time)
+
+O=.obj
+OBJA=match$(O) $(LIB)\setargv$(O)
+
+# ------------- Used by install rule
+# set BIN to the directory you want to install the executables to
+BIN = c:\bin
+
+# variables
+OBJ1 = gzip$(O) zip$(O) deflate$(O) trees$(O) bits$(O) unzip$(O) inflate$(O) \
+ util$(O)
+OBJ2 = crypt$(O) lzw$(O) unlzw$(O) unpack$(O) unlzh$(O) getopt$(O) $(OBJA)
+
+gzip.obj: gzip.c gzip.h tailor.h crypt.h revision.h lzw.h
+ $(CC) -c $(CFLAGS) $*.c
+
+zip.obj: zip.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+deflate.obj: deflate.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+trees.obj: trees.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+bits.obj: bits.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unzip.obj: unzip.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inflate.obj: inflate.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+util.obj: util.c gzip.h tailor.h crypt.h
+ $(CC) -c $(BFLAGS) $*.c
+
+crypt.obj: crypt.c gzip.h tailor.h crypt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+lzw.obj: lzw.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unlzw.obj: unlzw.c gzip.h tailor.h lzw.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unpack.obj: unpack.c gzip.h tailor.h
+ $(CC) -c $(CFLAGS) $*.c
+
+unlzh.obj: unlzh.c gzip.h tailor.h
+ $(CC) -c $(BFLAGS) $*.c
+
+getopt.obj: getopt.c getopt.h
+ $(CC) -c $(CFLAGS) $*.c
+
+match.obj: msdos\match.asm
+ $(AS) $(ASFLAGS) msdos\match, match;
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+gzip.exe: $(OBJ1) $(OBJ2)
+ echo $(OBJ1)+ > gzip.rsp
+ echo $(OBJ2); >> gzip.rsp
+ $(LD) $(LDFLAGS) @gzip.rsp
+ del gzip.rsp
+ $(STRIP) gzip.exe
+
+install: gzip.exe
+ copy /b gzip.exe $(BIN)
+ copy /b gzip.exe $(BIN)\gunzip.exe
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/Build/source/utils/gzip/msdos/doturboc.bat b/Build/source/utils/gzip/msdos/doturboc.bat
new file mode 100755
index 00000000000..1cccb964369
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/doturboc.bat
@@ -0,0 +1,18 @@
+: This file is a complement to gzip.prj for Turbo C 2.0 users.
+: To construct gzip, first transform all files to msdos CR LF format.
+: (Use utilities such as flip or do file transfers in ascii mode.)
+: Then invoke this file. Then enter Turbo C, set the the
+: compilation model to compact, and the project file to gzip.prj.
+: Change the compilation flags if you wish (add SMALL_MEM
+: to reduce the memory requirements), and press F9...
+: WARNING: you must use the compact or large model in this version.
+: To use the large model, add -D__LARGE__ in the tasm command below.
+: To get the file wildargs.obj, do:
+:
+: pkunpak \tcc\startup wildargs.obj
+:
+: pkunpak is available in wuarchive.wustl.edu:/mirrors/msdos/starter/pk361.exe
+:
+: After compiling gzip.exe, do: copy gzip.exe gunzip.exe
+:
+tasm -ml -DDYN_ALLOC -DSS_NEQ_DS msdos\match, match;
diff --git a/Build/source/utils/gzip/msdos/gzip.prj b/Build/source/utils/gzip/msdos/gzip.prj
new file mode 100644
index 00000000000..1601d51e07a
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/gzip.prj
@@ -0,0 +1,17 @@
+gzip.c (gzip.h tailor.h crypt.h revision.h lzw.h)
+zip.c (gzip.h tailor.h crypt.h)
+deflate.c (gzip.h tailor.h)
+trees.c (gzip.h tailor.h)
+bits.c (gzip.h tailor.h crypt.h)
+unzip.c (gzip.h tailor.h crypt.h)
+inflate.c (gzip.h tailor.h)
+util.c (gzip.h tailor.h crypt.h)
+crypt.c (gzip.h tailor.h crypt.h)
+lzw.c (gzip.h tailor.h)
+unlzw.c (gzip.h tailor.h lzw.h)
+unpack.c (gzip.h tailor.h)
+unlzh.c (gzip.h tailor.h)
+msdos\tailor.c (gzip.h tailor.h)
+getopt.c (getopt.h)
+match.obj
+wildargs.obj
diff --git a/Build/source/utils/gzip/msdos/match.asm b/Build/source/utils/gzip/msdos/match.asm
new file mode 100644
index 00000000000..cee59c5962d
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/match.asm
@@ -0,0 +1,240 @@
+; match.asm -- optional optimized asm version of longest match in deflate.c
+; Copyright (C) 1992-1993 Jean-loup Gailly
+; This is free software; you can redistribute it and/or modify it under the
+; terms of the GNU General Public License, see the file COPYING.
+;
+; Must be assembled with masm -ml. To be used only with C compact model
+; or large model. (For large model, assemble with -D__LARGE__).
+; This file is only optional. If you don't have masm or tasm, use the
+; C version (add -DNO_ASM to CFLAGS in makefile.msc and remove match.obj
+; from OBJI). If you have reduced WSIZE in zip.h, then change its value
+; below.
+;
+; Turbo C 2.0 does not support static allocation of more than 64K bytes per
+; file, and does not have SS == DS. So TC and BC++ users must use:
+; tasm -ml -DDYN_ALLOC -DSS_NEQ_DS match;
+;
+; To simplify the code, the option -DDYN_ALLOC is supported for OS/2
+; only if the arrays are guaranteed to have zero offset (allocated by
+; halloc). We also require SS==DS. This is satisfied for MSC but not Turbo C.
+
+; $Id: match.asm,v 0.6 1993/01/21 18:49:05 jloup Exp $
+
+ name match
+
+ifndef DYN_ALLOC
+ extrn _prev : word
+ extrn _window : byte
+ prev equ _prev ; offset part
+ window equ _window
+endif
+
+_DATA segment word public 'DATA'
+ extrn _nice_match : word
+ extrn _match_start : word
+ extrn _prev_length : word
+ extrn _good_match : word
+ extrn _strstart : word
+ extrn _max_chain_length : word
+ifdef DYN_ALLOC
+ extrn _prev : word
+ extrn _window : word
+ prev equ 0 ; offset forced to zero
+ window equ 0
+ window_seg equ _window[2]
+ window_off equ 0
+else
+ wseg dw seg _window
+ window_seg equ wseg
+ window_off equ offset _window
+endif
+_DATA ends
+
+DGROUP group _DATA
+
+_TEXT segment word public 'CODE'
+ assume cs: _TEXT, ds: DGROUP
+
+ public _match_init
+ public _longest_match
+
+ MIN_MATCH equ 3
+ MAX_MATCH equ 258
+ WSIZE equ 32768 ; keep in sync with zip.h !
+ MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
+ MAX_DIST equ (WSIZE-MIN_LOOKAHEAD)
+
+prev_ptr dw seg _prev ; pointer to the prev array
+ifdef SS_NEQ_DS
+ match_start dw 0 ; copy of _match_start if SS != DS
+ nice_match dw 0 ; copy of _nice_match if SS != DS
+endif
+
+; initialize or check the variables used in match.asm.
+
+ifdef __LARGE__
+_match_init proc far ; 'proc far' for large model
+else
+_match_init proc near ; 'proc near' for compact model
+endif
+ifdef SS_NEQ_DS
+ ma_start equ cs:match_start ; does not work on OS/2
+ nice equ cs:nice_match
+ mov ax,_nice_match
+ mov cs:nice_match,ax ; ugly write to code, crash on OS/2
+else
+ assume ss: DGROUP
+ ma_start equ ss:_match_start
+ nice equ ss:_nice_match
+ mov ax,ds
+ mov bx,ss
+ cmp ax,bx ; SS == DS?
+ jne error
+endif
+ifdef DYN_ALLOC
+ cmp _prev[0],0 ; verify zero offset
+ jne error
+ cmp _window[0],0
+ jne error
+ ifdef SS_NEQ_DS
+ mov ax,_prev[2] ; segment value
+ mov cs:prev_ptr,ax ; ugly write to code, crash on OS/2
+ prev_seg equ cs:prev_ptr
+ else
+ prev_seg equ ss:_prev[2] ; works on OS/2 if SS == DS
+ endif
+else
+ prev_seg equ cs:prev_ptr
+endif
+ ret
+ifdef __LARGE__
+ extrn _exit : far ; 'far' for large model
+else
+ extrn _exit : near ; 'near' for compact model
+endif
+error: call _exit
+
+_match_init endp
+
+; -----------------------------------------------------------------------
+; Set match_start to the longest match starting at the given string and
+; return its length. Matches shorter or equal to prev_length are discarded,
+; in which case the result is equal to prev_length and match_start is
+; garbage.
+; IN assertions: cur_match is the head of the hash chain for the current
+; string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+
+; int longest_match(cur_match)
+
+ifdef __LARGE__
+_longest_match proc far ; 'proc far' for large model
+else
+_longest_match proc near ; 'proc near' for compact model
+endif
+ push bp
+ mov bp,sp
+ push di
+ push si
+ push ds
+
+ifdef __LARGE__
+ cur_match equ word ptr [bp+6] ; [bp+6] for large model
+else
+ cur_match equ word ptr [bp+4] ; [bp+4] for compact model
+endif
+
+; window equ es:window (es:0 for DYN_ALLOC)
+; prev equ ds:prev
+; match equ es:si
+; scan equ es:di
+; chain_length equ bp
+; best_len equ bx
+; limit equ dx
+
+ mov si,cur_match ; use bp before it is destroyed
+ mov bp,_max_chain_length ; chain_length = max_chain_length
+ mov di,_strstart
+ mov dx,di
+ sub dx,MAX_DIST ; limit = strstart-MAX_DIST
+ jae limit_ok
+ sub dx,dx ; limit = NIL
+limit_ok:
+ add di,2+window_off ; di = offset(window + strstart + 2)
+ mov bx,_prev_length ; best_len = prev_length
+ mov es,window_seg
+ mov ax,es:[bx+di-3] ; ax = scan[best_len-1..best_len]
+ mov cx,es:[di-2] ; cx = scan[0..1]
+ cmp bx,_good_match ; do we have a good match already?
+ mov ds,prev_seg ; (does not destroy the flags)
+ assume ds: nothing
+ jb do_scan ; good match?
+ shr bp,1 ; chain_length >>= 2
+ shr bp,1
+ jmp short do_scan
+
+ even ; align destination of branch
+long_loop:
+; at this point, ds:di == scan+2, ds:si == cur_match
+ mov ax,[bx+di-3] ; ax = scan[best_len-1..best_len]
+ mov cx,[di-2] ; cx = scan[0..1]
+ mov ds,prev_seg ; reset ds to address the prev array
+short_loop:
+; at this point, di == scan+2, si = cur_match,
+; ax = scan[best_len-1..best_len] and cx = scan[0..1]
+if (WSIZE-32768)
+ and si,WSIZE-1 ; not needed if WSIZE=32768
+endif
+ shl si,1 ; cur_match as word index
+ mov si,prev[si] ; cur_match = prev[cur_match]
+ cmp si,dx ; cur_match <= limit ?
+ jbe the_end
+ dec bp ; --chain_length
+ jz the_end
+do_scan:
+ cmp ax,word ptr es:window[bx+si-1] ; check match at best_len-1
+ jne short_loop
+ cmp cx,word ptr es:window[si] ; check min_match_length match
+ jne short_loop
+
+ lea si,window[si+2] ; si = match
+ mov ax,di ; ax = scan+2
+ mov cx,es
+ mov ds,cx ; ds = es = window
+ mov cx,(MAX_MATCH-2)/2 ; scan for at most MAX_MATCH bytes
+ repe cmpsw ; loop until mismatch
+ je maxmatch ; match of length MAX_MATCH?
+mismatch:
+ mov cl,[di-2] ; mismatch on first or second byte?
+ sub cl,[si-2] ; cl = 0 if first bytes equal
+ xchg ax,di ; di = scan+2, ax = end of scan
+ sub ax,di ; ax = len
+ sub si,ax ; si = cur_match + 2 + offset(window)
+ sub si,2+window_off ; si = cur_match
+ sub cl,1 ; set carry if cl == 0 (can't use DEC)
+ adc ax,0 ; ax = carry ? len+1 : len
+ cmp ax,bx ; len > best_len ?
+ jle long_loop
+ mov ma_start,si ; match_start = cur_match
+ mov bx,ax ; bx = best_len = len
+ cmp ax,nice ; len >= nice_match ?
+ jl long_loop
+the_end:
+ pop ds
+ assume ds: DGROUP
+ifdef SS_NEQ_DS
+ mov ax,ma_start ; garbage if no match found
+ mov ds:_match_start,ax
+endif
+ pop si
+ pop di
+ pop bp
+ mov ax,bx ; result = ax = best_len
+ ret
+maxmatch: ; come here if maximum match
+ cmpsb ; increment si and di
+ jmp mismatch ; force match_length = MAX_LENGTH
+
+_longest_match endp
+
+_TEXT ends
+end
diff --git a/Build/source/utils/gzip/msdos/tailor.c b/Build/source/utils/gzip/msdos/tailor.c
new file mode 100644
index 00000000000..4d41b22a600
--- /dev/null
+++ b/Build/source/utils/gzip/msdos/tailor.c
@@ -0,0 +1,58 @@
+/* tailor.c -- target dependent functions
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+/* tailor.c is a bunch of non portable routines.
+ * It should be kept to a minimum.
+ */
+
+#include "tailor.h"
+#include "gzip.h"
+
+#ifndef lint
+static char rcsid[] = "$Id: tailor.c,v 0.8 1993/02/24 18:24:54 jloup Exp $";
+#endif
+
+#ifdef __TURBOC__
+
+/************************/
+/* Function fcalloc() */
+/************************/
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use fcfree().
+ * For MSC, use halloc instead of this function (see tailor.h).
+ */
+static ush ptr_offset = 0;
+
+void * fcalloc(items, size)
+ unsigned items; /* number of items */
+ unsigned size; /* item size */
+{
+ void * buf = farmalloc((ulg)items*size + 16L);
+ if (buf == NULL) return NULL;
+ /* Normalize the pointer to seg:0 */
+ if (ptr_offset == 0) {
+ ptr_offset = (ush)((uch*)buf-0);
+ } else if (ptr_offset != (ush)((uch*)buf-0)) {
+ error("inconsistent ptr_offset");
+ }
+ *((ush*)&buf+1) += (ptr_offset + 15) >> 4;
+ *(ush*)&buf = 0;
+ return buf;
+}
+
+void fcfree(ptr)
+ void *ptr; /* region allocated with fcalloc() */
+{
+ /* Put the pointer back to its original form: */
+ *((ush*)&ptr+1) -= (ptr_offset + 15) >> 4;
+ *(ush*)&ptr = ptr_offset;
+ farfree(ptr);
+ }
+
+#endif /* __TURBOC__ */
diff --git a/Build/source/utils/gzip/nt/Makefile.nt b/Build/source/utils/gzip/nt/Makefile.nt
new file mode 100644
index 00000000000..0a7604c9585
--- /dev/null
+++ b/Build/source/utils/gzip/nt/Makefile.nt
@@ -0,0 +1,66 @@
+# Simple makefile for Windows NT
+# Written by Ron Cox <roncox@indirect.com>
+
+# This is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License, see the file COPYING.
+
+# This makefile is suitable for NTFS only. To build a gzip executable suitable
+# for a FAT file system, add -DNTFAT to DEFS.
+
+# To build debug version, define environment variable DEBUG, or include a
+# -DDEBUG on the commandline (i.e.: nmake -DDEBUG)
+
+.silent:
+
+!include <ntwin32.mak>
+
+#
+# Object files
+#
+OBJS = gzip.obj zip.obj deflate.obj trees.obj bits.obj unzip.obj inflate.obj \
+ util.obj crypt.obj lzw.obj unlzw.obj unpack.obj getopt.obj unlzh.obj
+
+DEFS =
+# for FAT support, set: DEFS = -DNTFAT
+
+#
+# How to build .obj's from .c's
+#
+.c.obj:
+ $(cc) $(DEFS) -Ox $(cflags) $(cvarsdll) $<
+
+#
+# Main target
+#
+all: gzip.exe
+
+#
+# Link target. setargv.obj is provided in the compiler library directory.
+#
+gzip.exe: $(OBJS)
+ $(link) $(linkdebug) $(conflags) -out:gzip.exe $(OBJS) setargv.obj \
+ $(conlibsdll)
+
+#
+# Dependencies
+#
+gzip.obj: gzip.c gzip.h tailor.h
+zip.obj: zip.c gzip.h tailor.h crypt.h
+deflate.obj: deflate.c gzip.h tailor.h
+trees.obj: trees.c gzip.h tailor.h
+bits.obj: bits.c gzip.h tailor.h crypt.h
+unzip.obj: unzip.c gzip.h tailor.h crypt.h
+inflate.obj: inflate.c gzip.h tailor.h crypt.h
+util.obj: util.c gzip.h tailor.h
+lzw.obj: lzw.c gzip.h tailor.h
+unlzw.obj: unlzw.c gzip.h tailor.h revision.h lzw.h
+unpack.obj: unpack.c gzip.h tailor.h
+crypt.obj: crypt.c gzip.h tailor.h
+unlzh.obj: unlzh.c gzip.h tailor.h lzw.h
+
+
+clean:
+ -rm $(OBJS)
+
+clobber: clean
+ -rm gzip.exe
diff --git a/Build/source/utils/gzip/os2/Makefile.os2 b/Build/source/utils/gzip/os2/Makefile.os2
new file mode 100644
index 00000000000..e4afc2ecf99
--- /dev/null
+++ b/Build/source/utils/gzip/os2/Makefile.os2
@@ -0,0 +1,81 @@
+# Makefile for gzip (GNU zip), OS/2 version -*- Indented-Text -*-
+# Written by Kai Uwe Rommel <rommel@informatik.tu-muenchen.de>
+
+# specialized version for OS/2
+
+default:
+ @echo "Enter $(MAKE) -f makefile.os2 target"
+ @echo "where target is one of:"
+ @echo " msc mscdebug gcc gccdyn gccdebug"
+
+# compilation with emx 0.8f (gcc 2.3.3) or newer
+#
+# release version, statically linked C runtime
+gcc:
+ $(MAKE) -f Makefile.os2 all \
+ CC="gcc -Zomf -Zsys" O=".obj" S=".S" \
+ AS="gcc -Zomf -xassembler-with-cpp -c -o" \
+ CFLAGS="-O" LDFLAGS="gzip.def -s"
+#
+# release version, dynamically linked C runtime
+gccdyn:
+ $(MAKE) -f Makefile.os2 all \
+ CC="gcc -Zomf -Zmt" O=".obj" S=".S" \
+ AS="gcc -Zomf -xassembler-with-cpp -c -o" \
+ CFLAGS="-O" LDFLAGS="gzip.def -s"
+#
+# debugging version
+gccdebug:
+ $(MAKE) -f Makefile.os2 all \
+ CC="gcc -g" O=".o" S=".S" \
+ AS="gcc -g -xassembler-with-cpp -c -o" \
+ CFLAGS="" LDFLAGS="gzip.def"
+
+# compilation with MS C 6.00
+#
+# release version
+msc:
+ $(MAKE) -f Makefile.os2 all \
+ CC="cl -nologo -AC" O=".obj" S=".asm" \
+ AS="ml -nologo -Zm -Cp -c -Fo" \
+ CFLAGS=" -W1 -Zap -J -G2s -Ocegit" \
+ LDFLAGS="-Lp -F 2000 setargv.obj gzip16.def -link /noe"
+#
+# debugging version
+mscdebug:
+ $(MAKE) -f Makefile.os2 all \
+ CC="cl -nologo -AC -Zi" O=".obj" S=".asm" \
+ AS="ml -nologo -Zm -Zi -Cp -c -Fo" \
+ CFLAGS="-W1 -Zap -J -G2 -Od" \
+ LDFLAGS="-Lp -F 2000 setargv.obj gzip16.def -link /noe /exe"
+
+DEFS = -DOS2 -DASMV
+
+OBJS = gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O util$O \
+ crypt$O lzw$O unlzw$O unpack$O unlzh$O getopt$O match$O
+
+.SUFFIXES: .c $O
+
+.c$O:
+ $(CC) $(CFLAGS) $(DEFS) -c $<
+
+all: gzip.exe gzip.info gzip.doc
+
+gzip.exe: $(OBJS)
+ $(CC) -o $@ $(OBJS) $(LDFLAGS)
+
+gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O: gzip.h tailor.h
+util$O lzw$O unlzw$O unpack$O unlzh$O crypt$O: gzip.h tailor.h
+
+gzip$O unlzw$O: revision.h lzw.h
+
+bits$O unzip$O util$O zip$O: crypt.h
+
+match$O: match$S
+ $(AS) $@ match$S
+
+gzip.info: gzip.texi gpl.texinfo
+ makeinfo gzip.texi
+
+gzip.doc: gzip.1
+ groff -man gzip.1 > $@
diff --git a/Build/source/utils/gzip/os2/gzip.def b/Build/source/utils/gzip/os2/gzip.def
new file mode 100644
index 00000000000..c7af3ea2eda
--- /dev/null
+++ b/Build/source/utils/gzip/os2/gzip.def
@@ -0,0 +1,3 @@
+NAME GZIP WINDOWCOMPAT
+DESCRIPTION 'GNU gzip file compression program'
+STACKSIZE 0x80000
diff --git a/Build/source/utils/gzip/os2/gzip16.def b/Build/source/utils/gzip/os2/gzip16.def
new file mode 100644
index 00000000000..74c20d91e21
--- /dev/null
+++ b/Build/source/utils/gzip/os2/gzip16.def
@@ -0,0 +1,2 @@
+NAME GZIP WINDOWCOMPAT NEWFILES
+DESCRIPTION 'GNU gzip file compression program'
diff --git a/Build/source/utils/gzip/primos/build.cpl b/Build/source/utils/gzip/primos/build.cpl
new file mode 100644
index 00000000000..6d82fa0c9b7
--- /dev/null
+++ b/Build/source/utils/gzip/primos/build.cpl
@@ -0,0 +1,76 @@
+/* Gzip build file for Primos.
+/* author: Peter Eriksson, pen@lysator.liu.se
+/*
+type
+type 'Building GZIP for PRIMOS - Please Wait...'
+type
+&if ^ [exists *>PRIMOS>OBJ -dir] &then &do
+ type 'Creating *>PRIMOS>OBJ directory...'
+ type
+ create *>PRIMOS>OBJ
+ &end
+
+type 'Compiling...
+
+&set_var unit := 0
+
+/*
+&set_var cdefines := -debug
+
+como *>primos>compile.como
+&do file &items [wild *>@@.c -single unit]
+ &set_var filebase := [before %file% .]
+ &if ^ [exists *>primos>obj>%filebase%.bin] &then &do
+ type 'Compiling "'%file%'"...'
+ ci *>%file% -binary *>primos>obj>=.bin %cdefines% -optionsfile *>primos>ci.opts
+ &end
+&end
+close -unit %unit%
+&set_var unit := 0
+
+&do file &items [wild *>primos>@@.c -single unit]
+ &set_var filebase := [before %file% .]
+ &if ^ [exists *>primos>obj>%filebase%.bin] &then &do
+ type 'Compiling "'%file%'"...'
+ ci *>primos>%file% -binary *>primos>obj>=.bin %cdefines% -optionsfile *>primos>ci.opts
+ &end
+&end
+como -end
+
+type
+type
+type 'Binding...'
+
+&set_var unit := 0
+&data bind
+ li ccmain
+ load *>primos>obj>gzip
+ load *>primos>obj>bits
+ load *>primos>obj>crypt
+ load *>primos>obj>deflate
+ load *>primos>obj>getopt
+ load *>primos>obj>inflate
+ load *>primos>obj>lzw
+ load *>primos>obj>makecrc
+ load *>primos>obj>primos
+ load *>primos>obj>trees
+ load *>primos>obj>unlzw
+ load *>primos>obj>unpack
+ load *>primos>obj>unlzh
+ load *>primos>obj>unzip
+ load *>primos>obj>util
+ load *>primos>obj>zip
+ li c_lib
+ li
+ dynt -all
+ nwc
+ nitr
+ ntw
+ compress
+ file *>primos>gzip.run
+&end
+
+type
+type
+type 'All done. (Hopefully). The executable should be in *>PRIMOS>GZIP.RUN'
+&return
diff --git a/Build/source/utils/gzip/primos/ci.opts b/Build/source/utils/gzip/primos/ci.opts
new file mode 100644
index 00000000000..bb4f9b3a087
--- /dev/null
+++ b/Build/source/utils/gzip/primos/ci.opts
@@ -0,0 +1,6 @@
+-define PRIMOS
+-include *>PRIMOS>INCLUDE
+-ignoreregister
+-packbytes
+-sof
+
diff --git a/Build/source/utils/gzip/primos/include/errno.h b/Build/source/utils/gzip/primos/include/errno.h
new file mode 100644
index 00000000000..ee891468b98
--- /dev/null
+++ b/Build/source/utils/gzip/primos/include/errno.h
@@ -0,0 +1,17 @@
+/*
+** errno.h
+**
+** Emulation of the Unix errno.h header file for PRIMOS
+**
+** Author: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifndef __ERRNO_H__
+#define __ERRNO_H__
+
+#include <errd.h>
+
+#define ENOENT e$fntf
+
+#endif
+
diff --git a/Build/source/utils/gzip/primos/include/fcntl.h b/Build/source/utils/gzip/primos/include/fcntl.h
new file mode 100644
index 00000000000..9e4b1dc83d5
--- /dev/null
+++ b/Build/source/utils/gzip/primos/include/fcntl.h
@@ -0,0 +1,22 @@
+/*
+** fcntl.h
+**
+** Emulation of the Unix fcntl.h header file for PRIMOS
+**
+** Author: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifndef __FCNTL_H__
+#define __FCNTL_H__
+
+#define O_RDONLY 0
+#define O_WRONLY 1
+#define O_RDWR 2
+
+#define O_BINARY 0
+#define O_EXCL 0
+#define O_NDELAY 0
+#define O_CREAT 0
+#define O_TRUNC 0
+
+#endif
diff --git a/Build/source/utils/gzip/primos/include/stdlib.h b/Build/source/utils/gzip/primos/include/stdlib.h
new file mode 100644
index 00000000000..49fbfc38179
--- /dev/null
+++ b/Build/source/utils/gzip/primos/include/stdlib.h
@@ -0,0 +1,16 @@
+/*
+** stdlib.h
+**
+** Emulation of the Unix stdlib.h header file for PRIMOS
+**
+** Author: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifndef __STDLIB_H__
+#define __STDLIB_H__
+
+extern char *malloc();
+extern char *calloc();
+
+#endif
+
diff --git a/Build/source/utils/gzip/primos/include/sysStat.h b/Build/source/utils/gzip/primos/include/sysStat.h
new file mode 100644
index 00000000000..c24d20b6070
--- /dev/null
+++ b/Build/source/utils/gzip/primos/include/sysStat.h
@@ -0,0 +1,92 @@
+/*
+** sys/stat.h
+**
+** Emulation of the Unix sys/stat.h header file for PRIMOS
+**
+** Author: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifndef __SYS_STAT_H__
+#define __SYS_STAT_H__
+
+
+#include <sys/types.h>
+
+struct stat {
+ /* First some PRIMOS standard entries */
+ off_t st_size;
+ time_t st_mtime;
+ short st_type; /* Primos file type */
+ short st_rwlock; /* Primos read/write lock */
+
+ /* Begin Unix compatibility - don't believe these entries! */
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ short st_nlink;
+ uid_t st_uid;
+ gid_t st_gid;
+ dev_t st_rdev;
+ time_t st_atime;
+ time_t st_ctime;
+ long st_blksize;
+ long st_blocks;
+};
+
+#define _IFMT 0170000 /* type of file */
+#define _IFREG 0100000 /* regular */
+#define _IFDIR 0040000 /* directory */
+
+/* Some stupid programs check if these are defined and then
+ believe these are supported in the OS - not so in PRIMOS ... */
+#ifndef __50SERIES
+# define _IFCHR 0020000
+# define _IFBLK 0060000
+# define _IFLNK 0120000
+# define _IFSOCK 0140000
+# define _IFIFO 0010000
+#endif
+
+#define S_ISUID 0004000
+#define S_ISGID 0002000
+#define S_ISVTX 0001000
+#define S_IREAD 0000400
+#define S_IWRITE 0000200
+#define S_IEXEC 0000100
+
+#define S_ENFMT 0002000
+
+#define S_IFMT _IFMT
+#define S_IFREG _IFREG
+#define S_IFDIR _IFDIR
+#ifndef __50SERIES
+# define S_IFCHR _IFCHR
+# define S_IFBLK _IFBLK
+# define S_IFLNK _IFLNK
+# define S_IFSOCK _IFSOCK
+# define S_IFIFO _IFIFO
+#endif
+
+#define S_IRWXU 0000700
+#define S_IRUSR 0000400
+#define S_IWUSR 0000200
+#define S_IXUSR 0000100
+#define S_IRWXG 0000070
+#define S_IRGRP 0000040
+#define S_IWGRP 0000020
+#define S_IXGRP 0000010
+#define S_IRWXO 0000007
+#define S_IROTH 0000004
+#define S_IWOTH 0000002
+#define S_IXOTH 0000001
+
+#define S_ISREG(m) (((m) & _IFMT) == _IFREG)
+#define S_ISDIR(m) (((m) & _IFMT) == _IFDIR)
+#ifndef __50SERIES
+# define S_ISBLK(m) (((m) & _IFMT) == _IFBLK)
+# define S_ISCHR(m) (((m) & _IFMT) == _IFCHR)
+# define S_ISFIFO(m) (((m) & _IFMT) == _IFIFO)
+#endif
+
+
+#endif
diff --git a/Build/source/utils/gzip/primos/include/sysTypes.h b/Build/source/utils/gzip/primos/include/sysTypes.h
new file mode 100644
index 00000000000..ec6c5b1531a
--- /dev/null
+++ b/Build/source/utils/gzip/primos/include/sysTypes.h
@@ -0,0 +1,25 @@
+/*
+** sys/types.h
+**
+** Emulation of the Unix sys/types.h header file for PRIMOS
+**
+** Author: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifndef __SYS_TYPES_H__
+#define __SYS_TYPES_H__
+
+typedef long size_t;
+typedef long time_t;
+
+typedef long off_t;
+typedef short dev_t;
+typedef short ino_t;
+typedef short mode_t;
+typedef short uid_t;
+typedef short gid_t;
+
+typedef char *caddr_t;
+
+#endif
+
diff --git a/Build/source/utils/gzip/primos/primos.c b/Build/source/utils/gzip/primos/primos.c
new file mode 100644
index 00000000000..c751c9a2b6d
--- /dev/null
+++ b/Build/source/utils/gzip/primos/primos.c
@@ -0,0 +1,122 @@
+/*
+** primos.c
+**
+** This file contains emulation routines for some common Unix functions
+**
+** Author: Peter Eriksson <pen@lysator.liu.se>
+*/
+
+#ifdef __50SERIES
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+
+uid_t primos_uid = 42;
+gid_t primos_gid = 42;
+mode_t primos_mode = 600;
+
+/* Dummy do-nothing routine for chmod() */
+int chmod(path, mode)
+ char *path;
+ int mode;
+{
+ return 0;
+}
+
+char *getenv(var)
+ char *var;
+{
+ char buf[256];
+ extern char *gvget();
+
+ buf[0] = '.';
+ strcpy(buf+1, var);
+
+ return gvget(buf);
+}
+
+
+unlink(path)
+ char *path;
+{
+ return delete(path);
+}
+
+int lstat(path, buf)
+ char *path;
+ struct stat *buf;
+{
+ return stat(path, buf);
+}
+
+int stat(path, buf)
+ char *path;
+ struct stat *buf;
+{
+ buf->st_dev = 1;
+ buf->st_ino = 1;
+ buf->st_nlink = 1;
+ buf->st_uid = primos_uid;
+ buf->st_gid = primos_gid;
+ buf->st_rdev = 1;
+ buf->st_blksize = 2048;
+
+ buf->st_rwlock = frwlock(path);
+ switch (buf->st_type = ftype(path))
+ {
+ case 0:
+ case 1:
+ /* Regular file (SAM or DAM) */
+ buf->st_size = fsize(path);
+ buf->st_mtime = fdtm(path);
+
+ buf->st_mode = S_IFREG|primos_mode;
+ break;
+
+ case 4:
+ buf->st_size = 0;
+ buf->st_mtime = fdtm(path);
+
+ buf->st_mode = S_IFDIR|primos_mode;
+ break;
+
+ case -1:
+ return -1;
+
+ default:
+ buf->st_mode = primos_mode;
+ buf->st_size = fsize(path);
+ buf->st_mtime = fdtm(path);
+ }
+
+ buf->st_blocks = (buf->st_size-1) / buf->st_blksize + 1;
+
+ /* Should be fixed to really fetch these values, but that
+ * would require calling some PRIMOS subroutines and I don't have
+ * a copy of the Primos Subroutine reference manuals here..
+ */
+ buf->st_atime = buf->st_mtime;
+ buf->st_ctime = buf->st_mtime;
+
+ return 0;
+}
+
+int fstat(fd, buf)
+ int fd;
+ struct stat *buf;
+{
+ char path[1025];
+
+ return stat(getname(fd, path), buf);
+}
+
+int ascii2pascii(c)
+ int c;
+{
+ return (c ? (c | 0x80) : '\0');
+}
+
+
+#endif /* __50SERIES */
diff --git a/Build/source/utils/gzip/primos/readme b/Build/source/utils/gzip/primos/readme
new file mode 100644
index 00000000000..6c9dc01c14f
--- /dev/null
+++ b/Build/source/utils/gzip/primos/readme
@@ -0,0 +1,27 @@
+To build GZIP for PRIMOS you should just have to type:
+
+ r *>primos>build
+
+while standing in the directory above this PRIMOS subdirectory.
+
+If the files in these directories looks strange, then it might be
+because they are in normal ASCII. You'll need to convert them into
+PASCII before you will be able to build the GZIP executable.
+
+You can find a simple ASCII to PASCII converter via anonymous FTP
+from "ftp.lysator.liu.se" in the directory "pub/primos/run" as
+the file "topascii.run".
+
+You can reach me at a number of places in case there are any bugs
+in this port to report...
+
+ Email:
+
+ pen@signum.se Signum is a company giving support for
+ Free Software. Call/Mail us if you're
+ interrested! (Phone: +46-13-21-46-00)
+
+ pen@lysator.liu.se Lysator is a computer society at the
+ Linkoping University in Sweden.
+
+Peter Eriksson, 25 May 1993
diff --git a/Build/source/utils/gzip/revision.h b/Build/source/utils/gzip/revision.h
new file mode 100644
index 00000000000..f99b65f9bbd
--- /dev/null
+++ b/Build/source/utils/gzip/revision.h
@@ -0,0 +1,16 @@
+/* revision.h -- define the version number
+ * Copyright (C) 1992-1993 Jean-loup Gailly.
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+#define VERSION "1.2.4"
+#define PATCHLEVEL 0
+#define REVDATE "18 Aug 93"
+
+/* This version does not support compression into old compress format: */
+#ifdef LZW
+# undef LZW
+#endif
+
+/* $Id: revision.h,v 0.25 1993/06/24 08:29:52 jloup Exp $ */
diff --git a/Build/source/utils/gzip/sample/add.c b/Build/source/utils/gzip/sample/add.c
new file mode 100644
index 00000000000..0058d9e39c4
--- /dev/null
+++ b/Build/source/utils/gzip/sample/add.c
@@ -0,0 +1,57 @@
+/* add.c not copyrighted (n) 1993 by Mark Adler */
+/* version 1.1 11 Jun 1993 */
+
+/* This filter reverses the effect of the sub filter. It requires no
+ arguments, since sub puts the information necessary for extraction
+ in the stream. See sub.c for what the filtering is and what it's
+ good for. */
+
+#include <stdio.h>
+
+#define MAGIC1 'S' /* sub data */
+#define MAGIC2 26 /* ^Z */
+#define MAX_DIST 16384
+
+char a[MAX_DIST]; /* last byte buffer for up to MAX_DIST differences */
+
+int main()
+{
+ int n; /* number of differences */
+ int i; /* difference counter */
+ int c; /* byte from input */
+
+ /* check magic word */
+ if (getchar() != MAGIC1 || getchar() != MAGIC2)
+ {
+ fputs("add: input stream not made by sub\n", stderr);
+ exit(1);
+ }
+
+ /* get number of differences from data */
+ if ((n = getchar()) == EOF || (i = getchar()) == EOF) {
+ fputs("add: unexpected end of file\n", stderr);
+ exit(1);
+ }
+ n += (i<<8);
+ if (n <= 0 || n > MAX_DIST) {
+ fprintf(stderr, "add: incorrect distance %d\n", n);
+ exit(1);
+ }
+
+ /* initialize last byte */
+ i = n;
+ do {
+ a[--i] = 0;
+ } while (i);
+
+ /* read differenced data and restore original */
+ while ((c = getchar()) != EOF)
+ {
+ c = (a[i++] += c) & 0xff; /* restore data, save last byte */
+ putchar(c); /* write original */
+ if (i == n) /* cycle on n differences */
+ i = 0;
+ }
+ exit(0);
+ return 0; /* avoid warning */
+}
diff --git a/Build/source/utils/gzip/sample/makecrc.c b/Build/source/utils/gzip/sample/makecrc.c
new file mode 100644
index 00000000000..2b60f476e6a
--- /dev/null
+++ b/Build/source/utils/gzip/sample/makecrc.c
@@ -0,0 +1,63 @@
+/* Not copyrighted 1990 Mark Adler */
+
+#ifndef lint
+static char rcsid[] = "$Id: makecrc.c,v 0.6 1993/05/28 07:42:59 jloup Exp $";
+#endif
+
+#include <stdio.h>
+
+main()
+/*
+ Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
+ x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+ Polynomials over GF(2) are represented in binary, one bit per coefficient,
+ with the lowest powers in the most significant bit. Then adding polynomials
+ is just exclusive-or, and multiplying a polynomial by x is a right shift by
+ one. If we call the above polynomial p, and represent a byte as the
+ polynomial q, also with the lowest power in the most significant bit (so the
+ byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+ where a mod b means the remainder after dividing a by b.
+
+ This calculation is done using the shift-register method of multiplying and
+ taking the remainder. The register is initialized to zero, and for each
+ incoming bit, x^32 is added mod p to the register if the bit is a one (where
+ x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+ x (which is shifting right by one and adding x^32 mod p if the bit shifted
+ out is a one). We start with the highest power (least significant bit) of
+ q and repeat for all eight bits of q.
+
+ The table is simply the CRC of all possible eight bit values. This is all
+ the information needed to generate CRC's on data a byte at a time for all
+ combinations of CRC register values and incoming bytes. The table is
+ written to stdout as 256 long hexadecimal values in C language format.
+*/
+{
+ unsigned long c; /* crc shift register */
+ unsigned long e; /* polynomial exclusive-or pattern */
+ int i; /* counter for all possible eight bit values */
+ int k; /* byte being shifted into crc apparatus */
+
+ /* terms of polynomial defining this crc (except x^32): */
+ static int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+ /* Make exclusive-or pattern from polynomial (0xedb88320) */
+ e = 0;
+ for (i = 0; i < sizeof(p)/sizeof(int); i++)
+ e |= 1L << (31 - p[i]);
+
+ /* Compute and print table of CRC's, five per line */
+ printf(" 0x00000000L");
+ for (i = 1; i < 256; i++)
+ {
+ c = i;
+ /* The idea to initialize the register with the byte instead of
+ * zero was stolen from Haruhiko Okumura's ar002
+ */
+ for (k = 8; k; k--)
+ c = c & 1 ? (c >> 1) ^ e : c >> 1;
+ printf(i % 5 ? ", 0x%08lxL" : ",\n 0x%08lxL", c);
+ }
+ putchar('\n');
+ return 0;
+}
diff --git a/Build/source/utils/gzip/sample/sub.c b/Build/source/utils/gzip/sample/sub.c
new file mode 100644
index 00000000000..ec57ca4f232
--- /dev/null
+++ b/Build/source/utils/gzip/sample/sub.c
@@ -0,0 +1,88 @@
+/* sub.c not copyrighted (n) 1993 by Mark Adler */
+/* version 1.1 11 Jun 1993 */
+
+/* sub is a simple filter to preprocess a data file before compression.
+ It can increase compression for data whose points tend to be close to
+ the last point. The output is the difference of successive bytes of
+ the input. The add filter is used to undo what sub does. This could
+ be used on 8-bit sound or graphics data.
+
+ sub can also take an argument to apply this to interleaved sets of
+ bytes. For example, if the data are 16-bit sound samples, then you
+ can use "sub 2" to take differences on the low-byte stream and the
+ high-byte stream. (This gives nearly the same effect as subtracting
+ the 16-bit values, but avoids the complexities of endianess of the
+ data.) The concept extends to RGB image data (sub 3), 16-bit stereo
+ data (sub 4), floating point data (sub 4 or sub 8), etc.
+
+ add takes no options, since the number of interleaved byte streams
+ is put in the first two bytes of the output stream for add to use
+ (in little-endian format).
+
+ Examples:
+
+ sub < graph.vga | gzip -9 > graph.vga.sgz
+ sub < phone.snd | gzip -9 > phone.snd.sgz
+ sub 2 < audio.snd | gzip -9 > audio.snd.sgz
+ sub 3 < picture.rgb | gzip -9 > picture.rgb.sgz
+ sub 4 < stereo.snd | gzip -9 > stereo.snd.sgz
+ sub 8 < double.data | gzip -9 > double.data.sgz
+
+ To expand, use the reverse operation, as in:
+
+ gunzip < double.data.sgz | add > double.data
+*/
+
+#include <stdio.h>
+
+#define MAGIC1 'S' /* sub data */
+#define MAGIC2 26 /* ^Z */
+#define MAX_DIST 16384
+
+char a[MAX_DIST]; /* last byte buffer for up to MAX_DIST differences */
+
+int main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int n = 1; /* number of differences */
+ int i; /* difference counter */
+ int c; /* byte from input */
+ int atoi(); /* (avoid including stdlib for portability) */
+
+ /* process arguments */
+ if (argc > 2)
+ {
+ fputs("sub: only one argument needed--# of differences\n", stderr);
+ exit(1);
+ }
+ if (argc > 1)
+ n = atoi(argv[1]);
+
+ if (n < 0) n = -n; /* tolerate "sub -2" */
+ if (n == 0 || n > MAX_DIST) {
+ fputs("sub: incorrect distance\n", stderr);
+ exit(1);
+ }
+
+ /* initialize last byte */
+ i = n;
+ do {
+ a[--i] = 0;
+ } while (i);
+
+ /* write differenced data */
+ putchar(MAGIC1); putchar(MAGIC2); /* magic word for add */
+ putchar(n & 0xff); /* so add knows what to do */
+ putchar((n>>8) & 0xff);
+
+ while ((c = getchar()) != EOF)
+ {
+ putchar((c - a[i]) & 0xff); /* write difference */
+ a[i++] = c; /* save last byte */
+ if (i == n) /* cycle on n differences */
+ i = 0;
+ }
+ exit(0);
+ return 0; /* avoid warning */
+}
diff --git a/Build/source/utils/gzip/sample/zfile b/Build/source/utils/gzip/sample/zfile
new file mode 100644
index 00000000000..6b4514ccb30
--- /dev/null
+++ b/Build/source/utils/gzip/sample/zfile
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+if test $# = 0; then
+ echo 'zfile: file(1) for programs which may be compressed with gzexe'
+ echo usage: `basename $0` files...
+ exit 1
+fi
+
+tmp=/tmp/gz$$
+
+for i do
+ if test ! -f "$i" ; then
+ echo `basename $0`: $i not a file
+ res=1
+ continue
+ fi
+ skip=18
+ if sed -e 1d -e 2q "$i" | grep "^skip=[0-9]*$" >/dev/null; then
+ eval `sed -e 1d -e 2q "$i"`
+ fi
+ if tail +$skip "$i" | gzip --list >/dev/null 2>&1; then
+ tail +$skip "$i" | gzip -cd | dd count=1 >$tmp 2>/dev/null
+ file $tmp | sed "s|^$tmp|$i|"
+ else
+ file "$i"
+ fi
+ rm -f $tmp
+done
diff --git a/Build/source/utils/gzip/sample/zread.c b/Build/source/utils/gzip/sample/zread.c
new file mode 100644
index 00000000000..3163d42a558
--- /dev/null
+++ b/Build/source/utils/gzip/sample/zread.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+
+/* Trivial example of reading a gzip'ed file or gzip'ed standard input
+ * using stdio functions fread(), getc(), etc... fseek() is not supported.
+ * Modify according to your needs. You can easily construct the symmetric
+ * zwrite program.
+ *
+ * Usage: zread [file[.gz]]
+ * This programs assumes that gzip is somewhere in your path.
+ */
+int main(argc, argv)
+ int argc;
+ char **argv;
+{
+ FILE *infile;
+ char cmd[256];
+ char buf[BUFSIZ];
+ int n;
+
+ if (argc < 1 || argc > 2) {
+ fprintf(stderr, "usage: %s [file[.gz]]\n", argv[0]);
+ exit(1);
+ }
+ strcpy(cmd, "gzip -dc "); /* use "gzip -c" for zwrite */
+ if (argc == 2) {
+ strncat(cmd, argv[1], sizeof(cmd)-strlen(cmd));
+ }
+ infile = popen(cmd, "r"); /* use "w" for zwrite */
+ if (infile == NULL) {
+ fprintf(stderr, "%s: popen('%s', 'r') failed\n", argv[0], cmd);
+ exit(1);
+ }
+ /* Read one byte using getc: */
+ n = getc(infile);
+ if (n == EOF) {
+ pclose(infile);
+ exit(0);
+ }
+ putchar(n);
+
+ /* Read the rest using fread: */
+ for (;;) {
+ n = fread(buf, 1, BUFSIZ, infile);
+ if (n <= 0) break;
+ fwrite(buf, 1, n, stdout);
+ }
+ if (pclose(infile) != 0) {
+ fprintf(stderr, "%s: pclose failed\n", argv[0]);
+ exit(1);
+ }
+ exit(0);
+ return 0; /* just to make compiler happy */
+}
diff --git a/Build/source/utils/gzip/sample/ztouch b/Build/source/utils/gzip/sample/ztouch
new file mode 100644
index 00000000000..e408e2bc50b
--- /dev/null
+++ b/Build/source/utils/gzip/sample/ztouch
@@ -0,0 +1,15 @@
+#! /usr/local/bin/perl
+# Set the time stamp of a gzip'ed file from that stored in the file.
+# usage: ztouch files...
+
+foreach $file (@ARGV) {
+ open (FILE, $file);
+ read (FILE, $_, 8);
+ ($magic, $method, $flags, $time) = unpack ("A2C2V", $_);
+ if ($magic eq "\037\213") {
+ utime ($time, $time, $file);
+ }
+ else {
+ warn "$file is not compressed with gzip!\n";
+ }
+}
diff --git a/Build/source/utils/gzip/tailor.h b/Build/source/utils/gzip/tailor.h
new file mode 100644
index 00000000000..e6dff4771a3
--- /dev/null
+++ b/Build/source/utils/gzip/tailor.h
@@ -0,0 +1,342 @@
+/* tailor.h -- target dependent definitions
+ * Copyright (C) 1992-1993 Jean-loup Gailly.
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+/* The target dependent definitions should be defined here only.
+ * The target dependent functions should be defined in tailor.c.
+ */
+
+/* $Id: tailor.h,v 0.18 1993/06/14 19:32:20 jloup Exp $ */
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+
+#if defined(__OS2__) && !defined(OS2)
+# define OS2
+#endif
+
+#if defined(OS2) && defined(MSDOS) /* MS C under OS/2 */
+# undef MSDOS
+#endif
+
+#ifdef MSDOS
+# ifdef __GNUC__
+ /* DJGPP version 1.09+ on MS-DOS.
+ * The DJGPP 1.09 stat() function must be upgraded before gzip will
+ * fully work.
+ * No need for DIRENT, since <unistd.h> defines POSIX_SOURCE which
+ * implies DIRENT.
+ */
+# define near
+# else
+# define MAXSEG_64K
+# ifdef __TURBOC__
+# define NO_OFF_T
+# ifdef __BORLANDC__
+# define DIRENT
+# else
+# define NO_UTIME
+# endif
+# else /* MSC */
+# define HAVE_SYS_UTIME_H
+# define NO_UTIME_H
+# endif
+# endif
+# define PATH_SEP2 '\\'
+# define PATH_SEP3 ':'
+# define MAX_PATH_LEN 128
+# define NO_MULTIPLE_DOTS
+# define MAX_EXT_CHARS 3
+# define Z_SUFFIX "z"
+# define NO_CHOWN
+# define PROTO
+# define STDC_HEADERS
+# define NO_SIZE_CHECK
+# define casemap(c) tolow(c) /* Force file names to lower case */
+# include <io.h>
+# define OS_CODE 0x00
+# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY)
+# if !defined(NO_ASM) && !defined(ASMV)
+# define ASMV
+# endif
+#else
+# define near
+#endif
+
+#ifdef OS2
+# define PATH_SEP2 '\\'
+# define PATH_SEP3 ':'
+# define MAX_PATH_LEN 260
+# ifdef OS2FAT
+# define NO_MULTIPLE_DOTS
+# define MAX_EXT_CHARS 3
+# define Z_SUFFIX "z"
+# define casemap(c) tolow(c)
+# endif
+# define NO_CHOWN
+# define PROTO
+# define STDC_HEADERS
+# include <io.h>
+# define OS_CODE 0x06
+# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY)
+# ifdef _MSC_VER
+# define HAVE_SYS_UTIME_H
+# define NO_UTIME_H
+# define MAXSEG_64K
+# undef near
+# define near _near
+# endif
+# ifdef __EMX__
+# define HAVE_SYS_UTIME_H
+# define NO_UTIME_H
+# define DIRENT
+# define EXPAND(argc,argv) \
+ {_response(&argc, &argv); _wildcard(&argc, &argv);}
+# endif
+# ifdef __BORLANDC__
+# define DIRENT
+# endif
+# ifdef __ZTC__
+# define NO_DIR
+# define NO_UTIME_H
+# include <dos.h>
+# define EXPAND(argc,argv) \
+ {response_expand(&argc, &argv);}
+# endif
+#endif
+
+#ifdef WIN32 /* Windows NT */
+# ifdef FPTEX
+# include <win32lib.h>
+# undef ERROR
+# define HAVE_SYS_UTIME_H
+# define NO_UTIME_H
+# define PATH_SEP2 '\\'
+# define PATH_SEP3 ':'
+# define MAX_PATH_LEN 260
+# define NO_CHOWN
+# define PROTO
+# define STDC_HEADERS
+# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY)
+# else
+# define HAVE_SYS_UTIME_H
+# define NO_UTIME_H
+# define PATH_SEP2 '\\'
+# define PATH_SEP3 ':'
+# define MAX_PATH_LEN 260
+# define NO_CHOWN
+# define PROTO
+# define STDC_HEADERS
+# define SET_BINARY_MODE(fd) setmode(fd, O_BINARY)
+# include <io.h>
+# include <malloc.h>
+# ifdef NTFAT
+# define NO_MULTIPLE_DOTS
+# define MAX_EXT_CHARS 3
+# define Z_SUFFIX "z"
+# define casemap(c) tolow(c) /* Force file names to lower case */
+# endif
+# endif
+# define OS_CODE 0x0b
+#endif
+
+#ifdef MSDOS
+# ifdef __TURBOC__
+# include <alloc.h>
+# define DYN_ALLOC
+ /* Turbo C 2.0 does not accept static allocations of large arrays */
+ void * fcalloc (unsigned items, unsigned size);
+ void fcfree (void *ptr);
+# else /* MSC */
+# include <malloc.h>
+# define fcalloc(nitems,itemsize) halloc((long)(nitems),(itemsize))
+# define fcfree(ptr) hfree(ptr)
+# endif
+#else
+# ifdef MAXSEG_64K
+# define fcalloc(items,size) calloc((items),(size))
+# else
+# define fcalloc(items,size) malloc((size_t)(items)*(size_t)(size))
+# endif
+# define fcfree(ptr) free(ptr)
+#endif
+
+#if defined(VAXC) || defined(VMS)
+# define PATH_SEP ']'
+# define PATH_SEP2 ':'
+# define SUFFIX_SEP ';'
+# define NO_MULTIPLE_DOTS
+# define Z_SUFFIX "-gz"
+# define RECORD_IO 1
+# define casemap(c) tolow(c)
+# define OS_CODE 0x02
+# define OPTIONS_VAR "GZIP_OPT"
+# define STDC_HEADERS
+# define NO_UTIME
+# define EXPAND(argc,argv) vms_expand_args(&argc,&argv);
+# include <file.h>
+# define unlink delete
+# ifdef VAXC
+# define NO_FCNTL_H
+# include <unixio.h>
+# endif
+#endif
+
+#ifdef AMIGA
+# define PATH_SEP2 ':'
+# define STDC_HEADERS
+# define OS_CODE 0x01
+# define ASMV
+# ifdef __GNUC__
+# define DIRENT
+# define HAVE_UNISTD_H
+# else /* SASC */
+# define NO_STDIN_FSTAT
+# define SYSDIR
+# define NO_SYMLINK
+# define NO_CHOWN
+# define NO_FCNTL_H
+# include <fcntl.h> /* for read() and write() */
+# define direct dirent
+ extern void _expand_args(int *argc, char ***argv);
+# define EXPAND(argc,argv) _expand_args(&argc,&argv);
+# undef O_BINARY /* disable useless --ascii option */
+# endif
+#endif
+
+#if defined(ATARI) || defined(atarist)
+# ifndef STDC_HEADERS
+# define STDC_HEADERS
+# define HAVE_UNISTD_H
+# define DIRENT
+# endif
+# define ASMV
+# define OS_CODE 0x05
+# ifdef TOSFS
+# define PATH_SEP2 '\\'
+# define PATH_SEP3 ':'
+# define MAX_PATH_LEN 128
+# define NO_MULTIPLE_DOTS
+# define MAX_EXT_CHARS 3
+# define Z_SUFFIX "z"
+# define NO_CHOWN
+# define casemap(c) tolow(c) /* Force file names to lower case */
+# define NO_SYMLINK
+# endif
+#endif
+
+#ifdef MACOS
+# define PATH_SEP ':'
+# define DYN_ALLOC
+# define PROTO
+# define NO_STDIN_FSTAT
+# define NO_CHOWN
+# define NO_UTIME
+# define chmod(file, mode) (0)
+# define OPEN(name, flags, mode) open(name, flags)
+# define OS_CODE 0x07
+# ifdef MPW
+# define isatty(fd) ((fd) <= 2)
+# endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+# define PATH_SEP '>'
+# define STDC_HEADERS
+# define NO_MEMORY_H
+# define NO_UTIME_H
+# define NO_UTIME
+# define NO_CHOWN
+# define NO_STDIN_FSTAT
+# define NO_SIZE_CHECK
+# define NO_SYMLINK
+# define RECORD_IO 1
+# define casemap(c) tolow(c) /* Force file names to lower case */
+# define put_char(c) put_byte((c) & 0x7F)
+# define get_char(c) ascii2pascii(get_byte())
+# define OS_CODE 0x0F /* temporary, subject to change */
+# ifdef SIGTERM
+# undef SIGTERM /* We don't want a signal handler for SIGTERM */
+# endif
+#endif
+
+#if defined(pyr) && !defined(NOMEMCPY) /* Pyramid */
+# define NOMEMCPY /* problem with overlapping copies */
+#endif
+
+#ifdef TOPS20
+# define OS_CODE 0x0a
+#endif
+
+#ifndef unix
+# define NO_ST_INO /* don't rely on inode numbers */
+#endif
+
+
+ /* Common defaults */
+
+#ifndef OS_CODE
+# define OS_CODE 0x03 /* assume Unix */
+#endif
+
+#ifndef PATH_SEP
+# define PATH_SEP '/'
+#endif
+
+#ifndef casemap
+# define casemap(c) (c)
+#endif
+
+#ifndef OPTIONS_VAR
+# define OPTIONS_VAR "GZIP"
+#endif
+
+#ifndef Z_SUFFIX
+# define Z_SUFFIX ".gz"
+#endif
+
+#ifdef MAX_EXT_CHARS
+# define MAX_SUFFIX MAX_EXT_CHARS
+#else
+# define MAX_SUFFIX 30
+#endif
+
+#ifndef MAKE_LEGAL_NAME
+# ifdef NO_MULTIPLE_DOTS
+# define MAKE_LEGAL_NAME(name) make_simple_name(name)
+# else
+# define MAKE_LEGAL_NAME(name)
+# endif
+#endif
+
+#ifndef MIN_PART
+# define MIN_PART 3
+ /* keep at least MIN_PART chars between dots in a file name. */
+#endif
+
+#ifndef EXPAND
+# define EXPAND(argc,argv)
+#endif
+
+#ifndef RECORD_IO
+# define RECORD_IO 0
+#endif
+
+#ifndef SET_BINARY_MODE
+# define SET_BINARY_MODE(fd)
+#endif
+
+#ifndef OPEN
+# define OPEN(name, flags, mode) open(name, flags, mode)
+#endif
+
+#ifndef get_char
+# define get_char() get_byte()
+#endif
+
+#ifndef put_char
+# define put_char(c) put_byte(c)
+#endif
diff --git a/Build/source/utils/gzip/trees.c b/Build/source/utils/gzip/trees.c
new file mode 100644
index 00000000000..db3b4b700ae
--- /dev/null
+++ b/Build/source/utils/gzip/trees.c
@@ -0,0 +1,1075 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+/*
+ * PURPOSE
+ *
+ * Encode various sets of source values using variable-length
+ * binary code trees.
+ *
+ * DISCUSSION
+ *
+ * The PKZIP "deflation" process uses several Huffman trees. The more
+ * common source values are represented by shorter bit sequences.
+ *
+ * Each code tree is stored in the ZIP file in a compressed form
+ * which is itself a Huffman encoding of the lengths of
+ * all the code strings (in ascending order by source values).
+ * The actual code strings are reconstructed from the lengths in
+ * the UNZIP process, as described in the "application note"
+ * (APPNOTE.TXT) distributed as part of PKWARE's PKZIP program.
+ *
+ * REFERENCES
+ *
+ * Lynch, Thomas J.
+ * Data Compression: Techniques and Applications, pp. 53-55.
+ * Lifetime Learning Publications, 1985. ISBN 0-534-03418-7.
+ *
+ * Storer, James A.
+ * Data Compression: Methods and Theory, pp. 49-50.
+ * Computer Science Press, 1988. ISBN 0-7167-8156-5.
+ *
+ * Sedgewick, R.
+ * Algorithms, p290.
+ * Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ *
+ * INTERFACE
+ *
+ * void ct_init (ush *attr, int *methodp)
+ * Allocate the match buffer, initialize the various tables and save
+ * the location of the internal file attribute (ascii/binary) and
+ * method (DEFLATE/STORE)
+ *
+ * void ct_tally (int dist, int lc);
+ * Save the match info and tally the frequency counts.
+ *
+ * long flush_block (char *buf, ulg stored_len, int eof)
+ * Determine the best encoding for the current block: dynamic trees,
+ * static trees or store, and output the encoded block to the zip
+ * file. Returns the total compressed length for the file so far.
+ *
+ */
+
+#include <ctype.h>
+
+#include "tailor.h"
+#include "gzip.h"
+
+#ifdef RCSID
+static char rcsid[] = "$Id: trees.c,v 0.12 1993/06/10 13:27:54 jloup Exp $";
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS 256
+/* number of literal bytes 0..255 */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES 30
+/* number of distance codes */
+
+#define BL_CODES 19
+/* number of codes used to transfer the bit lengths */
+
+
+local int near extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local int near extra_dbits[D_CODES] /* extra bits for each distance code */
+ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local int near extra_blbits[BL_CODES]/* extra bits for each bit length code */
+ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES 2
+/* The three kinds of block type */
+
+#ifndef LIT_BUFSIZE
+# ifdef SMALL_MEM
+# define LIT_BUFSIZE 0x2000
+# else
+# ifdef MEDIUM_MEM
+# define LIT_BUFSIZE 0x4000
+# else
+# define LIT_BUFSIZE 0x8000
+# endif
+# endif
+#endif
+#ifndef DIST_BUFSIZE
+# define DIST_BUFSIZE LIT_BUFSIZE
+#endif
+/* Sizes of match buffers for literals/lengths and distances. There are
+ * 4 reasons for limiting LIT_BUFSIZE to 64K:
+ * - frequencies can be kept in 16 bit counters
+ * - if compression is not successful for the first block, all input data is
+ * still in the window so we can still emit a stored block even when input
+ * comes from standard input. (This can also be done for all blocks if
+ * LIT_BUFSIZE is not greater than 32K.)
+ * - if compression is not successful for a file smaller than 64K, we can
+ * even emit a stored file instead of a stored block (saving 5 bytes).
+ * - creating new Huffman trees less frequently may not provide fast
+ * adaptation to changes in the input data statistics. (Take for
+ * example a binary file with poorly compressible code followed by
+ * a highly compressible string table.) Smaller buffer sizes give
+ * fast adaptation but have of course the overhead of transmitting trees
+ * more frequently.
+ * - I can't count above 4
+ * The current code is general and allows DIST_BUFSIZE < LIT_BUFSIZE (to save
+ * memory at the expense of compression). Some optimizations would be possible
+ * if we rely on DIST_BUFSIZE == LIT_BUFSIZE.
+ */
+#if LIT_BUFSIZE > INBUFSIZ
+ error cannot overlay l_buf and inbuf
+#endif
+
+#define REP_3_6 16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10 17
+/* repeat a zero length 3-10 times (3 bits of repeat count) */
+
+#define REPZ_11_138 18
+/* repeat a zero length 11-138 times (7 bits of repeat count) */
+
+/* ===========================================================================
+ * Local data
+ */
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data {
+ union {
+ ush freq; /* frequency count */
+ ush code; /* bit string */
+ } fc;
+ union {
+ ush dad; /* father node in Huffman tree */
+ ush len; /* length of bit string */
+ } dl;
+} ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad dl.dad
+#define Len dl.len
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+local ct_data near dyn_ltree[HEAP_SIZE]; /* literal and length tree */
+local ct_data near dyn_dtree[2*D_CODES+1]; /* distance tree */
+
+local ct_data near static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see ct_init
+ * below).
+ */
+
+local ct_data near static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+local ct_data near bl_tree[2*BL_CODES+1];
+/* Huffman tree for the bit lengths */
+
+typedef struct tree_desc {
+ ct_data near *dyn_tree; /* the dynamic tree */
+ ct_data near *static_tree; /* corresponding static tree or NULL */
+ int near *extra_bits; /* extra bits for each code or NULL */
+ int extra_base; /* base index for extra_bits */
+ int elems; /* max number of elements in the tree */
+ int max_length; /* max bit length for the codes */
+ int max_code; /* largest code with non zero frequency */
+} tree_desc;
+
+local tree_desc near l_desc =
+{dyn_ltree, static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS, 0};
+
+local tree_desc near d_desc =
+{dyn_dtree, static_dtree, extra_dbits, 0, D_CODES, MAX_BITS, 0};
+
+local tree_desc near bl_desc =
+{bl_tree, (ct_data near *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS, 0};
+
+
+local ush near bl_count[MAX_BITS+1];
+/* number of codes at each bit length for an optimal tree */
+
+local uch near bl_order[BL_CODES]
+ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+local int near heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
+local int heap_len; /* number of elements in the heap */
+local int heap_max; /* element of largest frequency */
+/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+ * The same heap array is used to build all trees.
+ */
+
+local uch near depth[2*L_CODES+1];
+/* Depth of each subtree used as tie breaker for trees of equal frequency */
+
+local uch length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local uch dist_code[512];
+/* distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+local int near base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int near base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#define l_buf inbuf
+/* DECLARE(uch, l_buf, LIT_BUFSIZE); buffer for literals or lengths */
+
+/* DECLARE(ush, d_buf, DIST_BUFSIZE); buffer for distances */
+
+local uch near flag_buf[(LIT_BUFSIZE/8)];
+/* flag_buf is a bit array distinguishing literals from lengths in
+ * l_buf, thus indicating the presence or absence of a distance.
+ */
+
+local unsigned last_lit; /* running index in l_buf */
+local unsigned last_dist; /* running index in d_buf */
+local unsigned last_flags; /* running index in flag_buf */
+local uch flags; /* current flags not yet saved in flag_buf */
+local uch flag_bit; /* current bit used in flags */
+/* bits are filled in flags starting at bit 0 (least significant).
+ * Note: these flags are overkill in the current code since we don't
+ * take advantage of DIST_BUFSIZE == LIT_BUFSIZE.
+ */
+
+local ulg opt_len; /* bit length of current block with optimal trees */
+local ulg static_len; /* bit length of current block with static trees */
+
+local ulg compressed_len; /* total bit length of compressed file */
+
+local ulg input_len; /* total byte length of input file */
+/* input_len is for debugging only since we can get it by other means. */
+
+ush *file_type; /* pointer to UNKNOWN, BINARY or ASCII */
+int *file_method; /* pointer to DEFLATE or STORE */
+
+#ifdef DEBUG
+extern ulg bits_sent; /* bit length of the compressed data */
+extern long isize; /* byte length of input file */
+#endif
+
+extern long block_start; /* window offset of current block */
+extern unsigned near strstart; /* window offset of current string */
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void init_block OF((void));
+local void pqdownheap OF((ct_data near *tree, int k));
+local void gen_bitlen OF((tree_desc near *desc));
+local void gen_codes OF((ct_data near *tree, int max_code));
+local void build_tree OF((tree_desc near *desc));
+local void scan_tree OF((ct_data near *tree, int max_code));
+local void send_tree OF((ct_data near *tree, int max_code));
+local int build_bl_tree OF((void));
+local void send_all_trees OF((int lcodes, int dcodes, int blcodes));
+local void compress_block OF((ct_data near *ltree, ct_data near *dtree));
+local void set_file_type OF((void));
+
+
+#ifndef DEBUG
+# define send_code(c, tree) send_bits(tree[c].Code, tree[c].Len)
+ /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* DEBUG */
+# define send_code(c, tree) \
+ { if (verbose>1) fprintf(stderr,"\ncd %3d ",(c)); \
+ send_bits(tree[c].Code, tree[c].Len); }
+#endif
+
+#define d_code(dist) \
+ ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. dist_code[256] and dist_code[257] are never
+ * used.
+ */
+
+#define MAX(a,b) (a >= b ? a : b)
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Allocate the match buffer, initialize the various tables and save the
+ * location of the internal file attribute (ascii/binary) and method
+ * (DEFLATE/STORE).
+ */
+void ct_init(attr, methodp)
+ ush *attr; /* pointer to internal file attribute */
+ int *methodp; /* pointer to compression method */
+{
+ int n; /* iterates over tree elements */
+ int bits; /* bit counter */
+ int length; /* length value */
+ int code; /* code value */
+ int dist; /* distance index */
+
+ file_type = attr;
+ file_method = methodp;
+ compressed_len = input_len = 0L;
+
+ if (static_dtree[0].Len != 0) return; /* ct_init already called */
+
+ /* Initialize the mapping length (0..255) -> length code (0..28) */
+ length = 0;
+ for (code = 0; code < LENGTH_CODES-1; code++) {
+ base_length[code] = length;
+ for (n = 0; n < (1<<extra_lbits[code]); n++) {
+ length_code[length++] = (uch)code;
+ }
+ }
+ Assert (length == 256, "ct_init: length != 256");
+ /* Note that the length 255 (match length 258) can be represented
+ * in two different ways: code 284 + 5 bits or code 285, so we
+ * overwrite length_code[255] to use the best encoding:
+ */
+ length_code[length-1] = (uch)code;
+
+ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+ dist = 0;
+ for (code = 0 ; code < 16; code++) {
+ base_dist[code] = dist;
+ for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ dist_code[dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "ct_init: dist != 256");
+ dist >>= 7; /* from now on, all distances are divided by 128 */
+ for ( ; code < D_CODES; code++) {
+ base_dist[code] = dist << 7;
+ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+ dist_code[256 + dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "ct_init: 256+dist != 512");
+
+ /* Construct the codes of the static literal tree */
+ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+ n = 0;
+ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+ /* Codes 286 and 287 do not exist, but we must include them in the
+ * tree construction to get a canonical Huffman tree (longest code
+ * all ones)
+ */
+ gen_codes((ct_data near *)static_ltree, L_CODES+1);
+
+ /* The static distance tree is trivial: */
+ for (n = 0; n < D_CODES; n++) {
+ static_dtree[n].Len = 5;
+ static_dtree[n].Code = bi_reverse(n, 5);
+ }
+
+ /* Initialize the first block of the first file: */
+ init_block();
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block()
+{
+ int n; /* iterates over tree elements */
+
+ /* Initialize the trees. */
+ for (n = 0; n < L_CODES; n++) dyn_ltree[n].Freq = 0;
+ for (n = 0; n < D_CODES; n++) dyn_dtree[n].Freq = 0;
+ for (n = 0; n < BL_CODES; n++) bl_tree[n].Freq = 0;
+
+ dyn_ltree[END_BLOCK].Freq = 1;
+ opt_len = static_len = 0L;
+ last_lit = last_dist = last_flags = 0;
+ flags = 0; flag_bit = 1;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(tree, top) \
+{\
+ top = heap[SMALLEST]; \
+ heap[SMALLEST] = heap[heap_len--]; \
+ pqdownheap(tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m) \
+ (tree[n].Freq < tree[m].Freq || \
+ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(tree, k)
+ ct_data near *tree; /* the tree to restore */
+ int k; /* node to move down */
+{
+ int v = heap[k];
+ int j = k << 1; /* left son of k */
+ while (j <= heap_len) {
+ /* Set j to the smallest of the two sons: */
+ if (j < heap_len && smaller(tree, heap[j+1], heap[j])) j++;
+
+ /* Exit if v is smaller than both sons */
+ if (smaller(tree, v, heap[j])) break;
+
+ /* Exchange v with the smallest son */
+ heap[k] = heap[j]; k = j;
+
+ /* And continue down the tree, setting j to the left son of k */
+ j <<= 1;
+ }
+ heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ * above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ * array bl_count contains the frequencies for each bit length.
+ * The length opt_len is updated; static_len is also updated if stree is
+ * not null.
+ */
+local void gen_bitlen(desc)
+ tree_desc near *desc; /* the tree descriptor */
+{
+ ct_data near *tree = desc->dyn_tree;
+ int near *extra = desc->extra_bits;
+ int base = desc->extra_base;
+ int max_code = desc->max_code;
+ int max_length = desc->max_length;
+ ct_data near *stree = desc->static_tree;
+ int h; /* heap index */
+ int n, m; /* iterate over the tree elements */
+ int bits; /* bit length */
+ int xbits; /* extra bits */
+ ush f; /* frequency */
+ int overflow = 0; /* number of elements with bit length too large */
+
+ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+
+ /* In a first pass, compute the optimal bit lengths (which may
+ * overflow in the case of the bit length tree).
+ */
+ tree[heap[heap_max]].Len = 0; /* root of the heap */
+
+ for (h = heap_max+1; h < HEAP_SIZE; h++) {
+ n = heap[h];
+ bits = tree[tree[n].Dad].Len + 1;
+ if (bits > max_length) bits = max_length, overflow++;
+ tree[n].Len = (ush)bits;
+ /* We overwrite tree[n].Dad which is no longer needed */
+
+ if (n > max_code) continue; /* not a leaf node */
+
+ bl_count[bits]++;
+ xbits = 0;
+ if (n >= base) xbits = extra[n-base];
+ f = tree[n].Freq;
+ opt_len += (ulg)f * (bits + xbits);
+ if (stree) static_len += (ulg)f * (stree[n].Len + xbits);
+ }
+ if (overflow == 0) return;
+
+ Trace((stderr,"\nbit length overflow\n"));
+ /* This happens for example on obj2 and pic of the Calgary corpus */
+
+ /* Find the first bit length which could increase: */
+ do {
+ bits = max_length-1;
+ while (bl_count[bits] == 0) bits--;
+ bl_count[bits]--; /* move one leaf down the tree */
+ bl_count[bits+1] += 2; /* move one overflow item as its brother */
+ bl_count[max_length]--;
+ /* The brother of the overflow item also moves one step up,
+ * but this does not affect bl_count[max_length]
+ */
+ overflow -= 2;
+ } while (overflow > 0);
+
+ /* Now recompute all bit lengths, scanning in increasing frequency.
+ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+ * lengths instead of fixing only the wrong ones. This idea is taken
+ * from 'ar' written by Haruhiko Okumura.)
+ */
+ for (bits = max_length; bits != 0; bits--) {
+ n = bl_count[bits];
+ while (n != 0) {
+ m = heap[--h];
+ if (m > max_code) continue;
+ if (tree[m].Len != (unsigned) bits) {
+ Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+ opt_len += ((long)bits-(long)tree[m].Len)*(long)tree[m].Freq;
+ tree[m].Len = (ush)bits;
+ }
+ n--;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ * zero code length.
+ */
+local void gen_codes (tree, max_code)
+ ct_data near *tree; /* the tree to decorate */
+ int max_code; /* largest code with non zero frequency */
+{
+ ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+ ush code = 0; /* running code value */
+ int bits; /* bit index */
+ int n; /* code index */
+
+ /* The distribution counts are first used to generate the code values
+ * without bit reversal.
+ */
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ next_code[bits] = code = (code + bl_count[bits-1]) << 1;
+ }
+ /* Check that the bit counts in bl_count are consistent. The last code
+ * must be all ones.
+ */
+ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+ "inconsistent bit counts");
+ Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+ for (n = 0; n <= max_code; n++) {
+ int len = tree[n].Len;
+ if (len == 0) continue;
+ /* Now reverse the bits */
+ tree[n].Code = bi_reverse(next_code[len]++, len);
+
+ Tracec(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ * and corresponding code. The length opt_len is updated; static_len is
+ * also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(desc)
+ tree_desc near *desc; /* the tree descriptor */
+{
+ ct_data near *tree = desc->dyn_tree;
+ ct_data near *stree = desc->static_tree;
+ int elems = desc->elems;
+ int n, m; /* iterate over heap elements */
+ int max_code = -1; /* largest code with non zero frequency */
+ int node = elems; /* next internal node of the tree */
+
+ /* Construct the initial heap, with least frequent element in
+ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+ * heap[0] is not used.
+ */
+ heap_len = 0, heap_max = HEAP_SIZE;
+
+ for (n = 0; n < elems; n++) {
+ if (tree[n].Freq != 0) {
+ heap[++heap_len] = max_code = n;
+ depth[n] = 0;
+ } else {
+ tree[n].Len = 0;
+ }
+ }
+
+ /* The pkzip format requires that at least one distance code exists,
+ * and that at least one bit should be sent even if there is only one
+ * possible code. So to avoid special checks later on we force at least
+ * two codes of non zero frequency.
+ */
+ while (heap_len < 2) {
+ int new = heap[++heap_len] = (max_code < 2 ? ++max_code : 0);
+ tree[new].Freq = 1;
+ depth[new] = 0;
+ opt_len--; if (stree) static_len -= stree[new].Len;
+ /* new is 0 or 1 so it does not have extra bits */
+ }
+ desc->max_code = max_code;
+
+ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+ * establish sub-heaps of increasing lengths:
+ */
+ for (n = heap_len/2; n >= 1; n--) pqdownheap(tree, n);
+
+ /* Construct the Huffman tree by repeatedly combining the least two
+ * frequent nodes.
+ */
+ do {
+ pqremove(tree, n); /* n = node of least frequency */
+ m = heap[SMALLEST]; /* m = node of next least frequency */
+
+ heap[--heap_max] = n; /* keep the nodes sorted by frequency */
+ heap[--heap_max] = m;
+
+ /* Create a new node father of n and m */
+ tree[node].Freq = tree[n].Freq + tree[m].Freq;
+ depth[node] = (uch) (MAX(depth[n], depth[m]) + 1);
+ tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+ if (tree == bl_tree) {
+ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+ }
+#endif
+ /* and insert the new node in the heap */
+ heap[SMALLEST] = node++;
+ pqdownheap(tree, SMALLEST);
+
+ } while (heap_len >= 2);
+
+ heap[--heap_max] = heap[SMALLEST];
+
+ /* At this point, the fields freq and dad are set. We can now
+ * generate the bit lengths.
+ */
+ gen_bitlen((tree_desc near *)desc);
+
+ /* The field len is now set, we can generate the bit codes */
+ gen_codes ((ct_data near *)tree, max_code);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree. Updates opt_len to take into account the repeat
+ * counts. (The contribution of the bit length codes will be added later
+ * during the construction of bl_tree.)
+ */
+local void scan_tree (tree, max_code)
+ ct_data near *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ if (nextlen == 0) max_count = 138, min_count = 3;
+ tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ bl_tree[curlen].Freq += count;
+ } else if (curlen != 0) {
+ if (curlen != prevlen) bl_tree[curlen].Freq++;
+ bl_tree[REP_3_6].Freq++;
+ } else if (count <= 10) {
+ bl_tree[REPZ_3_10].Freq++;
+ } else {
+ bl_tree[REPZ_11_138].Freq++;
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (tree, max_code)
+ ct_data near *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ /* tree[max_code+1].Len = -1; */ /* guard already set */
+ if (nextlen == 0) max_count = 138, min_count = 3;
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ do { send_code(curlen, bl_tree); } while (--count != 0);
+
+ } else if (curlen != 0) {
+ if (curlen != prevlen) {
+ send_code(curlen, bl_tree); count--;
+ }
+ Assert(count >= 3 && count <= 6, " 3_6?");
+ send_code(REP_3_6, bl_tree); send_bits(count-3, 2);
+
+ } else if (count <= 10) {
+ send_code(REPZ_3_10, bl_tree); send_bits(count-3, 3);
+
+ } else {
+ send_code(REPZ_11_138, bl_tree); send_bits(count-11, 7);
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree()
+{
+ int max_blindex; /* index of last bit length code of non zero freq */
+
+ /* Determine the bit length frequencies for literal and distance trees */
+ scan_tree((ct_data near *)dyn_ltree, l_desc.max_code);
+ scan_tree((ct_data near *)dyn_dtree, d_desc.max_code);
+
+ /* Build the bit length tree: */
+ build_tree((tree_desc near *)(&bl_desc));
+ /* opt_len now includes the length of the tree representations, except
+ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+ */
+
+ /* Determine the number of bit length codes to send. The pkzip format
+ * requires that at least 4 bit length codes be sent. (appnote.txt says
+ * 3 but the actual value used is 4.)
+ */
+ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+ if (bl_tree[bl_order[max_blindex]].Len != 0) break;
+ }
+ /* Update opt_len to include the bit length tree and counts */
+ opt_len += 3*(max_blindex+1) + 5+5+4;
+ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", opt_len, static_len));
+
+ return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(lcodes, dcodes, blcodes)
+ int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+ int rank; /* index in bl_order */
+
+ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+ "too many codes");
+ Tracev((stderr, "\nbl counts: "));
+ send_bits(lcodes-257, 5); /* not +255 as stated in appnote.txt */
+ send_bits(dcodes-1, 5);
+ send_bits(blcodes-4, 4); /* not -3 as stated in appnote.txt */
+ for (rank = 0; rank < blcodes; rank++) {
+ Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+ send_bits(bl_tree[bl_order[rank]].Len, 3);
+ }
+ Tracev((stderr, "\nbl tree: sent %ld", bits_sent));
+
+ send_tree((ct_data near *)dyn_ltree, lcodes-1); /* send the literal tree */
+ Tracev((stderr, "\nlit tree: sent %ld", bits_sent));
+
+ send_tree((ct_data near *)dyn_dtree, dcodes-1); /* send the distance tree */
+ Tracev((stderr, "\ndist tree: sent %ld", bits_sent));
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file. This function
+ * returns the total compressed length for the file so far.
+ */
+ulg flush_block(buf, stored_len, eof)
+ char *buf; /* input block, or NULL if too old */
+ ulg stored_len; /* length of input block */
+ int eof; /* true if this is the last block for a file */
+{
+ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+ int max_blindex; /* index of last bit length code of non zero freq */
+
+ flag_buf[last_flags] = flags; /* Save the flags for the last 8 items */
+
+ /* Check if the file is ascii or binary */
+ if (*file_type == (ush)UNKNOWN) set_file_type();
+
+ /* Construct the literal and distance trees */
+ build_tree((tree_desc near *)(&l_desc));
+ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", opt_len, static_len));
+
+ build_tree((tree_desc near *)(&d_desc));
+ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", opt_len, static_len));
+ /* At this point, opt_len and static_len are the total bit lengths of
+ * the compressed block data, excluding the tree representations.
+ */
+
+ /* Build the bit length tree for the above two trees, and get the index
+ * in bl_order of the last bit length code to send.
+ */
+ max_blindex = build_bl_tree();
+
+ /* Determine the best encoding. Compute first the block length in bytes */
+ opt_lenb = (opt_len+3+7)>>3;
+ static_lenb = (static_len+3+7)>>3;
+ input_len += stored_len; /* for debugging only */
+
+ Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ",
+ opt_lenb, opt_len, static_lenb, static_len, stored_len,
+ last_lit, last_dist));
+
+ if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+ /* If compression failed and this is the first and last block,
+ * and if the zip file can be seeked (to rewrite the local header),
+ * the whole file is transformed into a stored file:
+ */
+#ifdef FORCE_METHOD
+ if (level == 1 && eof && compressed_len == 0L) { /* force stored file */
+#else
+ if (stored_len <= opt_lenb && eof && compressed_len == 0L && seekable()) {
+#endif
+ /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */
+ if (buf == (char*)0) error ("block vanished");
+
+ copy_block(buf, (unsigned)stored_len, 0); /* without header */
+ compressed_len = stored_len << 3;
+ *file_method = STORED;
+
+#ifdef FORCE_METHOD
+ } else if (level == 2 && buf != (char*)0) { /* force stored block */
+#else
+ } else if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+ /* 4: two words for the lengths */
+#endif
+ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+ * Otherwise we can't have processed more than WSIZE input bytes since
+ * the last block flush, because compression would have been
+ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+ * transform a block into a stored block.
+ */
+ send_bits((STORED_BLOCK<<1)+eof, 3); /* send block type */
+ compressed_len = (compressed_len + 3 + 7) & ~7L;
+ compressed_len += (stored_len + 4) << 3;
+
+ copy_block(buf, (unsigned)stored_len, 1); /* with header */
+
+#ifdef FORCE_METHOD
+ } else if (level == 3) { /* force static trees */
+#else
+ } else if (static_lenb == opt_lenb) {
+#endif
+ send_bits((STATIC_TREES<<1)+eof, 3);
+ compress_block((ct_data near *)static_ltree, (ct_data near *)static_dtree);
+ compressed_len += 3 + static_len;
+ } else {
+ send_bits((DYN_TREES<<1)+eof, 3);
+ send_all_trees(l_desc.max_code+1, d_desc.max_code+1, max_blindex+1);
+ compress_block((ct_data near *)dyn_ltree, (ct_data near *)dyn_dtree);
+ compressed_len += 3 + opt_len;
+ }
+ Assert (compressed_len == bits_sent, "bad compressed size");
+ init_block();
+
+ if (eof) {
+ Assert (input_len == isize, "bad input size");
+ bi_windup();
+ compressed_len += 7; /* align on byte boundary */
+ }
+ Tracev((stderr,"\ncomprlen %lu(%lu) ", compressed_len>>3,
+ compressed_len-7*eof));
+
+ return compressed_len >> 3;
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int ct_tally (dist, lc)
+ int dist; /* distance of matched string */
+ int lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+ l_buf[last_lit++] = (uch)lc;
+ if (dist == 0) {
+ /* lc is the unmatched char */
+ dyn_ltree[lc].Freq++;
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ dist--; /* dist = match distance - 1 */
+ Assert((ush)dist < (ush)MAX_DIST &&
+ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+ (ush)d_code(dist) < (ush)D_CODES, "ct_tally: bad match");
+
+ dyn_ltree[length_code[lc]+LITERALS+1].Freq++;
+ dyn_dtree[d_code(dist)].Freq++;
+
+ d_buf[last_dist++] = (ush)dist;
+ flags |= flag_bit;
+ }
+ flag_bit <<= 1;
+
+ /* Output the flags if they fill a byte: */
+ if ((last_lit & 7) == 0) {
+ flag_buf[last_flags++] = flags;
+ flags = 0, flag_bit = 1;
+ }
+ /* Try to guess if it is profitable to stop the current block here */
+ if (level > 2 && (last_lit & 0xfff) == 0) {
+ /* Compute an upper bound for the compressed length */
+ ulg out_length = (ulg)last_lit*8L;
+ ulg in_length = (ulg)strstart-block_start;
+ int dcode;
+ for (dcode = 0; dcode < D_CODES; dcode++) {
+ out_length += (ulg)dyn_dtree[dcode].Freq*(5L+extra_dbits[dcode]);
+ }
+ out_length >>= 3;
+ Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ",
+ last_lit, last_dist, in_length, out_length,
+ 100L - out_length*100L/in_length));
+ if (last_dist < last_lit/2 && out_length < in_length/2) return 1;
+ }
+ return (last_lit == LIT_BUFSIZE-1 || last_dist == DIST_BUFSIZE);
+ /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K
+ * on 16 bit machines and because stored blocks are restricted to
+ * 64K-1 bytes.
+ */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(ltree, dtree)
+ ct_data near *ltree; /* literal tree */
+ ct_data near *dtree; /* distance tree */
+{
+ unsigned dist; /* distance of matched string */
+ int lc; /* match length or unmatched char (if dist == 0) */
+ unsigned lx = 0; /* running index in l_buf */
+ unsigned dx = 0; /* running index in d_buf */
+ unsigned fx = 0; /* running index in flag_buf */
+ uch flag = 0; /* current flags */
+ unsigned code; /* the code to send */
+ int extra; /* number of extra bits to send */
+
+ if (last_lit != 0) do {
+ if ((lx & 7) == 0) flag = flag_buf[fx++];
+ lc = l_buf[lx++];
+ if ((flag & 1) == 0) {
+ send_code(lc, ltree); /* send a literal byte */
+ Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ code = length_code[lc];
+ send_code(code+LITERALS+1, ltree); /* send the length code */
+ extra = extra_lbits[code];
+ if (extra != 0) {
+ lc -= base_length[code];
+ send_bits(lc, extra); /* send the extra length bits */
+ }
+ dist = d_buf[dx++];
+ /* Here, dist is the match distance - 1 */
+ code = d_code(dist);
+ Assert (code < D_CODES, "bad d_code");
+
+ send_code(code, dtree); /* send the distance code */
+ extra = extra_dbits[code];
+ if (extra != 0) {
+ dist -= base_dist[code];
+ send_bits(dist, extra); /* send the extra distance bits */
+ }
+ } /* literal or match pair ? */
+ flag >>= 1;
+ } while (lx < last_lit);
+
+ send_code(END_BLOCK, ltree);
+}
+
+/* ===========================================================================
+ * Set the file type to ASCII or BINARY, using a crude approximation:
+ * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
+ * IN assertion: the fields freq of dyn_ltree are set and the total of all
+ * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
+ */
+local void set_file_type()
+{
+ int n = 0;
+ unsigned ascii_freq = 0;
+ unsigned bin_freq = 0;
+ while (n < 7) bin_freq += dyn_ltree[n++].Freq;
+ while (n < 128) ascii_freq += dyn_ltree[n++].Freq;
+ while (n < LITERALS) bin_freq += dyn_ltree[n++].Freq;
+ *file_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
+ if (*file_type == BINARY && translate_eol) {
+ warn("-l used on binary file", "");
+ }
+}
diff --git a/Build/source/utils/gzip/unlzh.c b/Build/source/utils/gzip/unlzh.c
new file mode 100644
index 00000000000..e318e5ed941
--- /dev/null
+++ b/Build/source/utils/gzip/unlzh.c
@@ -0,0 +1,401 @@
+/* unlzh.c -- decompress files in SCO compress -H (LZH) format.
+ * The code in this file is directly derived from the public domain 'ar002'
+ * written by Haruhiko Okumura.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: unlzh.c,v 1.2 1993/06/24 10:59:01 jloup Exp $";
+#endif
+
+#include <stdio.h>
+
+#include "tailor.h"
+#include "gzip.h"
+#include "lzw.h" /* just for consistency checking */
+
+/* decode.c */
+
+local unsigned decode OF((unsigned count, uch buffer[]));
+local void decode_start OF((void));
+
+/* huf.c */
+local void huf_decode_start OF((void));
+local unsigned decode_c OF((void));
+local unsigned decode_p OF((void));
+local void read_pt_len OF((int nn, int nbit, int i_special));
+local void read_c_len OF((void));
+
+/* io.c */
+local void fillbuf OF((int n));
+local unsigned getbits OF((int n));
+local void init_getbits OF((void));
+
+/* maketbl.c */
+
+local void make_table OF((int nchar, uch bitlen[],
+ int tablebits, ush table[]));
+
+
+#define DICBIT 13 /* 12(-lh4-) or 13(-lh5-) */
+#define DICSIZ ((unsigned) 1 << DICBIT)
+
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+#ifndef UCHAR_MAX
+# define UCHAR_MAX 255
+#endif
+
+#define BITBUFSIZ (CHAR_BIT * 2 * sizeof(char))
+/* Do not use CHAR_BIT * sizeof(bitbuf), does not work on machines
+ * for which short is not on 16 bits (Cray).
+ */
+
+/* encode.c and decode.c */
+
+#define MAXMATCH 256 /* formerly F (not more than UCHAR_MAX + 1) */
+#define THRESHOLD 3 /* choose optimal value */
+
+/* huf.c */
+
+#define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
+ /* alphabet = {0, 1, 2, ..., NC - 1} */
+#define CBIT 9 /* $\lfloor \log_2 NC \rfloor + 1$ */
+#define CODE_BIT 16 /* codeword length */
+
+#define NP (DICBIT + 1)
+#define NT (CODE_BIT + 3)
+#define PBIT 4 /* smallest integer such that (1U << PBIT) > NP */
+#define TBIT 5 /* smallest integer such that (1U << TBIT) > NT */
+#if NT > NP
+# define NPT NT
+#else
+# define NPT NP
+#endif
+
+/* local ush left[2 * NC - 1]; */
+/* local ush right[2 * NC - 1]; */
+#define left prev
+#define right head
+#if NC > (1<<(BITS-2))
+ error cannot overlay left+right and prev
+#endif
+
+/* local uch c_len[NC]; */
+#define c_len outbuf
+#if NC > OUTBUFSIZ
+ error cannot overlay c_len and outbuf
+#endif
+
+local uch pt_len[NPT];
+local unsigned blocksize;
+local ush pt_table[256];
+
+/* local ush c_table[4096]; */
+#define c_table d_buf
+#if (DIST_BUFSIZE-1) < 4095
+ error cannot overlay c_table and d_buf
+#endif
+
+/***********************************************************
+ io.c -- input/output
+***********************************************************/
+
+local ush bitbuf;
+local unsigned subbitbuf;
+local int bitcount;
+
+local void fillbuf(n) /* Shift bitbuf n bits left, read n bits */
+ int n;
+{
+ bitbuf <<= n;
+ while (n > bitcount) {
+ bitbuf |= subbitbuf << (n -= bitcount);
+ subbitbuf = (unsigned)try_byte();
+ if ((int)subbitbuf == EOF) subbitbuf = 0;
+ bitcount = CHAR_BIT;
+ }
+ bitbuf |= subbitbuf >> (bitcount -= n);
+}
+
+local unsigned getbits(n)
+ int n;
+{
+ unsigned x;
+
+ x = bitbuf >> (BITBUFSIZ - n); fillbuf(n);
+ return x;
+}
+
+local void init_getbits()
+{
+ bitbuf = 0; subbitbuf = 0; bitcount = 0;
+ fillbuf(BITBUFSIZ);
+}
+
+/***********************************************************
+ maketbl.c -- make table for decoding
+***********************************************************/
+
+local void make_table(nchar, bitlen, tablebits, table)
+ int nchar;
+ uch bitlen[];
+ int tablebits;
+ ush table[];
+{
+ ush count[17], weight[17], start[18], *p;
+ unsigned i, k, len, ch, jutbits, avail, nextcode, mask;
+
+ for (i = 1; i <= 16; i++) count[i] = 0;
+ for (i = 0; i < (unsigned)nchar; i++) count[bitlen[i]]++;
+
+ start[1] = 0;
+ for (i = 1; i <= 16; i++)
+ start[i + 1] = start[i] + (count[i] << (16 - i));
+ if ((start[17] & 0xffff) != 0)
+ error("Bad table\n");
+
+ jutbits = 16 - tablebits;
+ for (i = 1; i <= (unsigned)tablebits; i++) {
+ start[i] >>= jutbits;
+ weight[i] = (unsigned) 1 << (tablebits - i);
+ }
+ while (i <= 16) {
+ weight[i] = (unsigned) 1 << (16 - i);
+ i++;
+ }
+
+ i = start[tablebits + 1] >> jutbits;
+ if (i != 0) {
+ k = 1 << tablebits;
+ while (i != k) table[i++] = 0;
+ }
+
+ avail = nchar;
+ mask = (unsigned) 1 << (15 - tablebits);
+ for (ch = 0; ch < (unsigned)nchar; ch++) {
+ if ((len = bitlen[ch]) == 0) continue;
+ nextcode = start[len] + weight[len];
+ if (len <= (unsigned)tablebits) {
+ for (i = start[len]; i < nextcode; i++) table[i] = ch;
+ } else {
+ k = start[len];
+ p = &table[k >> jutbits];
+ i = len - tablebits;
+ while (i != 0) {
+ if (*p == 0) {
+ right[avail] = left[avail] = 0;
+ *p = avail++;
+ }
+ if (k & mask) p = &right[*p];
+ else p = &left[*p];
+ k <<= 1; i--;
+ }
+ *p = ch;
+ }
+ start[len] = nextcode;
+ }
+}
+
+/***********************************************************
+ huf.c -- static Huffman
+***********************************************************/
+
+local void read_pt_len(nn, nbit, i_special)
+ int nn;
+ int nbit;
+ int i_special;
+{
+ int i, c, n;
+ unsigned mask;
+
+ n = getbits(nbit);
+ if (n == 0) {
+ c = getbits(nbit);
+ for (i = 0; i < nn; i++) pt_len[i] = 0;
+ for (i = 0; i < 256; i++) pt_table[i] = c;
+ } else {
+ i = 0;
+ while (i < n) {
+ c = bitbuf >> (BITBUFSIZ - 3);
+ if (c == 7) {
+ mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
+ while (mask & bitbuf) { mask >>= 1; c++; }
+ }
+ fillbuf((c < 7) ? 3 : c - 3);
+ pt_len[i++] = c;
+ if (i == i_special) {
+ c = getbits(2);
+ while (--c >= 0) pt_len[i++] = 0;
+ }
+ }
+ while (i < nn) pt_len[i++] = 0;
+ make_table(nn, pt_len, 8, pt_table);
+ }
+}
+
+local void read_c_len()
+{
+ int i, c, n;
+ unsigned mask;
+
+ n = getbits(CBIT);
+ if (n == 0) {
+ c = getbits(CBIT);
+ for (i = 0; i < NC; i++) c_len[i] = 0;
+ for (i = 0; i < 4096; i++) c_table[i] = c;
+ } else {
+ i = 0;
+ while (i < n) {
+ c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
+ if (c >= NT) {
+ mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
+ do {
+ if (bitbuf & mask) c = right[c];
+ else c = left [c];
+ mask >>= 1;
+ } while (c >= NT);
+ }
+ fillbuf((int) pt_len[c]);
+ if (c <= 2) {
+ if (c == 0) c = 1;
+ else if (c == 1) c = getbits(4) + 3;
+ else c = getbits(CBIT) + 20;
+ while (--c >= 0) c_len[i++] = 0;
+ } else c_len[i++] = c - 2;
+ }
+ while (i < NC) c_len[i++] = 0;
+ make_table(NC, c_len, 12, c_table);
+ }
+}
+
+local unsigned decode_c()
+{
+ unsigned j, mask;
+
+ if (blocksize == 0) {
+ blocksize = getbits(16);
+ if (blocksize == 0) {
+ return NC; /* end of file */
+ }
+ read_pt_len(NT, TBIT, 3);
+ read_c_len();
+ read_pt_len(NP, PBIT, -1);
+ }
+ blocksize--;
+ j = c_table[bitbuf >> (BITBUFSIZ - 12)];
+ if (j >= NC) {
+ mask = (unsigned) 1 << (BITBUFSIZ - 1 - 12);
+ do {
+ if (bitbuf & mask) j = right[j];
+ else j = left [j];
+ mask >>= 1;
+ } while (j >= NC);
+ }
+ fillbuf((int) c_len[j]);
+ return j;
+}
+
+local unsigned decode_p()
+{
+ unsigned j, mask;
+
+ j = pt_table[bitbuf >> (BITBUFSIZ - 8)];
+ if (j >= NP) {
+ mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
+ do {
+ if (bitbuf & mask) j = right[j];
+ else j = left [j];
+ mask >>= 1;
+ } while (j >= NP);
+ }
+ fillbuf((int) pt_len[j]);
+ if (j != 0) j = ((unsigned) 1 << (j - 1)) + getbits((int) (j - 1));
+ return j;
+}
+
+local void huf_decode_start()
+{
+ init_getbits(); blocksize = 0;
+}
+
+/***********************************************************
+ decode.c
+***********************************************************/
+
+local int j; /* remaining bytes to copy */
+local int done; /* set at end of input */
+
+local void decode_start()
+{
+ huf_decode_start();
+ j = 0;
+ done = 0;
+}
+
+/* Decode the input and return the number of decoded bytes put in buffer
+ */
+local unsigned decode(count, buffer)
+ unsigned count;
+ uch buffer[];
+ /* The calling function must keep the number of
+ bytes to be processed. This function decodes
+ either 'count' bytes or 'DICSIZ' bytes, whichever
+ is smaller, into the array 'buffer[]' of size
+ 'DICSIZ' or more.
+ Call decode_start() once for each new file
+ before calling this function.
+ */
+{
+ local unsigned i;
+ unsigned r, c;
+
+ r = 0;
+ while (--j >= 0) {
+ buffer[r] = buffer[i];
+ i = (i + 1) & (DICSIZ - 1);
+ if (++r == count) return r;
+ }
+ for ( ; ; ) {
+ c = decode_c();
+ if (c == NC) {
+ done = 1;
+ return r;
+ }
+ if (c <= UCHAR_MAX) {
+ buffer[r] = c;
+ if (++r == count) return r;
+ } else {
+ j = c - (UCHAR_MAX + 1 - THRESHOLD);
+ i = (r - decode_p() - 1) & (DICSIZ - 1);
+ while (--j >= 0) {
+ buffer[r] = buffer[i];
+ i = (i + 1) & (DICSIZ - 1);
+ if (++r == count) return r;
+ }
+ }
+ }
+}
+
+
+/* ===========================================================================
+ * Unlzh in to out. Return OK or ERROR.
+ */
+int unlzh(in, out)
+ int in;
+ int out;
+{
+ unsigned n;
+ ifd = in;
+ ofd = out;
+
+ decode_start();
+ while (!done) {
+ n = decode((unsigned) DICSIZ, window);
+ if (!test && n > 0) {
+ write_buf(out, (char*)window, n);
+ }
+ }
+ return OK;
+}
diff --git a/Build/source/utils/gzip/unlzw-new.c b/Build/source/utils/gzip/unlzw-new.c
new file mode 100644
index 00000000000..15d2a313b4b
--- /dev/null
+++ b/Build/source/utils/gzip/unlzw-new.c
@@ -0,0 +1,377 @@
+/* unlzw.c -- decompress files in LZW format.
+ * The code in this file is directly derived from the public domain 'compress'
+ * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies,
+ * Ken Turkowski, Dave Mack and Peter Jannesen.
+ *
+ * This is a temporary version which will be rewritten in some future version
+ * to accommodate in-memory decompression.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: unlzw.c,v 0.15 1993/06/10 13:28:35 jloup Exp $";
+#endif
+
+#include <sys/types.h>
+
+#include "tailor.h"
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifndef NO_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#include "gzip.h"
+#include "lzw.h"
+
+typedef unsigned char char_type;
+typedef long code_int;
+typedef unsigned long count_int;
+typedef unsigned short count_short;
+typedef unsigned long cmp_code_int;
+
+#define MAXCODE(n) (1L << (n))
+
+#ifndef REGISTERS
+# define REGISTERS 2
+#endif
+#define REG1
+#define REG2
+#define REG3
+#define REG4
+#define REG5
+#define REG6
+#define REG7
+#define REG8
+#define REG9
+#define REG10
+#define REG11
+#define REG12
+#define REG13
+#define REG14
+#define REG15
+#define REG16
+#if REGISTERS >= 1
+# undef REG1
+# define REG1 register
+#endif
+#if REGISTERS >= 2
+# undef REG2
+# define REG2 register
+#endif
+#if REGISTERS >= 3
+# undef REG3
+# define REG3 register
+#endif
+#if REGISTERS >= 4
+# undef REG4
+# define REG4 register
+#endif
+#if REGISTERS >= 5
+# undef REG5
+# define REG5 register
+#endif
+#if REGISTERS >= 6
+# undef REG6
+# define REG6 register
+#endif
+#if REGISTERS >= 7
+# undef REG7
+# define REG7 register
+#endif
+#if REGISTERS >= 8
+# undef REG8
+# define REG8 register
+#endif
+#if REGISTERS >= 9
+# undef REG9
+# define REG9 register
+#endif
+#if REGISTERS >= 10
+# undef REG10
+# define REG10 register
+#endif
+#if REGISTERS >= 11
+# undef REG11
+# define REG11 register
+#endif
+#if REGISTERS >= 12
+# undef REG12
+# define REG12 register
+#endif
+#if REGISTERS >= 13
+# undef REG13
+# define REG13 register
+#endif
+#if REGISTERS >= 14
+# undef REG14
+# define REG14 register
+#endif
+#if REGISTERS >= 15
+# undef REG15
+# define REG15 register
+#endif
+#if REGISTERS >= 16
+# undef REG16
+# define REG16 register
+#endif
+
+#ifndef BYTEORDER
+# define BYTEORDER 0000
+#endif
+
+#ifndef NOALLIGN
+# define NOALLIGN 0
+#endif
+
+
+union bytes {
+ long word;
+ struct {
+#if BYTEORDER == 4321
+ char_type b1;
+ char_type b2;
+ char_type b3;
+ char_type b4;
+#else
+#if BYTEORDER == 1234
+ char_type b4;
+ char_type b3;
+ char_type b2;
+ char_type b1;
+#else
+# undef BYTEORDER
+ int dummy;
+#endif
+#endif
+ } bytes;
+};
+
+#if BYTEORDER == 4321 && NOALLIGN == 1
+# define input(b,o,c,n,m){ \
+ (c) = (*(long *)(&(b)[(o)>>3])>>((o)&0x7))&(m); \
+ (o) += (n); \
+ }
+#else
+# define input(b,o,c,n,m){ \
+ REG1 char_type *p = &(b)[(o)>>3]; \
+ (c) = ((((long)(p[0]))|((long)(p[1])<<8)| \
+ ((long)(p[2])<<16))>>((o)&0x7))&(m); \
+ (o) += (n); \
+ }
+#endif
+
+#ifndef MAXSEG_64K
+ /* DECLARE(ush, tab_prefix, (1<<BITS)); -- prefix code */
+# define tab_prefixof(i) tab_prefix[i]
+# define clear_tab_prefixof() memzero(tab_prefix, 256);
+#else
+ /* DECLARE(ush, tab_prefix0, (1<<(BITS-1)); -- prefix for even codes */
+ /* DECLARE(ush, tab_prefix1, (1<<(BITS-1)); -- prefix for odd codes */
+ ush *tab_prefix[2];
+# define tab_prefixof(i) tab_prefix[(i)&1][(i)>>1]
+# define clear_tab_prefixof() \
+ memzero(tab_prefix0, 128), \
+ memzero(tab_prefix1, 128);
+#endif
+#define de_stack ((char_type *)(&d_buf[DIST_BUFSIZE-1]))
+#define tab_suffixof(i) tab_suffix[i]
+
+int block_mode = BLOCK_MODE; /* block compress mode -C compatible with 2.0 */
+
+/* ============================================================================
+ * Decompress in to out. This routine adapts to the codes in the
+ * file building the "string" table on-the-fly; requiring no table to
+ * be stored in the compressed file.
+ * IN assertions: the buffer inbuf contains already the beginning of
+ * the compressed data, from offsets iptr to insize-1 included.
+ * The magic header has already been checked and skipped.
+ * bytes_in and bytes_out have been initialized.
+ */
+int unlzw(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ REG2 char_type *stackp;
+ REG3 code_int code;
+ REG4 int finchar;
+ REG5 code_int oldcode;
+ REG6 code_int incode;
+ REG7 long inbits;
+ REG8 long posbits;
+ REG9 int outpos;
+/* REG10 int insize; (global) */
+ REG11 unsigned bitmask;
+ REG12 code_int free_ent;
+ REG13 code_int maxcode;
+ REG14 code_int maxmaxcode;
+ REG15 int n_bits;
+ REG16 int rsize;
+
+#ifdef MAXSEG_64K
+ tab_prefix[0] = tab_prefix0;
+ tab_prefix[1] = tab_prefix1;
+#endif
+ maxbits = get_byte();
+ block_mode = maxbits & BLOCK_MODE;
+ if ((maxbits & LZW_RESERVED) != 0) {
+ WARN((stderr, "\n%s: %s: warning, unknown flags 0x%x\n",
+ progname, ifname, maxbits & LZW_RESERVED));
+ }
+ maxbits &= BIT_MASK;
+ maxmaxcode = MAXCODE(maxbits);
+
+ if (maxbits > BITS) {
+ fprintf(stderr,
+ "\n%s: %s: compressed with %d bits, can only handle %d bits\n",
+ progname, ifname, maxbits, BITS);
+ exit_code = ERROR;
+ return ERROR;
+ }
+ rsize = insize;
+ maxcode = MAXCODE(n_bits = INIT_BITS)-1;
+ bitmask = (1<<n_bits)-1;
+ oldcode = -1;
+ finchar = 0;
+ outpos = 0;
+ posbits = inptr<<3;
+
+ free_ent = ((block_mode) ? FIRST : 256);
+
+ clear_tab_prefixof(); /* Initialize the first 256 entries in the table. */
+
+ for (code = 255 ; code >= 0 ; --code) {
+ tab_suffixof(code) = (char_type)code;
+ }
+ do {
+ REG1 int i;
+ int e;
+ int o;
+
+ resetbuf:
+ e = insize-(o = (posbits>>3));
+
+ for (i = 0 ; i < e ; ++i) {
+ inbuf[i] = inbuf[i+o];
+ }
+ insize = e;
+ posbits = 0;
+
+ if (insize < INBUF_EXTRA) {
+ if ((rsize = read(in, (char*)inbuf+insize, INBUFSIZ)) == EOF) {
+ read_error();
+ }
+ insize += rsize;
+ bytes_in += (ulg)rsize;
+ }
+ inbits = ((rsize != 0) ? ((long)insize - insize%n_bits)<<3 :
+ ((long)insize<<3)-(n_bits-1));
+
+ while (inbits > posbits) {
+ if (free_ent > maxcode) {
+ posbits = ((posbits-1) +
+ ((n_bits<<3)-(posbits-1+(n_bits<<3))%(n_bits<<3)));
+ ++n_bits;
+ if (n_bits == maxbits) {
+ maxcode = maxmaxcode;
+ } else {
+ maxcode = MAXCODE(n_bits)-1;
+ }
+ bitmask = (1<<n_bits)-1;
+ goto resetbuf;
+ }
+ input(inbuf,posbits,code,n_bits,bitmask);
+ Tracev((stderr, "%d ", code));
+
+ if (oldcode == -1) {
+ if (code >= 256) error("corrupt input.");
+ outbuf[outpos++] = (char_type)(finchar = (int)(oldcode=code));
+ continue;
+ }
+ if (code == CLEAR && block_mode) {
+ clear_tab_prefixof();
+ free_ent = FIRST - 1;
+ posbits = ((posbits-1) +
+ ((n_bits<<3)-(posbits-1+(n_bits<<3))%(n_bits<<3)));
+ maxcode = MAXCODE(n_bits = INIT_BITS)-1;
+ bitmask = (1<<n_bits)-1;
+ goto resetbuf;
+ }
+ incode = code;
+ stackp = de_stack;
+
+ if (code >= free_ent) { /* Special case for KwKwK string. */
+ if (code > free_ent) {
+#ifdef DEBUG
+ char_type *p;
+
+ posbits -= n_bits;
+ p = &inbuf[posbits>>3];
+ fprintf(stderr,
+ "code:%ld free_ent:%ld n_bits:%d insize:%u\n",
+ code, free_ent, n_bits, insize);
+ fprintf(stderr,
+ "posbits:%ld inbuf:%02X %02X %02X %02X %02X\n",
+ posbits, p[-1],p[0],p[1],p[2],p[3]);
+#endif
+ if (!test && outpos > 0) {
+ write_buf(out, (char*)outbuf, outpos);
+ bytes_out += (ulg)outpos;
+ }
+ error(to_stdout ? "corrupt input." :
+ "corrupt input. Use zcat to recover some data.");
+ }
+ *--stackp = (char_type)finchar;
+ code = oldcode;
+ }
+
+ while ((cmp_code_int)code >= (cmp_code_int)256) {
+ /* Generate output characters in reverse order */
+ *--stackp = tab_suffixof(code);
+ code = tab_prefixof(code);
+ }
+ *--stackp = (char_type)(finchar = tab_suffixof(code));
+
+ /* And put them out in forward order */
+ {
+ REG1 int i;
+
+ if (outpos+(i = (de_stack-stackp)) >= OUTBUFSIZ) {
+ do {
+ if (i > OUTBUFSIZ-outpos) i = OUTBUFSIZ-outpos;
+
+ if (i > 0) {
+ memcpy(outbuf+outpos, stackp, i);
+ outpos += i;
+ }
+ if (outpos >= OUTBUFSIZ) {
+ if (!test) {
+ write_buf(out, (char*)outbuf, outpos);
+ bytes_out += (ulg)outpos;
+ }
+ outpos = 0;
+ }
+ stackp+= i;
+ } while ((i = (de_stack-stackp)) > 0);
+ } else {
+ memcpy(outbuf+outpos, stackp, i);
+ outpos += i;
+ }
+ }
+
+ if ((code = free_ent) < maxmaxcode) { /* Generate the new entry. */
+
+ tab_prefixof(code) = (unsigned short)oldcode;
+ tab_suffixof(code) = (char_type)finchar;
+ free_ent = code+1;
+ }
+ oldcode = incode; /* Remember previous code. */
+ }
+ } while (rsize != 0);
+
+ if (!test && outpos > 0) {
+ write_buf(out, (char*)outbuf, outpos);
+ bytes_out += (ulg)outpos;
+ }
+ return OK;
+}
diff --git a/Build/source/utils/gzip/unlzw.c b/Build/source/utils/gzip/unlzw.c
new file mode 100644
index 00000000000..15d2a313b4b
--- /dev/null
+++ b/Build/source/utils/gzip/unlzw.c
@@ -0,0 +1,377 @@
+/* unlzw.c -- decompress files in LZW format.
+ * The code in this file is directly derived from the public domain 'compress'
+ * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies,
+ * Ken Turkowski, Dave Mack and Peter Jannesen.
+ *
+ * This is a temporary version which will be rewritten in some future version
+ * to accommodate in-memory decompression.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: unlzw.c,v 0.15 1993/06/10 13:28:35 jloup Exp $";
+#endif
+
+#include <sys/types.h>
+
+#include "tailor.h"
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifndef NO_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#include "gzip.h"
+#include "lzw.h"
+
+typedef unsigned char char_type;
+typedef long code_int;
+typedef unsigned long count_int;
+typedef unsigned short count_short;
+typedef unsigned long cmp_code_int;
+
+#define MAXCODE(n) (1L << (n))
+
+#ifndef REGISTERS
+# define REGISTERS 2
+#endif
+#define REG1
+#define REG2
+#define REG3
+#define REG4
+#define REG5
+#define REG6
+#define REG7
+#define REG8
+#define REG9
+#define REG10
+#define REG11
+#define REG12
+#define REG13
+#define REG14
+#define REG15
+#define REG16
+#if REGISTERS >= 1
+# undef REG1
+# define REG1 register
+#endif
+#if REGISTERS >= 2
+# undef REG2
+# define REG2 register
+#endif
+#if REGISTERS >= 3
+# undef REG3
+# define REG3 register
+#endif
+#if REGISTERS >= 4
+# undef REG4
+# define REG4 register
+#endif
+#if REGISTERS >= 5
+# undef REG5
+# define REG5 register
+#endif
+#if REGISTERS >= 6
+# undef REG6
+# define REG6 register
+#endif
+#if REGISTERS >= 7
+# undef REG7
+# define REG7 register
+#endif
+#if REGISTERS >= 8
+# undef REG8
+# define REG8 register
+#endif
+#if REGISTERS >= 9
+# undef REG9
+# define REG9 register
+#endif
+#if REGISTERS >= 10
+# undef REG10
+# define REG10 register
+#endif
+#if REGISTERS >= 11
+# undef REG11
+# define REG11 register
+#endif
+#if REGISTERS >= 12
+# undef REG12
+# define REG12 register
+#endif
+#if REGISTERS >= 13
+# undef REG13
+# define REG13 register
+#endif
+#if REGISTERS >= 14
+# undef REG14
+# define REG14 register
+#endif
+#if REGISTERS >= 15
+# undef REG15
+# define REG15 register
+#endif
+#if REGISTERS >= 16
+# undef REG16
+# define REG16 register
+#endif
+
+#ifndef BYTEORDER
+# define BYTEORDER 0000
+#endif
+
+#ifndef NOALLIGN
+# define NOALLIGN 0
+#endif
+
+
+union bytes {
+ long word;
+ struct {
+#if BYTEORDER == 4321
+ char_type b1;
+ char_type b2;
+ char_type b3;
+ char_type b4;
+#else
+#if BYTEORDER == 1234
+ char_type b4;
+ char_type b3;
+ char_type b2;
+ char_type b1;
+#else
+# undef BYTEORDER
+ int dummy;
+#endif
+#endif
+ } bytes;
+};
+
+#if BYTEORDER == 4321 && NOALLIGN == 1
+# define input(b,o,c,n,m){ \
+ (c) = (*(long *)(&(b)[(o)>>3])>>((o)&0x7))&(m); \
+ (o) += (n); \
+ }
+#else
+# define input(b,o,c,n,m){ \
+ REG1 char_type *p = &(b)[(o)>>3]; \
+ (c) = ((((long)(p[0]))|((long)(p[1])<<8)| \
+ ((long)(p[2])<<16))>>((o)&0x7))&(m); \
+ (o) += (n); \
+ }
+#endif
+
+#ifndef MAXSEG_64K
+ /* DECLARE(ush, tab_prefix, (1<<BITS)); -- prefix code */
+# define tab_prefixof(i) tab_prefix[i]
+# define clear_tab_prefixof() memzero(tab_prefix, 256);
+#else
+ /* DECLARE(ush, tab_prefix0, (1<<(BITS-1)); -- prefix for even codes */
+ /* DECLARE(ush, tab_prefix1, (1<<(BITS-1)); -- prefix for odd codes */
+ ush *tab_prefix[2];
+# define tab_prefixof(i) tab_prefix[(i)&1][(i)>>1]
+# define clear_tab_prefixof() \
+ memzero(tab_prefix0, 128), \
+ memzero(tab_prefix1, 128);
+#endif
+#define de_stack ((char_type *)(&d_buf[DIST_BUFSIZE-1]))
+#define tab_suffixof(i) tab_suffix[i]
+
+int block_mode = BLOCK_MODE; /* block compress mode -C compatible with 2.0 */
+
+/* ============================================================================
+ * Decompress in to out. This routine adapts to the codes in the
+ * file building the "string" table on-the-fly; requiring no table to
+ * be stored in the compressed file.
+ * IN assertions: the buffer inbuf contains already the beginning of
+ * the compressed data, from offsets iptr to insize-1 included.
+ * The magic header has already been checked and skipped.
+ * bytes_in and bytes_out have been initialized.
+ */
+int unlzw(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ REG2 char_type *stackp;
+ REG3 code_int code;
+ REG4 int finchar;
+ REG5 code_int oldcode;
+ REG6 code_int incode;
+ REG7 long inbits;
+ REG8 long posbits;
+ REG9 int outpos;
+/* REG10 int insize; (global) */
+ REG11 unsigned bitmask;
+ REG12 code_int free_ent;
+ REG13 code_int maxcode;
+ REG14 code_int maxmaxcode;
+ REG15 int n_bits;
+ REG16 int rsize;
+
+#ifdef MAXSEG_64K
+ tab_prefix[0] = tab_prefix0;
+ tab_prefix[1] = tab_prefix1;
+#endif
+ maxbits = get_byte();
+ block_mode = maxbits & BLOCK_MODE;
+ if ((maxbits & LZW_RESERVED) != 0) {
+ WARN((stderr, "\n%s: %s: warning, unknown flags 0x%x\n",
+ progname, ifname, maxbits & LZW_RESERVED));
+ }
+ maxbits &= BIT_MASK;
+ maxmaxcode = MAXCODE(maxbits);
+
+ if (maxbits > BITS) {
+ fprintf(stderr,
+ "\n%s: %s: compressed with %d bits, can only handle %d bits\n",
+ progname, ifname, maxbits, BITS);
+ exit_code = ERROR;
+ return ERROR;
+ }
+ rsize = insize;
+ maxcode = MAXCODE(n_bits = INIT_BITS)-1;
+ bitmask = (1<<n_bits)-1;
+ oldcode = -1;
+ finchar = 0;
+ outpos = 0;
+ posbits = inptr<<3;
+
+ free_ent = ((block_mode) ? FIRST : 256);
+
+ clear_tab_prefixof(); /* Initialize the first 256 entries in the table. */
+
+ for (code = 255 ; code >= 0 ; --code) {
+ tab_suffixof(code) = (char_type)code;
+ }
+ do {
+ REG1 int i;
+ int e;
+ int o;
+
+ resetbuf:
+ e = insize-(o = (posbits>>3));
+
+ for (i = 0 ; i < e ; ++i) {
+ inbuf[i] = inbuf[i+o];
+ }
+ insize = e;
+ posbits = 0;
+
+ if (insize < INBUF_EXTRA) {
+ if ((rsize = read(in, (char*)inbuf+insize, INBUFSIZ)) == EOF) {
+ read_error();
+ }
+ insize += rsize;
+ bytes_in += (ulg)rsize;
+ }
+ inbits = ((rsize != 0) ? ((long)insize - insize%n_bits)<<3 :
+ ((long)insize<<3)-(n_bits-1));
+
+ while (inbits > posbits) {
+ if (free_ent > maxcode) {
+ posbits = ((posbits-1) +
+ ((n_bits<<3)-(posbits-1+(n_bits<<3))%(n_bits<<3)));
+ ++n_bits;
+ if (n_bits == maxbits) {
+ maxcode = maxmaxcode;
+ } else {
+ maxcode = MAXCODE(n_bits)-1;
+ }
+ bitmask = (1<<n_bits)-1;
+ goto resetbuf;
+ }
+ input(inbuf,posbits,code,n_bits,bitmask);
+ Tracev((stderr, "%d ", code));
+
+ if (oldcode == -1) {
+ if (code >= 256) error("corrupt input.");
+ outbuf[outpos++] = (char_type)(finchar = (int)(oldcode=code));
+ continue;
+ }
+ if (code == CLEAR && block_mode) {
+ clear_tab_prefixof();
+ free_ent = FIRST - 1;
+ posbits = ((posbits-1) +
+ ((n_bits<<3)-(posbits-1+(n_bits<<3))%(n_bits<<3)));
+ maxcode = MAXCODE(n_bits = INIT_BITS)-1;
+ bitmask = (1<<n_bits)-1;
+ goto resetbuf;
+ }
+ incode = code;
+ stackp = de_stack;
+
+ if (code >= free_ent) { /* Special case for KwKwK string. */
+ if (code > free_ent) {
+#ifdef DEBUG
+ char_type *p;
+
+ posbits -= n_bits;
+ p = &inbuf[posbits>>3];
+ fprintf(stderr,
+ "code:%ld free_ent:%ld n_bits:%d insize:%u\n",
+ code, free_ent, n_bits, insize);
+ fprintf(stderr,
+ "posbits:%ld inbuf:%02X %02X %02X %02X %02X\n",
+ posbits, p[-1],p[0],p[1],p[2],p[3]);
+#endif
+ if (!test && outpos > 0) {
+ write_buf(out, (char*)outbuf, outpos);
+ bytes_out += (ulg)outpos;
+ }
+ error(to_stdout ? "corrupt input." :
+ "corrupt input. Use zcat to recover some data.");
+ }
+ *--stackp = (char_type)finchar;
+ code = oldcode;
+ }
+
+ while ((cmp_code_int)code >= (cmp_code_int)256) {
+ /* Generate output characters in reverse order */
+ *--stackp = tab_suffixof(code);
+ code = tab_prefixof(code);
+ }
+ *--stackp = (char_type)(finchar = tab_suffixof(code));
+
+ /* And put them out in forward order */
+ {
+ REG1 int i;
+
+ if (outpos+(i = (de_stack-stackp)) >= OUTBUFSIZ) {
+ do {
+ if (i > OUTBUFSIZ-outpos) i = OUTBUFSIZ-outpos;
+
+ if (i > 0) {
+ memcpy(outbuf+outpos, stackp, i);
+ outpos += i;
+ }
+ if (outpos >= OUTBUFSIZ) {
+ if (!test) {
+ write_buf(out, (char*)outbuf, outpos);
+ bytes_out += (ulg)outpos;
+ }
+ outpos = 0;
+ }
+ stackp+= i;
+ } while ((i = (de_stack-stackp)) > 0);
+ } else {
+ memcpy(outbuf+outpos, stackp, i);
+ outpos += i;
+ }
+ }
+
+ if ((code = free_ent) < maxmaxcode) { /* Generate the new entry. */
+
+ tab_prefixof(code) = (unsigned short)oldcode;
+ tab_suffixof(code) = (char_type)finchar;
+ free_ent = code+1;
+ }
+ oldcode = incode; /* Remember previous code. */
+ }
+ } while (rsize != 0);
+
+ if (!test && outpos > 0) {
+ write_buf(out, (char*)outbuf, outpos);
+ bytes_out += (ulg)outpos;
+ }
+ return OK;
+}
diff --git a/Build/source/utils/gzip/unpack.c b/Build/source/utils/gzip/unpack.c
new file mode 100644
index 00000000000..a00fdaefc6b
--- /dev/null
+++ b/Build/source/utils/gzip/unpack.c
@@ -0,0 +1,239 @@
+/* unpack.c -- decompress files in pack format.
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: unpack.c,v 1.4 1993/06/11 19:25:36 jloup Exp $";
+#endif
+
+#include "tailor.h"
+#include "gzip.h"
+#include "crypt.h"
+
+#define MIN(a,b) ((a) <= (b) ? (a) : (b))
+/* The arguments must not have side effects. */
+
+#define MAX_BITLEN 25
+/* Maximum length of Huffman codes. (Minor modifications to the code
+ * would be needed to support 32 bits codes, but pack never generates
+ * more than 24 bits anyway.)
+ */
+
+#define LITERALS 256
+/* Number of literals, excluding the End of Block (EOB) code */
+
+#define MAX_PEEK 12
+/* Maximum number of 'peek' bits used to optimize traversal of the
+ * Huffman tree.
+ */
+
+local ulg orig_len; /* original uncompressed length */
+local int max_len; /* maximum bit length of Huffman codes */
+
+local uch literal[LITERALS];
+/* The literal bytes present in the Huffman tree. The EOB code is not
+ * represented.
+ */
+
+local int lit_base[MAX_BITLEN+1];
+/* All literals of a given bit length are contiguous in literal[] and
+ * have contiguous codes. literal[code+lit_base[len]] is the literal
+ * for a code of len bits.
+ */
+
+local int leaves [MAX_BITLEN+1]; /* Number of leaves for each bit length */
+local int parents[MAX_BITLEN+1]; /* Number of parents for each bit length */
+
+local int peek_bits; /* Number of peek bits currently used */
+
+/* local uch prefix_len[1 << MAX_PEEK]; */
+#define prefix_len outbuf
+/* For each bit pattern b of peek_bits bits, prefix_len[b] is the length
+ * of the Huffman code starting with a prefix of b (upper bits), or 0
+ * if all codes of prefix b have more than peek_bits bits. It is not
+ * necessary to have a huge table (large MAX_PEEK) because most of the
+ * codes encountered in the input stream are short codes (by construction).
+ * So for most codes a single lookup will be necessary.
+ */
+#if (1<<MAX_PEEK) > OUTBUFSIZ
+ error cannot overlay prefix_len and outbuf
+#endif
+
+local ulg bitbuf;
+/* Bits are added on the low part of bitbuf and read from the high part. */
+
+local int valid; /* number of valid bits in bitbuf */
+/* all bits above the last valid bit are always zero */
+
+/* Set code to the next 'bits' input bits without skipping them. code
+ * must be the name of a simple variable and bits must not have side effects.
+ * IN assertions: bits <= 25 (so that we still have room for an extra byte
+ * when valid is only 24), and mask = (1<<bits)-1.
+ */
+#define look_bits(code,bits,mask) \
+{ \
+ while (valid < (bits)) bitbuf = (bitbuf<<8) | (ulg)get_byte(), valid += 8; \
+ code = (bitbuf >> (valid-(bits))) & (mask); \
+}
+
+/* Skip the given number of bits (after having peeked at them): */
+#define skip_bits(bits) (valid -= (bits))
+
+#define clear_bitbuf() (valid = 0, bitbuf = 0)
+
+/* Local functions */
+
+local void read_tree OF((void));
+local void build_tree OF((void));
+
+/* ===========================================================================
+ * Read the Huffman tree.
+ */
+local void read_tree()
+{
+ int len; /* bit length */
+ int base; /* base offset for a sequence of leaves */
+ int n;
+
+ /* Read the original input size, MSB first */
+ orig_len = 0;
+ for (n = 1; n <= 4; n++) orig_len = (orig_len << 8) | (ulg)get_byte();
+
+ max_len = (int)get_byte(); /* maximum bit length of Huffman codes */
+ if (max_len > MAX_BITLEN) {
+ error("invalid compressed data -- Huffman code > 32 bits");
+ }
+
+ /* Get the number of leaves at each bit length */
+ n = 0;
+ for (len = 1; len <= max_len; len++) {
+ leaves[len] = (int)get_byte();
+ n += leaves[len];
+ }
+ if (n > LITERALS) {
+ error("too many leaves in Huffman tree");
+ }
+ Trace((stderr, "orig_len %ld, max_len %d, leaves %d\n",
+ orig_len, max_len, n));
+ /* There are at least 2 and at most 256 leaves of length max_len.
+ * (Pack arbitrarily rejects empty files and files consisting of
+ * a single byte even repeated.) To fit the last leaf count in a
+ * byte, it is offset by 2. However, the last literal is the EOB
+ * code, and is not transmitted explicitly in the tree, so we must
+ * adjust here by one only.
+ */
+ leaves[max_len]++;
+
+ /* Now read the leaves themselves */
+ base = 0;
+ for (len = 1; len <= max_len; len++) {
+ /* Remember where the literals of this length start in literal[] : */
+ lit_base[len] = base;
+ /* And read the literals: */
+ for (n = leaves[len]; n > 0; n--) {
+ literal[base++] = (uch)get_byte();
+ }
+ }
+ leaves[max_len]++; /* Now include the EOB code in the Huffman tree */
+}
+
+/* ===========================================================================
+ * Build the Huffman tree and the prefix table.
+ */
+local void build_tree()
+{
+ int nodes = 0; /* number of nodes (parents+leaves) at current bit length */
+ int len; /* current bit length */
+ uch *prefixp; /* pointer in prefix_len */
+
+ for (len = max_len; len >= 1; len--) {
+ /* The number of parent nodes at this level is half the total
+ * number of nodes at parent level:
+ */
+ nodes >>= 1;
+ parents[len] = nodes;
+ /* Update lit_base by the appropriate bias to skip the parent nodes
+ * (which are not represented in the literal array):
+ */
+ lit_base[len] -= nodes;
+ /* Restore nodes to be parents+leaves: */
+ nodes += leaves[len];
+ }
+ /* Construct the prefix table, from shortest leaves to longest ones.
+ * The shortest code is all ones, so we start at the end of the table.
+ */
+ peek_bits = MIN(max_len, MAX_PEEK);
+ prefixp = &prefix_len[1<<peek_bits];
+ for (len = 1; len <= peek_bits; len++) {
+ int prefixes = leaves[len] << (peek_bits-len); /* may be 0 */
+ while (prefixes--) *--prefixp = (uch)len;
+ }
+ /* The length of all other codes is unknown: */
+ while (prefixp > prefix_len) *--prefixp = 0;
+}
+
+/* ===========================================================================
+ * Unpack in to out. This routine does not support the old pack format
+ * with magic header \037\037.
+ *
+ * IN assertions: the buffer inbuf contains already the beginning of
+ * the compressed data, from offsets inptr to insize-1 included.
+ * The magic header has already been checked. The output buffer is cleared.
+ */
+int unpack(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ int len; /* Bit length of current code */
+ unsigned eob; /* End Of Block code */
+ register unsigned peek; /* lookahead bits */
+ unsigned peek_mask; /* Mask for peek_bits bits */
+
+ ifd = in;
+ ofd = out;
+
+ read_tree(); /* Read the Huffman tree */
+ build_tree(); /* Build the prefix table */
+ clear_bitbuf(); /* Initialize bit input */
+ peek_mask = (1<<peek_bits)-1;
+
+ /* The eob code is the largest code among all leaves of maximal length: */
+ eob = leaves[max_len]-1;
+ Trace((stderr, "eob %d %x\n", max_len, eob));
+
+ /* Decode the input data: */
+ for (;;) {
+ /* Since eob is the longest code and not shorter than max_len,
+ * we can peek at max_len bits without having the risk of reading
+ * beyond the end of file.
+ */
+ look_bits(peek, peek_bits, peek_mask);
+ len = prefix_len[peek];
+ if (len > 0) {
+ peek >>= peek_bits - len; /* discard the extra bits */
+ } else {
+ /* Code of more than peek_bits bits, we must traverse the tree */
+ ulg mask = peek_mask;
+ len = peek_bits;
+ do {
+ len++, mask = (mask<<1)+1;
+ look_bits(peek, len, mask);
+ } while (peek < (unsigned)parents[len]);
+ /* loop as long as peek is a parent node */
+ }
+ /* At this point, peek is the next complete code, of len bits */
+ if (peek == eob && len == max_len) break; /* end of file? */
+ put_ubyte(literal[peek+lit_base[len]]);
+ Tracev((stderr,"%02d %04x %c\n", len, peek,
+ literal[peek+lit_base[len]]));
+ skip_bits(len);
+ } /* for (;;) */
+
+ flush_window();
+ Trace((stderr, "bytes_out %ld\n", bytes_out));
+ if (orig_len != (ulg)bytes_out) {
+ error("invalid compressed data--length error");
+ }
+ return OK;
+}
diff --git a/Build/source/utils/gzip/unzip.c b/Build/source/utils/gzip/unzip.c
new file mode 100644
index 00000000000..7e287a157ad
--- /dev/null
+++ b/Build/source/utils/gzip/unzip.c
@@ -0,0 +1,199 @@
+/* unzip.c -- decompress files in gzip or pkzip format.
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ *
+ * The code in this file is derived from the file funzip.c written
+ * and put in the public domain by Mark Adler.
+ */
+
+/*
+ This version can extract files in gzip or pkzip format.
+ For the latter, only the first entry is extracted, and it has to be
+ either deflated or stored.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: unzip.c,v 0.13 1993/06/10 13:29:00 jloup Exp $";
+#endif
+
+#include "tailor.h"
+#include "gzip.h"
+#include "crypt.h"
+
+/* PKZIP header definitions */
+#define LOCSIG 0x04034b50L /* four-byte lead-in (lsb first) */
+#define LOCFLG 6 /* offset of bit flag */
+#define CRPFLG 1 /* bit for encrypted entry */
+#define EXTFLG 8 /* bit for extended local header */
+#define LOCHOW 8 /* offset of compression method */
+#define LOCTIM 10 /* file mod time (for decryption) */
+#define LOCCRC 14 /* offset of crc */
+#define LOCSIZ 18 /* offset of compressed size */
+#define LOCLEN 22 /* offset of uncompressed length */
+#define LOCFIL 26 /* offset of file name field length */
+#define LOCEXT 28 /* offset of extra field length */
+#define LOCHDR 30 /* size of local header, including sig */
+#define EXTHDR 16 /* size of extended local header, inc sig */
+
+
+/* Globals */
+
+int decrypt; /* flag to turn on decryption */
+char *key; /* not used--needed to link crypt.c */
+int pkzip = 0; /* set for a pkzip file */
+int ext_header = 0; /* set if extended local header */
+
+/* ===========================================================================
+ * Check zip file and advance inptr to the start of the compressed data.
+ * Get ofname from the local header if necessary.
+ */
+int check_zipfile(in)
+ int in; /* input file descriptors */
+{
+ uch *h = inbuf + inptr; /* first local header */
+
+ ifd = in;
+
+ /* Check validity of local header, and skip name and extra fields */
+ inptr += LOCHDR + SH(h + LOCFIL) + SH(h + LOCEXT);
+
+ if (inptr > insize || LG(h) != LOCSIG) {
+ fprintf(stderr, "\n%s: %s: not a valid zip file\n",
+ progname, ifname);
+ exit_code = ERROR;
+ return ERROR;
+ }
+ method = h[LOCHOW];
+ if (method != STORED && method != DEFLATED) {
+ fprintf(stderr,
+ "\n%s: %s: first entry not deflated or stored -- use unzip\n",
+ progname, ifname);
+ exit_code = ERROR;
+ return ERROR;
+ }
+
+ /* If entry encrypted, decrypt and validate encryption header */
+ if ((decrypt = h[LOCFLG] & CRPFLG) != 0) {
+ fprintf(stderr, "\n%s: %s: encrypted file -- use unzip\n",
+ progname, ifname);
+ exit_code = ERROR;
+ return ERROR;
+ }
+
+ /* Save flags for unzip() */
+ ext_header = (h[LOCFLG] & EXTFLG) != 0;
+ pkzip = 1;
+
+ /* Get ofname and time stamp from local header (to be done) */
+ return OK;
+}
+
+/* ===========================================================================
+ * Unzip in to out. This routine works on both gzip and pkzip files.
+ *
+ * IN assertions: the buffer inbuf contains already the beginning of
+ * the compressed data, from offsets inptr to insize-1 included.
+ * The magic header has already been checked. The output buffer is cleared.
+ */
+int unzip(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ ulg orig_crc = 0; /* original crc */
+ ulg orig_len = 0; /* original uncompressed length */
+ int n;
+ uch buf[EXTHDR]; /* extended local header */
+
+ ifd = in;
+ ofd = out;
+
+ updcrc(NULL, 0); /* initialize crc */
+
+ if (pkzip && !ext_header) { /* crc and length at the end otherwise */
+ orig_crc = LG(inbuf + LOCCRC);
+ orig_len = LG(inbuf + LOCLEN);
+ }
+
+ /* Decompress */
+ if (method == DEFLATED) {
+
+ int res = inflate();
+
+ if (res == 3) {
+ error("out of memory");
+ } else if (res != 0) {
+ error("invalid compressed data--format violated");
+ }
+
+ } else if (pkzip && method == STORED) {
+
+ register ulg n = LG(inbuf + LOCLEN);
+
+ if (n != LG(inbuf + LOCSIZ) - (decrypt ? RAND_HEAD_LEN : 0)) {
+
+ fprintf(stderr, "len %ld, siz %ld\n", n, LG(inbuf + LOCSIZ));
+ error("invalid compressed data--length mismatch");
+ }
+ while (n--) {
+ uch c = (uch)get_byte();
+#ifdef CRYPT
+ if (decrypt) zdecode(c);
+#endif
+ put_ubyte(c);
+ }
+ flush_window();
+ } else {
+ error("internal error, invalid method");
+ }
+
+ /* Get the crc and original length */
+ if (!pkzip) {
+ /* crc32 (see algorithm.doc)
+ * uncompressed input size modulo 2^32
+ */
+ for (n = 0; n < 8; n++) {
+ buf[n] = (uch)get_byte(); /* may cause an error if EOF */
+ }
+ orig_crc = LG(buf);
+ orig_len = LG(buf+4);
+
+ } else if (ext_header) { /* If extended header, check it */
+ /* signature - 4bytes: 0x50 0x4b 0x07 0x08
+ * CRC-32 value
+ * compressed size 4-bytes
+ * uncompressed size 4-bytes
+ */
+ for (n = 0; n < EXTHDR; n++) {
+ buf[n] = (uch)get_byte(); /* may cause an error if EOF */
+ }
+ orig_crc = LG(buf+4);
+ orig_len = LG(buf+12);
+ }
+
+ /* Validate decompression */
+ if (orig_crc != updcrc(outbuf, 0)) {
+ error("invalid compressed data--crc error");
+ }
+ if (orig_len != (ulg)bytes_out) {
+ error("invalid compressed data--length error");
+ }
+
+ /* Check if there are more entries in a pkzip file */
+ if (pkzip && inptr + 4 < insize && LG(inbuf+inptr) == LOCSIG) {
+ if (to_stdout) {
+ WARN((stderr,
+ "%s: %s has more than one entry--rest ignored\n",
+ progname, ifname));
+ } else {
+ /* Don't destroy the input zip file */
+ fprintf(stderr,
+ "%s: %s has more than one entry -- unchanged\n",
+ progname, ifname);
+ exit_code = ERROR;
+ ext_header = pkzip = 0;
+ return ERROR;
+ }
+ }
+ ext_header = pkzip = 0; /* for next file */
+ return OK;
+}
diff --git a/Build/source/utils/gzip/util.c b/Build/source/utils/gzip/util.c
new file mode 100644
index 00000000000..4b5bccf703e
--- /dev/null
+++ b/Build/source/utils/gzip/util.c
@@ -0,0 +1,466 @@
+/* util.c -- utility functions for gzip support
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: util.c,v 0.15 1993/06/15 09:04:13 jloup Exp $";
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <sys/types.h>
+
+#include "tailor.h"
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifndef NO_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if defined(STDC_HEADERS) || !defined(NO_STDLIB_H)
+# include <stdlib.h>
+#else
+ extern int errno;
+#endif
+
+#include "gzip.h"
+#include "crypt.h"
+
+extern ulg crc_32_tab[]; /* crc table, defined below */
+
+/* ===========================================================================
+ * Copy input to output unchanged: zcat == cat with --force.
+ * IN assertion: insize bytes have already been read in inbuf.
+ */
+int copy(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ errno = 0;
+ while (insize != 0 && (int)insize != EOF) {
+ write_buf(out, (char*)inbuf, insize);
+ bytes_out += insize;
+ insize = read(in, (char*)inbuf, INBUFSIZ);
+ }
+ if ((int)insize == EOF && errno != 0) {
+ read_error();
+ }
+ bytes_in = bytes_out;
+ return OK;
+}
+
+/* ===========================================================================
+ * Run a set of bytes through the crc shift register. If s is a NULL
+ * pointer, then initialize the crc shift register contents instead.
+ * Return the current crc in either case.
+ */
+ulg updcrc(s, n)
+ uch *s; /* pointer to bytes to pump through */
+ unsigned n; /* number of bytes in s[] */
+{
+ register ulg c; /* temporary variable */
+
+ static ulg crc = (ulg)0xffffffffL; /* shift register contents */
+
+ if (s == NULL) {
+ c = 0xffffffffL;
+ } else {
+ c = crc;
+ if (n) do {
+ c = crc_32_tab[((int)c ^ (*s++)) & 0xff] ^ (c >> 8);
+ } while (--n);
+ }
+ crc = c;
+ return c ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */
+}
+
+/* ===========================================================================
+ * Clear input and output buffers
+ */
+void clear_bufs()
+{
+ outcnt = 0;
+ insize = inptr = 0;
+ bytes_in = bytes_out = 0L;
+}
+
+/* ===========================================================================
+ * Fill the input buffer. This is called only when the buffer is empty.
+ */
+int fill_inbuf(eof_ok)
+ int eof_ok; /* set if EOF acceptable as a result */
+{
+ int len;
+
+ /* Read as much as possible */
+ insize = 0;
+ errno = 0;
+ do {
+ len = read(ifd, (char*)inbuf+insize, INBUFSIZ-insize);
+ if (len == 0 || len == EOF) break;
+ insize += len;
+ } while (insize < INBUFSIZ);
+
+ if (insize == 0) {
+ if (eof_ok) return EOF;
+ read_error();
+ }
+ bytes_in += (ulg)insize;
+ inptr = 1;
+ return inbuf[0];
+}
+
+/* ===========================================================================
+ * Write the output buffer outbuf[0..outcnt-1] and update bytes_out.
+ * (used for the compressed data only)
+ */
+void flush_outbuf()
+{
+ if (outcnt == 0) return;
+
+ write_buf(ofd, (char *)outbuf, outcnt);
+ bytes_out += (ulg)outcnt;
+ outcnt = 0;
+}
+
+/* ===========================================================================
+ * Write the output window window[0..outcnt-1] and update crc and bytes_out.
+ * (Used for the decompressed data only.)
+ */
+void flush_window()
+{
+ if (outcnt == 0) return;
+ updcrc(window, outcnt);
+
+ if (!test) {
+ write_buf(ofd, (char *)window, outcnt);
+ }
+ bytes_out += (ulg)outcnt;
+ outcnt = 0;
+}
+
+/* ===========================================================================
+ * Does the same as write(), but also handles partial pipe writes and checks
+ * for error return.
+ */
+void write_buf(fd, buf, cnt)
+ int fd;
+ voidp buf;
+ unsigned cnt;
+{
+ unsigned n;
+
+ while ((n = write(fd, buf, cnt)) != cnt) {
+ if (n == (unsigned)(-1)) {
+ write_error();
+ }
+ cnt -= n;
+ buf = (voidp)((char*)buf+n);
+ }
+}
+
+#ifndef WIN32
+/* ========================================================================
+ * Put string s in lower case, return s.
+ */
+char *strlwr(s)
+ char *s;
+{
+ char *t;
+ for (t = s; *t; t++) *t = tolow(*t);
+ return s;
+}
+#endif
+
+/* ========================================================================
+ * Return the base name of a file (remove any directory prefix and
+ * any version suffix). For systems with file names that are not
+ * case sensitive, force the base name to lower case.
+ */
+char *basename(fname)
+ char *fname;
+{
+ char *p;
+
+ if ((p = strrchr(fname, PATH_SEP)) != NULL) fname = p+1;
+#ifdef PATH_SEP2
+ if ((p = strrchr(fname, PATH_SEP2)) != NULL) fname = p+1;
+#endif
+#ifdef PATH_SEP3
+ if ((p = strrchr(fname, PATH_SEP3)) != NULL) fname = p+1;
+#endif
+#ifdef SUFFIX_SEP
+ if ((p = strrchr(fname, SUFFIX_SEP)) != NULL) *p = '\0';
+#endif
+ if (casemap('A') == 'a') strlwr(fname);
+ return fname;
+}
+
+/* ========================================================================
+ * Make a file name legal for file systems not allowing file names with
+ * multiple dots or starting with a dot (such as MSDOS), by changing
+ * all dots except the last one into underlines. A target dependent
+ * function can be used instead of this simple function by defining the macro
+ * MAKE_LEGAL_NAME in tailor.h and providing the function in a target
+ * dependent module.
+ */
+void make_simple_name(name)
+ char *name;
+{
+ char *p = strrchr(name, '.');
+ if (p == NULL) return;
+ if (p == name) p++;
+ do {
+ if (*--p == '.') *p = '_';
+ } while (p != name);
+}
+
+
+#if defined(NO_STRING_H) && !defined(STDC_HEADERS)
+
+/* Provide missing strspn and strcspn functions. */
+
+# ifndef __STDC__
+# define const
+# endif
+
+int strspn OF((const char *s, const char *accept));
+int strcspn OF((const char *s, const char *reject));
+
+/* ========================================================================
+ * Return the length of the maximum initial segment
+ * of s which contains only characters in accept.
+ */
+int strspn(s, accept)
+ const char *s;
+ const char *accept;
+{
+ register const char *p;
+ register const char *a;
+ register int count = 0;
+
+ for (p = s; *p != '\0'; ++p) {
+ for (a = accept; *a != '\0'; ++a) {
+ if (*p == *a) break;
+ }
+ if (*a == '\0') return count;
+ ++count;
+ }
+ return count;
+}
+
+/* ========================================================================
+ * Return the length of the maximum inital segment of s
+ * which contains no characters from reject.
+ */
+int strcspn(s, reject)
+ const char *s;
+ const char *reject;
+{
+ register int count = 0;
+
+ while (*s != '\0') {
+ if (strchr(reject, *s++) != NULL) return count;
+ ++count;
+ }
+ return count;
+}
+
+#endif /* NO_STRING_H */
+
+/* ========================================================================
+ * Add an environment variable (if any) before argv, and update argc.
+ * Return the expanded environment variable to be freed later, or NULL
+ * if no options were added to argv.
+ */
+#define SEPARATOR " \t" /* separators in env variable */
+
+char *add_envopt(argcp, argvp, env)
+ int *argcp; /* pointer to argc */
+ char ***argvp; /* pointer to argv */
+ char *env; /* name of environment variable */
+{
+ char *p; /* running pointer through env variable */
+ char **oargv; /* runs through old argv array */
+ char **nargv; /* runs through new argv array */
+ int oargc = *argcp; /* old argc */
+ int nargc = 0; /* number of arguments in env variable */
+
+ env = (char*)getenv(env);
+ if (env == NULL) return NULL;
+
+ p = (char*)xmalloc(strlen(env)+1);
+ env = strcpy(p, env); /* keep env variable intact */
+
+ for (p = env; *p; nargc++ ) { /* move through env */
+ p += strspn(p, SEPARATOR); /* skip leading separators */
+ if (*p == '\0') break;
+
+ p += strcspn(p, SEPARATOR); /* find end of word */
+ if (*p) *p++ = '\0'; /* mark it */
+ }
+ if (nargc == 0) {
+ free(env);
+ return NULL;
+ }
+ *argcp += nargc;
+ /* Allocate the new argv array, with an extra element just in case
+ * the original arg list did not end with a NULL.
+ */
+ nargv = (char**)calloc(*argcp+1, sizeof(char *));
+ if (nargv == NULL) error("out of memory");
+ oargv = *argvp;
+ *argvp = nargv;
+
+ /* Copy the program name first */
+ if (oargc-- < 0) error("argc<=0");
+ *(nargv++) = *(oargv++);
+
+ /* Then copy the environment args */
+ for (p = env; nargc > 0; nargc--) {
+ p += strspn(p, SEPARATOR); /* skip separators */
+ *(nargv++) = p; /* store start */
+ while (*p++) ; /* skip over word */
+ }
+
+ /* Finally copy the old args and add a NULL (usual convention) */
+ while (oargc--) *(nargv++) = *(oargv++);
+ *nargv = NULL;
+ return env;
+}
+
+/* ========================================================================
+ * Error handlers.
+ */
+void error(m)
+ char *m;
+{
+ fprintf(stderr, "\n%s: %s: %s\n", progname, ifname, m);
+ abort_gzip();
+}
+
+void warn(a, b)
+ char *a, *b; /* message strings juxtaposed in output */
+{
+ WARN((stderr, "%s: %s: warning: %s%s\n", progname, ifname, a, b));
+}
+
+void read_error()
+{
+ fprintf(stderr, "\n%s: ", progname);
+ if (errno != 0) {
+ perror(ifname);
+ } else {
+ fprintf(stderr, "%s: unexpected end of file\n", ifname);
+ }
+ abort_gzip();
+}
+
+void write_error()
+{
+ fprintf(stderr, "\n%s: ", progname);
+ perror(ofname);
+ abort_gzip();
+}
+
+/* ========================================================================
+ * Display compression ratio on the given stream on 6 characters.
+ */
+void display_ratio(num, den, file)
+ long num;
+ long den;
+ FILE *file;
+{
+ long ratio; /* 1000 times the compression ratio */
+
+ if (den == 0) {
+ ratio = 0; /* no compression */
+ } else if (den < 2147483L) { /* (2**31 -1)/1000 */
+ ratio = 1000L*num/den;
+ } else {
+ ratio = num/(den/1000L);
+ }
+ if (ratio < 0) {
+ putc('-', file);
+ ratio = -ratio;
+ } else {
+ putc(' ', file);
+ }
+ fprintf(file, "%2ld.%1ld%%", ratio / 10L, ratio % 10L);
+}
+
+
+#ifndef WIN32
+/* ========================================================================
+ * Semi-safe malloc -- never returns NULL.
+ */
+voidp xmalloc (size)
+ unsigned size;
+{
+ voidp cp = (voidp)malloc (size);
+
+ if (cp == NULL) error("out of memory");
+ return cp;
+}
+#endif
+
+/* ========================================================================
+ * Table of CRC-32's of all single-byte values (made by makecrc.c)
+ */
+ulg crc_32_tab[] = {
+ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+ 0x2d02ef8dL
+};
diff --git a/Build/source/utils/gzip/vms/Makefile.gcc b/Build/source/utils/gzip/vms/Makefile.gcc
new file mode 100644
index 00000000000..04506759e7d
--- /dev/null
+++ b/Build/source/utils/gzip/vms/Makefile.gcc
@@ -0,0 +1,131 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
+# VMS version made by Klaus Reimann <kr@cip.physik.uni-stuttgart.de>,
+# revised by Roland B Roberts <roberts@nsrl31.nsrl.rochester.edu>.
+# This version is for gcc.
+
+# After constructing gzip.exe with this Makefile, you should set up
+# symbols for gzip.exe. Edit the example below, changing
+# "disk:[directory]" as appropriate.
+#
+# $ gzip == "$disk:[directory]gzip.exe"
+# $ gunzip == "$disk:[directory]gunzip.exe"
+# $ zcat == "$disk:[directory]zcat.exe"
+
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#### Start of system configuration section. ####
+
+CC = gcc
+LINK = link
+
+CFLAGS =
+# CFLAGS = /warning
+LDFLAGS =
+
+# Things you might add to DEFS
+# -DDIRENT Use <dirent.h> for recursion (-r)
+# -DSYSDIR Use <sys/dir.h> for recursion (-r)
+# -DSYSNDIR Use <sys/ndir.h> for recursion (-r)
+# -DNDIR Use <ndir.h> for recursion (-r)
+# -DSTDC_HEADERS Use <stdlib.h>
+# -DHAVE_UNISTD_H Use <unistd.h>
+# -DNO_UTIME_H Don't use <utime.h>
+# -DHAVE_SYSUTIME_H Use <sys/utime.h>
+# -DNO_MEMORY_H Don't use <memory.h>. Not needed if STDC_HEADERS.
+# -DNO_STRING_H Use strings.h, not string.h. Not needed if STDC_HEADERS
+# -DRETSIGTYPE=int Define this if signal handlers must return an int.
+# -DNO_SYMLINK OS defines S_IFLNK but does not support symbolic links
+# -DNO_MULTIPLE_DOTS System does not allow file names with multiple dots
+# -DNO_UTIME System does not support setting file modification time
+# -DNO_CHOWN System does not support setting file owner
+# -DNO_DIR System does not support readdir()
+# -DPROTO Force function prototypes even if __STDC__ not defined
+# -DASMV Use asm version match.S
+# -DMSDOS MSDOS specific
+# -DOS2 OS/2 specific
+# -DVAXC Vax/VMS with Vax C compiler
+# -DVMS Vax/VMS with gcc
+# -DDEBUG Debug code
+# -DDYN_ALLOC Use dynamic allocation of large data structures
+# -DMAXSEG_64K Maximum array size is 64K (for 16 bit system)
+# -DRECORD_IO read() and write() are rounded to record sizes.
+# -DNO_STDIN_FSTAT fstat() is not available on stdin
+# -DNO_SIZE_CHECK stat() does not give a reliable file size
+
+DEFS = /define=(VMS)
+LIBS = #@LIBS@
+
+X=.exe
+O=.obj
+
+# additional assembly sources for particular systems be required.
+OBJA = #@OBJA@
+
+#### End of system configuration section. ####
+
+OBJS = gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O util$O \
+ crypt$O lzw$O unlzw$O unpack$O unlzh$O getopt$O vms$O $(OBJA)
+
+# --- rules ---
+
+*$O: *.c
+ $(CC) $* $(DEFS) $(CFLAGS)
+# create sys$output
+# $(CC) $* $(DEFS) $(CFLAGS)$
+
+default: all
+
+all: gzip$X #zcmp zdiff zmore znew
+
+gzip$X : $(OBJS) #Makefile
+ linkobjs:=$(OBJS)
+ Schleife:
+ p = f$locate(" ",linkobjs)
+ if p .lt. f$length(linkobjs)
+ then linkobjs[p,1]:=","
+ goto Schleife
+ endif
+ write sys$output "linking ''linkobjs'"
+ $(LINK) $(LDFLAGS) /exec=gzip$X 'linkobjs',sys$input/opt
+ GNU_CC:[000000]GCCLIB/LIB,SYS$LIBRARY:VAXCRTL/SHARE $
+
+# Create a hard link. To remove both files, use "make clean". Using a hard
+# link saves disk space, by the way. Note, however, that copying a hard link
+# copies the data, not just the link. Therefore, set up the link in the
+# directory in which the executable is to reside, or else rename (move) the
+# executables into the directory.
+#
+ set file/enter=gunzip.exe gzip.exe
+ set file/enter=zcat.exe gzip.exe
+
+
+clean:
+ set file/remove gunzip.exe;0
+ set file/remove zcat.exe;0
+ delete gzip.exe;0
+ delete *$O;0
+
+# Actual build-related targets
+
+gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O: gzip.h tailor.h
+util$O lzw$O unlzw$O unpack$O unlzh$O crypt$O: gzip.h tailor.h
+
+gzip$O unlzw$O: revision.h lzw.h
+
+bits$O unzip$O util$O zip$O: crypt.h
+
+gzip$O getopt$O: getopt.h
diff --git a/Build/source/utils/gzip/vms/Makefile.mms b/Build/source/utils/gzip/vms/Makefile.mms
new file mode 100644
index 00000000000..046ce50902b
--- /dev/null
+++ b/Build/source/utils/gzip/vms/Makefile.mms
@@ -0,0 +1,122 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
+# VMS version made by Klaus Reimann <kr@cip.physik.uni-stuttgart.de>,
+# revised by Roland B Roberts <roberts@nsrl31.nsrl.rochester.edu>
+# and Karl-Jose Filler <pla_jfi@pki-nbg.philips.de>
+# This version is for VAXC with MMS.
+
+# After constructing gzip.exe with this Makefile, you should set up
+# symbols for gzip.exe. Edit the example below, changing
+# "disk:[directory]" as appropriate.
+#
+# $ gzip == "$disk:[directory]gzip.exe"
+# $ gunzip == "$disk:[directory]gunzip.exe"
+# $ zcat == "$disk:[directory]zcat.exe"
+
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#### Start of system configuration section. ####
+
+CC = cc
+LINK = link
+
+CFLAGS =
+# CFLAGS = /warning
+LDFLAGS =
+
+# Things you might add to DEFS
+# -DDIRENT Use <dirent.h> for recursion (-r)
+# -DSYSDIR Use <sys/dir.h> for recursion (-r)
+# -DSYSNDIR Use <sys/ndir.h> for recursion (-r)
+# -DNDIR Use <ndir.h> for recursion (-r)
+# -DSTDC_HEADERS Use <stdlib.h>
+# -DHAVE_UNISTD_H Use <unistd.h>
+# -DNO_UTIME_H Don't use <utime.h>
+# -DHAVE_SYSUTIME_H Use <sys/utime.h>
+# -DNO_MEMORY_H Don't use <memory.h>. Not needed if STDC_HEADERS.
+# -DNO_STRING_H Use strings.h, not string.h. Not needed if STDC_HEADERS
+# -DRETSIGTYPE=int Define this if signal handlers must return an int.
+# -DNO_SYMLINK OS defines S_IFLNK but does not support symbolic links
+# -DNO_MULTIPLE_DOTS System does not allow file names with multiple dots
+# -DNO_UTIME System does not support setting file modification time
+# -DNO_CHOWN System does not support setting file owner
+# -DNO_DIR System does not support readdir()
+# -DPROTO Force function prototypes even if __STDC__ not defined
+# -DASMV Use asm version match.S
+# -DMSDOS MSDOS specific
+# -DOS2 OS/2 specific
+# -DVAXC Vax/VMS with Vax C compiler
+# -DVMS Vax/VMS with gcc
+# -DDEBUG Debug code
+# -DDYN_ALLOC Use dynamic allocation of large data structures
+# -DMAXSEG_64K Maximum array size is 64K (for 16 bit system)
+# -DRECORD_IO read() and write() are rounded to record sizes.
+# -DNO_STDIN_FSTAT fstat() is not available on stdin
+# -DNO_SIZE_CHECK stat() does not give a reliable file size
+
+# DEFS = /define=(VAXC)
+DEFS =
+LIBS =
+
+X=.exe
+O=.obj
+
+# additional assembly sources for particular systems be required.
+OBJA =
+
+#### End of system configuration section. ####
+
+OBJS = gzip.obj zip.obj deflate.obj trees.obj bits.obj unzip.obj inflate.obj \
+ util.obj crypt.obj lzw.obj unlzw.obj unpack.obj unlzh.obj getopt.obj \
+ vms.obj $(OBJA)
+
+# --- rules ---
+
+.c.obj :
+ define/user sys sys$library
+ $(CC) $* $(DEFS) $(CFLAGS)
+# create sys.output
+# $(CC) $* $(DEFS) $(CFLAGS)$
+
+gzip.exe : $(OBJS)
+ define lnk$library sys$share:vaxcrtl
+ $(LINK) $(LDFLAGS) /exec=gzip $+
+#
+# Create a hard link. To remove both files, use "make clean". Using a hard
+# link saves disk space, by the way. Note, however, that copying a hard link
+# copies the data, not just the link. Therefore, set up the link in the
+# directory in which the executable is to reside, or else rename (move) the
+# executables into the directory.
+#
+ set file/enter=gunzip.exe gzip.exe
+ set file/enter=zcat.exe gzip.exe
+
+clean :
+ set file/remove gunzip.exe;0
+ set file/remove zcat.exe;0
+ delete gzip.exe;0
+ delete *.obj;0
+
+# Actual build-related targets
+
+gzip.obj zip.obj deflate.obj trees.obj bits.obj unzip.obj inflate.obj : gzip.h tailor.h
+util.obj lzw.obj unlzw.obj unpack.obj unlzh.obj crypt.obj : gzip.h tailor.h
+
+gzip.obj unlzw.obj : revision.h lzw.h
+
+bits.obj unzip.obj util.obj zip.obj : crypt.h
+
+gzip.obj getopt.obj : getopt.h
diff --git a/Build/source/utils/gzip/vms/Makefile.vms b/Build/source/utils/gzip/vms/Makefile.vms
new file mode 100644
index 00000000000..9401295ffcd
--- /dev/null
+++ b/Build/source/utils/gzip/vms/Makefile.vms
@@ -0,0 +1,133 @@
+# Makefile for gzip (GNU zip) -*- Indented-Text -*-
+# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
+# VMS version made by Klaus Reimann <kr@cip.physik.uni-stuttgart.de>,
+# revised by Roland B Roberts <roberts@nsrl31.nsrl.rochester.edu>.
+# This version is for VAXC. Tested with Todd Aven's MAKE/VMS.
+
+# After constructing gzip.exe with this Makefile, you should set up
+# symbols for gzip.exe. Edit the example below, changing
+# "disk:[directory]" as appropriate.
+#
+# $ gzip == "$disk:[directory]gzip.exe"
+# $ gunzip == "$disk:[directory]gunzip.exe"
+# $ zcat == "$disk:[directory]zcat.exe"
+
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#### Start of system configuration section. ####
+
+CC = cc
+LINK = link
+
+CFLAGS =
+# CFLAGS = /warning
+LDFLAGS =
+
+# Things you might add to DEFS
+# -DDIRENT Use <dirent.h> for recursion (-r)
+# -DSYSDIR Use <sys/dir.h> for recursion (-r)
+# -DSYSNDIR Use <sys/ndir.h> for recursion (-r)
+# -DNDIR Use <ndir.h> for recursion (-r)
+# -DSTDC_HEADERS Use <stdlib.h>
+# -DHAVE_UNISTD_H Use <unistd.h>
+# -DNO_UTIME_H Don't use <utime.h>
+# -DHAVE_SYSUTIME_H Use <sys/utime.h>
+# -DNO_MEMORY_H Don't use <memory.h>. Not needed if STDC_HEADERS.
+# -DNO_STRING_H Use strings.h, not string.h. Not needed if STDC_HEADERS
+# -DRETSIGTYPE=int Define this if signal handlers must return an int.
+# -DNO_SYMLINK OS defines S_IFLNK but does not support symbolic links
+# -DNO_MULTIPLE_DOTS System does not allow file names with multiple dots
+# -DNO_UTIME System does not support setting file modification time
+# -DNO_CHOWN System does not support setting file owner
+# -DNO_DIR System does not support readdir()
+# -DPROTO Force function prototypes even if __STDC__ not defined
+# -DASMV Use asm version match.S
+# -DMSDOS MSDOS specific
+# -DOS2 OS/2 specific
+# -DVAXC Vax/VMS with Vax C compiler
+# -DVMS Vax/VMS with gcc
+# -DDEBUG Debug code
+# -DDYN_ALLOC Use dynamic allocation of large data structures
+# -DMAXSEG_64K Maximum array size is 64K (for 16 bit system)
+# -DRECORD_IO read() and write() are rounded to record sizes.
+# -DNO_STDIN_FSTAT fstat() is not available on stdin
+# -DNO_SIZE_CHECK stat() does not give a reliable file size
+
+# DEFS = /define=(VAXC)
+DEFS =
+LIBS =
+
+X=.exe
+O=.obj
+
+# additional assembly sources for particular systems be required.
+OBJA =
+
+#### End of system configuration section. ####
+
+OBJS = gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O util$O \
+ crypt$O lzw$O unlzw$O unpack$O unlzh$O getopt$O vms$O $(OBJA)
+
+# --- rules ---
+
+*$O: *.c
+ define/user sys sys$library
+ $(CC) $* $(DEFS) $(CFLAGS)
+# create sys$output
+# $(CC) $* $(DEFS) $(CFLAGS)$
+
+default: all
+
+all: gzip$X #zcmp zdiff zmore znew
+
+gzip$X : $(OBJS) #Makefile
+ linkobjs:=$(OBJS)
+ Schleife:
+ p = f$locate(" ",linkobjs)
+ if p .lt. f$length(linkobjs)
+ then linkobjs[p,1]:=","
+ goto Schleife
+ endif
+ write sys$output "linking ''linkobjs'"
+ $(LINK) $(LDFLAGS) /exec=gzip$X 'linkobjs',sys$input/opt
+ SYS$LIBRARY:VAXCRTL/SHARE $
+#
+# Create a hard link. To remove both files, use "make clean". Using a hard
+# link saves disk space, by the way. Note, however, that copying a hard link
+# copies the data, not just the link. Therefore, set up the link in the
+# directory in which the executable is to reside, or else rename (move) the
+# executables into the directory.
+#
+ set file/enter=gunzip.exe gzip.exe
+ set file/enter=zcat.exe gzip.exe
+
+
+clean:
+ set file/remove gunzip.exe;0
+ set file/remove zcat.exe;0
+ delete gzip.exe;0
+ delete *$O;0
+
+# Actual build-related targets
+
+gzip$O zip$O deflate$O trees$O bits$O unzip$O inflate$O: gzip.h tailor.h
+util$O lzw$O unlzw$O unpack$O unlzh$O crypt$O: gzip.h tailor.h
+
+gzip$O unlzw$O: revision.h lzw.h
+
+bits$O unzip$O util$O zip$O: crypt.h
+
+gzip$O getopt$O: getopt.h
diff --git a/Build/source/utils/gzip/vms/Readme.vms b/Build/source/utils/gzip/vms/Readme.vms
new file mode 100644
index 00000000000..4b9797ca4e5
--- /dev/null
+++ b/Build/source/utils/gzip/vms/Readme.vms
@@ -0,0 +1,87 @@
+README file for gzip on VMS
+written by Klaus Reimann <kr@cip.physik.uni-stuttgart.de>
+
+Here is a list of the files in [.vms]:
+
+GZIP.HLP ! Help-file, how to use gzip
+MAKEFILE.GCC ! Description for (vms-)make, using gcc
+MAKEFILE.MMS ! Description for MMS-utility, using vaxc
+MAKEFILE.VMS ! Description for (vms-)make, using vaxc
+MAKEGZIP.COM ! simple and robust DCL-Script, using vaxc
+README.VMS ! this file, how to install gzip
+VMS.C ! VMS-specific functions in gzip
+
+This file describe, how to compile and install the VMS-Port of gzip.
+>>For restrictions or bugs due to the structure of the vms-filesystem
+refer to gzip.hlp.<<
+
+Installing gzip
+
+Since there are many makefiles there are many possibilities
+compiling and installing gzip. For most of them, it is important,
+that you start them from the SOURCE-Directory (that is where
+gzip.c is), not from the [.vms]-directory. Otherwise the compiler
+won't find the source-files.
+
+Using gcc saves disk-space, but needs longer to compile
+ VAXC gzip.exe 95/96 Blocks
+ gcc2.3.3 gzip.exe 86/87 Blocks
+
+To install gzip one has to perform the following steps:
+ 1. compile sources (*.c, [.vms]*.c)
+ 2. link executable gzip.exe
+ 3. Make entries gunzip.exe and zcat.exe to gzip.exe.
+ These are similar to hardlinks in UNIX
+ >>If You wish to do this by hand, see for example makegzip.com.<<
+ The Entries can't be simply deleted, use 'set file /remove' .
+
+ 4. Rename executables (*.exe) to Your prefered exe-directory. If it is on
+ another Device, then you should only copy gzip.exe and do the
+ entries gunzip.exe and zcat.exe by hand (3.).
+
+ 5. Setting up Symbols for the executables:
+ Place the following lines in Your login.com
+ Change "disk:[directory]" as appropriate.
+ $ gzip == "$disk:[directory]gzip.exe"
+ $ gunzip == "$disk:[directory]gunzip.exe"
+ $ zcat == "$disk:[directory]zcat.exe"
+ 6. insert help-file gzip.hlp in any Help-library,
+ for example in sys$help:helplib.
+ this can be done by $lib sys$help:helplib/help gzip
+ (I did not try this command)
+
+Steps (4.)5. through 6 must be done by hand.
+Steps 1 through 3(4.) may be done by one of the makefiles:
+
+a) MAKEGZIP.COM
+This was crated from MAKEFILE.VMS and later on edited. It uses the
+VAXC-Compiler and does compiling, linking and making the entries.
+Usage:
+- change to the Source-Directory
+- copy vms.c
+ $copy [.vms]vms.c []
+- start compiling, linking, entries
+ $@[.vms]makegzip
+if everything is OK. then you get gzip.exe, gunzip.exe, zcat.exe
+continue at Step 4.
+
+b) MAKEFILE.VMS
+Makefile for a vms-make utility (NOT gnu-make).
+Is uses the VAXC-Compiler and has the Advantage over MAKEGZIP.COM
+that make checks dependencies. This is helpfull if You have to
+recompile several times, for example after editing the sources.
+- change to the Source-Directory
+- copy vms.c
+ $copy [.vms]vms.c []
+- start compiling, linking, entries
+ $make /input=[.vms]makefile.vms
+if everything is OK. then you get gzip.exe, gunzip.exe, zcat.exe
+Continue at Step 4.
+
+c) MAKEFILE.GCC
+Same as MAKEFILE.VMS, but uses gcc
+- Use $make /input=[.vms]makefile.gcc instead of make ....
+
+d) MAKEFILE.MMS
+Makefile for the MMS-utility. Similar to MAKEFILE.VMS
+- Use $mms /description=[.vms]makefile.mms instead of make ....
diff --git a/Build/source/utils/gzip/vms/gzip.hlp b/Build/source/utils/gzip/vms/gzip.hlp
new file mode 100644
index 00000000000..ba53cc643dd
--- /dev/null
+++ b/Build/source/utils/gzip/vms/gzip.hlp
@@ -0,0 +1,297 @@
+1 GZIP
+NAME
+ gzip, gunzip, zcat - compress or expand files
+
+SYNOPSIS
+ gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ]
+ gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ... ]
+ zcat [ -fhLV ] [ name ... ]
+
+2 DESCRIPTION
+ Gzip reduces the size of the named files using Lempel-Ziv
+ coding (LZ77). Whenever possible, each file is replaced by
+ one with the extension .gz, while keeping the same ownership
+ modes, access and modification times. (The default exten-
+ sion is -gz for VMS, z for MSDOS, OS/2 FAT, Windows NT FAT
+ and Atari.) If no files are specified, or if a file name is
+ "-", the standard input is compressed to the standard out-
+ put. Gzip will only attempt to compress regular files.
+
+ If the compressed file name is too long for its file system,
+ gzip truncates it. Gzip attempts to truncate only the parts
+ of the file name longer than 3 characters. (A part is del-
+ imited by dots.) If the name consists of small parts only,
+ the longest parts are truncated. For example, if file names
+ are limited to 14 characters, gzip.msdos.exe is compressed
+ to gzi.msd.exe.gz. Names are not truncated on systems which
+ do not have a limit on file name length.
+
+ By default, gzip keeps the original file name and timestamp
+ in the compressed file. These are used when decompressing
+ the file with the -N option. This is useful when the
+ compressed file name was truncated or when the time stamp
+ was not preserved after a file transfer.
+
+ Compressed files can be restored to their original form
+ using gzip -d or gunzip or zcat. If the original name saved
+ in the compressed file is not suitable for its file system,
+ a new name is constructed from the original one to make it
+ legal.
+
+ gunzip takes a list of files on its command line and
+ replaces each file whose name ends with .gz, -gz, .z, -z, _z
+ or .Z and which begins with the correct magic number with an
+ uncompressed file without the original extension. gunzip
+ also recognizes the special extensions .tgz and .taz as
+ shorthands for .tar.gz and .tar.Z respectively. When
+ compressing, gzip uses the .tgz extension if necessary
+ instead of truncating a file with a .tar extension.
+
+ gunzip can currently decompress files created by gzip, zip,
+ compress, compress -H or pack. The detection of the input
+ format is automatic. When using the first two formats,
+ gunzip checks a 32 bit CRC. For pack, gunzip checks the
+ uncompressed length. The standard compress format was not
+ designed to allow consistency checks. However gunzip is
+ sometimes able to detect a bad .Z file. If you get an error
+ when uncompressing a .Z file, do not assume that the .Z file
+ is correct simply because the standard uncompress does not
+ complain. This generally means that the standard uncompress
+ does not check its input, and happily generates garbage out-
+ put. The SCO compress -H format (lzh compression method)
+ does not include a CRC but also allows some consistency
+ checks.
+
+ Files created by zip can be uncompressed by gzip only if
+ they have a single member compressed with the 'deflation'
+ method. This feature is only intended to help conversion of
+ tar.zip files to the tar.gz format. To extract zip files
+ with several members, use unzip instead of gunzip.
+
+ zcat is identical to gunzip -c. (On some systems, zcat may
+ be installed as gzcat to preserve the original link to
+ compress.) zcat uncompresses either a list of files on the
+ command line or its standard input and writes the
+ uncompressed data on standard output. zcat will uncompress
+ files that have the correct magic number whether they have a
+ .gz suffix or not.
+
+ Gzip uses the Lempel-Ziv algorithm used in zip and PKZIP.
+ The amount of compression obtained depends on the size of
+ the input and the distribution of common substrings. Typi-
+ cally, text such as source code or English is reduced by
+ 60-70%. Compression is generally much better than that
+ achieved by LZW (as used in compress), Huffman coding (as
+ used in pack), or adaptive Huffman coding (compact).
+
+ Compression is always performed, even if the compressed file
+ is slightly larger than the original. The worst case expan-
+ sion is a few bytes for the gzip file header, plus 5 bytes
+ every 32K block, or an expansion ratio of 0.015% for large
+ files. Note that the actual number of used disk blocks
+ almost never increases. gzip preserves the mode, ownership
+ and timestamps of files when compressing or decompressing.
+
+2 OPTIONS
+ -a --ascii
+ Ascii text mode: convert end-of-lines using local con-
+ ventions. This option is supported only on some non-
+ Unix systems. For MSDOS, CR LF is converted to LF when
+ compressing, and LF is converted to CR LF when
+ decompressing.
+
+ -c --stdout --to-stdout
+ Write output on standard output; keep original files
+ unchanged. If there are several input files, the out-
+ put consists of a sequence of independently compressed
+ members. To obtain better compression, concatenate all
+ input files before compressing them.
+
+ -d --decompress --uncompress
+ Decompress.
+
+ -f --force
+ Force compression or decompression even if the file has
+ multiple links or the corresponding file already
+ exists, or if the compressed data is read from or writ-
+ ten to a terminal. If the input data is not in a format
+ recognized by gzip, and if the option --stdout is also
+ given, copy the input data without change to the stan-
+ dard ouput: let zcat behave as cat. If -f is not given,
+ and when not running in the background, gzip prompts to
+ verify whether an existing file should be overwritten.
+
+ -h --help
+ Display a help screen and quit.
+
+ -l --list
+ For each compressed file, list the following fields:
+
+ compressed size: size of the compressed file
+ uncompressed size: size of the uncompressed file
+ ratio: compression ratio (0.0% if unknown)
+ uncompressed_name: name of the uncompressed file
+
+ The uncompressed size is given as -1 on VMS because it
+ it is not possible to seek reliably to the end of the
+ compressed file, where this size is stored.
+
+ In combination with the --verbose option, the following
+ fields are also displayed:
+
+ method: compression method
+ crc: the 32-bit CRC of the uncompressed data
+ date & time: time stamp for the uncompressed file
+
+ The compression methods currently supported are
+ deflate, compress, lzh (SCO compress -H) and pack. The
+ crc is given as ffffffff on VMS for the reason given
+ above about the uncompressed size.
+
+ With --name, the uncompressed name, date and time are
+ those stored within the compress file if present.
+
+ With --verbose, the size totals and compression ratio
+ for all files is also displayed, unless some sizes are
+ unknown. With --quiet, the title and totals lines are
+ not displayed.
+
+ -L --license
+ Display the gzip license and quit.
+
+ -n --no-name
+ When compressing, do not save the original file name
+ and time stamp by default. (The original name is always
+ saved if the name had to be truncated.) When
+ decompressing, do not restore the original file name if
+ present (remove only the gzip suffix from the
+ compressed file name) and do not restore the original
+ time stamp if present (copy it from the compressed
+ file). This option is the default when decompressing.
+
+ -N --name
+ When compressing, always save the original file name
+ and time stamp; this is the default. When decompress-
+ ing, restore the original file name and time stamp if
+ present. This option is useful on systems which have a
+ limit on file name length or when the time stamp has
+ been lost after a file transfer.
+
+ -q --quiet
+ Suppress all warnings.
+
+ -r --recursive
+ Travel the directory structure recursively. If any of
+ the file names specified on the command line are direc-
+ tories, gzip will descend into the directory and
+ compress all the files it finds there (or decompress
+ them in the case of gunzip ).
+
+ -S suf --suffix suf
+ Use suffix suf instead of -gz. Any suffix can be
+ given, but suffixes other than -z and -gz should be
+ avoided to avoid confusion when files are transferred
+ to other. A null suffix forces gunzip to try
+ decompression on all given files regardless of suffix,
+ as in:
+
+ gunzip --suffix "" *.*
+
+ Previous versions of gzip used the -z suffix. This was
+ changed to avoid a conflict with pack on Unix.
+
+ -t --test
+ Test. Check the compressed file integrity.
+
+ -v --verbose
+ Verbose. Display the name and percentage reduction for
+ each file compressed or decompressed.
+
+ -V --version
+ Version. Display the version number and compilation
+ options then quit.
+
+ -# --fast --best
+ Regulate the speed of compression using the specified
+ digit #, where -1 or --fast indicates the fastest
+ compression method (less compression) and -9 or --best
+ indicates the slowest compression method (best compres-
+ sion). The default compression level is -6 (that is,
+ biased towards high compression at expense of speed).
+
+2 ENVIRONMENT
+ The environment variable GZIP_OPT can hold a set of default
+ options for gzip. These options are interpreted first and
+ can be overwritten by explicit command line parameters. For
+ example:
+ define GZIP_OPT "-8 -v"
+
+2 SEE ALSO
+ compress, zip, unzip
+
+2 DIAGNOSTICS
+ Exit status is normally 0; if an error occurs, exit status
+ is 1. If a warning occurs, exit status is 2.
+
+ Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+ Invalid options were specified on the command line.
+ file: not in gzip format
+ The file specified to gunzip has not been
+ compressed.
+ file: Corrupt input. Use zcat to recover some data.
+ The compressed file has been damaged. The data up to
+ the point of failure can be recovered using
+ define /user sys$output file.recover
+ zcat file
+ file: compressed with xx bits, can only handle yy bits
+ File was compressed (using LZW) by a program that
+ could deal with more bits than the decompress code
+ on this machine. Recompress the file with gzip,
+ which compresses better and uses less memory.
+ file: already has -gz suffix -- no change
+ The file is assumed to be already compressed.
+ Rename the file and try again.
+ file already exists; do you wish to overwrite (y or n)?
+ Respond "y" if you want the output file to be
+ replaced; "n" if not.
+ gunzip: corrupt input
+ A SIGSEGV violation was detected which usually means
+ that the input file has been corrupted.
+ xx.x%
+ Percentage of the input saved by compression.
+ (Relevant only for -v and -l.)
+ -- not a regular file or directory: ignored
+ When the input file is not a regular file or direc-
+ tory, it is left unaltered.
+
+2 CAVEATS
+ On VMS:
+ - upper case options need quotes: gzip "-V".
+ - restoration of timestamps and version numbers is not supported
+ - If a compressed file already exists, gzip -f overwrites it, it
+ does not create a new version.
+ - multi-part gzip files are not supported.
+ - gunzip does not preserve the input file format. You can use a
+ separate utility to restore the original format.
+ - gunzip and zcat can be used only if you have created the
+ links to gzip as documented in makegzip.com. Otherwise
+ you must use explicit parameters ("gzip -c" or "gzip -dc").
+ - gzip --list cannot give the uncompressed size and crc.
+
+ When writing compressed data to a tape, it is generally
+ necessary to pad the output with zeroes up to a block boun-
+ dary. When the data is read and the whole block is passed to
+ gunzip for decompression, gunzip detects that there is extra
+ trailing garbage after the compressed data and emits a warn-
+ ing by default. You have to use the --quiet option to
+ suppress the warning. This option can be set in the GZIP_OPT
+ environment variable as in:
+ define GZIP_OPT "-q"
+
+2 BUGS
+ On VMS, files in VFC record format are not correctly handled by
+ the C runtime library (the linefeed character is suppressed).
+
+ In some rare cases, the --best option gives worse compres-
+ sion than the default compression level (-6). On some highly
+ redundant files, compress compresses better than gzip.
diff --git a/Build/source/utils/gzip/vms/makegzip.com b/Build/source/utils/gzip/vms/makegzip.com
new file mode 100755
index 00000000000..def90f64508
--- /dev/null
+++ b/Build/source/utils/gzip/vms/makegzip.com
@@ -0,0 +1,71 @@
+$! Makefile for VMS
+$! DCL-Shell-language. Edit the symbols section at the end.
+$!
+$ On Control_Y Then Goto The_Exit
+$ On Error Then Goto The_Exit
+$ define/user sys sys$library
+$ cc gzip.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc zip.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc deflate.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc trees.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc bits.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc unzip.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc inflate.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc util.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc crypt.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc lzw.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc unlzw.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc unpack.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc unlzh.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc getopt.c /define=(VAXC)
+$ define/user sys sys$library
+$ cc vms.c /define=(VAXC)
+$ linkobjs:=gzip.obj zip.obj deflate.obj trees.obj bits.obj unzip.obj -
+ inflate.obj util.obj crypt.obj lzw.obj unlzw.obj unpack.obj unlzh.obj -
+ getopt.obj vms.obj
+$ Schleife:
+$ p = f$locate(" ",linkobjs)
+$ if p .lt. f$length(linkobjs)
+$ then linkobjs[p,1]:=","
+$ goto Schleife
+$ endif
+$ write sys$output "linking ''linkobjs'"
+$ link /exec=gzip.exe 'linkobjs',sys$input/opt
+SYS$LIBRARY:VAXCRTL/SHARE
+$
+$ ! Create a hard link. (To remove both files, delete the copy FIRST, then
+$ ! the original. Otherwise, if original deleted first [copy says "no such
+$ ! file"], must use "set file/remove gunzip.exe;#" to get rid of the copy.
+$ ! Unlike in Unix, deleting the original ALWAYS destroys the data--but not
+$ ! the directory entry of the copy.) Using a hard link saves disk space, by
+$ ! the way. Note, however, that copying a hard link copies the data, not
+$ ! just the link. Therefore, set up the link in the directory in which the
+$ ! executable is to reside, or else rename (move) the executables into the
+$ ! directory.
+$ !
+$ set file/enter=gunzip.exe gzip.exe
+$ set file/enter=zcat.exe gzip.exe
+$
+$ ! Set up symbols for the gzip executable. Edit the example below,
+$ ! changing "disk:[directory]" as appropriate.
+$ !
+$ gzip == "$disk:[directory]gzip.exe"
+$ gunzip == "$disk:[directory]gunzip.exe"
+$ zcat == "$disk:[directory]zcat.exe"
+$
+$The_Exit:
+$ Save_Status = $STATUS
+$ exit Save_Status
diff --git a/Build/source/utils/gzip/vms/vms.c b/Build/source/utils/gzip/vms/vms.c
new file mode 100644
index 00000000000..51b891a22fb
--- /dev/null
+++ b/Build/source/utils/gzip/vms/vms.c
@@ -0,0 +1,102 @@
+/* vms.c -- target dependent functions for VMS
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ *
+ * This file was written by Karl-Jose Filler <pla_jfi@pki-nbg.philips.de>
+ * and updated by Jean-loup Gailly.
+ */
+
+#include <stdio.h>
+
+static char **vms_argv = NULL;
+
+static int max_files = 10000;
+
+struct Str_desc {
+ int length;
+ char *addr;
+};
+
+vms_expand_args(old_argc, argv)
+ int *old_argc;
+ char **argv[];
+{
+ int i;
+ int new_argc = 0;
+ int context, status;
+ char buf[255], *p;
+
+ vms_argv = (char**)xmalloc((max_files+1)*sizeof(char*));
+
+ vms_argv[new_argc++] = **argv;
+
+ for (i=1; i < *old_argc; i++) {
+ if (*argv[0][i] == '-') { /* switches */
+ if (new_argc < max_files) {
+ vms_argv[new_argc++] = argv[0][i];
+ }
+ } else { /* Files */
+ context = 0;
+ if (find_file_c(argv[0][i], buf, sizeof(buf), &context) & 1 != 1) {
+ /*
+ * Wrong file ?
+ * forward it to gzip
+ */
+ if (new_argc < max_files) {
+ vms_argv[new_argc++] = argv[0][i];
+ }
+ } else {
+ p = (char*)xmalloc(strlen(buf)+1);
+ strcpy(p, buf);
+ if (new_argc < max_files) {
+ vms_argv[new_argc++] = p;
+ }
+ while (find_file_c(argv[0][i], buf,
+ sizeof(buf), &context) & 1 == 1) {
+ p = (char*)xmalloc(strlen(buf)+1);
+ strcpy(p, buf);
+ if (new_argc < max_files) {
+ vms_argv[new_argc++] = p;
+ }
+ }
+ }
+ }
+ }
+ if (new_argc <= max_files) {
+ *old_argc = new_argc;
+ vms_argv[new_argc] = NULL;
+ *argv = vms_argv;
+ } else {
+ free(vms_argv); /* the expanded file names should also be freed ... */
+ vms_argv = NULL;
+ max_files = new_argc + 1;
+ vms_expand_args(old_argc, argv);
+ }
+}
+
+int find_file_c(in,out,out_len,context)
+ char *in;
+ char *out;
+ int out_len;
+ int *context;
+{
+ struct Str_desc in_desc,out_desc;
+ int status;
+ char *p;
+
+ in_desc.addr = in;
+ in_desc.length = strlen(in);
+
+ out_desc.addr = out;
+ out_desc.length = out_len;
+
+ status = lib$find_file(&in_desc,&out_desc,context);
+
+ p = out_desc.addr;
+ while(*p != ' ') {
+ p++;
+ }
+ *p = 0;
+
+ return status;
+}
diff --git a/Build/source/utils/gzip/win32.mak b/Build/source/utils/gzip/win32.mak
new file mode 100644
index 00000000000..3821d0493f1
--- /dev/null
+++ b/Build/source/utils/gzip/win32.mak
@@ -0,0 +1,88 @@
+################################################################################
+#
+# Makefile : Gzip
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <04/03/10 23:41:05 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+# This is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License, see the file COPYING.
+
+# This makefile is suitable for NTFS only. To build a gzip executable suitable
+# for a FAT file system, add -DNTFAT to DEFS.
+
+# To build debug version, define environment variable DEBUG, or include a
+# -DDEBUG on the commandline (i.e.: nmake -DDEBUG)
+
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+DEFS = $(DEFS) -DKPATHSEA=1
+
+programs = $(objdir)\gzip.exe $(objdir)\gunzip.exe
+manfiles = gzip.1
+infofiles = gzip.info
+pdfdocfiles = gzip.pdf
+docsubdir = gzip
+installinfoflags = --entry="* Gzip (gzip): The GNU compressor"\
+ --section="Miscellaneous"
+#
+# Object files
+#
+objects = $(objdir)\gzip.obj $(objdir)\zip.obj $(objdir)\deflate.obj \
+ $(objdir)\trees.obj $(objdir)\bits.obj $(objdir)\unzip.obj \
+ $(objdir)\inflate.obj $(objdir)\util.obj $(objdir)\crypt.obj \
+ $(objdir)\lzw.obj $(objdir)\unlzw.obj $(objdir)\unpack.obj \
+ $(objdir)\unlzh.obj
+
+#
+# Main target
+#
+default: all
+
+all: $(objdir) $(programs)
+
+#
+# Link target. setargv.obj is provided in the compiler library directory.
+#
+$(objdir)\gzip.exe: $(objects) $(gnuw32lib)
+ $(link) $(**) $(conlibs)
+
+$(objdir)\gunzip.exe: $(objdir)\gzip.exe
+ $(copy) $(**) $@
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+install:: install-exec
+
+test: check
+
+check: $(programs)
+ .\$(objdir)\gzip -6 < $(srcdir)/texinfo.tex > _gztest.gz
+ @echo The next number should be 30890
+ wc -c < _gztest.gz
+ -@$(del) _gztest
+ .\$(objdir)\gzip -d _gztest.gz
+ -@fc _gztest $(srcdir)\texinfo.tex
+ -@if ERRORLEVEL 1 \
+ echo FAILED gzip test: incorrect size; \
+ -@$(del) _gztest
+
+!include <msvc/clean.mak>
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End:
diff --git a/Build/source/utils/gzip/zdiff.1 b/Build/source/utils/gzip/zdiff.1
new file mode 100644
index 00000000000..ea3bf4103fc
--- /dev/null
+++ b/Build/source/utils/gzip/zdiff.1
@@ -0,0 +1,44 @@
+.TH ZDIFF 1
+.SH NAME
+zcmp, zdiff \- compare compressed files
+.SH SYNOPSIS
+.B zcmp
+[ cmp_options ] file1
+[ file2 ]
+.br
+.B zdiff
+[ diff_options ] file1
+[ file2 ]
+.SH DESCRIPTION
+.I Zcmp
+and
+.I zdiff
+are used to invoke the
+.I cmp
+or the
+.I diff
+program on compressed files. All options specified are passed directly to
+.I cmp
+or
+.IR diff "."
+If only 1 file is specified, then the files compared are
+.I file1
+and an uncompressed
+.IR file1 ".gz."
+If two files are specified, then they are uncompressed if necessary and fed to
+.I cmp
+or
+.IR diff "."
+The exit status from
+.I cmp
+or
+.I diff
+is preserved.
+.SH "SEE ALSO"
+cmp(1), diff(1), zmore(1), zgrep(1), znew(1), zforce(1), gzip(1), gzexe(1)
+.SH BUGS
+Messages from the
+.I cmp
+or
+.I diff
+programs refer to temporary filenames instead of those specified.
diff --git a/Build/source/utils/gzip/zdiff.in b/Build/source/utils/gzip/zdiff.in
new file mode 100644
index 00000000000..110454ccf84
--- /dev/null
+++ b/Build/source/utils/gzip/zdiff.in
@@ -0,0 +1,70 @@
+:
+#!/bin/sh
+# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
+
+# Zcmp and zdiff are used to invoke the cmp or the diff pro-
+# gram on compressed files. All options specified are passed
+# directly to cmp or diff. If only 1 file is specified, then
+# the files compared are file1 and an uncompressed file1.gz.
+# If two files are specified, then they are uncompressed (if
+# necessary) and fed to cmp or diff. The exit status from cmp
+# or diff is preserved.
+
+PATH="BINDIR:$PATH"; export PATH
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+ *cmp) comp=${CMP-cmp} ;;
+ *) comp=${DIFF-diff} ;;
+esac
+
+OPTIONS=
+FILES=
+for ARG
+do
+ case "$ARG" in
+ -*) OPTIONS="$OPTIONS $ARG";;
+ *) if test -f "$ARG"; then
+ FILES="$FILES $ARG"
+ else
+ echo "${prog}: $ARG not found or not a regular file"
+ exit 1
+ fi ;;
+ esac
+done
+if test -z "$FILES"; then
+ echo "Usage: $prog [${comp}_options] file [file]"
+ exit 1
+fi
+set $FILES
+if test $# -eq 1; then
+ FILE=`echo "$1" | sed 's/[-.][zZtga]*$//'`
+ gzip -cd "$1" | $comp $OPTIONS - "$FILE"
+ STAT="$?"
+
+elif test $# -eq 2; then
+ case "$1" in
+ *[-.]gz* | *[-.][zZ] | *.t[ga]z)
+ case "$2" in
+ *[-.]gz* | *[-.][zZ] | *.t[ga]z)
+ F=`echo "$2" | sed 's|.*/||;s|[-.][zZtga]*||'`
+ gzip -cdfq "$2" > /tmp/"$F".$$
+ gzip -cdfq "$1" | $comp $OPTIONS - /tmp/"$F".$$
+ STAT="$?"
+ /bin/rm -f /tmp/"$F".$$;;
+
+ *) gzip -cdfq "$1" | $comp $OPTIONS - "$2"
+ STAT="$?";;
+ esac;;
+ *) case "$2" in
+ *[-.]gz* | *[-.][zZ] | *.t[ga]z)
+ gzip -cdfq "$2" | $comp $OPTIONS "$1" -
+ STAT="$?";;
+ *) $comp $OPTIONS "$1" "$2"
+ STAT="$?";;
+ esac;;
+ esac
+ exit "$STAT"
+else
+ echo "Usage: $prog [${comp}_options] file [file]"
+ exit 1
+fi
diff --git a/Build/source/utils/gzip/zforce.1 b/Build/source/utils/gzip/zforce.1
new file mode 100644
index 00000000000..37c6aba6ac7
--- /dev/null
+++ b/Build/source/utils/gzip/zforce.1
@@ -0,0 +1,20 @@
+.TH ZFORCE 1
+.SH NAME
+zforce \- force a '.gz' extension on all gzip files
+.SH SYNOPSIS
+.B zforce
+[ name ... ]
+.SH DESCRIPTION
+.I zforce
+forces a .gz extension on all
+.I gzip
+files so that
+.I gzip
+will not compress them twice.
+This can be useful for files with names truncated after a file transfer.
+On systems with a 14 char limitation on file names, the original name
+is truncated to make room for the .gz suffix. For example,
+12345678901234 is renamed to 12345678901.gz. A file name such as foo.tgz
+is left intact.
+.SH "SEE ALSO"
+gzip(1), znew(1), zmore(1), zgrep(1), zdiff(1), gzexe(1)
diff --git a/Build/source/utils/gzip/zforce.in b/Build/source/utils/gzip/zforce.in
new file mode 100644
index 00000000000..4ae5763caf8
--- /dev/null
+++ b/Build/source/utils/gzip/zforce.in
@@ -0,0 +1,42 @@
+:
+#!/bin/sh
+# zforce: force a gz extension on all gzip files so that gzip will not
+# compress them twice.
+#
+# This can be useful for files with names truncated after a file transfer.
+# 12345678901234 is renamed to 12345678901.gz
+
+PATH="BINDIR:$PATH"; export PATH
+x=`basename $0`
+if test $# = 0; then
+ echo "force a '.gz' extension on all gzip files"
+ echo usage: $x files...
+ exit 1
+fi
+
+res=0
+for i do
+ if test ! -f "$i" ; then
+ echo ${x}: $i not a file
+ res=1
+ continue
+ fi
+ test `expr "$i" : '.*[.-]z$'` -eq 0 || continue
+ test `expr "$i" : '.*[.-]gz$'` -eq 0 || continue
+ test `expr "$i" : '.*[.]t[ag]z$'` -eq 0 || continue
+
+ if gzip -l < "$i" 2>/dev/null | grep '^defl' > /dev/null; then
+
+ if test `expr "$i" : '^............'` -eq 12; then
+ new=`expr "$i" : '\(.*\)...$`.gz
+ else
+ new="$i.gz"
+ fi
+ if mv "$i" "$new" 2>/dev/null; then
+ echo $i -- replaced with $new
+ continue
+ fi
+ res=1; echo ${x}: cannot rename $i to $new
+ fi
+done
+exit $res
diff --git a/Build/source/utils/gzip/zgrep.1 b/Build/source/utils/gzip/zgrep.1
new file mode 100644
index 00000000000..a52a88abcf8
--- /dev/null
+++ b/Build/source/utils/gzip/zgrep.1
@@ -0,0 +1,44 @@
+.TH ZGREP 1
+.SH NAME
+zgrep \- search possibly compressed files for a regular expression
+.SH SYNOPSIS
+.B zgrep
+[ grep_options ]
+.BI [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.SH DESCRIPTION
+.IR Zgrep
+is used to invoke the
+.I grep
+on compress'ed or gzip'ed files. All options specified are passed directly to
+.I grep.
+If no file is specified, then the standard input is decompressed
+if necessary and fed to grep.
+Otherwise the given files are uncompressed if necessary and fed to
+.I grep.
+.PP
+If
+.I zgrep
+is invoked as
+.I zegrep
+or
+.I zfgrep
+then
+.I egrep
+or
+.I fgrep
+is used instead of
+.I grep.
+If the GREP environment variable is set,
+.I zgrep
+uses it as the
+.I grep
+program to be invoked. For example:
+
+ for sh: GREP=fgrep zgrep string files
+ for csh: (setenv GREP fgrep; zgrep string files)
+.SH AUTHOR
+Charles Levert (charles@comm.polymtl.ca)
+.SH "SEE ALSO"
+grep(1), egrep(1), fgrep(1), zdiff(1), zmore(1), znew(1), zforce(1),
+gzip(1), gzexe(1)
diff --git a/Build/source/utils/gzip/zgrep.in b/Build/source/utils/gzip/zgrep.in
new file mode 100644
index 00000000000..9fcd8282bde
--- /dev/null
+++ b/Build/source/utils/gzip/zgrep.in
@@ -0,0 +1,67 @@
+:
+#!/bin/sh
+
+# zgrep -- a wrapper around a grep program that decompresses files as needed
+# Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
+
+PATH="BINDIR:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+ *egrep) grep=${EGREP-egrep} ;;
+ *fgrep) grep=${FGREP-fgrep} ;;
+ *) grep=${GREP-grep} ;;
+esac
+pat=""
+while test $# -ne 0; do
+ case "$1" in
+ -e | -f) opt="$opt $1"; shift; pat="$1"
+ if test "$grep" = grep; then # grep is buggy with -e on SVR4
+ grep=egrep
+ fi;;
+ -*) opt="$opt $1";;
+ *) if test -z "$pat"; then
+ pat="$1"
+ else
+ break;
+ fi;;
+ esac
+ shift
+done
+
+if test -z "$pat"; then
+ echo "grep through gzip files"
+ echo "usage: $prog [grep_options] pattern [files]"
+ exit 1
+fi
+
+list=0
+silent=0
+op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$op" in
+ *l*) list=1
+esac
+case "$op" in
+ *h*) silent=1
+esac
+
+if test $# -eq 0; then
+ gzip -cdfq | $grep $opt "$pat"
+ exit $?
+fi
+
+res=0
+for i do
+ if test $list -eq 1; then
+ gzip -cdfq "$i" | $grep $opt "$pat" > /dev/null && echo $i
+ r=$?
+ elif test $# -eq 1 -o $silent -eq 1; then
+ gzip -cdfq "$i" | $grep $opt "$pat"
+ r=$?
+ else
+ gzip -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${i}:|"
+ r=$?
+ fi
+ test "$r" -ne 0 && res="$r"
+done
+exit $res
diff --git a/Build/source/utils/gzip/zip.c b/Build/source/utils/gzip/zip.c
new file mode 100644
index 00000000000..507d1616efd
--- /dev/null
+++ b/Build/source/utils/gzip/zip.c
@@ -0,0 +1,117 @@
+/* zip.c -- compress files to the gzip or pkzip format
+ * Copyright (C) 1992-1993 Jean-loup Gailly
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License, see the file COPYING.
+ */
+
+#ifdef RCSID
+static char rcsid[] = "$Id: zip.c,v 0.17 1993/06/10 13:29:25 jloup Exp $";
+#endif
+
+#include <ctype.h>
+#include <sys/types.h>
+
+#include "tailor.h"
+#include "gzip.h"
+#include "crypt.h"
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifndef NO_FCNTL_H
+# include <fcntl.h>
+#endif
+
+local ulg crc; /* crc on uncompressed file data */
+long header_bytes; /* number of bytes in gzip header */
+
+/* ===========================================================================
+ * Deflate in to out.
+ * IN assertions: the input and output buffers are cleared.
+ * The variables time_stamp and save_orig_name are initialized.
+ */
+int zip(in, out)
+ int in, out; /* input and output file descriptors */
+{
+ uch flags = 0; /* general purpose bit flags */
+ ush attr = 0; /* ascii/binary flag */
+ ush deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */
+
+ ifd = in;
+ ofd = out;
+ outcnt = 0;
+
+ /* Write the header to the gzip file. See algorithm.doc for the format */
+
+ method = DEFLATED;
+ put_byte(GZIP_MAGIC[0]); /* magic header */
+ put_byte(GZIP_MAGIC[1]);
+ put_byte(DEFLATED); /* compression method */
+
+ if (save_orig_name) {
+ flags |= ORIG_NAME;
+ }
+ put_byte(flags); /* general flags */
+ put_long(time_stamp);
+
+ /* Write deflated file to zip file */
+ crc = updcrc(0, 0);
+
+ bi_init(out);
+ ct_init(&attr, &method);
+ lm_init(level, &deflate_flags);
+
+ put_byte((uch)deflate_flags); /* extra flags */
+ put_byte(OS_CODE); /* OS identifier */
+
+ if (save_orig_name) {
+ char *p = basename(ifname); /* Don't save the directory part. */
+ do {
+ put_char(*p);
+ } while (*p++);
+ }
+ header_bytes = (long)outcnt;
+
+ (void)deflate();
+
+#if !defined(NO_SIZE_CHECK) && !defined(RECORD_IO)
+ /* Check input size (but not in VMS -- variable record lengths mess it up)
+ * and not on MSDOS -- diet in TSR mode reports an incorrect file size)
+ */
+ if (ifile_size != -1L && isize != (ulg)ifile_size) {
+ Trace((stderr, " actual=%ld, read=%ld ", ifile_size, isize));
+ fprintf(stderr, "%s: %s: file size changed while zipping\n",
+ progname, ifname);
+ }
+#endif
+
+ /* Write the crc and uncompressed size */
+ put_long(crc);
+ put_long(isize);
+ header_bytes += 2*sizeof(long);
+
+ flush_outbuf();
+ return OK;
+}
+
+
+/* ===========================================================================
+ * Read a new buffer from the current input file, perform end-of-line
+ * translation, and update the crc and input file size.
+ * IN assertion: size >= 2 (for end-of-line translation)
+ */
+int file_read(buf, size)
+ char *buf;
+ unsigned size;
+{
+ unsigned len;
+
+ Assert(insize == 0, "inbuf not empty");
+
+ len = read(ifd, buf, size);
+ if (len == (unsigned)(-1) || len == 0) return (int)len;
+
+ crc = updcrc((uch*)buf, len);
+ isize += (ulg)len;
+ return (int)len;
+}
diff --git a/Build/source/utils/gzip/zmore.1 b/Build/source/utils/gzip/zmore.1
new file mode 100644
index 00000000000..f7f1843de01
--- /dev/null
+++ b/Build/source/utils/gzip/zmore.1
@@ -0,0 +1,145 @@
+.TH ZMORE 1
+.SH NAME
+zmore \- file perusal filter for crt viewing of compressed text
+.SH SYNOPSIS
+.B zmore
+[ name ... ]
+.SH DESCRIPTION
+.I Zmore
+is a filter which allows examination of compressed or plain text files
+one screenful at a time on a soft-copy terminal.
+.I zmore
+works on files compressed with
+.I compress, pack
+or
+.I gzip,
+and also on uncompressed files.
+If a file does not exist,
+.I zmore
+looks for a file of the same name with the addition of a .gz, .z or .Z suffix.
+.PP
+.I Zmore
+normally pauses after each screenful, printing --More--
+at the bottom of the screen.
+If the user then types a carriage return, one more line is displayed.
+If the user hits a space,
+another screenful is displayed. Other possibilities are enumerated later.
+.PP
+.I Zmore
+looks in the file
+.I /etc/termcap
+to determine terminal characteristics,
+and to determine the default window size.
+On a terminal capable of displaying 24 lines,
+the default window size is 22 lines.
+To use a pager other than the default
+.I more,
+set environment variable PAGER to the name of the desired program, such as
+.I less.
+.PP
+Other sequences which may be typed when
+.I zmore
+pauses, and their effects, are as follows (\fIi\fP is an optional integer
+argument, defaulting to 1) :
+.PP
+.IP \fIi\|\fP<space>
+display
+.I i
+more lines, (or another screenful if no argument is given)
+.PP
+.IP ^D
+display 11 more lines (a ``scroll'').
+If
+.I i
+is given, then the scroll size is set to \fIi\|\fP.
+.PP
+.IP d
+same as ^D (control-D)
+.PP
+.IP \fIi\|\fPz
+same as typing a space except that \fIi\|\fP, if present, becomes the new
+window size. Note that the window size reverts back to the default at the
+end of the current file.
+.PP
+.IP \fIi\|\fPs
+skip \fIi\|\fP lines and print a screenful of lines
+.PP
+.IP \fIi\|\fPf
+skip \fIi\fP screenfuls and print a screenful of lines
+.PP
+.IP "q or Q"
+quit reading the current file; go on to the next (if any)
+.PP
+.IP "e or q"
+When the prompt --More--(Next file:
+.IR file )
+is printed, this command causes zmore to exit.
+.PP
+.IP s
+When the prompt --More--(Next file:
+.IR file )
+is printed, this command causes zmore to skip the next file and continue.
+.PP
+.IP =
+Display the current line number.
+.PP
+.IP \fIi\|\fP/expr
+search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
+If the pattern is not found,
+.I zmore
+goes on to the next file (if any).
+Otherwise, a screenful is displayed, starting two lines before the place
+where the expression was found.
+The user's erase and kill characters may be used to edit the regular
+expression.
+Erasing back past the first column cancels the search command.
+.PP
+.IP \fIi\|\fPn
+search for the \fIi\|\fP-th occurrence of the last regular expression entered.
+.PP
+.IP !command
+invoke a shell with \fIcommand\|\fP.
+The character `!' in "command" are replaced with the
+previous shell command. The sequence "\\!" is replaced by "!".
+.PP
+.IP ":q or :Q"
+quit reading the current file; go on to the next (if any)
+(same as q or Q).
+.PP
+.IP .
+(dot) repeat the previous command.
+.PP
+The commands take effect immediately, i.e., it is not necessary to
+type a carriage return.
+Up to the time when the command character itself is given,
+the user may hit the line kill character to cancel the numerical
+argument being formed.
+In addition, the user may hit the erase character to redisplay the
+--More-- message.
+.PP
+At any time when output is being sent to the terminal, the user can
+hit the quit key (normally control\-\\).
+.I Zmore
+will stop sending output, and will display the usual --More--
+prompt.
+The user may then enter one of the above commands in the normal manner.
+Unfortunately, some output is lost when this is done, due to the
+fact that any characters waiting in the terminal's output queue
+are flushed when the quit signal occurs.
+.PP
+The terminal is set to
+.I noecho
+mode by this program so that the output can be continuous.
+What you type will thus not show on your terminal, except for the / and !
+commands.
+.PP
+If the standard output is not a teletype, then
+.I zmore
+acts just like
+.I zcat,
+except that a header is printed before each file.
+.SH FILES
+.DT
+/etc/termcap Terminal data base
+.SH "SEE ALSO"
+more(1), gzip(1), zdiff(1), zgrep(1), znew(1), zforce(1), gzexe(1)
diff --git a/Build/source/utils/gzip/zmore.in b/Build/source/utils/gzip/zmore.in
new file mode 100644
index 00000000000..0865167ddfd
--- /dev/null
+++ b/Build/source/utils/gzip/zmore.in
@@ -0,0 +1,52 @@
+:
+#!/bin/sh
+
+PATH="BINDIR:$PATH"; export PATH
+if test "`echo -n a`" = "-n a"; then
+ # looks like a SysV system:
+ n1=''; n2='\c'
+else
+ n1='-n'; n2=''
+fi
+oldtty=`stty -g 2>/dev/null`
+if stty -cbreak 2>/dev/null; then
+ cb='cbreak'; ncb='-cbreak'
+else
+ # 'stty min 1' resets eof to ^a on both SunOS and SysV!
+ cb='min 1 -icanon'; ncb='icanon eof ^d'
+fi
+if test $? -eq 0 -a -n "$oldtty"; then
+ trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
+else
+ trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
+fi
+
+if test $# = 0; then
+ if test -t 0; then
+ echo usage: zmore files...
+ else
+ gzip -cdfq | eval ${PAGER-more}
+ fi
+else
+ FIRST=1
+ for FILE
+ do
+ if test $FIRST -eq 0; then
+ echo $n1 "--More--(Next file: $FILE)$n2"
+ stty $cb -echo 2>/dev/null
+ ANS=`dd bs=1 count=1 2>/dev/null`
+ stty $ncb echo 2>/dev/null
+ echo " "
+ if test "$ANS" = 'e' -o "$ANS" = 'q'; then
+ exit
+ fi
+ fi
+ if test "$ANS" != 's'; then
+ echo "------> $FILE <------"
+ gzip -cdfq "$FILE" | eval ${PAGER-more}
+ fi
+ if test -t; then
+ FIRST=0
+ fi
+ done
+fi
diff --git a/Build/source/utils/gzip/znew.1 b/Build/source/utils/gzip/znew.1
new file mode 100644
index 00000000000..5cfb47246e3
--- /dev/null
+++ b/Build/source/utils/gzip/znew.1
@@ -0,0 +1,39 @@
+.TH ZNEW 1
+.SH NAME
+znew \- recompress .Z files to .gz files
+.SH SYNOPSIS
+.B znew
+[ -ftv9PK] [ name.Z ... ]
+.SH DESCRIPTION
+.I Znew
+recompresses files from .Z (compress) format to .gz (gzip) format.
+If you want to recompress a file already in gzip format, rename the file
+to force a .Z extension then apply znew.
+.SH OPTIONS
+.TP
+.B \-f
+Force recompression from .Z to .gz format even if a .gz file already exists.
+.TP
+.B \-t
+Tests the new files before deleting originals.
+.TP
+.B \-v
+Verbose. Display the name and percentage reduction for each file compressed.
+.TP
+.B \-9
+Use the slowest compression method (optimal compression).
+.TP
+.B \-P
+Use pipes for the conversion to reduce disk space usage.
+.TP
+.B \-K
+Keep a .Z file when it is smaller than the .gz file
+.SH "SEE ALSO"
+gzip(1), zmore(1), zdiff(1), zgrep(1), zforce(1), gzexe(1), compress(1)
+.SH BUGS
+.I Znew
+does not maintain the time stamp with the -P option if
+.I cpmod(1)
+is not available and
+.I touch(1)
+does not support the -r option.
diff --git a/Build/source/utils/gzip/znew.in b/Build/source/utils/gzip/znew.in
new file mode 100644
index 00000000000..5b61471e030
--- /dev/null
+++ b/Build/source/utils/gzip/znew.in
@@ -0,0 +1,146 @@
+:
+#!/bin/sh
+
+PATH="BINDIR:$PATH"; export PATH
+check=0
+pipe=0
+opt=
+files=
+keep=0
+res=0
+old=0
+new=0
+block=1024
+# block is the disk block size (best guess, need not be exact)
+
+warn="(does not preserve modes and timestamp)"
+tmp=/tmp/zfoo.$$
+echo hi > $tmp.1
+echo hi > $tmp.2
+if test -z "`(${CPMOD-cpmod} $tmp.1 $tmp.2) 2>&1`"; then
+ cpmod=${CPMOD-cpmod}
+ warn=""
+fi
+
+if test -z "$cpmod" && ${TOUCH-touch} -r $tmp.1 $tmp.2 2>/dev/null; then
+ cpmod="${TOUCH-touch}"
+ cpmodarg="-r"
+ warn="(does not preserve file modes)"
+fi
+
+# check if GZIP env. variable uses -S or --suffix
+gzip -q $tmp.1
+ext=`echo $tmp.1* | sed "s|$tmp.1||"`
+rm -f $tmp.[12]*
+if test -z "$ext"; then
+ echo znew: error determining gzip extension
+ exit 1
+fi
+if test "$ext" = ".Z"; then
+ echo znew: cannot use .Z as gzip extension.
+ exit 1
+fi
+
+for arg
+do
+ case "$arg" in
+ -*) opt="$opt $arg"; shift;;
+ *) break;;
+ esac
+done
+
+if test $# -eq 0; then
+ echo "recompress .Z files into $ext (gzip) files"
+ echo usage: `echo $0 | sed 's,^.*/,,'` "[-tv9KP]" file.Z...
+ echo " -t tests the new files before deleting originals"
+ echo " -v be verbose"
+ echo " -9 use the slowest compression method (optimal compression)"
+ echo " -K keep a .Z file when it is smaller than the $ext file"
+ echo " -P use pipes for the conversion $warn"
+ exit 1
+fi
+
+opt=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$opt" in
+ *t*) check=1; opt=`echo "$opt" | sed 's/t//g'`
+esac
+case "$opt" in
+ *K*) keep=1; opt=`echo "$opt" | sed 's/K//g'`
+esac
+case "$opt" in
+ *P*) pipe=1; opt=`echo "$opt" | sed 's/P//g'`
+esac
+if test -n "$opt"; then
+ opt="-$opt"
+fi
+
+for i do
+ n=`echo $i | sed 's/.Z$//'`
+ if test ! -f "$n.Z" ; then
+ echo $n.Z not found
+ res=1; continue
+ fi
+ test $keep -eq 1 && old=`wc -c < "$n.Z"`
+ if test $pipe -eq 1; then
+ if gzip -d < "$n.Z" | gzip $opt > "$n$ext"; then
+ # Copy file attributes from old file to new one, if possible.
+ test -n "$cpmod" && $cpmod $cpmodarg "$n.Z" "$n$ext" 2> /dev/null
+ else
+ echo error while recompressing $n.Z
+ res=1; continue
+ fi
+ else
+ if test $check -eq 1; then
+ if cp -p "$n.Z" "$n.$$" 2> /dev/null || cp "$n.Z" "$n.$$"; then
+ :
+ else
+ echo cannot backup "$n.Z"
+ res=1; continue
+ fi
+ fi
+ if gzip -d "$n.Z"; then
+ :
+ else
+ test $check -eq 1 && mv "$n.$$" "$n.Z"
+ echo error while uncompressing $n.Z
+ res=1; continue
+ fi
+ if gzip $opt "$n"; then
+ :
+ else
+ if test $check -eq 1; then
+ mv "$n.$$" "$n.Z" && rm -f "$n"
+ echo error while recompressing $n
+ else
+ # compress $n (might be dangerous if disk full)
+ echo error while recompressing $n, left uncompressed
+ fi
+ res=1; continue
+ fi
+ fi
+ test $keep -eq 1 && new=`wc -c < "$n$ext"`
+ if test $keep -eq 1 -a `expr \( $old + $block - 1 \) / $block` -lt \
+ `expr \( $new + $block - 1 \) / $block`; then
+ if test $pipe -eq 1; then
+ rm -f "$n$ext"
+ elif test $check -eq 1; then
+ mv "$n.$$" "$n.Z" && rm -f "$n$ext"
+ else
+ gzip -d "$n$ext" && compress "$n" && rm -f "$n$ext"
+ fi
+ echo "$n.Z smaller than $n$ext -- unchanged"
+
+ elif test $check -eq 1; then
+ if gzip -t "$n$ext" ; then
+ rm -f "$n.$$" "$n.Z"
+ else
+ test $pipe -eq 0 && mv "$n.$$" "$n.Z"
+ rm -f "$n$ext"
+ echo error while testing $n$ext, $n.Z unchanged
+ res=1; continue
+ fi
+ elif test $pipe -eq 1; then
+ rm -f "$n.Z"
+ fi
+done
+exit $res
diff --git a/Build/source/utils/jpeg2ps/Makefile b/Build/source/utils/jpeg2ps/Makefile
new file mode 100644
index 00000000000..a1b5aa98706
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/Makefile
@@ -0,0 +1,68 @@
+# Makefile for jpeg2ps
+# (C) Thomas Merz 1994-1999
+
+VERSION=1.8
+DIRNAME = jpeg2ps-$(VERSION)
+TARFILE = jpeg2ps-$(VERSION).tar
+ZIPFILE = jpeg2ps-$(VERSION).zip
+
+# ----------------------------------------------------------------------------
+# Available compile time options:
+# -DKNR for Kernighan/Ritchie compilers
+# -DA4 gives A4 as default page size, omitting -DA4 gives U.S. letter format
+# -DDOS adds DOS and OS/2 support
+
+# The following was reported to work for emx/gcc 0.9c fix04 under OS/2:
+# make -f Makefile "CCFLAGS=-c -DA4 -DDOS -O2" "LDFLAGS=-Zexe -s"
+
+CC=gcc
+CCFLAGS= -c -DA4
+LD=gcc
+LDFLAGS=
+OBJ=o
+EXE=
+RM=rm -f
+
+.c.$(OBJ) :
+ $(CC) $(CCFLAGS) $*.c
+
+all: jpeg2ps$(EXE)
+
+# If your system doesn't have getopt(), add the supplied getopt.c
+# module below in the jpeg2ps line.
+
+jpeg2ps$(EXE): jpeg2ps.$(OBJ) readjpeg.$(OBJ) asc85ec.$(OBJ)
+ $(LD) $(LDFLAGS) -o jpeg2ps$(EXE) jpeg2ps.$(OBJ) readjpeg.$(OBJ) asc85ec.$(OBJ)
+
+DISTFILES = jpeg2ps.c psimage.h readjpeg.c asc85ec.c getopt.c Makefile jpeg2ps.dsp jpeg2ps.txt descrip.mms
+
+DOSDISTFILES = $(DISTFILES) jpeg2ps.exe
+
+CONVFILES = jpeg2ps.c psimage.h readjpeg.c asc85ec.c getopt.c Makefile jpeg2ps.txt
+
+dist: $(DOSDISTFILES)
+ $(RM) $(ZIPFILE) $(TARFILE).gz; \
+ ln -s . $(DIRNAME); \
+ lineend -d $(CONVFILES); \
+ (for i in $(DOSDISTFILES); do \
+ echo $$i; \
+ done) | sed "s;.*;$(DIRNAME)/&;" >distfiles; \
+ zip -9 $(ZIPFILE) `cat distfiles`; \
+ (for i in $(DISTFILES); do \
+ echo $$i; \
+ done) | sed "s;.*;$(DIRNAME)/&;" >distfiles; \
+ lineend -u $(CONVFILES); \
+ tar cvf $(TARFILE) `cat distfiles`; \
+ gzip -9 $(TARFILE); \
+ $(RM) $(DIRNAME) distfiles;
+
+clean:
+ $(RM) *.$(OBJ) jpeg2ps$(EXE) $(TARFILE) $(ZIPFILE)
+
+jpeg2ps.$(OBJ): jpeg2ps.c psimage.h
+
+readjpeg.$(OBJ): readjpeg.c psimage.h
+
+asc85ec.$(OBJ): asc85ec.c psimage.h
+
+getopt.$(OBJ): getopt.c
diff --git a/Build/source/utils/jpeg2ps/asc85ec.c b/Build/source/utils/jpeg2ps/asc85ec.c
new file mode 100644
index 00000000000..7f03b80991b
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/asc85ec.c
@@ -0,0 +1,129 @@
+/* ASCII85 and Hex encoding for PostScript Level 2 and PDF */
+/* (C) Thomas Merz 1994-99 */
+
+#include <stdio.h>
+#include <fcntl.h>
+
+#ifdef WIN32
+#define DOS
+#endif
+
+#ifdef DOS
+#include <io.h>
+#include <stdlib.h>
+#endif
+
+#include "psimage.h"
+
+typedef unsigned char byte;
+
+static unsigned char buf[4];
+static unsigned long power85[5] = { 1L, 85L, 85L*85, 85L*85*85, 85L*85*85*85};
+static int outbytes; /* Number of characters in an output line */
+
+/* read 0-4 Bytes. result: number of bytes read */
+static int
+ReadSomeBytes P1(FILE *, in)
+{
+ register int count, i;
+
+ for (count = 0; count < 4; count++) {
+ if ((i = getc(in)) == EOF)
+ break;
+ else
+ buf[count] = (byte) i;
+ }
+ return count;
+}
+
+/* Two percent characters at the start of a line will cause trouble
+ * with some post-processing software. In order to avoid this, we
+ * simply insert a line break if we encounter a percent character
+ * at the start of the line. Of course, this rather simplistic
+ * algorithm may lead to a large line count in pathological cases,
+ * but the chance for hitting such a case is very small, and even
+ * so it's only a cosmetic flaw and not a functional restriction.
+ */
+
+static void
+outbyte P2(byte, c, FILE *, out)
+{ /* output one byte */
+
+ if (fputc(c, out) == EOF) {
+ fprintf(stderr, "jpeg2ps: write error - exit!\n");
+ exit(1);
+ }
+
+ if (++outbytes > 63 || /* line limit reached */
+ (outbytes == 1 && c == '%') ) { /* caution: percent character at start of line */
+ fputc('\n', out); /* insert line feed */
+ outbytes = 0;
+ }
+}
+
+int
+ASCII85Encode P2(FILE *, in, FILE *, out)
+{
+ register int i, count;
+ unsigned long word, v;
+
+ outbytes = 0;
+
+ /* 4 bytes read ==> output 5 bytes */
+ while ((count = ReadSomeBytes(in)) == 4) {
+ word = ((unsigned long)(((unsigned int)buf[0] << 8) + buf[1]) << 16) +
+ (((unsigned int)buf[2] << 8) + buf[3]);
+ if (word == 0)
+ outbyte('z', out); /* shortcut for 0 */
+ else
+ /* calculate 5 ASCII85 bytes and output them */
+ for (i = 4; i >= 0; i--) {
+ v = word / power85[i];
+ outbyte((byte) (v + '!'), out);
+ word -= v * power85[i];
+ }
+ }
+
+ word = 0;
+
+ if (count != 0) { /* 1-3 bytes left */
+ for (i = count-1; i >= 0; i--) /* accumulate bytes */
+ word += (unsigned long)buf[i] << 8 * (3-i);
+
+ /* encoding as above, but output only count+1 bytes */
+ for (i = 4; i >= 4-count; i--) {
+ v = word / power85[i];
+ outbyte((byte) (v + '!'), out);
+ word -= v * power85[i];
+ }
+ }
+
+ fputc('~', out); /* EOD marker */
+ fputc('>', out);
+ return 0;
+}
+
+void
+ASCIIHexEncode P2(FILE *, in, FILE *, out) {
+ static char buffer[512];
+ static char BinToHex[] = "0123456789ABCDEF";
+ int CharsPerLine;
+ size_t i, n;
+ unsigned char *p;
+
+ CharsPerLine = 0;
+ fputc('\n', out);
+
+ while ((n = fread(buffer, 1, sizeof(buffer), in)) != 0)
+ for (i = 0, p = (unsigned char *) buffer; i < n; i++, p++) {
+ fputc(BinToHex[*p>>4], out); /* first nibble */
+ fputc(BinToHex[*p & 0x0F], out); /* second nibble */
+ if ((CharsPerLine += 2) >= 64) {
+ fputc('\n', out);
+ CharsPerLine = 0;
+ }
+ }
+
+ fputc('>', out); /* EOD marker for PostScript hex strings */
+}
+
diff --git a/Build/source/utils/jpeg2ps/depend.mak b/Build/source/utils/jpeg2ps/depend.mak
new file mode 100644
index 00000000000..1ae0afde1eb
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/depend.mak
@@ -0,0 +1,13 @@
+$(objdir)/asc85ec.obj: \
+ psimage.h
+
+$(objdir)/getopt.obj: \
+
+
+$(objdir)/readjpeg.obj: \
+ psimage.h
+
+$(objdir)/jpeg2ps.obj: \
+ $(gnuw32dir)/oldnames.h \
+ psimage.h
+
diff --git a/Build/source/utils/jpeg2ps/descrip.mms b/Build/source/utils/jpeg2ps/descrip.mms
new file mode 100644
index 00000000000..2f50c3d8f82
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/descrip.mms
@@ -0,0 +1,40 @@
+# Makefile for jpeg2ps
+# (C) Thomas Merz 1994-1999
+# Unsupported VMS Makefile for mms, initially provided by
+# Rolf Niepraschk (niepraschk@ptb.de )
+
+# ----------------------------------------------------------------------------
+# VMS version
+#
+# throw out /DEFINE=A4 if you want letter format as default size
+# throw out -DA4 if you want letter format as default size
+# use /DEFINE=KNR for Kernighan/Ritchie compilers
+
+CC=cc
+CCOPT= /DEFINE=A4/PREFIX=ALL/NOWARN
+LDOPT=
+OBJ=OBJ
+EXE=.EXE
+RM=DEL/LOG
+
+.c.$(OBJ) :
+ $(CC) $(CCOPT) $*.c
+
+all : jpeg2ps$(EXE)
+ @ !
+
+jpeg2ps$(EXE) : jpeg2ps.$(OBJ) readjpeg.$(OBJ) asc85ec.$(OBJ) getopt.$(OBJ)
+ LINK $(LDOPT) /EXE=$@ $+
+
+
+clean :
+ @ $ IF F$SEARCH("*.$(OBJ)",).NES."" THEN $(RM) *.$(OBJ);*
+ @ $ IF F$SEARCH("jpeg2ps$(EXE)",).NES."" THEN $(RM) jpeg2ps$(EXE);*
+
+jpeg2ps.$(OBJ) : jpeg2ps.c psimage.h
+
+readjpeg.$(OBJ) : readjpeg.c psimage.h
+
+asc85ec.$(OBJ) : asc85ec.c
+
+getopt.$(OBJ) : getopt.c
diff --git a/Build/source/utils/jpeg2ps/getopt.c b/Build/source/utils/jpeg2ps/getopt.c
new file mode 100644
index 00000000000..43470b8c887
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/getopt.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getopt.c 4.13 (Berkeley) 2/23/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * get option letter from argument vector
+ */
+int opterr = 1, /* if error message should be printed */
+ optind = 1, /* index into parent argv vector */
+ optopt; /* character checked for validity */
+char *optarg; /* argument associated with option */
+
+#define BADCH (int)'?'
+#define EMSG ""
+
+int
+getopt(nargc, nargv, ostr)
+ int nargc;
+ char **nargv;
+ char *ostr;
+{
+ static char *place = EMSG; /* option letter processing */
+ register char *oli; /* option letter list index */
+ char *p;
+
+ if (!*place) { /* update scanning pointer */
+ if (optind >= nargc || *(place = nargv[optind]) != '-') {
+ place = EMSG;
+ return(EOF);
+ }
+ if (place[1] && *++place == '-') { /* found "--" */
+ ++optind;
+ place = EMSG;
+ return(EOF);
+ }
+ } /* option letter okay? */
+ if ((optopt = (int)*place++) == (int)':' ||
+ !(oli = strchr(ostr, optopt))) {
+ /*
+ * if the user didn't specify '-' as an option,
+ * assume it means EOF.
+ */
+ if (optopt == (int)'-')
+ return(EOF);
+ if (!*place)
+ ++optind;
+ if (opterr) {
+ if (!(p = strrchr(*nargv, '/')))
+ p = *nargv;
+ else
+ ++p;
+ (void)fprintf(stderr, "%s: illegal option -- %c\n",
+ p, optopt);
+ }
+ return(BADCH);
+ }
+ if (*++oli != ':') { /* don't need argument */
+ optarg = NULL;
+ if (!*place)
+ ++optind;
+ }
+ else { /* need an argument */
+ if (*place) /* no white space */
+ optarg = place;
+ else if (nargc <= ++optind) { /* no arg */
+ place = EMSG;
+ if (!(p = strrchr(*nargv, '/')))
+ p = *nargv;
+ else
+ ++p;
+ if (opterr)
+ (void)fprintf(stderr,
+ "%s: option requires an argument -- %c\n",
+ p, optopt);
+ return(BADCH);
+ }
+ else /* white space */
+ optarg = nargv[optind];
+ place = EMSG;
+ ++optind;
+ }
+ return(optopt); /* dump back option letter */
+}
diff --git a/Build/source/utils/jpeg2ps/jpeg2ps.c b/Build/source/utils/jpeg2ps/jpeg2ps.c
new file mode 100644
index 00000000000..9ce4f9acf00
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/jpeg2ps.c
@@ -0,0 +1,422 @@
+/* --------------------------------------------------------------------
+ * jpeg2ps: convert JPEG files to compressed PostScript Level 2 EPS
+ *
+ * (C) 1994-1999 Thomas Merz
+ *
+ * ------------------------------------------------------------------*/
+
+#define VERSION "V1.8"
+
+#include <stdio.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef WIN32
+#define DOS
+#include <oldnames.h>
+#endif
+
+#ifndef DOS
+#include <unistd.h>
+#endif
+
+#ifdef DOS
+#include <dos.h>
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+/* try to identify Mac compilers */
+#if __POWERPC__ || __CFM68K__ || __MC68K_
+#define MAC
+#endif
+
+#ifdef MAC
+#include "Main.h" /* Required for DropUNIX */
+#endif
+
+#include "psimage.h"
+
+#if (defined(DOS) || defined (MAC))
+#define READMODE "rb" /* read JPEG files in binary mode */
+#define WRITEMODE "wb" /* write (some) PS files in binary mode */
+#else
+#define READMODE "r"
+#define WRITEMODE "w" /* write (some) PS files in binary mode */
+#endif
+
+int Margin = 20; /* safety margin */
+BOOL quiet = FALSE; /* suppress informational messages */
+BOOL autorotate = FALSE; /* disable automatic rotation */
+
+extern BOOL AnalyzeJPEG P1(imagedata *, image);
+extern int ASCII85Encode P2(FILE *, in, FILE *, out);
+extern void ASCIIHexEncode P2(FILE *, in, FILE *, out);
+
+#ifndef MAC
+extern char *optarg;
+extern int optind;
+#endif
+
+#ifdef DOS
+extern int getopt P3(int, nargc, char **, nargv, char *, ostr);
+#endif
+
+#define BUFFERSIZE 1024
+static char buffer[BUFFERSIZE];
+static char *ColorSpaceNames[] = {"", "Gray", "", "RGB", "CMYK" };
+
+/* Array of known page sizes including name, width, and height */
+
+typedef struct { const char *name; int width; int height; } PageSize_s;
+
+PageSize_s PageSizes[] = {
+ {"a0", 2380, 3368},
+ {"a1", 1684, 2380},
+ {"a2", 1190, 1684},
+ {"a3", 842, 1190},
+ {"a4", 595, 842},
+ {"a5", 421, 595},
+ {"a6", 297, 421},
+ {"b5", 501, 709},
+ {"letter", 612, 792},
+ {"legal", 612, 1008},
+ {"ledger", 1224, 792},
+ {"p11x17", 792, 1224}
+};
+
+#define PAGESIZELIST (sizeof(PageSizes)/sizeof(PageSizes[0]))
+
+#ifdef A4
+int PageWidth = 595; /* page width A4 */
+int PageHeight = 842; /* page height A4 */
+#else
+int PageWidth = 612; /* page width letter */
+int PageHeight = 792; /* page height letter */
+#endif
+
+static void
+JPEGtoPS P2(imagedata *, JPEG, FILE *, PSfile) {
+ int llx, lly, urx, ury; /* Bounding box coordinates */
+ size_t n;
+ float scale, sx, sy; /* scale factors */
+ time_t t;
+ int i;
+
+ /* read image parameters and fill JPEG struct*/
+ if (!AnalyzeJPEG(JPEG)) {
+ fprintf(stderr, "Error: '%s' is not a proper JPEG file!\n", JPEG->filename);
+ return;
+ }
+
+ if (!quiet)
+ fprintf(stderr, "Note on file '%s': %dx%d pixel, %d color component%s\n",
+ JPEG->filename, JPEG->width, JPEG->height, JPEG->components,
+ (JPEG->components == 1 ? "" : "s"));
+
+ /* "Use resolution from file" was requested, but we couldn't find any */
+ if (JPEG->dpi == DPI_USE_FILE && !quiet) {
+ fprintf(stderr,
+ "Note: no resolution values found in JPEG file - using standard scaling.\n");
+ JPEG->dpi = DPI_IGNORE;
+ }
+
+ if (JPEG->dpi == DPI_IGNORE) {
+ if (JPEG->width > JPEG->height && autorotate) { /* switch to landscape if needed */
+ JPEG->landscape = TRUE;
+ if (!quiet)
+ fprintf(stderr,
+ "Note: image width exceeds height - producing landscape output!\n");
+ }
+ if (!JPEG->landscape) { /* calculate scaling factors */
+ sx = (float) (PageWidth - 2*Margin) / JPEG->width;
+ sy = (float) (PageHeight - 2*Margin) / JPEG->height;
+ }else {
+ sx = (float) (PageHeight - 2*Margin) / JPEG->width;
+ sy = (float) (PageWidth - 2*Margin) / JPEG->height;
+ }
+ scale = min(sx, sy); /* We use at least one edge of the page */
+ } else {
+ if (!quiet)
+ fprintf(stderr, "Note: Using resolution %d dpi.\n", (int) JPEG->dpi);
+ scale = 72 / JPEG->dpi; /* use given image resolution */
+ }
+
+ if (JPEG->landscape) {
+ /* landscape: move to (urx, lly) */
+ urx = PageWidth - Margin;
+ lly = Margin;
+ ury = (int) (Margin + scale*JPEG->width + 0.9); /* ceiling */
+ llx = (int) (urx - scale * JPEG->height); /* floor */
+ }else {
+ /* portrait: move to (llx, lly) */
+ llx = lly = Margin;
+ urx = (int) (llx + scale * JPEG->width + 0.9); /* ceiling */
+ ury = (int) (lly + scale * JPEG->height + 0.9); /* ceiling */
+ }
+
+ time(&t);
+
+ /* produce EPS header comments */
+ fprintf(PSfile, "%%!PS-Adobe-3.0 EPSF-3.0\n");
+ fprintf(PSfile, "%%%%Creator: jpeg2ps %s by Thomas Merz\n", VERSION);
+ fprintf(PSfile, "%%%%Title: %s\n", JPEG->filename);
+ fprintf(PSfile, "%%%%CreationDate: %s", ctime(&t));
+ fprintf(PSfile, "%%%%BoundingBox: %d %d %d %d\n",
+ llx, lly, urx, ury);
+ fprintf(PSfile, "%%%%DocumentData: %s\n",
+ JPEG->mode == BINARY ? "Binary" : "Clean7Bit");
+ fprintf(PSfile, "%%%%LanguageLevel: 2\n");
+ fprintf(PSfile, "%%%%EndComments\n");
+ fprintf(PSfile, "%%%%BeginProlog\n");
+ fprintf(PSfile, "%%%%EndProlog\n");
+ fprintf(PSfile, "%%%%Page: 1 1\n");
+
+ fprintf(PSfile, "/languagelevel where {pop languagelevel 2 lt}");
+ fprintf(PSfile, "{true} ifelse {\n");
+ fprintf(PSfile, " (JPEG file '%s' needs PostScript Level 2!",
+ JPEG->filename);
+ fprintf(PSfile, "\\n) dup print flush\n");
+ fprintf(PSfile, " /Helvetica findfont 20 scalefont setfont ");
+ fprintf(PSfile, "100 100 moveto show showpage stop\n");
+ fprintf(PSfile, "} if\n");
+
+ fprintf(PSfile, "save\n");
+ fprintf(PSfile, "/RawData currentfile ");
+
+ if (JPEG->mode == ASCIIHEX) /* hex representation... */
+ fprintf(PSfile, "/ASCIIHexDecode filter ");
+ else if (JPEG->mode == ASCII85) /* ...or ASCII85 */
+ fprintf(PSfile, "/ASCII85Decode filter ");
+ /* else binary mode: don't use any additional filter! */
+
+ fprintf(PSfile, "def\n");
+
+ fprintf(PSfile, "/Data RawData << ");
+ fprintf(PSfile, ">> /DCTDecode filter def\n");
+
+ /* translate to lower left corner of image */
+ fprintf(PSfile, "%d %d translate\n", (JPEG->landscape ?
+ PageWidth - Margin : Margin), Margin);
+
+ if (JPEG->landscape) /* rotation for landscape */
+ fprintf(PSfile, "90 rotate\n");
+
+ fprintf(PSfile, "%.2f %.2f scale\n", /* scaling */
+ JPEG->width * scale, JPEG->height * scale);
+ fprintf(PSfile, "/Device%s setcolorspace\n",
+ ColorSpaceNames[JPEG->components]);
+ fprintf(PSfile, "{ << /ImageType 1\n");
+ fprintf(PSfile, " /Width %d\n", JPEG->width);
+ fprintf(PSfile, " /Height %d\n", JPEG->height);
+ fprintf(PSfile, " /ImageMatrix [ %d 0 0 %d 0 %d ]\n",
+ JPEG->width, -JPEG->height, JPEG->height);
+ fprintf(PSfile, " /DataSource Data\n");
+ fprintf(PSfile, " /BitsPerComponent %d\n",
+ JPEG->bits_per_component);
+
+ /* workaround for color-inverted CMYK files produced by Adobe Photoshop:
+ * compensate for the color inversion in the PostScript code
+ */
+ if (JPEG->adobe && JPEG->components == 4) {
+ if (!quiet)
+ fprintf(stderr, "Note: Adobe-conforming CMYK file - applying workaround for color inversion.\n");
+ fprintf(PSfile, " /Decode [1 0 1 0 1 0 1 0]\n");
+ }else {
+ fprintf(PSfile, " /Decode [0 1");
+ for (i = 1; i < JPEG->components; i++)
+ fprintf(PSfile," 0 1");
+ fprintf(PSfile, "]\n");
+ }
+
+ fprintf(PSfile, " >> image\n");
+ fprintf(PSfile, " Data closefile\n");
+ fprintf(PSfile, " RawData flushfile\n");
+ fprintf(PSfile, " showpage\n");
+ fprintf(PSfile, " restore\n");
+ fprintf(PSfile, "} exec");
+
+ /* seek to start position of JPEG data */
+ fseek(JPEG->fp, JPEG->startpos, SEEK_SET);
+
+ switch (JPEG->mode) {
+ case BINARY:
+ /* important: ONE blank and NO newline */
+ fprintf(PSfile, " ");
+#ifdef DOS
+ fflush(PSfile); /* up to now we have CR/NL mapping */
+ setmode(fileno(PSfile), O_BINARY); /* continue in binary mode */
+#endif
+ /* copy data without change */
+ while ((n = fread(buffer, 1, sizeof(buffer), JPEG->fp)) != 0)
+ fwrite(buffer, 1, n, PSfile);
+#ifdef DOS
+ fflush(PSfile); /* binary yet */
+ setmode(fileno(PSfile), O_TEXT); /* text mode */
+#endif
+ break;
+
+ case ASCII85:
+ fprintf(PSfile, "\n");
+
+ /* ASCII85 representation of image data */
+ if (ASCII85Encode(JPEG->fp, PSfile)) {
+ fprintf(stderr, "Error: internal problems with ASCII85Encode!\n");
+ exit(1);
+ }
+ break;
+
+ case ASCIIHEX:
+ /* hex representation of image data (useful for buggy dvips) */
+ ASCIIHexEncode(JPEG->fp, PSfile);
+ break;
+ }
+ fprintf(PSfile, "\n%%%%EOF\n");
+}
+
+static
+void usage P0(void) {
+ fprintf(stderr, "jpeg2ps %s: convert JPEG files to PostScript Level 2.\n",
+ VERSION);
+ fprintf(stderr, "(C) Thomas Merz 1994-1999\n\n");
+ fprintf(stderr, "usage: jpeg2ps [options] jpegfile > epsfile\n");
+ fprintf(stderr, "-a auto rotate: produce landscape output if width > height\n");
+ fprintf(stderr, "-b binary mode: output 8 bit data (default: 7 bit with ASCII85)\n");
+ fprintf(stderr, "-h hex mode: output 7 bit data in ASCIIHex encoding\n");
+ fprintf(stderr, "-o <name> output file name\n");
+ fprintf(stderr, "-p <size> page size name. Known names are:\n");
+ fprintf(stderr, " a0, a1, a2, a3, a4, a5, a6, b5, letter, legal, ledger, p11x17\n");
+ fprintf(stderr, "-q quiet mode: suppress all informational messages\n");
+ fprintf(stderr, "-r <dpi> resolution value (dots per inch)\n");
+ fprintf(stderr, " 0 means use value given in file, if any (disables autorotate)\n");
+ exit(1);
+}
+
+int
+main P2(int, argc, char **, argv) {
+ imagedata image;
+ FILE *outfile;
+
+#ifdef MAC
+ int i, bufLength;
+ char *cp, outfilename[512];
+#else
+ int opt, pagesizeindex = -1;
+#endif
+
+ image.filename = NULL;
+ image.mode = ASCII85;
+ image.startpos = 0L;
+ image.landscape= FALSE;
+ image.dpi = DPI_IGNORE;
+ image.adobe = FALSE;
+
+ outfile = stdout;
+
+ if (argc == 1)
+ usage();
+
+#ifndef MAC
+ while ((opt = getopt(argc, argv, "abho:p:qr:")) != -1)
+ switch (opt) {
+ case 'a':
+ autorotate = TRUE;
+ break;
+ case 'b':
+ image.mode = BINARY;
+ break;
+ case 'h':
+ image.mode = ASCIIHEX;
+ break;
+ case 'o':
+ outfile = fopen(optarg, "w");
+ if (outfile == NULL) {
+ fprintf(stderr, "Error: cannot open output file %s.\n", optarg);
+ exit(-2);
+ }
+ break;
+ case 'p':
+ for(pagesizeindex=0; pagesizeindex < PAGESIZELIST; pagesizeindex++)
+ if (!strcmp((const char *) optarg, PageSizes[pagesizeindex].name)) {
+ PageHeight = PageSizes[pagesizeindex].height;
+ PageWidth = PageSizes[pagesizeindex].width;
+ break;
+ }
+ if (pagesizeindex == PAGESIZELIST) { /* page size name not found */
+ fprintf(stderr, "Error: Unknown page size %s.\n", optarg);
+ exit(-3);
+ }
+ break;
+ case 'q':
+ quiet = TRUE;
+ break;
+ case 'r':
+ image.dpi = (float) atof(optarg);
+ if (image.dpi < 0) {
+ fprintf(stderr, "Error: bad resolution value %f !\n", image.dpi);
+ exit(1);
+ }
+ break;
+ case '?':
+ usage();
+ }
+
+ if (pagesizeindex != -1 && ! quiet) /* page size user option given */
+ fprintf(stderr, "Note: Using %s page size.\n",
+ PageSizes[pagesizeindex].name);
+
+ if (optind == argc) /* filename missing */
+ usage();
+ else
+ image.filename = argv[optind];
+
+ if (!image.filename)
+ usage();
+
+ if ((image.fp = fopen(image.filename, READMODE)) == NULL) {
+ fprintf(stderr, "Error: couldn't read JPEG file '%s'!\n",
+ image.filename),
+ exit(1);
+ }
+
+ JPEGtoPS(&image, outfile); /* convert JPEG data */
+ fclose(image.fp);
+ fclose(outfile);
+
+#else /* MAC */
+
+ for (i = 1; i < argc; i++) {
+ image.filename = argv[i];
+
+ strcpy(outfilename, image.filename);
+ bufLength = strlen(outfilename);
+ cp = outfilename;
+ if (bufLength > 3)
+ {
+ cp += (bufLength - 4);
+ /* strip .jpg from terminating string */
+ if (strcmp(cp, ".jpg") == 0 || strcmp(cp, ".JPG") == 0)
+ outfilename[bufLength - 4] = '\0';
+ }
+
+ strcat(outfilename, ".eps");
+
+ if ((image.fp = fopen(image.filename, READMODE)) == NULL) {
+ fprintf(stderr, "Error: couldn't read JPEG file '%s'!\n",
+ image.filename),
+ exit(1);
+ }
+
+ outfile = fopen(outfilename, WRITEMODE);
+
+ JPEGtoPS(&image, outfile); /* convert JPEG data */
+
+ fclose(image.fp);
+ fclose(outfile);
+ }
+
+#endif /* not MAC */
+
+ return 0;
+}
diff --git a/Build/source/utils/jpeg2ps/jpeg2ps.dsp b/Build/source/utils/jpeg2ps/jpeg2ps.dsp
new file mode 100644
index 00000000000..2aeebe907fc
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/jpeg2ps.dsp
@@ -0,0 +1,86 @@
+# Microsoft Developer Studio Project File - Name="jpeg2ps" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=jpeg2ps - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "jpeg2ps.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "jpeg2ps.mak" CFG="jpeg2ps - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "jpeg2ps - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "DOS" /YX /FD /c
+# ADD BASE RSC /l 0x407 /d "NDEBUG"
+# ADD RSC /l 0x407 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# Begin Target
+
+# Name "jpeg2ps - Win32 Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\ASC85EC.C
+# End Source File
+# Begin Source File
+
+SOURCE=.\GETOPT.C
+# End Source File
+# Begin Source File
+
+SOURCE=.\JPEG2PS.C
+# End Source File
+# Begin Source File
+
+SOURCE=.\READJPEG.C
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\PSIMAGE.H
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/Build/source/utils/jpeg2ps/jpeg2ps.pdf b/Build/source/utils/jpeg2ps/jpeg2ps.pdf
new file mode 100644
index 00000000000..7c28519571b
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/jpeg2ps.pdf
@@ -0,0 +1,110 @@
+%PDF-1.1
+%âăĎÓ
+1 0 obj
+[
+/CalRGB << /WhitePoint [ 0.9505 1 1.089 ] /Gamma [ 1.8 1.8 1.8 ] /Matrix [ 0.4497 0.2446 0.0252 0.3163 0.672 0.1412 0.1845 0.0833 0.9227 ] >>
+
+]
+endobj
+2 2 obj
+<<
+/Title (JPEG und PostScript Level 2)
+/Parent 37 0 R
+/Dest [ 199 0 R /Fit ]
+/First 3 1 R
+/Last 12 2 R
+/Count 5
+>>
+endobj
+3 1 obj
+<<
+/Title (JPEG-Marker)
+/Dest [ 11 0 R /Fit ]
+/Parent 2 2 R
+/Next 4 2 R
+>>
+endobj
+4 2 obj
+<<
+/Title (JPEG und TIFF 6.0)
+/Next 5 1 R
+/Prev 3 1 R
+/Parent 2 2 R
+/Dest [ 17 0 R /Fit ]
+>>
+endobj
+5 1 obj
+<<
+/Title (JPEG/PostScript-Wrapper)
+/Next 6 1 R
+/Prev 4 2 R
+/Parent 2 2 R
+/Dest [ 21 0 R /Fit ]
+>>
+endobj
+6 1 obj
+<<
+/Title (Literatur)
+/Dest [ 26 0 R /Fit ]
+/Next 12 2 R
+/Prev 5 1 R
+/Parent 2 2 R
+>>
+endobj
+7 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F6
+/Encoding /MacRomanEncoding
+/BaseFont /Times-Roman
+>>
+endobj
+8 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F7
+/Encoding 34 0 R
+/BaseFont /Symbol
+>>
+endobj
+9 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F9
+/Encoding /MacRomanEncoding
+/BaseFont /Helvetica-Bold
+>>
+endobj
+10 0 obj
+<<
+/Type /Pages
+/Kids [ 199 0 R 11 0 R 17 0 R 21 0 R 26 0 R 30 0 R ]
+/Count 6
+/MediaBox [ 0 0 595 842 ]
+>>
+endobj
+11 0 obj
+<<
+/Type /Page
+/Parent 10 0 R
+/Resources 14 0 R
+/Contents 13 0 R
+/Thumb 117 1 R
+/Annots 43 1 R
+>>
+endobj
+12 2 obj
+<<
+/Title (JPEG-Wrapper, C-Source)
+/Dest [ 26 0 R /FitH 845 ]
+/Prev 6 1 R
+/Parent 2 2 R
+>>
+endobj
+13 0 obj
+<< /Length 7962 /Filter /LZWDecode >>
+stream
+€A ĄˆĐ@8Q´(Z8‚ˆFX\@nŒDxĚ \ No newline at end of file
diff --git a/Build/source/utils/jpeg2ps/jpeg2ps.txt b/Build/source/utils/jpeg2ps/jpeg2ps.txt
new file mode 100644
index 00000000000..c59c2523158
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/jpeg2ps.txt
@@ -0,0 +1,338 @@
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+jpeg2ps - convert JPEG compressed images to PostScript Level 2
+
+jpeg2ps is available from http://www.ifconnection.de/~tm
+and many other sites, notably CTAN mirrors.
+
+Copyright (C) 1994-99 Thomas Merz (tm@muc.de)
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+Purpose of jpeg2ps
+==================
+jpeg2ps converts JPEG files to PostScript Level 2 or 3 EPS. In fact, jpeg2ps
+is not really a converter but a "wrapper": it reads the image parameters
+(width, height, number of color components) in a JPEG file, writes the
+according EPS header and then copies the compressed JPEG data to the output
+file. Decompression is done by the PostScript interpreter (only PostScript
+Level 2 and 3 interpreters support JPEG compression and decompression).
+If you have a slow communication channel and a fast printer, sending
+compressed image data is a big win.
+
+
+Change History
+==============
+
+V1.8 (July 28, 1999)
+ - Added -q option for suppressing all non-error messages.
+ - Don't use the supplied getopt on Unix by default, but still
+ include the source module in the distribution (and use it on
+ DOS/Windows)
+ - Added -p option for setting the page size on the command line.
+ If no such option is supplied, A4 or letter is used as default,
+ according to a compile time option.
+ - Renamed makefile.gcc to the more common Makefile.
+ - Added casts to get rid of some warning messages.
+ - Added Mac support for use with DropUNIX. This required opening
+ the files in binary mode, properly initializing some statics,
+ and replacing the getopt loop with a plain argc loop (for now).
+
+V1.7 (April 9, 1999)
+ - Fixed an omission in the Makefile (makefile.gcc)
+ - Removed the OS2 #ifdefs and made the conditional code identical to the
+ DOS code. Therefore, using -DDOS should also work on OS/2.
+
+V1.6 (March 29, 1999)
+ - Changed all references to my old Web site to the current address
+ http://www.ifconnection.de/~tm
+ - Added support for OS/2, provided by
+ Stefan A. Deutscher (sad@utk.edu / stefand@ibm.net)
+ - Added support for VMS, provided by
+ Rolf Niepraschk (niepraschk@ptb.de)
+ - Changed the get_2bytes() macro in readjpeg.c to a static function
+ in order to avoid portability issues. Since the evaluation order
+ in the formely used macro version isn't guaranteed, the result
+ was garbled on some platforms, notably with the Metrowerks C
+ compilers for BeOS and Macintosh.
+ - Changed the auto rotate feature in order to produce "clean" (unrotated)
+ EPS files. The old feature of automatically rotating images to
+ landscape mode if width > height can be reactivated with the new
+ command line option "-a" (auto rotate)
+ - Changed the ASCII85 output routine in order to avoid two consecutive
+ percent characters at the beginning of a line. Although legal PostScript,
+ this may cause trouble with some post-processing programs, notably
+ when including jpeg2ps output in TeX files. This should fix the
+ problems dvips users sometimes encountered when using jpeg2ps.
+ The comment in this file (jpeg2ps.txt) regarding problems with
+ TeX PostScript drivers has been deleted.
+
+V1.5 (Dec. 12, 1996)
+ - Included ASCIIHex encoding again (the code was already there,
+ only command line option added). This is primarily useful as as
+ workaround for a brain-damaged dvips "feature" (see below).
+ - Added note on dvips and tgif in jpeg2ps.txt.
+ - Removed jpeg2pdf again. Its functionality will be contained in the
+ forthcoming PDFlib C library and some library client programs.
+
+V1.4 (Aug. 19, 1996)
+ - included getopt.c in distribution, changed option handling
+ - prepared readjpeg.c for use with jpeg2pdf program (accept baseline only)
+ - included jpeg2pdf in the distribution
+
+V1.3 (Jan. 31, 1996)
+ - Fixed ASCII85 encoding bug. In rare cases ~ and > could get
+ separated.
+
+V1.2 (Jan. 25, 1996)
+ - Fixed "unsigned" bug when reading JFIF density marker.
+
+V1.1 (Jan. 22, 1996) Several enhancements:
+ - invert colors of Adobe Photoshop CMYK files
+ - interpret JFIF resolution ("density") markers
+ - implemented -r switch for specifying resolution
+ - accept compression markers other than SOF0 and SOF1 (this won't
+ be useful for many people, and didn't have any testing).
+
+V1.0 (Jan. 9, 1996) Re-release of formerly released Usenet version.
+
+
+Building JPEG2PS
+================
+jpeg2ps is coded in rather simple-minded ANSI C. It should compile cleanly
+on many systems. For old K&R compilers, include the compiler flag -DKNR in
+the makefile to disable ANSI prototypes.
+
+The jpeg2ps distribution is available in .zip and .tar.gz format.
+jpeg2ps-x.x.zip is intended for MS-DOS (real or DOS box in Windows)
+and also includes an executable. Source code is identical in both
+jpeg2ps-x.x.zip and jpeg2ps-x.x.tar.gz, the only exception being different
+line end conventions.
+
+General compilation options
+---------------------------
+-DA4 makes jpeg2ps use A4 as default paper size. If -DA4 is not
+given, letter format will be used instead. Note that the paper
+size can always be specified at the command line.
+
+Unix
+----
+jpeg2ps should compile out of the box on most Unix systems,
+probably after a little Makefile tweaking. The distributed
+Makefile is set up for GCC on Linux.
+
+DOS
+---
+Use -DDOS to compile jpeg2ps on DOSish systems. The distributed
+source builds fine with MS Visual C++ 6.0. A project file for
+this environment is included in the distribution.
+
+OS/2
+----
+OS/2 support was provided by Stefan A. Deutscher (sad@utk.edu / stefand@ibm.net)
+and is included in the distribution "as is", i.e., I'm unable to assist in
+any OS/2-related issues. The following is from Stefan's description for OS/2:
+
+>The executable was made from the unmodified unix sources with gcc / emx09c +
+>emxfix2 applied. To run it you need the emx runtime system, which you
+>find as emxrt.zip, or on ftp-os2.cdrom.com or ftp-os2.nmsu.edu or ftp.leo.org.
+>Newer versions than emx09c+ef2 should be fine. I tested this only on Warp 4,
+>and there it works.
+
+Mac
+---
+jpeg2ps can be built on the Mac using a facility called DropUNIX. This is
+a wrapper for conventional command-line driven Unix programs which gives
+some sort of drag-and-drop support. However, command line options are
+not available. For this reason, jpeg2ps always generates ASCII85 output
+if built on the Mac.
+
+In order to build jpeg2ps on the Mac, you will need DropUNIX from
+http://www.zenspider.com or some mirror, such as
+http://omlc.ogi.edu/software/tex_convert
+
+and set the C preprocessor define -DMAC. Since the MetroWerks compiler
+has a somewhat kludgey way to set preprocessor options, the file
+prefix-mac.pch is supplied which should be added to the project as
+a precompiled header (see MW docs).
+
+The idea for the Mac port and the DropUNIX support were provided by
+Ujwal Sathyam (setlur@bigfoot.com).
+
+Although I successfully built jpeg2ps with the MetroWerks compiler,
+Mac support is still somewhat experimental. The required build
+files are not included in the distribution. (No, please don't ask me for
+an executable).
+
+Note that for unknown reason the Mac version currently supports only
+conversion of single files. Although it seems to work with multiple
+files too, the output generated for the second and subsequent files
+will be rubbish.
+
+
+VMS
+---
+A VMS build file was provided by Rolf Niepraschk (niepraschk@ptb.de). It isn't
+supported by the author of this software. Use the supplied file "descrip.mms"
+as a starting point for building jpeg2ps with the VMS build tool mms.
+
+
+Usage Details
+=============
+jpeg2ps [options] file.jpg > file.eps
+
+-a auto rotate feature
+-b binary mode
+-h hex mode (ASCIIHex encoding)
+-o name output file name (as an alternative to output redirection)
+-p size page size name. Known names are:
+ a0, a1, a2, a3, a4, a5, a6, b5, letter, legal, ledger, p11x17
+-q quiet mode: suppress all informational messages
+-r dpi resolution value (0 = read from file if possible)
+
+jpeg2ps reads a JPEG file (*not* stdin) and writes a DSC-compliant EPS
+file containing the compressed JPEG data in PostScript format to stdout.
+The produced EPS files contain the necessary DSC comments including
+BoundingBox, so they may be imported in page layout applications. However,
+they do not contain preview images, so you will only see a gray box on screen.
+
+If the auto rotate feature is activated with the -a option, images with
+width > height are automatically rotated to landscape mode. Don't use this
+option if you simply want to generate EPS files for inclusion in your
+documents. Note: prior to version 1.6, jpeg2ps always "autorotated" images
+with width > height which was especially bad for TeX users. I hope this
+change helps the TeX community in better using jpeg2ps!
+
+jpeg2ps performs some sanity checks with the JPEG data. It detects several
+kinds of corrupt input data, but it is not absolutely foolproof. One special
+feature is that you can feed Macintosh JPEG files (PICT-JPEG) to jpeg2ps.
+These normally have several hundred bytes of additional stuff before the JPEG
+data. This PICT rubbish is simply ignored by jpeg2ps.
+
+
+Output modes
+============
+By default, jpeg2ps sends the image data in ASCII85 encoded form which is
+suitable for any communication channel (serial, parallel or whatever). If
+you are *sure* that your channel is truly 8-bit clean, you can force 8-bit
+data with the -b option. Note that this normally does not apply to 8-bit
+serial or even parallel channels since some control characters are reserved
+for the communications protocol. You can use binary data e.g.:
+
+- with some networked printers
+- with direct-access PostScript interpreters, e.g. Ghostscript
+- serial or parallel channels using Binary Control Protocol (BCP).
+
+Using the -h option, jpeg2ps generates 7-bit clean data by using
+ASCIIHex encoding instead of the more space-efficient ASCII85 encoding.
+This is only useful for specialized applications, e.g. for debugging,
+since jpeg2ps requires PostScript Level 2 anyway, and ASCII85 is
+supported in any Level 2 interpreter.
+
+
+Scaling and resolution
+======================
+Concerning the size of the printed image, you have three options:
+
+Default behaviour:
+By default, doesn't change the image size and rotation.
+With the -a option, jpeg2ps tries to fit the image on the page, rotating
+it if necessary (image width exceeds image height)
+The image is scaled in a way to use at least one full edge of the paper.
+A 20 pt margin is subtracted on each side. "Page" means A4 size if compiled
+with "-DA4", letter size otherwise. The -p option may be used to select
+other page sizes.
+
+Using resolution value from the file:
+The option "-r 0" instructs jpeg2ps to look for a JFIF density/resolution
+marker and use that value. Automatic scaling and rotation are disabled.
+However, if no resolution information is found in the file, jpeg2ps
+applies the default algorithm described above.
+
+Explicitly setting the resolution:
+Using "-r <dpi>" you can force jpeg2ps to use a certain dpi value.
+Since automatic actions are also disabled in this case, you are
+responsible for choosing a reasonable resolution value. For example,
+you can print a 300 dpi image half-sized by supplying -r 600.
+
+
+Messages
+========
+jpeg2ps issues three kinds of messages:
+
+Notes: have informational character
+
+Warnings: a potential problem with the file was recognized, processing
+ continues.
+
+Errors: Either a severe problem within the JPEG file was found or the
+ file explores JPEG features not compatible with PostScript Level 2.
+
+Note that there are some JPEG producers which do not exactly conform to the
+specification and that the JPEG spec itself does not cover every aspect of
+the file format. You are on the safe side if you demand JFIF files which are
+happily accepted by jpeg2ps. (For further information see the JPEG FAQ
+by Tom Lane.)
+
+
+Adobe Photoshop CMYK files
+==========================
+This is what the Independent JPEG Group has to say about Photoshop
+CMYK files (quoted from libjpeg.doc, part of the IJG JPEG library):
+
+> CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG
+> files: 0 represents 100% ink coverage, rather than 0% ink as you'd expect.
+> This is arguably a bug in Photoshop, but if you need to work with Photoshop
+> CMYK files, you will have to deal with it in your application. We cannot
+> "fix" this in the library by inverting the data during the CMYK<=>YCCK
+> transform, because that would break other applications, notably Ghostscript.
+> Photoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK
+> data in the same inverted-YCCK representation used in bare JPEG files, but
+> the surrounding PostScript code performs an inversion using the PS image
+> operator. I am told that Photoshop 3.0 will write uninverted YCCK in
+> EPS/JPEG files, and will omit the PS-level inversion. (But the data
+> polarity used in bare JPEG files will not change in 3.0.) In either case,
+> the JPEG library must not invert the data itself, or else Ghostscript would
+> read these EPS files incorrectly.
+
+Accordingly, jpeg2ps tries to detect such files (by looking for Adobes
+APP marker) and inverts the colors in the case of 4-component images.
+This inversion takes place in the PostScript instructions, not by
+changing the actual image data.
+
+
+Further Information
+===================
+
+If you like to know more about the inner workings of jpeg2ps, the JPEG
+standard and its integration in PostScript Level 2, the JFIF file format,
+JPEG/TIFF *and* if you can read German, you may want to check out
+my article in a German computer magazine:
+
+"Gut verpackt - Drucken von JPEG-Bildern mit PostScript Level 2"
+c't, Magazin fuer Computertechnik, Heise Verlag Hannover, 6/94, p.236 ff.
+
+This article is also available in PDF format from my WWW page:
+http://www.ifconnection.de/~tm
+
+
+Related Software
+================
+
+Note that there is a related PostScript program called "viewjpeg.ps" which
+is part of the Ghostscript distribution. viewjpeg.ps operates similarly to
+jpeg2ps, but the PostScript interpreter does the "wrapping" of JPEG data
+itself. With viewjpeg.ps you can e.g. view JPEG files directly within
+GhostScript or another interpreter with access to the file system.
+Ghostscript can be found at http://www.cs.wisc.edu/~ghost
+
+
+Disclaimer
+==========
+This software is free. You are granted the right to use and copy it. This
+software may not be sold or bundled with any commercial package without
+express written permission of the author.
+
+The author accepts no responsibility for damages resulting from the use of
+this software and makes no warranty, either express or implied, including but
+not limited to, any implied warranty of merchantability or fitness for a
+particular purpose. This software is provided as is, and you assume all risks
+when using it.
diff --git a/Build/source/utils/jpeg2ps/psimage.h b/Build/source/utils/jpeg2ps/psimage.h
new file mode 100644
index 00000000000..a8fe7a506b1
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/psimage.h
@@ -0,0 +1,48 @@
+/* -------------------------- psimage.h ------------------------- */
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifdef min
+#undef min
+#endif
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
+typedef int BOOL;
+
+/* Simple prototype macros for K&R and ANSI-C */
+
+#ifdef KNR
+#define P0(v) ()
+#define P1(t1, p1) (p1) t1 p1
+#define P2(t1, p1, t2, p2) (p1, p2) t1 p1; t2 p2
+#define P3(t1, p1, t2, p2, t3, p3) (p1, p2, p3) t1 p1; t2 p2; t3 p3
+#else
+#define P0(v) (void)
+#define P1(t1, p1) (t1 p1)
+#define P2(t1, p1, t2, p2) (t1 p1, t2 p2)
+#define P3(t1, p1, t2, p2, t3, p3) (t1 p1, t2 p2, t3 p3)
+#endif
+
+/* data output mode: binary, ascii85, hex-ascii */
+typedef enum { BINARY, ASCII85, ASCIIHEX } DATAMODE;
+
+typedef struct {
+ FILE *fp; /* file pointer for jpeg file */
+ char *filename; /* name of image file */
+ int width; /* pixels per line */
+ int height; /* rows */
+ int components; /* number of color components */
+ int bits_per_component; /* bits per color component */
+ float dpi; /* image resolution in dots per inch */
+ DATAMODE mode; /* output mode: 8bit, ascii, ascii85 */
+ long startpos; /* offset to jpeg data */
+ BOOL landscape; /* rotate image to landscape mode? */
+ BOOL adobe; /* image includes Adobe comment marker */
+} imagedata;
+
+#define DPI_IGNORE -1.0 /* dummy value for imagedata.dpi */
+#define DPI_USE_FILE 0.0 /* dummy value for imagedata.dpi */
diff --git a/Build/source/utils/jpeg2ps/readjpeg.c b/Build/source/utils/jpeg2ps/readjpeg.c
new file mode 100644
index 00000000000..afa49dcf6be
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/readjpeg.c
@@ -0,0 +1,323 @@
+/* ------------------------- readjpeg.c ------------------------- */
+#include <stdio.h>
+#include <string.h>
+
+#if !defined(DOS) && !defined(WIN32)
+#include <unistd.h>
+#endif
+
+#include "psimage.h"
+
+/* The following enum is stolen from the IJG JPEG library
+ * Comments added by tm
+ * This table contains far too many names since jpeg2ps
+ * is rather simple-minded about markers
+ */
+
+extern BOOL quiet;
+
+typedef enum { /* JPEG marker codes */
+ M_SOF0 = 0xc0, /* baseline DCT */
+ M_SOF1 = 0xc1, /* extended sequential DCT */
+ M_SOF2 = 0xc2, /* progressive DCT */
+ M_SOF3 = 0xc3, /* lossless (sequential) */
+
+ M_SOF5 = 0xc5, /* differential sequential DCT */
+ M_SOF6 = 0xc6, /* differential progressive DCT */
+ M_SOF7 = 0xc7, /* differential lossless */
+
+ M_JPG = 0xc8, /* JPEG extensions */
+ M_SOF9 = 0xc9, /* extended sequential DCT */
+ M_SOF10 = 0xca, /* progressive DCT */
+ M_SOF11 = 0xcb, /* lossless (sequential) */
+
+ M_SOF13 = 0xcd, /* differential sequential DCT */
+ M_SOF14 = 0xce, /* differential progressive DCT */
+ M_SOF15 = 0xcf, /* differential lossless */
+
+ M_DHT = 0xc4, /* define Huffman tables */
+
+ M_DAC = 0xcc, /* define arithmetic conditioning table */
+
+ M_RST0 = 0xd0, /* restart */
+ M_RST1 = 0xd1, /* restart */
+ M_RST2 = 0xd2, /* restart */
+ M_RST3 = 0xd3, /* restart */
+ M_RST4 = 0xd4, /* restart */
+ M_RST5 = 0xd5, /* restart */
+ M_RST6 = 0xd6, /* restart */
+ M_RST7 = 0xd7, /* restart */
+
+ M_SOI = 0xd8, /* start of image */
+ M_EOI = 0xd9, /* end of image */
+ M_SOS = 0xda, /* start of scan */
+ M_DQT = 0xdb, /* define quantization tables */
+ M_DNL = 0xdc, /* define number of lines */
+ M_DRI = 0xdd, /* define restart interval */
+ M_DHP = 0xde, /* define hierarchical progression */
+ M_EXP = 0xdf, /* expand reference image(s) */
+
+ M_APP0 = 0xe0, /* application marker, used for JFIF */
+ M_APP1 = 0xe1, /* application marker */
+ M_APP2 = 0xe2, /* application marker */
+ M_APP3 = 0xe3, /* application marker */
+ M_APP4 = 0xe4, /* application marker */
+ M_APP5 = 0xe5, /* application marker */
+ M_APP6 = 0xe6, /* application marker */
+ M_APP7 = 0xe7, /* application marker */
+ M_APP8 = 0xe8, /* application marker */
+ M_APP9 = 0xe9, /* application marker */
+ M_APP10 = 0xea, /* application marker */
+ M_APP11 = 0xeb, /* application marker */
+ M_APP12 = 0xec, /* application marker */
+ M_APP13 = 0xed, /* application marker */
+ M_APP14 = 0xee, /* application marker, used by Adobe */
+ M_APP15 = 0xef, /* application marker */
+
+ M_JPG0 = 0xf0, /* reserved for JPEG extensions */
+ M_JPG13 = 0xfd, /* reserved for JPEG extensions */
+ M_COM = 0xfe, /* comment */
+
+ M_TEM = 0x01, /* temporary use */
+
+ M_ERROR = 0x100 /* dummy marker, internal use only */
+} JPEG_MARKER;
+
+/*
+ * The following routine used to be a macro in its first incarnation:
+ * #define get_2bytes(fp) ((unsigned int) (getc(fp) << 8) + getc(fp))
+ * However, this is bad programming since C doesn't guarantee
+ * the evaluation order of the getc() calls! As suggested by
+ * Murphy's law, there are indeed compilers which produce the wrong
+ * order of the getc() calls, e.g. the Metrowerks C compilers for BeOS
+ * and Macintosh.
+ * Since there are only few calls we don't care about the performance
+ * penalty and use a simplistic C function.
+ */
+
+/* read two byte parameter, MSB first */
+static unsigned int
+get_2bytes(FILE *fp)
+{
+ unsigned int val;
+ val = getc(fp) << 8;
+ val += getc(fp);
+ return val;
+}
+
+static int
+next_marker P1(FILE *, fp)
+{ /* look for next JPEG Marker */
+ int c, nbytes = 0;
+
+ if (feof(fp))
+ return M_ERROR; /* dummy marker */
+
+ do {
+ do { /* skip to FF */
+ nbytes++;
+ c = getc(fp);
+ } while (c != 0xFF);
+ do { /* skip repeated FFs */
+ c = getc(fp);
+ } while (c == 0xFF);
+ } while (c == 0); /* repeat if FF/00 */
+
+ return c;
+}
+
+/* analyze JPEG marker */
+BOOL AnalyzeJPEG P1(imagedata *, image) {
+ int b, c, unit;
+ unsigned long i, length = 0;
+#define APP_MAX 255
+ unsigned char appstring[APP_MAX];
+ BOOL SOF_done = FALSE;
+
+ /* Tommy's special trick for Macintosh JPEGs: simply skip some */
+ /* hundred bytes at the beginning of the file! */
+ do {
+ do { /* skip if not FF */
+ c = getc(image->fp);
+ } while (!feof(image->fp) && c != 0xFF);
+
+ do { /* skip repeated FFs */
+ c = getc(image->fp);
+ } while (c == 0xFF);
+
+ /* remember start position */
+ if ((image->startpos = ftell(image->fp)) < 0L) {
+ fprintf(stderr, "Error: internal error in ftell()!\n");
+ return FALSE;
+ }
+ image->startpos -= 2; /* subtract marker length */
+
+ if (c == M_SOI) {
+ fseek(image->fp, image->startpos, SEEK_SET);
+ break;
+ }
+ } while (!feof(image->fp));
+
+ if (feof(image->fp)) {
+ fprintf(stderr, "Error: SOI marker not found!\n");
+ return FALSE;
+ }
+
+ if (image->startpos > 0L && !quiet) {
+ fprintf(stderr, "Note: skipped %ld bytes ", image->startpos);
+ fprintf(stderr, "Probably Macintosh JPEG file?\n");
+ }
+
+ /* process JPEG markers */
+ while (!SOF_done && (c = next_marker(image->fp)) != M_EOI) {
+ switch (c) {
+ case M_ERROR:
+ fprintf(stderr, "Error: unexpected end of JPEG file!\n");
+ return FALSE;
+
+ /* The following are not officially supported in PostScript level 2 */
+ case M_SOF2:
+ case M_SOF3:
+ case M_SOF5:
+ case M_SOF6:
+ case M_SOF7:
+ case M_SOF9:
+ case M_SOF10:
+ case M_SOF11:
+ case M_SOF13:
+ case M_SOF14:
+ case M_SOF15:
+ fprintf(stderr,
+ "Warning: JPEG file uses compression method %X - proceeding anyway.\n",
+ c);
+ fprintf(stderr,
+ "PostScript output does not work on all PS interpreters!\n");
+ /* FALLTHROUGH */
+
+ case M_SOF0:
+ case M_SOF1:
+ length = get_2bytes(image->fp); /* read segment length */
+
+ image->bits_per_component = getc(image->fp);
+ image->height = get_2bytes(image->fp);
+ image->width = get_2bytes(image->fp);
+ image->components = getc(image->fp);
+
+ SOF_done = TRUE;
+ break;
+
+ case M_APP0: /* check for JFIF marker with resolution */
+ length = get_2bytes(image->fp);
+
+ for (i = 0; i < length-2; i++) { /* get contents of marker */
+ b = getc(image->fp);
+ if (i < APP_MAX) /* store marker in appstring */
+ appstring[i] = b;
+ }
+
+ /* Check for JFIF application marker and read density values
+ * per JFIF spec version 1.02.
+ * We only check X resolution, assuming X and Y resolution are equal.
+ * Use values only if resolution not preset by user or to be ignored.
+ */
+
+#define ASPECT_RATIO 0 /* JFIF unit byte: aspect ratio only */
+#define DOTS_PER_INCH 1 /* JFIF unit byte: dots per inch */
+#define DOTS_PER_CM 2 /* JFIF unit byte: dots per cm */
+
+ if (image->dpi == DPI_USE_FILE && length >= 14 &&
+ !strncmp((const char *)appstring, "JFIF", 4)) {
+ unit = appstring[7]; /* resolution unit */
+ /* resolution value */
+ image->dpi = (float) ((appstring[8]<<8) + appstring[9]);
+
+ if (image->dpi == 0.0) {
+ image->dpi = DPI_USE_FILE;
+ break;
+ }
+
+ switch (unit) {
+ /* tell the caller we didn't find a resolution value */
+ case ASPECT_RATIO:
+ image->dpi = DPI_USE_FILE;
+ break;
+
+ case DOTS_PER_INCH:
+ break;
+
+ case DOTS_PER_CM:
+ image->dpi *= (float) 2.54;
+ break;
+
+ default: /* unknown ==> ignore */
+ fprintf(stderr,
+ "Warning: JPEG file contains unknown JFIF resolution unit - ignored!\n");
+ image->dpi = DPI_IGNORE;
+ break;
+ }
+ }
+ break;
+
+ case M_APP14: /* check for Adobe marker */
+ length = get_2bytes(image->fp);
+
+ for (i = 0; i < length-2; i++) { /* get contents of marker */
+ b = getc(image->fp);
+ if (i < APP_MAX) /* store marker in appstring */
+ appstring[i] = b;
+ }
+
+ /* Check for Adobe application marker. It is known (per Adobe's TN5116)
+ * to contain the string "Adobe" at the start of the APP14 marker.
+ */
+ if (length >= 12 && !strncmp((const char *) appstring, "Adobe", 5))
+ image->adobe = TRUE; /* set Adobe flag */
+
+ break;
+
+ case M_SOI: /* ignore markers without parameters */
+ case M_EOI:
+ case M_TEM:
+ case M_RST0:
+ case M_RST1:
+ case M_RST2:
+ case M_RST3:
+ case M_RST4:
+ case M_RST5:
+ case M_RST6:
+ case M_RST7:
+ break;
+
+ default: /* skip variable length markers */
+ length = get_2bytes(image->fp);
+ for (length -= 2; length > 0; length--)
+ (void) getc(image->fp);
+ break;
+ }
+ }
+
+ /* do some sanity checks with the parameters */
+ if (image->height <= 0 || image->width <= 0 || image->components <= 0) {
+ fprintf(stderr, "Error: DNL marker not supported in PostScript Level 2!\n");
+ return FALSE;
+ }
+
+ /* some broken JPEG files have this but they print anyway... */
+ if (length != (unsigned int) (image->components * 3 + 8))
+ fprintf(stderr, "Warning: SOF marker has incorrect length - ignored!\n");
+
+ if (image->bits_per_component != 8) {
+ fprintf(stderr, "Error: %d bits per color component ",
+ image->bits_per_component);
+ fprintf(stderr, "not supported in PostScript level 2!\n");
+ return FALSE;
+ }
+
+ if (image->components!=1 && image->components!=3 && image->components!=4) {
+ fprintf(stderr, "Error: unknown color space (%d components)!\n",
+ image->components);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/Build/source/utils/jpeg2ps/win32.mak b/Build/source/utils/jpeg2ps/win32.mak
new file mode 100644
index 00000000000..c37af29b923
--- /dev/null
+++ b/Build/source/utils/jpeg2ps/win32.mak
@@ -0,0 +1,46 @@
+################################################################################
+#
+# Makefile : Jpeg2ps
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <01/11/20 13:37:41 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+DEFS = $(DEFS) -DA4 -I.
+
+programs = $(objdir)\jpeg2ps.exe
+
+objects = $(objdir)\jpeg2ps.obj $(objdir)\readjpeg.obj \
+ $(objdir)\asc85ec.obj
+
+default: all
+
+all: $(objdir) $(programs)
+
+$(objdir)\jpeg2ps.exe: $(objects) $(gnuw32lib)
+ $(link) $(**) $(conlibs)
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+install:: install-exec
+
+!include <msvc/clean.mak>
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End:
diff --git a/Build/source/utils/lcdf-typetools/7t.enc b/Build/source/utils/lcdf-typetools/7t.enc
new file mode 100644
index 00000000000..727f29e5f8c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/7t.enc
@@ -0,0 +1,65 @@
+% A version of the 7t/OT1 encoding, with useful UNICODING comments,
+% intended for use with otftotfm.
+% We do not remove kerns between digits and other characters; a user who wants
+% tabular digits should select the OpenType "tnum" feature.
+% We also do not remove kerns between space and other characters; space is our
+% boundary character.
+
+/LCDF7TEncoding [
+%00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon
+ /Phi /Psi /Omega /ff /fi /fl /ffi /ffl
+%10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+%20
+ /space /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+%30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+%40
+ /at /A /B /C /D /E /F /G
+ /H /I /J /K /L /M /N /O
+%50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+%60
+ /quoteleft /a /b /c /d /e /f /g
+ /h /i /j /k /l /m /n /o
+%70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis
+%80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%A0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%B0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%C0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%D0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%E0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%F0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ % LIGKERN question quoteleft =: questiondown ;
+ % LIGKERN exclam quoteleft =: exclamdown ;
+ % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+ % LIGKERN quoteleft quoteleft =: quotedblleft ;
+ % LIGKERN quoteright quoteright =: quotedblright ;
+ % LIGKERN || = 32 ;
+ % UNICODING Delta =: Deltagreek Delta ; Omega =: Omegagreek Omega ;
+ % UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
+] def
diff --git a/Build/source/utils/lcdf-typetools/COPYING b/Build/source/utils/lcdf-typetools/COPYING
new file mode 100644
index 00000000000..67572846722
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/COPYING
@@ -0,0 +1,416 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+
+
+
+
+
+
+
+
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+
+
+
+
+
+
+
+
+
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/utils/lcdf-typetools/ChangeLog b/Build/source/utils/lcdf-typetools/ChangeLog
new file mode 100644
index 00000000000..2140f3c0750
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/ChangeLog
@@ -0,0 +1,2420 @@
+2005-02-07 Monday 11:35 kohler
+
+ * NEWS (1.91), configure.in (1.105), otftotfm/otftotfm.cc (1.97):
+ add Achim Blumensaths --math-spacing and --space-factor options
+
+2005-02-05 Saturday 11:22 kohler
+
+ * otftotfm/: automatic.cc (1.41), otftotfm.1 (1.111), otftotfm.cc
+ (1.96), util.cc (1.18), util.hh (1.15): Christian Uebber reported
+ surprising behavior; document --force and add --verbose info to
+ reduce the surprise
+
+2005-02-04 Friday 20:55 kohler
+
+ * otftotfm/automatic.cc (1.40): call updmap twice, since updmap
+ --enable can exit early and we dont want it to
+
+2005-02-04 Friday 01:32 kohler
+
+ * NEWS (1.90): NEWS update
+
+2005-02-04 Friday 01:32 kohler
+
+ * otftotfm/glyphfilter.cc (1.6): minor bug
+
+2005-02-04 Friday 01:32 kohler
+
+ * otftotfm/: otftotfm.cc (1.95), otftotfm.1 (1.110): remove debug
+ output, accept --subs-filter/--alternates-filter
+
+2005-02-04 Friday 01:06 kohler
+
+ * NEWS (1.89), otftotfm/util.cc (1.17): nits: on dos/win, dont
+ quote
+
+2005-02-03 Thursday 20:28 kohler
+
+ * NEWS (1.88), README (1.68), cfftot1/cfftot1.1 (1.64),
+ mmafm/mmafm.1 (1.82), mmpfb/mmpfb.1 (1.82),
+ t1dotlessj/t1dotlessj.1 (1.28), t1lint/t1lint.1 (1.42),
+ t1reencode/t1reencode.1 (1.4), t1testpage/t1testpage.1 (1.40):
+ versionize
+
+2005-02-03 Thursday 20:28 kohler
+
+ * otftotfm/: automatic.cc (1.39), otftotfm.1 (1.109), otftotfm.cc
+ (1.94): nits
+
+2005-02-03 Thursday 20:27 kohler
+
+ * otftotfm/glyphfilter.cc (1.5): fix glyph filter unicode ranges
+
+2005-02-03 Thursday 20:27 kohler
+
+ * otfinfo/: otfinfo.1 (1.39), otfinfo.cc (1.11): add
+ --query-glyphs/-g option
+
+2005-02-03 Thursday 19:06 kohler
+
+ * NEWS (1.87), configure.in (1.104), otftotfm/automatic.cc (1.38),
+ otftotfm/otftotfm.1 (1.108), otftotfm/otftotfm.cc (1.93),
+ otftotfm/otftotfm.hh (1.2), otftotfm/util.hh (1.14): automatic
+ mode does updmap out of the box
+
+2005-02-03 Thursday 11:14 kohler
+
+ * otftotfm/: automatic.cc (1.37), otftotfm.cc (1.92), util.cc
+ (1.16), util.hh (1.13): protect filenames passed to system(),
+ spurred by Achim Blumensath
+
+2005-02-03 Thursday 10:41 kohler
+
+ * otftotfm/: automatic.cc (1.36), otftotfm.1 (1.107): updates for
+ $TEXMFVAR
+
+2005-01-26 Wednesday 09:34 kohler
+
+ * NEWS (1.86), README (1.67), configure.in (1.103),
+ cfftot1/cfftot1.1 (1.63), mmafm/mmafm.1 (1.81), mmpfb/mmpfb.1
+ (1.81), otfinfo/otfinfo.1 (1.38), otftotfm/otftotfm.1 (1.106),
+ otftotfm/otftotfm.cc (1.91), t1dotlessj/t1dotlessj.1 (1.27),
+ t1lint/t1lint.1 (1.41), t1reencode/t1reencode.1 (1.3),
+ t1testpage/t1testpage.1 (1.39): fix bug that was causing infinite
+ loops: an obvious || vs. && error, hidden by an #ifdef
+
+2005-01-26 Wednesday 09:00 kohler
+
+ * configure.in (1.102), otf.com (1.1): otf.com
+
+2005-01-04 Tuesday 19:55 kohler
+
+ * README (1.66): add t1reencode to README
+
+2005-01-04 Tuesday 19:47 kohler
+
+ * NEWS (1.85), README (1.65), configure.in (1.101),
+ cfftot1/cfftot1.1 (1.62), cfftot1/cfftot1.cc (1.22),
+ mmafm/main.cc (1.41), mmafm/mmafm.1 (1.80), mmpfb/main.cc (1.44),
+ mmpfb/mmpfb.1 (1.80), otfinfo/otfinfo.1 (1.37),
+ otfinfo/otfinfo.cc (1.10), otftotfm/otftotfm.1 (1.105),
+ otftotfm/otftotfm.cc (1.90), t1dotlessj/t1dotlessj.1 (1.26),
+ t1dotlessj/t1dotlessj.cc (1.7), t1lint/t1lint.1 (1.40),
+ t1lint/t1lint.cc (1.17), t1reencode/t1reencode.1 (1.2),
+ t1reencode/t1reencode.cc (1.3), t1testpage/t1testpage.1 (1.38),
+ t1testpage/t1testpage.cc (1.18): to 2.17
+
+2005-01-04 Tuesday 18:40 kohler
+
+ * otftotfm/otftotfm.1 (1.104), otftotfm/otftotfm.cc (1.89),
+ t1reencode/Makefile.am (1.2), t1reencode/md5.c (1.1),
+ t1reencode/md5.h (1.1), t1reencode/t1reencode.cc (1.2):
+ t1reencode updates: almost working, sort of
+
+2005-01-04 Tuesday 11:48 kohler
+
+ * .cvsignore (1.4), Makefile.am (1.25), configure.in (1.100),
+ t1reencode/.cvsignore (1.1), t1reencode/Makefile.am (1.1),
+ t1reencode/t1reencode.1 (1.1), t1reencode/t1reencode.cc (1.1),
+ t1reencode/util.cc (1.1), t1reencode/util.hh (1.1): add
+ t1reencode (but not sure yet it should be distributed)
+
+2004-11-21 Sunday 11:02 kohler
+
+ * t1testpage/t1testpage.cc (1.17): include *.whatever immediately
+ after *
+
+2004-11-19 Friday 22:16 kohler
+
+ * t1dotlessj/t1dotlessj.1 (1.25): s/J/j/
+
+2004-11-19 Friday 20:46 kohler
+
+ * NEWS (1.84), README (1.64), configure.in (1.99),
+ lcdf-typetools.spec (1.2), cfftot1/cfftot1.1 (1.61),
+ mmafm/mmafm.1 (1.79), mmpfb/mmpfb.1 (1.79), otfinfo/otfinfo.1
+ (1.36), otftotfm/glyphfilter.cc (1.4), otftotfm/glyphfilter.hh
+ (1.5), otftotfm/otftotfm.1 (1.103), otftotfm/otftotfm.cc (1.88),
+ t1dotlessj/t1dotlessj.1 (1.24), t1lint/t1lint.1 (1.39),
+ t1testpage/t1testpage.1 (1.37): to version 2.16: include- and
+ exclude-alternates updates
+
+2004-10-25 Monday 21:51 kohler
+
+ * configure.in (1.98), otftotfm/Makefile.am (1.21): tetex-build
+ dependency
+
+2004-10-10 Sunday 12:03 kohler
+
+ * configure.in (1.97): more --enable-tetex-build
+
+2004-10-08 Friday 23:53 kohler
+
+ * configure.in (1.96): --enable-tetex-build
+
+2004-10-05 Tuesday 16:16 kohler
+
+ * configure.in (1.95): add support for --with-kpathsea=texk-local
+
+2004-10-01 Friday 00:42 kohler
+
+ * otftotfm/: metrics.cc (1.25), otftotfm.cc (1.87): revert some
+ Popineauisms
+
+2004-09-30 Thursday 18:44 kohler
+
+ * Makefile.am (1.24), NEWS (1.83), mmpfb/t1rewrit.cc (1.39),
+ otftotfm/glyphfilter.cc (1.3), otftotfm/glyphfilter.hh (1.4),
+ otftotfm/metrics.cc (1.24), otftotfm/otftotfm.cc (1.86),
+ otftotfm/util.hh (1.12), t1testpage/t1testpage.cc (1.16):
+ Microsoft CC updates from Fabrice Popineau
+
+2004-09-21 Tuesday 17:10 kohler
+
+ * otftotfm/otftotfm.1 (1.102): backtrackabit
+
+2004-09-21 Tuesday 17:00 kohler
+
+ * README (1.63), lcdf-typetools.spec (1.1), mmafm/mmafm.1 (1.78),
+ mmpfb/mmpfb.1 (1.78), otftotfm/otftotfm.1 (1.101): manpage
+ updates from Claire Connelly, and a spec from her too
+
+2004-09-18 Saturday 00:22 kohler
+
+ * NEWS (1.82), mmpfb/myfont.hh (1.14): volovich
+
+2004-09-17 Friday 17:26 kohler
+
+ * NEWS (1.81), README (1.62), configure.in (1.94),
+ cfftot1/cfftot1.1 (1.60), mmafm/mmafm.1 (1.77), mmpfb/mmpfb.1
+ (1.77), otfinfo/otfinfo.1 (1.35), otftotfm/otftotfm.1 (1.100),
+ t1dotlessj/t1dotlessj.1 (1.23), t1lint/t1lint.1 (1.38),
+ t1testpage/t1testpage.1 (1.36): towards 2.15
+
+2004-09-17 Friday 17:18 kohler
+
+ * NEWS (1.80), configure.in (1.93), otftotfm/glyphfilter.hh (1.3),
+ README (1.61), cfftot1/cfftot1.1 (1.59), mmafm/mmafm.1 (1.76),
+ mmpfb/mmpfb.1 (1.76), otfinfo/otfinfo.1 (1.34),
+ otftotfm/otftotfm.1 (1.99), t1dotlessj/t1dotlessj.1 (1.22),
+ t1lint/t1lint.1 (1.37), t1testpage/t1testpage.1 (1.35): to
+ version 2.14
+
+2004-09-12 Sunday 10:08 kohler
+
+ * NEWS (1.79), README (1.60), cfftot1/cfftot1.1 (1.58),
+ mmafm/mmafm.1 (1.75), mmpfb/mmpfb.1 (1.75), otfinfo/otfinfo.1
+ (1.33), otftotfm/automatic.cc (1.35), otftotfm/otftotfm.1 (1.98),
+ t1dotlessj/t1dotlessj.1 (1.21), t1lint/t1lint.1 (1.36),
+ t1testpage/t1testpage.1 (1.34): versionize, and search both
+ $VARTEXMF and $TEXMF (Simon Patarin)
+
+2004-08-21 Saturday 23:24 kohler
+
+ * configure.in (1.92): selfauto fix
+
+2004-08-21 Saturday 23:21 kohler
+
+ * NEWS (1.78), configure.in (1.91), otftotfm/kpseinterface.c (1.7):
+ SELFAUTO support
+
+2004-08-19 Thursday 17:38 kohler
+
+ * README (1.59), cfftot1/cfftot1.1 (1.57), mmafm/mmafm.1 (1.74),
+ mmpfb/mmpfb.1 (1.74), otfinfo/otfinfo.1 (1.32),
+ otftotfm/otftotfm.1 (1.97), t1dotlessj/t1dotlessj.1 (1.20),
+ t1lint/t1lint.1 (1.35), t1testpage/t1testpage.1 (1.33): to 2.12
+
+2004-08-19 Thursday 17:35 kohler
+
+ * NEWS (1.77), configure.in (1.90), otftotfm/automatic.cc (1.34):
+ catch bug that would cause problems on 64-bit machines
+
+2004-08-18 Wednesday 18:25 kohler
+
+ * otftotfm/automatic.cc (1.33): another nit
+
+2004-08-18 Wednesday 18:24 kohler
+
+ * otftotfm/automatic.cc (1.32): more kpsehell
+
+2004-08-18 Wednesday 18:03 kohler
+
+ * otftotfm/automatic.cc (1.31): fix bug wrt tds_1_1 detection
+
+2004-08-18 Wednesday 17:54 kohler
+
+ * NEWS (1.76), README (1.58), configure.in (1.89),
+ cfftot1/cfftot1.1 (1.56), mmafm/mmafm.1 (1.73), mmpfb/mmpfb.1
+ (1.73), otfinfo/otfinfo.1 (1.31), otftotfm/automatic.cc (1.30),
+ otftotfm/kpseinterface.c (1.6), otftotfm/kpseinterface.h (1.4),
+ otftotfm/otftotfm.1 (1.96), t1dotlessj/t1dotlessj.1 (1.19),
+ t1lint/t1lint.1 (1.34), t1testpage/t1testpage.1 (1.32): Olaf
+ Weber plan for TDS 1.1 vs. 1.0
+
+2004-08-18 Wednesday 17:42 kohler
+
+ * NEWS (1.75), README (1.57), cfftot1/cfftot1.1 (1.55),
+ mmafm/mmafm.1 (1.72), mmpfb/mmpfb.1 (1.72), otfinfo/otfinfo.1
+ (1.30), otftotfm/otftotfm.1 (1.95), t1dotlessj/t1dotlessj.1
+ (1.18), t1lint/t1lint.1 (1.33), t1testpage/t1testpage.1 (1.31):
+ release 2.10
+
+2004-08-17 Tuesday 23:16 kohler
+
+ * otftotfm/automatic.cc (1.29): fix bug
+
+2004-08-17 Tuesday 19:01 kohler
+
+ * NEWS (1.74), configure.in (1.88), otftotfm/automatic.cc (1.28),
+ otftotfm/otftotfm.1 (1.94): update for TDS 1.1
+
+2004-08-17 Tuesday 18:56 kohler
+
+ * otftotfm/: kpseinterface.c (1.5), kpseinterface.h (1.3): add
+ kpsei_var_value
+
+2004-08-10 Tuesday 17:43 kohler
+
+ * NEWS (1.73), README (1.56), cfftot1/cfftot1.1 (1.54),
+ mmafm/mmafm.1 (1.71), mmpfb/mmpfb.1 (1.71), otfinfo/otfinfo.1
+ (1.29), otftotfm/otftotfm.1 (1.93), t1dotlessj/t1dotlessj.1
+ (1.17), t1lint/t1lint.1 (1.32), t1testpage/t1testpage.1 (1.30):
+ to 2.9
+
+2004-08-10 Tuesday 00:27 kohler
+
+ * NEWS (1.72), configure.in (1.87), otftotfm/dvipsencoding.cc
+ (1.36), otftotfm/glyphfilter.cc (1.2), otftotfm/glyphfilter.hh
+ (1.2), otftotfm/metrics.cc (1.23), otftotfm/metrics.hh (1.13),
+ otftotfm/otftotfm.1 (1.92), otftotfm/otftotfm.cc (1.85),
+ otftotfm/uniprop.cc (1.3), otftotfm/uniprop.hh (1.3),
+ otftotfm/util.cc (1.15), otftotfm/util.hh (1.11): support
+ --letter-feature
+
+2004-08-05 Thursday 01:07 kohler
+
+ * NEWS (1.71), README (1.55), configure.in (1.86),
+ cfftot1/cfftot1.1 (1.53), mmafm/mmafm.1 (1.70), mmpfb/mmpfb.1
+ (1.70), otfinfo/otfinfo.1 (1.28), otftotfm/metrics.cc (1.22),
+ otftotfm/otftotfm.1 (1.91), otftotfm/otftotfm.cc (1.84),
+ t1dotlessj/t1dotlessj.1 (1.16), t1lint/t1lint.1 (1.31),
+ t1testpage/t1testpage.1 (1.29): to 2.8: catch thrown errors from
+ Gsub and Gpos constructors
+
+2004-08-03 Tuesday 18:23 kohler
+
+ * NEWS (1.70), README (1.54), configure.in (1.85),
+ cfftot1/cfftot1.1 (1.52), mmafm/mmafm.1 (1.69), mmpfb/mmpfb.1
+ (1.69), otfinfo/otfinfo.1 (1.27), otftotfm/otftotfm.1 (1.90),
+ otftotfm/otftotfm.cc (1.83), t1dotlessj/t1dotlessj.1 (1.15),
+ t1lint/t1lint.1 (1.30), t1testpage/t1testpage.1 (1.28): to 2.7
+
+2004-07-12 Monday 19:15 kohler
+
+ * NEWS (1.69), README (1.53), configure.in (1.84),
+ cfftot1/cfftot1.1 (1.51), mmafm/mmafm.1 (1.68), mmpfb/mmpfb.1
+ (1.68), otfinfo/otfinfo.1 (1.26), otftotfm/otftotfm.1 (1.89),
+ t1dotlessj/t1dotlessj.1 (1.14), t1lint/t1lint.1 (1.29),
+ t1testpage/t1testpage.1 (1.27): versionize
+
+2004-07-12 Monday 19:13 kohler
+
+ * t1testpage/: t1testpage.1 (1.26), t1testpage.cc (1.15):
+ t1testpage adds --glyph and --smoke options
+
+2004-07-12 Monday 19:12 kohler
+
+ * Makefile.am (1.23), liblcdf/Makefile.am (1.6),
+ otftotfm/dvipsencoding.hh (1.24), otftotfm/util.cc (1.14),
+ otftotfm/util.hh (1.10): liblcdf adds globmatch
+
+2004-07-06 Tuesday 16:57 kohler
+
+ * NEWS (1.68), README (1.52), configure.in (1.83),
+ cfftot1/cfftot1.1 (1.50), mmafm/mmafm.1 (1.67), mmpfb/mmpfb.1
+ (1.67), otfinfo/otfinfo.1 (1.25), otftotfm/otftotfm.1 (1.88),
+ t1dotlessj/t1dotlessj.1 (1.13), t1lint/t1lint.1 (1.28),
+ t1testpage/t1testpage.1 (1.25): version update
+
+2004-06-30 Wednesday 09:56 kohler
+
+ * NEWS (1.67), README (1.51), configure.in (1.82),
+ cfftot1/cfftot1.1 (1.49), mmafm/mmafm.1 (1.66), mmpfb/mmpfb.1
+ (1.66), otfinfo/otfinfo.1 (1.24), otftotfm/otftotfm.1 (1.87),
+ t1dotlessj/t1dotlessj.1 (1.12), t1lint/t1lint.1 (1.27),
+ t1testpage/t1testpage.1 (1.24): to 2.4
+
+2004-06-15 Tuesday 23:51 kohler
+
+ * glyphlist.txt (1.12), otftotfm/secondary.cc (1.15),
+ otftotfm/secondary.hh (1.11): support F{F,I,L,FI,FL}small (Ulrich
+ Dirr)
+
+2004-06-15 Tuesday 21:56 kohler
+
+ * otftotfm/dvipsencoding.cc (1.35): comment update
+
+2004-06-15 Tuesday 21:55 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.34), dvipsencoding.hh (1.23),
+ metrics.cc (1.21), metrics.hh (1.12), otftotfm.cc (1.82),
+ secondary.cc (1.14), secondary.hh (1.10): store Unicode
+ information in Metrics, not DvipsEncoding
+
+2004-06-15 Tuesday 21:54 kohler
+
+ * otftotfm/: Makefile.am (1.20), glyphfilter.cc (1.1),
+ glyphfilter.hh (1.1): add glyphfilter
+
+2004-06-15 Tuesday 21:53 kohler
+
+ * mkuniprop.pl (1.2), otftotfm/uniprop.cc (1.2),
+ otftotfm/uniprop.hh (1.2): add parse_property
+
+2004-06-15 Tuesday 09:32 kohler
+
+ * otftotfm/otftotfm.1 (1.86): doc nits
+
+2004-06-15 Tuesday 09:27 kohler
+
+ * otftotfm/otftotfm.1 (1.85): nit
+
+2004-06-15 Tuesday 09:26 kohler
+
+ * NEWS (1.66), README (1.50), configure.in (1.81),
+ cfftot1/cfftot1.1 (1.48), mmafm/mmafm.1 (1.65), mmpfb/mmpfb.1
+ (1.65), otfinfo/otfinfo.1 (1.23), otftotfm/dvipsencoding.cc
+ (1.33), otftotfm/dvipsencoding.hh (1.22), otftotfm/otftotfm.1
+ (1.84), otftotfm/otftotfm.cc (1.81), t1dotlessj/t1dotlessj.1
+ (1.11), t1lint/t1lint.1 (1.26), t1testpage/t1testpage.1 (1.23):
+ to 2.3: --default-ligkern et al
+
+2004-06-14 Monday 21:01 kohler
+
+ * mkuniprop.pl (1.1), otftotfm/uniprop.cc (1.1),
+ otftotfm/uniprop.hh (1.1): add UnicodeProperty
+
+2004-05-26 Wednesday 22:42 kohler
+
+ * README (1.49): update README
+
+2004-05-08 Saturday 09:32 kohler
+
+ * NEWS (1.65), README (1.48), configure.in (1.80),
+ cfftot1/cfftot1.1 (1.47), mmafm/mmafm.1 (1.64), mmpfb/mmpfb.1
+ (1.64), otfinfo/otfinfo.1 (1.22), otftotfm/otftotfm.1 (1.83),
+ t1dotlessj/t1dotlessj.1 (1.10), t1lint/t1lint.1 (1.25),
+ t1testpage/t1testpage.1 (1.22): bump version
+
+2004-05-08 Saturday 09:31 kohler
+
+ * otftotfm/: automatic.cc (1.27), otftotfm.cc (1.80), secondary.cc
+ (1.13), secondary.hh (1.9), util.hh (1.9): pay attention to
+ t1dotlessj exit status and use a regular "j" as a dotless "j" if
+ no dot was found. Also support "--force" (untested), and make
+ t1dotlessj errors into warnings (so that otftotfm finishes all of
+ its tasks even if t1dotlessj bombs out, reported by Stephen Moye)
+
+2004-05-08 Saturday 09:29 kohler
+
+ * t1dotlessj/: t1dotlessj.1 (1.9), t1dotlessj.cc (1.6): exit with
+ different status depending on the error
+
+2004-04-18 Sunday 13:15 kohler
+
+ * otftotfm/otftotfm.1 (1.82): improve -faalt description
+
+2004-04-05 Monday 03:25 kohler
+
+ * NEWS (1.64), README (1.47), configure.in (1.79),
+ cfftot1/cfftot1.1 (1.46), mmafm/mmafm.1 (1.63), mmpfb/mmpfb.1
+ (1.63), otfinfo/otfinfo.1 (1.21), otftotfm/otftotfm.1 (1.81),
+ otftotfm/otftotfm.cc (1.79), t1dotlessj/t1dotlessj.1 (1.8),
+ t1lint/t1lint.1 (1.24), t1testpage/t1testpage.1 (1.21): to 2.1:
+ improve documentation for otftotfm; otftotfm warns on missing
+ encoding file
+
+2004-03-28 Sunday 10:46 kohler
+
+ * glyphlist.txt (1.11): add fontinst synonyms
+
+2004-03-21 Sunday 19:45 kohler
+
+ * NEWS (1.63), ONEWS (1.2), README (1.46), configure.in (1.78),
+ cfftot1/cfftot1.1 (1.45), cfftot1/cfftot1.cc (1.21),
+ cfftot1/maket1font.cc (1.21), mmafm/main.cc (1.40), mmafm/mmafm.1
+ (1.62), mmpfb/mmpfb.1 (1.62), mmpfb/myfont.cc (1.39),
+ mmpfb/t1minimize.cc (1.6), mmpfb/t1rewrit.cc (1.38),
+ otfinfo/otfinfo.1 (1.20), otfinfo/otfinfo.cc (1.9),
+ otftotfm/automatic.cc (1.26), otftotfm/dvipsencoding.cc (1.32),
+ otftotfm/metrics.cc (1.20), otftotfm/otftotfm.1 (1.80),
+ otftotfm/otftotfm.cc (1.78), otftotfm/secondary.cc (1.12),
+ otftotfm/util.cc (1.13), t1dotlessj/t1dotlessj.1 (1.7),
+ t1lint/cscheck.cc (1.13), t1lint/t1lint.1 (1.23),
+ t1testpage/t1testpage.1 (1.20): to 2.0, and update copyrights
+
+2004-03-21 Sunday 19:36 kohler
+
+ * mmpfb/main.cc (1.43), t1dotlessj/t1dotlessj.cc (1.5),
+ t1lint/t1lint.cc (1.16), t1testpage/t1testpage.cc (1.14): add
+ _O_BINARY flag on Windows when appropriate; also update copyright
+
+2004-02-24 Tuesday 11:38 kohler
+
+ * otftotfm/: metrics.cc (1.19), otftotfm.1 (1.79): nits
+
+2004-02-24 Tuesday 11:20 kohler
+
+ * README (1.45), configure.in (1.77), cfftot1/cfftot1.1 (1.44),
+ mmafm/mmafm.1 (1.61), mmpfb/mmpfb.1 (1.61), otfinfo/otfinfo.1
+ (1.19), otftotfm/otftotfm.1 (1.78), t1dotlessj/t1dotlessj.1
+ (1.6), t1lint/t1lint.1 (1.22), t1testpage/t1testpage.1 (1.19): to
+ 1.99
+
+2004-02-24 Tuesday 11:18 kohler
+
+ * NEWS (1.62), otftotfm/metrics.cc (1.18): small change improves
+ performance a lot: don't do unnecessary work
+
+2004-02-24 Tuesday 10:43 kohler
+
+ * otftotfm/: metrics.cc (1.17), otftotfm.cc (1.77): fix bug
+ reported by Adam Lindsay: a context ligature was included even
+ though it referred to a nonexistent character
+
+2004-02-24 Tuesday 10:08 kohler
+
+ * otftotfm/metrics.cc (1.16): a better error message
+
+2004-02-22 Sunday 01:37 kohler
+
+ * NEWS (1.61), README (1.44), configure.in (1.76),
+ cfftot1/cfftot1.1 (1.43), mmafm/mmafm.1 (1.60), mmpfb/mmpfb.1
+ (1.60), otfinfo/otfinfo.1 (1.18), otftotfm/otftotfm.1 (1.77),
+ t1dotlessj/t1dotlessj.1 (1.5), t1lint/t1lint.1 (1.21),
+ t1testpage/t1testpage.1 (1.18): to version 1.98
+
+2004-02-22 Sunday 01:33 kohler
+
+ * glyphlist.txt (1.10), otftotfm/dvipsencoding.cc (1.31),
+ otftotfm/secondary.cc (1.11): add support for SSsmall (Einar
+ Smith)
+
+2004-02-22 Sunday 01:32 kohler
+
+ * otftotfm/: automatic.cc (1.25), automatic.hh (1.7), otftotfm.cc
+ (1.76), util.cc (1.12), util.hh (1.8): rename nocreate to
+ no_create to fix compilation problems (reported by Nelson Beebe)
+
+2004-02-06 Friday 21:47 kohler
+
+ * NEWS (1.60), README (1.43), configure.in (1.75),
+ cfftot1/cfftot1.1 (1.42), mmafm/mmafm.1 (1.59), mmpfb/mmpfb.1
+ (1.59), otfinfo/otfinfo.1 (1.17), otftotfm/otftotfm.1 (1.76),
+ t1dotlessj/t1dotlessj.1 (1.4), t1lint/t1lint.1 (1.20),
+ t1testpage/t1testpage.1 (1.17): to 1.97
+
+2004-01-11 Sunday 13:02 kohler
+
+ * otftotfm/dvipsencoding.cc (1.30): C++-style string iteration
+
+2004-01-11 Sunday 12:52 kohler
+
+ * README (1.42), cfftot1/cfftot1.1 (1.41), mmafm/mmafm.1 (1.58),
+ mmpfb/mmpfb.1 (1.58), otfinfo/otfinfo.1 (1.16),
+ otftotfm/otftotfm.1 (1.75), t1dotlessj/t1dotlessj.1 (1.3),
+ t1lint/t1lint.1 (1.19), t1testpage/t1testpage.1 (1.16):
+ versionize
+
+2004-01-11 Sunday 12:51 kohler
+
+ * NEWS (1.59), configure.in (1.74), otftotfm/dvipsencoding.cc
+ (1.29): to 1.96: respect "Q.alt" and the like in input encoding
+
+2004-01-05 Monday 08:35 kohler
+
+ * t1dotlessj/t1dotlessj.cc (1.4): font_name fix for Forte C++, from
+ Tom Kacvinsky
+
+2004-01-03 Saturday 22:18 kohler
+
+ * otftotfm/otftotfm.1 (1.74): mention t1dotlessj in SEE ALSO
+
+2004-01-03 Saturday 21:48 kohler
+
+ * NEWS (1.58), configure.in (1.73), otftotfm/Makefile.am (1.19),
+ otftotfm/otftotfm.1 (1.72), README (1.41), cfftot1/cfftot1.1
+ (1.40), mmafm/mmafm.1 (1.57), mmpfb/mmpfb.1 (1.57),
+ otfinfo/otfinfo.1 (1.15), otftotfm/otftotfm.1 (1.73),
+ t1dotlessj/t1dotlessj.1 (1.2), t1lint/t1lint.1 (1.18),
+ t1testpage/t1testpage.1 (1.15): to 1.95
+
+2004-01-03 Saturday 21:48 kohler
+
+ * otftotfm/: secondary.cc (1.10), secondary.hh (1.8): support
+ dotless-j generation
+
+2004-01-03 Saturday 21:47 kohler
+
+ * otftotfm/: otftotfm.cc (1.75), otftotfm.hh (1.1): support virtual
+ fonts that refer to more than one base font (for dotless-j
+ support); avoid bad "(STOP)" commands; refactor code to introduce
+ output_metrics() function (used by dotless-j support)
+
+2004-01-03 Saturday 21:45 kohler
+
+ * otftotfm/: metrics.cc (1.15), metrics.hh (1.11): add
+ design_units(); and support multiple fonts: add Setting::FONT,
+ and a mapped_fonts() array
+
+2004-01-03 Saturday 21:44 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.28), dvipsencoding.hh (1.21):
+ nits, including a fix for glyphlist.txt multi-possibility lines
+ (like "dotlessj;0237;FB36"); use String::iterator; adapt to
+ Secondary changes
+
+2004-01-03 Saturday 21:42 kohler
+
+ * otftotfm/automatic.cc (1.24): create Type 1 fonts even in
+ non-automatic mode, and jigger error messages
+
+2003-12-31 Wednesday 10:42 kohler
+
+ * NEWS (1.57), configure.in (1.72), otftotfm/automatic.cc (1.23),
+ otftotfm/automatic.hh (1.6), otftotfm/metrics.cc (1.14),
+ otftotfm/metrics.hh (1.10), otftotfm/otftotfm.cc (1.74),
+ otftotfm/secondary.cc (1.9): to 1.91
+
+2003-12-30 Tuesday 14:39 kohler
+
+ * t1dotlessj/t1dotlessj.cc (1.3): nit
+
+2003-12-30 Tuesday 14:39 kohler
+
+ * t1dotlessj/: Makefile.am (1.2), t1dotlessj.cc (1.2): to version
+ 1.90: include t1dotlessj.1, some updates also to the code
+
+2003-12-30 Tuesday 14:37 kohler
+
+ * NEWS (1.56), README (1.40), configure.in (1.71),
+ cfftot1/cfftot1.1 (1.39), mmafm/mmafm.1 (1.56), mmpfb/mmpfb.1
+ (1.56), otfinfo/otfinfo.1 (1.14), otftotfm/otftotfm.1 (1.71),
+ t1dotlessj/t1dotlessj.1 (1.1), t1lint/t1lint.1 (1.17),
+ t1testpage/t1testpage.1 (1.14): to version 1.90
+
+2003-12-29 Monday 02:01 kohler
+
+ * Makefile.am (1.22), configure.in (1.70), t1dotlessj/.cvsignore
+ (1.1), t1dotlessj/Makefile.am (1.1), t1dotlessj/t1dotlessj.cc
+ (1.1): add t1dotlessj
+
+2003-12-29 Monday 02:01 kohler
+
+ * t1lint/cscheck.cc (1.12): adapt to _careful change: t1lint should
+ be careful
+
+2003-12-29 Monday 02:00 kohler
+
+ * cfftot1/maket1font.cc (1.20), mmpfb/t1minimize.cc (1.5): adapt to
+ Type1CharstringGenInterp changes
+
+2003-12-28 Sunday 10:32 kohler
+
+ * cfftot1/maket1font.cc (1.19): use Type1CharstringGenInterp
+
+2003-12-28 Sunday 00:23 kohler
+
+ * NEWS (1.55), cfftot1/maket1font.cc (1.18), libefont/Makefile.am
+ (1.12), mmpfb/t1minimize.cc (1.4): adapt to t1font::skeleton
+ stuff
+
+2003-12-23 Tuesday 11:09 kohler
+
+ * README (1.39), cfftot1/cfftot1.1 (1.38), mmafm/mmafm.1 (1.55),
+ mmpfb/mmpfb.1 (1.55), otfinfo/otfinfo.1 (1.13),
+ otftotfm/otftotfm.1 (1.70), t1lint/t1lint.1 (1.16),
+ t1testpage/t1testpage.1 (1.13): to 1.88
+
+2003-12-23 Tuesday 11:08 kohler
+
+ * NEWS (1.54), configure.in (1.69), otfinfo/otfinfo.cc (1.8): 1.88:
+ use more STL instead of homegrown find() template for
+ compatibility with older GCCs
+
+2003-12-23 Tuesday 11:07 kohler
+
+ * cfftot1/cfftot1.1 (1.37), mmafm/mmafm.1 (1.54), mmpfb/mmpfb.1
+ (1.54), otfinfo/otfinfo.1 (1.12), otftotfm/otftotfm.1 (1.69),
+ t1lint/t1lint.1 (1.15), t1testpage/t1testpage.1 (1.12), README
+ (1.38): to 1.87
+
+2003-12-22 Monday 21:43 kohler
+
+ * NEWS (1.53), configure.in (1.68), otftotfm/otftotfm.cc (1.73),
+ otftotfm/secondary.cc (1.8), otftotfm/secondary.hh (1.7): fix
+ Ulrich Dirr --extend bug: extend factor was applied to font
+ height, not width; and apply extend factor to XHEIGHT SPACE and
+ other font dimensoins
+
+2003-12-19 Friday 10:22 kohler
+
+ * NEWS (1.52), README (1.37), configure.in (1.67),
+ cfftot1/cfftot1.1 (1.36), mmafm/mmafm.1 (1.53), mmpfb/mmpfb.1
+ (1.53), otfinfo/otfinfo.1 (1.11), otftotfm/otftotfm.1 (1.68),
+ otftotfm/otftotfm.cc (1.72), t1lint/t1lint.1 (1.14),
+ t1testpage/t1testpage.1 (1.11): to 1.86
+
+2003-12-10 Wednesday 17:40 kohler
+
+ * otftotfm/otftotfm.1 (1.67): oopslet
+
+2003-12-10 Wednesday 12:20 kohler
+
+ * NEWS (1.51), README (1.36), configure.in (1.66),
+ cfftot1/cfftot1.1 (1.35), mmafm/mmafm.1 (1.52), mmpfb/mmpfb.1
+ (1.52), otfinfo/otfinfo.1 (1.10), t1lint/t1lint.1 (1.13),
+ t1testpage/t1testpage.1 (1.10): versionize
+
+2003-12-10 Wednesday 12:20 kohler
+
+ * otftotfm/: otftotfm.1 (1.66), otftotfm.cc (1.71): add
+ --altselector-feature mechanism; default to salt+dlig, not
+ aalt+dlig; allow --altselector=CHAR and --altselector-char=CHAR
+ instead of numbers
+
+2003-12-10 Wednesday 12:18 kohler
+
+ * otftotfm/automatic.cc (1.22): oops: fix intermittend hang caused
+ by bonehead error
+
+2003-12-05 Friday 10:22 kohler
+
+ * otftotfm/otftotfm.1 (1.65): a/an nit
+
+2003-12-04 Thursday 17:33 kohler
+
+ * NEWS (1.50), glyphlist.txt (1.9): fix Ulrichs problem with SS
+
+2003-12-04 Thursday 17:13 kohler
+
+ * otftotfm/metrics.cc (1.13): alternates bitlet
+
+2003-12-04 Thursday 17:02 kohler
+
+ * NEWS (1.49), README (1.35), configure.in (1.65), glyphlist.txt
+ (1.8), cfftot1/cfftot1.1 (1.34), mmafm/mmafm.1 (1.51),
+ mmpfb/mmpfb.1 (1.51), otfinfo/otfinfo.1 (1.9),
+ otftotfm/dvipsencoding.cc (1.27), otftotfm/dvipsencoding.hh
+ (1.20), otftotfm/metrics.cc (1.12), otftotfm/metrics.hh (1.9),
+ otftotfm/otftotfm.1 (1.64), otftotfm/otftotfm.cc (1.70),
+ otftotfm/secondary.cc (1.7), otftotfm/secondary.hh (1.6),
+ otftotfm/util.cc (1.11), otftotfm/util.hh (1.7), t1lint/t1lint.1
+ (1.12), t1testpage/t1testpage.1 (1.9): to 1.80: support
+ --altselector-char, --include-alternates, and
+ --exclude-alternates
+
+2003-12-03 Wednesday 17:19 kohler
+
+ * NEWS (1.48), README (1.34), configure.in (1.64),
+ cfftot1/cfftot1.1 (1.33), mmafm/mmafm.1 (1.50), mmpfb/mmpfb.1
+ (1.50), otfinfo/otfinfo.1 (1.8), otftotfm/otftotfm.1 (1.63),
+ t1lint/t1lint.1 (1.11), t1testpage/t1testpage.1 (1.8): to 1.75;
+ only changes to NEWS (bug fix was in library)
+
+2003-12-01 Monday 11:33 kohler
+
+ * configure.in (1.63): check explicitly for fabs
+
+2003-12-01 Monday 11:28 kohler
+
+ * NEWS (1.47), README (1.33), configure.in (1.62),
+ cfftot1/cfftot1.1 (1.32), mmafm/main.cc (1.39), mmafm/mmafm.1
+ (1.49), mmpfb/mmpfb.1 (1.49), otfinfo/otfinfo.1 (1.7),
+ otftotfm/otftotfm.1 (1.62), otftotfm/otftotfm.cc (1.69),
+ t1lint/t1lint.1 (1.10), t1testpage/t1testpage.1 (1.7): to version
+ 1.70: add --min-kern to otftotfm; add --min-kern synonym to mmafm
+
+2003-11-29 Saturday 09:48 kohler
+
+ * NEWS (1.46), README (1.32), configure.in (1.61),
+ cfftot1/cfftot1.1 (1.31), mmafm/mmafm.1 (1.48), mmpfb/mmpfb.1
+ (1.48), otfinfo/otfinfo.1 (1.6), otftotfm/otftotfm.1 (1.61),
+ otftotfm/otftotfm.cc (1.68), t1lint/t1lint.1 (1.9),
+ t1testpage/t1testpage.1 (1.6): to 1.67: fix minor bug
+ reported/patch provided/ by Akira Kakuto
+
+2003-11-24 Monday 09:53 kohler
+
+ * NEWS (1.45), README (1.31), configure.in (1.60),
+ cfftot1/cfftot1.1 (1.30), cfftot1/maket1font.cc (1.17),
+ mmafm/mmafm.1 (1.47), mmpfb/mmpfb.1 (1.47), otfinfo/otfinfo.1
+ (1.5), otftotfm/otftotfm.1 (1.60), t1lint/t1lint.1 (1.8),
+ t1testpage/t1testpage.1 (1.5): to 1.66: currentfile eexec
+ duplication
+
+2003-11-24 Monday 07:50 kohler
+
+ * NEWS (1.44), README (1.30), configure.in (1.59),
+ cfftot1/cfftot1.1 (1.29), mmafm/mmafm.1 (1.46), mmpfb/mmpfb.1
+ (1.46), otfinfo/otfinfo.1 (1.4), otftotfm/automatic.cc (1.21),
+ otftotfm/dvipsencoding.cc (1.26), otftotfm/dvipsencoding.hh
+ (1.19), otftotfm/otftotfm.1 (1.59), otftotfm/otftotfm.cc (1.67),
+ t1lint/t1lint.1 (1.7), t1testpage/t1testpage.1 (1.4): to version
+ 1.65
+
+2003-11-16 Sunday 19:24 kohler
+
+ * otftotfm/metrics.hh (1.8): adapt to newer Vector
+
+2003-11-08 Saturday 11:24 kohler
+
+ * cfftot1/cfftot1.cc (1.20), otftotfm/otftotfm.cc (1.66): support
+ for CID-keyed CFF fonts
+
+2003-10-21 Tuesday 17:39 kohler
+
+ * mmafm/mmafm.1 (1.45): mention multiple master metrics archive
+
+2003-10-17 Friday 15:58 kohler
+
+ * Makefile.am (1.21), NEWS (1.43), README (1.29), configure.in
+ (1.58), cfftot1/cfftot1.1 (1.28), cfftot1/maket1font.cc (1.16),
+ mmafm/mmafm.1 (1.44), mmpfb/mmpfb.1 (1.45), mmpfb/t1rewrit.cc
+ (1.37), mmpfb/t1rewrit.hh (1.17), otfinfo/otfinfo.1 (1.3),
+ otftotfm/automatic.cc (1.20), otftotfm/otftotfm.1 (1.58),
+ otftotfm/otftotfm.cc (1.65), otftotfm/secondary.cc (1.6),
+ t1lint/cscheck.cc (1.11), t1lint/cscheck.hh (1.7),
+ t1lint/t1lint.1 (1.6), t1lint/t1lint.cc (1.15),
+ t1testpage/t1testpage.1 (1.3): versionization, and cope with
+ efont changes
+
+2003-10-02 Thursday 19:45 kohler
+
+ * otftotfm/otftotfm.1 (1.57): minor man page update
+
+2003-09-04 Thursday 10:53 kohler
+
+ * NEWS (1.42), README (1.28), configure.in (1.57),
+ cfftot1/cfftot1.1 (1.27), mmafm/mmafm.1 (1.43), mmpfb/mmpfb.1
+ (1.44), otftotfm/otftotfm.1 (1.56), t1testpage/t1testpage.1
+ (1.2): versionize
+
+2003-09-04 Thursday 10:50 kohler
+
+ * t1lint/t1lint.1 (1.5): oops
+
+2003-09-04 Thursday 10:49 kohler
+
+ * otftotfm/: otftotfm.1 (1.55), otftotfm.cc (1.64): add
+ --design-size option
+
+2003-09-04 Thursday 10:48 kohler
+
+ * t1testpage/: Makefile.am (1.6), t1testpage.1 (1.1), t1testpage.cc
+ (1.13): fix --help and add manual page
+
+2003-09-04 Thursday 10:48 kohler
+
+ * mmafm/main.cc (1.38), mmpfb/main.cc (1.42): name nit
+
+2003-09-02 Tuesday 15:16 kohler
+
+ * NEWS (1.41), README (1.27), configure.in (1.56),
+ cfftot1/cfftot1.1 (1.26), mmafm/mmafm.1 (1.42), mmpfb/mmpfb.1
+ (1.43), otftotfm/otftotfm.1 (1.54), otftotfm/otftotfm.cc (1.63),
+ t1lint/t1lint.1 (1.4): set DESIGNSIZE to the font's actual design
+ size, from the "size" feature
+
+2003-08-28 Thursday 20:31 kohler
+
+ * cfftot1/cfftot1.cc (1.19), mmafm/main.cc (1.37), mmpfb/main.cc
+ (1.41), otfinfo/otfinfo.cc (1.7), otftotfm/otftotfm.cc (1.62),
+ t1lint/t1lint.cc (1.14), t1testpage/t1testpage.cc (1.12): update
+ type of main()
+
+2003-08-26 Tuesday 15:26 kohler
+
+ * NEWS (1.40), README (1.26), configure.in (1.55),
+ cfftot1/Makefile.am (1.10), cfftot1/cfftot1.1 (1.25),
+ libefont/Makefile.am (1.11), liblcdf/Makefile.am (1.5),
+ mmafm/Makefile.am (1.12), mmafm/mmafm.1 (1.41), mmpfb/Makefile.am
+ (1.13), mmpfb/mmpfb.1 (1.42), otfinfo/Makefile.am (1.2),
+ otfinfo/otfinfo.cc (1.6), otftotfm/Makefile.am (1.18),
+ otftotfm/otftotfm.1 (1.53), t1lint/Makefile.am (1.11),
+ t1lint/t1lint.1 (1.3), t1testpage/Makefile.am (1.5): release 1.50
+
+2003-08-25 Monday 13:05 kohler
+
+ * NEWS (1.39): more news
+
+2003-08-25 Monday 11:44 kohler
+
+ * NEWS (1.38), configure.in (1.54), otftotfm/automatic.cc (1.19):
+ KPATHSEA screwup
+
+2003-08-24 Sunday 17:28 kohler
+
+ * NEWS (1.37), README (1.25): update NEWS
+
+2003-08-24 Sunday 17:21 kohler
+
+ * otfinfo/otfinfo.cc (1.5): nit
+
+2003-08-24 Sunday 17:20 kohler
+
+ * Makefile.am (1.20), README (1.24), cfftot1/cfftot1.1 (1.24),
+ libefont/Makefile.am (1.10), mmafm/mmafm.1 (1.40), mmpfb/mmpfb.1
+ (1.41), otfinfo/otfinfo.1 (1.2), otfinfo/otfinfo.cc (1.4),
+ otftotfm/otftotfm.1 (1.52), otftotfm/otftotfm.cc (1.61),
+ t1lint/t1lint.1 (1.2): versionize; move --query-scripts and
+ --query-features out of otftotfm; otfinfo manpage rework
+
+2003-08-24 Sunday 14:49 kohler
+
+ * otfinfo/otfinfo.cc (1.3), otftotfm/otftotfm.cc (1.60): use new
+ interfaces
+
+2003-08-24 Sunday 14:31 kohler
+
+ * otftotfm/metrics.cc (1.11): fix bug reported by Adam Lindsay with
+ non-boundarychar encodings
+
+2003-08-24 Sunday 14:13 kohler
+
+ * cfftot1/cfftot1.cc (1.18), mmafm/main.cc (1.36), mmpfb/main.cc
+ (1.40), otfinfo/.cvsignore (1.1), otfinfo/otfinfo.cc (1.2),
+ otftotfm/automatic.cc (1.18), otftotfm/metrics.hh (1.7),
+ otftotfm/otftotfm.cc (1.59), t1lint/t1lint.cc (1.13),
+ t1testpage/t1testpage.cc (1.11): Tom Kacvinsky provides patches
+ for Solaris
+
+2003-08-23 Saturday 15:46 kohler
+
+ * Makefile.am (1.19), configure.in (1.53): support recent changes
+
+2003-08-23 Saturday 15:46 kohler
+
+ * otftotfm/: automatic.cc (1.17), automatic.hh (1.5), otftotfm.1
+ (1.51), otftotfm.cc (1.58), secondary.cc (1.5): run
+ TEXMF/dvips/updmap if present when appropriate
+
+2003-08-23 Saturday 15:46 kohler
+
+ * cfftot1/cfftot1.cc (1.17), otftotfm/dvipsencoding.cc (1.25),
+ otftotfm/metrics.cc (1.10), otftotfm/util.cc (1.10),
+ t1lint/t1lint.cc (1.12), t1testpage/t1testpage.cc (1.10): revert
+ #include style for C includes
+
+2003-08-23 Saturday 15:11 kohler
+
+ * otfinfo/: Makefile.am (1.1), otfinfo.1 (1.1), otfinfo.cc (1.1):
+ add preliminary otfinfo
+
+2003-08-20 Wednesday 13:39 kohler
+
+ * mmafm/main.cc (1.35), mmpfb/main.cc (1.39):
+ s/mminstance/typetools/
+
+2003-08-20 Wednesday 12:34 kohler
+
+ * Makefile.am (1.18), NEWS (1.36), ONEWS (1.1), README (1.23),
+ configure.in (1.52), cfftot1/cfftot1.1 (1.23), mmafm/mmafm.1
+ (1.39), mmpfb/mmpfb.1 (1.40), otftotfm/otftotfm.1 (1.50),
+ t1lint/Makefile.am (1.10), t1lint/t1lint.1 (1.1),
+ t1lint/t1lint.cc (1.11): add manual page for t1lint and fix its
+ --help; integrate mmafm and mmpfb
+
+2003-08-14 Thursday 17:05 kohler
+
+ * configure.in (1.51), otftotfm/automatic.cc (1.16),
+ otftotfm/dvipsencoding.hh (1.18), t1lint/cscheck.cc (1.10),
+ t1testpage/t1testpage.cc (1.9): compilation fixes
+
+2003-08-14 Thursday 16:54 kohler
+
+ * mmafm/main.cc (1.34), mmafm/mmafm.1 (1.38), mmpfb/main.cc (1.38),
+ mmpfb/mmpfb.1 (1.39), mmpfb/myfont.cc (1.38), mmpfb/t1minimize.cc
+ (1.3), mmpfb/t1rewrit.cc (1.36): compatibility changes from
+ Fabrice
+
+2003-08-12 Tuesday 14:49 kohler
+
+ * configure.in (1.50), cfftot1/maket1font.cc (1.15),
+ otftotfm/automatic.cc (1.15), otftotfm/md5.c (1.2),
+ otftotfm/metrics.hh (1.6), otftotfm/otftotfm.cc (1.57),
+ otftotfm/secondary.hh (1.5): fabrice popineau patches
+
+2003-08-11 Monday 13:47 kohler
+
+ * mmafm/mmafm.1 (1.37), mmpfb/mmpfb.1 (1.38): to 1.26.1
+
+2003-08-10 Sunday 15:52 kohler
+
+ * configure.in (1.49), t1lint/t1lint.cc (1.10): minor configury
+
+2003-08-10 Sunday 14:39 kohler
+
+ * mmafm/mmafm.1 (1.36), mmpfb/mmpfb.1 (1.37): Beebenits configury
+ etc.
+
+2003-08-10 Sunday 11:46 kohler
+
+ * otftotfm/otftotfm.1 (1.49): thank Marco in the manpage
+
+2003-08-10 Sunday 11:42 kohler
+
+ * Makefile.am (1.17), README (1.22), cfftot1/cfftot1.1 (1.22),
+ otftotfm/otftotfm.1 (1.48): versionize to 0.53
+
+2003-08-10 Sunday 11:38 kohler
+
+ * NEWS (1.35), configure.in (1.48), otftotfm/metrics.cc (1.9),
+ otftotfm/otftotfm.1 (1.47): fix emptyslot bug reported by Marco
+
+2003-08-10 Sunday 10:45 kohler
+
+ * NEWS (1.34), otftotfm/automatic.cc (1.14), otftotfm/otftotfm.1
+ (1.46), otftotfm/otftotfm.cc (1.56): integrate Adams suggested
+ changes: fix cfftot1 invocation with --without-kpathsea, include
+ OTF file when theres no T1 file
+
+2003-08-07 Thursday 13:50 kohler
+
+ * mmafm/main.cc (1.33), mmafm/mmafm.1 (1.35), mmpfb/mmpfb.1 (1.36):
+ build updates to try to address problems reported by Nelson Beebe
+
+2003-08-07 Thursday 13:43 kohler
+
+ * Makefile.am (1.16), NEWS (1.33), README (1.21), configure.in
+ (1.47), cfftot1/cfftot1.1 (1.21), libefont/Makefile.am (1.9),
+ liblcdf/Makefile.am (1.4), otftotfm/otftotfm.1 (1.45): to version
+ 0.52
+
+2003-08-07 Thursday 12:56 kohler
+
+ * NEWS (1.32), configure.in (1.46), otftotfm/kpseinterface.c (1.4),
+ otftotfm/kpseinterface.h (1.2), otftotfm/metrics.cc (1.8),
+ otftotfm/metrics.hh (1.5), otftotfm/otftotfm.1 (1.44),
+ otftotfm/otftotfm.cc (1.55): to version 0.51bis (the bis is a
+ teensy configure.in problemlet): fix crashes with small
+ encodings, add --boundary-char and --kpathsea-debug
+
+2003-08-04 Monday 13:26 kohler
+
+ * otftotfm/: metrics.cc (1.7), metrics.hh (1.4): fix ExPontoPro
+ issue: LIG_LIVE was inappropriate, and when you detect characters
+ used in context-only ligatures, you need to redetermine
+ reachability
+
+2003-08-04 Monday 12:53 kohler
+
+ * otftotfm/otftotfm.1 (1.43), showings/.cvsignore (1.1): manpage
+ nits
+
+2003-08-04 Monday 12:50 kohler
+
+ * glyphlist.txt (1.7): slight glyphlist modification: prefer Delta
+ and Omega to Deltagreek and Omegagreek
+
+2003-08-04 Monday 12:47 kohler
+
+ * NEWS (1.31): update NEWS
+
+2003-08-04 Monday 12:42 kohler
+
+ * showings/: Makefile (1.1), MinionPro-It-features.tex (1.1),
+ MinionPro-Regular-features.tex (1.1), WarnockPro-It-features.tex
+ (1.1), WarnockPro-Regular-features.tex (1.1), features.tex (1.1):
+ add showings directory
+
+2003-08-04 Monday 12:42 kohler
+
+ * otftotfm/metrics.cc (1.6): better ChangedContext structure fixes
+ "1st" problem; previously, the ssuperior character introduced by
+ 1 s t => 1 ssuperior t was new, so changed context refused to
+ implement the 1 ssuperior t => 1 ssuperior tsuperior ligature
+
+2003-08-03 Sunday 22:29 kohler
+
+ * NEWS (1.30), README (1.20), configure.in (1.45),
+ cfftot1/cfftot1.1 (1.20), otftotfm/metrics.cc (1.5),
+ otftotfm/metrics.hh (1.3), otftotfm/otftotfm.1 (1.42),
+ otftotfm/otftotfm.cc (1.54): bump version; add lookup number
+ check to Metrics: prefer that to storing
+
+2003-08-02 Saturday 22:34 kohler
+
+ * otftotfm/metrics.cc (1.4): nit
+
+2003-08-02 Saturday 22:29 kohler
+
+ * otftotfm/metrics.cc (1.3): be more careful about accepting
+ Substitutions
+
+2003-08-02 Saturday 22:17 kohler
+
+ * otftotfm/: gsubencoding.cc (1.26), gsubencoding.hh (1.24),
+ metrics.cc (1.2), metrics.hh (1.2), otftotfm.cc (1.53): new
+ Metrics plan in place can handle -fordn properly, and can stuff
+ "base-only" characters on top of "virtual-only" characters to
+ save encoding space
+
+2003-08-01 Friday 18:50 kohler
+
+ * otftotfm/: Makefile.am (1.17), dvipsencoding.cc (1.24),
+ dvipsencoding.hh (1.17), gsubencoding.cc (1.25), gsubencoding.hh
+ (1.23), metrics.cc (1.1), metrics.hh (1.1), otftotfm.cc (1.52),
+ secondary.cc (1.4), secondary.hh (1.4): new Metrics plan (not
+ GsubEncoding); mostly for code cleanup
+
+2003-07-31 Thursday 16:07 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.23), gsubencoding.cc (1.24),
+ gsubencoding.hh (1.22), otftotfm.cc (1.51): new story for context
+ ligatures focuses on fake characters; perhaps easier to add
+ complex context ligatures like -ffrac. Sufficiently tested?
+
+2003-07-30 Wednesday 20:18 kohler
+
+ * NEWS (1.29), otftotfm/otftotfm.cc (1.50): nits
+
+2003-07-30 Wednesday 19:42 kohler
+
+ * t1lint/: cscheck.cc (1.9), cscheck.hh (1.6), t1lint.cc (1.9):
+ adapt to efont changes
+
+2003-07-30 Wednesday 19:33 kohler
+
+ * mmafm/mmafm.1 (1.34): bump version number
+
+2003-07-30 Wednesday 19:33 kohler
+
+ * mmpfb/: main.cc (1.37), mmpfb.1 (1.35): make --minimize the
+ default; and when --minimize is on, force some values to integers
+
+2003-07-30 Wednesday 19:33 kohler
+
+ * mmpfb/: myfont.cc (1.37), myfont.hh (1.13): add ability to round
+ values to integers
+
+2003-07-30 Wednesday 19:32 kohler
+
+ * mmpfb/t1minimize.cc (1.2): include font header comments even in
+ minimized fonts
+
+2003-07-30 Wednesday 16:49 kohler
+
+ * mmpfb/t1rewrit.cc (1.35): remove debugging
+
+2003-07-30 Wednesday 15:30 kohler
+
+ * mmpfb/t1rewrit.cc (1.34): debugging
+
+2003-07-30 Wednesday 15:20 kohler
+
+ * mmpfb/t1rewrit.cc (1.33): debugging
+
+2003-07-30 Wednesday 15:03 kohler
+
+ * mmpfb/t1rewrit.cc (1.32): debugging
+
+2003-07-30 Wednesday 14:29 kohler
+
+ * mmafm/main.cc (1.32), mmpfb/main.cc (1.36), mmpfb/myfont.cc
+ (1.36), mmpfb/myfont.hh (1.12), mmpfb/t1rewrit.cc (1.31),
+ mmpfb/t1rewrit.hh (1.16): adapt to libefont changes
+
+2003-07-30 Wednesday 11:57 kohler
+
+ * configure.in (1.44): HAVE_ADDRESSABLE_VA_LIST configury
+
+2003-07-24 Thursday 12:17 kohler
+
+ * mmpfb/: t1rewrit.cc (1.30), t1rewrit.hh (1.15): use the global
+ Type1CharstringGen
+
+2003-07-15 Tuesday 06:43 kohler
+
+ * NEWS (1.28), README (1.19), configure.in (1.43), glyphlist.txt
+ (1.6), cfftot1/cfftot1.1 (1.19), otftotfm/dvipsencoding.cc
+ (1.22), otftotfm/gsubencoding.cc (1.23), otftotfm/gsubencoding.hh
+ (1.21), otftotfm/otftotfm.1 (1.41), otftotfm/secondary.cc (1.3),
+ otftotfm/secondary.hh (1.3): support "emptyslot"
+
+2003-07-09 Wednesday 14:55 kohler
+
+ * NEWS (1.27): newslet
+
+2003-07-09 Wednesday 13:56 kohler
+
+ * glyphlist.txt (1.5), otftotfm/otftotfm.1 (1.40),
+ otftotfm/secondary.cc (1.2), otftotfm/secondary.hh (1.2): use
+ correct Unicode code points for cwm (zwnj) and visualspace; and
+ document synthetic characters in the man page
+
+2003-07-09 Wednesday 12:41 kohler
+
+ * configure.in (1.42): to 0.18: configury for whether va_list is
+ addressable
+
+2003-07-09 Wednesday 12:37 kohler
+
+ * mmafm/mmafm.1 (1.33), mmpfb/mmpfb.1 (1.34): to 1.23: check
+ whether va_list is addressable
+
+2003-07-09 Wednesday 11:03 kohler
+
+ * NEWS (1.26), README (1.18), configure.in (1.41),
+ cfftot1/cfftot1.1 (1.18), otftotfm/otftotfm.1 (1.39): to 0.18
+
+2003-07-09 Wednesday 10:31 kohler
+
+ * otftotfm/otftotfm.cc (1.49): new CharstringBounds interface; and
+ RULE marks the boundser
+
+2003-07-09 Wednesday 10:09 kohler
+
+ * otftotfm/otftotfm.cc (1.48): avoid memory leak (why not)
+
+2003-07-09 Wednesday 10:07 kohler
+
+ * NEWS (1.25), otftotfm/Makefile.am (1.16),
+ otftotfm/gsubencoding.cc (1.22), otftotfm/gsubencoding.hh (1.20),
+ otftotfm/otftotfm.cc (1.47), otftotfm/secondary.cc (1.1),
+ otftotfm/secondary.hh (1.1): GsubEncoding supports fake ligatures
+ and other faked characters
+
+2003-07-09 Wednesday 10:02 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.21), dvipsencoding.hh (1.16):
+ store unicodes() for easy access, and make_gsub_encoding() can
+ call a Secondary for missing glyphs
+
+2003-07-09 Wednesday 10:01 kohler
+
+ * glyphlist.txt (1.4): add cwm, visualspace, and Germandbls
+
+2003-07-08 Tuesday 15:34 kohler
+
+ * configure.in (1.40): configury nitlets
+
+2003-07-08 Tuesday 15:25 kohler
+
+ * acconfig.h (1.9), configure.in (1.39): move to autoconf-2.57
+ whole hog
+
+2003-07-08 Tuesday 14:50 kohler
+
+ * configure.in (1.38): <sys/types.h>
+
+2003-07-08 Tuesday 14:48 kohler
+
+ * configure.in (1.37): add check for byteorder.h (Mingw32?)
+
+2003-07-07 Monday 12:50 kohler
+
+ * otftotfm/otftotfm.cc (1.46): try to print reals so fontinst wont
+ choke
+
+2003-07-07 Monday 12:50 kohler
+
+ * glyphlist.txt (1.3): encode new dotlessj
+
+2003-07-07 Monday 09:31 kohler
+
+ * otftotfm/dvipsencoding.hh (1.15): support new-style
+ glyphlist.txt, which lists multiple possibilities for a glyph,
+ and allow nonspaced semicolons in LIGKERN/UNICODING, and fix
+ infinite loop reported by Marco
+
+2003-07-07 Monday 09:31 kohler
+
+ * otftotfm/dvipsencoding.cc (1.20): support new-style
+ glyphlist.txt, which lists multiple possibilities for a glyph,
+ and allow nonspaced semicolons in LIGKERN/UNICODING
+
+2003-07-07 Monday 09:30 kohler
+
+ * glyphlist.txt (1.2), texmathunicoding.txt (1.2): fold
+ texmathunicoding.txt (and Ng/ng encodings) into glyphlist.txt
+
+2003-07-06 Sunday 20:02 kohler
+
+ * NEWS (1.24), README (1.17), configure.in (1.36),
+ cfftot1/cfftot1.1 (1.17), otftotfm/dvipsencoding.cc (1.19),
+ otftotfm/dvipsencoding.hh (1.14), otftotfm/gsubencoding.cc
+ (1.21), otftotfm/gsubencoding.hh (1.19), otftotfm/otftotfm.1
+ (1.38), otftotfm/otftotfm.cc (1.45): to 0.17: improve heuristics,
+ remove LIGKERN-killed ligatures from encoding
+
+2003-07-06 Sunday 16:25 kohler
+
+ * otftotfm/otftotfm.1 (1.37): nit
+
+2003-07-06 Sunday 16:20 kohler
+
+ * NEWS (1.23): to version 0.16
+
+2003-07-06 Sunday 14:37 kohler
+
+ * NEWS (1.22), texmathunicoding.txt (1.1): add texmathunicoding.txt
+
+2003-07-06 Sunday 11:11 kohler
+
+ * NEWS (1.20), otftotfm/dvipsencoding.cc (1.18),
+ otftotfm/dvipsencoding.hh (1.13), otftotfm/otftotfm.1 (1.36),
+ otftotfm/otftotfm.cc (1.44), NEWS (1.21): support --codingscheme
+ option; check for too-long and parenthesis-containing; document;
+ add --unicoding
+
+2003-07-06 Sunday 00:09 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.17), dvipsencoding.hh (1.12),
+ gsubencoding.hh (1.18), otftotfm.cc (1.43): % CODINGSCHEME
+ support, and use different design units to be friendlier to
+ fontinst (Marco Kuhlmann)
+
+2003-07-05 Saturday 14:10 kohler
+
+ * NEWS (1.19), otftotfm/automatic.cc (1.13), otftotfm/otftotfm.1
+ (1.35): store dvips files in TEXMF/dvips/VENDOR
+
+2003-07-05 Saturday 13:54 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.16), dvipsencoding.hh (1.11),
+ gsubencoding.cc (1.20), gsubencoding.hh (1.17), otftotfm.cc
+ (1.42): remove O(n^2) algorithms, and sort ligatures by a
+ preference score, so we include only the "best" ones when there
+ isnt encoding space for all
+
+2003-07-04 Friday 14:28 kohler
+
+ * NEWS (1.18), README (1.16), configure.in (1.35),
+ cfftot1/cfftot1.1 (1.16), otftotfm/dvipsencoding.cc (1.15),
+ otftotfm/dvipsencoding.hh (1.10), otftotfm/otftotfm.1 (1.34),
+ otftotfm/otftotfm.cc (1.41): add --ligkern option, and
+ --automatic removes old .vf files
+
+2003-07-04 Friday 13:24 kohler
+
+ * cfftot1/cfftot1.1 (1.15): make things clear
+
+2003-07-04 Friday 00:01 kohler
+
+ * otftotfm/otftotfm.1 (1.33): nit
+
+2003-07-03 Thursday 23:59 kohler
+
+ * otftotfm/otftotfm.1 (1.32): man page additions
+
+2003-07-03 Thursday 23:47 kohler
+
+ * NEWS (1.17), README (1.15), configure.in (1.34),
+ cfftot1/cfftot1.1 (1.14), otftotfm/otftotfm.1 (1.31): version
+ update
+
+2003-07-03 Thursday 23:47 kohler
+
+ * otftotfm/otftotfm.cc (1.40): clear out vectors of Substitutions
+ and Positionings to avoid re-application
+
+2003-07-03 Thursday 14:31 kohler
+
+ * otftotfm/: Makefile.am (1.15), gsubencoding.cc (1.19),
+ gsubencoding.hh (1.16), otftotfm.cc (1.39): work towards ExPonto
+ -fcalt
+
+2003-07-02 Wednesday 16:25 kohler
+
+ * otftotfm/gsubencoding.cc (1.18): remove useless static function
+
+2003-07-02 Wednesday 16:21 kohler
+
+ * NEWS (1.16), README (1.14), configure.in (1.33),
+ cfftot1/cfftot1.1 (1.13), otftotfm/otftotfm.1 (1.30): versionize
+
+2003-07-02 Wednesday 16:14 kohler
+
+ * otftotfm/: otftotfm.1 (1.29), otftotfm.cc (1.38): remove virtual
+ font from psfonts.map, and add --letterspacing option
+
+2003-07-02 Wednesday 16:13 kohler
+
+ * otftotfm/: gsubencoding.cc (1.17), gsubencoding.hh (1.15):
+ chained positionings support letterspacing
+
+2003-07-02 Wednesday 16:13 kohler
+
+ * otftotfm/automatic.cc (1.12): support removing a font from the
+ psfonts.map (useful for virtual fonts)
+
+2003-06-29 Sunday 17:48 kohler
+
+ * NEWS (1.15), configure.in (1.32), otftotfm/automatic.cc (1.11),
+ otftotfm/dvipsencoding.cc (1.14), otftotfm/dvipsencoding.hh
+ (1.9), otftotfm/gsubencoding.cc (1.16), otftotfm/gsubencoding.hh
+ (1.14), otftotfm/otftotfm.cc (1.37): hypothetically support left
+ context
+
+2003-06-27 Friday 09:54 kohler
+
+ * Makefile.am (1.15), NEWS (1.14), README (1.13), configure.in
+ (1.31), cfftot1/cfftot1.1 (1.12), otftotfm/otftotfm.1 (1.28):
+ versionize
+
+2003-06-27 Friday 09:38 kohler
+
+ * otftotfm/automatic.cc (1.10): error buglets reported by Bruce
+ DArcus: dont search for a writable texdir more than once; vendor
+ is never null string; error messages are a bit more verbose
+
+2003-06-26 Thursday 14:51 kohler
+
+ * otftotfm/: otftotfm.1 (1.26), otftotfm.1 (1.27): more manual nits
+
+2003-06-26 Thursday 14:39 kohler
+
+ * 7t.enc (1.1), Makefile.am (1.14), otftotfm/dvipsencoding.cc
+ (1.13), otftotfm/gsubencoding.cc (1.15), otftotfm/otftotfm.1
+ (1.25): diagnostics work
+
+2003-06-26 Thursday 12:56 kohler
+
+ * otftotfm/otftotfm.1 (1.24): nit
+
+2003-06-26 Thursday 12:54 kohler
+
+ * otftotfm/otftotfm.1 (1.23): more links in feature section
+
+2003-06-26 Thursday 12:50 kohler
+
+ * otftotfm/otftotfm.1 (1.22): spello
+
+2003-06-26 Thursday 12:47 kohler
+
+ * NEWS (1.13), README (1.12), configure.in (1.30),
+ cfftot1/cfftot1.1 (1.11), otftotfm/otftotfm.1 (1.21): to release
+ 0.11
+
+2003-06-26 Thursday 12:30 kohler
+
+ * otftotfm/: gsubencoding.cc (1.14), gsubencoding.hh (1.13),
+ otftotfm.1 (1.20), otftotfm.cc (1.36): support -ffina
+
+2003-06-26 Thursday 12:14 kohler
+
+ * otftotfm/: automatic.cc (1.9), dvipsencoding.cc (1.12),
+ gsubencoding.cc (1.13), gsubencoding.hh (1.12), otftotfm.1
+ (1.19), otftotfm.cc (1.35): support right-context single
+ substitution (-fcswh)
+
+2003-06-26 Thursday 01:20 kohler
+
+ * NEWS (1.12), README (1.11), configure.in (1.29),
+ cfftot1/cfftot1.1 (1.10): note buglet: update -ls-R for
+ encodings
+
+2003-06-26 Thursday 01:20 kohler
+
+ * otftotfm/: otftotfm.1 (1.18), otftotfm.cc (1.34): update manual,
+ and update ls-R for new encodings
+
+2003-06-25 Wednesday 16:56 kohler
+
+ * NEWS (1.11), README (1.10), configure.in (1.28),
+ cfftot1/cfftot1.1 (1.9), otftotfm/otftotfm.1 (1.17): prepare for
+ 0.9 distribution
+
+2003-06-24 Tuesday 23:01 kohler
+
+ * otftotfm/: automatic.cc (1.8), otftotfm.cc (1.33), util.cc (1.9),
+ util.hh (1.6): always remove directory components from names in
+ the mapfile; requested by Norbert
+
+2003-06-24 Tuesday 15:29 kohler
+
+ * COPYING (1.1), README (1.9), cfftot1/cfftot1.cc (1.16),
+ cfftot1/maket1font.cc (1.14), otftotfm/automatic.cc (1.7),
+ otftotfm/dvipsencoding.cc (1.11), otftotfm/gsubencoding.cc
+ (1.12), otftotfm/kpseinterface.c (1.3), otftotfm/otftotfm.cc
+ (1.32), otftotfm/util.cc (1.8), t1lint/cscheck.cc (1.8),
+ t1lint/t1lint.cc (1.8), t1testpage/t1testpage.cc (1.8): add
+ explicit GPL to files
+
+2003-06-24 Tuesday 14:00 kohler
+
+ * otftotfm/otftotfm.cc (1.31): nit
+
+2003-06-24 Tuesday 12:30 kohler
+
+ * configure.in (1.27), otftotfm/Makefile.am (1.14): fix configury
+ problems reported by Norbert Preining and Bruce D'Arcus
+
+2003-06-24 Tuesday 12:30 kohler
+
+ * otftotfm/kpseinterface.c (1.2): #include <kpathsea/config.h> to
+ get necessary symbols
+
+2003-06-23 Monday 19:44 kohler
+
+ * otftotfm/: automatic.cc (1.6), otftotfm.cc (1.30): more error
+ messages (missing encoding is a fatal error; warn on no writable
+ $TEXMF), and do not create ls-R
+
+2003-06-23 Monday 18:41 kohler
+
+ * otftotfm/otftotfm.1 (1.16): whoops, manpagelet
+
+2003-06-23 Monday 18:35 kohler
+
+ * NEWS (1.10), README (1.8), configure.in (1.26), cfftot1/cfftot1.1
+ (1.8), otftotfm/otftotfm.1 (1.15): update version to 0.8
+
+2003-06-23 Monday 18:13 kohler
+
+ * NEWS (1.9), otftotfm/otftotfm.1 (1.14): more manual nits
+
+2003-06-23 Monday 17:47 kohler
+
+ * otftotfm/: automatic.cc (1.5), automatic.hh (1.4), otftotfm.1
+ (1.13), otftotfm.cc (1.29): manual fixes
+
+2003-06-23 Monday 14:15 kohler
+
+ * Makefile.am (1.13), configure.in (1.25), otftotfm/Makefile.am
+ (1.13): remove old directory
+
+2003-06-23 Monday 02:20 kohler
+
+ * configure.in (1.24), otftotfm/Makefile.am (1.12),
+ otftotfm/automatic.cc (1.4), otftotfm/automatic.hh (1.3),
+ otftotfm/kpseinterface.c (1.1), otftotfm/kpseinterface.h (1.1),
+ otftotfm/otftotfm.cc (1.28), otftotfm/util.cc (1.7),
+ otftotfm/util.hh (1.5): use C kpathsearch interface, for speed;
+ add --no-create and --verbose options; some nits in how -a files
+ are named
+
+2003-06-20 Friday 19:51 kohler
+
+ * otftotfm/: automatic.cc (1.3), gsubencoding.cc (1.11),
+ gsubencoding.hh (1.11): default vendor is "lcdftools", not
+ "otftotfm"; make everything faster (profiling identified
+ GsubEncoding::encoding() as a bottleneck)
+
+2003-06-20 Friday 15:40 kohler
+
+ * otftotfm/: automatic.cc (1.2), automatic.hh (1.2), otftotfm.cc
+ (1.27), util.cc (1.6), util.hh (1.4): add support for --vendor,
+ and search for encodings with kpathsea
+
+2003-06-19 Thursday 23:25 kohler
+
+ * acconfig.h (1.8), configure.in (1.23), otftotfm/.cvsignore (1.3),
+ otftotfm/Makefile.am (1.11), otftotfm/automatic.cc (1.1),
+ otftotfm/automatic.hh (1.1), otftotfm/otftotfm.1 (1.12),
+ otftotfm/otftotfm.cc (1.26), otftotfm/util.cc (1.5),
+ otftotfm/util.hh (1.3): otftopl --automatic works with web2c
+
+2003-06-18 Wednesday 20:10 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.10), dvipsencoding.hh (1.8),
+ gsubencoding.cc (1.10), gsubencoding.hh (1.10), otftotfm.cc
+ (1.25): otftopl: moving towards new, more automatic story, and
+ support -f cpsp-like glyph positionings
+
+2003-06-16 Monday 21:15 kohler
+
+ * otftotfm/: gsubencoding.cc (1.9), gsubencoding.hh (1.9),
+ otftotfm.cc (1.24): warn when a feature cannot be represented
+
+2003-06-13 Friday 16:10 kohler
+
+ * Makefile.am (1.12), cfftot1/cfftot1.1 (1.7), otftotfm/otftotfm.1
+ (1.11): fix make versionize
+
+2003-06-13 Friday 16:09 kohler
+
+ * NEWS (1.8), README (1.7), configure.in (1.22): to version 0.7
+
+2003-06-13 Friday 16:08 kohler
+
+ * cfftot1/maket1font.cc (1.13): fix crash on MinionPro-It: remember
+ that a glyph can call a subroutine multiple times
+
+2003-06-13 Friday 16:08 kohler
+
+ * otftotfm/: gsubencoding.cc (1.8), gsubencoding.hh (1.8),
+ otftotfm.cc (1.23): include better error messages when shrinking
+ an encoding (was in 0.6, but not checked in)
+
+2003-06-12 Thursday 10:18 kohler
+
+ * NEWS (1.7), README (1.6), configure.in (1.21),
+ otftotfm/dvipsencoding.cc (1.9), otftotfm/dvipsencoding.hh (1.7):
+ better warnings in dvipsencoding
+
+2003-06-11 Wednesday 22:24 kohler
+
+ * otftotfm/dvipsencoding.cc (1.8): exit from DvipsEncoding::parse()
+ if you can't read the file
+
+2003-06-11 Wednesday 22:24 kohler
+
+ * t1lint/t1lint.cc (1.7): process stdin if no filename supplied
+
+2003-06-11 Wednesday 22:24 kohler
+
+ * otftotfm/: otftotfm.1 (1.10), otftotfm.cc (1.22): replace
+ --print-scripts with --query-scripts, add --qs and --qf, and use
+ new GsubLookup::unparse_automatics() interface
+
+2003-06-11 Wednesday 22:23 kohler
+
+ * cfftot1/: cfftot1.cc (1.15), maket1font.hh (1.4): remove "good
+ flex" noise, and make "bad flex" more informative; report errors
+ to an ErrorHandler
+
+2003-06-11 Wednesday 22:23 kohler
+
+ * cfftot1/maket1font.cc (1.12): remove "good flex" noise, and make
+ "bad flex" more informative; report errors to an ErrorHandler;
+ fix bad definitions for Subrs 1 and 2
+
+2003-06-05 Thursday 19:22 kohler
+
+ * mmafm/main.cc (1.31), mmpfb/main.cc (1.35): support -v as a
+ synonym for --version
+
+2003-06-05 Thursday 19:19 kohler
+
+ * NEWS (1.6), README (1.5), configure.in (1.20),
+ cfftot1/Makefile.am (1.9), cfftot1/cfftot1.1 (1.6),
+ cfftot1/cfftot1.cc (1.14), cfftot1/templatei.cc (1.4),
+ otftotfm/Makefile.am (1.10), otftotfm/otftotfm.1 (1.9),
+ otftotfm/otftotfm.cc (1.21), otftotfm/templatei.cc (1.5),
+ t1lint/Makefile.am (1.9), t1lint/templatei.cc (1.3),
+ t1testpage/Makefile.am (1.4), t1testpage/templatei.cc (1.3):
+ template reorganization for gcc-3.3
+
+2003-06-05 Thursday 19:14 kohler
+
+ * mmafm/Makefile.am (1.11), mmafm/mmafm.1 (1.32),
+ mmafm/templatei.cc (1.3), mmpfb/Makefile.am (1.12), mmpfb/mmpfb.1
+ (1.33), mmpfb/myfont.cc (1.35), mmpfb/templatei.cc (1.2): more
+ template nonsense
+
+2003-06-03 Tuesday 18:48 kohler
+
+ * otftotfm/otftotfm.cc (1.20): oops: calculate shear correctly
+
+2003-06-03 Tuesday 18:41 kohler
+
+ * NEWS (1.5), README (1.4), configure.in (1.19),
+ otftotfm/otftotfm.1 (1.8), otftotfm/otftotfm.cc (1.19): to 0.4:
+ add --extend and --slant
+
+2003-06-03 Tuesday 17:22 kohler
+
+ * otftotfm/otftotfm.cc (1.18): shift the command line to after the
+ encoding to attempt to please ps2pk (it failed, ps2pk is so lame,
+ but it was a start)
+
+2003-06-03 Tuesday 16:45 kohler
+
+ * otftotfm/otftotfm.cc (1.17): change AutoEnc_digest to
+ AutoEnc-digest to satisfy ps2pk
+
+2003-06-03 Tuesday 13:01 kohler
+
+ * Makefile.am (1.11), NEWS (1.4), README (1.3), configure.in
+ (1.18), cfftot1/cfftot1.1 (1.5), otftotfm/otftotfm.1 (1.7): new
+ version
+
+2003-06-03 Tuesday 13:01 kohler
+
+ * t1testpage/t1testpage.cc (1.7): nit
+
+2003-06-03 Tuesday 13:00 kohler
+
+ * cfftot1/maket1font.cc (1.11): don't include FontInfo dict if
+ theres no FontInfo, and account for the extra elements of the
+ Private dict with add_dict_size()
+
+2003-06-03 Tuesday 12:56 kohler
+
+ * mmpfb/: main.cc (1.34), myfont.cc (1.34), t1rewrit.cc (1.29):
+ quit early on invalid font, and adapt to libefont changes
+
+2003-06-03 Tuesday 12:56 kohler
+
+ * mmafm/mmafm.1 (1.31), mmpfb/mmpfb.1 (1.32): use .M for manpage
+ links
+
+2003-06-03 Tuesday 09:16 kohler
+
+ * otftotfm/util.cc (1.4): MS/DOS _setmode() to binary when
+ appropriate
+
+2003-06-03 Tuesday 09:16 kohler
+
+ * cfftot1/cfftot1.cc (1.13): MS/DOS _setmode() to binary when
+ appropriate; and bag when the CFF contains errors (VVV)
+
+2003-06-03 Tuesday 09:16 kohler
+
+ * NEWS (1.3), configure.in (1.17), cfftot1/cfftot1.1 (1.4),
+ otftotfm/otftotfm.1 (1.6): update to version 0.2: fix Vladimir
+ Volovich's bugs
+
+2003-06-03 Tuesday 08:15 kohler
+
+ * configure.in (1.16): ntoh[sl] configury
+
+2003-06-02 Monday 22:22 kohler
+
+ * otftotfm/: dvipsencoding.cc (1.7), dvipsencoding.hh (1.6),
+ gsubencoding.cc (1.7), gsubencoding.hh (1.7), otftotfm.1 (1.5),
+ otftotfm.cc (1.16): support {L} {K} {LK} {KL} LIGKERN commands;
+ document them; and don't output duplicate kerns
+
+2003-06-02 Monday 21:22 kohler
+
+ * README (1.2), cfftot1/Makefile.am (1.8), cfftot1/cfftot1.1 (1.3),
+ otftotfm/Makefile.am (1.9), otftotfm/otftotfm.1 (1.4): include
+ manual pages in distribution; manual pages contain links as .M;
+ fix README
+
+2003-06-02 Monday 18:00 kohler
+
+ * cfftot1/Makefile.am (1.7): duh
+
+2003-06-02 Monday 17:53 kohler
+
+ * Makefile.am (1.10), configure.in (1.15), cfftot1/cfftot1.1 (1.2),
+ otftotfm/dvipsencoding.cc (1.6), otftotfm/otftotfm.1 (1.3),
+ otftotfm/otftotfm.cc (1.15): nits and behavior changesw
+
+2003-06-01 Sunday 11:45 kohler
+
+ * configure.in (1.14), cfftot1/Makefile.am (1.6),
+ otftotfm/Makefile.am (1.8), otftotfm/otftotfm.1 (1.2),
+ otftotfm/otftotfm.cc (1.14), otftotfm/util.hh (1.2): add --tfm
+ option
+
+2003-06-01 Sunday 09:20 kohler
+
+ * mmafm/main.cc (1.30), mmpfb/main.cc (1.32), mmpfb/main.cc (1.33):
+ adapt to ErrorHandler changes
+
+2003-05-31 Saturday 23:29 kohler
+
+ * Makefile.am (1.9), NEWS (1.2), cfftot1/Makefile.am (1.5),
+ cfftot1/cfftot1.1 (1.1), cfftot1/cfftot1.cc (1.12),
+ otftotfm/Makefile.am (1.7), otftotfm/otftotfm.1 (1.1),
+ t1lint/Makefile.am (1.8): manual pages
+
+2003-05-31 Saturday 17:29 kohler
+
+ * configure.in (1.13), cfftot1/cfftot1.cc (1.11),
+ otftotfm/otftotfm.cc (1.12), otftotfm/util.cc (1.3),
+ t1lint/t1lint.cc (1.6), t1testpage/t1testpage.cc (1.6),
+ otftotfm/otftotfm.cc (1.13): support --print-features,
+ --print-scripts, etc
+
+2003-05-30 Friday 17:24 kohler
+
+ * Makefile.am (1.8), configure.in (1.12), cfftot1/maket1font.cc
+ (1.10), otftotfm/.cvsignore (1.2), otftotfm/Makefile.am (1.6),
+ otftotfm/otftotfm.cc (1.11): rename to otftopl; cfftot1 adapts to
+ Type1Interp changes
+
+2003-05-30 Friday 16:22 kohler
+
+ * cfftot1/cfftot1.cc (1.10), t1lint/t1lint.cc (1.5),
+ t1testpage/t1testpage.cc (1.5): ErrorHandler adaptation continued
+
+2003-05-30 Friday 16:21 kohler
+
+ * otftotfm/: Makefile.am (1.5), dvipsencoding.cc (1.5),
+ dvipsencoding.hh (1.5), gsubencoding.cc (1.6), gsubencoding.hh
+ (1.6), md5.c (1.1), md5.h (1.1), otftotfm.cc (1.10): creeping
+ toward usability
+
+2003-05-29 Thursday 23:24 kohler
+
+ * cfftot1/cfftot1.cc (1.9), otftotfm/dvipsencoding.cc (1.4),
+ otftotfm/dvipsencoding.hh (1.4), otftotfm/gsubencoding.cc (1.5),
+ otftotfm/gsubencoding.hh (1.5), otftotfm/otftotfm.cc (1.9),
+ otftotfm/util.cc (1.2), t1lint/t1lint.cc (1.4),
+ t1testpage/t1testpage.cc (1.4): adapt to ErrorHandler changes,
+ and apply LIGKERN statements to the output
+
+2003-05-29 Thursday 15:23 kohler
+
+ * cfftot1/cfftot1.cc (1.8), cfftot1/maket1font.cc (1.9),
+ cfftot1/maket1font.hh (1.3), otftotfm/dvipsencoding.cc (1.3),
+ otftotfm/dvipsencoding.hh (1.3), otftotfm/gsubencoding.cc (1.4),
+ otftotfm/gsubencoding.hh (1.4), otftotfm/otftotfm.cc (1.8):
+ adapt, and move towards a correct otftoafm
+
+2003-05-28 Wednesday 23:03 kohler
+
+ * libefont/Makefile.am (1.8), otftotfm/gsubencoding.cc (1.3),
+ otftotfm/gsubencoding.hh (1.3), otftotfm/otftotfm.cc (1.7): parse
+ GPOS
+
+2003-05-27 Tuesday 23:28 kohler
+
+ * Makefile.am (1.7), acconfig.h (1.7), configure.in (1.11),
+ glyphlist.txt (1.1), otftotfm/Makefile.am (1.4),
+ otftotfm/dvipsencoding.cc (1.2), otftotfm/dvipsencoding.hh (1.2),
+ otftotfm/gsubencoding.cc (1.2), otftotfm/gsubencoding.hh (1.2),
+ otftotfm/otftotfm.cc (1.6), otftotfm/util.cc (1.1),
+ otftotfm/util.hh (1.1): generate simple VPLs
+
+2003-05-25 Sunday 18:09 kohler
+
+ * otftotfm/: Makefile.am (1.3), dvipsencoding.cc (1.1),
+ dvipsencoding.hh (1.1), templatei.cc (1.4): moving towards DVIPS
+ encoding parsing
+
+2003-05-25 Sunday 02:18 kohler
+
+ * cfftot1/cfftot1.cc (1.7), libefont/Makefile.am (1.7),
+ otftotfm/Makefile.am (1.2), otftotfm/gsubencoding.cc (1.1),
+ otftotfm/gsubencoding.hh (1.1), otftotfm/otftotfm.cc (1.5),
+ otftotfm/templatei.cc (1.3): first version with GSUB support
+
+2003-05-23 Friday 12:52 kohler
+
+ * libefont/Makefile.am (1.6): otfdescrip
+
+2003-05-22 Thursday 19:06 kohler
+
+ * libefont/Makefile.am (1.5), otftotfm/otftotfm.cc (1.4): use new
+ GSUB format
+
+2003-02-10 Monday 16:34 kohler
+
+ * mmafm/mmafm.1 (1.30), mmpfb/mmpfb.1 (1.31): mminstance.spec, not
+ rpm.spec; and check that "make versionize" has been done
+
+2003-01-27 Monday 10:46 kohler
+
+ * acconfig.h (1.6), cfftot1/maket1font.cc (1.8), t1lint/cscheck.cc
+ (1.7): nit
+
+2003-01-05 Sunday 14:36 kohler
+
+ * mmpfb/main.cc (1.31): add --help entry for --minimize
+
+2003-01-05 Sunday 14:25 kohler
+
+ * mmafm/main.cc (1.29), mmafm/mmafm.1 (1.29), mmpfb/mmpfb.1 (1.30):
+ nitlets
+
+2003-01-05 Sunday 14:24 kohler
+
+ * mmafm/templatei.cc (1.2): remove useless instantiation
+
+2003-01-05 Sunday 14:24 kohler
+
+ * mmpfb/: t1rewrit.cc (1.28), t1rewrit.hh (1.14): add subroutine
+ renumbering
+
+2003-01-05 Sunday 14:23 kohler
+
+ * mmpfb/: myfont.cc (1.33), myfont.hh (1.11): interpolate FullName
+ as well as FontName; uncache FontName definition after
+ interpolation
+
+2003-01-05 Sunday 14:23 kohler
+
+ * mmpfb/: main.cc (1.30), t1minimize.cc (1.1), t1minimize.hh (1.1),
+ Makefile.am (1.11): add --minimize option; also, fill in Subrs
+ array
+
+2003-01-05 Sunday 09:30 kohler
+
+ * mmafm/Makefile.am (1.10), mmafm/hashmapi.cc (1.7), mmafm/mmafm.1
+ (1.28), mmafm/templatei.cc (1.1), mmafm/vectori.cc (1.9),
+ mmpfb/Makefile.am (1.10), mmpfb/hashmapi.cc (1.7), mmpfb/mmpfb.1
+ (1.29), mmpfb/templatei.cc (1.1), mmpfb/vectori.cc (1.8):
+ mminstance compiles again
+
+2003-01-02 Thursday 12:12 kohler
+
+ * cfftot1/cfftot1.cc (1.6), libefont/Makefile.am (1.4),
+ otftotfm/otftotfm.cc (1.3), otftotfm/templatei.cc (1.2): adapt to
+ changes
+
+2002-12-31 Tuesday 15:20 kohler
+
+ * otftotfm/otftotfm.cc (1.2): nitlet
+
+2002-12-31 Tuesday 13:48 kohler
+
+ * Makefile.am (1.6), configure.in (1.10), cfftot1/cfftot1.cc (1.5),
+ libefont/Makefile.am (1.3), liblcdf/Makefile.am (1.3),
+ otftotfm/.cvsignore (1.1), otftotfm/Makefile.am (1.1),
+ otftotfm/otftotfm.cc (1.1), otftotfm/templatei.cc (1.1): updates,
+ and add otftoafm
+
+2002-12-30 Monday 15:38 kohler
+
+ * cfftot1/Makefile.am (1.4), cfftot1/maket1font.cc (1.7),
+ cfftot1/point.cc (1.2), cfftot1/point.hh (1.2),
+ cfftot1/transform.cc (1.2), cfftot1/transform.hh (1.2),
+ liblcdf/Makefile.am (1.2), t1lint/Makefile.am (1.7),
+ t1lint/cscheck.cc (1.6), t1lint/cscheck.hh (1.5), t1lint/point.cc
+ (1.2), t1lint/point.hh (1.3): Point moved to liblcdf
+
+2002-12-30 Monday 13:36 kohler
+
+ * .cvsignore (1.3): nitlet
+
+2002-12-30 Monday 13:33 kohler
+
+ * .cvsignore (1.2), Makefile.am (1.5), configure.in (1.9),
+ cfftot1/Makefile.am (1.3), cfftot1/cfftot1.cc (1.4),
+ cfftot1/maket1font.cc (1.6), cfftot1/maket1font.hh (1.2),
+ cfftot1/templatei.cc (1.3), libefont/Makefile.am (1.2),
+ liblcdf/.cvsignore (1.1), liblcdf/Makefile.am (1.1),
+ t1lint/Makefile.am (1.6), t1lint/cscheck.cc (1.5),
+ t1lint/cscheck.hh (1.4), t1lint/t1lint.cc (1.3),
+ t1lint/templatei.cc (1.2), t1testpage/Makefile.am (1.3),
+ t1testpage/t1testpage.cc (1.3), t1testpage/templatei.cc (1.2):
+ adapt to new source file organization
+
+2002-12-30 Monday 10:14 kohler
+
+ * mmafm/Makefile.am (1.9), mmpfb/Makefile.am (1.9): further
+ adaptation
+
+2002-12-30 Monday 10:06 kohler
+
+ * mmafm/Makefile.am (1.8), mmafm/hashmapi.cc (1.6), mmafm/main.cc
+ (1.28), mmafm/vectori.cc (1.8), mmpfb/Makefile.am (1.8),
+ mmpfb/hashmapi.cc (1.6), mmpfb/main.cc (1.29), mmpfb/myfont.cc
+ (1.32), mmpfb/t1rewrit.cc (1.27), mmpfb/t1rewrit.hh (1.13),
+ mmpfb/vectori.cc (1.7): adapt to libefont and liblcdf
+ rearrangement
+
+2002-12-29 Sunday 22:16 kohler
+
+ * mmafm/Makefile.am (1.7), mmafm/main.cc (1.27), mmafm/vectori.cc
+ (1.7), mmpfb/Makefile.am (1.7), mmpfb/hashmapi.cc (1.5),
+ mmpfb/main.cc (1.28), mmpfb/myfont.cc (1.31), mmpfb/myfont.hh
+ (1.10), mmpfb/t1rewrit.cc (1.26), mmpfb/t1rewrit.hh (1.12): adapt
+ to libefont reorganization
+
+2002-12-12 Thursday 00:30 kohler
+
+ * cfftot1/: cfftot1.cc (1.3), maket1font.cc (1.5): cfftot1 produces
+ Subrs
+
+2002-12-10 Tuesday 16:00 kohler
+
+ * configure.in (1.8): configury fix
+
+2002-12-10 Tuesday 12:13 kohler
+
+ * acconfig.h (1.5), configure.in (1.7): new configury for uintXX_t
+ types et al
+
+2002-12-10 Tuesday 12:12 kohler
+
+ * cfftot1/maket1font.cc (1.4): more updates
+
+2002-12-10 Tuesday 12:05 kohler
+
+ * t1lint/cscheck.cc (1.4): use CharstringInterp::error_string()
+
+2002-12-10 Tuesday 10:30 kohler
+
+ * cfftot1/: maket1font.cc (1.3), templatei.cc (1.2): moving towards
+ subr adaptation
+
+2002-12-09 Monday 12:22 kohler
+
+ * configure.in (1.6): add -W as well as -Wall
+
+2002-12-09 Monday 12:22 kohler
+
+ * cfftot1/maket1font.cc (1.2): add Flex and hint replacement
+ support
+
+2002-12-08 Sunday 00:24 kohler
+
+ * cfftot1/Makefile.am (1.2), cfftot1/cfftot1.cc (1.2),
+ cfftot1/maket1font.cc (1.1), cfftot1/maket1font.hh (1.1),
+ cfftot1/point.cc (1.1), cfftot1/point.hh (1.1),
+ cfftot1/transform.cc (1.1), cfftot1/transform.hh (1.1),
+ t1lint/point.hh (1.2): first working version of cfftot1!
+
+2002-12-08 Sunday 00:22 kohler
+
+ * mmpfb/myfont.cc (1.30): adapt to libefont
+
+2002-12-07 Saturday 00:27 kohler
+
+ * Makefile.am (1.4), acconfig.h (1.4), configure.in (1.5),
+ cfftot1/.cvsignore (1.1), cfftot1/Makefile.am (1.1),
+ cfftot1/cfftot1.cc (1.1), cfftot1/templatei.cc (1.1),
+ libefont/.cvsignore (1.1), libefont/Makefile.am (1.1),
+ t1lint/.cvsignore (1.3), t1lint/Makefile.am (1.5),
+ t1lint/cscheck.cc (1.3), t1lint/cscheck.hh (1.3),
+ t1lint/hashmapi.cc (1.2), t1lint/t1lint.cc (1.2),
+ t1lint/templatei.cc (1.1), t1lint/vectori.cc (1.2),
+ t1testpage/.cvsignore (1.2), t1testpage/Makefile.am (1.2),
+ t1testpage/hashmapi.cc (1.2), t1testpage/t1testpage.cc (1.2),
+ t1testpage/templatei.cc (1.1), t1testpage/vectori.cc (1.2): name
+ cleanup, templatei not vectori
+
+2002-12-07 Saturday 00:16 kohler
+
+ * mmpfb/: t1rewrit.cc (1.25), t1rewrit.hh (1.11): more name changes
+
+2002-12-06 Friday 17:32 kohler
+
+ * mmafm/.cvsignore (1.3), mmafm/Makefile.am (1.6), mmpfb/.cvsignore
+ (1.3), mmpfb/Makefile.am (1.6): move to libefont instead of
+ separate t1lib and metricslib
+
+2002-12-04 Wednesday 22:56 kohler
+
+ * mmafm/main.cc (1.26), mmpfb/main.cc (1.27), mmpfb/myfont.cc
+ (1.29), mmpfb/myfont.hh (1.9), mmpfb/t1rewrit.cc (1.24),
+ mmpfb/t1rewrit.hh (1.10): fix bugs with regular Type 1
+ charstrings; keep track of, and compensate for, rounding error in
+ mmpfb
+
+2002-12-04 Wednesday 15:06 kohler
+
+ * mmafm/vectori.cc (1.6), mmpfb/t1rewrit.cc (1.23),
+ mmpfb/vectori.cc (1.6): CFF works!
+
+2002-12-04 Wednesday 10:01 kohler
+
+ * mmafm/main.cc (1.25), mmpfb/main.cc (1.26), mmpfb/myfont.cc
+ (1.28), mmpfb/myfont.hh (1.8), mmpfb/t1rewrit.cc (1.22): more
+ adaptations for Type 2 preparation, renamings and indentation
+
+2002-12-03 Tuesday 15:22 kohler
+
+ * mmpfb/: myfont.cc (1.27), t1rewrit.cc (1.21): conform to edlib
+ update
+
+2002-12-03 Tuesday 13:53 kohler
+
+ * mmpfb/t1rewrit.hh (1.9): adapt to t1lib changes
+
+2002-12-03 Tuesday 13:50 kohler
+
+ * mmafm/Makefile.am (1.5), mmpfb/Makefile.am (1.5), mmpfb/main.cc
+ (1.25), mmpfb/t1rewrit.cc (1.20): moving towards supporting Type
+ 2 fonts
+
+2002-10-05 Saturday 11:05 kohler
+
+ * mmafm/main.cc (1.24), mmpfb/main.cc (1.24), mmpfb/myfont.cc
+ (1.26), mmpfb/myfont.hh (1.7), mmpfb/t1rewrit.cc (1.19): use C++
+ names for C #includes
+
+2002-10-05 Saturday 09:11 kohler
+
+ * mmafm/mmafm.1 (1.27), mmpfb/mmpfb.1 (1.28): to 1.18
+
+2002-09-30 Monday 13:23 kohler
+
+ * mmafm/mmafm.1 (1.26), mmpfb/main.cc (1.23), mmpfb/mmpfb.1 (1.27),
+ mmpfb/myfont.cc (1.25): to 1.17
+
+2001-09-17 Monday 18:23 kohler
+
+ * mmafm/mmafm.1 (1.25), mmpfb/mmpfb.1 (1.26): 1.16.3: mac os x
+
+2001-09-11 Tuesday 04:47 kohler
+
+ * mmpfb/t1rewrit.cc (1.18): final math nitlet: want same result on
+ different platforms, despite use of floating point; this seems to
+ do the trick
+
+2001-09-11 Tuesday 04:38 kohler
+
+ * mmpfb/: t1rewrit.cc (1.14), t1rewrit.hh (1.8), t1rewrit.cc
+ (1.15), t1rewrit.cc (1.16), t1rewrit.cc (1.17): more math crap
+
+2001-09-10 Monday 11:42 kohler
+
+ * mmafm/main.cc (1.23): correct --help
+
+2001-09-06 Thursday 11:30 kohler
+
+ * mmafm/hashmapi.cc (1.5), mmafm/mmafm.1 (1.24), mmafm/vectori.cc
+ (1.5), mmpfb/mmpfb.1 (1.25), mmpfb/myfont.cc (1.24),
+ mmpfb/t1rewrit.cc (1.13): compilation fixes from Beebe
+
+2001-07-15 Sunday 18:43 kohler
+
+ * mmafm/main.cc (1.22), mmafm/mmafm.1 (1.23), mmpfb/main.cc (1.22),
+ mmpfb/mmpfb.1 (1.24), mmpfb/t1rewrit.cc (1.12): to mminstance
+ 1.16.1: playing with inlines
+
+2001-06-18 Monday 14:07 kohler
+
+ * mmafm/mmafm.1 (1.22), mmpfb/mmpfb.1 (1.23): to 1.16
+
+2000-11-04 Saturday 10:51 eddietwo
+
+ * mmpfb/myfont.cc (1.23): changes to support gcc-2.96
+
+2000-07-12 Wednesday 11:39 eddietwo
+
+ * mmpfb/t1rewrit.cc (1.11), mmafm/mmafm.1 (1.21), mmpfb/mmpfb.1
+ (1.22): 1.15
+
+2000-06-22 Thursday 20:12 eddietwo
+
+ * mmpfb/: myfont.cc (1.22), myfont.hh (1.6): x
+
+2000-04-20 Thursday 07:29 eddietwo
+
+ * Makefile.am (1.3), configure.in (1.4), t1lint/Makefile.am (1.4),
+ t1lint/main.cc (1.6), t1lint/t1lint.cc (1.1),
+ t1testpage/.cvsignore (1.1), t1testpage/Makefile.am (1.1),
+ t1testpage/hashmapi.cc (1.1), t1testpage/t1testpage.cc (1.1),
+ t1testpage/vectori.cc (1.1): added t1testpage
+
+2000-04-20 Thursday 07:27 eddietwo
+
+ * mmafm/mmafm.1 (1.20), mmpfb/mmpfb.1 (1.21): versionize
+
+2000-04-20 Thursday 07:26 eddietwo
+
+ * mmpfb/: main.cc (1.21), myfont.cc (1.21): to v1.13 (synthetic
+ fonts)
+
+2000-04-06 Thursday 14:50 eddietwo
+
+ * mmafm/Makefile.am (1.4), mmpfb/Makefile.am (1.4): CLEANFILES
+
+2000-04-05 Wednesday 08:45 eddietwo
+
+ * mmafm/.cvsignore (1.2), mmafm/Makefile.am (1.3), mmafm/main.cc
+ (1.21), mmafm/mmafm.1 (1.19), mmpfb/.cvsignore (1.2),
+ mmpfb/Makefile.am (1.3), mmpfb/mmpfb.1 (1.20), mmpfb/myfont.cc
+ (1.20), mmpfb/t1rewrit.cc (1.10), mmpfb/t1rewrit.hh (1.7):
+ updates for new straccum/edlib/metricslib; fixed mmpfb
+
+2000-04-05 Wednesday 08:40 eddietwo
+
+ * Makefile.am (1.2), configure.in (1.3), t1lint/.cvsignore (1.2),
+ t1lint/Makefile.am (1.3), t1lint/cscheck.cc (1.2),
+ t1lint/cscheck.hh (1.2): better error messages in t1lint
+
+2000-04-03 Monday 08:01 eddietwo
+
+ * mmafm/main.cc (1.20), mmafm/mmafm.1 (1.18), mmpfb/mmpfb.1 (1.19):
+ include
+
+2000-02-21 Monday 13:59 eddietwo
+
+ * mmafm/mmafm.1 (1.17), mmpfb/mmpfb.1 (1.18), mmpfb/myfont.cc
+ (1.19): r1_10
+
+2000-01-18 Tuesday 08:00 eddietwo
+
+ * mmafm/mmafm.1 (1.16), mmpfb/mmpfb.1 (1.17), mmpfb/t1rewrit.cc
+ (1.9): fixed UNKDOUBLE bug and error buffer overrun
+
+2000-01-17 Monday 11:12 eddietwo
+
+ * acconfig.h (1.3), configure.in (1.2), t1lint/.cvsignore (1.1),
+ t1lint/main.cc (1.5): updates
+
+2000-01-10 Monday 20:03 eddietwo
+
+ * mmpfb/: t1rewrit.cc (1.8), t1rewrit.hh (1.6): mminstance 1.8
+
+2000-01-10 Monday 08:39 eddietwo
+
+ * mmafm/main.cc (1.19), mmafm/mmafm.1 (1.15), mmpfb/main.cc (1.20),
+ mmpfb/mmpfb.1 (1.16), mmpfb/myfont.cc (1.18): copyright changes,
+ updated for thanh
+
+1999-12-30 Thursday 13:59 eddietwo
+
+ * mmafm/mmafm.1 (1.14), mmpfb/mmpfb.1 (1.15): version 1.7
+
+1999-12-19 Sunday 18:40 eddietwo
+
+ * mmpfb/main.cc (1.19): error-related
+
+1999-11-28 Sunday 15:12 eddietwo
+
+ * mmafm/mmafm.1 (1.13): %8g not %g; man page rearrange
+
+1999-11-28 Sunday 14:48 eddietwo
+
+ * mmafm/main.cc (1.18), mmafm/mmafm.1 (1.12), mmpfb/mmpfb.1 (1.14):
+ to 1.6
+
+1999-07-04 Sunday 17:12 eddietwo
+
+ * mmpfb/: main.cc (1.18), mmpfb.1 (1.13), t1rewrit.cc (1.7): 1.5
+
+1999-07-04 Sunday 15:01 eddietwo
+
+ * mmpfb/myfont.cc (1.17): dont kill things you dont understand
+
+1999-07-04 Sunday 14:55 eddietwo
+
+ * mmpfb/: myfont.cc (1.15), myfont.cc (1.16): dont get rid of
+ dictionaries inside Blend
+
+1999-07-04 Sunday 14:36 eddietwo
+
+ * mmpfb/: main.cc (1.17), myfont.cc (1.14), t1rewrit.cc (1.6),
+ t1rewrit.hh (1.5): added --subrs
+
+1999-06-30 Wednesday 08:41 eddietwo
+
+ * t1lint/main.cc (1.4): oopses
+
+1999-06-30 Wednesday 08:37 eddietwo
+
+ * t1lint/main.cc (1.3): thingies
+
+1999-06-30 Wednesday 08:22 eddietwo
+
+ * t1lint/main.cc (1.2): in response to error/landmark updates
+
+1999-06-29 Tuesday 15:04 eddietwo
+
+ * t1lint/: cscheck.cc (1.1), cscheck.hh (1.1), hashmapi.cc (1.1),
+ main.cc (1.1), point.cc (1.1), point.hh (1.1), vectori.cc (1.1):
+ added ifles
+
+1999-06-29 Tuesday 15:03 eddietwo
+
+ * acconfig.h (1.2), t1lint/Makefile.am (1.2): t1lint
+
+1999-06-29 Tuesday 12:54 eddietwo
+
+ * mmafm/main.cc (1.17), mmpfb/main.cc (1.16), mmpfb/mmpfb.1 (1.12),
+ mmpfb/myfont.cc (1.13), mmpfb/myfont.hh (1.5), mmpfb/t1rewrit.cc
+ (1.5), mmpfb/t1rewrit.hh (1.4): changed to align with new
+ ErrorHandler
+
+1999-06-29 Tuesday 10:05 eddietwo
+
+ * .cvsignore (1.1), INSTALL (1.1), Makefile.am (1.1), NEWS (1.1),
+ README (1.1), acconfig.h (1.1), configure.in (1.1),
+ t1lint/Makefile.am (1.1): first version
+
+1999-06-28 Monday 11:50 eddietwo
+
+ * mmafm/mmafm.1 (1.10), mmpfb/mmpfb.1 (1.10), mmafm/mmafm.1 (1.11),
+ mmpfb/mmpfb.1 (1.11): manual fixes
+
+1999-06-28 Monday 11:45 eddietwo
+
+ * mmafm/main.cc (1.16), mmafm/mmafm.1 (1.9), mmpfb/main.cc (1.15),
+ mmpfb/mmpfb.1 (1.9): interpolate an instance by name
+
+1999-06-26 Saturday 10:33 eddietwo
+
+ * mmafm/mmafm.1 (1.8), mmpfb/mmpfb.1 (1.8), mmpfb/myfont.cc (1.12):
+ to 1.4.1
+
+1999-06-25 Friday 14:34 eddietwo
+
+ * mmafm/mmafm.1 (1.7), mmpfb/mmpfb.1 (1.7), mmpfb/myfont.cc (1.11),
+ mmpfb/myfont.hh (1.4): to mminstance-1.4
+
+1999-05-21 Friday 13:17 eddietwo
+
+ * mmafm/hashmapi.cc (1.4), mmafm/vectori.cc (1.4),
+ mmpfb/hashmapi.cc (1.4), mmpfb/myfont.cc (1.10), mmpfb/myfont.hh
+ (1.3), mmpfb/t1rewrit.cc (1.4), mmpfb/t1rewrit.hh (1.3),
+ mmpfb/vectori.cc (1.5): pragmendectomy
+
+1999-05-21 Friday 13:00 eddietwo
+
+ * mmafm/mmafm.1 (1.6), mmpfb/mmpfb.1 (1.6): versionize
+
+1999-05-21 Friday 12:45 eddietwo
+
+ * mmafm/main.cc (1.15), mmpfb/main.cc (1.14), mmpfb/myfont.cc
+ (1.9), mmpfb/t1rewrit.cc (1.3), mmpfb/t1rewrit.hh (1.2): - got
+ rid of #pragmas - STL interface conformance
+
+1999-04-11 Sunday 15:05 eddietwo
+
+ * mmafm/main.cc (1.14), mmpfb/main.cc (1.13): second instance of
+ 1.3; changed --help text layout
+
+1999-04-11 Sunday 14:57 eddietwo
+
+ * mmafm/mmafm.1 (1.5), mmpfb/mmpfb.1 (1.5): to version 1.3
+
+1999-01-25 Monday 09:03 eddietwo
+
+ * mmafm/main.cc (1.13), mmpfb/main.cc (1.12): probably just error
+ messages
+
+1999-01-24 Sunday 11:40 eddietwo
+
+ * mmpfb/: main.cc (1.11), mmpfb.1 (1.4), myfont.cc (1.8),
+ vectori.cc (1.4): accepts --quiet, uses PsresDatabase
+
+1999-01-24 Sunday 11:40 eddietwo
+
+ * mmafm/: main.cc (1.12), mmafm.1 (1.4), vectori.cc (1.3): now runs
+ mmpfb to get the AMCP program
+
+1999-01-22 Friday 14:55 eddietwo
+
+ * mmafm/hashmapi.cc (1.3), mmafm/main.cc (1.11), mmafm/vectori.cc
+ (1.2), mmpfb/hashmapi.cc (1.3), mmpfb/main.cc (1.10),
+ mmpfb/myfont.cc (1.7), mmpfb/t1rewrit.cc (1.2), mmpfb/vectori.cc
+ (1.3): config.hized
+
+1999-01-12 Tuesday 11:56 eddietwo
+
+ * mmafm/.cvsignore (1.1), mmpfb/.cvsignore (1.1): more .cvsignores
+
+1999-01-12 Tuesday 11:54 eddietwo
+
+ * mmafm/Makefile.am (1.2), mmafm/mmafm.1 (1.3), mmpfb/Makefile.am
+ (1.2), mmpfb/mmpfb.1 (1.3), mmpfb/myfont.cc (1.6): fixed mmpfb
+ (maybe); to 1.3b1
+
+1999-01-02 Saturday 14:24 eddietwo
+
+ * mmpfb/myfont.cc (1.5): added a comment about the final underscore
+ in the font name
+
+1998-12-18 Friday 16:20 eddietwo
+
+ * mmafm/mmafm.1 (1.2), mmpfb/mmpfb.1 (1.2): actually 1.2
+
+1998-12-18 Friday 15:57 eddietwo
+
+ * mmpfb/main.cc (1.9): short_usage label removed
+
+1998-12-18 Friday 15:50 eddietwo
+
+ * mmafm/Makefile.am (1.1), mmafm/Makefile.in (1.12), mmafm/main.cc
+ (1.10), mmafm/mmafm.1 (1.1), mmafm/mmafm.man (1.3),
+ mmpfb/Makefile.am (1.1), mmpfb/Makefile.in (1.13), mmpfb/main.cc
+ (1.8), mmpfb/mmpfb.1 (1.1), mmpfb/mmpfb.man (1.3): initial switch
+ to 1.2
+
+1998-09-27 Sunday 12:58 eddietwo
+
+ * mmpfb/Makefile.in (1.12): nmakefile stuff
+
+1998-09-27 Sunday 12:57 eddietwo
+
+ * mmafm/Makefile.in (1.11), mmpfb/Makefile.in (1.11): LIBS
+
+1998-09-27 Sunday 12:52 eddietwo
+
+ * mmafm/Makefile.in (1.10), mmpfb/Makefile.in (1.10): VPATH making
+
+1998-09-26 Saturday 21:49 eddietwo
+
+ * mmpfb/: Makefile.in (1.9), main.cc (1.7), mmpfb.man (1.2),
+ myfont.cc (1.4), myfont.hh (1.2), t1rewrit.cc (1.1), t1rewrit.hh
+ (1.1), vectori.cc (1.2): * moved install target into local
+ makefile * changes for GNUCODSTD * improved mmpfb a lot (does a
+ better job)
+
+1998-09-26 Saturday 21:49 eddietwo
+
+ * mmafm/: Makefile.in (1.9), main.cc (1.9), mmafm.man (1.2): *
+ moved install target into local makefile * changes for GNUCODSTD
+
+1998-09-18 Friday 10:34 eddietwo
+
+ * mmafm/main.cc (1.8), mmpfb/main.cc (1.6): That's right: message
+ removed
+
+1998-09-17 Thursday 09:51 eddietwo
+
+ * mmafm/Makefile.in (1.8), mmpfb/Makefile.in (1.8): more
+ configuration
+
+1998-09-16 Wednesday 18:10 eddietwo
+
+ * mmafm/mmafm.man (1.1), mmpfb/mmpfb.man (1.1): forgot the man
+ pages
+
+1998-09-16 Wednesday 18:10 eddietwo
+
+ * mmafm/Makefile.in (1.7), mmafm/mmafm.min (1.3), mmpfb/Makefile.in
+ (1.7), mmpfb/mmpfb.min (1.3): to 1.0; mostly config changes
+
+1998-09-02 Wednesday 12:00 eddietwo
+
+ * mmafm/Makefile.in (1.6), mmafm/main.cc (1.7), mmpfb/Makefile.in
+ (1.6), mmpfb/main.cc (1.5): changes from summer
+
+1998-05-25 Monday 23:32 eddietwo
+
+ * mmafm/Makefile.in (1.5), mmpfb/Makefile.in (1.5): Makefile.in
+ cosmetics
+
+1998-05-15 Friday 14:24 eddietwo
+
+ * mmafm/main.cc (1.6): changes to 0.91 (mmafm bug fixes)
+
+1998-04-07 Tuesday 14:45 eddietwo
+
+ * mmafm/hashmapi.cc (1.2), mmpfb/hashmapi.cc (1.2): #pragma
+ implementation
+
+1998-04-07 Tuesday 14:42 eddietwo
+
+ * mmpfb/myfont.cc (1.3): Changes to work with t1lib
+
+1998-04-03 Friday 06:32 eddietwo
+
+ * mmafm/main.cc (1.5), mmpfb/main.cc (1.4), mmpfb/myfont.cc (1.2):
+ Changes to keep up with t1lib,etc.
+
+1998-03-27 Friday 11:30 eddietwo
+
+ * mmafm/Makefile.in (1.4), mmafm/main.cc (1.4), mmpfb/Makefile.in
+ (1.4), mmpfb/main.cc (1.3): FontFinder -> MetricsFinder and
+ Type1MMSpace::create --> Type1Font
+
+1998-03-04 Wednesday 10:15 eddietwo
+
+ * mmafm/Makefile.in (1.3), mmafm/main.cc (1.3), mmpfb/Makefile.in
+ (1.3), mmpfb/main.cc (1.2): changed configuration and 1997 ->
+ 1997-8
+
+1998-03-04 Wednesday 09:43 eddietwo
+
+ * mmafm/Makefile.in (1.2), mmafm/mmafm.min (1.2), mmpfb/Makefile.in
+ (1.2), mmpfb/mmpfb.min (1.2): Changed installation; added `-o
+ t1mm.o' to submakefiles
+
+1998-03-04 Wednesday 09:31 eddietwo
+
+ * mmafm/main.cc (1.2), mmafm/mmafm.min (1.1), mmpfb/mmpfb.min
+ (1.1): Added manual pages; v0.8->v0.9
+
+1998-03-03 Tuesday 15:19 eddietwo
+
+ * mmafm/Makefile.in (1.1), mmafm/hashmapi.cc (1.1), mmafm/main.cc
+ (1.1), mmafm/vectori.cc (1.1), mmpfb/Makefile.in (1.1),
+ mmpfb/hashmapi.cc (1.1), mmpfb/main.cc (1.1), mmpfb/myfont.cc
+ (1.1), mmpfb/myfont.hh (1.1), mmpfb/vectori.cc (1.1): Initial
+ revision
+
diff --git a/Build/source/utils/lcdf-typetools/INSTALL b/Build/source/utils/lcdf-typetools/INSTALL
new file mode 100644
index 00000000000..95d84c820fb
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Build/source/utils/lcdf-typetools/Makefile.am b/Build/source/utils/lcdf-typetools/Makefile.am
new file mode 100644
index 00000000000..969122a18f0
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/Makefile.am
@@ -0,0 +1,71 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign check-news
+
+SUBDIRS = liblcdf libefont @SELECTED_SUBDIRS@
+DIST_SUBDIRS = liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage
+
+pkgdata_DATA = glyphlist.txt 7t.enc
+
+EXTRA_DIST = \
+ ONEWS \
+ lcdf-typetools.spec \
+ include/lcdf/bezier.hh \
+ include/lcdf/clp.h \
+ include/lcdf/error.hh \
+ include/lcdf/filename.hh \
+ include/lcdf/globmatch.hh \
+ include/lcdf/hashmap.hh include/lcdf/hashmap.cc \
+ include/lcdf/inttypes.h \
+ include/lcdf/landmark.hh \
+ include/lcdf/permstr.hh \
+ include/lcdf/point.hh \
+ include/lcdf/slurper.hh \
+ include/lcdf/straccum.hh \
+ include/lcdf/string.hh \
+ include/lcdf/strtonum.h \
+ include/lcdf/transform.hh \
+ include/lcdf/vector.hh include/lcdf/vector.cc \
+ include/efont/afm.hh \
+ include/efont/afmparse.hh \
+ include/efont/afmw.hh \
+ include/efont/amfm.hh \
+ include/efont/cff.hh \
+ include/efont/encoding.hh \
+ include/efont/findmet.hh \
+ include/efont/metrics.hh \
+ include/efont/otf.hh \
+ include/efont/otfcmap.hh \
+ include/efont/otfdata.hh \
+ include/efont/otfgpos.hh \
+ include/efont/otfgsub.hh \
+ include/efont/otfname.hh \
+ include/efont/otfos2.hh \
+ include/efont/pairop.hh \
+ include/efont/psres.hh \
+ include/efont/t1bounds.hh \
+ include/efont/t1cs.hh \
+ include/efont/t1csgen.hh \
+ include/efont/t1font.hh \
+ include/efont/t1interp.hh \
+ include/efont/t1item.hh \
+ include/efont/t1mm.hh \
+ include/efont/t1rw.hh \
+ include/efont/t1unparser.hh \
+ glyphlist.txt \
+ 7t.enc
+
+liblcdf libefont:
+ cd $@ && $(MAKE)
+libefont: liblcdf
+cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage: liblcdf libefont
+ cd $@ && $(MAKE)
+
+srclinks:
+ cd liblcdf && $(MAKE) srclinks
+ cd libefont && $(MAKE) srclinks
+
+versionize:
+ perl -pi -e 's/^\.ds V.*/.ds V $(VERSION)/;' $(top_srcdir)/cfftot1/cfftot1.1 $(top_srcdir)/mmafm/mmafm.1 $(top_srcdir)/mmpfb/mmpfb.1 $(top_srcdir)/otfinfo/otfinfo.1 $(top_srcdir)/otftotfm/otftotfm.1 $(top_srcdir)/t1dotlessj/t1dotlessj.1 $(top_srcdir)/t1lint/t1lint.1 $(top_srcdir)/t1reencode/t1reencode.1 $(top_srcdir)/t1testpage/t1testpage.1
+ perl -pi -e 's/^(\U$(PACKAGE)\E) [\d.ab]+$$/$$1 $(VERSION)/;' $(top_srcdir)/README
+
+.PHONY: srclinks rpm liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage
diff --git a/Build/source/utils/lcdf-typetools/Makefile.in b/Build/source/utils/lcdf-typetools/Makefile.in
new file mode 100644
index 00000000000..77b6ff34528
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/Makefile.in
@@ -0,0 +1,679 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(top_srcdir)/configure COPYING INSTALL NEWS depcomp \
+ install-sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgdatadir)"
+pkgdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgdata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign check-news
+SUBDIRS = liblcdf libefont @SELECTED_SUBDIRS@
+DIST_SUBDIRS = liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage
+pkgdata_DATA = glyphlist.txt 7t.enc
+EXTRA_DIST = \
+ ONEWS \
+ lcdf-typetools.spec \
+ include/lcdf/bezier.hh \
+ include/lcdf/clp.h \
+ include/lcdf/error.hh \
+ include/lcdf/filename.hh \
+ include/lcdf/globmatch.hh \
+ include/lcdf/hashmap.hh include/lcdf/hashmap.cc \
+ include/lcdf/inttypes.h \
+ include/lcdf/landmark.hh \
+ include/lcdf/permstr.hh \
+ include/lcdf/point.hh \
+ include/lcdf/slurper.hh \
+ include/lcdf/straccum.hh \
+ include/lcdf/string.hh \
+ include/lcdf/strtonum.h \
+ include/lcdf/transform.hh \
+ include/lcdf/vector.hh include/lcdf/vector.cc \
+ include/efont/afm.hh \
+ include/efont/afmparse.hh \
+ include/efont/afmw.hh \
+ include/efont/amfm.hh \
+ include/efont/cff.hh \
+ include/efont/encoding.hh \
+ include/efont/findmet.hh \
+ include/efont/metrics.hh \
+ include/efont/otf.hh \
+ include/efont/otfcmap.hh \
+ include/efont/otfdata.hh \
+ include/efont/otfgpos.hh \
+ include/efont/otfgsub.hh \
+ include/efont/otfname.hh \
+ include/efont/otfos2.hh \
+ include/efont/pairop.hh \
+ include/efont/psres.hh \
+ include/efont/t1bounds.hh \
+ include/efont/t1cs.hh \
+ include/efont/t1csgen.hh \
+ include/efont/t1font.hh \
+ include/efont/t1interp.hh \
+ include/efont/t1item.hh \
+ include/efont/t1mm.hh \
+ include/efont/t1rw.hh \
+ include/efont/t1unparser.hh \
+ glyphlist.txt \
+ 7t.enc
+
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+uninstall-info-am:
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
+ @list='$(pkgdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ $(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @case `sed 15q $(srcdir)/NEWS` in \
+ *"$(VERSION)"*) : ;; \
+ *) \
+ echo "NEWS not updated; not releasing" 1>&2; \
+ exit 1;; \
+ esac
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/include/efont $(distdir)/include/lcdf
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgdataDATA
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-generic \
+ distclean-hdr distclean-recursive distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-pkgdataDATA install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-info-am uninstall-pkgdataDATA
+
+
+liblcdf libefont:
+ cd $@ && $(MAKE)
+libefont: liblcdf
+cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage: liblcdf libefont
+ cd $@ && $(MAKE)
+
+srclinks:
+ cd liblcdf && $(MAKE) srclinks
+ cd libefont && $(MAKE) srclinks
+
+versionize:
+ perl -pi -e 's/^\.ds V.*/.ds V $(VERSION)/;' $(top_srcdir)/cfftot1/cfftot1.1 $(top_srcdir)/mmafm/mmafm.1 $(top_srcdir)/mmpfb/mmpfb.1 $(top_srcdir)/otfinfo/otfinfo.1 $(top_srcdir)/otftotfm/otftotfm.1 $(top_srcdir)/t1dotlessj/t1dotlessj.1 $(top_srcdir)/t1lint/t1lint.1 $(top_srcdir)/t1reencode/t1reencode.1 $(top_srcdir)/t1testpage/t1testpage.1
+ perl -pi -e 's/^(\U$(PACKAGE)\E) [\d.ab]+$$/$$1 $(VERSION)/;' $(top_srcdir)/README
+
+.PHONY: srclinks rpm liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/NEWS b/Build/source/utils/lcdf-typetools/NEWS
new file mode 100644
index 00000000000..07607bec603
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/NEWS
@@ -0,0 +1,718 @@
+LCDF Typetools NEWS
+
+Version 2.34 11.Jun.2005
+
+* otftotfm: Search for 'glyphlist.txt' using kpathsea, and set kpathsea
+ program name to 'lcdftools'. Requested by Karl Berry.
+
+
+Version 2.33 3.Jun.2005
+
+* otftotfm: Include more secondary replacements, including double-bar,
+ centered asterisk, per-ten-thousand, and so forth. Patch from Michael
+ Zedler.
+
+* otftotfm: Add '% POSITION' and '--position'. Requested by Michael
+ Zedler.
+
+
+Version 2.32 31.May.2005
+
+* otftotfm: Report correct dimensions for characters only in the base
+ encoding. Reported by Michael Zedler.
+
+
+Version 2.31 30.May.2005
+
+* otftotfm: Fix crash tickled by constructed characters, reported by
+ Michael Zedler.
+
+* Compilation fixes suggested by Nelson H.F. Beebe.
+
+
+Version 2.30 8.May.2005
+
+* otftotfm: Add support for 'dblbracketleft' and 'dblbracketright'.
+ Secondary replacement can add characters to the font.
+
+* otftotfm: Ligkern commands 'A {5} B' and 'A {L} B' can coexist, leading
+ to a 5-character kern and no ligature. Requested by Michael Zedler.
+
+
+Version 2.29 7.May.2005
+
+* otftotfm: Fix crash reported by Ryuji Suzuki.
+
+* otftotfm: Add support for 'capitalcompwordmark' and
+ 'ascendercompwordmark', requested by Michael Zedler.
+
+* otftotfm: Use OpenType OS/2 table to determine x-height, if available.
+
+
+Version 2.28 25.Apr.2005
+
+* otftotfm: '--math-spacing' doesn't set italic corrections to 0. Thanks
+ to Achim Blumensath.
+
+
+Version 2.27 24.Apr.2005
+
+* otftotfm: Add support for setting kerns: '--ligkern "A {5} B"'. Thanks
+ to Achim Blumensath for a patch.
+
+* otftotfm: Add preliminary support for heuristically-derived math accent
+ positions via a 'skewchar' argument to '--math-spacing'. Thanks again to
+ Achim Blumensath.
+
+
+Version 2.26 2.Apr.2005
+
+* otftotfm: Support more kinds of substitution.
+
+* otftotfm: Support old-style and new-style chaining context substitutions
+ using Adobe's procedure. Older fonts had erroneous substitutions because
+ of a software error; newer fonts don't.
+
+* otftotfm: Fix crash tickled by newer versions of MinionPro and other
+ fonts, reported by Michael Zedler and Oliver M. Haynold.
+
+
+Version 2.25 10.Mar.2005
+
+* otftotfm: Ignore unencoded default ligkerns (don't try to encode their
+ characters). Reported by Michael Zedler.
+
+
+Version 2.24 10.Mar.2005
+
+* otftotfm: Fix assertion failure introduced in 2.23.
+
+
+Version 2.23 8.Mar.2005
+
+* otftotfm: Fix bug present since 2.20 where, for example, '--unicoding
+ "germandbls =: SSsmall"' was ignored in favor of a named 'germandbls'
+ character. Reported by Michael Zedler.
+
+
+Version 2.22 2.Mar.2005
+
+* otftotfm: Include default ligatures unless '--no-default-ligkern' is
+ given. This seems cleaner than the previous semantics (which included
+ the default ligatures unless there were ligatures in the encoding and/or
+ the command line), but it is incompatible. Inspired by question from
+ Christopher Swingely.
+
+
+Version 2.21 16.Feb.2005
+
+* otftotfm: Base fonts include no kerns or ligatures. Requested by Michael
+ Zedler.
+
+* cfftot1: Correctly handle default values for CFF fonts, so that, for
+ example, isFixedPitch is defined to false even when the font doesn't
+ mention it. Requested by Huver.
+
+
+Version 2.20 9.Feb.2005
+
+* otftotfm: Add '--space-factor' and '--math-spacing' options, based on
+ patches from Achim Blumensath.
+
+* otftotfm: Improve handling of explicit --ligkern ligatures: they override
+ default ligatures, and any characters mentioned are shoehorned into the
+ encoding. Catalyzed by Michael Zedler.
+
+
+Version 2.19 4.Feb.2005
+
+* otftotfm: Add '--subs-filter', '--include-subs', '--exclude-subs', and
+ '--clear-subs' options (inspired by patch from Achim Blumensath).
+
+* otftotfm: Update documentation and behavior for newer teTeX
+ installations. For instance, run the system 'updmap' by default (unless
+ you give the '--no-updmap' option). This makes automatic mode much
+ easier to set up.
+
+* otftotfm: Output pltotf and vptovf messages to standard error (Achim
+ Blumensath).
+
+* otftotfm: Protect arguments given to the shell (Achim Blumensath).
+
+* otfinfo: Add '-g' option to query all glyphs in a font.
+
+
+Version 2.18 26.Jan.2005
+
+* otftotfm: Fix bug that could cause infinite loops on FreeBSD machines.
+
+
+Version 2.17 4.Jan.2005
+
+* Add t1reencode program. Requested by Ralph Aichinger.
+
+* otftotfm: Add '--output-encoding' option.
+
+* t1lint: Check that UniqueID and XUID values are in range.
+
+
+Version 2.16 19.Nov.2004
+
+* '--include-alternates' and '--exclude-alternates' options only apply to
+ features that appear later in the options list.
+
+* Fix bug where not all '--altselector-feature' features would be used.
+ Problem reported by Emil Lohse.
+
+* Add '--clear-alternates' option.
+
+
+Version 2.15 21.Sep.2004
+
+* AIX compile fixes. Reported by Vladimir Volovich.
+
+* Include RPM .spec file, provided by C.M. Connelly.
+
+
+Version 2.14 16.Sep.2004
+
+* Use AM_MAINTAINER_MODE. Suggested by Karl Berry.
+
+* IRIX compile fixes. Reported by Olaf Weber.
+
+
+Version 2.13 12.Sep.2004
+
+* otftotfm: Check $TEXMF if $VARTEXMF has no writable directory. Reported
+ by Simon Patarin.
+
+* Add '--enable-selfauto-loc' configuration option, enabled by default, to
+ help otftotfm run with TeX configuration files that use SELFAUTODIR and
+ related variables. Suggested by Thomas Esser; mechanism from dvipng.
+
+
+Version 2.12 19.Aug.2004
+
+* Catch bug that would affect otftotfm on 64-bit machines.
+
+
+Version 2.11 18.Aug.2004
+
+* otftotfm: Adjust TDS 1.1 support thanks to Olaf Weber.
+
+
+Version 2.10 18.Aug.2004
+
+* otftotfm: Add preliminary support for the TeX Directory Structure 1.1
+ standard.
+
+* Bug fix that should let us compile on Cygwin. Problem reported by
+ Christian Gudrian.
+
+
+Version 2.9 10.Aug.2004
+
+* otftotfm: Add '--letter-feature' option, inspired by Michael Zedler.
+
+
+Version 2.8 5.Aug.2004
+
+* otftotfm: Fix bug where missing GPOS or GSUB tables would cause an abort.
+ Reported by Ryuji Suzuki.
+
+
+Version 2.7 3.Aug.2004
+
+* otftotfm: Bug fix for obscure cases involving 'dotlessj' characters: the
+ output VPL could contain a reference to "(SETCHAR X)", which is illegal.
+ Reported by Marco Kuhlmann.
+
+
+Version 2.6 12.Jul.2004
+
+* t1testpage adds preliminary support for font smoke proofs with '--smoke'.
+ Requested by Karl Berry.
+
+* t1testpage adds '--glyph' option.
+
+
+Version 2.5 6.Jul.2004
+
+* Support compilation with gcc-3.4.1. Reported by Thomas Esser.
+
+
+Version 2.4 30.Jun.2004
+
+* cfftot1: Fix off-by-one bug where the encoding of the last encoded
+ character was ignored, reported by Detlev Droege.
+
+* otftotfm: Some internal changes; bugs are possible.
+
+
+Version 2.3 15.Jun.2004
+
+* otftotfm: Add '--default-ligkern' and '--no-encoding-commands' options,
+ to address problem with "t1.enc" reported by Ulrich Dirr.
+
+* otftotfm documentation updates.
+
+
+Version 2.2 8.May.2004
+
+* otftotfm: 't1dotlessj' errors don't prevent 'psfonts.map' from being
+ updated. Reported by Stephen Moye.
+
+* t1dotlessj: Report different kinds of errors with different exit statuses.
+
+
+Version 2.1 5.Apr.2004
+
+* otftotfm: Warn if no encoding specified. Requested by Zsolt Kiraly.
+
+* otftotfm: Improve documentation, particularly by adding example run with
+ ".fd" file.
+
+
+Version 2.0 21.Mar.2004
+
+* mmpfb, t1dotlessj, t1lint, t1testpage: On Windows, add _O_BINARY flag
+ when appropriate. Reported by Fabrice Popineau.
+
+
+Version 1.99 24.Feb.2004
+
+* otftotfm: Fix overfull encoding bug that could cause an assertion
+ failure, reported by Adam Lindsay.
+
+* otftotfm: Speed improvement.
+
+
+Version 1.98 22.Feb.2004
+
+* otftotfm: Add support for 'SSsmall' glyph. Einar Smith noted that the
+ OpenType 'smcp' feature doesn't translate the sharp-S character to
+ small-caps "SS" in most fonts. Now, add '--unicoding "germandbls =:
+ SSsmall"' to get that behavior.
+
+* otftotfm: Compilation fix for problem reported by Nelson H.F. Beebe.
+
+
+Version 1.97 6.Feb.2004
+
+* cfftot1: Fix bug in handling fonts with supplemental encodings. Problem
+ reported by Eike <eiked>.
+
+
+Version 1.96 11.Jan.2004
+
+* otftotfm: Handle alternate characters like 'Q.alt' in the input encoding:
+ map them to the actual alternate glyph, rather than to the base Unicode
+ value ('Q'). Reported by Ulrich Dirr.
+
+
+Version 1.95 3.Jan.2004
+
+* otftotfm: Add automatic support for t1dotlessj. If the desired encoding
+ has a 'dotlessj' character, and the input font doesn't, then otftotfm
+ will run 't1dotlessj', create a dotless-J font, and include it using
+ virtual fonts.
+
+* otftotfm: Avoid warnings about bad "(STOP)" commands in pltotf
+ (introduced by the --min-kern facility).
+
+
+Version 1.91 31.Dec.2003
+
+* mmpfb, t1dotlessj: Fix sidebearing problems.
+
+
+Version 1.90 29.Dec.2003
+
+* mmpfb: Fix behavior with Adobe Jenson and other fonts with intermediate
+ masters, and '--minimize' output, which had been broken since 1.65.
+
+* Add t1dotlessj program.
+
+
+Version 1.88 23.Dec.2003
+
+* otfinfo: Change coding to be friendlier to older C++ compilers. Requested
+ by Ulrich Dirr.
+
+
+Version 1.87 22.Dec.2003
+
+* otftotfm: Fix --extend bug reported by Ulrich Dirr (the expansion factor
+ was formerly applied to character heights and depths, not widths).
+
+
+Version 1.86 19.Dec.2003
+
+* otftotfm: Change where "--base" is added to support pdftex: If the font
+ name is "WarnoPro+10", the base font name is "WarnoPro--base+10".
+ Reported by Ulrich Dirr.
+
+
+Version 1.85 10.Dec.2003
+
+* otftotfm: Add --altselector-feature option, so you can specify the
+ features activated by --altselector-char. Defaults to salt and dlig.
+
+* otftotfm: Fix intermittent hang.
+
+
+Version 1.80 4.Dec.2003
+
+* otftotfm: Add --altselector-char option, and --include-alternates and
+ --exclude-alternates options. These options support access to alternate
+ characters through ligatures, using a mechanism originally planned by
+ Sivan Toledo ("Exploiting Rich Fonts", TUGboat 21(2), 2000). Requested
+ by Martin Budaj.
+
+* Add default encoding for 'SS' character (same as 'Germandbls'). Reported
+ by Ulrich Dirr.
+
+
+Version 1.75 3.Dec.2003
+
+* cfftot1: Handle the case when 'hintmask' is the first operator in a Type 2
+ charstring. Reported by Tom Kacvinsky.
+
+
+Version 1.70 1.Dec.2003
+
+* otftotfm: Add --min-kern option requested by Ulrich Dirr.
+
+* mmafm: Add --min-kern as a preferred synonym for --kern-precision.
+
+
+Version 1.67 29.Nov.2003
+
+* otftotfm: Don't run off the end of an array. Bug reported and patch
+ provided by Akira Kakuto.
+
+
+Version 1.66 24.Nov.2003
+
+* cfftot1: Don't generate "currentfile eexec" twice. Bug reported by Adam
+ Lindsay.
+
+
+Version 1.65 24.Nov.2003
+
+* otftotfm: Include default ligatures if user does not specify ligatures.
+ Requested by Adam Lindsay.
+
+* otftotfm: Generated VPL includes FONTDSIZE when referring to base. Bug
+ reported by Adam Lindsay.
+
+* Preliminary support for CID-keyed OpenType fonts.
+
+
+Version 1.60 7.Oct.2003
+
+* cfftot1: Support fonts using the 'seac' operator. Requested by Ralf
+ Koenig.
+
+
+Version 1.52 4.Sep.2003
+
+* otftotfm: Add --design-size option requested by Johannes Kuester.
+
+* t1testpage: Fix --help and add manual page at C.M. Connelly's request.
+
+
+Version 1.51 2.Sep.2003
+
+* otftotfm: Generated TFM and PL files have DESIGNSIZE set to the font's
+ actual design size, as read from the 'size' feature. Requested by
+ Johannes Kuester.
+
+
+Version 1.50 26.Aug.2003
+
+* Minor compilation fix; problem reported by Nelson H.F. Beebe.
+
+
+Version 1.50b4 26.Aug.2003
+
+* otfinfo: Minor compilation fix from Tom Kacvinsky.
+
+
+Version 1.50b3 25.Aug.2003
+
+* cfftot1: Emit UniqueID as an integer. Reported by Tom Kacvinsky.
+
+* otftotfm: '--without-kpathsea' fix. Patch provided by Adam Lindsay.
+
+* More compilation fixes provided by Tom Kacvinsky.
+
+
+Version 1.50b2 24.Aug.2003
+
+* otfinfo: New program, requested by Adam Lindsay.
+
+* otftotfm: The '--query-scripts' and '--query-features' options are no
+ longer supported. Use 'otfinfo -s' and 'otfinfo -f' instead.
+
+* otftotfm: Fix crash reported by Adam Lindsay.
+
+* otftotfm: In automatic mode, after modifying a 'psfonts.map' file, run
+ the script 'TEXMF/dvips/updmap' if present.
+
+* Compilation fixes for Solaris provided by Tom Kacvinsky and Nelson
+ H.F. Beebe.
+
+
+Version 1.50b1 20.Aug.2003
+
+* Integrate mminstance (the mmafm and mmpfb programs), and bump the version
+ number to reflect this.
+
+
+Version 0.53 10.Aug.2003
+
+* Fix problem with Type 1 output in '--without-kpathsea' reported by Adam
+ Lindsay.
+
+* Fix crash on encodings containing 'emptyslot' reported by Marco Kuhlmann.
+
+
+Version 0.52 7.Aug.2003
+
+* Attempt to fix some build problems reported by Nelson H.F. Beebe.
+
+
+Version 0.51 5.Aug.2003
+
+* otftotfm: Fix crashes with small encodings and absent boundary
+ characters. Reported by Bruce D'Arcus.
+
+* otftotfm: Add '--boundary-char' and '--kpathsea-debug' options.
+
+
+Version 0.50 4.Aug.2003
+
+* otftotfm: Handle more complex substitutions, such as those required to
+ support '-fordn' and '-ffrac'.
+
+* otftotfm: The output virtual and base fonts can have different
+ "encodings" with overlapping encoding slots. This can make fonts more
+ compact.
+
+* When assigning slots to introduced characters, otftotfm prefers
+ characters introduced by earlier lookups. This follows the spirit of the
+ OpenType specification, since early lookups in some ways "override" later
+ ones. The previous scoring mechanism remains in force within each
+ individual lookup.
+
+* otftotfm: Rewrite GsubEncoding to Metrics, changing its fundamental
+ abstraction (to two-ligatures). Simpler and cleaner overall.
+
+* otftotfm TODO: Ligatures that apply to middle or right context (for
+ example, the two substitutions "a b c d => a b c y" and "b c => x" should
+ combine to "a b c d => a x y", but they won't yet).
+
+
+Version 0.19 30.Jul.2003
+
+* otftotfm: Add support for 'emptyslot' UNICODINGs. Requested by Marco
+ Kuhlmann.
+
+
+Version 0.18 9.Jul.2003
+
+* Otftotfm will now synthesize characters for some T1 glyphs automatically,
+ specifically 'cwm' (compound word mark), 'visualspace', and 'Germandbls'.
+ Requested by Marco Kuhlmann.
+
+* The glyphlist.txt file contains Unicode mappings for character names
+ found in the BlueSky Computer Modern math italic and symbol fonts.
+
+* It also contains fake Unicode mappings for the 'cwm', 'visualspace', and
+ 'Germandbls' characters found in EC.enc.
+
+* otftotfm: Don't output a KRN between two characters if there exists a LIG
+ for those two characters.
+
+
+Version 0.17 6.Jul.2003
+
+* otftotfm: Ligatures removed with LIGKERN commands won't show up in the
+ encoding.
+
+* Improve scoring heuristics by which otftotfm decides which characters are
+ more important (for when there isn't enough encoding space for all new
+ glyphs).
+
+
+Version 0.16 6.Jul.2003
+
+* otftotfm: In automatic mode, store dvips files (encodings and
+ psfonts.map) in 'TEXMF/dvips/VENDOR', rather than 'TEXMF/dvips'. Users of
+ previous versions will probably want to move their 'TEXMF/dvips/a_*.enc'
+ and 'TEXMF/dvips/lcdftools.map' files to a 'TEXMF/dvips/lcdftools/'
+ directory, and run 'mktexlsr TEXMF'.
+
+* otftotfm: When there isn't enough encoding space for all new glyphs,
+ prefer shorter ligatures made out of regular letters -- for instance,
+ prefer f_j to f_f_j, and T_h to f_iacute. Requested by Bruce D'Arcus.
+
+* otftotfm: Add '--ligkern' and '--unicoding' options.
+
+* otftotfm: Add '--coding-scheme' option and '% CODINGSCHEME' encoding
+ comment, to define the PL/TFM coding scheme for the font. Apparently
+ fontinst actually looks at the coding scheme. Also, when you specify a
+ coding scheme, set DESIGNUNITS to 1, again to satisfy fontinst. Requested
+ by Marco Kuhlmann.
+
+* otftotfm: Remove virtual font 'N.vf' when installing a regular font
+ 'N.tfm' in automatic mode. This reduces the risk that an old virtual font
+ will screw up your installation.
+
+
+Version 0.15 4.Jul.2003
+
+* otftotfm: Bug fix: Don't multiply apply substitutions and kerns from the
+ same lookup.
+
+* otftotfm: Supports simple left-contextual substitutions, necessary for
+ ExPontoPro's 'calt' (Contextual Alternates) feature.
+
+
+Version 0.14 2.Jul.2003
+
+* otftotfm: Add '-L/--letterspacing' option at Bruce D'Arcus's request.
+
+* otftotfm: Hypothetically supports the contextual substitutions necessary
+ for the 'init' (Initial Forms) feature.
+
+* otftotfm: When you make a virtual font named "foo", remove any entries
+ for "foo" from VENDOR.map.
+
+
+Version 0.13 27.Jun.2003
+
+* --without-kpathsea works. Problem reported by Adam Lindsay.
+
+
+Version 0.12 27.Jun.2003
+
+* otftotfm: Better error messages when directories cannot be found.
+ Reported by Bruce D'Arcus.
+
+
+Version 0.11 26.Jun.2003
+
+* otftotfm: Handles the contextual substitutions necessary for 'cswh'
+ (Contextual Swash) and 'fina' (Terminal Forms) features.
+
+
+Version 0.10 26.Jun.2003
+
+* otftotfm: Update ls-R files for new encodings.
+
+
+Version 0.9 25.Jun.2003
+
+* otftotfm: psfonts.map lines contain the file name only (no directories).
+ Requested by Norbert Preining.
+
+* otftotfm: Properly report errors when encoding files can't be found.
+
+* Fix kpathsea searching and dependency problems reported by Bruce D'Arcus
+ and Claire Connelly, among others.
+
+* Fix templates to allow compilation with GCC 2.95.
+
+
+Version 0.8 23.Jun.2003
+
+* otftopl has been renamed to otftotfm. The new program takes different
+ options. Automatic mode is particularly different, and TFM output is now
+ the default.
+
+* otftotfm: Automatic mode now sticks files into a TeX Directory Structure
+ hierarchy. This works well with many TeX installations. It also
+ automatically translates OpenType fonts into Type 1 PostScript with
+ cfftot1 (unless you configure with --disable-cfftot1), and modifies a
+ psfonts.map file for each font. See the manual page for more information.
+
+* otftotfm: Generates virtual fonts when required to support glyph
+ positioning features. ("-f cpsp" is one example.)
+
+* otftotfm: Warns when a feature could not be completely implemented.
+
+* otftotfm: Add --verbose and --no-create options, among others
+ (--no-virtual, --map-file, --vendor, --typeface, --no-type1...).
+
+* otftotfm: Encoding files are now named "a_SIGNATURE.enc", not
+ "auto_SIGNATURE.enc".
+
+* The configure script now searches for the kpathsea library, since
+ otftotfm's automatic mode depends on kpathsea. Provide
+ '--without-kpathsea' to disable it.
+
+
+Version 0.7 13.Jun.2003
+
+* cfftot1: Fix bug to handle MinionPro-Italic without crashing.
+
+
+Version 0.6 12.Jun.2003
+
+* cfftot1: Fix definitions of Subrs entries 1 and 2; now fonts with flex
+ hints will work.
+
+* cfftot1: Reduce noise generated by fonts with flex hints.
+
+* cfftot1: Generates valid character strings for characters whose first
+ point is at the origin. (Previously, such charstrings wouldn't begin with
+ a "moveto".)
+
+* otftopl: Support simple context substitutions and chained context
+ substitutions. Required to support ACaslonPro-Italic's "swsh" feature.
+ Reported by Adam Lindsay <atl@comp.lancs.ac.uk>.
+
+* otftopl: Prefer '--query-features' and '--query-scripts' to
+ '--print-features' and '--print-scripts'.
+
+* otftopl: Better warnings and error messages for bad LIGKERN/UNICODING
+ commands in encoding files, and when there isn't enough room in an
+ encoding for ligature glyphs.
+
+* t1lint: Reads stdin if no filenames supplied on the command line.
+
+
+Version 0.5 5.Jun.2003
+
+* Template reorganization so the typetools compile with GCC 3.3.
+
+
+Version 0.4 3.Jun.2003
+
+* otftopl: Added --slant and --extend options.
+
+* otftopl's generated encodings have slightly different form, and are thus
+ friendlier to ps2pk's bad parser.
+
+
+Version 0.3 3.Jun.2003
+
+* Fixed bug: cfftot1 produced invalid results for fonts with encodings
+ other than StandardEncoding, due to a misbehavior in the way Type 1 fonts
+ were stored. Reported by Vladimir Volovich <vvv@vsu.ru>.
+
+
+Version 0.2 3.Jun.2003
+
+* Fix CFF parsing bugs and configure errors reported by Vladimir Volovich
+ <vvv@vsu.ru>.
+
+
+Version 0.1 2.Jun.2003
+
+* Initial release.
+
+
+See also the ONEWS file for older news about mmafm and mmpfb.
diff --git a/Build/source/utils/lcdf-typetools/ONEWS b/Build/source/utils/lcdf-typetools/ONEWS
new file mode 100644
index 00000000000..6bd9dc8c42d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/ONEWS
@@ -0,0 +1,433 @@
+Mminstance NEWS
+
+This file contains news relevant to the mmafm and mmpfb programs, which
+used to be distributed separately in the mminstance package.
+
+Version 1.50 20.Aug.2003
+
+* As of version 1.50, mminstance is distributed as part of the
+ lcdf-typetools package. Changes for versions 1.50 and up are listed in
+ NEWS.
+
+
+Version 1.26.3 14.Aug.2003
+
+* Library changes to attempt to satisfy more C++ compilers. Again massive
+ thanks to Nelson H.F. Beebe, and new massive thanks to Fabrice Popineau.
+
+
+Version 1.26.2 13.Aug.2003
+
+* Revert from '#include <cXXX>' to '#include <XXX.h>'.
+
+
+Version 1.26.1 11.Aug.2003
+
+* 'uintptr_t' configury, and more template changes.
+
+
+Version 1.26 10.Aug.2003
+
+* Further address build problems reported by Nelson Beebe.
+
+
+Version 1.25 7.Aug.2003
+
+* Address build problems reported by Nelson H.F. Beebe.
+
+
+Version 1.24 30.Jul.2003
+
+* Fix configure check for whether va_list is addressable. Ryan Murray found
+ the bug; thanks hugely to Claire Connelly for testing resources.
+
+* Minor code restructuring.
+
+* mmpfb: --minimize is the default.
+
+* mmpfb: --minimize additionally forces some interpolated values to
+ integers, specifically BlueValues, OtherBlues, FamilyBlues,
+ FamilyOtherBlues, and BlueShift. Maybe this will avoid some problems
+ people have had with embedding mmpfb-generated fonts and Acrobat 6.
+
+* Change rounding procedures. Now fonts generated on different platforms
+ will likely not differ in rounding details. (What a difference 0.00001
+ makes!)
+
+
+Version 1.23 9.Jul.2003
+
+* Add configure check for whether va_list is addressable. Thanks to Claire
+ Connelly.
+
+
+Version 1.22 5.Jun.2003
+
+* More template nonsense. Mea culpa to Melissa O'Neill and Claire Connelly.
+
+
+Version 1.21 4.Jun.2003
+
+* GCC 3.3 would not link mminstance due to missing template instantiations.
+ Moved templatei.cc into libefont.a to fix this. Reported by Melissa
+ O'Neill <oneill@cs.hmc.edu>.
+
+
+Version 1.20 26.Jan.2003
+
+* mmafm: Fix bug with parsing intermediate-master files that made AJensonMM
+ unusable. Reported by Fulko van Westrenen <westrenen@fvw.cistron.nl>.
+
+
+Version 1.19 5.Jan.2003
+
+* mmpfb: Previously, error introduced by the rounding process could build
+ up over the length of a path, causing an anomaly when the path was
+ closed. Now mmpfb compensates for rounding error, resulting in a path
+ with better fidelity.
+
+* mmpfb: Add the `--minimize' option to minimize output fonts, allowing the
+ X font server to load mmpfb-generated fonts. Problem with the X font
+ server reported by Joerg Lippman <joerg.lippmann@o3-software.de>.
+
+* mmpfb: Add placeholder subroutines to fill in any gaps in the subroutine
+ array, which the X font server doesn't like (that IBM Type 1 code is
+ bad!). Probably this should be optional, since it makes the font bigger.
+
+* mmpfb: Renumber subroutines consecutively.
+
+* mmpfb: Generate a new FullName as well as a new FontName.
+
+* Adapt to newer Automake and LCDF and Efont libraries.
+
+
+Version 1.18 5.Oct.2002
+
+* Fix for compilation with newer C++ compilers.
+
+
+Version 1.17 30.Sep.2002
+
+* Fix for NuevaMM-It: the ItalicAngle array was not being properly
+ commented out. Reported by Thomas Wu <twu@gene.com>.
+
+
+Version 1.16.3 17.Sep.2001
+
+* Workaround for Mac OS X: its sscanf() function behaves incorrectly when a
+ format string ends with ` %n'. Reported and patched by Melissa O'Neill
+ <oneill@cs.sfu.ca>.
+
+
+Version 1.16.2 6.Sep.2001
+
+* Improvements so mminstance compiles on more platforms. Problems reported
+ by Nelson H. F. Beebe <beebe@math.utah.edu>.
+
+
+Version 1.16.1 15.Jul.2001
+
+* Bug fix: more cleanups for newer GCCs. Reported by C. M. Connelly
+ <c@eskimo.com>.
+
+
+Version 1.16 18.Jun.2001
+
+* Bug fix: now newer C++ compilers will compile mminstance. Reported by
+ Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 1.15.1 12.Aug.2000
+
+* Don't use `-Wall' by default; old C++ compilers generate huge numbers of
+ irrelevant warnings. Reported by Tom Kacvinsky <tjk@ams.org>.
+
+
+Version 1.15 12.Jul.2000
+
+* mmpfb: Remove calls to nonexistent subroutines. (This was not actually a
+ bug; the calls to nonexistent subroutines would never execute anyway. The
+ font ITCGaramondMM-It had characters like `/question { A callsubr B
+ callsubr }', where the `A' subroutine would either draw an entire
+ character and call `endchar' -- so `B' would never get called -- or it
+ would do nothing at all. Previous mmpfb versions would remove the `B'
+ subroutine but keep the `B callsubr' call if the interpolated `A' called
+ `endchar'.) Requested by Han The Thanh <thanh@informatics.muni.cz>.
+
+* mmpfb: Removed warning about `strange othersubr commands'.
+
+
+Version 1.14 22.Jun.2000
+
+* mmpfb: Fixed a bug with large UniqueID values. Reported by Sivan Toledo
+ <sivan@math.tau.ac.il>.
+
+* mmpfb: Support for interpolating BlueFuzz without any warnings.
+
+
+Version 1.13 16.Apr.2000
+
+* mmpfb: Can handle synthetic fonts like TektonMM-Oblique. Requested by
+ Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 1.12 5.Apr.2000
+
+* mmpfb: Make sure to remove multiple master commands from hint replacement
+ subroutines. Required another overhaul. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+
+Version 1.11 3.Apr.2000
+
+* mmafm: Added `--kern-precision' option. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+* Bug fix: now mminstance can be compiled with recent versions of gcc. The
+ error was a strange use of va_arg(). Reported by C. M. Connelly
+ <c@eskimo.com>.
+
+
+Version 1.10 21.Feb.2000
+
+* mmpfb: Comment out DesignVector, NormDesignVector, and WeightVector
+ entries. Now Ghostscript 6.0's ps2pdf script will work with
+ mmpfb-generated fonts. Change requested by Melissa O'Neill
+ <oneill@cs.sfu.ca>.
+
+
+Version 1.9 18.Jan.2000
+
+* mmpfb: Bug fix in special callothersubrs code introduced in Version 1.8.
+ This bug probably did not affect anyone.
+
+
+Version 1.8 10.Jan.2000
+
+* mmpfb: Don't warn when encountering `BuildCharArray'. This shows up in
+ some ITC multiple masters. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+* mmpfb: Handle special callothersubrs from ITC Garamond MM. This required
+ big changes, but the code is cleaner now, and more likely to be right in
+ future: best of both worlds. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+
+Version 1.7 30.Dec.1999
+
+* mmpfb: Fixed bug where garbled encoding vectors could be produced.
+ Patch sent in by Christopher League <league@contrapunctus.net>.
+
+* Bug fix: Some error messages used to cause assertion failures.
+
+
+Version 1.6 28.Nov.1999
+
+* mmafm: Added `--precision' option for optionally rounding AFM dimensions.
+ Requested by Christopher League <league@contrapunctus.net>.
+
+* Many bug fixes for compiling under NeXTSTEP or g++ 2.95. Patches sent in
+ by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+* Bug fix: numbers with both decimal point and exponent, like `1.2e5', are
+ parsed correctly.
+
+
+Version 1.5 4.Jul.1999
+
+* mmpfb: Added `--subrs' option for reducing the number of subroutines in
+ the output font. Use this option if you plan to use Acrobat Distiller 3.0
+ to distill PostScript files including mmpfb-generated fonts. Distiller
+ 3.0 has a low limit on the number of subroutines per font. Several
+ changes to the Type 1 library support this. Problem reported by Thierry
+ Bouche <Thierry.Bouche@ujf-grenoble.fr>; tracking help by Tom Kacvinsky
+ <tjk@ams.org>.
+
+* Both programs accept multiple master instance names, like
+ `MinionMM_367_400_18_', and will interpolate that instance from the
+ multiple master font.
+
+* Removed `FONTPATH' and `AFMPATH'. `PSRESOURCEPATH' has been preferred for
+ a couple months.
+
+* Updated ErrorHandler.
+
+
+Version 1.4.1 26.Jun.1999
+
+* mmpfb: Also comment out the /UniqueID in the Private dictionary, if any.
+ Reported by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>.
+
+
+Version 1.4 25.Jun.1999
+
+* mmpfb: Always comment out any /UniqueID in the font. This bug prevented
+ some printers from printing files with mmpfb-interpolated fonts. Reported
+ by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>.
+
+* mmpfb: Comment out `Blend...' entries in the FontInfo dictionary. Now
+ Adobe Acrobat Distiller can handle mmpfb-interpolated fonts; it correctly
+ treats them like single-master fonts. Problem reported by Thierry Bouche
+ <Thierry.Bouche@ujf-grenoble.fr>.
+
+* mmpfb: Comment out multiple-master-specific dictionary entries, rather
+ than removing them entirely.
+
+* mmpfb: Interpolates Blend FontInfo dictionary entries, like
+ `UnderlinePosition' (maybe; can't find any fonts that use them, so it's
+ untested).
+
+
+Version 1.3.1 21.May.1999
+
+* Changed libraries to conform to STL interfaces.
+
+* Change to psres.cc to fix compilation bug under old C++ compilers.
+
+
+Version 1.3 11.Apr.1999
+
+* Mmafm will now automatically run `mmpfb --amcp-info' when necessary, so
+ you don't have to create the AMCP files yourself. Caveat: This will only
+ work if you use the PSRESOURCEPATH environment variable and have
+ PSres.upr files set up correctly.
+
+* mmafm: Added the PSRESOURCEPATH environment variable, in favor of
+ AFMPATH and FONTPATH.
+
+* mmafm: Checks for completely unknown design vectors.
+
+* mmpfb: Now uses the PSRESOURCEPATH environment variable to look for fonts
+ by name.
+
+* mmpfb: Modifies the output font's XUID to prevent font cache pollution.
+
+* Improved documentation.
+
+* Unfortunately, this version still doesn't work under NeXTSTEP.
+
+
+Version 1.3b2 22.Jan.1999
+
+* Don't use `index' as a method name; it's a macro under NeXTSTEP. Reported
+ by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+* Patch around problems with NeXTSTEP's strtod and strtol. Also reported by
+ Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 1.3b1 12.Jan.1999
+
+* Han The Thanh <thanh@informatics.muni.cz> reports that Acrobat Reader
+ gives a "bad /BBox" warning on mmpfb-interpolated fonts. This seems to be
+ because mmpfb would produce fractional FontBBox entries. Fix: round the
+ FontBBox entries so it contains integers.
+
+* Small bug fix: negative non-integers were formerly read incorrectly,
+ introducing an error of not more than 2 integer units.
+
+
+Version 1.2 18.Dec.1998
+
+* Better error messages and fewer coredumps on bad files.
+
+* The mminstance package now uses automake.
+
+
+Version 1.1 27.Sep.1998
+
+* mmpfb: Changes to remove all multiple master commands in the output font,
+ not just most of them.
+
+* mmpfb: Added error message on bad input file.
+
+* Removed hackery which prevented linking with -lstdc++.
+
+* `--help' now prints on stdout, as the GNU standards require.
+
+* Makefiles: added `make uninstall' target, enabled `./configure's program
+ name transformations, made VPATH builds possible.
+
+
+Version 1.0 17.Sep.1998
+
+* No changes; just decided it was stable.
+
+
+Version 0.92 2.Sep.1998
+
+* Code reorganization in metrics. (Removed LineScanner, which wasn't a general
+ design; split into a more general Slurper and a specific AfmParser.)
+
+
+Version 0.91 15.May.1998
+
+* mmafm: Nonexistent files caused a coredump instead of an error (fixed).
+
+* mmafm: Added support for finding AMFMs via path variables and PSres.upr
+ files (you don't have to give an AMFM filename on the command line, you can
+ give a font name).
+
+
+Version 0.9 4.Mar.1998
+
+* Fixed a bug in parsing fonts with intermediate masters.
+
+* mmafm: Added support for finding AFMs via path variables and PSres.upr
+ files, and for giving their filenames on the command line.
+
+* Wrote manual pages.
+
+
+Version 0.8
+
+* Major release: Mmafm uses a new AFM/AMFM parsing library.
+
+* Restructured the two packages (mmafm and mmpfb) into one package
+ (mminstance) containing both programs.
+
+* Improved error messages, command line behavior, usage, and help.
+
+
+Version 0.62
+
+* Fixed small bug in t1interp.cc which caused serious problems. (Function
+ Type1Interp::number() fell off the end instead of returning true.) Bug
+ reported by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 0.6
+
+* Major release: Both programs use a new, modular Type 1 parsing library,
+ they take real numbers as arguments, and the configure scripts no longer
+ try to link with -lstdc++. Thanks to Melissa O'Neill <oneill@cs.sfu.ca>
+ for suggestions.
+
+* mmafm looks for separate .amcp files for intermediate master conversion
+ programs. Suggested by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+* mmpfb can read and generate PFA fonts.
+
+* Other fixes.
+
+
+Version 0.5
+
+* Fixed bug preventing the programs from working with Kepler.
+
+
+Version 0.4
+
+* Fixed mmpfb to handle older multiple master fonts (Myriad and Minion) and
+ to generate non-truncated PFBs.
+
+
+Version 0.2 16.Aug.1997
+
+* Fixed serious bug in normalize_vector that resulted in incorrect output.
+
+
+Version 0.1 21.Jul.1997
+
+* Initial release.
diff --git a/Build/source/utils/lcdf-typetools/README b/Build/source/utils/lcdf-typetools/README
new file mode 100644
index 00000000000..f098f2cc3ac
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/README
@@ -0,0 +1,140 @@
+LCDF-TYPETOOLS 2.34
+===================
+
+USAGE
+-----
+ The LCDF Typetools package contains several programs for manipulating
+PostScript Type 1, Type 1 multiple master, and PostScript-flavored OpenType
+fonts. LCDF Typetools includes the mmafm and mmpfb programs, which were
+formerly distributed as part of a different package (mminstance).
+
+ Cfftot1 translates a Compact Font Format (CFF) font, or a PostScript-
+flavored OpenType font, into PostScript Type 1 format. It correctly
+handles subroutines and hints. See the manual page 'cfftot1/cfftot1.1' for
+more information.
+
+ Mmafm creates an AFM file (font metrics) corresponding to an instance of
+a multiple-master font. It reads the AMFM and AFM files distributed with
+the font. See MMINSTANCE NOTES, below, and the manual page 'mmafm/mmafm.1'
+for more information.
+
+ Mmpfb creates a normal, single-master font program which looks like an
+instance of a multiple-master font. It reads the multiple master font
+program in PFA or PFB format. See MMINSTANCE NOTES, below, and the manual
+page 'mmpfb/mmpfb.1' for more information.
+
+ Otfinfo reports information about OpenType fonts, such as the features
+they support and the contents of their 'size' optical size features. See
+the manual page 'otfinfo/otfinfo.1' for more information.
+
+ Otftotfm creates TeX font metrics and encodings that correspond to a
+PostScript-flavored OpenType font. It will interpret glyph positionings,
+substitutions, and ligatures as far as it is able. You can say which
+OpenType features should be activated. See the manual page
+'otftotfm/otftotfm.1' for more information.
+
+ T1dotlessj reads a Type 1 font, then creates a new Type 1 font whose
+only character is a dotless "j" matching the input font's design. See the
+manual page 't1dotlessj/t1dotlessj.1' for more information.
+
+ T1lint checks Type 1 fonts for correctness. It tests most of the
+requirements listed in Adobe Systems' Black Book ("Adobe Type 1 Font
+Format"), and some others. See the manual page 't1lint/t1lint.1' for more
+information.
+
+ T1reencode reencodes a Type 1 font, replacing its internal encoding with
+one you specify. See the manual page 't1reencode/t1reencode.1' for more
+information.
+
+ The final program is preliminary: t1testpage creates a PostScript test
+page for a given font file. See the manual page 't1testpage/t1testpage.1'
+for more information.
+
+ Please write me with problems, patches, and suggestions at the address
+below.
+
+
+REQUIREMENTS
+------------
+ UNIX; gmake; C & C++ compilers. To build, just run ./configure, then
+gmake. See 'INSTALL' in this directory for more detailed information about
+'./configure'.
+
+ Some programs can link with additional libraries. Otftotfm can use the
+Kpathsea TeX-related path searching library; if your kpathsea library is in
+a nonstandard place, supply 'configure' with the '--with-kpathsea=PREFIX'
+option to find it.
+
+ You can also disable individual programs by supplying 'configure' with
+'--disable-PROGNAME' options. See './configure --help' for more
+information.
+
+
+MMINSTANCE NOTES
+----------------
+
+Examples
+........
+ % mmafm MyriadMM.amfm --weight=300 --width=585 > MyriadMM_300_585_.afm
+ % mmpfb MyriadMM.pfb --weight=300 --width=585 > MyriadMM_300_585_.pfb
+
+ Run `mmafm --help' and `mmpfb --help' for a full option summary.
+
+Running mmafm
+.............
+ Mmafm expects the name of an AMFM file on the command line. It also
+needs to find an AFM file for each master (these should have been
+distributed with the AMFM file). You can give the AFM files' names on the
+command line, along with the AMFM file, or you let mmafm find the AFM files
+automatically. For the automatic method, you must follow one of these 2
+conventions:
+
+ 1) The AFM files are in the same directory as the AMFM file. They are
+named `FONTNAME.afm' -- `MyriadMM-LightCn.afm', for example.
+
+ 2) There is a `PSres.upr' file that lists the AFMs by font name, and the
+`PSRESOURCEPATH' environment variable contains the directory with that
+`PSres.upr' file. (`ps2pk' comes with a sample `PSres.upr' file.)
+
+Intermediate masters
+....................
+ Mmpfb can handle intermediate-master fonts transparently. If you use
+`PSres.upr' files, as described above, mmafm will also work transparently
+on intermediate-master fonts: it'll call mmpfb to get the information it
+needs. If you don't use `PSres.upr' files, you need to use mmpfb ahead of
+time to set up some auxiliary files. Say you want to use an intermediate
+master font `FONT', and FONT's AMFM file is in the `DIR' directory. Here's
+what you need to do:
+
+ % mmpfb FONT.pfb --amcp-info > DIR/FONT.amcp
+
+ When you run mmafm on 'DIR/FONT.amfm', it will automatically look for
+'DIR/FONT.amcp'. An example using Adobe Jenson:
+
+ % cd ~/Fonts/AJensonMM
+ % mmpfb AJensonMM.pfb --amcp-info > AJensonMM.amcp
+
+ Most multiple master fonts don't have intermediate masters, so you won't
+usually need to make '.amcp' files. Mmafm will tell you if it is necessary
+for a particular font.
+
+
+COPYRIGHT/LICENSE
+-----------------
+ All source code is Copyright (c) 1997-2005 Eddie Kohler.
+
+ This code is distributed under the GNU General Public License, Version
+2, or, at your discretion, any later version. The GNU General Public
+License is available via the Web at <http://www.gnu.org/licenses/gpl.html>,
+or in the COPYING file in this directory.
+
+
+AUTHOR
+------
+ Eddie Kohler, <kohler@cs.ucla.edu>
+ http://www.lcdf.org/
+
+ The current version of the lcdf-typetools package is available on the
+Web at 'http://www.lcdf.org/type/'.
+
+ LCDF stands for Little Cambridgeport Design Factory.
diff --git a/Build/source/utils/lcdf-typetools/aclocal.m4 b/Build/source/utils/lcdf-typetools/aclocal.m4
new file mode 100644
index 00000000000..784d2455c26
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/aclocal.m4
@@ -0,0 +1,1084 @@
+# generated automatically by aclocal 1.9.2 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# -*- Autoconf -*-
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Generated from amversion.in; do not edit by hand.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.2])])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 6
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# serial 7 -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+#serial 2
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 7
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# This macro actually does too much some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 11
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# -*- Autoconf -*-
+# Copyright (C) 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# -*- Autoconf -*-
+
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/Build/source/utils/lcdf-typetools/cfftot1/Makefile.am b/Build/source/utils/lcdf-typetools/cfftot1/Makefile.am
new file mode 100644
index 00000000000..6bfd3a37b6c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/cfftot1/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = cfftot1
+man_MANS = cfftot1.1
+
+cfftot1_SOURCES = cfftot1.cc \
+ maket1font.cc maket1font.hh
+
+cfftot1_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = cfftot1.1
diff --git a/Build/source/utils/lcdf-typetools/cfftot1/Makefile.in b/Build/source/utils/lcdf-typetools/cfftot1/Makefile.in
new file mode 100644
index 00000000000..261bba453e7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/cfftot1/Makefile.in
@@ -0,0 +1,474 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(cfftot1_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = cfftot1$(EXEEXT)
+subdir = cfftot1
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_cfftot1_OBJECTS = cfftot1.$(OBJEXT) maket1font.$(OBJEXT)
+cfftot1_OBJECTS = $(am_cfftot1_OBJECTS)
+cfftot1_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(cfftot1_SOURCES)
+DIST_SOURCES = $(cfftot1_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = cfftot1.1
+cfftot1_SOURCES = cfftot1.cc \
+ maket1font.cc maket1font.hh
+
+cfftot1_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = cfftot1.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign cfftot1/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign cfftot1/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+cfftot1$(EXEEXT): $(cfftot1_OBJECTS) $(cfftot1_DEPENDENCIES)
+ @rm -f cfftot1$(EXEEXT)
+ $(CXXLINK) $(cfftot1_LDFLAGS) $(cfftot1_OBJECTS) $(cfftot1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfftot1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maket1font.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/cfftot1/cfftot1.1 b/Build/source/utils/lcdf-typetools/cfftot1/cfftot1.1
new file mode 100644
index 00000000000..dbe0512c1da
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/cfftot1/cfftot1.1
@@ -0,0 +1,87 @@
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH CFFTOT1 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+cfftot1 \- convert PostScript font from CFF to Type 1
+.SH SYNOPSIS
+.B cfftot1
+\%[\fB\-a\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.BR Cfftot1
+converts PostScript font programs in the Compact Font Format (CFF) into
+Type 1 font programs in PFB or PFA format, preserving all hints that can be
+represented in Type 1. The input file should be a raw CFF file or a
+PostScript-flavored OpenType font. If the file
+.I output
+is not specified output goes to the standard output.
+If the file
+.I input
+is not specified input comes from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BI \-a "\fR, " \-\-pfa
+Output font in ASCII PFA format.
+'
+.Sp
+.TP 5
+.BI \-b "\fR, " \-\-pfb
+Output font in binary PFB format. This is the default.
+'
+.Sp
+.TP 5
+.BI \-n " name\fR, " \-\-name " name"
+Output the CFF's component font named
+.IR name .
+CFF files can contain more than one font, although few do. Use this option
+to select a particular font from a multi-font collection. By default
+cfftot1 chooses the collection's first font.
+'
+.Sp
+.TP 5
+.BI \-o " file\fR, " \-\-output " file"
+Write output font to
+.IR file
+instead of the standard output.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M t1binary 1 ,
+.M t1ascii 1
+.LP
+.I "Adobe Type 1 Font Format"
+.LP
+Adobe Technical Notes #5176,
+.IR "The Compact Font Format Specification" ,
+and #5177,
+.I "The Type 2 Charstring Format"
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+'
+.SH AUTHOR
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/lcdf-typetools/cfftot1/cfftot1.cc b/Build/source/utils/lcdf-typetools/cfftot1/cfftot1.cc
new file mode 100644
index 00000000000..c3534987b79
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/cfftot1/cfftot1.cc
@@ -0,0 +1,257 @@
+/* cfftot1.cc -- driver for translating CFF fonts to Type 1 fonts
+ *
+ * Copyright (c) 2002-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include "maket1font.hh"
+#include <efont/cff.hh>
+#include <efont/otf.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define PFB_OPT 304
+#define PFA_OPT 305
+#define OUTPUT_OPT 306
+#define NAME_OPT 307
+
+Clp_Option options[] = {
+ { "ascii", 'a', PFA_OPT, 0, 0 },
+ { "binary", 'b', PFB_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "name", 'n', NAME_OPT, Clp_ArgString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static bool binary = true;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'Cfftot1' translates a PostScript font from the Compact Font Format (CFF) to\n\
+the usual Type 1 format. The input file should be either a raw CFF font or a\n\
+PostScript-flavored OpenType font. The result, which is usually written to the\n\
+standard output, is written in PFB or PFA format.\n\
+\n\
+Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -n, --name=NAME Select font NAME from CFF.\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ -h, --help Print this message and exit.\n\
+ -v, --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+// MAIN
+
+static void
+do_file(const char *infn, const char *outfn, PermString name, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!infn || strcmp(infn, "-") == 0) {
+ f = stdin;
+ infn = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(infn, "rb")))
+ errh->fatal("%s: %s", infn, strerror(errno));
+
+ int c = getc(f);
+ ungetc(c, f);
+
+ Cff::Font *font = 0;
+
+ if (c == EOF)
+ errh->fatal("%s: empty file", infn);
+ if (c == 1 || c == 'O') {
+ StringAccum sa(150000);
+ while (!feof(f)) {
+ int forward = fread(sa.reserve(32768), 1, 32768, f);
+ sa.forward(forward);
+ }
+ if (f != stdin)
+ fclose(f);
+
+ LandmarkErrorHandler cerrh(errh, infn);
+ String data = sa.take_string();
+ if (c == 'O')
+ data = Efont::OpenType::Font(data, &cerrh).table("CFF");
+
+ Cff *cff = new Cff(data, &cerrh);
+ Cff::FontParent *fp = cff->font(name, &cerrh);
+ if (errh->nerrors() == 0
+ && !(font = dynamic_cast<Cff::Font *>(fp)))
+ errh->fatal("%s: CID-keyed fonts not supported", infn);
+ } else
+ errh->fatal("%s: not a CFF or OpenType/CFF font", infn);
+
+ if (errh->nerrors() > 0)
+ return;
+
+ Type1Font *font1 = create_type1_font(font, errh);
+
+ if (!outfn || strcmp(outfn, "-") == 0) {
+ f = stdout;
+ outfn = "<stdout>";
+ } else if (!(f = fopen(outfn, "wb")))
+ errh->fatal("%s: %s", outfn, strerror(errno));
+
+ if (binary) {
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ Type1PFBWriter t1w(f);
+ font1->write(t1w);
+ } else {
+ Type1PFAWriter t1w(f);
+ font1->write(t1w);
+ }
+
+ if (f != stdout)
+ fclose(f);
+}
+
+int
+main(int argc, char *argv[])
+{
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ const char *input_file = 0;
+ const char *output_file = 0;
+ const char *font_name = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case PFA_OPT:
+ binary = false;
+ break;
+
+ case PFB_OPT:
+ binary = true;
+ break;
+
+ case NAME_OPT:
+ if (font_name)
+ usage_error(errh, "font name specified twice");
+ font_name = clp->arg;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = ErrorHandler::silent_handler();
+ break;
+
+ case VERSION_OPT:
+ printf("cfftot1 (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2002-2004 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case OUTPUT_OPT:
+ output_file:
+ if (output_file)
+ usage_error(errh, "output file specified twice");
+ output_file = clp->arg;
+ break;
+
+ case Clp_NotOption:
+ if (input_file && output_file)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto output_file;
+ else
+ input_file = clp->arg;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ do_file(input_file, output_file, font_name, errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/utils/lcdf-typetools/cfftot1/maket1font.cc b/Build/source/utils/lcdf-typetools/cfftot1/maket1font.cc
new file mode 100644
index 00000000000..21e1c186146
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/cfftot1/maket1font.cc
@@ -0,0 +1,545 @@
+/* maket1font.{cc,hh} -- translate CFF fonts to Type 1 fonts
+ *
+ * Copyright (c) 2002-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "maket1font.hh"
+#include <efont/t1interp.hh>
+#include <efont/t1csgen.hh>
+#include <lcdf/point.hh>
+#include <lcdf/error.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1unparser.hh>
+
+using namespace Efont;
+
+typedef unsigned CsRef;
+enum { CSR_GLYPH = 0x00000000, CSR_SUBR = 0x80000000,
+ CSR_GSUBR = 0xC0000000,
+ CSR_TYPE = 0xC0000000, CSR_NUM = 0x3FFFFFFF };
+
+class MakeType1CharstringInterp : public Type1CharstringGenInterp { public:
+
+ MakeType1CharstringInterp(int precision = 5);
+ ~MakeType1CharstringInterp();
+
+ Type1Font *output() const { return _output; }
+
+ void run(const CharstringProgram *, Type1Font *, PermString glyph_definer, ErrorHandler *);
+ void run(const CharstringContext &, Type1Charstring &, ErrorHandler *);
+
+ bool type2_command(int, const uint8_t *, int *);
+
+ String landmark() const;
+
+ class Subr;
+
+ private:
+
+ // output
+ Type1Font *_output;
+ bool _flex_message;
+
+ // subroutines
+ int _subr_bias;
+ int _gsubr_bias;
+ mutable Vector<Subr *> _glyphs;
+ mutable Vector<Subr *> _subrs;
+ mutable Vector<Subr *> _gsubrs;
+
+ Subr *_cur_subr;
+ int _cur_glyph;
+
+ Subr *csr_subr(CsRef, bool force) const;
+ Type1Charstring *csr_charstring(CsRef) const;
+
+};
+
+class MakeType1CharstringInterp::Subr { public:
+
+ Subr(CsRef csr) : _csr(csr), _output_subrno(-1), _stamp(0) { }
+
+ bool up_to_date() const { return _stamp == max_stamp; }
+ void update() { _stamp = max_stamp; }
+ static void bump_date() { max_stamp++; }
+
+ Type1Charstring *charstring(const MakeType1CharstringInterp *) const;
+
+ int ncalls() const { return _calls.size(); }
+ Subr *call(int i) const { return _calls[i]; }
+ bool has_call(Subr *) const;
+
+ struct Caller {
+ Subr *subr;
+ int pos;
+ int len;
+ String s;
+ Caller(Subr *s, int p, int l) : subr(s), pos(p), len(l) { }
+ String charstring(MakeType1CharstringInterp *mcsi) const { return subr->charstring(mcsi)->substring(pos, len); }
+ };
+
+ int ncallers() const { return _callers.size(); }
+ const Caller &caller(int i) const { return _callers[i]; }
+
+ void add_call(Subr *s) { _calls.push_back(s); }
+ void add_caller(Subr *, int, int);
+
+ int output_subrno() const { return _output_subrno; }
+ void set_output_subrno(int n) { _output_subrno = n; }
+
+ void transfer_nested_calls(int pos, int length, Subr *new_caller) const;
+ void change_callers(Subr *, int pos, int length, int new_length);
+ bool unify(MakeType1CharstringInterp *);
+
+ void caller_data(bool assign, MakeType1CharstringInterp *mcsi);
+
+ private:
+
+ CsRef _csr;
+ Vector<Subr *> _calls;
+ Vector<Caller> _callers;
+
+ int _output_subrno;
+ int _stamp;
+
+ static int max_stamp;
+
+ friend class MakeType1CharstringInterp;
+
+};
+
+int MakeType1CharstringInterp::Subr::max_stamp = 1;
+
+inline void
+MakeType1CharstringInterp::Subr::add_caller(Subr *s, int pos, int len)
+{
+ _callers.push_back(Caller(s, pos, len));
+}
+
+bool
+MakeType1CharstringInterp::Subr::has_call(Subr *s) const
+{
+ for (int i = 0; i < _calls.size(); i++)
+ if (_calls[i] == s)
+ return true;
+ return false;
+}
+
+
+/*****
+ * MakeType1CharstringInterp
+ **/
+
+MakeType1CharstringInterp::MakeType1CharstringInterp(int precision)
+ : Type1CharstringGenInterp(precision), _flex_message(false)
+{
+}
+
+MakeType1CharstringInterp::~MakeType1CharstringInterp()
+{
+ for (int i = 0; i < _glyphs.size(); i++)
+ delete _glyphs[i];
+ for (int i = 0; i < _subrs.size(); i++)
+ delete _subrs[i];
+ for (int i = 0; i < _gsubrs.size(); i++)
+ delete _gsubrs[i];
+}
+
+String
+MakeType1CharstringInterp::landmark() const
+{
+ if (_cur_glyph >= 0 && _cur_glyph < program()->nglyphs())
+ return String("glyph '") + program()->glyph_name(_cur_glyph) + "'";
+ else
+ return String();
+}
+
+
+// subroutines
+
+MakeType1CharstringInterp::Subr *
+MakeType1CharstringInterp::csr_subr(CsRef csr, bool force) const
+{
+ Vector<Subr *> *vp;
+ if ((csr & CSR_TYPE) == CSR_SUBR)
+ vp = &_subrs;
+ else if ((csr & CSR_TYPE) == CSR_GSUBR)
+ vp = &_gsubrs;
+ else if ((csr & CSR_TYPE) == CSR_GLYPH)
+ vp = &_glyphs;
+ else
+ return 0;
+
+ int n = (csr & CSR_NUM);
+ if (n >= vp->size())
+ return 0;
+
+ Subr *&what = (*vp)[n];
+ if (!what && force)
+ what = new Subr(csr);
+ return what;
+}
+
+Type1Charstring *
+MakeType1CharstringInterp::Subr::charstring(const MakeType1CharstringInterp *mcsi) const
+{
+ int n = (_csr & CSR_NUM);
+ switch (_csr & CSR_TYPE) {
+ case CSR_SUBR:
+ case CSR_GSUBR:
+ if (_output_subrno >= 0)
+ return static_cast<Type1Charstring *>(mcsi->output()->subr(_output_subrno));
+ return 0;
+ case CSR_GLYPH:
+ return static_cast<Type1Charstring *>(mcsi->output()->glyph(n));
+ default:
+ return 0;
+ }
+}
+
+void
+MakeType1CharstringInterp::Subr::transfer_nested_calls(int pos, int length, Subr *new_caller) const
+{
+ int right = pos + length;
+ for (int i = 0; i < _calls.size(); i++) {
+ Subr *cs = _calls[i];
+ for (int j = 0; j < cs->_callers.size(); j++) {
+ Caller &c = cs->_callers[j];
+ if (c.subr == this && pos <= c.pos && c.pos + c.len <= right) {
+ c.subr = new_caller;
+ c.pos -= pos;
+ new_caller->add_call(cs);
+ }
+ }
+ }
+}
+
+void
+MakeType1CharstringInterp::Subr::change_callers(Subr *caller, int pos, int length, int new_length)
+{
+ if (up_to_date())
+ return;
+ update();
+
+ int right = pos + length;
+ int delta = new_length - length;
+ for (int i = 0; i < _callers.size(); i++) {
+ Caller &c = _callers[i];
+ if (c.subr != caller)
+ /* nada */;
+ else if (pos <= c.pos && c.pos + c.len <= right) {
+ // erase
+ //fprintf(stderr, " ERASE caller %08x:%d+%d\n", c.subr->_csr, c.pos, c.len);
+ c.subr = 0;
+ } else if (right <= c.pos) {
+ //fprintf(stderr, " ADJUST caller %08x:%d+%d -> %d+%d\n", c.subr->_csr, c.pos, c.len, c.pos+delta, c.len);
+ c.pos += delta;
+ } else if (c.pos <= pos && right <= c.pos + c.len) {
+ c.len += delta;
+ } else
+ c.subr = 0;
+ }
+}
+
+void
+MakeType1CharstringInterp::Subr::caller_data(bool assign, MakeType1CharstringInterp *mcsi)
+{
+ for (int i = 0; i < _callers.size(); i++) {
+ Caller &c = _callers[i];
+ if (!c.subr)
+ continue;
+ String s = c.subr->charstring(mcsi)->substring(c.pos, c.len);
+ if (assign)
+ c.s = s;
+ else if (c.s != s) {
+ //fprintf(stderr, "FAIL %08x caller %08x:%d+%d\n", _csr, c.subr->_csr, c.pos, c.len);
+ //assert(0);
+ }
+ assert(c.subr->has_call(this));
+ }
+}
+
+bool
+MakeType1CharstringInterp::Subr::unify(MakeType1CharstringInterp *mcsi)
+{
+ // clean up caller list
+ for (int i = 0; i < _callers.size(); i++)
+ if (!_callers[i].subr) {
+ _callers[i] = _callers.back();
+ _callers.pop_back();
+ i--;
+ }
+
+ if (!_callers.size())
+ return false;
+ assert(!_calls.size());
+
+ // Find the smallest shared substring.
+ String substr = _callers[0].charstring(mcsi);
+ int suboff = 0;
+ for (int i = 1; i < _callers.size(); i++) {
+ String substr1 = _callers[i].charstring(mcsi);
+ const char *d = substr.data() + suboff, *d1 = substr1.data();
+ const char *dx = substr.data() + substr.length(), *d1x = d1 + substr1.length();
+ while (dx > d && d1x > d1 && dx[-1] == d1x[-1])
+ dx--, d1x--;
+ suboff = dx - substr.data();
+ }
+ substr = substr.substring(Type1Charstring(substr).first_caret_after(suboff));
+ if (!substr.length())
+ return false;
+ for (int i = 0; i < _callers.size(); i++) {
+ Caller &c = _callers[i];
+ if (int delta = c.len - substr.length()) {
+ c.pos += delta;
+ c.len -= delta;
+ }
+ }
+
+ // otherwise, success
+ _output_subrno = mcsi->output()->nsubrs();
+ mcsi->output()->set_subr(_output_subrno, Type1Charstring(substr + "\013"));
+
+ // note calls
+ _callers[0].subr->transfer_nested_calls(_callers[0].pos, _callers[0].len, this);
+
+ // adapt callers
+ String callsubr_string = Type1CharstringGen::callsubr_string(_output_subrno);
+ for (int i = 0; i < _callers.size(); i++)
+ // 13.Jun.2003 - must check whether _callers[i].subr exists: if we
+ // called a subroutine more than once, change_callers() might have
+ // zeroed it out.
+ if (_callers[i].subr && _callers[i].subr != this) {
+ Subr::Caller c = _callers[i];
+ //fprintf(stderr, " SUBSTRING %08x:%d+%d\n", c.subr->_csr, c.pos, c.len);
+ c.subr->charstring(mcsi)->assign_substring(c.pos, c.len, callsubr_string);
+ Subr::bump_date();
+ for (int j = 0; j < c.subr->ncalls(); j++)
+ c.subr->call(j)->change_callers(c.subr, c.pos, c.len, callsubr_string.length());
+ assert(!_callers[i].subr);
+ }
+
+ // this subr is no longer "called"/interpolated from anywhere
+ _callers.clear();
+
+ //fprintf(stderr, "Succeeded %x\n", _csr);
+ return true;
+}
+
+
+// running
+
+bool
+MakeType1CharstringInterp::type2_command(int cmd, const uint8_t *data, int *left)
+{
+ switch (cmd) {
+
+ case Cs::cCallsubr:
+ case Cs::cCallgsubr:
+ if (subr_depth() < MAX_SUBR_DEPTH && size() == 1) {
+ //fprintf(stderr, "succeeded %d\n", (int) top());
+ bool g = (cmd == Cs::cCallgsubr);
+ CsRef csref = ((int)top() + program()->xsubr_bias(g)) | (g ? CSR_GSUBR : CSR_SUBR);
+ Subr *callee = csr_subr(csref, true);
+ if (callee)
+ _cur_subr->add_call(callee);
+
+ int left = csgen().length();
+
+ bool more = callxsubr_command(g);
+
+ int right = csgen().length();
+ if (error() >= 0 && callee)
+ callee->add_caller(_cur_subr, left, right - left);
+ return more;
+ } else {
+ //fprintf(stderr, "failed %d\n", (int) top());
+ goto normal;
+ }
+
+ normal:
+ default:
+ return CharstringInterp::type2_command(cmd, data, left);
+
+ }
+}
+
+void
+MakeType1CharstringInterp::run(const CharstringContext &g, Type1Charstring &out, ErrorHandler *errh)
+{
+ Type1CharstringGenInterp::run(g, out);
+
+ if (Type1CharstringGenInterp::bad_flex() && !_flex_message) {
+ errh->lwarning(landmark(), "complex flex hint replaced with curves");
+ errh->message("(This Type 2 format font contains flex hints prohibited by Type 1.\nI've safely replaced them with ordinary curves.)");
+ _flex_message = true;
+ }
+}
+
+void
+MakeType1CharstringInterp::run(const CharstringProgram *program, Type1Font *output, PermString glyph_definer, ErrorHandler *errh)
+{
+ _output = output;
+ set_hint_replacement_storage(output);
+
+ _glyphs.assign(program->nglyphs(), 0);
+ _subrs.assign(program->nsubrs(), 0);
+ _subr_bias = program->subr_bias();
+ _gsubrs.assign(program->ngsubrs(), 0);
+ _gsubr_bias = program->gsubr_bias();
+
+ // run over the glyphs
+ int nglyphs = program->nglyphs();
+ Type1Charstring receptacle;
+ for (int i = 0; i < nglyphs; i++) {
+ _cur_subr = _glyphs[i] = new Subr(CSR_GLYPH | i);
+ _cur_glyph = i;
+ run(program->glyph_context(i), receptacle, errh);
+#if 0
+ PermString n = program->glyph_name(i);
+ if (1 || n == "one") {
+ fprintf(stderr, "%s was %s\n", n.c_str(), CharstringUnparser::unparse(*program->glyph(i)).c_str());
+ fprintf(stderr, "%s == %s\n", n.c_str(), CharstringUnparser::unparse(receptacle).c_str());
+ }
+#endif
+ output->add_glyph(Type1Subr::make_glyph(program->glyph_name(i), receptacle, glyph_definer));
+ }
+
+ // unify Subrs
+ for (int i = 0; i < _subrs.size(); i++)
+ if (_subrs[i])
+ _subrs[i]->unify(this);
+
+ for (int i = 0; i < _gsubrs.size(); i++)
+ if (_gsubrs[i])
+ _gsubrs[i]->unify(this);
+}
+
+
+/*****
+ * main
+ **/
+
+static void
+add_number_def(Type1Font *output, int dict, PermString name, const Cff::Font *font, Cff::DictOperator op)
+{
+ double v;
+ if (font->dict_value(op, &v))
+ output->add_definition(dict, Type1Definition::make(name, v, "def"));
+}
+
+static void
+add_delta_def(Type1Font *output, int dict, PermString name, const Cff::Font *font, Cff::DictOperator op)
+{
+ Vector<double> vec;
+ if (font->dict_value(op, vec)) {
+ for (int i = 1; i < vec.size(); i++)
+ vec[i] += vec[i - 1];
+ StringAccum sa;
+ for (int i = 0; i < vec.size(); i++)
+ sa << (i ? ' ' : '[') << vec[i];
+ sa << ']';
+ output->add_definition(dict, Type1Definition::make_literal(name, sa.take_string(), (dict == Type1Font::dP ? "|-" : "readonly def")));
+ }
+}
+
+Type1Font *
+create_type1_font(Cff::Font *font, ErrorHandler *errh)
+{
+ String version = font->dict_string(Cff::oVersion);
+ Type1Font *output = Type1Font::skeleton_make(font->font_name(), version);
+ output->skeleton_comments_end();
+ StringAccum sa;
+
+ // FontInfo dictionary
+ if (version)
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("version", version, "readonly def"));
+ if (String s = font->dict_string(Cff::oNotice))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("Notice", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oCopyright))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("Copyright", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oFullName))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("FullName", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oFamilyName))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("FamilyName", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oWeight))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("Weight", s, "readonly def"));
+ double v;
+ if (font->dict_value(Cff::oIsFixedPitch, &v))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_literal("isFixedPitch", (v ? "true" : "false"), "def"));
+ add_number_def(output, Type1Font::dFI, "ItalicAngle", font, Cff::oItalicAngle);
+ add_number_def(output, Type1Font::dFI, "UnderlinePosition", font, Cff::oUnderlinePosition);
+ add_number_def(output, Type1Font::dFI, "UnderlineThickness", font, Cff::oUnderlineThickness);
+ output->skeleton_fontinfo_end();
+
+ // Encoding, other font dictionary entries
+ output->add_item(font->type1_encoding_copy());
+ font->dict_value(Cff::oPaintType, &v);
+ output->add_definition(Type1Font::dF, Type1Definition::make("PaintType", v, "def"));
+ output->add_definition(Type1Font::dF, Type1Definition::make("FontType", 1.0, "def"));
+ Vector<double> vec;
+ if (font->dict_value(Cff::oFontMatrix, vec) && vec.size() == 6) {
+ sa << '[' << vec[0] << ' ' << vec[1] << ' ' << vec[2] << ' ' << vec[3] << ' ' << vec[4] << ' ' << vec[5] << ']';
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontMatrix", sa.take_string(), "readonly def"));
+ } else
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontMatrix", "[0.001 0 0 0.001 0 0]", "readonly def"));
+ add_number_def(output, Type1Font::dF, "StrokeWidth", font, Cff::oStrokeWidth);
+ add_number_def(output, Type1Font::dF, "UniqueID", font, Cff::oUniqueID);
+ if (font->dict_value(Cff::oXUID, vec) && vec.size()) {
+ for (int i = 0; i < vec.size(); i++)
+ sa << (i ? ' ' : '[') << vec[i];
+ sa << ']';
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("XUID", sa.take_string(), "readonly def"));
+ }
+ if (font->dict_value(Cff::oFontBBox, vec) && vec.size() == 4) {
+ sa << '{' << vec[0] << ' ' << vec[1] << ' ' << vec[2] << ' ' << vec[3] << '}';
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontBBox", sa.take_string(), "readonly def"));
+ } else
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontBBox", "{0 0 0 0}", "readonly def"));
+ output->skeleton_fontdict_end();
+
+ // Private dictionary
+ add_delta_def(output, Type1Font::dP, "BlueValues", font, Cff::oBlueValues);
+ add_delta_def(output, Type1Font::dP, "OtherBlues", font, Cff::oOtherBlues);
+ add_delta_def(output, Type1Font::dP, "FamilyBlues", font, Cff::oFamilyBlues);
+ add_delta_def(output, Type1Font::dP, "FamilyOtherBlues", font, Cff::oFamilyOtherBlues);
+ add_number_def(output, Type1Font::dP, "BlueScale", font, Cff::oBlueScale);
+ add_number_def(output, Type1Font::dP, "BlueShift", font, Cff::oBlueShift);
+ add_number_def(output, Type1Font::dP, "BlueFuzz", font, Cff::oBlueFuzz);
+ if (font->dict_value(Cff::oStdHW, &v))
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("StdHW", String("[") + String(v) + "]", "|-"));
+ if (font->dict_value(Cff::oStdVW, &v))
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("StdVW", String("[") + String(v) + "]", "|-"));
+ add_delta_def(output, Type1Font::dP, "StemSnapH", font, Cff::oStemSnapH);
+ add_delta_def(output, Type1Font::dP, "StemSnapV", font, Cff::oStemSnapV);
+ if (font->dict_value(Cff::oForceBold, &v))
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("ForceBold", (v ? "true" : "false"), "def"));
+ add_number_def(output, Type1Font::dP, "LanguageGroup", font, Cff::oLanguageGroup);
+ add_number_def(output, Type1Font::dP, "ExpansionFactor", font, Cff::oExpansionFactor);
+ add_number_def(output, Type1Font::dP, "UniqueID", font, Cff::oUniqueID);
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("MinFeature", "{16 16}", "|-"));
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("password", "5839", "def"));
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("lenIV", "0", "def"));
+ output->skeleton_private_end();
+ output->skeleton_common_subrs();
+
+ // add glyphs
+ MakeType1CharstringInterp maker(5);
+ maker.run(font, output, " |-", errh);
+
+ return output;
+}
+
+#include <lcdf/vector.cc>
diff --git a/Build/source/utils/lcdf-typetools/cfftot1/maket1font.hh b/Build/source/utils/lcdf-typetools/cfftot1/maket1font.hh
new file mode 100644
index 00000000000..75f2527897f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/cfftot1/maket1font.hh
@@ -0,0 +1,10 @@
+#ifndef EFONT_MAKET1FONT_HH
+#define EFONT_MAKET1FONT_HH
+#include <efont/cff.hh>
+namespace Efont {
+class Type1Font;
+}
+
+Efont::Type1Font *create_type1_font(Efont::Cff::Font *, ErrorHandler *);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/config.h.in b/Build/source/utils/lcdf-typetools/config.h.in
new file mode 100644
index 00000000000..a366c21afa8
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/config.h.in
@@ -0,0 +1,208 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+#ifndef LCDF_TYPETOOLS_CONFIG_H
+#define LCDF_TYPETOOLS_CONFIG_H
+
+/* Define if strtod is broken. */
+#undef BROKEN_STRTOD
+
+/* Define if the va_list type is addressable. */
+#undef HAVE_ADDRESSABLE_VA_LIST
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to run cfftot1 automatically from otftotfm. */
+#undef HAVE_AUTO_CFFTOT1
+
+/* Define to run t1dotlessj automatically from otftotfm. */
+#undef HAVE_AUTO_T1DOTLESSJ
+
+/* Define to run system updmap automatically from otftotfm. */
+#undef HAVE_AUTO_UPDMAP
+
+/* Define to 1 if you have the <byteorder.h> header file. */
+#undef HAVE_BYTEORDER_H
+
+/* Define to 1 if you have the `ctime' function. */
+#undef HAVE_CTIME
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define if intXX_t types are not available. */
+#undef HAVE_FAKE_INT_TYPES
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you want to use kpathsea. */
+#undef HAVE_KPATHSEA
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <new.h> header file. */
+#undef HAVE_NEW_H
+
+/* Define if <new> exists and works. */
+#undef HAVE_NEW_HDR
+
+/* Define if PermStrings are available. */
+#undef HAVE_PERMSTRING
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have u_intXX_t types but not uintXX_t types. */
+#undef HAVE_U_INT_TYPES
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define to 0 if you don't want mmafm to run mmpfb when it needs to get an
+ intermediate master conversion program. */
+#undef MMAFM_RUN_MMPFB
+
+/* Define to 1 if you must include <arpa/inet.h> to get `ntohl'. */
+#undef NEED_ARPA_INET_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* kpsewhich's $SELFAUTODIR variable */
+#undef SELFAUTODIR
+
+/* kpsewhich's $SELFAUTOLOC variable */
+#undef SELFAUTOLOC
+
+/* kpsewhich's $SELFAUTOPARENT variable */
+#undef SELFAUTOPARENT
+
+/* Data directory. */
+#undef SHAREDIR
+
+/* The size of a `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of a `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Allow compilation on Windows (thanks, Fabrice Popineau). */
+#ifdef WIN32
+# include <win32lib.h>
+#else
+# define CDECL /* nothing */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype strerror if we don't have it. */
+#if !HAVE_STRERROR
+char *strerror(int errno);
+#endif
+
+/* Prototype good_strtod if we need it. */
+#if BROKEN_STRTOD
+double good_strtod(const char *nptr, char **endptr);
+#endif
+
+#ifdef __cplusplus
+}
+/* Get rid of a possible inline macro under C++. */
+# define inline inline
+#endif
+
+#endif /* LCDF_TYPETOOLS_CONFIG_H */
diff --git a/Build/source/utils/lcdf-typetools/configure b/Build/source/utils/lcdf-typetools/configure
new file mode 100755
index 00000000000..43f07779ac6
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/configure
@@ -0,0 +1,9953 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="NEWS"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP RANLIB ac_ct_RANLIB TEMPLATE_OBJS SELECTED_SUBDIRS EGREP KPSEINTERFACE_O LIBKPATHSEA LIBKPATHSEA_DEP FIXLIBC_O LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --disable-cfftot1 do not build the cfftot1 program
+ --disable-mmafm do not build the mmafm program
+ --disable-mmpfb do not build the mmpfb program
+ --disable-otfinfo do not build the otfinfo program
+ --disable-otftotfm do not build the otftotfm program
+ --disable-t1dotlessj do not build the t1dotlessj program
+ --disable-t1lint do not build the t1lint program
+ --disable-t1reencode do not build the t1reencode program
+ --disable-t1testpage do not build the t1testpage program
+ --enable-tetex-build build as part of a teTeX installation
+ --disable-selfauto-set disable setting SELFAUTO variables from kpsewhich
+ --disable-auto-cfftot1 disable running cfftot1 from otftotfm
+ --disable-auto-t1dotlessj disable running t1dotlessj from otftotfm
+ --disable-auto-updmap disable running updmap from otftotfm
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-kpathsea=PREFIX Kpathsea is installed (under PREFIX)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=lcdf-typetools
+ VERSION=2.34
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+ ac_config_headers="$ac_config_headers config.h"
+
+echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi;
+ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$GCC" ; then CC="$CC -W -Wall" ; CXX="$CXX -W -Wall" ; fi
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+
+
+
+echo "$as_me:$LINENO: checking where template objects are stored" >&5
+echo $ECHO_N "checking where template objects are stored... $ECHO_C" >&6
+if test "${ac_cv_cxx_templobjs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_cxx_templobjs='unknown'
+ if test "$GXX" = yes; then
+ ac_cv_cxx_templobjs='nowhere'
+ else
+ case $CXX in
+ CC|*/CC)
+ cat > conftest.cc <<EOF
+template<class T> class A { public : A () {} };
+template<class T> void f (const A<T>&) {}
+main()
+{ A<double> d;
+ A<int> i;
+ f (d);
+ f (i);
+ return 0;
+}
+EOF
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d Templates.DB ; then
+ rm -fr Templates.DB
+ fi
+ if $CXX $CXXFLAGS -ptr. -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d Templates.DB ; then
+# this should be Sun CC <= 4.2
+ CXXFLAGS="$CXXFLAGS -ptr."
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='Templates.DB/*.o'
+ else
+ ac_cv_cxx_templobjs='Templates.DB/*.lo'
+ fi
+ rm -fr Templates.DB
+ fi
+ fi
+ fi
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d SunWS_cache ; then
+ rm -fr SunWS_cache
+ fi
+ if $CXX $CXXFLAGS -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d SunWS_cache ; then
+# this should be Sun WorkShop C++ compiler 5.x
+# or Sun Forte C++ compiler >= 6.x
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.o'
+ else
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.lo'
+ fi
+ rm -fr SunWS_cache
+ fi
+ fi
+ fi
+ rm -f conftest* ;;
+ esac
+ fi
+ case "x$ac_cv_cxx_templobjs" in
+ xunknown|xnowhere)
+ TEMPLATE_OBJS="" ;;
+ *)
+ TEMPLATE_OBJS="$ac_cv_cxx_templobjs" ;;
+ esac
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_templobjs" >&5
+echo "${ECHO_T}$ac_cv_cxx_templobjs" >&6
+
+
+
+
+
+
+
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+if test "${ac_cv_search_opendir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+ac_cv_search_opendir=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main ()
+{
+opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_opendir="none required"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_opendir" = no; then
+ for ac_lib in dir; do
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main ()
+{
+opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_opendir="-l$ac_lib"
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6
+if test "$ac_cv_search_opendir" != no; then
+ test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+
+fi
+
+else
+ echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+if test "${ac_cv_search_opendir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+ac_cv_search_opendir=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main ()
+{
+opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_opendir="none required"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_opendir" = no; then
+ for ac_lib in x; do
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main ()
+{
+opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_opendir="-l$ac_lib"
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6
+if test "$ac_cv_search_opendir" != no; then
+ test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+
+fi
+
+fi
+
+
+
+
+# Check whether --enable-cfftot1 or --disable-cfftot1 was given.
+if test "${enable_cfftot1+set}" = set; then
+ enableval="$enable_cfftot1"
+ :
+else
+ enable_cfftot1=yes
+fi;
+# Check whether --enable-mmafm or --disable-mmafm was given.
+if test "${enable_mmafm+set}" = set; then
+ enableval="$enable_mmafm"
+ :
+else
+ enable_mmafm=yes
+fi;
+# Check whether --enable-mmpfb or --disable-mmpfb was given.
+if test "${enable_mmpfb+set}" = set; then
+ enableval="$enable_mmpfb"
+ :
+else
+ enable_mmpfb=yes
+fi;
+# Check whether --enable-otfinfo or --disable-otfinfo was given.
+if test "${enable_otfinfo+set}" = set; then
+ enableval="$enable_otfinfo"
+ :
+else
+ enable_otfinfo=yes
+fi;
+# Check whether --enable-otftotfm or --disable-otftotfm was given.
+if test "${enable_otftotfm+set}" = set; then
+ enableval="$enable_otftotfm"
+ :
+else
+ enable_otftotfm=yes
+fi;
+# Check whether --enable-t1lint or --disable-t1lint was given.
+if test "${enable_t1lint+set}" = set; then
+ enableval="$enable_t1lint"
+ :
+else
+ enable_t1dotlessj=yes
+fi;
+# Check whether --enable-t1lint or --disable-t1lint was given.
+if test "${enable_t1lint+set}" = set; then
+ enableval="$enable_t1lint"
+ :
+else
+ enable_t1lint=yes
+fi;
+# Check whether --enable-t1reencode or --disable-t1reencode was given.
+if test "${enable_t1reencode+set}" = set; then
+ enableval="$enable_t1reencode"
+ :
+else
+ enable_t1reencode=yes
+fi;
+# Check whether --enable-t1testpage or --disable-t1testpage was given.
+if test "${enable_t1testpage+set}" = set; then
+ enableval="$enable_t1testpage"
+ :
+else
+ enable_t1testpage=yes
+fi;
+
+SELECTED_SUBDIRS=''
+for i in cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage; do
+ y=`eval 'echo $enable_'"$i"`
+ if test "x$y" != xno; then SELECTED_SUBDIRS="$SELECTED_SUBDIRS $i"; fi
+done
+
+
+
+
+# Check whether --enable-tetex-build or --disable-tetex-build was given.
+if test "${enable_tetex_build+set}" = set; then
+ enableval="$enable_tetex_build"
+ :
+else
+ enable_tetex_build=no
+fi;
+
+# Check whether --with-kpathsea or --without-kpathsea was given.
+if test "${with_kpathsea+set}" = set; then
+ withval="$with_kpathsea"
+ kpathsea=$withval
+else
+ kpathsea=
+fi;
+
+if test "x$kpathsea" = xno; then
+ KPSEINTERFACE_O=
+ LIBKPATHSEA=
+else
+ if test "x$enable_tetex_build" = xyes; then
+ if test ! -d $srcdir/../../texk/kpathsea; then
+ { { echo "$as_me:$LINENO: error:
+=========================================
+
+You specified --enable-tetex-build, but I can't find the kpathsea
+directory. I expected it to be in $srcdir/../../texk/kpathsea.
+
+=========================================" >&5
+echo "$as_me: error:
+=========================================
+
+You specified --enable-tetex-build, but I can't find the kpathsea
+directory. I expected it to be in $srcdir/../../texk/kpathsea.
+
+=========================================" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ CPPFLAGS="$CPPFLAGS -I\$(top_builddir)/../../texk -I\$(top_srcdir)/../../texk"
+ LDFLAGS="$LDFLAGS -L\$(top_builddir)/../../texk/kpathsea/.libs"
+ elif test "x$kpathsea" != x -a "x$kpathsea" != xyes; then
+ CPPFLAGS="$CPPFLAGS -I$kpathsea/include"
+ LDFLAGS="$LDFLAGS -L$kpathsea/lib"
+ else
+ kpathsea=yes
+ fi
+
+ if test "x$enable_tetex_build" = xyes; then
+ kpse_header=yes
+ else
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "${ac_cv_header_kpathsea_kpathsea_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for kpathsea/kpathsea.h" >&5
+echo $ECHO_N "checking for kpathsea/kpathsea.h... $ECHO_C" >&6
+if test "${ac_cv_header_kpathsea_kpathsea_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_kpathsea_kpathsea_h" >&5
+echo "${ECHO_T}$ac_cv_header_kpathsea_kpathsea_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking kpathsea/kpathsea.h usability" >&5
+echo $ECHO_N "checking kpathsea/kpathsea.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <kpathsea/kpathsea.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking kpathsea/kpathsea.h presence" >&5
+echo $ECHO_N "checking kpathsea/kpathsea.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <kpathsea/kpathsea.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/kpathsea.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: kpathsea/kpathsea.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for kpathsea/kpathsea.h" >&5
+echo $ECHO_N "checking for kpathsea/kpathsea.h... $ECHO_C" >&6
+if test "${ac_cv_header_kpathsea_kpathsea_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_kpathsea_kpathsea_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_kpathsea_kpathsea_h" >&5
+echo "${ECHO_T}$ac_cv_header_kpathsea_kpathsea_h" >&6
+
+fi
+if test $ac_cv_header_kpathsea_kpathsea_h = yes; then
+ kpse_header=yes
+else
+ kpse_header=no
+fi
+
+
+ fi
+
+ if test "x$kpse_header" != xyes -a "x$kpathsea" = xyes -a -r /usr/local/include/kpathsea/tex-file.h; then
+ CPPFLAGS="$CPPFLAGS -I/usr/local/include"
+ LDFLAGS="$LDFLAGS -L/usr/local/lib"
+ if test "${ac_cv_header_kpathsea_tex_file_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for kpathsea/tex-file.h" >&5
+echo $ECHO_N "checking for kpathsea/tex-file.h... $ECHO_C" >&6
+if test "${ac_cv_header_kpathsea_tex_file_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_kpathsea_tex_file_h" >&5
+echo "${ECHO_T}$ac_cv_header_kpathsea_tex_file_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking kpathsea/tex-file.h usability" >&5
+echo $ECHO_N "checking kpathsea/tex-file.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <kpathsea/tex-file.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking kpathsea/tex-file.h presence" >&5
+echo $ECHO_N "checking kpathsea/tex-file.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <kpathsea/tex-file.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: kpathsea/tex-file.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: kpathsea/tex-file.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for kpathsea/tex-file.h" >&5
+echo $ECHO_N "checking for kpathsea/tex-file.h... $ECHO_C" >&6
+if test "${ac_cv_header_kpathsea_tex_file_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_kpathsea_tex_file_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_kpathsea_tex_file_h" >&5
+echo "${ECHO_T}$ac_cv_header_kpathsea_tex_file_h" >&6
+
+fi
+if test $ac_cv_header_kpathsea_tex_file_h = yes; then
+ kpse_header=yes
+else
+ kpse_header=no
+fi
+
+
+ fi
+
+ if test "x$enable_tetex_build" = xyes; then
+ kpse_library=yes
+ else
+ echo "$as_me:$LINENO: checking for kpse_set_program_name in -lkpathsea" >&5
+echo $ECHO_N "checking for kpse_set_program_name in -lkpathsea... $ECHO_C" >&6
+if test "${ac_cv_lib_kpathsea_kpse_set_program_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkpathsea $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char kpse_set_program_name ();
+int
+main ()
+{
+kpse_set_program_name ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_kpathsea_kpse_set_program_name=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_kpathsea_kpse_set_program_name=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_kpathsea_kpse_set_program_name" >&5
+echo "${ECHO_T}$ac_cv_lib_kpathsea_kpse_set_program_name" >&6
+if test $ac_cv_lib_kpathsea_kpse_set_program_name = yes; then
+ kpse_library=yes
+else
+ kpse_library=no
+fi
+
+ fi
+
+ if test "x$kpse_header" != xyes -o "x$kpse_library" != xyes; then
+ { { echo "$as_me:$LINENO: error:
+=========================================
+
+I can't find the kpathsea library and/or header files. Tell me where to look
+using the --with-kpathsea=PREFIX option (header files should be under
+PREFIX/include/kpathsea, and library under PREFIX/lib), or disable support
+using --without-kpathsea.
+
+=========================================" >&5
+echo "$as_me: error:
+=========================================
+
+I can't find the kpathsea library and/or header files. Tell me where to look
+using the --with-kpathsea=PREFIX option (header files should be under
+PREFIX/include/kpathsea, and library under PREFIX/lib), or disable support
+using --without-kpathsea.
+
+=========================================" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_KPATHSEA 1
+_ACEOF
+
+ KPSEINTERFACE_O='kpseinterface.$(OBJEXT)'
+ if test "x$enable_tetex_build" = xyes; then
+ LIBKPATHSEA='$(top_builddir)/../../texk/kpathsea/.libs/libkpathsea.a'
+ LIBKPATHSEA_DEP="$LIBKPATHSEA"
+ else
+ LIBKPATHSEA='-lkpathsea'
+ LIBKPATHSEA_DEP=''
+ fi
+fi
+
+
+
+
+# Check whether --enable-selfauto-set or --disable-selfauto-set was given.
+if test "${enable_selfauto_set+set}" = set; then
+ enableval="$enable_selfauto_set"
+ :
+else
+ enable_selfauto_set=yes
+fi;
+
+if test "x$enable_selfauto_set" = xyes -a "x$kpathsea" != xno -a "x$enable_tetex_build" != xyes; then
+ kpsewhich='kpsewhich'
+ test "x$kpathsea" != xyes -a -x "$kpathsea/bin/kpsewhich" && kpsewhich="$kpathsea/bin/kpsewhich"
+ SELFAUTOLOC=`$kpsewhich --expand-var='$SELFAUTOLOC' 2>/dev/null`
+ SELFAUTODIR=`$kpsewhich --expand-var='$SELFAUTODIR' 2>/dev/null`
+ SELFAUTOPARENT=`$kpsewhich --expand-var='$SELFAUTOPARENT' 2>/dev/null`
+ if test -z "$SELFAUTODIR"; then
+ { echo "$as_me:$LINENO: WARNING:
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================" >&5
+echo "$as_me: WARNING:
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================" >&2;}
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTOLOC "$SELFAUTOLOC"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTODIR "$SELFAUTODIR"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTOPARENT "$SELFAUTOPARENT"
+_ACEOF
+
+fi
+
+# Check whether --enable-auto-cfftot1 or --disable-auto-cfftot1 was given.
+if test "${enable_auto_cfftot1+set}" = set; then
+ enableval="$enable_auto_cfftot1"
+ :
+else
+ enable_auto_cfftot1=yes
+fi;
+# Check whether --enable-auto-t1dotlessj or --disable-auto-t1dotlessj was given.
+if test "${enable_auto_t1dotlessj+set}" = set; then
+ enableval="$enable_auto_t1dotlessj"
+ :
+else
+ enable_auto_t1dotlessj=yes
+fi;
+# Check whether --enable-auto-updmap or --disable-auto-updmap was given.
+if test "${enable_auto_updmap+set}" = set; then
+ enableval="$enable_auto_updmap"
+ :
+else
+ enable_auto_updmap=yes
+fi;
+
+if test "x$enable_auto_cfftot1" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_AUTO_CFFTOT1 1
+_ACEOF
+
+fi
+if test "x$enable_auto_t1dotlessj" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_AUTO_T1DOTLESSJ 1
+_ACEOF
+
+fi
+if test "x$enable_auto_updmap" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_AUTO_UPDMAP 1
+_ACEOF
+
+fi
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking whether <new> works" >&5
+echo $ECHO_N "checking whether <new> works... $ECHO_C" >&6
+if test "${ac_cv_good_new_hdr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <new>
+int
+main ()
+{
+
+ int a;
+ int *b = new(&a) int;
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_good_new_hdr=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_good_new_hdr=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_good_new_hdr" >&5
+echo "${ECHO_T}$ac_cv_good_new_hdr" >&6
+if test "$ac_cv_good_new_hdr" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_NEW_HDR 1
+_ACEOF
+
+fi
+
+
+for ac_header in new.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+FIXLIBC_O=''
+
+for ac_func in strerror
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ :
+else
+ FIXLIBC_O='fixlibc.o'
+fi
+done
+
+
+echo "$as_me:$LINENO: checking whether strtod works" >&5
+echo $ECHO_N "checking whether strtod works... $ECHO_C" >&6
+if test "${ac_cv_working_strtod+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_working_strtod=yes
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stdlib.h>
+int main(int c, char **v) {
+ char s[] = "12 ";
+ char *endp;
+ double d = strtod(s, &endp);
+ exit(*endp == 0 ? 1 : 0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_working_strtod=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_working_strtod=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_working_strtod" >&5
+echo "${ECHO_T}$ac_cv_working_strtod" >&6
+if test $ac_cv_working_strtod = no; then
+ FIXLIBC_O='fixlibc.o'
+
+cat >>confdefs.h <<\_ACEOF
+#define BROKEN_STRTOD 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+for ac_func in strtoul ctime mkstemp ftruncate sigaction waitpid
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+echo "$as_me:$LINENO: checking for floor" >&5
+echo $ECHO_N "checking for floor... $ECHO_C" >&6
+if test "${ac_cv_func_floor+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define floor to an innocuous variant, in case <limits.h> declares floor.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define floor innocuous_floor
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char floor (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef floor
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char floor ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_floor) || defined (__stub___floor)
+choke me
+#else
+char (*f) () = floor;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != floor;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_floor=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_floor=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_floor" >&5
+echo "${ECHO_T}$ac_cv_func_floor" >&6
+if test $ac_cv_func_floor = yes; then
+ :
+else
+
+echo "$as_me:$LINENO: checking for floor in -lm" >&5
+echo $ECHO_N "checking for floor in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_floor+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char floor ();
+int
+main ()
+{
+floor ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_floor=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_floor=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
+echo "${ECHO_T}$ac_cv_lib_m_floor" >&6
+if test $ac_cv_lib_m_floor = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+
+fi
+
+echo "$as_me:$LINENO: checking for fabs" >&5
+echo $ECHO_N "checking for fabs... $ECHO_C" >&6
+if test "${ac_cv_func_fabs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define fabs to an innocuous variant, in case <limits.h> declares fabs.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define fabs innocuous_fabs
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char fabs (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef fabs
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char fabs ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_fabs) || defined (__stub___fabs)
+choke me
+#else
+char (*f) () = fabs;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != fabs;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_fabs=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_fabs=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_fabs" >&5
+echo "${ECHO_T}$ac_cv_func_fabs" >&6
+if test $ac_cv_func_fabs = yes; then
+ :
+else
+
+echo "$as_me:$LINENO: checking for fabs in -lm" >&5
+echo $ECHO_N "checking for fabs in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_fabs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char fabs ();
+int
+main ()
+{
+fabs ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_fabs=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_fabs=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_fabs" >&5
+echo "${ECHO_T}$ac_cv_lib_m_fabs" >&6
+if test $ac_cv_lib_m_fabs = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+
+fi
+
+
+
+
+
+for ac_header in unistd.h fcntl.h sys/time.h sys/wait.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+for ac_header in inttypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_inttypes_h=yes
+else
+ have_inttypes_h=no
+fi
+
+done
+
+
+for ac_header in sys/types.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_sys_types_h=yes
+else
+ have_sys_types_h=no
+fi
+
+done
+
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ echo "$as_me:$LINENO: checking for uintXX_t typedefs" >&5
+echo $ECHO_N "checking for uintXX_t typedefs... $ECHO_C" >&6
+if test "${ac_cv_uint_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ ac_cv_uint_t=yes
+else
+ ac_cv_uint_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_uint_t" >&5
+echo "${ECHO_T}$ac_cv_uint_t" >&6
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ echo "$as_me:$LINENO: checking for u_intXX_t typedefs" >&5
+echo $ECHO_N "checking for u_intXX_t typedefs... $ECHO_C" >&6
+if test "${ac_cv_u_int_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ ac_cv_u_int_t=yes
+else
+ ac_cv_u_int_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_u_int_t" >&5
+echo "${ECHO_T}$ac_cv_u_int_t" >&6
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_U_INT_TYPES 1
+_ACEOF
+
+else
+ { echo "$as_me:$LINENO: WARNING:
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming \"short\" has 16 bits and \"int\" has 32 bits.
+
+=========================================" >&5
+echo "$as_me: WARNING:
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming \"short\" has 16 bits and \"int\" has 32 bits.
+
+=========================================" >&2;}
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_FAKE_INT_TYPES 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for uintptr_t" >&5
+echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
+if test "${ac_cv_type_uintptr_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+
+int
+main ()
+{
+if ((uintptr_t *) 0)
+ return 0;
+if (sizeof (uintptr_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_uintptr_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uintptr_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
+if test $ac_cv_type_uintptr_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINTPTR_T 1
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking for void *" >&5
+echo $ECHO_N "checking for void *... $ECHO_C" >&6
+if test "${ac_cv_type_void_p+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((void * *) 0)
+ return 0;
+if (sizeof (void *))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_void_p=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_void_p=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
+echo "${ECHO_T}$ac_cv_type_void_p" >&6
+
+echo "$as_me:$LINENO: checking size of void *" >&5
+echo $ECHO_N "checking size of void *... $ECHO_C" >&6
+if test "${ac_cv_sizeof_void_p+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_void_p" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_void_p=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (void *)); }
+unsigned long ulongval () { return (long) (sizeof (void *)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (void *))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (void *))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (void *))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_void_p=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_void_p=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
+echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned long" >&5
+echo $ECHO_N "checking for unsigned long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned long *) 0)
+ return 0;
+if (sizeof (unsigned long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned long" >&5
+echo $ECHO_N "checking size of unsigned long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned long)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned int" >&5
+echo $ECHO_N "checking for unsigned int... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned int *) 0)
+ return 0;
+if (sizeof (unsigned int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_int=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_int" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned int" >&5
+echo $ECHO_N "checking size of unsigned int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned_int" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned int)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned int)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned int))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned int))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned int))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+for ac_header in byteorder.h netinet/in.h sys/param.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking whether ntohs and ntohl are defined" >&5
+echo $ECHO_N "checking whether ntohs and ntohl are defined... $ECHO_C" >&6
+ac_ntoh_defined=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+int
+main ()
+{
+(void) ntohs(0x0020), (void) ntohl(0x03040020);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ac_ntoh_defined=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+if test $ac_ntoh_defined = no; then
+
+for ac_header in arpa/inet.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_arpa_inet_h=yes
+else
+ have_arpa_inet_h=no
+fi
+
+done
+
+ if test $have_arpa_inet_h = yes; then
+ echo "$as_me:$LINENO: checking whether ntohs and ntohl are defined in <arpa/inet.h>" >&5
+echo $ECHO_N "checking whether ntohs and ntohl are defined in <arpa/inet.h>... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <arpa/inet.h>
+
+int
+main ()
+{
+(void) ntohs(0x0020), (void) ntohl(0x03040020);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define NEED_ARPA_INET_H 1
+_ACEOF
+
+ac_ntoh_defined=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+fi
+if test $ac_ntoh_defined = no; then
+ { { echo "$as_me:$LINENO: error:
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================" >&5
+echo "$as_me: error:
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+echo "$as_me:$LINENO: checking for addressable va_list type" >&5
+echo $ECHO_N "checking for addressable va_list type... $ECHO_C" >&6
+if test "${ac_cv_va_list_addr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+void f(va_list *) {
+}
+void g(va_list val) {
+ f(&val);
+}
+void h(int a, ...) {
+ va_list val;
+ va_start(val, a);
+ g(val);
+ va_end(val);
+}
+int
+main ()
+{
+h(2, 3, 4);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_va_list_addr=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_va_list_addr=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_va_list_addr" >&5
+echo "${ECHO_T}$ac_cv_va_list_addr" >&6
+if test "x$ac_cv_va_list_addr" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ADDRESSABLE_VA_LIST 1
+_ACEOF
+
+fi
+
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_PERMSTRING 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define MMAFM_RUN_MMPFB 1
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+shell_expand () {
+ val=`eval echo '$'"$1"`
+ while echo "x$val" | fgrep '$' >/dev/null 2>&1; do val=`eval echo "$val"`; done
+ eval "$1='$val'"
+}
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+shell_expand datadir
+
+
+cat >>confdefs.h <<_ACEOF
+#define SHAREDIR "$datadir/lcdf-typetools"
+_ACEOF
+
+
+
+
+ ac_config_files="$ac_config_files Makefile liblcdf/Makefile libefont/Makefile cfftot1/Makefile mmafm/Makefile mmpfb/Makefile otfinfo/Makefile otftotfm/Makefile t1dotlessj/Makefile t1lint/Makefile t1reencode/Makefile t1testpage/Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "liblcdf/Makefile" ) CONFIG_FILES="$CONFIG_FILES liblcdf/Makefile" ;;
+ "libefont/Makefile" ) CONFIG_FILES="$CONFIG_FILES libefont/Makefile" ;;
+ "cfftot1/Makefile" ) CONFIG_FILES="$CONFIG_FILES cfftot1/Makefile" ;;
+ "mmafm/Makefile" ) CONFIG_FILES="$CONFIG_FILES mmafm/Makefile" ;;
+ "mmpfb/Makefile" ) CONFIG_FILES="$CONFIG_FILES mmpfb/Makefile" ;;
+ "otfinfo/Makefile" ) CONFIG_FILES="$CONFIG_FILES otfinfo/Makefile" ;;
+ "otftotfm/Makefile" ) CONFIG_FILES="$CONFIG_FILES otftotfm/Makefile" ;;
+ "t1dotlessj/Makefile" ) CONFIG_FILES="$CONFIG_FILES t1dotlessj/Makefile" ;;
+ "t1lint/Makefile" ) CONFIG_FILES="$CONFIG_FILES t1lint/Makefile" ;;
+ "t1reencode/Makefile" ) CONFIG_FILES="$CONFIG_FILES t1reencode/Makefile" ;;
+ "t1testpage/Makefile" ) CONFIG_FILES="$CONFIG_FILES t1testpage/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@TEMPLATE_OBJS@,$TEMPLATE_OBJS,;t t
+s,@SELECTED_SUBDIRS@,$SELECTED_SUBDIRS,;t t
+s,@EGREP@,$EGREP,;t t
+s,@KPSEINTERFACE_O@,$KPSEINTERFACE_O,;t t
+s,@LIBKPATHSEA@,$LIBKPATHSEA,;t t
+s,@LIBKPATHSEA_DEP@,$LIBKPATHSEA_DEP,;t t
+s,@FIXLIBC_O@,$FIXLIBC_O,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Build/source/utils/lcdf-typetools/configure.in b/Build/source/utils/lcdf-typetools/configure.in
new file mode 100644
index 00000000000..6d26ababfc4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/configure.in
@@ -0,0 +1,475 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(NEWS)
+AM_INIT_AUTOMAKE(lcdf-typetools, 2.34)
+AM_CONFIG_HEADER(config.h)
+AM_MAINTAINER_MODE
+
+AC_PROG_MAKE_SET
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+if test -n "$GCC" ; then CC="$CC -W -Wall" ; CXX="$CXX -W -Wall" ; fi
+
+dnl AN_MAKEVAR([AR], [AC_PROG_AR])
+dnl AN_PROGRAM([ar], [AC_PROG_AR])
+dnl AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL(AR, ar, :)])
+dnl AC_PROG_AR
+
+AC_PROG_RANLIB
+
+
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_template_objs.html
+dnl
+AC_DEFUN([AC_CXX_TEMPLATE_OBJS],
+[AC_CACHE_CHECK(where template objects are stored, ac_cv_cxx_templobjs,
+ [ ac_cv_cxx_templobjs='unknown'
+ if test "$GXX" = yes; then
+ ac_cv_cxx_templobjs='nowhere'
+ else
+ case $CXX in
+ CC|*/CC)
+ cat > conftest.cc <<EOF
+template<class T> class A { public : A () {} };
+template<class T> void f (const A<T>&) {}
+main()
+{ A<double> d;
+ A<int> i;
+ f (d);
+ f (i);
+ return 0;
+}
+EOF
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d Templates.DB ; then
+ rm -fr Templates.DB
+ fi
+ if $CXX $CXXFLAGS -ptr. -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d Templates.DB ; then
+# this should be Sun CC <= 4.2
+ CXXFLAGS="$CXXFLAGS -ptr."
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='Templates.DB/*.o'
+ else
+ ac_cv_cxx_templobjs='Templates.DB/*.lo'
+ fi
+ rm -fr Templates.DB
+ fi
+ fi
+ fi
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d SunWS_cache ; then
+ rm -fr SunWS_cache
+ fi
+ if $CXX $CXXFLAGS -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d SunWS_cache ; then
+# this should be Sun WorkShop C++ compiler 5.x
+# or Sun Forte C++ compiler >= 6.x
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.o'
+ else
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.lo'
+ fi
+ rm -fr SunWS_cache
+ fi
+ fi
+ fi
+ rm -f conftest* ;;
+ esac
+ fi
+ case "x$ac_cv_cxx_templobjs" in
+ xunknown|xnowhere)
+ TEMPLATE_OBJS="" ;;
+ *)
+ TEMPLATE_OBJS="$ac_cv_cxx_templobjs" ;;
+ esac
+ AC_SUBST(TEMPLATE_OBJS)])])
+
+AC_CXX_TEMPLATE_OBJS
+
+
+dnl
+dnl directory searching
+dnl
+
+AC_HEADER_DIRENT
+
+
+dnl
+dnl select programs to be compiled
+dnl
+
+AC_ARG_ENABLE(cfftot1, [ --disable-cfftot1 do not build the cfftot1 program], :, enable_cfftot1=yes)
+AC_ARG_ENABLE(mmafm, [ --disable-mmafm do not build the mmafm program], :, enable_mmafm=yes)
+AC_ARG_ENABLE(mmpfb, [ --disable-mmpfb do not build the mmpfb program], :, enable_mmpfb=yes)
+AC_ARG_ENABLE(otfinfo, [ --disable-otfinfo do not build the otfinfo program], :, enable_otfinfo=yes)
+AC_ARG_ENABLE(otftotfm, [ --disable-otftotfm do not build the otftotfm program], :, enable_otftotfm=yes)
+AC_ARG_ENABLE(t1lint, [ --disable-t1dotlessj do not build the t1dotlessj program], :, enable_t1dotlessj=yes)
+AC_ARG_ENABLE(t1lint, [ --disable-t1lint do not build the t1lint program], :, enable_t1lint=yes)
+AC_ARG_ENABLE(t1reencode, [ --disable-t1reencode do not build the t1reencode program], :, enable_t1reencode=yes)
+AC_ARG_ENABLE(t1testpage, [ --disable-t1testpage do not build the t1testpage program], :, enable_t1testpage=yes)
+
+SELECTED_SUBDIRS=''
+for i in cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1reencode t1testpage; do
+ y=`eval 'echo $enable_'"$i"`
+ if test "x$y" != xno; then SELECTED_SUBDIRS="$SELECTED_SUBDIRS $i"; fi
+done
+AC_SUBST(SELECTED_SUBDIRS)
+
+
+dnl
+dnl kpathsea, auto-cfftot1
+dnl
+
+AC_ARG_ENABLE(tetex-build, [ --enable-tetex-build build as part of a teTeX installation], :, enable_tetex_build=no)
+AC_ARG_WITH(kpathsea, [ --with-kpathsea=PREFIX Kpathsea is installed (under PREFIX)],
+ [kpathsea=$withval], [kpathsea=])
+
+if test "x$kpathsea" = xno; then
+ KPSEINTERFACE_O=
+ LIBKPATHSEA=
+else
+ if test "x$enable_tetex_build" = xyes; then
+ if test ! -d $srcdir/../../texk/kpathsea; then
+ AC_MSG_ERROR([
+=========================================
+
+You specified --enable-tetex-build, but I can't find the kpathsea
+directory. I expected it to be in $srcdir/../../texk/kpathsea.
+
+=========================================])
+ fi
+ CPPFLAGS="$CPPFLAGS -I\$(top_builddir)/../../texk -I\$(top_srcdir)/../../texk"
+ LDFLAGS="$LDFLAGS -L\$(top_builddir)/../../texk/kpathsea/.libs"
+ elif test "x$kpathsea" != x -a "x$kpathsea" != xyes; then
+ CPPFLAGS="$CPPFLAGS -I$kpathsea/include"
+ LDFLAGS="$LDFLAGS -L$kpathsea/lib"
+ else
+ kpathsea=yes
+ fi
+
+ dnl check for kpathsea/kpathsea.h
+ if test "x$enable_tetex_build" = xyes; then
+ kpse_header=yes
+ else
+ AC_CHECK_HEADER(kpathsea/kpathsea.h, [kpse_header=yes], [kpse_header=no])
+ fi
+
+ dnl if not found and kpathsea prefix not set, check /usr/local
+ if test "x$kpse_header" != xyes -a "x$kpathsea" = xyes -a -r /usr/local/include/kpathsea/tex-file.h; then
+ CPPFLAGS="$CPPFLAGS -I/usr/local/include"
+ LDFLAGS="$LDFLAGS -L/usr/local/lib"
+ AC_CHECK_HEADER(kpathsea/tex-file.h, [kpse_header=yes], [kpse_header=no])
+ fi
+
+ dnl check for -lkpathsea
+ if test "x$enable_tetex_build" = xyes; then
+ kpse_library=yes
+ else
+ AC_CHECK_LIB(kpathsea, kpse_set_program_name, [kpse_library=yes], [kpse_library=no])
+ fi
+
+ dnl bail out if not found
+ if test "x$kpse_header" != xyes -o "x$kpse_library" != xyes; then
+ AC_MSG_ERROR([
+=========================================
+
+I can't find the kpathsea library and/or header files. Tell me where to look
+using the --with-kpathsea=PREFIX option (header files should be under
+PREFIX/include/kpathsea, and library under PREFIX/lib), or disable support
+using --without-kpathsea.
+
+=========================================])
+ fi
+
+ dnl OK, found
+ AC_DEFINE(HAVE_KPATHSEA, 1, [Define if you want to use kpathsea.])
+ KPSEINTERFACE_O='kpseinterface.$(OBJEXT)'
+ if test "x$enable_tetex_build" = xyes; then
+ LIBKPATHSEA='$(top_builddir)/../../texk/kpathsea/.libs/libkpathsea.a'
+ LIBKPATHSEA_DEP="$LIBKPATHSEA"
+ else
+ LIBKPATHSEA='-lkpathsea'
+ LIBKPATHSEA_DEP=''
+ fi
+fi
+AC_SUBST([KPSEINTERFACE_O])
+AC_SUBST([LIBKPATHSEA])
+AC_SUBST([LIBKPATHSEA_DEP])
+
+AC_ARG_ENABLE(selfauto-set, [ --disable-selfauto-set disable setting SELFAUTO variables from kpsewhich], :, enable_selfauto_set=yes)
+
+if test "x$enable_selfauto_set" = xyes -a "x$kpathsea" != xno -a "x$enable_tetex_build" != xyes; then
+ kpsewhich='kpsewhich'
+ test "x$kpathsea" != xyes -a -x "$kpathsea/bin/kpsewhich" && kpsewhich="$kpathsea/bin/kpsewhich"
+ SELFAUTOLOC=`$kpsewhich --expand-var='$SELFAUTOLOC' 2>/dev/null`
+ SELFAUTODIR=`$kpsewhich --expand-var='$SELFAUTODIR' 2>/dev/null`
+ SELFAUTOPARENT=`$kpsewhich --expand-var='$SELFAUTOPARENT' 2>/dev/null`
+ if test -z "$SELFAUTODIR"; then
+ AC_MSG_WARN([
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================])
+ fi
+ AC_DEFINE_UNQUOTED(SELFAUTOLOC, "$SELFAUTOLOC", [kpsewhich's $SELFAUTOLOC variable])
+ AC_DEFINE_UNQUOTED(SELFAUTODIR, "$SELFAUTODIR", [kpsewhich's $SELFAUTODIR variable])
+ AC_DEFINE_UNQUOTED(SELFAUTOPARENT, "$SELFAUTOPARENT", [kpsewhich's $SELFAUTOPARENT variable])
+fi
+
+AC_ARG_ENABLE(auto-cfftot1, [ --disable-auto-cfftot1 disable running cfftot1 from otftotfm], :, enable_auto_cfftot1=yes)
+AC_ARG_ENABLE(auto-t1dotlessj, [ --disable-auto-t1dotlessj disable running t1dotlessj from otftotfm], :, enable_auto_t1dotlessj=yes)
+AC_ARG_ENABLE(auto-updmap, [ --disable-auto-updmap disable running updmap from otftotfm], :, enable_auto_updmap=yes)
+
+if test "x$enable_auto_cfftot1" = xyes; then
+ AC_DEFINE(HAVE_AUTO_CFFTOT1, 1, [Define to run cfftot1 automatically from otftotfm.])
+fi
+if test "x$enable_auto_t1dotlessj" = xyes; then
+ AC_DEFINE(HAVE_AUTO_T1DOTLESSJ, 1, [Define to run t1dotlessj automatically from otftotfm.])
+fi
+if test "x$enable_auto_updmap" = xyes; then
+ AC_DEFINE(HAVE_AUTO_UPDMAP, 1, [Define to run system updmap automatically from otftotfm.])
+fi
+
+
+dnl
+dnl <new> and/or <new.h>
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CACHE_CHECK([whether <new> works], ac_cv_good_new_hdr,
+[AC_TRY_LINK([#include <new>], [
+ int a;
+ int *b = new(&a) int;
+ return 0;
+], ac_cv_good_new_hdr=yes, ac_cv_good_new_hdr=no)])
+if test "$ac_cv_good_new_hdr" = yes; then
+ AC_DEFINE(HAVE_NEW_HDR, 1, [Define if <new> exists and works.])
+fi
+AC_CHECK_HEADERS(new.h)
+
+
+dnl
+dnl functions such as strerror, working strtod, strtoul, time
+dnl headers such as unistd.h
+dnl
+
+AC_LANG_C
+FIXLIBC_O=''
+AC_CHECK_FUNCS(strerror, :, FIXLIBC_O='fixlibc.o')
+
+AC_CACHE_CHECK(whether strtod works, ac_cv_working_strtod,
+[AC_TRY_RUN([#include <stdio.h>
+#include <stdlib.h>
+int main(int c, char **v) {
+ char s[] = "12 ";
+ char *endp;
+ double d = strtod(s, &endp);
+ exit(*endp == 0 ? 1 : 0);
+}], ac_cv_working_strtod=yes, ac_cv_working_strtod=no,
+ac_cv_working_strtod=yes)])
+if test $ac_cv_working_strtod = no; then
+ FIXLIBC_O='fixlibc.o'
+ AC_DEFINE(BROKEN_STRTOD, 1, [Define if strtod is broken.])
+fi
+
+AC_CHECK_FUNCS(strtoul ctime mkstemp ftruncate sigaction waitpid)
+AC_CHECK_FUNC(floor, :, [AC_CHECK_LIB(m, floor)])
+AC_CHECK_FUNC(fabs, :, [AC_CHECK_LIB(m, fabs)])
+AC_CHECK_HEADERS(unistd.h fcntl.h sys/time.h sys/wait.h)
+
+AC_SUBST(FIXLIBC_O)
+
+
+dnl
+dnl integer types
+dnl
+
+AC_CHECK_HEADERS(inttypes.h, have_inttypes_h=yes, have_inttypes_h=no)
+AC_CHECK_HEADERS(sys/types.h, have_sys_types_h=yes, have_sys_types_h=no)
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ AC_CACHE_CHECK([for uintXX_t typedefs], ac_cv_uint_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_uint_t=yes, ac_cv_uint_t=no)])
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ AC_CACHE_CHECK([for u_intXX_t typedefs], ac_cv_u_int_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_u_int_t=yes, ac_cv_u_int_t=no)])
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+ AC_DEFINE(HAVE_U_INT_TYPES, 1, [Define if you have u_intXX_t types but not uintXX_t types.])
+else
+ AC_MSG_WARN([
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming "short" has 16 bits and "int" has 32 bits.
+
+=========================================])
+ AC_DEFINE(HAVE_FAKE_INT_TYPES, 1, [Define if intXX_t types are not available.])
+fi
+
+AC_CHECK_TYPES(uintptr_t, [], [],
+[#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+])
+
+AC_CHECK_SIZEOF(void *)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned int)
+
+
+dnl
+dnl ntohs, ntohl (need them in C++ code)
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CHECK_HEADERS(byteorder.h netinet/in.h sys/param.h)
+AC_MSG_CHECKING([whether ntohs and ntohl are defined])
+ac_ntoh_defined=no
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+]], [[(void) ntohs(0x0020), (void) ntohl(0x03040020);]])],
+ [AC_MSG_RESULT(yes)
+ac_ntoh_defined=yes],
+ [AC_MSG_RESULT(no)])
+if test $ac_ntoh_defined = no; then
+ AC_CHECK_HEADERS([arpa/inet.h], [have_arpa_inet_h=yes], [have_arpa_inet_h=no])
+ if test $have_arpa_inet_h = yes; then
+ AC_MSG_CHECKING([whether ntohs and ntohl are defined in <arpa/inet.h>])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <arpa/inet.h>
+]], [[(void) ntohs(0x0020), (void) ntohl(0x03040020);]])],
+ [AC_MSG_RESULT(yes)
+AC_DEFINE(NEED_ARPA_INET_H, 1, [Define to 1 if you must include <arpa/inet.h> to get `ntohl'.])
+ac_ntoh_defined=yes],
+ [AC_MSG_RESULT(no)])
+ fi
+fi
+if test $ac_ntoh_defined = no; then
+ AC_MSG_ERROR([
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================])
+fi
+AC_LANG_C
+
+
+dnl
+dnl is va_list addressable?
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CACHE_CHECK([for addressable va_list type],
+ ac_cv_va_list_addr,
+ [AC_TRY_COMPILE([#include <stdarg.h>
+void f(va_list *) {
+}
+void g(va_list val) {
+ f(&val);
+}
+void h(int a, ...) {
+ va_list val;
+ va_start(val, a);
+ g(val);
+ va_end(val);
+}], [h(2, 3, 4);], ac_cv_va_list_addr=yes, ac_cv_va_list_addr=no)])
+if test "x$ac_cv_va_list_addr" = xyes; then
+ AC_DEFINE(HAVE_ADDRESSABLE_VA_LIST, 1, [Define if the va_list type is addressable.])
+fi
+
+
+dnl
+dnl verbatim portions of the header
+dnl
+
+AC_DEFINE(HAVE_PERMSTRING, 1, [Define if PermStrings are available.])
+AC_DEFINE(MMAFM_RUN_MMPFB, 1, [Define to 0 if you don't want mmafm to run mmpfb when it needs to get an intermediate master conversion program.])
+dnl PATHNAME_SEPARATOR?
+
+AH_TOP([#ifndef LCDF_TYPETOOLS_CONFIG_H
+#define LCDF_TYPETOOLS_CONFIG_H])
+
+AH_BOTTOM([/* Allow compilation on Windows (thanks, Fabrice Popineau). */
+#ifdef WIN32
+# include <win32lib.h>
+#else
+# define CDECL /* nothing */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype strerror if we don't have it. */
+#if !HAVE_STRERROR
+char *strerror(int errno);
+#endif
+
+/* Prototype good_strtod if we need it. */
+#if BROKEN_STRTOD
+double good_strtod(const char *nptr, char **endptr);
+#endif
+
+#ifdef __cplusplus
+}
+/* Get rid of a possible inline macro under C++. */
+# define inline inline
+#endif
+
+#endif /* LCDF_TYPETOOLS_CONFIG_H */])
+
+
+dnl
+dnl set path variables
+dnl
+
+shell_expand () {
+ val=`eval echo '$'"$1"`
+ while echo "x$val" | fgrep '$' >/dev/null 2>&1; do val=`eval echo "$val"`; done
+ eval "$1='$val'"
+}
+
+dnl Preset $prefix and $exec_prefix.
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+shell_expand datadir
+
+AC_DEFINE_UNQUOTED(SHAREDIR, "$datadir/lcdf-typetools", [Data directory.])
+
+
+dnl
+dnl Output
+dnl
+
+AC_OUTPUT(Makefile liblcdf/Makefile libefont/Makefile cfftot1/Makefile mmafm/Makefile mmpfb/Makefile otfinfo/Makefile otftotfm/Makefile t1dotlessj/Makefile t1lint/Makefile t1reencode/Makefile t1testpage/Makefile)
diff --git a/Build/source/utils/lcdf-typetools/depcomp b/Build/source/utils/lcdf-typetools/depcomp
new file mode 100644
index 00000000000..11e2d3bfe1c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/depcomp
@@ -0,0 +1,522 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2004-05-31.23
+
+# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit 0
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit 0
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # Dependencies are output in .lo.d with libtool 1.4.
+ # With libtool 1.5 they are output both in $dir.libs/$base.o.d
+ # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the
+ # latter, because the former will be cleaned when $dir.libs is
+ # erased.
+ tmpdepfile1="$dir.libs/$base.lo.d"
+ tmpdepfile2="$dir$base.o.d"
+ tmpdepfile3="$dir.libs/$base.d"
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1="$dir$base.o.d"
+ tmpdepfile2="$dir$base.d"
+ tmpdepfile3="$dir$base.d"
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ elif test -f "$tmpdepfile2"; then
+ tmpdepfile="$tmpdepfile2"
+ else
+ tmpdepfile="$tmpdepfile3"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/lcdf-typetools/glyphlist.txt b/Build/source/utils/lcdf-typetools/glyphlist.txt
new file mode 100644
index 00000000000..f08445afd70
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/glyphlist.txt
@@ -0,0 +1,4423 @@
+# lcdf-typetools glyphlist.txt, Version 2.33
+# Contents: The Adobe Glyph List, followed by extensions for TeX fonts and
+# encodings. We also extend the second field so that it can contain
+# multiple Unicode scalar values, separated by semicolons, analogous to
+# otftotfm's "% UNICODING" comments.
+###############################################################################
+# Name: Adobe Glyph List
+# Table version: 2.0
+# Date: September 20, 2002
+#
+# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
+#
+# Format: Semicolon-delimited fields:
+# (1) glyph name
+# (2) Unicode scalar value
+A;0041
+AE;00C6
+AEacute;01FC
+AEmacron;01E2
+AEsmall;F7E6
+Aacute;00C1
+Aacutesmall;F7E1
+Abreve;0102
+Abreveacute;1EAE
+Abrevecyrillic;04D0
+Abrevedotbelow;1EB6
+Abrevegrave;1EB0
+Abrevehookabove;1EB2
+Abrevetilde;1EB4
+Acaron;01CD
+Acircle;24B6
+Acircumflex;00C2
+Acircumflexacute;1EA4
+Acircumflexdotbelow;1EAC
+Acircumflexgrave;1EA6
+Acircumflexhookabove;1EA8
+Acircumflexsmall;F7E2
+Acircumflextilde;1EAA
+Acute;F6C9
+Acutesmall;F7B4
+Acyrillic;0410
+Adblgrave;0200
+Adieresis;00C4
+Adieresiscyrillic;04D2
+Adieresismacron;01DE
+Adieresissmall;F7E4
+Adotbelow;1EA0
+Adotmacron;01E0
+Agrave;00C0
+Agravesmall;F7E0
+Ahookabove;1EA2
+Aiecyrillic;04D4
+Ainvertedbreve;0202
+Alpha;0391
+Alphatonos;0386
+Amacron;0100
+Amonospace;FF21
+Aogonek;0104
+Aring;00C5
+Aringacute;01FA
+Aringbelow;1E00
+Aringsmall;F7E5
+Asmall;F761
+Atilde;00C3
+Atildesmall;F7E3
+Aybarmenian;0531
+B;0042
+Bcircle;24B7
+Bdotaccent;1E02
+Bdotbelow;1E04
+Becyrillic;0411
+Benarmenian;0532
+Beta;0392
+Bhook;0181
+Blinebelow;1E06
+Bmonospace;FF22
+Brevesmall;F6F4
+Bsmall;F762
+Btopbar;0182
+C;0043
+Caarmenian;053E
+Cacute;0106
+Caron;F6CA
+Caronsmall;F6F5
+Ccaron;010C
+Ccedilla;00C7
+Ccedillaacute;1E08
+Ccedillasmall;F7E7
+Ccircle;24B8
+Ccircumflex;0108
+Cdot;010A
+Cdotaccent;010A
+Cedillasmall;F7B8
+Chaarmenian;0549
+Cheabkhasiancyrillic;04BC
+Checyrillic;0427
+Chedescenderabkhasiancyrillic;04BE
+Chedescendercyrillic;04B6
+Chedieresiscyrillic;04F4
+Cheharmenian;0543
+Chekhakassiancyrillic;04CB
+Cheverticalstrokecyrillic;04B8
+Chi;03A7
+Chook;0187
+Circumflexsmall;F6F6
+Cmonospace;FF23
+Coarmenian;0551
+Csmall;F763
+D;0044
+DZ;01F1
+DZcaron;01C4
+Daarmenian;0534
+Dafrican;0189
+Dcaron;010E
+Dcedilla;1E10
+Dcircle;24B9
+Dcircumflexbelow;1E12
+Dcroat;0110
+Ddotaccent;1E0A
+Ddotbelow;1E0C
+Decyrillic;0414
+Deicoptic;03EE
+Delta;2206
+Deltagreek;0394
+Dhook;018A
+Dieresis;F6CB
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;F7A8
+Digammagreek;03DC
+Djecyrillic;0402
+Dlinebelow;1E0E
+Dmonospace;FF24
+Dotaccentsmall;F6F7
+Dslash;0110
+Dsmall;F764
+Dtopbar;018B
+Dz;01F2
+Dzcaron;01C5
+Dzeabkhasiancyrillic;04E0
+Dzecyrillic;0405
+Dzhecyrillic;040F
+E;0045
+Eacute;00C9
+Eacutesmall;F7E9
+Ebreve;0114
+Ecaron;011A
+Ecedillabreve;1E1C
+Echarmenian;0535
+Ecircle;24BA
+Ecircumflex;00CA
+Ecircumflexacute;1EBE
+Ecircumflexbelow;1E18
+Ecircumflexdotbelow;1EC6
+Ecircumflexgrave;1EC0
+Ecircumflexhookabove;1EC2
+Ecircumflexsmall;F7EA
+Ecircumflextilde;1EC4
+Ecyrillic;0404
+Edblgrave;0204
+Edieresis;00CB
+Edieresissmall;F7EB
+Edot;0116
+Edotaccent;0116
+Edotbelow;1EB8
+Efcyrillic;0424
+Egrave;00C8
+Egravesmall;F7E8
+Eharmenian;0537
+Ehookabove;1EBA
+Eightroman;2167
+Einvertedbreve;0206
+Eiotifiedcyrillic;0464
+Elcyrillic;041B
+Elevenroman;216A
+Emacron;0112
+Emacronacute;1E16
+Emacrongrave;1E14
+Emcyrillic;041C
+Emonospace;FF25
+Encyrillic;041D
+Endescendercyrillic;04A2
+Eng;014A
+Enghecyrillic;04A4
+Enhookcyrillic;04C7
+Eogonek;0118
+Eopen;0190
+Epsilon;0395
+Epsilontonos;0388
+Ercyrillic;0420
+Ereversed;018E
+Ereversedcyrillic;042D
+Escyrillic;0421
+Esdescendercyrillic;04AA
+Esh;01A9
+Esmall;F765
+Eta;0397
+Etarmenian;0538
+Etatonos;0389
+Eth;00D0
+Ethsmall;F7F0
+Etilde;1EBC
+Etildebelow;1E1A
+Euro;20AC
+Ezh;01B7
+Ezhcaron;01EE
+Ezhreversed;01B8
+F;0046
+Fcircle;24BB
+Fdotaccent;1E1E
+Feharmenian;0556
+Feicoptic;03E4
+Fhook;0191
+Fitacyrillic;0472
+Fiveroman;2164
+Fmonospace;FF26
+Fourroman;2163
+Fsmall;F766
+G;0047
+GBsquare;3387
+Gacute;01F4
+Gamma;0393
+Gammaafrican;0194
+Gangiacoptic;03EA
+Gbreve;011E
+Gcaron;01E6
+Gcedilla;0122
+Gcircle;24BC
+Gcircumflex;011C
+Gcommaaccent;0122
+Gdot;0120
+Gdotaccent;0120
+Gecyrillic;0413
+Ghadarmenian;0542
+Ghemiddlehookcyrillic;0494
+Ghestrokecyrillic;0492
+Gheupturncyrillic;0490
+Ghook;0193
+Gimarmenian;0533
+Gjecyrillic;0403
+Gmacron;1E20
+Gmonospace;FF27
+Grave;F6CE
+Gravesmall;F760
+Gsmall;F767
+Gsmallhook;029B
+Gstroke;01E4
+H;0048
+H18533;25CF
+H18543;25AA
+H18551;25AB
+H22073;25A1
+HPsquare;33CB
+Haabkhasiancyrillic;04A8
+Hadescendercyrillic;04B2
+Hardsigncyrillic;042A
+Hbar;0126
+Hbrevebelow;1E2A
+Hcedilla;1E28
+Hcircle;24BD
+Hcircumflex;0124
+Hdieresis;1E26
+Hdotaccent;1E22
+Hdotbelow;1E24
+Hmonospace;FF28
+Hoarmenian;0540
+Horicoptic;03E8
+Hsmall;F768
+Hungarumlaut;F6CF
+Hungarumlautsmall;F6F8
+Hzsquare;3390
+I;0049
+IAcyrillic;042F
+IJ;0132
+IUcyrillic;042E
+Iacute;00CD
+Iacutesmall;F7ED
+Ibreve;012C
+Icaron;01CF
+Icircle;24BE
+Icircumflex;00CE
+Icircumflexsmall;F7EE
+Icyrillic;0406
+Idblgrave;0208
+Idieresis;00CF
+Idieresisacute;1E2E
+Idieresiscyrillic;04E4
+Idieresissmall;F7EF
+Idot;0130
+Idotaccent;0130
+Idotbelow;1ECA
+Iebrevecyrillic;04D6
+Iecyrillic;0415
+Ifraktur;2111
+Igrave;00CC
+Igravesmall;F7EC
+Ihookabove;1EC8
+Iicyrillic;0418
+Iinvertedbreve;020A
+Iishortcyrillic;0419
+Imacron;012A
+Imacroncyrillic;04E2
+Imonospace;FF29
+Iniarmenian;053B
+Iocyrillic;0401
+Iogonek;012E
+Iota;0399
+Iotaafrican;0196
+Iotadieresis;03AA
+Iotatonos;038A
+Ismall;F769
+Istroke;0197
+Itilde;0128
+Itildebelow;1E2C
+Izhitsacyrillic;0474
+Izhitsadblgravecyrillic;0476
+J;004A
+Jaarmenian;0541
+Jcircle;24BF
+Jcircumflex;0134
+Jecyrillic;0408
+Jheharmenian;054B
+Jmonospace;FF2A
+Jsmall;F76A
+K;004B
+KBsquare;3385
+KKsquare;33CD
+Kabashkircyrillic;04A0
+Kacute;1E30
+Kacyrillic;041A
+Kadescendercyrillic;049A
+Kahookcyrillic;04C3
+Kappa;039A
+Kastrokecyrillic;049E
+Kaverticalstrokecyrillic;049C
+Kcaron;01E8
+Kcedilla;0136
+Kcircle;24C0
+Kcommaaccent;0136
+Kdotbelow;1E32
+Keharmenian;0554
+Kenarmenian;053F
+Khacyrillic;0425
+Kheicoptic;03E6
+Khook;0198
+Kjecyrillic;040C
+Klinebelow;1E34
+Kmonospace;FF2B
+Koppacyrillic;0480
+Koppagreek;03DE
+Ksicyrillic;046E
+Ksmall;F76B
+L;004C
+LJ;01C7
+LL;F6BF
+Lacute;0139
+Lambda;039B
+Lcaron;013D
+Lcedilla;013B
+Lcircle;24C1
+Lcircumflexbelow;1E3C
+Lcommaaccent;013B
+Ldot;013F
+Ldotaccent;013F
+Ldotbelow;1E36
+Ldotbelowmacron;1E38
+Liwnarmenian;053C
+Lj;01C8
+Ljecyrillic;0409
+Llinebelow;1E3A
+Lmonospace;FF2C
+Lslash;0141
+Lslashsmall;F6F9
+Lsmall;F76C
+M;004D
+MBsquare;3386
+Macron;F6D0
+Macronsmall;F7AF
+Macute;1E3E
+Mcircle;24C2
+Mdotaccent;1E40
+Mdotbelow;1E42
+Menarmenian;0544
+Mmonospace;FF2D
+Msmall;F76D
+Mturned;019C
+Mu;039C
+N;004E
+NJ;01CA
+Nacute;0143
+Ncaron;0147
+Ncedilla;0145
+Ncircle;24C3
+Ncircumflexbelow;1E4A
+Ncommaaccent;0145
+Ndotaccent;1E44
+Ndotbelow;1E46
+Nhookleft;019D
+Nineroman;2168
+Nj;01CB
+Njecyrillic;040A
+Nlinebelow;1E48
+Nmonospace;FF2E
+Nowarmenian;0546
+Nsmall;F76E
+Ntilde;00D1
+Ntildesmall;F7F1
+Nu;039D
+O;004F
+OE;0152
+OEsmall;F6FA
+Oacute;00D3
+Oacutesmall;F7F3
+Obarredcyrillic;04E8
+Obarreddieresiscyrillic;04EA
+Obreve;014E
+Ocaron;01D1
+Ocenteredtilde;019F
+Ocircle;24C4
+Ocircumflex;00D4
+Ocircumflexacute;1ED0
+Ocircumflexdotbelow;1ED8
+Ocircumflexgrave;1ED2
+Ocircumflexhookabove;1ED4
+Ocircumflexsmall;F7F4
+Ocircumflextilde;1ED6
+Ocyrillic;041E
+Odblacute;0150
+Odblgrave;020C
+Odieresis;00D6
+Odieresiscyrillic;04E6
+Odieresissmall;F7F6
+Odotbelow;1ECC
+Ogoneksmall;F6FB
+Ograve;00D2
+Ogravesmall;F7F2
+Oharmenian;0555
+Ohm;2126
+Ohookabove;1ECE
+Ohorn;01A0
+Ohornacute;1EDA
+Ohorndotbelow;1EE2
+Ohorngrave;1EDC
+Ohornhookabove;1EDE
+Ohorntilde;1EE0
+Ohungarumlaut;0150
+Oi;01A2
+Oinvertedbreve;020E
+Omacron;014C
+Omacronacute;1E52
+Omacrongrave;1E50
+Omega;2126
+Omegacyrillic;0460
+Omegagreek;03A9
+Omegaroundcyrillic;047A
+Omegatitlocyrillic;047C
+Omegatonos;038F
+Omicron;039F
+Omicrontonos;038C
+Omonospace;FF2F
+Oneroman;2160
+Oogonek;01EA
+Oogonekmacron;01EC
+Oopen;0186
+Oslash;00D8
+Oslashacute;01FE
+Oslashsmall;F7F8
+Osmall;F76F
+Ostrokeacute;01FE
+Otcyrillic;047E
+Otilde;00D5
+Otildeacute;1E4C
+Otildedieresis;1E4E
+Otildesmall;F7F5
+P;0050
+Pacute;1E54
+Pcircle;24C5
+Pdotaccent;1E56
+Pecyrillic;041F
+Peharmenian;054A
+Pemiddlehookcyrillic;04A6
+Phi;03A6
+Phook;01A4
+Pi;03A0
+Piwrarmenian;0553
+Pmonospace;FF30
+Psi;03A8
+Psicyrillic;0470
+Psmall;F770
+Q;0051
+Qcircle;24C6
+Qmonospace;FF31
+Qsmall;F771
+R;0052
+Raarmenian;054C
+Racute;0154
+Rcaron;0158
+Rcedilla;0156
+Rcircle;24C7
+Rcommaaccent;0156
+Rdblgrave;0210
+Rdotaccent;1E58
+Rdotbelow;1E5A
+Rdotbelowmacron;1E5C
+Reharmenian;0550
+Rfraktur;211C
+Rho;03A1
+Ringsmall;F6FC
+Rinvertedbreve;0212
+Rlinebelow;1E5E
+Rmonospace;FF32
+Rsmall;F772
+Rsmallinverted;0281
+Rsmallinvertedsuperior;02B6
+S;0053
+SF010000;250C
+SF020000;2514
+SF030000;2510
+SF040000;2518
+SF050000;253C
+SF060000;252C
+SF070000;2534
+SF080000;251C
+SF090000;2524
+SF100000;2500
+SF110000;2502
+SF190000;2561
+SF200000;2562
+SF210000;2556
+SF220000;2555
+SF230000;2563
+SF240000;2551
+SF250000;2557
+SF260000;255D
+SF270000;255C
+SF280000;255B
+SF360000;255E
+SF370000;255F
+SF380000;255A
+SF390000;2554
+SF400000;2569
+SF410000;2566
+SF420000;2560
+SF430000;2550
+SF440000;256C
+SF450000;2567
+SF460000;2568
+SF470000;2564
+SF480000;2565
+SF490000;2559
+SF500000;2558
+SF510000;2552
+SF520000;2553
+SF530000;256B
+SF540000;256A
+Sacute;015A
+Sacutedotaccent;1E64
+Sampigreek;03E0
+Scaron;0160
+Scarondotaccent;1E66
+Scaronsmall;F6FD
+Scedilla;015E
+Schwa;018F
+Schwacyrillic;04D8
+Schwadieresiscyrillic;04DA
+Scircle;24C8
+Scircumflex;015C
+Scommaaccent;0218
+Sdotaccent;1E60
+Sdotbelow;1E62
+Sdotbelowdotaccent;1E68
+Seharmenian;054D
+Sevenroman;2166
+Shaarmenian;0547
+Shacyrillic;0428
+Shchacyrillic;0429
+Sheicoptic;03E2
+Shhacyrillic;04BA
+Shimacoptic;03EC
+Sigma;03A3
+Sixroman;2165
+Smonospace;FF33
+Softsigncyrillic;042C
+Ssmall;F773
+Stigmagreek;03DA
+T;0054
+Tau;03A4
+Tbar;0166
+Tcaron;0164
+Tcedilla;0162
+Tcircle;24C9
+Tcircumflexbelow;1E70
+Tcommaaccent;0162
+Tdotaccent;1E6A
+Tdotbelow;1E6C
+Tecyrillic;0422
+Tedescendercyrillic;04AC
+Tenroman;2169
+Tetsecyrillic;04B4
+Theta;0398
+Thook;01AC
+Thorn;00DE
+Thornsmall;F7FE
+Threeroman;2162
+Tildesmall;F6FE
+Tiwnarmenian;054F
+Tlinebelow;1E6E
+Tmonospace;FF34
+Toarmenian;0539
+Tonefive;01BC
+Tonesix;0184
+Tonetwo;01A7
+Tretroflexhook;01AE
+Tsecyrillic;0426
+Tshecyrillic;040B
+Tsmall;F774
+Twelveroman;216B
+Tworoman;2161
+U;0055
+Uacute;00DA
+Uacutesmall;F7FA
+Ubreve;016C
+Ucaron;01D3
+Ucircle;24CA
+Ucircumflex;00DB
+Ucircumflexbelow;1E76
+Ucircumflexsmall;F7FB
+Ucyrillic;0423
+Udblacute;0170
+Udblgrave;0214
+Udieresis;00DC
+Udieresisacute;01D7
+Udieresisbelow;1E72
+Udieresiscaron;01D9
+Udieresiscyrillic;04F0
+Udieresisgrave;01DB
+Udieresismacron;01D5
+Udieresissmall;F7FC
+Udotbelow;1EE4
+Ugrave;00D9
+Ugravesmall;F7F9
+Uhookabove;1EE6
+Uhorn;01AF
+Uhornacute;1EE8
+Uhorndotbelow;1EF0
+Uhorngrave;1EEA
+Uhornhookabove;1EEC
+Uhorntilde;1EEE
+Uhungarumlaut;0170
+Uhungarumlautcyrillic;04F2
+Uinvertedbreve;0216
+Ukcyrillic;0478
+Umacron;016A
+Umacroncyrillic;04EE
+Umacrondieresis;1E7A
+Umonospace;FF35
+Uogonek;0172
+Upsilon;03A5
+Upsilon1;03D2
+Upsilonacutehooksymbolgreek;03D3
+Upsilonafrican;01B1
+Upsilondieresis;03AB
+Upsilondieresishooksymbolgreek;03D4
+Upsilonhooksymbol;03D2
+Upsilontonos;038E
+Uring;016E
+Ushortcyrillic;040E
+Usmall;F775
+Ustraightcyrillic;04AE
+Ustraightstrokecyrillic;04B0
+Utilde;0168
+Utildeacute;1E78
+Utildebelow;1E74
+V;0056
+Vcircle;24CB
+Vdotbelow;1E7E
+Vecyrillic;0412
+Vewarmenian;054E
+Vhook;01B2
+Vmonospace;FF36
+Voarmenian;0548
+Vsmall;F776
+Vtilde;1E7C
+W;0057
+Wacute;1E82
+Wcircle;24CC
+Wcircumflex;0174
+Wdieresis;1E84
+Wdotaccent;1E86
+Wdotbelow;1E88
+Wgrave;1E80
+Wmonospace;FF37
+Wsmall;F777
+X;0058
+Xcircle;24CD
+Xdieresis;1E8C
+Xdotaccent;1E8A
+Xeharmenian;053D
+Xi;039E
+Xmonospace;FF38
+Xsmall;F778
+Y;0059
+Yacute;00DD
+Yacutesmall;F7FD
+Yatcyrillic;0462
+Ycircle;24CE
+Ycircumflex;0176
+Ydieresis;0178
+Ydieresissmall;F7FF
+Ydotaccent;1E8E
+Ydotbelow;1EF4
+Yericyrillic;042B
+Yerudieresiscyrillic;04F8
+Ygrave;1EF2
+Yhook;01B3
+Yhookabove;1EF6
+Yiarmenian;0545
+Yicyrillic;0407
+Yiwnarmenian;0552
+Ymonospace;FF39
+Ysmall;F779
+Ytilde;1EF8
+Yusbigcyrillic;046A
+Yusbigiotifiedcyrillic;046C
+Yuslittlecyrillic;0466
+Yuslittleiotifiedcyrillic;0468
+Z;005A
+Zaarmenian;0536
+Zacute;0179
+Zcaron;017D
+Zcaronsmall;F6FF
+Zcircle;24CF
+Zcircumflex;1E90
+Zdot;017B
+Zdotaccent;017B
+Zdotbelow;1E92
+Zecyrillic;0417
+Zedescendercyrillic;0498
+Zedieresiscyrillic;04DE
+Zeta;0396
+Zhearmenian;053A
+Zhebrevecyrillic;04C1
+Zhecyrillic;0416
+Zhedescendercyrillic;0496
+Zhedieresiscyrillic;04DC
+Zlinebelow;1E94
+Zmonospace;FF3A
+Zsmall;F77A
+Zstroke;01B5
+a;0061
+aabengali;0986
+aacute;00E1
+aadeva;0906
+aagujarati;0A86
+aagurmukhi;0A06
+aamatragurmukhi;0A3E
+aarusquare;3303
+aavowelsignbengali;09BE
+aavowelsigndeva;093E
+aavowelsigngujarati;0ABE
+abbreviationmarkarmenian;055F
+abbreviationsigndeva;0970
+abengali;0985
+abopomofo;311A
+abreve;0103
+abreveacute;1EAF
+abrevecyrillic;04D1
+abrevedotbelow;1EB7
+abrevegrave;1EB1
+abrevehookabove;1EB3
+abrevetilde;1EB5
+acaron;01CE
+acircle;24D0
+acircumflex;00E2
+acircumflexacute;1EA5
+acircumflexdotbelow;1EAD
+acircumflexgrave;1EA7
+acircumflexhookabove;1EA9
+acircumflextilde;1EAB
+acute;00B4
+acutebelowcmb;0317
+acutecmb;0301
+acutecomb;0301
+acutedeva;0954
+acutelowmod;02CF
+acutetonecmb;0341
+acyrillic;0430
+adblgrave;0201
+addakgurmukhi;0A71
+adeva;0905
+adieresis;00E4
+adieresiscyrillic;04D3
+adieresismacron;01DF
+adotbelow;1EA1
+adotmacron;01E1
+ae;00E6
+aeacute;01FD
+aekorean;3150
+aemacron;01E3
+afii00208;2015
+afii08941;20A4
+afii10017;0410
+afii10018;0411
+afii10019;0412
+afii10020;0413
+afii10021;0414
+afii10022;0415
+afii10023;0401
+afii10024;0416
+afii10025;0417
+afii10026;0418
+afii10027;0419
+afii10028;041A
+afii10029;041B
+afii10030;041C
+afii10031;041D
+afii10032;041E
+afii10033;041F
+afii10034;0420
+afii10035;0421
+afii10036;0422
+afii10037;0423
+afii10038;0424
+afii10039;0425
+afii10040;0426
+afii10041;0427
+afii10042;0428
+afii10043;0429
+afii10044;042A
+afii10045;042B
+afii10046;042C
+afii10047;042D
+afii10048;042E
+afii10049;042F
+afii10050;0490
+afii10051;0402
+afii10052;0403
+afii10053;0404
+afii10054;0405
+afii10055;0406
+afii10056;0407
+afii10057;0408
+afii10058;0409
+afii10059;040A
+afii10060;040B
+afii10061;040C
+afii10062;040E
+afii10063;F6C4
+afii10064;F6C5
+afii10065;0430
+afii10066;0431
+afii10067;0432
+afii10068;0433
+afii10069;0434
+afii10070;0435
+afii10071;0451
+afii10072;0436
+afii10073;0437
+afii10074;0438
+afii10075;0439
+afii10076;043A
+afii10077;043B
+afii10078;043C
+afii10079;043D
+afii10080;043E
+afii10081;043F
+afii10082;0440
+afii10083;0441
+afii10084;0442
+afii10085;0443
+afii10086;0444
+afii10087;0445
+afii10088;0446
+afii10089;0447
+afii10090;0448
+afii10091;0449
+afii10092;044A
+afii10093;044B
+afii10094;044C
+afii10095;044D
+afii10096;044E
+afii10097;044F
+afii10098;0491
+afii10099;0452
+afii10100;0453
+afii10101;0454
+afii10102;0455
+afii10103;0456
+afii10104;0457
+afii10105;0458
+afii10106;0459
+afii10107;045A
+afii10108;045B
+afii10109;045C
+afii10110;045E
+afii10145;040F
+afii10146;0462
+afii10147;0472
+afii10148;0474
+afii10192;F6C6
+afii10193;045F
+afii10194;0463
+afii10195;0473
+afii10196;0475
+afii10831;F6C7
+afii10832;F6C8
+afii10846;04D9
+afii299;200E
+afii300;200F
+afii301;200D
+afii57381;066A
+afii57388;060C
+afii57392;0660
+afii57393;0661
+afii57394;0662
+afii57395;0663
+afii57396;0664
+afii57397;0665
+afii57398;0666
+afii57399;0667
+afii57400;0668
+afii57401;0669
+afii57403;061B
+afii57407;061F
+afii57409;0621
+afii57410;0622
+afii57411;0623
+afii57412;0624
+afii57413;0625
+afii57414;0626
+afii57415;0627
+afii57416;0628
+afii57417;0629
+afii57418;062A
+afii57419;062B
+afii57420;062C
+afii57421;062D
+afii57422;062E
+afii57423;062F
+afii57424;0630
+afii57425;0631
+afii57426;0632
+afii57427;0633
+afii57428;0634
+afii57429;0635
+afii57430;0636
+afii57431;0637
+afii57432;0638
+afii57433;0639
+afii57434;063A
+afii57440;0640
+afii57441;0641
+afii57442;0642
+afii57443;0643
+afii57444;0644
+afii57445;0645
+afii57446;0646
+afii57448;0648
+afii57449;0649
+afii57450;064A
+afii57451;064B
+afii57452;064C
+afii57453;064D
+afii57454;064E
+afii57455;064F
+afii57456;0650
+afii57457;0651
+afii57458;0652
+afii57470;0647
+afii57505;06A4
+afii57506;067E
+afii57507;0686
+afii57508;0698
+afii57509;06AF
+afii57511;0679
+afii57512;0688
+afii57513;0691
+afii57514;06BA
+afii57519;06D2
+afii57534;06D5
+afii57636;20AA
+afii57645;05BE
+afii57658;05C3
+afii57664;05D0
+afii57665;05D1
+afii57666;05D2
+afii57667;05D3
+afii57668;05D4
+afii57669;05D5
+afii57670;05D6
+afii57671;05D7
+afii57672;05D8
+afii57673;05D9
+afii57674;05DA
+afii57675;05DB
+afii57676;05DC
+afii57677;05DD
+afii57678;05DE
+afii57679;05DF
+afii57680;05E0
+afii57681;05E1
+afii57682;05E2
+afii57683;05E3
+afii57684;05E4
+afii57685;05E5
+afii57686;05E6
+afii57687;05E7
+afii57688;05E8
+afii57689;05E9
+afii57690;05EA
+afii57694;FB2A
+afii57695;FB2B
+afii57700;FB4B
+afii57705;FB1F
+afii57716;05F0
+afii57717;05F1
+afii57718;05F2
+afii57723;FB35
+afii57793;05B4
+afii57794;05B5
+afii57795;05B6
+afii57796;05BB
+afii57797;05B8
+afii57798;05B7
+afii57799;05B0
+afii57800;05B2
+afii57801;05B1
+afii57802;05B3
+afii57803;05C2
+afii57804;05C1
+afii57806;05B9
+afii57807;05BC
+afii57839;05BD
+afii57841;05BF
+afii57842;05C0
+afii57929;02BC
+afii61248;2105
+afii61289;2113
+afii61352;2116
+afii61573;202C
+afii61574;202D
+afii61575;202E
+afii61664;200C
+afii63167;066D
+afii64937;02BD
+agrave;00E0
+agujarati;0A85
+agurmukhi;0A05
+ahiragana;3042
+ahookabove;1EA3
+aibengali;0990
+aibopomofo;311E
+aideva;0910
+aiecyrillic;04D5
+aigujarati;0A90
+aigurmukhi;0A10
+aimatragurmukhi;0A48
+ainarabic;0639
+ainfinalarabic;FECA
+aininitialarabic;FECB
+ainmedialarabic;FECC
+ainvertedbreve;0203
+aivowelsignbengali;09C8
+aivowelsigndeva;0948
+aivowelsigngujarati;0AC8
+akatakana;30A2
+akatakanahalfwidth;FF71
+akorean;314F
+alef;05D0
+alefarabic;0627
+alefdageshhebrew;FB30
+aleffinalarabic;FE8E
+alefhamzaabovearabic;0623
+alefhamzaabovefinalarabic;FE84
+alefhamzabelowarabic;0625
+alefhamzabelowfinalarabic;FE88
+alefhebrew;05D0
+aleflamedhebrew;FB4F
+alefmaddaabovearabic;0622
+alefmaddaabovefinalarabic;FE82
+alefmaksuraarabic;0649
+alefmaksurafinalarabic;FEF0
+alefmaksurainitialarabic;FEF3
+alefmaksuramedialarabic;FEF4
+alefpatahhebrew;FB2E
+alefqamatshebrew;FB2F
+aleph;2135
+allequal;224C
+alpha;03B1
+alphatonos;03AC
+amacron;0101
+amonospace;FF41
+ampersand;0026
+ampersandmonospace;FF06
+ampersandsmall;F726
+amsquare;33C2
+anbopomofo;3122
+angbopomofo;3124
+angkhankhuthai;0E5A
+angle;2220
+anglebracketleft;3008
+anglebracketleftvertical;FE3F
+anglebracketright;3009
+anglebracketrightvertical;FE40
+angleleft;2329
+angleright;232A
+angstrom;212B
+anoteleia;0387
+anudattadeva;0952
+anusvarabengali;0982
+anusvaradeva;0902
+anusvaragujarati;0A82
+aogonek;0105
+apaatosquare;3300
+aparen;249C
+apostrophearmenian;055A
+apostrophemod;02BC
+apple;F8FF
+approaches;2250
+approxequal;2248
+approxequalorimage;2252
+approximatelyequal;2245
+araeaekorean;318E
+araeakorean;318D
+arc;2312
+arighthalfring;1E9A
+aring;00E5
+aringacute;01FB
+aringbelow;1E01
+arrowboth;2194
+arrowdashdown;21E3
+arrowdashleft;21E0
+arrowdashright;21E2
+arrowdashup;21E1
+arrowdblboth;21D4
+arrowdbldown;21D3
+arrowdblleft;21D0
+arrowdblright;21D2
+arrowdblup;21D1
+arrowdown;2193
+arrowdownleft;2199
+arrowdownright;2198
+arrowdownwhite;21E9
+arrowheaddownmod;02C5
+arrowheadleftmod;02C2
+arrowheadrightmod;02C3
+arrowheadupmod;02C4
+arrowhorizex;F8E7
+arrowleft;2190
+arrowleftdbl;21D0
+arrowleftdblstroke;21CD
+arrowleftoverright;21C6
+arrowleftwhite;21E6
+arrowright;2192
+arrowrightdblstroke;21CF
+arrowrightheavy;279E
+arrowrightoverleft;21C4
+arrowrightwhite;21E8
+arrowtableft;21E4
+arrowtabright;21E5
+arrowup;2191
+arrowupdn;2195
+arrowupdnbse;21A8
+arrowupdownbase;21A8
+arrowupleft;2196
+arrowupleftofdown;21C5
+arrowupright;2197
+arrowupwhite;21E7
+arrowvertex;F8E6
+asciicircum;005E
+asciicircummonospace;FF3E
+asciitilde;007E
+asciitildemonospace;FF5E
+ascript;0251
+ascriptturned;0252
+asmallhiragana;3041
+asmallkatakana;30A1
+asmallkatakanahalfwidth;FF67
+asterisk;002A
+asteriskaltonearabic;066D
+asteriskarabic;066D
+asteriskmath;2217
+asteriskmonospace;FF0A
+asterisksmall;FE61
+asterism;2042
+asuperior;F6E9
+asymptoticallyequal;2243
+at;0040
+atilde;00E3
+atmonospace;FF20
+atsmall;FE6B
+aturned;0250
+aubengali;0994
+aubopomofo;3120
+audeva;0914
+augujarati;0A94
+augurmukhi;0A14
+aulengthmarkbengali;09D7
+aumatragurmukhi;0A4C
+auvowelsignbengali;09CC
+auvowelsigndeva;094C
+auvowelsigngujarati;0ACC
+avagrahadeva;093D
+aybarmenian;0561
+ayin;05E2
+ayinaltonehebrew;FB20
+ayinhebrew;05E2
+b;0062
+babengali;09AC
+backslash;005C
+backslashmonospace;FF3C
+badeva;092C
+bagujarati;0AAC
+bagurmukhi;0A2C
+bahiragana;3070
+bahtthai;0E3F
+bakatakana;30D0
+bar;007C
+barmonospace;FF5C
+bbopomofo;3105
+bcircle;24D1
+bdotaccent;1E03
+bdotbelow;1E05
+beamedsixteenthnotes;266C
+because;2235
+becyrillic;0431
+beharabic;0628
+behfinalarabic;FE90
+behinitialarabic;FE91
+behiragana;3079
+behmedialarabic;FE92
+behmeeminitialarabic;FC9F
+behmeemisolatedarabic;FC08
+behnoonfinalarabic;FC6D
+bekatakana;30D9
+benarmenian;0562
+bet;05D1
+beta;03B2
+betasymbolgreek;03D0
+betdagesh;FB31
+betdageshhebrew;FB31
+bethebrew;05D1
+betrafehebrew;FB4C
+bhabengali;09AD
+bhadeva;092D
+bhagujarati;0AAD
+bhagurmukhi;0A2D
+bhook;0253
+bihiragana;3073
+bikatakana;30D3
+bilabialclick;0298
+bindigurmukhi;0A02
+birusquare;3331
+blackcircle;25CF
+blackdiamond;25C6
+blackdownpointingtriangle;25BC
+blackleftpointingpointer;25C4
+blackleftpointingtriangle;25C0
+blacklenticularbracketleft;3010
+blacklenticularbracketleftvertical;FE3B
+blacklenticularbracketright;3011
+blacklenticularbracketrightvertical;FE3C
+blacklowerlefttriangle;25E3
+blacklowerrighttriangle;25E2
+blackrectangle;25AC
+blackrightpointingpointer;25BA
+blackrightpointingtriangle;25B6
+blacksmallsquare;25AA
+blacksmilingface;263B
+blacksquare;25A0
+blackstar;2605
+blackupperlefttriangle;25E4
+blackupperrighttriangle;25E5
+blackuppointingsmalltriangle;25B4
+blackuppointingtriangle;25B2
+blank;2423
+blinebelow;1E07
+block;2588
+bmonospace;FF42
+bobaimaithai;0E1A
+bohiragana;307C
+bokatakana;30DC
+bparen;249D
+bqsquare;33C3
+braceex;F8F4
+braceleft;007B
+braceleftbt;F8F3
+braceleftmid;F8F2
+braceleftmonospace;FF5B
+braceleftsmall;FE5B
+bracelefttp;F8F1
+braceleftvertical;FE37
+braceright;007D
+bracerightbt;F8FE
+bracerightmid;F8FD
+bracerightmonospace;FF5D
+bracerightsmall;FE5C
+bracerighttp;F8FC
+bracerightvertical;FE38
+bracketleft;005B
+bracketleftbt;F8F0
+bracketleftex;F8EF
+bracketleftmonospace;FF3B
+bracketlefttp;F8EE
+bracketright;005D
+bracketrightbt;F8FB
+bracketrightex;F8FA
+bracketrightmonospace;FF3D
+bracketrighttp;F8F9
+breve;02D8
+brevebelowcmb;032E
+brevecmb;0306
+breveinvertedbelowcmb;032F
+breveinvertedcmb;0311
+breveinverteddoublecmb;0361
+bridgebelowcmb;032A
+bridgeinvertedbelowcmb;033A
+brokenbar;00A6
+bstroke;0180
+bsuperior;F6EA
+btopbar;0183
+buhiragana;3076
+bukatakana;30D6
+bullet;2022
+bulletinverse;25D8
+bulletoperator;2219
+bullseye;25CE
+c;0063
+caarmenian;056E
+cabengali;099A
+cacute;0107
+cadeva;091A
+cagujarati;0A9A
+cagurmukhi;0A1A
+calsquare;3388
+candrabindubengali;0981
+candrabinducmb;0310
+candrabindudeva;0901
+candrabindugujarati;0A81
+capslock;21EA
+careof;2105
+caron;02C7
+caronbelowcmb;032C
+caroncmb;030C
+carriagereturn;21B5
+cbopomofo;3118
+ccaron;010D
+ccedilla;00E7
+ccedillaacute;1E09
+ccircle;24D2
+ccircumflex;0109
+ccurl;0255
+cdot;010B
+cdotaccent;010B
+cdsquare;33C5
+cedilla;00B8
+cedillacmb;0327
+cent;00A2
+centigrade;2103
+centinferior;F6DF
+centmonospace;FFE0
+centoldstyle;F7A2
+centsuperior;F6E0
+chaarmenian;0579
+chabengali;099B
+chadeva;091B
+chagujarati;0A9B
+chagurmukhi;0A1B
+chbopomofo;3114
+cheabkhasiancyrillic;04BD
+checkmark;2713
+checyrillic;0447
+chedescenderabkhasiancyrillic;04BF
+chedescendercyrillic;04B7
+chedieresiscyrillic;04F5
+cheharmenian;0573
+chekhakassiancyrillic;04CC
+cheverticalstrokecyrillic;04B9
+chi;03C7
+chieuchacirclekorean;3277
+chieuchaparenkorean;3217
+chieuchcirclekorean;3269
+chieuchkorean;314A
+chieuchparenkorean;3209
+chochangthai;0E0A
+chochanthai;0E08
+chochingthai;0E09
+chochoethai;0E0C
+chook;0188
+cieucacirclekorean;3276
+cieucaparenkorean;3216
+cieuccirclekorean;3268
+cieuckorean;3148
+cieucparenkorean;3208
+cieucuparenkorean;321C
+circle;25CB
+circlemultiply;2297
+circleot;2299
+circleplus;2295
+circlepostalmark;3036
+circlewithlefthalfblack;25D0
+circlewithrighthalfblack;25D1
+circumflex;02C6
+circumflexbelowcmb;032D
+circumflexcmb;0302
+clear;2327
+clickalveolar;01C2
+clickdental;01C0
+clicklateral;01C1
+clickretroflex;01C3
+club;2663
+clubsuitblack;2663
+clubsuitwhite;2667
+cmcubedsquare;33A4
+cmonospace;FF43
+cmsquaredsquare;33A0
+coarmenian;0581
+colon;003A
+colonmonetary;20A1
+colonmonospace;FF1A
+colonsign;20A1
+colonsmall;FE55
+colontriangularhalfmod;02D1
+colontriangularmod;02D0
+comma;002C
+commaabovecmb;0313
+commaaboverightcmb;0315
+commaaccent;F6C3
+commaarabic;060C
+commaarmenian;055D
+commainferior;F6E1
+commamonospace;FF0C
+commareversedabovecmb;0314
+commareversedmod;02BD
+commasmall;FE50
+commasuperior;F6E2
+commaturnedabovecmb;0312
+commaturnedmod;02BB
+compass;263C
+congruent;2245
+contourintegral;222E
+control;2303
+controlACK;0006
+controlBEL;0007
+controlBS;0008
+controlCAN;0018
+controlCR;000D
+controlDC1;0011
+controlDC2;0012
+controlDC3;0013
+controlDC4;0014
+controlDEL;007F
+controlDLE;0010
+controlEM;0019
+controlENQ;0005
+controlEOT;0004
+controlESC;001B
+controlETB;0017
+controlETX;0003
+controlFF;000C
+controlFS;001C
+controlGS;001D
+controlHT;0009
+controlLF;000A
+controlNAK;0015
+controlRS;001E
+controlSI;000F
+controlSO;000E
+controlSOT;0002
+controlSTX;0001
+controlSUB;001A
+controlSYN;0016
+controlUS;001F
+controlVT;000B
+copyright;00A9
+copyrightsans;F8E9
+copyrightserif;F6D9
+cornerbracketleft;300C
+cornerbracketlefthalfwidth;FF62
+cornerbracketleftvertical;FE41
+cornerbracketright;300D
+cornerbracketrighthalfwidth;FF63
+cornerbracketrightvertical;FE42
+corporationsquare;337F
+cosquare;33C7
+coverkgsquare;33C6
+cparen;249E
+cruzeiro;20A2
+cstretched;0297
+curlyand;22CF
+curlyor;22CE
+currency;00A4
+cyrBreve;F6D1
+cyrFlex;F6D2
+cyrbreve;F6D4
+cyrflex;F6D5
+d;0064
+daarmenian;0564
+dabengali;09A6
+dadarabic;0636
+dadeva;0926
+dadfinalarabic;FEBE
+dadinitialarabic;FEBF
+dadmedialarabic;FEC0
+dagesh;05BC
+dageshhebrew;05BC
+dagger;2020
+daggerdbl;2021
+dagujarati;0AA6
+dagurmukhi;0A26
+dahiragana;3060
+dakatakana;30C0
+dalarabic;062F
+dalet;05D3
+daletdagesh;FB33
+daletdageshhebrew;FB33
+dalethatafpatah;05D3 05B2
+dalethatafpatahhebrew;05D3 05B2
+dalethatafsegol;05D3 05B1
+dalethatafsegolhebrew;05D3 05B1
+dalethebrew;05D3
+dalethiriq;05D3 05B4
+dalethiriqhebrew;05D3 05B4
+daletholam;05D3 05B9
+daletholamhebrew;05D3 05B9
+daletpatah;05D3 05B7
+daletpatahhebrew;05D3 05B7
+daletqamats;05D3 05B8
+daletqamatshebrew;05D3 05B8
+daletqubuts;05D3 05BB
+daletqubutshebrew;05D3 05BB
+daletsegol;05D3 05B6
+daletsegolhebrew;05D3 05B6
+daletsheva;05D3 05B0
+daletshevahebrew;05D3 05B0
+dalettsere;05D3 05B5
+dalettserehebrew;05D3 05B5
+dalfinalarabic;FEAA
+dammaarabic;064F
+dammalowarabic;064F
+dammatanaltonearabic;064C
+dammatanarabic;064C
+danda;0964
+dargahebrew;05A7
+dargalefthebrew;05A7
+dasiapneumatacyrilliccmb;0485
+dblGrave;F6D3
+dblanglebracketleft;300A
+dblanglebracketleftvertical;FE3D
+dblanglebracketright;300B
+dblanglebracketrightvertical;FE3E
+dblarchinvertedbelowcmb;032B
+dblarrowleft;21D4
+dblarrowright;21D2
+dbldanda;0965
+dblgrave;F6D6
+dblgravecmb;030F
+dblintegral;222C
+dbllowline;2017
+dbllowlinecmb;0333
+dbloverlinecmb;033F
+dblprimemod;02BA
+dblverticalbar;2016
+dblverticallineabovecmb;030E
+dbopomofo;3109
+dbsquare;33C8
+dcaron;010F
+dcedilla;1E11
+dcircle;24D3
+dcircumflexbelow;1E13
+dcroat;0111
+ddabengali;09A1
+ddadeva;0921
+ddagujarati;0AA1
+ddagurmukhi;0A21
+ddalarabic;0688
+ddalfinalarabic;FB89
+dddhadeva;095C
+ddhabengali;09A2
+ddhadeva;0922
+ddhagujarati;0AA2
+ddhagurmukhi;0A22
+ddotaccent;1E0B
+ddotbelow;1E0D
+decimalseparatorarabic;066B
+decimalseparatorpersian;066B
+decyrillic;0434
+degree;00B0
+dehihebrew;05AD
+dehiragana;3067
+deicoptic;03EF
+dekatakana;30C7
+deleteleft;232B
+deleteright;2326
+delta;03B4
+deltaturned;018D
+denominatorminusonenumeratorbengali;09F8
+dezh;02A4
+dhabengali;09A7
+dhadeva;0927
+dhagujarati;0AA7
+dhagurmukhi;0A27
+dhook;0257
+dialytikatonos;0385
+dialytikatonoscmb;0344
+diamond;2666
+diamondsuitwhite;2662
+dieresis;00A8
+dieresisacute;F6D7
+dieresisbelowcmb;0324
+dieresiscmb;0308
+dieresisgrave;F6D8
+dieresistonos;0385
+dihiragana;3062
+dikatakana;30C2
+dittomark;3003
+divide;00F7
+divides;2223
+divisionslash;2215
+djecyrillic;0452
+dkshade;2593
+dlinebelow;1E0F
+dlsquare;3397
+dmacron;0111
+dmonospace;FF44
+dnblock;2584
+dochadathai;0E0E
+dodekthai;0E14
+dohiragana;3069
+dokatakana;30C9
+dollar;0024
+dollarinferior;F6E3
+dollarmonospace;FF04
+dollaroldstyle;F724
+dollarsmall;FE69
+dollarsuperior;F6E4
+dong;20AB
+dorusquare;3326
+dotaccent;02D9
+dotaccentcmb;0307
+dotbelowcmb;0323
+dotbelowcomb;0323
+dotkatakana;30FB
+dotlessi;0131
+dotlessj;F6BE
+dotlessjstrokehook;0284
+dotmath;22C5
+dottedcircle;25CC
+doubleyodpatah;FB1F
+doubleyodpatahhebrew;FB1F
+downtackbelowcmb;031E
+downtackmod;02D5
+dparen;249F
+dsuperior;F6EB
+dtail;0256
+dtopbar;018C
+duhiragana;3065
+dukatakana;30C5
+dz;01F3
+dzaltone;02A3
+dzcaron;01C6
+dzcurl;02A5
+dzeabkhasiancyrillic;04E1
+dzecyrillic;0455
+dzhecyrillic;045F
+e;0065
+eacute;00E9
+earth;2641
+ebengali;098F
+ebopomofo;311C
+ebreve;0115
+ecandradeva;090D
+ecandragujarati;0A8D
+ecandravowelsigndeva;0945
+ecandravowelsigngujarati;0AC5
+ecaron;011B
+ecedillabreve;1E1D
+echarmenian;0565
+echyiwnarmenian;0587
+ecircle;24D4
+ecircumflex;00EA
+ecircumflexacute;1EBF
+ecircumflexbelow;1E19
+ecircumflexdotbelow;1EC7
+ecircumflexgrave;1EC1
+ecircumflexhookabove;1EC3
+ecircumflextilde;1EC5
+ecyrillic;0454
+edblgrave;0205
+edeva;090F
+edieresis;00EB
+edot;0117
+edotaccent;0117
+edotbelow;1EB9
+eegurmukhi;0A0F
+eematragurmukhi;0A47
+efcyrillic;0444
+egrave;00E8
+egujarati;0A8F
+eharmenian;0567
+ehbopomofo;311D
+ehiragana;3048
+ehookabove;1EBB
+eibopomofo;311F
+eight;0038
+eightarabic;0668
+eightbengali;09EE
+eightcircle;2467
+eightcircleinversesansserif;2791
+eightdeva;096E
+eighteencircle;2471
+eighteenparen;2485
+eighteenperiod;2499
+eightgujarati;0AEE
+eightgurmukhi;0A6E
+eighthackarabic;0668
+eighthangzhou;3028
+eighthnotebeamed;266B
+eightideographicparen;3227
+eightinferior;2088
+eightmonospace;FF18
+eightoldstyle;F738
+eightparen;247B
+eightperiod;248F
+eightpersian;06F8
+eightroman;2177
+eightsuperior;2078
+eightthai;0E58
+einvertedbreve;0207
+eiotifiedcyrillic;0465
+ekatakana;30A8
+ekatakanahalfwidth;FF74
+ekonkargurmukhi;0A74
+ekorean;3154
+elcyrillic;043B
+element;2208
+elevencircle;246A
+elevenparen;247E
+elevenperiod;2492
+elevenroman;217A
+ellipsis;2026
+ellipsisvertical;22EE
+emacron;0113
+emacronacute;1E17
+emacrongrave;1E15
+emcyrillic;043C
+emdash;2014
+emdashvertical;FE31
+emonospace;FF45
+emphasismarkarmenian;055B
+emptyset;2205
+enbopomofo;3123
+encyrillic;043D
+endash;2013
+endashvertical;FE32
+endescendercyrillic;04A3
+eng;014B
+engbopomofo;3125
+enghecyrillic;04A5
+enhookcyrillic;04C8
+enspace;2002
+eogonek;0119
+eokorean;3153
+eopen;025B
+eopenclosed;029A
+eopenreversed;025C
+eopenreversedclosed;025E
+eopenreversedhook;025D
+eparen;24A0
+epsilon;03B5
+epsilontonos;03AD
+equal;003D
+equalmonospace;FF1D
+equalsmall;FE66
+equalsuperior;207C
+equivalence;2261
+erbopomofo;3126
+ercyrillic;0440
+ereversed;0258
+ereversedcyrillic;044D
+escyrillic;0441
+esdescendercyrillic;04AB
+esh;0283
+eshcurl;0286
+eshortdeva;090E
+eshortvowelsigndeva;0946
+eshreversedloop;01AA
+eshsquatreversed;0285
+esmallhiragana;3047
+esmallkatakana;30A7
+esmallkatakanahalfwidth;FF6A
+estimated;212E
+esuperior;F6EC
+eta;03B7
+etarmenian;0568
+etatonos;03AE
+eth;00F0
+etilde;1EBD
+etildebelow;1E1B
+etnahtafoukhhebrew;0591
+etnahtafoukhlefthebrew;0591
+etnahtahebrew;0591
+etnahtalefthebrew;0591
+eturned;01DD
+eukorean;3161
+euro;20AC
+evowelsignbengali;09C7
+evowelsigndeva;0947
+evowelsigngujarati;0AC7
+exclam;0021
+exclamarmenian;055C
+exclamdbl;203C
+exclamdown;00A1
+exclamdownsmall;F7A1
+exclammonospace;FF01
+exclamsmall;F721
+existential;2203
+ezh;0292
+ezhcaron;01EF
+ezhcurl;0293
+ezhreversed;01B9
+ezhtail;01BA
+f;0066
+fadeva;095E
+fagurmukhi;0A5E
+fahrenheit;2109
+fathaarabic;064E
+fathalowarabic;064E
+fathatanarabic;064B
+fbopomofo;3108
+fcircle;24D5
+fdotaccent;1E1F
+feharabic;0641
+feharmenian;0586
+fehfinalarabic;FED2
+fehinitialarabic;FED3
+fehmedialarabic;FED4
+feicoptic;03E5
+female;2640
+ff;FB00
+ffi;FB03
+ffl;FB04
+fi;FB01
+fifteencircle;246E
+fifteenparen;2482
+fifteenperiod;2496
+figuredash;2012
+filledbox;25A0
+filledrect;25AC
+finalkaf;05DA
+finalkafdagesh;FB3A
+finalkafdageshhebrew;FB3A
+finalkafhebrew;05DA
+finalkafqamats;05DA 05B8
+finalkafqamatshebrew;05DA 05B8
+finalkafsheva;05DA 05B0
+finalkafshevahebrew;05DA 05B0
+finalmem;05DD
+finalmemhebrew;05DD
+finalnun;05DF
+finalnunhebrew;05DF
+finalpe;05E3
+finalpehebrew;05E3
+finaltsadi;05E5
+finaltsadihebrew;05E5
+firsttonechinese;02C9
+fisheye;25C9
+fitacyrillic;0473
+five;0035
+fivearabic;0665
+fivebengali;09EB
+fivecircle;2464
+fivecircleinversesansserif;278E
+fivedeva;096B
+fiveeighths;215D
+fivegujarati;0AEB
+fivegurmukhi;0A6B
+fivehackarabic;0665
+fivehangzhou;3025
+fiveideographicparen;3224
+fiveinferior;2085
+fivemonospace;FF15
+fiveoldstyle;F735
+fiveparen;2478
+fiveperiod;248C
+fivepersian;06F5
+fiveroman;2174
+fivesuperior;2075
+fivethai;0E55
+fl;FB02
+florin;0192
+fmonospace;FF46
+fmsquare;3399
+fofanthai;0E1F
+fofathai;0E1D
+fongmanthai;0E4F
+forall;2200
+four;0034
+fourarabic;0664
+fourbengali;09EA
+fourcircle;2463
+fourcircleinversesansserif;278D
+fourdeva;096A
+fourgujarati;0AEA
+fourgurmukhi;0A6A
+fourhackarabic;0664
+fourhangzhou;3024
+fourideographicparen;3223
+fourinferior;2084
+fourmonospace;FF14
+fournumeratorbengali;09F7
+fouroldstyle;F734
+fourparen;2477
+fourperiod;248B
+fourpersian;06F4
+fourroman;2173
+foursuperior;2074
+fourteencircle;246D
+fourteenparen;2481
+fourteenperiod;2495
+fourthai;0E54
+fourthtonechinese;02CB
+fparen;24A1
+fraction;2044
+franc;20A3
+g;0067
+gabengali;0997
+gacute;01F5
+gadeva;0917
+gafarabic;06AF
+gaffinalarabic;FB93
+gafinitialarabic;FB94
+gafmedialarabic;FB95
+gagujarati;0A97
+gagurmukhi;0A17
+gahiragana;304C
+gakatakana;30AC
+gamma;03B3
+gammalatinsmall;0263
+gammasuperior;02E0
+gangiacoptic;03EB
+gbopomofo;310D
+gbreve;011F
+gcaron;01E7
+gcedilla;0123
+gcircle;24D6
+gcircumflex;011D
+gcommaaccent;0123
+gdot;0121
+gdotaccent;0121
+gecyrillic;0433
+gehiragana;3052
+gekatakana;30B2
+geometricallyequal;2251
+gereshaccenthebrew;059C
+gereshhebrew;05F3
+gereshmuqdamhebrew;059D
+germandbls;00DF
+gershayimaccenthebrew;059E
+gershayimhebrew;05F4
+getamark;3013
+ghabengali;0998
+ghadarmenian;0572
+ghadeva;0918
+ghagujarati;0A98
+ghagurmukhi;0A18
+ghainarabic;063A
+ghainfinalarabic;FECE
+ghaininitialarabic;FECF
+ghainmedialarabic;FED0
+ghemiddlehookcyrillic;0495
+ghestrokecyrillic;0493
+gheupturncyrillic;0491
+ghhadeva;095A
+ghhagurmukhi;0A5A
+ghook;0260
+ghzsquare;3393
+gihiragana;304E
+gikatakana;30AE
+gimarmenian;0563
+gimel;05D2
+gimeldagesh;FB32
+gimeldageshhebrew;FB32
+gimelhebrew;05D2
+gjecyrillic;0453
+glottalinvertedstroke;01BE
+glottalstop;0294
+glottalstopinverted;0296
+glottalstopmod;02C0
+glottalstopreversed;0295
+glottalstopreversedmod;02C1
+glottalstopreversedsuperior;02E4
+glottalstopstroke;02A1
+glottalstopstrokereversed;02A2
+gmacron;1E21
+gmonospace;FF47
+gohiragana;3054
+gokatakana;30B4
+gparen;24A2
+gpasquare;33AC
+gradient;2207
+grave;0060
+gravebelowcmb;0316
+gravecmb;0300
+gravecomb;0300
+gravedeva;0953
+gravelowmod;02CE
+gravemonospace;FF40
+gravetonecmb;0340
+greater;003E
+greaterequal;2265
+greaterequalorless;22DB
+greatermonospace;FF1E
+greaterorequivalent;2273
+greaterorless;2277
+greateroverequal;2267
+greatersmall;FE65
+gscript;0261
+gstroke;01E5
+guhiragana;3050
+guillemotleft;00AB
+guillemotright;00BB
+guilsinglleft;2039
+guilsinglright;203A
+gukatakana;30B0
+guramusquare;3318
+gysquare;33C9
+h;0068
+haabkhasiancyrillic;04A9
+haaltonearabic;06C1
+habengali;09B9
+hadescendercyrillic;04B3
+hadeva;0939
+hagujarati;0AB9
+hagurmukhi;0A39
+haharabic;062D
+hahfinalarabic;FEA2
+hahinitialarabic;FEA3
+hahiragana;306F
+hahmedialarabic;FEA4
+haitusquare;332A
+hakatakana;30CF
+hakatakanahalfwidth;FF8A
+halantgurmukhi;0A4D
+hamzaarabic;0621
+hamzadammaarabic;0621 064F
+hamzadammatanarabic;0621 064C
+hamzafathaarabic;0621 064E
+hamzafathatanarabic;0621 064B
+hamzalowarabic;0621
+hamzalowkasraarabic;0621 0650
+hamzalowkasratanarabic;0621 064D
+hamzasukunarabic;0621 0652
+hangulfiller;3164
+hardsigncyrillic;044A
+harpoonleftbarbup;21BC
+harpoonrightbarbup;21C0
+hasquare;33CA
+hatafpatah;05B2
+hatafpatah16;05B2
+hatafpatah23;05B2
+hatafpatah2f;05B2
+hatafpatahhebrew;05B2
+hatafpatahnarrowhebrew;05B2
+hatafpatahquarterhebrew;05B2
+hatafpatahwidehebrew;05B2
+hatafqamats;05B3
+hatafqamats1b;05B3
+hatafqamats28;05B3
+hatafqamats34;05B3
+hatafqamatshebrew;05B3
+hatafqamatsnarrowhebrew;05B3
+hatafqamatsquarterhebrew;05B3
+hatafqamatswidehebrew;05B3
+hatafsegol;05B1
+hatafsegol17;05B1
+hatafsegol24;05B1
+hatafsegol30;05B1
+hatafsegolhebrew;05B1
+hatafsegolnarrowhebrew;05B1
+hatafsegolquarterhebrew;05B1
+hatafsegolwidehebrew;05B1
+hbar;0127
+hbopomofo;310F
+hbrevebelow;1E2B
+hcedilla;1E29
+hcircle;24D7
+hcircumflex;0125
+hdieresis;1E27
+hdotaccent;1E23
+hdotbelow;1E25
+he;05D4
+heart;2665
+heartsuitblack;2665
+heartsuitwhite;2661
+hedagesh;FB34
+hedageshhebrew;FB34
+hehaltonearabic;06C1
+heharabic;0647
+hehebrew;05D4
+hehfinalaltonearabic;FBA7
+hehfinalalttwoarabic;FEEA
+hehfinalarabic;FEEA
+hehhamzaabovefinalarabic;FBA5
+hehhamzaaboveisolatedarabic;FBA4
+hehinitialaltonearabic;FBA8
+hehinitialarabic;FEEB
+hehiragana;3078
+hehmedialaltonearabic;FBA9
+hehmedialarabic;FEEC
+heiseierasquare;337B
+hekatakana;30D8
+hekatakanahalfwidth;FF8D
+hekutaarusquare;3336
+henghook;0267
+herutusquare;3339
+het;05D7
+hethebrew;05D7
+hhook;0266
+hhooksuperior;02B1
+hieuhacirclekorean;327B
+hieuhaparenkorean;321B
+hieuhcirclekorean;326D
+hieuhkorean;314E
+hieuhparenkorean;320D
+hihiragana;3072
+hikatakana;30D2
+hikatakanahalfwidth;FF8B
+hiriq;05B4
+hiriq14;05B4
+hiriq21;05B4
+hiriq2d;05B4
+hiriqhebrew;05B4
+hiriqnarrowhebrew;05B4
+hiriqquarterhebrew;05B4
+hiriqwidehebrew;05B4
+hlinebelow;1E96
+hmonospace;FF48
+hoarmenian;0570
+hohipthai;0E2B
+hohiragana;307B
+hokatakana;30DB
+hokatakanahalfwidth;FF8E
+holam;05B9
+holam19;05B9
+holam26;05B9
+holam32;05B9
+holamhebrew;05B9
+holamnarrowhebrew;05B9
+holamquarterhebrew;05B9
+holamwidehebrew;05B9
+honokhukthai;0E2E
+hookabovecomb;0309
+hookcmb;0309
+hookpalatalizedbelowcmb;0321
+hookretroflexbelowcmb;0322
+hoonsquare;3342
+horicoptic;03E9
+horizontalbar;2015
+horncmb;031B
+hotsprings;2668
+house;2302
+hparen;24A3
+hsuperior;02B0
+hturned;0265
+huhiragana;3075
+huiitosquare;3333
+hukatakana;30D5
+hukatakanahalfwidth;FF8C
+hungarumlaut;02DD
+hungarumlautcmb;030B
+hv;0195
+hyphen;002D
+hypheninferior;F6E5
+hyphenmonospace;FF0D
+hyphensmall;FE63
+hyphensuperior;F6E6
+hyphentwo;2010
+i;0069
+iacute;00ED
+iacyrillic;044F
+ibengali;0987
+ibopomofo;3127
+ibreve;012D
+icaron;01D0
+icircle;24D8
+icircumflex;00EE
+icyrillic;0456
+idblgrave;0209
+ideographearthcircle;328F
+ideographfirecircle;328B
+ideographicallianceparen;323F
+ideographiccallparen;323A
+ideographiccentrecircle;32A5
+ideographicclose;3006
+ideographiccomma;3001
+ideographiccommaleft;FF64
+ideographiccongratulationparen;3237
+ideographiccorrectcircle;32A3
+ideographicearthparen;322F
+ideographicenterpriseparen;323D
+ideographicexcellentcircle;329D
+ideographicfestivalparen;3240
+ideographicfinancialcircle;3296
+ideographicfinancialparen;3236
+ideographicfireparen;322B
+ideographichaveparen;3232
+ideographichighcircle;32A4
+ideographiciterationmark;3005
+ideographiclaborcircle;3298
+ideographiclaborparen;3238
+ideographicleftcircle;32A7
+ideographiclowcircle;32A6
+ideographicmedicinecircle;32A9
+ideographicmetalparen;322E
+ideographicmoonparen;322A
+ideographicnameparen;3234
+ideographicperiod;3002
+ideographicprintcircle;329E
+ideographicreachparen;3243
+ideographicrepresentparen;3239
+ideographicresourceparen;323E
+ideographicrightcircle;32A8
+ideographicsecretcircle;3299
+ideographicselfparen;3242
+ideographicsocietyparen;3233
+ideographicspace;3000
+ideographicspecialparen;3235
+ideographicstockparen;3231
+ideographicstudyparen;323B
+ideographicsunparen;3230
+ideographicsuperviseparen;323C
+ideographicwaterparen;322C
+ideographicwoodparen;322D
+ideographiczero;3007
+ideographmetalcircle;328E
+ideographmooncircle;328A
+ideographnamecircle;3294
+ideographsuncircle;3290
+ideographwatercircle;328C
+ideographwoodcircle;328D
+ideva;0907
+idieresis;00EF
+idieresisacute;1E2F
+idieresiscyrillic;04E5
+idotbelow;1ECB
+iebrevecyrillic;04D7
+iecyrillic;0435
+ieungacirclekorean;3275
+ieungaparenkorean;3215
+ieungcirclekorean;3267
+ieungkorean;3147
+ieungparenkorean;3207
+igrave;00EC
+igujarati;0A87
+igurmukhi;0A07
+ihiragana;3044
+ihookabove;1EC9
+iibengali;0988
+iicyrillic;0438
+iideva;0908
+iigujarati;0A88
+iigurmukhi;0A08
+iimatragurmukhi;0A40
+iinvertedbreve;020B
+iishortcyrillic;0439
+iivowelsignbengali;09C0
+iivowelsigndeva;0940
+iivowelsigngujarati;0AC0
+ij;0133
+ikatakana;30A4
+ikatakanahalfwidth;FF72
+ikorean;3163
+ilde;02DC
+iluyhebrew;05AC
+imacron;012B
+imacroncyrillic;04E3
+imageorapproximatelyequal;2253
+imatragurmukhi;0A3F
+imonospace;FF49
+increment;2206
+infinity;221E
+iniarmenian;056B
+integral;222B
+integralbottom;2321
+integralbt;2321
+integralex;F8F5
+integraltop;2320
+integraltp;2320
+intersection;2229
+intisquare;3305
+invbullet;25D8
+invcircle;25D9
+invsmileface;263B
+iocyrillic;0451
+iogonek;012F
+iota;03B9
+iotadieresis;03CA
+iotadieresistonos;0390
+iotalatin;0269
+iotatonos;03AF
+iparen;24A4
+irigurmukhi;0A72
+ismallhiragana;3043
+ismallkatakana;30A3
+ismallkatakanahalfwidth;FF68
+issharbengali;09FA
+istroke;0268
+isuperior;F6ED
+iterationhiragana;309D
+iterationkatakana;30FD
+itilde;0129
+itildebelow;1E2D
+iubopomofo;3129
+iucyrillic;044E
+ivowelsignbengali;09BF
+ivowelsigndeva;093F
+ivowelsigngujarati;0ABF
+izhitsacyrillic;0475
+izhitsadblgravecyrillic;0477
+j;006A
+jaarmenian;0571
+jabengali;099C
+jadeva;091C
+jagujarati;0A9C
+jagurmukhi;0A1C
+jbopomofo;3110
+jcaron;01F0
+jcircle;24D9
+jcircumflex;0135
+jcrossedtail;029D
+jdotlessstroke;025F
+jecyrillic;0458
+jeemarabic;062C
+jeemfinalarabic;FE9E
+jeeminitialarabic;FE9F
+jeemmedialarabic;FEA0
+jeharabic;0698
+jehfinalarabic;FB8B
+jhabengali;099D
+jhadeva;091D
+jhagujarati;0A9D
+jhagurmukhi;0A1D
+jheharmenian;057B
+jis;3004
+jmonospace;FF4A
+jparen;24A5
+jsuperior;02B2
+k;006B
+kabashkircyrillic;04A1
+kabengali;0995
+kacute;1E31
+kacyrillic;043A
+kadescendercyrillic;049B
+kadeva;0915
+kaf;05DB
+kafarabic;0643
+kafdagesh;FB3B
+kafdageshhebrew;FB3B
+kaffinalarabic;FEDA
+kafhebrew;05DB
+kafinitialarabic;FEDB
+kafmedialarabic;FEDC
+kafrafehebrew;FB4D
+kagujarati;0A95
+kagurmukhi;0A15
+kahiragana;304B
+kahookcyrillic;04C4
+kakatakana;30AB
+kakatakanahalfwidth;FF76
+kappa;03BA
+kappasymbolgreek;03F0
+kapyeounmieumkorean;3171
+kapyeounphieuphkorean;3184
+kapyeounpieupkorean;3178
+kapyeounssangpieupkorean;3179
+karoriisquare;330D
+kashidaautoarabic;0640
+kashidaautonosidebearingarabic;0640
+kasmallkatakana;30F5
+kasquare;3384
+kasraarabic;0650
+kasratanarabic;064D
+kastrokecyrillic;049F
+katahiraprolongmarkhalfwidth;FF70
+kaverticalstrokecyrillic;049D
+kbopomofo;310E
+kcalsquare;3389
+kcaron;01E9
+kcedilla;0137
+kcircle;24DA
+kcommaaccent;0137
+kdotbelow;1E33
+keharmenian;0584
+kehiragana;3051
+kekatakana;30B1
+kekatakanahalfwidth;FF79
+kenarmenian;056F
+kesmallkatakana;30F6
+kgreenlandic;0138
+khabengali;0996
+khacyrillic;0445
+khadeva;0916
+khagujarati;0A96
+khagurmukhi;0A16
+khaharabic;062E
+khahfinalarabic;FEA6
+khahinitialarabic;FEA7
+khahmedialarabic;FEA8
+kheicoptic;03E7
+khhadeva;0959
+khhagurmukhi;0A59
+khieukhacirclekorean;3278
+khieukhaparenkorean;3218
+khieukhcirclekorean;326A
+khieukhkorean;314B
+khieukhparenkorean;320A
+khokhaithai;0E02
+khokhonthai;0E05
+khokhuatthai;0E03
+khokhwaithai;0E04
+khomutthai;0E5B
+khook;0199
+khorakhangthai;0E06
+khzsquare;3391
+kihiragana;304D
+kikatakana;30AD
+kikatakanahalfwidth;FF77
+kiroguramusquare;3315
+kiromeetorusquare;3316
+kirosquare;3314
+kiyeokacirclekorean;326E
+kiyeokaparenkorean;320E
+kiyeokcirclekorean;3260
+kiyeokkorean;3131
+kiyeokparenkorean;3200
+kiyeoksioskorean;3133
+kjecyrillic;045C
+klinebelow;1E35
+klsquare;3398
+kmcubedsquare;33A6
+kmonospace;FF4B
+kmsquaredsquare;33A2
+kohiragana;3053
+kohmsquare;33C0
+kokaithai;0E01
+kokatakana;30B3
+kokatakanahalfwidth;FF7A
+kooposquare;331E
+koppacyrillic;0481
+koreanstandardsymbol;327F
+koroniscmb;0343
+kparen;24A6
+kpasquare;33AA
+ksicyrillic;046F
+ktsquare;33CF
+kturned;029E
+kuhiragana;304F
+kukatakana;30AF
+kukatakanahalfwidth;FF78
+kvsquare;33B8
+kwsquare;33BE
+l;006C
+labengali;09B2
+lacute;013A
+ladeva;0932
+lagujarati;0AB2
+lagurmukhi;0A32
+lakkhangyaothai;0E45
+lamaleffinalarabic;FEFC
+lamalefhamzaabovefinalarabic;FEF8
+lamalefhamzaaboveisolatedarabic;FEF7
+lamalefhamzabelowfinalarabic;FEFA
+lamalefhamzabelowisolatedarabic;FEF9
+lamalefisolatedarabic;FEFB
+lamalefmaddaabovefinalarabic;FEF6
+lamalefmaddaaboveisolatedarabic;FEF5
+lamarabic;0644
+lambda;03BB
+lambdastroke;019B
+lamed;05DC
+lameddagesh;FB3C
+lameddageshhebrew;FB3C
+lamedhebrew;05DC
+lamedholam;05DC 05B9
+lamedholamdagesh;05DC 05B9 05BC
+lamedholamdageshhebrew;05DC 05B9 05BC
+lamedholamhebrew;05DC 05B9
+lamfinalarabic;FEDE
+lamhahinitialarabic;FCCA
+laminitialarabic;FEDF
+lamjeeminitialarabic;FCC9
+lamkhahinitialarabic;FCCB
+lamlamhehisolatedarabic;FDF2
+lammedialarabic;FEE0
+lammeemhahinitialarabic;FD88
+lammeeminitialarabic;FCCC
+lammeemjeeminitialarabic;FEDF FEE4 FEA0
+lammeemkhahinitialarabic;FEDF FEE4 FEA8
+largecircle;25EF
+lbar;019A
+lbelt;026C
+lbopomofo;310C
+lcaron;013E
+lcedilla;013C
+lcircle;24DB
+lcircumflexbelow;1E3D
+lcommaaccent;013C
+ldot;0140
+ldotaccent;0140
+ldotbelow;1E37
+ldotbelowmacron;1E39
+leftangleabovecmb;031A
+lefttackbelowcmb;0318
+less;003C
+lessequal;2264
+lessequalorgreater;22DA
+lessmonospace;FF1C
+lessorequivalent;2272
+lessorgreater;2276
+lessoverequal;2266
+lesssmall;FE64
+lezh;026E
+lfblock;258C
+lhookretroflex;026D
+lira;20A4
+liwnarmenian;056C
+lj;01C9
+ljecyrillic;0459
+ll;F6C0
+lladeva;0933
+llagujarati;0AB3
+llinebelow;1E3B
+llladeva;0934
+llvocalicbengali;09E1
+llvocalicdeva;0961
+llvocalicvowelsignbengali;09E3
+llvocalicvowelsigndeva;0963
+lmiddletilde;026B
+lmonospace;FF4C
+lmsquare;33D0
+lochulathai;0E2C
+logicaland;2227
+logicalnot;00AC
+logicalnotreversed;2310
+logicalor;2228
+lolingthai;0E25
+longs;017F
+lowlinecenterline;FE4E
+lowlinecmb;0332
+lowlinedashed;FE4D
+lozenge;25CA
+lparen;24A7
+lslash;0142
+lsquare;2113
+lsuperior;F6EE
+ltshade;2591
+luthai;0E26
+lvocalicbengali;098C
+lvocalicdeva;090C
+lvocalicvowelsignbengali;09E2
+lvocalicvowelsigndeva;0962
+lxsquare;33D3
+m;006D
+mabengali;09AE
+macron;00AF
+macronbelowcmb;0331
+macroncmb;0304
+macronlowmod;02CD
+macronmonospace;FFE3
+macute;1E3F
+madeva;092E
+magujarati;0AAE
+magurmukhi;0A2E
+mahapakhhebrew;05A4
+mahapakhlefthebrew;05A4
+mahiragana;307E
+maichattawalowleftthai;F895
+maichattawalowrightthai;F894
+maichattawathai;0E4B
+maichattawaupperleftthai;F893
+maieklowleftthai;F88C
+maieklowrightthai;F88B
+maiekthai;0E48
+maiekupperleftthai;F88A
+maihanakatleftthai;F884
+maihanakatthai;0E31
+maitaikhuleftthai;F889
+maitaikhuthai;0E47
+maitholowleftthai;F88F
+maitholowrightthai;F88E
+maithothai;0E49
+maithoupperleftthai;F88D
+maitrilowleftthai;F892
+maitrilowrightthai;F891
+maitrithai;0E4A
+maitriupperleftthai;F890
+maiyamokthai;0E46
+makatakana;30DE
+makatakanahalfwidth;FF8F
+male;2642
+mansyonsquare;3347
+maqafhebrew;05BE
+mars;2642
+masoracirclehebrew;05AF
+masquare;3383
+mbopomofo;3107
+mbsquare;33D4
+mcircle;24DC
+mcubedsquare;33A5
+mdotaccent;1E41
+mdotbelow;1E43
+meemarabic;0645
+meemfinalarabic;FEE2
+meeminitialarabic;FEE3
+meemmedialarabic;FEE4
+meemmeeminitialarabic;FCD1
+meemmeemisolatedarabic;FC48
+meetorusquare;334D
+mehiragana;3081
+meizierasquare;337E
+mekatakana;30E1
+mekatakanahalfwidth;FF92
+mem;05DE
+memdagesh;FB3E
+memdageshhebrew;FB3E
+memhebrew;05DE
+menarmenian;0574
+merkhahebrew;05A5
+merkhakefulahebrew;05A6
+merkhakefulalefthebrew;05A6
+merkhalefthebrew;05A5
+mhook;0271
+mhzsquare;3392
+middledotkatakanahalfwidth;FF65
+middot;00B7
+mieumacirclekorean;3272
+mieumaparenkorean;3212
+mieumcirclekorean;3264
+mieumkorean;3141
+mieumpansioskorean;3170
+mieumparenkorean;3204
+mieumpieupkorean;316E
+mieumsioskorean;316F
+mihiragana;307F
+mikatakana;30DF
+mikatakanahalfwidth;FF90
+minus;2212
+minusbelowcmb;0320
+minuscircle;2296
+minusmod;02D7
+minusplus;2213
+minute;2032
+miribaarusquare;334A
+mirisquare;3349
+mlonglegturned;0270
+mlsquare;3396
+mmcubedsquare;33A3
+mmonospace;FF4D
+mmsquaredsquare;339F
+mohiragana;3082
+mohmsquare;33C1
+mokatakana;30E2
+mokatakanahalfwidth;FF93
+molsquare;33D6
+momathai;0E21
+moverssquare;33A7
+moverssquaredsquare;33A8
+mparen;24A8
+mpasquare;33AB
+mssquare;33B3
+msuperior;F6EF
+mturned;026F
+mu;00B5
+mu1;00B5
+muasquare;3382
+muchgreater;226B
+muchless;226A
+mufsquare;338C
+mugreek;03BC
+mugsquare;338D
+muhiragana;3080
+mukatakana;30E0
+mukatakanahalfwidth;FF91
+mulsquare;3395
+multiply;00D7
+mumsquare;339B
+munahhebrew;05A3
+munahlefthebrew;05A3
+musicalnote;266A
+musicalnotedbl;266B
+musicflatsign;266D
+musicsharpsign;266F
+mussquare;33B2
+muvsquare;33B6
+muwsquare;33BC
+mvmegasquare;33B9
+mvsquare;33B7
+mwmegasquare;33BF
+mwsquare;33BD
+n;006E
+nabengali;09A8
+nabla;2207
+nacute;0144
+nadeva;0928
+nagujarati;0AA8
+nagurmukhi;0A28
+nahiragana;306A
+nakatakana;30CA
+nakatakanahalfwidth;FF85
+napostrophe;0149
+nasquare;3381
+nbopomofo;310B
+nbspace;00A0
+ncaron;0148
+ncedilla;0146
+ncircle;24DD
+ncircumflexbelow;1E4B
+ncommaaccent;0146
+ndotaccent;1E45
+ndotbelow;1E47
+nehiragana;306D
+nekatakana;30CD
+nekatakanahalfwidth;FF88
+newsheqelsign;20AA
+nfsquare;338B
+ngabengali;0999
+ngadeva;0919
+ngagujarati;0A99
+ngagurmukhi;0A19
+ngonguthai;0E07
+nhiragana;3093
+nhookleft;0272
+nhookretroflex;0273
+nieunacirclekorean;326F
+nieunaparenkorean;320F
+nieuncieuckorean;3135
+nieuncirclekorean;3261
+nieunhieuhkorean;3136
+nieunkorean;3134
+nieunpansioskorean;3168
+nieunparenkorean;3201
+nieunsioskorean;3167
+nieuntikeutkorean;3166
+nihiragana;306B
+nikatakana;30CB
+nikatakanahalfwidth;FF86
+nikhahitleftthai;F899
+nikhahitthai;0E4D
+nine;0039
+ninearabic;0669
+ninebengali;09EF
+ninecircle;2468
+ninecircleinversesansserif;2792
+ninedeva;096F
+ninegujarati;0AEF
+ninegurmukhi;0A6F
+ninehackarabic;0669
+ninehangzhou;3029
+nineideographicparen;3228
+nineinferior;2089
+ninemonospace;FF19
+nineoldstyle;F739
+nineparen;247C
+nineperiod;2490
+ninepersian;06F9
+nineroman;2178
+ninesuperior;2079
+nineteencircle;2472
+nineteenparen;2486
+nineteenperiod;249A
+ninethai;0E59
+nj;01CC
+njecyrillic;045A
+nkatakana;30F3
+nkatakanahalfwidth;FF9D
+nlegrightlong;019E
+nlinebelow;1E49
+nmonospace;FF4E
+nmsquare;339A
+nnabengali;09A3
+nnadeva;0923
+nnagujarati;0AA3
+nnagurmukhi;0A23
+nnnadeva;0929
+nohiragana;306E
+nokatakana;30CE
+nokatakanahalfwidth;FF89
+nonbreakingspace;00A0
+nonenthai;0E13
+nonuthai;0E19
+noonarabic;0646
+noonfinalarabic;FEE6
+noonghunnaarabic;06BA
+noonghunnafinalarabic;FB9F
+noonhehinitialarabic;FEE7 FEEC
+nooninitialarabic;FEE7
+noonjeeminitialarabic;FCD2
+noonjeemisolatedarabic;FC4B
+noonmedialarabic;FEE8
+noonmeeminitialarabic;FCD5
+noonmeemisolatedarabic;FC4E
+noonnoonfinalarabic;FC8D
+notcontains;220C
+notelement;2209
+notelementof;2209
+notequal;2260
+notgreater;226F
+notgreaternorequal;2271
+notgreaternorless;2279
+notidentical;2262
+notless;226E
+notlessnorequal;2270
+notparallel;2226
+notprecedes;2280
+notsubset;2284
+notsucceeds;2281
+notsuperset;2285
+nowarmenian;0576
+nparen;24A9
+nssquare;33B1
+nsuperior;207F
+ntilde;00F1
+nu;03BD
+nuhiragana;306C
+nukatakana;30CC
+nukatakanahalfwidth;FF87
+nuktabengali;09BC
+nuktadeva;093C
+nuktagujarati;0ABC
+nuktagurmukhi;0A3C
+numbersign;0023
+numbersignmonospace;FF03
+numbersignsmall;FE5F
+numeralsigngreek;0374
+numeralsignlowergreek;0375
+numero;2116
+nun;05E0
+nundagesh;FB40
+nundageshhebrew;FB40
+nunhebrew;05E0
+nvsquare;33B5
+nwsquare;33BB
+nyabengali;099E
+nyadeva;091E
+nyagujarati;0A9E
+nyagurmukhi;0A1E
+o;006F
+oacute;00F3
+oangthai;0E2D
+obarred;0275
+obarredcyrillic;04E9
+obarreddieresiscyrillic;04EB
+obengali;0993
+obopomofo;311B
+obreve;014F
+ocandradeva;0911
+ocandragujarati;0A91
+ocandravowelsigndeva;0949
+ocandravowelsigngujarati;0AC9
+ocaron;01D2
+ocircle;24DE
+ocircumflex;00F4
+ocircumflexacute;1ED1
+ocircumflexdotbelow;1ED9
+ocircumflexgrave;1ED3
+ocircumflexhookabove;1ED5
+ocircumflextilde;1ED7
+ocyrillic;043E
+odblacute;0151
+odblgrave;020D
+odeva;0913
+odieresis;00F6
+odieresiscyrillic;04E7
+odotbelow;1ECD
+oe;0153
+oekorean;315A
+ogonek;02DB
+ogonekcmb;0328
+ograve;00F2
+ogujarati;0A93
+oharmenian;0585
+ohiragana;304A
+ohookabove;1ECF
+ohorn;01A1
+ohornacute;1EDB
+ohorndotbelow;1EE3
+ohorngrave;1EDD
+ohornhookabove;1EDF
+ohorntilde;1EE1
+ohungarumlaut;0151
+oi;01A3
+oinvertedbreve;020F
+okatakana;30AA
+okatakanahalfwidth;FF75
+okorean;3157
+olehebrew;05AB
+omacron;014D
+omacronacute;1E53
+omacrongrave;1E51
+omdeva;0950
+omega;03C9
+omega1;03D6
+omegacyrillic;0461
+omegalatinclosed;0277
+omegaroundcyrillic;047B
+omegatitlocyrillic;047D
+omegatonos;03CE
+omgujarati;0AD0
+omicron;03BF
+omicrontonos;03CC
+omonospace;FF4F
+one;0031
+onearabic;0661
+onebengali;09E7
+onecircle;2460
+onecircleinversesansserif;278A
+onedeva;0967
+onedotenleader;2024
+oneeighth;215B
+onefitted;F6DC
+onegujarati;0AE7
+onegurmukhi;0A67
+onehackarabic;0661
+onehalf;00BD
+onehangzhou;3021
+oneideographicparen;3220
+oneinferior;2081
+onemonospace;FF11
+onenumeratorbengali;09F4
+oneoldstyle;F731
+oneparen;2474
+oneperiod;2488
+onepersian;06F1
+onequarter;00BC
+oneroman;2170
+onesuperior;00B9
+onethai;0E51
+onethird;2153
+oogonek;01EB
+oogonekmacron;01ED
+oogurmukhi;0A13
+oomatragurmukhi;0A4B
+oopen;0254
+oparen;24AA
+openbullet;25E6
+option;2325
+ordfeminine;00AA
+ordmasculine;00BA
+orthogonal;221F
+oshortdeva;0912
+oshortvowelsigndeva;094A
+oslash;00F8
+oslashacute;01FF
+osmallhiragana;3049
+osmallkatakana;30A9
+osmallkatakanahalfwidth;FF6B
+ostrokeacute;01FF
+osuperior;F6F0
+otcyrillic;047F
+otilde;00F5
+otildeacute;1E4D
+otildedieresis;1E4F
+oubopomofo;3121
+overline;203E
+overlinecenterline;FE4A
+overlinecmb;0305
+overlinedashed;FE49
+overlinedblwavy;FE4C
+overlinewavy;FE4B
+overscore;00AF
+ovowelsignbengali;09CB
+ovowelsigndeva;094B
+ovowelsigngujarati;0ACB
+p;0070
+paampssquare;3380
+paasentosquare;332B
+pabengali;09AA
+pacute;1E55
+padeva;092A
+pagedown;21DF
+pageup;21DE
+pagujarati;0AAA
+pagurmukhi;0A2A
+pahiragana;3071
+paiyannoithai;0E2F
+pakatakana;30D1
+palatalizationcyrilliccmb;0484
+palochkacyrillic;04C0
+pansioskorean;317F
+paragraph;00B6
+parallel;2225
+parenleft;0028
+parenleftaltonearabic;FD3E
+parenleftbt;F8ED
+parenleftex;F8EC
+parenleftinferior;208D
+parenleftmonospace;FF08
+parenleftsmall;FE59
+parenleftsuperior;207D
+parenlefttp;F8EB
+parenleftvertical;FE35
+parenright;0029
+parenrightaltonearabic;FD3F
+parenrightbt;F8F8
+parenrightex;F8F7
+parenrightinferior;208E
+parenrightmonospace;FF09
+parenrightsmall;FE5A
+parenrightsuperior;207E
+parenrighttp;F8F6
+parenrightvertical;FE36
+partialdiff;2202
+paseqhebrew;05C0
+pashtahebrew;0599
+pasquare;33A9
+patah;05B7
+patah11;05B7
+patah1d;05B7
+patah2a;05B7
+patahhebrew;05B7
+patahnarrowhebrew;05B7
+patahquarterhebrew;05B7
+patahwidehebrew;05B7
+pazerhebrew;05A1
+pbopomofo;3106
+pcircle;24DF
+pdotaccent;1E57
+pe;05E4
+pecyrillic;043F
+pedagesh;FB44
+pedageshhebrew;FB44
+peezisquare;333B
+pefinaldageshhebrew;FB43
+peharabic;067E
+peharmenian;057A
+pehebrew;05E4
+pehfinalarabic;FB57
+pehinitialarabic;FB58
+pehiragana;307A
+pehmedialarabic;FB59
+pekatakana;30DA
+pemiddlehookcyrillic;04A7
+perafehebrew;FB4E
+percent;0025
+percentarabic;066A
+percentmonospace;FF05
+percentsmall;FE6A
+period;002E
+periodarmenian;0589
+periodcentered;00B7
+periodhalfwidth;FF61
+periodinferior;F6E7
+periodmonospace;FF0E
+periodsmall;FE52
+periodsuperior;F6E8
+perispomenigreekcmb;0342
+perpendicular;22A5
+perthousand;2030
+peseta;20A7
+pfsquare;338A
+phabengali;09AB
+phadeva;092B
+phagujarati;0AAB
+phagurmukhi;0A2B
+phi;03C6
+phi1;03D5
+phieuphacirclekorean;327A
+phieuphaparenkorean;321A
+phieuphcirclekorean;326C
+phieuphkorean;314D
+phieuphparenkorean;320C
+philatin;0278
+phinthuthai;0E3A
+phisymbolgreek;03D5
+phook;01A5
+phophanthai;0E1E
+phophungthai;0E1C
+phosamphaothai;0E20
+pi;03C0
+pieupacirclekorean;3273
+pieupaparenkorean;3213
+pieupcieuckorean;3176
+pieupcirclekorean;3265
+pieupkiyeokkorean;3172
+pieupkorean;3142
+pieupparenkorean;3205
+pieupsioskiyeokkorean;3174
+pieupsioskorean;3144
+pieupsiostikeutkorean;3175
+pieupthieuthkorean;3177
+pieuptikeutkorean;3173
+pihiragana;3074
+pikatakana;30D4
+pisymbolgreek;03D6
+piwrarmenian;0583
+plus;002B
+plusbelowcmb;031F
+pluscircle;2295
+plusminus;00B1
+plusmod;02D6
+plusmonospace;FF0B
+plussmall;FE62
+plussuperior;207A
+pmonospace;FF50
+pmsquare;33D8
+pohiragana;307D
+pointingindexdownwhite;261F
+pointingindexleftwhite;261C
+pointingindexrightwhite;261E
+pointingindexupwhite;261D
+pokatakana;30DD
+poplathai;0E1B
+postalmark;3012
+postalmarkface;3020
+pparen;24AB
+precedes;227A
+prescription;211E
+primemod;02B9
+primereversed;2035
+product;220F
+projective;2305
+prolongedkana;30FC
+propellor;2318
+propersubset;2282
+propersuperset;2283
+proportion;2237
+proportional;221D
+psi;03C8
+psicyrillic;0471
+psilipneumatacyrilliccmb;0486
+pssquare;33B0
+puhiragana;3077
+pukatakana;30D7
+pvsquare;33B4
+pwsquare;33BA
+q;0071
+qadeva;0958
+qadmahebrew;05A8
+qafarabic;0642
+qaffinalarabic;FED6
+qafinitialarabic;FED7
+qafmedialarabic;FED8
+qamats;05B8
+qamats10;05B8
+qamats1a;05B8
+qamats1c;05B8
+qamats27;05B8
+qamats29;05B8
+qamats33;05B8
+qamatsde;05B8
+qamatshebrew;05B8
+qamatsnarrowhebrew;05B8
+qamatsqatanhebrew;05B8
+qamatsqatannarrowhebrew;05B8
+qamatsqatanquarterhebrew;05B8
+qamatsqatanwidehebrew;05B8
+qamatsquarterhebrew;05B8
+qamatswidehebrew;05B8
+qarneyparahebrew;059F
+qbopomofo;3111
+qcircle;24E0
+qhook;02A0
+qmonospace;FF51
+qof;05E7
+qofdagesh;FB47
+qofdageshhebrew;FB47
+qofhatafpatah;05E7 05B2
+qofhatafpatahhebrew;05E7 05B2
+qofhatafsegol;05E7 05B1
+qofhatafsegolhebrew;05E7 05B1
+qofhebrew;05E7
+qofhiriq;05E7 05B4
+qofhiriqhebrew;05E7 05B4
+qofholam;05E7 05B9
+qofholamhebrew;05E7 05B9
+qofpatah;05E7 05B7
+qofpatahhebrew;05E7 05B7
+qofqamats;05E7 05B8
+qofqamatshebrew;05E7 05B8
+qofqubuts;05E7 05BB
+qofqubutshebrew;05E7 05BB
+qofsegol;05E7 05B6
+qofsegolhebrew;05E7 05B6
+qofsheva;05E7 05B0
+qofshevahebrew;05E7 05B0
+qoftsere;05E7 05B5
+qoftserehebrew;05E7 05B5
+qparen;24AC
+quarternote;2669
+qubuts;05BB
+qubuts18;05BB
+qubuts25;05BB
+qubuts31;05BB
+qubutshebrew;05BB
+qubutsnarrowhebrew;05BB
+qubutsquarterhebrew;05BB
+qubutswidehebrew;05BB
+question;003F
+questionarabic;061F
+questionarmenian;055E
+questiondown;00BF
+questiondownsmall;F7BF
+questiongreek;037E
+questionmonospace;FF1F
+questionsmall;F73F
+quotedbl;0022
+quotedblbase;201E
+quotedblleft;201C
+quotedblmonospace;FF02
+quotedblprime;301E
+quotedblprimereversed;301D
+quotedblright;201D
+quoteleft;2018
+quoteleftreversed;201B
+quotereversed;201B
+quoteright;2019
+quoterightn;0149
+quotesinglbase;201A
+quotesingle;0027
+quotesinglemonospace;FF07
+r;0072
+raarmenian;057C
+rabengali;09B0
+racute;0155
+radeva;0930
+radical;221A
+radicalex;F8E5
+radoverssquare;33AE
+radoverssquaredsquare;33AF
+radsquare;33AD
+rafe;05BF
+rafehebrew;05BF
+ragujarati;0AB0
+ragurmukhi;0A30
+rahiragana;3089
+rakatakana;30E9
+rakatakanahalfwidth;FF97
+ralowerdiagonalbengali;09F1
+ramiddlediagonalbengali;09F0
+ramshorn;0264
+ratio;2236
+rbopomofo;3116
+rcaron;0159
+rcedilla;0157
+rcircle;24E1
+rcommaaccent;0157
+rdblgrave;0211
+rdotaccent;1E59
+rdotbelow;1E5B
+rdotbelowmacron;1E5D
+referencemark;203B
+reflexsubset;2286
+reflexsuperset;2287
+registered;00AE
+registersans;F8E8
+registerserif;F6DA
+reharabic;0631
+reharmenian;0580
+rehfinalarabic;FEAE
+rehiragana;308C
+rehyehaleflamarabic;0631 FEF3 FE8E 0644
+rekatakana;30EC
+rekatakanahalfwidth;FF9A
+resh;05E8
+reshdageshhebrew;FB48
+reshhatafpatah;05E8 05B2
+reshhatafpatahhebrew;05E8 05B2
+reshhatafsegol;05E8 05B1
+reshhatafsegolhebrew;05E8 05B1
+reshhebrew;05E8
+reshhiriq;05E8 05B4
+reshhiriqhebrew;05E8 05B4
+reshholam;05E8 05B9
+reshholamhebrew;05E8 05B9
+reshpatah;05E8 05B7
+reshpatahhebrew;05E8 05B7
+reshqamats;05E8 05B8
+reshqamatshebrew;05E8 05B8
+reshqubuts;05E8 05BB
+reshqubutshebrew;05E8 05BB
+reshsegol;05E8 05B6
+reshsegolhebrew;05E8 05B6
+reshsheva;05E8 05B0
+reshshevahebrew;05E8 05B0
+reshtsere;05E8 05B5
+reshtserehebrew;05E8 05B5
+reversedtilde;223D
+reviahebrew;0597
+reviamugrashhebrew;0597
+revlogicalnot;2310
+rfishhook;027E
+rfishhookreversed;027F
+rhabengali;09DD
+rhadeva;095D
+rho;03C1
+rhook;027D
+rhookturned;027B
+rhookturnedsuperior;02B5
+rhosymbolgreek;03F1
+rhotichookmod;02DE
+rieulacirclekorean;3271
+rieulaparenkorean;3211
+rieulcirclekorean;3263
+rieulhieuhkorean;3140
+rieulkiyeokkorean;313A
+rieulkiyeoksioskorean;3169
+rieulkorean;3139
+rieulmieumkorean;313B
+rieulpansioskorean;316C
+rieulparenkorean;3203
+rieulphieuphkorean;313F
+rieulpieupkorean;313C
+rieulpieupsioskorean;316B
+rieulsioskorean;313D
+rieulthieuthkorean;313E
+rieultikeutkorean;316A
+rieulyeorinhieuhkorean;316D
+rightangle;221F
+righttackbelowcmb;0319
+righttriangle;22BF
+rihiragana;308A
+rikatakana;30EA
+rikatakanahalfwidth;FF98
+ring;02DA
+ringbelowcmb;0325
+ringcmb;030A
+ringhalfleft;02BF
+ringhalfleftarmenian;0559
+ringhalfleftbelowcmb;031C
+ringhalfleftcentered;02D3
+ringhalfright;02BE
+ringhalfrightbelowcmb;0339
+ringhalfrightcentered;02D2
+rinvertedbreve;0213
+rittorusquare;3351
+rlinebelow;1E5F
+rlongleg;027C
+rlonglegturned;027A
+rmonospace;FF52
+rohiragana;308D
+rokatakana;30ED
+rokatakanahalfwidth;FF9B
+roruathai;0E23
+rparen;24AD
+rrabengali;09DC
+rradeva;0931
+rragurmukhi;0A5C
+rreharabic;0691
+rrehfinalarabic;FB8D
+rrvocalicbengali;09E0
+rrvocalicdeva;0960
+rrvocalicgujarati;0AE0
+rrvocalicvowelsignbengali;09C4
+rrvocalicvowelsigndeva;0944
+rrvocalicvowelsigngujarati;0AC4
+rsuperior;F6F1
+rtblock;2590
+rturned;0279
+rturnedsuperior;02B4
+ruhiragana;308B
+rukatakana;30EB
+rukatakanahalfwidth;FF99
+rupeemarkbengali;09F2
+rupeesignbengali;09F3
+rupiah;F6DD
+ruthai;0E24
+rvocalicbengali;098B
+rvocalicdeva;090B
+rvocalicgujarati;0A8B
+rvocalicvowelsignbengali;09C3
+rvocalicvowelsigndeva;0943
+rvocalicvowelsigngujarati;0AC3
+s;0073
+sabengali;09B8
+sacute;015B
+sacutedotaccent;1E65
+sadarabic;0635
+sadeva;0938
+sadfinalarabic;FEBA
+sadinitialarabic;FEBB
+sadmedialarabic;FEBC
+sagujarati;0AB8
+sagurmukhi;0A38
+sahiragana;3055
+sakatakana;30B5
+sakatakanahalfwidth;FF7B
+sallallahoualayhewasallamarabic;FDFA
+samekh;05E1
+samekhdagesh;FB41
+samekhdageshhebrew;FB41
+samekhhebrew;05E1
+saraaathai;0E32
+saraaethai;0E41
+saraaimaimalaithai;0E44
+saraaimaimuanthai;0E43
+saraamthai;0E33
+saraathai;0E30
+saraethai;0E40
+saraiileftthai;F886
+saraiithai;0E35
+saraileftthai;F885
+saraithai;0E34
+saraothai;0E42
+saraueeleftthai;F888
+saraueethai;0E37
+saraueleftthai;F887
+sarauethai;0E36
+sarauthai;0E38
+sarauuthai;0E39
+sbopomofo;3119
+scaron;0161
+scarondotaccent;1E67
+scedilla;015F
+schwa;0259
+schwacyrillic;04D9
+schwadieresiscyrillic;04DB
+schwahook;025A
+scircle;24E2
+scircumflex;015D
+scommaaccent;0219
+sdotaccent;1E61
+sdotbelow;1E63
+sdotbelowdotaccent;1E69
+seagullbelowcmb;033C
+second;2033
+secondtonechinese;02CA
+section;00A7
+seenarabic;0633
+seenfinalarabic;FEB2
+seeninitialarabic;FEB3
+seenmedialarabic;FEB4
+segol;05B6
+segol13;05B6
+segol1f;05B6
+segol2c;05B6
+segolhebrew;05B6
+segolnarrowhebrew;05B6
+segolquarterhebrew;05B6
+segoltahebrew;0592
+segolwidehebrew;05B6
+seharmenian;057D
+sehiragana;305B
+sekatakana;30BB
+sekatakanahalfwidth;FF7E
+semicolon;003B
+semicolonarabic;061B
+semicolonmonospace;FF1B
+semicolonsmall;FE54
+semivoicedmarkkana;309C
+semivoicedmarkkanahalfwidth;FF9F
+sentisquare;3322
+sentosquare;3323
+seven;0037
+sevenarabic;0667
+sevenbengali;09ED
+sevencircle;2466
+sevencircleinversesansserif;2790
+sevendeva;096D
+seveneighths;215E
+sevengujarati;0AED
+sevengurmukhi;0A6D
+sevenhackarabic;0667
+sevenhangzhou;3027
+sevenideographicparen;3226
+seveninferior;2087
+sevenmonospace;FF17
+sevenoldstyle;F737
+sevenparen;247A
+sevenperiod;248E
+sevenpersian;06F7
+sevenroman;2176
+sevensuperior;2077
+seventeencircle;2470
+seventeenparen;2484
+seventeenperiod;2498
+seventhai;0E57
+sfthyphen;00AD
+shaarmenian;0577
+shabengali;09B6
+shacyrillic;0448
+shaddaarabic;0651
+shaddadammaarabic;FC61
+shaddadammatanarabic;FC5E
+shaddafathaarabic;FC60
+shaddafathatanarabic;0651 064B
+shaddakasraarabic;FC62
+shaddakasratanarabic;FC5F
+shade;2592
+shadedark;2593
+shadelight;2591
+shademedium;2592
+shadeva;0936
+shagujarati;0AB6
+shagurmukhi;0A36
+shalshelethebrew;0593
+shbopomofo;3115
+shchacyrillic;0449
+sheenarabic;0634
+sheenfinalarabic;FEB6
+sheeninitialarabic;FEB7
+sheenmedialarabic;FEB8
+sheicoptic;03E3
+sheqel;20AA
+sheqelhebrew;20AA
+sheva;05B0
+sheva115;05B0
+sheva15;05B0
+sheva22;05B0
+sheva2e;05B0
+shevahebrew;05B0
+shevanarrowhebrew;05B0
+shevaquarterhebrew;05B0
+shevawidehebrew;05B0
+shhacyrillic;04BB
+shimacoptic;03ED
+shin;05E9
+shindagesh;FB49
+shindageshhebrew;FB49
+shindageshshindot;FB2C
+shindageshshindothebrew;FB2C
+shindageshsindot;FB2D
+shindageshsindothebrew;FB2D
+shindothebrew;05C1
+shinhebrew;05E9
+shinshindot;FB2A
+shinshindothebrew;FB2A
+shinsindot;FB2B
+shinsindothebrew;FB2B
+shook;0282
+sigma;03C3
+sigma1;03C2
+sigmafinal;03C2
+sigmalunatesymbolgreek;03F2
+sihiragana;3057
+sikatakana;30B7
+sikatakanahalfwidth;FF7C
+siluqhebrew;05BD
+siluqlefthebrew;05BD
+similar;223C
+sindothebrew;05C2
+siosacirclekorean;3274
+siosaparenkorean;3214
+sioscieuckorean;317E
+sioscirclekorean;3266
+sioskiyeokkorean;317A
+sioskorean;3145
+siosnieunkorean;317B
+siosparenkorean;3206
+siospieupkorean;317D
+siostikeutkorean;317C
+six;0036
+sixarabic;0666
+sixbengali;09EC
+sixcircle;2465
+sixcircleinversesansserif;278F
+sixdeva;096C
+sixgujarati;0AEC
+sixgurmukhi;0A6C
+sixhackarabic;0666
+sixhangzhou;3026
+sixideographicparen;3225
+sixinferior;2086
+sixmonospace;FF16
+sixoldstyle;F736
+sixparen;2479
+sixperiod;248D
+sixpersian;06F6
+sixroman;2175
+sixsuperior;2076
+sixteencircle;246F
+sixteencurrencydenominatorbengali;09F9
+sixteenparen;2483
+sixteenperiod;2497
+sixthai;0E56
+slash;002F
+slashmonospace;FF0F
+slong;017F
+slongdotaccent;1E9B
+smileface;263A
+smonospace;FF53
+sofpasuqhebrew;05C3
+softhyphen;00AD
+softsigncyrillic;044C
+sohiragana;305D
+sokatakana;30BD
+sokatakanahalfwidth;FF7F
+soliduslongoverlaycmb;0338
+solidusshortoverlaycmb;0337
+sorusithai;0E29
+sosalathai;0E28
+sosothai;0E0B
+sosuathai;0E2A
+space;0020
+spacehackarabic;0020
+spade;2660
+spadesuitblack;2660
+spadesuitwhite;2664
+sparen;24AE
+squarebelowcmb;033B
+squarecc;33C4
+squarecm;339D
+squarediagonalcrosshatchfill;25A9
+squarehorizontalfill;25A4
+squarekg;338F
+squarekm;339E
+squarekmcapital;33CE
+squareln;33D1
+squarelog;33D2
+squaremg;338E
+squaremil;33D5
+squaremm;339C
+squaremsquared;33A1
+squareorthogonalcrosshatchfill;25A6
+squareupperlefttolowerrightfill;25A7
+squareupperrighttolowerleftfill;25A8
+squareverticalfill;25A5
+squarewhitewithsmallblack;25A3
+srsquare;33DB
+ssabengali;09B7
+ssadeva;0937
+ssagujarati;0AB7
+ssangcieuckorean;3149
+ssanghieuhkorean;3185
+ssangieungkorean;3180
+ssangkiyeokkorean;3132
+ssangnieunkorean;3165
+ssangpieupkorean;3143
+ssangsioskorean;3146
+ssangtikeutkorean;3138
+ssuperior;F6F2
+sterling;00A3
+sterlingmonospace;FFE1
+strokelongoverlaycmb;0336
+strokeshortoverlaycmb;0335
+subset;2282
+subsetnotequal;228A
+subsetorequal;2286
+succeeds;227B
+suchthat;220B
+suhiragana;3059
+sukatakana;30B9
+sukatakanahalfwidth;FF7D
+sukunarabic;0652
+summation;2211
+sun;263C
+superset;2283
+supersetnotequal;228B
+supersetorequal;2287
+svsquare;33DC
+syouwaerasquare;337C
+t;0074
+tabengali;09A4
+tackdown;22A4
+tackleft;22A3
+tadeva;0924
+tagujarati;0AA4
+tagurmukhi;0A24
+taharabic;0637
+tahfinalarabic;FEC2
+tahinitialarabic;FEC3
+tahiragana;305F
+tahmedialarabic;FEC4
+taisyouerasquare;337D
+takatakana;30BF
+takatakanahalfwidth;FF80
+tatweelarabic;0640
+tau;03C4
+tav;05EA
+tavdages;FB4A
+tavdagesh;FB4A
+tavdageshhebrew;FB4A
+tavhebrew;05EA
+tbar;0167
+tbopomofo;310A
+tcaron;0165
+tccurl;02A8
+tcedilla;0163
+tcheharabic;0686
+tchehfinalarabic;FB7B
+tchehinitialarabic;FB7C
+tchehmedialarabic;FB7D
+tchehmeeminitialarabic;FB7C FEE4
+tcircle;24E3
+tcircumflexbelow;1E71
+tcommaaccent;0163
+tdieresis;1E97
+tdotaccent;1E6B
+tdotbelow;1E6D
+tecyrillic;0442
+tedescendercyrillic;04AD
+teharabic;062A
+tehfinalarabic;FE96
+tehhahinitialarabic;FCA2
+tehhahisolatedarabic;FC0C
+tehinitialarabic;FE97
+tehiragana;3066
+tehjeeminitialarabic;FCA1
+tehjeemisolatedarabic;FC0B
+tehmarbutaarabic;0629
+tehmarbutafinalarabic;FE94
+tehmedialarabic;FE98
+tehmeeminitialarabic;FCA4
+tehmeemisolatedarabic;FC0E
+tehnoonfinalarabic;FC73
+tekatakana;30C6
+tekatakanahalfwidth;FF83
+telephone;2121
+telephoneblack;260E
+telishagedolahebrew;05A0
+telishaqetanahebrew;05A9
+tencircle;2469
+tenideographicparen;3229
+tenparen;247D
+tenperiod;2491
+tenroman;2179
+tesh;02A7
+tet;05D8
+tetdagesh;FB38
+tetdageshhebrew;FB38
+tethebrew;05D8
+tetsecyrillic;04B5
+tevirhebrew;059B
+tevirlefthebrew;059B
+thabengali;09A5
+thadeva;0925
+thagujarati;0AA5
+thagurmukhi;0A25
+thalarabic;0630
+thalfinalarabic;FEAC
+thanthakhatlowleftthai;F898
+thanthakhatlowrightthai;F897
+thanthakhatthai;0E4C
+thanthakhatupperleftthai;F896
+theharabic;062B
+thehfinalarabic;FE9A
+thehinitialarabic;FE9B
+thehmedialarabic;FE9C
+thereexists;2203
+therefore;2234
+theta;03B8
+theta1;03D1
+thetasymbolgreek;03D1
+thieuthacirclekorean;3279
+thieuthaparenkorean;3219
+thieuthcirclekorean;326B
+thieuthkorean;314C
+thieuthparenkorean;320B
+thirteencircle;246C
+thirteenparen;2480
+thirteenperiod;2494
+thonangmonthothai;0E11
+thook;01AD
+thophuthaothai;0E12
+thorn;00FE
+thothahanthai;0E17
+thothanthai;0E10
+thothongthai;0E18
+thothungthai;0E16
+thousandcyrillic;0482
+thousandsseparatorarabic;066C
+thousandsseparatorpersian;066C
+three;0033
+threearabic;0663
+threebengali;09E9
+threecircle;2462
+threecircleinversesansserif;278C
+threedeva;0969
+threeeighths;215C
+threegujarati;0AE9
+threegurmukhi;0A69
+threehackarabic;0663
+threehangzhou;3023
+threeideographicparen;3222
+threeinferior;2083
+threemonospace;FF13
+threenumeratorbengali;09F6
+threeoldstyle;F733
+threeparen;2476
+threeperiod;248A
+threepersian;06F3
+threequarters;00BE
+threequartersemdash;F6DE
+threeroman;2172
+threesuperior;00B3
+threethai;0E53
+thzsquare;3394
+tihiragana;3061
+tikatakana;30C1
+tikatakanahalfwidth;FF81
+tikeutacirclekorean;3270
+tikeutaparenkorean;3210
+tikeutcirclekorean;3262
+tikeutkorean;3137
+tikeutparenkorean;3202
+tilde;02DC
+tildebelowcmb;0330
+tildecmb;0303
+tildecomb;0303
+tildedoublecmb;0360
+tildeoperator;223C
+tildeoverlaycmb;0334
+tildeverticalcmb;033E
+timescircle;2297
+tipehahebrew;0596
+tipehalefthebrew;0596
+tippigurmukhi;0A70
+titlocyrilliccmb;0483
+tiwnarmenian;057F
+tlinebelow;1E6F
+tmonospace;FF54
+toarmenian;0569
+tohiragana;3068
+tokatakana;30C8
+tokatakanahalfwidth;FF84
+tonebarextrahighmod;02E5
+tonebarextralowmod;02E9
+tonebarhighmod;02E6
+tonebarlowmod;02E8
+tonebarmidmod;02E7
+tonefive;01BD
+tonesix;0185
+tonetwo;01A8
+tonos;0384
+tonsquare;3327
+topatakthai;0E0F
+tortoiseshellbracketleft;3014
+tortoiseshellbracketleftsmall;FE5D
+tortoiseshellbracketleftvertical;FE39
+tortoiseshellbracketright;3015
+tortoiseshellbracketrightsmall;FE5E
+tortoiseshellbracketrightvertical;FE3A
+totaothai;0E15
+tpalatalhook;01AB
+tparen;24AF
+trademark;2122
+trademarksans;F8EA
+trademarkserif;F6DB
+tretroflexhook;0288
+triagdn;25BC
+triaglf;25C4
+triagrt;25BA
+triagup;25B2
+ts;02A6
+tsadi;05E6
+tsadidagesh;FB46
+tsadidageshhebrew;FB46
+tsadihebrew;05E6
+tsecyrillic;0446
+tsere;05B5
+tsere12;05B5
+tsere1e;05B5
+tsere2b;05B5
+tserehebrew;05B5
+tserenarrowhebrew;05B5
+tserequarterhebrew;05B5
+tserewidehebrew;05B5
+tshecyrillic;045B
+tsuperior;F6F3
+ttabengali;099F
+ttadeva;091F
+ttagujarati;0A9F
+ttagurmukhi;0A1F
+tteharabic;0679
+ttehfinalarabic;FB67
+ttehinitialarabic;FB68
+ttehmedialarabic;FB69
+tthabengali;09A0
+tthadeva;0920
+tthagujarati;0AA0
+tthagurmukhi;0A20
+tturned;0287
+tuhiragana;3064
+tukatakana;30C4
+tukatakanahalfwidth;FF82
+tusmallhiragana;3063
+tusmallkatakana;30C3
+tusmallkatakanahalfwidth;FF6F
+twelvecircle;246B
+twelveparen;247F
+twelveperiod;2493
+twelveroman;217B
+twentycircle;2473
+twentyhangzhou;5344
+twentyparen;2487
+twentyperiod;249B
+two;0032
+twoarabic;0662
+twobengali;09E8
+twocircle;2461
+twocircleinversesansserif;278B
+twodeva;0968
+twodotenleader;2025
+twodotleader;2025
+twodotleadervertical;FE30
+twogujarati;0AE8
+twogurmukhi;0A68
+twohackarabic;0662
+twohangzhou;3022
+twoideographicparen;3221
+twoinferior;2082
+twomonospace;FF12
+twonumeratorbengali;09F5
+twooldstyle;F732
+twoparen;2475
+twoperiod;2489
+twopersian;06F2
+tworoman;2171
+twostroke;01BB
+twosuperior;00B2
+twothai;0E52
+twothirds;2154
+u;0075
+uacute;00FA
+ubar;0289
+ubengali;0989
+ubopomofo;3128
+ubreve;016D
+ucaron;01D4
+ucircle;24E4
+ucircumflex;00FB
+ucircumflexbelow;1E77
+ucyrillic;0443
+udattadeva;0951
+udblacute;0171
+udblgrave;0215
+udeva;0909
+udieresis;00FC
+udieresisacute;01D8
+udieresisbelow;1E73
+udieresiscaron;01DA
+udieresiscyrillic;04F1
+udieresisgrave;01DC
+udieresismacron;01D6
+udotbelow;1EE5
+ugrave;00F9
+ugujarati;0A89
+ugurmukhi;0A09
+uhiragana;3046
+uhookabove;1EE7
+uhorn;01B0
+uhornacute;1EE9
+uhorndotbelow;1EF1
+uhorngrave;1EEB
+uhornhookabove;1EED
+uhorntilde;1EEF
+uhungarumlaut;0171
+uhungarumlautcyrillic;04F3
+uinvertedbreve;0217
+ukatakana;30A6
+ukatakanahalfwidth;FF73
+ukcyrillic;0479
+ukorean;315C
+umacron;016B
+umacroncyrillic;04EF
+umacrondieresis;1E7B
+umatragurmukhi;0A41
+umonospace;FF55
+underscore;005F
+underscoredbl;2017
+underscoremonospace;FF3F
+underscorevertical;FE33
+underscorewavy;FE4F
+union;222A
+universal;2200
+uogonek;0173
+uparen;24B0
+upblock;2580
+upperdothebrew;05C4
+upsilon;03C5
+upsilondieresis;03CB
+upsilondieresistonos;03B0
+upsilonlatin;028A
+upsilontonos;03CD
+uptackbelowcmb;031D
+uptackmod;02D4
+uragurmukhi;0A73
+uring;016F
+ushortcyrillic;045E
+usmallhiragana;3045
+usmallkatakana;30A5
+usmallkatakanahalfwidth;FF69
+ustraightcyrillic;04AF
+ustraightstrokecyrillic;04B1
+utilde;0169
+utildeacute;1E79
+utildebelow;1E75
+uubengali;098A
+uudeva;090A
+uugujarati;0A8A
+uugurmukhi;0A0A
+uumatragurmukhi;0A42
+uuvowelsignbengali;09C2
+uuvowelsigndeva;0942
+uuvowelsigngujarati;0AC2
+uvowelsignbengali;09C1
+uvowelsigndeva;0941
+uvowelsigngujarati;0AC1
+v;0076
+vadeva;0935
+vagujarati;0AB5
+vagurmukhi;0A35
+vakatakana;30F7
+vav;05D5
+vavdagesh;FB35
+vavdagesh65;FB35
+vavdageshhebrew;FB35
+vavhebrew;05D5
+vavholam;FB4B
+vavholamhebrew;FB4B
+vavvavhebrew;05F0
+vavyodhebrew;05F1
+vcircle;24E5
+vdotbelow;1E7F
+vecyrillic;0432
+veharabic;06A4
+vehfinalarabic;FB6B
+vehinitialarabic;FB6C
+vehmedialarabic;FB6D
+vekatakana;30F9
+venus;2640
+verticalbar;007C
+verticallineabovecmb;030D
+verticallinebelowcmb;0329
+verticallinelowmod;02CC
+verticallinemod;02C8
+vewarmenian;057E
+vhook;028B
+vikatakana;30F8
+viramabengali;09CD
+viramadeva;094D
+viramagujarati;0ACD
+visargabengali;0983
+visargadeva;0903
+visargagujarati;0A83
+vmonospace;FF56
+voarmenian;0578
+voicediterationhiragana;309E
+voicediterationkatakana;30FE
+voicedmarkkana;309B
+voicedmarkkanahalfwidth;FF9E
+vokatakana;30FA
+vparen;24B1
+vtilde;1E7D
+vturned;028C
+vuhiragana;3094
+vukatakana;30F4
+w;0077
+wacute;1E83
+waekorean;3159
+wahiragana;308F
+wakatakana;30EF
+wakatakanahalfwidth;FF9C
+wakorean;3158
+wasmallhiragana;308E
+wasmallkatakana;30EE
+wattosquare;3357
+wavedash;301C
+wavyunderscorevertical;FE34
+wawarabic;0648
+wawfinalarabic;FEEE
+wawhamzaabovearabic;0624
+wawhamzaabovefinalarabic;FE86
+wbsquare;33DD
+wcircle;24E6
+wcircumflex;0175
+wdieresis;1E85
+wdotaccent;1E87
+wdotbelow;1E89
+wehiragana;3091
+weierstrass;2118
+wekatakana;30F1
+wekorean;315E
+weokorean;315D
+wgrave;1E81
+whitebullet;25E6
+whitecircle;25CB
+whitecircleinverse;25D9
+whitecornerbracketleft;300E
+whitecornerbracketleftvertical;FE43
+whitecornerbracketright;300F
+whitecornerbracketrightvertical;FE44
+whitediamond;25C7
+whitediamondcontainingblacksmalldiamond;25C8
+whitedownpointingsmalltriangle;25BF
+whitedownpointingtriangle;25BD
+whiteleftpointingsmalltriangle;25C3
+whiteleftpointingtriangle;25C1
+whitelenticularbracketleft;3016
+whitelenticularbracketright;3017
+whiterightpointingsmalltriangle;25B9
+whiterightpointingtriangle;25B7
+whitesmallsquare;25AB
+whitesmilingface;263A
+whitesquare;25A1
+whitestar;2606
+whitetelephone;260F
+whitetortoiseshellbracketleft;3018
+whitetortoiseshellbracketright;3019
+whiteuppointingsmalltriangle;25B5
+whiteuppointingtriangle;25B3
+wihiragana;3090
+wikatakana;30F0
+wikorean;315F
+wmonospace;FF57
+wohiragana;3092
+wokatakana;30F2
+wokatakanahalfwidth;FF66
+won;20A9
+wonmonospace;FFE6
+wowaenthai;0E27
+wparen;24B2
+wring;1E98
+wsuperior;02B7
+wturned;028D
+wynn;01BF
+x;0078
+xabovecmb;033D
+xbopomofo;3112
+xcircle;24E7
+xdieresis;1E8D
+xdotaccent;1E8B
+xeharmenian;056D
+xi;03BE
+xmonospace;FF58
+xparen;24B3
+xsuperior;02E3
+y;0079
+yaadosquare;334E
+yabengali;09AF
+yacute;00FD
+yadeva;092F
+yaekorean;3152
+yagujarati;0AAF
+yagurmukhi;0A2F
+yahiragana;3084
+yakatakana;30E4
+yakatakanahalfwidth;FF94
+yakorean;3151
+yamakkanthai;0E4E
+yasmallhiragana;3083
+yasmallkatakana;30E3
+yasmallkatakanahalfwidth;FF6C
+yatcyrillic;0463
+ycircle;24E8
+ycircumflex;0177
+ydieresis;00FF
+ydotaccent;1E8F
+ydotbelow;1EF5
+yeharabic;064A
+yehbarreearabic;06D2
+yehbarreefinalarabic;FBAF
+yehfinalarabic;FEF2
+yehhamzaabovearabic;0626
+yehhamzaabovefinalarabic;FE8A
+yehhamzaaboveinitialarabic;FE8B
+yehhamzaabovemedialarabic;FE8C
+yehinitialarabic;FEF3
+yehmedialarabic;FEF4
+yehmeeminitialarabic;FCDD
+yehmeemisolatedarabic;FC58
+yehnoonfinalarabic;FC94
+yehthreedotsbelowarabic;06D1
+yekorean;3156
+yen;00A5
+yenmonospace;FFE5
+yeokorean;3155
+yeorinhieuhkorean;3186
+yerahbenyomohebrew;05AA
+yerahbenyomolefthebrew;05AA
+yericyrillic;044B
+yerudieresiscyrillic;04F9
+yesieungkorean;3181
+yesieungpansioskorean;3183
+yesieungsioskorean;3182
+yetivhebrew;059A
+ygrave;1EF3
+yhook;01B4
+yhookabove;1EF7
+yiarmenian;0575
+yicyrillic;0457
+yikorean;3162
+yinyang;262F
+yiwnarmenian;0582
+ymonospace;FF59
+yod;05D9
+yoddagesh;FB39
+yoddageshhebrew;FB39
+yodhebrew;05D9
+yodyodhebrew;05F2
+yodyodpatahhebrew;FB1F
+yohiragana;3088
+yoikorean;3189
+yokatakana;30E8
+yokatakanahalfwidth;FF96
+yokorean;315B
+yosmallhiragana;3087
+yosmallkatakana;30E7
+yosmallkatakanahalfwidth;FF6E
+yotgreek;03F3
+yoyaekorean;3188
+yoyakorean;3187
+yoyakthai;0E22
+yoyingthai;0E0D
+yparen;24B4
+ypogegrammeni;037A
+ypogegrammenigreekcmb;0345
+yr;01A6
+yring;1E99
+ysuperior;02B8
+ytilde;1EF9
+yturned;028E
+yuhiragana;3086
+yuikorean;318C
+yukatakana;30E6
+yukatakanahalfwidth;FF95
+yukorean;3160
+yusbigcyrillic;046B
+yusbigiotifiedcyrillic;046D
+yuslittlecyrillic;0467
+yuslittleiotifiedcyrillic;0469
+yusmallhiragana;3085
+yusmallkatakana;30E5
+yusmallkatakanahalfwidth;FF6D
+yuyekorean;318B
+yuyeokorean;318A
+yyabengali;09DF
+yyadeva;095F
+z;007A
+zaarmenian;0566
+zacute;017A
+zadeva;095B
+zagurmukhi;0A5B
+zaharabic;0638
+zahfinalarabic;FEC6
+zahinitialarabic;FEC7
+zahiragana;3056
+zahmedialarabic;FEC8
+zainarabic;0632
+zainfinalarabic;FEB0
+zakatakana;30B6
+zaqefgadolhebrew;0595
+zaqefqatanhebrew;0594
+zarqahebrew;0598
+zayin;05D6
+zayindagesh;FB36
+zayindageshhebrew;FB36
+zayinhebrew;05D6
+zbopomofo;3117
+zcaron;017E
+zcircle;24E9
+zcircumflex;1E91
+zcurl;0291
+zdot;017C
+zdotaccent;017C
+zdotbelow;1E93
+zecyrillic;0437
+zedescendercyrillic;0499
+zedieresiscyrillic;04DF
+zehiragana;305C
+zekatakana;30BC
+zero;0030
+zeroarabic;0660
+zerobengali;09E6
+zerodeva;0966
+zerogujarati;0AE6
+zerogurmukhi;0A66
+zerohackarabic;0660
+zeroinferior;2080
+zeromonospace;FF10
+zerooldstyle;F730
+zeropersian;06F0
+zerosuperior;2070
+zerothai;0E50
+zerowidthjoiner;FEFF
+zerowidthnonjoiner;200C
+zerowidthspace;200B
+zeta;03B6
+zhbopomofo;3113
+zhearmenian;056A
+zhebrevecyrillic;04C2
+zhecyrillic;0436
+zhedescendercyrillic;0497
+zhedieresiscyrillic;04DD
+zihiragana;3058
+zikatakana;30B8
+zinorhebrew;05AE
+zlinebelow;1E95
+zmonospace;FF5A
+zohiragana;305E
+zokatakana;30BE
+zparen;24B5
+zretroflexhook;0290
+zstroke;01B6
+zuhiragana;305A
+zukatakana;30BA
+#--end
+###############################################################################
+# TeX extensions
+Delta;2206;0394
+Ifractur;2111
+# FFsmall, FFIsmall, FFLsmall, FIsmall, FLsmall: invalid Unicode
+FFsmall;D804
+FFIsmall;D807
+FFLsmall;D808
+FIsmall;D805
+FLsmall;D806
+# Germandbls: invalid Unicode, used for secondary replacement from EC.enc
+Germandbls;D800
+# Germandblssmall: invalid Unicode
+Germandblssmall;D803
+Ng;014A
+Omega;2126;03A9
+Rfractur;211C
+# SS: invalid Unicode, used for secondary replacement from EC.enc
+SS;D800
+# SSsmall: invalid Unicode
+SSsmall;D803
+# altselector: invalid Unicode
+altselector;D802
+angbracketleft;27E8;2329
+angbracketright;27E9;232A
+arrowbothv;2195
+arrowdblbothv;21D5
+arrowleftbothalf;21BD
+arrowlefttophalf;21BC
+arrownortheast;2197
+arrownorthwest;2196
+arrowrightbothalf;21C1
+arrowrighttophalf;21C0
+arrowsoutheast;2198
+arrowsouthwest;2199
+# ascendercompwordmark: taller cwm, invalid Unicode
+ascendercompwordmark;D80A
+asteriskcentered;2217
+bardbl;2225
+# capitalcompwordmark: taller cwm, invalid Unicode
+capitalcompwordmark;D809
+ceilingleft;2308
+ceilingright;2309
+circlecopyrt;20DD;25CB
+circledivide;2298
+circledot;2299
+circleminus;2296
+coproduct;2A3F
+# cwm: Unicode for ZWNJ, used for secondary replacement from EC.enc
+cwm;200C
+dblbracketleft;27E6
+dblbracketright;27E7
+diamond;2662;2666
+diamondmath;22C4
+# 0237 is the proposed allocation for dotless j as of Unicode 4.0
+dotlessj;0237;F6BE
+emptyset;2205;F638
+# emptyslot: invalid Unicode; the user explicitly wants this slot empty
+emptyslot;D801
+epsilon1;03F5
+equivasymptotic;224D
+flat;266D
+floorleft;230A
+floorright;230B
+follows;227B
+followsequal;227D
+greatermuch;226B
+heart;2661;2665
+interrobang;203D
+# interrobangdown: inverted interrobang, invalid Unicode
+interrobangdown;D80B
+intersectionsq;2293
+latticetop;22A4
+lessmuch;226A
+lscript;2113
+natural;266E
+negationslash;0338
+ng;014B
+owner;220B
+pertenthousand;2031
+# TeX encodings such as 'texmital.enc' disagree with Unicode and the Adobe
+# glyph list; in TeX, the "straight" form of phi takes the name "phi",
+# whereas the more-common "loopy" form of phi, \varphi, takes the name "phi1".
+phi;03D5;03C6
+phi1;03C6
+pi1;03D6
+precedesequal;227C
+prime;2032;02B9
+rho1;03F1
+sharp;266F
+similarequal;2243
+slurabove;2322
+slurbelow;2323
+star;22C6
+subsetsqequal;2291
+supersetsqequal;2292
+triangle;25B3
+triangleinv;25BD
+triangleleft;25B9
+triangleright;25C3
+turnstileleft;22A2
+turnstileright;22A3
+# twelveudash: 2/3-em dash; invalid Unicode
+twelveudash;D80C
+unionmulti;228E
+unionsq;2294
+vector;20D7
+# visualspace: Unicode for OPEN BOX, used for secondary replacement from EC.enc
+visualspace;2423
+wreathproduct;2240
+# -- Marco Kuhlmann reported annoying glyph neologisms in fontinst encodings
+# Dbar = Dcroat
+Dbar;0110
+# compwordmark = cwm
+compwordmark;200C
+# dbar = dcroat
+dbar;0111
+# rangedash = endash
+rangedash;2013
+# hyphenchar = hyphen
+hyphenchar;002D
+# punctdash = emdash
+punctdash;2014
+# visiblespace = visualspace
+visiblespace;2423
+# -- end TeX extensions
diff --git a/Build/source/utils/lcdf-typetools/include/efont/afm.hh b/Build/source/utils/lcdf-typetools/include/efont/afm.hh
new file mode 100644
index 00000000000..465ff87dd54
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/afm.hh
@@ -0,0 +1,59 @@
+// -*- related-file-name: "../../libefont/afm.cc" -*-
+#ifndef EFONT_AFM_HH
+#define EFONT_AFM_HH
+#include <efont/metrics.hh>
+class Slurper;
+class Filename;
+class ErrorHandler;
+namespace Efont {
+class AfmParser;
+
+struct AfmMetricsXt: public MetricsXt {
+
+ Vector<PermString> opening_comments;
+ PermString notice;
+ PermString encoding_scheme;
+
+ PermString kind() const { return "AFM"; }
+
+};
+
+class AfmReader { public:
+
+ static Metrics *read(const Filename &, ErrorHandler *);
+ static Metrics *read(Slurper &, ErrorHandler *);
+
+ private:
+
+ Metrics *_afm;
+ AfmMetricsXt *_afm_xt;
+ AfmParser &_l;
+ ErrorHandler *_errh;
+
+ mutable bool _composite_warned;
+ mutable bool _metrics_sets_warned;
+ mutable int _y_width_warned;
+
+ void lwarning(const char *, ...) const;
+ void lerror(const char *, ...) const;
+ void composite_warning() const;
+ void metrics_sets_warning() const;
+ void y_width_warning() const;
+ void no_match_warning(const char *context = 0) const;
+
+ double &fd(int i) { return _afm->fd(i); }
+ GlyphIndex find_err(PermString, const char *) const;
+
+ void read_char_metric_data() const;
+ void read_char_metrics() const;
+ void read_kerns() const;
+ void read_composites() const;
+
+ bool read();
+
+ AfmReader(AfmParser &, Metrics *, AfmMetricsXt *, ErrorHandler *);
+
+};
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/afmparse.hh b/Build/source/utils/lcdf-typetools/include/efont/afmparse.hh
new file mode 100644
index 00000000000..5a5350a55c7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/afmparse.hh
@@ -0,0 +1,64 @@
+// -*- related-file-name: "../../libefont/afmparse.cc" -*-
+#ifndef EFONT_AFMPARSE_HH
+#define EFONT_AFMPARSE_HH
+#include <lcdf/slurper.hh>
+#include <lcdf/permstr.hh>
+#include <stdarg.h>
+namespace Efont {
+
+class AfmParser { public:
+
+ AfmParser(Slurper &);
+
+ bool ok() const { return _slurper.ok(); }
+ operator Landmark() const { return _slurper.landmark(); }
+ Landmark landmark() const { return _slurper.landmark(); }
+ unsigned lineno() const { return _slurper.lineno(); }
+ const Filename &filename() const { return _slurper.filename(); }
+
+ bool key_matched() const { return _fail_field >= 0; }
+ int fail_field() const { return _fail_field; }
+ PermString message() const { return _message; }
+ void clear_message() { _message = PermString(); }
+
+ PermString keyword() const;
+ bool is(const char *, ...);
+ bool isall(const char *, ...);
+
+ inline bool next_line();
+ void save_line() { _slurper.save_line(); }
+ void skip_until(unsigned char);
+
+ unsigned char *cur_line() const { return _pos; }
+ unsigned char first() const { return _pos[0]; }
+ unsigned char operator[](int i) const { return _pos[i]; }
+ bool left() const { return *_pos != 0; }
+
+ private:
+
+ Slurper &_slurper;
+ bool _save_line;
+
+ unsigned char *_line;
+ unsigned char *_pos;
+ int _length;
+
+ PermString _message;
+ int _fail_field;
+
+ void static_initialize();
+ void trim_end();
+ unsigned char *vis(const char *, va_list);
+
+};
+
+
+inline bool AfmParser::next_line()
+{
+ _pos = _line = (unsigned char *)_slurper.next_line();
+ _length = _slurper.cur_line_length();
+ return _line != 0;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/afmw.hh b/Build/source/utils/lcdf-typetools/include/efont/afmw.hh
new file mode 100644
index 00000000000..fa883517999
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/afmw.hh
@@ -0,0 +1,29 @@
+#ifndef EFONT_AFMW_HH
+#define EFONT_AFMW_HH
+#include <efont/afm.hh>
+#include <stdio.h>
+namespace Efont {
+
+class AfmWriter { public:
+
+ static void write(Metrics *, FILE *);
+
+ private:
+
+ Metrics *_m;
+ AfmMetricsXt *_afm_xt;
+ FILE *_f;
+
+ void write_prologue() const;
+ void write_char_metric_data(GlyphIndex, int) const;
+ void write_kerns() const;
+ void write();
+
+ double fd(int i) const { return _m->fd(i); }
+
+ AfmWriter(Metrics *, FILE *);
+
+};
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/amfm.hh b/Build/source/utils/lcdf-typetools/include/efont/amfm.hh
new file mode 100644
index 00000000000..27e87c093ca
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/amfm.hh
@@ -0,0 +1,153 @@
+// -*- related-file-name: "../../libefont/amfm.cc" -*-
+#ifndef EFONT_AMFM_HH
+#define EFONT_AMFM_HH
+#include <efont/metrics.hh>
+#include <efont/t1mm.hh>
+#include <lcdf/hashmap.hh>
+class Slurper;
+class Filename;
+class ErrorHandler;
+namespace Efont {
+class AfmParser;
+class MetricsFinder;
+class Type1Charstring;
+
+
+struct AmfmMaster {
+
+ PermString font_name;
+ PermString family;
+ PermString full_name;
+ PermString version;
+ Vector<double> weight_vector;
+
+ bool loaded;
+ Metrics *afm;
+
+ AmfmMaster() : loaded(0), afm(0) { }
+
+};
+
+
+struct AmfmPrimaryFont {
+
+ Vector<int> design_vector;
+ Vector<PermString> labels;
+ PermString name;
+ AmfmPrimaryFont *next;
+
+};
+
+
+class AmfmMetrics { public:
+
+ AmfmMetrics(MetricsFinder *);
+ ~AmfmMetrics();
+
+ void use() { _uses++; }
+ void unuse() { if (--_uses == 0) delete this; }
+
+ bool sanity(ErrorHandler *) const;
+
+ double fd(int i) const { return _fdv[i]; }
+ double &fd(int i) { return _fdv[i]; }
+
+ PermString font_name() const { return _font_name; }
+ PermString directory() const { return _directory; }
+
+ int naxes() const { return _naxes; }
+ int nmasters() const { return _nmasters; }
+ MultipleMasterSpace *mmspace() const { return _mmspace; }
+
+ int primary_label_value(int, PermString) const;
+
+ Metrics *interpolate(const Vector<double> &design,
+ const Vector<double> &weight, ErrorHandler *);
+
+ private:
+
+ MetricsFinder *_finder;
+ PermString _directory;
+
+ Vector<double> _fdv;
+
+ PermString _font_name;
+ PermString _family;
+ PermString _full_name;
+ PermString _weight;
+
+ PermString _version;
+ PermString _notice;
+ Vector<PermString> _opening_comments;
+
+ PermString _encoding_scheme;
+ Vector<double> _weight_vector;
+
+ int _nmasters;
+ int _naxes;
+ AmfmMaster *_masters;
+ MultipleMasterSpace *_mmspace;
+
+ AmfmPrimaryFont *_primary_fonts;
+
+ Metrics *_sanity_afm;
+
+ unsigned _uses;
+
+ friend class AmfmReader;
+
+ AmfmMetrics(const AmfmMetrics &) { assert(0); }
+ AmfmMetrics &operator=(const AmfmMetrics &) { assert(0); return *this; }
+
+ AmfmPrimaryFont *find_primary_font(const Vector<double> &design) const;
+
+ Metrics *master(int, ErrorHandler *);
+
+};
+
+
+class AmfmReader { public:
+
+ static AmfmMetrics *read(const Filename &, MetricsFinder *, ErrorHandler*);
+ static AmfmMetrics *read(Slurper &, MetricsFinder *, ErrorHandler *);
+ static void add_amcp_file(Slurper &, AmfmMetrics *, ErrorHandler *);
+
+ private:
+
+ typedef Vector<double> NumVector;
+
+ AmfmMetrics *_amfm;
+ MetricsFinder *_finder;
+ AfmParser &_l;
+ MultipleMasterSpace *_mmspace;
+ ErrorHandler *_errh;
+
+ double &fd(int i) const { return _amfm->fd(i); }
+ int naxes() const { return _amfm->_naxes; }
+ int nmasters() const { return _amfm->_nmasters; }
+
+ void check_mmspace();
+
+ void lwarning(const char *, ...) const;
+ void lerror(const char *, ...) const;
+ void no_match_warning(const char *context = 0) const;
+
+ bool read_simple_array(Vector<double> &) const;
+ void read_positions() const;
+ void read_normalize() const;
+ void read_axis_types() const;
+ void read_axis(int axis) const;
+ void read_master(int master) const;
+ void read_primary_fonts() const;
+ void read_one_primary_font() const;
+ void read_conversion_programs() const;
+ bool read();
+
+ void read_amcp_file();
+
+ AmfmReader(AfmParser &, AmfmMetrics *, ErrorHandler *);
+
+};
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/cff.hh b/Build/source/utils/lcdf-typetools/include/efont/cff.hh
new file mode 100644
index 00000000000..775f56498f6
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/cff.hh
@@ -0,0 +1,452 @@
+// -*- related-file-name: "../../libefont/cff.cc" -*-
+#ifndef EFONT_CFF_HH
+#define EFONT_CFF_HH
+#include <lcdf/hashmap.hh>
+#include <efont/t1cs.hh>
+class ErrorHandler;
+namespace Efont {
+class Type1Encoding;
+
+class Cff { public:
+
+ class Dict;
+ class IndexIterator;
+ class Charset;
+ class FDSelect;
+ class FontParent;
+ class Font;
+ class CIDFont;
+ class ChildFont;
+
+ Cff(const String &, ErrorHandler * = 0);
+ ~Cff();
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ const String &data_string() const { return _data_string; }
+ const uint8_t *data() const { return _data; }
+ int length() const { return _len; }
+
+ int nfonts() const { return _name_index.size(); }
+ PermString font_name(int i) const { return _name_index[i]; }
+ FontParent *font(PermString = PermString(), ErrorHandler * = 0);
+
+ enum { NSTANDARD_STRINGS = 391, MAX_SID = 64999 };
+ int max_sid() const { return NSTANDARD_STRINGS - 1 + _strings.size(); }
+ int sid(PermString);
+ String sid_string(int sid) const;
+ PermString sid_permstring(int sid) const;
+
+ int ngsubrs() const { return _gsubrs_index.nitems(); }
+ Charstring *gsubr(int i);
+
+ enum DictOperator {
+ oVersion = 0, oNotice = 1, oFullName = 2, oFamilyName = 3,
+ oWeight = 4, oFontBBox = 5, oBlueValues = 6, oOtherBlues = 7,
+ oFamilyBlues = 8, oFamilyOtherBlues = 9, oStdHW = 10, oStdVW = 11,
+ oUniqueID = 13, oXUID = 14, oCharset = 15, oEncoding = 16,
+ oCharStrings = 17, oPrivate = 18, oSubrs = 19, oDefaultWidthX = 20,
+ oNominalWidthX = 21,
+ oCopyright = 32 + 0, oIsFixedPitch = 32 + 1, oItalicAngle = 32 + 2,
+ oUnderlinePosition = 32 + 3, oUnderlineThickness = 32 + 4,
+ oPaintType = 32 + 5, oCharstringType = 32 + 6, oFontMatrix = 32 + 7,
+ oStrokeWidth = 32 + 8, oBlueScale = 32 + 9, oBlueShift = 32 + 10,
+ oBlueFuzz = 32 + 11, oStemSnapH = 32 + 12, oStemSnapV = 32 + 13,
+ oForceBold = 32 + 14, oLanguageGroup = 32 + 17,
+ oExpansionFactor = 32 + 18, oInitialRandomSeed = 32 + 19,
+ oSyntheticBase = 32 + 20, oPostScript = 32 + 21,
+ oBaseFontName = 32 + 22, oBaseFontBlend = 32 + 23,
+ oROS = 32 + 30, oCIDFontVersion = 32 + 31, oCIDFontRevision = 32 + 32,
+ oCIDFontType = 32 + 33, oCIDCount = 32 + 34, oUIDBase = 32 + 35,
+ oFDArray = 32 + 36, oFDSelect = 32 + 37, oFontName = 32 + 38,
+ oLastOperator = oFontName
+ };
+
+ enum DictType {
+ tNone = 0, tSID, tFontNumber, tBoolean, tNumber, tOffset, tLocalOffset,
+ tArray, tArray2, tArray3, tArray4, tArray5, tArray6, tPrivateType,
+ tTypeMask = 0x7F, tPrivate = 0x80, tP = tPrivate
+ };
+
+ static const char * const operator_names[];
+ static const int operator_types[];
+
+
+ class IndexIterator { public:
+
+ IndexIterator() : _offset(0), _last_offset(0), _offsize(-1) { }
+ IndexIterator(const uint8_t *, int, int, ErrorHandler * = 0, const char *index_name = "INDEX");
+
+ int error() const { return (_offsize < 0 ? _offsize : 0); }
+
+ bool live() const { return _offset < _last_offset; }
+ operator bool() const { return live(); }
+ int nitems() const;
+
+ inline const uint8_t *operator*() const;
+ inline const uint8_t *operator[](int) const;
+ const uint8_t *index_end() const;
+
+ void operator++() { _offset += _offsize; }
+ void operator++(int) { ++(*this); }
+
+ private:
+
+ const uint8_t *_contents;
+ const uint8_t *_offset;
+ const uint8_t *_last_offset;
+ int _offsize;
+
+ inline uint32_t offset_at(const uint8_t *) const;
+
+ };
+
+ private:
+
+ String _data_string;
+ const uint8_t *_data;
+ int _len;
+
+ int _error;
+
+ Vector<PermString> _name_index;
+
+ IndexIterator _top_dict_index;
+
+ IndexIterator _strings_index;
+ mutable Vector<PermString> _strings;
+ mutable HashMap<PermString, int> _strings_map;
+
+ IndexIterator _gsubrs_index;
+ Vector<Charstring *> _gsubrs_cs;
+
+ int parse_header(ErrorHandler *);
+ int font_offset(int, int &, int &) const;
+ int font_offset(PermString, int &, int &) const;
+
+ enum { HEADER_SIZE = 4 };
+
+};
+
+
+class Cff::Dict { public:
+
+ Dict();
+ Dict(Cff *, int pos, int dict_len, ErrorHandler * = 0, const char *dict_name = "DICT");
+ int assign(Cff *, int pos, int dict_len, ErrorHandler * = 0, const char *dict_name = "DICT");
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ int check(bool is_private, ErrorHandler * = 0, const char *dict_name = "DICT") const;
+
+ bool has(DictOperator) const;
+ inline bool has_first(DictOperator) const;
+ bool xvalue(DictOperator, Vector<double> &) const;
+ bool xvalue(DictOperator, int *) const;
+ bool xvalue(DictOperator, double *) const;
+ bool value(DictOperator, Vector<double> &) const;
+ bool value(DictOperator, int *) const;
+ bool value(DictOperator, double *) const;
+
+ void unparse(ErrorHandler *, const char *) const;
+
+ private:
+
+ Cff *_cff;
+ int _pos;
+ Vector<int> _operators;
+ Vector<int> _pointers;
+ Vector<double> _operands;
+ int _error;
+
+};
+
+class Cff::Charset { public:
+
+ Charset() : _error(-1) { }
+ Charset(const Cff *, int pos, int nglyphs, int max_sid, ErrorHandler * = 0);
+ void assign(const Cff *, int pos, int nglyphs, int max_sid, ErrorHandler * = 0);
+
+ int error() const { return _error; }
+
+ int nglyphs() const { return _sids.size(); }
+ int nsids() const { return _gids.size(); }
+
+ inline int gid_to_sid(int gid) const;
+ inline int sid_to_gid(int sid) const;
+
+ private:
+
+ Vector<int> _sids;
+ Vector<int> _gids;
+ int _error;
+
+ void assign(const int *, int, int);
+ int parse(const Cff *, int pos, int nglyphs, int max_sid, ErrorHandler *);
+
+};
+
+class Cff::FDSelect { public:
+
+ FDSelect() : _fds(0), _my_fds(false), _nglyphs(0), _error(-1) { }
+ ~FDSelect();
+ void assign(const Cff *, int pos, int nglyphs, ErrorHandler * = 0);
+
+ int error() const { return _error; }
+
+ int nglyphs() const { return _nglyphs; }
+ inline int gid_to_fd(int gid) const;
+
+ private:
+
+ const uint8_t *_fds;
+ bool _my_fds;
+ int _nglyphs;
+ int _error;
+
+ FDSelect(const FDSelect &);
+ FDSelect &operator=(const FDSelect &);
+ int parse(const Cff *, int pos, int nglyphs, ErrorHandler *);
+
+};
+
+
+class Cff::FontParent : public CharstringProgram { public:
+
+ FontParent(Cff *);
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ int ngsubrs_x() const { return _cff->ngsubrs(); }
+ int ngsubrs() const { return ngsubrs_x(); }
+ Charstring *gsubr(int) const;
+ int gsubr_bias() const;
+
+ private:
+
+ Cff *_cff;
+ int _charstring_type;
+ int _error;
+
+ FontParent(const FontParent &);
+ FontParent &operator=(const FontParent &);
+
+ Charstring *charstring(const IndexIterator &, int) const;
+
+ friend class Cff::Font;
+ friend class Cff::CIDFont;
+ friend class Cff::ChildFont;
+
+};
+
+class Cff::CIDFont : public Cff::FontParent { public:
+
+ CIDFont(Cff *, PermString, const Dict &, ErrorHandler *);
+ ~CIDFont();
+
+ PermString font_name() const { return _font_name; }
+ void font_matrix(double[6]) const;
+
+ int nglyphs() const { return _charstrings_index.nitems(); }
+ PermString glyph_name(int) const;
+ void glyph_names(Vector<PermString> &) const;
+ Charstring *glyph(int) const;
+ Charstring *glyph(PermString) const;
+ int glyphid(PermString) const;
+ const CharstringProgram *child_program(int) const;
+
+ bool dict_has(DictOperator) const;
+ String dict_string(DictOperator) const;
+ bool dict_value(DictOperator, double *) const;
+ bool dict_xvalue(DictOperator, double, double *) const;
+ bool dict_value(DictOperator, Vector<double> &) const;
+
+ private:
+
+ PermString _font_name;
+
+ Dict _top_dict;
+ Dict _private_dict;
+
+ Cff::Charset _charset;
+
+ IndexIterator _charstrings_index;
+ mutable Vector<Charstring *> _charstrings_cs;
+
+ Vector<ChildFont *> _child_fonts;
+ Cff::FDSelect _fdselect;
+
+ const Dict &dict_of(DictOperator) const;
+
+};
+
+class Cff::ChildFont : public Cff::FontParent { public:
+
+ ChildFont(Cff *, Cff::CIDFont *, int charstring_type, const Dict &, ErrorHandler * = 0);
+ ~ChildFont();
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ PermString font_name() const { return _parent->font_name(); }
+ void font_matrix(double m[6]) const { _parent->font_matrix(m); }
+
+ inline bool cid() const;
+
+ int nsubrs_x() const { return _subrs_index.nitems(); }
+ int nsubrs() const { return nsubrs_x(); }
+ Charstring *subr(int) const;
+ int subr_bias() const;
+
+ int nglyphs() const { return _parent->nglyphs(); }
+ PermString glyph_name(int gi) const { return _parent->glyph_name(gi); }
+ void glyph_names(Vector<PermString> &v) const { _parent->glyph_names(v); }
+ Charstring *glyph(int gi) const { return _parent->glyph(gi); }
+ Charstring *glyph(PermString n) const { return _parent->glyph(n); }
+
+ double global_width_x(bool) const;
+
+ private:
+
+ Cff::CIDFont *_parent;
+
+ Dict _top_dict;
+ Dict _private_dict;
+
+ IndexIterator _subrs_index;
+ mutable Vector<Charstring *> _subrs_cs;
+
+ double _default_width_x;
+ double _nominal_width_x;
+
+ ChildFont(const ChildFont &); // does not exist
+ ChildFont &operator=(const ChildFont &); // does not exist
+
+ Charstring *charstring(const IndexIterator &, int) const;
+
+ friend class Cff::Font;
+
+};
+
+class Cff::Font : public Cff::ChildFont { public:
+
+ Font(Cff *, PermString, const Dict &, ErrorHandler *);
+ ~Font();
+
+ PermString font_name() const { return _font_name; }
+ void font_matrix(double[6]) const;
+
+ int nglyphs() const { return _charstrings_index.nitems(); }
+ PermString glyph_name(int) const;
+ void glyph_names(Vector<PermString> &) const;
+ Charstring *glyph(int) const;
+ Charstring *glyph(PermString) const;
+ int glyphid(PermString) const;
+
+ Type1Encoding *type1_encoding() const;
+ Type1Encoding *type1_encoding_copy() const;
+
+ bool dict_has(DictOperator) const;
+ String dict_string(DictOperator) const;
+ inline bool dict_value(DictOperator, double *) const;
+ inline bool dict_value(DictOperator, Vector<double> &) const;
+ const Dict &top_dict() const { return _top_dict; }
+
+ private:
+
+ PermString _font_name;
+
+ Cff::Charset _charset;
+
+ IndexIterator _charstrings_index;
+ mutable Vector<Charstring *> _charstrings_cs;
+
+ int _encoding_pos;
+ int _encoding[256];
+ mutable Type1Encoding *_t1encoding;
+
+ int parse_encoding(int pos, ErrorHandler *);
+ int assign_standard_encoding(const int *standard_encoding);
+
+ inline const Dict &dict_of(DictOperator) const;
+
+};
+
+
+inline uint32_t Cff::IndexIterator::offset_at(const uint8_t *x) const
+{
+ switch (_offsize) {
+ case 0:
+ return 0;
+ case 1:
+ return x[0];
+ case 2:
+ return (x[0] << 8) | x[1];
+ case 3:
+ return (x[0] << 16) | (x[1] << 8) | x[2];
+ default:
+ return (x[0] << 24) | (x[1] << 16) | (x[2] << 8) | x[3];
+ }
+}
+
+inline const uint8_t *Cff::IndexIterator::operator*() const
+{
+ assert(live());
+ return _contents + offset_at(_offset);
+}
+
+inline const uint8_t *Cff::IndexIterator::operator[](int which) const
+{
+ assert(live() && _offset + which * _offsize <= _last_offset);
+ return _contents + offset_at(_offset + which * _offsize);
+}
+
+inline int Cff::Charset::gid_to_sid(int gid) const
+{
+ if (gid >= 0 && gid < _sids.size())
+ return _sids[gid];
+ else
+ return -1;
+}
+
+inline int Cff::Charset::sid_to_gid(int sid) const
+{
+ if (sid >= 0 && sid < _gids.size())
+ return _gids[sid];
+ else
+ return -1;
+}
+
+inline int Cff::FDSelect::gid_to_fd(int gid) const
+{
+ if (gid >= 0 && gid < _nglyphs)
+ return _fds[gid];
+ else
+ return -1;
+}
+
+inline bool Cff::Dict::has_first(DictOperator op) const
+{
+ return _operators.size() && _operators[0] == op;
+}
+
+inline const Cff::Dict &Cff::Font::dict_of(DictOperator op) const
+{
+ return (op >= 0 && op <= oLastOperator && (operator_types[op] & tP) ? _private_dict : _top_dict);
+}
+
+inline bool Cff::Font::dict_value(DictOperator op, double *val) const
+{
+ return dict_of(op).value(op, val);
+}
+
+inline bool Cff::Font::dict_value(DictOperator op, Vector<double> &val) const
+{
+ return dict_of(op).value(op, val);
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/encoding.hh b/Build/source/utils/lcdf-typetools/include/efont/encoding.hh
new file mode 100644
index 00000000000..59758b06607
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/encoding.hh
@@ -0,0 +1,27 @@
+// -*- related-file-name: "../../libefont/encoding.cc" -*-
+#ifndef EFONT_ENCODING_HH
+#define EFONT_ENCODING_HH
+#include <lcdf/vector.hh>
+namespace Efont {
+typedef int GlyphIndex;
+
+class Encoding8 {
+
+ Vector<GlyphIndex> _codes;
+ Vector<int> _code_map;
+
+ public:
+
+ Encoding8() : _code_map(256, -1) { }
+
+ void reserve_glyphs(int);
+
+ int code(GlyphIndex gi) const { return _codes[gi]; }
+ GlyphIndex find_code(int c) const { return _code_map[c]; }
+
+ void set_code(GlyphIndex gi, int c) { _codes[gi] = c; _code_map[c] = gi; }
+
+};
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/findmet.hh b/Build/source/utils/lcdf-typetools/include/efont/findmet.hh
new file mode 100644
index 00000000000..dcfa8fb438a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/findmet.hh
@@ -0,0 +1,114 @@
+// -*- related-file-name: "../../libefont/findmet.cc" -*-
+#ifndef EFONT_FINDMET_HH
+#define EFONT_FINDMET_HH
+#include <lcdf/hashmap.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/permstr.hh>
+class Filename;
+class ErrorHandler;
+namespace Efont {
+class Metrics;
+class AmfmMetrics;
+class PsresDatabase;
+
+class MetricsFinder { public:
+
+ MetricsFinder() : _next(0), _prev(0) { }
+ virtual ~MetricsFinder();
+
+ MetricsFinder *next() const { return _next; }
+
+ void add_finder(MetricsFinder *);
+
+ Metrics *find_metrics(PermString, ErrorHandler * = 0);
+ AmfmMetrics *find_amfm(PermString, ErrorHandler * = 0);
+
+ virtual Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ virtual AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ void record(Metrics *m);
+ virtual void record(Metrics *, PermString);
+ virtual void record(AmfmMetrics *);
+
+ private:
+
+ MetricsFinder *_next;
+ MetricsFinder *_prev;
+
+ MetricsFinder(const MetricsFinder &) { }
+ MetricsFinder &operator=(const MetricsFinder &) { return *this; }
+
+ protected:
+
+ Metrics *try_metrics_file(const Filename &, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *try_amfm_file(const Filename &, MetricsFinder *, ErrorHandler *);
+
+};
+
+
+class CacheMetricsFinder: public MetricsFinder { public:
+
+ CacheMetricsFinder();
+ ~CacheMetricsFinder();
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+ void record(Metrics *, PermString);
+ void record(AmfmMetrics *);
+
+ void clear();
+
+ private:
+
+ HashMap<PermString, int> _metrics_map;
+ Vector<Metrics *> _metrics;
+ HashMap<PermString, int> _amfm_map;
+ Vector<AmfmMetrics *> _amfm;
+
+};
+
+
+class InstanceMetricsFinder: public MetricsFinder { public:
+
+ InstanceMetricsFinder(bool call_mmpfb = true);
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ private:
+
+ bool _call_mmpfb;
+
+ Metrics *find_metrics_instance(PermString, MetricsFinder *, ErrorHandler *);
+
+};
+
+
+class PsresMetricsFinder: public MetricsFinder { public:
+
+ PsresMetricsFinder(PsresDatabase *);
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ private:
+
+ PsresDatabase *_psres;
+
+};
+
+
+class DirectoryMetricsFinder: public MetricsFinder { public:
+
+ DirectoryMetricsFinder(PermString);
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ private:
+
+ PermString _directory;
+
+};
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/metrics.hh b/Build/source/utils/lcdf-typetools/include/efont/metrics.hh
new file mode 100644
index 00000000000..ae0a61126ed
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/metrics.hh
@@ -0,0 +1,177 @@
+// -*- related-file-name: "../../libefont/metrics.cc" -*-
+#ifndef EFONT_METRICS_HH
+#define EFONT_METRICS_HH
+#include <lcdf/permstr.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/hashmap.hh>
+#include <efont/encoding.hh>
+#include <efont/pairop.hh>
+namespace Efont {
+class MetricsXt;
+
+class Metrics { public:
+
+ Metrics();
+ Metrics(PermString font_name, PermString full_name, const Metrics &);
+ ~Metrics();
+
+ void use() { _uses++; }
+ void unuse() { if (--_uses == 0) delete this; }
+
+ // GLOBALS
+
+ PermString font_name() const { return _font_name; }
+ PermString family() const { return _family; }
+ PermString full_name() const { return _full_name; }
+ PermString weight() const { return _weight; }
+ PermString version() const { return _version; }
+
+ void set_font_name(PermString);
+ void set_family(PermString s) { _family = s; }
+ void set_full_name(PermString s) { _full_name = s; }
+ void set_weight(PermString s) { _weight = s; }
+ void set_version(PermString s) { _version = s; }
+
+ // GLYPHS
+
+ int nglyphs() const { return _names.size(); }
+ PermString name(GlyphIndex gi) const { return _names[gi]; }
+ GlyphIndex find(PermString n) const { return _name_map[n]; }
+
+ int code(GlyphIndex gi) const { return _encoding.code(gi); }
+ GlyphIndex find_code(int c) const { return _encoding.find_code(c); }
+ void set_code(GlyphIndex gi, int c) { _encoding.set_code(gi, c); }
+
+ GlyphIndex add_glyph(PermString);
+ void reserve_glyphs(int);
+
+ // DIMENSIONS
+
+ double scale() const { return _scale; }
+ void set_scale(double d) { _scale = d; }
+
+ int nfd() const { return _fdv.size(); }
+ int nkv() const { return _kernv.size(); }
+
+ double fd(int i) const { return _fdv[i]; }
+ double wd(int i) const { return _wdv[i]; }
+ double lf(int i) const { return _lfv[i]; }
+ double rt(int i) const { return _rtv[i]; }
+ double tp(int i) const { return _tpv[i]; }
+ double bt(int i) const { return _btv[i]; }
+ double kv(int i) const { return _kernv[i]; }
+
+ double &fd(int i) { return _fdv[i]; }
+ double &wd(int i) { return _wdv[i]; }
+ double &lf(int i) { return _lfv[i]; }
+ double &rt(int i) { return _rtv[i]; }
+ double &tp(int i) { return _tpv[i]; }
+ double &bt(int i) { return _btv[i]; }
+ double &kv(int i) { return _kernv[i]; }
+
+ inline int add_kv(double d);
+
+ void interpolate_dimens(const Metrics &, double, bool increment);
+
+ // PAIR PROGRAM
+
+ PairProgram *pair_program() { return &_pairp; }
+ const PairProgram *pair_program() const { return &_pairp; }
+ inline bool add_kern(GlyphIndex, GlyphIndex, int);
+ inline bool add_lig(GlyphIndex, GlyphIndex, GlyphIndex, int = opLigSimple);
+
+ // EXTENSIONS
+
+ MetricsXt *find_xt(PermString name) const { return _xt[_xt_map[name]]; }
+ void add_xt(MetricsXt *);
+
+ private:
+
+ PermString _font_name;
+
+ PermString _family;
+ PermString _full_name;
+ PermString _weight;
+ PermString _version;
+
+ HashMap<PermString, GlyphIndex> _name_map;
+ Vector<PermString> _names;
+ Encoding8 _encoding;
+
+ double _scale;
+
+ Vector<double> _fdv;
+ Vector<double> _wdv;
+ Vector<double> _lfv;
+ Vector<double> _rtv;
+ Vector<double> _tpv;
+ Vector<double> _btv;
+
+ PairProgram _pairp;
+ Vector<double> _kernv;
+
+ HashMap<PermString, int> _xt_map;
+ Vector<MetricsXt *> _xt;
+
+ unsigned _uses;
+
+};
+
+
+class MetricsXt {
+
+ public:
+
+ MetricsXt() { }
+ virtual ~MetricsXt() { }
+
+ virtual PermString kind() const = 0;
+
+ virtual void reserve_glyphs(int) { }
+
+};
+
+
+enum FontDimensionDefs {
+
+ fdCapHeight = 0,
+ fdXHeight,
+ fdAscender,
+ fdDescender,
+
+ fdItalicAngle,
+ fdUnderlinePosition,
+ fdUnderlineThickness,
+
+ fdFontBBllx,
+ fdFontBBlly,
+ fdFontBBurx,
+ fdFontBBury,
+
+ fdStdHW,
+ fdStdVW,
+
+ fdLast
+
+};
+
+
+inline bool Metrics::add_kern(GlyphIndex g1, GlyphIndex g2, int ki)
+{
+ return _pairp.add_kern(g1, g2, ki);
+}
+
+inline bool Metrics::add_lig(GlyphIndex g1, GlyphIndex g2, GlyphIndex gr, int kind)
+{
+ return _pairp.add_lig(g1, g2, gr, kind);
+}
+
+inline int Metrics::add_kv(double d)
+{
+ int k = _kernv.size();
+ _kernv.push_back(d);
+ return k;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otf.hh b/Build/source/utils/lcdf-typetools/include/efont/otf.hh
new file mode 100644
index 00000000000..2e4185d023e
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otf.hh
@@ -0,0 +1,376 @@
+// -*- related-file-name: "../../libefont/otf.cc" -*-
+#ifndef EFONT_OTF_HH
+#define EFONT_OTF_HH
+#include <efont/otfdata.hh>
+class ErrorHandler;
+namespace Efont { namespace OpenType {
+
+typedef int Glyph; // 16-bit integer
+
+class Tag { public:
+
+ Tag() : _tag(0U) { }
+ explicit Tag(uint32_t tag) : _tag(tag) { }
+ Tag(const char*);
+ Tag(const String&);
+ // default destructor
+
+ bool null() const { return _tag == 0; }
+ operator bool() const { return _tag != 0; }
+ bool valid() const;
+
+ uint32_t value() const { return _tag; }
+
+ String text() const;
+ static String langsys_text(Tag script, Tag langsys = Tag());
+
+ const uint8_t* table_entry(const uint8_t* table, int n, int entry_size) const;
+
+ const char* script_description() const;
+ const char* language_description() const;
+ const char* feature_description() const;
+
+ private:
+
+ uint32_t _tag;
+
+};
+
+class Font { public:
+
+ Font(const String&, ErrorHandler* = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ const String& data_string() const { return _str; }
+ const uint8_t* data() const { return _str.udata(); }
+ int length() const { return _str.length(); }
+
+ String table(Tag) const;
+ int ntables() const;
+ Tag table_tag(int) const;
+
+ private:
+
+ String _str;
+ int _error;
+
+ enum { HEADER_SIZE = 12, TABLE_DIR_ENTRY_SIZE = 16 };
+
+ int parse_header(ErrorHandler*);
+
+};
+
+class ScriptList { public:
+
+ ScriptList() { }
+ inline ScriptList(const String&, ErrorHandler* = 0);
+ int assign(const String&, ErrorHandler* = 0);
+ // default destructor
+
+ bool ok() const { return _str.length() > 0; }
+
+ int language_systems(Vector<Tag>& scripts, Vector<Tag>& langsys, ErrorHandler* = 0) const;
+ int features(Tag script, Tag langsys, int& required_fid, Vector<int>& fids, ErrorHandler* = 0, bool clear_fids = true) const;
+
+ private:
+
+ enum { SCRIPTLIST_HEADERSIZE = 2, SCRIPT_RECSIZE = 6,
+ SCRIPT_HEADERSIZE = 4, LANGSYS_RECSIZE = 6,
+ LANGSYS_HEADERSIZE = 6, FEATURE_RECSIZE = 2 };
+
+ String _str;
+
+ int check_header(ErrorHandler*);
+ int script_offset(Tag) const;
+ int check_script(Tag, int, ErrorHandler*) const;
+ int langsys_offset(Tag, Tag, ErrorHandler* = 0) const;
+
+};
+
+class FeatureList { public:
+
+ FeatureList() { }
+ inline FeatureList(const String&, ErrorHandler* = 0);
+ int assign(const String&, ErrorHandler* = 0);
+ // default destructor
+
+ bool ok() const { return _str.length() > 0; }
+
+ Tag tag(int fid) const;
+ String params(int fid, int length, ErrorHandler* = 0, bool old_style_offset = false) const;
+ int lookups(int fid, Vector<int>& results, ErrorHandler* = 0, bool clear_results = true) const;
+
+ int find(Tag, const Vector<int>& fids) const;
+ void filter(Vector<int>& fids, const Vector<Tag>& sorted_ftags) const;
+ inline void filter(Vector<int>& fids, Tag ftag) const;
+
+ int lookups(const Vector<int>& fids, Vector<int>& results, ErrorHandler* = 0) const;
+ int lookups(const Vector<int>& required_fids, const Vector<int>& fids, const Vector<Tag>& sorted_ftags, Vector<int>& results, ErrorHandler* = 0) const;
+ int lookups(int required_fid, const Vector<int>& fids, const Vector<Tag>& sorted_ftags, Vector<int>& results, ErrorHandler* = 0) const;
+ int lookups(const ScriptList&, Tag script, Tag langsys, const Vector<Tag>& sorted_ftags, Vector<int>& results, ErrorHandler* = 0) const;
+
+ private:
+
+ enum { FEATURELIST_HEADERSIZE = 2, FEATURE_RECSIZE = 6,
+ FEATURE_HEADERSIZE = 4, LOOKUPLIST_RECSIZE = 2 };
+
+ String _str;
+
+ int check_header(ErrorHandler*);
+ int script_offset(Tag) const;
+ int langsys_offset(Tag, Tag, ErrorHandler* = 0) const;
+
+};
+
+class Coverage { public:
+
+ Coverage() throw (); // empty coverage
+ Coverage(Glyph first, Glyph last) throw (); // range coverage
+ Coverage(const String&, ErrorHandler* = 0, bool check = true) throw ();
+ // default destructor
+
+ bool ok() const throw () { return _str.length() > 0; }
+ int size() const throw ();
+
+ int coverage_index(Glyph) const throw ();
+ bool covers(Glyph g) const throw () { return coverage_index(g) >= 0; }
+
+ void unparse(StringAccum&) const throw ();
+ String unparse() const throw ();
+
+ class iterator { public:
+ iterator() : _pos(0), _value(0) { }
+ // private constructor
+ // default destructor
+
+ bool ok() const { return _pos < _str.length(); }
+ operator bool() const { return ok(); }
+
+ Glyph operator*() const { return _value; }
+ Glyph value() const { return _value; }
+ int coverage_index() const;
+
+ void operator++(int);
+ void operator++() { (*this)++; }
+ bool forward_to(Glyph);
+
+ // XXX should check iterators are of same type
+ bool operator<(const iterator& o) { return _value < o._value; }
+ bool operator<=(const iterator& o) { return _value <= o._value; }
+ bool operator>=(const iterator& o) { return _value >= o._value; }
+ bool operator>(const iterator& o) { return _value > o._value; }
+ bool operator==(const iterator& o) { return _value == o._value; }
+ bool operator!=(const iterator& o) { return _value != o._value; }
+
+ private:
+ String _str;
+ int _pos;
+ Glyph _value;
+ friend class Coverage;
+ iterator(const String&, int);
+ };
+
+ iterator begin() const { return iterator(_str, 0); }
+ iterator end() const { return iterator(_str, _str.length()); }
+ Glyph operator[](int) const throw ();
+
+ enum { T_LIST = 1, T_RANGES = 2,
+ HEADERSIZE = 4, LIST_RECSIZE = 2, RANGES_RECSIZE = 6 };
+
+ private:
+
+ String _str;
+
+ int check(ErrorHandler*);
+
+};
+
+Coverage operator&(const Coverage&, const Coverage&);
+bool operator<=(const Coverage&, const Coverage&);
+
+inline bool operator>=(const Coverage& a, const Coverage& b)
+{
+ return b <= a;
+}
+
+class GlyphSet { public:
+
+ GlyphSet();
+ GlyphSet(const GlyphSet&);
+ ~GlyphSet();
+
+ inline bool covers(Glyph g) const;
+ inline bool operator[](Glyph g) const;
+ int change(Glyph, bool);
+ void insert(Glyph g) { change(g, true); }
+ void remove(Glyph g) { change(g, false); }
+
+ GlyphSet& operator=(const GlyphSet&);
+
+ private:
+
+ enum { GLYPHBITS = 16, SHIFT = 8,
+ MAXGLYPH = (1 << GLYPHBITS) - 1, UNSHIFT = GLYPHBITS - SHIFT,
+ MASK = (1 << UNSHIFT) - 1, VLEN = (1 << SHIFT),
+ VULEN = (1 << UNSHIFT) >> 5
+ };
+
+ uint32_t* _v[VLEN];
+
+};
+
+class ClassDef { public:
+
+ ClassDef(const String&, ErrorHandler* = 0) throw ();
+ // default destructor
+
+ bool ok() const { return _str.length() > 0; }
+ int nclass() const throw ();
+
+ int lookup(Glyph) const throw ();
+ int operator[](Glyph g) const throw () { return lookup(g); }
+
+ void unparse(StringAccum&) const throw ();
+ String unparse() const throw ();
+
+ class class_iterator { public:
+ // private constructor
+ // default destructor
+
+ bool ok() const { return _pos < _str.length(); }
+ operator bool() const { return ok(); }
+
+ Glyph operator*() const { return *_coviter; }
+ Glyph value() const { return *_coviter; }
+ int class_value() const { return _class; }
+
+ void operator++(int);
+ void operator++() { (*this)++; }
+
+ // XXX should check iterators are of same type
+ bool operator<(const class_iterator& o) { return _coviter < o._coviter; }
+ bool operator<=(const class_iterator& o) { return _coviter <= o._coviter; }
+ bool operator>=(const class_iterator& o) { return _coviter >= o._coviter; }
+ bool operator>(const class_iterator& o) { return _coviter > o._coviter; }
+ bool operator==(const class_iterator& o) { return _coviter == o._coviter; }
+ bool operator!=(const class_iterator& o) { return _coviter != o._coviter; }
+
+ private:
+ String _str;
+ int _pos;
+ int _class;
+ Coverage::iterator _coviter;
+ friend class ClassDef;
+ class_iterator(const String&, int, int, const Coverage::iterator&);
+ void increment_class0();
+ enum { FIRST_POS = -1, LAST_POS = -2 };
+ };
+
+ // XXX does not work correctly for class 0
+ class_iterator begin(int c) const { return class_iterator(_str, 0, c, Coverage::iterator()); }
+ class_iterator begin(int c, const Coverage& coverage) const { return class_iterator(_str, 0, c, coverage.begin()); }
+ class_iterator end(int c) const { return class_iterator(_str, _str.length(), c, Coverage::iterator()); }
+
+ enum { T_LIST = 1, T_RANGES = 2,
+ LIST_HEADERSIZE = 6, LIST_RECSIZE = 2,
+ RANGES_HEADERSIZE = 4, RANGES_RECSIZE = 6 };
+
+ private:
+
+ String _str;
+
+ int check(ErrorHandler*);
+
+};
+
+extern Vector<PermString> debug_glyph_names;
+
+
+inline bool operator==(Tag t1, uint32_t t2)
+{
+ return t1.value() == t2;
+}
+
+inline bool operator!=(Tag t1, uint32_t t2)
+{
+ return t1.value() != t2;
+}
+
+inline bool operator<(Tag t1, uint32_t t2)
+{
+ return t1.value() < t2;
+}
+
+inline bool operator>(Tag t1, uint32_t t2)
+{
+ return t1.value() > t2;
+}
+
+inline bool operator<=(Tag t1, uint32_t t2)
+{
+ return t1.value() <= t2;
+}
+
+inline bool operator>=(Tag t1, uint32_t t2)
+{
+ return t1.value() >= t2;
+}
+
+inline bool operator==(Tag t1, Tag t2)
+{
+ return t1.value() == t2.value();
+}
+
+inline bool operator!=(Tag t1, Tag t2)
+{
+ return t1.value() != t2.value();
+}
+
+inline bool operator<(Tag t1, Tag t2)
+{
+ return t1.value() < t2.value();
+}
+
+inline ScriptList::ScriptList(const String& str, ErrorHandler* errh)
+{
+ assign(str, errh);
+}
+
+inline FeatureList::FeatureList(const String& str, ErrorHandler* errh)
+{
+ assign(str, errh);
+}
+
+inline void FeatureList::filter(Vector<int>& fids, Tag ftag) const
+{
+ Vector<Tag> tags;
+ tags.push_back(ftag);
+ filter(fids, tags);
+}
+
+inline bool GlyphSet::covers(Glyph g) const
+{
+ if ((unsigned)g > MAXGLYPH)
+ return false;
+ else if (const uint32_t* u = _v[g >> SHIFT])
+ return (u[(g & MASK) >> 5] & (1 << (g & 0x1F))) != 0;
+ else
+ return false;
+}
+
+inline bool GlyphSet::operator[](Glyph g) const
+{
+ return covers(g);
+}
+
+}}
+
+inline unsigned hashcode(Efont::OpenType::Tag t)
+{
+ return t.value();
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otfcmap.hh b/Build/source/utils/lcdf-typetools/include/efont/otfcmap.hh
new file mode 100644
index 00000000000..9662e7d0a5f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otfcmap.hh
@@ -0,0 +1,48 @@
+// -*- related-file-name: "../../libefont/otfcmap.cc" -*-
+#ifndef EFONT_OTFCMAP_HH
+#define EFONT_OTFCMAP_HH
+#include <efont/otf.hh>
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Cmap { public:
+
+ Cmap(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ inline Glyph map_uni(uint32_t c) const;
+ int map_uni(const Vector<uint32_t> &in, Vector<Glyph> &out) const;
+
+ private:
+
+ String _str;
+ int _error;
+ int _ntables;
+ int _first_unicode_table;
+ mutable Vector<int> _table_error;
+
+ enum { HEADER_SIZE = 4, ENCODING_SIZE = 8,
+ HIBYTE_SUBHEADERS = 524 };
+ enum Format { F_BYTE = 0, F_HIBYTE = 2, F_SEGMENTED = 4, F_TRIMMED = 6,
+ F_HIBYTE32 = 8, F_TRIMMED32 = 10, F_SEGMENTED32 = 12 };
+
+ int parse_header(ErrorHandler *);
+ int first_unicode_table() const { return _first_unicode_table; }
+ int first_table(int platform, int encoding) const;
+ int check_table(int t, ErrorHandler * = 0) const;
+ Glyph map_table(int t, uint32_t, ErrorHandler * = 0) const;
+ void dump_table(int t, Vector<uint32_t> &cs, Vector<uint32_t> &gs, ErrorHandler * = 0) const;
+
+};
+
+
+inline Glyph Cmap::map_uni(uint32_t c) const
+{
+ return map_table(first_unicode_table(), c, ErrorHandler::default_handler());
+}
+
+}}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otfdata.hh b/Build/source/utils/lcdf-typetools/include/efont/otfdata.hh
new file mode 100644
index 00000000000..638e7913148
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otfdata.hh
@@ -0,0 +1,119 @@
+// -*- related-file-name: "../../libefont/otfdata.cc" -*-
+#ifndef EFONT_OTFDATA_HH
+#define EFONT_OTFDATA_HH
+#include <lcdf/string.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/inttypes.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if NEED_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#elif defined(WIN32)
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.h>
+#else
+# error "configury disaster! Report this error to kohler@icir.org"
+#endif
+class ErrorHandler;
+namespace Efont { namespace OpenType {
+
+class Error { public:
+ String description;
+ Error() : description(String::stable_string("unspecified error")) { }
+ Error(const String &d) : description(d) { }
+};
+
+class Bounds : public Error { public:
+ Bounds() : Error(String::stable_string("bounds error")) { }
+};
+
+class Format : public Error { public:
+ Format(const String& name) : Error(name + " format error") { }
+ Format(const String& name, const String& type)
+ : Error(name + " " + type + " format error") { }
+};
+
+class BlankTable : public Format { public:
+ BlankTable(const String& name) : Format(name, "blank table") { }
+};
+
+class Data { public:
+
+ Data() { }
+ Data(const String& str) : _str(str) { _str.align(2); }
+ // default copy constructor
+ // default destructor
+
+ operator const String&() const { return _str; }
+
+ int length() const { return _str.length(); }
+
+ inline uint8_t operator[](unsigned offset) const throw (Bounds);
+ inline uint16_t u16(unsigned offset) const throw (Bounds);
+ inline int16_t s16(unsigned offset) const throw (Bounds);
+ inline uint32_t u32(unsigned offset) const throw (Bounds);
+ inline int32_t s32(unsigned offset) const throw (Bounds);
+
+ Data subtable(unsigned offset) const throw (Bounds);
+ Data offset_subtable(unsigned offset_offset) const throw (Bounds);
+
+ private:
+
+ String _str;
+
+};
+
+inline uint8_t Data::operator[](unsigned offset) const throw (Bounds)
+{
+ if (offset >= static_cast<unsigned>(_str.length()))
+ throw Bounds();
+ else
+ return _str[offset];
+}
+
+inline uint16_t Data::u16(unsigned offset) const throw (Bounds)
+{
+ if (offset + 1 >= static_cast<unsigned>(_str.length()) || offset + 1 == 0)
+ throw Bounds();
+ else
+ return ntohs(*reinterpret_cast<const uint16_t *>(_str.data() + offset));
+}
+
+inline int16_t Data::s16(unsigned offset) const throw (Bounds)
+{
+ if (offset + 1 >= static_cast<unsigned>(_str.length()) || offset + 1 == 0)
+ throw Bounds();
+ else
+ return ntohs(*reinterpret_cast<const int16_t *>(_str.data() + offset));
+}
+
+inline uint32_t Data::u32(unsigned offset) const throw (Bounds)
+{
+ if (offset + 3 >= static_cast<unsigned>(_str.length()) || offset + 3 < 3)
+ throw Bounds();
+ else
+ return (ntohs(*reinterpret_cast<const uint16_t *>(_str.data() + offset)) << 16)
+ | ntohs(*reinterpret_cast<const uint16_t *>(_str.data() + offset + 2));
+}
+
+inline int32_t Data::s32(unsigned offset) const throw (Bounds)
+{
+ if (offset + 3 >= static_cast<unsigned>(_str.length()) || offset + 3 < 3)
+ throw Bounds();
+ else
+ return (ntohs(*reinterpret_cast<const uint16_t *>(_str.data() + offset)) << 16)
+ | ntohs(*reinterpret_cast<const uint16_t *>(_str.data() + offset + 2));
+}
+
+}}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otfgpos.hh b/Build/source/utils/lcdf-typetools/include/efont/otfgpos.hh
new file mode 100644
index 00000000000..5c83cb992c1
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otfgpos.hh
@@ -0,0 +1,231 @@
+// -*- related-file-name: "../../libefont/otfgpos.cc" -*-
+#ifndef EFONT_OTFGPOS_HH
+#define EFONT_OTFGPOS_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+namespace Efont { namespace OpenType {
+class GposLookup;
+class Positioning;
+
+class Gpos { public:
+
+ Gpos(const Data &, ErrorHandler * = 0) throw (Error);
+ // default destructor
+
+ const ScriptList &script_list() const { return _script_list; }
+ const FeatureList &feature_list() const { return _feature_list; }
+
+ int nlookups() const;
+ GposLookup lookup(unsigned) const;
+
+ enum { HEADERSIZE = 10 };
+
+ private:
+
+ ScriptList _script_list;
+ FeatureList _feature_list;
+ Data _lookup_list;
+
+};
+
+class GposLookup { public:
+ GposLookup(const Data &) throw (Error);
+ int type() const { return _d.u16(0); }
+ uint16_t flags() const { return _d.u16(2); }
+ bool unparse_automatics(Vector<Positioning> &) const;
+ enum {
+ HEADERSIZE = 6, RECSIZE = 2,
+ L_SINGLE = 1, L_PAIR = 2, L_CURSIVE = 3, L_MARKTOBASE = 4,
+ L_MARKTOLIGATURE = 5, L_MARKTOMARK = 6, L_CONTEXT = 7,
+ L_CHAIN = 8
+ };
+ private:
+ Data _d;
+};
+
+class GposValue { public:
+ static inline int size(uint16_t format);
+ static inline int16_t xplacement(uint16_t format, const Data &);
+ static inline int16_t yplacement(uint16_t format, const Data &);
+ static inline int16_t xadvance(uint16_t format, const Data &);
+ static inline int16_t yadvance(uint16_t format, const Data &);
+ enum {
+ F_XPLACEMENT = 0x0001,
+ F_YPLACEMENT = 0x0002,
+ F_XADVANCE = 0x0004,
+ F_YADVANCE = 0x0008,
+ F_XPLACEMENT_DEVICE = 0x0010,
+ F_YPLACEMENT_DEVICE = 0x0020,
+ F_XADVANCE_DEVICE = 0x0040,
+ F_YADVANCE_DEVICE = 0x0080
+ };
+ private:
+ static const int nibble_bitcount_x2[];
+};
+
+class GposSingle { public:
+ GposSingle(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ void unparse(Vector<Positioning> &) const;
+ enum { F2_HEADERSIZE = 8 };
+ private:
+ Data _d;
+};
+
+class GposPair { public:
+ GposPair(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ void unparse(Vector<Positioning> &) const;
+ enum { F1_HEADERSIZE = 10, F1_RECSIZE = 2,
+ PAIRSET_HEADERSIZE = 2, PAIRVALUE_HEADERSIZE = 2,
+ F2_HEADERSIZE = 16 };
+ private:
+ Data _d;
+};
+
+struct Position {
+ Glyph g;
+ int pdx, pdy; // placement
+ int adx, ady; // advance
+ inline Position();
+ inline Position(Glyph, uint16_t format, const Data &);
+ inline Position(uint16_t format, const Data &);
+ inline Position(Glyph, const Position &);
+ bool empty() const { return pdx == 0 && pdy == 0 && adx == 0 && ady == 0; }
+ operator bool() const { return !empty(); }
+ bool h_empty() const { return pdx == 0 && pdy == 0 && adx == 0; }
+ bool placed() const { return pdx != 0 || pdy != 0; }
+ void unparse(StringAccum &, const Vector<PermString> * = 0) const;
+ String unparse(const Vector<PermString> * = 0) const;
+};
+
+class Positioning { public:
+
+ Positioning();
+
+ // single positioning
+ inline Positioning(const Position &);
+
+ // pair positioning
+ inline Positioning(const Position &, const Position &);
+
+ bool context_in(const Coverage &) const;
+ bool context_in(const GlyphSet &) const;
+
+ // types
+ inline operator bool() const;
+ inline bool is_single() const;
+ inline bool is_pair() const;
+ inline bool is_pairkern() const;
+
+ // extract data
+ const Position &left() const { return _left; }
+ Glyph left_glyph() const { return _left.g; }
+ const Position &right() const { return _right; }
+ Glyph right_glyph() const { return _right.g; }
+
+ void unparse(StringAccum &, const Vector<PermString> * = 0) const;
+ String unparse(const Vector<PermString> * = 0) const;
+
+ private:
+
+ Position _left;
+ Position _right;
+
+};
+
+inline int GposValue::size(uint16_t format)
+{
+ return (nibble_bitcount_x2[format & 15] + nibble_bitcount_x2[(format>>4) & 15]);
+}
+
+inline int16_t GposValue::xplacement(uint16_t format, const Data &d)
+{
+ if (format & F_XPLACEMENT)
+ return d.s16(0);
+ else
+ return 0;
+}
+
+inline int16_t GposValue::yplacement(uint16_t format, const Data &d)
+{
+ if (format & F_YPLACEMENT)
+ return d.s16((format & F_XPLACEMENT ? 2 : 0));
+ else
+ return 0;
+}
+
+inline int16_t GposValue::xadvance(uint16_t format, const Data &d)
+{
+ if (format & F_XADVANCE)
+ return d.s16(nibble_bitcount_x2[format & (F_XADVANCE - 1)]);
+ else
+ return 0;
+}
+
+inline int16_t GposValue::yadvance(uint16_t format, const Data &d)
+{
+ if (format & F_YADVANCE)
+ return d.s16(nibble_bitcount_x2[format & (F_YADVANCE - 1)]);
+ else
+ return 0;
+}
+
+inline Position::Position()
+ : g(0)
+{
+}
+
+inline Position::Position(Glyph g_, uint16_t format, const Data &value)
+ : g(g_),
+ pdx(GposValue::xplacement(format, value)), pdy(GposValue::yplacement(format, value)),
+ adx(GposValue::xadvance(format, value)), ady(GposValue::yadvance(format, value))
+{
+}
+
+inline Position::Position(uint16_t format, const Data &value)
+ : g(0),
+ pdx(GposValue::xplacement(format, value)), pdy(GposValue::yplacement(format, value)),
+ adx(GposValue::xadvance(format, value)), ady(GposValue::yadvance(format, value))
+{
+}
+
+inline Position::Position(Glyph g_, const Position &p)
+ : g(g_), pdx(p.pdx), pdy(p.pdy), adx(p.adx), ady(p.ady)
+{
+}
+
+inline Positioning::Positioning(const Position &left)
+ : _left(left)
+{
+}
+
+inline Positioning::Positioning(const Position &left, const Position &right)
+ : _left(left), _right(right)
+{
+}
+
+inline Positioning::operator bool() const
+{
+ return _left.g != 0;
+}
+
+inline bool Positioning::is_single() const
+{
+ return _left.g != 0 && _right.g == 0;
+}
+
+inline bool Positioning::is_pair() const
+{
+ return _left.g != 0 && _right.g != 0;
+}
+
+inline bool Positioning::is_pairkern() const
+{
+ return _left.g != 0 && !_left.placed() && _right.g != 0 && _right.h_empty();
+}
+
+}}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otfgsub.hh b/Build/source/utils/lcdf-typetools/include/efont/otfgsub.hh
new file mode 100644
index 00000000000..fb2782c4578
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otfgsub.hh
@@ -0,0 +1,396 @@
+// -*- related-file-name: "../../libefont/otfgsub.cc" -*-
+#ifndef EFONT_OTFGSUB_HH
+#define EFONT_OTFGSUB_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+namespace Efont { namespace OpenType {
+class GsubLookup;
+class Substitution;
+
+class Gsub { public:
+
+ Gsub(const Data &, const Font *, ErrorHandler * = 0) throw (Error);
+ // default destructor
+
+ const ScriptList &script_list() const { return _script_list; }
+ const FeatureList &feature_list() const { return _feature_list; }
+ bool chaincontext_reverse_backtrack() const { return _chaincontext_reverse_backtrack; }
+
+ int nlookups() const;
+ GsubLookup lookup(unsigned) const;
+
+ enum { HEADERSIZE = 10 };
+
+ private:
+
+ ScriptList _script_list;
+ FeatureList _feature_list;
+ Data _lookup_list;
+ bool _chaincontext_reverse_backtrack;
+
+};
+
+class GsubLookup { public:
+ GsubLookup(const Data &) throw (Error);
+ int type() const { return _d.u16(0); }
+ uint16_t flags() const { return _d.u16(2); }
+ bool unparse_automatics(const Gsub &, Vector<Substitution> &) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &) const;
+ enum {
+ HEADERSIZE = 6, RECSIZE = 2,
+ L_SINGLE = 1, L_MULTIPLE = 2, L_ALTERNATE = 3, L_LIGATURE = 4,
+ L_CONTEXT = 5, L_CHAIN = 6, L_REVCHAIN = 8
+ };
+ private:
+ Data _d;
+};
+
+class GsubSingle { public:
+ GsubSingle(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ Glyph map(Glyph) const;
+ void unparse(Vector<Substitution> &) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &) const;
+ enum { HEADERSIZE = 6, FORMAT2_RECSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class GsubMultiple { public:
+ GsubMultiple(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ bool map(Glyph, Vector<Glyph> &) const;
+ void unparse(Vector<Substitution> &, bool alternate = false) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &, bool alternate = false) const;
+ enum { HEADERSIZE = 6, RECSIZE = 2,
+ SEQ_HEADERSIZE = 2, SEQ_RECSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class GsubLigature { public:
+ GsubLigature(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ bool map(const Vector<Glyph> &, Glyph &, int &) const;
+ void unparse(Vector<Substitution> &) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &) const;
+ enum { HEADERSIZE = 6, RECSIZE = 2,
+ SET_HEADERSIZE = 2, SET_RECSIZE = 2,
+ LIG_HEADERSIZE = 4, LIG_RECSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class GsubContext { public:
+ GsubContext(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ bool unparse(const Gsub &, Vector<Substitution> &) const;
+ enum { F3_HSIZE = 6, SUBRECSIZE = 4 };
+ private:
+ Data _d;
+ static bool f3_unparse(const Data &, int nglyph, int glyphtab_offset, int nsub, int subtab_offset, const Gsub &, Vector<Substitution> &, const Substitution &prototype_sub);
+ friend class GsubChainContext;
+};
+
+class GsubChainContext { public:
+ GsubChainContext(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ bool unparse(const Gsub &, Vector<Substitution> &) const;
+ enum { F1_HEADERSIZE = 6, F1_RECSIZE = 2,
+ F1_SRS_HSIZE = 2, F1_SRS_RSIZE = 2,
+ F3_HSIZE = 4, F3_INPUT_HSIZE = 2, F3_LOOKAHEAD_HSIZE = 2, F3_SUBST_HSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class Substitution { public:
+
+ Substitution();
+ Substitution(const Substitution &);
+
+ // single substitution
+ Substitution(Glyph in, Glyph out);
+
+ // multiple substitution
+ Substitution(Glyph in, const Vector<Glyph> &out, bool is_alternate = false);
+
+ // ligature substitution
+ Substitution(Glyph in1, Glyph in2, Glyph out);
+ Substitution(const Vector<Glyph> &in, Glyph out);
+ Substitution(int nin, const Glyph *in, Glyph out);
+
+ // space
+ Substitution(int nleft, int nin, int nout, int nright);
+
+ ~Substitution();
+
+ Substitution &operator=(const Substitution &);
+
+ bool context_in(const Coverage &) const;
+ bool context_in(const GlyphSet &) const;
+
+ // types
+ inline operator bool() const;
+ bool is_noop() const;
+ inline bool is_single() const;
+ inline bool is_multiple() const;
+ inline bool is_alternate() const;
+ inline bool is_ligature() const;
+ inline bool is_simple_context() const;
+ inline bool is_single_lcontext() const;
+ inline bool is_single_rcontext() const;
+ inline bool is_lcontext() const;
+ inline bool is_rcontext() const;
+
+ // extract data
+ inline Glyph left_glyph() const;
+ inline int left_nglyphs() const;
+ inline Glyph *left_glyphptr();
+ inline const Glyph *left_glyphptr() const;
+
+ inline Glyph in_glyph() const;
+ inline Glyph in_glyph(int pos) const;
+ inline bool in_glyphs(Vector<Glyph> &) const;
+ inline int in_nglyphs() const;
+ inline Glyph *in_glyphptr();
+ inline const Glyph *in_glyphptr() const;
+
+ inline bool in_matches(int pos, Glyph) const;
+
+ inline Glyph out_glyph() const;
+ inline Glyph out_glyph(int pos) const;
+ inline bool out_glyphs(Vector<Glyph> &) const;
+ inline Glyph *out_glyphptr();
+ inline const Glyph *out_glyphptr() const;
+
+ inline int out_nglyphs() const;
+ inline Glyph right_glyph() const;
+ inline Glyph *right_glyphptr();
+ inline const Glyph *right_glyphptr() const;
+
+ bool all_in_glyphs(Vector<Glyph> &) const;
+ bool all_out_glyphs(Vector<Glyph> &) const;
+
+ // alter
+ void add_outer_left(Glyph);
+ void remove_outer_left();
+ Substitution in_out_append_glyph(Glyph) const;
+ bool out_alter(const Substitution &, int) throw ();
+ void add_outer_right(Glyph);
+ void remove_outer_right();
+
+ void unparse(StringAccum &, const Vector<PermString> * = &debug_glyph_names) const;
+ String unparse(const Vector<PermString> * = &debug_glyph_names) const;
+
+ private:
+
+ enum { T_NONE = 0, T_GLYPH, T_GLYPHS, T_COVERAGE };
+ typedef union {
+ Glyph gid;
+ Glyph *gids; // first entry is a count
+ Coverage *coverage;
+ } Substitute;
+
+ Substitute _left;
+ Substitute _in;
+ Substitute _out;
+ Substitute _right;
+
+ uint8_t _left_is;
+ uint8_t _in_is;
+ uint8_t _out_is;
+ uint8_t _right_is;
+
+ bool _alternate : 1;
+
+ static void clear(Substitute &, uint8_t &);
+ static void assign_space(Substitute &, uint8_t &, int);
+ static void assign(Substitute &, uint8_t &, Glyph);
+ static void assign(Substitute &, uint8_t &, int, const Glyph *);
+ static void assign(Substitute &, uint8_t &, const Coverage &);
+ static void assign(Substitute &, uint8_t &, const Substitute &, uint8_t);
+ static void assign_append(Substitute &, uint8_t &, const Substitute &, uint8_t, const Substitute &, uint8_t);
+ static void assign_append(Substitute &, uint8_t &, const Substitute &, uint8_t, Glyph);
+ static bool substitute_in(const Substitute &, uint8_t, const Coverage &);
+ static bool substitute_in(const Substitute &, uint8_t, const GlyphSet &);
+
+ static Glyph extract_glyph(const Substitute &, uint8_t) throw ();
+ static Glyph extract_glyph(const Substitute &, int which, uint8_t) throw ();
+ static bool extract_glyphs(const Substitute &, uint8_t, Vector<Glyph> &, bool coverage_ok) throw ();
+ static Glyph *extract_glyphptr(const Substitute &, uint8_t) throw ();
+ static int extract_nglyphs(const Substitute &, uint8_t, bool coverage_ok) throw ();
+ static bool matches(const Substitute &, uint8_t, int pos, Glyph) throw ();
+
+ static void unparse_glyphids(StringAccum &, const Substitute &, uint8_t, const Vector<PermString> *) throw ();
+
+};
+
+inline Substitution::Substitution()
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_NONE), _right_is(T_NONE)
+{
+}
+
+/* Single 1: u16 format, offset coverage, u16 glyphdelta
+ Single 2: u16 format, offset coverage, u16 count, glyph subst[]
+ Multiple 1: u16 format, offset coverage, u16 count, offset sequence[];
+ sequence is: u16 count, glyph subst[]
+ Alternate 1: u16 format, offset coverage, u16 count, offset alternates[];
+ alternate is: u16 count, glyph alts[]
+ Ligature 1: u16 format, offset coverage, u16 count, offset sets[];
+ set is: u16 count, offset ligatures[];
+ ligature is: glyph result, u16 count, glyph components[]
+*/
+
+inline Substitution::operator bool() const
+{
+ return !(_left_is == T_NONE && _in_is == T_NONE && _out_is == T_NONE && _right_is == T_NONE);
+}
+
+inline bool Substitution::is_single() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPH && _right_is == T_NONE;
+}
+
+inline bool Substitution::is_multiple() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPHS && _right_is == T_NONE && !_alternate;
+}
+
+inline bool Substitution::is_alternate() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPHS && _right_is == T_NONE && _alternate;
+}
+
+inline bool Substitution::is_ligature() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPHS && _out_is == T_GLYPH && _right_is == T_NONE;
+}
+
+inline bool Substitution::is_simple_context() const
+{
+ return _left_is != T_COVERAGE && (_in_is == T_GLYPH || _in_is == T_GLYPHS) && (_out_is == T_GLYPH || _out_is == T_GLYPHS) && _right_is != T_COVERAGE;
+}
+
+inline bool Substitution::is_single_lcontext() const
+{
+ return _left_is == T_GLYPH && _in_is == T_GLYPH && _out_is == T_GLYPH && _right_is == T_NONE;
+}
+
+inline bool Substitution::is_single_rcontext() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPH && _right_is == T_GLYPH;
+}
+
+inline Glyph Substitution::left_glyph() const
+{
+ return extract_glyph(_left, _left_is);
+}
+
+inline int Substitution::left_nglyphs() const
+{
+ return extract_nglyphs(_left, _left_is, false);
+}
+
+inline Glyph Substitution::in_glyph() const
+{
+ return extract_glyph(_in, _in_is);
+}
+
+inline Glyph Substitution::in_glyph(int which) const
+{
+ return extract_glyph(_in, which, _in_is);
+}
+
+inline bool Substitution::in_glyphs(Vector<Glyph> &v) const
+{
+ return extract_glyphs(_in, _in_is, v, true);
+}
+
+inline int Substitution::in_nglyphs() const
+{
+ return extract_nglyphs(_in, _in_is, true);
+}
+
+inline bool Substitution::in_matches(int pos, Glyph g) const
+{
+ return matches(_in, _in_is, pos, g);
+}
+
+inline Glyph Substitution::out_glyph() const
+{
+ return extract_glyph(_out, _out_is);
+}
+
+inline Glyph Substitution::out_glyph(int which) const
+{
+ return extract_glyph(_out, which, _out_is);
+}
+
+inline bool Substitution::out_glyphs(Vector<Glyph> &v) const
+{
+ return extract_glyphs(_out, _out_is, v, false);
+}
+
+inline int Substitution::out_nglyphs() const
+{
+ return extract_nglyphs(_out, _out_is, false);
+}
+
+inline Glyph Substitution::right_glyph() const
+{
+ return extract_glyph(_right, _right_is);
+}
+
+inline const Glyph *Substitution::left_glyphptr() const
+{
+ return extract_glyphptr(_left, _left_is);
+}
+
+inline Glyph *Substitution::left_glyphptr()
+{
+ return extract_glyphptr(_left, _left_is);
+}
+
+inline const Glyph *Substitution::in_glyphptr() const
+{
+ return extract_glyphptr(_in, _in_is);
+}
+
+inline Glyph *Substitution::in_glyphptr()
+{
+ return extract_glyphptr(_in, _in_is);
+}
+
+inline const Glyph *Substitution::out_glyphptr() const
+{
+ return extract_glyphptr(_out, _out_is);
+}
+
+inline Glyph *Substitution::out_glyphptr()
+{
+ return extract_glyphptr(_out, _out_is);
+}
+
+inline const Glyph *Substitution::right_glyphptr() const
+{
+ return extract_glyphptr(_right, _right_is);
+}
+
+inline Glyph *Substitution::right_glyphptr()
+{
+ return extract_glyphptr(_right, _right_is);
+}
+
+inline StringAccum &operator<<(StringAccum &sa, const Substitution &sub)
+{
+ sub.unparse(sa);
+ return sa;
+}
+
+}}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otfname.hh b/Build/source/utils/lcdf-typetools/include/efont/otfname.hh
new file mode 100644
index 00000000000..2e18d0c7d41
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otfname.hh
@@ -0,0 +1,125 @@
+// -*- related-file-name: "../../libefont/otfname.cc" -*-
+#ifndef EFONT_OTFNAME_HH
+#define EFONT_OTFNAME_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh> // for ntohl()
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Name { public:
+
+ Name(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ enum NameID { N_COPYRIGHT = 0, N_FAMILY = 1, N_SUBFAMILY = 2,
+ N_UNIQUEID = 3, N_FULLNAME = 4, N_VERSION = 5,
+ N_POSTSCRIPT = 6, N_TRADEMARK = 7, N_MANUFACTURER = 8,
+ N_DESIGNER = 9, N_DESCRIPTION = 10, N_VENDOR_URL = 11,
+ N_DESIGNER_URL = 12, N_LICENSE_DESCRIPTION = 13,
+ N_LICENSE_URL = 14 };
+ enum Platform { P_UNICODE = 0, P_MACINTOSH = 1, P_MICROSOFT = 3 };
+ enum { HEADER_SIZE = 6, NAMEREC_SIZE = 12 };
+
+ typedef uint8_t namerecord_t[NAMEREC_SIZE];
+ typedef const namerecord_t *const_iterator;
+
+ inline static int nameid(const namerecord_t &);
+ inline static int platform(const namerecord_t &);
+ inline static int encoding(const namerecord_t &);
+ inline static int language(const namerecord_t &);
+
+ inline const_iterator begin() const;
+ inline const_iterator end() const;
+ String name(const_iterator) const;
+
+ struct PlatformPred {
+ inline PlatformPred(int nameid, int platform = -1, int encoding = -1, int language = -1);
+ inline bool operator()(const namerecord_t &) const;
+ private:
+ int _nameid, _platform, _encoding, _language;
+ };
+
+ struct EnglishPlatformPred {
+ EnglishPlatformPred(int nameid) : _nameid(nameid) { }
+ inline bool operator()(const namerecord_t &) const;
+ private:
+ int _nameid;
+ };
+
+ private:
+
+ String _str;
+ int _error;
+
+ int parse_header(ErrorHandler *);
+
+};
+
+
+#define USHORT_AT(d) (ntohs(*reinterpret_cast<const uint16_t *>(d)))
+
+inline int Name::nameid(const namerecord_t &nr)
+{
+ return USHORT_AT(reinterpret_cast<const uint8_t *>(&nr) + 6);
+}
+
+inline int Name::platform(const namerecord_t &nr)
+{
+ return USHORT_AT(reinterpret_cast<const uint8_t *>(&nr));
+}
+
+inline int Name::encoding(const namerecord_t &nr)
+{
+ return USHORT_AT(reinterpret_cast<const uint8_t *>(&nr) + 2);
+}
+
+inline int Name::language(const namerecord_t &nr)
+{
+ return USHORT_AT(reinterpret_cast<const uint8_t *>(&nr) + 4);
+}
+
+inline Name::const_iterator Name::begin() const
+{
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE);
+}
+
+inline Name::const_iterator Name::end() const
+{
+ if (_error >= 0) {
+ int count = USHORT_AT(_str.data() + 2);
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE + NAMEREC_SIZE * count);
+ } else
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE);
+}
+
+#undef USHORT_AT
+
+
+inline Name::PlatformPred::PlatformPred(int nid, int p, int e, int l)
+ : _nameid(nid), _platform(p), _encoding(e), _language(l)
+{
+}
+
+inline bool Name::PlatformPred::operator()(const namerecord_t &i) const
+{
+ return (_nameid == nameid(i))
+ && (_platform < 0 || _platform == platform(i))
+ && (_encoding < 0 || _encoding == encoding(i))
+ && (_language < 0 || _language == language(i));
+}
+
+inline bool Name::EnglishPlatformPred::operator()(const namerecord_t &i) const
+{
+ if (_nameid == nameid(i)) {
+ int p = platform(i), e = encoding(i), l = language(i);
+ return (p == P_MACINTOSH && e == 0 && l == 0)
+ || (p == P_MICROSOFT && e == 1 && l == 0x409);
+ } else
+ return false;
+}
+
+}}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/otfos2.hh b/Build/source/utils/lcdf-typetools/include/efont/otfos2.hh
new file mode 100644
index 00000000000..23cc513715a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/otfos2.hh
@@ -0,0 +1,69 @@
+// -*- related-file-name: "../../libefont/otfos2.cc" -*-
+#ifndef EFONT_OTFOS2_HH
+#define EFONT_OTFOS2_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Os2 { public:
+
+ Os2(const Data &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ enum Offsets { O_AVGCHARWIDTH = 2, O_SUBSCRIPTXSIZE = 10,
+ O_SUBSCRIPTYSIZE = 12, O_SUBSCRIPTXOFFSET = 14,
+ O_SUBSCRIPTYOFFSET = 16, O_SUPERSCRIPTXSIZE = 18,
+ O_SUPERSCRIPTYSIZE = 20, O_SUPERSCRIPTXOFFSET = 22,
+ O_SUPERSCRIPTYOFFSET = 24, O_STRIKEOUTSIZE = 26,
+ O_STRIKEOUTPOSITION = 28, O_TYPOASCENDER = 68,
+ O_TYPODESCENDER = 70, O_TYPOLINEGAP = 72,
+ O_XHEIGHT = 86, O_CAPHEIGHT = 88 };
+ enum { HEADER_SIZE = 2 };
+
+ inline int16_t typo_ascender() const throw (Bounds);
+ inline int16_t typo_descender() const throw (Bounds);
+ inline int16_t typo_line_gap() const throw (Bounds);
+ inline int16_t x_height() const throw (Bounds);
+ inline int16_t cap_height() const throw (Bounds);
+
+ private:
+
+ Data _data;
+ int _error;
+
+ int parse_header(ErrorHandler *);
+
+};
+
+
+inline int16_t Os2::typo_ascender() const throw (Bounds)
+{
+ return _data.s16(O_TYPOASCENDER);
+}
+
+inline int16_t Os2::typo_descender() const throw (Bounds)
+{
+ return _data.s16(O_TYPODESCENDER);
+}
+
+inline int16_t Os2::typo_line_gap() const throw (Bounds)
+{
+ return _data.s16(O_TYPOLINEGAP);
+}
+
+inline int16_t Os2::x_height() const throw (Bounds)
+{
+ return _data.s16(O_XHEIGHT);
+}
+
+inline int16_t Os2::cap_height() const throw (Bounds)
+{
+ return _data.s16(O_CAPHEIGHT);
+}
+
+}}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/pairop.hh b/Build/source/utils/lcdf-typetools/include/efont/pairop.hh
new file mode 100644
index 00000000000..bd37f27d56e
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/pairop.hh
@@ -0,0 +1,113 @@
+// -*- related-file-name: "../../libefont/pairop.cc" -*-
+#ifndef PAIROP_HH
+#define PAIROP_HH
+#include <efont/encoding.hh> /* get GlyphIndex */
+namespace Efont {
+
+enum PairOpDefs {
+
+ opNoop = -1,
+ opLigature = -2,
+
+ opLigSimple = 0,
+ opLigSaveLeft = 1,
+ opLigSaveRight = 2,
+ opLigPast1 = 4,
+ opLigPast2 = 8,
+
+ opAllblock = 0
+
+};
+
+
+typedef int PairOpIndex;
+
+
+class PairOp { public:
+
+ PairOp() { }
+ inline PairOp(GlyphIndex l, GlyphIndex r, int v, PairOpIndex nl);
+ inline PairOp(GlyphIndex l, GlyphIndex r, GlyphIndex x, int kind, PairOpIndex nl);
+
+ void noopify() { _val = opNoop; }
+ void set_value(int val) { _val = val; }
+
+ inline void set_next(PairOpIndex);
+
+ bool is_lig() const { return _val <= opLigature; }
+ bool is_kern() const { return _val >= 0; }
+ bool is_noop() const { return _val == opNoop; }
+ int lig_kind() const { assert(is_lig()); return -_val+opLigature; }
+
+ GlyphIndex left() const { return _left; }
+ GlyphIndex right() const { return _right; }
+ GlyphIndex result() const { assert(is_lig()); return _result; }
+ int value() const { return _val; }
+ PairOpIndex next_left() const { return _next_left; }
+
+ private:
+
+ GlyphIndex _left;
+ GlyphIndex _right;
+ GlyphIndex _result;
+ int _val;
+
+ PairOpIndex _next_left;
+
+};
+
+
+class PairProgram { public:
+
+ PairProgram() : _reversed(false) { }
+ PairProgram(const PairProgram &);
+
+ void reserve_glyphs(int);
+
+ PairOpIndex find_left(GlyphIndex gi) const { return _left_map[gi]; }
+ PairOpIndex find(GlyphIndex leftgi, GlyphIndex rightgi) const;
+
+ int op_count() const { return _op.size(); }
+ const PairOp &op(PairOpIndex i) const { return _op[i]; }
+
+ // Return true if it's a duplicate.
+ bool add_kern(GlyphIndex, GlyphIndex, int);
+ bool add_lig(GlyphIndex, GlyphIndex, GlyphIndex, int kind = opLigSimple);
+
+ void set_reversed(bool r) { _reversed = r; }
+ void unreverse();
+ void optimize();
+
+ void print() const;
+
+ private:
+
+ bool _reversed;
+ Vector<PairOpIndex> _left_map;
+ Vector<PairOp> _op;
+
+ inline const char *print_name(GlyphIndex) const;
+
+ PairProgram &operator=(const PairProgram &) { assert(0); return *this; }
+
+};
+
+
+inline PairOp::PairOp(GlyphIndex l, GlyphIndex r, int v, PairOpIndex nl)
+ : _left(l), _right(r), _val(v), _next_left(nl)
+{
+}
+
+inline PairOp::PairOp(GlyphIndex l, GlyphIndex r, GlyphIndex x, int kind,
+ PairOpIndex nl)
+ : _left(l), _right(r), _result(x), _val(opLigature - kind), _next_left(nl)
+{
+}
+
+inline void PairOp::set_next(PairOpIndex nl)
+{
+ _next_left = nl;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/psres.hh b/Build/source/utils/lcdf-typetools/include/efont/psres.hh
new file mode 100644
index 00000000000..b08e2fe35a5
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/psres.hh
@@ -0,0 +1,74 @@
+// -*- related-file-name: "../../libefont/psres.cc" -*-
+#ifndef EFONT_PSRES_HH
+#define EFONT_PSRES_HH
+#include <lcdf/vector.hh>
+#include <lcdf/hashmap.hh>
+#include <lcdf/string.hh>
+#include <lcdf/filename.hh>
+class Slurper;
+namespace Efont {
+class PsresDatabaseSection;
+
+class PsresDatabase { public:
+
+ PsresDatabase();
+ ~PsresDatabase();
+
+ void add_psres_path(const char* path, const char* defaults, bool override);
+ bool add_psres_file(Filename&, bool override);
+ void add_database(PsresDatabase*, bool override);
+
+ inline PsresDatabaseSection* section(PermString section) const;
+ const String& value(PermString section, PermString key) const;
+ const String& unescaped_value(PermString section, PermString key) const;
+ Filename filename_value(PermString section, PermString key) const;
+
+ private:
+
+ HashMap<PermString, int> _section_map;
+ Vector<PsresDatabaseSection*> _sections;
+
+ PsresDatabaseSection* force_section(PermString);
+ bool add_one_psres_file(Slurper&, bool override);
+ void add_psres_directory(PermString);
+
+};
+
+class PsresDatabaseSection { public:
+
+ PsresDatabaseSection(PermString);
+
+ PermString section_name() const { return _section_name; }
+
+ void add_psres_file_section(Slurper&, PermString, bool);
+ void add_section(PsresDatabaseSection*, bool override);
+
+ const String& value(PermString key) { return value(_map[key]); }
+ inline const String& unescaped_value(PermString key) const;
+ Filename filename_value(PermString key);
+
+ private:
+
+ PermString _section_name;
+ HashMap<PermString, int> _map;
+ Vector<PermString> _directories;
+ Vector<String> _values;
+ Vector<int> _value_escaped;
+
+ const String& value(int index);
+
+};
+
+inline PsresDatabaseSection* PsresDatabase::section(PermString n) const
+{
+ return _sections[_section_map[n]];
+}
+
+inline const String& PsresDatabaseSection::unescaped_value(PermString key) const
+{
+ assert(!_value_escaped[_map[key]]);
+ return _values[_map[key]];
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1bounds.hh b/Build/source/utils/lcdf-typetools/include/efont/t1bounds.hh
new file mode 100644
index 00000000000..116705f9a10
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1bounds.hh
@@ -0,0 +1,93 @@
+// -*- related-file-name: "../../libefont/t1bounds.cc" -*-
+#ifndef EFONT_T1BOUNDS_HH
+#define EFONT_T1BOUNDS_HH
+#include <efont/t1interp.hh>
+#include <lcdf/transform.hh>
+namespace Efont {
+
+class CharstringBounds : public CharstringInterp { public:
+
+ CharstringBounds();
+ CharstringBounds(const Transform&);
+ CharstringBounds(const Transform&, const Vector<double>& weight_vec);
+ ~CharstringBounds() { }
+
+ const Point& width() const { return _width; }
+ double x_width() const { return _width.x; }
+ bool bb_known() const { return KNOWN(_lb.x); }
+ double bb_left() const { return _lb.x; }
+ double bb_top() const { return _rt.y; }
+ double bb_right() const { return _rt.x; }
+ double bb_bottom() const { return _lb.y; }
+ const Point& bb_bottom_left() const { return _lb; }
+ const Point& bb_top_right() const { return _rt; }
+
+ void act_width(int, const Point&);
+ void act_line(int, const Point&, const Point&);
+ void act_curve(int, const Point&, const Point&, const Point&, const Point&);
+ inline void mark(const Point&);
+
+ void clear();
+ bool char_bounds(const CharstringContext&, bool shift = true);
+ void translate(double dx, double dy);
+ inline Point transform(const Point &) const;
+ bool output(int bb[4], int& width, bool use_cur_width = false) const;
+
+ static bool bounds(const CharstringContext&, int bounds[4], int& width);
+ static bool bounds(const Transform&, const CharstringContext&, int bounds[4], int& width);
+
+ private:
+
+ Point _lb;
+ Point _rt;
+ Point _width;
+ Transform _xf;
+ Transform _nonfont_xf;
+ const CharstringProgram* _last_xf_program;
+
+ void set_xf(const CharstringProgram*);
+
+ inline void xf_mark(const Point&);
+ void xf_mark(const Bezier&);
+
+ inline bool xf_inside(const Point&) const;
+ inline bool xf_controls_inside(const Bezier&) const;
+
+};
+
+inline void CharstringBounds::xf_mark(const Point& p)
+{
+ if (!KNOWN(_lb.x))
+ _lb = _rt = p;
+ if (p.x < _lb.x)
+ _lb.x = p.x;
+ else if (p.x > _rt.x)
+ _rt.x = p.x;
+ if (p.y < _lb.y)
+ _lb.y = p.y;
+ else if (p.y > _rt.y)
+ _rt.y = p.y;
+}
+
+inline void CharstringBounds::mark(const Point& p)
+{
+ xf_mark(p * _xf);
+}
+
+inline bool CharstringBounds::xf_inside(const Point& p) const
+{
+ return p.x >= _lb.x && p.x <= _rt.x && p.y >= _lb.y && p.y <= _rt.y;
+}
+
+inline bool CharstringBounds::xf_controls_inside(const Bezier& b) const
+{
+ return xf_inside(b.point(1)) && xf_inside(b.point(2));
+}
+
+inline Point CharstringBounds::transform(const Point& p) const
+{
+ return p * _xf;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1cs.hh b/Build/source/utils/lcdf-typetools/include/efont/t1cs.hh
new file mode 100644
index 00000000000..63d7236b898
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1cs.hh
@@ -0,0 +1,339 @@
+// -*- related-file-name: "../../libefont/t1cs.cc" -*-
+#ifndef EFONT_T1CS_HH
+#define EFONT_T1CS_HH
+#include <lcdf/permstr.hh>
+#include <lcdf/string.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/inttypes.h>
+namespace Efont {
+
+// Allow unknown doubles to have some `fuzz' -- so if an unknown double
+// is a bit off from the canonical UNKDOUBLE value, we'll still recognize
+// it as unknown. (Useful for interpolation.)
+#define UNKDOUBLE -9.79797e97
+#define MIN_KNOWN_DOUBLE -9.69696e97
+#define KNOWN(d) ((d) >= MIN_KNOWN_DOUBLE)
+
+class CharstringProgram;
+class CharstringInterp;
+struct CharstringContext;
+class MultipleMasterSpace;
+class Type1Encoding;
+
+class Charstring { public:
+
+ Charstring() { }
+ virtual ~Charstring();
+
+ virtual bool process(CharstringInterp &) const = 0;
+
+ enum Commands {
+ cError = 0,
+ cHstem = 1,
+ cVstem = 3,
+ cVmoveto = 4,
+ cRlineto = 5,
+ cHlineto = 6,
+ cVlineto = 7,
+ cRrcurveto = 8,
+ cClosepath = 9,
+ cCallsubr = 10,
+ cReturn = 11,
+ cEscape = 12,
+ cHsbw = 13,
+ cEndchar = 14,
+ cBlend = 16,
+ cHstemhm = 18,
+ cHintmask = 19,
+ cCntrmask = 20,
+ cRmoveto = 21,
+ cHmoveto = 22,
+ cVstemhm = 23,
+ cRcurveline = 24,
+ cRlinecurve = 25,
+ cVvcurveto = 26,
+ cHhcurveto = 27,
+ cShortint = 28,
+ cCallgsubr = 29,
+ cVhcurveto = 30,
+ cHvcurveto = 31,
+
+ cEscapeDelta = 32,
+ cDotsection = 32 + 0,
+ cVstem3 = 32 + 1,
+ cHstem3 = 32 + 2,
+ cAnd = 32 + 3,
+ cOr = 32 + 4,
+ cNot = 32 + 5,
+ cSeac = 32 + 6,
+ cSbw = 32 + 7,
+ cStore = 32 + 8,
+ cAbs = 32 + 9,
+ cAdd = 32 + 10,
+ cSub = 32 + 11,
+ cDiv = 32 + 12,
+ cLoad = 32 + 13,
+ cNeg = 32 + 14,
+ cEq = 32 + 15,
+ cCallothersubr = 32 + 16,
+ cPop = 32 + 17,
+ cDrop = 32 + 18,
+ cPut = 32 + 20,
+ cGet = 32 + 21,
+ cIfelse = 32 + 22,
+ cRandom = 32 + 23,
+ cMul = 32 + 24,
+ cSqrt = 32 + 26,
+ cDup = 32 + 27,
+ cExch = 32 + 28,
+ cIndex = 32 + 29,
+ cRoll = 32 + 30,
+ cSetcurrentpoint = 32 + 33,
+ cHflex = 32 + 34,
+ cFlex = 32 + 35,
+ cHflex1 = 32 + 36,
+ cFlex1 = 32 + 37,
+
+ cLastCommand = cFlex1
+ };
+
+ enum OthersubrCommands {
+ othcFlexend = 0,
+ othcFlexbegin = 1,
+ othcFlexmiddle = 2,
+ othcReplacehints = 3,
+ othcMM1 = 14,
+ othcMM2 = 15,
+ othcMM3 = 16,
+ othcMM4 = 17,
+ othcMM6 = 18,
+ othcITC_load = 19,
+ othcITC_add = 20,
+ othcITC_sub = 21,
+ othcITC_mul = 22,
+ othcITC_div = 23,
+ othcITC_put = 24,
+ othcITC_get = 25,
+ othcITC_unknown = 26,
+ othcITC_ifelse = 27,
+ othcITC_random = 28
+ };
+
+ static String command_name(int);
+ static const char * const command_names[];
+
+ static const char * const standard_encoding[256];
+
+};
+
+
+class Type1Charstring : public Charstring { public:
+
+ Type1Charstring() { }
+ inline Type1Charstring(const String &); // unencrypted
+ Type1Charstring(int lenIV, const String &); // encrypted
+ // default copy constructor
+ // default destructor
+ // default assignment operator
+
+ inline const uint8_t *data() const;
+ int length() const { return _s.length(); }
+ operator bool() const { return _s.length() != 0; }
+
+ inline const String &data_string() const;
+ inline String substring(int pos, int len) const;
+ int first_caret_after(int pos) const;
+
+ inline void assign(const String &);
+ void prepend(const Type1Charstring &);
+ void assign_substring(int pos, int len, const String &);
+
+ bool process(CharstringInterp &) const;
+
+ private:
+
+ mutable String _s;
+ mutable int _key;
+
+ void decrypt() const;
+
+};
+
+
+class Type2Charstring : public Charstring { public:
+
+ Type2Charstring() { }
+ inline Type2Charstring(const String &);
+ // default copy constructor
+ // default destructor
+ // default assignment operator
+
+ inline const uint8_t *data() const;
+ int length() const { return _s.length(); }
+
+ bool process(CharstringInterp &) const;
+
+ private:
+
+ String _s;
+
+};
+
+
+struct CharstringContext {
+
+ CharstringContext(const CharstringProgram *program_, const Charstring *cs_) : program(program_), cs(cs_) { }
+
+ operator bool() const { return cs != 0; }
+
+ const CharstringProgram *program;
+ const Charstring *cs;
+
+};
+
+
+class CharstringProgram { public:
+
+ CharstringProgram() : _parent_program(false) { }
+ virtual ~CharstringProgram() { }
+
+ virtual PermString font_name() const { return PermString();}
+ virtual void font_matrix(double[6]) const;
+
+ inline const CharstringProgram *program(int) const;
+ virtual const CharstringProgram *child_program(int) const;
+ bool parent_program() const { return _parent_program; }
+ void set_parent_program(bool pp) { _parent_program = pp; }
+
+ virtual int nsubrs() const { return 0; }
+ virtual Charstring *subr(int) const { return 0; }
+ virtual int subr_bias() const { return 0; }
+
+ virtual int ngsubrs() const { return 0; }
+ virtual Charstring *gsubr(int) const { return 0; }
+ virtual int gsubr_bias() const { return 0; }
+
+ inline int nxsubrs(bool g) const;
+ inline Charstring *xsubr(bool g, int) const;
+ inline int xsubr_bias(bool g) const;
+
+ virtual int nglyphs() const { return 0; }
+ virtual PermString glyph_name(int) const { return PermString();}
+ virtual void glyph_names(Vector<PermString> &) const;
+ virtual Charstring *glyph(int) const { return 0; }
+ virtual Charstring *glyph(PermString) const { return 0; }
+
+ inline CharstringContext glyph_context(int) const;
+ inline CharstringContext glyph_context(PermString) const;
+
+ virtual bool is_mm() const { return mmspace() != 0; }
+ virtual MultipleMasterSpace *mmspace() const { return 0; }
+ enum VectorType { VEC_WEIGHT = 0, VEC_NORM_DESIGN = 1, VEC_DESIGN = 2 };
+ virtual Vector<double> *mm_vector(VectorType, bool writable) const;
+
+ virtual Type1Encoding *type1_encoding() const { return 0; }
+
+ virtual double global_width_x(bool is_nominal) const;
+
+ private:
+
+ bool _parent_program;
+
+};
+
+
+enum Type1Defs {
+ t1Warmup_ee = 4,
+ t1R_ee = 55665,
+ t1R_cs = 4330,
+ t1C1 = 52845,
+ t1C2 = 22719
+};
+
+
+inline Type1Charstring::Type1Charstring(const String &s)
+ : _s(s), _key(-1)
+{
+}
+
+inline void Type1Charstring::assign(const String &s)
+{
+ _s = s;
+ _key = -1;
+}
+
+inline const uint8_t *Type1Charstring::data() const
+{
+ if (_key >= 0)
+ decrypt();
+ return reinterpret_cast<const uint8_t *>(_s.data());
+}
+
+inline const String &Type1Charstring::data_string() const
+{
+ if (_key >= 0)
+ decrypt();
+ return _s;
+}
+
+inline String Type1Charstring::substring(int pos, int len) const
+{
+ if (_key >= 0)
+ decrypt();
+ return _s.substring(pos, len);
+}
+
+inline bool operator==(const Type1Charstring &a, const Type1Charstring &b)
+{
+ return a.data_string() == b.data_string();
+}
+
+
+inline Type2Charstring::Type2Charstring(const String &s)
+ : _s(s)
+{
+}
+
+inline const uint8_t *Type2Charstring::data() const
+{
+ return reinterpret_cast<const uint8_t *>(_s.data());
+}
+
+
+inline int CharstringProgram::nxsubrs(bool g) const
+{
+ return (g ? ngsubrs() : nsubrs());
+}
+
+inline Charstring *CharstringProgram::xsubr(bool g, int i) const
+{
+ return (g ? gsubr(i) : subr(i));
+}
+
+inline int CharstringProgram::xsubr_bias(bool g) const
+{
+ return (g ? gsubr_bias() : subr_bias());
+}
+
+inline const CharstringProgram *CharstringProgram::program(int gi) const
+{
+ return (_parent_program ? child_program(gi) : this);
+}
+
+inline CharstringContext CharstringProgram::glyph_context(int gi) const
+{
+ if (!_parent_program)
+ return CharstringContext(this, glyph(gi));
+ else if (const CharstringProgram *p = child_program(gi))
+ return CharstringContext(p, p->glyph(gi));
+ else
+ return CharstringContext(0, 0);
+}
+
+inline CharstringContext CharstringProgram::glyph_context(PermString gn) const
+{
+ return CharstringContext(this, glyph(gn));
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1csgen.hh b/Build/source/utils/lcdf-typetools/include/efont/t1csgen.hh
new file mode 100644
index 00000000000..af8c16a7080
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1csgen.hh
@@ -0,0 +1,119 @@
+// -*- related-file-name: "../../libefont/t1csgen.cc" -*-
+#ifndef EFONT_T1CSGEN_HH
+#define EFONT_T1CSGEN_HH
+#include <efont/t1interp.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+class Type1Font;
+
+class Type1CharstringGen { public:
+
+ Type1CharstringGen(int precision = 5);
+
+ int precision() const { return _precision; }
+
+ void clear();
+ char *data() const { return _ncs.data(); }
+ int length() const { return _ncs.length(); }
+
+ void gen_number(double, int = 0);
+ void gen_command(int);
+ void gen_stack(CharstringInterp &, int for_cmd);
+
+ void append_charstring(const String &);
+
+ const Point &current_point(bool real) const { return (real ? _true : _false); }
+ void gen_moveto(const Point &, bool closepath);
+
+ inline String take_string();
+ Type1Charstring *output();
+ void output(Type1Charstring &);
+
+ static String callsubr_string(int subr);
+
+ private:
+
+ StringAccum _ncs;
+ int _precision;
+ double _f_precision;
+
+ Point _true;
+ Point _false;
+
+ enum State { S_INITIAL, S_GEN };
+ State _state;
+
+};
+
+class Type1CharstringGenInterp : public CharstringInterp { public:
+
+ Type1CharstringGenInterp(int precision);
+
+ int precision() const { return _csgen.precision(); }
+ void set_direct_hint_replacement(bool dhr) { _direct_hr = dhr; }
+ void set_hint_replacement_storage(Type1Font *);
+
+ int nhints() const { return _stem_hstem.size(); }
+ double max_flex_height() const { return _max_flex_height; }
+ bool bad_flex() const { return _bad_flex; }
+
+ const Type1CharstringGen &csgen() const { return _csgen; }
+
+ void act_width(int, const Point &);
+ void act_seac(int, double, double, double, int, int);
+
+ void act_hstem(int, double, double);
+ void act_vstem(int, double, double);
+ void act_hintmask(int, const unsigned char *, int);
+
+ void act_line(int, const Point &, const Point &);
+ void act_curve(int, const Point &, const Point &, const Point &, const Point &);
+ void act_closepath(int);
+ void act_flex(int, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, double);
+
+ void intermediate_output(Type1Charstring &out);
+ void run(const CharstringContext &g, Type1Charstring &out);
+
+ private:
+
+ // output
+ Type1CharstringGen _csgen;
+ mutable Type1CharstringGen _hint_csgen;
+
+ // current glyph
+ Point _width;
+ enum State { S_INITIAL, S_OPEN, S_CLOSED, S_SEAC };
+ State _state;
+
+ // hints and hint replacement
+ Vector<double> _stem_pos;
+ Vector<double> _stem_width;
+ Vector<int> _stem_hstem;
+ String _last_hints;
+
+ bool _in_hr;
+ bool _direct_hr;
+ int _hr_firstsubr;
+ Type1Font *_hr_storage;
+
+ // Flex
+ double _max_flex_height;
+ bool _bad_flex;
+
+ inline void gen_number(double, int = 0);
+ inline void gen_command(int);
+ void gen_sbw(bool hints_follow);
+ String gen_hints(const unsigned char *, int) const;
+ void swap_stem_hints();
+
+};
+
+inline String Type1CharstringGen::take_string()
+{
+ String s = _ncs.take_string();
+ clear();
+ return s;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1font.hh b/Build/source/utils/lcdf-typetools/include/efont/t1font.hh
new file mode 100644
index 00000000000..887e141c8e5
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1font.hh
@@ -0,0 +1,167 @@
+// -*- related-file-name: "../../libefont/t1font.cc" -*-
+#ifndef EFONT_T1FONT_HH
+#define EFONT_T1FONT_HH
+#include <efont/t1cs.hh>
+#include <lcdf/hashmap.hh>
+class StringAccum;
+class ErrorHandler;
+namespace Efont {
+class Type1Item;
+class Type1Definition;
+class Type1Encoding;
+class Type1IncludedFont;
+class Type1Subr;
+class Type1Reader;
+class Type1Writer;
+class MultipleMasterSpace;
+
+class Type1Font : public CharstringProgram { public:
+
+ Type1Font(Type1Reader &);
+ ~Type1Font();
+
+ int read(Type1Reader &);
+
+ bool ok() const;
+
+ inline PermString font_name() const;
+ void font_matrix(double[6]) const;
+
+ int nitems() const { return _items.size(); }
+ Type1Item *item(int i) const { return _items[i]; }
+ void add_item(Type1Item *it) { _items.push_back(it); }
+ void add_definition(int dict, Type1Definition *);
+ void add_type1_encoding(Type1Encoding *);
+
+ int nsubrs() const { return _subrs.size(); }
+ Type1Charstring *subr(int) const;
+
+ int nglyphs() const { return _glyphs.size(); }
+ PermString glyph_name(int) const;
+ Type1Charstring *glyph(int) const;
+ Type1Charstring *glyph(PermString) const;
+ void add_glyph(Type1Subr *);
+
+ Type1Subr *subr_x(int i) const { return _subrs[i]; }
+ bool set_subr(int, const Type1Charstring &, PermString definer = PermString());
+ bool remove_subr(int);
+ void fill_in_subrs();
+ void renumber_subrs(const Vector<int> &); // dangerous!
+
+ Type1Subr *glyph_x(int i) const { return _glyphs[i]; }
+
+ Type1Encoding *type1_encoding() const { return _encoding; }
+
+ // note: the order is relevant
+ enum Dict {
+ dFont = 0, dF = dFont,
+ dFontInfo = 1, dFI = dFontInfo,
+ dPrivate = 2, dP = dPrivate,
+ dBlend = 3, dB = dBlend,
+ dBlendFontInfo = dB+dFI, dBFI = dBlendFontInfo,
+ dBlendPrivate = dB+dP, dBP = dBlendPrivate,
+ dLast
+ };
+
+ Type1Definition *dict(int d, PermString s) const { return _dict[d][s]; }
+ Type1Definition *dict(PermString s) const { return _dict[dF][s]; }
+ Type1Definition *p_dict(PermString s) const { return _dict[dP][s]; }
+ Type1Definition *b_dict(PermString s) const { return _dict[dB][s]; }
+ Type1Definition *bp_dict(PermString s) const { return _dict[dBP][s];}
+ Type1Definition *fi_dict(PermString s) const { return _dict[dFI][s];}
+
+ typedef HashMap<PermString, Type1Definition *> DictHashMap;
+ inline DictHashMap::const_iterator dict_begin(int dict) const;
+ inline DictHashMap::iterator dict_begin(int dict);
+ int first_dict_item(int d) const { return _index[d]; }
+
+ Type1Definition *ensure(Dict, PermString);
+ void add_header_comment(const String &);
+
+ MultipleMasterSpace *create_mmspace(ErrorHandler * = 0) const;
+ MultipleMasterSpace *mmspace() const;
+
+ void undo_synthetic();
+
+ void set_charstring_definer(PermString d) { _charstring_definer = d; }
+
+ void write(Type1Writer &);
+
+ // font skeletons
+ static Type1Font *skeleton_make(PermString, const String &version = String());
+ static Type1Font *skeleton_make_copy(const Type1Font *, PermString);
+ void skeleton_comments_end();
+ void skeleton_fontinfo_end();
+ void skeleton_fontdict_end();
+ void skeleton_private_end();
+ void skeleton_common_subrs();
+
+ // for experts only
+ void set_item(int, Type1Item *);
+ inline void set_dict(int dict, PermString, Type1Definition *);
+ void uncache_defs();
+
+ private:
+
+ mutable bool _cached_defs;
+ bool _built;
+ mutable PermString _font_name;
+
+ Vector<Type1Item *> _items;
+
+ HashMap<PermString, Type1Definition *> *_dict;
+ int _index[dLast];
+ int _dict_deltas[dLast];
+
+ Vector<Type1Subr *> _subrs;
+ Vector<Type1Subr *> _glyphs;
+ HashMap<PermString, int> _glyph_map;
+
+ PermString _charstring_definer;
+ Type1Encoding *_encoding;
+
+ mutable bool _cached_mmspace;
+ mutable MultipleMasterSpace *_mmspace;
+
+ Type1IncludedFont *_synthetic_item;
+
+ Type1Font(PermString);
+ Type1Font(const Type1Font &);
+ Type1Font &operator=(const Type1Font &);
+
+ void read_encoding(Type1Reader &, const char *);
+ bool read_synthetic_font(Type1Reader &, const char *, StringAccum &);
+ void cache_defs() const;
+ void shift_indices(int, int);
+
+ Type1Item *dict_size_item(int) const;
+ int get_dict_size(int) const;
+ void set_dict_size(int, int);
+
+};
+
+
+inline Type1Font::DictHashMap::const_iterator Type1Font::dict_begin(int dict) const
+{
+ return _dict[dict].begin();
+}
+
+inline Type1Font::DictHashMap::iterator Type1Font::dict_begin(int dict)
+{
+ return _dict[dict].begin();
+}
+
+inline void Type1Font::set_dict(int dict, PermString name, Type1Definition *t1d)
+{
+ _dict[dict].insert(name, t1d);
+}
+
+inline PermString Type1Font::font_name() const
+{
+ if (!_cached_defs)
+ cache_defs();
+ return _font_name;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1interp.hh b/Build/source/utils/lcdf-typetools/include/efont/t1interp.hh
new file mode 100644
index 00000000000..934c0a5885f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1interp.hh
@@ -0,0 +1,239 @@
+// -*- related-file-name: "../../libefont/t1interp.cc" -*-
+#ifndef EFONT_T1INTERP_HH
+#define EFONT_T1INTERP_HH
+#include <efont/t1cs.hh>
+#include <lcdf/point.hh>
+#include <stdio.h>
+namespace Efont {
+
+class CharstringInterp { public:
+
+ CharstringInterp();
+ CharstringInterp(const Vector<double> &weight_vec);
+ virtual ~CharstringInterp() { }
+
+ int error() const { return _error; }
+ int error_data() const { return _error_data; }
+ static String error_string(int error, int error_data);
+ inline String error_string() const;
+
+ bool careful() const { return _careful; }
+ void set_careful(bool c) { _careful = c; }
+
+ bool done() const { return _done; }
+ void set_done() { _done = true; }
+
+ int size() const { return _sp; }
+ double &at(unsigned i) { return _s[i]; }
+ double &top(unsigned i = 0) { return _s[_sp - i - 1]; }
+ double pop(unsigned n = 1) { _sp -= n; return _s[_sp]; }
+ inline void push(double);
+ void clear() { _sp = 0; }
+
+ int ps_size() const { return _ps_sp; }
+ double ps_at(unsigned i) const { return _ps_s[i]; }
+ double ps_pop() { return _ps_s[--_ps_sp]; }
+ inline void ps_push(double);
+ void ps_clear() { _ps_sp = 0; }
+
+ int subr_depth() const { return _subr_depth; }
+
+ inline double &vec(Vector<double> *, int);
+ const Vector<double> &weight_vector() const { return _weight_vector; }
+ Vector<double> *scratch_vector() { return &_scratch_vector; }
+
+ const CharstringProgram *program() const { return _program; }
+ inline Charstring *get_subr(int) const;
+ inline Charstring *get_gsubr(int) const;
+ inline Charstring *get_xsubr(bool g, int) const;
+ inline Charstring *get_glyph(PermString) const;
+
+ bool interpret(const CharstringProgram *, const Charstring *);
+ inline bool interpret(const CharstringContext &);
+
+ //virtual void init(const CharstringProgram *);
+ bool error(int c) { return error(c, 0); }
+ virtual bool error(int, int);
+ virtual bool number(double);
+
+ bool arith_command(int);
+ bool vector_command(int);
+ bool blend_command();
+ bool callsubr_command();
+ bool callgsubr_command();
+ inline bool callxsubr_command(bool g);
+ bool mm_command(int, int);
+ bool itc_command(int, int);
+
+ const Point &left_sidebearing() const { return _lsb; }
+ const Point &currentpoint() const { return _cp; }
+ void set_state_path() { _state = S_PATH; }
+
+ virtual bool callothersubr_command(int, int);
+ virtual bool type1_command(int);
+ virtual bool type2_command(int, const uint8_t *, int *);
+
+ virtual void act_sidebearing(int cmd, const Point &lsb);
+ virtual void act_width(int cmd, const Point &width);
+ virtual void act_default_width(int cmd);
+ virtual void act_nominal_width_delta(int cmd, double delta);
+ virtual void act_seac(int cmd, double asb, double adx, double ady, int bchar, int achar);
+
+ virtual void act_line(int cmd, const Point &p0, const Point &p1);
+ virtual void act_curve(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3);
+ virtual void act_closepath(int cmd);
+
+ virtual void act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth);
+
+ virtual void act_hstem(int cmd, double y, double dy);
+ virtual void act_vstem(int cmd, double x, double dx);
+ virtual void act_hstem3(int cmd, double y0, double dy0, double y1, double dy1, double y2, double dy2);
+ virtual void act_vstem3(int cmd, double x0, double dx0, double x1, double dx1, double x2, double dx2);
+ virtual void act_hintmask(int cmd, const uint8_t *data, int nhints);
+
+ typedef Charstring Cs;
+
+ enum Errors {
+ errOK = 0,
+ errInternal = -1,
+ errRunoff = -2,
+ errUnimplemented = -3,
+ errOverflow = -4,
+ errUnderflow = -5,
+ errVector = -6,
+ errValue = -7,
+ errSubr = -8,
+ errGlyph = -9,
+ errCurrentPoint = -10,
+ errFlex = -11,
+ errMultipleMaster = -12,
+ errOpenStroke = -13,
+ errLateSidebearing = -14,
+ errOthersubr = -15,
+ errOrdering = -16,
+ errHintmask = -17,
+ errSubrDepth = -18,
+ errLastError = -18
+ };
+
+ enum { STACK_SIZE = 48, PS_STACK_SIZE = 24, MAX_SUBR_DEPTH = 10,
+ SCRATCH_SIZE = 32 };
+
+ private:
+
+ int _error;
+ int _error_data;
+ bool _done;
+ bool _careful;
+
+ double _s[STACK_SIZE];
+ int _sp;
+ double _ps_s[PS_STACK_SIZE];
+ int _ps_sp;
+
+ int _subr_depth;
+
+ Vector<double> _weight_vector;
+ Vector<double> _scratch_vector;
+
+ Point _lsb;
+ Point _cp;
+ Point _seac_origin;
+
+ const CharstringProgram *_program;
+
+ enum State {
+ S_INITIAL, S_SEAC, S_SBW, S_HSTEM, S_VSTEM, S_HINTMASK, S_IPATH, S_PATH
+ };
+ State _state;
+ bool _flex;
+
+ // for processing Type 2 charstrings
+ int _t2nhints;
+
+ static double double_for_error;
+
+ void initialize();
+
+ inline void ensure_weight_vector();
+ void fetch_weight_vector();
+
+ bool roll_command();
+ int type2_handle_width(int, bool);
+
+ inline void actp_rmoveto(int, double, double);
+ inline void actp_rlineto(int, double, double);
+ void actp_rrcurveto(int, double, double, double, double, double, double);
+ void actp_rrflex(int, double, double, double, double, double, double, double, double, double, double, double, double, double);
+
+};
+
+
+inline String CharstringInterp::error_string() const
+{
+ return error_string(_error, _error_data);
+}
+
+inline void CharstringInterp::push(double d)
+{
+ if (_sp < STACK_SIZE)
+ _s[_sp++] = d;
+ else
+ error(errOverflow);
+}
+
+inline void CharstringInterp::ps_push(double d)
+{
+ if (_ps_sp < PS_STACK_SIZE)
+ _ps_s[_ps_sp++] = d;
+ else
+ error(errOverflow);
+}
+
+inline double &CharstringInterp::vec(Vector<double> *v, int i)
+{
+ if (i < 0 || i >= v->size()) {
+ error(errVector);
+ return double_for_error;
+ } else
+ return v->at_u(i);
+}
+
+inline Charstring *CharstringInterp::get_subr(int n) const
+{
+ return _program ? _program->subr(n) : 0;
+}
+
+inline Charstring *CharstringInterp::get_gsubr(int n) const
+{
+ return _program ? _program->gsubr(n) : 0;
+}
+
+inline Charstring *CharstringInterp::get_xsubr(bool g, int n) const
+{
+ return _program ? _program->xsubr(g, n) : 0;
+}
+
+inline Charstring *CharstringInterp::get_glyph(PermString n) const
+{
+ return _program ? _program->glyph(n) : 0;
+}
+
+inline void CharstringInterp::ensure_weight_vector()
+{
+ if (!_weight_vector.size())
+ fetch_weight_vector();
+}
+
+inline bool CharstringInterp::callxsubr_command(bool g)
+{
+ return (g ? callgsubr_command() : callsubr_command());
+}
+
+inline bool CharstringInterp::interpret(const CharstringContext &g)
+{
+ return interpret(g.program, g.cs);
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1item.hh b/Build/source/utils/lcdf-typetools/include/efont/t1item.hh
new file mode 100644
index 00000000000..7358410e38e
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1item.hh
@@ -0,0 +1,268 @@
+// -*- related-file-name: "../../libefont/t1item.cc" -*-
+#ifndef EFONT_T1ITEM_HH
+#define EFONT_T1ITEM_HH
+#include <efont/t1cs.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+class Type1Reader;
+class Type1Writer;
+class CharstringInterp;
+class Type1Font;
+class Type1CopyItem;
+class Type1Subr;
+class Type1SubrGroupItem;
+class Type1Definition;
+
+class Type1Item { public:
+
+ Type1Item() { }
+ virtual ~Type1Item() { }
+
+ virtual void gen(Type1Writer &) = 0;
+
+ virtual Type1CopyItem *cast_copy() { return 0; }
+ virtual Type1Subr *cast_subr() { return 0; }
+ virtual Type1Definition *cast_definition() { return 0; }
+ virtual Type1SubrGroupItem *cast_subr_group() { return 0; }
+
+ private:
+
+ Type1Item(const Type1Item &);
+ Type1Item &operator=(const Type1Item &);
+
+};
+
+class Type1NullItem : public Type1Item { public:
+
+ Type1NullItem() { }
+
+ void gen(Type1Writer &);
+
+};
+
+class Type1CopyItem : public Type1Item { public:
+
+ Type1CopyItem(const String &s) : _value(s) { }
+ ~Type1CopyItem() { }
+
+ const String &value() const { return _value; }
+ int length() const { return _value.length(); }
+
+ void set_value(const String &s) { _value = s; }
+
+ void gen(Type1Writer &);
+
+ Type1CopyItem *cast_copy() { return this; }
+
+ private:
+
+ String _value;
+
+};
+
+class Type1EexecItem : public Type1Item { public:
+
+ Type1EexecItem(bool on) : _eexec_on(on) { }
+
+ void gen(Type1Writer &w);
+
+ private:
+
+ bool _eexec_on;
+
+};
+
+class Type1Definition : public Type1Item { public:
+
+ typedef Vector<double> NumVector;
+
+ Type1Definition(PermString, const String &, PermString);
+ ~Type1Definition() { }
+ static Type1Definition *make(StringAccum &, Type1Reader * = 0, bool force = false);
+ static Type1Definition *make_string(PermString, const String &, PermString);
+ static inline Type1Definition *make_literal(PermString, const String &, PermString);
+ static inline Type1Definition *make(PermString, double, PermString);
+
+ PermString name() const { return _name; }
+ const String &value() const { return _val; }
+ PermString definer() const { return _definer; }
+
+ bool value_bool(bool &) const;
+ bool value_int(int &) const;
+ bool value_num(double &) const;
+ bool value_string(String &) const;
+ bool value_name(PermString &) const;
+ bool value_numvec(NumVector &) const;
+ bool value_numvec_vec(Vector<NumVector> &) const;
+ bool value_normalize(Vector<NumVector> &in, Vector<NumVector> &out) const;
+ bool value_namevec(Vector<PermString> &) const;
+
+ void set_bool(bool);
+ void set_int(int);
+ void set_num(double);
+ void set_string(const String &);
+ void set_name(PermString, bool name = true);
+ void set_code(const char *s) { set_val(s); }
+ void set_numvec(const NumVector &, bool executable = false);
+ void set_numvec_vec(const Vector<NumVector> &);
+ void set_normalize(const Vector<NumVector> &, const Vector<NumVector> &);
+ void set_namevec(const Vector<PermString> &, bool executable = true);
+
+ void gen(Type1Writer &);
+ void gen(StringAccum &);
+
+ Type1Definition *cast_definition() { return this; }
+
+ private:
+
+ PermString _name;
+ String _val;
+ PermString _definer;
+
+ static int slurp_string(StringAccum &, int, Type1Reader *);
+ static int slurp_proc(StringAccum &, int, Type1Reader *);
+
+ inline void set_val(const String &);
+ inline void set_val(StringAccum &);
+
+};
+
+class Type1Encoding : public Type1Item { public:
+
+ Type1Encoding();
+ Type1Encoding(const Type1Encoding &);
+ ~Type1Encoding();
+
+ void clear();
+ void unshare();
+
+ PermString operator[](int e) const { assert(e>=0&&e<256); return _v[e]; }
+ PermString elt(int e) const { return (*this)[e]; }
+ PermString operator[](unsigned char e) const { return _v[e]; }
+ PermString elt(unsigned char e) const { return operator[](e); }
+ inline void put(int e, PermString p);
+
+ void set_definer(PermString s) { _definer = s; }
+
+ static Type1Encoding *standard_encoding();
+
+ void gen(Type1Writer &);
+
+ private:
+
+ PermString *_v;
+ Type1Encoding *_copy_of;
+ PermString _definer;
+
+ Type1Encoding(Type1Encoding *);
+ Type1Encoding &operator=(const Type1Encoding &);
+
+};
+
+class Type1Subr : public Type1Item { public:
+
+ static Type1Subr *make(const char *, int, int cs_start, int cs_len, int lenIV);
+ static Type1Subr *make_subr(int, const Type1Charstring &, PermString);
+ static Type1Subr *make_glyph(PermString, const Type1Charstring &, PermString);
+
+ bool is_subr() const { return !_name; }
+ PermString name() const { return _name; }
+ int subrno() const { return _subrno; }
+ PermString definer() const { return _definer; }
+
+ Type1Charstring &t1cs() { return _cs; }
+ const Type1Charstring &t1cs() const { return _cs; }
+ operator Type1Charstring &() { return _cs; }
+ operator const Type1Charstring &() const { return _cs; }
+
+ void gen(Type1Writer &);
+
+ virtual Type1Subr *cast_subr() { return this; }
+
+ private:
+
+ PermString _name;
+ int _subrno;
+ PermString _definer;
+
+ Type1Charstring _cs;
+
+ static PermString cached_definer;
+
+ Type1Subr(PermString, int, PermString, int, const String &);
+ Type1Subr(PermString, int, PermString, const Type1Charstring &);
+
+};
+
+class Type1SubrGroupItem : public Type1Item { public:
+
+ Type1SubrGroupItem(Type1Font *, bool, const String &);
+ Type1SubrGroupItem(const Type1SubrGroupItem &, Type1Font *);
+ ~Type1SubrGroupItem() { }
+
+ void set_end_text(const String &s) { _end_text = s; }
+ void add_end_text(const String &);
+
+ bool is_subrs() const { return _is_subrs; }
+ const String &end_text() const { return _end_text; }
+
+ void gen(Type1Writer &);
+
+ Type1SubrGroupItem *cast_subr_group() { return this; }
+
+ private:
+
+ Type1Font *_font;
+ bool _is_subrs;
+ String _value;
+ String _end_text;
+
+};
+
+class Type1IncludedFont : public Type1Item { public:
+
+ Type1IncludedFont(Type1Font *, int);
+ ~Type1IncludedFont();
+
+ Type1Font *included_font() const { return _included_font; }
+
+ void gen(Type1Writer &);
+
+ private:
+
+ Type1Font *_included_font;
+ int _unique_id;
+
+};
+
+
+inline Type1Definition *Type1Definition::make_literal(PermString n, const String &v, PermString d)
+{
+ return new Type1Definition(n, v, d);
+}
+
+inline Type1Definition *Type1Definition::make(PermString n, double v, PermString d)
+{
+ return new Type1Definition(n, String(v), d);
+}
+
+inline void Type1Definition::set_val(const String &v)
+{
+ _val = v;
+}
+
+inline void Type1Definition::set_val(StringAccum &sa)
+{
+ _val = sa.take_string();
+}
+
+inline void Type1Encoding::put(int e, PermString glyph)
+{
+ if (_copy_of)
+ unshare();
+ assert(e >= 0 && e < 256);
+ _v[e] = glyph;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1mm.hh b/Build/source/utils/lcdf-typetools/include/efont/t1mm.hh
new file mode 100644
index 00000000000..94e32e3ed14
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1mm.hh
@@ -0,0 +1,108 @@
+// -*- related-file-name: "../../libefont/t1mm.cc" -*-
+#ifndef EFONT_T1MM_HH
+#define EFONT_T1MM_HH
+#include <efont/t1cs.hh>
+class ErrorHandler;
+namespace Efont {
+class Type1Font;
+
+class MultipleMasterSpace : public CharstringProgram { public:
+
+ MultipleMasterSpace(PermString, int naxes, int nmasters);
+ // default destructor
+
+ typedef Vector<double> NumVector;
+
+ PermString font_name() const { return _font_name; }
+ int naxes() const { return _naxes; }
+ int nmasters() const { return _nmasters; }
+
+ int axis(PermString) const;
+ double axis_low(int) const;
+ double axis_high(int) const;
+
+ PermString axis_type(int a) const { return _axis_types[a]; }
+ PermString axis_label(int a) const { return _axis_labels[a]; }
+ inline PermString axis_abbreviation(int a) const;
+ static PermString axis_abbreviation(PermString);
+
+ const Type1Charstring &ndv() const { return _ndv; }
+ const Type1Charstring &cdv() const { return _cdv; }
+
+ void set_master_positions(const Vector<NumVector> &);
+ void set_normalize(const Vector<NumVector> &, const Vector<NumVector> &);
+ void set_axis_type(int, PermString);
+ void set_axis_label(int, PermString);
+ void set_ndv(const Type1Charstring &cs) { _ndv = cs; }
+ void set_cdv(const Type1Charstring &cs) { _cdv = cs; }
+ void set_design_vector(const NumVector &);
+ void set_weight_vector(const NumVector &);
+
+ bool check(ErrorHandler * = 0);
+ bool check_intermediate(ErrorHandler * = 0);
+
+ NumVector empty_design_vector() const;
+ inline const NumVector &default_design_vector() const;
+ bool set_design(NumVector &, int, double, ErrorHandler * = 0) const;
+ bool set_design(NumVector &, PermString, double, ErrorHandler * = 0) const;
+
+ inline const NumVector &default_weight_vector() const;
+
+ bool design_to_norm_design(const NumVector &, NumVector &, ErrorHandler * = 0) const;
+ bool design_to_weight(const NumVector &, NumVector &, ErrorHandler * = 0) const;
+
+ NumVector *mm_vector(VectorType, bool writable) const;
+
+ private:
+
+ mutable bool _ok;
+
+ PermString _font_name;
+ int _naxes;
+ int _nmasters;
+
+ Vector<NumVector> _master_positions;
+ Vector<NumVector> _normalize_in;
+ Vector<NumVector> _normalize_out;
+
+ Vector<PermString> _axis_types;
+ Vector<PermString> _axis_labels;
+
+ Type1Charstring _ndv;
+ Type1Charstring _cdv;
+
+ NumVector _default_design_vector;
+ NumVector _default_weight_vector;
+
+ mutable NumVector *_design_vector;
+ mutable NumVector *_norm_design_vector;
+ mutable NumVector *_weight_vector;
+
+ bool error(ErrorHandler *, const char *, ...) const;
+
+ MultipleMasterSpace(const MultipleMasterSpace &);
+ MultipleMasterSpace &operator=(const MultipleMasterSpace &);
+
+ bool normalize_vector(ErrorHandler *) const;
+ bool convert_vector(ErrorHandler *) const;
+
+};
+
+
+inline const Vector<double> &MultipleMasterSpace::default_design_vector() const
+{
+ return _default_design_vector;
+}
+
+inline const Vector<double> &MultipleMasterSpace::default_weight_vector() const
+{
+ return _default_weight_vector;
+}
+
+inline PermString MultipleMasterSpace::axis_abbreviation(int a) const
+{
+ return axis_abbreviation(_axis_types[a]);
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1rw.hh b/Build/source/utils/lcdf-typetools/include/efont/t1rw.hh
new file mode 100644
index 00000000000..ae37856342a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1rw.hh
@@ -0,0 +1,232 @@
+// -*- related-file-name: "../../libefont/t1rw.cc" -*-
+#ifndef EFONT_T1RW_HH
+#define EFONT_T1RW_HH
+#include <stdio.h>
+#include <lcdf/string.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+
+class Type1Reader { public:
+
+ Type1Reader();
+ virtual ~Type1Reader();
+
+ int get_data(unsigned char *, int);
+ virtual int more_data(unsigned char *, int) = 0;
+ virtual bool preserve_whitespace() const { return false; }
+
+ void switch_eexec(bool, unsigned char *, int);
+ virtual void set_charstring_definer(PermString);
+
+ bool next_line(StringAccum &);
+ bool was_charstring() const { return _charstring_len > 0; }
+ int charstring_start() const { return _charstring_start; }
+ int charstring_length() const { return _charstring_len; }
+
+ private:
+
+ enum { DATA_SIZE = 1024 };
+
+ unsigned char *_data;
+ int _len;
+ int _pos;
+
+ PermString _charstring_definer;
+ int _charstring_start;
+ int _charstring_len;
+
+ int _ungot;
+ int _crlf;
+
+ bool _eexec;
+ bool _binary_eexec;
+ int _r;
+
+ Type1Reader(const Type1Reader &);
+ Type1Reader &operator=(const Type1Reader &);
+
+ int more_data();
+
+ inline int eexec(int);
+ int ascii_eexec_get();
+ inline int get_base();
+ inline int get();
+
+ void start_eexec(int ascii_chars);
+
+ bool test_charstring(StringAccum &);
+
+ static unsigned char xvalue_store[];
+ static unsigned char *xvalue;
+ static void static_initialize();
+
+};
+
+
+class Type1PFAReader : public Type1Reader {
+
+ FILE *_f;
+
+ public:
+
+ Type1PFAReader(FILE *);
+
+ int more_data(unsigned char *, int);
+
+};
+
+class Type1PFBReader : public Type1Reader {
+
+ FILE *_f;
+ bool _binary;
+ int _left;
+
+ public:
+
+ Type1PFBReader(FILE *);
+
+ int more_data(unsigned char *, int);
+ bool preserve_whitespace() const;
+
+};
+
+class Type1SubsetReader : public Type1Reader {
+
+ Type1Reader *_reader;
+ int _left;
+
+ public:
+
+ Type1SubsetReader(Type1Reader *, int);
+
+ int more_data(unsigned char *, int);
+ bool preserve_whitespace() const;
+
+};
+
+
+/*****
+ * Writers
+ **/
+
+class Type1Writer { public:
+
+ Type1Writer();
+ virtual ~Type1Writer();
+
+ bool eexecing() const { return _eexec; }
+
+ inline void print(int);
+ void print(const char *, int);
+
+ inline Type1Writer &operator<<(char);
+ inline Type1Writer &operator<<(unsigned char);
+ Type1Writer &operator<<(int);
+ Type1Writer &operator<<(double);
+
+ virtual void flush();
+ virtual void switch_eexec(bool);
+ virtual void print0(const unsigned char *, int) = 0;
+
+ PermString charstring_start() const { return _charstring_start; }
+ int lenIV() const { return _lenIV; }
+ void set_charstring_start(PermString p) { _charstring_start = p; }
+ void set_lenIV(int l) { _lenIV = l; }
+
+ private:
+
+ enum { BufSize = 1024 };
+
+ unsigned char *_buf;
+ int _pos;
+
+ bool _eexec;
+ int _eexec_start;
+ int _eexec_end;
+ int _r;
+
+ PermString _charstring_start;
+ int _lenIV;
+
+ void local_flush();
+ inline unsigned char eexec(int);
+
+ Type1Writer(const Type1Writer &);
+ Type1Writer &operator=(const Type1Writer &);
+
+};
+
+
+class Type1PFAWriter: public Type1Writer {
+
+ FILE *_f;
+ int _hex_line;
+
+ public:
+
+ Type1PFAWriter(FILE *);
+ ~Type1PFAWriter();
+
+ void switch_eexec(bool);
+ void print0(const unsigned char *, int);
+
+};
+
+
+class Type1PFBWriter: public Type1Writer {
+
+ StringAccum _save;
+ FILE *_f;
+ bool _binary;
+
+ public:
+
+ Type1PFBWriter(FILE *);
+ ~Type1PFBWriter();
+
+ void flush();
+ void switch_eexec(bool);
+ void print0(const unsigned char *, int);
+
+};
+
+
+inline void Type1Writer::print(int c)
+{
+ if (_pos >= BufSize)
+ local_flush();
+ _buf[_pos++] = c;
+}
+
+inline Type1Writer &operator<<(Type1Writer &w, const char *cc)
+{
+ w.print(cc, strlen(cc));
+ return w;
+}
+
+inline Type1Writer &operator<<(Type1Writer &w, PermString p)
+{
+ w.print(p.c_str(), p.length());
+ return w;
+}
+
+inline Type1Writer &operator<<(Type1Writer &w, const String &s)
+{
+ w.print(s.data(), s.length());
+ return w;
+}
+
+inline Type1Writer &Type1Writer::operator<<(char c)
+{
+ print((unsigned char)c);
+ return *this;
+}
+
+inline Type1Writer &Type1Writer::operator<<(unsigned char c)
+{
+ print(c);
+ return *this;
+}
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/efont/t1unparser.hh b/Build/source/utils/lcdf-typetools/include/efont/t1unparser.hh
new file mode 100644
index 00000000000..06d46ee96ee
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/efont/t1unparser.hh
@@ -0,0 +1,39 @@
+// -*- related-file-name: "../../libefont/t1unparser.cc" -*-
+#ifndef EFONT_T1UNPARSER_HH
+#define EFONT_T1UNPARSER_HH
+#include <efont/t1interp.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+
+class CharstringUnparser : public CharstringInterp { public:
+
+ CharstringUnparser();
+ CharstringUnparser(const CharstringUnparser &);
+
+ const String &indent() const { return _indent; }
+ void set_indent(const String &s) { _indent = s; }
+ void set_one_command_per_line(bool b) { _one_command_per_line = b; }
+
+ void clear();
+
+ bool number(double);
+ bool type1_command(int);
+ bool type2_command(int, const unsigned char *, int *);
+ void act_hintmask(int, const unsigned char *, int);
+
+ String value();
+
+ static String unparse(const Charstring *);
+ static String unparse(const Charstring &);
+
+ private:
+
+ String _indent;
+ bool _one_command_per_line;
+ bool _start_of_line;
+ StringAccum _sa;
+
+};
+
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/bezier.hh b/Build/source/utils/lcdf-typetools/include/lcdf/bezier.hh
new file mode 100644
index 00000000000..2635069521b
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/bezier.hh
@@ -0,0 +1,136 @@
+// -*- related-file-name: "../../liblcdf/bezier.cc" -*-
+#ifndef LCDF_BEZIER_HH
+#define LCDF_BEZIER_HH
+#include <lcdf/point.hh>
+#include <lcdf/vector.hh>
+#include <string.h>
+
+class Bezier { public:
+
+ Bezier() : _bb(-1) { }
+ inline Bezier(Point p[4]) throw ();
+ inline Bezier(const Point &, const Point &, const Point &, const Point &) throw ();
+
+ const Point *points() const { return _p; }
+ const Point &point(int i) const { assert(i>=0&&i<4); return _p[i]; }
+ Point &mpoint(int i) { assert(i>=0&&i<4); _bb = -1; return _p[i]; }
+ void set_point(int i, const Point &p) { mpoint(i) = p; }
+
+ Point eval(double) const throw ();
+ bool is_flat(double) const throw ();
+ bool in_bb(const Point &, double) const throw ();
+ bool hit(const Point &, double) const throw ();
+
+ inline double bb_left() const throw ();
+ inline double bb_right() const throw ();
+ inline double bb_top() const throw ();
+ inline double bb_bottom() const throw ();
+
+ inline double bb_left_x() const throw ();
+ inline double bb_right_x() const throw ();
+ inline double bb_top_x() const throw ();
+ inline double bb_bottom_x() const throw ();
+
+ void halve(Bezier &, Bezier &) const throw ();
+
+ inline void segmentize(Vector<Point> &) const;
+ void segmentize(Vector<Point> &, bool) const;
+
+ static void fit(const Vector<Point> &, double, Vector<Bezier> &);
+
+ private:
+
+ Point _p[4];
+ mutable int _bb;
+
+ void make_bb() const throw ();
+ inline void ensure_bb() const throw ();
+
+ double hit_recurse(const Point &, double, double, double, double, double) const throw ();
+
+};
+
+
+inline
+Bezier::Bezier(Point p[4]) throw ()
+ : _bb(-1)
+{
+ memcpy(_p, p, sizeof(Point) * 4);
+}
+
+inline
+Bezier::Bezier(const Point &p0, const Point &p1, const Point &p2, const Point &p3) throw ()
+{
+ _p[0] = p0;
+ _p[1] = p1;
+ _p[2] = p2;
+ _p[3] = p3;
+ _bb = -1;
+}
+
+inline void
+Bezier::ensure_bb() const throw ()
+{
+ if (_bb < 0)
+ make_bb();
+}
+
+inline double
+Bezier::bb_top_x() const throw ()
+{
+ return _p[(_bb >> 4) & 3].y;
+}
+
+inline double
+Bezier::bb_left_x() const throw ()
+{
+ return _p[(_bb >> 2) & 3].x;
+}
+
+inline double
+Bezier::bb_bottom_x() const throw ()
+{
+ return _p[(_bb >> 6) & 3].y;
+}
+
+inline double
+Bezier::bb_right_x() const throw ()
+{
+ return _p[(_bb >> 0) & 3].x;
+}
+
+inline double
+Bezier::bb_top() const throw ()
+{
+ ensure_bb();
+ return bb_top_x();
+}
+
+inline double
+Bezier::bb_left() const throw ()
+{
+ ensure_bb();
+ return bb_left_x();
+}
+
+inline double
+Bezier::bb_bottom() const throw ()
+{
+ ensure_bb();
+ return bb_bottom_x();
+}
+
+inline double
+Bezier::bb_right() const throw ()
+{
+ ensure_bb();
+ return bb_right_x();
+}
+
+inline void
+Bezier::segmentize(Vector<Point> &v) const
+{
+ segmentize(v, v.size() == 0 || v.back() != _p[0]);
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/clp.h b/Build/source/utils/lcdf-typetools/include/lcdf/clp.h
new file mode 100644
index 00000000000..2126aacbf9c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/clp.h
@@ -0,0 +1,167 @@
+/* -*- related-file-name: "../../liblcdf/clp.c" -*- */
+#ifndef LCDF_CLP_H
+#define LCDF_CLP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* clp.h - Public interface to CLP.
+ * This file is part of CLP, the command line parser package.
+ *
+ * Copyright (c) 1997-2005 Eddie Kohler, kohler@icir.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file, which is available in full at
+ * http://www.pdos.lcs.mit.edu/click/license.html. The conditions include: you
+ * must preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding. */
+
+
+/* Argument types */
+#define Clp_NoArg 0
+#define Clp_ArgString 1
+#define Clp_ArgStringNotOption 2
+#define Clp_ArgBool 3
+#define Clp_ArgInt 4
+#define Clp_ArgUnsigned 5
+#define Clp_ArgDouble 6
+
+#define Clp_FirstUserType 10
+
+/* Flags for individual Clp_Options */
+#define Clp_Mandatory (1<<0) /* Has mandatory argument */
+#define Clp_Optional (1<<1) /* Has optional argument */
+#define Clp_Negate (1<<2) /* Allow --no-OPT */
+#define Clp_OnlyNegated (1<<3) /* Allow --no-OPT, but not --OPT */
+#define Clp_PreferredMatch (1<<4) /* Prefer --OPT to --OPTwhatever */
+ /* when matching option prefixes */
+
+struct Clp_Option {
+ const char *long_name; /* e.g. "version" */
+ int short_name; /* e.g. 'v' */
+ int option_id; /* number returned by Clp_Next */
+ int arg_type; /* e.g. Clp_ArgBool */
+ int flags; /* e.g. Clp_Optional | Clp_Negate */
+};
+
+
+/* Sizes of clp->val */
+#define Clp_ValSize 40
+#define Clp_ValIntSize 10
+
+typedef struct Clp_Option Clp_Option;
+typedef struct Clp_Parser Clp_Parser;
+typedef struct Clp_Internal Clp_Internal;
+typedef struct Clp_ParserState Clp_ParserState;
+typedef struct Clp_Argv Clp_Argv;
+
+typedef int (*Clp_ArgParseFunc)(Clp_Parser *, const char *, int, void *);
+typedef void (*Clp_ErrorHandler)(const char *);
+
+struct Clp_Parser {
+
+ int negated;
+
+ int have_arg;
+ const char *arg;
+
+ union {
+ int i;
+ unsigned u;
+ double d;
+ const char *s;
+ void *pv;
+#ifdef HAVE_INT64_TYPES
+ int64_t i64;
+ uint64_t u64;
+#endif
+ char cs[Clp_ValSize];
+ unsigned char ucs[Clp_ValSize];
+ int is[Clp_ValIntSize];
+ unsigned us[Clp_ValIntSize];
+ } val;
+
+ Clp_Internal *internal;
+
+};
+
+
+Clp_Parser * Clp_NewParser(int argc, const char * const *argv,
+ int nopt, Clp_Option *opt);
+void Clp_DeleteParser(Clp_Parser *);
+
+Clp_ErrorHandler Clp_SetErrorHandler(Clp_Parser *, Clp_ErrorHandler);
+
+const char * Clp_ProgramName(Clp_Parser *);
+void Clp_SetProgramName(Clp_Parser *, const char *);
+
+
+struct Clp_Argv {
+ int argc;
+ char **argv;
+ char *argv_buf;
+};
+
+Clp_Argv * Clp_NewArgv(const char *args, int len);
+void Clp_DeleteArgv(Clp_Argv *);
+
+
+/* Option types for Clp_SetOptionChar */
+/* Clp_NotOption 0 */
+#define Clp_Short (1<<0)
+#define Clp_Long (1<<1)
+#define Clp_ShortNegated (1<<2)
+#define Clp_LongNegated (1<<3)
+#define Clp_LongImplicit (1<<4)
+
+int Clp_SetOptionChar(Clp_Parser *, int c, int option_type);
+
+
+/* Argument type flags for Clp_AddType */
+#define Clp_DisallowOptions (1<<0) /* No option-looking args */
+
+int Clp_AddType
+ (Clp_Parser *, int type_id, int flags,
+ Clp_ArgParseFunc func, void *user_data);
+
+
+/* Flags for Clp_AddStringListType */
+#define Clp_AllowNumbers (1<<0) /* Number args OK */
+
+int Clp_AddStringListType
+ (Clp_Parser *, int type_id, int flags, ...);
+int Clp_AddStringListTypeVec
+ (Clp_Parser *, int type_id, int flags,
+ int n, char **str, int *val);
+
+
+/* Return values from Clp_Next */
+#define Clp_NotOption 0
+#define Clp_Done -1
+#define Clp_BadOption -2
+#define Clp_Error -3
+
+int Clp_Next(Clp_Parser *);
+
+
+const char * Clp_Shift(Clp_Parser *, int allow_dashes);
+int Clp_SetOptionProcessing(Clp_Parser *, int option_processing);
+
+Clp_ParserState *Clp_NewParserState(void);
+void Clp_DeleteParserState(Clp_ParserState *);
+void Clp_SaveParser(Clp_Parser *, Clp_ParserState *);
+void Clp_RestoreParser(Clp_Parser *, Clp_ParserState *);
+
+int Clp_OptionError(Clp_Parser *, const char *, ...);
+int Clp_CurOptionNameBuf(Clp_Parser *, char *buf, int buflen);
+const char * Clp_CurOptionName(Clp_Parser *); /* uses static memory */
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/error.hh b/Build/source/utils/lcdf-typetools/include/lcdf/error.hh
new file mode 100644
index 00000000000..790c8273763
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/error.hh
@@ -0,0 +1,187 @@
+// -*- related-file-name: "../../liblcdf/error.cc" -*-
+#ifndef LCDF_ERROR_HH
+#define LCDF_ERROR_HH
+#include <lcdf/string.hh>
+#ifndef __KERNEL__
+# include <stdio.h>
+#endif
+#include <stdarg.h>
+#if HAVE_ADDRESSABLE_VA_LIST
+# define VA_LIST_REF_T va_list *
+# define VA_LIST_DEREF(val) (*(val))
+# define VA_LIST_REF(val) (&(val))
+#else
+# define VA_LIST_REF_T va_list
+# define VA_LIST_DEREF(val) (val)
+# define VA_LIST_REF(val) (val)
+#endif
+
+class ErrorHandler { public:
+
+ enum Seriousness {
+ ERRVERBOSITY_CONTEXT= 0x8000,
+ ERRVERBOSITY_MAX = 0xFFFF,
+ ERRVERBOSITY_DEFAULT= ERRVERBOSITY_MAX,
+ ERRVERBOSITY_MASK = 0x0000FFFF,
+ ERRVERBOSITY_SHIFT = 16,
+
+ ERR_MIN_DEBUG = 0x00000000,
+ ERR_MIN_MESSAGE = 0x00010000,
+ ERR_MIN_WARNING = 0x00020000,
+ ERR_MIN_ERROR = 0x00030000,
+ ERR_MIN_FATAL = 0x00040000,
+
+ // fatal() with no explicit exit status exits with this status
+ FATAL_EXITSTATUS = 1,
+
+ ERR_DEBUG = ERR_MIN_DEBUG + ERRVERBOSITY_DEFAULT,
+ ERR_CONTEXT_MESSAGE = ERR_MIN_MESSAGE + ERRVERBOSITY_CONTEXT,
+ ERR_MESSAGE = ERR_MIN_MESSAGE + ERRVERBOSITY_DEFAULT,
+ ERR_WARNING = ERR_MIN_WARNING + ERRVERBOSITY_DEFAULT,
+ ERR_CONTEXT_ERROR = ERR_MIN_ERROR + ERRVERBOSITY_CONTEXT,
+ ERR_ERROR = ERR_MIN_ERROR + ERRVERBOSITY_DEFAULT,
+ ERR_FATAL = ERR_MIN_FATAL + ERRVERBOSITY_DEFAULT + (FATAL_EXITSTATUS << ERRVERBOSITY_SHIFT)
+ };
+
+ ErrorHandler() { }
+ virtual ~ErrorHandler() { }
+
+ static ErrorHandler *static_initialize(ErrorHandler *errh); // returns errh
+ static void static_cleanup();
+
+ static ErrorHandler *default_handler();
+ static ErrorHandler *silent_handler();
+
+ static bool has_default_handler();
+ static void set_default_handler(ErrorHandler *);
+
+ virtual int nwarnings() const = 0;
+ virtual int nerrors() const = 0;
+ virtual void reset_counts() = 0;
+ virtual int min_verbosity() const;
+
+ // seriousness < ERR_MIN_WARNING returns OK_RESULT, which is 0
+ // seriousness >= ERR_MIN_WARNING returns ERROR_RESULT, which is -EINVAL
+ static const int OK_RESULT;
+ static const int ERROR_RESULT;
+
+ void debug(const char *format, ...);
+ void message(const char *format, ...);
+ int warning(const char *format, ...);
+ int error(const char *format, ...);
+ int fatal(const char *format, ...);
+ int fatal(int exit_status, const char *format, ...);
+
+ void ldebug(const String &landmark, const char *format, ...);
+ void lmessage(const String &landmark, const char *format, ...);
+ int lwarning(const String &landmark, const char *format, ...);
+ int lerror(const String &landmark, const char *format, ...);
+ int lfatal(const String &landmark, const char *format, ...);
+ int lfatal(int exit_status, const String &landmark, const char *format, ...);
+
+ int verror(Seriousness, const String &landmark, const char *format, va_list);
+ int verror_text(Seriousness, const String &landmark, const String &text);
+
+ String make_text(Seriousness, const char *, ...);
+ virtual String make_text(Seriousness, const char *, va_list);
+ virtual String decorate_text(Seriousness, const String &, const String &);
+ virtual void handle_text(Seriousness, const String &) = 0;
+ virtual int count_error(Seriousness, const String &) = 0;
+
+ virtual void set_error_code(int);
+
+ static String prepend_lines(const String &prefix, const String &text);
+
+ // error conversions
+ struct Conversion;
+ typedef String (*ConversionHook)(int flags, VA_LIST_REF_T);
+ enum ConversionFlags {
+ ZERO_PAD = 1, PLUS_POSITIVE = 2, SPACE_POSITIVE = 4, LEFT_JUST = 8,
+ ALTERNATE_FORM = 16, UPPERCASE = 32, SIGNED = 64, NEGATIVE = 128
+ };
+ static Conversion *add_conversion(const String &, ConversionHook);
+ static int remove_conversion(Conversion *);
+
+};
+
+class BaseErrorHandler : public ErrorHandler { public:
+ BaseErrorHandler() : _nwarnings(0), _nerrors(0) { }
+ int nwarnings() const { return _nwarnings; }
+ int nerrors() const { return _nerrors; }
+ void reset_counts() { _nwarnings = _nerrors = 0; }
+ int count_error(Seriousness, const String &);
+ private:
+ int _nwarnings, _nerrors;
+};
+
+#ifndef __KERNEL__
+class FileErrorHandler : public BaseErrorHandler { public:
+ FileErrorHandler(FILE *, const String & = String());
+ void handle_text(Seriousness, const String &);
+ private:
+ FILE *_f;
+ String _context;
+};
+#endif
+
+class ErrorVeneer : public ErrorHandler { public:
+
+ ErrorVeneer(ErrorHandler *errh) : _errh(errh) { }
+
+ int nwarnings() const;
+ int nerrors() const;
+ void reset_counts();
+
+ String make_text(Seriousness, const char *, va_list);
+ String decorate_text(Seriousness, const String &, const String &);
+ void handle_text(Seriousness, const String &);
+ int count_error(Seriousness, const String &);
+
+ protected:
+
+ ErrorHandler *_errh;
+
+};
+
+class ContextErrorHandler : public ErrorVeneer { public:
+ ContextErrorHandler(ErrorHandler *, const String &context, const String &indent = " ", const String &context_landmark = "");
+ String decorate_text(Seriousness, const String &, const String &);
+ private:
+ String _context;
+ String _indent;
+ String _context_landmark;
+};
+
+class PrefixErrorHandler : public ErrorVeneer { public:
+ PrefixErrorHandler(ErrorHandler *, const String &prefix);
+ String decorate_text(Seriousness, const String &, const String &);
+ private:
+ String _prefix;
+};
+
+class LandmarkErrorHandler : public ErrorVeneer { public:
+ LandmarkErrorHandler(ErrorHandler *, const String &);
+ void set_landmark(const String &s) { _landmark = s; }
+ String decorate_text(Seriousness, const String &, const String &);
+ private:
+ String _landmark;
+};
+
+class VerboseFilterErrorHandler : public ErrorVeneer { public:
+ VerboseFilterErrorHandler(ErrorHandler *, int min_verbosity);
+ int min_verbosity() const;
+ void handle_text(Seriousness, const String &);
+ private:
+ int _min_verbosity;
+};
+
+#ifndef __KERNEL__
+class BailErrorHandler : public ErrorVeneer { public:
+ BailErrorHandler(ErrorHandler *, Seriousness = ERR_MIN_ERROR);
+ void handle_text(Seriousness, const String &);
+ private:
+ int _exit_seriousness;
+};
+#endif
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/filename.hh b/Build/source/utils/lcdf-typetools/include/lcdf/filename.hh
new file mode 100644
index 00000000000..9f1589d4779
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/filename.hh
@@ -0,0 +1,41 @@
+// -*- related-file-name: "../../liblcdf/filename.cc" -*-
+#ifndef LCDF_FILENAME_HH
+#define LCDF_FILENAME_HH
+#include <lcdf/string.hh>
+#include <stdio.h>
+
+class Filename { public:
+
+ Filename() : _dir("."), _actual(0) { }
+ Filename(const String &);
+ Filename(const String &dir, const String &name);
+ Filename(FILE *, const String &fake_name);
+
+ bool fake() const { return _actual != 0; }
+
+ const String &directory() const { return _dir; }
+ const String &name() const { return _name; }
+ const String &path() const { return _path; }
+ String base() const;
+ String extension() const;
+
+ operator bool() const { return _name; }
+ bool operator!() const { return !_name; }
+
+ FILE *open_read(bool binary = false) const;
+ bool readable() const;
+
+ FILE *open_write(bool binary = false) const;
+
+ Filename from_directory(const String &n) const { return Filename(_dir, n);}
+
+ private:
+
+ mutable String _dir; // mutable for c_str()
+ mutable String _name;
+ mutable String _path;
+ FILE *_actual;
+
+};
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/globmatch.hh b/Build/source/utils/lcdf-typetools/include/lcdf/globmatch.hh
new file mode 100644
index 00000000000..963035e0ead
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/globmatch.hh
@@ -0,0 +1,8 @@
+// -*- related-file-name: "../../liblcdf/globmatch.cc" -*-
+#ifndef LCDF_GLOBMATCH_HH
+#define LCDF_GLOBMATCH_HH
+class String;
+
+bool glob_match(const String& str, const String& pattern);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/hashmap.cc b/Build/source/utils/lcdf-typetools/include/lcdf/hashmap.cc
new file mode 100644
index 00000000000..d43e1344668
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/hashmap.cc
@@ -0,0 +1,187 @@
+#ifndef LCDF_HASHMAP_CC
+#define LCDF_HASHMAP_CC
+
+/*
+ * hashmap.{cc,hh} -- simple open-coded hash table class
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2003 International Computer Science Institute
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+/* #include <lcdf/hashmap.hh> */
+
+template <class K, class V>
+HashMap<K, V>::HashMap()
+ : _capacity(0), _grow_limit(0), _n(0), _e(0), _default_value()
+{
+ increase(-1);
+}
+
+template <class K, class V>
+HashMap<K, V>::HashMap(const V &def)
+ : _capacity(0), _grow_limit(0), _n(0), _e(0), _default_value(def)
+{
+ increase(-1);
+}
+
+
+template <class K, class V>
+HashMap<K, V>::HashMap(const HashMap<K, V> &m)
+ : _capacity(m._capacity), _grow_limit(m._grow_limit), _n(m._n),
+ _e(new Pair[m._capacity]), _default_value(m._default_value)
+{
+ for (int i = 0; i < _capacity; i++)
+ _e[i] = m._e[i];
+}
+
+
+template <class K, class V>
+HashMap<K, V> &
+HashMap<K, V>::operator=(const HashMap<K, V> &o)
+{
+ // This works with self-assignment.
+
+ _capacity = o._capacity;
+ _grow_limit = o._grow_limit;
+ _n = o._n;
+ _default_value = o._default_value;
+
+ Pair *new_e = new Pair[_capacity];
+ for (int i = 0; i < _capacity; i++)
+ new_e[i] = o._e[i];
+
+ delete[] _e;
+ _e = new_e;
+
+ return *this;
+}
+
+
+template <class K, class V>
+void
+HashMap<K, V>::increase(int min_size)
+{
+ int ncap = (_capacity < 8 ? 8 : _capacity * 2);
+ while (ncap < min_size && ncap > 0)
+ ncap *= 2;
+ if (ncap <= 0) // want too many elements
+ return;
+
+ Pair *ne = new Pair[ncap];
+ if (!ne) // out of memory
+ return;
+
+ Pair *oe = _e;
+ int ocap = _capacity;
+ _e = ne;
+ _capacity = ncap;
+ _grow_limit = ((3 * _capacity) >> 2) - 1;
+
+ Pair *otrav = oe;
+ for (int i = 0; i < ocap; i++, otrav++)
+ if (otrav->key) {
+ int j = bucket(otrav->key);
+ _e[j] = *otrav;
+ }
+
+ delete[] oe;
+}
+
+template <class K, class V>
+inline void
+HashMap<K, V>::check_capacity()
+{
+ if (_n >= _grow_limit)
+ increase(-1);
+}
+
+template <class K, class V>
+bool
+HashMap<K, V>::insert(const K &key, const V &val)
+{
+ check_capacity();
+ int i = bucket(key);
+ bool is_new = !(bool)_e[i].key;
+ _e[i].key = key;
+ _e[i].value = val;
+ _n += is_new;
+ return is_new;
+}
+
+template <class K, class V>
+V &
+HashMap<K, V>::find_force(const K &key)
+{
+ check_capacity();
+ int i = bucket(key);
+ if (!(bool)_e[i].key) {
+ _e[i].key = key;
+ _e[i].value = _default_value;
+ _n++;
+ }
+ return _e[i].value;
+}
+
+template <class K, class V>
+void
+HashMap<K, V>::clear()
+{
+ delete[] _e;
+ _e = 0;
+ _capacity = _grow_limit = _n = 0;
+ increase(-1);
+}
+
+template <class K, class V>
+void
+HashMap<K, V>::swap(HashMap<K, V> &o)
+{
+ int capacity = _capacity;
+ int grow_limit = _grow_limit;
+ int n = _n;
+ Pair *e = _e;
+ V default_value = _default_value;
+ _capacity = o._capacity;
+ _grow_limit = o._grow_limit;
+ _n = o._n;
+ _e = o._e;
+ _default_value = o._default_value;
+ o._capacity = capacity;
+ o._grow_limit = grow_limit;
+ o._n = n;
+ o._e = e;
+ o._default_value = default_value;
+}
+
+template <class K, class V>
+_HashMap_const_iterator<K, V>::_HashMap_const_iterator(const HashMap<K, V> *hm, int pos)
+ : _hm(hm), _pos(pos)
+{
+ typename HashMap<K, V>::Pair *e = _hm->_e;
+ int capacity = _hm->_capacity;
+ while (_pos < capacity && !(bool)e[_pos].key)
+ _pos++;
+}
+
+template <class K, class V>
+void
+_HashMap_const_iterator<K, V>::operator++(int)
+{
+ typename HashMap<K, V>::Pair *e = _hm->_e;
+ int capacity = _hm->_capacity;
+ for (_pos++; _pos < capacity && !(bool)e[_pos].key; _pos++)
+ ;
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/hashmap.hh b/Build/source/utils/lcdf-typetools/include/lcdf/hashmap.hh
new file mode 100644
index 00000000000..c1f1339b976
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/hashmap.hh
@@ -0,0 +1,223 @@
+#ifndef LCDF_HASHMAP_HH
+#define LCDF_HASHMAP_HH
+#include <assert.h>
+
+// K AND V REQUIREMENTS:
+//
+// K::K()
+// K::operator bool() const
+// Must have (bool)(K()) == false
+// and no k with (bool)k == false is stored.
+// K & K::operator=(const K &)
+// k1 == k2
+// unsigned hashcode(const K &)
+// If hashcode(k1) != hashcode(k2), then k1 != k2.
+//
+// V::V()
+// V & V::operator=(const V &)
+
+template <class K, class V> class _HashMap_const_iterator;
+template <class K, class V> class _HashMap_iterator;
+
+template <class K, class V>
+class HashMap { public:
+
+ HashMap();
+ explicit HashMap(const V &);
+ HashMap(const HashMap<K, V> &);
+ ~HashMap() { delete[] _e; }
+
+ int size() const { return _n; }
+ bool empty() const { return _n == 0; }
+ int capacity() const { return _capacity; }
+ void set_default_value(const V &v) { _default_value = v; }
+
+ typedef _HashMap_const_iterator<K, V> const_iterator;
+ typedef _HashMap_iterator<K, V> iterator;
+
+ inline const_iterator begin() const;
+ inline iterator begin();
+ inline const_iterator end() const;
+ inline iterator end();
+
+ inline const V &find(const K &) const;
+ inline V *findp(const K &) const;
+ inline const V &operator[](const K &k) const;
+ V &find_force(const K &);
+
+ bool insert(const K &, const V &);
+ void clear();
+
+ HashMap<K, V> &operator=(const HashMap<K, V> &);
+ void swap(HashMap<K, V> &);
+
+ void resize(int size) { increase(size); }
+
+ struct Pair {
+ K key;
+ V value;
+ Pair() : key(), value() { }
+ };
+
+ private:
+
+ int _capacity;
+ int _grow_limit;
+ int _n;
+ Pair *_e;
+ V _default_value;
+
+ void increase(int);
+ inline void check_capacity();
+ inline int bucket(const K &) const;
+
+ friend class _HashMap_const_iterator<K, V>;
+ friend class _HashMap_iterator<K, V>;
+
+};
+
+template <class K, class V>
+class _HashMap_const_iterator { public:
+ typedef _HashMap_const_iterator const_iterator;
+ typedef typename HashMap<K, V>::Pair Pair;
+
+ operator bool() const { return _pos < _hm->_capacity; }
+ bool operator!() const { return _pos >= _hm->_capacity; }
+
+ void operator++(int);
+ void operator++() { (*this)++; }
+
+ const K &key() const { return _hm->_e[_pos].key; }
+ const V &value() const { return _hm->_e[_pos].value; }
+ const Pair &pair() const { return _hm->_e[_pos]; }
+
+ inline bool operator==(const const_iterator &) const;
+ inline bool operator!=(const const_iterator &) const;
+
+ private:
+ const HashMap<K, V> *_hm;
+ int _pos;
+ _HashMap_const_iterator(const HashMap<K, V> *, int);
+ friend class HashMap<K, V>;
+ friend class _HashMap_iterator<K, V>;
+};
+
+template <class K, class V>
+class _HashMap_iterator : public _HashMap_const_iterator<K, V> { public:
+ typedef _HashMap_iterator iterator;
+
+ V &value() const { return this->_hm->_e[this->_pos].value; }
+
+ private:
+ _HashMap_iterator(const HashMap<K, V> *hm, int pos) : _HashMap_const_iterator<K, V>(hm, pos) { }
+ friend class HashMap<K, V>;
+};
+
+
+template <class K, class V>
+inline int
+HashMap<K, V>::bucket(const K &key) const
+{
+ assert(key);
+ unsigned hc = hashcode(key);
+ int i = hc & (_capacity - 1);
+ int j = ((hc >> 6) & (_capacity - 1)) | 1;
+
+ while (_e[i].key && !(_e[i].key == key))
+ i = (i + j) & (_capacity - 1);
+
+ return i;
+}
+
+template <class K, class V>
+inline const V &
+HashMap<K, V>::find(const K &key) const
+{
+ int i = bucket(key);
+ const V *v = (_e[i].key ? &_e[i].value : &_default_value);
+ return *v;
+}
+
+template <class K, class V>
+inline const V &
+HashMap<K, V>::operator[](const K &key) const
+{
+ return find(key);
+}
+
+template <class K, class V>
+inline V *
+HashMap<K, V>::findp(const K &key) const
+{
+ int i = bucket(key);
+ return _e[i].key ? &_e[i].value : 0;
+}
+
+template <class K, class V>
+inline _HashMap_const_iterator<K, V>
+HashMap<K, V>::begin() const
+{
+ return const_iterator(this, 0);
+}
+
+template <class K, class V>
+inline _HashMap_const_iterator<K, V>
+HashMap<K, V>::end() const
+{
+ return const_iterator(this, _capacity);
+}
+
+template <class K, class V>
+inline _HashMap_iterator<K, V>
+HashMap<K, V>::begin()
+{
+ return iterator(this, 0);
+}
+
+template <class K, class V>
+inline _HashMap_iterator<K, V>
+HashMap<K, V>::end()
+{
+ return iterator(this, _capacity);
+}
+
+template <class K, class V>
+inline bool
+_HashMap_const_iterator<K, V>::operator==(const const_iterator &i) const
+{
+ return _hm == i._hm && _pos == i._pos;
+}
+
+template <class K, class V>
+inline bool
+_HashMap_const_iterator<K, V>::operator!=(const const_iterator &i) const
+{
+ return _hm != i._hm || _pos != i._pos;
+}
+
+inline unsigned
+hashcode(int i)
+{
+ return static_cast<unsigned>(i);
+}
+
+inline unsigned
+hashcode(unsigned u)
+{
+ return u;
+}
+
+inline unsigned
+hashcode(long l)
+{
+ return static_cast<unsigned>(l);
+}
+
+inline unsigned
+hashcode(unsigned long ul)
+{
+ return static_cast<unsigned long>(ul);
+}
+
+#include <lcdf/hashmap.cc> // necessary to support GCC 3.3
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/inttypes.h b/Build/source/utils/lcdf-typetools/include/lcdf/inttypes.h
new file mode 100644
index 00000000000..b88e9e9faf0
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/inttypes.h
@@ -0,0 +1,34 @@
+#ifndef LCDF_INTTYPES_H
+#define LCDF_INTTYPES_H
+/* Define known-width integer types. */
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#elif defined(HAVE_SYS_TYPES_H)
+# include <sys/types.h>
+# ifdef HAVE_U_INT_TYPES
+typedef u_int8_t uint8_t;
+typedef u_int16_t uint16_t;
+typedef u_int32_t uint32_t;
+# endif
+#endif
+
+#ifdef HAVE_FAKE_INT_TYPES
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef signed short int16_t;
+typedef unsigned short uint16_t;
+typedef signed int int32_t;
+typedef unsigned int uint32_t;
+#endif
+
+#ifndef HAVE_UINTPTR_T
+# if SIZEOF_VOID_P == SIZEOF_UNSIGNED_INT
+typedef unsigned int uintptr_t;
+# elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG
+typedef unsigned long uintptr_t;
+# endif
+#endif
+
+/* Note: Windows compilers call these types '[un]signed __int8', etc. */
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/landmark.hh b/Build/source/utils/lcdf-typetools/include/lcdf/landmark.hh
new file mode 100644
index 00000000000..836f14ec088
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/landmark.hh
@@ -0,0 +1,39 @@
+// -*- related-file-name: "../../liblcdf/landmark.cc" -*-
+#ifndef LCDF_LANDMARK_HH
+#define LCDF_LANDMARK_HH
+#include <lcdf/string.hh>
+
+class Landmark { public:
+
+ Landmark() : _file(), _line(~0U) { }
+ explicit Landmark(const String &f) : _file(f), _line(~0U) { }
+ Landmark(const String &f, unsigned l) : _file(f), _line(l) { }
+
+ operator bool() const { return _file; }
+ bool operator!() const { return !_file; }
+ bool has_line() const { return _line != ~0U; }
+
+ const String &file() const { return _file; }
+ unsigned line() const { return _line; }
+
+ Landmark next_line() const;
+ Landmark whole_file() const { return Landmark(_file); }
+
+ operator String() const;
+
+ private:
+
+ String _file;
+ unsigned _line;
+
+};
+
+Landmark operator+(const Landmark &, int);
+
+inline Landmark
+Landmark::next_line() const
+{
+ return *this + 1;
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/permstr.hh b/Build/source/utils/lcdf-typetools/include/lcdf/permstr.hh
new file mode 100644
index 00000000000..2db15772ded
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/permstr.hh
@@ -0,0 +1,167 @@
+// -*- related-file-name: "../../liblcdf/permstr.cc" -*-
+#ifndef LCDF_PERMSTR_HH
+#define LCDF_PERMSTR_HH
+#include <assert.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <lcdf/inttypes.h>
+class PermString;
+inline bool operator==(PermString, PermString);
+inline bool operator!=(PermString, PermString);
+
+class PermString { struct Doodad; public:
+
+ typedef Doodad *Capsule;
+ // Declare a PermString::Initializer in any file in which you declare
+ // static global PermStrings.
+ struct Initializer { Initializer(); };
+
+ PermString() : _rep(zero_char_doodad.data) { }
+ explicit PermString(char c);
+ inline PermString(const char*);
+ inline PermString(const char*, int);
+ inline PermString(const char*, const char*);
+
+ inline operator bool() const;
+ inline bool operator!() const;
+
+ inline int length() const;
+ char operator[](int) const;
+ const char* begin() const { return _rep; }
+ inline const char* end() const;
+
+ friend inline bool operator==(PermString, PermString);
+ friend inline bool operator!=(PermString, PermString);
+
+ const char* c_str() const { return _rep; }
+
+ inline Capsule capsule() const;
+ inline static PermString decapsule(Capsule c);
+
+ friend PermString permprintf(const char*, ...);
+ friend PermString vpermprintf(const char*, va_list);
+ friend PermString permcat(PermString, PermString);
+ friend PermString permcat(PermString, PermString, PermString);
+
+ private:
+
+ struct Doodad {
+ Doodad* next;
+ int length;
+ char data[2];
+ };
+
+ const char* _rep;
+
+ PermString(Doodad* d) : _rep(d->data) { }
+ void initialize(const char*, int);
+ Doodad* doodad() const { return (Doodad*)(_rep - offsetof(Doodad, data)); }
+
+ friend struct PermString::Initializer;
+ static void static_initialize();
+
+ enum { NHASH = 1024 }; // must be power of 2
+ static Doodad zero_char_doodad, one_char_doodad[256], *buckets[NHASH];
+
+};
+
+
+inline
+PermString::PermString(const char* s)
+{
+ initialize(s, -1);
+}
+
+inline
+PermString::PermString(const char* s, int len)
+{
+ initialize(s, len);
+}
+
+inline
+PermString::PermString(const char* begin, const char* end)
+{
+ assert(end);
+ initialize(begin, end > begin ? end - begin : 0);
+}
+
+inline
+PermString::operator bool() const
+{
+ return _rep != zero_char_doodad.data;
+}
+
+inline bool
+PermString::operator!() const
+{
+ return _rep == zero_char_doodad.data;
+}
+
+inline int
+PermString::length() const
+{
+ return doodad()->length;
+}
+
+inline const char*
+PermString::end() const
+{
+ return _rep + doodad()->length;
+}
+
+inline bool
+operator==(PermString a, PermString b)
+{
+ return a._rep == b._rep;
+}
+
+bool operator==(PermString, const char*);
+
+inline bool
+operator==(const char* a, PermString b)
+{
+ return b == a;
+}
+
+inline bool
+operator!=(PermString a, PermString b)
+{
+ return a._rep != b._rep;
+}
+
+inline bool
+operator!=(PermString a, const char* b)
+{
+ return !(a == b);
+}
+
+inline bool
+operator!=(const char* a, PermString b)
+{
+ return !(b == a);
+}
+
+inline PermString::Capsule
+PermString::capsule() const
+{
+ return doodad();
+}
+
+inline PermString
+PermString::decapsule(Capsule c)
+{
+ return PermString(c);
+}
+
+inline unsigned
+hashcode(PermString s)
+{
+ return (uintptr_t)(s.c_str());
+}
+
+PermString permprintf(const char*, ...);
+PermString vpermprintf(const char*, va_list);
+PermString permcat(PermString, PermString);
+PermString permcat(PermString, PermString, PermString);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/point.hh b/Build/source/utils/lcdf-typetools/include/lcdf/point.hh
new file mode 100644
index 00000000000..a4d2495cac2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/point.hh
@@ -0,0 +1,185 @@
+// -*- related-file-name: "../../liblcdf/point.cc" -*-
+#ifndef LCDF_POINT_HH
+#define LCDF_POINT_HH
+#include <math.h>
+
+struct Point {
+
+ double x;
+ double y;
+
+ Point() { }
+ Point(double xx, double yy) : x(xx), y(yy) { }
+ // Point(const Point &) use compiler default
+ Point(const Point &p, double dx, double dy) : x(p.x + dx), y(p.y + dy) { }
+ // ~Point() use compiler default
+
+ inline double squared_length() const throw ();
+ inline double length() const throw ();
+ inline double magnitude() const throw ();
+ static inline double distance(const Point &, const Point &) throw ();
+ static inline double dot(const Point &, const Point &) throw ();
+ static Point midpoint(const Point &, const Point &) throw ();
+
+ inline double angle() const throw ();
+
+ void shift(double dx, double dy) { x += dx; y += dy; }
+
+ inline Point shifted(double dx, double dy) const throw ();
+ Point rotated(double) const throw ();
+ inline Point normal() const throw ();
+
+ bool on_line(const Point &, const Point &, double) const throw ();
+ bool on_segment(const Point &, const Point &, double) const throw ();
+
+ inline Point &operator+=(const Point &) throw ();
+ inline Point &operator-=(const Point &) throw ();
+ inline Point &operator*=(double) throw ();
+ inline Point &operator/=(double) throw ();
+
+ // Point operator+(Point, const Point &);
+ // Point operator-(Point, const Point &);
+ // Point operator*(Point, double);
+ // Point operator/(Point, double);
+ // Point operator-(const Point &);
+
+ // bool operator==(const Point &, const Point &);
+ // bool operator!=(const Point &, const Point &);
+
+};
+
+inline double
+Point::squared_length() const throw ()
+{
+ return x*x + y*y;
+}
+
+inline double
+Point::length() const throw ()
+{
+ return sqrt(x*x + y*y);
+}
+
+inline double
+Point::magnitude() const throw ()
+{
+ return length();
+}
+
+inline double
+Point::angle() const throw ()
+{
+ return atan2(y, x);
+}
+
+inline Point
+Point::shifted(double dx, double dy) const throw ()
+{
+ return Point(x + dx, y + dy);
+}
+
+inline Point
+Point::normal() const throw ()
+{
+ double l = length();
+ return (l ? Point(x/l, y/l) : *this);
+}
+
+inline Point &
+Point::operator+=(const Point &p) throw ()
+{
+ x += p.x;
+ y += p.y;
+ return *this;
+}
+
+inline Point &
+Point::operator-=(const Point &p) throw ()
+{
+ x -= p.x;
+ y -= p.y;
+ return *this;
+}
+
+inline Point &
+Point::operator*=(double d) throw ()
+{
+ x *= d;
+ y *= d;
+ return *this;
+}
+
+inline Point &
+Point::operator/=(double d) throw ()
+{
+ x /= d;
+ y /= d;
+ return *this;
+}
+
+inline bool
+operator==(const Point &a, const Point &b) throw ()
+{
+ return a.x == b.x && a.y == b.y;
+}
+
+inline bool
+operator!=(const Point &a, const Point &b) throw ()
+{
+ return a.x != b.x || a.y != b.y;
+}
+
+inline Point
+operator+(Point a, const Point &b) throw ()
+{
+ a += b;
+ return a;
+}
+
+inline Point
+operator-(Point a, const Point &b) throw ()
+{
+ a -= b;
+ return a;
+}
+
+inline Point
+operator-(const Point &a) throw ()
+{
+ return Point(-a.x, -a.y);
+}
+
+inline Point
+operator*(Point a, double scale) throw ()
+{
+ a *= scale;
+ return a;
+}
+
+inline Point
+operator*(double scale, Point a) throw ()
+{
+ a *= scale;
+ return a;
+}
+
+inline Point
+operator/(Point a, double scale) throw ()
+{
+ a /= scale;
+ return a;
+}
+
+inline double
+Point::distance(const Point &a, const Point &b) throw ()
+{
+ return (a - b).length();
+}
+
+inline double
+Point::dot(const Point &a, const Point &b) throw ()
+{
+ return a.x*b.x + a.y*b.y;
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/slurper.hh b/Build/source/utils/lcdf-typetools/include/lcdf/slurper.hh
new file mode 100644
index 00000000000..2e400d3c3f2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/slurper.hh
@@ -0,0 +1,63 @@
+// -*- related-file-name: "../../liblcdf/slurper.cc" -*-
+#ifndef LCDF_SLURPER_HH
+#define LCDF_SLURPER_HH
+#include <lcdf/landmark.hh>
+#include <lcdf/filename.hh>
+#include <stdio.h>
+
+class Slurper { public:
+
+ Slurper(const Filename &, FILE * = 0);
+ ~Slurper();
+
+ bool ok() const { return _f != 0; }
+
+ Landmark landmark() const { return Landmark(_filename.name(), _lineno); }
+ operator Landmark() const { return landmark(); }
+ unsigned lineno() const { return _lineno; }
+
+ const Filename &filename() const { return _filename; }
+ char *peek_line();
+ char *next_line();
+ char *append_next_line();
+ void save_line() { _saved_line = true; }
+
+ char *cur_line() const { return (char *)_line; }
+ unsigned cur_line_length() const { return _line_len; }
+ void shorten_line(unsigned);
+
+ private:
+
+ FILE *_f;
+ Filename _filename;
+ unsigned _lineno;
+ bool _own_f;
+
+ unsigned char *_data;
+ unsigned _cap;
+ unsigned _pos;
+ unsigned _len;
+
+ unsigned char *_line;
+ unsigned _line_len;
+
+ bool _saved_line;
+ bool _at_eof;
+
+ void grow_buffer();
+ inline int more_data();
+ char *get_line_at(unsigned);
+
+};
+
+
+inline void
+Slurper::shorten_line(unsigned pos)
+{
+ if (pos < _line_len) {
+ _line_len = pos;
+ _line[_line_len] = 0;
+ }
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/straccum.hh b/Build/source/utils/lcdf-typetools/include/lcdf/straccum.hh
new file mode 100644
index 00000000000..eea4a2daa9d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/straccum.hh
@@ -0,0 +1,279 @@
+// -*- related-file-name: "../../liblcdf/straccum.cc" -*-
+#ifndef LCDF_STRACCUM_HH
+#define LCDF_STRACCUM_HH
+#include <string.h>
+#include <assert.h>
+#include <lcdf/string.hh>
+#ifdef HAVE_PERMSTRING
+# include <lcdf/permstr.hh>
+#endif
+template<class T> class Vector;
+
+class StringAccum { public:
+
+ StringAccum() : _s(0), _len(0), _cap(0) { }
+ explicit inline StringAccum(int);
+ explicit StringAccum(const char *);
+ explicit StringAccum(const String &);
+#ifdef HAVE_PERMSTRING
+ explicit StringAccum(PermString);
+#endif
+ ~StringAccum() { if (_cap >= 0) delete[] _s; }
+
+ char *data() const { return (char *)_s; }
+ int length() const { return _len; }
+
+ operator bool() const { return _len != 0; }
+ bool operator!() const { return _len == 0; }
+
+ bool out_of_memory() const { return _cap < 0; }
+
+ const char *c_str();
+
+ char operator[](int i) const{ assert(i>=0&&i<_len); return (char)_s[i]; }
+ char &operator[](int i) { assert(i>=0&&i<_len); return (char &)_s[i]; }
+ char back() const { assert(_len>0); return (char)_s[_len-1]; }
+ char &back() { assert(_len>0); return (char &)_s[_len-1]; }
+
+ inline void clear();
+
+ inline char *extend(int, int = 0);
+
+ inline void append(char);
+ inline void append(unsigned char);
+ inline void append(const char *, int);
+ inline void append(const char *begin, const char *end);
+ inline void append(const unsigned char *, int);
+
+ // word joining
+ void append_break_lines(const String& text, int linelen, const String& leftmargin = String());
+
+ inline char *reserve(int);
+ void set_length(int l) { assert(l>=0 && _len<=_cap); _len = l; }
+ void forward(int n) { assert(n>=0 && _len+n<=_cap); _len += n; }
+ void pop_back(int n = 1) { assert(n>=0 && _len>=n); _len -= n; }
+
+ StringAccum &snprintf(int, const char *, ...);
+
+ inline unsigned char *take_bytes(); // returns array allocated by new[]
+ String take_string();
+
+ // see also operator<< declarations below
+
+ private:
+
+ unsigned char *_s;
+ int _len;
+ int _cap;
+
+ void make_out_of_memory();
+ inline void safe_append(const char *, int);
+ bool grow(int);
+ void erase() { _s = 0; _len = 0; _cap = 0; }
+
+ StringAccum(const StringAccum &);
+ StringAccum &operator=(const StringAccum &);
+
+ friend StringAccum &operator<<(StringAccum &, const char *);
+#ifdef HAVE_PERMSTRING
+ friend StringAccum &operator<<(StringAccum &, PermString);
+#endif
+
+};
+
+inline StringAccum &operator<<(StringAccum &, char);
+inline StringAccum &operator<<(StringAccum &, unsigned char);
+inline StringAccum &operator<<(StringAccum &, const char *);
+inline StringAccum &operator<<(StringAccum &, const String &);
+inline StringAccum &operator<<(StringAccum &, const StringAccum &);
+#ifdef HAVE_PERMSTRING
+inline StringAccum &operator<<(StringAccum &, PermString);
+#endif
+
+inline StringAccum &operator<<(StringAccum &, bool);
+inline StringAccum &operator<<(StringAccum &, short);
+inline StringAccum &operator<<(StringAccum &, unsigned short);
+inline StringAccum &operator<<(StringAccum &, int);
+inline StringAccum &operator<<(StringAccum &, unsigned);
+StringAccum &operator<<(StringAccum &, long);
+StringAccum &operator<<(StringAccum &, unsigned long);
+StringAccum &operator<<(StringAccum &, double);
+
+
+inline
+StringAccum::StringAccum(int cap)
+ : _s(new unsigned char[cap]), _len(0), _cap(cap)
+{
+ assert(cap > 0);
+ if (!_s)
+ _cap = -1;
+}
+
+inline void
+StringAccum::append(unsigned char c)
+{
+ if (_len < _cap || grow(_len))
+ _s[_len++] = c;
+}
+
+inline void
+StringAccum::append(char c)
+{
+ append(static_cast<unsigned char>(c));
+}
+
+inline char *
+StringAccum::reserve(int hm)
+{
+ assert(hm >= 0);
+ if (_len + hm <= _cap || grow(_len + hm))
+ return (char *)(_s + _len);
+ else
+ return 0;
+}
+
+inline char *
+StringAccum::extend(int amt, int extra)
+{
+ assert(extra >= 0);
+ char *c = reserve(amt + extra);
+ if (c)
+ _len += amt;
+ return c;
+}
+
+inline void
+StringAccum::safe_append(const char *s, int len)
+{
+ if (char *x = extend(len))
+ memcpy(x, s, len);
+}
+
+inline void
+StringAccum::append(const char *s, int len)
+{
+ if (len < 0)
+ len = strlen(s);
+ else if (len == 0 && s == String::out_of_memory_data())
+ make_out_of_memory();
+ safe_append(s, len);
+}
+
+inline void
+StringAccum::append(const unsigned char *s, int len)
+{
+ append(reinterpret_cast<const char *>(s), len);
+}
+
+inline void
+StringAccum::append(const char *begin, const char *end)
+{
+ if (begin < end)
+ safe_append(begin, end - begin);
+ else if (begin == String::out_of_memory_data())
+ make_out_of_memory();
+}
+
+inline unsigned char *
+StringAccum::take_bytes()
+{
+ unsigned char *str = _s;
+ erase();
+ return str;
+}
+
+inline void
+StringAccum::clear()
+{
+ if (_cap < 0)
+ _cap = 0, _s = 0;
+ _len = 0;
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, char c)
+{
+ sa.append(c);
+ return sa;
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned char c)
+{
+ sa.append(c);
+ return sa;
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, const char *s)
+{
+ sa.safe_append(s, strlen(s));
+ return sa;
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, bool b)
+{
+ return sa << (b ? "true" : "false");
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, short i)
+{
+ return sa << static_cast<long>(i);
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned short u)
+{
+ return sa << static_cast<unsigned long>(u);
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, int i)
+{
+ return sa << static_cast<long>(i);
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned u)
+{
+ return sa << static_cast<unsigned long>(u);
+}
+
+inline StringAccum &
+operator<<(StringAccum &sa, const String &s)
+{
+ sa.append(s.data(), s.length());
+ return sa;
+}
+
+#ifdef HAVE_PERMSTRING
+inline StringAccum &
+operator<<(StringAccum &sa, PermString s)
+{
+ sa.safe_append(s.c_str(), s.length());
+ return sa;
+}
+#endif
+
+inline StringAccum &
+operator<<(StringAccum &sa, const StringAccum &sb)
+{
+ sa.append(sb.data(), sb.length());
+ return sa;
+}
+
+inline bool
+operator==(StringAccum &sa, const char *s)
+{
+ return strcmp(sa.c_str(), s) == 0;
+}
+
+inline bool
+operator!=(StringAccum &sa, const char *s)
+{
+ return strcmp(sa.c_str(), s) != 0;
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/string.hh b/Build/source/utils/lcdf-typetools/include/lcdf/string.hh
new file mode 100644
index 00000000000..34eb1af3ed9
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/string.hh
@@ -0,0 +1,460 @@
+// -*- related-file-name: "../../liblcdf/string.cc" -*-
+#ifndef LCDF_STRING_HH
+#define LCDF_STRING_HH
+#ifdef HAVE_PERMSTRING
+# include <lcdf/permstr.hh>
+#endif
+#include <assert.h>
+class StringAccum;
+
+class String { public:
+
+ // Call static_initialize() before any function which might deal with
+ // Strings, and declare a String::Initializer in any file in which you
+ // declare static global Strings.
+ struct Initializer { Initializer(); };
+ friend struct String::Initializer;
+ static void static_initialize();
+ static void static_cleanup();
+
+ inline String();
+ inline String(const String &s);
+ String(const char *cc) { assign(cc, -1); }
+ String(const char *cc, int l) { assign(cc, l); }
+#ifdef HAVE_PERMSTRING
+ inline String(PermString p);
+#endif
+ explicit inline String(char);
+ explicit inline String(unsigned char);
+ explicit String(int);
+ explicit String(unsigned);
+ explicit String(long);
+ explicit String(unsigned long);
+ explicit String(double);
+ inline ~String();
+
+ static const String &null_string() { return *null_string_p; }
+ static const String &out_of_memory_string() { return *oom_string_p; }
+ static const char *out_of_memory_data() { return &oom_string_data; }
+ static String garbage_string(int n); // n garbage characters
+ static String fill_string(int c, int n); // n copies of c
+ static String stable_string(const char *, int = -1); // stable read-only memory
+
+ bool out_of_memory() const { return _data == &oom_string_data; }
+
+ int length() const { return _length; }
+ const char *data() const { return _data; }
+ const unsigned char *udata() const { return reinterpret_cast<const unsigned char *>(_data); }
+
+ typedef const char *const_iterator;
+ typedef const_iterator iterator;
+ const_iterator begin() const { return _data; }
+ const_iterator end() const { return _data + _length; }
+
+ char *mutable_data();
+ char *mutable_c_str();
+ unsigned char *mutable_udata() { return reinterpret_cast<unsigned char *>(mutable_data()); }
+
+ operator bool() const { return _length != 0; }
+ bool operator!() const { return _length == 0; }
+
+#ifdef HAVE_PERMSTRING
+ operator PermString() const { return PermString(_data, _length); }
+#endif
+
+ const char *c_str() const; // pointer returned is semi-transient
+
+ char operator[](int i) const { return _data[i]; }
+ char back() const { return _data[_length - 1]; }
+ int find_left(int c, int start = 0) const;
+ int find_left(const String &s, int start = 0) const;
+ int find_right(int c, int start = 0x7FFFFFFF) const;
+
+ bool equals(const char *, int) const;
+ // bool operator==(const String &, const String &);
+ // bool operator==(const String &, const char *);
+ // bool operator==(const char *, const String &);
+ // bool operator!=(const String &, const String &);
+ // bool operator!=(const String &, const char *);
+ // bool operator!=(const char *, const String &);
+
+ int compare(const char *, int) const;
+ int compare(const String &x) const { return compare(x._data, x._length); }
+ static inline int compare(const String &a, const String &b);
+ // bool operator<(const String &, const String &);
+ // bool operator<=(const String &, const String &);
+ // bool operator>(const String &, const String &);
+ // bool operator>=(const String &, const String &);
+
+ String substring(const char *begin, const char *end) const;
+ String substring(int pos, int len) const;
+ String substring(int pos) const { return substring(pos, _length); }
+
+ String lower() const;
+ String upper() const;
+ String printable() const;
+
+ inline String &operator=(const String &);
+ inline String &operator=(const char *);
+#ifdef HAVE_PERMSTRING
+ inline String &operator=(PermString);
+#endif
+
+ void append(const char *, int len);
+ void append_fill(int c, int len);
+ char *append_garbage(int len);
+ inline String &operator+=(const String &);
+ inline String &operator+=(const char *);
+ inline String &operator+=(char);
+#ifdef HAVE_PERMSTRING
+ inline String &operator+=(PermString p);
+#endif
+
+ // String operator+(String, const String &);
+ // String operator+(String, const char *);
+ // String operator+(const char *, const String &);
+ // String operator+(String, PermString);
+ // String operator+(PermString, String);
+ // String operator+(PermString, const char *);
+ // String operator+(const char *, PermString);
+ // String operator+(PermString, PermString);
+ // String operator+(String, char);
+
+ void align(int);
+
+ private:
+
+ struct Memo {
+ int _refcount;
+ int _capacity;
+ int _dirty;
+ char *_real_data;
+
+ inline Memo();
+ inline Memo(char *, int, int);
+ Memo(int, int);
+ ~Memo();
+ };
+
+ mutable const char *_data; // mutable for c_str()
+ mutable int _length;
+ mutable Memo *_memo;
+
+ inline String(const char *, int, Memo *);
+
+ inline void assign(const String &) const;
+ void assign(const char *, int);
+#ifdef HAVE_PERMSTRING
+ inline void assign(PermString) const;
+#endif
+ inline void deref() const;
+ void make_out_of_memory();
+
+ static Memo *null_memo;
+ static Memo *permanent_memo;
+ static Memo *oom_memo;
+ static String *null_string_p;
+ static String *oom_string_p;
+ static const char oom_string_data;
+
+ static String claim_string(char *, int, int); // claim memory
+
+ friend class StringAccum;
+
+};
+
+
+inline
+String::String(const char *data, int length, Memo *memo)
+ : _data(data), _length(length), _memo(memo)
+{
+ _memo->_refcount++;
+}
+
+inline void
+String::assign(const String &s) const
+{
+ _data = s._data;
+ _length = s._length;
+ _memo = s._memo;
+ _memo->_refcount++;
+}
+
+inline void
+String::deref() const
+{
+ if (--_memo->_refcount == 0)
+ delete _memo;
+}
+
+inline
+String::String()
+ : _data(null_memo->_real_data), _length(0), _memo(null_memo)
+{
+ _memo->_refcount++;
+}
+
+inline
+String::String(char c)
+{
+ assign(&c, 1);
+}
+
+inline
+String::String(unsigned char c)
+{
+ assign(reinterpret_cast<char *>(&c), 1);
+}
+
+inline
+String::String(const String &s)
+{
+ assign(s);
+}
+
+inline
+String::~String()
+{
+ deref();
+}
+
+inline String
+String::substring(const char *begin, const char *end) const
+{
+ if (begin < end && begin >= _data && end <= _data + _length)
+ return String(begin, end - begin, _memo);
+ else
+ return String();
+}
+
+inline int
+String::compare(const String &a, const String &b)
+{
+ return a.compare(b);
+}
+
+inline bool
+operator==(const String &s1, const String &s2)
+{
+ return s1.equals(s2.data(), s2.length());
+}
+
+inline bool
+operator==(const char *cc1, const String &s2)
+{
+ return s2.equals(cc1, -1);
+}
+
+inline bool
+operator==(const String &s1, const char *cc2)
+{
+ return s1.equals(cc2, -1);
+}
+
+inline bool
+operator!=(const String &s1, const String &s2)
+{
+ return !s1.equals(s2.data(), s2.length());
+}
+
+inline bool
+operator!=(const char *cc1, const String &s2)
+{
+ return !s2.equals(cc1, -1);
+}
+
+inline bool
+operator!=(const String &s1, const char *cc2)
+{
+ return !s1.equals(cc2, -1);
+}
+
+inline bool
+operator<(const String &s1, const String &s2)
+{
+ return s1.compare(s2.data(), s2.length()) < 0;
+}
+
+inline bool
+operator<=(const String &s1, const String &s2)
+{
+ return s1.compare(s2.data(), s2.length()) <= 0;
+}
+
+inline bool
+operator>(const String &s1, const String &s2)
+{
+ return s1.compare(s2.data(), s2.length()) > 0;
+}
+
+inline bool
+operator>=(const String &s1, const String &s2)
+{
+ return s1.compare(s2.data(), s2.length()) >= 0;
+}
+
+
+inline String &
+String::operator=(const String &s)
+{
+ if (&s != this) {
+ deref();
+ assign(s);
+ }
+ return *this;
+}
+
+inline String &
+String::operator=(const char *cc)
+{
+ deref();
+ assign(cc, -1);
+ return *this;
+}
+
+inline String &
+String::operator+=(const String &s)
+{
+ append(s._data, s._length);
+ return *this;
+}
+
+inline String &
+String::operator+=(const char *cc)
+{
+ append(cc, -1);
+ return *this;
+}
+
+inline String &
+String::operator+=(char c)
+{
+ append_fill(c, 1);
+ return *this;
+}
+
+inline String
+operator+(String s1, const String &s2)
+{
+ s1 += s2;
+ return s1;
+}
+
+inline String
+operator+(String s1, const char *cc2)
+{
+ s1.append(cc2, -1);
+ return s1;
+}
+
+inline String
+operator+(const char *cc1, const String &s2)
+{
+ String s1(cc1);
+ s1 += s2;
+ return s1;
+}
+
+inline String
+operator+(String s1, char c2)
+{
+ s1.append(&c2, 1);
+ return s1;
+}
+
+#ifdef HAVE_PERMSTRING
+
+inline void
+String::assign(PermString p) const
+{
+ _data = p.c_str();
+ _length = p.length();
+ _memo = permanent_memo;
+ _memo->_refcount++;
+}
+
+inline
+String::String(PermString p)
+{
+ assign(p);
+}
+
+inline bool
+operator==(PermString p1, const String &s2)
+{
+ return s2.equals(p1.c_str(), p1.length());
+}
+
+inline bool
+operator==(const String &s1, PermString p2)
+{
+ return s1.equals(p2.c_str(), p2.length());
+}
+
+inline bool
+operator!=(PermString p1, const String &s2)
+{
+ return !s2.equals(p1.c_str(), p1.length());
+}
+
+inline bool
+operator!=(const String &s1, PermString p2)
+{
+ return !s1.equals(p2.c_str(), p2.length());
+}
+
+inline String &
+String::operator=(PermString p)
+{
+ deref();
+ assign(p);
+ return *this;
+}
+
+inline String &
+String::operator+=(PermString p)
+{
+ append(p.c_str(), p.length());
+ return *this;
+}
+
+inline String
+operator+(String s1, PermString p2)
+{
+ s1.append(p2.c_str(), p2.length());
+ return s1;
+}
+
+inline String
+operator+(PermString p1, String s2)
+{
+ String s1(p1);
+ return s1 + s2;
+}
+
+inline String
+operator+(PermString p1, const char *cc2)
+{
+ String s1(p1);
+ return s1 + cc2;
+}
+
+inline String
+operator+(const char *cc1, PermString p2)
+{
+ String s1(cc1);
+ return s1 + p2;
+}
+
+inline String
+operator+(PermString p1, PermString p2)
+{
+ String s1(p1);
+ return s1 + p2;
+}
+
+#endif
+
+unsigned hashcode(const String &);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/strtonum.h b/Build/source/utils/lcdf-typetools/include/lcdf/strtonum.h
new file mode 100644
index 00000000000..ee8745a4a42
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/strtonum.h
@@ -0,0 +1,10 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+double strtonumber(const char *, char **);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/transform.hh b/Build/source/utils/lcdf-typetools/include/lcdf/transform.hh
new file mode 100644
index 00000000000..64c8dc384b7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/transform.hh
@@ -0,0 +1,162 @@
+// -*- related-file-name: "../../liblcdf/transform.cc" -*-
+#ifndef LCDF_TRANSFORM_HH
+#define LCDF_TRANSFORM_HH
+#include <lcdf/bezier.hh>
+#include <lcdf/string.hh>
+#include <assert.h>
+
+class Transform { public:
+
+ Transform();
+ Transform(const double[6]);
+ Transform(double scalex, double sheary, double shearx, double scaley, double shiftx, double shifty);
+ // Transform(const Transform &) generated by compiler
+ // ~Transform() generated by compiler
+
+ double operator[](int i) const { assert(i>=0&&i<6); return _m[i]; }
+ bool null() const { return _null; }
+ void check_null(double tolerance);
+
+ void scale(double, double);
+ void scale(const Point &p) { scale(p.x, p.y); }
+ void scale(double d) { scale(d, d); }
+ void rotate(double);
+ void translate(double, double);
+ void translate(const Point &p) { translate(p.x, p.y); }
+ void shear(double);
+ inline void transform(const Transform &);
+
+ inline Transform scaled(double, double) const;
+ Transform scaled(const Point &p) const { return scaled(p.x, p.y); }
+ Transform scaled(double d) const { return scaled(d, d); }
+ inline Transform rotated(double) const;
+ inline Transform translated(double, double) const;
+ inline Transform translated(const Point &p) const;
+ inline Transform sheared(double) const;
+ Transform transformed(const Transform &) const;
+
+ // Transform operator+(Transform, const Point &);
+ // Transform &operator+=(Transform &, const Point &);
+ // Transform operator*(Transform, double);
+ // Transform &operator*=(Transform &, double);
+ // Transform operator*(Transform, const Transform &);
+ // Transform &operator*=(Transform &, const Transform &);
+ friend Point operator*(const Point &, const Transform &);
+ friend Point &operator*=(Point &, const Transform &);
+ friend Bezier operator*(const Bezier &, const Transform &);
+ friend Bezier &operator*=(Bezier &, const Transform &);
+
+ String unparse() const;
+
+ private:
+
+ // stored in PostScript order (along columns)
+ double _m[6];
+ bool _null;
+
+ void real_apply_to(Point &) const;
+ Point real_apply(const Point &) const;
+
+};
+
+
+inline Transform
+Transform::scaled(double x, double y) const
+{
+ Transform t(*this);
+ t.scale(x, y);
+ return t;
+}
+
+inline Transform
+Transform::rotated(double r) const
+{
+ Transform t(*this);
+ t.rotate(r);
+ return t;
+}
+
+inline Transform
+Transform::translated(double x, double y) const
+{
+ Transform t(*this);
+ t.translate(x, y);
+ return t;
+}
+
+inline Transform
+Transform::translated(const Point &p) const
+{
+ return translated(p.x, p.y);
+}
+
+inline Transform
+Transform::sheared(double s) const
+{
+ Transform t(*this);
+ t.shear(s);
+ return t;
+}
+
+
+inline Transform &
+operator+=(Transform &t, const Point &p)
+{
+ t.translate(p);
+ return t;
+}
+
+inline Transform
+operator+(Transform t, const Point &p)
+{
+ return t += p;
+}
+
+inline Transform &
+operator*=(Transform &t, double scale)
+{
+ t.scale(scale);
+ return t;
+}
+
+inline Transform
+operator*(Transform t, double scale)
+{
+ return t *= scale;
+}
+
+inline Transform
+operator*(const Transform &t, const Transform &tt)
+{
+ return t.transformed(tt);
+}
+
+inline Transform &
+operator*=(Transform &t, const Transform &tt)
+{
+ t = t.transformed(tt);
+ return t;
+}
+
+inline void
+Transform::transform(const Transform &t)
+{
+ *this *= t;
+}
+
+
+inline Point &
+operator*=(Point &p, const Transform &t)
+{
+ if (!t.null())
+ t.real_apply_to(p);
+ return p;
+}
+
+inline Point
+operator*(const Point &p, const Transform &t)
+{
+ return (t.null() ? p : t.real_apply(p));
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/vector.cc b/Build/source/utils/lcdf-typetools/include/lcdf/vector.cc
new file mode 100644
index 00000000000..0097edb2e47
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/vector.cc
@@ -0,0 +1,130 @@
+#ifndef LCDF_VECTOR_CC
+#define LCDF_VECTOR_CC
+
+/*
+ * vector.{cc,hh} -- simple array template class
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2003 International Computer Science Institute
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+/* #include <lcdf/vector.hh> */
+
+template <class T>
+Vector<T>::Vector(const Vector<T> &o)
+ : _l(0), _n(0), _capacity(0)
+{
+ *this = o;
+}
+
+template <class T>
+Vector<T>::~Vector()
+{
+ for (int i = 0; i < _n; i++)
+ _l[i].~T();
+ delete[] (unsigned char *)_l;
+}
+
+template <class T> Vector<T> &
+Vector<T>::operator=(const Vector<T> &o)
+{
+ if (&o != this) {
+ for (int i = 0; i < _n; i++)
+ _l[i].~T();
+ _n = 0;
+ if (reserve(o._n)) {
+ _n = o._n;
+ for (int i = 0; i < _n; i++)
+ new(velt(i)) T(o._l[i]);
+ }
+ }
+ return *this;
+}
+
+template <class T> Vector<T> &
+Vector<T>::assign(int n, const T &e)
+{
+ resize(0, e);
+ resize(n, e);
+ return *this;
+}
+
+template <class T> typename Vector<T>::iterator
+Vector<T>::erase(iterator a, iterator b)
+{
+ if (b > a) {
+ assert(a >= begin() && b <= end());
+ iterator i = a, j = b;
+ for (; j < end(); i++, j++) {
+ i->~T();
+ new((void*) i) T(*j);
+ }
+ for (; i < end(); i++)
+ i->~T();
+ _n -= b - a;
+ return a;
+ } else
+ return b;
+}
+
+template <class T> bool
+Vector<T>::reserve(int want)
+{
+ if (want < 0)
+ want = _capacity > 0 ? _capacity * 2 : 4;
+ if (want <= _capacity)
+ return true;
+
+ T *new_l = (T *)new unsigned char[sizeof(T) * want];
+ if (!new_l)
+ return false;
+
+ for (int i = 0; i < _n; i++) {
+ new(velt(new_l, i)) T(_l[i]);
+ _l[i].~T();
+ }
+ delete[] (unsigned char *)_l;
+
+ _l = new_l;
+ _capacity = want;
+ return true;
+}
+
+template <class T> void
+Vector<T>::resize(int nn, const T &e)
+{
+ if (nn <= _capacity || reserve(nn)) {
+ for (int i = nn; i < _n; i++)
+ _l[i].~T();
+ for (int i = _n; i < nn; i++)
+ new(velt(i)) T(e);
+ _n = nn;
+ }
+}
+
+template <class T> void
+Vector<T>::swap(Vector<T> &o)
+{
+ T *l = _l;
+ int n = _n;
+ int cap = _capacity;
+ _l = o._l;
+ _n = o._n;
+ _capacity = o._capacity;
+ o._l = l;
+ o._n = n;
+ o._capacity = cap;
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/include/lcdf/vector.hh b/Build/source/utils/lcdf-typetools/include/lcdf/vector.hh
new file mode 100644
index 00000000000..672abb88036
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/include/lcdf/vector.hh
@@ -0,0 +1,255 @@
+#ifndef LCDF_VECTOR_HH
+#define LCDF_VECTOR_HH
+#include <assert.h>
+#include <stdlib.h>
+#ifdef HAVE_NEW_HDR
+# include <new>
+#elif defined(HAVE_NEW_H)
+# include <new.h>
+#else
+static inline void *operator new(size_t, void *v) { return v; }
+#endif
+
+template <class T>
+class Vector { public:
+
+ typedef T value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+
+ typedef int size_type;
+
+ typedef T* iterator;
+ typedef const T* const_iterator;
+
+ explicit Vector() : _l(0), _n(0), _capacity(0) { }
+ explicit Vector(size_type n, const T &e) : _l(0), _n(0), _capacity(0) { resize(n, e); }
+ // template <class In> ...
+ Vector(const Vector<T> &);
+ ~Vector();
+
+ Vector<T>& operator=(const Vector<T>&);
+ Vector<T>& assign(size_type n, const T& e = T());
+ // template <class In> ...
+
+ // iterators
+ iterator begin() { return _l; }
+ const_iterator begin() const { return _l; }
+ iterator end() { return _l + _n; }
+ const_iterator end() const { return _l + _n; }
+
+ // capacity
+ size_type size() const { return _n; }
+ void resize(size_type nn, const T& e = T());
+ size_type capacity() const { return _capacity; }
+ bool empty() const { return _n == 0; }
+ bool reserve(size_type);
+
+ // element access
+ T& operator[](size_type i) { assert(i>=0 && i<_n); return _l[i]; }
+ const T& operator[](size_type i) const{ assert(i>=0 && i<_n); return _l[i]; }
+ T& at(size_type i) { return operator[](i); }
+ const T& at(size_type i) const { return operator[](i); }
+ T& front() { return operator[](0); }
+ const T& front() const { return operator[](0); }
+ T& back() { return operator[](_n - 1); }
+ const T& back() const { return operator[](_n - 1); }
+ T& at_u(size_type i) { return _l[i]; }
+ const T& at_u(size_type i) const { return _l[i]; }
+
+ // modifiers
+ inline void push_back(const T&);
+ inline void pop_back();
+ inline iterator erase(iterator);
+ iterator erase(iterator, iterator);
+ void swap(Vector<T> &);
+ void clear() { erase(begin(), end()); }
+
+ private:
+
+ T *_l;
+ size_type _n;
+ size_type _capacity;
+
+ void *velt(size_type i) const { return (void *)&_l[i]; }
+ static void *velt(T *l, size_type i) { return (void *)&l[i]; }
+
+};
+
+template <class T> inline void
+Vector<T>::push_back(const T &e)
+{
+ if (_n < _capacity || reserve(-1)) {
+ new(velt(_n)) T(e);
+ _n++;
+ }
+}
+
+template <class T> inline void
+Vector<T>::pop_back()
+{
+ assert(_n > 0);
+ --_n;
+ _l[_n].~T();
+}
+
+template <class T> inline typename Vector<T>::iterator
+Vector<T>::erase(iterator e)
+{
+ return (e < end() ? erase(e, e + 1) : e);
+}
+
+
+template <>
+class Vector<void*> { public:
+
+ typedef void* value_type;
+ typedef void*& reference;
+ typedef void* const& const_reference;
+ typedef void** pointer;
+ typedef void* const* const_pointer;
+
+ typedef int size_type;
+
+ typedef void** iterator;
+ typedef void* const* const_iterator;
+
+ explicit Vector() : _l(0), _n(0), _capacity(0) { }
+ explicit Vector(size_type n, void* e) : _l(0), _n(0), _capacity(0) { resize(n, e); }
+ Vector(const Vector<void*> &);
+ ~Vector();
+
+ Vector<void*> &operator=(const Vector<void*> &);
+ Vector<void*> &assign(size_type n, void* e = 0);
+
+ // iterators
+ iterator begin() { return _l; }
+ const_iterator begin() const { return _l; }
+ iterator end() { return _l + _n; }
+ const_iterator end() const { return _l + _n; }
+
+ // capacity
+ size_type size() const { return _n; }
+ void resize(size_type nn, void* e = 0);
+ size_type capacity() const { return _capacity; }
+ bool empty() const { return _n == 0; }
+ bool reserve(size_type);
+
+ // element access
+ void*& operator[](size_type i) { assert(i>=0 && i<_n); return _l[i]; }
+ void* operator[](size_type i) const { assert(i>=0 && i<_n); return _l[i]; }
+ void*& at(size_type i) { return operator[](i); }
+ void* at(size_type i) const { return operator[](i); }
+ void*& front() { return operator[](0); }
+ void* front() const { return operator[](0); }
+ void*& back() { return operator[](_n - 1); }
+ void* back() const { return operator[](_n - 1); }
+ void*& at_u(size_type i) { return _l[i]; }
+ void* at_u(size_type i) const { return _l[i]; }
+
+ // modifiers
+ inline void push_back(void*);
+ inline void pop_back();
+ inline iterator erase(iterator);
+ iterator erase(iterator, iterator);
+ void swap(Vector<void*> &);
+ void clear() { _n = 0; }
+
+ private:
+
+ void **_l;
+ size_type _n;
+ size_type _capacity;
+
+};
+
+inline void
+Vector<void*>::push_back(void *e)
+{
+ if (_n < _capacity || reserve(-1)) {
+ _l[_n] = e;
+ _n++;
+ }
+}
+
+inline void
+Vector<void*>::pop_back()
+{
+ assert(_n > 0);
+ --_n;
+}
+
+inline Vector<void*>::iterator
+Vector<void*>::erase(Vector<void*>::iterator e)
+{
+ return (e < end() ? erase(e, e + 1) : e);
+}
+
+
+template <class T>
+class Vector<T*>: private Vector<void*> {
+
+ typedef Vector<void*> Base;
+
+ public:
+
+ typedef T* value_type;
+ typedef T*& reference;
+ typedef T* const& const_reference;
+ typedef T** pointer;
+ typedef T* const* const_pointer;
+
+ typedef int size_type;
+
+ typedef T** iterator;
+ typedef T* const* const_iterator;
+
+ explicit Vector() : Base() { }
+ explicit Vector(size_type n, T* e) : Base(n, (void *)e) { }
+ Vector(const Vector<T *> &o) : Base(o) { }
+ ~Vector() { }
+
+ Vector<T *> &operator=(const Vector<T *> &o)
+ { Base::operator=(o); return *this; }
+ Vector<T *> &assign(size_type n, T *e = 0)
+ { Base::assign(n, (void *)e); return *this; }
+
+ // iterators
+ const_iterator begin() const { return (const_iterator)(Base::begin()); }
+ iterator begin() { return (iterator)(Base::begin()); }
+ const_iterator end() const { return (const_iterator)(Base::end()); }
+ iterator end() { return (iterator)(Base::end()); }
+
+ // capacity
+ size_type size() const { return Base::size(); }
+ void resize(size_type n, T *e = 0) { Base::resize(n, (void *)e); }
+ size_type capacity() const { return Base::capacity(); }
+ bool empty() const { return Base::empty(); }
+ bool reserve(size_type n) { return Base::reserve(n); }
+
+ // element access
+ T*& operator[](size_type i) { return (T*&)(Base::at(i)); }
+ T* operator[](size_type i) const { return (T*)(Base::operator[](i)); }
+ T*& at(size_type i) { return (T*&)(Base::operator[](i)); }
+ T* at(size_type i) const { return (T*)(Base::at(i)); }
+ T*& front() { return (T*&)(Base::front()); }
+ T* front() const { return (T*)(Base::front()); }
+ T*& back() { return (T*&)(Base::back()); }
+ T* back() const { return (T*)(Base::back()); }
+ T*& at_u(size_type i) { return (T*&)(Base::at_u(i)); }
+ T* at_u(size_type i) const { return (T*)(Base::at_u(i)); }
+
+ // modifiers
+ void push_back(T* e) { Base::push_back((void*)e); }
+ void pop_back() { Base::pop_back(); }
+ iterator erase(iterator i) { return Base::erase((void**)i); }
+ iterator erase(iterator i, iterator j) { return Base::erase((void**)i, (void**)j); }
+ void swap(Vector<T *> &o) { Base::swap(o); }
+ void clear() { Base::clear(); }
+
+};
+
+#include <lcdf/vector.cc> // necessary to support GCC 3.3
+#endif
diff --git a/Build/source/utils/lcdf-typetools/install-sh b/Build/source/utils/lcdf-typetools/install-sh
new file mode 100755
index 00000000000..dd97db7aa1c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/install-sh
@@ -0,0 +1,322 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2004-09-10.20
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit 0;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit 0;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/lcdf-typetools/lcdf-typetools.spec b/Build/source/utils/lcdf-typetools/lcdf-typetools.spec
new file mode 100644
index 00000000000..7224140fbc5
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/lcdf-typetools.spec
@@ -0,0 +1,89 @@
+Summary: Programs to manipulate OpenType and multiple-master fonts
+Name: lcdf-typetools
+Version: 2.16
+Release: hmcmath.1
+Copyright: GPL
+Vendor: Little Cambridgeport Design Factory <http://www.lcdf.org/>
+Group: Utilities/Printing
+Source: %{name}-%{version}.tar.gz
+Buildroot: /var/tmp/%{name}-%{version}-buildroot
+Requires: tetex > 2.0
+
+%description
+This package contains four tools for working with OpenType fonts:
+
+ cfftot1 allows you to translate Compact Font Format (CFF) or
+ PostScript-flavored OpenType fonts into PostScript
+ Type 1 font format
+
+ otfinfo reports information about OpenType fonts, such as the
+ features they support and the contents of their ``size''
+ optical size option
+
+ otftotfm allows you to create TeX font metrics and encodings for
+ using PostScript-flavored OpenType fonts
+
+ t1dotlessj creates a Type 1 font with a single character --
+ the dotless j corresponding to the specified design
+
+ t1lint checks a Type 1 font for correctness (preliminary)
+
+ t1testpage creates a PostScript test page for a specified
+ font file (preliminary)
+
+The package now includes programs for working with multiple-master
+fonts formerly distributed as mminstance. These tools allow you to
+use multiple-master fonts with programs that require single-master
+fonts (afm2tfm, ps2pk, fontinst, etc.). Both programs work fine with
+fonts that contain intermediate masters (e.g., Adobe Jenson MM and
+Adobe Kepler MM).
+
+mmafm creates an AFM (Adobe font metric) file corresponding to
+ a single instance of a multiple-master font. It reads
+ (and therefore requires) the AMFM and AFM files
+ distributed with the font.
+
+mmpfb creates a normal, single-master font program that looks
+ like an instance of a multiple-master font. It reads
+ the multiple-master font program in PFA or PFB format.
+
+## PREP
+%prep
+%setup -q
+
+## BUILD
+%build
+%configure
+make
+
+## PRE
+%pre
+
+## POST
+%post
+
+## INSTALL
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+#make install all DESTDIR=%{buildroot}
+
+## FILES
+%files
+%defattr(-,root,root)
+%doc NEWS ONEWS README
+%{_bindir}/cfftot1
+%{_bindir}/mmafm
+%{_bindir}/mmpfb
+%{_bindir}/otfinfo
+%{_bindir}/otftotfm
+%{_bindir}/t1dotlessj
+%{_bindir}/t1lint
+%{_bindir}/t1testpage
+%{_mandir}/man*/*
+%{_datadir}/lcdf-typetools/*
+
+%changelog
+
+* Wed Sep 8 2004 Claire Connelly <cmc@math.hmc.edu> - 2.12-hmcmath.1
+- Initial packaging.
diff --git a/Build/source/utils/lcdf-typetools/libefont/Makefile.am b/Build/source/utils/lcdf-typetools/libefont/Makefile.am
new file mode 100644
index 00000000000..feeb45d2c78
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/Makefile.am
@@ -0,0 +1,48 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+noinst_LIBRARIES = libefont.a
+
+libefont_a_SOURCES = \
+ afm.cc \
+ afmparse.cc \
+ afmw.cc \
+ amfm.cc \
+ cff.cc \
+ encoding.cc \
+ findmet.cc \
+ metrics.cc \
+ otf.cc \
+ otfcmap.cc \
+ otfdata.cc \
+ otfdescrip.cc \
+ otfgpos.cc \
+ otfgsub.cc \
+ otfname.cc \
+ otfos2.cc \
+ pairop.cc \
+ psres.cc \
+ t1bounds.cc \
+ t1cs.cc \
+ t1csgen.cc \
+ t1interp.cc \
+ t1item.cc \
+ t1font.cc \
+ t1fontskel.cc \
+ t1mm.cc \
+ t1rw.cc \
+ t1unparser.cc
+
+libefont_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+
+INCLUDES = -I$(top_srcdir)/include
+
+srclinks:
+ test -d $(top_srcdir)/include || mkdir $(top_srcdir)/include
+ test -d $(top_srcdir)/include/efont || mkdir $(top_srcdir)/include/efont
+ I=../../libefont/include/efont S=../../libefont/libefont; \
+ cd $(srcdir); for i in $(libefont_a_SOURCES); do \
+ j=`echo $$i | sed 's/.cc$$//'`; \
+ test -f $$I/$$j.hh && ln -sf ../$$I/$$j.hh ../include/efont/$$j.hh; \
+ test -f $$S/$$i && ln -sf $$S/$$i $$i; done
diff --git a/Build/source/utils/lcdf-typetools/libefont/Makefile.in b/Build/source/utils/lcdf-typetools/libefont/Makefile.in
new file mode 100644
index 00000000000..11e85d5400a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/Makefile.in
@@ -0,0 +1,467 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(libefont_a_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = libefont
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libefont_a_AR = $(AR) $(ARFLAGS)
+libefont_a_DEPENDENCIES =
+am_libefont_a_OBJECTS = afm.$(OBJEXT) afmparse.$(OBJEXT) \
+ afmw.$(OBJEXT) amfm.$(OBJEXT) cff.$(OBJEXT) encoding.$(OBJEXT) \
+ findmet.$(OBJEXT) metrics.$(OBJEXT) otf.$(OBJEXT) \
+ otfcmap.$(OBJEXT) otfdata.$(OBJEXT) otfdescrip.$(OBJEXT) \
+ otfgpos.$(OBJEXT) otfgsub.$(OBJEXT) otfname.$(OBJEXT) \
+ otfos2.$(OBJEXT) pairop.$(OBJEXT) psres.$(OBJEXT) \
+ t1bounds.$(OBJEXT) t1cs.$(OBJEXT) t1csgen.$(OBJEXT) \
+ t1interp.$(OBJEXT) t1item.$(OBJEXT) t1font.$(OBJEXT) \
+ t1fontskel.$(OBJEXT) t1mm.$(OBJEXT) t1rw.$(OBJEXT) \
+ t1unparser.$(OBJEXT)
+libefont_a_OBJECTS = $(am_libefont_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(libefont_a_SOURCES)
+DIST_SOURCES = $(libefont_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+noinst_LIBRARIES = libefont.a
+libefont_a_SOURCES = \
+ afm.cc \
+ afmparse.cc \
+ afmw.cc \
+ amfm.cc \
+ cff.cc \
+ encoding.cc \
+ findmet.cc \
+ metrics.cc \
+ otf.cc \
+ otfcmap.cc \
+ otfdata.cc \
+ otfdescrip.cc \
+ otfgpos.cc \
+ otfgsub.cc \
+ otfname.cc \
+ otfos2.cc \
+ pairop.cc \
+ psres.cc \
+ t1bounds.cc \
+ t1cs.cc \
+ t1csgen.cc \
+ t1interp.cc \
+ t1item.cc \
+ t1font.cc \
+ t1fontskel.cc \
+ t1mm.cc \
+ t1rw.cc \
+ t1unparser.cc
+
+libefont_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+INCLUDES = -I$(top_srcdir)/include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libefont/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign libefont/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libefont.a: $(libefont_a_OBJECTS) $(libefont_a_DEPENDENCIES)
+ -rm -f libefont.a
+ $(libefont_a_AR) libefont.a $(libefont_a_OBJECTS) $(libefont_a_LIBADD)
+ $(RANLIB) libefont.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afmparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afmw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amfm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cff.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encoding.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findmet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metrics.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfcmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfdata.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfdescrip.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfgpos.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfgsub.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfos2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pairop.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psres.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bounds.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1cs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1csgen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1font.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fontskel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1interp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1item.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1mm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1rw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1unparser.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-noinstLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-info-am
+
+
+srclinks:
+ test -d $(top_srcdir)/include || mkdir $(top_srcdir)/include
+ test -d $(top_srcdir)/include/efont || mkdir $(top_srcdir)/include/efont
+ I=../../libefont/include/efont S=../../libefont/libefont; \
+ cd $(srcdir); for i in $(libefont_a_SOURCES); do \
+ j=`echo $$i | sed 's/.cc$$//'`; \
+ test -f $$I/$$j.hh && ln -sf ../$$I/$$j.hh ../include/efont/$$j.hh; \
+ test -f $$S/$$i && ln -sf $$S/$$i $$i; done
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/libefont/afm.cc b/Build/source/utils/lcdf-typetools/libefont/afm.cc
new file mode 100644
index 00000000000..2d879aa7c2d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/afm.cc
@@ -0,0 +1,586 @@
+// -*- related-file-name: "../include/efont/afm.hh" -*-
+
+/* afm.{cc,hh} -- Adobe Font Metrics files
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/afm.hh>
+#include <efont/afmparse.hh>
+#include <efont/t1cs.hh> /* for UNKDOUBLE */
+#include <lcdf/error.hh>
+#include <ctype.h>
+#include <assert.h>
+namespace Efont {
+
+AfmReader::AfmReader(AfmParser &parser, Metrics *afm, AfmMetricsXt *afm_xt,
+ ErrorHandler *errh)
+ : _afm(afm), _afm_xt(afm_xt), _l(parser),
+ _composite_warned(false), _metrics_sets_warned(false), _y_width_warned(0)
+{
+ _errh = errh ? errh : ErrorHandler::silent_handler();
+}
+
+Metrics *
+AfmReader::read(Slurper &slurp, ErrorHandler *errh)
+{
+ AfmParser p(slurp);
+ if (!p.ok())
+ return 0;
+
+ Metrics *afm = new Metrics;
+ AfmMetricsXt *afm_xt = new AfmMetricsXt;
+ afm->add_xt(afm_xt);
+ AfmReader reader(p, afm, afm_xt, errh);
+
+ if (!reader.read()) {
+ delete afm;
+ return 0;
+ } else
+ return afm;
+}
+
+Metrics *
+AfmReader::read(const Filename &fn, ErrorHandler *errh)
+{
+ Slurper slurpy(fn);
+ return read(slurpy, errh);
+}
+
+
+void
+AfmReader::lwarning(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->verror(ErrorHandler::ERR_WARNING, _l.landmark(), format, val);
+ va_end(val);
+}
+
+void
+AfmReader::lerror(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->verror(ErrorHandler::ERR_ERROR, _l.landmark(), format, val);
+ va_end(val);
+}
+
+GlyphIndex
+AfmReader::find_err(PermString name, const char *) const
+{
+ GlyphIndex gi = _afm->find(name);
+ if (gi < 0)
+ lerror("character `%s' doesn't exist", name.c_str());
+ return gi;
+}
+
+void
+AfmReader::composite_warning() const
+{
+ if (!_composite_warned)
+ lwarning("composite fonts not supported");
+ _composite_warned = 1;
+}
+
+void
+AfmReader::metrics_sets_warning() const
+{
+ if (!_metrics_sets_warned)
+ lwarning("only metrics set 0 is supported");
+ _metrics_sets_warned = 1;
+}
+
+void
+AfmReader::y_width_warning() const
+{
+ if (_y_width_warned < 40) {
+ lwarning("character has a nonzero Y width");
+ _y_width_warned++;
+ if (_y_width_warned == 40)
+ lwarning("I won't warn you again.");
+ }
+}
+
+void
+AfmReader::no_match_warning(const char *context) const
+{
+ // keyword() will fail (and a warning won't get printed) only if the string
+ // is all whitespace, which the spec allows
+ PermString keyword = _l.keyword();
+ if (!keyword) return;
+ if (_l.key_matched()) {
+ lwarning(context ? "bad `%s' command in %s:"
+ : "bad `%s' command:", keyword.c_str(), context);
+ lwarning("field %d %s", _l.fail_field(), _l.message().c_str());
+ } else
+ lwarning(context ? "unknown command `%s' in %s"
+ : "unknown command `%s'", keyword.c_str(), context);
+ _l.clear_message();
+}
+
+
+bool
+AfmReader::read()
+{
+ AfmParser &l = _l;
+ assert(_afm && _afm_xt);
+
+ // First, read all opening comments into an array so we can print them out
+ // later.
+ PermString comment;
+ while (l.next_line()) {
+ if (l.isall("Comment %+s", &comment))
+ _afm_xt->opening_comments.push_back(comment);
+ else if (l.isall("StartFontMetrics %g", (double *)0))
+ ;
+ else {
+ l.save_line();
+ break;
+ }
+ }
+
+ _afm->set_scale(1000);
+ unsigned invalid_lines = 0;
+ PermString s;
+ bool isbasefont;
+ int metrics_sets;
+ int direction;
+
+ while (l.next_line())
+ switch (l.first()) {
+
+ case 'A':
+ if (l.isall("Ascender %g", &fd( fdAscender )))
+ break;
+ goto invalid;
+
+ case 'C':
+ if (l.isall("Characters %d", (int *)0))
+ break;
+ if (l.isall("CapHeight %g", &fd( fdCapHeight )))
+ break;
+ if (l.isall("CharacterSet"))
+ break;
+ if (l.isall("CharWidth %g %g", (double *)0, (double *)0))
+ break;
+ if (l.isall("Comment"))
+ break;
+ goto invalid;
+
+ case 'D':
+ if (l.isall("Descender %g", &fd( fdDescender )))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EncodingScheme %+s", &_afm_xt->encoding_scheme))
+ break;
+ if (l.isall("EndDirection"))
+ break;
+ if (l.isall("EndFontMetrics"))
+ goto done;
+ if (l.isall("EscChar %d", (int *)0)) {
+ composite_warning();
+ break;
+ }
+ goto invalid;
+
+ case 'F':
+ if (l.isall("FontName %+s", &s)) {
+ _afm->set_font_name(s);
+ break;
+ }
+ if (l.isall("FullName %+s", &s)) {
+ _afm->set_full_name(s);
+ break;
+ }
+ if (l.isall("FamilyName %+s", &s)) {
+ _afm->set_family(s);
+ break;
+ }
+ if (l.isall("FontBBox %g %g %g %g",
+ &fd( fdFontBBllx ), &fd( fdFontBBlly ),
+ &fd( fdFontBBurx ), &fd( fdFontBBury )))
+ break;
+ goto invalid;
+
+ case 'I':
+ if (l.isall("ItalicAngle %g", &fd( fdItalicAngle )))
+ break;
+ if (l.isall("IsBaseFont %b", &isbasefont)) {
+ if (isbasefont == 0)
+ composite_warning();
+ break;
+ }
+ if (l.isall("IsFixedV %b", (bool *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ if (l.isall("IsFixedPitch %b", (bool *)0))
+ break;
+ goto invalid;
+
+ case 'M':
+ if (l.isall("MappingScheme %d", (int *)0)) {
+ composite_warning();
+ break;
+ }
+ if (l.isall("MetricsSets %d", &metrics_sets)) {
+ if (metrics_sets != 0)
+ metrics_sets_warning();
+ break;
+ }
+ goto invalid;
+
+ case 'N':
+ if (l.isall("Notice %+s", &_afm_xt->notice))
+ break;
+ goto invalid;
+
+ case 'S':
+ if (l.isall("StartDirection %d", &direction)) {
+ if (direction != 0)
+ metrics_sets_warning();
+ break;
+ }
+ if (l.isall("StartCharMetrics %d", (int *)0)) {
+ read_char_metrics();
+ break;
+ }
+ if (l.isall("StartKernData")) {
+ read_kerns();
+ break;
+ }
+ if (l.isall("StartComposites %d", (int *)0)) {
+ read_composites();
+ break;
+ }
+ if (l.isall("StdHW %g", &fd( fdStdHW )))
+ break;
+ if (l.isall("StdVW %g", &fd( fdStdVW )))
+ break;
+ if (l.isall("StartFontMetrics %g", (double *)0))
+ break;
+ goto invalid;
+
+ case 'U':
+ if (l.isall("UnderlinePosition %g", &fd( fdUnderlinePosition )))
+ break;
+ if (l.isall("UnderlineThickness %g", &fd( fdUnderlineThickness )))
+ break;
+ goto invalid;
+
+ case 'V':
+ if (l.isall("Version %+s", &s)) {
+ _afm->set_version(s);
+ break;
+ }
+ if (l.isall("VVector %g %g", (double *)0, (double *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ goto invalid;
+
+ case 'W':
+ if (l.isall("Weight %+s", &s)) {
+ _afm->set_weight(s);
+ break;
+ }
+ goto invalid;
+
+ case 'X':
+ if (l.isall("XHeight %g", &fd( fdXHeight )))
+ break;
+ goto invalid;
+
+ default:
+ invalid:
+ invalid_lines++;
+ no_match_warning();
+
+ }
+
+ done:
+ if (invalid_lines >= l.lineno() - 10)
+ return false;
+ else
+ return true;
+}
+
+
+static Vector<PermString> ligature_left;
+static Vector<PermString> ligature_right;
+static Vector<PermString> ligature_result;
+
+void
+AfmReader::read_char_metric_data() const
+{
+ int c = -1;
+ double wx = UNKDOUBLE;
+ double bllx = UNKDOUBLE, blly = 0, burx = 0, bury = 0;
+ PermString n;
+ PermString ligright, ligresult;
+
+ AfmParser &l = _l;
+
+ l.is("C %d ; WX %g ; N %/s ; B %g %g %g %g ;",
+ &c, &wx, &n, &bllx, &blly, &burx, &bury);
+
+ while (l.left()) {
+
+ switch (l.first()) {
+
+ case 'B':
+ if (l.is("B %g %g %g %g", &bllx, &blly, &burx, &bury))
+ break;
+ goto invalid;
+
+ case 'C':
+ if (l.is("C %d", &c))
+ break;
+ if (l.is("CH <%x>", &c))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EndCharMetrics"))
+ return;
+ goto invalid;
+
+ case 'L':
+ if (l.is("L %/s %/s", &ligright, &ligresult)) {
+ if (!n)
+ lerror("ligature given, but character has no name");
+ else {
+ ligature_left.push_back(n);
+ ligature_right.push_back(ligright);
+ ligature_result.push_back(ligresult);
+ }
+ break;
+ }
+ goto invalid;
+
+ case 'N':
+ if (l.is("N %/s", &n))
+ break;
+ goto invalid;
+
+ case 'W':
+ if (l.is("WX %g", &wx) ||
+ l.is("W0X %g", &wx))
+ break;
+ if (l.is("W %g %g", &wx, (double *)0) ||
+ l.is("W0 %g %g", &wx, (double *)0) ||
+ l.is("W0Y %g", (double *)0)) {
+ y_width_warning();
+ break;
+ }
+ if (l.is("W1X %g", (double *)0) ||
+ l.is("W1Y %g", (double *)0) ||
+ l.is("W1 %g %g", (double *)0, (double *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ // always warn about unknown directives here!
+ no_match_warning("character metrics");
+ l.skip_until(';');
+ break;
+
+ }
+
+ l.is(";"); // get rid of any possible semicolon
+ }
+
+ // create the character
+ if (!n)
+ lwarning("character without a name ignored");
+ else {
+ if (_afm->find(n) != -1)
+ lwarning("character %s defined twice", n.c_str());
+
+ GlyphIndex gi = _afm->add_glyph(n);
+
+ _afm->wd(gi) = wx;
+ _afm->lf(gi) = bllx;
+ _afm->rt(gi) = burx;
+ _afm->tp(gi) = bury;
+ _afm->bt(gi) = blly;
+
+ if (c != -1)
+ _afm->set_code(gi, c);
+ }
+}
+
+
+void
+AfmReader::read_char_metrics() const
+{
+ assert(!ligature_left.size());
+
+ while (_l.next_line())
+ // Grok the whole line. Are we on a character metric data line?
+ switch (_l.first()) {
+
+ case 'C':
+ if (isspace(_l[1]) || _l[1] == 'H' && isspace(_l[2])) {
+ read_char_metric_data();
+ break;
+ }
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndCharMetrics"))
+ goto end_char_metrics;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ end_char_metrics:
+
+ for (int i = 0; i < ligature_left.size(); i++) {
+ GlyphIndex leftgi = find_err(ligature_left[i], "ligature");
+ GlyphIndex rightgi = find_err(ligature_right[i], "ligature");
+ GlyphIndex resultgi = find_err(ligature_result[i], "ligature");
+ if (leftgi >= 0 && rightgi >= 0 && resultgi >= 0)
+ if (_afm->add_lig(leftgi, rightgi, resultgi))
+ lwarning("duplicate ligature; first ignored");
+ }
+ ligature_left.clear();
+ ligature_right.clear();
+ ligature_result.clear();
+}
+
+
+void
+AfmReader::read_kerns() const
+{
+ double kx;
+ PermString left, right;
+ GlyphIndex leftgi, rightgi;
+
+ AfmParser &l = _l;
+ // AFM files have reversed pair programs when read.
+ _afm->pair_program()->set_reversed(true);
+
+ while (l.next_line())
+ switch (l.first()) {
+
+ case 'C':
+ if (l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EndKernPairs"))
+ break;
+ if (l.isall("EndKernData"))
+ return;
+ if (l.isall("EndTrackKern"))
+ break;
+ goto invalid;
+
+ case 'K':
+ if (l.isall("KPX %/s %/s %g", &left, &right, &kx)) {
+ goto validkern;
+ }
+ if (l.isall("KP %/s %/s %g %g", &left, &right, &kx, (double *)0)) {
+ y_width_warning();
+ goto validkern;
+ }
+ if (l.isall("KPY %/s %/s %g", &left, &right, (double *)0)) {
+ y_width_warning();
+ break;
+ }
+ if (l.isall("KPH <%x> <%x> %g %g", (int *)0, (int *)0,
+ (double *)0, (double *)0)) {
+ lwarning("KPH not supported");
+ break;
+ }
+ goto invalid;
+
+ validkern:
+ leftgi = find_err(left, "kern");
+ rightgi = find_err(right, "kern");
+ if (leftgi >= 0 && rightgi >= 0)
+ // A kern with 0 amount is NOT useless!
+ // (Because of multiple masters.)
+ if (_afm->add_kern(leftgi, rightgi, _afm->add_kv(kx)))
+ lwarning("duplicate kern; first pair ignored");
+ break;
+
+ case 'S':
+ if (l.isall("StartKernPairs %d", (int *)0) ||
+ l.isall("StartKernPairs0 %d", (int *)0))
+ break;
+ if (l.isall("StartKernPairs1 %d", (int *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ if (l.isall("StartTrackKern %d", (int *)0))
+ break;
+ goto invalid;
+
+ case 'T':
+ if (l.isall("TrackKern %g %g %g %g %g", (double *)0, (double *)0,
+ (double *)0, (double *)0, (double *)0))
+ break; // FIXME: implement TrackKern
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+ break;
+
+ }
+}
+
+
+void
+AfmReader::read_composites() const
+{
+ while (_l.next_line())
+ switch (_l.first()) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ if (_l.is("CC"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndComposites"))
+ return;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+ break;
+
+ }
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/afmparse.cc b/Build/source/utils/lcdf-typetools/libefont/afmparse.cc
new file mode 100644
index 00000000000..b52747d5e62
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/afmparse.cc
@@ -0,0 +1,365 @@
+// -*- related-file-name: "../include/efont/afmparse.hh" -*-
+
+/* afmparse.{cc,hh} -- Adobe Font Metrics parsing
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/afmparse.hh>
+#include <efont/t1cs.hh>
+#include <efont/metrics.hh>
+#include <lcdf/strtonum.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <stdlib.h>
+#ifdef BROKEN_STRTOD
+# define strtod good_strtod
+#endif
+namespace Efont {
+
+static bool name_enders[256];
+static char xvalue[256];
+
+
+AfmParser::AfmParser(Slurper &slurp)
+ : _slurper(slurp),
+ _line(0), _pos(0), _length(0)
+{
+ static_initialize();
+}
+
+
+void
+AfmParser::trim_end()
+{
+ int l = _length - 1;
+ while (l >= 0 && isspace(_line[l])) {
+ _line[l] = 0;
+ l--;
+ }
+ _length = l + 1;
+}
+
+
+void
+AfmParser::static_initialize()
+{
+ if (name_enders[(uint8_t)'('])
+ return;
+ name_enders[(uint8_t)' '] = name_enders[(uint8_t)'\t']
+ = name_enders[(uint8_t)'\r'] = name_enders[(uint8_t)'\f']
+ = name_enders[(uint8_t)'\v'] = name_enders[(uint8_t)'\n']
+ = name_enders[(uint8_t)'\0'] = name_enders[(uint8_t)'[']
+ = name_enders[(uint8_t)']'] = name_enders[(uint8_t)'/']
+ = name_enders[(uint8_t)'('] = name_enders[(uint8_t)')']
+ = name_enders[(uint8_t)';'] = true;
+
+ xvalue[(uint8_t)'0'] = 0;
+ xvalue[(uint8_t)'1'] = 1;
+ xvalue[(uint8_t)'2'] = 2;
+ xvalue[(uint8_t)'3'] = 3;
+ xvalue[(uint8_t)'4'] = 4;
+ xvalue[(uint8_t)'5'] = 5;
+ xvalue[(uint8_t)'6'] = 6;
+ xvalue[(uint8_t)'7'] = 7;
+ xvalue[(uint8_t)'8'] = 8;
+ xvalue[(uint8_t)'9'] = 9;
+ xvalue[(uint8_t)'a'] = 10;
+ xvalue[(uint8_t)'b'] = 11;
+ xvalue[(uint8_t)'c'] = 12;
+ xvalue[(uint8_t)'d'] = 13;
+ xvalue[(uint8_t)'e'] = 14;
+ xvalue[(uint8_t)'f'] = 15;
+ xvalue[(uint8_t)'A'] = 10;
+ xvalue[(uint8_t)'B'] = 11;
+ xvalue[(uint8_t)'C'] = 12;
+ xvalue[(uint8_t)'D'] = 13;
+ xvalue[(uint8_t)'E'] = 14;
+ xvalue[(uint8_t)'F'] = 15;
+}
+
+
+// isall == is total == is all of the string
+
+// %s whitespace-terminated PermString - non-zero-length
+// %/s name-terminated PermString - non-zero-length
+// %+s rest of line PermString
+// %= rest of line/until next `=' PermString; beginning & ending spaces
+// elided
+// %d integer
+// %g number
+// %x hex integer
+// %b boolean
+// %c character
+// %< hex string; argument is String *stored
+// %. any non-alphanumeric
+// ???????????? EOS vs. don't-skip-to-EOS ???????????
+
+
+#define FAIL(s) do { _message = s; return 0; } while (0)
+
+unsigned char *
+AfmParser::vis(const char *formatsigned, va_list valist)
+{
+ const unsigned char *format = (const unsigned char *)formatsigned;
+ unsigned char *str = _pos;
+
+ // Oftentimes, we'll get a keyword first. So handle that simple case
+ // with a tight loop for (possibly) better performance and slightly different
+ // semantics. (A keyword that comes first in the format must be followed
+ // by a nonalphanumeric in the input to match.)
+ if (isalpha(*format)) {
+ bool ok = true;
+ for (; *format && *format != ' ' && ok; format++, str++) {
+ assert(isalnum(*format));
+ if (*format != *str) ok = false;
+ }
+ if (!ok || isalnum(*str)) {
+ if (_message) return 0;
+ _fail_field = -1;
+ FAIL("keyword mismatch");
+ }
+ }
+
+ int fplus, fslash;
+ _fail_field = 0;
+ _message = PermString();
+
+ while (1) {
+
+ switch (*format) {
+
+ /* - - - - - - - - percent specifications - - - - - - - */
+ case '%':
+ fplus = fslash = 0;
+ _fail_field++;
+
+ percentspec:
+ switch (*++format) {
+
+ // FLAGS
+ case '+':
+ fplus++;
+ goto percentspec;
+ case '/':
+ fslash++;
+ goto percentspec;
+
+ case '%':
+ goto matchchar;
+
+ case 'b':
+ case 's': {
+ int len;
+
+ if (fplus)
+ len = strlen((char *)str);
+ else if (fslash) {
+ for (len = 0; !name_enders[ str[len] ]; len++)
+ ;
+ if (len == 0)
+ FAIL("should be a string");
+ } else {
+ for (len = 0; !isspace(str[len]) && str[len]; len++)
+ ;
+ if (len == 0)
+ FAIL("should be a string");
+ }
+
+ PermString s = PermString((char *)str, len);
+ str += len;
+
+ // Now we have the string. What to do with it? Depends on format.
+ if (*format == 'b') {
+
+ bool *bstore = va_arg(valist, bool *);
+ if (s == "true") {
+ if (bstore) *bstore = 1;
+ } else if (s == "false") {
+ if (bstore) *bstore = 0;
+ } else
+ FAIL("should be `true' or `false'");
+
+ } else {
+ PermString *sstore = va_arg(valist, PermString *);
+ if (sstore) *sstore = s;
+ }
+ break;
+ }
+
+ case '(': {
+ if (*str++ != '(') FAIL("should be a parenthesized string");
+ unsigned char *last = str;
+ int paren_level = 0;
+ while (*last && paren_level >= 0) {
+ if (*last == '(') paren_level++;
+ if (*last == ')') paren_level--;
+ last++;
+ }
+ if (paren_level >= 0) FAIL("had unbalanced parentheses");
+
+ PermString *sstore = va_arg(valist, PermString *);
+ if (sstore) *sstore = PermString((char *)str, last - str - 1);
+ str = last;
+ break;
+ }
+
+ case 'd':
+ case 'i': {
+ unsigned char *new_str;
+ int v = strtol((char *)str, (char **)&new_str, 10);
+ if (new_str == str) FAIL("should be an integer");
+
+ str = new_str;
+ int *istore = va_arg(valist, int *);
+ if (istore) *istore = v;
+ break;
+ }
+
+ case 'x': {
+ unsigned char *new_str;
+ int v = strtol((char *)str, (char **)&new_str, 16);
+ if (new_str == str) FAIL("should be a hex integer");
+
+ str = new_str;
+ int *istore = va_arg(valist, int *);
+ if (istore) *istore = v;
+ break;
+ }
+
+ case 'e':
+ case 'f':
+ case 'g': {
+ unsigned char *new_str;
+ double v = strtonumber((char *)str, (char **)&new_str);
+ if (v < MIN_KNOWN_DOUBLE) v = MIN_KNOWN_DOUBLE;
+ if (new_str == str) FAIL("should be a real number");
+
+ str = new_str;
+ double *dstore = va_arg(valist, double *);
+ if (dstore) *dstore = v;
+ break;
+ }
+
+ case '<': {
+ unsigned char *endbrack =
+ (unsigned char *)strchr((char *)str, '>');
+ int n = (endbrack ? endbrack - (str + 1) : 0);
+ if (!endbrack || n % 2 != 0)
+ FAIL("should be hex values in <angle brackets>");
+ String s = String::garbage_string(n/2);
+ unsigned char *data = s.mutable_udata();
+
+ str++;
+ while (*str != '>') {
+ if (isxdigit(str[0]) && isxdigit(str[1])) {
+ *data++ = xvalue[str[0]] * 16 + xvalue[str[1]];
+ str += 2;
+ } else
+ FAIL("had non-hex digits in the angle brackets");
+ }
+ str++;
+
+ if (String *datastore = va_arg(valist, String *))
+ *datastore = s;
+ break;
+ }
+
+ default:
+ assert(0 && "internal error: bad %");
+ FAIL("");
+
+ }
+ break;
+ /* - - - - - - - - end percent specifications - - - - - - - */
+
+ case ' ':
+ if (!isspace(*str))
+ FAIL("should be followed by whitespace");
+ /* FALLTHRU */
+
+ case '-':
+ while (isspace(*str)) str++;
+ break;
+
+ case 0:
+ // always eat space at end of format
+ while (isspace(*str)) str++;
+ return str;
+
+ default:
+ matchchar:
+ if (*str++ != *format)
+ FAIL(permprintf("- expected `%c'", *format));
+ break;
+
+ }
+
+ format++;
+ }
+}
+
+
+bool
+AfmParser::isall(const char *format, ...)
+{
+ va_list valist;
+ va_start(valist, format);
+ unsigned char *new_pos = vis(format, valist);
+ va_end(valist);
+ if (new_pos && *new_pos == 0) {
+ _pos = new_pos;
+ return 1;
+ } else
+ return 0;
+}
+
+
+bool
+AfmParser::is(const char *format, ...)
+{
+ va_list valist;
+ va_start(valist, format);
+ unsigned char *new_pos = vis(format, valist);
+ va_end(valist);
+ if (new_pos) {
+ _pos = new_pos;
+ return 1;
+ } else
+ return 0;
+}
+
+
+PermString
+AfmParser::keyword() const
+{
+ const char *f = (const char *)_pos;
+ while (isspace(*f))
+ f++;
+ const char *l = f;
+ while (isalnum(*l) || *l == '_')
+ l++;
+ return PermString(f, l - f);
+}
+
+
+void
+AfmParser::skip_until(unsigned char c)
+{
+ while (*_pos && *_pos != c)
+ _pos++;
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/afmw.cc b/Build/source/utils/lcdf-typetools/libefont/afmw.cc
new file mode 100644
index 00000000000..3664d3e83ce
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/afmw.cc
@@ -0,0 +1,190 @@
+// -*- related-file-name: "../include/efont/afmw.hh" -*-
+
+/* afmw.{cc,hh} -- Adobe Font Metrics writing
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/afmw.hh>
+#include <efont/t1cs.hh> /* for KNOWN() */
+namespace Efont {
+
+AfmWriter::AfmWriter(Metrics *m, FILE *f)
+ : _m(m), _afm_xt((AfmMetricsXt *)m->find_xt("AFM")), _f(f)
+{
+}
+
+void
+AfmWriter::write(Metrics *m, FILE *f)
+{
+ AfmWriter w(m, f);
+ w.write();
+}
+
+
+void
+AfmWriter::write()
+{
+ _m->pair_program()->unreverse();
+ _m->pair_program()->optimize();
+
+ fprintf(_f, "StartFontMetrics 4.1\n");
+ if (_afm_xt)
+ for (int i = 0; i < _afm_xt->opening_comments.size(); i++)
+ fprintf(_f, "Comment %s\n", _afm_xt->opening_comments[i].c_str());
+
+ write_prologue();
+
+ fprintf(_f, "StartCharMetrics %d\n", _m->nglyphs());
+
+ GlyphIndex gi;
+ for (int i = 0; i < 256; i++) //FIXME
+ if ((gi = _m->find_code(i)) >= 0)
+ write_char_metric_data(gi, i);
+ for (gi = 0; gi < _m->nglyphs(); gi++)
+ if (_m->code(gi) == -1)
+ write_char_metric_data(gi, -1);
+
+ fprintf(_f, "EndCharMetrics\n");
+
+ write_kerns();
+
+ fprintf(_f, "EndFontMetrics\n");
+}
+
+
+void
+AfmWriter::write_prologue() const
+{
+ if (_m->font_name())
+ fprintf(_f, "FontName %s\n", _m->font_name().c_str());
+ else
+ fprintf(_f, "FontName No-Font-Name-Given\n");
+
+ if (_m->full_name())
+ fprintf(_f, "FullName %s\n", _m->full_name().c_str());
+ if (_m->family())
+ fprintf(_f, "FamilyName %s\n", _m->family().c_str());
+ if (_m->weight())
+ fprintf(_f, "Weight %s\n", _m->weight().c_str());
+
+ if (KNOWN(fd( fdItalicAngle )))
+ fprintf(_f, "ItalicAngle %.8g\n", fd( fdItalicAngle ));
+
+ fprintf(_f, "FontBBox %.8g %.8g %.8g %.8g\n",
+ fd( fdFontBBllx ), fd( fdFontBBlly ),
+ fd( fdFontBBurx ), fd( fdFontBBury ));
+
+ if (KNOWN(fd( fdUnderlinePosition )))
+ fprintf(_f, "UnderlinePosition %.8g\n", fd( fdUnderlinePosition ));
+ if (KNOWN(fd( fdUnderlineThickness )))
+ fprintf(_f, "UnderlineThickness %.8g\n", fd( fdUnderlineThickness ));
+
+ if (_m->version())
+ fprintf(_f, "Version %s\n", _m->version().c_str());
+ if (_afm_xt && _afm_xt->notice)
+ fprintf(_f, "Notice %s\n", _afm_xt->notice.c_str());
+
+ if (_afm_xt && _afm_xt->encoding_scheme)
+ fprintf(_f, "EncodingScheme %s\n", _afm_xt->encoding_scheme.c_str());
+
+ if (KNOWN(fd( fdCapHeight )))
+ fprintf(_f, "CapHeight %.8g\n", fd( fdCapHeight ));
+ if (KNOWN(fd( fdXHeight )))
+ fprintf(_f, "XHeight %.8g\n", fd( fdXHeight ));
+ if (KNOWN(fd( fdAscender )))
+ fprintf(_f, "Ascender %.8g\n", fd( fdAscender ));
+ if (KNOWN(fd( fdDescender )))
+ fprintf(_f, "Descender %.8g\n", fd( fdDescender ));
+ if (KNOWN(fd( fdStdHW )))
+ fprintf(_f, "StdHW %.8g\n", fd( fdStdHW ));
+ if (KNOWN(fd( fdStdVW )))
+ fprintf(_f, "StdVW %.8g\n", fd( fdStdVW ));
+}
+
+
+void
+AfmWriter::write_char_metric_data(GlyphIndex gi, int e) const
+{
+ if (e >= -1 && e < 256)
+ fprintf(_f, "C %d ;", e);
+ else
+ fprintf(_f, "CH <%04X> ;", e);
+
+ double w = _m->wd(gi);
+ if (KNOWN(w))
+ fprintf(_f, " WX %.8g ;", w);
+ else
+ w = 0;
+
+ fprintf(_f, " N %s ;", _m->name(gi).c_str());
+
+ if (KNOWN(_m->lf(gi)))
+ fprintf(_f, " B %.8g %.8g %.8g %.8g ;",
+ _m->lf(gi), _m->bt(gi), _m->rt(gi), _m->tp(gi));
+
+ // Run through the ligature/kern program to find ligatures.
+ PairProgram &pairp = *_m->pair_program();
+ PairOpIndex opi = pairp.find_left(gi);
+ while (opi >= 0) {
+ const PairOp &op = pairp.op(opi);
+ if (op.is_lig()) {
+ if (op.lig_kind() == opLigSimple)
+ fprintf(_f, " L %s %s ;",
+ _m->name( op.right() ).c_str(),
+ _m->name( op.result() ).c_str());
+ //else
+ //warning("strange ligature combination not supported by AFM");
+ }
+ opi = op.next_left();
+ }
+
+ fputc('\n', _f);
+}
+
+
+void
+AfmWriter::write_kerns() const
+{
+ PairProgram &pairp = *_m->pair_program();
+
+ // Damn. First we have to count how many kerning pairs there are.
+ int numkerns = 0;
+ for (PairOpIndex opi = 0; opi < pairp.op_count(); opi++) {
+ const PairOp &op = pairp.op(opi);
+ if (op.is_kern() && _m->kv( op.value() ))
+ numkerns++;
+ }
+
+ if (numkerns == 0) return;
+
+ fprintf(_f, "StartKernData\n");
+ fprintf(_f, "StartKernPairs %d\n", numkerns);
+ for (GlyphIndex gi = 0; gi < _m->nglyphs(); gi++) {
+ PairOpIndex opi = pairp.find_left(gi);
+ while (opi >= 0) {
+ const PairOp &op = pairp.op(opi);
+ if (op.is_kern() && _m->kv( op.value() ))
+ fprintf(_f, "KPX %s %s %.8g\n",
+ _m->name( gi ).c_str(),
+ _m->name( op.right() ).c_str(),
+ _m->kv( op.value() ));
+ opi = op.next_left();
+ }
+ }
+ fprintf(_f, "EndKernPairs\n");
+ fprintf(_f, "EndKernData\n");
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/amfm.cc b/Build/source/utils/lcdf-typetools/libefont/amfm.cc
new file mode 100644
index 00000000000..e7d3a32a5b2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/amfm.cc
@@ -0,0 +1,850 @@
+// -*- related-file-name: "../include/efont/amfm.hh" -*-
+
+/* amfm.{cc,hh} -- Adobe Multiple-Master Font Metrics
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/amfm.hh>
+#include <efont/afm.hh>
+#include <efont/afmparse.hh>
+#include <lcdf/error.hh>
+#include <efont/findmet.hh>
+#include <efont/t1cs.hh>
+#include <lcdf/straccum.hh>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <assert.h>
+#include <string.h>
+namespace Efont {
+
+AmfmMetrics::AmfmMetrics(MetricsFinder *finder)
+ : _finder(finder),
+ _fdv(fdLast, UNKDOUBLE),
+ _nmasters(-1), _naxes(-1), _masters(0), _mmspace(0),
+ _primary_fonts(0), _sanity_afm(0), _uses(0)
+{
+}
+
+AmfmMetrics::~AmfmMetrics()
+{
+ assert(_uses == 0);
+ for (int m = 0; m < _nmasters; m++)
+ if (_masters[m].afm)
+ _masters[m].afm->unuse();
+ delete[] _masters;
+ delete _mmspace;
+ while (_primary_fonts) {
+ AmfmPrimaryFont *pf = _primary_fonts;
+ _primary_fonts = _primary_fonts->next;
+ delete pf;
+ }
+}
+
+
+bool
+AmfmMetrics::sanity(ErrorHandler *errh) const
+{
+ if (!_mmspace) {
+ errh->error("AMFM sanity: no multiple master interpolation information");
+ return false;
+ }
+
+ bool ok = true;
+ for (int m = 0; m < _nmasters; m++)
+ if (!_masters[m].font_name
+ || _masters[m].weight_vector.size() != _nmasters) {
+ errh->error("AMFM sanity: no information for master %d", m);
+ ok = false;
+ }
+
+ if (!_mmspace->check(errh))
+ ok = false;
+
+ return ok;
+}
+
+
+int
+AmfmMetrics::primary_label_value(int ax, PermString label) const
+{
+ assert(ax >= 0 && ax < _naxes);
+ for (AmfmPrimaryFont *pf = _primary_fonts; pf; pf = pf->next) {
+ if (pf->labels[ax] == label)
+ return pf->design_vector[ax];
+ }
+ return -1;
+}
+
+
+inline static bool
+strcompat(PermString a, PermString b)
+{
+ return !a || !b || a == b;
+}
+
+Metrics *
+AmfmMetrics::master(int m, ErrorHandler *errh)
+{
+ AmfmMaster &master = _masters[m];
+
+ if (!master.loaded) {
+ master.loaded = true;
+ DirectoryMetricsFinder directory_finder(_directory);
+ _finder->add_finder(&directory_finder);
+ Metrics *afm = _finder->find_metrics(master.font_name);
+
+ if (!afm) {
+ if (errh)
+ errh->error("%s: can't find AFM file for master `%s'",
+ _font_name.c_str(), master.font_name.c_str());
+
+ } else if (!strcompat(afm->font_name(), master.font_name)
+ || !strcompat(afm->family(), master.family)
+ || !strcompat(afm->full_name(), master.full_name)
+ || !strcompat(afm->version(), master.version)) {
+ if (errh)
+ errh->error("%s: AFM for master `%s' doesn't match AMFM",
+ _font_name.c_str(), master.font_name.c_str());
+
+ } else if (!_sanity_afm) {
+ master.afm = afm;
+ _sanity_afm = afm;
+ afm->use();
+
+ } else {
+ PairProgram *sanity_pairp = _sanity_afm->pair_program();
+ PairProgram *pairp = afm->pair_program();
+ char buf[1024];
+ buf[0] = 0;
+
+ if (afm->nglyphs() != _sanity_afm->nglyphs())
+ sprintf(buf, "glyph count (%d vs. %d)", afm->nglyphs(), _sanity_afm->nglyphs());
+ if (afm->nfd() != _sanity_afm->nfd())
+ sprintf(buf, "fd count (%d vs. %d)", afm->nfd(), _sanity_afm->nfd());
+ if (afm->nkv() != _sanity_afm->nkv())
+ sprintf(buf, "kv count (%d vs. %d)", afm->nkv(), _sanity_afm->nkv());
+ if (pairp->op_count() != sanity_pairp->op_count())
+ sprintf(buf, "pair op count (%d vs. %d)", pairp->op_count(), sanity_pairp->op_count());
+
+ if (!buf[0]) {
+ master.afm = afm;
+ afm->use();
+ } else if (errh)
+ errh->error("%s: AFM for master `%s' failed sanity checks (%s)", _font_name.c_str(), master.font_name.c_str(), buf);
+ }
+ }
+
+ return master.afm;
+}
+
+
+AmfmPrimaryFont *
+AmfmMetrics::find_primary_font(const Vector<double> &design_vector) const
+{
+ assert(design_vector.size() == _naxes);
+ for (AmfmPrimaryFont *pf = _primary_fonts; pf; pf = pf->next) {
+
+ for (int a = 0; a < _naxes; a++)
+ if ((int)design_vector[a] != pf->design_vector[a])
+ goto loser;
+ return pf;
+
+ loser: ;
+ }
+ return 0;
+}
+
+
+Metrics *
+AmfmMetrics::interpolate(const Vector<double> &design_vector,
+ const Vector<double> &weight_vector,
+ ErrorHandler *errh)
+{
+ assert(design_vector.size() == _naxes);
+ assert(weight_vector.size() == _nmasters);
+
+ // FIXME: check masters for correspondence.
+
+ /* 0.
+ * Make sure all necessary AFMs have been loaded. */
+ int m;
+ for (m = 0; m < _nmasters; m++)
+ if (weight_vector[m])
+ if (!master(m, errh))
+ return 0;
+
+ /* 1.
+ * Use the design vector to generate new FontName and FullName. */
+
+ AmfmPrimaryFont *pf = find_primary_font(design_vector);
+ // The primary font is useless to us if it doesn't have axis labels.
+ if (pf && !pf->labels.size())
+ pf = 0;
+
+ StringAccum font_name_sa, full_name_sa;
+ font_name_sa << _font_name;
+ full_name_sa << _full_name;
+ for (int a = 0; a < _naxes; a++) {
+ double dv = design_vector[a];
+ font_name_sa << '_' << dv;
+ full_name_sa << (a == 0 ? '_' : ' ') << dv;
+
+ PermString label;
+ if (pf)
+ label = pf->labels[a];
+ if (!label)
+ label = _mmspace->axis_abbreviation(a);
+ if (label)
+ full_name_sa << ' ' << label;
+ }
+ // Multiple master fonts require an underscore AFTER the font name too
+ font_name_sa << '_';
+
+ /* 2.
+ * Set up the new AFM with the special constructor. */
+
+ // Find the first master with a non-zero component.
+ for (m = 0; m < _nmasters && weight_vector[m] == 0; m++)
+ ;
+ Metrics *afm = new Metrics(font_name_sa.c_str(), full_name_sa.c_str(), *_masters[m].afm);
+ if (MetricsXt *xt = _masters[m].afm->find_xt("AFM")) {
+ AfmMetricsXt *new_xt = new AfmMetricsXt((AfmMetricsXt &)*xt);
+ afm->add_xt(new_xt);
+ }
+
+ /* 2.
+ * Interpolate the old AFM data into the new. */
+
+ afm->interpolate_dimens(*_masters[m].afm, weight_vector[m], false);
+
+ for (m++; m < _nmasters; m++)
+ if (weight_vector[m])
+ afm->interpolate_dimens(*_masters[m].afm, weight_vector[m], true);
+
+ return afm;
+}
+
+
+/*****
+ * AmfmReader
+ **/
+
+AmfmReader::AmfmReader(AfmParser &afmp, AmfmMetrics *amfm, ErrorHandler *errh)
+ : _amfm(amfm), _finder(amfm->_finder), _l(afmp),
+ _mmspace(amfm->_mmspace)
+{
+ _errh = errh ? errh : ErrorHandler::silent_handler();
+}
+
+AmfmMetrics *
+AmfmReader::read(Slurper &slurper, MetricsFinder *finder, ErrorHandler *errh)
+{
+ AfmParser parser(slurper);
+ if (!parser.ok()) return 0;
+ AmfmMetrics *amfm = new AmfmMetrics(finder);
+ AmfmReader reader(parser, amfm, errh);
+ if (!reader.read()) {
+ delete amfm;
+ return 0;
+ } else
+ return amfm;
+}
+
+AmfmMetrics *
+AmfmReader::read(const Filename &fn, MetricsFinder *finder, ErrorHandler *errh)
+{
+ Slurper slurper(fn);
+ return read(slurper, finder, errh);
+}
+
+void
+AmfmReader::add_amcp_file(Slurper &slurper, AmfmMetrics *amfm, ErrorHandler *errh)
+{
+ AfmParser parser(slurper);
+ if (!parser.ok()) return;
+ AmfmReader reader(parser, amfm, errh);
+ reader.read_amcp_file();
+}
+
+
+void
+AmfmReader::lwarning(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->verror(ErrorHandler::ERR_WARNING, _l.landmark(), format, val);
+ va_end(val);
+}
+
+void
+AmfmReader::lerror(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->verror(ErrorHandler::ERR_ERROR, _l.landmark(), format, val);
+ va_end(val);
+}
+
+void
+AmfmReader::no_match_warning(const char *context) const
+{
+ // keyword() will fail (and a warning won't get printed) only if the string
+ // is all whitespace, which the spec allows
+ PermString keyword = _l.keyword();
+ if (!keyword) return;
+ if (_l.key_matched()) {
+ lwarning(context ? "bad `%s' command in %s:"
+ : "bad `%s' command:", keyword.c_str(), context);
+ lwarning("field %d %s", _l.fail_field(), _l.message().c_str());
+ } else
+ lwarning(context ? "unknown command `%s' in %s"
+ : "unknown command `%s'", keyword.c_str(), context);
+ _l.clear_message();
+}
+
+
+void
+AmfmReader::check_mmspace()
+{
+ if (!_mmspace && _amfm->_naxes >= 0 && _amfm->_nmasters >= 0
+ && _amfm->_font_name) {
+ _mmspace = _amfm->_mmspace =
+ new MultipleMasterSpace(_amfm->_font_name, _amfm->_naxes, _amfm->_nmasters);
+ }
+}
+
+
+bool
+AmfmReader::read()
+{
+ assert(_amfm != 0);
+ _mmspace = _amfm->_mmspace;
+
+ AfmParser &l = _l;
+ _amfm->_directory = l.filename().directory();
+
+ // First, read all opening comments into an array so we can print them out
+ // later.
+ PermString comment;
+ while (l.next_line()) {
+ if (l.isall("Comment %+s", &comment))
+ _amfm->_opening_comments.push_back(comment);
+ else if (l.isall("StartMasterFontMetrics %g", (double *)0))
+ ;
+ else {
+ l.save_line();
+ break;
+ }
+ }
+
+ int master = 0, axis = 0;
+
+ while (l.next_line())
+ switch (l[0]) {
+
+ case 'A':
+ if (l.isall("Ascender %g", &fd( fdAscender )))
+ break;
+ if (l.isall("Axes %d", &_amfm->_naxes)) {
+ check_mmspace();
+ break;
+ }
+ goto invalid;
+
+ case 'B':
+ if (l.is("BlendDesignPositions")) {
+ read_positions();
+ break;
+ }
+ if (l.is("BlendDesignMap")) {
+ read_normalize();
+ break;
+ }
+ if (l.is("BlendAxisTypes")) {
+ read_axis_types();
+ break;
+ }
+ goto invalid;
+
+ case 'C':
+ if (l.isall("CapHeight %g", &fd( fdCapHeight )))
+ break;
+ if (l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'D':
+ if (l.isall("Descender %g", &fd( fdDescender )))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EncodingScheme %+s", &_amfm->_encoding_scheme))
+ break;
+ if (l.isall("EndMasterFontMetrics"))
+ goto done;
+ goto invalid;
+
+ case 'F':
+ if (l.isall("FontName %+s", &_amfm->_font_name)) {
+ check_mmspace();
+ break;
+ }
+ if (l.isall("FullName %+s", &_amfm->_full_name))
+ break;
+ if (l.isall("FamilyName %+s", &_amfm->_family))
+ break;
+ if (l.isall("FontBBox %g %g %g %g",
+ &fd( fdFontBBllx ), &fd( fdFontBBlly ),
+ &fd( fdFontBBurx ), &fd( fdFontBBury )))
+ break;
+ goto invalid;
+
+ case 'I':
+ if (l.isall("IsFixedPitch %b", (bool *)0))
+ break;
+ if (l.isall("ItalicAngle %g", &fd( fdItalicAngle )))
+ break;
+ goto invalid;
+
+ case 'M':
+ if (l.isall("Masters %d", &_amfm->_nmasters)) {
+ check_mmspace();
+ break;
+ }
+ goto invalid;
+
+ case 'N':
+ if (l.isall("Notice %+s", &_amfm->_notice))
+ break;
+ goto invalid;
+
+ case 'S':
+ if (l.isall("StartAxis")) {
+ read_axis(axis++);
+ break;
+ }
+ if (l.isall("StartMaster")) {
+ read_master(master++);
+ break;
+ }
+ if (l.isall("StartPrimaryFonts %d", (int *)0)) {
+ read_primary_fonts();
+ break;
+ }
+ if (l.isall("StartConversionPrograms %d %d", (int *)0, (int *)0)) {
+ read_conversion_programs();
+ break;
+ }
+ if (l.isall("StartMasterFontMetrics %g", (double *)0))
+ break;
+ goto invalid;
+
+ case 'U':
+ if (l.isall("UnderlinePosition %g", &fd( fdUnderlinePosition )))
+ break;
+ else if (l.isall("UnderlineThickness %g", &fd( fdUnderlineThickness )))
+ break;
+ goto invalid;
+
+ case 'V':
+ if (l.isall("Version %+s", &_amfm->_version))
+ break;
+ goto invalid;
+
+ case 'W':
+ if (l.isall("Weight %+s", &_amfm->_weight))
+ break;
+ if (l.is("WeightVector")) {
+ Vector<double> wv;
+ if (!read_simple_array(wv) || !_mmspace)
+ lerror("bad WeightVector");
+ else
+ _mmspace->set_weight_vector(wv);
+ break;
+ }
+ goto invalid;
+
+ case 'X':
+ if (l.isall("XHeight %g", &fd( fdXHeight )))
+ break;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ done:
+ if (!_mmspace) {
+ _errh->error("`%s' is not an AMFM file", String(_l.landmark().file()).c_str());
+ return false;
+ }
+
+ LandmarkErrorHandler pin_errh(_errh, _l.landmark());
+ if (!_amfm->sanity(&pin_errh)) {
+ _errh->lerror(_l.landmark().whole_file(),
+ "bad AMFM file (missing or inconsistent information)");
+ return false;
+ }
+
+ if (!_mmspace->check_intermediate() && _l.filename().directory()) {
+ String name = l.filename().base() + ".amcp";
+ Slurper slurp(_l.filename().from_directory(name));
+ add_amcp_file(slurp, _amfm, _errh);
+ }
+
+ return true;
+}
+
+
+void
+AmfmReader::read_amcp_file()
+{
+ int lines_read = 0;
+
+ while (_l.next_line()) {
+ lines_read++;
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'S':
+ if (_l.isall("StartConversionPrograms %d %d", (int *)0, (int *)0)) {
+ read_conversion_programs();
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning("AMCP file");
+
+ }
+ }
+
+ if (_mmspace && !_mmspace->ndv() && !_mmspace->cdv() && lines_read)
+ lwarning("no conversion programs in .amcp file");
+}
+
+
+bool
+AmfmReader::read_simple_array(Vector<double> &vec) const
+{
+ if (!_l.is("[")) return false;
+
+ vec.clear();
+ double d;
+ while (_l.is("%g", &d))
+ vec.push_back(d);
+
+ return _l.is("]");
+}
+
+
+void
+AmfmReader::read_positions() const
+{
+ if (nmasters() < 2 || naxes() < 1) return;
+ Vector<NumVector> positions;
+ if (!_l.is("[") || !_mmspace) goto error;
+
+ for (int i = 0; i < nmasters(); i++) {
+ positions.push_back(NumVector());
+ if (!read_simple_array(positions.back()))
+ goto error;
+ }
+
+ if (!_l.is("]")) goto error;
+ _mmspace->set_master_positions(positions);
+ return;
+
+ error:
+ lerror("bad BlendDesignPositions");
+}
+
+
+void
+AmfmReader::read_normalize() const
+{
+ if (naxes() < 1) return;
+ Vector<NumVector> normalize_in, normalize_out;
+ if (!_l.is("[") || !_mmspace) goto error;
+
+ for (int a = 0; a < naxes(); a++) {
+ if (!_l.is("[")) goto error;
+ normalize_in.push_back(NumVector());
+ normalize_out.push_back(NumVector());
+ double v1, v2;
+ while (_l.is("[-%g %g-]", &v1, &v2)) {
+ normalize_in[a].push_back(v1);
+ normalize_out[a].push_back(v2);
+ }
+ if (!_l.is("]")) goto error;
+ }
+
+ if (!_l.is("]")) goto error;
+ _mmspace->set_normalize(normalize_in, normalize_out);
+ return;
+
+ error:
+ lerror("bad BlendDesignPositions");
+}
+
+
+void
+AmfmReader::read_axis_types() const
+{
+ PermString s;
+ int ax = 0;
+ Vector<PermString> types;
+ if (naxes() < 1) return;
+ if (!_l.is("[") || !_mmspace) goto error;
+ _mmspace->check();
+
+ while (_l.is("/%/s", &s))
+ _mmspace->set_axis_type(ax++, s);
+
+ if (!_l.is("]")) goto error;
+ return;
+
+ error:
+ lerror("bad BlendAxisTypes");
+}
+
+
+void
+AmfmReader::read_axis(int ax) const
+{
+ bool ok = _mmspace && ax < naxes();
+ if (!ok)
+ lerror("bad axis number %d", ax);
+ else
+ _mmspace->check();
+
+ PermString s;
+ while (_l.next_line())
+ switch (_l[0]) {
+
+ case 'A':
+ if (_l.is("AxisType %+s", &s)) {
+ if (ok)
+ _mmspace->set_axis_type(ax, s);
+ break;
+ }
+ if (_l.is("AxisLabel %+s", &s)) {
+ if (ok)
+ _mmspace->set_axis_label(ax, s);
+ break;
+ }
+ goto invalid;
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndAxis"))
+ goto endaxis;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ endaxis: ;
+}
+
+
+void
+AmfmReader::read_master(int m) const
+{
+ AmfmMaster *amfmm;
+ AmfmMaster dummy;
+ if (m >= nmasters()) {
+ lerror("too many masters");
+ amfmm = &dummy;
+ } else {
+ if (!_amfm->_masters)
+ _amfm->_masters = new AmfmMaster[ nmasters() ];
+ amfmm = &_amfm->_masters[m];
+ }
+
+ while (_l.next_line())
+ // Grok the whole line. Are we on a character metric data line?
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndMaster"))
+ goto endmaster;
+ goto invalid;
+
+ case 'F':
+ if (_l.isall("FontName %+s", &amfmm->font_name))
+ break;
+ if (_l.isall("FullName %+s", &amfmm->full_name))
+ break;
+ if (_l.isall("FamilyName %+s", &amfmm->family))
+ break;
+ goto invalid;
+
+ case 'V':
+ if (_l.isall("Version %+s", &amfmm->version))
+ break;
+ goto invalid;
+
+ case 'W':
+ if (_l.is("WeightVector")) {
+ if (!(read_simple_array(amfmm->weight_vector) &&
+ amfmm->weight_vector.size() == nmasters())) {
+ lerror("bad WeightVector");
+ amfmm->weight_vector.clear();
+ }
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ endmaster: ;
+}
+
+
+void
+AmfmReader::read_one_primary_font() const
+{
+ AmfmPrimaryFont *pf = new AmfmPrimaryFont;
+ pf->design_vector.resize(naxes());
+ pf->labels.resize(naxes());
+
+ while (_l.left()) {
+
+ if (_l.is("PC")) {
+ for (int a = 0; a < naxes(); a++)
+ if (!_l.is("%d", &pf->design_vector[a]))
+ goto error;
+ } else if (_l.is("PL")) {
+ for (int a = 0; a < naxes(); a++)
+ if (!_l.is("(-%/s-)", &pf->labels[a]))
+ goto error;
+ } else if (_l.is("PN %(", &pf->name))
+ ;
+ else
+ no_match_warning("primary font");
+
+ _l.is(";"); // get rid of any possible semicolon
+ }
+
+ pf->next = _amfm->_primary_fonts;
+ _amfm->_primary_fonts = pf;
+ return;
+
+ error:
+ delete pf;
+}
+
+
+void
+AmfmReader::read_primary_fonts() const
+{
+ while (_l.next_line())
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndPrimaryFonts"))
+ goto end_primary_fonts;
+ goto invalid;
+
+ case 'P':
+ if (_l[1] == 'C' && isspace(_l[2])) {
+ read_one_primary_font();
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ end_primary_fonts: ;
+}
+
+
+void
+AmfmReader::read_conversion_programs() const
+{
+ String ndv, cdv, s;
+
+ while (_l.next_line())
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.isall("CDV %<", &s)) {
+ cdv += s;
+ break;
+ }
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndConversionPrograms"))
+ goto end_conversion_programs;
+ goto invalid;
+
+ case 'N':
+ if (_l.isall("NDV %<", &s)) {
+ ndv += s;
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+ break;
+
+ }
+
+ end_conversion_programs:
+ if (_mmspace) {
+ _mmspace->set_ndv(Type1Charstring(ndv));
+ _mmspace->set_cdv(Type1Charstring(cdv));
+ }
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/cff.cc b/Build/source/utils/lcdf-typetools/libefont/cff.cc
new file mode 100644
index 00000000000..3a42a84e2c7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/cff.cc
@@ -0,0 +1,1684 @@
+// -*- related-file-name: "../include/efont/cff.hh" -*-
+
+/* cff.{cc,hh} -- Compact Font Format fonts
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/cff.hh>
+#include <lcdf/error.hh>
+#include <efont/t1item.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+#include <efont/t1unparser.hh>
+
+#ifndef static_assert
+#define static_assert(c) switch (c) case 0: case (c):
+#endif
+
+namespace Efont {
+
+const char * const Cff::operator_names[] = {
+ "version", "Notice", "FullName", "FamilyName",
+ "Weight", "FontBBox", "BlueValues", "OtherBlues",
+ "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW",
+ "UNKNOWN_12", "UniqueID", "XUID", "charset",
+ "Encoding", "CharStrings", "Private", "Subrs",
+ "defaultWidthX", "nominalWidthX", "UNKNOWN_22", "UNKNOWN_23",
+ "UNKNOWN_24", "UNKNOWN_25", "UNKNOWN_26", "UNKNOWN_27",
+ "UNKNOWN_28", "UNKNOWN_29", "UNKNOWN_30", "UNKNOWN_31",
+ "Copyright", "isFixedPitch", "ItalicAngle", "UnderlinePosition",
+ "UnderlineThickness", "PaintType", "CharstringType", "FontMatrix",
+ "StrokeWidth", "BlueScale", "BlueShift", "BlueFuzz",
+ "StemSnapH", "StemSnapV", "ForceBold", "UNKNOWN_12_15",
+ "UNKNOWN_12_16", "LanguageGroup", "ExpansionFactor", "initialRandomSeed",
+ "SyntheticBase", "PostScript", "BaseFontName", "BaseFontBlend",
+ "UNKNOWN_12_24", "UNKNOWN_12_25", "UNKNOWN_12_26", "UNKNOWN_12_27",
+ "UNKNOWN_12_28", "UNKNOWN_12_29", "ROS", "CIDFontVersion",
+ "CIDFontRevision", "CIDFontType", "CIDCount", "UIDBase",
+ "FDArray", "FDSelect", "FontName"
+};
+
+const int Cff::operator_types[] = {
+ tSID, tSID, tSID, tSID, // version, Notice, FullName, FamilyName
+ tSID, tArray4, tP+tArray, tP+tArray, // Weight, FontBBox, BlueValues, OtherBlues
+ tP+tArray, tP+tArray, tP+tNumber, tP+tNumber, // FamBlues, FamOthBlues, StdHW, StdVW
+ tNone, tNumber, tArray, tOffset, // escape, UniqueID, XUID, charset
+ tOffset, tOffset, tPrivateType, tP+tLocalOffset, // Encoding, CharStrings, Private, Subrs
+ tP+tNumber, tP+tNumber, tNone, tNone, // defaultWX, nominalWX, 22, 23
+ tNone, tNone, tNone, tNone, // 24, 25, 26, 27
+ tNone, tNone, tNone, tNone, // 28, 29, 30, 31
+ tSID, tBoolean, tNumber, tNumber, // Copyright, isFixedPitch, ItalicAngle, UnderlinePosition
+ tNumber, tNumber, tNumber, tArray6, // UnderlineThickness, PaintType, CharstringType, FontMatrix
+ tNumber, tP+tNumber, tP+tNumber, tP+tNumber, // StrokeWidth, BlueScale, BlueShift, BlueFuzz
+ tP+tArray, tP+tArray, tP+tBoolean, tNone, // StemSnapH, StemSnapV, ForceBold, 12 15
+ tNone, tP+tNumber, tP+tNumber, tP+tNumber, // 12 16, LanguageGroup, ExpansionFactor, initialRandomSeed
+ tNumber, tSID, tSID, tArray, // SyntheticBase, PostScript, BaseFontName, BaseFontBlend
+ tNone, tNone, tNone, tNone, // 12 24, 12 25, 12 26, 12 27
+ tNone, tNone, tArray, tNumber, // 12 28, 12 29, ROS, CIDFontVersion
+ tNumber, tNumber, tNumber, tNumber, // CIDFontRevision, CIDFontType, CIDCount, UIDBase
+ tOffset, tOffset, tSID // FDArray, FDSelect, FontName
+};
+
+static PermString::Initializer initializer;
+static const char * const standard_strings[] = {
+ // Automatically generated from Appendix A of the CFF specification; do
+ // not edit. Size should be 391.
+ ".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar",
+ "percent", "ampersand", "quoteright", "parenleft", "parenright",
+ "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one",
+ "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon",
+ "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C",
+ "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
+ "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash",
+ "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
+ "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright",
+ "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen",
+ "florin", "section", "currency", "quotesingle", "quotedblleft",
+ "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash",
+ "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla",
+ "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash",
+ "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe",
+ "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth",
+ "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar",
+ "degree", "thorn", "threequarters", "twosuperior", "registered", "minus",
+ "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex",
+ "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute",
+ "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis",
+ "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve",
+ "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave",
+ "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis",
+ "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex",
+ "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave",
+ "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde",
+ "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute",
+ "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall",
+ "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
+ "parenleftsuperior", "parenrightsuperior", "twodotenleader",
+ "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle",
+ "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle",
+ "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior",
+ "threequartersemdash", "periodsuperior", "questionsmall", "asuperior",
+ "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior",
+ "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior",
+ "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior",
+ "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall",
+ "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall",
+ "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall",
+ "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall",
+ "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary",
+ "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle",
+ "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall",
+ "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash",
+ "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall",
+ "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths",
+ "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior",
+ "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior",
+ "ninesuperior", "zeroinferior", "oneinferior", "twoinferior",
+ "threeinferior", "fourinferior", "fiveinferior", "sixinferior",
+ "seveninferior", "eightinferior", "nineinferior", "centinferior",
+ "dollarinferior", "periodinferior", "commainferior", "Agravesmall",
+ "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall",
+ "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall",
+ "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall",
+ "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall",
+ "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall",
+ "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall",
+ "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall",
+ "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black",
+ "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"
+};
+static PermString standard_permstrings[Cff::NSTANDARD_STRINGS];
+static HashMap<PermString, int> standard_permstrings_map(-1);
+
+static const int standard_encoding[] = {
+ // Automatically generated from Appendix B of the CFF specification; do
+ // not edit. Size should be 256.
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 0, 111, 112, 113,
+ 114, 0, 115, 116, 117, 118, 119, 120, 121, 122,
+ 0, 123, 0, 124, 125, 126, 127, 128, 129, 130,
+ 131, 0, 132, 133, 0, 134, 135, 136, 137, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 138, 0, 139, 0, 0,
+ 0, 0, 140, 141, 142, 143, 0, 0, 0, 0,
+ 0, 144, 0, 0, 0, 145, 0, 0, 146, 147,
+ 148, 149, 0, 0, 0, 0
+};
+
+static const int expert_encoding[] = {
+ // Automatically generated from Appendix B of the CFF specification; do
+ // not edit. Size should be 256.
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 229, 230, 0, 231, 232, 233, 234,
+ 235, 236, 237, 238, 13, 14, 15, 99, 239, 240,
+ 241, 242, 243, 244, 245, 246, 247, 248, 27, 28,
+ 249, 250, 251, 252, 0, 253, 254, 255, 256, 257,
+ 0, 0, 0, 258, 0, 0, 259, 260, 261, 262,
+ 0, 0, 263, 264, 265, 0, 266, 109, 110, 267,
+ 268, 269, 0, 270, 271, 272, 273, 274, 275, 276,
+ 277, 278, 279, 280, 281, 282, 283, 284, 285, 286,
+ 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 301, 302, 303, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 304, 305, 306, 0, 0, 307, 308, 309, 310,
+ 311, 0, 312, 0, 0, 313, 0, 0, 314, 315,
+ 0, 0, 316, 317, 318, 0, 0, 0, 158, 155,
+ 163, 319, 320, 321, 322, 323, 324, 325, 0, 0,
+ 326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+ 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+};
+
+static const int iso_adobe_charset[] = {
+ // Automatically generated from Appendix C of the CFF specification; do
+ // not edit.
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+ 220, 221, 222, 223, 224, 225, 226, 227, 228
+};
+
+static const int expert_charset[] = {
+ // Automatically generated from Appendix C of the CFF specification; do
+ // not edit.
+ 0, 1, 229, 230, 231, 232, 233, 234, 235, 236,
+ 237, 238, 13, 14, 15, 99, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 27, 28, 249, 250,
+ 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
+ 261, 262, 263, 264, 265, 266, 109, 110, 267, 268,
+ 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
+ 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+ 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
+ 158, 155, 163, 319, 320, 321, 322, 323, 324, 325,
+ 326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+ 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+};
+
+static const int expert_subset_charset[] = {
+ // Automatically generated from Appendix C of the CFF specification; do
+ // not edit.
+ 0, 1, 231, 232, 235, 236, 237, 238, 13, 14,
+ 15, 99, 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 27, 28, 249, 250, 251, 253, 254, 255,
+ 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
+ 266, 109, 110, 267, 268, 269, 270, 272, 300, 301,
+ 302, 305, 314, 315, 158, 155, 163, 320, 321, 322,
+ 323, 324, 325, 326, 150, 164, 169, 327, 328, 329,
+ 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346
+};
+
+static const uint8_t default_dict_cff_data[] = {
+ // CFF header
+ 1, 0, // format major and minor version
+ 4, // header size
+ 4, // absolute offset size
+
+ // Name INDEX
+ 0, 1, // one element in index
+ 1, // offset size
+ 1, 14, // offset array
+ '%', 'D', 'E', 'F', 'A', 'U', 'L', 'T', 'D', 'I', 'C', 'T', '%',
+
+ // Top DICT INDEX
+ 0, 1, // one element in index
+ 1, // offset size
+ 1, 92, // offset array
+ // and the DICT
+ 139, 12, 1, // isFixedPitch false
+ 139, 12, 2, // ItalicAngle 0
+ 39, 12, 3, // UnderlinePosition -100
+ 189, 12, 4, // UnderlineThickness 50
+ 139, 12, 5, // PaintType 0
+ 141, 12, 6, // CharstringType 2
+ 30, 0x0A, 0x00, 0x1F, 139, 139, 30, 0x0A, 0x00, 0x1F, 139, 139, 12, 7,
+ // FontMatrix 0.001 0 0 0.001 0 0
+ 139, 139, 139, 139, 5, // FontBBox 0 0 0 0
+ 139, 12, 8, // StrokeWidth 0
+ 139, 15, // charset 0
+ 139, 16, // Encoding 0
+ 139, 12, 31, // CIDFontVersion 0
+ 139, 12, 32, // CIDFontRevision 0
+ 139, 12, 33, // CIDFontType 0
+ 28, 34, 16, 12, 34, // CIDCount 8720
+ 30, 0x0A, 0x03, 0x96, 0x25, 0xFF, 12, 9, // BlueScale 0.039625
+ 146, 12, 10, // BlueShift 7
+ 140, 12, 11, // BlueFuzz 1
+ 139, 12, 14, // ForceBold false
+ 139, 12, 17, // LanguageGroup 0
+ 30, 0x0A, 0x06, 0xFF, 12, 18, // ExpansionFactor 0.06
+ 139, 12, 19, // initialRandomSeed 0
+ 139, 20, // defaultWidthX 0
+ 139, 21, // nominalWidthX 0
+
+ // String INDEX
+ 0, 0,
+
+ // Gsubr INDEX
+ 0, 0
+};
+
+static const Cff::Dict &
+default_dict()
+{
+ static Cff *cff;
+ if (!cff)
+ cff = new Cff(String::stable_string((const char *) default_dict_cff_data, sizeof(default_dict_cff_data)), ErrorHandler::default_handler());
+ return ((Cff::Font *) cff->font())->top_dict();
+}
+
+
+#define POS_GT(pos1, pos2) ((unsigned)(pos1) > (unsigned)(pos2))
+
+
+Cff::Cff(const String &s, ErrorHandler *errh)
+ : _data_string(s), _data(reinterpret_cast<const uint8_t *>(_data_string.data())), _len(_data_string.length()),
+ _strings_map(-2)
+{
+ static_assert((sizeof(standard_strings) / sizeof(standard_strings[0])) == NSTANDARD_STRINGS);
+ static_assert((sizeof(standard_encoding) / sizeof(standard_encoding[0])) == 256);
+ static_assert((sizeof(expert_encoding) / sizeof(expert_encoding[0])) == 256);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+Cff::~Cff()
+{
+ for (int i = 0; i < _gsubrs_cs.size(); i++)
+ delete _gsubrs_cs[i];
+}
+
+/*
+ * Parsing the file header
+ */
+
+int
+Cff::parse_header(ErrorHandler *errh)
+{
+ if (_gsubrs_index.error() >= 0) // already done
+ return 0;
+
+ // parse header
+ if (_len < HEADER_SIZE)
+ return errh->error("CFF file too small for header"), -EFAULT;
+ if (_data[0] != 1) // major version number
+ return errh->error("bad major version number %d", _data[0]), -ERANGE;
+ int hdrSize = _data[2], offSize = _data[3];
+ if (hdrSize < 4 || hdrSize > _len || offSize < 1 || offSize > 4)
+ return errh->error("corrupted file header"), -EINVAL;
+ int name_index_pos = hdrSize;
+
+ // parse name INDEX
+ IndexIterator niter(_data, name_index_pos, _len, errh, "Name INDEX");
+ if (niter.error() < 0)
+ return niter.error();
+ _name_index.clear();
+ for (; niter; niter++) {
+ const uint8_t *d0 = niter[0];
+ const uint8_t *d1 = niter[1];
+ if (d0 == d1 || d0[0] == 0)
+ _name_index.push_back(PermString());
+ else
+ _name_index.push_back(PermString(reinterpret_cast<const char *>(d0), d1 - d0));
+ }
+ int top_dict_index_pos = niter.index_end() - _data;
+
+ // check top DICT INDEX
+ _top_dict_index = IndexIterator(_data, top_dict_index_pos, _len, errh, "Top DICT INDEX");
+ if (_top_dict_index.error() < 0)
+ return _top_dict_index.error();
+ else if (_top_dict_index.nitems() != nfonts())
+ return errh->error("invalid font: Top DICT INDEX has %d elements, but there are %d fonts", _top_dict_index.nitems(), nfonts()), -EINVAL;
+ int string_index_pos = _top_dict_index.index_end() - _data;
+
+ // check strings INDEX
+ _strings_index = IndexIterator(_data, string_index_pos, _len, errh, "Strings INDEX");
+ if (_strings_index.error() < 0)
+ return _strings_index.error();
+ else if (NSTANDARD_STRINGS + _strings_index.nitems() - 1 > MAX_SID)
+ return errh->error("too many strings defined in font"), -EINVAL;
+ _strings.assign(_strings_index.nitems(), PermString());
+ int global_subr_index_pos = _strings_index.index_end() - _data;
+
+ // check gsubr INDEX
+ _gsubrs_index = IndexIterator(_data, global_subr_index_pos, _len, errh, "Gsubrs INDEX");
+ if (_gsubrs_index.error() < 0)
+ return _gsubrs_index.error();
+ _gsubrs_cs.assign(ngsubrs(), 0);
+
+ return 0;
+}
+
+int
+Cff::sid(PermString s)
+{
+ if (!s) // XXX?
+ return -1;
+
+ // check standard strings
+ if (standard_permstrings_map["a"] < 0)
+ for (int i = 0; i < NSTANDARD_STRINGS; i++) {
+ if (!standard_permstrings[i])
+ standard_permstrings[i] = PermString(standard_strings[i]);
+ standard_permstrings_map.insert(standard_permstrings[i], i);
+ }
+ int sid = standard_permstrings_map[s];
+ if (sid >= 0)
+ return sid;
+
+ // check user strings
+ sid = _strings_map[s];
+ if (sid >= -1)
+ return sid;
+
+ for (int i = 0; i < _strings.size(); i++)
+ if (!_strings[i] && s.length() == _strings_index[i+1] - _strings_index[i] && memcmp(s.c_str(), _strings_index[i], s.length()) == 0) {
+ _strings[i] = s;
+ _strings_map.insert(s, i + NSTANDARD_STRINGS);
+ return i + NSTANDARD_STRINGS;
+ }
+
+ _strings_map.insert(s, -1);
+ return -1;
+}
+
+String
+Cff::sid_string(int sid) const
+{
+ if (sid < 0)
+ return String();
+ else if (sid < NSTANDARD_STRINGS)
+ return String(sid_permstring(sid));
+ else {
+ sid -= NSTANDARD_STRINGS;
+ if (sid >= _strings.size())
+ return String();
+ else if (_strings[sid])
+ return String(_strings[sid]);
+ else
+ return String(reinterpret_cast<const char *>(_strings_index[sid]), _strings_index[sid + 1] - _strings_index[sid]);
+ }
+}
+
+PermString
+Cff::sid_permstring(int sid) const
+{
+ if (sid < 0)
+ return PermString();
+ else if (sid < NSTANDARD_STRINGS) {
+ if (!standard_permstrings[sid])
+ standard_permstrings[sid] = PermString(standard_strings[sid]);
+ return standard_permstrings[sid];
+ } else {
+ sid -= NSTANDARD_STRINGS;
+ if (sid >= _strings.size())
+ return PermString();
+ else if (_strings[sid])
+ return _strings[sid];
+ else {
+ PermString s = PermString(reinterpret_cast<const char *>(_strings_index[sid]), _strings_index[sid + 1] - _strings_index[sid]);
+ _strings[sid] = s;
+ _strings_map.insert(s, sid + NSTANDARD_STRINGS);
+ return s;
+ }
+ }
+}
+
+int
+Cff::font_offset(int findex, int &offset, int &length) const
+{
+ if (findex < 0 || findex >= nfonts())
+ return -ENOENT;
+ offset = _top_dict_index[findex] - _data;
+ length = _top_dict_index[findex + 1] - _top_dict_index[findex];
+ return 0;
+}
+
+int
+Cff::font_offset(PermString name, int &offset, int &length) const
+{
+ for (int i = 0; i < _name_index.size(); i++)
+ if (_name_index[i] == name && name)
+ return font_offset(i, offset, length);
+ return -ENOENT;
+}
+
+Cff::FontParent *
+Cff::font(PermString font_name, ErrorHandler *errh)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ if (!ok())
+ return errh->error("invalid CFF"), (FontParent *) 0;
+
+ // search for a font named 'font_name'
+ for (int i = 0; i < _name_index.size(); i++)
+ if (_name_index[i] && (!font_name || font_name == _name_index[i])) {
+ int td_offset = _top_dict_index[i] - _data;
+ int td_length = _top_dict_index[i + 1] - _top_dict_index[i];
+ Dict top_dict(this, td_offset, td_length, errh, "Top DICT");
+ if (!top_dict.ok())
+ return 0;
+ else if (top_dict.has_first(oROS))
+ return new Cff::CIDFont(this, _name_index[i], top_dict, errh);
+ else
+ return new Cff::Font(this, _name_index[i], top_dict, errh);
+ }
+
+ if (!font_name)
+ errh->error("no fonts in CFF");
+ else
+ errh->error("font '%s' not found", font_name.c_str());
+ return 0;
+}
+
+static inline int
+subr_bias(int charstring_type, int nsubrs)
+{
+ if (charstring_type == 1)
+ return 0;
+ else if (nsubrs < 1240)
+ return 107;
+ else if (nsubrs < 33900)
+ return 1131;
+ else
+ return 32768;
+}
+
+Charstring *
+Cff::gsubr(int i)
+{
+ i += subr_bias(2, ngsubrs());
+ if (i < 0 || i >= ngsubrs())
+ return 0;
+ if (!_gsubrs_cs[i]) {
+ const uint8_t *s1 = _gsubrs_index[i];
+ int slen = _gsubrs_index[i + 1] - s1;
+ String cs = data_string().substring(s1 - data(), slen);
+ if (slen == 0)
+ return 0;
+ else
+ _gsubrs_cs[i] = new Type2Charstring(cs);
+ }
+ return _gsubrs_cs[i];
+}
+
+
+/*****
+ * Cff::Charset
+ **/
+
+Cff::Charset::Charset(const Cff *cff, int pos, int nglyphs, int max_sid, ErrorHandler *errh)
+{
+ assign(cff, pos, nglyphs, max_sid, errh);
+}
+
+void
+Cff::Charset::assign(const Cff *cff, int pos, int nglyphs, int max_sid, ErrorHandler *errh)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ _sids.reserve(nglyphs);
+
+ if (pos == 0)
+ assign(iso_adobe_charset, sizeof(iso_adobe_charset) / sizeof(int), nglyphs);
+ else if (pos == 1)
+ assign(expert_charset, sizeof(expert_charset) / sizeof(int), nglyphs);
+ else if (pos == 2)
+ assign(expert_subset_charset, sizeof(expert_subset_charset) / sizeof(int), nglyphs);
+ else
+ _error = parse(cff, pos, nglyphs, max_sid, errh);
+
+ if (_error >= 0)
+ for (int g = 0; g < _sids.size(); g++) {
+ if (_gids[_sids[g]] >= 0) {
+ errh->error("glyph '%s' in charset twice", cff->sid_permstring(_sids[g]).c_str());
+ _error = -EEXIST;
+ }
+ _gids[_sids[g]] = g;
+ }
+}
+
+void
+Cff::Charset::assign(const int *data, int size, int nglyphs)
+{
+ if (size < nglyphs)
+ size = nglyphs;
+ _sids.resize(size);
+ memcpy(&_sids[0], data, sizeof(const int) * size);
+ _gids.resize(data[size-1] + 1, -1);
+ _error = 0;
+}
+
+int
+Cff::Charset::parse(const Cff *cff, int pos, int nglyphs, int max_sid, ErrorHandler *errh)
+{
+ const uint8_t *data = cff->data();
+ int len = cff->length();
+
+ if (pos + 1 > len)
+ return errh->error("charset position out of range"), -EFAULT;
+
+ _sids.push_back(0);
+ int actual_max_sid = 0;
+
+ int format = data[pos];
+ if (format == 0) {
+ if (pos + 1 + (nglyphs - 1) * 2 > len)
+ return errh->error("charset [format 0] out of range"), -EFAULT;
+ const uint8_t *p = data + pos + 1;
+ for (; _sids.size() < nglyphs; p += 2) {
+ int sid = (p[0] << 8) | p[1];
+ if (sid > actual_max_sid)
+ actual_max_sid = sid;
+ _sids.push_back(sid);
+ }
+
+ } else if (format == 1) {
+ const uint8_t *p = data + pos + 1;
+ for (; _sids.size() < nglyphs; p += 3) {
+ if (p + 3 > data + len)
+ return errh->error("charset [format 1] out of range"), -EFAULT;
+ int sid = (p[0] << 8) | p[1];
+ int n = p[2];
+ if (sid + n > actual_max_sid)
+ actual_max_sid = sid + n;
+ for (int i = 0; i <= n; i++)
+ _sids.push_back(sid + i);
+ }
+
+ } else if (format == 2) {
+ const uint8_t *p = data + pos + 1;
+ for (; _sids.size() < nglyphs; p += 4) {
+ if (p + 4 > data + len)
+ return errh->error("charset [format 2] out of range"), -EFAULT;
+ int sid = (p[0] << 8) | p[1];
+ int n = (p[2] << 8) | p[3];
+ if (sid + n > actual_max_sid)
+ actual_max_sid = sid + n;
+ for (int i = 0; i <= n; i++)
+ _sids.push_back(sid + i);
+ }
+
+ } else
+ return errh->error("unknown charset format %d", format), -EINVAL;
+
+ if (max_sid >= 0 && actual_max_sid > max_sid)
+ return errh->error("charset [format %d] uses bad SID %d", format, actual_max_sid), -EINVAL;
+ _sids.resize(nglyphs);
+ _gids.resize(actual_max_sid + 1, -1);
+ return 0;
+}
+
+
+/*****
+ * Cff::FDSelect
+ **/
+
+void
+Cff::FDSelect::assign(const Cff *cff, int pos, int nglyphs, ErrorHandler *errh)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+ if (_my_fds)
+ delete[] _fds;
+ _fds = 0;
+ _my_fds = false;
+ _nglyphs = nglyphs;
+ _error = parse(cff, pos, nglyphs, errh);
+}
+
+Cff::FDSelect::~FDSelect()
+{
+ if (_my_fds)
+ delete[] _fds;
+}
+
+int
+Cff::FDSelect::parse(const Cff *cff, int pos, int nglyphs, ErrorHandler *errh)
+{
+ const uint8_t *data = cff->data();
+ int len = cff->length();
+
+ if (pos + 1 > len)
+ return errh->error("FDSelect position out of range"), -EFAULT;
+
+ int format = data[pos];
+ if (format == 0) {
+ if (pos + 1 + nglyphs > len)
+ return errh->error("FDSelect [format 0] out of range"), -EFAULT;
+ _fds = data + pos + 1;
+ _my_fds = false;
+ return 0;
+
+ } else if (format == 3) {
+ int nranges = (data[pos+1] << 8) | data[pos+2];
+ if (pos + 3 + 3*nranges + 2 > len)
+ return errh->error("FDSelect [format 3] out of range"), -EFAULT;
+
+ const uint8_t *p = data + pos + 3;
+ int last_glyph = (p[3*nranges] << 8) | p[3*nranges + 1];
+ if (p[0] || p[1] || last_glyph != nglyphs)
+ return errh->error("FDSelect [format 3] bad values"), -EINVAL;
+
+ _fds = new uint8_t[nglyphs];
+ _my_fds = true;
+ int curglyph = 0;
+ for (; curglyph < nglyphs; p += 3) {
+ int nextglyph = (p[3] << 8) | p[4];
+ if (nextglyph > nglyphs || nextglyph < curglyph)
+ return errh->error("FDSelect [format 3] sorting error"), -EINVAL;
+ memset(const_cast<uint8_t *>(_fds + curglyph), p[2], nextglyph - curglyph);
+ curglyph = nextglyph;
+ }
+ return 0;
+
+ } else
+ return errh->error("unknown charset format %d", format), -EINVAL;
+}
+
+
+/*****
+ * Cff::IndexIterator
+ **/
+
+Cff::IndexIterator::IndexIterator(const uint8_t *data, int pos, int len, ErrorHandler *errh, const char *index_name)
+ : _contents(0), _offset(0), _last_offset(0)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ // check header
+ int nitems = 0;
+ if (POS_GT(pos + 2, len)) {
+ errh->error("%s: position out of range", index_name);
+ _offsize = -EFAULT;
+ } else if (data[pos] == 0 && data[pos + 1] == 0) {
+ _contents = data + pos + 2;
+ _offsize = 0;
+ } else if (POS_GT(pos + 3, len)) {
+ errh->error("%s: position out of range", index_name);
+ _offsize = -EFAULT;
+ } else if ((_offsize = data[pos + 2]), (_offsize < 1 || _offsize > 4)) {
+ errh->error("%s: offset size %d out of range", index_name, _offsize);
+ _offsize = -EINVAL;
+ } else {
+ nitems = (data[pos] << 8) | data[pos + 1];
+ if (POS_GT(pos + 3 + (nitems + 1) * _offsize, len)) {
+ errh->error("%s: data out of range", index_name);
+ _offsize = -EFAULT;
+ } else {
+ _offset = data + pos + 3;
+ _last_offset = _offset + nitems * _offsize;
+ _contents = _last_offset + _offsize - 1;
+ }
+ }
+
+ // check items in offset array
+ uint32_t max_doff_allowed = len - (pos + 2 + (nitems + 1) * _offsize);
+ uint32_t last_doff = 1;
+ for (const uint8_t *o = _offset; o <= _last_offset && _offsize > 0; o += _offsize) {
+ uint32_t doff = offset_at(o);
+ if (doff > max_doff_allowed) {
+ errh->error("%s: element out of range", index_name);
+ _offsize = -EFAULT;
+ } else if (doff < last_doff) {
+ errh->error("%s: garbled elements", index_name);
+ break;
+ }
+ last_doff = doff;
+ }
+}
+
+const uint8_t *
+Cff::IndexIterator::index_end() const
+{
+ if (_offsize <= 0)
+ return _contents;
+ else
+ return _contents + offset_at(_last_offset);
+}
+
+int
+Cff::IndexIterator::nitems() const
+{
+ if (_offsize <= 0)
+ return 0;
+ else
+ return (_last_offset - _offset) / _offsize;
+}
+
+
+
+/*****
+ * Cff::Dict
+ **/
+
+Cff::Dict::Dict()
+ : _cff(0), _pos(0), _error(-ENOENT)
+{
+}
+
+Cff::Dict::Dict(Cff *cff, int pos, int dict_len, ErrorHandler *errh, const char *dict_name)
+{
+ assign(cff, pos, dict_len, errh, dict_name);
+}
+
+int
+Cff::Dict::assign(Cff *cff, int pos, int dict_len, ErrorHandler *errh, const char *dict_name)
+{
+ _cff = cff;
+ _pos = pos;
+ _operators.clear();
+ _pointers.clear();
+ _operands.clear();
+
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ const uint8_t *data = cff->data() + pos;
+ const uint8_t *end_data = data + dict_len;
+
+ _pointers.push_back(0);
+ while (data < end_data)
+ switch (data[0]) {
+
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ case 8: case 9: case 10: case 11: case 13: case 14: case 15:
+ case 16: case 17: case 18: case 19: case 20: case 21:
+ _operators.push_back(data[0]);
+ _pointers.push_back(_operands.size());
+ data++;
+ break;
+
+ case 22: case 23: case 24: case 25: case 26: case 27: case 31:
+ case 255: // reserved
+ errh->error("%s: reserved operator %d", dict_name, data[0]);
+ return (_error = -ERANGE);
+
+ case 12:
+ if (data + 1 >= end_data)
+ goto runoff;
+ _operators.push_back(32 + data[1]);
+ _pointers.push_back(_operands.size());
+ data += 2;
+ break;
+
+ case 28: {
+ if (data + 2 >= end_data)
+ goto runoff;
+ int16_t val = (data[1] << 8) | data[2];
+ _operands.push_back(val);
+ data += 3;
+ break;
+ }
+
+ case 29: {
+ if (data + 4 >= end_data)
+ goto runoff;
+ int32_t val = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ _operands.push_back(val);
+ data += 5;
+ break;
+ }
+
+ case 30: {
+ char buf[1024];
+ int pos = 0;
+ if (data + 1 >= end_data)
+ goto runoff;
+ for (data++; data < end_data && pos < 1020; data++) {
+ int d = *data;
+ for (int i = 0; i < 2; i++, d <<= 4) {
+ int digit = (d >> 4) & 0xF;
+ switch (digit) {
+ case 10:
+ buf[pos++] = '.';
+ break;
+ case 11:
+ buf[pos++] = 'E';
+ break;
+ case 12:
+ buf[pos++] = 'E';
+ buf[pos++] = '-';
+ break;
+ case 13:
+ errh->error("%s: bad digit in real number", dict_name);
+ goto invalid;
+ case 14:
+ buf[pos++] = '-';
+ break;
+ case 15:
+ goto found;
+ default:
+ buf[pos++] = digit + '0';
+ break;
+ }
+ }
+ }
+ // number not found
+ goto runoff;
+ found:
+ char *endptr;
+ buf[pos] = '\0';
+ _operands.push_back(strtod(buf, &endptr));
+ if (*endptr) {
+ errh->error("%s: real number syntax error", dict_name);
+ goto invalid;
+ }
+ data++;
+ break;
+ }
+
+ case 247: case 248: case 249: case 250: {
+ if (data + 1 >= end_data)
+ goto runoff;
+ int val = ((data[0] - 247) << 8) + data[1] + 108;
+ _operands.push_back(val);
+ data += 2;
+ break;
+ }
+
+ case 251: case 252: case 253: case 254: {
+ if (data + 1 >= end_data)
+ goto runoff;
+ int val = -((data[0] - 251) << 8) - data[1] - 108;
+ _operands.push_back(val);
+ data += 2;
+ break;
+ }
+
+ default:
+ _operands.push_back(data[0] - 139);
+ data++;
+ break;
+
+ }
+
+ // not closed by an operator?
+ if (_pointers.back() != _operands.size()) {
+ errh->error("%s: not closed by an operator", dict_name);
+ goto invalid;
+ }
+
+ return (_error = 0);
+
+ runoff:
+ errh->error("%s: runoff end of DICT", dict_name);
+ return (_error = -EFAULT);
+
+ invalid:
+ return (_error = -EINVAL);
+}
+
+int
+Cff::Dict::check(bool is_private, ErrorHandler *errh, const char *dict_name) const
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+ int before_nerrors = errh->nerrors();
+
+ // keep track of operator reuse
+ Vector<int> operators_used;
+
+ for (int i = 0; i < _operators.size(); i++) {
+ int arity = _pointers[i+1] - _pointers[i];
+ double num = (arity == 0 ? 0 : _operands[_pointers[i]]);
+ double truncnum = floor(num);
+ int op = _operators[i];
+ int type = (op > oLastOperator ? tNone : operator_types[op]);
+
+ // check reuse
+ if (op >= operators_used.size())
+ operators_used.resize(op + 1, 0);
+ if (operators_used[op] && (type & tTypeMask) != tNone)
+ errh->error("%s: operator '%s' specified twice", dict_name, operator_names[op]);
+ operators_used[op]++;
+
+ // check data
+ switch (type & tTypeMask) {
+
+ case tNone:
+ if (op >= 32)
+ errh->warning("%s: unknown operator '12 %d'", dict_name, op - 32);
+ else
+ errh->warning("%s: unknown operator '%d'", dict_name, op);
+ continue;
+
+ case tSID:
+ if (arity != 1 || num != truncnum || num < 0 || num > _cff->max_sid())
+ goto bad_data;
+ break;
+
+ case tFontNumber:
+ if (arity != 1 || num != truncnum || num < 0 || num >= _cff->nfonts())
+ goto bad_data;
+ break;
+
+ case tBoolean:
+ if (arity != 1)
+ goto bad_data;
+ else if (num != 0 && num != 1)
+ errh->warning("%s: data for Boolean operator '%s' not 0 or 1", dict_name, operator_names[op]);
+ break;
+
+ case tNumber:
+ if (arity != 1)
+ goto bad_data;
+ break;
+
+ case tOffset:
+ if (arity != 1 || num != truncnum || num < 0 || num >= _cff->length())
+ goto bad_data;
+ break;
+
+ case tLocalOffset:
+ if (arity != 1 || num != truncnum || _pos + num < 0 || _pos + num >= _cff->length())
+ goto bad_data;
+ break;
+
+ case tPrivateType: {
+ if (arity != 2 || num != truncnum || num < 0)
+ goto bad_data;
+ double off = _operands[_pointers[i] + 1];
+ if (off < 0 || off + num > _cff->length())
+ goto bad_data;
+ break;
+ }
+
+ case tArray2: case tArray3: case tArray4:
+ case tArray5: case tArray6:
+ if (arity != (type & tTypeMask) - tArray2 + 2)
+ goto bad_data;
+ break;
+
+ case tArray:
+ break;
+
+ }
+
+ // check dict location
+ if (((type & tPrivate) != 0) != is_private)
+ errh->warning("%s: operator '%s' in wrong DICT", dict_name, operator_names[op]);
+
+ continue;
+
+ bad_data:
+ errh->error("%s: bad data for operator '%s'", dict_name, operator_names[op]);
+ }
+
+ return (errh->nerrors() != before_nerrors ? -1 : 0);
+}
+
+bool
+Cff::Dict::has(DictOperator op) const
+{
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op)
+ return true;
+ return false;
+}
+
+bool
+Cff::Dict::xvalue(DictOperator op, Vector<double> &out) const
+{
+ out.clear();
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op) {
+ for (int j = _pointers[i]; j < _pointers[i+1]; j++)
+ out.push_back(_operands[j]);
+ return true;
+ }
+ return false;
+}
+
+bool
+Cff::Dict::xvalue(DictOperator op, int *val) const
+{
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op && _pointers[i] + 1 == _pointers[i+1]) {
+ *val = (int) _operands[_pointers[i]];
+ return true;
+ }
+ return false;
+}
+
+bool
+Cff::Dict::xvalue(DictOperator op, double *val) const
+{
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op && _pointers[i] + 1 == _pointers[i+1]) {
+ *val = _operands[_pointers[i]];
+ return true;
+ }
+ return false;
+}
+
+bool
+Cff::Dict::value(DictOperator op, Vector<double> &out) const
+{
+ return xvalue(op, out) || default_dict().xvalue(op, out);
+}
+
+bool
+Cff::Dict::value(DictOperator op, int *val) const
+{
+ return xvalue(op, val) || default_dict().xvalue(op, val);
+}
+
+bool
+Cff::Dict::value(DictOperator op, double *val) const
+{
+ return xvalue(op, val) || default_dict().xvalue(op, val);
+}
+
+void
+Cff::Dict::unparse(ErrorHandler *errh, const char *dict_name) const
+{
+ StringAccum sa;
+ for (int i = 0; i < _operators.size(); i++) {
+ sa.clear();
+ if (_pointers[i] + 1 == _pointers[i+1])
+ sa << _operands[_pointers[i]];
+ else {
+ sa << "[";
+ for (int j = _pointers[i]; j < _pointers[i+1]; j++)
+ sa << _operands[j] << ' ';
+ sa.pop_back();
+ sa << "]";
+ }
+ errh->message("%s: %s %s", dict_name, operator_names[_operators[i]], sa.c_str());
+ }
+}
+
+
+/*****
+ * CffFontParent
+ **/
+
+static int
+handle_private(Cff *cff, const Cff::Dict &top_dict, Cff::Dict &private_dict,
+ double &default_width_x, double &nominal_width_x,
+ Cff::IndexIterator &subrs_index, Vector<Charstring *> &subrs_cs,
+ ErrorHandler *errh)
+{
+ Vector<double> private_info;
+ top_dict.value(Cff::oPrivate, private_info);
+ int private_offset = (int) private_info[1];
+ private_dict.assign(cff, private_offset, (int) private_info[0], errh, "Private DICT");
+ if (private_dict.error() < 0)
+ return private_dict.error();
+ else if (private_dict.check(true, errh, "Private DICT") < 0)
+ return -EINVAL;
+ //private_dict.unparse(errh, "Private DICT");
+
+ private_dict.value(Cff::oDefaultWidthX, &default_width_x);
+ private_dict.value(Cff::oNominalWidthX, &nominal_width_x);
+ if (private_dict.has(Cff::oSubrs)) {
+ int subrs_offset = 0;
+ private_dict.value(Cff::oSubrs, &subrs_offset);
+ subrs_index = Cff::IndexIterator(cff->data(), private_offset + subrs_offset, cff->length(), errh, "Subrs INDEX");
+ if (subrs_index.error() < 0)
+ return subrs_index.error();
+ }
+ subrs_cs.assign(subrs_index.nitems(), 0);
+ return 0;
+}
+
+
+Cff::FontParent::FontParent(Cff *cff)
+ : _cff(cff), _error(-1)
+{
+}
+
+Charstring *
+Cff::FontParent::charstring(const IndexIterator &iiter, int which) const
+{
+ const uint8_t *s1 = iiter[which];
+ int slen = iiter[which + 1] - s1;
+ String cs = _cff->data_string().substring(s1 - _cff->data(), slen);
+ if (slen == 0)
+ return 0;
+ else if (_charstring_type == 1)
+ return new Type1Charstring(cs);
+ else
+ return new Type2Charstring(cs);
+}
+
+Charstring *
+Cff::FontParent::gsubr(int i) const
+{
+ return _cff->gsubr(i);
+}
+
+int
+Cff::FontParent::gsubr_bias() const
+{
+ return Efont::subr_bias(2, ngsubrs_x());
+}
+
+
+/*****
+ * CffFont
+ **/
+
+Cff::Font::Font(Cff *cff, PermString font_name, const Dict &top_dict, ErrorHandler *errh)
+ : ChildFont(cff, 0, 2, top_dict, errh), _font_name(font_name),
+ _t1encoding(0)
+{
+ assert(!_top_dict.has_first(oROS));
+ if (_error < 0)
+ return;
+
+ // extract CharStrings
+ // must use xvalue because we could be creating the default dict!
+ int charstrings_offset = 0;
+ _top_dict.xvalue(oCharStrings, &charstrings_offset);
+ _charstrings_index = Cff::IndexIterator(cff->data(), charstrings_offset, cff->length(), errh, "CharStrings INDEX");
+ if (_charstrings_index.error() < 0) {
+ _error = _charstrings_index.error();
+ return;
+ }
+ _charstrings_cs.assign(_charstrings_index.nitems(), 0);
+
+ int charset = 0;
+ _top_dict.xvalue(oCharset, &charset);
+ _charset.assign(cff, charset, _charstrings_index.nitems(), cff->max_sid(), errh);
+ if (_charset.error() < 0) {
+ _error = _charset.error();
+ return;
+ }
+
+ int Encoding = 0;
+ _top_dict.xvalue(oEncoding, &Encoding);
+ if (parse_encoding(Encoding, errh) < 0)
+ return;
+
+ // success!
+ _error = 0;
+}
+
+Cff::Font::~Font()
+{
+ for (int i = 0; i < _charstrings_cs.size(); i++)
+ delete _charstrings_cs[i];
+ delete _t1encoding;
+}
+
+int
+Cff::Font::parse_encoding(int pos, ErrorHandler *errh)
+{
+ _encoding_pos = pos;
+ for (int i = 0; i < 256; i++)
+ _encoding[i] = 0;
+
+ // check for standard encodings
+ if (pos == 0)
+ return assign_standard_encoding(standard_encoding);
+ else if (pos == 1)
+ return assign_standard_encoding(expert_encoding);
+
+ // otherwise, a custom encoding
+ const uint8_t *data = _cff->data();
+ int len = _cff->length();
+ if (pos + 1 > len)
+ return errh->error("Encoding position out of range"), -EFAULT;
+ bool supplemented = (data[pos] & 0x80) != 0;
+ int format = (data[pos] & 0x7F);
+
+ int retval = 0;
+ int endpos, g = 1;
+ if (format == 0) {
+ endpos = pos + 2 + data[pos + 1];
+ if (endpos > len)
+ return errh->error("Encoding[0] out of range"), -EFAULT;
+ const uint8_t *p = data + pos + 2;
+ int n = data[pos + 1];
+ for (; g <= n; g++, p++) {
+ int e = p[0];
+ if (_encoding[e])
+ retval = 1;
+ _encoding[e] = g;
+ }
+
+ } else if (format == 1) {
+ endpos = pos + 2 + data[pos + 1] * 2;
+ if (endpos > len)
+ return errh->error("Encoding[1] out of range"), -EFAULT;
+ const uint8_t *p = data + pos + 2;
+ int n = data[pos + 1];
+ for (int i = 0; i < n; i++, p += 2) {
+ int first = p[0];
+ int nLeft = p[1];
+ for (int e = first; e <= first + nLeft; e++) {
+ if (_encoding[e])
+ retval = 1;
+ _encoding[e] = g++;
+ }
+ }
+
+ } else
+ return errh->error("unknown Encoding format %d", format), -EINVAL;
+
+ if (g > _charset.nglyphs())
+ return errh->error("Encoding glyph %d out of range", g), -EINVAL;
+
+ // check supplements
+ if (supplemented) {
+ if (endpos + data[endpos] * 3 > len)
+ return -EINVAL;
+ const uint8_t *p = data + endpos + 1;
+ int n = data[endpos];
+ for (int i = 0; i < n; i++, p += 3) {
+ int e = p[0];
+ int s = (p[1] << 8) | p[2];
+ int g = _charset.sid_to_gid(s);
+ if (_encoding[e])
+ retval = 1;
+ if (g < 0 || g >= _charset.nglyphs())
+ return errh->error("Encoding glyph %d out of range", g), -EINVAL;
+ _encoding[e] = g;
+ }
+ }
+
+ // successfully done
+ return retval;
+}
+
+int
+Cff::Font::assign_standard_encoding(const int *standard_encoding)
+{
+ for (int i = 0; i < 256; i++)
+ _encoding[i] = _charset.sid_to_gid(standard_encoding[i]);
+ return 0;
+}
+
+void
+Cff::Font::font_matrix(double matrix[6]) const
+{
+ Vector<double> t1d_matrix;
+ if (dict_value(oFontMatrix, t1d_matrix) && t1d_matrix.size() == 6)
+ memcpy(&matrix[0], &t1d_matrix[0], sizeof(double) * 6);
+ else {
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+ }
+}
+
+PermString
+Cff::Font::glyph_name(int gid) const
+{
+ if (gid >= 0 && gid < nglyphs())
+ return _cff->sid_permstring(_charset.gid_to_sid(gid));
+ else
+ return PermString();
+}
+
+void
+Cff::Font::glyph_names(Vector<PermString> &gnames) const
+{
+ gnames.resize(nglyphs());
+ for (int i = 0; i < nglyphs(); i++)
+ gnames[i] = _cff->sid_permstring(_charset.gid_to_sid(i));
+}
+
+Charstring *
+Cff::Font::glyph(int gid) const
+{
+ if (gid < 0 || gid >= nglyphs())
+ return 0;
+ if (!_charstrings_cs[gid])
+ _charstrings_cs[gid] = charstring(_charstrings_index, gid);
+ return _charstrings_cs[gid];
+}
+
+Charstring *
+Cff::Font::glyph(PermString name) const
+{
+ int gid = _charset.sid_to_gid(_cff->sid(name));
+ if (gid < 0)
+ return 0;
+ if (!_charstrings_cs[gid])
+ _charstrings_cs[gid] = charstring(_charstrings_index, gid);
+ return _charstrings_cs[gid];
+}
+
+int
+Cff::Font::glyphid(PermString name) const
+{
+ return _charset.sid_to_gid(_cff->sid(name));
+}
+
+Type1Encoding *
+Cff::Font::type1_encoding() const
+{
+ if (_encoding_pos == 0)
+ return Type1Encoding::standard_encoding();
+ if (!_t1encoding)
+ _t1encoding = type1_encoding_copy();
+ return _t1encoding;
+}
+
+Type1Encoding *
+Cff::Font::type1_encoding_copy() const
+{
+ if (_encoding_pos == 0)
+ return Type1Encoding::standard_encoding();
+ Type1Encoding *e = new Type1Encoding;
+ for (int i = 0; i < 256; i++)
+ if (_encoding[i])
+ e->put(i, _cff->sid_permstring(_charset.gid_to_sid(_encoding[i])));
+ return e;
+}
+
+bool
+Cff::Font::dict_has(DictOperator op) const
+{
+ return dict_of(op).has(op);
+}
+
+String
+Cff::Font::dict_string(DictOperator op) const
+{
+ Vector<double> vec;
+ dict_of(op).value(op, vec);
+ if (vec.size() == 1 && vec[0] >= 0 && vec[0] <= _cff->max_sid())
+ return _cff->sid_string((int) vec[0]);
+ else
+ return String();
+}
+
+
+/*****
+ * Cff::CIDFont
+ **/
+
+Cff::CIDFont::CIDFont(Cff *cff, PermString font_name, const Dict &top_dict, ErrorHandler *errh)
+ : FontParent(cff), _font_name(font_name), _top_dict(top_dict)
+{
+ assert(_top_dict.has_first(oROS));
+
+ // parse top DICT
+ _error = -EINVAL;
+ if (_top_dict.check(false, errh, "Top DICT") < 0)
+ return;
+ else if (!_top_dict.has(oCharStrings)) {
+ errh->error("font has no CharStrings dictionary");
+ return;
+ }
+ //_top_dict.unparse(errh, "Top DICT");
+
+ // extract offsets and information from TOP DICT
+ _top_dict.value(oCharstringType, &_charstring_type);
+ if (_charstring_type != 1 && _charstring_type != 2) {
+ errh->error("unknown CharString type %d", _charstring_type);
+ return;
+ }
+
+ int charstrings_offset = 0;
+ _top_dict.value(oCharStrings, &charstrings_offset);
+ _charstrings_index = Cff::IndexIterator(cff->data(), charstrings_offset, cff->length(), errh, "CharStrings INDEX");
+ if (_charstrings_index.error() < 0) {
+ _error = _charstrings_index.error();
+ return;
+ }
+ _charstrings_cs.assign(_charstrings_index.nitems(), 0);
+
+ int charset = 0;
+ _top_dict.value(oCharset, &charset);
+ _charset.assign(cff, charset, _charstrings_index.nitems(), -1, errh);
+ if (_charset.error() < 0) {
+ _error = _charset.error();
+ return;
+ }
+
+ // extract information about child fonts
+ int fdarray_offset = 0;
+ if (!_top_dict.value(oFDArray, &fdarray_offset)) {
+ errh->error("CID-keyed font missing FDArray");
+ return;
+ }
+ IndexIterator fdarray_index(cff->data(), fdarray_offset, cff->length(), errh, "FDArray INDEX");
+ for (; fdarray_index; fdarray_index++) {
+ Dict d(cff, fdarray_index[0] - cff->data(), fdarray_index[1] - fdarray_index[0], errh, "Top DICT");
+ if (!d.ok() || d.check(false, errh, "Top DICT") < 0) {
+ _error = d.error();
+ return;
+ }
+ _child_fonts.push_back(new ChildFont(cff, this, _charstring_type, d, errh));
+ if (!_child_fonts.back()->ok())
+ return;
+ }
+
+ int fdselect_offset = 0;
+ if (!_top_dict.value(oFDSelect, &fdselect_offset)) {
+ errh->error("CID-keyed font missing FDSelect");
+ return;
+ }
+ _fdselect.assign(cff, fdselect_offset, _charstrings_cs.size(), errh);
+ if (_fdselect.error() < 0)
+ return;
+
+ // success!
+ _error = 0;
+ set_parent_program(true);
+}
+
+Cff::CIDFont::~CIDFont()
+{
+ for (int i = 0; i < _charstrings_cs.size(); i++)
+ delete _charstrings_cs[i];
+ for (int i = 0; i < _child_fonts.size(); i++)
+ delete _child_fonts[i];
+}
+
+void
+Cff::CIDFont::font_matrix(double matrix[6]) const
+{
+ // XXX
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+}
+
+const CharstringProgram *
+Cff::CIDFont::child_program(int gid) const
+{
+ int fd = _fdselect.gid_to_fd(gid);
+ if (fd >= 0 && fd < _child_fonts.size())
+ return _child_fonts.at_u(fd);
+ else
+ return 0;
+}
+
+PermString
+Cff::CIDFont::glyph_name(int gid) const
+{
+ if (gid >= 0 && gid < nglyphs())
+ return permprintf("#%d", _charset.gid_to_sid(gid));
+ else
+ return PermString();
+}
+
+void
+Cff::CIDFont::glyph_names(Vector<PermString> &gnames) const
+{
+ gnames.resize(nglyphs());
+ for (int i = 0; i < nglyphs(); i++)
+ gnames[i] = permprintf("#%d", _charset.gid_to_sid(i));
+}
+
+Charstring *
+Cff::CIDFont::glyph(int gid) const
+{
+ if (gid < 0 || gid >= nglyphs())
+ return 0;
+ if (!_charstrings_cs[gid])
+ _charstrings_cs[gid] = charstring(_charstrings_index, gid);
+ return _charstrings_cs[gid];
+}
+
+int
+Cff::CIDFont::glyphid(PermString name) const
+{
+ if (name.length() <= 1 || name[0] != '#' || !isdigit(name[1]))
+ return -1;
+ char *endptr;
+ long cid = strtol(name.c_str() + 1, &endptr, 10);
+ if (*endptr != 0)
+ return -1;
+ return _charset.sid_to_gid(cid);
+}
+
+Charstring *
+Cff::CIDFont::glyph(PermString name) const
+{
+ return CIDFont::glyph(CIDFont::glyphid(name));
+}
+
+
+/*****
+ * ChildFont
+ **/
+
+Cff::ChildFont::ChildFont(Cff *cff, Cff::CIDFont *parent, int charstring_type, const Dict &top_dict, ErrorHandler *errh)
+ : FontParent(cff), _parent(parent), _top_dict(top_dict)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ if (!cff->ok() || !_top_dict.ok()) {
+ errh->error("invalid CFF");
+ _error = -EINVAL;
+ return;
+ }
+
+ // extract offsets and information from TOP DICT
+ _charstring_type = charstring_type;
+ _top_dict.value(oCharstringType, &_charstring_type);
+ if (_charstring_type != 1 && _charstring_type != 2) {
+ errh->error("unknown CharString type %d", _charstring_type);
+ return;
+ }
+
+ // extract information from Private DICT
+ if (_top_dict.has(oPrivate)
+ && (_error = handle_private(cff, _top_dict, _private_dict, _default_width_x, _nominal_width_x, _subrs_index, _subrs_cs, errh)) < 0)
+ return;
+
+ // success!
+ _error = 0;
+}
+
+Cff::ChildFont::~ChildFont()
+{
+ for (int i = 0; i < _subrs_cs.size(); i++)
+ delete _subrs_cs[i];
+}
+
+Charstring *
+Cff::ChildFont::charstring(const IndexIterator &iiter, int which) const
+{
+ const uint8_t *s1 = iiter[which];
+ int slen = iiter[which + 1] - s1;
+ String cs = _cff->data_string().substring(s1 - _cff->data(), slen);
+ if (slen == 0)
+ return 0;
+ else if (_charstring_type == 1)
+ return new Type1Charstring(cs);
+ else
+ return new Type2Charstring(cs);
+}
+
+Charstring *
+Cff::ChildFont::subr(int i) const
+{
+ i += Efont::subr_bias(_charstring_type, nsubrs_x());
+ if (i < 0 || i >= nsubrs_x())
+ return 0;
+ if (!_subrs_cs[i])
+ _subrs_cs[i] = charstring(_subrs_index, i);
+ return _subrs_cs[i];
+}
+
+int
+Cff::ChildFont::subr_bias() const
+{
+ return Efont::subr_bias(_charstring_type, nsubrs_x());
+}
+
+double
+Cff::ChildFont::global_width_x(bool is_nominal) const
+{
+ return (is_nominal ? _nominal_width_x : _default_width_x);
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/encoding.cc b/Build/source/utils/lcdf-typetools/libefont/encoding.cc
new file mode 100644
index 00000000000..11ce122d027
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/encoding.cc
@@ -0,0 +1,29 @@
+// -*- related-file-name: "../include/efont/encoding.hh" -*-
+
+/* encoding.{cc,hh} -- 8-bit encodings
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/encoding.hh>
+namespace Efont {
+
+void
+Encoding8::reserve_glyphs(int count)
+{
+ if (count <= _codes.size()) return;
+ _codes.resize(count, -1);
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/findmet.cc b/Build/source/utils/lcdf-typetools/libefont/findmet.cc
new file mode 100644
index 00000000000..04ed82f0b8e
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/findmet.cc
@@ -0,0 +1,321 @@
+// -*- related-file-name: "../include/efont/findmet.hh" -*-
+
+/* findmet.{cc,hh} -- find font metrics
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/findmet.hh>
+#include <efont/afmparse.hh>
+#include <efont/afm.hh>
+#include <efont/amfm.hh>
+#include <efont/psres.hh>
+#include <string.h>
+#include <stdlib.h>
+namespace Efont {
+
+MetricsFinder::~MetricsFinder()
+{
+ if (_next)
+ _next->_prev = _prev;
+ if (_prev)
+ _prev->_next = _next;
+}
+
+void
+MetricsFinder::add_finder(MetricsFinder *new_finder)
+{
+ if (_next)
+ _next->add_finder(new_finder);
+ else {
+ assert(!new_finder->_prev);
+ new_finder->_prev = this;
+ _next = new_finder;
+ }
+}
+
+Metrics *
+MetricsFinder::find_metrics(PermString name, ErrorHandler *errh)
+{
+ MetricsFinder *f = this;
+ while (f) {
+ Metrics *m = f->find_metrics_x(name, this, errh);
+ if (m) return m;
+ f = f->_next;
+ }
+ return 0;
+}
+
+AmfmMetrics *
+MetricsFinder::find_amfm(PermString name, ErrorHandler *errh)
+{
+ MetricsFinder *f = this;
+ while (f) {
+ AmfmMetrics *m = f->find_amfm_x(name, this, errh);
+ if (m) return m;
+ f = f->_next;
+ }
+ return 0;
+}
+
+void
+MetricsFinder::record(Metrics *m)
+{
+ record(m, m->font_name());
+}
+
+void
+MetricsFinder::record(Metrics *m, PermString name)
+{
+ if (_next) _next->record(m, name);
+}
+
+void
+MetricsFinder::record(AmfmMetrics *amfm)
+{
+ if (_next) _next->record(amfm);
+}
+
+Metrics *
+MetricsFinder::find_metrics_x(PermString, MetricsFinder *, ErrorHandler *)
+{
+ return 0;
+}
+
+AmfmMetrics *
+MetricsFinder::find_amfm_x(PermString, MetricsFinder *, ErrorHandler *)
+{
+ return 0;
+}
+
+Metrics *
+MetricsFinder::try_metrics_file(const Filename &fn, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ if (fn.readable()) {
+ Metrics *afm = AfmReader::read(fn, errh);
+ if (afm) finder->record(afm);
+ return afm;
+ } else
+ return 0;
+}
+
+AmfmMetrics *
+MetricsFinder::try_amfm_file(const Filename &fn, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ if (fn.readable()) {
+ AmfmMetrics *amfm = AmfmReader::read(fn, finder, errh);
+ if (amfm) finder->record(amfm);
+ return amfm;
+ } else
+ return 0;
+}
+
+
+/*****
+ * CacheMetricsFinder
+ **/
+
+CacheMetricsFinder::CacheMetricsFinder()
+ : _metrics_map(-1), _amfm_map(-1)
+{
+}
+
+CacheMetricsFinder::~CacheMetricsFinder()
+{
+ clear();
+}
+
+Metrics *
+CacheMetricsFinder::find_metrics_x(PermString name, MetricsFinder *,
+ ErrorHandler *)
+{
+ int index = _metrics_map[name];
+ return index >= 0 ? _metrics[index] : 0;
+}
+
+AmfmMetrics *
+CacheMetricsFinder::find_amfm_x(PermString name, MetricsFinder *,
+ ErrorHandler*)
+{
+ int index = _amfm_map[name];
+ return index >= 0 ? _amfm[index] : 0;
+}
+
+
+void
+CacheMetricsFinder::record(Metrics *m, PermString name)
+{
+ int index = _metrics.size();
+ _metrics.push_back(m);
+ _metrics_map.insert(name, index);
+ m->use();
+ MetricsFinder::record(m, name);
+}
+
+void
+CacheMetricsFinder::record(AmfmMetrics *amfm)
+{
+ int index = _amfm.size();
+ _amfm.push_back(amfm);
+ _amfm_map.insert(amfm->font_name(), index);
+ amfm->use();
+ MetricsFinder::record(amfm);
+}
+
+void
+CacheMetricsFinder::clear()
+{
+ for (int i = 0; i < _metrics.size(); i++)
+ _metrics[i]->unuse();
+ for (int i = 0; i < _amfm.size(); i++)
+ _amfm[i]->unuse();
+ _metrics.clear();
+ _amfm.clear();
+ _metrics_map.clear();
+ _amfm_map.clear();
+}
+
+
+/*****
+ * InstanceMetricsFinder
+ **/
+
+InstanceMetricsFinder::InstanceMetricsFinder(bool call_mmpfb)
+ : _call_mmpfb(call_mmpfb)
+{
+}
+
+Metrics *
+InstanceMetricsFinder::find_metrics_instance(PermString name,
+ MetricsFinder *finder, ErrorHandler *errh)
+{
+ const char *underscore = strchr(name.c_str(), '_');
+ PermString amfm_name =
+ PermString(name.c_str(), underscore - name.c_str());
+
+ AmfmMetrics *amfm = finder->find_amfm(amfm_name, errh);
+ if (!amfm) return 0;
+
+ MultipleMasterSpace *mmspace = amfm->mmspace();
+ if (!mmspace->check_intermediate() && _call_mmpfb) {
+ char *buf = new char[amfm->font_name().length() + 30];
+ sprintf(buf, "mmpfb -q --amcp-info '%s'", amfm->font_name().c_str());
+
+ FILE *f = popen(buf, "r");
+ if (f) {
+ Filename fake("<mmpfb output>");
+ Slurper slurpy(fake, f);
+ AmfmReader::add_amcp_file(slurpy, amfm, errh);
+ pclose(f);
+ }
+
+ delete[] buf;
+ }
+
+ Vector<double> design = mmspace->default_design_vector();
+ int i = 0;
+ while (underscore[0] == '_' && underscore[1]) {
+ double x = strtod(underscore + 1, const_cast<char **>(&underscore));
+ mmspace->set_design(design, i, x, errh);
+ i++;
+ }
+
+ Vector<double> weight;
+ if (!mmspace->design_to_weight(design, weight, errh))
+ return 0;
+ Metrics *new_afm = amfm->interpolate(design, weight, errh);
+ if (new_afm) {
+ finder->record(new_afm);
+ // What if the dimensions changed because the user specified out-of-range
+ // dimens? We don't want to reinterpolate each time, so record the new
+ // AFM under that name as well.
+ if (new_afm->font_name() != name)
+ finder->record(new_afm, name);
+ }
+ return new_afm;
+}
+
+Metrics *
+InstanceMetricsFinder::find_metrics_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ if (strchr(name.c_str(), '_'))
+ return find_metrics_instance(name, finder, errh);
+ else
+ return 0;
+}
+
+
+/*****
+ * PsresMetricsFinder
+ **/
+
+PsresMetricsFinder::PsresMetricsFinder(PsresDatabase *psres)
+ : _psres(psres)
+{
+}
+
+Metrics *
+PsresMetricsFinder::find_metrics_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ return try_metrics_file
+ (_psres->filename_value("FontAFM", name), finder, errh);
+}
+
+AmfmMetrics *
+PsresMetricsFinder::find_amfm_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ return try_amfm_file
+ (_psres->filename_value("FontAMFM", name), finder, errh);
+}
+
+
+/*****
+ * DirectoryMetricsFinder
+ **/
+
+DirectoryMetricsFinder::DirectoryMetricsFinder(PermString d)
+ : _directory(d)
+{
+}
+
+Metrics *
+DirectoryMetricsFinder::find_metrics_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ Metrics *afm = try_metrics_file
+ (Filename(_directory, permcat(name, ".afm")), finder, errh);
+ if (!afm)
+ afm = try_metrics_file
+ (Filename(_directory, permcat(name, ".AFM")), finder, errh);
+ return afm;
+}
+
+AmfmMetrics *
+DirectoryMetricsFinder::find_amfm_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ AmfmMetrics *amfm = try_amfm_file
+ (Filename(_directory, permcat(name, ".amfm")), finder, errh);
+ if (!amfm)
+ amfm = try_amfm_file
+ (Filename(_directory, permcat(name, ".AMFM")), finder, errh);
+ return amfm;
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/metrics.cc b/Build/source/utils/lcdf-typetools/libefont/metrics.cc
new file mode 100644
index 00000000000..3e2508377c8
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/metrics.cc
@@ -0,0 +1,130 @@
+// -*- related-file-name: "../include/efont/metrics.hh" -*-
+
+/* metrics.{cc,hh} -- generic font metrics
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/metrics.hh>
+#include <efont/t1cs.hh> /* for UNKDOUBLE */
+namespace Efont {
+
+Metrics::Metrics()
+ : _name_map(-1),
+ _scale(1), _fdv(fdLast, UNKDOUBLE),
+ _xt_map(0),
+ _uses(0)
+{
+ _xt.push_back((MetricsXt *)0);
+}
+
+
+Metrics::Metrics(PermString font_name, PermString full_name, const Metrics &m)
+ : _font_name(font_name),
+ _family(m._family), _full_name(full_name), _version(m._version),
+ _name_map(m._name_map), _names(m._names), _encoding(m._encoding),
+ _scale(1), _fdv(fdLast, UNKDOUBLE),
+ _pairp(m._pairp),
+ _xt_map(0),
+ _uses(0)
+{
+ reserve_glyphs(m._wdv.size());
+ _kernv.resize(m._kernv.size(), UNKDOUBLE);
+ _xt.push_back((MetricsXt *)0);
+}
+
+
+Metrics::~Metrics()
+{
+ assert(_uses == 0);
+ for (int i = 1; i < _xt.size(); i++)
+ delete _xt[i];
+}
+
+
+void
+Metrics::set_font_name(PermString n)
+{
+ assert(!_font_name);
+ _font_name = n;
+}
+
+
+void
+Metrics::reserve_glyphs(int amt)
+{
+ if (amt <= _wdv.size()) return;
+ _wdv.resize(amt, UNKDOUBLE);
+ _lfv.resize(amt, UNKDOUBLE);
+ _rtv.resize(amt, UNKDOUBLE);
+ _tpv.resize(amt, UNKDOUBLE);
+ _btv.resize(amt, UNKDOUBLE);
+ _encoding.reserve_glyphs(amt);
+ _pairp.reserve_glyphs(amt);
+ for (int i = 1; i < _xt.size(); i++)
+ _xt[i]->reserve_glyphs(amt);
+}
+
+
+GlyphIndex
+Metrics::add_glyph(PermString n)
+{
+ if (nglyphs() >= _wdv.size())
+ reserve_glyphs(nglyphs() ? nglyphs() * 2 : 64);
+ GlyphIndex gi = _names.size();
+ _names.push_back(n);
+ _name_map.insert(n, gi);
+ return gi;
+}
+
+
+static void
+set_dimen(Vector<double> &dest, const Vector<double> &src, double scale,
+ bool increment)
+{
+ int c = src.size();
+ if (increment)
+ for (int i = 0; i < c; i++)
+ dest.at_u(i) += src.at_u(i) * scale;
+ else if (scale < 0.9999 || scale > 1.0001)
+ for (int i = 0; i < c; i++)
+ dest.at_u(i) = src.at_u(i) * scale;
+ else
+ dest = src;
+}
+
+void
+Metrics::interpolate_dimens(const Metrics &m, double scale, bool increment)
+{
+ set_dimen(_fdv, m._fdv, scale, increment);
+ set_dimen(_wdv, m._wdv, scale, increment);
+ set_dimen(_lfv, m._lfv, scale, increment);
+ set_dimen(_rtv, m._rtv, scale, increment);
+ set_dimen(_tpv, m._tpv, scale, increment);
+ set_dimen(_btv, m._btv, scale, increment);
+ set_dimen(_kernv, m._kernv, scale, increment);
+}
+
+
+void
+Metrics::add_xt(MetricsXt *mxt)
+{
+ int n = _xt.size();
+ _xt.push_back(mxt);
+ _xt_map.insert(mxt->kind(), n);
+ if (_wdv.size() > 0)
+ mxt->reserve_glyphs(_wdv.size());
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/otf.cc b/Build/source/utils/lcdf-typetools/libefont/otf.cc
new file mode 100644
index 00000000000..22987bee00b
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otf.cc
@@ -0,0 +1,1237 @@
+// -*- related-file-name: "../include/efont/otf.hh" -*-
+
+/* otf.{cc,hh} -- OpenType font basics
+ *
+ * Copyright (c) 2002-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otf.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include <efont/otfdata.hh> // for ntohl()
+
+#ifndef static_assert
+#define static_assert(c) switch (c) case 0: case (c):
+#endif
+
+#define USHORT_AT(d) (ntohs(*(const uint16_t *)(d)))
+#define ULONG_AT(d) (ntohl(*(const uint32_t *)(d)))
+#define ULONG_AT2(d) ((USHORT_AT((d)) << 16) | USHORT_AT((d)+2))
+
+namespace Efont { namespace OpenType {
+
+Vector<PermString> debug_glyph_names;
+
+Font::Font(const String &s, ErrorHandler *errh)
+ : _str(s)
+{
+ _str.align(4);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Font::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // Fixed sfnt version
+ // USHORT numTables
+ // USHORT searchRange
+ // USHORT entrySelector
+ // USHORT rangeShift
+ int len = length();
+ const uint8_t *data = this->data();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF too small for header"), -EFAULT;
+ if ((data[0] != 'O' || data[1] != 'T' || data[2] != 'T' || data[3] != 'O')
+ && (data[0] != '\000' || data[1] != '\001'))
+ return errh->error("not an OpenType font (bad magic number)"), -ERANGE;
+ int ntables = USHORT_AT(data + 4);
+ if (ntables == 0)
+ return errh->error("OTF contains no tables"), -EINVAL;
+ if (HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * ntables > len)
+ return errh->error("OTF table directory out of range"), -EFAULT;
+
+ // TABLE DIRECTORY ENTRY FORMAT:
+ // ULONG tag
+ // ULONG checksum
+ // ULONG offset
+ // ULONG length
+ uint32_t last_tag = 0U;
+ for (int i = 0; i < ntables; i++) {
+ int loc = HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i;
+ uint32_t tag = ULONG_AT(data + loc);
+ uint32_t offset = ULONG_AT(data + loc + 8);
+ uint32_t length = ULONG_AT(data + loc + 12);
+ if (tag <= last_tag)
+ return errh->error("tags out of order"), -EINVAL;
+ if (offset + length > (uint32_t) len)
+ return errh->error("OTF data for '%s' out of range", Tag(tag).text().c_str()), -EFAULT;
+ last_tag = tag;
+ }
+
+ return 0;
+}
+
+String
+Font::table(Tag tag) const
+{
+ if (error() < 0)
+ return String();
+ const uint8_t *entry = tag.table_entry(data() + HEADER_SIZE, USHORT_AT(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ if (entry)
+ return _str.substring(ULONG_AT(entry + 8), ULONG_AT(entry + 12));
+ else
+ return String();
+}
+
+int
+Font::ntables() const
+{
+ if (error() < 0)
+ return 0;
+ else
+ return USHORT_AT(data() + 4);
+}
+
+Tag
+Font::table_tag(int i) const
+{
+ if (error() < 0 || i < 0 || i >= ntables())
+ return Tag();
+ else
+ return Tag(ULONG_AT(data() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i));
+}
+
+
+/**************************
+ * Tag *
+ * *
+ **************************/
+
+Tag::Tag(const char *s)
+ : _tag(0)
+{
+ if (!s)
+ s = "";
+ for (int i = 0; i < 4; i++)
+ if (*s == 0)
+ _tag = (_tag << 8) | 0x20;
+ else if (*s < 32 || *s > 126) { // don't care if s is signed
+ _tag = 0;
+ return;
+ } else
+ _tag = (_tag << 8) | *s++;
+ if (*s)
+ _tag = 0;
+}
+
+Tag::Tag(const String &s)
+ : _tag(0)
+{
+ if (s.length() <= 4) {
+ const char *ss = s.data();
+ for (int i = 0; i < s.length(); i++, ss++)
+ if (*ss < 32 || *ss > 126) {
+ _tag = 0;
+ return;
+ } else
+ _tag = (_tag << 8) | *ss;
+ for (int i = s.length(); i < 4; i++)
+ _tag = (_tag << 8) | 0x20;
+ }
+}
+
+bool
+Tag::valid() const
+{
+ uint32_t tag = _tag;
+ for (int i = 0; i < 4; i++, tag >>= 8)
+ if ((tag & 255) < 32 || (tag & 255) > 126)
+ return false;
+ return true;
+}
+
+String
+Tag::text() const
+{
+ StringAccum sa;
+ uint32_t tag = _tag;
+ for (int i = 0; i < 4; i++, tag = (tag << 8) | 0x20)
+ if (tag != 0x20202020) {
+ uint8_t c = (tag >> 24) & 255;
+ if (c < 32 || c > 126)
+ sa.snprintf(6, "\\%03o", c);
+ else
+ sa << c;
+ }
+ return sa.take_string();
+}
+
+String
+Tag::langsys_text(Tag script, Tag langsys)
+{
+ if (!langsys.null())
+ return script.text() + "." + langsys.text();
+ else
+ return script.text();
+}
+
+const uint8_t *
+Tag::table_entry(const uint8_t *table, int n, int entry_size) const
+{
+ assert(((uintptr_t)table & 1) == 0);
+ int l = 0;
+ int r = n - 1;
+ while (l <= r) {
+ int m = (l + r) / 2;
+ const uint8_t *entry = table + m * entry_size;
+ uint32_t m_tag = ULONG_AT2(entry);
+ if (_tag < m_tag)
+ r = m - 1;
+ else if (_tag == m_tag)
+ return entry;
+ else
+ l = m + 1;
+ }
+ return 0;
+}
+
+
+
+/**************************
+ * ScriptList *
+ * *
+ **************************/
+
+int
+ScriptList::assign(const String &str, ErrorHandler *errh)
+{
+ _str = str;
+ _str.align(4);
+ int result = check_header(errh ? errh : ErrorHandler::silent_handler());
+ if (result < 0)
+ _str = String();
+ return result;
+}
+
+int
+ScriptList::check_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT scriptCount
+ // 6bytes scriptRecord[]
+ int scriptCount;
+ if (_str.length() < SCRIPTLIST_HEADERSIZE
+ || (scriptCount = USHORT_AT(_str.udata()),
+ _str.length() < SCRIPTLIST_HEADERSIZE + scriptCount*SCRIPT_RECSIZE))
+ return errh->error("OTF ScriptList too short");
+
+ // XXX check that scripts are sorted
+
+ return 0;
+}
+
+int
+ScriptList::script_offset(Tag script) const
+{
+ if (_str.length() == 0)
+ return -1;
+ const uint8_t *data = _str.udata();
+ if (const uint8_t *entry = script.table_entry(data + SCRIPTLIST_HEADERSIZE, USHORT_AT(data), SCRIPT_RECSIZE))
+ return USHORT_AT(entry + 4);
+ else
+ return 0;
+}
+
+int
+ScriptList::check_script(Tag tag, int script_off, ErrorHandler *errh) const
+{
+ const uint8_t *data = _str.udata();
+ int langSysCount;
+ if (_str.length() < script_off + SCRIPT_HEADERSIZE
+ || (langSysCount = USHORT_AT(data + script_off + 2),
+ (_str.length() < script_off + SCRIPT_HEADERSIZE + langSysCount*LANGSYS_RECSIZE)))
+ return (errh ? errh->error("OTF Script table for '%s' out of range", tag.text().c_str()) : -1);
+ // XXX check that langsys are sorted
+ return 0;
+}
+
+int
+ScriptList::langsys_offset(Tag script, Tag langsys, ErrorHandler *errh) const
+{
+ int script_off = script_offset(script);
+ if (script_off == 0) {
+ script = Tag("DFLT");
+ script_off = script_offset(script);
+ }
+ if (script_off <= 0)
+ return script_off;
+
+ // check script bounds
+ if (check_script(script, script_off, errh) < 0)
+ return -1;
+
+ // search script table
+ const uint8_t *data = _str.udata();
+ int langSysCount = USHORT_AT(data + script_off + 2);
+ if (const uint8_t *entry = langsys.table_entry(data + script_off + SCRIPT_HEADERSIZE, langSysCount, LANGSYS_RECSIZE))
+ return script_off + USHORT_AT(entry + 4);
+
+ // return default
+ int defaultLangSys = USHORT_AT(data + script_off);
+ if (defaultLangSys != 0)
+ return script_off + defaultLangSys;
+ else
+ return 0;
+}
+
+int
+ScriptList::language_systems(Vector<Tag> &script, Vector<Tag> &langsys, ErrorHandler *errh) const
+{
+ script.clear();
+ langsys.clear();
+
+ const uint8_t *data = _str.udata();
+ int nscripts = USHORT_AT(data);
+ for (int i = 0; i < nscripts; i++) {
+ Tag script_tag(ULONG_AT2(data + SCRIPTLIST_HEADERSIZE + i*SCRIPT_RECSIZE));
+ int script_off = USHORT_AT(data + SCRIPTLIST_HEADERSIZE + i*SCRIPT_RECSIZE + 4);
+ if (check_script(script_tag, script_off, errh) < 0)
+ return -1;
+ const uint8_t *script_table = data + script_off;
+ if (USHORT_AT(script_table) != 0) // default LangSys
+ script.push_back(script_tag), langsys.push_back(Tag());
+ int nlangsys = USHORT_AT(script_table + 2);
+ for (int j = 0; j < nlangsys; j++) {
+ Tag langsys_tag(ULONG_AT2(script_table + SCRIPT_HEADERSIZE + j*LANGSYS_RECSIZE));
+ script.push_back(script_tag), langsys.push_back(langsys_tag);
+ }
+ }
+
+ return 0;
+}
+
+int
+ScriptList::features(Tag script, Tag langsys, int &required_fid, Vector<int> &fids, ErrorHandler *errh, bool clear_fids) const
+{
+ required_fid = -1;
+ if (clear_fids)
+ fids.clear();
+
+ int offset = langsys_offset(script, langsys);
+ if (offset <= 0)
+ return offset;
+
+ // check langsys bounds
+ const uint8_t *data = _str.udata();
+ int featureCount;
+ if (_str.length() < offset + LANGSYS_HEADERSIZE
+ || (featureCount = USHORT_AT(data + offset + 4),
+ (_str.length() < offset + LANGSYS_HEADERSIZE + featureCount*FEATURE_RECSIZE)))
+ return (errh ? errh->error("OTF LangSys table for '%s/%s' out of range", script.text().c_str(), langsys.text().c_str()) : -1);
+
+ // search langsys table
+ int f = USHORT_AT(data + offset + 2);
+ if (f != 0xFFFF)
+ required_fid = f;
+ data += offset + 6;
+ for (int i = 0; i < featureCount; i++, data += FEATURE_RECSIZE)
+ fids.push_back(USHORT_AT(data));
+
+ return 0;
+}
+
+
+
+/**************************
+ * FeatureList *
+ * *
+ **************************/
+
+int
+FeatureList::assign(const String &str, ErrorHandler *errh)
+{
+ _str = str;
+ _str.align(2);
+ int result = check_header(errh ? errh : ErrorHandler::silent_handler());
+ if (result < 0)
+ _str = String();
+ return result;
+}
+
+int
+FeatureList::check_header(ErrorHandler *errh)
+{
+ int featureCount;
+ if (_str.length() < FEATURELIST_HEADERSIZE
+ || (featureCount = USHORT_AT(_str.udata()),
+ _str.length() < FEATURELIST_HEADERSIZE + featureCount*FEATURE_RECSIZE))
+ return errh->error("OTF FeatureList too short");
+ return 0;
+}
+
+Tag
+FeatureList::tag(int fid) const
+{
+ if (_str.length() == 0)
+ return Tag();
+ const uint8_t *data = _str.udata();
+ int nfeatures = USHORT_AT(data);
+ if (fid >= 0 && fid < nfeatures)
+ return Tag(ULONG_AT2(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE));
+ else
+ return Tag();
+}
+
+String
+FeatureList::params(int fid, int length, ErrorHandler *errh, bool old_style_offset) const
+{
+ if (_str.length() == 0 || length < 0)
+ return String();
+ if (errh == 0)
+ errh = ErrorHandler::silent_handler();
+
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ int nfeatures = USHORT_AT(data);
+ if (fid < 0 || fid >= nfeatures)
+ return errh->error("OTF feature ID '%d' out of range", fid), String();
+ int foff = USHORT_AT(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE + 4);
+ if (len < foff + FEATURE_HEADERSIZE)
+ return errh->error("OTF LookupList for feature ID '%d' too short", fid), String();
+ int poff = USHORT_AT(data + foff);
+ if (poff == 0)
+ return String();
+ if (!old_style_offset)
+ poff += foff;
+ if (len < poff + length)
+ return errh->error("OTF feature parameters for feature ID '%d' out of range", fid), String();
+ else
+ return _str.substring(poff, length);
+}
+
+int
+FeatureList::find(Tag tag, const Vector<int> &fids) const
+{
+ if (fids.size() == 0 || _str.length() == 0)
+ return -1;
+
+ const uint8_t *data = _str.udata();
+ int nfeatures = USHORT_AT(data);
+ for (const int *fidp = fids.begin(); fidp != fids.end(); fidp++)
+ if (*fidp >= 0 && *fidp < nfeatures) {
+ uint32_t ftag = ULONG_AT2(data + FEATURELIST_HEADERSIZE + (*fidp)*FEATURE_RECSIZE);
+ if (ftag == tag.value())
+ return *fidp;
+ }
+
+ return -1;
+}
+
+void
+FeatureList::filter(Vector<int> &fids, const Vector<Tag> &sorted_ftags) const
+{
+ if (_str.length() == 0)
+ fids.clear();
+ else {
+ std::sort(fids.begin(), fids.end()); // sort fids
+
+ int i = 0, j = 0;
+ while (i < fids.size() && fids[i] < 0)
+ fids[i++] = 0x7FFFFFFF;
+
+ // XXX check that feature list is in alphabetical order
+
+ const uint8_t *data = _str.udata();
+ int nfeatures = USHORT_AT(data);
+ while (i < fids.size() && j < sorted_ftags.size() && fids[i] < nfeatures) {
+ uint32_t ftag = ULONG_AT2(data + FEATURELIST_HEADERSIZE + fids[i]*FEATURE_RECSIZE);
+ if (ftag < sorted_ftags[j].value()) { // not an interesting feature
+ // replace featureID with a large number, remove later
+ fids[i] = 0x7FFFFFFF;
+ i++;
+ } else if (ftag == sorted_ftags[j].value()) // interesting feature
+ i++;
+ else // an interesting feature is not available
+ j++;
+ }
+
+ fids.resize(i); // remove remaining uninteresting features
+ std::sort(fids.begin(), fids.end()); // resort, to move bad ones last
+ while (fids.size() && fids.back() == 0x7FFFFFFF)
+ fids.pop_back();
+ }
+}
+
+int
+FeatureList::lookups(int fid, Vector<int> &results, ErrorHandler *errh, bool clear_results) const
+{
+ if (clear_results)
+ results.clear();
+ if (_str.length() == 0)
+ return -1;
+ if (errh == 0)
+ errh = ErrorHandler::silent_handler();
+
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ int nfeatures = USHORT_AT(data);
+ if (fid < 0 || fid >= nfeatures)
+ return errh->error("OTF feature ID '%d' out of range", fid);
+ int foff = USHORT_AT(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE + 4);
+ int lookupCount;
+ if (len < foff + FEATURE_HEADERSIZE
+ || (lookupCount = USHORT_AT(data + foff + 2),
+ len < foff + FEATURE_HEADERSIZE + lookupCount*LOOKUPLIST_RECSIZE))
+ return errh->error("OTF LookupList for feature ID '%d' too short", fid);
+ const uint8_t *ldata = data + foff + FEATURE_HEADERSIZE;
+ for (int j = 0; j < lookupCount; j++, ldata += LOOKUPLIST_RECSIZE)
+ results.push_back(USHORT_AT(ldata));
+
+ return 0;
+}
+
+int
+FeatureList::lookups(const Vector<int> &fids, Vector<int> &results, ErrorHandler *errh) const
+{
+ results.clear();
+ if (_str.length() == 0)
+ return -1;
+
+ for (int i = 0; i < fids.size(); i++)
+ if (lookups(fids[i], results, errh, false) < 0)
+ return -1;
+
+ // sort results and remove duplicates
+ std::sort(results.begin(), results.end());
+ int *unique_result = std::unique(results.begin(), results.end());
+ results.resize(unique_result - results.begin());
+ return 0;
+}
+
+int
+FeatureList::lookups(const Vector<int> &required_fids, const Vector<int> &fids, const Vector<Tag> &sorted_ftags, Vector<int> &results, ErrorHandler *errh) const
+{
+ Vector<int> fidsx(fids);
+ filter(fidsx, sorted_ftags);
+ for (int i = 0; i < required_fids.size(); i++)
+ fidsx.push_back(required_fids[i]);
+ return lookups(fidsx, results, errh);
+}
+
+int
+FeatureList::lookups(int required_fid, const Vector<int> &fids, const Vector<Tag> &sorted_ftags, Vector<int> &results, ErrorHandler *errh) const
+{
+ Vector<int> fidsx(fids);
+ filter(fidsx, sorted_ftags);
+ if (required_fid >= 0)
+ fidsx.push_back(required_fid);
+ return lookups(fidsx, results, errh);
+}
+
+int
+FeatureList::lookups(const ScriptList &script_list, Tag script, Tag langsys, const Vector<Tag> &sorted_ftags, Vector<int> &results, ErrorHandler *errh) const
+{
+ int required_fid;
+ Vector<int> fids;
+ int result = script_list.features(script, langsys, required_fid, fids, errh);
+ if (result >= 0) {
+ filter(fids, sorted_ftags);
+ if (required_fid >= 0)
+ fids.push_back(required_fid);
+ result = lookups(fids, results, errh);
+ }
+ return result;
+}
+
+
+/**************************
+ * Coverage *
+ * *
+ **************************/
+
+Coverage::Coverage() throw ()
+{
+}
+
+Coverage::Coverage(Glyph first, Glyph last) throw ()
+{
+ if (first <= last) {
+ _str = String("\000\002\000\001\000\000\000\000\000\000", 10);
+ uint8_t *data = _str.mutable_udata();
+ data[4] = first >> 8;
+ data[5] = first & 255;
+ data[6] = last >> 8;
+ data[7] = last & 255;
+ _str.align(2);
+ }
+}
+
+Coverage::Coverage(const String &str, ErrorHandler *errh, bool do_check) throw ()
+ : _str(str)
+{
+ _str.align(2);
+ if (do_check) {
+ if (check(errh ? errh : ErrorHandler::silent_handler()) < 0)
+ _str = String();
+ } else { // check()'s shorten-string side effect
+ const uint8_t *data = _str.udata();
+ int count = USHORT_AT(data + 2);
+ if (data[1] == T_LIST)
+ _str = _str.substring(0, HEADERSIZE + count*LIST_RECSIZE);
+ else
+ _str = _str.substring(0, HEADERSIZE + count*RANGES_RECSIZE);
+ }
+}
+
+int
+Coverage::check(ErrorHandler *errh)
+ // side effect: shorten string to cover coverage
+{
+ // HEADER FORMAT:
+ // USHORT coverageFormat
+ // USHORT glyphCount
+ const uint8_t *data = _str.udata();
+ if (_str.length() < HEADERSIZE)
+ return errh->error("OTF coverage table too small for header");
+ int coverageFormat = USHORT_AT(data);
+ int count = USHORT_AT(data + 2);
+
+ int len;
+ switch (coverageFormat) {
+ case T_LIST:
+ len = HEADERSIZE + count*LIST_RECSIZE;
+ if (_str.length() < len)
+ return errh->error("OTF coverage table too short (format 1)");
+ // XXX don't check sorting
+ break;
+ case T_RANGES:
+ len = HEADERSIZE + count*RANGES_RECSIZE;
+ if (_str.length() < len)
+ return errh->error("OTF coverage table too short (format 2)");
+ // XXX don't check sorting
+ // XXX don't check startCoverageIndexes
+ break;
+ default:
+ return errh->error("OTF coverage table has unknown format %d", coverageFormat);
+ }
+
+ _str = _str.substring(0, len);
+ return 0;
+}
+
+int
+Coverage::size() const throw ()
+{
+ if (_str.length() == 0)
+ return -1;
+ const uint8_t *data = _str.udata();
+ if (data[1] == T_LIST)
+ return (_str.length() - HEADERSIZE) / LIST_RECSIZE;
+ else if (data[1] == T_RANGES) {
+ data += _str.length() - RANGES_RECSIZE;
+ return USHORT_AT(data + 4) + USHORT_AT(data + 2) - USHORT_AT(data) + 1;
+ } else
+ return -1;
+}
+
+int
+Coverage::coverage_index(Glyph g) const throw ()
+{
+ if (_str.length() == 0)
+ return -1;
+
+ const uint8_t *data = _str.udata();
+ int count = USHORT_AT(data + 2);
+ if (data[1] == T_LIST) {
+ int l = 0, r = count - 1;
+ data += HEADERSIZE;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ int mval = USHORT_AT(data + m * LIST_RECSIZE);
+ if (g < mval)
+ r = m - 1;
+ else if (g == mval)
+ return m;
+ else
+ l = m + 1;
+ }
+ return -1;
+ } else if (data[1] == T_RANGES) {
+ int l = 0, r = count - 1;
+ data += HEADERSIZE;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ if (g < USHORT_AT(rec))
+ r = m - 1;
+ else if (g <= USHORT_AT(rec + 2))
+ return USHORT_AT(rec + 4) + g - USHORT_AT(rec);
+ else
+ l = m + 1;
+ }
+ return -1;
+ } else
+ return -1;
+}
+
+Glyph
+Coverage::operator[](int cindex) const throw ()
+{
+ if (_str.length() == 0 || cindex < 0)
+ return 0;
+
+ const uint8_t *data = _str.udata();
+ int count = USHORT_AT(data + 2);
+ if (data[1] == T_LIST)
+ return (cindex < count ? USHORT_AT(data + cindex * LIST_RECSIZE) : 0);
+ else if (data[1] == T_RANGES) {
+ int l = 0, r = count - 1;
+ data += HEADERSIZE;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ int start_cindex = USHORT_AT(rec + 4);
+ if (cindex < start_cindex)
+ r = m - 1;
+ else if (cindex < start_cindex + USHORT_AT(rec + 2) - USHORT_AT(rec))
+ return USHORT_AT(rec) + cindex - start_cindex;
+ else
+ l = m + 1;
+ }
+ return 0;
+ } else
+ return 0;
+}
+
+void
+Coverage::unparse(StringAccum &sa) const throw ()
+{
+ const uint8_t *data = _str.udata();
+ if (_str.length() == 0)
+ sa << "@*#!";
+ else if (data[1] == T_LIST) {
+ int count = USHORT_AT(data + 2);
+ for (int i = 0; i < count; i++) {
+ if (i) sa << ',';
+ sa << USHORT_AT(data + HEADERSIZE + i*LIST_RECSIZE);
+ }
+ } else {
+ for (int pos = HEADERSIZE; pos < _str.length(); pos += RANGES_RECSIZE) {
+ Glyph start = USHORT_AT(data + pos);
+ Glyph end = USHORT_AT(data + pos + 2);
+ if (pos > HEADERSIZE) sa << ',';
+ sa << start;
+ if (end != start) sa << '.' << '.' << end;
+ }
+ }
+}
+
+String
+Coverage::unparse() const throw ()
+{
+ StringAccum sa;
+ unparse(sa);
+ return sa.take_string();
+}
+
+Coverage
+operator&(const Coverage &a, const Coverage &b)
+{
+ StringAccum sa;
+ sa << '\000' << '\001' << '\000' << '\000';
+ Coverage::iterator ai = a.begin(), bi = b.begin();
+ while (ai && bi) {
+ if (*ai < *bi)
+ ai.forward_to(*bi);
+ else if (*ai == *bi) {
+ uint16_t x = *ai;
+ sa << (char)(x >> 8) << (char)(x & 0xFF);
+ ai++, bi++;
+ } else
+ bi.forward_to(*ai);
+ }
+ int n = (sa.length() - 4) / 2;
+ sa[2] = (n >> 8);
+ sa[3] = (n & 0xFF);
+ return Coverage(sa.take_string(), 0, false);
+}
+
+bool
+operator<=(const Coverage &a, const Coverage &b)
+{
+ Coverage::iterator ai = a.begin(), bi = b.begin();
+ while (ai && bi) {
+ if (*ai != *bi && !bi.forward_to(*ai))
+ return false;
+ ai++, bi++;
+ }
+ return bi || !ai;
+}
+
+
+/************************
+ * Coverage::iterator *
+ * *
+ ************************/
+
+Coverage::iterator::iterator(const String &str, int pos)
+ : _str(str), _pos(pos), _value(0)
+{
+ // XXX assume _str has been checked
+
+ // shrink _str to fit the coverage table
+ const uint8_t *data = _str.udata();
+ if (_str.length()) {
+ int n = USHORT_AT(data + 2);
+ switch (USHORT_AT(data)) {
+ case T_LIST:
+ _str = _str.substring(0, HEADERSIZE + n*LIST_RECSIZE);
+ break;
+ case T_RANGES:
+ _str = _str.substring(0, HEADERSIZE + n*RANGES_RECSIZE);
+ break;
+ default:
+ _str = String();
+ break;
+ }
+ }
+ if (_pos >= _str.length())
+ _pos = _str.length();
+ else {
+ // now, move _pos into the coverage table
+ _pos = HEADERSIZE;
+ _value = (_pos >= _str.length() ? 0 : USHORT_AT(data + _pos));
+ }
+}
+
+int
+Coverage::iterator::coverage_index() const
+{
+ const uint8_t *data = _str.udata();
+ assert(_pos < _str.length());
+ if (data[1] == T_LIST)
+ return (_pos - HEADERSIZE) / LIST_RECSIZE;
+ else
+ return USHORT_AT(data + _pos + 4) + _value - USHORT_AT(data + _pos);
+}
+
+void
+Coverage::iterator::operator++(int)
+{
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ if (_pos >= len
+ || (data[1] == T_RANGES && ++_value <= USHORT_AT(data + _pos + 2)))
+ return;
+ _pos += (data[1] == T_LIST ? LIST_RECSIZE : RANGES_RECSIZE);
+ _value = (_pos >= len ? 0 : USHORT_AT(data + _pos));
+}
+
+bool
+Coverage::iterator::forward_to(Glyph find)
+{
+ // XXX really should check that this works
+
+ if (find <= _value)
+ return find == _value;
+ else if (_pos >= _str.length())
+ return false;
+
+ const uint8_t *data = _str.udata();
+ if (data[1] == T_LIST) {
+ // check for "common" case: next element
+ _pos += LIST_RECSIZE;
+ if (_pos >= _str.length())
+ return false;
+ else if (find <= USHORT_AT(data + _pos)) {
+ _value = USHORT_AT(data + _pos);
+ return find == _value;
+ }
+
+ // otherwise, binary search over remaining area
+ int l = ((_pos - HEADERSIZE) / LIST_RECSIZE) + 1;
+ int r = (_str.length() - HEADERSIZE) / LIST_RECSIZE - 1;
+ data += HEADERSIZE;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ Glyph g = USHORT_AT(data + m * LIST_RECSIZE);
+ if (find < g)
+ r = m - 1;
+ else if (find == g)
+ l = m, r = m - 1;
+ else
+ l = m + 1;
+ }
+ _pos = HEADERSIZE + l * LIST_RECSIZE;
+ _value = (_pos >= _str.length() ? 0 : USHORT_AT(data - HEADERSIZE + _pos));
+ } else { // data[1] == T_RANGES
+ // check for "common" case: this or next element
+ if (find <= USHORT_AT(data + _pos + 2)) {
+ assert(find >= USHORT_AT(data + _pos));
+ _value = find;
+ return true;
+ }
+ _pos += RANGES_RECSIZE;
+ if (_pos >= _str.length())
+ return false;
+ else if (find <= USHORT_AT(data + _pos + 2)) {
+ _value = (find >= USHORT_AT(data + _pos) ? find : USHORT_AT(data + _pos));
+ return find == _value;
+ }
+
+ // otherwise, binary search over remaining area
+ int l = ((_pos - HEADERSIZE) / RANGES_RECSIZE) + 1;
+ int r = (_str.length() - HEADERSIZE) / RANGES_RECSIZE - 1;
+ data += HEADERSIZE;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ if (find < USHORT_AT(data + m * RANGES_RECSIZE))
+ r = m - 1;
+ else if (find <= USHORT_AT(data + m * RANGES_RECSIZE + 2)) {
+ _pos = HEADERSIZE + m * RANGES_RECSIZE;
+ _value = find;
+ return true;
+ } else
+ l = m + 1;
+ }
+ _pos = HEADERSIZE + l * LIST_RECSIZE;
+ _value = (_pos >= _str.length() ? 0 : USHORT_AT(data - HEADERSIZE + _pos));
+ }
+
+ return find == _value;
+}
+
+
+/**************************
+ * GlyphSet *
+ * *
+ **************************/
+
+GlyphSet::GlyphSet()
+{
+ memset(_v, 0, sizeof(_v));
+}
+
+GlyphSet::GlyphSet(const GlyphSet &o)
+{
+ for (int i = 0; i < VLEN; i++)
+ if (o._v[i]) {
+ _v[i] = new uint32_t[VULEN];
+ memcpy(_v[i], o._v[i], sizeof(uint32_t) * VULEN);
+ } else
+ _v[i] = 0;
+}
+
+GlyphSet::~GlyphSet()
+{
+ for (int i = 0; i < VLEN; i++)
+ delete[] _v[i];
+}
+
+int
+GlyphSet::change(Glyph g, bool value)
+{
+ if ((unsigned)g > MAXGLYPH)
+ return -1;
+ uint32_t *&u = _v[g >> SHIFT];
+ if (!u) {
+ u = new uint32_t[VULEN];
+ memset(u, 0, sizeof(uint32_t) * VULEN);
+ }
+ uint32_t mask = (1 << (g & 0x1F));
+ if (value)
+ u[(g & MASK) >> 5] |= mask;
+ else
+ u[(g & MASK) >> 5] &= ~mask;
+ return 0;
+}
+
+GlyphSet &
+GlyphSet::operator=(const GlyphSet &o)
+{
+ if (&o != this) {
+ for (int i = 0; i < VLEN; i++)
+ if (o._v[i]) {
+ if (!_v[i])
+ _v[i] = new uint32_t[VULEN];
+ memcpy(_v[i], o._v[i], sizeof(uint32_t) * VULEN);
+ } else if (_v[i])
+ memset(_v[i], 0, sizeof(uint32_t) * VULEN);
+ }
+ return *this;
+}
+
+
+/**************************
+ * ClassDef *
+ * *
+ **************************/
+
+ClassDef::ClassDef(const String &str, ErrorHandler *errh) throw ()
+ : _str(str)
+{
+ _str.align(2);
+ if (check(errh ? errh : ErrorHandler::silent_handler()) < 0)
+ _str = String();
+}
+
+int
+ClassDef::check(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT coverageFormat
+ // USHORT glyphCount
+ const uint8_t *data = _str.udata();
+ if (_str.length() < 6) // NB: prevents empty format-2 tables
+ return errh->error("OTF class def table too small for header");
+ int classFormat = USHORT_AT(data);
+
+ int len;
+ if (classFormat == T_LIST) {
+ int count = USHORT_AT(data + 4);
+ len = LIST_HEADERSIZE + count*LIST_RECSIZE;
+ // XXX don't check sorting
+ } else if (classFormat == T_RANGES) {
+ int count = USHORT_AT(data + 2);
+ len = RANGES_HEADERSIZE + count*RANGES_RECSIZE;
+ // XXX don't check sorting
+ } else
+ return errh->error("OTF class def table has unknown format %d", classFormat);
+
+ if (len > _str.length())
+ return errh->error("OTF class def table too short");
+ else {
+ _str = _str.substring(0, len);
+ return 0;
+ }
+}
+
+int
+ClassDef::lookup(Glyph g) const throw ()
+{
+ if (_str.length() == 0)
+ return -1;
+
+ const uint8_t *data = _str.udata();
+ int coverageFormat = USHORT_AT(data);
+
+ if (coverageFormat == T_LIST) {
+ Glyph start = USHORT_AT(data + 2);
+ int count = USHORT_AT(data + 4);
+ if (g < start || g >= start + count)
+ return 0;
+ else
+ return USHORT_AT(data + LIST_HEADERSIZE + (g - start) * LIST_RECSIZE);
+ } else if (coverageFormat == T_RANGES) {
+ int l = 0, r = USHORT_AT(data + 2) - 1;
+ data += RANGES_HEADERSIZE;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ if (g < USHORT_AT(rec))
+ r = m - 1;
+ else if (g <= USHORT_AT(rec + 2))
+ return USHORT_AT(rec + 4);
+ else
+ l = m + 1;
+ }
+ return 0;
+ } else
+ return 0;
+}
+
+void
+ClassDef::unparse(StringAccum &sa) const throw ()
+{
+ const uint8_t *data = _str.udata();
+ if (_str.length() == 0)
+ sa << "@*#!";
+ else if (data[1] == T_LIST) {
+ Glyph start = USHORT_AT(data + 2);
+ int count = USHORT_AT(data + 4);
+ for (int i = 0; i < count; i++) {
+ if (i) sa << ',';
+ sa << start + i << '=' << USHORT_AT(data + LIST_HEADERSIZE + i*LIST_RECSIZE);
+ }
+ } else {
+ for (int pos = RANGES_HEADERSIZE; pos < _str.length(); pos += RANGES_RECSIZE) {
+ Glyph start = USHORT_AT(data + pos);
+ Glyph end = USHORT_AT(data + pos + 2);
+ if (pos > RANGES_HEADERSIZE) sa << ',';
+ sa << start;
+ if (end != start) sa << '.' << '.' << end;
+ sa << '=' << USHORT_AT(data + pos + 4);
+ }
+ }
+}
+
+String
+ClassDef::unparse() const throw ()
+{
+ StringAccum sa;
+ unparse(sa);
+ return sa.take_string();
+}
+
+
+/******************************
+ * ClassDef::class_iterator *
+ * *
+ ******************************/
+
+ClassDef::class_iterator::class_iterator(const String &str, int pos, int the_class, const Coverage::iterator &coviter)
+ : _str(str), _pos(pos), _class(the_class), _coviter(coviter)
+{
+ // XXX assume _str has been checked
+
+ // cannot handle the_class == 0 when coviter doesn't exist
+ if (_class == 0 && !_coviter)
+ throw Error("cannot iterate over ClassDef class 0");
+
+ // shrink _str to fit the coverage table, and create a fake coverage
+ // iterator if necessary
+ const uint8_t *data = _str.udata();
+ if (_str.length()) {
+ switch (USHORT_AT(data)) {
+ case T_LIST: {
+ Glyph start = USHORT_AT(data + 2);
+ int nglyphs = USHORT_AT(data + 4);
+ _str = _str.substring(0, LIST_HEADERSIZE + nglyphs*LIST_RECSIZE);
+ if (!_coviter)
+ _coviter = Coverage(start, start + nglyphs - 1).begin();
+ if (_class)
+ _coviter.forward_to(start);
+ break;
+ }
+ case T_RANGES: {
+ Glyph start = USHORT_AT(data + RANGES_HEADERSIZE);
+ int nranges = USHORT_AT(data + 2);
+ _str = _str.substring(0, RANGES_HEADERSIZE + nranges*RANGES_RECSIZE);
+ if (!_coviter) {
+ Glyph end = USHORT_AT(data + RANGES_HEADERSIZE + 2 + (nranges - 1)*RANGES_RECSIZE);
+ _coviter = Coverage(start, end).begin();
+ }
+ if (_class)
+ _coviter.forward_to(start);
+ break;
+ }
+ default:
+ _str = String();
+ break;
+ }
+ }
+
+ // move to the first relevant glyph
+ if (_pos >= _str.length())
+ _pos = _str.length();
+ else {
+ _pos = 0;
+ (*this)++;
+ }
+}
+
+void
+ClassDef::class_iterator::increment_class0()
+{
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ bool is_list = (data[1] == T_LIST);
+
+ if (_pos != 0)
+ _coviter++;
+ else
+ _pos = FIRST_POS;
+
+ if (_pos == FIRST_POS && _coviter) {
+ if (*_coviter < USHORT_AT(data + (is_list ? 2 : RANGES_HEADERSIZE)))
+ return;
+ _pos = (is_list ? LIST_HEADERSIZE : RANGES_HEADERSIZE);
+ }
+
+ while (_pos > 0 && _pos < len && _coviter) {
+ Glyph g = *_coviter;
+ if (is_list) {
+ _pos = LIST_HEADERSIZE + LIST_RECSIZE*(g - USHORT_AT(data + 2));
+ if (_pos >= len)
+ break;
+ else if (USHORT_AT(data + _pos) == 0) // _class == 0
+ return;
+ _coviter++;
+ } else {
+ if (g < USHORT_AT(data + _pos)) // in a zero range
+ return;
+ else if (g > USHORT_AT(data + _pos + 2))
+ _pos += RANGES_RECSIZE;
+ else if (USHORT_AT(data + _pos + 4) == 0) // _class == 0
+ return;
+ else
+ _coviter.forward_to(USHORT_AT(data + _pos + 2) + 1);
+ }
+ }
+
+ if (_coviter)
+ _pos = LAST_POS;
+ else
+ _pos = len;
+}
+
+void
+ClassDef::class_iterator::operator++(int)
+{
+ if (_class == 0) {
+ increment_class0();
+ return;
+ }
+
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ bool is_list = (data[1] == T_LIST);
+
+ if (_pos != 0)
+ _coviter++;
+ else
+ _pos = (is_list ? LIST_HEADERSIZE : RANGES_HEADERSIZE);
+
+ while (_pos < len && _coviter) {
+ Glyph g = *_coviter;
+ if (is_list) {
+ _pos = LIST_HEADERSIZE + LIST_RECSIZE*(g - USHORT_AT(data + 2));
+ if (_pos >= len || USHORT_AT(data + _pos) == _class)
+ return;
+ _coviter++;
+ } else {
+ while (_pos < len && (g > USHORT_AT(data + _pos + 2)
+ || USHORT_AT(data + _pos + 4) != _class))
+ _pos += RANGES_RECSIZE;
+ // now, _pos >= len, or g <= rec.end && class == rec.class
+ if (_pos >= len || g >= USHORT_AT(data + _pos))
+ return;
+ _coviter.forward_to(USHORT_AT(data + _pos));
+ }
+ }
+
+ _pos = len;
+}
+
+
+}}
+
+
+// template instantiations
+#include <lcdf/vector.cc>
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfcmap.cc b/Build/source/utils/lcdf-typetools/libefont/otfcmap.cc
new file mode 100644
index 00000000000..f768995ef6b
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfcmap.cc
@@ -0,0 +1,447 @@
+// -*- related-file-name: "../include/efont/otfcmap.hh" -*-
+
+/* otfcmap.{cc,hh} -- OpenType cmap table
+ *
+ * Copyright (c) 2002-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfcmap.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <efont/otfdata.hh> // for ntohl()
+
+#define USHORT_AT(d) (ntohs(*(const uint16_t *)(d)))
+#define SHORT_AT(d) ((int16_t) ntohs(*(const uint16_t *)(d)))
+#define ULONG_AT(d) (ntohl(*(const uint32_t *)(d)))
+
+namespace Efont { namespace OpenType {
+
+Cmap::Cmap(const String &s, ErrorHandler *errh)
+ : _str(s)
+{
+ _str.align(4);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Cmap::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT version
+ // USHORT numTables
+ int len = _str.length();
+ const uint8_t *data = _str.udata();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF cmap too small for header"), -EFAULT;
+ if (!(data[0] == '\000' && data[1] == '\000'))
+ return errh->error("bad cmap version number"), -ERANGE;
+ _ntables = USHORT_AT(data + 2);
+ if (_ntables == 0)
+ return errh->error("OTF cmap contains no tables"), -EINVAL;
+ if (HEADER_SIZE + ENCODING_SIZE * _ntables > len)
+ return errh->error("cmap directory out of range"), -EFAULT;
+
+ // ENCODING ENTRY FORMAT:
+ // USHORT platformID
+ // USHORT encodingID
+ // ULONG offset
+ int last_platform = -1;
+ int last_encoding = -1;
+ int last_version = -1;
+ _first_unicode_table = -1;
+ for (int i = 0; i < _ntables; i++) {
+ int loc = HEADER_SIZE + ENCODING_SIZE * i;
+ int platform = USHORT_AT(data + loc);
+ int encoding = USHORT_AT(data + loc + 2);
+ uint32_t offset = ULONG_AT(data + loc + 4);
+ if (offset + 2 > (uint32_t) len)
+ return errh->error("encoding data for entry %d out of range", i);
+ int version = USHORT_AT(data + offset);
+ if (!(platform > last_platform
+ || (platform == last_platform
+ && (encoding > last_encoding
+ || (encoding == last_encoding
+ && version > last_version)))))
+ return errh->error("subtables out of order at entry %d", i);
+ if ((platform == 0 || (platform == 3 && encoding == 1))
+ && _first_unicode_table < 0)
+ _first_unicode_table = i;
+ last_platform = platform, last_encoding = encoding, last_version = version;
+ }
+
+ _table_error.assign(_ntables, -2);
+ return 0;
+}
+
+int
+Cmap::first_table(int platform, int encoding) const
+{
+ if (error() < 0)
+ return -1;
+ const uint8_t *data = _str.udata();
+ data += HEADER_SIZE;
+ for (int i = 0; i < _ntables; i++, data += ENCODING_SIZE) {
+ int p = USHORT_AT(data), e = USHORT_AT(data + 2);
+ if (platform == p && (encoding < 0 || encoding == e))
+ return i;
+ }
+ return -1;
+}
+
+int
+Cmap::check_table(int t, ErrorHandler *errh) const
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+ if (_error < 0 || t < 0 || t >= _ntables)
+ return errh->error("no such table");
+ if (_table_error[t] > -2)
+ return _table_error[t];
+ _table_error[t] = -1;
+
+ const uint8_t *data = _str.udata();
+ uint32_t offset = ULONG_AT(data + HEADER_SIZE + t * ENCODING_SIZE + 4);
+ uint32_t left = _str.length() - offset;
+ data += offset;
+ int format = USHORT_AT(data);
+ uint32_t length = 0; // value not used
+
+ switch (format) {
+
+ case F_BYTE:
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length != 259)
+ return errh->error("bad table %d length (format %d)", t, format);
+ break;
+
+ case F_HIBYTE:
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length < 524)
+ return errh->error("bad table %d length (format %d)", t, format);
+ for (int hi_byte = 0; hi_byte < 256; hi_byte++)
+ if (uint32_t subh_key = USHORT_AT(data + 6 + 2 * hi_byte)) {
+ if ((subh_key & 7) || HIBYTE_SUBHEADERS + subh_key + 8 > length)
+ return errh->error("bad table %d subheader %d offset (format 2)", t, hi_byte);
+ const uint8_t *subh = data + HIBYTE_SUBHEADERS + subh_key;
+ int firstCode = USHORT_AT(subh);
+ int entryCount = USHORT_AT(subh + 2);
+ int idRangeOffset = USHORT_AT(subh + 6);
+ if (firstCode + entryCount > 256 || entryCount == 0)
+ return errh->error("bad table %d subheader %d contents (format 2)", t, hi_byte);
+ if ((HIBYTE_SUBHEADERS + subh_key + 6) // pos[idRangeOffset]
+ + idRangeOffset + entryCount * 2 > length)
+ return errh->error("bad table %d subheader %d length (format 2)", t, hi_byte);
+ }
+ break;
+
+ case F_SEGMENTED: {
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length < 16)
+ return errh->error("bad table %d length (format %d)", t, format);
+ int segCountX2 = USHORT_AT(data + 6);
+ int searchRange = USHORT_AT(data + 8);
+ int entrySelector = USHORT_AT(data + 10);
+ int rangeShift = USHORT_AT(data + 12);
+ if ((segCountX2 & 1)
+ || segCountX2 == 0
+ || (searchRange & (searchRange - 1)) /* not a power of 2? */
+ || searchRange <= segCountX2/2
+ || (searchRange>>1) > segCountX2/2
+ || 1 << (entrySelector + 1) != searchRange
+ || rangeShift != segCountX2 - searchRange)
+ return errh->error("bad table %d segment counts (format 4)", t);
+ uint32_t segCount = segCountX2 >> 1;
+ if (length < 16 + 8 * segCount)
+ return errh->error("bad table %d length (format %d)", t, format);
+ const uint8_t *endCodes = data + 14;
+ const uint8_t *startCodes = endCodes + 2 + segCountX2;
+ const uint8_t *idDeltas = startCodes + segCountX2;
+ const uint8_t *idRangeOffsets = idDeltas + segCountX2;
+ int last_end = 0;
+ for (int i = 0; i < segCountX2; i += 2) {
+ int endCode = USHORT_AT(endCodes + i);
+ int startCode = USHORT_AT(startCodes + i);
+ /* int idDelta = SHORT_AT(idDeltas + i); // no need to check */
+ int idRangeOffset = USHORT_AT(idRangeOffsets + i);
+ if (endCode < startCode || startCode < last_end)
+ return errh->error("bad table %d overlapping range %d (format %d)", t, i/2, format);
+ if (idRangeOffset
+ && idRangeOffsets + i + idRangeOffset + (endCode - startCode)*2 + 2 > data + length)
+ return errh->error("bad table %d range %d length (format 4)", t, i/2);
+ last_end = endCode + 1;
+ }
+ if (USHORT_AT(endCodes + segCountX2 - 2) != 0xFFFF)
+ return errh->error("bad table %d incorrect final endCode (format 4)", t);
+ break;
+ }
+
+ case F_TRIMMED: {
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length < 10)
+ return errh->error("bad table %d length (format %d)", t, format);
+ uint32_t entryCount = USHORT_AT(data + 8);
+ if (10 + entryCount * 2 > length)
+ return errh->error("bad table %d length (format %d)", t, format);
+ break;
+ }
+
+ case F_SEGMENTED32: {
+ if (left < 8
+ || (length = ULONG_AT(data + 4)) > left
+ || length < 16)
+ return errh->error("bad table %d length (format %d)", t, format);
+ uint32_t nGroups = ULONG_AT(data + 16);
+ if ((length - 16) / 12 < nGroups)
+ return errh->error("bad table %d length (format %d)", t, format);
+ uint32_t last_post_end = 0;
+ data += 16;
+ for (uint32_t i = 0; i < nGroups; i++, data += 12) {
+ uint32_t startCharCode = ULONG_AT(data);
+ uint32_t endCharCode = ULONG_AT(data + 4);
+ if (startCharCode < last_post_end || endCharCode < startCharCode)
+ return errh->error("bad table %d overlapping range %d (format %d)", t, i, format);
+ last_post_end = endCharCode + 1;
+ }
+ break;
+ }
+
+ case F_HIBYTE32:
+ case F_TRIMMED32:
+ default:
+ return errh->error("bad table %d unsupported format %d", t, format);
+
+ }
+
+ _table_error[t] = 0;
+ return 0;
+}
+
+Glyph
+Cmap::map_table(int t, uint32_t uni, ErrorHandler *errh) const
+{
+ if (check_table(t, errh) < 0)
+ return 0;
+
+ const uint8_t *data = _str.udata();
+ data += ULONG_AT(data + HEADER_SIZE + t * ENCODING_SIZE + 4);
+
+ switch (USHORT_AT(data)) {
+
+ case F_BYTE:
+ if (uni < 256)
+ return data[6 + uni];
+ else
+ return 0;
+
+ case F_HIBYTE: {
+ if (uni >= 65536)
+ return 0;
+ int hi_byte = (uni >> 8) & 255;
+ int subh = USHORT_AT(data + 6 + hi_byte * 2);
+ if (subh == 0 && hi_byte) // XXX?
+ return 0;
+ data += 524 + subh;
+ int firstCode = USHORT_AT(data);
+ int entryCount = USHORT_AT(data + 2);
+ int idDelta = SHORT_AT(data + 4);
+ int idRangeOffset = USHORT_AT(data + 6);
+ int lo_byte = uni & 255;
+ if (lo_byte < firstCode || lo_byte >= firstCode + entryCount)
+ return 0;
+ int answer = USHORT_AT(data + 6 + idRangeOffset + (lo_byte - firstCode) * 2);
+ if (answer == 0)
+ return 0;
+ return (answer + idDelta) & 65535;
+ }
+
+ case F_SEGMENTED: {
+ if (uni >= 65536)
+ return 0;
+ int segCount = USHORT_AT(data + 6) >> 1;
+ const uint8_t *endCounts = data + 14;
+ const uint8_t *startCounts = endCounts + (segCount << 1) + 2;
+ const uint8_t *idDeltas = startCounts + (segCount << 1);
+ const uint8_t *idRangeOffsets = idDeltas + (segCount << 1);
+ int l = 0, r = segCount - 1;
+ while (l <= r) {
+ int m = (l + r) / 2;
+ uint32_t endCount = USHORT_AT(endCounts + (m << 1));
+ uint32_t startCount = USHORT_AT(startCounts + (m << 1));
+ if (uni < startCount)
+ r = m - 1;
+ else if (uni <= endCount) {
+ int idDelta = SHORT_AT(idDeltas + (m << 1));
+ int idRangeOffset = USHORT_AT(idRangeOffsets + (m << 1));
+ if (idRangeOffset == 0)
+ return (idDelta + uni) & 65535;
+ int g = USHORT_AT(idRangeOffsets + (m << 1) + idRangeOffset + ((uni - startCount) << 1));
+ if (g == 0)
+ return 0;
+ return (idDelta + g) & 65535;
+ } else
+ l = m + 1;
+ }
+ return 0;
+ }
+
+ case F_TRIMMED: {
+ uint32_t firstCode = USHORT_AT(data + 6);
+ uint32_t entryCount = USHORT_AT(data + 8);
+ if (uni < firstCode || uni >= firstCode + entryCount)
+ return 0;
+ return USHORT_AT(data + 10 + ((uni - firstCode) << 1));
+ }
+
+ case F_SEGMENTED32: {
+ uint32_t nGroups = ULONG_AT(data + 12);
+ uint32_t l = 0, r = nGroups - 1;
+ const uint8_t *groups = data + 16;
+ while (l <= r) {
+ uint32_t m = (l + r) / 2;
+ uint32_t startCharCode = ULONG_AT(groups + m * 12);
+ uint32_t endCharCode = ULONG_AT(groups + m * 12 + 4);
+ if (uni < startCharCode)
+ r = m - 1;
+ else if (uni <= endCharCode)
+ return ULONG_AT(groups + m * 12 + 8) + uni - startCharCode;
+ else
+ l = m + 1;
+ }
+ return 0;
+ }
+
+ default:
+ return 0;
+
+ }
+}
+
+void
+Cmap::dump_table(int t, Vector<uint32_t> &cs, Vector<uint32_t> &gs, ErrorHandler *errh) const
+{
+ if (check_table(t, errh) < 0)
+ return;
+
+ const uint8_t *data = _str.udata();
+ data += ULONG_AT(data + HEADER_SIZE + t * ENCODING_SIZE + 4);
+
+ switch (USHORT_AT(data)) {
+
+ case F_BYTE:
+ for (int c = 0; c < 256; c++)
+ if (int g = data[6 + c]) {
+ cs.push_back(c);
+ gs.push_back(g);
+ }
+ break;
+
+ case F_HIBYTE:
+ assert(USHORT_AT(data + 6) == 0);
+ for (int hi_byte = 0; hi_byte < 256; hi_byte++) {
+ int subh = USHORT_AT(data + 6 + hi_byte * 4);
+ if (subh == 0 && hi_byte > 0)
+ continue;
+ const uint8_t *tdata = data + 524 + subh;
+ int firstCode = USHORT_AT(tdata);
+ int entryCount = USHORT_AT(tdata + 2);
+ int idDelta = SHORT_AT(tdata + 4);
+ int idRangeOffset = USHORT_AT(tdata + 6);
+ const uint8_t *gdata = tdata + 6 + idRangeOffset;
+ for (int i = 0; i < entryCount; i++)
+ if (int g = USHORT_AT(gdata + (i << 1))) {
+ cs.push_back(hi_byte << 8 + firstCode + i);
+ gs.push_back((idDelta + g) & 65535);
+ }
+ }
+ break;
+
+ case F_SEGMENTED: {
+ int segCountX2 = USHORT_AT(data + 6);
+ const uint8_t *endCounts = data + 14;
+ const uint8_t *startCounts = endCounts + segCountX2 + 2;
+ const uint8_t *idDeltas = startCounts + segCountX2;
+ const uint8_t *idRangeOffsets = idDeltas + segCountX2;
+ for (int i = 0; i < segCountX2; i += 2) {
+ int endCount = USHORT_AT(endCounts + i);
+ int startCount = USHORT_AT(startCounts + i);
+ int idDelta = SHORT_AT(idDeltas + i);
+ int idRangeOffset = USHORT_AT(idRangeOffsets + i);
+ if (idRangeOffset == 0) {
+ for (int c = startCount; c <= endCount; c++) {
+ cs.push_back(c);
+ gs.push_back((c + idDelta) & 65535);
+ }
+ } else {
+ const uint8_t *gdata = idRangeOffsets + i + idRangeOffset;
+ for (int c = startCount; c <= endCount; c++, gdata += 2)
+ if (int g = USHORT_AT(gdata)) {
+ cs.push_back(c);
+ gs.push_back((g + idDelta) & 65535);
+ }
+ }
+ }
+ break;
+ }
+
+ case F_TRIMMED: {
+ int firstCode = USHORT_AT(data + 6);
+ int entryCount = USHORT_AT(data + 8);
+ for (int i = 0; i < entryCount; i++)
+ if (int g = USHORT_AT(data + 10 + (i << 1))) {
+ cs.push_back(firstCode + i);
+ gs.push_back(g);
+ }
+ break;
+ }
+
+ case F_SEGMENTED32: {
+ uint32_t nGroups = ULONG_AT(data + 12);
+ const uint8_t *groups = data + 16;
+ for (uint32_t i = 0; i < nGroups; i++, groups += 12) {
+ uint32_t startCharCode = ULONG_AT(groups);
+ uint32_t nCharCodes = ULONG_AT(groups + 4) - startCharCode;
+ uint32_t startGlyphID = ULONG_AT(groups + 8);
+ for (uint32_t i = 0; i <= nCharCodes; i++) {
+ cs.push_back(startCharCode + i);
+ gs.push_back(startGlyphID + i);
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+
+ }
+}
+
+int
+Cmap::map_uni(const Vector<uint32_t> &vin, Vector<Glyph> &vout) const
+{
+ int t = first_unicode_table();
+ if (check_table(t) < 0)
+ return -1;
+ vout.resize(vin.size(), 0);
+ for (int i = 0; i < vin.size(); i++)
+ vout[i] = map_table(t, vin[i]);
+ return 0;
+}
+
+}}
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfdata.cc b/Build/source/utils/lcdf-typetools/libefont/otfdata.cc
new file mode 100644
index 00000000000..00f9f513321
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfdata.cc
@@ -0,0 +1,43 @@
+// -*- related-file-name: "../include/efont/otfdata.hh" -*-
+
+/* otfdata.{cc,hh} -- OpenType bounds-checked string type
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfdata.hh>
+
+namespace Efont { namespace OpenType {
+
+Data
+Data::subtable(unsigned offset) const throw (Bounds)
+{
+ if (offset > (unsigned) _str.length())
+ throw Bounds();
+ return Data(_str.substring(offset));
+}
+
+Data
+Data::offset_subtable(unsigned offset_offset) const throw (Bounds)
+{
+ int offset = u16(offset_offset);
+ if (offset > _str.length())
+ throw Bounds();
+ return Data(_str.substring(offset));
+}
+
+}}
+
+// template instantiations
+#include <lcdf/vector.cc>
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfdescrip.cc b/Build/source/utils/lcdf-typetools/libefont/otfdescrip.cc
new file mode 100644
index 00000000000..52e60d5b2ef
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfdescrip.cc
@@ -0,0 +1,611 @@
+/* otfdescrip.cc -- descriptions for OpenType tags
+ *
+ * Copyright (c) 2002-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otf.hh>
+
+struct Mapping {
+ uint32_t tag;
+ const char *description;
+};
+
+#define T(str) ((str)[0]<<24 | (str)[1]<<16 | (str)[2]<<8 | (str)[3])
+
+static const Mapping scripts[] = {
+ { T("DFLT"), "Default" },
+ { T("arab"), "Arabic" },
+ { T("armn"), "Armenian" },
+ { T("beng"), "Bengali" },
+ { T("bopo"), "Bopomofo" },
+ { T("brai"), "Braille" },
+ { T("byzm"), "Byzantine Music" },
+ { T("cans"), "Canadian Syllabics" },
+ { T("cher"), "Cherokee" },
+ { T("cyrl"), "Cyrillic" },
+ { T("deva"), "Devanagari" },
+ { T("ethi"), "Ethiopic" },
+ { T("geor"), "Georgian" },
+ { T("grek"), "Greek" },
+ { T("gujr"), "Gujarati" },
+ { T("guru"), "Gurmukhi" },
+ { T("hang"), "Hangul" },
+ { T("hani"), "CJK Ideographic" },
+ { T("hebr"), "Hebrew" },
+ { T("jamo"), "Hangul Jamo" },
+ { T("kana"), "Hiragana/Katakana" },
+ { T("khmr"), "Khmer" },
+ { T("knda"), "Kannada" },
+ { T("lao "), "Lao" },
+ { T("latn"), "Latin" },
+ { T("mlym"), "Malayalam" },
+ { T("mong"), "Mongolian" },
+ { T("mymr"), "Myanmar" },
+ { T("ogam"), "Ogham" },
+ { T("orya"), "Oriya" },
+ { T("runr"), "Runic" },
+ { T("sinh"), "Sinhala" },
+ { T("syrc"), "Syriac" },
+ { T("taml"), "Tamil" },
+ { T("telu"), "Telugu" },
+ { T("thaa"), "Thaana" },
+ { T("thai"), "Thai" },
+ { T("tibt"), "Tibetan" },
+ { T("yi "), "Yi" }
+};
+
+static const Mapping languages[] = {
+ { T("ABA "), "Abaza" },
+ { T("ABK "), "Abkhazian" },
+ { T("ADY "), "Adyghe" },
+ { T("AFK "), "Afrikaans" },
+ { T("AFR "), "Afar" },
+ { T("AGW "), "Agaw" },
+ { T("ALT "), "Altai" },
+ { T("AMH "), "Amharic" },
+ { T("ARA "), "Arabic" },
+ { T("ARI "), "Aari" },
+ { T("ARK "), "Arakanese" },
+ { T("ASM "), "Assamese" },
+ { T("ATH "), "Athapaskan" },
+ { T("AVR "), "Avar" },
+ { T("AWA "), "Awadhi" },
+ { T("AYM "), "Aymara" },
+ { T("AZE "), "Azeri" },
+ { T("BAD "), "Badaga" },
+ { T("BAG "), "Baghelkhandi" },
+ { T("BAL "), "Balkar" },
+ { T("BAU "), "Baule" },
+ { T("BBR "), "Berber" },
+ { T("BCH "), "Bench" },
+ { T("BCR "), "Bible Cree" },
+ { T("BEL "), "Belarussian" },
+ { T("BEM "), "Bemba" },
+ { T("BEN "), "Bengali" },
+ { T("BGR "), "Bulgarian" },
+ { T("BHI "), "Bhili" },
+ { T("BHO "), "Bhojpuri" },
+ { T("BIK "), "Bikol" },
+ { T("BIL "), "Bilen" },
+ { T("BKF "), "Blackfoot" },
+ { T("BLI "), "Balochi" },
+ { T("BLN "), "Balante" },
+ { T("BLT "), "Balti" },
+ { T("BMB "), "Bambara" },
+ { T("BML "), "Bamileke" },
+ { T("BRE "), "Breton" },
+ { T("BRH "), "Brahui" },
+ { T("BRI "), "Braj Bhasha" },
+ { T("BRM "), "Burmese" },
+ { T("BSH "), "Bashkir" },
+ { T("BTI "), "Beti" },
+ { T("CAT "), "Catalan" },
+ { T("CEB "), "Cebuano" },
+ { T("CHE "), "Chechen" },
+ { T("CHG "), "Chaha Gurage" },
+ { T("CHH "), "Chattisgarhi" },
+ { T("CHI "), "Chichewa" },
+ { T("CHK "), "Chukchi" },
+ { T("CHP "), "Chipewyan" },
+ { T("CHR "), "Cherokee" },
+ { T("CHU "), "Chuvash" },
+ { T("CMR "), "Comorian" },
+ { T("COP "), "Coptic" },
+ { T("CRE "), "Cree" },
+ { T("CRR "), "Carrier" },
+ { T("CRT "), "Crimean Tatar" },
+ { T("CSL "), "Church Slavonic" },
+ { T("CSY "), "Czech" },
+ { T("DAN "), "Danish" },
+ { T("DAR "), "Dargwa" },
+ { T("DCR "), "Woods Cree" },
+ { T("DEU "), "German (Standard)" },
+ { T("DGR "), "Dogri" },
+ { T("DHV "), "Dhivehi" },
+ { T("DJR "), "Djerma" },
+ { T("DNG "), "Dangme" },
+ { T("DNK "), "Dinka" },
+ { T("DUN "), "Dungan" },
+ { T("DZN "), "Dzongkha" },
+ { T("EBI "), "Ebira" },
+ { T("ECR "), "Eastern Cree" },
+ { T("EDO "), "Edo" },
+ { T("EFI "), "Efik" },
+ { T("ELL "), "Greek" },
+ { T("ENG "), "English" },
+ { T("ERZ "), "Erzya" },
+ { T("ESP "), "Spanish" },
+ { T("ETI "), "Estonian" },
+ { T("EUQ "), "Basque" },
+ { T("EVK "), "Evenki" },
+ { T("EVN "), "Even" },
+ { T("EWE "), "Ewe" },
+ { T("FAN "), "French Antillean" },
+ { T("FAR "), "Farsi" },
+ { T("FIN "), "Finnish" },
+ { T("FJI "), "Fijian" },
+ { T("FLE "), "Flemish" },
+ { T("FNE "), "Forest Nenets" },
+ { T("FON "), "Fon" },
+ { T("FOS "), "Faroese" },
+ { T("FRA "), "French (Standard)" },
+ { T("FRI "), "Frisian" },
+ { T("FRL "), "Friulian" },
+ { T("FTA "), "Futa" },
+ { T("FUL "), "Fulani" },
+ { T("GAD "), "Ga" },
+ { T("GAE "), "Gaelic" },
+ { T("GAG "), "Gagauz" },
+ { T("GAL "), "Galician" },
+ { T("GAR "), "Garshuni" },
+ { T("GAW "), "Garhwali" },
+ { T("GEZ "), "Ge'ez" },
+ { T("GIL "), "Gilyak" },
+ { T("GMZ "), "Gumuz" },
+ { T("GON "), "Gondi" },
+ { T("GRN "), "Greenlandic" },
+ { T("GRO "), "Garo" },
+ { T("GUA "), "Guarani" },
+ { T("GUJ "), "Gujarati" },
+ { T("HAI "), "Haitian" },
+ { T("HAL "), "Halam" },
+ { T("HAR "), "Harauti" },
+ { T("HAU "), "Hausa" },
+ { T("HAW "), "Hawaiian" },
+ { T("HBN "), "Hammer-Banna" },
+ { T("HIL "), "Hiligaynon" },
+ { T("HIN "), "Hindi" },
+ { T("HMA "), "High Mari" },
+ { T("HND "), "Hindko" },
+ { T("HO "), "Ho" },
+ { T("HRI "), "Harari" },
+ { T("HRV "), "Croatian" },
+ { T("HUN "), "Hungarian" },
+ { T("HYE "), "Armenian" },
+ { T("IBO "), "Igbo" },
+ { T("IJO "), "Ijo" },
+ { T("ILO "), "Ilokano" },
+ { T("IND "), "Indonesian" },
+ { T("ING "), "Ingush" },
+ { T("INU "), "Inuktitut" },
+ { T("IRI "), "Irish" },
+ { T("IRT "), "Irish Traditional" },
+ { T("ISL "), "Icelandic" },
+ { T("ISM "), "Inari Sami" },
+ { T("ITA "), "Italian" },
+ { T("IWR "), "Hebrew" },
+ { T("JAN "), "Japanese" },
+ { T("JAV "), "Javanese" },
+ { T("JII "), "Yiddish" },
+ { T("JUD "), "Judezmo" },
+ { T("JUL "), "Jula" },
+ { T("KAB "), "Kabardian" },
+ { T("KAC "), "Kachchi" },
+ { T("KAL "), "Kalenjin" },
+ { T("KAN "), "Kannada" },
+ { T("KAR "), "Karachay" },
+ { T("KAT "), "Georgian" },
+ { T("KAZ "), "Kazakh" },
+ { T("KEB "), "Kebena" },
+ { T("KGE "), "Khutsuri Georgian" },
+ { T("KHA "), "Khakass" },
+ { T("KHK "), "Khanty-Kazim" },
+ { T("KHM "), "Khmer" },
+ { T("KHS "), "Khanty-Shurishkar" },
+ { T("KHV "), "Khanty-Vakhi" },
+ { T("KHW "), "Khowar" },
+ { T("KIK "), "Kikuyu" },
+ { T("KIR "), "Kirghiz" },
+ { T("KIS "), "Kisii" },
+ { T("KKN "), "Kokni" },
+ { T("KLM "), "Kalmyk" },
+ { T("KMB "), "Kamba" },
+ { T("KMN "), "Kumaoni" },
+ { T("KMO "), "Komo" },
+ { T("KMS "), "Komso" },
+ { T("KNR "), "Kanuri" },
+ { T("KOD "), "Kodagu" },
+ { T("KOK "), "Konkani" },
+ { T("KON "), "Kikongo" },
+ { T("KOP "), "Komi-Permyak" },
+ { T("KOR "), "Korean" },
+ { T("KOZ "), "Komi-Zyrian" },
+ { T("KPL "), "Kpelle" },
+ { T("KRI "), "Krio" },
+ { T("KRK "), "Karakalpak" },
+ { T("KRL "), "Karelian" },
+ { T("KRM "), "Karaim" },
+ { T("KRN "), "Karen" },
+ { T("KRT "), "Koorete" },
+ { T("KSH "), "Kashmiri" },
+ { T("KSI "), "Khasi" },
+ { T("KSM "), "Kildin Sami" },
+ { T("KUI "), "Kui" },
+ { T("KUL "), "Kulvi" },
+ { T("KUM "), "Kumyk" },
+ { T("KUR "), "Kurdish" },
+ { T("KUU "), "Kurukh" },
+ { T("KUY "), "Kuy" },
+ { T("KYK "), "Koryak" },
+ { T("LAD "), "Ladin" },
+ { T("LAH "), "Lahuli" },
+ { T("LAK "), "Lak" },
+ { T("LAM "), "Lambani" },
+ { T("LAO "), "Lao" },
+ { T("LAT "), "Latin" },
+ { T("LAZ "), "Laz" },
+ { T("LCR "), "L-Cree" },
+ { T("LDK "), "Ladakhi" },
+ { T("LEZ "), "Lezgi" },
+ { T("LIN "), "Lingala" },
+ { T("LMA "), "Low Mari" },
+ { T("LMB "), "Limbu" },
+ { T("LMW "), "Lomwe" },
+ { T("LSB "), "Lower Sorbian" },
+ { T("LSM "), "Lule Sami" },
+ { T("LTH "), "Lithuanian" },
+ { T("LUB "), "Luba" },
+ { T("LUG "), "Luganda" },
+ { T("LUH "), "Luhya" },
+ { T("LUO "), "Luo" },
+ { T("LVI "), "Latvian" },
+ { T("MAJ "), "Majang" },
+ { T("MAK "), "Makua" },
+ { T("MAL "), "Malayalam Traditional" },
+ { T("MAN "), "Mansi" },
+ { T("MAR "), "Marathi" },
+ { T("MAW "), "Marwari" },
+ { T("MBN "), "Mbundu" },
+ { T("MCH "), "Manchu" },
+ { T("MCR "), "Moose Cree" },
+ { T("MDE "), "Mende" },
+ { T("MEN "), "Me'en" },
+ { T("MIZ "), "Mizo" },
+ { T("MKD "), "Macedonian" },
+ { T("MLE "), "Male" },
+ { T("MLG "), "Malagasy" },
+ { T("MLN "), "Malinke" },
+ { T("MLR "), "Malayalam Reformed" },
+ { T("MLY "), "Malay" },
+ { T("MND "), "Mandinka" },
+ { T("MNG "), "Mongolian" },
+ { T("MNI "), "Manipuri" },
+ { T("MNK "), "Maninka" },
+ { T("MNX "), "Manx Gaelic" },
+ { T("MOK "), "Moksha" },
+ { T("MOL "), "Moldavian" },
+ { T("MON "), "Mon" },
+ { T("MOR "), "Moroccan" },
+ { T("MRI "), "Maori" },
+ { T("MTH "), "Maithili" },
+ { T("MTS "), "Maltese" },
+ { T("MUN "), "Mundari" },
+ { T("NAG "), "Naga-Assamese" },
+ { T("NAN "), "Nanai" },
+ { T("NAS "), "Naskapi" },
+ { T("NCR "), "N-Cree" },
+ { T("NDB "), "Ndebele" },
+ { T("NDG "), "Ndonga" },
+ { T("NEP "), "Nepali" },
+ { T("NEW "), "Newari" },
+ { T("NHC "), "Norway House Cree" },
+ { T("NIS "), "Nisi" },
+ { T("NIU "), "Niuean" },
+ { T("NKL "), "Nkole" },
+ { T("NLD "), "Dutch" },
+ { T("NOG "), "Nogai" },
+ { T("NOR "), "Norwegian" },
+ { T("NSM "), "Northern Sami" },
+ { T("NTA "), "Northern Tai" },
+ { T("NTO "), "Esperanto" },
+ { T("NYN "), "Nynorsk" },
+ { T("OCR "), "Oji-Cree" },
+ { T("OJB "), "Ojibway" },
+ { T("ORI "), "Oriya" },
+ { T("ORO "), "Oromo" },
+ { T("OSS "), "Ossetian" },
+ { T("PAA "), "Palestinian Aramaic" },
+ { T("PAL "), "Pali" },
+ { T("PAN "), "Punjabi" },
+ { T("PAP "), "Palpa" },
+ { T("PAS "), "Pashto" },
+ { T("PGR "), "Polytonic Greek" },
+ { T("PIL "), "Pilipino" },
+ { T("PLG "), "Palaung" },
+ { T("PLK "), "Polish" },
+ { T("PRO "), "Provencal" },
+ { T("PTG "), "Portuguese" },
+ { T("QIN "), "Chin" },
+ { T("RAJ "), "Rajasthani" },
+ { T("RBU "), "Russian Buriat" },
+ { T("RCR "), "R-Cree" },
+ { T("RIA "), "Riang" },
+ { T("RMS "), "Rhaeto-Romanic" },
+ { T("ROM "), "Romanian" },
+ { T("ROY "), "Romany" },
+ { T("RSY "), "Rusyn" },
+ { T("RUA "), "Ruanda" },
+ { T("RUS "), "Russian" },
+ { T("SAD "), "Sadri" },
+ { T("SAN "), "Sanskrit" },
+ { T("SAT "), "Santali" },
+ { T("SAY "), "Sayisi" },
+ { T("SEK "), "Sekota" },
+ { T("SEL "), "Selkup" },
+ { T("SGO "), "Sango" },
+ { T("SHN "), "Shan" },
+ { T("SIB "), "Sibe" },
+ { T("SID "), "Sidamo" },
+ { T("SIG "), "Silte Gurage" },
+ { T("SKS "), "Skolt Sami" },
+ { T("SKY "), "Slovak" },
+ { T("SLA "), "Slavey" },
+ { T("SLV "), "Slovenian" },
+ { T("SML "), "Somali" },
+ { T("SMO "), "Samoan" },
+ { T("SNA "), "Sena" },
+ { T("SND "), "Sindhi" },
+ { T("SNH "), "Sinhalese" },
+ { T("SNK "), "Soninke" },
+ { T("SOG "), "Sodo Gurage" },
+ { T("SOT "), "Sotho" },
+ { T("SQI "), "Albanian" },
+ { T("SRB "), "Serbian" },
+ { T("SRK "), "Saraiki" },
+ { T("SRR "), "Serer" },
+ { T("SSL "), "South Slavey" },
+ { T("SSM "), "Southern Sami" },
+ { T("SUR "), "Suri" },
+ { T("SVA "), "Svan" },
+ { T("SVE "), "Swedish" },
+ { T("SWA "), "Swadaya Aramaic" },
+ { T("SWK "), "Swahili" },
+ { T("SWZ "), "Swazi" },
+ { T("SXT "), "Sutu" },
+ { T("SYR "), "Syriac" },
+ { T("TAB "), "Tabasaran" },
+ { T("TAJ "), "Tajiki" },
+ { T("TAM "), "Tamil" },
+ { T("TAT "), "Tatar" },
+ { T("TCR "), "TH-Cree" },
+ { T("TEL "), "Telugu" },
+ { T("TGN "), "Tongan" },
+ { T("TGR "), "Tigre" },
+ { T("TGY "), "Tigrinya" },
+ { T("THA "), "Thai" },
+ { T("THT "), "Tahitian" },
+ { T("TIB "), "Tibetan" },
+ { T("TKM "), "Turkmen" },
+ { T("TMN "), "Temne" },
+ { T("TNA "), "Tswana" },
+ { T("TNE "), "Tundra Nenets" },
+ { T("TNG "), "Tonga" },
+ { T("TOD "), "Todo" },
+ { T("TRK "), "Turkish" },
+ { T("TSG "), "Tsonga" },
+ { T("TUA "), "Turoyo Aramaic" },
+ { T("TUL "), "Tulu" },
+ { T("TUR "), "Turkish" },
+ { T("TUV "), "Tuvin" },
+ { T("TWI "), "Twi" },
+ { T("UDM "), "Udmurt" },
+ { T("UKR "), "Ukrainian" },
+ { T("URD "), "Urdu" },
+ { T("USB "), "Upper Sorbian" },
+ { T("UYG "), "Uyghur" },
+ { T("UZB "), "Uzbek" },
+ { T("VEN "), "Venda" },
+ { T("VIT "), "Vietnamese" },
+ { T("WA "), "Wa" },
+ { T("WAG "), "Wagdi" },
+ { T("WCR "), "West-Cree" },
+ { T("WEL "), "Welsh" },
+ { T("WLF "), "Wolof" },
+ { T("XHS "), "Xhosa" },
+ { T("YAK "), "Yakut" },
+ { T("YBA "), "Yoruba" },
+ { T("YCR "), "Y-Cree" },
+ { T("YIC "), "Yi Classic" },
+ { T("YIM "), "Yi Modern" },
+ { T("ZHP "), "Chinese Phonetic" },
+ { T("ZHS "), "Chinese Simplified" },
+ { T("ZHT "), "Chinese Traditional" },
+ { T("ZND "), "Zande" },
+ { T("ZUL "), "Zulu" }
+};
+
+static const Mapping features[] = {
+ { T("aalt"), "Access All Alternates" },
+ { T("abvf"), "Above-base Forms" },
+ { T("abvm"), "Above-base Mark Positioning" },
+ { T("abvs"), "Above-base Substitutions" },
+ { T("afrc"), "Alternative Fractions" },
+ { T("akhn"), "Akhands" },
+ { T("blwf"), "Below-base Forms" },
+ { T("blwm"), "Below-base Mark Positioning" },
+ { T("blws"), "Below-base Substitutions" },
+ { T("c2pc"), "Petite Capitals From Capitals" },
+ { T("c2sc"), "Small Capitals From Capitals" },
+ { T("calt"), "Contextual Alternates" },
+ { T("case"), "Case-Sensitive Forms" },
+ { T("ccmp"), "Glyph Composition/Decomposition" },
+ { T("clig"), "Contextual Ligatures" },
+ { T("cpsp"), "Capital Spacing" },
+ { T("cswh"), "Contextual Swash" },
+ { T("curs"), "Cursive Positioning" },
+ { T("dist"), "Distances" },
+ { T("dlig"), "Discretionary Ligatures" },
+ { T("dnom"), "Denominators" },
+ { T("expt"), "Expert Forms" },
+ { T("falt"), "Final Glyph on Line Alternates" },
+ { T("fin2"), "Terminal Forms #2" },
+ { T("fin3"), "Terminal Forms #3" },
+ { T("fina"), "Terminal Forms" },
+ { T("frac"), "Fractions" },
+ { T("fwid"), "Full Widths" },
+ { T("half"), "Half Forms" },
+ { T("haln"), "Halant Forms" },
+ { T("halt"), "Alternate Half Widths" },
+ { T("hist"), "Historical Forms" },
+ { T("hkna"), "Horizontal Kana Alternates" },
+ { T("hlig"), "Historical Ligatures" },
+ { T("hngl"), "Hangul" },
+ { T("hwid"), "Half Widths" },
+ { T("init"), "Initial Forms" },
+ { T("isol"), "Isolated Forms" },
+ { T("ital"), "Italics" },
+ { T("jalt"), "Justification Alternates" },
+ { T("jp78"), "JIS78 Forms" },
+ { T("jp83"), "JIS83 Forms" },
+ { T("jp90"), "JIS90 Forms" },
+ { T("kern"), "Kerning" },
+ { T("lfbd"), "Left Bounds" },
+ { T("liga"), "Standard Ligatures" },
+ { T("ljmo"), "Leading Jamo Forms" },
+ { T("lnum"), "Lining Figures" },
+ { T("locl"), "Localized Forms" },
+ { T("mark"), "Mark Positioning" },
+ { T("med2"), "Medial Forms #2" },
+ { T("medi"), "Medial Forms" },
+ { T("mgrk"), "Mathematical Greek" },
+ { T("mkmk"), "Mark to Mark Positioning" },
+ { T("mset"), "Mark Positioning via Substitution" },
+ { T("nalt"), "Alternate Annotation Forms" },
+ { T("nlck"), "NLC Kanji Forms" },
+ { T("nukt"), "Nukta Forms" },
+ { T("numr"), "Numerators" },
+ { T("onum"), "Oldstyle Figures" },
+ { T("opbd"), "Optical Bounds" },
+ { T("ordn"), "Ordinals" },
+ { T("ornm"), "Ornaments" },
+ { T("palt"), "Proportional Alternate Widths" },
+ { T("pcap"), "Petite Capitals" },
+ { T("pnum"), "Proportional Figures" },
+ { T("pref"), "Pre-Base Forms" },
+ { T("pres"), "Pre-base Substitutions" },
+ { T("pstf"), "Post-base Forms" },
+ { T("psts"), "Post-base Substitutions" },
+ { T("pwid"), "Proportional Widths" },
+ { T("qwid"), "Quarter Widths" },
+ { T("rand"), "Randomize" },
+ { T("rlig"), "Required Ligatures" },
+ { T("rphf"), "Reph Forms" },
+ { T("rtbd"), "Right Bounds" },
+ { T("rtla"), "Right-to-left Alternates" },
+ { T("ruby"), "Ruby Notation Forms" },
+ { T("salt"), "Stylistic Alternates" },
+ { T("sinf"), "Scientific Inferiors" },
+ { T("size"), "Optical Size" },
+ { T("smcp"), "Small Capitals" },
+ { T("smpl"), "Simplified Forms" },
+ { T("ss01"), "Stylistic Set 1" },
+ { T("ss02"), "Stylistic Set 2" },
+ { T("ss03"), "Stylistic Set 3" },
+ { T("ss04"), "Stylistic Set 4" },
+ { T("ss05"), "Stylistic Set 5" },
+ { T("ss06"), "Stylistic Set 6" },
+ { T("ss07"), "Stylistic Set 7" },
+ { T("ss08"), "Stylistic Set 8" },
+ { T("ss09"), "Stylistic Set 9" },
+ { T("ss10"), "Stylistic Set 10" },
+ { T("ss11"), "Stylistic Set 11" },
+ { T("ss12"), "Stylistic Set 12" },
+ { T("ss13"), "Stylistic Set 13" },
+ { T("ss14"), "Stylistic Set 14" },
+ { T("ss15"), "Stylistic Set 15" },
+ { T("ss16"), "Stylistic Set 16" },
+ { T("ss17"), "Stylistic Set 17" },
+ { T("ss18"), "Stylistic Set 18" },
+ { T("ss19"), "Stylistic Set 19" },
+ { T("ss20"), "Stylistic Set 20" },
+ { T("subs"), "Subscript" },
+ { T("sups"), "Superscript" },
+ { T("swsh"), "Swash" },
+ { T("titl"), "Titling" },
+ { T("tjmo"), "Trailing Jamo Forms" },
+ { T("tnam"), "Traditional Name Forms" },
+ { T("tnum"), "Tabular Figures" },
+ { T("trad"), "Traditional Forms" },
+ { T("twid"), "Third Widths" },
+ { T("unic"), "Unicase" },
+ { T("valt"), "Alternate Vertical Metrics" },
+ { T("vatu"), "Vattu Variants" },
+ { T("vert"), "Vertical Writing" },
+ { T("vhal"), "Alternate Vertical Half Metrics" },
+ { T("vjmo"), "Vowel Jamo Forms" },
+ { T("vkna"), "Vertical Kana Alternates" },
+ { T("vkrn"), "Vertical Kerning" },
+ { T("vpal"), "Proportional Alternate Vertical Metrics" },
+ { T("vrt2"), "Vertical Alternates and Rotation" },
+ { T("zero"), "Slashed Zero" }
+};
+
+namespace Efont { namespace OpenType {
+
+static const char *
+find_description(uint32_t tag, const Mapping *maps, int n)
+{
+ // should use STL...
+ int l = 0, r = n - 1;
+ while (l <= r) {
+ int m = (l + r) / 2;
+ if (maps[m].tag < tag)
+ l = m + 1;
+ else if (maps[m].tag == tag)
+ return maps[m].description;
+ else
+ r = m - 1;
+ }
+ return 0;
+}
+
+const char *
+Tag::script_description() const
+{
+ return find_description(value(), scripts, sizeof(scripts) / sizeof(Mapping));
+}
+
+const char *
+Tag::language_description() const
+{
+ return find_description(value(), languages, sizeof(languages) / sizeof(Mapping));
+}
+
+const char *
+Tag::feature_description() const
+{
+ return find_description(value(), features, sizeof(features) / sizeof(Mapping));
+}
+
+}}
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfgpos.cc b/Build/source/utils/lcdf-typetools/libefont/otfgpos.cc
new file mode 100644
index 00000000000..9940d0190ad
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfgpos.cc
@@ -0,0 +1,295 @@
+// -*- related-file-name: "../include/efont/otfgpos.hh" -*-
+
+/* otfgpos.{cc,hh} -- OpenType GPOS table
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfgpos.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+
+/**************************
+ * Gpos *
+ * *
+ **************************/
+
+Gpos::Gpos(const Data &d, ErrorHandler *errh) throw (Error)
+{
+ // Fixed Version
+ // Offset ScriptList
+ // Offset FeatureList
+ // Offset LookupList
+ if (d.length() == 0)
+ throw BlankTable("GPOS");
+ if (d.u16(0) != 1)
+ throw Format("GPOS");
+ if (_script_list.assign(d.offset_subtable(4), errh) < 0)
+ throw Format("GPOS script list");
+ if (_feature_list.assign(d.offset_subtable(6), errh) < 0)
+ throw Format("GPOS feature list");
+ _lookup_list = d.offset_subtable(8);
+}
+
+int
+Gpos::nlookups() const
+{
+ return _lookup_list.u16(0);
+}
+
+GposLookup
+Gpos::lookup(unsigned i) const
+{
+ if (i >= _lookup_list.u16(0))
+ throw Error("GPOS lookup out of range");
+ else
+ return GposLookup(_lookup_list.offset_subtable(2 + i*2));
+}
+
+
+/**************************
+ * GposValue *
+ * *
+ **************************/
+
+const int GposValue::nibble_bitcount_x2[] = { 0, 2, 2, 4, 2, 4, 4, 6,
+ 2, 4, 4, 6, 4, 6, 6, 8 };
+
+
+/**************************
+ * GposLookup *
+ * *
+ **************************/
+
+GposLookup::GposLookup(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d.length() < 6)
+ throw Format("GPOS Lookup table");
+}
+
+bool
+GposLookup::unparse_automatics(Vector<Positioning> &v) const
+{
+ int n = _d.u16(4);
+ switch (_d.u16(0)) {
+ case L_SINGLE:
+ for (int i = 0; i < n; i++)
+ GposSingle(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(v);
+ return true;
+ case L_PAIR:
+ for (int i = 0; i < n; i++)
+ GposPair(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(v);
+ return true;
+ default:
+ return false;
+ }
+}
+
+
+/**************************
+ * GposSingle *
+ * *
+ **************************/
+
+GposSingle::GposSingle(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || (_d[1] != 1 && _d[1] != 2))
+ throw Format("GPOS Single Positioning");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || (_d[1] == 2 && coverage.size() > _d.u16(6)))
+ throw Format("GPOS Single Positioning coverage");
+}
+
+Coverage
+GposSingle::coverage() const throw ()
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+void
+GposSingle::unparse(Vector<Positioning> &v) const
+{
+ if (_d[1] == 1) {
+ int format = _d.u16(4);
+ Data value = _d.subtable(6);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ v.push_back(Positioning(Position(*i, format, value)));
+ } else {
+ int format = _d.u16(4);
+ int size = GposValue::size(format);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ v.push_back(Positioning(Position(*i, format, _d.subtable(F2_HEADERSIZE + size*i.coverage_index()))));
+ }
+}
+
+
+/**************************
+ * GposPair *
+ * *
+ **************************/
+
+GposPair::GposPair(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || (_d[1] != 1 && _d[1] != 2))
+ throw Format("GPOS Pair Positioning");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || (_d[1] == 1 && coverage.size() > _d.u16(8)))
+ throw Format("GPOS Pair Positioning coverage");
+}
+
+Coverage
+GposPair::coverage() const throw ()
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+void
+GposPair::unparse(Vector<Positioning> &v) const
+{
+ if (_d[1] == 1) {
+ int format1 = _d.u16(4);
+ int format2 = _d.u16(6);
+ int f2_pos = PAIRVALUE_HEADERSIZE + GposValue::size(format1);
+ int pairvalue_size = f2_pos + GposValue::size(format2);
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data pairset = _d.offset_subtable(F1_HEADERSIZE + i.coverage_index()*F1_RECSIZE);
+ int npair = pairset.u16(0);
+ for (int j = 0; j < npair; j++) {
+ Data pair = pairset.subtable(PAIRSET_HEADERSIZE + j*pairvalue_size);
+ v.push_back(Positioning(Position(*i, format1, pair.subtable(PAIRVALUE_HEADERSIZE)),
+ Position(pair.u16(0), format2, pair.subtable(f2_pos))));
+ }
+ }
+ } else { // _d[1] == 2
+ int format1 = _d.u16(4);
+ int format2 = _d.u16(6);
+ int f2_pos = GposValue::size(format1);
+ int recsize = f2_pos + GposValue::size(format2);
+ ClassDef class1(_d.offset_subtable(8));
+ ClassDef class2(_d.offset_subtable(10));
+ Coverage coverage = this->coverage();
+ int nclass1 = _d.u16(12);
+ int nclass2 = _d.u16(14);
+ int offset = F2_HEADERSIZE;
+ for (int c1 = 0; c1 < nclass1; c1++)
+ for (int c2 = 0; c2 < nclass2; c2++, offset += recsize) {
+ Position p1(format1, _d.subtable(offset));
+ Position p2(format2, _d.subtable(offset + f2_pos));
+ if (p1 || p2) {
+ for (ClassDef::class_iterator c1i = class1.begin(c1, coverage); c1i; c1i++)
+ for (ClassDef::class_iterator c2i = class2.begin(c2); c2i; c2i++)
+ v.push_back(Positioning(Position(*c1i, p1), Position(*c2i, p2)));
+ }
+ }
+ }
+}
+
+
+/**************************
+ * Positioning *
+ * *
+ **************************/
+
+static void
+unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns)
+{
+ if (!gns)
+ gns = &debug_glyph_names;
+ if (gid && gns && gns->size() > gid && (*gns)[gid])
+ sa << (*gns)[gid];
+ else
+ sa << "g" << gid;
+}
+
+void
+Position::unparse(StringAccum &sa, const Vector<PermString> *gns) const
+{
+ unparse_glyphid(sa, g, gns);
+ if (placed())
+ sa << '@' << pdx << ',' << pdy;
+ sa << '+' << adx;
+ if (ady)
+ sa << '/' << ady;
+}
+
+String
+Position::unparse(const Vector<PermString> *gns) const
+{
+ StringAccum sa;
+ unparse(sa, gns);
+ return sa.take_string();
+}
+
+bool
+Positioning::context_in(const Coverage &c) const
+{
+ return (c.covers(_left.g) || !_left.g) && (!_right.g || c.covers(_right.g));
+}
+
+bool
+Positioning::context_in(const GlyphSet &gs) const
+{
+ return (gs.covers(_left.g) || !_left.g) && (!_right.g || gs.covers(_right.g));
+}
+
+void
+Positioning::unparse(StringAccum &sa, const Vector<PermString> *gns) const
+{
+ if (!*this)
+ sa << "NULL[]";
+ else if (is_single()) {
+ sa << "SINGLE[";
+ _left.unparse(sa, gns);
+ sa << ']';
+ } else if (is_pairkern()) {
+ sa << "KERN[";
+ unparse_glyphid(sa, _left.g, gns);
+ sa << ' ';
+ unparse_glyphid(sa, _right.g, gns);
+ sa << "+" << _left.adx << ']';
+ } else if (is_pair()) {
+ sa << "PAIR[";
+ _left.unparse(sa, gns);
+ sa << ' ';
+ _right.unparse(sa, gns);
+ sa << ']';
+ } else
+ sa << "UNKNOWN[]";
+}
+
+String
+Positioning::unparse(const Vector<PermString> *gns) const
+{
+ StringAccum sa;
+ unparse(sa, gns);
+ return sa.take_string();
+}
+
+}}
+
+#include <lcdf/vector.cc>
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfgsub.cc b/Build/source/utils/lcdf-typetools/libefont/otfgsub.cc
new file mode 100644
index 00000000000..09edc97f481
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfgsub.cc
@@ -0,0 +1,1139 @@
+// -*- related-file-name: "../include/efont/otfgsub.hh" -*-
+
+/* otfgsub.{cc,hh} -- OpenType GSUB table
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfgsub.hh>
+#include <efont/otfname.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+void
+Substitution::clear(Substitute &s, uint8_t &t)
+{
+ switch (t) {
+ case T_GLYPHS:
+ delete[] s.gids;
+ break;
+ case T_COVERAGE:
+ delete s.coverage;
+ break;
+ }
+ t = T_NONE;
+}
+
+void
+Substitution::assign_space(Substitute &s, uint8_t &t, int n)
+{
+ clear(s, t);
+ if (n == 1)
+ t = T_GLYPH;
+ else if (n > 1) {
+ s.gids = new Glyph[n + 1];
+ s.gids[0] = n;
+ t = T_GLYPHS;
+ }
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, Glyph gid)
+{
+ clear(s, t);
+ s.gid = gid;
+ t = T_GLYPH;
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, int ngids, const Glyph *gids)
+{
+ clear(s, t);
+ assert(ngids > 0);
+ if (ngids == 1) {
+ s.gid = gids[0];
+ t = T_GLYPH;
+ } else {
+ s.gids = new Glyph[ngids + 1];
+ s.gids[0] = ngids;
+ memcpy(s.gids + 1, gids, ngids * sizeof(Glyph));
+ t = T_GLYPHS;
+ }
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, const Coverage &coverage)
+{
+ clear(s, t);
+ s.coverage = new Coverage(coverage);
+ t = T_COVERAGE;
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, const Substitute &os, uint8_t ot)
+{
+ if (&s == &os)
+ return;
+ switch (ot) {
+ case T_NONE:
+ clear(s, t);
+ break;
+ case T_GLYPH:
+ assign(s, t, os.gid);
+ break;
+ case T_GLYPHS:
+ assign(s, t, os.gids[0], os.gids + 1);
+ break;
+ case T_COVERAGE:
+ assign(s, t, *os.coverage);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+Substitution::Substitution(const Substitution &o)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_NONE), _right_is(T_NONE),
+ _alternate(o._alternate)
+{
+ assign(_left, _left_is, o._left, o._left_is);
+ assign(_in, _in_is, o._in, o._in_is);
+ assign(_out, _out_is, o._out, o._out_is);
+ assign(_right, _right_is, o._right, o._right_is);
+}
+
+Substitution::Substitution(Glyph in, Glyph out)
+ : _left_is(T_NONE), _in_is(T_GLYPH), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ _in.gid = in;
+ _out.gid = out;
+}
+
+Substitution::Substitution(Glyph in, const Vector<Glyph> &out, bool is_alternate)
+ : _left_is(T_NONE), _in_is(T_GLYPH), _out_is(T_NONE), _right_is(T_NONE),
+ _alternate(is_alternate)
+{
+ assert(out.size() > 0);
+ _in.gid = in;
+ assign(_out, _out_is, out.size(), &out[0]);
+}
+
+Substitution::Substitution(Glyph in1, Glyph in2, Glyph out)
+ : _left_is(T_NONE), _in_is(T_GLYPHS), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ _in.gids = new Glyph[3];
+ _in.gids[0] = 2;
+ _in.gids[1] = in1;
+ _in.gids[2] = in2;
+ _out.gid = out;
+}
+
+Substitution::Substitution(const Vector<Glyph> &in, Glyph out)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ assert(in.size() > 0);
+ assign(_in, _in_is, in.size(), &in[0]);
+ _out.gid = out;
+}
+
+Substitution::Substitution(int nin, const Glyph *in, Glyph out)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ assert(nin > 0);
+ assign(_in, _in_is, nin, in);
+ _out.gid = out;
+}
+
+Substitution::Substitution(int nleft, int nin, int nout, int nright)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_NONE), _right_is(T_NONE)
+{
+ if (nleft)
+ assign_space(_left, _left_is, nleft);
+ if (nin)
+ assign_space(_in, _in_is, nin);
+ if (nout)
+ assign_space(_out, _out_is, nout);
+ if (nright)
+ assign_space(_right, _right_is, nright);
+}
+
+Substitution::~Substitution()
+{
+ clear(_left, _left_is);
+ clear(_in, _in_is);
+ clear(_out, _out_is);
+ clear(_right, _right_is);
+}
+
+Substitution &
+Substitution::operator=(const Substitution &o)
+{
+ assign(_left, _left_is, o._left, o._left_is);
+ assign(_in, _in_is, o._in, o._in_is);
+ assign(_out, _out_is, o._out, o._out_is);
+ assign(_right, _right_is, o._right, o._right_is);
+ _alternate = o._alternate;
+ return *this;
+}
+
+bool
+Substitution::substitute_in(const Substitute &s, uint8_t t, const Coverage &c)
+{
+ switch (t) {
+ case T_NONE:
+ return true;
+ case T_GLYPH:
+ return c.covers(s.gid);
+ case T_GLYPHS:
+ for (int i = 1; i <= s.gids[0]; i++)
+ if (!c.covers(s.gids[i]))
+ return false;
+ return true;
+ case T_COVERAGE:
+ return *s.coverage <= c;
+ default:
+ assert(0);
+ return false;
+ }
+}
+
+bool
+Substitution::substitute_in(const Substitute &s, uint8_t t, const GlyphSet &gs)
+{
+ switch (t) {
+ case T_NONE:
+ return true;
+ case T_GLYPH:
+ return gs.covers(s.gid);
+ case T_GLYPHS:
+ for (int i = 1; i <= s.gids[0]; i++)
+ if (!gs.covers(s.gids[i]))
+ return false;
+ return true;
+ case T_COVERAGE:
+ for (Coverage::iterator i = s.coverage->begin(); i; i++)
+ if (!gs.covers(*i))
+ return false;
+ return true;
+ default:
+ assert(0);
+ return false;
+ }
+}
+
+bool
+Substitution::context_in(const Coverage &c) const
+{
+ return substitute_in(_left, _left_is, c)
+ && substitute_in(_in, _in_is, c)
+ && substitute_in(_right, _right_is, c);
+}
+
+bool
+Substitution::context_in(const GlyphSet &gs) const
+{
+ return substitute_in(_left, _left_is, gs)
+ && substitute_in(_in, _in_is, gs)
+ && substitute_in(_right, _right_is, gs);
+}
+
+Glyph
+Substitution::extract_glyph(const Substitute &s, uint8_t t) throw ()
+{
+ return (t == T_GLYPH ? s.gid : 0);
+}
+
+Glyph
+Substitution::extract_glyph(const Substitute &s, int which, uint8_t t) throw ()
+{
+ switch (t) {
+ case T_GLYPH:
+ return (which == 0 ? s.gid : 0);
+ case T_GLYPHS:
+ return (s.gids[0] > which ? s.gids[which + 1] : 0);
+ case T_COVERAGE:
+ for (Coverage::iterator ci = s.coverage->begin(); ci; ci++, which--)
+ if (which == 0)
+ return *ci;
+ return 0;
+ default:
+ return 0;
+ }
+}
+
+bool
+Substitution::extract_glyphs(const Substitute &s, uint8_t t, Vector<Glyph> &v, bool coverage_ok) throw ()
+{
+ switch (t) {
+ case T_GLYPH:
+ v.push_back(s.gid);
+ return true;
+ case T_GLYPHS:
+ for (int i = 1; i <= s.gids[0]; i++)
+ v.push_back(s.gids[i]);
+ return true;
+ case T_COVERAGE:
+ if (coverage_ok) {
+ for (Coverage::iterator i = s.coverage->begin(); i; i++)
+ v.push_back(*i);
+ return true;
+ } else
+ return false;
+ default:
+ return false;
+ }
+}
+
+Glyph *
+Substitution::extract_glyphptr(const Substitute &s, uint8_t t) throw ()
+{
+ switch (t) {
+ case T_GLYPH:
+ return const_cast<Glyph *>(&s.gid);
+ case T_GLYPHS:
+ return &s.gids[1];
+ default:
+ return 0;
+ }
+}
+
+int
+Substitution::extract_nglyphs(const Substitute &s, uint8_t t, bool coverage_ok) throw ()
+{
+ switch (t) {
+ case T_GLYPH:
+ return 1;
+ case T_GLYPHS:
+ return s.gids[0];
+ case T_COVERAGE:
+ return (coverage_ok ? 1 : 0);
+ default:
+ return 0;
+ }
+}
+
+bool
+Substitution::matches(const Substitute &s, uint8_t t, int pos, Glyph g) throw ()
+{
+ switch (t) {
+ case T_GLYPH:
+ return (pos == 0 && s.gid == g);
+ case T_GLYPHS:
+ return (pos >= 0 && pos < s.gids[0] && s.gids[1 + pos] == g);
+ case T_COVERAGE:
+ return (pos == 0 && s.coverage->covers(g));
+ default:
+ return false;
+ }
+}
+
+bool
+Substitution::is_noop() const
+{
+ return (_in_is == T_GLYPH && _out_is == T_GLYPH && _in.gid == _out.gid)
+ || (_in_is == T_GLYPHS && _out_is == T_GLYPHS
+ && _in.gids[0] == _out.gids[0]
+ && memcmp(_in.gids, _out.gids, (_in.gids[0] + 1) * sizeof(Glyph)) == 0);
+}
+
+bool
+Substitution::all_in_glyphs(Vector<Glyph> &v) const
+{
+ bool ok = true;
+ if (_left_is != T_NONE)
+ ok &= extract_glyphs(_left, _left_is, v, false);
+ ok &= extract_glyphs(_in, _in_is, v, false);
+ if (_right_is != T_NONE)
+ ok &= extract_glyphs(_right, _right_is, v, false);
+ return ok;
+}
+
+bool
+Substitution::all_out_glyphs(Vector<Glyph> &v) const
+{
+ bool ok = true;
+ if (_left_is != T_NONE)
+ ok &= extract_glyphs(_left, _left_is, v, false);
+ ok &= extract_glyphs(_out, _out_is, v, false);
+ if (_right_is != T_NONE)
+ ok &= extract_glyphs(_right, _right_is, v, false);
+ return ok;
+}
+
+void
+Substitution::assign_append(Substitute &s, uint8_t &t, const Substitute &ls, uint8_t lt, const Substitute &rs, uint8_t rt)
+{
+ if (lt == T_NONE)
+ assign(s, t, rs, rt);
+ else if (rt == T_NONE)
+ assign(s, t, ls, lt);
+ else if (lt != T_COVERAGE && rt != T_COVERAGE) {
+ int nl = extract_nglyphs(ls, lt, false);
+ int nr = extract_nglyphs(rs, rt, false);
+ Glyph *gids = new Glyph[nl + nr + 1];
+ gids[0] = nl + nr;
+ memcpy(&gids[1], extract_glyphptr(ls, lt), nl * sizeof(Glyph));
+ memcpy(&gids[1 + nl], extract_glyphptr(rs, rt), nr * sizeof(Glyph));
+ clear(s, t);
+ s.gids = gids;
+ t = T_GLYPHS;
+ } else
+ throw Error();
+}
+
+void
+Substitution::assign_append(Substitute &s, uint8_t &t, const Substitute &ls, uint8_t lt, Glyph rg)
+{
+ Substitute rs;
+ rs.gid = rg;
+ assign_append(s, t, ls, lt, rs, T_GLYPH);
+}
+
+Substitution
+Substitution::in_out_append_glyph(Glyph g) const
+{
+ Substitution s;
+ assign(s._left, s._left_is, _left, _left_is);
+ assign(s._right, s._right_is, _right, _right_is);
+ assign_append(s._in, s._in_is, _in, _in_is, g);
+ assign_append(s._out, s._out_is, _out, _out_is, g);
+ return s;
+}
+
+void
+Substitution::add_outer_left(Glyph g)
+{
+ Substitute ls;
+ ls.gid = g;
+ assign_append(_left, _left_is, ls, T_GLYPH, _left, _left_is);
+}
+
+void
+Substitution::remove_outer_left()
+{
+ if (_left_is == T_GLYPH)
+ _left_is = T_NONE;
+ else if (_left_is == T_GLYPHS) {
+ if (_left.gids[0] == 2)
+ assign(_left, _left_is, _left.gids[2]);
+ else {
+ _left.gids[0]--;
+ memmove(_left.gids + 1, _left.gids + 2, _left.gids[0] * sizeof(Glyph));
+ }
+ }
+}
+
+void
+Substitution::add_outer_right(Glyph g)
+{
+ assign_append(_right, _right_is, _right, _right_is, g);
+}
+
+void
+Substitution::remove_outer_right()
+{
+ if (_right_is == T_GLYPH)
+ _right_is = T_NONE;
+ else if (_right_is == T_GLYPHS) {
+ if (_right.gids[0] == 2)
+ assign(_right, _right_is, _right.gids[1]);
+ else
+ _right.gids[0]--;
+ }
+}
+
+bool
+Substitution::out_alter(const Substitution &o, int pos) throw ()
+{
+ const Glyph *g = out_glyphptr();
+ int ng = out_nglyphs();
+ const Glyph *out_g = o.out_glyphptr();
+ int out_ng = o.out_nglyphs();
+ int in_ng = o.in_nglyphs();
+ if (pos + in_ng > ng || out_ng == 0)
+ return false;
+
+ // check that input substitution actually matches us
+ for (int i = 0; i < in_ng; i++)
+ if (!o.in_matches(i, g[pos+i]))
+ return false;
+
+ // actually change output
+ Vector<Glyph> new_g;
+ for (int i = 0; i < pos; i++)
+ new_g.push_back(g[i]);
+ for (int i = 0; i < out_ng; i++)
+ new_g.push_back(out_g[i]);
+ for (int i = pos + in_ng; i < ng; i++)
+ new_g.push_back(g[i]);
+ assign(_out, _out_is, new_g.size(), &new_g[0]);
+
+ return true;
+}
+
+static void
+unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns) throw ()
+{
+ if (gid > 0 && gns && gns->size() > gid && (*gns)[gid])
+ sa << (*gns)[gid];
+ else
+ sa << "g" << gid;
+}
+
+void
+Substitution::unparse_glyphids(StringAccum &sa, const Substitute &s, uint8_t t, const Vector<PermString> *gns) throw ()
+{
+ if (t == T_GLYPH)
+ unparse_glyphid(sa, s.gid, gns);
+ else if (t == T_GLYPHS) {
+ for (int i = 1; i <= s.gids[0]; i++) {
+ if (i != 1)
+ sa << ' ';
+ unparse_glyphid(sa, s.gids[i], gns);
+ }
+ } else if (t == T_COVERAGE)
+ sa << "<coverage>";
+ else
+ sa << "-";
+}
+
+void
+Substitution::unparse(StringAccum &sa, const Vector<PermString> *gns) const
+{
+ if (!*this)
+ sa << "NULL[]";
+ else {
+ if (is_single())
+ sa << "SINGLE[";
+ else if (is_ligature())
+ sa << "LIGATURE[";
+ else if (is_multiple())
+ sa << "MULTIPLE[";
+ else if (is_alternate())
+ sa << "ALTERNATE[";
+ else if (is_simple_context())
+ sa << "SIMPLECONTEXT[";
+ else
+ sa << "UNKNOWN[";
+
+ if (_left_is != T_NONE) {
+ unparse_glyphids(sa, _left, _left_is, gns);
+ sa << " | ";
+ }
+ unparse_glyphids(sa, _in, _in_is, gns);
+ sa << " => ";
+ unparse_glyphids(sa, _out, _out_is, gns);
+ if (_right_is != T_NONE) {
+ sa << " | ";
+ unparse_glyphids(sa, _right, _right_is, gns);
+ }
+
+ sa << ']';
+ }
+}
+
+String
+Substitution::unparse(const Vector<PermString> *gns) const
+{
+ StringAccum sa;
+ unparse(sa, gns);
+ return sa.take_string();
+}
+
+
+
+/**************************
+ * Gsub *
+ * *
+ **************************/
+
+Gsub::Gsub(const Data &d, const Font *otf, ErrorHandler *errh) throw (Error)
+ : _chaincontext_reverse_backtrack(false)
+{
+ // Fixed Version
+ // Offset ScriptList
+ // Offset FeatureList
+ // Offset LookupList
+ if (d.length() == 0)
+ throw BlankTable("GSUB");
+ if (d.u16(0) != 1)
+ throw Format("GSUB");
+ if (_script_list.assign(d.offset_subtable(4), errh) < 0)
+ throw Format("GSUB script list");
+ if (_feature_list.assign(d.offset_subtable(6), errh) < 0)
+ throw Format("GSUB feature list");
+ _lookup_list = d.offset_subtable(8);
+
+ if (!otf)
+ return;
+
+ // Check for "correct" chaining context rules, as suggested by Adobe's
+ // OpenType FDK
+ try {
+ Name nametable(otf->table("name"), ErrorHandler::silent_handler());
+ String vstr = nametable.name(std::find_if(nametable.begin(), nametable.end(), Name::PlatformPred(Name::N_VERSION, 1, 0, 0)));
+ const char *v = vstr.begin(), *endv = vstr.end();
+ if (v + 20 <= endv) {
+ if (v[0] != 'O' || v[1] != 'T' || v[2] != 'F' || v[3] == ';')
+ goto try_core;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 3 >= endv || v[1] != 'P' || v[2] != 'S' || v[3] == ';')
+ goto try_core;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 11 >= endv || memcmp(v + 1, "Core 1.0.", 9) != 0
+ || (v[10] != '2' && v[10] != '3')
+ || (v[11] < '0' || v[11] > '9'))
+ goto try_core;
+ _chaincontext_reverse_backtrack = true;
+ }
+ try_core:
+ v = vstr.begin();
+ if (v + 16 <= endv) {
+ if (v[0] != 'C' || v[1] != 'o' || v[2] != 'r' || v[3] != 'e')
+ goto done;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 12 > endv || memcmp(v, ";makeotf.lib", 12) != 0)
+ goto done;
+ _chaincontext_reverse_backtrack = true;
+ }
+ done: ;
+ } catch (Error) {
+ }
+}
+
+int
+Gsub::nlookups() const
+{
+ return _lookup_list.u16(0);
+}
+
+GsubLookup
+Gsub::lookup(unsigned i) const
+{
+ if (i >= _lookup_list.u16(0))
+ throw Error("GSUB lookup out of range");
+ else
+ return GsubLookup(_lookup_list.offset_subtable(2 + i*2));
+}
+
+
+/**************************
+ * GsubLookup *
+ * *
+ **************************/
+
+GsubLookup::GsubLookup(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d.length() < 6)
+ throw Format("GSUB Lookup table");
+}
+
+bool
+GsubLookup::unparse_automatics(const Gsub &gsub, Vector<Substitution> &v) const
+{
+ int nlookup = _d.u16(4);
+ switch (_d.u16(0)) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++)
+ GsubSingle(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(v);
+ return true;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++)
+ GsubMultiple(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(v);
+ return true;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++)
+ GsubMultiple(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(v, true);
+ return true;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++)
+ GsubLigature(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(v);
+ return true;
+ case L_CONTEXT: {
+ bool understood = true;
+ for (int i = 0; i < nlookup; i++)
+ understood &= GsubContext(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(gsub, v);
+ return understood;
+ }
+ case L_CHAIN: {
+ bool understood = true;
+ for (int i = 0; i < nlookup; i++)
+ understood &= GsubChainContext(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).unparse(gsub, v);
+ return understood;
+ }
+ default:
+ return false;
+ }
+}
+
+bool
+GsubLookup::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int nlookup = _d.u16(4);
+ switch (_d.u16(0)) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++)
+ if (GsubSingle(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).apply(g, pos, n, s))
+ return true;
+ return false;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++)
+ if (GsubMultiple(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).apply(g, pos, n, s))
+ return true;
+ return false;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++)
+ if (GsubMultiple(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).apply(g, pos, n, s, true))
+ return true;
+ return false;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++)
+ if (GsubLigature(_d.offset_subtable(HEADERSIZE + i*RECSIZE)).apply(g, pos, n, s))
+ return true;
+ return false;
+ default: // XXX
+ return false;
+ }
+}
+
+
+/**************************
+ * GsubSingle *
+ * *
+ **************************/
+
+GsubSingle::GsubSingle(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || (_d[1] != 1 && _d[1] != 2))
+ throw Format("GSUB Single Substitution");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || (_d[1] == 2 && coverage.size() > _d.u16(4)))
+ throw Format("GSUB Single Substitution coverage");
+}
+
+Coverage
+GsubSingle::coverage() const throw ()
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+Glyph
+GsubSingle::map(Glyph g) const
+{
+ int ci = coverage().coverage_index(g);
+ if (ci < 0)
+ return g;
+ else if (_d[1] == 1)
+ return g + _d.s16(4);
+ else
+ return _d.u16(HEADERSIZE + FORMAT2_RECSIZE*ci);
+}
+
+void
+GsubSingle::unparse(Vector<Substitution> &v) const
+{
+ if (_d[1] == 1) {
+ int delta = _d.s16(4);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ v.push_back(Substitution(*i, *i + delta));
+ } else {
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ v.push_back(Substitution(*i, _d.u16(HEADERSIZE + i.coverage_index()*FORMAT2_RECSIZE)));
+ }
+}
+
+bool
+GsubSingle::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int ci;
+ if (pos < n && (ci = coverage().coverage_index(g[pos])) >= 0) {
+ if (_d[1] == 1)
+ s = Substitution(g[pos], g[pos] + _d.s16(4));
+ else
+ s = Substitution(g[pos], _d.u16(HEADERSIZE + ci*FORMAT2_RECSIZE));
+ return true;
+ } else
+ return false;
+}
+
+
+/**************************
+ * GsubMultiple *
+ * *
+ **************************/
+
+GsubMultiple::GsubMultiple(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d[0] != 0 || _d[1] != 1)
+ throw Format("GSUB Multiple Substitution");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || coverage.size() > _d.u16(4))
+ throw Format("GSUB Multiple Substitution coverage");
+}
+
+Coverage
+GsubMultiple::coverage() const throw ()
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+bool
+GsubMultiple::map(Glyph g, Vector<Glyph> &v) const
+{
+ v.clear();
+ int ci = coverage().coverage_index(g);
+ if (ci < 0) {
+ v.push_back(g);
+ return false;
+ } else {
+ Data seq = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ for (int i = 0; i < seq.u16(0); i++)
+ v.push_back(seq.u16(SEQ_HEADERSIZE + i*SEQ_RECSIZE));
+ return true;
+ }
+}
+
+void
+GsubMultiple::unparse(Vector<Substitution> &v, bool is_alternate) const
+{
+ Vector<Glyph> result;
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data seq = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ result.clear();
+ for (int j = 0; j < seq.u16(0); j++)
+ result.push_back(seq.u16(SEQ_HEADERSIZE + j*SEQ_RECSIZE));
+ v.push_back(Substitution(*i, result, is_alternate));
+ }
+}
+
+bool
+GsubMultiple::apply(const Glyph *g, int pos, int n, Substitution &s, bool is_alternate) const
+{
+ int ci;
+ if (pos < n && (ci = coverage().coverage_index(g[pos])) >= 0) {
+ Vector<Glyph> result;
+ Data seq = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ for (int j = 0; j < seq.u16(0); j++)
+ result.push_back(seq.u16(SEQ_HEADERSIZE + j*SEQ_RECSIZE));
+ s = Substitution(g[pos], result, is_alternate);
+ return true;
+ } else
+ return false;
+}
+
+
+/**************************
+ * GsubLigature *
+ * *
+ **************************/
+
+GsubLigature::GsubLigature(const Data &d) throw (Error)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || _d[1] != 1)
+ throw Format("GSUB Ligature Substitution");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || coverage.size() > _d.u16(4))
+ throw Format("GSUB Ligature Substitution coverage");
+}
+
+Coverage
+GsubLigature::coverage() const throw ()
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+bool
+GsubLigature::map(const Vector<Glyph> &gs, Glyph &result, int &consumed) const
+{
+ assert(gs.size() > 0);
+ result = gs[0];
+ consumed = 1;
+ int ci = coverage().coverage_index(gs[0]);
+ if (ci < 0)
+ return false;
+ Data ligset = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ int nligset = ligset.u16(0);
+ for (int i = 0; i < nligset; i++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + i*SET_RECSIZE);
+ int nlig = lig.u16(2);
+ if (nlig > gs.size() - 1)
+ goto bad;
+ for (int j = 0; j < nlig - 1; j++)
+ if (lig.u16(LIG_HEADERSIZE + j*LIG_RECSIZE) != gs[j + 1])
+ goto bad;
+ result = lig.u16(0);
+ consumed = nlig + 1;
+ return true;
+ bad: ;
+ }
+ return false;
+}
+
+void
+GsubLigature::unparse(Vector<Substitution> &v) const
+{
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data ligset = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ int nligset = ligset.u16(0);
+ Vector<Glyph> components(1, *i);
+ for (int j = 0; j < nligset; j++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + j*SET_RECSIZE);
+ int nlig = lig.u16(2);
+ components.resize(1);
+ for (int k = 0; k < nlig - 1; k++)
+ components.push_back(lig.u16(LIG_HEADERSIZE + k*LIG_RECSIZE));
+ v.push_back(Substitution(components, lig.u16(0)));
+ }
+ }
+}
+
+bool
+GsubLigature::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int ci;
+ if (pos < n && (ci = coverage().coverage_index(g[pos])) >= 0) {
+ Data ligset = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ int nligset = ligset.u16(0);
+ for (int j = 0; j < nligset; j++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + j*SET_RECSIZE);
+ int nlig = lig.u16(2);
+ if (pos + nlig <= n) {
+ for (int k = 0; k < nlig - 1; k++)
+ if (lig.u16(LIG_HEADERSIZE + k*LIG_RECSIZE) != g[pos + k + 1])
+ goto ligature_failed;
+ s = Substitution(nlig, &g[pos], lig.u16(0));
+ return true;
+ }
+ ligature_failed: ;
+ }
+ }
+ return false;
+}
+
+
+/**************************
+ * GsubContext *
+ * *
+ **************************/
+
+GsubContext::GsubContext(const Data &d) throw (Error)
+ : _d(d)
+{
+ switch (_d.u16(0)) {
+ case 1:
+ case 2:
+ break;
+ case 3: {
+ int ninput = _d.u16(2);
+ if (ninput < 1)
+ throw Format("GSUB Context Substitution input sequence");
+ Coverage coverage(_d.offset_subtable(F3_HSIZE));
+ if (!coverage.ok())
+ throw Format("GSUB Context Substitution coverage");
+ break;
+ }
+ default:
+ throw Format("GSUB Context Substitution");
+ }
+}
+
+Coverage
+GsubContext::coverage() const throw ()
+{
+ if (_d[1] == 3)
+ return Coverage(_d.offset_subtable(F3_HSIZE), 0, false);
+ else
+ return Coverage();
+}
+
+bool
+GsubContext::f3_unparse(const Data &data, int nglyph, int glyphtab_offset, int nsub, int subtab_offset, const Gsub &gsub, Vector<Substitution> &outsubs, const Substitution &prototype_sub)
+{
+ Vector<Substitution> subs;
+ subs.push_back(prototype_sub);
+ Vector<Substitution> work_subs;
+
+ // get array of possible substitutions including contexts
+ for (int i = 0; i < nglyph; i++) {
+ assert(!work_subs.size());
+ Coverage c(data.offset_subtable(glyphtab_offset + i*2));
+ for (Coverage::iterator ci = c.begin(); ci; ci++)
+ for (int j = 0; j < subs.size(); j++)
+ work_subs.push_back(subs[j].in_out_append_glyph(*ci));
+ subs.clear();
+ subs.swap(work_subs);
+ }
+
+ // now, apply referred lookups to the resulting substitution array
+ Vector<Glyph> in_glyphs;
+ Vector<int> pos_map;
+ Substitution subtab_sub;
+ for (int i = 0; i < subs.size(); i++) {
+ Substitution &s = subs[i];
+ int napplied = 0;
+ for (int j = 0; j < nsub; j++) {
+ int seq_index = data.u16(subtab_offset + SUBRECSIZE*j);
+ int lookup_index = data.u16(subtab_offset + SUBRECSIZE*j + 2);
+ // XXX check seq_index against size of output glyphs?
+ if (gsub.lookup(lookup_index).apply(s.out_glyphptr(), seq_index, s.out_nglyphs(), subtab_sub)) {
+ napplied++;
+ s.out_alter(subtab_sub, seq_index);
+ }
+ }
+ // 26.Jun.2003 -- always push substitution back, since the no-op might
+ // override a following substitution
+ outsubs.push_back(s);
+ }
+
+ return true; // XXX
+}
+
+bool
+GsubContext::unparse(const Gsub &gsub, Vector<Substitution> &v) const
+{
+ if (_d.u16(0) != 3) // XXX
+ return false;
+ int nglyph = _d.u16(2);
+ int nsubst = _d.u16(4);
+ return f3_unparse(_d, nglyph, F3_HSIZE, nsubst, F3_HSIZE + nglyph*2, gsub, v, Substitution());
+}
+
+
+/**************************
+ * GsubChainContext *
+ * *
+ **************************/
+
+GsubChainContext::GsubChainContext(const Data &d) throw (Error)
+ : _d(d)
+{
+ switch (_d.u16(0)) {
+ case 1:
+ case 2:
+ break;
+ case 3: {
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ if (ninput < 1)
+ throw Format("GSUB ChainContext Substitution input sequence");
+ Coverage coverage(_d.offset_subtable(input_offset + F3_INPUT_HSIZE));
+ if (!coverage.ok())
+ throw Format("GSUB ChainContext Substitution coverage");
+ break;
+ }
+ default:
+ throw Format("GSUB ChainContext Substitution");
+ }
+}
+
+Coverage
+GsubChainContext::coverage() const throw ()
+{
+ if (_d.u16(0) != 3)
+ return Coverage();
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ return Coverage(_d.offset_subtable(input_offset + F3_INPUT_HSIZE), 0, false);
+}
+
+bool
+GsubChainContext::unparse(const Gsub &gsub, Vector<Substitution> &v) const
+{
+ if (_d.u16(0) != 3)
+ return false;
+
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ int lookahead_offset = input_offset + F3_INPUT_HSIZE + ninput*2;
+ int nlookahead = _d.u16(lookahead_offset);
+ int subst_offset = lookahead_offset + F3_LOOKAHEAD_HSIZE + nlookahead*2;
+ int nsubst = _d.u16(subst_offset);
+
+ Vector<Coverage> backtrackc;
+ Vector<Coverage> lookaheadc;
+ if (gsub.chaincontext_reverse_backtrack()) {
+ for (int i = 0; i < nbacktrack; i++)
+ backtrackc.push_back(Coverage(_d.offset_subtable(F3_HSIZE + i*2)));
+ } else {
+ for (int i = nbacktrack - 1; i >= 0; i--)
+ backtrackc.push_back(Coverage(_d.offset_subtable(F3_HSIZE + i*2)));
+ }
+ for (int i = 0; i < nlookahead; i++)
+ lookaheadc.push_back(Coverage(_d.offset_subtable(lookahead_offset + F3_LOOKAHEAD_HSIZE + i*2)));
+
+ Vector<Coverage::iterator> backtracki;
+ Vector<Coverage::iterator> lookaheadi;
+ for (int i = 0; i < nbacktrack; i++)
+ backtracki.push_back(backtrackc[i].begin());
+ for (int i = 0; i < nlookahead; i++)
+ lookaheadi.push_back(lookaheadc[i].begin());
+
+ bool any = false;
+
+ while (1) {
+
+ // run GsubContext
+ Substitution s(nbacktrack, 0, 0, nlookahead);
+ Glyph *left_begin = s.left_glyphptr();
+ for (int i = 0; i < nbacktrack; i++)
+ left_begin[i] = *backtracki[i];
+ Glyph *right_begin = s.right_glyphptr();
+ for (int i = 0; i < nlookahead; i++)
+ right_begin[i] = *lookaheadi[i];
+
+ any |= GsubContext::f3_unparse(_d, ninput, input_offset + F3_INPUT_HSIZE, nsubst, subst_offset + F3_SUBST_HSIZE, gsub, v, s);
+
+ // step iterators
+ for (int i = nlookahead - 1; i >= 0; i--) {
+ lookaheadi[i]++;
+ if (lookaheadi[i])
+ goto next;
+ lookaheadi[i] = lookaheadc[i].begin();
+ }
+ for (int i = nbacktrack - 1; i >= 0; i--) {
+ backtracki[i]++;
+ if (backtracki[i])
+ goto next;
+ backtracki[i] = backtrackc[i].begin();
+ }
+ break;
+
+ next: ;
+ }
+
+ return any;
+}
+
+
+}}
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfname.cc b/Build/source/utils/lcdf-typetools/libefont/otfname.cc
new file mode 100644
index 00000000000..d836c41de2b
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfname.cc
@@ -0,0 +1,67 @@
+// -*- related-file-name: "../include/efont/otfname.hh" -*-
+
+/* otfname.{cc,hh} -- OpenType name table
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfname.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define USHORT_AT(d) (ntohs(*(const uint16_t *)(d)))
+
+namespace Efont { namespace OpenType {
+
+Name::Name(const String &s, ErrorHandler *errh)
+ : _str(s)
+{
+ _str.align(2);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Name::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT version
+ // USHORT numTables
+ int len = _str.length();
+ const uint8_t *data = _str.udata();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF name too small for header"), -EFAULT;
+ if (!(data[0] == '\000' && data[1] == '\000'))
+ return errh->error("bad name version number"), -ERANGE;
+ int count = USHORT_AT(data + 2);
+ if (HEADER_SIZE + count*NAMEREC_SIZE > len)
+ return errh->error("OTF name too small for header"), -EFAULT;
+ return 0;
+}
+
+String
+Name::name(const_iterator i) const
+{
+ if (i < end()) {
+ int stringOffset = USHORT_AT(_str.data() + 4);
+ int length = USHORT_AT(reinterpret_cast<const uint8_t *>(i) + 8);
+ int offset = USHORT_AT(reinterpret_cast<const uint8_t *>(i) + 10);
+ if (stringOffset + offset + length <= _str.length())
+ return _str.substring(stringOffset + offset, length);
+ }
+ return String();
+}
+
+}}
diff --git a/Build/source/utils/lcdf-typetools/libefont/otfos2.cc b/Build/source/utils/lcdf-typetools/libefont/otfos2.cc
new file mode 100644
index 00000000000..4c9778d7f07
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/otfos2.cc
@@ -0,0 +1,48 @@
+// -*- related-file-name: "../include/efont/otfos2.hh" -*-
+
+/* otfos2.{cc,hh} -- OpenType OS/2 table
+ *
+ * Copyright (c) 2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfos2.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+namespace Efont { namespace OpenType {
+
+Os2::Os2(const Data &data, ErrorHandler *errh)
+ : _data(data)
+{
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+ if (_error < 0)
+ _data = Data();
+}
+
+int
+Os2::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT version
+ // USHORT numTables
+ if (HEADER_SIZE > _data.length())
+ return errh->error("OTF OS/2 too small for header"), -EFAULT;
+ if (_data.u16(0) > 3)
+ return errh->error("bad OS/2 version number"), -ERANGE;
+ return 0;
+}
+
+}}
diff --git a/Build/source/utils/lcdf-typetools/libefont/pairop.cc b/Build/source/utils/lcdf-typetools/libefont/pairop.cc
new file mode 100644
index 00000000000..3c167026b6d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/pairop.cc
@@ -0,0 +1,153 @@
+// -*- related-file-name: "../include/efont/pairop.hh" -*-
+
+/* pairop.{cc,hh} -- ligature/kern font metrics
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/pairop.hh>
+#include <stdio.h>
+namespace Efont {
+
+PairProgram::PairProgram(const PairProgram &o)
+ : _reversed(o._reversed),
+ _left_map(o._left_map),
+ _op(o._op)
+{
+}
+
+
+void
+PairProgram::reserve_glyphs(int e)
+{
+ if (e <= _left_map.size()) return;
+ _left_map.resize(e, -1);
+}
+
+
+PairOpIndex
+PairProgram::find(GlyphIndex leftgi, GlyphIndex rightgi) const
+{
+ PairOpIndex opi = find_left(leftgi);
+ while (opi >= 0) {
+ if (op(opi).right() == rightgi)
+ return opi;
+ opi = op(opi).next_left();
+ }
+ return -1;
+}
+
+
+bool
+PairProgram::add_kern(GlyphIndex left, GlyphIndex right, int ki)
+{
+ PairOp newop(left, right, ki, _left_map[left]);
+ int newopi = _op.size();
+ _op.push_back(newop);
+ _left_map[left] = newopi;
+
+ //PairOpIndex duplicate = map[newop];
+ //map.add(newop, newopi);
+
+ return false;
+}
+
+
+bool
+PairProgram::add_lig(GlyphIndex left, GlyphIndex right, GlyphIndex result,
+ int kind)
+{
+ PairOp newop(left, right, result, kind, _left_map[left]);
+ int newopi = _op.size();
+ _op.push_back(newop);
+ _left_map[left] = newopi;
+
+ //PairOpIndex duplicate = map[newop];
+ //map.add(newop, newopi);
+
+ return false;
+}
+
+
+void
+PairProgram::unreverse()
+{
+ if (!_reversed) return;
+
+ _left_map.assign(_left_map.size(), -1);
+
+ for (PairOpIndex opi = _op.size() - 1; opi >= 0; opi--) {
+ PairOp &o = _op[opi];
+ PairOpIndex l = o.left();
+ o.set_next(_left_map[l]);
+ _left_map[l] = opi;
+ }
+
+ _reversed = false;
+}
+
+
+void
+PairProgram::optimize()
+{
+ /* PairOpIndex opi;
+
+ // Get rid of 0-valued kerns.
+ for (opi = 0; opi < opcount(); opi++) {
+ PairOp &o = op(opi);
+ if (o.is_kern() && o.value() == 0)
+ o.noopify();
+ }*/
+}
+
+
+inline const char *
+PairProgram::print_name(GlyphIndex) const
+{
+#if 0
+ if (gi == opAnychar) return "*";
+ else return glyph(gi).name();
+#endif
+ return 0;
+}
+
+
+void
+PairProgram::print() const
+{
+#if 0
+ for (GlyphIndex gi = 0; gi < glyphblock.size(); gi++)
+ if (glyphblock[gi] != -1)
+ printf("%s->B%d ", glyph(gi).name().c_str(), glyphblock[gi]);
+ printf("\n");
+
+ for (int i = 0; i < blocks.size(); i++) {
+ printf("B%-2d: ", i);
+ PairOpBlock &opb = *blocks[i];
+ for (int j = 0; j < opb.size(); j++)
+ if (opb[j].is_lig())
+ printf("%s->%s ", printname(opb[j].right()),
+ printname(opb[j].result()));
+ else if (opb[j].is_kern())
+ printf("%s[%g] ", printname(opb[j].right()), kern(opb[j].value()));
+ else if (opb[j].is_noop())
+ printf(". ");
+ if (blocks[i]->nextblock != -1)
+ printf(" :B%d", blocks[i]->nextblock);
+ printf("\n");
+ }
+#endif
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/psres.cc b/Build/source/utils/lcdf-typetools/libefont/psres.cc
new file mode 100644
index 00000000000..8cef05e6fbe
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/psres.cc
@@ -0,0 +1,422 @@
+// -*- related-file-name: "../include/efont/psres.hh" -*-
+
+/* psres.{cc,hh} -- PSres.upr files
+ *
+ * Copyright (c) 1999-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <lcdf/slurper.hh>
+/* Get the correct functions for directory searching */
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define DIR_NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define DIR_NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif
+#include <string.h>
+namespace Efont {
+
+static String::Initializer initializer;
+static String empty_string;
+
+PsresDatabase::PsresDatabase()
+ : _section_map(0)
+{
+ _sections.push_back((PsresDatabaseSection *)0);
+}
+
+PsresDatabase::~PsresDatabase()
+{
+ for (int i = 1; i < _sections.size(); i++)
+ delete _sections[i];
+}
+
+
+PsresDatabaseSection::PsresDatabaseSection(PermString section_name)
+ : _section_name(section_name), _map(0)
+{
+ _directories.push_back(PermString());
+ _values.push_back(String());
+ _value_escaped.push_back(true);
+}
+
+
+/* read_ps_line - gathers a line in `slurper', returns true if it is a normal
+ line, false on end of file or a separator line (starts with `.'). Handles
+ continuation lines but not backslash escaping. Stores location of first
+ non-backslashed equals sign in `*equals_pos', or -1 if none. */
+
+static bool
+read_psres_line(Slurper &slurper, int *equals_pos)
+{
+ if (equals_pos) *equals_pos = -1;
+
+ char *s = slurper.next_line();
+ if (!s) return false;
+
+ bool is_terminator = s[0] == '.';
+ unsigned len, pos = 0, last_escape = ~0;
+ bool found_eq = false;
+
+ while (true) {
+ len = slurper.cur_line_length();
+ if (len == 0) break;
+
+ // process backslash escapes
+ for (; pos < len - 1; pos++) {
+ if (s[pos] == '\\') {
+ // quote the next character
+ pos++;
+ last_escape = pos;
+ } else if (!found_eq && s[pos] == '=') {
+ // an equals sign: store its position
+ if (equals_pos) *equals_pos = pos;
+ found_eq = true;
+ } else if (s[pos] == '%') {
+ // unescaped '%' is a comment; return immediately after shortening line
+ len = pos;
+ goto done;
+ }
+ }
+
+ // stop processing if not a continuation line
+ if (pos == len || s[pos] != '\\') break;
+
+ slurper.shorten_line(pos);
+ s = slurper.append_next_line();
+ }
+
+ if (pos < len && !found_eq && s[pos] == '=' && equals_pos)
+ *equals_pos = pos;
+
+ done:
+ // eat trailing whitespace, except for the space in `\ ' if it ends the line
+ // -- unless the `\' is the second `\' in a `\\'!
+ for (pos = len; pos > 0 && (s[pos-1] == ' ' || s[pos-1] == '\t'); pos--)
+ /* nada */;
+ if (pos == last_escape)
+ pos++;
+ slurper.shorten_line(pos);
+ return !is_terminator;
+}
+
+/* psres_escape: backslash escaping */
+
+static unsigned
+psres_escape(char *s, unsigned len)
+{
+ unsigned pos = 0, delta = 0;
+ while (pos < len) {
+ if (s[pos] == '\\') pos++, delta++;
+ if (delta) s[pos-delta] = s[pos];
+ pos++;
+ }
+ s[pos-delta] = 0;
+ return len-delta;
+}
+
+void
+PsresDatabaseSection::add_psres_file_section
+ (Slurper &slurper, PermString directory, bool override)
+{
+ int equals_pos;
+ bool first_line = true;
+
+ while (read_psres_line(slurper, &equals_pos)) {
+ char *s = slurper.cur_line();
+
+ // check for a directory line
+ if (first_line) {
+ first_line = false;
+ if (s[0] == '/') {
+ psres_escape(s + 1, slurper.cur_line_length() - 1);
+ directory = PermString(s + 1);
+ continue;
+ }
+ }
+
+ if (equals_pos < 0) {
+ // report error?
+ continue;
+ }
+
+ // get the key
+ unsigned len = psres_escape(s, equals_pos);
+ PermString key = PermString(s, len);
+ int index = _map[key];
+ if (!override && index > 0)
+ continue;
+
+ // double equals means absolute pathname
+ if (s[equals_pos + 1] == '=')
+ equals_pos++;
+
+ // get the value. Don't escape it yet
+ len = slurper.cur_line_length() - (equals_pos + 1);
+ String value = String(s + equals_pos + 1, len);
+
+ // stick key and value into our data structure
+ if (index == 0) {
+ index = _directories.size();
+ _directories.push_back(directory);
+ _values.push_back(value);
+ _value_escaped.push_back(false);
+ _map.insert(key, index);
+ } else {
+ _directories[index] = directory;
+ _values[index] = value;
+ _value_escaped[index] = false;
+ }
+ }
+}
+
+
+PsresDatabaseSection *
+PsresDatabase::force_section(PermString name)
+{
+ if (_section_map[name] > 0)
+ return _sections[_section_map[name]];
+ else {
+ PsresDatabaseSection *s = new PsresDatabaseSection(name);
+ int index = _sections.size();
+ _sections.push_back(s);
+ _section_map.insert(name, index);
+ return s;
+ }
+}
+
+bool
+PsresDatabase::add_one_psres_file(Slurper &slurper, bool override)
+{
+ if (!read_psres_line(slurper, 0))
+ return /* error */ false;
+
+ char *s = slurper.cur_line();
+ unsigned len = slurper.cur_line_length();
+ if (len < 12 || memcmp(s, "PS-Resources", 12) != 0)
+ return /* error */ false;
+
+ bool exclusive = (len >= 22 && memcmp(s+12, "-Exclusive", 10) == 0);
+
+ // skip list of sections
+ while (read_psres_line(slurper, 0))
+ /* nada */;
+
+ // now, read each section
+ PermString directory = slurper.filename().directory();
+
+ while (read_psres_line(slurper, 0)) {
+ s = slurper.cur_line();
+ len = psres_escape(s, slurper.cur_line_length());
+ PsresDatabaseSection *section = force_section(PermString(s, len));
+ section->add_psres_file_section(slurper, directory, override);
+ }
+
+ return exclusive;
+}
+
+bool
+PsresDatabase::add_psres_file(Filename &filename, bool override)
+{
+ Slurper slurpy(filename);
+ return add_one_psres_file(slurpy, override);
+}
+
+
+#ifndef WIN32
+
+void
+PsresDatabase::add_psres_directory(PermString directory)
+{
+ DIR *dir = opendir(directory.c_str());
+ if (!dir) return;
+
+ while (struct dirent *dirent = readdir(dir)) {
+ int len = DIR_NAMLEN(dirent);
+ if (len > 4 && dirent->d_name[0] != '.'
+ && memcmp(dirent->d_name + len - 4, ".upr", 4) == 0
+ && (len != 9 || memcmp(dirent->d_name, "PSres.upr", 9) != 0)) {
+ Filename fn(directory, PermString(dirent->d_name, len));
+ add_psres_file(fn, false);
+ }
+ }
+
+ closedir(dir);
+}
+
+#else /* WIN32 */
+
+void
+PsresDatabase::add_psres_directory(PermString directory)
+{
+ WIN32_FIND_DATA find_file_data;
+ HANDLE hnd;
+ int proceed = TRUE;
+
+ PermString search_str = permcat(directory, "/*.*");
+ hnd = FindFirstFile(search_str.c_str(), &find_file_data);
+
+ if (hnd == INVALID_HANDLE_VALUE) {
+ return;
+ }
+ while (proceed) {
+ int len = strlen(find_file_data.cFileName);
+ if (len > 4 && find_file_data.cFileName[0] != '.'
+ && _strnicmp(find_file_data.cFileName + len - 4, ".upr", 4) == 0
+ && (len != 9 || _strnicmp(find_file_data.cFileName, "PSres.upr", 9) != 0)) {
+ Filename fn(directory, PermString(find_file_data.cFileName, len));
+ add_psres_file(fn, false);
+ }
+ proceed = FindNextFile (hnd, &find_file_data);
+ }
+ FindClose(hnd);
+}
+
+#endif /* WIN32 */
+
+
+void
+PsresDatabase::add_psres_path(const char *path, const char *default_path,
+ bool override)
+{
+ if (!path && !default_path)
+ return;
+ else if (!path) {
+ path = default_path;
+ default_path = 0;
+ }
+
+ if (override && _sections.size() > 1) {
+ PsresDatabase new_db;
+ new_db.add_psres_path(path, default_path, false);
+ add_database(&new_db, true);
+ return;
+ }
+
+ while (*path) {
+ const char *epath = path;
+ while (*epath && *epath != ':') epath++;
+
+ PermString directory(path, epath - path);
+ Filename filename(directory, "PSres.upr");
+ if (epath == path) {
+ add_psres_path(default_path, 0, false);
+ default_path = 0; // don't use default path twice
+ } else if (!filename.readable() || !add_psres_file(filename, false))
+ add_psres_directory(directory);
+
+ path = (*epath ? epath+1 : epath);
+ }
+}
+
+
+void
+PsresDatabase::add_database(PsresDatabase *db, bool override)
+{
+ for (int i = 1; i < db->_sections.size(); i++) {
+ PermString section_name = db->_sections[i]->section_name();
+ PsresDatabaseSection *section = force_section(section_name);
+ section->add_section(db->_sections[i], override);
+ }
+}
+
+void
+PsresDatabaseSection::add_section(PsresDatabaseSection *s, bool override)
+{
+ for (HashMap<PermString, int>::const_iterator i = s->_map.begin(); i; i++) {
+ int value = i.value();
+ if (_map[i.key()] <= 0) {
+ int my_index = _directories.size();
+ _directories.push_back(s->_directories[value]);
+ _values.push_back(s->_values[value]);
+ _value_escaped.push_back(s->_value_escaped[value]);
+ _map.insert(i.key(), my_index);
+ } else if (override) {
+ int my_index = _map[i.key()];
+ _directories[my_index] = s->_directories[value];
+ _values[my_index] = s->_values[value];
+ _value_escaped[my_index] = s->_value_escaped[value];
+ }
+ }
+}
+
+
+const String &
+PsresDatabaseSection::value(int index)
+{
+ if (_value_escaped[index])
+ return _values[index];
+ else {
+ char *data = _values[index].mutable_data();
+ int len = psres_escape(data, _values[index].length());
+ _values[index] = _values[index].substring(0, len);
+ _value_escaped[index] = true;
+ return _values[index];
+ }
+}
+
+Filename
+PsresDatabaseSection::filename_value(PermString key)
+{
+ int index = _map[key];
+ if (!index)
+ return Filename();
+ else if (!_directories[index])
+ return Filename(value(index));
+ else
+ return Filename(_directories[index], value(index));
+}
+
+const String &
+PsresDatabase::value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->value(key);
+ else
+ return empty_string;
+}
+
+const String &
+PsresDatabase::unescaped_value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->unescaped_value(key);
+ else
+ return empty_string;
+}
+
+Filename
+PsresDatabase::filename_value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->filename_value(key);
+ else
+ return Filename();
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1bounds.cc b/Build/source/utils/lcdf-typetools/libefont/t1bounds.cc
new file mode 100644
index 00000000000..ef273f17d3f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1bounds.cc
@@ -0,0 +1,161 @@
+// -*- related-file-name: "../include/efont/t1bounds.hh" -*-
+
+/* t1bounds.{cc,hh} -- charstring bounding box finder
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1bounds.hh>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+namespace Efont {
+
+CharstringBounds::CharstringBounds()
+ : _lb(UNKDOUBLE, UNKDOUBLE), _rt(UNKDOUBLE, UNKDOUBLE),
+ _last_xf_program(0)
+{
+}
+
+CharstringBounds::CharstringBounds(const Transform &nonfont_xf)
+ : _lb(UNKDOUBLE, UNKDOUBLE), _rt(UNKDOUBLE, UNKDOUBLE),
+ _nonfont_xf(nonfont_xf), _last_xf_program(0)
+{
+}
+
+CharstringBounds::CharstringBounds(const Transform &nonfont_xf, const Vector<double> &weight)
+ : CharstringInterp(weight),
+ _lb(UNKDOUBLE, UNKDOUBLE), _rt(UNKDOUBLE, UNKDOUBLE),
+ _nonfont_xf(nonfont_xf), _last_xf_program(0)
+{
+}
+
+void
+CharstringBounds::clear()
+{
+ _lb = _rt = Point(UNKDOUBLE, UNKDOUBLE);
+}
+
+void
+CharstringBounds::xf_mark(const Bezier &b)
+{
+ Bezier b1, b2;
+ b.halve(b1, b2);
+ xf_mark(b1.point(3));
+ if (!xf_controls_inside(b1))
+ xf_mark(b1);
+ if (!xf_controls_inside(b2))
+ xf_mark(b2);
+}
+
+void
+CharstringBounds::act_width(int, const Point &w)
+{
+ _width = w;
+}
+
+void
+CharstringBounds::act_line(int, const Point &p0, const Point &p1)
+{
+ mark(p0);
+ mark(p1);
+}
+
+void
+CharstringBounds::act_curve(int, const Point &p0, const Point &p1, const Point &p2, const Point &p3)
+{
+ Point q0 = p0 * _xf;
+ Point q1 = p1 * _xf;
+ Point q2 = p2 * _xf;
+ Point q3 = p3 * _xf;
+
+ xf_mark(q0);
+ xf_mark(q3);
+
+ if (!xf_inside(q1) || !xf_inside(q2)) {
+ Bezier b(q0, q1, q2, q3);
+ xf_mark(b);
+ }
+}
+
+void
+CharstringBounds::set_xf(const CharstringProgram *program)
+{
+ if (_last_xf_program != program) {
+ _last_xf_program = program;
+ double matrix[6];
+ program->font_matrix(matrix);
+ Transform font_xf = Transform(matrix).scaled(1000);
+ font_xf.check_null(0.001);
+ _xf = _nonfont_xf * font_xf;
+ }
+}
+
+bool
+CharstringBounds::char_bounds(const CharstringContext &g, bool shift)
+{
+ set_xf(g.program);
+ CharstringInterp::interpret(g);
+ if (shift) {
+ _xf.translate(_width);
+ _nonfont_xf.translate(_width);
+ }
+ return error() >= 0;
+}
+
+void
+CharstringBounds::translate(double dx, double dy)
+{
+ _xf.translate(dx, dy);
+ _nonfont_xf.translate(dx, dy);
+}
+
+bool
+CharstringBounds::output(int bb[4], int &width, bool use_cur_width) const
+{
+ if (!KNOWN(_lb.x))
+ bb[0] = bb[1] = bb[2] = bb[3] = 0;
+ else {
+ bb[0] = (int) floor(_lb.x);
+ bb[1] = (int) floor(_lb.y);
+ bb[2] = (int) ceil(_rt.x);
+ bb[3] = (int) ceil(_rt.y);
+ }
+ Point p;
+ if (use_cur_width)
+ p = _width * _xf;
+ else
+ p = Point(0, 0) * _xf;
+ width = (int) ceil(p.x);
+ return error() >= 0;
+}
+
+bool
+CharstringBounds::bounds(const Transform &transform, const CharstringContext &g, int bb[4], int &width)
+{
+ CharstringBounds b(transform);
+ b.char_bounds(g, false);
+ return b.output(bb, width, true);
+}
+
+bool
+CharstringBounds::bounds(const CharstringContext &g, int bb[4], int &width)
+{
+ CharstringBounds b;
+ b.char_bounds(g, false);
+ return b.output(bb, width, true);
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1cs.cc b/Build/source/utils/lcdf-typetools/libefont/t1cs.cc
new file mode 100644
index 00000000000..8fb582884a3
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1cs.cc
@@ -0,0 +1,364 @@
+// -*- related-file-name: "../include/efont/t1cs.hh" -*-
+
+/* t1cs.{cc,hh} -- Type 1/2 charstrings
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1cs.hh>
+#include <efont/t1interp.hh>
+#include <string.h>
+namespace Efont {
+
+const char * const Charstring::command_names[] = {
+ "error", "hstem", "UNKNOWN_2", "vstem", "vmoveto",
+ "rlineto", "hlineto", "vlineto", "rrcurveto", "closepath",
+
+ "callsubr", "return", "escape", "hsbw", "endchar",
+ "UNKNOWN_15", "blend", "UNKNOWN_17", "hstemhm", "hintmask",
+
+ "cntrmask", "rmoveto", "hmoveto", "vstemhm", "rcurveline",
+ "rlinecurve", "vvcurveto", "hhcurveto", "shortint", "callgsubr",
+
+ "vhcurveto", "hvcurveto", "dotsection", "vstem3", "hstem3",
+ "and", "or", "not", "seac", "sbw",
+
+ "store", "abs", "add", "sub", "div",
+ "load", "neg", "eq", "callothersubr", "pop",
+
+ "drop", "UNKNOWN_12_19", "put", "get", "ifelse",
+ "random", "mul", "UNKNOWN_12_25", "sqrt", "dup",
+
+ "exch", "index", "roll", "UNKNOWN_12_31", "UNKNOWN_12_32",
+ "setcurrentpoint", "hflex", "flex", "hflex1", "flex1"
+};
+
+const char * const Charstring::standard_encoding[256] = {
+ /* 00x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 01x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 02x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 03x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 04x */ "space", "exclam", "quotedbl", "numbersign", "dollar", "percent",
+ "ampersand", "quoteright",
+ /* 05x */ "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen",
+ "period", "slash",
+ /* 06x */ "zero", "one", "two", "three", "four", "five", "six", "seven",
+ /* 07x */ "eight", "nine", "colon", "semicolon", "less", "equal",
+ "greater", "question",
+ /* 10x */ "at", "A", "B", "C", "D", "E", "F", "G",
+ /* 11x */ "H", "I", "J", "K", "L", "M", "N", "O",
+ /* 12x */ "P", "Q", "R", "S", "T", "U", "V", "W",
+ /* 13x */ "X", "Y", "Z", "bracketleft", "backslash", "bracketright",
+ "asciicircum", "underscore",
+ /* 14x */ "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+ /* 15x */ "h", "i", "j", "k", "l", "m", "n", "o",
+ /* 16x */ "p", "q", "r", "s", "t", "u", "v", "w",
+ /* 17x */ "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", 0,
+ /* 20x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 21x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 22x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 23x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 24x */ 0, "exclamdown", "cent", "sterling", "fraction", "yen",
+ "florin", "section",
+ /* 25x */ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ /* 26x */ 0, "endash", "dagger", "daggerdbl", "periodcentered", 0,
+ "paragraph", "bullet",
+ /* 27x */ "quotesinglbase", "quotedblbase", "quotedblright",
+ "guillemotright", "ellipsis", "perthousand", 0, "questiondown",
+ /* 30x */ 0, "grave", "acute", "circumflex", "tilde", "macron",
+ "breve", "dotaccent",
+ /* 31x */ "dieresis", 0, "ring", "cedilla", 0, "hungarumlaut",
+ "ogonek", "caron",
+ /* 32x */ "emdash", 0, 0, 0, 0, 0, 0, 0,
+ /* 33x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 34x */ 0, "AE", 0, "ordfeminine", 0, 0, 0, 0,
+ /* 35x */ "Lslash", "Oslash", "OE", "ordmasculine", 0, 0, 0, 0,
+ /* 36x */ 0, "ae", 0, 0, 0, "dotlessi", 0, 0,
+ /* 37x */ "lslash", "oslash", "oe", "germandbls", 0, 0, 0, 0,
+};
+
+
+Charstring::~Charstring()
+{
+}
+
+String
+Charstring::command_name(int cmd)
+{
+ if (cmd >= 0 && cmd <= cLastCommand)
+ return command_names[cmd];
+ else if (cmd < cEscapeDelta + 256)
+ return String("COMMAND_12_") + String(cmd - cEscapeDelta);
+ else
+ return String("<INVALID>");
+}
+
+
+Type1Charstring::Type1Charstring(int lenIV, const String &s)
+ : Charstring(), _key(-1)
+{
+ if (lenIV < 0) // no charstring encryption
+ _s = s;
+ else if (lenIV < s.length()) {
+ const unsigned char *d = reinterpret_cast<const unsigned char*>(s.data());
+ _key = t1R_cs;
+ for (int i = 0; i < lenIV; i++, d++)
+ _key = ((*d + _key) * t1C1 + t1C2) & 0xFFFF;
+ _s = s.substring(lenIV);
+ }
+}
+
+void
+Type1Charstring::prepend(const Type1Charstring &t1cs)
+{
+ if (_key >= 0)
+ decrypt();
+ if (t1cs._key >= 0)
+ t1cs.decrypt();
+ _s = t1cs._s + _s;
+}
+
+void
+Type1Charstring::decrypt() const
+{
+ if (_key >= 0) {
+ int r = _key;
+ uint8_t *d = reinterpret_cast<uint8_t *>(_s.mutable_data());
+ for (int i = 0; i < _s.length(); i++, d++) {
+ uint8_t encrypted = *d;
+ *d = encrypted ^ (r >> 8);
+ r = ((encrypted + r) * t1C1 + t1C2) & 0xFFFF;
+ }
+ _key = -1;
+ }
+}
+
+bool
+Type1Charstring::process(CharstringInterp &interp) const
+{
+ const uint8_t *data = Type1Charstring::data();
+ int left = _s.length();
+
+ while (left > 0) {
+ bool more;
+ int ahead;
+
+ if (*data >= 32 && *data <= 246) { // push small number
+ more = interp.number(data[0] - 139);
+ ahead = 1;
+
+ } else if (*data < 32) { // a command
+ if (*data == cEscape) {
+ if (left < 2)
+ goto runoff_error;
+ more = interp.type1_command(cEscapeDelta + data[1]);
+ ahead = 2;
+ } else if (*data == cShortint) { // short integer
+ if (left < 3)
+ goto runoff_error;
+ int16_t val = (data[1] << 8) | data[2];
+ more = interp.number(val);
+ ahead = 3;
+ } else {
+ more = interp.type1_command(data[0]);
+ ahead = 1;
+ }
+
+ } else if (*data >= 247 && *data <= 250) { // push medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = + ((data[0] - 247) << 8) + 108 + data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else if (*data >= 251 && *data <= 254) { // push negative medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = - ((data[0] - 251) << 8) - 108 - data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else { // 255: push huge number
+ if (left < 5)
+ goto runoff_error;
+ int32_t val = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ more = interp.number(val);
+ ahead = 5;
+ }
+
+ if (!more)
+ return interp.error() == CharstringInterp::errOK;
+
+ data += ahead;
+ left -= ahead;
+ }
+
+ runoff_error:
+ interp.error(CharstringInterp::errRunoff);
+ return false;
+}
+
+int
+Type1Charstring::first_caret_after(int pos) const
+{
+ const uint8_t *data = Type1Charstring::data();
+ const uint8_t *edata = data + (pos < length() ? pos : length());
+
+ while (data < edata) {
+ if (*data >= 32 && *data <= 246) // push small number
+ data++;
+ else if (*data < 32) { // a command
+ if (*data == cEscape)
+ data += 2;
+ else if (*data == cShortint)
+ data += 3;
+ else
+ data++;
+ } else if (*data >= 247 && *data <= 254) // push medium number
+ data += 2;
+ else // 255: push huge number
+ data += 5;
+ }
+
+ const uint8_t *odata = Type1Charstring::data();
+ return (data > odata + length() ? length() : data - odata);
+}
+
+void
+Type1Charstring::assign_substring(int pos, int len, const String &cs)
+{
+ if (_key >= 0)
+ decrypt();
+ if (pos < 0 || len < 0 || pos + len >= _s.length())
+ /* do nothing */;
+ else if (cs.length() == len) {
+ char *d = _s.mutable_data();
+ memcpy(d + pos, cs.data(), cs.length());
+ } else if (cs.length() <= len) {
+ char *d = _s.mutable_data();
+ memcpy(d + pos, cs.data(), cs.length());
+ memmove(d + pos + cs.length(), d + pos + len, _s.length() - pos - len);
+ _s = _s.substring(0, cs.length() - len);
+ } else
+ _s = _s.substring(0, pos) + cs + _s.substring(pos + len);
+}
+
+
+bool
+Type2Charstring::process(CharstringInterp &interp) const
+{
+ const uint8_t *data = Type2Charstring::data();
+ int left = _s.length();
+
+ while (left > 0) {
+ bool more;
+ int ahead;
+
+ if (*data >= 32 && *data <= 246) { // push small number
+ more = interp.number(data[0] - 139);
+ ahead = 1;
+
+ } else if (*data < 32) { // a command
+ if (*data == cEscape) {
+ if (left < 2)
+ goto runoff_error;
+ more = interp.type2_command(cEscapeDelta + data[1], 0, 0);
+ ahead = 2;
+ } else if (*data == cShortint) { // short integer
+ if (left < 3)
+ goto runoff_error;
+ int16_t val = (data[1] << 8) | data[2];
+ more = interp.number(val);
+ ahead = 3;
+ } else if (*data == cHintmask || *data == cCntrmask) {
+ int left_ptr = left - 1;
+ more = interp.type2_command(data[0], data + 1, &left_ptr);
+ ahead = 1 + (left - 1) - left_ptr;
+ } else {
+ more = interp.type2_command(data[0], 0, 0);
+ ahead = 1;
+ }
+
+ } else if (*data >= 247 && *data <= 250) { // push medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = + ((data[0] - 247) << 8) + 108 + data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else if (*data >= 251 && *data <= 254) { // push negative medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = - ((data[0] - 251) << 8) - 108 - data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else { // 255: push huge number
+ if (left < 5)
+ goto runoff_error;
+ int32_t val = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ more = interp.number(val / 65536.);
+ ahead = 5;
+ }
+
+ if (!more)
+ return interp.error() == CharstringInterp::errOK;
+
+ data += ahead;
+ left -= ahead;
+ }
+
+ runoff_error:
+ interp.error(CharstringInterp::errRunoff);
+ return false;
+}
+
+
+const CharstringProgram *
+CharstringProgram::child_program(int) const
+{
+ return this;
+}
+
+void
+CharstringProgram::font_matrix(double matrix[6]) const
+{
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+}
+
+void
+CharstringProgram::glyph_names(Vector<PermString> &gnames) const
+{
+ int n = nglyphs();
+ gnames.resize(n);
+ for (int i = 0; i < n; i++)
+ gnames[i] = glyph_name(i);
+}
+
+Vector<double> *
+CharstringProgram::mm_vector(VectorType, bool) const
+{
+ return 0;
+}
+
+double
+CharstringProgram::global_width_x(bool) const
+{
+ return UNKDOUBLE;
+}
+
+}
+
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1csgen.cc b/Build/source/utils/lcdf-typetools/libefont/t1csgen.cc
new file mode 100644
index 00000000000..4ae22871bc7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1csgen.cc
@@ -0,0 +1,568 @@
+// -*- related-file-name: "../include/efont/t1csgen.hh" -*-
+
+/* t1csgen.{cc,hh} -- Type 1 charstring generation
+ *
+ * Copyright (c) 1998-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1csgen.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <math.h>
+namespace Efont {
+
+static const char * const command_desc[] = {
+ 0, 0, 0, 0, "y",
+ "xy", "x", "y", "xyxyxy", 0,
+
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, "xy", "x", 0, 0,
+ 0, 0, 0, 0, 0,
+
+ "yxyx", "xxyy", 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0,
+ "XY", 0, 0, 0, 0
+};
+
+Type1CharstringGen::Type1CharstringGen(int precision)
+{
+ if (precision >= 1 && precision <= 107)
+ _precision = precision;
+ else
+ _precision = 5;
+ _f_precision = _precision;
+}
+
+void
+Type1CharstringGen::clear()
+{
+ _ncs.clear();
+ _true = _false = Point(0, 0);
+ _state = S_INITIAL;
+}
+
+
+void
+Type1CharstringGen::gen_number(double float_val, int kind)
+{
+ switch (kind) {
+ case 'x':
+ _true.x += float_val;
+ float_val = _true.x - _false.x;
+ break;
+ case 'y':
+ _true.y += float_val;
+ float_val = _true.y - _false.y;
+ break;
+ case 'X':
+ _true.x = float_val;
+ break;
+ case 'Y':
+ _true.y = float_val;
+ break;
+ }
+
+ // 30.Jul.2003 - Avoid rounding differences between platforms with the
+ // extra 0.00001.
+ int big_val = (int)floor(float_val * _f_precision + 0.50001);
+ int frac = big_val % _precision;
+ int val = (frac == 0 ? big_val / _precision : big_val);
+
+ if (val >= -107 && val <= 107)
+ _ncs.append((char)(val + 139));
+
+ else if (val >= -1131 && val <= 1131) {
+ int base = val < 0 ? 251 : 247;
+ if (val < 0) val = -val;
+ val -= 108;
+ int w = val % 256;
+ val = (val - w) / 256;
+ _ncs.append((char)(val + base));
+ _ncs.append((char)w);
+
+ } else {
+ _ncs.append('\377');
+ long l = val;
+ _ncs.append((char)((l >> 24) & 0xFF));
+ _ncs.append((char)((l >> 16) & 0xFF));
+ _ncs.append((char)((l >> 8) & 0xFF));
+ _ncs.append((char)((l >> 0) & 0xFF));
+ }
+
+ if (frac != 0) {
+ _ncs.append((char)(_precision + 139));
+ _ncs.append((char)Charstring::cEscape);
+ _ncs.append((char)(Charstring::cDiv - Charstring::cEscapeDelta));
+ }
+
+ float_val = big_val / _f_precision;
+ switch (kind) {
+ case 'x':
+ _false.x += float_val;
+ break;
+ case 'y':
+ _false.y += float_val;
+ break;
+ case 'X':
+ _false.x = float_val;
+ break;
+ case 'Y':
+ _false.y = float_val;
+ break;
+ }
+}
+
+
+void
+Type1CharstringGen::gen_command(int command)
+{
+ if (command >= Charstring::cEscapeDelta) {
+ _ncs.append((char)Charstring::cEscape);
+ _ncs.append((char)(command - Charstring::cEscapeDelta));
+ if (command != Charstring::cSbw)
+ _state = S_GEN;
+ } else {
+ _ncs.append((char)command);
+ if (command > Charstring::cVmoveto && command != Charstring::cHsbw)
+ _state = S_GEN;
+ }
+}
+
+void
+Type1CharstringGen::gen_stack(CharstringInterp &interp, int for_cmd)
+{
+ const char *str = ((unsigned)for_cmd <= Charstring::cLastCommand ? command_desc[for_cmd] : (const char *)0);
+ int i;
+ for (i = 0; str && *str && i < interp.size(); i++, str++)
+ gen_number(interp.at(i), *str);
+ for (; i < interp.size(); i++)
+ gen_number(interp.at(i));
+ interp.clear();
+}
+
+void
+Type1CharstringGen::gen_moveto(const Point &p, bool closepath)
+{
+ // make sure we generate some moveto on the first command
+
+ double dx = p.x - _false.x;
+ double dy = p.y - _false.y;
+ int big_dx = (int)floor(dx * _f_precision + 0.50001);
+ int big_dy = (int)floor(dy * _f_precision + 0.50001);
+
+ if (big_dx == 0 && big_dy == 0 && _state != S_INITIAL)
+ /* do nothing */;
+ else {
+ if (closepath)
+ gen_command(Charstring::cClosepath);
+ if (big_dy == 0) {
+ gen_number(dx, 'x');
+ gen_command(Charstring::cHmoveto);
+ } else if (big_dx == 0) {
+ gen_number(dy, 'y');
+ gen_command(Charstring::cVmoveto);
+ } else {
+ gen_number(dx, 'x');
+ gen_number(dy, 'y');
+ gen_command(Charstring::cRmoveto);
+ }
+ }
+
+ _true.x = p.x;
+ _true.y = p.y;
+}
+
+void
+Type1CharstringGen::append_charstring(const String &s)
+{
+ _ncs << s;
+}
+
+Type1Charstring *
+Type1CharstringGen::output()
+{
+ return new Type1Charstring(take_string());
+}
+
+void
+Type1CharstringGen::output(Type1Charstring &cs)
+{
+ cs.assign(take_string());
+}
+
+String
+Type1CharstringGen::callsubr_string(int subr)
+{
+ Type1CharstringGen csg;
+ csg.gen_number(subr);
+ csg.gen_command(Charstring::cCallsubr);
+ return csg._ncs.take_string();
+}
+
+
+/*****
+ * Type1CharstringGenInterp
+ **/
+
+Type1CharstringGenInterp::Type1CharstringGenInterp(int precision)
+ : _csgen(precision), _hint_csgen(precision),
+ _direct_hr(false), _hr_storage(0),
+ _max_flex_height(0), _bad_flex(false)
+{
+}
+
+void
+Type1CharstringGenInterp::set_hint_replacement_storage(Type1Font *font)
+{
+ _hr_storage = font;
+ _hr_firstsubr = font->nsubrs();
+}
+
+
+// generating charstring commands
+
+inline void
+Type1CharstringGenInterp::gen_number(double n, int what)
+{
+ _csgen.gen_number(n, what);
+}
+
+inline void
+Type1CharstringGenInterp::gen_command(int what)
+{
+ _csgen.gen_command(what);
+}
+
+void
+Type1CharstringGenInterp::gen_sbw(bool hints_follow)
+{
+ if (!hints_follow && nhints())
+ act_hintmask(Cs::cHintmask, 0, nhints());
+ else if (left_sidebearing().y == 0 && _width.y == 0) {
+ gen_number(left_sidebearing().x, 'X');
+ gen_number(_width.x);
+ gen_command(Cs::cHsbw);
+ } else {
+ gen_number(left_sidebearing().x, 'X');
+ gen_number(left_sidebearing().y, 'Y');
+ gen_number(_width.x);
+ gen_number(_width.y);
+ gen_command(Cs::cSbw);
+ }
+ _state = S_CLOSED;
+}
+
+void
+Type1CharstringGenInterp::act_width(int, const Point &p)
+{
+ _width = p;
+}
+
+void
+Type1CharstringGenInterp::act_seac(int, double asb, double adx, double ady, int bchar, int achar)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ gen_number(asb);
+ gen_number(adx);
+ gen_number(ady);
+ gen_number(bchar);
+ gen_number(achar);
+ gen_command(Cs::cSeac);
+ _state = S_SEAC;
+}
+
+void
+Type1CharstringGenInterp::swap_stem_hints()
+{
+ _stem_pos.clear();
+ _stem_width.clear();
+ _stem_hstem.clear();
+ _in_hr = true;
+}
+
+void
+Type1CharstringGenInterp::act_hstem(int, double pos, double width)
+{
+ if (_state != S_INITIAL && !_in_hr)
+ swap_stem_hints();
+ _stem_pos.push_back(pos);
+ _stem_width.push_back(width);
+ _stem_hstem.push_back(1);
+}
+
+void
+Type1CharstringGenInterp::act_vstem(int, double pos, double width)
+{
+ if (_state != S_INITIAL && !_in_hr)
+ swap_stem_hints();
+ _stem_pos.push_back(pos);
+ _stem_width.push_back(width);
+ _stem_hstem.push_back(0);
+}
+
+String
+Type1CharstringGenInterp::gen_hints(const unsigned char *data, int nhints) const
+{
+ _hint_csgen.clear();
+ unsigned char mask = 0x80;
+ for (int i = 0; i < nhints; i++) {
+ if (*data & mask) {
+ double offset = (_stem_hstem[i] ? left_sidebearing().y : left_sidebearing().x);
+ _hint_csgen.gen_number(_stem_pos[i] - offset);
+ _hint_csgen.gen_number(_stem_width[i]);
+ _hint_csgen.gen_command(_stem_hstem[i] ? Cs::cHstem : Cs::cVstem);
+ }
+ if ((mask >>= 1) == 0)
+ data++, mask = 0x80;
+ }
+ return _hint_csgen.take_string();
+}
+
+void
+Type1CharstringGenInterp::act_hintmask(int cmd, const unsigned char *data, int nhints)
+{
+ if (cmd == Cs::cCntrmask || nhints > Type1CharstringGenInterp::nhints())
+ return;
+
+ String data_holder;
+ if (!data) {
+ data_holder = String::fill_string('\377', ((nhints - 1) >> 3) + 1);
+ data = data_holder.udata();
+ }
+
+ String hints = gen_hints(data, nhints);
+ _in_hr = false;
+
+ if (_state == S_INITIAL || _direct_hr) {
+ _last_hints = hints;
+ if (_state == S_INITIAL)
+ gen_sbw(true);
+ _csgen.append_charstring(hints);
+ } else if (_hr_storage && hints != _last_hints) {
+ _last_hints = hints;
+ hints += (char)(Cs::cReturn);
+
+ int subrno = -1, nsubrs = _hr_storage->nsubrs();
+ for (int i = _hr_firstsubr; i < nsubrs; i++)
+ if (Type1Subr *s = _hr_storage->subr_x(i))
+ if (s->t1cs() == hints) {
+ subrno = i;
+ break;
+ }
+
+ if (subrno < 0 && _hr_storage->set_subr(nsubrs, Type1Charstring(hints)))
+ subrno = nsubrs;
+
+ if (subrno >= 0) {
+ _csgen.gen_number(subrno);
+ _csgen.gen_number(4);
+ _csgen.gen_command(Cs::cCallsubr);
+ }
+ }
+}
+
+void
+Type1CharstringGenInterp::act_line(int cmd, const Point &a, const Point &b)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ _csgen.gen_moveto(a, _state == S_OPEN);
+ _state = S_OPEN;
+ if (a.x == b.x) {
+ gen_number(b.y - a.y, 'y');
+ gen_command(Cs::cVlineto);
+ } else if (a.y == b.y) {
+ gen_number(b.x - a.x, 'x');
+ gen_command(Cs::cHlineto);
+ } else {
+ gen_number(b.x - a.x, 'x');
+ gen_number(b.y - a.y, 'y');
+ gen_command(Cs::cRlineto);
+ }
+}
+
+void
+Type1CharstringGenInterp::act_curve(int cmd, const Point &a, const Point &b, const Point &c, const Point &d)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ _csgen.gen_moveto(a, _state == S_OPEN);
+ _state = S_OPEN;
+ if (b.y == a.y && d.x == c.x) {
+ gen_number(b.x - a.x, 'x');
+ gen_number(c.x - b.x, 'x');
+ gen_number(c.y - b.y, 'y');
+ gen_number(d.y - c.y, 'y');
+ gen_command(Cs::cHvcurveto);
+ } else if (b.x == a.x && d.y == c.y) {
+ gen_number(b.y - a.y, 'y');
+ gen_number(c.x - a.x, 'x');
+ gen_number(c.y - b.y, 'y');
+ gen_number(d.x - c.x, 'x');
+ gen_command(Cs::cVhcurveto);
+ } else {
+ gen_number(b.x - a.x, 'x');
+ gen_number(b.y - a.y, 'y');
+ gen_number(c.x - b.x, 'x');
+ gen_number(c.y - b.y, 'y');
+ gen_number(d.x - c.x, 'x');
+ gen_number(d.y - c.y, 'y');
+ gen_command(Cs::cRrcurveto);
+ }
+}
+
+void
+Type1CharstringGenInterp::act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ _csgen.gen_moveto(p0, _state == S_OPEN);
+ _state = S_OPEN;
+
+ // 1. Outer endpoints must have same x (or y) coordinate
+ bool v_ok = (p0.x == p7.x);
+ bool h_ok = (p0.y == p7.y);
+
+ // 2. Join point and its neighboring controls must be at an extreme
+ if (v_ok && p2.x == p3_4.x && p3_4.x == p5.x) {
+ double distance = fabs(p3_4.x - p0.x);
+ int sign = (p3_4.x < p0.x ? -1 : 1);
+ if (sign * (p1.x - p0.x) < 0 || sign * (p1.x - p0.x) > distance
+ || sign * (p6.x - p0.x) < 0 || sign * (p6.x - p0.x) > distance)
+ v_ok = false;
+ } else
+ v_ok = false;
+
+ if (h_ok && p2.y == p3_4.y && p3_4.y == p5.y) {
+ double distance = fabs(p3_4.y - p0.y);
+ int sign = (p3_4.y < p0.y ? -1 : 1);
+ if (sign * (p1.y - p0.y) < 0 || sign * (p1.y - p0.y) > distance
+ || sign * (p6.y - p0.y) < 0 || sign * (p6.y - p0.y) > distance)
+ h_ok = false;
+ } else
+ h_ok = false;
+
+ // 3. Flex height <= 20
+ if (v_ok && fabs(p3_4.x - p0.x) > 20)
+ v_ok = false;
+ if (h_ok && fabs(p3_4.y - p0.y) > 20)
+ h_ok = false;
+
+ // generate flex commands
+ if (v_ok || h_ok) {
+ Point p_reference = (h_ok ? Point(p3_4.x, p0.y) : Point(p0.x, p3_4.y));
+
+ _csgen.gen_number(1);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p_reference, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p1, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p2, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p3_4, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p5, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p6, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p7, false);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_number(flex_depth);
+ _csgen.gen_number(p7.x, 'X');
+ _csgen.gen_number(p7.y, 'Y');
+ _csgen.gen_number(0);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ double flex_height = fabs(h_ok ? p3_4.y - p0.y : p3_4.x - p0.x);
+ if (flex_height > _max_flex_height)
+ _max_flex_height = flex_height;
+ } else {
+ _bad_flex = true;
+ act_curve(cmd, p0, p1, p2, p3_4);
+ act_curve(cmd, p3_4, p5, p6, p7);
+ }
+}
+
+void
+Type1CharstringGenInterp::act_closepath(int cmd)
+{
+ if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ gen_command(Cs::cClosepath);
+ _state = S_CLOSED;
+}
+
+void
+Type1CharstringGenInterp::intermediate_output(Type1Charstring &out)
+{
+ _csgen.output(out);
+ _state = S_INITIAL;
+ act_hintmask(Cs::cEndchar, 0, nhints());
+}
+
+void
+Type1CharstringGenInterp::run(const CharstringContext &g, Type1Charstring &out)
+{
+ _width = Point(0, 0);
+ _csgen.clear();
+ swap_stem_hints();
+ _state = S_INITIAL;
+ _in_hr = false;
+
+ CharstringInterp::interpret(g);
+
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(Cs::cEndchar, 0, nhints());
+ if (_state != S_SEAC)
+ _csgen.gen_command(Cs::cEndchar);
+
+ _csgen.output(out);
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1font.cc b/Build/source/utils/lcdf-typetools/libefont/t1font.cc
new file mode 100644
index 00000000000..ebc93e3c28f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1font.cc
@@ -0,0 +1,887 @@
+// -*- related-file-name: "../include/efont/t1font.hh" -*-
+
+/* t1font.{cc,hh} -- Type 1 font
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1mm.hh>
+#include <lcdf/error.hh>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+namespace Efont {
+
+static PermString::Initializer initializer;
+static PermString lenIV_str = "lenIV";
+static PermString FontInfo_str = "FontInfo";
+
+Type1Font::Type1Font(PermString name)
+ : _cached_defs(false), _built(true), _font_name(name), _glyph_map(-1),
+ _encoding(0), _cached_mmspace(0), _mmspace(0), _synthetic_item(0)
+{
+ _dict = new HashMap<PermString, Type1Definition *>[dLast];
+ for (int i = 0; i < dLast; i++) {
+ _index[i] = -1;
+ _dict_deltas[i] = 0;
+ _dict[i].set_default_value((Type1Definition *)0);
+ }
+}
+
+Type1Font::Type1Font(Type1Reader &reader)
+ : _cached_defs(false), _built(false), _glyph_map(-1), _encoding(0),
+ _cached_mmspace(0), _mmspace(0), _synthetic_item(0)
+{
+ _dict = new HashMap<PermString, Type1Definition *>[dLast];
+ for (int i = 0; i < dLast; i++) {
+ _index[i] = -1;
+ _dict_deltas[i] = 0;
+ _dict[i].set_default_value((Type1Definition *)0);
+ }
+ read(reader);
+}
+
+Type1Font::~Type1Font()
+{
+ delete[] _dict;
+ for (int i = 0; i < _items.size(); i++)
+ delete _items[i];
+ delete _mmspace;
+ for (int i = 0; i < _subrs.size(); i++)
+ delete _subrs[i];
+ if (!_synthetic_item)
+ for (int i = 0; i < _glyphs.size(); i++)
+ delete _glyphs[i];
+}
+
+void
+Type1Font::set_item(int i, Type1Item *it)
+{
+ delete _items[i];
+ _items[i] = it;
+}
+
+static const char * const dict_starters[] = {
+ "0 dict begin", "/FontInfo 0 dict dup begin", "dup /Private 0 dict dup begin", "/Blend 0 dict dup begin", 0, 0
+};
+
+void
+Type1Font::add_definition(int dict, Type1Definition *t1d)
+{
+ if (_index[dict] < 0) {
+ if (_built && dict_starters[dict])
+ add_item(new Type1CopyItem(dict_starters[dict]));
+ _index[dict] = _items.size();
+ }
+ add_item(t1d);
+ set_dict(dict, t1d->name(), t1d);
+}
+
+void
+Type1Font::add_type1_encoding(Type1Encoding *e)
+{
+ if (_encoding) {
+ for (Type1Item** t1i = _items.begin(); t1i < _items.end(); t1i++)
+ if (*t1i == _encoding) {
+ delete _encoding;
+ *t1i = _encoding = e;
+ return;
+ }
+ }
+ _encoding = e;
+ add_item(e);
+}
+
+void
+Type1Font::add_glyph(Type1Subr *s)
+{
+ _glyphs.push_back(s);
+ _glyph_map.insert(s->name(), _glyphs.size() - 1);
+}
+
+int
+Type1Font::read(Type1Reader &reader)
+{
+ Dict cur_dict = dFont;
+ int eexec_state = 0;
+ bool have_subrs = false;
+ bool have_charstrings = false;
+ int lenIV = 4;
+ Type1SubrGroupItem *cur_group = 0;
+ int cur_group_count = 0;
+
+ StringAccum accum;
+ while (reader.next_line(accum)) {
+
+ // check for NULL STRING
+ int x_length = accum.length();
+ if (!x_length)
+ continue;
+ const char *x = accum.c_str(); // ensure we don't run off the string
+
+ // check for CHARSTRINGS
+ if (reader.was_charstring()) {
+ Type1Subr *fcs = Type1Subr::make(x, x_length, reader.charstring_start(), reader.charstring_length(), lenIV);
+
+ if (fcs->is_subr()) {
+ if (fcs->subrno() >= _subrs.size())
+ _subrs.resize(fcs->subrno() + 30, (Type1Subr *)0);
+ _subrs[fcs->subrno()] = fcs;
+ if (!have_subrs && _items.size()) {
+ if (Type1CopyItem *item = _items.back()->cast_copy()) {
+ cur_group = new Type1SubrGroupItem
+ (this, true, item->value());
+ cur_group_count = 0;
+ _items.back() = cur_group;
+ delete item;
+ }
+ have_subrs = true;
+ }
+
+ } else {
+ add_glyph(fcs);
+ if (!have_charstrings && _items.size()) {
+ if (Type1CopyItem *item = _items.back()->cast_copy()) {
+ cur_group = new Type1SubrGroupItem
+ (this, false, item->value());
+ cur_group_count = 0;
+ _items.back() = cur_group;
+ delete item;
+ }
+ have_charstrings = true;
+ }
+ }
+
+ accum.clear();
+ continue;
+ }
+
+ // check for COMMENTS
+ if (x[0] == '%') {
+ add_item(new Type1CopyItem(accum.take_string()));
+ continue;
+ }
+
+ // check for CHARSTRING START
+ // 5/29/1999: beware of charstring start-like things that don't have
+ // `readstring' in them!
+ if (!_charstring_definer
+ && strstr(x, "string currentfile") != 0
+ && strstr(x, "readstring") != 0) {
+ const char *sb = x;
+ while (*sb && *sb != '/')
+ sb++;
+ const char *se = sb + 1;
+ while (*sb && *se && *se != ' ' && *se != '{')
+ se++;
+ if (*sb && *se) {
+ _charstring_definer = permprintf(" %*s ", se - sb - 1, sb + 1);
+ reader.set_charstring_definer(_charstring_definer);
+ add_item(new Type1CopyItem(accum.take_string()));
+ continue;
+ }
+ }
+
+ // check for ENCODING
+ if (!_encoding && strncmp(x, "/Encoding ", 10) == 0) {
+ read_encoding(reader, x + 10);
+ accum.clear();
+ continue;
+ }
+
+ // check for a DEFINITION
+ if (x[0] == '/') {
+ definition_succeed:
+ Type1Definition *t1d = Type1Definition::make(accum, &reader);
+ if (!t1d)
+ goto definition_fail;
+ if (t1d->name() == lenIV_str)
+ t1d->value_int(lenIV);
+ add_definition(cur_dict, t1d);
+ accum.clear();
+ continue;
+ } else if (x[0] == ' ') {
+ const char *y;
+ for (y = x; y[0] == ' '; y++)
+ ;
+ if (y[0] == '/')
+ goto definition_succeed;
+ }
+
+ definition_fail:
+
+ // check for ZEROS special case
+ if (eexec_state == 2) {
+ // In eexec_state 2 (right after turning off eexec), the opening
+ // part of the string will have some 0 bytes followed by '0's.
+ // Change the 0 bytes into textual '0's.
+ int zeros = 0;
+ while (x[zeros] == 0 && x_length > 0)
+ zeros++, x_length--;
+ add_item(new Type1CopyItem(String::fill_string('0', zeros * 2 + x_length)));
+ eexec_state = 3;
+ accum.clear();
+ continue;
+ }
+
+ // check for MODIFIED FONT
+ if (eexec_state == 1 && strstr(x, "FontDirectory") != 0
+ && read_synthetic_font(reader, x, accum)) {
+ accum.clear();
+ continue;
+ }
+
+ // check for END-OF-CHARSTRING-GROUP TEXT
+ if (cur_group) {
+ if (cur_group_count == 0
+ || ((strstr(x, "end") != 0 || strstr(x, "put") != 0)
+ && strchr(x, '/') == 0)) {
+ cur_group->add_end_text(x);
+ cur_group_count++;
+ accum.clear();
+ continue;
+ }
+ cur_group = 0;
+ }
+
+ // add COPY ITEM
+ String s = accum.take_string();
+ add_item(new Type1CopyItem(s));
+ x = s.data();
+
+ if (eexec_state == 0 && strncmp(x, "currentfile eexec", 17) == 0 && (isspace(x[17]) || !x[17])) {
+ // allow arbitrary whitespace after "currentfile eexec".
+ // note: strlen("currentfile eexec") == 17
+ for (x += 17; isspace(*x); x++)
+ /* nada */;
+ reader.switch_eexec(true, (unsigned char *)x, (s.data() + s.length()) - x);
+ set_item(nitems() - 1, new Type1EexecItem(true));
+ eexec_state = 1;
+ } else if (eexec_state == 1 && strstr(x, "currentfile closefile") != 0) {
+ reader.switch_eexec(false, 0, 0);
+ add_item(new Type1EexecItem(false));
+ eexec_state = 2;
+ } else if (strstr(x, "begin") != 0) {
+ // 30.Sep.2002: NuevaMM's BlendFontInfo dict starts with a simple
+ // "/FontInfo ... begin" inside a "/Blend ... begin".
+ Dict was_dict = cur_dict;
+ if (strstr(x, "/Private") != 0)
+ cur_dict = dPrivate;
+ else if (strstr(x, "/FontInfo") != 0)
+ cur_dict = dFontInfo;
+ else
+ cur_dict = dFont;
+ if (strstr(x, "/Blend") != 0)
+ cur_dict = (Dict)(cur_dict + dBlend);
+ else if (was_dict == dBlend && cur_dict == dFontInfo)
+ cur_dict = (Dict)(cur_dict + dBlend);
+ } else if (cur_dict == dFontInfo && strstr(x, "end") != 0)
+ cur_dict = dFont;
+ }
+
+ // set dictionary deltas
+ for (int i = dFI; i < dLast; i++)
+ _dict_deltas[i] = get_dict_size(i) - _dict[i].size();
+ // borrow glyphs and glyph map from _synthetic_item
+ if (!_glyphs.size() && _synthetic_item) {
+ _glyphs = _synthetic_item->included_font()->_glyphs;
+ _glyph_map = _synthetic_item->included_font()->_glyph_map;
+ }
+
+ return (ok() ? 0 : -1);
+}
+
+bool
+Type1Font::ok() const
+{
+ return font_name() && _glyphs.size() > 0;
+}
+
+
+void
+Type1Font::read_encoding(Type1Reader &reader, const char *first_line)
+{
+ while (isspace(*first_line))
+ first_line++;
+ if (strncmp(first_line, "StandardEncoding", 16) == 0) {
+ add_type1_encoding(Type1Encoding::standard_encoding());
+ return;
+ }
+
+ add_type1_encoding(new Type1Encoding);
+
+ bool got_any = false;
+ StringAccum accum;
+
+ while (reader.next_line(accum)) {
+
+ // check for NULL STRING
+ if (!accum.length())
+ continue;
+ accum.append('\0'); // ensure we don't run off the string
+ char *pos = accum.data();
+
+ // skip to first `dup' token
+ if (!got_any) {
+ if (!(pos = strstr(pos, "dup"))) {
+ pos = accum.data();
+ goto check_done;
+ }
+ }
+
+ // parse as many `dup INDEX */CHARNAME put' as there are in the line
+ while (1) {
+ // skip spaces, look for `dup '
+ while (isspace(pos[0]))
+ pos++;
+ if (pos[0] != 'd' || pos[1] != 'u' || pos[2] != 'p' || !isspace(pos[3]))
+ break;
+
+ // look for `INDEX */'
+ char *scan;
+ int char_value = strtol(pos + 4, &scan, 10);
+ while (scan[0] == ' ') scan++;
+ if (char_value < 0 || char_value >= 256 || scan[0] != '/')
+ break;
+
+ // look for `CHARNAME put'
+ scan++;
+ char *name_pos = scan;
+ while (scan[0] != ' ' && scan[0]) scan++;
+ char *name_end = scan;
+ while (scan[0] == ' ') scan++;
+ if (scan[0] != 'p' || scan[1] != 'u' || scan[2] != 't')
+ break;
+
+ _encoding->put(char_value, PermString(name_pos, name_end - name_pos));
+ got_any = true;
+ pos = scan + 3;
+ }
+
+ check_done:
+ // check for end of encoding section
+ // if not over, add COPY ITEM for leftovers we didn't parse
+ if ((strstr(pos, "readonly") != 0 || strstr(pos, "def") != 0)
+ && (got_any || strstr(pos, "for") == 0)) {
+ _encoding->set_definer(String(pos));
+ return;
+ } else if (got_any && *pos)
+ add_item(new Type1CopyItem(String(pos)));
+
+ accum.clear();
+ }
+}
+
+static bool
+read_synthetic_string(Type1Reader &reader, StringAccum &wrong_accum,
+ const char *format, int *value)
+{
+ StringAccum accum;
+ if (!reader.next_line(accum))
+ return false;
+ wrong_accum << accum;
+ accum.append('\0'); // ensure we don't run off the string
+ int n = 0;
+ if (value)
+ sscanf(accum.data(), format, value, &n);
+ else
+ sscanf(accum.data(), format, &n);
+ return (n != 0 && (isspace(accum[n]) || accum[n] == '\0'));
+}
+
+bool
+Type1Font::read_synthetic_font(Type1Reader &reader, const char *first_line,
+ StringAccum &wrong_accum)
+{
+ // read font name
+ PermString font_name;
+ {
+ char *x = new char[strlen(first_line) + 1];
+ int n = 0;
+ sscanf(first_line, "FontDirectory /%[^] \t\r\n[{}/] known {%n", x, &n);
+ if (n && (isspace(first_line[n]) || first_line[n] == 0))
+ font_name = x;
+ delete[] x;
+ if (!font_name)
+ return false;
+ }
+
+ // check UniqueID
+ int unique_id;
+ {
+ StringAccum accum;
+ if (!reader.next_line(accum))
+ return false;
+ wrong_accum << accum;
+ accum.c_str(); // ensure we don't run off the string
+ const char *y = accum.data();
+ if (*y != '/' || strncmp(y + 1, font_name.c_str(), font_name.length()) != 0)
+ return false;
+ int n = 0;
+ sscanf(y + font_name.length() + 1, " findfont%n", &n);
+ y = strstr(y, "/UniqueID get ");
+ if (n == 0 || y == 0)
+ return false;
+ n = 0;
+ sscanf(y + 14, "%d%n", &unique_id, &n);
+ if (n == 0)
+ return false;
+ }
+
+ // check lines that say how much text
+ int multiplier;
+ if (!read_synthetic_string(reader, wrong_accum, "save userdict /fbufstr %d string put%n", &multiplier))
+ return false;
+
+ int multiplicand;
+ if (!read_synthetic_string(reader, wrong_accum, "%d {currentfile fbufstr readstring { pop } { clear currentfile%n", &multiplicand))
+ return false;
+
+ if (!read_synthetic_string(reader, wrong_accum, "closefile /fontdownload /unexpectedEOF /.error cvx exec } ifelse } repeat%n", 0))
+ return false;
+
+ int extra;
+ if (!read_synthetic_string(reader, wrong_accum, "currentfile %d string readstring { pop } { clear currentfile%n", &extra))
+ return false;
+
+ if (!read_synthetic_string(reader, wrong_accum, "closefile /fontdownload /unexpectedEOF /.error cvx exec } ifelse%n", 0))
+ return false;
+
+ if (!read_synthetic_string(reader, wrong_accum, "restore } if } if%n", 0))
+ return false;
+
+ Type1SubsetReader subreader(&reader, multiplier*multiplicand + extra);
+ Type1Font *synthetic = new Type1Font(subreader);
+ if (!synthetic->ok())
+ delete synthetic;
+ else {
+ _synthetic_item = new Type1IncludedFont(synthetic, unique_id);
+ add_item(_synthetic_item);
+ }
+ return true;
+}
+
+
+void
+Type1Font::undo_synthetic()
+{
+ // A synthetic font doesn't share arbitrary code with its base font; it
+ // shares just the CharStrings dictionary, according to Adobe Type 1 Font
+ // Format. We take advantage of this.
+
+ if (!_synthetic_item)
+ return;
+
+ int mod_ii;
+ for (mod_ii = nitems() - 1; mod_ii >= 0; mod_ii--)
+ if (_items[mod_ii] == _synthetic_item)
+ break;
+ if (mod_ii < 0)
+ return;
+
+ // remove synthetic item and the reference to the included font
+ _items[mod_ii] = new Type1NullItem;
+ if (Type1CopyItem *copy = _items[mod_ii+1]->cast_copy())
+ if (copy->value().find_left("findfont") >= 0) {
+ delete copy;
+ _items[mod_ii+1] = new Type1NullItem;
+ }
+
+ Type1Font *f = _synthetic_item->included_font();
+ // its glyphs are already stored in our _glyphs array
+
+ // copy SubrGroupItem from `f' into `this'
+ Type1SubrGroupItem *oth_subrs = 0, *oth_glyphs = 0;
+ for (int i = 0; i < f->nitems(); i++)
+ if (Type1SubrGroupItem *subr_grp = f->_items[i]->cast_subr_group()) {
+ if (subr_grp->is_subrs())
+ oth_subrs = subr_grp;
+ else
+ oth_glyphs = subr_grp;
+ }
+
+ assert(oth_glyphs != 0);
+
+ for (int i = nitems() - 1; i >= 0; i--)
+ if (Type1SubrGroupItem *subr_grp = _items[i]->cast_subr_group()) {
+ assert(subr_grp->is_subrs());
+ if (oth_subrs)
+ subr_grp->set_end_text(oth_subrs->end_text());
+ shift_indices(i + 1, 1);
+ Type1SubrGroupItem *nsubr = new Type1SubrGroupItem(*oth_glyphs, this);
+ _items[i + 1] = nsubr;
+ break;
+ }
+
+ // delete included font
+ f->_glyphs.clear(); // don't delete glyphs; we've stolen them
+ delete _synthetic_item;
+ _synthetic_item = 0;
+}
+
+
+Type1Charstring *
+Type1Font::subr(int e) const
+{
+ if (e >= 0 && e < _subrs.size() && _subrs[e])
+ return &_subrs[e]->t1cs();
+ else
+ return 0;
+}
+
+PermString
+Type1Font::glyph_name(int i) const
+{
+ if (i >= 0 && i < _glyphs.size() && _glyphs[i])
+ return _glyphs[i]->name();
+ else
+ return PermString();
+}
+
+Type1Charstring *
+Type1Font::glyph(int i) const
+{
+ if (i >= 0 && i < _glyphs.size() && _glyphs[i])
+ return &_glyphs[i]->t1cs();
+ else
+ return 0;
+}
+
+Type1Charstring *
+Type1Font::glyph(PermString name) const
+{
+ int i = _glyph_map[name];
+ if (i >= 0)
+ return &_glyphs[i]->t1cs();
+ else
+ return 0;
+}
+
+
+bool
+Type1Font::set_subr(int e, const Type1Charstring &t1cs, PermString definer)
+{
+ if (e < 0)
+ return false;
+ if (e >= _subrs.size())
+ _subrs.resize(e + 1, (Type1Subr *)0);
+
+ if (!definer) {
+ Type1Subr *pattern_subr = _subrs[e];
+ for (int i = 0; i < _subrs.size() && !pattern_subr; i++)
+ pattern_subr = _subrs[i];
+ if (!pattern_subr)
+ return false;
+ definer = pattern_subr->definer();
+ }
+
+ delete _subrs[e];
+ _subrs[e] = Type1Subr::make_subr(e, t1cs, definer);
+ return true;
+}
+
+bool
+Type1Font::remove_subr(int e)
+{
+ if (e < 0 || e >= _subrs.size())
+ return false;
+ delete _subrs[e];
+ _subrs[e] = 0;
+ return true;
+}
+
+void
+Type1Font::fill_in_subrs()
+{
+ while (_subrs.size() && _subrs.back() == 0)
+ _subrs.pop_back();
+ for (int i = 0; i < _subrs.size(); i++)
+ if (!_subrs[i])
+ set_subr(i, Type1Charstring(String::stable_string("\013", 1)));
+}
+
+void
+Type1Font::renumber_subrs(const Vector<int> &renumbering)
+{
+ Vector<Type1Subr *> old_subrs;
+ old_subrs.swap(_subrs);
+ for (int i = 0; i < old_subrs.size() && i < renumbering.size(); i++) {
+ int r = renumbering[i];
+ Type1Subr *s = old_subrs[i];
+ if (r >= 0 && s)
+ set_subr(r, s->t1cs(), s->definer());
+ else
+ delete s;
+ }
+ for (int i = renumbering.size(); i < old_subrs.size(); i++)
+ delete old_subrs[i];
+}
+
+
+void
+Type1Font::shift_indices(int move_index, int delta)
+{
+ if (delta > 0) {
+ _items.resize(_items.size() + delta, (Type1Item *)0);
+ memmove(&_items[move_index + delta], &_items[move_index],
+ sizeof(Type1Item *) * (_items.size() - move_index - delta));
+
+ for (int i = dFont; i < dLast; i++)
+ if (_index[i] > move_index)
+ _index[i] += delta;
+
+ } else {
+ memmove(&_items[move_index], &_items[move_index - delta],
+ sizeof(Type1Item *) * (_items.size() - (move_index - delta)));
+ _items.resize(_items.size() + delta);
+
+ for (int i = dFont; i < dLast; i++)
+ if (_index[i] >= move_index) {
+ if (_index[i] < move_index - delta)
+ _index[i] = move_index;
+ else
+ _index[i] += delta;
+ }
+ }
+}
+
+Type1Definition *
+Type1Font::ensure(Dict dict, PermString name)
+{
+ assert(_index[dict] >= 0);
+ Type1Definition *def = _dict[dict][name];
+ if (!def) {
+ def = new Type1Definition(name, 0, "def");
+ int move_index = _index[dict];
+ shift_indices(move_index, 1);
+ _items[move_index] = def;
+ set_dict(dict, name, def);
+ }
+ return def;
+}
+
+void
+Type1Font::add_header_comment(const String &comment)
+{
+ int i;
+ for (i = 0; i < _items.size(); i++) {
+ Type1CopyItem *copy = _items[i]->cast_copy();
+ if (!copy || copy->value()[0] != '%')
+ break;
+ }
+ shift_indices(i, 1);
+ _items[i] = new Type1CopyItem(comment);
+}
+
+
+Type1Item *
+Type1Font::dict_size_item(int d) const
+{
+ switch (d) {
+
+ case dF:
+ if (_built && _index[d] > 0)
+ return _items[_index[d] - 1];
+ break;
+
+ case dFI: case dP: case dB:
+ if (_index[d] > 0)
+ return _items[_index[d] - 1];
+ break;
+
+ case dBFI:
+ if (Type1Item *t1i = b_dict("FontInfo"))
+ return t1i;
+ else if (_index[dBFI] > 0)
+ return _items[_index[dBFI] - 1];
+ break;
+
+ case dBP:
+ if (Type1Item *t1i = b_dict("Private"))
+ return t1i;
+ else if (_index[dBP] > 0)
+ return _items[_index[dBP] - 1];
+ break;
+
+ }
+ return 0;
+}
+
+int
+Type1Font::get_dict_size(int d) const
+{
+ Type1Item *item = dict_size_item(d);
+ if (!item)
+ /* nada */;
+ else if (Type1Definition *t1d = item->cast_definition()) {
+ int num;
+ if (strstr(t1d->definer().c_str(), "dict") && t1d->value_int(num))
+ return num;
+ } else if (Type1CopyItem *copy = item->cast_copy()) {
+ String value = copy->value();
+ int pos = value.find_left(" dict");
+ if (pos >= 1 && isdigit(value[pos - 1])) {
+ while (pos >= 1 && isdigit(value[pos - 1]))
+ pos--;
+ return strtol(value.data() + pos, 0, 10);
+ }
+ }
+ return -1;
+}
+
+void
+Type1Font::set_dict_size(int d, int size)
+{
+ Type1Item *item = dict_size_item(d);
+ if (!item)
+ return;
+ if (Type1Definition *t1d = item->cast_definition()) {
+ int num;
+ if (strstr(t1d->definer().c_str(), "dict") && t1d->value_int(num))
+ t1d->set_int(size);
+ } else if (Type1CopyItem *copy = item->cast_copy()) {
+ String value = copy->value();
+ int pos = value.find_left(" dict");
+ if (pos >= 1 && isdigit(value[pos - 1])) {
+ int numpos = pos - 1;
+ while (numpos >= 1 && isdigit(value[numpos - 1]))
+ numpos--;
+ StringAccum accum;
+ accum << value.substring(0, numpos) << size << value.substring(pos);
+ copy->set_value(accum.take_string());
+ }
+ }
+}
+
+void
+Type1Font::write(Type1Writer &w)
+{
+ Type1Definition *lenIV_def = p_dict("lenIV");
+ int lenIV = 4;
+ if (lenIV_def)
+ lenIV_def->value_int(lenIV);
+ w.set_charstring_start(_charstring_definer);
+ w.set_lenIV(lenIV);
+
+ // change dict sizes
+ for (int i = dF; i < dLast; i++)
+ set_dict_size(i, _dict[i].size() + _dict_deltas[i]);
+ // XXX what if dict had nothing, but now has something?
+
+ for (int i = 0; i < _items.size(); i++)
+ _items[i]->gen(w);
+
+ w.flush();
+}
+
+void
+Type1Font::cache_defs() const
+{
+ Type1Definition *t1d = dict("FontName");
+ if (t1d)
+ t1d->value_name(_font_name);
+ _cached_defs = true;
+}
+
+MultipleMasterSpace *
+Type1Font::mmspace() const
+{
+ if (!_cached_mmspace)
+ create_mmspace();
+ return _mmspace;
+}
+
+MultipleMasterSpace *
+Type1Font::create_mmspace(ErrorHandler *errh) const
+{
+ if (_cached_mmspace)
+ return _mmspace;
+ _cached_mmspace = 1;
+
+ Type1Definition *t1d;
+
+ Vector< Vector<double> > master_positions;
+ t1d = fi_dict("BlendDesignPositions");
+ if (!t1d || !t1d->value_numvec_vec(master_positions))
+ return 0;
+
+ int nmasters = master_positions.size();
+ if (nmasters <= 0) {
+ errh->error("bad BlendDesignPositions");
+ return 0;
+ }
+ int naxes = master_positions[0].size();
+ _mmspace = new MultipleMasterSpace(font_name(), naxes, nmasters);
+ _mmspace->set_master_positions(master_positions);
+
+ Vector< Vector<double> > normalize_in, normalize_out;
+ t1d = fi_dict("BlendDesignMap");
+ if (t1d && t1d->value_normalize(normalize_in, normalize_out))
+ _mmspace->set_normalize(normalize_in, normalize_out);
+
+ Vector<PermString> axis_types;
+ t1d = fi_dict("BlendAxisTypes");
+ if (t1d && t1d->value_namevec(axis_types) && axis_types.size() == naxes)
+ for (int a = 0; a < naxes; a++)
+ _mmspace->set_axis_type(a, axis_types[a]);
+
+ int ndv, cdv;
+ Type1Charstring *cs;
+ t1d = p_dict("NDV");
+ if (t1d && t1d->value_int(ndv) && (cs = subr(ndv)))
+ _mmspace->set_ndv(*cs);
+ t1d = p_dict("CDV");
+ if (t1d && t1d->value_int(cdv) && (cs = subr(cdv)))
+ _mmspace->set_cdv(*cs);
+
+ Vector<double> design_vector;
+ t1d = dict("DesignVector");
+ if (t1d && t1d->value_numvec(design_vector))
+ _mmspace->set_design_vector(design_vector);
+
+ Vector<double> weight_vector;
+ t1d = dict("WeightVector");
+ if (t1d && t1d->value_numvec(weight_vector))
+ _mmspace->set_weight_vector(weight_vector);
+
+ if (!_mmspace->check(errh)) {
+ delete _mmspace;
+ _mmspace = 0;
+ }
+ return _mmspace;
+}
+
+void
+Type1Font::uncache_defs()
+{
+ _cached_defs = false;
+}
+
+void
+Type1Font::font_matrix(double matrix[6]) const
+{
+ Vector<double> t1d_matrix;
+ Type1Definition *t1d = dict("FontMatrix");
+ if (t1d && t1d->value_numvec(t1d_matrix) && t1d_matrix.size() == 6)
+ memcpy(&matrix[0], &t1d_matrix[0], sizeof(double) * 6);
+ else {
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+ }
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1fontskel.cc b/Build/source/utils/lcdf-typetools/libefont/t1fontskel.cc
new file mode 100644
index 00000000000..c7bdc8ed359
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1fontskel.cc
@@ -0,0 +1,412 @@
+/* t1fontskel.{cc,hh} -- Type 1 font skeleton
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1mm.hh>
+#include <lcdf/error.hh>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+namespace Efont {
+
+static const char *othersubrs_code = "% Copyright (c) 1987-1990 Adobe Systems Incorporated.\n"
+"% All Rights Reserved.\n"
+"% This code to be used for Flex and hint replacement.\n"
+"% Version 1.1\n"
+"/OtherSubrs\n"
+"[systemdict /internaldict known\n"
+"{1183615869 systemdict /internaldict get exec\n"
+"/FlxProc known {save true} {false} ifelse}\n"
+"{userdict /internaldict known not {\n"
+"userdict /internaldict\n"
+"{count 0 eq\n"
+"{/internaldict errordict /invalidaccess get exec} if\n"
+"dup type /integertype ne\n"
+"{/internaldict errordict /invalidaccess get exec} if\n"
+"dup 1183615869 eq\n"
+"{pop 0}\n"
+"{/internaldict errordict /invalidaccess get exec}\n"
+"ifelse\n"
+"}\n"
+"dup 14 get 1 25 dict put\n"
+"bind executeonly put\n"
+"} if\n"
+"1183615869 userdict /internaldict get exec\n"
+"/FlxProc known {save true} {false} ifelse}\n"
+"ifelse\n"
+"[\n"
+"systemdict /internaldict known not\n"
+"{ 100 dict /begin cvx /mtx matrix /def cvx } if\n"
+"systemdict /currentpacking known {currentpacking true setpacking} if\n"
+"{\n"
+"systemdict /internaldict known {\n"
+"1183615869 systemdict /internaldict get exec\n"
+"dup /$FlxDict known not {\n"
+"dup dup length exch maxlength eq\n"
+"{ pop userdict dup /$FlxDict known not\n"
+"{ 100 dict begin /mtx matrix def\n"
+"\n"
+"dup /$FlxDict currentdict put end } if }\n"
+"{ 100 dict begin /mtx matrix def\n"
+"dup /$FlxDict currentdict put end }\n"
+"ifelse\n"
+"} if\n"
+"/$FlxDict get begin\n"
+"} if\n"
+"grestore\n"
+"/exdef {exch def} def\n"
+"/dmin exch abs 100 div def\n"
+"/epX exdef /epY exdef\n"
+"/c4y2 exdef /c4x2 exdef /c4y1 exdef /c4x1 exdef /c4y0 exdef /c4x0 exdef\n"
+"/c3y2 exdef /c3x2 exdef /c3y1 exdef /c3x1 exdef /c3y0 exdef /c3x0 exdef\n"
+"/c1y2 exdef /c1x2 exdef /c2x2 c4x2 def /c2y2 c4y2 def\n"
+"/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt def\n"
+"/PickCoords {\n"
+"{c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2 }\n"
+"{c3x0 c3y0 c3x1 c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2 }\n"
+"ifelse\n"
+"/y5 exdef /x5 exdef /y4 exdef /x4 exdef /y3 exdef /x3 exdef\n"
+"/y2 exdef /x2 exdef /y1 exdef /x1 exdef /y0 exdef /x0 exdef\n"
+"} def\n"
+"mtx currentmatrix pop\n"
+"mtx 0 get abs .00001 lt mtx 3 get abs .00001 lt or\n"
+"{/flipXY -1 def }\n"
+"{mtx 1 get abs .00001 lt mtx 2 get abs .00001 lt or\n"
+"{/flipXY 1 def }\n"
+"{/flipXY 0 def }\n"
+"ifelse }\n"
+"ifelse\n"
+"/erosion 1 def\n"
+"systemdict /internaldict known {\n"
+"1183615869 systemdict /internaldict get exec dup\n"
+"/erosion known\n"
+"{/erosion get /erosion exch def}\n"
+"{pop}\n"
+"ifelse\n"
+"} if\n"
+"yflag\n"
+"{flipXY 0 eq c3y2 c4y2 eq or\n"
+"{false PickCoords }\n"
+"{/shrink c3y2 c4y2 eq\n"
+"{0}{c1y2 c4y2 sub c3y2 c4y2 sub div abs} ifelse def\n"
+"/yshrink {c4y2 sub shrink mul c4y2 add} def\n"
+"/c1y0 c3y0 yshrink def /c1y1 c3y1 yshrink def\n"
+"/c2y0 c4y0 yshrink def /c2y1 c4y1 yshrink def\n"
+"/c1x0 c3x0 def /c1x1 c3x1 def /c2x0 c4x0 def /c2x1 c4x1 def\n"
+"/dY 0 c3y2 c1y2 sub round\n"
+"dtransform flipXY 1 eq {exch} if pop abs def\n"
+"dY dmin lt PickCoords\n"
+"y2 c1y2 sub abs 0.001 gt {\n"
+"c1x2 c1y2 transform flipXY 1 eq {exch} if\n"
+"/cx exch def /cy exch def\n"
+"/dY 0 y2 c1y2 sub round dtransform flipXY 1 eq {exch}\n"
+"if pop def\n"
+"dY round dup 0 ne\n"
+"{/dY exdef }\n"
+"{pop dY 0 lt {-1}{1} ifelse /dY exdef }\n"
+"ifelse\n"
+"/erode PaintType 2 ne erosion 0.5 ge and def\n"
+"erode {/cy cy 0.5 sub def} if\n"
+"/ey cy dY add def\n"
+"/ey ey ceiling ey sub ey floor add def\n"
+"erode {/ey ey 0.5 add def} if\n"
+"ey cx flipXY 1 eq {exch} if itransform exch pop\n"
+"y2 sub /eShift exch def\n"
+"/y1 y1 eShift add def /y2 y2 eShift add def /y3 y3\n"
+"eShift add def\n"
+"} if\n"
+"} ifelse\n"
+"}\n"
+"{flipXY 0 eq c3x2 c4x2 eq or\n"
+"{false PickCoords }\n"
+"{/shrink c3x2 c4x2 eq\n"
+"{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs} ifelse def\n"
+"/xshrink {c4x2 sub shrink mul c4x2 add} def\n"
+"/c1x0 c3x0 xshrink def /c1x1 c3x1 xshrink def\n"
+"/c2x0 c4x0 xshrink def /c2x1 c4x1 xshrink def\n"
+"/c1y0 c3y0 def /c1y1 c3y1 def /c2y0 c4y0 def /c2y1 c4y1 def\n"
+"/dX c3x2 c1x2 sub round 0 dtransform\n"
+"flipXY -1 eq {exch} if pop abs def\n"
+"dX dmin lt PickCoords\n"
+"x2 c1x2 sub abs 0.001 gt {\n"
+"c1x2 c1y2 transform flipXY -1 eq {exch} if\n"
+"/cy exch def /cx exch def\n"
+"/dX x2 c1x2 sub round 0 dtransform flipXY -1 eq {exch} if pop def\n"
+"dX round dup 0 ne\n"
+"{/dX exdef }\n"
+"{pop dX 0 lt {-1}{1} ifelse /dX exdef }\n"
+"ifelse\n"
+"/erode PaintType 2 ne erosion .5 ge and def\n"
+"erode {/cx cx .5 sub def} if\n"
+"/ex cx dX add def\n"
+"/ex ex ceiling ex sub ex floor add def\n"
+"erode {/ex ex .5 add def} if\n"
+"ex cy flipXY -1 eq {exch} if itransform pop\n"
+"x2 sub /eShift exch def\n"
+"/x1 x1 eShift add def /x2 x2 eShift add def /x3 x3 eShift add def\n"
+"} if\n"
+"} ifelse\n"
+"} ifelse\n"
+"x2 x5 eq y2 y5 eq or\n"
+"{ x5 y5 lineto }\n"
+"{ x0 y0 x1 y1 x2 y2 curveto\n"
+"x3 y3 x4 y4 x5 y5 curveto }\n"
+"ifelse\n"
+"epY epX\n"
+"}\n"
+"systemdict /currentpacking known {exch setpacking} if\n"
+"/exec cvx /end cvx ] cvx\n"
+"executeonly\n"
+"exch\n"
+"{pop true exch restore}\n"
+"{\n"
+"systemdict /internaldict known not\n"
+"{1183615869 userdict /internaldict get exec\n"
+"exch /FlxProc exch put true}\n"
+"{1183615869 systemdict /internaldict get exec\n"
+"dup length exch maxlength eq\n"
+"{false}\n"
+"{1183615869 systemdict /internaldict get exec\n"
+"exch /FlxProc exch put true}\n"
+"ifelse}\n"
+"ifelse}\n"
+"ifelse\n"
+"{systemdict /internaldict known\n"
+"{{1183615869 systemdict /internaldict get exec /FlxProc get exec}}\n"
+"{{1183615869 userdict /internaldict get exec /FlxProc get exec}}\n"
+"ifelse executeonly\n"
+"} if\n"
+"{gsave currentpoint newpath moveto} executeonly\n"
+"{currentpoint grestore gsave currentpoint newpath moveto}\n"
+"executeonly\n"
+"{systemdict /internaldict known not\n"
+"{pop 3}\n"
+"{1183615869 systemdict /internaldict get exec\n"
+"dup /startlock known\n"
+"{/startlock get exec}\n"
+"{dup /strtlck known\n"
+"{/strtlck get exec}\n"
+"{pop 3}\n"
+"ifelse}\n"
+"ifelse}\n"
+"ifelse\n"
+"} executeonly\n"
+"] noaccess def";
+
+
+Type1Font *
+Type1Font::skeleton_make(PermString font_name, const String &version)
+{
+ Type1Font *output = new Type1Font(font_name);
+
+ // %!PS-Adobe-Font comment
+ StringAccum sa;
+ sa << "%!PS-AdobeFont-1.0: " << font_name;
+ if (version)
+ sa << ' ' << version;
+ output->add_item(new Type1CopyItem(sa.take_string()));
+
+ output->_dict_deltas[dF] = 3; // Private, FontInfo, Encoding
+ output->_dict_deltas[dP] = 3; // OtherSubrs, Subrs, CharStrings
+
+ return output;
+}
+
+void
+Type1Font::skeleton_comments_end()
+{
+ // count members of font dictionary
+ add_definition(dF, new Type1Definition("FontName", "/" + String(_font_name), "def"));
+}
+
+void
+Type1Font::skeleton_fontinfo_end()
+{
+ if (first_dict_item(Type1Font::dFI) >= 0)
+ add_item(new Type1CopyItem("end readonly def"));
+ else
+ add_item(new Type1CopyItem("% no FontInfo dict"));
+}
+
+void
+Type1Font::skeleton_fontdict_end()
+{
+ // switch to eexec
+ add_item(new Type1CopyItem("currentdict end"));
+ add_item(new Type1EexecItem(true));
+
+ // Private dictionary
+ add_definition(Type1Font::dP, Type1Definition::make_literal("-|", "{string currentfile exch readstring pop}", "executeonly def"));
+ set_charstring_definer(" -| ");
+ add_definition(Type1Font::dP, Type1Definition::make_literal("|-", "{noaccess def}", "executeonly def"));
+ add_definition(Type1Font::dP, Type1Definition::make_literal("|", "{noaccess put}", "executeonly def"));
+}
+
+void
+Type1Font::skeleton_private_end()
+{
+ add_item(new Type1CopyItem(othersubrs_code));
+
+ // Subrs
+ add_item(new Type1SubrGroupItem(this, true, "/Subrs 0 array"));
+ add_item(new Type1CopyItem("|-"));
+
+ // CharStrings
+ add_item(new Type1SubrGroupItem(this, false, "2 index /CharStrings 0 dict dup begin"));
+
+ // completion
+ add_item(new Type1CopyItem("end\n\
+end\n\
+readonly put\n\
+noaccess put\n\
+dup /FontName get exch definefont pop\n\
+mark currentfile closefile"));
+ add_item(new Type1EexecItem(false));
+ add_item(new Type1CopyItem("\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+cleartomark"));
+}
+
+void
+Type1Font::skeleton_common_subrs()
+{
+ // - first four Subrs have fixed definitions
+ // - 0: "3 0 callothersubr pop pop setcurrentpoint return"
+ set_subr(0, Type1Charstring(String::stable_string("\216\213\014\020\014\021\014\021\014\041\013", 11)), " |");
+ // - 1: "0 1 callothersubr return"
+ set_subr(1, Type1Charstring(String::stable_string("\213\214\014\020\013", 5)), " |");
+ // - 2: "0 2 callothersubr return"
+ set_subr(2, Type1Charstring(String::stable_string("\213\215\014\020\013", 5)), " |");
+ // - 3: "return"
+ set_subr(3, Type1Charstring(String::stable_string("\013", 1)), " |");
+ // - 4: "1 3 callothersubr pop callsubr return"
+ set_subr(4, Type1Charstring(String::stable_string("\214\216\014\020\014\021\012\013", 8)), " |");
+}
+
+
+static void
+add_number_def(Type1Font *output, int dict, PermString name, const Type1Font *font)
+{
+ double v;
+ if (Type1Definition *t1d = font->dict(dict, name))
+ if (t1d->value_num(v))
+ output->add_definition(dict, Type1Definition::make(name, v, "def"));
+}
+
+static void
+add_copy_def(Type1Font *output, int dict, PermString name, const Type1Font *font, const char *definer = "def")
+{
+ if (Type1Definition *t1d = font->dict(dict, name))
+ output->add_definition(dict, Type1Definition::make_literal(name, t1d->value(), definer));
+}
+
+static String
+font_dict_string(const Type1Font *font, int dict, PermString name)
+{
+ String s;
+ if (Type1Definition *d = font->dict(dict, name))
+ if (d->value_string(s))
+ return s;
+ return String();
+}
+
+Type1Font *
+Type1Font::skeleton_make_copy(const Type1Font *font, PermString font_name)
+{
+ String version = font_dict_string(font, dFI, "version");
+ Type1Font *output = skeleton_make(font_name, version);
+
+ // other comments from font header
+ for (int i = 0; i < font->nitems(); i++)
+ if (Type1CopyItem *c = font->item(i)->cast_copy()) {
+ if (c->length() > 1 && c->value()[0] == '%') {
+ if (c->value()[1] != '!')
+ output->add_item(new Type1CopyItem(c->value()));
+ } else
+ break;
+ } else
+ break;
+
+ output->skeleton_comments_end();
+
+ // FontInfo dictionary
+ if (version)
+ output->add_definition(dFI, Type1Definition::make_string("version", version, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "Notice"))
+ output->add_definition(dFI, Type1Definition::make_string("Notice", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "Copyright"))
+ output->add_definition(dFI, Type1Definition::make_string("Copyright", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "FullName"))
+ output->add_definition(dFI, Type1Definition::make_string("FullName", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "FamilyName"))
+ output->add_definition(dFI, Type1Definition::make_string("FamilyName", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "Weight"))
+ output->add_definition(dFI, Type1Definition::make_string("Weight", s, "readonly def"));
+ if (Type1Definition *t1d = font->fi_dict("isFixedPitch")) {
+ bool v;
+ if (t1d->value_bool(v))
+ output->add_definition(dFI, Type1Definition::make_literal("isFixedPitch", (v ? "true" : "false"), "def"));
+ }
+ add_number_def(output, dFI, "ItalicAngle", font);
+ add_number_def(output, dFI, "UnderlinePosition", font);
+ add_number_def(output, dFI, "UnderlineThickness", font);
+ output->skeleton_fontinfo_end();
+
+ // Encoding, other font dictionary entries
+ output->add_type1_encoding(new Type1Encoding(*font->type1_encoding()));
+ add_number_def(output, dF, "PaintType", font);
+ add_number_def(output, dF, "FontType", font);
+ add_copy_def(output, dF, "FontMatrix", font, "readonly def");
+ add_number_def(output, dF, "StrokeWidth", font);
+ add_number_def(output, dF, "UniqueID", font);
+ add_copy_def(output, dF, "XUID", font, "readonly def");
+ add_copy_def(output, dF, "FontBBox", font, "readonly def");
+ output->skeleton_fontdict_end();
+
+ // Private dictionary
+ add_copy_def(output, dP, "BlueValues", font);
+ add_copy_def(output, dP, "OtherBlues", font);
+ add_copy_def(output, dP, "FamilyBlues", font);
+ add_copy_def(output, dP, "FamilyOtherBlues", font);
+ add_number_def(output, dP, "BlueScale", font);
+ add_number_def(output, dP, "BlueShift", font);
+ add_number_def(output, dP, "BlueFuzz", font);
+ add_copy_def(output, dP, "StdHW", font);
+ add_copy_def(output, dP, "StdVW", font);
+ add_copy_def(output, dP, "StemSnapH", font);
+ add_copy_def(output, dP, "StemSnapV", font);
+ add_copy_def(output, dP, "ForceBold", font);
+ add_number_def(output, dP, "LanguageGroup", font);
+ add_number_def(output, dP, "ExpansionFactor", font);
+ add_number_def(output, dP, "UniqueID", font);
+ output->add_definition(dP, Type1Definition::make_literal("MinFeature", "{16 16}", "|-"));
+ output->add_definition(dP, Type1Definition::make_literal("password", "5839", "def"));
+ output->add_definition(dP, Type1Definition::make_literal("lenIV", "0", "def"));
+ output->skeleton_private_end();
+
+ return output;
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1interp.cc b/Build/source/utils/lcdf-typetools/libefont/t1interp.cc
new file mode 100644
index 00000000000..34f0a78be64
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1interp.cc
@@ -0,0 +1,1376 @@
+// -*- related-file-name: "../include/efont/t1interp.hh" -*-
+
+/* t1interp.{cc,hh} -- Type 1/2 charstring interpretation
+ *
+ * Copyright (c) 1998-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1interp.hh>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef WIN32
+# define random() rand()
+#endif
+
+#define CHECK_STACK(numargs) do { if (size() < numargs) return error(errUnderflow, cmd); } while (0)
+#define CHECK_STATE() do { if (_state < S_IPATH) return error(errOrdering, cmd); } while (0)
+#define CHECK_PATH_START() do { _state = S_PATH; } while (0)
+#define CHECK_PATH_END() do { if (_state == S_PATH) { act_closepath(cmd); } _state = S_IPATH; } while (0)
+
+#ifndef static_assert
+# define static_assert(c) switch (c) case 0: case (c):
+#endif
+
+namespace Efont {
+
+static const char * const error_formats[] = {
+ "charstring OK", // errOK
+ "charstring internal error in '%C'", // errInternal
+ "charstring commands past end", // errRunoff
+ "charstring command '%C' unimplemented", // errUnimplemented
+ "charstring stack overflow", // errOverflow
+ "charstring stack underflow in '%C'", // errUnderflow
+ "charstring bad vector operation in '%C'", // errVector
+ "charstring bad value in '%C'", // errValue
+ "charstring bad subroutine number %d", // errSubr
+ "charstring bad glyph number '%d'", // errGlyph
+ "charstring no current point in '%C'", // errCurrentPoint
+ "charstring flex error", // errFlex
+ "charstring multiple master error in '%C'", // errMultipleMaster
+ "charstring open stroke", // errOpenStroke
+ "charstring late sidebearing command '%C'", // errLateSidebearing
+ "charstring bad othersubr number %d", // errOthersubr
+ "charstring ordering constraints violated at '%C'", // errOrdering
+ "charstring inappropriate hintmask", // errHintmask
+ "charstring subrs nested too deep at '%d'" // errSubrDepth
+};
+
+double CharstringInterp::double_for_error;
+
+
+CharstringInterp::CharstringInterp()
+ : _error(errOK), _careful(false), _sp(0), _ps_sp(0),
+ _scratch_vector(SCRATCH_SIZE, 0), _program(0)
+{
+}
+
+CharstringInterp::CharstringInterp(const Vector<double> &weight_vector)
+ : _error(errOK), _careful(false), _sp(0), _ps_sp(0),
+ _weight_vector(weight_vector),
+ _scratch_vector(SCRATCH_SIZE, 0), _program(0)
+{
+}
+
+void
+CharstringInterp::initialize()
+{
+ clear();
+ ps_clear();
+ _lsb = _cp = _seac_origin = Point(0, 0);
+ _state = S_INITIAL;
+ _flex = false;
+ _t2nhints = 0;
+ _subr_depth = 0;
+ _done = false;
+ _error = errOK;
+}
+
+bool
+CharstringInterp::interpret(const CharstringProgram *program, const Charstring *cs)
+{
+ if (cs) {
+ initialize();
+ _program = program;
+ cs->process(*this);
+ return _error == errOK;
+ } else
+ return error(errGlyph, 0);
+}
+
+bool
+CharstringInterp::error(int err, int error_data)
+{
+ _error = err;
+ _error_data = error_data;
+ return false;
+}
+
+String
+CharstringInterp::error_string(int error, int error_data)
+{
+ static_assert(-errLastError == (sizeof(error_formats) / sizeof(error_formats[0])) - 1);
+ if (error >= 0)
+ return error_formats[0];
+ else if (error < errLastError)
+ return "charstring unknown error number " + String(error);
+ String format = error_formats[-error];
+ int percent = format.find_left('%');
+ if (percent >= 0 && format[percent + 1] == 'C')
+ return format.substring(0, percent) + Charstring::command_name(error_data) + format.substring(percent + 2);
+ else if (percent >= 0 && format[percent + 1] == 'd')
+ return format.substring(0, percent) + String(error_data) + format.substring(percent + 2);
+ else
+ return format;
+}
+
+bool
+CharstringInterp::number(double v)
+{
+ push(v);
+ return true;
+}
+
+void
+CharstringInterp::fetch_weight_vector()
+{
+ if (_program)
+ if (Vector<double> *wv = _program->mm_vector(CharstringProgram::VEC_WEIGHT, false))
+ _weight_vector = *wv;
+}
+
+bool
+CharstringInterp::vector_command(int cmd)
+{
+ CharstringProgram::VectorType which_vector;
+ int vectoroff, offset, num, i;
+ Vector<double> *v = 0;
+
+ switch (cmd) {
+
+ case Cs::cPut:
+ CHECK_STACK(2);
+ offset = (int)top(0);
+ vec(&_scratch_vector, offset) = top(1);
+ pop(2);
+ break;
+
+ case Cs::cGet:
+ CHECK_STACK(1);
+ offset = (int)top();
+ top() = vec(&_scratch_vector, offset);
+ break;
+
+ case Cs::cStore:
+ CHECK_STACK(4);
+ which_vector = (CharstringProgram::VectorType)((int)top(3));
+ vectoroff = (int)top(2);
+ offset = (int)top(1);
+ num = (int)top(0);
+ pop(4);
+
+ if (!_program)
+ return error(errVector, cmd);
+ v = _program->mm_vector(which_vector, true);
+ if (!v)
+ return error(errVector, cmd);
+
+ for (i = 0; i < num; i++, offset++, vectoroff++)
+ vec(v, vectoroff) = vec(&_scratch_vector, offset);
+ // erase our weight vector if the global weight vector has changed
+ if (which_vector == CharstringProgram::VEC_WEIGHT)
+ _weight_vector.clear();
+ break;
+
+ case Cs::cLoad:
+ CHECK_STACK(3);
+ which_vector = (CharstringProgram::VectorType)((int)top(2));
+ offset = (int)top(1);
+ num = (int)top(0);
+ pop(3);
+
+ if (!_program)
+ return error(errVector, cmd);
+ v = _program->mm_vector(which_vector, false);
+ // use our weight vector if appropriate
+ if (!v && which_vector == CharstringProgram::VEC_WEIGHT && _weight_vector.size())
+ v = &_weight_vector;
+ if (!v)
+ return error(errVector, cmd);
+
+ for (i = 0; i < num; i++, offset++)
+ vec(&_scratch_vector, offset) = vec(v, i);
+ break;
+
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+ return true;
+}
+
+bool
+CharstringInterp::blend_command()
+{
+ const int cmd = Cs::cBlend;
+ CHECK_STACK(1);
+ int nargs = (int)pop();
+
+ ensure_weight_vector();
+ if (!_weight_vector.size())
+ return error(errVector, cmd);
+
+ int nmasters = _weight_vector.size();
+ CHECK_STACK(nargs * nmasters);
+
+ int base = _sp - nargs * nmasters;
+ int off = base + nargs;
+ for (int j = 0; j < nargs; j++) {
+ double &val = _s[base + j];
+ for (int i = 1; i < nmasters; i++, off++)
+ val += _weight_vector.at_u(i) * _s[off];
+ }
+
+ pop(nargs * (nmasters - 1));
+ return true;
+}
+
+bool
+CharstringInterp::roll_command()
+{
+ const int cmd = Cs::cRoll;
+ CHECK_STACK(2);
+ int amount = (int)pop();
+ int n = (int)pop();
+ if (n <= 0)
+ return error(errValue, cmd);
+ CHECK_STACK(n);
+
+ int base = _sp - n;
+ while (amount < 0)
+ amount += n;
+
+ int i;
+ double copy_stack[STACK_SIZE];
+ for (i = 0; i < n; i++)
+ copy_stack[i] = _s[ base + (i+amount) % n ];
+ for (i = 0; i < n; i++)
+ _s[base + i] = copy_stack[i];
+
+ return true;
+}
+
+bool
+CharstringInterp::arith_command(int cmd)
+{
+ int i;
+ double d;
+
+ switch (cmd) {
+
+ case Cs::cBlend:
+ return blend_command();
+
+ case Cs::cAbs:
+ CHECK_STACK(1);
+ if (top() < 0)
+ top() = -top();
+ break;
+
+ case Cs::cAdd:
+ CHECK_STACK(1);
+ d = pop();
+ top() += d;
+ break;
+
+ case Cs::cSub:
+ CHECK_STACK(1);
+ d = pop();
+ top() -= d;
+ break;
+
+ case Cs::cDiv:
+ CHECK_STACK(2);
+ d = pop();
+ top() /= d;
+ break;
+
+ case Cs::cNeg:
+ CHECK_STACK(1);
+ top() = -top();
+ break;
+
+ case Cs::cRandom: {
+ double d;
+ do {
+ d = random() / ((double)RAND_MAX);
+ } while (d == 0);
+ push(d);
+ break;
+ }
+
+ case Cs::cMul:
+ CHECK_STACK(2);
+ d = pop();
+ top() *= d;
+ break;
+
+ case Cs::cSqrt:
+ CHECK_STACK(1);
+ if (top() < 0)
+ return error(errValue, cmd);
+ top() = sqrt(top());
+ break;
+
+ case Cs::cDrop:
+ CHECK_STACK(1);
+ pop();
+ break;
+
+ case Cs::cExch:
+ CHECK_STACK(2);
+ d = top(0);
+ top(0) = top(1);
+ top(1) = d;
+ break;
+
+ case Cs::cIndex:
+ CHECK_STACK(1);
+ i = (int)top();
+ if (i < 0)
+ return error(errValue, cmd);
+ CHECK_STACK(i + 2);
+ top() = top(i+1);
+ break;
+
+ case Cs::cRoll:
+ return roll_command();
+
+ case Cs::cDup:
+ CHECK_STACK(1);
+ push(top());
+ break;
+
+ case Cs::cAnd:
+ CHECK_STACK(2);
+ d = pop();
+ top() = (top() != 0) && (d != 0);
+ break;
+
+ case Cs::cOr:
+ CHECK_STACK(2);
+ d = pop();
+ top() = (top() != 0) || (d != 0);
+ break;
+
+ case Cs::cNot:
+ CHECK_STACK(1);
+ top() = (top() == 0);
+ break;
+
+ case Cs::cEq:
+ CHECK_STACK(2);
+ d = pop();
+ top() = (top() == d);
+ break;
+
+ case Cs::cIfelse:
+ CHECK_STACK(4);
+ if (top(1) > top(0))
+ top(3) = top(2);
+ pop(3);
+ break;
+
+ case Cs::cPop:
+ if (ps_size() < 1)
+ return error(errUnderflow, cmd);
+ push(ps_pop());
+ break;
+
+ case 15:
+ // this command is found with no explanation in JansonText-Roman
+ CHECK_STACK(2);
+ pop(2);
+ return true;
+
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+ return true;
+}
+
+bool
+CharstringInterp::callsubr_command()
+{
+ const int cmd = Cs::cCallsubr;
+ CHECK_STACK(1);
+ int which = (int)pop();
+
+ Charstring *subr_cs = get_subr(which);
+ if (!subr_cs)
+ return error(errSubr, which);
+
+ if (_subr_depth >= MAX_SUBR_DEPTH)
+ return error(errSubrDepth, which);
+ _subr_depth++;
+
+ subr_cs->process(*this);
+
+ _subr_depth--;
+ if (_error != errOK)
+ return false;
+ return !done();
+}
+
+bool
+CharstringInterp::callgsubr_command()
+{
+ const int cmd = Cs::cCallgsubr;
+ CHECK_STACK(1);
+ int which = (int)pop();
+
+ Charstring *subr_cs = get_gsubr(which);
+ if (!subr_cs)
+ return error(errSubr, which);
+
+ if (_subr_depth >= MAX_SUBR_DEPTH)
+ return error(errSubrDepth, which);
+ _subr_depth++;
+
+ subr_cs->process(*this);
+
+ _subr_depth--;
+ if (_error != errOK)
+ return false;
+ return !done();
+}
+
+bool
+CharstringInterp::mm_command(int command, int on_stack)
+{
+ ensure_weight_vector();
+ if (!_weight_vector.size())
+ return error(errVector, command);
+
+ int nargs;
+ switch (command) {
+ case Cs::othcMM1: nargs = 1; break;
+ case Cs::othcMM2: nargs = 2; break;
+ case Cs::othcMM3: nargs = 3; break;
+ case Cs::othcMM4: nargs = 4; break;
+ case Cs::othcMM6: nargs = 6; break;
+ default: return error(errInternal, command);
+ }
+
+ int nmasters = _weight_vector.size();
+ if (size() < nargs * nmasters
+ || on_stack != nargs * nmasters)
+ return error(errMultipleMaster, command);
+
+ int base = size() - on_stack;
+
+ int off = base + nargs;
+ for (int j = 0; j < nargs; j++) {
+ double &val = at(base + j);
+ for (int i = 1; i < nmasters; i++, off++)
+ val += _weight_vector.at_u(i) * at(off);
+ }
+
+ for (int i = nargs - 1; i >= 0; i--)
+ ps_push(at(base + i));
+
+ pop(on_stack);
+ return true;
+}
+
+bool
+CharstringInterp::itc_command(int command, int on_stack)
+{
+ ensure_weight_vector();
+ if (!_weight_vector.size())
+ return error(errVector, command);
+
+ int base = size() - on_stack;
+ switch (command) {
+
+ case Cs::othcITC_load: {
+ if (on_stack != 1)
+ return error(errOthersubr, command);
+ int offset = (int)at(base);
+ for (int i = 0; i < _weight_vector.size(); i++)
+ vec(&_scratch_vector, offset+i) = _weight_vector.at_u(i);
+ break;
+ }
+
+ case Cs::othcITC_put: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ int offset = (int)at(base+1);
+ vec(&_scratch_vector, offset) = at(base);
+ break;
+ }
+
+ case Cs::othcITC_get: {
+ if (on_stack != 1)
+ return error(errOthersubr, command);
+ int offset = (int)at(base);
+ ps_push(vec(&_scratch_vector, offset));
+ break;
+ }
+
+ case Cs::othcITC_add: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) + at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_sub: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) - at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_mul: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) * at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_div: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) / at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_ifelse: {
+ if (on_stack != 4)
+ return error(errOthersubr, command);
+ if (at(base+2) <= at(base+3))
+ ps_push(at(base));
+ else
+ ps_push(at(base+1));
+ break;
+ }
+
+ default:
+ return error(errOthersubr, command);
+
+ }
+
+ pop(on_stack);
+ return true;
+}
+
+
+inline void
+CharstringInterp::actp_rmoveto(int /*cmd*/, double dx, double dy)
+{
+ _cp.shift(dx, dy);
+}
+
+inline void
+CharstringInterp::actp_rlineto(int cmd, double dx, double dy)
+{
+ Point p0(_cp);
+ _cp.shift(dx, dy);
+ act_line(cmd, p0, _cp);
+}
+
+void
+CharstringInterp::actp_rrcurveto(int cmd, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3)
+{
+ Point p0(_cp);
+ Point p1(p0, dx1, dy1);
+ Point p2(p1, dx2, dy2);
+ _cp = p2.shifted(dx3, dy3);
+ act_curve(cmd, p0, p1, p2, _cp);
+}
+
+void
+CharstringInterp::actp_rrflex(int cmd, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3, double dx4, double dy4, double dx5, double dy5, double dx6, double dy6, double flex_depth)
+{
+ Point p0(_cp);
+ Point p1(p0, dx1, dy1);
+ Point p2(p1, dx2, dy2);
+ Point p3_4(p2, dx3, dy3);
+ Point p5(p3_4, dx4, dy4);
+ Point p6(p5, dx5, dy5);
+ _cp = p6.shifted(dx6, dy6);
+ act_flex(cmd, p0, p1, p2, p3_4, p5, p6, _cp, flex_depth);
+}
+
+
+bool
+CharstringInterp::callothersubr_command(int othersubrnum, int n)
+{
+ switch (othersubrnum) {
+
+ case Cs::othcFlexend:
+ if (n != 3)
+ goto unknown;
+ if (!_flex || ps_size() != 16)
+ return error(errFlex);
+ CHECK_PATH_START();
+ act_flex(Cs::cCallothersubr, Point(ps_at(0), ps_at(1)),
+ Point(ps_at(4), ps_at(5)), Point(ps_at(6), ps_at(7)),
+ Point(ps_at(8), ps_at(9)), Point(ps_at(10), ps_at(11)),
+ Point(ps_at(12), ps_at(13)), Point(ps_at(14), ps_at(15)),
+ top(2));
+ ps_clear();
+ ps_push(top(0));
+ ps_push(top(1));
+ _flex = false;
+ _state = S_PATH;
+ break;
+
+ case Cs::othcFlexbegin:
+ if (n != 0)
+ goto unknown;
+ if (_flex)
+ return error(errFlex);
+ ps_clear();
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ _flex = true;
+ _state = S_IPATH;
+ break;
+
+ case Cs::othcFlexmiddle:
+ if (n != 0)
+ goto unknown;
+ if (!_flex)
+ return error(errFlex);
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ break;
+
+ case Cs::othcReplacehints:
+ if (n != 1)
+ goto unknown;
+ ps_clear();
+ ps_push(top());
+ break;
+
+ case Cs::othcMM1:
+ case Cs::othcMM2:
+ case Cs::othcMM3:
+ case Cs::othcMM4:
+ case Cs::othcMM6:
+ return mm_command(othersubrnum, n);
+
+ case Cs::othcITC_load:
+ case Cs::othcITC_add:
+ case Cs::othcITC_sub:
+ case Cs::othcITC_mul:
+ case Cs::othcITC_div:
+ case Cs::othcITC_put:
+ case Cs::othcITC_get:
+ case Cs::othcITC_unknown:
+ case Cs::othcITC_ifelse:
+ case Cs::othcITC_random:
+ return itc_command(othersubrnum, n);
+
+ default: // unknown
+ unknown:
+ ps_clear();
+ for (int i = 0; i < n; i++)
+ ps_push(top(i));
+ break;
+
+ }
+
+ pop(n);
+ return true;
+}
+
+bool
+CharstringInterp::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cReturn:
+ return false;
+
+ case Cs::cHsbw:
+ CHECK_STACK(2);
+ if (_state > S_SEAC && _careful)
+ return error(errOrdering, cmd);
+ else {
+ _lsb = _cp = _seac_origin.shifted(at(0), 0);
+ if (_state == S_INITIAL) {
+ act_sidebearing(cmd, _lsb);
+ act_width(cmd, Point(at(1), 0));
+ }
+ if (_state <= S_SEAC)
+ _state = S_SBW;
+ }
+ break;
+
+ case Cs::cSbw:
+ CHECK_STACK(4);
+ if (_state > S_SEAC && _careful)
+ return error(errOrdering, cmd);
+ else {
+ _lsb = _cp = _seac_origin.shifted(at(0), at(1));
+ if (_state == S_INITIAL) {
+ act_sidebearing(cmd, _lsb);
+ act_width(cmd, Point(at(2), at(3)));
+ }
+ if (_state <= S_SEAC)
+ _state = S_SBW;
+ }
+ break;
+
+ case Cs::cSeac:
+ CHECK_STACK(5);
+ if (_state > S_SBW)
+ return error(errOrdering, cmd);
+ act_seac(cmd, at(0), at(1), at(2), (int)at(3), (int)at(4));
+ clear();
+ return false;
+
+ case Cs::cCallsubr:
+ return callsubr_command();
+
+ case Cs::cCallothersubr: {
+ CHECK_STACK(2);
+ int othersubrnum = (int)top(0);
+ int n = (int)top(1);
+ pop(2);
+ if (othersubrnum < 0 || size() < n)
+ return error(errOthersubr, cmd);
+ return callothersubr_command(othersubrnum, n);
+ }
+
+ case Cs::cPut:
+ case Cs::cGet:
+ case Cs::cStore:
+ case Cs::cLoad:
+ return vector_command(cmd);
+
+ case Cs::cBlend:
+ case Cs::cAbs:
+ case Cs::cAdd:
+ case Cs::cSub:
+ case Cs::cDiv:
+ case Cs::cNeg:
+ case Cs::cRandom:
+ case Cs::cMul:
+ case Cs::cSqrt:
+ case Cs::cDrop:
+ case Cs::cExch:
+ case Cs::cIndex:
+ case Cs::cRoll:
+ case Cs::cDup:
+ case Cs::cAnd:
+ case Cs::cOr:
+ case Cs::cNot:
+ case Cs::cEq:
+ case Cs::cIfelse:
+ case Cs::cPop:
+ return arith_command(cmd);
+
+ case Cs::cHlineto:
+ CHECK_STACK(1);
+ CHECK_PATH_START();
+ actp_rlineto(cmd, at(0), 0);
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK(1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(0), 0);
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK(4);
+ CHECK_PATH_START();
+ actp_rrcurveto(cmd, at(0), 0, at(1), at(2), 0, at(3));
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK(2);
+ CHECK_PATH_START();
+ actp_rlineto(cmd, at(0), at(1));
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK(2);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(0), at(1));
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK(6);
+ CHECK_PATH_START();
+ actp_rrcurveto(cmd, at(0), at(1), at(2), at(3), at(4), at(5));
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK(4);
+ CHECK_PATH_START();
+ actp_rrcurveto(cmd, 0, at(0), at(1), at(2), at(3), 0);
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK(1);
+ CHECK_PATH_START();
+ actp_rlineto(cmd, 0, at(0));
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK(1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, 0, at(0));
+ break;
+
+ case Cs::cDotsection:
+ break;
+
+ case Cs::cHstem:
+ CHECK_STACK(2);
+ act_hstem(cmd, _lsb.y + at(0), at(1));
+ break;
+
+ case Cs::cHstem3:
+ CHECK_STACK(6);
+ act_hstem3(cmd, _lsb.y + at(0), at(1), _lsb.y + at(2), at(3), _lsb.y + at(4), at(5));
+ break;
+
+ case Cs::cVstem:
+ CHECK_STACK(2);
+ act_vstem(cmd, _lsb.x + at(0), at(1));
+ break;
+
+ case Cs::cVstem3:
+ CHECK_STACK(6);
+ act_vstem3(cmd, _lsb.x + at(0), at(1), _lsb.x + at(2), at(3), _lsb.x + at(4), at(5));
+ break;
+
+ case Cs::cSetcurrentpoint:
+ CHECK_STACK(2);
+ _cp = Point(at(0), at(1));
+ break;
+
+ case Cs::cClosepath:
+ CHECK_PATH_END();
+ break;
+
+ case Cs::cEndchar:
+ CHECK_PATH_END();
+ set_done();
+ return false;
+
+ case Cs::cError:
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+ clear();
+ return error() >= 0;
+}
+
+
+#undef DEBUG_TYPE2
+
+int
+CharstringInterp::type2_handle_width(int cmd, bool have_width)
+{
+ _cp = _lsb = _seac_origin;
+ if (_state != S_INITIAL)
+ /* ignore width */;
+ else if (have_width)
+ act_nominal_width_delta(cmd, at(0));
+ else
+ act_default_width(cmd);
+ return (have_width ? 1 : 0);
+}
+
+bool
+CharstringInterp::type2_command(int cmd, const uint8_t *data, int *left)
+{
+ int bottom = 0;
+
+#ifdef DEBUG_TYPE2
+ fprintf(stderr, "%s [%d/%d]\n", Charstring::command_name(cmd).c_str(), _t2nhints, size());
+#endif
+
+ switch (cmd) {
+
+ case Cs::cHstem:
+ case Cs::cHstemhm:
+ CHECK_STACK(2);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, (size() % 2) == 1);
+ if (_state > S_HSTEM)
+ return error(errOrdering, cmd);
+ _state = S_HSTEM;
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_hstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ break;
+
+ case Cs::cVstem:
+ case Cs::cVstemhm:
+ CHECK_STACK(2);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, (size() % 2) == 1);
+ if (_state > S_VSTEM)
+ return error(errOrdering, cmd);
+ _state = S_VSTEM;
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_vstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ break;
+
+ case Cs::cHintmask:
+ case Cs::cCntrmask:
+ if (_state <= S_SEAC && size() >= 1) {
+ bottom = type2_handle_width(cmd, (size() % 2) == 1);
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_hstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ }
+ if ((_state == S_HSTEM || _state == S_VSTEM) && size() >= 2)
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_vstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ if (_state < S_HINTMASK)
+ _state = S_HINTMASK;
+ if (_t2nhints == 0)
+ return error(errHintmask, cmd);
+ if (!data || !left)
+ return error(errInternal, cmd);
+ if (((_t2nhints - 1) >> 3) + 1 > *left)
+ return error(errRunoff, cmd);
+ act_hintmask(cmd, data, _t2nhints);
+ *left -= ((_t2nhints - 1) >> 3) + 1;
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK(2);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 2);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(bottom), at(bottom + 1));
+#if DEBUG_TYPE2
+ bottom += 2;
+#endif
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK(1);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(bottom), 0);
+#if DEBUG_TYPE2
+ bottom++;
+#endif
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK(1);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, 0, at(bottom));
+#if DEBUG_TYPE2
+ bottom++;
+#endif
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK(2);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 1 < size(); bottom += 2)
+ actp_rlineto(cmd, at(bottom), at(bottom + 1));
+ break;
+
+ case Cs::cHlineto:
+ CHECK_STACK(1);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom < size()) {
+ actp_rlineto(cmd, at(bottom++), 0);
+ if (bottom < size())
+ actp_rlineto(cmd, 0, at(bottom++));
+ }
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK(1);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom < size()) {
+ actp_rlineto(cmd, 0, at(bottom++));
+ if (bottom < size())
+ actp_rlineto(cmd, at(bottom++), 0);
+ }
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK(6);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 5 < size(); bottom += 6)
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), at(bottom + 4), at(bottom + 5));
+ break;
+
+ case Cs::cHhcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ if (size() % 2 == 1) {
+ actp_rrcurveto(cmd, at(bottom + 1), at(bottom), at(bottom + 2), at(bottom + 3), at(bottom + 4), 0);
+ bottom += 5;
+ }
+ for (; bottom + 3 < size(); bottom += 4)
+ actp_rrcurveto(cmd, at(bottom), 0, at(bottom + 1), at(bottom + 2), at(bottom + 3), 0);
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom + 3 < size()) {
+ double dx3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, at(bottom), 0, at(bottom + 1), at(bottom + 2), dx3, at(bottom + 3));
+ bottom += 4;
+ if (bottom + 3 < size()) {
+ double dy3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, 0, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), dy3);
+ bottom += 4;
+ }
+ }
+#if DEBUG_TYPE2
+ if (bottom + 1 == size())
+ bottom++;
+#endif
+ break;
+
+ case Cs::cRcurveline:
+ CHECK_STACK(8);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 7 < size(); bottom += 6)
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), at(bottom + 4), at(bottom + 5));
+ actp_rlineto(cmd, at(bottom), at(bottom + 1));
+#if DEBUG_TYPE2
+ bottom += 2;
+#endif
+ break;
+
+ case Cs::cRlinecurve:
+ CHECK_STACK(8);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 7 < size(); bottom += 2)
+ actp_rlineto(cmd, at(bottom), at(bottom + 1));
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), at(bottom + 4), at(bottom + 5));
+#if DEBUG_TYPE2
+ bottom += 6;
+#endif
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom + 3 < size()) {
+ double dy3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, 0, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), dy3);
+ bottom += 4;
+ if (bottom + 3 < size()) {
+ double dx3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, at(bottom), 0, at(bottom + 1), at(bottom + 2), dx3, at(bottom + 3));
+ bottom += 4;
+ }
+ }
+#if DEBUG_TYPE2
+ if (bottom + 1 == size())
+ bottom++;
+#endif
+ break;
+
+ case Cs::cVvcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ if (size() % 2 == 1) {
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), 0, at(bottom + 4));
+ bottom += 5;
+ }
+ for (; bottom + 3 < size(); bottom += 4)
+ actp_rrcurveto(cmd, 0, at(bottom), at(bottom + 1), at(bottom + 2), 0, at(bottom + 3));
+ break;
+
+ case Cs::cFlex:
+ CHECK_STACK(13);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), at(5),
+ at(6), at(7), at(8), at(9), at(10), at(11),
+ at(12));
+#if DEBUG_TYPE2
+ bottom += 13;
+#endif
+ break;
+
+ case Cs::cHflex:
+ CHECK_STACK(7);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ actp_rrflex(cmd,
+ at(0), 0, at(1), at(2), at(3), 0,
+ at(4), 0, at(5), -at(2), at(6), 0,
+ 50);
+#if DEBUG_TYPE2
+ bottom += 7;
+#endif
+ break;
+
+ case Cs::cHflex1:
+ CHECK_STACK(9);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), 0,
+ at(5), 0, at(6), at(7), at(8), -(at(1) + at(3) + at(7)),
+ 50);
+#if DEBUG_TYPE2
+ bottom += 9;
+#endif
+ break;
+
+ case Cs::cFlex1: {
+ CHECK_STACK(11);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ double dx = at(0) + at(2) + at(4) + at(6) + at(8);
+ double dy = at(1) + at(3) + at(5) + at(7) + at(9);
+ if (fabs(dx) > fabs(dy))
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), at(5),
+ at(6), at(7), at(8), at(9), at(10), -dy,
+ 50);
+ else
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), at(5),
+ at(6), at(7), at(8), at(9), -dx, at(10),
+ 50);
+ break;
+#if DEBUG_TYPE2
+ bottom += 11;
+#endif
+ }
+
+ case Cs::cEndchar:
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 0 && size() != 4);
+ if (bottom + 3 < size() && _state == S_INITIAL)
+ act_seac(cmd, 0, at(bottom), at(bottom + 1), (int)at(bottom + 2), (int)at(bottom + 3));
+ CHECK_PATH_END();
+ set_done();
+ clear();
+ return false;
+
+ case Cs::cReturn:
+ return false;
+
+ case Cs::cCallsubr:
+ return callsubr_command();
+
+ case Cs::cCallgsubr:
+ return callgsubr_command();
+
+ case Cs::cPut:
+ case Cs::cGet:
+ case Cs::cStore:
+ case Cs::cLoad:
+ return vector_command(cmd);
+
+ case Cs::cBlend:
+ case Cs::cAbs:
+ case Cs::cAdd:
+ case Cs::cSub:
+ case Cs::cDiv:
+ case Cs::cNeg:
+ case Cs::cRandom:
+ case Cs::cMul:
+ case Cs::cSqrt:
+ case Cs::cDrop:
+ case Cs::cExch:
+ case Cs::cIndex:
+ case Cs::cRoll:
+ case Cs::cDup:
+ case Cs::cAnd:
+ case Cs::cOr:
+ case Cs::cNot:
+ case Cs::cEq:
+ case Cs::cIfelse:
+ case Cs::cPop:
+ return arith_command(cmd);
+
+ case Cs::cDotsection:
+ break;
+
+ case Cs::cError:
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+#if DEBUG_TYPE2
+ if (bottom != size())
+ fprintf(stderr, "[left %d on stack] ", size() - bottom);
+#endif
+
+ clear();
+ return error() >= 0;
+}
+
+
+void
+CharstringInterp::act_sidebearing(int, const Point &)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_width(int, const Point &)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_default_width(int cmd)
+{
+ double d = (_program ? _program->global_width_x(false) : UNKDOUBLE);
+ if (KNOWN(d))
+ act_width(cmd, Point(d, 0));
+}
+
+void
+CharstringInterp::act_nominal_width_delta(int cmd, double delta)
+{
+ double d = (_program ? _program->global_width_x(true) : UNKDOUBLE);
+ if (KNOWN(d))
+ act_width(cmd, Point(d + delta, 0));
+}
+
+void
+CharstringInterp::act_seac(int cmd, double asb, double adx, double ady, int bchar, int achar)
+{
+ Charstring *acs = 0, *bcs = 0;
+ if (achar < 0 || achar >= 256 || bchar < 0 || bchar >= 256
+ || !_program || _program->parent_program()
+ || !(acs = get_glyph(Charstring::standard_encoding[achar]))
+ || !(bcs = get_glyph(Charstring::standard_encoding[bchar]))) {
+ error(errGlyph, cmd);
+ return;
+ }
+
+ Point apos = Point(adx + _lsb.x - asb, ady + _lsb.y);
+ Point save_lsb = _lsb;
+ Point save_seac_origin = _seac_origin;
+
+ CharstringInterp::initialize();
+ _seac_origin = apos;
+ _state = S_SEAC;
+ acs->process(*this);
+ if (error() == errOK) {
+ CharstringInterp::initialize();
+ _seac_origin = save_seac_origin;
+ _state = S_SEAC;
+ bcs->process(*this);
+ }
+
+ _lsb = save_lsb;
+}
+
+void
+CharstringInterp::act_line(int cmd, const Point &p0, const Point &p1)
+{
+ act_curve(cmd, p0, p0, p1, p1);
+}
+
+void
+CharstringInterp::act_curve(int cmd, const Point &, const Point &, const Point &, const Point &)
+{
+ error(errUnimplemented, cmd);
+}
+
+void
+CharstringInterp::act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth)
+{
+ (void) flex_depth;
+ act_curve(cmd, p0, p1, p2, p3_4);
+ act_curve(cmd, p3_4, p5, p6, p7);
+}
+
+void
+CharstringInterp::act_closepath(int)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_hstem(int, double, double)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_vstem(int, double, double)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_hstem3(int cmd, double y0, double dy0, double y1, double dy1, double y2, double dy2)
+{
+ act_hstem(cmd, y0, dy0);
+ act_hstem(cmd, y1, dy1);
+ act_hstem(cmd, y2, dy2);
+}
+
+void
+CharstringInterp::act_vstem3(int cmd, double x0, double dx0, double x1, double dx1, double x2, double dx2)
+{
+ act_vstem(cmd, x0, dx0);
+ act_vstem(cmd, x1, dx1);
+ act_vstem(cmd, x2, dx2);
+}
+
+void
+CharstringInterp::act_hintmask(int, const uint8_t *, int)
+{
+ /* do nothing */
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1item.cc b/Build/source/utils/lcdf-typetools/libefont/t1item.cc
new file mode 100644
index 00000000000..3387535a07d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1item.cc
@@ -0,0 +1,861 @@
+// -*- related-file-name: "../include/efont/t1item.hh" -*-
+
+/* t1item.{cc,hh} -- items in a Type 1 font
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1interp.hh>
+#include <efont/t1font.hh>
+#include <lcdf/strtonum.h>
+#include <ctype.h>
+#include <string.h>
+#include <sys/stat.h>
+#ifndef WIN32
+# include <unistd.h>
+#endif
+#ifdef BROKEN_STRTOD
+# define strtod good_strtod
+#endif
+namespace Efont {
+
+/*****
+ * Type1NullItem
+ **/
+
+void
+Type1NullItem::gen(Type1Writer &)
+{
+}
+
+/*****
+ * Type1CopyItem
+ **/
+
+void
+Type1CopyItem::gen(Type1Writer &w)
+{
+ w << _value << '\n';
+}
+
+
+/*****
+ * Type1EexecItem
+ **/
+
+void
+Type1EexecItem::gen(Type1Writer &w)
+{
+ if (_eexec_on)
+ w << "currentfile eexec\n";
+ w.switch_eexec(_eexec_on);
+}
+
+
+/*****
+ * Type1Definition
+ **/
+
+typedef Vector<double> NumVector;
+
+
+Type1Definition::Type1Definition(PermString n, const String &v, PermString d)
+ : _name(n), _val(v), _definer(d)
+{
+ _val.c_str(); // ensure it ends with '\0'
+}
+
+Type1Definition *
+Type1Definition::make_string(PermString n, const String &v, PermString d)
+{
+ Type1Definition *t1d = new Type1Definition(n, "", d);
+ t1d->set_string(v);
+ return t1d;
+}
+
+int
+Type1Definition::slurp_string(StringAccum &accum, int pos, Type1Reader *reader)
+{
+ int paren_level = 0;
+ char *s = accum.data() + pos;
+
+ do {
+ switch (*s++) {
+ case '(': paren_level++; break;
+ case ')': paren_level--; break;
+ case '\\': if (paren_level && *s) s++; break;
+ case 0:
+ if (!reader) return -1;
+ pos = s - accum.data();
+ accum.append('\n'); // add \n
+ if (!reader->next_line(accum)) return -1;
+ accum.c_str(); // ensure null termination
+ s = accum.data() + pos;
+ break;
+ }
+ } while (paren_level);
+
+ return s - accum.data();
+}
+
+int
+Type1Definition::slurp_proc(StringAccum &accum, int pos, Type1Reader *reader)
+{
+ int paren_level = 0;
+ int brace_level = 0;
+ char *s = accum.data() + pos;
+
+ do {
+ switch (*s++) {
+ case '{': if (!paren_level) brace_level++; break;
+ case '}': if (!paren_level) brace_level--; break;
+ case '(': paren_level++; break;
+ case ')': paren_level--; break;
+ case '\\': if (paren_level && *s) s++; break;
+ case '%':
+ if (!paren_level)
+ while (*s != '\n' && *s != '\r' && *s)
+ s++;
+ break;
+ case 0:
+ if (!reader) return -1;
+ pos = s - accum.data();
+ accum.append('\n'); // add \n
+ if (!reader->next_line(accum)) return -1;
+ accum.c_str(); // ensure null termination
+ s = accum.data() + pos;
+ break;
+ }
+ } while (brace_level);
+
+ return s - accum.data();
+}
+
+Type1Definition *
+Type1Definition::make(StringAccum &accum, Type1Reader *reader,
+ bool force_definition)
+{
+ char *s = accum.data();
+ while (isspace(*s))
+ s++;
+ if (*s != '/')
+ return 0;
+ s++;
+ int name_start_pos = s - accum.data();
+
+ // find NAME LENGTH
+ while (!isspace(*s) && *s != '[' && *s != '{' && *s != '('
+ && *s != ']' && *s != '}' && *s != ')' && *s)
+ s++;
+ if (!*s)
+ return 0;
+ int name_end_pos = s - accum.data();
+
+ while (isspace(*s))
+ s++;
+ int val_pos = s - accum.data();
+ int val_end_pos = -1;
+ bool check_def = false;
+
+ if (*s == '}' || *s == ']' || *s == ')' || *s == 0)
+ return 0;
+
+ else if (*s == '(')
+ val_end_pos = slurp_string(accum, val_pos, reader);
+
+ else if (*s == '{')
+ val_end_pos = slurp_proc(accum, val_pos, reader);
+
+ else if (*s == '[') {
+ int brack_level = 0;
+ do {
+ switch (*s++) {
+ case '[': brack_level++; break;
+ case ']': brack_level--; break;
+ case '(': case ')': case 0: return 0;
+ }
+ } while (brack_level);
+ val_end_pos = s - accum.data();
+
+ } else {
+ while (!isspace(*s) && *s)
+ s++;
+ val_end_pos = s - accum.data();
+ if (!force_definition) check_def = true;
+ }
+
+ if (val_end_pos < 0)
+ return 0;
+ s = accum.data() + val_end_pos;
+ while (isspace(*s))
+ s++;
+ if (check_def && (s[0] != 'd' || s[1] != 'e' || s[2] != 'f'))
+ if (strncmp(s, "dict def", 8) != 0)
+ return 0;
+
+ PermString name(accum.data()+name_start_pos, name_end_pos - name_start_pos);
+ PermString def(s, accum.length() - (s - accum.data()));
+ String value = String(accum.data() + val_pos, val_end_pos - val_pos);
+ return new Type1Definition(name, value, def);
+}
+
+void
+Type1Definition::gen(Type1Writer &w)
+{
+ w << '/' << _name << ' ' << _val << ' ' << _definer << '\n';
+}
+
+void
+Type1Definition::gen(StringAccum &sa)
+{
+ sa << '/' << _name << ' ' << _val << ' ' << _definer;
+}
+
+
+bool
+Type1Definition::value_bool(bool &b) const
+{
+ if (_val == "true") {
+ b = true;
+ return true;
+ } else if (_val == "false") {
+ b = false;
+ return true;
+ } else
+ return false;
+}
+
+bool
+Type1Definition::value_int(int &i) const
+{
+ char *s;
+ i = strtol(_val.data(), &s, 10);
+ return (*s == 0);
+}
+
+bool
+Type1Definition::value_num(double &d) const
+{
+ char *s;
+ d = strtonumber(_val.data(), &s);
+ return (*s == 0);
+}
+
+bool
+Type1Definition::value_string(String &str) const
+{
+ if (_val.length() == 0 || _val[0] != '(' || _val.back() != ')')
+ return false;
+ StringAccum sa;
+ int pos, first_pos = 1, len = _val.length() - 1;
+ for (pos = 1; pos < len; pos++)
+ if (_val[pos] == '\\') {
+ sa.append(_val.data() + first_pos, pos - first_pos);
+ pos++;
+ switch (pos < len ? _val[pos] : -1) {
+ case '\r':
+ pos++;
+ if (pos < len && _val[pos] == '\n')
+ pos++;
+ break;
+ case '\n':
+ pos++;
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7': {
+ int c = _val[pos++] - '0';
+ for (int i = 1; pos < len && i < 3 && _val[pos] >= '0' && _val[pos] <= '7'; i++, pos++)
+ c = (c << 3) | (_val[pos] - '0');
+ sa.append((char) c);
+ break;
+ }
+ case 'n':
+ sa << '\n';
+ pos++;
+ break;
+ case 'r':
+ sa << '\r';
+ pos++;
+ break;
+ case 't':
+ sa << '\t';
+ pos++;
+ break;
+ case 'b':
+ sa << '\b';
+ pos++;
+ break;
+ case 'f':
+ sa << '\f';
+ pos++;
+ break;
+ default:
+ sa << _val[pos];
+ pos++;
+ break;
+ }
+ first_pos = pos;
+ }
+ sa.append(_val.data() + first_pos, len - first_pos);
+ str = sa.take_string();
+ return true;
+}
+
+bool
+Type1Definition::value_name(PermString &str) const
+{
+ if (_val.length() == 0 || _val[0] != '/')
+ return false;
+ int pos;
+ for (pos = 1; pos < _val.length(); pos++)
+ if (isspace(_val[pos]) || _val[pos] == '/')
+ return false;
+ str = PermString(_val.data() + 1, pos - 1);
+ return true;
+}
+
+static bool
+strtonumvec(const char *f, const char **endf, NumVector &v)
+{
+ v.clear();
+ char *s = (char *)f;
+ if (*s != '[' && *s != '{')
+ return false;
+ s++;
+ while (1) {
+ while (isspace(*s))
+ s++;
+ if (isdigit(*s) || *s == '.' || *s == '-')
+ v.push_back( strtonumber(s, &s) );
+ else {
+ if (endf)
+ *endf = s + 1;
+ return (*s == ']' || *s == '}');
+ }
+ }
+}
+
+bool
+Type1Definition::value_numvec(NumVector &v) const
+{
+ return strtonumvec(_val.data(), 0, v);
+}
+
+static bool
+strtonumvec_vec(const char *f, const char **endf, Vector<NumVector> &v)
+{
+ v.clear();
+ const char *s = f;
+ if (*s != '[' && *s != '{')
+ return false;
+ s++;
+ while (1) {
+ while (isspace(*s))
+ s++;
+ if (*s == '[' || *s == '{') {
+ NumVector subv;
+ if (!strtonumvec(s, &s, subv))
+ return false;
+ v.push_back(subv);
+ } else {
+ if (endf)
+ *endf = s + 1;
+ return (*s == ']' || *s == '}');
+ }
+ }
+}
+
+bool
+Type1Definition::value_numvec_vec(Vector<NumVector> &v) const
+{
+ return strtonumvec_vec(_val.data(), 0, v);
+}
+
+bool
+Type1Definition::value_normalize(Vector<NumVector> &in,
+ Vector<NumVector> &out) const
+{
+ in.clear();
+ out.clear();
+ const char *s = _val.data();
+ if (*s++ != '[')
+ return false;
+ while (1) {
+ while (isspace(*s))
+ s++;
+ if (*s == '[') {
+ Vector<NumVector> sub;
+ if (!strtonumvec_vec(s, &s, sub))
+ return false;
+
+ NumVector subin;
+ NumVector subout;
+ for (int i = 0; i < sub.size(); i++)
+ if (sub[i].size() == 2) {
+ subin.push_back(sub[i][0]);
+ subout.push_back(sub[i][1]);
+ } else
+ return false;
+ in.push_back(subin);
+ out.push_back(subout);
+ } else
+ return (*s == ']');
+ }
+}
+
+bool
+Type1Definition::value_namevec(Vector<PermString> &v) const
+{
+ v.clear();
+ const char *s = _val.data();
+ if (*s++ != '[')
+ return false;
+ while (1) {
+ while (isspace(*s))
+ s++;
+ if (*s == '/')
+ s++;
+ if (isalnum(*s)) {
+ const char *start = s;
+ while (*s && !isspace(*s) && *s != ']' && *s != '/')
+ s++;
+ v.push_back(PermString(start, s - start));
+ } else
+ return (*s == ']');
+ }
+}
+
+
+void
+Type1Definition::set_bool(bool b)
+{
+ set_val(b ? "true" : "false");
+}
+
+void
+Type1Definition::set_int(int i)
+{
+ set_val(String(i));
+}
+
+void
+Type1Definition::set_num(double n)
+{
+ set_val(String(n));
+}
+
+void
+Type1Definition::set_string(const String &v)
+{
+ const char *s = v.data();
+ int len = v.length();
+ int left = 0;
+ StringAccum sa;
+ sa << '(';
+ for (int pos = 0; pos < len; pos++)
+ if ((s[pos] < ' ' && !isspace(s[pos])) || ((unsigned char)s[pos]) > 0176 || s[pos] == '(' || s[pos] == ')' || s[pos] == '\\') {
+ sa << v.substring(left, pos - left) << '\\';
+ if (s[pos] == '(' || s[pos] == ')' || s[pos] == '\\')
+ sa << s[pos];
+ else
+ sprintf(sa.reserve(8), "%03o", (unsigned char) (s[pos]));
+ left = pos + 1;
+ }
+ sa << v.substring(left) << ')';
+ _val = sa.take_string();
+}
+
+void
+Type1Definition::set_name(PermString str, bool name)
+{
+ StringAccum sa;
+ if (name)
+ sa << '/';
+ sa << str;
+ set_val(sa);
+}
+
+static void
+accum_numvec(StringAccum &sa, const NumVector &nv, bool executable)
+{
+ char open = (executable ? '{' : '[');
+ for (int i = 0; i < nv.size(); i++)
+ sa << (i ? ' ' : open) << nv[i];
+ sa << (executable ? '}' : ']');
+}
+
+void
+Type1Definition::set_numvec(const NumVector &nv, bool executable)
+{
+ StringAccum sa;
+ accum_numvec(sa, nv, executable);
+ set_val(sa);
+}
+
+void
+Type1Definition::set_numvec_vec(const Vector<NumVector> &nv)
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < nv.size(); i++)
+ accum_numvec(sa, nv[i], false);
+ sa << ']';
+ set_val(sa);
+}
+
+void
+Type1Definition::set_normalize(const Vector<NumVector> &vin,
+ const Vector<NumVector> &vout)
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < vin.size(); i++) {
+ const NumVector &vini = vin[i];
+ const NumVector &vouti = vout[i];
+ sa << '[';
+ for (int j = 0; j < vini.size(); j++)
+ sa << '[' << vini[j] << ' ' << vouti[j] << ']';
+ sa << ']';
+ }
+ sa << ']';
+ set_val(sa);
+}
+
+void
+Type1Definition::set_namevec(const Vector<PermString> &v, bool executable)
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < v.size(); i++) {
+ if (i) sa << ' ';
+ if (executable) sa << '/';
+ sa << v[i];
+ }
+ sa << ']';
+ set_val(sa);
+}
+
+
+/*****
+ * Type1Encoding
+ **/
+
+static PermString::Initializer initializer;
+static PermString dot_notdef(".notdef");
+
+
+Type1Encoding::Type1Encoding()
+ : _v(new PermString[256]), _copy_of(0), _definer("readonly def")
+{
+ for (int i = 0; i < 256; i++)
+ _v[i] = dot_notdef;
+}
+
+Type1Encoding::Type1Encoding(const Type1Encoding &o)
+ : Type1Item(), _definer(o._definer)
+{
+ if (o._copy_of) {
+ _v = o._v;
+ _copy_of = o._copy_of;
+ } else {
+ _v = new PermString[256];
+ _copy_of = 0;
+ for (int i = 0; i < 256; i++)
+ _v[i] = o._v[i];
+ }
+}
+
+Type1Encoding::Type1Encoding(Type1Encoding *copy_of)
+ : _v(copy_of->_v), _copy_of(copy_of), _definer(copy_of->_definer)
+{
+}
+
+Type1Encoding::~Type1Encoding()
+{
+ if (!_copy_of)
+ delete[] _v;
+}
+
+void
+Type1Encoding::unshare()
+{
+ if (_copy_of) {
+ PermString *new_v = new PermString[256];
+ memcpy(new_v, _v, sizeof(PermString) * 256);
+ _v = new_v;
+ _copy_of = 0;
+ }
+}
+
+void
+Type1Encoding::clear()
+{
+ unshare();
+ for (int i = 0; i < 256; i++)
+ _v[i] = dot_notdef;
+}
+
+
+static Type1Encoding *canonical_standard_encoding;
+
+Type1Encoding *
+Type1Encoding::standard_encoding()
+{
+ if (!canonical_standard_encoding) {
+ canonical_standard_encoding = new Type1Encoding;
+ for (int i = 0; i < 256; i++)
+ if (Charstring::standard_encoding[i])
+ canonical_standard_encoding->put(i, Charstring::standard_encoding[i]);
+ }
+ // Return a copy of the cached encoding. When it's deleted, we won't be.
+ return new Type1Encoding(canonical_standard_encoding);
+}
+
+
+void
+Type1Encoding::gen(Type1Writer &w)
+{
+ if (_copy_of && _copy_of == canonical_standard_encoding)
+ w << "/Encoding StandardEncoding def\n";
+ else {
+ w << "/Encoding 256 array\n0 1 255 {1 index exch /.notdef put} for\n";
+ for (int i = 0; i < 256; i++)
+ if (_v[i] != dot_notdef)
+ w << "dup " << i << " /" << _v[i] << " put\n";
+ w << _definer << '\n';
+ }
+}
+
+
+/*****
+ * Type1Subr
+ **/
+
+Type1Subr::Type1Subr(PermString n, int num, PermString definer,
+ int lenIV, const String &s)
+ : _name(n), _subrno(num), _definer(definer), _cs(lenIV, s)
+{
+}
+
+Type1Subr::Type1Subr(PermString n, int num, PermString definer,
+ const Type1Charstring &t1cs)
+ : _name(n), _subrno(num), _definer(definer), _cs(t1cs)
+{
+}
+
+Type1Subr *
+Type1Subr::make(const char *s_in, int s_len, int cs_pos, int cs_len, int lenIV)
+{
+ /* USAGE NOTE: You must ensure that s_in contains a valid subroutine string
+ before calling Type1Subr::make. Type1Reader::was_charstring() is a good
+ guarantee of this.
+ A valid subroutine string is one of the following:
+ /[char_name] ### charstring_start ........
+ dup [subrno] ### charstring_start .... */
+
+ const char *s = s_in;
+ PermString name;
+ int subrno = 0;
+
+ // Force literal spaces rather than isspace().
+ if (*s == '/') {
+ const char *nstart = ++s;
+ while (!isspace(*s) && *s)
+ s++;
+ name = PermString(nstart, s - nstart);
+
+ } else {
+ // dup [subrno] ...
+ s += 3;
+ while (isspace(*s))
+ s++;
+ subrno = strtol(s, (char **)&s, 10);
+ }
+
+ s = s_in + cs_pos;
+
+ // Lazily decrypt the charstring.
+ PermString definer = PermString(s + cs_len, s_len - cs_len - cs_pos);
+ return new Type1Subr(name, subrno, definer, lenIV, String(s, cs_len));
+}
+
+Type1Subr *
+Type1Subr::make_subr(int subrno, const Type1Charstring &cs, PermString definer)
+{
+ return new Type1Subr(PermString(), subrno, definer, cs);
+}
+
+Type1Subr *
+Type1Subr::make_glyph(PermString glyph, const Type1Charstring &cs, PermString definer)
+{
+ return new Type1Subr(glyph, -1, definer, cs);
+}
+
+
+void
+Type1Subr::gen(Type1Writer &w)
+{
+ int len = _cs.length();
+ const unsigned char *data = _cs.data();
+
+ if (is_subr())
+ w << "dup " << _subrno << ' ' << len + w.lenIV() << w.charstring_start();
+ else
+ w << '/' << _name << ' ' << len + w.lenIV() << w.charstring_start();
+
+ if (w.lenIV() < 0) {
+ // lenIV < 0 means charstrings are unencrypted
+ w.print((const char *)data, len);
+
+ } else {
+ // PERFORMANCE NOTE: Putting the charstring in a buffer of known length
+ // and printing that buffer rather than one char at a time is an OK
+ // optimization. (around 10%)
+ unsigned char *buf = new unsigned char[len + w.lenIV()];
+ unsigned char *t = buf;
+
+ int r = t1R_cs;
+ for (int i = 0; i < w.lenIV(); i++) {
+ unsigned char c = (unsigned char)(r >> 8);
+ *t++ = c;
+ r = ((c + r) * t1C1 + t1C2) & 0xFFFF;
+ }
+ for (int i = 0; i < len; i++, data++) {
+ unsigned char c = (*data ^ (r >> 8));
+ *t++ = c;
+ r = ((c + r) * t1C1 + t1C2) & 0xFFFF;
+ }
+
+ w.print((char *)buf, len + w.lenIV());
+ delete[] buf;
+ }
+
+ w << _definer << '\n';
+}
+
+/*****
+ * Type1SubrGroupItem
+ **/
+
+Type1SubrGroupItem::Type1SubrGroupItem(Type1Font *font, bool is_subrs, const String &value)
+ : _font(font), _is_subrs(is_subrs), _value(value)
+{
+}
+
+Type1SubrGroupItem::Type1SubrGroupItem(const Type1SubrGroupItem &from, Type1Font *font)
+ : _font(font), _is_subrs(from._is_subrs),
+ _value(from._value), _end_text(from._end_text)
+{
+}
+
+void
+Type1SubrGroupItem::add_end_text(const String &s)
+{
+ _end_text += s + "\n";
+}
+
+void
+Type1SubrGroupItem::gen(Type1Writer &w)
+{
+ Type1Font *font = _font;
+
+ int pos = _value.find_left(_is_subrs ? " array" : " dict");
+ if (pos >= 1 && isdigit(_value[pos - 1])) {
+ int numpos = pos - 1;
+ while (numpos >= 1 && isdigit(_value[numpos - 1]))
+ numpos--;
+
+ int n;
+ if (_is_subrs) {
+ n = font->nsubrs();
+ while (n && !font->subr(n - 1))
+ n--;
+ } else
+ n = font->nglyphs();
+
+ w << _value.substring(0, numpos) << n << _value.substring(pos);
+ } else
+ w << _value;
+
+ w << '\n';
+
+ if (_is_subrs) {
+ int count = font->nsubrs();
+ for (int i = 0; i < count; i++)
+ if (Type1Subr *g = font->subr_x(i))
+ g->gen(w);
+ } else {
+ int count = font->nglyphs();
+ for (int i = 0; i < count; i++)
+ if (Type1Subr *g = font->glyph_x(i))
+ g->gen(w);
+ }
+
+ w << _end_text;
+}
+
+/*****
+ * Type1IncludedFont
+ **/
+
+Type1IncludedFont::Type1IncludedFont(Type1Font *font, int unique_id)
+ : _included_font(font), _unique_id(unique_id)
+{
+}
+
+Type1IncludedFont::~Type1IncludedFont()
+{
+ delete _included_font;
+}
+
+void
+Type1IncludedFont::gen(Type1Writer &w)
+{
+ FILE *f = tmpfile();
+ if (!f)
+ return;
+
+ // write included font
+ Type1PFAWriter new_w(f);
+ _included_font->write(new_w);
+ fflush(f);
+
+ struct stat s;
+ fstat(fileno(f), &s);
+
+ w << "FontDirectory /" << _included_font->font_name() << " known{\n"
+ << "/" << _included_font->font_name()
+ << " findfont dup /UniqueID known {dup /UniqueID get "
+ << _unique_id
+ << " eq exch /FontType get 1 eq and}{pop false}ifelse {\nsave userdict/fbufstr 512 string put\n"
+ << (int)(s.st_size / 512)
+ << "{currentfile fbufstr readstring{pop}{clear currentfile\nclosefile/fontdownload/unexpectedEOF/.error cvx exec}ifelse}repeat\ncurrentfile "
+ << (int)(s.st_size % 512)
+ << " string readstring{pop}{clear currentfile\nclosefile/fontdownload/unexpectedEOF/.error cvx exec}ifelse\nrestore}if}if\n";
+
+ rewind(f);
+ char str[2048];
+ while (1) {
+ int r = fread(str, 1, 2048, f);
+ if (r <= 0)
+ break;
+ w.print(str, r);
+ }
+
+ fclose(f);
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1mm.cc b/Build/source/utils/lcdf-typetools/libefont/t1mm.cc
new file mode 100644
index 00000000000..8efd6857720
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1mm.cc
@@ -0,0 +1,392 @@
+// -*- related-file-name: "../include/efont/t1mm.hh" -*-
+
+/* t1mm.{cc,hh} -- Type 1 multiple master font information
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1mm.hh>
+#include <efont/t1interp.hh>
+#include <lcdf/error.hh>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+namespace Efont {
+
+MultipleMasterSpace::MultipleMasterSpace(PermString fn, int na, int nm)
+ : _ok(false), _font_name(fn), _naxes(na), _nmasters(nm),
+ _axis_types(na, PermString()), _axis_labels(na, PermString()),
+ _design_vector(0), _norm_design_vector(0), _weight_vector(0)
+{
+}
+
+
+void
+MultipleMasterSpace::set_master_positions(const Vector<NumVector> &mp)
+{
+ _master_positions = mp;
+}
+
+void
+MultipleMasterSpace::set_normalize(const Vector<NumVector> &nin,
+ const Vector<NumVector> &nout)
+{
+ _normalize_in = nin;
+ _normalize_out = nout;
+}
+
+void
+MultipleMasterSpace::set_axis_type(int ax, PermString t)
+{
+ _axis_types[ax] = t;
+}
+
+void
+MultipleMasterSpace::set_axis_label(int ax, PermString t)
+{
+ _axis_labels[ax] = t;
+}
+
+void
+MultipleMasterSpace::set_design_vector(const NumVector &v)
+{
+ _default_design_vector = v;
+}
+
+void
+MultipleMasterSpace::set_weight_vector(const NumVector &v)
+{
+ _default_weight_vector = v;
+}
+
+
+PermString
+MultipleMasterSpace::axis_abbreviation(PermString atype)
+{
+ if (atype == "Weight")
+ return "wt";
+ else if (atype == "Width")
+ return "wd";
+ else if (atype == "OpticalSize")
+ return "op";
+ else if (atype == "Style")
+ return "st";
+ else
+ return atype;
+}
+
+
+bool
+MultipleMasterSpace::error(ErrorHandler *errh, const char *s, ...) const
+{
+ if (errh) {
+ char buf[1024];
+ va_list val;
+ va_start(val, s);
+ assert(strlen(s) < 800);
+ sprintf(buf, (s[0] == ' ' ? "%.200s%s" : "%.200s: %s"),
+ _font_name.c_str(), s);
+ errh->verror(ErrorHandler::ERR_ERROR, String(), buf, val);
+ va_end(val);
+ }
+ return false;
+}
+
+
+bool
+MultipleMasterSpace::check(ErrorHandler *errh)
+{
+ if (_ok)
+ return true;
+
+ if (_nmasters <= 0 || _nmasters > 16)
+ return error(errh, "number of masters must be between 1 and 16");
+ if (_naxes <= 0 || _naxes > 4)
+ return error(errh, "number of axes must be between 1 and 4");
+
+ if (_master_positions.size() != _nmasters)
+ return error(errh, "bad BlendDesignPositions");
+ for (int i = 0; i < _nmasters; i++)
+ if (_master_positions[i].size() != _naxes)
+ return error(errh, "inconsistent BlendDesignPositions");
+
+ if (_normalize_in.size() != _naxes || _normalize_out.size() != _naxes)
+ return error(errh, "bad BlendDesignMap");
+ for (int i = 0; i < _naxes; i++)
+ if (_normalize_in[i].size() != _normalize_out[i].size())
+ return error(errh, "bad BlendDesignMap");
+
+ if (!_axis_types.size())
+ _axis_types.assign(_naxes, PermString());
+ if (_axis_types.size() != _naxes)
+ return error(errh, "bad BlendAxisTypes");
+
+ if (!_axis_labels.size())
+ _axis_labels.assign(_naxes, PermString());
+ if (_axis_labels.size() != _naxes)
+ return error(errh, "bad axis labels");
+
+ if (!_default_design_vector.size())
+ _default_design_vector.assign(_naxes, UNKDOUBLE);
+ if (_default_design_vector.size() != _naxes)
+ return error(errh, "inconsistent design vector");
+
+ if (!_default_weight_vector.size())
+ _default_weight_vector.assign(_nmasters, UNKDOUBLE);
+ if (_default_weight_vector.size() != _nmasters)
+ return error(errh, "inconsistent weight vector");
+
+ _ok = true;
+ return true;
+}
+
+bool
+MultipleMasterSpace::check_intermediate(ErrorHandler *errh)
+{
+ if (!_ok || _cdv)
+ return true;
+
+ for (int a = 0; a < _naxes; a++)
+ for (int m = 0; m < _nmasters; m++)
+ if (_master_positions[m][a] != 0 && _master_positions[m][a] != 1) {
+ if (errh)
+ errh->warning("%s requires intermediate master conversion programs",
+ _font_name.c_str());
+ return false;
+ }
+
+ return true;
+}
+
+
+int
+MultipleMasterSpace::axis(PermString ax) const
+{
+ for (int a = 0; a < _naxes; a++)
+ if (_axis_types[a] == ax || _axis_labels[a] == ax)
+ return a;
+ return -1;
+}
+
+double
+MultipleMasterSpace::axis_low(int ax) const
+{
+ return _normalize_in[ax][0];
+}
+
+double
+MultipleMasterSpace::axis_high(int ax) const
+{
+ return _normalize_in[ax].back();
+}
+
+
+Vector<double>
+MultipleMasterSpace::empty_design_vector() const
+{
+ return Vector<double>(_naxes, UNKDOUBLE);
+}
+
+bool
+MultipleMasterSpace::set_design(NumVector &design_vector, int ax, double value,
+ ErrorHandler *errh) const
+{
+ if (ax < 0 || ax >= _naxes)
+ return error(errh, " has only %d axes", _naxes);
+
+ if (value < axis_low(ax)) {
+ value = axis_low(ax);
+ if (errh)
+ errh->warning("raising %s's %s to %g", _font_name.c_str(),
+ _axis_types[ax].c_str(), value);
+ }
+ if (value > axis_high(ax)) {
+ value = axis_high(ax);
+ if (errh)
+ errh->warning("lowering %s's %s to %g", _font_name.c_str(),
+ _axis_types[ax].c_str(), value);
+ }
+
+ design_vector[ax] = value;
+ return true;
+}
+
+bool
+MultipleMasterSpace::set_design(NumVector &design_vector, PermString ax_name,
+ double val, ErrorHandler *errh) const
+{
+ int ax = axis(ax_name);
+ if (ax < 0)
+ return error(errh, " has no `%s' axis", ax_name.c_str());
+ else
+ return set_design(design_vector, ax, val, errh);
+}
+
+
+bool
+MultipleMasterSpace::normalize_vector(ErrorHandler *errh) const
+{
+ NumVector &design = *_design_vector;
+ NumVector &norm_design = *_norm_design_vector;
+
+ for (int a = 0; a < _naxes; a++)
+ if (!KNOWN(design[a])) {
+ if (errh)
+ errh->error("must specify %s's %s coordinate", _font_name.c_str(), _axis_types[a].c_str());
+ return false;
+ }
+
+ // Move to normalized design coordinates.
+ norm_design.assign(_naxes, UNKDOUBLE);
+
+ if (_ndv) {
+ CharstringInterp ai;
+ if (!ai.interpret(this, &_ndv))
+ return error(errh, "%s in NDV program", ai.error_string().c_str());
+
+ } else
+ for (int a = 0; a < _naxes; a++) {
+ double d = design[a];
+ double nd = UNKDOUBLE;
+ const Vector<double> &norm_in = _normalize_in[a];
+ const Vector<double> &norm_out = _normalize_out[a];
+
+ if (d < norm_in[0])
+ nd = norm_out[0];
+ for (int i = 1; i < norm_in.size(); i++)
+ if (d >= norm_in[i-1] && d < norm_in[i]) {
+ nd = norm_out[i-1]
+ + ((d - norm_in[i-1])
+ * (norm_out[i] - norm_out[i-1])
+ / (norm_in[i] - norm_in[i-1]));
+ goto done;
+ }
+ if (d >= norm_in.back())
+ nd = norm_out.back();
+
+ done:
+ norm_design[a] = nd;
+ }
+
+ for (int a = 0; a < _naxes; a++)
+ if (!KNOWN(norm_design[a]))
+ return error(errh, "bad normalization");
+
+ return true;
+}
+
+
+bool
+MultipleMasterSpace::convert_vector(ErrorHandler *errh) const
+{
+ NumVector &norm_design = *_norm_design_vector;
+ NumVector &weight = *_weight_vector;
+
+ weight.assign(_nmasters, 1);
+
+ if (_cdv) {
+ CharstringInterp ai;
+ if (!ai.interpret(this, &_cdv))
+ return error(errh, "%s in CDV program", ai.error_string().c_str());
+
+ } else
+ for (int a = 0; a < _naxes; a++)
+ for (int m = 0; m < _nmasters; m++) {
+ if (_master_positions[m][a] == 0)
+ weight[m] *= 1 - norm_design[a];
+ else if (_master_positions[m][a] == 1)
+ weight[m] *= norm_design[a];
+ else
+ return error(errh, " requires intermediate master conversion programs");
+ }
+
+ return true;
+}
+
+
+bool
+MultipleMasterSpace::design_to_norm_design(const NumVector &design_in,
+ NumVector &norm_design,
+ ErrorHandler *errh) const
+{
+ NumVector design(design_in);
+ NumVector weight;
+
+ _design_vector = &design;
+ _norm_design_vector = &norm_design;
+ _weight_vector = &weight;
+ if (!normalize_vector(errh))
+ return false;
+ _design_vector = _norm_design_vector = _weight_vector = 0;
+
+ return true;
+}
+
+
+bool
+MultipleMasterSpace::design_to_weight(const NumVector &design_in, NumVector &weight, ErrorHandler *errh) const
+{
+ NumVector design(design_in);
+ NumVector norm_design;
+
+ bool dirty = false;
+ for (int i = 0; i < _naxes; i++)
+ if (design[i] != _default_design_vector[i])
+ dirty = true;
+
+ if (dirty) {
+ _design_vector = &design;
+ _norm_design_vector = &norm_design;
+ _weight_vector = &weight;
+ if (!normalize_vector(errh))
+ return false;
+ if (!convert_vector(errh))
+ return false;
+ _design_vector = _norm_design_vector = _weight_vector = 0;
+ } else
+ weight = _default_weight_vector;
+
+ double sum = 0;
+ for (int m = 0; m < _nmasters; m++)
+ sum += weight[m];
+ if (sum < 0.9999 || sum > 1.0001)
+ return error(errh, "bad conversion: weight vector doesn't sum to 1");
+
+ // adjust weight vector to max 4 decimal digits of precision, and make it
+ // sum to exactly 1
+ sum = 0;
+ for (int m = 0; m < _nmasters - 1; m++) {
+ weight[m] = floor(weight[m] * 10000. + 0.5) / 10000.;
+ sum += weight[m];
+ }
+ weight[_nmasters - 1] = 1 - sum;
+
+ return true;
+}
+
+
+Vector<double> *
+MultipleMasterSpace::mm_vector(VectorType t, bool writable) const
+{
+ if (t == VEC_WEIGHT)
+ return _weight_vector;
+ else if (t == VEC_NORM_DESIGN)
+ return _norm_design_vector;
+ else if (t == VEC_DESIGN && !writable)
+ return _design_vector;
+ else
+ return 0;
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1rw.cc b/Build/source/utils/lcdf-typetools/libefont/t1rw.cc
new file mode 100644
index 00000000000..2264ace804d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1rw.cc
@@ -0,0 +1,610 @@
+// -*- related-file-name: "../include/efont/t1rw.hh" -*-
+
+/* t1rw.{cc,hh} -- Type 1 font reading and writing
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1rw.hh>
+#include <efont/t1cs.hh>
+#include <lcdf/straccum.hh>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+namespace Efont {
+
+unsigned char Type1Reader::xvalue_store[257];
+unsigned char *Type1Reader::xvalue = &Type1Reader::xvalue_store[1];
+
+void
+Type1Reader::static_initialize()
+{
+ if (xvalue['A'])
+ return;
+ // rely on static data being initialized to 0
+ xvalue['0'] = 0; xvalue['1'] = 1; xvalue['2'] = 2; xvalue['3'] = 3;
+ xvalue['4'] = 4; xvalue['5'] = 5; xvalue['6'] = 6; xvalue['7'] = 7;
+ xvalue['8'] = 8; xvalue['9'] = 9;
+ xvalue['A'] = 10; xvalue['B'] = 11; xvalue['C'] = 12; xvalue['D'] = 13;
+ xvalue['E'] = 14; xvalue['F'] = 15;
+ xvalue['a'] = 10; xvalue['b'] = 11; xvalue['c'] = 12; xvalue['d'] = 13;
+ xvalue['e'] = 14; xvalue['f'] = 15;
+}
+
+
+Type1Reader::Type1Reader()
+ : _data(new unsigned char[DATA_SIZE]), _len(0), _pos(0),
+ _ungot(-1), _eexec(false)
+{
+ static_initialize();
+}
+
+Type1Reader::~Type1Reader()
+{
+ delete[] _data;
+}
+
+
+void
+Type1Reader::set_charstring_definer(PermString x)
+{
+ _charstring_definer = x;
+}
+
+void
+Type1Reader::switch_eexec(bool on, unsigned char *data, int len)
+{
+ if (on) {
+ if (_pos < len + 3) {
+ unsigned char *new_data = new unsigned char[len + 3 + DATA_SIZE];
+ assert(_len <= DATA_SIZE);
+ memcpy(new_data + len + 3, _data + _pos, _len - _pos);
+ _len = len + 3 + _len - _pos;
+ _pos = len + 3;
+ delete[] _data;
+ _data = new_data;
+ }
+ int original_pos = _pos;
+ // don't forget _ungot!!
+ if (_ungot >= 0)
+ _data[--_pos] = _ungot, _ungot = -1;
+ if (_crlf == 0 || _crlf == 2)
+ _data[--_pos] = '\n';
+ if (_crlf == 1 || _crlf == 2)
+ _data[--_pos] = '\r';
+ memcpy(_data + _pos - len, data, len);
+ _pos -= len;
+ start_eexec(original_pos - _pos);
+ }
+ _eexec = on;
+}
+
+
+int
+Type1Reader::more_data()
+{
+ _pos = 0;
+ _len = more_data(_data, DATA_SIZE);
+ if (_len < 0)
+ return -1;
+ else
+ return _data[_pos++];
+}
+
+
+inline int
+Type1Reader::get_base()
+{
+ if (_pos >= _len)
+ return more_data();
+ else
+ return _data[_pos++];
+}
+
+
+inline int
+Type1Reader::eexec(int c)
+{
+ unsigned char answer = (unsigned char)(c ^ (_r >> 8));
+ _r = (((unsigned char)c + _r) * t1C1 + t1C2) & 0xFFFF;
+ return answer;
+}
+
+
+int
+Type1Reader::ascii_eexec_get()
+{
+ int d1 = get_base();
+ while (isspace(d1))
+ d1 = get_base();
+
+ int d2 = get_base();
+ while (isspace(d2))
+ d2 = get_base();
+ if (d2 < 0)
+ return -1;
+
+ return eexec((xvalue[d1] << 4) | (xvalue[d2]));
+}
+
+
+inline int
+Type1Reader::get()
+{
+ if (!_eexec)
+ return get_base();
+
+ else if (_binary_eexec) {
+ int c = get_base();
+ return c < 0 ? c : eexec(c);
+
+ } else
+ return ascii_eexec_get();
+}
+
+
+void
+Type1Reader::start_eexec(int initial_ascii)
+{
+ /* God damn this _ungot thing!! It makes sense not to check it on every
+ char fetch, since it can only be set at the end of next_line; therefore,
+ only the first get() into a user-visible function might need to check
+ _ungot. The problem is I forgot start_eexec() was such a function! */
+ int c = _ungot < 0 ? get_base() : _ungot;
+ initial_ascii--;
+ _ungot = -1;
+
+ /* Strictly speaking, I should look for whitespace even in binary sections
+ of PFB fonts; but it turns out some PFBs would be unreadable with that
+ pedantic rule. */
+ while (isspace(c) && (initial_ascii >= 0 || !preserve_whitespace()))
+ c = get_base(), initial_ascii--;
+
+ /* Differentiate between ASCII eexec and binary eexec. */
+ int rand_bytes[4];
+ _binary_eexec = false;
+ for (int i = 0; i < 4; i++) {
+ if (i)
+ c = get_base();
+ rand_bytes[i] = c;
+ if (!isxdigit(c))
+ _binary_eexec = true;
+ }
+
+ _r = t1R_ee;
+ if (_binary_eexec)
+ for (int i = 0; i < 4; i++)
+ eexec(rand_bytes[i]);
+ else {
+ for (int i = 0; i < 2; i++) {
+ c = xvalue[rand_bytes[i*2]] * 16 + xvalue[rand_bytes[i*2+1]];
+ eexec(c);
+ }
+ ascii_eexec_get();
+ ascii_eexec_get();
+ }
+}
+
+
+bool
+Type1Reader::test_charstring(StringAccum &str)
+{
+ /* PERFORMANCE NOTE: This function is definitely a bottleneck. Making it
+ more efficient cut time by about 40%. */
+
+ if (!_charstring_definer)
+ return false;
+ if (_charstring_len >= 0)
+ return str.length() <= _charstring_start + _charstring_len;
+
+ str.append('\0'); // protect against running off end of string
+ char *s = str.data();
+ char *start;
+ while (*s == ' ')
+ s++;
+
+ if (s[0] == '/')
+ s++;
+ else if (s[0] == 'd' && s[1] == 'u' && s[2] == 'p' && isspace(s[3])) {
+ s += 4;
+ // 17.Jan.2000 -- some fonts have extra space here.
+ while (isspace(*s))
+ s++;
+ } else
+ goto not_charstring;
+
+ // Force one literal space rather than isspace().
+ // Why? Consistency: we force 1 literal space around _charstring_definer.
+ while (*s != ' ' && *s)
+ s++;
+ if (*s++ != ' ' || !isdigit(*s))
+ goto not_charstring;
+ start = s;
+ s++;
+ while (*s != ' ' && *s)
+ s++;
+ if (strncmp(s, _charstring_definer.c_str(), _charstring_definer.length()) != 0)
+ goto not_charstring;
+
+ _charstring_len = strtol(start, 0, 10);
+ _charstring_start = (s - str.data()) + _charstring_definer.length();
+ str.pop_back();
+ return str.length() <= _charstring_start + _charstring_len;
+
+ not_charstring:
+ str.pop_back();
+ return false;
+}
+
+
+/* PERFORMANCE NOTE: All kinds of speedup tricks tried with eexec -- buffering
+ (doing eexec processing at more_data time), etc., and all this stuff -- and
+ found to have essentially zero effect for PFB fonts. Now, it might be
+ effective for PFAs; but who cares? I hate PFAs. */
+
+bool
+Type1Reader::next_line(StringAccum &s)
+{
+ if (_len < 0)
+ return false;
+
+ // Can't be a charstring if incoming accumulator has nonzero length.
+ _charstring_start = 0;
+ _charstring_len = (s.length() > 0 ? 0 : -1);
+
+ int first_char = _ungot < 0 ? get() : _ungot;
+ _ungot = -1;
+
+ for (int c = first_char; c >= 0; c = get())
+ switch (c) {
+
+ case '\n':
+ if (test_charstring(s))
+ goto normal;
+ else {
+ _crlf = 0;
+ goto done;
+ }
+
+ case '\r':
+ // check for \r\n (counts as only one line ending)
+ if (test_charstring(s))
+ goto normal;
+ c = get();
+ if (c != '\n' || preserve_whitespace())
+ _ungot = c, _crlf = 1;
+ else
+ _crlf = 2;
+ goto done;
+
+ normal:
+ default:
+ s.append((char)c);
+ break;
+
+ }
+
+ done:
+ return true;
+}
+
+
+int
+Type1Reader::get_data(unsigned char *data, int len)
+{
+ if (_len < 0)
+ return -1;
+ if (len <= 0)
+ return 0;
+
+ int pos = 0;
+ if (_ungot >= 0) {
+ *data++ = _ungot;
+ pos++;
+ _ungot = -1;
+ }
+
+ for (; pos < len; pos++) {
+ int c = get();
+ if (c < 0)
+ break;
+ *data++ = c;
+ }
+
+ return pos;
+}
+
+
+/*****
+ * Type1PFAReader
+ **/
+
+Type1PFAReader::Type1PFAReader(FILE *f)
+ : _f(f)
+{
+}
+
+int
+Type1PFAReader::more_data(unsigned char *data, int len)
+{
+ size_t size = fread(data, 1, len, _f);
+ return size ? (int)size : -1;
+}
+
+
+/*****
+ * Type1PFBReader
+ **/
+
+Type1PFBReader::Type1PFBReader(FILE *f)
+ : _f(f), _binary(false), _left(0)
+{
+}
+
+int
+Type1PFBReader::more_data(unsigned char *data, int len)
+{
+ while (_left == 0) {
+ int c = getc(_f);
+ if (c != 128)
+ return -1;
+
+ c = getc(_f);
+ if (c == 3 || c < 1 || c > 3)
+ return -1;
+ _binary = (c == 2);
+
+ _left = getc(_f);
+ _left |= getc(_f) << 8;
+ _left |= getc(_f) << 16;
+ _left |= getc(_f) << 24;
+ }
+
+ if (_left < 0)
+ return -1;
+
+ if (len > _left)
+ len = _left;
+ _left -= len;
+
+ return fread(data, 1, len, _f);
+}
+
+bool
+Type1PFBReader::preserve_whitespace() const
+{
+ return _binary;
+}
+
+
+/*****
+ * Type1SubsetReader
+ **/
+
+Type1SubsetReader::Type1SubsetReader(Type1Reader *r, int left)
+ : _reader(r), _left(left)
+{
+}
+
+int
+Type1SubsetReader::more_data(unsigned char *data, int len)
+{
+ if (_left <= 0)
+ return -1;
+ if (len > _left)
+ len = _left;
+ int how_much = _reader->get_data(data, len);
+ if (how_much > 0)
+ _left -= how_much;
+ return how_much;
+}
+
+bool
+Type1SubsetReader::preserve_whitespace() const
+{
+ return _reader->preserve_whitespace();
+}
+
+
+/*****
+ * Writer
+ **/
+
+Type1Writer::Type1Writer()
+ : _buf(new unsigned char[BufSize]), _pos(0),
+ _eexec(false), _eexec_start(-1), _eexec_end(-1), _lenIV(4)
+{
+}
+
+
+Type1Writer::~Type1Writer()
+{
+ assert(!_pos);
+ delete[] _buf;
+}
+
+
+inline unsigned char
+Type1Writer::eexec(int p)
+{
+ unsigned char c = ((unsigned char)p ^ (_r >> 8)) & 0xFF;
+ _r = ((c + _r) * t1C1 + t1C2) & 0xFFFF;
+ return c;
+}
+
+
+void
+Type1Writer::flush()
+{
+ local_flush();
+}
+
+
+/* PERFORMANCE NOTE: Doing eexec processing during flush -- which streamlines
+ code for the print() methods -- seems to save some time (4-5%). It also
+ makes write performance more consistent. But I have mixed feelings. */
+
+void
+Type1Writer::local_flush()
+{
+ if (_eexec_start >= 0 && _eexec_end < 0)
+ _eexec_end = _pos;
+ for (int p = _eexec_start; p < _eexec_end; p++)
+ _buf[p] = eexec(_buf[p]);
+ print0(_buf, _pos);
+ _pos = 0;
+ _eexec_start = _eexec ? 0 : -1;
+ _eexec_end = -1;
+}
+
+
+void
+Type1Writer::print(const char *s, int n)
+{
+ while (n > 0) {
+ if (_pos >= BufSize)
+ local_flush();
+ int copy = BufSize - _pos;
+ if (copy > n) copy = n;
+ memcpy(_buf + _pos, s, copy);
+ _pos += copy;
+ s += copy;
+ n -= copy;
+ }
+}
+
+
+Type1Writer &
+Type1Writer::operator<<(int x)
+{
+ char str[128];
+ sprintf(str, "%d", x);
+ print(str, strlen(str));
+ return *this;
+}
+
+
+Type1Writer &
+Type1Writer::operator<<(double x)
+{
+ char str[256];
+ sprintf(str, "%g", x);
+ print(str, strlen(str));
+ return *this;
+}
+
+
+void
+Type1Writer::switch_eexec(bool on)
+{
+ _eexec = on;
+ if (_eexec) {
+ _eexec_start = _pos;
+ _r = t1R_ee;
+ print("SUCK", 4);
+ } else
+ _eexec_end = _pos;
+}
+
+
+/*****
+ * Type1PFAWriter
+ **/
+
+Type1PFAWriter::Type1PFAWriter(FILE *f)
+ : _f(f), _hex_line(0)
+{
+}
+
+Type1PFAWriter::~Type1PFAWriter()
+{
+ flush();
+}
+
+
+void
+Type1PFAWriter::switch_eexec(bool on)
+{
+ flush();
+ _hex_line = 0;
+ Type1Writer::switch_eexec(on);
+}
+
+void
+Type1PFAWriter::print0(const unsigned char *c, int l)
+{
+ if (eexecing()) {
+ const char *hex = "0123456789ABCDEF";
+ for (; l; c++, l--) {
+ putc(hex[*c / 16], _f);
+ putc(hex[*c % 16], _f);
+ if (++_hex_line == 39) {
+ putc('\n', _f);
+ _hex_line = 0;
+ }
+ }
+ } else
+ fwrite(c, 1, l, _f);
+}
+
+
+/*****
+ * Type1PFBWriter
+ **/
+
+Type1PFBWriter::Type1PFBWriter(FILE *f)
+ : _f(f), _binary(false)
+{
+}
+
+Type1PFBWriter::~Type1PFBWriter()
+{
+ flush();
+ fputc(128, _f);
+ fputc(3, _f);
+}
+
+void
+Type1PFBWriter::flush()
+{
+ Type1Writer::flush();
+ if (_save.length()) {
+ fputc(128, _f);
+ fputc(_binary ? 2 : 1, _f);
+ long l = _save.length();
+ fputc(l & 0xFF, _f);
+ fputc((l >> 8) & 0xFF, _f);
+ fputc((l >> 16) & 0xFF, _f);
+ fputc((l >> 24) & 0xFF, _f);
+ fwrite(_save.data(), 1, _save.length(), _f);
+ _save.clear();
+ }
+}
+
+void
+Type1PFBWriter::switch_eexec(bool on)
+{
+ flush();
+ Type1Writer::switch_eexec(on);
+ _binary = on;
+}
+
+void
+Type1PFBWriter::print0(const unsigned char *c, int l)
+{
+ char *m = _save.extend(l);
+ memcpy(m, c, l);
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/libefont/t1unparser.cc b/Build/source/utils/lcdf-typetools/libefont/t1unparser.cc
new file mode 100644
index 00000000000..dd214cad13a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/libefont/t1unparser.cc
@@ -0,0 +1,137 @@
+// -*- related-file-name: "../include/efont/t1unparser.hh" -*-
+
+/* t1unparser.{cc,hh} -- debug printing of Type 1 fonts
+ *
+ * Copyright (c) 1998-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1unparser.hh>
+namespace Efont {
+
+CharstringUnparser::CharstringUnparser()
+ : CharstringInterp(),
+ _one_command_per_line(false), _start_of_line(true)
+{
+}
+
+CharstringUnparser::CharstringUnparser(const CharstringUnparser &o)
+ : CharstringInterp(o),
+ _one_command_per_line(o._one_command_per_line),
+ _start_of_line(o._start_of_line)
+{
+}
+
+void
+CharstringUnparser::clear()
+{
+ _sa.clear();
+ _start_of_line = true;
+}
+
+bool
+CharstringUnparser::number(double n)
+{
+ if (_start_of_line) {
+ _sa << _indent;
+ _start_of_line = false;
+ } else
+ _sa << ' ';
+ _sa << n;
+ return true;
+}
+
+bool
+CharstringUnparser::type1_command(int cmd)
+{
+ if (_start_of_line) {
+ _sa << _indent;
+ _start_of_line = false;
+ } else
+ _sa << ' ';
+ if (cmd >= 0 && cmd <= Cs::cLastCommand)
+ _sa << Cs::command_names[cmd];
+ else
+ _sa << "UNKNOWN_12_" << (cmd - 32);
+ if (_one_command_per_line) {
+ _sa << '\n';
+ _start_of_line = true;
+ }
+ return true;
+}
+
+bool
+CharstringUnparser::type2_command(int cmd, const unsigned char *data, int *left)
+{
+ if (_start_of_line) {
+ _sa << _indent;
+ _start_of_line = false;
+ } else
+ _sa << ' ';
+
+ if (cmd >= 0 && cmd <= Cs::cLastCommand)
+ _sa << Cs::command_names[cmd];
+ else
+ _sa << "UNKNOWN_12_" << (cmd - 32);
+
+ switch (cmd) {
+ case Cs::cHstem: case Cs::cHstemhm: case Cs::cVstem: case Cs::cVstemhm:
+ case Cs::cHintmask: case Cs::cCntrmask:
+ CharstringInterp::type2_command(cmd, data, left);
+ break;
+ }
+
+ if (_one_command_per_line) {
+ _sa << '\n';
+ _start_of_line = true;
+ }
+
+ return true;
+}
+
+void
+CharstringUnparser::act_hintmask(int, const unsigned char *data, int nhints)
+{
+ _sa << '[';
+ for (int i = 0; i < nhints; i++, data++)
+ sprintf(_sa.extend(2), "%02X", *data);
+ _sa << ']';
+}
+
+String
+CharstringUnparser::value()
+{
+ _start_of_line = true;
+ return _sa.take_string();
+}
+
+String
+CharstringUnparser::unparse(const Charstring *cs)
+{
+ if (cs) {
+ CharstringUnparser u;
+ u.interpret(0, cs);
+ return u.value();
+ } else
+ return "(null)";
+}
+
+String
+CharstringUnparser::unparse(const Charstring &cs)
+{
+ CharstringUnparser u;
+ u.interpret(0, &cs);
+ return u.value();
+}
+
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/Makefile.am b/Build/source/utils/lcdf-typetools/liblcdf/Makefile.am
new file mode 100644
index 00000000000..d42083c1de4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/Makefile.am
@@ -0,0 +1,44 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+noinst_LIBRARIES = liblcdf.a
+
+liblcdf_a_SOURCES = bezier.cc \
+ clp.c \
+ error.cc \
+ filename.cc \
+ globmatch.cc \
+ landmark.cc \
+ permstr.cc \
+ point.cc \
+ slurper.cc \
+ straccum.cc \
+ string.cc \
+ strtonum.c \
+ transform.cc \
+ vectorv.cc
+
+liblcdf_a_DEPENDENCIES = @FIXLIBC_O@
+liblcdf_a_LIBADD = @FIXLIBC_O@ @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+
+INCLUDES = -I$(top_srcdir)/include
+
+EXTRA_DIST = fixlibc.c
+
+srclinks:
+ test -d $(top_srcdir)/include || mkdir $(top_srcdir)/include
+ test -d $(top_srcdir)/include/lcdf || mkdir $(top_srcdir)/include/lcdf
+ cd $(top_srcdir); for i in bezier error filename globmatch landmark permstr point slurper straccum string transform; do \
+ ln -sf ../../liblcdf/liblcdf/$$i.cc liblcdf/$$i.cc ; \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.hh include/lcdf/$$i.hh ; done
+ cd $(top_srcdir); for i in clp strtonum; do \
+ ln -sf ../../liblcdf/liblcdf/$$i.c liblcdf/$$i.c ; \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.h include/lcdf/$$i.h ; done
+ cd $(top_srcdir); for i in fixlibc.c vectorv.cc; do \
+ ln -sf ../../liblcdf/liblcdf/$$i liblcdf/$$i ; done
+ cd $(top_srcdir); for i in hashmap vector; do \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.cc include/lcdf/$$i.cc ; \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.hh include/lcdf/$$i.hh ; done
+ cd $(top_srcdir); for i in inttypes; do \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.h include/lcdf/$$i.h ; done
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/Makefile.in b/Build/source/utils/lcdf-typetools/liblcdf/Makefile.in
new file mode 100644
index 00000000000..8bb2739f04a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/Makefile.in
@@ -0,0 +1,460 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(liblcdf_a_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = liblcdf
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+liblcdf_a_AR = $(AR) $(ARFLAGS)
+am_liblcdf_a_OBJECTS = bezier.$(OBJEXT) clp.$(OBJEXT) error.$(OBJEXT) \
+ filename.$(OBJEXT) globmatch.$(OBJEXT) landmark.$(OBJEXT) \
+ permstr.$(OBJEXT) point.$(OBJEXT) slurper.$(OBJEXT) \
+ straccum.$(OBJEXT) string.$(OBJEXT) strtonum.$(OBJEXT) \
+ transform.$(OBJEXT) vectorv.$(OBJEXT)
+liblcdf_a_OBJECTS = $(am_liblcdf_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(liblcdf_a_SOURCES)
+DIST_SOURCES = $(liblcdf_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+noinst_LIBRARIES = liblcdf.a
+liblcdf_a_SOURCES = bezier.cc \
+ clp.c \
+ error.cc \
+ filename.cc \
+ globmatch.cc \
+ landmark.cc \
+ permstr.cc \
+ point.cc \
+ slurper.cc \
+ straccum.cc \
+ string.cc \
+ strtonum.c \
+ transform.cc \
+ vectorv.cc
+
+liblcdf_a_DEPENDENCIES = @FIXLIBC_O@
+liblcdf_a_LIBADD = @FIXLIBC_O@ @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+INCLUDES = -I$(top_srcdir)/include
+EXTRA_DIST = fixlibc.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign liblcdf/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign liblcdf/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+liblcdf.a: $(liblcdf_a_OBJECTS) $(liblcdf_a_DEPENDENCIES)
+ -rm -f liblcdf.a
+ $(liblcdf_a_AR) liblcdf.a $(liblcdf_a_OBJECTS) $(liblcdf_a_LIBADD)
+ $(RANLIB) liblcdf.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezier.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filename.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globmatch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/landmark.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permstr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/point.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurper.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/straccum.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtonum.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectorv.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-noinstLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-info-am
+
+
+srclinks:
+ test -d $(top_srcdir)/include || mkdir $(top_srcdir)/include
+ test -d $(top_srcdir)/include/lcdf || mkdir $(top_srcdir)/include/lcdf
+ cd $(top_srcdir); for i in bezier error filename globmatch landmark permstr point slurper straccum string transform; do \
+ ln -sf ../../liblcdf/liblcdf/$$i.cc liblcdf/$$i.cc ; \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.hh include/lcdf/$$i.hh ; done
+ cd $(top_srcdir); for i in clp strtonum; do \
+ ln -sf ../../liblcdf/liblcdf/$$i.c liblcdf/$$i.c ; \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.h include/lcdf/$$i.h ; done
+ cd $(top_srcdir); for i in fixlibc.c vectorv.cc; do \
+ ln -sf ../../liblcdf/liblcdf/$$i liblcdf/$$i ; done
+ cd $(top_srcdir); for i in hashmap vector; do \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.cc include/lcdf/$$i.cc ; \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.hh include/lcdf/$$i.hh ; done
+ cd $(top_srcdir); for i in inttypes; do \
+ ln -sf ../../../liblcdf/include/lcdf/$$i.h include/lcdf/$$i.h ; done
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/bezier.cc b/Build/source/utils/lcdf-typetools/liblcdf/bezier.cc
new file mode 100644
index 00000000000..c117657d2c5
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/bezier.cc
@@ -0,0 +1,376 @@
+// -*- related-file-name: "../include/lcdf/bezier.hh" -*-
+
+/* bezier.{cc,hh} -- cubic Bezier curves
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/bezier.hh>
+
+//
+// bounding box
+//
+
+void
+Bezier::make_bb() const throw ()
+{
+ _bb = 0;
+ for (int i = 1; i < 4; i++) {
+ if (_p[i].x > bb_right_x())
+ _bb = (_bb & ~0x03) | (i << 0);
+ else if (_p[i].x < bb_left_x())
+ _bb = (_bb & ~0x0C) | (i << 2);
+ if (_p[i].y > bb_top_x())
+ _bb = (_bb & ~0x30) | (i << 4);
+ else if (_p[i].y < bb_bottom_x())
+ _bb = (_bb & ~0xC0) | (i << 6);
+ }
+}
+
+
+//
+// is_flat, eval
+//
+
+bool
+Bezier::is_flat(double t) const throw ()
+{
+ return (_p[2].on_segment(_p[0], _p[3], t)
+ && _p[1].on_segment(_p[0], _p[3], t));
+}
+
+static Point
+eval_bezier(Point *b_in, int degree, double u)
+{
+ assert(degree < 4);
+ Point b[4];
+ for (int i = 0; i <= degree; i++)
+ b[i] = b_in[i];
+
+ double m = 1.0 - u;
+ for (int i = 1; i <= degree; i++)
+ for (int j = 0; j <= degree - i; j++)
+ b[j] = b[j]*m + b[j+1]*u;
+ return b[0];
+}
+
+Point
+Bezier::eval(double u) const throw ()
+{
+ Bezier b = *this;
+ double m = 1.0 - u;
+ for (int i = 1; i < 4; i++)
+ for (int j = 0; j < 4 - i; j++)
+ b._p[j] = m * b._p[j] + u * b._p[j+1];
+ return b._p[0];
+}
+
+
+//
+// halve
+//
+
+void
+Bezier::halve(Bezier &l, Bezier &r) const throw ()
+{
+ Point half = Point::midpoint(_p[1], _p[2]);
+ l._p[0] = _p[0];
+ l._p[1] = Point::midpoint(_p[0], _p[1]);
+ l._p[2] = Point::midpoint(l._p[1], half);
+ r._p[3] = _p[3];
+ r._p[2] = Point::midpoint(_p[2], _p[3]);
+ r._p[1] = Point::midpoint(r._p[2], half);
+ r._p[0] = l._p[3] = Point::midpoint(l._p[2], r._p[1]);
+}
+
+
+//
+// hit testing
+//
+
+bool
+Bezier::in_bb(const Point &p, double tolerance) const throw ()
+{
+ ensure_bb();
+ if (bb_right() + tolerance < p.x
+ || bb_left() - tolerance > p.x
+ || bb_top() + tolerance < p.y
+ || bb_bottom() - tolerance > p.y)
+ return false;
+ else
+ return true;
+}
+
+double
+Bezier::hit_recurse(const Point &p, double tolerance, double leftd,
+ double rightd, double leftt, double rightt) const throw ()
+{
+ Bezier left, right;
+ double middled, resultt;
+
+ if (is_flat(tolerance)) {
+ if (p.on_segment(_p[0], _p[3], tolerance))
+ return (leftt + rightt) / 2;
+ else
+ return -1;
+ }
+
+ if (leftd < tolerance * tolerance)
+ return leftt;
+ if (rightd < tolerance * tolerance)
+ return rightt;
+
+ if (!in_bb(p, tolerance))
+ return -1;
+
+ halve(left, right);
+ middled = (right._p[0] - p).squared_length();
+ resultt = left.hit_recurse
+ (p, tolerance, leftd, middled, leftt, (leftt + rightt) / 2);
+ if (resultt >= 0)
+ return resultt;
+
+ return right.hit_recurse
+ (p, tolerance, middled, rightd, (leftt + rightt) / 2, rightt);
+}
+
+bool
+Bezier::hit(const Point &p, double tolerance) const throw ()
+{
+ double leftd = (_p[0] - p).squared_length();
+ double rightd = (_p[3] - p).squared_length();
+ double resultt = hit_recurse(p, tolerance, leftd, rightd, 0, 1);
+ return resultt >= 0;
+}
+
+
+//
+// segmentize to list of points
+//
+// uses recursive subdivision
+//
+
+void
+Bezier::segmentize(Vector<Point> &v, bool first) const
+{
+ if (is_flat(0.5)) {
+ if (first)
+ v.push_back(_p[0]);
+ v.push_back(_p[3]);
+ } else {
+ Bezier left, right;
+ halve(left, right);
+ left.segmentize(v, first);
+ right.segmentize(v, false);
+ }
+}
+
+
+//
+// curve fitting
+//
+// code after Philip J. Schneider's algorithm described, with code, in the
+// first Graphics Gems
+//
+
+static void
+chord_length_parameterize(const Point *d, int nd, Vector<double> &result)
+{
+ assert(result.size() == 0);
+ result.reserve(nd);
+ result.push_back(0);
+ for (int i = 1; i < nd; i++)
+ result.push_back(result.back() + Point::distance(d[i-1], d[i]));
+ double last_dist = result.back();
+ for (int i = 1; i < nd; i++)
+ result[i] /= last_dist;
+}
+
+static inline double
+B0(double u)
+{
+ double m = 1.0 - u;
+ return m*m*m;
+}
+
+static inline double
+B1(double u)
+{
+ double m = 1.0 - u;
+ return 3*m*m*u;
+}
+
+static inline double
+B2(double u)
+{
+ double m = 1.0 - u;
+ return 3*m*u*u;
+}
+
+static inline double
+B3(double u)
+{
+ return u*u*u;
+}
+
+static Bezier
+generate_bezier(const Point *d, int nd, const Vector<double> &parameters,
+ const Point &left_tangent, const Point &right_tangent)
+{
+ Point *a0 = new Point[nd];
+ Point *a1 = new Point[nd];
+
+ for (int i = 0; i < nd; i++) {
+ a0[i] = left_tangent * B1(parameters[i]);
+ a1[i] = right_tangent * B2(parameters[i]);
+ }
+
+ double c[2][2], x[2];
+ c[0][0] = c[0][1] = c[1][0] = c[1][1] = x[0] = x[1] = 0.0;
+
+ int last = nd - 1;
+ for (int i = 0; i < nd; i++) {
+ c[0][0] += Point::dot(a0[i], a0[i]);
+ c[0][1] += Point::dot(a0[i], a1[i]);
+ c[1][1] += Point::dot(a1[i], a1[i]);
+
+ Point tmp = d[i] - (d[0] * (B0(parameters[i]) + B1(parameters[i]))
+ + d[last] * (B2(parameters[i]) + B3(parameters[i])));
+ x[0] += Point::dot(a0[i], tmp);
+ x[1] += Point::dot(a1[i], tmp);
+ }
+ c[1][0] = c[0][1];
+
+ // compute determinants
+ double det_c0_c1 = c[0][0]*c[1][1] - c[1][0]*c[0][1];
+ double det_c0_x = c[0][0]*x[1] - c[0][1]*x[0];
+ double det_x_c1 = x[0]*c[1][1] - x[1]*c[0][1];
+
+ // finally, derive alpha values
+ if (det_c0_c1 == 0.0)
+ det_c0_c1 = c[0][0]*c[1][1] * 10e-12;
+ double alpha_l = det_x_c1 / det_c0_c1;
+ double alpha_r = det_c0_x / det_c0_c1;
+
+ // if alpha negative, use the Wu/Barsky heuristic
+ if (alpha_l < 0.0 || alpha_r < 0.0) {
+ double distance = Point::distance(d[0], d[last]) / 3;
+ return Bezier(d[0], d[0] + left_tangent*distance,
+ d[last] + right_tangent*distance, d[last]);
+ } else
+ return Bezier(d[0], d[0] + left_tangent*alpha_l,
+ d[last] + right_tangent*alpha_r, d[last]);
+}
+
+static double
+newton_raphson_root_find(const Bezier &b, const Point &p, double u)
+{
+ const Point *b_pts = b.points();
+
+ Point b_det[3];
+ for (int i = 0; i < 3; i++)
+ b_det[i] = (b_pts[i+1] - b_pts[i]) * 3;
+
+ Point b_det_det[2];
+ for (int i = 0; i < 2; i++)
+ b_det_det[i] = (b_det[i+1] - b_det[i]) * 2;
+
+ Point b_u = b.eval(u);
+ Point b_det_u = eval_bezier(b_det, 2, u);
+ Point b_det_det_u = eval_bezier(b_det_det, 1, u);
+
+ double numerator = Point::dot(b_u - p, b_det_u);
+ double denominator = Point::dot(b_det_u, b_det_u) +
+ Point::dot(b_u - p, b_det_det_u);
+
+ return u - numerator/denominator;
+}
+
+static void
+reparameterize(const Point *d, int nd, Vector<double> &parameters,
+ const Bezier &b)
+{
+ for (int i = 0; i < nd; i++)
+ parameters[i] = newton_raphson_root_find(b, d[i], parameters[i]);
+}
+
+static double
+compute_max_error(const Point *d, int nd, const Bezier &b,
+ const Vector<double> &parameters, int *split_point)
+{
+ *split_point = nd/2;
+ double max_dist = 0.0;
+ for (int i = 1; i < nd - 1; i++) {
+ double dist = (b.eval(parameters[i]) - d[i]).squared_length();
+ if (dist >= max_dist) {
+ max_dist = dist;
+ *split_point = i;
+ }
+ }
+ return max_dist;
+}
+
+static void
+fit0(const Point *d, int nd, Point left_tangent, Point right_tangent,
+ double error, Vector<Bezier> &result)
+{
+ // Use a heuristic for small regions (only two points)
+ if (nd == 2) {
+ double dist = Point::distance(d[0], d[1]) / 3;
+ result.push_back(Bezier(d[0],
+ d[0] + dist*left_tangent,
+ d[1] + dist*right_tangent,
+ d[1]));
+ return;
+ }
+
+ // Parameterize points and attempt to fit curve
+ Vector<double> parameters;
+ chord_length_parameterize(d, nd, parameters);
+ Bezier b = generate_bezier(d, nd, parameters, left_tangent, right_tangent);
+
+ // find max error
+ int split_point;
+ double max_error = compute_max_error(d, nd, b, parameters, &split_point);
+ if (max_error < error) {
+ result.push_back(b);
+ return;
+ }
+
+ // if error not too large, try iteration and reparameterization
+ if (max_error < error*error)
+ for (int i = 0; i < 4; i++) {
+ reparameterize(d, nd, parameters, b);
+ b = generate_bezier(d, nd, parameters, left_tangent, right_tangent);
+ max_error = compute_max_error(d, nd, b, parameters, &split_point);
+ if (max_error < error) {
+ result.push_back(b);
+ return;
+ }
+ }
+
+ // fitting failed -- split at max error point and fit again
+ Point center_tangent = ((d[split_point-1] - d[split_point+1])/2).normal();
+ fit0(d, split_point+1, left_tangent, center_tangent, error, result);
+ fit0(d+split_point, nd-split_point, -center_tangent, right_tangent, error, result);
+}
+
+void
+Bezier::fit(const Vector<Point> &points, double error, Vector<Bezier> &result)
+{
+ int npoints = points.size();
+ Point left_tangent = (points[1] - points[0]).normal();
+ Point right_tangent = (points[npoints-2] - points[npoints-1]).normal();
+ fit0(&points[0], npoints, left_tangent, right_tangent, error, result);
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/clp.c b/Build/source/utils/lcdf-typetools/liblcdf/clp.c
new file mode 100644
index 00000000000..93ad7e408e4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/clp.c
@@ -0,0 +1,1624 @@
+/* -*- related-file-name: "../include/lcdf/clp.h" -*- */
+/* clp.c - Complete source code for CLP.
+ * This file is part of CLP, the command line parser package.
+ *
+ * Copyright (c) 1997-2005 Eddie Kohler, kohler@cs.ucla.edu
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file, which is available in full at
+ * http://www.pdos.lcs.mit.edu/click/license.html. The conditions include: you
+ * must preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/clp.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+/* By default, assume we have strtoul. */
+#if !defined(HAVE_STRTOUL) && !defined(HAVE_CONFIG_H)
+# define HAVE_STRTOUL 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Option types for Clp_SetOptionChar */
+#define Clp_DoubledLong (Clp_LongImplicit * 2)
+
+#define Clp_AnyArgument (Clp_Mandatory | Clp_Optional)
+
+#define MAX_AMBIGUOUS_VALUES 4
+
+typedef struct {
+ Clp_ArgParseFunc func;
+ int flags;
+ void *thunk;
+} Clp_ArgType;
+
+
+typedef struct {
+ int pos;
+ int neg;
+} Clp_LongMinMatch;
+
+
+struct Clp_Internal {
+
+ Clp_Option *opt;
+ Clp_LongMinMatch *long_min_match;
+ int nopt;
+
+ Clp_ArgType *argtype;
+ int nargtype;
+
+ const char * const *argv;
+ int argc;
+
+ unsigned char option_class[256];
+ int both_short_and_long;
+
+ char option_chars[3];
+ const char *text;
+
+ const char *program_name;
+ void (*error_handler)(const char *);
+
+ int is_short;
+ int whole_negated; /* true if negated by an option character */
+ int could_be_short;
+
+ int option_processing;
+
+ int ambiguous;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES];
+
+ Clp_Option *current_option;
+ int current_short;
+ int negated_by_no;
+
+};
+
+
+struct Clp_ParserState {
+ const char * const *argv;
+ int argc;
+ char option_chars[3];
+ const char *text;
+ int is_short;
+ int whole_negated;
+};
+
+
+typedef struct Clp_StringList {
+ Clp_Option *items;
+ Clp_LongMinMatch *long_min_match;
+ int nitems;
+ int allow_int;
+ int nitems_invalid_report;
+} Clp_StringList;
+
+
+#define TEST(o, f) (((o)->flags & (f)) != 0)
+
+
+static int calculate_long_min_match(int, Clp_Option *, int, int, int);
+
+static int parse_string(Clp_Parser *, const char *, int, void *);
+static int parse_int(Clp_Parser *, const char *, int, void *);
+static int parse_bool(Clp_Parser *, const char *, int, void *);
+static int parse_double(Clp_Parser *, const char *, int, void *);
+static int parse_string_list(Clp_Parser *, const char *, int, void *);
+
+static int ambiguity_error(Clp_Parser *, int, int *, Clp_Option *,
+ const char *, const char *, ...);
+
+
+/*******
+ * Clp_NewParser, etc.
+ **/
+
+static void
+check_duplicated_short_options(Clp_Parser *clp, int nopt, Clp_Option *opt, int negated)
+{
+ int i;
+ int check[256];
+
+ for (i = 0; i < 256; i++)
+ check[i] = -1;
+
+ for (i = 0; i < nopt; i++)
+ if (opt[i].short_name > 0 && opt[i].short_name < 256
+ && (negated ? TEST(&opt[i], Clp_Negate)
+ : !TEST(&opt[i], Clp_OnlyNegated))) {
+ int sh = opt[i].short_name;
+ if (check[sh] >= 0 && check[sh] != opt[i].option_id)
+ Clp_OptionError(clp, "CLP internal error: more than 1 option has short name '%c'", sh);
+ check[sh] = opt[i].option_id;
+ }
+}
+
+Clp_Parser *
+Clp_NewParser(int argc, const char * const *argv, int nopt, Clp_Option *opt)
+ /* Creates and returns a new Clp_Parser using the options in 'opt',
+ or 0 on memory allocation failure */
+{
+ int i;
+ Clp_Parser *clp = (Clp_Parser *)malloc(sizeof(Clp_Parser));
+ Clp_Internal *cli = (Clp_Internal *)malloc(sizeof(Clp_Internal));
+ Clp_LongMinMatch *lmm = (Clp_LongMinMatch *)malloc(sizeof(Clp_LongMinMatch) * nopt);
+ if (!clp || !cli || !lmm)
+ goto failed;
+
+ clp->internal = cli;
+ cli->long_min_match = lmm;
+
+ /* Assign arguments (need to do this now so we can call Clp_OptionError) */
+ cli->argc = argc;
+ cli->argv = argv;
+ {
+ const char *slash = strrchr(argv[0], '/');
+ cli->program_name = slash ? slash + 1 : argv[0];
+ }
+ cli->error_handler = 0;
+
+ /* Get rid of negative option_ids, which are internal to CLP */
+ for (i = 0; i < nopt; i++)
+ if (opt[i].option_id < 0) {
+ Clp_OptionError(clp, "CLP internal error: option %d has negative option_id", i);
+ opt[i] = opt[nopt - 1];
+ nopt--;
+ i--;
+ }
+
+ /* Massage the options to make them usable */
+ for (i = 0; i < nopt; i++) {
+ /* Enforce invariants */
+ if (opt[i].arg_type <= 0)
+ opt[i].flags &= ~Clp_AnyArgument;
+ if (opt[i].arg_type > 0 && !TEST(&opt[i], Clp_Optional))
+ opt[i].flags |= Clp_Mandatory;
+
+ /* Nonexistent short options have character 256. We know this won't
+ equal any character in an argument, even if characters are signed */
+ if (opt[i].short_name <= 0 || opt[i].short_name > 255)
+ opt[i].short_name = 256;
+
+ /* Options that start with 'no-' should be changed to OnlyNegated */
+ if (opt[i].long_name && strncmp(opt[i].long_name, "no-", 3) == 0) {
+ opt[i].long_name += 3;
+ opt[i].flags |= Clp_Negate | Clp_OnlyNegated;
+ }
+ }
+
+ /* Check for duplicated short options */
+ check_duplicated_short_options(clp, nopt, opt, 0);
+ check_duplicated_short_options(clp, nopt, opt, 1);
+
+ /* Calculate long options' minimum unambiguous length */
+ for (i = 0; i < nopt; i++)
+ if (opt[i].long_name && !TEST(&opt[i], Clp_OnlyNegated))
+ lmm[i].pos = calculate_long_min_match
+ (nopt, opt, i, Clp_OnlyNegated, 0);
+ for (i = 0; i < nopt; i++)
+ if (opt[i].long_name && TEST(&opt[i], Clp_Negate))
+ lmm[i].neg = calculate_long_min_match
+ (nopt, opt, i, Clp_Negate, Clp_Negate);
+
+ /* Set up clp->internal */
+ cli->opt = opt;
+ cli->nopt = nopt;
+
+ cli->argtype = (Clp_ArgType *)malloc(sizeof(Clp_ArgType) * 8);
+ if (!cli->argtype)
+ goto failed;
+ for (i = 0; i < 8; i++)
+ cli->argtype[i].func = 0;
+ cli->nargtype = 8;
+
+ for (i = 0; i < 256; i++)
+ cli->option_class[i] = 0;
+ cli->option_class[(unsigned char) '-'] = Clp_Short;
+ cli->both_short_and_long = 0;
+
+ cli->is_short = 0;
+ cli->whole_negated = 0;
+
+ cli->option_processing = 1;
+ cli->current_option = 0;
+
+ /* Add default type parsers */
+ Clp_AddType(clp, Clp_ArgString, 0, parse_string, 0);
+ Clp_AddType(clp, Clp_ArgStringNotOption, Clp_DisallowOptions, parse_string, 0);
+ Clp_AddType(clp, Clp_ArgInt, 0, parse_int, 0);
+ Clp_AddType(clp, Clp_ArgUnsigned, 0, parse_int, (void *)cli);
+ Clp_AddType(clp, Clp_ArgBool, 0, parse_bool, 0);
+ Clp_AddType(clp, Clp_ArgDouble, 0, parse_double, 0);
+ return clp;
+
+ failed:
+ /* It should be OK to free(0), but on some ancient systems, it isn't */
+ if (cli && cli->argtype)
+ free(cli->argtype);
+ if (cli)
+ free(cli);
+ if (clp)
+ free(clp);
+ if (lmm)
+ free(lmm);
+ return 0;
+}
+
+void
+Clp_DeleteParser(Clp_Parser *clp)
+ /* Destroys the Clp_Parser 'clp' and any associated memory allocated by
+ CLP */
+{
+ int i;
+ Clp_Internal *cli;
+ if (!clp)
+ return;
+
+ cli = clp->internal;
+
+ /* get rid of any string list types */
+ for (i = 0; i < cli->nargtype; i++)
+ if (cli->argtype[i].func == parse_string_list) {
+ Clp_StringList *clsl = (Clp_StringList *)cli->argtype[i].thunk;
+ free(clsl->items);
+ free(clsl->long_min_match);
+ free(clsl);
+ }
+
+ free(cli->argtype);
+ free(cli->long_min_match);
+ free(cli);
+ free(clp);
+}
+
+int
+Clp_SetOptionProcessing(Clp_Parser *clp, int option_processing)
+ /* Sets whether command line arguments are parsed (looking for options)
+ at all. Each parser starts out with OptionProcessing true. Returns old
+ value. */
+{
+ Clp_Internal *cli = clp->internal;
+ int old = cli->option_processing;
+ cli->option_processing = option_processing;
+ return old;
+}
+
+Clp_ErrorHandler
+Clp_SetErrorHandler(Clp_Parser *clp, void (*error_handler)(const char *))
+ /* Sets a hook function to be called before Clp_OptionError
+ prints anything. 0 means nothing will be called. */
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_ErrorHandler old = cli->error_handler;
+ cli->error_handler = error_handler;
+ return old;
+}
+
+int
+Clp_SetOptionChar(Clp_Parser *clp, int c, int option_type)
+ /* Determines how clp will deal with short options.
+ option_type must be a sum of:
+
+ 0 == Clp_NotOption 'c' isn't an option.
+ Clp_Short 'c' introduces a list of short options.
+ Clp_Long 'c' introduces a long option.
+ Clp_ShortNegated 'c' introduces a negated list of
+ short options.
+ Clp_LongNegated 'c' introduces a negated long option.
+ Clp_LongImplicit 'c' introduces a long option, and *is part
+ of the long option itself*.
+
+ Some values are not allowed (Clp_Long | Clp_LongNegated isn't allowed,
+ for instance). c=0 means ALL characters are that type. Returns 0 on
+ failure (you gave an illegal option_type), 1 on success. */
+{
+ int i;
+ Clp_Internal *cli = clp->internal;
+
+ if (option_type < 0
+ || option_type >= 2*Clp_LongImplicit
+ || ((option_type & Clp_Short) && (option_type & Clp_ShortNegated))
+ || ((option_type & Clp_Long) && (option_type & Clp_LongNegated))
+ || ((option_type & Clp_LongImplicit) && (option_type & (Clp_Short | Clp_ShortNegated | Clp_Long | Clp_LongNegated))))
+ return 0;
+
+ if (c == 0)
+ for (i = 1; i < 256; i++)
+ cli->option_class[i] = option_type;
+ else
+ cli->option_class[(unsigned char) c] = option_type;
+
+ /* If an option character can introduce either short or long options, then
+ we need to fix up the long_min_match values. We may have set the
+ long_min_match for option 'abcde' to 1, if no other option starts
+ with 'a'. But if '-' can introduce either a short option or a long
+ option, AND a short option '-a' exists, then the long_min_match for
+ 'abcde' must be set to 2! */
+ if (!cli->both_short_and_long) {
+ int either_short = option_type & (Clp_Short | Clp_ShortNegated);
+ int either_long = option_type & (Clp_Long | Clp_LongNegated);
+ if (either_short && either_long) {
+ unsigned char have_short[257];
+ for (i = 0; i < 256; i++)
+ have_short[i] = 0;
+ for (i = 0; i < cli->nopt; i++)
+ have_short[cli->opt[i].short_name] = 1;
+ for (i = 0; i < cli->nopt; i++)
+ if (cli->opt[i].long_name && cli->long_min_match[i].pos == 1) {
+ /* if '--Cxxxx's short name is '-C', keep long_min_match
+ == 1 */
+ unsigned char first = (unsigned char)cli->opt[i].long_name[0];
+ if (have_short[first] && first != cli->opt[i].short_name)
+ cli->long_min_match[i].pos++;
+ }
+ cli->both_short_and_long = 1;
+ }
+ }
+
+ return 1;
+}
+
+const char *
+Clp_ProgramName(Clp_Parser *clp)
+{
+ return clp->internal->program_name;
+}
+
+void
+Clp_SetProgramName(Clp_Parser *clp, const char *program_name)
+{
+ clp->internal->program_name = program_name;
+}
+
+
+/*******
+ * functions for Clp_Option lists
+ **/
+
+static int
+min_different_chars(const char *s, const char *t)
+ /* Returns the minimum number of characters required to distinguish
+ s from t.
+ If s is shorter than t, returns strlen(s). */
+{
+ const char *sfirst = s;
+ while (*s && *t && *s == *t)
+ s++, t++;
+ if (!*s)
+ return s - sfirst;
+ else
+ return s - sfirst + 1;
+}
+
+static int
+calculate_long_min_match(int nopt, Clp_Option *opt, int which,
+ int flags, int flags_value)
+{
+ int j, lmm = 1;
+ int preferred = (opt[which].flags & Clp_PreferredMatch);
+
+ for (j = 0; j < nopt; j++)
+ if (opt[j].long_name
+ && (opt[j].flags & flags) == flags_value
+ && opt[which].option_id != opt[j].option_id
+ && strncmp(opt[which].long_name, opt[j].long_name, lmm) == 0
+ && (!preferred || strncmp(opt[which].long_name, opt[j].long_name, strlen(opt[which].long_name)) != 0))
+ lmm = min_different_chars(opt[which].long_name, opt[j].long_name);
+
+ return lmm;
+}
+
+/* the ever-glorious argcmp */
+
+static int
+argcmp(const char *ref, const char *arg, int min_match, int fewer_dashes)
+ /* Returns 0 if ref and arg don't match.
+ Returns -1 if ref and arg match, but fewer than min_match characters.
+ Returns len if ref and arg match min_match or more characters;
+ len is the number of characters that matched in arg.
+ Allows arg to contain fewer dashes than ref iff fewer_dashes != 0.
+
+ Examples:
+ argcmp("x", "y", 1, 0) --> 0 / just plain wrong
+ argcmp("a", "ax", 1, 0) --> 0 / ...even though min_match == 1
+ and the 1st chars match
+ argcmp("box", "bo", 3, 0) --> -1 / ambiguous
+ argcmp("cat", "c=3", 1, 0) --> 1 / handles = arguments
+ */
+{
+ const char *refstart = ref;
+ const char *argstart = arg;
+ assert(min_match > 0);
+
+ compare:
+ while (*ref && *arg && *arg != '=' && *ref == *arg)
+ ref++, arg++;
+
+ /* Allow arg to contain fewer dashes than ref */
+ if (fewer_dashes && *ref == '-' && ref[1] && ref[1] == *arg) {
+ ref++;
+ goto compare;
+ }
+
+ if (*arg && *arg != '=')
+ return 0;
+ else if (ref - refstart < min_match)
+ return -1;
+ else
+ return arg - argstart;
+}
+
+static int
+find_prefix_opt(const char *arg, int nopt, Clp_Option *opt,
+ Clp_LongMinMatch *lmmvec,
+ int *ambiguous, int *ambiguous_values, int negated)
+ /* Looks for an unambiguous match of 'arg' against one of the long
+ options in 'opt'. Returns positive if it finds one; otherwise, returns
+ -1 and possibly changes 'ambiguous' and 'ambiguous_values' to keep
+ track of at most MAX_AMBIGUOUS_VALUES possibilities. */
+{
+ int i, fewer_dashes = 0, first_ambiguous = *ambiguous;
+
+ retry:
+ for (i = 0; i < nopt; i++) {
+ int len, lmm;
+ if (!opt[i].long_name
+ || (negated && !TEST(&opt[i], Clp_Negate))
+ || (!negated && TEST(&opt[i], Clp_OnlyNegated)))
+ continue;
+
+ lmm = (negated ? lmmvec[i].neg : lmmvec[i].pos);
+ len = argcmp(opt[i].long_name, arg, lmm, fewer_dashes);
+ if (len > 0)
+ return i;
+ else if (len < 0) {
+ if (*ambiguous < MAX_AMBIGUOUS_VALUES)
+ ambiguous_values[*ambiguous] = i;
+ (*ambiguous)++;
+ }
+ }
+
+ /* If there were no partial matches, try again with fewer_dashes true */
+ if (*ambiguous == first_ambiguous && !fewer_dashes) {
+ fewer_dashes = 1;
+ goto retry;
+ }
+
+ return -1;
+}
+
+
+/*****
+ * Argument parsing
+ **/
+
+int
+Clp_AddType(Clp_Parser *clp, int type_id, int flags,
+ Clp_ArgParseFunc func, void *thunk)
+ /* Add a argument parser for type_id to the Clp_Parser. When an argument
+ arg for Clp_Option opt is being processed, the parser routines will
+ call (*func)(clp, opt, arg, thunk, complain)
+ where complain is 1 if the routine should report errors, or 0 if it
+ should fail silently.
+ Returns 1 on success, 0 if memory allocation fails or the arguments
+ are bad. */
+{
+ int i;
+ Clp_Internal *cli = clp->internal;
+ Clp_ArgType *new_argtype;
+ int nargtype = cli->nargtype;
+ assert(nargtype);
+
+ if (type_id <= 0 || !func)
+ return 0;
+
+ while (nargtype <= type_id)
+ nargtype *= 2;
+ new_argtype = (Clp_ArgType *)
+ realloc(cli->argtype, sizeof(Clp_ArgType) * nargtype);
+ if (!new_argtype)
+ return 0;
+ cli->argtype = new_argtype;
+
+ for (i = cli->nargtype; i < nargtype; i++)
+ cli->argtype[i].func = 0;
+ cli->nargtype = nargtype;
+
+ cli->argtype[type_id].func = func;
+ cli->argtype[type_id].flags = flags;
+ cli->argtype[type_id].thunk = thunk;
+ return 1;
+}
+
+
+/*******
+ * Default argument parsers
+ **/
+
+static int
+parse_string(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ (void)complain, (void)thunk;
+ clp->val.s = arg;
+ return 1;
+}
+
+static int
+parse_int(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ char *val;
+ int base = 10;
+ if (arg[0] == '0' && (arg[1] == 'x' || arg[1] == 'X')) {
+ base = 16;
+ arg += 2;
+ }
+
+ if (thunk != 0) { /* unsigned */
+#if HAVE_STRTOUL
+ clp->val.u = strtoul(arg, &val, base);
+#else
+ /* don't bother really trying to do it right */
+ if (arg[0] == '-')
+ val = (char *) arg;
+ else
+ clp->val.u = strtol(arg, &val, base);
+#endif
+ } else
+ clp->val.i = strtol(arg, &val, base);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain) {
+ const char *message = thunk != 0
+ ? "'%O' expects a nonnegative integer, not '%s'"
+ : "'%O' expects an integer, not '%s'";
+ if (base == 16) arg -= 2;
+ return Clp_OptionError(clp, message, arg);
+ } else
+ return 0;
+}
+
+static int
+parse_double(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ char *val;
+ (void)thunk;
+ clp->val.d = strtod(arg, &val);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain)
+ return Clp_OptionError(clp, "'%O' expects a real number, not '%s'", arg);
+ else
+ return 0;
+}
+
+static int
+parse_bool(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ int i;
+ char lcarg[6];
+ (void)thunk;
+ if (strlen(arg) > 5 || strchr(arg, '=') != 0)
+ goto error;
+
+ for (i = 0; arg[i] != 0; i++)
+ lcarg[i] = tolower(arg[i]);
+ lcarg[i] = 0;
+
+ if (argcmp("yes", lcarg, 1, 0) > 0
+ || argcmp("true", lcarg, 1, 0) > 0
+ || argcmp("1", lcarg, 1, 0) > 0) {
+ clp->val.i = 1;
+ return 1;
+ } else if (argcmp("no", lcarg, 1, 0) > 0
+ || argcmp("false", lcarg, 1, 0) > 0
+ || argcmp("1", lcarg, 1, 0) > 0) {
+ clp->val.i = 0;
+ return 1;
+ }
+
+ error:
+ if (complain)
+ Clp_OptionError(clp, "'%O' expects a true-or-false value, not '%s'", arg);
+ return 0;
+}
+
+
+/*****
+ * Clp_AddStringListType
+ **/
+
+static int
+parse_string_list(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ Clp_StringList *sl = (Clp_StringList *)thunk;
+ int idx, ambiguous = 0;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES + 1];
+
+ /* actually look for a string value */
+ idx = find_prefix_opt
+ (arg, sl->nitems, sl->items, sl->long_min_match,
+ &ambiguous, ambiguous_values, 0);
+ if (idx >= 0) {
+ clp->val.i = sl->items[idx].option_id;
+ return 1;
+ }
+
+ if (sl->allow_int) {
+ if (parse_int(clp, arg, 0, 0))
+ return 1;
+ }
+
+ if (complain) {
+ const char *complaint = (ambiguous ? "an ambiguous" : "not a valid");
+ if (!ambiguous) {
+ ambiguous = sl->nitems_invalid_report;
+ for (idx = 0; idx < ambiguous; idx++)
+ ambiguous_values[idx] = idx;
+ }
+ return ambiguity_error
+ (clp, ambiguous, ambiguous_values, sl->items, "",
+ "'%s' is %s argument to '%O'", arg, complaint);
+ } else
+ return 0;
+}
+
+
+int
+finish_string_list(Clp_Parser *clp, int type_id, int flags,
+ Clp_Option *items, int nitems, int itemscap)
+{
+ int i;
+ Clp_StringList *clsl = (Clp_StringList *)malloc(sizeof(Clp_StringList));
+ Clp_LongMinMatch *lmm = (Clp_LongMinMatch *)malloc(sizeof(Clp_LongMinMatch) * nitems);
+ if (!clsl || !lmm)
+ goto error;
+
+ clsl->items = items;
+ clsl->long_min_match = lmm;
+ clsl->nitems = nitems;
+ clsl->allow_int = (flags & Clp_AllowNumbers) != 0;
+
+ if (nitems < MAX_AMBIGUOUS_VALUES && nitems < itemscap && clsl->allow_int) {
+ items[nitems].long_name = "any integer";
+ clsl->nitems_invalid_report = nitems + 1;
+ } else if (nitems > MAX_AMBIGUOUS_VALUES + 1)
+ clsl->nitems_invalid_report = MAX_AMBIGUOUS_VALUES + 1;
+ else
+ clsl->nitems_invalid_report = nitems;
+
+ for (i = 0; i < nitems; i++)
+ lmm[i].pos = calculate_long_min_match(nitems, items, i, 0, 0);
+
+ if (Clp_AddType(clp, type_id, 0, parse_string_list, clsl))
+ return 1;
+
+ error:
+ if (clsl)
+ free(clsl);
+ if (lmm)
+ free(lmm);
+ return 0;
+}
+
+int
+Clp_AddStringListType(Clp_Parser *clp, int type_id, int flags, ...)
+ /* An easy way to add new types to clp.
+ Call like this:
+ Clp_AddStringListType
+ (clp, type_id, flags,
+ char *s_1, int value_1, ..., char *s_n, int value_n, 0);
+
+ Defines type_id as a type in clp.
+ This type accepts any of the strings s_1, ..., s_n
+ (or unambiguous abbreviations thereof);
+ if argument s_i is given, value_i is stored in clp->val.i.
+ If Clp_AllowNumbers is set in flags,
+ explicit integers are also allowed.
+
+ Returns 1 on success, 0 on memory allocation errors. */
+{
+ int nitems = 0;
+ int itemscap = 5;
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+
+ va_list val;
+ va_start(val, flags);
+
+ if (!items)
+ goto error;
+
+ /* slurp up the arguments */
+ while (1) {
+ int value;
+ char *name = va_arg(val, char *);
+ if (!name)
+ break;
+ value = va_arg(val, int);
+
+ if (nitems >= itemscap) {
+ Clp_Option *new_items;
+ itemscap *= 2;
+ new_items = (Clp_Option *)realloc(items, sizeof(Clp_Option) * itemscap);
+ if (!new_items)
+ goto error;
+ items = new_items;
+ }
+
+ items[nitems].long_name = name;
+ items[nitems].option_id = value;
+ items[nitems].flags = 0;
+ nitems++;
+ }
+
+ va_end(val);
+ if (finish_string_list(clp, type_id, flags, items, nitems, itemscap))
+ return 1;
+
+ error:
+ va_end(val);
+ if (items)
+ free(items);
+ return 0;
+}
+
+
+int
+Clp_AddStringListTypeVec(Clp_Parser *clp, int type_id, int flags,
+ int nitems, char **strings, int *values)
+ /* An alternate way to make a string list type. See Clp_AddStringListType
+ for the basics; this coalesces the strings and values into two arrays,
+ rather than spreading them out into a variable argument list. */
+{
+ int i;
+ int itemscap = (nitems < 5 ? 5 : nitems);
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+ if (!items)
+ return 0;
+
+ /* copy over items */
+ for (i = 0; i < nitems; i++) {
+ items[i].long_name = strings[i];
+ items[i].option_id = values[i];
+ items[i].flags = 0;
+ }
+
+ if (finish_string_list(clp, type_id, flags, items, nitems, itemscap))
+ return 1;
+ else {
+ free(items);
+ return 0;
+ }
+}
+
+
+/*******
+ * Returning information
+ **/
+
+Clp_Argv *
+Clp_NewArgv(const char *str_in, int len)
+{
+ int argcap = 32;
+ Clp_Argv *clp_argv = (Clp_Argv *)malloc(sizeof(Clp_Argv));
+ char *s, *end;
+
+ if (!clp_argv)
+ goto failed_all;
+ if (len < 0)
+ len = strlen(str_in);
+ if (!(clp_argv->argv_buf = (char *)malloc(len + 1)))
+ goto failed_argv_buf;
+ if (!(clp_argv->argv = (char **)malloc(sizeof(char *) * argcap)))
+ goto failed_argv;
+ memcpy(clp_argv->argv_buf, str_in, len);
+ end = clp_argv->argv_buf + len;
+ *end = 0;
+
+ /* Parse arguments */
+ s = clp_argv->argv_buf;
+ clp_argv->argc = 0;
+ while (1) {
+ char *arg, *sout;
+ int state;
+ while (s < end && isspace((unsigned char) *s))
+ s++;
+ if (s >= end)
+ break;
+ /* Parse single argument */
+ for (arg = sout = s, state = 0; s < end; s++) {
+ if (*s == '\'') {
+ if (state == 0)
+ state = '\'';
+ else if (state == '\'')
+ state = 0;
+ else
+ *sout++ = *s;
+ } else if (*s == '\"') {
+ if (state == 0)
+ state = '\"';
+ else if (state == '\"')
+ state = 0;
+ else
+ *sout++ = *s;
+ } else if (*s == '\\') {
+ if (state == '\'' || s == end - 1)
+ *sout++ = *s;
+ else
+ *sout++ = *++s;
+ } else if (isspace((unsigned char) *s)) {
+ if (state == 0)
+ break;
+ else
+ *sout++ = *s;
+ } else
+ *sout++ = *s;
+ }
+ *sout = 0;
+ s++;
+ /* Store argument */
+ if (clp_argv->argc < argcap - 2) {
+ argcap *= 2;
+ if (!(clp_argv->argv = (char **)realloc(clp_argv->argv, sizeof(char *) * argcap)))
+ goto failed_argv;
+ }
+ clp_argv->argv[clp_argv->argc++] = arg;
+ }
+ clp_argv->argv[clp_argv->argc] = 0; /* know we have space */
+
+ return clp_argv;
+
+ failed_argv:
+ free(clp_argv->argv_buf);
+ failed_argv_buf:
+ free(clp_argv);
+ failed_all:
+ return 0;
+}
+
+void
+Clp_DeleteArgv(Clp_Argv *clp_argv)
+{
+ if (!clp_argv)
+ return;
+ free(clp_argv->argv);
+ free(clp_argv->argv_buf);
+ free(clp_argv);
+}
+
+
+/******
+ * Clp_ParserStates
+ **/
+
+Clp_ParserState *
+Clp_NewParserState(void)
+{
+ return (Clp_ParserState *)malloc(sizeof(Clp_ParserState));
+}
+
+void
+Clp_DeleteParserState(Clp_ParserState *save)
+{
+ free(save);
+}
+
+
+void
+Clp_SaveParser(Clp_Parser *clp, Clp_ParserState *save)
+ /* Saves parser position in save */
+{
+ Clp_Internal *cli = clp->internal;
+ save->argv = cli->argv;
+ save->argc = cli->argc;
+ memcpy(save->option_chars, cli->option_chars, 3);
+ save->text = cli->text;
+ save->is_short = cli->is_short;
+ save->whole_negated = cli->whole_negated;
+}
+
+
+void
+Clp_RestoreParser(Clp_Parser *clp, Clp_ParserState *save)
+ /* Restores parser position from save */
+{
+ Clp_Internal *cli = clp->internal;
+ cli->argv = save->argv;
+ cli->argc = save->argc;
+ memcpy(cli->option_chars, save->option_chars, 3);
+ cli->text = save->text;
+ cli->is_short = save->is_short;
+ cli->whole_negated = save->whole_negated;
+}
+
+
+/*******
+ * Clp_Next and its helpers
+ **/
+
+static void
+set_option_text(Clp_Internal *cli, const char *text, int n_option_chars)
+{
+ char *option_chars = cli->option_chars;
+ assert(n_option_chars < 3);
+
+ while (n_option_chars-- > 0)
+ *option_chars++ = *text++;
+ *option_chars = 0;
+
+ cli->text = text;
+}
+
+
+static int
+next_argument(Clp_Parser *clp, int want_argument)
+ /* Moves clp to the next argument.
+ Returns 1 if it finds another option.
+ Returns 0 if there aren't any more arguments.
+ Returns 0, sets clp->have_arg = 1, and sets clp->arg to the argument
+ if the next argument isn't an option.
+ If want_argument > 0, it'll look for an argument.
+ want_argument == 1: Accept arguments that start with Clp_NotOption
+ or Clp_LongImplicit.
+ want_argument == 2: Accept ALL arguments.
+
+ Where is the option stored when this returns?
+ Well, cli->argv[0] holds the whole of the next command line argument.
+ cli->option_chars holds a string: what characters began the option?
+ It is generally "-" or "--".
+ cli->text holds the text of the option:
+ for short options, cli->text[0] is the relevant character;
+ for long options, cli->text holds the rest of the option. */
+{
+ Clp_Internal *cli = clp->internal;
+ const char *text;
+ int option_class;
+
+ /* clear relevant flags */
+ clp->have_arg = 0;
+ clp->arg = 0;
+ cli->could_be_short = 0;
+
+ /* if we're in a string of short options, move up one char in the string */
+ if (cli->is_short) {
+ ++cli->text;
+ if (cli->text[0] == 0)
+ cli->is_short = 0;
+ else if (want_argument > 0) {
+ /* handle -O[=]argument case */
+ clp->have_arg = 1;
+ if (cli->text[0] == '=')
+ clp->arg = cli->text + 1;
+ else
+ clp->arg = cli->text;
+ cli->is_short = 0;
+ return 0;
+ }
+ }
+
+ /* if in short options, we're all set */
+ if (cli->is_short)
+ return 1;
+
+ /** if not in short options, move to the next argument **/
+ cli->whole_negated = 0;
+ cli->text = 0;
+
+ if (cli->argc <= 1)
+ return 0;
+
+ cli->argc--;
+ cli->argv++;
+ text = cli->argv[0];
+
+ if (want_argument > 1)
+ goto not_option;
+
+ option_class = cli->option_class[(unsigned char)text[0]];
+ if (text[0] == '-' && text[1] == '-')
+ option_class = Clp_DoubledLong;
+
+ /* If this character could introduce either a short or a long option,
+ try a long option first, but remember that short's a possibility for
+ later. */
+ if ((option_class & (Clp_Short | Clp_ShortNegated))
+ && (option_class & (Clp_Long | Clp_LongNegated))) {
+ option_class &= ~(Clp_Short | Clp_ShortNegated);
+ if (text[1] != 0)
+ cli->could_be_short = 1;
+ }
+
+ switch (option_class) {
+
+ case Clp_Short:
+ cli->is_short = 1;
+ goto check_singleton;
+
+ case Clp_ShortNegated:
+ cli->is_short = 1;
+ cli->whole_negated = 1;
+ goto check_singleton;
+
+ case Clp_Long:
+ goto check_singleton;
+
+ case Clp_LongNegated:
+ cli->whole_negated = 1;
+ goto check_singleton;
+
+ check_singleton:
+ /* For options introduced with one character, option-char,
+ '[option-char]' alone is NOT an option. */
+ if (text[1] == 0)
+ goto not_option;
+ set_option_text(cli, text, 1);
+ break;
+
+ case Clp_LongImplicit:
+ /* LongImplict: option_chars == "" (since all chars are part of the
+ option); restore head -> text of option */
+ if (want_argument > 0)
+ goto not_option;
+ set_option_text(cli, text, 0);
+ break;
+
+ case Clp_DoubledLong:
+ set_option_text(cli, text, 2);
+ break;
+
+ not_option:
+ case Clp_NotOption:
+ cli->is_short = 0;
+ clp->have_arg = 1;
+ clp->arg = text;
+ return 0;
+
+ default:
+ assert(0 /* CLP misconfiguration: bad option type */);
+
+ }
+
+ return 1;
+}
+
+
+static void
+switch_to_short_argument(Clp_Parser *clp)
+{
+ Clp_Internal *cli = clp->internal;
+ const char *text = cli->argv[0];
+ int option_class = cli->option_class[(unsigned char)text[0]];
+ cli->is_short = 1;
+ cli->whole_negated = (option_class & Clp_ShortNegated ? 1 : 0);
+ set_option_text(cli, cli->argv[0], 1);
+ assert(cli->could_be_short);
+}
+
+
+static Clp_Option *
+find_long(Clp_Parser *clp, const char *arg)
+ /* If arg corresponds to one of clp's options, finds that option &
+ returns it. If any argument is given after an = sign in arg, sets
+ clp->have_arg = 1 and clp->arg to that argument. Sets cli->ambiguous
+ to 1 iff there was no match because the argument was ambiguous. */
+{
+ Clp_Internal *cli = clp->internal;
+ int value, len, min_match;
+ Clp_Option *opt = cli->opt;
+ int first_negative_ambiguous;
+
+ /* Look for a normal option. */
+ value = find_prefix_opt
+ (arg, cli->nopt, opt, cli->long_min_match,
+ &cli->ambiguous, cli->ambiguous_values, clp->negated);
+ if (value >= 0)
+ goto worked;
+
+ /* If we can't find it, look for a negated option. */
+ /* I know this is silly, but it makes me happy to accept
+ --no-no-option as a double negative synonym for --option. :) */
+ first_negative_ambiguous = cli->ambiguous;
+ while (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-') {
+ arg += 3;
+ clp->negated = !clp->negated;
+ value = find_prefix_opt
+ (arg, cli->nopt, opt, cli->long_min_match,
+ &cli->ambiguous, cli->ambiguous_values, clp->negated);
+ if (value >= 0)
+ goto worked;
+ }
+
+ /* No valid option was found; return 0. Mark the ambiguous values found
+ through '--no' by making them negative. */
+ {
+ int i, max = cli->ambiguous;
+ if (max > MAX_AMBIGUOUS_VALUES) max = MAX_AMBIGUOUS_VALUES;
+ for (i = first_negative_ambiguous; i < max; i++)
+ cli->ambiguous_values[i] = -cli->ambiguous_values[i] - 1;
+ }
+ return 0;
+
+ worked:
+ min_match = (clp->negated ? cli->long_min_match[value].neg : cli->long_min_match[value].pos);
+ len = argcmp(opt[value].long_name, arg, min_match, 1); /* XXX 1? */
+ assert(len > 0);
+ if (arg[len] == '=') {
+ clp->have_arg = 1;
+ clp->arg = arg + len + 1;
+ }
+ return &opt[value];
+}
+
+
+static Clp_Option *
+find_short(Clp_Parser *clp, int short_name)
+ /* If short_name corresponds to one of clp's options, returns it. */
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_Option *opt = cli->opt;
+ int i;
+
+ for (i = 0; i < cli->nopt; i++)
+ if (opt[i].short_name == short_name
+ && (clp->negated
+ ? TEST(&opt[i], Clp_Negate)
+ : !TEST(&opt[i], Clp_OnlyNegated)))
+ return &opt[i];
+
+ return 0;
+}
+
+
+int
+Clp_Next(Clp_Parser *clp)
+ /* Gets and parses the next argument from the argument list.
+
+ If there are no more arguments, returns Clp_Done.
+ If the next argument isn't an option, returns Clp_NotOption;
+ the argument is stored in clp->arg.
+ If the next argument is an option, returns that option's option_id.
+
+ If the next argument is an unrecognizable or ambiguous option,
+ an error message is given and Clp_BadOption is returned.
+
+ If an option has an argument, that argument is stored in clp->arg
+ and clp->have_arg is set to 1.
+ Furthermore, that argument's parsed value (according to its type)
+ is stored in the clp->val union.
+
+ If an option needs an argument but isn't given one;
+ if it doesn't need an argument but IS given one;
+ or if the argument is the wrong type,
+ an error message is given and Clp_BadOption is returned. */
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_Option *opt;
+ Clp_ParserState clpsave;
+ int complain;
+
+ /** Set up clp **/
+ cli->current_option = 0;
+ cli->ambiguous = 0;
+
+ /** Get the next argument or option **/
+ if (!next_argument(clp, cli->option_processing ? 0 : 2))
+ return clp->have_arg ? Clp_NotOption : Clp_Done;
+
+ clp->negated = cli->whole_negated;
+ if (cli->is_short)
+ opt = find_short(clp, cli->text[0]);
+ else
+ opt = find_long(clp, cli->text);
+
+ /** If there's ambiguity between long & short options, and we couldn't
+ find a long option, look for a short option **/
+ if (!opt && cli->could_be_short) {
+ switch_to_short_argument(clp);
+ opt = find_short(clp, cli->text[0]);
+ }
+
+ /** If we didn't find an option... **/
+ if (!opt || (clp->negated && !TEST(opt, Clp_Negate))) {
+
+ /* default processing for the "--" option: turn off option processing
+ and return the next argument */
+ if (strcmp(cli->argv[0], "--") == 0) {
+ Clp_SetOptionProcessing(clp, 0);
+ return Clp_Next(clp);
+ }
+
+ /* otherwise, report some error or other */
+ if (cli->ambiguous)
+ ambiguity_error(clp, cli->ambiguous, cli->ambiguous_values,
+ cli->opt, cli->option_chars,
+ "option '%s%s' is ambiguous",
+ cli->option_chars, cli->text);
+ else if (cli->is_short && !cli->could_be_short)
+ Clp_OptionError(clp, "unrecognized option '%s%c'",
+ cli->option_chars, cli->text[0]);
+ else
+ Clp_OptionError(clp, "unrecognized option '%s%s'",
+ cli->option_chars, cli->text);
+ return Clp_BadOption;
+ }
+
+ /** Set the current option **/
+ cli->current_option = opt;
+ cli->current_short = cli->is_short;
+ cli->negated_by_no = clp->negated && !cli->whole_negated;
+
+ /** The no-argument (or should-have-no-argument) case **/
+ if (clp->negated || !TEST(opt, Clp_AnyArgument)) {
+ if (clp->have_arg) {
+ Clp_OptionError(clp, "'%O' can't take an argument");
+ return Clp_BadOption;
+ } else
+ return opt->option_id;
+ }
+
+ /** Get an argument if we need one, or if it's optional **/
+ /* Sanity-check the argument type. */
+ if (opt->arg_type <= 0 || opt->arg_type >= cli->nargtype
+ || cli->argtype[ opt->arg_type ].func == 0)
+ return Clp_Error;
+
+ /* complain == 1 only if the argument was explicitly given,
+ or it is mandatory. */
+ complain = (clp->have_arg != 0) || TEST(opt, Clp_Mandatory);
+ Clp_SaveParser(clp, &clpsave);
+
+ if (TEST(opt, Clp_Mandatory) && !clp->have_arg) {
+ /* Mandatory argument case */
+ /* Allow arguments to options to start with a dash, but only if the
+ argument type allows it by not setting Clp_DisallowOptions */
+ int disallow = TEST(&cli->argtype[opt->arg_type], Clp_DisallowOptions);
+ next_argument(clp, disallow ? 1 : 2);
+ if (!clp->have_arg) {
+ int got_option = cli->text != 0;
+ Clp_RestoreParser(clp, &clpsave);
+ if (got_option)
+ Clp_OptionError(clp, "'%O' requires a non-option argument");
+ else
+ Clp_OptionError(clp, "'%O' requires an argument");
+ return Clp_BadOption;
+ }
+
+ } else if (cli->is_short && !clp->have_arg && cli->text[1] != 0)
+ /* The -[option]argument case:
+ Assume that the rest of the current string is the argument. */
+ next_argument(clp, 1);
+
+ /** Parse the argument **/
+ if (clp->have_arg) {
+ Clp_ArgType *atr = &cli->argtype[ opt->arg_type ];
+ if (atr->func(clp, clp->arg, complain, atr->thunk) <= 0) {
+ /* parser failed */
+ clp->have_arg = 0;
+ if (TEST(opt, Clp_Mandatory))
+ return Clp_BadOption;
+ else
+ Clp_RestoreParser(clp, &clpsave);
+ }
+ }
+
+ return opt->option_id;
+}
+
+
+const char *
+Clp_Shift(Clp_Parser *clp, int allow_dashes)
+ /* Returns the next argument from the argument list without parsing it.
+ If there are no more arguments, returns 0. */
+{
+ Clp_ParserState clpsave;
+ Clp_SaveParser(clp, &clpsave);
+ next_argument(clp, allow_dashes ? 2 : 1);
+ if (!clp->have_arg)
+ Clp_RestoreParser(clp, &clpsave);
+ return clp->arg;
+}
+
+
+/*******
+ * Clp_OptionError
+ **/
+
+typedef struct Clp_BuildString {
+ char *text;
+ char *pos;
+ int capacity;
+ int bad;
+} Clp_BuildString;
+
+static Clp_BuildString *
+new_build_string(void)
+{
+ Clp_BuildString *bs = (Clp_BuildString *)malloc(sizeof(Clp_BuildString));
+ if (!bs) goto bad;
+ bs->text = (char *)malloc(256);
+ if (!bs->text) goto bad;
+ bs->pos = bs->text;
+ bs->capacity = 256;
+ bs->bad = 0;
+ return bs;
+
+ bad:
+ if (bs) free(bs);
+ return 0;
+}
+
+static void
+free_build_string(Clp_BuildString *bs)
+{
+ if (bs) free(bs->text);
+ free(bs);
+}
+
+static int
+grow_build_string(Clp_BuildString *bs, int want)
+{
+ char *new_text;
+ int ipos = bs->pos - bs->text;
+ int new_capacity = bs->capacity;
+ while (want >= new_capacity)
+ new_capacity *= 2;
+ new_text = (char *)realloc(bs->text, new_capacity);
+ if (!new_text) {
+ bs->bad = 1;
+ return 0;
+ } else {
+ bs->text = new_text;
+ bs->pos = bs->text + ipos;
+ bs->capacity = new_capacity;
+ return 1;
+ }
+}
+
+#define ENSURE_BUILD_STRING(bs, space) \
+ ((((bs)->pos - (bs)->text) + (space) >= (bs)->capacity) \
+ || grow_build_string((bs), ((bs)->pos - (bs)->text) + (space)))
+
+static void
+append_build_string(Clp_BuildString *bs, const char *s, int l)
+{
+ if (l < 0)
+ l = strlen(s);
+ if (ENSURE_BUILD_STRING(bs, l)) {
+ memcpy(bs->pos, s, l);
+ bs->pos += l;
+ }
+}
+
+
+static Clp_BuildString *
+Clp_VaOptionError(Clp_Parser *clp, Clp_BuildString *bs,
+ const char *fmt, va_list val)
+ /* Reports an error for parser clp. Allowable % format characters are:
+
+ s Print a string from the argument list.
+ c Print an int from the argument list as a character.
+ d Print an int from the argument list.
+ O Print the name of the current option;
+ take nothing from the argument list.
+
+ No field specifications or flags are allowed. Always returns 0. */
+{
+ Clp_Internal *cli = clp->internal;
+ const char *percent;
+
+ if (!bs)
+ bs = new_build_string();
+ if (!bs)
+ return 0;
+ append_build_string(bs, cli->program_name, -1);
+ append_build_string(bs, ": ", 2);
+
+ for (percent = strchr(fmt, '%'); percent; percent = strchr(fmt, '%')) {
+ append_build_string(bs, fmt, percent - fmt);
+ switch (*++percent) {
+
+ case 's': {
+ char *s = va_arg(val, char *);
+ if (s) append_build_string(bs, s, -1);
+ else append_build_string(bs, "(null)", 6);
+ break;
+ }
+
+ case 'c': {
+ int c = va_arg(val, int);
+ if (ENSURE_BUILD_STRING(bs, 4)) {
+ if (c >= 32 && c <= 126)
+ *bs->pos++ = c;
+ else if (c < 32) {
+ *bs->pos++ = '^';
+ *bs->pos++ = c + 64;
+ } else {
+ sprintf(bs->pos, "\\%03o", c);
+ bs->pos += 4;
+ }
+ }
+ break;
+ }
+
+ case 'd': {
+ int d = va_arg(val, int);
+ if (ENSURE_BUILD_STRING(bs, 32)) {
+ sprintf(bs->pos, "%d", d);
+ bs->pos = strchr(bs->pos, 0);
+ }
+ break;
+ }
+
+ case 'O': {
+ Clp_Option *opt = cli->current_option;
+ if (!opt)
+ append_build_string(bs, "(no current option!)", -1);
+ else if (cli->current_short) {
+ append_build_string(bs, cli->option_chars, -1);
+ if (ENSURE_BUILD_STRING(bs, 1))
+ *bs->pos++ = opt->short_name;
+ } else if (cli->negated_by_no) {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, "no-", 3);
+ append_build_string(bs, opt->long_name, -1);
+ } else {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, opt->long_name, -1);
+ }
+ break;
+ }
+
+ case '%':
+ if (ENSURE_BUILD_STRING(bs, 1))
+ *bs->pos++ = '%';
+ break;
+
+ default:
+ if (ENSURE_BUILD_STRING(bs, 2)) {
+ *bs->pos++ = '%';
+ *bs->pos++ = *percent;
+ }
+ break;
+
+ }
+ fmt = ++percent;
+ }
+
+ append_build_string(bs, fmt, -1);
+ append_build_string(bs, "\n", 1);
+
+ return bs;
+}
+
+static void
+do_error(Clp_Parser *clp, Clp_BuildString *bs)
+{
+ const char *text;
+ if (bs && !bs->bad) {
+ *bs->pos = 0;
+ text = bs->text;
+ } else
+ text = "out of memory\n";
+
+ if (clp->internal->error_handler != 0)
+ (*clp->internal->error_handler)(text);
+ else
+ fputs(text, stderr);
+}
+
+int
+Clp_OptionError(Clp_Parser *clp, const char *fmt, ...)
+{
+ Clp_BuildString *bs;
+ va_list val;
+ va_start(val, fmt);
+ bs = Clp_VaOptionError(clp, 0, fmt, val);
+ va_end(val);
+ do_error(clp, bs);
+ free_build_string(bs);
+ return 0;
+}
+
+static int
+ambiguity_error(Clp_Parser *clp, int ambiguous, int *ambiguous_values,
+ Clp_Option *opt, const char *prefix,
+ const char *fmt, ...)
+{
+ Clp_BuildString *bs;
+ int i;
+ va_list val;
+ va_start(val, fmt);
+ bs = Clp_VaOptionError(clp, 0, fmt, val);
+ if (!bs) goto done;
+
+ append_build_string(bs, clp->internal->program_name, -1);
+ append_build_string(bs, ": (Possibilities are", -1);
+
+ for (i = 0; i < ambiguous && i < MAX_AMBIGUOUS_VALUES; i++) {
+ int value = ambiguous_values[i];
+ const char *no_dash = "";
+ if (value < 0)
+ value = -(value + 1), no_dash = "no-";
+ if (i == 0)
+ append_build_string(bs, " ", 1);
+ else if (i == ambiguous - 1)
+ append_build_string(bs, (i == 1 ? " and " : ", and "), -1);
+ else
+ append_build_string(bs, ", ", 2);
+ append_build_string(bs, prefix, -1);
+ append_build_string(bs, no_dash, -1);
+ append_build_string(bs, opt[value].long_name, -1);
+ }
+
+ if (ambiguous > MAX_AMBIGUOUS_VALUES)
+ append_build_string(bs, ", and others", -1);
+ append_build_string(bs, ".)\n", -1);
+ va_end(val);
+
+ done:
+ do_error(clp, bs);
+ free_build_string(bs);
+ return 0;
+}
+
+static int
+copy_string(char *buf, int buflen, int bufpos, const char *what)
+{
+ int l = strlen(what);
+ if (l > buflen - bufpos - 1)
+ l = buflen - bufpos - 1;
+ memcpy(buf + bufpos, what, l);
+ return l;
+}
+
+int
+Clp_CurOptionNameBuf(Clp_Parser *clp, char *buf, int buflen)
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_Option *opt = cli->current_option;
+ int pos = 0;
+ if (!opt)
+ pos += copy_string(buf, buflen, pos, "(no current option!)");
+ else if (cli->current_short) {
+ pos += copy_string(buf, buflen, pos, cli->option_chars);
+ if (pos < buflen - 1)
+ buf[pos++] = opt->short_name;
+ } else if (cli->negated_by_no) {
+ pos += copy_string(buf, buflen, pos, cli->option_chars);
+ pos += copy_string(buf, buflen, pos, "no-");
+ pos += copy_string(buf, buflen, pos, opt->long_name);
+ } else {
+ pos += copy_string(buf, buflen, pos, cli->option_chars);
+ pos += copy_string(buf, buflen, pos, opt->long_name);
+ }
+ buf[pos] = 0;
+ return pos;
+}
+
+const char *
+Clp_CurOptionName(Clp_Parser *clp)
+{
+ static char buf[256];
+ Clp_CurOptionNameBuf(clp, buf, 256);
+ return buf;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/error.cc b/Build/source/utils/lcdf-typetools/liblcdf/error.cc
new file mode 100644
index 00000000000..50b79f4d2f4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/error.cc
@@ -0,0 +1,883 @@
+// -*- c-basic-offset: 2; related-file-name: "../include/lcdf/error.hh" -*-
+/*
+ * error.{cc,hh} -- flexible classes for error reporting
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2005 Eddie Kohler
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <lcdf/hashmap.hh>
+#include <errno.h>
+#include <ctype.h>
+#include <algorithm>
+#ifndef __KERNEL__
+# include <stdlib.h>
+#endif
+
+struct ErrorHandler::Conversion {
+ String name;
+ ConversionHook hook;
+ Conversion *next;
+};
+static ErrorHandler::Conversion *error_items;
+
+const int ErrorHandler::OK_RESULT = 0;
+const int ErrorHandler::ERROR_RESULT = -EINVAL;
+
+int
+ErrorHandler::min_verbosity() const
+{
+ return 0;
+}
+
+void
+ErrorHandler::debug(const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_DEBUG, String(), format, val);
+ va_end(val);
+}
+
+void
+ErrorHandler::message(const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_MESSAGE, String(), format, val);
+ va_end(val);
+}
+
+int
+ErrorHandler::warning(const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_WARNING, String(), format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+int
+ErrorHandler::error(const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_ERROR, String(), format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+int
+ErrorHandler::fatal(const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_FATAL, String(), format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+int
+ErrorHandler::fatal(int exit_status, const char *format, ...)
+{
+ assert(exit_status >= 0 && exit_status < 0x1000);
+ va_list val;
+ va_start(val, format);
+ verror((Seriousness) (ERR_MIN_FATAL + (exit_status << ERRVERBOSITY_SHIFT)), String(), format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+void
+ErrorHandler::ldebug(const String &where, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_DEBUG, where, format, val);
+ va_end(val);
+}
+
+void
+ErrorHandler::lmessage(const String &where, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_MESSAGE, where, format, val);
+ va_end(val);
+}
+
+int
+ErrorHandler::lwarning(const String &where, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_WARNING, where, format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+int
+ErrorHandler::lerror(const String &where, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_ERROR, where, format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+int
+ErrorHandler::lfatal(const String &where, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ verror(ERR_FATAL, where, format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+int
+ErrorHandler::lfatal(int exit_status, const String &where, const char *format, ...)
+{
+ assert(exit_status >= 0 && exit_status < 0x1000);
+ va_list val;
+ va_start(val, format);
+ verror((Seriousness) (ERR_MIN_FATAL + (exit_status << ERRVERBOSITY_SHIFT)), where, format, val);
+ va_end(val);
+ return ERROR_RESULT;
+}
+
+String
+ErrorHandler::make_text(Seriousness seriousness, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ String s = make_text(seriousness, format, val);
+ va_end(val);
+ return s;
+}
+
+#define NUMBUF_SIZE 128
+#define ErrH ErrorHandler
+
+static char *
+do_number(unsigned long num, char *after_last, int base, int flags)
+{
+ const char *digits =
+ ((flags & ErrH::UPPERCASE) ? "0123456789ABCDEF" : "0123456789abcdef");
+ char *pos = after_last;
+ while (num) {
+ *--pos = digits[num % base];
+ num /= base;
+ }
+ if (pos == after_last)
+ *--pos = '0';
+ return pos;
+}
+
+static char *
+do_number_flags(char *pos, char *after_last, int base, int flags,
+ int precision, int field_width)
+{
+ // remove ALTERNATE_FORM for zero results in base 16
+ if ((flags & ErrH::ALTERNATE_FORM) && base == 16 && *pos == '0')
+ flags &= ~ErrH::ALTERNATE_FORM;
+
+ // account for zero padding
+ if (precision >= 0)
+ while (after_last - pos < precision)
+ *--pos = '0';
+ else if (flags & ErrH::ZERO_PAD) {
+ if ((flags & ErrH::ALTERNATE_FORM) && base == 16)
+ field_width -= 2;
+ if ((flags & ErrH::NEGATIVE)
+ || (flags & (ErrH::PLUS_POSITIVE | ErrH::SPACE_POSITIVE)))
+ field_width--;
+ while (after_last - pos < field_width)
+ *--pos = '0';
+ }
+
+ // alternate forms
+ if ((flags & ErrH::ALTERNATE_FORM) && base == 8 && pos[1] != '0')
+ *--pos = '0';
+ else if ((flags & ErrH::ALTERNATE_FORM) && base == 16) {
+ *--pos = ((flags & ErrH::UPPERCASE) ? 'X' : 'x');
+ *--pos = '0';
+ }
+
+ // sign
+ if (flags & ErrH::NEGATIVE)
+ *--pos = '-';
+ else if (flags & ErrH::PLUS_POSITIVE)
+ *--pos = '+';
+ else if (flags & ErrH::SPACE_POSITIVE)
+ *--pos = ' ';
+
+ return pos;
+}
+
+String
+ErrorHandler::make_text(Seriousness seriousness, const char *s, va_list val)
+{
+ StringAccum msg;
+
+ char numbuf[NUMBUF_SIZE]; // for numerics
+ numbuf[NUMBUF_SIZE-1] = 0;
+
+ String placeholder; // to ensure temporaries aren't destroyed
+
+ // prepend 'warning: ' to every line if appropriate
+ String begin_lines;
+ if (seriousness >= ERR_MIN_WARNING && seriousness < ERR_MIN_ERROR) {
+ begin_lines = String::stable_string("warning: ", 9);
+ msg << begin_lines;
+ }
+
+ // declare and initialize these here to make gcc shut up about possible
+ // use before initialization
+ int flags = 0;
+ int field_width = -1;
+ int precision = -1;
+ int width_flag = 0;
+ int base = 10;
+ while (1) {
+
+ const char *pct = strchr(s, '%');
+
+ // handle begin_lines
+ const char *nl;
+ while (begin_lines && (nl = strchr(s, '\n')) && (!pct || nl < pct)) {
+ msg.append(s, nl + 1 - s);
+ if (nl[1])
+ msg.append(begin_lines.data(), begin_lines.length());
+ s = nl + 1;
+ }
+
+ if (!pct) {
+ if (*s)
+ msg << s;
+ break;
+ }
+ if (pct != s) {
+ msg.append(s, pct - s);
+ s = pct;
+ }
+
+ // parse flags
+ flags = 0;
+ flags:
+ switch (*++s) {
+ case '#': flags |= ALTERNATE_FORM; goto flags;
+ case '0': flags |= ZERO_PAD; goto flags;
+ case '-': flags |= LEFT_JUST; goto flags;
+ case ' ': flags |= SPACE_POSITIVE; goto flags;
+ case '+': flags |= PLUS_POSITIVE; goto flags;
+ }
+
+ // parse field width
+ field_width = -1;
+ if (*s == '*') {
+ field_width = va_arg(val, int);
+ if (field_width < 0) {
+ field_width = -field_width;
+ flags |= LEFT_JUST;
+ }
+ s++;
+ } else if (*s >= '0' && *s <= '9')
+ for (field_width = 0; *s >= '0' && *s <= '9'; s++)
+ field_width = 10*field_width + *s - '0';
+
+ // parse precision
+ precision = -1;
+ if (*s == '.') {
+ s++;
+ precision = 0;
+ if (*s == '*') {
+ precision = va_arg(val, int);
+ s++;
+ } else if (*s >= '0' && *s <= '9')
+ for (; *s >= '0' && *s <= '9'; s++)
+ precision = 10*precision + *s - '0';
+ }
+
+ // parse width flags
+ width_flag = 0;
+ width_flags:
+ switch (*s) {
+ case 'h':
+ width_flag = 'h'; s++; goto width_flags;
+ case 'l':
+ width_flag = (width_flag == 'l' ? 'q' : 'l'); s++; goto width_flags;
+ case 'L': case 'q':
+ width_flag = 'q'; s++; goto width_flags;
+ }
+
+ // conversion character
+ // after switch, data lies between `s1' and `s2'
+ const char *s1 = 0, *s2 = 0;
+ base = 10;
+ switch (*s++) {
+
+ case 's': {
+ s1 = va_arg(val, const char *);
+ if (!s1)
+ s1 = "(null)";
+ if (flags & ALTERNATE_FORM) {
+ placeholder = String(s1).printable();
+ s1 = placeholder.c_str();
+ }
+ for (s2 = s1; *s2 && precision != 0; s2++)
+ if (precision > 0)
+ precision--;
+ break;
+ }
+
+ case 'c': {
+ int c = va_arg(val, int);
+ // check for extension of 'signed char' to 'int'
+ if (c < 0)
+ c += 256;
+ // assume ASCII
+ if (c == '\n')
+ strcpy(numbuf, "\\n");
+ else if (c == '\t')
+ strcpy(numbuf, "\\t");
+ else if (c == '\r')
+ strcpy(numbuf, "\\r");
+ else if (c == '\0')
+ strcpy(numbuf, "\\0");
+ else if (c < 0 || c >= 256)
+ strcpy(numbuf, "(bad char)");
+ else if (c < 32 || c >= 0177)
+ sprintf(numbuf, "\\%03o", c);
+ else
+ sprintf(numbuf, "%c", c);
+ s1 = numbuf;
+ s2 = strchr(numbuf, 0);
+ break;
+ }
+
+ case '%': {
+ numbuf[0] = '%';
+ s1 = numbuf;
+ s2 = s1 + 1;
+ break;
+ }
+
+ case 'd':
+ case 'i':
+ flags |= SIGNED;
+ case 'u':
+ number: {
+ // protect numbuf from overflow
+ if (field_width > NUMBUF_SIZE)
+ field_width = NUMBUF_SIZE;
+ if (precision > NUMBUF_SIZE-4)
+ precision = NUMBUF_SIZE-4;
+
+ s2 = numbuf + NUMBUF_SIZE;
+
+ unsigned long num;
+#ifdef HAVE_INT64_TYPES
+ if (width_flag == 'q') {
+ uint64_t qnum = va_arg(val, uint64_t);
+ if ((flags & SIGNED) && (int64_t)qnum < 0)
+ qnum = -(int64_t)qnum, flags |= NEGATIVE;
+ String q = cp_unparse_unsigned64(qnum, base, flags & UPPERCASE);
+ s1 = s2 - q.length();
+ memcpy((char *)s1, q.data(), q.length());
+ goto got_number;
+ }
+#endif
+ if (width_flag == 'h') {
+ num = (unsigned short)va_arg(val, int);
+ if ((flags & SIGNED) && (short)num < 0)
+ num = -(short)num, flags |= NEGATIVE;
+ } else if (width_flag == 'l') {
+ num = va_arg(val, unsigned long);
+ if ((flags & SIGNED) && (long)num < 0)
+ num = -(long)num, flags |= NEGATIVE;
+ } else {
+ num = va_arg(val, unsigned int);
+ if ((flags & SIGNED) && (int)num < 0)
+ num = -(int)num, flags |= NEGATIVE;
+ }
+ s1 = do_number(num, (char *)s2, base, flags);
+
+#ifdef HAVE_INT64_TYPES
+ got_number:
+#endif
+ s1 = do_number_flags((char *)s1, (char *)s2, base, flags,
+ precision, field_width);
+ break;
+ }
+
+ case 'o':
+ base = 8;
+ goto number;
+
+ case 'X':
+ flags |= UPPERCASE;
+ case 'x':
+ base = 16;
+ goto number;
+
+ case 'p': {
+ void *v = va_arg(val, void *);
+ s2 = numbuf + NUMBUF_SIZE;
+ s1 = do_number((unsigned long)v, (char *)s2, 16, flags);
+ s1 = do_number_flags((char *)s1, (char *)s2, 16, flags | ALTERNATE_FORM,
+ precision, field_width);
+ break;
+ }
+
+#ifndef __KERNEL__
+ case 'e': case 'f': case 'g':
+ case 'E': case 'F': case 'G': {
+ char format[80], *f = format, new_numbuf[NUMBUF_SIZE];
+ *f++ = '%';
+ if (flags & ALTERNATE_FORM)
+ *f++ = '#';
+ if (precision >= 0)
+ f += sprintf(f, ".%d", precision);
+ *f++ = s[-1];
+ *f++ = 0;
+
+ int len = sprintf(new_numbuf, format, va_arg(val, double));
+
+ s2 = numbuf + NUMBUF_SIZE;
+ s1 = s2 - len;
+ memcpy((char *)s1, new_numbuf, len); // note: no terminating \0
+ s1 = do_number_flags((char *)s1, (char *)s2, 10, flags & ~ALTERNATE_FORM, -1, field_width);
+ break;
+ }
+#endif
+
+ case '{': {
+ const char *rbrace = strchr(s, '}');
+ if (!rbrace || rbrace == s)
+ assert(0 /* Bad %{ in error */);
+ String name(s, rbrace - s);
+ s = rbrace + 1;
+ for (Conversion *item = error_items; item; item = item->next)
+ if (item->name == name) {
+ placeholder = item->hook(flags, VA_LIST_REF(val));
+ s1 = placeholder.data();
+ s2 = s1 + placeholder.length();
+ goto got_result;
+ }
+ assert(0 /* Bad %{ in error */);
+ break;
+ }
+
+ default:
+ assert(0 /* Bad % in error */);
+ break;
+
+ }
+
+ // add result of conversion
+ got_result:
+ int slen = s2 - s1;
+ if (slen > field_width) field_width = slen;
+ char *dest = msg.extend(field_width);
+ if (flags & LEFT_JUST) {
+ memcpy(dest, s1, slen);
+ memset(dest + slen, ' ', field_width - slen);
+ } else {
+ memcpy(dest + field_width - slen, s1, slen);
+ memset(dest, (flags & ZERO_PAD ? '0' : ' '), field_width - slen);
+ }
+ }
+
+ return msg.take_string();
+}
+
+String
+ErrorHandler::decorate_text(Seriousness, const String &landmark, const String &text)
+{
+ String new_text = text;
+
+ // handle landmark
+ if (landmark
+ && !(landmark.length() > 2 && landmark[0] == '\\'
+ && landmark.back() == '\\')) {
+ // ignore special-purpose landmarks (begin and end with a backslash `\')
+ // fix landmark: skip trailing spaces and trailing colon
+ int i, len = landmark.length();
+ for (i = len - 1; i >= 0; i--)
+ if (!isspace((unsigned char) landmark[i]))
+ break;
+ if (i >= 0 && landmark[i] == ':')
+ i--;
+
+ // prepend landmark, unless all spaces
+ if (i >= 0)
+ new_text = prepend_lines(landmark.substring(0, i+1) + ": ", new_text);
+ }
+
+ return new_text;
+}
+
+int
+ErrorHandler::verror(Seriousness seriousness, const String &where,
+ const char *s, va_list val)
+{
+ String text = make_text(seriousness, s, val);
+ text = decorate_text(seriousness, where, text);
+ handle_text(seriousness, text);
+ return count_error(seriousness, text);
+}
+
+int
+ErrorHandler::verror_text(Seriousness seriousness, const String &where,
+ const String &text)
+{
+ // text is already made
+ String dec_text = decorate_text(seriousness, where, text);
+ handle_text(seriousness, dec_text);
+ return count_error(seriousness, dec_text);
+}
+
+void
+ErrorHandler::set_error_code(int)
+{
+}
+
+String
+ErrorHandler::prepend_lines(const String &prepend, const String &text)
+{
+ if (!prepend)
+ return text;
+
+ StringAccum sa;
+ const char *begin = text.begin();
+ const char *end = text.end();
+ while (begin < end) {
+ const char *nl = std::find(begin, end, '\n');
+ if (nl < end)
+ nl++;
+ sa << prepend << text.substring(begin, nl);
+ begin = nl;
+ }
+
+ return sa.take_string();
+}
+
+
+//
+// BASE ERROR HANDLER
+//
+
+int
+BaseErrorHandler::count_error(Seriousness seriousness, const String &)
+{
+ if (seriousness < ERR_MIN_WARNING)
+ /* do nothing */;
+ else if (seriousness < ERR_MIN_ERROR)
+ _nwarnings++;
+ else
+ _nerrors++;
+ return (seriousness < ERR_MIN_WARNING ? OK_RESULT : ERROR_RESULT);
+}
+
+
+#ifndef __KERNEL__
+//
+// FILE ERROR HANDLER
+//
+
+FileErrorHandler::FileErrorHandler(FILE *f, const String &context)
+ : _f(f), _context(context)
+{
+}
+
+void
+FileErrorHandler::handle_text(Seriousness seriousness, const String &message)
+{
+ String text = prepend_lines(_context, message);
+ if (text && text.back() != '\n')
+ text += '\n';
+ fwrite(text.data(), 1, text.length(), _f);
+
+ if (seriousness >= ERR_MIN_FATAL) {
+ int exit_status = (seriousness - ERR_MIN_FATAL) >> ERRVERBOSITY_SHIFT;
+ exit(exit_status);
+ }
+}
+#endif
+
+
+//
+// SILENT ERROR HANDLER
+//
+
+class SilentErrorHandler : public BaseErrorHandler { public:
+ SilentErrorHandler() { }
+ void handle_text(Seriousness, const String &);
+};
+
+void
+SilentErrorHandler::handle_text(Seriousness, const String &)
+{
+}
+
+
+//
+// STATIC ERROR HANDLERS
+//
+
+static ErrorHandler *the_default_handler = 0;
+static ErrorHandler *the_silent_handler = 0;
+
+ErrorHandler::Conversion *
+ErrorHandler::add_conversion(const String &name, ConversionHook hook)
+{
+ if (Conversion *c = new Conversion) {
+ c->name = name;
+ c->hook = hook;
+ c->next = error_items;
+ error_items = c;
+ return c;
+ } else
+ return 0;
+}
+
+int
+ErrorHandler::remove_conversion(ErrorHandler::Conversion *conv)
+{
+ Conversion **pprev = &error_items;
+ for (Conversion *c = error_items; c; pprev = &c->next, c = *pprev)
+ if (c == conv) {
+ *pprev = c->next;
+ delete c;
+ return 0;
+ }
+ return -1;
+}
+
+ErrorHandler *
+ErrorHandler::static_initialize(ErrorHandler *default_handler)
+{
+ the_default_handler = default_handler;
+ return the_default_handler;
+}
+
+void
+ErrorHandler::static_cleanup()
+{
+ delete the_default_handler;
+ delete the_silent_handler;
+ the_default_handler = the_silent_handler = 0;
+ while (error_items) {
+ Conversion *next = error_items->next;
+ delete error_items;
+ error_items = next;
+ }
+}
+
+bool
+ErrorHandler::has_default_handler()
+{
+ return the_default_handler ? true : false;
+}
+
+ErrorHandler *
+ErrorHandler::default_handler()
+{
+ assert(the_default_handler != 0);
+ return the_default_handler;
+}
+
+ErrorHandler *
+ErrorHandler::silent_handler()
+{
+ if (!the_silent_handler)
+ the_silent_handler = new SilentErrorHandler;
+ return the_silent_handler;
+}
+
+void
+ErrorHandler::set_default_handler(ErrorHandler *errh)
+{
+ the_default_handler = errh;
+}
+
+
+//
+// ERROR VENEER
+//
+
+int
+ErrorVeneer::nwarnings() const
+{
+ return _errh->nwarnings();
+}
+
+int
+ErrorVeneer::nerrors() const
+{
+ return _errh->nerrors();
+}
+
+void
+ErrorVeneer::reset_counts()
+{
+ _errh->reset_counts();
+}
+
+String
+ErrorVeneer::make_text(Seriousness seriousness, const char *s, va_list val)
+{
+ return _errh->make_text(seriousness, s, val);
+}
+
+String
+ErrorVeneer::decorate_text(Seriousness seriousness, const String &landmark, const String &text)
+{
+ return _errh->decorate_text(seriousness, landmark, text);
+}
+
+void
+ErrorVeneer::handle_text(Seriousness seriousness, const String &text)
+{
+ _errh->handle_text(seriousness, text);
+}
+
+int
+ErrorVeneer::count_error(Seriousness seriousness, const String &text)
+{
+ return _errh->count_error(seriousness, text);
+}
+
+
+//
+// CONTEXT ERROR HANDLER
+//
+
+ContextErrorHandler::ContextErrorHandler(ErrorHandler *errh,
+ const String &context,
+ const String &indent,
+ const String &context_landmark)
+ : ErrorVeneer(errh), _context(context), _indent(indent),
+ _context_landmark(context_landmark)
+{
+}
+
+String
+ContextErrorHandler::decorate_text(Seriousness seriousness, const String &landmark, const String &text)
+{
+ String context_lines;
+ if (_context) {
+ // do not print context or indent if underlying ErrorHandler doesn't want
+ // context
+ if (_errh->min_verbosity() > ERRVERBOSITY_CONTEXT)
+ _context = _indent = String();
+ else {
+ context_lines = _errh->decorate_text(ERR_MESSAGE, (_context_landmark ? _context_landmark : landmark), _context);
+ if (context_lines && context_lines.back() != '\n')
+ context_lines += '\n';
+ _context = String();
+ }
+ }
+ return context_lines + _errh->decorate_text(seriousness, (landmark ? landmark : _context_landmark), prepend_lines(_indent, text));
+}
+
+
+//
+// PREFIX ERROR HANDLER
+//
+
+PrefixErrorHandler::PrefixErrorHandler(ErrorHandler *errh,
+ const String &prefix)
+ : ErrorVeneer(errh), _prefix(prefix)
+{
+}
+
+String
+PrefixErrorHandler::decorate_text(Seriousness seriousness, const String &landmark, const String &text)
+{
+ return _errh->decorate_text(seriousness, landmark, prepend_lines(_prefix, text));
+}
+
+
+//
+// LANDMARK ERROR HANDLER
+//
+
+LandmarkErrorHandler::LandmarkErrorHandler(ErrorHandler *errh, const String &landmark)
+ : ErrorVeneer(errh), _landmark(landmark)
+{
+}
+
+String
+LandmarkErrorHandler::decorate_text(Seriousness seriousness, const String &lm, const String &text)
+{
+ if (lm)
+ return _errh->decorate_text(seriousness, lm, text);
+ else
+ return _errh->decorate_text(seriousness, _landmark, text);
+}
+
+
+//
+// VERBOSE FILTER ERROR HANDLER
+//
+
+VerboseFilterErrorHandler::VerboseFilterErrorHandler(ErrorHandler *errh, int min_verbosity)
+ : ErrorVeneer(errh), _min_verbosity(min_verbosity)
+{
+}
+
+int
+VerboseFilterErrorHandler::min_verbosity() const
+{
+ int m = _errh->min_verbosity();
+ return (m >= _min_verbosity ? m : _min_verbosity);
+}
+
+void
+VerboseFilterErrorHandler::handle_text(Seriousness s, const String &text)
+{
+ if ((s & ERRVERBOSITY_MASK) >= _min_verbosity)
+ _errh->handle_text(s, text);
+}
+
+
+//
+// BAIL ERROR HANDLER
+//
+
+#ifndef __KERNEL__
+
+BailErrorHandler::BailErrorHandler(ErrorHandler *errh, Seriousness s)
+ : ErrorVeneer(errh), _exit_seriousness(s)
+{
+}
+
+void
+BailErrorHandler::handle_text(Seriousness s, const String &text)
+{
+ _errh->handle_text(s, text);
+ if (s >= _exit_seriousness)
+ exit(1);
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/filename.cc b/Build/source/utils/lcdf-typetools/liblcdf/filename.cc
new file mode 100644
index 00000000000..5cf060ff3d7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/filename.cc
@@ -0,0 +1,130 @@
+// -*- related-file-name: "../include/lcdf/filename.hh" -*-
+
+/* filename.{cc,hh} -- filenames
+ *
+ * Copyright (c) 1999-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/filename.hh>
+#include <lcdf/landmark.hh>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifndef PATHNAME_SEPARATOR
+# define PATHNAME_SEPARATOR '/'
+#endif
+#ifndef CURRENT_DIRECTORY
+# define CURRENT_DIRECTORY "./"
+#endif
+
+
+Filename::Filename(const String &fn)
+ : _path(fn), _actual(0)
+{
+ if (!fn)
+ return;
+
+ int last_slash = fn.find_right(PATHNAME_SEPARATOR);
+ if (last_slash >= 0) {
+ _dir = _path.substring(0, last_slash + 1);
+ _name = _path.substring(last_slash + 1);
+ } else {
+ _dir = CURRENT_DIRECTORY;
+ _name = fn;
+ }
+
+ assert(_dir.back() == PATHNAME_SEPARATOR);
+}
+
+Filename::Filename(const String &dir, const String &name)
+ : _name(name), _actual(0)
+{
+ if (!name)
+ return;
+
+ if (_name[0] == PATHNAME_SEPARATOR)
+ _dir = "";
+ else if (dir) {
+ _dir = dir;
+ if (dir.back() != PATHNAME_SEPARATOR)
+ _dir += PATHNAME_SEPARATOR;
+ } else
+ _dir = CURRENT_DIRECTORY;
+
+ int slash = name.find_right(PATHNAME_SEPARATOR);
+ if (slash >= 0) {
+ _dir += name.substring(0, slash + 1);
+ _name = name.substring(slash + 1);
+ }
+
+ _path = _dir + _name;
+}
+
+Filename::Filename(FILE *actual, const String &name)
+ : _name(name), _path(name), _actual(actual)
+{
+}
+
+
+String
+Filename::extension() const
+{
+ int dot = _name.find_right('.');
+ while (dot > 0 && _name[dot - 1] == '.')
+ dot--;
+ if (dot > 0)
+ return _name.substring(dot + 1);
+ else
+ return String();
+}
+
+String
+Filename::base() const
+{
+ if (String ex = extension())
+ return _name.substring(0, _name.length() - ex.length() - 1);
+ else
+ return _name;
+}
+
+
+FILE *
+Filename::open_read(bool binary) const
+{
+ if (_actual || !_path)
+ return _actual;
+ else
+ return fopen(_path.c_str(), binary ? "rb" : "r");
+}
+
+bool
+Filename::readable() const
+{
+ struct stat s;
+ if (!_path)
+ return false;
+ return _actual || (_path && (stat(_path.c_str(), &s) >= 0));
+}
+
+
+FILE *
+Filename::open_write(bool binary) const
+{
+ if (_actual || !_path)
+ return _actual;
+ else
+ return fopen(_path.c_str(), binary ? "wb" : "w");
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/fixlibc.c b/Build/source/utils/lcdf-typetools/liblcdf/fixlibc.c
new file mode 100644
index 00000000000..85b13251fd4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/fixlibc.c
@@ -0,0 +1,64 @@
+/* Provide definitions for missing or incorrect libc functions. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef HAVE_STRDUP
+char *
+strdup(const char *s)
+{
+ char *t;
+ int l;
+ if (!s)
+ return 0;
+ l = strlen(s) + 1;
+ t = (char *)malloc(l);
+ if (!t)
+ return 0;
+ memcpy(t, s, l);
+ return t;
+}
+#endif
+
+#ifndef HAVE_STRERROR
+/* David Mazieres <dm@lcs.mit.edu> assures me that this definition works. */
+char *
+strerror(int errno)
+{
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+ if (errno < 0 || errno >= sys_nerr)
+ return (char *)"bad error number";
+ else
+ return sys_errlist[errno];
+}
+#endif
+
+#ifdef BROKEN_STRTOD
+/* On NeXTSTEP, Melissa O'Neill <oneill@cs.sfu.ca> reports that strtod
+ consumes whitespace after its argument, which makes mminstance (among other
+ programs) not work. This wrapper gets rid of that whitespace again.
+ (Originally, we suspected strtol too, but it seems to work, at least in
+ NeXTSTEP 3.3 patch 2.) */
+
+double
+good_strtod(const char *nptr, char **endptr)
+{
+ double d = strtod(nptr, endptr);
+ if (endptr)
+ while (*endptr > nptr && isspace((*endptr)[-1]))
+ (*endptr)--;
+ return d;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/globmatch.cc b/Build/source/utils/lcdf-typetools/liblcdf/globmatch.cc
new file mode 100644
index 00000000000..57d5306f42e
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/globmatch.cc
@@ -0,0 +1,116 @@
+// -*- related-file-name: "../include/lcdf/globmatch.hh" -*-
+
+/* globmatch.{cc,hh} -- glob_match() function for shell globbing
+ *
+ * Copyright (c) 2000-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/globmatch.hh>
+#include <lcdf/string.hh>
+#include <lcdf/vector.hh>
+
+bool
+glob_match(const String& str, const String& pattern)
+{
+ const char* sdata = str.data();
+ const char* pdata = pattern.data();
+ int slen = str.length();
+ int plen = pattern.length();
+ int spos = 0, ppos = 0;
+ Vector<int> glob_ppos, glob_spos1, glob_spos2;
+
+ while (1) {
+ while (ppos < plen)
+ switch (pdata[ppos]) {
+
+ case '?':
+ if (spos >= slen)
+ goto done;
+ spos++;
+ ppos++;
+ break;
+
+ case '*':
+ glob_ppos.push_back(ppos + 1);
+ glob_spos1.push_back(spos);
+ glob_spos2.push_back(slen);
+ spos = slen;
+ ppos++;
+ break;
+
+ case '[': {
+ if (spos >= slen)
+ goto done;
+
+ // find end of character class
+ int p = ppos + 1;
+ bool negated = false;
+ if (p < plen && pdata[p] == '^') {
+ negated = true;
+ p++;
+ }
+ int first = p;
+ if (p < plen && pdata[p] == ']')
+ p++;
+ while (p < plen && pdata[p] != ']')
+ p++;
+ if (p >= plen) // not a character class at all
+ goto ordinary;
+
+ // parse character class
+ bool in = false;
+ for (int i = first; i < p && !in; i++) {
+ int c1 = pdata[i];
+ int c2 = c1;
+ if (i < p - 2 && pdata[i+1] == '-') {
+ c2 = pdata[i+2];
+ i += 2;
+ }
+ if (sdata[spos] >= c1 && sdata[spos] <= c2)
+ in = true;
+ }
+
+ if ((negated && in) || (!negated && !in))
+ goto done;
+ ppos = p + 1;
+ spos++;
+ break;
+ }
+
+ default:
+ ordinary:
+ if (spos >= slen || sdata[spos] != pdata[ppos])
+ goto done;
+ spos++;
+ ppos++;
+ break;
+
+ }
+
+ done:
+ if (spos == slen && ppos == plen)
+ return true;
+ while (glob_ppos.size() && glob_spos1.back() == glob_spos2.back()) {
+ glob_ppos.pop_back();
+ glob_spos1.pop_back();
+ glob_spos2.pop_back();
+ }
+ if (glob_ppos.size()) {
+ glob_spos2.back()--;
+ spos = glob_spos2.back();
+ ppos = glob_ppos.back();
+ } else
+ return false;
+ }
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/landmark.cc b/Build/source/utils/lcdf-typetools/liblcdf/landmark.cc
new file mode 100644
index 00000000000..7c4ae9ed835
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/landmark.cc
@@ -0,0 +1,36 @@
+// -*- related-file-name: "../include/lcdf/landmark.hh" -*-
+
+/* landmark.{cc,hh} -- FILE:LINE type landmarks
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/landmark.hh>
+
+Landmark
+operator+(const Landmark &landmark, int offset)
+{
+ if (landmark.has_line())
+ return Landmark(landmark.file(), landmark.line() + offset);
+ else
+ return landmark;
+}
+
+Landmark::operator String() const
+{
+ if (_file && has_line())
+ return _file + ":" + String(_line);
+ else
+ return _file;
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/permstr.cc b/Build/source/utils/lcdf-typetools/liblcdf/permstr.cc
new file mode 100644
index 00000000000..3c604689178
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/permstr.cc
@@ -0,0 +1,370 @@
+// -*- related-file-name: "../include/lcdf/permstr.hh" -*-
+
+/* permstr.{cc,hh} -- permanent strings
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/permstr.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+
+static PermString::Initializer initializer;
+
+PermString::Doodad PermString::zero_char_doodad = {
+ 0, 0, { 0, 0 }
+};
+PermString::Doodad PermString::one_char_doodad[256];
+PermString::Doodad* PermString::buckets[NHASH];
+
+PermString::Initializer::Initializer()
+{
+ static int initialized = 0;
+ if (!initialized) {
+ PermString::static_initialize();
+ initialized = 1;
+ }
+}
+
+void
+PermString::static_initialize()
+{
+ for (int i = 0; i < 256; i++) {
+ one_char_doodad[i].next = 0;
+ one_char_doodad[i].length = 1;
+ one_char_doodad[i].data[0] = i;
+ one_char_doodad[i].data[1] = 0;
+ }
+}
+
+
+// This scatter array, and the ideas behind it, are stolen from lcc.
+static int scatter[] = { /* map characters to random values */
+ 2078917053, 143302914, 1027100827, 1953210302, 755253631,
+ 2002600785, 1405390230, 45248011, 1099951567, 433832350,
+ 2018585307, 438263339, 813528929, 1703199216, 618906479,
+ 573714703, 766270699, 275680090, 1510320440, 1583583926,
+ 1723401032, 1965443329, 1098183682, 1636505764, 980071615,
+ 1011597961, 643279273, 1315461275, 157584038, 1069844923,
+ 471560540, 89017443, 1213147837, 1498661368, 2042227746,
+ 1968401469, 1353778505, 1300134328, 2013649480, 306246424,
+ 1733966678, 1884751139, 744509763, 400011959, 1440466707,
+ 1363416242, 973726663, 59253759, 1639096332, 336563455,
+ 1642837685, 1215013716, 154523136, 593537720, 704035832,
+ 1134594751, 1605135681, 1347315106, 302572379, 1762719719,
+ 269676381, 774132919, 1851737163, 1482824219, 125310639,
+ 1746481261, 1303742040, 1479089144, 899131941, 1169907872,
+ 1785335569, 485614972, 907175364, 382361684, 885626931,
+ 200158423, 1745777927, 1859353594, 259412182, 1237390611,
+ 48433401, 1902249868, 304920680, 202956538, 348303940,
+ 1008956512, 1337551289, 1953439621, 208787970, 1640123668,
+ 1568675693, 478464352, 266772940, 1272929208, 1961288571,
+ 392083579, 871926821, 1117546963, 1871172724, 1771058762,
+ 139971187, 1509024645, 109190086, 1047146551, 1891386329,
+ 994817018, 1247304975, 1489680608, 706686964, 1506717157,
+ 579587572, 755120366, 1261483377, 884508252, 958076904,
+ 1609787317, 1893464764, 148144545, 1415743291, 2102252735,
+ 1788268214, 836935336, 433233439, 2055041154, 2109864544,
+ 247038362, 299641085, 834307717, 1364585325, 23330161,
+ 457882831, 1504556512, 1532354806, 567072918, 404219416,
+ 1276257488, 1561889936, 1651524391, 618454448, 121093252,
+ 1010757900, 1198042020, 876213618, 124757630, 2082550272,
+ 1834290522, 1734544947, 1828531389, 1982435068, 1002804590,
+ 1783300476, 1623219634, 1839739926, 69050267, 1530777140,
+ 1802120822, 316088629, 1830418225, 488944891, 1680673954,
+ 1853748387, 946827723, 1037746818, 1238619545, 1513900641,
+ 1441966234, 367393385, 928306929, 946006977, 985847834,
+ 1049400181, 1956764878, 36406206, 1925613800, 2081522508,
+ 2118956479, 1612420674, 1668583807, 1800004220, 1447372094,
+ 523904750, 1435821048, 923108080, 216161028, 1504871315,
+ 306401572, 2018281851, 1820959944, 2136819798, 359743094,
+ 1354150250, 1843084537, 1306570817, 244413420, 934220434,
+ 672987810, 1686379655, 1301613820, 1601294739, 484902984,
+ 139978006, 503211273, 294184214, 176384212, 281341425,
+ 228223074, 147857043, 1893762099, 1896806882, 1947861263,
+ 1193650546, 273227984, 1236198663, 2116758626, 489389012,
+ 593586330, 275676551, 360187215, 267062626, 265012701,
+ 719930310, 1621212876, 2108097238, 2026501127, 1865626297,
+ 894834024, 552005290, 1404522304, 48964196, 5816381,
+ 1889425288, 188942202, 509027654, 36125855, 365326415,
+ 790369079, 264348929, 513183458, 536647531, 13672163,
+ 313561074, 1730298077, 286900147, 1549759737, 1699573055,
+ 776289160, 2143346068, 1975249606, 1136476375, 262925046,
+ 92778659, 1856406685, 1884137923, 53392249, 1735424165,
+ 1602280572
+};
+
+
+void
+PermString::initialize(const char* s, int length)
+{
+ register unsigned char* m = (unsigned char*) s;
+ register unsigned char* mm;
+
+ if (length < 0)
+ length = (s ? strlen(s) : 0);
+
+ if (length == 0) {
+ _rep = zero_char_doodad.data;
+ return;
+ } else if (length == 1) {
+ _rep = one_char_doodad[m[0]].data;
+ return;
+ }
+
+ unsigned int hash;
+ int l;
+ for (hash = 0, l = length, mm = m; l; mm++, l--)
+ hash = (hash << 1) + scatter[*mm];
+ hash &= (NHASH - 1);
+
+ Doodad *buck;
+ for (buck = buckets[hash]; buck; buck = buck->next)
+ if (length == buck->length && memcmp(s, buck->data, length) == 0) {
+ _rep = buck->data;
+ return;
+ }
+
+ // CANNOT USE new because the structure has variable size.
+ buck = (Doodad *)malloc(sizeof(Doodad) + length - 1);
+ buck->next = buckets[hash];
+ buckets[hash] = buck;
+ buck->length = length;
+ memcpy(buck->data, s, length);
+ buck->data[length] = 0;
+
+ _rep = buck->data;
+}
+
+PermString::PermString(char c)
+{
+ unsigned char u = (unsigned char) c;
+ _rep = one_char_doodad[u].data;
+}
+
+
+
+bool
+operator==(PermString a, const char *b)
+{
+ if (!a || !b)
+ return !a && !b;
+ int l = strlen(b);
+ return a.length() == l && memcmp(a.c_str(), b, l) == 0;
+}
+
+
+char
+PermString::operator[](int e) const
+{
+ assert(e >= 0 && e <= length());
+ if (e >= 0 && e < length())
+ return c_str()[e];
+ else
+ return 0;
+}
+
+
+static int pspos;
+static int pscap = 64;
+static char *psc = (char *)malloc(pscap);
+
+
+static void
+append(const char *s, int len)
+{
+ if (pspos + len >= pscap) {
+ pscap *= 2;
+ psc = (char *)realloc(psc, pscap);
+ }
+ memcpy(psc + pspos, s, len);
+ pspos += len;
+}
+
+inline static void
+extend(int len)
+{
+ while (pspos + len >= pscap) {
+ pscap *= 2;
+ psc = (char *)realloc(psc, pscap);
+ }
+}
+
+PermString
+vpermprintf(const char *s, va_list val)
+{
+ pspos = 0;
+ while (1) {
+
+ const char *pct = strchr(s, '%');
+ if (!pct) {
+ if (*s)
+ append(s, strlen(s));
+ break;
+ }
+ if (pct != s) {
+ append(s, pct - s);
+ s = pct;
+ }
+
+ int iflag = -1;
+ while (1)
+ switch (*++s) {
+
+ case '0':
+ /* zeroflag = 1; */
+ break;
+
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ if (iflag != -1)
+ assert(0 && "Too many decimal flags in permprintf");
+ iflag = 0;
+ while (*s >= '0' && *s <= '9') {
+ iflag = iflag * 10 + *s - '0';
+ s++;
+ }
+ break;
+
+ case '*': {
+ if (iflag != -1)
+ assert(0 && "iflag given");
+ iflag = va_arg(val, int);
+ break;
+ }
+
+ case 's': {
+ const char *x = va_arg(val, const char *);
+ if (x) {
+ if (iflag < 0)
+ append(x, strlen(x));
+ else
+ append(x, iflag);
+ }
+ goto pctdone;
+ }
+
+ case 'c': {
+ char c = (char)(va_arg(val, int) & 0xFF);
+ append(&c, 1);
+ goto pctdone;
+ }
+
+ case 'p': {
+ PermString::Capsule x = va_arg(val, PermString::Capsule);
+ PermString px;
+ if (x)
+ px = PermString::decapsule(x);
+ if (iflag < 0 || iflag > px.length())
+ append(px.c_str(), px.length());
+ else
+ append(px.c_str(), iflag);
+ goto pctdone;
+ }
+
+ case 'd': {
+ // FIXME FIXME rewrite for sense
+ int x = va_arg(val, int);
+ if (pspos == pscap)
+ extend(1);
+
+ // FIXME -2^31
+ unsigned int ux = x;
+ if (x < 0) {
+ psc[pspos++] = '-';
+ ux = -x;
+ }
+
+ int numdigits = 0;
+ for (unsigned digcountx = ux; digcountx > 9; digcountx /= 10)
+ numdigits++;
+
+ extend(numdigits + 1);
+ int digit = numdigits;
+ do {
+ psc[pspos + digit] = (ux % 10) + '0';
+ ux /= 10;
+ digit--;
+ } while (ux);
+ pspos += numdigits + 1;
+
+ goto pctdone;
+ }
+
+ case 'g': {
+ // FIXME FIXME rewrite for sense
+ double x = va_arg(val, double);
+ char buffer[1000];
+ int len;
+ sprintf(buffer, "%.10g%n", x, &len);
+ extend(len);
+ strcpy(psc + pspos, buffer);
+ pspos += len;
+ goto pctdone;
+ }
+
+ default:
+ assert(0 && "Bad % in permprintf");
+ goto pctdone;
+
+ }
+
+ pctdone:
+ s++;
+ }
+
+ return PermString(psc, pspos);
+}
+
+
+PermString
+permprintf(const char *s, ...)
+{
+ va_list val;
+ va_start(val, s);
+ PermString p = vpermprintf(s, val);
+ va_end(val);
+ return p;
+}
+
+
+PermString
+permcat(PermString p1, PermString p2)
+{
+ unsigned l1 = p1.length();
+ unsigned l2 = p2.length();
+ char *s = new char[l1 + l2];
+ memcpy(s, p1.c_str(), l1);
+ memcpy(s + l1, p2.c_str(), l2);
+ PermString p(s, l1 + l2);
+ delete[] s;
+ return p;
+}
+
+PermString
+permcat(PermString p1, PermString p2, PermString p3)
+{
+ unsigned l1 = p1.length();
+ unsigned l2 = p2.length();
+ unsigned l3 = p3.length();
+ char *s = new char[l1 + l2 + l3];
+ memcpy(s, p1.c_str(), l1);
+ memcpy(s + l1, p2.c_str(), l2);
+ memcpy(s + l1 + l2, p3.c_str(), l3);
+ PermString p(s, l1 + l2 + l3);
+ delete[] s;
+ return p;
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/point.cc b/Build/source/utils/lcdf-typetools/liblcdf/point.cc
new file mode 100644
index 00000000000..8759b175408
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/point.cc
@@ -0,0 +1,57 @@
+// -*- related-file-name: "../include/lcdf/point.hh" -*-
+
+/* point.{cc,hh} -- 2D points
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/point.hh>
+
+Point
+Point::rotated(double rotation) const throw ()
+{
+ double r = length();
+ double theta = angle() + rotation;
+ return Point(r * cos(theta), r * sin(theta));
+}
+
+Point
+Point::midpoint(const Point &a, const Point &b) throw ()
+{
+ return Point((a.x + b.x)/2, (a.y + b.y)/2);
+}
+
+bool
+Point::on_line(const Point &a, const Point &b, double tolerance) const throw ()
+{
+ Point c = b - a;
+ double d = c.x * (y - a.y) - c.y * (x - a.x);
+ return (d * d <= tolerance * tolerance * c.squared_length());
+}
+
+bool
+Point::on_segment(const Point &a, const Point &b, double t) const throw ()
+{
+ double tt;
+ Point c = b - a;
+ if (fabs(c.x) > fabs(c.y))
+ tt = (x - a.x) / c.x;
+ else if (c.y)
+ tt = (y - a.y) / c.y;
+ else
+ tt = 0;
+ if (tt < 0 || tt > 1)
+ return 0;
+ return on_line(a, b, t);
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/slurper.cc b/Build/source/utils/lcdf-typetools/liblcdf/slurper.cc
new file mode 100644
index 00000000000..59bc63d612f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/slurper.cc
@@ -0,0 +1,187 @@
+// -*- related-file-name: "../include/lcdf/slurper.hh" -*-
+
+/* slurper.{cc,hh} -- reading from files a line at a time
+ *
+ * Copyright (c) 1998-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/slurper.hh>
+#include <string.h>
+
+static const int DefChunkCap = 2048;
+static const int WorthMoving = 256;
+
+
+Slurper::Slurper(const Filename &filename, FILE *f)
+ : _filename(filename), _lineno(0),
+ _data(new unsigned char[DefChunkCap]), _cap(DefChunkCap),
+ _pos(0), _len(0), _line(0), _line_len(0),
+ _saved_line(false), _at_eof(false)
+{
+ if (f) {
+ _f = f;
+ _own_f = false;
+ } else {
+ _f = _filename.open_read();
+ _own_f = true;
+ }
+}
+
+Slurper::~Slurper()
+{
+ delete[] _data;
+ if (_f && _own_f) fclose(_f);
+}
+
+
+void
+Slurper::grow_buffer()
+{
+ // If we need to keep the upper part of the buffer, shift it down (moving
+ // any data we care about).
+ if (_pos >= _cap - WorthMoving) {
+ // I used to move it myself, with a comment that SunOS didn't have a
+ // correct implementation of memmove. This should be detected by
+ // configure, if it's really a problem.
+ memmove(_data, _data + _pos, _len - _pos);
+ _len -= _pos;
+ _pos = 0;
+ }
+
+ // Grow the buffer if necessary.
+ if (_len >= _cap) {
+ unsigned char *new_data = new unsigned char[ 2 * _cap ];
+ // I can't believe I didn't have the line below!!
+ memcpy(new_data, _data, _len);
+ delete[] _data;
+ _data = new_data;
+ _cap = 2 * _cap;
+ }
+}
+
+
+inline int
+Slurper::more_data()
+{
+ grow_buffer();
+
+ // Read new data into the buffer.
+ int amount = fread(_data + _len, 1, _cap - _len, _f);
+ _len += amount;
+ return amount;
+}
+
+char *
+Slurper::get_line_at(unsigned pos)
+{
+ while (1) {
+ for (; pos < _len; pos++)
+ if (_data[pos] == '\n' || _data[pos] == '\r')
+ goto line_ends_at_pos;
+
+ // no line end? look for more data. save and reset `pos', since _pos
+ // may change.
+ int offset = pos - _pos;
+ bool got_more_data = more_data() != 0;
+ pos = _pos + offset;
+ if (!got_more_data) {
+ _at_eof = true;
+ goto line_ends_at_pos;
+ }
+ }
+
+ line_ends_at_pos:
+
+ // PRECONDITION: the line starts at _pos and ends at pos.
+ unsigned next_pos;
+
+ // Find beginning of next line. 3 cases:
+ // 1. line ends in \r\n -> _pos = pos + 2;
+ // 2. line ends in \r OR \n -> _pos = pos + 1;
+ // 3. neither -> must be last line in file; _pos = pos,
+ // since pos == _len
+ if (pos == _len) {
+ // last line in file didn't end in `\n': must have no data left
+ // ensure we have enough space for terminating nul
+ if (pos == _cap) grow_buffer();
+ next_pos = pos;
+ // if already at EOF, don't increment the line number
+ if (pos == _pos) _lineno--;
+
+ } else if (_data[pos] == '\n')
+ next_pos = pos + 1;
+
+ else {
+ assert(_data[pos] == '\r');
+ // If `\r' is last char in buffer, `\n' might be next char. Must read more
+ // data to check for it, or we'd report an empty line that didn't really
+ // exist.
+ if (pos == _len - 1) {
+ // be careful about the possible shift of _pos and _len!
+ int offset = pos - _pos;
+ more_data();
+ pos = _pos + offset;
+ }
+ if (pos < _len - 1 && _data[pos + 1] == '\n')
+ next_pos = pos + 2;
+ else
+ next_pos = pos + 1;
+ }
+
+ _line = _data + _pos;
+ _line_len = pos - _pos;
+ _data[pos] = 0;
+ _pos = next_pos;
+ _lineno++;
+ return (char *)_line;
+}
+
+char *
+Slurper::next_line()
+{
+ if (_saved_line) {
+ _saved_line = false;
+ return (char *)_line;
+ }
+ get_line_at(_pos);
+ if (_line_len == 0 && _at_eof)
+ _line = 0;
+ return (char *)_line;
+}
+
+char *
+Slurper::peek_line()
+{
+ next_line();
+ _saved_line = true;
+ return (char *)_line;
+}
+
+char *
+Slurper::append_next_line()
+{
+ unsigned delta = (_data + _pos) - (_line + _line_len);
+ if (_len - _pos > _line_len) {
+ memmove(_line + delta, _line, _line_len);
+ _line += delta;
+ } else {
+ memmove(_data + _pos - delta, _data + _pos, _len - _pos);
+ _pos -= delta;
+ _len -= delta;
+ }
+
+ unsigned append_at = _pos;
+ _pos = _line - _data;
+ return get_line_at(append_at);
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/straccum.cc b/Build/source/utils/lcdf-typetools/liblcdf/straccum.cc
new file mode 100644
index 00000000000..fef45282c65
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/straccum.cc
@@ -0,0 +1,180 @@
+// -*- related-file-name: "../include/lcdf/straccum.hh" -*-
+/*
+ * straccum.{cc,hh} -- build up strings with operator<<
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2005 Eddie Kohler
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/straccum.hh>
+#include <lcdf/vector.hh>
+#include <stdarg.h>
+#include <stdio.h>
+#include <ctype.h>
+
+StringAccum::StringAccum(const char *s)
+ : _s(0), _len(0), _cap(0)
+{
+ *this << s;
+}
+
+StringAccum::StringAccum(const String &s)
+ : _s(0), _len(0), _cap(0)
+{
+ *this << s;
+}
+
+#ifdef HAVE_PERMSTRING
+StringAccum::StringAccum(PermString s)
+ : _s(0), _len(0), _cap(0)
+{
+ *this << s;
+}
+#endif
+
+void
+StringAccum::make_out_of_memory()
+{
+ assert(_cap >= 0);
+ delete[] _s;
+ _s = reinterpret_cast<unsigned char *>(const_cast<char *>(String::out_of_memory_data()));
+ _cap = -1;
+ _len = 0;
+}
+
+bool
+StringAccum::grow(int want)
+{
+ // can't append to out-of-memory strings
+ if (_cap < 0)
+ return false;
+
+ int ncap = (_cap ? _cap * 2 : 128);
+ while (ncap <= want)
+ ncap *= 2;
+
+ unsigned char *n = new unsigned char[ncap];
+ if (!n) {
+ make_out_of_memory();
+ return false;
+ }
+
+ if (_s)
+ memcpy(n, _s, _cap);
+ delete[] _s;
+ _s = n;
+ _cap = ncap;
+ return true;
+}
+
+const char *
+StringAccum::c_str()
+{
+ if (_len < _cap || grow(_len))
+ _s[_len] = '\0';
+ return reinterpret_cast<char *>(_s);
+}
+
+String
+StringAccum::take_string()
+{
+ int len = length();
+ if (len) {
+ int capacity = _cap;
+ return String::claim_string(reinterpret_cast<char *>(take_bytes()), len, capacity);
+ } else if (out_of_memory())
+ return String::out_of_memory_string();
+ else
+ return String();
+}
+
+StringAccum &
+operator<<(StringAccum &sa, long i)
+{
+ if (char *x = sa.reserve(24)) {
+ int len = sprintf(x, "%ld", i);
+ sa.forward(len);
+ }
+ return sa;
+}
+
+StringAccum &
+operator<<(StringAccum &sa, unsigned long u)
+{
+ if (char *x = sa.reserve(24)) {
+ int len = sprintf(x, "%lu", u);
+ sa.forward(len);
+ }
+ return sa;
+}
+
+StringAccum &
+operator<<(StringAccum &sa, double d)
+{
+ if (char *x = sa.reserve(256)) {
+ int len = sprintf(x, "%.12g", d);
+ sa.forward(len);
+ }
+ return sa;
+}
+
+StringAccum &
+StringAccum::snprintf(int n, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ if (char *x = reserve(n + 1)) {
+#ifdef HAVE_VSNPRINTF
+ int len = vsnprintf(x, n + 1, format, val);
+#else
+ int len = vsprintf(x, format, val);
+ assert(len <= n);
+#endif
+ forward(len);
+ }
+ va_end(val);
+ return *this;
+}
+
+void
+StringAccum::append_break_lines(const String& text, int linelen, const String &leftmargin)
+{
+ if (text.length() == 0)
+ return;
+ const char* line = text.begin();
+ const char* ends = text.end();
+ linelen -= leftmargin.length();
+ for (const char* s = line; s < ends; s++) {
+ const char* start = s;
+ while (s < ends && isspace(*s))
+ s++;
+ const char* word = s;
+ while (s < ends && !isspace(*s))
+ s++;
+ if (s - line > linelen && start > line) {
+ *this << leftmargin;
+ append(line, start - line);
+ *this << '\n';
+ line = word;
+ }
+ }
+ if (line < text.end()) {
+ *this << leftmargin;
+ append(line, text.end() - line);
+ *this << '\n';
+ }
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/string.cc b/Build/source/utils/lcdf-typetools/liblcdf/string.cc
new file mode 100644
index 00000000000..ae260438d66
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/string.cc
@@ -0,0 +1,548 @@
+// -*- related-file-name: "../include/lcdf/string.hh" -*-
+/*
+ * string.{cc,hh} -- a String class with shared substrings
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2005 Eddie Kohler
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/string.hh>
+#include <lcdf/straccum.hh>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <lcdf/inttypes.h>
+
+static String::Initializer initializer;
+String::Memo *String::null_memo = 0;
+String::Memo *String::permanent_memo = 0;
+String::Memo *String::oom_memo = 0;
+String *String::null_string_p = 0;
+String *String::oom_string_p = 0;
+const char String::oom_string_data = 0;
+
+inline
+String::Memo::Memo()
+ : _refcount(0), _capacity(0), _dirty(0), _real_data("")
+{
+}
+
+inline
+String::Memo::Memo(char *data, int dirty, int capacity)
+ : _refcount(0), _capacity(capacity), _dirty(dirty),
+ _real_data(data)
+{
+}
+
+String::Memo::Memo(int dirty, int capacity)
+ : _refcount(1), _capacity(capacity), _dirty(dirty),
+ _real_data(new char[capacity])
+{
+ assert(_capacity >= _dirty);
+}
+
+String::Memo::~Memo()
+{
+ if (_capacity) {
+ assert(_capacity >= _dirty);
+ delete[] _real_data;
+ }
+}
+
+
+String::String(int i)
+{
+ char buf[128];
+ sprintf(buf, "%d", i);
+ assign(buf, -1);
+}
+
+String::String(unsigned u)
+{
+ char buf[128];
+ sprintf(buf, "%u", u);
+ assign(buf, -1);
+}
+
+String::String(long d)
+{
+ char buf[128];
+ sprintf(buf, "%ld", d);
+ assign(buf, -1);
+}
+
+String::String(unsigned long u)
+{
+ char buf[128];
+ sprintf(buf, "%lu", u);
+ assign(buf, -1);
+}
+
+String::String(double d)
+{
+ char buf[128];
+ sprintf(buf, "%.12g", d);
+ assign(buf, -1);
+}
+
+String
+String::claim_string(char *str, int len, int capacity)
+{
+ assert(str && len > 0 && capacity >= len);
+ Memo *new_memo = new Memo(str, len, capacity);
+ if (new_memo)
+ return String(str, len, new_memo);
+ else
+ return String(oom_memo->_real_data, 0, oom_memo);
+}
+
+String
+String::stable_string(const char *str, int len)
+{
+ if (len < 0)
+ len = (str ? strlen(str) : 0);
+ if (len == 0)
+ return String();
+ else
+ return String(str, len, permanent_memo);
+}
+
+String
+String::garbage_string(int len)
+{
+ String s;
+ s.append_garbage(len);
+ return s;
+}
+
+String
+String::fill_string(int c, int len)
+{
+ String s;
+ s.append_fill(c, len);
+ return s;
+}
+
+void
+String::make_out_of_memory()
+{
+ if (_memo)
+ deref();
+ _memo = oom_memo;
+ _memo->_refcount++;
+ _data = _memo->_real_data;
+ _length = 0;
+}
+
+void
+String::assign(const char *str, int len)
+{
+ if (!str) {
+ assert(len <= 0);
+ len = 0;
+ } else if (len < 0)
+ len = strlen(str);
+
+ if (len == 0) {
+ _memo = (str == oom_memo->_real_data ? oom_memo : null_memo);
+ _memo->_refcount++;
+
+ } else {
+ // Make 'capacity' a multiple of 16 characters at least as big as
+ // 'len'.
+ int capacity = (len + 16) & ~15;
+ _memo = new Memo(len, capacity);
+ if (!_memo || !_memo->_real_data) {
+ make_out_of_memory();
+ return;
+ }
+ memcpy(_memo->_real_data, str, len);
+ }
+
+ _data = _memo->_real_data;
+ _length = len;
+}
+
+char *
+String::append_garbage(int suffix_len)
+{
+ // Appending anything to "out of memory" leaves it as "out of memory"
+ if (suffix_len <= 0 || _memo == oom_memo)
+ return 0;
+
+ // If we can, append into unused space. First, we check that there's
+ // enough unused space for `suffix_len' characters to fit; then, we check
+ // that the unused space immediately follows the data in `*this'.
+ if (_memo->_capacity > _memo->_dirty + suffix_len) {
+ char *real_dirty = _memo->_real_data + _memo->_dirty;
+ if (real_dirty == _data + _length) {
+ _length += suffix_len;
+ _memo->_dirty += suffix_len;
+ assert(_memo->_dirty < _memo->_capacity);
+ return real_dirty;
+ }
+ }
+
+ // Now we have to make new space. Make sure the new capacity is a
+ // multiple of 16 characters and that it is at least 16.
+ int new_capacity = (_length + 16) & ~15;
+ while (new_capacity < _length + suffix_len)
+ new_capacity *= 2;
+ Memo *new_memo = new Memo(_length + suffix_len, new_capacity);
+ if (!new_memo || !new_memo->_real_data) {
+ delete new_memo;
+ make_out_of_memory();
+ return 0;
+ }
+
+ char *new_data = new_memo->_real_data;
+ memcpy(new_data, _data, _length);
+
+ deref();
+ _data = new_data;
+ new_data += _length; // now new_data points to the garbage
+ _length += suffix_len;
+ _memo = new_memo;
+ return new_data;
+}
+
+void
+String::append(const char *suffix, int suffix_len)
+{
+ if (!suffix) {
+ assert(suffix_len <= 0);
+ suffix_len = 0;
+ } else if (suffix_len < 0)
+ suffix_len = strlen(suffix);
+
+ if (char *space = append_garbage(suffix_len))
+ memcpy(space, suffix, suffix_len);
+ else if (suffix == oom_memo->_real_data)
+ // Appending "out of memory" to a regular string makes it "out of
+ // memory"
+ make_out_of_memory();
+}
+
+void
+String::append_fill(int c, int suffix_len)
+{
+ assert(suffix_len >= 0);
+ if (char *space = append_garbage(suffix_len))
+ memset(space, c, suffix_len);
+}
+
+char *
+String::mutable_data()
+{
+ // If _memo has a capacity (it's not one of the special strings) and it's
+ // uniquely referenced, return _data right away.
+ if (_memo->_capacity && _memo->_refcount == 1)
+ return const_cast<char *>(_data);
+
+ // Otherwise, make a copy of it. Rely on: deref() doesn't change _data or
+ // _length; and if _capacity == 0, then deref() doesn't free _real_data.
+ assert(!_memo->_capacity || _memo->_refcount > 1);
+ deref();
+ assign(_data, _length);
+ return const_cast<char *>(_data);
+}
+
+char *
+String::mutable_c_str()
+{
+ (void) mutable_data();
+ (void) c_str();
+ return const_cast<char *>(_data);
+}
+
+const char *
+String::c_str() const
+{
+ // If _memo has no capacity, then this is one of the special strings (null
+ // or PermString). We are guaranteed, in these strings, that
+ // _data[_length] exists. We can return _data immediately if we have a
+ // '\0' in the right place.
+ if (!_memo->_capacity && _data[_length] == '\0')
+ return _data;
+
+ // Otherwise, this invariant must hold (there's more real data in _memo
+ // than in our substring).
+ assert(!_memo->_capacity
+ || _memo->_real_data + _memo->_dirty >= _data + _length);
+
+ // Has the character after our substring been set?
+ if (_memo->_real_data + _memo->_dirty == _data + _length) {
+ // Character after our substring has not been set. May be able to
+ // change it to '\0'. This case will never occur on special strings.
+ if (_memo->_dirty < _memo->_capacity)
+ goto add_final_nul;
+
+ } else {
+ // Character after our substring has been set. OK to return _data if
+ // it is already '\0'.
+ if (_data[_length] == '\0')
+ return _data;
+ }
+
+ // If we get here, we must make a copy of our portion of the string.
+ {
+ String s(_data, _length);
+ deref();
+ assign(s);
+ }
+
+ add_final_nul:
+ char *real_data = const_cast<char *>(_data);
+ real_data[_length] = '\0';
+ _memo->_dirty++; // include '\0' in used portion of _memo
+ return _data;
+}
+
+String
+String::substring(int left, int len) const
+{
+ if (left < 0)
+ left += _length;
+ if (len < 0)
+ len = _length - left + len;
+ if (left + len > _length)
+ len = _length - left;
+
+ if (left < 0 || len <= 0)
+ return String();
+ else
+ return String(_data + left, len, _memo);
+}
+
+int
+String::find_left(int c, int start) const
+{
+ if (start < 0)
+ start = 0;
+ for (int i = start; i < _length; i++)
+ if ((unsigned char)_data[i] == c)
+ return i;
+ return -1;
+}
+
+int
+String::find_left(const String &s, int start) const
+{
+ if (start < 0)
+ start = 0;
+ if (start >= length())
+ return -1;
+ if (!s.length())
+ return 0;
+ int first_c = (unsigned char)s[0];
+ int pos = start, max_pos = length() - s.length();
+ for (pos = find_left(first_c, pos); pos >= 0 && pos <= max_pos;
+ pos = find_left(first_c, pos + 1))
+ if (!memcmp(_data + pos, s._data, s.length()))
+ return pos;
+ return -1;
+}
+
+int
+String::find_right(int c, int start) const
+{
+ if (start >= _length)
+ start = _length - 1;
+ for (int i = start; i >= 0; i--)
+ if ((unsigned char)_data[i] == c)
+ return i;
+ return -1;
+}
+
+static String
+hard_lower(const String &s, int pos)
+{
+ String new_s(s.data(), s.length());
+ char *x = const_cast<char *>(new_s.data()); // know it's mutable
+ int len = s.length();
+ for (; pos < len; pos++)
+ x[pos] = tolower(x[pos]);
+ return new_s;
+}
+
+String
+String::lower() const
+{
+ // avoid copies
+ for (int i = 0; i < _length; i++)
+ if (_data[i] >= 'A' && _data[i] <= 'Z')
+ return hard_lower(*this, i);
+ return *this;
+}
+
+static String
+hard_upper(const String &s, int pos)
+{
+ String new_s(s.data(), s.length());
+ char *x = const_cast<char *>(new_s.data()); // know it's mutable
+ int len = s.length();
+ for (; pos < len; pos++)
+ x[pos] = toupper(x[pos]);
+ return new_s;
+}
+
+String
+String::upper() const
+{
+ // avoid copies
+ for (int i = 0; i < _length; i++)
+ if (_data[i] >= 'a' && _data[i] <= 'z')
+ return hard_upper(*this, i);
+ return *this;
+}
+
+static String
+hard_printable(const String &s, int pos)
+{
+ StringAccum sa(s.length() * 2);
+ sa.append(s.data(), pos);
+ const unsigned char *x = reinterpret_cast<const unsigned char *>(s.data());
+ int len = s.length();
+ for (; pos < len; pos++) {
+ if (x[pos] >= 32 && x[pos] < 127)
+ sa << x[pos];
+ else if (x[pos] < 32)
+ sa << '^' << (unsigned char)(x[pos] + 64);
+ else if (char *buf = sa.extend(4, 1))
+ sprintf(buf, "\\%03o", x[pos]);
+ }
+ return sa.take_string();
+}
+
+String
+String::printable() const
+{
+ // avoid copies
+ for (int i = 0; i < _length; i++)
+ if (_data[i] < 32 || _data[i] > 126)
+ return hard_printable(*this, i);
+ return *this;
+}
+
+unsigned
+hashcode(const String &s)
+{
+ int length = s.length();
+ const char *data = s.data();
+ if (!length)
+ return 0;
+ else if (length == 1)
+ return data[0] | (data[0] << 8);
+ else if (length < 4)
+ return data[0] + (data[1] << 3) + (length << 12);
+ else
+ return data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24)
+ + (length << 12) + (data[length-1] << 10);
+}
+
+bool
+String::equals(const char *s, int len) const
+{
+ // I would like to make "out-of-memory" strings compare unequal to
+ // anything, even themseleves, but this would be a bad idea for Strings
+ // used as (for example) keys in hashtables. Instead, "out-of-memory"
+ // strings compare unequal to other null strings, but equal to each other.
+ if (len < 0)
+ len = strlen(s);
+ if (_length != len)
+ return false;
+ else if (len == 0)
+ return (_data == s || (s != oom_memo->_real_data && _memo != oom_memo));
+ else
+ return (_data == s || memcmp(_data, s, len) == 0);
+}
+
+int
+String::compare(const char *s, int len) const
+{
+ if (len < 0)
+ len = strlen(s);
+ if (_data == s && _length == len)
+ return 0;
+ if (_length == len)
+ return memcmp(_data, s, len);
+ else if (_length < len) {
+ int v = memcmp(_data, s, _length);
+ return (v ? v : -1);
+ } else {
+ int v = memcmp(_data, s, len);
+ return (v ? v : 1);
+ }
+}
+
+void
+String::align(int n)
+{
+ int offset = reinterpret_cast<uintptr_t>(_data) % n;
+ if (offset) {
+ String s;
+ s.append_garbage(_length + n + 1);
+ offset = reinterpret_cast<uintptr_t>(s._data) % n;
+ memcpy((char *)s._data + n - offset, _data, _length);
+ s._data += n - offset;
+ s._length = _length;
+ *this = s;
+ }
+}
+
+
+String::Initializer::Initializer()
+{
+ String::static_initialize();
+}
+
+void
+String::static_initialize()
+{
+ // function called to initialize static globals
+ if (!null_memo) {
+ null_memo = new Memo;
+ null_memo->_refcount++;
+ permanent_memo = new Memo;
+ permanent_memo->_refcount++;
+ // use a separate string for oom_memo's data, so we can distinguish
+ // the pointer
+ oom_memo = new Memo;
+ oom_memo->_refcount++;
+ oom_memo->_real_data = const_cast<char*>(&oom_string_data);
+ null_string_p = new String;
+ oom_string_p = new String(oom_memo->_real_data, 0, oom_memo);
+ }
+}
+
+void
+String::static_cleanup()
+{
+ if (null_string_p) {
+ delete null_string_p;
+ null_string_p = 0;
+ delete oom_string_p;
+ oom_string_p = 0;
+ if (--null_memo->_refcount == 0)
+ delete null_memo;
+ if (--permanent_memo->_refcount == 0)
+ delete permanent_memo;
+ if (--oom_memo->_refcount == 0)
+ delete oom_memo;
+ null_memo = permanent_memo = oom_memo = 0;
+ }
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/strtonum.c b/Build/source/utils/lcdf-typetools/liblcdf/strtonum.c
new file mode 100644
index 00000000000..b4bad23241d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/strtonum.c
@@ -0,0 +1,31 @@
+/* -*- related-file-name: "../include/lcdf/strtonum.h" -*- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/strtonum.h>
+#include <stdlib.h>
+#ifdef BROKEN_STRTOD
+# define strtod good_strtod
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A faster strtod which only calls the real strtod if the string has a
+ fractional part. */
+
+double
+strtonumber(const char *f, char **endf)
+{
+ long v = strtol((char *)f, endf, 10);
+
+ /* handle any possible decimal part */
+ if (**endf == '.' || **endf == 'E' || **endf == 'e')
+ return strtod((char *)f, endf);
+ else
+ return v;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/transform.cc b/Build/source/utils/lcdf-typetools/liblcdf/transform.cc
new file mode 100644
index 00000000000..05eb47e450c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/transform.cc
@@ -0,0 +1,167 @@
+// -*- related-file-name: "../include/lcdf/transform.hh" -*-
+
+/* transform.{cc,hh} -- planar affine transformations
+ *
+ * Copyright (c) 2000-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/transform.hh>
+#include <lcdf/straccum.hh>
+#include <math.h>
+
+Transform::Transform()
+{
+ _m[0] = _m[3] = 1;
+ _m[1] = _m[2] = _m[4] = _m[5] = 0;
+ _null = true;
+}
+
+Transform::Transform(const double m[6])
+{
+ _m[0] = m[0];
+ _m[1] = m[1];
+ _m[2] = m[2];
+ _m[3] = m[3];
+ _m[4] = m[4];
+ _m[5] = m[5];
+ check_null(0);
+}
+
+Transform::Transform(double m0, double m1, double m2,
+ double m3, double m4, double m5)
+{
+ _m[0] = m0;
+ _m[1] = m1;
+ _m[2] = m2;
+ _m[3] = m3;
+ _m[4] = m4;
+ _m[5] = m5;
+ check_null(0);
+}
+
+void
+Transform::check_null(double tolerance)
+{
+ _null = (fabs(_m[0] - 1) < tolerance && fabs(_m[1]) < tolerance
+ && fabs(_m[2]) < tolerance && fabs(_m[3] - 1) < tolerance
+ && fabs(_m[4]) < tolerance && fabs(_m[5]) < tolerance);
+}
+
+
+void
+Transform::scale(double x, double y)
+{
+ _m[0] *= x;
+ _m[1] *= x;
+ _m[2] *= y;
+ _m[3] *= y;
+
+ if (x != 1 || y != 1)
+ _null = false;
+}
+
+void
+Transform::rotate(double r)
+{
+ double c = cos(r);
+ double s = sin(r);
+
+ double a = _m[0], b = _m[2];
+ _m[0] = a*c + b*s;
+ _m[2] = b*c - a*s;
+
+ a = _m[1], b = _m[3];
+ _m[1] = a*c + b*s;
+ _m[3] = b*c - a*s;
+
+ if (r != 0)
+ _null = false;
+}
+
+void
+Transform::translate(double x, double y)
+{
+ _m[4] += _m[0]*x + _m[2]*y;
+ _m[5] += _m[1]*x + _m[3]*y;
+
+ if (x != 0 || y != 0)
+ _null = false;
+}
+
+void
+Transform::shear(double s)
+{
+ *this *= Transform(1, 0, s, 1, 0, 0);
+}
+
+Transform
+Transform::transformed(const Transform &t) const
+{
+ return Transform(_m[0] * t._m[0] + _m[2] * t._m[1],
+ _m[1] * t._m[0] + _m[3] * t._m[1],
+ _m[0] * t._m[2] + _m[2] * t._m[3],
+ _m[1] * t._m[2] + _m[3] * t._m[3],
+ _m[0] * t._m[4] + _m[2] * t._m[5] + _m[4],
+ _m[1] * t._m[4] + _m[3] * t._m[5] + _m[5]);
+}
+
+
+void
+Transform::real_apply_to(Point &p) const
+{
+ double x = p.x;
+ p.x = x*_m[0] + p.y*_m[2] + _m[4];
+ p.y = x*_m[1] + p.y*_m[3] + _m[5];
+}
+
+Point
+Transform::real_apply(const Point &p) const
+{
+ return Point(p.x*_m[0] + p.y*_m[2] + _m[4],
+ p.x*_m[1] + p.y*_m[3] + _m[5]);
+}
+
+Bezier &
+operator*=(Bezier &b, const Transform &t)
+{
+ if (!t.null()) {
+ b.mpoint(0) *= t;
+ b.mpoint(1) *= t;
+ b.mpoint(2) *= t;
+ b.mpoint(3) *= t;
+ }
+ return b;
+}
+
+Bezier
+operator*(const Bezier &b, const Transform &t)
+{
+ return (t.null()
+ ? b
+ : Bezier(b.point(0) * t, b.point(1) * t, b.point(2) * t, b.point(3) * t));
+}
+
+String
+Transform::unparse() const
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < 6; i++) {
+ if (i)
+ sa << ',' << ' ';
+ sa << _m[i];
+ }
+ sa << ']';
+ return sa.take_string();
+}
diff --git a/Build/source/utils/lcdf-typetools/liblcdf/vectorv.cc b/Build/source/utils/lcdf-typetools/liblcdf/vectorv.cc
new file mode 100644
index 00000000000..f444cf6acb9
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/liblcdf/vectorv.cc
@@ -0,0 +1,110 @@
+/*
+ * vectorv.cc -- template specialization for Vector<void*>
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2004 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/vector.hh>
+#include <string.h>
+
+Vector<void*>::Vector(const Vector<void*> &o)
+ : _l(0), _n(0), _capacity(0)
+{
+ *this = o;
+}
+
+Vector<void*>::~Vector()
+{
+ delete[] _l;
+}
+
+Vector<void*> &
+Vector<void*>::operator=(const Vector<void*> &o)
+{
+ if (&o != this) {
+ _n = 0;
+ if (reserve(o._n)) {
+ _n = o._n;
+ memcpy(_l, o._l, sizeof(void *) * _n);
+ }
+ }
+ return *this;
+}
+
+Vector<void*> &
+Vector<void*>::assign(int n, void *e)
+{
+ _n = 0;
+ resize(n, e);
+ return *this;
+}
+
+bool
+Vector<void*>::reserve(int want)
+{
+ if (want < 0)
+ want = (_capacity > 0 ? _capacity * 2 : 4);
+ if (want <= _capacity)
+ return true;
+
+ void **new_l = new void*[want];
+ if (!new_l)
+ return false;
+
+ memcpy(new_l, _l, sizeof(void*) * _n);
+ delete[] _l;
+
+ _l = new_l;
+ _capacity = want;
+ return true;
+}
+
+Vector<void*>::iterator
+Vector<void*>::erase(iterator a, iterator b)
+{
+ if (b > a) {
+ assert(a >= begin() && b <= end());
+ memmove(a, b, (end() - b) * sizeof(void*));
+ _n -= b - a;
+ return a;
+ } else
+ return b;
+}
+
+void
+Vector<void*>::resize(int nn, void *e)
+{
+ if (nn <= _capacity || reserve(nn)) {
+ for (int i = _n; i < nn; i++)
+ _l[i] = e;
+ _n = nn;
+ }
+}
+
+void
+Vector<void*>::swap(Vector<void*>& o)
+{
+ void **l = _l;
+ int n = _n;
+ int cap = _capacity;
+ _l = o._l;
+ _n = o._n;
+ _capacity = o._capacity;
+ o._l = l;
+ o._n = n;
+ o._capacity = cap;
+}
diff --git a/Build/source/utils/lcdf-typetools/missing b/Build/source/utils/lcdf-typetools/missing
new file mode 100644
index 00000000000..64b5f901dd5
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/missing
@@ -0,0 +1,353 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2004-09-07.08
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit 0
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit 0
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/lcdf-typetools/mkinstalldirs b/Build/source/utils/lcdf-typetools/mkinstalldirs
new file mode 100755
index 00000000000..8ab885ec92d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mkinstalldirs
@@ -0,0 +1,99 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case "${1}" in
+ -h | --help | --h* ) # -h for help
+ echo "${usage}" 1>&2; exit 0 ;;
+ -m ) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
+ dirmode="${1}"
+ shift ;;
+ -- ) shift; break ;; # stop option processing
+ -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option
+ * ) break ;; # first non-opt arg
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+0) exit 0 ;;
+esac
+
+case $dirmode in
+'')
+ if mkdir -p -- . 2>/dev/null; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ fi ;;
+*)
+ if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ fi ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 3
+# End:
+# mkinstalldirs ends here
diff --git a/Build/source/utils/lcdf-typetools/mmafm/Makefile.am b/Build/source/utils/lcdf-typetools/mmafm/Makefile.am
new file mode 100644
index 00000000000..4d535e5cfbd
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmafm/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = mmafm
+man_MANS = mmafm.1
+
+mmafm_SOURCES = main.cc
+
+mmafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = mmafm.1
diff --git a/Build/source/utils/lcdf-typetools/mmafm/Makefile.in b/Build/source/utils/lcdf-typetools/mmafm/Makefile.in
new file mode 100644
index 00000000000..a5099ee1cb1
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmafm/Makefile.in
@@ -0,0 +1,467 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(mmafm_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = mmafm$(EXEEXT)
+subdir = mmafm
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_mmafm_OBJECTS = main.$(OBJEXT)
+mmafm_OBJECTS = $(am_mmafm_OBJECTS)
+mmafm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(mmafm_SOURCES)
+DIST_SOURCES = $(mmafm_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = mmafm.1
+mmafm_SOURCES = main.cc
+mmafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = mmafm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mmafm/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign mmafm/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+mmafm$(EXEEXT): $(mmafm_OBJECTS) $(mmafm_DEPENDENCIES)
+ @rm -f mmafm$(EXEEXT)
+ $(CXXLINK) $(mmafm_LDFLAGS) $(mmafm_OBJECTS) $(mmafm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/mmafm/main.cc b/Build/source/utils/lcdf-typetools/mmafm/main.cc
new file mode 100644
index 00000000000..d5f88a960f2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmafm/main.cc
@@ -0,0 +1,433 @@
+/* main.cc -- driver for mmafm program
+ *
+ * Copyright (c) 1997-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/findmet.hh>
+#include <efont/psres.hh>
+#include <lcdf/slurper.hh>
+#include <efont/afm.hh>
+#include <efont/afmw.hh>
+#include <efont/amfm.hh>
+#include <lcdf/error.hh>
+#include <lcdf/clp.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <math.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+
+#define WEIGHT_OPT 300
+#define WIDTH_OPT 301
+#define OPSIZE_OPT 302
+#define STYLE_OPT 303
+#define N1_OPT 304
+#define N2_OPT 305
+#define N3_OPT 306
+#define N4_OPT 307
+#define VERSION_OPT 308
+#define HELP_OPT 309
+#define OUTPUT_OPT 310
+#define PRECISION_OPT 311
+#define KERN_PREC_OPT 312
+
+Clp_Option options[] = {
+ { "1", '1', N1_OPT, Clp_ArgDouble, 0 },
+ { "2", '2', N2_OPT, Clp_ArgDouble, 0 },
+ { "3", '3', N3_OPT, Clp_ArgDouble, 0 },
+ { "4", '4', N4_OPT, Clp_ArgDouble, 0 },
+ { "weight", 'w', WEIGHT_OPT, Clp_ArgDouble, 0 },
+ { "width", 'W', WIDTH_OPT, Clp_ArgDouble, 0 },
+ { "optical-size", 'O', OPSIZE_OPT, Clp_ArgDouble, 0 },
+ { "style", 0, STYLE_OPT, Clp_ArgDouble, 0 },
+ { "wt", 0, WEIGHT_OPT, Clp_ArgDouble, 0 },
+ { "wd", 0, WIDTH_OPT, Clp_ArgDouble, 0 },
+ { "min-kern", 'k', KERN_PREC_OPT, Clp_ArgDouble, 0 },
+ { "minimum-kern", 'k', KERN_PREC_OPT, Clp_ArgDouble, 0 },
+ { "kern-precision", 'k', KERN_PREC_OPT, Clp_ArgDouble, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "precision", 'p', PRECISION_OPT, Clp_ArgInt, 0 },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+};
+
+using namespace Efont;
+
+
+static const char *program_name;
+static ErrorHandler *errh;
+static AmfmMetrics *amfm;
+
+static Vector<PermString> ax_names;
+static Vector<int> ax_nums;
+static Vector<double> values;
+
+static void
+set_design(PermString a, double v)
+{
+ ax_names.push_back(a);
+ ax_nums.push_back(-1);
+ values.push_back(v);
+}
+
+static void
+set_design(int a, double v)
+{
+ ax_names.push_back(PermString());
+ ax_nums.push_back(a);
+ values.push_back(v);
+}
+
+static void
+set_amfm(AmfmMetrics *a)
+{
+ if (a) {
+ if (amfm) errh->fatal("already read one AMFM file");
+ amfm = a;
+ }
+}
+
+
+// apply precision
+static inline void
+pround(double &v, double multiplier, double divider)
+{
+ if (KNOWN(v))
+ v = floor(v * multiplier + 0.5) * divider;
+}
+
+static void
+apply_precision(Metrics *m, int precision)
+{
+ if (precision < 0)
+ return;
+
+ double multiplier = 1, divider = 1;
+ for (int i = 0; i < precision; i++)
+ multiplier *= 10, divider /= 10;
+
+ for (int i = 0; i < m->nfd(); i++)
+ pround(m->fd(i), multiplier, divider);
+
+ for (int i = 0; i < m->nglyphs(); i++) {
+ pround(m->wd(i), multiplier, divider);
+ pround(m->lf(i), multiplier, divider);
+ pround(m->bt(i), multiplier, divider);
+ pround(m->rt(i), multiplier, divider);
+ pround(m->tp(i), multiplier, divider);
+ }
+
+ for (int i = 0; i < m->nkv(); i++)
+ pround(m->kv(i), multiplier, divider);
+}
+
+static void
+apply_kern_precision(Metrics *m, double kern_precision)
+{
+ if (kern_precision <= 0)
+ return;
+
+ for (int i = 0; i < m->nkv(); i++)
+ if (fabs(m->kv(i)) < kern_precision)
+ m->kv(i) = 0;
+}
+
+
+static void
+read_file(const char *fn, MetricsFinder *finder)
+{
+ Filename filename;
+ FILE *file;
+
+ if (strcmp(fn, "-") == 0) {
+ filename = Filename("<stdin>");
+ file = stdin;
+ } else {
+ filename = Filename(fn);
+ file = filename.open_read();
+ }
+ int save_errno = errno;
+
+ if (!file) {
+ // look for a font by name
+ AmfmMetrics *new_amfm = finder->find_amfm(fn, errh);
+ if (new_amfm) {
+ set_amfm(new_amfm);
+ return;
+ }
+ if (finder->find_metrics(fn, errh))
+ return;
+
+ // check for instance name. don't use InstanceMetricsFinder.
+ const char *underscore = strchr(fn, '_');
+ if (underscore)
+ new_amfm = finder->find_amfm(PermString(fn, underscore - fn), errh);
+ if (!new_amfm)
+ errh->fatal("%s: %s", fn, strerror(save_errno));
+ set_amfm(new_amfm);
+
+ int i = 0;
+ while (underscore[0] == '_' && underscore[1]) {
+ double x = strtod(underscore + 1, const_cast<char **>(&underscore));
+ set_design(i, x);
+ i++;
+ }
+ return;
+ }
+
+ Slurper slurper(filename, file);
+ bool is_afm = false;
+ if (file != stdin) {
+ char *first_line = slurper.peek_line();
+ if (first_line)
+ is_afm = strncmp(first_line, "StartFontMetrics", 16) == 0;
+ }
+
+ if (is_afm) {
+ Metrics *afm = AfmReader::read(slurper, errh);
+ if (afm)
+ finder->record(afm);
+ } else
+ set_amfm(AmfmReader::read(slurper, finder, errh));
+}
+
+
+static void
+usage_error(const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION | FONT]...", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+static void
+usage()
+{
+ printf("\
+'Mmafm' creates an AFM font metrics file for a multiple master font by\n\
+interpolating at a point you specify and writes it to the standard output.\n\
+\n\
+Usage: %s [OPTION | FONT]...\n\
+\n\
+Each FONT is either an AFM or AMFM file name, or the font name of a multiple\n\
+master font. In the second case, mmafm will find the actual AMFM file using\n\
+the PSRESOURCEPATH environment variable.\n\
+\n\
+General options:\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ -v, --version Print version number and warranty and exit.\n\
+\n\
+Interpolation settings:\n\
+ -w, --weight=N Set weight to N.\n\
+ -W, --width=N Set width to N.\n\
+ -O, --optical-size=N Set optical size to N.\n\
+ --style=N Set style axis to N.\n\
+ --1=N, --2=N, --3=N, --4=N Set first (second, third, fourth) axis to N.\n\
+ -p, --precision=N Allow N digits of fraction (default 3).\n\
+ -k, --min-kern=N Remove kerns smaller than N (default 2).\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ MetricsFinder *finder = new CacheMetricsFinder;
+
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+ PsresMetricsFinder *psres_finder = new PsresMetricsFinder(psres);
+ finder->add_finder(psres_finder);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+
+ FILE *output_file = 0;
+ int precision = 3;
+ double kern_precision = 2.0;
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case WEIGHT_OPT:
+ set_design("Weight", clp->val.d);
+ break;
+
+ case WIDTH_OPT:
+ set_design("Width", clp->val.d);
+ break;
+
+ case OPSIZE_OPT:
+ set_design("OpticalSize", clp->val.d);
+ break;
+
+ case STYLE_OPT:
+ set_design("Style", clp->val.d);
+ break;
+
+ case N1_OPT:
+ case N2_OPT:
+ case N3_OPT:
+ case N4_OPT:
+ set_design(opt - N1_OPT, clp->val.d);
+ break;
+
+ case PRECISION_OPT:
+ precision = clp->val.i;
+ break;
+
+ case KERN_PREC_OPT:
+ kern_precision = clp->val.d;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file) errh->fatal("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ output_file = stdout;
+ else {
+ output_file = fopen(clp->arg, "wb");
+ if (!output_file)
+ errh->fatal("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("mmafm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1997-2004 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ read_file(clp->arg, finder);
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(0);
+ break;
+
+ }
+ }
+
+ done:
+ if (!amfm) usage_error("missing font argument");
+
+ MultipleMasterSpace *mmspace = amfm->mmspace();
+#if MMAFM_RUN_MMPFB
+ if (!mmspace->check_intermediate()) {
+ char *buf = new char[amfm->font_name().length() + 30];
+ sprintf(buf, "mmpfb -q --amcp-info '%s'", amfm->font_name().c_str());
+
+ FILE *f = popen(buf, "r");
+ if (f) {
+ Filename fake("<mmpfb output>");
+ Slurper slurpy(fake, f);
+ AmfmReader::add_amcp_file(slurpy, amfm, errh);
+ pclose(f);
+ }
+
+ delete[] buf;
+ }
+#endif
+
+ Vector<double> design = mmspace->default_design_vector();
+ for (int i = 0; i < values.size(); i++)
+ if (ax_names[i])
+ mmspace->set_design(design, ax_names[i], values[i], errh);
+ else
+ mmspace->set_design(design, ax_nums[i], values[i], errh);
+
+ Vector<double> weight;
+ if (!mmspace->design_to_weight(design, weight, errh)) {
+ if (!mmspace->check_intermediate()) {
+ errh->message("(I can't interpolate font programs with intermediate masters on my own.");
+#if MMAFM_RUN_MMPFB
+ errh->message("I tried to run `mmpfb --amcp-info %s', but it didn't work.", amfm->font_name().c_str());
+ errh->message("Maybe your PSRESOURCEPATH environment variable is not set?");
+#endif
+ errh->fatal("See the manual page for more information.)");
+ } else
+ errh->fatal("can't create weight vector");
+ }
+
+ // Need to check for case when all design coordinates are unspecified. The
+ // AMFM file contains a default WeightVector, but often NOT a default
+ // DesignVector; we don't want to generate a file with a FontName like
+ // `MyriadMM_-9.79797979e97_-9.79797979e97_' because the DesignVector
+ // components are unknown.
+ if (!KNOWN(design[0]))
+ errh->fatal("must specify %s's %s coordinate", amfm->font_name().c_str(),
+ mmspace->axis_type(0).c_str());
+
+ Metrics *m = amfm->interpolate(design, weight, errh);
+ if (m) {
+
+ // Add a comment identifying this as interpolated by mmafm
+ if (MetricsXt *xt = m->find_xt("AFM")) {
+ AfmMetricsXt *afm_xt = (AfmMetricsXt *)xt;
+
+#if HAVE_CTIME
+ time_t cur_time = time(0);
+ char *time_str = ctime(&cur_time);
+ int time_len = strlen(time_str) - 1;
+ char *buf = new char[strlen(VERSION) + time_len + 100];
+ sprintf(buf, "Interpolated by mmafm-%s on %.*s.", VERSION,
+ time_len, time_str);
+#else
+ char *buf = new char[strlen(VERSION) + 100];
+ sprintf(buf, "Interpolated by mmafm-%s.", VERSION);
+#endif
+
+ afm_xt->opening_comments.push_back(buf);
+ afm_xt->opening_comments.push_back("Mmafm is free software. See <http://www.lcdf.org/type/>.");
+ delete[] buf;
+ }
+
+ // round numbers if necessary
+ if (precision >= 0)
+ apply_precision(m, precision);
+ if (kern_precision > 0)
+ apply_kern_precision(m, kern_precision);
+
+ // write the output file
+ if (!output_file)
+ output_file = stdout;
+ AfmWriter::write(m, output_file);
+
+ return 0;
+ } else
+ return 1;
+}
diff --git a/Build/source/utils/lcdf-typetools/mmafm/mmafm.1 b/Build/source/utils/lcdf-typetools/mmafm/mmafm.1
new file mode 100644
index 00000000000..a837a4fa3c8
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmafm/mmafm.1
@@ -0,0 +1,183 @@
+.\" -*-nroff-*-
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.ds E " \-\-
+.if t .ds E \(em
+.de OP
+.BR "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de OA
+.IR "\fB\\$1\& \|\fI\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de OY
+.BI "\\$1\fR=" "\\$2\fR, " "\\$3\& " "\\$4" "\\$5" "\\$6"
+..
+.de OL
+.BI "\\$1\fR=" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.de Es
+.Sp
+.RS 5
+.nf
+..
+.de Ee
+.fi
+.RE
+.PP
+..
+.TH MMAFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+mmafm \- creates AFM font metrics for multiple master fonts
+'
+.SH SYNOPSIS
+.B mmafm
+\%[OPTIONS...]
+.I font
+'
+.SH DESCRIPTION
+.B Mmafm
+creates AFM font metrics for PostScript multiple master fonts by
+interpolation. You pass it an AMFM file (multiple master font metrics) and
+options specifying the design point you want, and it writes the resulting
+AFM file to the standard output.
+.PP
+Each
+.I font
+argument is either the filename of an AFM or AMFM font metrics file, or a
+PostScript font name. If you give a font name,
+.B mmafm
+will look up the actual font metrics file using the PSRESOURCEPATH
+environment variable. This colon-separated path is searched for `PSres.upr'
+files, an Adobe method for indexing PostScript resources.
+.PP
+You can also give the name of a multiple master font instance, like
+`MinionMM_367_400_12_'.
+.B Mmafm
+will parse the font name and create that instance for you. `PSres.upr'
+files must be set up for this to work.
+.PP
+Any multiple master font should be distributed with a single AMFM file and
+several AFM files (one for each master). For Myriad, for example, the AMFM
+file is MyriadMM.amfm and the AFM files are MyriadMM-LightCn.afm,
+MyriadMM-LightSemiEx.afm, MyriadMM-BlackCn.afm, and
+MyriadMM-BlackSemiEx.afm.
+.B Mmafm
+needs to find all these files to function. For fonts in the Adobe type
+library, you can download the necessary files from
+<http://www.lcdf.org/type>; look for the mm-metrics package.
+.PP
+You must always supply the AMFM file (or its font name) on the command
+line, but
+.B mmafm
+will look for any required AFM files you don't supply yourself. It tries
+the PSRESOURCEPATH environment variable, and also looks for files named
+`\fIFontName\fR.afm' or `\fIFontName\fR.AFM' in the directory that
+contained the AMFM file. (The Myriad filenames given above fit this
+pattern.)
+.PP
+.B Mmafm
+supports fonts with intermediate masters, like Adobe Jenson and Kepler. If
+your PSRESOURCEPATH environment variable is set up, it will handle these
+fonts automatically. Otherwise, you must first run
+.RB ` "mmpfb \-\-amcp\-info" '
+on the font outline files to create auxiliary AMCP files for these fonts.
+Each AMCP file should be in the same directory as its corresponding AMFM
+file and should have the same root filename, but with a `.amcp' extension
+instead of `.amfm'. See
+.M mmpfb 1
+for more information.
+'
+'
+.SH EXAMPLE
+'
+.nf
+% mmafm \-\-weight=400 \-\-width=600 MyriadMM.amfm > MyriadMM_400_600_.afm
+.fi
+'
+.SH OPTIONS
+Long options may be abbreviated to their unique prefixes.
+'
+.TP 5
+.OY \-\-output file \-o file
+Send output to
+.I file
+instead of standard output.
+'
+.TP
+.OY \-\-weight N \-w N
+Set the weight axis to
+.IR N .
+'
+.TP
+.OY \-\-width N \-W N
+Set the width axis to
+.IR N .
+'
+.TP
+.OY \-\-optical\-size N \-O N
+Set the optical size axis to
+.IR N .
+'
+.TP
+.OL \-\-style N
+Set the style axis to
+.IR N .
+.TP
+\fB\-\-1\fR=\fIN\fR (\fB\-\-2\fR=\fIN\fR, \fB\-\-3\fR=\fIN\fR, \fB\-\-4\fR=\fIN\fR)
+Set the first (second, third, fourth) axis to
+.IR N .
+'
+.TP
+.OY \-\-precision N \-p N
+Round output numbers so they have at most
+.I N
+digits after the decimal point. Smaller numbers are less precise; `\fB\-p
+\fR0' rounds all numbers to integers. The default precision is 3.
+'
+.TP
+.OY \-\-min\-kern N \-k N
+Only output kerning pairs whose absolute value is
+.IR N
+or larger. Smaller minimum kerns make kerning more precise and the output
+AFM file bigger. The default minimum kern is 2.0.
+'
+.SH TROUBLESHOOTING
+.PP
+Some programs, such as TeX's
+.BR fontinst ,
+can choke on AFM files that include fractional numbers. Therefore, if you
+have trouble with an AFM file, try rerunning
+.B mmafm
+with the
+.OP \-\-precision=0
+option.
+'
+.SH SEE ALSO
+.M mmpfb 1
+'
+.SH DIAGNOSTICS
+.TP 5
+\fIFont\fR requires intermediate master conversion programs
+You haven't yet created an AMCP file for \fIFont\fR.
+'
+.SH AUTHOR
+.na
+Eddie Kohler, kohler@icir.org
+.br
+http://www.pdos.lcs.mit.edu/~eddietwo/
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
+.br
+AMFM and AFM files for Adobe Type Library fonts are also available at that
+URL.
+.PP
+Thanks to Melissa O'Neill <oneill@cs.sfu.ca> for suggestions and patient
+debugging.
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/Makefile.am b/Build/source/utils/lcdf-typetools/mmpfb/Makefile.am
new file mode 100644
index 00000000000..5d579edca5c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/Makefile.am
@@ -0,0 +1,17 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = mmpfb
+man_MANS = mmpfb.1
+
+mmpfb_SOURCES = myfont.cc myfont.hh \
+ main.cc \
+ t1minimize.cc t1minimize.hh \
+ t1rewrit.cc t1rewrit.hh
+
+mmpfb_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = mmpfb.1
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/Makefile.in b/Build/source/utils/lcdf-typetools/mmpfb/Makefile.in
new file mode 100644
index 00000000000..4129a27dc2a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/Makefile.in
@@ -0,0 +1,479 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(mmpfb_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = mmpfb$(EXEEXT)
+subdir = mmpfb
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_mmpfb_OBJECTS = myfont.$(OBJEXT) main.$(OBJEXT) \
+ t1minimize.$(OBJEXT) t1rewrit.$(OBJEXT)
+mmpfb_OBJECTS = $(am_mmpfb_OBJECTS)
+mmpfb_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(mmpfb_SOURCES)
+DIST_SOURCES = $(mmpfb_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = mmpfb.1
+mmpfb_SOURCES = myfont.cc myfont.hh \
+ main.cc \
+ t1minimize.cc t1minimize.hh \
+ t1rewrit.cc t1rewrit.hh
+
+mmpfb_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = mmpfb.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mmpfb/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign mmpfb/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+mmpfb$(EXEEXT): $(mmpfb_OBJECTS) $(mmpfb_DEPENDENCIES)
+ @rm -f mmpfb$(EXEEXT)
+ $(CXXLINK) $(mmpfb_LDFLAGS) $(mmpfb_OBJECTS) $(mmpfb_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/myfont.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1minimize.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1rewrit.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/main.cc b/Build/source/utils/lcdf-typetools/mmpfb/main.cc
new file mode 100644
index 00000000000..ed578b727d9
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/main.cc
@@ -0,0 +1,462 @@
+/* main.cc -- driver for mmpfb program
+ *
+ * Copyright (c) 1997-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1mm.hh>
+#include "myfont.hh"
+#include "t1rewrit.hh"
+#include "t1minimize.hh"
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+#define WEIGHT_OPT 300
+#define WIDTH_OPT 301
+#define OPSIZE_OPT 302
+#define STYLE_OPT 303
+#define N1_OPT 304
+#define N2_OPT 305
+#define N3_OPT 306
+#define N4_OPT 307
+#define VERSION_OPT 308
+#define AMCP_INFO_OPT 309
+#define HELP_OPT 310
+#define PFA_OPT 311
+#define PFB_OPT 312
+#define OUTPUT_OPT 313
+#define QUIET_OPT 314
+#define PRECISION_OPT 315
+#define SUBRS_OPT 316
+#define MINIMIZE_OPT 317
+
+Clp_Option options[] = {
+ { "1", '1', N1_OPT, Clp_ArgDouble, 0 },
+ { "2", '2', N2_OPT, Clp_ArgDouble, 0 },
+ { "3", '3', N3_OPT, Clp_ArgDouble, 0 },
+ { "4", '4', N4_OPT, Clp_ArgDouble, 0 },
+ { "amcp-info", 0, AMCP_INFO_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "minimize", 'm', MINIMIZE_OPT, 0, Clp_Negate },
+ { "optical-size", 'O', OPSIZE_OPT, Clp_ArgDouble, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "precision", 'p', PRECISION_OPT, Clp_ArgUnsigned, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "style", 0, STYLE_OPT, Clp_ArgDouble, 0 },
+ { "subrs", 0, SUBRS_OPT, Clp_ArgInt, Clp_Negate },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+ { "wd", 0, WIDTH_OPT, Clp_ArgDouble, 0 },
+ { "weight", 'w', WEIGHT_OPT, Clp_ArgDouble, 0 },
+ { "width", 'W', WIDTH_OPT, Clp_ArgDouble, 0 },
+ { "wt", 0, WEIGHT_OPT, Clp_ArgDouble, 0 },
+};
+
+using namespace Efont;
+
+static const char *program_name;
+static ErrorHandler *errh;
+static MyFont *font;
+static MultipleMasterSpace *mmspace;
+
+static Vector<PermString> ax_names;
+static Vector<int> ax_nums;
+static Vector<double> values;
+
+
+void
+usage_error(const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'Mmpfb' creates a single-master PostScript Type 1 font by interpolating a\n\
+multiple master font at a point you specify. The resulting font does not\n\
+contain multiple master extensions. It is written to the standard output.\n\
+\n\
+Usage: %s [OPTION]... FONT\n\
+\n\
+FONT is either the name of a PFA or PFB multiple master font file, or a\n\
+PostScript font name. In the second case, mmpfb will find the actual outline\n\
+file using the PSRESOURCEPATH environment variable.\n\
+\n\
+General options:\n\
+ --amcp-info Print AMCP info, if necessary, and exit.\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -p, --precision=N Set precision to N (larger means more precise).\n\
+ --subrs=N Limit output font to at most N subroutines.\n\
+ --no-minimize Do not replace original font's PostScript code.\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ -v, --version Print version number and exit.\n\
+\n\
+Interpolation settings:\n\
+ -w, --weight=N Set weight to N.\n\
+ -W, --width=N Set width to N.\n\
+ -O, --optical-size=N Set optical size to N.\n\
+ --style=N Set style axis to N.\n\
+ --1=N, --2=N, --3=N, --4=N Set first (second, third, fourth) axis to N.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+static void
+set_design(PermString a, double v)
+{
+ ax_names.push_back(a);
+ ax_nums.push_back(-1);
+ values.push_back(v);
+}
+
+static void
+set_design(int a, double v)
+{
+ ax_names.push_back(PermString());
+ ax_nums.push_back(a);
+ values.push_back(v);
+}
+
+void
+do_file(const char *filename, PsresDatabase *psres)
+{
+ FILE *f;
+ if (strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript or instance name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ const char *underscore = strchr(filename, '_');
+ if (!fn && underscore) {
+ fn = psres->filename_value
+ ("FontOutline", PermString(filename, underscore - filename));
+ int i = 0;
+ while (underscore[0] == '_' && underscore[1]) {
+ double x = strtod(underscore + 1, const_cast<char **>(&underscore));
+ set_design(i, x);
+ i++;
+ }
+ }
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ font = new MyFont(*reader);
+ delete reader;
+ if (!font->ok())
+ errh->fatal("%s: invalid font", filename);
+ else if (font->nglyphs() == 0)
+ errh->fatal("%s: font contains no characters", filename);
+
+ mmspace = font->create_mmspace(errh);
+ if (!mmspace)
+ errh->fatal("%s: not a multiple master font", filename);
+
+ font->undo_synthetic();
+}
+
+
+static void
+print_conversion_program(FILE *f, const Type1Charstring &cs, PermString name)
+{
+ if (cs) {
+ const unsigned char *data = cs.data();
+ for (int i = 0; i < cs.length(); ) {
+ int l = cs.length() - i;
+ if (l > 32)
+ l = 32;
+ fprintf(f, "%s <", name.c_str());
+ for (int j = 0; j < l; j++)
+ fprintf(f, "%02X", data[j]);
+ fprintf(f, ">\n");
+ data += l;
+ i += l;
+ }
+ }
+}
+
+
+static void
+print_amcp_info(MultipleMasterSpace *mmspace, FILE *f)
+{
+ const Type1Charstring &ndv = mmspace->ndv();
+ const Type1Charstring &cdv = mmspace->cdv();
+ if (!ndv && !cdv)
+ fprintf(stderr, "%s does not have conversion programs.\n",
+ mmspace->font_name().c_str());
+ else {
+ fprintf(f, "StartConversionPrograms %d %d\n", ndv.length(),
+ cdv.length());
+ print_conversion_program(f, ndv, "NDV");
+ print_conversion_program(f, cdv, "CDV");
+ fprintf(f, "EndConversionPrograms\n");
+ }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ bool write_pfb = true;
+ bool amcp_info = false;
+ bool minimize = true;
+ int precision = 5;
+ int subr_count = -1;
+ FILE *outfile = 0;
+ ::errh =
+ ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case WEIGHT_OPT:
+ set_design("Weight", clp->val.d);
+ break;
+
+ case WIDTH_OPT:
+ set_design("Width", clp->val.d);
+ break;
+
+ case OPSIZE_OPT:
+ set_design("OpticalSize", clp->val.d);
+ break;
+
+ case STYLE_OPT:
+ set_design("Style", clp->val.d);
+ break;
+
+ case N1_OPT:
+ case N2_OPT:
+ case N3_OPT:
+ case N4_OPT:
+ set_design(opt - N1_OPT, clp->val.d);
+ break;
+
+ case AMCP_INFO_OPT:
+ amcp_info = true;
+ break;
+
+ case PFA_OPT:
+ write_pfb = false;
+ break;
+
+ case PFB_OPT:
+ write_pfb = true;
+ break;
+
+ case PRECISION_OPT:
+ if (clp->val.i > 107) {
+ errh->warning("precision lowered to 107");
+ precision = 107;
+ } else if (clp->val.i < 1) {
+ errh->warning("precision raised to 1");
+ precision = 1;
+ } else
+ precision = clp->val.i;
+ break;
+
+ case SUBRS_OPT:
+ if (clp->negated)
+ subr_count = -1;
+ else if (clp->val.i <= 0)
+ errh->warning("subr count too small");
+ else
+ subr_count = clp->val.i;
+ break;
+
+ case MINIMIZE_OPT:
+ minimize = !clp->negated;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = ErrorHandler::silent_handler();
+ break;
+
+ case OUTPUT_OPT:
+ if (outfile) errh->fatal("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ outfile = stdout;
+ else {
+ outfile = fopen(clp->arg, "wb");
+ if (!outfile)
+ errh->fatal("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case VERSION_OPT:
+ printf("mmpfb (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1997-2004 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ do_file(clp->arg, psres);
+ break;
+
+ case Clp_Done:
+ if (!font)
+ usage_error("missing font argument");
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (outfile == 0)
+ outfile = stdout;
+
+ if (amcp_info) {
+ print_amcp_info(mmspace, outfile);
+ exit(0);
+ }
+
+ Vector<double> design = mmspace->empty_design_vector();
+ for (int i = 0; i < values.size(); i++)
+ if (ax_names[i])
+ mmspace->set_design(design, ax_names[i], values[i], errh);
+ else
+ mmspace->set_design(design, ax_nums[i], values[i], errh);
+
+ Vector<double> default_design = mmspace->default_design_vector();
+ for (int i = 0; i < mmspace->naxes(); i++)
+ if (!KNOWN(design[i]) && KNOWN(default_design[i])) {
+ errh->warning("using default value %g for %s's %s", default_design[i],
+ font->font_name().c_str(), mmspace->axis_type(i).c_str());
+ design[i] = default_design[i];
+ }
+
+ if (!font->set_design_vector(mmspace, design, errh))
+ exit(1);
+
+ font->interpolate_dicts(minimize, errh);
+ font->interpolate_charstrings(precision, errh);
+
+ if (subr_count >= 0) {
+ Type1SubrRemover sr(font, errh);
+ sr.run(subr_count);
+ }
+
+ font->fill_in_subrs();
+
+ Type1Font *t1font;
+ if (minimize) {
+ t1font = ::minimize(font);
+ delete font;
+ } else
+ t1font = font;
+
+ { // Add an identifying comment.
+#if HAVE_CTIME
+ time_t cur_time = time(0);
+ char *time_str = ctime(&cur_time);
+ int time_len = strlen(time_str) - 1;
+ char *buf = new char[strlen(VERSION) + time_len + 100];
+ sprintf(buf, "%%%% Interpolated by mmpfb-%s on %.*s.", VERSION,
+ time_len, time_str);
+#else
+ char *buf = new char[strlen(VERSION) + 100];
+ sprintf(buf, "%%%% Interpolated by mmpfb-%s.", VERSION);
+#endif
+
+ t1font->add_header_comment(buf);
+ t1font->add_header_comment("%% Mmpfb is free software. See <http://www.lcdf.org/type/>.");
+ delete[] buf;
+ }
+
+ if (write_pfb) {
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outfile), _O_BINARY);
+#endif
+ Type1PFBWriter w(outfile);
+ t1font->write(w);
+ } else {
+ Type1PFAWriter w(outfile);
+ t1font->write(w);
+ }
+
+ return 0;
+}
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/mmpfb.1 b/Build/source/utils/lcdf-typetools/mmpfb/mmpfb.1
new file mode 100644
index 00000000000..23bac8dd967
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/mmpfb.1
@@ -0,0 +1,211 @@
+.\" -*-nroff-*-
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.ds E " \-\-
+.if t .ds E \(em
+.de OP
+.BR "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de OA
+.IR "\fB\\$1\& \|\fI\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de OY
+.BI "\\$1\fR=" "\\$2\fR, " "\\$3\& " "\\$4" "\\$5" "\\$6"
+..
+.de OL
+.BI "\\$1\fR=" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH MMPFB 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+mmpfb \- creates single-master fonts from multiple master fonts
+'
+.SH SYNOPSIS
+.B mmpfb
+\%[OPTIONS...]
+.I font
+'
+.SH DESCRIPTION
+.B Mmpfb
+creates a normal, single-master PostScript font from a multiple master font
+by interpolation. You pass it a PFB or PFA font and options specifying the
+design point you want; it writes the resulting PFB or PFA font to the
+standard output.
+.PP
+The fonts
+.B mmpfb
+creates are interpolated at a low level to remove multiple master
+instructions from individual characters. Therefore, they can be used by
+programs that don't normally understand multiple master fonts, like
+.BR ps2pk (1).
+.PP
+.B Mmpfb
+supports fonts with intermediate masters, like Adobe Jenson and Kepler. It
+can also create AMCP (Adobe Multiple Master Conversion Program) files for
+use by
+.M mmafm 1 ;
+see
+.B \-\-amcp\-info
+below.
+.PP
+The
+.I font
+argument is either the name of a PFA or PFB font file, or a PostScript font
+name. If you give a font name,
+.B mmpfb
+will find the actual outline file using the PSRESOURCEPATH environment
+variable. This colon-separated path is searched for `PSres.upr' files, an
+Adobe method for indexing PostScript resources.
+.PP
+You can also give the name of a multiple
+master font instance, like `MinionMM_367_400_12_'.
+.B Mmpfb
+will parse the font name and create that instance for you. `PSres.upr'
+files must be set up for this to work.
+'
+'
+.SH EXAMPLE
+'
+.nf
+% mmpfb \-\-weight=400 \-\-width=600 MyriadMM.pfb > MyriadMM_400_600_.pfb
+.fi
+'
+.SH OPTIONS
+Long options may be abbreviated to their unique prefixes.
+'
+.TP 5
+.OY \-\-output file \-o file
+'
+Send output to
+.I file
+instead of standard output.
+'
+.TP
+.BR \-\-pfb ", " \-b
+'
+Output a PFB font. This is the default.
+'
+.TP
+.BR \-\-pfa ", " \-a
+'
+Output a PFA font.
+'
+.TP
+.OP \-\-amcp\-info
+'
+Do not create a font; instead, output an AMCP file for use by
+.M mmafm 1 .
+A message is printed if the font doesn't have intermediate masters, in
+which case no AMCP file is necessary.
+'
+.TP
+.OY \-\-weight N \-w N
+'
+Set the weight axis to
+.IR N .
+'
+.TP
+.OY \-\-width N \-W N
+'
+Set the width axis to
+.IR N .
+'
+.TP
+.OY \-\-optical\-size N \-O N
+'
+Set the optical size axis to
+.IR N .
+'
+.TP
+.OL \-\-style N
+'
+Set the style axis to
+.IR N .
+.TP
+\fB\-\-1\fR=\fIN\fR (\fB\-\-2\fR=\fIN\fR, \fB\-\-3\fR=\fIN\fR, \fB\-\-4\fR=\fIN\fR)
+'
+Set the first (second, third, fourth) axis to
+.IR N .
+'
+.TP
+.OY \-\-precision N \-p N
+'
+Set the output precision to
+.IR N .
+Higher values mean the control points in the output font will be more
+exactly aligned; lower values (1 or 2) create smaller output font
+files, and are close enough for most purposes. A precision of
+.IR N
+means that each point will be within
+.RI 1/ N
+font units of the exact interpolated value. (A font unit is generally
+1/7200 inch for a 10-point font.) The default is 5.
+'
+.TP
+.OL \-\-subrs N
+'
+Limit the output font to at most
+.IR N
+subroutines. 256 is a good value for
+.IR N .
+'
+.TP
+.BR \-\-no\-minimize
+'
+Do not minimize the output font definition. By default,
+.B mmpfb
+removes extra PostScript code and dictionary definitions from the font.
+Supply the
+.B \-\-no\-minimize
+option to avoid this behavior.
+'
+.SH TROUBLESHOOTING
+.LP
+The "IBM" Type 1 font interpreter shipped as part of the X font server and
+.B ps2pk
+(among others) is inappropriately strict about PostScript code embedded in
+a font. The
+.B \-\-minimize
+option (now the default) fixes this problem.
+.LP
+Some versions of Adobe Acrobat Distiller may report "Warning: unable to
+embed font X. Invalid character outline data" when distilling an instance
+generated by
+.BR mmpfb .
+This is due to a limitation in the number of font subroutines Distiller can
+accept. (Multiple master fonts, and the single-master fonts generated by
+.BR mmpfb ,
+tend to have a lot of subroutines.) Try limiting the number of subroutines
+in the generated font with the
+.OP \-\-subrs
+option.
+'
+.SH SEE ALSO
+.M mmafm 1
+'
+.SH DIAGNOSTICS
+.TP 5
+reducing \fIfont\fR to minimum number of subroutines (\fIN\fR)
+You tried to reduce the number of subroutines to less than \fIN\fR using
+the
+.OP \-\-subrs
+option, but the font needs at least \fIN\fR to function. The output font
+will have \fIN\fR subroutines.
+'
+.SH AUTHOR
+.na
+Eddie Kohler, kohler@icir.org
+.br
+http://www.pdos.lcs.mit.edu/~eddietwo/
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
+.PP
+Thanks to Melissa O'Neill <oneill@cs.sfu.ca> for suggestions and patient
+debugging.
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/myfont.cc b/Build/source/utils/lcdf-typetools/mmpfb/myfont.cc
new file mode 100644
index 00000000000..a2c9eda0dbd
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/myfont.cc
@@ -0,0 +1,300 @@
+/* myfont.cc -- general multiple- to single-master conversion
+ *
+ * Copyright (c) 1997-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "myfont.hh"
+#include <efont/t1item.hh>
+#include <efont/t1interp.hh>
+#include "t1rewrit.hh"
+#include <efont/t1mm.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+using namespace Efont;
+
+MyFont::MyFont(Type1Reader &reader)
+ : Type1Font(reader)
+{
+}
+
+MyFont::~MyFont()
+{
+}
+
+void
+MyFont::kill_def(Type1Definition *t1d, int whichd)
+{
+ if (!t1d)
+ return;
+
+ if (whichd < 0)
+ for (whichd = dFont; whichd < dLast; whichd = (Dict)(whichd + 1))
+ if (dict(whichd, t1d->name()) == t1d)
+ break;
+ if (whichd < 0 || whichd >= dLast || dict(whichd, t1d->name()) != t1d)
+ return;
+
+ int icount = nitems();
+ for (int i = first_dict_item(whichd); i < icount; i++)
+ if (item(i) == t1d) {
+ StringAccum sa;
+ sa << '%';
+ t1d->gen(sa);
+ PermString name = t1d->name();
+ Type1CopyItem *t1ci = new Type1CopyItem(sa.take_string());
+ set_item(i, t1ci);
+ set_dict(whichd, name, 0);
+ return;
+ }
+
+ assert(0);
+}
+
+bool
+MyFont::set_design_vector(MultipleMasterSpace *mmspace, const Vector<double> &design, ErrorHandler *errh)
+{
+ Type1Definition *t1d = dict("DesignVector");
+ if (t1d) {
+ t1d->set_numvec(design);
+ kill_def(t1d, dFont);
+ }
+
+ t1d = dict("NormDesignVector");
+ if (t1d) {
+ NumVector norm_design;
+ if (mmspace->design_to_norm_design(design, norm_design))
+ t1d->set_numvec(norm_design);
+ kill_def(t1d, dFont);
+ }
+
+ if (!mmspace->design_to_weight(design, _weight_vector, errh))
+ return false;
+
+ // Need to check for case when all design coordinates are unspecified. The
+ // font file contains a default WeightVector, but possibly NOT a default
+ // DesignVector; we don't want to generate a FontName like
+ // `MyriadMM_-9.79797979e97_-9.79797979e97_' because the DesignVector
+ // components are unknown.
+ if (!KNOWN(design[0])) {
+ errh->error("must specify %s's %s coordinate", font_name().c_str(),
+ mmspace->axis_type(0).c_str());
+ return false;
+ }
+
+ t1d = dict("WeightVector");
+ if (t1d) {
+ t1d->set_numvec(_weight_vector);
+ kill_def(t1d, dFont);
+ }
+
+ int naxes = design.size();
+ _nmasters = _weight_vector.size();
+
+ PermString name;
+ t1d = dict("FontName");
+ if (t1d && t1d->value_name(name)) {
+ StringAccum sa(name);
+ for (int a = 0; a < naxes; a++)
+ sa << '_' << design[a];
+ // Multiple masters require an underscore AFTER the font name
+ sa << '_';
+ t1d->set_name(sa.c_str());
+ uncache_defs(); // remove cached font name
+ }
+
+ // add a FullName too
+ String full_name;
+ t1d = fi_dict("FullName");
+ if (t1d && t1d->value_string(full_name)) {
+ StringAccum sa(full_name);
+ for (int a = 0; a < naxes; a++) {
+ sa << (a ? ' ' : '_') << design[a];
+ PermString label = mmspace->axis_abbreviation(a);
+ if (label)
+ sa << ' ' << label;
+ }
+ t1d->set_string(sa.c_str());
+ }
+
+ // save UniqueID, then kill its definition
+ int uniqueid;
+ t1d = dict("UniqueID");
+ bool have_uniqueid = (t1d && t1d->value_int(uniqueid));
+ kill_def(t1d, dFont);
+
+ // prepare XUID
+ t1d = dict("XUID");
+ NumVector xuid;
+ if (!t1d || !t1d->value_numvec(xuid)) {
+ if (have_uniqueid) {
+ t1d = ensure(dFont, "XUID");
+ xuid.clear();
+ xuid.push_back(1);
+ xuid.push_back(uniqueid);
+ } else if (t1d) {
+ kill_def(t1d, dFont);
+ t1d = 0;
+ }
+ }
+ if (t1d) {
+ // Append design vector values to the XUID to prevent cache pollution.
+ for (int a = 0; a < naxes; a++)
+ xuid.push_back((int)(design[a] * 100));
+ t1d->set_numvec(xuid);
+ }
+
+ return true;
+}
+
+void
+MyFont::interpolate_dict_int(PermString name, Dict the_dict, ErrorHandler *errh)
+{
+ Type1Definition *def = dict(the_dict, name);
+ Type1Definition *blend_def = dict(the_dict + dBlend, name);
+ NumVector blend;
+
+ if (def && blend_def && blend_def->value_numvec(blend)) {
+ int n = _nmasters;
+ double val = 0;
+ for (int m = 0; m < n; m++)
+ val += blend[m] * _weight_vector[m];
+ int ival = (int)floor(val + 0.50001);
+ if (fabs(val - ival) >= 0.001)
+ errh->warning("interpolated %s should be an integer (it is %g)", name.c_str(), val);
+ def->set_num(ival);
+ kill_def(blend_def, the_dict + dBlend);
+ }
+}
+
+void
+MyFont::interpolate_dict_num(PermString name, Dict the_dict, bool force_integer)
+{
+ Type1Definition *def = dict(the_dict, name);
+ Type1Definition *blend_def = dict(the_dict + dBlend, name);
+ NumVector blend;
+
+ if (def && blend_def && blend_def->value_numvec(blend)) {
+ int n = _nmasters;
+ double val = 0;
+ for (int m = 0; m < n; m++)
+ val += blend[m] * _weight_vector[m];
+ if (force_integer)
+ val = floor(val + 0.50001);
+ def->set_num(val);
+ kill_def(blend_def, the_dict + dBlend);
+ } else if (def && !blend_def && force_integer) {
+ double val;
+ if (def->value_num(val))
+ def->set_num(floor(val + 0.50001));
+ }
+}
+
+void
+MyFont::interpolate_dict_numvec(PermString name, Dict the_dict, int round_mode, bool executable)
+{
+ Type1Definition *def = dict(the_dict, name);
+ Type1Definition *blend_def = dict(the_dict + dBlend, name);
+ Vector<NumVector> blend;
+
+ if (def && blend_def && blend_def->value_numvec_vec(blend)) {
+ int n = blend.size();
+ NumVector val;
+ for (int i = 0; i < n; i++) {
+ double d = 0;
+ for (int m = 0; m < _nmasters; m++)
+ d += blend[i][m] * _weight_vector[m];
+ if (round_mode == 2 && i < 2)
+ d = floor(d - 0.50001);
+ else if (round_mode)
+ d = floor(d + 0.50001);
+ val.push_back(d);
+ }
+ def->set_numvec(val, executable);
+ kill_def(blend_def, the_dict + dBlend);
+ }
+}
+
+void
+MyFont::interpolate_dicts(bool force_integer, ErrorHandler *errh)
+{
+ // Unfortunately, some programs (acroread) expect the FontBBox to consist
+ // of integers. Round its elements away from zero (this is what the
+ // Acrobat distiller seems to do).
+ interpolate_dict_numvec("FontBBox", dFont, 2, true);
+
+ interpolate_dict_numvec("BlueValues", dPrivate, force_integer);
+ interpolate_dict_numvec("OtherBlues", dPrivate, force_integer);
+ interpolate_dict_numvec("FamilyBlues", dPrivate, force_integer);
+ interpolate_dict_numvec("FamilyOtherBlues", dPrivate, force_integer);
+ interpolate_dict_numvec("StdHW", dPrivate);
+ interpolate_dict_numvec("StdVW", dPrivate);
+ interpolate_dict_numvec("StemSnapH", dPrivate);
+ interpolate_dict_numvec("StemSnapV", dPrivate);
+
+ interpolate_dict_num("BlueScale", dPrivate);
+ interpolate_dict_num("BlueShift", dPrivate, force_integer);
+ interpolate_dict_int("BlueFuzz", dPrivate, errh);
+
+ {
+ Type1Definition *def = p_dict("ForceBold");
+ Type1Definition *blend_def = bp_dict("ForceBold");
+ Type1Definition *thresh = p_dict("ForceBoldThreshold");
+ Vector<PermString> namevec;
+ double thresh_val;
+ if (def && blend_def && thresh && blend_def->value_namevec(namevec)
+ && thresh->value_num(thresh_val) && namevec.size() == _nmasters) {
+ double v = 0;
+ for (int m = 0; m < _nmasters; m++)
+ if (namevec[m] == "true")
+ v += _weight_vector[m];
+ def->set_code(v >= thresh_val ? "true" : "false");
+ kill_def(blend_def, dBlendPrivate);
+ }
+ }
+
+ interpolate_dict_num("UnderlinePosition", dFontInfo);
+ interpolate_dict_num("UnderlineThickness", dFontInfo);
+ interpolate_dict_num("ItalicAngle", dFontInfo);
+
+ if (Type1Definition *def = bp_dict("BuildCharArray"))
+ kill_def(def, dBlendPrivate);
+
+ for (DictHashMap::const_iterator i = dict_begin(dBlend); i; i++) {
+ PermString name = i.key();
+ if (i.value() && name != "Private" && name != "FontInfo"
+ && name != "ConvertDesignVector" && name != "NormalizeDesignVector")
+ errh->warning("didn't interpolate %s in Blend", name.c_str());
+ }
+
+ for (DictHashMap::const_iterator i = dict_begin(dBlendPrivate); i; i++)
+ if (i.value() && i.key() != "Erode")
+ errh->warning("didn't interpolate %s in BlendPrivate", i.key().c_str());
+
+ kill_def(p_dict("NDV"), dPrivate);
+ kill_def(p_dict("CDV"), dPrivate);
+ kill_def(p_dict("UniqueID"), dPrivate);
+ kill_def(fi_dict("BlendDesignPositions"), dFontInfo);
+ kill_def(fi_dict("BlendDesignMap"), dFontInfo);
+ kill_def(fi_dict("BlendAxisTypes"), dFontInfo);
+}
+
+void
+MyFont::interpolate_charstrings(int precision, ErrorHandler *errh)
+{
+ Type1MMRemover remover(this, _weight_vector, precision, errh);
+ remover.run();
+}
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/myfont.hh b/Build/source/utils/lcdf-typetools/mmpfb/myfont.hh
new file mode 100644
index 00000000000..9b29a9f4111
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/myfont.hh
@@ -0,0 +1,31 @@
+#ifndef MYFONT_HH
+#define MYFONT_HH
+#include <efont/t1font.hh>
+namespace Efont { class MultipleMasterSpace; }
+class ErrorHandler;
+
+class MyFont : public Efont::Type1Font { public:
+
+ MyFont(Efont::Type1Reader &);
+ ~MyFont();
+
+ bool set_design_vector(Efont::MultipleMasterSpace *, const Vector<double> &, ErrorHandler * = 0);
+
+ void interpolate_dicts(bool force_integers, ErrorHandler *);
+ void interpolate_charstrings(int precision, ErrorHandler * = 0);
+
+ private:
+
+ typedef Vector<double> NumVector;
+
+ int _nmasters;
+ Vector<double> _weight_vector;
+
+ void interpolate_dict_int(PermString, Dict, ErrorHandler *);
+ void interpolate_dict_num(PermString, Dict, bool round_integer = false);
+ void interpolate_dict_numvec(PermString, Dict, int round_mode = 0, bool executable = false);
+ void kill_def(Efont::Type1Definition *, int which_dict = -1);
+
+};
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/t1minimize.cc b/Build/source/utils/lcdf-typetools/mmpfb/t1minimize.cc
new file mode 100644
index 00000000000..54699cb5d31
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/t1minimize.cc
@@ -0,0 +1,43 @@
+/* t1minimize.cc -- make minimal copy of a Type 1 font
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "t1minimize.hh"
+#include <efont/t1item.hh>
+#include <stdio.h>
+
+using namespace Efont;
+
+/*****
+ * main
+ **/
+
+Type1Font *
+minimize(Type1Font *font)
+{
+ Type1Font *output = Type1Font::skeleton_make_copy(font, font->font_name());
+
+ // Subrs
+ for (int i = 0; i < font->nsubrs(); i++)
+ if (Type1Subr *s = font->subr_x(i))
+ output->set_subr(s->subrno(), s->t1cs(), s->definer());
+
+ // CharStrings
+ for (int i = 0; i < font->nglyphs(); i++)
+ if (Type1Subr *g = font->glyph_x(i))
+ output->add_glyph(Type1Subr::make_glyph(g->name(), g->t1cs(), g->definer()));
+
+ return output;
+}
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/t1minimize.hh b/Build/source/utils/lcdf-typetools/mmpfb/t1minimize.hh
new file mode 100644
index 00000000000..a5c3ea04906
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/t1minimize.hh
@@ -0,0 +1,7 @@
+#ifndef EFONT_T1MINIMIZE_HH
+#define EFONT_T1MINIMIZE_HH
+#include <efont/t1font.hh>
+
+Efont::Type1Font *minimize(Efont::Type1Font *);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.cc b/Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.cc
new file mode 100644
index 00000000000..e6973594ed4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.cc
@@ -0,0 +1,922 @@
+/* t1rewrit.cc -- routines for multiple- to single-master charstring conversion
+ *
+ * Copyright (c) 1997-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "t1rewrit.hh"
+#include <efont/t1item.hh>
+#include <efont/t1csgen.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <stdio.h>
+#include <math.h>
+
+using namespace Efont;
+
+static bool itc_complained = false;
+static ErrorHandler *itc_errh;
+
+void
+itc_complain()
+{
+ //itc_errh->warning("strange `callothersubr'; is this an ITC font?");
+ itc_complained = true;
+}
+
+
+/*****
+ * HintReplacementDetector
+ **/
+
+class HintReplacementDetector : public CharstringInterp { public:
+
+ HintReplacementDetector(Type1Font *, int);
+ HintReplacementDetector(Type1Font *, const Vector<double> &, int);
+
+ bool is_hint_replacement(int i) const { return _hint_replacements[i] != 0; }
+ int call_count(int i) const { return _call_counts[i]; }
+
+ bool type1_command(int);
+
+ bool run(Type1Font *, Type1Charstring &);
+
+ private:
+
+ Vector<int> _hint_replacements;
+ Vector<int> _call_counts;
+ int _subr_level;
+ int _count_calls_below;
+
+};
+
+HintReplacementDetector::HintReplacementDetector(Type1Font *f, int b)
+ : CharstringInterp(),
+ _hint_replacements(f->nsubrs(), 0), _call_counts(f->nsubrs(), 0),
+ _count_calls_below(b)
+{
+}
+
+HintReplacementDetector::HintReplacementDetector(Type1Font *f, const Vector<double> &wv, int b)
+ : CharstringInterp(wv),
+ _hint_replacements(f->nsubrs(), 0), _call_counts(f->nsubrs(), 0),
+ _count_calls_below(b)
+{
+}
+
+bool
+HintReplacementDetector::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallothersubr: {
+ if (size() < 2)
+ goto unknown;
+ int command = (int)top(0);
+ int n = (int)top(1);
+ if (command == Cs::othcReplacehints && n == 1) {
+ pop(2);
+ _hint_replacements[(int)top()] = 1;
+ ps_clear();
+ ps_push(top());
+ pop();
+ break;
+ } else if (command >= Cs::othcMM1 && command <= Cs::othcMM6) {
+ pop(2);
+ return mm_command(command, n);
+ } else if (command >= Cs::othcITC_load && command <= Cs::othcITC_random) {
+ pop(2);
+ return itc_command(command, n);
+ } else
+ goto unknown;
+ }
+
+ case Cs::cCallsubr: {
+ if (size() < 1)
+ return error(errUnderflow, cmd);
+ int which = (int)pop();
+ if (!_count_calls_below || _subr_level < _count_calls_below)
+ _call_counts[which]++;
+
+ Charstring *subr_cs = get_subr(which);
+ if (!subr_cs)
+ return error(errSubr, which);
+
+ _subr_level++;
+ subr_cs->process(*this);
+ _subr_level--;
+
+ if (error() != errOK)
+ return false;
+ return !done();
+ }
+
+ case Cs::cEndchar:
+ case Cs::cReturn:
+ return CharstringInterp::type1_command(cmd);
+
+ case Cs::cBlend:
+ case Cs::cAbs:
+ case Cs::cAdd:
+ case Cs::cSub:
+ case Cs::cDiv:
+ case Cs::cNeg:
+ case Cs::cRandom:
+ case Cs::cMul:
+ case Cs::cSqrt:
+ case Cs::cDrop:
+ case Cs::cExch:
+ case Cs::cIndex:
+ case Cs::cRoll:
+ case Cs::cDup:
+ case Cs::cAnd:
+ case Cs::cOr:
+ case Cs::cNot:
+ case Cs::cEq:
+ case Cs::cIfelse:
+ return arith_command(cmd);
+
+ case Cs::cPop:
+ if (ps_size() >= 1)
+ push(ps_pop());
+ break;
+
+ default:
+ unknown:
+ clear();
+ break;
+
+ }
+ return true;
+}
+
+bool
+HintReplacementDetector::run(Type1Font *f, Type1Charstring &cs)
+{
+ _subr_level = 0;
+ CharstringInterp::interpret(f, &cs);
+ return error() == errOK;
+}
+
+
+/*****
+ * Type1OneMMRemover
+ **/
+
+class Type1OneMMRemover: public CharstringInterp { public:
+
+ Type1OneMMRemover(Type1MMRemover *);
+
+ bool type1_command(int);
+
+ inline bool run_fresh_subr(const Type1Charstring &, bool);
+ inline bool run_fresh_glyph(const Type1Charstring &);
+ inline bool rerun_subr(const Type1Charstring &);
+
+ Type1Charstring *output_prefix();
+ void output_main(Type1Charstring &);
+
+ private:
+
+ Type1MMRemover *_remover;
+ Type1CharstringGen _prefix_gen;
+ Type1CharstringGen _main_gen;
+
+ int _subr_level;
+ bool _in_subr;
+ bool _in_prefix;
+ bool _must_expand;
+
+ inline void run_subr(Type1Charstring *);
+ bool itc_command(int command, int on_stack);
+
+ bool run(const Type1Charstring &, bool, bool, bool);
+
+};
+
+/* For version 1.1
+ *
+ * Problem: Sometimes a charstring will call one subroutine, which will call
+ * another, etc., which finally does a multiple master CallOtherSubr! The
+ * required arguments might build up only gradually over all the subrs. This
+ * makes it hard to remove the eventual CallOtherSubr!
+ *
+ * Partial solution: Divide each subroutine into two parts: the initial
+ * "prefix" contains the closure of any initial multiple-master commands
+ * (including those from sub-subroutines), the following "main" part has all
+ * the other commands. In a situation like this:
+ *
+ * subr-1 = 8 15 callothersubr pop pop pop return
+ * subr-2 = 4 5 6 1 callsubr return
+ * subr-3 = 1 2 3 2 callsubr return
+ *
+ * we'll divide it up like this: (prefix || main)
+ *
+ * subr-1 = 8 15 callothersubr pop pop pop || (nothing)
+ * subr-2 = 4 5 6 8 15 callothersubr pop pop pop || (nothing)
+ * subr-3 = 1 2 3 4 5 6 8 15 callothersubr pop pop pop || (nothing)
+ *
+ * Now, when we call a subroutine, we EXECUTE its prefix part. Then, if its
+ * main part is nonempty, we output the original call to the subroutine to
+ * take care of the main part. */
+
+
+Type1OneMMRemover::Type1OneMMRemover(Type1MMRemover *remover)
+ : CharstringInterp(remover->weight_vector()),
+ _remover(remover), _prefix_gen(remover->precision()),
+ _main_gen(remover->precision())
+{
+}
+
+inline void
+Type1OneMMRemover::run_subr(Type1Charstring *cs)
+{
+ _subr_level++;
+ cs->process(*this);
+ _subr_level--;
+}
+
+bool
+Type1OneMMRemover::itc_command(int command, int on_stack)
+{
+ const Vector<double> &weight = weight_vector();
+ assert(weight.size());
+ Vector<double> *scratch = scratch_vector();
+ Type1CharstringGen *gen =
+ (_in_prefix ? &_prefix_gen : (_in_subr ? &_main_gen : 0));
+
+ int base = size() - on_stack - 2;
+ switch (command) {
+
+ case Cs::othcITC_load: {
+ if (on_stack != 1)
+ return false;
+ int offset = (int)at(base);
+ for (int i = 0; i < weight.size(); i++)
+ vec(scratch, offset+i) = weight.at_u(i);
+ // save load command, so we expand its effects into the scratch
+ // vector
+ if (gen) {
+ gen->gen_number(offset);
+ gen->gen_number(1);
+ gen->gen_number(Cs::othcITC_load);
+ gen->gen_command(Cs::cCallothersubr);
+ }
+ break;
+ }
+
+ case Cs::othcITC_put: {
+ if (on_stack != 2)
+ return false;
+ int offset = (int)at(base+1);
+ vec(scratch, offset) = at(base);
+ // save put command, so we expand its effects into the scratch
+ // vector
+ if (gen) {
+ gen->gen_number(at(base));
+ gen->gen_number(offset);
+ gen->gen_number(2);
+ gen->gen_number(Cs::othcITC_put);
+ gen->gen_command(Cs::cCallothersubr);
+ }
+ break;
+ }
+
+ case Cs::othcITC_get: {
+ if (on_stack != 1)
+ return false;
+ int offset = (int)at(base);
+ double d = vec(scratch, offset);
+ if (!KNOWN(d)) {
+ _must_expand = true;
+ return false;
+ }
+ ps_push(d);
+ break;
+ }
+
+ case Cs::othcITC_add: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) + at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_sub: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) - at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_mul: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) * at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_div: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) / at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_ifelse: {
+ if (on_stack != 4)
+ return false;
+ if (at(base+2) <= at(base+3))
+ ps_push(at(base));
+ else
+ ps_push(at(base+1));
+ break;
+ }
+
+ default:
+ return false;
+
+ }
+
+ pop(on_stack + 2);
+ return true;
+}
+
+bool
+Type1OneMMRemover::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallothersubr: {
+ // Expand known othersubr calls. If we cannot expand the othersubr
+ // call completely, then write it to the expander.
+ if (size() < 2)
+ goto partial_othersubr;
+ int command = (int)top(0);
+ int n = (int)top(1);
+ if (command >= Cs::othcITC_load && command <= Cs::othcITC_random) {
+ if (!itc_complained)
+ itc_complain();
+ if (size() < 2 + n || !itc_command(command, n))
+ goto partial_othersubr;
+ } else if (command >= Cs::othcMM1 && command <= Cs::othcMM6) {
+ if (size() < 2 + n)
+ goto partial_othersubr;
+ pop(2);
+ mm_command(command, n);
+ } else
+ goto normal;
+ break;
+ }
+
+ partial_othersubr: {
+ if (!_in_prefix) {
+ _must_expand = true;
+ goto normal;
+ }
+ _prefix_gen.gen_stack(*this, 0);
+ _prefix_gen.gen_command(Cs::cCallothersubr);
+ break;
+ }
+
+ case Cs::cCallsubr: {
+ // expand subroutines in line if necessary
+ if (size() < 1)
+ goto normal;
+ int subrno = (int)pop();
+ if (_subr_level < 1) { // otherwise, have already included prefix
+ if (Type1Charstring *cs = _remover->subr_prefix(subrno))
+ run_subr(cs);
+ }
+ if (Type1Charstring *cs = _remover->subr_expander(subrno))
+ run_subr(cs);
+ else {
+ push(subrno);
+ goto normal;
+ }
+ break;
+ }
+
+ case Cs::cPop:
+ if (ps_size() >= 1)
+ push(ps_pop());
+ else if (_in_prefix && ps_size() == 0) {
+ _prefix_gen.gen_stack(*this, 0);
+ _prefix_gen.gen_command(Cs::cPop);
+ } else
+ goto normal;
+ break;
+
+ case Cs::cDiv:
+ if (size() < 2)
+ goto normal;
+ top(1) /= top(0);
+ pop();
+ break;
+
+ case Cs::cReturn:
+ return false;
+
+ normal:
+ default:
+ _main_gen.gen_stack(*this, cmd);
+ _main_gen.gen_command(cmd);
+ _in_prefix = 0;
+ return (cmd != Cs::cEndchar);
+
+ }
+ return true;
+}
+
+
+bool
+Type1OneMMRemover::run(const Type1Charstring &cs,
+ bool in_subr, bool do_prefix, bool fresh)
+{
+ _prefix_gen.clear();
+ _main_gen.clear();
+ _in_subr = in_subr;
+ _in_prefix = do_prefix;
+ _subr_level = (fresh ? 0 : 1);
+ _must_expand = false;
+ Vector<double> *scratch = scratch_vector();
+ scratch->assign(scratch->size(), UNKDOUBLE);
+
+ CharstringInterp::interpret(_remover->program(), &cs);
+
+ if (in_subr) {
+ _main_gen.gen_stack(*this, Cs::cReturn);
+ _main_gen.gen_command(Cs::cReturn);
+ }
+ if (_must_expand)
+ return true;
+ if (fresh && in_subr) {
+ if (_main_gen.length() == 0
+ || (_main_gen.length() == 1 && _main_gen.data()[0] == Cs::cReturn))
+ return true;
+ }
+ return false;
+}
+
+inline bool
+Type1OneMMRemover::run_fresh_subr(const Type1Charstring &cs, bool do_prefix)
+{
+ return run(cs, true, do_prefix, true);
+}
+
+inline bool
+Type1OneMMRemover::run_fresh_glyph(const Type1Charstring &cs)
+{
+ return run(cs, false, false, true);
+}
+
+inline bool
+Type1OneMMRemover::rerun_subr(const Type1Charstring &cs)
+{
+ return run(cs, true, false, false);
+}
+
+Type1Charstring *
+Type1OneMMRemover::output_prefix()
+{
+ if (_prefix_gen.length() > 0) {
+ _prefix_gen.gen_command(Cs::cReturn);
+ return _prefix_gen.output();
+ } else
+ return 0;
+}
+
+void
+Type1OneMMRemover::output_main(Type1Charstring &cs)
+{
+ _main_gen.output(cs);
+}
+
+
+/*****
+ * Type1BadCallRemover
+ **/
+
+class Type1BadCallRemover: public CharstringInterp { public:
+
+ Type1BadCallRemover(Type1MMRemover *);
+
+ bool type1_command(int);
+
+ bool run(Type1Charstring &);
+
+ private:
+
+ Type1CharstringGen _gen;
+ Type1MMRemover *_remover;
+
+};
+
+Type1BadCallRemover::Type1BadCallRemover(Type1MMRemover *remover)
+ : CharstringInterp(remover->weight_vector()),
+ _gen(remover->precision()), _remover(remover)
+{
+}
+
+bool
+Type1BadCallRemover::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallsubr: {
+ if (size() < 1)
+ goto normal;
+ int subrno = (int)top();
+ if (!get_subr(subrno)) {
+ pop();
+ return false;
+ } else
+ goto normal;
+ }
+
+ normal:
+ default:
+ _gen.gen_stack(*this, 0);
+ _gen.gen_command(cmd);
+ return (cmd != Cs::cEndchar && cmd != Cs::cReturn);
+
+ }
+}
+
+bool
+Type1BadCallRemover::run(Type1Charstring &cs)
+{
+ _gen.clear();
+ CharstringInterp::interpret(_remover->program(), &cs);
+ _gen.output(cs);
+ return error() == errOK;
+}
+
+
+/*****
+ * Type1MMRemover
+ **/
+
+Type1MMRemover::Type1MMRemover(Type1Font *font, const Vector<double> &wv,
+ int precision, ErrorHandler *errh)
+ : _font(font), _weight_vector(wv), _precision(precision),
+ _nsubrs(font->nsubrs()),
+ _subr_done(_nsubrs, 0),
+ _subr_prefix(_nsubrs, (Type1Charstring *)0),
+ _must_expand_subr(_nsubrs, 0),
+ _hint_replacement_subr(_nsubrs, 0),
+ _expand_all_subrs(false), _errh(errh)
+{
+ itc_errh = _errh;
+
+ // find subroutines needed for hint replacement
+ HintReplacementDetector hr(font, wv, 0);
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ hr.run(font, g->t1cs());
+ for (int i = 0; i < _nsubrs; i++)
+ if (hr.is_hint_replacement(i))
+ _hint_replacement_subr[i] = 1;
+
+ // don't get rid of first 4 subrs
+ for (int i = 0; i < _nsubrs && i < 4; i++)
+ _subr_done[i] = 1;
+}
+
+Type1MMRemover::~Type1MMRemover()
+{
+ for (int i = 0; i < _nsubrs; i++)
+ if (_subr_prefix[i])
+ delete _subr_prefix[i];
+}
+
+
+Type1Charstring *
+Type1MMRemover::subr_prefix(int subrno)
+{
+ if (subrno < 0 || subrno >= _nsubrs)
+ return 0;
+
+ if (!_subr_done[subrno]) {
+ _subr_done[subrno] = 1;
+
+ Type1Charstring *subr = _font->subr(subrno);
+ if (!subr)
+ return 0;
+
+ Type1OneMMRemover one(this);
+ if (one.run_fresh_subr(*subr, !_hint_replacement_subr[subrno]))
+ _must_expand_subr[subrno] = true;
+ _subr_prefix[subrno] = one.output_prefix();
+ one.output_main(*subr);
+ }
+
+ return _subr_prefix[subrno];
+}
+
+Type1Charstring *
+Type1MMRemover::subr_expander(int subrno)
+{
+ if (subrno < 0 || subrno >= _nsubrs)
+ return 0;
+ if (!_subr_done[subrno])
+ (void)subr_prefix(subrno);
+ if (!_expand_all_subrs && !_must_expand_subr[subrno])
+ return 0;
+ return _font->subr(subrno);
+}
+
+extern "C" {
+static int CDECL
+sort_permstring_compare(const void *v1, const void *v2)
+{
+ const PermString *s1 = (const PermString *)v1;
+ const PermString *s2 = (const PermString *)v2;
+ return strcmp(s1->c_str(), s2->c_str());
+}
+}
+
+void
+Type1MMRemover::run()
+{
+ Type1OneMMRemover one(this);
+
+ // check subroutines
+ for (int subrno = 0; subrno < _nsubrs; subrno++)
+ (void)subr_prefix(subrno);
+
+ // expand glyphs
+ Vector<PermString> bad_glyphs;
+ for (int i = 0; i < _font->nglyphs(); i++) {
+ Type1Subr *g = _font->glyph_x(i);
+ if (g) {
+ if (one.run_fresh_glyph(g->t1cs())) {
+ // Every glyph should be fully expandable without encountering
+ // a MM command. If we fail the first time, try again,
+ // expanding ALL subroutines. This catches, for example, SUBR
+ // 1 { 1 0 return }; GLYPH g { 1 callsubr 2 blend }; This will
+ // fail the first time, because `1 callsubr' will be left as a
+ // subroutine call, so `1 0' (required arguments to `blend')
+ // won't be visible.
+ _expand_all_subrs = true;
+ if (one.run_fresh_glyph(g->t1cs()))
+ bad_glyphs.push_back(g->name());
+ _expand_all_subrs = false;
+ }
+ one.output_main(g->t1cs());
+ }
+ }
+
+ // remove uncalled subroutines, expand hint replacement subroutines
+ HintReplacementDetector hr(_font, _weight_vector, 0);
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ hr.run(_font, g->t1cs());
+ // don't remove first four subroutines!
+ for (int subrno = 4; subrno < _nsubrs; subrno++)
+ if (hr.call_count(subrno) || _hint_replacement_subr[subrno]) {
+ Type1Charstring *cs = _font->subr(subrno);
+ if (one.rerun_subr(*cs)) {
+ _expand_all_subrs = true;
+ if (one.rerun_subr(*cs))
+ bad_glyphs.push_back(permprintf("subr %d", subrno));
+ _expand_all_subrs = false;
+ }
+ one.output_main(*cs);
+ } else
+ _font->remove_subr(subrno);
+
+ // remove calls to removed subroutines
+ Type1BadCallRemover bcr(this);
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ bcr.run(g->t1cs());
+ for (int subrno = 4; subrno < _nsubrs; subrno++)
+ if (Type1Charstring *cs = _font->subr(subrno))
+ bcr.run(*cs);
+
+ // report warnings
+ if (bad_glyphs.size()) {
+ qsort(&bad_glyphs[0], bad_glyphs.size(), sizeof(PermString), sort_permstring_compare);
+ _errh->error("could not fully interpolate the following glyphs:");
+ StringAccum sa;
+ for (int i = 0; i < bad_glyphs.size(); i++) {
+ PermString n = bad_glyphs[i];
+ bool comma = (i < bad_glyphs.size() - 1);
+ if (sa.length() && sa.length() + 1 + n.length() + comma > 70) {
+ _errh->message(" %s", sa.c_str());
+ sa.clear();
+ }
+ sa << (sa.length() ? " " : "") << n << (comma ? "," : "");
+ }
+ _errh->message(" %s", sa.c_str());
+ }
+}
+
+
+/*****
+ * SubrExpander
+ **/
+
+class SubrExpander : public CharstringInterp { public:
+
+ SubrExpander();
+
+ void set_renumbering(const Vector<int> *v) { _renumbering = v; }
+
+ bool type1_command(int);
+
+ bool run(Type1Font *, Type1Charstring &);
+
+ private:
+
+ Type1CharstringGen _gen;
+ const Vector<int> *_renumbering;
+ int _subr_level;
+
+};
+
+SubrExpander::SubrExpander()
+ : CharstringInterp(), _gen(0), _renumbering(0)
+{
+}
+
+bool
+SubrExpander::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallsubr: {
+ if (size() < 1)
+ goto unknown;
+ int subrno = (int)top(0);
+ int renumber_subrno = (subrno >= 0 && subrno < _renumbering->size() ? (*_renumbering)[subrno] : subrno);
+ if (renumber_subrno >= 0) {
+ top(0) = renumber_subrno;
+ goto unknown;
+ }
+ pop();
+ if (Charstring *subr_cs = get_subr(subrno)) {
+ _subr_level++;
+ subr_cs->process(*this);
+ _subr_level--;
+ }
+ return !done();
+ }
+
+ case Cs::cEndchar:
+ set_done();
+ goto end_cs;
+
+ case Cs::cReturn:
+ if (_subr_level)
+ return false;
+ goto end_cs;
+
+ end_cs:
+ _gen.gen_stack(*this, cmd);
+ _gen.gen_command(cmd);
+ return false;
+
+ default:
+ unknown:
+ _gen.gen_stack(*this, cmd);
+ _gen.gen_command(cmd);
+ break;
+
+ }
+ return true;
+}
+
+bool
+SubrExpander::run(Type1Font *font, Type1Charstring &cs)
+{
+ _gen.clear();
+ _subr_level = 0;
+ CharstringInterp::interpret(font, &cs);
+ _gen.output(cs);
+ return error() == errOK;
+}
+
+
+/*****
+ * Type1SubrRemover
+ **/
+
+Type1SubrRemover::Type1SubrRemover(Type1Font *font, ErrorHandler *errh)
+ : _font(font), _nsubrs(font->nsubrs()),
+ _renumbering(_nsubrs, REMOVABLE), _cost(_nsubrs, 0),
+ _save_count(0), _nonexist_count(0), _errh(errh)
+{
+ // find subroutines needed for hint replacement
+ HintReplacementDetector hr(font, 2);
+ for (int i = 0; i < _font->nglyphs(); i++) {
+ Type1Subr *g = _font->glyph_x(i);
+ if (g)
+ hr.run(_font, g->t1cs());
+ }
+
+ // save necessary subroutines
+ for (int i = 0; i < 4; i++) {
+ _renumbering[i] = i;
+ _save_count++;
+ }
+ // save hint-replacement subroutines
+ for (int i = 0; i < _nsubrs; i++) {
+ Type1Subr *cs = _font->subr_x(i);
+ if (!cs) {
+ _renumbering[i] = DEAD;
+ _nonexist_count++;
+ } else if (hr.is_hint_replacement(i)) {
+ _renumbering[i] = i;
+ _save_count++;
+ } else
+ _cost[i] = hr.call_count(i) * (cs->t1cs().length() - (i <= 107 ? 2 : 3));
+ }
+}
+
+Type1SubrRemover::~Type1SubrRemover()
+{
+}
+
+static Vector<int> *sort_keys;
+
+extern "C" {
+static int CDECL
+sort_permute_compare(const void *v1, const void *v2)
+{
+ const int *i1 = (const int *)v1;
+ const int *i2 = (const int *)v2;
+ return (*sort_keys)[*i1] - (*sort_keys)[*i2];
+}
+}
+
+bool
+Type1SubrRemover::run(int lower_to)
+{
+ if (lower_to < 0)
+ lower_to = _nsubrs;
+ if (lower_to < _save_count) {
+ _errh->warning("reducing %s to minimum number of subroutines (%d)",
+ _font->font_name().c_str(), _save_count - _nonexist_count);
+ lower_to = _save_count;
+ }
+ int to_remove = _nsubrs - _nonexist_count - lower_to;
+ if (to_remove < 0)
+ to_remove = 0;
+
+ // multiply by lost bytes per call
+ Vector<int> permute;
+ for (int i = 0; i < _nsubrs; i++)
+ permute.push_back(i);
+
+ // sort them by least frequent use -> most frequent use
+ sort_keys = &_cost;
+ qsort(&permute[0], _nsubrs, sizeof(int), sort_permute_compare);
+
+ // mark first portion of `permute' to be removed
+ int removed = 0;
+ for (int i = 0; i < _nsubrs; i++) {
+ int p = permute[i];
+ if (_renumbering[p] == REMOVABLE && removed < to_remove) {
+ _renumbering[p] = DEAD;
+ removed++;
+ }
+ }
+
+ // renumber the rest
+ int renumber_pos = 0;
+ for (int i = 0; i < _nsubrs; i++)
+ if (_renumbering[i] == REMOVABLE) { // save it
+ while (_renumbering[renumber_pos] >= 0)
+ renumber_pos++;
+ _renumbering[i] = renumber_pos++;
+ }
+ SubrExpander rem0;
+ rem0.set_renumbering(&_renumbering);
+
+ // go through and change them all
+ for (int i = 0; i < _nsubrs; i++) {
+ Type1Subr *s = _font->subr_x(i);
+ if (s && _renumbering[i] >= 0)
+ rem0.run(_font, s->t1cs());
+ }
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ rem0.run(_font, g->t1cs());
+
+ // actually remove subroutines
+ _font->renumber_subrs(_renumbering);
+
+ return true;
+}
diff --git a/Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.hh b/Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.hh
new file mode 100644
index 00000000000..238f93dc630
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/mmpfb/t1rewrit.hh
@@ -0,0 +1,68 @@
+#ifndef T1REWRIT_HH
+#define T1REWRIT_HH
+#include <efont/t1interp.hh>
+#include <efont/t1font.hh>
+#include <lcdf/straccum.hh>
+
+class Type1MMRemover { public:
+
+ Type1MMRemover(Efont::Type1Font *, const Vector<double> &weight_vec, int, ErrorHandler *);
+ ~Type1MMRemover();
+
+ Efont::CharstringProgram *program() const { return _font; }
+ const Vector<double> &weight_vector() const { return _weight_vector; }
+ int nmasters() const { return _weight_vector.size(); }
+ int precision() const { return _precision; }
+
+ Efont::Type1Charstring *subr_prefix(int);
+ Efont::Type1Charstring *subr_expander(int);
+
+ void run();
+
+ private:
+
+ Efont::Type1Font *_font;
+ Vector<double> _weight_vector;
+ int _precision;
+
+ int _nsubrs;
+ Vector<int> _subr_done;
+ Vector<Efont::Type1Charstring *> _subr_prefix;
+ Vector<int> _must_expand_subr;
+ Vector<int> _hint_replacement_subr;
+ bool _expand_all_subrs;
+
+ ErrorHandler *_errh;
+
+};
+
+
+class Type1SubrRemover { public:
+
+ Type1SubrRemover(Efont::Type1Font *, ErrorHandler *);
+ ~Type1SubrRemover();
+
+ Efont::CharstringProgram *program() const { return _font; }
+ ErrorHandler *errh() const { return _errh; }
+
+ int save_count() const { return _save_count; }
+
+ bool run(int);
+
+ private:
+
+ Efont::Type1Font *_font;
+
+ int _nsubrs;
+ enum { REMOVABLE = -1, DEAD = -2 };
+ Vector<int> _renumbering;
+ Vector<int> _cost;
+ int _save_count;
+ int _nonexist_count;
+
+ ErrorHandler *_errh;
+
+};
+
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otfinfo/Makefile.am b/Build/source/utils/lcdf-typetools/otfinfo/Makefile.am
new file mode 100644
index 00000000000..c1541be0c33
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otfinfo/Makefile.am
@@ -0,0 +1,16 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = otfinfo
+man_MANS = otfinfo.1
+
+otfinfo_SOURCES = \
+ otfinfo.cc
+
+otfinfo_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+otfinfo_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = otfinfo.1
diff --git a/Build/source/utils/lcdf-typetools/otfinfo/Makefile.in b/Build/source/utils/lcdf-typetools/otfinfo/Makefile.in
new file mode 100644
index 00000000000..eed8680df8a
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otfinfo/Makefile.in
@@ -0,0 +1,469 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(otfinfo_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = otfinfo$(EXEEXT)
+subdir = otfinfo
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_otfinfo_OBJECTS = otfinfo.$(OBJEXT)
+otfinfo_OBJECTS = $(am_otfinfo_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(otfinfo_SOURCES)
+DIST_SOURCES = $(otfinfo_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = otfinfo.1
+otfinfo_SOURCES = \
+ otfinfo.cc
+
+otfinfo_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+otfinfo_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = otfinfo.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign otfinfo/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign otfinfo/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+otfinfo$(EXEEXT): $(otfinfo_OBJECTS) $(otfinfo_DEPENDENCIES)
+ @rm -f otfinfo$(EXEEXT)
+ $(CXXLINK) $(otfinfo_LDFLAGS) $(otfinfo_OBJECTS) $(otfinfo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfinfo.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/otfinfo/otfinfo.1 b/Build/source/utils/lcdf-typetools/otfinfo/otfinfo.1
new file mode 100644
index 00000000000..e0bbcd10886
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otfinfo/otfinfo.1
@@ -0,0 +1,143 @@
+'\"t
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH OTFINFO 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+otfinfo \- report information about OpenType fonts
+.SH SYNOPSIS
+.B otfinfo
+\%[\fB-sfzpg\fR]
+\%[\fIFILE...\fR]
+'
+.SH DESCRIPTION
+.BR Otfinfo
+reports information about the named OpenType font
+.IR FILE s
+(or standard input, if no
+.IR FILE s
+are given). Results are printed to standard output. Each line is prefaced
+with the relevant
+.I FILE
+if more than one
+.I FILE
+was supplied.
+'
+.SH OPTIONS
+With long options, you need type only as many characters as will make the
+option unique.
+.SS Query options
+.PD 0
+.PD 0
+.TP 5
+.BR \-s ", " \-\-scripts
+Print supported scripts and language systems. The scripts are printed one
+per line, with human-readable descriptions; for example:
+.nf
+ cyrl Cyrillic
+ grek Greek
+ latn Latin
+ latn.TUR Latin/Turkish
+.fi
+'
+.Sp
+.TP 5
+.BR \-f ", " \-\-features
+Print GSUB and GPOS features supported by the selected script (see the
+.B \-\-script
+option below). The scripts are printed one per line, with human-readable
+descriptions; for example:
+.nf
+ aalt Access All Alternates
+ c2sc Small Capitals From Capitals
+ case Case-Sensitive Forms
+ cpsp Capital Spacing
+ \&...
+ zero Slashed Zero
+.fi
+'
+.Sp
+.TP 5
+.BR \-z ", " \-\-optical\-size
+Print optical size information. For example:
+.nf
+ design size 11 pt, size range (8.4 pt, 13 pt], subfamily ID 11, subfamily name Semibold Italic
+.fi
+'
+.Sp
+.TP 5
+.BR \-p ", " \-\-postscript\-name
+Print each font's PostScript name. For example:
+.nf
+ MinionPro-SemiboldItCapt
+.fi
+'
+.Sp
+.TP 5
+.BR \-g ", " \-\-glyphs
+Print the name of every glyph in each font, one per line. For example:
+.nf
+ \&.notdef
+ space
+ exclam
+ \&...
+ ncommaaccent.end
+ lje.alt
+.fi
+Works for PostScript-flavored OpenType fonts only.
+'
+.PD
+'
+'
+.SS Miscellaneous options
+'
+.PD 0
+.TP 5
+.BI \-\-script= "script\fR[.\fIlang\fR]"
+Select the script system
+.I script
+and language system
+.IR lang
+used to look up features by
+.BR \-\-features .
+Examples include "latn" (Latin script), "grek" (Greek script), and "yi.YIC"
+(Yi script with classic characters). If
+.I lang
+is not specified, otfinfo will use the default language system for that
+script. Defaults to "latn".
+'
+.Sp
+.TP 5
+.BR \-V ", " \-\-verbose
+Write progress messages to standard error.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M otftotfm 1
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+'
+.SH AUTHOR
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/lcdf-typetools/otfinfo/otfinfo.cc b/Build/source/utils/lcdf-typetools/otfinfo/otfinfo.cc
new file mode 100644
index 00000000000..05a49d4aea3
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otfinfo/otfinfo.cc
@@ -0,0 +1,485 @@
+/* otfinfo.cc -- driver for reporting information about OpenType fonts
+ *
+ * Copyright (c) 2003-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/otfgsub.hh>
+#include <efont/otfgpos.hh>
+#include <efont/otfname.hh>
+#include <efont/cff.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <algorithm>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define VERBOSE_OPT 304
+#define SCRIPT_OPT 305
+
+#define QUERY_SCRIPTS_OPT 320
+#define QUERY_FEATURES_OPT 321
+#define QUERY_OPTICAL_SIZE_OPT 322
+#define QUERY_POSTSCRIPT_NAME_OPT 323
+#define QUERY_GLYPHS_OPT 324
+#define TABLES_OPT 325
+
+Clp_Option options[] = {
+
+ { "script", 0, SCRIPT_OPT, Clp_ArgString, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "verbose", 'V', VERBOSE_OPT, 0, Clp_Negate },
+ { "features", 'f', QUERY_FEATURES_OPT, 0, 0 },
+ { "scripts", 's', QUERY_SCRIPTS_OPT, 0, 0 },
+ { "optical-size", 'z', QUERY_OPTICAL_SIZE_OPT, 0, 0 },
+ { "postscript-name", 'p', QUERY_POSTSCRIPT_NAME_OPT, 0, 0 },
+ { "glyphs", 'g', QUERY_GLYPHS_OPT, 0, 0 },
+ { "tables", 0, TABLES_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+ // old synonyms
+ { "query-features", 0, QUERY_FEATURES_OPT, 0, 0 },
+ { "qf", 0, QUERY_FEATURES_OPT, 0, 0 },
+ { "query-scripts", 's', QUERY_SCRIPTS_OPT, 0, 0 },
+ { "qs", 0, QUERY_SCRIPTS_OPT, 0, 0 },
+ { "query-optical-size", 'z', QUERY_OPTICAL_SIZE_OPT, 0, 0 },
+ { "query-postscript-name", 'p', QUERY_POSTSCRIPT_NAME_OPT, 0, 0 },
+ { "query-glyphs", 'g', QUERY_GLYPHS_OPT, 0, 0 }
+
+};
+
+
+static const char *program_name;
+static String::Initializer initializer;
+
+static Efont::OpenType::Tag script, langsys;
+
+bool verbose = false;
+bool quiet = false;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'Otfinfo' reports information about an OpenType font to standard output.\n\
+Options specify what information to print.\n\
+\n\
+Usage: %s [-sfzpg] [OTFFILES...]\n\n",
+ program_name);
+ printf("\
+Query options:\n\
+ -s, --scripts Report font's supported scripts.\n\
+ -f, --features Report font's GSUB/GPOS features.\n\
+ -z, --optical-size Report font's optical size information.\n\
+ -p, --postscript-name Report font's PostScript name.\n\
+ -g, --glyphs Report font's glyph names.\n\
+\n\
+Other options:\n\
+ --script=SCRIPT[.LANG] Set script used for --features [latn].\n\
+ -V, --verbose Print progress information to standard error.\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n");
+}
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning = false)
+{
+ FILE *f;
+ if (!filename || filename == "-") {
+ filename = "<stdin>";
+ f = stdin;
+#if defined(_MSDOS) || defined(_WIN32)
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(filename.c_str(), "rb"))) {
+ errh->verror_text((warning ? errh->ERR_WARNING : errh->ERR_ERROR), filename, strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ while (!feof(f)) {
+ if (char *x = sa.reserve(8192)) {
+ int amt = fread(x, 1, 8192, f);
+ sa.forward(amt);
+ } else {
+ errh->verror_text((warning ? errh->ERR_WARNING : errh->ERR_ERROR), filename, "Out of memory!");
+ break;
+ }
+ }
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::stable_string("<stdin>");
+ else
+ return s;
+}
+
+static void
+collect_script_descriptions(const OpenType::ScriptList &script_list, Vector<String> &output, ErrorHandler *errh)
+{
+ Vector<OpenType::Tag> script, langsys;
+ script_list.language_systems(script, langsys, errh);
+ for (int i = 0; i < script.size(); i++) {
+ String what = script[i].text();
+ const char *s = script[i].script_description();
+ String where = (s ? s : "<unknown script>");
+ if (!langsys[i].null()) {
+ what += String(".") + langsys[i].text();
+ s = langsys[i].language_description();
+ where += String("/") + (s ? s : "<unknown language>");
+ }
+ if (what.length() < 8)
+ output.push_back(what + String("\t\t") + where);
+ else
+ output.push_back(what + String("\t") + where);
+ }
+}
+
+static void
+do_query_scripts(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ Vector<String> results;
+ if (String gsub_table = otf.table("GSUB")) {
+ OpenType::Gsub gsub(gsub_table, &otf, errh);
+ collect_script_descriptions(gsub.script_list(), results, errh);
+ }
+ if (String gpos_table = otf.table("GPOS")) {
+ OpenType::Gpos gpos(gpos_table, errh);
+ collect_script_descriptions(gpos.script_list(), results, errh);
+ }
+
+ if (results.size()) {
+ std::sort(results.begin(), results.end());
+ String *unique_result = std::unique(results.begin(), results.end());
+ for (String *sp = results.begin(); sp < unique_result; sp++)
+ result_errh->message("%s", sp->c_str());
+ }
+}
+
+static void
+collect_feature_descriptions(const OpenType::ScriptList &script_list, const OpenType::FeatureList &feature_list, Vector<String> &output, ErrorHandler *errh)
+{
+ int required_fid;
+ Vector<int> fids;
+ // collect features applying to this script
+ script_list.features(script, langsys, required_fid, fids, errh);
+ for (int i = -1; i < fids.size(); i++) {
+ int fid = (i < 0 ? required_fid : fids[i]);
+ if (fid >= 0) {
+ OpenType::Tag tag = feature_list.tag(fid);
+ const char *s = tag.feature_description();
+ output.push_back(tag.text() + String("\t") + (s ? s : "<unknown feature>"));
+ }
+ }
+}
+
+static void
+do_query_features(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ Vector<String> results;
+ if (String gsub_table = otf.table("GSUB")) {
+ OpenType::Gsub gsub(gsub_table, &otf, errh);
+ collect_feature_descriptions(gsub.script_list(), gsub.feature_list(), results, errh);
+ }
+ if (String gpos_table = otf.table("GPOS")) {
+ OpenType::Gpos gpos(gpos_table, errh);
+ collect_feature_descriptions(gpos.script_list(), gpos.feature_list(), results, errh);
+ }
+
+ if (results.size()) {
+ std::sort(results.begin(), results.end());
+ String *unique_result = std::unique(results.begin(), results.end());
+ for (String *sp = results.begin(); sp < unique_result; sp++)
+ result_errh->message("%s", sp->c_str());
+ }
+}
+
+static void
+do_query_optical_size(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ String gpos_table = otf.table("GPOS");
+ if (!gpos_table)
+ throw OpenType::Error();
+
+ OpenType::Gpos gpos(gpos_table, errh);
+ OpenType::Name name(otf.table("name"), errh);
+
+ // extract 'size' feature
+ int required_fid;
+ Vector<int> fids;
+ gpos.script_list().features(script, langsys, required_fid, fids, errh);
+
+ int size_fid = gpos.feature_list().find(OpenType::Tag("size"), fids);
+ if (size_fid < 0)
+ throw OpenType::Error();
+
+ // it looks like Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Data size_data = gpos.feature_list().params(size_fid, 10, errh, true);
+ if (!size_data.length())
+ throw OpenType::Error();
+
+ StringAccum sa;
+ sa << "design size " << (size_data.u16(0) / 10.) << " pt";
+ if (size_data.u16(2) != 0) {
+ sa << ", size range (" << (size_data.u16(6) / 10.) << " pt, "
+ << (size_data.u16(8) / 10.) << " pt], "
+ << "subfamily ID " << size_data.u16(2);
+ if (String n = name.name(std::find_if(name.begin(), name.end(), OpenType::Name::EnglishPlatformPred(size_data.u16(4)))))
+ sa << ", subfamily name " << n;
+ }
+
+ result_errh->message("%s", sa.c_str());
+
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("no optical size information");
+ }
+}
+
+static void
+do_query_postscript_name(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ String postscript_name = "no PostScript name information";
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok())
+ postscript_name = name.name(std::find_if(name.begin(), name.end(), OpenType::Name::EnglishPlatformPred(OpenType::Name::N_POSTSCRIPT)));
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", postscript_name.c_str());
+}
+
+static void
+do_query_glyphs(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ // get font
+ Cff cff(otf.table("CFF"), errh);
+ if (!cff.ok())
+ throw OpenType::Error();
+
+ Cff::FontParent *fp = cff.font(PermString(), errh);
+ if (!fp || !fp->ok())
+ throw OpenType::Error();
+ Cff::Font *font = dynamic_cast<Cff::Font *>(fp);
+ if (!font) {
+ errh->error("CID-keyed fonts not supported");
+ throw OpenType::Error();
+ }
+
+ // save glyph names
+ Vector<PermString> glyph_names;
+ font->glyph_names(glyph_names);
+ for (PermString* s = glyph_names.begin(); s < glyph_names.end(); s++)
+ result_errh->message("%s", s->c_str());
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("no glyph name information");
+ }
+}
+
+static void
+do_tables(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ int n = otf.ntables();
+
+ for (int i = 0; i < n; i++)
+ if (OpenType::Tag tag = otf.table_tag(i)) {
+ String s = otf.table(tag);
+ result_errh->message("%7u %s\n", s.length(), tag.text().c_str());
+ }
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("corrupted tables");
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ String::static_initialize();
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ Vector<const char *> input_files;
+ int query = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case SCRIPT_OPT: {
+ if (!script.null())
+ usage_error(errh, "--script already specified");
+ String arg = clp->arg;
+ int period = arg.find_left('.');
+ OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));
+ if (scr.valid() && period > 0) {
+ OpenType::Tag lang(arg.substring(period + 1));
+ if (lang.valid()) {
+ script = scr;
+ langsys = lang;
+ } else
+ usage_error(errh, "bad language tag");
+ } else if (scr.valid())
+ script = scr;
+ else
+ usage_error(errh, "bad script tag");
+ break;
+ }
+
+ case QUERY_SCRIPTS_OPT:
+ case QUERY_FEATURES_OPT:
+ case QUERY_OPTICAL_SIZE_OPT:
+ case QUERY_POSTSCRIPT_NAME_OPT:
+ case QUERY_GLYPHS_OPT:
+ case TABLES_OPT:
+ if (query)
+ usage_error(errh, "supply exactly one query type option");
+ query = opt;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = ErrorHandler::silent_handler();
+ break;
+
+ case VERBOSE_OPT:
+ verbose = !clp->negated;
+ break;
+
+ case VERSION_OPT:
+ printf("otfinfo (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2003-2005 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ input_files.push_back(clp->arg);
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (!query)
+ usage_error(errh, "supply exactly one --query option");
+ if (!input_files.size())
+ input_files.push_back("-");
+ if (script.null())
+ script = Efont::OpenType::Tag("latn");
+
+ FileErrorHandler stdout_errh(stdout);
+ for (const char **input_filep = input_files.begin(); input_filep != input_files.end(); input_filep++) {
+ int before_nerrors = errh->nerrors();
+ String font_data = read_file(*input_filep, errh);
+ if (errh->nerrors() != before_nerrors)
+ continue;
+
+ String input_file = printable_filename(*input_filep);
+ LandmarkErrorHandler cerrh(errh, input_file);
+ OpenType::Font otf(font_data, &cerrh);
+ if (!otf.ok())
+ continue;
+
+ PrefixErrorHandler stdout_cerrh(&stdout_errh, input_file + ":");
+ ErrorHandler *result_errh = (input_files.size() > 1 ? static_cast<ErrorHandler *>(&stdout_cerrh) : static_cast<ErrorHandler *>(&stdout_errh));
+ if (query == QUERY_SCRIPTS_OPT)
+ do_query_scripts(otf, &cerrh, result_errh);
+ else if (query == QUERY_FEATURES_OPT)
+ do_query_features(otf, &cerrh, result_errh);
+ else if (query == QUERY_OPTICAL_SIZE_OPT)
+ do_query_optical_size(otf, &cerrh, result_errh);
+ else if (query == QUERY_POSTSCRIPT_NAME_OPT)
+ do_query_postscript_name(otf, &cerrh, result_errh);
+ else if (query == QUERY_GLYPHS_OPT)
+ do_query_glyphs(otf, &cerrh, result_errh);
+ else if (query == TABLES_OPT)
+ do_tables(otf, &cerrh, result_errh);
+ }
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/Makefile.am b/Build/source/utils/lcdf-typetools/otftotfm/Makefile.am
new file mode 100644
index 00000000000..9f320107499
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/Makefile.am
@@ -0,0 +1,28 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = otftotfm
+man_MANS = otftotfm.1
+
+otftotfm_SOURCES = \
+ automatic.cc automatic.hh \
+ dvipsencoding.cc dvipsencoding.hh \
+ glyphfilter.cc glyphfilter.hh \
+ md5.c md5.h \
+ metrics.cc metrics.hh \
+ otftotfm.cc otftotfm.hh \
+ secondary.cc secondary.hh \
+ uniprop.cc uniprop.hh \
+ util.cc util.hh
+EXTRA_otftotfm_SOURCES = kpseinterface.c kpseinterface.h
+
+otftotfm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a @KPSEINTERFACE_O@ @LIBKPATHSEA@
+otftotfm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a @KPSEINTERFACE_O@ @LIBKPATHSEA_DEP@
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = otftotfm.1
+
+$(top_builddir)/../../texk/kpathsea/.libs/libkpathsea.a:
+ cd $(top_builddir)/../../texk/kpathsea && $(MAKE)
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/Makefile.in b/Build/source/utils/lcdf-typetools/otftotfm/Makefile.in
new file mode 100644
index 00000000000..e4f79adef3d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/Makefile.in
@@ -0,0 +1,511 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(otftotfm_SOURCES) $(EXTRA_otftotfm_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = otftotfm$(EXEEXT)
+subdir = otftotfm
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_otftotfm_OBJECTS = automatic.$(OBJEXT) dvipsencoding.$(OBJEXT) \
+ glyphfilter.$(OBJEXT) md5.$(OBJEXT) metrics.$(OBJEXT) \
+ otftotfm.$(OBJEXT) secondary.$(OBJEXT) uniprop.$(OBJEXT) \
+ util.$(OBJEXT)
+otftotfm_OBJECTS = $(am_otftotfm_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(otftotfm_SOURCES) $(EXTRA_otftotfm_SOURCES)
+DIST_SOURCES = $(otftotfm_SOURCES) $(EXTRA_otftotfm_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = otftotfm.1
+otftotfm_SOURCES = \
+ automatic.cc automatic.hh \
+ dvipsencoding.cc dvipsencoding.hh \
+ glyphfilter.cc glyphfilter.hh \
+ md5.c md5.h \
+ metrics.cc metrics.hh \
+ otftotfm.cc otftotfm.hh \
+ secondary.cc secondary.hh \
+ uniprop.cc uniprop.hh \
+ util.cc util.hh
+
+EXTRA_otftotfm_SOURCES = kpseinterface.c kpseinterface.h
+otftotfm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a @KPSEINTERFACE_O@ @LIBKPATHSEA@
+otftotfm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a @KPSEINTERFACE_O@ @LIBKPATHSEA_DEP@
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = otftotfm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign otftotfm/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign otftotfm/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+otftotfm$(EXEEXT): $(otftotfm_OBJECTS) $(otftotfm_DEPENDENCIES)
+ @rm -f otftotfm$(EXEEXT)
+ $(CXXLINK) $(otftotfm_LDFLAGS) $(otftotfm_OBJECTS) $(otftotfm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/automatic.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvipsencoding.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glyphfilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpseinterface.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metrics.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otftotfm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secondary.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniprop.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+
+$(top_builddir)/../../texk/kpathsea/.libs/libkpathsea.a:
+ cd $(top_builddir)/../../texk/kpathsea && $(MAKE)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/automatic.cc b/Build/source/utils/lcdf-typetools/otftotfm/automatic.cc
new file mode 100644
index 00000000000..5bc10511bf4
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/automatic.cc
@@ -0,0 +1,652 @@
+/* automatic.{cc,hh} -- code for automatic mode and interfacing with kpathsea
+ *
+ * Copyright (c) 2003-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#include <config.h>
+#include "automatic.hh"
+#include "kpseinterface.h"
+#include "util.hh"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#include <algorithm>
+
+#ifdef WIN32
+# define mkdir(dir, access) mkdir(dir)
+#endif
+
+#if HAVE_AUTO_T1DOTLESSJ
+enum { T1DOTLESSJ_EXIT_J_NODOT = 2 };
+#endif
+
+static String::Initializer initializer;
+static String odir[NUMODIR];
+static String typeface;
+static String vendor;
+static String map_file;
+#define DEFAULT_VENDOR "lcdftools"
+#define DEFAULT_TYPEFACE "unknown"
+
+static const struct {
+ const char *name;
+ const char *envvar;
+ const char *texdir;
+} odir_info[] = {
+ { "encoding", "ENCODINGDESTDIR", "#fonts/enc/dvips/@#dvips/@" },
+ { "TFM", "TFMDESTDIR", "fonts/tfm/%" },
+ { "PL", "PLDESTDIR", "fonts/pl/%" },
+ { "VF", "VFDESTDIR", "fonts/vf/%" },
+ { "VPL", "VPLDESTDIR", "fonts/vpl/%" },
+ { "Type 1", "T1DESTDIR", "fonts/type1/%" },
+ { "DVIPS map", "DVIPS directory", "#fonts/map/dvips/@#dvips/@" },
+ { "DVIPS updmap", "DVIPS directory", "dvips" }
+};
+
+#if HAVE_KPATHSEA
+static String odir_kpathsea[NUMODIR];
+
+static bool writable_texdir_tried = false;
+static String writable_texdir; // always ends with directory separator
+static int tds_1_1 = -1;
+
+static bool mktexupd_tried = false;
+static String mktexupd;
+
+static String
+kpsei_string(char* x)
+{
+ String s(x);
+ free((void*)x);
+ return s;
+}
+
+static void
+look_for_writable_texdir(const char *path_variable, bool create)
+{
+ String path = kpsei_string(kpsei_path_expand(path_variable));
+ while (path && !writable_texdir) {
+ const char* colon = std::find(path.begin(), path.end(), kpsei_env_sep_char);
+ String texdir = path.substring(path.begin(), colon);
+ path = path.substring(colon + 1, path.end());
+ if (access(texdir.c_str(), W_OK) >= 0)
+ writable_texdir = texdir;
+ else if (create && errno != EACCES && mkdir(texdir.c_str(), 0777) >= 0)
+ // create file if it doesn't exist already
+ writable_texdir = texdir;
+ }
+ if (writable_texdir && writable_texdir.back() != '/')
+ writable_texdir += "/";
+}
+
+static void
+find_writable_texdir(ErrorHandler *errh, const char *)
+{
+ look_for_writable_texdir("$TEXMFVAR", true);
+ if (!writable_texdir)
+ look_for_writable_texdir("$VARTEXMF", false);
+ if (!writable_texdir)
+ look_for_writable_texdir("$TEXMF", false);
+ if (!writable_texdir) {
+ errh->warning("no writable directory found in $TEXMFVAR or $TEXMF");
+ errh->message("(You probably need to set your TEXMF environment variable; see\n\
+the manual for more information. The current TEXMF path is\n\
+'%s'.)", kpsei_string(kpsei_path_expand("$TEXMF")).c_str());
+ }
+ writable_texdir_tried = true;
+}
+
+static String
+get_vendor()
+{
+ return (vendor ? vendor : String(DEFAULT_VENDOR));
+}
+
+static String
+get_typeface()
+{
+ return (typeface ? typeface : String(DEFAULT_TYPEFACE));
+}
+#endif
+
+bool
+set_vendor(const String &s)
+{
+ bool had = (bool) vendor;
+ vendor = s;
+ return !had;
+}
+
+bool
+set_typeface(const String &s, bool override)
+{
+ bool had = (bool) typeface;
+ if (!had || override)
+ typeface = s;
+ return !had;
+}
+
+String
+getodir(int o, ErrorHandler *errh)
+{
+ assert(o >= 0 && o < NUMODIR);
+
+ if (!odir[o] && automatic && odir_info[o].envvar)
+ odir[o] = getenv(odir_info[o].envvar);
+
+#ifdef HAVE_KPATHSEA
+ if (!odir[o] && automatic && !writable_texdir_tried)
+ find_writable_texdir(errh, odir_info[o].name);
+
+ if (!odir[o] && automatic && writable_texdir) {
+ String suffix = odir_info[o].texdir;
+
+ // May need to behave differently on TDS 1.1 rather than TDS 1.0.
+ if (suffix[0] == '#') {
+ // check type of TDS
+ if (tds_1_1 < 0) {
+ // using a procedure suggested by Olaf Weber
+ String encfonts = kpsei_string(kpsei_path_expand("$TEXMFMAIN/fonts/enc"));
+ if (!encfonts)
+ encfonts = kpsei_string(kpsei_path_expand("$TEXMFDIST/fonts/enc"));
+ tds_1_1 = (encfonts != String());
+ }
+ if (tds_1_1 == 0)
+ suffix = suffix.substring(std::find(suffix.begin() + 1, suffix.end(), '#') + 1, suffix.end());
+ else
+ suffix = suffix.substring(suffix.begin() + 1, std::find(suffix.begin() + 1, suffix.end(), '#'));
+ }
+
+ String dir = writable_texdir + suffix;
+
+ if (dir.back() == '%')
+ dir = dir.substring(0, -1) + get_vendor() + "/" + get_typeface();
+ else if (dir.back() == '@')
+ dir = dir.substring(0, -1) + get_vendor();
+
+ // create parent directories as appropriate
+ int slash = writable_texdir.length() - 1;
+ while (access(dir.c_str(), F_OK) < 0 && slash < dir.length()) {
+ if ((slash = dir.find_left('/', slash + 1)) < 0)
+ slash = dir.length();
+ String subdir = dir.substring(0, slash);
+ if (access(subdir.c_str(), F_OK) < 0
+ && !no_create
+ && mkdir(subdir.c_str(), 0777) < 0)
+ goto kpathsea_done;
+ }
+
+ // that's our answer
+ odir[o] = dir;
+ odir_kpathsea[o] = dir;
+ }
+ kpathsea_done:
+#endif
+
+ if (!odir[o]) {
+ if (automatic)
+ errh->warning("%s not specified, placing %s files in '.'", odir_info[o].envvar, odir_info[o].name);
+ odir[o] = ".";
+ }
+
+ while (odir[o].length() && odir[o].back() == '/')
+ odir[o] = odir[o].substring(0, -1);
+
+ if (verbose)
+ errh->message("placing %s files in '%s'", odir_info[o].name, odir[o].c_str());
+ return odir[o];
+}
+
+bool
+setodir(int o, const String &value)
+{
+ assert(o >= 0 && o < NUMODIR);
+ bool had = (bool) odir[o];
+ odir[o] = value;
+ return !had;
+}
+
+const char *
+odirname(int o)
+{
+ assert(o >= 0 && o < NUMODIR);
+ return odir_info[o].name;
+}
+
+#if HAVE_KPATHSEA
+static bool
+file_in_kpathsea_odir(int o, const String &file)
+{
+ return odir_kpathsea[o]
+ && file.length() > odir[o].length()
+ && memcmp(file.data(), odir[o].data(), odir[o].length()) == 0
+ && file[odir[o].length()] == '/';
+}
+#endif
+
+void
+update_odir(int o, String file, ErrorHandler *errh)
+{
+ assert(o >= 0 && o < NUMODIR);
+#if HAVE_KPATHSEA
+ if (file.find_left('/') < 0)
+ file = odir[o] + "/" + file;
+
+ // exit if this directory was not found via kpathsea, or the file is not
+ // in the kpathsea directory
+ if (!file_in_kpathsea_odir(o, file))
+ return;
+
+ assert(writable_texdir && writable_texdir.length() <= odir[o].length()
+ && memcmp(file.data(), writable_texdir.data(), writable_texdir.length()) == 0);
+
+ // divide the filename into portions
+ // file == writable_texdir + directory + file
+ file = file.substring(writable_texdir.length());
+ while (file && file[0] == '/')
+ file = file.substring(1);
+ int last_slash = file.find_right('/');
+ String directory = (last_slash >= 0 ? file.substring(0, last_slash) : String());
+ file = file.substring(last_slash >= 0 ? last_slash + 1 : 0);
+ if (!file) // no filename to update
+ return;
+
+ // return if nocreate
+ if (no_create) {
+ errh->message("would update %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
+ return;
+ } else if (verbose)
+ errh->message("updating %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
+
+ // try to update ls-R ourselves, rather than running mktexupd --
+ // mktexupd's runtime is painful: a half second to update a file
+ String ls_r = writable_texdir + "ls-R";
+ bool success = false;
+ if (access(ls_r.c_str(), R_OK) >= 0) // make sure it already exists
+ if (FILE *f = fopen(ls_r.c_str(), "a")) {
+ fprintf(f, "./%s:\n%s\n", directory.c_str(), file.c_str());
+ success = true;
+ fclose(f);
+ }
+
+ // otherwise, run mktexupd
+ if (!success && writable_texdir.find_left('\'') < 0 && directory.find_left('\'') < 0 && file.find_left('\'') < 0) {
+ // look for mktexupd script
+ if (!mktexupd_tried) {
+ mktexupd = kpsei_string(kpsei_find_file("mktexupd", KPSEI_FMT_WEB2C));
+ mktexupd_tried = true;
+ }
+
+ // run script
+ if (mktexupd) {
+ String command = mktexupd + " " + shell_quote(writable_texdir + directory) + " " + shell_quote(file);
+ int retval = system(command.c_str());
+ if (retval == 127)
+ errh->error("could not run '%s'", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run '%s': %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("'%s' failed", command.c_str());
+ }
+ }
+#else
+ (void) file, (void) errh;
+#endif
+}
+
+bool
+set_map_file(const String &s)
+{
+ bool had = (bool) map_file;
+ map_file = s;
+ return !had;
+}
+
+String
+installed_type1(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh)
+{
+ if (!ps_fontname)
+ return String();
+
+#if HAVE_KPATHSEA
+# if HAVE_AUTO_CFFTOT1
+ if (!(force && allow_generate && otf_filename && otf_filename != "-" && getodir(O_TYPE1, errh))) {
+# endif
+ // look for .pfb and .pfa
+ String file, path;
+ if ((file = ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
+ || (file = ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
+ if (verbose)
+ errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+# if HAVE_AUTO_CFFTOT1
+ }
+# endif
+#endif
+
+#if HAVE_AUTO_CFFTOT1
+ // if not found, and can generate on the fly, run cfftot1
+ if (allow_generate && otf_filename && otf_filename != "-" && getodir(O_TYPE1, errh)) {
+ String pfb_filename = odir[O_TYPE1] + "/" + ps_fontname + ".pfb";
+ if (pfb_filename.find_left('\'') >= 0 || otf_filename.find_left('\'') >= 0)
+ return String();
+ String command = "cfftot1 " + shell_quote(otf_filename) + " -n " + shell_quote(ps_fontname) + " " + shell_quote(pfb_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run '%s'", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run '%s': %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("'%s' failed", command.c_str());
+ if (retval == 0) {
+ update_odir(O_TYPE1, pfb_filename, errh);
+ return pfb_filename;
+ }
+ }
+#endif
+
+ return String();
+}
+
+String
+installed_type1_dotlessj(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh)
+{
+ if (!ps_fontname)
+ return String();
+ if (verbose)
+ errh->message("searching for dotless-j font for %s", ps_fontname.c_str());
+
+ String j_ps_fontname = ps_fontname + "LCDFJ";
+
+#if HAVE_KPATHSEA
+# if HAVE_AUTO_T1DOTLESSJ
+ if (!(force && allow_generate && getodir(O_TYPE1, errh))) {
+# endif
+ // look for existing .pfb or .pfa
+ String file, path;
+ if ((file = j_ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
+ || (file = j_ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
+ if (verbose)
+ errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+# if HAVE_AUTO_T1DOTLESSJ
+ }
+# endif
+#endif
+
+#if HAVE_AUTO_T1DOTLESSJ
+ // if not found, and can generate on the fly, try running t1dotlessj
+ if (allow_generate && getodir(O_TYPE1, errh)) {
+ if (String base_filename = installed_type1(otf_filename, ps_fontname, allow_generate, errh)) {
+ String pfb_filename = odir[O_TYPE1] + "/" + j_ps_fontname + ".pfb";
+ if (pfb_filename.find_left('\'') >= 0 || base_filename.find_left('\'') >= 0)
+ return String();
+ String command = "t1dotlessj " + shell_quote(base_filename) + " -n " + shell_quote(j_ps_fontname) + " " + shell_quote(pfb_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->warning("could not run '%s'", command.c_str());
+ else if (retval < 0)
+ errh->warning("could not run '%s': %s", command.c_str(), strerror(errno));
+ else if (WEXITSTATUS(retval) == T1DOTLESSJ_EXIT_J_NODOT)
+ return String("\0", 1);
+ else if (retval != 0)
+ errh->warning("'%s' failed (%d)", command.c_str(), retval);
+ if (retval == 0) {
+ update_odir(O_TYPE1, pfb_filename, errh);
+ return pfb_filename;
+ } else
+ errh->warning("output font will not contain a dotless-j character");
+ }
+ }
+#endif
+
+ return String();
+}
+
+int
+update_autofont_map(const String &fontname, String mapline, ErrorHandler *errh)
+{
+#if HAVE_KPATHSEA
+ if (automatic && !map_file && getodir(O_MAP, errh))
+ map_file = odir[O_MAP] + "/" + get_vendor() + ".map";
+#endif
+
+ if (map_file == "" || map_file == "-")
+ fputs(mapline.c_str(), stdout);
+ else {
+ // report no_create/verbose
+ if (no_create) {
+ errh->message("would update %s for %s", map_file.c_str(), String(fontname).c_str());
+ return 0;
+ } else if (verbose)
+ errh->message("updating %s for %s", map_file.c_str(), String(fontname).c_str());
+
+ int fd = open(map_file.c_str(), O_RDWR | O_CREAT, 0666);
+ if (fd < 0)
+ return errh->error("%s: %s", map_file.c_str(), strerror(errno));
+ FILE *f = fdopen(fd, "r+");
+ // NB: also change encoding logic if you change this code
+
+#if defined(F_SETLKW) && defined(HAVE_FTRUNCATE)
+ {
+ struct flock lock;
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = 0;
+ lock.l_len = 0;
+ int result;
+ while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
+ /* try again */;
+ if (result < 0) {
+ result = errno;
+ fclose(f);
+ return errh->error("locking %s: %s", map_file.c_str(), strerror(result));
+ }
+ }
+#endif
+
+ // read old data from map file
+ StringAccum sa;
+ while (!feof(f))
+ if (char *x = sa.reserve(8192)) {
+ int amt = fread(x, 1, 8192, f);
+ sa.forward(amt);
+ } else {
+ fclose(f);
+ return errh->error("Out of memory!");
+ }
+ String text = sa.take_string();
+
+ // add comment if necessary
+ bool created = (!text);
+ if (created)
+ text = "% Automatically maintained by otftotfm or other programs. Do not edit.\n\n";
+ if (text.back() != '\n')
+ text += "\n";
+
+ // append old encodings
+ int fl = 0;
+ int nl = text.find_left('\n') + 1;
+ bool changed = created;
+ while (fl < text.length()) {
+ if (fl + fontname.length() + 1 < nl
+ && memcmp(text.data() + fl, fontname.data(), fontname.length()) == 0
+ && text[fl + fontname.length()] == ' ') {
+ // found the old name
+ if (text.substring(fl, nl - fl) == mapline) {
+ // duplicate of old name, don't change it
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", map_file.c_str());
+ return 0;
+ } else {
+ text = text.substring(0, fl) + text.substring(nl);
+ nl = fl;
+ changed = true;
+ }
+ }
+ fl = nl;
+ nl = text.find_left('\n', fl) + 1;
+ }
+
+ // special case: empty mapline, unchanged file
+ if (!mapline && !changed) {
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", map_file.c_str());
+ return 0;
+ }
+
+ // add our text
+ text += mapline;
+
+ // rewind file
+#ifdef HAVE_FTRUNCATE
+ rewind(f);
+ ftruncate(fd, 0);
+#else
+ fclose(f);
+ f = fopen(map_file.c_str(), "w");
+#endif
+
+ // write data
+ fwrite(text.data(), 1, text.length(), f);
+
+ fclose(f);
+
+ // inform about the new file if necessary
+ if (created)
+ update_odir(O_MAP, map_file, errh);
+
+#if HAVE_KPATHSEA && !WIN32
+ // run 'updmap' if present
+ String updmap_dir, updmap_file;
+ if (automatic && (output_flags & G_UPDMAP))
+ updmap_dir = getodir(O_MAP_PARENT, errh);
+ if (updmap_dir && (updmap_file = updmap_dir + "/updmap")
+ && access(updmap_file.c_str(), X_OK) >= 0) {
+ // want to run 'updmap' from its directory, can't use system()
+ if (verbose)
+ errh->message("running %s", updmap_file.c_str());
+
+ pid_t child = fork();
+ if (child < 0)
+ errh->fatal("%s during fork", strerror(errno));
+ else if (child == 0) {
+ // change to updmap directory, run it
+ if (chdir(updmap_dir.c_str()) < 0)
+ errh->fatal("%s: %s during chdir", updmap_dir.c_str(), strerror(errno));
+ if (execl("./updmap", updmap_file.c_str(), (const char*) 0) < 0)
+ errh->fatal("%s: %s during exec", updmap_file.c_str(), strerror(errno));
+ exit(1); // should never get here
+ }
+
+# if HAVE_WAITPID
+ // wait for updmap to finish
+ int status;
+ while (1) {
+ pid_t answer = waitpid(child, &status, 0);
+ if (answer >= 0)
+ break;
+ else if (errno != EINTR)
+ errh->fatal("%s during wait", strerror(errno));
+ }
+ if (!WIFEXITED(status))
+ errh->warning("%s exited abnormally", updmap_file.c_str());
+ else if (WEXITSTATUS(status) != 0)
+ errh->warning("%s exited with status %d", updmap_file.c_str(), WEXITSTATUS(status));
+# else
+# error "need waitpid() support: report this bug to the maintainer"
+# endif
+ goto ran_updmap;
+ }
+
+# if HAVE_AUTO_UPDMAP
+ // run system updmap
+ if (output_flags & G_UPDMAP) {
+ String filename = map_file;
+ int slash = filename.find_right('\'');
+ if (slash >= 0)
+ filename = filename.substring(slash + 1);
+ String command = "updmap --nomkmap --enable Map " + shell_quote(filename) + "; updmap";
+ if (verbose)
+ command += " 1>&2";
+ else
+ command += " >/dev/null 2>&1";
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->warning("could not run '%s'", command.c_str());
+ else if (retval < 0)
+ errh->warning("could not run '%s': %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->warning("'%s' exited with status %d;\nrun it manually to check for errors", command.c_str(), WEXITSTATUS(retval));
+ goto ran_updmap;
+ }
+# endif
+
+ if (verbose)
+ errh->message("not running updmap");
+
+ ran_updmap: ;
+#endif
+ }
+
+ return 0;
+}
+
+String
+locate_encoding(String encfile, ErrorHandler *errh, bool literal)
+{
+ if (!encfile || encfile == "-")
+ return encfile;
+
+ if (!literal) {
+ int slash = encfile.find_right('/');
+ int dot = encfile.find_left('.', slash >= 0 ? slash : 0);
+ if (dot < 0)
+ if (String file = locate_encoding(encfile + ".enc", errh, true))
+ return file;
+ }
+
+#if HAVE_KPATHSEA
+ if (String file = kpsei_string(kpsei_find_file(encfile.c_str(), KPSEI_FMT_ENCODING))) {
+ if (verbose)
+ errh->message("encoding file %s found with kpathsea at %s", encfile.c_str(), file.c_str());
+ return file;
+ } else if (verbose)
+ errh->message("encoding file %s not found with kpathsea", encfile.c_str());
+#endif
+
+ if (access(encfile.c_str(), R_OK) >= 0)
+ return encfile;
+ else
+ return String();
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/automatic.hh b/Build/source/utils/lcdf-typetools/otftotfm/automatic.hh
new file mode 100644
index 00000000000..944b68dd6d3
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/automatic.hh
@@ -0,0 +1,23 @@
+#ifndef OTFTOTFM_AUTOMATIC_HH
+#define OTFTOTFM_AUTOMATIC_HH
+#include <lcdf/string.hh>
+class ErrorHandler;
+
+enum { O_ENCODING = 0, O_TFM, O_PL, O_VF, O_VPL, O_TYPE1, O_MAP, O_MAP_PARENT,
+ NUMODIR };
+
+extern bool automatic;
+extern bool no_create;
+String getodir(int o, ErrorHandler *);
+bool setodir(int o, const String &);
+bool set_vendor(const String &);
+bool set_typeface(const String &, bool override);
+bool set_map_file(const String &);
+const char *odirname(int o);
+void update_odir(int o, String file, ErrorHandler *);
+String installed_type1(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *);
+String installed_type1_dotlessj(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *);
+int update_autofont_map(const String &fontname, String mapline, ErrorHandler *);
+String locate_encoding(String encfile, ErrorHandler *, bool literal = false);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.cc b/Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.cc
new file mode 100644
index 00000000000..e85dff13419
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.cc
@@ -0,0 +1,795 @@
+/* dvipsencoding.{cc,hh} -- store a DVIPS encoding
+ *
+ * Copyright (c) 2003-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "dvipsencoding.hh"
+#include "metrics.hh"
+#include "secondary.hh"
+#include <lcdf/error.hh>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <algorithm>
+#include "util.hh"
+
+static String::Initializer initializer;
+enum { GLYPHLIST_MORE = 0x40000000, U_EMPTYSLOT = 0xD801 };
+static HashMap<String, int> glyphlist(-1);
+static PermString::Initializer perm_initializer;
+PermString DvipsEncoding::dot_notdef(".notdef");
+
+#define NEXT_GLYPH_NAME(gn) ("/" + (gn))
+
+int
+DvipsEncoding::parse_glyphlist(String text)
+{
+ // XXX ignores glyph names that map to multiple characters
+ glyphlist.clear();
+ const char *data = text.c_str();
+ int pos = 0, len = text.length();
+ while (1) {
+ // move to first nonblank
+ while (pos < len && isspace(data[pos]))
+ pos++;
+ // parse line
+ if (pos >= len)
+ return 0;
+ else if (data[pos] != '#') {
+ int first = pos;
+ for (; pos < len && !isspace(data[pos]) && data[pos] != ';'; pos++)
+ /* nada */;
+ String glyph_name = text.substring(first, pos - first);
+ int value;
+ char *next;
+ read_uni:
+ if (first == pos
+ || pos + 1 >= len
+ || data[pos] != ';'
+ || !isxdigit(data[pos+1])
+ || ((value = strtol(data + pos + 1, &next, 16)),
+ (!isspace(*next) && *next && *next != ';')))
+ return -1;
+ while (*next == ' ' || *next == '\t')
+ next++;
+ if (*next == '\r' || *next == '\n')
+ glyphlist.insert(glyph_name, value);
+ else if (*next == ';')
+ glyphlist.insert(glyph_name, value | GLYPHLIST_MORE);
+ else
+ while (*next != '\r' && *next != '\n' && *next != ';')
+ next++;
+ pos = next - data;
+ if (*next == ';') { // read another possibility
+ glyph_name = NEXT_GLYPH_NAME(glyph_name);
+ // XXX given "DDDD;EEEE EEEE;FFFF", will not store "FFFF"
+ goto read_uni;
+ }
+ } else
+ while (pos < len && data[pos] != '\n' && data[pos] != '\r')
+ pos++;
+ }
+}
+
+void
+DvipsEncoding::glyphname_unicode(String gn, Vector<int> &unis, bool *more)
+{
+ if (more)
+ *more = false;
+
+ // first, drop all characters to the right of the first dot
+ String::iterator dot = std::find(gn.begin(), gn.end(), '.');
+ if (dot < gn.end())
+ gn = gn.substring(gn.begin(), dot);
+
+ // then, separate into components
+ while (gn) {
+ String::iterator underscore = std::find(gn.begin(), gn.end(), '_');
+ String component = gn.substring(gn.begin(), underscore);
+ gn = gn.substring(underscore + 1, gn.end());
+
+ // check glyphlist
+ int value = glyphlist[component];
+ uint32_t uval;
+ if (value >= 0) {
+ unis.push_back(value & ~GLYPHLIST_MORE);
+ if (more && (value & GLYPHLIST_MORE) && !gn)
+ *more = true;
+ } else if (component.length() >= 7
+ && (component.length() % 4) == 3
+ && memcmp(component.data(), "uni", 3) == 0) {
+ int old_size = unis.size();
+ for (const char* s = component.begin() + 3; s < component.end(); s += 4)
+ if (parse_unicode_number(s, s + 4, -1, uval))
+ unis.push_back(uval);
+ else {
+ unis.resize(old_size);
+ break;
+ }
+ } else if (component.length() >= 5
+ && component.length() <= 7
+ && component[0] == 'u'
+ && parse_unicode_number(component.begin() + 1, component.end(), -1, uval))
+ unis.push_back(uval);
+ }
+}
+
+int
+DvipsEncoding::glyphname_unicode(const String &gn, bool *more)
+{
+ Vector<int> unis;
+ glyphname_unicode(gn, unis, more);
+ return (unis.size() == 1 ? unis[0] : -1);
+}
+
+
+DvipsEncoding::DvipsEncoding()
+ : _boundary_char(-1), _altselector_char(-1), _unicoding_map(-1)
+{
+}
+
+void
+DvipsEncoding::encode(int e, PermString what)
+{
+ if (e >= _e.size())
+ _e.resize(e + 1, dot_notdef);
+ _e[e] = what;
+}
+
+int
+DvipsEncoding::encoding_of(PermString what, bool encoding_required)
+{
+ int slot = -1;
+ for (int i = 0; i < _e.size(); i++)
+ if (_e[i] == what) {
+ slot = i;
+ goto use_slot;
+ } else if (!_e[i] || _e[i] == dot_notdef)
+ slot = i;
+ if (what == "||")
+ return _boundary_char;
+ else if (!encoding_required || slot < 0)
+ return -1;
+ use_slot:
+ if (encoding_required) {
+ if (slot >= _encoding_required.size())
+ _encoding_required.resize(slot + 1, false);
+ _encoding_required[slot] = true;
+ this->encode(slot, what);
+ }
+ return slot;
+}
+
+static String
+tokenize(const String &s, int &pos_in, int &line)
+{
+ const char *data = s.data();
+ int len = s.length();
+ int pos = pos_in;
+ while (1) {
+ // skip whitespace
+ while (pos < len && isspace(data[pos])) {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ } else if (data[pos] == '[' || data[pos] == ']' || data[pos] == '{' || data[pos] == '}') {
+ pos_in = pos + 1;
+ return s.substring(pos, 1);
+ } else if (data[pos] == '(') {
+ int first = pos, nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ pos_in = (pos < len ? pos + 1 : len);
+ return s.substring(first, pos_in - first);
+ } else {
+ int first = pos;
+ while (pos < len && data[pos] == '/')
+ pos++;
+ while (pos < len && data[pos] != '/' && !isspace(data[pos]) && data[pos] != '[' && data[pos] != ']' && data[pos] != '%' && data[pos] != '(' && data[pos] != '{' && data[pos] != '}')
+ pos++;
+ pos_in = pos;
+ return s.substring(first, pos - first);
+ }
+ }
+}
+
+
+static String
+comment_tokenize(const String &s, int &pos_in, int &line)
+{
+ const char *data = s.data();
+ int len = s.length();
+ int pos = pos_in;
+ while (1) {
+ while (pos < len && data[pos] != '%' && data[pos] != '(') {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && (data[pos] == ' ' || data[pos] == '\t'); pos++)
+ /* nada */;
+ int first = pos;
+ for (; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ pos_in = pos;
+ if (pos > first)
+ return s.substring(first, pos - first);
+ } else {
+ int nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ }
+ }
+}
+
+
+static struct { const char *s; int v; } ligkern_ops[] = {
+ { "=:", DvipsEncoding::JL_LIG }, { "|=:", DvipsEncoding::JL_CLIG },
+ { "|=:>", DvipsEncoding::JL_CLIG_S }, { "=:|", DvipsEncoding::JL_LIGC },
+ { "=:|>", DvipsEncoding::JL_LIGC_S }, { "|=:|", DvipsEncoding::JL_CLIGC },
+ { "|=:>", DvipsEncoding::JL_CLIGC_S }, { "|=:|>>", DvipsEncoding::JL_CLIGC_SS },
+ { "{}", DvipsEncoding::JT_KERN }, { "{K}", DvipsEncoding::JT_KERN },
+ { "{L}", DvipsEncoding::JT_LIG }, { "{LK}", DvipsEncoding::JT_NOLIGKERN },
+ { "{KL}", DvipsEncoding::JT_NOLIGKERN }, { "{k}", DvipsEncoding::JT_KERN },
+ { "{l}", DvipsEncoding::JT_LIG }, { "{lk}", DvipsEncoding::JT_NOLIGKERN },
+ { "{kl}", DvipsEncoding::JT_NOLIGKERN },
+ // some encodings have @{@} instead of {}
+ { "@{@}", DvipsEncoding::JT_KERN },
+ { 0, 0 }
+};
+
+static int
+find_ligkern_op(const String &s)
+{
+ for (int i = 0; ligkern_ops[i].s; i++)
+ if (ligkern_ops[i].s == s)
+ return ligkern_ops[i].v;
+ return 0;
+}
+
+inline bool
+operator==(const DvipsEncoding::Ligature& l1, const DvipsEncoding::Ligature& l2)
+{
+ return l1.c1 == l2.c1 && l1.c2 == l2.c2;
+}
+
+void
+DvipsEncoding::add_ligkern(const Ligature &l, int override)
+{
+ Ligature *old = std::find(_lig.begin(), _lig.end(), l);
+ if (old == _lig.end())
+ _lig.push_back(l);
+ else {
+ if ((l.join & JT_KERN) && (override > 0 || !(old->join & JT_KERN))) {
+ old->join |= JT_KERN;
+ old->k = l.k;
+ }
+ if ((l.join & JT_LIG) && (override > 0 || !(old->join & JT_LIG))) {
+ old->join = (old->join & JT_KERN) | (l.join & JT_LIGALL);
+ old->d = l.d;
+ }
+ }
+}
+
+int
+DvipsEncoding::parse_ligkern_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ _file_had_ligkern = true;
+ int op;
+ long l;
+ char *endptr;
+ if (v.size() == 3) {
+ // empty string fails
+ if (!v[0])
+ return -1;
+ // boundary char setting
+ if (v[0] == "||" && v[1] == "=") {
+ char *endptr;
+ if (override > 0 || _boundary_char < 0)
+ _boundary_char = strtol(v[2].c_str(), &endptr, 10);
+ if (*endptr == 0 && _boundary_char < _e.size())
+ return 0;
+ else
+ return errh->error("parse error in boundary character assignment");
+ }
+ // altselector char setting
+ if (v[0] == "^^" && v[1] == "=") {
+ char *endptr;
+ if (override > 0 || _altselector_char < 0)
+ _altselector_char = strtol(v[2].c_str(), &endptr, 10);
+ if (*endptr == 0 && _altselector_char < _e.size())
+ return 0;
+ else
+ return errh->error("parse error in altselector character assignment");
+ }
+ // encoding
+ l = strtol(v[0].c_str(), &endptr, 0);
+ if (endptr == v[0].end() && v[1] == "=") {
+ if (l >= 0 && l < 256) {
+ if (override > 0 || !_e[l])
+ encode(l, v[2]);
+ return 0;
+ } else
+ return errh->error("encoding value '%d' out of range", l);
+ }
+
+ // kern operation
+ if (v[1].length() >= 3 && v[1][0] == '{' && v[1].back() == '}') {
+ String middle = v[1].substring(1, v[1].length() - 2);
+ l = strtol(middle.c_str(), &endptr, 0);
+ if (endptr == middle.end()) {
+ op = JT_KERN;
+ goto found_kernop;
+ }
+ }
+ op = find_ligkern_op(v[1]);
+ if (!op || (op & JT_ADDLIG))
+ return -1;
+ found_kernop:
+ int av = (v[0] == "*" ? J_ALL : encoding_of(v[0]));
+ if (av < 0)
+ return errh->warning("'%s' has no encoding, ignoring '%s'", v[0].c_str(), v[1].c_str());
+ int bv = (v[2] == "*" ? J_ALL : encoding_of(v[2]));
+ if (bv < 0)
+ return errh->warning("'%s' has no encoding, ignoring '%s'", v[2].c_str(), v[1].c_str());
+ if ((op & JT_KERN) && l && (av == J_ALL || bv == J_ALL))
+ return errh->warning("'%s %s %s' illegal, only {0} works with *", v[0].c_str(), v[1].c_str(), v[2].c_str());
+ Ligature lig = { av, bv, op, l, 0 };
+ add_ligkern(lig, override);
+ return 0;
+
+ } else if (v.size() == 4 && ((op = find_ligkern_op(v[2])) & JT_ADDLIG)) {
+ int av = encoding_of(v[0], override > 0);
+ if (av < 0)
+ return (override > 0 ? errh->warning("'%s' has no encoding, ignoring ligature", v[0].c_str()) : -1);
+ int bv = encoding_of(v[1], override > 0);
+ if (bv < 0)
+ return (override > 0 ? errh->warning("'%s' has no encoding, ignoring ligature", v[1].c_str()) : -1);
+ int cv = encoding_of(v[3], override > 0);
+ if (cv < 0)
+ return (override > 0 ? errh->warning("'%s' has no encoding, ignoring ligature", v[3].c_str()) : -1);
+ Ligature lig = { av, bv, op, 0, cv };
+ add_ligkern(lig, override);
+ return 0;
+
+ } else
+ return errh->error("parse error in LIGKERN");
+}
+
+int
+DvipsEncoding::parse_position_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ if (v.size() != 4)
+ return errh->error("parse error in POSITION");
+
+ int c = encoding_of(v[0], override > 0);
+ if (c < 0)
+ return (override > 0 ? errh->warning("'%s' has no encoding, ignoring positioning", v[0].c_str()) : -1);
+
+ char *endptr;
+ int pdx, pdy, adx;
+ if (!v[1] || !v[2] || !v[3]
+ || (pdx = strtol(v[1].c_str(), &endptr, 10), *endptr)
+ || (pdy = strtol(v[2].c_str(), &endptr, 10), *endptr)
+ || (adx = strtol(v[3].c_str(), &endptr, 10), *endptr))
+ return errh->error("parse error in POSITION");
+
+ Ligature l = { c, pdx, pdy, adx, 0 };
+ Ligature *old = std::find(_pos.begin(), _pos.end(), l);
+ if (old == _pos.end())
+ _pos.push_back(l);
+ else if (override > 0)
+ *old = l;
+ return 0;
+}
+
+int
+DvipsEncoding::parse_unicoding_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ int av;
+ if (v.size() < 2 || (v[1] != "=" && v[1] != "=:" && v[1] != ":="))
+ return errh->error("parse error in UNICODING");
+ else if (v[0] == "||" || (av = encoding_of(v[0])) < 0)
+ return errh->error("target '%s' has no encoding, ignoring UNICODING", v[0].c_str());
+
+ int original_size = _unicoding.size();
+
+ if (v.size() == 2 || (v.size() == 3 && v[2] == dot_notdef))
+ /* no warnings to delete a glyph */;
+ else {
+ for (int i = 2; i < v.size(); i++) {
+ bool more; // some care to get all possibilities
+ int uni = glyphname_unicode(v[i], &more);
+ if (uni < 0) {
+ errh->warning("can't map '%s' to Unicode", v[i].c_str());
+ if (i == 2)
+ errh->warning("target '%s' will be deleted from encoding", v[0].c_str());
+ } else {
+ _unicoding.push_back(uni);
+ while (more) {
+ v[i] = NEXT_GLYPH_NAME(v[i]);
+ if ((uni = glyphname_unicode(v[i], &more)) >= 0)
+ _unicoding.push_back(uni);
+ }
+ }
+ }
+ }
+
+ _unicoding.push_back(-1);
+ if (override > 0 || _unicoding_map[v[0]] < 0)
+ _unicoding_map.insert(v[0], original_size);
+ return 0;
+}
+
+int
+DvipsEncoding::parse_words(const String &s, int override, int (DvipsEncoding::*method)(Vector<String> &, int, ErrorHandler *), ErrorHandler *errh)
+{
+ Vector<String> words;
+ const char *data = s.data();
+ const char *end = s.end();
+ while (data < end) {
+ while (data < end && isspace(*data))
+ data++;
+ const char *first = data;
+ while (data < end && !isspace(*data) && *data != ';')
+ data++;
+ if (data == first) {
+ data++; // step past semicolon (or harmlessly past EOS)
+ if (words.size() > 0) {
+ (this->*method)(words, override, errh);
+ words.clear();
+ }
+ } else
+ words.push_back(s.substring(first, data));
+ }
+ if (words.size() > 0)
+ (this->*method)(words, override, errh);
+ return 0;
+}
+
+static String
+landmark(const String &filename, int line)
+{
+ return filename + String::stable_string(":", 1) + String(line);
+}
+
+int
+DvipsEncoding::parse(String filename, bool ignore_ligkern, bool ignore_other, ErrorHandler *errh)
+{
+ int before = errh->nerrors();
+ String s = read_file(filename, errh);
+ if (errh->nerrors() != before)
+ return -1;
+ _filename = filename;
+ _file_had_ligkern = false;
+ filename = printable_filename(filename);
+ int pos = 0, line = 1;
+
+ // parse text
+ String token = tokenize(s, pos, line);
+ if (!token || token[0] != '/')
+ return errh->lerror(landmark(filename, line), "parse error, expected name");
+ _name = token.substring(1);
+ _initial_comment = s.substring(0, pos - token.length());
+
+ if (tokenize(s, pos, line) != "[")
+ return errh->lerror(landmark(filename, line), "parse error, expected [");
+
+ while ((token = tokenize(s, pos, line)) && token[0] == '/')
+ _e.push_back(token.substring(1));
+
+ _final_text = token + s.substring(pos);
+
+ // now parse comments
+ pos = 0, line = 1;
+ Vector<String> words;
+ LandmarkErrorHandler lerrh(errh, "");
+ while ((token = comment_tokenize(s, pos, line)))
+ if (token.length() >= 8
+ && memcmp(token.data(), "LIGKERN", 7) == 0
+ && isspace(token[7])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(filename, line));
+ parse_words(token.substring(8), 1, &DvipsEncoding::parse_ligkern_words, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "LIGKERNX", 8) == 0
+ && isspace(token[8])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(filename, line));
+ parse_words(token.substring(9), 1, &DvipsEncoding::parse_ligkern_words, &lerrh);
+
+ } else if (token.length() >= 10
+ && memcmp(token.data(), "UNICODING", 9) == 0
+ && isspace(token[9])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(filename, line));
+ parse_words(token.substring(10), 1, &DvipsEncoding::parse_unicoding_words, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "POSITION", 8) == 0
+ && isspace(token[8])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(filename, line));
+ parse_words(token.substring(9), 1, &DvipsEncoding::parse_position_words, &lerrh);
+
+ } else if (token.length() >= 13
+ && memcmp(token.data(), "CODINGSCHEME", 12) == 0
+ && isspace(token[12])
+ && !ignore_other) {
+ int p = 13;
+ while (p < token.length() && isspace(token[p]))
+ p++;
+ int pp = token.length() - 1;
+ while (pp > p && isspace(token[pp]))
+ pp--;
+ _coding_scheme = token.substring(p, pp - p);
+ if (_coding_scheme.length() > 39)
+ lerrh.lwarning(landmark(filename, line), "only first 39 chars of CODINGSCHEME are significant");
+ if (std::find(_coding_scheme.begin(), _coding_scheme.end(), '(') < _coding_scheme.end()
+ || std::find(_coding_scheme.begin(), _coding_scheme.end(), ')') < _coding_scheme.end()) {
+ lerrh.lerror(landmark(filename, line), "CODINGSCHEME cannot contain parentheses");
+ _coding_scheme = String();
+ }
+ }
+
+ return 0;
+}
+
+int
+DvipsEncoding::parse_ligkern(const String &ligkern_text, int override, ErrorHandler *errh)
+{
+ return parse_words(ligkern_text, override, &DvipsEncoding::parse_ligkern_words, errh);
+}
+
+int
+DvipsEncoding::parse_position(const String &position_text, int override, ErrorHandler *errh)
+{
+ return parse_words(position_text, override, &DvipsEncoding::parse_position_words, errh);
+}
+
+int
+DvipsEncoding::parse_unicoding(const String &unicoding_text, int override, ErrorHandler *errh)
+{
+ return parse_words(unicoding_text, override, &DvipsEncoding::parse_unicoding_words, errh);
+}
+
+void
+DvipsEncoding::bad_codepoint(int code)
+{
+ for (int i = 0; i < _lig.size(); i++) {
+ Ligature &l = _lig[i];
+ if (l.c1 == code || l.c2 == code)
+ l.join = 0;
+ else if ((l.join & JT_ADDLIG) && l.d == code)
+ l.join &= ~JT_LIGALL;
+ }
+}
+
+static inline Efont::OpenType::Glyph
+map_uni(uint32_t uni, const Efont::OpenType::Cmap &cmap, const Metrics &m)
+{
+ if (uni == U_EMPTYSLOT)
+ return m.emptyslot_glyph();
+ else
+ return cmap.map_uni(uni);
+}
+
+bool
+DvipsEncoding::x_unicodes(PermString chname, Vector<uint32_t> &unicodes) const
+{
+ int i = _unicoding_map[chname];
+ if (i >= 0) {
+ for (; _unicoding[i] >= 0; i++)
+ unicodes.push_back(_unicoding[i]);
+ return true;
+ } else {
+ bool more;
+ if ((i = glyphname_unicode(chname, &more)) >= 0)
+ unicodes.push_back(i);
+ if (more) { // might be multiple possibilities
+ String gn = chname;
+ do {
+ gn = NEXT_GLYPH_NAME(gn);
+ if ((i = glyphname_unicode(gn, &more)) >= 0)
+ unicodes.push_back(i);
+ } while (more);
+ }
+ return false;
+ }
+}
+
+
+void
+DvipsEncoding::make_metrics(Metrics &metrics, const Efont::OpenType::Cmap &cmap, Efont::Cff::Font *font, Secondary *secondary, bool literal, ErrorHandler *errh)
+{
+ // first pass: without secondaries
+ for (int code = 0; code < _e.size(); code++) {
+ PermString chname = _e[code];
+
+ // the altselector character has its own glyph name
+ if (code == _altselector_char && !literal)
+ chname = "altselector";
+
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find all Unicodes
+ Vector<uint32_t> unicodes;
+ (void) x_unicodes(chname, unicodes);
+
+ // find first Unicode supported by the font
+ Efont::OpenType::Glyph glyph = 0;
+ uint32_t glyph_uni = (unicodes.size() ? unicodes[0] : 0);
+ for (uint32_t *u = unicodes.begin(); u < unicodes.end() && !glyph; u++)
+ if ((glyph = map_uni(*u, cmap, metrics)) > 0)
+ glyph_uni = *u;
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = 0;
+ if (font)
+ named_glyph = font->glyphid(chname);
+
+ // do not use a Unicode-mapped glyph if literal
+ if (literal)
+ glyph = named_glyph;
+
+ // If we found a glyph, maybe use its named_glyph variant.
+ if (glyph > 0 && named_glyph > 0
+ && std::find(chname.begin(), chname.end(), '.') < chname.end())
+ glyph = named_glyph;
+
+ // assign slot
+ if (glyph > 0)
+ metrics.encode(code, glyph_uni, glyph);
+ }
+
+ // second pass: with secondaries
+ for (int code = 0; code < _e.size(); code++) {
+ // skip already-encoded characters and .notdef
+ if (literal || metrics.glyph(code) > 0 || _e[code] == dot_notdef)
+ continue;
+
+ PermString chname = _e[code];
+
+ // the altselector character has its own glyph name
+ if (code == _altselector_char && !literal)
+ chname = "altselector";
+
+ // find all Unicodes
+ Vector<uint32_t> unicodes;
+ bool unicodes_explicit = x_unicodes(chname, unicodes);
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = 0;
+ if (font)
+ named_glyph = font->glyphid(chname);
+
+ // 1. We were not able to find the glyph using Unicode.
+ // 2. There might be a named_glyph.
+ // May need to try secondaries later. Store this slot.
+ // Try secondaries, if there is no named_glyph, or explicit unicoding.
+ if (unicodes_explicit || named_glyph <= 0)
+ for (uint32_t *u = unicodes.begin(); u < unicodes.end(); u++)
+ if (secondary->encode_uni(code, chname, *u, metrics, errh))
+ goto encoded;
+
+ // 1. We were not able to find the glyph using Unicode or secondaries.
+ // 2. There might be a named_glyph.
+ // Use named glyph, if any. Special case for "UNICODING foo =: ;",
+ // which should turn off the character (even if a named_glyph exists),
+ // UNLESS the glyph was explicitly requested.
+ if (named_glyph > 0
+ && (!unicodes_explicit || unicodes.size() > 0
+ || (_encoding_required.size() > code && _encoding_required[code])))
+ metrics.encode(code, unicodes.size() ? unicodes[0] : 0, named_glyph);
+
+ encoded:
+ /* all set */;
+ }
+
+ // final pass: complain
+ for (int code = 0; code < _e.size(); code++)
+ if (_e[code] != dot_notdef && metrics.glyph(code) <= 0)
+ bad_codepoint(code);
+
+ metrics.set_coding_scheme(_coding_scheme);
+}
+
+
+void
+DvipsEncoding::apply_ligkern_lig(Metrics &metrics, ErrorHandler *errh) const
+{
+ assert((int)J_ALL == (int)Metrics::CODE_ALL);
+ for (const Ligature *l = _lig.begin(); l < _lig.end(); l++) {
+ if (l->c1 < 0 || l->c2 < 0 || l->join < 0 || !(l->join & JT_LIG))
+ continue;
+ metrics.remove_ligatures(l->c1, l->c2);
+ if (!(l->join & JT_ADDLIG))
+ /* nada */;
+ else if ((l->join & JT_LIGALL) == JL_LIG)
+ metrics.add_ligature(l->c1, l->c2, l->d);
+ else if ((l->join & JT_LIGALL) == JL_LIGC)
+ metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->d, l->c2));
+ else if ((l->join & JT_LIGALL) == JL_CLIG)
+ metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->c1, l->d));
+ else {
+ static int complex_join_warning = 0;
+ if (!complex_join_warning) {
+ errh->warning("complex LIGKERN ligature removed (I only support '=:', '=:|', and '|=:')");
+ complex_join_warning = 1;
+ }
+ }
+ }
+}
+
+void
+DvipsEncoding::apply_ligkern_kern(Metrics &metrics, ErrorHandler *) const
+{
+ assert((int)J_ALL == (int)Metrics::CODE_ALL);
+ for (const Ligature *l = _lig.begin(); l < _lig.end(); l++)
+ if (l->c1 >= 0 && l->c2 >= 0 && (l->join & JT_KERN))
+ metrics.set_kern(l->c1, l->c2, l->k);
+}
+
+void
+DvipsEncoding::apply_position(Metrics &metrics, ErrorHandler *) const
+{
+ for (const Ligature *l = _pos.begin(); l < _pos.end(); l++)
+ if (l->c1 >= 0)
+ metrics.add_single_positioning(l->c1, l->c2, l->join, l->k);
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.hh b/Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.hh
new file mode 100644
index 00000000000..7c366083f10
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/dvipsencoding.hh
@@ -0,0 +1,103 @@
+#ifndef OTFTOTFM_DVIPSENCODING_HH
+#define OTFTOTFM_DVIPSENCODING_HH
+#include <efont/otfcmap.hh>
+#include <efont/cff.hh>
+#include <lcdf/hashmap.hh>
+class Metrics;
+class Secondary;
+
+class DvipsEncoding { public:
+
+ DvipsEncoding();
+
+ static int parse_glyphlist(String);
+ static int glyphname_unicode(const String &, bool *more = 0);
+ static void glyphname_unicode(String, Vector<int> &, bool *more = 0);
+
+ operator bool() const { return _e.size() > 0; }
+ const String &name() const { return _name; }
+ const String &filename() const { return _filename; }
+ int boundary_char() const { return _boundary_char; }
+ const String &coding_scheme() const { return _coding_scheme; }
+ void set_coding_scheme(const String &s) { _coding_scheme = s; }
+
+ void encode(int, PermString);
+ inline int encoding_of(PermString) const;
+ int encoding_of(PermString, bool encode);
+ inline bool encoded(int e) const;
+ int encoding_size() const { return _e.size(); }
+
+ int parse(String filename, bool ignore_ligkern, bool ignore_other, ErrorHandler *);
+ int parse_ligkern(const String &ligkern_text, int override, ErrorHandler *);
+ int parse_position(const String &ligkern_text, int override, ErrorHandler *);
+ int parse_unicoding(const String &unicoding_text, int override, ErrorHandler *);
+
+ bool file_had_ligkern() const { return _file_had_ligkern; }
+
+ // also modifies 'this':
+ void make_metrics(Metrics &, const Efont::OpenType::Cmap &, Efont::Cff::Font *, Secondary *, bool literal, ErrorHandler *);
+
+ void apply_ligkern_lig(Metrics &, ErrorHandler *) const;
+ void apply_ligkern_kern(Metrics &, ErrorHandler *) const;
+ void apply_position(Metrics &, ErrorHandler *) const;
+
+ enum { JT_KERN = 32, JT_LIG = 64, JT_ADDLIG = 128, JT_LIGALL = 199,
+ JL_LIG = JT_LIG | JT_ADDLIG, JL_CLIG = JL_LIG | 1,
+ JL_CLIG_S = JL_LIG | 2, JL_LIGC = JL_LIG | 3,
+ JL_LIGC_S = JL_LIG | 4, JL_CLIGC = JL_LIG | 5,
+ JL_CLIGC_S = JL_LIG | 6, JL_CLIGC_SS = JL_LIG | 7,
+ JT_NOLIGKERN = JT_KERN | JT_LIG,
+ J_ALL = 0x7FFFFFFF }; // also see nokern_names in dvipsencoding.cc
+
+ private:
+
+ struct Ligature {
+ int c1, c2, join, k, d;
+ };
+
+ Vector<PermString> _e;
+ Vector<bool> _encoding_required;
+ int _boundary_char;
+ int _altselector_char;
+
+ Vector<Ligature> _lig;
+ Vector<Ligature> _pos;
+ HashMap<PermString, int> _unicoding_map;
+ Vector<int> _unicoding;
+
+ mutable Vector<uint32_t> _unicodes;
+
+ String _name;
+ String _filename;
+ String _coding_scheme;
+ String _initial_comment;
+ String _final_text;
+ bool _file_had_ligkern;
+
+ void add_ligkern(const Ligature &, int override);
+ int parse_ligkern_words(Vector<String> &, int override, ErrorHandler *);
+ int parse_position_words(Vector<String> &, int override, ErrorHandler *);
+ int parse_unicoding_words(Vector<String> &, int override, ErrorHandler *);
+ int parse_words(const String &, int override, int (DvipsEncoding::*)(Vector<String> &, int, ErrorHandler *), ErrorHandler *);
+ void bad_codepoint(int);
+ bool x_unicodes(PermString chname, Vector<uint32_t> &unicodes) const;
+
+ static PermString dot_notdef;
+
+ friend inline bool operator==(const Ligature&, const Ligature&);
+
+};
+
+inline bool
+DvipsEncoding::encoded(int e) const
+{
+ return e >= 0 && e < _e.size() && _e[e] != dot_notdef;
+}
+
+inline int
+DvipsEncoding::encoding_of(PermString what) const
+{
+ return const_cast<DvipsEncoding *>(this)->encoding_of(what, false);
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.cc b/Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.cc
new file mode 100644
index 00000000000..6bced191cb6
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.cc
@@ -0,0 +1,235 @@
+/* glyphfilter.{cc,hh} -- define subsets of characters
+ *
+ * Copyright (c) 2004-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifdef WIN32
+# define _USE_MATH_DEFINES
+#endif
+#include "glyphfilter.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <ctype.h>
+#include <algorithm>
+#include "uniprop.hh"
+#include "util.hh"
+
+bool
+GlyphFilter::allow(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode, int ptype) const
+{
+ // out-of-range glyphs never match
+ if (glyph < 0 || glyph >= glyph_names.size())
+ return false;
+
+ String glyph_name = glyph_names[glyph];
+ int uniprop = -1;
+ bool any_includes = false;
+ bool included = false;
+
+ // loop over patterns
+ for (const Pattern* p = _patterns.begin(); p < _patterns.end(); p++) {
+ // check pattern type
+ if ((p->type & ~T_TYPEMASK) != ptype)
+ continue;
+ // check include/exclude
+ if ((p->type & T_EXCLUDE) == 0) {
+ if (included)
+ continue;
+ any_includes = true;
+ }
+ // check if there's a match
+ bool match;
+ if (p->data == D_NAME)
+ match = glob_match(glyph_name, p->pattern);
+ else if (p->data == D_UNIPROP) {
+ if (uniprop < 0)
+ uniprop = UnicodeProperty::property(unicode);
+ match = ((uniprop & p->u.uniprop.mask) == p->u.uniprop.value);
+ } else
+ match = (unicode >= p->u.unirange.low && unicode <= p->u.unirange.high);
+ // act if match
+ if (match == ((p->type & T_NEGATE) == 0)) {
+ if ((p->type & T_EXCLUDE) == 0)
+ included = true;
+ else
+ return false;
+ }
+ }
+
+ return !any_includes || included;
+}
+
+GlyphFilter::Pattern::Pattern(uint16_t ptype)
+ : type(ptype), data(D_NAME)
+{
+ // make sure that even unused data has a known value, to simplify
+ // operator==
+ u.unirange.low = u.unirange.high = 0;
+}
+
+int
+GlyphFilter::Pattern::compare(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ int cmp = a.type - b.type;
+ if (cmp == 0)
+ cmp = a.data - b.data;
+ if (cmp == 0)
+ cmp = (int) (a.u.unirange.low - b.u.unirange.low);
+ if (cmp == 0)
+ cmp = (int) (a.u.unirange.high - b.u.unirange.high);
+ if (cmp == 0)
+ cmp = String::compare(a.pattern, b.pattern);
+ return cmp;
+}
+
+void
+GlyphFilter::add_pattern(const String& pattern, int ptype, ErrorHandler* errh)
+{
+ _sorted = false;
+
+ const char* begin = pattern.begin();
+ const char* end = pattern.end();
+ while (begin < end && isspace(*begin))
+ begin++;
+ if (begin >= end)
+ errh->error("missing pattern");
+
+ while (begin < end) {
+ const char* word = begin;
+ while (word < end && !isspace(*word))
+ word++;
+ bool negated = false;
+ if (begin < word && begin[0] == '!')
+ negated = true, begin++;
+
+ // actually parse clause
+ Pattern p(ptype + (negated ? T_NEGATE : 0));
+
+ // unicode property
+ if (begin + 3 <= word && begin[0] == '<' && word[-1] == '>') {
+ p.data = D_UNIPROP;
+ if (UnicodeProperty::parse_property(pattern.substring(begin + 1, word - 1), p.u.uniprop.value, p.u.uniprop.mask))
+ _patterns.push_back(p);
+ else if (errh)
+ errh->error("unknown Unicode property '%s'", pattern.c_str());
+ goto next_clause;
+ }
+
+ // unicode values
+ {
+ const char* dash = std::find(begin, word, '-');
+ if (parse_unicode_number(begin, dash, 1, p.u.unirange.low)) {
+ if (dash == word)
+ p.u.unirange.high = p.u.unirange.low;
+ else if (dash == word - 1)
+ p.u.unirange.high = 0xFFFFFFFFU;
+ else if (parse_unicode_number(dash + 1, word, 0, p.u.unirange.high))
+ /* do nothing */;
+ else
+ goto next_clause; // without adding pattern
+ p.data = D_UNIRANGE;
+ _patterns.push_back(p);
+ goto next_clause;
+ }
+ }
+
+ // otherwise must be name pattern
+ p.data = D_NAME;
+ p.pattern = pattern.substring(begin, word);
+ _patterns.push_back(p);
+
+ // move to next clause
+ next_clause:
+ for (begin = word; begin < end && isspace(*begin); begin++)
+ /* nada */;
+ }
+}
+
+void
+GlyphFilter::add_substitution_filter(const String& s, bool is_exclude, ErrorHandler* errh)
+{
+ add_pattern(s, is_exclude ? T_SRC + T_EXCLUDE : T_SRC, errh);
+}
+
+void
+GlyphFilter::add_alternate_filter(const String& s, bool is_exclude, ErrorHandler* errh)
+{
+ add_pattern(s, is_exclude ? T_DST + T_EXCLUDE : T_DST, errh);
+}
+
+GlyphFilter&
+GlyphFilter::operator+=(const GlyphFilter& gf)
+{
+ // be careful about self-addition
+ _patterns.reserve(gf._patterns.size());
+ const Pattern* end = gf._patterns.end();
+ for (const Pattern* p = gf._patterns.begin(); p < end; p++)
+ _patterns.push_back(*p);
+ return *this;
+}
+
+GlyphFilter
+operator+(const GlyphFilter& a, const GlyphFilter& b)
+{
+ if (!b)
+ return a;
+ if (!a)
+ return b;
+ GlyphFilter x(a);
+ x += b;
+ return x;
+}
+
+bool
+operator==(const GlyphFilter& a, const GlyphFilter& b)
+{
+ if (&a == &b)
+ return true;
+ if (a._patterns.size() != b._patterns.size())
+ return false;
+ const GlyphFilter::Pattern* pa = a._patterns.begin();
+ const GlyphFilter::Pattern* pb = b._patterns.begin();
+ for (; pa < a._patterns.end(); pa++, pb++)
+ if (!(*pa == *pb))
+ return false;
+ return true;
+}
+
+void
+GlyphFilter::sort()
+{
+ if (!_sorted) {
+ std::sort(_patterns.begin(), _patterns.end());
+ Pattern* true_end = std::unique(_patterns.begin(), _patterns.end());
+ _patterns.erase(true_end, _patterns.end());
+ _sorted = true;
+ }
+}
+
+void
+GlyphFilter::unparse(StringAccum& sa) const
+{
+ for (const Pattern* p = _patterns.begin(); p < _patterns.end(); p++) {
+ sa << (p->type & T_DST ? 'D' : 'S') << (p->type & T_NEGATE ? "!" : "") << (p->type & T_EXCLUDE ? "X" : "");
+ if (p->data == D_NAME)
+ sa << '<' << p->pattern << '>';
+ else if (p->data == D_UNIPROP)
+ sa << "[UNIPROP:" << p->u.uniprop.mask << '=' << p->u.uniprop.value << ']';
+ else
+ sa.snprintf(20, "[U+%02x-U+%02x]", p->u.unirange.low, p->u.unirange.high);
+ sa << ' ';
+ }
+ if (_patterns.size())
+ sa.pop_back();
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.hh b/Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.hh
new file mode 100644
index 00000000000..a2ceb40e439
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/glyphfilter.hh
@@ -0,0 +1,110 @@
+#ifndef OTFTOTFM_GLYPHFILTER_HH
+#define OTFTOTFM_GLYPHFILTER_HH
+#include <efont/otf.hh>
+#include <lcdf/vector.hh>
+class Metrics;
+
+class GlyphFilter { public:
+
+ GlyphFilter() : _sorted(true) { }
+
+ operator bool() const { return _patterns.size() != 0; }
+
+ inline bool allow_substitution(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const;
+ inline bool allow_alternate(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const;
+
+ void add_substitution_filter(const String&, bool is_exclude, ErrorHandler*);
+ void add_alternate_filter(const String&, bool is_exclude, ErrorHandler*);
+
+ friend bool operator==(const GlyphFilter&, const GlyphFilter&);
+ inline bool check_eq(GlyphFilter&); // may alter both GlyphFilters
+
+ GlyphFilter& operator+=(const GlyphFilter&);
+
+ void unparse(StringAccum&) const;
+
+ struct Pattern {
+ uint16_t type;
+ uint16_t data;
+ union {
+ struct {
+ int mask;
+ int value;
+ } uniprop;
+ struct {
+ uint32_t low;
+ uint32_t high;
+ } unirange;
+ } u;
+ String pattern;
+ Pattern(uint16_t type);
+ static int compare(const Pattern&, const Pattern&);
+ };
+
+ private:
+
+ enum { T_EXCLUDE = 1, T_NEGATE = 2, T_TYPEMASK = 3,
+ T_SRC = 0, T_DST = 4 };
+ enum { D_NAME, D_UNIPROP, D_UNIRANGE };
+
+ Vector<Pattern> _patterns;
+ bool _sorted;
+
+ bool allow(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode, int ptype) const;
+ void add_pattern(const String&, int ptype, ErrorHandler*);
+ void sort();
+
+};
+
+inline bool
+GlyphFilter::allow_substitution(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const
+{
+ return (!_patterns.size() || allow(glyph, glyph_names, unicode, T_SRC));
+}
+
+inline bool
+GlyphFilter::allow_alternate(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const
+{
+ return (!_patterns.size() || allow(glyph, glyph_names, unicode, T_DST));
+}
+
+inline bool operator==(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return a.type == b.type && a.data == b.data && a.u.unirange.low == b.u.unirange.low && a.u.unirange.high == b.u.unirange.high && a.pattern == b.pattern;
+}
+
+inline bool operator<(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return GlyphFilter::Pattern::compare(a, b) < 0;
+}
+
+inline bool operator!=(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return !(a == b);
+}
+
+bool operator==(const GlyphFilter&, const GlyphFilter&);
+
+inline bool operator!=(const GlyphFilter& a, const GlyphFilter& b)
+{
+ return !(a == b);
+}
+
+inline bool
+GlyphFilter::check_eq(GlyphFilter& o)
+{
+ sort();
+ o.sort();
+ return *this == o;
+}
+
+GlyphFilter operator+(const GlyphFilter&, const GlyphFilter&);
+
+inline StringAccum&
+operator<<(StringAccum& sa, const GlyphFilter& gf)
+{
+ gf.unparse(sa);
+ return sa;
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.c b/Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.c
new file mode 100644
index 00000000000..dd5cad6f7f1
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.c
@@ -0,0 +1,70 @@
+/* kpseinterface.{c,h} -- interface with the kpathsea library
+ *
+ * Copyright (c) 2003 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#include <kpathsea/config.h>
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <kpathsea/progname.h>
+#include <kpathsea/expand.h>
+#include <kpathsea/c-pathch.h>
+#include <kpathsea/tex-file.h>
+#include "kpseinterface.h"
+
+int kpsei_env_sep_char = ENV_SEP;
+
+void
+kpsei_init(const char* argv0, const char* progname)
+{
+ kpse_set_program_name(argv0, progname);
+#ifdef SELFAUTODIR
+ putenv("SELFAUTODIR=" SELFAUTODIR);
+#endif
+#ifdef SELFAUTOLOC
+ putenv("SELFAUTOLOC=" SELFAUTOLOC);
+#endif
+#ifdef SELFAUTOPARENT
+ putenv("SELFAUTOPARENT=" SELFAUTOPARENT);
+#endif
+}
+
+char*
+kpsei_path_expand(const char* path)
+{
+ return kpse_path_expand(path);
+}
+
+char*
+kpsei_find_file(const char* name, int format)
+{
+ switch (format) {
+ case KPSEI_FMT_WEB2C:
+ return kpse_find_file(name, kpse_web2c_format, true);
+ case KPSEI_FMT_ENCODING:
+ return kpse_find_file(name, kpse_tex_ps_header_format, true);
+ case KPSEI_FMT_TYPE1:
+ return kpse_find_file(name, kpse_type1_format, false);
+ case KPSEI_FMT_OTHER_TEXT:
+ return kpse_find_file(name, kpse_program_text_format, true);
+ default:
+ return 0;
+ }
+}
+
+void
+kpsei_set_debug_flags(unsigned flags)
+{
+ kpathsea_debug = flags;
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.h b/Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.h
new file mode 100644
index 00000000000..52abdc12bb5
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/kpseinterface.h
@@ -0,0 +1,18 @@
+#ifndef OTFTOTFM_KPSEINTERFACE_H
+#define OTFTOTFM_KPSEINTERFACE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void kpsei_init(const char* argv0, const char* progname);
+extern int kpsei_env_sep_char;
+char* kpsei_path_expand(const char* path); /* free() result */
+enum { KPSEI_FMT_WEB2C, KPSEI_FMT_ENCODING, KPSEI_FMT_TYPE1,
+ KPSEI_FMT_OTHER_TEXT };
+char* kpsei_find_file(const char* name, int format);
+void kpsei_set_debug_flags(unsigned flags);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/md5.c b/Build/source/utils/lcdf-typetools/otftotfm/md5.c
new file mode 100644
index 00000000000..d9fbd7510e2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/md5.c
@@ -0,0 +1,354 @@
+/* -*- mode: c; c-basic-offset: 8 -*- */
+/* md5.c - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
+ *
+ * according to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+/* heavily modified for GnuPG by <werner.koch@guug.de> */
+/* modified again for Sylpheed by <wk@gnupg.org> 2001-02-11 */
+/* modified again for LCDF by Eddie Kohler <kohler@icir.org> */
+
+
+/* Test values:
+ * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E
+ * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61
+ * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72
+ * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <lcdf/inttypes.h>
+
+#include "md5.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/****************
+ * Rotate a 32 bit integer by n bytes
+ */
+#if defined(__GNUC__) && defined(__i386__)
+static inline uint32_t
+rol( uint32_t x, int n)
+{
+ __asm__("roll %%cl,%0"
+ :"=r" (x)
+ :"0" (x),"c" (n));
+ return x;
+}
+#else
+#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+#endif
+
+
+void
+md5_init(MD5_CONTEXT *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->nblocks = 0;
+ ctx->count = 0;
+ ctx->finalized = 0;
+}
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+
+/****************
+ * transform n*64 bytes
+ */
+static void
+transform(MD5_CONTEXT *ctx, const unsigned char *data)
+{
+ uint32_t correct_words[16];
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+ uint32_t *cwp = correct_words;
+
+#ifdef BIG_ENDIAN_HOST
+ {
+ int i;
+ unsigned char *p2, *p1;
+
+ for (i = 0, p1 = data, p2 = (unsigned char*)correct_words;
+ i < 16; i++, p2 += 4) {
+ p2[3] = *p1++;
+ p2[2] = *p1++;
+ p2[1] = *p1++;
+ p2[0] = *p1++;
+ }
+ }
+#else
+ memcpy(correct_words, data, 64);
+#endif
+
+
+#define OP(a, b, c, d, s, T) \
+ do { \
+ a += FF (b, c, d) + (*cwp++) + T; \
+ a = rol(a, s); \
+ a += b; \
+ } while (0)
+
+ /* Before we start, one word about the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ a = rol(a, s); \
+ a += b; \
+ } while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Put checksum in context given as argument. */
+ ctx->A += A;
+ ctx->B += B;
+ ctx->C += C;
+ ctx->D += D;
+}
+
+
+
+/* The routine updates the message-digest context to
+ * account for the presence of each of the characters inBuf[0..inLen-1]
+ * in the message whose digest is being computed.
+ */
+void
+md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen)
+{
+ if (hd->count == 64) { /* flush the buffer */
+ transform( hd, hd->buf );
+ hd->count = 0;
+ hd->nblocks++;
+ }
+ if (!inbuf)
+ return;
+ if (hd->count) {
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+ md5_update(hd, NULL, 0);
+ if (!inlen)
+ return;
+ }
+
+ while (inlen >= 64) {
+ transform(hd, inbuf);
+ hd->count = 0;
+ hd->nblocks++;
+ inlen -= 64;
+ inbuf += 64;
+ }
+
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+}
+
+
+
+/* The routine final terminates the message-digest computation and
+ * ends with the desired message digest in mdContext->digest[0...15].
+ * The handle is prepared for a new MD5 cycle.
+ * Returns 16 bytes representing the digest.
+ */
+
+static void
+do_final(MD5_CONTEXT *hd)
+{
+ uint32_t t, msb, lsb;
+ unsigned char *p;
+
+ md5_update(hd, NULL, 0); /* flush */
+
+ msb = 0;
+ t = hd->nblocks;
+ if ((lsb = t << 6) < t) /* multiply by 64 to make a byte count */
+ msb++;
+ msb += t >> 26;
+ t = lsb;
+ if ((lsb = t + hd->count) < t) /* add the count */
+ msb++;
+ t = lsb;
+ if ((lsb = t << 3) < t) /* multiply by 8 to make a bit count */
+ msb++;
+ msb += t >> 29;
+
+ if (hd->count < 56) { /* enough room */
+ hd->buf[hd->count++] = 0x80; /* pad */
+ while(hd->count < 56)
+ hd->buf[hd->count++] = 0; /* pad */
+ } else { /* need one extra block */
+ hd->buf[hd->count++] = 0x80; /* pad character */
+ while (hd->count < 64)
+ hd->buf[hd->count++] = 0;
+ md5_update(hd, NULL, 0); /* flush */
+ memset(hd->buf, 0, 56); /* fill next block with zeroes */
+ }
+
+ /* append the 64 bit count */
+ hd->buf[56] = lsb ;
+ hd->buf[57] = lsb >> 8;
+ hd->buf[58] = lsb >> 16;
+ hd->buf[59] = lsb >> 24;
+ hd->buf[60] = msb ;
+ hd->buf[61] = msb >> 8;
+ hd->buf[62] = msb >> 16;
+ hd->buf[63] = msb >> 24;
+ transform(hd, hd->buf);
+
+ p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \
+ *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0)
+#else /* little endian */
+ /*#define X(a) do { *(uint32_t*)p = hd->##a ; p += 4; } while(0)*/
+ /* Unixware's cpp doesn't like the above construct so we do it his way:
+ * (reported by Allan Clark) */
+#define X(a) do { *(uint32_t*)p = (*hd).a ; p += 4; } while(0)
+#endif
+ X(A);
+ X(B);
+ X(C);
+ X(D);
+#undef X
+ hd->finalized = 1;
+}
+
+void
+md5_final(unsigned char *digest, MD5_CONTEXT *ctx)
+{
+ if (!ctx->finalized)
+ do_final(ctx);
+ memcpy(digest, ctx->buf, 16);
+}
+
+void
+md5_final_text(char *buf, MD5_CONTEXT *ctx)
+{
+ static const char *chars = "abcdefghijklmnopqrstuvwxyz234567";
+ int bit;
+ if (!ctx->finalized)
+ do_final(ctx);
+ for (bit = 0; bit < 16*8; bit += 5) {
+ int first_char = bit / 8;
+ int val = ctx->buf[first_char] >> (bit % 8);
+ if (bit + 8 > (first_char + 1) * 8 && first_char < 15)
+ val += ctx->buf[first_char + 1] << (8 - (bit % 8));
+ *buf++ = chars[val & 0x1F];
+ }
+ *buf++ = 0;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/md5.h b/Build/source/utils/lcdf-typetools/otftotfm/md5.h
new file mode 100644
index 00000000000..228c45f615c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/md5.h
@@ -0,0 +1,48 @@
+/* md5.h - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
+ *
+ * according to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _MD5_HDR_
+#define _MD5_HDR_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_TEXT_DIGEST_SIZE 26 /* + 1 for the terminating NUL */
+
+typedef struct { /* Hmm, should be private */
+ uint32_t A,B,C,D;
+ uint32_t nblocks;
+ unsigned char buf[64];
+ int count;
+ int finalized;
+} MD5_CONTEXT;
+
+void md5_init(MD5_CONTEXT *ctx);
+void md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen);
+void md5_final(unsigned char digest[MD5_DIGEST_SIZE], MD5_CONTEXT *ctx);
+void md5_final_text(char *text_digest, MD5_CONTEXT *ctx);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _MD5_HDR_ */
+
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/metrics.cc b/Build/source/utils/lcdf-typetools/otftotfm/metrics.cc
new file mode 100644
index 00000000000..ff0fb6575f3
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/metrics.cc
@@ -0,0 +1,1410 @@
+/* metrics.{cc,hh} -- an encoding during and after OpenType features
+ *
+ * Copyright (c) 2003-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "metrics.hh"
+#include "dvipsencoding.hh"
+#include "util.hh"
+#include "glyphfilter.hh"
+#include <string.h>
+#include <stdio.h>
+#include <algorithm>
+#include <lcdf/straccum.hh>
+
+Metrics::Metrics(Efont::CharstringProgram *font, int nglyphs)
+ : _boundary_glyph(nglyphs), _emptyslot_glyph(nglyphs + 1),
+ _design_units(1000), _liveness_marked(false)
+{
+ _encoding.assign(256, Char());
+ add_mapped_font(font, String());
+}
+
+Metrics::~Metrics()
+{
+ for (Char *c = _encoding.begin(); c != _encoding.end(); c++)
+ delete c->virtual_char;
+}
+
+int
+Metrics::add_mapped_font(Efont::CharstringProgram *font, const String &name)
+{
+ _mapped_fonts.push_back(font);
+ _mapped_font_names.push_back(name);
+ return _mapped_fonts.size() - 1;
+}
+
+void
+Metrics::check() const
+{
+ // check invariants
+ // 1. all 'ligatures' entries refer to valid characters
+ // 2. all 'ligatures' entries with 'in1 == c' are in '_encoding[c].ligs'
+ // 3. 'virtual_char' SHOW operations point to valid non-virtual chars
+ for (int code = 0; code < _encoding.size(); code++) {
+ const Char *ch = &_encoding[code];
+ assert((ch->virtual_char != 0) == (ch->glyph == VIRTUAL_GLYPH));
+ for (const Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ assert(valid_code(l->in2) && valid_code(l->out));
+ for (const Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ assert(valid_code(k->in2));
+ if (const VirtualChar *vc = ch->virtual_char) {
+ assert(vc->name);
+ int font_number = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
+ assert(s->valid_op());
+ if (s->op == Setting::SHOW && font_number == 0)
+ assert(nonvirtual_code(s->x));
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ }
+ assert(ch->built_in1 < 0 || valid_code(ch->built_in1));
+ assert(ch->built_in2 < 0 || valid_code(ch->built_in2));
+ assert((ch->built_in1 >= 0) == (ch->built_in2 >= 0));
+ assert(ch->base_code < 0 || valid_code(ch->base_code));
+ if (valid_code(ch->base_code)) {
+ const Char *ch2 = &_encoding[ch->base_code];
+ assert((!ch->virtual_char && ch->glyph)
+ || (!ch2->virtual_char && ch2->glyph));
+ }
+ if (ch->flag(Char::CONTEXT_ONLY))
+ assert(ch->virtual_char && ch->built_in1 >= 0 && ch->built_in2 >= 0);
+ if (ch->flag(Char::CONTEXT_ONLY))
+ assert(ch->flag(Char::LIVE));
+ }
+}
+
+PermString
+Metrics::code_name(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return permprintf("<badcode%d>", code);
+ else {
+ const Char &ch = _encoding[code];
+ if (ch.virtual_char)
+ return ch.virtual_char->name;
+ else if (ch.glyph == _boundary_glyph)
+ return "<boundary>";
+ else if (ch.glyph == _emptyslot_glyph)
+ return "<emptyslot>";
+ else if (ch.glyph >= 0 && ch.glyph < _mapped_fonts[0]->nglyphs())
+ return _mapped_fonts[0]->glyph_name(ch.glyph);
+ else
+ return permprintf("<glyph%d>", ch.glyph);
+ }
+}
+
+
+/*****************************************************************************/
+/* encoding */
+
+Metrics::Code
+Metrics::unicode_encoding(uint32_t uni) const
+{
+ for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
+ if (ch->unicode == uni)
+ return ch - _encoding.begin();
+ return -1;
+}
+
+Metrics::Code
+Metrics::hard_encoding(Glyph g) const
+{
+ if (g < 0)
+ return -1;
+ int answer = -1, n = 0;
+ for (int i = _encoding.size() - 1; i >= 0; i--)
+ if (_encoding[i].glyph == g)
+ answer = i, n++;
+ if (n < 2) {
+ if (g >= _emap.size())
+ _emap.resize(g + 1, -2);
+ _emap[g] = answer;
+ }
+ return answer;
+}
+
+Metrics::Code
+Metrics::force_encoding(Glyph g, int lookup_source)
+{
+ assert(g >= 0);
+ int e = encoding(g);
+ if (e >= 0)
+ return e;
+ else {
+ Char ch;
+ ch.glyph = g;
+ ch.base_code = _encoding.size();
+ ch.lookup_source = lookup_source;
+ _encoding.push_back(ch);
+ assign_emap(g, ch.base_code);
+ return ch.base_code;
+ }
+}
+
+void
+Metrics::encode(Code code, uint32_t uni, Glyph g)
+{
+ assert(code >= 0 && g >= 0 && g != VIRTUAL_GLYPH);
+ if (code >= _encoding.size())
+ _encoding.resize(code + 1, Char());
+ _encoding[code].unicode = uni;
+ _encoding[code].glyph = g;
+ if (g > 0)
+ _encoding[code].base_code = code;
+ assert(!_encoding[code].virtual_char);
+ assign_emap(g, code);
+}
+
+void
+Metrics::encode_virtual(Code code, PermString name, uint32_t uni, const Vector<Setting> &v)
+{
+ assert(code >= 0 && v.size() > 0);
+ if (code >= _encoding.size())
+ _encoding.resize(code + 1, Char());
+ _encoding[code].unicode = uni;
+ _encoding[code].glyph = VIRTUAL_GLYPH;
+ assert(!_encoding[code].virtual_char);
+ VirtualChar *vc = _encoding[code].virtual_char = new VirtualChar;
+ vc->name = name;
+ vc->setting = v;
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
+ assert(s->valid_op() && (s->op != Setting::SHOW || font_number != 0 || nonvirtual_code(s->x)));
+ if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+}
+
+void
+Metrics::add_altselector_code(Code code, int altselector_type)
+{
+ for (Kern *k = _altselectors.begin(); k != _altselectors.end(); k++)
+ if (k->in2 == code) {
+ k->kern = altselector_type;
+ return;
+ }
+ _altselectors.push_back(Kern(code, altselector_type));
+}
+
+void
+Metrics::base_glyphs(Vector<Glyph> &v) const
+{
+ v.assign(_encoding.size(), 0);
+ for (Code c = 0; c < _encoding.size(); c++)
+ if (_encoding[c].base_code >= 0)
+ v[_encoding[c].base_code] = _encoding[c].glyph;
+}
+
+
+/*****************************************************************************/
+/* Char methods */
+
+void
+Metrics::Char::clear()
+{
+ glyph = 0;
+ base_code = -1;
+ unicode = 0;
+ ligatures.clear();
+ kerns.clear();
+ delete virtual_char;
+ virtual_char = 0;
+ pdx = pdy = adx = 0;
+ built_in1 = built_in2 = -1;
+ lookup_source = -1;
+ flags = 0;
+}
+
+void
+Metrics::Char::swap(Char &c)
+{
+ std::swap(glyph, c.glyph);
+ // NB: only a partial switch of base_code!!
+ if (base_code < 0)
+ base_code = c.base_code;
+ c.base_code = -1;
+ std::swap(unicode, c.unicode);
+ ligatures.swap(c.ligatures);
+ kerns.swap(c.kerns);
+ std::swap(virtual_char, c.virtual_char);
+ std::swap(pdx, c.pdx);
+ std::swap(pdy, c.pdy);
+ std::swap(adx, c.adx);
+ std::swap(built_in1, c.built_in1);
+ std::swap(built_in2, c.built_in2);
+ std::swap(lookup_source, c.lookup_source);
+ std::swap(flags, c.flags);
+}
+
+
+/*****************************************************************************/
+/* manipulating ligature lists */
+
+Metrics::Ligature *
+Metrics::ligature_obj(Code code1, Code code2)
+{
+ assert(valid_code(code1) && valid_code(code2));
+ Char &ch = _encoding[code1];
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (l->in2 == code2)
+ return l;
+ return 0;
+}
+
+inline void
+Metrics::new_ligature(Code in1, Code in2, Code out)
+{
+ assert(valid_code(in1) && valid_code(in2) && valid_code(out));
+ _encoding[in1].ligatures.push_back(Ligature(in2, out));
+}
+
+inline void
+Metrics::repoint_ligature(Code, Ligature *l, Code out)
+{
+ l->out = out;
+}
+
+void
+Metrics::add_ligature(Code in1, Code in2, Code out)
+{
+ if (Ligature *l = ligature_obj(in1, in2)) {
+ Char &ch = _encoding[l->out];
+ if (ch.flags & Char::BUILT) {
+ // move old ligatures to point to the true ligature
+ for (Ligature *ll = ch.ligatures.begin(); ll != ch.ligatures.end(); ll++)
+ add_ligature(out, ll->in2, ll->out);
+ repoint_ligature(in1, l, out);
+ }
+ } else
+ new_ligature(in1, in2, out);
+}
+
+Metrics::Code
+Metrics::pair_code(Code in1, Code in2, int lookup_source)
+{
+ if (const Ligature *l = ligature_obj(in1, in2)) {
+ if (lookup_source < 0)
+ _encoding[l->out].flags &= ~Char::INTERMEDIATE;
+ return l->out;
+ } else {
+ Char ch;
+ ch.glyph = VIRTUAL_GLYPH;
+ ch.flags = Char::BUILT | (lookup_source >= 0 ? Char::INTERMEDIATE : 0);
+ VirtualChar *vc = ch.virtual_char = new VirtualChar;
+ vc->name = permprintf("%s__%s", code_str(in1), code_str(in2));
+ setting(in1, vc->setting, SET_INTERMEDIATE);
+ vc->setting.push_back(Setting(Setting::KERN));
+ setting(in2, vc->setting, SET_INTERMEDIATE);
+ ch.built_in1 = in1;
+ ch.built_in2 = in2;
+ ch.lookup_source = lookup_source;
+ _encoding.push_back(ch);
+ new_ligature(in1, in2, _encoding.size() - 1);
+ return _encoding.size() - 1;
+ }
+}
+
+void
+Metrics::remove_ligatures(Code in1, Code in2)
+{
+ if (in1 == CODE_ALL) {
+ for (in1 = 0; in1 < _encoding.size(); in1++)
+ remove_ligatures(in1, in2);
+ } else {
+ Char &ch = _encoding[in1];
+ if (in2 == CODE_ALL)
+ ch.ligatures.clear();
+ else if (Ligature *l = ligature_obj(in1, in2)) {
+ *l = ch.ligatures.back();
+ ch.ligatures.pop_back();
+ }
+ }
+}
+
+
+/*****************************************************************************/
+/* manipulating kern lists */
+
+Metrics::Kern *
+Metrics::kern_obj(Code in1, Code in2)
+{
+ assert(valid_code(in1) && valid_code(in2));
+ Char &ch = _encoding[in1];
+ for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (k->in2 == in2)
+ return k;
+ return 0;
+}
+
+int
+Metrics::kern(Code in1, Code in2) const
+{
+ assert(valid_code(in1) && valid_code(in2));
+ const Char &ch = _encoding[in1];
+ for (const Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (k->in2 == in2)
+ return k->kern;
+ return 0;
+}
+
+void
+Metrics::add_kern(Code in1, Code in2, int kern)
+{
+ if (Kern *k = kern_obj(in1, in2))
+ k->kern += kern;
+ else
+ _encoding[in1].kerns.push_back(Kern(in2, kern));
+}
+
+void
+Metrics::set_kern(Code in1, Code in2, int kern)
+{
+ if (in1 == CODE_ALL) {
+ for (in1 = 0; in1 < _encoding.size(); in1++)
+ set_kern(in1, in2, kern);
+ } else {
+ Char &ch = _encoding[in1];
+ if (in2 == CODE_ALL) {
+ assert(kern == 0);
+ ch.kerns.clear();
+ } else if (Kern *k = kern_obj(in1, in2)) {
+ if (kern == 0) {
+ *k = ch.kerns.back();
+ ch.kerns.pop_back();
+ } else
+ k->kern = kern;
+ } else if (kern != 0)
+ ch.kerns.push_back(Kern(in2, kern));
+ }
+}
+
+int
+Metrics::reencode_right_ligkern(Code old_in2, Code new_in2)
+{
+ int nchanges = 0;
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++) {
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ if (l->in2 == old_in2) {
+ if (new_in2 >= 0)
+ l->in2 = new_in2;
+ else {
+ *l = ch->ligatures.back();
+ ch->ligatures.pop_back();
+ l--;
+ }
+ nchanges++;
+ }
+ for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ if (k->in2 == old_in2) {
+ if (new_in2 >= 0)
+ k->in2 = new_in2;
+ else {
+ *k = ch->kerns.back();
+ ch->kerns.pop_back();
+ k--;
+ }
+ nchanges++;
+ }
+ // XXX?
+ if (ch->context_setting(-1, old_in2) && new_in2 >= 0 && ch->built_in1 >= 0)
+ ch->built_in2 = new_in2;
+ }
+ return nchanges;
+}
+
+
+/*****************************************************************************/
+/* positioning */
+
+void
+Metrics::add_single_positioning(Code c, int pdx, int pdy, int adx)
+{
+ assert(valid_code(c));
+ Char &ch = _encoding[c];
+ ch.pdx += pdx;
+ ch.pdy += pdy;
+ ch.adx += adx;
+}
+
+
+/*****************************************************************************/
+/* changed_context structure */
+
+namespace {
+class ChangedContext { public:
+ ChangedContext(int ncodes);
+ ~ChangedContext();
+ typedef Metrics::Code Code;
+
+ enum Context { CH_NONE = 0, CH_SOME = 1, CH_ALL = 2 };
+ bool allowed(Code, bool left_context) const;
+ bool pair_allowed(Code, Code) const;
+ bool virgin(Code) const;
+ void disallow(Code);
+ void disallow_pair(Code, Code);
+ private:
+ Vector<Vector<uint32_t> *> _v;
+ int _initial_ncodes;
+ mutable Vector<uint32_t> _all_sentinel;
+ ChangedContext(const ChangedContext &);
+ ChangedContext &operator=(const ChangedContext &);
+ static inline bool bit(const Vector<uint32_t> &, Code);
+ inline void ensure_all(Code) const;
+};
+
+ChangedContext::ChangedContext(int ncodes)
+ : _v(ncodes, 0), _initial_ncodes(ncodes), _all_sentinel(((ncodes - 1) >> 5) + 1, 0xFFFFFFFFU)
+{
+}
+
+ChangedContext::~ChangedContext()
+{
+ for (Vector<uint32_t> **v = _v.begin(); v != _v.end(); v++)
+ if (*v != &_all_sentinel)
+ delete *v;
+}
+
+inline void
+ChangedContext::ensure_all(Code c) const
+{
+ if (c >= 0 && (c >> 5) >= _all_sentinel.size())
+ _all_sentinel.resize((c >> 5) + 1, 0xFFFFFFFFU);
+}
+
+inline bool
+ChangedContext::bit(const Vector<uint32_t> &v, Code c)
+{
+ if (c < 0 || (c >> 5) >= v.size())
+ return false;
+ else
+ return (v[c >> 5] & (1 << (c & 0x1F))) != 0;
+}
+
+bool
+ChangedContext::allowed(Code c, bool left_context) const
+{
+ if (c < 0)
+ return false;
+ else if (c >= _v.size())
+ return left_context;
+ else
+ return (_v[c] != &_all_sentinel);
+}
+
+bool
+ChangedContext::pair_allowed(Code c1, Code c2) const
+{
+ ensure_all(c2);
+ if (c1 < 0 || c2 < 0)
+ return false;
+ else if (c1 >= _v.size() || c2 >= _v.size() || !_v[c1])
+ return true;
+ else
+ return !bit(*_v[c1], c2);
+}
+
+bool
+ChangedContext::virgin(Code c) const
+{
+ return (c >= 0 && (c >= _v.size() || _v[c] == 0));
+}
+
+void
+ChangedContext::disallow(Code c)
+{
+ assert(c >= 0);
+ if (c >= _v.size())
+ _v.resize(c + 1, 0);
+ if (_v[c] != &_all_sentinel) {
+ delete _v[c];
+ _v[c] = &_all_sentinel;
+ }
+}
+
+void
+ChangedContext::disallow_pair(Code c1, Code c2)
+{
+ assert(c1 >= 0 && c2 >= 0);
+ if (c1 >= _v.size())
+ _v.resize(c1 + 1, 0);
+ if (!_v[c1])
+ _v[c1] = new Vector<uint32_t>;
+ if (_v[c1] != &_all_sentinel) {
+ if ((c2 >> 5) >= _v[c1]->size())
+ _v[c1]->resize((c2 >> 5) + 1, 0);
+ (*_v[c1])[c2 >> 5] |= 1 << (c2 & 0x1F);
+ }
+}
+
+}
+
+
+/*****************************************************************************/
+/* applying GSUB substitutions */
+
+void
+Metrics::apply_ligature(const Vector<Code> &in, const Substitution *s, int lookup)
+{
+ // build up the character pair
+ int cin1 = in[0];
+ for (const Code *inp = in.begin() + 1; inp < in.end() - 1; inp++)
+ cin1 = pair_code(cin1, *inp, lookup);
+ int cin2 = in.back();
+
+ // build up the output character
+ Vector<Code> out;
+ s->all_out_glyphs(out);
+ int cout = -1;
+ for (Glyph *outp = out.begin(); outp < out.end(); outp++) {
+ *outp = force_encoding(*outp, lookup);
+ cout = (cout < 0 ? *outp : pair_code(cout, *outp, lookup));
+ }
+ _encoding[cout].flags &= ~Char::INTERMEDIATE;
+
+ // check for replacing a fake ligature
+ int old_out = -1;
+ if (Ligature *l = ligature_obj(cin1, cin2)) {
+ if (l->out == cout) // already created this same ligature
+ return;
+ if (_encoding[l->out].flags & Char::BUILT)
+ old_out = l->out;
+ }
+
+ // make the final ligature
+ add_ligature(cin1, cin2, cout);
+
+ //fprintf(stderr, "%s : %d/%s %d/%s => %d/%s [was %d/%s]\n", s->unparse().c_str(), cin1, code_str(cin1), cin2, code_str(cin2), cout, code_str(cout), old_out, code_str(old_out));
+
+ // if appropriate, swap old ligatures to point to the new result
+ if (old_out >= 0)
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ if (l->out == old_out)
+ repoint_ligature(ch - _encoding.begin(), l, cout);
+}
+
+int
+Metrics::apply(const Vector<Substitution>& sv, bool allow_single, int lookup, const GlyphFilter& glyph_filter, const Vector<PermString>& glyph_names)
+{
+ // keep track of what substitutions we have performed
+ ChangedContext ctx(_encoding.size());
+
+ // XXX does not handle multiply-encoded glyphs
+
+ // loop over substitutions
+ int failures = 0;
+ for (const Substitution *s = sv.begin(); s != sv.end(); s++) {
+ bool is_single = s->is_single() || s->is_alternate();
+ if (is_single && allow_single) {
+ // check if encoded
+ Code cin = encoding(s->in_glyph());
+ if (!ctx.allowed(cin, false))
+ /* not encoded before this substitution began, or completely
+ changed; ingore */
+ continue;
+
+ // check if substitution of this code allowed
+ if (!glyph_filter.allow_substitution(s->in_glyph(), glyph_names, unicode(cin)))
+ continue;
+
+ // look for an allowed alternate
+ Glyph out = -1;
+ for (int i = 0; out < 0 && i < s->out_nglyphs(); i++)
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, unicode(cin)))
+ out = s->out_glyph(i);
+ if (out < 0) // no allowed alternate
+ continue;
+
+ // apply substitution
+ if (ctx.virgin(cin)) {
+ // no one has changed this glyph yet, change it unilaterally
+ assign_emap(s->in_glyph(), -2);
+ assign_emap(out, cin);
+ assert(!_encoding[cin].virtual_char);
+ _encoding[cin].glyph = out;
+ ctx.disallow(cin);
+ } else {
+ // some contextual substitutions have changed this glyph, add
+ // contextual substitutions for the remaining possibilities
+ Code cout = force_encoding(out, lookup);
+ for (Code right = 0; right < _encoding.size(); right++)
+ if (_encoding[right].visible() && !_encoding[right].flag(Char::BUILT) && ctx.pair_allowed(cin, right)) {
+ Code pair = pair_code(cout, right, lookup);
+ _encoding[cout].flags &= ~Char::INTERMEDIATE;
+ add_ligature(cin, right, pair);
+ }
+ ctx.disallow(cin);
+ }
+
+ } else if (!is_single && !s->is_multiple() && s->is_simple_context()) {
+ // find a list of 'in' codes
+ Vector<Code> in;
+ s->all_in_glyphs(in);
+ int nleft = s->left_nglyphs(), nin = s->in_nglyphs();
+ assert(in.size() >= 2);
+ bool ok = true;
+ for (Glyph *inp = in.begin(); inp < in.end(); inp++) {
+ *inp = encoding(*inp);
+ if (!ctx.allowed(*inp, inp - in.begin() < nleft))
+ ok = false;
+ }
+
+ // check if any part of the combination has already changed
+ int ncheck = nleft + (nin > 2 ? 2 : nin);
+ if (ncheck == in.size())
+ ncheck--;
+ for (Code *inp = in.begin(); inp < in.begin() + ncheck; inp++)
+ if (!ctx.pair_allowed(inp[0], inp[1]))
+ ok = false;
+
+ // if not ok, continue
+ if (!ok)
+ continue;
+
+ // mark this combination as changed if appropriate
+ if (in.size() == 2 && nin == 1)
+ ctx.disallow_pair(in[0], in[1]);
+
+ // actually apply ligature
+ apply_ligature(in, s, lookup);
+
+ } else
+ failures++;
+ }
+
+ return sv.size() - failures;
+}
+
+void
+Metrics::apply_alternates(const Vector<Substitution>& sv, int lookup, const GlyphFilter& glyph_filter, const Vector<PermString>& glyph_names)
+{
+ for (const Substitution *s = sv.begin(); s != sv.end(); s++)
+ if (s->is_single() || s->is_alternate()) {
+ Code e = encoding(s->in_glyph());
+ if (e < 0)
+ continue;
+ for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
+ if (as->kern == 0) {
+ Code last = e;
+ for (int i = 0; i < s->out_nglyphs(); i++)
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, unicode(e))) {
+ Code out = force_encoding(s->out_glyph(i), lookup);
+ add_ligature(last, as->in2, out);
+ last = out;
+ }
+ } else if (as->kern <= s->out_nglyphs()) {
+ Code out = force_encoding(s->out_glyph(as->kern - 1), lookup);
+ add_ligature(e, as->in2, out);
+ }
+ } else if (s->is_ligature()) {
+ // check whether the output character is allowed
+ bool ok = true;
+ if (!glyph_filter.allow_alternate(s->out_glyph(), glyph_names, 0))
+ ok = false;
+
+ // check whether the input characters are encoded
+ Vector<Code> in(s->in_nglyphs() + 1, 0);
+ if (ok && (in[0] = encoding(s->in_glyph(0))) < 0)
+ ok = false;
+ for (int i = 1; ok && i < s->in_nglyphs(); i++)
+ if ((in[i+1] = encoding(s->in_glyph(i))) < 0)
+ ok = false;
+
+ if (!ok)
+ continue;
+
+ // find alternate selector and apply ligature if appropriate
+ for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
+ if (as->kern == 0) {
+ in[1] = as->in2;
+ apply_ligature(in, s, lookup);
+ }
+ }
+}
+
+
+/*****************************************************************************/
+/* applying GPOS positionings */
+
+static bool // returns old value
+assign_bitvec(int*& bitvec, int e, int n)
+{
+ if (e >= 0 && e < n) {
+ if (!bitvec) {
+ bitvec = new int[((n - 1) >> 5) + 1];
+ memset(bitvec, 0, sizeof(int) * (((n - 1) >> 5) + 1));
+ }
+ bool result = (bitvec[e >> 5] & (1 << (e & 0x1F))) != 0;
+ bitvec[e >> 5] |= (1 << (e & 0x1F));
+ return result;
+ } else
+ return false;
+}
+
+int
+Metrics::apply(const Vector<Positioning>& pv)
+{
+ // keep track of what substitutions we have performed
+ int *single_changed = 0;
+ Vector<int *> pair_changed(_encoding.size(), 0);
+
+ // XXX does not handle multiply-encoded glyphs
+
+ // loop over substitutions
+ int success = 0;
+ for (const Positioning *p = pv.begin(); p != pv.end(); p++)
+ if (p->is_pairkern()) {
+ int code1 = encoding(p->left_glyph());
+ int code2 = encoding(p->right_glyph());
+ if (code1 >= 0 && code2 >= 0
+ && !assign_bitvec(pair_changed[code1], code2, _encoding.size()))
+ add_kern(code1, code2, p->left().adx);
+ success++;
+ } else if (p->is_single()) {
+ int code = encoding(p->left_glyph());
+ if (code >= 0 && !assign_bitvec(single_changed, code, _encoding.size())) {
+ _encoding[code].pdx += p->left().pdx;
+ _encoding[code].pdy += p->left().pdy;
+ _encoding[code].adx += p->left().adx;
+ }
+ success++;
+ }
+
+ delete[] single_changed;
+ for (int i = 0; i < pair_changed.size(); i++)
+ delete[] pair_changed[i];
+ return success;
+}
+
+
+/*****************************************************************************/
+/* liveness marking, Ligature3s */
+
+inline bool
+operator<(const Metrics::Ligature3 &l1, const Metrics::Ligature3 &l2)
+{
+ // topological < : is l1's output one of l2's inputs?
+ if (l1.out == l2.in1 || l1.out == l2.in2)
+ return true;
+ else
+ return l1.in1 < l2.in1
+ || (l1.in1 == l2.in1 && (l1.in2 < l2.in2
+ || (l1.in2 == l2.in2 && l1.out < l2.out)));
+}
+
+void
+Metrics::all_ligatures(Vector<Ligature3> &all_ligs) const
+{
+ /* Develop a topologically-sorted ligature list. */
+ all_ligs.clear();
+ for (Code code = 0; code < _encoding.size(); code++)
+ for (const Ligature *l = _encoding[code].ligatures.begin(); l != _encoding[code].ligatures.end(); l++)
+ all_ligs.push_back(Ligature3(code, l->in2, l->out));
+ std::sort(all_ligs.begin(), all_ligs.end());
+}
+
+void
+Metrics::mark_liveness(int size, const Vector<Ligature3> &all_ligs)
+{
+ _liveness_marked = true;
+ bool changed;
+
+ /* Characters below 'size' are in both virtual and base encodings. */
+ for (Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
+ if (ch->visible())
+ ch->flags |= Char::LIVE | (ch->virtual_char ? 0 : Char::BASE_LIVE);
+
+ /* Characters reachable from live chars by live ligatures are live. */
+ redo_live_reachable:
+ for (const Ligature3 *l = all_ligs.begin(); l != all_ligs.end(); l++)
+ if (_encoding[l->in1].flag(Char::LIVE) && _encoding[l->in2].flag(Char::LIVE)) {
+ Char &ch = _encoding[l->out];
+ if (!ch.flag(Char::LIVE))
+ ch.flags |= Char::LIVE | Char::CONTEXT_ONLY | (ch.virtual_char ? 0 : Char::BASE_LIVE);
+ if (ch.flag(Char::CONTEXT_ONLY) && !ch.context_setting(l->in1, l->in2))
+ ch.flags &= ~Char::CONTEXT_ONLY;
+ }
+
+ /* Characters reachable from context-only ligatures are live. */
+ changed = false;
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->flag(Char::CONTEXT_ONLY)) {
+ Char &ch1 = _encoding[ch->built_in1];
+ Char &ch2 = _encoding[ch->built_in2];
+ if (!ch1.flag(Char::LIVE) || !ch2.flag(Char::LIVE)) {
+ ch1.flags |= Char::LIVE;
+ ch2.flags |= Char::LIVE;
+ changed = true;
+ }
+ }
+ if (changed)
+ goto redo_live_reachable;
+
+ /* Characters reachable from live settings are base-live. */
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->flag(Char::LIVE))
+ if (VirtualChar *vc = ch->virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0)
+ _encoding[s->x].flags |= Char::BASE_LIVE;
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+}
+
+void
+Metrics::reencode(const Vector<Code> &reencoding)
+{
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++) {
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++) {
+ l->in2 = reencoding[l->in2];
+ l->out = reencoding[l->out];
+ }
+ for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ k->in2 = reencoding[k->in2];
+ if (VirtualChar *vc = ch->virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0)
+ s->x = reencoding[s->x];
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ if (ch->built_in1 >= 0) {
+ ch->built_in1 = reencoding[ch->built_in1];
+ ch->built_in2 = reencoding[ch->built_in2];
+ }
+ if (ch->base_code >= 0)
+ ch->base_code = reencoding[ch->base_code];
+ }
+ _emap.clear();
+}
+
+
+/*****************************************************************************/
+/* shrinking the encoding */
+
+bool
+Metrics::Char::context_setting(Code in1, Code in2) const
+{
+ // return true iff this character could represent the context setting of
+ // 'in1' and 'in2'
+ if (!virtual_char || ligatures.size())
+ return false;
+ else
+ return (in1 == built_in1 || in2 == built_in2);
+}
+
+void
+Metrics::cut_encoding(int size)
+{
+ /* Function makes it so that characters below 'size' do not point to
+ characters above 'size', except for context ligatures. */
+
+ /* Change "emptyslot"s to ".notdef"s. */
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->glyph == emptyslot_glyph())
+ ch->glyph = 0, ch->base_code = -1;
+
+ /* Maybe we don't need to do anything else. */
+ if (_encoding.size() <= size) {
+ _encoding.resize(size, Char());
+ return;
+ }
+
+ /* Need liveness markings. */
+ if (!_liveness_marked) {
+ Vector<Ligature3> all_ligs;
+ all_ligatures(all_ligs);
+ mark_liveness(size, all_ligs);
+ }
+
+ /* Characters below 'size' are 'good'.
+ Characters above 'size' are not 'good'. */
+ Vector<int> good(_encoding.size(), 1);
+ for (Code c = size; c < _encoding.size(); c++)
+ good[c] = 0;
+
+ /* Characters encoded via base_code are 'good', though. */
+ for (Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
+ if (ch->base_code >= size)
+ good[ch->base_code] = 1;
+
+ /* Some fake characters might point beyond 'size'; remove them too. No
+ need for a multipass algorithm since virtual chars never point to
+ virtual chars. */
+ for (Code c = 0; c < _encoding.size(); c++) {
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0 && !good[s->x]) {
+ _encoding[c].clear();
+ goto bad_virtual_char;
+ } else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ if (c < size)
+ good[c] = 1;
+ bad_virtual_char: ;
+ }
+
+ /* Certainly none of the later ligatures or kerns will be meaningful. */
+ for (Code c = size; c < _encoding.size(); c++) {
+ _encoding[c].ligatures.clear();
+ _encoding[c].kerns.clear();
+ }
+
+ /* Remove ligatures and kerns that point beyond 'size', except for valid
+ context ligatures. Also remove ligatures that have non-live
+ components. */
+ /* 30.May.2005 -- Kerns might point involve a too-high character; kill
+ them. */
+ for (Code c = 0; c < size; c++) {
+ Char &ch = _encoding[c];
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (!good[l->in2] || l->in2 >= size
+ || (!good[l->out] && !_encoding[l->out].context_setting(c, l->in2))) {
+ *l = ch.ligatures.back();
+ ch.ligatures.pop_back();
+ l--;
+ }
+ for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (!good[k->in2] || k->in2 >= size) {
+ *k = ch.kerns.back();
+ ch.kerns.pop_back();
+ k--;
+ }
+ }
+
+ /* We are done! */
+}
+
+namespace {
+// preference-sorting extra characters
+enum { BASIC_LATIN_SCORE = 2, LATIN1_SUPPLEMENT_SCORE = 5,
+ LOW_16_SCORE = 6, OTHER_SCORE = 7, NOCHAR_SCORE = 100000,
+ CONTEXT_PENALTY = 4 };
+
+static int
+unicode_score(uint32_t u)
+{
+ if (u == 0)
+ return NOCHAR_SCORE;
+ else if (u < 0x0080)
+ return BASIC_LATIN_SCORE;
+ else if (u < 0x0100)
+ return LATIN1_SUPPLEMENT_SCORE;
+ else if (u < 0x8000)
+ return LOW_16_SCORE;
+ else
+ return OTHER_SCORE;
+}
+
+struct Slot {
+ Metrics::Code old_code;
+ Metrics::Code new_code;
+ Metrics::Glyph glyph;
+ int score;
+ int lookup_source;
+};
+
+inline bool
+operator<(const Slot &a, const Slot &b)
+{
+ // note: will give real glyphs priority over virtual ones at a given
+ // priority
+ return (a.lookup_source < b.lookup_source
+ || (a.lookup_source == b.lookup_source
+ && (a.score < b.score
+ || (a.score == b.score && a.glyph < b.glyph))));
+}
+}
+
+void
+Metrics::shrink_encoding(int size, const DvipsEncoding &dvipsenc, ErrorHandler *errh)
+{
+ /* Move characters around. */
+
+ /* Maybe we don't need to do anything. */
+ if (_encoding.size() <= size) {
+ cut_encoding(size);
+ return;
+ }
+
+ /* Need a list of all ligatures.. */
+ Vector<Ligature3> all_ligs;
+ all_ligatures(all_ligs);
+
+ /* Need liveness markings. */
+ if (!_liveness_marked)
+ mark_liveness(size, all_ligs);
+
+ /* Score characters by importance. Importance relates first to Unicode
+ values, and then recursively to the importances of characters that form
+ a ligature. */
+
+ /* Create an initial set of scores, based on Unicode values. */
+ Vector<int> scores(_encoding.size(), NOCHAR_SCORE);
+ for (int i = 0; i < _encoding.size(); i++)
+ if (_encoding[i].unicode)
+ scores[i] = unicode_score(_encoding[i].unicode);
+
+ /* Repeat these steps until you reach a stable set of scores: Score
+ ligatures (ligscore = SUM[char scores]), then score characters touched
+ only by fakes. */
+ bool changed = true;
+ while (changed) {
+ changed = false;
+ for (Ligature3 *l = all_ligs.begin(); l != all_ligs.end(); l++) {
+ int score = scores[l->in1] + scores[l->in2];
+ if (score < scores[l->out])
+ scores[l->out] = score;
+ }
+
+ for (Code c = 0; c < _encoding.size(); c++)
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ /* Make sure that if this virutal character appears, its parts
+ will also appear, by scoring the parts less */
+ int score = scores[c] - 1, font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0
+ && score < scores[s->x])
+ scores[s->x] = score, changed = true;
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ }
+
+ /* Rescore intermediates to not be better off than their endpoints. */
+ /* XXX multiple layers of intermediate? */
+ for (Code c = 0; c < _encoding.size(); c++) {
+ Char &ch = _encoding[c];
+ if (ch.flag(Char::INTERMEDIATE))
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (scores[c] < scores[l->out] && !_encoding[l->out].context_setting(c, l->in2))
+ scores[c] = scores[l->out];
+ }
+
+ /* Collect characters that want to be reassigned. */
+ Vector<Slot> slots;
+ for (Code c = size; c < _encoding.size(); c++)
+ if (scores[c] < NOCHAR_SCORE
+ && !(_encoding[c].flags & Char::CONTEXT_ONLY)
+ && (_encoding[c].flags & (Char::LIVE | Char::BASE_LIVE))) {
+ Slot slot = { c, -1, _encoding[c].glyph, scores[c], _encoding[c].lookup_source };
+ slots.push_back(slot);
+ }
+ // Sort them by score, then by glyph.
+ std::sort(slots.begin(), slots.end());
+
+ /* Prefer their old slots, if available. */
+ for (Slot *slot = slots.begin(); slot < slots.end(); slot++)
+ if (PermString g = code_name(slot->old_code)) {
+ int c = dvipsenc.encoding_of(g);
+ if (c >= 0 && _encoding[c].glyph == 0) {
+ _encoding[c].swap(_encoding[slot->old_code]);
+ slot->new_code = c;
+ }
+ }
+
+ /* List empty slots in two phases: Those not encoded by the input
+ encoding, then those encoded by the input encoding (but that character
+ wasn't available). */
+ Vector<Code> empty_codes;
+ for (int want_encoded = 0; want_encoded < 2; want_encoded++)
+ for (Code c = 0; c < size; c++)
+ if (_encoding[c].base_code < 0
+ && dvipsenc.encoded(c) == (bool) want_encoded)
+ empty_codes.push_back(c);
+
+ /* Then, loop over the unencoded characters, assigning them codes. */
+ int nunencoded = 0;
+ Code *holes[4], *end_hole;
+ holes[1] = holes[2] = holes[3] = empty_codes.begin();
+ end_hole = empty_codes.end();
+
+ for (Slot *slot = slots.begin(); slot != slots.end(); slot++) {
+ if (slot->new_code >= 0)
+ continue;
+
+ int needs = (_encoding[slot->old_code].visible_base() ? 1 : 0)
+ + (_encoding[slot->old_code].flag(Char::LIVE) ? 2 : 0);
+ assert(needs > 0);
+ Code **hole;
+
+ for (hole = &holes[needs]; *hole < end_hole; (*hole)++) {
+ int haves = (!_encoding[**hole].base_code >= 0 ? 1 : 0)
+ + (!_encoding[**hole].visible() ? 2 : 0);
+ if ((needs & haves) == needs)
+ break;
+ }
+
+ if (*hole < end_hole) {
+ if (needs & 2) {
+ assert(!_encoding[**hole].visible());
+ _encoding[**hole].swap(_encoding[slot->old_code]);
+ slot->new_code = **hole;
+ } else {
+ _encoding[slot->old_code].base_code = **hole;
+ slot->new_code = slot->old_code;
+ }
+ if (needs & 1) {
+ assert(_encoding[**hole].base_code < 0 || _encoding[**hole].base_code == slot->old_code);
+ _encoding[**hole].base_code = slot->old_code;
+ }
+ (*hole)++;
+ } else
+ nunencoded++;
+ }
+
+ /* Complain if some characters can't fit. */
+ if (nunencoded) {
+ // collect names of unencoded glyphs
+ Vector<String> unencoded;
+ for (Slot *slot = slots.begin(); slot != slots.end(); slot++)
+ if (slot->new_code < 0)
+ unencoded.push_back(code_name(slot->old_code));
+ std::sort(unencoded.begin(), unencoded.end());
+ StringAccum sa;
+ for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
+ sa << *a << ' ';
+ sa.pop_back();
+ sa.append_break_lines(sa.take_string(), 68, " ");
+ sa.pop_back();
+ errh->lwarning(" ", (unencoded.size() == 1 ? "not enough room in encoding, ignoring %d glyph" : "not enough room in encoding, ignoring %d glyphs"), unencoded.size());
+ errh->lmessage(" ", "(\
+This encoding doesn't have room for all the glyphs used by the\n\
+font, so I've ignored these:\n%s.)", sa.c_str());
+ }
+
+ /* Reencode changed slots. */
+ Vector<Code> reencoding;
+ for (Code c = 0; c < _encoding.size(); c++)
+ reencoding.push_back(c);
+ for (Slot *s = slots.begin(); s != slots.end(); s++)
+ if (s->new_code >= 0)
+ reencoding[s->old_code] = s->new_code;
+ reencode(reencoding);
+
+ check();
+}
+
+void
+Metrics::make_base(int size)
+{
+ if (_encoding.size() <= size)
+ /* If the encoding has not grown, there cannot be any base characters
+ left to swap in. */
+ return;
+
+ assert(_encoding.size() > size);
+ bool reencoded = false;
+ Vector<Code> reencoding;
+ for (Code c = 0; c < _encoding.size(); c++)
+ reencoding.push_back(c);
+ for (Code c = 0; c < size; c++) {
+ Char &ch = _encoding[c];
+ if (ch.base_code >= 0 && ch.base_code != c) {
+ reencoding[ch.base_code] = c;
+ reencoding[c] = ch.base_code;
+ _encoding[c].swap(_encoding[ch.base_code]);
+ reencoded = true;
+ }
+ if (ch.virtual_char) // remove it
+ ch.clear();
+ }
+ if (reencoded) {
+ reencode(reencoding);
+ cut_encoding(size);
+ }
+ check();
+}
+
+
+/*****************************************************************************/
+/* output */
+
+bool
+Metrics::need_virtual(int size) const
+{
+ if (size > _encoding.size())
+ size = _encoding.size();
+ for (const Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
+ if (ch->pdx || ch->pdy || ch->adx || ch->virtual_char)
+ return true;
+ return false;
+}
+
+bool
+Metrics::setting(Code code, Vector<Setting> &v, SettingMode sm) const
+{
+ if (!(sm & SET_KEEP))
+ v.clear();
+
+ if (!valid_code(code) || _encoding[code].glyph == 0)
+ return false;
+
+ const Char &ch = _encoding[code];
+
+ if (const VirtualChar *vc = ch.virtual_char) {
+ bool good = true;
+ int font_number = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::MOVE:
+ case Setting::RULE:
+ case Setting::PUSH:
+ case Setting::POP:
+ v.push_back(*s);
+ break;
+ case Setting::FONT:
+ v.push_back(*s);
+ font_number = s->x;
+ break;
+ case Setting::SHOW:
+ if (font_number == 0)
+ good &= setting(s->x, v, (SettingMode)(sm | SET_KEEP));
+ else
+ v.push_back(*s);
+ break;
+ case Setting::KERN:
+ if (sm & SET_INTERMEDIATE)
+ v.push_back(*s);
+ else if (s > vc->setting.begin() && s + 1 < vc->setting.end()
+ && s[-1].op == Setting::SHOW
+ && s[1].op == Setting::SHOW
+ && font_number == 0)
+ if (int k = kern(s[-1].x, s[1].x))
+ v.push_back(Setting(Setting::MOVE, k, 0));
+ break;
+ }
+ return good;
+
+ } else if (ch.base_code >= 0) {
+ if (ch.pdx != 0 || ch.pdy != 0)
+ v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
+
+ v.push_back(Setting(Setting::SHOW, ch.base_code, ch.glyph));
+
+ if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
+ v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
+ return true;
+
+ } else
+ return false;
+}
+
+int
+Metrics::ligatures(Code in1, Vector<Code> &in2, Vector<Code> &out, Vector<int> &context) const
+{
+ in2.clear();
+ out.clear();
+ context.clear();
+
+ const Char &in1ch = _encoding[in1];
+ for (const Ligature *l = in1ch.ligatures.begin(); l != in1ch.ligatures.end(); l++) {
+ in2.push_back(l->in2);
+ const Char &outch = _encoding[l->out];
+ if (outch.context_setting(in1, l->in2)) {
+ if (in1 == outch.built_in1 && l->in2 == outch.built_in2)
+ in2.pop_back();
+ else if (in1 == outch.built_in1) {
+ out.push_back(outch.built_in2);
+ context.push_back(-1);
+ } else {
+ out.push_back(outch.built_in1);
+ context.push_back(1);
+ }
+ } else {
+ out.push_back(l->out);
+ context.push_back(0);
+ }
+ }
+
+ return in2.size();
+}
+
+int
+Metrics::kerns(Code in1, Vector<Code> &in2, Vector<int> &kern) const
+{
+ in2.clear();
+ kern.clear();
+
+ const Char &in1ch = _encoding[in1];
+ for (const Kern *k = in1ch.kerns.begin(); k != in1ch.kerns.end(); k++)
+ if (k->kern != 0) {
+ in2.push_back(k->in2);
+ kern.push_back(k->kern);
+ }
+
+ return in2.size();
+}
+
+
+/*****************************************************************************/
+/* debugging */
+
+void
+Metrics::unparse() const
+{
+ for (Code c = 0; c < _encoding.size(); c++)
+ if (_encoding[c].glyph) {
+ const Char &ch = _encoding[c];
+ fprintf(stderr, "%4d/%s%s%s%s%s%s\n", c, code_str(c),
+ (ch.flag(Char::LIVE) ? " [L]" : ""),
+ (ch.flag(Char::BASE_LIVE) ? " [B]" : ""),
+ (ch.flag(Char::CONTEXT_ONLY) ? " [C]" : ""),
+ (ch.flag(Char::BUILT) ? " [!]" : ""),
+ (ch.base_code >= 0 ? " <BC>" : ""));
+ if (ch.base_code >= 0 && ch.base_code != c)
+ fprintf(stderr, "\tBASE %d/%s\n", ch.base_code, code_str(ch.base_code));
+ if (const VirtualChar *vc = ch.virtual_char) {
+ fprintf(stderr, "\t*");
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::FONT:
+ fprintf(stderr, " {F%d}", s->x);
+ break;
+ case Setting::SHOW:
+ fprintf(stderr, " %d/%s", s->x, code_str(s->x));
+ break;
+ case Setting::KERN:
+ fprintf(stderr, " <>");
+ break;
+ case Setting::MOVE:
+ fprintf(stderr, " <%+d,%+d>", s->x, s->y);
+ break;
+ case Setting::RULE:
+ fprintf(stderr, " [%d,%d]", s->x, s->y);
+ break;
+ case Setting::PUSH:
+ fprintf(stderr, " (");
+ break;
+ case Setting::POP:
+ fprintf(stderr, " )");
+ break;
+ }
+ fprintf(stderr, " ((%d/%s, %d/%s))\n", ch.built_in1, code_str(ch.built_in1), ch.built_in2, code_str(ch.built_in2));
+ }
+ for (const Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ fprintf(stderr, "\t[%d/%s => %d/%s]%s\n", l->in2, code_str(l->in2), l->out, code_str(l->out), (_encoding[l->out].context_setting(c, l->in2) ? " [C]" : ""));
+#if 0
+ for (const Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ fprintf(stderr, "\t{%d/%s %+d}\n", k->in2, code_str(k->in2), k->kern);
+#endif
+ }
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/metrics.hh b/Build/source/utils/lcdf-typetools/otftotfm/metrics.hh
new file mode 100644
index 00000000000..afd58e98bd8
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/metrics.hh
@@ -0,0 +1,254 @@
+#ifndef OTFTOTFM_METRICS_HH
+#define OTFTOTFM_METRICS_HH
+#include <efont/otfgsub.hh>
+#include <efont/otfgpos.hh>
+namespace Efont { class CharstringProgram; }
+class DvipsEncoding;
+class GlyphFilter;
+
+struct Setting {
+ enum { NONE, FONT, SHOW, KERN, MOVE, RULE, PUSH, POP, DEAD };
+ int op;
+ int x;
+ int y;
+ Setting(int op_in, int x_in = 0, int y_in = 0)
+ : op(op_in), x(x_in), y(y_in) { }
+ bool valid_op() const { return op >= FONT && op <= POP; }
+};
+
+class Metrics { public:
+
+ typedef int Code;
+ typedef Efont::OpenType::Glyph Glyph;
+ enum { VIRTUAL_GLYPH = 0x10000 };
+
+ typedef Efont::OpenType::Substitution Substitution;
+ typedef Efont::OpenType::Positioning Positioning;
+
+ Metrics(Efont::CharstringProgram *, int nglyphs);
+ ~Metrics();
+
+ void check() const;
+
+ Glyph boundary_glyph() const { return _boundary_glyph; }
+ Glyph emptyslot_glyph() const { return _emptyslot_glyph; }
+
+ String coding_scheme() const { return _coding_scheme; }
+ void set_coding_scheme(const String &s) { _coding_scheme = s; }
+
+ int design_units() const { return _design_units; }
+ void set_design_units(int du) { _design_units = du; }
+
+ int n_mapped_fonts() const { return _mapped_fonts.size();}
+ Efont::CharstringProgram *mapped_font(int i) const { return _mapped_fonts[i]; }
+ const String &mapped_font_name(int i) const { return _mapped_font_names[i]; }
+ int add_mapped_font(Efont::CharstringProgram *, const String &);
+
+ inline int encoding_size() const { return _encoding.size(); }
+ inline bool valid_code(Code) const;
+ inline bool nonvirtual_code(Code) const;
+ PermString code_name(Code) const;
+ inline const char *code_str(Code) const;
+
+ inline Glyph glyph(Code) const;
+ inline uint32_t unicode(Code) const;
+ inline Code encoding(Glyph) const;
+ Code unicode_encoding(uint32_t) const;
+ Code force_encoding(Glyph, int lookup_source = -1);
+ void encode(Code, uint32_t uni, Glyph);
+ void encode_virtual(Code, PermString, uint32_t uni, const Vector<Setting> &);
+
+ void add_altselector_code(Code, int altselector_type);
+ bool altselectors() const { return _altselectors.size() > 0; }
+
+ inline Code base_code(Code) const;
+ inline Glyph base_glyph(Code) const;
+ void base_glyphs(Vector<Glyph> &) const;
+
+ void add_ligature(Code in1, Code in2, Code out);
+ Code pair_code(Code, Code, int lookup_source = -1);
+ void add_kern(Code in1, Code in2, int kern);
+ void set_kern(Code in1, Code in2, int kern);
+ void add_single_positioning(Code, int pdx, int pdy, int adx);
+
+ enum { CODE_ALL = 0x7FFFFFFF };
+ void remove_ligatures(Code in1, Code in2);
+ int reencode_right_ligkern(Code old_in2, Code new_in2);
+
+ int apply(const Vector<Substitution>&, bool allow_single, int lookup, const GlyphFilter&, const Vector<PermString>& glyph_names);
+ void apply_alternates(const Vector<Substitution>&, int lookup, const GlyphFilter&, const Vector<PermString>& glyph_names);
+ int apply(const Vector<Positioning>&);
+
+ void cut_encoding(int size);
+ void shrink_encoding(int size, const DvipsEncoding &, ErrorHandler *);
+ void make_base(int size);
+
+ bool need_virtual(int size) const;
+ enum SettingMode { SET_NONE = 0, SET_KEEP = 1, SET_INTERMEDIATE = 3 };
+ bool setting(Code, Vector<Setting> &, SettingMode = SET_NONE) const;
+ int ligatures(Code in1, Vector<Code> &in2, Vector<Code> &out, Vector<int> &context) const;
+ int kerns(Code in1, Vector<Code> &in2, Vector<int> &kern) const;
+ int kern(Code in1, Code in2) const;
+
+ void unparse() const;
+
+ struct Ligature {
+ Code in2;
+ Code out;
+ Ligature(Code in2_, Code out_) : in2(in2_), out(out_) { }
+ };
+
+ struct Kern {
+ Code in2;
+ int kern;
+ Kern(Code in2_, int kern_) : in2(in2_), kern(kern_) { }
+ };
+
+ struct VirtualChar {
+ PermString name;
+ Vector<Setting> setting;
+ };
+
+ struct Ligature3 {
+ Code in1;
+ Code in2;
+ Code out;
+ Ligature3(Code in1_, Code in2_, Code out_) : in1(in1_), in2(in2_), out(out_) { }
+ };
+
+ private:
+
+ struct Char {
+ Glyph glyph;
+ Code base_code;
+ uint32_t unicode;
+ Vector<Ligature> ligatures;
+ Vector<Kern> kerns;
+ VirtualChar *virtual_char;
+ int pdx;
+ int pdy;
+ int adx;
+ Code built_in1;
+ Code built_in2;
+ int lookup_source;
+ enum { BUILT = 1, INTERMEDIATE = 2, CONTEXT_ONLY = 4, LIVE = 8, BASE_LIVE = 16 };
+ int flags;
+
+ Char() : virtual_char(0) { clear(); }
+ void clear();
+ void swap(Char &);
+ bool visible() const { return glyph != 0; }
+ bool visible_base() const { return glyph != 0 && glyph != VIRTUAL_GLYPH; }
+ bool flag(int f) const { return (flags & f) != 0; }
+ bool context_setting(Code in1, Code in2) const;
+ };
+
+ Vector<Char> _encoding;
+ mutable Vector<int> _emap;
+
+ Glyph _boundary_glyph;
+ Glyph _emptyslot_glyph;
+
+ Vector<Kern> _altselectors;
+
+ String _coding_scheme;
+ int _design_units;
+
+ bool _liveness_marked : 1;
+
+ Vector<Efont::CharstringProgram *> _mapped_fonts;
+ Vector<String> _mapped_font_names;
+
+ Metrics(const Metrics &); // does not exist
+ Metrics &operator=(const Metrics &); // does not exist
+
+ inline void assign_emap(Glyph, Code);
+ Code hard_encoding(Glyph) const;
+
+ Ligature *ligature_obj(Code, Code);
+ Kern *kern_obj(Code, Code);
+ inline void new_ligature(Code, Code, Code);
+ inline void repoint_ligature(Code, Ligature *, Code);
+
+ friend bool operator<(const Ligature3 &, const Ligature3 &);
+ void all_ligatures(Vector<Ligature3> &) const;
+ void mark_liveness(int size, const Vector<Ligature3> &);
+ void reencode(const Vector<Code> &);
+
+ void apply_ligature(const Vector<Code> &, const Substitution *, int lookup);
+
+};
+
+
+inline bool
+Metrics::valid_code(Code code) const
+{
+ return code >= 0 && code < _encoding.size();
+}
+
+inline bool
+Metrics::nonvirtual_code(Code code) const
+{
+ return code >= 0 && code < _encoding.size() && !_encoding[code].virtual_char;
+}
+
+inline Metrics::Glyph
+Metrics::glyph(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].glyph;
+}
+
+inline uint32_t
+Metrics::unicode(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].unicode;
+}
+
+inline Metrics::Glyph
+Metrics::base_glyph(Code code) const
+{
+ if (code < 0 || code >= _encoding.size() || _encoding[code].base_code < 0)
+ return 0;
+ else
+ return _encoding[code].glyph;
+}
+
+inline Metrics::Code
+Metrics::base_code(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].base_code;
+}
+
+inline Metrics::Code
+Metrics::encoding(Glyph g) const
+{
+ if (g >= 0 && g < _emap.size() && _emap.at_u(g) >= -1)
+ return _emap.at_u(g);
+ else
+ return hard_encoding(g);
+}
+
+inline void
+Metrics::assign_emap(Glyph g, Code code)
+{
+ if (g >= _emap.size())
+ _emap.resize(g + 1, -1);
+ _emap[g] = (_emap[g] == -1 || _emap[g] == code ? code : -2);
+}
+
+inline const char *
+Metrics::code_str(Code code) const
+{
+ return code_name(code).c_str();
+}
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.1 b/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.1
new file mode 100644
index 00000000000..a5450d3e290
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.1
@@ -0,0 +1,1473 @@
+'\"t
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.de BUP
+.IP \(bu 3n
+..
+.TH OTFTOTFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+otftotfm \- create TeX font metrics from PostScript OpenType fonts
+.SH SYNOPSIS
+.B otftotfm
+\%[\fB\-a\fR]
+\%[\fBoptions\fR]
+\%\fIfontfile\fR.otf [\fItexname\fR]
+'
+.SH DESCRIPTION
+.BR Otftotfm
+creates the font metric and encoding files required to use an OpenType font
+with TeX. You supply an OpenType ".otf" font file, a base ".enc" encoding,
+and a TeX name "\fItexname\fR" for the resulting font, and say which
+OpenType features should be turned on. Then
+.B otftotfm
+generates and installs the corresponding TeX-related metric files
+(".tfm" TeX font metrics, ".vf" virtual fonts, and ".enc"
+encoding files). It only works on PostScript-flavored OpenType fonts.
+.LP
+The easiest way to use
+.B otftotfm
+is with the
+.B \-a
+option; see Automatic Mode below. Without
+.BR \-a ,
+.B otftotfm
+writes all its output files to the current directory.
+.LP
+After running "\fBotftotfm\fR \fIfontfile\fR.otf \fItexname\fR" and
+installing the results (manually or with
+.BR \-a ),
+you can use the OpenType font in plain TeX with a command like this:
+.Sp
+.nf
+ \efont\emyfont=\fItexname\fR at 10pt
+ {\emyfont This text uses the OpenType font.}
+.fi
+.Sp
+LaTeX users will generally make a ".fd" input file so that commands like
+"\erenewcommand{\ermdefault}{TeXName}" work correctly. See the EXAMPLE
+section for more; check the DIAGNOSTICS and FREQUENTLY ASKED QUESTIONS
+sections if you have trouble.
+'
+.SS "OpenType Features"
+.LP
+OpenType fonts support optional
+.I features
+that change their appearance. Use the
+.B \-f
+option to turn on selected features. For example, "\fB\-f\fRsmcp" replaces
+lower-case letters with the corresponding small capitals, in fonts that
+support this.
+'
+.PP
+You'll generally provide at least the "\fB\-f\fRkern" and "\fB\-f\fRliga"
+options, which activate pair kerns and f-ligatures. Other interesting
+features include "\fB\-f\fRcpsp", for capital spacing; "\fB\-f\fRdlig", for
+optional ligatures; "\fB\-f\fRlnum", "\fB\-f\fRonum", "\fB\-f\fRpnum", and
+"\fB\-f\fRtnum", to control digit glyphs; "\fB\-f\fRsmcp", for small
+capitals; "\fB\-f\fRswsh", for swash variants; and "\fB\-f\fRcswh", for
+contextual swash. See the FEATURE DIRECTORY section below for more. The
+.M otfinfo 1
+program will report which features a font supports; run "\fBotfinfo\fR
+\fB\-f\fR \fIfontfile\fR.otf".
+'
+.PP
+Feature options can also apply a feature to a subset of characters in the
+font. For example, "\fB\-\-lf\fR smcp"
+.I only
+replaces letters with small capitals, whereas "\fB\-f\fRsmcp" might
+additionally replace digits and punctuation marks with small-capital
+versions.
+'
+.SS Automatic Mode
+.PP
+Automatic mode, triggered by the
+.BR \-a / \-\-automatic
+option, installs font metrics and encoding files where TeX can find them,
+and additionally installs a Type 1 font and mapping for
+.M dvips 1 .
+This requires a TeX installation that follows the TeX Directory Structure
+standard (http://www.tug.org/tds/), such as most Unix TeX installations.
+'
+.PP
+Automatic mode should run seamlessly out of the box.
+.B Otftotfm
+will install metrics files, encodings, map files, and Type\~1 fonts into
+.I $HOME/.texmf-var
+or any other writable TEXMF directory, and run
+.M updmap 1
+to update the global lists of installed fonts. (On older teTeX
+installations, you may first need to copy the system's
+.I updmap.cfg
+file to
+.I $HOME/texmf/web2c
+and run
+.M mktexlsr 1 .)
+You can then run "\fBotftotfm\fR
+.B \-a
+.IR file .otf
+.IR texname \&"
+and immediately refer to the font in TeX using the
+.I texname
+you supplied. Again, you will have to write ".fd" files and/or typescripts
+to make the font conveniently accessible from LaTeX or ConTeXt. See the
+DIAGNOSTICS section if you have problems with these instructions.
+'
+.PP
+In automatic mode,
+.B otftotfm
+searches your $TEXMFVAR or $TEXMF path for a writable directory, then
+installs files under that directory tree as follows:
+'
+.TS
+l l l .
+\fBFile type\fR \fBDirectory\fR \fBFilename\fR
+TFM TEXMF/fonts/tfm/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR[--base].tfm
+VF TEXMF/fonts/vf/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR.vf
+PL TEXMF/fonts/pl/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR[--base].pl
+VPL TEXMF/fonts/vpl/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR.vpl
+encoding TEXMF/fonts/enc/dvips/\fIvendor\fR/ a_\fIsignature\fR.enc
+ or TEXMF/dvips/\fIvendor\fR/
+PFB font TEXMF/fonts/type1/\fIvendor\fR/\fItypeface\fR/ \fIPStexname\fR.pfb
+font map TEXMF/fonts/map/dvips/\fIvendor\fR/ \fIvendor\fR.map
+ or TEXMF/dvips/\fIvendor\fR/
+.TE
+.PP
+"TEXMF" stands for the writable TEXMF directory. \fITexname\fR is the
+font name supplied as
+.BR otftotfm 's
+second argument, and \fIPStexname\fR is the PostScript name of the input
+font. The \fIvendor\fR and \fItypeface\fR strings are required by TDS;
+they default to "lcdftools" and the font's family name, respectively, but
+see the
+.B \-\-vendor
+and
+.B \-\-typeface
+options. \fISignature\fR is an opaque 6-character encoding signature.
+.PP
+You can override these directories with environment variables and options
+as follows. Options take precedence over environment variables.
+'
+.TS
+l l l .
+\fBFile type\fR \fBEnvironment variable\fR \fBOption\fR
+TFM TFMDESTDIR \-\-tfm\-directory
+VF VFDESTDIR \-\-vf\-directory
+PL PLDESTDIR \-\-pl\-directory
+VPL VPLDESTDIR \-\-vpl\-directory
+encoding ENCODINGDESTDIR \-\-encoding\-directory
+PFB font T1DESTDIR \-\-type1\-directory
+font map \- \-\-map\-file
+.TE
+.PP
+.B Otftotfm
+will update the
+.I TEXMF/ls-R
+file when installing files under TEXMF. It will also run the
+.M updmap 1
+program after changing a map file, unless the
+.B \-\-no\-updmap
+option was supplied. However, if an executable file called
+.IR TEXMF/dvips/updmap
+exists, this file is executed (from the
+.I TEXMF/dvips
+directory) rather than the global
+.BR updmap .
+This is so you can write a fast, customized version of
+.B updmap
+if desired.
+'
+.SH EXAMPLE
+This section uses MinionPro to show one way to install OpenType fonts for
+LaTeX. We begin with six fonts: "MinionPro-Regular.otf",
+"MinionPro-It.otf", "MinionPro-Semibold.otf", "MinionPro-SemiboldIt.otf",
+"MinionPro-Bold.otf", and "MinionPro-BoldIt.otf".
+.PP
+Our first task is to decide how to encode the fonts. The "encoding scheme"
+is used by TeX to decide how to typeset accents and symbols like "$". The
+"LY1" encoding scheme is a good choice for many OpenType fonts; it
+corresponds to the "texnansx.enc" encoding file, so we will supply
+.B otftotfm
+with the "\fB\-e\fR texnansx" option.
+.PP
+Next, we decide on a naming scheme for the font metric files. Let's use
+the OpenType font names as a base. (There's generally no need to follow
+the six-character "Karl Berry" naming scheme.) Just in case we come back
+later and add a different encoding scheme, we'll prepend "LY1--" to each
+name.
+.PP
+We're now ready to run
+.B otftotfm
+for the first set of fonts. Note the "\fB\-f\fRkern \fB\-f\fRliga"
+options, which access pair kerns and the default "f" ligatures.
+.Sp
+.nf
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-Regular.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1--MinionPro-Regular
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-It.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1--MinionPro-It
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-Semibold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1--MinionPro-Semibold
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-SemiboldIt.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1--MinionPro-SemiboldIt
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-Bold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1--MinionPro-Bold
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-BoldIt.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1--MinionPro-BoldIt
+.fi
+.Sp
+The small-caps fonts are generated with an additional "\fB\-f\fRsmcp"
+option. We append "--fsmcp" to the font metric names as well,
+differentiating them from the regular fonts. Although MinionPro's italic
+fonts support small-caps, the LaTeX font selection scheme can't access them
+easily, so we've left them off.
+.Sp
+.nf
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-Regular.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga \fB\-f\fRsmcp LY1--MinionPro-Regular--fsmcp
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-Semibold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga \fB\-f\fRsmcp LY1--MinionPro-Semibold--fsmcp
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro-Bold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga \fB\-f\fRsmcp LY1--MinionPro-Bold--fsmcp
+.fi
+.Sp
+To get old-style numerals, just add the "\fB\-f\fRonum" option to each
+invocation -- and, to reduce confusion, append "--fonum" to the font metric
+names.
+.PP
+At this point, all our font metric files are installed, and it's finally
+time to create the ".fd" file. (The ".fd" format is documented in
+.IR "The LaTeX Companion" .)
+Let's call the LaTeX font family "MinionPro". Then the ".fd" file is
+"LY1MinionPro.fd", and it contains:
+.Sp
+.nf
+ \eDeclareFontFamily{LY1}{MinionPro}{}
+ \eDeclareFontShape{LY1}{MinionPro}{m}{n}%
+ { <\-> LY1--MinionPro-Regular }{}
+ \eDeclareFontShape{LY1}{MinionPro}{m}{it}{ <\-> LY1--MinionPro-It }{}
+ \eDeclareFontShape{LY1}{MinionPro}{m}{sc}%
+ { <\-> LY1--MinionPro-Regular--fsmcp }{}
+ \eDeclareFontShape{LY1}{MinionPro}{sb}{n}%
+ { <\-> LY1--MinionPro-Semibold }{}
+ \eDeclareFontShape{LY1}{MinionPro}{sb}{it}%
+ { <\-> LY1--MinionPro-SemiboldIt }{}
+ \eDeclareFontShape{LY1}{MinionPro}{sb}{sc}%
+ { <\-> LY1--MinionPro-Semibold--fsmcp }{}
+ \eDeclareFontShape{LY1}{MinionPro}{b}{n}{ <\-> LY1--MinionPro-Bold }{}
+ \eDeclareFontShape{LY1}{MinionPro}{b}{it}%
+ { <\-> LY1--MinionPro-BoldIt }{}
+ \eDeclareFontShape{LY1}{MinionPro}{b}{sc}%
+ { <\-> LY1--MinionPro-Bold--fsmcp }{}
+ \eDeclareFontShape{LY1}{MinionPro}{bx}{n}%
+ { <\-> ssub * MinionPro/b/n }{}
+ \eDeclareFontShape{LY1}{MinionPro}{bx}{it}%
+ { <\-> ssub * MinionPro/b/it }{}
+ \eDeclareFontShape{LY1}{MinionPro}{bx}{sc}%
+ { <\-> ssub * MinionPro/b/sc }{}
+.fi
+.PP
+We're now ready to use MinionPro in LaTeX, with lines like this in the
+document preamble:
+.Sp
+.nf
+ \eusepackage[LY1]{fontenc}
+ \erenewcommand{\ermdefault}{MinionPro}
+ \erenewcommand{\ebfdefault}{b}
+.fi
+.PP
+Of course, we're free at any time to add more MinionPro variants with
+.BR otftotfm ;
+they'll become accessible to LaTeX as soon as we edit the "MinionPro.fd"
+file.
+'
+.SH OPTIONS
+With long options, you need type only as many characters as will make the
+option unique.
+.SS Font Feature and Transformation Options
+.PD 0
+.TP 5
+.BI \-s " script\fR[.\fIlang\fR], " \-\-script= "script\fR[.\fIlang\fR]"
+Apply features suitable to the script system
+.I script
+and language system
+.IR lang .
+Scripts and language systems are two-to-four-letter names assigned by
+Microsoft and Adobe. Examples include "latn" (Latin script), "grek" (Greek
+script), and "yi.YIC" (Yi script with classic characters). If
+.I lang
+is not specified,
+.B otftotfm
+will use the default language system for that
+script. You can give this option multiple times. Run "\fBotfinfo\fR
+\-s \fIfont\fR" to see the list of scripts and languages a
+font supports. Defaults to "latn".
+'
+.Sp
+.TP 5
+.BI \-f " feature\fR, " \-\-feature= "feature"
+Activate the feature named
+.IR feature .
+Features are four-letter names assigned by Microsoft and Adobe; they are
+meant to correspond to font behaviors, such as kerning or small-capitals.
+Examples include "liga" (default ligatures), "dlig" (discretionary
+ligatures), "kern" (kerning), and "c2sc" (replacing capitals with small
+capitals). Give this option multiple times to apply multiple features. Run
+"\fBotfinfo\fR \-f [\-\-script option] \fIfont\fR" to see the list
+of features a font supports for a specified script.
+Defaults to any features required by the selected scripts.
+'
+.Sp
+.TP 5
+.BI \-\-lf " feature\fR, " \-\-letter\-feature= "feature"
+Activate the feature named
+.IR feature ,
+but only for letters. For instance, the "\-f smcp" option will apply the
+small-caps feature to all characters in the encoding; this may result in
+changes to punctuation and numbers as well as letters. The "\-\-lf smcp"
+option will apply the small-caps feature only to letters, meaning
+characters with the "Letter" Unicode property.
+'
+.Sp
+.TP 5
+.BI \-\-subs\-filter " pattern"
+.TP 5
+.BI \-\-include\-subs " pattern"
+.TP 5
+.BI \-\-exclude\-subs " pattern"
+.TP 5
+.BI \-\-clear\-subs
+Limit the characters that
+.B otftotfm
+will substitute. Substitution is allowed on an input character if it
+matches at least one of the
+.B \-\-include
+patterns, and none of the
+.B \-\-exclude
+patterns. Each pattern applies to all following features, except that the
+.B \-\-clear
+option clears any accumulated patterns. The
+.BI \-\-subs\-filter " pattern"
+option acts like
+.B \-\-clear\-subs
+followed by
+.BI \-\-include\-subs " pattern\fR. "
+For pattern syntax, see CHARACTER PATTERNS, below.
+.Sp
+In the command line below, the '<Number>' pattern will force the "onum"
+feature to substitute only numbers (and not, for example, punctuation).
+The "salt" feature can still substitute any character.
+.nf
+ \fBotftotfm\fR \fB\-f\fRsalt \fB\-\-include\-subs\fR='<Number>' \fB\-f\fRonum \.\.\.
+.fi
+'
+.Sp
+.TP 5
+.BI \-E " fac\fR, " \-\-extend= fac
+Widen, or extend, the font by a factor of
+.IR fac .
+Like
+.M afm2tfm 1 's
+.B \-e
+option.
+'
+.Sp
+.TP 5
+.BI \-S " amt\fR, " \-\-slant= amt
+Oblique, or slant, the font by
+.IR amt .
+Like
+.M afm2tfm 1 's
+.B \-s
+option.
+'
+.Sp
+.TP 5
+.BI \-L " amt\fR, " \-\-letterspacing= amt
+Letterspace each character by
+.IR amt
+units, where 1000 units equals one em. The width of each character
+increases by
+.IR amt ,
+with half the space distributed to each sidebearing. Boundary-character
+kerns are added to maintain alignment at the ends of lines.
+'
+.Sp
+.TP 5
+.BR \-\-math\-spacing "[=\fIskewchar\fR]"
+Ignore the font's claimed character widths, deriving horizontal metrics
+from bounding boxes instead. This results in similar spacing as the
+Computer Modern Math Italic font, with increased sidebearings for letters
+like f and j.
+.Sp
+If you provide
+.IR skewchar ,
+a number between 0 and 255 or a single character, then
+.B otftotfm
+adds heuristically-derived kerns to the font that may improve accent
+positions in math mode. To get the benefits, you must tell TeX about the
+.I skewchar
+with a command like "\eskewchar\efont=\fIskewchar\fR".
+'
+.Sp
+.TP 5
+.BI "\-k " "N\fR, " \-\-min\-kern= N
+Only output kerning pairs whose absolute value is
+.IR N
+or larger. Larger minimum kerns make kerning less precise, but shrink the
+output TFM file. The default minimum kern is 2.0, or 0.002 em.
+'
+.Sp
+.TP 5
+.BI \-\-space\-factor= fac
+Scale the width of the inter-word space by a factor of
+.IR fac .
+'
+.Sp
+.TP 5
+.BI \-\-design\-size= size
+Set the output font's design size to
+.IR size ,
+a value in TeX points. This value is mostly just documentation, since LaTeX
+essentially ignores fonts' design sizes, but plain TeX may occasionally use
+the design size to decide how large a font should be. (Loading a font in
+TeX "at" a particular size effectively ignores the design size; loading a
+font plain or "scaled" by a given factor uses the design size.) The default
+is taken from the input font's optical size feature, or 10pt if it has no
+such feature.
+.PD
+'
+'
+.SS Encoding Options
+'
+.PD 0
+.TP 5
+.BI \-e " encoding\fR, " \-\-encoding= encoding
+Select the output metrics's base
+.M dvips 1
+encoding.
+.B Otftotfm
+will search for
+.IR encoding [.enc]
+the same way that
+.B dvips
+would, so you may not need to give a full pathname. Say
+.B \-e \-
+to start with the font's default encoding.
+See ENCODINGS, below,
+for more information.
+'
+.Sp
+.TP 5
+.BI \-\-literal\-encoding= encoding
+Select the
+.M dvips 1
+encoding used for the font. No glyph substitutions will be permitted, so
+the output encoding will equal the input encoding (and
+.B otftotfm
+will not generate an output encoding).
+'
+.Sp
+.TP 5
+.BI \-\-ligkern= command
+Execute the specified LIGKERN
+.IR command
+in addition to any in the encoding. For example, "\fB\-\-ligkern\fR 'T {L}
+h'" suppresses any T_h ligature in the font. You can supply multiple
+.B \-\-ligkern
+options. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-position= command
+Execute the specified POSITION
+.IR command
+in addition to any in the encoding. For example, "\fB\-\-position\fR 'T 10
+0 20'" adds ten units of space to either side of the "T" character. You
+can supply multiple
+.B \-\-position
+options. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-unicoding= command
+Execute the specified UNICODING
+.IR command
+in addition to any in the encoding. For example, "\fB\-\-unicoding\fR 'pi1
+=: uni03D6'" tells
+.B otftotfm
+to encode "/pi1" as U+03D6 GREEK PI SYMBOL. You can supply multiple
+.B \-\-unicoding
+options. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-no\-encoding\-commands
+Ignore any LIGKERN and/or UNICODING commands in the encoding file.
+'
+.Sp
+.TP 5
+.BI \-\-no\-default\-ligkern
+Don't include
+.BR otftotfm 's
+default LIGKERN commands.
+'
+.Sp
+.TP 5
+.BI \-\-coding\-scheme= scheme
+Set the font's TFM coding scheme to
+.IR scheme ,
+which must be a string less than 40 characters long containing no
+parentheses. The default is the encoding's PostScript name. Most tools
+ignore the coding scheme, so you probably don't need to worry about this
+command unless you are using fontinst.
+'
+.Sp
+.TP 5
+.BI \-\-boundary\-char= char
+Set the font's boundary character to
+.IR char ,
+which should either be a single non-digit character, or a number between \-1
+and 255. The default is taken from the encoding.
+'
+.Sp
+.TP 5
+.BI \-\-altselector\-char= char
+Set the font's alternate-selector character to
+.IR char ,
+which should either be a single non-digit character, or a number between \-1
+and 255. Use an alternate selector if you want to choose between different
+versions of a character from within a TeX file. For instance, say that your
+font provides three versions of "A". If you want to access them all, pick a
+character to be your alternate selector -- say "*". Then give
+.B otftotfm
+the
+.BR \-\-altselector\-char= '*'
+option. In TeX, "A" will produce the normal version, "A*" will produce the
+first alternate, and "A**" will produce the second alternate. Furthermore,
+"s*t" will activate any discretionary "s_t" ligature in the font. The
+default alternate-selector character is taken from the encoding.
+.Sp
+The
+.B \-\-altselector\-char
+mechanism uses the features specified by
+.BR \-\-altselector\-feature
+options. You don't need to turn on those features if you use
+.BR \-\-altselector .
+.Sp
+See Sivan Toledo's article cited in the SEE ALSO section for more
+information.
+'
+.Sp
+.TP 5
+.BI \-\-altselector\-feature= feature
+Activate the feature named
+.I feature
+for the
+.B \-\-altselector\-char
+mechanism. Give this option multiple times to activate multiple
+features. This option activates features only for use with
+.BR \-\-altselector\-char ;
+use the
+.B \-\-feature
+option to activate features globally. Defaults to the
+.I salt
+and
+.I dlig
+features.
+'
+.Sp
+.TP 5
+.BI \-\-alternates\-filter= pattern
+.TP 5
+.BI \-\-include\-alternates= pattern
+.TP 5
+.BI \-\-exclude\-alternates= pattern
+.TP 5
+.BI \-\-clear\-alternates
+Limit the alternate characters that
+.B otftotfm
+will select. An alternate is used if it matches at least one of the
+.B \-\-include
+patterns, and none of the
+.B \-\-exclude
+patterns. Each pattern applies to all following features, except that the
+.B \-\-clear
+option clears any accumulated patterns. The
+.BI \-\-alternates\-filter " pattern"
+option acts like
+.B \-\-clear\-alternates
+followed by
+.BI \-\-include\-alternates " pattern\fR. "
+For pattern syntax, see CHARACTER PATTERNS, below.
+.Sp
+OpenType fonts can have many alternates per character, most of which aren't
+interesting. For example, the character "a" in WarnockPro-Regular has five
+alternates, "ordfeminine", "Asmall", "asuperior", "a.end", and
+"orn.013". The
+.B \-\-altselector\-char
+option lets you cycle through these alternates, but it's better to leave
+out the ones you don't want, to avoid overfull encodings. Thus, if you were
+only interested in ".end" variants, you might supply an
+.BR \-\-include\-alternates= "'*.end'"
+option.
+.Sp
+In the command line below, the '*.end' pattern will apply to "aalt"
+alternates, but not to "salt" alternates.
+.nf
+ \fBotftotfm\fR \fB\-f\fRsalt \fB\-\-include\-alternates\fR='*.end' \fB\-f\fRaalt \.\.\.
+.fi
+'
+.PD
+'
+'
+.SS Automatic Mode Options
+'
+.PD 0
+.TP 5
+.BI \-a "\fR, " \-\-automatic
+Select automatic mode.
+'
+.Sp
+.TP 5
+.BI \-v " vendor\fR, " \-\-vendor= vendor
+Set the font vendor name, which is used to locate files within the TDS.
+Defaults to "lcdftools".
+.Sp
+In automatic mode, TeX and friends will generally find required font files
+independently of the vendor you select.
+'
+.Sp
+.TP 5
+.BI \-\-typeface= typeface
+Set the font typeface name, which is used to locate files within the TDS.
+Defaults to the current font's family name with unsuiable characters
+removed.
+'
+.Sp
+.TP 5
+.BI \-\-no\-type1
+Do not use
+.M cfftot1 1
+to create Type 1 fonts corresponding to the OpenType input fonts.
+'
+.Sp
+.TP 5
+.BI \-\-no\-dotlessj
+Do not use
+.M t1dotlessj 1
+to create a special dotless-j font when the input font doesn't have
+dotless-j.
+'
+.Sp
+.TP 5
+.BI \-\-no\-updmap
+Do not run an
+.M updmap 1
+program. This can be useful if you're installing a bunch of fonts; it is
+much faster to run
+.B updmap
+once, at the end, than to run it once per font.
+.PD
+'
+'
+.SS Output Options
+.PD 0
+.TP 5
+.BI \-n " texname\fR, " \-\-name= texname
+Set the TeX name of the output font, which is used in font map files and,
+in automatic mode, to generate the output filename. The default is derived
+from the OpenType font's name and the features you selected.
+'
+.Sp
+.TP 5
+.BI \-p "\fR, " \-\-pl
+Output human-readable PL and VPL metrics, not binary TFM and VF metrics.
+Note:
+.BR Otftotfm 's
+PL and VPL output files are legal, but the
+.B fontinst
+program may not accept them (it has a picky parser). Make sure to supply a
+.BR \-\-coding\-scheme ;
+if that doesn't help, run the TFM output through
+.M tftopl 1 .
+'
+.Sp
+.TP 5
+.BI \-\-no\-virtual
+Do not generate virtual fonts (VFs and VPLs).
+.B Otftotfm
+will warn if the selected font features cannot be implemented without
+virtual fonts.
+'
+.Sp
+.TP 5
+.BI \-\-no\-encoding
+Do not generate an encoding file.
+'
+.Sp
+.TP 5
+.BR \-\-output\-encoding [=\fIfile\fR]
+Only generate an encoding file; do not generate any other output. The
+encoding file is written to
+.IR file ,
+or to standard output if no
+.I file
+argument is supplied.
+'
+.Sp
+.TP 5
+.BI \-\-no\-map
+Do not generate a font map line for the font.
+.PD
+'
+'
+.SS File Location Options
+.PD 0
+.TP 5
+.BI \-\-tfm\-directory= dir
+.TP 5
+.BI \-\-pl\-directory= dir
+.TP 5
+.BI \-\-vf\-directory= dir
+.TP 5
+.BI \-\-vpl\-directory= dir
+.TP 5
+.BI \-\-encoding\-directory= dir
+.TP 5
+.BI \-\-type1\-directory= dir
+Set the directory used for various output types. Each directory may be set
+by an environment variable, and defaults to a TDS directory in automatic
+mode, or to "." otherwise. Environment variable names and default TDS
+locations are described in the Automatic Mode section above.
+'
+.Sp
+.TP 5
+.BI \-\-map\-file= filename
+Set file in which
+.B otftotfm
+will write a font map
+line for the font. The default is the standard output in manual mode, and
+"TEXMF/fonts/map/dvips/\fIvendor\fR/\fIvendor\fR.map" (or
+"TEXMF/dvips/\fIvendor\fR/\fIvendor\fR.map" on older installations) in
+automatic mode.
+.PD
+'
+'
+.SS Miscellaneous Options
+.PD 0
+.TP 5
+.BI \-\-glyphlist= file
+Use
+.I file
+as the Adobe glyph list, which helps translate glyph names to Unicode code
+points. See ENCODINGS, below, for more information.
+'
+.Sp
+.TP 5
+.BR \-V ", " \-\-verbose
+Write progress messages to standard error.
+'
+.Sp
+.TP 5
+.BR \-\-no\-create
+Do not create or modify any files. Instead, write messages about the
+program's hypothetical progress to standard error.
+'
+.Sp
+.TP 5
+.BR \-\-force
+Generate all files, even if it looks like versions are already installed.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BI \-\-kpathsea\-debug= flags
+Set path searching debugging flags. See the
+.I Kpathsea
+manual for details.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH ENCODINGS
+.B Otftotfm
+interprets encoding files as Unicode. For example, if an input encoding
+has "/dotlessi" at position 10, then
+.B otftotfm
+detects that the user wants to encode Unicode character U+0131 LATIN SMALL
+LETTER DOTLESS I at position 10. The output encoding will use whatever
+glyph the font suggests for that Unicode character, given the collection of
+features you chose.
+.PP
+You can control this process with "UNICODING" comments in the input
+encoding file. UNICODING comments have the following format:
+.nf
+ % UNICODING \fIglyph\fR =: \fIchoice1\fR [\fIchoice2\fR ...] ;
+.fi
+\fIGlyph\fR and the
+.IR choice s
+are PostScript glyph names. This comment tells
+.B otftotfm
+that the glyph named
+.I glyph
+translates into the first Unicode value in the
+.I choice
+list that has a character in the font. For example,
+.nf
+ % UNICODING pi1 =: uni03D6 ;
+.fi
+tells otftotfm that the character "/pi1" encodes as U+03D6 GREEK PI SYMBOL,
+and
+.nf
+ % UNICODING Delta =: uni0394 uni2206 ;
+.fi
+tells it that U+0394 GREEK CAPITAL LETTER DELTA should be preferred to
+U+2206 INCREMENT as an encoding for "/Delta". You can also supply regular
+glyph names:
+.nf
+ % UNICODING Delta =: Deltagreek Delta ;
+.fi
+.B Otftotfm
+uses Adobe's
+.I glyphlist.txt
+file to translate glyph names to Unicode; see
+.IR http://partners.adobe.com/asn/developer/type/unicodegn.html .
+.LP
+You can map a glyph to nothing to remove that glyph from the input
+encoding. This is useful to remove optional characters; for instance:
+.nf
+ % UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
+.fi
+The f-ligatures will be added back to the encoding, preferably at their
+original locations, if some font feature requires them.
+.LP
+Map a glyph to 'emptyslot' if you don't want
+.B otftotfm
+to use the slot for a ligature character. For example, given this
+UNICODING,
+.nf
+ % UNICODING ff =: ff emptyslot ;
+.fi
+.B otftotfm
+will leave the 'ff' encoding slot unused if the font has no 'ff' glyph.
+(Note that most OpenType fonts provide a visible representation for unused
+encoding slots, namely a box with an X inside.)
+.LP
+Each UNICODING line can contain multiple commands, separated by spaced
+semicolons.
+.PP
+LIGKERN comments in the encoding can add ligatures and inhibit kerns, as in
+.M afm2tfm 1 .
+To add a ligature, say:
+.nf
+ % LIGKERN \fIglyph1\fR \fIglyph2\fR =: \fIresult\fR ;
+.fi
+The "=:" operator indicates a normal ligature, where both the input glyphs
+are removed and replaced by
+.IR result .
+To preserve the left-hand glyph, for an effect like "\fIglyph1\fR
+\fIglyph2\fR =: \fIglyph1\fR \fIresult\fR", use "|=:" instead; to preserve
+the right-hand glyph, use "=:|". The other five ligature operators are not
+yet supported.
+To remove all kerns between two characters, say:
+.nf
+ % LIGKERN \fIglyph1\fR {} \fIglyph2\fR ;
+.fi
+A "*" matches any character, so
+.nf
+ % LIGKERN a {} * ;
+.fi
+removes all kerns with "a" as the left-hand character, and
+.nf
+ % LIGKERN * {} * ;
+.fi
+removes all kerns.
+.PP
+.B Otftotfm
+also supports extended syntax for setting kern values and inhibiting
+ligatures. To add an \fIn\fR-unit kern between two glyphs, say:
+.nf
+ % LIGKERNX \fIglyph1\fR {\fIn\fR} \fIglyph2\fR ;
+.fi
+where \fIn\fR is an integer. This:
+.nf
+ % LIGKERNX \fIglyph1\fR {L} \fIglyph2\fR ;
+.fi
+inhibits any ligature between
+.I glyph1
+and
+.IR glyph2 .
+"{LK}" and "{KL}" inhibit both ligatures and kerns.
+.PP
+You can set the
+.B \-\-boundary\-char
+and
+.B \-\-altselector\-char
+from an encoding file with commands like this:
+.nf
+ % LIGKERN || = \fIboundarychar\fR ;
+ % LIGKERNX ^^ = \fIaltselectorchar\fR ;
+.fi
+As with UNICODING, each LIGKERN or LIGKERNX line can contain multiple
+commands, separated by spaced semicolons.
+.PP
+The POSITION command shifts a glyph within its bounding box. The syntax is
+.nf
+ % POSITION \fIglyph\fR \fIpdx\fR \fIpdy\fR \fIadx\fR ;
+.fi
+This will add
+.I pdx
+units of space to
+.IR glyph 's
+left edge; raise it up by
+.I pdy
+units; and add
+.I adx
+units to its width. For example, to add 10 units of space to either side
+of the "T" glyph, supply
+.nf
+ % POSITION T 10 0 20
+.fi
+To move the "degree" symbol up by 20 units, supply
+.nf
+ % POSITION degree 0 20 0
+.fi
+.PP
+Finally, the CODINGSCHEME command specifies a default
+.B \-\-coding\-scheme
+for the encoding; for example:
+.nf
+ % CODINGSCHEME EXTENDED TEX FONT ENCODING
+.fi
+.PP
+The
+.BR \-\-unicoding ,
+.BR \-\-ligkern ,
+and
+.B \-\-position
+options let you add virtual UNICODING, LIGKERN/LIGKERNX, and POSITION
+comments to an encoding.
+.PP
+.B Otftotfm
+has a default set of eight ligatures, namely:
+.nf
+ space l =: lslash ; space L =: Lslash ;
+ question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+ hyphen hyphen =: endash ; endash hyphen =: emdash ;
+ quoteleft quoteleft =: quotedblleft ;
+ quoteright quoteright =: quotedblright
+.fi
+LIGKERN commands in the encoding file and
+.B \-\-ligkern
+options can override these defaults, or supply the
+.B \-\-no\-default\-ligkern
+option to turn them off.
+.PP
+Some common encoding files have commands that are inappropriate for
+OpenType fonts. For example, "t1.enc" hard-codes f-ligatures, which can
+cause problems with small-cap fonts. Supply the
+.B \-\-no\-encoding\-commands
+option to ignore all commands from the encoding file. Explicit
+.B \-\-ligkern
+and
+.B \-\-unicoding
+options are processed in any case.
+'
+.SS New Glyphs
+.PP
+New glyphs, such as ligatures and contextual substitutions, are added to
+the encoding in any empty spaces, using their original locations when
+possible. If the encoding doesn't have enough space for all new glyphs,
+shorter ligatures composed of unaccented letters get precedence.
+'
+.SS Synthetic Glyphs
+.PP
+.B Otftotfm
+can synthesize some glyphs using virtual font manipulations, if a required
+glyph is not available in the input font. Specifically, it will synthesize:
+.Sp
+.PD 0
+.TP 22
+cwm
+TeX's compound word mark (a zero-width "strut" rule with height equal to the font's x-height)
+.TP
+ascendercompwordmark
+"cwm" with height equal to the font's ascenders
+.TP
+capitalcompwordmark
+"cwm" with height equal to the font's capitals
+.TP
+visualspace
+A square cup used to represent spaces
+.TP
+dotlessj
+A dotless "j", synthesized with
+.M t1dotlessj 1
+.TP
+dblbracketleft
+Kerned version of "[["
+.TP
+dblbracketright
+Kerned version of "]]"
+.TP
+bardbl
+The parallel symbol "||"
+.TP
+asteriskmath
+Vertically-centered "*"
+.TP
+twelveudash
+2/3-em-wide dash
+.TP
+threequartersemdash
+3/4-em-wide dash
+.TP
+centigrade
+"(degrees)C"
+.TP
+interrobang
+Combined "?!" symbol
+.TP
+interrobangdown
+Inverted interrobang
+.TP
+pertenthousand
+Per-ten-thousand sign (% with two extra 0s)
+.TP
+IJ
+"IJ" ligature
+.TP
+ij
+"ij" ligature
+.TP
+Germandbls
+"SS" (a capital sharp-s)
+.TP
+SSsmall
+Small-capital version of "SS"
+.TP
+FFsmall
+Small-capital version of "FF"
+.TP
+FIsmall
+Small-capital version of "FI"
+.TP
+FLsmall
+Small-capital version of "FL"
+.TP
+FFIsmall
+Small-capital version of "FFI"
+.TP
+FFIsmall
+Small-capital version of "FFL"
+.PD
+'
+'
+.SH "GLYPH PATTERNS"
+.LP
+The
+.BR \-\-include\-subs
+and
+.BR \-\-include\-alternates
+options, and their
+.B \-\-exclude
+variants, accept the following types of pattern.
+.BUP
+Glyph names. Example: "Aacute". Use
+.M otfinfo 1 's
+.B \-g
+option to see a font's glyph names, and "\fBcfftot1\fR \fIfont\fR.otf |
+\fBt1testpage\fR" to generate a PostScript file showing each glyph.
+.BUP
+Glyph name patterns using the shell-style glob-matching rules: "*" matches
+any number of characters, "?" matches any single character, and "[...]"
+matches any character in a set. Example: "*.end".
+.BUP
+Unicode category properties in angle brackets. Examples: "<Letter>",
+"<UppercaseLetter>", "<Lu>". The complete list of both short and long
+names: Letter/L, UppercaseLetter/Lu, LowercaseLetter/Ll,
+TitlecaseLetter/Lt, ModifierLetter/Lm, OtherLetter/Lo; Number/N,
+DecimalNumber/Nd, LetterNumber/Nl, OtherNumber/No; Punctuation/P,
+ConnectorPunctuation/Pc, DashPunctuation/Pd, OpenPunctuation/Ps,
+ClosePunctuation/Pe, InitialPunctuation/Pi, FinalPunctuation/Pf,
+OtherPunctuation/Po; Symbol/S, MathSymbol/Sm, CurrencySymbol/Sc,
+ModifierSymbol/Sk, OtherSymbol/So; Mark/M, SpacingMark/Mc,
+EnclosingMark/Me, NonspacingMark/Mn; Separator/Z, SpaceSeparator/Zs,
+LineSeparator/Zl, ParagraphSeparator/Zp; Other/C, Surrogate/Cs, Format/Cf,
+Control/Cc, PrivateUse/Co, Unassigned/Cn. Category values current as of
+Unicode 4.0.
+.BUP
+Unicode ranges. Example: "U+007f-U+008C".
+.PP
+The "!" prefix negates a pattern, and you can separate multiple patterns by
+spaces.
+'
+.SH "FEATURE DIRECTORY"
+.LP
+This section lists features common to Western OpenType fonts and describes
+how
+.B otftotfm
+handles them for common fonts. Please send the author mail if
+.B otftotfm
+does not handle a feature you need, or you believe it handles some feature
+incorrectly.
+.Sp
+.PD 0
+.TP 5
+.IR aalt ", Access All Alternates"
+Lets the user choose between all available alternate forms for a character.
+This includes things like superscript and subscript variants, different
+styles (swash, for example), and even ornaments. The
+.BR \-\-altselector\-feature= aalt
+option can help an
+.BR \-\-altselector\-char
+provide useful access to alternates, but the
+.I aalt
+feature isn't usually useful on its own. Try the
+.IR salt " and " calt
+features instead.
+.TP 5
+.IR c2sc ", Small Capitals From Capitals"
+Replaces capital letters with small capitals: a sort of converse of the
+more conventional
+.I smcp
+feature, which replaces lower-case letters with small capitals. Supported.
+.TP 5
+.IR calt ", Contextual Alternates"
+Lets the user choose between context-appropriate swash forms for each
+character. For example, given the word "DREW" in a cursive typeface, the "R
+E W" might be translated to calmer forms than the initial "D". There may be
+more than one choice for a given letter, in which case the user should be
+able to select among them. TeX can't support complex contextual alternates,
+or alternate selection, but
+.B otftotfm
+supports some fonts quite well. The input encoding should have lots of
+empty space for variants, and it should specify a boundary character. See
+also
+.IR cswh .
+.TP 5
+.IR case ", Case-Sensitive Forms"
+Shifts punctuation marks up to a position that works well with
+all-capital-letter sequences. For example, the hyphen character, which
+generally centers vertically on the x-height, is raised up to center
+vertically on a capital letter. Also replaces text figures with lining
+figures, and accent marks with forms more appropriate for capitals.
+Supported.
+.TP 5
+.IR cpsp ", Capital Spacing"
+Adds a bit of space on either side of each capital letter. Supported.
+(However, the OpenType tag registry suggests that
+.I cpsp
+be on by default, but applying to all-caps text only; TeX cannot easily
+implement that contextual intelligence.)
+.TP 5
+.IR cswh ", Contextual Swash"
+Lets the user choose between context-appropriate swash forms for each
+character. For example, in the words "Ab AC", the first "A" might be
+translated to a swash form, while the second might not. There may be more
+than one choice for a given letter, in which case the user should be able
+to select among them. TeX can't support complex contextual swashes, or
+alternate selection, but
+.B otftotfm
+supports some fonts quite well. The input encoding should have lots of
+empty space for swash variants, and it should specify a boundary
+character. See also
+.IR calt .
+.TP 5
+.IR dlig ", Discretionary Ligatures"
+Activates uncommon ligatures, such as "c_t", "s_p", and "s_t". Supported.
+.TP 5
+.IR dnom ", Denominators"
+Replaces digits and some punctuation marks with smaller forms sitting on
+the baseline, intended for fraction denominators. Supported.
+.TP 5
+.IR fina ", Terminal Forms"
+Substitutes appropriate forms for letters occurring at the ends of words.
+This feature doesn't select swash variants; it's intended for normal use,
+and the specification recommends that it be on by default. Partially
+supported: TeX will only treat spaces as the ends of words, where a correct
+implementation would probably include punctuation too. See
+.IR cswh
+for selecting swash variants active at the ends of words.
+.TP 5
+.IR frac ", Fractions"
+Replaces simple sequences like "1/2" with nice-looking fractions.
+Supported, but beware: many fonts will translate "11/32" into "1" + "1/3" +
+"2".
+.TP 5
+.IR hist ", Historical Forms"
+Replaces characters with historical variants. Usually, this means at least
+translating regular "s" to long "s". Supported.
+.TP 5
+.IR kern ", Kerning"
+Adjusts the space between characters (pair kerning). Generally supported,
+and you should probably turn it on.
+.TP 5
+.IR liga ", Standard Ligatures"
+Activates common ligatures, such as "f_f", "f_i", "f_f_j", and (in some
+Adobe fonts) "T_h". Generally supported, and you should probably turn it
+on.
+.TP 5
+.IR lnum ", Lining Figures"
+Uses lining figures, the set of digits that are all about as high as
+capital letters.
+Supported. Compare
+.IR onum ;
+see also
+.IR pnum
+and
+.IR tnum.
+.TP 5
+.IR numr ", Numerators"
+Replaces digits and some punctuation marks with smaller, raised forms
+intended for fraction numerators. Supported, but not usually useful.
+.TP 5
+.IR onum ", Oldstyle Figures"
+Uses old-style figures, also known as text figures. This is the set of
+digits that have ascenders and descenders like lower-case letters.
+Supported. Compare
+.IR lnum ;
+see also
+.IR pnum
+and
+.IR tnum .
+.TP 5
+.IR ordn ", Ordinals"
+Designed for Spanish and French. Replaces ordinal numbers, such as "2.o",
+with forms where the "o" is raised, and replaces the sequence "No" with an
+integrated glyph. Supported.
+.TP 5
+.IR ornm ", Ornaments"
+Replaces some alphabetic characters in the font with ornaments, and links
+the bullet character to a set of all bullet-like ornaments, from which the
+user can choose. Partially supported: TeX can handle alphabetic
+substitutions, but not bullet choice.
+.TP 5
+.IR pnum ", Proportional Figures"
+Digits will have different widths. Supported. Compare
+.IR tnum ;
+see also
+.IR lnum
+and
+.IR onum.
+.TP 5
+.IR salt ", Stylistic Alternates"
+Lets the user choose between stylistic alternate forms for a character.
+The
+.BR \-\-altselector\-char
+mechanism provides useful access to this feature. If you turn on
+.IR salt
+globally,
+.B otftotfm
+takes the first alternate form whenever there's more than one choice. See
+also
+.IR aalt
+and
+.IR ss01 ;
+.IR salt
+is generally more useful than
+.IR aalt
+for TeX, since it refers exclusively to stylistic alternates.
+.TP 5
+.IR sinf ", Scientific Inferiors"
+Replaces digits and some punctuation marks with smaller, lowered forms
+intended for subscripts. Supported.
+.TP 5
+.IR size ", Optical Size"
+This feature stores information about the range of optical sizes for which
+the font was intended. There is no point in selecting it with
+.BR otftotfm ,
+since it should not change the font's appearance in any way.
+.TP 5
+.IR smcp ", Small Capitals"
+Replaces lower-case letters with small capitals. Supported. Compare
+.IR c2sc .
+.TP 5
+.IR ss01 - ss20 ", Stylistic Sets 1-20"
+Replaces characters with a uniform set of stylistic alternates. Differs
+from features like
+.I salt
+in that a Stylistic Set is uniform: an
+.I ssXX
+feature should never involve selection from a set of possible alternate
+characters. Supported.
+.TP 5
+.IR sups ", Superscript"
+Replaces digits, some punctuation marks, and some lower-case letters with
+smaller, raised forms intended for superscripts. Supported.
+.TP 5
+.IR swsh ", Swash"
+Activates all swash forms for each character. There may be more than one
+swash form, in which case
+.B otftotfm
+will pick the first one listed. Supported, except that swash variants
+other than the first are inaccessible.
+.TP 5
+.IR tnum ", Tabular Figures"
+All digits will have the same width, so that tables and the like will align
+visually. Supported. Compare
+.IR pnum ;
+see also
+.IR lnum
+and
+.IR onum.
+.TP 5
+.IR zero ", Slashed Zero"
+Replaces the zero character with a slashed zero. Supported.
+.PD
+'
+.SH "DIAGNOSTICS AND TROUBLESHOOTING"
+'
+.TP 5
+no writable directory found in $TEXMF
+'
+.B Otftotfm
+could not find a writable directory in your $TEXMFVAR or $TEXMF path. Did
+you create a
+.I $HOME/.texmf-var
+or
+.I $HOME/texmf
+directory? If so, run the command "kpsewhich \-\-expand\-path='$TEXMF'" to
+verify that directory is not being found. You may need to set your TEXMF
+environment variable, to '{!!'"$HOME"'/texmf,!!$TEXMFMAIN}', for instance
+(note the different kinds of quotes; on my machine, this expands to
+\&'{!!/home/kohler/texmf,!!$TEXMFMAIN}').
+'
+.TP 5
+\&'\fIchar\fR' has no encoding, ignoring kern removal
+.PD 0
+.TP 5
+(or ligature removal, lig/kern removal, or ligature)
+.PD
+'
+These messages indicate a slight problem with your encoding file: one of
+the LIGKERN commands referred to a character not present in the encoding.
+This might be due to a misspelling in the LIGKERN command or the encoding
+file, or it might be an oversight. Either fix the encoding file or ignore
+the warning.
+'
+.TP 5
+can't map '\fIchar\fR' to Unicode
+'
+Another encoding file problem: One of the glyph names in an UNICODING block
+could not be converted to Unicode. This is problematic since UNICODING
+exists wholly to translate glyph names into Unicode. Fix the encoding file
+or ignore the warning.
+'
+.TP 5
+not enough room in encoding, ignoring \fIN\fR glyph(s) ...
+'
+There wasn't space in the encoding for all the glyphs referred to by the
+features you selected. For example, maybe the font had more ligatures than
+there were empty slots in the encoding. Fix this warning by selecting fewer
+features, or by using an encoding with more empty slots, such as the 7t.enc
+encoding distributed with
+.BR otftotfm .
+'
+.SH "FREQUENTLY ASKED QUESTIONS"
+.TP 5
+How can I get a small-caps "SS" in place of the German sharp-S?
+'
+Supply the option "\fB\-\-unicoding\fR 'germandbls =: SSsmall'".
+'
+.TP 5
+How can I prevent f-ligatures from forming in a small-caps font?
+'
+This should happen automatically, but some overzealous encoding files add
+f-ligatures even when the font doesn't request them. Try the
+"\fB\-\-no\-encoding\-commands\fR" option if this is a problem for you.
+'
+.TP 5
+\fBOtftotfm\fR seems to take a long time.
+'
+Use the
+.B \-V
+option to see what it's doing. Often the culprit is the
+.M updmap 1
+program; if you're planning to run
+.B otftotfm
+multiple times, give it the
+.B \-\-no\-updmap
+option and run
+.B updmap
+manually when you're done.
+'
+.SH "BUGS"
+.\" .LP
+.\" Presumably some context-sensitive positionings and ligatures could be
+.\" implemented with TeX's boundary character, but
+.\" .B otftotfm
+.\" doesn't do that yet.
+.LP
+See the documentation for
+.B \-\-pl
+above if you have problems running
+.BR otftotfm 's
+output through
+.BR fontinst .
+'
+.SH "SEE ALSO"
+.LP
+.M pltotf 1 ,
+.M tftopl 1 ,
+.M vptovf 1 ,
+.M afm2tfm 1 ,
+.M dvips 1 ,
+.M cfftot1 1 ,
+.M otfinfo 1 ,
+.M t1dotlessj 1 ,
+.M t1testpage 1 ,
+.M kpsewhich 1 ,
+.M updmap 1
+.LP
+.I "Adobe Type 1 Font Format"
+.LP
+Adobe Technical Notes #5176,
+.IR "The Compact Font Format Specification" ,
+and #5177,
+.I "The Type 2 Charstring Format"
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+.LP
+.IR "A Directory Structure for TeX Files" ,
+http://www.tug.org/tds/
+.LP
+.IR "Kpathsea: A library for path searching" ,
+http://www.tug.org/kpathsea/
+.LP
+Sivan Toledo,
+.IR "Exploiting Rich Fonts" ,
+TUGboat 21(2), 2000,
+http://www.tug.org/TUGboat/Articles/tb21-2/tb67tole.pdf
+.LP
+Michel Goossens, Frank Mittelbach, and Alexander Samarin,
+.IR "The LaTeX Companion"
+(for information on the .fd file format).
+'
+.SH AUTHOR
+Eddie Kohler (kohler@cs.ucla.edu)
+.PP
+Thanks to Karl Berry, Marco Kuhlmann, Adam Lindsay, Bruce D'Arcus, Thomas
+Esser, Claire Connelly, Nelson H.F. Beebe, and Ryuji Suzuki for
+suggestions, bug reports, and help. Particular thanks to Achim Blumensath
+and Michael Zedler for suggestions and patches, some of them extensive.
+
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.cc b/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.cc
new file mode 100644
index 00000000000..d5794c5886d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.cc
@@ -0,0 +1,1945 @@
+/* otftotfm.cc -- driver for translating OpenType fonts to TeX metrics
+ *
+ * Copyright (c) 2003-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifdef WIN32
+# define _USE_MATH_DEFINES
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1bounds.hh>
+#include <efont/otfcmap.hh>
+#include <efont/otfgsub.hh>
+#include "glyphfilter.hh"
+#include "metrics.hh"
+#include "dvipsencoding.hh"
+#include "automatic.hh"
+#include "secondary.hh"
+#include "kpseinterface.h"
+#include "util.hh"
+#include "otftotfm.hh"
+#include "md5.h"
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/hashmap.hh>
+#include <lcdf/straccum.hh>
+#include <efont/cff.hh>
+#include <efont/otf.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <signal.h>
+#include <algorithm>
+#include <math.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUERY_SCRIPTS_OPT 303
+#define QUERY_FEATURES_OPT 304
+#define KPATHSEA_DEBUG_OPT 305
+
+#define SCRIPT_OPT 311
+#define FEATURE_OPT 312
+#define ENCODING_OPT 313
+#define LITERAL_ENCODING_OPT 314
+#define EXTEND_OPT 315
+#define SLANT_OPT 316
+#define LETTERSPACE_OPT 317
+#define LIGKERN_OPT 318
+#define CODINGSCHEME_OPT 319
+#define UNICODING_OPT 320
+#define BOUNDARY_CHAR_OPT 321
+#define DESIGN_SIZE_OPT 322
+#define MINIMUM_KERN_OPT 323
+#define ALTSELECTOR_CHAR_OPT 324
+#define INCLUDE_ALTERNATES_OPT 325
+#define EXCLUDE_ALTERNATES_OPT 326
+#define CLEAR_ALTERNATES_OPT 327
+#define ALTSELECTOR_FEATURE_OPT 328
+#define DEFAULT_LIGKERN_OPT 329
+#define NO_ECOMMAND_OPT 330
+#define LETTER_FEATURE_OPT 331
+#define INCLUDE_SUBS_OPT 332
+#define EXCLUDE_SUBS_OPT 333
+#define CLEAR_SUBS_OPT 334
+#define SUBS_FILTER_OPT 335
+#define ALTERNATES_FILTER_OPT 336
+#define SPACE_FACTOR_OPT 337
+#define MATH_SPACING_OPT 338
+#define POSITION_OPT 339
+
+#define AUTOMATIC_OPT 341
+#define FONT_NAME_OPT 342
+#define QUIET_OPT 343
+#define GLYPHLIST_OPT 344
+#define VENDOR_OPT 345
+#define TYPEFACE_OPT 346
+#define NOCREATE_OPT 347
+#define VERBOSE_OPT 348
+#define FORCE_OPT 349
+
+#define VIRTUAL_OPT 351
+#define PL_OPT 352
+#define TFM_OPT 353
+#define MAP_FILE_OPT 354
+#define OUTPUT_ENCODING_OPT 355
+
+#define DIR_OPTS 360
+#define ENCODING_DIR_OPT (DIR_OPTS + O_ENCODING)
+#define TFM_DIR_OPT (DIR_OPTS + O_TFM)
+#define PL_DIR_OPT (DIR_OPTS + O_PL)
+#define VF_DIR_OPT (DIR_OPTS + O_VF)
+#define VPL_DIR_OPT (DIR_OPTS + O_VPL)
+#define TYPE1_DIR_OPT (DIR_OPTS + O_TYPE1)
+
+#define NO_OUTPUT_OPTS 380
+#define NO_ENCODING_OPT (NO_OUTPUT_OPTS + G_ENCODING)
+#define NO_TYPE1_OPT (NO_OUTPUT_OPTS + G_TYPE1)
+#define NO_DOTLESSJ_OPT (NO_OUTPUT_OPTS + G_DOTLESSJ)
+#define NO_UPDMAP_OPT (NO_OUTPUT_OPTS + G_UPDMAP)
+
+#define CHAR_OPTTYPE (Clp_FirstUserType)
+
+static Clp_Option options[] = {
+
+ { "script", 's', SCRIPT_OPT, Clp_ArgString, 0 },
+ { "feature", 'f', FEATURE_OPT, Clp_ArgString, 0 },
+ { "letter-feature", 0, LETTER_FEATURE_OPT, Clp_ArgString, 0 },
+ { "lf", 0, LETTER_FEATURE_OPT, Clp_ArgString, 0 },
+ { "include-substitutions", 0, INCLUDE_SUBS_OPT, Clp_ArgString, 0 },
+ { "exclude-substitutions", 0, EXCLUDE_SUBS_OPT, Clp_ArgString, 0 },
+ { "clear-substitutions", 0, CLEAR_SUBS_OPT, 0, 0 },
+ { "substitution-filter", 0, SUBS_FILTER_OPT, Clp_ArgString, 0 },
+ { "subs-filter", 0, SUBS_FILTER_OPT, Clp_ArgString, 0 },
+ { "encoding", 'e', ENCODING_OPT, Clp_ArgString, 0 },
+ { "literal-encoding", 0, LITERAL_ENCODING_OPT, Clp_ArgString, 0 },
+ { "extend", 'E', EXTEND_OPT, Clp_ArgDouble, 0 },
+ { "slant", 'S', SLANT_OPT, Clp_ArgDouble, 0 },
+ { "letterspacing", 'L', LETTERSPACE_OPT, Clp_ArgInt, 0 },
+ { "letterspace", 'L', LETTERSPACE_OPT, Clp_ArgInt, 0 },
+ { "min-kern", 'k', MINIMUM_KERN_OPT, Clp_ArgDouble, 0 },
+ { "minimum-kern", 'k', MINIMUM_KERN_OPT, Clp_ArgDouble, 0 },
+ { "kern-precision", 'k', MINIMUM_KERN_OPT, Clp_ArgDouble, 0 },
+ { "ligkern", 0, LIGKERN_OPT, Clp_ArgString, 0 },
+ { "position", 0, POSITION_OPT, Clp_ArgString, 0 },
+ { "no-encoding-commands", 0, NO_ECOMMAND_OPT, 0, Clp_OnlyNegated },
+ { "default-ligkern", 0, DEFAULT_LIGKERN_OPT, 0, Clp_Negate },
+ { "unicoding", 0, UNICODING_OPT, Clp_ArgString, 0 },
+ { "coding-scheme", 0, CODINGSCHEME_OPT, Clp_ArgString, 0 },
+ { "boundary-char", 0, BOUNDARY_CHAR_OPT, CHAR_OPTTYPE, 0 },
+ { "altselector", 0, ALTSELECTOR_CHAR_OPT, CHAR_OPTTYPE, Clp_PreferredMatch },
+ { "altselector-char", 0, ALTSELECTOR_CHAR_OPT, CHAR_OPTTYPE, 0 },
+ { "altselector-feature", 0, ALTSELECTOR_FEATURE_OPT, Clp_ArgString, 0 },
+ { "design-size", 0, DESIGN_SIZE_OPT, Clp_ArgDouble, 0 },
+ { "include-alternates", 0, INCLUDE_ALTERNATES_OPT, Clp_ArgString, 0 },
+ { "exclude-alternates", 0, EXCLUDE_ALTERNATES_OPT, Clp_ArgString, 0 },
+ { "clear-alternates", 0, CLEAR_ALTERNATES_OPT, 0, 0 },
+ { "alternates-filter", 0, ALTERNATES_FILTER_OPT, Clp_ArgString, 0 },
+ { "space-factor", 0, SPACE_FACTOR_OPT, Clp_ArgDouble, 0 },
+ { "math-spacing", 0, MATH_SPACING_OPT, CHAR_OPTTYPE, Clp_Negate | Clp_Optional },
+
+ { "pl", 'p', PL_OPT, 0, 0 },
+ { "virtual", 0, VIRTUAL_OPT, 0, Clp_Negate },
+ { "no-encoding", 0, NO_ENCODING_OPT, 0, Clp_OnlyNegated },
+ { "no-type1", 0, NO_TYPE1_OPT, 0, Clp_OnlyNegated },
+ { "no-dotlessj", 0, NO_DOTLESSJ_OPT, 0, Clp_OnlyNegated },
+ { "no-updmap", 0, NO_UPDMAP_OPT, 0, Clp_OnlyNegated },
+ { "map-file", 0, MAP_FILE_OPT, Clp_ArgString, Clp_Negate },
+ { "output-encoding", 0, OUTPUT_ENCODING_OPT, Clp_ArgString, Clp_Optional },
+
+ { "automatic", 'a', AUTOMATIC_OPT, 0, Clp_Negate },
+ { "name", 'n', FONT_NAME_OPT, Clp_ArgString, 0 },
+ { "vendor", 'v', VENDOR_OPT, Clp_ArgString, 0 },
+ { "typeface", 0, TYPEFACE_OPT, Clp_ArgString, 0 },
+
+ { "encoding-directory", 0, ENCODING_DIR_OPT, Clp_ArgString, 0 },
+ { "pl-directory", 0, PL_DIR_OPT, Clp_ArgString, 0 },
+ { "tfm-directory", 0, TFM_DIR_OPT, Clp_ArgString, 0 },
+ { "vpl-directory", 0, VPL_DIR_OPT, Clp_ArgString, 0 },
+ { "vf-directory", 0, VF_DIR_OPT, Clp_ArgString, 0 },
+ { "type1-directory", 0, TYPE1_DIR_OPT, Clp_ArgString, 0 },
+
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "glyphlist", 0, GLYPHLIST_OPT, Clp_ArgString, 0 },
+ { "no-create", 0, NOCREATE_OPT, 0, Clp_OnlyNegated },
+ { "force", 0, FORCE_OPT, 0, Clp_Negate },
+ { "verbose", 'V', VERBOSE_OPT, 0, Clp_Negate },
+ { "kpathsea-debug", 0, KPATHSEA_DEBUG_OPT, Clp_ArgInt, 0 },
+
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+
+ { "tfm", 't', TFM_OPT, 0, 0 }, // deprecated
+ { "query-features", 0, QUERY_FEATURES_OPT, 0, 0 },
+ { "qf", 0, QUERY_FEATURES_OPT, 0, 0 },
+ { "query-scripts", 0, QUERY_SCRIPTS_OPT, 0, 0 },
+ { "qs", 0, QUERY_SCRIPTS_OPT, 0, 0 },
+
+};
+
+static const char * const default_ligkerns = "\
+space l =: lslash ; space L =: Lslash ; \
+question quoteleft =: questiondown ; \
+exclam quoteleft =: exclamdown ; \
+hyphen hyphen =: endash ; endash hyphen =: emdash ; \
+quoteleft quoteleft =: quotedblleft ; \
+quoteright quoteright =: quotedblright ;";
+
+static const char *program_name;
+static String::Initializer initializer;
+static String current_time;
+static StringAccum invocation;
+
+static PermString::Initializer perm_initializer;
+static PermString dot_notdef(".notdef");
+
+static Vector<Efont::OpenType::Tag> interesting_scripts;
+static Vector<Efont::OpenType::Tag> interesting_features;
+static Vector<Efont::OpenType::Tag> altselector_features;
+static GlyphFilter null_filter;
+static HashMap<Efont::OpenType::Tag, GlyphFilter*> feature_filters(0);
+static HashMap<Efont::OpenType::Tag, GlyphFilter*> altselector_feature_filters(0);
+
+static String font_name;
+static String encoding_file;
+static double extend;
+static double slant;
+static int letterspace;
+static double design_size;
+static double minimum_kern = 2.0;
+static double space_factor = 1.0;
+static bool math_spacing = false;
+static int skew_char = -1;
+
+static String out_encoding_file;
+static String out_encoding_name;
+
+int output_flags = G_ENCODING | G_METRICS | G_VMETRICS | G_PSFONTSMAP | G_TYPE1 | G_DOTLESSJ | G_UPDMAP | G_BINARY;
+
+bool automatic = false;
+bool verbose = false;
+bool no_create = false;
+bool quiet = false;
+bool force = false;
+
+static String otf_data;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'Otftotfm' generates TeX font metrics files from an OpenType font (PostScript\n\
+flavor only), including ligatures, kerns, and some positionings. Supply\n\
+'-s SCRIPT[.LANG]' options to specify a language system, '-f FEAT' options to\n\
+turn on optional OpenType features, and a '-e ENC' option to specify a base\n\
+encoding. Output files are written to the current directory (but see\n\
+'--automatic' and the 'directory' options).\n\
+\n\
+Usage: %s [-a] [OPTIONS] OTFFILE FONTNAME\n\n",
+ program_name);
+ printf("\
+Font feature and transformation options:\n\
+ -s, --script=SCRIPT[.LANG] Use features for script SCRIPT[.LANG] [latn].\n\
+ -f, --feature=FEAT Activate feature FEAT.\n\
+ --lf, --letter-feature=FEAT Activate feature FEAT for letters.\n\
+ --subs-filter=PAT Substitute only characters matching PAT.\n\
+ --include-subs=PAT Same, but cumulative.\n\
+ --exclude-subs=PAT Don't substitute characters matching PAT.\n\
+ --clear-subs Clear included/excluded substitutions.\n\
+ -E, --extend=F Widen characters by a factor of F.\n\
+ -S, --slant=AMT Oblique characters by AMT, generally <<1.\n\
+ -L, --letterspacing=AMT Letterspace each character by AMT units.\n\
+ --math-spacing[=SKEWCH] Use letterspacing appropriate for math.\n\
+ -k, --min-kern=N Omit kerns with absolute value < N [2.0].\n\
+ --space-factor=F Scale wordspace by a factor of F.\n\
+ --design-size=SIZE Set font design size to SIZE.\n\
+\n");
+ printf("\
+Encoding options:\n\
+ -e, --encoding=FILE Use DVIPS encoding FILE as a base encoding.\n\
+ --literal-encoding=FILE Use DVIPS encoding FILE verbatim.\n\
+ --ligkern=COMMAND Add a LIGKERN command.\n\
+ --position=COMMAND Add a POSITION command.\n\
+ --unicoding=COMMAND Add a UNICODING command.\n\
+ --no-encoding-commands Ignore encoding file's LIGKERN/UNICODINGs.\n\
+ --default-ligkern Ignore encoding file's LIGKERNs, use defaults.\n\
+ --coding-scheme=SCHEME Set the output coding scheme to SCHEME.\n\
+ --boundary-char=CHAR Set the boundary character to CHAR.\n\
+ --altselector-char=CHAR Set the alternate selector character to CHAR.\n\
+ --altselector-feature=F Activate feature F for --altselector-char.\n\
+ --alternates-filter=PAT Include only alternate characters matching PAT.\n\
+ --include-alternates=PAT Same, but cumulative.\n\
+ --exclude-alternates=PAT Ignore alternate characters matching PAT.\n\
+ --clear-alternates Clear included/excluded alternates.\n\
+\n");
+ printf("\
+Automatic mode options:\n\
+ -a, --automatic Install in a TeX Directory Structure.\n\
+ -v, --vendor=NAME Set font vendor for TDS [lcdftools].\n\
+ --typeface=NAME Set typeface name for TDS [<font family>].\n\
+ --no-type1 Do not generate Type 1 fonts.\n\
+ --no-dotlessj Do not generate dotless-j fonts.\n\
+ --no-updmap Do not run updmap.\n\
+\n\
+Output options:\n\
+ -n, --name=NAME Generated font name is NAME.\n\
+ -p, --pl Output human-readable PL/VPLs, not TFM/VFs.\n\
+ --no-virtual Do not generate VFs or VPLs.\n\
+ --no-encoding Do not generate an encoding file.\n\
+ --no-map Do not generate a psfonts.map line.\n\
+ --output-encoding[=FILE] Only generate an encoding file.\n\
+\n");
+ printf("\
+File location options:\n\
+ --tfm-directory=DIR Put TFM files in DIR [.|automatic].\n\
+ --pl-directory=DIR Put PL files in DIR [.|automatic].\n\
+ --vf-directory=DIR Put VF files in DIR [.|automatic].\n\
+ --vpl-directory=DIR Put VPL files in DIR [.|automatic].\n\
+ --encoding-directory=DIR Put encoding files in DIR [.|automatic].\n\
+ --type1-directory=DIR Put Type 1 fonts in DIR [automatic].\n\
+ --map-file=FILE Update FILE with psfonts.map information [-].\n\
+\n\
+Other options:\n\
+ --glyphlist=FILE Use FILE to map Adobe glyph names to Unicode.\n\
+ -V, --verbose Print progress information to standard error.\n\
+ --no-create Print messages, don't modify any files.\n\
+ --force Generate files even if versions already exist.\n"
+#if HAVE_KPATHSEA
+" --kpathsea-debug=MASK Set path searching debug flags to MASK.\n"
+#endif
+" -h, --help Print this message and exit.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n");
+}
+
+#ifndef WIN32
+extern "C" {
+static void
+sigchld_handler(int s)
+{
+#if !HAVE_SIGACTION
+ signal(s, sigchld_handler);
+#else
+ (void) s;
+#endif
+}
+}
+
+static void
+handle_sigchld()
+{
+#ifdef SIGCHLD
+ int sigchld = SIGCHLD;
+#else
+ int sigchld = SIGCLD;
+#endif
+#if HAVE_SIGACTION
+ struct sigaction sa;
+ sigaction(sigchld, 0, &sa);
+ sa.sa_handler = sigchld_handler;
+ sa.sa_flags = 0;
+ sigaction(sigchld, &sa, 0);
+#else
+ signal(sigchld, sigchld_handler);
+#endif
+}
+#endif
+
+
+// MAIN
+
+String
+suffix_font_name(const String &font_name, const String &suffix)
+{
+ int pos = font_name.length();
+ while (pos > 0 && (isdigit(font_name[pos-1]) || font_name[pos-1] == '-' || font_name[pos-1] == '+'))
+ pos--;
+ if (pos == 0)
+ pos = font_name.length();
+ return font_name.substring(0, pos) + suffix + font_name.substring(pos);
+}
+
+static inline String
+make_base_font_name(const String &font_name)
+{
+ return suffix_font_name(font_name, "--base");
+}
+
+static double
+get_design_size(const FontInfo &finfo)
+{
+ try {
+ String gpos_table = finfo.otf->table("GPOS");
+ if (!gpos_table)
+ throw OpenType::Error();
+
+ ErrorHandler *errh = ErrorHandler::silent_handler();
+ OpenType::Gpos gpos(gpos_table, errh);
+
+ // extract 'size' feature(s)
+ int required_fid;
+ Vector<int> fids;
+ for (const OpenType::Tag *t = interesting_scripts.begin(); t < interesting_scripts.end(); t += 2)
+ gpos.script_list().features(t[0], t[1], required_fid, fids, 0, false);
+
+ int size_fid = gpos.feature_list().find(OpenType::Tag("size"), fids);
+ if (size_fid < 0)
+ throw OpenType::Error();
+
+ // it looks like Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Data size_data = gpos.feature_list().params(size_fid, 10, errh, true);
+ if (!size_data.length())
+ throw OpenType::Error();
+
+ double result = size_data.u16(0) / 10.;
+ // check for insane design sizes
+ if (result < 1 || result > 1000)
+ throw OpenType::Error();
+
+ // return a number in 'pt', not 'bp'
+ return result * 72.27 / 72.;
+
+ } catch (OpenType::Error) {
+ return 10.0;
+ }
+}
+
+static const char * const digit_names[] = {
+ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
+};
+
+static inline const char *
+lig_context_str(int ctx)
+{
+ return (ctx == 0 ? "LIG" : (ctx < 0 ? "/LIG" : "LIG/"));
+}
+
+static void
+fprint_real(FILE *f, const char *prefix, double value, double du, const char *suffix = ")\n")
+{
+ if (du == 1.)
+ fprintf(f, "%s R %g%s", prefix, value, suffix);
+ else
+ fprintf(f, "%s R %.4f%s", prefix, value * du, suffix);
+}
+
+static String
+real_string(double value, double du)
+{
+ if (du == 1.)
+ return String(value);
+ else {
+ char buf[128];
+ sprintf(buf, "%.4f", value * du);
+ return String(buf);
+ }
+}
+
+double
+font_slant(const FontInfo &finfo)
+{
+ double val;
+ (void) finfo.cff->dict_value(Efont::Cff::oItalicAngle, &val);
+ return -tan(val * M_PI / 180.0) + slant;
+}
+
+static void
+output_pl(const Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, bool vpl, FILE *f)
+{
+ // XXX check DESIGNSIZE and DESIGNUNITS for correctness
+
+ fprintf(f, "(COMMENT Created by '%s'%s)\n", invocation.c_str(), current_time.c_str());
+
+ // calculate a TeX FAMILY name using afm2tfm's algorithm
+ String family_name = String("TeX-") + ps_name;
+ if (family_name.length() > 19)
+ family_name = family_name.substring(0, 9) + family_name.substring(-10);
+ fprintf(f, "(FAMILY %s)\n", family_name.c_str());
+
+ if (metrics.coding_scheme())
+ fprintf(f, "(CODINGSCHEME %.39s)\n", String(metrics.coding_scheme()).c_str());
+ int design_units = metrics.design_units();
+
+ if (design_size <= 0)
+ design_size = get_design_size(finfo);
+ fprintf(f, "(DESIGNSIZE R %.1f)\n"
+ "(DESIGNUNITS R %d.0)\n"
+ "(COMMENT DESIGNSIZE (1 em) IS IN POINTS)\n"
+ "(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/%d)\n"
+ "(FONTDIMEN\n", design_size, design_units, design_units);
+
+ // figure out font dimensions
+ Transform font_xform;
+ if (extend)
+ font_xform.scale(extend, 1);
+ if (slant)
+ font_xform.shear(slant);
+ int bounds[4], width;
+ double du = (design_units == 1000 ? 1. : design_units / 1000.);
+
+ double actual_slant = font_slant(finfo);
+ if (actual_slant)
+ fprintf(f, " (SLANT R %g)\n", actual_slant);
+
+ double val;
+ if (char_bounds(bounds, width, finfo, font_xform, ' ')) {
+ // advance space width by letterspacing, scale by space_factor
+ double space_width = (width + letterspace) * space_factor;
+ fprint_real(f, " (SPACE", space_width, du);
+ if (finfo.cff->dict_value(Efont::Cff::oIsFixedPitch, &val) && val) {
+ // fixed-pitch: no space stretch or shrink
+ fprint_real(f, " (STRETCH", 0, du);
+ fprint_real(f, " (SHRINK", 0, du);
+ fprint_real(f, " (EXTRASPACE", space_width, du);
+ } else {
+ fprint_real(f, " (STRETCH", space_width / 2., du);
+ fprint_real(f, " (SHRINK", space_width / 3., du);
+ fprint_real(f, " (EXTRASPACE", space_width / 6., du);
+ }
+ }
+
+ int xheight = font_x_height(finfo, font_xform);
+ if (xheight < 1000)
+ fprint_real(f, " (XHEIGHT", xheight, du);
+
+ fprint_real(f, " (QUAD", 1000, du);
+ fprintf(f, " )\n");
+
+ if (boundary_char >= 0)
+ fprintf(f, "(BOUNDARYCHAR D %d)\n", boundary_char);
+
+ // write MAPFONT
+ if (vpl)
+ for (int i = 0; i < metrics.n_mapped_fonts(); i++) {
+ String name = metrics.mapped_font_name(i);
+ if (!name)
+ name = make_base_font_name(font_name);
+ fprintf(f, "(MAPFONT D %d\n (FONTNAME %s)\n (FONTDSIZE R %.1f)\n )\n", i, name.c_str(), design_size);
+ }
+
+ // figure out the proper names and numbers for glyphs
+ Vector<String> glyph_ids;
+ Vector<String> glyph_comments(257, String());
+ Vector<String> glyph_base_comments(257, String());
+ for (int i = 0; i < metrics.encoding_size(); i++) {
+ if (metrics.glyph(i)) {
+ PermString name = metrics.code_name(i), expected_name;
+ if (i >= '0' && i <= '9')
+ expected_name = digit_names[i - '0'];
+ else if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z'))
+ expected_name = PermString((char)i);
+ String glyph_comment;
+ if (name != expected_name)
+ glyph_comment = " (COMMENT " + String(name) + ")";
+
+ int base = metrics.base_code(i);
+ if (base >= 0 && base < 256)
+ glyph_base_comments[base] = glyph_comment;
+
+ if (i >= 256)
+ continue;
+
+ if (expected_name
+ && name.length() >= expected_name.length()
+ && memcmp(name.c_str(), expected_name.c_str(), expected_name.length()) == 0)
+ glyph_ids.push_back("C " + String((char)i));
+ else
+ glyph_ids.push_back("D " + String(i));
+
+ glyph_comments[i] = glyph_base_comments[i] = glyph_comment;
+
+ } else if (i < 256)
+ glyph_ids.push_back("D " + String(i));
+ }
+ // finally, BOUNDARYCHAR
+ glyph_ids.push_back("BOUNDARYCHAR");
+
+ // LIGTABLE
+ fprintf(f, "(LIGTABLE\n");
+ Vector<int> lig_code2, lig_outcode, lig_context, kern_code2, kern_amt;
+ // don't print KRN x after printing LIG x
+ uint32_t used[8];
+ for (int i = 0; i <= 256; i++)
+ if (metrics.glyph(i) && minimum_kern < 10000) {
+ int any_lig = metrics.ligatures(i, lig_code2, lig_outcode, lig_context);
+ int any_kern = metrics.kerns(i, kern_code2, kern_amt);
+ if (any_lig || any_kern) {
+ StringAccum kern_sa;
+ memset(&used[0], 0, 32);
+ for (int j = 0; j < lig_code2.size(); j++) {
+ kern_sa << " (" << lig_context_str(lig_context[j])
+ << ' ' << glyph_ids[lig_code2[j]]
+ << ' ' << glyph_ids[lig_outcode[j]]
+ << ')' << glyph_comments[lig_code2[j]]
+ << glyph_comments[lig_outcode[j]] << '\n';
+ used[lig_code2[j] >> 5] |= (1 << (lig_code2[j] & 0x1F));
+ }
+ for (Vector<int>::const_iterator k2 = kern_code2.begin(); k2 < kern_code2.end(); k2++)
+ if (!(used[*k2 >> 5] & (1 << (*k2 & 0x1F)))) {
+ double this_kern = kern_amt[k2 - kern_code2.begin()];
+ if (fabs(this_kern) >= minimum_kern)
+ kern_sa << " (KRN " << glyph_ids[*k2]
+ << " R " << real_string(this_kern, du)
+ << ')' << glyph_comments[*k2] << '\n';
+ }
+ if (kern_sa)
+ fprintf(f, " (LABEL %s)%s\n%s (STOP)\n", glyph_ids[i].c_str(), glyph_comments[i].c_str(), kern_sa.c_str());
+ }
+ }
+ fprintf(f, " )\n");
+
+ // CHARACTERs
+ Vector<Setting> settings;
+ StringAccum sa;
+ Vector<Point> push_stack;
+
+ for (int i = 0; i < 256; i++)
+ if (metrics.setting(i, settings)) {
+ fprintf(f, "(CHARACTER %s%s\n", glyph_ids[i].c_str(), glyph_comments[i].c_str());
+
+ // unparse settings into DVI commands
+ sa.clear();
+ push_stack.clear();
+ CharstringBounds boundser(font_xform);
+ const CharstringProgram *program = finfo.cff;
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ switch (s->op) {
+
+ case Setting::SHOW:
+ boundser.char_bounds(program->glyph_context(s->y));
+ // 3.Aug.2004 -- reported by Marco Kuhlmann: Don't use
+ // glyph_ids[] array when looking at a different font.
+ if (program == finfo.cff)
+ sa << " (SETCHAR " << glyph_ids[s->x] << ')' << glyph_base_comments[s->x] << "\n";
+ else
+ sa << " (SETCHAR D " << s->x << ")\n";
+ break;
+
+ case Setting::MOVE:
+ boundser.translate(s->x, s->y);
+ if (s->x)
+ sa << " (MOVERIGHT R " << real_string(s->x, du) << ")\n";
+ if (s->y)
+ sa << " (MOVEUP R " << real_string(s->y, du) << ")\n";
+ break;
+
+ case Setting::RULE:
+ boundser.mark(Point(0, 0));
+ boundser.mark(Point(s->x, s->y));
+ boundser.translate(s->x, 0);
+ sa << " (SETRULE R " << real_string(s->y, du) << " R " << real_string(s->x, du) << ")\n";
+ break;
+
+ case Setting::FONT:
+ program = metrics.mapped_font((int) s->x);
+ sa << " (SELECTFONT D " << (int) s->x << ")\n";
+ break;
+
+ case Setting::PUSH:
+ push_stack.push_back(boundser.transform(Point(0, 0)));
+ sa << " (PUSH)\n";
+ break;
+
+ case Setting::POP: {
+ assert(push_stack.size());
+ Point p = push_stack.back() - boundser.transform(Point(0, 0));
+ boundser.translate(p.x, p.y);
+ push_stack.pop_back();
+ sa << " (POP)\n";
+ break;
+ }
+
+ }
+
+ assert(push_stack.size() == 0);
+
+ // output information
+ boundser.output(bounds, width);
+ fprint_real(f, " (CHARWD", width, du);
+ if (bounds[3] > 0)
+ fprint_real(f, " (CHARHT", bounds[3], du);
+ if (bounds[1] < 0)
+ fprint_real(f, " (CHARDP", -bounds[1], du);
+ if (bounds[2] > width)
+ fprint_real(f, " (CHARIC", bounds[2] - width, du);
+ if (vpl && (settings.size() > 1 || settings[0].op != Setting::SHOW))
+ fprintf(f, " (MAP\n%s )\n", sa.c_str());
+ fprintf(f, " )\n");
+ }
+}
+
+static void
+output_pl(const Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, bool vpl, String filename, ErrorHandler *errh)
+{
+ if (no_create)
+ errh->message("would create %s", filename.c_str());
+ else {
+ if (verbose)
+ errh->message("creating %s", filename.c_str());
+ if (FILE *f = fopen(filename.c_str(), "w")) {
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, f);
+ fclose(f);
+ } else
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ }
+}
+
+struct Lookup {
+ bool used;
+ bool required;
+ Vector<OpenType::Tag> features;
+ GlyphFilter* filter;
+ Lookup() : used(false), required(false), filter(0) { }
+};
+
+static void
+find_lookups(const OpenType::ScriptList& scripts, const OpenType::FeatureList& features, Vector<Lookup>& lookups, ErrorHandler* errh)
+{
+ Vector<int> fids, lookupids;
+ int required;
+
+ // go over all scripts
+ for (int i = 0; i < interesting_scripts.size(); i += 2) {
+ OpenType::Tag script = interesting_scripts[i];
+ OpenType::Tag langsys = interesting_scripts[i+1];
+
+ // collect features applying to this script
+ scripts.features(script, langsys, required, fids, errh);
+
+ // only use the selected features
+ features.filter(fids, interesting_features);
+
+ // mark features as having been used
+ for (int j = (required < 0 ? 0 : -1); j < fids.size(); j++) {
+ int fid = (j < 0 ? required : fids[j]);
+ OpenType::Tag ftag = features.tag(fid);
+ if (features.lookups(fid, lookupids, errh) < 0)
+ lookupids.clear();
+ for (int k = 0; k < lookupids.size(); k++) {
+ int l = lookupids[k];
+ if (l < 0 || l >= lookups.size())
+ errh->error("lookup for '%s' feature out of range", OpenType::Tag::langsys_text(script, langsys).c_str());
+ else {
+ lookups[l].used = true;
+ lookups[l].features.push_back(ftag);
+ if (j < 0)
+ lookups[l].required = true;
+ }
+ }
+ }
+ }
+
+ // now check for compatible glyph filters
+ for (Lookup* l = lookups.begin(); l < lookups.end(); l++)
+ if (l->used && !l->required) {
+ l->filter = feature_filters[l->features[0]];
+ for (OpenType::Tag* ft = l->features.begin() + 1; ft < l->features.end(); ft++)
+ if (!l->filter->check_eq(*feature_filters[*ft])) {
+ errh->error("'%s' and '%s' features share a lookup, but have different filters", l->features[0].text().c_str(), ft->text().c_str());
+ break;
+ }
+ }
+}
+
+static int
+write_encoding_file(String &filename, const String &encoding_name,
+ StringAccum &contents, ErrorHandler *errh)
+{
+ FILE *f;
+ int ok_retval = (access(filename.c_str(), R_OK) >= 0 ? 0 : 1);
+
+ if (no_create) {
+ errh->message((ok_retval ? "would create encoding file %s" : "would update encoding file %s"), filename.c_str());
+ return ok_retval;
+ } else if (verbose)
+ errh->message((ok_retval ? "creating encoding file %s" : "updating encoding file %s"), filename.c_str());
+
+ int fd = open(filename.c_str(), O_RDWR | O_CREAT, 0666);
+ if (fd < 0)
+ return errh->error("%s: %s", filename.c_str(), strerror(errno));
+ f = fdopen(fd, "r+");
+ // NB: also change update_autofont_map if you change this code
+
+#if defined(F_SETLKW) && defined(HAVE_FTRUNCATE)
+ {
+ struct flock lock;
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = 0;
+ lock.l_len = 0;
+ int result;
+ while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
+ /* try again */;
+ if (result < 0) {
+ result = errno;
+ fclose(f);
+ return errh->error("locking %s: %s", filename.c_str(), strerror(result));
+ }
+ }
+#endif
+
+ // read old data from encoding file
+ StringAccum sa;
+ while (!feof(f))
+ if (char *x = sa.reserve(8192)) {
+ int amt = fread(x, 1, 8192, f);
+ sa.forward(amt);
+ } else {
+ fclose(f);
+ return errh->error("Out of memory!");
+ }
+ String old_encodings = sa.take_string();
+ bool created = (!old_encodings);
+
+ // append old encodings
+ int pos1 = old_encodings.find_left("\n%%");
+ while (pos1 < old_encodings.length()) {
+ int pos2 = old_encodings.find_left("\n%%", pos1 + 1);
+ if (pos2 < 0)
+ pos2 = old_encodings.length();
+ if (old_encodings.substring(pos1 + 3, encoding_name.length()) == encoding_name) {
+ // encoding already exists, don't change it
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", filename.c_str());
+ return 0;
+ } else
+ contents << old_encodings.substring(pos1, pos2 - pos1);
+ pos1 = pos2;
+ }
+
+ // rewind file
+#ifdef HAVE_FTRUNCATE
+ rewind(f);
+ ftruncate(fd, 0);
+#else
+ fclose(f);
+ f = fopen(filename.c_str(), "w");
+#endif
+
+ fwrite(contents.data(), 1, contents.length(), f);
+
+ fclose(f);
+
+ // inform about the new file if necessary
+ if (created)
+ update_odir(O_ENCODING, filename, errh);
+ return 0;
+}
+
+static void
+output_encoding(const Metrics &metrics,
+ const Vector<PermString> &glyph_names,
+ ErrorHandler *errh)
+{
+ static const char * const hex_digits = "0123456789ABCDEF";
+
+ // collect encoding data
+ Vector<Metrics::Glyph> glyphs;
+ metrics.base_glyphs(glyphs);
+ StringAccum sa;
+ for (int i = 0; i < 256; i++) {
+ if ((i & 0xF) == 0)
+ sa << (i ? "\n%" : "%") << hex_digits[(i >> 4) & 0xF] << '0' << '\n' << ' ';
+ else if ((i & 0x7) == 0)
+ sa << '\n' << ' ';
+ int g = glyphs[i];
+ if (g > 0 && g < glyph_names.size())
+ sa << ' ' << '/' << glyph_names[g];
+ else
+ sa << " /.notdef";
+ }
+ sa << '\n';
+
+ // digest encoding data
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char *)sa.data(), sa.length());
+ char text_digest[MD5_TEXT_DIGEST_SIZE + 1];
+ md5_final_text(text_digest, &md5);
+
+ // name encoding using digest
+ out_encoding_name = "AutoEnc_" + String(text_digest);
+
+ // create encoding filename
+ bool output_encoding_only = (bool) out_encoding_file;
+ if (!out_encoding_file)
+ out_encoding_file = getodir(O_ENCODING, errh) + String("/a_") + String(text_digest).substring(0, 6) + ".enc";
+
+ // exit if we're not responsible for generating an encoding
+ if (!(output_flags & G_ENCODING))
+ return;
+
+ // put encoding block in a StringAccum
+ // 3.Jun.2003: stick command line definition at the end of the encoding,
+ // where it won't confuse idiotic ps2pk
+ StringAccum contents;
+ if (!output_encoding_only)
+ contents << "% THIS FILE WAS AUTOMATICALLY GENERATED -- DO NOT EDIT\n\n\
+%%" << out_encoding_name << "\n";
+ contents << "% Encoding created by otftotfm" << current_time << "\n\
+% Command line follows encoding\n";
+
+ // the encoding itself
+ contents << '/' << out_encoding_name << " [\n" << sa << "] def\n";
+
+ // write banner -- unfortunately this takes some doing
+ String banner = String("Command line: '") + String(invocation.data(), invocation.length()) + String("'");
+ char *buf = banner.mutable_data();
+ // get rid of crap characters
+ for (int i = 0; i < banner.length(); i++)
+ if (buf[i] < ' ' || buf[i] > 0176) {
+ if (buf[i] == '\n' || buf[i] == '\r')
+ buf[i] = ' ';
+ else
+ buf[i] = '.';
+ }
+ // break lines at 80 characters -- it would be nice if this were in a
+ // library
+ while (banner.length() > 0) {
+ int pos = banner.find_left(' '), last_pos = pos;
+ while (pos < 75 && pos >= 0) {
+ last_pos = pos;
+ pos = banner.find_left(' ', pos + 1);
+ }
+ if (last_pos < 0 || (pos < 0 && banner.length() < 75))
+ last_pos = banner.length();
+ contents << "% " << banner.substring(0, last_pos) << '\n';
+ banner = banner.substring(last_pos + 1);
+ }
+
+ // open encoding file
+ if (out_encoding_file == "-")
+ fwrite(contents.data(), 1, contents.length(), stdout);
+ else if (write_encoding_file(out_encoding_file, out_encoding_name, contents, errh) == 1)
+ update_odir(O_ENCODING, out_encoding_file, errh);
+}
+
+static void
+output_tfm(const Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, String tfm_filename, String vf_filename,
+ ErrorHandler *errh)
+{
+ String pl_filename;
+ int pl_fd = temporary_file(pl_filename, errh);
+ if (pl_fd < 0)
+ return;
+
+ bool vpl = vf_filename;
+
+ if (no_create) {
+ errh->message("would write %s to temporary file", (vpl ? "VPL" : "PL"));
+ pl_filename = "<temporary>";
+ } else {
+ if (verbose)
+ errh->message("writing %s to temporary file", (vpl ? "VPL" : "PL"));
+ FILE *f = fdopen(pl_fd, "w");
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, f);
+ fclose(f);
+ }
+
+ StringAccum command;
+ if (vpl)
+ command << "vptovf " << shell_quote(pl_filename) << ' ' << shell_quote(vf_filename) << ' ' << shell_quote(tfm_filename) << " >&2";
+ else
+ command << "pltotf " << shell_quote(pl_filename) << ' ' << shell_quote(tfm_filename) << " >&2";
+
+ int status = mysystem(command.c_str(), errh);
+
+ if (!no_create)
+ unlink(pl_filename.c_str());
+
+ if (status != 0)
+ errh->fatal("%s execution failed", (vpl ? "vptovf" : "pltotf"));
+ else {
+ update_odir(O_TFM, tfm_filename, errh);
+ if (vpl)
+ update_odir(O_VF, vf_filename, errh);
+ }
+}
+
+void
+output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo,
+ const String &encoding_name, const String &encoding_file,
+ const String &font_name,
+ void (*dvips_include)(const String &ps_name, StringAccum &, ErrorHandler *),
+ ErrorHandler *errh)
+{
+ String base_font_name = font_name;
+ bool need_virtual = metrics.need_virtual(257);
+ if (need_virtual) {
+ if (output_flags & G_VMETRICS)
+ base_font_name = make_base_font_name(font_name);
+ else if (output_flags & G_METRICS)
+ errh->warning("features require virtual fonts");
+ }
+
+ // output virtual metrics
+ if (!(output_flags & G_VMETRICS))
+ /* do nothing */;
+ else if (!need_virtual) {
+ if (automatic) {
+ // erase old virtual font
+ String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
+ if (no_create)
+ errh->message("would remove potential VF file '%s'", vf.c_str());
+ else {
+ if (verbose)
+ errh->message("removing potential VF file '%s'", vf.c_str());
+ if (unlink(vf.c_str()) < 0 && errno != ENOENT)
+ errh->error("removing %s: %s", vf.c_str(), strerror(errno));
+ }
+ }
+ } else {
+ if (output_flags & G_BINARY) {
+ String tfm = getodir(O_TFM, errh) + "/" + font_name + ".tfm";
+ String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
+ output_tfm(metrics, ps_name, boundary_char, finfo, tfm, vf, errh);
+ } else {
+ String outfile = getodir(O_VPL, errh) + "/" + font_name + ".vpl";
+ output_pl(metrics, ps_name, boundary_char, finfo, true, outfile, errh);
+ update_odir(O_VPL, outfile, errh);
+ }
+ metrics.make_base(257);
+ }
+
+ // output metrics
+ double save_minimum_kern = minimum_kern;
+ if (need_virtual)
+ minimum_kern = 100000;
+ if (!(output_flags & G_METRICS))
+ /* do nothing */;
+ else if (output_flags & G_BINARY) {
+ String tfm = getodir(O_TFM, errh) + "/" + base_font_name + ".tfm";
+ output_tfm(metrics, ps_name, boundary_char, finfo, tfm, String(), errh);
+ } else {
+ String outfile = getodir(O_PL, errh) + "/" + base_font_name + ".pl";
+ output_pl(metrics, ps_name, boundary_char, finfo, false, outfile, errh);
+ update_odir(O_PL, outfile, errh);
+ }
+ minimum_kern = save_minimum_kern;
+
+ // print DVIPS map line
+ if (errh->nerrors() == 0 && (output_flags & G_PSFONTSMAP)) {
+ StringAccum sa;
+ sa << base_font_name << ' ' << ps_name << " \"";
+ if (extend)
+ sa << extend << " ExtendFont ";
+ if (slant)
+ sa << slant << " SlantFont ";
+ if (encoding_name)
+ sa << encoding_name << " ReEncodeFont\" <[" << pathname_filename(encoding_file);
+ else
+ sa << "\"";
+ sa << ' ';
+ dvips_include(ps_name, sa, errh);
+ sa << '\n';
+ update_autofont_map(base_font_name, sa.take_string(), errh);
+ // if virtual font, remove any map line for base font name
+ if (base_font_name != font_name)
+ update_autofont_map(font_name, "", errh);
+ }
+}
+
+
+enum { F_GSUB_TRY = 1, F_GSUB_PART = 2, F_GSUB_ALL = 4,
+ F_GPOS_TRY = 8, F_GPOS_PART = 16, F_GPOS_ALL = 32,
+ X_UNUSED = 0, X_BOTH_NONE = 1, X_GSUB_NONE = 2, X_GSUB_PART = 3,
+ X_GPOS_NONE = 4, X_GPOS_PART = 5, X_COUNT };
+
+static const char * const x_messages[] = {
+ "% ignored, not supported by font",
+ "% ignored, too complex for me",
+ "complex substitutions from % ignored",
+ "some complex substitutions from % ignored",
+ "complex positionings from % ignored",
+ "some complex positionings from % ignored",
+};
+
+static void
+report_underused_features(const HashMap<uint32_t, int> &feature_usage, ErrorHandler *errh)
+{
+ Vector<String> x[X_COUNT];
+ for (int i = 0; i < interesting_features.size(); i++) {
+ OpenType::Tag f = interesting_features[i];
+ int fu = feature_usage[f.value()];
+ String ftext = "'" + f.text() + "'";
+ if (fu == 0)
+ x[X_UNUSED].push_back(ftext);
+ else if ((fu & (F_GSUB_TRY | F_GPOS_TRY)) == fu)
+ x[X_BOTH_NONE].push_back(ftext);
+ else {
+ if (fu & F_GSUB_TRY) {
+ if ((fu & (F_GSUB_PART | F_GSUB_ALL)) == 0)
+ x[X_GSUB_NONE].push_back(ftext);
+ else if (fu & F_GSUB_PART)
+ x[X_GSUB_PART].push_back(ftext);
+ }
+ if (fu & F_GPOS_TRY) {
+ if ((fu & (F_GPOS_PART | F_GPOS_ALL)) == 0)
+ x[X_GPOS_NONE].push_back(ftext);
+ else if (fu & F_GPOS_PART)
+ x[X_GPOS_PART].push_back(ftext);
+ }
+ }
+ }
+
+ for (int i = 0; i < X_COUNT; i++)
+ if (x[i].size())
+ goto found;
+ return;
+
+ found:
+ for (int i = 0; i < X_COUNT; i++)
+ if (x[i].size()) {
+ StringAccum sa;
+ const char* msg_pct = strchr(x_messages[i], '%');
+ sa.append(x_messages[i], msg_pct - x_messages[i]);
+ const char* sep = (x[i].size() > 2 ? ", " : " ");
+ for (const String* a = x[i].begin(); a < x[i].end() - 1; a++)
+ sa << *a << sep;
+ sa << (x[i].size() > 1 ? "and " : "") << x[i].back()
+ << (x[i].size() > 1 ? " features" : " feature") << (msg_pct+1);
+ sa.append_break_lines(sa.take_string(), 58);
+ errh->warning("%s", sa.c_str());
+ }
+}
+
+static String otf_filename;
+
+static void
+main_dvips_map(const String &ps_name, StringAccum &sa, ErrorHandler *errh)
+{
+ if (String fn = installed_type1(otf_filename, ps_name, (output_flags & G_TYPE1) != 0, errh))
+ sa << "<" << pathname_filename(fn);
+ else
+ sa << "<<" << pathname_filename(otf_filename);
+}
+
+static void
+do_gsub(Metrics& metrics, const OpenType::Font& otf, DvipsEncoding& dvipsenc, bool dvipsenc_literal, HashMap<uint32_t, int>& feature_usage, const Vector<PermString>& glyph_names, ErrorHandler* errh)
+{
+ // apply activated GSUB features
+ OpenType::Gsub gsub(otf.table("GSUB"), &otf, errh);
+ Vector<Lookup> lookups(gsub.nlookups(), Lookup());
+ find_lookups(gsub.script_list(), gsub.feature_list(), lookups, errh);
+ Vector<OpenType::Substitution> subs;
+ for (int i = 0; i < lookups.size(); i++)
+ if (lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ subs.clear();
+ bool understood = l.unparse_automatics(gsub, subs);
+
+ // check for -ffina, which should apply only at the ends of words,
+ // and -finit, which should apply only at the beginnings.
+ OpenType::Tag feature = (lookups[i].features.size() == 1 ? lookups[i].features[0] : OpenType::Tag());
+ if (feature == OpenType::Tag("fina") || feature == OpenType::Tag("fin2") || feature == OpenType::Tag("fin3")) {
+ if (dvipsenc.boundary_char() < 0)
+ errh->warning("'-ffina' requires a boundary character\n(The input encoding didn't specify a boundary character, but\nI need one to implement '-ffina' features correctly. Try\nthe '--boundary-char' option.)");
+ else {
+ int bg = metrics.boundary_glyph();
+ for (int j = 0; j < subs.size(); j++)
+ subs[j].add_outer_right(bg);
+ }
+ } else if (feature == OpenType::Tag("init")) {
+ int bg = metrics.boundary_glyph();
+ for (int j = 0; j < subs.size(); j++)
+ subs[j].add_outer_left(bg);
+ }
+
+ //for (int subno = 0; subno < subs.size(); subno++) fprintf(stderr, "%5d\t%s\n", i, subs[subno].unparse().c_str());
+
+ // figure out which glyph filter to use
+ int nunderstood = metrics.apply(subs, !dvipsenc_literal, i, *lookups[i].filter, glyph_names);
+
+ // mark as used
+ int d = (understood && nunderstood == subs.size() ? F_GSUB_ALL : (nunderstood ? F_GSUB_PART : 0)) + F_GSUB_TRY;
+ for (int j = 0; j < lookups[i].features.size(); j++)
+ feature_usage.find_force(lookups[i].features[j].value()) |= d;
+ }
+
+ // apply alternate selectors
+ if (metrics.altselectors() && !dvipsenc_literal) {
+ // apply default features
+ if (!altselector_features.size()) {
+ altselector_features.push_back(OpenType::Tag("dlig"));
+ altselector_feature_filters.insert(OpenType::Tag("dlig"), &null_filter);
+ altselector_features.push_back(OpenType::Tag("salt"));
+ altselector_feature_filters.insert(OpenType::Tag("salt"), &null_filter);
+ }
+ // do lookups
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
+ Vector<Lookup> alt_lookups(gsub.nlookups(), Lookup());
+ find_lookups(gsub.script_list(), gsub.feature_list(), alt_lookups, ErrorHandler::silent_handler());
+ Vector<OpenType::Substitution> alt_subs;
+ for (int i = 0; i < alt_lookups.size(); i++)
+ if (alt_lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ alt_subs.clear();
+ (void) l.unparse_automatics(gsub, alt_subs);
+ metrics.apply_alternates(alt_subs, i, *alt_lookups[i].filter, glyph_names);
+ }
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
+ }
+}
+
+static void
+do_gpos(Metrics& metrics, const OpenType::Font& otf, HashMap<uint32_t, int>& feature_usage, ErrorHandler* errh)
+{
+ OpenType::Gpos gpos(otf.table("GPOS"), errh);
+ Vector<Lookup> lookups(gpos.nlookups(), Lookup());
+ find_lookups(gpos.script_list(), gpos.feature_list(), lookups, errh);
+ Vector<OpenType::Positioning> poss;
+ for (int i = 0; i < lookups.size(); i++)
+ if (lookups[i].used) {
+ OpenType::GposLookup l = gpos.lookup(i);
+ poss.clear();
+ bool understood = l.unparse_automatics(poss);
+ int nunderstood = metrics.apply(poss);
+
+ // mark as used
+ int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
+ for (int j = 0; j < lookups[i].features.size(); j++)
+ feature_usage.find_force(lookups[i].features[j].value()) |= d;
+ }
+}
+
+static void
+do_math_spacing(Metrics &metrics, const FontInfo &finfo,
+ const DvipsEncoding &dvipsenc)
+{
+ Transform font_xform;
+ if (extend)
+ font_xform.scale(extend, 1);
+ if (slant)
+ font_xform.shear(slant);
+ CharstringBounds boundser(font_xform);
+
+ int x_height = font_x_height(finfo, font_xform);
+ double slant = font_slant(finfo);
+ int boundary_char = dvipsenc.boundary_char();
+
+ int bounds[4], width;
+
+ for (int code = 0; code < 256; code++) {
+ int g = metrics.glyph(code);
+ if (g != 0 && g != Metrics::VIRTUAL_GLYPH && code != boundary_char) {
+ if (char_bounds(bounds, width, finfo, font_xform, code)) {
+ int left_sb = (bounds[0] < 0 ? -bounds[0] : 0);
+ metrics.add_single_positioning(code, left_sb, 0, left_sb);
+
+ if (skew_char >= 0) {
+ double virtual_height = (bounds[3] > x_height ? bounds[3] :x_height) - 0.5 * x_height;
+ int right_sb = (bounds[2] > width ? bounds[2] - width : 0);
+ int skew = (int)(slant * virtual_height + left_sb - right_sb);
+ metrics.add_kern(code, skew_char, skew);
+ }
+ }
+ }
+ }
+}
+
+static void
+do_file(const String &otf_filename, const OpenType::Font &otf,
+ const DvipsEncoding &dvipsenc_in, bool dvipsenc_literal,
+ ErrorHandler *errh)
+{
+ // get font
+ Cff cff(otf.table("CFF"), errh);
+ if (!cff.ok())
+ return;
+
+ Cff::FontParent *fp = cff.font(PermString(), errh);
+ if (!fp || !fp->ok())
+ return;
+ Cff::Font *font = dynamic_cast<Cff::Font *>(fp);
+ if (!font) {
+ errh->error("CID-keyed fonts not supported");
+ return;
+ }
+
+ OpenType::Cmap cmap(otf.table("cmap"), errh);
+ assert(cmap.ok());
+
+ FontInfo finfo;
+ finfo.otf = &otf;
+ finfo.cff = font;
+ finfo.cmap = &cmap;
+
+ // save glyph names
+ Vector<PermString> glyph_names;
+ font->glyph_names(glyph_names);
+ OpenType::debug_glyph_names = glyph_names;
+
+ // set typeface name from font family name
+ {
+ String typeface = font->dict_string(Cff::oFamilyName);
+
+ // make it reasonable for the shell
+ StringAccum sa;
+ for (int i = 0; i < typeface.length(); i++)
+ if (isalnum(typeface[i]) || typeface[i] == '_' || typeface[i] == '-' || typeface[i] == '.' || typeface[i] == ',' || typeface[i] == '+')
+ sa << typeface[i];
+
+ set_typeface(sa.length() ? sa.take_string() : font_name, false);
+ }
+
+ // initialize encoding
+ DvipsEncoding dvipsenc(dvipsenc_in); // make copy
+ Metrics metrics(font, font->nglyphs());
+ // encode boundary glyph at 256; pretend its Unicode value is '\n'
+ metrics.encode(256, '\n', metrics.boundary_glyph());
+ if (dvipsenc_literal)
+ dvipsenc.make_metrics(metrics, cmap, font, 0, true, errh);
+ else {
+ T1Secondary secondary(finfo, font_name, otf_filename);
+ dvipsenc.make_metrics(metrics, cmap, font, &secondary, false, errh);
+ }
+
+ // maintain statistics about features
+ HashMap<uint32_t, int> feature_usage(0);
+
+ // apply activated GSUB features
+ try {
+ do_gsub(metrics, otf, dvipsenc, dvipsenc_literal, feature_usage, glyph_names, errh);
+ } catch (OpenType::BlankTable) {
+ // nada
+ } catch (OpenType::Error e) {
+ errh->warning("GSUB '%s' error, continuing", e.description.c_str());
+ }
+
+ // apply LIGKERN ligature commands to the result
+ dvipsenc.apply_ligkern_lig(metrics, errh);
+
+ // test fake ligature mechanism
+ //metrics.add_threeligature('T', 'h', 'e', '0');
+
+ // reencode characters to fit within 8 bytes (+ 1 for the boundary)
+ if (!dvipsenc_literal)
+ metrics.shrink_encoding(257, dvipsenc_in, errh);
+
+ // apply activated GPOS features
+ try {
+ do_gpos(metrics, otf, feature_usage, errh);
+ } catch (OpenType::BlankTable) {
+ // nada
+ } catch (OpenType::Error e) {
+ errh->warning("GPOS '%s' error, continuing", e.description.c_str());
+ }
+
+ // apply LIGKERN kerning and POS positioning commands to the result
+ dvipsenc.apply_ligkern_kern(metrics, errh);
+ dvipsenc.apply_position(metrics, errh);
+
+ // remove extra characters
+ metrics.cut_encoding(257);
+ //metrics.unparse();
+ int boundary_char = dvipsenc.boundary_char();
+
+ // apply letterspacing, if any
+ if (letterspace) {
+ for (int code = 0; code < 256; code++) {
+ int g = metrics.glyph(code);
+ if (g != 0 && g != Metrics::VIRTUAL_GLYPH && code != boundary_char) {
+ metrics.add_single_positioning(code, letterspace / 2, 0, letterspace);
+ metrics.add_kern(code, 256, -letterspace / 2);
+ metrics.add_kern(256, code, -letterspace / 2);
+ }
+ }
+ }
+
+ // apply math letterspacing, if any
+ if (math_spacing)
+ do_math_spacing(metrics, finfo, dvipsenc);
+
+ // reencode right components of boundary_glyph as boundary_char
+ if (metrics.reencode_right_ligkern(256, boundary_char) > 0
+ && boundary_char < 0) {
+ errh->warning("no boundary character, ignoring some ligatures and/or kerns\n");
+ errh->message("(You may want to try the --boundary-char option.)");
+ }
+
+ // report unused and underused features if any
+ report_underused_features(feature_usage, errh);
+
+ // figure out our FONTNAME
+ if (!font_name) {
+ // derive font name from OpenType font name
+ font_name = font->font_name();
+ if (encoding_file) {
+ int slash = encoding_file.find_right('/') + 1;
+ int dot = encoding_file.find_right('.');
+ if (dot < slash) // includes dot < 0 case
+ dot = encoding_file.length();
+ font_name += String("--") + encoding_file.substring(slash, dot - slash);
+ }
+ if (interesting_scripts.size() != 2 || interesting_scripts[0] != OpenType::Tag("latn") || interesting_scripts[1].valid())
+ for (int i = 0; i < interesting_scripts.size(); i += 2) {
+ font_name += String("--S") + interesting_scripts[i].text();
+ if (interesting_scripts[i+1].valid())
+ font_name += String(".") + interesting_scripts[i+1].text();
+ }
+ for (int i = 0; i < interesting_features.size(); i++)
+ if (feature_usage[interesting_features[i].value()])
+ font_name += String("--F") + interesting_features[i].text();
+ }
+
+ // output encoding
+ if (dvipsenc_literal) {
+ out_encoding_name = dvipsenc_in.name();
+ out_encoding_file = dvipsenc_in.filename();
+ } else
+ output_encoding(metrics, glyph_names, errh);
+
+ // set up coding scheme
+ if (metrics.coding_scheme())
+ metrics.set_design_units(1);
+ else
+ metrics.set_coding_scheme(out_encoding_name);
+
+ // output
+ ::otf_filename = otf_filename;
+ output_metrics(metrics, font->font_name(), dvipsenc.boundary_char(),
+ finfo,
+ out_encoding_name, out_encoding_file,
+ font_name, main_dvips_map, errh);
+
+ // done
+ delete font;
+}
+
+
+extern "C" {
+static int
+clp_parse_char(Clp_Parser *clp, const char *arg, int complain, void *)
+{
+ if (arg[0] && !arg[1] && !isdigit(arg[0])) {
+ clp->val.i = (unsigned char)arg[0];
+ return 1;
+ } else if (arg[0] == '-' || isdigit(arg[0])) {
+ char *end;
+ clp->val.i = strtol(arg, &end, 10);
+ if (clp->val.i <= 255 && !*end)
+ return 1;
+ }
+ if (complain)
+ Clp_OptionError(clp, "'%O' expects a character, not '%s'", arg);
+ return 0;
+}
+}
+
+int
+main(int argc, char *argv[])
+{
+#ifndef WIN32
+ handle_sigchld();
+#endif
+ String::static_initialize();
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ Clp_AddType(clp, CHAR_OPTTYPE, 0, clp_parse_char, 0);
+ program_name = Clp_ProgramName(clp);
+#if HAVE_KPATHSEA
+ kpsei_init(argv[0], "lcdftools");
+#endif
+#ifdef HAVE_CTIME
+ {
+ time_t t = time(0);
+ char *c = ctime(&t);
+ current_time = " on " + String(c).substring(0, -1); // get rid of \n
+ }
+#endif
+ for (int i = 0; i < argc; i++)
+ invocation << (i ? " " : "") << argv[i];
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ const char *input_file = 0;
+ String glyphlist_file;
+ bool literal_encoding = false;
+ Vector<String> ligkern;
+ Vector<String> pos;
+ Vector<String> unicoding;
+ bool no_ecommand = false, default_ligkern = true;
+ String codingscheme;
+
+ GlyphFilter current_substitution_filter;
+ GlyphFilter current_alternate_filter;
+ GlyphFilter* current_filter_ptr = &null_filter;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case SCRIPT_OPT: {
+ String arg = clp->arg;
+ int period = arg.find_left('.');
+ OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));
+ if (scr.valid() && period > 0) {
+ OpenType::Tag lang(arg.substring(period + 1));
+ if (lang.valid()) {
+ interesting_scripts.push_back(scr);
+ interesting_scripts.push_back(lang);
+ } else
+ usage_error(errh, "bad language tag");
+ } else if (scr.valid()) {
+ interesting_scripts.push_back(scr);
+ interesting_scripts.push_back(OpenType::Tag());
+ } else
+ usage_error(errh, "bad script tag");
+ break;
+ }
+
+ case FEATURE_OPT: {
+ OpenType::Tag t(clp->arg);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (feature_filters[t])
+ usage_error(errh, "feature '%s' included twice", t.text().c_str());
+ else {
+ if (!current_filter_ptr)
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ interesting_features.push_back(t);
+ feature_filters.insert(t, current_filter_ptr);
+ }
+ break;
+ }
+
+ case LETTER_FEATURE_OPT: {
+ OpenType::Tag t(clp->arg);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (feature_filters[t])
+ usage_error(errh, "feature '%s' included twice", t.text().c_str());
+ else {
+ interesting_features.push_back(t);
+ GlyphFilter* gf = new GlyphFilter;
+ gf->add_substitution_filter("<Letter>", false, errh);
+ *gf += current_alternate_filter;
+ feature_filters.insert(t, gf);
+ }
+ break;
+ }
+
+ case SUBS_FILTER_OPT:
+ current_substitution_filter = null_filter;
+ /* fallthru */
+ case EXCLUDE_SUBS_OPT:
+ case INCLUDE_SUBS_OPT:
+ current_substitution_filter.add_substitution_filter(clp->arg, opt == EXCLUDE_SUBS_OPT, errh);
+ current_filter_ptr = 0;
+ break;
+
+ case CLEAR_SUBS_OPT:
+ current_substitution_filter = null_filter;
+ current_filter_ptr = 0;
+ break;
+
+ case ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->arg;
+ break;
+
+ case LITERAL_ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->arg;
+ literal_encoding = true;
+ break;
+
+ case EXTEND_OPT:
+ if (extend)
+ usage_error(errh, "extend value specified twice");
+ extend = clp->val.d;
+ break;
+
+ case SLANT_OPT:
+ if (slant)
+ usage_error(errh, "slant value specified twice");
+ slant = clp->val.d;
+ break;
+
+ case LETTERSPACE_OPT:
+ if (letterspace)
+ usage_error(errh, "letterspacing value specified twice");
+ letterspace = clp->val.i;
+ break;
+
+ case SPACE_FACTOR_OPT:
+ if (space_factor != 1)
+ usage_error(errh, "space factor specified twice");
+ space_factor = clp->val.d;
+ break;
+
+ case MATH_SPACING_OPT:
+ math_spacing = !clp->negated;
+ if (math_spacing && clp->have_arg) {
+ if (clp->val.i < 0 || clp->val.i > 255)
+ usage_error(errh, "--math-spacing skew character must be between 0 and 255");
+ skew_char = clp->val.i;
+ }
+ break;
+
+ case DESIGN_SIZE_OPT:
+ if (design_size > 0)
+ usage_error(errh, "design size value specified twice");
+ else if (clp->val.d <= 0)
+ usage_error(errh, "design size must be > 0");
+ design_size = clp->val.d;
+ break;
+
+ case LIGKERN_OPT:
+ ligkern.push_back(clp->arg);
+ break;
+
+ case POSITION_OPT:
+ pos.push_back(clp->arg);
+ break;
+
+ case NO_ECOMMAND_OPT:
+ no_ecommand = true;
+ break;
+
+ case DEFAULT_LIGKERN_OPT:
+ default_ligkern = !clp->negated;
+ break;
+
+ case BOUNDARY_CHAR_OPT:
+ ligkern.push_back(String("|| = ") + String(clp->val.i));
+ break;
+
+ case ALTSELECTOR_CHAR_OPT:
+ ligkern.push_back(String("^^ = ") + String(clp->val.i));
+ break;
+
+ case ALTSELECTOR_FEATURE_OPT: {
+ OpenType::Tag t(clp->arg);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (altselector_feature_filters[t])
+ usage_error(errh, "altselector feature '%s' included twice", t.text().c_str());
+ else {
+ if (!current_filter_ptr)
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ altselector_features.push_back(t);
+ altselector_feature_filters.insert(t, current_filter_ptr);
+ }
+ break;
+ }
+
+ case ALTERNATES_FILTER_OPT:
+ current_alternate_filter = null_filter;
+ /* fallthru */
+ case EXCLUDE_ALTERNATES_OPT:
+ case INCLUDE_ALTERNATES_OPT:
+ current_alternate_filter.add_alternate_filter(clp->arg, opt == EXCLUDE_ALTERNATES_OPT, errh);
+ current_filter_ptr = 0;
+ break;
+
+ case CLEAR_ALTERNATES_OPT:
+ current_alternate_filter = null_filter;
+ current_filter_ptr = 0;
+ break;
+
+ case UNICODING_OPT:
+ unicoding.push_back(clp->arg);
+ break;
+
+ case CODINGSCHEME_OPT:
+ if (codingscheme)
+ usage_error(errh, "coding scheme specified twice");
+ codingscheme = clp->arg;
+ if (codingscheme.length() > 39)
+ errh->warning("only first 39 characters of coding scheme are significant");
+ if (codingscheme.find_left('(') >= 0 || codingscheme.find_left(')') >= 0)
+ usage_error(errh, "coding scheme cannot contain parentheses");
+ break;
+
+ case AUTOMATIC_OPT:
+ automatic = !clp->negated;
+ break;
+
+ case VENDOR_OPT:
+ if (!set_vendor(clp->arg))
+ usage_error(errh, "vendor name specified twice");
+ break;
+
+ case TYPEFACE_OPT:
+ if (!set_typeface(clp->arg, true))
+ usage_error(errh, "typeface name specified twice");
+ break;
+
+ case VIRTUAL_OPT:
+ if (clp->negated)
+ output_flags &= ~G_VMETRICS;
+ else
+ output_flags |= G_VMETRICS;
+ break;
+
+ case NO_ENCODING_OPT:
+ case NO_TYPE1_OPT:
+ case NO_DOTLESSJ_OPT:
+ case NO_UPDMAP_OPT:
+ output_flags &= ~(opt - NO_OUTPUT_OPTS);
+ break;
+
+ case OUTPUT_ENCODING_OPT:
+ if (out_encoding_file)
+ usage_error(errh, "encoding output file specified twice");
+ out_encoding_file = (clp->have_arg ? clp->arg : "-");
+ output_flags = G_ENCODING;
+ break;
+
+ case MINIMUM_KERN_OPT:
+ minimum_kern = clp->val.d;
+ break;
+
+ case MAP_FILE_OPT:
+ if (clp->negated)
+ output_flags &= ~G_PSFONTSMAP;
+ else {
+ output_flags |= G_PSFONTSMAP;
+ if (!set_map_file(clp->arg))
+ usage_error(errh, "map file specified twice");
+ }
+ break;
+
+ case PL_OPT:
+ output_flags = (output_flags & ~G_BINARY) | G_ASCII;
+ break;
+
+ case TFM_OPT:
+ output_flags = (output_flags & ~G_ASCII) | G_BINARY;
+ break;
+
+ case ENCODING_DIR_OPT:
+ case TFM_DIR_OPT:
+ case PL_DIR_OPT:
+ case VF_DIR_OPT:
+ case VPL_DIR_OPT:
+ case TYPE1_DIR_OPT:
+ if (!setodir(opt - DIR_OPTS, clp->arg))
+ usage_error(errh, "%s directory specified twice", odirname(opt - DIR_OPTS));
+ break;
+
+ case FONT_NAME_OPT:
+ font_name:
+ if (font_name)
+ usage_error(errh, "font name specified twice");
+ font_name = clp->arg;
+ break;
+
+ case GLYPHLIST_OPT:
+ glyphlist_file = clp->arg;
+ break;
+
+ case QUERY_FEATURES_OPT:
+ usage_error(errh, "run 'otfinfo --query-features' instead");
+ break;
+
+ case QUERY_SCRIPTS_OPT:
+ usage_error(errh, "run 'otfinfo --query-scripts' instead");
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = ErrorHandler::silent_handler();
+ break;
+
+ case VERBOSE_OPT:
+ verbose = !clp->negated;
+ break;
+
+ case NOCREATE_OPT:
+ no_create = clp->negated;
+ break;
+
+ case FORCE_OPT:
+ force = !clp->negated;
+ break;
+
+ case KPATHSEA_DEBUG_OPT:
+#if HAVE_KPATHSEA
+ kpsei_set_debug_flags(clp->val.u);
+#else
+ errh->warning("Not compiled with kpathsea!");
+#endif
+ break;
+
+ case VERSION_OPT:
+ printf("otftotfm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2002-2005 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && font_name)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto font_name;
+ else
+ input_file = clp->arg;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ try {
+ if (!input_file)
+ usage_error(errh, "no font filename provided");
+ if (!encoding_file) {
+ errh->warning("no encoding provided");
+ errh->message("(Use '-e ENCODING' to choose an encoding. '-e texnansx' often works,\nor say '-e -' to turn off this warning.)");
+ } else if (encoding_file == "-")
+ encoding_file = "";
+
+ // read font
+ otf_data = read_file(input_file, errh);
+ if (errh->nerrors())
+ exit(1);
+
+ LandmarkErrorHandler cerrh(errh, printable_filename(input_file));
+ BailErrorHandler bail_errh(&cerrh);
+
+ OpenType::Font otf(otf_data, &bail_errh);
+ assert(otf.ok());
+
+ // figure out scripts we care about
+ if (!interesting_scripts.size()) {
+ interesting_scripts.push_back(Efont::OpenType::Tag("latn"));
+ interesting_scripts.push_back(Efont::OpenType::Tag());
+ }
+ std::sort(interesting_features.begin(), interesting_features.end());
+ std::sort(altselector_features.begin(), altselector_features.end());
+
+ // find glyphlist
+#if HAVE_KPATHSEA
+ if (!glyphlist_file) {
+ glyphlist_file = kpsei_find_file("glyphlist.txt", KPSEI_FMT_OTHER_TEXT);
+ if (glyphlist_file && verbose)
+ errh->message("glyphlist.txt found with kpathsea at %s", glyphlist_file.c_str());
+ }
+#endif
+ if (!glyphlist_file)
+ glyphlist_file = SHAREDIR "/glyphlist.txt";
+
+ // read glyphlist
+ if (String s = read_file(glyphlist_file, errh, true))
+ DvipsEncoding::parse_glyphlist(s);
+
+ // read encoding
+ DvipsEncoding dvipsenc;
+ if (encoding_file) {
+ if (String path = locate_encoding(encoding_file, errh))
+ dvipsenc.parse(path, no_ecommand, no_ecommand, errh);
+ else
+ errh->fatal("encoding '%s' not found", encoding_file.c_str());
+ } else {
+ // use encoding from font
+ Cff cff(otf.table("CFF"), &bail_errh);
+ Cff::FontParent *font = cff.font(PermString(), &bail_errh);
+ assert(cff.ok() && font->ok());
+ if (Type1Encoding *t1e = font->type1_encoding()) {
+ for (int i = 0; i < 256; i++)
+ dvipsenc.encode(i, (*t1e)[i]);
+ } else
+ errh->fatal("font has no encoding, specify one explicitly");
+ delete font;
+ }
+
+ // apply default ligkern commands
+ if (default_ligkern)
+ dvipsenc.parse_ligkern(default_ligkerns, 0, ErrorHandler::silent_handler());
+
+ // apply command-line ligkern commands and coding scheme
+ cerrh.set_landmark("--ligkern command");
+ for (int i = 0; i < ligkern.size(); i++)
+ dvipsenc.parse_ligkern(ligkern[i], 1, &cerrh);
+ cerrh.set_landmark("--position command");
+ for (int i = 0; i < pos.size(); i++)
+ dvipsenc.parse_position(pos[i], 1, &cerrh);
+ cerrh.set_landmark("--unicoding command");
+ for (int i = 0; i < unicoding.size(); i++)
+ dvipsenc.parse_unicoding(unicoding[i], 1, &cerrh);
+ if (codingscheme)
+ dvipsenc.set_coding_scheme(codingscheme);
+
+ do_file(input_file, otf, dvipsenc, literal_encoding, errh);
+
+ } catch (OpenType::Error e) {
+ errh->error("unhandled exception '%s'", e.description.c_str());
+ }
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.hh b/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.hh
new file mode 100644
index 00000000000..f8f0ed1cc9d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/otftotfm.hh
@@ -0,0 +1,18 @@
+#ifndef OTFTOTFM_OTFTOTFM_HH
+#define OTFTOTFM_OTFTOTFM_HH
+
+String suffix_font_name(const String &font_name, const String &suffix);
+
+void output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo,
+ const String &encoding_name, const String &encoding_file,
+ const String &font_name,
+ void (*dvips_include)(const String &ps_name, StringAccum &, ErrorHandler *),
+ ErrorHandler *errh);
+
+int font_x_height(const FontInfo &, const Transform &);
+int font_cap_height(const FontInfo &, const Transform &);
+int font_ascender(const FontInfo &, const Transform &);
+double font_slant(const FontInfo &);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/secondary.cc b/Build/source/utils/lcdf-typetools/otftotfm/secondary.cc
new file mode 100644
index 00000000000..09120d331a9
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/secondary.cc
@@ -0,0 +1,514 @@
+/* secondary.{cc,hh} -- code for generating fake glyphs
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#include <config.h>
+#include "secondary.hh"
+#include "metrics.hh"
+#include "automatic.hh"
+#include "otftotfm.hh"
+#include "util.hh"
+#include <efont/t1bounds.hh>
+#include <efont/t1font.hh>
+#include <efont/t1rw.hh>
+#include <efont/otfos2.hh>
+#include <lcdf/straccum.hh>
+#include <stdarg.h>
+#include <errno.h>
+#include <limits.h>
+#include <algorithm>
+
+enum { U_EXCLAMDOWN = 0x00A1, // U+00A1 INVERTED EXCLAMATION MARK
+ U_DEGREE = 0x00B0, // U+00B0 DEGREE SIGN
+ U_QUESTIONDOWN = 0x00BF, // U+00BF INVERTED QUESTION MARK
+ U_IJ = 0x0132, // U+0132 LATIN CAPITAL LIGATURE IJ
+ U_ij = 0x0133, // U+0133 LATIN SMALL LIGATURE IJ
+ U_DOTLESSJ = 0x0237, // U+0237 LATIN SMALL LETTER DOTLESS J
+ U_CWM = 0x200C, // U+200C ZERO WIDTH NON-JOINER
+ U_ENDASH = 0x2013, // U+2013 EN DASH
+ U_PERTENTHOUSAND = 0x2031, // U+2031 PER TEN THOUSAND SIGN
+ U_INTERROBANG = 0x203D, // U+203D INTERROBANG
+ U_FRACTION = 0x2044, // U+2044 FRACTION SLASH
+ U_CENTIGRADE = 0x2103, // U+2103 DEGREE CELSIUS
+ U_ASTERISKMATH = 0x2217, // U+2217 ASTERISK OPERATOR
+ U_BARDBL = 0x2225, // U+2225 PARALLEL TO
+ U_VISIBLESPACE = 0x2423, // U+2423 OPEN BOX
+ U_DBLBRACKETLEFT = 0x27E6,
+ U_DBLBRACKETRIGHT = 0x27E7,
+ U_SS = 0xD800, // invalid Unicode
+ U_EMPTYSLOT = 0xD801, // invalid Unicode (not handled by Secondary)
+ U_ALTSELECTOR = 0xD802, // invalid Unicode
+ U_SSSMALL = 0xD803, // invalid Unicode
+ U_FFSMALL = 0xD804, // invalid Unicode
+ U_FISMALL = 0xD805, // invalid Unicode
+ U_FLSMALL = 0xD806, // invalid Unicode
+ U_FFISMALL = 0xD807, // invalid Unicode
+ U_FFLSMALL = 0xD808, // invalid Unicode
+ U_CAPITALCWM = 0xD809, // invalid Unicode
+ U_ASCENDERCWM = 0xD80A, // invalid Unicode
+ U_INTERROBANGDOWN = 0xD80B, // invalid Unicode
+ U_TWELVEUDASH = 0xD80C, // invalid Unicode
+ U_VS1 = 0xFE00,
+ U_VS16 = 0xFE0F,
+ U_VS17 = 0xE0100,
+ U_VS256 = 0xE01FF,
+ U_DOTLESSJ_2 = 0xF6BE,
+ U_THREEQUARTERSEMDASH = 0xF6DE,
+ U_FSMALL = 0xF766,
+ U_ISMALL = 0xF769,
+ U_LSMALL = 0xF76C,
+ U_SSMALL = 0xF773 };
+
+Secondary::~Secondary()
+{
+}
+
+bool
+Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics &metrics, ErrorHandler *errh)
+{
+ Vector<Setting> v;
+ if (setting(uni, v, metrics, errh)) {
+ metrics.encode_virtual(code, name, uni, v);
+ return true;
+ } else if (_next)
+ return _next->encode_uni(code, name, uni, metrics, errh);
+ else
+ return false;
+}
+
+T1Secondary::T1Secondary(const FontInfo &finfo, const String &font_name,
+ const String &otf_file_name)
+ : _finfo(finfo), _font_name(font_name), _otf_file_name(otf_file_name),
+ _xheight(font_x_height(finfo, Transform())), _spacewidth(1000)
+{
+ int bounds[4], width;
+ if (char_bounds(bounds, width, finfo, Transform(), ' '))
+ _spacewidth = width;
+}
+
+bool
+Secondary::setting(uint32_t uni, Vector<Setting> &v, Metrics &metrics, ErrorHandler *errh)
+{
+ if (_next)
+ return _next->setting(uni, v, metrics, errh);
+ else
+ return false;
+}
+
+bool
+T1Secondary::char_setting(Vector<Setting> &v, Metrics &metrics, int uni, ...)
+{
+ Vector<int> codes;
+
+ // collect codes
+ va_list val;
+ va_start(val, uni);
+ for (; uni; uni = va_arg(val, int)) {
+ int code = metrics.unicode_encoding(uni);
+ if (code < 0) {
+ Glyph glyph = _finfo.cmap->map_uni(uni);
+ if (glyph == 0 || (code = metrics.force_encoding(glyph)) < 0)
+ return false;
+ }
+ codes.push_back(code);
+ }
+ va_end(val);
+
+ // generate setting
+ for (int i = 0; i < codes.size(); i++) {
+ if (i)
+ v.push_back(Setting(Setting::KERN));
+ v.push_back(Setting(Setting::SHOW, codes[i], metrics.base_glyph(codes[i])));
+ }
+ return true;
+}
+
+bool
+T1Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics &metrics, ErrorHandler *errh)
+{
+ if (uni == U_ALTSELECTOR || (uni >= U_VS1 && uni <= U_VS16) || (uni >= U_VS17 && uni <= U_VS256)) {
+ Vector<Setting> v;
+ setting(uni, v, metrics, errh);
+ int which = (uni == U_ALTSELECTOR ? 0 : (uni <= U_VS16 ? uni - U_VS1 + 1 : uni - U_VS17 + 17));
+ metrics.encode_virtual(code, (which ? permprintf("<vs%d>", which) : PermString("<altselector>")), uni, v);
+ metrics.add_altselector_code(code, which);
+ return true;
+ } else
+ return Secondary::encode_uni(code, name, uni, metrics, errh);
+}
+
+
+static String dotlessj_file_name;
+
+static void
+dotlessj_dvips_include(const String &, StringAccum &sa, ErrorHandler *)
+{
+ sa << '<' << pathname_filename(dotlessj_file_name);
+}
+
+int
+T1Secondary::dotlessj_font(Metrics &metrics, ErrorHandler *errh, Glyph &dj_glyph)
+{
+ if (!_font_name || !_finfo.otf)
+ return -1;
+
+ String dj_name = suffix_font_name(_font_name, "--lcdfj");
+ for (int i = 0; i < metrics.n_mapped_fonts(); i++)
+ if (metrics.mapped_font_name(i) == dj_name)
+ return i;
+
+ if (String filename = installed_type1_dotlessj(_otf_file_name, _finfo.cff->font_name(), (output_flags & G_DOTLESSJ) && (output_flags & G_TYPE1), errh)) {
+
+ // check for special case: "\0" means the font's "j" is already
+ // dotless
+ if (filename == String("\0", 1))
+ return J_NODOT;
+
+ // open dotless-j font file
+ FILE *f = fopen(filename.c_str(), "rb");
+ if (!f) {
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return -1;
+ }
+
+ // read font
+ Efont::Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == 128)
+ reader = new Efont::Type1PFBReader(f);
+ else
+ reader = new Efont::Type1PFAReader(f);
+ Efont::Type1Font *font = new Efont::Type1Font(*reader);
+ delete reader;
+
+ if (!font->ok()) {
+ errh->error("%s: no glyphs in dotless-J font", filename.c_str());
+ delete font;
+ return -1;
+ }
+
+ // create metrics for dotless-J
+ Metrics dj_metrics(font, 256);
+ Vector<PermString> glyph_names;
+ font->glyph_names(glyph_names);
+ Vector<PermString>::iterator g = std::find(glyph_names.begin(), glyph_names.end(), "uni0237");
+ if (g != glyph_names.end()) {
+ dj_glyph = g - glyph_names.begin();
+ dj_metrics.encode('j', U_DOTLESSJ, dj_glyph);
+ } else {
+ errh->error("%s: dotless-J font has no 'uni0237' glyph", filename.c_str());
+ delete font;
+ return -1;
+ }
+ ::dotlessj_file_name = filename;
+ output_metrics(dj_metrics, font->font_name(), -1, _finfo, String(), String(), dj_name, dotlessj_dvips_include, errh);
+
+ // add font to metrics
+ return metrics.add_mapped_font(font, dj_name);
+
+ } else
+ return -1;
+}
+
+bool
+T1Secondary::setting(uint32_t uni, Vector<Setting> &v, Metrics &metrics, ErrorHandler *errh)
+{
+ Transform xform;
+ int vsize = v.size();
+
+ switch (uni) {
+
+ case U_CWM:
+ case U_ALTSELECTOR:
+ v.push_back(Setting(Setting::RULE, 0, _xheight));
+ return true;
+
+ case U_CAPITALCWM:
+ v.push_back(Setting(Setting::RULE, 0, font_cap_height(_finfo, xform)));
+ return true;
+
+ case U_ASCENDERCWM:
+ v.push_back(Setting(Setting::RULE, 0, font_ascender(_finfo, xform)));
+ return true;
+
+ case U_VISIBLESPACE:
+ v.push_back(Setting(Setting::MOVE, 50, -150));
+ v.push_back(Setting(Setting::RULE, 40, 150));
+ v.push_back(Setting(Setting::RULE, _spacewidth, 40));
+ v.push_back(Setting(Setting::RULE, 40, 150));
+ v.push_back(Setting(Setting::MOVE, 50, 150));
+ return true;
+
+ case U_SS:
+ if (char_setting(v, metrics, 'S', 'S', 0))
+ return true;
+ break;
+
+ case U_SSSMALL:
+ if (char_setting(v, metrics, U_SSMALL, U_SSMALL, 0))
+ return true;
+ else if (char_setting(v, metrics, 's', 's', 0))
+ return true;
+ break;
+
+ case U_FFSMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_FSMALL, 0))
+ return true;
+ else if (char_setting(v, metrics, 'f', 'f', 0))
+ return true;
+ break;
+
+ case U_FISMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_ISMALL, 0))
+ return true;
+ else if (char_setting(v, metrics, 'f', 'i', 0))
+ return true;
+ break;
+
+ case U_FLSMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_LSMALL, 0))
+ return true;
+ else if (char_setting(v, metrics, 'f', 'l', 0))
+ return true;
+ break;
+
+ case U_FFISMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_FSMALL, U_ISMALL, 0))
+ return true;
+ else if (char_setting(v, metrics, 'f', 'f', 'i', 0))
+ return true;
+ break;
+
+ case U_FFLSMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_FSMALL, U_LSMALL, 0))
+ return true;
+ else if (char_setting(v, metrics, 'f', 'f', 'l', 0))
+ return true;
+ break;
+
+ case U_IJ:
+ if (char_setting(v, metrics, 'I', 'J', 0))
+ return true;
+ break;
+
+ case U_ij:
+ if (char_setting(v, metrics, 'i', 'j', 0))
+ return true;
+ break;
+
+ case U_DOTLESSJ:
+ case U_DOTLESSJ_2: {
+ Glyph dj_glyph;
+ int which = dotlessj_font(metrics, errh, dj_glyph);
+ if (which >= 0) {
+ v.push_back(Setting(Setting::FONT, which));
+ v.push_back(Setting(Setting::SHOW, 'j', dj_glyph));
+ return true;
+ } else if (which == J_NODOT && char_setting(v, metrics, 'j', 0))
+ return true;
+ break;
+ }
+
+ case U_DBLBRACKETLEFT:
+ if (char_setting(v, metrics, '[', 0)) {
+ double d;
+ if (!_finfo.cff->dict_value(Efont::Cff::oIsFixedPitch, &d) || !d) {
+ d = char_one_bound(_finfo, xform, 4, true, 0, '[', 0);
+ v.push_back(Setting(Setting::MOVE, (int) (-0.666 * d), 0));
+ }
+ char_setting(v, metrics, '[', 0);
+ return true;
+ }
+ break;
+
+ case U_DBLBRACKETRIGHT:
+ if (char_setting(v, metrics, ']', 0)) {
+ double d;
+ if (!_finfo.cff->dict_value(Efont::Cff::oIsFixedPitch, &d) || !d) {
+ d = char_one_bound(_finfo, xform, 4, true, 0, ']', 0);
+ v.push_back(Setting(Setting::MOVE, (int) (-0.666 * d), 0));
+ }
+ char_setting(v, metrics, ']', 0);
+ return true;
+ }
+ break;
+
+ case U_BARDBL:
+ if (char_setting(v, metrics, '|', 0)) {
+ double d;
+ if (!_finfo.cff->dict_value(Efont::Cff::oIsFixedPitch, &d) || !d) {
+ d = char_one_bound(_finfo, Transform(), 4, true, 0, '|', 0);
+ v.push_back(Setting(Setting::MOVE, (int) (-0.333 * d), 0));
+ }
+ char_setting(v, metrics, '|', 0);
+ return true;
+ }
+ break;
+
+ case U_ASTERISKMATH: {
+ int bounds[5];
+ double dropdown = 0;
+ if (char_bounds(bounds, bounds[4], _finfo, xform, '*'))
+ dropdown += std::max(bounds[3], 0) + std::min(bounds[1], 0);
+ if (char_bounds(bounds, bounds[4], _finfo, xform, '('))
+ dropdown -= std::max(bounds[3], 0) + std::min(bounds[1], 0);
+ v.push_back(Setting(Setting::MOVE, 0, (int) (-dropdown / 2)));
+ if (char_setting(v, metrics, '*', 0))
+ return true;
+ break;
+ }
+
+ case U_TWELVEUDASH:
+ if (char_setting(v, metrics, U_ENDASH, 0)) {
+ double d;
+ if (!_finfo.cff->dict_value(Efont::Cff::oIsFixedPitch, &d) || !d) {
+ d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ v.push_back(Setting(Setting::MOVE, (int) (667 - 2 * d), 0));
+ }
+ char_setting(v, metrics, U_ENDASH, 0);
+ return true;
+ }
+ break;
+
+ case U_THREEQUARTERSEMDASH:
+ if (char_setting(v, metrics, U_ENDASH, 0)) {
+ double d;
+ if (!_finfo.cff->dict_value(Efont::Cff::oIsFixedPitch, &d) || !d) {
+ d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ v.push_back(Setting(Setting::MOVE, (int) (750 - 2 * d), 0));
+ }
+ char_setting(v, metrics, U_ENDASH, 0);
+ return true;
+ }
+ break;
+
+ case U_CENTIGRADE:
+ // TODO: set italic correction to that of a 'C'
+ if (char_setting(v, metrics, U_DEGREE, 'C', 0))
+ return true;
+ break;
+
+ case U_INTERROBANG: {
+ double exclam_offset =
+ (char_one_bound(_finfo, xform, 4, true, 0, '?', 0)
+ - char_one_bound(_finfo, xform, 4, true, 0, '!', 0)) * 0.5 + 50;
+ v.push_back(Setting(Setting::PUSH));
+ v.push_back(Setting(Setting::MOVE, (int) exclam_offset, 0));
+ if (char_setting(v, metrics, '!', 0)) {
+ v.push_back(Setting(Setting::POP));
+ if (char_setting(v, metrics, '?', 0))
+ return true;
+ }
+ break;
+ }
+
+ case U_INTERROBANGDOWN: {
+ double exclam_offset =
+ (char_one_bound(_finfo, xform, 4, true, 0, U_QUESTIONDOWN, 0)
+ - char_one_bound(_finfo, xform, 4, true, 0, U_EXCLAMDOWN, 0)) * 0.5 + 50;
+ v.push_back(Setting(Setting::PUSH));
+ v.push_back(Setting(Setting::MOVE, (int) exclam_offset, 0));
+ if (char_setting(v, metrics, U_EXCLAMDOWN, 0)) {
+ v.push_back(Setting(Setting::POP));
+ if (char_setting(v, metrics, U_QUESTIONDOWN, 0))
+ return true;
+ }
+ break;
+ }
+
+ case U_PERTENTHOUSAND:
+ if (char_setting(v, metrics, 0xF661, U_FRACTION, 0xF655, 0xF655, 0xF655, 0))
+ return true;
+ break;
+
+ }
+
+ // didn't find a good setting, restore v to pristine state
+ while (v.size() > vsize)
+ v.pop_back();
+
+ // variant selectors get the same setting as ALTSELECTOR
+ if ((uni >= U_VS1 && uni <= U_VS16) || (uni >= U_VS17 && uni <= U_VS256))
+ return setting(U_ALTSELECTOR, v, metrics, errh);
+
+ // otherwise, try other secondaries
+ return Secondary::setting(uni, v, metrics, errh);
+}
+
+
+bool
+char_bounds(int bounds[4], int &width, const FontInfo &finfo,
+ const Transform &transform, uint32_t uni)
+{
+ if (Efont::OpenType::Glyph g = finfo.cmap->map_uni(uni))
+ return Efont::CharstringBounds::bounds(transform, finfo.cff->glyph_context(g), bounds, width);
+ else
+ return false;
+}
+
+int
+char_one_bound(const FontInfo &finfo, const Transform &transform,
+ int dimen, bool max, int best, uint32_t uni, ...)
+{
+ int bounds[5];
+ va_list val;
+ va_start(val, uni);
+ while (uni != 0) {
+ if (char_bounds(bounds, bounds[4], finfo, transform, uni))
+ if (max ? bounds[dimen] > best : bounds[dimen] < best)
+ best = bounds[dimen];
+ uni = va_arg(val, uint32_t);
+ }
+ va_end(val);
+ return best;
+}
+
+int
+font_x_height(const FontInfo &finfo, const Transform &font_xform)
+{
+ try {
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.x_height();
+ } catch (Efont::OpenType::Bounds) {
+ // XXX what if 'x', 'm', 'z' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, false, 1000,
+ 'x', 'm', 'z', 0);
+ }
+}
+
+int
+font_cap_height(const FontInfo &finfo, const Transform &font_xform)
+{
+ try {
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.cap_height();
+ } catch (Efont::OpenType::Bounds) {
+ // XXX what if 'x', 'm', 'z' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, false, 1000,
+ 'H', 'O', 'B', 0);
+ }
+}
+
+int
+font_ascender(const FontInfo &finfo, const Transform &font_xform)
+{
+ try {
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.typo_ascender();
+ } catch (Efont::OpenType::Bounds) {
+ // XXX what if 'x', 'm', 'z' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, true,
+ font_x_height(finfo, font_xform),
+ 'd', 'l', 0);
+ }
+}
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/secondary.hh b/Build/source/utils/lcdf-typetools/otftotfm/secondary.hh
new file mode 100644
index 00000000000..c4914d248a3
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/secondary.hh
@@ -0,0 +1,47 @@
+#ifndef OTFTOTFM_SECONDARY_HH
+#define OTFTOTFM_SECONDARY_HH
+#include <efont/otfcmap.hh>
+#include <efont/cff.hh>
+class Metrics;
+class Transform;
+struct Setting;
+
+struct FontInfo {
+ const Efont::OpenType::Font *otf;
+ const Efont::Cff::Font *cff;
+ const Efont::OpenType::Cmap *cmap;
+};
+
+class Secondary { public:
+ Secondary() : _next(0) { }
+ virtual ~Secondary();
+ void set_next(Secondary *s) { _next = s; }
+ typedef Efont::OpenType::Glyph Glyph;
+ virtual bool encode_uni(int code, PermString name, uint32_t uni, Metrics &, ErrorHandler *);
+ virtual bool setting(uint32_t uni, Vector<Setting> &, Metrics &, ErrorHandler *);
+ private:
+ Secondary *_next;
+};
+
+class T1Secondary : public Secondary { public:
+ T1Secondary(const FontInfo &, const String &font_name, const String &otf_file_name);
+ bool encode_uni(int code, PermString name, uint32_t uni, Metrics &, ErrorHandler *);
+ bool setting(uint32_t uni, Vector<Setting> &, Metrics &, ErrorHandler *);
+ private:
+ const FontInfo &_finfo;
+ String _font_name;
+ String _otf_file_name;
+ int _xheight;
+ int _spacewidth;
+ bool char_setting(Vector<Setting> &, Metrics &, int uni, ...);
+ enum { J_NODOT = -1031892 /* unlikely value */ };
+ int dotlessj_font(Metrics &, ErrorHandler *, Glyph &dj_glyph);
+};
+
+bool char_bounds(int bounds[4], int &width, const FontInfo &,
+ const Transform &, uint32_t uni);
+
+int char_one_bound(const FontInfo &, const Transform &,
+ int dimen, bool max, int best, uint32_t uni, ...);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/uniprop.cc b/Build/source/utils/lcdf-typetools/otftotfm/uniprop.cc
new file mode 100644
index 00000000000..c3af4c69dbe
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/uniprop.cc
@@ -0,0 +1,340 @@
+/* uniprop.{cc,hh} -- code for Unicode character properties
+ *
+ * Copyright (c) 2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#include <config.h>
+#include "uniprop.hh"
+#include <lcdf/string.hh>
+
+const unsigned char UnicodeProperty::property_pages[] = {
+ 0, P_Cn,
+ 0, P_Cc, 32, P_Zs, 33, P_Po, 36, P_Sc, 37, P_Po, 40, P_Ps, 41, P_Pe, 42, P_Po, 43, P_Sm, 44, P_Po, 45, P_Pd, 46, P_Po, 48, P_Nd, 58, P_Po, 60, P_Sm, 63, P_Po, 65, P_Lu, 91, P_Ps, 92, P_Po, 93, P_Pe, 94, P_Sk, 95, P_Pc, 96, P_Sk, 97, P_Ll, 123, P_Ps, 124, P_Sm, 125, P_Pe, 126, P_Sm, 127, P_Cc, 160, P_Zs, 161, P_Po, 162, P_Sc, 166, P_So, 168, P_Sk, 169, P_So, 170, P_Ll, 171, P_Pi, 172, P_Sm, 173, P_Cf, 174, P_So, 175, P_Sk, 176, P_So, 177, P_Sm, 178, P_No, 180, P_Sk, 181, P_Ll, 182, P_So, 183, P_Po, 184, P_Sk, 185, P_No, 186, P_Ll, 187, P_Pf, 188, P_No, 191, P_Po, 192, P_Lu, 215, P_Sm, 216, P_Lu, 223, P_Ll, 247, P_Sm, 248, P_Ll,
+ 0, P_Lul, 56, P_Ll, 57, P_Lul, 73, P_Ll, 74, P_Lul, 120, P_Lu, 122, P_Ll, 123, P_Lul, 127, P_Ll, 129, P_Lu, 131, P_Ll, 132, P_Lul, 134, P_Lu, 136, P_Ll, 137, P_Lu, 140, P_Ll, 142, P_Lu, 146, P_Ll, 147, P_Lu, 149, P_Ll, 150, P_Lu, 153, P_Ll, 156, P_Lu, 158, P_Ll, 159, P_Lu, 161, P_Ll, 162, P_Lul, 166, P_Lu, 168, P_Ll, 169, P_Lul, 171, P_Ll, 172, P_Lul, 174, P_Lu, 176, P_Ll, 177, P_Lu, 180, P_Ll, 181, P_Lul, 183, P_Lu, 185, P_Ll, 187, P_Lo, 188, P_Lul, 190, P_Ll, 192, P_Lo, 196, P_Lu, 197, P_Lt, 198, P_Ll, 199, P_Lu, 200, P_Lt, 201, P_Ll, 202, P_Lu, 203, P_Lt, 204, P_Ll, 205, P_Lul, 221, P_Ll, 222, P_Lul, 240, P_Ll, 241, P_Lu, 242, P_Lt, 243, P_Ll, 244, P_Lul, 246, P_Lu, 249, P_Ll, 250, P_Lul,
+ 0, P_Lul, 52, P_Ll, 55, P_Cn, 80, P_Ll, 176, P_Lm, 194, P_Sk, 198, P_Lm, 210, P_Sk, 224, P_Lm, 229, P_Sk, 238, P_Lm, 239, P_Sk,
+ 0, P_Mn, 88, P_Cn, 93, P_Mn, 112, P_Cn, 116, P_Sk, 118, P_Cn, 122, P_Lm, 123, P_Cn, 126, P_Po, 127, P_Cn, 132, P_Sk, 134, P_Lu, 135, P_Po, 136, P_Lu, 139, P_Cn, 140, P_Lu, 141, P_Cn, 142, P_Lu, 144, P_Ll, 145, P_Lu, 162, P_Cn, 163, P_Lu, 172, P_Ll, 207, P_Cn, 208, P_Ll, 210, P_Lu, 213, P_Ll, 216, P_Lul, 240, P_Ll, 244, P_Lul, 246, P_Sm, 247, P_Lul, 249, P_Lu, 251, P_Ll, 252, P_Cn,
+ 0, P_Lu, 48, P_Ll, 96, P_Lul, 130, P_So, 131, P_Mn, 135, P_Cn, 136, P_Me, 138, P_Lul, 192, P_Lu, 194, P_Ll, 195, P_Lul, 207, P_Cn, 208, P_Lul, 246, P_Cn, 248, P_Lul, 250, P_Cn,
+ 0, P_Lul, 16, P_Cn, 49, P_Lu, 87, P_Cn, 89, P_Lm, 90, P_Po, 96, P_Cn, 97, P_Ll, 136, P_Cn, 137, P_Po, 138, P_Pd, 139, P_Cn, 145, P_Mn, 162, P_Cn, 163, P_Mn, 186, P_Cn, 187, P_Mn, 190, P_Po, 191, P_Mn, 192, P_Po, 193, P_Mn, 195, P_Po, 196, P_Mn, 197, P_Cn, 208, P_Lo, 235, P_Cn, 240, P_Lo, 243, P_Po, 245, P_Cn,
+ 0, P_Cf, 4, P_Cn, 12, P_Po, 14, P_So, 16, P_Mn, 22, P_Cn, 27, P_Po, 28, P_Cn, 31, P_Po, 32, P_Cn, 33, P_Lo, 59, P_Cn, 64, P_Lm, 65, P_Lo, 75, P_Mn, 89, P_Cn, 96, P_Nd, 106, P_Po, 110, P_Lo, 112, P_Mn, 113, P_Lo, 212, P_Po, 213, P_Lo, 214, P_Mn, 221, P_Cf, 222, P_Me, 223, P_Mn, 229, P_Lm, 231, P_Mn, 233, P_So, 234, P_Mn, 238, P_Lo, 240, P_Nd, 250, P_Lo, 253, P_So, 255, P_Lo,
+ 0, P_Po, 14, P_Cn, 15, P_Cf, 16, P_Lo, 17, P_Mn, 18, P_Lo, 48, P_Mn, 75, P_Cn, 77, P_Lo, 80, P_Cn, 128, P_Lo, 166, P_Mn, 177, P_Lo, 178, P_Cn,
+ 0, P_Cn, 1, P_Mn, 3, P_Mc, 4, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Lo, 62, P_Mc, 65, P_Mn, 73, P_Mc, 77, P_Mn, 78, P_Cn, 80, P_Lo, 81, P_Mn, 85, P_Cn, 88, P_Lo, 98, P_Mn, 100, P_Po, 102, P_Nd, 112, P_Po, 113, P_Cn, 129, P_Mn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 143, P_Lo, 145, P_Cn, 147, P_Lo, 169, P_Cn, 170, P_Lo, 177, P_Cn, 178, P_Lo, 179, P_Cn, 182, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 193, P_Mn, 197, P_Cn, 199, P_Mc, 201, P_Cn, 203, P_Mc, 205, P_Mn, 206, P_Cn, 215, P_Mc, 216, P_Cn, 220, P_Lo, 222, P_Cn, 223, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Lo, 242, P_Sc, 244, P_No, 250, P_So, 251, P_Cn,
+ 0, P_Cn, 1, P_Mn, 3, P_Mc, 4, P_Cn, 5, P_Lo, 11, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 55, P_Cn, 56, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Cn, 62, P_Mc, 65, P_Mn, 67, P_Cn, 71, P_Mn, 73, P_Cn, 75, P_Mn, 78, P_Cn, 89, P_Lo, 93, P_Cn, 94, P_Lo, 95, P_Cn, 102, P_Nd, 112, P_Mn, 114, P_Lo, 117, P_Cn, 129, P_Mn, 131, P_Mc, 132, P_Cn, 133, P_Lo, 142, P_Cn, 143, P_Lo, 146, P_Cn, 147, P_Lo, 169, P_Cn, 170, P_Lo, 177, P_Cn, 178, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 193, P_Mn, 198, P_Cn, 199, P_Mn, 201, P_Mc, 202, P_Cn, 203, P_Mc, 205, P_Mn, 206, P_Cn, 208, P_Lo, 209, P_Cn, 224, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Cn, 241, P_Sc, 242, P_Cn,
+ 0, P_Cn, 1, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Lo, 62, P_Mc, 63, P_Mn, 64, P_Mc, 65, P_Mn, 68, P_Cn, 71, P_Mc, 73, P_Cn, 75, P_Mc, 77, P_Mn, 78, P_Cn, 86, P_Mn, 87, P_Mc, 88, P_Cn, 92, P_Lo, 94, P_Cn, 95, P_Lo, 98, P_Cn, 102, P_Nd, 112, P_So, 113, P_Lo, 114, P_Cn, 130, P_Mn, 131, P_Lo, 132, P_Cn, 133, P_Lo, 139, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 150, P_Cn, 153, P_Lo, 155, P_Cn, 156, P_Lo, 157, P_Cn, 158, P_Lo, 160, P_Cn, 163, P_Lo, 165, P_Cn, 168, P_Lo, 171, P_Cn, 174, P_Lo, 182, P_Cn, 183, P_Lo, 186, P_Cn, 190, P_Mc, 192, P_Mn, 193, P_Mc, 195, P_Cn, 198, P_Mc, 201, P_Cn, 202, P_Mc, 205, P_Mn, 206, P_Cn, 215, P_Mc, 216, P_Cn, 231, P_Nd, 240, P_No, 243, P_So, 249, P_Sc, 250, P_So, 251, P_Cn,
+ 0, P_Cn, 1, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 41, P_Cn, 42, P_Lo, 52, P_Cn, 53, P_Lo, 58, P_Cn, 62, P_Mn, 65, P_Mc, 69, P_Cn, 70, P_Mn, 73, P_Cn, 74, P_Mn, 78, P_Cn, 85, P_Mn, 87, P_Cn, 96, P_Lo, 98, P_Cn, 102, P_Nd, 112, P_Cn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 169, P_Cn, 170, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 191, P_Mn, 192, P_Mc, 197, P_Cn, 198, P_Mn, 199, P_Mc, 201, P_Cn, 202, P_Mc, 204, P_Mn, 206, P_Cn, 213, P_Mc, 215, P_Cn, 222, P_Lo, 223, P_Cn, 224, P_Lo, 226, P_Cn, 230, P_Nd, 240, P_Cn,
+ 0, P_Cn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 41, P_Cn, 42, P_Lo, 58, P_Cn, 62, P_Mc, 65, P_Mn, 68, P_Cn, 70, P_Mc, 73, P_Cn, 74, P_Mc, 77, P_Mn, 78, P_Cn, 87, P_Mc, 88, P_Cn, 96, P_Lo, 98, P_Cn, 102, P_Nd, 112, P_Cn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 151, P_Cn, 154, P_Lo, 178, P_Cn, 179, P_Lo, 188, P_Cn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 199, P_Cn, 202, P_Mn, 203, P_Cn, 207, P_Mc, 210, P_Mn, 213, P_Cn, 214, P_Mn, 215, P_Cn, 216, P_Mc, 224, P_Cn, 242, P_Mc, 244, P_Po, 245, P_Cn,
+ 0, P_Cn, 1, P_Lo, 49, P_Mn, 50, P_Lo, 52, P_Mn, 59, P_Cn, 63, P_Sc, 64, P_Lo, 70, P_Lm, 71, P_Mn, 79, P_Po, 80, P_Nd, 90, P_Po, 92, P_Cn, 129, P_Lo, 131, P_Cn, 132, P_Lo, 133, P_Cn, 135, P_Lo, 137, P_Cn, 138, P_Lo, 139, P_Cn, 141, P_Lo, 142, P_Cn, 148, P_Lo, 152, P_Cn, 153, P_Lo, 160, P_Cn, 161, P_Lo, 164, P_Cn, 165, P_Lo, 166, P_Cn, 167, P_Lo, 168, P_Cn, 170, P_Lo, 172, P_Cn, 173, P_Lo, 177, P_Mn, 178, P_Lo, 180, P_Mn, 186, P_Cn, 187, P_Mn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 197, P_Cn, 198, P_Lm, 199, P_Cn, 200, P_Mn, 206, P_Cn, 208, P_Nd, 218, P_Cn, 220, P_Lo, 222, P_Cn,
+ 0, P_Lo, 1, P_So, 4, P_Po, 19, P_So, 24, P_Mn, 26, P_So, 32, P_Nd, 42, P_No, 52, P_So, 53, P_Mn, 54, P_So, 55, P_Mn, 56, P_So, 57, P_Mn, 58, P_Ps, 59, P_Pe, 60, P_Ps, 61, P_Pe, 62, P_Mc, 64, P_Lo, 72, P_Cn, 73, P_Lo, 107, P_Cn, 113, P_Mn, 127, P_Mc, 128, P_Mn, 133, P_Po, 134, P_Mn, 136, P_Lo, 140, P_Cn, 144, P_Mn, 152, P_Cn, 153, P_Mn, 189, P_Cn, 190, P_So, 198, P_Mn, 199, P_So, 205, P_Cn, 207, P_So, 208, P_Cn,
+ 0, P_Lo, 34, P_Cn, 35, P_Lo, 40, P_Cn, 41, P_Lo, 43, P_Cn, 44, P_Mc, 45, P_Mn, 49, P_Mc, 50, P_Mn, 51, P_Cn, 54, P_Mn, 56, P_Mc, 57, P_Mn, 58, P_Cn, 64, P_Nd, 74, P_Po, 80, P_Lo, 86, P_Mc, 88, P_Mn, 90, P_Cn, 160, P_Lu, 198, P_Cn, 208, P_Lo, 249, P_Cn, 251, P_Po, 252, P_Cn,
+ 0, P_Lo, 90, P_Cn, 95, P_Lo, 163, P_Cn, 168, P_Lo, 250, P_Cn,
+ 0, P_Lo, 7, P_Cn, 8, P_Lo, 71, P_Cn, 72, P_Lo, 73, P_Cn, 74, P_Lo, 78, P_Cn, 80, P_Lo, 87, P_Cn, 88, P_Lo, 89, P_Cn, 90, P_Lo, 94, P_Cn, 96, P_Lo, 135, P_Cn, 136, P_Lo, 137, P_Cn, 138, P_Lo, 142, P_Cn, 144, P_Lo, 175, P_Cn, 176, P_Lo, 177, P_Cn, 178, P_Lo, 182, P_Cn, 184, P_Lo, 191, P_Cn, 192, P_Lo, 193, P_Cn, 194, P_Lo, 198, P_Cn, 200, P_Lo, 207, P_Cn, 208, P_Lo, 215, P_Cn, 216, P_Lo, 239, P_Cn, 240, P_Lo,
+ 0, P_Lo, 15, P_Cn, 16, P_Lo, 17, P_Cn, 18, P_Lo, 22, P_Cn, 24, P_Lo, 31, P_Cn, 32, P_Lo, 71, P_Cn, 72, P_Lo, 91, P_Cn, 97, P_Po, 105, P_Nd, 114, P_No, 125, P_Cn, 160, P_Lo, 245, P_Cn,
+ 0, P_Cn, 1, P_Lo,
+ 0, P_Lo,
+ 0, P_Lo, 109, P_Po, 111, P_Lo, 119, P_Cn, 128, P_Zs, 129, P_Lo, 155, P_Ps, 156, P_Pe, 157, P_Cn, 160, P_Lo, 235, P_Po, 238, P_Nl, 241, P_Cn,
+ 0, P_Lo, 13, P_Cn, 14, P_Lo, 18, P_Mn, 21, P_Cn, 32, P_Lo, 50, P_Mn, 53, P_Po, 55, P_Cn, 64, P_Lo, 82, P_Mn, 84, P_Cn, 96, P_Lo, 109, P_Cn, 110, P_Lo, 113, P_Cn, 114, P_Mn, 116, P_Cn, 128, P_Lo, 180, P_Cf, 182, P_Mc, 183, P_Mn, 190, P_Mc, 198, P_Mn, 199, P_Mc, 201, P_Mn, 212, P_Po, 215, P_Lm, 216, P_Po, 219, P_Sc, 220, P_Lo, 221, P_Mn, 222, P_Cn, 224, P_Nd, 234, P_Cn, 240, P_No, 250, P_Cn,
+ 0, P_Po, 6, P_Pd, 7, P_Po, 11, P_Mn, 14, P_Zs, 15, P_Cn, 16, P_Nd, 26, P_Cn, 32, P_Lo, 67, P_Lm, 68, P_Lo, 120, P_Cn, 128, P_Lo, 169, P_Mn, 170, P_Cn,
+ 0, P_Lo, 29, P_Cn, 32, P_Mn, 35, P_Mc, 39, P_Mn, 41, P_Mc, 44, P_Cn, 48, P_Mc, 50, P_Mn, 51, P_Mc, 57, P_Mn, 60, P_Cn, 64, P_So, 65, P_Cn, 68, P_Po, 70, P_Nd, 80, P_Lo, 110, P_Cn, 112, P_Lo, 117, P_Cn, 224, P_So,
+ 0, P_Ll, 44, P_Lm, 98, P_Ll, 108, P_Cn,
+ 0, P_Lul, 150, P_Ll, 156, P_Cn, 160, P_Lul, 250, P_Cn,
+ 0, P_Ll, 8, P_Lu, 16, P_Ll, 22, P_Cn, 24, P_Lu, 30, P_Cn, 32, P_Ll, 40, P_Lu, 48, P_Ll, 56, P_Lu, 64, P_Ll, 70, P_Cn, 72, P_Lu, 78, P_Cn, 80, P_Ll, 88, P_Cn, 89, P_Lu, 90, P_Cn, 91, P_Lu, 92, P_Cn, 93, P_Lu, 94, P_Cn, 95, P_Lul, 97, P_Ll, 104, P_Lu, 112, P_Ll, 126, P_Cn, 128, P_Ll, 136, P_Lt, 144, P_Ll, 152, P_Lt, 160, P_Ll, 168, P_Lt, 176, P_Ll, 181, P_Cn, 182, P_Ll, 184, P_Lu, 188, P_Lt, 189, P_Sk, 190, P_Ll, 191, P_Sk, 194, P_Ll, 197, P_Cn, 198, P_Ll, 200, P_Lu, 204, P_Lt, 205, P_Sk, 208, P_Ll, 212, P_Cn, 214, P_Ll, 216, P_Lu, 220, P_Cn, 221, P_Sk, 224, P_Ll, 232, P_Lu, 237, P_Sk, 240, P_Cn, 242, P_Ll, 245, P_Cn, 246, P_Ll, 248, P_Lu, 252, P_Lt, 253, P_Sk, 255, P_Cn,
+ 0, P_Zs, 12, P_Cf, 16, P_Pd, 22, P_Po, 24, P_Pi, 25, P_Pf, 26, P_Ps, 27, P_Pi, 29, P_Pf, 30, P_Ps, 31, P_Pi, 32, P_Po, 40, P_Zl, 41, P_Zp, 42, P_Cf, 47, P_Zs, 48, P_Po, 57, P_Pi, 58, P_Pf, 59, P_Po, 63, P_Pc, 65, P_Po, 68, P_Sm, 69, P_Ps, 70, P_Pe, 71, P_Po, 82, P_Sm, 83, P_Po, 84, P_Pc, 85, P_Cn, 87, P_Po, 88, P_Cn, 95, P_Zs, 96, P_Cf, 100, P_Cn, 106, P_Cf, 112, P_No, 113, P_Ll, 114, P_Cn, 116, P_No, 122, P_Sm, 125, P_Ps, 126, P_Pe, 127, P_Ll, 128, P_No, 138, P_Sm, 141, P_Ps, 142, P_Pe, 143, P_Cn, 160, P_Sc, 178, P_Cn, 208, P_Mn, 221, P_Me, 225, P_Mn, 226, P_Me, 229, P_Mn, 235, P_Cn,
+ 0, P_So, 2, P_Lu, 3, P_So, 7, P_Lu, 8, P_So, 10, P_Ll, 11, P_Lu, 14, P_Ll, 16, P_Lu, 19, P_Ll, 20, P_So, 21, P_Lu, 22, P_So, 25, P_Lu, 30, P_So, 36, P_Lu, 37, P_So, 38, P_Lu, 39, P_So, 40, P_Lu, 41, P_So, 42, P_Lu, 46, P_So, 47, P_Ll, 48, P_Lu, 50, P_So, 51, P_Lul, 53, P_Lo, 57, P_Ll, 58, P_So, 60, P_Cn, 61, P_Ll, 62, P_Lu, 64, P_Sm, 69, P_Lul, 71, P_Ll, 74, P_So, 75, P_Sm, 76, P_Cn, 83, P_No, 96, P_Nl, 132, P_Cn, 144, P_Sm, 149, P_So, 154, P_Sm, 156, P_So, 160, P_Sm, 161, P_So, 163, P_Sm, 164, P_So, 166, P_Sm, 167, P_So, 174, P_Sm, 175, P_So, 206, P_Sm, 208, P_So, 210, P_Sm, 211, P_So, 212, P_Sm, 213, P_So, 244, P_Sm,
+ 0, P_Sm,
+ 0, P_So, 8, P_Sm, 12, P_So, 32, P_Sm, 34, P_So, 41, P_Ps, 42, P_Pe, 43, P_So, 124, P_Sm, 125, P_So, 155, P_Sm, 180, P_Ps, 181, P_Pe, 182, P_Po, 183, P_So, 209, P_Cn,
+ 0, P_So, 39, P_Cn, 64, P_So, 75, P_Cn, 96, P_No, 156, P_So, 234, P_No,
+ 0, P_So, 183, P_Sm, 184, P_So, 193, P_Sm, 194, P_So, 248, P_Sm,
+ 0, P_So, 24, P_Cn, 25, P_So, 111, P_Sm, 112, P_So, 126, P_Cn, 128, P_So, 146, P_Cn, 160, P_So, 162, P_Cn,
+ 0, P_Cn, 1, P_So, 5, P_Cn, 6, P_So, 10, P_Cn, 12, P_So, 40, P_Cn, 41, P_So, 76, P_Cn, 77, P_So, 78, P_Cn, 79, P_So, 83, P_Cn, 86, P_So, 87, P_Cn, 88, P_So, 95, P_Cn, 97, P_So, 104, P_Ps, 105, P_Pe, 106, P_Ps, 107, P_Pe, 108, P_Ps, 109, P_Pe, 110, P_Ps, 111, P_Pe, 112, P_Ps, 113, P_Pe, 114, P_Ps, 115, P_Pe, 116, P_Ps, 117, P_Pe, 118, P_No, 148, P_So, 149, P_Cn, 152, P_So, 176, P_Cn, 177, P_So, 191, P_Cn, 208, P_Sm, 230, P_Ps, 231, P_Pe, 232, P_Ps, 233, P_Pe, 234, P_Ps, 235, P_Pe, 236, P_Cn, 240, P_Sm,
+ 0, P_So,
+ 0, P_Sm, 131, P_Ps, 132, P_Pe, 133, P_Ps, 134, P_Pe, 135, P_Ps, 136, P_Pe, 137, P_Ps, 138, P_Pe, 139, P_Ps, 140, P_Pe, 141, P_Ps, 142, P_Pe, 143, P_Ps, 144, P_Pe, 145, P_Ps, 146, P_Pe, 147, P_Ps, 148, P_Pe, 149, P_Ps, 150, P_Pe, 151, P_Ps, 152, P_Pe, 153, P_Sm, 216, P_Ps, 217, P_Pe, 218, P_Ps, 219, P_Pe, 220, P_Sm, 252, P_Ps, 253, P_Pe, 254, P_Sm,
+ 0, P_So, 14, P_Cn,
+ 0, P_Cn, 128, P_So, 154, P_Cn, 155, P_So, 244, P_Cn,
+ 0, P_So, 214, P_Cn, 240, P_So, 252, P_Cn,
+ 0, P_Zs, 1, P_Po, 4, P_So, 5, P_Lm, 6, P_Lo, 7, P_Nl, 8, P_Ps, 9, P_Pe, 10, P_Ps, 11, P_Pe, 12, P_Ps, 13, P_Pe, 14, P_Ps, 15, P_Pe, 16, P_Ps, 17, P_Pe, 18, P_So, 20, P_Ps, 21, P_Pe, 22, P_Ps, 23, P_Pe, 24, P_Ps, 25, P_Pe, 26, P_Ps, 27, P_Pe, 28, P_Pd, 29, P_Ps, 30, P_Pe, 32, P_So, 33, P_Nl, 42, P_Mn, 48, P_Pd, 49, P_Lm, 54, P_So, 56, P_Nl, 59, P_Lm, 60, P_Lo, 61, P_Po, 62, P_So, 64, P_Cn, 65, P_Lo, 151, P_Cn, 153, P_Mn, 155, P_Sk, 157, P_Lm, 159, P_Lo, 160, P_Pd, 161, P_Lo, 251, P_Pc, 252, P_Lm, 255, P_Lo,
+ 0, P_Cn, 5, P_Lo, 45, P_Cn, 49, P_Lo, 143, P_Cn, 144, P_So, 146, P_No, 150, P_So, 160, P_Lo, 184, P_Cn, 240, P_Lo,
+ 0, P_So, 31, P_Cn, 32, P_No, 42, P_So, 68, P_Cn, 80, P_So, 81, P_No, 96, P_So, 126, P_Cn, 127, P_So, 128, P_No, 138, P_So, 177, P_No, 192, P_So, 255, P_Cn,
+ 0, P_Lo, 1, P_Cn,
+ 0, P_Cn, 181, P_Lo, 182, P_Cn, 192, P_So,
+ 0, P_Cn, 165, P_Lo, 166, P_Cn,
+ 0, P_Lo, 141, P_Cn, 144, P_So, 199, P_Cn,
+ 0, P_Cn, 163, P_Lo, 164, P_Cn,
+ 0, P_Cs, 1, P_Cn,
+ 0, P_Cn, 127, P_Cs, 129, P_Cn, 255, P_Cs,
+ 0, P_Cn, 255, P_Cs,
+ 0, P_Co, 1, P_Cn,
+ 0, P_Cn, 255, P_Co,
+ 0, P_Lo, 46, P_Cn, 48, P_Lo, 107, P_Cn,
+ 0, P_Ll, 7, P_Cn, 19, P_Ll, 24, P_Cn, 29, P_Lo, 30, P_Mn, 31, P_Lo, 41, P_Sm, 42, P_Lo, 55, P_Cn, 56, P_Lo, 61, P_Cn, 62, P_Lo, 63, P_Cn, 64, P_Lo, 66, P_Cn, 67, P_Lo, 69, P_Cn, 70, P_Lo, 178, P_Cn, 211, P_Lo,
+ 0, P_Lo, 62, P_Ps, 63, P_Pe, 64, P_Cn, 80, P_Lo, 144, P_Cn, 146, P_Lo, 200, P_Cn, 240, P_Lo, 252, P_Sc, 253, P_So, 254, P_Cn,
+ 0, P_Mn, 16, P_Cn, 32, P_Mn, 36, P_Cn, 48, P_Po, 49, P_Pd, 51, P_Pc, 53, P_Ps, 54, P_Pe, 55, P_Ps, 56, P_Pe, 57, P_Ps, 58, P_Pe, 59, P_Ps, 60, P_Pe, 61, P_Ps, 62, P_Pe, 63, P_Ps, 64, P_Pe, 65, P_Ps, 66, P_Pe, 67, P_Ps, 68, P_Pe, 69, P_Po, 71, P_Ps, 72, P_Pe, 73, P_Po, 77, P_Pc, 80, P_Po, 83, P_Cn, 84, P_Po, 88, P_Pd, 89, P_Ps, 90, P_Pe, 91, P_Ps, 92, P_Pe, 93, P_Ps, 94, P_Pe, 95, P_Po, 98, P_Sm, 99, P_Pd, 100, P_Sm, 103, P_Cn, 104, P_Po, 105, P_Sc, 106, P_Po, 108, P_Cn, 112, P_Lo, 117, P_Cn, 118, P_Lo, 253, P_Cn, 255, P_Cf,
+ 0, P_Cn, 1, P_Po, 4, P_Sc, 5, P_Po, 8, P_Ps, 9, P_Pe, 10, P_Po, 11, P_Sm, 12, P_Po, 13, P_Pd, 14, P_Po, 16, P_Nd, 26, P_Po, 28, P_Sm, 31, P_Po, 33, P_Lu, 59, P_Ps, 60, P_Po, 61, P_Pe, 62, P_Sk, 63, P_Pc, 64, P_Sk, 65, P_Ll, 91, P_Ps, 92, P_Sm, 93, P_Pe, 94, P_Sm, 95, P_Ps, 96, P_Pe, 97, P_Po, 98, P_Ps, 99, P_Pe, 100, P_Po, 101, P_Pc, 102, P_Lo, 112, P_Lm, 113, P_Lo, 158, P_Lm, 160, P_Lo, 191, P_Cn, 194, P_Lo, 200, P_Cn, 202, P_Lo, 208, P_Cn, 210, P_Lo, 216, P_Cn, 218, P_Lo, 221, P_Cn, 224, P_Sc, 226, P_Sm, 227, P_Sk, 228, P_So, 229, P_Sc, 231, P_Cn, 232, P_So, 233, P_Sm, 237, P_So, 239, P_Cn, 249, P_Cf, 252, P_So, 254, P_Cn,
+ 0, P_Lo, 12, P_Cn, 13, P_Lo, 39, P_Cn, 40, P_Lo, 59, P_Cn, 60, P_Lo, 62, P_Cn, 63, P_Lo, 78, P_Cn, 80, P_Lo, 94, P_Cn, 128, P_Lo, 251, P_Cn,
+ 0, P_Po, 2, P_So, 3, P_Cn, 7, P_No, 52, P_Cn, 55, P_So, 64, P_Cn,
+ 0, P_Lo, 31, P_Cn, 32, P_No, 36, P_Cn, 48, P_Lo, 74, P_Nl, 75, P_Cn, 128, P_Lo, 158, P_Cn, 159, P_Po, 160, P_Cn,
+ 0, P_Lu, 40, P_Ll, 80, P_Lo, 158, P_Cn, 160, P_Nd, 170, P_Cn,
+ 0, P_Lo, 6, P_Cn, 8, P_Lo, 9, P_Cn, 10, P_Lo, 54, P_Cn, 55, P_Lo, 57, P_Cn, 60, P_Lo, 61, P_Cn, 63, P_Lo, 64, P_Cn,
+ 0, P_So, 246, P_Cn,
+ 0, P_So, 39, P_Cn, 42, P_So, 101, P_Mc, 103, P_Mn, 106, P_So, 109, P_Mc, 115, P_Cf, 123, P_Mn, 131, P_So, 133, P_Mn, 140, P_So, 170, P_Mn, 174, P_So, 222, P_Cn,
+ 0, P_So, 87, P_Cn,
+ 0, P_Lu, 26, P_Ll, 52, P_Lu, 78, P_Ll, 85, P_Cn, 86, P_Ll, 104, P_Lu, 130, P_Ll, 156, P_Lu, 157, P_Cn, 158, P_Lu, 160, P_Cn, 162, P_Lu, 163, P_Cn, 165, P_Lu, 167, P_Cn, 169, P_Lu, 173, P_Cn, 174, P_Lu, 182, P_Ll, 186, P_Cn, 187, P_Ll, 188, P_Cn, 189, P_Ll, 196, P_Cn, 197, P_Ll, 208, P_Lu, 234, P_Ll,
+ 0, P_Ll, 4, P_Lu, 6, P_Cn, 7, P_Lu, 11, P_Cn, 13, P_Lu, 21, P_Cn, 22, P_Lu, 29, P_Cn, 30, P_Ll, 56, P_Lu, 58, P_Cn, 59, P_Lu, 63, P_Cn, 64, P_Lu, 69, P_Cn, 70, P_Lu, 71, P_Cn, 74, P_Lu, 81, P_Cn, 82, P_Ll, 108, P_Lu, 134, P_Ll, 160, P_Lu, 186, P_Ll, 212, P_Lu, 238, P_Ll,
+ 0, P_Ll, 8, P_Lu, 34, P_Ll, 60, P_Lu, 86, P_Ll, 112, P_Lu, 138, P_Ll, 164, P_Cn, 168, P_Lu, 193, P_Sm, 194, P_Ll, 219, P_Sm, 220, P_Ll, 226, P_Lu, 251, P_Sm, 252, P_Ll,
+ 0, P_Ll, 21, P_Sm, 22, P_Ll, 28, P_Lu, 53, P_Sm, 54, P_Ll, 79, P_Sm, 80, P_Ll, 86, P_Lu, 111, P_Sm, 112, P_Ll, 137, P_Sm, 138, P_Ll, 144, P_Lu, 169, P_Sm, 170, P_Ll, 195, P_Sm, 196, P_Ll, 202, P_Cn, 206, P_Nd,
+ 0, P_Cn, 214, P_Lo, 215, P_Cn,
+ 0, P_Lo, 30, P_Cn,
+ 0, P_Cn, 1, P_Cf, 2, P_Cn, 32, P_Cf, 128, P_Cn,
+ 0, P_Mn, 240, P_Cn,
+ 0, P_Cn, 253, P_Co, 254, P_Cn,
+};
+const unsigned int UnicodeProperty::property_offsets[] = {
+ 0x0, 2, 122,
+ 0x100, 122, 248,
+ 0x200, 248, 272,
+ 0x300, 272, 342,
+ 0x400, 342, 374,
+ 0x500, 374, 432,
+ 0x600, 432, 504,
+ 0x700, 504, 532,
+ 0x800, 0, 2,
+ 0x900, 532, 650,
+ 0xA00, 650, 790,
+ 0xB00, 790, 948,
+ 0xC00, 948, 1064,
+ 0xD00, 1064, 1162,
+ 0xE00, 1162, 1270,
+ 0xF00, 1270, 1350,
+ 0x1000, 1350, 1404,
+ 0x1100, 1404, 1416,
+ 0x1200, 1416, 1494,
+ 0x1300, 1494, 1530,
+ 0x1400, 1530, 1534,
+ 0x1500, 1534, 1536,
+ 0x1600, 1536, 1562,
+ 0x1700, 1562, 1636,
+ 0x1800, 1636, 1666,
+ 0x1900, 1666, 1708,
+ 0x1A00, 0, 2,
+ 0x1D00, 1708, 1716,
+ 0x1E00, 1716, 1726,
+ 0x1F00, 1726, 1854,
+ 0x2000, 1854, 1968,
+ 0x2100, 1968, 2090,
+ 0x2200, 2090, 2092,
+ 0x2300, 2092, 2124,
+ 0x2400, 2124, 2138,
+ 0x2500, 2138, 2150,
+ 0x2600, 2150, 2170,
+ 0x2700, 2170, 2266,
+ 0x2800, 2266, 2268,
+ 0x2900, 2268, 2332,
+ 0x2A00, 2090, 2092,
+ 0x2B00, 2332, 2336,
+ 0x2C00, 0, 2,
+ 0x2E00, 2336, 2346,
+ 0x2F00, 2346, 2354,
+ 0x3000, 2354, 2456,
+ 0x3100, 2456, 2478,
+ 0x3200, 2478, 2508,
+ 0x3300, 2266, 2268,
+ 0x3400, 2508, 2512,
+ 0x3500, 0, 2,
+ 0x4D00, 2512, 2520,
+ 0x4E00, 2508, 2512,
+ 0x4F00, 0, 2,
+ 0x9F00, 2520, 2526,
+ 0xA000, 1534, 1536,
+ 0xA400, 2526, 2534,
+ 0xA500, 0, 2,
+ 0xAC00, 2508, 2512,
+ 0xAD00, 0, 2,
+ 0xD700, 2534, 2540,
+ 0xD800, 2540, 2544,
+ 0xD900, 0, 2,
+ 0xDB00, 2544, 2552,
+ 0xDC00, 2540, 2544,
+ 0xDD00, 0, 2,
+ 0xDF00, 2552, 2556,
+ 0xE000, 2556, 2560,
+ 0xE100, 0, 2,
+ 0xF800, 2560, 2564,
+ 0xF900, 1534, 1536,
+ 0xFA00, 2564, 2572,
+ 0xFB00, 2572, 2614,
+ 0xFC00, 1534, 1536,
+ 0xFD00, 2614, 2638,
+ 0xFE00, 2638, 2742,
+ 0xFF00, 2742, 2864,
+ 0x10000, 2864, 2892,
+ 0x10100, 2892, 2906,
+ 0x10200, 0, 2,
+ 0x10300, 2906, 2928,
+ 0x10400, 2928, 2940,
+ 0x10500, 0, 2,
+ 0x10800, 2940, 2964,
+ 0x10900, 0, 2,
+ 0x1D000, 2964, 2968,
+ 0x1D100, 2968, 2998,
+ 0x1D200, 0, 2,
+ 0x1D300, 2998, 3002,
+ 0x1D400, 3002, 3058,
+ 0x1D500, 3058, 3112,
+ 0x1D600, 3112, 3144,
+ 0x1D700, 3144, 3184,
+ 0x1D800, 0, 2,
+ 0x20000, 2508, 2512,
+ 0x20100, 0, 2,
+ 0x2A600, 3184, 3190,
+ 0x2A700, 0, 2,
+ 0x2F800, 1534, 1536,
+ 0x2FA00, 3190, 3194,
+ 0x2FB00, 0, 2,
+ 0xE0000, 3194, 3204,
+ 0xE0100, 3204, 3208,
+ 0xE0200, 0, 2,
+ 0xF0000, 2556, 2560,
+ 0xF0100, 0, 2,
+ 0xFFF00, 3208, 3214,
+ 0x100000, 2556, 2560,
+ 0x100100, 0, 2,
+ 0x10FF00, 3208, 3214,
+ 0x110000, 0, 2,
+};
+const int UnicodeProperty::nproperty_offsets = (sizeof(UnicodeProperty::property_offsets) / (3*sizeof(unsigned int)));
+
+inline const unsigned int*
+UnicodeProperty::find_offset(uint32_t u)
+{
+ // Up to U+1A00 each page has its own definition.
+ if (u < 0x1A00)
+ return &property_offsets[3*(u >> 8)];
+ // At or after U+1A00, binary search.
+ int l = 0x1A, r = nproperty_offsets - 2;
+ while (l <= r) {
+ int m = (l + r) / 2;
+ const unsigned int* ptr = &property_offsets[3*m];
+ if (u < ptr[0])
+ r = m - 1;
+ else if (u >= ptr[3])
+ l = m + 1;
+ else
+ return ptr;
+ }
+ // If search fails, return last record, which will be all-unassigned.
+ return &property_offsets[3*(nproperty_offsets - 1)];
+}
+
+int
+UnicodeProperty::property(uint32_t u)
+{
+ const unsigned int* offsets = find_offset(u);
+
+ // Now we only care about the last byte.
+ u &= 255;
+
+ // Binary search within record.
+ int l = offsets[1], r = offsets[2] - 4;
+ const unsigned char* the_ptr;
+ while (l <= r) {
+ int m = ((l + r) / 2) & ~1;
+ const unsigned char* ptr = &property_pages[m];
+ if (u < ptr[0])
+ r = m - 2;
+ else if (u >= ptr[2])
+ l = m + 2;
+ else {
+ the_ptr = ptr;
+ goto found_ptr;
+ }
+ }
+ the_ptr = &property_pages[l];
+
+ found_ptr:
+ // Found right block.
+ if (the_ptr[1] == P_Lul)
+ return ((u - the_ptr[0]) % 2 ? P_Ll : P_Lu);
+ else
+ return the_ptr[1];
+}
+
+static const char property_names[] =
+ "Cn\0Co\0Cs\0Cf\0Cc\0\0\0\0\0\0\0\0\0\0"
+ "Zs\0Zl\0Zp\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "Mn\0Mc\0Me\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "Lo\0Lu\0Ll\0Lt\0Lm\0\0\0\0\0\0\0\0\0\0"
+ "No\0Nd\0Nl\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "Po\0Pc\0Pd\0Ps\0Pe\0Pi\0Pf\0\0\0\0"
+ "So\0Sm\0Sc\0Sk";
+
+static const char* const property_long_names[] = {
+ "Unassigned", "PrivateUse", "Surrogate", "Format", "Control", 0, 0, 0,
+ "SpaceSeparator", "LineSeparator", "ParagraphSeparator", 0, 0, 0, 0, 0,
+ "NonspacingMark", "SpacingMark", "EnclosingMark", 0, 0, 0, 0, 0,
+ "OtherLetter", "UppercaseLetter", "LowercaseLetter", "TitlecaseLetter", "ModifierLetter", 0, 0, 0,
+ "OtherNumber", "DecimalNumber", "LetterNumber", 0, 0, 0, 0, 0,
+ "OtherPunctuation", "ConnectorPunctuation", "DashPunctuation", "OpenPunctuation", "ClosePunctuation", "InitialPunctuation", "FinalPunctuation", 0,
+ "OtherSymbol", "MathSymbol", "CurrencySymbol", "ModifierSymbol"
+};
+
+static const char* const property_category_long_names[] = {
+ "Other", "Separator", "Mark", "Letter", "Number", "Punctuation", "Symbol"
+};
+
+
+const char*
+UnicodeProperty::property_name(int p)
+{
+ if (p >= 0 && p <= P_Sk && property_names[p*3])
+ return &property_names[p*3];
+ else
+ return "?";
+}
+
+bool
+UnicodeProperty::parse_property(const String& s, int& prop, int& prop_mask)
+{
+ if (s.length() == 0)
+ return false;
+ else if (s.length() <= 2) {
+ for (int i = 0; i <= P_S; i += 010)
+ if (property_names[3*i] == s[0]) {
+ if (s.length() == 1) {
+ prop = i;
+ prop_mask = P_TMASK;
+ return true;
+ }
+ for (; property_names[3*i]; i++)
+ if (property_names[3*i+1] == s[1]) {
+ prop = i;
+ prop_mask = 0377;
+ return true;
+ }
+ break;
+ }
+ return false;
+ } else {
+ const char* const *dict = property_category_long_names;
+ for (int i = 0; i <= P_S; i += 010, dict++)
+ if (s == *dict) {
+ prop = i;
+ prop_mask = P_TMASK;
+ return true;
+ }
+ dict = property_long_names;
+ for (int i = 0; i <= P_Sk; i++, dict++)
+ if (*dict && s == *dict) {
+ prop = i;
+ prop_mask = 0377;
+ return true;
+ }
+ return false;
+ }
+}
+
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/uniprop.hh b/Build/source/utils/lcdf-typetools/otftotfm/uniprop.hh
new file mode 100644
index 00000000000..8a08f427203
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/uniprop.hh
@@ -0,0 +1,34 @@
+#ifndef OTFTOTFM_UNIPROP_HH
+#define OTFTOTFM_UNIPROP_HH
+#include <efont/otf.hh>
+
+class UnicodeProperty { public:
+
+ enum {
+ P_C = 000, P_Cn = 000, P_Co = 001, P_Cs = 002, P_Cf = 003, P_Cc = 004,
+ P_Z = 010, P_Zs = 010, P_Zl = 011, P_Zp = 012,
+ P_M = 020, P_Mn = 020, P_Mc = 021, P_Me = 022,
+ P_L = 030, P_Lo = 030, P_Lu = 031, P_Ll = 032, P_Lt = 033, P_Lm = 034,
+ P_N = 040, P_No = 040, P_Nd = 041, P_Nl = 042,
+ P_P = 050, P_Po = 050, P_Pc = 051, P_Pd = 052, P_Ps = 053, P_Pe = 054, P_Pi = 055, P_Pf = 056,
+ P_S = 060, P_So = 060, P_Sm = 061, P_Sc = 062, P_Sk = 063,
+ P_TMASK = 0370,
+ P_MAX = 0377
+ };
+
+ static int property(uint32_t uni);
+ static const char* property_name(int p);
+ static bool parse_property(const String&, int& prop, int& prop_mask);
+
+ private:
+
+ enum { P_Lul = 070 };
+ static const unsigned char property_pages[];
+ static const unsigned int property_offsets[];
+ static const int nproperty_offsets;
+
+ static inline const unsigned int* find_offset(uint32_t uni);
+
+};
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/util.cc b/Build/source/utils/lcdf-typetools/otftotfm/util.cc
new file mode 100644
index 00000000000..6e5bdbc47a1
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/util.cc
@@ -0,0 +1,232 @@
+/* util.{cc,hh} -- various bits
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "util.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <lcdf/vector.hh>
+#include <ctype.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <io.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning)
+{
+ FILE *f;
+ if (!filename || filename == "-") {
+ filename = "<stdin>";
+ f = stdin;
+#if defined(_MSDOS) || defined(_WIN32)
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(filename.c_str(), "rb"))) {
+ errh->verror_text((warning ? errh->ERR_WARNING : errh->ERR_ERROR), filename, strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ while (!feof(f)) {
+ if (char *x = sa.reserve(8192)) {
+ int amt = fread(x, 1, 8192, f);
+ sa.forward(amt);
+ } else {
+ errh->verror_text((warning ? errh->ERR_WARNING : errh->ERR_ERROR), filename, "Out of memory!");
+ break;
+ }
+ }
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::stable_string("<stdin>");
+ else
+ return s;
+}
+
+String
+pathname_filename(const String &path)
+{
+ int slash = path.find_right('/');
+ if (slash >= 0 && slash != path.length() - 1)
+ return path.substring(slash + 1);
+ else
+ return path;
+}
+
+String
+shell_quote(const String &str)
+{
+#if defined(_MSDOS) || defined(_WIN32)
+ return str; // XXX
+#else
+ if (!str)
+ return String::stable_string("''");
+
+ const char *begin = str.begin();
+ const char *end = str.end();
+ StringAccum sa;
+ for (const char *s = begin; s < end; s++)
+ if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '/' || *s == ':' || *s == '.')
+ /* do nothing */;
+ else {
+ sa.append(begin, s);
+ sa.append('\\');
+ begin = s;
+ }
+
+ if (!sa)
+ return str;
+ else {
+ sa.append(begin, end);
+ return sa.take_string();
+ }
+#endif
+}
+
+int
+mysystem(const char *command, ErrorHandler *errh)
+{
+ if (no_create) {
+ errh->message("would run %s", command);
+ return 0;
+ } else {
+ if (verbose)
+ errh->message("running %s", command);
+ return system(command);
+ }
+}
+
+int
+temporary_file(String &filename, ErrorHandler *errh)
+{
+ if (no_create)
+ return 0; // random number suffices
+
+#ifdef HAVE_MKSTEMP
+ const char *tmpdir = getenv("TMPDIR");
+ if (tmpdir)
+ filename = String(tmpdir) + "/otftotfm.XXXXXX";
+ else {
+# ifdef P_tmpdir
+ filename = P_tmpdir "/otftotfm.XXXXXX";
+# else
+ filename = "/tmp/otftotfm.XXXXXX";
+# endif
+ }
+ int fd = mkstemp(filename.mutable_c_str());
+ if (fd < 0)
+ errh->error("temporary file '%s': %s", filename.c_str(), strerror(errno));
+ return fd;
+#else // !HAVE_MKSTEMP
+ for (int tries = 0; tries < 5; tries++) {
+ if (!(filename = tmpnam(0)))
+ return errh->error("cannot create temporary file");
+# ifdef O_EXCL
+ int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_EXCL | O_TRUNC, 0600);
+# else
+ int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0600);
+# endif
+ if (fd >= 0)
+ return fd;
+ }
+ return errh->error("temporary file '%s': %s", filename.c_str(), strerror(errno));
+#endif
+}
+
+bool
+parse_unicode_number(const char* begin, const char* end, int require_prefix, uint32_t& result)
+{
+ bool allow_lower = false;
+ if (require_prefix < 0)
+ /* do not look for prefix */;
+ else if (begin + 7 == end && begin[0] == 'u' && begin[1] == 'n' && begin[2] == 'i')
+ begin += 3;
+ else if (begin + 5 <= end && begin + 7 >= end && begin[0] == 'u')
+ begin++;
+ else if (begin + 6 <= end && begin + 8 >= end && begin[0] == 'U' && begin[1] == '+')
+ begin += 2, allow_lower = true;
+ else if (require_prefix > 0)
+ /* some prefix was required */
+ return false;
+
+ uint32_t value;
+ for (value = 0; begin < end; begin++)
+ if (*begin >= '0' && *begin <= '9')
+ value = (value << 4) | (*begin - '0');
+ else if (*begin >= 'A' && *begin <= 'F')
+ value = (value << 4) | (*begin - 'A' + 10);
+ else if (allow_lower && *begin >= 'a' && *begin <= 'f')
+ value = (value << 4) | (*begin - 'a' + 10);
+ else
+ return false;
+
+ if (value <= 0xD7FF || (value >= 0xE000 && value <= 0x10FFFF)) {
+ result = value;
+ return true;
+ } else
+ return false;
+}
+
+#if 0
+String
+shell_command_output(String cmdline, const String &input, ErrorHandler *errh, bool strip_newlines)
+{
+ FILE *f = tmpfile();
+ if (!f)
+ errh->fatal("cannot create temporary file: %s", strerror(errno));
+ fwrite(input.data(), 1, input.length(), f);
+ fflush(f);
+ rewind(f);
+
+ String new_cmdline = cmdline + " 0<&" + String(fileno(f));
+ FILE *p = popen(new_cmdline.c_str(), "r");
+ if (!p)
+ errh->fatal("'%s': %s", cmdline.c_str(), strerror(errno));
+
+ StringAccum sa;
+ while (!feof(p) && !ferror(p) && sa.length() < 200000) {
+ int x = fread(sa.reserve(2048), 1, 2048, p);
+ if (x > 0)
+ sa.forward(x);
+ else if (x < 0 && errno != EAGAIN)
+ errh->error("'%s': %s", cmdline.c_str(), strerror(errno));
+ }
+ if (!feof(p) && !ferror(p))
+ errh->warning("'%s' output too long, truncated", cmdline.c_str());
+
+ fclose(f);
+ pclose(p);
+ while (strip_newlines && sa && (sa.back() == '\n' || sa.back() == '\r'))
+ sa.pop_back();
+ return sa.take_string();
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/otftotfm/util.hh b/Build/source/utils/lcdf-typetools/otftotfm/util.hh
new file mode 100644
index 00000000000..ee0abaa0a10
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/otftotfm/util.hh
@@ -0,0 +1,29 @@
+#ifndef OTFTOTFM_UTIL_HH
+#define OTFTOTFM_UTIL_HH
+#include <lcdf/string.hh>
+#include <lcdf/globmatch.hh>
+class ErrorHandler;
+
+extern bool no_create;
+extern bool verbose;
+extern bool force;
+
+enum { G_ENCODING = 1, G_METRICS = 2, G_VMETRICS = 4, G_TYPE1 = 8,
+ G_PSFONTSMAP = 16, G_BINARY = 32, G_ASCII = 64, G_DOTLESSJ = 128,
+ G_UPDMAP = 256 };
+
+extern int output_flags;
+
+String read_file(String filename, ErrorHandler *, bool warn = false);
+String printable_filename(const String &);
+String pathname_filename(const String &);
+String shell_quote(const String &);
+int temporary_file(String &, ErrorHandler *);
+int mysystem(const char *command, ErrorHandler *);
+bool parse_unicode_number(const char*, const char*, int require_prefix, uint32_t& result);
+
+#ifdef WIN32
+#define WEXITSTATUS(es) (es)
+#endif
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.am b/Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.am
new file mode 100644
index 00000000000..802f841f664
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1dotlessj
+man_MANS = t1dotlessj.1
+
+t1dotlessj_SOURCES = t1dotlessj.cc
+
+t1dotlessj_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1dotlessj.1
diff --git a/Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.in b/Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.in
new file mode 100644
index 00000000000..b57c46cc653
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1dotlessj/Makefile.in
@@ -0,0 +1,467 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(t1dotlessj_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = t1dotlessj$(EXEEXT)
+subdir = t1dotlessj
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_t1dotlessj_OBJECTS = t1dotlessj.$(OBJEXT)
+t1dotlessj_OBJECTS = $(am_t1dotlessj_OBJECTS)
+t1dotlessj_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(t1dotlessj_SOURCES)
+DIST_SOURCES = $(t1dotlessj_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1dotlessj.1
+t1dotlessj_SOURCES = t1dotlessj.cc
+t1dotlessj_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1dotlessj.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign t1dotlessj/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign t1dotlessj/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+t1dotlessj$(EXEEXT): $(t1dotlessj_OBJECTS) $(t1dotlessj_DEPENDENCIES)
+ @rm -f t1dotlessj$(EXEEXT)
+ $(CXXLINK) $(t1dotlessj_LDFLAGS) $(t1dotlessj_OBJECTS) $(t1dotlessj_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1dotlessj.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.1 b/Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.1
new file mode 100644
index 00000000000..fd5778f88a3
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.1
@@ -0,0 +1,96 @@
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1DOTLESSJ 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1dotlessj \- create a dotless-j PostScript Type 1 font
+.SH SYNOPSIS
+.B t1dotlessj
+\%[OPTIONS...]
+.I font
+.RI [ outputfile ]
+.SH DESCRIPTION
+.BR T1dotlessj
+creates a PostScript Type\~1 font whose only character is a dotless 'j'
+matching the input font's design. It works simply by removing the dot from
+the input font's 'j'. The output font has three characters: '.notdef',
+\&'space', and 'uni0237', where 'uni0237' is the dotless 'j'. The command
+fails if the input font already has a dotless 'j' character, or if there
+seems to be no dot to remove. T1dotlessj writes the created PFA or PFB font
+to the standard output (but see the
+.B \-\-output
+option); if no input file is supplied, it reads a PFA or PFB font from the
+standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-\-output "=\fIfile\fR, " \-o " \fIfile"
+Send output to
+.I file
+instead of standard output.
+'
+.Sp
+.TP 5
+.BR \-\-pfb ", " \-b
+Output a PFB font. This is the default.
+'
+.Sp
+.TP 5
+.BR \-\-pfa ", " \-a
+Output a PFA font.
+'
+.Sp
+.TP 5
+.BR \-\-name "=\fIname\fR, " \-n " \fIname"
+Set the output font's PostScript name to
+.IR name .
+The default is
+.IR InputFontName "LCDFJ."
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "RETURN VALUES"
+.B T1dotlessj
+exits with one of the following values:
+.TP 5
+0
+A dotless-j font was successfully generated.
+.TP 5
+1
+The font already contained a dotless-j character.
+.TP 5
+2
+The font's "j" character had no dot to remove.
+.TP 5
+3
+The font had no "j" character.
+.TP 5
+>3
+An error occurred.
+'
+.SH "SEE ALSO"
+.LP
+.I "Adobe Type 1 Font Format"
+'
+.SH AUTHOR
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.cc b/Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.cc
new file mode 100644
index 00000000000..2619372cf0b
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1dotlessj/t1dotlessj.cc
@@ -0,0 +1,410 @@
+/* t1dotlessj.cc -- driver for creating dotlessj characters from Type 1 fonts
+ *
+ * Copyright (c) 2003-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1csgen.hh>
+#include <efont/t1bounds.hh>
+#include <efont/t1unparser.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+// also see otftotfm/automatic.cc
+enum { EXIT_NORMAL = 0, EXIT_DOTLESSJ_EXISTS = 1, EXIT_J_NODOT = 2,
+ EXIT_NO_J = 3, EXIT_ERROR = 4 };
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define PFA_OPT 304
+#define PFB_OPT 305
+#define OUTPUT_OPT 306
+#define NAME_OPT 307
+
+Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "name", 'n', NAME_OPT, Clp_ArgString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFA_OPT, 0, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'T1dotlessj' reads a PostScript Type 1 font, derives a new PostScript Type 1\n\
+font containing just a dotlessj character (by chopping the dot from the j),\n\
+and writes it to the standard output.\n\
+\n\
+Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -o, --output=FILE Write output to FILE instead of standard output.\n\
+ -n, --name=NAME Set output font's PostScript name.\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not report errors to standard error.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+// Sectioner
+
+class Sectioner : public Type1CharstringGenInterp { public:
+
+ Sectioner(int precision);
+
+ void act_line(int, const Point &, const Point &);
+ void act_curve(int, const Point &, const Point &, const Point &, const Point &);
+ void act_closepath(int);
+ void act_flex(int, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, double);
+
+ void run(const CharstringContext &g);
+ void undot(PermString, ErrorHandler *);
+ Type1Charstring gen(Type1Font *);
+
+ private:
+
+ CharstringBounds _boundser;
+
+ Vector<String> _sections;
+ Vector<int> _bounds;
+
+};
+
+Sectioner::Sectioner(int precision)
+ : Type1CharstringGenInterp(precision)
+{
+ set_direct_hint_replacement(true);
+}
+
+void
+Sectioner::act_line(int cmd, const Point &p0, const Point &p1)
+{
+ Type1CharstringGenInterp::act_line(cmd, p0, p1);
+ _boundser.act_line(cmd, p0, p1);
+}
+
+void
+Sectioner::act_curve(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3)
+{
+ Type1CharstringGenInterp::act_curve(cmd, p0, p1, p2, p3);
+ _boundser.act_curve(cmd, p0, p1, p2, p3);
+}
+
+void
+Sectioner::act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth)
+{
+ Type1CharstringGenInterp::act_flex(cmd, p0, p1, p2, p3_4, p5, p6, p7, flex_depth);
+ _boundser.act_flex(cmd, p0, p1, p2, p3_4, p5, p6, p7, flex_depth);
+}
+
+void
+Sectioner::act_closepath(int cmd)
+{
+ Type1CharstringGenInterp::act_closepath(cmd);
+ Type1Charstring result;
+ Type1CharstringGenInterp::intermediate_output(result);
+ _sections.push_back(result.data_string());
+ _bounds.resize(_bounds.size() + 4);
+ int width_crap;
+ _boundser.output(_bounds.end() - 4, width_crap);
+ _boundser.clear();
+}
+
+void
+Sectioner::run(const CharstringContext &g)
+{
+ _boundser.clear();
+ Type1Charstring last_section;
+ Type1CharstringGenInterp::run(g, last_section);
+ _sections.push_back(last_section.data_string());
+ _bounds.resize(_bounds.size() + 4);
+ int width_crap;
+ _boundser.output(_bounds.end() - 4, width_crap);
+}
+
+void
+Sectioner::undot(PermString font_name, ErrorHandler *errh)
+{
+ //for (String *s = _sections.begin(); s < _sections.end(); s++)
+ // fprintf(stderr, "%d %s\n", s - _sections.begin(), CharstringUnparser::unparse(Type1Charstring(*s)).c_str());
+
+ if (_sections.size() < 3)
+ errh->fatal(EXIT_J_NODOT, "%s: 'j' is already dotless", font_name.c_str());
+
+ int topmost = -1;
+ for (int i = 0; i < _sections.size() - 1; i++)
+ if (topmost < 0 || _bounds[i*4 + 1] > _bounds[topmost*4 + 1])
+ topmost = i;
+
+ // check if any sections are below this
+ for (int i = 0; i < _sections.size() - 1; i++)
+ if (_bounds[i*4 + 1] < _bounds[topmost*4 + 1])
+ goto found_below;
+ errh->fatal(EXIT_J_NODOT, "%s: 'j' is already dotless", font_name.c_str());
+
+ found_below:
+ _sections[topmost] = String();
+}
+
+Type1Charstring
+Sectioner::gen(Type1Font *font)
+{
+ StringAccum sa;
+ for (String *s = _sections.begin(); s < _sections.end(); s++)
+ sa << *s;
+ Type1Charstring in(sa.take_string()), out;
+ Type1CharstringGenInterp gen(precision());
+ gen.set_hint_replacement_storage(font);
+ gen.run(CharstringContext(program(), &in), out);
+ return out;
+}
+
+
+// MAIN
+
+static Type1Font *
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal(EXIT_ERROR, "%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal(EXIT_ERROR, "%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+ if (!font->ok())
+ errh->fatal(EXIT_ERROR, "%s: no glyphs in font", filename);
+
+ delete reader;
+ return font;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *input_file = 0;
+ FILE *outputf = 0;
+ const char *private_use_dotlessj = "uniF6BE";
+ bool binary = true;
+ const char *font_name = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = ErrorHandler::silent_handler();
+ break;
+
+ case NAME_OPT:
+ font_name = clp->arg;
+ break;
+
+ case PFA_OPT:
+ binary = false;
+ break;
+
+ case PFB_OPT:
+ binary = true;
+ break;
+
+ case OUTPUT_OPT:
+ output_file:
+ if (outputf)
+ usage_error(errh, "output file specified twice");
+ if (strcmp(clp->arg, "-") == 0)
+ outputf = stdout;
+ else if (!(outputf = fopen(clp->arg, "wb")))
+ errh->fatal(EXIT_ERROR, "%s: %s", clp->arg, strerror(errno));
+ break;
+
+ case VERSION_OPT:
+ printf("t1dotlessj (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2003-2004 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && outputf)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto output_file;
+ else
+ input_file = clp->arg;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ Type1Font *font = do_file(input_file, psres, errh);
+ if (!input_file || strcmp(input_file, "-") == 0)
+ input_file = "<stdin>";
+
+ // check for existing dotlessj
+ if (font->glyph("dotlessj"))
+ errh->fatal(EXIT_DOTLESSJ_EXISTS, "%s: already has a 'dotlessj' glyph", font->font_name().c_str());
+ else if (font->glyph("uni0237"))
+ errh->fatal(EXIT_DOTLESSJ_EXISTS, "%s: already has a dotlessj glyph at 'uni0237'", font->font_name().c_str());
+ else if (private_use_dotlessj && font->glyph(private_use_dotlessj))
+ errh->fatal(EXIT_DOTLESSJ_EXISTS, "%s: already has a dotlessj glyph at '%s'", font->font_name().c_str(), private_use_dotlessj);
+
+ // check for j
+ Type1Charstring *j_cs = font->glyph("j");
+ if (!j_cs)
+ j_cs = font->glyph("uni006A");
+ if (!j_cs)
+ errh->fatal(EXIT_NO_J, "%s: has no 'j' glyph to make dotless", font->font_name().c_str());
+
+ // make new font
+ String actual_font_name = (font_name ? String(font_name) : font->font_name() + String("LCDFJ"));
+ if (actual_font_name.length() > 29 && !font_name) {
+ errh->warning("derived font name '%s' longer than 29 characters", actual_font_name.c_str());
+ errh->message("(Use the '--name' option to supply your own name.)");
+ }
+ Type1Font *dotless_font = Type1Font::skeleton_make_copy(font, actual_font_name);
+ dotless_font->skeleton_common_subrs();
+
+ // copy space and .notdef
+ if (Type1Charstring *notdef = font->glyph(".notdef"))
+ dotless_font->add_glyph(Type1Subr::make_glyph(".notdef", *notdef, " |-"));
+ if (Type1Charstring *space = font->glyph("space")) {
+ dotless_font->add_glyph(Type1Subr::make_glyph("space", *space, " |-"));
+ dotless_font->type1_encoding()->put(' ', "space");
+ }
+
+ // create dotless j
+ Sectioner sec(5);
+ sec.run(CharstringContext(font, j_cs));
+ sec.undot(font->font_name(), errh);
+ Type1Subr *dotlessj = Type1Subr::make_glyph("uni0237", sec.gen(dotless_font), " |-");
+ dotless_font->add_glyph(dotlessj);
+ //fprintf(stderr, "! %s\n", CharstringUnparser::unparse(dotlessj->t1cs()).c_str());
+
+ // encode dotless j
+ dotless_font->type1_encoding()->clear();
+ dotless_font->type1_encoding()->put('j', "uni0237");
+
+ // write it to output
+ if (!outputf)
+ outputf = stdout;
+ if (binary) {
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outputf), _O_BINARY);
+#endif
+ Type1PFBWriter w(outputf);
+ dotless_font->write(w);
+ } else {
+ Type1PFAWriter w(outputf);
+ dotless_font->write(w);
+ }
+
+ return (errh->nerrors() == 0 ? EXIT_NORMAL : EXIT_ERROR);
+}
diff --git a/Build/source/utils/lcdf-typetools/t1lint/Makefile.am b/Build/source/utils/lcdf-typetools/t1lint/Makefile.am
new file mode 100644
index 00000000000..641702c1ed2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1lint/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1lint
+man_MANS = t1lint.1
+
+t1lint_SOURCES = cscheck.hh cscheck.cc \
+ t1lint.cc
+
+t1lint_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1lint.1
diff --git a/Build/source/utils/lcdf-typetools/t1lint/Makefile.in b/Build/source/utils/lcdf-typetools/t1lint/Makefile.in
new file mode 100644
index 00000000000..828293db962
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1lint/Makefile.in
@@ -0,0 +1,474 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(t1lint_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = t1lint$(EXEEXT)
+subdir = t1lint
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_t1lint_OBJECTS = cscheck.$(OBJEXT) t1lint.$(OBJEXT)
+t1lint_OBJECTS = $(am_t1lint_OBJECTS)
+t1lint_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(t1lint_SOURCES)
+DIST_SOURCES = $(t1lint_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1lint.1
+t1lint_SOURCES = cscheck.hh cscheck.cc \
+ t1lint.cc
+
+t1lint_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1lint.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign t1lint/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign t1lint/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+t1lint$(EXEEXT): $(t1lint_OBJECTS) $(t1lint_DEPENDENCIES)
+ @rm -f t1lint$(EXEEXT)
+ $(CXXLINK) $(t1lint_LDFLAGS) $(t1lint_OBJECTS) $(t1lint_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscheck.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1lint.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/t1lint/cscheck.cc b/Build/source/utils/lcdf-typetools/t1lint/cscheck.cc
new file mode 100644
index 00000000000..27f63b4b0a7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1lint/cscheck.cc
@@ -0,0 +1,457 @@
+/* cscheck.{cc,hh} -- checking Type 1 charstrings for validity
+ *
+ * Copyright (c) 1999-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "cscheck.hh"
+#include <efont/t1item.hh>
+#include <lcdf/error.hh>
+#include <efont/t1unparser.hh>
+
+using namespace Efont;
+
+#define CHECK_STACK(numargs) do { if (size() < numargs) return error(errUnderflow, cmd); } while (0)
+#define CHECK_STACK_CP(numargs) do { CHECK_STACK(numargs); if (!_cp_exists) return error(errCurrentPoint, cmd); } while (0)
+
+
+CharstringChecker::CharstringChecker()
+ : CharstringInterp(), _errh(0)
+{
+ set_careful(true);
+}
+
+CharstringChecker::CharstringChecker(const Vector<double> &weight)
+ : CharstringInterp(weight), _errh(0)
+{
+ set_careful(true);
+}
+
+
+void
+CharstringChecker::stem(double y, double dy, const char *cmd_name)
+{
+ bool is_v = (cmd_name[0] == 'v');
+ Vector<double> &hints = (is_v ? _h_vstem : _h_hstem);
+ const char *dimen_name = (is_v ? "x" : "y");
+ if (dy < 0) {
+ y += dy;
+ dy = -dy;
+ }
+ if (dy < 0.5)
+ _errh->warning("small delta-%s in `%s' (%g)", dimen_name, cmd_name, dy);
+ for (int i = 0; i < hints.size(); i += 2)
+ if ((hints[i] >= y && hints[i+1] <= y)
+ || (hints[i] >= y+dy && hints[i+1] <= y+dy))
+ _errh->warning("overlapping `%s' hints", cmd_name);
+ hints.push_back(y);
+ hints.push_back(y+dy);
+}
+
+void
+CharstringChecker::check_stem3(const char *cmd_name)
+{
+ bool is_v = (cmd_name[0] == 'v');
+ Vector<double> &hints = (is_v ? _h_vstem : _h_hstem);
+ Vector<double> &old_hints = (is_v ? _h_vstem3 : _h_hstem3);
+ assert(hints.size() == 6);
+
+ // sort hints
+ int i0, i1, i2;
+ if (hints[0] > hints[2])
+ i0 = 2, i1 = 0;
+ else
+ i0 = 0, i1 = 2;
+ if (hints[4] < hints[i0])
+ i2 = i1, i1 = i0, i0 = 4;
+ else if (hints[4] < hints[i1])
+ i2 = i1, i1 = 4;
+ else
+ i2 = 4;
+
+ // check constraints. count "almost equal" as equal
+ double stemw1 = hints[i0+1] - hints[i0];
+ double stemw2 = hints[i2+1] - hints[i2];
+ if ((int)(1024*(stemw1 - stemw2) + .5) != 0)
+ _errh->error("bad `%s': extreme stem widths unequal (%g, %g)", cmd_name, stemw1, stemw2);
+
+ double c0 = (hints[i0] + hints[i0+1])/2;
+ double c1 = (hints[i1] + hints[i1+1])/2;
+ double c2 = (hints[i2] + hints[i2+1])/2;
+ if ((int)(1024*((c1 - c0) - (c2 - c1)) + .5) != 0)
+ _errh->error("bad `%s': stem gaps unequal (%g, %g)", cmd_name, c1-c0, c2-c1);
+
+ // compare to old hints
+ if (old_hints.size()) {
+ for (int i = 0; i < old_hints.size(); i++)
+ if (hints[i] != old_hints[i]) {
+ _errh->warning("`%s' conflicts with old `%s'", cmd_name, cmd_name);
+ break;
+ }
+ }
+ old_hints = hints;
+}
+
+void
+CharstringChecker::moveto(double, double, bool cp_exists)
+{
+ _cp_exists = cp_exists;
+}
+
+void
+CharstringChecker::rmoveto(double, double)
+{
+ _cp_exists = true;
+}
+
+void
+CharstringChecker::rlineto(double, double)
+{
+}
+
+void
+CharstringChecker::rrcurveto(double, double, double, double, double, double)
+{
+}
+
+
+bool
+CharstringChecker::error(int which, int data)
+{
+ CharstringInterp::error(which, data);
+ _errh->error("%s", error_string().c_str());
+ return false;
+}
+
+bool
+CharstringChecker::callothersubr()
+{
+ int othersubrnum = (int)top(0);
+ int n = (int)top(1);
+ int i;
+
+ pop(2);
+ if (othersubrnum < 0 || size() < n) return false;
+
+ if (!_started && (othersubrnum < 14 || othersubrnum > 18))
+ _errh->warning("first command not `hsbw' or `sbw'");
+
+ switch (othersubrnum) {
+
+ case 0: // Flex
+ if (n != 3) {
+ _errh->error("wrong number of arguments to Flex");
+ goto unknown;
+ }
+ if (!_flex || ps_size() != 16) {
+ _errh->error("bad Flex");
+ return false;
+ }
+ //_connect = _flex_connect;
+#if 0
+ addbezier(Point(ps_at(0), ps_at(1)),
+ Point(ps_at(4), ps_at(5)),
+ Point(ps_at(6), ps_at(7)),
+ Point(ps_at(8), ps_at(9)));
+ addbezier(Point(ps_at(8), ps_at(9)),
+ Point(ps_at(10), ps_at(11)),
+ Point(ps_at(12), ps_at(13)),
+ Point(ps_at(14), ps_at(15)));
+#endif
+ ps_clear();
+ ps_push(top(0));
+ ps_push(top(1));
+ _flex = false;
+ break;
+
+ case 1: // Flex
+ if (n != 0) {
+ _errh->error("wrong number of arguments to Flex");
+ goto unknown;
+ }
+ ps_clear();
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ _flex = true;
+ //_flex_connect = _connect;
+ break;
+
+ case 2: // Flex
+ if (n != 0) {
+ _errh->error("wrong number of arguments to Flex");
+ goto unknown;
+ }
+ if (!_flex)
+ return error(errFlex, 0);
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ break;
+
+ case 3: // hint replacement
+ if (n != 1) {
+ _errh->error("wrong number of arguments to hint replacement");
+ goto unknown;
+ }
+ ps_clear();
+ ps_push(top());
+ _h_hstem.clear();
+ _h_vstem.clear();
+ break;
+
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ case 18:
+ return mm_command(othersubrnum, n);
+
+ default: // unknown
+ unknown:
+ _errh->warning("unknown callothersubr `%d'", othersubrnum);
+ ps_clear();
+ for (i = 0; i < n; i++)
+ ps_push(top(i));
+ break;
+
+ }
+
+ pop(n);
+ return true;
+}
+
+//#define DEBUG(s) printf s
+#define DEBUG(s)
+
+bool
+CharstringChecker::type1_command(int cmd)
+{
+ if (cmd == Cs::cCallsubr)
+ return callsubr_command();
+ else if (cmd == Cs::cCallothersubr) {
+ CHECK_STACK(2);
+ return callothersubr();
+ } else if (cmd == Cs::cReturn) {
+ return false;
+ } else if (cmd == Cs::cPop || cmd == Cs::cDiv) {
+ return arith_command(cmd);
+ }
+
+ if (cmd != Cs::cHsbw && cmd != Cs::cSbw) {
+ if (!_started)
+ _errh->warning("first command not `hsbw' or `sbw'");
+ } else {
+ if (_started)
+ _errh->error("duplicate `hsbw' or `sbw'");
+ }
+ _started = true;
+
+ switch (cmd) {
+
+ case Cs::cHsbw:
+ CHECK_STACK(2);
+ moveto(at(0), 0, false);
+ clear();
+ break;
+
+ case Cs::cSbw:
+ CHECK_STACK(4);
+ moveto(at(0), at(1), false);
+ clear();
+ break;
+
+ case Cs::cClosepath:
+ _cp_exists = false;
+ clear();
+ break;
+
+ case Cs::cHlineto:
+ CHECK_STACK_CP(1);
+ rlineto(at(0), 0);
+ clear();
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK(1);
+ rmoveto(at(0), 0);
+ clear();
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK_CP(4);
+ rrcurveto(at(0), 0, at(1), at(2), 0, at(3));
+ clear();
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK_CP(2);
+ rlineto(at(0), at(1));
+ clear();
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK(2);
+ rmoveto(at(0), at(1));
+ clear();
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK_CP(6);
+ rrcurveto(at(0), at(1), at(2), at(3), at(4), at(5));
+ clear();
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK_CP(4);
+ rrcurveto(0, at(0), at(1), at(2), at(3), 0);
+ clear();
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK_CP(1);
+ rlineto(0, at(0));
+ clear();
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK(1);
+ rmoveto(0, at(0));
+ clear();
+ break;
+
+ case Cs::cHstem:
+ CHECK_STACK(2);
+ if (_hstem3 && !_hstem)
+ _errh->error("charstring has both `hstem' and `hstem3'");
+ _hstem = true;
+ stem(at(0), at(1), "hstem");
+ clear();
+ break;
+
+ case Cs::cVstem:
+ CHECK_STACK(2);
+ if (_vstem3 && !_vstem)
+ _errh->error("charstring has both `vstem' and `vstem3'");
+ _vstem = true;
+ stem(at(0), at(1), "vstem");
+ clear();
+ break;
+
+ case Cs::cEndchar:
+ set_done();
+ return false;
+
+ case Cs::cDotsection:
+ break;
+
+ case Cs::cVstem3:
+ CHECK_STACK(6);
+ if (_vstem && !_vstem3)
+ _errh->error("charstring has both `vstem' and `vstem3'");
+ _vstem3 = true;
+ _h_vstem.clear();
+ stem(at(0), at(1), "vstem3");
+ stem(at(2), at(3), "vstem3");
+ stem(at(4), at(5), "vstem3");
+ check_stem3("vstem3");
+ clear();
+ break;
+
+ case Cs::cHstem3:
+ CHECK_STACK(6);
+ if (_hstem && !_hstem3)
+ _errh->error("charstring has both `hstem' and `hstem3'");
+ _hstem3 = true;
+ _h_hstem.clear();
+ stem(at(0), at(1), "hstem3");
+ stem(at(2), at(3), "hstem3");
+ stem(at(4), at(5), "hstem3");
+ check_stem3("hstem3");
+ clear();
+ break;
+
+ case Cs::cSeac: {
+ CHECK_STACK(5);
+#if 0
+ double asb = at(0);
+ double adx = at(1);
+ double ady = at(2);
+ int bchar = (int)at(3);
+ int achar = (int)at(4);
+
+ double ax = adx - asb + _sidebearing.x;
+ double ay = ady + _sidebearing.y;
+
+ Point real_sidebearing = _sidebearing;
+ Point real_char_width = _char_width;
+ Point original_origin = _origin;
+
+ Type1Encoding *adobe = Type1Encoding::standard_encoding();
+ if (!adobe)
+ return error(errInternal, cmd);
+ Type1Charstring *t1cs = get_glyph((*adobe)[achar]);
+ if (!t1cs) ERROR(errGlyph);
+ _origin = Point(ax, ay);
+ init();
+ t1cs->run(*this);
+ _origin = original_origin;
+ if (error()) return false;
+
+ t1cs = get_glyph((*adobe)[bchar]);
+ if (!t1cs) ERROR(errGlyph);
+ init();
+ t1cs->run(*this);
+ _sidebearing = real_sidebearing;
+ _char_width = real_char_width;
+#endif
+ return false;
+ }
+
+ case Cs::cSetcurrentpoint:
+ CHECK_STACK(2);
+ _cp = Point(at(0), at(1));
+ _cp_exists = true;
+ clear();
+ break;
+
+ case Cs::cPut:
+ case Cs::cGet:
+ case Cs::cStore:
+ case Cs::cLoad:
+ return vector_command(cmd);
+
+ default:
+ return arith_command(cmd);
+
+ }
+
+ return true;
+}
+
+bool
+CharstringChecker::check(const CharstringContext &g, ErrorHandler *errh)
+{
+ _errh = errh;
+ int old_errors = errh->nerrors();
+
+ _started = false;
+ _flex = false;
+ _hstem = _hstem3 = _vstem = _vstem3 = false;
+ _h_hstem.clear();
+ _h_vstem.clear();
+ _h_hstem3.clear();
+ _h_vstem3.clear();
+
+ CharstringInterp::interpret(g);
+
+ return errh->nerrors() == old_errors;
+}
diff --git a/Build/source/utils/lcdf-typetools/t1lint/cscheck.hh b/Build/source/utils/lcdf-typetools/t1lint/cscheck.hh
new file mode 100644
index 00000000000..e5f509ab232
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1lint/cscheck.hh
@@ -0,0 +1,50 @@
+#ifndef CSCHECK_HH
+#define CSCHECK_HH
+#include <efont/t1interp.hh>
+#include <lcdf/point.hh>
+#include <lcdf/vector.hh>
+class ErrorHandler;
+
+class CharstringChecker : public Efont::CharstringInterp { public:
+
+ CharstringChecker();
+ CharstringChecker(const Vector<double> &weight_vec);
+
+ bool error(int, int);
+ bool callothersubr();
+ bool type1_command(int);
+
+ bool check(const Efont::CharstringContext &, ErrorHandler *);
+
+ private:
+
+ ErrorHandler *_errh;
+
+ Point _cp;
+
+ bool _started;
+ bool _flex;
+ bool _cp_exists;
+
+ bool _hstem;
+ bool _hstem3;
+ bool _vstem;
+ bool _vstem3;
+
+ Vector<double> _h_hstem;
+ Vector<double> _h_vstem;
+
+ Vector<double> _h_hstem3;
+ Vector<double> _h_vstem3;
+
+ void stem(double, double, const char *);
+ void check_stem3(const char *);
+
+ void moveto(double, double, bool cp_exists = true);
+ void rmoveto(double, double);
+ void rlineto(double, double);
+ void rrcurveto(double, double, double, double, double, double);
+
+};
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/t1lint/t1lint.1 b/Build/source/utils/lcdf-typetools/t1lint/t1lint.1
new file mode 100644
index 00000000000..54077ee6728
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1lint/t1lint.1
@@ -0,0 +1,48 @@
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1LINT 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1lint \- check a PostScript Type 1 font for correctness
+.SH SYNOPSIS
+.B t1lint
+\%\fIfont\fR [\fIfont\fR...]
+.SH DESCRIPTION
+.BR T1lint
+checks PostScript Type 1 font programs for correctness. Any errors or
+variances from the specification are reported to standard error. If there
+are no errors, the command prints nothing. It exits with status 0 if all
+fonts were OK, and status 1 otherwise. If no input files are supplied,
+t1lint reads a font from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages. The only output will be the exit
+status.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M t1disasm 1
+.LP
+.I "Adobe Type 1 Font Format"
+'
+.SH AUTHOR
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/lcdf-typetools/t1lint/t1lint.cc b/Build/source/utils/lcdf-typetools/t1lint/t1lint.cc
new file mode 100644
index 00000000000..2e398a4bccd
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1lint/t1lint.cc
@@ -0,0 +1,437 @@
+/* t1lint.cc -- driver for checking Type 1 fonts for validity
+ *
+ * Copyright (c) 1999-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1mm.hh>
+#include "cscheck.hh"
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+
+Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'T1lint' checks a PostScript Type 1 font for correctness. Any errors or\n\
+divergences from the specification are reported to standard error. Nothing is\n\
+printed for correct fonts. The command exits with status 0 if there are no\n\
+errors, and status 1 otherwise.\n\
+\n\
+Usage: %s [OPTION]... FONT [...]\n\
+\n\
+Each FONT is the name of a PFA or PFB font file.\n\
+\n\
+Options:\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not report errors to standard error.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+/*****
+ * CHECKS
+ **/
+
+static bool
+get_num_array(Type1Font *font, int dictionary, const char *name,
+ Vector<double> &v, ErrorHandler *errh, bool mandatory = false)
+{
+ if (Type1Definition *d = font->dict(dictionary, name)) {
+ if (d->value_numvec(v))
+ return true;
+ errh->error("%s not an array of numbers", name);
+ v.clear();
+ } else if (mandatory)
+ errh->error("%s not defined", name);
+ return false;
+}
+
+static bool
+get_integer(Type1Font *font, int dictionary, const char *name,
+ int &v, ErrorHandler *errh, bool mandatory = false)
+{
+ Type1Definition *d = font->dict(dictionary, name);
+ double scratch;
+ if (d && d->value_int(v))
+ return true;
+ else if (d && d->value_num(scratch)) {
+ errh->warning("%s not an integer", name);
+ v = (int)scratch;
+ return true;
+ } else if (d)
+ errh->error("%s not a number", name);
+ else if (mandatory)
+ errh->error("%s not defined", name);
+ return false;
+}
+
+// BLUES
+
+static void
+check_blue_array(Vector<double> &blues, const char *name, double BlueScale,
+ ErrorHandler *errh)
+{
+ if (blues.size() % 2 != 0) {
+ errh->error("%s has an odd number of entries", name);
+ blues.push_back(blues.back());
+ }
+
+ for (int i = 0; i < blues.size(); i++)
+ if (blues[i] != (double)((int)blues[i])) {
+ errh->warning("some %s entries are not integers", name);
+ break;
+ }
+
+ double max_diff = 1 / BlueScale;
+ for (int i = 0; i < blues.size(); i += 2) {
+ if (blues[i] > blues[i+1])
+ errh->error("%s zone %d in the wrong order", name, i/2);
+ else if (blues[i+1] - blues[i] >= max_diff)
+ errh->error("%s zone %d too large in relation to BlueScale", name, i/2);
+ }
+}
+
+static void
+check_blue_overlap(Vector<double> &bl1, const char *name1,
+ Vector<double> &bl2, const char *name2, int BlueFuzz,
+ ErrorHandler *errh)
+{
+ int min_fuzz = 2*BlueFuzz + 1;
+ for (int i = 2; i < bl1.size(); i += 2) {
+ int thresh = (&bl1 == &bl2 ? i : bl2.size());
+ for (int j = 0; j < thresh; j += 2) {
+ if ((bl2[j] >= bl1[i] && bl2[j] <= bl1[i+1])
+ || (bl2[j+1] >= bl1[i] && bl2[j+1] <= bl1[i+1]))
+ errh->error("%s zone %d and %s zone %d overlap",
+ name1, i/2, name2, j/2);
+ else if ((bl2[j] >= bl1[i+1] && bl2[j] < bl1[i+1]+min_fuzz)
+ || (bl2[j+1] <= bl1[i] && bl2[j+1]+min_fuzz > bl1[i]))
+ errh->error("%s zone %d and %s zone %d overlap within BlueFuzz",
+ name1, i/2, name2, j/2);
+ }
+ }
+}
+
+static void
+check_blues(Type1Font *font, ErrorHandler *errh)
+{
+ Type1Definition *d;
+
+ // BlueScale
+ double BlueScale;
+ bool ok = false;
+ if ((d = font->p_dict("BlueScale"))) {
+ if (!d->value_num(BlueScale))
+ errh->error("BlueScale not a real number");
+ else if (BlueScale <= 0)
+ errh->error("BlueScale less than or equal to 0");
+ else {
+ if (BlueScale > 0.5)
+ errh->error("suspiciously large BlueScale (%g)", BlueScale);
+ ok = true;
+ }
+ }
+ if (!ok) BlueScale = 0.039625;
+
+ // BlueShift
+ int BlueShift = -1;
+ if (get_integer(font, Type1Font::dP, "BlueShift", BlueShift, errh)
+ && BlueShift < 0)
+ errh->error("BlueShift less than 0");
+ if (BlueShift < 0)
+ BlueShift = 7;
+
+ // BlueFuzz
+ int BlueFuzz = -1;
+ if (get_integer(font, Type1Font::dP, "BlueFuzz", BlueFuzz, errh)
+ && BlueFuzz < 0)
+ errh->error("BlueFuzz less than 0");
+ if (BlueFuzz < 0)
+ BlueFuzz = 1;
+ else if (BlueFuzz > 10)
+ errh->warning("suspiciously large BlueFuzz (%d)", BlueFuzz);
+
+ // BlueValues
+ Vector<double> BlueValues, OtherBlues;
+ get_num_array(font, Type1Font::dP, "BlueValues", BlueValues, errh, true);
+ get_num_array(font, Type1Font::dP, "OtherBlues", OtherBlues, errh);
+
+ check_blue_array(BlueValues, "BlueValues", BlueScale, errh);
+ if (BlueValues.size() > 14)
+ errh->error("too many zones in BlueValues (max 7)");
+ check_blue_array(OtherBlues, "OtherBlues", BlueScale, errh);
+ if (OtherBlues.size() > 10)
+ errh->error("too many zones in OtherBlues (max 5)");
+
+ check_blue_overlap(BlueValues, "BlueValues", BlueValues, "BlueValues", BlueFuzz, errh);
+ check_blue_overlap(OtherBlues, "OtherBlues", OtherBlues, "OtherBlues", BlueFuzz, errh);
+ check_blue_overlap(BlueValues, "BlueValues", OtherBlues, "OtherBlues", BlueFuzz, errh);
+
+ // FamilyBlues
+ Vector<double> FamilyBlues, FamilyOtherBlues;
+ get_num_array(font, Type1Font::dP, "FamilyBlues", FamilyBlues, errh);
+ get_num_array(font, Type1Font::dP, "FamilyOtherBlues", FamilyOtherBlues, errh);
+
+ check_blue_array(FamilyBlues, "FamilyBlues", BlueScale, errh);
+ if (FamilyBlues.size() > 14)
+ errh->error("too many zones in FamilyBlues (max 7)");
+ check_blue_array(FamilyOtherBlues, "FamilyOtherBlues", BlueScale, errh);
+ if (FamilyOtherBlues.size() > 10)
+ errh->error("too many zones in FamilyOtherBlues (max 5)");
+
+ check_blue_overlap(FamilyBlues, "FamilyBlues", FamilyBlues, "FamilyBlues", BlueFuzz, errh);
+ check_blue_overlap(FamilyOtherBlues, "FamilyOtherBlues", FamilyOtherBlues, "FamilyOtherBlues", BlueFuzz, errh);
+ check_blue_overlap(FamilyBlues, "FamilyBlues", FamilyOtherBlues, "FamilyOtherBlues", BlueFuzz, errh);
+}
+
+
+// STEMS
+
+void
+check_stem_snap(Vector<double> &stem_snap, double main, bool is_v,
+ ErrorHandler *errh)
+{
+ const char *name = (is_v ? "V" : "H");
+ if (stem_snap.size() > 12)
+ errh->error("StemSnap%s has more than 12 entries", name);
+ for (int i = 0; i < stem_snap.size() - 1; i++)
+ if (stem_snap[i] >= stem_snap[i+1]) {
+ errh->error("StemSnap%s is not sorted in increasing order", name);
+ break;
+ }
+ for (int i = 0; i < stem_snap.size(); i++)
+ if (stem_snap[i] == main)
+ return;
+ if (main >= 0)
+ errh->warning("Std%sW not in StemSnap%s array", name, name);
+}
+
+void
+check_stems(Type1Font *font, ErrorHandler *errh)
+{
+ Vector<double> StdHW, StdVW, StemSnapH, StemSnapV;
+ if (get_num_array(font, Type1Font::dP, "StdHW", StdHW, errh)) {
+ if (StdHW.size() != 1)
+ errh->error("StdHW has %d entries (exactly one required)", StdHW.size());
+ if (StdHW.size() > 0 && StdHW[0] <= 0)
+ errh->error("StdHW entry less than or equal to 0");
+ }
+ if (get_num_array(font, Type1Font::dP, "StdVW", StdVW, errh)) {
+ if (StdVW.size() != 1)
+ errh->error("StdVW has %d entries (exactly one required)", StdVW.size());
+ if (StdVW.size() > 0 && StdVW[0] <= 0)
+ errh->error("StdVW entry less than or equal to 0");
+ }
+
+ if (get_num_array(font, Type1Font::dP, "StemSnapH", StemSnapH, errh))
+ check_stem_snap(StemSnapH, StdHW.size() ? StdHW[0] : -1000, false, errh);
+ if (get_num_array(font, Type1Font::dP, "StemSnapV", StemSnapV, errh))
+ check_stem_snap(StemSnapV, StdVW.size() ? StdVW[0] : -1000, true, errh);
+}
+
+
+// MAIN
+
+static void
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+
+ if (font) {
+ LandmarkErrorHandler cerrh(errh, filename);
+
+ // check UniqueID values
+ int UniqueID = -1, UniqueID2 = -1;
+ if (get_integer(font, Type1Font::dF, "UniqueID", UniqueID, errh)
+ && (UniqueID < 0 || UniqueID > 0xFFFFFF))
+ errh->error("UniqueID not in the range 0-16777215");
+ if (get_integer(font, Type1Font::dP, "UniqueID", UniqueID2, errh)
+ && (UniqueID2 < 0 || UniqueID2 > 0xFFFFFF))
+ errh->error("Private UniqueID not in the range 0-16777215");
+ if (UniqueID >= 0 && UniqueID2 >= 0 && UniqueID != UniqueID2)
+ errh->error("Private UniqueID does not equal font UniqueID");
+
+ // check XUID values
+ Vector<double> XUID;
+ if (get_num_array(font, Type1Font::dF, "XUID", XUID, errh)) {
+ if (XUID.size() == 0)
+ errh->error("empty XUID");
+ for (int i = 0; i < XUID.size(); i++) {
+ if (floor(XUID[i]) != XUID[i] || XUID[i] < 0 || XUID[i] > 0xFFFFFF) {
+ errh->error("element of XUID not an integer in the range 0-16777215");
+ break;
+ }
+ }
+ }
+
+ check_blues(font, &cerrh);
+ check_stems(font, &cerrh);
+
+ MultipleMasterSpace *mmspace = font->create_mmspace(&cerrh);
+ Vector<double> weight_vector;
+ if (mmspace)
+ weight_vector = mmspace->default_weight_vector();
+ int gc = font->nglyphs();
+ CharstringChecker cc(weight_vector);
+
+ for (int i = 0; i < gc; i++) {
+ ContextErrorHandler derrh
+ (&cerrh, String("While interpreting `") + font->glyph_name(i) + "':");
+ cc.check(font->glyph_context(i), &derrh);
+ }
+ }
+
+ delete font;
+ delete reader;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ int nfiles = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = ErrorHandler::silent_handler();
+ break;
+
+ case VERSION_OPT:
+ printf("t1lint (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2005 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ do_file(clp->arg, psres, errh);
+ nfiles++;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (nfiles == 0)
+ do_file("-", psres, errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/Makefile.am b/Build/source/utils/lcdf-typetools/t1reencode/Makefile.am
new file mode 100644
index 00000000000..8dcf9da887d
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/Makefile.am
@@ -0,0 +1,16 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1reencode
+man_MANS = t1reencode.1
+
+t1reencode_SOURCES = md5.c md5.h \
+ t1reencode.cc \
+ util.cc util.hh
+
+t1reencode_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1reencode.1
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/Makefile.in b/Build/source/utils/lcdf-typetools/t1reencode/Makefile.in
new file mode 100644
index 00000000000..3ee48aec649
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/Makefile.in
@@ -0,0 +1,491 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(t1reencode_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = t1reencode$(EXEEXT)
+subdir = t1reencode
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_t1reencode_OBJECTS = md5.$(OBJEXT) t1reencode.$(OBJEXT) \
+ util.$(OBJEXT)
+t1reencode_OBJECTS = $(am_t1reencode_OBJECTS)
+t1reencode_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(t1reencode_SOURCES)
+DIST_SOURCES = $(t1reencode_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1reencode.1
+t1reencode_SOURCES = md5.c md5.h \
+ t1reencode.cc \
+ util.cc util.hh
+
+t1reencode_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1reencode.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign t1reencode/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign t1reencode/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+t1reencode$(EXEEXT): $(t1reencode_OBJECTS) $(t1reencode_DEPENDENCIES)
+ @rm -f t1reencode$(EXEEXT)
+ $(CXXLINK) $(t1reencode_LDFLAGS) $(t1reencode_OBJECTS) $(t1reencode_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1reencode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/md5.c b/Build/source/utils/lcdf-typetools/t1reencode/md5.c
new file mode 100644
index 00000000000..d9fbd7510e2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/md5.c
@@ -0,0 +1,354 @@
+/* -*- mode: c; c-basic-offset: 8 -*- */
+/* md5.c - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
+ *
+ * according to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+/* heavily modified for GnuPG by <werner.koch@guug.de> */
+/* modified again for Sylpheed by <wk@gnupg.org> 2001-02-11 */
+/* modified again for LCDF by Eddie Kohler <kohler@icir.org> */
+
+
+/* Test values:
+ * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E
+ * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61
+ * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72
+ * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <lcdf/inttypes.h>
+
+#include "md5.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/****************
+ * Rotate a 32 bit integer by n bytes
+ */
+#if defined(__GNUC__) && defined(__i386__)
+static inline uint32_t
+rol( uint32_t x, int n)
+{
+ __asm__("roll %%cl,%0"
+ :"=r" (x)
+ :"0" (x),"c" (n));
+ return x;
+}
+#else
+#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+#endif
+
+
+void
+md5_init(MD5_CONTEXT *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->nblocks = 0;
+ ctx->count = 0;
+ ctx->finalized = 0;
+}
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+
+/****************
+ * transform n*64 bytes
+ */
+static void
+transform(MD5_CONTEXT *ctx, const unsigned char *data)
+{
+ uint32_t correct_words[16];
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+ uint32_t *cwp = correct_words;
+
+#ifdef BIG_ENDIAN_HOST
+ {
+ int i;
+ unsigned char *p2, *p1;
+
+ for (i = 0, p1 = data, p2 = (unsigned char*)correct_words;
+ i < 16; i++, p2 += 4) {
+ p2[3] = *p1++;
+ p2[2] = *p1++;
+ p2[1] = *p1++;
+ p2[0] = *p1++;
+ }
+ }
+#else
+ memcpy(correct_words, data, 64);
+#endif
+
+
+#define OP(a, b, c, d, s, T) \
+ do { \
+ a += FF (b, c, d) + (*cwp++) + T; \
+ a = rol(a, s); \
+ a += b; \
+ } while (0)
+
+ /* Before we start, one word about the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ a = rol(a, s); \
+ a += b; \
+ } while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Put checksum in context given as argument. */
+ ctx->A += A;
+ ctx->B += B;
+ ctx->C += C;
+ ctx->D += D;
+}
+
+
+
+/* The routine updates the message-digest context to
+ * account for the presence of each of the characters inBuf[0..inLen-1]
+ * in the message whose digest is being computed.
+ */
+void
+md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen)
+{
+ if (hd->count == 64) { /* flush the buffer */
+ transform( hd, hd->buf );
+ hd->count = 0;
+ hd->nblocks++;
+ }
+ if (!inbuf)
+ return;
+ if (hd->count) {
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+ md5_update(hd, NULL, 0);
+ if (!inlen)
+ return;
+ }
+
+ while (inlen >= 64) {
+ transform(hd, inbuf);
+ hd->count = 0;
+ hd->nblocks++;
+ inlen -= 64;
+ inbuf += 64;
+ }
+
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+}
+
+
+
+/* The routine final terminates the message-digest computation and
+ * ends with the desired message digest in mdContext->digest[0...15].
+ * The handle is prepared for a new MD5 cycle.
+ * Returns 16 bytes representing the digest.
+ */
+
+static void
+do_final(MD5_CONTEXT *hd)
+{
+ uint32_t t, msb, lsb;
+ unsigned char *p;
+
+ md5_update(hd, NULL, 0); /* flush */
+
+ msb = 0;
+ t = hd->nblocks;
+ if ((lsb = t << 6) < t) /* multiply by 64 to make a byte count */
+ msb++;
+ msb += t >> 26;
+ t = lsb;
+ if ((lsb = t + hd->count) < t) /* add the count */
+ msb++;
+ t = lsb;
+ if ((lsb = t << 3) < t) /* multiply by 8 to make a bit count */
+ msb++;
+ msb += t >> 29;
+
+ if (hd->count < 56) { /* enough room */
+ hd->buf[hd->count++] = 0x80; /* pad */
+ while(hd->count < 56)
+ hd->buf[hd->count++] = 0; /* pad */
+ } else { /* need one extra block */
+ hd->buf[hd->count++] = 0x80; /* pad character */
+ while (hd->count < 64)
+ hd->buf[hd->count++] = 0;
+ md5_update(hd, NULL, 0); /* flush */
+ memset(hd->buf, 0, 56); /* fill next block with zeroes */
+ }
+
+ /* append the 64 bit count */
+ hd->buf[56] = lsb ;
+ hd->buf[57] = lsb >> 8;
+ hd->buf[58] = lsb >> 16;
+ hd->buf[59] = lsb >> 24;
+ hd->buf[60] = msb ;
+ hd->buf[61] = msb >> 8;
+ hd->buf[62] = msb >> 16;
+ hd->buf[63] = msb >> 24;
+ transform(hd, hd->buf);
+
+ p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \
+ *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0)
+#else /* little endian */
+ /*#define X(a) do { *(uint32_t*)p = hd->##a ; p += 4; } while(0)*/
+ /* Unixware's cpp doesn't like the above construct so we do it his way:
+ * (reported by Allan Clark) */
+#define X(a) do { *(uint32_t*)p = (*hd).a ; p += 4; } while(0)
+#endif
+ X(A);
+ X(B);
+ X(C);
+ X(D);
+#undef X
+ hd->finalized = 1;
+}
+
+void
+md5_final(unsigned char *digest, MD5_CONTEXT *ctx)
+{
+ if (!ctx->finalized)
+ do_final(ctx);
+ memcpy(digest, ctx->buf, 16);
+}
+
+void
+md5_final_text(char *buf, MD5_CONTEXT *ctx)
+{
+ static const char *chars = "abcdefghijklmnopqrstuvwxyz234567";
+ int bit;
+ if (!ctx->finalized)
+ do_final(ctx);
+ for (bit = 0; bit < 16*8; bit += 5) {
+ int first_char = bit / 8;
+ int val = ctx->buf[first_char] >> (bit % 8);
+ if (bit + 8 > (first_char + 1) * 8 && first_char < 15)
+ val += ctx->buf[first_char + 1] << (8 - (bit % 8));
+ *buf++ = chars[val & 0x1F];
+ }
+ *buf++ = 0;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/md5.h b/Build/source/utils/lcdf-typetools/t1reencode/md5.h
new file mode 100644
index 00000000000..228c45f615c
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/md5.h
@@ -0,0 +1,48 @@
+/* md5.h - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
+ *
+ * according to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _MD5_HDR_
+#define _MD5_HDR_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_TEXT_DIGEST_SIZE 26 /* + 1 for the terminating NUL */
+
+typedef struct { /* Hmm, should be private */
+ uint32_t A,B,C,D;
+ uint32_t nblocks;
+ unsigned char buf[64];
+ int count;
+ int finalized;
+} MD5_CONTEXT;
+
+void md5_init(MD5_CONTEXT *ctx);
+void md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen);
+void md5_final(unsigned char digest[MD5_DIGEST_SIZE], MD5_CONTEXT *ctx);
+void md5_final_text(char *text_digest, MD5_CONTEXT *ctx);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _MD5_HDR_ */
+
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/t1reencode.1 b/Build/source/utils/lcdf-typetools/t1reencode/t1reencode.1
new file mode 100644
index 00000000000..784a329a0e9
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/t1reencode.1
@@ -0,0 +1,149 @@
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1REENCODE 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1reencode \- reencode a PostScript Type 1 font
+.SH SYNOPSIS
+.B t1reencode
+\%\-e ENCODING
+\%[OPTIONS...]
+.I font
+.RI [ outputfile ]
+.SH DESCRIPTION
+.BR T1reencode
+changes a PostScript Type\~1 font's embedded encoding. The reencoded font
+is written to the standard output (but see the
+.B \-\-output
+option). If no input font file is supplied,
+.B t1reencode
+reads a PFA or PFB font from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-\-encoding "=\fIfile\fR, " \-e " \fIfile"
+Read the encoding from
+.IR file ,
+which must contain an encoding in
+.M dvips 1
+format. Alternatively,
+.I file
+can be one of "StandardEncoding", "ISOLatin1Encoding", "ExpertEncoding",
+"ExpertSubsetEncoding", or "SymbolEncoding", in which case the
+corresponding standard encoding is used.
+'
+.Sp
+.TP 5
+.BR \-\-encoding\-text "=\fItext\fR, " \-E " \fItext"
+Use the encoding in the
+.I text
+argument, which must be formatted as a
+.M dvips 1
+encoding. One of
+.B \-\-encoding
+and
+.B \-\-encoding\-text
+must be supplied.
+'
+.Sp
+.TP 5
+.BR \-\-name "=\fIname\fR, " \-n " \fIname"
+Set the output font's PostScript name to
+.IR name .
+The default is the input font name followed by the encoding's name.
+'
+.Sp
+.TP 5
+.BR \-\-full-name "=\fIname\fR, " \-N " \fIname"
+Set the output font's FullName to
+.IR name .
+The default is the input FullName followed by the encoding's name.
+'
+.Sp
+.TP 5
+.BR \-\-output "=\fIfile\fR, " \-o " \fIfile"
+Send output to
+.I file
+instead of standard output.
+'
+.Sp
+.TP 5
+.BR \-\-pfb ", " \-b
+Output a PFB font. This is the default.
+'
+.Sp
+.TP 5
+.BR \-\-pfa ", " \-a
+Output a PFA font.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "RETURN VALUES"
+.B T1reencode
+exits with value 0 if a reencoded font was successfully generated, and 1
+otherwise.
+'
+.SH "NOTES"
+.LP
+.B T1reencode
+should be used only in special situations. It's generally much better to
+use PostScript commands to reencode a font; for instance, executing the
+PostScript commands to generate two differently-encoded versions of a
+single font will take up much less memory than loading two
+.BR t1reencode d
+fonts.
+'
+.SH "EXAMPLES"
+.PP
+This command reencodes Frutiger Roman in the ISO Latin\~1 encoding. The new
+font will have the PostScript name Frutiger-RomanISOLatin1Encoding.
+.Sp
+.nf
+ \fBt1reencode\fR \fB\-e\fR ISOLatin1Encoding FrutiRom.pfb \e
+ \fB\-o\fR FrutiRomISOL1.pfb
+.fi
+.Sp
+This series of commands, which use
+.M cfftot1 1
+and
+.M otftotfm 1
+as well as
+.B t1reencode
+itself, generate a version of Warnock Pro Regular with old-style figures in
+the slots for numbers (because of
+.BR otftotfm 's
+.BR \-f onum
+option). The new font will be called WarnockPro-RegularOsF.
+.Sp
+.nf
+ \fBotftotfm\fR \fB\-f\fRonum WarnockPro-Regular.otf \e
+ \fB\-\-output\-encoding\fR /tmp/osf.enc
+ \fBcfftot1\fR WarnockPro-Regular.otf | \fBt1reencode\fR \fB\-e\fR /tmp/osf.enc \e
+ \fB\-n\fR WarnockPro-RegularOsF \fB\-N\fR "Warnock Pro Regular OsF" \e
+ \fB\-o\fR WarnoProRegOsF.pfb
+.fi
+'
+.SH "SEE ALSO"
+.LP
+.IR "Adobe Type 1 Font Format" ,
+.M dvips 1 ,
+.M cfftot1 1 ,
+.M otftotfm 1
+'
+.SH AUTHOR
+Eddie Kohler (kohler@cs.ucla.edu)
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/t1reencode.cc b/Build/source/utils/lcdf-typetools/t1reencode/t1reencode.cc
new file mode 100644
index 00000000000..142f61333e6
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/t1reencode.cc
@@ -0,0 +1,657 @@
+/* t1reencode.cc -- driver for reencoding Type 1 fonts
+ *
+ * Copyright (c) 2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/psres.hh>
+#include <lcdf/error.hh>
+#include <lcdf/clp.h>
+#include <ctype.h>
+#include <errno.h>
+#include "util.hh"
+#include "md5.h"
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#ifdef WIN32
+/* According to Fabrice Popineau MSVCC doesn't handle std::min correctly. */
+# define std /* */
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define ENCODING_OPT 304
+#define ENCODING_TEXT_OPT 305
+#define PFA_OPT 306
+#define PFB_OPT 307
+#define FONTNAME_OPT 308
+#define FULLNAME_OPT 309
+
+Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFA_OPT, 0, 0 },
+ { "name", 'n', FONTNAME_OPT, Clp_ArgString, 0 },
+ { "fullname", 'N', FULLNAME_OPT, Clp_ArgString, 0 },
+ { "full-name", 'N', FULLNAME_OPT, Clp_ArgString, 0 },
+ { "encoding", 'e', ENCODING_OPT, Clp_ArgString, 0 },
+ { "encoding-text", 'E', ENCODING_TEXT_OPT, Clp_ArgString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+static String::Initializer initializer2;
+static HashMap<PermString, int> glyph_order(-1);
+static String encoding_name;
+
+static const char ISOLatin1Encoding[] = "/ISOLatin1Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright\n\
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /quoteleft /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /dotlessi /grave /acute /circumflex /tilde /.notdef /breve /dotaccent\n\
+ /.notdef /.notdef /ring /.notdef /.notdef /hungarumlaut /ogonek /caron\n\
+ /.notdef /exclamdown /cent /sterling /currency /yen /brokenbar /section\n\
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron\n\
+ /degree /plusminus /twosuperior /threesuperior /.notdef /mu /paragraph /periodcentered\n\
+ /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /.notdef /Odieresis /multiply\n\
+ /Oslash /.notdef /.notdef /.notdef /.notdef /Yacute /Thorn /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /.notdef /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /eth /ntilde /.notdef /oacute /ocircumflex /otilde /odieresis /.notdef\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn\n\
+] def\n";
+
+static const char ExpertEncoding[] = "/ExpertEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclamsmall /Hungarumlautsmall /.notdef /dollaroldstyle /dollarsuperior /ampersandsmall /Acutesmall\n\
+ /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /comma /hyphen /period /fraction\n\
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle\n\
+ /eightoldstyle /nineoldstyle /colon /semicolon /commasuperior /threequartersemdash /periodsuperior /questionsmall\n\
+ /.notdef /asuperior /bsuperior /centsuperior /dsuperior /esuperior /.notdef /.notdef\n\
+ /.notdef /isuperior /.notdef /.notdef /lsuperior /msuperior /nsuperior /osuperior\n\
+ /.notdef /.notdef /rsuperior /ssuperior /tsuperior /.notdef /ff /fi\n\
+ /fl /ffi /ffl /parenleftinferior /.notdef /parenrightinferior /Circumflexsmall /hyphensuperior\n\
+ /Gravesmall /Asmall /Bsmall /Csmall /Dsmall /Esmall /Fsmall /Gsmall\n\
+ /Hsmall /Ismall /Jsmall /Ksmall /Lsmall /Msmall /Nsmall /Osmall\n\
+ /Psmall /Qsmall /Rsmall /Ssmall /Tsmall /Usmall /Vsmall /Wsmall\n\
+ /Xsmall /Ysmall /Zsmall /colonmonetary /onefitted /rupiah /Tildesmall /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /exclamdownsmall /centoldstyle /Lslashsmall /.notdef /.notdef /Scaronsmall /Zcaronsmall\n\
+ /Dieresissmall /Brevesmall /Caronsmall /.notdef /Dotaccentsmall /.notdef /.notdef /Macronsmall\n\
+ /.notdef /.notdef /figuredash /hypheninferior /.notdef /.notdef /Ogoneksmall /Ringsmall\n\
+ /Cedillasmall /.notdef /.notdef /.notdef /onequarter /onehalf /threequarters /questiondownsmall\n\
+ /oneeighth /threeeighths /fiveeighths /seveneighths /onethird /twothirds /.notdef /.notdef\n\
+ /zerosuperior /onesuperior /twosuperior /threesuperior /foursuperior /fivesuperior /sixsuperior /sevensuperior\n\
+ /eightsuperior /ninesuperior /zeroinferior /oneinferior /twoinferior /threeinferior /fourinferior /fiveinferior\n\
+ /sixinferior /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior /periodinferior /commainferior\n\
+ /Agravesmall /Aacutesmall /Acircumflexsmall /Atildesmall /Adieresissmall /Aringsmall /AEsmall /Ccedillasmall\n\
+ /Egravesmall /Eacutesmall /Ecircumflexsmall /Edieresissmall /Igravesmall /Iacutesmall /Icircumflexsmall /Idieresissmall\n\
+ /Ethsmall /Ntildesmall /Ogravesmall /Oacutesmall /Ocircumflexsmall /Otildesmall /Odieresissmall /OEsmall\n\
+ /Oslashsmall /Ugravesmall /Uacutesmall /Ucircumflexsmall /Udieresissmall /Yacutesmall /Thornsmall\n\
+] def\n";
+
+static const char ExpertSubsetEncoding[] = "/ExpertSubsetEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /.notdef /.notdef /.notdef /dollaroldstyle /dollarsuperior /.notdef /.notdef\n\
+ /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /comma /hyphen /period /fraction\n\
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle\n\
+ /eightoldstyle /nineoldstyle /colon /semicolon /commasuperior /threequartersemdash /periodsuperior /.notdef\n\
+ /.notdef /asuperior /bsuperior /centsuperior /dsuperior /esuperior /.notdef /.notdef\n\
+ /.notdef /isuperior /.notdef /.notdef /lsuperior /msuperior /nsuperior /osuperior\n\
+ /.notdef /.notdef /rsuperior /ssuperior /tsuperior /.notdef /ff /fi\n\
+ /fl /ffi /ffl /parenleftinferior /.notdef /parenrightinferior /.notdef /hyphensuperior\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /colonmonetary /onefitted /rupiah /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /centoldstyle /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /figuredash /hypheninferior /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /onequarter /onehalf /threequarters /.notdef\n\
+ /oneeighth /threeeighths /fiveeighths /seveneighths /onethird /twothirds /.notdef /.notdef\n\
+ /zerosuperior /onesuperior /twosuperior /threesuperior /foursuperior /fivesuperior /sixsuperior /sevensuperior\n\
+ /eightsuperior /ninesuperior /zeroinferior /oneinferior /twoinferior /threeinferior /fourinferior /fiveinferior\n\
+ /sixinferior /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior /periodinferior /commainferior\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+] def\n";
+
+static const char SymbolEncoding[] = "/SymbolEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /universal /numbersign /existential /percent /ampersand /suchthat\n\
+ /parenleft /parenright /asteriskmath /plus /comma /minus /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /congruent /Alpha /Beta /Chi /Delta /Epsilon /Phi /Gamma\n\
+ /Eta /Iota /theta1 /Kappa /Lambda /Mu /Nu /Omicron\n\
+ /Pi /Theta /Rho /Sigma /Tau /Upsilon /sigma1 /Omega\n\
+ /Xi /Psi /Zeta /bracketleft /therefore /bracketright /perpendicular /underscore\n\
+ /radicalex /alpha /beta /chi /delta /epsilon /phi /gamma\n\
+ /eta /iota /phi1 /kappa /lambda /mu /nu /omicron\n\
+ /pi /theta /rho /sigma /tau /upsilon /omega1 /omega\n\
+ /xi /psi /zeta /braceleft /bar /braceright /similar /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /Upsilon1 /minute /lessequal /fraction /infinity /florin /club\n\
+ /diamond /heart /spade /arrowboth /arrowleft /arrowup /arrowright /arrowdown\n\
+ /degree /plusminus /second /greaterequal /multiply /proportional /partialdiff /bullet\n\
+ /divide /notequal /equivalence /approxequal /ellipsis /arrowvertex /arrowhorizex /carriagereturn\n\
+ /aleph /Ifraktur /Rfraktur /weierstrass /circlemultiply /circleplus /emptyset /intersection\n\
+ /union /propersuperset /reflexsuperset /notsubset /propersubset /reflexsubset /element /notelement\n\
+ /angle /gradient /registerserif /copyrightserif /trademarkserif /product /radical /dotmath\n\
+ /logicalnot /logicaland /logicalor /arrowdblboth /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown\n\
+ /lozenge /angleleft /registersans /copyrightsans /trademarksans /summation /parenlefttp /parenleftex\n\
+ /parenleftbt /bracketlefttp /bracketleftex /bracketleftbt /bracelefttp /braceleftmid /braceleftbt /braceex\n\
+ /.notdef /angleright /integral /integraltp /integralex /integralbt /parenrighttp /parenrightex\n\
+ /parenrightbt /bracketrighttp /bracketrightex /bracketrightbt /bracerighttp /bracerightmid /bracerightbt\n\
+] def\n";
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'T1reencode' changes a Type 1 font's embedded encoding and writes the\n\
+reencoded font to the standard output.\n\
+\n\
+Usage: %s [OPTION]... [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -e, --encoding=FILE Read the encoding from FILE (in DVIPS format).\n\
+ -E, --encoding-text=ENC The ENC argument is the encoding text.\n\
+ -n, --name=NAME Set output font's PostScript name.\n\
+ -N, --full-name=NAME Set output font's full name.\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -o, --output=FILE Write output to FILE instead of standard out.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+// FONT MANIPULATION
+
+static void
+kill_def(Type1Font* font, Type1Definition *t1d, int whichd)
+{
+ if (!t1d || font->dict(whichd, t1d->name()) != t1d)
+ return;
+
+ int icount = font->nitems();
+ for (int i = font->first_dict_item(whichd); i < icount; i++)
+ if (font->item(i) == t1d) {
+ StringAccum sa;
+ sa << '%';
+ t1d->gen(sa);
+ PermString name = t1d->name();
+ Type1CopyItem *t1ci = new Type1CopyItem(sa.take_string());
+ font->set_item(i, t1ci);
+ font->set_dict(whichd, name, 0);
+ return;
+ }
+
+ assert(0);
+}
+
+static void
+adjust_font_definitions(Type1Font* font, Type1Encoding* encoding, String new_name, String new_full_name)
+{
+ // prepare an MD5 digest over the encoding
+ StringAccum etext;
+ for (int i = 0; i < 256; i++)
+ etext << encoding->elt(i) << ' ';
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char*) etext.data(), etext.length() - 1);
+
+ // save UniqueID, then kill its definition
+ int uniqueid;
+ Type1Definition *t1d = font->dict("UniqueID");
+ bool have_uniqueid = (t1d && t1d->value_int(uniqueid));
+ kill_def(font, t1d, Type1Font::dFont);
+ kill_def(font, font->p_dict("UniqueID"), Type1Font::dPrivate);
+
+ // prepare XUID
+ t1d = font->dict("XUID");
+ Vector<double> xuid;
+ if (!t1d || !t1d->value_numvec(xuid)) {
+ if (have_uniqueid) {
+ t1d = font->ensure(Type1Font::dFont, "XUID");
+ xuid.clear();
+ xuid.push_back(1);
+ xuid.push_back(uniqueid);
+ } else if (t1d) {
+ kill_def(font, t1d, Type1Font::dFont);
+ t1d = 0;
+ }
+ }
+ if (t1d) {
+ uint8_t digest[MD5_DIGEST_SIZE + 2]; // leave 2 bytes of space
+ md5_final((unsigned char *) digest, &md5);
+ digest[MD5_DIGEST_SIZE] = digest[MD5_DIGEST_SIZE + 1] = 0;
+
+ // append digest to XUID; each element must be less than 2^24
+ for (int i = 0; i < MD5_DIGEST_SIZE; i += 3)
+ xuid.push_back((digest[i] << 16) | (digest[i+1] << 8) | digest[i+2]);
+ t1d->set_numvec(xuid);
+ }
+
+ // prepare new font name
+ if (!encoding_name) {
+ char text_digest[MD5_TEXT_DIGEST_SIZE + 1];
+ md5_final_text(text_digest, &md5);
+ encoding_name = "AutoEnc_" + String(text_digest);
+ }
+
+ t1d = font->dict("FontName");
+ PermString name;
+ if (t1d && t1d->value_name(name)) {
+ if (!new_name)
+ new_name = name + encoding_name;
+ t1d->set_name(new_name.c_str());
+ font->uncache_defs(); // remove cached font name
+ }
+
+ // add a FullName too
+ String full_name;
+ t1d = font->fi_dict("FullName");
+ if (t1d && t1d->value_string(full_name)) {
+ if (!new_full_name)
+ new_full_name = full_name + "_" + encoding_name + " Enc";
+ t1d->set_string(new_full_name.c_str());
+ }
+
+ // add header comments
+ {
+ StringAccum sa;
+#if HAVE_CTIME
+ time_t cur_time = time(0);
+ char *time_str = ctime(&cur_time);
+ sa << "%% Created by t1reencode-" VERSION " on " << time_str;
+ sa.pop_back();
+#else
+ sa << "%% Created by t1reencode-" VERSION ".";
+#endif
+
+ font->add_header_comment(sa.take_string().c_str());
+ font->add_header_comment("%% T1reencode is free software. See <http://www.lcdf.org/type/>.");
+ }
+}
+
+
+// ENCODING READER
+
+static String
+tokenize(const String &s, int &pos_in, int &line)
+{
+ const char *data = s.data();
+ int len = s.length();
+ int pos = pos_in;
+ while (1) {
+ // skip whitespace
+ while (pos < len && isspace(data[pos])) {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ } else if (data[pos] == '[' || data[pos] == ']' || data[pos] == '{' || data[pos] == '}') {
+ pos_in = pos + 1;
+ return s.substring(pos, 1);
+ } else if (data[pos] == '(') {
+ int first = pos, nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ pos_in = (pos < len ? pos + 1 : len);
+ return s.substring(first, pos_in - first);
+ } else {
+ int first = pos;
+ while (pos < len && data[pos] == '/')
+ pos++;
+ while (pos < len && data[pos] != '/' && !isspace(data[pos]) && data[pos] != '[' && data[pos] != ']' && data[pos] != '%' && data[pos] != '(' && data[pos] != '{' && data[pos] != '}')
+ pos++;
+ pos_in = pos;
+ return s.substring(first, pos - first);
+ }
+ }
+}
+
+static String
+landmark(const String &filename, int line)
+{
+ return filename + String::stable_string(":", 1) + String(line);
+}
+
+Type1Encoding *
+parse_encoding(String s, String filename, ErrorHandler *errh)
+{
+ filename = printable_filename(filename);
+ int pos = 0, line = 1;
+
+ // parse text
+ String token = tokenize(s, pos, line);
+ if (!token || token[0] != '/') {
+ errh->lerror(landmark(filename, line), "parse error, expected name");
+ return 0;
+ }
+ encoding_name = token.substring(1);
+
+ if (tokenize(s, pos, line) != "[") {
+ errh->lerror(landmark(filename, line), "parse error, expected [");
+ return 0;
+ }
+
+ Type1Encoding *t1e = new Type1Encoding;
+ int e = 0;
+ while ((token = tokenize(s, pos, line)) && token[0] == '/') {
+ if (e > 255) {
+ errh->lwarning(landmark(filename, line), "more than 256 characters in encoding");
+ break;
+ }
+ t1e->put(e, token.substring(1));
+ e++;
+ }
+ return t1e;
+}
+
+
+
+// MAIN
+
+/*****
+ * MAIN PROGRAM
+ **/
+
+static Type1Font *
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+ if (!font->ok())
+ errh->fatal("%s: no glyphs in font", filename);
+
+ delete reader;
+ return font;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *input_file = 0;
+ const char *output_file = 0;
+ const char *encoding_file = 0;
+ const char *encoding_text = 0;
+ const char *new_font_name = 0;
+ const char *new_full_name = 0;
+ bool binary = true;
+ Vector<String> glyph_patterns;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case ENCODING_OPT:
+ if (encoding_file || encoding_text)
+ errh->fatal("encoding already specified");
+ encoding_file = clp->arg;
+ break;
+
+ case ENCODING_TEXT_OPT:
+ if (encoding_file || encoding_text)
+ errh->fatal("encoding already specified");
+ encoding_text = clp->arg;
+ break;
+
+ case FONTNAME_OPT:
+ if (new_font_name)
+ errh->fatal("font name already specified");
+ new_font_name = clp->arg;
+ break;
+
+ case FULLNAME_OPT:
+ if (new_full_name)
+ errh->fatal("full name already specified");
+ new_full_name = clp->arg;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->arg;
+ break;
+
+ case PFA_OPT:
+ binary = false;
+ break;
+
+ case PFB_OPT:
+ binary = true;
+ break;
+
+ case VERSION_OPT:
+ printf("t1reencode (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2005 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && output_file)
+ errh->fatal("too many arguments");
+ else if (input_file)
+ output_file = clp->arg;
+ else
+ input_file = clp->arg;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ // read the font
+ Type1Font *font = do_file(input_file, psres, errh);
+ if (!input_file || strcmp(input_file, "-") == 0)
+ input_file = "<stdin>";
+
+ // read the encoding
+ if (!encoding_file && !encoding_text)
+ errh->fatal("missing '-e ENCODING' argument");
+ Type1Encoding *t1e = 0;
+ if (encoding_file == "StandardEncoding") {
+ t1e = Type1Encoding::standard_encoding();
+ encoding_name = encoding_file;
+ } else {
+ String text;
+ if (encoding_file == "ISOLatin1Encoding")
+ text = String::stable_string(ISOLatin1Encoding);
+ else if (encoding_file == "ExpertEncoding")
+ text = String::stable_string(ExpertEncoding);
+ else if (encoding_file == "ExpertSubsetEncoding")
+ text = String::stable_string(ExpertSubsetEncoding);
+ else if (encoding_file == "SymbolEncoding")
+ text = String::stable_string(SymbolEncoding);
+ else if (encoding_text)
+ text = String::stable_string(encoding_text), encoding_file = "<argument>";
+ else if ((text = read_file(encoding_file, errh)), errh->nerrors() > 0)
+ exit(1);
+ if (!(t1e = parse_encoding(text, encoding_file, errh)))
+ exit(1);
+ }
+
+ // set the encoding
+ font->add_type1_encoding(t1e);
+
+ // adjust definitions
+ adjust_font_definitions(font, t1e, new_font_name, new_full_name);
+
+ // write it to output
+ FILE *outf;
+ if (!output_file || strcmp(output_file, "-") == 0)
+ outf = stdout;
+ else {
+ outf = fopen(output_file, "w");
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
+ if (binary) {
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+ Type1PFBWriter w(outf);
+ font->write(w);
+ } else {
+ Type1PFAWriter w(outf);
+ font->write(w);
+ }
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/util.cc b/Build/source/utils/lcdf-typetools/t1reencode/util.cc
new file mode 100644
index 00000000000..70d12ad92a2
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/util.cc
@@ -0,0 +1,77 @@
+/* util.{cc,hh} -- various bits
+ *
+ * Copyright (c) 2003-2005 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "util.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <lcdf/vector.hh>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning)
+{
+ FILE *f;
+ if (!filename || filename == "-") {
+ filename = "<stdin>";
+ f = stdin;
+#if defined(_MSDOS) || defined(_WIN32)
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(filename.c_str(), "rb"))) {
+ errh->verror_text((warning ? errh->ERR_WARNING : errh->ERR_ERROR), filename, strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ while (!feof(f)) {
+ if (char *x = sa.reserve(8192)) {
+ int amt = fread(x, 1, 8192, f);
+ sa.forward(amt);
+ } else {
+ errh->verror_text((warning ? errh->ERR_WARNING : errh->ERR_ERROR), filename, "Out of memory!");
+ break;
+ }
+ }
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::stable_string("<stdin>");
+ else
+ return s;
+}
+
+String
+pathname_filename(const String &path)
+{
+ int slash = path.find_right('/');
+ if (slash >= 0 && slash != path.length() - 1)
+ return path.substring(slash + 1);
+ else
+ return path;
+}
diff --git a/Build/source/utils/lcdf-typetools/t1reencode/util.hh b/Build/source/utils/lcdf-typetools/t1reencode/util.hh
new file mode 100644
index 00000000000..34b9c9c5a22
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1reencode/util.hh
@@ -0,0 +1,10 @@
+#ifndef T1REENCODE_UTIL_HH
+#define T1REENCODE_UTIL_HH
+#include <lcdf/string.hh>
+class ErrorHandler;
+
+String read_file(String filename, ErrorHandler *, bool warn = false);
+String printable_filename(const String &);
+String pathname_filename(const String &);
+
+#endif
diff --git a/Build/source/utils/lcdf-typetools/t1testpage/Makefile.am b/Build/source/utils/lcdf-typetools/t1testpage/Makefile.am
new file mode 100644
index 00000000000..251c3ff697e
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1testpage/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1testpage
+man_MANS = t1testpage.1
+
+t1testpage_SOURCES = t1testpage.cc
+
+t1testpage_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1testpage.1
diff --git a/Build/source/utils/lcdf-typetools/t1testpage/Makefile.in b/Build/source/utils/lcdf-typetools/t1testpage/Makefile.in
new file mode 100644
index 00000000000..0622da867c7
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1testpage/Makefile.in
@@ -0,0 +1,467 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(t1testpage_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = t1testpage$(EXEEXT)
+subdir = t1testpage
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_t1testpage_OBJECTS = t1testpage.$(OBJEXT)
+t1testpage_OBJECTS = $(am_t1testpage_OBJECTS)
+t1testpage_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+SOURCES = $(t1testpage_SOURCES)
+DIST_SOURCES = $(t1testpage_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FIXLIBC_O = @FIXLIBC_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPSEINTERFACE_O = @KPSEINTERFACE_O@
+LDFLAGS = @LDFLAGS@
+LIBKPATHSEA = @LIBKPATHSEA@
+LIBKPATHSEA_DEP = @LIBKPATHSEA_DEP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1testpage.1
+t1testpage_SOURCES = t1testpage.cc
+t1testpage_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(top_srcdir)/include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1testpage.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign t1testpage/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign t1testpage/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+t1testpage$(EXEEXT): $(t1testpage_OBJECTS) $(t1testpage_DEPENDENCIES)
+ @rm -f t1testpage$(EXEEXT)
+ $(CXXLINK) $(t1testpage_LDFLAGS) $(t1testpage_OBJECTS) $(t1testpage_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1testpage.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/lcdf-typetools/t1testpage/t1testpage.1 b/Build/source/utils/lcdf-typetools/t1testpage/t1testpage.1
new file mode 100644
index 00000000000..87816fe364f
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1testpage/t1testpage.1
@@ -0,0 +1,62 @@
+.ds V 2.34
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1TESTPAGE 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1testpage \- create a PostScript proof for a Type 1 font
+.SH SYNOPSIS
+.B t1testpage
+\%[\fIfont\fR]
+.SH DESCRIPTION
+.BR T1testpage
+creates a PostScript proof document for the specified Type 1 font file and
+writes it to the standard output. The proof shows every glyph in the
+font, including its glyph name and encoding. The
+.I font
+argument should be the name of a PFA or PFB font file. If it is omitted,
+t1testpage will read a font file from the standard input.
+.PP
+T1testpage is preliminary software.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-g " \fIglyphs\fR, " \-\-glyph= \fIglyphs
+Print only glyphs matching
+.IR glyphs .
+The argument is a glyph pattern, using shell-like matching rules; thus,
+.BR "\-g " 'A*'
+will match the glyphs 'A', 'Atilde', and 'Ampersand', among others. You
+can give this option multiple times, or supply multiple space-separated
+patterns in a single option.
+'
+.Sp
+.TP 5
+.BR \-s ", " \-\-smoke
+Print smoke proofs, one glyph per page. This option is preliminary.
+'
+.Sp
+.TP 5
+.BR \-o " \fIfile\fR, " \-\-output= \fIfile
+Write the output proof to
+.I file
+instead of the standard output.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH AUTHOR
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/lcdf-typetools/t1testpage/t1testpage.cc b/Build/source/utils/lcdf-typetools/t1testpage/t1testpage.cc
new file mode 100644
index 00000000000..ec8facc6379
--- /dev/null
+++ b/Build/source/utils/lcdf-typetools/t1testpage/t1testpage.cc
@@ -0,0 +1,664 @@
+/* t1testpage.cc -- driver for generating Type 1 fonts' test pages
+ *
+ * Copyright (c) 1999-2004 Eddie Kohler
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1mm.hh>
+#include <efont/t1interp.hh>
+#include <efont/t1bounds.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/globmatch.hh>
+#include <lcdf/transform.hh>
+#include <algorithm>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#ifdef WIN32
+/* According to Fabrice Popineau MSVCC doesn't handle std::min correctly. */
+# define std /* */
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define GLYPH_OPT 304
+#define SMOKE_OPT 305
+
+Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+ { "glyph", 'g', GLYPH_OPT, Clp_ArgString, 0 },
+ { "smoke", 's', SMOKE_OPT, 0, Clp_Negate }
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+static HashMap<PermString, int> glyph_order(-1);
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->verror(ErrorHandler::ERR_ERROR, String(), error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ printf("\
+'T1testpage' creates a PostScript proof document for the specified Type 1\n\
+font file and writes it to the standard output. The proof shows every\n\
+glyph in the font, including its glyph name and encoding.\n\
+\n\
+Usage: %s [OPTION]... [FONT]\n\
+\n\
+FONT is the name of a PFA or PFB font file. If omitted, t1testpage will read\n\
+a font file from the standard input.\n\
+\n\
+Options:\n\
+ -g, --glyph=GLYPH Limit output to one or more GLYPHs.\n\
+ -s, --smoke Print smoke proofs, one character per page.\n\
+ -o, --output=FILE Write output to FILE instead of standard out.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <kohler@cs.ucla.edu>.\n", program_name);
+}
+
+
+// MAIN
+
+static Type1Font *font;
+
+static void
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ font = new Type1Font(*reader);
+
+ delete reader;
+}
+
+
+static void
+output_testpage(FILE* outf, Type1Font* font, const Vector<PermString>& glyph_names)
+{
+ fprintf(outf, "%%!PS-Adobe-3.0\n%%%%LanguageLevel: 2\n%%%%BeginProlog\n");
+ fprintf(outf, "/magicstr 1 string def\n\
+/magicbox { %% row col char name encoding magicbox -\n\
+ 5 3 roll 54 mul 36 add exch 54 mul neg 702 add moveto currentpoint\n\
+ .8 setgray 54 0 rlineto 0 54 rlineto -54 0 rlineto closepath stroke\n\
+ 0 setgray moveto\n\
+ gsave /Helvetica 7 selectfont 3 1.5 rmoveto show grestore\n\
+ gsave /Helvetica 7 selectfont 3 45.5 rmoveto show grestore\n\
+ magicstr 0 3 -1 roll put\n\
+ magicstr stringwidth pop 54 sub -2 div 16 rmoveto magicstr show\n\
+} bind def\n");
+ Type1PFAWriter w(outf);
+ font->write(w);
+ fprintf(outf, "%%%%EndProlog\n");
+
+ HashMap<PermString, int> encodings(-1);
+ if (Type1Encoding *encoding = font->type1_encoding())
+ for (int i = 255; i >= 0; i--)
+ encodings.insert(encoding->elt(i), i);
+
+ int per_row = 10;
+ int nrows = 13;
+ int per_page = nrows * per_row;
+
+ int page = 0;
+ for (int gi = 0; gi < glyph_names.size(); gi++) {
+
+ if (gi % per_page == 0) {
+ if (page)
+ fprintf(outf, "showpage restore\n");
+ page++;
+ fprintf(outf, "%%%%Page: %d %d\nsave\n", page, page);
+ // make new font
+ fprintf(outf, "/%s findfont dup length dict begin\n\
+ { 1 index /FID ne {def} {pop pop} ifelse } forall\n /Encoding [",
+ font->font_name().c_str());
+ for (int i = gi; i < gi + per_page && i < glyph_names.size(); i++) {
+ fprintf(outf, " /%s", glyph_names[i].c_str());
+ if (i % 10 == 9) fprintf(outf, "\n");
+ }
+ fprintf(outf, " ] def\n currentdict end /X exch definefont pop\n\
+/X 24 selectfont\n");
+ }
+
+ int row = (gi % per_page) / per_row;
+ int col = gi % per_row;
+
+ fprintf(outf, "%d %d %d (%s)", row, col, gi % per_page, glyph_names[gi].c_str());
+ if (encodings[glyph_names[gi]] >= 0) {
+ int e = encodings[glyph_names[gi]];
+ if (e == '\\')
+ fprintf(outf, " ('\\\\\\\\')");
+ else if (e == '\'')
+ fprintf(outf, " ('\\\\'')");
+ else if (e == '(' || e == ')')
+ fprintf(outf, " ('\\%c')", e);
+ else if (e >= 32 && e < 127)
+ fprintf(outf, " ('%c')", e);
+ else
+ fprintf(outf, " ('\\\\%03o')", e);
+ } else
+ fprintf(outf, " ()");
+ fprintf(outf, " magicbox\n");
+ }
+
+ if (page)
+ fprintf(outf, "showpage restore\n");
+ fprintf(outf, "%%%%EOF\n");
+ fclose(outf);
+}
+
+
+/*****
+ * SMOKE PROOFS
+ **/
+
+inline StringAccum&
+operator<<(StringAccum& sa, const Point& p)
+{
+ return sa << p.x << ' ' << p.y;
+}
+
+class Smoker : public CharstringInterp { public:
+
+ Smoker(const Transform&);
+
+ void act_line(int, const Point &, const Point &);
+ void act_curve(int, const Point &, const Point &, const Point &, const Point &);
+ void act_closepath(int);
+
+ String char_postscript() { return _char_sa.take_string(); }
+ String points_postscript() { return _points_sa.take_string(); }
+
+ bool run(const CharstringContext&);
+
+ private:
+
+ Transform _xform;
+ StringAccum _char_sa;
+ StringAccum _points_sa;
+ Point _char_cp;
+
+ inline void maybe_move(const Point&);
+
+};
+
+Smoker::Smoker(const Transform& xform)
+ : _xform(xform)
+{
+}
+
+void
+Smoker::maybe_move(const Point& p)
+{
+ if (_char_cp.x < -100000 || _char_cp != p) {
+ _char_sa << (p * _xform) << " moveto\n";
+ _points_sa << (p * _xform) << " pA\n";
+ }
+}
+
+void
+Smoker::act_line(int cmd, const Point& p0, const Point& p1)
+{
+ Point xp1 = p1 * _xform;
+
+ maybe_move(p0);
+ _char_sa << xp1 << " lineto\n";
+ if (cmd == Charstring::cRlineto
+ || cmd == Charstring::cHlineto
+ || cmd == Charstring::cVlineto)
+ _points_sa << xp1 << " pA\n";
+ _char_cp = p1;
+}
+
+void
+Smoker::act_curve(int, const Point &p0, const Point &p1, const Point &p2, const Point &p3)
+{
+ Point xp1 = p1 * _xform;
+ Point xp2 = p2 * _xform;
+ Point xp3 = p3 * _xform;
+
+ maybe_move(p0);
+ _char_sa << xp1 << ' ' << xp2 << ' ' << xp3 << " curveto\n";
+ _points_sa << xp1 << " pC " << xp2 << " pC " << xp3 << " pA\n";
+ _char_cp = p3;
+}
+
+void
+Smoker::act_closepath(int)
+{
+ _char_sa << "closepath\n";
+}
+
+bool
+Smoker::run(const CharstringContext& g)
+{
+ _char_sa.clear();
+ _points_sa.clear();
+ _char_cp.x = -200000;
+ return CharstringInterp::interpret(g);
+}
+
+#define LEFT_BOUND 72.
+#define RIGHT_BOUND (7.5 * 72)
+#define BOTTOM_BOUND 72.
+#define TOP_BOUND (7.5 * 72)
+
+static Transform
+bounds2xform(CharstringBounds& bounds, bool expand = false)
+{
+ if (expand) {
+ Point vec = bounds.bb_top_right() - bounds.bb_bottom_left();
+ bounds.act_line(0, bounds.bb_bottom_left() - 0.1 * vec, bounds.bb_top_right() + 0.1 * vec);
+ }
+ bounds.act_line(0, Point(0, 0), bounds.width());
+ bounds.act_line(0, Point(0, 0), Point(1, 1));
+
+ double true_width = std::max(bounds.bb_right(), 0.) - std::min(bounds.bb_left(), 0.);
+ double true_height = std::max(bounds.bb_top(), 0.) - std::min(bounds.bb_bottom(), 0.);
+ double x_scale = (RIGHT_BOUND - LEFT_BOUND) / true_width;
+ double y_scale = (TOP_BOUND - BOTTOM_BOUND) / true_height;
+ double scale = std::min(x_scale, y_scale);
+ double origin_x = LEFT_BOUND;
+ if (bounds.bb_left() < 0)
+ origin_x += -bounds.bb_left() * scale;
+ double origin_y = BOTTOM_BOUND;
+ if (bounds.bb_bottom() < 0)
+ origin_y += -bounds.bb_bottom() * scale;
+ return Transform(scale, 0, 0, scale, origin_x, origin_y);
+}
+
+static const char* const bounds_glyphs[] = {
+ "A", "Eacute", "Ecircumflex", "l", "g", "p", "q", "j", "J", "emdash", 0
+};
+
+static void
+output_smoke(FILE* outf, Type1Font* font, const Vector<PermString>& glyph_names)
+{
+ fprintf(outf, "%%!PS-Adobe-3.0\n%%%%LanguageLevel: 2\n%%%%BeginProlog\n");
+ fprintf(outf, "/pA { %% x y pA -\n\
+ moveto\n\
+ -2 -2 rmoveto 4 0 rlineto 0 4 rlineto -4 0 rlineto closepath\n\
+ gsave 1 setgray stroke grestore 0 setgray fill\n\
+} bind def\n\
+/pC { %% x y pC -\n\
+ 2 copy moveto 2 0 rmoveto 2 0 360 arc\n\
+ gsave 1 setgray stroke grestore 0.1 setgray fill\n\
+} bind def\n\
+");
+ //Type1PFAWriter w(outf);
+ //font->write(w);
+ fprintf(outf, "%%%%EndProlog\n");
+
+ HashMap<PermString, int> encodings(-1);
+ if (Type1Encoding *encoding = font->type1_encoding())
+ for (int i = 255; i >= 0; i--)
+ encodings.insert(encoding->elt(i), i);
+
+ // First, calculate font bounds, and from there, the transform.
+ CharstringBounds bounds;
+ for (const char* const* bg = bounds_glyphs; *bg; bg++)
+ if (CharstringContext cc = font->glyph_context(*bg))
+ bounds.char_bounds(cc, false);
+ if (bounds.bb_left() == bounds.bb_right())
+ for (int gi = 0; gi < glyph_names.size(); gi++)
+ bounds.char_bounds(font->glyph_context(glyph_names[gi]), false);
+ Transform font_xform = bounds2xform(bounds, true);
+
+ for (int gi = 0; gi < glyph_names.size(); gi++) {
+ fprintf(outf, "%%%%Page: %d %d\nsave\n", gi + 1, gi + 1);
+
+ CharstringContext cc = font->glyph_context(glyph_names[gi]);
+ bounds.clear();
+ bounds.char_bounds(cc, false);
+
+ Transform xform(font_xform);
+ if (bounds.bb_known()) {
+ Point lb = bounds.bb_bottom_left() * xform;
+ Point rt = bounds.bb_top_right() * xform;
+ Point wd = bounds.width() * xform;
+ if (lb.x < LEFT_BOUND || lb.y < BOTTOM_BOUND
+ || rt.x > RIGHT_BOUND || rt.y > TOP_BOUND
+ || wd.x < LEFT_BOUND || wd.x > RIGHT_BOUND
+ || wd.y < BOTTOM_BOUND || wd.y > TOP_BOUND)
+ xform = bounds2xform(bounds);
+ }
+
+ Smoker smoker(xform);
+ smoker.run(font->glyph_context(glyph_names[gi]));
+ fprintf(outf, "%g %g moveto 0 %g rlineto %g %g moveto 0 %g rlineto %g %g moveto %g 0 rlineto 0 setgray stroke\n",
+ (Point(0, 0) * xform).x, BOTTOM_BOUND - 36, TOP_BOUND - BOTTOM_BOUND + 72,
+ (bounds.width() * xform).x, BOTTOM_BOUND - 36, TOP_BOUND - BOTTOM_BOUND + 72,
+ LEFT_BOUND - 36, (Point(0, 0) * xform).y, RIGHT_BOUND - LEFT_BOUND + 72);
+
+ fprintf(outf, "%s\n0.5 setgray fill\n\n1 setlinewidth\n%s\nshowpage\nrestore\n", smoker.char_postscript().c_str(), smoker.points_postscript().c_str());
+ }
+
+ fprintf(outf, "%%%%EOF\n");
+ fclose(outf);
+}
+
+
+/*****
+ * MAIN PROGRAM
+ **/
+
+int
+click_strcmp(PermString a, PermString b)
+{
+ const char *ad = a.c_str(), *ae = a.c_str() + a.length();
+ const char *bd = b.c_str(), *be = b.c_str() + b.length();
+
+ while (ad < ae && bd < be) {
+ if (isdigit(*ad) && isdigit(*bd)) {
+ // compare the two numbers, but don't treat them as numbers in
+ // case of overflow
+ // first, skip initial '0's
+ const char *iad = ad, *ibd = bd;
+ while (ad < ae && *ad == '0')
+ ad++;
+ while (bd < be && *bd == '0')
+ bd++;
+ int longer_zeros = (ad - iad) - (bd - ibd);
+ // skip to end of number
+ const char *nad = ad, *nbd = bd;
+ while (ad < ae && isdigit(*ad))
+ ad++;
+ while (bd < be && isdigit(*bd))
+ bd++;
+ // longer number must be larger
+ if ((ad - nad) != (bd - nbd))
+ return (ad - nad) - (bd - nbd);
+ // otherwise, compare numbers with the same length
+ for (; nad < ad && nbd < bd; nad++, nbd++)
+ if (*nad != *nbd)
+ return *nad - *nbd;
+ // finally, longer string of initial '0's wins
+ if (longer_zeros != 0)
+ return longer_zeros;
+ } else if (isdigit(*ad))
+ return (isalpha(*bd) ? -1 : 1);
+ else if (isdigit(*bd))
+ return (isalpha(*ad) ? 1 : -1);
+ else {
+ int d = tolower(*ad) - tolower(*bd);
+ if (d != 0)
+ return d;
+ ad++;
+ bd++;
+ }
+ }
+
+ if ((ae - ad) != (be - bd))
+ return (ae - ad) - (be - bd);
+ else {
+ assert(a.length() == b.length());
+ return memcmp(a.c_str(), b.c_str(), a.length());
+ }
+}
+
+extern "C" {
+static int CDECL
+glyphcompare(const void *lv, const void *rv)
+{
+ const PermString* ln = (const PermString*)lv;
+ const PermString* rn = (const PermString*)rv;
+
+ // try first without the '.'s
+ const char* ldot = strchr(ln->c_str(), '.');
+ const char* rdot = strchr(rn->c_str(), '.');
+ if (ldot == ln->begin())
+ ldot = 0;
+ if (rdot == rn->begin())
+ rdot = 0;
+ if (ldot || rdot) {
+ PermString l(ln->begin(), ldot ? ldot : ln->end());
+ PermString r(rn->begin(), rdot ? rdot : rn->end());
+ int diff = glyphcompare(&l, &r);
+ if (diff != 0)
+ return diff;
+ }
+
+ int lorder = glyph_order[*ln];
+ int rorder = glyph_order[*rn];
+ if (lorder >= 0 && rorder >= 0)
+ return lorder - rorder;
+ else if (lorder >= 0)
+ return -1;
+ else if (rorder >= 0)
+ return 1;
+ else
+ return click_strcmp(*ln, *rn);
+}
+}
+
+static bool
+glyph_matches(const String& glyph_name, const String* pattern_begin, const String* pattern_end)
+{
+ if (pattern_begin >= pattern_end)
+ return true;
+ for (; pattern_begin < pattern_end; pattern_begin++)
+ if (glob_match(glyph_name, *pattern_begin))
+ return true;
+ return false;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *output_file = 0;
+ Vector<String> glyph_patterns;
+ bool smoke = false;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case GLYPH_OPT: {
+ const char* s = clp->arg, *end = s + strlen(s);
+ while (s < end) {
+ while (s < end && isspace(*s))
+ s++;
+ const char* word = s;
+ while (s < end && !isspace(*s))
+ s++;
+ if (word < s)
+ glyph_patterns.push_back(String(word, s - word));
+ }
+ break;
+ }
+
+ case SMOKE_OPT:
+ smoke = !clp->negated;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->arg;
+ break;
+
+ case VERSION_OPT:
+ printf("t1testpage (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2004 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (font)
+ errh->fatal("font already specified");
+ do_file(clp->arg, psres, errh);
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (!font)
+ do_file(0, psres, errh);
+
+ FILE *outf;
+ if (!output_file || strcmp(output_file, "-") == 0)
+ outf = stdout;
+ else {
+ outf = fopen(output_file, "w");
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
+
+ //font->undo_synthetic();
+
+ // Prepare glyph order table
+ int gindex = 0;
+ char buf[7] = "Asmall";
+ for (int c = 0; c < 26; c++) {
+ buf[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[c];
+ glyph_order.insert(PermString(buf[0]), gindex++);
+ glyph_order.insert(PermString("abcdefghijklmnopqrstuvwxyz"[c]), gindex++);
+ glyph_order.insert(PermString(buf), gindex++);
+ }
+ glyph_order.insert("parenleft", gindex++);
+ glyph_order.insert("period", gindex++);
+ glyph_order.insert("comma", gindex++);
+ glyph_order.insert("hyphen", gindex++);
+ glyph_order.insert("ampersand", gindex++);
+ glyph_order.insert("semicolon", gindex++);
+ glyph_order.insert("exclamation", gindex++);
+ glyph_order.insert("question", gindex++);
+ glyph_order.insert("parenright", gindex++);
+ glyph_order.insert("zero", gindex++);
+ glyph_order.insert("one", gindex++);
+ glyph_order.insert("two", gindex++);
+ glyph_order.insert("three", gindex++);
+ glyph_order.insert("four", gindex++);
+ glyph_order.insert("five", gindex++);
+ glyph_order.insert("six", gindex++);
+ glyph_order.insert("seven", gindex++);
+ glyph_order.insert("eight", gindex++);
+ glyph_order.insert("nine", gindex++);
+ glyph_order.insert("zerooldstyle", gindex++);
+ glyph_order.insert("oneoldstyle", gindex++);
+ glyph_order.insert("twooldstyle", gindex++);
+ glyph_order.insert("threeoldstyle", gindex++);
+ glyph_order.insert("fouroldstyle", gindex++);
+ glyph_order.insert("fiveoldstyle", gindex++);
+ glyph_order.insert("sixoldstyle", gindex++);
+ glyph_order.insert("sevenoldstyle", gindex++);
+ glyph_order.insert("eightoldstyle", gindex++);
+ glyph_order.insert("nineoldstyle", gindex++);
+ glyph_order.insert(".notdef", gindex++);
+ glyph_order.insert("space", gindex++);
+
+ // Get glyph names.
+ Vector<PermString> glyph_names;
+ for (int i = 0; i < font->nglyphs(); i++)
+ if (glyph_matches(font->glyph_name(i), glyph_patterns.begin(), glyph_patterns.end()))
+ glyph_names.push_back(font->glyph_name(i));
+ if (glyph_names.size() == 0)
+ errh->fatal("no glyphs to print");
+ qsort(glyph_names.begin(), glyph_names.size(), sizeof(PermString), glyphcompare);
+
+ if (smoke)
+ output_smoke(outf, font, glyph_names);
+ else
+ output_testpage(outf, font, glyph_names);
+
+ exit(0);
+}
diff --git a/Build/source/utils/pdfopen/Makefile.am b/Build/source/utils/pdfopen/Makefile.am
new file mode 100644
index 00000000000..6fbec89acd9
--- /dev/null
+++ b/Build/source/utils/pdfopen/Makefile.am
@@ -0,0 +1,11 @@
+
+AM_CFLAGS = $(X_CFLAGS)
+
+LDADD = $(X_LIBS) -lX11 -lXmu $(X_EXTRA_LIBS)
+
+bin_PROGRAMS = pdfopen pdfclose
+
+pdfopen_SOURCES = pdfopen.c sendx.c
+
+pdfclose_SOURCES = pdfclose.c sendx.c
+
diff --git a/Build/source/utils/pdfopen/Makefile.in b/Build/source/utils/pdfopen/Makefile.in
new file mode 100644
index 00000000000..3ee8225b80f
--- /dev/null
+++ b/Build/source/utils/pdfopen/Makefile.in
@@ -0,0 +1,527 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = pdfopen$(EXEEXT) pdfclose$(EXEEXT)
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/configure config/depcomp \
+ config/install-sh config/missing config/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_pdfclose_OBJECTS = pdfclose.$(OBJEXT) sendx.$(OBJEXT)
+pdfclose_OBJECTS = $(am_pdfclose_OBJECTS)
+pdfclose_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+pdfclose_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_pdfopen_OBJECTS = pdfopen.$(OBJEXT) sendx.$(OBJEXT)
+pdfopen_OBJECTS = $(am_pdfopen_OBJECTS)
+pdfopen_LDADD = $(LDADD)
+pdfopen_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(srcdir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(pdfclose_SOURCES) $(pdfopen_SOURCES)
+DIST_SOURCES = $(pdfclose_SOURCES) $(pdfopen_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AM_CFLAGS = $(X_CFLAGS)
+LDADD = $(X_LIBS) -lX11 -lXmu $(X_EXTRA_LIBS)
+pdfopen_SOURCES = pdfopen.c sendx.c
+pdfclose_SOURCES = pdfclose.c sendx.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+pdfclose$(EXEEXT): $(pdfclose_OBJECTS) $(pdfclose_DEPENDENCIES)
+ @rm -f pdfclose$(EXEEXT)
+ $(LINK) $(pdfclose_LDFLAGS) $(pdfclose_OBJECTS) $(pdfclose_LDADD) $(LIBS)
+pdfopen$(EXEEXT): $(pdfopen_OBJECTS) $(pdfopen_DEPENDENCIES)
+ @rm -f pdfopen$(EXEEXT)
+ $(LINK) $(pdfopen_LDFLAGS) $(pdfopen_OBJECTS) $(pdfopen_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfclose.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfopen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendx.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/config
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+ dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-compile distclean-generic distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/pdfopen/README b/Build/source/utils/pdfopen/README
new file mode 100644
index 00000000000..9f571a9b3b6
--- /dev/null
+++ b/Build/source/utils/pdfopen/README
@@ -0,0 +1,75 @@
+
+--------------------------------------------------------
+Pdfopen 0.4 - Send open/close commands to Acrobat Reader
+--------------------------------------------------------
+
+This is a Linux (X11) implementation of Fabrice Popineau's pdfclose/
+pdfopen commands to control the Acrobat Reader.
+
+The libX code was borrowed from Reinhard Fobbe's Sendx library for
+Tcl/Tk, and the programs use the same license, copied below.
+
+Version 0.3 adds support for Adobe Reader 7.0 for Linux.
+(different window titles and key shortcuts)
+
+Version 0.4 uses autoconf
+
+The command lines do not behave precisely the same as under Windows,
+because the Linux Reader behaves somewhat different: it is not
+scriptable, but it is possible to 'fake' keypresses.
+
+Both commands have only one meaningful argument:
+
+ pdfclose --file <pdfname>
+ Closes an existing window with the name <pdfname>
+
+ pdfopen --file <pdfname>
+ Opens a window with the name <pdfname> (starting a reader if
+ necesary), or it reloads <pdfname> if it was already open.
+
+Note: <pdfname> is the name of the X window, not a filename.
+
+
+Without argument, the pdfopen program sends a "Ctrl-<-" to an existing X
+window with the name "Acrobat Reader", and "Alt-<-" to a window with the
+name "Adobe Reader", if such windows exist.
+
+The --all and --page arguments of Fabrice's programs are silently ignored.
+
+
+Taco Hoekwater <taco@metatex.org>
+
+Dordrecht, The Netherlands, March 2005.
+
+
+License terms:
+--------------
+The following terms apply to all files associated with the software unless
+explicitly disclaimed in individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+IS PROVIDED ON AN &quot;AS IS&quot; BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+
+
+
diff --git a/Build/source/utils/pdfopen/aclocal.m4 b/Build/source/utils/pdfopen/aclocal.m4
new file mode 100644
index 00000000000..aef181a6ddb
--- /dev/null
+++ b/Build/source/utils/pdfopen/aclocal.m4
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/Build/source/utils/pdfopen/config/depcomp b/Build/source/utils/pdfopen/config/depcomp
new file mode 100755
index 00000000000..11e2d3bfe1c
--- /dev/null
+++ b/Build/source/utils/pdfopen/config/depcomp
@@ -0,0 +1,522 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2004-05-31.23
+
+# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit 0
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit 0
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # Dependencies are output in .lo.d with libtool 1.4.
+ # With libtool 1.5 they are output both in $dir.libs/$base.o.d
+ # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the
+ # latter, because the former will be cleaned when $dir.libs is
+ # erased.
+ tmpdepfile1="$dir.libs/$base.lo.d"
+ tmpdepfile2="$dir$base.o.d"
+ tmpdepfile3="$dir.libs/$base.d"
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1="$dir$base.o.d"
+ tmpdepfile2="$dir$base.d"
+ tmpdepfile3="$dir$base.d"
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ elif test -f "$tmpdepfile2"; then
+ tmpdepfile="$tmpdepfile2"
+ else
+ tmpdepfile="$tmpdepfile3"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/pdfopen/config/install-sh b/Build/source/utils/pdfopen/config/install-sh
new file mode 100755
index 00000000000..6ebe46de6cf
--- /dev/null
+++ b/Build/source/utils/pdfopen/config/install-sh
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2004-12-17.09
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit 0;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit 0;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ shift
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit 1
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/pdfopen/config/missing b/Build/source/utils/pdfopen/config/missing
new file mode 100755
index 00000000000..64b5f901dd5
--- /dev/null
+++ b/Build/source/utils/pdfopen/config/missing
@@ -0,0 +1,353 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2004-09-07.08
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit 0
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit 0
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/pdfopen/config/mkinstalldirs b/Build/source/utils/pdfopen/config/mkinstalldirs
new file mode 100755
index 00000000000..6fbe5e11762
--- /dev/null
+++ b/Build/source/utils/pdfopen/config/mkinstalldirs
@@ -0,0 +1,150 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2004-02-15.20
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit 0
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit 0
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/pdfopen/configure b/Build/source/utils/pdfopen/configure
new file mode 100755
index 00000000000..324448995c9
--- /dev/null
+++ b/Build/source/utils/pdfopen/configure
@@ -0,0 +1,5636 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for pdfopen 0.4.
+#
+# Report bugs to <taco@metatex.org>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='pdfopen'
+PACKAGE_TARNAME='pdfopen'
+PACKAGE_VERSION='0.4'
+PACKAGE_STRING='pdfopen 0.4'
+PACKAGE_BUGREPORT='taco@metatex.org'
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures pdfopen 0.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of pdfopen 0.4:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-x use the X Window System
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <taco@metatex.org>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+pdfopen configure 0.4
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by pdfopen $as_me 0.4, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in config $srcdir/config; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config $srcdir/config" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+
+am__api_version="1.9"
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=pdfopen
+ VERSION=0.4
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+ ac_config_files="$ac_config_files Makefile"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+ withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+ # Both variables are already set.
+ have_x=yes
+ else
+ if test "${ac_cv_have_x+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+ cat >Imakefile <<'_ACEOF'
+acfindx:
+ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+_ACEOF
+ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl; do
+ if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+ test -f $ac_im_libdir/libX11.$ac_extension; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /lib) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Intrinsic.h.
+ # First, try using that file with no special directory specified.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Intrinsic.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lXt $LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+int
+main ()
+{
+XtMalloc (0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl; do
+ if test -r $ac_dir/libXt.$ac_extension; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+ # Didn't find X anywhere. Cache the known absence of X.
+ ac_cv_have_x="have_x=no"
+else
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+ fi
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ echo "$as_me:$LINENO: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+ echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+if test "$no_x" = yes; then
+ # Not all programs may use this symbol, but it does not hurt to define it.
+
+cat >>confdefs.h <<\_ACEOF
+#define X_DISPLAY_MISSING 1
+_ACEOF
+
+ X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+ if test -n "$x_includes"; then
+ X_CFLAGS="$X_CFLAGS -I$x_includes"
+ fi
+
+ # It would also be nice to do this for all -L options, not just this one.
+ if test -n "$x_libraries"; then
+ X_LIBS="$X_LIBS -L$x_libraries"
+ # For Solaris; some versions of Sun CC require a space after -R and
+ # others require no space. Words are not sufficient . . . .
+ case `(uname -sr) 2>/dev/null` in
+ "SunOS 5"*)
+ echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5
+echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
+ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_R_nospace=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_R_nospace=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $ac_R_nospace = yes; then
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ X_LIBS="$X_LIBS -R$x_libraries"
+ else
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_R_space=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_R_space=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $ac_R_space = yes; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ X_LIBS="$X_LIBS -R $x_libraries"
+ else
+ echo "$as_me:$LINENO: result: neither works" >&5
+echo "${ECHO_T}neither works" >&6
+ fi
+ fi
+ LIBS=$ac_xsave_LIBS
+ esac
+ fi
+
+ # Check for system-dependent libraries X programs must link with.
+ # Do this before checking for the system-independent R6 libraries
+ # (-lICE), since we may need -lsocket or whatever for X linking.
+
+ if test "$ISC" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+ else
+ # Martyn Johnson says this is needed for Ultrix, if the X
+ # libraries were built with DECnet support. And Karl Berry says
+ # the Alpha needs dnet_stub (dnet does not exist).
+ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay ();
+int
+main ()
+{
+XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main ()
+{
+dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dnet_dnet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
+if test $ac_cv_lib_dnet_dnet_ntoa = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main ()
+{
+dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
+if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+ fi
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_xsave_LIBS"
+
+ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+ # to get the SysV transport functions.
+ # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+ # needs -lnsl.
+ # The nsl library prevents programs from opening the X display
+ # on Irix 5.2, according to T.E. Dickey.
+ # The functions gethostbyname, getservbyname, and inet_addr are
+ # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+ echo "$as_me:$LINENO: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define gethostbyname innocuous_gethostbyname
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gethostbyname (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef gethostbyname
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+char (*f) () = gethostbyname;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != gethostbyname;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_gethostbyname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
+
+ if test $ac_cv_func_gethostbyname = no; then
+ echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main ()
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_nsl_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test $ac_cv_lib_nsl_gethostbyname = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+ if test $ac_cv_lib_nsl_gethostbyname = no; then
+ echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
+echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main ()
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_bsd_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
+if test $ac_cv_lib_bsd_gethostbyname = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+ fi
+ fi
+
+ # lieder@skyler.mavd.honeywell.com says without -lsocket,
+ # socket/setsockopt and other routines are undefined under SCO ODT
+ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary
+ # on later versions), says Simon Leinen: it contains gethostby*
+ # variants that don't use the name server (or something). -lsocket
+ # must be given before -lnsl if both are needed. We assume that
+ # if connect needs -lnsl, so does gethostbyname.
+ echo "$as_me:$LINENO: checking for connect" >&5
+echo $ECHO_N "checking for connect... $ECHO_C" >&6
+if test "${ac_cv_func_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define connect to an innocuous variant, in case <limits.h> declares connect.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define connect innocuous_connect
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char connect (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef connect
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+char (*f) () = connect;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != connect;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_connect=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5
+echo "${ECHO_T}$ac_cv_func_connect" >&6
+
+ if test $ac_cv_func_connect = no; then
+ echo "$as_me:$LINENO: checking for connect in -lsocket" >&5
+echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect ();
+int
+main ()
+{
+connect ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_socket_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_socket_connect=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
+if test $ac_cv_lib_socket_connect = yes; then
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+ fi
+
+ # Guillermo Gomez says -lposix is necessary on A/UX.
+ echo "$as_me:$LINENO: checking for remove" >&5
+echo $ECHO_N "checking for remove... $ECHO_C" >&6
+if test "${ac_cv_func_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define remove to an innocuous variant, in case <limits.h> declares remove.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define remove innocuous_remove
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char remove (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef remove
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_remove) || defined (__stub___remove)
+choke me
+#else
+char (*f) () = remove;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != remove;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_remove=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5
+echo "${ECHO_T}$ac_cv_func_remove" >&6
+
+ if test $ac_cv_func_remove = no; then
+ echo "$as_me:$LINENO: checking for remove in -lposix" >&5
+echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
+if test "${ac_cv_lib_posix_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove ();
+int
+main ()
+{
+remove ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_posix_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_posix_remove=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
+echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
+if test $ac_cv_lib_posix_remove = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ echo "$as_me:$LINENO: checking for shmat" >&5
+echo $ECHO_N "checking for shmat... $ECHO_C" >&6
+if test "${ac_cv_func_shmat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shmat to an innocuous variant, in case <limits.h> declares shmat.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shmat innocuous_shmat
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shmat (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shmat
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+choke me
+#else
+char (*f) () = shmat;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shmat;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shmat=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shmat=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5
+echo "${ECHO_T}$ac_cv_func_shmat" >&6
+
+ if test $ac_cv_func_shmat = no; then
+ echo "$as_me:$LINENO: checking for shmat in -lipc" >&5
+echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat ();
+int
+main ()
+{
+shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_ipc_shmat=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ipc_shmat=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
+echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
+if test $ac_cv_lib_ipc_shmat = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+ fi
+ fi
+
+ # Check for libraries that X11R6 Xt/Xaw programs need.
+ ac_save_LDFLAGS=$LDFLAGS
+ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+ # check for ICE first), but we must link in the order -lSM -lICE or
+ # we get undefined symbols. So assume we have SM if we have ICE.
+ # These have to be linked with before -lX11, unlike the other
+ # libraries we check for below, so use a different variable.
+ # John Interrante, Karl Berry
+ echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5
+echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char IceConnectionNumber ();
+int
+main ()
+{
+IceConnectionNumber ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
+if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then
+ X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+ LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g
+t quote
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[ `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output. A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by pdfopen $as_me 0.4, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+pdfopen config.status 0.4
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@X_CFLAGS@,$X_CFLAGS,;t t
+s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t
+s,@X_LIBS@,$X_LIBS,;t t
+s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Build/source/utils/pdfopen/configure.ac b/Build/source/utils/pdfopen/configure.ac
new file mode 100644
index 00000000000..a739682e0bc
--- /dev/null
+++ b/Build/source/utils/pdfopen/configure.ac
@@ -0,0 +1,25 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl this is for autoconf 2.5x
+
+AC_INIT(pdfopen, 0.4, taco@metatex.org)
+
+AC_CONFIG_AUX_DIR(config)
+
+AM_INIT_AUTOMAKE(pdfopen, 0.4)
+
+AC_CONFIG_FILES(Makefile)
+
+AC_PROG_CC
+
+dnl AC_PROG_INSTALL
+
+dnl Checks for header files.
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Checks for library functions.
+
+dnl Find Xlibs.
+AC_PATH_XTRA
+
+AC_OUTPUT
diff --git a/Build/source/utils/pdfopen/pdfclose.c b/Build/source/utils/pdfopen/pdfclose.c
new file mode 100644
index 00000000000..9664a819282
--- /dev/null
+++ b/Build/source/utils/pdfopen/pdfclose.c
@@ -0,0 +1,48 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+extern int sendx_control_token(char *,char *);
+
+#define READERWINPREFIX "Adobe Reader - "
+#define SUCCESS(a) (!a)
+
+void usage (void) {
+ puts ("pdfclose 0.4: you are mistaking me for an actual program.\n");
+ puts (" pdfclose --file filename.pdf");
+ puts ("\n");
+}
+
+
+int main (int argc, char **argv){
+ char *filename;
+ char *winname;
+ if (argc == 3 && strcmp(argv[1],"--file") == 0) {
+ filename = malloc(strlen(argv[2])+1);
+ if (filename == NULL) {
+ puts ("out of memory\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy(filename,argv[2]);
+ if(sendx_control_token("W",filename)) {
+ /* failed try reader 7 */
+ winname = malloc(strlen(argv[2])+1+strlen(READERWINPREFIX));
+ if (winname == NULL) {
+ puts ("out of memory\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy (winname, READERWINPREFIX);
+ strcpy ((winname+strlen(READERWINPREFIX)), filename);
+ sendx_control_token("W",winname);
+ }
+ } else if (argc == 2 && strcmp(argv[1],"--all") == 0) {
+ ;
+ } else {
+ usage();
+ }
+ exit(EXIT_SUCCESS);
+}
+
diff --git a/Build/source/utils/pdfopen/pdfopen.c b/Build/source/utils/pdfopen/pdfopen.c
new file mode 100644
index 00000000000..8ede853bae0
--- /dev/null
+++ b/Build/source/utils/pdfopen/pdfopen.c
@@ -0,0 +1,71 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* returns 1 on failure */
+extern int sendx_control_token(char *,char *);
+extern int sendx_alt_token(char *,char *);
+
+void usage (void) {
+ puts ("pdfopen 0.4: you are mistaking me for an actual program.\n");
+ puts(" pdfopen [--file filename.pdf]");
+ puts ("\nusing no arguments tells the Reader to 'go back'.\n");
+}
+
+#define READERFIVE "Acrobat Reader"
+#define READERNAME "Adobe Reader"
+#define READERWINPREFIX "Adobe Reader - "
+#define SUCCESS(a) (!a)
+
+int main (int argc, char **argv){
+ char *newargv[3];
+ char *winname;
+ char *filename;
+ int test = 1;
+ if (argc == 5 &&
+ (strcmp(argv[3],"--page") == 0
+ && strcmp(argv[1],"--file") == 0 )) {
+ argc = 3;
+ }
+ if (argc == 3 && strcmp(argv[1],"--file") == 0) {
+ filename = malloc(strlen(argv[2])+1);
+ if (filename == NULL) {
+ puts ("out of memory\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy(filename,argv[2]);
+ winname = malloc(strlen(argv[2])+1+strlen(READERWINPREFIX));
+ if (winname == NULL) {
+ puts ("out of memory\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy (winname,READERWINPREFIX);
+ strcpy ((winname+strlen(READERWINPREFIX)), filename);
+ if (SUCCESS(sendx_control_token("W",winname))) {
+ sendx_alt_token("Left",READERNAME); /* that's seven */
+ } else if (SUCCESS(sendx_control_token("W",filename))) {
+ sendx_control_token("Left",READERFIVE); /* that's five */
+ } else {
+ newargv[0] = "acroread";
+ newargv[1] = filename;
+ newargv[2] = NULL;
+ if(!fork()) {
+ execvp("acroread",newargv);
+ /* this trick makes sure that there *is* a back option
+ in Acrobat Reader */
+ while(test) {
+ test = sendx_control_token("+",filename);
+ }
+ }
+ }
+ } else if (argc != 1) {
+ usage();
+ } else {
+ sendx_alt_token("Left",READERNAME);
+ sendx_control_token("Left",READERFIVE);
+ }
+ exit(EXIT_SUCCESS);
+}
+
diff --git a/Build/source/utils/pdfopen/sendx.c b/Build/source/utils/pdfopen/sendx.c
new file mode 100644
index 00000000000..238f97f7f82
--- /dev/null
+++ b/Build/source/utils/pdfopen/sendx.c
@@ -0,0 +1,290 @@
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include <X11/cursorfont.h>
+
+static char *display_name = NULL;
+static Display *display;
+static Window root;
+static Window window = None;
+static XKeyEvent event;
+
+static char error_message[256];
+static int error_status = 0;
+
+static void
+throw_exception3(char *msg, char *s, int i) {
+ sprintf(error_message, msg, s, i);
+ error_status = 1;
+}
+
+static void
+throw_exception3s(char *msg1, char *msg2, char *msg3) {
+ sprintf(error_message, msg1, msg2, msg3);
+ error_status = 1;
+}
+
+static void
+throw_exception(char *msg) {
+ strncpy(error_message,msg,256);
+ error_status = 1;
+}
+
+/* Added for window managers like swm and tvtwm that follow solbourne's
+ * virtual root window concept
+ */
+static Window
+GetRootWindow (Display * disp, int scrn)
+{
+ Atom __SWM_VROOT = None;
+ Window root, rootReturn, parentReturn, *children;
+ unsigned int numChildren;
+ unsigned i;
+
+ root = RootWindow (disp, scrn);
+
+ /* see if there is a virtual root */
+ __SWM_VROOT = XInternAtom (disp, "__SWM_VROOT", False);
+ XQueryTree (disp, root, &rootReturn, &parentReturn, &children, &numChildren);
+ for (i = 0; i < numChildren; i++)
+ {
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytesafter;
+ Window *newRoot = (Window) 0;
+
+ if (XGetWindowProperty (disp, children[i], __SWM_VROOT, 0, 1,
+ False, XA_WINDOW, &actual_type, &actual_format,
+ &nitems, &bytesafter,
+ (unsigned char**) &newRoot) ==
+ Success && newRoot)
+ {
+ root = *newRoot;
+ break;
+ }
+ }
+ if (children)
+ XFree ((char *) children);
+ return (root);
+}
+
+
+/* - - - - - - - - -
+
+ * [These functions are from the file "dsimple.c" used with xwininfo.]
+ *
+ * Written by Mark Lillibridge. Last updated 7/1/87
+ *
+ *
+ * Window_With_Name: routine to locate a window with a given name on a display.
+ * If no window with the given name is found, 0 is returned.
+ * If more than one window has the given name, the first
+ * one found will be returned. Only top and its subwindows
+ * are looked at. Normally, top should be the Root Window.
+ */
+static Window
+Window_With_Name (Display * dpy, Window top, char *name)
+{
+ Window *children, dummy;
+ unsigned int nchildren;
+ unsigned i;
+ Window w = 0;
+ char *window_name;
+
+ if (XFetchName (dpy, top, &window_name) && !strcmp (window_name, name))
+ return (top);
+
+ if (!XQueryTree (dpy, top, &dummy, &dummy, &children, &nchildren))
+ return (0);
+
+ for (i = 0; i < nchildren; i++)
+ {
+ w = Window_With_Name (dpy, children[i], name);
+ if (w)
+ break;
+ }
+ if (children)
+ XFree ((char *) children);
+ return (w);
+}
+
+
+
+static int
+open_channel (char *wname)
+{
+/* display_name = ":0.0"; */
+ if ((display = XOpenDisplay (display_name)) == NULL)
+ {
+ throw_exception ("can't open display");
+ return 1;
+ }
+ if ((root = GetRootWindow (display, DefaultScreen (display))) == 0)
+ {
+ throw_exception ("Cannot get DefaultScreen");
+ return 1;
+ }
+
+ if ((wname[0] == '\0') && (window != None))
+ {} /* take selected window */
+ else if (wname[0] != '\0')
+ {
+ if ((window = Window_With_Name (display, root, wname)) == None)
+ {
+ throw_exception3s ("Display %s: can't open window named \"%s\"",
+ XDisplayName (display_name), wname);
+ return 1;
+ }
+ }
+ else
+ {
+ throw_exception3 ("bad condition in %s at line %d", __FILE__, __LINE__);
+ return 1;
+ }
+
+ event.type = KeyPress;
+ event.serial = 0;
+ event.send_event = False;
+ event.display = display;
+ event.x = event.y = event.x_root = event.y_root = 0;
+ event.time = CurrentTime;
+ event.same_screen = True;
+ event.subwindow = None;
+ event.window = window;
+ event.root = root;
+ return 0;
+}
+
+static void
+close_channel ()
+{
+/* XFlush(display); */
+ XCloseDisplay (display);
+}
+
+static void
+sendx_channel (KeySym ks, int km)
+{
+/* 0=regular, 1=shift, 2=lock, 4=control */
+ if (ks < 256)
+ {
+ event.state = isupper ((char) ks);
+ switch (ks)
+ {
+ case 0x08:
+ ks = XK_BackSpace;
+ break;
+ case 0x09:
+ ks = XK_Tab;
+ break;
+ case 0x0A:
+ ks = XK_Linefeed;
+ break;
+ case 0x0B:
+ ks = XK_Clear;
+ break;
+ case 0x0D:
+ ks = XK_Return;
+ break;
+ case 0x13:
+ ks = XK_Pause;
+ break;
+ case 0x14:
+ ks = XK_Scroll_Lock;
+ break;
+ case 0x15:
+ ks = XK_Sys_Req;
+ break;
+ case 0x1B:
+ ks = XK_Escape;
+ break;
+ }
+ }
+ else
+ event.state = 0;
+ event.type = KeyPress;
+ event.state = km ; // Mod1Mask
+ event.keycode = XKeysymToKeycode (display, ks);
+ if (XSendEvent (display, window, True, 0xfff, (XEvent *) & event) == 0)
+ throw_exception ("Error in XSendEvent");
+ event.type = KeyRelease;
+ if (XSendEvent (display, window, True, 0xfff, (XEvent *) & event) == 0)
+ throw_exception ("Error in XSendEvent");
+ return;
+}
+
+int
+sendx_string (char *string, char *window)
+{
+ char *p;
+ if (open_channel (window))
+ return error_status;
+ p = string;
+ while (*p)
+ sendx_channel (*p++,0);
+ close_channel ();
+ return error_status;
+}
+
+int
+sendx_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string),0);
+ close_channel ();
+ return error_status;
+}
+
+
+int
+sendx_alt_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string),Mod1Mask);
+ close_channel ();
+ return error_status;
+}
+
+int
+sendx_controlalt_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string), Mod1Mask | ControlMask);
+ close_channel ();
+ return error_status;
+}
+
+
+int
+sendx_control_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string),ControlMask);
+ close_channel ();
+ return error_status;
+}
+
+/*
+ void
+ PrintKeySyms ()
+ {
+ int i;
+ for (i = 32; i < 127; i++)
+ {
+ printf ("%s[%c] ", XKeysymToString (i), i);
+ }
+ for (i = 128 + 32; i < 128 + 127; i++)
+ {
+ printf ("%s[%c] ", XKeysymToString (i), i);
+ }
+ printf ("\n");
+ }
+ */
diff --git a/Build/source/utils/psutils/LICENSE b/Build/source/utils/psutils/LICENSE
new file mode 100644
index 00000000000..e5e718ac10c
--- /dev/null
+++ b/Build/source/utils/psutils/LICENSE
@@ -0,0 +1,47 @@
+
+ PS Utilities Package
+
+The constituent files of this package listed below are copyright (C) 1991-1995
+Angus J. C. Duggan.
+
+LICENSE Makefile.msc Makefile.nt Makefile.os2
+Makefile.unix README config.h descrip.mms
+epsffit.c epsffit.man extractres.man extractres.pl
+fixdlsrps.man fixdlsrps.pl fixfmps.man fixfmps.pl
+fixmacps.man fixmacps.pl fixpsditps.man fixpsditps.pl
+fixpspps.man fixpspps.pl fixscribeps.man fixscribeps.pl
+fixtpps.man fixtpps.pl fixwfwps.man fixwfwps.pl
+fixwpps.man fixwpps.pl fixwwps.man fixwwps.pl
+getafm getafm.man includeres.man includeres.pl
+maketext patchlev.h psbook.c psbook.man
+pserror.c pserror.h psmerge.man psmerge.pl
+psnup.c psnup.man psresize.c psresize.man
+psselect.c psselect.man psspec.c psspec.h
+pstops.c pstops.man psutil.c psutil.h
+showchar
+
+They may be copied and used for any purpose (including distribution as part of
+a for-profit product), provided:
+
+1) The original attribution of the programs is clearly displayed in the product
+ and/or documentation, even if the programs are modified and/or renamed as
+ part of the product.
+
+2) The original source code of the programs is provided free of charge (except
+ for reasonable distribution costs). For a definition of reasonable
+ distribution costs, see the Gnu General Public License or Larry Wall's
+ Artistic License (provided with the Perl 4 kit). The GPL and Artistic
+ License in NO WAY affect this license; they are merely used as examples of
+ the spirit in which it is intended.
+
+3) These programs are provided "as-is". No warranty or guarantee of their
+ fitness for any particular task is provided. Use of these programs is
+ completely at your own risk.
+
+Basically, I don't mind how you use the programs so long as you acknowledge
+the author, and give people the originals if they want them.
+
+The included files, md68_0.ps and md71_0.ps (and their uuencoded forms) are
+(to the best of my knowledge) copyright Apple Computer, Inc.
+
+ AJCD 4/4/95
diff --git a/Build/source/utils/psutils/Makefile.bcc b/Build/source/utils/psutils/Makefile.bcc
new file mode 100644
index 00000000000..89ab6bbcc04
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.bcc
@@ -0,0 +1,108 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under MSDOS
+
+OS = DOS
+
+BINDIR = \psutils
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = \psutils\include
+
+# Flags for Borland C Compiler
+CC = bcc
+CFLAGS = -DPAPER="$(PAPER)" -DMSDOS -w -v -O
+
+BIN = psbook.exe psselect.exe pstops.exe epsffit.exe psnup.exe \
+ psresize.exe
+SHELLSCRIPTS =
+PERLSCRIPTS = \
+ \
+
+MANPAGES = \
+ \
+ \
+ \
+
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.obj: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.obj: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.obj: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.obj: epsffit.c pserror.h patchlev.h
+
+epsffit.exe: epsffit.obj pserror.obj
+ $(CC) -e epsffit.exe pserror.obj epsffit.obj
+
+psnup.exe: psnup.obj psutil.obj psspec.obj pserror.obj
+ $(CC) -e psnup.exe psutil.obj psspec.obj pserror.obj psnup.obj
+
+psnup.obj: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize.exe: psresize.obj psutil.obj pserror.obj psspec.obj
+ $(CC) -e psresize.exe psutil.obj psspec.obj pserror.obj psresize.obj
+
+psresize.obj: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook.exe: psbook.obj psutil.obj pserror.obj
+ $(CC) -e psbook.exe psutil.obj pserror.obj psbook.obj
+
+psbook.obj: psutil.h patchlev.h pserror.h psbook.c
+
+psselect.exe: psselect.obj psutil.obj pserror.obj
+ $(CC) -e psselect.exe psutil.obj pserror.obj psselect.obj
+
+psselect.obj: psutil.h patchlev.h pserror.h psselect.c
+
+pstops.exe: pstops.obj psutil.obj psspec.obj pserror.obj
+ $(CC) -e pstops.exe psutil.obj psspec.obj pserror.obj pstops.obj
+
+pstops.obj: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+
+
+clean:
+ del *.obj
+
+veryclean realclean: clean
+ del $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.include
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for %1 in ( $(BIN) ) do copy %1 $(BINDIR)
+
+install.script: $(PERLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for %1 in ( $(PERLSCRIPTS) ) do copy %1 $(SCRIPTDIR)
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for %1 in ( $(INCLUDES) ) do copy %1 $(INCLUDEDIR)
+
diff --git a/Build/source/utils/psutils/Makefile.in b/Build/source/utils/psutils/Makefile.in
new file mode 100644
index 00000000000..a631dcd3ebc
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.in
@@ -0,0 +1,229 @@
+#
+# Makefile for psutils
+#
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+defines = -DUNIX -DPAPER=\"$(PAPER)\"
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+scriptdir = $(bindir)
+mandir = @mandir@
+man1dir = $(mandir)/man$(manext)
+manext = 1
+
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL = @INSTALL@
+
+BIN = psbook psselect pstops epsffit psnup psresize
+SHELLSCRIPTS = getafm showchar
+PERLSCRIPTS = fixfmps fixmacps fixpsditps fixpspps fixtpps fixwfwps fixwpps fixscribeps fixwwps fixdlsrps extractres includeres psmerge
+MANPAGES = psbook.$(manext) psselect.$(manext) pstops.$(manext) epsffit.$(manext) psnup.$(manext) psresize.$(manext) psmerge.$(manext) fixscribeps.$(manext) getafm.$(manext) fixdlsrps.$(manext) fixfmps.$(manext) fixmacps.$(manext) fixpsditps.$(manext) fixpspps.$(manext) fixtpps.$(manext) fixwfwps.$(manext) fixwpps.$(manext) fixwwps.$(manext) extractres.$(manext) includeres.$(manext)
+INCLUDES = md68_0.ps md71_0.ps
+OS = UNIX
+PAPER = a4
+
+default all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+.SUFFIXES:
+.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
+
+.c.o:
+ $(CC) $(defines) -c -I. -I$(srcdir) $(CPPFLAGS) $(CFLAGS) $<
+
+PERL = /usr/bin/env perl
+BINMODE = 0755
+MANMODE = 0644
+CHMOD = chmod
+MAKETEXT = $(PERL) $(srcdir)/maketext
+
+epsffit: epsffit.o pserror.o
+ $(CC) $(LDFLAGS) -o epsffit pserror.o epsffit.o
+
+psnup: psnup.o psutil.o psspec.o pserror.o
+ $(CC) $(LDFLAGS) -o psnup psutil.o psspec.o pserror.o psnup.o
+
+psresize: psresize.o psutil.o pserror.o psspec.o
+ $(CC) $(LDFLAGS) -o psresize psutil.o psspec.o pserror.o psresize.o
+
+psbook: psbook.o psutil.o pserror.o
+ $(CC) $(LDFLAGS) -o psbook psutil.o pserror.o psbook.o
+
+psselect: psselect.o psutil.o pserror.o
+ $(CC) $(LDFLAGS) -o psselect psutil.o pserror.o psselect.o
+
+pstops: pstops.o psutil.o psspec.o pserror.o
+ $(CC) $(LDFLAGS) -o pstops psutil.o psspec.o pserror.o pstops.o
+
+getafm: getafm.sh
+ cp $(srcdir)/getafm.sh getafm
+ $(CHMOD) $(BINMODE) getafm
+
+showchar: showchar.sh
+ cp $(srcdir)/showchar.sh showchar
+ $(CHMOD) $(BINMODE) showchar
+
+psmerge: psmerge.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/psmerge.pl > psmerge
+ $(CHMOD) $(BINMODE) psmerge
+
+fixfmps: fixfmps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixfmps.pl > fixfmps
+ $(CHMOD) $(BINMODE) fixfmps
+
+fixmacps: fixmacps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" INCLUDE=$(INCLUDEDIR) $(srcdir)/fixmacps.pl > fixmacps
+ $(CHMOD) $(BINMODE) fixmacps
+
+fixpsditps: fixpsditps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixpsditps.pl > fixpsditps
+ $(CHMOD) $(BINMODE) fixpsditps
+
+fixpspps: fixpspps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixpspps.pl > fixpspps
+ $(CHMOD) $(BINMODE) fixpspps
+
+fixscribeps: fixscribeps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixscribeps.pl > fixscribeps
+ $(CHMOD) $(BINMODE) fixscribeps
+
+fixtpps: fixtpps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixtpps.pl > fixtpps
+ $(CHMOD) $(BINMODE) fixtpps
+
+fixwfwps: fixwfwps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixwfwps.pl > fixwfwps
+ $(CHMOD) $(BINMODE) fixwfwps
+
+fixwpps: fixwpps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixwpps.pl > fixwpps
+ $(CHMOD) $(BINMODE) fixwpps
+
+fixwwps: fixwwps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixwwps.pl > fixwwps
+ $(CHMOD) $(BINMODE) fixwwps
+
+fixdlsrps: fixdlsrps.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/fixdlsrps.pl > fixdlsrps
+ $(CHMOD) $(BINMODE) fixdlsrps
+
+extractres: extractres.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" $(srcdir)/extractres.pl > extractres
+ $(CHMOD) $(BINMODE) extractres
+
+includeres: includeres.pl
+ $(MAKETEXT) OS=$(OS) PERL="$(PERL)" INCLUDE=$(INCLUDEDIR) $(srcdir)/includeres.pl > includeres
+ $(CHMOD) $(BINMODE) includeres
+
+epsffit.$(manext): epsffit.man
+ $(MAKETEXT) MAN="$(MANPAGES)" $(srcdir)/epsffit.man > epsffit.$(manext)
+
+psnup.$(manext): psnup.man
+ $(MAKETEXT) MAN="$(MANPAGES)" PAPER=$(PAPER) $(srcdir)/psnup.man > psnup.$(manext)
+
+psresize.$(manext): psresize.man
+ $(MAKETEXT) MAN="$(MANPAGES)" PAPER=$(PAPER) $(srcdir)/psresize.man > psresize.$(manext)
+
+psbook.$(manext): psbook.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/psbook.man > psbook.$(manext)
+
+psselect.$(manext): psselect.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/psselect.man > psselect.$(manext)
+
+pstops.$(manext): pstops.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" PAPER=$(PAPER) $(srcdir)/pstops.man > pstops.$(manext)
+
+psmerge.$(manext): psmerge.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/psmerge.man > psmerge.$(manext)
+
+fixfmps.$(manext): fixfmps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixfmps.man > fixfmps.$(manext)
+
+fixmacps.$(manext): fixmacps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $(srcdir)/fixmacps.man > fixmacps.$(manext)
+
+fixpsditps.$(manext): fixpsditps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixpsditps.man > fixpsditps.$(manext)
+
+fixpspps.$(manext): fixpspps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixpspps.man > fixpspps.$(manext)
+
+fixscribeps.$(manext): fixscribeps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixscribeps.man > fixscribeps.$(manext)
+
+fixtpps.$(manext): fixtpps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixtpps.man > fixtpps.$(manext)
+
+fixwfwps.$(manext): fixwfwps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixwfwps.man > fixwfwps.$(manext)
+
+fixwpps.$(manext): fixwpps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixwpps.man > fixwpps.$(manext)
+
+fixwwps.$(manext): fixwwps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixwwps.man > fixwwps.$(manext)
+
+fixdlsrps.$(manext): fixdlsrps.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/fixdlsrps.man > fixdlsrps.$(manext)
+
+extractres.$(manext): extractres.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/extractres.man > extractres.$(manext)
+
+includeres.$(manext): includeres.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $(srcdir)/includeres.man > includeres.$(manext)
+
+getafm.$(manext): getafm.man
+ $(MAKETEXT) "MAN=$(MANPAGES)" $(srcdir)/getafm.man > getafm.$(manext)
+
+info:
+dvi:
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+.PHONY: install installdirs install-exec install-man clean realclean distclean mostlyclean all check info dvi
+install: install-exec install-man
+
+install-exec: installdirs
+ for p in $(BIN); do $(INSTALL_PROGRAM) $$p $(bindir)/$$p; done
+ for p in $(SHELLSCRIPTS) $(PERLSCRIPTS); do $(INSTALL_PROGRAM) $$p $(scriptdir)/$$p; done
+
+install-man: installdirs
+ for p in $(MANPAGES); do $(INSTALL_DATA) $$p $(man1dir)/$$p; done
+
+installdirs:
+ $(SHELL) ${srcdir}/../../texk/mkinstalldirs $(bindir) $(scriptdir) $(man1dir)
+
+clean:
+ rm -f *.o $(BIN) $(SHELLSCRIPTS) $(PERLSCRIPTS) $(MANPAGES)
+
+distclean: mostlyclean
+ rm -f Makefile config.cache config.log config.status patchlev.h
+
+realclean: distclean
+mostlyclean: clean
+
+Makefile: config.status $(srcdir)/Makefile.in
+ $(SHELL) config.status
+
+# This tells versions [3.59,3.63) of GNU make not to export all variables.
+.NOEXPORT:
+
+# Automatically generated dependencies will be put at the end of the file.
+psutil.o: psutil.h patchlev.h pserror.h psutil.c
+psspec.o: psutil.h patchlev.h psspec.h pserror.h psspec.c
+pserror.o: psutil.h patchlev.h pserror.h pserror.c
+epsffit.o: epsffit.c pserror.h patchlev.h
+psnup.o: psutil.h patchlev.h psspec.h pserror.h psnup.c
+psresize.o: psutil.h patchlev.h psspec.h pserror.h psresize.c
+psbook.o: psutil.h patchlev.h pserror.h psbook.c
+psselect.o: psutil.h patchlev.h pserror.h psselect.c
+pstops.o: psutil.h patchlev.h psspec.h pserror.h pstops.c
diff --git a/Build/source/utils/psutils/Makefile.msc b/Build/source/utils/psutils/Makefile.msc
new file mode 100644
index 00000000000..90d1383e5f3
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.msc
@@ -0,0 +1,108 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under MSDOS
+
+OS = DOS
+
+BINDIR = \psutils
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = \psutils\include
+
+# Flags for Microsoft C/C++ Compiler
+CC = cl
+CFLAGS = -DPAPER=\"$(PAPER)\" -DMSDOS -W4 -Zi -Ox
+
+BIN = psbook.exe psselect.exe pstops.exe epsffit.exe psnup.exe \
+ psresize.exe
+SHELLSCRIPTS =
+PERLSCRIPTS = \
+ \
+
+MANPAGES = \
+ \
+ \
+ \
+
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.obj: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.obj: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.obj: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.obj: epsffit.c pserror.h patchlev.h
+
+epsffit.exe: epsffit.obj pserror.obj
+ link -out:epsffit.exe pserror.obj epsffit.obj
+
+psnup.exe: psnup.obj psutil.obj psspec.obj pserror.obj
+ link -out:psnup.exe psutil.obj psspec.obj pserror.obj psnup.obj
+
+psnup.obj: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize.exe: psresize.obj psutil.obj pserror.obj psspec.obj
+ link -out:psresize.exe psutil.obj psspec.obj pserror.obj psresize.obj
+
+psresize.obj: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook.exe: psbook.obj psutil.obj pserror.obj
+ link -out:psbook.exe psutil.obj pserror.obj psbook.obj
+
+psbook.obj: psutil.h patchlev.h pserror.h psbook.c
+
+psselect.exe: psselect.obj psutil.obj pserror.obj
+ link -out:psselect.exe psutil.obj pserror.obj psselect.obj
+
+psselect.obj: psutil.h patchlev.h pserror.h psselect.c
+
+pstops.exe: pstops.obj psutil.obj psspec.obj pserror.obj
+ link -out:pstops.exe psutil.obj psspec.obj pserror.obj pstops.obj
+
+pstops.obj: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+
+
+clean:
+ del *.obj
+
+veryclean realclean: clean
+ del $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.include
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for %1 in ( $(BIN) ) do copy %1 $(BINDIR)
+
+install.script: $(PERLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for %1 in ( $(PERLSCRIPTS) ) do copy %1 $(SCRIPTDIR)
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for %1 in ( $(INCLUDES) ) do copy %1 $(INCLUDEDIR)
+
diff --git a/Build/source/utils/psutils/Makefile.nt b/Build/source/utils/psutils/Makefile.nt
new file mode 100644
index 00000000000..41d9b054d3c
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.nt
@@ -0,0 +1,146 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under Windows NT, Microsoft C/C++ Compiler
+
+OS = WINNT
+
+BINDIR = \psutils
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = \psutils\include
+PERL = perl
+
+CFLAGS = -DPAPER=\"$(PAPER)\" -DWINNT /W4
+
+BIN = psbook.exe psselect.exe pstops.exe epsffit.exe psnup.exe \
+ psresize.exe
+SHELLSCRIPTS =
+PERLSCRIPTS = fixfmps.cmd fixmacps.cmd fixpsditps.cmd fixpspps.cmd \
+ fixtpps.cmd fixwfwps.cmd fixwpps.cmd fixscribeps.cmd fixwwps.cmd \
+ fixdlsrps.cmd extractres.cmd includeres.cmd psmerge.cmd
+MANPAGES = \
+ \
+ \
+ \
+
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.obj: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.obj: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.obj: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.obj: epsffit.c pserror.h patchlev.h
+
+epsffit.exe: epsffit.obj pserror.obj
+ link -out:epsffit.exe pserror.obj epsffit.obj
+
+psnup.exe: psnup.obj psutil.obj psspec.obj pserror.obj
+ link -out:psnup.exe psutil.obj psspec.obj pserror.obj psnup.obj
+
+psnup.obj: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize.exe: psresize.obj psutil.obj pserror.obj psspec.obj
+ link -out:psresize.exe psutil.obj psspec.obj pserror.obj psresize.obj
+
+psresize.obj: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook.exe: psbook.obj psutil.obj pserror.obj
+ link -out:psbook.exe psutil.obj pserror.obj psbook.obj
+
+psbook.obj: psutil.h patchlev.h pserror.h psbook.c
+
+psselect.exe: psselect.obj psutil.obj pserror.obj
+ link -out:psselect.exe psutil.obj pserror.obj psselect.obj
+
+psselect.obj: psutil.h patchlev.h pserror.h psselect.c
+
+pstops.exe: pstops.obj psutil.obj psspec.obj pserror.obj
+ link -out:pstops.exe psutil.obj psspec.obj pserror.obj pstops.obj
+
+pstops.obj: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+
+psmerge.cmd: psmerge.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixfmps.cmd: fixfmps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixmacps.cmd: fixmacps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) INCLUDE=$(INCLUDEDIR) $? > $@
+
+fixpsditps.cmd: fixpsditps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixpspps.cmd: fixpspps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixscribeps.cmd: fixscribeps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixtpps.cmd: fixtpps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixwfwps.cmd: fixwfwps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixwpps.cmd: fixwpps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixwwps.cmd: fixwwps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+fixdlsrps.cmd: fixdlsrps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+extractres.cmd: extractres.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+
+includeres.cmd: includeres.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) INCLUDE=$(INCLUDEDIR) $? > $@
+
+
+clean:
+ del *.obj
+
+veryclean realclean: clean
+ del $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.include
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for %1 in ( $(BIN) ) do copy %1 $(BINDIR)
+
+install.script: $(PERLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for %1 in ( $(PERLSCRIPTS) ) do copy %1 $(SCRIPTDIR)
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for %1 in ( $(INCLUDES) ) do copy %1 $(INCLUDEDIR)
+
diff --git a/Build/source/utils/psutils/Makefile.os2 b/Build/source/utils/psutils/Makefile.os2
new file mode 100644
index 00000000000..ba99fcd81f6
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.os2
@@ -0,0 +1,245 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under OS/2, GCC C Compiler
+
+OS = OS2
+
+BINDIR = \psutils
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = /lib/psutils
+PERL = perl5
+
+BINMODE = 0755
+MANMODE = 0644
+CHMOD = chmod
+INSTALL = install -c -m $(BINMODE)
+INSTALLMAN = install -c -m $(MANMODE)
+MANEXT = 1
+MANDIR = /man/man$(MANEXT)
+
+CC = gcc
+CFLAGS = -DPAPER=\"$(PAPER)\" -DOS2 -Wall -O2 -Zomf -Zmtd -s -Zlinker /PM:VIO
+
+.c.obj:
+ $(CC) -o $*.obj $(CFLAGS) -c $<
+
+BIN = psbook.exe psselect.exe pstops.exe epsffit.exe psnup.exe \
+ psresize.exe
+SHELLSCRIPTS = getafm.cmd showchar.cmd
+PERLSCRIPTS = fixfmps.cmd fixmacps.cmd fixpsditps.cmd fixpspps.cmd \
+ fixtpps.cmd fixwfwps.cmd fixwpps.cmd fixscribeps.cmd fixwwps.cmd \
+ fixdlsrps.cmd extractres.cmd includeres.cmd psmerge.cmd
+MANPAGES = psbook.$(MANEXT) psselect.$(MANEXT) pstops.$(MANEXT) epsffit.$(MANEXT) psnup.$(MANEXT) \
+ psresize.$(MANEXT) psmerge.$(MANEXT) fixscribeps.$(MANEXT) getafm.$(MANEXT) \
+ fixdlsrps.$(MANEXT) fixfmps.$(MANEXT) fixmacps.$(MANEXT) fixpsditps.$(MANEXT) \
+ fixpspps.$(MANEXT) fixtpps.$(MANEXT) fixwfwps.$(MANEXT) fixwpps.$(MANEXT) \
+ fixwwps.$(MANEXT) extractres.$(MANEXT) includeres.$(MANEXT)
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.obj: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.obj: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.obj: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.obj: epsffit.c pserror.h patchlev.h
+
+epsffit.exe: epsffit.obj pserror.obj
+ $(CC) $(CFLAGS) -o epsffit pserror.obj epsffit.obj
+
+psnup.exe: psnup.obj psutil.obj psspec.obj pserror.obj
+ $(CC) $(CFLAGS) -o psnup psutil.obj psspec.obj pserror.obj psnup.obj
+
+psnup.obj: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize.exe: psresize.obj psutil.obj pserror.obj psspec.obj
+ $(CC) $(CFLAGS) -o psresize psutil.obj psspec.obj pserror.obj psresize.obj
+
+psresize.obj: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook.exe: psbook.obj psutil.obj pserror.obj
+ $(CC) $(CFLAGS) -o psbook psutil.obj pserror.obj psbook.obj
+
+psbook.obj: psutil.h patchlev.h pserror.h psbook.c
+
+psselect.exe: psselect.obj psutil.obj pserror.obj
+ $(CC) $(CFLAGS) -o psselect psutil.obj pserror.obj psselect.obj
+
+psselect.obj: psutil.h patchlev.h pserror.h psselect.c
+
+pstops.exe: pstops.obj psutil.obj psspec.obj pserror.obj
+ $(CC) $(CFLAGS) -o pstops psutil.obj psspec.obj pserror.obj pstops.obj
+
+pstops.obj: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+getafm.cmd: getafm.sh
+ echo extproc sh $(BINDIR)/$@ >$@
+ head -n 2 $? >>$@
+ echo shift >>$@
+ tail -n +2 $? >>$@
+
+showchar.cmd: showchar.sh
+ echo extproc sh $(BINDIR)/$@ >$@
+ head -n 5 $? >>$@
+ echo shift >>$@
+ tail -n +5 $? >>$@
+
+psmerge.cmd: psmerge.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixfmps.cmd: fixfmps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixmacps.cmd: fixmacps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) INCLUDE=$(INCLUDEDIR) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixpsditps.cmd: fixpsditps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixpspps.cmd: fixpspps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixscribeps.cmd: fixscribeps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixtpps.cmd: fixtpps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixwfwps.cmd: fixwfwps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixwpps.cmd: fixwpps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixwwps.cmd: fixwwps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixdlsrps.cmd: fixdlsrps.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+extractres.cmd: extractres.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+includeres.cmd: includeres.pl
+ $(PERL) maketext OS=$(OS) PERL=$(PERL) INCLUDE=$(INCLUDEDIR) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+epsffit.$(MANEXT): epsffit.man
+ $(PERL) maketext MAN="$(MANPAGES)" $? > $@
+
+psnup.$(MANEXT): psnup.man
+ $(PERL) maketext MAN="$(MANPAGES)" PAPER=$(PAPER) $? > $@
+
+psresize.$(MANEXT): psresize.man
+ $(PERL) maketext MAN="$(MANPAGES)" PAPER=$(PAPER) $? > $@
+
+psbook.$(MANEXT): psbook.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+psselect.$(MANEXT): psselect.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+pstops.$(MANEXT): pstops.man
+ $(PERL) maketext "MAN=$(MANPAGES)" PAPER=$(PAPER) $? > $@
+
+psmerge.$(MANEXT): psmerge.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixfmps.$(MANEXT): fixfmps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixmacps.$(MANEXT): fixmacps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $? > $@
+
+fixpsditps.$(MANEXT): fixpsditps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixpspps.$(MANEXT): fixpspps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixscribeps.$(MANEXT): fixscribeps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixtpps.$(MANEXT): fixtpps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixwfwps.$(MANEXT): fixwfwps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixwpps.$(MANEXT): fixwpps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixwwps.$(MANEXT): fixwwps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixdlsrps.$(MANEXT): fixdlsrps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+extractres.$(MANEXT): extractres.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+includeres.$(MANEXT): includeres.man
+ $(PERL) maketext "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $? > $@
+
+getafm.$(MANEXT): getafm.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+clean:
+ RM *.obj
+
+veryclean realclean: clean
+ RM $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.include install.man
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for %1 in ( $(BIN) ) do copy %1 $(BINDIR)
+
+install.script: $(PERLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for %1 in ( $(PERLSCRIPTS) ) do copy %1 $(SCRIPTDIR)
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for %1 in ( $(INCLUDES) ) do copy %1 $(INCLUDEDIR)
+
+install.man: $(MANPAGES)
+ -mkdir $(MANDIR)
+ @for %1 in ( $(MANPAGES) ); do copy %1 $(MANDIR)
+
diff --git a/Build/source/utils/psutils/Makefile.sc b/Build/source/utils/psutils/Makefile.sc
new file mode 100644
index 00000000000..d2b4c43818e
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.sc
@@ -0,0 +1,108 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under MSDOS
+
+OS = DOS
+
+BINDIR = \psutils
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = \psutils\include
+
+# Flags for Symantec C Compiler
+CC = sc
+CFLAGS = -DPAPER=\"$(PAPER)\" -DMSDOS -g
+
+BIN = psbook.exe psselect.exe pstops.exe epsffit.exe psnup.exe \
+ psresize.exe
+SHELLSCRIPTS =
+PERLSCRIPTS = \
+ \
+
+MANPAGES = \
+ \
+ \
+ \
+
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.obj: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.obj: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.obj: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.obj: epsffit.c pserror.h patchlev.h
+
+epsffit.exe: epsffit.obj pserror.obj
+ $(CC) -oEXE(epsffit) pserror.obj epsffit.obj
+
+psnup.exe: psnup.obj psutil.obj psspec.obj pserror.obj
+ $(CC) -oEXE(psnup) psutil.obj psspec.obj pserror.obj psnup.obj
+
+psnup.obj: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize.exe: psresize.obj psutil.obj pserror.obj psspec.obj
+ $(CC) -oEXE(psresize) psutil.obj psspec.obj pserror.obj psresize.obj
+
+psresize.obj: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook.exe: psbook.obj psutil.obj pserror.obj
+ $(CC) -oEXE(psbook) psutil.obj pserror.obj psbook.obj
+
+psbook.obj: psutil.h patchlev.h pserror.h psbook.c
+
+psselect.exe: psselect.obj psutil.obj pserror.obj
+ $(CC) -oEXE(psselect) psutil.obj pserror.obj psselect.obj
+
+psselect.obj: psutil.h patchlev.h pserror.h psselect.c
+
+pstops.exe: pstops.obj psutil.obj psspec.obj pserror.obj
+ $(CC) -oEXE(pstops) psutil.obj psspec.obj pserror.obj pstops.obj
+
+pstops.obj: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+
+
+clean:
+ del *.obj
+
+veryclean realclean: clean
+ del $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.include
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for %1 in ( $(BIN) ) do copy %1 $(BINDIR)
+
+install.script: $(PERLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for %1 in ( $(PERLSCRIPTS) ) do copy %1 $(SCRIPTDIR)
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for %1 in ( $(INCLUDES) ) do copy %1 $(INCLUDEDIR)
+
diff --git a/Build/source/utils/psutils/Makefile.unix b/Build/source/utils/psutils/Makefile.unix
new file mode 100644
index 00000000000..11c7ef311fb
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.unix
@@ -0,0 +1,250 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under Unix
+
+OS = UNIX
+
+BINDIR = /usr/local/bin
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = /usr/local/share/psutils
+PERL = /usr/local/bin/perl
+
+BINMODE = 0755
+MANMODE = 0644
+CHMOD = chmod
+INSTALL = install -c -m $(BINMODE)
+INSTALLMAN = install -c -m $(MANMODE)
+MANEXT = 1
+MANDIR = /usr/local/share/man/man$(MANEXT)
+
+CFLAGS = -DPAPER=\"$(PAPER)\" -DUNIX -O
+
+BIN = psbook psselect pstops epsffit psnup \
+ psresize
+SHELLSCRIPTS = getafm showchar
+PERLSCRIPTS = fixfmps fixmacps fixpsditps fixpspps \
+ fixtpps fixwfwps fixwpps fixscribeps fixwwps \
+ fixdlsrps extractres includeres psmerge
+MANPAGES = psbook.$(MANEXT) psselect.$(MANEXT) pstops.$(MANEXT) epsffit.$(MANEXT) psnup.$(MANEXT) \
+ psresize.$(MANEXT) psmerge.$(MANEXT) fixscribeps.$(MANEXT) getafm.$(MANEXT) \
+ fixdlsrps.$(MANEXT) fixfmps.$(MANEXT) fixmacps.$(MANEXT) fixpsditps.$(MANEXT) \
+ fixpspps.$(MANEXT) fixtpps.$(MANEXT) fixwfwps.$(MANEXT) fixwpps.$(MANEXT) \
+ fixwwps.$(MANEXT) extractres.$(MANEXT) includeres.$(MANEXT)
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.o: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.o: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.o: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.o: epsffit.c pserror.h patchlev.h
+
+epsffit: epsffit.o pserror.o
+ $(CC) $(CCFLAGS) -o epsffit pserror.o epsffit.o
+
+psnup: psnup.o psutil.o psspec.o pserror.o
+ $(CC) $(CCFLAGS) -o psnup psutil.o psspec.o pserror.o psnup.o
+
+psnup.o: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize: psresize.o psutil.o pserror.o psspec.o
+ $(CC) $(CCFLAGS) -o psresize psutil.o psspec.o pserror.o psresize.o
+
+psresize.o: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook: psbook.o psutil.o pserror.o
+ $(CC) $(CCFLAGS) -o psbook psutil.o pserror.o psbook.o
+
+psbook.o: psutil.h patchlev.h pserror.h psbook.c
+
+psselect: psselect.o psutil.o pserror.o
+ $(CC) $(CCFLAGS) -o psselect psutil.o pserror.o psselect.o
+
+psselect.o: psutil.h patchlev.h pserror.h psselect.c
+
+pstops: pstops.o psutil.o psspec.o pserror.o
+ $(CC) $(CCFLAGS) -o pstops psutil.o psspec.o pserror.o pstops.o
+
+pstops.o: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+getafm: getafm.sh
+ cp $? $@
+
+showchar: showchar.sh
+ cp $? $@
+
+psmerge: psmerge.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixfmps: fixfmps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixmacps: fixmacps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" INCLUDE=$(INCLUDEDIR) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixpsditps: fixpsditps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixpspps: fixpspps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixscribeps: fixscribeps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixtpps: fixtpps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixwfwps: fixwfwps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixwpps: fixwpps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixwwps: fixwwps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+fixdlsrps: fixdlsrps.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+extractres: extractres.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+includeres: includeres.pl
+ $(PERL) maketext OS=$(OS) PERL="$(PERL)" INCLUDE=$(INCLUDEDIR) $? > $@
+ $(CHMOD) $(BINMODE) $@
+
+epsffit.$(MANEXT): epsffit.man
+ $(PERL) maketext MAN="$(MANPAGES)" $? > $@
+
+psnup.$(MANEXT): psnup.man
+ $(PERL) maketext MAN="$(MANPAGES)" PAPER=$(PAPER) $? > $@
+
+psresize.$(MANEXT): psresize.man
+ $(PERL) maketext MAN="$(MANPAGES)" PAPER=$(PAPER) $? > $@
+
+psbook.$(MANEXT): psbook.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+psselect.$(MANEXT): psselect.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+pstops.$(MANEXT): pstops.man
+ $(PERL) maketext "MAN=$(MANPAGES)" PAPER=$(PAPER) $? > $@
+
+psmerge.$(MANEXT): psmerge.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixfmps.$(MANEXT): fixfmps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixmacps.$(MANEXT): fixmacps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $? > $@
+
+fixpsditps.$(MANEXT): fixpsditps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixpspps.$(MANEXT): fixpspps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixscribeps.$(MANEXT): fixscribeps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixtpps.$(MANEXT): fixtpps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixwfwps.$(MANEXT): fixwfwps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixwpps.$(MANEXT): fixwpps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixwwps.$(MANEXT): fixwwps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+fixdlsrps.$(MANEXT): fixdlsrps.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+extractres.$(MANEXT): extractres.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+includeres.$(MANEXT): includeres.man
+ $(PERL) maketext "MAN=$(MANPAGES)" INCLUDE=$(INCLUDEDIR) $? > $@
+
+getafm.$(MANEXT): getafm.man
+ $(PERL) maketext "MAN=$(MANPAGES)" $? > $@
+
+clean:
+ rm -f *.o
+
+veryclean realclean: clean
+ rm -f $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.man install.include
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for i in $(BIN); do \
+ echo Installing $$i; \
+ $(INSTALL) $$i $(BINDIR); \
+ $(CHMOD) u+w $(BINDIR)/$$i; \
+ done
+
+install.script: $(PERLSCRIPTS) $(SHELLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for i in $(PERLSCRIPTS) $(SHELLSCRIPTS); do \
+ echo Installing $$i; \
+ $(INSTALL) $$i $(SCRIPTDIR); \
+ $(CHMOD) u+w $(SCRIPTDIR)/$$i; \
+ done
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for i in $(INCLUDES); do \
+ echo Installing $$i; \
+ $(INSTALLMAN) $$i $(INCLUDEDIR); \
+ $(CHMOD) u+w $(INCLUDEDIR)/$$i; \
+ done
+
+install.man: $(MANPAGES)
+ -mkdir $(MANDIR)
+ @for i in $(MANPAGES); do \
+ echo Installing manual page for $$i; \
+ $(INSTALLMAN) $$i $(MANDIR)/$$i; \
+ done
+
diff --git a/Build/source/utils/psutils/Makefile.wat b/Build/source/utils/psutils/Makefile.wat
new file mode 100644
index 00000000000..71e289d6742
--- /dev/null
+++ b/Build/source/utils/psutils/Makefile.wat
@@ -0,0 +1,108 @@
+# Makefile for PS utilities release 1 patchlevel 17
+#
+# Copyright (C) Angus J. C. Duggan 1991-1996
+# See file LICENSE for details.
+#
+# updated AJCD 3/1/96
+#
+# Multiple makefiles for different OSes are generated from a single master
+# now.
+#
+# There are so many incompatible makes around that putting all of the
+# non-standard targets explicitly seems to be the only way of ensuring
+# portability.
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+# psresize scales and moves pages to fit on different paper sizes
+
+PAPER=a4
+
+# Makefile for PSUtils under MSDOS
+
+OS = DOS
+
+BINDIR = \psutils
+SCRIPTDIR = $(BINDIR)
+INCLUDEDIR = \psutils\include
+
+# Flags for Watcom C Compiler
+CC = wcc386
+CFLAGS = -dPAPER=\"$(PAPER)\" -dMSDOS -zq -oxt
+
+BIN = psbook.exe psselect.exe pstops.exe epsffit.exe psnup.exe \
+ psresize.exe
+SHELLSCRIPTS =
+PERLSCRIPTS = \
+ \
+
+MANPAGES = \
+ \
+ \
+ \
+
+INCLUDES = md68_0.ps md71_0.ps
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(SHELLSCRIPTS)
+
+psutil.obj: psutil.h patchlev.h pserror.h psutil.c
+
+psspec.obj: psutil.h patchlev.h psspec.h pserror.h psspec.c
+
+pserror.obj: psutil.h patchlev.h pserror.h pserror.c
+
+epsffit.obj: epsffit.c pserror.h patchlev.h
+
+epsffit.exe: epsffit.obj pserror.obj
+ wcc386 -epsffite=epsffit.exe pserror.obj epsffit.obj
+
+psnup.exe: psnup.obj psutil.obj psspec.obj pserror.obj
+ wcc386 -psnupe=psnup.exe psutil.obj psspec.obj pserror.obj psnup.obj
+
+psnup.obj: psutil.h patchlev.h psspec.h pserror.h psnup.c
+
+psresize.exe: psresize.obj psutil.obj pserror.obj psspec.obj
+ wcc386 -psresizee=psresize.exe psutil.obj psspec.obj pserror.obj psresize.obj
+
+psresize.obj: psutil.h patchlev.h psspec.h pserror.h psresize.c
+
+psbook.exe: psbook.obj psutil.obj pserror.obj
+ wcc386 -psbooke=psbook.exe psutil.obj pserror.obj psbook.obj
+
+psbook.obj: psutil.h patchlev.h pserror.h psbook.c
+
+psselect.exe: psselect.obj psutil.obj pserror.obj
+ wcc386 -psselecte=psselect.exe psutil.obj pserror.obj psselect.obj
+
+psselect.obj: psutil.h patchlev.h pserror.h psselect.c
+
+pstops.exe: pstops.obj psutil.obj psspec.obj pserror.obj
+ wcc386 -pstopse=pstops.exe psutil.obj psspec.obj pserror.obj pstops.obj
+
+pstops.obj: psutil.h patchlev.h psspec.h pserror.h pstops.c
+
+
+
+clean:
+ del *.obj
+
+veryclean realclean: clean
+ del $(BIN) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.bin install.script install.include
+
+install.bin: $(BIN)
+ -mkdir $(BINDIR)
+ @for %1 in ( $(BIN) ) do copy %1 $(BINDIR)
+
+install.script: $(PERLSCRIPTS)
+ -mkdir $(SCRIPTDIR)
+ @for %1 in ( $(PERLSCRIPTS) ) do copy %1 $(SCRIPTDIR)
+
+install.include: $(INCLUDES)
+ -mkdir $(INCLUDEDIR)
+ @for %1 in ( $(INCLUDES) ) do copy %1 $(INCLUDEDIR)
+
diff --git a/Build/source/utils/psutils/README b/Build/source/utils/psutils/README
new file mode 100644
index 00000000000..cc2018357d4
--- /dev/null
+++ b/Build/source/utils/psutils/README
@@ -0,0 +1,245 @@
+PostScript Utilities Angus Duggan 9th March 1997
+
+This archive contains some utilities for manipulating PostScript documents.
+Page selection and rearrangement are supported, including arrangement into
+signatures for booklet printing, and page merging for n-up printing.
+
+ENVIRONMENT
+
+These utilities have been compiled and run on Sun-3 and Sun-4 machines under
+SunOS Solaris 2.3, Solaris 2.1, 4.1.3, 4.1.2, 4.1.1 and 4.0.1, HP9000/375
+machines under HPUX 7.0 and HPUX 8.0, Sequent Symmetry machines under Dynix
+3.1.4 and PTX 3.2.0, IBM RS/6000, VAX/VMS, Decstation 3100 machines under
+Ultrix 4.0, SGI 4k5 under Irix 4.1 and 5.2, and x86 machines under MSDOS 6.0
+and Windows NT 3.5 and 4.0.
+
+FILES
+
+The files contained are:
+-rw-r--r-- 1 angus 2317 Jun 19 1995 LICENSE
+-rw-r--r-- 1 angus 2899 Mar 09 09:26 Makefile.bcc
+-rw-r--r-- 1 angus 2915 Mar 09 09:26 Makefile.msc
+-rw-r--r-- 1 angus 4135 Mar 09 09:26 Makefile.nt
+-rw-r--r-- 1 angus 7146 Mar 09 09:26 Makefile.os2
+-rw-r--r-- 1 angus 2895 Mar 09 09:26 Makefile.sc
+-rw-r--r-- 1 angus 6913 Mar 09 09:26 Makefile.unix
+-rw-r--r-- 1 angus 11345 Mar 09 09:20 README
+-rw-r--r-- 1 angus 678 Nov 02 1995 config.h
+-rw-r--r-- 1 angus 2373 Jun 19 1995 descrip.mms
+-rw-r--r-- 1 angus 5773 Mar 14 1996 epsffit.c
+-rw-r--r-- 1 angus 1291 Nov 02 1995 epsffit.man
+-rw-r--r-- 1 angus 1236 Nov 02 1995 extractres.man
+-rw-r--r-- 1 angus 2780 Nov 02 1995 extractres.pl
+-rw-r--r-- 1 angus 561 Nov 02 1995 fixdlsrps.man
+-rw-r--r-- 1 angus 1554 Nov 02 1995 fixdlsrps.pl
+-rw-r--r-- 1 angus 527 Nov 02 1995 fixfmps.man
+-rw-r--r-- 1 angus 556 Nov 02 1995 fixfmps.pl
+-rw-r--r-- 1 angus 644 Nov 02 1995 fixmacps.man
+-rw-r--r-- 1 angus 2170 Nov 02 1995 fixmacps.pl
+-rw-r--r-- 1 angus 556 Nov 02 1995 fixpsditps.man
+-rw-r--r-- 1 angus 655 Nov 02 1995 fixpsditps.pl
+-rw-r--r-- 1 angus 523 Nov 02 1995 fixpspps.man
+-rw-r--r-- 1 angus 1298 Nov 02 1995 fixpspps.pl
+-rw-r--r-- 1 angus 531 Nov 02 1995 fixscribeps.man
+-rw-r--r-- 1 angus 434 Nov 02 1995 fixscribeps.pl
+-rw-r--r-- 1 angus 553 Nov 02 1995 fixtpps.man
+-rw-r--r-- 1 angus 663 Nov 02 1995 fixtpps.pl
+-rw-r--r-- 1 angus 547 Nov 02 1995 fixwfwps.man
+-rw-r--r-- 1 angus 826 Nov 02 1995 fixwfwps.pl
+-rw-r--r-- 1 angus 533 Nov 02 1995 fixwpps.man
+-rw-r--r-- 1 angus 699 Nov 02 1995 fixwpps.pl
+-rw-r--r-- 1 angus 531 Nov 02 1995 fixwwps.man
+-rw-r--r-- 1 angus 383 Nov 02 1995 fixwwps.pl
+-rw-r--r-- 1 angus 711 Apr 06 1995 getafm.man
+-rwxr-xr-x 1 angus 6482 Jun 19 1995 getafm.sh
+-rw-r--r-- 1 angus 1107 Nov 02 1995 includeres.man
+-rw-r--r-- 1 angus 1435 Nov 02 1995 includeres.pl
+-rw-r--r-- 1 angus 1901 Jan 03 1996 maketext
+-rw-r--r-- 1 angus 31406 Jun 19 1995 md68_0.ps
+-rw-r--r-- 1 angus 35734 Jun 19 1995 md71_0.ps
+-rw-r--r-- 1 angus 132 Nov 02 1995 patchlev.h
+-rw-r--r-- 1 angus 2875 Nov 02 1995 psbook.c
+-rw-r--r-- 1 angus 1156 Nov 02 1995 psbook.man
+-rw-r--r-- 1 angus 3201 Nov 02 1995 pserror.c
+-rw-r--r-- 1 angus 561 Nov 02 1995 pserror.h
+-rw-r--r-- 1 angus 957 Nov 02 1995 psmerge.man
+-rw-r--r-- 1 angus 2028 Nov 02 1995 psmerge.pl
+-rw-r--r-- 1 angus 10396 Nov 02 1995 psnup.c
+-rw-r--r-- 1 angus 4002 Nov 02 1995 psnup.man
+-rw-r--r-- 1 angus 5379 Nov 02 1995 psresize.c
+-rw-r--r-- 1 angus 1696 Nov 02 1995 psresize.man
+-rw-r--r-- 1 angus 6096 Jun 05 1996 psselect.c
+-rw-r--r-- 1 angus 2117 Mar 09 09:12 psselect.man
+-rw-r--r-- 1 angus 7784 Dec 06 1995 psspec.c
+-rw-r--r-- 1 angus 877 Feb 21 1996 psspec.h
+-rw-r--r-- 1 angus 5159 Nov 02 1995 pstops.c
+-rw-r--r-- 1 angus 4091 Nov 02 1995 pstops.man
+-rw-r--r-- 1 angus 9323 Mar 04 13:41 psutil.c
+-rw-r--r-- 1 angus 1494 Nov 02 1995 psutil.h
+-rwxr-xr-x 1 angus 2685 Jun 19 1995 showchar.sh
+
+
+PROGRAMS
+
+psbook rearranges pages into signatures
+psselect selects pages and page ranges
+pstops performs general page rearrangement and selection
+psnup put multiple pages per physical sheet of paper
+psresize alter document paper size
+epsffit fits an EPSF file to a given bounding box
+
+psselect in modeled after Chris Torek's dviselect program, and pstops is
+modeled after Tom Rokicki's dvidvi program. psbook is modeled on my own
+dvibook program, which borrows heavily from Chris Torek's dviselect.
+
+SCRIPTS
+
+getafm (sh) outputs PostScript to retrieve AFM file from printer
+showchar (sh) outputs PostScript to draw a character with metric info
+fixdlsrps (perl) filter to fix DviLaser/PS output so that PSUtils works
+fixfmps (perl) filter to fix framemaker documents so that psselect etc. work
+fixmacps (perl) filter to fix Macintosh documents with saner version of md
+fixpsditps (perl) filter to fix Transcript psdit documents to work with PSUtils
+fixpspps (perl) filter to fix PSPrint PostScript so that psselect etc. work
+fixscribeps (perl) filter to fix Scribe PostScript so that psselect etc. work
+fixtpps (perl) filter to fix Troff Tpscript documents
+fixwfwps (perl) filter to fix Word for Windows documents for PSUtils
+fixwpps (perl) filter to fix WordPerfect documents for PSUtils
+fixwwps (perl) filter to fix Windows Write documents for PSUtils
+extractres (perl) filter to extract resources from PostScript files
+includeres (perl) filter to include resources into PostScript files
+psmerge (perl) hack script to merge multiple PostScript files
+
+INSTALLATION
+
+UUdecode md71_0.uue and md68_0.uue (if supplied encoded). Copy the most
+appropriate makefile to "Makefile", and edit the copy to put in required paths
+for BINDIR, SCRIPTDIR, MANDIR, INCLUDEDIR, and PERL. Alter values of MANEXT to
+put the manual pages in a different section if desired, change PAPER to set
+the default paper size, "make", and "make install".
+
+BUGS
+
+The utilities don't check for PS-Adobe-?.? conformance; they assume documents
+conform. Utilities need an extra save/restore around whole document on a
+SPARCPrinter with NeWSPrint 1.0, because of bugs in the xnews server.
+
+Bug fixes and suggestions to angus@harlequin.co.uk
+
+UPDATES
+
+The definitive archive sites for PSUtils updates are ftp.dcs.ed.ac.uk, in the
+directory pub/ajcd/, and ftp.tardis.ed.ac.uk, in the directory users/ajcd. The
+latest version will be in psutils.tar.gz older versions may also be in
+psutils-*.tar.gz
+
+NOTE
+
+This is an interim release; these utilities are currently being re-written
+from scratch, with a full DSC-3.0 parser and more extraction, merging, and
+inclusion options included.
+
+WINDOWS USERS
+
+*Please* make sure that you have selected "Generate DSC Comments" in your
+printer driver setup. These utilities need DSC comments to tell where page
+boundaries are.
+
+DVIPS USERS
+
+The latest versions of dvips have changed the default setting of the DSC
+comment flag; you must generate with DSC comments for PSUtils to work.
+
+ACKNOWLEDGEMENTS
+
+Bug fixes and suggestions for improvements to PSUtils have come from many
+people, including:
+
+ Brian Colfer brianc@labmed.ucsf.edu
+ Charles A. Finnell finnell@org.mitre.lear
+ Conrad Kimball cek@com.boeing.sdc
+ J.W.Hawtin
+ Jochen Schwarze schwarze@de.isa
+ Ken Carpenter khc@edu.ksu.eece
+ Kristian Jorg etxkrjg@se.ericsson.solsta
+ Larry Weissman larryw@nsr.bioeng.washington.edu
+ Michael L. Brown brown@wi.extrel.com
+ Hunter Goatley goathunter@wkuvx1.bitnet
+ John Interrante interran@uluru.Stanford.edu
+ Maurizio Cremonesi MAUCREM@imiclvx.earn
+ Matthew Stier Matthew.Stier@East.Sun.com
+ Gerry Pratt cca13@seq1.kl.ac.uk
+ Robert Joop rj@rainbow.in-berlin.de
+ Johan Vromans jv@mh.nl
+ Bryan Faubion bryanf@tc.fluke.com
+ Chris Ritson C.R.Ritson@ncl.ac.uk
+ Michele Marziani MARZIANI@VAXFE.INFN.IT
+ Michael I. Schwartz mschwart@diana.cair.du.edu
+ Chris Ritson C.R.Ritson@newcastle.ac.uk
+ Joerg Eisenreich
+ Anreas Borchert borchert@mathematik.uni-ulm.de
+ Mike Coleman
+ Dale Scheetz dwarf@polaris.net
+ Yves Arrouye arrouye@marin.fdn.fr
+
+(Apologies to anyone who I have left out, it was not intentional.)
+
+NEWS
+
+Patchlevel 11 contains some significant enhancements to PSUtils, in
+preparation for the eventual release of version 2 (don't hold your breath
+waiting for it). These include:
+
+* Specify paper sizes by name for pstops and psnup.
+* Psnup re-written in C to be much more versatile (do any number n-up).
+* Epsffit can input broken %%BoundingBox comments which use real numbers.
+* Should work on MSDOS and VMS machines as well as Unix.
+* Accept more DSC compliant documents (Page labels are better supported).
+
+Patchlevel 12 was a bug-fix release.
+
+* Long standing fixmacps bug fixed.
+* fixwfwps fixes WFW EPSF files as well as DSC files.
+* md71_0.ps and md68_0.ps files were automatically uudecoded.
+
+Patchlevel 13 contained two new scripts for resource management, and fixes to
+the Makefile, page labels, and output chaining.
+
+* Epsffit can output to a file as well as standard output.
+* extractres takes resources out of PostScript files and saves them
+* includeres puts resources from a resource library into PostScript files.
+* maketext script is now used to do substitutions in Perl scripts and man pages
+* page labels in psnup and pstops now show where pages came from.
+* page labels in psbook and psselect fixed.
+* prologues fixed to be extractable and re-usable
+* Makefile doesn't use SUFFIXES any more
+* pstops and psnup output can now be chained through each other.
+* psresize alters the paper size used by a document
+* patchlevel.h shortened to patchlev.h as a concession to MSDOS
+* psnup now has -n nup form for compatibility with other n-up programs
+
+Patchlevel 14 has some minor bug fixes.
+
+* psselect can take end-relative page ranges
+* Makefiles restructured to generate machine specific versions from one source
+* MSDOS, Windows NT and OS/2 support
+* corrections to psbook output for empty pages when rearranging pstops output
+
+Patchlevel 15 was a stabilisation release
+
+* All code converted to ANSI C, improved error and warning procedures
+* Portability fixes in the Makefiles
+* psnup can take different sized input and output pages
+* Minor fixes to fixwpps script
+* psselect reversed pages fixed
+* maketext and fix scripts updated for Perl 5
+
+Patchlevel 16 was a minor bugfix release
+
+* Piped output and input works correctly in NT
+
+Patchlevel 17 had some minor bugfixes and improvements
+
+* Trailer information now put before %%EOF comments if no %%Trailer
+* psselect can now add blank pages.
+* Piped input works in Linux
diff --git a/Build/source/utils/psutils/config.h b/Build/source/utils/psutils/config.h
new file mode 100644
index 00000000000..13562326755
--- /dev/null
+++ b/Build/source/utils/psutils/config.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ * OS specific configuration for PSUtils
+ */
+
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+#define TMPDIR "\\tmp"
+#define OPEN_READ "rb"
+#define OPEN_WRITE "wb"
+#include <fcntl.h>
+#include <io.h>
+#ifdef WIN32
+#include <win32lib.h>
+#endif /* WIN32 */
+#else /* ! MSDOS && ! WINNT && ! WIN32 */
+#if defined(OS2)
+#define TMPDIR "."
+#define OPEN_READ "rb"
+#define OPEN_WRITE "wb"
+#else /* ! OS2 */
+#define OPEN_READ "r"
+#define OPEN_WRITE "w"
+#ifdef VMS
+#define unlink delete
+#define TMPDIR "/tmp"
+#else /* assumes UNIX-like OS */
+#include <unistd.h>
+#define TMPDIR "/tmp"
+#endif /* ! VMS */
+#endif /* ! OS2 */
+#endif /* ! MSDOS && ! WINNT && !WIN32 */
+
diff --git a/Build/source/utils/psutils/configure b/Build/source/utils/psutils/configure
new file mode 100755
index 00000000000..f9674a24d46
--- /dev/null
+++ b/Build/source/utils/psutils/configure
@@ -0,0 +1,1317 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-multiplatform put executables in bin/PLATFORM"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=psutil.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in ../../config $srcdir/../../config; do
+ if test -f $ac_dir/install-sh; then
+ case $ac_dir in
+ /*|[A-z]:/*) ac_aux_dir=$ac_dir;;
+ *) ac_aux_dir=`pwd`/$ac_dir;;
+ esac
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ case $ac_dir in
+ /*|[A-z]:/*) ac_aux_dir=$ac_dir;;
+ *) ac_aux_dir=`pwd`/$ac_dir;;
+ esac
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in ../../config $srcdir/../../config" 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:557: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:588: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:640: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:673: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 684 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:715: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:720: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:729: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:748: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:780: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 795 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:801: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 812 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:818: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 829 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:835: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:860: checking for POSIXized ISC" >&5
+if test -d /etc/conf/kconfig.d &&
+ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+ echo "$ac_t""yes" 1>&6
+ ISC=yes # If later tests want to check for ISC.
+ cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+ if test "$GCC" = yes; then
+ CC="$CC -posix"
+ else
+ CC="$CC -Xp"
+ fi
+else
+ echo "$ac_t""no" 1>&6
+ ISC=
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:892: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ # Hack for MSDOS and descendants.
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test $ac_x $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:947: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:981: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+# Check whether --enable-multiplatform or --disable-multiplatform was given.
+if test "${enable_multiplatform+set}" = set; then
+ enableval="$enable_multiplatform"
+ if test "x$enable_multiplatform" = xyes &&
+ test "x$bindir" = 'x${exec_prefix}/bin'
+then
+ bindir="$bindir/$host"
+fi
+fi
+
+test "x$enable_multiplatform" = xyes && export enable_multiplatform
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012\015' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile patchlev.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile patchlev.h"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*|[A-z]:/*) # Absolute path.
+ srcdir="$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ "") ;;
+ [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
+ # Replace lines of the form ac_include foo with the contents of foo:
+ # first, from the ac_include lines construct a list of file names.
+ # From that list, we construct a second list of those files that exist.
+ # Then we construct lists of sed commands for including those files,
+ # and a sed command that removes the ac_include lines. We don't attempt
+ # to read non-existent files because some (buggy) versions of sed choke
+ # on this. Have to use sed because old (Ultrix, SunOS) awk does not support
+ # getline or system. (Anyway, configure scripts aren't supposed to use awk.)
+ # Can't use only one -e and commands {dr foo} because foo has to be last.
+ # Be careful, because the filename may contain /. Be careful with
+ # whitespace; we need to use echo.
+ #
+ # No support for the multiple-output file :-separated stuff.
+ #
+ file_substs=`sed -n \
+'/^ac_include/s%ac_include[ ]*\(.*\)%\1%p' \
+ "$ac_given_srcdir/$ac_file_in"`
+ # Create the sed command line ...
+ file_subst_cmd='sed'
+ for ac_inc in $file_substs; do
+ if test -f "$ac_given_srcdir/$ac_inc"; then
+ ac_mung=`echo $ac_inc | sed 's,/,%,g'`
+ file_subst_cmd="$file_subst_cmd -e '/^ac_include $ac_mung$/r $ac_inc'"
+ fi
+ done
+ file_subst_cmd="$file_subst_cmd -e '/^ac_include/d'"
+ # ... and fix the whitespace and escaped slashes.
+ file_subst_cmd=`echo "$file_subst_cmd" | sed -e 's,%,\\\/,g' \
+-e 's/ac_include /ac_include[ ]*/g'`
+ # cd into the srcdir because the files being included more or less
+ # must be part of the distribution. I can't find any way to do
+ # variable substitution in the sed commands (so the user could have,
+ # e.g., $top_srcdir in their ac_include line).
+ (cd $ac_given_srcdir && eval $file_subst_cmd $ac_file_in) \
+ | sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/Build/source/utils/psutils/configure.in b/Build/source/utils/psutils/configure.in
new file mode 100644
index 00000000000..31a1999d864
--- /dev/null
+++ b/Build/source/utils/psutils/configure.in
@@ -0,0 +1,14 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(psutil.c)
+
+AC_CONFIG_AUX_DIR(../../config)
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_ISC_POSIX
+AC_PROG_INSTALL
+AC_SET_MAKE
+
+sinclude(../../multiplatform.ac)
+
+AC_OUTPUT(Makefile patchlev.h)
diff --git a/Build/source/utils/psutils/depend.mak b/Build/source/utils/psutils/depend.mak
new file mode 100644
index 00000000000..f658d60aa68
--- /dev/null
+++ b/Build/source/utils/psutils/depend.mak
@@ -0,0 +1,58 @@
+$(objdir)/psutil.obj: \
+ psutil.h \
+ config.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/psselect.obj: \
+ psutil.h \
+ config.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/psspec.obj: \
+ psutil.h \
+ config.h \
+ psspec.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/psresize.obj: \
+ psutil.h \
+ config.h \
+ psspec.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/pserror.obj: \
+ psutil.h \
+ config.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/psnup.obj: \
+ psutil.h \
+ config.h \
+ psspec.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/pstops.obj: \
+ psutil.h \
+ config.h \
+ psspec.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/psbook.obj: \
+ psutil.h \
+ config.h \
+ pserror.h \
+ patchlev.h
+
+$(objdir)/epsffit.obj: \
+ psutil.h \
+ config.h \
+ pserror.h \
+ patchlev.h
+
diff --git a/Build/source/utils/psutils/descrip.mms b/Build/source/utils/psutils/descrip.mms
new file mode 100644
index 00000000000..f3f98e5cdac
--- /dev/null
+++ b/Build/source/utils/psutils/descrip.mms
@@ -0,0 +1,63 @@
+#
+# VMS MMS build file for PS utilities
+#
+# Hunter Goatley, 16-MAR-1993 14:47
+#
+CFLAGS = /NOLIST/OBJECT=$(MMS$TARGET)
+LFLAGS = /NOTRACE/EXEC=$(MMS$TARGET)
+
+.IFDEF __ALPHA__ #If building with Alpha cross-compilers, OBJ
+OPTIONS_FILE = #... is defined already
+LINKOPT =
+CFLAGS = /NOLIST/OBJECT=$(MMS$TARGET)/STANDARD=VAXC
+.ELSE
+OBJ = .OBJ
+EXE = .EXE
+OPTIONS_FILE = ,VAXC.OPT
+LINKOPT = $(options_file)/OPTIONS
+.ENDIF
+
+# epsffit fits an epsf file to a given bounding box
+# psbook rearranges pages into signatures
+# psselect selects page ranges
+# pstops performs general page rearrangement and merging
+# psnup puts multiple logical pages on one physical page
+
+all : psbook$(exe), psselect$(exe), pstops$(exe), epsffit$(exe), psnup$(exe), psresize$(exe)
+ @ write sys$output "PSUTILS build complete"
+
+epsffit$(exe) : epsffit$(obj), pserror$(obj)
+ $(LINK)$(LFLAGS) epsffit$(obj),pserror$(obj)$(linkopt)
+
+psnup$(exe) : psnup$(obj), psutil$(obj), psspec$(obj), pserror$(obj)
+ $(LINK)$(LFLAGS) psnup$(obj),psutil$(obj),psspec$(obj),pserror$(obj)$(linkopt)
+
+psresize$(exe) : psresize$(obj), psutil$(obj), psspec$(obj), pserror$(obj)
+ $(LINK)$(LFLAGS) psresize$(obj),psutil$(obj),psspec$(obj),pserror$(obj)$(linkopt)
+
+psbook$(exe) : psbook$(obj), psutil$(obj)$(options_file), pserror$(obj)
+ $(LINK)$(LFLAGS) psbook$(obj),psutil$(obj),pserror$(obj)$(linkopt)
+
+psselect$(exe) : psselect$(obj), psutil$(obj), pserror$(obj)
+ $(LINK)$(LFLAGS) psselect$(obj),psutil$(obj),pserror$(obj)$(linkopt)
+
+pstops$(exe) : pstops$(obj), psutil$(obj), psspec$(obj), pserror$(obj)
+ $(LINK)$(LFLAGS) pstops$(obj),psutil$(obj),psspec$(obj),pserror$(obj)$(linkopt)
+
+psnup$(obj) : psnup.c, psutil.h patchlev.h psspec.h pserror.h
+
+psresize$(obj) : psresize.c, psutil.h patchlev.h psspec.h pserror.h
+
+psbook$(obj) : psbook.c, psutil.h patchlev.h pserror.h
+
+pstops$(obj) : pstops.c, psutil.h patchlev.h psspec.h pserror.h
+
+psutil$(obj) : psutil.c, psutil.h patchlev.h pserror.h
+
+psselect$(obj) : psselect.c, psutil.h patchlev.h pserror.h
+
+psspec$(obj) : psspec.c, psutil.h patchlev.h psspec.h pserror.h
+
+clean :
+ delete/log *$(obj);*,psnup$(exe);*,psresize$(exe);*,psbook$(exe);*,-
+ psselect$(exe);*,pstops$(exe);*,epsffit$(exe);*
diff --git a/Build/source/utils/psutils/epsffit.c b/Build/source/utils/psutils/epsffit.c
new file mode 100644
index 00000000000..c31eaece28f
--- /dev/null
+++ b/Build/source/utils/psutils/epsffit.c
@@ -0,0 +1,190 @@
+/* epsffit.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * fit epsf file into constrained size
+ * Usage:
+ * epsffit [-c] [-r] [-a] [-s] llx lly urx ury [infile [outfile]]
+ * -c centres the image in the bounding box given
+ * -r rotates the image by 90 degrees anti-clockwise
+ * -a alters the aspect ratio to fit the bounding box
+ * -s adds a showpage at the end of the image
+ *
+ * Added filename spec (from Larry Weissman) 5 Feb 93
+ * Accepts double %%BoundingBox input, outputs proper BB, 4 Jun 93. (I don't
+ * like this; developers should read the Big Red Book before writing code which
+ * outputs PostScript.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "psutil.h"
+#include "pserror.h"
+#include "patchlev.h"
+#include "config.h"
+
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+char *program;
+
+static void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-c] [-r] [-a] [-s] llx lly urx ury [infile [outfile]]\n",
+ program);
+ exit(1);
+}
+
+void main(int argc, char **argv)
+{
+ int bbfound = 0; /* %%BoundingBox: found */
+ int urx, ury, llx, lly;
+ int furx, fury, fllx, flly;
+ int showpage = 0, centre = 0, rotate = 0, aspect = 0, maximise = 0;
+ char buf[BUFSIZ];
+ FILE *input;
+ FILE *output;
+
+ program = *argv++; argc--;
+
+ while (argc > 0 && argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'c': centre = 1; break;
+ case 's': showpage = 1; break;
+ case 'r': rotate = 1; break;
+ case 'a': aspect = 1; break;
+ case 'm': maximise = 1; break;
+ case 'v':
+ default: usage();
+ }
+ argc--;
+ argv++;
+ }
+
+ if (argc < 4 || argc > 6) usage();
+ fllx = atoi(argv[0]);
+ flly = atoi(argv[1]);
+ furx = atoi(argv[2]);
+ fury = atoi(argv[3]);
+
+ if (argc > 4) {
+ if(!(input = fopen(argv[4], OPEN_READ)))
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ } else {
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdin to binary mode\n");
+#endif
+ input = stdin ;
+ }
+
+ if (argc > 5) {
+ if(!(output = fopen(argv[5], OPEN_WRITE)))
+ message(FATAL, "can't open output file %s\n", argv[5]);
+ } else {
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+#endif
+ output = stdout ;
+ }
+
+ while (fgets(buf, BUFSIZ, input)) {
+ if (buf[0] == '%' && (buf[1] == '%' || buf[1] == '!')) {
+ /* still in comment section */
+ if (!strncmp(buf, "%%BoundingBox:", 14)) {
+ double illx, illy, iurx, iury; /* input bbox parameters */
+ if (sscanf(buf, "%%%%BoundingBox:%lf %lf %lf %lf\n",
+ &illx, &illy, &iurx, &iury) == 4) {
+ bbfound = 1;
+ llx = (int)illx; /* accept doubles, but convert to int */
+ lly = (int)illy;
+ urx = (int)(iurx+0.5);
+ ury = (int)(iury+0.5);
+ }
+ } else if (!strncmp(buf, "%%EndComments", 13)) {
+ strcpy(buf, "\n"); /* don't repeat %%EndComments */
+ break;
+ } else fputs(buf, output);
+ } else break;
+ }
+
+ if (bbfound) { /* put BB, followed by scale&translate */
+ int fwidth, fheight;
+ double xscale, yscale;
+ double xoffset = fllx, yoffset = flly;
+ double width = urx-llx, height = ury-lly;
+
+ if (maximise)
+ if ((width > height && fury-flly > furx-fllx) ||
+ (width < height && fury-flly < furx-fllx))
+ rotate = 1;
+
+ if (rotate) {
+ fwidth = fury - flly;
+ fheight = furx - fllx;
+ } else {
+ fwidth = furx - fllx;
+ fheight = fury - flly;
+ }
+
+ xscale = fwidth/width;
+ yscale = fheight/height;
+
+ if (!aspect) { /* preserve aspect ratio ? */
+ xscale = yscale = MIN(xscale,yscale);
+ }
+ width *= xscale; /* actual width and height after scaling */
+ height *= yscale;
+ if (centre) {
+ if (rotate) {
+ xoffset += (fheight - height)/2;
+ yoffset += (fwidth - width)/2;
+ } else {
+ xoffset += (fwidth - width)/2;
+ yoffset += (fheight - height)/2;
+ }
+ }
+ fprintf(output,
+ "%%%%BoundingBox: %d %d %d %d\n", (int)xoffset, (int)yoffset,
+ (int)(xoffset+(rotate ? height : width)),
+ (int)(yoffset+(rotate ? width : height)));
+ if (rotate) { /* compensate for original image shift */
+ xoffset += height + lly * yscale; /* displacement for rotation */
+ yoffset -= llx * xscale;
+ } else {
+ xoffset -= llx * xscale;
+ yoffset -= lly * yscale;
+ }
+ fputs("%%EndComments\n", output);
+ if (showpage)
+ fputs("save /showpage{}def /copypage{}def /erasepage{}def\n", output);
+ else
+ fputs("%%BeginProcSet: epsffit 1 0\n", output);
+ fputs("gsave\n", output);
+ fprintf(output, "%.3f %.3f translate\n", xoffset, yoffset);
+ if (rotate)
+ fputs("90 rotate\n", output);
+ fprintf(output, "%.3f %.3f scale\n", xscale, yscale);
+ if (!showpage)
+ fputs("%%EndProcSet\n", output);
+ }
+ do {
+ fputs(buf, output);
+ } while (fgets(buf, BUFSIZ, input));
+ if (bbfound) {
+ fputs("grestore\n", output);
+ if (showpage)
+ fputs("restore showpage\n", output); /* just in case */
+ } else
+ message(FATAL, "no %%%%BoundingBox:\n");
+
+ exit(0);
+}
diff --git a/Build/source/utils/psutils/epsffit.man b/Build/source/utils/psutils/epsffit.man
new file mode 100644
index 00000000000..9f1bf66beb1
--- /dev/null
+++ b/Build/source/utils/psutils/epsffit.man
@@ -0,0 +1,51 @@
+.TH EPSFFIT 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+epsffit \- fit encapsulated PostScript file (EPSF) into constrained size
+.SH SYNOPSIS
+.B epsffit
+[
+.B \-c
+] [
+.B \-r
+] [
+.B \-a
+] [
+.B \-m
+] [
+.B \-s
+]
+.I "llx lly urx ury"
+[
+.B infile
+[
+.B outfile
+] ]
+.SH DESCRIPTION
+.I Epsffit
+fits an EPSF file (encapsulated PostScript) to a given bounding box.
+The coordinates of the box are given by \fB(llx,lly)\fR for the lower
+left, and \fB(urx,ury)\fR for the upper right, in PostScript units (points).
+.PP
+If no input or output files are specified,
+.I epsffit
+read from the standard input and writes to the standard output.
+.SH OPTIONS
+.IP \fB\-c\fP 1i
+Center the image in the given bounding box.
+.IP \fB\-r\fP 1i
+Rotate the image by 90 degrees counter-clockwise.
+.IP \fB\-a\fP 1i
+Adjust the aspect ratio to fit the bounding box. The default is to preserve
+the aspect ratio.
+.IP \fB\-m\fP 1i
+Rotates the image to maximise the size if it would fit the specified bounding
+box better.
+.IP \fB\-s\fP 1i
+Add a \fIshowpage\fP at the end of the file to force the image to print.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/extractres.man b/Build/source/utils/psutils/extractres.man
new file mode 100644
index 00000000000..e0702233827
--- /dev/null
+++ b/Build/source/utils/psutils/extractres.man
@@ -0,0 +1,47 @@
+.TH EXTRACTRES 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+extractres \- filter to extract resources from a PostScript document
+.SH SYNOPSIS
+.B extractres
+[
+.B \-m
+] <
+.I document.ps
+>
+.I output.ps
+.SH DESCRIPTION
+.I Extractres
+extracts resources (fonts, procsets, patterns, files, etc) appearing in a
+PostScript document, and puts appropriate
+.I %%IncludeResource
+comments in the document prologue. The extracted resources are written to
+files with the same name as the resource, and an appropriate extension. The
+pipeline
+.sp
+.ce
+extractres file.ps | includeres >out.ps
+.sp
+will move all resources appearing in a document to the document prologue,
+removing redundant copies. The output file can then be put through page
+re-arrangement filters such as
+.I psnup
+or
+.I pstops
+safely.
+.PP
+The
+.B \-m
+option combines the resources of the same name into one file; this must be
+used for some programs which download fonts a bit at a time.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I extractres
+does not alter the
+.I %%DocumentSuppliedResources
+comments.
diff --git a/Build/source/utils/psutils/extractres.pl b/Build/source/utils/psutils/extractres.pl
new file mode 100644
index 00000000000..d7520c47d33
--- /dev/null
+++ b/Build/source/utils/psutils/extractres.pl
@@ -0,0 +1,96 @@
+@PERL@
+# extractres: extract resources from PostScript file
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$prog = ($0 =~ s=.*/==);
+
+%resources = (); # list of resources included
+%merge = (); # list of resources extracted this time
+%extn = ("font", ".pfa", "file", ".ps", "procset", ".ps", # resource extns
+ "pattern", ".pat", "form", ".frm", "encoding", ".enc");
+%type = ("%%BeginFile:", "file", "%%BeginProcSet:", "procset",
+ "%%BeginFont:", "font"); # resource types
+
+while (@ARGV) {
+ $_ = shift;
+ if (/^-m(erge)?$/) { $merge = 1; }
+ elsif (/^-/) {
+ print STDERR "Usage: $prog [-merge] [file]\n";
+ exit 1;
+ } else {
+ unshift(@ARGV, $_);
+ last;
+ }
+}
+
+if (defined($ENV{TMPDIR})) { # set body file name
+ $body = "$ENV{TMPDIR}/body$$.ps";
+} else {
+ $body = "body$$.ps";
+}
+
+open(BODY, $body) && die "Temporary file $body already exists";
+open(BODY, ">$body") || die "Can't write file $body";
+
+sub filename { # make filename for resource in @_
+ local($name);
+ foreach (@_) { # sanitise name
+ s/[!()\$\#*&\\\|\`\'\"\~\{\}\[\]\<\>\?]//g;
+ $name .= $_;
+ }
+ $name =~ s@.*/@@; # drop directories
+ die "Filename not found for resource ", join(" ", @_), "\n"
+ if $name =~ /^$/;
+ $name;
+}
+
+$output = STDOUT; # start writing header out
+while (<>) {
+ if (/^%%BeginResource:/ || /^%%BeginFont:/ || /^%%BeginProcSet:/) {
+ local($comment, @res) = split(/\s+/); # look at resource type
+ local($type) = defined($type{$comment}) ? $type{$comment} : shift(@res);
+ local($name) = &filename(@res, $extn{$type}); # make file name
+ $saveout = $output;
+ if (!$resources{$name}) {
+ print "%%IncludeResource: $type ", join(" ", @res), "\n";
+ if (!open(RES, $name)) {
+ open(RES, ">$name") || die "Can't write file $name";
+ $resources{$name} = $name;
+ $merge{$name} = $merge;
+ $output = RES;
+ } else { # resource already exists
+ close(RES);
+ undef $output;
+ }
+ } elsif ($merge{$name}) {
+ open(RES, ">>$name") || die "Can't append to file $name";
+ $output = RES;
+ } else { # resource already included
+ undef $output;
+ }
+ } elsif (/^%%EndResource/ || /^%%EndFont/ || /^%%EndProcSet/) {
+ if (defined $output) {
+ print $output $_;
+ close($output);
+ }
+ $output = $saveout;
+ next;
+ } elsif ((/^%%EndProlog/ || /^%%BeginSetup/ || /^%%Page:/)) {
+ $output = BODY;
+ }
+ print $output $_
+ if defined $output;
+}
+
+close(BODY); # close body output file
+
+open(BODY, $body); # reopen body for input
+while (<BODY>) { # print it all
+ print $_;
+}
+close(BODY);
+
+unlink($body); # dispose of body file
+@END@
diff --git a/Build/source/utils/psutils/fixdlsrps.man b/Build/source/utils/psutils/fixdlsrps.man
new file mode 100644
index 00000000000..d392691cc83
--- /dev/null
+++ b/Build/source/utils/psutils/fixdlsrps.man
@@ -0,0 +1,24 @@
+.TH FIXDLSRPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixdlsrps \- filter to fix DviLaser/PS documents to work with PSUtils
+.SH SYNOPSIS
+.B fixdlsrps
+<
+.I dvilaser.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixdlsrps
+is a
+.I perl
+filter which "fixes" PostScript generated from the DviLaser/PS driver so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixdlsrps.pl b/Build/source/utils/psutils/fixdlsrps.pl
new file mode 100644
index 00000000000..324109d1b50
--- /dev/null
+++ b/Build/source/utils/psutils/fixdlsrps.pl
@@ -0,0 +1,54 @@
+@PERL@
+# fixdlsrps: fix DviLaser/PS document to work with PSUtils
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$nesting = 0;
+$page = 1;
+$infont = 0;
+
+@fonts = ();
+@body = ();
+$header = 1;
+
+while (<>) {
+ if (/^XP/) {
+ $infont++;
+ push(@fonts, $_);
+ $infont-- if /PXL.*RP/ || /DN?F.*RP/;
+ } elsif ($infont) {
+ push(@fonts, $_);
+ $infont-- if /PXL.*RP/ || /DN?F.*RP/;
+ } elsif ((/^%%EndSetup/ || /^%%Page:/) && $header) {
+ print @body;
+ @body = ("%%EndSetup\n");
+ $header = 0;
+ } elsif (/^%%EndProlog/ && !$nesting) {
+ push(@body,
+ "\$DviLaser begin/GlobalMode{}bdef/LocalMode{}bdef/XP{}def/RP{}def",
+ "/DoInitialScaling{72.0 Resolution div dup scale}bdef end\n", $_);
+ } elsif (/^%%BeginPageSetup/ && !$nesting) {
+ push(@body, "%%Page: $page $page\n", $_,
+ "Resolution 72 div dup scale Magnification 1000 div dup scale\n",
+ "/DocumentInitState where {\n",
+ "/DocumentInitState [ matrix currentmatrix currentlinewidth",
+ " currentlinecap currentlinejoin currentdash currentgray",
+ " currentmiterlimit] cvx put}if\n");
+ $page++;
+ } elsif (/^%%BeginDocument:/ || /^%%BeginBinary:/ || /^%%BeginFile:/) {
+ push(@body, $_);
+ $nesting++;
+ } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) {
+ push(@body, $_);
+ $nesting--;
+ } elsif (!/^%%PageBoundingBox:/ && !/^%%Page:/) {
+ push(@body, $_);
+ }
+}
+
+print @fonts;
+print @body;
+
+exit 0;
+@END@
diff --git a/Build/source/utils/psutils/fixfmps.man b/Build/source/utils/psutils/fixfmps.man
new file mode 100644
index 00000000000..2276cfd052e
--- /dev/null
+++ b/Build/source/utils/psutils/fixfmps.man
@@ -0,0 +1,24 @@
+.TH FIXFMPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixfmps \- filter to fix Framemaker documents so PSUtils work
+.SH SYNOPSIS
+.B fixfmps
+<
+.I Framemaker.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixfmps
+is a
+.I perl
+filter which "fixes" PostScript from Framemaker so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixfmps.pl b/Build/source/utils/psutils/fixfmps.pl
new file mode 100644
index 00000000000..f09a3c04b40
--- /dev/null
+++ b/Build/source/utils/psutils/fixfmps.pl
@@ -0,0 +1,21 @@
+@PERL@
+# fixfmps: get conforming PostScript out of FrameMaker version 2 file
+# move all FMDEFINEFONTs to start of pages
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+%fonts=();
+
+while (<>) {
+ if (/^([0-9]+) [0-9]+ .* FMDEFINEFONT$/) {
+ $fonts{$1} = $_;
+ } elsif (/^[0-9.]+ [0-9.]+ [0-9]+ FMBEGINPAGE$/) {
+ print $_, join('',values(%fonts));
+ } elsif (m%(.*/PageSize \[paperwidth paperheight\]put )setpagedevice(.*)%) {
+ print "$1pop$2\n";
+ } else {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/fixmacps.man b/Build/source/utils/psutils/fixmacps.man
new file mode 100644
index 00000000000..ce0ae891e66
--- /dev/null
+++ b/Build/source/utils/psutils/fixmacps.man
@@ -0,0 +1,27 @@
+.TH FIXMACPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixmacps \- filter to fix Macintosh documents with saner version of md
+.SH SYNOPSIS
+.B fixmacps
+<
+.I Macintosh.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixmacps
+is a
+.I perl
+filter which "fixes" PostScript generated from a Macintosh PC
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH FILES
+md68_0.ps, md71_0.ps - sanitised versions of the md
+prologue.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixmacps.pl b/Build/source/utils/psutils/fixmacps.pl
new file mode 100644
index 00000000000..9dcdb8517ce
--- /dev/null
+++ b/Build/source/utils/psutils/fixmacps.pl
@@ -0,0 +1,95 @@
+@PERL@
+# fixmacps: swap to sanitised appledict
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$line = 0; # keep line count
+$predir = `kpsewhich -progname=psutils md71_0.ps`;
+$dir=`basename $predir`;
+$prefix = "md";
+$default = "md71_0.ps";
+
+while ($_ = shift(@ARGV)) {
+ if (/^-d(ir)?$/) { $dir = shift(@ARGV); }
+ elsif (/^-n(ame)?$/) { $prefix = shift(@ARGV); }
+ else {
+ unshift(@ARGV, $_);
+ last;
+ }
+}
+
+%fonts = ();
+$nesting = 0;
+
+while (<>) {
+ if (/^%!/) {
+ if (! $line) {
+ print;
+ }
+ } elsif (/^%%(Begin|Include)ProcSet: "?\(AppleDict md\)"? ([0-9]+) ([0-9]+)$/) {
+ local($inc, $mdv, $mdr) = ($1, $2, $3);
+ if (open(SANE, "<$dir/$prefix${mdv}_$mdr.ps") ||
+ open(SANE, "<$dir/$default")) {
+ $sane = <SANE>;
+ local($snv, $snr) =
+ $sane =~ /^%%BeginProcSet: \(AppleDict md\) ([0-9]+) ([0-9]+)$/;
+ if ($mdv == $snv && $mdr == $snr) {
+ if ( $inc eq "Include" ) {
+ print STDERR "Inserting ProcSet \"(AppleDict md)\" $snv $snr\n";
+ print $sane;
+ while(<SANE>) {
+ print;
+ }
+ close(SANE);
+ }
+ else {
+ print STDERR "Substituting ProcSet \"(AppleDict md)\" $snv $snr\n";
+ $ignore = 1;
+ }
+ } else {
+ print STDERR "Unrecognised AppleDict version $mdv $mdr\n";
+ print "%!\n" if !$line;
+ print;
+ }
+ } else {
+ print STDERR "Can't find sanitised AppleDict\n";
+ print "%!\n" if !$line;
+ print;
+ }
+ } elsif (/^%%EndProcSet/) {
+ if ($ignore) {
+ $ignore = 0;
+ print "%!\n" if !$line;
+ print $sane;
+ while(<SANE>) {
+ print;
+ }
+ close(SANE);
+ } else {
+ print "%!\n" if !$line;
+ print;
+ }
+ } elsif (/^%%Page:/ && $nesting == 0) {
+ print $_;
+ print values(%fonts);
+ } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) {
+ print $_;
+ $nesting++;
+ } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) {
+ print $_;
+ $nesting--;
+ } else {
+ if (! $ignore) {
+ if (/^\{\}mark .*rf$/) {
+ $fonts{$_} = $_;
+ print;
+ } else {
+ print "%!\n" if !$line;
+ print;
+ }
+ }
+ }
+ $line++;
+}
+@END@
diff --git a/Build/source/utils/psutils/fixpsditps.man b/Build/source/utils/psutils/fixpsditps.man
new file mode 100644
index 00000000000..7ff19b34c51
--- /dev/null
+++ b/Build/source/utils/psutils/fixpsditps.man
@@ -0,0 +1,24 @@
+.TH FIXPSDITPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixpsditps \- filter to fix Transcript psdit documents so PSUtils work
+.SH SYNOPSIS
+.B fixpsditps
+<
+.I psdit.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixpsditps
+is a
+.I perl
+filter which "fixes" PostScript from Transcript's psdit program so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixpsditps.pl b/Build/source/utils/psutils/fixpsditps.pl
new file mode 100644
index 00000000000..a9008f58408
--- /dev/null
+++ b/Build/source/utils/psutils/fixpsditps.pl
@@ -0,0 +1,25 @@
+@PERL@
+# fixpsditps: fix psdit output for use in psutils
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$nesting = 0;
+
+while (<>) {
+ if (/^\/p{pop showpage pagesave restore \/pagesave save def}def$/) {
+ print "/p{pop showpage pagesave restore}def\n";
+ } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/ ) {
+ print $_;
+ $nesting++;
+ } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) {
+ print $_;
+ $nesting--;
+ } elsif (/^%%Page:/ && $nesting == 0) {
+ print $_;
+ print "xi\n";
+ } elsif (! /^xi$/) {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/fixpspps.man b/Build/source/utils/psutils/fixpspps.man
new file mode 100644
index 00000000000..9a6ed98c87c
--- /dev/null
+++ b/Build/source/utils/psutils/fixpspps.man
@@ -0,0 +1,24 @@
+.TH FIXPSPPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixpspps \- filter to fix PSPrint PostScript so PSUtils work
+.SH SYNOPSIS
+.B fixpspps
+<
+.I PSPrint.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixpspps
+is a
+.I perl
+filter which "fixes" PostScript from PSPrint so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixpspps.pl b/Build/source/utils/psutils/fixpspps.pl
new file mode 100644
index 00000000000..c10c93e7666
--- /dev/null
+++ b/Build/source/utils/psutils/fixpspps.pl
@@ -0,0 +1,58 @@
+@PERL@
+# mangle PostScript produced by PSPrint to make it almost conforming
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$header = 1; $ignore = 0;
+$verbose = 0;
+@body = ();
+%fonts = (); $font = "";
+$inchar = 0; @char = ();
+
+while (<>) {
+ if (/^\@end$/) {
+ $ignore = 1;
+ } elsif (/^[0-9]+ \@bop0$/) {
+ $ignore = 0;
+ $header = 1;
+ } elsif ($header) {
+ if (/^\/([a-z.0-9]+) \@newfont$/) {
+ if (! defined($fonts{$1})) {
+ $fonts{$1} = 1;
+ print;
+ } elsif ($verbose) {
+ print STDERR "$font already defined\n";
+ }
+ } elsif (/^([a-z.0-9]+) sf$/) {
+ $font = $1;
+ print;
+ } elsif (/^\[</) {
+ $inchar = 1;
+ push (@char, $_);
+ } elsif ($inchar) {
+ push (@char, $_);
+ if (/.*\] ([0-9]+) dc$/) {
+ if (! defined($fonts{$font,$1})) {
+ $fonts{$font,$1} = 1;
+ print (@char);
+ } elsif ($verbose) {
+ print STDERR "$font character $1 already defined\n";
+ }
+ $inchar = 0;
+ @char = ();
+ }
+ } elsif (/^([0-9]+) \@bop1$/) {
+ $header = 0;
+ push (@body, "%%Page: ? $1\n");
+ push (@body, $_);
+ } else {
+ print;
+ }
+ } elsif (! $ignore) {
+ push (@body, $_);
+ }
+}
+print (@body);
+print ("\@end\n");
+@END@
diff --git a/Build/source/utils/psutils/fixscribeps.man b/Build/source/utils/psutils/fixscribeps.man
new file mode 100644
index 00000000000..68904461df1
--- /dev/null
+++ b/Build/source/utils/psutils/fixscribeps.man
@@ -0,0 +1,24 @@
+.TH FIXSCRIBEPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixscribeps \- filter to fix Scribe documents so PSUtils work
+.SH SYNOPSIS
+.B fixscribeps
+<
+.I Scribe.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixscribeps
+is a
+.I perl
+filter which "fixes" PostScript from Scribe so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixscribeps.pl b/Build/source/utils/psutils/fixscribeps.pl
new file mode 100644
index 00000000000..d8ed1e86aa3
--- /dev/null
+++ b/Build/source/utils/psutils/fixscribeps.pl
@@ -0,0 +1,19 @@
+@PERL@
+# fixscribeps: get conforming PostScript out of Scribe
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$inepsf = 0;
+$epsfn = 0;
+while (<>) {
+ if (/^([0-9]+ [0-9]+ [0-9]+ PB) (%!.*)/) {
+ print "$1\n%%BeginDocument: Scribe-EPSF $epsfn 0\n$2\n";
+ $inepsf++;
+ } elsif (/^ PE/ && $inepsf) {
+ print "%%EndDocument\n", $_;
+ } else {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/fixtpps.man b/Build/source/utils/psutils/fixtpps.man
new file mode 100644
index 00000000000..c6309f12cca
--- /dev/null
+++ b/Build/source/utils/psutils/fixtpps.man
@@ -0,0 +1,24 @@
+.TH FIXTPPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixtpps \- filter to fix Tpscript documents to work with PSUtils
+.SH SYNOPSIS
+.B fixtpps
+<
+.I Tpscript.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixtpps
+is a
+.I perl
+filter which "fixes" PostScript generated from the Troff Tpscript driver so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixtpps.pl b/Build/source/utils/psutils/fixtpps.pl
new file mode 100644
index 00000000000..29c2cebb15c
--- /dev/null
+++ b/Build/source/utils/psutils/fixtpps.pl
@@ -0,0 +1,28 @@
+@PERL@
+# fixtpps: fix tpscript document to work with PSUtils
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$nesting = 0;
+$header = 1;
+
+while (<>) {
+ if (/^%%Page:/ && $nesting == 0) {
+ print $_;
+ print "save home\n";
+ $header = 0;
+ } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) {
+ print $_;
+ $nesting++;
+ } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) {
+ print $_;
+ $nesting--;
+ } elsif (/save home/) {
+ s/save home//;
+ print $_;
+ } elsif (!$header || (! /^save$/ && ! /^home$/)) {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/fixwfwps.man b/Build/source/utils/psutils/fixwfwps.man
new file mode 100644
index 00000000000..42810c26995
--- /dev/null
+++ b/Build/source/utils/psutils/fixwfwps.man
@@ -0,0 +1,24 @@
+.TH FIXWFWPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixwfwps \- filter to fix Word for Windows documents so PSUtils work
+.SH SYNOPSIS
+.B fixwfwps
+<
+.I WordforWindows.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixwfwps
+is a
+.I perl
+filter which "fixes" PostScript from Word for Windows so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixwfwps.pl b/Build/source/utils/psutils/fixwfwps.pl
new file mode 100644
index 00000000000..03b0cdaca38
--- /dev/null
+++ b/Build/source/utils/psutils/fixwfwps.pl
@@ -0,0 +1,33 @@
+@PERL@
+# fixwfwps: fix Word for windows PostScript for printing.
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$nesting = 0;
+while (<>) {
+ tr/\000-\010\012-\014\016-\037//d;
+ foreach (grep($_ ne "", split("\015"))) {
+ s!/SVDoc\s+save\s+def!!g;
+ s!SVDoc\s+restore!!g;
+ if (/^(%!PS-Adobe-\d*\.\d*) EPSF-/ && !$nesting) {
+ print "$1\n";
+ $wfwepsf = 1;
+ } elsif (/^SS\s*$/ && $wfwepsf) {
+ print "%%Page: $wfwepsf $wfwepsf\n";
+ $wfwepsf++;
+ print "$_\n";
+ } elsif (/^%MSEPS Preamble/) {
+ print "%%BeginDocument: (Included EPSF)\n";
+ print "$_\n";
+ $nesting++;
+ } elsif (/^%MSEPS Trailer/) {
+ $nesting--;
+ print "$_\n";
+ print "%%EndDocument\n";
+ } elsif (! /^%%BoundingBox/) {
+ print "$_\n";
+ }
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/fixwpps.man b/Build/source/utils/psutils/fixwpps.man
new file mode 100644
index 00000000000..d6ab4a274ed
--- /dev/null
+++ b/Build/source/utils/psutils/fixwpps.man
@@ -0,0 +1,24 @@
+.TH FIXWPPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixwpps \- filter to fix WP documents so PSUtils work
+.SH SYNOPSIS
+.B fixwpps
+<
+.I WordPerfect.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixwpps
+is a
+.I perl
+filter which "fixes" PostScript from WordPerfect 5.0 and 5.1 so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixwpps.pl b/Build/source/utils/psutils/fixwpps.pl
new file mode 100644
index 00000000000..059119daf48
--- /dev/null
+++ b/Build/source/utils/psutils/fixwpps.pl
@@ -0,0 +1,31 @@
+@PERL@
+# fixwpps: get semi-conforming PostScript out of WordPerfect 5.0 file
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$page = 1;
+$nesting = 0;
+
+while (<>) {
+ s/([^\/]_t)([0-9]+)/\1 \2/g; # fix wp 5.0 bug
+ if (m!/_[be][dp]! || m!_bp \d+ \d+ roll!) {
+ print $_;
+ } elsif (/^(.*)(_bp.*)$/) {
+ print "$1\n" if $1 ne "";
+ print "%%Page: $page $page\n";
+ print "$2\n";
+ $page++;
+ $nesting++;
+ } elsif (/_ep$/) {
+ print $_;
+ $nesting--;
+ } elsif (/^(.*)(_ed.*)/) {
+ print "$1\n" if $1 ne "";
+ print "%%Trailer:\n";
+ print "$2\n";
+ } else {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/fixwwps.man b/Build/source/utils/psutils/fixwwps.man
new file mode 100644
index 00000000000..1fb1aea4d9a
--- /dev/null
+++ b/Build/source/utils/psutils/fixwwps.man
@@ -0,0 +1,24 @@
+.TH FIXWWPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+fixwwps \- filter to fix Windows Write documents so PSUtils work
+.SH SYNOPSIS
+.B fixwwps
+<
+.I WinWrite.ps
+>
+.I Fixed.ps
+.SH DESCRIPTION
+.I Fixwwps
+is a
+.I perl
+filter which "fixes" PostScript from Windows Write so
+that it works correctly with Angus Duggan's
+.B psutils
+package.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
diff --git a/Build/source/utils/psutils/fixwwps.pl b/Build/source/utils/psutils/fixwwps.pl
new file mode 100644
index 00000000000..a0096998b83
--- /dev/null
+++ b/Build/source/utils/psutils/fixwwps.pl
@@ -0,0 +1,20 @@
+@PERL@
+# fixwwps: get semi-conforming PostScript out of Windows Write file
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$page = 1;
+
+while (<>) {
+ if (/^(%!.*) EPSF-\d.\d/) {
+ print $1, "\n";
+ } elsif (/^SS/) {
+ print "%%Page: $page $page\n";
+ print $_;
+ $page++;
+ } else {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/getafm.man b/Build/source/utils/psutils/getafm.man
new file mode 100644
index 00000000000..661c8c19f81
--- /dev/null
+++ b/Build/source/utils/psutils/getafm.man
@@ -0,0 +1,29 @@
+.TH GETAFM 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+getafm \- create an AFM file for a PostScript font.
+.SH SYNOPSIS
+.B getafm
+.I FontName
+>
+.I output.ps
+.SH DESCRIPTION
+.I Getafm
+generates a PostScript file which prints an AFM file for a font to the
+printer's output channel. The output of
+.I getafm
+should be sent to a printer, or to GhostScript. For example,
+.sp
+.ce
+getafm Times-Roman | gsnd - >Times-Roman.afm
+.sp
+.SH AUTHOR
+Robert Joop (rj@rainbow.in-berlin.de), Angus Duggan
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+Kerning information is not generated by
+.I getafm;
+it is best to use original AFM files if possible.
diff --git a/Build/source/utils/psutils/getafm.sh b/Build/source/utils/psutils/getafm.sh
new file mode 100644
index 00000000000..1c6cd21cf77
--- /dev/null
+++ b/Build/source/utils/psutils/getafm.sh
@@ -0,0 +1,358 @@
+#!/bin/sh
+
+if [ $# -ne 1 ]; then
+ echo "usage: $0 font-name | gsnd - >font-name.afm" >&2
+ exit 1
+fi
+
+cat << EOF
+%!
+% produce .afm for $1
+% (c) 1993 by Robert Joop <rj@rainbow.in-berlin.de>
+% inspired by two other versions of this theme which are
+% getafm 1.00 (c) AJCD
+% and getafm.ps by an unknown author,
+% modified by J. Daniel Smith <dsmith@mailhost.aa.cad.slb.com>
+
+% Metrics dictionary code added by AJCD, 7/6/93
+
+/getafmdict 100 dict dup begin
+
+ /buf 256 string def
+ /buf2 16 string def
+
+ /prany % dict dictname printname -> dict
+ {
+ 2 index 2 index cvn known
+ {
+ print % printname
+ ( ) print
+ 1 index exch cvn get =
+ }
+ {
+ (Comment /FontInfo contains no /) print
+ 2 copy eq
+ {
+ = % printname
+ pop % dictname
+ }
+ {
+ exch
+ print % dictname
+ (, therefore no ) print
+ = % printname
+ }
+ ifelse
+ }
+ ifelse
+ }
+ bind def
+
+ /printfontname
+ {
+ (FontName)dup prany
+ }
+ bind def
+
+ /printfontinfo
+ {
+ dup /FontInfo known
+ {
+ dup /FontInfo get
+ (FullName)dup prany
+ (FamilyName)dup prany
+ (Weight)dup prany
+ (ItalicAngle)dup prany
+ (isFixedPitch)(IsFixedPitch) prany
+ (UnderlinePosition)dup prany
+ (UnderlineThickness)dup prany
+ (Version)(version) prany
+ (Notice)dup prany
+ pop
+ }
+ {
+ (Comment Font lacks a /FontInfo!)=
+ }
+ ifelse
+ }
+ bind def
+
+ /prbbox % llx lly urx ury -> -
+ {
+ 4 1 roll 3 1 roll exch % swap top 4 elements
+ 4 { ( ) print buf cvs print } repeat
+ }
+ bind def
+
+ /getbbox % fontdict chardict character -> fontdict chardict llx lly urx ury
+ {
+ gsave
+ 2 index setfont 0 0 moveto
+ false charpath flattenpath pathbbox
+ grestore
+ }
+ bind def
+
+ /printmiscinfo
+ {
+ dup /FontBBox known
+ {
+ (FontBBox) print
+ dup /FontBBox get aload pop prbbox ()=
+ }
+ {
+ (Comment missing required /FontBBox)=
+ quit
+ }
+ ifelse
+ 2 copy exch get
+ dup /H known
+ 1 index /x known and
+ 1 index /d known and
+ 1 index /p known and
+ dup /looksRoman exch def
+ {
+ (CapHeight ) print
+ (H) getbbox
+ ceiling cvi = pop pop pop
+ (XHeight ) print
+ (x) getbbox
+ ceiling cvi = pop pop pop
+ (Ascender ) print
+ (d) getbbox
+ ceiling cvi = pop pop pop
+ (Descender ) print
+ (p) getbbox
+ pop pop floor cvi = pop
+ }
+ {
+ (Comment font doesn't contain H, x, d and p; therefore no CapHeight, XHeight, Ascender and Descender)=
+ }
+ ifelse
+ pop
+ dup /Encoding get
+ [
+ [ (ISOLatin1Encoding) /ISOLatin1Encoding ]
+ [ (AdobeStandardEncoding) /StandardEncoding ]
+ ]
+ {
+ aload pop dup where
+ {
+ exch get 2 index eq
+ {
+ (EncodingScheme ) print
+ buf cvs =
+ }
+ {
+ pop
+ }
+ ifelse
+ }
+ {
+ pop pop
+ }
+ ifelse
+ }
+ forall
+ pop
+ }
+ bind def
+
+ /printcharmetric
+ {
+ % chardictname fontdict charnamedict encoding charindex charname
+
+ 4 index dup length dict dup begin exch
+ {
+ 1 index /FID ne
+ 2 index /UniqueID ne
+ and
+ {
+ 1 index /Encoding eq { 256 array copy } if
+ def
+ }
+ { pop pop }
+ ifelse
+ }
+ forall
+ end
+ dup /Encoding get 32 3 index put
+ /f2 exch definefont
+ setfont
+
+ (C ) print
+ 1 index buf cvs print
+
+ ( ; WX ) print
+% Metrics entries are:
+% 1 number: which is the character width
+% an array of 2 numbers: which are the left sidebearing and width
+% an array of 4 numbers: x & y left sidebearing, width and height
+ dup 5 index % /charname fontdict
+ dup /Metrics known {
+ /Metrics get exch 2 copy known {
+ get dup type /arraytype eq {
+ dup length 2 eq
+ {1 get} {2 get} ifelse
+ } if
+ round cvi buf cvs print
+ } {
+ pop pop ( ) stringwidth pop round cvi buf cvs print
+ } ifelse
+ } {
+ pop pop ( ) stringwidth pop round cvi buf cvs print
+ } ifelse
+
+ ( ; N ) print
+ dup buf cvs print
+
+ ( ; B) print
+ gsave
+ newpath 0 0 moveto
+ ( ) true charpath flattenpath pathbbox
+ grestore
+ 2 { ceiling cvi 4 1 roll } repeat
+ 2 { floor cvi 4 1 roll } repeat
+ prbbox
+
+ looksRoman
+ {
+ [
+ [ /f [ /i /f /l ] ]
+ [ /ff [ /i /l ] ]
+ ]
+ {
+ aload pop 1 index 3 index eq
+ {
+ {
+ 1 index buf cvs
+ length
+ 1 index buf2 cvs dup length
+ 2 index add
+ buf
+ 4 2 roll putinterval
+ buf 0
+ 3 -1 roll getinterval
+ dup cvn
+ 7 index
+ exch known
+ {
+ exch
+ ( ; L ) print
+ buf2 cvs print
+ ( ) print
+ print
+ }
+ {
+ pop pop
+ }
+ ifelse
+ }
+ forall
+ pop
+ }
+ {
+ pop pop
+ }
+ ifelse
+ }
+ forall
+ }
+ if
+ pop
+
+ ( ;)=
+ }
+ bind def
+
+ /printcharmetrics
+ {
+ (StartCharMetrics ) print
+ 2 copy exch get length 1 sub buf cvs =
+
+ 256 dict dup begin
+ 1 index /Encoding get
+ { null def }
+ forall
+ end
+ % chardictname fontdict charnamedict
+ 1 index /Encoding get
+ 0 1 255
+ {
+ % encoding index
+ 2 copy get
+ dup /.notdef eq { pop } { printcharmetric } ifelse
+ pop % index
+ } for
+
+ -1
+ 3 index 5 index get
+ {
+ pop
+ dup /.notdef eq
+ { pop }
+ {
+ % chardictname fontdict charnamedict encoding charindex charname
+ dup 4 index exch known
+ { pop }
+ { printcharmetric }
+ ifelse
+ }
+ ifelse
+ }
+ forall
+ % charnamedict encoding index
+ pop pop pop
+
+ (EndCharMetrics)=
+ }
+ bind def
+
+ /printfontmetrics
+ {
+ (StartFontMetrics 3.0)=
+ (Comment Produced by getafm 3.0 (which is by rj@rainbow.in-berlin.de))=
+
+ printfontname
+ printfontinfo
+ printmiscinfo
+ printcharmetrics
+
+ (EndFontMetrics)=
+ }
+ bind def
+
+end def
+
+/getafm
+{
+ getafmdict begin
+ save exch
+ findfont 1000 scalefont
+
+ null
+ [ /CharDefs /CharData /CharProcs /CharStrings ]
+ {
+ 2 index 1 index known { exch } if
+ pop
+ }
+ forall
+ dup null eq
+ {
+ (can't find dictionary with character data!)=
+ quit
+ }
+ if
+ exch % dictname fontdict
+
+ printfontmetrics
+
+ pop pop
+ restore
+ end
+}
+bind def
+
+/$1 getafm
+
+EOF
diff --git a/Build/source/utils/psutils/includeres.man b/Build/source/utils/psutils/includeres.man
new file mode 100644
index 00000000000..24a2615c396
--- /dev/null
+++ b/Build/source/utils/psutils/includeres.man
@@ -0,0 +1,41 @@
+.TH INCLUDERES 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+includeres \- filter to include resources in a PostScript document
+.SH SYNOPSIS
+.B includeres
+<
+.I document.ps
+>
+.I output.ps
+.SH DESCRIPTION
+.I Includeres
+includes resources (fonts, procsets, patterns, files, etc) in place of
+.I %%IncludeResource
+comments in a PostScript document. The resources are searched for in the
+current directory and the system default directory under the resource name,
+and with an appropriate extension.
+The pipeline
+.sp
+.ce
+extractres file.ps | includeres >out.ps
+.sp
+will move all resources appearing in a document to the document prologue,
+removing redundant copies. The output file can then be put through page
+re-arrangement filters such as
+.I psnup
+or
+.I pstops
+safely.
+.SH FILES
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I includeres
+does not alter the
+.I %%DocumentNeededResources
+comments.
diff --git a/Build/source/utils/psutils/includeres.pl b/Build/source/utils/psutils/includeres.pl
new file mode 100644
index 00000000000..083e0bfa52e
--- /dev/null
+++ b/Build/source/utils/psutils/includeres.pl
@@ -0,0 +1,46 @@
+@PERL@
+# includeres: include resources in PostScript file
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$prog = ($0 =~ s=.*/==);
+
+%extn = ("font", ".pfa", "file", ".ps", "procset", ".ps", # resource extns
+ "pattern", ".pat", "form", ".frm", "encoding", ".enc");
+%type = ("%%BeginFile:", "file", "%%BeginProcSet:", "procset",
+ "%%BeginFont:", "font"); # resource types
+
+sub filename { # make filename for resource in @_
+ local($name);
+ foreach (@_) { # sanitise name
+ s/[!()\$\#*&\\\|\`\'\"\~\{\}\[\]\<\>\?]//g;
+ $name .= $_;
+ }
+ $name =~ s@.*/@@; # drop directories
+ die "Filename not found for resource ", join(" ", @_), "\n"
+ if $name =~ /^$/;
+ $name;
+}
+
+while (<>) {
+ if (/^%%IncludeResource:/ || /^%%IncludeFont:/ || /^%%IncludeProcSet:/) {
+ local($comment, @res) = split(/\s+/);
+ local($type) = defined($type{$comment}) ? $type{$comment} : shift(@res);
+ local($name) = &filename(@res);
+ local($inc) = ""; # system include directory
+ if (open(RES, $name) || open(RES, "$name$extn{$type}") ||
+ open(RES, "$inc/$name") || open(RES, "$inc/$name$extn{$type}")) {
+ while (<RES>) {
+ print $_;
+ }
+ close(RES);
+ } else {
+ print "%%IncludeResource: ", join(" ", $type, @res), "\n";
+ print STDERR "Resource $name not found\n";
+ }
+ } else {
+ print $_;
+ }
+}
+@END@
diff --git a/Build/source/utils/psutils/maketext b/Build/source/utils/psutils/maketext
new file mode 100644
index 00000000000..b5715b3a25d
--- /dev/null
+++ b/Build/source/utils/psutils/maketext
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+# maketext: perl filter to substitute names in scripts and man pages.
+
+%change = (); # names -> substitutions
+
+# get release and patchlevel for all scripts
+open(H, "patchlev.h") || die "can't open patchlev.h";
+while(<H>) {
+ $change{$1} = $2 if /^\#define\s*(\S*)\s*(\S*)/;
+}
+close(H);
+
+$os = "" ;
+
+%perlstart = ("UNIX", "\#!PERL",
+ "DOS", "\@rem = '-*- Perl -*-\n\@echo off\nPERL -S %0.cmd %1 %2 %3 %4 %5 %6 %7 %8 %9\ngoto endofperl\n';\n",
+ "WINNT", "\@rem = '-*- Perl -*-\n\@echo off\nPERL -S %0.cmd %1 %2 %3 %4 %5 %6 %7 %8 %9\ngoto endofperl\n';\n",
+ "Win32", "\@rem = '-*- Perl -*-\n\@echo off\nPERL -S %0.cmd %1 %2 %3 %4 %5 %6 %7 %8 %9\ngoto endofperl\n';\n",
+ "OS2", "extproc PERL -x\n\#! PERL\n",
+ "", "PSUTILS MAKEFILE CONFIGURATION ERROR") ;
+%perlend = ("UNIX", "",
+ "DOS", "__END__\n:endofperl\n",
+ "WINNT", "__END__\n:endofperl\n",
+ "Win32", "__END__\n:endofperl\n",
+ "OS2", "\# End of Script",
+ "", "PSUTILS MAKEFILE CONFIGURATION ERROR");
+
+foreach (@ARGV) {
+ if (/MAN=(.*)/) { # name.ext name.ext -> name(ext), name(ext)
+ local(@man) = split(' ', $1);
+ $change{"MAN"} = join(", ", grep(s/\.(.)/($1)/, @man));
+ } elsif (/OS=(.*)/) { # set operating system name
+ $os = $1 ;
+ } elsif (/PERL=(.*)/) { # substitute name for value
+ local($perl) = $1 ;
+ $change{"PERL"} = $perlstart{$os} ;
+ $change{"END"} = $perlend{$os} ;
+ $change{"PERL"} =~ s/PERL/$perl/g ;
+ $change{"END"} =~ s/PERL/$perl/g ;
+ } elsif (/(.*)=(.*)/) { # substitute name for value
+ $change{$1} = $2;
+ } else { # open file and substitute
+ local(@change) = keys %change;
+ open(FILE, $_) || die "can't open $_";
+ while ($line = <FILE>) {
+ grep($line =~ s/\@$_\@/$change{$_}/g, @change);
+ print $line;
+ }
+ close(FILE);
+ }
+}
diff --git a/Build/source/utils/psutils/md68_0.ps b/Build/source/utils/psutils/md68_0.ps
new file mode 100644
index 00000000000..1934c7f7ab3
--- /dev/null
+++ b/Build/source/utils/psutils/md68_0.ps
@@ -0,0 +1,437 @@
+%%BeginProcSet: (AppleDict md) 68 0
+/readtocleartomark{/markindex 0 def %AJCD-skip up to next "cleartomark"%
+{dup read pop (cleartomark) markindex get
+eq {/markindex markindex 1 add def
+markindex 11 ge {exit}if}
+{/markindex 0 def} ifelse
+}loop pop}bind def
+%AJCD% statusdict begin waittimeout 300 lt{0 60 300 setdefaulttimeouts}if end
+currentfile statusdict begin serverdict begin product (LaserWriter II NT) eq revision 1 eq and {/setrealdevice {//setrealdevice exec 31 sendpcmd 4 eq tonerlight} bind def
+/execjob {31 sendpcmd 4 eq tonerlight //execjob exec} bind def end end eexec}{end end readtocleartomark}ifelse
+35de8eabfc7fa5eac0431edc501ad43f5fcbdf9fdd321cce93b525f4439dd94696bf56ac13a0a2aad1e6bcf444711e941d7217138d20ae0500145f815439cc14e697ad201df728ea4ccad4ac331aa03a7aacde10760bf4ee12bbf73c77cdcbf1796f26f0dd255d2407e1ac41
+d27489a69d6b69c6a841468b46720b75ad65650700e0c528e7af61e7e3e821b59445c44b69831ebc9deaf0e3aecc14b7a1c2e18bc1fa42a59219f1e36f236e3d6c89114b1f231999c3dbce6b43f3e2918fcb85575941a9d1e65c86aa08e6eea86cc66ce90e5e4add57f2585e
+7b1c0b5203cfc46868d6e3c0d66db79174e7091e32e307679732da062e440e41dabd36a161b611a7e4523a49694026206803dbfd5be5c5fe433f0f18a40057db6f1302848c8da4a10a7f14c63d512806362b1be092ad5dbd36d75fe63e4cae2ba9b72390f580cac344a08bdf
+6eb9e36ec45bad2a0b82829a72e0efa2d87332c482196e690361168271c55053341ab3
+mark cleartomark %AJCD-dummy cleartomark for skip%
+/sc {60 45 {abs exch abs 2 copy add 1 gt{1.0 sub dup mul exch 1.0 sub dup mul add 1.0 sub}{dup mul exch dup mul add 1.0 exch sub}
+ifelse}setscreen} bind def statusdict begin product(LaserWriter II)anchorsearch end
+{pop pop/letter [/letter load /exec load /sc load /exec load]cvx def/legal [/legal load /exec load /sc load /exec load]cvx def/a4 [/a4 load /exec load /sc load /exec load]cvx def/b5 [/b5 load /exec load /sc load /exec load]cvx def
+/lettersmall [/lettersmall load /exec load /sc load /exec load]cvx def/a4small [/a4small load /exec load /sc load /exec load]cvx def/note [/note load /exec load /sc load /exec load]cvx def}{pop}ifelse
+systemdict/currentpacking known{currentpacking true setpacking}if
+/LW{save statusdict/product get(LaserWriter)anchorsearch
+exch pop{length 0 eq{1}{2}ifelse}{0}ifelse exch restore}bind def
+/LW+{LW 2 eq}bind def
+/ok{systemdict/statusdict known dup{LW 0 gt and}if}bind def
+%AJCD% ok{statusdict begin 9 sccinteractive 3 ne exch 0 ne or{9 0 3 setsccinteractive}if end}if
+/md 250 dict def md begin
+/av 0 def
+/T true def/F false def/mtx matrix def/s75 75 string def/s8 8 string def/s1 ( ) def/pxs 1 def/pys 1 def
+1 0 mtx defaultmatrix dtransform exch atan/pa exch def/nlw .24 def/ppr [-32 -29.52 762 582.48] def
+/pgs 1 def/por true def/xb 500 array def/so true def/tso true def/fillflag false def/pnm 1 def/fmv true def
+/sfl false def/ma 0 def/invertflag false def/dbinvertflag false def/xflip false def/yflip false def/noflips true def/scaleby96 false def/fNote true def/fBitStretch true def
+/fg (Rvd\001\001\000\000\177) def
+/bdf{bind def}bind def
+/xdf{exch def}bdf
+/xl{neg exch neg translate}bdf
+/fp{pnsh 0 ne pnsv 0 ne and}bdf
+/nop{}bdf/lnop[/nop load]cvx bdf
+/vrb[
+{fp{fg 6 get 0 ne{gsave stroke grestore}{gsave 1 setlinewidth pnsh pnsv scale stroke grestore}ifelse}if newpath}bind
+/eofill load
+dup
+/newpath load
+2 index
+dup
+{clip newpath}bind
+{}bind
+dup
+2 copy
+]def
+currentscreen/spf xdf/rot xdf/freq xdf
+/doop{vrb exch get exec}bdf
+/psu{/tso xdf /fNote xdf/fBitStretch xdf/scaleby96 xdf/yflip xdf/xflip xdf
+/invertflag xdf/dbinvertflag invertflag statusdict begin version cvr 47.0 ge product (LaserWriter) eq not and end invertflag and {not}if def
+xflip yflip or{/noflips false def}if
+/pgs xdf 2 index .72 mul exch div/pys xdf div .72 mul/pxs xdf ppr astore pop/por xdf sn and/so xdf}bdf
+/tab{statusdict /11x17 known{statusdict begin /11x17 load end}{statusdict /setpage known{statusdict begin 792 1224 1 setpage end}{statusdict /setpageparams known{statusdict begin 792 1224 0 1 setpageparams end}if}ifelse}ifelse}bdf
+/txpose{fNote{smalls}{bigs}ifelse pgs get exec pxs pys scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if
+xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if
+xflip yflip not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate}if}
+{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if
+xflip yflip not and{translate pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate}if}ifelse
+%AJCD% statusdict begin waittimeout 300 lt{/waittimeout 300 def}if end
+scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy translate .96 dup scale neg exch neg exch translate}if}bdf
+/fr{4 copy ppr aload pop 3 -1 roll add 3 1 roll exch add 6 2 roll 3 -1 roll
+sub 3 1 roll exch sub 3 -1 roll exch div 3 1 roll div exch scale pop pop xl}bdf
+/obl{{0.212557 mul}{pop 0}ifelse}bdf
+/sfd{ps fg 5 -1 roll get mul 100 div 0 ps 5 -1 roll obl ps neg 0 0 6a astore makefont setfont}bdf
+/fnt{findfont sfd}bdf
+/bt{sa 3 1 roll 3 index and put}bdf
+/sa(\000\000\000\000\000\000\000\000\000\000)def
+/fs{0 1 bt 1 2 bt 2 4 bt 3 8 bt 4 16 bt 5 32 bt 6 64 bt 7 128 bt sa exch 8 exch put}bdf
+/mx1 matrix def
+/mx2 matrix def
+/mx3 matrix def
+/bu{currentpoint currentgray currentlinewidth currentlinecap currentlinejoin currentdash exch aload length
+fg 5 sfl{1}{0}ifelse put pnsv pnsh
+2t aload pop 3a aload pop mx2 aload pop mx1 aload pop mtx currentmatrix aload pop
+mx3 aload pop ps pm restore/ps xdf mx3 astore pop}bdf
+/bn{/pm save def mx3 setmatrix newpath 0 0 moveto ct dup 39 get 0 exch getinterval cvx exec
+mtx astore setmatrix mx1 astore pop mx2 astore pop 3a astore pop
+2t astore pop/pnsh xdf/pnsv xdf gw
+/sfl fg 5 get 0 ne def array astore exch setdash setlinejoin setlinecap
+setlinewidth setgray moveto}bdf
+/fc{}bdf
+/tc{32768 div add 3 1 roll 32768 div add 2t astore pop}bdf
+/3a [0 0 0] def
+/2t 2 array def
+/tp{3a astore pop}bdf
+/tt{mx2 currentmatrix pop currentpoint 2 copy 2t aload pop qa 2 copy translate 3a aload pop exch dup 0 eq
+{pop}{1 eq{-1 1}{1 -1}ifelse scale}ifelse rotate pop neg exch neg exch translate moveto}bdf
+/te{mx2 setmatrix}bdf
+/th{3 -1 roll div 3 1 roll exch div 2 copy mx1 scale pop scale/sfl true def}bdf
+/tu{1 1 mx1 itransform scale/sfl false def}bdf
+/ts{1 1 mx1 transform scale/sfl true def}bdf
+/fz{/ps xdf}bdf
+/dv{dup 0 ne{div}{pop}ifelse}bdf
+/pop4{pop pop pop pop}bdf
+/it{sfl{mx1 itransform}if}bdf
+/gm{exch it moveto}bdf/rm{it rmoveto}bdf
+/lm{currentpoint sfl{mx1 transform}if exch pop sub 0 exch it rmoveto}bdf
+/fm{statusdict/manualfeed known}bdf
+/se{statusdict exch/manualfeed exch put}bdf
+/mf{dup/ma exch def 0 gt{fm se/t1 5 st ok ma 1 gt and{/t2 0 st/t3 0 st
+%AJCD% statusdict/manualfeedtimeout 3600 put
+}if}if}bdf
+/jn{/statusdict where exch pop{statusdict exch /jobname exch put}if}bdf
+/pen{pnm mul/pnsh xdf pnm mul/pnsv xdf pnsh setlinewidth}bdf
+/min{2 copy gt{exch}if pop}bdf
+/max{2 copy lt{exch}if pop}bdf
+/dh{fg 6 1 put array astore dup {1 pxs div mul exch}forall astore exch pop exch pop exch setdash}bdf
+/ih[currentdash]def
+/rh{fg 6 0 put ih aload pop setdash}bdf
+/dl{gsave nlw pys div setlinewidth 0 setgray}bdf
+/dlin{exch currentpoint currentlinewidth 2 div dup
+translate newpath moveto lineto currentpoint stroke grestore moveto}bdf
+/lin{fg 6 get 0 ne{exch lineto currentpoint 0 doop moveto}
+{exch currentpoint/pnlv xdf/pnlh xdf gsave newpath/@1 xdf/@2 xdf fp{pnlh @2 lt{pnlv @1 ge
+{pnlh pnlv moveto @2 @1 lineto pnsh 0 rlineto
+0 pnsv rlineto pnlh pnsh add pnlv pnsv add lineto pnsh neg 0 rlineto}
+{pnlh pnlv moveto pnsh 0 rlineto @2 pnsh add @1 lineto 0 pnsv rlineto
+pnsh neg 0 rlineto pnlh pnlv pnsv add lineto}ifelse}{pnlv @1 gt
+{@2 @1 moveto pnsh 0 rlineto pnlh pnsh add pnlv lineto 0 pnsv rlineto
+pnsh neg 0 rlineto @2 @1 pnsv add lineto}{pnlh pnlv moveto pnsh 0 rlineto
+0 pnsv rlineto @2 pnsh add @1 pnsv add lineto pnsh neg 0 rlineto
+0 pnsv neg rlineto}ifelse}ifelse
+closepath fill}if @2 @1 grestore moveto}ifelse}bdf
+/gw{/pnm fg 3 get fg 4 get div def}bdf
+/lw{fg exch 4 exch put fg exch 3 exch put gw pnsv pnsh pen}bdf
+/barc{/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf
+/@6 xdf/@7 xdf/@8 xdf gsave
+@5 @7 add 2 div @6 @8 add 2 div translate newpath 0 0 moveto
+@5 @7 sub @6 @8 sub mtx currentmatrix pop scale @1{newpath}if
+0 0 0.5 @4 @3 arc @4 @3 sub abs 360 ge{closepath}if
+mtx setmatrix @2 doop grestore}bdf
+/ar{dup 0 eq barc}bdf
+/ov{0 exch 360 exch true barc}bdf
+/rc{/@t xdf currentpoint 6 2 roll newpath 4 copy 4 2 roll exch moveto
+6 -1 roll lineto lineto lineto closepath @t doop moveto}bdf
+/mup{dup pnsh 2 div le exch pnsv 2 div le or}bdf
+/rr{/@1 xdf 2. div/@2 xdf 2. div/@3 xdf
+/@4 xdf/@5 xdf/@6 xdf/@7 xdf
+@7 @5 eq @6 @4 eq @2 mup or or{@7 @6 @5 @4 @1 rc}
+{@4 @6 sub 2. div dup @2 lt{/@2 xdf}{pop}ifelse
+@5 @7 sub 2. div dup @2 lt{/@2 xdf}{pop}ifelse
+@1 0 eq{/@2 @2 pnsh 2 div 2 copy gt{sub def}{0 pop4}ifelse}if
+currentpoint newpath
+@4 @6 add 2. div @7 moveto
+@4 @7 @4 @5 @2 arcto pop4
+@4 @5 @6 @5 @2 arcto pop4
+@6 @5 @6 @7 @2 arcto pop4
+@6 @7 @4 @7 @2 arcto pop4
+closepath @1 doop moveto}ifelse}bdf
+/pr{gsave newpath/pl{exch moveto/pl{exch lineto}def}def}bdf
+/pl{exch lineto}bdf
+/ep{dup 0 eq{{moveto}{exch lin}{}{(%%[|1|]%%)= flush}pathforall
+pop grestore}{doop grestore}ifelse currentpoint newpath moveto}bdf
+/gr{64. div setgray}bdf
+/pat{s8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi s8 exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}setscreen gr}bdf
+/sg{freq rot/spf load setscreen gr}bdf
+/dc{transform round .5 sub exch round .5 sub exch itransform}bdf
+/sn{userdict/smooth4 known}bdf
+/x8{3 bitshift}bdf
+/x4{2 bitshift}bdf
+/d4{-2 bitshift}bdf
+/d8{-3 bitshift}bdf
+/rb{15 add -4 bitshift 1 bitshift}bdf
+/db{/@7 save def/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf/@6 @5 @3 4 add mul def
+dc translate scale/xdbit 1 1 idtransform abs/ydbit exch def abs def{0 0 1 ydbit add 1 10 rc clip}if
+@1 0 eq @1 4 eq or{1 setgray ydbit 0 1 ydbit add 1 2 rc}if
+@1 3 eq @1 7 eq or{1}{0}ifelse setgray/@9 @1 0 eq @1 1 eq @1 3 eq or or dbinvertflag xor def/@13 @6 def
+@2 fBitStretch or{/@10 @4 x4 def/@11 @3 x4 def/@12 @10 rb def/@13 @12 @11 mul def/@15 1 1 dtransform abs/calcY 1 index def round cvi/@14 exch def
+abs/calcX 1 index def round cvi scaleby96 not{1 add}if def/@16 @15 rb def/@17 @16 @14 mul def}if
+sn @13 60000 lt and @2 fBitStretch or and{mtx currentmatrix dup 1 get exch 2 get 0. eq exch 0. eq and @17 60000 lt and fBitStretch and{@16 3 bitshift @14 @9 [calcX 0 0 calcY 0 0]{@17 string @13 string
+currentfile @6 string readhexstring pop 1 index @4 @3 @5 @12 @2 smooth4
+@10 @11 @12 dup string 5 index @15 @14 @16 dup string stretch}imagemask}{@12 x8 @11 @9 [@10 0 0 @11 0 0]{@13 string
+currentfile @6 string readhexstring pop 1 index @4 @3 @5 @12 @2 smooth4}imagemask}ifelse}{@5 3 bitshift @3 4 add @9 [@4 0 0 @3 0 2]{currentfile @6 string readhexstring pop}imagemask}ifelse
+@7 restore}bdf
+/multibit{/mbdeep exch def/mbY exch def/mbX exch def
+save mbX mbY mbdeep[mbX 0 0 mbY 0 0]{currentfile picstr readhexstring pop}image
+restore}bdf
+/wd 16 dict def
+/mfont 14 dict def
+/mdf{mfont wcheck not{/mfont 14 dict def}if mfont begin xdf end}bdf
+/cf{{1 index/FID ne{def}{pop pop}ifelse}forall}bdf/rf{/@1 exch def/@2 exch def
+FontDirectory @2 known{cleartomark pop}{findfont dup begin dup length @1 add dict begin
+cf{/Encoding macvec def}{Encoding dup length array copy/Encoding exch def
+counttomark 2 idiv{Encoding 3 1 roll put}repeat}ifelse
+pop
+exec currentdict end end @2 exch definefont pop}ifelse}bdf
+/bmbc{exch begin wd begin
+/cr xdf
+save
+CharTable cr 6 mul 6 getinterval{}forall
+/bitheight xdf/bitwidth xdf
+.96 div/width xdf
+Gkernmax add/XOffset xdf Gdescent add/YOffset xdf/rowbytes xdf
+rowbytes 255 eq{0 0 0 0 0 0 setcachedevice}
+{Gnormsize dup scale
+width 0 XOffset YOffset bitwidth XOffset add bitheight YOffset add
+setcachedevice
+rowbytes 0 ne{
+XOffset YOffset translate newpath 0 0 moveto
+bitwidth bitheight scale
+sn{
+/xSmt bitwidth x4 def
+/ySmt bitheight x4 def
+/rSmt xSmt rb def
+rSmt x8 ySmt true
+[xSmt 0 0 ySmt neg 0 ySmt]
+{rSmt ySmt mul string CharData cr get
+1 index bitwidth bitheight rowbytes rSmt tso smooth4}
+}{rowbytes 3 bitshift bitheight 4 add true
+[bitwidth 0 0 bitheight neg 0 bitheight 2 add]
+{CharData cr get}
+}ifelse
+imagemask
+}if
+}ifelse
+restore
+end end
+}bdf
+/bb{.96 exch div/Gnormsize mdf 2 index
+/Gkernmax mdf 1 index/Gdescent mdf
+3 index div 4 1 roll
+2 index div 1. 5 2 roll
+exch div 4 1 roll
+4 array astore/FontBBox mdf
+}bdf
+/cdf{mfont/CharData get 3 1 roll put}bdf
+/bf{
+mfont begin
+/FontType 3 def
+/FontMatrix [1 0 0 1 0 0] def
+/Encoding macvec def
+/BuildChar/bmbc load def
+end
+mfont definefont pop
+}bdf
+/wi LW 1 eq{{gsave 0 0 0 0 0 0 0 0 moveto lineto lineto lineto closepath clip stringwidth grestore}bind}{/stringwidth load}ifelse def
+/aps{0 get 124 eq}bdf
+/xc{s75 cvs dup}bdf
+/xp{put cvn}bdf
+/scs{xc 3 67 put dup 0 95 xp}bdf
+/sos{xc 3 79 xp}bdf
+/sbs{xc 1 66 xp}bdf
+/sis{xc 2 73 xp}bdf
+/sob{xc 2 79 xp}bdf
+/sss{xc 4 83 xp}bdf
+/dd{exch 1 index add 3 1 roll add exch}bdf
+/smc{moveto dup show}bdf
+/kwn{FontDirectory 1 index known{findfont exch pop}}bdf
+/gl{1 currentgray sub setgray}bdf
+/mm{/mfont 10 dict def mfont begin
+/FontMatrix [1 0 0 1 0 0] def
+/FontType 3 def
+/Encoding macvec def
+/df 4 index findfont def
+/FontBBox [0 0 1 1] def
+/xda xdf/mbc xdf
+/BuildChar{wd begin/cr xdf/fd xdf/cs s1 dup 0 cr put def fd/mbc get exec end}def
+exec end mfont definefont}bdf
+/ac{dup scs kwn{exch findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall
+fmv{/Encoding macvec def}if/StrokeWidth nlw 1000 mul pys div ps div dup 12 lt{pop 12}if def
+/PaintType 2 def currentdict end definefont}ifelse}bdf
+/mb{dup sbs kwn{exch{pop}{bbc}{}mm}ifelse sfd}bdf
+/mo{dup sos kwn{exch{pop}{boc}{}mm}ifelse sfd}bdf
+/ms{dup sss kwn{exch{pop}{bsc}{}mm}ifelse sfd}bdf
+/ou{dup sos kwn{exch dup ac pop{scs findfont /df2 xdf}{aoc}{}mm}ifelse sfd}bdf
+/su{dup sss kwn{exch dup ac pop{scs findfont /df2 xdf}{asc}{}mm}ifelse sfd}bdf
+/ao{/fmv true def ou}bdf/as{/fmv true def su}bdf
+/vo{/fmv false def ou}bdf/vs{/fmv false def su}bdf
+/bbc{/da .03 def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs 0 0 smc da 0 smc da da smc 0 da moveto show}bdf
+/boc{/da 1 ps div def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs 0 0 smc da 0 smc da da smc 0 da smc gl da 2. div dup moveto show}bdf
+/bsc{/da 1 ps div def
+/ds .05 def/da2 da 2. div def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch ds add da2 add exch}if grestore setcharwidth
+cs ds da2 add .01 add 0 smc 0 ds da2 sub translate 0 0 smc
+da 0 smc da da smc 0 da smc gl da 2. div dup moveto show}bdf
+/aoc{fd/df get setfont
+gsave cs wi grestore setcharwidth
+gl cs 0 0 smc fd/df2 get setfont gl 0 0 moveto show}bdf
+/asc{/da .05 def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs da .01 add 0 smc 0 da translate gl 0 0 smc gl fd/df2 get setfont 0 0 moveto show}bdf
+/st{1000 mul usertime add dup 2147483647 gt{2147483647 sub}if def}bdf
+/the{usertime sub dup 0 lt exch -2147483648 gt and}bdf
+/6a 6 array def
+/2a 2 array def
+/3q 3 array def
+/qs{3 -1 roll sub exch 3 -1 roll sub exch}bdf
+/qa{3 -1 roll add exch 3 -1 roll add exch}bdf
+/qm{3 -1 roll 1 index mul 3 1 roll mul}bdf
+/qn{6a exch get mul}bdf
+/qA .166667 def/qB .833333 def/qC .5 def
+/qx{6a astore pop
+qA 0 qn qB 2 qn add qA 1 qn qB 3 qn add
+qB 2 qn qA 4 qn add qB 3 qn qA 5 qn add
+qC 2 qn qC 4 qn add qC 3 qn qC 5 qn add}bdf
+/qp{6 copy 12 -2 roll pop pop}bdf
+/qc{exch qp qx curveto}bdf
+/qi{{exch 4 copy 2a astore aload pop qa .5 qm newpath moveto}{exch 2 copy 6 -2 roll 2 qm qs 4 2 roll}ifelse}bdf
+/qq{{qc 2a aload pop qx curveto}{exch 4 copy qs qa qx curveto}ifelse}bdf
+/pt{currentpoint newpath moveto}bdf
+/qf{/fillflag true def}bdf
+/ec{1 and 0 ne{0 doop}if grestore currentpoint newpath moveto/fillflag false def}bdf
+/eu{currentpoint fp{0 ep}{grestore newpath}ifelse moveto/fillflag false def}bdf
+/bp{currentpoint newpath 2 copy moveto}bdf
+/ef{gsave fillflag{gsave eofill grestore}if}bdf
+/sm{0 exch{@1 eq{1 add}if}forall}bdf
+/lshow{4 1 roll exch/@1 exch def{1 index wi pop sub 1 index sm dv 0 @1 4 -1 roll widthshow}{1 index wi pop sub
+1 index dup sm 10 mul exch length 1 sub add dv dup 10. mul 0 @1 4 -1 roll 0 6 -1 roll awidthshow}ifelse}bdf
+/setTxMode{sa 9 2 index put 3 eq{1}{0}ifelse setgray}bdf
+/SwToSym{{}mark false/Symbol/|______Symbol 0 rf 0 sa 6 get 0 ne{pop 1}{sa 7 get 0 eq{pop 2}if}ifelse
+sa 1 get 0 ne/|______Symbol
+sa 4 get 0 ne{vs}{sa 3 get 0 ne{vo}{fnt}ifelse}ifelse}bdf
+/mc{0 3 1 roll transform neg exch pop}bdf
+/ul{dup 0 ne sa 2 get 0 ne and{gsave 0 0
+/UnderlinePosition kif{mc}{ps -10 div}ifelse/UnderlineThickness kif{mc}{ps 15 div}ifelse
+abs setlinewidth neg rmoveto
+sa 4 get 0 ne{gsave currentlinewidth 2. div dup rmoveto currentpoint newpath moveto
+2 copy rlineto stroke grestore}if
+sa 3 get sa 4 get or 0 ne{gsave gl 2 copy rlineto stroke grestore rlineto strokepath nlw pys div setlinewidth}{rlineto}ifelse
+stroke grestore}{pop}ifelse}bdf
+/sgt{2 copy known{get true}{pop pop false}ifelse}bdf
+/kif{currentfont dup/FontMatrix get exch/FontInfo sgt{true}{currentfont/df sgt
+{dup/FontInfo sgt{3 1 roll/FontMatrix get mtx concatmatrix exch true}{pop pop pop false}
+ifelse}{pop pop false}ifelse}ifelse{3 -1 roll sgt{exch true}{pop false}ifelse}{false}ifelse}bdf
+/blank/Times-Roman findfont/CharStrings get/space get def
+/macvec 256 array def
+/NUL/SOH/STX/ETX/EOT/ENQ/ACK/BEL/BS/HT/LF/VT/FF/CR/SO/SI
+/DLE/DC1/DC2/DC3/DC4/NAK/SYN/ETB/CAN/EM/SUB/ESC/FS/GS/RS/US
+macvec 0 32 getinterval astore pop
+macvec 32/Times-Roman findfont/Encoding get
+32 96 getinterval putinterval macvec dup 39/quotesingle put 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/blank/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex
+/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+macvec 128 128 getinterval astore pop
+{}mark true/Courier/|______Courier 0 rf
+{/Metrics 21 dict begin/zero 600 def/one 600 def/two 600 def/three 600 def/four 600 def/five 600 def/six 600 def/seven 600 def/eight 600 def
+/nine 600 def/comma 600 def/period 600 def/dollar 600 def/numbersign 600 def/percent 600 def/plus 600 def/hyphen 600 def/E 600 def/parenleft 600 def/parenright 600 def/space 600 def
+currentdict end def currentdict/UniqueID known{/UniqueID 16#800000 def}if/FontBBox FontBBox 4 array astore def}mark true/Helvetica/|______Seattle 1 rf
+/oldsettransfer/settransfer load def
+/concatprocs{/proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def
+newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx}def
+/settransfer{currenttransfer concatprocs oldsettransfer}def
+/PaintBlack{{1 exch sub}settransfer gsave newpath clippath 1 setgray fill grestore}def
+/od{(Rvd\001\001\000\000\177) fg copy pop txpose
+1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark
+{transform{itransform moveto}}{transform{itransform lineto}}
+{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform
+{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}
+{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}bdf
+/cd{}bdf
+/op{/sfl false def/pm save def}bdf
+/cp{not{userdict/#copies 0 put}if ma 0 gt{{t1 the{exit}if}loop}if{copypage}{showpage}ifelse pm restore}def
+/px{0 3 1 roll tp tt}bdf
+/psb{/us save def}bdf
+/pse{us restore}bdf
+/ct 40 string def
+/nc{currentpoint initclip newpath gc{dup type dup/arraytype eq exch/packedarraytype eq or{exec}if}
+forall clip newpath moveto}def
+/kp{ct 0 2 index length 2 index 39 2 index put getinterval copy cvx exec mx3 currentmatrix pop}bdf
+/av 68 def
+end
+LW 1 eq userdict/a4small known not and{/a4small
+[[300 72 div 0 0 -300 72 div -120 3381]
+280 3255
+{statusdict/jobstate (printing) put 0 setblink
+margins
+exch 196 add exch 304 add 8 div round cvi frametoroket
+statusdict/jobstate (busy) put
+1 setblink}
+/framedevice load
+60 45{dup mul exch dup mul add 1.0 exch sub}/setscreen load
+{}/settransfer load/initgraphics load/erasepage load]cvx
+statusdict begin bind end readonly def}if
+md begin/bigs[lnop userdict/letter known{/letter load}{lnop}ifelse userdict/legal known{/legal load}{lnop}ifelse userdict/a4 known{/a4 load}{lnop}ifelse userdict/b5 known{/b5 load}{lnop}ifelse
+lnop lnop lnop /tab load]def
+/smalls[lnop userdict/lettersmall known{/lettersmall load}{userdict/note known{/note load}{lnop}ifelse}ifelse
+userdict/legal known{/legal load}{lnop}ifelse userdict/a4small known{/a4small load}{lnop}ifelse
+userdict/b5 known{/b5 load}{userdict/note known{/note load}{lnop}ifelse}ifelse lnop lnop lnop /tab load]def end
+systemdict/currentpacking known{setpacking}if
+currentfile ok userdict/stretch known not and{eexec}{readtocleartomark}ifelse
+373A767D4B7FD94FE5903B7014B1B8D3BED02632C855D56F458B118ACF3AF73FC4EF5E81F5749042B5F9CF1016D093B75F250B7D8280B2EACE05A37037F7BDF6E12226D7D4E2DF2C52FAFD5FD40FE72A0D3AC4BD485D8369D4C87636E920D1DAF222D92155A9CB1667E715F0B82799B37CC8F5B32B74B39CF494536DC39C7EF04A7BCB29E2CEC79073CADCCFB23B4AA1363F876F5121B618071B7B4EB1E5DE75FAA2368A3E5DB2B198623AFE92AE9484270FE7F57A850E88C0D3EEA156611C91D8E480D4370B025CCA6929A2BF40AD3D01B2CB7EE6DFB46E12A830542337F7819B67F9765210F76DB06F34DA5B13A11759305C582E16D2B854939F6D9121F2A4F285282F5DCD3D15896D121E3D6F5BE79E087451BB0ED233CDBEF090D3B4AC2DC34B97E70C61D95FB072B8C12D2ABD843520949A39DCF99E2C1AA8FBCD025E47E0A82A8D96E75BAF40F52AD402495BBD4DE0F356C8B14E764874E639C9F045A0D1908EC6456EB6C5B8A6F826192F767EF2C55A21C58F5F9CC1F59247B55F2387828C7FE89D5E7D8484D1BC86CB6673BDBE4FE17DD9BDE95224FE645136F41330BF155A4DDE1B0A32233BF471CE58FBC660DC7E641B0A0D30018454E2191C414A3011FF3FED1C0D88FE1FF9F75DCC456D097947226FBEC92509146D3A4CFFC0471B31C53222ED9DD88566F60F6C0D705AD79DACF53B070026F083ED28B5CF75
+
+7XAAA0A169F6F320A75E9D2ED50ABD939AF85B6346C2ADB25D168F10508E1516D194C635E6B187FADEA0829DBF0390C0F003F0265E215BC96CA3CC13D4A8E01570BE193CA75A620728CD275ACF1986EFFB3A13419FE55EA7C4467B7E7EEDC1FC29C9F8C46A557D2CCDB914EF7B93E7530D555DFC2398AFC68CAD991F062EF85BAA1884EC166C7C5DF8543666D8C41BE267D706BD1588F1F662F705CAE4D29DC38EF66BFAA89470D8A099B6F1B4587F7B024412276106FCD3EB5AE17A5D1DF1781992DC40EA0A992F706F701304CEA9D9073E7A74F1E687D81C3E5841D31CF86855BAAAD9B5D30317C75150A857C6B114735315CDD1AEF36C26BBB0645499406DEE2F24B3B1C72FEC97C7BA31AA2CDAB25418BB1DC4C7E4757F1D625087B0FD0300C03A65F2A72CE734925735277E034CDCF599129679F70CC8B66E03878851DB75041F275E1E5761F3EC753BE1359CA364A22047AE4886217F9259FE19FF5B116E8019B98B143114B313E8BEF87EC949D85C82E0812E6F50525E73890AF362CC8EE8A85F4197E6AC18638EF12E56A808D439AF1BFD363F140314BF4E534485C42F1856688CC35288E8D770120A420FB9F1FCF8AE8BD6D6156CC23E6C51119FE4DE1B68C9DF3487E9974BF9ED31F8D3CE93FF101867319F2FF492D5D398B4F09A66F2F55BCAB34B99173B7EE89039D00DD21A7B3A52E9F028F8301B5FC12D409
+
+41X2E064513BC579AAC498F577EA8ECD1FE3E42DC3CC320786C7B00194FEDF344402C33FC492D4BA86992B01683F440220FFE756BC88A94223D316078D69D33560E8EAB76B24CB7AA4320CF435593D76F624324ABE00B5587A4F283C725EA24567133F25F472B5E2E4474DDB5A16AC5F2DF32350395D3E3892FE361F4D5C9A610C654C9227614FBBAFF3356A90A2266E00F66234061075491571A65616211257F160000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+currentfile ok userdict/smooth4 known not and{eexec}{readtocleartomark}ifelse
+F94E00EE41A71C59E5CAEED1EDBCF23D1DBA1EE99B9BB356492923BD8B1BA83A87CEB0E07377A31FD6241E814681118E17DC7CACE570399506E6E441B871B6043831BD03EFC11DBBD8001EE2FF8CFBD485065D455A2E15AC36F1A84AD8789FA6461199C7CD14CB9FD64D4B06452B7FC0A8FC263F70F1CCB893295D4DE70ADAB771C0F84396FA98C60B11DA02ABA157298DF0A23621853BEF167443A985ADC09BEFFD51CB4D29179E2B34609EF38A49DA61F4BFC256A3DE0732D7D29754A194857B9C9E9971227AA1DD0611FBB10E44E5FF66C062D9C24ED3290529330BC317825E876929582DB0E39B9FC5EFD20CC1D4F94920EB9C534D0DA90DE70D25BC7287319CF28602B3F46633C242CAFC8905E960317E3C2FA20AB8DB06ADBAF292FC7BA2CA14EE65DF28B99CC11666B70AD33E8E1D57D63D4B89ECC615AE5747C1CA752C833D8D6DE54CD4A0350B44310555CE3BD2C615ADD27B634CDB350AF3A432CE78AACD2909A5B586F666CD87919A36DB1CBE86B3CE281DFD01CD7E1B8A18A4B415CECBFF79A5C4390A15EA77D14D6BE12BAB5A8268C3F286D0590060647CABED674443CD258F11415E866AB330A251691B61F2422A61AFE59B6B4FBDCF85ED9BA0F8E483C034089E6877FF5923698D3A0DC0EED6B9CFD32DF0839BC4EA5F6D1FCB6DD0920391E57E84745131D02D100179F4E0A68EC0A5FF6680A6F463D038
+
+BX04AF63FFA13D743B995A26A743C26D387209023C91DE43DF047A16F328AC9DDC08573B38BE9EA341EA16C78EC32F3A1B36B90D95A50610F4D050EC1C33497F3F3A81A1B4C8BEF0BA84EE2FAA32DC112DAC490AF53E1749C4A0D866CAF7B893E52383B0D38065C333FB122B700D7246F7EE87D942AE3DB5C1DD77E9E76C80CC5AD63D28DFED0E229CE604673F78CD47F258FDF5BF3A3EAEC5C9BC8E482D8DBA9D268A35DA8C095A690679ED2123E8B8F5E4826FA3B199EAA5D482D4B6AA86572E387CECEB7149C8947F41D6339328A748A17F8C4AD3B0555F1E409450BA0C564F1F488BB5096EB003568D4D5EF6489897E27409547D0EE4487D30184793B0F27BD265A64BDB3EA6761569DA955620C612E718677B77D6D81B999C6298877AFE0D1D6F6F358377A8BD2402F669C64B972B3A065EF7DD4BDEFFFE17E63DB8898FA6E69166B710AAD6BA2EA9AF61E4B8C8701638D4D6E4DFFFC192AEF6BC027095C4C72D748979675BA29FAF61E75343E14E61034602E5A79CD2519796ED6A9CC4EDEA46A9B59D4A807E786B5EE46F25B0360BC8E7C12D723122CDEEF247C9776F4C99C8EBED6828AA19744B5ADF0D07D95D98B3072372388D41B0FAB1CCE2775170679575ECDCA13B22A17FE9C6605C3445F58F1A829512DAB6C528F83580C8AA53C35D605F626F5AD0B7FC1EA87D69A835E3F53A1F450FB0AF42A5772F89D92
+
+A5X0D10F15BDBDA409F50C0B8AB93FE8A16D029DD8BB5C480D1466735ED4D9CAF637E5ECD6C2ECB6BF3B3EFBEE7AB936D2C568E3009D156B87CACB1FB3A48A70BC91B2EC35CC9147FFB1A524E2B2F2E4E2C1B12F1C1C63768BB95CD62FEC01CBA79B9FA282DD4DF49990F27FF8EE4E2DDE2F0ACD83BC9D4BE0090192C7A799967EC4DC2D63C0835E22D4C4B366D7FDCF3A05A4B53DF780F986EF25C79B665D5C00EFF7F17C0BB6D544F9D83A7FDAC47D9C5683A656011374253C918FF6EA64749DD971B2300DD5320033E01EC591F6318CCE94CE2B81C04322EC52B624E50643B5239
+1CCD2AB56396A2AD8E2D3CA61B80D9D4CC363B2DF7863526958CDF3497E36648406C317E58EC563E7C26149A2A3C643ADFB39A8DD92974C6D2A2A9D7B71CDF3FEBBF32BB02E7B45CF53AAEAD5E963A4AA4AF9A149A08A4EC303D5F2369977E93F54897EEAD31B06C5845D63F49D65F8E5573962241A57CCD717CE6CA8C784A11192943616EA059B51BC38429E18D0121FCBB6FBD5D909B0D89E616C66DEF6A0F165A7030BD911A1B120468329CBB006C8D37720E531CF31E878CB4AAAC137633675C3D546F5162487AB35F470C042BDEB945E0F2532BF92AA6FD53434440221ECD3533A7AA89900CB19EFE2CD872DF8B7969AF0D3B72BF31DC5DD69CA6460966F61AB17CB507964098DBA3AF122EEC3128A9BAFE1034493F372B36BD13512X05E9043A67C544402D8BCE24358C8A5CE33867A00794CF7097D59C88279A11EE9C854E7E7AAE881F9828C569D208F5F33375F59E9A3818CFA38AAD0CBFBA32F9F44A8BB79DE4C40E3886457C16DA4A27953AA1E99472E35F2323F0BAA5E37DC28CBA46FEFB73B190016055ADD4D27615D748499A0E1C4B8C7EC339C1C4D95A813A85918A8D01EEB485DDCDCEA6EA3F2C2A9D85C139CD90CCB352634F9AFE836BCAC0C274E352BA2071B5269D5DE4CCDE3FF990CBA974980C7332AE1545A9C60D5D1459D3AE95C1AC065733AF14FADB440A110DD539563B8D850CD0704C52F3F7C
+
+CCB53630D776560CBD22D8FF08F5B354487A171AEC15F5F54DE9CAB668BCAC573E788D92762EF63E76087005F4AC2D02E0CAC173C11BE62ACE5DC4D3374F2F9746C9981E125FF9AB8CAE76D13039E2C54DFD708E028A619EA1ED78E6B46F06DF0D0B74BBEDD8C190C7C0CEBDE8F7A4888CC36575313478DD2CFE392E9BB7B2416955D44B7024A3BA43FBF37293B386D64746D7748895411D243FAEC50638F2AA33337D7FA018ADDAC5835A0DDFAE99AD6299DFB4CA6872C59853E3AC12FC9E3D26629C5B49CF844C87B3C4BFBE3074E3A1CE6984758C20C661084381CD6B4582D84F19C0000B5FC0DCB42B567E396031601C095D7016283EBE5F13CD8A3A374A74DDBBABD36081149F8BC242085F2F7297CC97FD3B8BAD206D8AC9707A39ECXCC7963B522E08DA391A1EF12DD4D746DBDDDCC0834F88160CF189A9645567CEC2F023A571AF0DFD15DB85B744C28C000DF53B05F8F210841F6E87A04F20C777B7C0BE6182BE2E90226E5301A12532A745F2FAAA81637CF11B78CD2B99A4D18B862D6C5DBD31793FB16A2D9AAD376D4484D75AA833D0068B1D34DB74E3302480854E3B5484D8A47E39A89A2FA927BC3641EA7F8E004FDE4C2F08D40D99F1ACB47CAF6887629BF6DFE12968D297596D28CE0CF148B12E7DCB49FB94F5ADBD214C3A6CE1E249831BA9EB8A189F2CE1ABE39A7B537253E369A508A2AF2ADB9463F9B
+
+56BBBFF31D535FF997F537C6675C196E7ECBD493F652FA7CC6D9C1CA3379BFDB5AF7513C6E834054494296B91A6EE800114363D5D5D0759F41B4DECB653B9DE3E94583579EF549ED5F3FAFB12661ABC0C57A332406517ED3454EDED34B386C60F78DC976266E0EAF54FC245FB0E3EFC8016236436B599C1C97A8C5E0AC8F7836161873C71F01ED9CC25C236420F41FD8277993D3959205912FA0927B59E3DAE7377D82079447D6E41EE5AEC0DFFF79AF8F4ED47F17EE708FEA45877860D56F8CBCE65A061E8E1CA4A5FBAF0E13429A7F0ADB6F178FA449F46CC539BBC0107E3A53B1C
+362A04B20E6D721E7E6E1E4976A11DDC98C7614D22B53DFBB6DAE533AC9BE882021A735C30DAA4A44AED09F49A390E8CFF59BD9C30667AF21B03EC5CEBXD5C2C3AA2769E8D714191A48E7DDF50B13D1560E82EFB65FCE601AE9E8C351FBA1DED80B7351314E7F9F9A784BFE3759B7E322A84E7B51F9DC5F5D9C8050CD79B27C0A4B0DD68A3C27A948AD6858E35B960D2DEA838C479CAEA83B1A912174ACB2100E55E7A14892D7A9B3711FF0B20065C1995B49E1F23464A92DD140642E3A7B1973849E64D1A3CF60000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndProcSet
diff --git a/Build/source/utils/psutils/md71_0.ps b/Build/source/utils/psutils/md71_0.ps
new file mode 100644
index 00000000000..43c102c4f2f
--- /dev/null
+++ b/Build/source/utils/psutils/md71_0.ps
@@ -0,0 +1,461 @@
+%%BeginProcSet: (AppleDict md) 71 0
+%
+/readtocleartomark{/markindex 0 def %AJCD-skip up to next "cleartomark"%
+{dup read pop (cleartomark) markindex get eq {/markindex markindex 1 add def
+markindex 11 ge {exit}if} {/markindex 0 def} ifelse }loop pop}bind def
+%
+/cexec where {pop}{userdict/cexec{pop} put}ifelse
+%
+userdict/LW{save statusdict/product get(LaserWriter)anchorsearch
+exch pop{dup length 0 eq{pop 1}{( Plus)eq{2}{3}ifelse}ifelse}{0}ifelse exch restore}bind put
+userdict/patchOK known not{save LW dup 1 ne exch 2 ne and false
+<b2141b454416935af37a7aaa0da9c65dc132b2769a52440afe20a0cbebb10165dd489cfea1d364af8c057775a06614ecf9e854768266a93ceba928c4b99fdd5901ac5017c6924439ddfdde5
+a3d2320213ad0e7bed9f6d9584d8d366f97ce8b329c8ad68dd069c712530e3fec4a44ecb416b5a972f60f9392b77f99b19b747ec8911c49fcbe0a84ebbeafc9ab5cfeea6fb158a765d07fefa
+2738c3fee54c71fae54bce3bfb575801b442350e1fcf39ff41e73cf98b04d560cb39ec9e0407484ff349706>
+{eexec}stopped{dup type/stringtype eq{pop}if}if and exch restore userdict/patchOK 3 -1 roll put}if
+userdict/downloadOK known not{userdict/downloadOK{ vmstatus exch sub exch pop 120000 gt patchOK and}bind put}if
+userdict/type42known known not{userdict/type42known systemdict/resourcestatus known{42/FontType resourcestatus{pop pop true}{false}ifelse }{false}ifelse put}if
+type42known not downloadOK and {userdict begin /*charpath /charpath load def/charpathflag false def/charpath{userdict/charpathflag true put userdict/*charpath get exec userdict/charpathflag false put}bind def end}if
+userdict/checkload known not{userdict/checkload{{pop exec} {save 3 dict begin/mystring 6050 string def
+exch/endstring exch def{currentfile mystring readline not{stop}if endstring eq{exit}if}loop end restore pop}ifelse}bind put}if
+userdict/LW+{LW 2 eq}bind put
+userdict/ok known not{userdict/ok{systemdict/statusdict known dup{LW 0 gt and}if}bind put}if
+systemdict/currentpacking known{currentpacking true setpacking}if
+/md 270 dict def md begin
+/av 71 def
+/T true def/F false def/mtx matrix def/s75 75 string def/sa8 8 string def/sb8 8 string def
+/sc8 8 string def/sd8 8 string def/s1 ( ) def/pxs 1 def/pys 1 def
+/ns false def
+1 0 mtx defaultmatrix dtransform exch atan/pa exch def/nlw .24 def/ppr [-32 -29.52 762 582.48] def
+/pgr [0 0 0 0] def
+/pgs 1 def/por true def/xb 500 array def/so true def/tso true def/fillflag false def/pnm 1 def/fmv true def
+/sfl false def/ma 0 def/invertflag false def/dbinvertflag false def/xflip false def/yflip false def/noflips true def/scaleby96 false def/fNote true def/fBitStretch true def
+/4colors false def/fg (Rvd\001\001\000\000\177) def
+/bdf{bind def}bind def
+/xdf{exch def}bdf
+/xl{neg exch neg translate}bdf
+/fp{pnsh 0 ne pnsv 0 ne and}bdf
+/nop{}bdf/lnop[/nop load]cvx bdf
+/vrb[
+{fp{fg 6 get 0 ne{gsave stroke grestore}{gsave 1 setlinewidth pnsh pnsv scale stroke grestore}ifelse}if newpath}bind
+/eofill load
+dup
+/newpath load
+2 index
+dup
+{clip newpath}bind
+{}bind
+dup
+2 copy
+]def
+/sgd systemdict/setpagedevice known{{2 dict begin/PreRenderingEnhance exch def/Policies 1 dict dup/PreRenderingEnhance 1 put def currentdict end setpagedevice}}{{pop}}ifelse bdf
+/svsc systemdict/currentcolorscreen known{{currentcolorscreen/dkspf xdf/dkrot xdf/dkfreq xdf/dyspf xdf/dyrot xdf/dyfreq xdf/dmspf xdf/dmrot xdf/dmfreq xdf
+/dcspf xdf/dcrot xdf/dcfreq xdf}}{{currentscreen/spf xdf/rot xdf/freq xdf}}ifelse bdf
+/doop{vrb exch get exec}bdf
+/psu{/udf xdf/tso xdf /fNote xdf/fBitStretch xdf/scaleby96 xdf/yflip xdf/xflip xdf
+/invertflag xdf/dbinvertflag invertflag statusdict begin version cvr 47.0 ge product (LaserWriter) eq not and end invertflag and {not}if def
+xflip yflip or{/noflips false def}if
+/pgs xdf 2 index .72 mul exch div/pys xdf div .72 mul/pxs xdf ppr astore pop pgr astore pop/por xdf sn and/so xdf}bdf
+/tab{userdict /11x17 known{userdict begin /11x17 load exec end}{statusdict /setpage known{statusdict begin 792 1224 1 setpage end}{statusdict /setpageparams known{statusdict begin 792 1224 0 1 setpageparams end}if}ifelse}ifelse}bdf
+/a3Size{userdict /a3 known{userdict begin /a3 load exec end}{statusdict /setpageparams known{statusdict begin 842 1191 0 1 setpageparams end}if}ifelse}bdf
+/txpose{fNote{smalls}{bigs}ifelse pgs get exec pxs pys scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if
+xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if
+xflip yflip not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate}if}
+{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if
+xflip yflip not and{translate pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate}if}ifelse
+statusdict begin/waittimeout where{pop waittimeout 300 lt{statusdict/waittimeout 300 put}if}if end
+scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy translate .96 dup scale neg exch neg exch translate}if}bdf
+/fr{4 copy pgr aload pop 3 -1 roll add 3 1 roll exch add 6 2 roll 3 -1 roll
+sub 3 1 roll exch sub 3 -1 roll exch div 3 1 roll div exch scale pop pop xl}bdf
+/obl{{0.212557 mul}{pop 0}ifelse}bdf
+/sfd{ps fg 5 -1 roll get mul 100 div 0 ps 5 -1 roll obl ps neg 0 0 6a astore makefont setfont}bdf
+/fnt{findfont sfd}bdf
+/bt{sa 3 1 roll 3 index and put}bdf
+/sa(\000\000\000\000\000\000\000\000\000\000)def
+/fs{0 1 bt 1 2 bt 2 4 bt 3 8 bt 4 16 bt 5 32 bt 6 64 bt 7 128 bt sa exch 8 exch put}bdf
+/mx1 matrix def
+/mx2 matrix def
+/mx3 matrix def
+/bu{currentpoint 4colors{currentcmykcolor}{currentrgbcolor}ifelse currentlinewidth currentlinecap currentlinejoin
+currentdash exch aload length fg 5 sfl{1}{0}ifelse put pnsv pnsh
+2t aload pop 3a aload pop mx2 aload pop mx1 aload pop mtx currentmatrix aload pop
+mx3 aload pop ps pm restore/ps xdf mx3 astore pop}bdf
+/bn{/pm save def mx3 setmatrix newpath 0 0 moveto ct dup 39 get 0 exch getinterval cvx exec mtx astore setmatrix mx1 astore pop mx2 astore pop 3a
+astore pop 2t astore pop/pnsh xdf/pnsv xdf gw
+/sfl fg 5 get 0 ne def array astore exch setdash setlinejoin setlinecap
+setlinewidth 4colors{mysetcmykcolor}{setrgbcolor}ifelse moveto}bdf
+/fc{}bdf
+/tc{32768 div add 3 1 roll 32768 div add 2t astore pop}bdf
+/3a [0 0 0] def
+/2t 2 array def
+/tp{3a astore pop}bdf
+/tt{mx2 currentmatrix pop currentpoint 2 copy 2t aload pop qa 2 copy translate 3a aload pop exch dup 0 eq
+{pop}{1 eq{-1 1}{1 -1}ifelse scale}ifelse rotate pop neg exch neg exch translate moveto}bdf
+/te{mx2 setmatrix}bdf
+/th{3 -1 roll div 3 1 roll exch div 2 copy mx1 scale pop scale/sfl true def}bdf
+/tu{1 1 mx1 itransform scale/sfl false def}bdf
+/ts{1 1 mx1 transform scale/sfl true def}bdf
+/fz{/ps xdf}bdf
+/dv{dup 0 ne{div}{pop}ifelse}bdf
+/pop4{pop pop pop pop}bdf
+/it{sfl{mx1 itransform}if}bdf
+/gm{exch it moveto}bdf/rm{it rmoveto}bdf
+/lm{currentpoint sfl{mx1 transform}if exch pop sub 0 exch it rmoveto}bdf
+/fm{statusdict/manualfeed known}bdf
+/se{statusdict exch/manualfeed exch put}bdf
+/mf{dup/ma exch def 0 gt{fm se/t1 5 st ok ma 1 gt and{/t2 0 st/t3 0 st
+statusdict/manualfeedtimeout 3600 put
+}if}if}bdf
+/jn{/statusdict where exch pop{statusdict exch /jobname exch put}if}bdf
+/pen{pnm mul/pnsh xdf pnm mul/pnsv xdf pnsh setlinewidth}bdf
+/min{2 copy gt{exch}if pop}bdf
+/max{2 copy lt{exch}if pop}bdf
+/dh{fg 6 1 put array astore dup {1 pxs div mul exch}forall astore exch pop exch pop exch setdash}bdf
+/ih[currentdash]def
+/rh{fg 6 0 put ih aload pop setdash}bdf
+/dl{gsave nlw pys div setlinewidth 0 setgray}bdf
+/dlin{exch currentpoint currentlinewidth 2 div dup
+translate newpath moveto lineto currentpoint stroke grestore moveto}bdf
+/lin{fg 6 get 0 ne{exch lineto currentpoint 0 doop moveto}
+{exch currentpoint/pnlv xdf/pnlh xdf gsave newpath/@1 xdf/@2 xdf fp{pnlh @2 lt{pnlv @1 ge
+{pnlh pnlv moveto @2 @1 lineto pnsh 0 rlineto
+0 pnsv rlineto pnlh pnsh add pnlv pnsv add lineto pnsh neg 0 rlineto}
+{pnlh pnlv moveto pnsh 0 rlineto @2 pnsh add @1 lineto 0 pnsv rlineto
+pnsh neg 0 rlineto pnlh pnlv pnsv add lineto}ifelse}{pnlv @1 gt
+{@2 @1 moveto pnsh 0 rlineto pnlh pnsh add pnlv lineto 0 pnsv rlineto
+pnsh neg 0 rlineto @2 @1 pnsv add lineto}{pnlh pnlv moveto pnsh 0 rlineto
+0 pnsv rlineto @2 pnsh add @1 pnsv add lineto pnsh neg 0 rlineto
+0 pnsv neg rlineto}ifelse}ifelse
+closepath fill}if @2 @1 grestore moveto}ifelse}bdf
+/gw{/pnm fg 3 get fg 4 get div def}bdf
+/lw{fg exch 4 exch put fg exch 3 exch put gw pnsv pnsh pen}bdf
+/barc{/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf
+/@6 xdf/@7 xdf/@8 xdf gsave
+@5 @7 add 2 div @6 @8 add 2 div translate newpath 0 0 moveto
+@5 @7 sub @6 @8 sub mtx currentmatrix pop scale @1{newpath}if
+0 0 0.5 @4 @3 arc @4 @3 sub abs 360 ge{closepath}if
+mtx setmatrix @2 doop grestore}bdf
+/ar{dup 0 eq barc}bdf
+/ov{0 exch 360 exch true barc}bdf
+/rc{dup/@t xdf 0 eq{4 copy 3 -1 roll eq 3 1 roll eq and{pnsv 2 div sub exch pnsh 2 div sub exch 4 2 roll pnsv 2 div add exch pnsh 2 div add exch
+/@t 1 def}if}if currentpoint 6 2 roll newpath 4 copy 4 2 roll exch moveto 6 -1 roll lineto lineto lineto closepath @t doop moveto}bdf
+/mup{dup pnsh 2 div le exch pnsv 2 div le or}bdf
+/rr{/@1 xdf 2. div/@2 xdf 2. div/@3 xdf
+/@4 xdf/@5 xdf/@6 xdf/@7 xdf
+@7 @5 eq @6 @4 eq @2 mup or or{@7 @6 @5 @4 @1 rc}
+{@4 @6 sub 2. div dup @2 lt{/@2 xdf}{pop}ifelse
+@5 @7 sub 2. div dup @2 lt{/@2 xdf}{pop}ifelse
+@1 0 eq{/@2 @2 pnsh 2 div 2 copy gt{sub def}{0 pop4}ifelse}if
+currentpoint newpath
+@4 @6 add 2. div @7 moveto
+@4 @7 @4 @5 @2 arcto pop4
+@4 @5 @6 @5 @2 arcto pop4
+@6 @5 @6 @7 @2 arcto pop4
+@6 @7 @4 @7 @2 arcto pop4
+closepath @1 doop moveto}ifelse}bdf
+/pr{gsave newpath/pl{exch moveto/pl{exch lineto}def}def}bdf
+/pl{exch lineto}bdf
+/ep{dup 0 eq{{moveto}{exch lin}{}{(%%[|1|]%%)= flush}pathforall
+pop grestore}{doop grestore}ifelse currentpoint newpath moveto}bdf
+/gr{64. div setgray}bdf
+/savescreen{ns not{/ns true def systemdict/currentcolorscreen known{currentcolorscreen/pkspf xdf/pkrot xdf/pkfreq xdf/pyspf xdf/pyrot xdf/pyfreq xdf/pmspf xdf/pmrot xdf/pmfreq xdf
+/pcspf xdf/pcrot xdf/pcfreq xdf}{currentscreen/sspf xdf/srot xdf/sfreq xdf}ifelse}if}bdf
+/restorescreen{/ns false def systemdict/setcolorscreen known{pcfreq pcrot/pcspf load pmfreq pmrot/pmspf load pyfreq pyrot/pyspf load
+pkfreq pkrot/pkspf load setcolorscreen}{sfreq srot/sspf load setscreen}ifelse}bdf
+/pat{savescreen sa8
+copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi sa8 exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}setscreen exch not{gr}{pop}ifelse}bdf
+/sg{restorescreen gr}bdf
+/cpat{savescreen 10 2 roll 7 -1 roll sa8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi sa8 exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}8 -1 roll sb8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi sb8
+exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}9 -1 roll sc8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi sc8 exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}10 -1 roll sd8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi sd8
+exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}psuedo1 dsc 4{4 -1 roll 1 exch 64 div sub}repeat mysetcmykcolor pop pop}bdf
+systemdict/setcolorscreen known{/psuedo1 lnop bdf/dsc/setcolorscreen load def}{/psuedo1{16{pop}repeat sa8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi sa8 exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}}bdf
+/bwsc{setscreen dup gr 0 exch 0 exch 64 exch 64 exch 64 exch}bdf/dsc/bwsc load def
+}ifelse
+systemdict/setcmykcolor known{/mysetcmykcolor /setcmykcolor load def}{/mysetcmykcolor{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll}repeat setrgbcolor pop}bdf}ifelse
+/dc{transform round .5 sub exch round .5 sub exch itransform}bdf
+/sn{userdict/smooth4 known}bdf
+/x8{3 bitshift}bdf
+/x4{2 bitshift}bdf
+/d4{-2 bitshift}bdf
+/d8{-3 bitshift}bdf
+/rb{15 add -4 bitshift 1 bitshift}bdf
+/db{/@7 save def/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf/@6 @5 @3 4 add mul def
+dc translate scale/xdbit 1 1 idtransform abs/ydbit exch def abs def{0 0 1 ydbit add 1 10 rc clip}if
+@1 0 eq @1 4 eq or{currentrgbcolor 1 setgray ydbit 0 1 ydbit add 1 2 rc setrgbcolor}if
+@1 3 eq @1 7 eq or{1 setgray}{currentrgbcolor 2 index eq exch 2 index eq and exch pop{0 setgray}if}ifelse/@9 @1 0 eq @1 1 eq @1 3 eq or or dbinvertflag xor def/@13 @6 def
+@2 fBitStretch or{/@10 @4 x4 def/@11 @3 x4 def/@12 @10 rb def/@13 @12 @11 mul def/@15 1 1 dtransform abs/calcY 1 index def round cvi/@14 exch def
+abs/calcX 1 index def round cvi scaleby96 not{1 add}if def/@16 @15 rb def/@17 @16 @14 mul def}if
+sn @13 60000 lt and @2 fBitStretch or and{mtx currentmatrix dup 1 get exch 2 get 0. eq exch 0. eq and @17 60000 lt and fBitStretch and{@16 3 bitshift @14 @9 [calcX 0 0 calcY 0 0]{@17 string @13 string
+currentfile @6 string readhexstring pop 1 index @4 @3 @5 @12 @2 smooth4
+@10 @11 @12 dup string 5 index @15 @14 @16 dup string stretch}imagemask}{@12 x8 @11 @9 [@10 0 0 @11 0 0]{@13 string
+currentfile @6 string readhexstring pop 1 index @4 @3 @5 @12 @2 smooth4}imagemask}ifelse}{@5 3 bitshift @3 4 add @9 [@4 0 0 @3 0 2]{currentfile @6 string readhexstring pop}imagemask}ifelse
+@7 restore}bdf
+systemdict/setcmykcolor known{/psuedo lnop bdf/di/colorimage load def}{/routines[{.3 mul add 1}bind{.59 mul add 2}bind{.11 mul add round cvi str exch i exch put/i i 1 add def 0 0}bind]def
+/psuedo{/i 0 def 0 exch 0 exch{exch routines exch get exec}forall pop pop str}bdf/bwi{pop pop image}bdf/di/bwi load def}ifelse
+/cdb{/@7 save def/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf
+systemdict/setcmykcolor known not{dc}if translate scale /@6 xdf
+/@18 @5 dup 60000 ge{pop 60000}if string def @6 not{/str @18 0 @18 length 3 idiv getinterval def}if @4 @3 8 [@4 0 0 @3 0 0]@6{{currentfile @18 readhexstring pop}image}{{currentfile @18 readhexstring pop psuedo}false 3 di}ifelse @7 restore}bdf
+/wd 16 dict def
+/mfont 14 dict def
+/mdf{mfont wcheck not{/mfont 14 dict def}if mfont begin xdf end}bdf
+/cf{{1 index/FID ne{def}{pop pop}ifelse}forall}bdf/rf{/@1 exch def/@2 exch def
+FontDirectory @2 known{cleartomark pop}{findfont dup begin dup length @1 add dict begin
+cf{/Encoding macvec def}{Encoding dup length array copy/Encoding exch def
+counttomark 2 idiv{Encoding 3 1 roll put}repeat}ifelse
+pop
+exec currentdict end end @2 exch definefont pop}ifelse}bdf
+/bmbc{exch begin wd begin
+/cr xdf
+save
+CharTable cr 6 mul 6 getinterval{}forall
+/bitheight xdf/bitwidth xdf
+.96 div/width xdf
+Gkernmax add/XOffset xdf Gdescent add/YOffset xdf/rowbytes xdf
+rowbytes 255 eq{0 0 0 0 0 0 setcachedevice}
+{Gnormsize dup scale
+width 0 XOffset YOffset bitwidth XOffset add bitheight YOffset add
+setcachedevice
+rowbytes 0 ne{
+XOffset YOffset translate newpath 0 0 moveto
+bitwidth bitheight scale
+sn{
+/xSmt bitwidth x4 def
+/ySmt bitheight x4 def
+/rSmt xSmt rb def
+rSmt x8 ySmt true
+[xSmt 0 0 ySmt neg 0 ySmt]
+{rSmt ySmt mul string CharData cr get
+1 index bitwidth bitheight rowbytes rSmt tso smooth4}
+}{rowbytes 3 bitshift bitheight 4 add true
+[bitwidth 0 0 bitheight neg 0 bitheight 2 add]
+{CharData cr get}
+}ifelse
+imagemask
+}if
+}ifelse
+restore
+end end
+}bdf
+/bb{.96 exch div/Gnormsize mdf 2 index
+/Gkernmax mdf 1 index/Gdescent mdf
+3 index div 4 1 roll
+2 index div 1. 5 2 roll
+exch div 4 1 roll
+4 array astore/FontBBox mdf
+}bdf
+/cdf{mfont/CharData get 3 1 roll put}bdf
+/bf{
+mfont begin
+/FontType 3 def
+/FontMatrix [1 0 0 1 0 0] def
+/Encoding macvec def
+/MFontType 0 def
+/BuildChar/bmbc load def
+end
+mfont definefont pop
+}bdf
+/wi LW 1 eq{{gsave 0 0 0 0 0 0 0 0 moveto lineto lineto lineto closepath clip stringwidth grestore}bind}{/stringwidth load}ifelse def
+/aps{0 get 124 eq}bdf
+/xc{s75 cvs dup}bdf
+/xp{put cvn}bdf
+/scs{xc 3 67 put dup 0 95 xp}bdf
+/sos{xc 3 79 xp}bdf
+/sbs{xc 1 66 xp}bdf
+/sis{xc 2 73 xp}bdf
+/sob{xc 2 79 xp}bdf
+/sss{xc 4 83 xp}bdf
+/dd{exch 1 index add 3 1 roll add exch}bdf
+/smc{moveto dup show}bdf
+/ndf2{udf{dup /FontType get 0 eq{/FDepVector get{dup /FontType get 0 eq{ndf2}{dup /df2 known{begin df2 0 null put end
+}{pop}ifelse}ifelse}forall}{/df2 known{dup begin df2 0 null put end}if}ifelse}{pop}ifelse}bdf
+/kwn{FontDirectory 1 index known{findfont dup ndf2 exch pop}}bdf
+/gl{1 currentgray sub setgray}bdf
+/newmm{dup /FontType get 0 eq{dup maxlength dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall currentdict end
+dup /FDepVector 2 copy get[exch 6 index exch 6 index exch{newmm 3 1 roll}forall pop pop] put dup
+}{/mfont 10 dict def mfont begin/FontMatrix [1 0 0 1 0 0] def
+/FontType 3 def/Encoding macvec def/df 1 index def/df2 1 array def/FontBBox [0 0 1 1] def/StyleCode 2 index def
+/mbc{bcarray StyleCode get}def/BuildChar{exch begin wd begin/cr exch def/cs s1 dup 0 cr put def df /MFontType known not{
+df2 0 get null eq{df dup length 2 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall
+/StrokeWidth 1 0 FontMatrix idtransform pop dup nlw mul pys div ps div exch 0.012 mul 2 copy le{exch}if pop def/PaintType 2 def currentdict end
+/q exch definefont df2 exch 0 exch put}if}if mbc exec end end}def end mfont}ifelse
+3 index exch definefont exch pop}bdf
+/mb{dup sbs kwn{0 2 index findfont newmm exch pop exch pop exch pop}ifelse sfd}bdf
+/mo{dup sos kwn{2 2 index findfont newmm exch pop exch pop exch pop}ifelse sfd}bdf
+/ms{dup sss kwn{4 2 index findfont newmm exch pop exch pop exch pop}ifelse sfd}bdf
+/ou{dup sos kwn{mfont/df2 known{mfont begin df2 0 null put end}if 3 2 index findfont newmm exch pop exch pop exch pop}ifelse sfd}bdf
+/su{dup sss kwn{mfont/df2 known{mfont begin df2 0 null put end}if 5 2 index findfont newmm exch pop exch pop exch pop}ifelse sfd}bdf
+/ao{/fmv true def ou}bdf/as{/fmv true def su}bdf
+/vo{/fmv false def ou}bdf/vs{/fmv false def su}bdf
+/c{currentrgbcolor dup 4 1 roll eq 3 1 roll eq and/gray xdf}bdf
+/bcarray[{/da .03 def df setfont gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs 0 0 smc da 0 smc da da smc 0 da moveto show}bind dup{/da 1 ps div def df setfont gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs 0 0 smc da 0 smc da da smc 0 da smc c gray{gl}{1 setgray}ifelse da 2. div dup moveto show}bind
+{df setfont gsave cs wi grestore setcharwidth c gray{gl}{currentrgbcolor 1 setgray}ifelse cs 0 0 smc df2 0 get setfont
+gray{gl}{4 1 roll setrgbcolor}ifelse 0 0 moveto show}bind
+{/da 1 ps div def/ds .05 def/da2 da 2. div def df setfont gsave cs wi 1 index 0 ne{exch ds add da2 add exch}if grestore setcharwidth
+cs ds da2 add .01 add 0 smc 0 ds da2 sub translate 0 0 smc da 0 smc da da smc 0 da smc c gray{gl}{1 setgray}ifelse da 2. div dup moveto show}bind
+{/da .05 def df setfont gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth c cs da .01 add 0 smc 0 da translate
+gray{gl}{currentrgbcolor 1 setgray 4 -1 roll}ifelse 0 0 smc gray{gl}{4 1 roll setrgbcolor}ifelse df2 0 get setfont 0 0 moveto show}bind]def
+/st{1000 mul usertime add dup 2147483647 gt{2147483647 sub}if def}bdf
+/the{usertime sub dup 0 lt exch -2147483648 gt and}bdf
+/6a 6 array def
+/2a 2 array def
+/3q 3 array def
+/qs{3 -1 roll sub exch 3 -1 roll sub exch}bdf
+/qa{3 -1 roll add exch 3 -1 roll add exch}bdf
+/qm{3 -1 roll 1 index mul 3 1 roll mul}bdf
+/qn{6a exch get mul}bdf
+/qA .166667 def/qB .833333 def/qC .5 def
+/qx{6a astore pop
+qA 0 qn qB 2 qn add qA 1 qn qB 3 qn add
+qB 2 qn qA 4 qn add qB 3 qn qA 5 qn add
+qC 2 qn qC 4 qn add qC 3 qn qC 5 qn add}bdf
+/qp{6 copy 12 -2 roll pop pop}bdf
+/qc{exch qp qx curveto}bdf
+/qi{{exch 4 copy 2a astore aload pop qa .5 qm newpath moveto}{exch 2 copy 6 -2 roll 2 qm qs 4 2 roll}ifelse}bdf
+/qq{{qc 2a aload pop qx curveto}{exch 4 copy qs qa qx curveto}ifelse}bdf
+/pt{currentpoint newpath moveto}bdf
+/qf{/fillflag true def}bdf
+/ec{dup 4 and 0 ne{closepath}if 1 and 0 ne{0 doop}if grestore currentpoint newpath moveto/fillflag false def}bdf
+/eu{currentpoint fp{0 ep}{grestore newpath}ifelse moveto/fillflag false def}bdf
+/bp{currentpoint newpath 2 copy moveto}bdf
+/ef{gsave fillflag{gsave eofill grestore}if}bdf
+/sm{0 exch{@1 eq{1 add}if}forall}bdf
+/lshow{4 1 roll exch/@1 exch def{1 index wi pop sub 1 index sm dv 0 @1 4 -1 roll widthshow}{1 index wi pop sub
+1 index dup sm 10 mul exch length 1 sub add dv dup 10. mul 0 @1 4 -1 roll 0 6 -1 roll awidthshow}ifelse}bdf
+/setTxMode{sa 9 2 index put exch not{3 eq{1}{0}ifelse setgray}{pop}ifelse}bdf
+/SwToSym{{}mark false/Symbol/|______Symbol 0 rf 0 sa 6 get 0 ne{pop 1}{sa 7 get 0 eq{pop 2}if}ifelse
+sa 1 get 0 ne/|______Symbol
+sa 4 get 0 ne{vs}{sa 3 get 0 ne{vo}{fnt}ifelse}ifelse}bdf
+/mc{0 3 1 roll transform neg exch pop}bdf
+/ul{dup 0 ne sa 2 get 0 ne and{gsave 0 0
+/UnderlinePosition kif{mc}{ps -10 div}ifelse/UnderlineThickness kif{mc}{ps 15 div}ifelse
+abs setlinewidth neg rmoveto
+sa 4 get 0 ne{gsave currentlinewidth 2. div dup rmoveto currentpoint newpath moveto
+2 copy rlineto stroke grestore}if
+sa 3 get sa 4 get or 0 ne{gsave currentrgbcolor dup 4 1 roll eq 3 1 roll eq and{gl}{1 setgray}ifelse 2 copy rlineto stroke grestore rlineto strokepath nlw pys div setlinewidth}{rlineto}ifelse
+stroke grestore}{pop}ifelse}bdf
+/sgt{2 copy known{get true}{pop pop false}ifelse}bdf
+/kif{currentfont dup/FontMatrix get exch/FontInfo sgt{true}{currentfont/df sgt
+{dup/FontInfo sgt{3 1 roll/FontMatrix get mtx concatmatrix exch true}{pop pop pop false}
+ifelse}{pop pop false}ifelse}ifelse{3 -1 roll sgt{exch true}{pop false}ifelse}{false}ifelse}bdf
+/blank/Times-Roman findfont/CharStrings get/space get def
+/macvec 256 array def
+/NUL/SOH/STX/ETX/EOT/ENQ/ACK/BEL/BS/HT/LF/VT/FF/CR/SO/SI
+/DLE/DC1/DC2/DC3/DC4/NAK/SYN/ETB/CAN/EM/SUB/ESC/FS/GS/RS/US
+macvec 0 32 getinterval astore pop
+macvec 32/Times-Roman findfont/Encoding get
+32 96 getinterval putinterval macvec dup 39/quotesingle put 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/blank/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex
+/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+macvec 128 128 getinterval astore pop
+{}mark true/Courier/|______Courier 0 rf
+{/Metrics 21 dict begin/zero 600 def/one 600 def/two 600 def/three 600 def/four 600 def/five 600 def/six 600 def/seven 600 def/eight 600 def
+/nine 600 def/comma 600 def/period 600 def/dollar 600 def/numbersign 600 def/percent 600 def/plus 600 def/hyphen 600 def/E 600 def/parenleft 600 def/parenright 600 def/space 600 def
+currentdict end def currentdict/UniqueID known{/UniqueID 16#800000 def}if/FontBBox FontBBox 4 array astore def}mark true/Helvetica/|______Seattle 1 rf
+/oldsettransfer/settransfer load def
+/concatprocs{/proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def
+newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx}def
+/settransfer{currenttransfer concatprocs oldsettransfer}def
+/PaintBlack{{1 exch sub}settransfer gsave newpath clippath 1 setgray fill grestore}def
+/od{(Rvd\001\001\000\000\177) fg copy pop txpose
+1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark
+{transform{itransform moveto}}{transform{itransform lineto}}
+{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform
+{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}
+{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if
+statusdict/processcolors known{statusdict begin processcolors end 4 eq{/4colors true def}if}if}bdf
+/cd{}bdf
+/op{/sfl false def systemdict/currentcolorscreen known{dcfreq dcrot/dcspf load dmfreq dmrot/dmspf load dyfreq dyrot/dyspf load
+dkfreq dkrot/dkspf load setcolorscreen}{freq rot/spf load setscreen}ifelse savescreen
+/ns false def/pm save def}bdf
+/cp{not{userdict/#copies 0 put}if ma 0 gt{{t1 the{exit}if}loop}if{/copypage load exec}{/showpage load exec}ifelse pm restore}bdf
+/px{0 3 1 roll tp tt}bdf
+/psb{/us save def}bdf
+/pse{us restore}bdf
+/ct 40 string def
+/nc{currentpoint initclip newpath gc{dup type dup/arraytype eq exch/packedarraytype eq or{exec}if}
+forall clip newpath moveto}def
+/kp{ct 0 2 index length 2 index 39 2 index put getinterval copy cvx exec mx3 currentmatrix pop}bdf
+end
+LW 1 eq userdict/a4small known not and{/a4small
+[[300 72 div 0 0 -300 72 div -120 3381]
+280 3255
+{statusdict/jobstate (printing) put 0 setblink
+margins
+exch 196 add exch 304 add 8 div round cvi frametoroket
+statusdict/jobstate (busy) put
+1 setblink}
+/framedevice load
+60 45{dup mul exch dup mul add 1.0 exch sub}/setscreen load
+{}/settransfer load/initgraphics load/erasepage load]cvx
+statusdict begin bind end readonly def}if
+md begin/bigs[lnop userdict/letter known{/letter load}{lnop}ifelse userdict/legal known{/legal load}{lnop}ifelse userdict/a4 known{/a4 load}{lnop}ifelse userdict/b5 known{/b5 load}{lnop}ifelse
+lnop lnop lnop /tab load/a3Size load]def
+/smalls[lnop userdict/lettersmall known{/lettersmall load}{userdict/note known{/note load}{lnop}ifelse}ifelse
+userdict/legal known{/legal load}{lnop}ifelse userdict/a4small known{/a4small load}{lnop}ifelse
+userdict/b5 known{/b5 load}{userdict/note known{/note load}{lnop}ifelse}ifelse lnop lnop lnop /tab load/a3Size load]def end
+systemdict/currentpacking known{setpacking}if
+%{currentfile eexec} ( %endeexec) ok userdict/stretch known not and checkload
+currentfile ok userdict/stretch known not and {eexec}{readtocleartomark}ifelse
+373A767D4B7FD94FE5903B7014B1B8D3BED02632C855D56F458B118ACF3AF73FC4EF5E81F5749042B5F9CF1016D093B75F250B7D8280B2EACE05A37037F7BDF6E12226D7D4E2DF2C52FAFD5FD40FE72A0D3AC4BD485D8369D4C87636E920D1DAF222D92155A9CB1667E715F0B82799B37CC8F5B32B74B39CF494536DC39C7EF04A7BCB29E2CEC79073CADCCFB23B4AA1363F876F5121B618071B7B4EB1E5DE75FAA2368A3E5DB2B198623AFE92AE9484270FE7F57A850E88C0D3EEA156611C91D8E480D4370B025CCA6929A2BF40AD3D01B2CB7EE6DFB46E12A830542337F7819B67F9765210F76DB06F34DA5B13A11759305C582E16D2B854939F6D9121F2A4F285282F5DCD3D15896D121E3D6F5BE79E087451BB0ED233CDBEF090D3B4AC2DC34B97E70C61D95FB072B8C12D2ABD843520949A39DCF99E2C1AA8FBCD025E47E0A82A8D96E75BAF40F52AD402495BBD4DE0F356C8B14E764874E639C9F045A0D1908EC6456EB6C5B8A6F826192F767EF2C55A21C58F5F9CC1F59247B55F2387828C7FE89D5E7D8484D1BC86CB6673BDBE4FE17DD9BDE95224FE645136F41330BF155A4DDE1B0A32233BF471CE58FBC660DC7E641B0A0D30018454E2191C414A3011FF3FED1C0D88FE1FF9F75DCC456D097947226FBEC92509146D3A4CFFC0471B31C53222ED9DD88566F60F6C0D705AD79DACF53B070026F083ED28B5CF75
+
+7X
+AAA0A169F6F320A75E9D2ED50ABD939AF85B6346C2ADB25D168F10508E1516D194C635E6B187FADEA0829DBF0390C0F003F0265E215BC96CA3CC13D4A8E01570BE193CA75A620728CD275ACF1986EFFB3A13419FE55EA7C4467B7E7EEDC1FC29C9F8C46A557D2CCDB914EF7B93E7530D555DFC2398AFC68CAD991F062EF85BAA1884EC166C7C5DF8543666D8C41BE267D706BD1588F1F662F705CAE4D29DC38EF66BFAA89470D8A099B6F1B4587F7B024412276106FCD3EB5AE17A5D1DF1781992DC40EA0A992F706F701304CEA9D9073E7A74F1E687D81C3E5841D31CF86855BAAAD9B5D30317C75150A857C6B114735315CDD1AEF36C26BBB0645499406DEE2F24B3B1C72FEC97C7BA31AA2CDAB25418BB1DC4C7E4757F1D625087B0FD0300C03A65F2A72CE734925735277E034CDCF599129679F70CC8B66E03878851DB75041F275E1E5761F3EC753BE1359CA364A22047AE4886217F9259FE19FF5B116E8019B98B143114B313E8BEF87EC949D85C82E0812E6F50525E73890AF362CC8EE8A85F4197E6AC18638EF12E56A808D439AF1BFD363F140314BF4E534485C42F1856688CC35288E8D770120A420FB9F1FCF8AE8BD6D6156CC23E6C51119FE4DE1B68C9DF3487E9974BF9ED31F8D3CE93FF101867319F2FF492D5D398B4F09A66F2F55BCAB34B99173B7EE89039D00DD21A7B3A52E9F028F8301B5FC12D4094
+
+1X
+2E064513BC579AAC498F577EA8ECD1FE3E42DC3CC320786C7B00194FEDF344402C33FC492D4BA86992B01683F440220FFE756BC88A94223D316078D69D33560E8EAB76B24CB7AA4320CF435593D76F624324ABE00B5587A4F283C725EA24567133F25F472B5E2E4474DDB5A16AC5F2DF32350395D3E3892FE361F4D5C9A610C654C9227614FBBAFF3356A90A2266E00F66234061075491571A65616211257F160000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+ %endeexec
+
+%{currentfile eexec} ( %endeexec) ok userdict/smooth4 known not and checkload
+currentfile ok userdict/smooth4 known not and {eexec}{readtocleartomark}ifelse
+F94E00EE41A71C59E5CAEED1EDBCF23D1DBA1EE99B9BB356492923BD8B1BA83A87CEB0E07377A31FD6241E814681118E17DC7CACE570399506E6E441B871B6043831BD03EFC11DBBD8001EE2FF8CFBD485065D455A2E15AC36F1A84AD8789FA6461199C7CD14CB9FD64D4B06452B7FC0A8FC263F70F1CCB893295D4DE70ADAB771C0F84396FA98C60B11DA02ABA157298DF0A23621853BEF167443A985ADC09BEFFD51CB4D29179E2B34609EF38A49DA61F4BFC256A3DE0732D7D29754A194857B9C9E9971227AA1DD0611FBB10E44E5FF66C062D9C24ED3290529330BC317825E876929582DB0E39B9FC5EFD20CC1D4F94920EB9C534D0DA90DE70D25BC7287319CF28602B3F46633C242CAFC8905E960317E3C2FA20AB8DB06ADBAF292FC7BA2CA14EE65DF28B99CC11666B70AD33E8E1D57D63D4B89ECC615AE5747C1CA752C833D8D6DE54CD4A0350B44310555CE3BD2C615ADD27B634CDB350AF3A432CE78AACD2909A5B586F666CD87919A36DB1CBE86B3CE281DFD01CD7E1B8A18A4B415CECBFF79A5C4390A15EA77D14D6BE12BAB5A8268C3F286D0590060647CABED674443CD258F11415E866AB330A251691B61F2422A61AFE59B6B4FBDCF85ED9BA0F8E483C034089E6877FF5923698D3A0DC0EED6B9CFD32DF0839BC4EA5F6D1FCB6DD0920391E57E84745131D02D100179F4E0A68EC0A5FF6680A6F463D038
+
+BX
+04AF63FFA13D743B995A26A743C26D387209023C91DE43DF047A16F328AC9DDC08573B38BE9EA341EA16C78EC32F3A1B36B90D95A50610F4D050EC1C33497F3F3A81A1B4C8BEF0BA84EE2FAA32DC112DAC490AF53E1749C4A0D866CAF7B893E52383B0D38065C333FB122B700D7246F7EE87D942AE3DB5C1DD77E9E76C80CC5AD63D28DFED0E229CE604673F78CD47F258FDF5BF3A3EAEC5C9BC8E482D8DBA9D268A35DA8C095A690679ED2123E8B8F5E4826FA3B199EAA5D482D4B6AA86572E387CECEB7149C8947F41D6339328A748A17F8C4AD3B0555F1E409450BA0C564F1F488BB5096EB003568D4D5EF6489897E27409547D0EE4487D30184793B0F27BD265A64BDB3EA6761569DA955620C612E718677B77D6D81B999C6298877AFE0D1D6F6F358377A8BD2402F669C64B972B3A065EF7DD4BDEFFFE17E63DB8898FA6E69166B710AAD6BA2EA9AF61E4B8C8701638D4D6E4DFFFC192AEF6BC027095C4C72D748979675BA29FAF61E75343E14E61034602E5A79CD2519796ED6A9CC4EDEA46A9B59D4A807E786B5EE46F25B0360BC8E7C12D723122CDEEF247C9776F4C99C8EBED6828AA19744B5ADF0D07D95D98B3072372388D41B0FAB1CCE2775170679575ECDCA13B22A17FE9C6605C3445F58F1A829512DAB6C528F83580C8AA53C35D605F626F5AD0B7FC1EA87D69A835E3F53A1F450FB0AF42A5772F89D92A
+
+5X
+0D10F15BDBDA409F50C0B8AB93FE8A16D029DD8BB5C480D1466735ED4D9CAF637E5ECD6C2ECB6BF3B3EFBEE7AB936D2C568E3009D156B87CACB1FB3A48A70BC91B2EC35CC9147FFB1A524E2B2F2E4E2C1B12F1C1C63768BB95CD62FEC01CBA79B9FA282DD4DF49990F27FF8EE4E2DDE2F0ACD83BC9D4BE0090192C7A799967EC4DC2D63C0835E22D4C4B366D7FDCF3A05A4B53DF780F986EF25C79B665D5C00EFF7F17C0BB6D544F9D83A7FDAC47D9C5683A656011374253C918FF6EA64749DD971B2300DD5320033E01EC591F6318CCE94CE2B81C04322EC52B624E50643B52391CC
+D2AB56396A2AD8E2D3CA61B80D9D4CC363B2DF7863526958CDF3497E36648406C317E58EC563E7C26149A2A3C643ADFB39A8DD92974C6D2A2A9D7B71CDF3FEBBF32BB02E7B45CF53AAEAD5E963A4AA4AF9A149A08A4EC303D5F2369977E93F54897EEAD31B06C5845D63F49D65F8E5573962241A57CCD717CE6CA8C784A11192943616EA059B51BC38429E18D0121FCBB6FBD5D909B0D89E616C66DEF6A0F165A7030BD911A1B120468329CBB006C8D37720E531CF31E878CB4AAAC137633675C3D546F5162487AB35F470C042BDEB945E0F2532BF92AA6FD53434440221ECD3533A7AA89900CB19EFE2CD872DF8B7969AF0D3B72BF31DC5DD69CA6460966F61AB17CB507964098DBA3AF122EEC3128A9BAFE1034493F372B36BD1351205E9043A67C544402D8BCE24358C8A5CE33867A00794CF7097D59C88279A11EE9C854E7E7AAE881F9828C569D208F5F33375F59E9A3818CFA38AAD0CBFBA32F9F44A8BB79DE4C40E3886457C16DA4A27953AA1E99472E35F2323F0BAA5E37DC28CBA46FEFB73B190016055ADD4D27615D748499A0E1C4B8C7EC339C1C4D95A813A85918A8D01EEB485DDCDCEA6EA3F2C2A9D85C139CD90CCB352634F9AFE836BCAC0C274E352BA2071B5269D5DE4CCDE3FF990CBA974980C7332AE1545A9C60D5D1459D3AE95C1AC065733AF14FADB440A110DD539563B8D850CD0704C52F3F7CCCB
+
+5X
+3630D776560CBD22D8FF08F5B354487A171AEC15F5F54DE9CAB668BCAC573E788D92762EF63E76087005F4AC2D02E0CAC173C11BE62ACE5DC4D3374F2F9746C9981E125FF9AB8CAE76D13039E2C54DFD708E028A619EA1ED78E6B46F06DF0D0B74BBEDD8C190C7C0CEBDE8F7A4888CC36575313478DD2CFE392E9BB7B2416955D44B7024A3BA43FBF37293B386D64746D7748895411D243FAEC50638F2AA33337D7FA018ADDAC5835A0DDFAE99AD6299DFB4CA6872C59853E3AC12FC9E3D26629C5B49CF844C87B3C4BFBE3074E3A1CE6984758C20C661084381CD6B4582D84F19C0000B5FC0DCB42B567E396031601C095D7016283EBE5F13CD8A3A374A74DDBBABD36081149F8BC242085F2F7297CC97FD3B8BAD206D8AC9707A39ECCC7963B522E08DA391A1EF12DD4D746DBDDDCC0834F88160CF189A9645567CEC2F023A571AF0DFD15DB85B744C28C000DF53B05F8F210841F6E87A04F20C777B7C0BE6182BE2E90226E5301A12532A745F2FAAA81637CF11B78CD2B99A4D18B862D6C5DBD31793FB16A2D9AAD376D4484D75AA833D0068B1D34DB74E3302480854E3B5484D8A47E39A89A2FA927BC3641EA7F8E004FDE4C2F08D40D99F1ACB47CAF6887629BF6DFE12968D297596D28CE0CF148B12E7DCB49FB94F5ADBD214C3A6CE1E249831BA9EB8A189F2CE1ABE39A7B537253E369A508A2AF2ADB9463F9B56BB
+
+BX
+FF31D535FF997F537C6675C196E7ECBD493F652FA7CC6D9C1CA3379BFDB5AF7513C6E834054494296B91A6EE800114363D5D5D0759F41B4DECB653B9DE3E94583579EF549ED5F3FAFB12661ABC0C57A332406517ED3454EDED34B386C60F78DC976266E0EAF54FC245FB0E3EFC8016236436B599C1C97A8C5E0AC8F7836161873C71F01ED9CC25C236420F41FD8277993D3959205912FA0927B59E3DAE7377D82079447D6E41EE5AEC0DFFF79AF8F4ED47F17EE708FEA45877860D56F8CBCE65A061E8E1CA4A5FBAF0E13429A7F0ADB6F178FA449F46CC539BBC0107E3A53B1C362A0
+4B20E6D721E7E6E1E4976A11DDC98C7614D22B53DFBB6DAE533AC9BE882021A735C30DAA4A44AED09F49A390E8CFF59BD9C30667AF21B03EC5CEBD5C2C3AA2769E8D714191A48E7DDF50B13D1560E82EFB65FCE601AE9E8C351FBA1DED80B7351314E7F9F9A784BFE3759B7E322A84E7B51F9DC5F5D9C8050CD79B27C0A4B0DD68A3C27A948AD6858E35B960D2DEA838C479CAEA83B1A912174ACB2100E55E7A14892D7A9B3711FF0B20065C1995B49E1F23464A92DD140642E3A7B1973849E64D1A3CF60000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+ %endeexec
+
+%%EndProcSet
diff --git a/Build/source/utils/psutils/patchlev.h.in b/Build/source/utils/psutils/patchlev.h.in
new file mode 100644
index 00000000000..8f957dcf464
--- /dev/null
+++ b/Build/source/utils/psutils/patchlev.h.in
@@ -0,0 +1,6 @@
+/*
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ */
+#define RELEASE 1
+#define PATCHLEVEL 17
diff --git a/Build/source/utils/psutils/psbook.c b/Build/source/utils/psutils/psbook.c
new file mode 100644
index 00000000000..6bc468e1a50
--- /dev/null
+++ b/Build/source/utils/psutils/psbook.c
@@ -0,0 +1,111 @@
+/* psbook.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * rearrange pages in conforming PS file for printing in signatures
+ *
+ * Usage:
+ * psbook [-q] [-s<signature>] [infile [outfile]]
+ */
+
+#include "psutil.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+char *program ;
+int pages ;
+int verbose ;
+FILE *infile ;
+FILE *outfile ;
+char pagelabel[BUFSIZ] ;
+int pageno ;
+
+static void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-q] [-s<signature>] [infile [outfile]]\n",
+ program);
+ fprintf(stderr, " <signature> must be positive and divisible by 4\n");
+ fflush(stderr);
+ exit(1);
+}
+
+
+void main(int argc, char *argv[])
+{
+ int signature = 0;
+ int currentpg, maxpage;
+
+ infile = stdin;
+ outfile = stdout;
+ verbose = 1;
+ for (program = *argv++; --argc; argv++) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 's': /* signature size */
+ signature = atoi(*argv+2);
+ if (signature < 1 || signature % 4) usage();
+ break;
+ case 'q': /* quiet */
+ verbose = 0;
+ break;
+ case 'v': /* version */
+ default:
+ usage();
+ }
+ } else if (infile == stdin) {
+ if ((infile = fopen(*argv, OPEN_READ)) == NULL)
+ message(FATAL, "can't open input file %s\n", *argv);
+ } else if (outfile == stdout) {
+ if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
+ message(FATAL, "can't open output file %s\n", *argv);
+ } else usage();
+ }
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ if ( infile == stdin ) {
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ }
+ if ( outfile == stdout ) {
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+ }
+#endif
+ if ((infile=seekable(infile))==NULL)
+ message(FATAL, "can't seek input\n");
+
+ scanpages();
+
+ if (!signature)
+ signature = maxpage = pages+(4-pages%4)%4;
+ else
+ maxpage = pages+(signature-pages%signature)%signature;
+
+ /* rearrange pages */
+ writeheader(maxpage);
+ writeprolog();
+ writesetup();
+ for (currentpg = 0; currentpg < maxpage; currentpg++) {
+ int actualpg = currentpg - currentpg%signature;
+ switch(currentpg%4) {
+ case 0:
+ case 3:
+ actualpg += signature-1-(currentpg%signature)/2;
+ break;
+ case 1:
+ case 2:
+ actualpg += (currentpg%signature)/2;
+ break;
+ }
+ if (actualpg < pages)
+ writepage(actualpg);
+ else
+ writeemptypage();
+ }
+ writetrailer();
+
+ exit(0);
+}
diff --git a/Build/source/utils/psutils/psbook.man b/Build/source/utils/psutils/psbook.man
new file mode 100644
index 00000000000..6f5ad6d7927
--- /dev/null
+++ b/Build/source/utils/psutils/psbook.man
@@ -0,0 +1,42 @@
+.TH PSBOOK 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+psbook \- rearrange pages in PostScript file into signatures
+.SH SYNOPSIS
+.B psbook
+[
+.B \-q
+] [
+.B \-s\fIsignature\fR
+] [
+.I infile
+[
+.I outfile
+] ]
+.SH DESCRIPTION
+.I Psbook
+rearranges pages from a PostScript document into ``signatures'' for
+printing books or booklets, creating a new PostScript file. The
+input PostScript file should follow the Adobe Document Structuring
+Conventions.
+.PP
+The
+.I \-s
+option selects the size of signature which will be used. The signature size is
+the number of sides which will be folded and bound together; the number given
+should be a multiple of four. The default is to use one signature for the
+whole file. Extra blank sides will be added if the file does not contain a
+multiple of four pages.
+.PP
+Psbook normally prints the page numbers of the pages rearranged; the
+.I \-q
+option suppresses this.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I Psbook
+does not accept all DSC comments.
diff --git a/Build/source/utils/psutils/pserror.c b/Build/source/utils/psutils/pserror.c
new file mode 100644
index 00000000000..114d7e1b5fa
--- /dev/null
+++ b/Build/source/utils/psutils/pserror.c
@@ -0,0 +1,122 @@
+/* pserror.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * Warnings and errors for PS programs
+ */
+
+extern char *program ; /* Defined by main program, giving program name */
+
+#include "psutil.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+#include <string.h>
+
+/* Message functions; there is a single are varargs functions for messages,
+ warnings, and errors sent to stderr. If called with the flags MESSAGE_EXIT
+ set, the routine does not return */
+
+#define MAX_MESSAGE 256 /* maximum formatted message length */
+#define MAX_FORMAT 16 /* maximum format length */
+#define MAX_COLUMN 78 /* maximum column to print upto */
+
+void message(int flags, char *format, ...)
+{
+ va_list args ;
+ static column = 0 ; /* current screen column for message wrap */
+ char msgbuf[MAX_MESSAGE] ; /* buffer in which to put the message */
+ char *bufptr = msgbuf ; /* message buffer pointer */
+
+ if ( (flags & MESSAGE_NL) && column != 0 ) { /* new line if not already */
+ putc('\n', stderr) ;
+ column = 0 ;
+ }
+
+ if ( flags & MESSAGE_PROGRAM ) {
+ strcpy(bufptr, program) ;
+ bufptr += strlen(program) ;
+ *bufptr++ = ':' ;
+ *bufptr++ = ' ' ;
+ }
+
+ va_start(args, format) ;
+ if ( format != NULL ) {
+ char c ;
+ while ( (c = *format++) != '\0' ) {
+ if (c == '%') {
+ int done, longform, index ;
+ char fmtbuf[MAX_FORMAT] ;
+ longform = index = 0 ;
+ fmtbuf[index++] = c ;
+ do {
+ done = 1 ;
+ fmtbuf[index++] = c = *format++ ;
+ fmtbuf[index] = '\0' ;
+ switch (c) {
+ case '%':
+ *bufptr++ = '%' ;
+ case '\0':
+ break ;
+ case 'e': case 'E': case 'f': case 'g': case 'G':
+ {
+ double d = va_arg(args, double) ;
+ sprintf(bufptr, fmtbuf, d) ;
+ bufptr += strlen(bufptr) ;
+ }
+ break ;
+ case 'c': case 'd': case 'i': case 'o':
+ case 'p': case 'u': case 'x': case 'X':
+ if ( longform ) {
+ long l = va_arg(args, long) ;
+ sprintf(bufptr, fmtbuf, l) ;
+ } else {
+ int i = va_arg(args, int) ;
+ sprintf(bufptr, fmtbuf, i) ;
+ }
+ bufptr += strlen(bufptr) ;
+ break ;
+ case 's':
+ {
+ char *s = va_arg(args, char *) ;
+ sprintf(bufptr, fmtbuf, s) ;
+ bufptr += strlen(bufptr) ;
+ }
+ break ;
+ case 'l':
+ longform = 1 ;
+ /* FALLTHRU */
+ default:
+ done = 0 ;
+ }
+ } while ( !done ) ;
+ } else if ( c == '\n' ) { /* write out message so far and reset column */
+ int len = bufptr - msgbuf ; /* length of current message */
+ *bufptr++ = '\n' ;
+ *bufptr = '\0' ;
+ if ( column + len > MAX_COLUMN && column > 0 ) {
+ putc('\n', stderr) ;
+ column = 0 ;
+ }
+ fputs(bufptr = msgbuf, stderr) ;
+ column = 0 ;
+ } else
+ *bufptr++ = c ;
+ }
+ *bufptr = '\0' ;
+ {
+ int len = bufptr - msgbuf ; /* length of current message */
+ if ( column + len > MAX_COLUMN && column > 0 ) {
+ putc('\n', stderr) ;
+ column = 0 ;
+ }
+ fputs(msgbuf, stderr) ;
+ column += len ;
+ }
+ fflush(stderr) ;
+ }
+ va_end(args) ;
+
+ if ( flags & MESSAGE_EXIT ) /* don't return to program */
+ exit(1) ;
+}
diff --git a/Build/source/utils/psutils/pserror.h b/Build/source/utils/psutils/pserror.h
new file mode 100644
index 00000000000..21eee15aaa4
--- /dev/null
+++ b/Build/source/utils/psutils/pserror.h
@@ -0,0 +1,20 @@
+/* pserror.h
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * Header file for external functions in pserror.c
+ */
+
+#include <stdarg.h>
+
+/* message flags */
+#define MESSAGE_NL 1 /* Newline before message if necessary */
+#define MESSAGE_PROGRAM 2 /* announce program name */
+#define MESSAGE_EXIT 4 /* do not return */
+
+/* message types */
+#define FATAL (MESSAGE_EXIT|MESSAGE_PROGRAM|MESSAGE_NL)
+#define WARN (MESSAGE_NL|MESSAGE_PROGRAM)
+#define LOG 0
+
+extern void message(int flags, char *format, ...) ;
diff --git a/Build/source/utils/psutils/psmerge.man b/Build/source/utils/psutils/psmerge.man
new file mode 100644
index 00000000000..4bce92da61b
--- /dev/null
+++ b/Build/source/utils/psutils/psmerge.man
@@ -0,0 +1,36 @@
+.TH PSMERGE 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+psmerge \- filter to merge several PostScript files into one
+.SH SYNOPSIS
+.B psmerge
+[
+.B \-o\fIout.ps\fB
+]
+[
+.I file.ps ...
+]
+.SH DESCRIPTION
+.I Psmerge
+merges PostScript documents into a single document. It only works in the
+specific case the the files were created using the same application, with the
+same device setup and resources (fonts, procsets, patterns, files, etc)
+loaded.
+
+If the
+.B \-o
+option is used, output will be sent to the file named, otherwise it will go to
+standard output.
+
+.I Psmerge
+will merge multiple files concatenated into a single file as if they
+were in separate files.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I psmerge
+is for a very specific case; it does not merge files in the general case.
diff --git a/Build/source/utils/psutils/psmerge.pl b/Build/source/utils/psutils/psmerge.pl
new file mode 100644
index 00000000000..a1a9db7c086
--- /dev/null
+++ b/Build/source/utils/psutils/psmerge.pl
@@ -0,0 +1,85 @@
+@PERL@
+# psmerge: merge PostScript files produced by same application and setup
+# usage: psmerge [-oout.ps] [-thorough] file1.ps file2.ps ...
+#
+# Copyright (C) Angus J. C. Duggan 1991-1995
+# See file LICENSE for details.
+
+$prog = ($0 =~ s=.*/==);
+
+while ($ARGV[0] =~ /^-/) {
+ $_ = shift;
+ if (/^-o(.+)/) {
+ if (!close(STDOUT) || !open(STDOUT, ">$1")) {
+ print STDERR "$prog: can't open $1 for output\n";
+ exit 1;
+ }
+ } elsif (/^-t(horough)?$/) {
+ $thorough = 1;
+ } else {
+ print STDERR "Usage: $prog [-oout] [-thorough] file...\n";
+ exit 1;
+ }
+}
+
+$page = 0;
+$first = 1;
+$nesting = 0;
+
+@header = ();
+$header = 1;
+
+@trailer = ();
+$trailer = 0;
+
+@pages = ();
+@body = ();
+
+@resources = ();
+$inresource = 0;
+
+while (<>) {
+ if (/^%%BeginFont:/ || /^%%BeginResource:/ || /^%%BeginProcSet:/) {
+ $inresource = 1;
+ push(@resources, $_);
+ } elsif ($inresource) {
+ push(@resources, $_);
+ $inresource = 0 if /^%%EndFont/ || /^%%EndResource/ || /^%%EndProcSet/;
+ } elsif (/^%%Page:/ && $nesting == 0) {
+ $header = $trailer = 0;
+ push(@pages, join("", @body)) if @body;
+ $page++;
+ @body = ("%%Page: ($page) $page\n");
+ } elsif (/^%%Trailer/ && $nesting == 0) {
+ push(@trailer, $_);
+ push(@pages, join("", @body)) if @body;
+ @body = ();
+ $trailer = 1;
+ $header = 0;
+ } elsif ($header) {
+ push(@trailer, $_);
+ push(@pages, join("", @body)) if @body;
+ @body = ();
+ $trailer = 1;
+ $header = 0;
+ } elsif ($trailer) {
+ if (/^%!/ || /%%EOF/) {
+ $trailer = $first = 0;
+ } elsif ($first) {
+ push(@trailer, $_);
+ }
+ } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) {
+ push(@body, $_);
+ $nesting++;
+ } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) {
+ push(@body, $_);
+ $nesting--;
+ } else {
+ print $_ if $print;
+ }
+}
+
+print @trailer;
+
+exit 0;
+@END@
diff --git a/Build/source/utils/psutils/psnup.c b/Build/source/utils/psutils/psnup.c
new file mode 100644
index 00000000000..03fa0e901ef
--- /dev/null
+++ b/Build/source/utils/psutils/psnup.c
@@ -0,0 +1,336 @@
+/* psnup.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * put multiple pages onto one physical sheet of paper
+ *
+ * Usage:
+ * psnup [-q] [-w<dim>] [-h<dim>] [-ppaper] [-b<dim>] [-m<dim>]
+ * [-l] [-c] [-f] [-sscale] [-d<wid>] [-nup] [in [out]]
+ * -w<dim> sets the paper width
+ * -h<dim> sets the paper height
+ * -ppaper sets the paper size (width and height) by name
+ * -W<dim> sets the input paper width, if different from output
+ * -H<dim> sets the input paper height, if different from output
+ * -Ppaper sets the input paper size, if different from output
+ * -m<dim> sets the margin around the paper
+ * -b<dim> sets the border around each page
+ * -sscale alters the scale at which the pages are displayed
+ * -l used if pages are in landscape orientation (rot left)
+ * -r used if pages are in seascape orientation (rot right)
+ * -c for column-major layout
+ * -f for flipped (wider than tall) pages
+ * -d<wid> to draw the page boundaries
+ */
+
+#include "psutil.h"
+#include "psspec.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+char *program ;
+int pages ;
+int verbose ;
+FILE *infile ;
+FILE *outfile ;
+char pagelabel[BUFSIZ] ;
+int pageno ;
+
+static void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-q] [-wwidth] [-hheight] [-ppaper] [-Wwidth] [-Hheight] [-Ppaper] [-l] [-r] [-c] [-f] [-mmargin] [-bborder] [-dlwidth] [-sscale] [-nup] [infile [outfile]]\n",
+ program);
+ fflush(stderr);
+ exit(1);
+}
+
+static void argerror(void)
+{
+ message(FATAL, "bad dimension\n");
+}
+
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+/* return next larger exact divisor of number, or 0 if none. There is probably
+ * a much more efficient method of doing this, but the numbers involved are
+ * small, so it's not a big loss. */
+static int nextdiv(int n, int m)
+{
+ while (++n <= m) {
+ if (m%n == 0)
+ return (n);
+ }
+ return (0);
+}
+
+void main(int argc, char *argv[])
+{
+ int horiz, vert, rotate, column, flip, leftright, topbottom;
+ int nup = 1;
+ double draw = 0; /* draw page borders */
+ double scale; /* page scale */
+ double uscale = 0; /* user supplied scale */
+ double ppwid, pphgt; /* paper dimensions */
+ double margin, border; /* paper & page margins */
+ double vshift, hshift; /* page centring shifts */
+ double iwidth, iheight ; /* input paper size */
+ double tolerance = 100000; /* layout tolerance */
+ Paper *paper;
+
+#ifdef PAPER
+ if ( (paper = findpaper(PAPER)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ }
+#endif
+
+ margin = border = vshift = hshift = column = flip = 0;
+ leftright = topbottom = 1;
+ iwidth = iheight = -1 ;
+
+ infile = stdin;
+ outfile = stdout;
+ verbose = 1;
+ for (program = *argv++; --argc; argv++) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'q': /* quiet */
+ verbose = 0;
+ break;
+ case 'd': /* draw borders */
+ if (argv[0][2])
+ draw = singledimen(*argv+2, argerror, usage);
+ else
+ draw = 1;
+ break;
+ case 'l': /* landscape (rotated left) */
+ column = !column;
+ topbottom = !topbottom;
+ break;
+ case 'r': /* seascape (rotated right) */
+ column = !column;
+ leftright = !leftright;
+ break;
+ case 'f': /* flipped */
+ flip = 1;
+ break;
+ case 'c': /* column major layout */
+ column = !column;
+ break;
+ case 'w': /* page width */
+ width = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'W': /* input page width */
+ iwidth = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'h': /* page height */
+ height = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'H': /* input page height */
+ iheight = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'm': /* margins around whole page */
+ margin = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'b': /* border around individual pages */
+ border = singledimen(*argv+2, argerror, usage);
+ break;
+ case 't': /* layout tolerance */
+ tolerance = atof(*argv+2);
+ break;
+ case 's': /* override scale */
+ uscale = atof(*argv+2);
+ break;
+ case 'p': /* output (and by default input) paper type */
+ if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ } else
+ message(FATAL, "paper size '%s' not recognised\n", *argv+2);
+ break;
+ case 'P': /* paper type */
+ if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) {
+ iwidth = (double)PaperWidth(paper);
+ iheight = (double)PaperHeight(paper);
+ } else
+ message(FATAL, "paper size '%s' not recognised\n", *argv+2);
+ break;
+ case 'n': /* n-up, for compatibility with other psnups */
+ if (argc >= 2) {
+ argv++;
+ argc--;
+ if ((nup = atoi(*argv)) < 1)
+ message(FATAL, "-n %d too small\n", nup);
+ } else
+ message(FATAL, "argument expected for -n\n");
+ break;
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ nup = atoi(*argv+1);
+ break;
+ case 'v': /* version */
+ default:
+ usage();
+ }
+ } else if (infile == stdin) {
+ if ((infile = fopen(*argv, OPEN_READ)) == NULL)
+ message(FATAL, "can't open input file %s\n", *argv);
+ } else if (outfile == stdout) {
+ if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
+ message(FATAL, "can't open output file %s\n", *argv);
+ } else usage();
+ }
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ if ( infile == stdin ) {
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ }
+ if ( outfile == stdout ) {
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+ }
+#endif
+ if ((infile=seekable(infile))==NULL)
+ message(FATAL, "can't seek input\n");
+
+ if (width <= 0 || height <= 0)
+ message(FATAL, "page width and height must be set\n");
+
+ /* subtract paper margins from height & width */
+ ppwid = width - margin*2;
+ pphgt = height - margin*2;
+
+ if (ppwid <= 0 || pphgt <= 0)
+ message(FATAL, "paper margins are too large\n");
+
+ /* set default values of input height & width */
+ if ( iwidth > 0 )
+ width = iwidth ;
+ if ( iheight > 0 )
+ height = iheight ;
+
+ /* Finding the best layout is an optimisation problem. We try all of the
+ * combinations of width*height in both normal and rotated form, and
+ * minimise the wasted space. */
+ {
+ double best = tolerance;
+ int hor;
+ for (hor = 1; hor; hor = nextdiv(hor, nup)) {
+ int ver = nup/hor;
+ /* try normal orientation first */
+ double scl = MIN(pphgt/(height*ver), ppwid/(width*hor));
+ double optim = (ppwid-scl*width*hor)*(ppwid-scl*width*hor) +
+ (pphgt-scl*height*ver)*(pphgt-scl*height*ver);
+ if (optim < best) {
+ best = optim;
+ /* recalculate scale to allow for internal borders */
+ scale = MIN((pphgt-2*border*ver)/(height*ver),
+ (ppwid-2*border*hor)/(width*hor));
+ hshift = (ppwid/hor - width*scale)/2;
+ vshift = (pphgt/ver - height*scale)/2;
+ horiz = hor; vert = ver;
+ rotate = flip;
+ }
+ /* try rotated orientation */
+ scl = MIN(pphgt/(width*hor), ppwid/(height*ver));
+ optim = (pphgt-scl*width*hor)*(pphgt-scl*width*hor) +
+ (ppwid-scl*height*ver)*(ppwid-scl*height*ver);
+ if (optim < best) {
+ best = optim;
+ /* recalculate scale to allow for internal borders */
+ scale = MIN((pphgt-2*border*hor)/(width*hor),
+ (ppwid-2*border*ver)/(height*ver));
+ hshift = (ppwid/ver - height*scale)/2;
+ vshift = (pphgt/hor - width*scale)/2;
+ horiz = ver; vert = hor;
+ rotate = !flip;
+ }
+ }
+
+ /* fail if nothing better than worst tolerance was found */
+ if (best == tolerance)
+ message(FATAL, "can't find acceptable layout for %d-up\n", nup);
+ }
+
+ if (flip) { /* swap width & height for clipping */
+ double tmp = width;
+ width = height;
+ height = tmp;
+ }
+
+ if (rotate) { /* rotate leftright and topbottom orders */
+ int tmp = topbottom;
+ topbottom = !leftright;
+ leftright = tmp;
+ column = !column;
+ }
+
+ /* now construct specification list and run page rearrangement procedure */
+ {
+ int page = 0;
+ PageSpec *specs, *tail;
+
+ tail = specs = newspec();
+
+ while (page < nup) {
+ int up, across; /* page index */
+
+ if (column) {
+ if (leftright) /* left to right */
+ across = page/vert;
+ else /* right to left */
+ across = horiz-1-page/vert;
+ if (topbottom) /* top to bottom */
+ up = vert-1-page%vert;
+ else /* bottom to top */
+ up = page%vert;
+ } else {
+ if (leftright) /* left to right */
+ across = page%horiz;
+ else /* right to left */
+ across = horiz-1-page%horiz;
+ if (topbottom) /* top to bottom */
+ up = vert-1-page/horiz;
+ else /* bottom to top */
+ up = page/horiz;
+ }
+ if (rotate) {
+ tail->xoff = margin + (across+1)*ppwid/horiz - hshift;
+ tail->rotate = 90;
+ tail->flags |= ROTATE;
+ } else {
+ tail->xoff = margin + across*ppwid/horiz + hshift;
+ }
+ tail->pageno = page;
+ if (uscale > 0)
+ tail->scale = uscale;
+ else
+ tail->scale = scale;
+ tail->flags |= SCALE;
+ tail->yoff = margin + up*pphgt/vert + vshift;
+ tail->flags |= OFFSET;
+ if (++page < nup) {
+ tail->flags |= ADD_NEXT;
+ tail->next = newspec();
+ tail = tail->next;
+ }
+ }
+
+ pstops(nup, 1, 0, specs, draw); /* do page rearrangement */
+ }
+
+ exit(0);
+}
+
diff --git a/Build/source/utils/psutils/psnup.man b/Build/source/utils/psutils/psnup.man
new file mode 100644
index 00000000000..3edd10b4f40
--- /dev/null
+++ b/Build/source/utils/psutils/psnup.man
@@ -0,0 +1,160 @@
+.TH PSNUP 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+psnup \- multiple pages per sheet
+.SH SYNOPSIS
+.B psnup
+[
+.B \-w\fIwidth\fR
+] [
+.B \-h\fIheight\fR
+] [
+.B \-p\fIpaper\fR
+] [
+.B \-W\fIwidth\fR
+] [
+.B \-H\fIheight\fR
+] [
+.B \-P\fIpaper\fR
+] [
+.B \-l
+] [
+.B \-r
+] [
+.B \-f
+] [
+.B \-c
+] [
+.B \-m\fImargin\fR
+] [
+.B \-b\fIborder\fR
+] [
+.B \-d\fIlwidth\fR
+] [
+.B \-s\fIscale\fR
+] [
+.B \-\fInup\fR
+] [
+.B \-q
+] [
+.I infile
+[
+.I outfile
+] ]
+.SH DESCRIPTION
+.I Psnup
+puts multiple logical pages onto each physical sheet of paper.
+The input PostScript file should follow the Adobe Document Structuring
+Conventions.
+.PP
+The
+.I \-w
+option gives the paper width, and the
+.I \-h
+option gives the paper height,
+normally specified in
+.B "cm"
+or
+.B "in"
+to convert
+PostScript's points (1/72 of an inch)
+to centimeters or inches.
+The
+.I \-p
+option can be used as an alternative, to set the paper size to
+.B a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto
+or
+.B 10x14.
+The default paper size is
+.B @PAPER@.
+The
+.I \-W, \-H,
+and
+.I \-P
+options set the input paper size, if it is different from the output
+size. This makes it easy to impose pages of one size on a different size of
+paper.
+.PP
+The
+.I \-l
+option should be used for pages which are in landscape orientation (rotated 90
+degrees anticlockwise). The
+.I \-r
+option should be used for pages which are in seascape orientation (rotated 90
+degrees clockwise), and the
+.I \-f
+option should be used for pages which have the width and height interchanged,
+but are not rotated.
+.PP
+.I Psnup
+normally uses `row-major' layout, where adjacent pages are placed in rows
+across the paper.
+The
+.I \-c
+option changes the order to `column-major', where successive pages are placed
+in columns down the paper.
+.PP
+A margin to leave around the whole page can be specified with the
+.I \-m
+option. This is useful for sheets of `thumbnail' pages, because the normal
+page margins are reduced by putting multiple pages on a single sheet.
+.PP
+The
+.I \-b
+option is used to specify an additional margin around each page on a sheet.
+.PP
+The
+.I \-d
+option draws a line around the border of each page, of the specified width.
+If the \fIlwidth\fR parameter is omitted, a default linewidth of 1 point is
+assumed. The linewidth is relative to the original page dimensions,
+\fIi.e.\fR it is scaled down with the rest of the page.
+.PP
+The scale chosen by
+.I psnup
+can be overridden with the
+.I \-s
+option. This is useful to merge pages which are already reduced.
+.PP
+The
+.I \-\fInup\fR
+option selects the number of logical pages to put on each sheet of paper. This
+can be any whole number;
+.I psnup
+tries to optimise the layout so that the minimum amount of space is wasted. If
+.I psnup
+cannot find a layout within its tolerance limit, it will abort with an error
+message. The alternative form
+.I \i \fInup\fR
+can also be used, for compatibility with other n-up programs.
+.PP
+.I Psnup
+normally prints the page numbers of the pages re-arranged; the
+.I \-q
+option suppresses this.
+.SH EXAMPLES
+The potential use of this utility is varied but one particular
+use is in conjunction with
+.I psbook(1).
+For example, using groff to create a PostScript document and lpr as
+the
+.SM UNIX
+print spooler a typical command line might look like this:
+.sp
+groff -Tps -ms \fIfile\fP | psbook | psnup -2 | lpr
+.sp
+Where file is a 4 page document this command will result in a
+two page document printing two pages of \fIfile\fP per page and
+rearranges the page order to match the input pages 4 and 1
+on the first output page and
+pages 2 then 3 of the input document
+on the second output page.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I Psnup
+does not accept all DSC comments.
diff --git a/Build/source/utils/psutils/psresize.c b/Build/source/utils/psutils/psresize.c
new file mode 100644
index 00000000000..9a8fd984abe
--- /dev/null
+++ b/Build/source/utils/psutils/psresize.c
@@ -0,0 +1,180 @@
+/* psresize.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * alter pagesize of document
+ *
+ * Usage:
+ * psresize [-q] [-w<dim>] [-h<dim>] [-ppaper] [-W<dim>] [-H<dim>]
+ * [-Ppaper] [in [out]]
+ * -w<dim> sets the output paper width
+ * -h<dim> sets the output paper height
+ * -ppaper sets the output paper size (width and height) by name
+ * -W<dim> sets the input paper width
+ * -H<dim> sets the input paper height
+ * -Ppaper sets the input paper size (width and height) by name
+ */
+
+#include "psutil.h"
+#include "psspec.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+char *program ;
+int pages ;
+int verbose ;
+FILE *infile ;
+FILE *outfile ;
+char pagelabel[BUFSIZ] ;
+int pageno ;
+
+static void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-q] [-wwidth] [-hheight] [-ppaper] [-Wwidth] [-Hheight] [-Ppaper] [infile [outfile]]\n",
+ program);
+ fflush(stderr);
+ exit(1);
+}
+
+static void argerror(void)
+{
+ message(FATAL, "bad dimension\n");
+}
+
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+void main(int argc, char *argv[])
+{
+ double scale, rscale; /* page scale */
+ double waste, rwaste; /* amount wasted */
+ double vshift, hshift; /* page centring shifts */
+ int rotate;
+ double inwidth = -1;
+ double inheight = -1;
+ Paper *paper;
+ PageSpec *specs;
+
+#ifdef PAPER
+ if ( (paper = findpaper(PAPER)) != (Paper *)0 ) {
+ inwidth = width = (double)PaperWidth(paper);
+ inheight = height = (double)PaperHeight(paper);
+ }
+#endif
+
+ vshift = hshift = 0;
+ rotate = 0;
+
+ infile = stdin;
+ outfile = stdout;
+ verbose = 1;
+ for (program = *argv++; --argc; argv++) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'q': /* quiet */
+ verbose = 0;
+ break;
+ case 'w': /* page width */
+ width = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'h': /* page height */
+ height = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'p': /* paper type */
+ if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ } else
+ message(FATAL, "paper size '%s' not recognised\n", *argv+2);
+ break;
+ case 'W': /* input page width */
+ inwidth = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'H': /* input page height */
+ inheight = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'P': /* input paper type */
+ if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) {
+ inwidth = (double)PaperWidth(paper);
+ inheight = (double)PaperHeight(paper);
+ } else
+ message(FATAL, "paper size '%s' not recognised\n", *argv+2);
+ break;
+ case 'v': /* version */
+ default:
+ usage();
+ }
+ } else if (infile == stdin) {
+ if ((infile = fopen(*argv, OPEN_READ)) == NULL)
+ message(FATAL, "can't open input file %s\n", *argv);
+ } else if (outfile == stdout) {
+ if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
+ message(FATAL, "can't open output file %s\n", *argv);
+ } else usage();
+ }
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ if ( infile == stdin ) {
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ }
+ if ( outfile == stdout ) {
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+ }
+#endif
+ if ((infile=seekable(infile))==NULL)
+ message(FATAL, "can't seek input\n");
+
+ if (width <= 0 || height <= 0)
+ message(FATAL, "output page width and height must be set\n");
+
+ if (inwidth <= 0 || inheight <= 0)
+ message(FATAL, "input page width and height must be set\n");
+
+ /* try normal orientation first */
+ scale = MIN(width/inwidth, height/inheight);
+ waste = (width-scale*inwidth)*(width-scale*inwidth) +
+ (height-scale*inheight)*(height-scale*inheight);
+ hshift = (width - inwidth*scale)/2;
+ vshift = (height - inheight*scale)/2;
+
+ /* try rotated orientation */
+ rscale = MIN(height/inwidth, width/inheight);
+ rwaste = (height-scale*inwidth)*(height-scale*inwidth) +
+ (width-scale*inheight)*(width-scale*inheight);
+ if (rwaste < waste) {
+ double tmp = width;
+ scale = rscale;
+ hshift = (width + inheight*scale)/2;
+ vshift = (height - inwidth*scale)/2;
+ rotate = 1;
+ width = height;
+ height = tmp;
+ }
+
+ width /= scale;
+ height /= scale;
+
+ /* now construct specification list and run page rearrangement procedure */
+ specs = newspec();
+
+ if (rotate) {
+ specs->rotate = 90;
+ specs->flags |= ROTATE;
+ }
+ specs->pageno = 0;
+ specs->scale = scale;
+ specs->flags |= SCALE;
+ specs->xoff = hshift;
+ specs->yoff = vshift;
+ specs->flags |= OFFSET;
+
+ pstops(1, 1, 0, specs, 0.0); /* do page rearrangement */
+
+ exit(0);
+}
+
diff --git a/Build/source/utils/psutils/psresize.man b/Build/source/utils/psutils/psresize.man
new file mode 100644
index 00000000000..f7ba9cb3093
--- /dev/null
+++ b/Build/source/utils/psutils/psresize.man
@@ -0,0 +1,81 @@
+.TH PSRESIZE 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+psresize \- multiple pages per sheet
+.SH SYNOPSIS
+.B psresize
+[
+.B \-w\fIwidth\fR
+] [
+.B \-h\fIheight\fR
+] [
+.B \-p\fIpaper\fR
+] [
+.B \-W\fIwidth\fR
+] [
+.B \-H\fIheight\fR
+] [
+.B \-P\fIpaper\fR
+] [
+.B \-q
+] [
+.I infile
+[
+.I outfile
+] ]
+.SH DESCRIPTION
+.I Psresize
+rescales and centres a document on a different size of paper.
+The input PostScript file should follow the Adobe Document Structuring
+Conventions.
+.PP
+The
+.I \-w
+option gives the output paper width, and the
+.I \-h
+option gives the output paper height, normally specified in
+.B "cm"
+or
+.B "in"
+to convert
+PostScript's points (1/72 of an inch)
+to centimeters or inches.
+The
+.I \-p
+option can be used as an alternative, to set the output paper size to
+.B a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto
+or
+.B 10x14.
+The default output paper size is
+.B @PAPER@.
+.PP
+The
+.I \-W
+option gives the input paper width, and the
+.I \-H
+option gives the input paper height.
+The
+.I \-P
+option can be used as an alternative, to set the input paper size.
+The default input paper size is
+.B @PAPER@.
+.PP
+.I Psresize
+normally prints the page numbers of the pages output; the
+.I \-q
+option suppresses this.
+.SH EXAMPLES
+The following command can be used to convert a document on A4 size paper to
+letter size paper:
+.sp
+psresize -PA4 -pletter in.ps out.ps
+.sp
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I Psresize
+does not accept all DSC comments.
diff --git a/Build/source/utils/psutils/psselect.c b/Build/source/utils/psutils/psselect.c
new file mode 100644
index 00000000000..fcb3dff57ac
--- /dev/null
+++ b/Build/source/utils/psutils/psselect.c
@@ -0,0 +1,239 @@
+/* psselect.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * rearrange pages in conforming PS file for printing in signatures
+ *
+ * Usage:
+ * psselect [-q] [-e] [-o] [-r] [-p<pages>] [infile [outfile]]
+ */
+
+#include "psutil.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+char *program ;
+int pages ;
+int verbose ;
+FILE *infile ;
+FILE *outfile ;
+char pagelabel[BUFSIZ] ;
+int pageno ;
+
+static void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr,
+ "Usage: %s [-q] [-e] [-o] [-r] [-p<pages>] [infile [outfile]]\n",
+ program);
+ fflush(stderr);
+ exit(1);
+}
+
+typedef struct pgrange {
+ int first, last;
+ struct pgrange *next;
+} PageRange ;
+
+static PageRange *makerange(int beg, int end, PageRange *next)
+{
+ PageRange *new;
+ if ((new = (PageRange *)malloc(sizeof(PageRange))) == NULL)
+ message(FATAL, "out of memory\n");
+ new->first = beg;
+ new->last = end;
+ new->next = next;
+ return (new);
+}
+
+
+static PageRange *addrange(char *str, PageRange *rp)
+{
+ int first=0;
+ int sign;
+ sign = (*str == '_' && ++str) ? -1 : 1;
+ if (isdigit(*str)) {
+ first = sign*atoi(str);
+ while (isdigit(*str)) str++;
+ }
+ switch (*str) {
+ case '\0':
+ if (first || sign < 0)
+ return (makerange(first, first, rp));
+ break;
+ case ',':
+ if (first || sign < 0)
+ return (addrange(str+1, makerange(first, first, rp)));
+ break;
+ case '-':
+ case ':':
+ str++;
+ sign = (*str == '_' && ++str) ? -1 : 1;
+ if (!first)
+ first = 1;
+ if (isdigit(*str)) {
+ int last = sign*atoi(str);
+ while (isdigit(*str)) str++;
+ switch (*str) {
+ case '\0':
+ return (makerange(first, last, rp));
+ case ',':
+ return (addrange(str+1, makerange(first, last, rp)));
+ }
+ } else if (*str == '\0')
+ return (makerange(first, -1, rp));
+ else if (*str == ',')
+ return (addrange(str+1, makerange(first, -1, rp)));
+ }
+ message(FATAL, "invalid page range\n");
+ return (PageRange *)0 ;
+}
+
+
+void main(int argc, char *argv[])
+{
+ int currentpg, maxpage = 0;
+ int even = 0, odd = 0, reverse = 0;
+ int pass, all;
+ PageRange *pagerange = NULL;
+
+ infile = stdin;
+ outfile = stdout;
+ verbose = 1;
+ for (program = *argv++; --argc; argv++) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'e': /* even pages */
+ even = 1;
+ break;
+ case 'o': /* odd pages */
+ odd = 1;
+ break;
+ case 'r': /* reverse */
+ reverse = 1;
+ break;
+ case 'p': /* page spec */
+ pagerange = addrange(*argv+2, pagerange);
+ break;
+ case 'q': /* quiet */
+ verbose = 0;
+ break;
+ case 'v': /* version */
+ default:
+ usage();
+ }
+ } else if (pagerange == NULL && !reverse && !even && !odd) {
+ pagerange = addrange(*argv, NULL);
+ } else if (infile == stdin) {
+ if ((infile = fopen(*argv, OPEN_READ)) == NULL)
+ message(FATAL, "can't open input file %s\n", *argv);
+ } else if (outfile == stdout) {
+ if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
+ message(FATAL, "can't open output file %s\n", *argv);
+ } else usage();
+ }
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ if ( infile == stdin ) {
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ }
+ if ( outfile == stdout ) {
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+ }
+#endif
+ if ((infile=seekable(infile))==NULL)
+ message(FATAL, "can't seek input\n");
+
+ scanpages();
+
+ /* select all pages or all in range if odd or even not set */
+ all = !(odd || even);
+
+ /* add default page range */
+ if (!pagerange)
+ pagerange = makerange(1, -1, NULL);
+
+ /* reverse page list if not reversing pages (list constructed bottom up) */
+ if (!reverse) {
+ PageRange *revlist = NULL;
+ PageRange *next = NULL;
+ while (pagerange) {
+ next = pagerange->next;
+ pagerange->next = revlist;
+ revlist = pagerange;
+ pagerange = next;
+ }
+ pagerange = revlist;
+ } else { /* swap start & end if reversing */
+ PageRange *r;
+ for (r = pagerange; r; r = r->next) {
+ int temp = r->last;
+ r->last = r->first;
+ r->first = temp;
+ }
+ }
+
+ { /* adjust for end-relative pageranges */
+ PageRange *r;
+ for (r = pagerange; r; r = r->next) {
+ if (r->first < 0) {
+ r->first += pages + 1;
+ if (r->first < 1)
+ r->first = 1;
+ }
+ if (r->last < 0) {
+ r->last += pages + 1;
+ if (r->last < 1)
+ r->last = 1;
+ }
+ }
+ }
+
+ /* count pages on first pass, select pages on second pass */
+ for (pass = 0; pass < 2; pass++) {
+ PageRange *r;
+ if (pass) { /* write header on second pass */
+ writeheader(maxpage);
+ writeprolog();
+ writesetup();
+ }
+ for (r = pagerange; r; r = r->next) {
+ if (r->last < r->first) {
+ for (currentpg = r->first; currentpg >= r->last; currentpg--) {
+ if (currentpg == 0 ||
+ (currentpg <= pages &&
+ ((currentpg&1) ? (odd || all) : (even || all)))) {
+ if (pass) {
+ if (currentpg)
+ writepage(currentpg-1);
+ else
+ writeemptypage() ;
+ } else
+ maxpage++;
+ }
+ }
+ } else {
+ for (currentpg = r->first; currentpg <= r->last; currentpg++) {
+ if (currentpg == 0 ||
+ (currentpg <= pages &&
+ ((currentpg&1) ? (odd || all) : (even || all)))) {
+ if (pass) {
+ if (currentpg)
+ writepage(currentpg-1);
+ else
+ writeemptypage() ;
+ } else
+ maxpage++;
+ }
+ }
+ }
+ }
+ }
+ writetrailer();
+
+ exit(0);
+}
diff --git a/Build/source/utils/psutils/psselect.man b/Build/source/utils/psutils/psselect.man
new file mode 100644
index 00000000000..5311db233e3
--- /dev/null
+++ b/Build/source/utils/psutils/psselect.man
@@ -0,0 +1,84 @@
+.TH PSSELECT 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+psselect \- select pages from a PostScript file
+.SH SYNOPSIS
+.B psselect
+[
+.B \-q
+] [
+.B \-e
+] [
+.B \-o
+] [
+.B \-r
+] [
+.B \-p\fIpages\fR
+] [
+.I pages
+] [
+.I infile
+[
+.I outfile
+] ]
+.SH DESCRIPTION
+.I Psselect
+selects pages from a PostScript document, creating a new PostScript file. The
+input PostScript file should follow the Adobe Document Structuring
+Conventions.
+.PP
+The
+.I \-e
+option selects all of the even pages; it may be used in conjunction with the
+other page selection options to select the even pages from a range of pages.
+.PP
+The
+.I \-o
+option selects all of the odd pages; it may be used in conjunction with the
+other page selection options.
+.PP
+The
+.I \-p\fIpages\fR
+option specifies the pages which are to be selected.
+.I Pages
+is a comma separated list of page ranges, each of which may be a page number,
+or a page range of the form \fIfirst\fR-\fIlast\fR. If \fIfirst\fR is omitted,
+the
+first page is assumed, and if \fIlast\fR is omitted, the last page is assumed.
+
+The prefix character `_' indicates that the page number is relative to the end
+of the document, counting backwards. If just this character with no page
+number is used, a blank page will be inserted.
+.PP
+The
+.I \-r
+option causes
+.I psselect
+to output the selected pages in reverse order.
+.PP
+Psselect normally prints the page numbers of the pages rearranged; the
+.I \-q
+option suppresses this.
+.PP
+If any of the
+.I \-r, \-e,
+or
+.I \-o
+options are specified, the page range must be given with the
+.I \-p
+option. This is for backwards compatibility with previous versions.
+
+.SH NOTES
+The page number given to
+.I psselect
+is the number of the page counting from the start or end of the file, starting
+at one. The actual page number in the document may be different.
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I Psselect
+does not accept all DSC comments.
diff --git a/Build/source/utils/psutils/psspec.c b/Build/source/utils/psutils/psspec.c
new file mode 100644
index 00000000000..88d46f07a43
--- /dev/null
+++ b/Build/source/utils/psutils/psspec.c
@@ -0,0 +1,249 @@
+/* psspec.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * page spec routines for page rearrangement
+ */
+
+#include "psutil.h"
+#include "psspec.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+#include <string.h>
+
+double width = -1;
+double height = -1;
+
+/* create a new page spec */
+PageSpec *newspec(void)
+{
+ PageSpec *temp = (PageSpec *)malloc(sizeof(PageSpec));
+ if (temp == NULL)
+ message(FATAL, "out of memory\n");
+ temp->reversed = temp->pageno = temp->flags = temp->rotate = 0;
+ temp->scale = 1;
+ temp->xoff = temp->yoff = 0;
+ temp->next = NULL;
+ return (temp);
+}
+
+/* dimension parsing routines */
+int parseint(char **sp, void (*errorfn)(void))
+{
+ char *s = *sp;
+ int num = atoi(s);
+
+ while (isdigit(*s))
+ s++;
+ if (*sp == s) (*errorfn)() ;
+ *sp = s;
+ return (num);
+}
+
+double parsedouble(char **sp, void (*errorfn)(void))
+{
+ char *s = *sp;
+ double num = atof(s);
+
+ while (isdigit(*s) || *s == '-' || *s == '.')
+ s++;
+ if (*sp == s) (*errorfn)() ;
+ *sp = s;
+ return (num);
+}
+
+double parsedimen(char **sp, void (*errorfn)(void))
+{
+ double num = parsedouble(sp, errorfn);
+ char *s = *sp;
+
+ if (strncmp(s, "pt", 2) == 0) {
+ s += 2;
+ } else if (strncmp(s, "in", 2) == 0) {
+ num *= 72;
+ s += 2;
+ } else if (strncmp(s, "cm", 2) == 0) {
+ num *= 28.346456692913385211;
+ s += 2;
+ } else if (strncmp(s, "mm", 2) == 0) {
+ num *= 2.8346456692913385211;
+ s += 2;
+ } else if (*s == 'w') {
+ if (width < 0)
+ message(FATAL, "width not initialised\n");
+ num *= width;
+ s++;
+ } else if (*s == 'h') {
+ if (height < 0)
+ message(FATAL, "height not initialised\n");
+ num *= height;
+ s++;
+ }
+ *sp = s;
+ return (num);
+}
+
+double singledimen(char *str, void (*errorfn)(void), void (*usagefn)(void))
+{
+ double num = parsedimen(&str, errorfn);
+ if (*str) (*usagefn)();
+ return (num);
+}
+
+static char *prologue[] = { /* PStoPS procset */
+#ifndef SHOWPAGE_LOAD
+ "userdict begin",
+ "[/showpage/erasepage/copypage]{dup where{pop dup load", /* prevent */
+ " type/operatortype eq{1 array cvx dup 0 3 index cvx put", /* binding */
+ " bind def}{pop}ifelse}{pop}ifelse}forall", /* in prolog */
+#else
+ "userdict begin",
+ "[/showpage/copypage/erasepage]{dup 10 string cvs dup",
+ " length 6 add string dup 0 (PStoPS) putinterval dup",
+ " 6 4 -1 roll putinterval 2 copy cvn dup where",
+ " {pop pop pop}{exch load def}ifelse cvx cvn 1 array cvx",
+ " dup 0 4 -1 roll put def}forall",
+#endif
+ "[/letter/legal/executivepage/a4/a4small/b5/com10envelope", /* nullify */
+ " /monarchenvelope/c5envelope/dlenvelope/lettersmall/note", /* paper */
+ " /folio/quarto/a5]{dup where{dup wcheck{exch{}put}", /* operators */
+ " {pop{}def}ifelse}{pop}ifelse}forall",
+ "/setpagedevice {pop}bind 1 index where{dup wcheck{3 1 roll put}",
+ " {pop def}ifelse}{def}ifelse",
+ "/PStoPSmatrix matrix currentmatrix def",
+ "/PStoPSxform matrix def/PStoPSclip{clippath}def",
+ "/defaultmatrix{PStoPSmatrix exch PStoPSxform exch concatmatrix}bind def",
+ "/initmatrix{matrix defaultmatrix setmatrix}bind def",
+ "/initclip[{matrix currentmatrix PStoPSmatrix setmatrix",
+ " [{currentpoint}stopped{$error/newerror false put{newpath}}",
+ " {/newpath cvx 3 1 roll/moveto cvx 4 array astore cvx}ifelse]",
+ " {[/newpath cvx{/moveto cvx}{/lineto cvx}",
+ " {/curveto cvx}{/closepath cvx}pathforall]cvx exch pop}",
+ " stopped{$error/errorname get/invalidaccess eq{cleartomark",
+ " $error/newerror false put cvx exec}{stop}ifelse}if}bind aload pop",
+ " /initclip dup load dup type dup/operatortype eq{pop exch pop}",
+ " {dup/arraytype eq exch/packedarraytype eq or",
+ " {dup xcheck{exch pop aload pop}{pop cvx}ifelse}",
+ " {pop cvx}ifelse}ifelse",
+ " {newpath PStoPSclip clip newpath exec setmatrix} bind aload pop]cvx def",
+ "/initgraphics{initmatrix newpath initclip 1 setlinewidth",
+ " 0 setlinecap 0 setlinejoin []0 setdash 0 setgray",
+ " 10 setmiterlimit}bind def",
+ "end",
+ NULL
+ };
+
+void pstops(int modulo, int pps, int nobind, PageSpec *specs, double draw)
+{
+ int thispg, maxpage;
+ int pageindex = 0;
+ char **pro;
+
+ scanpages();
+
+ maxpage = ((pages+modulo-1)/modulo)*modulo;
+
+ /* rearrange pages: doesn't cope properly with loaded definitions */
+ writeheader((maxpage/modulo)*pps);
+#ifndef SHOWPAGE_LOAD
+ writestring("%%BeginProcSet: PStoPS");
+#else
+ writestring("%%BeginProcSet: PStoPS-spload");
+#endif
+ if (nobind)
+ writestring("-nobind");
+ writestring(" 1 15\n");
+ for (pro = prologue; *pro; pro++) {
+ writestring(*pro);
+ writestring("\n");
+ }
+ if (nobind) /* desperation measures */
+ writestring("/bind{}def\n");
+ writestring("%%EndProcSet\n");
+ /* save transformation from original to current matrix */
+ if (writepartprolog()) {
+ writestring("userdict/PStoPSxform PStoPSmatrix matrix currentmatrix\n");
+ writestring(" matrix invertmatrix matrix concatmatrix\n");
+ writestring(" matrix invertmatrix put\n");
+ }
+ writesetup();
+ for (thispg = 0; thispg < maxpage; thispg += modulo) {
+ int add_last = 0;
+ PageSpec *ps;
+ for (ps = specs; ps != NULL; ps = ps->next) {
+ int actualpg;
+ int add_next = ((ps->flags & ADD_NEXT) != 0);
+ if (ps->reversed)
+ actualpg = maxpage-thispg-modulo+ps->pageno;
+ else
+ actualpg = thispg+ps->pageno;
+ if (actualpg < pages)
+ seekpage(actualpg);
+ if (!add_last) { /* page label contains original pages */
+ PageSpec *np = ps;
+ char *eob = pagelabel;
+ char sep = '(';
+ do {
+ *eob++ = sep;
+ if (np->reversed)
+ sprintf(eob, "%d", maxpage-thispg-modulo+np->pageno);
+ else
+ sprintf(eob, "%d", thispg+np->pageno);
+ eob = eob + strlen(eob);
+ sep = ',';
+ } while ((np->flags & ADD_NEXT) && (np = np->next));
+ strcpy(eob, ")");
+ writepageheader(pagelabel, ++pageindex);
+ }
+ writestring("userdict/PStoPSsaved save put\n");
+ if (ps->flags & GSAVE) {
+ char buffer[BUFSIZ];
+ writestring("PStoPSmatrix setmatrix\n");
+ if (ps->flags & OFFSET) {
+ sprintf(buffer, "%f %f translate\n", ps->xoff, ps->yoff);
+ writestring(buffer);
+ }
+ if (ps->flags & ROTATE) {
+ sprintf(buffer, "%d rotate\n", ps->rotate);
+ writestring(buffer);
+ }
+ if (ps->flags & SCALE) {
+ sprintf(buffer, "%f dup scale\n", ps->scale);
+ writestring(buffer);
+ }
+ writestring("userdict/PStoPSmatrix matrix currentmatrix put\n");
+ if (width > 0 && height > 0) {
+ char buffer[BUFSIZ];
+ writestring("userdict/PStoPSclip{0 0 moveto\n");
+ sprintf(buffer, " %f 0 rlineto 0 %f rlineto -%f 0 rlineto\n",
+ width, height, width);
+ writestring(buffer);
+ writestring(" closepath}put initclip\n");
+ if (draw > 0) {
+ sprintf(buffer, "gsave clippath 0 setgray %f setlinewidth stroke grestore\n", draw);
+ writestring(buffer);
+ }
+ }
+ }
+ if (add_next) {
+#ifndef SHOWPAGE_LOAD
+ writestring("/showpage{}def/copypage{}def/erasepage{}def\n");
+#else
+ writestring("/PStoPSshowpage{}store/PStoPScopypage{}store/PStoPSerasepage{}store\n");
+#endif
+ }
+ if (actualpg < pages) {
+ writepagesetup();
+ writestring("PStoPSxform concat\n");
+ writepagebody(actualpg);
+ } else {
+ writestring("PStoPSxform concat\n");
+ writestring("showpage\n");
+ }
+ writestring("PStoPSsaved restore\n");
+ add_last = add_next;
+ }
+ }
+ writetrailer();
+}
diff --git a/Build/source/utils/psutils/psspec.h b/Build/source/utils/psutils/psspec.h
new file mode 100644
index 00000000000..ce796f5407a
--- /dev/null
+++ b/Build/source/utils/psutils/psspec.h
@@ -0,0 +1,30 @@
+/* psspec.h
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * routines for page rearrangement specs
+ */
+
+/* pagespec flags */
+#define ADD_NEXT (0x01)
+#define ROTATE (0x02)
+#define SCALE (0x04)
+#define OFFSET (0x08)
+#define GSAVE (ROTATE|SCALE|OFFSET)
+
+typedef struct pagespec {
+ int reversed, pageno, flags, rotate;
+ double xoff, yoff, scale;
+ struct pagespec *next;
+} PageSpec ;
+
+extern double width, height;
+
+extern PageSpec *newspec(void);
+extern int parseint(char **sp, void (*errorfn)(void));
+extern double parsedouble(char **sp, void (*errorfn)(void));
+extern double parsedimen(char **sp, void (*errorfn)(void));
+extern double singledimen(char *str, void (*errorfn)(void),
+ void (*usagefn)(void));
+extern void pstops(int modulo, int pps, int nobind, PageSpec *specs,
+ double draw);
diff --git a/Build/source/utils/psutils/pstops.c b/Build/source/utils/psutils/pstops.c
new file mode 100644
index 00000000000..3f8c59be419
--- /dev/null
+++ b/Build/source/utils/psutils/pstops.c
@@ -0,0 +1,198 @@
+/* pstops.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * rearrange pages in conforming PS file for printing in signatures
+ *
+ * Usage:
+ * pstops [-q] [-b] [-d] [-w<dim>] [-h<dim>] [-ppaper] <pagespecs> [infile [outfile]]
+ */
+
+#include "psutil.h"
+#include "psspec.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+char *program ;
+int pages ;
+int verbose ;
+FILE *infile ;
+FILE *outfile ;
+char pagelabel[BUFSIZ] ;
+int pageno ;
+
+void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-q] [-b] [-wwidth] [-hheight] [-dlwidth] [-ppaper] <pagespecs> [infile [outfile]]\n",
+ program);
+ fflush(stderr);
+ exit(1);
+}
+
+static void argerror(void)
+{
+ fprintf(stderr, "%s: page specification error:\n", program);
+ fprintf(stderr, " <pagespecs> = [modulo:]<spec>\n");
+ fprintf(stderr, " <spec> = [-]pageno[@scale][L|R|U][(xoff,yoff)][,spec|+spec]\n");
+ fprintf(stderr, " modulo>=1, 0<=pageno<modulo\n");
+ fflush(stderr);
+ exit(1);
+}
+
+static int modulo = 1;
+static int pagesperspec = 1;
+
+static PageSpec *parsespecs(char *str)
+{
+ PageSpec *head, *tail;
+ int other = 0;
+ int num = -1;
+
+ head = tail = newspec();
+ while (*str) {
+ if (isdigit(*str)) {
+ num = parseint(&str, argerror);
+ } else {
+ switch (*str++) {
+ case ':':
+ if (other || head != tail || num < 1) argerror();
+ modulo = num;
+ num = -1;
+ break;
+ case '-':
+ tail->reversed = !tail->reversed;
+ break;
+ case '@':
+ if (num < 0) argerror();
+ tail->scale *= parsedouble(&str, argerror);
+ tail->flags |= SCALE;
+ break;
+ case 'l': case 'L':
+ tail->rotate += 90;
+ tail->flags |= ROTATE;
+ break;
+ case 'r': case 'R':
+ tail->rotate -= 90;
+ tail->flags |= ROTATE;
+ break;
+ case 'u': case 'U':
+ tail->rotate += 180;
+ tail->flags |= ROTATE;
+ break;
+ case '(':
+ tail->xoff += parsedimen(&str, argerror);
+ if (*str++ != ',') argerror();
+ tail->yoff += parsedimen(&str, argerror);
+ if (*str++ != ')') argerror();
+ tail->flags |= OFFSET;
+ break;
+ case '+':
+ tail->flags |= ADD_NEXT;
+ case ',':
+ if (num < 0 || num >= modulo) argerror();
+ if ((tail->flags & ADD_NEXT) == 0)
+ pagesperspec++;
+ tail->pageno = num;
+ tail->next = newspec();
+ tail = tail->next;
+ num = -1;
+ break;
+ default:
+ argerror();
+ }
+ other = 1;
+ }
+ }
+ if (num >= modulo)
+ argerror();
+ else if (num >= 0)
+ tail->pageno = num;
+ return (head);
+}
+
+void main(int argc, char *argv[])
+{
+ PageSpec *specs = NULL;
+ int nobinding = 0;
+ double draw = 0;
+ Paper *paper;
+
+#ifdef PAPER
+ if ( (paper = findpaper(PAPER)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ }
+#endif
+
+ infile = stdin;
+ outfile = stdout;
+ verbose = 1;
+ for (program = *argv++; --argc; argv++) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'q': /* quiet */
+ verbose = 0;
+ break;
+ case 'd': /* draw borders */
+ if (argv[0][2])
+ draw = singledimen(*argv+2, argerror, usage);
+ else
+ draw = 1;
+ break;
+ case 'b': /* no bind operator */
+ nobinding = 1;
+ break;
+ case 'w': /* page width */
+ width = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'h': /* page height */
+ height = singledimen(*argv+2, argerror, usage);
+ break;
+ case 'p': /* paper type */
+ if ( (paper = findpaper(*argv+2)) != (Paper *)0 ) {
+ width = (double)PaperWidth(paper);
+ height = (double)PaperHeight(paper);
+ } else
+ message(FATAL, "paper size '%s' not recognised\n", *argv+2);
+ break;
+ case 'v': /* version */
+ usage();
+ default:
+ if (specs == NULL)
+ specs = parsespecs(*argv);
+ else
+ usage();
+ }
+ } else if (specs == NULL)
+ specs = parsespecs(*argv);
+ else if (infile == stdin) {
+ if ((infile = fopen(*argv, OPEN_READ)) == NULL)
+ message(FATAL, "can't open input file %s\n", *argv);
+ } else if (outfile == stdout) {
+ if ((outfile = fopen(*argv, OPEN_WRITE)) == NULL)
+ message(FATAL, "can't open output file %s\n", *argv);
+ } else usage();
+ }
+ if (specs == NULL)
+ usage();
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ if ( infile == stdin ) {
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ }
+ if ( outfile == stdout ) {
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+ }
+#endif
+ if ((infile=seekable(infile))==NULL)
+ message(FATAL, "can't seek input\n");
+
+ pstops(modulo, pagesperspec, nobinding, specs, draw);
+
+ exit(0);
+}
diff --git a/Build/source/utils/psutils/pstops.man b/Build/source/utils/psutils/pstops.man
new file mode 100644
index 00000000000..350af6c2990
--- /dev/null
+++ b/Build/source/utils/psutils/pstops.man
@@ -0,0 +1,166 @@
+.TH PSTOPS 1 "PSUtils Release @RELEASE@ Patchlevel @PATCHLEVEL@"
+.SH NAME
+pstops \- shuffle pages in a PostScript file
+.SH SYNOPSIS
+.B pstops
+[
+.B \-q
+] [
+.B \-b
+] [
+.B \-w\fIwidth\fR
+] [
+.B \-h\fIheight\fR
+] [
+.B \-p\fIpaper\fR
+] [
+.B \-d\fIlwidth\fR
+]
+.I pagespecs
+[
+.I infile
+[
+.I outfile
+] ]
+.SH DESCRIPTION
+.I Pstops
+rearranges pages from a PostScript document, creating a new PostScript file.
+The input PostScript file should follow the Adobe Document Structuring
+Conventions.
+.I Pstops
+can be used to perform a large number of arbitrary re-arrangements of
+Documents, including arranging for printing 2-up, 4-up, booklets, reversing,
+selecting front or back sides of documents, scaling, etc.
+.PP
+.I pagespecs
+follow the syntax:
+.RS
+.TP 12
+.I pagespecs
+.I = [modulo:]specs
+.TP
+.I specs
+.I = spec[+specs][,specs]
+.TP
+.I spec
+.I = [-]pageno[L][R][U][@scale][(xoff,yoff)]
+.RE
+.sp
+.I modulo
+is the number of pages in each block. The value of
+.I modulo
+should be greater than 0; the default value is 1.
+.I specs
+are the page specifications for the pages in each block. The value of the
+.I pageno
+in each
+.I spec
+should be between 0 (for the first page in the block) and \fImodulo\fR-1
+(for the last page in each block) inclusive.
+The optional dimensions
+.I xoff
+and
+.I yoff
+shift the page by the specified amount.
+.I xoff
+and
+.I yoff
+are in PostScript's points, but may be followed by the units
+.B "cm"
+or
+.B "in"
+to convert to centimetres or inches, or the flag
+.B "w"
+or
+.B "h"
+to specify as a multiple of the width or height.
+The optional parameters \fIL\fR, \fIR\fR, and \fIU\fR rotate the page left,
+right, or upside-down.
+The optional
+.I scale
+parameter scales the page by the fraction specified.
+If the optional minus sign is specified, the page is relative to the end of
+the document, instead of the start.
+
+If page \fIspec\fRs are separated by
+.B \+
+the pages will be merged into one page; if they are separated by
+.B \,
+they will be on separate pages.
+If there is only one page specification, with
+.I pageno
+zero, the \fIpageno\fR may be omitted.
+
+The shift, rotation, and scaling are performed
+in that order regardless of which order
+they appear on the command line.
+.PP
+The
+.I \-w
+option gives the width which is used by the
+.B "w"
+dimension specifier, and the
+.I \-h
+option gives the height which is used by the
+.B "h"
+dimension specifier. These dimensions are also used (after scaling) to set the
+clipping path for each page.
+The
+.I \-p
+option can be used as an alternative, to set the paper size to
+.B a3, a4, a5, b5, letter, legal, tabloid, statement, executive, folio, quarto
+or
+.B 10x14.
+The default paper size is
+.B @PAPER@.
+.PP
+The
+.I \-b
+option prevents any
+.B bind
+operators in the PostScript prolog from binding. This may be needed in cases
+where complex multi-page re-arrangements are being done.
+.PP
+The
+.I \-d
+option draws a line around the border of each page, of the specified width.
+If the \fIlwidth\fR parameter is omitted, a default linewidth of 1 point is
+assumed. The linewidth is relative to the original page dimensions,
+\fIi.e.\fR it is scaled up or down with the rest of the page.
+.PP
+Pstops normally prints the page numbers of the pages re-arranged; the
+.I \-q
+option suppresses this.
+.SH EXAMPLES
+This section contains some sample re-arrangements. To put two pages on one
+sheet (of A4 paper), the pagespec to use is:
+.sp
+.ce
+2:0L@.7(21cm,0)+1L@.7(21cm,14.85cm)
+.sp
+To select all of the odd pages in reverse order, use:
+.sp
+.ce
+2:-0
+.sp
+To re-arrange pages for printing 2-up booklets, use
+.sp
+.ce
+4:-3L@.7(21cm,0)+0L@.7(21cm,14.85cm)
+.sp
+for the front sides, and
+.sp
+.ce
+4:1L@.7(21cm,0)+-2L@.7(21cm,14.85cm)
+.sp
+for the reverse sides (or join them with a comma for duplex printing).
+.SH AUTHOR
+Copyright (C) Angus J. C. Duggan 1991-1995
+.SH "SEE ALSO"
+@MAN@
+.SH TRADEMARKS
+.B PostScript
+is a trademark of Adobe Systems Incorporated.
+.SH BUGS
+.I Pstops
+does not accept all DSC comments.
diff --git a/Build/source/utils/psutils/psutil.c b/Build/source/utils/psutils/psutil.c
new file mode 100644
index 00000000000..aa954177d15
--- /dev/null
+++ b/Build/source/utils/psutils/psutil.c
@@ -0,0 +1,344 @@
+/* psutil.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * utilities for PS programs
+ */
+
+/*
+ * AJCD 6/4/93
+ * Changed to using ftell() and fseek() only (no length calculations)
+ * Hunter Goatley 31-MAY-1993 23:33
+ * Fixed VMS support.
+ * Hunter Goatley 2-MAR-1993 14:41
+ * Added VMS support.
+ */
+#include "psutil.h"
+#include "pserror.h"
+#include "patchlev.h"
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#define iscomment(x,y) (strncmp(x,y,strlen(y)) == 0)
+
+extern char *program ;
+extern int pages;
+extern int verbose;
+extern FILE *infile;
+extern FILE *outfile;
+extern char pagelabel[BUFSIZ];
+extern int pageno;
+
+static char buffer[BUFSIZ];
+static long bytes = 0;
+static long pagescmt = 0;
+static long headerpos = 0;
+static long endsetup = 0;
+static long beginprocset = 0; /* start of pstops procset */
+static long endprocset = 0;
+static int outputpage = 0;
+static int maxpages = 100;
+static long *pageptr;
+
+/* list of paper sizes supported */
+static Paper papersizes[] = {
+ { "a3", 842, 1191 }, /* 29.7cm * 42cm */
+ { "a4", 595, 842 }, /* 21cm * 29.7cm */
+ { "a5", 421, 595 }, /* 14.85cm * 21cm */
+ { "b5", 516, 729 }, /* 18.2cm * 25.72cm */
+ { "A3", 842, 1191 }, /* 29.7cm * 42cm */
+ { "A4", 595, 842 }, /* 21cm * 29.7cm */
+ { "A5", 421, 595 }, /* 14.85cm * 21cm */
+ { "B5", 516, 729 }, /* 18.2cm * 25.72cm */
+ { "letter", 612, 792 }, /* 8.5in * 11in */
+ { "legal", 612, 1008 }, /* 8.5in * 14in */
+ { "ledger", 1224, 792 }, /* 17in * 11in */
+ { "tabloid", 792, 1224 }, /* 11in * 17in */
+ { "statement", 396, 612 }, /* 5.5in * 8.5in */
+ { "executive", 540, 720 }, /* 7.6in * 10in */
+ { "folio", 612, 936 }, /* 8.5in * 13in */
+ { "quarto", 610, 780 }, /* 8.5in * 10.83in */
+ { "10x14", 720, 1008 }, /* 10in * 14in */
+ { NULL, 0, 0 }
+};
+
+/* return pointer to paper size struct or NULL */
+Paper* findpaper(char *name)
+{
+ Paper *pp;
+ for (pp = papersizes; PaperName(pp); pp++) {
+ if (strcmp(PaperName(pp), name) == 0) {
+ return pp;
+ }
+ }
+ return (Paper *)NULL;
+}
+
+/* Make a file seekable, using temporary files if necessary */
+FILE *seekable(FILE *fp)
+{
+#ifndef MSDOS
+ FILE *ft;
+ long r, w ;
+#endif
+ char *p;
+ char buffer[BUFSIZ] ;
+#if defined(WINNT) || defined(WIN32)
+ struct _stat fs ;
+#else
+ long fpos;
+#endif
+
+#if defined(WINNT) || defined(WIN32)
+ if (_fstat(fileno(fp), &fs) == 0 && (fs.st_mode&_S_IFREG) != 0)
+ return (fp);
+#else
+ if ((fpos = ftell(fp)) >= 0)
+ if (!fseek(fp, 0L, SEEK_END) && !fseek(fp, fpos, SEEK_SET))
+ return (fp);
+#endif
+
+#if defined(MSDOS)
+ message(FATAL, "input is not seekable\n");
+ return (NULL) ;
+#else
+ if ((ft = tmpfile()) == NULL)
+ return (NULL);
+
+ while ((r = fread(p = buffer, sizeof(char), BUFSIZ, fp)) > 0) {
+ do {
+ if ((w = fwrite(p, sizeof(char), r, ft)) == 0)
+ return (NULL) ;
+ p += w ;
+ r -= w ;
+ } while (r > 0) ;
+ }
+
+ if (!feof(fp))
+ return (NULL) ;
+
+ /* discard the input file, and rewind the temporary */
+ (void) fclose(fp);
+ if (fseek(ft, 0L, SEEK_SET) != 0)
+ return (NULL) ;
+
+ return (ft);
+#endif
+}
+
+
+/* copy input file from current position upto new position to output file */
+static int fcopy(long upto)
+{
+ long here = ftell(infile);
+ while (here < upto) {
+ if ((fgets(buffer, BUFSIZ, infile) == NULL) ||
+ (fputs(buffer, outfile) == EOF))
+ return(0);
+ here = ftell(infile);
+ bytes += strlen(buffer);
+ }
+ return (1);
+}
+
+/* build array of pointers to start/end of pages */
+void scanpages(void)
+{
+ register char *comment = buffer+2;
+ register int nesting = 0;
+ register long int record;
+
+ if ((pageptr = (long *)malloc(sizeof(long)*maxpages)) == NULL)
+ message(FATAL, "out of memory\n");
+ pages = 0;
+ fseek(infile, 0L, SEEK_SET);
+ while (record = ftell(infile), fgets(buffer, BUFSIZ, infile) != NULL)
+ if (*buffer == '%') {
+ if (buffer[1] == '%') {
+ if (nesting == 0 && iscomment(comment, "Page:")) {
+ if (pages >= maxpages-1) {
+ maxpages *= 2;
+ if ((pageptr = (long *)realloc((char *)pageptr,
+ sizeof(long)*maxpages)) == NULL)
+ message(FATAL, "out of memory\n");
+ }
+ pageptr[pages++] = record;
+ } else if (headerpos == 0 && iscomment(comment, "Pages:"))
+ pagescmt = record;
+ else if (headerpos == 0 && iscomment(comment, "EndComments"))
+ headerpos = ftell(infile);
+ else if (iscomment(comment, "BeginDocument") ||
+ iscomment(comment, "BeginBinary") ||
+ iscomment(comment, "BeginFile"))
+ nesting++;
+ else if (iscomment(comment, "EndDocument") ||
+ iscomment(comment, "EndBinary") ||
+ iscomment(comment, "EndFile"))
+ nesting--;
+ else if (nesting == 0 && iscomment(comment, "EndSetup"))
+ endsetup = record;
+ else if (nesting == 0 && iscomment(comment, "BeginProlog"))
+ headerpos = ftell(infile);
+ else if (nesting == 0 &&
+ iscomment(comment, "BeginProcSet: PStoPS"))
+ beginprocset = record;
+ else if (beginprocset && !endprocset &&
+ iscomment(comment, "EndProcSet"))
+ endprocset = ftell(infile);
+ else if (nesting == 0 && (iscomment(comment, "Trailer") ||
+ iscomment(comment, "EOF"))) {
+ fseek(infile, record, SEEK_SET);
+ break;
+ }
+ } else if (headerpos == 0 && buffer[1] != '!')
+ headerpos = record;
+ } else if (headerpos == 0)
+ headerpos = record;
+ pageptr[pages] = ftell(infile);
+ if (endsetup == 0 || endsetup > pageptr[0])
+ endsetup = pageptr[0];
+}
+
+/* seek a particular page */
+void seekpage(int p)
+{
+ fseek(infile, pageptr[p], SEEK_SET);
+ if (fgets(buffer, BUFSIZ, infile) != NULL &&
+ iscomment(buffer, "%%Page:")) {
+ char *start, *end;
+ for (start = buffer+7; isspace(*start); start++);
+ if (*start == '(') {
+ int paren = 1;
+ for (end = start+1; paren > 0; end++)
+ switch (*end) {
+ case '\0':
+ message(FATAL, "Bad page label while seeking page %d\n", p);
+ case '(':
+ paren++;
+ break;
+ case ')':
+ paren--;
+ break;
+ }
+ } else
+ for (end = start; !isspace(*end); end++);
+ strncpy(pagelabel, start, end-start);
+ pagelabel[end-start] = '\0';
+ pageno = atoi(end);
+ } else
+ message(FATAL, "I/O error seeking page %d\n", p);
+}
+
+/* Output routines. These all update the global variable bytes with the number
+ * of bytes written */
+void writestring(char *s)
+{
+ fputs(s, outfile);
+ bytes += strlen(s);
+}
+
+/* write page comment */
+void writepageheader(char *label, int page)
+{
+ if (verbose)
+ message(LOG, "[%d] ", page);
+ sprintf(buffer, "%%%%Page: %s %d\n", label, ++outputpage);
+ writestring(buffer);
+}
+
+/* search for page setup */
+void writepagesetup(void)
+{
+ char buffer[BUFSIZ];
+ if (beginprocset) {
+ for (;;) {
+ if (fgets(buffer, BUFSIZ, infile) == NULL)
+ message(FATAL, "I/O error reading page setup %d\n", outputpage);
+ if (!strncmp(buffer, "PStoPSxform", 11))
+ break;
+ if (fputs(buffer, outfile) == EOF)
+ message(FATAL, "I/O error writing page setup %d\n", outputpage);
+ bytes += strlen(buffer);
+ }
+ }
+}
+
+/* write the body of a page */
+void writepagebody(int p)
+{
+ if (!fcopy(pageptr[p+1]))
+ message(FATAL, "I/O error writing page %d\n", outputpage);
+}
+
+/* write a whole page */
+void writepage(int p)
+{
+ seekpage(p);
+ writepageheader(pagelabel, p+1);
+ writepagebody(p);
+}
+
+/* write from start of file to end of header comments */
+void writeheader(int p)
+{
+ fseek(infile, 0L, SEEK_SET);
+ if (pagescmt) {
+ if (!fcopy(pagescmt) || fgets(buffer, BUFSIZ, infile) == NULL)
+ message(FATAL, "I/O error in header\n");
+ sprintf(buffer, "%%%%Pages: %d 0\n", p);
+ writestring(buffer);
+ }
+ if (!fcopy(headerpos))
+ message(FATAL, "I/O error in header\n");
+}
+
+/* write prologue to end of setup section excluding PStoPS procset */
+int writepartprolog(void)
+{
+ if (beginprocset && !fcopy(beginprocset))
+ message(FATAL, "I/O error in prologue\n");
+ if (endprocset)
+ fseek(infile, endprocset, SEEK_SET);
+ writeprolog();
+ return !beginprocset;
+}
+
+/* write prologue up to end of setup section */
+void writeprolog(void)
+{
+ if (!fcopy(endsetup))
+ message(FATAL, "I/O error in prologue\n");
+}
+
+/* write from end of setup to start of pages */
+void writesetup(void)
+{
+ if (!fcopy(pageptr[0]))
+ message(FATAL, "I/O error in prologue\n");
+}
+
+/* write trailer */
+void writetrailer(void)
+{
+ fseek(infile, pageptr[pages], SEEK_SET);
+ while (fgets(buffer, BUFSIZ, infile) != NULL) {
+ writestring(buffer);
+ }
+ if (verbose)
+ message(LOG, "Wrote %d pages, %ld bytes\n", outputpage, bytes);
+}
+
+/* write a page with nothing on it */
+void writeemptypage(void)
+{
+ if (verbose)
+ message(LOG, "[*] ");
+ sprintf(buffer, "%%%%Page: * %d\n", ++outputpage);
+ writestring(buffer);
+ if (beginprocset)
+ writestring("PStoPSxform concat\n");
+ writestring("showpage\n");
+}
+
diff --git a/Build/source/utils/psutils/psutil.h b/Build/source/utils/psutils/psutil.h
new file mode 100644
index 00000000000..deed93ac811
--- /dev/null
+++ b/Build/source/utils/psutils/psutil.h
@@ -0,0 +1,52 @@
+/* psutil.h
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * utilities for PS programs
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "config.h"
+
+/* types for describing document; this is a step towards version 2 */
+typedef long Fileptr ;
+
+/* paper size structure; configurability and proper paper resources will have
+ to wait until version 2 */
+typedef struct papersize {
+ char *name; /* name of paper size */
+ int width, height; /* width, height in points */
+} Paper ;
+#define PaperName(p) ((p)->name)
+#define PaperWidth(p) ((p)->width)
+#define PaperHeight(p) ((p)->height)
+
+/* Definitions for functions found in psutil.c */
+extern Paper *findpaper(char *name);
+extern FILE *seekable(FILE *fp);
+extern void writepage(int p);
+extern void seekpage(int p);
+extern void writepageheader(char *label, int p);
+extern void writepagesetup(void);
+extern void writepagebody(int p);
+extern void writeheader(int p);
+extern int writepartprolog(void);
+extern void writeprolog(void);
+extern void writesetup(void);
+extern void writetrailer(void);
+extern void writeemptypage(void);
+extern void scanpages(void);
+extern void writestring(char *s);
+
+/* These variables are imported from the client program (e.g. psbook, psnup,
+ etc.) */
+extern char *program ;
+extern int pages;
+extern int verbose;
+extern FILE *infile;
+extern FILE *outfile;
+extern char pagelabel[BUFSIZ];
+extern int pageno;
diff --git a/Build/source/utils/psutils/showchar.sh b/Build/source/utils/psutils/showchar.sh
new file mode 100644
index 00000000000..e685e99ae8c
--- /dev/null
+++ b/Build/source/utils/psutils/showchar.sh
@@ -0,0 +1,118 @@
+#!/bin/sh
+# showchar: show character with information
+# usage:
+# showchar Font-Name Char-Name | lpr -Pprinter
+
+if [ $# != 2 ]; then
+ echo "Usage: `basename $0` Font-Name Char-Name" >&2
+ exit 1
+fi
+
+cat <<EOF
+%!
+% Get character metrics and bounding box for $1
+/ns 30 string def
+/fname /$1 def
+/cname /$2 def
+/fn fname findfont 1000 scalefont def
+/thin 0.7 def
+/reduction 2.0 def
+
+/sn { ns cvs show } def
+/sc { (\()show exch sn (,)show sn (\))show } def
+
+/Times-Roman findfont 10 scalefont setfont
+
+72 242 translate % one inch in, 3 1/2 inch up
+newpath 0 0 moveto
+gsave % print character name
+ 0 468 rmoveto
+ ($2 from font $1 displayed on `date` by `basename $0` 1.00 (C) AJCD 1991)
+ show
+grestore
+
+gsave
+ thin setlinewidth % cross hairs
+ -9 0 rmoveto 18 0 rlineto
+ -9 -9 rmoveto 0 18 rlineto
+ stroke % position info
+ -9 -9 moveto ((0,0)) stringwidth pop neg 0 rmoveto
+ ((0,0)) show
+grestore
+
+% create encoding with a single character at all positions
+/MyEncoding 256 array def
+
+0 1 255 { % fill out with notdefs
+ MyEncoding exch cname put
+} for
+
+fn dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding MyEncoding def
+ currentdict
+end /newfont exch definefont
+/fn exch def
+/en MyEncoding def
+
+gsave % draw character (enlarged)
+ .75 setgray
+ fn 1 reduction div scalefont setfont
+ (\000) show
+grestore
+
+% show character info
+fn /Metrics known {
+ dup fn /Metrics get exch get
+ dup type /arraytype eq {
+ dup length 2 eq
+ {1 get 0} {dup 2 get exch 3 get} ifelse
+ } {
+ round 0
+ } ifelse
+} {
+ gsave
+ fn setfont (\000) stringwidth round exch round exch
+ grestore
+} ifelse
+gsave % show width
+ thin setlinewidth
+ 2 copy
+ reduction div exch reduction div exch rlineto
+ gsave
+ 1 1 rmoveto sc
+ grestore
+ -4 -3 rlineto 0 6 rmoveto 4 -3 rlineto
+ stroke
+grestore
+
+gsave
+ gsave % get bounding box
+ fn setfont
+ (\000) true charpath flattenpath pathbbox
+ grestore
+ thin setlinewidth
+ 3 index reduction div % put coords on top of stack
+ 3 index reduction div
+ 3 index reduction div
+ 3 index reduction div
+ 3 index 3 index moveto
+ gsave % llx lly
+ 0 -9 rmoveto 7 index 7 index sc
+ grestore
+ 1 index 3 index lineto
+ gsave % urx lly
+ 0 -9 rmoveto 5 index 7 index sc
+ grestore
+ 1 index 1 index lineto
+ gsave % urx ury
+ 0 9 rmoveto 5 index 5 index sc
+ grestore
+ 3 index 1 index lineto
+ gsave % llx ury
+ 0 9 rmoveto 7 index 5 index sc
+ grestore
+ closepath stroke
+grestore
+showpage
+EOF
diff --git a/Build/source/utils/psutils/win32.mak b/Build/source/utils/psutils/win32.mak
new file mode 100644
index 00000000000..4ab3ad31be9
--- /dev/null
+++ b/Build/source/utils/psutils/win32.mak
@@ -0,0 +1,195 @@
+################################################################################
+#
+# Makefile : Psutils
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <02/12/25 22:26:52 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+PAPER=a4
+OS = Win32
+
+DEFS = -I. $(DEFS) -DPAPER=\"$(PAPER)\" -D$(OS)
+
+programs = $(objdir)\psbook.exe $(objdir)\psselect.exe $(objdir)\pstops.exe \
+ $(objdir)\epsffit.exe $(objdir)\psnup.exe \
+ $(objdir)\psresize.exe
+shellscripts =
+perlscripts = fixfmps.bat fixmacps.bat fixpsditps.bat fixpspps.bat \
+ fixtpps.bat fixwfwps.bat fixwpps.bat fixscribeps.bat fixwwps.bat \
+ fixdlsrps.bat extractres.bat includeres.bat psmerge.bat
+scripts = $(shellscripts) $(perlscripts)
+etcfiles = md68_0.ps md71_0.ps
+etcdir = $(psheaderdir)\psutils
+perlcmd=perl
+
+manpages = psbook.man psselect.man pstops.man epsffit.man psnup.man psresize.man \
+ $(perlscripts:.bat=.man)
+
+mansedscript = mansedscript.sed
+manfiles = $(manpages:.man=.1)
+
+default: all
+
+all: $(objdir) $(programs) $(perlscripts)
+
+$(objdir)\epsffit.exe: $(objdir)\epsffit.obj $(objdir)\pserror.obj
+ $(link) $(**) $(conlibs)
+
+$(objdir)\psnup.exe: $(objdir)\psnup.obj $(objdir)\psutil.obj $(objdir)\psspec.obj $(objdir)\pserror.obj
+ $(link) $(**) $(conlibs)
+
+$(objdir)\psresize.exe: $(objdir)\psresize.obj $(objdir)\psutil.obj $(objdir)\pserror.obj $(objdir)\psspec.obj
+ $(link) $(**) $(conlibs)
+
+$(objdir)\psbook.exe: $(objdir)\psbook.obj $(objdir)\psutil.obj $(objdir)\pserror.obj
+ $(link) $(**) $(conlibs)
+
+$(objdir)\psselect.exe: $(objdir)\psselect.obj $(objdir)\psutil.obj $(objdir)\pserror.obj
+ $(link) $(**) $(conlibs)
+
+$(objdir)\pstops.exe: $(objdir)\pstops.obj $(objdir)\psutil.obj $(objdir)\psspec.obj $(objdir)\pserror.obj
+ $(link) $(**) $(conlibs)
+
+psmerge.bat: psmerge.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixfmps.bat: fixfmps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixmacps.bat: fixmacps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) INCLUDE=$(INCLUDEDIR) $? > $@
+
+fixpsditps.bat: fixpsditps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixpspps.bat: fixpspps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixscribeps.bat: fixscribeps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixtpps.bat: fixtpps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixwfwps.bat: fixwfwps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixwpps.bat: fixwpps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixwwps.bat: fixwwps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+fixdlsrps.bat: fixdlsrps.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+extractres.bat: extractres.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) $? > $@
+
+includeres.bat: includeres.pl
+ $(perl) maketext OS=$(OS) perl=$(perlcmd) INCLUDE=$(INCLUDEDIR) $? > $@
+
+epsffit.$(manext): epsffit.man
+ $(perl) maketext MAN="$(manpages:.man=.1)" $*.man > $@
+
+psnup.$(manext): psnup.man
+ $(perl) maketext MAN="$(manpages:.man=.1)" PAPER=$(PAPER) $*.man > $@
+
+psresize.$(manext): psresize.man
+ $(perl) maketext MAN="$(manpages:.man=.1)" PAPER=$(PAPER) $*.man > $@
+
+psbook.$(manext): psbook.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+psselect.$(manext): psselect.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+pstops.$(manext): pstops.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" PAPER=$(PAPER) $*.man > $@
+
+psmerge.$(manext): psmerge.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixfmps.$(manext): fixfmps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixmacps.$(manext): fixmacps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" INCLUDE=$(INCLUDEDIR) $*.man > $@
+
+fixpsditps.$(manext): fixpsditps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixpspps.$(manext): fixpspps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixscribeps.$(manext): fixscribeps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixtpps.$(manext): fixtpps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixwfwps.$(manext): fixwfwps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixwpps.$(manext): fixwpps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixwwps.$(manext): fixwwps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+fixdlsrps.$(manext): fixdlsrps.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+extractres.$(manext): extractres.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+includeres.$(manext): includeres.man
+ $(perl) maketext "MAN=$(manpages:.man=.1)" INCLUDE=$(INCLUDEDIR) $*.man > $@
+
+#getafm.$(manext): getafm.man
+# $(perl) maketext "MAN=$(manpages:.man=.1)" $*.man > $@
+
+patchlev.h: patchlev.h.in
+ $(perl) $(win32perldir)/conf-cauto.pl $(**) $@
+
+!include <msvc/config.mak>
+
+installdirs = $(bindir) $(includes) $(psheaderdir)\psutils
+
+!include <msvc/install.mak>
+
+install:: install-exec install-data install-man
+
+mansedscript.sed:
+ @echo <<mansedscript.sed
+1,$$s/@PAPER@/A4/g
+1,$$s/@RELEASE@/1/g
+1,$$s/@PATCHLEVEL@/17/g
+1,$$s!@INCLUDE@!$(psheaderdir:\=/)/psutils!g
+<<KEEP
+
+!include <msvc/clean.mak>
+
+distclean::
+ -@$(del) $(perlscripts) $(perlscripts:.bat=.cmd) patchlev.h
+ -@$(del) $(manfiles) mansedscript.sed
+
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/t1utils/INSTALL b/Build/source/utils/t1utils/INSTALL
new file mode 100644
index 00000000000..95d84c820fb
--- /dev/null
+++ b/Build/source/utils/t1utils/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Build/source/utils/t1utils/Makefile.am b/Build/source/utils/t1utils/Makefile.am
new file mode 100644
index 00000000000..65ea0ec69da
--- /dev/null
+++ b/Build/source/utils/t1utils/Makefile.am
@@ -0,0 +1,49 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign check-news
+
+bin_PROGRAMS = t1ascii t1binary t1asm t1disasm t1unmac t1mac
+man_MANS = t1ascii.1 t1binary.1 t1asm.1 t1disasm.1 t1unmac.1 t1mac.1
+
+t1ascii_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1ascii.c
+t1binary_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1binary.c
+t1asm_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1asm.c
+t1disasm_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1disasm.c
+t1unmac_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1unmac.c
+t1mac_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1mac.c
+
+AM_CPPFLAGS = -I$(top_srcdir)/include
+LDADD = @LIBOBJS@
+
+EXTRA_DIST = $(man_MANS) t1utils.spec
+
+srclinks:
+ cd $(top_srcdir); test -d include/lcdf || mkdir -p include/lcdf
+ cd $(top_srcdir); for i in clp.h inttypes.h; do \
+ ln -sf ~/src/liblcdf/include/lcdf/$$i include/lcdf/$$i; done
+ cd $(top_srcdir); for i in clp.c strerror.c; do \
+ ln -sf ~/src/liblcdf/liblcdf/$$i $$i; done
+
+versionize:
+ perl -pi -e "s/^\\.ds V.*/.ds V $(VERSION)/;" t1ascii.1 t1binary.1 t1disasm.1 t1asm.1 t1unmac.1 t1mac.1
+ perl -pi -e 's/^Version:(\s*).*/Version:$${1}$(VERSION)/; s/$(PACKAGE)-[\w.]+\.tar\.gz/$(PACKAGE)-$(VERSION).tar.gz/;' t1utils.spec
+ perl -pi -e 's/VERSION [\d.ab]+$$/VERSION $(VERSION)/;' README
+
+rpm: dist
+ buildarch=`rpm --showrc | awk '/^build arch/ { print $$4; }'` ; \
+ mkdir -p /tmp/rpm-t1u/SOURCES /tmp/rpm-t1u/RPMS/$$buildarch \
+ /tmp/rpm-t1u/BUILD ; \
+ echo 'include: /usr/lib/rpm/rpmrc' > /tmp/rpm-t1u/rc ; \
+ echo 'macrofiles: /usr/lib/rpm/macros:/tmp/rpm-t1u/macros' >> /tmp/rpm-t1u/rc ; \
+ echo '%_topdir /tmp/rpm-t1u' > /tmp/rpm-t1u/macros ; \
+ cp $(PACKAGE)-$(VERSION).tar.gz /tmp/rpm-t1u/SOURCES ; \
+ rpmbuild --rcfile /tmp/rpm-t1u/rc -bb t1utils.spec ; \
+ cp /tmp/rpm-t1u/RPMS/$$buildarch/*.rpm .
+ rm -rf /tmp/rpm-t1u
+
+.PHONY: srclinks versionize rpm
diff --git a/Build/source/utils/t1utils/Makefile.in b/Build/source/utils/t1utils/Makefile.in
new file mode 100644
index 00000000000..c608369c23f
--- /dev/null
+++ b/Build/source/utils/t1utils/Makefile.in
@@ -0,0 +1,693 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+SOURCES = $(t1ascii_SOURCES) $(t1asm_SOURCES) $(t1binary_SOURCES) $(t1disasm_SOURCES) $(t1mac_SOURCES) $(t1unmac_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = t1ascii$(EXEEXT) t1binary$(EXEEXT) t1asm$(EXEEXT) \
+ t1disasm$(EXEEXT) t1unmac$(EXEEXT) t1mac$(EXEEXT)
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(top_srcdir)/configure INSTALL NEWS config.guess config.sub \
+ depcomp install-sh missing mkinstalldirs strerror.c
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_t1ascii_OBJECTS = clp.$(OBJEXT) t1lib.$(OBJEXT) t1ascii.$(OBJEXT)
+t1ascii_OBJECTS = $(am_t1ascii_OBJECTS)
+t1ascii_LDADD = $(LDADD)
+t1ascii_DEPENDENCIES = @LIBOBJS@
+am_t1asm_OBJECTS = clp.$(OBJEXT) t1lib.$(OBJEXT) t1asm.$(OBJEXT)
+t1asm_OBJECTS = $(am_t1asm_OBJECTS)
+t1asm_LDADD = $(LDADD)
+t1asm_DEPENDENCIES = @LIBOBJS@
+am_t1binary_OBJECTS = clp.$(OBJEXT) t1lib.$(OBJEXT) t1binary.$(OBJEXT)
+t1binary_OBJECTS = $(am_t1binary_OBJECTS)
+t1binary_LDADD = $(LDADD)
+t1binary_DEPENDENCIES = @LIBOBJS@
+am_t1disasm_OBJECTS = clp.$(OBJEXT) t1lib.$(OBJEXT) t1disasm.$(OBJEXT)
+t1disasm_OBJECTS = $(am_t1disasm_OBJECTS)
+t1disasm_LDADD = $(LDADD)
+t1disasm_DEPENDENCIES = @LIBOBJS@
+am_t1mac_OBJECTS = clp.$(OBJEXT) t1lib.$(OBJEXT) t1mac.$(OBJEXT)
+t1mac_OBJECTS = $(am_t1mac_OBJECTS)
+t1mac_LDADD = $(LDADD)
+t1mac_DEPENDENCIES = @LIBOBJS@
+am_t1unmac_OBJECTS = clp.$(OBJEXT) t1lib.$(OBJEXT) t1unmac.$(OBJEXT)
+t1unmac_OBJECTS = $(am_t1unmac_OBJECTS)
+t1unmac_LDADD = $(LDADD)
+t1unmac_DEPENDENCIES = @LIBOBJS@
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(t1ascii_SOURCES) $(t1asm_SOURCES) $(t1binary_SOURCES) \
+ $(t1disasm_SOURCES) $(t1mac_SOURCES) $(t1unmac_SOURCES)
+DIST_SOURCES = $(t1ascii_SOURCES) $(t1asm_SOURCES) $(t1binary_SOURCES) \
+ $(t1disasm_SOURCES) $(t1mac_SOURCES) $(t1unmac_SOURCES)
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = foreign check-news
+man_MANS = t1ascii.1 t1binary.1 t1asm.1 t1disasm.1 t1unmac.1 t1mac.1
+t1ascii_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1ascii.c
+
+t1binary_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1binary.c
+
+t1asm_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1asm.c
+
+t1disasm_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1disasm.c
+
+t1unmac_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1unmac.c
+
+t1mac_SOURCES = include/lcdf/clp.h include/lcdf/inttypes.h \
+ clp.c t1lib.h t1lib.c t1mac.c
+
+AM_CPPFLAGS = -I$(top_srcdir)/include
+LDADD = @LIBOBJS@
+EXTRA_DIST = $(man_MANS) t1utils.spec
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+t1ascii$(EXEEXT): $(t1ascii_OBJECTS) $(t1ascii_DEPENDENCIES)
+ @rm -f t1ascii$(EXEEXT)
+ $(LINK) $(t1ascii_LDFLAGS) $(t1ascii_OBJECTS) $(t1ascii_LDADD) $(LIBS)
+t1asm$(EXEEXT): $(t1asm_OBJECTS) $(t1asm_DEPENDENCIES)
+ @rm -f t1asm$(EXEEXT)
+ $(LINK) $(t1asm_LDFLAGS) $(t1asm_OBJECTS) $(t1asm_LDADD) $(LIBS)
+t1binary$(EXEEXT): $(t1binary_OBJECTS) $(t1binary_DEPENDENCIES)
+ @rm -f t1binary$(EXEEXT)
+ $(LINK) $(t1binary_LDFLAGS) $(t1binary_OBJECTS) $(t1binary_LDADD) $(LIBS)
+t1disasm$(EXEEXT): $(t1disasm_OBJECTS) $(t1disasm_DEPENDENCIES)
+ @rm -f t1disasm$(EXEEXT)
+ $(LINK) $(t1disasm_LDFLAGS) $(t1disasm_OBJECTS) $(t1disasm_LDADD) $(LIBS)
+t1mac$(EXEEXT): $(t1mac_OBJECTS) $(t1mac_DEPENDENCIES)
+ @rm -f t1mac$(EXEEXT)
+ $(LINK) $(t1mac_LDFLAGS) $(t1mac_OBJECTS) $(t1mac_LDADD) $(LIBS)
+t1unmac$(EXEEXT): $(t1unmac_OBJECTS) $(t1unmac_DEPENDENCIES)
+ @rm -f t1unmac$(EXEEXT)
+ $(LINK) $(t1unmac_LDFLAGS) $(t1unmac_OBJECTS) $(t1unmac_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1ascii.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1asm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1binary.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1disasm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1lib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1mac.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1unmac.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @case `sed 15q $(srcdir)/NEWS` in \
+ *"$(VERSION)"*) : ;; \
+ *) \
+ echo "NEWS not updated; not releasing" 1>&2; \
+ exit 1;; \
+ esac
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS) config.h
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(DEPDIR) ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -rf $(DEPDIR) ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+ dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-compile distclean-generic distclean-hdr \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-man1 install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+ ps ps-am tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-man uninstall-man1
+
+
+srclinks:
+ cd $(top_srcdir); test -d include/lcdf || mkdir -p include/lcdf
+ cd $(top_srcdir); for i in clp.h inttypes.h; do \
+ ln -sf ~/src/liblcdf/include/lcdf/$$i include/lcdf/$$i; done
+ cd $(top_srcdir); for i in clp.c strerror.c; do \
+ ln -sf ~/src/liblcdf/liblcdf/$$i $$i; done
+
+versionize:
+ perl -pi -e "s/^\\.ds V.*/.ds V $(VERSION)/;" t1ascii.1 t1binary.1 t1disasm.1 t1asm.1 t1unmac.1 t1mac.1
+ perl -pi -e 's/^Version:(\s*).*/Version:$${1}$(VERSION)/; s/$(PACKAGE)-[\w.]+\.tar\.gz/$(PACKAGE)-$(VERSION).tar.gz/;' t1utils.spec
+ perl -pi -e 's/VERSION [\d.ab]+$$/VERSION $(VERSION)/;' README
+
+rpm: dist
+ buildarch=`rpm --showrc | awk '/^build arch/ { print $$4; }'` ; \
+ mkdir -p /tmp/rpm-t1u/SOURCES /tmp/rpm-t1u/RPMS/$$buildarch \
+ /tmp/rpm-t1u/BUILD ; \
+ echo 'include: /usr/lib/rpm/rpmrc' > /tmp/rpm-t1u/rc ; \
+ echo 'macrofiles: /usr/lib/rpm/macros:/tmp/rpm-t1u/macros' >> /tmp/rpm-t1u/rc ; \
+ echo '%_topdir /tmp/rpm-t1u' > /tmp/rpm-t1u/macros ; \
+ cp $(PACKAGE)-$(VERSION).tar.gz /tmp/rpm-t1u/SOURCES ; \
+ rpmbuild --rcfile /tmp/rpm-t1u/rc -bb t1utils.spec ; \
+ cp /tmp/rpm-t1u/RPMS/$$buildarch/*.rpm .
+ rm -rf /tmp/rpm-t1u
+
+.PHONY: srclinks versionize rpm
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/t1utils/NEWS b/Build/source/utils/t1utils/NEWS
new file mode 100644
index 00000000000..970ca5b8668
--- /dev/null
+++ b/Build/source/utils/t1utils/NEWS
@@ -0,0 +1,285 @@
+T1utils NEWS
+
+Version 1.32 23.Feb.2004
+
+* t1disasm: Avoid memory corruption bug (strings passed to eexec_line are
+ not null terminated). Reported by Werner Lemberg.
+
+
+Version 1.31 8.Feb.2004
+
+* All: Support fonts where the eexec-encrypted portion is binary, and the
+ first ciphertext byte is 0. Reported by Werner Lemberg.
+
+
+Version 1.30 6.Jan.2004
+
+* All: Support fonts, such as those in PostScript files printed by
+ acroread, where "currentfile eexec" is not followed by a newline.
+
+
+Version 1.29 6.Oct.2003
+
+* t1disasm: Support odd fonts where a character is defined on the
+ "/CharStrings" line. Reported by Werner Lemberg.
+
+
+Version 1.28 7.Aug.2003
+
+* Address build problems reported by Nelson H.F. Beebe.
+
+
+Version 1.27 26.Mar.2003
+
+* t1ascii: Add optional warning when output lines are longer than 255
+ characters. Requested by Werner Lemberg <wl@gnu.org>.
+
+
+Version 1.26 16.Apr.2002
+
+* t1mac: Fix buglet (C++ comment, and temporary file left behind). Reported
+ by Vladimir Volovich <vvv@vsu.ru>.
+
+
+Version 1.25 3.Jan.2002
+
+* t1asm: Beware extra characters after `currentfile closefile'. Reported by
+ Luc Devroye <luc@cs.mcgill.ca>.
+
+
+Version 1.24 6.Sep.2001
+
+* Fixed compilation bugs on various platforms reported by Nelson H. F.
+ Beebe <beebe@math.utah.edu>.
+
+
+Version 1.23 18.Jun.2001
+
+* Fixed Macintosh file bugs: the MacBinary CRC was calculated incorrectly,
+ and extended finder flags were set to random values in BinHex output.
+ Reported, and patch provided, by Tom Kacvinsky <tjk@ams.org>.
+
+
+Version 1.22 6.Mar.2001
+
+* Fixed bug on processing PFA fonts with DOS line endings. The symptom was
+ t1binary producing strange/unusable fonts. Problem: the all-zeros line,
+ which signals the end of the font's binary section, was not being
+ recognized because of an extra '\r'. This has been a bug since version
+ 1.13 -- chagrin! Problem reported by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+
+Version 1.21 9.Feb.2001
+
+* t1ascii, t1asm, t1unmac: Raised minimum PFA line length to 8. The Adobe
+ spec may imply that there cannot be whitespace within the first 8 bytes
+ of an ASCII-encoded eexec section; it's somewhat ambiguous. Reported by
+ Rainer Menzner <Rainer.Menzner@neuroinformatik.ruhr-uni-bochum.de>.
+
+
+Version 1.20 22.Jun.2000
+
+* t1asm: Fixed bug where `t1asm -a' would give a `warning: line length
+ raised to 4' error message. Reported by Tom Kacvinsky <tjk@ams.org>.
+
+
+Version 1.19 3.May.2000
+
+* t1mac: Generated Macintosh fonts now use a custom-drawn icon set, rather
+ than Adobe's default. They also have a t1utils-specific creator signature
+ (T1UT), and their file information mentions t1utils.
+
+* t1mac: Added the `--filename' option.
+
+
+Version 1.18 2.May.2000
+
+* t1mac: Fixed bug where generated files appeared corrupted to Macintoshes.
+ Reported by Marten Thavenius <marten.thavenius@bahnhof.se>.
+
+
+Version 1.17 27.Apr.2000
+
+* Added new program, `t1mac', which translates PFA or PFB fonts into
+ Macintosh-style fonts. T1mac can output in MacBinary, AppleSingle,
+ AppleDouble, or BinHex format. Suggested by Marten Thavenius
+ <marten.thavenius@bahnhof.se>.
+
+* t1unmac: Added support for BinHex.
+
+* t1unmac: Fixed bugs in manual page and program options.
+
+
+Version 1.16 25.Apr.2000
+
+* t1unmac: Supports AppleSingle and AppleDouble files with the
+ `--applesingle/double' option. Requested by Kent Boortz
+ <kent@erix.ericsson.se>.
+
+
+Version 1.15 4.Apr.2000
+
+* t1ascii, t1binary, and t1disasm: Fixed bad error message.
+
+* t1unmac: Generates PFB fonts by default.
+
+
+Version 1.14 25.Aug.1999
+
+* t1asm: Version 1.13 produced complete crap output. My test cases were too
+ limited to catch this. Found by Rainer Menzner
+ <Rainer.Menzner@neuroinformatik.ruhr-uni-bochum.de>.
+
+
+Version 1.13 2.Aug.1999
+
+* t1disasm: Complete rewrite. It now uses t1lib.c functions; the goal is to
+ handle PFA and PFB fonts consistently. This has been extensively tested,
+ but there may be bugs.
+
+* t1disasm, t1asm: Fixed to support fonts with multiple Subrs and
+ CharStrings sections, like some old Oblique fonts.
+
+* PFA minimum line length raised to 4.
+
+* t1ascii, t1binary, t1disasm: Changes in t1lib.c to support reading binary
+ PFA fonts. Requested by Tom Kacvinsky <tjk@ams.org>.
+
+
+Version 1.12 1.Aug.1999
+
+* t1ascii, t1binary, t1asm, t1disasm: Support fonts with whitespace
+ following the "currentfile eexec" line. Embedded fonts in PostScript
+ generated by Acrobat Reader have this property. Reported by Tom Kacvinsky
+ <tjk@ams.org>.
+
+* t1ascii, t1asm, t1unmac: Use lowercase hex digits instead of uppercase.
+
+* t1unmac: Added `--line-length' option for PFA output.
+
+
+Version 1.11 29.May.1999
+
+* Bug fix in t1asm/t1disasm: if a `readhexstring' procedure was defined, we
+ got confused. Reported by Luc Devroye <luc@CS.McGill.CA>.
+
+* t1binary now has a maximum block length of 2^32 - 1. "Feature" requested
+ by Werner Lemberg <wl@gnu.org>.
+
+* t1ascii and t1binary each accept both PFA and PFB fonts. If you pass an
+ ASCII font (PFA) to t1ascii, it will output it mostly unchanged, and
+ similarly for PFB fonts and t1binary. The `-l' options will still take
+ effect, so you can use `t1ascii -l 60' to shorten the encrypted line
+ lengths of a PFA font. t1ascii also does some newline translation
+ (changes carriage returns to newlines).
+
+
+Version 1.10.1 12.Apr.1999
+
+* t1asm: Fixed bug when `-l' option wasn't provided. Caught by Giuseppe
+ Ghibň <ghibo@caesar.polito.it>.
+
+
+Version 1.10 11.Apr.1999
+
+* t1asm/t1disasm: Provide support for Type1C (Compact Font Format) font
+ files. These fonts have unencrypted character strings, signalled by a
+ negative lenIV value. Suggestion and patch thanks to Tom Kacvinsky
+ <tjk@ams.org>.
+
+* t1ascii/t1asm: Added `-l/--line-length' option to control maximum
+ encrypted line length. Suggestion thanks to Giuseppe Ghibň
+ <ghibo@caesar.polito.it>.
+
+
+Version 1.9 14.Feb.1999
+
+* t1asm/t1disasm: Be more robust on fonts that don't end in `mark
+ currentfile closefile'. John Vromans <JVromans@squirrel.nl> provided a
+ font that ended with `mark' on one line and `currentfile closefile' on
+ another; t1asm and t1disasm did not recognize the encrypted section of
+ the font had ended, and generated some garbage.
+
+
+Version 1.8 2.Jan.1999
+
+* Added some more Type 2 commands (flex, flex1, hflex, hflex1) from a
+ revision of the Type 2 spec. (I wouldn't have known about this except for
+ CurveSoft's revised t1utils package, available at
+ http://www.curvesoft.com. These t1utils are more up-to-date than theirs,
+ however.)
+
+* t1asm: Fixed one Type 2 command's translation (cntrmask was incorrectly
+ mapped to 18, not 20).
+
+
+Version 1.7.2 11.Dec.1998
+
+* Integrated patches from Jan-Jaap van der Heijden
+ <J.J.vanderHeijden@student.utwente.nl> to support building t1utils under
+ 32-bit Windows.
+
+
+Version 1.7.1 5.Dec.1998
+
+* The t1utils package now uses automake.
+
+
+Version 1.7 27.Nov.1998
+
+* t1asm: Should now work with fonts that have no /Subrs sections. Previously,
+ assembling such a font would silently fail; all the character definitions
+ would be mistaken for procedures and t1asm wouldn't translate them. Problem
+ noticed and fix suggested by Tom Kacvinsky <tjk@ams.org>.
+
+* t1disasm: Removed spurious debugging output and improved warning message
+ about unknown charstring commands.
+
+* Changed fgetc/fputc into getc/putc.
+
+
+Version 1.6 27.Sep.1998
+
+* `--help' now prints to stdout, following the GNU Coding Standards.
+
+* Makefiles: Added `make uninstall' target, enabled `./configure's
+ program name transformations, made VPATH builds possible.
+
+
+Version 1.5.2 6.Aug.1998
+
+* t1asm/t1disasm: Changed unknown charstring commands at the request of
+ Werner Lemberg and LEE Chun-Yu. An unknown escape in the charstring, like
+ 12 X, is translated to "escape_X" rather than "UNKNOWN_12_X".
+
+
+Version 1.5.1 31.May.1998
+
+* t1unmac did not actually understand the -r and -b options. Fixed.
+
+* t1unmac: Added better diagnostics to help you diagnose seeking problems.
+
+
+Version 1.5 5.Mar.1998
+
+* Initial release with Eddie Kohler as maintainer.
+
+* All: Updated to the GNU program behavior standards (long options, --help,
+ --version). Banners removed. Added more error messages.
+
+* t1binary: Removed fixed limit on line length.
+
+* t1binary: Supports Macintosh files, whose lines end in `\r'.
+
+* t1binary: Supports an odd number of hex digits in a line.
+
+* t1asm/t1disasm: Added support for Type 2 commands like `blend' and `add',
+ which also appear in some multiple master fonts like Adobe Jenson.
+
+* t1asm/t1disasm: Added support for unknown charstring commands. t1disasm
+ translates an unknown command #X to "UNKNOWN_X", and t1asm does the reverse.
+
+* t1asm/t1unmac: Changed default output to PFB.
+
+* t1unmac: Used to be called `unpost'. `t1unmac' is a much better name.
diff --git a/Build/source/utils/t1utils/README b/Build/source/utils/t1utils/README
new file mode 100644
index 00000000000..fa4f3184d51
--- /dev/null
+++ b/Build/source/utils/t1utils/README
@@ -0,0 +1,81 @@
+T1UTILS VERSION 1.30 NOTES
+==========================
+
+ You need an ANSI C compiler, such as gcc.
+
+ Just type `./configure', then `make'. `make install' will build and
+install the utilities and their manual pages.
+
+ `./configure' accepts the usual options. See `INSTALL' for more
+details. The most commonly used option is `--prefix', which can be used
+to install the utilities in a place other than /usr/local.
+
+ Changes since version 1.2 (c) 1998-2003 Eddie Kohler, under the same
+redistribution copyright as I. Lee Hetherington's. See below for I. Lee
+Hetherington's original README from 1992, updated slightly for today's
+t1utils.
+
+Eddie Kohler
+kohler@icir.org
+
+####################################################################
+
+t1utils is a collection of simple type-1 font manipulation programs.
+Together, they allow you to convert between PFA (ASCII) and PFB (binary)
+formats, disassemble PFA or PFB files into human-readable form, reassemble
+them into PFA or PFB format. Additionally you can extract font resources
+from a Macintosh font file (ATM/Laserwriter), or create a Macintosh Type 1
+font file from a PFA or PFB font.
+
+There are currently six programs:
+
+t1ascii converts PFB files to PFA format.
+
+t1binary converts PFA files to PFB format.
+
+t1disasm disassembles a type-1 font (PFA or PFB format) into a
+ raw, human-readable text form for subsequent hand
+ editing, tweaking, hint fixing, etc...
+
+t1asm assembles type-1 font into PFA or PFB format from
+ human-readable form produced by t1disasm.
+
+t1unmac extracts POST resources from a Macintosh type-1 file
+ (ATM/Laserwriter) into PFA or PFB format for use outside
+ the Macintosh environment. The Macintosh file should be
+ stored in MacBinary, AppleSingle, AppleDouble, or BinHex
+ format, or as a raw resource fork. Note that t1unmac does
+ not have to run on a Macintosh, but makes Macintosh type-1
+ fonts available to Unix machines and PCs.
+
+t1mac creates a Macintosh Type 1 file from a PFA or PFB-format
+ Type 1 font. Writes the Macintosh file in MacBinary,
+ AppleSingle, AppleDouble, or BinHex format, or as a raw
+ resource fork. WARNING: This will not suffice to use the
+ new font on a Macintosh, as Macintoshes cannot read raw
+ Type 1 fonts. You will need to create a font suitcase
+ containing bitmap fonts if you do not have such a suitcase
+ for the font already. T1utils cannot help you do this.
+
+...
+
+Thanks to Kai-Uwe Herbing (herbing@netmbx.netmbx.de) for the MS-DOS
+port (Microsoft C/C++ compiler).
+
+The copyright on all of the tools in t1utils looks like:
+
+ Copyright (c) 1992 by I. Lee Hetherington, all rights
+ reserved.
+
+ Permission is hereby granted to use, modify, and distribute
+ this program for any purpose provided this copyright notice
+ and the one below remain intact.
+
+Note that these tools should not be used to illegally copy type-1 font
+programs. Typeface design is an intricate art that should be
+rewarded.
+
+I. Lee Hetherington
+ilh@lcs.mit.edu
+
+####################################################################
diff --git a/Build/source/utils/t1utils/aclocal.m4 b/Build/source/utils/t1utils/aclocal.m4
new file mode 100644
index 00000000000..ef60f98401f
--- /dev/null
+++ b/Build/source/utils/t1utils/aclocal.m4
@@ -0,0 +1,1044 @@
+# generated automatically by aclocal 1.9.2 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# -*- Autoconf -*-
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Generated from amversion.in; do not edit by hand.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.2])])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 6
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# serial 7 -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+#serial 2
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 7
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# This macro actually does too much some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 11
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# -*- Autoconf -*-
+# Copyright (C) 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# -*- Autoconf -*-
+
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/Build/source/utils/t1utils/clp.c b/Build/source/utils/t1utils/clp.c
new file mode 100644
index 00000000000..8b84e826d6c
--- /dev/null
+++ b/Build/source/utils/t1utils/clp.c
@@ -0,0 +1,1533 @@
+/* -*- related-file-name: "../include/lcdf/clp.h" -*- */
+/* clp.c - Complete source code for CLP.
+ * This file is part of CLP, the command line parser package.
+ *
+ * Copyright (c) 1997-2003 Eddie Kohler, kohler@icir.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file, which is available in full at
+ * http://www.pdos.lcs.mit.edu/click/license.html. The conditions include: you
+ * must preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/clp.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+/* By default, assume we have strtoul. */
+#if !defined(HAVE_STRTOUL) && !defined(HAVE_CONFIG_H)
+# define HAVE_STRTOUL 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Option types for Clp_SetOptionChar */
+#define Clp_DoubledLong (Clp_LongImplicit * 2)
+
+#define Clp_AnyArgument (Clp_Mandatory | Clp_Optional)
+
+#define MAX_AMBIGUOUS_VALUES 4
+
+typedef struct {
+ Clp_ArgParseFunc func;
+ int flags;
+ void *thunk;
+} Clp_ArgType;
+
+
+typedef struct {
+ int pos;
+ int neg;
+} Clp_LongMinMatch;
+
+
+struct Clp_Internal {
+
+ Clp_Option *opt;
+ Clp_LongMinMatch *long_min_match;
+ int nopt;
+
+ Clp_ArgType *argtype;
+ int nargtype;
+
+ const char * const *argv;
+ int argc;
+
+ unsigned char option_class[256];
+ int both_short_and_long;
+
+ char option_chars[3];
+ const char *text;
+
+ const char *program_name;
+ void (*error_handler)(const char *);
+
+ int is_short;
+ int whole_negated; /* true if negated by an option character */
+ int could_be_short;
+
+ int option_processing;
+
+ int ambiguous;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES];
+
+ Clp_Option *current_option;
+ int current_short;
+ int negated_by_no;
+
+};
+
+
+struct Clp_ParserState {
+
+ const char * const *argv;
+ int argc;
+ char option_chars[3];
+ const char *text;
+ int is_short;
+ int whole_negated;
+
+};
+
+
+typedef struct Clp_StringList {
+
+ Clp_Option *items;
+ Clp_LongMinMatch *long_min_match;
+ int nitems;
+
+ int allow_int;
+ int nitems_invalid_report;
+
+} Clp_StringList;
+
+
+#define TEST(o, f) (((o)->flags & (f)) != 0)
+
+
+static int calculate_long_min_match(int, Clp_Option *, int, int, int);
+
+static int parse_string(Clp_Parser *, const char *, int, void *);
+static int parse_int(Clp_Parser *, const char *, int, void *);
+static int parse_bool(Clp_Parser *, const char *, int, void *);
+static int parse_double(Clp_Parser *, const char *, int, void *);
+static int parse_string_list(Clp_Parser *, const char *, int, void *);
+
+static int ambiguity_error(Clp_Parser *, int, int *, Clp_Option *,
+ const char *, const char *, ...);
+
+
+/*******
+ * Clp_NewParser, etc.
+ **/
+
+static void
+check_duplicated_short_options(Clp_Parser *clp, int nopt, Clp_Option *opt, int negated)
+{
+ int i;
+ int check[256];
+
+ for (i = 0; i < 256; i++)
+ check[i] = -1;
+
+ for (i = 0; i < nopt; i++)
+ if (opt[i].short_name > 0 && opt[i].short_name < 256
+ && (negated ? TEST(&opt[i], Clp_Negate)
+ : !TEST(&opt[i], Clp_OnlyNegated))) {
+ int sh = opt[i].short_name;
+ if (check[sh] >= 0 && check[sh] != opt[i].option_id)
+ Clp_OptionError(clp, "CLP internal error: more than 1 option has short name '%c'", sh);
+ check[sh] = opt[i].option_id;
+ }
+}
+
+Clp_Parser *
+Clp_NewParser(int argc, const char * const *argv, int nopt, Clp_Option *opt)
+ /* Creates and returns a new Clp_Parser using the options in 'opt',
+ or 0 on memory allocation failure */
+{
+ int i;
+ Clp_Parser *clp = (Clp_Parser *)malloc(sizeof(Clp_Parser));
+ Clp_Internal *cli = (Clp_Internal *)malloc(sizeof(Clp_Internal));
+ Clp_LongMinMatch *lmm = (Clp_LongMinMatch *)malloc(sizeof(Clp_LongMinMatch) * nopt);
+ if (!clp || !cli || !lmm)
+ goto failed;
+
+ clp->internal = cli;
+ cli->long_min_match = lmm;
+
+ /* Assign arguments (need to do this now so we can call Clp_OptionError) */
+ cli->argc = argc;
+ cli->argv = argv;
+ {
+ const char *slash = strrchr(argv[0], '/');
+ cli->program_name = slash ? slash + 1 : argv[0];
+ }
+ cli->error_handler = 0;
+
+ /* Get rid of negative option_ids, which are internal to CLP */
+ for (i = 0; i < nopt; i++)
+ if (opt[i].option_id < 0) {
+ Clp_OptionError(clp, "CLP internal error: option %d has negative option_id", i);
+ opt[i] = opt[nopt - 1];
+ nopt--;
+ i--;
+ }
+
+ /* Massage the options to make them usable */
+ for (i = 0; i < nopt; i++) {
+ /* Enforce invariants */
+ if (opt[i].arg_type <= 0)
+ opt[i].flags &= ~Clp_AnyArgument;
+ if (opt[i].arg_type > 0 && !TEST(&opt[i], Clp_Optional))
+ opt[i].flags |= Clp_Mandatory;
+
+ /* Nonexistent short options have character 256. We know this won't
+ equal any character in an argument, even if characters are signed */
+ if (opt[i].short_name <= 0 || opt[i].short_name > 255)
+ opt[i].short_name = 256;
+
+ /* Options that start with 'no-' should be changed to OnlyNegated */
+ if (opt[i].long_name && strncmp(opt[i].long_name, "no-", 3) == 0) {
+ opt[i].long_name += 3;
+ opt[i].flags |= Clp_Negate | Clp_OnlyNegated;
+ }
+ }
+
+ /* Check for duplicated short options */
+ check_duplicated_short_options(clp, nopt, opt, 0);
+ check_duplicated_short_options(clp, nopt, opt, 1);
+
+ /* Calculate long options' minimum unambiguous length */
+ for (i = 0; i < nopt; i++)
+ if (opt[i].long_name && !TEST(&opt[i], Clp_OnlyNegated))
+ lmm[i].pos = calculate_long_min_match
+ (nopt, opt, i, Clp_OnlyNegated, 0);
+ for (i = 0; i < nopt; i++)
+ if (opt[i].long_name && TEST(&opt[i], Clp_Negate))
+ lmm[i].neg = calculate_long_min_match
+ (nopt, opt, i, Clp_Negate, Clp_Negate);
+
+ /* Set up clp->internal */
+ cli->opt = opt;
+ cli->nopt = nopt;
+
+ cli->argtype = (Clp_ArgType *)malloc(sizeof(Clp_ArgType) * 5);
+ if (!cli->argtype)
+ goto failed;
+ cli->nargtype = 5;
+
+ for (i = 0; i < 256; i++)
+ cli->option_class[i] = 0;
+ cli->option_class[(int) '-'] = Clp_Short;
+ cli->both_short_and_long = 0;
+
+ cli->is_short = 0;
+ cli->whole_negated = 0;
+
+ cli->option_processing = 1;
+ cli->current_option = 0;
+
+ /* Add default type parsers */
+ Clp_AddType(clp, Clp_ArgString, 0, parse_string, 0);
+ Clp_AddType(clp, Clp_ArgStringNotOption, Clp_DisallowOptions, parse_string, 0);
+ Clp_AddType(clp, Clp_ArgInt, 0, parse_int, 0);
+ Clp_AddType(clp, Clp_ArgUnsigned, 0, parse_int, (void *)cli);
+ Clp_AddType(clp, Clp_ArgBool, 0, parse_bool, 0);
+ Clp_AddType(clp, Clp_ArgDouble, 0, parse_double, 0);
+ return clp;
+
+ failed:
+ if (cli && cli->argtype)
+ free(cli->argtype);
+ if (cli)
+ free(cli);
+ if (clp)
+ free(clp);
+ if (lmm)
+ free(lmm);
+ return 0;
+}
+
+void
+Clp_DeleteParser(Clp_Parser *clp)
+ /* Destroys the Clp_Parser 'clp' and any associated memory allocated by
+ CLP */
+{
+ int i;
+ Clp_Internal *cli;
+ if (!clp)
+ return;
+
+ cli = clp->internal;
+
+ /* get rid of any string list types */
+ for (i = 0; i < cli->nargtype; i++)
+ if (cli->argtype[i].func == parse_string_list) {
+ Clp_StringList *clsl = (Clp_StringList *)cli->argtype[i].thunk;
+ free(clsl->items);
+ free(clsl->long_min_match);
+ free(clsl);
+ }
+
+ free(cli->argtype);
+ free(cli->long_min_match);
+ free(cli);
+ free(clp);
+}
+
+
+int
+Clp_SetOptionProcessing(Clp_Parser *clp, int option_processing)
+ /* Sets whether command line arguments are parsed (looking for options)
+ at all. Each parser starts out with OptionProcessing true. Returns old
+ value. */
+{
+ Clp_Internal *cli = clp->internal;
+ int old = cli->option_processing;
+ cli->option_processing = option_processing;
+ return old;
+}
+
+
+Clp_ErrorHandler
+Clp_SetErrorHandler(Clp_Parser *clp, void (*error_handler)(const char *))
+ /* Sets a hook function to be called before Clp_OptionError
+ prints anything. 0 means nothing will be called. */
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_ErrorHandler old = cli->error_handler;
+ cli->error_handler = error_handler;
+ return old;
+}
+
+
+int
+Clp_SetOptionChar(Clp_Parser *clp, int c, int option_type)
+ /* Determines how clp will deal with short options.
+ option_type must be a sum of:
+
+ 0 == Clp_NotOption 'c' isn't an option.
+ Clp_Short 'c' introduces a list of short options.
+ Clp_Long 'c' introduces a long option.
+ Clp_ShortNegated 'c' introduces a negated list of
+ short options.
+ Clp_LongNegated 'c' introduces a negated long option.
+ Clp_LongImplicit 'c' introduces a long option, and *is part
+ of the long option itself*.
+
+ Some values are not allowed (Clp_Long | Clp_LongNegated isn't allowed,
+ for instance). c=0 means ALL characters are that type. Returns 0 on
+ failure (you gave an illegal option_type), 1 on success. */
+{
+ int i;
+ Clp_Internal *cli = clp->internal;
+
+ if (option_type < 0
+ || option_type >= 2*Clp_LongImplicit
+ || ((option_type & Clp_Short) && (option_type & Clp_ShortNegated))
+ || ((option_type & Clp_Long) && (option_type & Clp_LongNegated))
+ || ((option_type & Clp_LongImplicit) && (option_type & (Clp_Short | Clp_ShortNegated | Clp_Long | Clp_LongNegated))))
+ return 0;
+
+ if (c == 0)
+ for (i = 1; i < 256; i++)
+ cli->option_class[i] = option_type;
+ else
+ cli->option_class[c] = option_type;
+
+ /* If an option character can introduce either short or long options, then
+ we need to fix up the long_min_match values. We may have set the
+ long_min_match for option '--abcde' to 1, if no other option starts
+ with 'a'. But if '-' can introduce either a short option or a long
+ option, AND a short option '-a' exists, then the long_min_match for
+ '--abcde' must be set to 2! */
+ if (!cli->both_short_and_long) {
+ int either_short = option_type & (Clp_Short | Clp_ShortNegated);
+ int either_long = option_type & (Clp_Long | Clp_LongNegated);
+ if (either_short && either_long) {
+ unsigned char have_short[257];
+ for (i = 0; i < 256; i++)
+ have_short[i] = 0;
+ for (i = 0; i < cli->nopt; i++)
+ have_short[cli->opt[i].short_name] = 1;
+ for (i = 0; i < cli->nopt; i++)
+ if (cli->opt[i].long_name && cli->long_min_match[i].pos == 1) {
+ /* if '--Cxxxx's short name is '-C', keep long_min_match
+ == 1 */
+ unsigned char first = (unsigned char)cli->opt[i].long_name[0];
+ if (have_short[first] && first != cli->opt[i].short_name)
+ cli->long_min_match[i].pos++;
+ }
+ cli->both_short_and_long = 1;
+ }
+ }
+
+ return 1;
+}
+
+
+/*******
+ * functions for Clp_Option lists
+ **/
+
+static int
+min_different_chars(const char *s, const char *t)
+ /* Returns the minimum number of characters required to distinguish
+ s from t.
+ If s is shorter than t, returns strlen(s). */
+{
+ const char *sfirst = s;
+ while (*s && *t && *s == *t)
+ s++, t++;
+ if (!*s)
+ return s - sfirst;
+ else
+ return s - sfirst + 1;
+}
+
+static int
+calculate_long_min_match(int nopt, Clp_Option *opt, int which,
+ int flags, int flags_value)
+{
+ int j, lmm = 1;
+ int preferred = (opt[which].flags & Clp_PreferredMatch);
+
+ for (j = 0; j < nopt; j++)
+ if (opt[j].long_name
+ && (opt[j].flags & flags) == flags_value
+ && opt[which].option_id != opt[j].option_id
+ && strncmp(opt[which].long_name, opt[j].long_name, lmm) == 0
+ && (!preferred || strncmp(opt[which].long_name, opt[j].long_name, strlen(opt[which].long_name)) != 0))
+ lmm = min_different_chars(opt[which].long_name, opt[j].long_name);
+
+ return lmm;
+}
+
+/* the ever-glorious argcmp */
+
+static int
+argcmp(const char *ref, const char *arg, int min_match, int fewer_dashes)
+ /* Returns 0 if ref and arg don't match.
+ Returns -1 if ref and arg match, but fewer than min_match characters.
+ Returns len if ref and arg match min_match or more characters;
+ len is the number of characters that matched in arg.
+ Allows arg to contain fewer dashes than ref iff fewer_dashes != 0.
+
+ Examples:
+ argcmp("x", "y", 1, 0) --> 0 / just plain wrong
+ argcmp("a", "ax", 1, 0) --> 0 / ...even though min_match == 1
+ and the 1st chars match
+ argcmp("box", "bo", 3, 0) --> -1 / ambiguous
+ argcmp("cat", "c=3", 1, 0) --> 1 / handles = arguments
+ */
+{
+ const char *refstart = ref;
+ const char *argstart = arg;
+ assert(min_match > 0);
+
+ compare:
+ while (*ref && *arg && *arg != '=' && *ref == *arg)
+ ref++, arg++;
+
+ /* Allow arg to contain fewer dashes than ref */
+ if (fewer_dashes && *ref == '-' && ref[1] && ref[1] == *arg) {
+ ref++;
+ goto compare;
+ }
+
+ if (*arg && *arg != '=')
+ return 0;
+ else if (ref - refstart < min_match)
+ return -1;
+ else
+ return arg - argstart;
+}
+
+static int
+find_prefix_opt(const char *arg, int nopt, Clp_Option *opt,
+ Clp_LongMinMatch *lmmvec,
+ int *ambiguous, int *ambiguous_values, int negated)
+ /* Looks for an unambiguous match of 'arg' against one of the long
+ options in 'opt'. Returns positive if it finds one; otherwise, returns
+ -1 and possibly changes 'ambiguous' and 'ambiguous_values' to keep
+ track of at most MAX_AMBIGUOUS_VALUES possibilities. */
+{
+ int i, fewer_dashes = 0, first_ambiguous = *ambiguous;
+
+ retry:
+ for (i = 0; i < nopt; i++) {
+ int len, lmm;
+ if (!opt[i].long_name
+ || (negated && !TEST(&opt[i], Clp_Negate))
+ || (!negated && TEST(&opt[i], Clp_OnlyNegated)))
+ continue;
+
+ lmm = (negated ? lmmvec[i].neg : lmmvec[i].pos);
+ len = argcmp(opt[i].long_name, arg, lmm, fewer_dashes);
+ if (len > 0)
+ return i;
+ else if (len < 0) {
+ if (*ambiguous < MAX_AMBIGUOUS_VALUES)
+ ambiguous_values[*ambiguous] = i;
+ (*ambiguous)++;
+ }
+ }
+
+ /* If there were no partial matches, try again with fewer_dashes true */
+ if (*ambiguous == first_ambiguous && !fewer_dashes) {
+ fewer_dashes = 1;
+ goto retry;
+ }
+
+ return -1;
+}
+
+
+/*****
+ * Argument parsing
+ **/
+
+int
+Clp_AddType(Clp_Parser *clp, int type_id, int flags,
+ Clp_ArgParseFunc func, void *thunk)
+ /* Add a argument parser for type_id to the Clp_Parser. When an argument
+ arg for Clp_Option opt is being processed, the parser routines will
+ call (*func)(clp, opt, arg, thunk, complain)
+ where complain is 1 if the routine should report errors, or 0 if it
+ should fail silently.
+ Returns 1 on success, 0 if memory allocation fails or the arguments
+ are bad. */
+{
+ int i;
+ Clp_Internal *cli = clp->internal;
+ Clp_ArgType *new_argtype;
+ int nargtype = cli->nargtype;
+ assert(nargtype);
+
+ if (type_id <= 0 || !func)
+ return 0;
+
+ while (nargtype <= type_id)
+ nargtype *= 2;
+ new_argtype = (Clp_ArgType *)
+ realloc(cli->argtype, sizeof(Clp_ArgType) * nargtype);
+ if (!new_argtype)
+ return 0;
+ cli->argtype = new_argtype;
+
+ for (i = cli->nargtype; i < nargtype; i++)
+ cli->argtype[i].func = 0;
+ cli->nargtype = nargtype;
+
+ cli->argtype[type_id].func = func;
+ cli->argtype[type_id].flags = flags;
+ cli->argtype[type_id].thunk = thunk;
+ return 1;
+}
+
+
+/*******
+ * Default argument parsers
+ **/
+
+static int
+parse_string(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ (void)complain, (void)thunk;
+ clp->val.s = arg;
+ return 1;
+}
+
+static int
+parse_int(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ char *val;
+ int base = 10;
+ if (arg[0] == '0' && (arg[1] == 'x' || arg[1] == 'X')) {
+ base = 16;
+ arg += 2;
+ }
+
+ if (thunk != 0) { /* unsigned */
+#if HAVE_STRTOUL
+ clp->val.u = strtoul(arg, &val, base);
+#else
+ /* don't bother really trying to do it right */
+ if (arg[0] == '-')
+ val = (char *) arg;
+ else
+ clp->val.u = strtol(arg, &val, base);
+#endif
+ } else
+ clp->val.i = strtol(arg, &val, base);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain) {
+ const char *message = thunk != 0
+ ? "'%O' expects a nonnegative integer, not '%s'"
+ : "'%O' expects an integer, not '%s'";
+ if (base == 16) arg -= 2;
+ return Clp_OptionError(clp, message, arg);
+ } else
+ return 0;
+}
+
+static int
+parse_double(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ char *val;
+ (void)thunk;
+ clp->val.d = strtod(arg, &val);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain)
+ return Clp_OptionError(clp, "'%O' expects a real number, not '%s'", arg);
+ else
+ return 0;
+}
+
+static int
+parse_bool(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ int i;
+ char lcarg[6];
+ (void)thunk;
+ if (strlen(arg) > 5 || strchr(arg, '=') != 0)
+ goto error;
+
+ for (i = 0; arg[i] != 0; i++)
+ lcarg[i] = tolower(arg[i]);
+ lcarg[i] = 0;
+
+ if (argcmp("yes", lcarg, 1, 0) > 0
+ || argcmp("true", lcarg, 1, 0) > 0
+ || argcmp("1", lcarg, 1, 0) > 0) {
+ clp->val.i = 1;
+ return 1;
+ } else if (argcmp("no", lcarg, 1, 0) > 0
+ || argcmp("false", lcarg, 1, 0) > 0
+ || argcmp("1", lcarg, 1, 0) > 0) {
+ clp->val.i = 0;
+ return 1;
+ }
+
+ error:
+ if (complain)
+ Clp_OptionError(clp, "'%O' expects a true-or-false value, not '%s'", arg);
+ return 0;
+}
+
+
+/*****
+ * Clp_AddStringListType
+ **/
+
+static int
+parse_string_list(Clp_Parser *clp, const char *arg, int complain, void *thunk)
+{
+ Clp_StringList *sl = (Clp_StringList *)thunk;
+ int idx, ambiguous = 0;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES + 1];
+
+ /* actually look for a string value */
+ idx = find_prefix_opt
+ (arg, sl->nitems, sl->items, sl->long_min_match,
+ &ambiguous, ambiguous_values, 0);
+ if (idx >= 0) {
+ clp->val.i = sl->items[idx].option_id;
+ return 1;
+ }
+
+ if (sl->allow_int) {
+ if (parse_int(clp, arg, 0, 0))
+ return 1;
+ }
+
+ if (complain) {
+ const char *complaint = (ambiguous ? "an ambiguous" : "not a valid");
+ if (!ambiguous) {
+ ambiguous = sl->nitems_invalid_report;
+ for (idx = 0; idx < ambiguous; idx++)
+ ambiguous_values[idx] = idx;
+ }
+ return ambiguity_error
+ (clp, ambiguous, ambiguous_values, sl->items, "",
+ "'%s' is %s argument to '%O'", arg, complaint);
+ } else
+ return 0;
+}
+
+
+int
+finish_string_list(Clp_Parser *clp, int type_id, int flags,
+ Clp_Option *items, int nitems, int itemscap)
+{
+ int i;
+ Clp_StringList *clsl = (Clp_StringList *)malloc(sizeof(Clp_StringList));
+ Clp_LongMinMatch *lmm = (Clp_LongMinMatch *)malloc(sizeof(Clp_LongMinMatch) * nitems);
+ if (!clsl || !lmm)
+ goto error;
+
+ clsl->items = items;
+ clsl->long_min_match = lmm;
+ clsl->nitems = nitems;
+ clsl->allow_int = (flags & Clp_AllowNumbers) != 0;
+
+ if (nitems < MAX_AMBIGUOUS_VALUES && nitems < itemscap && clsl->allow_int) {
+ items[nitems].long_name = "any integer";
+ clsl->nitems_invalid_report = nitems + 1;
+ } else if (nitems > MAX_AMBIGUOUS_VALUES + 1)
+ clsl->nitems_invalid_report = MAX_AMBIGUOUS_VALUES + 1;
+ else
+ clsl->nitems_invalid_report = nitems;
+
+ for (i = 0; i < nitems; i++)
+ lmm[i].pos = calculate_long_min_match(nitems, items, i, 0, 0);
+
+ if (Clp_AddType(clp, type_id, 0, parse_string_list, clsl))
+ return 1;
+
+ error:
+ if (clsl)
+ free(clsl);
+ if (lmm)
+ free(lmm);
+ return 0;
+}
+
+int
+Clp_AddStringListType(Clp_Parser *clp, int type_id, int flags, ...)
+ /* An easy way to add new types to clp.
+ Call like this:
+ Clp_AddStringListType
+ (clp, type_id, flags,
+ char *s_1, int value_1, ..., char *s_n, int value_n, 0);
+
+ Defines type_id as a type in clp.
+ This type accepts any of the strings s_1, ..., s_n
+ (or unambiguous abbreviations thereof);
+ if argument s_i is given, value_i is stored in clp->val.i.
+ If Clp_AllowNumbers is set in flags,
+ explicit integers are also allowed.
+
+ Returns 1 on success, 0 on memory allocation errors. */
+{
+ int nitems = 0;
+ int itemscap = 5;
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+
+ va_list val;
+ va_start(val, flags);
+
+ if (!items)
+ goto error;
+
+ /* slurp up the arguments */
+ while (1) {
+ int value;
+ char *name = va_arg(val, char *);
+ if (!name)
+ break;
+ value = va_arg(val, int);
+
+ if (nitems >= itemscap) {
+ Clp_Option *new_items;
+ itemscap *= 2;
+ new_items = (Clp_Option *)realloc(items, sizeof(Clp_Option) * itemscap);
+ if (!new_items)
+ goto error;
+ items = new_items;
+ }
+
+ items[nitems].long_name = name;
+ items[nitems].option_id = value;
+ items[nitems].flags = 0;
+ nitems++;
+ }
+
+ va_end(val);
+ if (finish_string_list(clp, type_id, flags, items, nitems, itemscap))
+ return 1;
+
+ error:
+ va_end(val);
+ if (items)
+ free(items);
+ return 0;
+}
+
+
+int
+Clp_AddStringListTypeVec(Clp_Parser *clp, int type_id, int flags,
+ int nitems, char **strings, int *values)
+ /* An alternate way to make a string list type. See Clp_AddStringListType
+ for the basics; this coalesces the strings and values into two arrays,
+ rather than spreading them out into a variable argument list. */
+{
+ int i;
+ int itemscap = (nitems < 5 ? 5 : nitems);
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+ if (!items)
+ return 0;
+
+ /* copy over items */
+ for (i = 0; i < nitems; i++) {
+ items[i].long_name = strings[i];
+ items[i].option_id = values[i];
+ items[i].flags = 0;
+ }
+
+ if (finish_string_list(clp, type_id, flags, items, nitems, itemscap))
+ return 1;
+ else {
+ free(items);
+ return 0;
+ }
+}
+
+
+/*******
+ * Returning information
+ **/
+
+const char *
+Clp_ProgramName(Clp_Parser *clp)
+{
+ return clp->internal->program_name;
+}
+
+
+/******
+ * Clp_ParserStates
+ **/
+
+Clp_ParserState *
+Clp_NewParserState(void)
+{
+ return (Clp_ParserState *)malloc(sizeof(Clp_ParserState));
+}
+
+void
+Clp_DeleteParserState(Clp_ParserState *save)
+{
+ free(save);
+}
+
+
+void
+Clp_SaveParser(Clp_Parser *clp, Clp_ParserState *save)
+ /* Saves parser position in save */
+{
+ Clp_Internal *cli = clp->internal;
+ save->argv = cli->argv;
+ save->argc = cli->argc;
+ memcpy(save->option_chars, cli->option_chars, 3);
+ save->text = cli->text;
+ save->is_short = cli->is_short;
+ save->whole_negated = cli->whole_negated;
+}
+
+
+void
+Clp_RestoreParser(Clp_Parser *clp, Clp_ParserState *save)
+ /* Restores parser position from save */
+{
+ Clp_Internal *cli = clp->internal;
+ cli->argv = save->argv;
+ cli->argc = save->argc;
+ memcpy(cli->option_chars, save->option_chars, 3);
+ cli->text = save->text;
+ cli->is_short = save->is_short;
+ cli->whole_negated = save->whole_negated;
+}
+
+
+/*******
+ * Clp_Next and its helpers
+ **/
+
+static void
+set_option_text(Clp_Internal *cli, const char *text, int n_option_chars)
+{
+ char *option_chars = cli->option_chars;
+ assert(n_option_chars < 3);
+
+ while (n_option_chars-- > 0)
+ *option_chars++ = *text++;
+ *option_chars = 0;
+
+ cli->text = text;
+}
+
+
+static int
+next_argument(Clp_Parser *clp, int want_argument)
+ /* Moves clp to the next argument.
+ Returns 1 if it finds another option.
+ Returns 0 if there aren't any more arguments.
+ Returns 0, sets clp->have_arg = 1, and sets clp->arg to the argument
+ if the next argument isn't an option.
+ If want_argument > 0, it'll look for an argument.
+ want_argument == 1: Accept arguments that start with Clp_NotOption
+ or Clp_LongImplicit.
+ want_argument == 2: Accept ALL arguments.
+
+ Where is the option stored when this returns?
+ Well, cli->argv[0] holds the whole of the next command line argument.
+ cli->option_chars holds a string: what characters began the option?
+ It is generally "-" or "--".
+ cli->text holds the text of the option:
+ for short options, cli->text[0] is the relevant character;
+ for long options, cli->text holds the rest of the option. */
+{
+ Clp_Internal *cli = clp->internal;
+ const char *text;
+ int option_class;
+
+ /* clear relevant flags */
+ clp->have_arg = 0;
+ clp->arg = 0;
+ cli->could_be_short = 0;
+
+ /* if we're in a string of short options, move up one char in the string */
+ if (cli->is_short) {
+ ++cli->text;
+ if (cli->text[0] == 0)
+ cli->is_short = 0;
+ else if (want_argument > 0) {
+ /* handle -O[=]argument case */
+ clp->have_arg = 1;
+ if (cli->text[0] == '=')
+ clp->arg = cli->text + 1;
+ else
+ clp->arg = cli->text;
+ cli->is_short = 0;
+ return 0;
+ }
+ }
+
+ /* if in short options, we're all set */
+ if (cli->is_short)
+ return 1;
+
+ /** if not in short options, move to the next argument **/
+ cli->whole_negated = 0;
+ cli->text = 0;
+
+ if (cli->argc <= 1)
+ return 0;
+
+ cli->argc--;
+ cli->argv++;
+ text = cli->argv[0];
+
+ if (want_argument > 1)
+ goto not_option;
+
+ option_class = cli->option_class[ (unsigned char)text[0] ];
+ if (text[0] == '-' && text[1] == '-')
+ option_class = Clp_DoubledLong;
+
+ /* If this character could introduce either a short or a long option,
+ try a long option first, but remember that short's a possibility for
+ later. */
+ if ((option_class & (Clp_Short | Clp_ShortNegated))
+ && (option_class & (Clp_Long | Clp_LongNegated))) {
+ option_class &= ~(Clp_Short | Clp_ShortNegated);
+ if (text[1] != 0)
+ cli->could_be_short = 1;
+ }
+
+ switch (option_class) {
+
+ case Clp_Short:
+ cli->is_short = 1;
+ goto check_singleton;
+
+ case Clp_ShortNegated:
+ cli->is_short = 1;
+ cli->whole_negated = 1;
+ goto check_singleton;
+
+ case Clp_Long:
+ goto check_singleton;
+
+ case Clp_LongNegated:
+ cli->whole_negated = 1;
+ goto check_singleton;
+
+ check_singleton:
+ /* For options introduced with one character, option-char,
+ '[option-char]' alone is NOT an option. */
+ if (text[1] == 0)
+ goto not_option;
+ set_option_text(cli, text, 1);
+ break;
+
+ case Clp_LongImplicit:
+ /* LongImplict: option_chars == "" (since all chars are part of the
+ option); restore head -> text of option */
+ if (want_argument > 0)
+ goto not_option;
+ set_option_text(cli, text, 0);
+ break;
+
+ case Clp_DoubledLong:
+ set_option_text(cli, text, 2);
+ break;
+
+ not_option:
+ case Clp_NotOption:
+ cli->is_short = 0;
+ clp->have_arg = 1;
+ clp->arg = text;
+ return 0;
+
+ default:
+ assert(0 /* CLP misconfiguration: bad option type */);
+
+ }
+
+ return 1;
+}
+
+
+static void
+switch_to_short_argument(Clp_Parser *clp)
+{
+ Clp_Internal *cli = clp->internal;
+ const char *text = cli->argv[0];
+ int option_class = cli->option_class[ (unsigned char)text[0] ];
+ cli->is_short = 1;
+ cli->whole_negated = (option_class & Clp_ShortNegated ? 1 : 0);
+ set_option_text(cli, cli->argv[0], 1);
+ assert(cli->could_be_short);
+}
+
+
+static Clp_Option *
+find_long(Clp_Parser *clp, const char *arg)
+ /* If arg corresponds to one of clp's options, finds that option &
+ returns it. If any argument is given after an = sign in arg, sets
+ clp->have_arg = 1 and clp->arg to that argument. Sets cli->ambiguous
+ to 1 iff there was no match because the argument was ambiguous. */
+{
+ Clp_Internal *cli = clp->internal;
+ int value, len, min_match;
+ Clp_Option *opt = cli->opt;
+ int first_negative_ambiguous;
+
+ /* Look for a normal option. */
+ value = find_prefix_opt
+ (arg, cli->nopt, opt, cli->long_min_match,
+ &cli->ambiguous, cli->ambiguous_values, clp->negated);
+ if (value >= 0)
+ goto worked;
+
+ /* If we can't find it, look for a negated option. */
+ /* I know this is silly, but it makes me happy to accept
+ --no-no-option as a double negative synonym for --option. :) */
+ first_negative_ambiguous = cli->ambiguous;
+ while (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-') {
+ arg += 3;
+ clp->negated = !clp->negated;
+ value = find_prefix_opt
+ (arg, cli->nopt, opt, cli->long_min_match,
+ &cli->ambiguous, cli->ambiguous_values, clp->negated);
+ if (value >= 0)
+ goto worked;
+ }
+
+ /* No valid option was found; return 0. Mark the ambiguous values found
+ through '--no' by making them negative. */
+ {
+ int i, max = cli->ambiguous;
+ if (max > MAX_AMBIGUOUS_VALUES) max = MAX_AMBIGUOUS_VALUES;
+ for (i = first_negative_ambiguous; i < max; i++)
+ cli->ambiguous_values[i] = -cli->ambiguous_values[i] - 1;
+ }
+ return 0;
+
+ worked:
+ min_match = (clp->negated ? cli->long_min_match[value].neg : cli->long_min_match[value].pos);
+ len = argcmp(opt[value].long_name, arg, min_match, 1); /* XXX 1? */
+ assert(len > 0);
+ if (arg[len] == '=') {
+ clp->have_arg = 1;
+ clp->arg = arg + len + 1;
+ }
+ return &opt[value];
+}
+
+
+static Clp_Option *
+find_short(Clp_Parser *clp, int short_name)
+ /* If short_name corresponds to one of clp's options, returns it. */
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_Option *opt = cli->opt;
+ int i;
+
+ for (i = 0; i < cli->nopt; i++)
+ if (opt[i].short_name == short_name
+ && (clp->negated
+ ? TEST(&opt[i], Clp_Negate)
+ : !TEST(&opt[i], Clp_OnlyNegated)))
+ return &opt[i];
+
+ return 0;
+}
+
+
+int
+Clp_Next(Clp_Parser *clp)
+ /* Gets and parses the next argument from the argument list.
+
+ If there are no more arguments, returns Clp_Done.
+ If the next argument isn't an option, returns Clp_NotOption;
+ the argument is stored in clp->arg.
+ If the next argument is an option, returns that option's option_id.
+
+ If the next argument is an unrecognizable or ambiguous option,
+ an error message is given and Clp_BadOption is returned.
+
+ If an option has an argument, that argument is stored in clp->arg
+ and clp->have_arg is set to 1.
+ Furthermore, that argument's parsed value (according to its type)
+ is stored in the clp->val union.
+
+ If an option needs an argument but isn't given one;
+ if it doesn't need an argument but IS given one;
+ or if the argument is the wrong type,
+ an error message is given and Clp_BadOption is returned. */
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_Option *opt;
+ Clp_ParserState clpsave;
+ int complain;
+
+ /** Set up clp **/
+ cli->current_option = 0;
+ cli->ambiguous = 0;
+
+ /** Get the next argument or option **/
+ if (!next_argument(clp, cli->option_processing ? 0 : 2))
+ return clp->have_arg ? Clp_NotOption : Clp_Done;
+
+ clp->negated = cli->whole_negated;
+ if (cli->is_short)
+ opt = find_short(clp, cli->text[0]);
+ else
+ opt = find_long(clp, cli->text);
+
+ /** If there's ambiguity between long & short options, and we couldn't
+ find a long option, look for a short option **/
+ if (!opt && cli->could_be_short) {
+ switch_to_short_argument(clp);
+ opt = find_short(clp, cli->text[0]);
+ }
+
+ /** If we didn't find an option... **/
+ if (!opt || (clp->negated && !TEST(opt, Clp_Negate))) {
+
+ /* default processing for the "--" option: turn off option processing
+ and return the next argument */
+ if (strcmp(cli->argv[0], "--") == 0) {
+ Clp_SetOptionProcessing(clp, 0);
+ return Clp_Next(clp);
+ }
+
+ /* otherwise, report some error or other */
+ if (cli->ambiguous)
+ ambiguity_error(clp, cli->ambiguous, cli->ambiguous_values,
+ cli->opt, cli->option_chars,
+ "option '%s%s' is ambiguous",
+ cli->option_chars, cli->text);
+ else if (cli->is_short && !cli->could_be_short)
+ Clp_OptionError(clp, "unrecognized option '%s%c'",
+ cli->option_chars, cli->text[0]);
+ else
+ Clp_OptionError(clp, "unrecognized option '%s%s'",
+ cli->option_chars, cli->text);
+ return Clp_BadOption;
+ }
+
+ /** Set the current option **/
+ cli->current_option = opt;
+ cli->current_short = cli->is_short;
+ cli->negated_by_no = clp->negated && !cli->whole_negated;
+
+ /** The no-argument (or should-have-no-argument) case **/
+ if (clp->negated || !TEST(opt, Clp_AnyArgument)) {
+ if (clp->have_arg) {
+ Clp_OptionError(clp, "'%O' can't take an argument");
+ return Clp_BadOption;
+ } else
+ return opt->option_id;
+ }
+
+ /** Get an argument if we need one, or if it's optional **/
+ /* Sanity-check the argument type. */
+ if (opt->arg_type <= 0 || opt->arg_type >= cli->nargtype
+ || cli->argtype[ opt->arg_type ].func == 0)
+ return Clp_Error;
+
+ /* complain == 1 only if the argument was explicitly given,
+ or it is mandatory. */
+ complain = (clp->have_arg != 0) || TEST(opt, Clp_Mandatory);
+ Clp_SaveParser(clp, &clpsave);
+
+ if (TEST(opt, Clp_Mandatory) && !clp->have_arg) {
+ /* Mandatory argument case */
+ /* Allow arguments to options to start with a dash, but only if the
+ argument type allows it by not setting Clp_DisallowOptions */
+ int disallow = TEST(&cli->argtype[opt->arg_type], Clp_DisallowOptions);
+ next_argument(clp, disallow ? 1 : 2);
+ if (!clp->have_arg) {
+ int got_option = cli->text != 0;
+ Clp_RestoreParser(clp, &clpsave);
+ if (got_option)
+ Clp_OptionError(clp, "'%O' requires a non-option argument");
+ else
+ Clp_OptionError(clp, "'%O' requires an argument");
+ return Clp_BadOption;
+ }
+
+ } else if (cli->is_short && !clp->have_arg && cli->text[1] != 0)
+ /* The -[option]argument case:
+ Assume that the rest of the current string is the argument. */
+ next_argument(clp, 1);
+
+ /** Parse the argument **/
+ if (clp->have_arg) {
+ Clp_ArgType *atr = &cli->argtype[ opt->arg_type ];
+ if (atr->func(clp, clp->arg, complain, atr->thunk) <= 0) {
+ /* parser failed */
+ clp->have_arg = 0;
+ if (TEST(opt, Clp_Mandatory))
+ return Clp_BadOption;
+ else
+ Clp_RestoreParser(clp, &clpsave);
+ }
+ }
+
+ return opt->option_id;
+}
+
+
+const char *
+Clp_Shift(Clp_Parser *clp, int allow_dashes)
+ /* Returns the next argument from the argument list without parsing it.
+ If there are no more arguments, returns 0. */
+{
+ Clp_ParserState clpsave;
+ Clp_SaveParser(clp, &clpsave);
+ next_argument(clp, allow_dashes ? 2 : 1);
+ if (!clp->have_arg)
+ Clp_RestoreParser(clp, &clpsave);
+ return clp->arg;
+}
+
+
+/*******
+ * Clp_OptionError
+ **/
+
+typedef struct Clp_BuildString {
+ char *text;
+ char *pos;
+ int capacity;
+ int bad;
+} Clp_BuildString;
+
+static Clp_BuildString *
+new_build_string(void)
+{
+ Clp_BuildString *bs = (Clp_BuildString *)malloc(sizeof(Clp_BuildString));
+ if (!bs) goto bad;
+ bs->text = (char *)malloc(256);
+ if (!bs->text) goto bad;
+ bs->pos = bs->text;
+ bs->capacity = 256;
+ bs->bad = 0;
+ return bs;
+
+ bad:
+ if (bs) free(bs);
+ return 0;
+}
+
+static void
+free_build_string(Clp_BuildString *bs)
+{
+ if (bs) free(bs->text);
+ free(bs);
+}
+
+static int
+grow_build_string(Clp_BuildString *bs, int want)
+{
+ char *new_text;
+ int ipos = bs->pos - bs->text;
+ int new_capacity = bs->capacity;
+ while (want >= new_capacity)
+ new_capacity *= 2;
+ new_text = (char *)realloc(bs->text, new_capacity);
+ if (!new_text) {
+ bs->bad = 1;
+ return 0;
+ } else {
+ bs->text = new_text;
+ bs->pos = bs->text + ipos;
+ bs->capacity = new_capacity;
+ return 1;
+ }
+}
+
+#define ENSURE_BUILD_STRING(bs, space) \
+ ((((bs)->pos - (bs)->text) + (space) >= (bs)->capacity) \
+ || grow_build_string((bs), ((bs)->pos - (bs)->text) + (space)))
+
+static void
+append_build_string(Clp_BuildString *bs, const char *s, int l)
+{
+ if (l < 0)
+ l = strlen(s);
+ if (ENSURE_BUILD_STRING(bs, l)) {
+ memcpy(bs->pos, s, l);
+ bs->pos += l;
+ }
+}
+
+
+static Clp_BuildString *
+Clp_VaOptionError(Clp_Parser *clp, Clp_BuildString *bs,
+ const char *fmt, va_list val)
+ /* Reports an error for parser clp. Allowable % format characters are:
+
+ s Print a string from the argument list.
+ c Print an int from the argument list as a character.
+ d Print an int from the argument list.
+ O Print the name of the current option;
+ take nothing from the argument list.
+
+ No field specifications or flags are allowed. Always returns 0. */
+{
+ Clp_Internal *cli = clp->internal;
+ const char *percent;
+
+ if (!bs)
+ bs = new_build_string();
+ if (!bs)
+ return 0;
+ append_build_string(bs, cli->program_name, -1);
+ append_build_string(bs, ": ", 2);
+
+ for (percent = strchr(fmt, '%'); percent; percent = strchr(fmt, '%')) {
+ append_build_string(bs, fmt, percent - fmt);
+ switch (*++percent) {
+
+ case 's': {
+ char *s = va_arg(val, char *);
+ if (s) append_build_string(bs, s, -1);
+ else append_build_string(bs, "(null)", 6);
+ break;
+ }
+
+ case 'c': {
+ int c = va_arg(val, int);
+ if (ENSURE_BUILD_STRING(bs, 4)) {
+ if (c >= 32 && c <= 126)
+ *bs->pos++ = c;
+ else if (c < 32) {
+ *bs->pos++ = '^';
+ *bs->pos++ = c + 64;
+ } else {
+ sprintf(bs->pos, "\\%03o", c);
+ bs->pos += 4;
+ }
+ }
+ break;
+ }
+
+ case 'd': {
+ int d = va_arg(val, int);
+ if (ENSURE_BUILD_STRING(bs, 32)) {
+ sprintf(bs->pos, "%d", d);
+ bs->pos = strchr(bs->pos, 0);
+ }
+ break;
+ }
+
+ case 'O': {
+ Clp_Option *opt = cli->current_option;
+ if (!opt)
+ append_build_string(bs, "(no current option!)", -1);
+ else if (cli->current_short) {
+ append_build_string(bs, cli->option_chars, -1);
+ if (ENSURE_BUILD_STRING(bs, 1))
+ *bs->pos++ = opt->short_name;
+ } else if (cli->negated_by_no) {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, "no-", 3);
+ append_build_string(bs, opt->long_name, -1);
+ } else {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, opt->long_name, -1);
+ }
+ break;
+ }
+
+ case '%':
+ if (ENSURE_BUILD_STRING(bs, 1))
+ *bs->pos++ = '%';
+ break;
+
+ default:
+ if (ENSURE_BUILD_STRING(bs, 2)) {
+ *bs->pos++ = '%';
+ *bs->pos++ = *percent;
+ }
+ break;
+
+ }
+ fmt = ++percent;
+ }
+
+ append_build_string(bs, fmt, -1);
+ append_build_string(bs, "\n", 1);
+
+ return bs;
+}
+
+static void
+do_error(Clp_Parser *clp, Clp_BuildString *bs)
+{
+ const char *text;
+ if (bs && !bs->bad) {
+ *bs->pos = 0;
+ text = bs->text;
+ } else
+ text = "out of memory\n";
+
+ if (clp->internal->error_handler != 0)
+ (*clp->internal->error_handler)(text);
+ else
+ fputs(text, stderr);
+}
+
+int
+Clp_OptionError(Clp_Parser *clp, const char *fmt, ...)
+{
+ Clp_BuildString *bs;
+ va_list val;
+ va_start(val, fmt);
+ bs = Clp_VaOptionError(clp, 0, fmt, val);
+ va_end(val);
+ do_error(clp, bs);
+ free_build_string(bs);
+ return 0;
+}
+
+static int
+ambiguity_error(Clp_Parser *clp, int ambiguous, int *ambiguous_values,
+ Clp_Option *opt, const char *prefix,
+ const char *fmt, ...)
+{
+ Clp_BuildString *bs;
+ int i;
+ va_list val;
+ va_start(val, fmt);
+ bs = Clp_VaOptionError(clp, 0, fmt, val);
+ if (!bs) goto done;
+
+ append_build_string(bs, clp->internal->program_name, -1);
+ append_build_string(bs, ": (Possibilities are", -1);
+
+ for (i = 0; i < ambiguous && i < MAX_AMBIGUOUS_VALUES; i++) {
+ int value = ambiguous_values[i];
+ const char *no_dash = "";
+ if (value < 0)
+ value = -(value + 1), no_dash = "no-";
+ if (i == 0)
+ append_build_string(bs, " ", 1);
+ else if (i == ambiguous - 1)
+ append_build_string(bs, (i == 1 ? " and " : ", and "), -1);
+ else
+ append_build_string(bs, ", ", 2);
+ append_build_string(bs, prefix, -1);
+ append_build_string(bs, no_dash, -1);
+ append_build_string(bs, opt[value].long_name, -1);
+ }
+
+ if (ambiguous > MAX_AMBIGUOUS_VALUES)
+ append_build_string(bs, ", and others", -1);
+ append_build_string(bs, ".)\n", -1);
+ va_end(val);
+
+ done:
+ do_error(clp, bs);
+ free_build_string(bs);
+ return 0;
+}
+
+static int
+copy_string(char *buf, int buflen, int bufpos, const char *what)
+{
+ int l = strlen(what);
+ if (l > buflen - bufpos - 1)
+ l = buflen - bufpos - 1;
+ memcpy(buf + bufpos, what, l);
+ return l;
+}
+
+int
+Clp_CurOptionNameBuf(Clp_Parser *clp, char *buf, int buflen)
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_Option *opt = cli->current_option;
+ int pos = 0;
+ if (!opt)
+ pos += copy_string(buf, buflen, pos, "(no current option!)");
+ else if (cli->current_short) {
+ pos += copy_string(buf, buflen, pos, cli->option_chars);
+ if (pos < buflen - 1)
+ buf[pos++] = opt->short_name;
+ } else if (cli->negated_by_no) {
+ pos += copy_string(buf, buflen, pos, cli->option_chars);
+ pos += copy_string(buf, buflen, pos, "no-");
+ pos += copy_string(buf, buflen, pos, opt->long_name);
+ } else {
+ pos += copy_string(buf, buflen, pos, cli->option_chars);
+ pos += copy_string(buf, buflen, pos, opt->long_name);
+ }
+ buf[pos] = 0;
+ return pos;
+}
+
+const char *
+Clp_CurOptionName(Clp_Parser *clp)
+{
+ static char buf[256];
+ Clp_CurOptionNameBuf(clp, buf, 256);
+ return buf;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/t1utils/config.guess b/Build/source/utils/t1utils/config.guess
new file mode 100755
index 00000000000..d0d57f6945f
--- /dev/null
+++ b/Build/source/utils/t1utils/config.guess
@@ -0,0 +1,1465 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-09-19'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/utils/t1utils/config.h.in b/Build/source/utils/t1utils/config.h.in
new file mode 100644
index 00000000000..7a04a625314
--- /dev/null
+++ b/Build/source/utils/t1utils/config.h.in
@@ -0,0 +1,98 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+#ifndef T1UTILS_CONFIG_H
+#define T1UTILS_CONFIG_H
+
+/* Define if intXX_t types are not available. */
+#undef HAVE_FAKE_INT_TYPES
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have u_intXX_t types but not uintXX_t types. */
+#undef HAVE_U_INT_TYPES
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of a `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of a `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+#include <lcdf/inttypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype strerror if we don't have it. */
+#if !HAVE_STRERROR
+char *strerror(int errno);
+#endif
+
+#ifdef __cplusplus
+}
+/* Get rid of a possible inline macro under C++. */
+# define inline inline
+#endif
+
+#endif /* T1UTILS_CONFIG_H */
diff --git a/Build/source/utils/t1utils/config.sub b/Build/source/utils/t1utils/config.sub
new file mode 100755
index 00000000000..1c366dfde9a
--- /dev/null
+++ b/Build/source/utils/t1utils/config.sub
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | ms1 \
+ | msp430 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | ms1-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/utils/t1utils/configure b/Build/source/utils/t1utils/configure
new file mode 100755
index 00000000000..bcbcc1e33ff
--- /dev/null
+++ b/Build/source/utils/t1utils/configure
@@ -0,0 +1,6751 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="t1ascii.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE LIBOBJS CPP EGREP build build_cpu build_vendor build_os host host_cpu host_vendor host_os LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-warnings compile with -Wall
+ --enable-multiplatform put executables in bin/PLATFORM
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=t1utils
+ VERSION=1.32
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+ ac_config_headers="$ac_config_headers config.h"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+# Check whether --enable-warnings or --disable-warnings was given.
+if test "${enable_warnings+set}" = set; then
+ enableval="$enable_warnings"
+ if test "$enableval" = yes ; then
+ CFLAGS="$CFLAGS -W -Wall"
+fi
+fi;
+
+
+
+
+for ac_func in strerror
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case $LIBOBJS in
+ "$ac_func.$ac_objext" | \
+ *" $ac_func.$ac_objext" | \
+ "$ac_func.$ac_objext "* | \
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
+esac
+
+fi
+done
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in inttypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_inttypes_h=yes
+else
+ have_inttypes_h=no
+fi
+
+done
+
+
+for ac_header in sys/types.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_sys_types_h=yes
+else
+ have_sys_types_h=no
+fi
+
+done
+
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ echo "$as_me:$LINENO: checking for uintXX_t typedefs" >&5
+echo $ECHO_N "checking for uintXX_t typedefs... $ECHO_C" >&6
+if test "${ac_cv_uint_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ ac_cv_uint_t=yes
+else
+ ac_cv_uint_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_uint_t" >&5
+echo "${ECHO_T}$ac_cv_uint_t" >&6
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ echo "$as_me:$LINENO: checking for u_intXX_t typedefs" >&5
+echo $ECHO_N "checking for u_intXX_t typedefs... $ECHO_C" >&6
+if test "${ac_cv_u_int_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ ac_cv_u_int_t=yes
+else
+ ac_cv_u_int_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_u_int_t" >&5
+echo "${ECHO_T}$ac_cv_u_int_t" >&6
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_U_INT_TYPES 1
+_ACEOF
+
+else
+ { echo "$as_me:$LINENO: WARNING:
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming \"short\" has 16 bits and \"int\" has 32 bits.
+
+=========================================" >&5
+echo "$as_me: WARNING:
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming \"short\" has 16 bits and \"int\" has 32 bits.
+
+=========================================" >&2;}
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_FAKE_INT_TYPES 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for uintptr_t" >&5
+echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
+if test "${ac_cv_type_uintptr_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+
+int
+main ()
+{
+if ((uintptr_t *) 0)
+ return 0;
+if (sizeof (uintptr_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_uintptr_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uintptr_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
+if test $ac_cv_type_uintptr_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINTPTR_T 1
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking for void *" >&5
+echo $ECHO_N "checking for void *... $ECHO_C" >&6
+if test "${ac_cv_type_void_p+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((void * *) 0)
+ return 0;
+if (sizeof (void *))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_void_p=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_void_p=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5
+echo "${ECHO_T}$ac_cv_type_void_p" >&6
+
+echo "$as_me:$LINENO: checking size of void *" >&5
+echo $ECHO_N "checking size of void *... $ECHO_C" >&6
+if test "${ac_cv_sizeof_void_p+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_void_p" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_void_p=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (void *)); }
+unsigned long ulongval () { return (long) (sizeof (void *)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (void *))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (void *))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (void *))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_void_p=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (void *), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_void_p=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5
+echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned long" >&5
+echo $ECHO_N "checking for unsigned long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned long *) 0)
+ return 0;
+if (sizeof (unsigned long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned long" >&5
+echo $ECHO_N "checking size of unsigned long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned long)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned int" >&5
+echo $ECHO_N "checking for unsigned int... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned int *) 0)
+ return 0;
+if (sizeof (unsigned int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_int=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_int" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned int" >&5
+echo $ECHO_N "checking size of unsigned int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned_int" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned int)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned int)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned int))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned int))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned int))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+
+
+# For teTeX and TeX Live.
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+# Check whether --enable-multiplatform or --disable-multiplatform was given.
+if test "${enable_multiplatform+set}" = set; then
+ enableval="$enable_multiplatform"
+
+fi;
+test "x$enable_multiplatform" = xyes \
+ && test "x$bindir" = 'x${exec_prefix}/bin' \
+ && bindir="$bindir/$host"
+
+ ac_config_files="$ac_config_files Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@CPP@,$CPP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Build/source/utils/t1utils/configure.in b/Build/source/utils/t1utils/configure.in
new file mode 100644
index 00000000000..9e9fee3907c
--- /dev/null
+++ b/Build/source/utils/t1utils/configure.in
@@ -0,0 +1,110 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(t1ascii.c)
+AM_INIT_AUTOMAKE(t1utils, 1.32)
+AM_CONFIG_HEADER(config.h)
+
+AC_PROG_CC
+AC_C_CONST
+
+AC_ARG_ENABLE(warnings,
+[ --enable-warnings compile with -Wall],
+if test "$enableval" = yes ; then
+ CFLAGS="$CFLAGS -W -Wall"
+fi)
+
+
+dnl
+dnl strerror()?
+dnl
+
+AC_REPLACE_FUNCS(strerror)
+
+
+dnl
+dnl integer types
+dnl
+
+AC_CHECK_HEADERS(inttypes.h, have_inttypes_h=yes, have_inttypes_h=no)
+AC_CHECK_HEADERS(sys/types.h, have_sys_types_h=yes, have_sys_types_h=no)
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ AC_CACHE_CHECK([for uintXX_t typedefs], ac_cv_uint_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_uint_t=yes, ac_cv_uint_t=no)])
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ AC_CACHE_CHECK([for u_intXX_t typedefs], ac_cv_u_int_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_u_int_t=yes, ac_cv_u_int_t=no)])
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+ AC_DEFINE(HAVE_U_INT_TYPES, 1, [Define if you have u_intXX_t types but not uintXX_t types.])
+else
+ AC_MSG_WARN([
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming "short" has 16 bits and "int" has 32 bits.
+
+=========================================])
+ AC_DEFINE(HAVE_FAKE_INT_TYPES, 1, [Define if intXX_t types are not available.])
+fi
+
+AC_CHECK_TYPES(uintptr_t, [], [],
+[#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+])
+
+AC_CHECK_SIZEOF(void *)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned int)
+
+
+dnl
+dnl verbatim portions of the header
+dnl
+
+AH_TOP([#ifndef T1UTILS_CONFIG_H
+#define T1UTILS_CONFIG_H])
+
+AH_BOTTOM([#include <lcdf/inttypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype strerror if we don't have it. */
+#if !HAVE_STRERROR
+char *strerror(int errno);
+#endif
+
+#ifdef __cplusplus
+}
+/* Get rid of a possible inline macro under C++. */
+# define inline inline
+#endif
+
+#endif /* T1UTILS_CONFIG_H */])
+
+
+dnl
+dnl Output
+dnl
+
+# For teTeX and TeX Live.
+AC_CANONICAL_HOST
+AC_ARG_ENABLE(multiplatform,
+ [ --enable-multiplatform put executables in bin/PLATFORM])
+test "x$enable_multiplatform" = xyes \
+ && test "x$bindir" = 'x${exec_prefix}/bin' \
+ && bindir="$bindir/$host"
+
+AC_OUTPUT(Makefile)
diff --git a/Build/source/utils/t1utils/depcomp b/Build/source/utils/t1utils/depcomp
new file mode 100644
index 00000000000..9e5522d045f
--- /dev/null
+++ b/Build/source/utils/t1utils/depcomp
@@ -0,0 +1,520 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2003-11-08.23
+
+# Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit 0
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit 0
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+if test -z "$depfile"; then
+ base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
+ dir=`echo "$object" | sed 's,/.*$,/,'`
+ if test "$dir" = "$object"; then
+ dir=
+ fi
+ # FIXME: should be _deps on DOS.
+ depfile="$dir.deps/$base"
+fi
+
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ tmpdepfile1="$dir.libs/$base.lo.d"
+ tmpdepfile2="$dir.libs/$base.d"
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1="$dir$base.o.d"
+ tmpdepfile2="$dir$base.d"
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ else
+ tmpdepfile="$tmpdepfile2"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/t1utils/include/lcdf/clp.h b/Build/source/utils/t1utils/include/lcdf/clp.h
new file mode 100644
index 00000000000..89ba63861a6
--- /dev/null
+++ b/Build/source/utils/t1utils/include/lcdf/clp.h
@@ -0,0 +1,153 @@
+/* -*- related-file-name: "../../liblcdf/clp.c" -*- */
+#ifndef LCDF_CLP_H
+#define LCDF_CLP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* clp.h - Public interface to CLP.
+ * This file is part of CLP, the command line parser package.
+ *
+ * Copyright (c) 1997-2003 Eddie Kohler, kohler@icir.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file, which is available in full at
+ * http://www.pdos.lcs.mit.edu/click/license.html. The conditions include: you
+ * must preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding. */
+
+
+/* Argument types */
+#define Clp_NoArg 0
+#define Clp_ArgString 1
+#define Clp_ArgStringNotOption 2
+#define Clp_ArgBool 3
+#define Clp_ArgInt 4
+#define Clp_ArgUnsigned 5
+#define Clp_ArgDouble 6
+
+#define Clp_FirstUserType 10
+
+/* Argument type flags */
+#define Clp_DisallowOptions (1<<0) /* Argument won't resemble an option */
+
+/* Flags for individual Clp_Options */
+#define Clp_Mandatory (1<<0) /* Has mandatory argument */
+#define Clp_Optional (1<<1) /* Has optional argument */
+#define Clp_Negate (1<<2) /* Allow --no-OPT */
+#define Clp_OnlyNegated (1<<3) /* Allow --no-OPT, but not --OPT */
+#define Clp_PreferredMatch (1<<4) /* Prefer --OPT to --OPTwhatever when
+ matching option prefixes */
+
+/* Option types for Clp_SetOptionChar */
+/* Clp_NotOption 0 */
+#define Clp_Short (1<<0)
+#define Clp_Long (1<<1)
+#define Clp_ShortNegated (1<<2)
+#define Clp_LongNegated (1<<3)
+#define Clp_LongImplicit (1<<4)
+
+/* Flags for Clp_AddStringListType */
+#define Clp_AllowNumbers (1<<0)
+
+/* Return values from Clp_Next */
+#define Clp_NotOption 0
+#define Clp_Done -1
+#define Clp_BadOption -2
+#define Clp_Error -3
+
+/* Sizes of clp->val */
+#define Clp_ValSize 40
+#define Clp_ValIntSize 10
+
+
+typedef struct Clp_Option Clp_Option;
+typedef struct Clp_Parser Clp_Parser;
+typedef struct Clp_Internal Clp_Internal;
+typedef struct Clp_ParserState Clp_ParserState;
+
+typedef int (*Clp_ArgParseFunc)(Clp_Parser *, const char *, int, void *);
+typedef void (*Clp_ErrorHandler)(const char *);
+
+
+struct Clp_Option {
+
+ const char *long_name;
+ int short_name;
+
+ int option_id;
+
+ int arg_type;
+ int flags;
+
+};
+
+
+struct Clp_Parser {
+
+ int negated;
+
+ int have_arg;
+ const char *arg;
+
+ union {
+ int i;
+ unsigned u;
+ double d;
+ const char *s;
+ void *pv;
+#ifdef HAVE_INT64_TYPES
+ int64_t i64;
+ uint64_t u64;
+#endif
+ char cs[Clp_ValSize];
+ unsigned char ucs[Clp_ValSize];
+ int is[Clp_ValIntSize];
+ unsigned us[Clp_ValIntSize];
+ } val;
+
+ Clp_Internal *internal;
+
+};
+
+
+Clp_Parser * Clp_NewParser(int argc, const char * const *argv,
+ int nopt, Clp_Option *opt);
+void Clp_DeleteParser(Clp_Parser *);
+
+Clp_ErrorHandler Clp_SetErrorHandler(Clp_Parser *, Clp_ErrorHandler);
+int Clp_SetOptionChar(Clp_Parser *, int c, int option_type);
+
+int Clp_AddType
+ (Clp_Parser *, int type_id, int flags,
+ Clp_ArgParseFunc func, void *user_data);
+int Clp_AddStringListType
+ (Clp_Parser *, int type_id, int flags, ...);
+int Clp_AddStringListTypeVec
+ (Clp_Parser *, int type_id, int flags,
+ int n, char **str, int *val);
+
+const char * Clp_ProgramName(Clp_Parser *);
+
+int Clp_Next(Clp_Parser *);
+const char * Clp_Shift(Clp_Parser *, int allow_dashes);
+int Clp_SetOptionProcessing(Clp_Parser *, int option_processing);
+
+Clp_ParserState *Clp_NewParserState(void);
+void Clp_DeleteParserState(Clp_ParserState *);
+void Clp_SaveParser(Clp_Parser *, Clp_ParserState *);
+void Clp_RestoreParser(Clp_Parser *, Clp_ParserState *);
+
+int Clp_OptionError(Clp_Parser *, const char *, ...);
+int Clp_CurOptionNameBuf(Clp_Parser *, char *buf, int buflen);
+const char * Clp_CurOptionName(Clp_Parser *); /* uses static memory */
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/utils/t1utils/include/lcdf/inttypes.h b/Build/source/utils/t1utils/include/lcdf/inttypes.h
new file mode 100644
index 00000000000..b88e9e9faf0
--- /dev/null
+++ b/Build/source/utils/t1utils/include/lcdf/inttypes.h
@@ -0,0 +1,34 @@
+#ifndef LCDF_INTTYPES_H
+#define LCDF_INTTYPES_H
+/* Define known-width integer types. */
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#elif defined(HAVE_SYS_TYPES_H)
+# include <sys/types.h>
+# ifdef HAVE_U_INT_TYPES
+typedef u_int8_t uint8_t;
+typedef u_int16_t uint16_t;
+typedef u_int32_t uint32_t;
+# endif
+#endif
+
+#ifdef HAVE_FAKE_INT_TYPES
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef signed short int16_t;
+typedef unsigned short uint16_t;
+typedef signed int int32_t;
+typedef unsigned int uint32_t;
+#endif
+
+#ifndef HAVE_UINTPTR_T
+# if SIZEOF_VOID_P == SIZEOF_UNSIGNED_INT
+typedef unsigned int uintptr_t;
+# elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG
+typedef unsigned long uintptr_t;
+# endif
+#endif
+
+/* Note: Windows compilers call these types '[un]signed __int8', etc. */
+#endif
diff --git a/Build/source/utils/t1utils/install-sh b/Build/source/utils/t1utils/install-sh
new file mode 100755
index 00000000000..f5061e7e269
--- /dev/null
+++ b/Build/source/utils/t1utils/install-sh
@@ -0,0 +1,295 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2003-09-24.23
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=
+transform_arg=
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+
+usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
+ or: $0 -d DIR1 DIR2...
+
+In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
+In the second, create the directory path DIR.
+
+Options:
+-b=TRANSFORMBASENAME
+-c copy source (using $cpprog) instead of moving (using $mvprog).
+-d create directories instead of installing files.
+-g GROUP $chgrp installed files to GROUP.
+-m MODE $chmod installed files to MODE.
+-o USER $chown installed files to USER.
+-s strip installed files (using $stripprog).
+-t=TRANSFORM
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ -c) instcmd=$cpprog
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit 0;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit 0;;
+
+ *) if test -z "$src"; then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if test -z "$src"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+fi
+
+# Protect names starting with `-'.
+case $src in
+ -*) src=./$src ;;
+esac
+
+if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ instcmd=:
+ chmodcmd=
+ else
+ instcmd=$mkdirprog
+ fi
+else
+ # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ dst=$dst/`basename "$src"`
+ fi
+fi
+
+# This sed command emulates the dirname command.
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+
+# Skip lots of stat calls in the usual case.
+if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ test -d "$pathcomp" || $mkdirprog "$pathcomp"
+ pathcomp=$pathcomp/
+ done
+fi
+
+if test -n "$dir_arg"; then
+ $doit $instcmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+else
+ # If we're going to rename the final executable, determine the name now.
+ if test -z "$transformarg"; then
+ dstfile=`basename "$dst"`
+ else
+ dstfile=`basename "$dst" $transformbasename \
+ | sed $transformarg`$transformbasename
+ fi
+
+ # don't allow the sed command to completely eliminate the filename.
+ test -z "$dstfile" && dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Move or copy the file name to the temp name
+ $doit $instcmd "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $instcmd $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now remove or move aside any old file at destination location. We
+ # try this two ways since rm can't unlink itself on some systems and
+ # the destination file might be busy for other reasons. In this case,
+ # the final cleanup might fail but the new file should still install
+ # successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/t1utils/missing b/Build/source/utils/t1utils/missing
new file mode 100755
index 00000000000..e7ef83a1c25
--- /dev/null
+++ b/Build/source/utils/t1utils/missing
@@ -0,0 +1,360 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2003-09-02.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+ # We have makeinfo, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/t1utils/mkinstalldirs b/Build/source/utils/t1utils/mkinstalldirs
new file mode 100755
index 00000000000..d2d5f21b611
--- /dev/null
+++ b/Build/source/utils/t1utils/mkinstalldirs
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage" 1>&2
+ exit 0
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+case $dirmode in
+ '')
+ if mkdir -p -- . 2>/dev/null; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ fi
+ ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here
diff --git a/Build/source/utils/t1utils/strerror.c b/Build/source/utils/t1utils/strerror.c
new file mode 100644
index 00000000000..b47f24ed2f8
--- /dev/null
+++ b/Build/source/utils/t1utils/strerror.c
@@ -0,0 +1,25 @@
+/* Some operating systems don't have strerror.
+ This file provides a definition which David Mazieres <dm@lcs.mit.edu>
+ assures me works. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char *
+strerror(int errno)
+{
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+ if (errno < 0 || errno >= sys_nerr)
+ return (char *)"bad error number";
+ else
+ return sys_errlist[errno];
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/t1utils/t1ascii.1 b/Build/source/utils/t1utils/t1ascii.1
new file mode 100644
index 00000000000..0ae4d3eed57
--- /dev/null
+++ b/Build/source/utils/t1utils/t1ascii.1
@@ -0,0 +1,51 @@
+.ds V 1.32
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.TH T1ASCII 1 "" "Version \*V"
+.SH NAME
+t1ascii \- convert PostScript Type 1 font from binary to ASCII
+.SH SYNOPSIS
+.B t1ascii
+\%[\fB\-l\fR \fIlength\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.BR t1ascii
+converts Adobe Type 1 font programs in PFB (binary) format to PFA
+(hexadecimal) format. If the file
+.I output
+is not specified output goes to the standard output.
+If the file
+.I input
+is not specified input comes from the standard input.
+'
+.SH OPTIONS
+.TP 5
+.BI \-\-line\-length= "num\fR, " \-l " num"
+Set the maximum length of encrypted lines in the output to
+.I num.
+(These are the lines consisting wholly of hexadecimal digits.) The default
+is 64.
+'
+.TP 5
+.BR \-\-warnings ", " \-w
+Warn when the input font contains lines longer than 255 characters.
+Long lines don't strictly conform to Adobe's Document Structuring
+Conventions, and may cause problems with older software.
+'
+.SH "SEE ALSO"
+.LP
+.M t1binary 1 ,
+.M t1unmac 1 ,
+.M t1mac 1 ,
+.M t1asm 1 ,
+.M t1disasm 1
+.LP
+.I "Adobe Type 1 Font Format"
+.SH AUTHORS
+Lee Hetherington (ilh@lcs.mit.edu)
+.br
+Eddie Kohler (kohler@icir.org)
+.PP
+Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+Kai-Uwe Herbing (herbing@netmbx.netmbx.de).
diff --git a/Build/source/utils/t1utils/t1ascii.c b/Build/source/utils/t1utils/t1ascii.c
new file mode 100644
index 00000000000..bc3995f9255
--- /dev/null
+++ b/Build/source/utils/t1utils/t1ascii.c
@@ -0,0 +1,306 @@
+/* t1ascii
+ *
+ * This program takes an Adobe Type-1 font program in binary (PFB) format and
+ * converts it to ASCII (PFA) format.
+ *
+ * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact.
+ *
+ * I. Lee Hetherington (ilh@lcs.mit.edu)
+ *
+ * 1.5 and later versions contain changes by, and are maintained by,
+ * Eddie Kohler <kohler@icir.org>.
+ *
+ * New change log in `NEWS'. Old change log:
+ *
+ * Revision 1.2 92/06/23 10:58:43 ilh
+ * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)
+ * incoporated.
+ *
+ * Revision 1.1 92/05/22 11:47:24 ilh
+ * initial version
+ *
+ * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+ * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
+ * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
+ * ... #endif, where _MSDOS is an identifier, which is automatically
+ * defined, if you compile with the Microsoft C/C++ Compiler.
+ *
+ */
+
+/* Note: this is ANSI C. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <lcdf/clp.h>
+#include "t1lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static FILE *ofp;
+static int line_length = 64;
+
+
+/*****
+ * Command line
+ **/
+
+#define OUTPUT_OPT 301
+#define VERSION_OPT 302
+#define HELP_OPT 303
+#define LINE_LEN_OPT 304
+#define WARNINGS_OPT 305
+
+static Clp_Option options[] = {
+ { "help", 0, HELP_OPT, 0, 0 },
+ { "line-length", 'l', LINE_LEN_OPT, Clp_ArgInt, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+ { "warnings", 'w', WARNINGS_OPT, 0, Clp_Negate }
+};
+static const char *program_name;
+static const char *ifp_filename = "<stdin>";
+static int line_length_warning = -1;
+
+void
+fatal_error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+ exit(1);
+}
+
+void
+error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+}
+
+void
+short_usage(void)
+{
+ fprintf(stderr, "Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+Try `%s --help' for more information.\n",
+ program_name, program_name);
+}
+
+void
+usage(void)
+{
+ printf("\
+`T1ascii' translates a PostScript Type 1 font from compact binary (PFB) to\n\
+ASCII (PFA) format. The result is written to the standard output unless an\n\
+OUTPUT file is given.\n\
+\n\
+Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+\n\
+Options:\n\
+ -l, --line-length=NUM Set max encrypted line length (default 64).\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -w, --warnings Warn on too-long lines.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and warranty and exit.\n\
+\n\
+Report bugs to <kohler@icir.org>.\n", program_name);
+}
+
+
+/*****
+ * PFA font_reader functions
+ **/
+
+static int hexcol = 0;
+
+static void
+pfa_output_ascii(char *data, int len)
+{
+ if (hexcol) {
+ putc('\n', ofp);
+ hexcol = 0;
+ }
+ if (line_length_warning == 0 && len > 256) {
+ line_length_warning = 1;
+ fprintf(stderr, "%s: warning: %s has lines longer than 255 characters\n%s: (This may cause problems with older printers.)\n", program_name, ifp_filename, program_name);
+ }
+ fputs(data, ofp);
+ if (len && data[len - 1] != '\n') {
+ int p = len - 2;
+ while (p > 0 && data[p] != '\n')
+ p--;
+ hexcol = (p ? len - p - 1 : hexcol + len);
+ }
+}
+
+static void
+pfa_output_binary(unsigned char *data, int len)
+{
+ static const char *hexchar = "0123456789abcdef";
+ for (; len > 0; len--, data++) {
+ /* trim hexadecimal lines to line_length columns */
+ if (hexcol >= line_length) {
+ putc('\n', ofp);
+ hexcol = 0;
+ }
+ putc(hexchar[(*data >> 4) & 0xf], ofp);
+ putc(hexchar[*data & 0xf], ofp);
+ hexcol += 2;
+ }
+}
+
+static void
+pfa_output_end()
+{
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/*****
+ * main()
+ **/
+
+int
+main(int argc, char *argv[])
+{
+ struct font_reader fr;
+ int c;
+ FILE *ifp = 0;
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ /* interpret command line arguments using CLP */
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case LINE_LEN_OPT:
+ line_length = clp->val.i;
+ if (line_length < 8) {
+ line_length = 8;
+ error("warning: line length raised to %d", line_length);
+ } else if (line_length > 1024) {
+ line_length = 1024;
+ error("warning: line length lowered to %d", line_length);
+ }
+ break;
+
+ output_file:
+ case OUTPUT_OPT:
+ if (ofp)
+ fatal_error("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ ofp = stdout;
+ else {
+ ofp = fopen(clp->arg, "w");
+ if (!ofp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case WARNINGS_OPT:
+ line_length_warning = (clp->negated ? -1 : 0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("t1ascii (LCDF t1utils) %s\n", VERSION);
+ printf("Copyright (C) 1992-2003 I. Lee Hetherington, Eddie Kohler et al.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (ifp && ofp)
+ fatal_error("too many arguments");
+ else if (ifp)
+ goto output_file;
+ if (strcmp(clp->arg, "-") == 0) {
+ ifp_filename = "<stdin>";
+ ifp = stdin;
+ } else {
+ ifp_filename = clp->arg;
+ ifp = fopen(clp->arg, "rb");
+ if (!ifp)
+ fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ short_usage();
+ exit(1);
+ break;
+
+ }
+ }
+
+ done:
+ if (!ifp)
+ ifp = stdin;
+ if (!ofp)
+ ofp = stdout;
+ if (line_length > 255 && line_length_warning == 0)
+ fprintf(stderr, "%s: warning: selected --line-length is greater than 255\n", program_name);
+
+#if defined(_MSDOS) || defined(_WIN32)
+ /* As we are processing a PFB (binary) input */
+ /* file, we must set its file mode to binary. */
+ _setmode(_fileno(ifp), _O_BINARY);
+#endif
+
+ /* prepare font reader */
+ fr.output_ascii = pfa_output_ascii;
+ fr.output_binary = pfa_output_binary;
+ fr.output_end = pfa_output_end;
+
+ /* peek at first byte to see if it is the PFB marker 0x80 */
+ c = getc(ifp);
+ ungetc(c, ifp);
+
+ /* do the file */
+ if (c == PFB_MARKER)
+ process_pfb(ifp, ifp_filename, &fr);
+ else if (c == '%')
+ process_pfa(ifp, ifp_filename, &fr);
+ else
+ fatal_error("%s does not start with font marker (`%%' or 0x80)", ifp_filename);
+
+ fclose(ifp);
+ fclose(ofp);
+ return 0;
+}
diff --git a/Build/source/utils/t1utils/t1asm.1 b/Build/source/utils/t1utils/t1asm.1
new file mode 100644
index 00000000000..59d4db5e790
--- /dev/null
+++ b/Build/source/utils/t1utils/t1asm.1
@@ -0,0 +1,96 @@
+.ds V 1.32
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.TH T1ASM 1 "" "Version \*V"
+.SH NAME
+t1asm \- assemble PostScript Type 1 font
+.SH SYNOPSIS
+.B t1asm
+\%[\fB\-a\fR|\fB\-b\fR]
+\%[\fB\-l\fR \fIlength\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.B t1asm
+assembles Adobe Type 1 font programs into either PFA (hexadecimal) or PFB
+(binary) formats from a human-readable form. If the file
+.I output
+is not specified output goes to the standard output. If the file
+.I input
+is not specified input comes from the standard input.
+
+.B t1asm
+tokenizes the charstring data and performs eexec and charstring encryption
+as specified in the ``black book,''
+.I "Adobe Type 1 Font Format."
+
+The input must have a line of the form
+.RS
+.nf
+.ft B
+/-|{string currentfile exch readstring pop}executeonly def
+.ft R
+.fi
+.RE
+which defines the command, in this case `\-|', that is to start charstring
+data. It is an error not to define such a command. Another common name for
+this command is `RD'.
+
+After the start of the
+.B Subrs
+array in the input, all open braces `{' not in a comment begin a
+charstring. Such a charstring is terminated by the next non-comment close
+brace `}'. Within such a charstring, only comments, integers, and valid
+charstring commands are allowed. Valid charstring command names can be
+found in
+.I "Adobe Type 1 Font Format"
+and other documents describing the newer Type 2 opcodes. The format within
+a charstring is unimportant as long as integers and commands are separated
+by at least a one whitespace (space, tab, newline) character. Note that
+within charstrings, comments are discarded because they cannot be encoded.
+.SH OPTIONS
+.TP 5
+.BR \-\-pfa ", " \-a
+Output in PFA (ASCII) format.
+.TP 5
+.BR \-\-pfb ", " \-b
+Output in PFB (binary) format. This is the default.
+.TP
+.BI \-\-block\-length= "num\fR, " \-l " num"
+PFB only: Set the maximum output block length to
+.I num.
+The default length is as large as memory allows.
+.TP
+.BI \-\-line\-length= "num\fR, " \-l " num"
+PFA only: Set the maximum length of encrypted lines in the output to
+.I num.
+(These are the lines consisting wholly of hexadecimal digits.) The default
+is 64.
+.SH EXAMPLES
+.LP
+.nf
+% t1asm Utopia-Regular.raw > Utopia-Regular.pfb
+% t1asm -a Utopia-Regular.raw > Utopia-Regular.pfa
+.fi
+.SH "SEE ALSO"
+.LP
+.M t1disasm 1 ,
+.M t1ascii 1 ,
+.M t1binary 1 ,
+.M t1unmac 1 ,
+.M t1mac 1
+.LP
+.I "Adobe Type 1 Font Format"
+is available free from Adobe as a PDF file.
+http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF
+.LP
+.I "The Type 2 Charstring Format,"
+also available from Adobe as a PDF file, describes the newer Type 2
+operators, which are also used in some multiple-master Type 1 fonts like
+Adobe Jenson and Kepler.
+http://partners.adobe.com/asn/developer/PDFS/TN/5177.Type2.pdf
+'
+.SH AUTHORS
+Lee Hetherington (ilh@lcs.mit.edu)
+.br
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/t1utils/t1asm.c b/Build/source/utils/t1utils/t1asm.c
new file mode 100644
index 00000000000..ac4783c7530
--- /dev/null
+++ b/Build/source/utils/t1utils/t1asm.c
@@ -0,0 +1,812 @@
+/* t1asm -*- c-basic-offset: 2 -*-
+ *
+ * This program `assembles' Adobe Type-1 font programs in pseudo-PostScript
+ * form into either PFB or PFA format. The human readable/editable input is
+ * charstring- and eexec-encrypted as specified in the `Adobe Type 1 Font
+ * Format' version 1.1 (the `black book'). There is a companion program,
+ * t1disasm, which `disassembles' PFB and PFA files into a pseudo-PostScript
+ * file.
+ *
+ * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact.
+ *
+ * I. Lee Hetherington (ilh@lcs.mit.edu)
+ *
+ * 1.5 and later versions contain changes by, and are maintained by,
+ * Eddie Kohler <kohler@icir.org>.
+ *
+ * New change log in `NEWS'. Old change log:
+ *
+ * Revision 1.4 92/07/10 10:53:09 ilh
+ * Added support for additional PostScript after the closefile command
+ * (ie., some fonts have {restore}if after the cleartomark).
+ *
+ * Revision 1.3 92/06/23 10:58:25 ilh
+ * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)
+ * incoporated.
+ *
+ * Revision 1.2 92/05/22 11:54:45 ilh
+ * Fixed bug where integers larger than 32000 could not be encoded in
+ * charstrings. Now integer range is correct for four-byte
+ * twos-complement integers: -(1<<31) <= i <= (1<<31)-1. Bug detected by
+ * Piet Tutelaers (rcpt@urc.tue.nl).
+ *
+ * Revision 1.1 92/05/22 11:48:46 ilh
+ * initial version
+ *
+ * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+ * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
+ * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
+ * ... #endif, where _MSDOS is an identifier, which is automatically
+ * defined, if you compile with the Microsoft C/C++ Compiler.
+ *
+ */
+
+/* Note: this is ANSI C. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <lcdf/clp.h>
+#include "t1lib.h"
+
+#define LINESIZE 512
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned char byte;
+
+static FILE *ifp;
+static FILE *ofp;
+static struct pfb_writer w;
+static int blocklen = -1;
+
+/* flags */
+static int pfb = 1;
+static int active = 0;
+static int ever_active = 0;
+static int start_charstring = 0;
+static int in_eexec = 0;
+
+/* need to add 1 as space for \0 */
+static char line[LINESIZE + 1];
+
+/* lenIV and charstring start command */
+static int lenIV = 4;
+static char cs_start[10];
+
+/* for charstring buffering */
+static byte charstring_buf[65535];
+static byte *charstring_bp;
+
+/* decryption stuff */
+static uint16_t er, cr;
+static uint16_t c1 = 52845, c2 = 22719;
+
+/* table of charstring commands */
+static struct command {
+ const char *name;
+ int one, two;
+} command_table[] = {
+ { "abs", 12, 9 }, /* Type 2 */
+ { "add", 12, 10 }, /* Type 2 */
+ { "and", 12, 3 }, /* Type 2 */
+ { "blend", 16, -1 }, /* Type 2 */
+ { "callgsubr", 29, -1 }, /* Type 2 */
+ { "callothersubr", 12, 16 }, /* Type 1 ONLY */
+ { "callsubr", 10, -1 },
+ { "closepath", 9, -1 }, /* Type 1 ONLY */
+ { "cntrmask", 20, -1 }, /* Type 2 */
+ { "div", 12, 12 },
+ { "dotsection", 12, 0 }, /* Type 1 ONLY */
+ { "drop", 12, 18 }, /* Type 2 */
+ { "dup", 12, 27 }, /* Type 2 */
+ { "endchar", 14, -1 },
+ { "eq", 12, 15 }, /* Type 2 */
+ { "error", 0, -1 }, /* special */
+ { "escape", 12, -1 }, /* special */
+ { "exch", 12, 28 }, /* Type 2 */
+ { "flex", 12, 35 }, /* Type 2 */
+ { "flex1", 12, 37 }, /* Type 2 */
+ { "get", 12, 21 }, /* Type 2 */
+ { "hflex", 12, 34 }, /* Type 2 */
+ { "hflex1", 12, 36 }, /* Type 2 */
+ { "hhcurveto", 27, -1 }, /* Type 2 */
+ { "hintmask", 19, -1 }, /* Type 2 */
+ { "hlineto", 6, -1 },
+ { "hmoveto", 22, -1 },
+ { "hsbw", 13, -1 }, /* Type 1 ONLY */
+ { "hstem", 1, -1 },
+ { "hstem3", 12, 2 }, /* Type 1 ONLY */
+ { "hstemhm", 18, -1 }, /* Type 2 */
+ { "hvcurveto", 31, -1 },
+ { "ifelse", 12, 22 }, /* Type 2 */
+ { "index", 12, 29 }, /* Type 2 */
+ { "load", 12, 13 }, /* Type 2 */
+ { "mul", 12, 24 }, /* Type 2 */
+ { "neg", 12, 14 }, /* Type 2 */
+ { "not", 12, 5 }, /* Type 2 */
+ { "or", 12, 4 }, /* Type 2 */
+ { "pop", 12, 17 }, /* Type 1 ONLY */
+ { "put", 12, 20 }, /* Type 2 */
+ { "random", 12, 23 }, /* Type 2 */
+ { "rcurveline", 24, -1 }, /* Type 2 */
+ { "return", 11, -1 },
+ { "rlinecurve", 25, -1 }, /* Type 2 */
+ { "rlineto", 5, -1 },
+ { "rmoveto", 21, -1 },
+ { "roll", 12, 30 }, /* Type 2 */
+ { "rrcurveto", 8, -1 },
+ { "sbw", 12, 7 }, /* Type 1 ONLY */
+ { "seac", 12, 6 }, /* Type 1 ONLY */
+ { "setcurrentpoint", 12, 33 }, /* Type 1 ONLY */
+ { "sqrt", 12, 26 }, /* Type 2 */
+ { "store", 12, 8 }, /* Type 2 */
+ { "sub", 12, 11 }, /* Type 2 */
+ { "vhcurveto", 30, -1 },
+ { "vlineto", 7, -1 },
+ { "vmoveto", 4, -1 },
+ { "vstem", 3, -1 },
+ { "vstem3", 12, 1 }, /* Type 1 ONLY */
+ { "vstemhm", 23, -1 }, /* Type 2 */
+ { "vvcurveto", 26, -1 }, /* Type 2 */
+}; /* alphabetical */
+
+/* Two separate encryption functions because eexec and charstring encryption
+ must proceed in parallel. */
+
+static byte eencrypt(byte plain)
+{
+ byte cipher;
+
+ cipher = (byte)(plain ^ (er >> 8));
+ er = (uint16_t)((cipher + er) * c1 + c2);
+ return cipher;
+}
+
+static byte cencrypt(byte plain)
+{
+ byte cipher;
+
+ /* Thanks to Tom Kacvinsky <tjk@ams.org> who reported that lenIV == -1 means
+ unencrypted charstrings. */
+ if (lenIV < 0) return plain;
+
+ cipher = (byte)(plain ^ (cr >> 8));
+ cr = (uint16_t)((cipher + cr) * c1 + c2);
+ return cipher;
+}
+
+/* This function outputs a single byte. If output is in PFB format then output
+ is buffered through blockbuf[]. If output is in PFA format, then output
+ will be hexadecimal if in_eexec is set, ASCII otherwise. */
+
+static void output_byte(byte b)
+{
+ static const char *hexchar = "0123456789abcdef";
+ static int hexcol = 0;
+
+ if (pfb) {
+ /* PFB */
+ PFB_OUTPUT_BYTE(&w, b);
+ } else {
+ /* PFA */
+ if (in_eexec) {
+ /* trim hexadecimal lines to `blocklen' columns */
+ if (hexcol >= blocklen) {
+ putc('\n', ofp);
+ hexcol = 0;
+ }
+ putc(hexchar[(b >> 4) & 0xf], ofp);
+ putc(hexchar[b & 0xf], ofp);
+ hexcol += 2;
+ } else {
+ putc(b, ofp);
+ }
+ }
+}
+
+/* This function outputs a byte through possible eexec encryption. */
+
+static void eexec_byte(byte b)
+{
+ if (in_eexec)
+ output_byte(eencrypt(b));
+ else
+ output_byte(b);
+}
+
+/* This function outputs a null-terminated string through possible eexec
+ encryption. */
+
+static void eexec_string(const char *string)
+{
+ while (*string)
+ eexec_byte(*string++);
+}
+
+/* This function gets ready for the eexec-encrypted data. If output is in
+ PFB format then flush current ASCII block and get ready for binary block.
+ We start encryption with four random (zero) bytes. */
+
+static void eexec_start(char *string)
+{
+ eexec_string("currentfile eexec\n");
+ if (pfb && w.blocktyp != PFB_BINARY) {
+ pfb_writer_output_block(&w);
+ w.blocktyp = PFB_BINARY;
+ }
+
+ in_eexec = 1;
+ er = 55665;
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_string(string);
+}
+
+/* 25.Aug.1999 -- Return 1 if this line actually looks like the start of a
+ charstring. We use the heuristic that it should start with `/' (a name) or
+ `dup' (a subroutine). Previous heuristic caused killa bad output. */
+
+static int check_line_charstring()
+{
+ char *p = line;
+ while (isspace(*p))
+ p++;
+ return (*p == '/' || (p[0] == 'd' && p[1] == 'u' && p[2] == 'p'));
+}
+
+/* This function returns an input line of characters. A line is terminated by
+ length (including terminating null) greater than LINESIZE, \r, \n, \r\n, or
+ when active (looking for charstrings) by '{'. When terminated by a newline
+ the newline is put into line[]. When terminated by '{', the '{' is not put
+ into line[], and the flag start_charstring is set to 1. */
+
+static void getline()
+{
+ int c;
+ char *p = line;
+ int comment = 0;
+ start_charstring = 0;
+
+ while (p < line + LINESIZE) {
+ c = getc(ifp);
+
+ if (c == EOF)
+ break;
+ else if (c == '%')
+ comment = 1;
+ else if (active && !comment && c == '{') {
+ /* 25.Aug.1999 -- new check for whether we should stop be active */
+ if (check_line_charstring()) {
+ start_charstring = 1;
+ break;
+ } else
+ active = 0;
+ }
+
+ *p++ = (char) c;
+
+ /* end of line processing: change CR or CRLF into LF, and exit */
+ if (c == '\r') {
+ c = getc(ifp);
+ if (c != '\n')
+ ungetc(c, ifp);
+ p[-1] = '\n';
+ break;
+ } else if (c == '\n')
+ break;
+ }
+
+ *p = '\0';
+}
+
+/* This function wraps-up the eexec-encrypted data and writes ASCII trailer.
+ If output is in PFB format then this entails flushing binary block and
+ starting an ASCII block. */
+
+static void eexec_end(void)
+{
+ int i, j;
+
+ if (!pfb)
+ putc('\n', ofp);
+ else if (w.blocktyp != PFB_ASCII) {
+ pfb_writer_output_block(&w);
+ w.blocktyp = PFB_ASCII;
+ }
+
+ in_eexec = active = 0;
+
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 64; j++)
+ eexec_byte('0');
+ eexec_byte('\n');
+ }
+}
+
+/* This function is used by the binary search, bsearch(), for command names in
+ the command table. */
+
+static int command_compare(const void *key, const void *item)
+{
+ return strcmp((const char *) key, ((const struct command *) item)->name);
+}
+
+/* This function returns 1 if the string is an integer and 0 otherwise. */
+
+static int is_integer(char *string)
+{
+ if (isdigit(string[0]) || string[0] == '-' || string[0] == '+') {
+ while (*++string && isdigit(*string))
+ ; /* deliberately empty */
+ if (!*string)
+ return 1;
+ }
+ return 0;
+}
+
+/* This function initializes charstring encryption. Note that this is called
+ at the beginning of every charstring. */
+
+static void charstring_start()
+{
+ int i;
+
+ charstring_bp = charstring_buf;
+ cr = 4330;
+ for (i = 0; i < lenIV; i++)
+ *charstring_bp++ = cencrypt((byte) 0);
+}
+
+/* This function encrypts and buffers a single byte of charstring data. */
+
+static void charstring_byte(int v)
+{
+ byte b = (byte)(v & 0xff);
+ if (charstring_bp - charstring_buf > (int)sizeof(charstring_buf))
+ fatal_error("charstring buffer overflow");
+ *charstring_bp++ = cencrypt(b);
+}
+
+/* This function outputs buffered, encrypted charstring data through possible
+ eexec encryption. */
+
+static void charstring_end()
+{
+ byte *bp;
+
+ sprintf(line, "%d ", (int) (charstring_bp - charstring_buf));
+ eexec_string(line);
+ sprintf(line, "%s ", cs_start);
+ eexec_string(line);
+ for (bp = charstring_buf; bp < charstring_bp; bp++)
+ eexec_byte(*bp);
+}
+
+/* This function generates the charstring representation of an integer. */
+
+static void charstring_int(int num)
+{
+ int x;
+
+ if (num >= -107 && num <= 107) {
+ charstring_byte(num + 139);
+ } else if (num >= 108 && num <= 1131) {
+ x = num - 108;
+ charstring_byte(x / 256 + 247);
+ charstring_byte(x % 256);
+ } else if (num >= -1131 && num <= -108) {
+ x = abs(num) - 108;
+ charstring_byte(x / 256 + 251);
+ charstring_byte(x % 256);
+ } else if (num >= (-2147483647-1) && num <= 2147483647) {
+ charstring_byte(255);
+ charstring_byte(num >> 24);
+ charstring_byte(num >> 16);
+ charstring_byte(num >> 8);
+ charstring_byte(num);
+ } else {
+ error("can't format huge number `%d'", num);
+ /* output 0 instead */
+ charstring_byte(139);
+ }
+}
+
+/* This function returns one charstring token. It ignores comments. */
+
+static void get_charstring_token()
+{
+ int c = getc(ifp);
+ while (isspace(c))
+ c = getc(ifp);
+
+ if (c == '%') {
+ while (c != EOF && c != '\r' && c != '\n')
+ c = getc(ifp);
+ get_charstring_token();
+
+ } else if (c == '}') {
+ line[0] = '}';
+ line[1] = 0;
+
+ } else {
+ char *p = line;
+ while (p < line + LINESIZE) {
+ *p++ = c;
+ c = getc(ifp);
+ if (c == EOF || isspace(c) || c == '%' || c == '}') {
+ ungetc(c, ifp);
+ break;
+ }
+ }
+ *p = 0;
+ }
+}
+
+
+/* This function parses an entire charstring into integers and commands,
+ outputting bytes through the charstring buffer. */
+
+static void parse_charstring()
+{
+ struct command *cp;
+
+ charstring_start();
+ while (!feof(ifp)) {
+ get_charstring_token();
+ if (line[0] == '}')
+ break;
+ if (is_integer(line)) {
+ charstring_int(atoi(line));
+ } else {
+ int one;
+ int two;
+ int ok = 0;
+
+ cp = (struct command *)
+ bsearch((void *) line, (void *) command_table,
+ sizeof(command_table) / sizeof(struct command),
+ sizeof(struct command),
+ command_compare);
+
+ if (cp) {
+ one = cp->one;
+ two = cp->two;
+ ok = 1;
+
+ } else if (strncmp(line, "escape_", 7) == 0) {
+ /* Parse the `escape' keyword requested by Lee Chun-Yu and Werner
+ Lemberg */
+ one = 12;
+ if (sscanf(line + 7, "%d", &two) == 1)
+ ok = 1;
+
+ } else if (strncmp(line, "UNKNOWN_", 8) == 0) {
+ /* Allow unanticipated UNKNOWN commands. */
+ one = 12;
+ if (sscanf(line + 8, "12_%d", &two) == 1)
+ ok = 1;
+ else if (sscanf(line + 8, "%d", &one) == 1) {
+ two = -1;
+ ok = 1;
+ }
+ }
+
+ if (!ok)
+ error("unknown charstring command `%s'", line);
+ else if (one < 0 || one > 255)
+ error("bad charstring command number `%d'", one);
+ else if (two > 255)
+ error("bad charstring command number `%d'", two);
+ else if (two < 0)
+ charstring_byte(one);
+ else {
+ charstring_byte(one);
+ charstring_byte(two);
+ }
+ }
+ }
+ charstring_end();
+}
+
+
+/*****
+ * Command line
+ **/
+
+#define BLOCK_LEN_OPT 300
+#define OUTPUT_OPT 301
+#define VERSION_OPT 302
+#define HELP_OPT 303
+#define PFB_OPT 304
+#define PFA_OPT 305
+
+static Clp_Option options[] = {
+ { "block-length", 'l', BLOCK_LEN_OPT, Clp_ArgInt, 0 },
+ { "help", 0, HELP_OPT, 0, 0 },
+ { "line-length", 0, BLOCK_LEN_OPT, Clp_ArgInt, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+static const char *program_name;
+
+void
+fatal_error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+ exit(1);
+}
+
+void
+error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+}
+
+void
+short_usage(void)
+{
+ fprintf(stderr, "Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+Try `%s --help' for more information.\n",
+ program_name, program_name);
+}
+
+void
+usage(void)
+{
+ printf("\
+`T1asm' translates a human-readable version of a PostScript Type 1 font into\n\
+standard PFB or PFA format. The result is written to the standard output\n\
+unless an OUTPUT file is given.\n\
+\n\
+Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+\n\
+Options:\n\
+ -a, --pfa Output font in ASCII (PFA) format.\n\
+ -b, --pfb Output font in binary (PFB) format. This is\n\
+ the default.\n\
+ -l, --block-length NUM Set max block length for PFB output.\n\
+ -l, --line-length NUM Set max encrypted line length for PFA output.\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and warranty and exit.\n\
+\n\
+Report bugs to <kohler@icir.org>.\n", program_name);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+int main(int argc, char *argv[])
+{
+ char *p, *q, *r;
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ /* interpret command line arguments using CLP */
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case BLOCK_LEN_OPT:
+ blocklen = clp->val.i;
+ break;
+
+ output_file:
+ case OUTPUT_OPT:
+ if (ofp)
+ fatal_error("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ ofp = stdout;
+ else {
+ ofp = fopen(clp->arg, "w");
+ if (!ofp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case PFB_OPT:
+ pfb = 1;
+ break;
+
+ case PFA_OPT:
+ pfb = 0;
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("t1asm (LCDF t1utils) %s\n", VERSION);
+ printf("Copyright (C) 1992-2003 I. Lee Hetherington, Eddie Kohler et al.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (ifp && ofp)
+ fatal_error("too many arguments");
+ else if (ifp)
+ goto output_file;
+ if (strcmp(clp->arg, "-") == 0)
+ ifp = stdin;
+ else {
+ ifp = fopen(clp->arg, "r");
+ if (!ifp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ short_usage();
+ exit(1);
+ break;
+
+ }
+ }
+
+ done:
+ if (!pfb) {
+ if (blocklen == -1)
+ blocklen = 64;
+ else if (blocklen < 8) {
+ blocklen = 8;
+ error("warning: line length raised to %d", blocklen);
+ } else if (blocklen > 1024) {
+ blocklen = 1024;
+ error("warning: line length lowered to %d", blocklen);
+ }
+ }
+
+ if (!ifp) ifp = stdin;
+ if (!ofp) ofp = stdout;
+
+ if (pfb)
+ init_pfb_writer(&w, blocklen, ofp);
+
+#if defined(_MSDOS) || defined(_WIN32)
+ /* If we are processing a PFB (binary) output */
+ /* file, we must set its file mode to binary. */
+ if (pfb)
+ _setmode(_fileno(ofp), _O_BINARY);
+#endif
+
+ /* Finally, we loop until no more input. Some special things to look for are
+ the `currentfile eexec' line, the beginning of the `/Subrs' or
+ `/CharStrings' definition, the definition of `/lenIV', and the definition
+ of the charstring start command which has `...string currentfile...' in
+ it.
+
+ Being careful: Check with `/Subrs' and `/CharStrings' to see that a
+ number follows the token -- otherwise, the token is probably nested in a
+ subroutine a la Adobe Jenson, and we shouldn't pay attention to it.
+
+ Bugs: Occurrence of `/Subrs 9' in a comment will fool t1asm.
+
+ Thanks to Tom Kacvinsky <tjk@ams.org> who reported that some fonts come
+ without /Subrs sections and provided a patch. */
+
+ while (!feof(ifp) && !ferror(ifp)) {
+ getline();
+
+ if (!ever_active) {
+ if (strncmp(line, "currentfile eexec", 17) == 0 && isspace(line[17])) {
+ /* Allow arbitrary whitespace after "currentfile eexec".
+ Thanks to Tom Kacvinsky <tjk@ams.org> for reporting this.
+ Note: strlen("currentfile eexec") == 17. */
+ for (p = line + 18; isspace(*p); p++)
+ ;
+ eexec_start(p);
+ continue;
+ } else if (strncmp(line, "/lenIV", 6) == 0) {
+ lenIV = atoi(line + 6);
+ } else if ((p = strstr(line, "string currentfile"))
+ && strstr(line, "readstring")) { /* enforce `readstring' */
+ /* locate the name of the charstring start command */
+ *p = '\0'; /* damage line[] */
+ q = strrchr(line, '/');
+ if (q) {
+ r = cs_start;
+ ++q;
+ while (!isspace(*q) && *q != '{')
+ *r++ = *q++;
+ *r = '\0';
+ }
+ *p = 's'; /* repair line[] */
+ }
+ }
+
+ if (!active) {
+ if ((p = strstr(line, "/Subrs")) && isdigit(p[7]))
+ ever_active = active = 1;
+ else if ((p = strstr(line, "/CharStrings")) && isdigit(p[13]))
+ ever_active = active = 1;
+ }
+ if ((p = strstr(line, "currentfile closefile"))) {
+ /* 2/14/99 -- happy Valentine's day! -- don't look for `mark
+ currentfile closefile'; the `mark' might be on a different line */
+ /* 1/3/2002 -- happy new year! -- Luc Devroye reports a failure with
+ some printers when `currentfile closefile' is followed by space */
+ p += sizeof("currentfile closefile") - 1;
+ for (q = p; isspace(*q) && *q != '\n'; q++)
+ /* nada */;
+ if (q == p && !*q)
+ error("warning: `currentfile closefile' line too long");
+ else if (q != p) {
+ if (*q != '\n')
+ error("text after `currentfile closefile' ignored");
+ *p++ = '\n';
+ *p++ = '\0';
+ }
+ eexec_string(line);
+ break;
+ }
+
+ eexec_string(line);
+
+ /* output line data */
+ if (start_charstring) {
+ if (!cs_start[0])
+ fatal_error("couldn't find charstring start command");
+ parse_charstring();
+ }
+ }
+
+ /* Handle remaining PostScript after the eexec section */
+ if (in_eexec)
+ eexec_end();
+
+ /* There may be additional code. */
+ while (!feof(ifp) && !ferror(ifp)) {
+ getline();
+ eexec_string(line);
+ }
+
+ if (pfb)
+ pfb_writer_end(&w);
+
+ /* the end! */
+ if (!ever_active)
+ error("warning: no charstrings found in input file");
+ fclose(ifp);
+ fclose(ofp);
+ return 0;
+}
diff --git a/Build/source/utils/t1utils/t1binary.1 b/Build/source/utils/t1utils/t1binary.1
new file mode 100644
index 00000000000..fc41bcacc87
--- /dev/null
+++ b/Build/source/utils/t1utils/t1binary.1
@@ -0,0 +1,42 @@
+.ds V 1.32
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.TH T1BINARY 1 "" "Version \*V"
+.SH NAME
+t1binary \- convert PostScript Type 1 font from ASCII to binary
+.SH SYNOPSIS
+.B t1binary
+\%[\fB\-l\fR \fIlength\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.B t1binary
+converts Adobe Type 1 font programs in PFA (hexadecimal) format to PFB
+(binary) format. If the file
+.I output
+is not specified output goes to the standard output.
+If the file
+.I input
+is not specified input comes from the standard input.
+.SH OPTIONS
+.TP 5
+.BI \-\-block\-length= "length\fR, " \-l " length"
+Set the maximum length of sections in PFB output to
+.I length.
+The default length is as large as memory allows.
+.SH "SEE ALSO"
+.LP
+.M t1ascii 1 ,
+.M t1unmac 1 ,
+.M t1mac 1 ,
+.M t1disasm 1 ,
+.M t1asm 1
+.LP
+.I "Adobe Type 1 Font Format"
+.SH AUTHORS
+Lee Hetherington (ilh@lcs.mit.edu)
+.br
+Eddie Kohler (kohler@icir.org)
+.PP
+Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+Kai-Uwe Herbing (herbing@netmbx.netmbx.de).
diff --git a/Build/source/utils/t1utils/t1binary.c b/Build/source/utils/t1utils/t1binary.c
new file mode 100644
index 00000000000..b49658b0cba
--- /dev/null
+++ b/Build/source/utils/t1utils/t1binary.c
@@ -0,0 +1,283 @@
+/* t1binary
+ *
+ * This program takes an Adobe Type-1 font program in ASCII (PFA) format and
+ * converts it to binary (PFB) format.
+ *
+ * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact.
+ *
+ * I. Lee Hetherington (ilh@lcs.mit.edu)
+ *
+ * 1.5 and later versions contain changes by, and are maintained by,
+ * Eddie Kohler <kohler@icir.org>.
+ *
+ * New change log in `NEWS'. Old change log:
+ *
+ * Revision 1.2 92/06/23 10:58:08 ilh
+ * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)
+ * incoporated.
+ *
+ * Revision 1.1 92/05/22 11:58:17 ilh
+ * initial version
+ *
+ * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+ * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
+ * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
+ * ... #endif, where _MSDOS is an identifier, which is automatically
+ * defined, if you compile with the Microsoft C/C++ Compiler.
+ *
+ */
+
+/* Note: this is ANSI C. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <lcdf/clp.h>
+#include "t1lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned char byte;
+
+/* for PFB block buffering */
+static struct pfb_writer w;
+
+void fatal_error(const char *message, ...);
+void error(const char *message, ...);
+
+
+/* PFB font_reader functions */
+
+static void
+pfb_output_ascii(char *s, int len)
+{
+ if (w.blocktyp == PFB_BINARY) {
+ pfb_writer_output_block(&w);
+ w.blocktyp = PFB_ASCII;
+ }
+ for (; len > 0; len--, s++)
+ PFB_OUTPUT_BYTE(&w, (byte)*s);
+}
+
+static void
+pfb_output_binary(unsigned char *s, int len)
+{
+ if (w.blocktyp == PFB_ASCII) {
+ pfb_writer_output_block(&w);
+ w.blocktyp = PFB_BINARY;
+ }
+ for (; len > 0; len--, s++)
+ PFB_OUTPUT_BYTE(&w, *s);
+}
+
+static void
+pfb_output_end()
+{
+ pfb_writer_end(&w);
+}
+
+
+/*****
+ * Command line
+ **/
+
+#define BLOCK_LEN_OPT 300
+#define OUTPUT_OPT 301
+#define VERSION_OPT 302
+#define HELP_OPT 303
+
+static Clp_Option options[] = {
+ { "block-length", 'l', BLOCK_LEN_OPT, Clp_ArgInt, 0 },
+ { "help", 0, HELP_OPT, 0, 0 },
+ { "length", 0, BLOCK_LEN_OPT, Clp_ArgInt, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+static const char *program_name;
+
+
+void
+fatal_error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+ exit(1);
+}
+
+void
+error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+}
+
+
+void
+short_usage(void)
+{
+ fprintf(stderr, "Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+Try `%s --help' for more information.\n",
+ program_name, program_name);
+}
+
+
+void
+usage(void)
+{
+ printf("\
+`T1binary' translates a PostScript Type 1 font from ASCII (PFA) to compact\n\
+binary (PFB) format. The result is written to the standard output unless an\n\
+OUTPUT file is given.\n\
+\n\
+Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+\n\
+Options:\n\
+ -l, --block-length=NUM Set max output block length.\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and warranty and exit.\n\
+\n\
+Report bugs to <kohler@icir.org>.\n", program_name);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+int
+main(int argc, char *argv[])
+{
+ int c;
+ FILE *ifp = 0, *ofp = 0;
+ const char *ifp_filename = "<stdin>";
+ struct font_reader fr;
+ int max_blocklen = -1;
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ /* interpret command line arguments using CLP */
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case BLOCK_LEN_OPT:
+ max_blocklen = clp->val.i;
+ if (max_blocklen <= 0) {
+ max_blocklen = 1;
+ error("warning: block length raised to %d", max_blocklen);
+ }
+ break;
+
+ output_file:
+ case OUTPUT_OPT:
+ if (ofp)
+ fatal_error("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ ofp = stdout;
+ else {
+ ofp = fopen(clp->arg, "wb");
+ if (!ofp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("t1binary (LCDF t1utils) %s\n", VERSION);
+ printf("Copyright (C) 1992-2003 I. Lee Hetherington, Eddie Kohler et al.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (ifp && ofp)
+ fatal_error("too many arguments");
+ else if (ifp)
+ goto output_file;
+ if (strcmp(clp->arg, "-") == 0)
+ ifp = stdin;
+ else {
+ ifp_filename = clp->arg;
+ ifp = fopen(clp->arg, "r");
+ if (!ifp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ short_usage();
+ exit(1);
+ break;
+
+ }
+ }
+
+ done:
+ if (!ifp) ifp = stdin;
+ if (!ofp) ofp = stdout;
+
+#if defined(_MSDOS) || defined(_WIN32)
+ /* As we are processing a PFB (binary) output */
+ /* file, we must set its file mode to binary. */
+ _setmode(_fileno(ofp), _O_BINARY);
+#endif
+
+ /* prepare font reader and pfb writer */
+ fr.output_ascii = pfb_output_ascii;
+ fr.output_binary = pfb_output_binary;
+ fr.output_end = pfb_output_end;
+ init_pfb_writer(&w, max_blocklen, ofp);
+
+ /* peek at first byte to see if it is the PFB marker 0x80 */
+ c = getc(ifp);
+ ungetc(c, ifp);
+
+ /* do the file */
+ if (c == PFB_MARKER)
+ process_pfb(ifp, ifp_filename, &fr);
+ else if (c == '%')
+ process_pfa(ifp, ifp_filename, &fr);
+ else
+ fatal_error("%s does not start with font marker (`%%' or 0x80)", ifp_filename);
+
+ fclose(ifp);
+ fclose(ofp);
+
+ if (!w.binary_blocks_written)
+ fatal_error("no binary blocks written! Are you sure this was a font?");
+
+ return 0;
+}
diff --git a/Build/source/utils/t1utils/t1disasm.1 b/Build/source/utils/t1utils/t1disasm.1
new file mode 100644
index 00000000000..381bfb1b607
--- /dev/null
+++ b/Build/source/utils/t1utils/t1disasm.1
@@ -0,0 +1,96 @@
+.ds V 1.32
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.TH T1DISASM 1 "" "Version \*V"
+.SH NAME
+t1disasm \- disassemble PostScript Type 1 font
+.SH SYNOPSIS
+.B t1disasm
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.B t1disasm
+disassembles Adobe Type 1 font programs in either PFA (hexadecimal) or PFB
+(binary) formats into human-readable form. If the file
+.I output
+is not specified output goes to the standard output.
+If the file
+.I input
+is not specified input comes from the standard input.
+
+.B t1disasm
+performs eexec and charstring decryption as specified in the ``black
+book'',
+.I "Adobe Type 1 Font Format."
+Additionally, the charstring binary tokens are expanded into human-readable
+text form, using the names given in the black book and later documents
+describing Type 2 opcodes.
+.SH EXAMPLES
+.LP
+.nf
+% t1disasm Utopia-Regular.pfb Utopia-Regular.raw
+% t1disasm Utopia-Regular.pfa Utopia-Regular.raw
+.fi
+
+In
+.B Subrs
+entries in Utopia-Regular.raw will look like
+.RS
+.nf
+.ft B
+dup 5 {
+ 8 111 vstem
+ -12 128 hstem
+ 707 -20 hstem
+ return
+ } |
+.ft R
+.fi
+.RE
+and the
+.B CharStrings
+entries like
+.RS
+.nf
+.ft B
+/exclam {
+ 58 242 hsbw
+ 6 callsubr
+ 5 4 callsubr
+ 63 707 rmoveto
+ -54 0 -5 -22 4 -45 rrcurveto
+ 40 -431 rlineto
+ 29 hlineto
+ 42 431 rlineto
+ 4 45 -5 22 -55 0 rrcurveto
+ closepath
+ 6 4 callsubr
+ -719 vmoveto
+ 243 callsubr
+ endchar
+ } |-
+.ft R
+.fi
+.RE
+.SH "SEE ALSO"
+.LP
+.M t1asm 1 ,
+.M t1ascii 1 ,
+.M t1binary 1 ,
+.M t1unmac 1 ,
+.M t1mac 1
+.LP
+.I "Adobe Type 1 Font Format"
+is available free from Adobe as a PDF file:
+http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF
+.LP
+.I "The Type 2 Charstring Format,"
+also available from Adobe as a PDF file, describes the newer Type 2
+operators, which are also used in some multiple-master Type 1 fonts like
+Adobe Jenson and Kepler:
+http://partners.adobe.com/asn/developer/PDFS/TN/5177.Type2.pdf
+'
+.SH AUTHORS
+Lee Hetherington (ilh@lcs.mit.edu)
+.br
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/t1utils/t1disasm.c b/Build/source/utils/t1utils/t1disasm.c
new file mode 100644
index 00000000000..21dc659cb01
--- /dev/null
+++ b/Build/source/utils/t1utils/t1disasm.c
@@ -0,0 +1,777 @@
+/* t1disasm
+ *
+ * This program `disassembles' Adobe Type-1 font programs in either PFB or PFA
+ * format. It produces a human readable/editable pseudo-PostScript file by
+ * performing eexec and charstring decryption as specified in the `Adobe Type 1
+ * Font Format' version 1.1 (the `black book'). There is a companion program,
+ * t1asm, which `assembles' such a pseudo-PostScript file into either PFB or
+ * PFA format.
+ *
+ * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact.
+ *
+ * I. Lee Hetherington (ilh@lcs.mit.edu)
+ *
+ * 1.5 and later versions contain changes by, and are maintained by,
+ * Eddie Kohler <kohler@icir.org>.
+ *
+ * New change log in `NEWS'. Old change log:
+ *
+ * Revision 1.4 92/07/10 10:55:08 ilh
+ * Added support for additional PostScript after the closefile command
+ * (ie., some fonts have {restore}if' after the cleartomark). Also,
+ * removed hardwired charstring start command (-| or RD) in favor of
+ * automatically determining it.
+ *
+ * Revision 1.3 92/06/23 10:57:53 ilh
+ * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)
+ * incoporated.
+ *
+ * Revision 1.2 92/05/22 12:05:33 ilh
+ * Fixed bug where we were counting on sprintf to return its first
+ * argument---not true in ANSI C. This bug was detected by Piet
+ * Tutelaers (rcpt@urc.tue.nl). Also, fixed (signed) integer overflow
+ * error when testing high-order bit of integer for possible
+ * sign-extension by making comparison between unsigned integers.
+ *
+ * Revision 1.1 92/05/22 12:04:07 ilh
+ * initial version
+ *
+ * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+ * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
+ * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
+ * ... #endif, where _MSDOS is an identifier, which is automatically
+ * defined, if you compile with the Microsoft C/C++ Compiler.
+ *
+ */
+
+/* Note: this is ANSI C. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <lcdf/clp.h>
+#include "t1lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned char byte;
+
+static FILE *ofp;
+static int lenIV = 4;
+static char cs_start[10];
+static int unknown = 0;
+
+/* decryption stuff */
+static uint16_t c1 = 52845, c2 = 22719;
+static uint16_t cr_default = 4330;
+static uint16_t er_default = 55665;
+
+static int error_count = 0;
+void fatal_error(const char *message, ...);
+void error(const char *message, ...);
+
+/* If the line contains an entry of the form `/lenIV <num>' then set the global
+ lenIV to <num>. This indicates the number of random bytes at the beginning
+ of each charstring. */
+
+static void
+set_lenIV(char *line)
+{
+ char *p = strstr(line, "/lenIV ");
+
+ /* Allow lenIV to be negative. Thanks to Tom Kacvinsky <tjk@ams.org> */
+ if (p && (isdigit(p[7]) || p[7] == '+' || p[7] == '-')) {
+ lenIV = atoi(p + 7);
+ }
+}
+
+static void
+set_cs_start(char *line)
+{
+ char *p, *q, *r;
+
+ if ((p = strstr(line, "string currentfile"))) {
+ /* enforce presence of `readstring' -- 5/29/99 */
+ if (!strstr(line, "readstring"))
+ return;
+ /* locate the name of the charstring start command */
+ *p = '\0'; /* damage line[] */
+ q = strrchr(line, '/');
+ if (q) {
+ r = cs_start;
+ ++q;
+ while (!isspace(*q) && *q != '{')
+ *r++ = *q++;
+ *r = '\0';
+ }
+ *p = 's'; /* repair line[] */
+ }
+}
+
+/* Subroutine to output strings. */
+
+static void
+output(const char *string)
+{
+ fprintf(ofp, "%s", string);
+}
+
+/* Subroutine to neatly format output of charstring tokens. If token = "\n",
+ then a newline is output. If at start of line (start == 1), prefix token
+ with tab, otherwise a space. */
+
+static void
+output_token(const char *token)
+{
+ static int start = 1;
+ if (strcmp(token, "\n") == 0) {
+ fprintf(ofp, "\n");
+ start = 1;
+ } else {
+ fprintf(ofp, "%s%s", start ? "\t" : " ", token);
+ start = 0;
+ }
+}
+
+/* Subroutine to decrypt and ASCII-ify tokens in charstring data. The
+ charstring decryption machinery is fired up, skipping the first lenIV
+ bytes, and the decrypted tokens are expanded into human-readable form. */
+
+static void
+decrypt_charstring(unsigned char *line, int len)
+{
+ int i;
+ int32_t val;
+ char buf[20];
+
+ /* decrypt charstring */
+ if (lenIV >= 0) {
+ /* only decrypt if lenIV >= 0 -- negative lenIV means unencrypted
+ charstring. Thanks to Tom Kacvinsky <tjk@ams.org> */
+ uint16_t cr = cr_default;
+ byte plain;
+ for (i = 0; i < len; i++) {
+ byte cipher = line[i];
+ plain = (byte)(cipher ^ (cr >> 8));
+ cr = (uint16_t)((cipher + cr) * c1 + c2);
+ line[i] = plain;
+ }
+ line += lenIV;
+ len -= lenIV;
+ }
+
+ /* handle each charstring command */
+ for (i = 0; i < len; i++) {
+ byte b = line[i];
+
+ if (b >= 32) {
+ if (b >= 32 && b <= 246)
+ val = b - 139;
+ else if (b >= 247 && b <= 250) {
+ i++;
+ val = (b - 247)*256 + 108 + line[i];
+ } else if (b >= 251 && b <= 254) {
+ i++;
+ val = -(b - 251)*256 - 108 - line[i];
+ } else {
+ val = (line[i+1] & 0xff) << 24;
+ val |= (line[i+2] & 0xff) << 16;
+ val |= (line[i+3] & 0xff) << 8;
+ val |= (line[i+4] & 0xff) << 0;
+ /* in case an int32 is larger than four bytes---sign extend */
+#if INT_MAX > 0x7FFFFFFFUL
+ if (val & 0x80000000)
+ val |= ~0x7FFFFFFF;
+#endif
+ i += 4;
+ }
+ sprintf(buf, "%d", val);
+ output_token(buf);
+
+ } else {
+ switch (b) {
+ case 0: output_token("error"); break; /* special */
+ case 1: output_token("hstem"); break;
+ case 3: output_token("vstem"); break;
+ case 4: output_token("vmoveto"); break;
+ case 5: output_token("rlineto"); break;
+ case 6: output_token("hlineto"); break;
+ case 7: output_token("vlineto"); break;
+ case 8: output_token("rrcurveto"); break;
+ case 9: output_token("closepath"); break; /* Type 1 ONLY */
+ case 10: output_token("callsubr"); break;
+ case 11: output_token("return"); break;
+ case 13: output_token("hsbw"); break; /* Type 1 ONLY */
+ case 14: output_token("endchar"); break;
+ case 16: output_token("blend"); break; /* Type 2 */
+ case 18: output_token("hstemhm"); break; /* Type 2 */
+ case 19: output_token("hintmask"); break; /* Type 2 */
+ case 20: output_token("cntrmask"); break; /* Type 2 */
+ case 21: output_token("rmoveto"); break;
+ case 22: output_token("hmoveto"); break;
+ case 23: output_token("vstemhm"); break; /* Type 2 */
+ case 24: output_token("rcurveline"); break; /* Type 2 */
+ case 25: output_token("rlinecurve"); break; /* Type 2 */
+ case 26: output_token("vvcurveto"); break; /* Type 2 */
+ case 27: output_token("hhcurveto"); break; /* Type 2 */
+ case 28: { /* Type 2 */
+ /* short integer */
+ val = (line[i+1] & 0xff) << 8;
+ val |= (line[i+2] & 0xff);
+ i += 2;
+ if (val & 0x8000)
+ val |= ~0x7FFF;
+ sprintf(buf, "%d", val);
+ output_token(buf);
+ }
+ case 29: output_token("callgsubr"); break; /* Type 2 */
+ case 30: output_token("vhcurveto"); break;
+ case 31: output_token("hvcurveto"); break;
+ case 12:
+ i++;
+ b = line[i];
+ switch (b) {
+ case 0: output_token("dotsection"); break; /* Type 1 ONLY */
+ case 1: output_token("vstem3"); break; /* Type 1 ONLY */
+ case 2: output_token("hstem3"); break; /* Type 1 ONLY */
+ case 3: output_token("and"); break; /* Type 2 */
+ case 4: output_token("or"); break; /* Type 2 */
+ case 5: output_token("not"); break; /* Type 2 */
+ case 6: output_token("seac"); break; /* Type 1 ONLY */
+ case 7: output_token("sbw"); break; /* Type 1 ONLY */
+ case 8: output_token("store"); break; /* Type 2 */
+ case 9: output_token("abs"); break; /* Type 2 */
+ case 10: output_token("add"); break; /* Type 2 */
+ case 11: output_token("sub"); break; /* Type 2 */
+ case 12: output_token("div"); break;
+ case 13: output_token("load"); break; /* Type 2 */
+ case 14: output_token("neg"); break; /* Type 2 */
+ case 15: output_token("eq"); break; /* Type 2 */
+ case 16: output_token("callothersubr"); break; /* Type 1 ONLY */
+ case 17: output_token("pop"); break; /* Type 1 ONLY */
+ case 18: output_token("drop"); break; /* Type 2 */
+ case 20: output_token("put"); break; /* Type 2 */
+ case 21: output_token("get"); break; /* Type 2 */
+ case 22: output_token("ifelse"); break; /* Type 2 */
+ case 23: output_token("random"); break; /* Type 2 */
+ case 24: output_token("mul"); break; /* Type 2 */
+ case 26: output_token("sqrt"); break; /* Type 2 */
+ case 27: output_token("dup"); break; /* Type 2 */
+ case 28: output_token("exch"); break; /* Type 2 */
+ case 29: output_token("index"); break; /* Type 2 */
+ case 30: output_token("roll"); break; /* Type 2 */
+ case 33: output_token("setcurrentpoint"); break;/* Type 1 ONLY */
+ case 34: output_token("hflex"); break; /* Type 2 */
+ case 35: output_token("flex"); break; /* Type 2 */
+ case 36: output_token("hflex1"); break; /* Type 2 */
+ case 37: output_token("flex1"); break; /* Type 2 */
+ default:
+ sprintf(buf, "escape_%d", b);
+ unknown++;
+ output_token(buf);
+ break;
+ }
+ break;
+ default:
+ sprintf(buf, "UNKNOWN_%d", b);
+ unknown++;
+ output_token(buf);
+ break;
+ }
+ output_token("\n");
+ }
+ }
+ if (i > len) {
+ output("\terror\n");
+ error("disassembly error: charstring too short");
+ }
+}
+
+
+/* Disassembly font_reader functions */
+
+static int in_eexec = 0;
+static unsigned char *save = 0;
+static int save_len = 0;
+static int save_cap = 0;
+
+static void
+append_save(unsigned char *line, int len)
+{
+ if (save_len + len >= save_cap) {
+ unsigned char *new_save;
+ if (!save_cap) save_cap = 1024;
+ while (save_len + len >= save_cap) save_cap *= 2;
+ new_save = (unsigned char *)malloc(save_cap);
+ if (!new_save)
+ fatal_error("out of memory");
+ memcpy(new_save, save, save_len);
+ free(save);
+ save = new_save;
+ }
+ memcpy(save + save_len, line, len);
+ save_len += len;
+}
+
+/* 23.Feb.2004 - use 'memstr', not strstr, because the strings input to
+ eexec_line aren't null terminated! Reported by Werner Lemberg. */
+
+static const char *
+oog_memstr(const char *line, int line_len, const char *pattern, int pattern_len)
+{
+ const char *try;
+ const char *last = line + line_len - pattern_len + 1;
+ while (line < last
+ && (try = memchr(line, (unsigned char)*pattern, last - line))) {
+ if (memcmp(try, pattern, pattern_len) == 0)
+ return try;
+ else
+ line = try + 1;
+ }
+ return 0;
+}
+
+/* returns 1 if next \n should be deleted */
+
+static int
+eexec_line(unsigned char *line, int line_len)
+{
+ int cs_start_len = strlen(cs_start);
+ int pos;
+ int first_space;
+ int digits;
+ int cut_newline = 0;
+
+ /* append this data to the end of `save' if necessary */
+ if (save_len) {
+ append_save(line, line_len);
+ line = save;
+ line_len = save_len;
+ }
+
+ if (!line_len)
+ return 0;
+
+ /* Look for charstring start */
+
+ /* skip first word */
+ for (pos = 0; pos < line_len && isspace(line[pos]); pos++)
+ ;
+ while (pos < line_len && !isspace(line[pos]))
+ pos++;
+ if (pos >= line_len)
+ goto not_charstring;
+
+ /* skip spaces */
+ first_space = pos;
+ while (pos < line_len && isspace(line[pos]))
+ pos++;
+ if (pos >= line_len || !isdigit(line[pos]))
+ goto not_charstring;
+
+ /* skip number */
+ digits = pos;
+ while (pos < line_len && isdigit(line[pos]))
+ pos++;
+
+ /* check for subr (another number) */
+ if (pos < line_len - 1 && isspace(line[pos]) && isdigit(line[pos+1])) {
+ first_space = pos;
+ digits = pos + 1;
+ for (pos = digits; pos < line_len && isdigit(line[pos]); pos++)
+ ;
+ }
+
+ /* check for charstring start */
+ if (pos + 2 + cs_start_len < line_len
+ && pos > digits
+ && line[pos] == ' '
+ && strncmp((const char *)(line + pos + 1), cs_start, cs_start_len) == 0
+ && line[pos + 1 + cs_start_len] == ' ') {
+ /* check if charstring is long enough */
+ int cs_len = atoi((const char *)(line + digits));
+ if (pos + 2 + cs_start_len + cs_len < line_len) {
+ /* long enough! */
+ if (line[line_len - 1] == '\r') {
+ line[line_len - 1] = '\n';
+ cut_newline = 1;
+ }
+ fprintf(ofp, "%.*s {\n", first_space, line);
+ decrypt_charstring(line + pos + 2 + cs_start_len, cs_len);
+ pos += 2 + cs_start_len + cs_len;
+ fprintf(ofp, "\t}%.*s", line_len - pos, line + pos);
+ save_len = 0;
+ return cut_newline;
+ } else {
+ /* not long enough! */
+ if (line != save)
+ append_save(line, line_len);
+ return 0;
+ }
+ }
+
+ /* otherwise, just output the line */
+ not_charstring:
+ /* 6.Oct.2003 - Werner Lemberg reports a stupid Omega font that behaves
+ badly: a charstring definition follows "/Charstrings ... begin", ON THE
+ SAME LINE. */
+ {
+ const char *CharStrings = oog_memstr(line, line_len, "/CharStrings ", 13);
+ int crap, n;
+ char should_be_slash = 0;
+ if (CharStrings
+ && sscanf(CharStrings + 12, " %d dict dup begin %c%n", &crap, &should_be_slash, &n) >= 2
+ && should_be_slash == '/') {
+ int len = (CharStrings + 12 + n - 1) - (char *) line;
+ fprintf(ofp, "%.*s\n", len, line);
+ return eexec_line((unsigned char *) (CharStrings + 12 + n - 1), line_len - len);
+ }
+ }
+
+ if (line[line_len - 1] == '\r') {
+ line[line_len - 1] = '\n';
+ cut_newline = 1;
+ }
+ set_lenIV((char *)line);
+ set_cs_start((char *)line);
+ fprintf(ofp, "%.*s", line_len, line);
+ save_len = 0;
+
+ /* look for `currentfile closefile' to see if we should stop decrypting */
+ if (oog_memstr(line, line_len, "currentfile closefile", 21) != 0)
+ in_eexec = -1;
+
+ return cut_newline;
+}
+
+static int
+all_zeroes(const char *string)
+{
+ if (*string != '0')
+ return 0;
+ while (*string == '0')
+ string++;
+ return *string == '\0' || *string == '\n';
+}
+
+static void
+disasm_output_ascii(char *line, int len)
+{
+ int was_in_eexec = in_eexec;
+ (void) len; /* avoid warning */
+ in_eexec = 0;
+
+ /* if we came from a binary section, we need to process that too */
+ if (was_in_eexec > 0)
+ eexec_line("", 0);
+
+ /* if we just came from the "ASCII part" of an eexec section, we need to
+ process the saved lines */
+ if (was_in_eexec < 0) {
+ int i = 0;
+ int save_char = 0; /* note: save[] is unsigned char * */
+
+ while (i < save_len) {
+ /* grab a line */
+ int start = i;
+ while (i < save_len && save[i] != '\r' && save[i] != '\n')
+ i++;
+ if (i < save_len) {
+ if (i < save_len - 1 && save[i] == '\r' && save[i+1] == '\n')
+ save_char = -1;
+ else
+ save_char = save[i+1];
+ save[i] = '\n';
+ save[i+1] = 0;
+ } else
+ save[i] = 0;
+
+ /* output it */
+ disasm_output_ascii((char *)(save + start), -1);
+
+ /* repair damage */
+ if (i < save_len) {
+ if (save_char >= 0) {
+ save[i+1] = save_char;
+ i++;
+ } else
+ i += 2;
+ }
+ }
+ save_len = 0;
+ }
+
+ if (!all_zeroes(line))
+ output(line);
+}
+
+/* collect until '\n' or end of binary section */
+
+static void
+disasm_output_binary(unsigned char *data, int len)
+{
+ static int ignore_newline;
+ static uint16_t er;
+
+ byte plain;
+ int i;
+
+ /* in the ASCII portion of a binary section, just save this data */
+ if (in_eexec < 0) {
+ append_save(data, len);
+ return;
+ }
+
+ /* eexec initialization */
+ if (in_eexec == 0) {
+ er = er_default;
+ ignore_newline = 0;
+ in_eexec = 0;
+ }
+ if (in_eexec < 4) {
+ for (i = 0; i < len && in_eexec < 4; i++, in_eexec++) {
+ byte cipher = data[i];
+ plain = (byte)(cipher ^ (er >> 8));
+ er = (uint16_t)((cipher + er) * c1 + c2);
+ data[i] = plain;
+ }
+ data += i;
+ len -= i;
+ }
+
+ /* now make lines: collect until '\n' or '\r' and pass them off to
+ eexec_line. */
+ i = 0;
+ while (in_eexec > 0) {
+ int start = i;
+
+ for (; i < len; i++) {
+ byte cipher = data[i];
+ plain = (byte)(cipher ^ (er >> 8));
+ er = (uint16_t)((cipher + er) * c1 + c2);
+ data[i] = plain;
+ if (plain == '\r' || plain == '\n')
+ break;
+ }
+
+ if (ignore_newline && start < i && data[start] == '\n') {
+ ignore_newline = 0;
+ continue;
+ }
+
+ if (i >= len) {
+ if (start < len)
+ append_save(data + start, i - start);
+ break;
+ }
+
+ i++;
+ ignore_newline = eexec_line(data + start, i - start);
+ }
+
+ /* if in_eexec < 0, we have some plaintext lines sitting around in a binary
+ section of the PFB. save them for later */
+ if (in_eexec < 0 && i < len)
+ append_save(data + i, len - i);
+}
+
+static void
+disasm_output_end()
+{
+ /* take care of leftover saved data */
+ static char crap[1] = "";
+ disasm_output_ascii(crap, 0);
+}
+
+
+/*****
+ * Command line
+ **/
+
+#define OUTPUT_OPT 301
+#define VERSION_OPT 302
+#define HELP_OPT 303
+
+static Clp_Option options[] = {
+ { "help", 0, HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+static const char *program_name;
+
+void
+fatal_error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ fputc('\n', stderr);
+ exit(1);
+}
+
+void
+error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ fputc('\n', stderr);
+ error_count++;
+}
+
+void
+short_usage(void)
+{
+ fprintf(stderr, "Usage: %s [INPUT [OUTPUT]]\n\
+Try `%s --help' for more information.\n",
+ program_name, program_name);
+}
+
+void
+usage(void)
+{
+ printf("\
+`T1disasm' translates a PostScript Type 1 font in PFB or PFA format into a\n\
+human-readable, human-editable form. The result is written to the standard\n\
+output unless an OUTPUT file is given.\n\
+\n\
+Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+\n\
+Options:\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and warranty and exit.\n\
+\n\
+Report bugs to <kohler@icir.org>.\n", program_name);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+int
+main(int argc, char *argv[])
+{
+ struct font_reader fr;
+ int c;
+ FILE *ifp = 0;
+ const char *ifp_filename = "<stdin>";
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ /* interpret command line arguments using CLP */
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ output_file:
+ case OUTPUT_OPT:
+ if (ofp)
+ fatal_error("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ ofp = stdout;
+ else {
+ ofp = fopen(clp->arg, "w");
+ if (!ofp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("t1disasm (LCDF t1utils) %s\n", VERSION);
+ printf("Copyright (C) 1992-2003 I. Lee Hetherington, Eddie Kohler et al.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (ifp && ofp)
+ fatal_error("too many arguments");
+ else if (ifp)
+ goto output_file;
+ if (strcmp(clp->arg, "-") == 0)
+ ifp = stdin;
+ else {
+ ifp_filename = clp->arg;
+ ifp = fopen(clp->arg, "rb");
+ if (!ifp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ short_usage();
+ exit(1);
+ break;
+
+ }
+ }
+
+ done:
+ if (!ifp) ifp = stdin;
+ if (!ofp) ofp = stdout;
+
+#if defined(_MSDOS) || defined(_WIN32)
+ /* As we might be processing a PFB (binary) input file, we must set its file
+ mode to binary. */
+ _setmode(_fileno(ifp), _O_BINARY);
+#endif
+
+ /* prepare font reader */
+ fr.output_ascii = disasm_output_ascii;
+ fr.output_binary = disasm_output_binary;
+ fr.output_end = disasm_output_end;
+
+ /* peek at first byte to see if it is the PFB marker 0x80 */
+ c = getc(ifp);
+ ungetc(c, ifp);
+
+ /* do the file */
+ if (c == PFB_MARKER)
+ process_pfb(ifp, ifp_filename, &fr);
+ else if (c == '%')
+ process_pfa(ifp, ifp_filename, &fr);
+ else
+ fatal_error("%s does not start with font marker (`%%' or 0x80)", ifp_filename);
+
+ fclose(ifp);
+ fclose(ofp);
+
+ if (unknown)
+ error((unknown > 1
+ ? "encountered %d unknown charstring commands"
+ : "encountered %d unknown charstring command"),
+ unknown);
+
+ return (error_count ? 1 : 0);
+}
diff --git a/Build/source/utils/t1utils/t1lib.c b/Build/source/utils/t1utils/t1lib.c
new file mode 100644
index 00000000000..5c8460b089f
--- /dev/null
+++ b/Build/source/utils/t1utils/t1lib.c
@@ -0,0 +1,441 @@
+/* t1lib
+ *
+ * This file contains functions for reading PFA and PFB files.
+ *
+ * (C) 1999-2003 Eddie Kohler <kohler@icir.org>, after code by
+ * I. Lee Hetherington <ilh@lcs.mit.edu>. All rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice remains intact.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include "t1lib.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PFA_ASCII 1
+#define PFA_EEXEC_TEST 2
+#define PFA_HEX 3
+#define PFA_BINARY 4
+
+/* This function returns the value (0-15) of a single hex digit. It returns
+ 0 for an invalid hex digit. */
+
+static int
+hexval(char c)
+{
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ else if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ else if (c >= '0' && c <= '9')
+ return c - '0';
+ else
+ return 0;
+}
+
+/* This function translates a string of hexadecimal digits into binary data.
+ We allow an odd number of digits. Returns length of binary data. */
+
+static int
+translate_hex_string(char *s, char *saved_orphan)
+{
+ int c1 = *saved_orphan;
+ char *start = s;
+ char *t = s;
+ for (; *s; s++) {
+ if (isspace(*s))
+ continue;
+ if (c1) {
+ *t++ = (hexval(c1) << 4) + hexval(*s);
+ c1 = 0;
+ } else
+ c1 = *s;
+ }
+ *saved_orphan = c1;
+ return t - start;
+}
+
+/* This function returns 1 if the string contains all '0's. */
+
+static int
+all_zeroes(char *s)
+{
+ if (*s == '\0' || *s == '\n')
+ return 0;
+ while (*s == '0')
+ s++;
+ return *s == '\0' || *s == '\n';
+}
+
+/* This function handles the entire file. */
+
+#define LINESIZE 1024
+
+void
+process_pfa(FILE *ifp, const char *ifp_filename, struct font_reader *fr)
+{
+ /* Loop until no more input. We need to look for `currentfile eexec' to
+ start eexec section (hex to binary conversion) and line of all zeros to
+ switch back to ASCII. */
+
+ /* Don't use fgets() in case line-endings are indicated by bare \r's, as
+ occurs in Macintosh fonts. */
+
+ /* 2.Aug.1999 - At the behest of Tom Kacvinsky <tjk@ams.org>, support
+ binary PFA fonts. */
+
+ char buffer[LINESIZE];
+ int c = 0;
+ int blocktyp = PFA_ASCII;
+ char saved_orphan = 0;
+ (void)ifp_filename;
+
+ while (c != EOF) {
+ char *line = buffer, *last = buffer;
+ int crlf = 0;
+ c = getc(ifp);
+ while (c != EOF && c != '\r' && c != '\n' && last < buffer + LINESIZE - 1) {
+ *last++ = c;
+ c = getc(ifp);
+ }
+
+ /* handle the end of the line */
+ if (last == buffer + LINESIZE - 1)
+ /* buffer overrun: don't append newline even if we have it */
+ ungetc(c, ifp);
+ else if (c == '\r' && blocktyp != PFA_BINARY) {
+ /* change CR or CR/LF into LF, unless reading binary data! (This
+ condition was wrong before, caused Thanh problems -
+ 6.Mar.2001) */
+ c = getc(ifp);
+ if (c != '\n')
+ ungetc(c, ifp), crlf = 1;
+ else
+ crlf = 2;
+ *last++ = '\n';
+ } else if (c != EOF)
+ *last++ = c;
+
+ *last = 0;
+
+ /* now that we have the line, handle it */
+ if (blocktyp == PFA_ASCII) {
+ if (strncmp(line, "currentfile eexec", 17) == 0 && isspace(line[17])) {
+ char saved_p;
+ /* assert(line == buffer); */
+ for (line += 18; isspace(*line); line++)
+ /* nada */;
+ saved_p = *line;
+ *line = 0;
+ fr->output_ascii(buffer, line - buffer);
+ *line = saved_p;
+ blocktyp = PFA_EEXEC_TEST;
+ if (!*line)
+ continue;
+ } else {
+ fr->output_ascii(line, last - line);
+ continue;
+ }
+ }
+
+ /* check immediately after "currentfile eexec" for ASCII or binary */
+ if (blocktyp == PFA_EEXEC_TEST) {
+ /* 8.Feb.2004: fix bug if first character in a binary eexec block
+ is 0, reported by Werner Lemberg */
+ for (; line < last && isspace(*line); line++)
+ /* nada */;
+ if (line == last)
+ continue;
+ else if (last >= line + 4 && isxdigit(line[0]) && isxdigit(line[1])
+ && isxdigit(line[2]) && isxdigit(line[3]))
+ blocktyp = PFA_HEX;
+ else
+ blocktyp = PFA_BINARY;
+ memmove(buffer, line, last - line + 1);
+ last = buffer + (last - line);
+ line = buffer;
+ /* patch up crlf fix */
+ if (blocktyp == PFA_BINARY && crlf) {
+ last[-1] = '\r';
+ if (crlf == 2)
+ *last++ = '\n';
+ }
+ }
+
+ /* blocktyp == PFA_HEX || blocktyp == PFA_BINARY */
+ if (all_zeroes(line)) { /* XXX not safe */
+ fr->output_ascii(line, last - line);
+ blocktyp = PFA_ASCII;
+ } else if (blocktyp == PFA_HEX) {
+ int len = translate_hex_string(line, &saved_orphan);
+ if (len)
+ fr->output_binary((unsigned char *)line, len);
+ } else
+ fr->output_binary((unsigned char *)line, last - line);
+ }
+
+ fr->output_end();
+}
+
+/* Process a PFB file. */
+
+/* XXX Doesn't handle "currentfile eexec" as intelligently as process_pfa
+ does. */
+
+static int
+handle_pfb_ascii(struct font_reader *fr, char *line, int len)
+{
+ /* Divide PFB_ASCII blocks into lines */
+ int start = 0;
+
+ while (1) {
+ int pos = start;
+
+ while (pos < len && line[pos] != '\n' && line[pos] != '\r')
+ pos++;
+
+ if (pos >= len) {
+ if (pos == start)
+ return 0;
+ else if (start == 0 && pos == LINESIZE - 1) {
+ line[pos] = 0;
+ fr->output_ascii(line, pos);
+ return 0;
+ } else {
+ memmove(line, line + start, pos - start);
+ return pos - start;
+ }
+
+ } else if (pos < len - 1 && line[pos] == '\r' && line[pos+1] == '\n') {
+ line[pos] = '\n';
+ line[pos+1] = 0;
+ fr->output_ascii(line + start, pos + 1 - start);
+ start = pos + 2;
+
+ } else {
+ char save = line[pos+1];
+ line[pos] = '\n';
+ line[pos+1] = 0;
+ fr->output_ascii(line + start, pos + 1 - start);
+ line[pos+1] = save;
+ start = pos + 1;
+ }
+ }
+}
+
+
+void
+process_pfb(FILE *ifp, const char *ifp_filename, struct font_reader *fr)
+{
+ int blocktyp = 0;
+ int block_len = 0;
+ int c = 0;
+ int filepos = 0;
+ int linepos = 0;
+ char line[LINESIZE];
+
+ while (1) {
+ while (block_len == 0) {
+ c = getc(ifp);
+ blocktyp = getc(ifp);
+ if (c != PFB_MARKER
+ || (blocktyp != PFB_ASCII && blocktyp != PFB_BINARY
+ && blocktyp != PFB_DONE)) {
+ if (c == EOF || blocktyp == EOF)
+ error("%s corrupted: no end-of-file marker", ifp_filename);
+ else
+ error("%s corrupted: bad block marker at position %d",
+ ifp_filename, filepos);
+ blocktyp = PFB_DONE;
+ }
+ if (blocktyp == PFB_DONE)
+ goto done;
+
+ block_len = getc(ifp) & 0xFF;
+ block_len |= (getc(ifp) & 0xFF) << 8;
+ block_len |= (getc(ifp) & 0xFF) << 16;
+ block_len |= (getc(ifp) & 0xFF) << 24;
+ if (feof(ifp)) {
+ error("%s corrupted: bad block length at position %d",
+ ifp_filename, filepos);
+ blocktyp = PFB_DONE;
+ goto done;
+ }
+ filepos += 6;
+ }
+
+ /* read the block in its entirety, in LINESIZE chunks */
+ while (block_len > 0) {
+ int rest = LINESIZE - 1 - linepos; /* leave space for '\0' */
+ int n = (block_len > rest ? rest : block_len);
+ int actual = fread(line + linepos, 1, n, ifp);
+ if (actual != n) {
+ error("%s corrupted: block short by %d bytes at position %d",
+ ifp_filename, block_len - actual, filepos);
+ block_len = actual;
+ }
+
+ if (blocktyp == PFB_BINARY)
+ fr->output_binary((unsigned char *)line, actual);
+ else
+ linepos = handle_pfb_ascii(fr, line, linepos + actual);
+
+ block_len -= actual;
+ filepos += actual;
+ }
+
+ /* handle any leftover line */
+ if (linepos > 0) {
+ line[linepos] = 0;
+ fr->output_ascii(line, linepos);
+ linepos = 0;
+ }
+ }
+
+ done:
+ c = getc(ifp);
+ if (c != EOF)
+ error("%s corrupted: data after PFB end marker at position %d",
+ ifp_filename, filepos - 2);
+ fr->output_end();
+}
+
+
+#define DEFAULT_BLOCKLEN (1L<<12)
+
+void
+init_pfb_writer(struct pfb_writer *w, int blocklen, FILE *f)
+{
+ w->len = DEFAULT_BLOCKLEN;
+ w->buf = (unsigned char *)malloc(w->len);
+ if (!w->buf)
+ fatal_error("out of memory");
+ w->max_len = (blocklen <= 0 ? 0xFFFFFFFFU : (unsigned)blocklen);
+ w->pos = 0;
+ w->blocktyp = PFB_ASCII;
+ w->binary_blocks_written = 0;
+ w->f = f;
+}
+
+void
+pfb_writer_output_block(struct pfb_writer *w)
+{
+ /* do nothing if nothing in block */
+ if (w->pos == 0)
+ return;
+
+ /* output four-byte block length */
+ putc(PFB_MARKER, w->f);
+ putc(w->blocktyp, w->f);
+ putc((int)(w->pos & 0xff), w->f);
+ putc((int)((w->pos >> 8) & 0xff), w->f);
+ putc((int)((w->pos >> 16) & 0xff), w->f);
+ putc((int)((w->pos >> 24) & 0xff), w->f);
+
+ /* output block data */
+ fwrite(w->buf, 1, w->pos, w->f);
+
+ /* mark block buffer empty and uninitialized */
+ w->pos = 0;
+ if (w->blocktyp == PFB_BINARY)
+ w->binary_blocks_written++;
+}
+
+void
+pfb_writer_grow_buf(struct pfb_writer *w)
+{
+ if (w->len < w->max_len) {
+ /* grow w->buf */
+ unsigned new_len = w->len * 2;
+ unsigned char *new_buf;
+ if (new_len > w->max_len)
+ new_len = w->max_len;
+ new_buf = (unsigned char *)malloc(new_len);
+ if (!new_buf) {
+ error("out of memory; continuing with a smaller block size");
+ w->max_len = w->len;
+ pfb_writer_output_block(w);
+ } else {
+ memcpy(new_buf, w->buf, w->len);
+ free(w->buf);
+ w->buf = new_buf;
+ w->len = new_len;
+ }
+
+ } else
+ /* buf already the right size, just output the block */
+ pfb_writer_output_block(w);
+}
+
+void
+pfb_writer_end(struct pfb_writer *w)
+{
+ if (w->pos)
+ pfb_writer_output_block(w);
+ putc(PFB_MARKER, w->f);
+ putc(PFB_DONE, w->f);
+}
+
+/* This CRC table and routine were borrowed from macutils-2.0b3 */
+
+static unsigned short crctab[256] = {
+ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
+ 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
+ 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
+ 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
+ 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
+ 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
+ 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
+ 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
+ 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
+ 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
+ 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
+ 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
+ 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
+ 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
+ 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
+ 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
+ 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
+ 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
+ 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
+ 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
+ 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
+ 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+ 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
+ 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
+ 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
+ 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
+ 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
+ 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
+ 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
+ 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
+ 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
+ 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
+};
+
+/*
+ * Update a CRC check on the given buffer.
+ */
+
+int
+crcbuf(int crc, unsigned int len, const char *buf)
+{
+ const unsigned char *ubuf = (const unsigned char *)buf;
+ while (len--)
+ crc = ((crc << 8) & 0xFF00) ^ crctab[((crc >> 8) & 0xFF) ^ *ubuf++];
+ return crc;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/utils/t1utils/t1lib.h b/Build/source/utils/t1utils/t1lib.h
new file mode 100644
index 00000000000..7100eb37c97
--- /dev/null
+++ b/Build/source/utils/t1utils/t1lib.h
@@ -0,0 +1,49 @@
+#ifndef T1LIB_H
+#define T1LIB_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PFB_MARKER 128
+#define PFB_ASCII 1
+#define PFB_BINARY 2
+#define PFB_DONE 3
+
+struct font_reader {
+ void (*output_ascii)(char *, int);
+ void (*output_binary)(unsigned char *, int);
+ void (*output_end)();
+};
+
+void process_pfa(FILE *, const char *filename, struct font_reader *);
+void process_pfb(FILE *, const char *filename, struct font_reader *);
+
+struct pfb_writer {
+ unsigned char *buf;
+ unsigned len;
+ unsigned max_len;
+ unsigned pos;
+ int blocktyp;
+ int binary_blocks_written;
+ FILE *f;
+};
+
+void init_pfb_writer(struct pfb_writer *, int, FILE *);
+void pfb_writer_output_block(struct pfb_writer *);
+void pfb_writer_grow_buf(struct pfb_writer *);
+void pfb_writer_end(struct pfb_writer *);
+#define PFB_OUTPUT_BYTE(w, b) do { \
+ if ((w)->pos >= (w)->len) pfb_writer_grow_buf(w); \
+ (w)->buf[(w)->pos++] = (b); \
+ } while (0)
+
+int crcbuf(int crc, unsigned int len, const char *buf);
+
+/* whoever uses this code must provide a definition for these functions */
+extern void error(const char *, ...);
+extern void fatal_error(const char *, ...);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/utils/t1utils/t1mac.1 b/Build/source/utils/t1utils/t1mac.1
new file mode 100644
index 00000000000..63a196da720
--- /dev/null
+++ b/Build/source/utils/t1utils/t1mac.1
@@ -0,0 +1,62 @@
+.ds V 1.32
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.TH T1MAC 1 "" "Version \*V"
+.SH NAME
+t1mac \- translate a PFA or PFB PostScript Type 1 font into Macintosh format
+.SH SYNOPSIS
+.B t1mac
+\%[\fB\-\-macbinary\fR | \fB\-\-applesingle\fR |
+\fB\-\-appledouble\fR | \fB\-\-binhex\fR | \fB\-\-raw\fR]
+\%[\fB\-\-filename\fR \fIname\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.B t1mac
+reads a PFA (hexadecimal) or PFB (binary) PostScript Type 1 font file and
+generates an equivalent Macintosh Type 1 font file. The output file can be
+in MacBinary II, AppleSingle, AppleDouble, or BinHex format, or it can be a
+raw resource fork. The default is MacBinary II; use an option to choose a
+different format. If the
+.I output
+file is not specified output goes to the standard output.
+.PP
+WARNING: The output of
+.B t1mac
+is not sufficient to use the font, since Macintoshes can't read raw Type 1
+fonts. You will need to create a font suitcase containing bitmap fonts if
+you do not have such a suitcase for the font already.
+.B t1mac
+cannot help you do this.
+.SH OPTIONS
+.TP 5
+.BR \-\-raw ", " \-r
+Indicates that output should be a raw resource fork.
+.TP 5
+.BR \-\-macbinary
+Indicates that output should be in MacBinary I or II format. This is the
+default.
+.TP 5
+.BR \-\-applesingle
+Indicates that output should be in AppleSingle format.
+.TP 5
+.BR \-\-appledouble
+Indicates that output should be in AppleDouble format.
+.TP 5
+.BR \-\-binhex
+Indicates that output should be in BinHex 4.0 format.
+.TP 5
+.BR \-\-filename "=\fIname\fR, " \-n " \fIname\fR"
+Sets the Macintosh filename of the output font to \fIname\fR. The default
+is to construct the filename from the font's name using established
+Macintosh conventions. This option is not useful when output is a raw
+resource fork.
+.SH "SEE ALSO"
+.LP
+.M t1unmac 1 ,
+.M t1ascii 1 ,
+.M t1binary 1 ,
+.M t1asm 1 ,
+.M t1disasm 1
+.SH AUTHORS
+Eddie Kohler (kohler@icir.org)
diff --git a/Build/source/utils/t1utils/t1mac.c b/Build/source/utils/t1utils/t1mac.c
new file mode 100644
index 00000000000..c7c62b2d2b3
--- /dev/null
+++ b/Build/source/utils/t1utils/t1mac.c
@@ -0,0 +1,1022 @@
+/* t1mac
+ *
+ * This program converts Type 1 fonts in PFA or PFB format into Macintosh Type
+ * 1 fonts stored in MacBinary (I or II), AppleSingle, AppleDouble, BinHex, or
+ * raw resource fork format.
+ *
+ * Copyright (c) 2000-2003 by Eddie Kohler, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact. */
+
+/* Note: this is ANSI C. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <lcdf/clp.h>
+#include "t1lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned char byte;
+
+void fatal_error(const char *message, ...);
+void error(const char *message, ...);
+
+/* resource fork layout */
+#define RFORK_HEADERLEN 256
+#define RFORK_MAP_RESERVEDLEN 22
+#define RFORK_MAP_HEADERLEN 28
+#define RFORK_RTYPE_LEN 8
+#define RFORK_RSRC_LEN 12
+
+/* Macintosh times are # seconds since 1/1/1904, not 1/1/1970 */
+#define MAC_TIME_DELTA 2082844800
+
+/* POST resource information */
+#define POST_ASCII 1
+#define POST_BINARY 2
+#define POST_END 5
+
+/* Adobe font file information */
+#define T1_FILETYPE 0x4C57464E /* LWFN */
+#define T1_FILECREATOR 0x54315554 /* T1UT */
+#define T1_FINDERFLAGS 33 /* Bundle + Inited */
+
+#define MAX_RSRC_LEN 2048
+static byte rbuf[MAX_RSRC_LEN];
+static int rbufpos;
+static int blocktyp;
+
+static char *font_name;
+
+/* information about the resources being built */
+typedef struct Rsrc {
+ int32_t type;
+ int id;
+ int attrs;
+ int data_offset;
+ uint32_t data_len;
+ int next_in_type;
+ int next_type;
+} Rsrc;
+static Rsrc *rsrc = 0;
+static int nrsrc = 0;
+static int rsrc_cap = 0;
+static int cur_post_id = 0;
+
+/* output resource fork */
+static FILE *rfork_f = 0;
+
+/* ICN# data */
+static const unsigned char icon_bw_data[] = {
+0,0,0,0,255,255,255,255,128,0,0,1,128,0,0,1,128,0,0,1,
+128,0,0,1,128,0,0,1,128,0,0,1,128,0,0,1,128,0,0,33,
+128,0,0,97,128,0,0,225,128,0,1,225,128,0,3,225,128,0,7,225,
+128,0,15,225,128,0,31,225,128,0,55,225,159,128,103,249,144,128,199,9,
+240,129,135,15,0,131,7,0,0,134,7,0,15,140,7,240,8,31,255,240,
+8,63,255,240,8,96,7,240,8,192,7,240,9,192,15,240,11,224,31,240,
+15,240,63,240,15,255,255,240,0,0,0,0,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,240,255,255,15,240,255,255,15,0,255,255,0,0,255,255,0,
+15,255,255,240,15,255,255,240,15,255,255,240,15,255,255,240,15,255,255,240,
+15,255,255,240,15,255,255,240,15,255,255,240,15,255,255,240,};
+
+static const unsigned char small_icon_bw_data[] = {
+255,255,128,1,128,1,128,1,128,5,128,13,128,29,128,61,128,125,184,253,
+201,179,59,60,39,252,44,60,60,124,63,252,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,207,243,63,252,63,252,63,252,
+63,252,63,252,};
+
+static const unsigned char icon_8_data[] = {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,105,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,105,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,105,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,105,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,5,92,92,92,92,105,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,5,5,92,92,92,92,105,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,5,5,5,92,
+92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,5,5,5,5,92,92,92,92,105,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,5,5,
+5,5,5,92,92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,5,5,5,5,5,5,92,92,92,92,105,
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+5,5,5,5,5,5,5,92,92,92,92,105,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,5,5,5,5,5,5,5,5,92,
+92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,5,5,92,5,5,5,5,5,5,92,92,92,92,105,92,92,92,105,
+105,105,105,105,92,92,92,92,92,92,92,92,92,5,5,92,92,5,5,105,
+105,105,105,105,92,92,92,105,92,92,92,105,0,0,0,0,92,92,92,92,
+92,92,92,92,5,5,92,92,92,5,5,105,0,0,0,0,92,92,92,105,
+105,105,105,105,0,0,0,0,92,92,92,92,92,92,92,5,5,92,92,92,
+92,5,5,105,0,0,0,0,105,105,105,105,0,0,0,0,0,0,0,0,
+92,92,92,92,92,92,5,5,92,92,92,92,92,5,5,105,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,92,92,92,92,92,5,5,92,
+92,92,92,92,92,5,5,105,0,0,0,0,0,0,0,0,0,0,0,0,
+92,92,92,92,92,92,92,92,5,5,92,92,92,92,92,92,92,5,5,5,
+5,5,5,92,0,0,0,0,0,0,0,0,92,92,92,92,92,92,92,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,105,0,0,0,0,
+0,0,0,0,92,92,92,92,92,92,5,5,5,5,5,5,5,5,5,5,
+5,5,5,5,5,5,5,105,0,0,0,0,0,0,0,0,92,92,92,92,
+92,5,5,92,92,92,92,92,92,92,92,92,92,5,5,5,5,5,5,105,
+0,0,0,0,0,0,0,0,92,92,92,92,5,5,92,92,92,92,92,92,
+92,92,92,92,92,5,5,5,5,5,5,105,0,0,0,0,0,0,0,0,
+92,92,92,5,5,5,92,92,92,92,92,92,92,92,92,92,5,5,5,5,
+5,5,5,105,0,0,0,0,0,0,0,0,92,92,5,5,5,5,5,92,
+92,92,92,92,92,92,92,5,5,5,5,5,5,5,5,105,0,0,0,0,
+0,0,0,0,92,5,5,5,5,5,5,5,92,92,92,92,92,92,5,5,
+5,5,5,5,5,5,5,105,0,0,0,0,0,0,0,0,92,105,105,105,
+105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
+0,0,0,0,};
+
+static const unsigned char small_icon_8_data[] = {
+92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,92,92,92,92,105,92,92,92,92,92,92,92,92,
+92,92,92,92,92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,
+92,92,92,105,92,92,92,92,92,92,92,92,92,92,92,92,92,5,92,105,
+92,92,92,92,92,92,92,92,92,92,92,92,5,5,92,105,92,92,92,92,
+92,92,92,92,92,92,92,5,5,5,92,105,92,92,92,92,92,92,92,92,
+92,92,5,5,5,5,92,105,92,92,92,92,92,92,92,92,92,5,92,5,
+5,5,92,105,92,105,105,105,92,92,92,92,5,92,92,5,105,105,92,105,
+92,105,0,0,92,92,92,5,92,92,92,5,0,0,105,105,0,0,92,92,
+92,92,5,92,92,92,92,5,5,5,0,0,0,0,92,92,92,5,5,5,
+5,5,5,5,5,5,0,0,0,0,92,92,5,92,92,92,92,92,92,5,
+5,5,0,0,0,0,92,5,5,92,92,92,92,92,5,5,5,5,0,0,
+0,0,5,5,5,5,105,105,105,5,5,5,5,5,0,0,};
+
+static const unsigned char icon_4_data[] = {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,69,69,69,
+69,69,69,69,69,69,69,69,69,69,69,69,84,84,84,84,84,84,84,84,
+84,84,84,84,84,84,84,85,69,69,69,69,69,69,69,69,69,69,69,69,
+69,69,69,69,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,85,
+69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,84,84,84,84,
+84,84,84,84,84,84,84,84,84,84,84,85,69,69,69,69,69,69,69,69,
+69,69,69,69,69,69,69,69,84,84,84,84,84,84,84,84,84,84,84,84,
+84,84,84,85,69,69,69,69,69,69,69,69,69,69,69,69,69,21,69,69,
+84,84,84,84,84,84,84,84,84,84,84,84,81,20,84,85,69,69,69,69,
+69,69,69,69,69,69,69,69,17,21,69,69,84,84,84,84,84,84,84,84,
+84,84,84,81,17,20,84,85,69,69,69,69,69,69,69,69,69,69,69,17,
+17,21,69,69,84,84,84,84,84,84,84,84,84,84,81,17,17,20,84,85,
+69,69,69,69,69,69,69,69,69,69,17,17,17,21,69,69,84,84,84,84,
+84,84,84,84,84,81,17,17,17,20,84,85,69,69,69,69,69,69,69,69,
+69,17,65,17,17,21,69,69,84,85,85,85,84,84,84,84,81,20,81,21,
+85,85,84,85,69,69,0,0,69,69,69,69,17,69,65,21,0,0,69,69,
+85,85,0,0,84,84,84,81,20,84,81,21,0,0,85,85,0,0,0,0,
+69,69,69,17,69,69,65,21,0,0,0,0,0,0,0,0,84,84,81,20,
+84,84,81,21,0,0,0,0,0,0,69,69,69,69,17,69,69,69,65,17,
+17,30,0,0,0,0,84,84,84,81,17,17,17,17,17,17,17,21,0,0,
+0,0,69,69,69,17,17,17,17,17,17,17,17,21,0,0,0,0,84,84,
+81,20,84,84,84,84,81,17,17,21,0,0,0,0,69,69,17,69,69,69,
+69,69,65,17,17,21,0,0,0,0,84,81,17,84,84,84,84,84,17,17,
+17,21,0,0,0,0,69,17,17,21,69,69,69,65,17,17,17,21,0,0,
+0,0,81,17,17,17,84,84,84,17,17,17,17,21,0,0,0,0,229,85,
+85,85,85,85,85,85,85,85,85,85,0,0,};
+
+static const unsigned char small_icon_4_data[] = {
+84,84,84,84,84,84,84,85,69,69,69,69,69,69,69,69,84,84,84,84,
+84,84,84,85,69,69,69,69,69,69,69,69,84,84,84,84,84,84,81,85,
+69,69,69,69,69,69,17,69,84,84,84,84,84,81,17,85,69,69,69,69,
+69,17,17,69,84,84,84,84,81,81,17,85,69,85,69,69,21,65,85,69,
+85,0,84,81,84,81,0,85,0,69,69,21,69,65,17,0,0,84,81,17,
+17,17,17,0,0,69,21,69,69,65,17,0,0,81,20,84,84,17,17,0,
+0,17,17,85,81,17,17,0,};
+
+
+/* fseek with fatal_error */
+
+static void
+reposition(FILE *fi, int32_t absolute)
+{
+ if (fseek(fi, absolute, 0) == -1)
+ fatal_error("can't seek to position %d", absolute);
+}
+
+/* Some functions to write one, two, three, and four byte integers in 68000
+ byte order (most significant byte first). */
+
+static void
+write_one(int c, FILE *f)
+{
+ putc(c, f);
+}
+
+static void
+write_two(int c, FILE *f)
+{
+ putc((c >> 8) & 255, f);
+ putc(c & 255, f);
+}
+
+static void
+write_three(int32_t c, FILE *f)
+{
+ putc((c >> 16) & 255, f);
+ putc((c >> 8) & 255, f);
+ putc(c & 255, f);
+}
+
+static void
+write_four(int32_t c, FILE *f)
+{
+ putc((c >> 24) & 255, f);
+ putc((c >> 16) & 255, f);
+ putc((c >> 8) & 255, f);
+ putc(c & 255, f);
+}
+
+/* Some functions to store one, two, three, and four byte integers in 68000
+ byte order (most significant byte first). */
+
+static void
+store_one(int c, char *s)
+{
+ s[0] = (char)(c & 255);
+}
+
+static void
+store_two(int c, char *s)
+{
+ s[0] = (char)((c >> 8) & 255);
+ s[1] = (char)(c & 255);
+}
+
+static void
+store_four(int32_t c, char *s)
+{
+ s[0] = (char)((c >> 24) & 255);
+ s[1] = (char)((c >> 16) & 255);
+ s[2] = (char)((c >> 8) & 255);
+ s[3] = (char)(c & 255);
+}
+
+static void
+output_new_rsrc(const char *rtype, int rid, int attrs,
+ const char *data, uint32_t len)
+{
+ Rsrc *r;
+ if (nrsrc >= rsrc_cap) {
+ rsrc_cap = (rsrc_cap ? rsrc_cap * 2 : 256);
+ r = (Rsrc *)malloc(sizeof(Rsrc) * rsrc_cap);
+ if (!r)
+ fatal_error("out of memory");
+ memcpy(r, rsrc, sizeof(Rsrc) * nrsrc);
+ free(rsrc);
+ rsrc = r;
+ }
+ r = &rsrc[nrsrc];
+ nrsrc++;
+
+ /* prepare resource record */
+ {
+ const unsigned char *b = (const unsigned char *)rtype;
+ r->type = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
+ }
+ r->id = rid;
+ r->attrs = attrs;
+ if (nrsrc == 1)
+ r->data_offset = 0;
+ else
+ r->data_offset = rsrc[nrsrc-2].data_offset + rsrc[nrsrc-2].data_len + 4;
+ r->data_len = len;
+ r->next_in_type = r->next_type = -2;
+
+ /* resource consists of length, then data */
+ write_four(r->data_len, rfork_f);
+ fwrite(data, 1, len, rfork_f);
+}
+
+static void
+init_current_post(void)
+{
+ rbufpos = 2;
+ cur_post_id = 501;
+ blocktyp = POST_ASCII;
+}
+
+static void
+output_current_post(void)
+{
+ if (blocktyp != POST_END && rbufpos <= 2)
+ return;
+ rbuf[0] = blocktyp;
+ rbuf[1] = 0;
+ output_new_rsrc("POST", cur_post_id, 0, (char *)rbuf, rbufpos);
+ rbufpos = 2;
+ cur_post_id++;
+}
+
+/* font_reader functions */
+
+static void
+t1mac_output_data(byte *s, int len)
+{
+ while (len > 0) {
+ int n;
+ /* In some Mac fonts, the ASCII sections terminate with a line-end */
+ if (rbufpos >= MAX_RSRC_LEN
+ || (blocktyp == POST_ASCII && len + rbufpos > MAX_RSRC_LEN && rbufpos))
+ output_current_post();
+ n = (len + rbufpos <= MAX_RSRC_LEN ? len : MAX_RSRC_LEN - rbufpos);
+ memcpy(rbuf + rbufpos, s, n);
+ rbufpos += n;
+ s += n;
+ len -= n;
+ }
+}
+
+static void
+t1mac_output_ascii(char *s, int len)
+{
+ if (blocktyp == POST_BINARY) {
+ output_current_post();
+ blocktyp = POST_ASCII;
+ }
+ /* Mac line endings */
+ if (len > 0 && s[len-1] == '\n')
+ s[len-1] = '\r';
+ t1mac_output_data((byte *)s, len);
+ if (strncmp(s, "/FontName", 9) == 0) {
+ for (s += 9; isspace(*s); s++) ;
+ if (*s == '/') {
+ const char *t = ++s;
+ while (*t && !isspace(*t)) t++;
+ free(font_name);
+ font_name = (char *)malloc(t - s + 1);
+ memcpy(font_name, s, t - s);
+ font_name[t - s] = 0;
+ }
+ }
+}
+
+static void
+t1mac_output_binary(unsigned char *s, int len)
+{
+ if (blocktyp == POST_ASCII) {
+ output_current_post();
+ blocktyp = POST_BINARY;
+ }
+ t1mac_output_data(s, len);
+}
+
+static void
+t1mac_output_end(void)
+{
+ output_current_post();
+ blocktyp = POST_END;
+ output_current_post();
+}
+
+
+/* finish off the resource fork */
+
+static uint32_t
+complete_rfork(void)
+{
+ uint32_t reflist_offset, total_data_len;
+ uint32_t typelist_len;
+ int i, j, ntypes;
+
+ /* analyze resources */
+ {
+ int last_type = -1;
+ ntypes = 0;
+ for (i = 0; i < nrsrc; i++)
+ if (rsrc[i].next_in_type == -2) {
+ int last = -1;
+ if (last_type >= 0)
+ rsrc[last_type].next_type = i;
+ for (j = i; j < nrsrc; j++)
+ if (rsrc[j].type == rsrc[i].type) {
+ if (last >= 0)
+ rsrc[last].next_in_type = j;
+ last = j;
+ }
+ rsrc[last].next_in_type = -1;
+ last_type = i;
+ ntypes++;
+ }
+ }
+
+ /* have just finished writing data */
+ /* now write resource map */
+ for (i = 0; i < RFORK_MAP_RESERVEDLEN; i++)
+ putc(0, rfork_f); /* reserved */
+ write_two(0, rfork_f); /* resource fork attributes */
+ typelist_len = ntypes * RFORK_RTYPE_LEN + 2;
+ write_two(RFORK_MAP_HEADERLEN, rfork_f); /* offset from start of map to typelist */
+ write_two(RFORK_MAP_HEADERLEN + typelist_len + nrsrc * RFORK_RSRC_LEN, rfork_f); /* offset from start of map to namelist */
+
+ /* output type map */
+ write_two(ntypes - 1, rfork_f);/* number of types - 1 */
+ reflist_offset = typelist_len;
+ for (i = 0; i >= 0; i = rsrc[i].next_type) {
+ int n_in_type = 0;
+ for (j = i; j >= 0; j = rsrc[j].next_in_type)
+ n_in_type++;
+ write_four(rsrc[i].type, rfork_f); /* resource type */
+ write_two(n_in_type - 1, rfork_f); /* number in type - 1 */
+ write_two(reflist_offset, rfork_f); /* offset to reflist from start of typelist */
+ reflist_offset += n_in_type * RFORK_RSRC_LEN;
+ }
+
+ /* output reference list */
+ for (i = 0; i >= 0; i = rsrc[i].next_type)
+ for (j = i; j >= 0; j = rsrc[j].next_in_type) {
+ write_two(rsrc[j].id, rfork_f); /* ID */
+ write_two(-1, rfork_f); /* offset to name */
+ write_one(rsrc[j].attrs, rfork_f); /* attributes */
+ write_three(rsrc[j].data_offset, rfork_f); /* offset to data from start of data */
+ write_four(0, rfork_f); /* reserved */
+ }
+
+ /* finally, patch up resource fork header */
+ {
+ total_data_len = rsrc[nrsrc-1].data_offset + rsrc[nrsrc-1].data_len + 4;
+ reposition(rfork_f, 0);
+ write_four(RFORK_HEADERLEN, rfork_f); /* offset from rfork to data */
+ write_four(RFORK_HEADERLEN + total_data_len, rfork_f); /* offset from rfork to map */
+ write_four(total_data_len, rfork_f); /* length of data */
+ write_four(RFORK_MAP_HEADERLEN + reflist_offset, rfork_f); /* length of map */
+ }
+
+ return RFORK_HEADERLEN + total_data_len + RFORK_MAP_HEADERLEN + reflist_offset;
+}
+
+
+/* write a MacBinary II file */
+
+static void
+output_raw(FILE *rf, int32_t len, FILE *f)
+{
+ char buf[2048];
+ reposition(rf, 0);
+ while (len > 0) {
+ int n = (len < 2048 ? len : 2048);
+ fread(buf, 1, n, rf);
+ fwrite(buf, 1, n, f);
+ len -= n;
+ }
+}
+
+static void
+output_macbinary(FILE *rf, int32_t rf_len, const char *filename, FILE *f)
+{
+ int i, len = strlen(filename);
+ char buf[128];
+ if (len < 1 || len > 63)
+ fatal_error("filename length must be between 1 and 63");
+ store_one(0, buf+0); /* old version number */
+ store_one(len, buf+1); /* filename length */
+ memset(buf+2, 0, 63); /* filename padding */
+ memcpy(buf+2, filename, len); /* filename */
+ store_four(T1_FILETYPE, buf+65); /* file type */
+ store_four(T1_FILECREATOR, buf+69); /* file creator */
+ store_one(T1_FINDERFLAGS, buf+73); /* finder flags */
+ store_one(0, buf+74); /* zero byte */
+ store_two(0, buf+75); /* vertical position in window */
+ store_two(0, buf+77); /* horizontal position in window */
+ store_two(0, buf+79); /* window or folder ID */
+ store_one(0, buf+81); /* protected flag */
+ store_one(0, buf+82); /* zero byte */
+ store_four(0, buf+83); /* data fork length */
+ store_four(rf_len, buf+87); /* resource fork length */
+ {
+ time_t t = time(0) + MAC_TIME_DELTA;
+ store_four(t, buf+91); /* creation date */
+ store_four(t, buf+95); /* modification date */
+ }
+ store_two(0, buf+99); /* GetInfo comment length */
+ store_one(0, buf+101); /* finder flags part 2 */
+ memset(buf+102, 0, 116 - 102); /* padding */
+ store_four(0, buf+116); /* total length when unpacked */
+ store_two(0, buf+120); /* length of secondary header */
+ store_one(129, buf+122); /* version number */
+ store_one(129, buf+123); /* minimum acceptable version number */
+ store_two(crcbuf(0, 124, buf), buf+124); /* CRC */
+ store_two(0, buf+126); /* padding to 128 bytes */
+
+ /* write out the header */
+ fwrite(buf, 1, 128, f);
+
+ /* now write resource fork */
+ output_raw(rf, rf_len, f);
+ for (i = rf_len % 128; i && i < 128; i++)
+ putc(0, f);
+}
+
+
+/* write an AppleSingle file */
+
+#define APPLESINGLE_MAGIC 0x00051600
+#define APPLEDOUBLE_MAGIC 0x00051607
+#define APPLESINGLE_VERSION 0x00020000
+#define APPLESINGLE_TIME_DELTA 883612800
+#define APPLESINGLE_HEADERLEN 26
+#define APPLESINGLE_ENTRYLEN 12
+#define APPLESINGLE_DFORK_ENTRY 1
+#define APPLESINGLE_RFORK_ENTRY 2
+#define APPLESINGLE_DATES_ENTRY 8
+#define APPLESINGLE_DATES_LEN 16
+#define APPLESINGLE_FINDERINFO_ENTRY 9
+#define APPLESINGLE_FINDERINFO_LEN 32
+#define APPLESINGLE_REALNAME_ENTRY 3
+
+static void
+output_applesingle(FILE *rf, int32_t rf_len, const char *filename, FILE *f,
+ int appledouble)
+{
+ uint32_t offset;
+ int i, nentries, len = strlen(filename);
+ if (appledouble) /* magic number */
+ write_four(APPLEDOUBLE_MAGIC, f);
+ else
+ write_four(APPLESINGLE_MAGIC, f);
+ write_four(APPLESINGLE_VERSION, f); /* version number */
+ for (i = 0; i < 4; i++)
+ write_four(0, f); /* filler */
+ nentries = (appledouble ? 4 : 5);
+ write_two(nentries, f); /* number of entries */
+
+ /* real name entry */
+ offset = APPLESINGLE_HEADERLEN + nentries * APPLESINGLE_ENTRYLEN;
+ write_four(APPLESINGLE_REALNAME_ENTRY, f);
+ write_four(offset, f);
+ write_four(len, f);
+ offset += len;
+
+ /* time entry */
+ write_four(APPLESINGLE_DATES_ENTRY, f);
+ write_four(offset, f);
+ write_four(APPLESINGLE_DATES_LEN, f);
+ offset += APPLESINGLE_DATES_LEN;
+
+ /* finder info entry */
+ write_four(APPLESINGLE_FINDERINFO_ENTRY, f);
+ write_four(offset, f);
+ write_four(APPLESINGLE_FINDERINFO_LEN, f);
+ offset += APPLESINGLE_FINDERINFO_LEN;
+
+ /* resource fork entry */
+ write_four(APPLESINGLE_RFORK_ENTRY, f);
+ write_four(offset, f);
+ write_four(rf_len, f);
+ offset += rf_len;
+
+ /* data fork entry */
+ if (!appledouble) {
+ write_four(APPLESINGLE_DFORK_ENTRY, f);
+ write_four(offset, f);
+ write_four(0, f);
+ }
+
+ /* real name data */
+ fwrite(filename, 1, len, f);
+
+ /* time data */
+ i = time(0) - APPLESINGLE_TIME_DELTA;
+ write_four(i, f); /* creation date */
+ write_four(i, f); /* modification date */
+ write_four(0x80000000, f); /* backup date */
+ write_four(0, f); /* access date */
+
+ /* finder info data */
+ write_four(T1_FILETYPE, f); /* file type */
+ write_four(T1_FILECREATOR, f); /* file creator */
+ write_one(T1_FINDERFLAGS, f); /* finder flags */
+ write_one(0, f); /* extended finder flags */
+ write_two(0, f); /* vertical position in window */
+ write_two(0, f); /* horizontal position in window */
+ write_two(0, f); /* window or folder ID */
+ write_four(0, f); /* icon ID and reserved */
+ write_four(0, f); /* reserved */
+ write_one(0, f); /* script flag */
+ write_one(0, f); /* reserved */
+ write_two(0, f); /* comment ID */
+ write_four(0, f); /* put away */
+
+ /* resource fork data */
+ output_raw(rf, rf_len, f);
+}
+
+
+/* write a BinHex file */
+
+static void
+binhex_buffer(const byte *s, int len, FILE *f)
+{
+ static int col = 1;
+ static int bits = 0;
+ static int bitspos = 2;
+ static const char *table = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
+ byte buf[5];
+ int c, i, left;
+
+ if (!s && bitspos > 2) { /* output the remaining bits */
+ s = (const byte *)"\0";
+ len = 1;
+ }
+
+ for (left = len; left > 0; left--, s++) {
+ int pos;
+ if (s[0] == 0x90) {
+ buf[0] = 0x90;
+ buf[1] = 0x00;
+ pos = 2;
+ } else {
+ buf[0] = s[0];
+ pos = 1;
+ }
+
+ /* find a run */
+ if (left > 2 && s[0] == s[1] && s[0] == s[2]) {
+ for (i = 3; i < left && i < 255; i++)
+ if (s[i] != s[0])
+ break;
+ buf[pos] = 0x90;
+ buf[pos+1] = i;
+ pos += 2;
+ s += i - 1;
+ left -= i - 1;
+ }
+
+ /* store those characters */
+ for (i = 0; i < pos; i++) {
+ bits |= buf[i];
+ while (bitspos >= 0) {
+ c = (bits >> bitspos) & 0x3F;
+ putc(table[c], f);
+ if (++col == 63) {
+ putc('\n', f);
+ col = 0;
+ }
+ bitspos -= 6;
+ }
+ bits <<= 8;
+ bitspos += 8;
+ }
+ }
+}
+
+static void
+output_binhex(FILE *rf, int32_t rf_len, const char *filename, FILE *f)
+{
+ int crc, len = strlen(filename);
+ char buf[2048];
+
+ if (len < 1 || len > 63)
+ fatal_error("filename length must be between 1 and 63");
+ store_one(len, buf+0); /* filename length */
+ memcpy(buf+1, filename, len); /* filename */
+ store_one(0, buf+1+len); /* version */
+ store_four(T1_FILETYPE, buf+2+len); /* file type */
+ store_four(T1_FILECREATOR, buf+6+len); /* file creator */
+ store_one(T1_FINDERFLAGS, buf+10+len); /* finder flags */
+ store_one(0, buf+11+len); /* extended finder flags */
+ store_four(0, buf+12+len); /* length of data fork */
+ store_four(rf_len, buf+16+len); /* length of resource fork */
+ store_two(crcbuf(0, 20+len, buf), buf+20+len); /* CRC */
+ store_two(0, buf+22+len); /* data fork CRC */
+
+ /* output BinHex comment */
+ fputs("(This file must be converted with BinHex 4.0)\n:", f);
+
+ /* BinHex the header */
+ binhex_buffer((const byte *)buf, 24+len, f);
+
+ /* resource fork data */
+ reposition(rf, 0);
+ crc = 0;
+ while (rf_len > 0) {
+ int n = (rf_len < 2048 ? rf_len : 2048);
+ fread(buf, 1, n, rf);
+ crc = crcbuf(crc, n, buf); /* update CRC */
+ binhex_buffer((const byte *)buf, n, f);
+ rf_len -= n;
+ }
+ store_two(crc, buf); /* resource fork CRC */
+ binhex_buffer((const byte *)buf, 2, f);
+ binhex_buffer(0, 0, f); /* get rid of any remaining bits */
+ fputs(":\n", f); /* trailer */
+}
+
+
+/*****
+ * command line
+ **/
+
+#define OUTPUT_OPT 301
+#define VERSION_OPT 302
+#define HELP_OPT 303
+#define MACBINARY_OPT 304
+#define RAW_OPT 305
+#define APPLESINGLE_OPT 306
+#define APPLEDOUBLE_OPT 307
+#define BINHEX_OPT 308
+#define FILENAME_OPT 309
+
+static Clp_Option options[] = {
+ { "appledouble", 0, APPLEDOUBLE_OPT, 0, 0 },
+ { "applesingle", 0, APPLESINGLE_OPT, 0, 0 },
+ { "binhex", 0, BINHEX_OPT, 0, 0 },
+ { "help", 0, HELP_OPT, 0, 0 },
+ { "macbinary", 0, MACBINARY_OPT, 0, 0 },
+ { "filename", 'n', FILENAME_OPT, Clp_ArgString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "raw", 'r', RAW_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+static const char *program_name;
+
+
+void
+fatal_error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+ exit(1);
+}
+
+void
+error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+}
+
+
+void
+short_usage(void)
+{
+ fprintf(stderr, "Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+Try `%s --help' for more information.\n",
+ program_name, program_name);
+}
+
+
+void
+usage(void)
+{
+ printf("\
+`T1mac' translates a PostScript Type 1 font from PFA or PFB format into\n\
+Macintosh Type 1 format. The result can be written in MacBinary II format (the\n\
+default), AppleSingle format, AppleDouble format, or BinHex format, or as a\n\
+raw resource fork. It is sent to the standard output unless an OUTPUT file is\n\
+given.\n\
+\n\
+Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\
+\n\
+Options:\n\
+ -r, --raw Output is a raw Macintosh resource fork.\n\
+ --macbinary Output is in MacBinary format (default).\n\
+ --applesingle Output is in AppleSingle format.\n\
+ --appledouble Output is in AppleDouble format.\n\
+ --binhex Output is in BinHex format.\n\
+ -n, --filename NAME Macintosh font filename will be NAME.\n\
+ -o, --output FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and warranty and exit.\n\
+\n\
+Report bugs to <kohler@icir.org>.\n", program_name);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+int
+main(int argc, char *argv[])
+{
+ int i, c;
+ FILE *ifp = 0, *ofp = 0;
+ const char *ifp_filename = "<stdin>";
+ const char *ofp_filename = "<stdout>";
+ const char *set_font_name = 0;
+ struct font_reader fr;
+ uint32_t rfork_len;
+ int raw = 0, macbinary = 1, applesingle = 0, appledouble = 0, binhex = 0;
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ /* interpret command line arguments using CLP */
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case RAW_OPT:
+ raw = 1;
+ macbinary = applesingle = appledouble = binhex = 0;
+ break;
+
+ case MACBINARY_OPT:
+ macbinary = 1;
+ raw = applesingle = appledouble = binhex = 0;
+ break;
+
+ case APPLESINGLE_OPT:
+ applesingle = 1;
+ raw = macbinary = appledouble = binhex = 0;
+ break;
+
+ case APPLEDOUBLE_OPT:
+ appledouble = 1;
+ raw = macbinary = applesingle = binhex = 0;
+ break;
+
+ case BINHEX_OPT:
+ binhex = 1;
+ raw = macbinary = applesingle = appledouble = 0;
+ break;
+
+ output_file:
+ case OUTPUT_OPT:
+ if (ofp)
+ fatal_error("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ ofp = stdout;
+ else {
+ ofp_filename = clp->arg;
+ ofp = fopen(ofp_filename, "wb");
+ if (!ofp) fatal_error("%s: %s", ofp_filename, strerror(errno));
+ }
+ break;
+
+ case FILENAME_OPT:
+ if (set_font_name)
+ fatal_error("Macintosh font filename already specified");
+ set_font_name = clp->arg;
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("t1mac (LCDF t1utils) %s\n", VERSION);
+ printf("Copyright (C) 2000-2003 Eddie Kohler et al.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (ifp && ofp)
+ fatal_error("too many arguments");
+ else if (ifp)
+ goto output_file;
+ if (strcmp(clp->arg, "-") == 0)
+ ifp = stdin;
+ else {
+ ifp_filename = clp->arg;
+ ifp = fopen(clp->arg, "r");
+ if (!ifp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ short_usage();
+ exit(1);
+ break;
+
+ }
+ }
+
+ done:
+ if (!ifp) ifp = stdin;
+ if (!ofp) ofp = stdout;
+
+#if defined(_MSDOS) || defined(_WIN32)
+ /* As we are processing a PFB (binary) output */
+ /* file, we must set its file mode to binary. */
+ _setmode(_fileno(ofp), _O_BINARY);
+#endif
+
+ /* prepare font reader */
+ fr.output_ascii = t1mac_output_ascii;
+ fr.output_binary = t1mac_output_binary;
+ fr.output_end = t1mac_output_end;
+
+ /* prepare resource fork file */
+ rfork_f = tmpfile();
+ if (!rfork_f)
+ fatal_error("cannot open temorary file: %s", strerror(errno));
+ for (i = 0; i < RFORK_HEADERLEN; i++)
+ putc(0, rfork_f);
+ init_current_post();
+
+ /* peek at first byte to see if it is the PFB marker 0x80 */
+ c = getc(ifp);
+ ungetc(c, ifp);
+
+ /* do the file */
+ if (c == PFB_MARKER)
+ process_pfb(ifp, ifp_filename, &fr);
+ else if (c == '%')
+ process_pfa(ifp, ifp_filename, &fr);
+ else
+ fatal_error("%s does not start with font marker (`%%' or 0x80)", ifp_filename);
+ if (ifp != stdin)
+ fclose(ifp);
+
+ /* check if anything was read */
+ if (nrsrc == 0)
+ error("no POST resources written -- are you sure this was a font?");
+
+ /* output large B/W icon */
+ output_new_rsrc("ICN#", 256, 32, (const char *)icon_bw_data, 256);
+ /* output FREF */
+ output_new_rsrc("FREF", 256, 32, "LWFN\0\0\0", 7);
+ /* output BNDL */
+ output_new_rsrc("BNDL", 256, 32, "T1UT\0\0\0\1FREF\0\0\0\0\1\0ICN#\0\0\0\0\1\0", 28);
+ /* output other icons */
+ output_new_rsrc("icl8", 256, 32, (const char *)icon_8_data, 1024);
+ output_new_rsrc("icl4", 256, 32, (const char *)icon_4_data, 512);
+ output_new_rsrc("ics#", 256, 32, (const char *)small_icon_bw_data, 64);
+ output_new_rsrc("ics8", 256, 32, (const char *)small_icon_8_data, 256);
+ output_new_rsrc("ics4", 256, 32, (const char *)small_icon_4_data, 128);
+ /* output T1UT (signature) */
+ output_new_rsrc("T1UT", 0, 0, "DConverted by t1mac (t1utils) \251Eddie Kohler http://www.lcdf.org/type/", 69);
+
+ /* finish off resource file */
+ rfork_len = complete_rfork();
+
+ /* prepare font name */
+ if (!set_font_name && font_name) {
+ int part = 0, len = 0;
+ char *x, *s;
+ for (x = s = font_name; *s; s++)
+ if (isupper(*s) || isdigit(*s)) {
+ *x++ = *s;
+ part++;
+ len = 1;
+ } else if (islower(*s)) {
+ if (len < (part <= 1 ? 5 : 3))
+ *x++ = *s;
+ len++;
+ }
+ *x++ = 0;
+ set_font_name = font_name;
+ } else if (!set_font_name)
+ set_font_name = "Unknown Font";
+
+ /* now, output the file */
+ if (macbinary)
+ output_macbinary(rfork_f, rfork_len, set_font_name, ofp);
+ else if (raw)
+ output_raw(rfork_f, rfork_len, ofp);
+ else if (applesingle || appledouble)
+ output_applesingle(rfork_f, rfork_len, set_font_name, ofp, appledouble);
+ else if (binhex)
+ output_binhex(rfork_f, rfork_len, set_font_name, ofp);
+ else
+ fatal_error("strange output format");
+ fclose(rfork_f);
+
+ if (ofp != stdout)
+ fclose(ofp);
+ return 0;
+}
diff --git a/Build/source/utils/t1utils/t1unmac.1 b/Build/source/utils/t1utils/t1unmac.1
new file mode 100644
index 00000000000..deb6f252136
--- /dev/null
+++ b/Build/source/utils/t1utils/t1unmac.1
@@ -0,0 +1,71 @@
+.ds V 1.32
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.TH T1UNMAC 1 "" "Version \*V"
+.SH NAME
+t1unmac \- translate a Mac PostScript Type 1 font into PFA or PFB format
+.SH SYNOPSIS
+.B t1unmac
+\%[\fB\-a\fR|\fB\-b\fR]
+\%[\fB\-r\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.B t1unmac
+extracts POST resources from a Macintosh PostScript font file and creates a
+PFA (hexadecimal) or PFB (binary) font file. The file
+.I input
+should be in MacBinary I or II, AppleSingle, AppleDouble, or BinHex format,
+or it can be a raw resource fork. If the file is a raw resource fork, you
+need to give the `\-\-raw' option; otherwise
+.B t1unmac
+should automatically figure out what kind of file you have. If the file
+.I output
+is not specified output goes to the standard output.
+.SH OPTIONS
+.TP 5
+.BR \-\-pfa ", " \-a
+Output in PFA (ASCII) format.
+.TP 5
+.BR \-\-pfb ", " \-b
+Output in PFB (binary) format. This is the default.
+.TP 5
+.BR \-\-raw ", " \-r
+Indicates that the input is a raw resource fork.
+.TP 5
+.BR \-\-macbinary
+Indicates that the input is in MacBinary I or II format.
+.TP 5
+.BR \-\-applesingle
+Indicates that the input is in AppleSingle format.
+.TP 5
+.BR \-\-appledouble
+Indicates that the input is in AppleDouble format.
+.TP 5
+.BR \-\-binhex
+Indicates that the input is in BinHex 4.0 format.
+.TP
+.BI \-\-block\-length= "num\fR, " \-l " num"
+PFB only: Set the maximum output block length to
+.I num.
+The default length is as large as memory allows.
+.TP
+.BI \-\-line\-length= "num\fR, " \-l " num"
+PFA only: Set the maximum length of encrypted lines in the output to
+.I num.
+(These are the lines consisting wholly of hexadecimal digits.) The default
+is 64.
+.SH "SEE ALSO"
+.LP
+.M t1mac 1 ,
+.M t1ascii 1 ,
+.M t1binary 1 ,
+.M t1asm 1 ,
+.M t1disasm 1
+.SH AUTHORS
+Lee Hetherington (ilh@lcs.mit.edu)
+.br
+Eddie Kohler (kohler@icir.org)
+.PP
+Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+Kai-Uwe Herbing (herbing@netmbx.netmbx.de).
diff --git a/Build/source/utils/t1utils/t1unmac.c b/Build/source/utils/t1utils/t1unmac.c
new file mode 100644
index 00000000000..fa2cec2a6f4
--- /dev/null
+++ b/Build/source/utils/t1utils/t1unmac.c
@@ -0,0 +1,923 @@
+/* t1unmac/unpost
+ *
+ * This program converts Macintosh Type 1 fonts stored in MacBinary (I or II),
+ * AppleSingle, AppleDouble, BinHex, or raw resource fork format to PFA and
+ * PFB formats.
+ *
+ * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+ *
+ * Permission is hereby granted to use, modify, and distribute this program
+ * for any purpose provided this copyright notice and the one below remain
+ * intact.
+ *
+ * I. Lee Hetherington (ilh@lcs.mit.edu)
+ *
+ * 1.5 and later versions contain changes by, and are maintained by,
+ * Eddie Kohler <kohler@icir.org>.
+ *
+ * New change log in `NEWS'. Old change log:
+ *
+ * Revision 1.2 92/06/23 10:57:33 ilh
+ * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)
+ * incoporated.
+ *
+ * Revision 1.1 92/05/22 12:07:49 ilh
+ * initial version
+ *
+ * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
+ * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
+ * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
+ * ... #endif, where _MSDOS is an identifier, which is automatically
+ * defined, if you compile with the Microsoft C/C++ Compiler.
+ * */
+
+/* Note: this is ANSI C. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <getopt.h>
+# include <io.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <lcdf/clp.h>
+#include "t1lib.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* for PFB block buffering */
+void fatal_error(const char *message, ...);
+void error(const char *message, ...);
+
+
+/* Some functions to read one, two, three, and four byte integers in 68000
+ byte order (most significant byte first). */
+
+static int
+read_one(FILE *fi)
+{
+ return getc(fi);
+}
+
+static int
+read_two(FILE *fi)
+{
+ int val;
+
+ val = getc(fi);
+ val = (val << 8) | getc(fi);
+
+ return val;
+}
+
+static int32_t
+read_three(FILE *fi)
+{
+ int32_t val;
+
+ val = getc(fi);
+ val = (val << 8) | getc(fi);
+ val = (val << 8) | getc(fi);
+
+ return val;
+}
+
+static int32_t
+read_four(FILE *fi)
+{
+ int32_t val;
+
+ val = getc(fi);
+ val = (val << 8) | getc(fi);
+ val = (val << 8) | getc(fi);
+ val = (val << 8) | getc(fi);
+
+ return val;
+}
+
+/* reposition a file with error messages */
+
+static void
+reposition(FILE *fi, int32_t absolute)
+{
+ if (fseek(fi, absolute, 0) == -1)
+ fatal_error("can't seek to position %d\n\
+ (The Mac file may be corrupted, or you may need the `-r' option.)",
+ absolute);
+}
+
+static int blocklen = -1;
+
+static int hex_column = 0; /* current column of hex ASCII output */
+
+static void
+output_hex_byte(FILE *fo, int b)
+{
+ static const char *hex = "0123456789abcdef";
+
+ if (hex_column >= blocklen) {
+ putc('\n', fo);
+ hex_column = 0;
+ }
+ putc(hex[b >> 4], fo);
+ putc(hex[b & 0xf], fo);
+ hex_column += 2;
+}
+
+/* Function to extract a particular POST resource. Offset points to the four
+ byte length which is followed by the data. The first byte of the POST data
+ specifies resource type: 1 for ASCII, 2 for binary, and 5 for end. The
+ second byte is always zero. */
+
+
+/* Function to write four byte length to PFB file: least significant byte
+ first. */
+
+static int
+extract_data(FILE *fi, FILE *fo, struct pfb_writer *w, int32_t offset, int pfb)
+{
+ enum PS_type { PS_ascii = 1, PS_binary = 2, PS_end = 5 };
+ static int last_type = -1;
+ static int skip_newline = 0;
+ int32_t len;
+ int more = 1;
+ int i, c;
+
+ reposition(fi, offset);
+ len = read_four(fi) - 2; /* subtract type field */
+
+ switch ((enum PS_type)read_one(fi)) {
+
+ case PS_ascii: {
+ (void) read_one(fi);
+ if (last_type != PFB_ASCII && pfb) {
+ pfb_writer_output_block(w);
+ w->blocktyp = PFB_ASCII;
+ }
+ for (i = 0; i < len; i++) {
+ c = read_one(fi);
+ if (c == '\n' && skip_newline) {
+ skip_newline = 0;
+ continue;
+ }
+ if (c == '\r') {
+ c = '\n';
+ skip_newline = 1;
+ } else
+ skip_newline = 0;
+ if (pfb)
+ PFB_OUTPUT_BYTE(w, c);
+ else
+ putc(c, fo);
+ }
+ last_type = PFB_ASCII;
+ break;
+ }
+
+ case PS_binary: {
+ (void) read_one(fi);
+ if (last_type != PFB_BINARY && pfb) {
+ pfb_writer_output_block(w);
+ w->blocktyp = PFB_BINARY;
+ } else if (last_type != PFB_BINARY)
+ hex_column = 0;
+ if (pfb) {
+ while (len--)
+ PFB_OUTPUT_BYTE(w, read_one(fi));
+ } else {
+ while (len--)
+ output_hex_byte(fo, read_one(fi));
+ }
+ last_type = PFB_BINARY;
+ break;
+ }
+
+ case PS_end:
+ more = 0;
+ break;
+
+ }
+
+ return more;
+}
+
+
+/*****
+ * Command line
+ **/
+
+#define OUTPUT_OPT 301
+#define VERSION_OPT 302
+#define HELP_OPT 303
+#define PFB_OPT 304
+#define PFA_OPT 305
+#define MACBINARY_OPT 306
+#define RAW_OPT 307
+#define LINE_LEN_OPT 308
+#define APPLEDOUBLE_OPT 309
+#define BINHEX_OPT 310
+
+static Clp_Option options[] = {
+ { "applesingle", 0, APPLEDOUBLE_OPT, 0, 0 },
+ { "appledouble", 0, APPLEDOUBLE_OPT, 0, 0 },
+ { "binhex", 0, BINHEX_OPT, 0, 0 },
+ { "block-length", 0, LINE_LEN_OPT, Clp_ArgUnsigned, 0 },
+ { "help", 0, HELP_OPT, 0, 0 },
+ { "line-length", 'l', LINE_LEN_OPT, Clp_ArgUnsigned, 0 },
+ { "macbinary", 0, MACBINARY_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ArgString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "raw", 'r', RAW_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+static const char *program_name;
+
+void
+fatal_error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+ exit(1);
+}
+
+void
+error(const char *message, ...)
+{
+ va_list val;
+ va_start(val, message);
+ fprintf(stderr, "%s: ", program_name);
+ vfprintf(stderr, message, val);
+ putc('\n', stderr);
+}
+
+void
+short_usage(void)
+{
+ fprintf(stderr, "Usage: %s [OPTION]... INPUT [OUTPUT]\n\
+Try `%s --help' for more information.\n",
+ program_name, program_name);
+}
+
+void
+usage(void)
+{
+ printf("\
+`T1unmac' extracts a PostScript Type 1 font from a Macintosh font file. It can\n\
+read MacBinary, AppleSingle, AppleDouble, or BinHex files, or raw Macintosh\n\
+resource forks. The result is written to the standard output unless an OUTPUT\n\
+file is given.\n\
+\n\
+Usage: %s [OPTION]... INPUT [OUTPUT]\n\
+\n\
+Options:\n\
+ -r, --raw Input is a raw Macintosh resource fork.\n\
+ --macbinary Input is in MacBinary format.\n\
+ --applesingle Input is in AppleSingle format.\n\
+ --appledouble Input is in AppleDouble format.\n\
+ --binhex Input is in BinHex format.\n\
+ -a, --pfa Output font in ASCII (PFA) format.\n\
+ -b, --pfb Output font in binary (PFB) format. This is\n\
+ the default.\n\
+ -l, --block-length NUM Set max block length for PFB output.\n\
+ -l, --line-length NUM Set max encrypted line length for PFA output.\n\
+ -o, --output FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and warranty and exit.\n\
+\n\
+Report bugs to <kohler@icir.org>.\n", program_name);
+}
+
+
+static const char *
+check_macbinary(FILE *ifp)
+{
+ int i, j;
+ char buf[124];
+
+ /* check "version" bytes at offsets 0 and 74 */
+ reposition(ifp, 0);
+ if (read_one(ifp) != 0)
+ return "bad version byte";
+ reposition(ifp, 74);
+ if (read_one(ifp) != 0)
+ return "bad version byte";
+
+#if 0
+ /* write out bullshit */
+ {int t;
+ reposition(ifp, 65);
+ t = read_four(ifp);
+ fprintf(stderr, "Type %c%c%c%c\n", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255);
+ t = read_four(ifp);
+ fprintf(stderr, "Creator %c%c%c%c\n", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255);
+ t = read_one(ifp);
+ fprintf(stderr, "Finder flags 1 %02x\n", t);
+ read_one(ifp);
+ t = read_two(ifp);
+ fprintf(stderr, "horizpos %04x\n", t);
+ t = read_two(ifp);
+ fprintf(stderr, "vertpos %04x\n", t);
+ t = read_two(ifp);
+ fprintf(stderr, "folder id %d\n", t);
+ t = read_one(ifp);
+ fprintf(stderr, "protected? %x\n", t);
+ t = read_one(ifp);
+ t = read_four(ifp);
+ fprintf(stderr, "data len %d\n", t);
+ t = read_four(ifp);
+ fprintf(stderr, "rsrc len %d\n", t);
+ t = read_four(ifp);
+ {
+ struct tm *crap;
+ fprintf(stderr, "creation date %x\n", t);
+ t -= 2082844800;
+ fprintf(stderr, " %s\n", ctime(&t));
+ t = read_four(ifp);
+ fprintf(stderr, "modification date %x\n", t);
+ t -= 2082844800;
+ fprintf(stderr, " %s\n", ctime(&t));
+ t = read_two(ifp);
+ }
+ fprintf(stderr, "getinfo len %d\n", t);
+ t = read_one(ifp);
+ fprintf(stderr, "finderflags 2 %02x\n", t);
+ reposition(ifp, 116);
+ t = read_four(ifp);
+ fprintf(stderr, "total len %d\n", t);
+ t = read_two(ifp);
+ fprintf(stderr, "secondary header len %d\n", t);
+ t = read_one(ifp);
+ fprintf(stderr, "version %d\n", t);
+ t = read_one(ifp);
+ fprintf(stderr, "version %d\n", t);
+ }
+#endif
+
+ /* check file length */
+ reposition(ifp, 1);
+ i = read_one(ifp);
+ if (i > 63)
+ return "bad length";
+ reposition(ifp, 83);
+ i = read_four(ifp);
+ j = read_four(ifp);
+ if (i < 0 || j < 0 || i >= 0x800000 || j >= 0x800000)
+ return "bad length";
+
+ /* check CRC */
+ reposition(ifp, 0);
+ fread(buf, 1, 124, ifp);
+ if (crcbuf(0, 124, buf) != read_two(ifp)) {
+ reposition(ifp, 82);
+ if (read_one(ifp) != 0)
+ return "bad checksum";
+ }
+
+ return 0;
+}
+
+#define APPLESINGLE_MAGIC 0x00051600
+#define APPLEDOUBLE_MAGIC 0x00051607
+
+const char *
+check_appledouble(FILE *ifp)
+{
+ int i;
+ reposition(ifp, 0);
+ i = read_four(ifp);
+ if (i != APPLEDOUBLE_MAGIC && i != APPLESINGLE_MAGIC)
+ return "bad magic number";
+
+ return 0;
+}
+
+const char *
+translate_binhex(FILE *f, FILE *tmpf)
+{
+ int i, c = 0, last_char, after_x90, bits, bitpos;
+ unsigned char value_table[256];
+
+ /* prepare value table */
+ {
+ const char *table = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
+ for (i = 0; i < 256; i++)
+ value_table[i] = 255;
+ for (i = 0; *table; i++, table++)
+ value_table[(unsigned char)*table] = i;
+ }
+
+ /* skip to comment */
+ {
+ const char *comment = "(This file must be converted with BinHex";
+ while (!feof(f)) {
+ const char *s;
+ for (s = comment; *s; s++) {
+ c = getc(f);
+ if (c != *s)
+ break;
+ }
+ /* skip to end of line */
+ while (c >= 0 && c != '\n' && c != '\r')
+ c = getc(f);
+ /* stop if read comment */
+ if (!*s)
+ goto found_comment;
+ }
+ /* failed */
+ return "no comment";
+ }
+
+ found_comment:
+ /* skip spaces, look for ':' */
+ for (c = ' '; isspace(c); c = getc(f)) ;
+ if (c != ':')
+ return "no file-start character";
+
+ /* found ':', process until you find another ':' */
+ last_char = -1;
+ after_x90 = bits = 0;
+ bitpos = 10;
+ for (c = getc(f); c >= 0; c = getc(f))
+ if (!isspace(c)) {
+ /* add 6 bits to bits */
+ if (value_table[c] == 255)
+ break;
+ bits |= (value_table[c] << bitpos);
+ bitpos -= 6;
+
+ /* output character(s) */
+ if (bitpos <= 2) {
+ int d = bits >> 8;
+ bits = (bits << 8) & 0xFF00;
+ bitpos += 8;
+ if (after_x90) {
+ /* handle compression */
+ if (d == 0) {
+ last_char = 0x90;
+ putc(0x90, tmpf);
+ } else
+ for (i = 1; i < d; i++)
+ putc(last_char, tmpf);
+ after_x90 = 0;
+ } else if (d == 0x90)
+ after_x90 = 1;
+ else {
+ last_char = d;
+ putc(d, tmpf);
+ }
+ }
+ }
+
+ if (c < 0)
+ return "unexpected EOF";
+ else if (c != ':')
+ return "bad character";
+
+ fflush(tmpf);
+ return 0;
+}
+
+int
+check_binhex_crc(FILE *f, int offset, int length)
+{
+ int crc = 0;
+ char buf[2048];
+ reposition(f, offset);
+ while (length > 0) {
+ int n = (length < 2048 ? length : 2048);
+ fread(buf, 1, n, f);
+ crc = crcbuf(crc, n, buf);
+ length -= n;
+ }
+ return crc == 0;
+}
+
+const char *
+check_binhex(FILE *f)
+{
+ int fname_len, data_len, rsrc_len, off;
+
+ /* check lengths */
+ reposition(f, 0);
+ fname_len = read_one(f);
+ if (fname_len < 1 || fname_len > 63)
+ return "bad length";
+ reposition(f, 1 + fname_len + 11);
+ data_len = read_four(f);
+ rsrc_len = read_four(f);
+ if (data_len < 0 || rsrc_len < 0 || data_len >= 0x800000 || rsrc_len >= 0x800000)
+ return "bad length";
+
+ /* check version */
+ reposition(f, 1 + fname_len);
+ if (read_one(f) != 0)
+ return "bad version";
+
+ /* check CRC */
+ off = 1 + fname_len + 21;
+ if (!check_binhex_crc(f, 0, off))
+ return "bad header CRC";
+ if (!check_binhex_crc(f, off, data_len + 2))
+ return "bad data CRC";
+ if (!check_binhex_crc(f, off + data_len + 2, rsrc_len + 2))
+ return "bad resource fork CRC";
+
+ return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+int
+main(int argc, char *argv[])
+{
+ FILE *ifp = 0;
+ FILE *ofp = 0;
+ struct pfb_writer w;
+ const char *ifp_name = "<stdin>";
+ int32_t res_offset, res_data_offset, res_map_offset, type_list_offset;
+ int32_t post_type;
+ int num_types, num_extracted = 0, pfb = 1;
+ int raw = 0, appledouble = 0, binhex = 0, macbinary = 0;
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ /* interpret command line arguments using CLP */
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case RAW_OPT:
+ raw = 1;
+ appledouble = binhex = macbinary = 0;
+ break;
+
+ case MACBINARY_OPT:
+ macbinary = 1;
+ raw = appledouble = binhex = 0;
+ break;
+
+ case APPLEDOUBLE_OPT:
+ appledouble = 1;
+ raw = binhex = macbinary = 0;
+ break;
+
+ case BINHEX_OPT:
+ binhex = 1;
+ raw = appledouble = macbinary = 0;
+ break;
+
+ output_file:
+ case OUTPUT_OPT:
+ if (ofp)
+ fatal_error("output file already specified");
+ if (strcmp(clp->arg, "-") == 0)
+ ofp = stdout;
+ else {
+ ofp = fopen(clp->arg, "w");
+ if (!ofp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case PFB_OPT:
+ pfb = 1;
+ break;
+
+ case PFA_OPT:
+ pfb = 0;
+ break;
+
+ case LINE_LEN_OPT:
+ blocklen = clp->val.i;
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("t1unmac (LCDF t1utils) %s\n", VERSION);
+ printf("Copyright (C) 1992-2003 I. Lee Hetherington, Eddie Kohler et al.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (ifp && ofp)
+ fatal_error("too many arguments");
+ else if (ifp)
+ goto output_file;
+ if (strcmp(clp->arg, "-") == 0)
+ ifp = stdin;
+ else {
+ ifp_name = clp->arg;
+ ifp = fopen(clp->arg, "rb");
+ if (!ifp) fatal_error("%s: %s", clp->arg, strerror(errno));
+ }
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ short_usage();
+ exit(1);
+ break;
+
+ }
+ }
+
+ done:
+ if (!ifp) ifp = stdin;
+ if (!ofp) ofp = stdout;
+
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(ifp), _O_BINARY);
+ /* If we are processing a PFB (binary) output */
+ /* file, we must set its file mode to binary. */
+ if (pfb)
+ _setmode(_fileno(ofp), _O_BINARY);
+#endif
+
+ if (pfb)
+ init_pfb_writer(&w, blocklen, ofp);
+ else {
+ if (blocklen == -1)
+ blocklen = 64;
+ else if (blocklen < 8) {
+ blocklen = 8;
+ error("warning: line length raised to %d", blocklen);
+ } else if (blocklen > 1024) {
+ blocklen = 1024;
+ error("warning: line length lowered to %d", blocklen);
+ }
+ }
+
+ /* check for non-seekable input */
+ if (fseek(ifp, 0, 0)) {
+ char buf[2048];
+ FILE *tmp = tmpfile();
+ if (!tmp)
+ fatal_error("cannot open temporary file: %s", strerror(errno));
+ while (!feof(ifp)) {
+ int i = fread(buf, 1, 2048, ifp);
+ if (i > 0)
+ fwrite(buf, 1, i, tmp);
+ }
+ if (ferror(ifp))
+ fatal_error("%s: %s", ifp_name, strerror(errno));
+ reposition(tmp, 0);
+ fflush(tmp);
+ if (ifp != stdin)
+ fclose(ifp);
+ ifp = tmp;
+ }
+
+ /* check for empty file */
+ fseek(ifp, 0, 2);
+ if (ftell(ifp) == 0)
+ fatal_error("%s: empty file\n\
+ (Try re-transferring the files using MacBinary format.)",
+ ifp_name);
+
+ reposition(ifp, 0);
+ if (!raw && !appledouble && !binhex && !macbinary) {
+ /* check magic number, try to figure out what it is */
+ int i, magic;
+ magic = read_four(ifp);
+ reposition(ifp, 0);
+
+ if (magic == APPLESINGLE_MAGIC || magic == APPLEDOUBLE_MAGIC)
+ appledouble = 1;
+ else if ((magic & 0xFF000000) == 0)
+ macbinary = 1;
+ else {
+ binhex = 1;
+ for (i = 0; i < 4; i++, magic >>= 8)
+ if (!isprint(magic & 0xFF) && !isspace(magic & 0xFF))
+ /* not an ASCII character, assume not BinHex */
+ binhex = 0;
+ }
+
+ if (!appledouble && !macbinary && !binhex)
+ fatal_error("%s: unknown file type", ifp_name);
+ }
+
+ if (raw) {
+ /* raw resource file */
+ res_offset = 0;
+
+ } else if (macbinary) { /* MacBinary (I or II) file */
+ const char *check;
+ int32_t data_fork_size;
+
+ /* check integrity of file */
+ check = check_macbinary(ifp);
+ if (check)
+ fatal_error("%s: not a MacBinary file (%s)", ifp_name, check);
+
+ /* read data and resource fork sizes in MacBinary header */
+ reposition(ifp, 83);
+ data_fork_size = read_four(ifp);
+ (void) read_four(ifp);
+
+ /* round data_fork_size up to multiple of 128 */
+ if (data_fork_size % 128)
+ data_fork_size += 128 - data_fork_size % 128;
+
+ res_offset = 128 + data_fork_size;
+
+ } else if (appledouble) { /* AppleDouble file */
+ const char *check;
+ const char *applewhat;
+ int i, n;
+
+ /* check integrity */
+ check = check_appledouble(ifp);
+ if (check)
+ fatal_error("%s: not an AppleDouble file (%s)", ifp_name, check);
+ reposition(ifp, 0);
+ if (read_four(ifp) == APPLESINGLE_MAGIC)
+ applewhat = "AppleSingle";
+ else
+ applewhat = "AppleDouble";
+
+ /* find offset to resource and/or data fork */
+ reposition(ifp, 24);
+ n = read_two(ifp);
+ res_offset = -1;
+ for (i = 0; i < n; i++) {
+ int type = read_four(ifp);
+ if (type == 0)
+ fatal_error("%s: bad %s file (bad entry descriptor)", ifp_name, applewhat);
+ if (type == 2) /* resource fork entry */
+ res_offset = read_four(ifp);
+ else
+ (void) read_four(ifp);
+ (void) read_four(ifp);
+ }
+ if (res_offset < 0)
+ fatal_error("%s: bad %s file (no resource fork)", ifp_name, applewhat);
+
+ } else if (binhex) { /* BinHex file */
+ const char *check;
+ FILE *tmpf = tmpfile();
+ if (!tmpf)
+ fatal_error("cannot open temporary file: %s", strerror(errno));
+
+ /* check integrity */
+ check = translate_binhex(ifp, tmpf);
+ if (check)
+ fatal_error("%s: not a BinHex file (%s)", ifp_name, check);
+ check = check_binhex(tmpf);
+ if (check)
+ fatal_error("%s: bad BinHex file (%s)", ifp_name, check);
+
+ /* find resource offset */
+ reposition(tmpf, 0);
+ res_offset = read_one(tmpf);
+ reposition(tmpf, 1 + res_offset + 11);
+ res_offset += 22 + read_four(tmpf) + 2;
+ if (ifp != stdin)
+ fclose(ifp);
+ ifp = tmpf;
+
+ } else {
+ fatal_error("%s: strange format", ifp_name);
+ exit(1);
+ }
+
+ /* read offsets from resource fork header */
+ reposition(ifp, res_offset);
+ res_data_offset = res_offset + read_four(ifp);
+ res_map_offset = res_offset + read_four(ifp);
+
+ /* read type list offset from resource map header */
+ reposition(ifp, res_map_offset + 24);
+ type_list_offset = res_map_offset + read_two(ifp);
+
+ /* read type list */
+ reposition(ifp, type_list_offset);
+ num_types = read_two(ifp) + 1;
+
+ /* find POST type */
+ post_type = (int32_t)('P' & 0xff) << 24;
+ post_type |= (int32_t)('O' & 0xff) << 16;
+ post_type |= (int32_t)('S' & 0xff) << 8;
+ post_type |= (int32_t)('T' & 0xff);
+
+ while (num_types--) {
+ if (read_four(ifp) == post_type) {
+ int nrsrc = 1 + read_two(ifp);
+ int list_offset = type_list_offset + read_two(ifp);
+ int rsrc_pos = 0;
+ int want_id = 501;
+ int second_time = 1;
+ reposition(ifp, list_offset);
+ /* read resources sequentially, starting with ID 501, until we encounter
+ an "end" resource or we can't find the next resource */
+ while (rsrc_pos < nrsrc) {
+ int offset = ftell(ifp);
+ int id = read_two(ifp);
+ if (id == want_id) {
+ (void) read_two(ifp);
+ (void) read_one(ifp);
+ num_extracted++;
+ if (!extract_data(ifp, ofp, &w, res_data_offset + read_three(ifp), pfb))
+ break;
+ second_time = 0;
+ want_id++;
+ }
+ reposition(ifp, offset + 12);
+ rsrc_pos++;
+ if (rsrc_pos >= nrsrc && !second_time) {
+ reposition(ifp, list_offset);
+ rsrc_pos = 0;
+ }
+ }
+ break;
+ } else {
+ (void) read_two(ifp);
+ (void) read_two(ifp);
+ }
+ }
+
+#if 0
+ system("/bin/rm -f /tmp/x.*");
+ {
+ FILE *f;
+ int i;
+ reposition(ifp, res_offset + 16);
+ if ((f = fopen("/tmp/x.systemarea", "wb"))) {
+ for (i = res_offset + 16; i < res_data_offset; i++) {
+ putc(getc(ifp), f);
+ }
+ fclose(f);
+ }
+ }
+ reposition(ifp, type_list_offset);
+ num_types = read_two(ifp) + 1;
+ while (num_types--) {
+ int t = read_four(ifp);
+ int num_of_type = 1 + read_two(ifp);
+ int32_t save_offset = ftell(ifp) + 2;
+ reposition(ifp, type_list_offset + read_two(ifp));
+ while (num_of_type--) {
+ FILE *f;
+ char buf[2048];
+ int x, i, attrs;
+ x = ftell(ifp);
+ i = read_two(ifp); /* ID */
+ read_two(ifp);
+ attrs = read_one(ifp);
+ sprintf(buf, "/tmp/x.%c%c%c%c.%d", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255, i);
+ fprintf(stderr, "%c%c%c%c.%d %d", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255, i, attrs);
+ if ((f = fopen(buf, "wb"))) {
+ int l;
+ reposition(ifp, res_data_offset + read_three(ifp));
+ l = read_four(ifp);
+ fprintf(stderr, " %d\n", l);
+ while (l > 0) {
+ int n = (l < 2048 ? l : 2048);
+ fread(buf, 1, n, ifp);
+ fwrite(buf, 1, n, f);
+ l -= n;
+ }
+ fclose(f);
+ }
+ reposition(ifp, x + 12);
+ }
+ reposition(ifp, save_offset);
+ }
+#endif
+
+ if (pfb)
+ pfb_writer_end(&w);
+ if (num_extracted == 0)
+ error("%s: not a Type 1 font (no POST resources)", ifp_name);
+
+ fclose(ifp);
+ fclose(ofp);
+ return 0;
+}
diff --git a/Build/source/utils/t1utils/t1utils.spec b/Build/source/utils/t1utils/t1utils.spec
new file mode 100644
index 00000000000..455e3cfe371
--- /dev/null
+++ b/Build/source/utils/t1utils/t1utils.spec
@@ -0,0 +1,53 @@
+Summary: Programs for manipulating PostScript Type 1 fonts
+
+Name: t1utils
+Version: 1.32
+Release: 1
+Source: http://www.lcdf.org/type/t1utils-1.32.tar.gz
+
+URL: http://www.lcdf.org/type/
+
+Group: Utilities/Printing
+Vendor: Little Cambridgeport Design Factory
+Packager: Eddie Kohler <kohler@icir.org>
+License: freely modifiable and distributable
+
+BuildRoot: /tmp/t1utils-build
+
+%description
+The t1utils package is a set of programs for
+manipulating PostScript Type 1 fonts. It contains
+programs to change between binary PFB format (for
+storage), ASCII PFA format (for printing), a
+human-readable and -editable ASCII format, and
+Macintosh resource forks.
+
+%prep
+%setup
+
+%build
+%configure
+make
+
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && [ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+%clean
+[ "$RPM_BUILD_ROOT" != "/" ] && [ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%attr(-,root,root) %doc NEWS README
+%attr(0755,root,root) %{_bindir}/t1ascii
+%attr(0755,root,root) %{_bindir}/t1binary
+%attr(0755,root,root) %{_bindir}/t1asm
+%attr(0755,root,root) %{_bindir}/t1disasm
+%attr(0755,root,root) %{_bindir}/t1unmac
+%attr(0755,root,root) %{_bindir}/t1mac
+%attr(0644,root,root) %{_mandir}/man1/t1ascii.1*
+%attr(0644,root,root) %{_mandir}/man1/t1binary.1*
+%attr(0644,root,root) %{_mandir}/man1/t1asm.1*
+%attr(0644,root,root) %{_mandir}/man1/t1disasm.1*
+%attr(0644,root,root) %{_mandir}/man1/t1unmac.1*
+%attr(0644,root,root) %{_mandir}/man1/t1mac.1*
diff --git a/Build/source/utils/texi2html/AUTHORS b/Build/source/utils/texi2html/AUTHORS
new file mode 100644
index 00000000000..1703eca32bb
--- /dev/null
+++ b/Build/source/utils/texi2html/AUTHORS
@@ -0,0 +1,5 @@
+Lionel Cons, Karl Berry, Olaf Bachmann, Karl-Heinz Marbaise (texi2html
+manual) and many others.
+
+Images in the images directory come from the Singular project:
+http://www.singular.uni-kl.de/
diff --git a/Build/source/utils/texi2html/COPYING b/Build/source/utils/texi2html/COPYING
new file mode 100644
index 00000000000..d60c31a97a5
--- /dev/null
+++ b/Build/source/utils/texi2html/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/utils/texi2html/ChangeLog b/Build/source/utils/texi2html/ChangeLog
new file mode 100644
index 00000000000..85721988da1
--- /dev/null
+++ b/Build/source/utils/texi2html/ChangeLog
@@ -0,0 +1,2180 @@
+2005-02-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: don't use exists for reference in an array, for
+ old perl. Report from Sven de Vries.
+ * T2h_i18n.pm: remove useless use that prevented to run on IRIX.
+ Report from ezra peisach.
+ * Tests/*: remove some $Id: ChangeLog,v 1.179 2005/02/04 00:14:39 pertusus Exp $ rcs tags
+
+2005-02-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: require perl 5.00405 for File::Spec (report from
+ Ezra peisach).
+
+2005-02-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: don't use open with three args, use binmode (for
+ old perl, reported by Sven de Vries).
+ * doc/Makefile.am: rebuild the manual based on the sources, not
+ on the script, as it is remade by ./configure. Use the rebuild
+ of the manual as a check target (ideas from Derek).
+ * Tests/*: test for results with USE_UNICODE set to 0.
+
+2005-02-01 Derek Price <derek@ximbiot.com>
+
+ * configure.ac: Revert most of the PERL change.
+
+2005-02-01 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, examples/chm.init: remove our keywords for old
+ perl (reported by Sven de Vries).
+
+2005-02-01 Derek Price <derek@ximbiot.com>
+
+ * Makefile.am (EXTRA_DIST): Include missing-texi2html.
+
+2005-02-01 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Note that Perl is no longer required to build.
+ * configure.ac: Don't search for texinfo programs handled by Automake.
+ Declare PERL a precious var. Exit when not found and not set. Warn
+ when set to a relative path.
+ * missing-texi2html, doc/texi2html.html: New files.
+ * doc/.cvsignore: Add more intermediate files.
+ * doc/Makefile.am: Remove targets autogenerated by Automake.
+ (EXTRA_DIST): Distribute texi2html.html.
+ (texi2html.html): Call texi2html via missing-texi2html.
+
+2005-01-31 Derek Price <derek@ximbiot.com>
+
+ * configure.in, NEWS: Update for development.
+ * configure.in: Rename to...
+ * configure.ac: ...this, to match current Autoconf standards.
+
+2005-01-31 Derek Price <derek@ximbiot.com>
+
+ * configure.in, NEWS: Update for the 1.74 release.
+
+2005-01-16 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: more robust handling of deffn lines.
+ The argument may be in bracket, therefore there is no difference
+ beteen arg and other item specification for def like commands.
+ * Tests: test for more deffn lines, and for @-commands in floats.
+ * doc/texi2html.texi: update.
+
+2005-01-16 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: close quotes within html elements. Apply commands
+ to @item lines in table after leading and trailing spaces removal.
+ * Tests: regenerate.
+
+2005-01-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: handle explicitely formats that don't
+ trigger paragraph opening. Handle all commands even those that aren't
+ used. End lines more correctly.
+
+2004-12-29 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Date the 1.72 release.
+
+2004-12-29 Derek Price <derek@ximbiot.com>
+
+ * configure.in: Update for 1.72 release.
+ * Makefile.in, aclocal.m4, configure, Tests/Makefile.in,
+ doc/Makefile.in, doc/stamp-vti, doc/version.texi: Regenerated.
+
+2004-12-29 Derek Price <derek@ximbiot.com>
+
+ * README: Remove obsolete note about using shar for binary attachments
+ to mailing lists.
+
+2004-12-29 Derek Price <derek@ximbiot.com>
+
+ * config.guess, config.sub: New files from Automake.
+
+2004-12-13 Patrice Dumas <dumas@centre-cired.fr>
+
+ * INTRODUCTION, README: update with dev mailing list. Advertise the
+ manual as being rather complete.
+ * Makefile.am,Makefile.in: build in . before doc, as texi2html is
+ needed to rebuild the doc.
+
+2004-12-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init,examples/roff.init,examples/html32.init,
+ examples/inlinestyle.init,NEWS: add support for @euro, @sansserif.
+ * Tests: test for @euro, @sansserif, deff arguments with braces
+ appearing within the argument (and not at the beginning). Sync.
+
+2004-12-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: internal targets and targets of
+ cross refs are valid as XML identifiers. This is compatible with the
+ updated specification presented in the texinfo manual in the node
+ HTML Xref.
+ * doc,Tests: sync.
+
+2004-11-22 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: handle right deff arguments with braces appearing
+ within the argument (and not at the beginning).
+
+2004-10-08 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: add a mail address to the --help screen (idea from
+ Karl Berry).
+
+2004-10-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * configure.in: add the lines asked for by Thomas Esser for addition
+ to teTeX.
+ * Makefile.in...: regenerate with automake 1.9.1.
+
+2004-10-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Makefile.am: use $(PERL) and $(srcdir) in manage_i18n.pl rule
+ (idea of Karl Berry).
+
+2004-08-13 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: Cross refs are done according to the
+ specification presented in the texinfo manual in the node HTML Xref.
+ The "external source of information" is also used although it isn't
+ formally part of the specification.
+ Handle novalidate better.
+ * Tests: sync.
+
+2004-08-07 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: handle @slanted and @abbr.
+
+2004-06-27 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, T2h_i18n.pm, manage_i18n.pl: Re enable compatibility
+ with perl older that 5.6, by changing most of our to use vars, and
+ some other to my.
+
+2004-06-13 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: split close_stack in 2, one for the last pass the other
+ for the previous passes.
+ Simplification of the code handling paragraph closing.
+ More macros don't begin paragraphs.
+ Pass opened commands through @tab and @item.
+ Every @def* is considered to have arguments.
+ continue the @def* line if there is a @ at the end line.
+ * texi2html.pl, texi2html.init: Handle @float, @listoffloats,
+ @caption, @shortcaption,
+ @ordf, @ordm, @registeredsymbol, @deftypecv, @LaTeX, @indicateurl,
+ @docbook, @ifdocbook, @ifnotdocbook,
+ @comma, @headitem, @quotation second arg, @acronym second arg.
+ @url is now a synonym for @uref.
+ * doc/texi2html.texi: bring up-to-date.
+
+2004-04-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * T2h_i18n.pl, texi2html.pl: pass the state to the internationalized
+ strings if needed.
+
+2004-04-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, texi2html.pl: generate unformatted text with
+ text protected and %unformatted_text_* hashs used.
+ use unformatted text in <title> element.
+ put preparation of special styles in texi2html.init.
+ copying_comment formats the copying comment.
+
+2004-04-26 Patrice Dumas <dumas@centre-cired.fr>
+
+ * example/book.init: stick to the same style for manual not split at
+ node.
+ * texi2html.pl: handle better @today even in non english cases.
+ don't use (encoding) in open, but set it in binmode (perl seems
+ unhappy otherwise ?).
+ * texi2html.init: don't enclose paragraph in <p> when it is the first
+ paragraph of enumerate or itemize, as the <li> is allready something
+ like a begining of paragraph.
+
+2004-03-25 Derek Price <derek@ximbiot.com>
+
+ * .cvsignore: Ignore texi2html.spec.
+
+2004-03-25 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Add section for 1.72.
+ * configure.in: Update to dev version 1.71. Generate texi2html.spec.
+ * texi2html.spec: Move this file...
+ * texi2html.spec.in: ...here and replace some strings with text
+ generated by configure.
+ * Makefile.in, configure, doc/stamp-vti, doc/version.texi: Regenerated.
+
+2004-03-24 Patrice Dumas <dumas@centre-cired.fr>
+
+ * NEWS: fill 1.70 section.
+ * configure.in, texi2html.spec: update version.
+ * Makefile.in: regenerate, now it doesn't want config.guess.
+
+2004-03-23 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Makefile.am, texi2html.spec: add a spec file usefull to build
+ a rpm.
+ * doc/Makefile.am: install texi2html.html in $(datadir)/texinfo/html
+ as discussed on the texinfo/automake mailing lists.
+
+2004-03-22 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: get language files before testing for language hash.
+ * Makefile.am: add a rule for translations.pl.
+
+2004-03-20 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Add section for 1.70 release.
+ * configure.in: Update for 1.69 dev version.
+ * configure: Regenerated.
+
+2004-03-20 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Add date to 1.68 release.
+
+2004-03-20 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Update Automake & Autoconf versions in developer info section.
+
+2004-03-20 Derek Price <derek@ximbiot.com>
+
+ * .cvsignore: Ignore the distribution archives.
+ * Makefile.am (texi2html_SOURCES): Add and use to avoid having to
+ maintain two lists of files.
+ * configure.in: Update to version 1.68 for release.
+ * Makefile.in, configure: Regenerated.
+ * doc/stamp-vti, doc/version.texi: Regenerated.
+
+2004-02-26 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: change $DOCUMENTDESCRIPTION to
+ $DOCUMENT_DESCRIPTION for consistency.
+ if $ENCODING is '' don't put it in the headers.
+ add a new entry to $Texi2HTML::THISDOC: 'title_texi', the title
+ with texinfo @-commands.
+ * examples/chm.init: don't convert to utf8 in the html files
+ generated (unless the encoding is really utf8), but produce
+ utf8 in hhc, hhk and hhp files whatever the encoding is.
+ * doc/texi2html.texi: update.
+
+2004-02-23 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Makefile.am: ask for a version above 1.7 for automake.
+ * Makefile.in...: regenerate with automake 1.8.2 autoconf 2.59.
+ * texi2tml.pl, texi2html.init, examples/chm.init: add a new variable
+ $DOCUMENTDESCRIPTION. If it is undef, @documentdescription is used
+ or the long title. If it is set but empty no description <meta> element
+ is used, if it isn't empty, the value is used in the description
+ <meta> element.
+
+2004-02-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Makefile.am: add T2h_i18n.pm texi2html.init MySimple.pm and l2h.init
+ to the distribution.
+
+2004-02-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: use the manual name (file basename) as default output
+ directory when split.
+ * NEWS, Tests/test.sh: update.
+
+2004-02-11 Derek Price <derek@ximbiot.com>
+
+ * Tests/GermanNodeTest/.cvsignore, Tests/index_table/.cvsignore,
+ Tests/macros/.cvsignore, Tests/sectionning/.cvsignore,
+ Tests/ccvs/.cvsignore, Tests/nodes_texinfo/.cvsignore,
+ Tests/texi2html/.cvsignore, Tests/texinfo/.cvsignore,
+ Tests/viper/.cvsignore, Tests/viper_monolithic/.cvsignore,
+ Tests/xemacs/.cvsignore, Tests/xemacs_frame/.cvsignore,
+ Tests/formatting/.cvsignore: New files to suppress warnings about files
+ created by the test scripts.
+
+2004-02-11 Derek Price <derek@ximbiot.com>
+
+ * Makefile.am (bin_PROGRAMS): Move...
+ (bin_SCRIPTS): ...here.
+ (texi2html_SOURCES): Remove unused variable.
+
+2004-02-10 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: put the code related with cross references in the
+ main namespace.
+ * Makefile.am: remove T2h_unicode.pm, T2h_nounicode.pm.
+
+2004-02-10 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: put cross manual reference and unicode related
+ functions in the main program (instead of T2h_unicode.pm,
+ T2h_nounicode.pm).
+ Don't add no-... options when there are allready the options added.
+ * T2h_unicode.pm, T2h_nounicode.pm: remove.
+
+2004-02-07 Patrice Dumas <dumas@centre-cired.fr>
+
+ * T2h_unicode.pm, T2h_nounicode.pm: make global variables lexical
+ variables.
+ * texi2html.init: output header if there is only one section.
+ * Tests/: more tests for the new cross references scheme.
+ * doc/: use a newer texinfo.tex. Be texi2dvi friendly.
+ * Tests/Makefile.am: comment out check-local, it isn't ready.
+
+2004-02-06 Derek Price <derek@ximbiot.com>
+
+ * T2h_unicode.pm, T2h_nounicode.pm: Declare some otherwise undeclared
+ variables as global variables.
+
+2004-02-06 Derek Price <derek@ximbiot.com>
+
+ * doc/Makefile.am (txt): New targets to convert .texinfo files into
+ text.
+ * doc/.cvsignore: Ignore texi2html.txt.
+
+2004-02-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, T2h_unicode.pm, T2h_nounicode.pm:
+ when called with --test, @today value is fixed.
+ Find the relative path leading back to the current directory from
+ the output directory, such that the path to the image files are right.
+ Use a ref on the Texi2HTML::Config hashes such that changing the
+ hash used is easy. This is used in T2h_unicode.pm and
+ T2h_nounicode.pm for expansion of nodes in external refs.
+ Add special styles early.
+ A new variable NEW_CROSSREF_STYLE. If true the new scheme for html
+ cross refs proposed onthe texinfo list is used for @ref.
+ * Tests/formatting/test_refs.texi, Tests/formatting/cross_refs.init:
+ new files used to test the new cross ref scheme.
+
+2004-02-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: call the $index_summary_file_*
+ function references for all the indices, even those not printed.
+ * examples/chm.init: enhancements based on the Peter Verhás
+ implementation (t2h.pl) and languages codes based on the docbook
+ xslt.
+
+2004-02-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: add $EXTENSION variable, holding
+ the extension for files.
+ Add $Texi2HTML::THISDOC{'file_base_name'} and
+ $Texi2HTML::THISDOC{'destination_directory'} such that it is possible
+ to construct file and directory names in init files.
+ Add $finish_out function reference called at the end of document
+ outputting.
+ Add $index_summary_file_begin and $index_summary_file_end to ease
+ special index files generation.
+ * examples/noheaders.init: perform better when split.
+ * examples/chm.init: new init file to generate chm files (after
+ compilation by a windows application, leads to windows help files).
+ After José Fonseca (jrfonseca at users dot berlios dot de) work on
+ an older texi2html.
+ * l2h.init: Set NO_SUBDIRS to 1, don't set html version.
+
+2004-01-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: reopen styles in preformatted environments.
+ When there is a complex format or a table or the like the opened
+ styles are kept such that they are reopened when there is a paragraph
+ or a preformatted within the format.
+ * T2h_unicode.pm: use the right code point for dotless i.
+ * Tests/*: add tests for formats imbricated in style command.
+ add tests for latin1 and utf8 encoded files.
+ add tests for ifset and ifclear in macros.
+ * Makefile.am: add the new source files and init files.
+
+2004-01-25 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, T2h_unicode.pm, T2h_nounicode.pm:
+ Handle encodings.
+ It is possible to customize what is outputted in string context, when
+ removing texinfo commands.
+ Handle @email and @image better in string context.
+ Use unicode instead of utf8 in variable names when it is really
+ unicode.
+ cross_manual_links is done in Texi2HTML::Config in T2h_unicode.pm
+ in case the perl version is above 5.8, in T2h_nounicode.pm otherwise.
+ add @NODE_FOOTER_BUTTONS for buttons at the footer of nodes.
+ Add two more function references, element_file_name and node_file_name
+ used to customize the file names.
+ Don't warn when the character is not a precomposed unicode character,
+ as it is possible to have totally valid character, not precomposed.
+ Use us-ascii as default charset encoding.
+ * examples/book.init: an init file based on the scriptbasic manuals
+ file which formats manuals like books (no menu but tables of
+ contents for the element under each element).
+ * examples/utf8.init: use utf8 in strings.
+ * doc/texi2html.texi: document the new elements of the interface.
+
+
+2004-01-19 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, examples/*: New variables $DO_CONTENTS
+ and $DO_SCONTENTS, $OPEN_QUOTE_SYMBOL and $CLOSE_QUOTE_SYMBOL.
+ Use a hash for the files such that each element may be associated with
+ any file name and written down to that file. This should enable
+ customization of the file names.
+ print_Top_header and print_Top_footer are called from the main program.
+ Add Texi2HTML::THIS_ELEMENT holding the current element structure.
+
+ * doc/texi2html.texi: document the new variables and the new interface
+ with a hash reference for style @-commands.
+
+2004-01-12 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: --- and `` are kept in first arg of
+ uref and email
+
+2004-01-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: parse arguments separated with , in
+ main program.
+ Use a new interface for style commands with a hash instead of a string.
+ The old interface is still available.
+ Give a type to the style_map commands (accent, style, simple or
+ special).
+ Normalise spaces for @url, @uref and @email.
+ Handle better ignored regions end (at end of file or before @).
+ Don't reinject @-commands after closing paragraphs.
+ Add a hash for commands if paragraphs should not be done in these
+ commands.
+
+2004-01-04 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: handle @flushleft and @flushright
+ like normal formats and do something special at the end of line
+ for @center.
+ Put the @-command name in the paragraph_style stack (not the align
+ attribute).
+ use a new function reference init_out instead of set_buttons_text
+ and set_body_text, called just before the outputting is done.
+ Handle a lower level element appearing before a higher level element.
+ * texi2html.pl, examples: call or prepare for calling of ascii_accents
+ instead of rewriting the function each time.
+ * examples/utf8.init: prepare for transcoding in utf8.
+ * Tests/sectionning/section_before_chapter.texi: test for sectionning
+ element before chapter.
+
+2003-12-16 Peter Pentchev <roam@ringlet.net>
+
+ * texi2html.pl: don't use symbolic refs at all, instead eval the
+ code (for the style functions) or use a local glob for the filehandle.
+
+2003-12-15 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: add hashes for the ascii
+ representations of @-commands and a function for ascii accents.
+ Give style functions the style @-command stack.
+ New function duplicate_state to be used when special text is expanded
+ within a normal context.
+ substitute_line accepts a $state argument.
+
+2003-12-10 Patrice Dumas <dumas@centre-cired.fr>
+
+ * INTRODUCTION, NEWS, README, TODO, texi2html.1.in, doc/TODO: bring
+ those files a bit more up-to-date and correct typos.
+ * doc/IDEA: removed, the content was obsolete or in TODO.
+ * texi2html.pl: add no-... options for the options needing it.
+ echo less options with --help.
+
+2003-12-10 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, TODO: add hashes for unicode encodings
+ of accented letter and characters.
+ A function cross_manual_links can expand node name according to the
+ proposal I made on the texinfo-pretest list (currently unused).
+
+ * examples/utf8.init: add an init file for outputting of utf8 encoded
+ characters.
+
+2003-12-05 Derek Price <derek@ximbiot.com>
+
+ * texi2html.pl: Suggest `--help' rather than `-help' in error messages.
+
+2003-12-05 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: @sp without arg is considered to be @sp 1
+ * Tests/formatting/formatting.texi: add test for @sp
+ * TODO: begin a list of UTF8 characters corresponding with accented
+ texinfo letters, in order to implement cross manual references scheme
+ described on the bug-texinfo mailing list and maybe output utf8.
+
+2003-12-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: don't collect @copying lines in the first pass
+ but in the second.
+ Use the same mechanism to collect @copying, @documentdescription
+ and @titlepage lines.
+
+2003-12-01 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: new option -macro-expand which generates a file
+ with expanded macros and @include.
+ don't close environments until last pass, except for @verb, raw
+ environments and macro stuff.
+ * texi2html.init: use @emph instead of @i in strings.
+
+2003-11-25 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: format titlepage lines, resulting
+ text is put in $Texi2HTML::TITLEPAGE. Use a new function reference
+ $titlepage to finalize $Texi2HTML::TITLEPAGE.
+ titles, subtitles and authors are put in arrays in
+ $Texi2HTML::THISDOC{'titles'} and so on...
+ All the skipped commands are kept for the second pass.
+ Handle @noindent and @exdent like other skipped commands. A new
+ type of skipped commands 'whitespace' with newline skipped
+ and 'space' no newline skipped.
+ change name of functions to default_`function'.
+
+ * examples/roff.init: add a roff formatter added.
+
+2003-11-20 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: Echoes error messages when loading
+ init files.
+ Keep spaces in menu entries and menu descriptions.
+ Clean menu entries code.
+ When handling menu entries, give the formatted node, the name and
+ the remaining of the line to the formatting functions.
+ In enumerate give the style of the enumerate, the item number and
+ a prepared number or letter to the formatting functions.
+ Don't keep the enumerate style in the text.
+
+2003-11-18 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: change protect_html to protect_text.
+ More arguments given to paragraph, preformatted region, list item,
+ table item formatting functions, usefull when the paragraph or
+ preformatted region is within a table or list to give more possibility
+ for use of the formatting command appearing with the table or
+ itemize command.
+ Handle better new lines.
+ new formatting function, normal_text, used to process ---, --, '' and
+ ``.
+ new formatting function, empty_line used to format an empty line,
+ leave the empty line as is by default.
+ 2 new formatting functions are used when the macro isn't handled
+ by the normal functions: unknown and unknown_style.
+ give the file name to the image.
+
+ * doc/texi2html.texi, Tests/*: sync with code.
+
+2003-11-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: the format is applied by a customizable function.
+ More arguments (index name, entry) given to the index label
+ formatting function.
+ When menus are not expanded, don't keep @menu or @end menu.
+ * texi2html.init: warn when an accent is associated with a
+ wrong argument. Produce valid html entities only.
+ * texi2html.init, T2h_i18n.pm: Use @-commands in internationalized
+ strings, not html.
+ * i18n/fr, i18n/es, i18n/pt: use @-commands instead of html.
+
+2003-11-07 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: remove unusefull arguments to
+ functions formatting paragraphs.
+
+2003-11-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: the style is applied by a customizable function.
+ * examples/noheader.init: style with no headers.
+
+2003-11-05 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: don't add the leading command if it is a simple
+ command to all the paragraphs in itemize and add it before the
+ paragraph or preformatted section.
+
+2003-11-05 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: in itemize, apply the command to the
+ inside of the paragraph or preformatted section.
+ titlefont don't open paragraphs.
+
+2003-11-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: keep texi as is in @image and protect html characters.
+ accept @| as macro, but remove it.
+ cleaning of code for commands with texi kept as is
+ * doc/formatting.texi: add test of flushleft, flushright and center
+
+2003-11-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: -- and so on are kept as is in @image except
+ for alt text. Use alt text. File for image is really used, too.
+ handle better @inforef.
+ * doc/clean.texi: add formatting/clean.texi, a test for code
+ acceptable by makeinfo without error.
+
+2003-10-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * doc/texi2html.texi: add informations about internationalization
+
+2003-10-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: if not split and there is a leading directory
+ specified with --out, create that directory.
+ If a directory creation fails, abort.
+ test the writability of the results directory, even when it is
+ the current directory.
+
+2003-10-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * doc/: remove unneeded .texi files, now included in texi2html.texi.
+ * Makefile.am, doc/Makefile.am: include info file in distribution.
+
+2003-10-26 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: support for @verbatiminclude. When split use the
+ -output specification in every cases.
+ * texi2html.init: use `&bull;' instead of `*' for node menu entries.
+ * Makefile.am: fixes for the inclusion of files in packages.
+ * doc/texi2html.texi: add the explanation of the default for all the
+ variables. Explain how the strings are customized and how
+ internationalization works.
+
+2003-10-19 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, examples/html32.init: don't expand
+ html automatically, only if it is in @EXPAND. Put html in @EXPAND.
+ USE_ISO is now in the default case, but false in html32.init.
+ new hash, %iso_symbols for USE_ISO symbols. Rewroted in the public
+ domain in texi2html.init. Use iso symbols in preformatted environment
+ too.
+ When removing texi @-commands with arguments (@table, @deffn...) are
+ better handled. Ignore content of @anchor, @footnote, @*ref when
+ removing texi.
+ * doc/texi2html.texi: merge content of doc/custpage.texi,
+ doc/custhtml.texi in doc/texi2html.texi.
+ * Tests/formatting/formatting.texi: test for all the constructs in
+ the @copying/@end copying section (to test remove_texi).
+
+2003-10-17 Derek Price <derek@ximbiot.com>
+
+ * doc/stamp-vti, doc/version.texi: Regenerated.
+
+2003-10-17 Derek Price <derek@ximbiot.com>
+
+ * texi2html.pl (do_text): Compile-once flag is okay as long as the
+ pattern portion (left side) of a s/// statement is free of change.
+
+2003-10-15 Patrice Dumas <derek@ximbiot.com>
+
+ * doc/custhtml.texi, doc/custpage.texi: sync with current code
+ (no more $ADDRESS but $end_page, only 2 functions for references).
+ * texi2html.pl: -- in normal text is changed in -
+ ---, -- '' and `` are kept as is in @code, @kbd and so on.
+
+2003-10-14 Derek Price <derek@ximbiot.com>
+
+ * doc/texi2html.texi: Use @code{} for Perl vars. @var{} is for user
+ supplied data to commands and function calls and the like. Fix EOL
+ indiscretion in the three index macros.
+ * doc/stamp-vti, doc/version.texi: Regenerated.
+
+2003-10-14 Derek Price <derek@ximbiot.com>
+
+ * doc/custhtml.texi, doc/custpage.texi, doc/texi2html.texi: Misc
+ revisions to Pat's major revisions. Some global changes and reviewed
+ through section 4.3. Consolidate copyleft notice into a macro.
+ Consolidate variable and option references into macros which include
+ an index reference. Make use of appropriate macros from version.texi
+ rather than relying on manual updates.
+ * doc/stamp-vti, doc/version.texi: Regenerated.
+
+2003-10-14 Derek Price <derek@ximbiot.com>
+
+ * doc/.cvsignore: Add texinfo.info-? files.
+
+2003-10-33 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Tests/formatting/formatting.texi: test for --- and `` in various
+ constructs.
+
+2003-09-23 Patrice Dumas <dumas@centre-cired.fr>
+
+ * NEWS: More changes taken from the conversion of the singular
+ manual init file.
+
+2003-09-23 Patrice Dumas <dumas@centre-cired.fr>
+
+ * NEWS: Note more changes.
+ * Tests/*: Test for novalidate.
+
+2003-09-22 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Reorganize. Note some more changes.
+
+2003-09-21 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Makefile.am: package i18n/en
+ * doc/testkb.texi doc/umalaut.texi: remove these test files, they are
+ now in Tests/formatting
+
+2003-09-21 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: source 'Config' file in the configuration directories
+ instead of texi2htmlrc and ~/.texi2htmlrc for the system wide and
+ user configuration.
+ * manage_i18n.pl: language files are the files appearing in the
+ i18n directory. Use 'en' for the file with english strings.
+
+2003-09-17 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, texi2html.pl: change 'about (this page)' to
+ 'about (help)' as this appears in the title= of the <a> element.
+ ignore @afourlatex, @afourwide, @firstparagraphindent, @exampleindent,
+ handle @definfoenclose, @kbdinputstyle, @novalidate, @centerchap (but
+ without centering), @documentdescription.
+ add -no-validate option.
+
+2003-09-15 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, texi2html.pl: add &$Texi2HTML::Config::one_section
+ for formatting of document with only one section.
+ find when an element is the first element on a page.
+ add &$Texi2HTML::Config::end_section, called when an element is
+ finished unless it is the end of a page and do less in print_section
+ Don't use $ADDRESS anymore.
+ Change &$Texi2HTML::Config::external_ref such that it is easier to
+ internationalize.
+
+2003-09-13 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, texi2html.pl: mark strings of buttons, about,
+ definitions and footers for internationalization.
+ new function reference $set_buttons_text used to generate the
+ button text hashes dynamically (for internationalization).
+ require all files in i18n/* for languages.
+ * i18n/fr: translate strings related with buttons, about,
+ definitions and footers in french.
+
+2003-09-12 Patrice Dumas <dumas@centre-cired.fr>
+
+ * manage_i18n.pl: remove \ from strings when finding out strings
+ to translate.
+ * i18n/fr: translate strings related with references.
+
+2003-09-12 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: 0 is accepted as a value for
+ the reference arguments.
+ rewrite from scratch the functions handling references in .init
+ files to put them in the public domain. Avoid string concatenation
+ to ease internationalization.
+
+2003-09-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, T2h_i18n.pm, manage_i18n.pl,
+ configure.in:
+ The ideas come from Derek.
+ new script manage_i18n.pl used to manage translation files.
+ remove -i18n switch.
+ parse source files to extract strings to be translated.
+ complete these strings with the element of %$template_strings
+ in manage_i18n.pl and fill the i18n/template file with
+ these strings in the 'en' language hash.
+ With the 'all' arg given to manage_i18n.pl the template is
+ regenerated the language files are updated and merged in
+ translations.pl. translations.pl is pasted in texi2html.pl.
+ give arguments to the string to be translated: when something
+ like %{arg} appears in the string and { 'arg' => 'some string'}
+ is given as second argument, %{arg} is replaced by 'some string'
+ after retrieval of the translated string.
+
+2003-09-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * images, AUTHORS: add images from the Singular project.
+
+2003-09-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, T2h_i18n.pm, texi2html.init: new handling of
+ languages in documents.
+ instead of using the hash reference $Texi2HTML::I18n::WORDS for
+ translation of words, call &Texi2HTML::I18n::get_string (more
+ precisely use &$I, a reference on the function). The strings
+ are the real english strings and not identifiers.
+ The date formatting depends on the language.
+ Use translations for months and not a months array.
+ Put translations in one file per language and not in T2h_i18n.pm.
+ Those files are in the i18n directory. They are to be concatenated
+ in the file translated.pl which is required or pasted in texi2html.
+ Add a switch -i18n for the specification of a management command
+ related with internationalization: if the command is merge,
+ the files in the i18n directory are concatenated into translated.pl;
+ if the command is update the files are updated with their own
+ informations and the list of valid strings appearing in T2h_i18n.pm,
+ invalid strings are obsoleted but kept.
+ * test.sh: add a test for internationalization.
+
+2003-09-05 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: detect @item on @itemize and table line to avoid
+ infinite recursion.
+
+2003-09-04 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: handle better @itemize and @table,
+ by appending the text appearing on the format command line.
+ Use %special_list_commands to inhibit calling the formatting command
+ on an item in a given format command.
+ if '-' is given to the -output option, output on STDOUT.
+ Find more format command mismatches, and handle better formats not
+ closed.
+
+2003-09-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Tests/macros/glossary.texi: test for nested macros definitions
+
+2003-08-29 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: support nested macro definitions.
+
+2003-08-29 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, texi2html.pl: hide m_cedilla.
+ new handling of definition commands, with a specification of the
+ definition line parsing.
+ get HTML attributes from hash values of %format_map and %style_map.
+ Simplify the handling of tables. The default is to use %format_map
+ or otherwise a user defined function, $table_list.
+ All the css commands are in %css_map. 'pre_style' in $complex_formats
+ is taken from %css_map.
+ handle @sp.
+ Remove $Texi2HTML::STOC_LINES (use $Texi2HTML::OVERVIEW), remove
+ $Texi2HTML::TOC (use $Texi2HTML::TOC_LINES), remove $T2H_TOP.
+ use references on arrays everywhere (instead of arrays) for
+ Texi2HTML::OVERVIEW and Texi2HTML::TOC_LINES.
+ Use OVERVIEW consistently.
+ use $docu_top when needed, instead of $docu_name.$docu_ext, which
+ is wrong if -o is used.
+ prepare index entries label text in main program.
+ rewrite from scratch most of the function in .init files to put
+ them in the public domain.
+ expand macros in macro arguments.
+ \ protects @end macro in macros body. This may be wrong.
+ ignore space and newline following a region opening command.
+ rename -css-file to -css-include.
+ Add 'This' to the hashes for buttons, icons and so on.
+ Add option -toc-links, create links from headings to toc entries
+ with 9 lines from
+ Martin Herbert Dietze <martin@the-little-red-haired-girl.org>
+ macros are expanded in macro arguments, taking care of context (in
+ @verbatim, @ignore, @comment...).
+ Don't remove empty lines from output.
+ Reenable handling of -idx-sum.
+ * Tests/*: add tests for macros expansion in macro arguments, and
+ for command line option style which are not default.
+ * examples/*: use code in the public domain.
+ In makeinfo.init use makeinfo style for index formatting.
+
+2003-08-29 Derek Price <derek@ximbiot.com>
+
+ * MySimple.pm (helpOptions): Prepend a second `-' before options.
+
+2003-08-29 Derek Price <derek@ximbiot.com>
+
+ * doc/stamp-vti, doc/version.texi: Regenerated.
+
+2003-08-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, texi2html.pl: don't always open paragraphs
+ in tables and such, only when needed.
+ option -output obsoletes -out_file and -subdir. It is the
+ same than -out_file when output is not split, and the same than
+ -subdir when it is split.
+ Handle empty indices.
+ Handle better @-commands with letters mixed with other characters.
+ Be more carefull about NUMBER_SECTION, such that nothing is numbered
+ when it is false.
+ Support for @documentencoding.
+ * Tests/*: add tests from the doc directory in formatting.
+ * doc/*: add a section about installation and make the manual more
+ makeinfo friendly.
+
+2003-08-04 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init, Tests/test.sh, Tests/ccvs: don't expand info
+ section in default settings. Expand info sections for the xemacs
+ manual, the viper manual and the texinfo manual.
+ The cvs manual is updated.
+
+2003-08-04 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: pass line numbers to all the
+ functions echoing error messages and use these line numbers
+ in error messages. Some error messages rewrited.
+ Correct tag for sectionning commands in case raisesection or
+ lowersection were used.
+ -P option prepends before the document directory, and use an
+ array, @Texi2HTML::Config::PREPEND_DIRS.
+ Add options --ifhtml, --ifinfo and so on (similar with makeinfo
+ options). It is also possible not to expand html now.
+ Add entries for xml.
+ when a region is expanded the corresponding ifnot region isn't.
+ Add support for -css-file option which does the same than in
+ makeinfo (parse the file, and echo the @import part before the
+ texi2html css rules, the rules part after the texi2html css rules).
+ If split at node and NODE_FILES is true but USE_NODES is not,
+ the correct file nema is used for nodes not associated with
+ sections and a redirection file is made.
+ ignore spaces or not for def*index, pagesizes, syn*index properly.
+ bugfixes: line beginning by any command not ignored begins a
+ paragraph, don't ignore text before macro with unknown character).
+ no empty style in pass_text.
+ misc element have always a navigation printed at foot.
+ * Tests/*: add singular test, test for css files, test all html
+ formatting and macro within another macro.
+
+2003-08-04 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: don't remove empty line in the
+ second pass, pass_structure.
+ collect line numbers/file name/macro expanding text in pass_texi.
+ pass these informations down to pass_structure.
+ take care of arguments not provided in some @-commands (no file
+ in @image, no node in @inforef and so on).
+ remove unneeded code in macro text expansion.
+ remove leading spaces and newlines in macros arguments.
+ add support for @\ (ignore).
+ put code extracted from texi2html.pl and placed in texi2html.init,
+ covered by the GPL back to texi2html.pl.
+ Document the API between texi2html.pl and texi2html.init, i.e.
+ document how the formatting functions called by texi2html.pl
+ should behave.
+ add print_section_header to format section headers.
+
+2003-08-01 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: add option '-noexpand' as a synonym for '-no-expand'
+ like Derek suggested.
+
+2003-07-31 Derek Price <derek@ximbiot.com>
+
+ * texi2html.pl (T2H_OPTIONS->{'no-expand'}): Remove useless linkage.
+
+2003-07-31 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: A new option -no-expand which does
+ the reverse of -expand.
+ Text before the first @node or sectionning command is
+ outputted as part of the first section. A new option enables the
+ reverse: if -ignore-preamble-text is set (variable
+ $IGNORE_PREAMBLE_TEXT) this text is ignored.
+ Handle macros appearing in that part of texinfo files (@direntry
+ and @dircategory ignored, @shorttitlepage handled).
+ Ignore everything at the beginning of the file until \input or an
+ @-command preceded by optionnal spaces.
+ better handling of @titlefont.
+
+2003-07-29 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: if split, top and misc elements (about,
+ toc, ...) always have a bottom navigation panel.
+ If there is no @top and the @node Top isn't associated with any section
+ it is considered to be the top element.
+ The top name is Top when there is no name nor title (previously was
+ "Untitled Document").
+ bugfix: top element handled as top even when it is the last element.
+
+2003-07-22 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, examples/*: add support for @cartouche
+ and @titlefont.
+ preliminary support for css. All the element needing style have a
+ class attribute. The commands which are associated with a class by
+ makeinfo have that class too. The styles are in the <head> in <style>.
+ A new init file, inlinestyle.init, should be used when style
+ attributes within html elements are wanted.
+ A new option, "-U value" does the same than "@clear value" (makeinfo
+ has that option, too).
+ A new configuration variable L2H_HTML_VERSION for the html version
+ passed to latex2html.
+ @tex or @math don't start a new paragraph.
+ * Tests/*: test for @raisesections and @lowersections, and for
+ @cartouche.
+
+2003-07-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Tests/ccvs: update cvs manual. This should fixe the issue of rcs
+ tags expanding in html manual files in ccvs_res.
+ * Tests/*: sync with code. Add missing test result files.
+ * Tests/Makefile.am: add new test subdirs. Better cleaning.
+ * l2h.init: add init file for latex2html.
+
+2003-07-10 Derek Price <derek@ximbiot.com>
+
+ * Tests/nodes_texinfo/--and-hyphenation.html: Removed this accidentally
+ added file at Pat's request.
+
+2003-07-10 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, Tests/test.sh: command line option names use '-'
+ instead of '_' between words (for example dump_texi becomes dump-texi).
+ * Tests/*: remove unneeded html and passfirst files.
+
+2003-07-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, *.init: use a separate namespace for the config
+ variables: Texi2HTML::Config. Use the Texi2HTML:: namespace for
+ variables set in texi2html and used in the init files subroutines.
+ Use Texi2HTML::LaTeX2HTML namespace for latex2html related code.
+ Use Texi2HTML::I18n namespace for internationalisation.
+ Variables related with latex2html are removed from texi2html.init
+ and put in l2h.init.
+ harmonize function names style (all like get_index and not GetIndex).
+ * Makefine.am, texi2html.pl: install examples init files in shared
+ directory.
+ try to find init files in the current directory, then the .texi2html
+ user directory, the local texi2html directory and lastly the shared
+ texi2html directory.
+
+2003-06-17 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: error messages go to STDERR instead of STDIN
+ * Tests/test.sh: add -x to perl invocation to avoid perl trying
+ to execute @PERL@. Small fixes.
+ * Tests/README: added README file in Tests to explain how to make
+ tests.
+
+2003-06-16 Derek Price <derek@ximbiot.com>
+
+ * NEWS: Add some of Patrice's features, note new AC/AM versions, note
+ --enable-maintainer-mode requirement.
+ * Makefile.am (all): Remove automake supplied target.
+ (texi2html): Update dependencies.
+ (EXTRA_DIST): Update these.
+ (MAINTAINER_CLEAN_FILES): Remove automatically included files.
+ (TEXI2HTML): Remove unused variable.
+ (AUTOMAKE_OPTIONS): Move to...
+ * configure.in (AM_INIT_AUTOMAKE): ...here.
+ (AC_ARG_PROGRAM): Remove call - AM_INIT_AUTOMAKE handles it.
+ (T2H_VERSION): Rename to...
+ (PACKAGE_VERSION): ...to avoid extra cruft since Autoconf already sets
+ this automatically.
+ (T2H_DATE): Rename to...
+ (PACKAGE_DATE): ...this in keeping with Autoconf naming convention and
+ set it automatically using mdate-sh.
+ (extrasub): Remove uneeded cruft.
+ (AM_MAINTAINER_MODE): Call this macro to make things easier on
+ inexperienced users.
+ (AC_OUTPUT): Move these files into...
+ (AC_CONFIG_FILES): ...calls to this macro and update some calls to set
+ the executable bit on files which need it.
+ * check_texinfo.pl.in: s/@BANGPERL@/! @PERL@/g;
+ * texi2html.1.in: s/@T2H_VERSION@/@PACKAGE_VERSION@/g;
+ s/@T2H_DATE@/@PACKAGE_DATE@/g.
+ * texi2html.init: Correct opening comment.
+ * texi2html.pl: s/@BANGPERL@/! @PERL@/g;
+ s/@T2H_VERSION@/@PACKAGE_VERSION@/g.
+ * Tests/Makefile.am (test): Rename to...
+ (check-local): ...this to conform with Automake requirements & GNU
+ standards.
+ (clean): Rename to...
+ (clean-local): ...for compatibility with Automake.
+
+ * Makefile.in: Regenerated.
+ * aclocal.m4: Ditto.
+ * configure: Ditto.
+ * Tests/Makefile.in: Ditto.
+ * doc/Makefile.in: Ditto.
+
+2003-06-16 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: @include replaced by an empty line
+ no end of line after last line when expanding macros
+ include of files within lines expanded from macros happen
+ at the right place
+ better handling of format command in section names and of empty
+ raw formats (like @html@end html)
+ * Tests/*: sync with code
+
+2003-05-20 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: split pass_texi in 2 pass. pass_texi
+ rearranges texi expanding macros and values, removing comments.
+ pass_structure remove unneeded empty lines and find out the structure
+ of the document.
+ use a different formatting for menu entries in other environments than
+ menus.
+ cleaning of code.
+ use close_stack in all the passes to close environments not rightly
+ closed. Fix some places where stack wasn't closed rightly.
+ New direction, 'NodeNext' and 'NodePrev' which contains the prev node
+ and next node which may be different from Next and Prev for sections.
+ use style font-size:smaller in pre instead of <font> for smallexample
+ and friends to produce valid html.
+ spaces and arguments following commands are removed or kept in the
+ same way than makeinfo does.
+ * Tests/*: add tests for environments not closed. Sync with code.
+
+2003-05-09 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: refs to other manuals conforms to
+ makeinfo with separated files for nodes.
+ If $T2H_NODE_FILES (-node-files) is true one file per node is created
+ which redirects to the real file or is the node file (if T2H_SPLIT
+ at node), to allow for cross manual references.
+ Add a T2H_NO_TEXI hash similar with T2H_HREF, T2H_NODES...
+ and T2H_THISDOC{title_no_texi} to have a texi free and thus html free
+ text for nodes/sections/title to be used in the <title> which element
+ which cannot contain other html elements. Also usefull for files with
+ node names generation.
+ t2h_set_body_text and t2h_protect_html put in texi2html.init to be
+ able to make changes more easily.
+ $T2H_TOC_LIST_STYLE is used for style in toc. Makes customisation
+ easier too.
+ * examples/html32.init: init file for html 3.2 generation
+ * Tests/test.sh: add validation
+ * Tests/*: tests for files with node names generation
+
+2003-05-07 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: put a label in splitted index.
+ splitted indices which are not at the level of splitting are kept
+ in the same file but in different sections.
+ different horizontal rules are global variables.
+ functions formatting index summary and index entry split between
+ a function in texi2html.pl and smaller functions doing the real
+ formatting in texi2html.init.
+ no formatting is done in texi2html.init.
+ heading appears in documents with only one section.
+ if $T2H_SEPARATED_FOOTNOTES is false (-noseparated_footnotes)
+ the footnotes are on the page they appear. More possibility
+ of customization of footnotes (insert things before and after each
+ footnotes and all footnotes).
+ use top file for the top element even when there is no @top section.
+ when there is a top element and splitting, no other element than
+ the top element appear in the top file.
+ * examples/makeinfo.init: format footnotes like makeinfo
+ * examples/xhtml.init: init file for xhtml
+ * Tests/test.sh: little fixes
+ * Tests/*: all tex stuff taken from verbatim_html and put in tex.texi.
+ tests for index entries in top and before top.
+ tests for documents with only one section or node or no node.
+
+2003-05-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: 3 split commands: split at
+ chapter, section or for every node (previously node and section
+ where the same than node now).
+ specific section footer.
+ find prev and next like makeinfo.
+ new directions, for nodes: NodeUp (up for node) and Following (next
+ node in reading order).
+ if in detailmenu menu entries are not used to find next and prev.
+ only one Top in nodes and anchors. Any case combination accepted
+ for any reference.
+ don't close { when not associated with an @command.
+ reintroduced code for counting words.
+ new possibilities for buttons. If this is a ref to a scalar, the
+ text appears in navigation. If it is an array, the first element
+ is a direction used for the href, the second element is a scalar
+ ref for the text (see makeinfo.init in examples for an example).
+ * Tests/*: test for recursive nodes references and other little
+ tests
+ * examples/*: new directory for examples of config files. There
+ is a file which tries to have an output which looks like makeinfo
+ --html output (makeinfo.init).
+
+2003-04-30 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: add the node as element when there
+ is a @printindex split accross pages between node and section.
+ * Tests/*: tests for documents with indices in top and between node
+ and section.
+
+2003-04-29 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: add $T2H_MENU_SYMBOL before nodes in
+ menu and optionnaly before unnumbered section names in menu entry.
+ next are not menu childs but next node in menu.
+ it is possible not to have next or prev for node.
+ any case combination of top is accepted in nodes, menus and
+ nodes directions. Not changed in anchors and refs (makeinfo shows
+ that kind of inconsistencies too).
+ the top_element it the @top section, then the Top node
+ and last the first element.
+ '(file) node' and '(file)' accepted in menus and nodes references.
+ better looking verbose output.
+ * Tests/*: tests for documents without sections and double top
+
+2003-04-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: No heading for top, as print_Top
+ allready does it.
+ if $T2H_USE_NODES (command line -use-nodes) is set, the nodes are
+ used as sections when they are not associated with a section.
+ find sections structure before handling nodes.
+ no more use of menu level for structuring.
+ @html sections don't close paragraphs.
+ * Tests/*: tests for document structure. Sync with code.
+
+2003-04-23 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: when there is no section nodes are used instead
+ * .cvsignore: add autom4te-2.53.cache and check_texinfo.pl
+ * Tests/.cvsignore: create .cvsignore for Tests
+ * Tests/ccvs: update to latest cvs manual
+
+2003-04-22 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: constants declared early as they are used in
+ texi2html.init (at least $WARN is used)
+ * Makefile.in, Tests/Makefile.in, Tests/Makefile.am: add .passfirst
+ and .2 files in regenerate and clean
+ * Tests/*: results of tests added
+
+2003-04-10 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: labels were put 2 times in special
+ sections (Top, about, toc...).
+ in vtable, ftable and table, even with an empty first item we
+ begin a <dd> as only <dd> and <dt> are allowed to follow <dl>.
+ Right labels are put in special sections and files are omitted
+ when the href is on the same file.
+ change &#156; to &oelig; and &#140; to &OElig; (as tidy do)
+ * Tests/*/nodetest.texi: test for more simple special commands
+
+2003-04-09 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: formatting put in texi2html.init
+ hrefs to anchors and index entries which are in footnotes are right
+ scan_texi changed to have a stack
+ verbose and debug goes to STDERR
+ unusefull empty lines removed
+ new option -dump_texi used to debug, dumps the result of pass_texi
+ to a file
+ menu_comments are always preformatted
+ better handling of @math and @sc
+ * Tests/*: a little more things tested.
+
+2003-04-04 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: deffn and the like better handled
+ preformatted sections are closed when there is a new format
+ and reopened right after the format such that there is no
+ validation error. The preformatted state is kept within
+ menu, deff body, simple formats, tables, with tt instead of
+ pre for terms, as pre isn't allowed in dt, but not in
+ indices.
+ simple macros are better handled when texi macros are removed
+ or in preformatted sections.
+ copying/end copying and insertcopying handled
+ @head_lines containing things which should be before the navigation
+ panel are used to get the labels for elements.
+ first page of index is handled like a normal format
+ * Tests/*: more tests for imbrications.
+
+2003-04-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: footnotes better handled, they have a separated
+ stack, state and text.
+ footnotes, anchors and refs can be mixed with better results.
+ $value{_title}... have only their texinfo expanded during
+ pass_texi, including values, macros and so on and the html
+ is generated during pass_text.
+ * Tests/*: minor changes, more tests.
+
+2003-04-02 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: macros splitted by 3 paragraphs are better handled.
+ more isolation of formatting.
+ better generation of index keys from commands, with more macros
+ replaced by the right letter or symbol.
+ better handling of @things{} in preformatted sections.
+ preformatted sections handled with a new format, preformatted (similar
+ with what is done for paragraphs). Some validation errors avoided.
+ commands for tables are handled.
+ index entries have the right file/id from their place.
+ The files are omitted from hrefs when the href points to the same file.
+ * Tests/*: formatting/imbrications.texi added. Sync with code.
+
+2003-03-27 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: rewrite of the parsing of texi
+ and of the handling of sectionning.
+ pass0 is now pass_texi. It still only generates texinfo.
+ pass_texi now also collects informations from sectionning commands
+ index entries, printindex commands.
+ pass1 through pass4 are now in just one pass, pass_text.
+ between pass_texi and pass_text, the information is used to figure
+ out the document and indices structure.
+ pass_text reparses the texinfo generated by pass_texi and
+ produces html. All the formatting is done in isolated subroutines
+ such that it is easy to change the formatting witout bothering
+ with the parsing.
+ pass_text uses scan_line to process a line.
+ A stack is used which holds opened macros and formats. Thus the
+ html is always closed and should be valid.
+ The document structure seems right with this approach, unnumbered
+ sections are at the right level and indices don't break the document
+ structure anymore.
+ * Tests/*: more tests for the @macros. Other minor modifications.
+ sync with new code.
+
+2003-03-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * T2h_i18n.pm: added the licence
+ * texi2html.pl, texi2html.init, check_texinfo.pl.in: check function
+ put in check_texinfo.pl.in. T2H_EXPAND is now an array such that
+ more than one type may be expanded
+ * texi2html.pl: added a new pass before the other ones, pass0 and
+ a function scan_line0 used in that pass. During that pass the
+ ifhtml, ifnot*, the comments and multiple empty lines, the macros,
+ values and includes are handled. No html is generated. the
+ different things that are expanded can now be within a line and
+ not necessarily at the begining of the line.
+ The handling of values and macros is not changed.
+ scan_line handles more constructs (newlines (still bugged),
+ verbatim, html and tex, deffn (incomplete)).
+ new function close_stack which might be used to close the things
+ forgotten by users or between paragraphs.
+ new function substitute_text which uses scan_line to render
+ arbitrary text.
+ little improvements in menu comments handling.
+ accent_map/do_accent should handle all the accents.
+ * Tests/test.sh: minor changes.
+ * Tests/*: regenerated tests to keep in sync.
+ added formatting/imbrications.texi to test for imbricated things.
+ * configure, configure.in: added check_texinfo.pl.in.
+
+2003-02-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init, T2h_i18n.pm: options specifications
+ moved from texi2html.init to texi2html.pl, such that texi2html.init
+ resembles a regular user init file. internationalization move
+ from texi2html.init to T2h_i18n.pm.
+ * configure.in: added substitution of T2h_i18n.pm within
+ texi2html.pl
+ * configure, doc/Makefile.in, Makefile.in, aclocal.m4,
+ Tests/Makefile.in: regenerated with automake-1.6.3, autoconf-2.53
+
+2003-02-24 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Tests: small fixes, more tests showing brokeness of texi2html
+ for some features and info and tex differences.
+ A change in texinfo.txi to permit handling of verb despite some
+ substitutions have allready been done
+ * texi2html.pl: add comment about the formats in texinfo 4.5
+ setlocale is used in case of tests to avoid change in ordering of
+ indices while testing against a reference file
+ footnotes refs and image handled by parse_line, which calls a
+ sub routine (do_footnote, do_ref or do_image).
+ for footnotes, _$doc_num instead of $docu_doc
+ appended tp keep track of the file of the footnote, such that it
+ is easier to match.
+ instead of <!--::${section}::--> added before printindex, _$sec_num
+ is appended to printindex, to keep track of the
+ section number.
+ images extention is taken from the @image tag if available
+ everything which was splitted accross pass2, pass3 and pass4 is
+ now done in pass2.
+ in pass3 only very little cleaning is done, pass4 is removed.
+
+2003-02-21 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: added handling of overbar accent @= is transformed
+ in =
+ the handling of multi lines macro is done in a function, scan_line
+ which scans a line, keeping a record of the text allready ready,
+ the macro stack and a state which for now only contains 'verb' if in
+ @verb macro. The @verb macro is handled by this function (but since
+ things have allready been substituted, it cannot give the right
+ result easily)
+
+2003-02-19 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: T2H_DEFAULT_button_icon_img behaves
+ better when it has some undef arguments
+ the variables which may be redefined by the user are now global.
+ They are grouped in texi2html.init, and also in the Declaration in
+ texi2html.pl and sorted by class.
+ new elements in %T2H_THISDOC for items which are global but shouldn't
+ be redefined by the user (instead of $T2H_HOMEPAGE, $THISPROG...).
+ t2h_Init_global has been removed and the code scattered according to
+ the principles above
+ other minor fixes
+
+2003-02-18 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: handle @verbatim, and @html differently. Added
+ push_until function which shift from a lines array and push to another
+ array until @end tag. Remove PROTECTTAG
+ remove unneeded push of index entry for vtable or ftable which
+ created 2 indices entry
+ * Tests: added more tests
+
+2003-02-13 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: avoid using $_ in functions, as it is a global
+ variable, use my variables instead
+ * Tests/test.sh: if called with arguments, the test specified by
+ the arguments is the only one done
+ * Tests/*: add Makefile.in, more subdirectories, synchronise
+ reference files with changes in the code
+
+2003-02-12 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: add prototype for the functions ; remove
+ & in front of functions ; remove the unusefull main()
+ and Unprotect_texi functions
+ * Tests/Makefile.am, Tests/test.sh: add regenerate target to
+ redo the reference files
+ add test with tidy, remove cvs/rcs tags when doing diffs
+
+2003-02-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * Tests/Makefile.am, Tests/test.sh: changes to reflect change
+ in directory name for the cvs manual from cvs to ccvs
+
+2003-02-11 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: unused variables removed
+ use_bibliography removed, lots of global variables made lexical.
+ open renamed open_file to avoid clashing with perl builtin.
+ remove sub init_input, the initialization is done in the
+ script itself.
+ add meta http-equiv="Content-Type" tag for the charset
+ declaration.
+
+2003-02-06 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl, texi2html.init: some unused variables removed
+ use_acc not used anymore, accents are always handled
+ Remove a lot of global variables. Use global lexical or lexically
+ scoped variables (with my) when possible. Pass variables as arguments
+ when the function is in texi2html.init
+ bugfixes: frame target is the top file, and not the toc file
+ during pass1 some lines where pushed in @lines2 instead of @lines
+ * Tests/test.sh: ignore CVS directory when doing diffs
+
+2003-02-03 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: Remove handling of setref which is a TeX macro. The
+ corresponding texinfo macro is anchor.
+ Remove an unneeded protect_texi
+ * configure.in, Makefile.am, Tests/test.sh, Tests/Makefile.am Tests/*:
+ Files used for testing added, texinfo manuals and the html results for
+ some of the texinfo manuals
+
+2003-01-30 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: fix nesting of multi line style macros (previously,
+ @kbd{@code{my
+ thing}}
+ became
+ <kbd>my thing<kbd><code></code> (or something approaching)
+ no style substitution is done in indexes (indexes are already good
+ html). Added %sec2index which is undef for a section name not in index,
+ 1 if the section name is in index.
+ the value of $docu_doc set if $T2H_OUT was set (option -o) wasn't
+ used to define docu_doc_file, thus the output file was the basename
+ of the texinfo file with extension appended, and not $T2H_OUT.
+
+
+2003-01-28 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: fixes in the handling of characters which are
+ special in html (&, "), involving some rewriting/replacements
+ of other functions which were bugged
+ normalise_node now really uses protect_html
+ new function protect_space_style used to normalise nodes without
+ calling protect_html
+
+2003-01-24 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: fixes for @multitables:
+ size detection, elements out of bounds are ignored
+ @item and @tab may appear anywhere within table lines
+
+
+2003-01-22 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: Ref to info files are handled correctly
+ @ref{(perl)Top} is transformed into @ref{Top,,,perl}.
+ Any character is allowed in menu comments
+ In menu, lines begining with * which are not menu entries are allowed
+ and treated as comments
+ Added a style handle for @bullet (do_bullet) such that @bullet{text}
+ is handled
+ Cedilla are now accepted in node names. Added protect_cedilla and
+ unprotect_cedilla functions.
+ * texi2html.pl, texi2html.init: Add -test option which sets
+ $T2H_TODAY $T2H_USER $THISPROG to given values. This is in order
+ to be able to compare with reference files for testing purproses.
+
+2003-01-16 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: @H{a} is changed in a'' and not &aacute; which was
+ wrong, as there are 2 acute accents on @H{a}.
+
+2003-01-09 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.pl: Suppress warnings for undefined patterns or
+ variables when running with -w
+
+2003-01-08 Patrice Dumas <dumas@centre-cired.fr>
+
+ * texi2html.init: small typo in a french word corrected
+ * texi2html.pl: @dotless macros are processed before accents
+ constructs like @'{a} are handled, typo in variable names corrected
+
+2002-06-25 Derek Price <oberon@umich.edu>
+
+ * texi2html.init, texi2html.pl:
+ Miscellaneous HTML improvements, towards strictness and
+ easier transition to XHTML later; lowercase elements and
+ attributes, avoid using deprecated elements and attributes,
+ always quote attribute values, avoid use of minimized
+ attributes. Internal cleanups.
+ (Patch from Ville Skyttä <ville.skytta@xemacs.org> through
+ Adrian Aichner <adrian@xemacs.org>.)
+
+2002-06-08 Derek Price <oberon@umich.edu>
+
+ * configure: Update to a new development release number.
+ * NEWS: Add news template for next release.
+
+ * configure.in: Regenerated.
+ * doc/stamp-vti: Ditto.
+ * doc/version.texi: Ditto.
+
+2002-06-08 Derek Price <oberon@umich.edu>
+
+ * configure.in: Update Texi2HTML date.
+ * NEWS: Update for new release.
+ * .cvsignore: Add autom4te.cache for new version of Autoconf.
+
+ * Makefile.in: Regenerated.
+ * aclocal.m4: Ditto.
+ * configure: Ditto.
+ * doc/Makefile.in: Ditto.
+ * doc/stamp-vti: Ditto.
+ * doc/version.texi: Ditto.
+
+2001-11-27 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.pl (pass5): Improve wording to say "# writing X
+ sections ...".
+ * texi2html.pl (next_doc): Skip over $docu_top_file and issue
+ warning.
+
+2001-11-25 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.init (T2H_InitGlobals): Improve documentation.
+ Prepend $T2H_ADDRESS, which contains nothing but the address now,
+ with "by".
+ * texi2html.init (T2H_DEFAULT_print_page_foot): Prepend
+ $T2H_ADDRESS, which contains nothing but the address now, with
+ "by".
+ * texi2html.init (T2H_PRE_ABOUT): Ditto.
+ * texi2html.init (T2H_AFTER_ABOUT): Make it a lexical.
+ * texi2html.pl: Remove trailing whitespace from lines. Use
+ protect_html of HREF and NAME. Use /o where possible in
+ substitutions.
+ * texi2html.pl (T2H_HOMEPAGE): Get rid of newlines.
+ * texi2html.pl (T2H_ADDRESS): Move to texi2html.init.
+ * texi2html.pl (pass1): Fix severe top node matching bug.
+ * texi2html.pl (do_uref): Don't markup obviously bad uref.
+ * texi2html.pl (t2h_anchor): Use protect_html to allow
+ double-quoting of all html attributes.
+
+2001-11-19 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.init: Initialize T2H_INCLUDE_DIRS to the empty list.
+ * texi2html.pl (LocateIncludeFile): Don't look in ., unless it's
+ part of T2H_INCLUDE_DIRS.
+
+2001-09-18 Derek Price <dprice@collab.net>
+
+ * texi2html.pl (T2H_HOMEPAGE): Use new link.
+ (T2H_AUTHORS): Direct to dev@texi2html.cvshome.org for maintainer.
+ (T2H_ADDRESS): Default to "an unknown user".
+
+2001-09-18 Derek Price <dprice@collab.net>
+
+ * doc/.cvsignore: Add several files generated by pdftex.
+
+2001-09-18 Derek Price <dprice@collab.net>
+
+ * doc/Makefile.am (texi2html_TEXINFOS): Remove version.texi - AM
+ includes it automatically.
+ (texi2html.html): Include version.texi as a dependency.
+ (texi2html.pdf): Use pdftex to create instead of ps2pdf - hyperlinks!
+
+ * doc/Makefile.in: Regenerated.
+
+2001-09-18 Derek Price <dprice@collab.net>
+
+ * configure.in: Bump package version number.
+ * Makefile.am (AUTOMAKE_OPTIONS): Bump required Automake version to
+ 1.5.
+ * doc/texinfo.tex: New File.
+ * TODO: Add note about `make distcheck' being broken and about lack of
+ a comprehensive test suite.
+
+ * Makefile.in: Regenerated using Automake 1.5.
+ * aclocal.m4: Ditto.
+ * configure: Ditto.
+ * doc/Makefile.in: Ditto.
+ * doc/stamp-vti: Ditto.
+ * doc/version.texi: Ditto.
+
+2001-09-17 Derek Price <dprice@collab.net>
+
+ * texi2html.init (T2H_WORDS_FR, MONTH_NAMES_FR): Add French
+ translations.
+ (Patch from Dumas Patrice <dumas@centre-cired.fr>.)
+
+2001-09-17 Derek Price <dprice@collab.net>
+
+ * texi2html.1.in (AVAILABILITY): Add detail.
+
+2001-09-17 Derek Price <dprice@collab.net>
+
+ * .cvsignore: Add `texi2html.1'.
+
+2001-09-17 Derek Price <dprice@collab.net>
+
+ * texi2html.1: Removed this file since it is generated by configure.
+
+2001-08-10 Derek Price <dprice@collab.net>
+
+ * INTRODUCTION: Fix email addresses and links.
+ * README: Ditto.
+ * NEWS: Update.
+
+2001-08-10 Derek Price <dprice@collab.net>
+
+ * doc/Makefile.am: Made a few changes so we can build in a dir other
+ than $(srcdir).
+ (Bug report from Richard Pixley <rpixley@zhone.com>.)
+
+ * Makefile.am: Remove some useless comments.
+ * doc/Makefile.am: Simplify some targets which Automake already knew
+ how to handle.
+
+ * aclocal.m4: Regenerated.
+ * configure: Regenerated.
+ * Makefile.in: Regenerated.
+ * doc/Makefile.in: Ditto.
+
+2001-01-20 Adrian Aichner <adrian@xemacs.org>
+
+ * INTRODUCTION (http): Typo fixes.
+ * texi2html.init (T2H_DEFAULT_print_toc_frame): Improve wording.
+ * texi2html.pl: Avoid newlines around URL in $T2H_HOMEPAGE.
+ * texi2html.pl (pass1): Remove incorrect "node is undefined ..."
+ warnings (as pointed out by larry.jones@sdrc.com (Larry Jones) in
+ <200011152253.RAA16633@thor.sdrc.com>.
+ * texi2html.pl (Sec2PrevNode): Fix bug of calculating next node
+ instead of previous.
+ * texi2html.pl (main): Provide Windows NT workaround for $T2H_USER
+ until getpwuid gets implemented there.
+
+2000-11-15 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.pl: Comment out warnings pragma which, according to
+ larry.jones@sdrc.com (Larry Jones), is not available in
+ perl5.004_02.
+
+2000-11-12 Adrian Aichner <adrian@xemacs.org>
+
+ * doc/custhtml.texi: Fix @node and @menu commands according to
+ feedback from makeinfo and texi2html, which reports undefined
+ nodes now.
+ * doc/custhtml.texi (CustHTMLBody): Ditto.
+ * doc/custhtml.texi (CustHTMLBodyText): Ditto.
+ * doc/custhtml.texi (CustHTMLAfterBody): Ditto.
+ * doc/custpage.texi: Ditto.
+ * doc/custpage.texi (TipsNewDesign): Ditto.
+ * doc/custpage.texi (CustPagePhil): Ditto.
+ * doc/custpage.texi (CustPagePhilNav): Ditto.
+ * doc/custpage.texi (CustPageMiscPage): Ditto.
+ * doc/custpage.texi (CustPagePageHeadToc): Ditto.
+ * doc/custpage.texi (CustPagePageHead): Ditto.
+ * doc/initfile.texi: Ditto.
+ * doc/initfile.texi (InitFileBasics): Ditto.
+ * doc/reference.texi: Ditto.
+ * doc/reference.texi (Refptocframe): Ditto.
+ * doc/stamp-vti: Updated.
+ * doc/texi2html.texi: Ditto.
+ * doc/texi2html.texi (Top): Ditto.
+ * doc/texi2html.texi (Indexvr): Ditto.
+ * doc/version.texi: Ditto.
+
+
+2000-11-12 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.init: Re-format file according to M-x cperl-set-style
+ RET C++ RET. Following subs are affected by re-indentatition and
+ bug fixes due to use of warnings pragma.
+ * texi2html.init (T2H_DEFAULT_print_section):
+ * texi2html.init (T2H_DEFAULT_print_Top_header):
+ * texi2html.init (T2H_DEFAULT_print_Top):
+ * texi2html.init (T2H_DEFAULT_print_misc_header):
+ * texi2html.init (T2H_DEFAULT_print_misc):
+ * texi2html.init (T2H_DEFAULT_print_chapter_header):
+ * texi2html.init (T2H_DEFAULT_print_chapter_footer):
+ * texi2html.init (T2H_InitGlobals):
+ * texi2html.init (T2H_DEFAULT_print_page_head):
+ * texi2html.init (T2H_DEFAULT_print_page_foot):
+ * texi2html.init (T2H_DEFAULT_print_foot_navigation):
+ * texi2html.init (T2H_DEFAULT_button_icon_img):
+ * texi2html.init (T2H_DEFAULT_print_navigation):
+ * texi2html.init (T2H_DEFAULT_print_frame):
+ * texi2html.init (T2H_DEFAULT_print_toc_frame):
+ * texi2html.init (T2H_DEFAULT_about_body):
+ * texi2html.pl: Re-format file according to M-x cperl-set-style
+ RET C++ RET. Add pragma:
+ use warnings;
+ Following subs are affected by re-indentatition and bug fixes due
+ to use of warnings pragma.
+ * texi2html.pl (LoadInitFile):
+ * texi2html.pl (SetDocumentLanguage):
+ * texi2html.pl (l2h_Init):
+ * texi2html.pl (l2h_InitToLatex):
+ * texi2html.pl (l2h_ToLatex):
+ * texi2html.pl (l2h_FinishToLatex):
+ * texi2html.pl (l2h_ToHtml):
+ * texi2html.pl (getcwd):
+ * texi2html.pl (l2h_InitFromHtml):
+ * texi2html.pl (l2h_FromHtml):
+ * texi2html.pl (l2h_ExtractFromHtml):
+ * texi2html.pl (l2h_Finish):
+ * texi2html.pl (l2h_InitCache):
+ * texi2html.pl (l2h_StoreCache):
+ * texi2html.pl (l2h_FromCache):
+ * texi2html.pl (l2h_ToCache):
+ * texi2html.pl (pass1):
+ * texi2html.pl (EnterIndexEntry):
+ * texi2html.pl (IndexName2Prefix):
+ * texi2html.pl (GetIndexEntries):
+ * texi2html.pl (byAlpha):
+ * texi2html.pl (GetIndexPages):
+ * texi2html.pl (GetIndexSummary):
+ * texi2html.pl (PrintIndexPage):
+ * texi2html.pl (PrintIndex):
+
+2000-11-05 Adrian Aichner <adrian@xemacs.org>
+
+ * MySimple.pm (getOptions): Correct typo found with "use strict;".
+ * texi2html.init: Convert from dynamically to lexically scoped
+ variables.
+ * texi2html.init (pretty_date): Ditto. This sub is defined in
+ texi2html.pl as well!
+ * texi2html.pl: Ditto.
+ * texi2html.pl (l2h_FromHtml): Ditto.
+ * texi2html.pl (pass1): Ditto.
+ * texi2html.pl (pass2): Ditto.
+ * texi2html.pl (pass3): Ditto.
+ * texi2html.pl (pass4): Ditto.
+ * texi2html.pl (update_sec_num): Ditto.
+ * texi2html.pl (open): Ditto.
+ * texi2html.pl (next_line): Ditto.
+ * texi2html.pl (html_debug): Ditto.
+ * texi2html.pl (debug): Ditto.
+ * texi2html.pl (do_email): Ditto.
+ * texi2html.pl (do_math): Ditto.
+ * texi2html.pl (do_uref): Ditto.
+ * texi2html.pl (apply_style): Ditto.
+ * texi2html.pl (substitute_style): Ditto, except $_.
+ * texi2html.pl (t2h_anchor): Ditto.
+ * texi2html.pl (pretty_date): Ditto. This sub is defined in
+ texi2html.init as well!
+
+2000-11-05 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.pl (pass1): Generate valid HTML for <a name=...>
+ anchors produced for @itemx?.
+
+2000-11-05 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.init: Eliminate bare-word use of variable T2H_OPTIONS.
+
+2000-11-05 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.pl: Use strict pragma to detect potential bugs.
+ Declare local variables (currently 396!). Fix HTML syntax in
+ $complex_format_map. Eliminate bare-word use of variables
+ (eg. use $T2H_LANG instead of T2H_LANG).
+ * texi2html.pl (GetIndexSummary): Remove <br> after <table>.
+ * texi2html.pl (Sec2NextNode): Re-write section-number regexp for
+ readability and to make cperl-mode happy.
+ * texi2html.pl (Sec2PrevNode): Ditto.
+ * texi2html.pl (main): New sub encapsulating top-level code.
+ * texi2html.pl (pass1): Ditto. Re-write texinfo comment regexp
+ for readability and to make cperl-mode happy. End HTML <p> before
+ @printindex, <dl>, and </dl>.
+ * texi2html.pl (pass2): Ditto. Quote <table> attributes.
+ * texi2html.pl (pass3): Ditto.
+ * texi2html.pl (pass4): Ditto. Remove </p> before first paragraph!
+ * texi2html.pl (pass5): Ditto.
+ * texi2html.pl (open): Use no strict "refs" to allow symbolic
+ reference.
+ * texi2html.pl (apply_style): Ditto.
+
+2000-11-04 Adrian Aichner <adrian@xemacs.org>
+
+ * texi2html.init ($T2H_DOCTYPE): Add SystemLiteral to identify the
+ canonical DTD.
+ * texi2html.init (T2H_DEFAULT_about_body): Fix HTML syntax of
+ Subsubsection One-Two-Three example.
+ * texi2html.pl: Close HTML <p> before HTML <table> and HTML
+ <dl>. Correct handling of texinfo menu comment lines.
+ * texi2html.pl (protect_html): Simplify. This subroutine was way
+ too smart! Use Character entity references (eg &lt;) instead of
+ Numeric character references (eg. &#60).
+ * texi2html.pl (unprotect_html): Use Character entity references
+ (eg &lt;) instead of Numeric character references (eg. &#60).
+
+2000-09-14 Eric Sunshine <sunshine@sunshineco.com>
+
+ * doc/Makefile.in: Added missing doc/Makefile.in since its absence
+ caused 'configure' and make targets (such as 'distclean') to bomb.
+
+2000-09-14 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * applied patches/fixes from Eric Marsden <emarsden@mail.dotcom.fr>.
+ o DTD now at the beginning of the document
+ o default language to 'en' wasn't working which led to empty LANG=""
+ in <BODY>
+ o missing </FONT> in footer blurb
+ o when the ToC was generated in some cases, the code used
+ <UL></UL> to indent, but didn't have any <LI> tags. <blockquote>
+ is now used in such cases, instead.
+
+2000-09-11 Eric Sunshine <sunshine@sunshineco.com>
+
+ * texi2html.pl: Fixed severe macro expansion bug. Macro argument
+ parsing code did not handle nested braces ('{' and '}') at
+ all, thus valid macro invocations such as
+ "@mymacro{Hello @emph{there} @strong{world}.}" would fail.
+ Prior to this fix, @mymacro would be handed the argument
+ "Hello @emph{there", which is clearly incorrect. Now @mymacro
+ correctly receives "Hello @emph{there} @strong{world}." as its
+ argument. This fix also deals properly with the protected brace
+ sequences \{, \}, @{, and @}.
+
+ * texi2html.pl: Fixed severe macro expansion bug. Macro argument
+ parsing code did not handle arguments split over multiple lines,
+ such as "@mymacro{Hello \n world.}". Now it correctly handles
+ macro invocations split across any number of lines, and properly
+ flags an error at the correct location if the user forgets the
+ closing brace '}'.
+
+ * texi2html.pl: Fixed formatting errors in expansions of @SPACE,
+ @TAB, and @NL (where SPACE, TAB, and NL represent the actual
+ space, tab, and newline characters). The Texinfo manual
+ explicitly states that each of these sequences should expand to a
+ "printable" space in the [rendered] output. The example given in
+ the manual shows that "Spacey@ @ @ @ example" should expand to
+ "Spacey example". However, texi2html was only emitting the
+ insignificant whitespace ' ' and '\n' into the HTML output which
+ did not properly preserve the hard spaces in "Spacey example".
+ Now each of these directives expands to '&nbsp;' instead.
+
+ * texi2html.pl: Made aesthetic improvement to the output of @file{},
+ @option{}, and @samp{}. The argument string is now quoted with
+ ` and ' _after_ the style has been applied. For instance,
+ @samp{perl} now expands to "`<samp>perl</samp>'", whereas it used
+ to expand to "<samp>`perl'</samp>". In my tests, this change
+ results in more aesthetically pleasing rendered output on various
+ browsers.
+
+2000-08-16 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: Bug fix from: "joseph" <joseph@freenet.de>
+ MySimple.pm should be 'require'd, but checked is still texi2html.init.
+
+2000-08-14 Karl Heinz Marbaise <khmarbaise@gmx.de>
+ * new command line switch (Test purposes only!)
+ to show new layout in HTML for @def stuff.
+ * Texinfo-Documentation updated.
+ - New chapter about ``customizing HTML'' started.
+ - multiple files instead of one.
+ - subdirectory doc.
+
+2000-07-27 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: Fixed Getopt::Long::Configure("pass_through") for
+ older versions of Getopt::Long which do not support his function.
+
+2000-07-11 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * implemented @documentlanguage:
+ - sets language of document, unless overwritten by -lang, or
+ explicitly set $T2H_LANG
+
+ * introduced T2H_OBSOLETE_OPTIONS to prevent obsolete options to
+ ambiguate current options
+
+2000-07-09 Karl Heinz Marbaise <khmarbaise@gmx.de>
+ * Texinfo-Documentation:
+ - fixes from Peter Moulder <pjm@bofh.asn.au> incorporated
+ into manual.
+ - Updated Manual
+ o improved
+ o indices for options, variables of script.
+ o much more.
+ * texi2html.init:
+ - improvements for different languages
+ (month names, words in different languages).
+
+2000-07-05 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * Provided CVS anonymous read-access to Texi2html:
+ cvs -d :pserver:t2h-anon@urmel.mathematik.uni-kl.de:/usr/local/Singular/cvsroot login
+ cvs -d :pserver:t2h-anon@urmel.mathematik.uni-kl.de:/usr/local/Singular/cvsroot co Texi2html
+ Passwd: texi2html
+ * Provided CVS write-access to Texi2html: contact me for
+ instructions
+
+2000-07-01 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * primitive support for some toher def stuff (needs to be fixed,
+ though)
+ * Distribution: Incorporated texi2html.texi authored by Karl Heinz
+ Marbaise <khmarbaise@gmx.de> (THANKS!)
+
+ * texi2html.1.in: Updates to reflect new cmd-line options
+
+ * Rewrote handling of command-line options:
+ - based on (My)Simple.pm, and Getopt::Long
+ -help now works and is up-to-date
+ -help 1 lists also "not-so-important" options
+ -help 2 lists also obsolete options
+ - the following options were renamed: (old options still work, but
+ are marked as obsolete)
+ verbose ==> Verbose
+ section_navigation ==> sec_nav
+ output_file ==> out_file
+ - the following options are obsoleted (still work, though):
+ no-section_navigation ==> -nosec_nav
+ use_acc ==> ALWAYS use accents
+ expandinfo ==> -expand info
+ expandtex ==> -expand tex
+ no_verbose ==> default case
+ monolithic ==> default case
+ split_node ==> -split section
+ split_chapter ==> -split chapter
+
+2000-06-27 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * Fixed bug in anchor generation (reported by various people who
+ noticed that @anchor may not be on one line with @item)
+ * Fixed infinite loop on missing '@end macro'
+ * texi2html.pl: -expandinfo and -expandtex command-line options
+ for backward compatibility
+
+ * texi2html.init: Use ISO 639 language codes for keys in $T2H_LANG
+ hash.
+
+2000-06-26 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: new command-line options:
+ -nonumber, -nomenu to unset the default -number -menu
+
+ * texi2html.pl: As suggested by "Richard Y. Kim" <ryk@coho.net>:
+ insert <A NAME="#nodename"></A> for each
+ nodename in a document (nodename is exactly as in texinfo
+ source).
+
+ * From: "Richard Y. Kim" <ryk@coho.net>
+ o $T2H_FRAMES internal boolean variable which defaults to 0
+ o -frames command line option which changes $T2H_FRAMES to 1.
+ o If $T2H_FRAMES is 1, then two additional files are output.
+ If mydoc.html is output normally, then mydoc_frame.html
+ and mydoc_frame_toc.html files are output.
+ o The functions T2H_print_frame, and T2H_print_toc_frame are used to
+ generate contents of these files.
+ o The T2H_DEFAULT_print_frame and T2H_DEFAULT_print_toc_frame
+ (defined in texi2html.ini) do the following:
+ mydoc_frame.html is the short file with <FRAME> tags.
+ mydoc_frame_toc.html is basically the short table of contents
+ which goes on the narrow left frame.
+
+ * texi2html.pl: @,{c} --> &ccedil;
+
+2000-06-23 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * released version 1.63
+ * texi2html.init (T2H_DEFAULT_print_page_head):
+ make <html> tag very first thing in every file
+ * fixed macro quoting and special cases of macro invocation
+ * from "Richard Y. Kim" <ryk@coho.net>:
+ o handle \} in macro arguments
+ * from brlewis@alum.mit.edu:
+ o Changes to facilitate CSS
+ o -toc_file option for those who want the TOC to be index.html
+ o Config variable $T2H_HREF_DIR_INSTEAD_FILE:
+ if set (e.g., to index.html) replace hrefs to this file
+ (i.e., to index.html) by ./
+ * texi2html.pl: index generation after value substitution
+
+2000-05-31 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: for def_map stuff <A NAME=..> before output
+ * texi2html.pl: applied patch from "Richard Y. Kim" <ryk@ap.com>
+ for @refs with 2 or 3 args: use 3rd or 2nd argor
+ section (in that order) as text for reference.
+
+2000-04-18 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: Applied patches of <sunshine@sunshineco.com> to
+ make texi2html work with older versions of Perl
+
+2000-04-13 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: fixed unmacro
+ * distribution: applied patches from Peter Moulder and Teun
+ Burgers.
+ * fixed "Duplicate section found" -- section may now have
+ duplicate names
+ * fixed bug related to $T2H_AVOID_MENU_REDUNDANCY
+
+2000-04-12 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * release 1.62
+ * added $T2H_NODE_NAME_IN_MENU for enforcing node
+ names in meny entries, and $T2H_AVOID_MENU_REDUNDANCY to
+ avoid display of duplicate meny entry information
+
+2000-04-11 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: fixed two small bugs reported by
+ sunshine@sunshineco.com (</TR> in menu, <P> after itemize).
+ * implemented @ftable, @vtable
+ * index generation reimplemented:
+ - Can be split over several pages, depending on the value of
+ $T2H_SPLIT_INDEX
+ - typesetting in fixed-width font is observed
+ * texi2html.init: T2H_IDX_SUMMARY either set or not set, takes no
+ argument.
+
+2000-04-08 Peter Moulder <pjm@bofh.asn.au>
+
+ * Makefile.am, configure.in: Generate texi2html in
+ configure script instead of Makefile. (Due mostly to
+ Teun Burgers.)
+
+ * README, TODO, texi2html.1.in, texi2html.init, texi2html.pl:
+ Misc. documentation changes.
+
+2000-04-07 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.init: $T2H_INDEX_CHAPTER introduced:
+ if set, use this chapter for Index button, else
+ use first chapter whose name matches 'index' (case insensitive)
+ * fixed atuomatic pointer creation for appendix chapters
+ * fixed handling of menu entries with description going into the
+ next line, use numbered section names, if $T2H_NUMBER_SECTIONS
+ * texi2html.init: $T2H_TOP_HEADING for explicitly specifying
+ heading of top node
+ * fixed handling of headings (no new page on -split section)
+ * fixed bug in index (generation of section names)
+ * stoc in _ovr.html within BLOCKQUOTES
+ * get rid of bullets in ToC, if $T2H_NUMBER_SECTIONS
+
+2000-04-06 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * fixed bug in creation of index entries (eval of section names)
+ * fixed table within itemize and parapgraphs
+ * surpress <P></P> when within <pre>
+ * allow @include within top node
+
+2000-04-03 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.init: By default, T2H_TOP_FILE is set to ''
+ * texi2html.pl: $docu_top=$T2H_TOP_FILE || $docu_name. $docu_ext;
+
+2000-03-31 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: $complex_format_map for complex enclosing
+ constructs where which:
+ * texi2html.init:$T2H_EXAMPLE_INDENT_CELL,
+ $T2H_SMALL_EXAMPLE_INDENT_CELL, $T2H_SMALL_FONT_SIZE for
+ customizing indent/font size of block-enclosing texinfo command
+ (@example, @format, @display, etc).
+ * Release version 1.61.
+
+2000-03-29 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * Cleaned up texi2html.pl and added loading of init file (when
+ texi2html.pl is run) such that it can directly be used as script
+ (otherwise, debugging is much harder).
+
+ * fixed getpwuid
+
+ * Added T2H_print_chapter_header, T2H_print_chapter_footer for
+ more fine-grained control of T2H_SPLIT eq 'chapter', added option
+ -section_navigation, $T2H_SECTION_NAVIGATION to suppress output of
+ navigation panels per section
+
+ * Changed naming and and calling convention of customizable subs:
+ They all have prefix T2H_, are called with &$T2H_, are assigned by
+ $T2H_<name> = \&T2H_DEFAULT_<name>.
+
+ * texi2html.init: Incorporated changed of Peter Moulder:
+
+2000-03-27 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * debian/*: deleted
+ * texi2html.pl: Incorporated changes of Peter Moulder
+ * texi2html.pl: Automatic node pointer creation added
+ * texi2html.pl: @enddots, @exclamdown, etc added
+
+2000-03-26 Peter Moulder <reiter@netspace.net.au>
+
+ * texi2html.init: Address a couple of weblint/tidy warnings.
+
+ * texi2html.init:
+ * texi2html.pl: The init file is inserted into the executable at
+ build time (see Makefile.am).
+
+ * texi2html.pl: Source each of @sysconfdir@/texi2htmlrc and
+ $HOME/.texi2htmlrc if it exists, after processing texi2html.init
+ but before anything on the command-line.
+
+ Allow -split_chapter, -split_node, -monolithic options, which is
+ what previous versions of texi2html used.
+
+ Support `@command{...}'.
+
+ Add --help, --version options.
+
+ -sidx isn't used, so comment out.
+
+ * configure.in:
+ * Makefile.am:
+ * autogen.sh: New files.
+
+ * configure.in: Change version number from 1.60Beta to 1.59.2.
+
+ * debian/*: New files.
+
+ * texi2html.1.in:
+ * texi2html.pl: Extract the man page into a separate file. At the
+ moment, the man page is even installed separately (with
+ texi2html.pl having `.so @MANPAGE_PATH@' in place of the
+ manpage). Conceivably we could add a configure option to
+ construct everything as one file like we used to; just replace
+ that text with `@EMBEDDED_MANPAGE@', which would be replaced with
+ either the existing `.so @MANPAGE_PATH@' or with texi2html.1
+ contents the way texi2html.init is done.
+
+2000-03-14 Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ * texi2html.pl: center @image by default, can be overwritten by
+ T2H_CENTER_IMAGE (sunshine@sunshineco.com)
+
+# vim:tabstop=8:shiftwidth=8
diff --git a/Build/source/utils/texi2html/INSTALL b/Build/source/utils/texi2html/INSTALL
new file mode 100644
index 00000000000..b42a17ac464
--- /dev/null
+++ b/Build/source/utils/texi2html/INSTALL
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/Build/source/utils/texi2html/INTRODUCTION b/Build/source/utils/texi2html/INTRODUCTION
new file mode 100644
index 00000000000..bf7051de557
--- /dev/null
+++ b/Build/source/utils/texi2html/INTRODUCTION
@@ -0,0 +1,88 @@
+Getting Started with texi2html
+==============================
+
+'texi2html' converts texinfo documents to HTML.
+
+Texinfo is the official documentation format of the GNU project. It
+uses a single source file to produce both on-line information and
+printed output. For more details about texinfo, see
+http://www.texinfo.org.
+
+In contrast to the HTML produced by 'makeinfo --html' (the 'makeinfo'
+program is part of the Texinfo distribution), the HTML output of
+'texi2html' is highly configurable. Among others, with 'texi2html' you
+can customize your entire page layout (like headers, footers, style
+sheets, etc), split documents at various levels and use 'latex2html' to
+convert @tex sections.
+
+'texi2html' should reasonably convert all Texinfo 4.8 constructs. If
+not, please send a bug report to 'dev@texi2html.cvshome.org'.
+
+
+To create HTML of texinfo documents
+===================================
+
+Make sure that you have 'texi2html' correctly installed on your
+system. The general synopsis of 'texi2html' is
+
+ texi2html [options] texinfo-source-file
+
+Without any options, this will create the file <docname>.html where
+<docname> is the basename of your texinfo files.
+
+See the beginning of the file 'texi2html.init' for explanations of
+command-line options and their default values, or run 'texi2html -h'
+for a short overview of the most important options.
+
+
+Customizing texi2html
+=====================
+
+Initialisation options are read first from
+'/usr/local/etc/texi2html/Config' (the exact location being changeable with
+the '--sysconfdir=dir' option to the configure script), then from
+$HOME/.texi2html/Config, then any command-line options including -init-file
+options; with later settings overriding earlier ones.
+
+The default initialisation options are defined in the
+'texi2html.init' file contained in the Texi2html distribution (in
+fact, 'configure' pastes this file into beginning of texi2html.pl and
+generates the actual 'texi2html' script this way.).
+
+To customize 'texi2html' it is best if you copy the appropriate
+sections from the 'texi2html.init' file into an appropriate local
+initialization file, make the necessary changes there, and then have
+'texi2html' read this initialisation file by one of the means described
+above.
+
+For an example on what you can produce with 'texi2html' have a look
+at the following sites:
+
+* http://www.singular.uni-kl.de/Manual/html/
+
+(Please send me your sites, if you'd like to have them listed here).
+
+
+Documentation of texi2html
+==========================
+The texi2html Texinfo manual should be rather complete. In addition,
+ you might want to have a look at the comments in the 'texi2html.init'
+file for explanations about customizable parameters and at the (not
+up-to-date) texi2html man page for an overview of texi2html's synopsis.
+
+More information
+================
+
+Texi2html's home page can be found at http://texi2html.cvshome.org
+
+The newest version of Texi2html can be obtained from
+http://texi2html.cvshome.org/servlets/ProjectDownloadList
+or, via anonymous cvs (see
+http://texi2html.cvshome.org/servlets/ProjectSource for instructions).
+
+Send email to dev@texi2html.cvshome.org for bug reports, enhancement
+suggestions, and to users@texi2html.cvshome.org for authoring questions
+and general discussion.
+
+
+Good luck and enjoy !!
diff --git a/Build/source/utils/texi2html/Makefile.am b/Build/source/utils/texi2html/Makefile.am
new file mode 100644
index 00000000000..88074f64733
--- /dev/null
+++ b/Build/source/utils/texi2html/Makefile.am
@@ -0,0 +1,125 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = . doc Tests
+imagesdir = $(pkgdatadir)/images
+i18ndir = $(pkgdatadir)/i18n
+
+#
+# This is to prevent texinfo.tex from being included
+# in the top-level distribution directory.
+TEXINFO_TEX = doc/texinfo.tex
+
+bin_SCRIPTS = texi2html
+texi2html_SOURCES = \
+ MySimple.pm \
+ T2h_i18n.pm \
+ texi2html.init \
+ texi2html.pl \
+ translations.pl
+
+noinst_SCRIPTS = manage_i18n.pl
+man_MANS = texi2html.1
+
+EXTRA_DIST = \
+ INTRODUCTION \
+ MySimple.pod \
+ autogen.sh \
+ manage_i18n.pl \
+ missing-texi2html \
+ l2h.init \
+ texi2html.spec \
+ $(texi2html_SOURCES)
+
+dist_pkgdata_DATA = l2h.init \
+ examples/makeinfo.init \
+ examples/xhtml.init \
+ examples/html32.init \
+ examples/book.init \
+ examples/noheaders.init \
+ examples/inlinestyle.init \
+ examples/utf8.init \
+ examples/chm.init \
+ examples/roff.init
+
+dist_i18n_DATA = i18n/en \
+ i18n/de \
+ i18n/es \
+ i18n/fr \
+ i18n/nl \
+ i18n/no \
+ i18n/pt
+
+dist_images_DATA = images/a_begin.gif \
+ images/a_begin_na.gif \
+ images/a_document.gif \
+ images/a_document_na.gif \
+ images/a_empty.gif \
+ images/a_end.gif \
+ images/a_end_na.gif \
+ images/a_help.gif \
+ images/a_help_na.gif \
+ images/a_index.gif \
+ images/a_index_na.gif \
+ images/a_leftdouble.gif \
+ images/a_leftdouble_na.gif \
+ images/a_left.gif \
+ images/a_left_na.gif \
+ images/a_page.gif \
+ images/a_page_na.gif \
+ images/a_rightdouble.gif \
+ images/a_rightdouble_na.gif \
+ images/a_right.gif \
+ images/a_right_na.gif \
+ images/a_searchdoc.gif \
+ images/a_searchdoc_na.gif \
+ images/a_search.gif \
+ images/a_search_na.gif \
+ images/a_tableofcon.gif \
+ images/a_tableofcon_na.gif \
+ images/a_top.gif \
+ images/a_top_na.gif \
+ images/a_up.gif \
+ images/a_up_na.gif \
+ images/bg.jpg \
+ images/bg_left.gif \
+ images/bg_right.gif \
+ images/blue_dir.gif \
+ images/blue_down.gif \
+ images/blue_grab.gif \
+ images/blue_help.gif \
+ images/blue_next.gif \
+ images/blue_nnext.gif \
+ images/blue_pprev.gif \
+ images/blue_prev.gif \
+ images/blue_readme.gif \
+ images/blue_top.gif \
+ images/blue_up.gif \
+ images/blue_uup.gif \
+ images/contents_motif.gif \
+ images/COPYING \
+ images/index_motif.gif \
+ images/Mybg.gif \
+ images/next_motif.gif \
+ images/next_motif_gr.gif \
+ images/previous_motif.gif \
+ images/previous_motif_gr.gif \
+ images/spacer3.gif \
+ images/xy_contents.gif \
+ images/xy_foot.gif \
+ images/xy_next.gif \
+ images/xy_next_gr.gif \
+ images/xy_nextsection.gif \
+ images/xy_nextsection_gr.gif \
+ images/xy_previous.gif \
+ images/xy_previous_gr.gif \
+ images/xy_previoussection.gif \
+ images/xy_previoussection_gr.gif \
+ images/xy_up.gif \
+ images/xy_up_gr.gif
+
+texi2html: $(texi2html_SOURCES)
+
+
+translations.pl: texi2html.pl texi2html.init T2h_i18n.pm examples/roff.init \
+ examples/noheaders.init i18n/de i18n/nl i18n/es i18n/no i18n/pt i18n/fr
+ $(PERL) $(srcdir)/manage_i18n.pl all
diff --git a/Build/source/utils/texi2html/Makefile.in b/Build/source/utils/texi2html/Makefile.in
new file mode 100644
index 00000000000..2ce266309aa
--- /dev/null
+++ b/Build/source/utils/texi2html/Makefile.in
@@ -0,0 +1,817 @@
+# Makefile.in generated by automake 1.9.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(dist_i18n_DATA) \
+ $(dist_images_DATA) $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/check_texinfo.pl.in \
+ $(srcdir)/texi2html.1.in $(srcdir)/texi2html.pl \
+ $(srcdir)/texi2html.spec.in $(top_srcdir)/configure AUTHORS \
+ COPYING ChangeLog INSTALL NEWS TODO config.guess config.sub \
+ install-sh mdate-sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = texi2html check_texinfo.pl texi2html.1
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
+ "$(DESTDIR)$(i18ndir)" "$(DESTDIR)$(imagesdir)" \
+ "$(DESTDIR)$(pkgdatadir)"
+binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(bin_SCRIPTS) $(noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+dist_i18nDATA_INSTALL = $(INSTALL_DATA)
+dist_imagesDATA_INSTALL = $(INSTALL_DATA)
+dist_pkgdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(dist_i18n_DATA) $(dist_images_DATA) $(dist_pkgdata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_DATE = @PACKAGE_DATE@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_UNICODE = @USE_UNICODE@
+VERSION = @VERSION@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIRS = . doc Tests
+imagesdir = $(pkgdatadir)/images
+i18ndir = $(pkgdatadir)/i18n
+
+#
+# This is to prevent texinfo.tex from being included
+# in the top-level distribution directory.
+TEXINFO_TEX = doc/texinfo.tex
+bin_SCRIPTS = texi2html
+texi2html_SOURCES = \
+ MySimple.pm \
+ T2h_i18n.pm \
+ texi2html.init \
+ texi2html.pl \
+ translations.pl
+
+noinst_SCRIPTS = manage_i18n.pl
+man_MANS = texi2html.1
+EXTRA_DIST = \
+ INTRODUCTION \
+ MySimple.pod \
+ autogen.sh \
+ manage_i18n.pl \
+ missing-texi2html \
+ l2h.init \
+ texi2html.spec \
+ $(texi2html_SOURCES)
+
+dist_pkgdata_DATA = l2h.init \
+ examples/makeinfo.init \
+ examples/xhtml.init \
+ examples/html32.init \
+ examples/book.init \
+ examples/noheaders.init \
+ examples/inlinestyle.init \
+ examples/utf8.init \
+ examples/chm.init \
+ examples/roff.init
+
+dist_i18n_DATA = i18n/en \
+ i18n/de \
+ i18n/es \
+ i18n/fr \
+ i18n/nl \
+ i18n/no \
+ i18n/pt
+
+dist_images_DATA = images/a_begin.gif \
+ images/a_begin_na.gif \
+ images/a_document.gif \
+ images/a_document_na.gif \
+ images/a_empty.gif \
+ images/a_end.gif \
+ images/a_end_na.gif \
+ images/a_help.gif \
+ images/a_help_na.gif \
+ images/a_index.gif \
+ images/a_index_na.gif \
+ images/a_leftdouble.gif \
+ images/a_leftdouble_na.gif \
+ images/a_left.gif \
+ images/a_left_na.gif \
+ images/a_page.gif \
+ images/a_page_na.gif \
+ images/a_rightdouble.gif \
+ images/a_rightdouble_na.gif \
+ images/a_right.gif \
+ images/a_right_na.gif \
+ images/a_searchdoc.gif \
+ images/a_searchdoc_na.gif \
+ images/a_search.gif \
+ images/a_search_na.gif \
+ images/a_tableofcon.gif \
+ images/a_tableofcon_na.gif \
+ images/a_top.gif \
+ images/a_top_na.gif \
+ images/a_up.gif \
+ images/a_up_na.gif \
+ images/bg.jpg \
+ images/bg_left.gif \
+ images/bg_right.gif \
+ images/blue_dir.gif \
+ images/blue_down.gif \
+ images/blue_grab.gif \
+ images/blue_help.gif \
+ images/blue_next.gif \
+ images/blue_nnext.gif \
+ images/blue_pprev.gif \
+ images/blue_prev.gif \
+ images/blue_readme.gif \
+ images/blue_top.gif \
+ images/blue_up.gif \
+ images/blue_uup.gif \
+ images/contents_motif.gif \
+ images/COPYING \
+ images/index_motif.gif \
+ images/Mybg.gif \
+ images/next_motif.gif \
+ images/next_motif_gr.gif \
+ images/previous_motif.gif \
+ images/previous_motif_gr.gif \
+ images/spacer3.gif \
+ images/xy_contents.gif \
+ images/xy_foot.gif \
+ images/xy_next.gif \
+ images/xy_next_gr.gif \
+ images/xy_nextsection.gif \
+ images/xy_nextsection_gr.gif \
+ images/xy_previous.gif \
+ images/xy_previous_gr.gif \
+ images/xy_previoussection.gif \
+ images/xy_previoussection_gr.gif \
+ images/xy_up.gif \
+ images/xy_up_gr.gif
+
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+texi2html: $(top_builddir)/config.status $(srcdir)/texi2html.pl
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+check_texinfo.pl: $(top_builddir)/config.status $(srcdir)/check_texinfo.pl.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+texi2html.1: $(top_builddir)/config.status $(srcdir)/texi2html.1.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+texi2html.spec: $(top_builddir)/config.status $(srcdir)/texi2html.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-binSCRIPTS: $(bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+install-dist_i18nDATA: $(dist_i18n_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(i18ndir)" || $(mkdir_p) "$(DESTDIR)$(i18ndir)"
+ @list='$(dist_i18n_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_i18nDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(i18ndir)/$$f'"; \
+ $(dist_i18nDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(i18ndir)/$$f"; \
+ done
+
+uninstall-dist_i18nDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_i18n_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(i18ndir)/$$f'"; \
+ rm -f "$(DESTDIR)$(i18ndir)/$$f"; \
+ done
+install-dist_imagesDATA: $(dist_images_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(imagesdir)" || $(mkdir_p) "$(DESTDIR)$(imagesdir)"
+ @list='$(dist_images_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_imagesDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(imagesdir)/$$f'"; \
+ $(dist_imagesDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(imagesdir)/$$f"; \
+ done
+
+uninstall-dist_imagesDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_images_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(imagesdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(imagesdir)/$$f"; \
+ done
+install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
+ @list='$(dist_pkgdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+uninstall-dist_pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/. $(distdir)/examples $(distdir)/i18n $(distdir)/images
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(SCRIPTS) $(MANS) $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(i18ndir)" "$(DESTDIR)$(imagesdir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-dist_i18nDATA install-dist_imagesDATA \
+ install-dist_pkgdataDATA install-man
+
+install-exec-am: install-binSCRIPTS
+
+install-info: install-info-recursive
+
+install-man: install-man1
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binSCRIPTS uninstall-dist_i18nDATA \
+ uninstall-dist_imagesDATA uninstall-dist_pkgdataDATA \
+ uninstall-info-am uninstall-man
+
+uninstall-info: uninstall-info-recursive
+
+uninstall-man: uninstall-man1
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-generic \
+ distclean-recursive distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-binSCRIPTS install-data \
+ install-data-am install-dist_i18nDATA install-dist_imagesDATA \
+ install-dist_pkgdataDATA install-exec install-exec-am \
+ install-info install-info-am install-man install-man1 \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-binSCRIPTS \
+ uninstall-dist_i18nDATA uninstall-dist_imagesDATA \
+ uninstall-dist_pkgdataDATA uninstall-info-am uninstall-man \
+ uninstall-man1
+
+
+texi2html: $(texi2html_SOURCES)
+
+translations.pl: texi2html.pl texi2html.init T2h_i18n.pm examples/roff.init \
+ examples/noheaders.init i18n/de i18n/nl i18n/es i18n/no i18n/pt i18n/fr
+ $(PERL) $(srcdir)/manage_i18n.pl all
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texi2html/MySimple.pm b/Build/source/utils/texi2html/MySimple.pm
new file mode 100644
index 00000000000..75c25dc5d0d
--- /dev/null
+++ b/Build/source/utils/texi2html/MySimple.pm
@@ -0,0 +1,236 @@
+package Getopt::MySimple;
+
+# Name:
+# Getopt::MySimple.
+#
+# Documentation:
+# POD-style (incomplete) documentation is in file MySimple.pod
+#
+# Tabs:
+# 4 spaces || die.
+#
+# Author:
+# Ron Savage rpsavage@ozemail.com.au.
+# 1.00 19-Aug-97 Initial version.
+# 1.10 13-Oct-97 Add arrays of switches (eg '=s@').
+# 1.20 3-Dec-97 Add 'Help' on a per-switch basis.
+# 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase.
+# 1.40 10-Nov-98 Change width of help report. Restructure tests.
+# 1-Jul-00 Modifications for Texi2html
+
+# --------------------------------------------------------------------------
+# Locally modified by obachman (Display type instead of env, order by cmp)
+# $Id: MySimple.pm,v 1.4 2004/02/10 00:12:42 pertusus Exp $
+
+# use strict;
+# no strict 'refs';
+
+use vars qw(@EXPORT @EXPORT_OK @ISA);
+use vars qw($fieldWidth $opt $VERSION);
+
+use Exporter();
+use Getopt::Long;
+
+@ISA = qw(Exporter);
+@EXPORT = qw();
+@EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}.
+
+# --------------------------------------------------------------------------
+
+$fieldWidth = 20;
+$VERSION = '1.41';
+
+# --------------------------------------------------------------------------
+
+sub byOrder
+{
+ my($self) = @_;
+
+ return uc($a) cmp (uc($b));
+}
+
+# --------------------------------------------------------------------------
+
+sub dumpOptions
+{
+ my($self) = @_;
+
+ print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n";
+
+ for (sort byOrder keys(%{$self -> {'opt'} }) )
+ {
+ print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n";
+ }
+
+ print "\n";
+
+} # End of dumpOptions.
+
+# --------------------------------------------------------------------------
+# Return:
+# 0 -> Error.
+# 1 -> Ok.
+
+sub getOptions
+{
+ push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0.
+ push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1.
+
+ my($self, $default, $helpText, $versionText,
+ $helpThenExit, $versionThenExit, $ignoreCase) = @_;
+
+ $helpThenExit = 1 unless (defined($helpThenExit));
+ $versionThenExit = 1 unless (defined($versionThenExit));
+ $ignoreCase = 0 unless (defined($ignoreCase));
+
+ $self -> {'default'} = $default;
+ $self -> {'helpText'} = $helpText;
+ $self -> {'versionText'} = $versionText;
+ $Getopt::Long::ignorecase = $ignoreCase;
+
+ unless (defined($self -> {'default'}{'help'}))
+ {
+ $self -> {'default'}{'help'} =
+ {
+ type => ':i',
+ default => '',
+ linkage => sub {$self->helpOptions($_[1]); sleep 5;exit (0) if $helpThenExit;},
+ verbose => "print help and exit"
+ };
+ }
+
+ unless (defined($self -> {'default'}{'version'}))
+ {
+ $self -> {'default'}{'version'} =
+ {
+ type => '',
+ default => '',
+ linkage => sub {print $self->{'versionText'}; exit (0) if $versionThenExit;},
+ verbose => "print version and exit"
+ };
+ }
+
+ for (keys(%{$self -> {'default'} }) )
+ {
+ my $type = ${$self -> {'default'} }{$_}{'type'};
+ push(@{$self -> {'type'} }, "$_$type");
+ $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'}
+ if ${$self -> {'default'} }{$_}{'linkage'};
+ }
+
+ my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} });
+
+ return $result unless $result;
+
+ for (keys(%{$self -> {'default'} }) )
+ {
+ if (! defined(${$self -> {'opt'} }{$_})) #{
+ {
+ ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'};
+ }
+ }
+
+ $result;
+} # End of getOptions.
+
+# --------------------------------------------------------------------------
+
+sub helpOptions
+{
+ my($self) = shift;
+ my($noHelp) = shift;
+ $noHelp = 0 unless $noHelp;
+ my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth)
+ = (10, 5, 9, 78, 4, 11);
+
+ print "$self->{'helpText'}" if ($self -> {'helpText'});
+
+ print ' Option', ' ' x ($optwidth - length('Option') -1 ),
+ 'Type', ' ' x ($typewidth - length('Type') + 1),
+ 'Default', ' ' x ($defaultwidth - length('Default') ),
+ "Description\n";
+
+ for (sort byOrder keys(%{$self -> {'default'} }) )
+ {
+ my($line, $help, $option, $val);
+ $option = $_;
+ next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp;
+ #$line = " -$_" . ' ' x ($optwidth - (2 + length) ) .
+ # "${$self->{'default'} }{$_}{'type'} ".
+ # ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
+ $line = " --$_" . "${$self->{'default'} }{$_}{'type'}".
+ ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
+
+ $val = ${$self->{'default'} }{$_}{'linkage'};
+ if ($val)
+ {
+ if (ref($val) eq 'SCALAR')
+ {
+ $val = $$val;
+ }
+ else
+ {
+ $val = '';
+ }
+ }
+ else
+ {
+ $val = ${$self->{'default'} }{$_}{'default'};
+ }
+ $line .= "$val ";
+ $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line));
+
+ if (defined(${$self -> {'default'} }{$_}{'verbose'}) &&
+ ${$self -> {'default'} }{$_}{'verbose'} ne '')
+ {
+ $help = "${$self->{'default'} }{$_}{'verbose'}";
+ }
+ else
+ {
+ $help = ' ';
+ }
+ if ((length("$line") + length($help)) < $maxlinewidth)
+ {
+ print $line , $help, "\n";
+ }
+ else
+ {
+ print $line, "\n", ' ' x $valind, $help, "\n";
+ }
+ for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}}))
+ {
+ print ' ' x ($valind + 2);
+ print $val, ' ', ' ' x ($valwidth - length($val) - 2);
+ print ${$self->{'default'}}{$option}{'values'}{$val}, "\n";
+ }
+ }
+
+ print <<EOT;
+Note: 'Options' may be abbreviated. 'Type' specifications mean:
+ <none>| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo)
+ =s | :s mandatory (or, optional) string argument
+ =i | :i mandatory (or, optional) integer argument
+EOT
+} # End of helpOptions.
+
+#-------------------------------------------------------------------
+
+sub new
+{
+ my($class) = @_;
+ my($self) = {};
+ $self -> {'default'} = {};
+ $self -> {'helpText'} = '';
+ $self -> {'opt'} = {};
+ $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}.
+ $self -> {'type'} = ();
+
+ return bless $self, $class;
+
+} # End of new.
+
+# --------------------------------------------------------------------------
+
+1;
+
+# End MySimple.pm
diff --git a/Build/source/utils/texi2html/MySimple.pod b/Build/source/utils/texi2html/MySimple.pod
new file mode 100644
index 00000000000..100f9759fcd
--- /dev/null
+++ b/Build/source/utils/texi2html/MySimple.pod
@@ -0,0 +1,187 @@
+=head1 NAME
+
+C<Getopt::MySimple> - Provide a simple wrapper around Getopt::Long.
+=head NOTE
+Based on GetOpt::Simple, with some (here undocumented) modifications
+to fit texi2hml needs.
+
+=head1 SYNOPSIS
+
+ use Getopt::MySimple;
+
+ # Or ...
+ # use Getopt::MySimple qw($opt);
+
+ my($options) =
+ {
+ 'help' =>
+ {
+ 'type' => '',
+ 'default' => '',
+# 'verbose' => '', # Not needed on every key.
+ },
+ 'username' =>
+ {
+ 'type' => '=s', # As per Getopt::Long.
+ 'default' => $ENV{'USER'} || 'RonSavage', # In case $USER is undef.
+ 'verbose' => 'Specify the username on the remote machine',
+ },
+ 'password' =>
+ {
+ 'type' => '=s',
+ 'default' => 'password',
+ 'verbose' => 'Specify the password on the remote machine',
+ },
+ };
+
+ my($option) = new Getopt::MySimple;
+
+ if (! $option -> getOptions($options, "Usage: testMySimple.pl [options]") )
+ {
+ exit(-1); # Failure.
+ }
+
+ print "username: $option->{'opt'}{'username'}. \n";
+ print "password: $option->{'opt'}{'password'}. \n";
+
+ # Or, after 'use Getopt::MySimple qw($opt);' ...
+ # print "username: $opt->{'username'}. \n";
+ # print "password: $opt->{'password'}. \n";
+
+=head1 DESCRIPTION
+
+The C<Getopt::MySimple> module provides a simple way of specifying:
+
+=over 4
+
+=item *
+
+Command line optes
+
+=item *
+
+Type information for opt values
+
+=item *
+
+Default values for the optes
+
+=item *
+
+Help text per opt
+
+=back
+
+=head1 The C<getOptions()> function
+
+The C<getOptions()> function takes 4 parameters:
+
+=over 4
+
+=item *
+
+A hash defining the command line optes
+
+=item *
+
+A string to display as a help text heading
+
+=item *
+
+A Boolean. 0 = (Default) Use case-sensitive opt names. 1 = Ignore case
+
+=item *
+
+A Boolean. 0 = Return after displaying help. 1 = (Default) Terminate with exit(0)
+after displaying help
+
+=back
+
+=head1 The $classRef -> {'opt'} hash reference
+
+Command line option values are accessed in your code by dereferencing
+the hash reference $classRef -> {'opt'}. Two examples are given above,
+under synopsis.
+
+Alternately, you can use the hash reference $opt. See below.
+
+=head1 The $opt hash reference
+
+Command line option values are accessed in your code by dereferencing
+the hash reference $opt. Two examples are given above,
+under synopsis.
+
+Alternately, you can use the hash reference $classRef -> {'opt'}. See above.
+
+=head1 The C<dumpOptions()> function
+
+C<dumpOptions()> prints all your option's keys and their current values.
+
+=head1 The C<helpOptions()> function
+
+C<helpOptions()> prints nicely formatted help text.
+
+=head1 WARNING re Perl bug
+
+As always, be aware that these 2 lines mean the same thing, sometimes:
+
+=over 4
+
+=item *
+
+$self -> {'thing'}
+
+=item *
+
+$self->{'thing'}
+
+=back
+
+The problem is the spaces around the ->. Inside double quotes, "...", the
+first space stops the dereference taking place. Outside double quotes the
+scanner correctly associates the $self token with the {'thing'} token.
+
+I regard this as a bug.
+
+=head1 REQUIRED MODULES
+
+=over 4
+
+=item *
+
+Exporter
+
+=item *
+
+Getopt::Long
+
+=back
+
+=head1 RETURN VALUES
+
+=over 4
+
+=item *
+
+C<dumpOptions()> returns nothing
+
+=item *
+
+C<helpOptions()> returns nothing
+
+=item *
+
+C<getOptions()> returns 0 for failure and 1 for success
+
+=back
+
+=head1 AUTHOR
+
+C<Getopt::MySimple> was written by Ron Savage I<E<lt>rpsavage@ozemail.com.auE<gt>> in 1997.
+
+Modifications for texi2html by Olaf Bachmann
+I<E<lt>obachman@mathtematik.uni-kl.deE<gt>> in 2000.
+=head1 LICENCE
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
diff --git a/Build/source/utils/texi2html/NEWS b/Build/source/utils/texi2html/NEWS
new file mode 100644
index 00000000000..84b2aac7bae
--- /dev/null
+++ b/Build/source/utils/texi2html/NEWS
@@ -0,0 +1,399 @@
+This file records noteworthy changes.
+
+1.76 (February 3 2005)
+
+* BUG FIXES
+ ---------
+
+* Perl no longer needs to be installed at build time, but when it is not, the
+ path to `perl' that will be used at run time must be passed to the
+ `configure' script.
+
+1.74 (January 31 2005)
+
+* COMPATIBILITY
+ -------------
+
+* The argument on def like commands line (@deffn and friends) may be
+ bracketed, therefore there is no difference between this element and
+ others. There is no need of items with { in front in the %def_map
+ anymore.
+
+* NEW FEATURES
+ ------------
+
+* More @-commands are available to the user, that were ignored before.
+ Most of these @-commands are those related with structure or printed
+ output.
+
+* BUG FIXES
+ ---------
+
+* many deffn and friends line parsing bugs fixed.
+
+1.72 (December 29 2004)
+
+* NEW FEATURES
+ ------------
+
+* Handle texinfo 4.7 constructs:
+ @caption, @shortcaption, @ordf, @ordm, @registeredsymbol, @deftypecv,
+ @LaTeX, @indicateurl, @docbook, @ifdocbook, @ifnotdocbook, @comma,
+ @headitem, @quotation second arg, @acronym second arg.
+ @url is now a synonym for @uref. @ at the end of a @def* line continues the
+ line.
+ Handle texinfo 4.8 constructs:
+ @abbr, @slanted, @euro and @sansserif.
+* Cross refs are done according to the specification presented in the texinfo
+ manual in the node HTML Xref.
+
+* BUG FIXES
+ ---------
+
+* Re enable compatibility with perl older that 5.6.
+
+1.70 (March 24 2004)
+
+* BUG FIXES
+ ---------
+
+* use i18n files even when translations.pl is not included. Include
+ translations.pl.
+
+* COMPATIBILITY
+ -------------
+
+* install html manual in $datadir/texinfo/html.
+
+* NEW FEATURES
+ ------------
+
+* Add a spec file, usefull to build a rpm.
+
+* FOR DEVELOPERS
+ --------------
+
+* Standardized on Autoconf 2.59 & Automake 1.8.3
+
+1.68 (March 20 2004)
+
+* COMPATIBILITY
+ -------------
+
+* When the manual is split the default is to put resulting files in a
+ directory with name the manual file basename (previously they were left in
+ the current directory). To avoid that, call texi2html with '-output .'.
+
+* The main configuration files are now ./Config, ~/.texi2html/Config,
+ $sysconfdir/texi2html/Config and last $datadir/texi2html/Config. They are
+ sourced in that order.
+ In the future `/etc/texi2htmlrc' and `~/.texi2htmlrc' will no longer be
+ sourced and any existing site or user configuration should be moved to the
+ new locations if you wish it to be used by newer versions of Texi2HTML.
+
+* Translation files are now stored in $datadir/texi2html/i18n/*,
+ $sysconfdir/texi2html/i18n/*, ~/.texi2html/i18n/*, and sourced in that order.
+ The translated strings are now associated with the english strings.
+ Please see the documentation for the format of the new translation files.
+
+* First index page is the first page with a non empty index (with @printindex).
+
+* The glossary and bibliography terms aren't searched anymore. You should use
+ @macro to simulate these features (look at Tests/macros/glossary.texi for
+ an example).
+
+* We've standardized on GNU-style `--' prefixed long options, rather than the
+ old single-dash prefixed long options in the help, but the single-dash style
+ is still accepted on the command line for the time being.
+ We also changed `_' to `-' in option names.
+
+* @setref handling is removed as the right corresponding @-command is @anchor.
+
+* No more global variables outside of namespaces.
+ Global variables are now in the Texi2HTML namespace.
+ leading T2H_ is stripped from variable, hashes and array names. You should
+ change your variable names for the new release. As the global variables
+ (%THISDOC, $THIS_SECTION...) are in the Texi2HTML namespace you should use,
+ for example, $Texi2HTML::THISDOC{'fulltitle'} now.
+ functions from the main program should now be qualified in the main
+ namespace. t2h_ is stripped from the function names too.
+ t2h_anchor is now a function reference in init file, and thus should
+ be called like &$anchor(...).
+ toc file and main file are arguments for print_frame, overview lines are
+ arguments for print_toc_frame (instead of global variables).
+
+* $THISPROG, $T2H_HOMEPAGE, $T2H_AUTHORS, $T2H_TODAY, $T2H_USER are now
+ values associated with the following keys in %Texi2HTML::THISDOC:
+ `program', `program_homepage', `today', `user'.
+
+* Changes in the function reference used for the page layout:
+ print_section don't do the end of page or section anymore (except when
+ split at node), end_section does the end of a section, and print_*_footer
+ does the end of page.
+ the print_*_header, print_*_footer... functions take a ref on the buttons
+ array as argument, instead of using the $T2H_BUTTONS global variable.
+ Have a look at the texi2html.init file to update your configuration files.
+
+* T2H_InitGlobals is not used anymore. Use the function reference init_out
+ to define $BODYTEXT dynamically and %Texi2HTML::THISDOC values in
+ print_page_foot and about_body to recreate the address instead of the
+ $T2H_ADDRESS.
+ You can have a look at program_string in texi2html.init which recreates
+ the address. $T2H_ADDRESS isn't used anymore.
+
+* variables for latex2html are not in texi2html init file anymore but in
+ l2h.init.
+
+* don't expand @ifinfo regions by default.
+
+* option --output obsoletes -out_file and -subdir. It is the same than
+ --out_file when output is not split, and the same than --subdir when it is
+ split.
+
+* If not split, the resulting file has a leading directory, and the directory
+ doesn't exist, it is created.
+
+* If a directory creation fails the program aborts.
+
+* Don't use T2H_CENTER_IMAGE, @center should be used.
+
+* the init_out function redefines dynamically %NAVIGATION_TEXT, %BUTTONS_GOTO
+ and $BODYTEXT. You should redefine the hash values in that function. If you
+ want to reuse the values of the default values set by init_out,
+ you could do something like:
+
+ my $default_init_out = $init_out;
+ $init_out = \&makeinfo_like_init_out;
+ sub makeinfo_like_init_out()
+ {
+ my $encoding = &$default_init_out();
+ $NAVIGATION_TEXT{'Following'} = ' &gt; ';
+ return $encoding;
+ }
+
+* NEW FEATURES
+ ------------
+
+* Many changes towards output of stricter HTML.
+
+* initialization files for html 3.2, xhtml, html 4.0 with inline style,
+ no header, utf8 characters outputted, makeinfo style, book style, conversion
+ to chm files and conversion to roff. Initialization files are searched
+ in ./, ~/.texi2html, $sysconfdir/texi2html and last $datadir/texi2html.
+ The file names are html32.init, xhtml.init, inlinestyle.init,
+ noheaders.init, utf8.init, makeinfo.init, book.init, chm.init and roff.init.
+
+* The test suite is much more comprehensive and uses validate and tidy to
+ assess the correctness of the HTML.
+
+* Handling of @html, @verbatim, @verb, @sp, @=, @copying, @insertcopying,
+ @cartouche, @titlefont, @dircategory, @direntry, @shorttitlepage, @\,
+ @afourlatex, @afourwide, @firstparagraphindent, @exampleindent, @novalidate,
+ @definfoenclose, @kbdinputstyle, @centerchap, @documentdescription,
+ @documentencoding, @contents, @shortcontents, @verbatiminclude.
+
+* With --no-validate node cross-reference validation is suppressed (like
+ @novalidate).
+
+* --expand may be specified more than once such that more than one additional
+ region could be expanded. --noexpand does the reverse. --iftex, --ifinfo...
+ and --no-ifinfo... can be used instead.
+
+* add http-equiv="Content-Type" tag for the charset declaration.
+
+* HTML formatting is isolated in customizable functions located in the
+ initialization files.
+
+* menu comments are in a preformatted context.
+
+* Any combination of caps for `top' leads to the top node.
+
+* @ref{(perl)Top} leads to a ref to the info manual.
+
+* References to external manual in @ref and menus are links to the html
+ pages (with the same convention than makeinfo --html use).
+ --html-xref-prefix is the base dir for external manual references.
+
+* With --node-files do a file per node which can be used as a target for
+ cross references from other manuals (including manuals generated with
+ makeinfo --html).
+
+* With --use-nodes nodes are sectionning commands whe they are not associated
+ with a structuring command.
+
+* With --toc-links create links from headings to toc entries.
+
+* distinct directions (next, prev...) for nodes and sections, more directions.
+
+* split at chapter, section or for every node.
+
+* new possibilities for buttons. If this is a ref to a scalar, the text
+ appears in navigation. If it is an array, the first element is a direction
+ used for the href, the second element is a scalar ref for the text.
+
+* With --noseparated-footnotes the footnotes are in the same page than the
+ text.
+
+* %NO_TEXI hash similar with %HREF but without texinfo commands,
+ %THISDOC{'title_no_texi'}
+
+* "-U value" does the same than "@clear value".
+
+* -P option prepends directory for include files before the document directory.
+
+* -macro-expand generates a file with expanded macros and @include.
+
+* pass $L2H_HTML_VERSION for the html version to latex2html.
+
+* support for css. The --css-include option does the same than in makeinfo
+ (parse the file, and echo the @import part before the texi2html css rules,
+ the rules part after the texi2html css rules).
+ The texi2html css commands may be customized too.
+
+* Text before the first @node or sectionning command is part of the first
+ section unless -ignore-preamble-text is set.
+
+* if `-' is given to the -output option, output on STDOUT.
+
+* Add images from the Singular project.
+
+* All the strings appearing in the HTML are internationalized.
+
+* centering and flushing is really handled.
+
+* Format titlepage (even though the formatted text isn't used by default).
+
+* Handle all the encodings perl knows about.
+
+* BUG FIXES
+ ---------
+
+* @multitable size determination, out of bounds columns ignored.
+
+* In @table and @itemize, @item is replaced by the @-command argument.
+
+* nested @-commands are better handled.
+
+* in index keys @-commands are replaced by the right symbols.
+
+* files are omitted in hrefs when they points to the same file.
+
+* $value{_title}... are expanded during HTML generation.
+
+* @H{a} leads to a'' and not &aacute;
+
+* cedilla are accepted in node names.
+
+* Any characters are accepted in menu comments.
+
+* frame target is the top file, and not the toc file.
+
+* rewriting of the @macro code completely. This likely fixed some bugs but
+ this hasn't been verified by running the new, more complex test cases
+ against the old code.
+
+* rewriting of the document structure resolution.
+ unnumbered regions are at the right level and splitted indices don't break
+ the document structure anymore.
+ index entries and footnotes are more precisely located.
+
+* @-commands ignored are ignored with the line, the arg or following spaces
+ like makeinfo does.
+
+* FOR DEVELOPERS
+ --------------
+
+* Standardized on Autoconf 2.59 & Automake 1.8.2
+
+* The --enable-maintainer-mode option is now required by configure to enable
+ what is considered the maintainer-specific portions of Makefiles. This
+ includes the portions which automatically rebuild the configure and build
+ files (configure, aclocal, Makefile.in, etc) when configure.in or other
+ dependencies are changed.
+
+* The config is in the Texi2HTML::Config namespace. The latex2html related
+ functions are in the Texi2HTML::LaTeX2HTML namespace. The
+ internationalization functions are in the Texi2HTML::I18n namespace in
+ T2h_i18n.pm.
+
+1.66 (June 8 2002)
+* Many bug fixes.
+
+1.65 (August 26 2001)
+* Many bug fixes.
+* The operation of the previously broken << (FastBack) and >> (FastForward)
+ buttons has changed slightly. FastBack now returns to the beginning of the
+ current chapter and FastForward now jumps to the beginning of the next
+ chapter.
+
+1.64 (July 3 2000)
+* Incorporated first version of Texi2html Texinfo manual, authored by
+ Karl Heinz Marbaise <khmarbaise@gmx.de>
+* New handling of command line options:
+ - can be abbreviated to shortest unique prefix
+ -help now works and is up-to-date
+
+1.63 (June 23 2000)
+* New customization variable:
+ $T2H_HREF_DIR_INSTEAD_FILE:
+ if set (e.g., to index.html) replace hrefs to this file
+ (i.e., to index.html) by ./
+* New command-line option:
+ -toc_file FILE
+ for those who want the TOC to be in FILE
+* bug fixes related to macro invocation
+
+1.62 (12 April 2000)
+* New customization variables:
+ $T2H_SPLIT_INDEX [default: = 100]
+ index pages are split at next letter, if more than that many entries
+ $T2H_NODE_NAME_IN_MENU [default = 0]
+ for enforcing node names in meny entries
+ $T2H_AVOID_MENU_REDUNDANCY [default = 1]
+ to avoid display of duplicate meny entry information
+ $T2H_INDEX_CHAPTER [default = '']
+ if set, use chapter of this name for 'Index' Button in
+ navigation bars, else use first chapter whose name matches
+ "index" (case insensitive).
+ $T2H_TOP_HEADING [ default = '']
+ if non-empty, and no heading is in Top node, then use this as heading
+ for top node/section; otherwise, use @settitle, @shorttitle.
+* index generation: observes typesetting in fixed-width font, @ftable,
+ @vtable implemented
+* Peter Moulder & Teun Burgers: Misc documentation and distribution
+ changes
+* numerous small bugs fixed (handling of menu entries, paragraphs in
+ lists/tables, etc).
+
+
+1.61 (31 March 2000)
+* By default, $T2H_TOP_FILE is not set, and so $docu_name.html is used.
+* Added T2H_print_chapter_header, T2H_print_chapter_footer for more
+ fine-grained control of T2H_SPLIT eq 'chapter', added option
+ -section_navigation, $T2H_SECTION_NAVIGATION to supress output of
+ navigation panels per section
+* naming scheme and calling convention of customizable subs changed:
+ prefix T2H_, call &$T2H_, assignment $T2H_<name> = \&T2H_DEFAULT_<name>
+* mailinglist created: texi2html@mathematik.uni-kl.de
+* conversion to standard gnu package with Makefile.am, README,
+ AUTHORS, etc. (Peter Moulder <reiter@netspace.net.au>)
+* Initialization as suggested by Peter Moulder:
+ 1. /usr/local/etc/texi2htmlrc (or whatever given by --sysconfdir to
+ configure)
+ 2. $HOME/.texi2htmlrc
+ 3. command-line options, including -init_file
+ where later options override previous ones.
+* incoporated patches from Peter Moulder (backward-compatible
+ command-line options, separate man-page, etc).
+* Automatic node pointer creation added
+* @enddots, @exclamdown, @pounds, and relatives added.
+
+Major Changes from 1.58 to 1.60
+* primitve foreign language support
+* support of all "Umlaute"
+* anchors, macros
+* latex2html incooperation
+* customizable page layout (texi2html.init)
+* index as table with corresponding sections
+
+
diff --git a/Build/source/utils/texi2html/README b/Build/source/utils/texi2html/README
new file mode 100644
index 00000000000..ee5a2027ec1
--- /dev/null
+++ b/Build/source/utils/texi2html/README
@@ -0,0 +1,113 @@
+This is the README file for the GNU texi2html distribution.
+The primary distribution point is
+http://texi2html.cvshome.org/servlets/ProjectDownloadList
+
+For generic installation instructions on compiling and installing this
+Automake-based distribution, please read the file `INSTALL'.
+Installation notes specific to Texi2html:
+* Installation is fairly simple, no compilers are required.
+* You need to have perl version 5 or higher installed on your system
+ to run 'texi2html'.
+* To generate Makefile.in etc., run `./autogen.sh'
+
+This distribution includes the following files, among others:
+ README This file.
+
+ NEWS Summary of new features by release.
+
+ INTRODUCTION Brief introduction to texi2html and
+ its usage.
+
+ INSTALL Generic installation instructions.
+
+ TODO Things which are yet to be done.
+
+Texi2html source files:
+
+ texi2html Actual script to run. Generated by
+ 'configure' from texi2html.pl,
+ texi2html.init, MySimple.pm, T2h_i18n.pm,
+ l2h.init and translations.pl.
+
+ texi2html.pl Main source file of the converter.
+
+ texi2html.init Default values of configurable
+ parameters. `configure' inserts this
+ file into texi2html.pl when it generates
+ the actual `texi2html' script.
+
+ MySimple.pm Perl module which handles the
+ processing of command-line options.
+ `configure' inserts this file into
+ texi2html.pl when it generates
+ the actual `texi2html' script.
+
+ T2h_i18n.pm Code used to handle strings
+ internationalization.
+
+ translations.pl translations of strings generated by
+ the script `manage_i18n.pl' from source
+ files and files in the `i18n' directory.
+
+ l2h.init default configuration file for `latex2html'
+ used to convert maths and TeX.
+
+ i18n/ Directory containing one file per language
+ with translation of strings.
+
+Helper scripts
+
+ manage_i18n.pl Helper script used to regenerate translations
+ from the source files and the files in the
+ `i18n/' directory.
+
+Documentation files:
+
+ texi2html.texi Texinfo manual of texi2html. This
+ manual is currently under construction.
+
+ texi2html.1.in Template for generation of man pages
+ of texi2html (`texi2html.1'). This man
+ page is incomplete.
+
+Installation files:
+
+ configure This file creates creates a Makefile
+ which in turn creates an `info' or
+ `makeinfo' executable, or a C sources
+ distribution.
+
+ configure.in This is a template for creating
+ `configure' using Autoconf.
+
+ Makefile.in This is a template for `configure'
+ to use to make a Makefile. Created by
+ Automake.
+
+ Makefile.am This is a template for Automake
+ to use to make a Makefile.in.
+
+
+WWW home page:
+http://texi2html.cvshome.org
+
+Mailing lists:
+- users@texi2html.cvshome.org for enhancement suggestions,
+ authoring questions and general discussion.
+ to subscribe to this mailinglist, visit
+ http://texi2html.cvshome.org/servlets/ProjectMailingListList
+ or send mail to users-subscribe@texi2html.cvshome.org .
+- dev@texi2html.cvshome.org for bug reports, patches, discussions
+ about code.
+There are no corresponding newsgroups.
+
+For bug reports, please include enough information for the maintainers
+to reproduce the problem. Generally speaking, that means:
+- the version number of Texi2html and the program(s) involved (use --version).
+- the contents of any input files necessary to reproduce the bug (crucial!).
+- a description of the problem and any samples of the erroneous output.
+- anything else that you think would be helpful.
+
+Patches are most welcome; if possible, please make them against the
+source files (e.g., against texi2html.pl, or texi2html.init) with
+`diff -c' or `diff -u' and include ChangeLog entries.
diff --git a/Build/source/utils/texi2html/T2h_i18n.pm b/Build/source/utils/texi2html/T2h_i18n.pm
new file mode 100644
index 00000000000..2ea77ddb930
--- /dev/null
+++ b/Build/source/utils/texi2html/T2h_i18n.pm
@@ -0,0 +1,400 @@
+#+##############################################################################
+#
+# T2h_i18n.pm: Internationalization for texi2html
+#
+# Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#-##############################################################################
+
+# This requires perl version 5 or higher
+require 5.0;
+
+package Texi2HTML::I18n;
+
+use strict;
+
+use vars qw(
+@ISA
+@EXPORT
+);
+
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(pretty_date);
+
+my $language;
+my $i18n_dir = 'i18n'; # name of the directory containing the per language files
+#my $translation_file = 'translations.pl'; # file containing all the translations
+#my @known_languages = ('de', 'nl', 'es', 'no', 'pt', 'fr'); # The supported
+ # languages
+
+########################################################################
+# Language dependencies:
+# To add a new language extend the WORDS hash and create $T2H_<...>_WORDS hash
+# To redefine one word, simply do:
+# $T2h_i18n::T2H_LANGUAGES->{<language>}->{<word>} = 'whatever' in your personal init file.
+#
+my $T2H_WORDS_EN =
+{
+ # titles of pages
+ #'Table of Contents' => 'Table of Contents',
+ #'Short Table of Contents' => 'Short Table of Contents',
+ #'Index' => 'Index',
+ #'About This Document' => 'About This Document',
+ #'Footnotes' => 'Footnotes',
+ #'See' => 'See',
+ #'see' => 'see',
+ #'section' => 'section',
+ 'About This Document' => '',
+ 'Table of Contents' => '',
+ 'Short Table of Contents', => '',
+ 'Index' => '',
+ 'Footnotes' => '',
+ 'See' => '',
+ 'see' => '',
+ 'section' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ # If necessary, we could extend this as follows:
+ # # text for buttons
+ # 'Top_Button' => 'Top',
+ # 'ToC_Button' => 'Contents',
+ # 'Overview_Button' => 'Overview',
+ # 'Index_button' => 'Index',
+ # 'Back_Button' => 'Back',
+ # 'FastBack_Button' => 'FastBack',
+ # 'Prev_Button' => 'Prev',
+ # 'Up_Button' => 'Up',
+ # 'Next_Button' => 'Next',
+ # 'Forward_Button' =>'Forward',
+ # 'FastWorward_Button' => 'FastForward',
+ # 'First_Button' => 'First',
+ # 'Last_Button' => 'Last',
+ # 'About_Button' => 'About'
+ 'January' => '',
+ 'February' => '',
+ 'March' => '',
+ 'April' => '',
+ 'May' => '',
+ 'June' => '',
+ 'July' => '',
+ 'August' => '',
+ 'September' => '',
+ 'October' => '',
+ 'November' => '',
+ 'December' => '',
+ 'T2H_today' => '%s, %d %d',
+};
+
+my $T2H_WORDS_DE =
+{
+ 'Table of Contents' => 'Inhaltsverzeichniss',
+ 'Short Table of Contents' => 'Kurzes Inhaltsverzeichniss',
+ 'Index' => 'Index',
+ 'About This Document' => '&Uuml;ber dieses Dokument',
+ 'Footnotes' => 'Fu&szlig;noten',
+ 'See' => 'Siehe',
+ 'see' => 'siehe',
+ 'section' => 'Abschnitt',
+ 'January' => 'Januar',
+ 'February' => 'Februar',
+ 'March' => 'M&auml;rz',
+ 'April' => 'April',
+ 'May' => 'Mai',
+ 'June' => 'Juni',
+ 'July' => 'Juli',
+ 'August' => 'August',
+ 'September' => 'September',
+ 'October' => 'Oktober',
+ 'November' => 'November',
+ 'December' => 'Dezember',
+};
+
+my $T2H_WORDS_NL =
+{
+ 'Table of Contents' => 'Inhoudsopgave',
+ 'Short Table of Contents' => 'Korte inhoudsopgave',
+ 'Index' => 'Index', #Not sure ;-)
+ 'About This Document' => 'No translation available!', #No translation available!
+ 'Footnotes' => 'No translation available!', #No translation available!
+ 'See' => 'Zie',
+ 'see' => 'zie',
+ 'section' => 'sectie',
+ 'January' => 'Januari',
+ 'February' => 'Februari',
+ 'March' => 'Maart',
+ 'April' => 'April',
+ 'May' => 'Mei',
+ 'June' => 'Juni',
+ 'July' => 'Juli',
+ 'August' => 'Augustus',
+ 'September' => 'September',
+ 'October' => 'Oktober',
+ 'November' => 'November',
+ 'December' => 'December',
+};
+
+my $T2H_WORDS_ES =
+{
+ 'Table of Contents' => '&iacute;ndice General',
+ 'Short Table of Contents' => 'Resumen del Contenido',
+ 'Index' => 'Index', #Not sure ;-)
+ 'About This Document' => 'No translation available!', #No translation available!
+ 'Footnotes' => 'Fu&szlig;noten',
+ 'See' => 'V&eacute;ase',
+ 'see' => 'v&eacute;ase',
+ 'section' => 'secci&oacute;n',
+ 'January' => 'enero',
+ 'February' => 'febrero',
+ 'March' => 'marzo',
+ 'April' => 'abril',
+ 'May' => 'mayo',
+ 'June' => 'junio',
+ 'July' => 'julio',
+ 'August' => 'agosto',
+ 'September' => 'septiembre',
+ 'October' => 'octubre',
+ 'November' => 'noviembre',
+ 'December' => 'diciembre',
+};
+
+my $T2H_WORDS_NO =
+{
+ 'Table of Contents' => 'Innholdsfortegnelse',
+ 'Short Table of Contents' => 'Kort innholdsfortegnelse',
+ 'Index' => 'Indeks', #Not sure ;-)
+ 'About This Document' => 'No translation available!', #No translation available!
+ 'Footnotes' => 'No translation available!',
+ 'See' => 'Se',
+ 'see' => 'se',
+ 'section' => 'avsnitt',
+ 'January' => 'januar',
+ 'February' => 'februar',
+ 'March' => 'mars',
+ 'April' => 'april',
+ 'May' => 'mai',
+ 'June' => 'juni',
+ 'July' => 'juli',
+ 'August' => 'august',
+ 'September' => 'september',
+ 'October' => 'oktober',
+ 'November' => 'november',
+ 'December' => 'desember',
+};
+
+my $T2H_WORDS_PT =
+{
+ 'Table of Contents' => 'Sum&aacute;rio',
+ 'Short Table of Contents' => 'Breve Sum&aacute;rio',
+ 'Index' => '&Iacute;ndice', #Not sure ;-)
+ 'About This Document' => 'No translation available!', #No translation available!
+ 'Footnotes' => 'No translation available!',
+ 'See' => 'Veja',
+ 'see' => 'veja',
+ 'section' => 'Se&ccedil;&atilde;o',
+ 'January' => 'Janeiro',
+ 'February' => 'Fevereiro',
+ 'March' => 'Mar&ccedil;o',
+ 'April' => 'Abril',
+ 'May' => 'Maio',
+ 'June' => 'Junho',
+ 'July' => 'Julho',
+ 'August' => 'Agosto',
+ 'September' => 'Setembro',
+ 'October' => 'Outubro',
+ 'November' => 'Novembro',
+ 'December' => 'Dezembro',
+};
+
+my $T2H_WORDS_FR =
+{
+ 'Table of Contents' => 'Table des mati&egrave;res',
+ 'Short Table of Contents' => 'R&eacute;sum&eacute;e du contenu',
+ 'Index' => 'Index',
+ 'About This Document' => 'A propos de ce document',
+ 'Footnotes' => 'Notes de bas de page',
+ 'See' => 'Voir',
+ 'see' => 'voir',
+ 'section' => 'section',
+ 'January' => 'Janvier',
+ 'February' => 'F&eacute;vrier',
+ 'March' => 'Mars',
+ 'April' => 'Avril',
+ 'May' => 'Mai',
+ 'June' => 'Juin',
+ 'July' => 'Juillet',
+ 'August' => 'Ao&ucirc;t',
+ 'September' => 'Septembre',
+ 'October' => 'Octobre',
+ 'November' => 'Novembre',
+ 'December' => 'D&eacute;cembre',
+ 'T2H_today' => 'le %2$d %1$s %3$d'
+};
+
+#$T2H_LANGUAGES =
+#{
+# 'en' => $T2H_WORDS_EN,
+# 'de' => $T2H_WORDS_DE,
+# 'nl' => $T2H_WORDS_NL,
+# 'es' => $T2H_WORDS_ES,
+# 'no' => $T2H_WORDS_NO,
+# 'pt' => $T2H_WORDS_PT,
+# 'fr' => $T2H_WORDS_FR,
+#};
+
+sub set_language($)
+{
+ my $lang = shift;
+ if (defined($lang) && exists($Texi2HTML::Config::LANGUAGES->{$lang}) && defined($Texi2HTML::Config::LANGUAGES->{$lang}))
+ {
+ $language = $lang;
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+my @MONTH_NAMES =
+ (
+ 'January', 'February', 'March', 'April', 'May',
+ 'June', 'July', 'August', 'September', 'October',
+ 'November', 'December'
+ );
+
+my $I = \&get_string;
+
+sub pretty_date($)
+{
+ my $lang = shift;
+ my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+ ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+ $year += ($year < 70) ? 2000 : 1900;
+ # obachman: Let's do it as the Americans do
+ #return($MONTH_NAMES->{$lang}[$mon] . ", " . $mday . " " . $year);
+ #return(sprintf(&$I('T2H_today'), (get_string($MONTH_NAMES[$mon]), $mday, $year)));
+ return &$I('%{month}, %{day} %{year}', { 'month' => get_string($MONTH_NAMES[$mon]),
+ 'day' => $mday, 'year' => $year });
+}
+
+my $error_no_en = 0;
+sub get_string($;$$)
+{
+ my $string = shift;
+ my $arguments = shift;
+ my $state = shift;
+ my $T2H_LANGUAGES = $Texi2HTML::Config::LANGUAGES;
+ if (! exists($T2H_LANGUAGES->{'en'}))
+ {
+ unless($error_no_en)
+ {
+ print STDERR "i18n: no LANGUAGES->{'en'} hash\n";
+ $error_no_en = 1;
+ }
+ }
+ else
+ {
+ print STDERR "i18n: missing string $string\n" unless (exists ($T2H_LANGUAGES->{'en'}->{$string}));
+ if (defined ($T2H_LANGUAGES->{$language}->{$string}) and
+ ($T2H_LANGUAGES->{$language}->{$string} ne ''))
+ {
+ $string = $T2H_LANGUAGES->{$language}->{$string};
+ }
+ elsif (defined ($T2H_LANGUAGES->{'en'}->{$string}) and
+ ($T2H_LANGUAGES->{'en'}->{$string} ne ''))
+ {
+ $string = $T2H_LANGUAGES->{'en'}->{$string};
+ }
+ }
+ return main::substitute_line($string, $state) unless (defined($arguments) or !keys(%$arguments));
+ my $result = '';
+ while ($string)
+ {
+ if ($string =~ s/^([^%]*)%//)
+ {
+ $result .= $1 if (defined($1));
+ $result .= '%';
+ if ($string =~ s/^%//)
+ {
+ $result .= '%';
+ }
+ elsif ($string =~ /^\{(\w+)\}/ and exists($arguments->{$1}))
+ {
+ $string =~ s/^\{(\w+)\}//;
+ if (!$state->{'keep_texi'})
+ {
+ $result .= "\@\{$1\@\}";
+ }
+ else
+ {
+ $result .= "\{$1\}";
+ }
+ }
+ else
+ {
+ $result .= '%';
+ }
+ next;
+ }
+ else
+ {
+ $result .= $string;
+ last;
+ }
+ }
+ if (!$state->{'keep_texi'})
+ {
+ $string = main::substitute_line($result, $state);
+ }
+ else
+ {
+ $string = $result;
+ }
+ $result = '';
+ while ($string)
+ {
+ if ($string =~ s/^([^%]*)%//)
+ {
+ $result .= $1 if (defined($1));
+ if ($string =~ s/^%//)
+ {
+ $result .= '%';
+ }
+ elsif ($string =~ /^\{(\w+)\}/ and exists($arguments->{$1}))
+ {
+ $string =~ s/^\{(\w+)\}//;
+ $result .= $arguments->{$1};
+ }
+ else
+ {
+ $result .= '%';
+ }
+ next;
+ }
+ else
+ {
+ $result .= $string;
+ last;
+ }
+ }
+ return $result;
+}
+
+1;
diff --git a/Build/source/utils/texi2html/TODO b/Build/source/utils/texi2html/TODO
new file mode 100644
index 00000000000..21047c62a82
--- /dev/null
+++ b/Build/source/utils/texi2html/TODO
@@ -0,0 +1,89 @@
+This file contains a list of things yet to be done (see also in doc/IDEAS):
+
+* Create detailed texinfo documentation (see in doc)
+
+* add sample init files for different layouts
+ - use events (onmousover, etc) for anchors
+ - use style-sheets for formatting of various elements (like @example,
+ etc).
+ - xhtml with in line style
+ - Singular manual style
+ - How complicated could it be to get a creation of XML, what about SGML ?
+
+* document css classes, and have similar classes with makeinfo
+- makeinfo classes:
+ul menu,
+ul index-cp index-*,
+div node (navigation bar),
+
+- texi2html classes:
+table index-cp index-*,
+table menu,
+h3 node
+ul toc,
+
+- same classes:
+pre verbatim,
+pre example display...,
+table cartouche,
+small dots, small enddots,
+div contents shortcontents, div footnote,
+h? unnumbered chapter appendix...,
+h1 settitle (title before contents, if not set by titlefont),
+h1 titlefont (@titlefont),
+
+* use <link> for navigation, maybe wait before this is done in makeinfo
+(see http://www.w3.org/TR/REC-html40/types.html#h-6.12 and
+http://www.w3.org/TR/REC-html40/struct/links.html#h-12.3.3)
+
+* Document Texi2HTML::THIS_ELEMENT
+
+* Document $NEW_CROSSREF_STYLE, $EXTERNAL_CROSSREF_SPLIT,
+ $Texi2HTML::THISDOC{'htmlxref'}
+
+* Test the back path stuff for images.
+
+* Test refs with no unicode support.
+ Test for @ commands in refs, and refs in ascii 8 bit/utf8 manuals.
+
+* add a configure switch --with-encode
+
+* don't double in title when the @top and @settitle are the same
+
+* handle right things like
+-> error with @item on same line than @table
+@xref{node,
+@table @emph
+@item line
+text
+@end table
+}
+
+@code{
+@printindex cp
+}
+
+* maybe some @-commands appearing on lines should stop paragraphs, namely
+@page. That's not sure. Maybe this should be up to the writer to add
+a line.
+
+* handle better things like
+@itemize @bullet
+@cindex example
+@item
+In the example
+@end itemize
+
+* @m_cedilla appears in output with --macro-expand. That's a bug.
+
+* in chm.init (Jose Fonseca)
+
+[WINDOWS]
+
+Default=,"ug.hhc","ug.hhk","ug.html","ug.html",,,,,0x22520,,0x384e,,,,,,,,0
+
+The numbers are a bitmask of the enabled buttons. The ones here are
+IMO a good default. In the future you may also add that as an
+option, as the Docbook XSL stylesheets do (see in
+http://docbook.sourceforge.net/release/xsl/snapshot/doc/html/rn20.html
+all the CHM related parameters one can change).
diff --git a/Build/source/utils/texi2html/Tests/Makefile.am b/Build/source/utils/texi2html/Tests/Makefile.am
new file mode 100644
index 00000000000..657754722cc
--- /dev/null
+++ b/Build/source/utils/texi2html/Tests/Makefile.am
@@ -0,0 +1,24 @@
+SUBDIR_TESTS = GermanNodeTest xemacs texinfo sectionning ccvs viper \
+ viper_monolithic texi2html xemacs_frame index_table formatting macros \
+ nodes_texinfo singular floats
+
+
+#check-local:
+# $(srcdir)/test.sh
+
+regenerate:
+ for dir in ${SUBDIR_TESTS}; do \
+ [ -d $${dir}_res ] && cp $$dir/*.passfirst $$dir/*.html $$dir/*.htm $$dir/*.2 $$dir/*.passtexi $${dir}_res;\
+ done
+
+clean-local:
+ for dir in ${SUBDIR_TESTS}; do \
+ (if [ -d $$dir ]; then cd $$dir && $(RM) -- $$dir $$dir-* *.toc *.aux *.log *.op *.cp *.cps \
+ *.fn *.fns *.ky *.kys *.pg *.pgs *.tp *.tps *.vr *.vrs \
+ *.dvi *.html *.htm *.info *.info-? *.info-?? *.info-??? *.html_tempnotag \
+ *.2 *.passfirst *.passtexi \
+ *_?.png *_??.png *_???.png *_l2h_img?.old *_l2h_img??.old *_l2h_img???.old \
+ *_l2h_img?.png *_l2h_img??.png *_l2h_img???.png \
+ *_l2h.tex *_l2h.css *_l2h_images.pl *_l2h_images.tex \
+ *_l2h_labels.pl l2h_cache.pm; fi) ; \
+ done
diff --git a/Build/source/utils/texi2html/Tests/Makefile.in b/Build/source/utils/texi2html/Tests/Makefile.in
new file mode 100644
index 00000000000..3c7cb197344
--- /dev/null
+++ b/Build/source/utils/texi2html/Tests/Makefile.in
@@ -0,0 +1,293 @@
+# Makefile.in generated by automake 1.9.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = Tests
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_DATE = @PACKAGE_DATE@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_UNICODE = @USE_UNICODE@
+VERSION = @VERSION@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIR_TESTS = GermanNodeTest xemacs texinfo sectionning ccvs viper \
+ viper_monolithic texi2html xemacs_frame index_table formatting macros \
+ nodes_texinfo singular floats
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Tests/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+ distclean distclean-generic distdir dvi dvi-am html html-am \
+ info info-am install install-am install-data install-data-am \
+ install-exec install-exec-am install-info install-info-am \
+ install-man install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+ uninstall-am uninstall-info-am
+
+
+#check-local:
+# $(srcdir)/test.sh
+
+regenerate:
+ for dir in ${SUBDIR_TESTS}; do \
+ [ -d $${dir}_res ] && cp $$dir/*.passfirst $$dir/*.html $$dir/*.htm $$dir/*.2 $$dir/*.passtexi $${dir}_res;\
+ done
+
+clean-local:
+ for dir in ${SUBDIR_TESTS}; do \
+ (if [ -d $$dir ]; then cd $$dir && $(RM) -- $$dir $$dir-* *.toc *.aux *.log *.op *.cp *.cps \
+ *.fn *.fns *.ky *.kys *.pg *.pgs *.tp *.tps *.vr *.vrs \
+ *.dvi *.html *.htm *.info *.info-? *.info-?? *.info-??? *.html_tempnotag \
+ *.2 *.passfirst *.passtexi \
+ *_?.png *_??.png *_???.png *_l2h_img?.old *_l2h_img??.old *_l2h_img???.old \
+ *_l2h_img?.png *_l2h_img??.png *_l2h_img???.png \
+ *_l2h.tex *_l2h.css *_l2h_images.pl *_l2h_images.tex \
+ *_l2h_labels.pl l2h_cache.pm; fi) ; \
+ done
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texi2html/Tests/README b/Build/source/utils/texi2html/Tests/README
new file mode 100644
index 00000000000..2a34ac5171e
--- /dev/null
+++ b/Build/source/utils/texi2html/Tests/README
@@ -0,0 +1,112 @@
+Running the tests and understanding the results
+-----------------------------------------------
+
+To run all the tests just do
+$ ./test.sh
+
+For each test the output begins with the line:
+making test: dir/file options...
+
+dir is the dir where the test is made, file is the texinfo file processed and
+the optional options are the options passed to texi2html when doing the test.
+Then the test results are outputted. There are 5 type of results outputed:
+
+status -> always
+stderr line count -> always
+diffs -> optionnal
+test with tidy -> optionnal
+test validity -> optionnal
+
+For each of these, the type is outputted indented. The results appear on
+lines below, more indented. When the test fails there is !!! on the line.
+For example:
+
+making test: formatting/not_closed_in_menu.texi
+ status:
+ passed
+ stderr line count:
+ !!! bad line count: 7 != 0
+
+I now turn the the individual result type:
+
+* status
+The exit status of the command is tested for success or failure.
+
+* stderr line count
+The number of stderr lines is compared against a reference.
+
+* diffs
+out files are diffed against reference files present in dir_res. A '.'
+means a successfull comparison. If there are more than one test in that
+dir, there might be files differing or files not found if the files
+haven't allready been regenerated.
+
+* test with tidy
+tidy is run on resulting html files.
+
+* test validity
+validate is run on resulting html files.
+
+
+Adding a test
+-------------
+
+To add a test, you have to add a line in test.sh, near the end.
+Here is the syntax:
+
+test_texi dir file "option1 option2" stderr_lines suffix basename ignore_tags validate test_tidy fail
+
+dir is the only mandatory argument. There are defaults for the other
+arguments when not given. However if you want to specify, say, basename
+and use the defaults for the preceding ones, you have to set them
+explicitely.
+
+dir: the directory where the files are.
+file: the texinfo file. If not present dir.texi is used
+"option1 option2": options passed to texi2html. Default is no option
+stderr_lines: number of lines of stderr. Default is 0
+suffix: suffix of the file, used to find the basename. 'texi' is assumed
+basename: basename of the generated files. The basename of file is the default
+ignore_tags: if set to 'ignore_tags' or 'yes' rcs tags are ignored
+validate: if unset or set to 'validate' validation is tried
+test_tidy: if unset or set to 'tidy' or 'test_tidy', tidy is tried
+fail: if unset or set to 'success' the exit code should be 0
+
+* Simple example:
+test_texi macros
+
+test macros.texi in the macros dir, without options, assuming generated
+files beginning with macros.
+
+* Complex example:
+test_texi sectionning no_node.texi "-prefix chapter_split_no_node -split chapter" 0 texi chapter_split_no_node
+
+Test no_node.texi in the sectionning dir, with the options:
+-prefix chapter_split_no_node -split chapter
+no lines on stderr, suffix is texi and basename for generated files is
+chapter_split_no_node (which matches the option -prefix chapter_split_no_node).
+
+Remarks:
+The stderr output is in basename.2, the result of the first pass in
+basename.passtexi, of the second pass in basename.passfirst.
+the -test option is always passed.
+To run a single test you can run test.sh with the arguments you would have
+passed to test_texi. For example
+
+$./test.sh viper viper.texi "-split chapter"
+
+will run a test for viper.texi in the viper directory with option
+-split chapter
+
+
+Regenerating tests
+------------------
+
+make regenerate copy all the *.html, *.2, *.passtexi and *.passfirst from
+the test directories to the result directories (test directory with _res
+appended).
+This is usefull when the new result is the good result and you want to
+avoid manually copying the good files to the result directory.
+
+To add a new test directory add it to the SUBDIR_TESTS variable in
+Makefile.am (and rerun automake, autoconf...).
diff --git a/Build/source/utils/texi2html/aclocal.m4 b/Build/source/utils/texi2html/aclocal.m4
new file mode 100644
index 00000000000..60c7672da4e
--- /dev/null
+++ b/Build/source/utils/texi2html/aclocal.m4
@@ -0,0 +1,750 @@
+# generated automatically by aclocal 1.9.3 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# -*- Autoconf -*-
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Generated from amversion.in; do not edit by hand.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.3])])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 6
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# This macro actually does too much some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 11
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# -*- Autoconf -*-
+# Copyright (C) 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# -*- Autoconf -*-
+
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/Build/source/utils/texi2html/autogen.sh b/Build/source/utils/texi2html/autogen.sh
new file mode 100755
index 00000000000..e46ef51478c
--- /dev/null
+++ b/Build/source/utils/texi2html/autogen.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+test -f Makefile.am || cd "`dirname \"$0\"`"
+
+# Create `aclocal.m4'.
+aclocal
+
+# Create `Makefile.in' from `Makefile.am', and symlink `install-sh',
+# `missing' and `mkinstalldirs' from /usr/share/automake.
+automake --add-missing
+
+# Create `configure' from `configure.in'.
+autoconf
diff --git a/Build/source/utils/texi2html/check_texinfo.pl.in b/Build/source/utils/texi2html/check_texinfo.pl.in
new file mode 100755
index 00000000000..feef22a9957
--- /dev/null
+++ b/Build/source/utils/texi2html/check_texinfo.pl.in
@@ -0,0 +1,83 @@
+#! @PERL@
+#+##############################################################################
+#
+# check_texinfo.pl: Extract texinfo commands from files
+#
+# Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#-##############################################################################
+
+# This requires perl version 5 or higher
+require 5.0;
+
+
+
+use strict;
+use Getopt::Long;
+my $verbose;
+if (!GetOptions ("verbose" => \$verbose))
+{
+ die "usage: $0 [-v] file...\n";
+}
+
+die "Need file to check\n" unless @ARGV > 0;
+
+my (%seen, %context);
+
+while (<>)
+{
+ if (/\@(\*|\.|\:|\@|\{|\})/)
+ {
+ $seen{$&}++;
+ $context{$&} .= "> $_" if $verbose;
+ $_ = "$`XX$'";
+ redo;
+ }
+ if (/\@(\w+)/)
+ {
+ my ($before, $match, $after);
+ ($before, $match, $after) = ($`, $&, $');
+ if ($before =~ /\b[-\w]+$/ && $after =~ /^[-\w.]*\b/)
+ { # e-mail address
+ $seen{'e-mail address'}++;
+ $context{'e-mail address'} .= "> $_" if $verbose;
+ }
+ else
+ {
+ $seen{$match}++;
+ $context{$match} .= "> $_" if $verbose;
+ }
+ $match =~ s/^\@/X/;
+ $_ = "$before$match$after";
+ redo;
+ }
+}
+
+foreach (sort(keys(%seen)))
+{
+ if ($verbose)
+ {
+ print "$_\n";
+ print $context{$_};
+ }
+ else
+ {
+ print "$_ ($seen{$_})\n";
+ }
+}
+
+
diff --git a/Build/source/utils/texi2html/config.guess b/Build/source/utils/texi2html/config.guess
new file mode 100755
index 00000000000..d0d57f6945f
--- /dev/null
+++ b/Build/source/utils/texi2html/config.guess
@@ -0,0 +1,1465 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-09-19'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/utils/texi2html/config.sub b/Build/source/utils/texi2html/config.sub
new file mode 100755
index 00000000000..1c366dfde9a
--- /dev/null
+++ b/Build/source/utils/texi2html/config.sub
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | ms1 \
+ | msp430 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | ms1-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/utils/texi2html/configure b/Build/source/utils/texi2html/configure
new file mode 100755
index 00000000000..2c8598822f3
--- /dev/null
+++ b/Build/source/utils/texi2html/configure
@@ -0,0 +1,2924 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for texi2html 1.76.
+#
+# Report bugs to <users@texi2html.cvshome.org>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='texi2html'
+PACKAGE_TARNAME='texi2html'
+PACKAGE_VERSION='1.76'
+PACKAGE_STRING='texi2html 1.76'
+PACKAGE_BUGREPORT='users@texi2html.cvshome.org'
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT PACKAGE_DATE USE_UNICODE PERL build build_cpu build_vendor build_os host host_cpu host_vendor host_os LIBOBJS LTLIBOBJS'
+ac_subst_files='INIT MYSIMPLE T2H_I18N T2H_L2H_FILE T2H_TRANSLATIONS_FILE'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_PERL_set=${PERL+set}
+ac_env_PERL_value=$PERL
+ac_cv_env_PERL_set=${PERL+set}
+ac_cv_env_PERL_value=$PERL
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures texi2html 1.76 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of texi2html 1.76:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
+ --enable-multiplatform put executables in bin/PLATFORM
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-encode use encode (default: detected)
+
+Some influential environment variables:
+ PERL The path to the `perl' executable.
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <users@texi2html.cvshome.org>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+texi2html configure 1.76
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by texi2html $as_me 1.76, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='texi2html'
+ VERSION='1.76'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi;
+ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+PACKAGE_DATE=`"$srcdir"/mdate-sh "$srcdir"/configure.ac`
+
+INIT=$srcdir/texi2html.init
+
+MYSIMPLE=$srcdir/MySimple.pm
+
+T2H_I18N=$srcdir/T2h_i18n.pm
+
+T2H_L2H_FILE=$srcdir/l2h.init
+
+T2H_TRANSLATIONS_FILE=$srcdir/translations.pl
+
+
+# Check whether --with-encode or --without-encode was given.
+if test "${with_encode+set}" = set; then
+ withval="$with_encode"
+ if test $withval = 'no'; then
+ USE_UNICODE=0
+ else
+ USE_UNICODE=1
+ fi
+else
+
+ if perl -e "use Encode; use Unicode::Normalize;" > /dev/null 2>&1;
+ then USE_UNICODE=1
+ else
+ USE_UNICODE=0
+ fi
+
+fi;
+
+
+
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="/opt/perl5/bin:"$PATH""
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="/usr/bin/env perl"
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+ echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+
+
+
+# For teTeX and TeX Live.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+# Check whether --enable-multiplatform or --disable-multiplatform was given.
+if test "${enable_multiplatform+set}" = set; then
+ enableval="$enable_multiplatform"
+
+fi;
+test "x$enable_multiplatform" = xyes \
+&& test "x$bindir" = 'x${exec_prefix}/bin' \
+&& bindir="$bindir/$host"
+
+ ac_config_files="$ac_config_files texi2html:texi2html.pl"
+
+ ac_config_files="$ac_config_files check_texinfo.pl"
+
+
+ ac_config_files="$ac_config_files Makefile Tests/Makefile doc/Makefile texi2html.1 texi2html.spec"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g
+t quote
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[ `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output. A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by texi2html $as_me 1.76, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+texi2html config.status 1.76
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "texi2html" ) CONFIG_FILES="$CONFIG_FILES texi2html:texi2html.pl" ;;
+ "check_texinfo.pl" ) CONFIG_FILES="$CONFIG_FILES check_texinfo.pl" ;;
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "Tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES Tests/Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "texi2html.1" ) CONFIG_FILES="$CONFIG_FILES texi2html.1" ;;
+ "texi2html.spec" ) CONFIG_FILES="$CONFIG_FILES texi2html.spec" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+s,@PACKAGE_DATE@,$PACKAGE_DATE,;t t
+s,@USE_UNICODE@,$USE_UNICODE,;t t
+s,@PERL@,$PERL,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+/@INIT@/r $INIT
+s,@INIT@,,;t t
+/@MYSIMPLE@/r $MYSIMPLE
+s,@MYSIMPLE@,,;t t
+/@T2H_I18N@/r $T2H_I18N
+s,@T2H_I18N@,,;t t
+/@T2H_L2H_FILE@/r $T2H_L2H_FILE
+s,@T2H_L2H_FILE@,,;t t
+/@T2H_TRANSLATIONS_FILE@/r $T2H_TRANSLATIONS_FILE
+s,@T2H_TRANSLATIONS_FILE@,,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+ # Run the commands associated with the file.
+ case $ac_file in
+ texi2html ) chmod +x texi2html ;;
+ check_texinfo.pl ) chmod +x check_texinfo.pl ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Build/source/utils/texi2html/configure.ac b/Build/source/utils/texi2html/configure.ac
new file mode 100644
index 00000000000..ed55ad2166c
--- /dev/null
+++ b/Build/source/utils/texi2html/configure.ac
@@ -0,0 +1,73 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.53)
+AC_INIT([texi2html], [1.76], [users@texi2html.cvshome.org])
+AM_INIT_AUTOMAKE([gnu 1.7 dist-bzip2])
+
+dnl Disable Autoconf, Automake, and some other maintainer tools without the
+dnl --enable-maintainer-mode argument.
+AM_MAINTAINER_MODE
+
+dnl Misc variable settings
+PACKAGE_DATE=`"$srcdir"/mdate-sh "$srcdir"/configure.ac`
+AC_SUBST([PACKAGE_DATE])
+INIT=$srcdir/texi2html.init
+AC_SUBST_FILE([INIT])
+MYSIMPLE=$srcdir/MySimple.pm
+AC_SUBST_FILE([MYSIMPLE])
+T2H_I18N=$srcdir/T2h_i18n.pm
+AC_SUBST_FILE([T2H_I18N])
+T2H_L2H_FILE=$srcdir/l2h.init
+AC_SUBST_FILE([T2H_L2H_FILE])
+T2H_TRANSLATIONS_FILE=$srcdir/translations.pl
+AC_SUBST_FILE([T2H_TRANSLATIONS_FILE])
+AC_ARG_WITH([encode],
+ AC_HELP_STRING([--with-encode],
+ [use encode (default: detected)]),
+ [if test $withval = 'no'; then
+ USE_UNICODE=0
+ else
+ USE_UNICODE=1
+ fi],
+ [
+ if perl -e "use Encode; use Unicode::Normalize;" > /dev/null 2>&1;
+ then USE_UNICODE=1
+ else
+ USE_UNICODE=0
+ fi
+ ])
+AC_SUBST([USE_UNICODE])
+
+dnl Checks for programs.
+AC_ARG_VAR([PERL], [The path to the `perl' executable.])
+AC_PATH_PROG([PERL], [perl], [/usr/bin/env perl], [/opt/perl5/bin:"$PATH"])
+
+AC_PROG_INSTALL
+
+dnl Checks for libraries.
+
+dnl Checks for header files.
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Checks for library functions.
+# For teTeX and TeX Live.
+
+AC_CANONICAL_HOST
+AC_ARG_ENABLE(multiplatform,
+ [ --enable-multiplatform put executables in bin/PLATFORM])
+test "x$enable_multiplatform" = xyes \
+&& test "x$bindir" = 'x${exec_prefix}/bin' \
+&& bindir="$bindir/$host"
+
+AC_CONFIG_FILES([texi2html:texi2html.pl], [chmod +x texi2html])
+AC_CONFIG_FILES([check_texinfo.pl], [chmod +x check_texinfo.pl])
+
+dnl The bulk config files.
+AC_CONFIG_FILES([\
+ Makefile \
+ Tests/Makefile \
+ doc/Makefile \
+ texi2html.1 \
+ texi2html.spec \
+ ])
+AC_OUTPUT
diff --git a/Build/source/utils/texi2html/doc/Makefile.am b/Build/source/utils/texi2html/doc/Makefile.am
new file mode 100644
index 00000000000..817fef7bc7a
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/Makefile.am
@@ -0,0 +1,41 @@
+#
+info_TEXINFOS = texi2html.texi
+
+#CLEANFILES = texi2html.ps texi2html.pdf texi2html.html \
+# texi2html.ascii
+#
+texinfodata = $(datadir)/texinfo
+texinfohtmldir = $(texinfodata)/html
+texinfohtml_DATA = texi2html.html
+
+# use the script out of the distribution NOT
+# an old one which is installed on the client.
+TEXI2HTML = $(top_builddir)/texi2html
+
+EXTRA_DIST = texi2html.html
+
+texi2html.html: texi2html.texi $(srcdir)/version.texi \
+ $(top_builddir)/texi2html.pl $(top_builddir)/texi2html.init \
+ $(top_builddir)/MySimple.pm $(top_builddir)/T2h_i18n.pm \
+ $(top_builddir)/translations.pl
+ TEXINPUTS=$(srcdir)::$$TEXINPUTS \
+ $(SHELL) $(top_srcdir)/missing-texi2html --run $(TEXI2HTML) -V $<
+
+txt: texi2html.txt
+
+SUFFIXES = .txt
+
+check-local: $(TEXI2HTML)
+ TEXINPUTS=$(srcdir)::$$TEXINPUTS \
+ $(PERL) $(TEXI2HTML) -V $(srcdir)/texi2html.texi
+
+# texinfo based targets automake neglects to include
+.texinfo.txt:
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ --no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+.txi.txt:
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ --no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+.texi.txt:
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ --no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
diff --git a/Build/source/utils/texi2html/doc/Makefile.in b/Build/source/utils/texi2html/doc/Makefile.in
new file mode 100644
index 00000000000..295c7ee22f2
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/Makefile.in
@@ -0,0 +1,512 @@
+# Makefile.in generated by automake 1.9.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/stamp-vti $(srcdir)/version.texi TODO mdate-sh \
+ texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/texi2html.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = texi2html.dvi
+PDFS = texi2html.pdf
+PSS = texi2html.ps
+HTMLS = texi2html.html
+TEXINFOS = texi2html.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(texinfohtmldir)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+texinfohtmlDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(texinfohtml_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_DATE = @PACKAGE_DATE@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_UNICODE = @USE_UNICODE@
+VERSION = @VERSION@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+
+#
+info_TEXINFOS = texi2html.texi
+
+#CLEANFILES = texi2html.ps texi2html.pdf texi2html.html \
+# texi2html.ascii
+#
+texinfodata = $(datadir)/texinfo
+texinfohtmldir = $(texinfodata)/html
+texinfohtml_DATA = texi2html.html
+
+# use the script out of the distribution NOT
+# an old one which is installed on the client.
+TEXI2HTML = $(top_builddir)/texi2html
+EXTRA_DIST = texi2html.html
+SUFFIXES = .txt
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .txt .dvi .html .info .pdf .ps .texi .texinfo .txi
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+.texi.info:
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && cd $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ cd $(srcdir); \
+ else \
+ rc=$$?; \
+ cd $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $<
+
+.texi.pdf:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $<
+
+.texi.html:
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/texi2html.info: texi2html.texi $(srcdir)/version.texi
+texi2html.dvi: texi2html.texi $(srcdir)/version.texi
+texi2html.pdf: texi2html.texi $(srcdir)/version.texi
+$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: texi2html.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./texi2html.texi || dir=$(srcdir); \
+ set `$(SHELL) $(srcdir)/mdate-sh $$dir/texi2html.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+.dvi.ps:
+ $(DVIPS) -o $@ $<
+
+uninstall-info-am:
+ $(PRE_UNINSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if cd "$(DESTDIR)$(infodir)"; then \
+ echo " rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9])"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ for file in $$d/$$base*; do \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f $(distdir)/$$relfile || \
+ cp -p $$file $(distdir)/$$relfile; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf texi2html.aux texi2html.cp texi2html.cps texi2html.fn texi2html.fns \
+ texi2html.ky texi2html.kys texi2html.log texi2html.op \
+ texi2html.ops texi2html.pg texi2html.pgs texi2html.tmp \
+ texi2html.toc texi2html.tp texi2html.tps texi2html.vr \
+ texi2html.vrs texi2html.dvi texi2html.pdf texi2html.ps
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+install-texinfohtmlDATA: $(texinfohtml_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(texinfohtmldir)" || $(mkdir_p) "$(DESTDIR)$(texinfohtmldir)"
+ @list='$(texinfohtml_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(texinfohtmlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(texinfohtmldir)/$$f'"; \
+ $(texinfohtmlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(texinfohtmldir)/$$f"; \
+ done
+
+uninstall-texinfohtmlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(texinfohtml_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(texinfohtmldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(texinfohtmldir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(INFO_DEPS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(texinfohtmldir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-texinfohtmlDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-info-am uninstall-texinfohtmlDATA
+
+.PHONY: all all-am check check-am check-local clean clean-generic \
+ dist-info distclean distclean-generic distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip \
+ install-texinfohtmlDATA installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti mostlyclean \
+ mostlyclean-aminfo mostlyclean-generic mostlyclean-vti pdf \
+ pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
+ uninstall-texinfohtmlDATA
+
+
+texi2html.html: texi2html.texi $(srcdir)/version.texi \
+ $(top_builddir)/texi2html.pl $(top_builddir)/texi2html.init \
+ $(top_builddir)/MySimple.pm $(top_builddir)/T2h_i18n.pm \
+ $(top_builddir)/translations.pl
+ TEXINPUTS=$(srcdir)::$$TEXINPUTS \
+ $(SHELL) $(top_srcdir)/missing-texi2html --run $(TEXI2HTML) -V $<
+
+txt: texi2html.txt
+
+check-local: $(TEXI2HTML)
+ TEXINPUTS=$(srcdir)::$$TEXINPUTS \
+ $(PERL) $(TEXI2HTML) -V $(srcdir)/texi2html.texi
+
+# texinfo based targets automake neglects to include
+.texinfo.txt:
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ --no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+.txi.txt:
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ --no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+.texi.txt:
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ --no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texi2html/doc/TODO b/Build/source/utils/texi2html/doc/TODO
new file mode 100644
index 00000000000..9cad5c458b1
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/TODO
@@ -0,0 +1,5 @@
+- use hightlighter perl script (change code2html.pl
+ let it produce Texinfo code instead of HTML)
+- More reference parts.
+- Examples on how to make customizations to HTML
+ output.
diff --git a/Build/source/utils/texi2html/doc/mdate-sh b/Build/source/utils/texi2html/doc/mdate-sh
new file mode 100755
index 00000000000..37171f21fbd
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/mdate-sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# Get the extended ls output of the file or directory.
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ set - x`ls -L -l -d $1`
+else
+ set - x`ls -l -d $1`
+fi
+# The month is at least the fourth argument
+# (3 shifts here, the next inside the loop).
+shift
+shift
+shift
+
+# Find the month. Next argument is day, followed by the year or time.
+month=
+until test $month
+do
+ shift
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+day=$2
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
diff --git a/Build/source/utils/texi2html/doc/stamp-vti b/Build/source/utils/texi2html/doc/stamp-vti
new file mode 100644
index 00000000000..103d48daaa0
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 1 February 2005
+@set UPDATED-MONTH February 2005
+@set EDITION 1.76
+@set VERSION 1.76
diff --git a/Build/source/utils/texi2html/doc/texi2html.html b/Build/source/utils/texi2html/doc/texi2html.html
new file mode 100644
index 00000000000..d55c003b90f
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texi2html.html
@@ -0,0 +1,6072 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!--Copyright C 1999, 2000, 2001, 2002, 2003
+ Free Software Foundation, Inc.
+
+ Portions of texi2html
+ Copyright C 1999, 2000 Lionel Cons
+ Copyright C 1999, 2000 Karl Berry
+ Copyright C 1999, 2000 Olaf Bachmann
+ Copyright C 2002, 2003 Patrice Dumas
+ Copyright C 2001, 2002, 2003 Derek Price
+ Copyright C many others.
+
+
+ Portions of this manual
+ Copyright C 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright C 2003 Patrice Dumas (manual)
+ Copyright C 2003 Derek Price (manual)
+
+
+Permission is granted to make and distribute verbatim
+copies of this manual provided the copyright notice and
+this permission notice are preserved on all copies.
+
+Permission is granted to copy and distribute modified
+versions of this manual under the conditions for verbatim
+copying, provided that the entire resulting derived work is
+distributed under the terms of a permission notice
+identical to this one.
+
+Permission is granted to copy and distribute translations
+of this manual into another language, under the above
+conditions for modified versions, except that this
+permission notice may be stated in a translation approved
+by the Free Software Foundation.
+-->
+<!-- Created on February, 3 2005 by texi2html 1.76 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people <dev@texi2html.cvshome.org>
+Send bugs and suggestions to <users@texi2html.cvshome.org>
+
+-->
+<head>
+<title>Texi2HTML - Texinfo to HTML v1.76: Texi2HTML</title>
+
+<meta name="description" content="Texi2HTML - Texinfo to HTML v1.76: Texi2HTML">
+<meta name="keywords" content="Texi2HTML - Texinfo to HTML v1.76: Texi2HTML">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.76">
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="settitle">Texi2HTML</h1>
+<p>Copyright &copy; 1999, 2000, 2001, 2002, 2003
+ Free Software Foundation, Inc.
+</p>
+<table>
+<tr><td><p> Portions of <code>texi2html</code>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 1999, 2000 Lionel Cons<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 1999, 2000 Karl Berry<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 1999, 2000 Olaf Bachmann<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 2002, 2003 Patrice Dumas<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 2001, 2002, 2003 Derek Price<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; many others.<br>
+</p></td></tr>
+<tr><td> </td><td>
+</td></tr>
+<tr><td> </td><td>
+</td></tr>
+<tr><td><p> Portions of this manual
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 1999, 2000 Karl Heinz Marbaise (manual)<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 2003 Patrice Dumas (manual)<br>
+</p></td></tr>
+<tr><td> </td><td><p> Copyright &copy; 2003 Derek Price (manual)<br>
+</p></td></tr>
+</table>
+
+<p>Permission is granted to make and distribute verbatim
+copies of this manual provided the copyright notice and
+this permission notice are preserved on all copies.
+</p>
+<p>Permission is granted to copy and distribute modified
+versions of this manual under the conditions for verbatim
+copying, provided that the entire resulting derived work is
+distributed under the terms of a permission notice
+identical to this one.
+</p>
+<p>Permission is granted to copy and distribute translations
+of this manual into another language, under the above
+conditions for modified versions, except that this
+permission notice may be stated in a translation approved
+by the Free Software Foundation.
+</p>
+
+
+
+<a name="Top"></a>
+<a name="SEC_Top"></a>
+
+
+<p>This manual, last updated 1 February 2005, describes version 1.76
+of the <code>texi2html</code> Perl script which converts
+<a href="http://www.texinfo.org">Texinfo</a> into <a href="http://w3c.org">HTML</a>.
+</p>
+<p>Please send bug reports concerning this manual to the Texi2HTML user
+discussion list <a href="mailto:user@texi2html.cvshome.org">user@texi2html.cvshome.org</a>. Please state the exact
+version of the manual which contains the bug, as given above.
+</p>
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><strong>This manual is currently under construction and of course incomplete. ;-)</strong>
+</pre></td></tr></table>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC1">1. Overview</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC3">2. Obtaining <code>texi2html</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+ Obtaining a copy of the <code>texi2html</code>
+ source code distribution
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC4">3. Installation of <code>texi2html</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Installing <code>texi2html</code>
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC5">4. Invoking <code>texi2html</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Description of the command line options
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC14">5. Overview of initialization files content and loading</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> What kind of variables and subroutines appear
+ in init files and how they are called
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC17">6. Fine tuning of the page layout</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+<tr><td align="left" valign="top"><a href="#SEC47">7. Customizing <acronym>HTML</acronym> and text style in init files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Fine tuning of the <acronym>HTML</acronym> elements
+ associated with the texinfo constructs
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC84">A. Internationalization</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Help translating !
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC87">B. Command Line Option Index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+<tr><td align="left" valign="top"><a href="#SEC88">C. Variable Index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+<tr><td align="left" valign="top"><a href="#SEC89">D. Concept Index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+</pre></th></tr></table>
+<hr size="1">
+<a name="Overview"></a>
+<a name="SEC1"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC2" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[ &lt;&lt; ]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC3" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 1. Overview </h1>
+
+
+<p><a href="http://www.texinfo.org">Texinfo</a> is the official
+documentation format of the <a href="http://www.gnu.org">GNU</a>
+project. It uses a single source file to produce both
+online information and printed output.
+</p>
+<p>It is often desirable to have a way to produce
+<acronym>HTML</acronym> from Texinfo sources, as GNU-Info files are
+produced. It is much simpler to run a converter than it is to
+rewrite all the documentation in <acronym>HTML</acronym>, especially
+considering that there is so much Texinfo documentation in
+the world.
+</p>
+<p>Some time ago <code>makeinfo</code> wasn't able to produce
+<acronym>HTML</acronym> output format, but people still wanted documentation in
+<acronym>HTML</acronym>. This was the birthing hour for
+<code>texi2html</code>. The basic purpose of <code>texi2html</code>
+is to convert Texinfo documents into <acronym>HTML</acronym>.
+</p>
+<p>Since then, <acronym>HTML</acronym> support in <code>makeinfo</code> has improved, but
+<code>texi2html</code> is still stronger in many areas, including the degree to
+which it allows customization. With <code>texi2html</code>, some important
+aspects of the resulting <acronym>HTML</acronym> files may be specified via command
+line options, and configuration files provide an even finer degree of control
+over the final output, allowing most every aspect of the final output not
+specified in the Texinfo input file to be specified. Configuration files are
+written in <code>perl</code>, like the main program, and anything which may be
+specified on the command line may also be specified within a configuration
+file.
+</p>
+<p>For an example of the kind of pages <code>texi2html</code> is capable of
+producing, have a look at the following sites:
+<a href="http://www.singular.uni-kl.de/Manual/html/">the Singular Manual</a>,
+<a href="http://ccvs.cvshome.org/docs/manual">the Cederqvist (CVS Manual)</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC2">1.1 Why <code>texi2html</code> and not <code>makeinfo</code>?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+</table>
+
+<hr size="6">
+<a name="whytexi2html"></a>
+<a name="SEC2"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC1" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC3" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC3" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.1 Why <code>texi2html</code> and not <code>makeinfo</code>? </h2>
+
+
+<p>You would like to produce <acronym>HTML</acronym> files from your existing Texinfo
+files? There are two programs you can use to do this. The first is
+<code>makeinfo</code> (see <a href="texinfo.html#Generating-HTML">(texinfo)Generating HTML</a>).
+The second is <code>texi2html</code>.
+</p>
+<p>The design goal of <code>makeinfo</code>'s <acronym>HTML</acronym> output was to produce
+readable <acronym>HTML</acronym> output. It is now possible to use <acronym>CSS</acronym>
+for <acronym>HTML</acronym> customization. Another possibility is to use intermediate
+formats, like docbook or <code>mekeinfo</code> <acronym>XML</acronym>
+and <acronym>XSL</acronym> stylesheets to customize the resulting document. Still the
+output produced by <code>makeinfo</code> isn't customizable.
+</p>
+<p>The current development of <code>texi2html</code> tries to
+provide for producing the more interesting and sophisticated <acronym>HTML</acronym>
+pages that today's Internet users have come to expect.
+The goal behind <code>texi2html</code> is to generate attractive <acronym>HTML</acronym> by
+default but also to allow users considerable freedom to affect the final
+style and design of the output <acronym>HTML</acronym> pages. This is achieved via
+command line options and flexible configuration files.
+</p>
+
+<p>In contrast to the <acronym>HTML</acronym> produced by <code>makeinfo --html</code> (the
+<code>makeinfo</code> program is part of the Texinfo distribution), the
+<code>texi2html</code> program, among other differences, allows for the
+customization of the entire page layout, including headers, footers, style
+sheets, etc., allows for customization of the low level <acronym>HTML</acronym>
+formatting, provides for splitting documents at various levels, and provides
+for using the <code>latex2html</code> program to convert <code>@tex</code> sections of
+the Texinfo source.
+</p>
+<p>The focus on <acronym>HTML</acronym> is still present but with the help of the
+customization files it is now possible to use <code>texi2html</code> to
+produce other formats as well. <code>texi2html</code> may for example be
+turned into a texinfo to roff translator with the help of a customization file
+provided with the distribution.
+</p>
+<p><code>texi2html</code> should reasonably convert all Texinfo
+4.8 constructs. If you find it does not, please send a bug report to the
+<a href="mailto:users@texi2html.cvshome.org">users@texi2html.cvshome.org</a> email list.
+</p>
+<hr size="6">
+<a name="Obtaining-texi2html"></a>
+<a name="SEC3"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC2" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC4" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC4" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 2. Obtaining <code>texi2html</code> </h1>
+
+<p>The latest version of the source code for <code>texi2html</code> should be
+available from <a href="http://texi2html.cvshome.org">texi2html.cvshome.org</a>.
+</p>
+<hr size="6">
+<a name="Installation"></a>
+<a name="SEC4"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC3" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC3" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 3. Installation of <code>texi2html</code> </h1>
+
+<p>To install <code>texi2html</code>, you must first obtain a copy of the
+source distribution. See section <a href="#SEC3">Obtaining <code>texi2html</code></a>.
+</p>
+<p><code>texi2html</code> also requires <code>perl</code> version
+5.004 or above. The current version has not been tested
+extensively on versions of <code>perl</code> below 5.6, however.
+</p>
+<p><code>texi2html</code> is a standard Automake-based distribution.
+If you have a source version, you should run <code>./configure</code>
+to regenerate the executable <tt>`texi2html'</tt> file. <code>./configure</code>
+accepts options to select the installation directory for the <tt>`texi2html'</tt>
+file, the default directories <code>texi2html</code> will use to look for
+configuration files, and other details. Run <code>./configure --help</code> for
+more information.
+</p>
+<p>Running <code>./configure</code> combines four files into the final
+<tt>`texi2html'</tt> program file:
+</p><ul class="toc">
+<li> <tt>`texi2html.pl'</tt> contains the base program,
+</li><li> <tt>`MySimple.pm'</tt> handles the command line options,
+</li><li> <tt>`texi2html.init'</tt> is the default configuration file, and
+</li><li> <tt>`T2h_i18n.pm'</tt> is used for internationalization.
+</li><li> <tt>`translations.pl'</tt> contains the translations of the strings used in
+documents.
+</li></ul>
+
+<p>Running <code>./configure</code> also builds the <code>make</code> configuration
+files (<tt>`Makefile'</tt>s). To make the documentation run <code>make</code>.
+</p>
+<p><code>make install</code> performs the installation to the locations specified to
+the <code>./configure</code> script. This usually involves placing the actual
+<tt>`texi2html'</tt> file someplace in your path, such as <tt>`/usr/local/bin'</tt> or
+<tt>`/usr/bin'</tt>.
+</p>
+<p>Installing <code>texi2html</code> in your path should be sufficient
+to run it. To use default initialization files, or a configuration file for
+LaTeX2HTML when using <code>latex2html</code> to convert <code>@tex</code> sections
+(see section <a href="#SEC12">Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a>), install them in the package data directory
+specified to configure. This is <tt>`/usr/local/share/texi2html/'</tt> by default,
+but depends on the value of the <a name="IDX1"></a>
+<samp>`--pkgdatadir=<var>dir</var>'</samp> option passed to
+the <code>./configure</code> script. Files used for strings customization and
+internationalization are also searched for in the <tt>`i18n'</tt> directory
+of this directory. See section <a href="#SEC13">Use initialization files for fine tuning</a> for more.
+</p>
+<hr size="6">
+<a name="Invoking-texi2html"></a>
+<a name="SEC5"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC4" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC6" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC4" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 4. Invoking <code>texi2html</code> </h1>
+
+<p>To produce an <acronym>HTML</acronym> manual, run <code>texi2html</code> with a Texinfo
+file as an argument. For example, this manual is created with:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$ texi2html texi2html.texi
+</pre></td></tr></table>
+<p>The behaviour of <code>texi2html</code> may be changed with command line
+options. These command line options are always associated with corresponding
+<code>perl</code> variables which may appear in init files, and these
+variables are presented in this chapter each time a switch is described.
+</p>
+<p>Boolean command line switches always have a corresponding negated switch,
+obtained by prepending <samp>`no'</samp> or <samp>`no-'</samp> to the switch name. For example
+<a name="IDX2"></a>
+<samp>`--nomenu'</samp> does the reverse of <a name="IDX3"></a>
+<samp>`--menu'</samp>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> The <acronym>HTML</acronym> output may be split at
+ different levels
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC8">4.3 Specifying which regions get expanded</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Customizing page layout
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+<tr><td align="left" valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Specifying initialization files for fine tuning
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Splitting-output"></a>
+<a name="SEC6"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC5" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC7" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.1 Specifying where to split the generated document </h2>
+
+<p>The <acronym>HTML</acronym> manual resulting from the processing of the Texinfo source
+may be split into files at different levels. This is specified with the
+option <a name="IDX4"></a>
+<samp>`--split'</samp> which takes an argument, namely the level of splitting
+(variable: <a name="IDX5"></a>
+<code>$SPLIT</code>). This level may be:
+</p>
+<dl compact="compact">
+<dt> <samp>`chapter'</samp></dt>
+<dd><p>The document is split at <code>@chapter</code>, <code>@appendix</code>, or <code>@unnumbered</code>.
+</p></dd>
+<dt> <samp>`section'</samp></dt>
+<dd><p>The document is split at the same places as it is using the <samp>`chapter'</samp>
+argument, and also at <code>@section</code>, <code>@appendixsec</code> or
+<code>@unnumberedsec</code>.
+</p></dd>
+<dt> <samp>`node'</samp></dt>
+<dd><p>The document is split at every sectioning command. It is not necessarily
+split at each node, if the <code>@node</code> structure doesn't correspond with
+the sectioning command structure (see below).
+</p></dd>
+<dt> <samp>`none'</samp></dt>
+<dd><p>The document isn't split. This is the default.
+</p></dd>
+</dl>
+
+<p>There are two kinds of commands which may be used to define sectioning
+elements in Texinfo: <code>@node</code> and the structuring commands (<code>@top</code>,
+<code>@section</code>, <code>@appendixsubsec</code>, and so on). A node just preceding
+a structuring command is considered to be part of the same sectioning element
+as that command. If the <code>@node Top</code> isn't associated with a structuring
+command it also defines a sectioning element.
+</p>
+<p>By default, nodes which aren't associated with a structuring command are not
+considered to be sectioning commands. They are always considered to be part
+of a sectioning element defined by a structuring command. It is possible to
+change this behaviour via the <a name="IDX6"></a>
+<samp>`--use-nodes'</samp> option (variable
+<a name="IDX7"></a>
+<code>$USE_NODES</code>). In this case, nodes not associated with structuring
+commands are also considered to be sectioning commands defining a sectioning
+element.
+</p>
+<p>This default behaviour mimics <code>texi2dvi</code> behaviour, which ignores
+<code>@node</code> commands for the purprose of sectioning, while the second
+looks like <code>makeinfo</code> behaviour (see <a href="texinfo.html#Two-Paths">(texinfo)Two Paths</a>).
+</p>
+<p>As an illustration, the following table shows how a sample Texinfo document is
+divided into sectioning elements when <a name="IDX8"></a>
+<samp>`--use-nodes'</samp> is used and not:
+</p>
+<table>
+<tr><td><p> Texinfo code
+</p></td><td>
+</td><td>
+<p>default case
+</p></td><td>
+</td><td>
+<p>with <a name="IDX9"></a>
+<samp>`--use-nodes'</samp>
+</p></td></tr>
+<tr><td>
+<br>
+<br>
+<table><tr><td>&nbsp;</td><td><pre class="example">@node node1
+@chapter node 1
+node1 text
+
+@node node2
+node2 text
+
+@node node3
+node3 text
+@chapter node 3
+chapter text
+</pre></td></tr></table></td><td>
+</td><td>
+<p>first element:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">@node node1
+@chapter node 1
+node1 text
+
+@node node2
+node2 text
+</pre></td></tr></table>
+<p>second element:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">@node node3
+node3 text
+@chapter node 3
+chapter text
+</pre></td></tr></table>
+</td><td>
+</td><td>
+<p>first element:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">@node node1
+@chapter node 1
+node1 text
+</pre></td></tr></table>
+<p>second element:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">@node node2
+node2 text
+</pre></td></tr></table>
+<p>third element:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">@node node3
+node3 text
+@chapter node 3
+chapter text
+</pre></td></tr></table>
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Output-files"></a>
+<a name="SEC7"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC6" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC8" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.2 Setting output file and directory names </h2>
+
+<p>The manual name is constructed by stripping the <samp>`.texi'</samp>,
+<samp>`.txi'</samp>, <samp>`.texinfo'</samp>, or <samp>`.txinfo'</samp> extension from the Texinfo file
+name.
+</p>
+<p>By default, <code>texi2html</code> generates the manual file in the current
+directory if the manual isn't split. A <samp>`.html'</samp> file extension is appended
+to the manual name.
+</p>
+<p>If the manual is split the files are put in a directory named after the
+manual name. The file name is constructed using the manual name as basename.
+An underscore followed by a number is appended
+to the basename for each files corresponding with sectioning elements, with the
+exception of the top element. For the top element there nothing appended.
+The files containing special elements pages
+have an underscore and a 3 letter code corresponding to their content
+(<samp>`toc'</samp> for table of contents, <samp>`abt'</samp> for about, <samp>`ovr'</samp> for
+overview) appended. Lastly, an <samp>`.html'</samp> file extension is appended.
+</p>
+<p>Thus, if the texinfo file <tt>`afile.texi'</tt> is processed and split at chapters
+into 3 files, the generated files (in directory <tt>`afile'</tt>) will be:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">afile.html --&gt; <code>@node Top</code> or <code>@top</code> section
+afile_1.html --&gt; Chapter 1
+afile_2.html --&gt; Chapter 2
+afile_toc.html --&gt; Table of Contents
+afile_abt.html --&gt; About Page
+</pre></td></tr></table>
+<p>This default behavior may be modified by several command line options. If the
+output isn't split, the prefix file name may be overrided by the
+<a name="IDX10"></a>
+<samp>`--output'</samp> command line option (variable <a name="IDX11"></a>
+<code>$OUT</code>). If the output
+is split, and <a name="IDX12"></a>
+<samp>`--output'</samp> is set, the files are placed in the directory
+specified by the argument to the option.
+</p>
+<p>The basename may be overridden with <a name="IDX13"></a>
+<samp>`--prefix'</samp> (variable
+<a name="IDX14"></a>
+<code>$PREFIX</code>). If <a name="IDX15"></a>
+<samp>`--short-ext'</samp> is given, <samp>`.htm'</samp> is appended
+instead of <samp>`.html'</samp> in the final step (variable <a name="IDX16"></a>
+<code>$SHORTEXTN</code>).
+The <a name="IDX17"></a>
+<samp>`--top-file'</samp> option
+overrides the top element file name (variable <a name="IDX18"></a>
+<code>$TOP_FILE</code>). This can
+be used to name the top element file <samp>`index.html'</samp>. Similarly,
+<a name="IDX19"></a>
+<samp>`--toc-file'</samp> changes the name of the table of contents file (variable
+<a name="IDX20"></a>
+<code>$TOC_FILE</code>).
+</p>
+<p>Reusing the example above, but this time calling <code>texi2html</code> like so:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$ texi2html -split chapter -prefix manual -short-ext -top-file index.htm -toc-file contents.htm afile.texi
+</pre></td></tr></table>
+<p>we get, in <tt>`manual'</tt>:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">index.htm --&gt; <code>@node Top</code> or <code>@top</code> section
+manual_1.htm --&gt; Chapter 1
+manual_2.htm --&gt; Chapter 2
+contents.htm --&gt; Table of Contents
+manual_abt.htm --&gt; About Page
+</pre></td></tr></table>
+<p>The file names generated by <code>texi2html</code> differ from those generated
+by <code>makeinfo</code>. <code>makeinfo</code> uses the node name to construct
+the file names while splitting at nodes. It is possible to get the same
+behaviour out of <code>texi2html</code> by specifying the
+<a name="IDX21"></a>
+<samp>`--node-files'</samp> option (variable <a name="IDX22"></a>
+<code>$NODE_FILES</code>). If the output
+isn't split at nodes, <code>texi2html</code> will still output files named after
+the nodes, without real content but redirecting to the right file.
+The default is false for this option.
+This trick enables the generated <acronym>HTML</acronym> manual to be a
+target for the cross-references of other manuals generated by
+<code>makeinfo</code> or <code>texi2html</code>.
+</p>
+<hr size="6">
+<a name="Expansion"></a>
+<a name="SEC8"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC7" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.3 Specifying which regions get expanded </h2>
+
+<p>The default for <code>texi2html</code> is to expand the <code>@ifhtml</code>,
+<code>@html</code>, and <code>@menu</code> regions, all the <code>@ifnot</code> regions
+except <code>@ifnothtml</code>, and no other <code>@if</code> regions.
+</p>
+<p>It is possible to expand other regions by setting <a name="IDX23"></a>
+<samp>`--if&lt;region&gt;'</samp>,
+where <samp>`&lt;region&gt;'</samp> is replaced by the literal name of the region (for
+example, <samp>`--iftex'</samp>). Symetrically, if <a name="IDX24"></a>
+<samp>`--no-if&lt;region&gt;'</samp> is
+specified, the <samp>`&lt;region&gt;'</samp> region is ignored. The configuration file
+array, <a name="IDX25"></a>
+<code>@EXPAND</code>, holds the names of regions which should be
+expanded. The only region name present in <code>@EXPAND</code> in the default case
+is <samp>`html'</samp>.
+</p>
+<p>If <a name="IDX26"></a>
+<samp>`--nomenu'</samp> is set, the <code>@menu</code> sections are not expanded
+(variable <a name="IDX27"></a>
+<code>$SHOW_MENU</code>). The default is to expand <code>@menu</code>
+sections.
+</p>
+<hr size="6">
+<a name="Texinfo-related-options"></a>
+<a name="SEC9"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC8" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC10" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.4 Command line options related to Texinfo language features </h2>
+
+<p>Miscalleneous Texinfo related things may be specified via command line options.
+</p>
+<dl compact="compact">
+<dt> <a name="IDX28"></a>
+<p><samp>`--lang=<var>lang</var>'</samp>
+</p></dt>
+<dd><p>Sets the document language similar to the Texinfo directive,
+<code>@documentlanguage <var>lang</var></code> (variable <a name="IDX29"></a>
+<code>$LANG</code>).
+The default is <samp>`en'</samp>, that is, use the english language strings.
+</p></dd>
+<dt> <a name="IDX30"></a>
+<p><samp>`-D<var>var</var>'</samp>
+</p></dt>
+<dd><p>Sets <var>var</var>. Equivalent to, <code>@set <var>var</var> 1</code>, in Texinfo.
+</p></dd>
+<dt> <a name="IDX31"></a>
+<p><samp>`-U<var>var</var>'</samp>
+</p></dt>
+<dd><p>Clears <var>var</var>. Equivalent to, <code>@clear <var>var</var></code>, in Texinfo.
+</p></dd>
+<dt> <a name="IDX32"></a>
+<p><samp>`-P<var>dir</var>'</samp>
+</p></dt>
+<dd><p>Prepend <var>dir</var> to the list of directories to search for
+<code>@include</code> files (the associated array is <a name="IDX33"></a>
+<code>@PREPEND_DIRS</code>,
+empty in the default case).
+</p></dd>
+<dt> <a name="IDX34"></a>
+<p><samp>`-I<var>dir</var>'</samp>
+</p></dt>
+<dd><p>Append <var>dir</var> to the list of directories to search for
+<code>@include</code> files (the associated array is <a name="IDX35"></a>
+<code>@INCLUDE_DIRS</code>,
+empty in the default case).
+</p></dd>
+</dl>
+
+<p>The include files are always searched for in the current directory.
+</p>
+<hr size="6">
+<a name="Page-layout-options"></a>
+<a name="SEC10"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC9" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC11" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.5 Page layout related command line options </h2>
+
+<p>If the <a name="IDX36"></a>
+<samp>`--frames'</samp> option is specified, <acronym>HTML</acronym> frames
+are used. A file describing the frame layout is generated, and the
+document page is associated with a frame where the short table of
+content appears (variable <a name="IDX37"></a>
+<code>$FRAMES</code>). The default is not
+to use frames.
+</p>
+<p>It is also possible to suppress the section navigation panel with
+<a name="IDX38"></a>
+<samp>`--nosec-nav'</samp> (variable <a name="IDX39"></a>
+<code>$SECTION_NAVIGATION</code>, the default
+is to output all the navigation panels), and to specify
+whether footnotes should appear at the foot of the same page which contains
+the reference to the note or on a separate page with
+<a name="IDX40"></a>
+<samp>`--separated-footnotes'</samp> (variable <a name="IDX41"></a>
+<code>$SEPARATED_FOOTNOTES</code>).
+The default is to have separated footnotes.
+</p>
+<hr size="6">
+<a name="Style-options"></a>
+<a name="SEC11"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC10" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC12" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.6 Customizing the <acronym>HTML</acronym> and text style </h2>
+
+<p>Miscalleneous style changes may be achieved with command line options.
+</p>
+<dl compact="compact">
+<dt> <a name="IDX42"></a>
+<p><samp>`--doctype=<var>DTD</var>'</samp>
+</p></dt>
+<dt> <a name="IDX43"></a>
+<p><samp>`--frameset-doctype=<var>DTD</var>'</samp>
+</p></dt>
+<dd><p>You can specify the document DTD by setting these options.
+<a name="IDX44"></a>
+<samp>`--frameset-doctype'</samp> applies to the file describing the frames when
+frames are used (corresponding variables are <a name="IDX45"></a>
+<code>$DOCTYPE</code> and
+<a name="IDX46"></a>
+<code>$FRAMESET_DOCTYPE</code>).
+</p>
+<p>The default for the document doctype is:
+</p><table><tr><td>&nbsp;</td><td><pre class="example">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html401/loose.dtd&quot;&gt;
+</pre></td></tr></table><p>And for the frameset doctype:
+</p><table><tr><td>&nbsp;</td><td><pre class="example">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Frameset//EN&quot; &quot;http://www.w3.org/TR/html401/frameset.dtd&quot;&gt;
+</pre></td></tr></table>
+</dd>
+<dt> <a name="IDX47"></a>
+<p><samp>`--iso'</samp>
+</p></dt>
+<dd><p>If this option is set, ISO8859 entities are used for some special symbols,
+like Copyright &copy; (variable <a name="IDX48"></a>
+<code>$USE_ISO</code>). It is the default.
+</p>
+</dd>
+<dt> <a name="IDX49"></a>
+<p><samp>`--css-include=<var>file</var>'</samp>
+</p></dt>
+<dd><p>This command line switch provides for the inclusion of an external
+Cascading Style Sheet (<acronym>CSS</acronym>) file. More than one file may be
+specified, and <samp>`-'</samp> stands for the standard input (array
+<a name="IDX50"></a>
+<code>@CSS_FILES</code>).
+</p>
+<p>The option use is the same than for <code>makeinfo</code> and is described
+extensively in <a href="texinfo.html#HTML-CSS">(texinfo)HTML CSS</a>.
+Briefly, the <acronym>CSS</acronym> <code>@import</code> lines from the external file
+<acronym>CSS</acronym> file are pasted before the
+<code>texi2html</code> <acronym>CSS</acronym> rules, and the external file <acronym>CSS</acronym>
+rules are pasted after the <code>texi2html</code> <acronym>CSS</acronym> rules.
+</p>
+</dd>
+<dt> <a name="IDX51"></a>
+<p><samp>`--html-xref-prefix=<var>path</var>'</samp>
+</p></dt>
+<dd><p>This option sets the base directory for external <acronym>HTML</acronym> texinfo manuals
+(variable <a name="IDX52"></a>
+<code>$EXTERNAL_DIR</code>). Defaults to <samp>`../'</samp>.
+</p>
+</dd>
+<dt> <a name="IDX53"></a>
+<p><samp>`--def-table'</samp>
+</p></dt>
+<dd><p>If this option is set, <acronym>HTML</acronym> tables are used to format definition
+commands, rather than <acronym>HTML</acronym> definition tables (variable
+<a name="IDX54"></a>
+<code>$DEF_TABLE</code>). Default is false.
+</p>
+</dd>
+<dt> <a name="IDX55"></a>
+<p><samp>`--short-ref'</samp>
+</p></dt>
+<dd><p>If this option is set, cross-references are given without section numbers
+(variable <a name="IDX56"></a>
+<code>$SHORT_REF</code>). Default is false.
+</p>
+</dd>
+<dt> <a name="IDX57"></a>
+<p><samp>`--number'</samp>
+</p></dt>
+<dd><p>If this option is set, sections are numbered (variable
+<a name="IDX58"></a>
+<code>$NUMBER_SECTIONS</code>). This is the default.
+</p>
+</dd>
+<dt> <a name="IDX59"></a>
+<p><samp>`--toc-links'</samp>
+</p></dt>
+<dd><p>If this option is set, links from headings to <acronym>TOC</acronym> entries are
+created (variable <a name="IDX60"></a>
+<code>$TOC_LINKS</code>). Default is false.
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="Expanding-TeX-regions"></a>
+<a name="SEC12"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC11" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC13" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML </h2>
+
+<p>It is possible to use <a href="http://www.latex2html.org/">LaTeX2HTML</a>
+to process <code>@tex</code> regions and <code>@math{}</code> commands. This is an
+attractive way to display mathematical constructs in the <acronym>HTML</acronym>
+manual. The <a name="IDX61"></a>
+<samp>`--l2h'</samp> option activates this feature (variable
+<var>$L2H</var>). It is usually desirable to expand <code>@tex</code> sections when this
+option is specified (see section <a href="#SEC8">Specifying which regions get expanded</a>). The default is not to use this
+feature.
+</p>
+<p>The <a name="IDX62"></a>
+<samp>`--l2h-l2h=<var>program</var>'</samp> option enables changing the name/location
+of the LaTeX2HTML program processing TeX regions (variable
+<a name="IDX63"></a>
+<code>$L2H_L2H</code>). The default is <code>latex2html</code>.
+</p>
+<a name="IDX64"></a>
+<p><samp>`--l2h-tmp'</samp> sets the directory used for temporary
+files, this name shouldn't contain a dot <samp>`.'</samp>
+(variable is <a name="IDX65"></a>
+<code>$L2H_TMP</code>). Defaults to the current dir.
+</p>
+<p>The file specified by <a name="IDX66"></a>
+<samp>`--l2h-file'</samp> is
+used as LaTeX2HTML init file. It is searched at the same places than
+init files (see section <a href="#SEC13">Use initialization files for fine tuning</a>), and the default is <tt>`l2h.init'</tt>.
+</p>
+<hr size="6">
+<a name="Using-init-files"></a>
+<a name="SEC13"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC12" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.8 Use initialization files for fine tuning </h2>
+
+
+<p>Initialization variables are read first from
+<tt>`/usr/local/share/texi2html/Config'</tt> (the exact location being
+changeable with the <a name="IDX67"></a>
+<samp>`--pkgdatadir=dir'</samp> option of the
+<code>configure</code> script, see <a href="#SEC4">Installation of <code>texi2html</code></a>),
+<tt>`/usr/local/etc/texi2html/Config'</tt> (the exact location being
+changeable with the <a name="IDX68"></a>
+<samp>`--sysconfdir=dir'</samp> option of the
+<code>configure</code> script, see <a href="#SEC4">Installation of <code>texi2html</code></a>), from <tt>`./Config'</tt>
+then from <tt>`$HOME/.texi2html/Config'</tt>. Any command-line option
+can override the corresponding option set in init file, and the
+option <a name="IDX69"></a>
+<samp>`--init-file'</samp> specifies an init file to be loaded, with
+later settings overriding earlier ones.
+</p>
+<p>The init files specified with <a name="IDX70"></a>
+<samp>`--init-file'</samp> are searched
+first in the current directory, then in the <tt>`$HOME/.texi2html/'</tt>
+directory, in the <tt>`/usr/local/etc/texi2html/'</tt> directory and lastly
+in the <tt>`/usr/local/share/texi2html/'</tt> directory.
+</p>
+<p>A file is also included based on the language selected,
+by <a name="IDX71"></a>
+<code>$LANG</code>, <a name="IDX72"></a>
+<samp>`--lang'</samp> or <code>@documentlanguage</code>.
+If no language was selected <samp>`en'</samp> is considered to be
+the language. All the files with name the language name in
+<tt>`/usr/local/share/texi2html/i18n/'</tt>,
+<tt>`/usr/local/etc/texi2html/i18n/'</tt>,
+<tt>`$HOME/.texi2html/i18n/'</tt> and then <tt>`./i18n/'</tt> are included.
+</p>
+<p>The default initialization options are defined in the
+<tt>`texi2html.init'</tt> file contained in the <code>texi2html</code>
+distribution (which gets included near the beginning of the
+<code>texi2html</code> script that gets installed).
+</p>
+<p>To customize <code>texi2html</code> it is best if you copy the
+appropriate sections from the <tt>`texi2html.init'</tt>
+contents into an appropriate local initialization file,
+make the necessary changes there, and then have
+<code>texi2html</code> read this initialization file by one of
+the means described above.
+</p>
+<hr size="6">
+<a name="Initialization-files"></a>
+<a name="SEC14"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC13" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC15" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 5. Overview of initialization files content and loading </h1>
+
+<p>The initialization files are <code>perl</code> files, read as explained
+in <a href="#SEC13">Use initialization files for fine tuning</a>. You don't need to know much of <code>perl</code>
+to do some simple changes in variable values, however, to be able to
+really take advantage of all the features of the initialization file,
+a good knowledge of <code>perl</code> is required.
+</p>
+<p>In initialization file two kind of variables appear. These are normal
+variables (including arrays and hashes) and references on functions.
+The later permits the dynamic redefinition of functions used to produce
+the <acronym>HTML</acronym> manual. You should be able to change the value of some
+normal variables without a deep knowledge of <code>perl</code>, by looking
+at the existing examples. The possible mistakes in that case could be
+omitted <samp>`;'</samp>, and bad quoting.
+</p>
+<p>Initialization file are loaded from the main program by
+the mean of a <code>require</code>, while in the <code>Texi2HTML::Config</code>
+namespace. This means that the namespace of the main program and
+the namespace of inititalization files are distinct, which ensures
+that no name clash should happen. The variables are declared with the
+<code>our</code> specifier, such that it should be possible to use the
+<code>use strict</code> pragma in the initialization file code.
+</p>
+<p>To avoid messing with the variables in the <code>main</code> namespace
+all the global variables which could be of use in the init files
+are in the <code>Texi2HTML</code> namespace. Notice that the functions
+of the main program are still in the <code>main</code> namespace.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC15">5.1 Redefining functions in initialization files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Function redefinition is achieved with
+ redefinition of references on functions.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC16">5.2 Conventions used for function prototypes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Conventions used in that manual for function
+ reference prototypes display.
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Redefining-functions"></a>
+<a name="SEC15"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC14" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC16" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 5.1 Redefining functions in initialization files </h2>
+
+<p>To redefine a function you must replace the corresponding funtion
+reference with a reference on your function.
+Thus you should write your function, give it a name you
+are certain it is unique in the <code>Texi2HTML::Config</code> namespace,
+and override the value of the function reference with your own
+function reference. When another function from the main program
+(or from another functions of an initialization file) calls the reference,
+your function will be used.
+</p>
+<p>For example the function
+reference corresponding with the function called when doing an
+anchor is called <a name="IDX73"></a>
+<code>$anchor</code>. Thus if you want to override the
+corresponding function
+you could write:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"># override the function reference
+$anchor = \&amp;my_own_function;
+
+# the function reference now refers to
+sub my_own_function {
+# process arguments and return an html anchor
+}
+</pre></td></tr></table>
+<hr size="6">
+<a name="Function-prototypes"></a>
+<a name="SEC16"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC15" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 5.2 Conventions used for function prototypes </h2>
+
+<p>As the functions are defined by a reference name, we will always
+use the reference name in function prototypes. For the function arguments
+we will use <code>\@array</code> for a reference on an array and similarly
+<code>\%hash</code> for a reference on a hash.
+</p>
+<p>Thus, the prototype for the function associated with the function
+reference <samp>`$formatting_function'</samp> will be:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $text <b>formatting_function</b><i> $arg1 \@arg2</i>
+<a name="IDX74"></a>
+</dt>
+<dd><p><code>formatting_function</code> takes as first argument <var>$arg2</var>,
+as second argument a reference on an array <var>\@arg2</var>
+and returns the formatted text <var>$text</var>.
+</p></dd></dl>
+
+<p>To redefined the corresponding function, you should write:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$formatting_function = \&amp;my_formatting_function
+
+sub my_formatting_function($ $)
+{
+ my $arg1 = shift;
+ my $arg2 = shift;
+ # prepare $formatted_text
+ .....
+ return $formatted_text
+}
+</pre></td></tr></table>
+<hr size="6">
+<a name="Changing-the-page-layout"></a>
+<a name="SEC17"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC16" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC18" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 6. Fine tuning of the page layout </h1>
+
+<p>Some features of the page layout might be specified with command line
+options, the corresponding variables are described in
+<a href="#SEC10">Page layout related command line options</a>.
+Fine tuning of the page layout may be achieved
+with redefinition of other variables and function references in the
+initialization files.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC18">6.1 The different categories of pages and sectioning elements</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> The different categories of pages.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC19">6.2 Page layout and navigation panel overview</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> The elements of a page.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC21">6.3 Customization of the navigation panels buttons</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> How to change the navigation panel.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC25">6.4 Main program variables and usefull functions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> The available main program variables and some
+ usefull functions from the main program.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC32">6.5 Preparing the output</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Setting variables before the document
+ production but after the texinfo parsing.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC33">6.6 Finalizing the output</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cleaning after document generation.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Customizing css lines.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC36">6.9 Customizing the sections</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC37">6.10 Customizing the page footer</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC38">6.11 Special pages formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Customizing table of contents, top, about page.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC45">6.12 Customizing the file names</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
+<tr><td align="left" valign="top"><a href="#SEC46">6.13 Generation of external files for index entries</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Putting index entries in external files.
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="The-different-pages"></a>
+<a name="SEC18"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC17" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC19" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.1 The different categories of pages and sectioning elements </h2>
+
+<p>The following sectioning elements can be associated with pages:
+</p>
+<dl compact="compact">
+<dt> <em>Normal elements</em></dt>
+<dd><p>These are normal sections or nodes. Their association with pages is
+determined by the splitting of the document. See section <a href="#SEC6">Specifying where to split the generated document</a>.
+</p></dd>
+<dt> <em>Top element</em></dt>
+<dd><p>The top element is the higher element in the document structure.
+If there is a <code>@top</code> section it is the element associated with
+that section. Otherwise it is the element associated with the
+<code>@node Top</code>. If there is no <code>@node Top</code> the first element is the
+top element.
+</p>
+<p>The top element is formatted differently than a normal element if there
+is a <code>@top</code> section or the <code>@node Top</code> isn't associated
+with a sectioning command.
+</p></dd>
+<dt> <em>Misc elements</em></dt>
+<dd><p>These elements are associated with pages if the document is split.
+There are four misc elements:
+</p><ol>
+<li> Table of contents
+</li><li> Short table of contents, also called Overview
+</li><li> Footnotes page
+</li><li> About page
+</li></ol>
+
+<p>The <em>About page</em> shouldn't be present for documents consisting
+in only one sectioning element. The <em>Footnote page</em> should only
+be present if the footnotes appear on a separated page
+(see section <a href="#SEC10">Page layout related command line options</a>), however a footnote element is present if
+the document isn't split. The <em>Table of contents</em> should only
+be formatted if <code>@contents</code> is present in the document.
+Similarly the <em>Overview</em> should only appear if <code>@shortcontents</code>
+or <code>@summarycontents</code> is present.
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="The-page-layout"></a>
+<a name="SEC19"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC18" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC21" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.2 Page layout and navigation panel overview </h2>
+
+<p>A page is broken up in three parts. A page header, the sections
+and a page footer. A common element in the page layout is a navigation
+panel with icons or text linking to other sections or pages. Another
+common element is a rule, separating sections or footer. The navigation
+panel and the rules may be part of the sections or part of headers or
+footers. You may use the variables <a name="IDX75"></a>
+<code>$SMALL_RULE</code>,
+<a name="IDX76"></a>
+<code>$DEFAULT_RULE</code>, <a name="IDX77"></a>
+<code>$MIDDLE_RULE</code> and <a name="IDX78"></a>
+<code>$BIG_RULE</code>
+for rules of different sizes.
+The defaults are
+</p><table><tr><td>&nbsp;</td><td><pre class="example">$SMALL_RULE = '&lt;hr size=&quot;1&quot;&gt;';
+$DEFAULT_RULE = '&lt;hr&gt;';
+$MIDDLE_RULE = '&lt;hr size=&quot;2&quot;&gt;';
+$BIG_RULE = '&lt;hr size=&quot;6&quot;&gt;';
+</pre></td></tr></table>
+
+<p>In the header some important meta data may be defined, like the
+title or style information, and textual informations may be present
+in comments. All this doesn't appear directly in the displayed
+<acronym>HTML</acronym>, though.
+</p>
+<p>The page layout is mainly controlled by functions, the precise functions
+called depending on the document splitting. The navigation panel, however,
+can be customized with variables.
+</p>
+<a name="SEC20"></a>
+<h3 class="subheading"> Element labels </h3>
+<p><a name="Element-labels"></a>
+</p>
+<p>There are 19 items associated with elements. Each of these
+is associated with a name and a reference to the
+element they represent, when such an element exists.
+The element is either a global element or an element relative to the current
+element. The relative elements are found with respect with the document
+structure defined by the section structuring commands (<code>@chapter</code>,
+<code>@unnumbered</code>&hellip;) or by the nodes (in that case the node
+directions are specified on node line or in menu organization).
+These items are called <em>element labels</em>. They may be associated with
+a button (see section <a href="#SEC23">Specifying the buttons formatting</a>), and used in the formatting functions
+(see section <a href="#SEC25">Main program variables and usefull functions</a>).
+</p>
+<p>Here is the list:
+</p>
+<dl compact="compact">
+<dt> <em><samp>`&nbsp;'</samp></em></dt>
+<dd><p>An empty button
+</p></dd>
+<dt> <em>Top</em></dt>
+<dd><p>Top element. The associated name is <a name="IDX79"></a>
+<code>$TOP_HEADING</code> if that variable is
+defined. This variable is not set by default.
+</p></dd>
+<dt> <em>Contents</em></dt>
+<dd><p>Table of contents
+</p></dd>
+<dt> <em>About</em></dt>
+<dd><p>About (help) page
+</p></dd>
+<dt> <em>Overview</em></dt>
+<dd><p>Overview, short table of contents
+</p></dd>
+<dt> <em>First</em></dt>
+<dd><p>First element in reading order
+</p></dd>
+<dt> <em>Last</em></dt>
+<dd><p>Last element in reading order
+</p></dd>
+<dt> <em>Index</em></dt>
+<dd><p>The first chapter with <code>@printindex</code>. The associated name
+is <a name="IDX80"></a>
+<code>$INDEX_CHAPTER</code>, if the variable is set. This variable is not set
+by default.
+</p></dd>
+<dt> <em>This</em></dt>
+<dd><p>The current element
+</p></dd>
+<dt> <em>Back</em></dt>
+<dd><p>Preceding element in reading order
+</p></dd>
+<dt> <em>FastBack</em></dt>
+<dd><p>Beginning of this chapter or previous chapter if the element is a chapter
+</p></dd>
+<dt> <em>Prev</em></dt>
+<dd><p>Previous section on the same level
+</p></dd>
+<dt> <em>NodePrev</em></dt>
+<dd><p>Previous node
+</p></dd>
+<dt> <em>Forward</em> </dt>
+<dd><p>Next element in reading order
+</p></dd>
+<dt> <em>FastForward</em></dt>
+<dd><p>Next chapter
+</p></dd>
+<dt> <em>Next</em></dt>
+<dd><p>Next section on the same level
+</p></dd>
+<dt> <em>NodeNext</em></dt>
+<dd><p>Next node
+</p></dd>
+<dt> <em>Following</em></dt>
+<dd><p>Next node in node reading order
+</p></dd>
+<dt> <em>Up</em></dt>
+<dd><p>Up section
+</p></dd>
+<dt> <em>NodeUp</em></dt>
+<dd><p>Up node
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="Navigation-panel"></a>
+<a name="SEC21"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC19" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.3 Customization of the navigation panels buttons </h2>
+
+<p>A lot of customization of the navigation panel may be achieved without
+redefining functions, with variables redefinition.
+In case it isn't enough, it is also possible to redefine the function
+doing the navigation panel formatting.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC22">6.3.1 Controlling the navigation panel panel at a high level</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Variables controlling the navigation panel
+ at a global level
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC24">6.3.3 Changing the navigation panel formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="General-purpose-variables"></a>
+<a name="SEC22"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC21" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC23" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC21" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.3.1 Controlling the navigation panel panel at a high level </h3>
+
+<p>The global formatting of the navigation panels may be
+changed with the following variables:
+</p>
+<dl compact="compact">
+<dt> <code>$VERTICAL_HEAD_NAVIGATION</code>
+<a name="IDX81"></a>
+</dt>
+<dd><p>A vertical navigation panel will be used for the header navigation
+panel if this variable is true.
+</p></dd>
+<dt> <code>$ICONS</code>
+<a name="IDX82"></a>
+</dt>
+<dd><p>Icons are used instead of
+textual buttons if this variable is true.
+</p></dd>
+<dt> <code>$SECTION_NAVIGATION</code>
+<a name="IDX83"></a>
+</dt>
+<dd><p>If this variable is false there is no section navigation, no navigation
+panels for the elements within the pages, only at
+the beginning and the end of the page (see section <a href="#SEC10">Page layout related command line options</a>).
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="Button-specifications"></a>
+<a name="SEC23"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC22" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC24" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC21" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.3.2 Specifying the buttons formatting </h3>
+
+<p>Several arrays and hashes enable a precise control on the buttons and
+their display.
+The following arrays determine the buttons present in navigation panels:
+</p>
+<dl compact="compact">
+<dt> <code>@SECTION_BUTTONS</code>
+<a name="IDX84"></a>
+</dt>
+<dd><p>This array is used for the navigation panel buttons present at the begining
+of sectioning elements. If split at node or section they are also used
+at the page footer, and in the case of section navigation at the page header.
+</p></dd>
+<dt> <code>@SECTION_FOOTER_BUTTONS</code>
+<a name="IDX85"></a>
+</dt>
+<dt> <code>@NODE_FOOTER_BUTTONS</code>
+<a name="IDX86"></a>
+</dt>
+<dd><p>This array is used for the navigation panel buttons present at the footer
+of pages when split at node or at section.
+</p>
+<p>If <a name="IDX87"></a>
+<code>$WORDS_IN_PAGE</code> is set and the output is split at nodes, these
+buttons are only present if there are more than <a name="IDX88"></a>
+<code>$WORDS_IN_PAGE</code>
+words in the sectioning element text. This counting is very rough and include
+punctuation marks, html elements, numbers. The default is to include the
+buttons after 300 words.
+</p></dd>
+<dt> <code>@CHAPTER_BUTTONS</code>
+<a name="IDX89"></a>
+</dt>
+<dd><p>This array is used for the buttons appearing at the page footer if split at
+chapter, and at the page header if split at chapter and there is no section
+navigation.
+</p></dd>
+<dt> <code>@MISC_BUTTONS</code>
+<a name="IDX90"></a>
+</dt>
+<dd><p>These buttons appear at the beginning of special and sections
+and at the end of these section pages if the output is split.
+</p></dd>
+</dl>
+
+<p>The array specify the buttons displayed in navigation panels,
+and how the button is displayed.
+Each element is associated with
+a button of the navigation panel from left to right.
+The signification of the array element value is the following:
+</p>
+<dl compact="compact">
+<dt> <em>reference on a function</em></dt>
+<dd><p>The function is called with first argument a filehandle reference on the
+current file and second argument a boolean true if the navigation
+panel should be vertical.
+</p></dd>
+<dt> <em>reference on a scalar</em></dt>
+<dd><p>The scalar value is printed. For some possibly
+usefull scalars, <a href="#SEC26">Accessing elements informations</a>.
+</p></dd>
+<dt> <em>reference on an array</em></dt>
+<dd><p>In this case the first array element should be a reference on text and the
+second element an element label. In that case a link to the
+element associated with the element label with the scalar value
+text is generated.
+</p>
+<p>For example if the buttons array element is
+</p><table><tr><td>&nbsp;</td><td><pre class="example">[ 'Next', \$Texi2HTML::NODE{Next} ]
+</pre></td></tr></table>
+<p>The button will be a link to the next section with text
+<a name="IDX91"></a>
+<code>$Texi2HTML::NODE{Next}</code>.
+</p></dd>
+<dt> <em>element label</em></dt>
+<dd><p>If icons are not used, the button is a link to the corresponding
+element which text is defined by the value associated with the
+element label in the <a name="IDX92"></a>
+<code>%NAVIGATION_TEXT</code> hash, surrounded
+by <samp>`['</samp> and <samp>`]'</samp>. If the element label is <samp>` '</samp>, there is
+no <samp>`['</samp> and <samp>`]'</samp>.
+The element of the <code>%NAVIGATION_TEXT</code> hash are defined
+dynamically, in the <code>init_out</code> function reference
+(see section <a href="#SEC32">Preparing the output</a>).
+</p>
+<p>If icons are used, the button is an image with file determined by
+the value associated with the element label in the <a name="IDX93"></a>
+<code>%ACTIVE_ICONS</code>
+hash if the the link really leads to an element, or in the <a name="IDX94"></a>
+<code>%PASSIVE_ICONS</code>
+hash if there is no element to link to. Of course if there is a link to the
+element the icon links to that element.
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="Panel-formatting-function"></a>
+<a name="SEC24"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC23" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC25" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC21" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.3.3 Changing the navigation panel formatting </h3>
+
+<p>If you are not satisfied with this scheme, it is possible to
+control exactly the formatting of navigation panels by redefining a function
+reference. The function controlling the display of navigation panel is
+associated with the following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_navigation</b><i> $filehandle \@buttons $vertical</i>
+<a name="IDX95"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>\@buttons</var> is an array reference which should hold the specification of
+the buttons for that navigation panel. <var>$vertical</var> is true if the
+navigation panel should be vertical.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Program-variables"></a>
+<a name="SEC25"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC24" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC26" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.4 Main program variables and usefull functions </h2>
+
+<p>In the functions
+controlling the page layout some global variables set by the main
+program are available, with value corresponding with the current
+layout element.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC26">6.4.1 Accessing elements informations</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Accessing information related with the
+ different elements
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC27">6.4.2 Accessing global informations</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Accessing global informations, like date,
+ title&hellip;
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC31">6.4.3 Function usefull in page formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> main program usefull functions
+</td></tr>
+</table>
+
+
+<hr size="6">
+<a name="Elements-hashes"></a>
+<a name="SEC26"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC25" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC27" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC25" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.4.1 Accessing elements informations </h3>
+
+<p>Four hashes are available, with key the elements labels (as described
+in <a href="#Element-labels">Element labels</a>) and values:
+</p>
+<dl compact="compact">
+<dt> <code>%Texi2HTML::NAME</code>
+<a name="IDX96"></a>
+</dt>
+<dd><p>The formatted element name
+</p></dd>
+<dt> <code>%Texi2HTML::HREF</code>
+<a name="IDX97"></a>
+</dt>
+<dd><p>The element hypertext reference
+</p></dd>
+<dt> <code>%Texi2HTML::NODE</code>
+<a name="IDX98"></a>
+</dt>
+<dd><p>The element node name
+</p></dd>
+<dt> <code>%Texi2HTML::NO_TEXI</code>
+<a name="IDX99"></a>
+</dt>
+<dd><p>The element name after removal of texi commands
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="Global-informations"></a>
+<a name="SEC27"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC26" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC31" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC25" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.4.2 Accessing global informations </h3>
+
+<p>Three kinds of global informations are available, miscalleneous global
+strings, flags set by <code>@set</code> and special flags and section lines.
+</p>
+<a name="SEC28"></a>
+<h4 class="subsubheading"> Global strings </h4>
+<p>The <a name="IDX100"></a>
+<code>%Texi2HTML::THISDOC</code> hash holds some global informations:
+</p>
+<dl compact="compact">
+<dt> <code>fulltitle</code></dt>
+<dd><p>title set by <code>@title</code>. If there is no <code>@title</code> other
+possibilities are tried (<code>@settitle</code>, <code>@shorttitlepage</code>&hellip;).
+</p></dd>
+<dt> <code>title</code></dt>
+<dd><p>title set by <code>@settitle</code>, or <code>fulltitle</code>.
+</p></dd>
+<dt> <code>title_no_texi</code></dt>
+<dd><p>title without texi formatting
+</p></dd>
+<dt> <code>title_texi</code></dt>
+<dd><p>title with texi commands
+</p></dd>
+<dt> <code>author</code></dt>
+<dd><p>Authors list set by <code>@author</code>.
+</p></dd>
+<dt> <code>authors</code></dt>
+<dd><p>A reference on an array containing each author set by <code>@author</code>.
+</p></dd>
+<dt> <code>copying</code></dt>
+<dd><p>Text appearing in <code>@copying</code> with all the texinfo commands removed,
+put in comments.
+</p></dd>
+<dt> <code>program</code></dt>
+<dd><p>The name and version of <code>texi2html</code>.
+</p></dd>
+<dt> <code>program_homepage</code></dt>
+<dd><p>Homepage for <code>texi2html</code>.
+</p></dd>
+<dt> <code>program_authors</code></dt>
+<dd><p>Authors of <code>texi2html</code>.
+</p></dd>
+<dt> <code>file_base_name</code></dt>
+<dd><p>base name of the texinfo manual file.
+</p></dd>
+<dt> <code>destination_directory</code></dt>
+<dd><p>Destination directory for the resulting files.
+</p></dd>
+<dt> <code>toc_file</code></dt>
+<dd><p>The file name of the table of contents.
+</p></dd>
+<dt> <code>today</code></dt>
+<dd><p>The date.
+</p></dd>
+</dl>
+
+<p>It also holds the arg of the following commands, associated with the command
+name: kbdinputstyle, paragraphindent, setchapternewpage, headings,
+footnotestyle,
+ exampleindent, firstparagraphindent, everyheading, everyfooting,
+ evenheading, evenfooting, oddheading, oddfooting.
+</p>
+
+<a name="SEC29"></a>
+<h4 class="subsubheading"> Flags </h4>
+<p>Flags defined by <code>@set</code> may be accessed through the
+<a name="IDX101"></a>
+<code>%main::value</code> hash. The key is the flag name, the value is the
+flag value at the end of the document.
+</p>
+<p>Special flags are set by the main program. They correspond with a texinfo
+command, like <code>@setfilename</code>, or <code>@settitle</code>,
+<code>@author</code>&hellip; The corresponding flag is the command name with
+<samp>`_'</samp> appended, for example, <code>_titlefont</code> corresponds with
+<code>@titlefont</code>. Like other flags they are available in
+<a name="IDX102"></a>
+<code>%main::value</code>.
+</p>
+
+<a name="SEC30"></a>
+<h4 class="subsubheading"> Section lines </h4>
+
+<p>The following array references or arrays holds formatted lines:
+</p>
+<dl compact="compact">
+<dt> <code>$Texi2HTML::THIS_SECTION</code>
+<a name="IDX103"></a>
+</dt>
+<dd><p>Lines of the current element.
+</p></dd>
+<dt> <code>$Texi2HTML::THIS_HEADER</code>
+<a name="IDX104"></a>
+</dt>
+<dd><p>Lines of the current element appearing before the element label (anchors).
+</p></dd>
+<dt> <code>$Texi2HTML::OVERVIEW</code>
+<a name="IDX105"></a>
+</dt>
+<dd><p>Lines of short table of contents. See section <a href="#SEC38">Special pages formatting</a>.
+</p></dd>
+<dt> <code>$Texi2HTML::TOC_LINES</code>
+<a name="IDX106"></a>
+</dt>
+<dd><p>Lines of table of contents. See section <a href="#SEC38">Special pages formatting</a>.
+</p></dd>
+</dl>
+
+<hr size="6">
+<a name="Global-functions"></a>
+<a name="SEC31"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC27" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC32" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC25" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.4.3 Function usefull in page formatting </h3>
+
+<p>The usefull function is a function used to print an array of lines, which
+also counts the number of words in the array, if needed.
+</p>
+<dl>
+<dt><u>Function:</u> $words_number <b>main::print_lines</b><i> $filehandle \@lines_array</i>
+<a name="IDX107"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>\@lines_array</var> is the array line the function should write to the file.
+If this argument is omitted, the function uses <a name="IDX108"></a>
+<code>$Texi2HTML::THIS_SECTION</code>.
+<var>$words_number</var> is the number of words in the array, only defined if
+split at nodes and <a name="IDX109"></a>
+<code>$WORDS_IN_PAGE</code> is defined.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Output-initialization"></a>
+<a name="SEC32"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC31" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC33" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.5 Preparing the output </h2>
+
+<p>After the texinfo file has been parsed, some information is available
+which can be used to modify some variables and prepare the outputting.
+For example the document language, the document encoding,
+values set with <code>@set</code> or <code>@setfilename</code> and other similar
+@-commands are not known before the texinfo parsing.
+</p>
+<p>The following function reference may be redefined to be called after
+texinfo processing and before document generation:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $encoding <b>init_out</b>
+<a name="IDX110"></a>
+</dt>
+<dd><p>This function perform the initialization of variables and any other
+task before document outputting. It returns the encoding used for the
+output files.
+</p></dd></dl>
+
+<p>In the default case the <a name="IDX111"></a>
+<code>$BODYTEXT</code> (see section <a href="#SEC35">Customizing the page header</a>)
+and the hashes <a name="IDX112"></a>
+<code>%NAVIGATION_TEXT</code> (see section <a href="#SEC23">Specifying the buttons formatting</a>) and
+<a name="IDX113"></a>
+<code>%BUTTONS_GOTO</code> (see section <a href="#SEC43">Formatting of about text</a>) are initialized.
+</p>
+<p>To perform the default initializations and also add more code, you could
+do as in the following example (save the default function reference and call
+it in your own function) :
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">my $default_init_out = $init_out;
+$init_out = \&amp;makeinfo_like_init_out;
+sub makeinfo_like_init_out()
+{
+ my $encoding = &amp;$default_init_out();
+ $NAVIGATION_TEXT{'Following'} = ' &amp;gt; ';
+ return $encoding;
+}
+</pre></td></tr></table>
+<hr size="6">
+<a name="Output-finalization"></a>
+<a name="SEC33"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC32" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC34" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.6 Finalizing the output </h2>
+
+<p>If you want to do some cleaning after the document was generated (close
+files, write at the end of files and so on), the following function
+reference may be redefined:
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>finish_out</b>
+<a name="IDX114"></a>
+</dt>
+<dd><p>This function is called after the document generation.
+</p></dd></dl>
+
+<p>The default is to do nothing.
+</p>
+<hr size="6">
+<a name="css"></a>
+<a name="SEC34"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC33" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC35" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.7 Customizing the <code>texi2html</code> css lines </h2>
+
+<p>It is possible to modify the <code>texi2html</code> css lines by modifying
+the entries or adding to the <a name="IDX115"></a>
+<code>%css_map</code> hash. Each key is a css
+selector, the corresponding value is a style string.
+</p>
+<p>The whole css text is in the variable <a name="IDX116"></a>
+<code>$CSS_LINES</code>. If this
+variable is defined the variable value is used instead of being
+constructed using the <a name="IDX117"></a>
+<code>%css_map</code> entries. For example if you don't
+want any css entries, set
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$CSS_LINES = '';
+</pre></td></tr></table>
+<p>It is also possible to change completely the way <a name="IDX118"></a>
+<code>$CSS_LINES</code> are
+generated by redefining the following function reference:
+</p>
+
+<dl>
+<dt><u>Function Reference:</u> <b>css_lines</b><i> \@import_lines \@rule_lines</i>
+<a name="IDX119"></a>
+</dt>
+<dd><p>This function should be used to construct the <a name="IDX120"></a>
+<code>$CSS_LINES</code>.
+<var>\@import_lines</var> are the <code>@import</code> lines of the
+files specified with <a name="IDX121"></a>
+<samp>`--include-css'</samp>,
+and <var>\@rule_lines</var> are the css commands lines of these files.
+See section <a href="#SEC11">Customizing the <acronym>HTML</acronym> and text style</a>.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Customizing-header"></a>
+<a name="SEC35"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC34" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC36" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.8 Customizing the page header </h2>
+
+<p>It is possible to add lines to the text within the <code>&lt;head&gt;</code>
+<acronym>HTML</acronym> elements, by defining the variable <a name="IDX122"></a>
+<code>$EXTRA_HEAD</code>.
+Similarly it is possible to add text just after the <code>&lt;body&gt;</code>
+element with the variable <a name="IDX123"></a>
+<code>$AFTER_BODY_OPEN</code>.
+These variables are empty by default.
+</p>
+<p>The encoding of the texinfo file is defined by <a name="IDX124"></a>
+<code>$DOCUMENT_ENCODING</code>
+if no <code>@documentencoding</code> appears in the document.
+The default is a <samp>`en-ascii'</samp> encoding.
+The encoding of the resulting document is defined by
+<a name="IDX125"></a>
+<code>$ENCODING</code>. The default is the <code>$DOCUMENT_ENCODING</code>.
+</p>
+<p>The description of the document may be specified in
+<a name="IDX126"></a>
+<code>$DOCUMENT_DESCRIPTION</code>. If this variable is undef, the text
+associated with <code>@documentdescription</code> is used, and if there isn't
+such test a default description is constructed using the document title and
+the name of the first section of the file.
+</p>
+<p>The <code>&lt;body&gt;</code> element attributes may be set by defining the
+variable <a name="IDX127"></a>
+<code>$BODYTEXT</code>. If you want to define that variable
+dynamically, you should use the <code>init_out</code> function reference
+(see section <a href="#SEC32">Preparing the output</a>).
+</p>
+<p>The default functions call the function associated with
+<a name="IDX128"></a>
+<code>$print_head_navigation</code> to format the navigation panel for the
+page header. Thus you can control parts of the formatting by
+redefining the function reference.
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_head_navigation</b><i> $filehandle \@buttons</i>
+<a name="IDX129"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>\@buttons</var> is an array reference which should hold the specification of
+the buttons for the navigation panel.
+</p></dd></dl>
+
+<p>If you want even more control, you can have full control over the page header
+formatting by redefining three function references. The function associated
+with <a name="IDX130"></a>
+<code>$print_page_head</code> is called for all the pages, and after that,
+the function associated with <a name="IDX131"></a>
+<code>$print_chapter_header</code> is called
+if the document is split at chapters, or the function associated with
+<a name="IDX132"></a>
+<code>$print_section_header</code> is called if the document is split at sections.
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_page_head</b><i> $filehandle</i>
+<a name="IDX133"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+This function should print the page head, including the <code>&lt;body&gt;</code>
+element.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>print_chapter_header</b><i> $filehandle</i>
+<a name="IDX134"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+This function is called if the document is split at chapters, after
+<code>print_page_head</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>print_section_header</b><i> $filehandle</i>
+<a name="IDX135"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+This function is called if the document is split at sections, after
+<code>print_page_head</code>.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Customizing-section"></a>
+<a name="SEC36"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC35" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC37" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.9 Customizing the sections </h2>
+
+<p>The functions associated with the following function references are used for
+the formatting of sections:
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_section</b><i> $filehandle $first_in_page $previous_is_top</i>
+<a name="IDX136"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>$first_in_page</var> is true if this section is the first section in the page.
+<var>$previous_is_top</var> is true if this section is the section following the
+Top section.
+This function should print the current section.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>end_section</b><i> $filehandle $last_element_or_before_top</i>
+<a name="IDX137"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>$last_element_or_before_top</var> is true if this section precedes the top
+element or is the last one in page, or before the special elements.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Customizing-footer"></a>
+<a name="SEC37"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC36" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC38" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.10 Customizing the page footer </h2>
+
+<p>It is possible to add text just before the <code>&lt;/body&gt;</code>
+element with the variable <a name="IDX138"></a>
+<code>$PRE_BODY_CLOSE</code>. Nothing is added
+by default.
+</p>
+
+<p>The default functions call the function associated with
+<a name="IDX139"></a>
+<code>$print_foot_navigation</code> to format the navigation panel for the
+page footer. Thus you can control parts of the formatting by
+redefining the function reference.
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_foot_navigation</b><i> $filehandle \@buttons</i>
+<a name="IDX140"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>\@buttons</var> is an array reference which should hold the specification of
+the buttons for the navigation panel.
+</p></dd></dl>
+
+<p>If you want even more control, you can have full control the page footer
+formatting by redefining three function references.
+The function associated with <a name="IDX141"></a>
+<code>$print_chapter_footer</code> is called
+if the document is split at chapters, or the function associated with
+<a name="IDX142"></a>
+<code>$print_section_footer</code> is called if the document is split at sections.
+ After that the function associated
+with <a name="IDX143"></a>
+<code>$print_page_foot</code> is called.
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_page_foot</b><i> $filehandle</i>
+<a name="IDX144"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+This function should print the page foot, including the <code>&lt;/body&gt;</code>
+element.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>print_chapter_footer</b><i> $filehandle</i>
+<a name="IDX145"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+This function is called if the document is split at chapters, before
+<code>print_page_foot</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>print_section_footer</b><i> $filehandle</i>
+<a name="IDX146"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+This function is called if the document is split at sections, before
+<code>print_page_foot</code>.
+</p></dd></dl>
+
+
+<hr size="6">
+<a name="Special-pages"></a>
+<a name="SEC38"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC37" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC39" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.11 Special pages formatting </h2>
+
+<p>For the special elements, two things must be formatted: the content
+and the page layout
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC39">6.11.1 Customizing the content of the special pages</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Special-pages-content"></a>
+<a name="SEC39"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC38" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC40" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC38" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.11.1 Customizing the content of the special pages </h3>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC40">6.11.1.1 Top element text formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC42">6.11.1.3 Formatting of footnotes text</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC43">6.11.1.4 Formatting of about text</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Top-element-text"></a>
+<a name="SEC40"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC39" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC41" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC39" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h4 class="subsubsection"> 6.11.1.1 Top element text formatting </h4>
+<p>The top element formatting is controlled by three function which also
+controls the layout of the top element page or section. The associated
+function references are:
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>print_Top_header</b><i> $filehandle $begin_page</i>
+<a name="IDX147"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>$begin_page</var> is true if the element is the first in a page.
+This function should begin the Top element. At the time this function is called
+the top element text hasn't been parsed.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>print_Top</b><i> $filehandle $has_top_heading</i>
+<a name="IDX148"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>$has_top_heading</var> is true if there is a <code>@heading</code> command or
+<code>@titlefont</code> command appearing in the Top element text.
+This function should be used to format the Top element text and navigation
+panel.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>print_Top_footer</b><i> $filehandle $end_page</i>
+<a name="IDX149"></a>
+</dt>
+<dd><p><var>$filehandle</var> is the opened filehandle the function should write to.
+<var>$end_page</var> is true if the element is the last in a page.
+This function should end the Top element.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Contents-and-Overview-text"></a>
+<a name="SEC41"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC40" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC42" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC39" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h4 class="subsubsection"> 6.11.1.2 Table of contents and Short table of contents </h4>
+<p>Several variables may be used to control the formatting of table of contents
+and short table of contents:
+</p>
+<dl compact="compact">
+<dt> <code>$DO_CONTENTS</code>
+<a name="IDX150"></a>
+</dt>
+<dd><p>If the variable is true a table of contents is done even if there is no
+<code>@contents</code> command.
+</p></dd>
+<dt> <code>$DO_SCONTENTS</code>
+<a name="IDX151"></a>
+</dt>
+<dd><p>If the variable is true a short table of contents is done even if there is no
+<code>@summarycontents</code> command.
+</p></dd>
+<dt> <code>$BEFORE_OVERVIEW</code>
+<a name="IDX152"></a>
+</dt>
+<dd><p>The variable value is inserted before the short table of contents text.
+</p></dd>
+<dt> <code>$AFTER_OVERVIEW</code>
+<a name="IDX153"></a>
+</dt>
+<dd><p>The variable value is inserted after the short table of contents text.
+</p></dd>
+<dt> <code>$BEFORE_TOC_LINES</code>
+<a name="IDX154"></a>
+</dt>
+<dd><p>The variable value is inserted before the table of contents text.
+</p></dd>
+<dt> <code>$AFTER_TOC_LINES</code>
+<a name="IDX155"></a>
+</dt>
+<dd><p>The variable value is inserted after the table of contents text.
+</p></dd>
+<dt> <code>$TOC_LIST_STYLE</code>
+<a name="IDX156"></a>
+</dt>
+<dd><p>This should contain a css style used for the list style if the tables of
+content are formatted with a list.
+</p></dd>
+<dt> <code>$TOC_LIST_ATTRIBUTE</code>
+<a name="IDX157"></a>
+</dt>
+<dd><p>This should contain an attribute text used for the list element if the tables of
+content are formatted with a list.
+</p></dd>
+</dl>
+
+<p>More control on the table of contents and short table of contents formatting
+may be achieved by redefining a function with the following associated
+function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>toc_body</b><i> \@elements </i>
+<a name="IDX158"></a>
+</dt>
+<dd><p><var>\@elements</var> is an array reference contining informations about
+all the elements of the document. Each of the entry of this array is an hash
+reference which entries correspond with different informations
+about the element. Interesting keys have the following meaning:
+</p>
+<dl compact="compact">
+<dt> <code>top</code></dt>
+<dd><p>true if the element is the top element,
+</p></dd>
+<dt> <code>index_page</code></dt>
+<dd><p>true if the element is an index page added because of index splitting,
+</p></dd>
+<dt> <code>toc_level</code></dt>
+<dd><p>level of the element in the table of content. Highest level
+is 1 for the top element and for chapters, appendix and so on,
+2 for section, unnumberedsec and so on...
+</p></dd>
+<dt> <code>tocid</code></dt>
+<dd><p>label used for reference linking to the element in table of
+contents,
+</p></dd>
+<dt> <code>file</code> </dt>
+<dd><p>the file containing the element, usefull to do href to that file
+in case the document is split,
+</p></dd>
+<dt> <code>text</code></dt>
+<dd><p>text of the element, with section number,
+</p></dd>
+<dt> <code>name</code></dt>
+<dd><p>text of the element, without section number.
+</p></dd>
+</dl>
+
+<p>This function doesn't return anything but should fill the array corresponding
+with the
+<a name="IDX159"></a>
+<code>$Texi2HTML::TOC_LINES</code> and
+<a name="IDX160"></a>
+<code>$Texi2HTML::OVERVIEW</code> references with the table of contents and short
+table of contents.
+</p>
+</dd></dl>
+
+<hr size="6">
+<a name="Footnotes-text"></a>
+<a name="SEC42"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC41" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC43" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC39" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h4 class="subsubsection"> 6.11.1.3 Formatting of footnotes text </h4>
+
+<p>The footnotes text is allready formatting when <code>@footnote</code> commands
+are expanded. See section <a href="#SEC82">Customizing the footnotes formatting</a>.
+</p>
+<hr size="6">
+<a name="About-text"></a>
+<a name="SEC43"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC42" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC44" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC39" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h4 class="subsubsection"> 6.11.1.4 Formatting of about text </h4>
+
+<p>The default about element contains an explaination of the buttons used
+in the document (<code>@SECTION_BUTTONS</code>, <a href="#SEC23">Specifying the buttons formatting</a>) and
+an example locating the buttons targets in an example.
+The formatting of this text may be influenced by the following
+hashes and variables:
+</p>
+<dl compact="compact">
+<dt> <code>$PRE_ABOUT</code> </dt>
+<dt> <code>$AFTER_ABOUT</code></dt>
+<dd><p>This variable may be a scalar or a function reference.
+If it is a scalar, the value is used.
+If this is a function reference it is expanded and the returned text is
+used. The text is added before or after the main about text.
+</p></dd>
+<dt> <code>%BUTTONS_GOTO</code></dt>
+<dd>
+<p>The keys of this hash are element labels (see <a href="#Element-labels">Element labels</a>). The value
+is the text associated with the element label in the about text.
+The element of the hash are defined
+dynamically, you should in the <code>init_out</code> function reference
+(see section <a href="#SEC32">Preparing the output</a>).
+</p>
+
+</dd>
+<dt> <code>%BUTTONS_EXAMPLE</code></dt>
+<dd>
+<p>The keys of this hash are element labels (see <a href="#Element-labels">Element labels</a>). The value
+is the text associated with the element label in the about example,
+typically a section number.
+</p>
+</dd>
+</dl>
+
+<p>If this is not enough and you want to control exactly the formatting of
+the about text, you can redefine the function associated with the following
+function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $about_text <b>print_about</b>
+<a name="IDX161"></a>
+</dt>
+<dd><p>This function should return the about text.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Special-pages-layout"></a>
+<a name="SEC44"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC43" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC45" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC38" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 6.11.2 Customizing the layout of the special pages </h3>
+
+<p>The formatting of each of the special pages, or section in case
+the document is not split, is controlled by a function.
+The associated function reference is called accordingly:
+</p>
+<dl compact="compact">
+<dt> <code>print_Top</code>
+<a name="IDX162"></a>
+</dt>
+<dt> <code>print_Top_header</code>
+<a name="IDX163"></a>
+</dt>
+<dt> <code>print_Top_footer</code>
+<a name="IDX164"></a>
+</dt>
+<dd><p>Formatting of top element page or section. It is also used for the formatting
+of the top element text (see section <a href="#SEC40">Top element text formatting</a>).
+</p></dd>
+<dt> <code>print_Toc</code>
+<a name="IDX165"></a>
+</dt>
+<dd><p>Formatting of table of contents page or section
+</p></dd>
+<dt> <code>print_Overview</code>
+<a name="IDX166"></a>
+</dt>
+<dd><p>Formatting of short table of contents page or section
+</p></dd>
+<dt> <code>print_About</code>
+<a name="IDX167"></a>
+</dt>
+<dd><p>Formatting of about (help) page or section
+</p></dd>
+<dt> <code>print_Footnotes</code>
+<a name="IDX168"></a>
+</dt>
+<dd><p>Formatting of footnotes section or page in case footnotes are on a
+separated page or the document isn't split.
+</p></dd>
+</dl>
+
+<p>In the default case, <a name="IDX169"></a>
+<code>$print_Top</code> calls <a name="IDX170"></a>
+<code>$print_Top_header</code> for
+the header and <a name="IDX171"></a>
+<code>$print_Top_footer</code> for the footer of top element.
+All the other function call <a name="IDX172"></a>
+<code>$print_misc</code> which in turn calls
+<a name="IDX173"></a>
+<code>$print_misc_header</code> for the headers and <a name="IDX174"></a>
+<code>$print_misc_footer</code>
+for the footers.
+</p>
+<hr size="6">
+<a name="File-names"></a>
+<a name="SEC45"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC44" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC46" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.12 Customizing the file names </h2>
+
+<p>It is possible to specify the file names with more control than with the
+command line options (see section <a href="#SEC7">Setting output file and directory names</a>).
+First the extension may be overrided by the variable <a name="IDX175"></a>
+<code>$EXTENSION</code>
+value.
+Two function references enable
+further customization. One is usefull in case <a name="IDX176"></a>
+<code>$NODE_FILES</code> is true
+and it is used to customize the node file name itself and is also used
+to produce a file name with a redirection leading to the node file.
+</p>
+<dl>
+<dt><u>Function Reference:</u> ($node_file $redirection_node_file) <b>node_file_name</b><i> $node</i>
+<a name="IDX177"></a>
+</dt>
+<dd><p><var>$node</var> is a hash reference with the following interesting keys (there
+are much more keys):
+</p><dl compact="compact">
+<dt> <code>texi</code></dt>
+<dd><p>The texinfo node name.
+</p></dd>
+<dt> <code>with_section</code></dt>
+<dd><p>True if associated with a section.
+</p></dd>
+</dl>
+<p>The result is the node file name <var>$node_file</var>, and the file containing
+a redirection to the node <var>$redirection_node_file</var>.
+</p></dd></dl>
+
+<p>The other is usefull if <code>$NODE_FILES</code> isn't true. It is used to
+customize the file associated with each element.
+</p><dl>
+<dt><u>Function Reference:</u> $file <b>element_file_name</b><i> $element $is_top $docu_name</i>
+<a name="IDX178"></a>
+</dt>
+<dd><p><var>$element</var> is a hash reference with the following interesting keys (there
+are much more keys):
+</p><dl compact="compact">
+<dt> <code>texi</code></dt>
+<dd><p>The texinfo element name.
+</p></dd>
+<dt> <code>number</code></dt>
+<dd><p>The number associated with a section.
+</p></dd>
+<dt> <code>doc_nr</code></dt>
+<dd><p>A number incremented whenever a new file should begin, based on how the
+document is split (see section <a href="#SEC6">Specifying where to split the generated document</a>).
+</p></dd>
+<dt> <code>text</code></dt>
+<dd><p>The element text.
+</p></dd>
+<dt> <code>name</code></dt>
+<dd><p>The element text without section number.
+</p></dd>
+</dl>
+<p><var>$is_top</var> is true if the element is considered as the top element.
+<var>$docu_name</var> is the basename of the texinfo manual.
+The result is the element file name.
+</p></dd></dl>
+
+<hr size="6">
+<a name="External-index-files"></a>
+<a name="SEC46"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC45" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 6.13 Generation of external files for index entries </h2>
+
+<p>Within the document, <code>@printindex</code> commands are expanded as explained
+in <a href="#SEC78">Customizing the formatting of index lists</a>. In case you want to do something special with index
+entries, outside of the document, you should first set the variable
+<a name="IDX179"></a>
+<code>$IDX_SUMMARY</code> true. After that some function reference will be called
+for each non empty index. For each index there are 3 function
+references, one called for initialization, one called for each index entry
+and the last one called for finalazation.
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>index_summary_file_begin</b><i> $index_name $is_printed</i>
+<a name="IDX180"></a>
+</dt>
+<dd><p><var>$index_name</var> is the two letters name for the index.
+This function
+is called for each index
+appearing in the document, before
+<code>index_summary_file_entry</code>.
+<var>$is_printed</var> is true if there is a <code>@printindex</code> for that index.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>index_summary_file_entry</b><i> $index_name $entry_text $entry_reference $formatted_entry $texi_entry $entry_element_reference $entry_element_header $is_printed</i>
+<a name="IDX181"></a>
+</dt>
+<dd><p>This function is called for each entry of an index. <var>index_name</var> is the
+name of the index. <var>$entry_text</var> is the entry in plain text,
+<var>$formatted_entry</var> is the index entry formatted, <var>$texi_entry</var> is the
+entry with texinfo commands. <var>$entry_reference</var> is the reference placed
+at the index entry place, in the form <samp>`file#id'</samp>.
+<var>$entry_element_header</var> is the formatted header of the element containing
+the index entry. <var>entry_element_header</var> is the reference to the
+beginning of the element containing the index entry, in the form
+<samp>`file#id'</samp>.
+<var>$is_printed</var> is true if there is a <code>@printindex</code> for that index.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> <b>index_summary_file_end</b><i> $index_name $is_printed</i>
+<a name="IDX182"></a>
+</dt>
+<dd><p><var>$index_name</var> is the two letters name for the index. This function
+is called for each index appearing in the document, after
+<code>index_summary_file_entry</code>.
+<var>$is_printed</var> is true if there is a <code>@printindex</code> for that index.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Customizing-HTML"></a>
+<a name="SEC47"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC46" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC48" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 7. Customizing <acronym>HTML</acronym> and text style in init files </h1>
+
+<p>Some simple customization may be achieved with the redefinition of the
+variables
+associated with the command line options. For the description and an
+explanation of the meaning of these variables, <a href="#SEC11">Customizing the <acronym>HTML</acronym> and text style</a>.
+</p>
+<p>Other variables and hash entries can be modified in initialization file
+to achieve more customization.
+Lastly, functions references corresponding with functions called from
+the main program and initialization files may
+be redefined.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC48">7.1 Three contexts for expansions: preformatted, normal and string</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> there are three different contexts for command
+ expansion: normal text, preformatted text and
+ strings.
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC50">7.3 Customizing accent, style and other simple commands</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC54">7.4 Formatting of special simple commands</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Formatting of <code>@anchor</code>, <code>@image</code>, <code>@sp</code>, <code>@acronym</code>, <code>@abbr</code>
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC55">7.5 Processing special characters in text</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Some characters are processed specially
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC56">7.6 Customizing strings written by <code>texi2html</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>texi2html</code> write some strings in the output
+ different for each languages
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC57">7.7 References</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC60">7.8 Commands used for centering and flushing of text</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>@center</code>, <code>@flushleft</code>&hellip;
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC61">7.9 Formatting or not a paragraph or a preformatted region</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC64">7.10 Formatting of complex formats (<code>@example</code>, <code>@display</code>&hellip;)</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>@example</code>, <code>@display</code>&hellip;
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC65">7.11 Customizing the formatting of lists and tables</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC68">7.12 Definition commands formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC71">7.13 Customizing headings formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC72">7.14 Formatting of special regions (<code>@verbatim</code>, <code>@cartouche</code>, <code>@quotation</code>)</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>@verbatim</code>, <code>@cartouche</code>, <code>@quotation</code>
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC73">7.15 Menu formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC76">7.16 Indices formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC79">7.17 Floats and lists of floats</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>@float</code> and <code>@listoffloats</code>
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC82">7.18 Customizing the footnotes formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> You can handle specifically other commands
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+</pre></th></tr></table>
+
+<hr size="6">
+<a name="Three-contexts"></a>
+<a name="SEC48"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC47" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC49" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.1 Three contexts for expansions: preformatted, normal and string </h2>
+
+<p>There are three contexts of interest, one is the normal context, the other
+is a special context, called the <em>preformatted</em> context and the last is
+the string context. The preformatted
+context occurs when the spacing between words is kept. This is the
+case, for example, in <code>@display</code> or <code>@example</code> regions, and in
+menu comments (see section <a href="#SEC73">Menu formatting</a>). The preformatted regions are usually
+rendered in <code>&lt;pre&gt;</code> elements in <acronym>HTML</acronym>.
+The string context occurs when rendering strings without formatting elements,
+in comments or titles for example.
+</p>
+<hr size="6">
+<a name="Commands-without-argument"></a>
+<a name="SEC49"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC48" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC50" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.2 Customizing the formatting of commands without argument </h2>
+
+<p>This includes the commands whose name is a nonletter character like <code>@@</code>,
+the commands with lettered characters and braces
+but whose braces should be empty, like <code>@TeX{}</code>, or some commands
+associated with accentted letters like <code>@AA{}</code>. If there happens to
+be something within the braces, it is put after the command, thus
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@TeX{something}
+</pre></td></tr></table><p>leads to the same than
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@TeX{} something
+</pre></td></tr></table>
+<p>Each of these categories of commands have three associated hashes, one
+for normal
+context, the other for preformatted context and the last in strings. The
+keys of the hashes are the
+command names, the associated value is the text replacing the command.
+</p>
+<p>The hashes are:
+</p><table>
+<tr><td><p> command type </p></td><td><p> normal text </p></td><td><p> preformatted text </p></td><td><p> string
+</p></td></tr>
+<tr><td><p> one nonlettered character </p></td><td> <a name="IDX183"></a>
+<p><code>%simple_map</code> </p></td><td> <a name="IDX184"></a>
+<p><code>%simple_map_pre</code> </p></td><td> <a name="IDX185"></a>
+<p><code>%simple_map_texi</code>
+</p></td></tr>
+<tr><td><p> nothing in braces </p></td><td> <a name="IDX186"></a>
+<p><code>%things_map</code> </p></td><td> <a name="IDX187"></a>
+<p><code>%pre_map</code> </p></td><td> <a name="IDX188"></a>
+<p><code>%texi_map</code>
+</p></td></tr>
+</table>
+
+<p>To change the <acronym>HTML</acronym> resulting from these constructs, just change the
+value. For example, if you want <code>&amp;shy;</code> to be outputted for <code>@-</code>
+in normal and preformatted context, write in your init file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$simple_map{'-'} = '&amp;shy;';
+$simple_map_pre{'-'} = '&amp;shy;';
+</pre></td></tr></table>
+<hr size="6">
+<a name="Style-and-accent-commands"></a>
+<a name="SEC50"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC49" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC51" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.3 Customizing accent, style and other simple commands </h2>
+
+<p>The formatting of the <acronym>HTML</acronym> produced by style and indicatric
+commands (<code>@tt</code>, <code>@code</code>,
+<code>@email</code>, <code>@titlefont</code>), the accentuation related
+commands taking argument (<code>@'</code>, <code>@udotaccent</code>, <code>@dotless</code>)
+and miscalleneous commands (<code>@email</code>, <code>@verb</code>, <code>@w</code>,
+<code>@uref</code>, <code>@math</code>, <code>@asis</code>) is controlled by two hash in the
+default case,
+<a name="IDX189"></a>
+<code>%style_map</code> for normal context, <a name="IDX190"></a>
+<code>%style_map_pre</code> for
+preformatted context and <a name="IDX191"></a>
+<code>%style_map_texi</code> in string context.
+</p>
+<p>The key of the hashes are the command names. There are two possibilities for
+the values corresponding with two interfaces. The values may be strings or
+hash references, and you can chose the interface depending on the one you
+prefer. The interface with hash reference is a bit more flexible but might also
+be regarded as more complex. If you don't like either of these interfaces you
+can define your own.
+</p>
+<p>Some remarks are in order:
+</p>
+<ul class="toc">
+<li>
+The nonlettered accent commands which following character is considered
+to be the argument (like in <code>@`a</code>) should be keys of the
+hash <a name="IDX192"></a>
+<code>%accent_map</code> hash, even if no value is associated.
+</li><li>
+<code>@math</code> is handled differently if LaTeX2HTML is used.
+</li></ul>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC51">7.3.1 An interface for commands formatting with a hash reference</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC52">7.3.2 An interface for commands formatting with a string</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC53">7.3.3 Defining the style and indicatric commands interface</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Hash-reference-interface"></a>
+<a name="SEC51"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC50" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC52" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC50" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.3.1 An interface for commands formatting with a hash reference </h3>
+
+<p>The key of the hashes are the command names. The value determine how the command argument
+is formatted. This value is a reference on a hash. In this hash each key
+corresponds with a type of information for the formatting, and the value is
+the corresponding information. For example, in
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$style_map{'command'} = { 'args' =&gt; ['code'], 'attribute' =&gt; 'code'};
+</pre></td></tr></table>
+<p>the arguments for <code>@command</code> are interpreted as specified by
+the values associated with the <samp>`args'</samp> key while the attribute associated
+with that command is <samp>`code'</samp>.
+</p>
+<p>The following keys in the hashes associated with each command have the
+following meaning:
+</p>
+<dl compact="compact">
+<dt> <samp>`args'</samp></dt>
+<dd><p><a name="Reference-hash-args"></a>
+The value associated is a reference on an array. Each element of the array
+defines how the arguments (separated by <samp>`,'</samp> in the texinfo code) for
+the @-command should be
+formatted. The possibilities are
+</p><dl compact="compact">
+<dt> <code>normal</code></dt>
+<dd><p>for normal text,
+</p></dd>
+<dt> <code>code</code></dt>
+<dd><p>for text with <samp>`---'</samp>, <samp>`--'</samp>, <samp>`'''</samp> and <samp>```'</samp> kept as is,
+</p></dd>
+<dt> <code>keep</code></dt>
+<dd><p>if the texinfo should be kept as is, without interpretation of the @-commands.
+</p></dd>
+</dl>
+
+<p>For example, we have
+</p><table><tr><td>&nbsp;</td><td><pre class="example">$style_map{'email'}-&gt;{'args'} = ['code', 'normal'];
+</pre></td></tr></table>
+<p>because <samp>`---'</samp>, <samp>`--'</samp>, <samp>`'''</samp> and <samp>```'</samp> should be kept as is in
+the first argument of <code>@email</code>.
+</p>
+<p>The default is <samp>`['normal']'</samp>.
+</p>
+</dd>
+<dt> <samp>`attribute'</samp></dt>
+<dd>
+<p>If the associated value is a word, it is considered to be an <acronym>HTML</acronym>
+element name, and the argument is enclosed between the element opening
+and the element closing. For example, if the value is <code>elem</code>, the
+resulting <acronym>HTML</acronym> is <code>&lt;elem&gt;<var>arg</var>&lt;/elem&gt;</code>.
+</p>
+<p>If the text is a word followed by some text,
+the word and is interpreted as above, and the
+text is considered to be the attributes text of the element.
+Thus <code>elem class=&quot;elem&quot;</code> leads to
+<code>&lt;elem class=&quot;elem&quot;&gt;<var>arg</var>&lt;/elem&gt;</code>.
+</p>
+<p>This works only if there is only one argument.
+</p>
+</dd>
+<dt> <samp>`begin'</samp></dt>
+<dd>
+<p>The associated value is added in front of the text.
+</p>
+</dd>
+<dt> <samp>`begin'</samp></dt>
+<dd>
+<p>The associated value is added after the text.
+</p>
+</dd>
+<dt> <samp>`quotes'</samp></dt>
+<dd>
+<p>If the corresponding value is true, the result is
+enclosed in quotes <a name="IDX193"></a>
+<code>$OPEN_QUOTE_SYMBOL</code> and
+<a name="IDX194"></a>
+<code>$CLOSE_QUOTE_SYMBOL</code>, with defaults
+<samp>``'</samp> and <samp>`''</samp>.
+</p>
+</dd>
+<dt> <samp>`function'</samp> </dt>
+<dd>
+<p>The corresponding value should be a function reference. The corresponding
+function is called with the following arguments:
+</p>
+<dl compact="compact">
+<dt> <code>$command</code></dt>
+<dd><p>The @-command name
+</p></dd>
+<dt> <code>$args</code></dt>
+<dd><p>A reference on an array containing the arguments of the @-command.
+</p></dd>
+<dt> <code>$style_stack</code></dt>
+<dd><p>A reference on an array containing the name of the @-commands containing
+the @-command being formatted.
+</p></dd>
+<dt> <code>$state</code></dt>
+<dd><p>A reference on a hash containing a lot of informations about the context
+of the @-command.
+</p></dd>
+<dt> <code>$line_nr</code></dt>
+<dd><p>An opaque structure containing the information about the line number of the
+@-command. It can be used to call <code>main::echo_error</code> or
+<code>main::echo_warning</code> with first argument a message, and second argument
+<code>$line_nr</code>.
+</p></dd>
+</dl>
+</dd>
+</dl>
+
+<hr size="6">
+<a name="String-interface"></a>
+<a name="SEC52"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC51" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC53" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC50" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.3.2 An interface for commands formatting with a string </h3>
+
+<p>The keys of the hashes are the command names. The value determine
+how the command argument
+is formatted. If the value begins with <samp>`&quot;'</samp>, the result is
+enclosed in quotes <a name="IDX195"></a>
+<code>$OPEN_QUOTE_SYMBOL</code> and
+<a name="IDX196"></a>
+<code>$CLOSE_QUOTE_SYMBOL</code>, with defaults
+<samp>``'</samp> and <samp>`''</samp>.
+</p>
+<p>The command argument is allready formatted as <acronym>HTML</acronym>.
+The remaining of the value text
+(or the value text if there were no <samp>`&quot;'</samp>) is interpreted as follow:
+</p>
+<ul>
+<li>
+If the text is empty the argument of the command is left as is.
+</li><li>
+If the text is a <samp>`&amp;'</samp> followed by a name,
+like <samp>`&amp;function'</samp>, the name is considered to be a function name,
+and this function is called to format the argument of the command. The
+first argument of the function is the command name, the second is
+the command argument. For example, if the value associated with the
+(fictituous) command <code>@foo</code> is <code>&amp;my_func</code>
+and we have:
+
+<table><tr><td>&nbsp;</td><td><pre class="example">sub my_func
+{
+ my @args = split /,\s*/ $_[1];
+ return &quot;$_[0]: $args[0]&quot; if ($args[1] = 1);
+ return &quot;$args[0]&quot;;
+}
+</pre></td></tr></table>
+<p>The result of
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@foo{truc, 1}
+@foo{truc, bidule}
+</pre></td></tr></table>
+<p>will be
+</p><table><tr><td>&nbsp;</td><td><pre class="example">foo: truc
+truc
+</pre></td></tr></table></li><li>
+If the text is a word, it is considered to be an <acronym>HTML</acronym> element
+name, and the argument is enclosed between the element opening
+and the element closing. For example, if the value is <code>elem</code>, the
+resulting <acronym>HTML</acronym> is <code>&lt;elem&gt;<var>arg</var>&lt;/elem&gt;</code>.
+Similarly <code>&quot;quoted</code> leads to
+<code>`&lt;quoted&gt;<var>arg</var>&lt;/quoted&gt;'</code>.
+</li><li>
+If the text is a word followed by some text,
+the word and is interpreted as above, and the
+text is considered to be the attributes text of the element.
+Thus <code>elem class=&quot;elem&quot;</code> leads to
+<code>&lt;elem class=&quot;elem&quot;&gt;<var>arg</var>&lt;/elem&gt;</code>.
+</li></ul>
+
+<hr size="6">
+<a name="Define-your-own-interface"></a>
+<a name="SEC53"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC52" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC54" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC50" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.3.3 Defining the style and indicatric commands interface </h3>
+
+<p>If you don't like this scheme, it is possible to change how those commands
+are processed by redefining the following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $resulting_text <b>style</b><i> $style $command $text $args $no_close $no_open $line_nr $state $style_stack</i>
+<a name="IDX197"></a>
+</dt>
+<dd><p><var>$command</var> is the @-command, <var>$style</var> is the value associated with
+the <var>$command</var> in the <code>%style_map</code>, <code>%style_map_pre</code>
+or <code>%style_map_texi</code> hashes.
+The <var>$text</var> is the text appearing within the @-command braces.
+<var>args</var> is a reference on an array contening the command arguments
+formatted according to the same conventions than with the reference hash style
+(provided the value associated with the @-command is a hash reference with a
+<var>$arg</var> key as described in <a href="#Reference-hash-args">Reference hash args</a>).
+If <var>$text</var> is split in paragraphs each paragraph is passed through
+the function, and <var>$no_close</var> is true if it is not the last paragraph,
+while <var>$no_open</var> is true if it is not the first paragraph.
+<var>$line_nr</var>
+is an opaque structure containing the information about the line number of the
+@-command. It can be used to call <code>main::echo_error</code> or
+<code>main::echo_warning</code> with first argument a message, and second argument
+<code>$line_nr</code>.
+<var>$state</var>
+is a reference on a hash containing a lot of informations about the context
+of the @-command.
+<var>$style_stack</var>
+is a reference on an array containing the name of the @-commands containing
+the @-command being formatted.
+</p>
+</dd></dl>
+
+<hr size="6">
+<a name="Anchors-images-and-spaces"></a>
+<a name="SEC54"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC53" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC55" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.4 Formatting of special simple commands </h2>
+
+<p>The formatting of special simple commands is controlled by functions. To
+customize the output, the corresponding function references should be
+redefined. All these functions return a formatted text.
+</p>
+<p>The formatting of anchors is controlled by <a name="IDX198"></a>
+<code>$anchor</code>, but the function
+associated with the function reference does more, it is usefull
+to produce a reference target or link.
+</p><dl>
+<dt><u>Function Reference:</u> $anchor <b>anchor</b><i> $identifier $href $text $attributes</i>
+<a name="IDX199"></a>
+</dt>
+<dd><p>If <var>$identifier</var> is not empty, this value should be used to create
+a target for links (typically associated with a name or id
+attribute in <acronym>HTML</acronym>).
+The <var>$href</var> argument specifies a hpertextual reference which should be
+used to link to a target.
+In case both <var>$identifier</var> and <var>$href</var> are given the text produced
+should be both a target for <var>$identifier</var> and a link to <var>$href</var>.
+<var>$text</var> is the text to be displayed.
+<var>$attributes</var> are additional attributes.
+It should be reasonable to assume that the attributes are for a <code>&lt;a&gt;</code>
+<acronym>HTML</acronym> element.
+</p></dd></dl>
+
+<p>The formatting of <code>@image</code> is controlled by:
+</p><dl>
+<dt><u>Function Reference:</u> $image <b>image</b><i> $file_path $basename $preformatted $file_name</i>
+<a name="IDX200"></a>
+</dt>
+<dd><p><var>$file_path</var> is the image file name with the path, <var>$basename</var> is the
+alternate text or the file name without extension if no alternate text is
+given. <var>$preformatted</var> is true if the image
+appears in preformatted text. <var>$file_name</var> is the file name without path
+but with extension.
+</p></dd></dl>
+
+<p>The formatting of <code>@sp</code> is controlled by:
+</p><dl>
+<dt><u>Function Reference:</u> $sp <b>sp</b><i> $number $preformatted</i>
+<a name="IDX201"></a>
+</dt>
+<dd><p><var>$number</var> is the numeric argument of <code>@sp</code>.
+<var>$preformatted</var> is true if the <code>@sp</code> appears in preformatted text.
+</p></dd></dl>
+
+<p>The formatting of <code>@acronym</code> and <code>@abbr</code> is controlled by:
+</p><dl>
+<dt><u>Function Reference:</u> $acronym <b>acronym_like</b><i> $acronym_texi $acronym_text $with_explanation \@explanation_lines $explanation_text $explanation_simply_formatted</i>
+<a name="IDX202"></a>
+</dt>
+<dd><p><var>$acronym_texi</var> is the acronym argument with texinfo @-commands,
+<var>$acronym_text</var> is formatted.
+</p>
+<p>The other arguments are related with
+the explanation, the second arg of the acronym. <var>$with_explanation</var> is
+true if the second argument of the acronym command is present. If an
+explanation exists, coming from previous <code>@acronym</code> or as an arg of this
+command, the other args are defined: <var>\@explanation_lines</var> is a
+reference on an array containing the unformatted explanation lines,
+<var>$explanation_text</var> is the explanation text formatted,
+<var>$explanation_simply_formatted</var> is the explanation with a light formatting,
+unabling in <acronym>HTML</acronym> (or <acronym>XML</acronym>) the explanation to be in an
+attribute.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Text"></a>
+<a name="SEC55"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC54" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC56" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.5 Processing special characters in text </h2>
+
+<p>Some characters are processed especially in text: <samp>`---'</samp>, <samp>`--'</samp>,
+<samp>```'</samp> and <samp>`'''</samp>. This is done only if in normal text and not in
+some commands (<code>@code</code>, <code>@env</code>&hellip;). A function reference
+is called to process those characters in text
+</p>
+<dl>
+<dt><u>Function Reference:</u> $processed_text <b>normal_text</b><i> $text</i>
+<a name="IDX203"></a>
+</dt>
+<dd><p>The function processes <samp>`---'</samp>, <samp>`--'</samp>, <samp>```'</samp> and <samp>`'''</samp>
+in <var>$text</var> and returns <var>$processed_text</var>. The default is to
+change <samp>`---'</samp> to <samp>`--'</samp>, <samp>`--'</samp> to <samp>`-'</samp>, and <samp>```'</samp> and
+<samp>`'''</samp> to <samp>`&quot;'</samp>.
+</p></dd></dl>
+
+<p>Some characters are special in <acronym>HTML</acronym> (<samp>`&amp;'</samp>, <samp>`&quot;'</samp>,
+<samp>`&lt;'</samp> and <samp>`&gt;'</samp>) and should be protected.
+This is done by the function associated with the function reference
+</p>
+<dl>
+<dt><u>Function Reference:</u> $protected_text <b>protect_text</b><i> $text</i>
+<a name="IDX204"></a>
+</dt>
+<dd><p>The function processes the unprotected text <var>$text</var> and returns
+the resulting protected text <var>$protected_text</var>.
+</p></dd></dl>
+
+<p>Empty lines are processed by the following function reference, which could
+be usefull if empty lines are to be removed for example
+</p>
+<dl>
+<dt><u>Function Reference:</u> $resulting_text <b>empty_line</b><i> $empty_line</i>
+<a name="IDX205"></a>
+</dt>
+<dd><p>This function processes an <var>$empty_line</var> and returns the resulting
+text <var>$resulting_text</var>. Empty lines are left as is by default.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Strings"></a>
+<a name="SEC56"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC55" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC57" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.6 Customizing strings written by <code>texi2html</code> </h2>
+
+
+<p><code>texi2html</code> writes some strings in the generated document at
+various places, at the page footers, on the help page, for special
+section headings, buttons alt text and so on. These strings are
+customizable. The string chosen depends on the language of the
+document (set by <a name="IDX206"></a>
+<samp>`--lang'</samp>, <a name="IDX207"></a>
+<code>$LANG</code> or
+<code>@documentlanguage</code>). This is the basis for internationalization
+as it allows for strings translations.
+</p>
+<p>The strings are found in a hash reference, <a name="IDX208"></a>
+<code>$LANGUAGES</code>.
+Each key is a language code. The associated value is also a hash
+reference. The key is an english string and the associated value
+is the string replacing the english string, if present. For example,
+we have
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$LANGUAGES-&gt;{'fr'} = {
+ ' Up ' =&gt; 'Plus haut',
+};
+</pre></td></tr></table>
+<p>It means that whenever the string <samp>`&nbsp;Up&nbsp;'</samp> is to be written
+and the language is <samp>`fr'</samp>, <samp>`Plus haut'</samp> is written. It is possible
+to customize the english strings by redefining the <samp>`en'</samp> language hash.
+</p>
+<p>When a string contains a <samp>`%'</samp> followed by <samp>`{'</samp> <var>name</var> <samp>`}'</samp>
+it means that the string will be expanded by <code>texi2html</code>. For
+example, if we have
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$LANGUAGES-&gt;{'fr'} = {
+ 'See %{node_file_href}' =&gt; 'Voir %{node_file_href}',
+};
+</pre></td></tr></table>
+<p><samp>`%{node_file_href}'</samp> will be expanded to an href for a node in a
+file by <code>texi2html</code> in the string. A <samp>`%%'</samp> will be expanded
+as <samp>`%'</samp>.
+</p>
+<p>For more on internationalization, see <a href="#SEC84">Internationalization</a>.
+</p>
+<hr size="6">
+<a name="References"></a>
+<a name="SEC57"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC56" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC58" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.7 References </h2>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC58">7.7.1 Reference to external manual</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC59">7.7.2 Reference to an internal node</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Reference-to-external-manual"></a>
+<a name="SEC58"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC57" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC59" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC57" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.7.1 Reference to external manual </h3>
+
+<p>The references are produced with two function references, one for the
+hypertextual reference construction, the other for the full reference to
+external manual.
+</p>
+<dl>
+<dt><u>Function Reference:</u> $href <b>external_href</b><i> $node $node_identifier $xml_node_identifier $manual_file_name</i>
+<a name="IDX209"></a>
+</dt>
+<dd><p><var>$node</var> is the node name, with @-commands. <var>$node_identifer</var> is the
+node name mapped to an identifier acceptable as a file name.
+<var>$xml_node_identifier</var> is the
+node name mapped to an identifier acceptable as an <acronym>XML</acronym> identifier.
+Those identifiers are built as explained in <a href="texinfo.html#HTML-Xref">(texinfo)HTML Xref</a>,
+thus allowing for cross references to external manuals. <var>$file</var> is the
+manual or file name of the external reference. This function should return an
+href leading to the external manual.
+</p>
+<p>The default for this function is to make a reference compatible with
+<code>makeinfo</code> (see <a href="texinfo.html#HTML-Xref">(texinfo)HTML Xref</a>).
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $text <b>external_ref</b><i> $command $section $book $node_and_file $href $cross_ref_name</i>
+<a name="IDX210"></a>
+</dt>
+<dd><p>This function formats a reference to an external texinfo manual.
+The <var>$command</var> is the ref command (<code>ref</code>, <code>xref</code> or
+<code>pxref</code>, in text, at sentence beginning or in parenthesis).
+The optionnal <var>$section</var> argument is the section in the book and
+ <var>book</var> is the book title.
+<var>$node_and_file</var> is the node and file name formatted according to the
+convention used in info: <samp>`(file)node'</samp>. <var>$href</var> it an hypertextual
+reference to the distant manual constructed using the above function.
+<var>$cross_ref_name</var> is an optionnal cross
+reference name appearing in the reference command. This function returns
+the text corresponding with the external html manual reference.
+This function returns the full formatted text of the external reference.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Internal-reference"></a>
+<a name="SEC59"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC58" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC60" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC57" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.7.2 Reference to an internal node </h3>
+
+<p>A function reference is available for internal references.
+</p>
+<dl>
+<dt><u>Function Reference:</u> $text <b>internal_ref</b><i> $command $href $short_name $name $is_section</i>
+<a name="IDX211"></a>
+</dt>
+<dd><p>This function formats a reference to a node in the current manual.
+The <var>$command</var> is the ref command (<code>ref</code>, <code>xref</code> or
+<code>pxref</code>, in text, at sentence beginning or in parenthesis).
+<var>$href</var> it an hypertextual reference linking to the corresponding
+node or section. <var>$short_name</var> and <var>$name</var> hold the text for the
+reference but <var>$short_name</var> can be the node name which is assumed to
+be shorter than the section name.
+<var>$is_section</var> is a boolean true if the reference is a reference to a
+section. This function returns the full formatted text of the internal
+reference.
+</p></dd></dl>
+
+
+<hr size="6">
+<a name="Alignement-commands"></a>
+<a name="SEC60"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC59" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC61" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.8 Commands used for centering and flushing of text </h2>
+
+
+<p>When a command controlling the alignement of text is used (<code>@center</code>,
+<code>@flushleft</code> and <code>@flushright</code>), the main program takes
+care of opening and closing paragraphs. The alignement commands are the
+key of the <a name="IDX212"></a>
+<code>%paragraph_style</code> hash.
+The value is used in the function doing the formatting of the paragraphs.
+See section <a href="#SEC61">Formatting or not a paragraph or a preformatted region</a>.
+</p>
+<p>A function references allows for a customization of the formatting of the text
+appearing in the command block.
+</p>
+<dl>
+<dt><u>Function Reference:</u> $result <b>paragraph_style_command</b><i> $command $text</i>
+<a name="IDX213"></a>
+</dt>
+<dd><p><var>$command</var> is the command name, <var>$text</var> is the text appearing within
+the command. This function returns a formatted text.
+The default is to return the text unmodified.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Paragraph-and-preformatted-region"></a>
+<a name="SEC61"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC60" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC62" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.9 Formatting or not a paragraph or a preformatted region </h2>
+
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC62">7.9.1 Paragraph and preformatted region formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC63">7.9.2 Avoiding paragraphs in formats</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Paragraph-and-preformatted-formatting"></a>
+<a name="SEC62"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC61" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC63" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC61" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.9.1 Paragraph and preformatted region formatting </h3>
+
+
+<p>The formatting of a paragraph region or a preformatted region, is controlled
+by function references:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $paragraph_text <b>paragraph</b><i> $text $alignement $formatting_command $formatting_command_formatted \$paragraph_number $format $item_number $enumerate_style $number</i>
+<a name="IDX214"></a>
+</dt>
+<dd><p>This function formats a paragraph. <var>$text</var> is the text of the paragraph,
+<var>$alignement</var> is the empty string when no alignement command has
+been seen, otherwise it is the current alignement command name.
+See section <a href="#SEC60">Commands used for centering and flushing of text</a>.
+</p>
+<p>The remaining arguments are usefull when the paragraph appears within a
+list or table. It is usefull whenever the paragraph has to be formatted
+differently when appearing in such environments.
+Moreover in that case the format command (<code>@itemize</code>&hellip;)
+may have
+an associated formatting command.
+<var>$formatting_command</var> is this formatting command
+(like <code>@minus</code>).
+<var>$formatting_command_formatted</var> is the command formatted in html
+in case the formatting command is a leading command (like <code>@minus</code>)
+which should be leading the first paragraph.
+<var>\$paragraph_number</var> is a reference on the number of
+paragraphs in that format command. The corresponding variable should be
+increased when a paragraph is added. <var>$format</var> is the format command.
+See section <a href="#SEC66">Formatting individual table and list items</a>.
+</p>
+<p>If the <var>$format</var> is an enumerate, <var>$item_number</var> is the number of
+the item in the list, <var>$enumerate_style</var> is the argument of the enumerate,
+<var>$number</var> is the number or letter corresponding with this item.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $preformatted_text <b>preformatted</b><i> $text $style $region_name $formatting_command $formatting_command_formatted \$preformatted_number $format $item_number $enumerate_style $number</i>
+<a name="IDX215"></a>
+</dt>
+<dd><p>This function formats a preformatted region. <var>$text</var> is the text of the
+preformatted region, <var>$style</var> is the css style associated with that
+preformatted region (See section <a href="#SEC34">Customizing the <code>texi2html</code> css lines</a>). <var>$region_name</var> is the
+name of the command opening
+the preformatted region (<code>example</code>&hellip;, see <a href="#SEC64">Formatting of complex formats (<code>@example</code>, <code>@display</code>&hellip;)</a>)
+or a identifier for the preformatted context (for example
+<code>menu-comment</code>, see <a href="#SEC73">Menu formatting</a>).
+The alignment commands are not taken into account, as the spaces are
+preserved in preformatted regions, you should flush and center by hand.
+</p>
+<p>The remaining arguments are usefull when the preformatted region appears
+within a list or table. It is usefull whenever the preformatted region
+has to be formatted
+differently when appearing in such environments.
+Moreover in that case the format command (<code>@itemize</code>&hellip;)
+may have
+an associated formatting command.
+<var>$formatting_command</var> is this formatting command
+(like <code>@minus</code>).
+<var>$formatting_command_formatted</var> is the command formatted in html
+in case the formatting command is a leading command (like <code>@minus</code>)
+which should be leading the first preformatted region.
+<var>\$preformatted_number</var> is a reference on the number of
+preformatted regions in that format command. The corresponding variable
+should be increased when a preformatted region is added. <var>$format</var> is the
+format command.
+See section <a href="#SEC66">Formatting individual table and list items</a>.
+</p>
+<p>If the <var>$format</var> is an enumerate, <var>$item_number</var> is the number of
+the item in the list, <var>$enumerate_style</var> is the argument of the enumerate,
+<var>$number</var> is the number or letter corresponding with this item.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Avoiding-paragraphs"></a>
+<a name="SEC63"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC62" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC64" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC61" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.9.2 Avoiding paragraphs in formats </h3>
+
+
+<p>It is possible to avoid that a format closes the previous paragraph or
+preformatted region and reopens one, by putting the format command in a
+hash, <a name="IDX216"></a>
+<code>%format_in_paragraph</code> with a true value.
+</p>
+<hr size="6">
+<a name="Complex-formats"></a>
+<a name="SEC64"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC63" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC65" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.10 Formatting of complex formats (<code>@example</code>, <code>@display</code>&hellip;) </h2>
+
+
+<p>Here we see how a whole complex format is formatted. For the formatting
+of the text, see <a href="#SEC61">Formatting or not a paragraph or a preformatted region</a>.
+</p>
+<p>The formatting of the complex formats is ultimately controlled by a
+function, however the default for this function uses a hash reference and
+changing the hash reference values should be enough in most cases. This
+hash reference is called <a name="IDX217"></a>
+<code>$complex_format_map</code>. It has a key for each
+of the complex format commands (<code>example</code>, <code>smallexample</code>,
+<code>lisp</code>, <code>smalllisp</code>, <code>display</code>, <code>smalldisplay</code>,
+<code>format</code>, <code>smallformat</code>).
+</p>
+<p>The associated value is also a reference on a hash. The keys are <code>begin</code>
+and <code>end</code>. An eval of <code>begin</code> should lead to the beginning of the
+formatted <acronym>HTML</acronym>, an eval of <code>end</code> should lead to the end of the
+formatted <acronym>HTML</acronym>. The enclosed text will be formatted as described in
+<a href="#SEC61">Formatting or not a paragraph or a preformatted region</a>, and the name of the complex
+format will be available to the function formatting the text.
+</p>
+<p>If you aren't satisfied with this scheme, you can redefine the following
+function reference for a better control over the complex format formatting:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $complex_format_text <b>complex_format</b><i> $format_name $preformatted_text</i>
+<a name="IDX218"></a>
+</dt>
+<dd><p><var>$format_name</var> is the complex format name, <var>$preformatted_text</var> is the
+text allready formatted as described in <a href="#SEC61">Formatting or not a paragraph or a preformatted region</a>.
+This function returns the whole complex format.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Lists-tables"></a>
+<a name="SEC65"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC64" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC66" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.11 Customizing the formatting of lists and tables </h2>
+
+<p>The formatting of lists and tables is done at two levels:
+</p><ul class="toc">
+<li>
+At the level of the whole region (table or list),
+</li><li>
+At the level of the individual items, rows or cells of the list or table.
+</li></ul>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC66">7.11.1 Formatting individual table and list items</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC67">7.11.2 Formatting of a whole table or list</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Table-and-list-items"></a>
+<a name="SEC66"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC65" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC67" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC65" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.11.1 Formatting individual table and list items </h3>
+
+<p>In texinfo it is possible to give <code>@itemize</code> or table command (hereafter
+called a <em>format command</em>) a <em>formatting command</em>.
+For example <code>@minus</code> is the formatting command here:
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@table @minus
+</pre></td></tr></table>
+<p>The default is to apply the command to the text item, however it is possible
+to avoid it.
+The hash <a name="IDX219"></a>
+<code>%special_list_commands</code> has an entry for each of the
+format command. Each of these entries is a hash reference. If a formatting
+command is a key of the hash reference, then the formatting command is not
+applied to the text item for that format command. For example, if we have:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$special_list_commands{'itemize'} = { 'bullet' =&gt; '' };
+</pre></td></tr></table>
+<p>and we have the following <code>@itemize</code>:
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@itemize @bullet
+@item an item
+@end itemize
+</pre></td></tr></table>
+<p>then <code>@bullet</code> will not be applied to <code>an item</code>.
+</p>
+<dl compact="compact">
+<dt> <em>lists</em></dt>
+<dd><p>The items of lists are formatted using the following function reference:
+</p><dl>
+<dt><u>Function Reference:</u> $list_item <b>list_item</b><i> $text $format $command $formatted_command $item_number $enumerate_style $number</i>
+<a name="IDX220"></a>
+</dt>
+<dd><p>This function formats the text between <code>@item</code> commands. <var>$text</var>
+is the text corresponding with the item. <var>$format</var> is the type of format,
+<samp>`itemize'</samp> or <samp>`enumerate'</samp>. <var>$command</var> is the formatting command
+given in argument to <code>@itemize</code>, <var>$formatted_command</var> is this command
+formatted if it is a leading command, like <code>@minus</code>.
+</p>
+<p>If the <var>$format</var> is an enumerate, <var>$item_number</var> is the number of
+the item in the list, <var>$enumerate_style</var> is the argument of the enumerate,
+<var>$number</var> is the number or letter corresponding with this item.
+</p></dd></dl>
+
+</dd>
+<dt> <em>two column tables</em></dt>
+<dd><p>The two columns tables (<code>@table</code>, <code>@ftable</code> and <code>@vtable</code>),
+items are formatted using two function references,
+one for the first line located on the <code>@item</code> line corresponding
+with the first column, the other for the text appearing on the
+following lines, corresponding with the second column text.
+</p>
+<dl>
+<dt><u>Function Reference:</u> $table_item <b>table_item</b><i> $item_text $index_label_text $format $command $formatted_command</i>
+<a name="IDX221"></a>
+</dt>
+<dd><p>This function is used to format the text on the <code>@item</code> line.
+<var>$text_item</var> is the text line. In case there is an index entry
+associated with the <code>@item</code> (as with <code>@ftable</code> and
+<code>@vtable</code>), <var>$index_label_text</var> is the text inserted at
+the place where an index entry appears. See section <a href="#SEC77">Formatting of index entries</a>.
+<var>$format</var> is the type of format,
+<samp>`table'</samp>, <samp>`ftable'</samp> or <samp>`vtable'</samp>. <var>$command</var> is the formatting command
+given in argument to the table format command, <var>$formatted_command</var> is
+this command formatted if it is a leading command, like <code>@minus</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $table_line <b>table_line</b><i> $text</i>
+<a name="IDX222"></a>
+</dt>
+<dd><p>This function is used to format the text on the lines following
+the <code>@item</code> line. <var>$text</var> is the corresponding text.
+</p></dd></dl>
+
+</dd>
+<dt> <em>multitable</em></dt>
+<dd><p>The multitable elements formatting is controlled by the functions associated
+with two function references. One for a cell, and the other for a row.
+</p>
+<dl>
+<dt><u>Function Reference:</u> $multitable_cell <b>cell</b><i> $text</i>
+<a name="IDX223"></a>
+</dt>
+<dd><p>This function is used to format the text of a multitable cell, the text
+following a <code>@item</code> or a <code>@tab</code>.
+<var>$text</var> is the corresponding text.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $multitable_row <b>row</b><i> $text $item_command</i>
+<a name="IDX224"></a>
+</dt>
+<dd><p>This function is used to format a multitable row. <var>$text</var> is
+the row text, with cells allready formatted with the <a name="IDX225"></a>
+<code>$cell</code>
+function reference. <var>$item_command</var> is the command used to introduce
+the row, such that it is possible to distinguish between <code>@item</code> and
+<code>@headitem</code>.
+</p></dd></dl>
+</dd>
+</dl>
+
+<hr size="6">
+<a name="Whole-table-list"></a>
+<a name="SEC67"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC66" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC68" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC65" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.11.2 Formatting of a whole table or list </h3>
+
+<p>If the Texinfo command is a key of the <a name="IDX226"></a>
+<code>%format_map</code>, the associated
+value is used to specify the formatting of the construct, otherwise a function
+is called.
+The value in <code>%format_map</code> associated with a command is interpreted
+similarly with values associated with more simpler commands:
+</p>
+<ul class="toc">
+<li>
+If the text is a word, it is considered to be an <acronym>HTML</acronym> element
+name, and the whole table or list is enclosed between the element opening
+and the element closing.
+</li><li>
+If the text is a word followed by some text,
+the word and is interpreted as above, and the
+text is considered to be the attributes text of the element.
+</li><li>
+If the text is empty nothing is added to the text.
+</li></ul>
+
+<p>In case the <code>%format_map</code> isn't used, a function reference called
+<code>$table_list</code>
+should be redefined, the associated function will be called each time
+a command isn't found in <code>%format_map</code>.
+</p>
+<dl>
+<dt><u>Function Reference:</u> $whole_table_list <b>table_list</b><i> $command $text</i>
+<a name="IDX227"></a>
+</dt>
+<dd><p><var>$command</var> is the Texinfo command name, <var>$text</var> is the formatted
+items.
+</p></dd></dl>
+
+<p>If you still want to use <a name="IDX228"></a>
+<code>%format_map</code> but differently from
+the default, it is possible to redefine the following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $whole_table_list <b>format</b><i> $command $format $text</i>
+<a name="IDX229"></a>
+</dt>
+<dd><p><var>$command</var> is the @-command, <var>$format</var> is the entry associated with
+<var>$command</var> in <code>%format_map</code>. <var>$text</var> is the formatted items.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Definitions"></a>
+<a name="SEC68"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC67" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC69" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.12 Definition commands formatting </h2>
+
+<p>The formatting of definition commands is controlled by a hash and four
+functions. The hash describes how the text on the definition line is
+interpreted, the functions control the formatting of the definition line
+and the definition function text.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC69">7.12.1 Customizing the interpretation of a definition line</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC70">7.12.2 Customization of the definition formatting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Definition-line"></a>
+<a name="SEC69"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC68" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC70" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC68" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.12.1 Customizing the interpretation of a definition line </h3>
+
+<p>The keys of the hash <a name="IDX230"></a>
+<code>%def_map</code> are definition command names.
+There are two types of entries:
+</p>
+<ul class="toc">
+<li> If the command is a shortcut for
+another definition command the value is a text and the definition
+command is replaced by the text.
+
+<p>For example if we have:
+</p><table><tr><td>&nbsp;</td><td><pre class="example">$def_map{'deftruc'} = '@defvr {A truc}';
+</pre></td></tr></table>
+<p>and a line like
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@deftruc var
+</pre></td></tr></table>
+<p>the line will be transformed in
+</p><table><tr><td>&nbsp;</td><td><pre class="example">@defvr {A truc} var
+</pre></td></tr></table>
+</li><li>
+If the command isn't a shortcut, it is associated with an array
+reference. The first element is <samp>`f'</samp>, <samp>`v'</samp> or <samp>`t'</samp> corresponding
+with the index type (<samp>`f'</samp> for function, <samp>`v'</samp> for variable,
+<samp>`t'</samp> for type).
+
+<p>The remaining of the array describes how to interpret the text following
+the definition command on the definition command line.
+The entry item specify what corresponds
+with the next bracketed item or word. Currently the possibilities are
+<samp>`category'</samp>, <samp>`name'</samp>, <samp>`type'</samp>, <samp>`class'</samp> and <samp>`arg'</samp>.
+</p>
+<p>For example if we have
+</p><table><tr><td>&nbsp;</td><td><pre class="example">def_map{'defvr'} = [ 'v', 'category', 'name' ];
+</pre></td></tr></table>
+<p>The first bracketed item following <code>@defvr</code> is considered
+to be the category and the next one is the name. The index associated
+with the definition line is the variables index.
+</p></li></ul>
+
+<hr size="6">
+<a name="Definition-formatting"></a>
+<a name="SEC70"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC69" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC71" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC68" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.12.2 Customization of the definition formatting </h3>
+
+<p>Four functions are used when formatting a definition command:
+</p>
+<dl compact="compact">
+<dt> category name</dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $category <b>definition_category</b><i> $category_or_name $class $style</i>
+<a name="IDX231"></a>
+</dt>
+<dd><p>This function precise a category or an index entry name associating a class
+<var>$class</var> (if given) with <var>$category_or_name</var>. The <var>$style</var> of the
+definition may be <samp>`f'</samp>, for function, <samp>`v'</samp>, for variable or <samp>`t'</samp>,
+for type.
+</p></dd></dl>
+</dd>
+<dt> formatting of the definition line</dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $line <b>def_line</b><i> $category $name $type $arguments $index_label</i>
+<a name="IDX232"></a>
+</dt>
+<dd><p>This function formats the definition line. <var>$category</var> is the category
+formatted with <a name="IDX233"></a>
+<code>$definition_category</code>, <var>$name</var>, <var>$type</var> and
+<var>arguments</var> are the element of the definition line. <var>$index_label</var> is
+the text inserted at the place where an index entry appears.
+See section <a href="#SEC77">Formatting of index entries</a>.
+</p></dd></dl>
+
+</dd>
+<dt> definition text</dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $definition_text <b>def_item</b><i> $text</i>
+<a name="IDX234"></a>
+</dt>
+<dd><p>This function formats the definition text, <var>$text</var>.
+</p></dd></dl>
+
+</dd>
+<dt> the whole definition</dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $definition <b>def</b><i> $text</i>
+<a name="IDX235"></a>
+</dt>
+<dd><p>This function formats the whole definition. The definition line and text
+formatted by the above functions are in <var>$text</var>.
+</p></dd></dl>
+
+</dd>
+</dl>
+
+<hr size="6">
+<a name="Headings"></a>
+<a name="SEC71"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC70" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC72" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.13 Customizing headings formatting </h2>
+
+<p>A function controls the formatting of sectioning element headings,
+with the corresponding function reference:
+</p><dl>
+<dt><u>Function Reference:</u> $heading_text <b>heading</b><i> \%element_reference</i>
+<a name="IDX236"></a>
+</dt>
+<dd><p>The <var>\%element_reference</var> is a reference on a hash corresponding
+with the sectioning element. The following keys are of interest:
+</p><dl compact="compact">
+<dt> <code>text</code></dt>
+<dd><p>The heading text
+</p></dd>
+<dt> <code>name</code></dt>
+<dd><p>The heading text without section number
+</p></dd>
+<dt> <code>node</code></dt>
+<dd><p>true if the sectioning element is a node without associated structuring command
+</p></dd>
+<dt> <code>level</code></dt>
+<dd><p>The level of the element in the document tree. <samp>`0'</samp> is for <code>@top</code>,
+<samp>`1'</samp> for <code>@chapter</code> and so on
+</p></dd>
+<dt> <code>tag_level</code></dt>
+<dd><p>the sectioning element name, with <code>@raisesections</code> and
+<code>@lowersections</code> taken into account
+</p></dd>
+</dl>
+</dd></dl>
+
+<hr size="6">
+<a name="Special-regions"></a>
+<a name="SEC72"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC71" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC73" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.14 Formatting of special regions (<code>@verbatim</code>, <code>@cartouche</code>, <code>@quotation</code>) </h2>
+
+<p>Regions corresponding with raw text, like <code>@verbatim</code>, <code>@html</code>
+or <code>@tex</code> are formatted according to the following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $raw_region <b>raw</b><i> $command $text</i>
+<a name="IDX237"></a>
+</dt>
+<dd><p><var>$command</var> is the command name, <var>$text</var> is the raw text.
+</p></dd></dl>
+
+<p>If LaTeX2HTML is used, <code>@tex</code> regions are handled differently,
+from within the main program.
+</p>
+<p>The <code>@cartouche</code> command formatting is controlled by the
+function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $cartouche <b>cartouche</b><i> $text</i>
+<a name="IDX238"></a>
+</dt>
+<dd><p><var>$text</var> is the text appearing within the cartouche.
+</p></dd></dl>
+
+<p>The formatting of <code>@quotation</code> is controlled by two function references.
+The first one is usefull in case the <code>@quotation</code> has an argument, as
+it allows to prepend a string to the quotation text:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $prepended_string <b>quotation_prepend_text</b><i> $style $text</i>
+<a name="IDX239"></a>
+</dt>
+<dd><p><var>$style</var> is the first argument of the <code>@quotation</code> if there are
+two arguments. <var>$text</var> is the second argument or the first if there is
+one argument. There are still @-commands in these strings. This function
+can return a string which will be prepended to the quotation text.
+</p></dd></dl>
+
+<p>The whole quotation is formatted by:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $quotation <b>quotation</b><i> $quotation_text $argument_text $argument_style_texi $argument_style_id</i>
+<a name="IDX240"></a>
+</dt>
+<dd><p><var>$quotation_text</var> is the quotation text, formatted, with the text
+prepended by the function above. <var>$argument_text</var> is the second argument
+of the <code>@quotation</code> or the first if there is one argument, formatted.
+The other arguments are defiend if there are two arguments for the
+<code>@quotation</code>, <var>$argument_style_texi</var> is this argument, with
+@-commands, and <var>$argument_style_id</var> is this argument transformed in
+an identifier which can be used as an <acronym>XML</acronym> identifier.
+</p></dd></dl>
+
+
+<hr size="6">
+<a name="Menus"></a>
+<a name="SEC73"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC72" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC74" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.15 Menu formatting </h2>
+
+<p>To understand how the formatting of menus is controlled, the different
+parts of a menu are first described, then how to control the formatting
+of each of these parts.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC74">7.15.1 The structure of a menu</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> A menu consists in menu entry and menu
+ comments
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC75">7.15.2 The formatting of the different menu components</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Menu-parts"></a>
+<a name="SEC74"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC73" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC75" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC73" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.15.1 The structure of a menu </h3>
+
+<p>In <code>texi2html</code>, a menu is considered to be composed of 2 parts, the
+<em>menu entries</em> and the <em>menu comments</em>. Menu entries are further
+divided in an <em>entry link</em> and optionnaly an <em>entry description</em>.
+The entry link consists in a node name and an optionnal menu entry
+name.
+</p>
+<p>A menu entry begins with <samp>`*'</samp> at the beginning of the line. It begins
+with the entry link, followed by the description. The description spans until
+the next menu entry, or some text begining at the first character of a line
+or an empty line, not contained within a command block which begun in the
+description. An empty line or a line with text at the first character
+starts a menu comment, which spans until the next menu entry.
+</p>
+<p>Here is an illustration of these rules:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">@menu
+* node name: entry name. description begins
+ description continues
+* another menu entry::
+ description begins
+ description continues
+
+ A menu comment, after an empty line
+
+* node:: description begins
+A menu comment. The line starts at the first character
+
+* last entry:: description begins <em>text
+of the description, even if the line begins at the first character,
+because we are in @emph</em>.
+@end menu
+</pre></td></tr></table>
+<hr size="6">
+<a name="Menu-formatting"></a>
+<a name="SEC75"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC74" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC76" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC73" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.15.2 The formatting of the different menu components </h3>
+
+<p>In the default case, the name of the section corresponding with the
+node is used instead of the node name. If <a name="IDX241"></a>
+<code>$NODE_NAME_IN_MENU</code> is
+true, however, node names are used. If <a name="IDX242"></a>
+<code>$AVOID_MENU_REDUNDANCY</code>
+is true and menu entry equal menu description the description isn't printed.
+This is the default. Likewise, if node or section name equal entry name,
+do not print entry name.
+</p>
+<p>A symbol, <a name="IDX243"></a>
+<code>$MENU_SYMBOL</code> is put at the beginning of menu entries
+when the node name is used. The default is <samp>`&amp;bull;'</samp>.
+If <a name="IDX244"></a>
+<code>$UNNUMBERED_SYMBOL_IN_MENU</code> is true it is
+also put at the beginning of unnumbered section names. This is not
+done by default.
+</p>
+<p>The menu comments are considered to be preformatted text. The style
+associated with this preformatted text is determined by
+<a name="IDX245"></a>
+<code>$MENU_PRE_STYLE</code>. Default is <samp>`font-family: serif'</samp>.
+The css class associated with menu comments is <code>menu-comments</code>.
+</p>
+<p>Three function references are associated with the formatting of the
+different parts of a menu:
+</p><dl>
+<dt><u>Function Reference:</u> $link <b>menu_link</b><i> $section \%state $href $node $name $ending</i>
+<a name="IDX246"></a>
+</dt>
+<dd><p><var>$section</var> is the section name corresponding with the link, <var>$href</var>
+is the link hypertextual reference. <var>$href</var> may be absent. <var>\%state</var>
+holds informations about the current context. The only key which could be
+of interest is <code>preformatted</code>, true if the context is a preformatted
+context. See section <a href="#SEC48">Three contexts for expansions: preformatted, normal and string</a>.
+<var>$node</var> is the node name, <var>$name</var> is the
+name of the node, and <var>$ending</var> is the text ending the link entry.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $description <b>menu_description</b><i> $description_text \%state</i>
+<a name="IDX247"></a>
+</dt>
+<dd><p><var>$description_text</var> is the text of the menu description. <var>\%state</var>
+should be used similarly than for the menu link.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $menu_comment <b>menu_comment</b><i> $text</i>
+<a name="IDX248"></a>
+</dt>
+<dd><p><var>$text</var> is the text of the menu comment. It is in a preformatted
+environment.
+</p></dd></dl>
+
+<p>The following function reference controls the formatting of a wole menu:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $menu <b>menu</b><i> $menu_components_text</i>
+<a name="IDX249"></a>
+</dt>
+<dd><p><var>$menu_components_text</var> is the formatted menu components text, obtained
+as explained above.
+</p></dd></dl>
+
+<p>The last function reference corresponds with a special case. It
+is used when a menu entry appears within another block command, to
+avoid the possibilities of invalid <acronym>HTML</acronym> production.
+In that case the menu description and menu comments are not formatted
+specially, but treated like normal text.
+</p><dl>
+<dt><u>Function Reference:</u> $link <b>simple_menu_link</b><i> $link_text $href $node $name $ending</i>
+<a name="IDX250"></a>
+</dt>
+<dd><p><var>$link_text</var> is the text corresponding with the link name, <var>$href</var>
+is the link hypertextual reference.
+<var>$node</var> is the node name, <var>$name</var> is the
+name of the node, and <var>$ending</var> is the text ending the link entry.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Indices"></a>
+<a name="SEC76"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC75" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC77" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.16 Indices formatting </h2>
+
+<p>Two different things needs to be handled for indices formatting, the place
+where the index term appears, the index entry, and the index list itself.
+The indexing commands like <code>@cindex</code> determines where index entries
+appear, and the index list is printed with a <code>@printindex</code> command.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC77">7.16.1 Formatting of index entries</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Index entries in the main document are
+ targets for hypertext references
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC78">7.16.2 Customizing the formatting of index lists</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Customizing the formatting of the index list
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Index-entry-place"></a>
+<a name="SEC77"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC76" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC78" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC76" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.16.1 Formatting of index entries </h3>
+
+<p>Index entry places in the main text may be the target for hypertext
+references. Their formatting
+is controlled by the function associated with the following function
+reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $target <b>index_entry_label</b><i> $identifier $preformatted</i>
+<a name="IDX251"></a>
+</dt>
+<dd><p><var>$identifier</var> should be used to create
+a target for links (typically associated with a name or id
+attribute in <acronym>HTML</acronym>).
+<var>$preformatted</var> is true if the index entry appeared in preformatted text.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Index-list"></a>
+<a name="SEC78"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC77" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC79" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC76" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.16.2 Customizing the formatting of index lists </h3>
+
+<p>The index entries are sorted alphabetically. A whole index list is
+considered to be composed of letter entries. A letter entry is composed
+by all the index entries beginning with that letter. A letter may
+be a non alphabetical character, but we call it letter here.
+</p>
+<p>An index summary appears at the beginning and at the end of an index list,
+and should be used to jump directly to a letter entry. Indices lists
+may be split across pages, thus the different letters may appear on different
+files. The number of index entries appearing on each page is determined
+by a variable <a name="IDX252"></a>
+<code>$SPLIT_INDEX</code> if set. The default is to split
+indices after 100 entries.
+</p>
+<p>The formatting of all these elements is controlled by the following
+function references:
+</p>
+<dl compact="compact">
+<dt> <em>formatting of a letter in a summary</em></dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $letter <b>summary_letter</b><i> $letter $file $identifier</i>
+<a name="IDX253"></a>
+</dt>
+<dd><p>This function is used to format a letter appearing in a summary, refering
+to a letter entry in the index list.
+<var>$letter</var> is the letter. <var>$file</var> is the file name where the letter
+entry appears. More precisely, it is empty when the letter entry is on the
+same page than the summary, it contains the file name when the index page
+is split accross page. <var>$identifier</var> is an identifier for the target
+letter entry.
+</p></dd></dl>
+
+</dd>
+<dt> <em>formatting of a summary</em></dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $summary <b>index_summary</b><i> \@alphabetical_letters \@nonalphabetical_letters</i>
+<a name="IDX254"></a>
+</dt>
+<dd><p><var>\@alphabetical_letters</var> and <var>\@nonalphabetical_letters</var> contain the
+formatted summary letters, formatted with the above function.
+</p></dd></dl>
+
+</dd>
+<dt> <em>formatting of an index entry</em></dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $entry <b>index_entry</b><i> $entry_href $entry_text $section_href $section_heading</i>
+<a name="IDX255"></a>
+</dt>
+<dd><p><var>$entry_href</var> is a reference to the place where the index entry
+appeared, <var>$entry_text</var> is the corresponding text. <var>$section_href</var>
+is a reference to the beginning of the sectioning element containing
+the index entry, <var>$section_heading</var> is the heading of the element.
+</p></dd></dl>
+
+</dd>
+<dt> <em>formatting of letter entry</em></dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $letter_entry <b>index_letter</b><i> $letter $identifier $index_entries_text</i>
+<a name="IDX256"></a>
+</dt>
+<dd><p>This function formats a letter entry, consisting in all the index entries
+beginning with this letter. <var>$letter</var> is the letter, <var>$identifier</var>
+should be used to create a target for links (typically links from summaries),
+and <var>$index_entries_text</var> is the text of the index entries formatted as
+described above.
+</p></dd></dl>
+
+</dd>
+<dt> <em>formatting of whole index</em></dt>
+<dd><dl>
+<dt><u>Function Reference:</u> $index <b>print_index</b><i> $index_text $index_name</i>
+<a name="IDX257"></a>
+</dt>
+<dd><p><var>$index_text</var> is the text of all the index entries grouped by letter
+appearing in that page formatted as above. <var>index_name</var> is the name of
+the index, the argument of <code>@printindex</code>.
+</p></dd></dl>
+</dd>
+</dl>
+
+<hr size="6">
+<a name="Floats-and-lists-of-floats"></a>
+<a name="SEC79"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC78" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC80" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.17 Floats and lists of floats </h2>
+
+<p>Floats appear in the <code>@float</code> environment, optionaly with a style
+and a label, and with optionnal <code>@caption</code> and <code>@shortcaption</code>.
+Their list appear after a <code>@listoffloats</code>.
+</p>
+<p>A hash reference is associated with each float, it is available in some
+formatting functions. The keys are:
+</p><dl compact="compact">
+<dt> <code>caption_texi</code></dt>
+<dt> <code>shortcaption_texi</code></dt>
+<dd><p>A reference on an array containing the caption or shortcaption lines,
+unformatted.
+</p></dd>
+<dt> <code>style_texi</code></dt>
+<dd><p>The style with texi @-commands.
+</p></dd>
+<dt> <code>style_id</code></dt>
+<dd><p>The unique identifier associated with the style.
+</p></dd>
+<dt> <code>nr</code></dt>
+<dd><p>The number with the same conventions than makeinfo (use the chapter number a
+dot and then the number of the float of that style in the chapter, or an
+absolute number if in unnumbered).
+</p></dd>
+<dt> <code>chapter_nr</code></dt>
+<dd><p>The number of the chapter containing the float.
+</p></dd>
+<dt> <code>nr_in_chapter</code></dt>
+<dd><p>The number of the float in the chapter.
+</p></dd>
+<dt> <code>absolut_nr</code></dt>
+<dd><p>The number of the float in the document.
+</p></dd>
+<dt> <code>texi</code></dt>
+<dd><p>The label with @-commands.
+</p></dd>
+<dt> <code>id</code></dt>
+<dd><p>The unique identifier associated with the label. Usefull to make an anchor
+or a reference.
+</p></dd>
+<dt> <code>element</code></dt>
+<dd><p>A reference on a structure representing the element the float appear in.
+</p></dd>
+</dl>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC80">7.17.1 Formatting a float</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Formatting of floats
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC81">7.17.2 Formatting lists of floats</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Formatting the lists of floats
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Floats"></a>
+<a name="SEC80"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC79" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC81" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC79" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.17.1 Formatting a float </h3>
+
+<p>First there is an occasion to construct a texinfo text for the caption, using
+the caption texinfo lines and the informations in the float structure.
+The returned lines will be formatted in the main program. A function reference
+is used here:
+</p>
+<dl>
+<dt><u>Function Reference:</u> (\@caption_lines_returned, \@shortcaption_lines_returned) <b>caption_shortcaption</b><i> \%float \@caption_lines \@shortcaption_lines</i>
+<a name="IDX258"></a>
+</dt>
+<dd><p><var>\%float</var> is the structure defined above. <var>\@caption_lines</var> and
+<var>\@shortcaption_lines</var> are references on arrays containing the
+texinfo lines for caption and short caption. <var>\@caption_lines_returned</var>
+and <var>\@shortcaption_lines_returned</var> are references on an array
+containing the texinfo lines for the caption and shortcaption.
+</p></dd></dl>
+
+<p>Then the float is formatted with the following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $text <b>float</b><i> $float_text \%float $caption_text $shortcaption_text</i>
+<a name="IDX259"></a>
+</dt>
+<dd><p><var>$float_text</var> is the text appearing within the <code>@float</code>, formatted.
+<var>\%float</var> is still the structure defined above. <var>$caption_text</var> and
+<var>$shortcaption_text</var> are the caption and short caption build with the
+above function and formatted.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Lists-of-floats"></a>
+<a name="SEC81"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC80" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC82" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC79" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 7.17.2 Formatting lists of floats </h3>
+
+<p>A list of floats is introduced by <code>@listoffloats</code>. The argument of
+<code>@listoffloats</code> is the <em>style</em>. First the style texinfo can be
+modified with the following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $style_texi_returned <b>listoffloats_style</b><i> $style_texi</i>
+<a name="IDX260"></a>
+</dt>
+<dd><p><var>$style_texi</var> is the <code>@listoffloats</code> argument with texinfo
+@-commands kept. It is possible to make changes to the <var>$style_texi</var> and
+return a modified string, still with @-commands. The modified string
+is formatted in the main program.
+</p></dd></dl>
+
+<p>After that, for each of the floats with that style, first there is a
+possibility to modify the float style and the float caption before they
+are formatted in the main program, with the following function references:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $float_style_texi_returned <b>listoffloats_float_style</b><i> $style_texi \%float</i>
+<a name="IDX261"></a>
+</dt>
+<dd><p><var>$style_texi</var> is the style, and <var>\%float</var> is the structure described
+above. This function reference returns a style to be formatted in the
+main program.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function Reference:</u> $caption_texi_returned <b>listoffloats_caption</b><i> \%float</i>
+<a name="IDX262"></a>
+</dt>
+<dd><p><var>\%float</var> is the structure described
+above. This function reference returns a caption to be formatted in the
+main program.
+</p></dd></dl>
+
+<p>Each entry is formatted by:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $listoffloats_entry <b>listoffloats_entry</b><i> $style_texi \%float $float_style $caption $href</i>
+<a name="IDX263"></a>
+</dt>
+<dd><p><var>$style_texi</var> is the style with @-commands, <var>$float_style</var> is the
+style returned by the above function and formatted. <var>$caption</var> is the
+caption returned by the above function formatted. <var>\%float</var> is the
+structure corresponding with the float, and <var>$href</var> is an href pointing to
+the float location.
+</p></dd></dl>
+
+<p>Lastly, the whole <code>@listoffloats</code> is formatted by:
+</p>
+<dl>
+<dt><u>Function Reference:</u> $listoffloats <b>listoffloats</b><i> $style_texi $style \@listoffloats_entries</i>
+<a name="IDX264"></a>
+</dt>
+<dd><p><var>$style_texi</var> is the style with @-commands, <var>$style</var> is the
+style returned by the above function and formatted. The array reference
+<var>\@listoffloats_entries</var> holds the entries formatted by the above
+function.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Footnotes"></a>
+<a name="SEC82"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC81" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC83" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.18 Customizing the footnotes formatting </h2>
+
+<p>Each footnote is associated with a footnote entry. Several footnote entries
+are grouped in a footnote section. When a footnote appears, two things must
+be formatted: in the main text the place where the footnote appear
+and the footnote text.
+</p>
+<p>Two functions, with corresponding function references control the formatting
+of the footnotes:
+</p>
+<dl>
+<dt><u>Function Reference:</u> (\@lines $text_for_document) <b>foot_line_and_ref</b><i> $number_in_doc $number_in_page $footnote_id $place_id $document_file $footnote_file \@lines \%state</i>
+<a name="IDX265"></a>
+</dt>
+<dd><p><var>$number_in_doc</var> is the footnote number in the whole document,
+<var>$number_in_page</var> is the footnote number in the current page.
+<var>$footnote_id</var> is an identifier for the footnote in the footnote text
+which should be used to make target for references to that footnote,
+while <var>$place_id</var> is an identifier for the location of the footnote
+in the main document. Similarly, <var>$document_file</var> is the file name
+of the file containing the text where the footnote appears in the main
+document, while <var>$footnote_file</var> is the file name of the file where
+the footnote text appears.
+</p>
+<p><var>\@lines</var> is a reference on an array containing the footnote text
+lines, allready formatted.
+And <var>\%state</var> holds informations about the context at the footnote
+place in the main document. As usual the most usefull entry is
+<code>preformatted</code> which is true if the footnote appears in a preformatted
+context.
+</p>
+<p>This function returns a reference on an array, <var>\@lines</var> containing
+the updated footnote text for the footnote entry, and <var>$text_for_document</var>,
+the text appearing at the footnote place in the main document, linking
+to the footnote entry.
+</p></dd></dl>
+
+<p>The following function is only used when footnotes are at the bottom
+of a page and the document is split.
+For customization of the footnotes page in case they are on a separated
+page or section, <a href="#SEC44">Customizing the layout of the special pages</a>. For
+the determination of the footnote locations, <a href="#SEC10">Page layout related command line options</a>.
+</p>
+<dl>
+<dt><u>Function Reference:</u> <b>foot_section</b><i> \@footnotes_lines</i>
+<a name="IDX266"></a>
+</dt>
+<dd><p>This function formats a group of footnotes. <var>\@footnotes_lines</var> is a
+reference on an array holding the lines of all the footnote entries
+formatted as explained above. This function modifies the reference.
+</p></dd></dl>
+
+
+<hr size="6">
+<a name="Other-and-unknown-commands"></a>
+<a name="SEC83"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC82" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 7.19 Customizing other commands, and unknown commands </h2>
+
+
+
+<p>Many commands without braces are available in texinfo, sometimes with
+a specific syntax. For example we have <code>@sp</code>, <code>@noindent</code>,
+<code>@documentlanguage</code>, <code>@oddheading</code>, <code>@headings</code>,
+<code>@shortcontents</code>, <code>@shorttitlepage</code> or <code>@comment</code>.
+<code>texi2html</code> interprets
+some of these commands and some functions or variables are used for
+their formatting or to access their information.
+In the default case, however, most of these constructs are ignored.
+</p>
+<p>It is possible to change how the things following these commands
+on the line are handled, what is considered to be an arg for those
+commands and it is also possible to keep them instead of discarding
+them such that it is possible to handle them specially, with the
+same function than the one used for unknown commands.
+</p>
+<p>Those special commands without braces are the key of a hash:
+<a name="IDX267"></a>
+<code>%misc_command</code>. The associated value is a reference on a
+hash enabling to set the properties of these commands. The
+keys of this hash reference is the name of a property, the value
+is the value of the property. For example here we have <code>line</code>
+for the <code>arg</code> property for the <code>command</code> @-command.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">$misc_command{'command'} = {'arg' =&gt; 'line', 'skip' =&gt; 'space'};
+</pre></td></tr></table>
+<p>The properties and possible values are:
+</p>
+<dl compact="compact">
+<dt> <code>skip</code></dt>
+<dd><p>This property enables to set what is skipped after the command arguments.
+Here are the possible values:
+</p><dl compact="compact">
+<dt> <code>line</code></dt>
+<dd><p>The remaining of the line is skipped.
+</p></dd>
+<dt> <code>space</code> </dt>
+<dd><p>Spaces are skipped but not newline.
+</p></dd>
+<dt> <code>whitespace</code> </dt>
+<dd><p>Spaces are skipped
+</p></dd>
+<dt> <code>linewhitespace</code></dt>
+<dd><p>Spaces are skipped if there are only spaces remaining on the line.
+</p></dd>
+<dt> <code>linespace</code></dt>
+<dd><p>Spaces are skipped, but not newline if
+there are only spaces remaining on the line
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>arg</code></dt>
+<dd><p>If the associated value is <code>line</code> the line is considered to be the
+argument. If it is a number it is the number of args (separated by spaces).
+</p></dd>
+<dt> <code>texi</code></dt>
+<dd><p>If true the arguments are considered to real texinfo, therefore
+ <code>@value</code> and <code>@macro</code> are expanded.
+</p></dd>
+<dt> <code>keep</code></dt>
+<dd><p>If true the args and the macro are kept, otherwise they are discarded.
+The defaut is to have <code>keep</code> undef for all the commands.
+If <code>keep</code> is true for <code>@verbatiminclude</code> the default
+action for this macro isn't done.
+</p></dd>
+</dl>
+
+
+<p>Commands which don't appear in the hashes
+<a name="IDX268"></a>
+<code>%simple_map</code>, <a name="IDX269"></a>
+<code>%simple_map_pre</code>,
+<a name="IDX270"></a>
+<code>%simple_map_texi</code> and <code>%misc_command</code>, or that appear in
+<code>%misc_command</code> but with <code>keep</code> true are processed by the
+following function reference:
+</p>
+<dl>
+<dt><u>Function Reference:</u> ($result_line, $result, $result_text, $message) <b>unknown</b><i> $command $line</i>
+<a name="IDX271"></a>
+</dt>
+<dd><p><var>$command</var> is the @-command, <var>$line</var> is the line following the
+<var>$command</var>. <var>$result</var> is a boolean. If it is true then the other return
+values are taken into account otherwise the default actions are
+used. In case <var>$result</var> is true, <var>$result_line</var> is the new line
+to be processed further, <var>$result_text</var> is the resulting formatted text
+and <var>$message</var>, if defined is a message outputted to the output
+with line number added by <code>texi2html</code>.
+</p></dd></dl>
+
+<p>Commands with braces not specified above
+nor in <a name="IDX272"></a>
+<code>%style_map</code>, <a name="IDX273"></a>
+<code>%style_map_pre</code> and
+<a name="IDX274"></a>
+<code>%style_map_texi</code> are processed
+by the following function reference
+</p>
+<dl>
+<dt><u>Function Reference:</u> ($result, $result_text, $message) <b>unknown_style</b><i> $command $text</i>
+<a name="IDX275"></a>
+</dt>
+<dd><p><var>$command</var> is the @-command, <var>$text</var> is the text appearing within
+the braces (allready formatted). <var>$result</var> is a boolean. If it is true then
+the other return
+values are taken into account otherwise the default actions are
+used. In case <var>$result</var> is true, <var>$result_text</var> is the resulting
+formatted text
+and <var>$message</var>, if defined is a message outputted to the output
+with line number added by <code>texi2html</code>.
+</p></dd></dl>
+
+
+
+<hr size="6">
+<a name="Internationalization"></a>
+<a name="SEC84"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC83" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC85" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC47" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="appendix"> A. Internationalization </h1>
+
+<p>The strings written in the document are selected based on the
+document language. This can be used to customize the strings,
+as described in <a href="#SEC56">Customizing strings written by <code>texi2html</code></a>. This also enables translation of the
+strings.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC85">A.1 Translating strings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC86">A.2 Adding new strings written to document</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Translating-strings"></a>
+<a name="SEC85"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC84" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC86" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="appendixsec"> A.1 Translating strings </h2>
+
+
+<p>If the language is allready supported, then there will be a file
+in the <tt>`i18n'</tt> directory with name the two-letter
+ISO-639 language code. In that case you can enhance the translations by
+editing this file. There is a <code>$LANGUAGES-&gt;{'<var>language</var>'}</code>
+hash in that file. The keys are the english strings, in <code>''</code>, the
+values (in <code>''</code> after <code>=&gt;</code>) are the translations.
+When a string contains a <samp>`%'</samp> followed by <samp>`{'</samp> <var>name</var> <samp>`}'</samp>
+it means that the string will be expanded by <code>texi2html</code>. For
+an example, see <a href="#SEC56">Customizing strings written by <code>texi2html</code></a>.
+</p>
+<p>After that you should run the command <code>./manage_i18n.pl all</code> in
+the top directory, it should merge your file with the existing files in
+<tt>`translations.pl'</tt>, which is incorporated to the <tt>`texi2html'</tt> script
+by <code>./configure</code>.
+</p>
+<p>If the language isn't currently supported, copy the <tt>`en'</tt> file in
+<tt>`i18n'</tt> to a file with name the two-letter ISO-639
+language code of your language
+ and then add your translations to the strings. You could also add your
+two-letter language code in the <tt>`manage_i18n.pl'</tt> file in the
+<code>@known_languages</code> array.
+</p>
+<p>After that you should similarly run the command
+<code>./manage_i18n.pl all</code> in
+the top directory.
+</p>
+<p>Obsoleted strings are not removed from the files, they are still present
+in the <code>$T2H_OBSOLETE_STRINGS-&gt;{'<var>language</var>'}</code> hash in case
+the string is reused later.
+</p>
+<p>If you made change to strings specified in installed files
+(see section <a href="#SEC4">Installation of <code>texi2html</code></a>)
+you will have to reinstall them otherwise the installated files will
+take precedence (see section <a href="#SEC13">Use initialization files for fine tuning</a>).
+</p>
+<hr size="6">
+<a name="Adding-new-strings"></a>
+<a name="SEC86"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC85" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="appendixsec"> A.2 Adding new strings written to document </h2>
+
+
+<p>If you need to write strings, for example the new string <var>a string</var>
+to the resulting document, call <code>&amp;$I('a string')</code>. Use simple quotes.
+If you want to substitute a value in the string put
+<code>%{<var>string_value</var>}</code>, in the string, and give a second argument
+to <code>&amp;$I</code>, a hash reference with key <var>string_value</var> and value
+the what you want to substitute.
+Here is an example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">return &amp;$I('%{name} of %{class}', { 'name' =&gt; $name, 'class' =&gt; $class });
+</pre></td></tr></table>
+<p>In that case <code>%{name}</code> is substituted by <code>$name</code> in the translated
+string.
+</p>
+<p>After that you should run the command <code>./manage_i18n.pl all</code> in the top
+directory, it should add your new strings to all the files in the <tt>`i18n'</tt>
+directory.
+</p>
+<hr size="6">
+<a name="Indexop"></a>
+<a name="SEC87"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC86" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC88" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC84" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC88" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="appendix"> B. Command Line Option Index </h1>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC87_0" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="#SEC87_1" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="#SEC87_2" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="#SEC87_3" class="summary-letter"><b>H</b></a>
+ &nbsp;
+<a href="#SEC87_4" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="#SEC87_5" class="summary-letter"><b>L</b></a>
+ &nbsp;
+<a href="#SEC87_6" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="#SEC87_7" class="summary-letter"><b>N</b></a>
+ &nbsp;
+<a href="#SEC87_8" class="summary-letter"><b>O</b></a>
+ &nbsp;
+<a href="#SEC87_9" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="#SEC87_10" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="#SEC87_11" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="#SEC87_12" class="summary-letter"><b>U</b></a>
+ &nbsp;
+</td></tr></table>
+<table border="0" class="index-op">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_0">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX49">css-include=<var>file</var></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_1">D</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX53">def-table</a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX42">doctype=<var>DTD</var></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX30">D<var>var</var></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_2">F</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX36">frames</a></td><td valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX44">frameset-doctype</a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX43">frameset-doctype=<var>DTD</var></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_3">H</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX51">html-xref-prefix=<var>path</var></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_4">I</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX34">I<var>dir</var></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX23">if&lt;region&gt;</a></td><td valign="top"><a href="#SEC8">4.3 Specifying which regions get expanded</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX121">include-css</a></td><td valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX69">init-file</a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX70">init-file</a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX47">iso</a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_5">L</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX61">l2h</a></td><td valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX66">l2h-file</a></td><td valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX62">l2h-l2h=<var>program</var></a></td><td valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX64">l2h-tmp</a></td><td valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX72">lang</a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX206">lang</a></td><td valign="top"><a href="#SEC56">7.6 Customizing strings written by <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX28">lang=<var>lang</var></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_6">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX3">menu</a></td><td valign="top"><a href="#SEC5">4. Invoking <code>texi2html</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_7">N</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX24">no-if&lt;region&gt;</a></td><td valign="top"><a href="#SEC8">4.3 Specifying which regions get expanded</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX21">node-files</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX2">nomenu</a></td><td valign="top"><a href="#SEC5">4. Invoking <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX26">nomenu</a></td><td valign="top"><a href="#SEC8">4.3 Specifying which regions get expanded</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX38">nosec-nav</a></td><td valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX57">number</a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_8">O</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX10">output</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX12">output</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_9">P</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX32">P<var>dir</var></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX1">pkgdatadir=<var>dir</var></a></td><td valign="top"><a href="#SEC4">3. Installation of <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX67">pkgdatadir=dir</a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX13">prefix</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_10">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX40">separated-footnotes</a></td><td valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX15">short-ext</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX55">short-ref</a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX4">split</a></td><td valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX68">sysconfdir=dir</a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_11">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX19">toc-file</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX59">toc-links</a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX17">top-file</a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC87_12">U</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX6">use-nodes</a></td><td valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX8">use-nodes</a></td><td valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX9">use-nodes</a></td><td valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX31">U<var>var</var></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC87_0" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="#SEC87_1" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="#SEC87_2" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="#SEC87_3" class="summary-letter"><b>H</b></a>
+ &nbsp;
+<a href="#SEC87_4" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="#SEC87_5" class="summary-letter"><b>L</b></a>
+ &nbsp;
+<a href="#SEC87_6" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="#SEC87_7" class="summary-letter"><b>N</b></a>
+ &nbsp;
+<a href="#SEC87_8" class="summary-letter"><b>O</b></a>
+ &nbsp;
+<a href="#SEC87_9" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="#SEC87_10" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="#SEC87_11" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="#SEC87_12" class="summary-letter"><b>U</b></a>
+ &nbsp;
+</td></tr></table>
+<hr size="6">
+<a name="Indexvr"></a>
+<a name="SEC88"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC87" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC89" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC89" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="appendix"> C. Variable Index </h1>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC88_0" class="summary-letter"><b>$</b></a>
+ &nbsp;
+<a href="#SEC88_1" class="summary-letter"><b>%</b></a>
+ &nbsp;
+<a href="#SEC88_2" class="summary-letter"><b>@</b></a>
+</td></tr></table>
+<table border="0" class="index-vr">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC88_0">$</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX123"><code>$AFTER_BODY_OPEN</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX153"><code>$AFTER_OVERVIEW</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX155"><code>$AFTER_TOC_LINES</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX73"><code>$anchor</code></a></td><td valign="top"><a href="#SEC15">5.1 Redefining functions in initialization files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX198"><code>$anchor</code></a></td><td valign="top"><a href="#SEC54">7.4 Formatting of special simple commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX242"><code>$AVOID_MENU_REDUNDANCY</code></a></td><td valign="top"><a href="#SEC75">7.15.2 The formatting of the different menu components</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX152"><code>$BEFORE_OVERVIEW</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX154"><code>$BEFORE_TOC_LINES</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX78"><code>$BIG_RULE</code></a></td><td valign="top"><a href="#SEC19">6.2 Page layout and navigation panel overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX111"><code>$BODYTEXT</code></a></td><td valign="top"><a href="#SEC32">6.5 Preparing the output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX127"><code>$BODYTEXT</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX225"><code>$cell</code></a></td><td valign="top"><a href="#SEC66">7.11.1 Formatting individual table and list items</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX194"><code>$CLOSE_QUOTE_SYMBOL</code></a></td><td valign="top"><a href="#SEC51">7.3.1 An interface for commands formatting with a hash reference</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX196"><code>$CLOSE_QUOTE_SYMBOL</code></a></td><td valign="top"><a href="#SEC52">7.3.2 An interface for commands formatting with a string</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX217"><code>$complex_format_map</code></a></td><td valign="top"><a href="#SEC64">7.10 Formatting of complex formats (<code>@example</code>, <code>@display</code>&hellip;)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX116"><code>$CSS_LINES</code></a></td><td valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX118"><code>$CSS_LINES</code></a></td><td valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX120"><code>$CSS_LINES</code></a></td><td valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX54"><code>$DEF_TABLE</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX76"><code>$DEFAULT_RULE</code></a></td><td valign="top"><a href="#SEC19">6.2 Page layout and navigation panel overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX233"><code>$definition_category</code></a></td><td valign="top"><a href="#SEC70">7.12.2 Customization of the definition formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX150"><code>$DO_CONTENTS</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX151"><code>$DO_SCONTENTS</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX45"><code>$DOCTYPE</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX126"><code>$DOCUMENT_DESCRIPTION</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX124"><code>$DOCUMENT_ENCODING</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX125"><code>$ENCODING</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX175"><code>$EXTENSION</code></a></td><td valign="top"><a href="#SEC45">6.12 Customizing the file names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX52"><code>$EXTERNAL_DIR</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX122"><code>$EXTRA_HEAD</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX37"><code>$FRAMES</code></a></td><td valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX46"><code>$FRAMESET_DOCTYPE</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX82"><code>$ICONS</code></a></td><td valign="top"><a href="#SEC22">6.3.1 Controlling the navigation panel panel at a high level</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX179"><code>$IDX_SUMMARY</code></a></td><td valign="top"><a href="#SEC46">6.13 Generation of external files for index entries</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX80"><code>$INDEX_CHAPTER</code></a></td><td valign="top"><a href="#SEC20">Element labels</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX63"><code>$L2H_L2H</code></a></td><td valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX65"><code>$L2H_TMP</code></a></td><td valign="top"><a href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX29"><code>$LANG</code></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX71"><code>$LANG</code></a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX207"><code>$LANG</code></a></td><td valign="top"><a href="#SEC56">7.6 Customizing strings written by <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX208"><code>$LANGUAGES</code></a></td><td valign="top"><a href="#SEC56">7.6 Customizing strings written by <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC85"><code>$LANGUAGES</code></a></td><td valign="top"><a href="#SEC85">A.1 Translating strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX245"><code>$MENU_PRE_STYLE</code></a></td><td valign="top"><a href="#SEC75">7.15.2 The formatting of the different menu components</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX243"><code>$MENU_SYMBOL</code></a></td><td valign="top"><a href="#SEC75">7.15.2 The formatting of the different menu components</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX77"><code>$MIDDLE_RULE</code></a></td><td valign="top"><a href="#SEC19">6.2 Page layout and navigation panel overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX22"><code>$NODE_FILES</code></a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX176"><code>$NODE_FILES</code></a></td><td valign="top"><a href="#SEC45">6.12 Customizing the file names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX241"><code>$NODE_NAME_IN_MENU</code></a></td><td valign="top"><a href="#SEC75">7.15.2 The formatting of the different menu components</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX58"><code>$NUMBER_SECTIONS</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX193"><code>$OPEN_QUOTE_SYMBOL</code></a></td><td valign="top"><a href="#SEC51">7.3.1 An interface for commands formatting with a hash reference</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX195"><code>$OPEN_QUOTE_SYMBOL</code></a></td><td valign="top"><a href="#SEC52">7.3.2 An interface for commands formatting with a string</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX11"><code>$OUT</code></a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX138"><code>$PRE_BODY_CLOSE</code></a></td><td valign="top"><a href="#SEC37">6.10 Customizing the page footer</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX14"><code>$PREFIX</code></a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX141"><code>$print_chapter_footer</code></a></td><td valign="top"><a href="#SEC37">6.10 Customizing the page footer</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX131"><code>$print_chapter_header</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX139"><code>$print_foot_navigation</code></a></td><td valign="top"><a href="#SEC37">6.10 Customizing the page footer</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX128"><code>$print_head_navigation</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX172"><code>$print_misc</code></a></td><td valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX174"><code>$print_misc_footer</code></a></td><td valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX173"><code>$print_misc_header</code></a></td><td valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX143"><code>$print_page_foot</code></a></td><td valign="top"><a href="#SEC37">6.10 Customizing the page footer</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX130"><code>$print_page_head</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX142"><code>$print_section_footer</code></a></td><td valign="top"><a href="#SEC37">6.10 Customizing the page footer</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX132"><code>$print_section_header</code></a></td><td valign="top"><a href="#SEC35">6.8 Customizing the page header</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX169"><code>$print_Top</code></a></td><td valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX171"><code>$print_Top_footer</code></a></td><td valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX170"><code>$print_Top_header</code></a></td><td valign="top"><a href="#SEC44">6.11.2 Customizing the layout of the special pages</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX39"><code>$SECTION_NAVIGATION</code></a></td><td valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX83"><code>$SECTION_NAVIGATION</code></a></td><td valign="top"><a href="#SEC22">6.3.1 Controlling the navigation panel panel at a high level</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX41"><code>$SEPARATED_FOOTNOTES</code></a></td><td valign="top"><a href="#SEC10">4.5 Page layout related command line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX56"><code>$SHORT_REF</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX16"><code>$SHORTEXTN</code></a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX27"><code>$SHOW_MENU</code></a></td><td valign="top"><a href="#SEC8">4.3 Specifying which regions get expanded</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX75"><code>$SMALL_RULE</code></a></td><td valign="top"><a href="#SEC19">6.2 Page layout and navigation panel overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX5"><code>$SPLIT</code></a></td><td valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX252"><code>$SPLIT_INDEX</code></a></td><td valign="top"><a href="#SEC78">7.16.2 Customizing the formatting of index lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC85"><code>$T2H_OBSOLETE_STRINGS</code></a></td><td valign="top"><a href="#SEC85">A.1 Translating strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX91"><code>$Texi2HTML::NODE{Next}</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX105"><code>$Texi2HTML::OVERVIEW</code></a></td><td valign="top"><a href="#SEC30">Section lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX160"><code>$Texi2HTML::OVERVIEW</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX104"><code>$Texi2HTML::THIS_HEADER</code></a></td><td valign="top"><a href="#SEC30">Section lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX103"><code>$Texi2HTML::THIS_SECTION</code></a></td><td valign="top"><a href="#SEC30">Section lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX108"><code>$Texi2HTML::THIS_SECTION</code></a></td><td valign="top"><a href="#SEC31">6.4.3 Function usefull in page formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX106"><code>$Texi2HTML::TOC_LINES</code></a></td><td valign="top"><a href="#SEC30">Section lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX159"><code>$Texi2HTML::TOC_LINES</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX20"><code>$TOC_FILE</code></a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX60"><code>$TOC_LINKS</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX157"><code>$TOC_LIST_ATTRIBUTE</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX156"><code>$TOC_LIST_STYLE</code></a></td><td valign="top"><a href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX18"><code>$TOP_FILE</code></a></td><td valign="top"><a href="#SEC7">4.2 Setting output file and directory names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX79"><code>$TOP_HEADING</code></a></td><td valign="top"><a href="#SEC20">Element labels</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX244"><code>$UNNUMBERED_SYMBOL_IN_MENU</code></a></td><td valign="top"><a href="#SEC75">7.15.2 The formatting of the different menu components</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX48"><code>$USE_ISO</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX7"><code>$USE_NODES</code></a></td><td valign="top"><a href="#SEC6">4.1 Specifying where to split the generated document</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX81"><code>$VERTICAL_HEAD_NAVIGATION</code></a></td><td valign="top"><a href="#SEC22">6.3.1 Controlling the navigation panel panel at a high level</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX87"><code>$WORDS_IN_PAGE</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX88"><code>$WORDS_IN_PAGE</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX109"><code>$WORDS_IN_PAGE</code></a></td><td valign="top"><a href="#SEC31">6.4.3 Function usefull in page formatting</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC88_1">%</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX192"><code>%accent_map</code></a></td><td valign="top"><a href="#SEC50">7.3 Customizing accent, style and other simple commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX93"><code>%ACTIVE_ICONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX113"><code>%BUTTONS_GOTO</code></a></td><td valign="top"><a href="#SEC32">6.5 Preparing the output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX115"><code>%css_map</code></a></td><td valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX117"><code>%css_map</code></a></td><td valign="top"><a href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX230"><code>%def_map</code></a></td><td valign="top"><a href="#SEC69">7.12.1 Customizing the interpretation of a definition line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX216"><code>%format_in_paragraph</code></a></td><td valign="top"><a href="#SEC63">7.9.2 Avoiding paragraphs in formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX226"><code>%format_map</code></a></td><td valign="top"><a href="#SEC67">7.11.2 Formatting of a whole table or list</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX228"><code>%format_map</code></a></td><td valign="top"><a href="#SEC67">7.11.2 Formatting of a whole table or list</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX101"><code>%main::value</code></a></td><td valign="top"><a href="#SEC29">Flags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX102"><code>%main::value</code></a></td><td valign="top"><a href="#SEC29">Flags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX267"><code>%misc_command</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX92"><code>%NAVIGATION_TEXT</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX112"><code>%NAVIGATION_TEXT</code></a></td><td valign="top"><a href="#SEC32">6.5 Preparing the output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX212"><code>%paragraph_style</code></a></td><td valign="top"><a href="#SEC60">7.8 Commands used for centering and flushing of text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX94"><code>%PASSIVE_ICONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX187"><code>%pre_map</code></a></td><td valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX183"><code>%simple_map</code></a></td><td valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX268"><code>%simple_map</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX184"><code>%simple_map_pre</code></a></td><td valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX269"><code>%simple_map_pre</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX185"><code>%simple_map_texi</code></a></td><td valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX270"><code>%simple_map_texi</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX219"><code>%special_list_commands</code></a></td><td valign="top"><a href="#SEC66">7.11.1 Formatting individual table and list items</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX189"><code>%style_map</code></a></td><td valign="top"><a href="#SEC50">7.3 Customizing accent, style and other simple commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX272"><code>%style_map</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX190"><code>%style_map_pre</code></a></td><td valign="top"><a href="#SEC50">7.3 Customizing accent, style and other simple commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX273"><code>%style_map_pre</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX191"><code>%style_map_texi</code></a></td><td valign="top"><a href="#SEC50">7.3 Customizing accent, style and other simple commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX274"><code>%style_map_texi</code></a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX97"><code>%Texi2HTML::HREF</code></a></td><td valign="top"><a href="#SEC26">6.4.1 Accessing elements informations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX96"><code>%Texi2HTML::NAME</code></a></td><td valign="top"><a href="#SEC26">6.4.1 Accessing elements informations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX99"><code>%Texi2HTML::NO_TEXI</code></a></td><td valign="top"><a href="#SEC26">6.4.1 Accessing elements informations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX98"><code>%Texi2HTML::NODE</code></a></td><td valign="top"><a href="#SEC26">6.4.1 Accessing elements informations</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX100"><code>%Texi2HTML::THISDOC</code></a></td><td valign="top"><a href="#SEC28">Global strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX188"><code>%texi_map</code></a></td><td valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX186"><code>%things_map</code></a></td><td valign="top"><a href="#SEC49">7.2 Customizing the formatting of commands without argument</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC88_2">@</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX89"><code>@CHAPTER_BUTTONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX50"><code>@CSS_FILES</code></a></td><td valign="top"><a href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX25"><code>@EXPAND</code></a></td><td valign="top"><a href="#SEC8">4.3 Specifying which regions get expanded</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX35"><code>@INCLUDE_DIRS</code></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX90"><code>@MISC_BUTTONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX86"><code>@NODE_FOOTER_BUTTONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX33"><code>@PREPEND_DIRS</code></a></td><td valign="top"><a href="#SEC9">4.4 Command line options related to Texinfo language features</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX84"><code>@SECTION_BUTTONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#IDX85"><code>@SECTION_FOOTER_BUTTONS</code></a></td><td valign="top"><a href="#SEC23">6.3.2 Specifying the buttons formatting</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC88_0" class="summary-letter"><b>$</b></a>
+ &nbsp;
+<a href="#SEC88_1" class="summary-letter"><b>%</b></a>
+ &nbsp;
+<a href="#SEC88_2" class="summary-letter"><b>@</b></a>
+</td></tr></table>
+<hr size="6">
+<a name="Indexcp"></a>
+<a name="SEC89"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC88" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[ &gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC88" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="appendix"> D. Concept Index </h1>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC89_0" class="summary-letter"><b>A</b></a>
+ &nbsp;
+<a href="#SEC89_1" class="summary-letter"><b>B</b></a>
+ &nbsp;
+<a href="#SEC89_2" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="#SEC89_3" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="#SEC89_4" class="summary-letter"><b>E</b></a>
+ &nbsp;
+<a href="#SEC89_5" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="#SEC89_6" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="#SEC89_7" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="#SEC89_8" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="#SEC89_9" class="summary-letter"><b>R</b></a>
+ &nbsp;
+<a href="#SEC89_10" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="#SEC89_11" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="#SEC89_12" class="summary-letter"><b>U</b></a>
+ &nbsp;
+</td></tr></table>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_0">A</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC63">Avoid paragraph opening</a></td><td valign="top"><a href="#SEC63">7.9.2 Avoiding paragraphs in formats</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_1">B</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC_Top">bug report</a></td><td valign="top"><a href="#SEC_Top">Texi2HTML</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_2">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC60">centering</a></td><td valign="top"><a href="#SEC60">7.8 Commands used for centering and flushing of text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC64">complex format</a></td><td valign="top"><a href="#SEC64">7.10 Formatting of complex formats (<code>@example</code>, <code>@display</code>&hellip;)</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC13"><tt>`Config'</tt></a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC4">configure</a></td><td valign="top"><a href="#SEC4">3. Installation of <code>texi2html</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_3">D</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC3">downloading <code>texi2html</code> source</a></td><td valign="top"><a href="#SEC3">2. Obtaining <code>texi2html</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_4">E</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC1">examples of manuals</a></td><td valign="top"><a href="#SEC1">1. Overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC58">external manual</a></td><td valign="top"><a href="#SEC58">7.7.1 Reference to external manual</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_5">F</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC60">flushing text</a></td><td valign="top"><a href="#SEC60">7.8 Commands used for centering and flushing of text</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_6">I</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC56">i18n</a></td><td valign="top"><a href="#SEC56">7.6 Customizing strings written by <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC85">i18n</a></td><td valign="top"><a href="#SEC85">A.1 Translating strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC4">Installation</a></td><td valign="top"><a href="#SEC4">3. Installation of <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC13">internationalization</a></td><td valign="top"><a href="#SEC13">4.8 Use initialization files for fine tuning</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC86">internationalized strings</a></td><td valign="top"><a href="#SEC86">A.2 Adding new strings written to document</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_7">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC2">makeinfo</a></td><td valign="top"><a href="#SEC2">1.1 Why <code>texi2html</code> and not <code>makeinfo</code>?</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC86"><code>manage_i18n.pl</code></a></td><td valign="top"><a href="#SEC86">A.2 Adding new strings written to document</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_8">P</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC62">paragraph</a></td><td valign="top"><a href="#SEC62">7.9.1 Paragraph and preformatted region formatting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC62">preformatted region</a></td><td valign="top"><a href="#SEC62">7.9.1 Paragraph and preformatted region formatting</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_9">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC57">reference</a></td><td valign="top"><a href="#SEC57">7.7 References</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_10">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC83">skipped command</a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC3">source code for <code>texi2html</code>, downloading</a></td><td valign="top"><a href="#SEC3">2. Obtaining <code>texi2html</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_11">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC3"><code>texi2html</code> source, downloading</a></td><td valign="top"><a href="#SEC3">2. Obtaining <code>texi2html</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC1">Texinfo</a></td><td valign="top"><a href="#SEC1">1. Overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC60">text alignement</a></td><td valign="top"><a href="#SEC60">7.8 Commands used for centering and flushing of text</a></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC85">Translation</a></td><td valign="top"><a href="#SEC85">A.1 Translating strings</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC89_12">U</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#SEC83">unknown command</a></td><td valign="top"><a href="#SEC83">7.19 Customizing other commands, and unknown commands</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC89_0" class="summary-letter"><b>A</b></a>
+ &nbsp;
+<a href="#SEC89_1" class="summary-letter"><b>B</b></a>
+ &nbsp;
+<a href="#SEC89_2" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="#SEC89_3" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="#SEC89_4" class="summary-letter"><b>E</b></a>
+ &nbsp;
+<a href="#SEC89_5" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="#SEC89_6" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="#SEC89_7" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="#SEC89_8" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="#SEC89_9" class="summary-letter"><b>R</b></a>
+ &nbsp;
+<a href="#SEC89_10" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="#SEC89_11" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="#SEC89_12" class="summary-letter"><b>U</b></a>
+ &nbsp;
+</td></tr></table>
+<hr size="6">
+<a name="SEC_Contents"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Table of Contents</h1>
+<div class="contents">
+
+<ul class="toc">
+ <li><a name="TOC1" href="#SEC1">1. Overview</a>
+ <ul class="toc">
+ <li><a name="TOC2" href="#SEC2">1.1 Why <code>texi2html</code> and not <code>makeinfo</code>?</a></li>
+ </ul></li>
+ <li><a name="TOC3" href="#SEC3">2. Obtaining <code>texi2html</code></a></li>
+ <li><a name="TOC4" href="#SEC4">3. Installation of <code>texi2html</code></a></li>
+ <li><a name="TOC5" href="#SEC5">4. Invoking <code>texi2html</code></a>
+ <ul class="toc">
+ <li><a name="TOC6" href="#SEC6">4.1 Specifying where to split the generated document</a></li>
+ <li><a name="TOC7" href="#SEC7">4.2 Setting output file and directory names</a></li>
+ <li><a name="TOC8" href="#SEC8">4.3 Specifying which regions get expanded</a></li>
+ <li><a name="TOC9" href="#SEC9">4.4 Command line options related to Texinfo language features</a></li>
+ <li><a name="TOC10" href="#SEC10">4.5 Page layout related command line options</a></li>
+ <li><a name="TOC11" href="#SEC11">4.6 Customizing the <acronym>HTML</acronym> and text style</a></li>
+ <li><a name="TOC12" href="#SEC12">4.7 Expanding <code>@tex</code> and <code>@math</code> regions using LaTeX2HTML</a></li>
+ <li><a name="TOC13" href="#SEC13">4.8 Use initialization files for fine tuning</a></li>
+ </ul></li>
+ <li><a name="TOC14" href="#SEC14">5. Overview of initialization files content and loading</a>
+ <ul class="toc">
+ <li><a name="TOC15" href="#SEC15">5.1 Redefining functions in initialization files</a></li>
+ <li><a name="TOC16" href="#SEC16">5.2 Conventions used for function prototypes</a></li>
+ </ul></li>
+ <li><a name="TOC17" href="#SEC17">6. Fine tuning of the page layout</a>
+ <ul class="toc">
+ <li><a name="TOC18" href="#SEC18">6.1 The different categories of pages and sectioning elements</a></li>
+ <li><a name="TOC19" href="#SEC19">6.2 Page layout and navigation panel overview</a></li>
+ <li><a name="TOC20" href="#SEC21">6.3 Customization of the navigation panels buttons</a>
+ <ul class="toc">
+ <li><a name="TOC21" href="#SEC22">6.3.1 Controlling the navigation panel panel at a high level</a></li>
+ <li><a name="TOC22" href="#SEC23">6.3.2 Specifying the buttons formatting</a></li>
+ <li><a name="TOC23" href="#SEC24">6.3.3 Changing the navigation panel formatting</a></li>
+ </ul></li>
+ <li><a name="TOC24" href="#SEC25">6.4 Main program variables and usefull functions</a>
+ <ul class="toc">
+ <li><a name="TOC25" href="#SEC26">6.4.1 Accessing elements informations</a></li>
+ <li><a name="TOC26" href="#SEC27">6.4.2 Accessing global informations</a></li>
+ <li><a name="TOC27" href="#SEC31">6.4.3 Function usefull in page formatting</a></li>
+ </ul></li>
+ <li><a name="TOC28" href="#SEC32">6.5 Preparing the output</a></li>
+ <li><a name="TOC29" href="#SEC33">6.6 Finalizing the output</a></li>
+ <li><a name="TOC30" href="#SEC34">6.7 Customizing the <code>texi2html</code> css lines</a></li>
+ <li><a name="TOC31" href="#SEC35">6.8 Customizing the page header</a></li>
+ <li><a name="TOC32" href="#SEC36">6.9 Customizing the sections</a></li>
+ <li><a name="TOC33" href="#SEC37">6.10 Customizing the page footer</a></li>
+ <li><a name="TOC34" href="#SEC38">6.11 Special pages formatting</a>
+ <ul class="toc">
+ <li><a name="TOC35" href="#SEC39">6.11.1 Customizing the content of the special pages</a>
+ <ul class="toc">
+ <li><a name="TOC36" href="#SEC40">6.11.1.1 Top element text formatting</a></li>
+ <li><a name="TOC37" href="#SEC41">6.11.1.2 Table of contents and Short table of contents</a></li>
+ <li><a name="TOC38" href="#SEC42">6.11.1.3 Formatting of footnotes text</a></li>
+ <li><a name="TOC39" href="#SEC43">6.11.1.4 Formatting of about text</a></li>
+ </ul></li>
+ <li><a name="TOC40" href="#SEC44">6.11.2 Customizing the layout of the special pages</a></li>
+ </ul></li>
+ <li><a name="TOC41" href="#SEC45">6.12 Customizing the file names</a></li>
+ <li><a name="TOC42" href="#SEC46">6.13 Generation of external files for index entries</a></li>
+ </ul></li>
+ <li><a name="TOC43" href="#SEC47">7. Customizing <acronym>HTML</acronym> and text style in init files</a>
+ <ul class="toc">
+ <li><a name="TOC44" href="#SEC48">7.1 Three contexts for expansions: preformatted, normal and string</a></li>
+ <li><a name="TOC45" href="#SEC49">7.2 Customizing the formatting of commands without argument</a></li>
+ <li><a name="TOC46" href="#SEC50">7.3 Customizing accent, style and other simple commands</a>
+ <ul class="toc">
+ <li><a name="TOC47" href="#SEC51">7.3.1 An interface for commands formatting with a hash reference</a></li>
+ <li><a name="TOC48" href="#SEC52">7.3.2 An interface for commands formatting with a string</a></li>
+ <li><a name="TOC49" href="#SEC53">7.3.3 Defining the style and indicatric commands interface</a></li>
+ </ul></li>
+ <li><a name="TOC50" href="#SEC54">7.4 Formatting of special simple commands</a></li>
+ <li><a name="TOC51" href="#SEC55">7.5 Processing special characters in text</a></li>
+ <li><a name="TOC52" href="#SEC56">7.6 Customizing strings written by <code>texi2html</code></a></li>
+ <li><a name="TOC53" href="#SEC57">7.7 References</a>
+ <ul class="toc">
+ <li><a name="TOC54" href="#SEC58">7.7.1 Reference to external manual</a></li>
+ <li><a name="TOC55" href="#SEC59">7.7.2 Reference to an internal node</a></li>
+ </ul></li>
+ <li><a name="TOC56" href="#SEC60">7.8 Commands used for centering and flushing of text</a></li>
+ <li><a name="TOC57" href="#SEC61">7.9 Formatting or not a paragraph or a preformatted region</a>
+ <ul class="toc">
+ <li><a name="TOC58" href="#SEC62">7.9.1 Paragraph and preformatted region formatting</a></li>
+ <li><a name="TOC59" href="#SEC63">7.9.2 Avoiding paragraphs in formats</a></li>
+ </ul></li>
+ <li><a name="TOC60" href="#SEC64">7.10 Formatting of complex formats (<code>@example</code>, <code>@display</code>&hellip;)</a></li>
+ <li><a name="TOC61" href="#SEC65">7.11 Customizing the formatting of lists and tables</a>
+ <ul class="toc">
+ <li><a name="TOC62" href="#SEC66">7.11.1 Formatting individual table and list items</a></li>
+ <li><a name="TOC63" href="#SEC67">7.11.2 Formatting of a whole table or list</a></li>
+ </ul></li>
+ <li><a name="TOC64" href="#SEC68">7.12 Definition commands formatting</a>
+ <ul class="toc">
+ <li><a name="TOC65" href="#SEC69">7.12.1 Customizing the interpretation of a definition line</a></li>
+ <li><a name="TOC66" href="#SEC70">7.12.2 Customization of the definition formatting</a></li>
+ </ul></li>
+ <li><a name="TOC67" href="#SEC71">7.13 Customizing headings formatting</a></li>
+ <li><a name="TOC68" href="#SEC72">7.14 Formatting of special regions (<code>@verbatim</code>, <code>@cartouche</code>, <code>@quotation</code>)</a></li>
+ <li><a name="TOC69" href="#SEC73">7.15 Menu formatting</a>
+ <ul class="toc">
+ <li><a name="TOC70" href="#SEC74">7.15.1 The structure of a menu</a></li>
+ <li><a name="TOC71" href="#SEC75">7.15.2 The formatting of the different menu components</a></li>
+ </ul></li>
+ <li><a name="TOC72" href="#SEC76">7.16 Indices formatting</a>
+ <ul class="toc">
+ <li><a name="TOC73" href="#SEC77">7.16.1 Formatting of index entries</a></li>
+ <li><a name="TOC74" href="#SEC78">7.16.2 Customizing the formatting of index lists</a></li>
+ </ul></li>
+ <li><a name="TOC75" href="#SEC79">7.17 Floats and lists of floats</a>
+ <ul class="toc">
+ <li><a name="TOC76" href="#SEC80">7.17.1 Formatting a float</a></li>
+ <li><a name="TOC77" href="#SEC81">7.17.2 Formatting lists of floats</a></li>
+ </ul></li>
+ <li><a name="TOC78" href="#SEC82">7.18 Customizing the footnotes formatting</a></li>
+ <li><a name="TOC79" href="#SEC83">7.19 Customizing other commands, and unknown commands</a></li>
+ </ul></li>
+ <li><a name="TOC80" href="#SEC84">A. Internationalization</a>
+ <ul class="toc">
+ <li><a name="TOC81" href="#SEC85">A.1 Translating strings</a></li>
+ <li><a name="TOC82" href="#SEC86">A.2 Adding new strings written to document</a></li>
+ </ul></li>
+ <li><a name="TOC83" href="#SEC87">B. Command Line Option Index</a></li>
+ <li><a name="TOC84" href="#SEC88">C. Variable Index</a></li>
+ <li><a name="TOC85" href="#SEC89">D. Concept Index</a></li>
+</ul>
+</div>
+<hr size="1">
+<a name="SEC_Overview"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Short Table of Contents</h1>
+<div class="shortcontents">
+<ul class="toc">
+<li><a name="TOC1" href="#SEC1">1. Overview</a></li>
+<li><a name="TOC3" href="#SEC3">2. Obtaining <code>texi2html</code></a></li>
+<li><a name="TOC4" href="#SEC4">3. Installation of <code>texi2html</code></a></li>
+<li><a name="TOC5" href="#SEC5">4. Invoking <code>texi2html</code></a></li>
+<li><a name="TOC14" href="#SEC14">5. Overview of initialization files content and loading</a></li>
+<li><a name="TOC17" href="#SEC17">6. Fine tuning of the page layout</a></li>
+<li><a name="TOC43" href="#SEC47">7. Customizing <acronym>HTML</acronym> and text style in init files</a></li>
+<li><a name="TOC80" href="#SEC84">A. Internationalization</a></li>
+<li><a name="TOC83" href="#SEC87">B. Command Line Option Index</a></li>
+<li><a name="TOC84" href="#SEC88">C. Variable Index</a></li>
+<li><a name="TOC85" href="#SEC89">D. Concept Index</a></li>
+</ul>
+</div>
+<hr size="1">
+<a name="SEC_About"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC87" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>About This Document</h1>
+<p>
+ This document was generated by <em>Derek R. Price</em> on <em>February, 3 2005</em> using <a href="http://texi2html.cvshome.org/"><em>texi2html 1.76</em></a>.
+</p>
+<p>
+ The buttons in the navigation panels have the following meaning:
+</p>
+<table border="1">
+ <tr>
+ <th> Button </th>
+ <th> Name </th>
+ <th> Go to </th>
+ <th> From 1.2.3 go to</th>
+ </tr>
+ <tr>
+ <td align="center"> [ &lt; ] </td>
+ <td align="center">Back</td>
+ <td>previous section in reading order</td>
+ <td>1.2.2</td>
+ </tr>
+ <tr>
+ <td align="center"> [ &gt; ] </td>
+ <td align="center">Forward</td>
+ <td>next section in reading order</td>
+ <td>1.2.4</td>
+ </tr>
+ <tr>
+ <td align="center"> [ &lt;&lt; ] </td>
+ <td align="center">FastBack</td>
+ <td>beginning of this chapter or previous chapter</td>
+ <td>1</td>
+ </tr>
+ <tr>
+ <td align="center"> [ Up ] </td>
+ <td align="center">Up</td>
+ <td>up section</td>
+ <td>1.2</td>
+ </tr>
+ <tr>
+ <td align="center"> [ &gt;&gt; ] </td>
+ <td align="center">FastForward</td>
+ <td>next chapter</td>
+ <td>2</td>
+ </tr>
+ <tr>
+ <td align="center"> [Top] </td>
+ <td align="center">Top</td>
+ <td>cover (top) of document</td>
+ <td> &nbsp; </td>
+ </tr>
+ <tr>
+ <td align="center"> [Contents] </td>
+ <td align="center">Contents</td>
+ <td>table of contents</td>
+ <td> &nbsp; </td>
+ </tr>
+ <tr>
+ <td align="center"> [Index] </td>
+ <td align="center">Index</td>
+ <td>index</td>
+ <td> &nbsp; </td>
+ </tr>
+ <tr>
+ <td align="center"> [ ? ] </td>
+ <td align="center">About</td>
+ <td>about (help)</td>
+ <td> &nbsp; </td>
+ </tr>
+</table>
+
+<p>
+ where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:
+</p>
+
+<ul>
+ <li> 1. Section One
+ <ul>
+ <li>1.1 Subsection One-One
+ <ul>
+ <li>...</li>
+ </ul>
+ </li>
+ <li>1.2 Subsection One-Two
+ <ul>
+ <li>1.2.1 Subsubsection One-Two-One</li>
+ <li>1.2.2 Subsubsection One-Two-Two</li>
+ <li>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp;
+ <strong>&lt;== Current Position </strong></li>
+ <li>1.2.4 Subsubsection One-Two-Four</li>
+ </ul>
+ </li>
+ <li>1.3 Subsection One-Three
+ <ul>
+ <li>...</li>
+ </ul>
+ </li>
+ <li>1.4 Subsection One-Four</li>
+ </ul>
+ </li>
+</ul>
+
+<hr size="1">
+<p>
+ <font size="-1">
+ This document was generated by <em>Derek R. Price</em> on <em>February, 3 2005</em> using <a href="http://texi2html.cvshome.org/"><em>texi2html 1.76</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/Build/source/utils/texi2html/doc/texi2html.info b/Build/source/utils/texi2html/doc/texi2html.info
new file mode 100644
index 00000000000..d791b234206
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texi2html.info
@@ -0,0 +1,176 @@
+This is texi2html.info, produced by makeinfo version 4.5 from
+texi2html.texi.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+INFO-DIR-SECTION Texinfo documentation system
+START-INFO-DIR-ENTRY
+* Texi2HTML: (texi2html). Texinfo to HTML Converter.
+END-INFO-DIR-ENTRY
+
+ This file, last updated 1 February 2005, documents the `texi2html'
+script which converts Texinfo (http://www.texinfo.org) into HTML
+(http://w3c.org). This edition is for `texi2html' version 1.76.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+
+Indirect:
+texi2html.info-1: 2995
+texi2html.info-2: 51146
+texi2html.info-3: 101110
+
+Tag Table:
+(Indirect)
+Node: Top2995
+Node: Overview5644
+Node: whytexi2html7433
+Node: Obtaining texi2html9512
+Node: Installation9794
+Node: Invoking texi2html11983
+Node: Splitting output13162
+Node: Output files16491
+Node: Expansion19748
+Node: Texinfo related options20652
+Node: Page layout options21714
+Node: Style options22607
+Node: Expanding TeX regions24932
+Node: Using init files26073
+Node: Initialization files27957
+Node: Redefining functions29903
+Node: Function prototypes30969
+Node: Changing the page layout32044
+Node: The different pages33401
+Node: The page layout35114
+Ref: Element labels36393
+Node: Navigation panel38129
+Node: General purpose variables38787
+Node: Button specifications39555
+Node: Panel formatting function42887
+Node: Program variables43676
+Node: Elements hashes44381
+Node: Global informations44891
+Node: Global functions47411
+Node: Output initialization48152
+Node: Output finalization49609
+Node: css50080
+Node: Customizing header51146
+Node: Customizing section53951
+Node: Customizing footer54948
+Node: Special pages56815
+Node: Special pages content57142
+Node: Top element text57432
+Node: Contents and Overview text58703
+Node: Footnotes text61441
+Node: About text61734
+Node: Special pages layout63238
+Node: File names64428
+Node: External index files66300
+Node: Customizing HTML68420
+Node: Three contexts70141
+Node: Commands without argument70910
+Node: Style and accent commands72327
+Node: Hash reference interface73815
+Ref: Reference hash args74682
+Node: String interface77052
+Node: Define your own interface79028
+Node: Anchors images and spaces80738
+Node: Text83603
+Node: Strings84931
+Node: References86516
+Node: Reference to external manual86715
+Node: Internal reference88708
+Node: Alignement commands89634
+Node: Paragraph and preformatted region90592
+Node: Paragraph and preformatted formatting90920
+Node: Avoiding paragraphs94646
+Node: Complex formats95042
+Node: Lists tables96731
+Node: Table and list items97196
+Node: Whole table list101110
+Node: Definitions102651
+Node: Definition line103126
+Node: Definition formatting104568
+Node: Headings106005
+Node: Special regions106964
+Node: Menus108991
+Node: Menu parts109436
+Node: Menu formatting110869
+Node: Indices113760
+Node: Index entry place114430
+Node: Index list115041
+Node: Floats and lists of floats118130
+Node: Floats119608
+Node: Lists of floats120911
+Node: Footnotes123124
+Node: Other and unknown commands125630
+Node: Internationalization129570
+Node: Translating strings129981
+Node: Adding new strings131634
+Node: Indexop132506
+Node: Indexvr135109
+Node: Indexcp143811
+
+End Tag Table
diff --git a/Build/source/utils/texi2html/doc/texi2html.info-1 b/Build/source/utils/texi2html/doc/texi2html.info-1
new file mode 100644
index 00000000000..1b2eaccb006
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texi2html.info-1
@@ -0,0 +1,1299 @@
+This is texi2html.info, produced by makeinfo version 4.5 from
+texi2html.texi.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+INFO-DIR-SECTION Texinfo documentation system
+START-INFO-DIR-ENTRY
+* Texi2HTML: (texi2html). Texinfo to HTML Converter.
+END-INFO-DIR-ENTRY
+
+ This file, last updated 1 February 2005, documents the `texi2html'
+script which converts Texinfo (http://www.texinfo.org) into HTML
+(http://w3c.org). This edition is for `texi2html' version 1.76.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+
+File: texi2html.info, Node: Top, Next: Overview, Up: (dir)
+
+Texi2HTML
+*********
+
+ This manual, last updated 1 February 2005, describes version 1.76 of
+the `texi2html' Perl script which converts Texinfo (*note Texinfo:
+(Texinfo)Top.) into HTML.
+
+ Please send bug reports concerning this manual to the Texi2HTML user
+discussion list <user@texi2html.cvshome.org>. Please state the exact
+version of the manual which contains the bug, as given above.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+ *This manual is currently under construction and of course incomplete. ;-)*
+
+* Menu:
+
+* Overview::
+* Obtaining texi2html::
+ Obtaining a copy of the `texi2html'
+ source code distribution
+* Installation:: Installing `texi2html'
+* Invoking texi2html:: Description of the command line options
+* Initialization files:: What kind of variables and subroutines appear
+ in init files and how they are called
+* Changing the page layout:: Fine tuning of the page layout
+* Customizing HTML:: Fine tuning of the HTML elements
+ associated with the texinfo constructs
+* Internationalization:: Help translating !
+* Indexop:: Command Line Option Index
+* Indexvr:: Variable Index
+* Indexcp:: Concept Index
+
+
+File: texi2html.info, Node: Overview, Next: Obtaining texi2html, Prev: Top, Up: Top
+
+Overview
+********
+
+ Texinfo (http://www.texinfo.org) is the official documentation
+format of the GNU (http://www.gnu.org) project. It uses a single
+source file to produce both online information and printed output.
+
+ It is often desirable to have a way to produce HTML from Texinfo
+sources, as GNU-Info files are produced. It is much simpler to run a
+converter than it is to rewrite all the documentation in HTML,
+especially considering that there is so much Texinfo documentation in
+the world.
+
+ Some time ago `makeinfo' wasn't able to produce HTML output format,
+but people still wanted documentation in HTML. This was the birthing
+hour for `texi2html'. The basic purpose of `texi2html' is to convert
+Texinfo documents into HTML.
+
+ Since then, HTML support in `makeinfo' has improved, but `texi2html'
+is still stronger in many areas, including the degree to which it
+allows customization. With `texi2html', some important aspects of the
+resulting HTML files may be specified via command line options, and
+configuration files provide an even finer degree of control over the
+final output, allowing most every aspect of the final output not
+specified in the Texinfo input file to be specified. Configuration
+files are written in `perl', like the main program, and anything which
+may be specified on the command line may also be specified within a
+configuration file.
+
+ For an example of the kind of pages `texi2html' is capable of
+producing, have a look at the following sites: the Singular Manual
+(http://www.singular.uni-kl.de/Manual/html/), the Cederqvist (CVS
+Manual) (http://ccvs.cvshome.org/docs/manual).
+
+* Menu:
+
+* whytexi2html:: Why `texi2html' and not `makeinfo'?.
+
+
+File: texi2html.info, Node: whytexi2html, Up: Overview
+
+Why `texi2html' and not `makeinfo'?
+===================================
+
+ You would like to produce HTML files from your existing Texinfo
+files? There are two programs you can use to do this. The first is
+`makeinfo' (*note Generating HTML: (texinfo)Generating HTML.). The
+second is `texi2html'.
+
+ The design goal of `makeinfo''s HTML output was to produce readable
+HTML output. It is now possible to use CSS for HTML customization.
+Another possibility is to use intermediate formats, like docbook or
+`mekeinfo' XML and XSL stylesheets to customize the resulting document.
+Still the output produced by `makeinfo' isn't customizable.
+
+ The current development of `texi2html' tries to provide for
+producing the more interesting and sophisticated HTML pages that
+today's Internet users have come to expect. The goal behind
+`texi2html' is to generate attractive HTML by default but also to allow
+users considerable freedom to affect the final style and design of the
+output HTML pages. This is achieved via command line options and
+flexible configuration files.
+
+ In contrast to the HTML produced by `makeinfo --html' (the
+`makeinfo' program is part of the Texinfo distribution), the
+`texi2html' program, among other differences, allows for the
+customization of the entire page layout, including headers, footers,
+style sheets, etc., allows for customization of the low level HTML
+formatting, provides for splitting documents at various levels, and
+provides for using the `latex2html' program to convert `@tex' sections
+of the Texinfo source.
+
+ The focus on HTML is still present but with the help of the
+customization files it is now possible to use `texi2html' to produce
+other formats as well. `texi2html' may for example be turned into a
+texinfo to roff translator with the help of a customization file
+provided with the distribution.
+
+ `texi2html' should reasonably convert all Texinfo 4.8 constructs.
+If you find it does not, please send a bug report to the
+<users@texi2html.cvshome.org> email list.
+
+
+File: texi2html.info, Node: Obtaining texi2html, Next: Installation, Prev: Overview, Up: Top
+
+Obtaining `texi2html'
+*********************
+
+ The latest version of the source code for `texi2html' should be
+available from texi2html.cvshome.org (http://texi2html.cvshome.org).
+
+
+File: texi2html.info, Node: Installation, Next: Invoking texi2html, Prev: Obtaining texi2html, Up: Top
+
+Installation of `texi2html'
+***************************
+
+ To install `texi2html', you must first obtain a copy of the source
+distribution. *Note Obtaining texi2html::.
+
+ `texi2html' also requires `perl' version 5.004 or above. The
+current version has not been tested extensively on versions of `perl'
+below 5.6, however.
+
+ `texi2html' is a standard Automake-based distribution. If you have
+a source version, you should run `./configure' to regenerate the
+executable `texi2html' file. `./configure' accepts options to select
+the installation directory for the `texi2html' file, the default
+directories `texi2html' will use to look for configuration files, and
+other details. Run `./configure --help' for more information.
+
+ Running `./configure' combines four files into the final `texi2html'
+program file:
+ * `texi2html.pl' contains the base program,
+
+ * `MySimple.pm' handles the command line options,
+
+ * `texi2html.init' is the default configuration file, and
+
+ * `T2h_i18n.pm' is used for internationalization.
+
+ * `translations.pl' contains the translations of the strings used in
+ documents.
+
+ Running `./configure' also builds the `make' configuration files
+(`Makefile's). To make the documentation run `make'.
+
+ `make install' performs the installation to the locations specified
+to the `./configure' script. This usually involves placing the actual
+`texi2html' file someplace in your path, such as `/usr/local/bin' or
+`/usr/bin'.
+
+ Installing `texi2html' in your path should be sufficient to run it.
+To use default initialization files, or a configuration file for
+LaTeX2HTML when using `latex2html' to convert `@tex' sections (*note
+Expanding TeX regions::), install them in the package data directory
+specified to configure. This is `/usr/local/share/texi2html/' by
+default, but depends on the value of the `--pkgdatadir=DIR' option
+passed to the `./configure' script. Files used for strings
+customization and internationalization are also searched for in the
+`i18n' directory of this directory. *Note Using init files:: for more.
+
+
+File: texi2html.info, Node: Invoking texi2html, Next: Initialization files, Prev: Installation, Up: Top
+
+Invoking `texi2html'
+********************
+
+ To produce an HTML manual, run `texi2html' with a Texinfo file as an
+argument. For example, this manual is created with:
+
+ $ texi2html texi2html.texi
+
+ The behaviour of `texi2html' may be changed with command line
+options. These command line options are always associated with
+corresponding `perl' variables which may appear in init files, and these
+variables are presented in this chapter each time a switch is described.
+
+ Boolean command line switches always have a corresponding negated
+switch, obtained by prepending `no' or `no-' to the switch name. For
+example `--nomenu' does the reverse of `--menu'.
+
+* Menu:
+
+* Splitting output:: The HTML output may be split at
+ different levels
+* Output files::
+* Expansion::
+* Texinfo related options::
+* Page layout options:: Customizing page layout
+* Style options:: Customizing the HTML and text style
+* Expanding TeX regions::
+* Using init files:: Specifying initialization files for fine tuning
+
+
+File: texi2html.info, Node: Splitting output, Next: Output files, Up: Invoking texi2html
+
+Specifying where to split the generated document
+================================================
+
+ The HTML manual resulting from the processing of the Texinfo source
+may be split into files at different levels. This is specified with the
+option `--split' which takes an argument, namely the level of splitting
+(variable: `$SPLIT'). This level may be:
+
+`chapter'
+ The document is split at `@chapter', `@appendix', or `@unnumbered'.
+
+`section'
+ The document is split at the same places as it is using the
+ `chapter' argument, and also at `@section', `@appendixsec' or
+ `@unnumberedsec'.
+
+`node'
+ The document is split at every sectioning command. It is not
+ necessarily split at each node, if the `@node' structure doesn't
+ correspond with the sectioning command structure (see below).
+
+`none'
+ The document isn't split. This is the default.
+
+ There are two kinds of commands which may be used to define
+sectioning elements in Texinfo: `@node' and the structuring commands
+(`@top', `@section', `@appendixsubsec', and so on). A node just
+preceding a structuring command is considered to be part of the same
+sectioning element as that command. If the `@node Top' isn't
+associated with a structuring command it also defines a sectioning
+element.
+
+ By default, nodes which aren't associated with a structuring command
+are not considered to be sectioning commands. They are always
+considered to be part of a sectioning element defined by a structuring
+command. It is possible to change this behaviour via the `--use-nodes'
+option (variable `$USE_NODES'). In this case, nodes not associated
+with structuring commands are also considered to be sectioning commands
+defining a sectioning element.
+
+ This default behaviour mimics `texi2dvi' behaviour, which ignores
+`@node' commands for the purprose of sectioning, while the second looks
+like `makeinfo' behaviour (*note Two Paths: (texinfo)Two Paths.).
+
+ As an illustration, the following table shows how a sample Texinfo
+document is divided into sectioning elements when `--use-nodes' is used
+and not:
+
+Texinfo code default case with
+ `--use-nodes'
+ @node node1 first element: first element:
+ @chapter node 1
+ node1 text @node node1 @node node1
+ @chapter node 1 @chapter node 1
+ @node node2 node1 text node1 text
+ node2 text second
+ @node node2 element:
+ @node node3 node2 text
+ node3 text second @node node2
+ @chapter node 3 element: node2 text
+ chapter text third
+ @node node3 element:
+ node3 text
+ @chapter node 3 @node node3
+ chapter text node3 text
+ @chapter node 3
+ chapter text
+
+
+File: texi2html.info, Node: Output files, Next: Expansion, Prev: Splitting output, Up: Invoking texi2html
+
+Setting output file and directory names
+=======================================
+
+ The manual name is constructed by stripping the `.texi', `.txi',
+`.texinfo', or `.txinfo' extension from the Texinfo file name.
+
+ By default, `texi2html' generates the manual file in the current
+directory if the manual isn't split. A `.html' file extension is
+appended to the manual name.
+
+ If the manual is split the files are put in a directory named after
+the manual name. The file name is constructed using the manual name as
+basename. An underscore followed by a number is appended to the
+basename for each files corresponding with sectioning elements, with the
+exception of the top element. For the top element there nothing
+appended. The files containing special elements pages have an
+underscore and a 3 letter code corresponding to their content (`toc'
+for table of contents, `abt' for about, `ovr' for overview) appended.
+Lastly, an `.html' file extension is appended.
+
+ Thus, if the texinfo file `afile.texi' is processed and split at
+chapters into 3 files, the generated files (in directory `afile') will
+be:
+
+ afile.html --> `@node Top' or `@top' section
+ afile_1.html --> Chapter 1
+ afile_2.html --> Chapter 2
+ afile_toc.html --> Table of Contents
+ afile_abt.html --> About Page
+
+ This default behavior may be modified by several command line
+options. If the output isn't split, the prefix file name may be
+overrided by the `--output' command line option (variable `$OUT'). If
+the output is split, and `--output' is set, the files are placed in the
+directory specified by the argument to the option.
+
+ The basename may be overridden with `--prefix' (variable `$PREFIX').
+If `--short-ext' is given, `.htm' is appended instead of `.html' in
+the final step (variable `$SHORTEXTN'). The `--top-file' option
+overrides the top element file name (variable `$TOP_FILE'). This can
+be used to name the top element file `index.html'. Similarly,
+`--toc-file' changes the name of the table of contents file (variable
+`$TOC_FILE').
+
+ Reusing the example above, but this time calling `texi2html' like so:
+
+ $ texi2html -split chapter -prefix manual -short-ext -top-file index.htm -toc-file contents.htm afile.texi
+
+ we get, in `manual':
+
+ index.htm --> `@node Top' or `@top' section
+ manual_1.htm --> Chapter 1
+ manual_2.htm --> Chapter 2
+ contents.htm --> Table of Contents
+ manual_abt.htm --> About Page
+
+ The file names generated by `texi2html' differ from those generated
+by `makeinfo'. `makeinfo' uses the node name to construct the file
+names while splitting at nodes. It is possible to get the same
+behaviour out of `texi2html' by specifying the `--node-files' option
+(variable `$NODE_FILES'). If the output isn't split at nodes,
+`texi2html' will still output files named after the nodes, without real
+content but redirecting to the right file. The default is false for
+this option. This trick enables the generated HTML manual to be a
+target for the cross-references of other manuals generated by
+`makeinfo' or `texi2html'.
+
+
+File: texi2html.info, Node: Expansion, Next: Texinfo related options, Prev: Output files, Up: Invoking texi2html
+
+Specifying which regions get expanded
+=====================================
+
+ The default for `texi2html' is to expand the `@ifhtml', `@html', and
+`@menu' regions, all the `@ifnot' regions except `@ifnothtml', and no
+other `@if' regions.
+
+ It is possible to expand other regions by setting `--if<region>',
+where `<region>' is replaced by the literal name of the region (for
+example, `--iftex'). Symetrically, if `--no-if<region>' is specified,
+the `<region>' region is ignored. The configuration file array,
+`@EXPAND', holds the names of regions which should be expanded. The
+only region name present in `@EXPAND' in the default case is `html'.
+
+ If `--nomenu' is set, the `@menu' sections are not expanded
+(variable `$SHOW_MENU'). The default is to expand `@menu' sections.
+
+
+File: texi2html.info, Node: Texinfo related options, Next: Page layout options, Prev: Expansion, Up: Invoking texi2html
+
+Command line options related to Texinfo language features
+=========================================================
+
+ Miscalleneous Texinfo related things may be specified via command
+line options.
+
+`--lang=LANG'
+ Sets the document language similar to the Texinfo directive,
+ `@documentlanguage LANG' (variable `$LANG'). The default is `en',
+ that is, use the english language strings.
+
+`-DVAR'
+ Sets VAR. Equivalent to, `@set VAR 1', in Texinfo.
+
+`-UVAR'
+ Clears VAR. Equivalent to, `@clear VAR', in Texinfo.
+
+`-PDIR'
+ Prepend DIR to the list of directories to search for `@include'
+ files (the associated array is `@PREPEND_DIRS', empty in the
+ default case).
+
+`-IDIR'
+ Append DIR to the list of directories to search for `@include'
+ files (the associated array is `@INCLUDE_DIRS', empty in the
+ default case).
+
+ The include files are always searched for in the current directory.
+
+
+File: texi2html.info, Node: Page layout options, Next: Style options, Prev: Texinfo related options, Up: Invoking texi2html
+
+Page layout related command line options
+========================================
+
+ If the `--frames' option is specified, HTML frames are used. A file
+describing the frame layout is generated, and the document page is
+associated with a frame where the short table of content appears
+(variable `$FRAMES'). The default is not to use frames.
+
+ It is also possible to suppress the section navigation panel with
+`--nosec-nav' (variable `$SECTION_NAVIGATION', the default is to output
+all the navigation panels), and to specify whether footnotes should
+appear at the foot of the same page which contains the reference to the
+note or on a separate page with `--separated-footnotes' (variable
+`$SEPARATED_FOOTNOTES'). The default is to have separated footnotes.
+
+
+File: texi2html.info, Node: Style options, Next: Expanding TeX regions, Prev: Page layout options, Up: Invoking texi2html
+
+Customizing the HTML and text style
+===================================
+
+ Miscalleneous style changes may be achieved with command line
+options.
+
+`--doctype=DTD'
+`--frameset-doctype=DTD'
+ You can specify the document DTD by setting these options.
+ `--frameset-doctype' applies to the file describing the frames when
+ frames are used (corresponding variables are `$DOCTYPE' and
+ `$FRAMESET_DOCTYPE').
+
+ The default for the document doctype is:
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+ And for the frameset doctype:
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html401/frameset.dtd">
+
+`--iso'
+ If this option is set, ISO8859 entities are used for some special
+ symbols, like Copyright (C) (variable `$USE_ISO'). It is the
+ default.
+
+`--css-include=FILE'
+ This command line switch provides for the inclusion of an external
+ Cascading Style Sheet (CSS) file. More than one file may be
+ specified, and `-' stands for the standard input (array
+ `@CSS_FILES').
+
+ The option use is the same than for `makeinfo' and is described
+ extensively in *Note HTML CSS: (texinfo)HTML CSS. Briefly, the
+ CSS `@import' lines from the external file CSS file are pasted
+ before the `texi2html' CSS rules, and the external file CSS rules
+ are pasted after the `texi2html' CSS rules.
+
+`--html-xref-prefix=PATH'
+ This option sets the base directory for external HTML texinfo
+ manuals (variable `$EXTERNAL_DIR'). Defaults to `../'.
+
+`--def-table'
+ If this option is set, HTML tables are used to format definition
+ commands, rather than HTML definition tables (variable
+ `$DEF_TABLE'). Default is false.
+
+`--short-ref'
+ If this option is set, cross-references are given without section
+ numbers (variable `$SHORT_REF'). Default is false.
+
+`--number'
+ If this option is set, sections are numbered (variable
+ `$NUMBER_SECTIONS'). This is the default.
+
+`--toc-links'
+ If this option is set, links from headings to TOC entries are
+ created (variable `$TOC_LINKS'). Default is false.
+
+
+File: texi2html.info, Node: Expanding TeX regions, Next: Using init files, Prev: Style options, Up: Invoking texi2html
+
+Expanding `@tex' and `@math' regions using LaTeX2HTML
+=====================================================
+
+ It is possible to use LaTeX2HTML (http://www.latex2html.org/) to
+process `@tex' regions and `@math{}' commands. This is an attractive
+way to display mathematical constructs in the HTML manual. The `--l2h'
+option activates this feature (variable $L2H). It is usually desirable
+to expand `@tex' sections when this option is specified (*note
+Expansion::). The default is not to use this feature.
+
+ The `--l2h-l2h=PROGRAM' option enables changing the name/location of
+the LaTeX2HTML program processing TeX regions (variable `$L2H_L2H').
+The default is `latex2html'.
+
+ `--l2h-tmp' sets the directory used for temporary files, this name
+shouldn't contain a dot `.' (variable is `$L2H_TMP'). Defaults to the
+current dir.
+
+ The file specified by `--l2h-file' is used as LaTeX2HTML init file.
+It is searched at the same places than init files (*note Using init
+files::), and the default is `l2h.init'.
+
+
+File: texi2html.info, Node: Using init files, Prev: Expanding TeX regions, Up: Invoking texi2html
+
+Use initialization files for fine tuning
+========================================
+
+ Initialization variables are read first from
+`/usr/local/share/texi2html/Config' (the exact location being
+changeable with the `--pkgdatadir=dir' option of the `configure'
+script, see *Note Installation::), `/usr/local/etc/texi2html/Config'
+(the exact location being changeable with the `--sysconfdir=dir' option
+of the `configure' script, see *Note Installation::), from `./Config'
+then from `$HOME/.texi2html/Config'. Any command-line option can
+override the corresponding option set in init file, and the option
+`--init-file' specifies an init file to be loaded, with later settings
+overriding earlier ones.
+
+ The init files specified with `--init-file' are searched first in
+the current directory, then in the `$HOME/.texi2html/' directory, in
+the `/usr/local/etc/texi2html/' directory and lastly in the
+`/usr/local/share/texi2html/' directory.
+
+ A file is also included based on the language selected, by `$LANG',
+`--lang' or `@documentlanguage'. If no language was selected `en' is
+considered to be the language. All the files with name the language
+name in `/usr/local/share/texi2html/i18n/',
+`/usr/local/etc/texi2html/i18n/', `$HOME/.texi2html/i18n/' and then
+`./i18n/' are included.
+
+ The default initialization options are defined in the
+`texi2html.init' file contained in the `texi2html' distribution (which
+gets included near the beginning of the `texi2html' script that gets
+installed).
+
+ To customize `texi2html' it is best if you copy the appropriate
+sections from the `texi2html.init' contents into an appropriate local
+initialization file, make the necessary changes there, and then have
+`texi2html' read this initialization file by one of the means described
+above.
+
+
+File: texi2html.info, Node: Initialization files, Next: Changing the page layout, Prev: Invoking texi2html, Up: Top
+
+Overview of initialization files content and loading
+****************************************************
+
+ The initialization files are `perl' files, read as explained in
+*Note Using init files::. You don't need to know much of `perl' to do
+some simple changes in variable values, however, to be able to really
+take advantage of all the features of the initialization file, a good
+knowledge of `perl' is required.
+
+ In initialization file two kind of variables appear. These are normal
+variables (including arrays and hashes) and references on functions.
+The later permits the dynamic redefinition of functions used to produce
+the HTML manual. You should be able to change the value of some normal
+variables without a deep knowledge of `perl', by looking at the
+existing examples. The possible mistakes in that case could be omitted
+`;', and bad quoting.
+
+ Initialization file are loaded from the main program by the mean of
+a `require', while in the `Texi2HTML::Config' namespace. This means
+that the namespace of the main program and the namespace of
+inititalization files are distinct, which ensures that no name clash
+should happen. The variables are declared with the `our' specifier,
+such that it should be possible to use the `use strict' pragma in the
+initialization file code.
+
+ To avoid messing with the variables in the `main' namespace all the
+global variables which could be of use in the init files are in the
+`Texi2HTML' namespace. Notice that the functions of the main program
+are still in the `main' namespace.
+
+* Menu:
+
+* Redefining functions:: Function redefinition is achieved with
+ redefinition of references on functions.
+* Function prototypes:: Conventions used in that manual for function
+ reference prototypes display.
+
+
+File: texi2html.info, Node: Redefining functions, Next: Function prototypes, Up: Initialization files
+
+Redefining functions in initialization files
+============================================
+
+ To redefine a function you must replace the corresponding funtion
+reference with a reference on your function. Thus you should write
+your function, give it a name you are certain it is unique in the
+`Texi2HTML::Config' namespace, and override the value of the function
+reference with your own function reference. When another function from
+the main program (or from another functions of an initialization file)
+calls the reference, your function will be used.
+
+ For example the function reference corresponding with the function
+called when doing an anchor is called `$anchor'. Thus if you want to
+override the corresponding function you could write:
+
+ # override the function reference
+ $anchor = \&my_own_function;
+
+ # the function reference now refers to
+ sub my_own_function {
+ # process arguments and return an html anchor
+ }
+
+
+File: texi2html.info, Node: Function prototypes, Prev: Redefining functions, Up: Initialization files
+
+Conventions used for function prototypes
+========================================
+
+ As the functions are defined by a reference name, we will always use
+the reference name in function prototypes. For the function arguments
+we will use `\@array' for a reference on an array and similarly
+`\%hash' for a reference on a hash.
+
+ Thus, the prototype for the function associated with the function
+reference `$formatting_function' will be:
+
+ - Function Reference: $text formatting_function $arg1 \@arg2
+ `formatting_function' takes as first argument $ARG2, as second
+ argument a reference on an array \@ARG2 and returns the formatted
+ text $TEXT.
+
+ To redefined the corresponding function, you should write:
+
+ $formatting_function = \&my_formatting_function
+
+ sub my_formatting_function($ $)
+ {
+ my $arg1 = shift;
+ my $arg2 = shift;
+ # prepare $formatted_text
+ .....
+ return $formatted_text
+ }
+
+
+File: texi2html.info, Node: Changing the page layout, Next: Customizing HTML, Prev: Initialization files, Up: Top
+
+Fine tuning of the page layout
+******************************
+
+ Some features of the page layout might be specified with command line
+options, the corresponding variables are described in *Note Page layout
+options::. Fine tuning of the page layout may be achieved with
+redefinition of other variables and function references in the
+initialization files.
+
+* Menu:
+
+* The different pages:: The different categories of pages.
+* The page layout:: The elements of a page.
+* Navigation panel:: How to change the navigation panel.
+* Program variables:: The available main program variables and some
+ usefull functions from the main program.
+* Output initialization:: Setting variables before the document
+ production but after the texinfo parsing.
+* Output finalization:: Cleaning after document generation.
+* css:: Customizing css lines.
+* Customizing header::
+* Customizing section::
+* Customizing footer::
+* Special pages:: Customizing table of contents, top, about page.
+* File names:: Customizing the file names.
+* External index files:: Putting index entries in external files.
+
+
+File: texi2html.info, Node: The different pages, Next: The page layout, Up: Changing the page layout
+
+The different categories of pages and sectioning elements
+=========================================================
+
+ The following sectioning elements can be associated with pages:
+
+_Normal elements_
+ These are normal sections or nodes. Their association with pages is
+ determined by the splitting of the document. *Note Splitting
+ output::.
+
+_Top element_
+ The top element is the higher element in the document structure.
+ If there is a `@top' section it is the element associated with
+ that section. Otherwise it is the element associated with the
+ `@node Top'. If there is no `@node Top' the first element is the
+ top element.
+
+ The top element is formatted differently than a normal element if
+ there is a `@top' section or the `@node Top' isn't associated with
+ a sectioning command.
+
+_Misc elements_
+ These elements are associated with pages if the document is split.
+ There are four misc elements:
+ 1. Table of contents
+
+ 2. Short table of contents, also called Overview
+
+ 3. Footnotes page
+
+ 4. About page
+
+ The _About page_ shouldn't be present for documents consisting in
+ only one sectioning element. The _Footnote page_ should only be
+ present if the footnotes appear on a separated page (*note Page
+ layout options::), however a footnote element is present if the
+ document isn't split. The _Table of contents_ should only be
+ formatted if `@contents' is present in the document. Similarly
+ the _Overview_ should only appear if `@shortcontents' or
+ `@summarycontents' is present.
+
+
+File: texi2html.info, Node: The page layout, Next: Navigation panel, Prev: The different pages, Up: Changing the page layout
+
+Page layout and navigation panel overview
+=========================================
+
+ A page is broken up in three parts. A page header, the sections and
+a page footer. A common element in the page layout is a navigation
+panel with icons or text linking to other sections or pages. Another
+common element is a rule, separating sections or footer. The navigation
+panel and the rules may be part of the sections or part of headers or
+footers. You may use the variables `$SMALL_RULE', `$DEFAULT_RULE',
+`$MIDDLE_RULE' and `$BIG_RULE' for rules of different sizes. The
+defaults are
+ $SMALL_RULE = '<hr size="1">';
+ $DEFAULT_RULE = '<hr>';
+ $MIDDLE_RULE = '<hr size="2">';
+ $BIG_RULE = '<hr size="6">';
+
+ In the header some important meta data may be defined, like the
+title or style information, and textual informations may be present in
+comments. All this doesn't appear directly in the displayed HTML,
+though.
+
+ The page layout is mainly controlled by functions, the precise
+functions called depending on the document splitting. The navigation
+panel, however, can be customized with variables.
+
+Element labels
+--------------
+
+ There are 19 items associated with elements. Each of these is
+associated with a name and a reference to the element they represent,
+when such an element exists. The element is either a global element or
+an element relative to the current element. The relative elements are
+found with respect with the document structure defined by the section
+structuring commands (`@chapter', `@unnumbered'...) or by the nodes (in
+that case the node directions are specified on node line or in menu
+organization). These items are called "element labels". They may be
+associated with a button (*note Button specifications::), and used in
+the formatting functions (*note Program variables::).
+
+ Here is the list:
+
+_` '_
+ An empty button
+
+_Top_
+ Top element. The associated name is `$TOP_HEADING' if that
+ variable is defined. This variable is not set by default.
+
+_Contents_
+ Table of contents
+
+_About_
+ About (help) page
+
+_Overview_
+ Overview, short table of contents
+
+_First_
+ First element in reading order
+
+_Last_
+ Last element in reading order
+
+_Index_
+ The first chapter with `@printindex'. The associated name is
+ `$INDEX_CHAPTER', if the variable is set. This variable is not set
+ by default.
+
+_This_
+ The current element
+
+_Back_
+ Preceding element in reading order
+
+_FastBack_
+ Beginning of this chapter or previous chapter if the element is a
+ chapter
+
+_Prev_
+ Previous section on the same level
+
+_NodePrev_
+ Previous node
+
+_Forward_
+ Next element in reading order
+
+_FastForward_
+ Next chapter
+
+_Next_
+ Next section on the same level
+
+_NodeNext_
+ Next node
+
+_Following_
+ Next node in node reading order
+
+_Up_
+ Up section
+
+_NodeUp_
+ Up node
+
+
+File: texi2html.info, Node: Navigation panel, Next: Program variables, Prev: The page layout, Up: Changing the page layout
+
+Customization of the navigation panels buttons
+==============================================
+
+ A lot of customization of the navigation panel may be achieved
+without redefining functions, with variables redefinition. In case it
+isn't enough, it is also possible to redefine the function doing the
+navigation panel formatting.
+
+* Menu:
+
+* General purpose variables:: Variables controlling the navigation panel
+ at a global level
+* Button specifications::
+* Panel formatting function::
+
+
+File: texi2html.info, Node: General purpose variables, Next: Button specifications, Up: Navigation panel
+
+Controlling the navigation panel panel at a high level
+------------------------------------------------------
+
+ The global formatting of the navigation panels may be changed with
+the following variables:
+
+`$VERTICAL_HEAD_NAVIGATION'
+ A vertical navigation panel will be used for the header navigation
+ panel if this variable is true.
+
+`$ICONS'
+ Icons are used instead of textual buttons if this variable is true.
+
+`$SECTION_NAVIGATION'
+ If this variable is false there is no section navigation, no
+ navigation panels for the elements within the pages, only at the
+ beginning and the end of the page (*note Page layout options::).
+
+
+File: texi2html.info, Node: Button specifications, Next: Panel formatting function, Prev: General purpose variables, Up: Navigation panel
+
+Specifying the buttons formatting
+---------------------------------
+
+ Several arrays and hashes enable a precise control on the buttons and
+their display. The following arrays determine the buttons present in
+navigation panels:
+
+`@SECTION_BUTTONS'
+ This array is used for the navigation panel buttons present at the
+ begining of sectioning elements. If split at node or section they
+ are also used at the page footer, and in the case of section
+ navigation at the page header.
+
+`@SECTION_FOOTER_BUTTONS'
+`@NODE_FOOTER_BUTTONS'
+ This array is used for the navigation panel buttons present at the
+ footer of pages when split at node or at section.
+
+ If `$WORDS_IN_PAGE' is set and the output is split at nodes, these
+ buttons are only present if there are more than `$WORDS_IN_PAGE'
+ words in the sectioning element text. This counting is very rough
+ and include punctuation marks, html elements, numbers. The
+ default is to include the buttons after 300 words.
+
+`@CHAPTER_BUTTONS'
+ This array is used for the buttons appearing at the page footer if
+ split at chapter, and at the page header if split at chapter and
+ there is no section navigation.
+
+`@MISC_BUTTONS'
+ These buttons appear at the beginning of special and sections and
+ at the end of these section pages if the output is split.
+
+ The array specify the buttons displayed in navigation panels, and
+how the button is displayed. Each element is associated with a button
+of the navigation panel from left to right. The signification of the
+array element value is the following:
+
+_reference on a function_
+ The function is called with first argument a filehandle reference
+ on the current file and second argument a boolean true if the
+ navigation panel should be vertical.
+
+_reference on a scalar_
+ The scalar value is printed. For some possibly usefull scalars,
+ *Note Elements hashes::.
+
+_reference on an array_
+ In this case the first array element should be a reference on text
+ and the second element an element label. In that case a link to the
+ element associated with the element label with the scalar value
+ text is generated.
+
+ For example if the buttons array element is
+ [ 'Next', \$Texi2HTML::NODE{Next} ]
+
+ The button will be a link to the next section with text
+ `$Texi2HTML::NODE{Next}'.
+
+_element label_
+ If icons are not used, the button is a link to the corresponding
+ element which text is defined by the value associated with the
+ element label in the `%NAVIGATION_TEXT' hash, surrounded by `['
+ and `]'. If the element label is ` ', there is no `[' and `]'.
+ The element of the `%NAVIGATION_TEXT' hash are defined
+ dynamically, in the `init_out' function reference (*note Output
+ initialization::).
+
+ If icons are used, the button is an image with file determined by
+ the value associated with the element label in the `%ACTIVE_ICONS'
+ hash if the the link really leads to an element, or in the
+ `%PASSIVE_ICONS' hash if there is no element to link to. Of course
+ if there is a link to the element the icon links to that element.
+
+
+File: texi2html.info, Node: Panel formatting function, Prev: Button specifications, Up: Navigation panel
+
+Changing the navigation panel formatting
+----------------------------------------
+
+ If you are not satisfied with this scheme, it is possible to control
+exactly the formatting of navigation panels by redefining a function
+reference. The function controlling the display of navigation panel is
+associated with the following function reference:
+
+ - Function Reference: print_navigation $filehandle \@buttons $vertical
+ $FILEHANDLE is the opened filehandle the function should write to.
+ \@BUTTONS is an array reference which should hold the
+ specification of the buttons for that navigation panel. $VERTICAL
+ is true if the navigation panel should be vertical.
+
+
+File: texi2html.info, Node: Program variables, Next: Output initialization, Prev: Navigation panel, Up: Changing the page layout
+
+Main program variables and usefull functions
+============================================
+
+ In the functions controlling the page layout some global variables
+set by the main program are available, with value corresponding with
+the current layout element.
+
+* Menu:
+
+* Elements hashes:: Accessing information related with the
+ different elements
+* Global informations:: Accessing global informations, like date,
+ title...
+* Global functions:: main program usefull functions
+
+
+File: texi2html.info, Node: Elements hashes, Next: Global informations, Up: Program variables
+
+Accessing elements informations
+-------------------------------
+
+ Four hashes are available, with key the elements labels (as described
+in *Note Element labels::) and values:
+
+`%Texi2HTML::NAME'
+ The formatted element name
+
+`%Texi2HTML::HREF'
+ The element hypertext reference
+
+`%Texi2HTML::NODE'
+ The element node name
+
+`%Texi2HTML::NO_TEXI'
+ The element name after removal of texi commands
+
+
+File: texi2html.info, Node: Global informations, Next: Global functions, Prev: Elements hashes, Up: Program variables
+
+Accessing global informations
+-----------------------------
+
+ Three kinds of global informations are available, miscalleneous
+global strings, flags set by `@set' and special flags and section lines.
+
+Global strings
+..............
+
+ The `%Texi2HTML::THISDOC' hash holds some global informations:
+
+`fulltitle'
+ title set by `@title'. If there is no `@title' other possibilities
+ are tried (`@settitle', `@shorttitlepage'...).
+
+`title'
+ title set by `@settitle', or `fulltitle'.
+
+`title_no_texi'
+ title without texi formatting
+
+`title_texi'
+ title with texi commands
+
+`author'
+ Authors list set by `@author'.
+
+`authors'
+ A reference on an array containing each author set by `@author'.
+
+`copying'
+ Text appearing in `@copying' with all the texinfo commands removed,
+ put in comments.
+
+`program'
+ The name and version of `texi2html'.
+
+`program_homepage'
+ Homepage for `texi2html'.
+
+`program_authors'
+ Authors of `texi2html'.
+
+`file_base_name'
+ base name of the texinfo manual file.
+
+`destination_directory'
+ Destination directory for the resulting files.
+
+`toc_file'
+ The file name of the table of contents.
+
+`today'
+ The date.
+
+ It also holds the arg of the following commands, associated with the
+command name: kbdinputstyle, paragraphindent, setchapternewpage,
+headings, footnotestyle, exampleindent, firstparagraphindent,
+everyheading, everyfooting, evenheading, evenfooting, oddheading,
+oddfooting.
+
+Flags
+.....
+
+ Flags defined by `@set' may be accessed through the `%main::value'
+hash. The key is the flag name, the value is the flag value at the end
+of the document.
+
+ Special flags are set by the main program. They correspond with a
+texinfo command, like `@setfilename', or `@settitle', `@author'... The
+corresponding flag is the command name with `_' appended, for example,
+`_titlefont' corresponds with `@titlefont'. Like other flags they are
+available in `%main::value'.
+
+Section lines
+.............
+
+ The following array references or arrays holds formatted lines:
+
+`$Texi2HTML::THIS_SECTION'
+ Lines of the current element.
+
+`$Texi2HTML::THIS_HEADER'
+ Lines of the current element appearing before the element label
+ (anchors).
+
+`$Texi2HTML::OVERVIEW'
+ Lines of short table of contents. *Note Special pages::.
+
+`$Texi2HTML::TOC_LINES'
+ Lines of table of contents. *Note Special pages::.
+
+
+File: texi2html.info, Node: Global functions, Prev: Global informations, Up: Program variables
+
+Function usefull in page formatting
+-----------------------------------
+
+ The usefull function is a function used to print an array of lines,
+which also counts the number of words in the array, if needed.
+
+ - Function: $words_number main::print_lines $filehandle \@lines_array
+ $FILEHANDLE is the opened filehandle the function should write to.
+ \@LINES_ARRAY is the array line the function should write to the
+ file. If this argument is omitted, the function uses
+ `$Texi2HTML::THIS_SECTION'. $WORDS_NUMBER is the number of words
+ in the array, only defined if split at nodes and `$WORDS_IN_PAGE'
+ is defined.
+
+
+File: texi2html.info, Node: Output initialization, Next: Output finalization, Prev: Program variables, Up: Changing the page layout
+
+Preparing the output
+====================
+
+ After the texinfo file has been parsed, some information is available
+which can be used to modify some variables and prepare the outputting.
+For example the document language, the document encoding, values set
+with `@set' or `@setfilename' and other similar @-commands are not
+known before the texinfo parsing.
+
+ The following function reference may be redefined to be called after
+texinfo processing and before document generation:
+
+ - Function Reference: $encoding init_out
+ This function perform the initialization of variables and any other
+ task before document outputting. It returns the encoding used for
+ the output files.
+
+ In the default case the `$BODYTEXT' (*note Customizing header::) and
+the hashes `%NAVIGATION_TEXT' (*note Button specifications::) and
+`%BUTTONS_GOTO' (*note About text::) are initialized.
+
+ To perform the default initializations and also add more code, you
+could do as in the following example (save the default function
+reference and call it in your own function) :
+
+ my $default_init_out = $init_out;
+ $init_out = \&makeinfo_like_init_out;
+ sub makeinfo_like_init_out()
+ {
+ my $encoding = &$default_init_out();
+ $NAVIGATION_TEXT{'Following'} = ' &gt; ';
+ return $encoding;
+ }
+
+
+File: texi2html.info, Node: Output finalization, Next: css, Prev: Output initialization, Up: Changing the page layout
+
+Finalizing the output
+=====================
+
+ If you want to do some cleaning after the document was generated
+(close files, write at the end of files and so on), the following
+function reference may be redefined:
+
+ - Function Reference: finish_out
+ This function is called after the document generation.
+
+ The default is to do nothing.
+
+
+File: texi2html.info, Node: css, Next: Customizing header, Prev: Output finalization, Up: Changing the page layout
+
+Customizing the `texi2html' css lines
+=====================================
+
+ It is possible to modify the `texi2html' css lines by modifying the
+entries or adding to the `%css_map' hash. Each key is a css selector,
+the corresponding value is a style string.
+
+ The whole css text is in the variable `$CSS_LINES'. If this variable
+is defined the variable value is used instead of being constructed
+using the `%css_map' entries. For example if you don't want any css
+entries, set
+
+ $CSS_LINES = '';
+
+ It is also possible to change completely the way `$CSS_LINES' are
+generated by redefining the following function reference:
+
+ - Function Reference: css_lines \@import_lines \@rule_lines
+ This function should be used to construct the `$CSS_LINES'.
+ \@IMPORT_LINES are the `@import' lines of the files specified with
+ `--include-css', and \@RULE_LINES are the css commands lines of
+ these files. *Note Style options::.
+
diff --git a/Build/source/utils/texi2html/doc/texi2html.info-2 b/Build/source/utils/texi2html/doc/texi2html.info-2
new file mode 100644
index 00000000000..7ca7887deb8
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texi2html.info-2
@@ -0,0 +1,1262 @@
+This is texi2html.info, produced by makeinfo version 4.5 from
+texi2html.texi.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+INFO-DIR-SECTION Texinfo documentation system
+START-INFO-DIR-ENTRY
+* Texi2HTML: (texi2html). Texinfo to HTML Converter.
+END-INFO-DIR-ENTRY
+
+ This file, last updated 1 February 2005, documents the `texi2html'
+script which converts Texinfo (http://www.texinfo.org) into HTML
+(http://w3c.org). This edition is for `texi2html' version 1.76.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+
+File: texi2html.info, Node: Customizing header, Next: Customizing section, Prev: css, Up: Changing the page layout
+
+Customizing the page header
+===========================
+
+ It is possible to add lines to the text within the `<head>' HTML
+elements, by defining the variable `$EXTRA_HEAD'. Similarly it is
+possible to add text just after the `<body>' element with the variable
+`$AFTER_BODY_OPEN'. These variables are empty by default.
+
+ The encoding of the texinfo file is defined by `$DOCUMENT_ENCODING'
+if no `@documentencoding' appears in the document. The default is a
+`en-ascii' encoding. The encoding of the resulting document is defined
+by `$ENCODING'. The default is the `$DOCUMENT_ENCODING'.
+
+ The description of the document may be specified in
+`$DOCUMENT_DESCRIPTION'. If this variable is undef, the text associated
+with `@documentdescription' is used, and if there isn't such test a
+default description is constructed using the document title and the
+name of the first section of the file.
+
+ The `<body>' element attributes may be set by defining the variable
+`$BODYTEXT'. If you want to define that variable dynamically, you
+should use the `init_out' function reference (*note Output
+initialization::).
+
+ The default functions call the function associated with
+`$print_head_navigation' to format the navigation panel for the page
+header. Thus you can control parts of the formatting by redefining the
+function reference.
+
+ - Function Reference: print_head_navigation $filehandle \@buttons
+ $FILEHANDLE is the opened filehandle the function should write to.
+ \@BUTTONS is an array reference which should hold the
+ specification of the buttons for the navigation panel.
+
+ If you want even more control, you can have full control over the
+page header formatting by redefining three function references. The
+function associated with `$print_page_head' is called for all the
+pages, and after that, the function associated with
+`$print_chapter_header' is called if the document is split at chapters,
+or the function associated with `$print_section_header' is called if
+the document is split at sections.
+
+ - Function Reference: print_page_head $filehandle
+ $FILEHANDLE is the opened filehandle the function should write to.
+ This function should print the page head, including the `<body>'
+ element.
+
+ - Function Reference: print_chapter_header $filehandle
+ $FILEHANDLE is the opened filehandle the function should write to.
+ This function is called if the document is split at chapters, after
+ `print_page_head'.
+
+ - Function Reference: print_section_header $filehandle
+ $FILEHANDLE is the opened filehandle the function should write to.
+ This function is called if the document is split at sections, after
+ `print_page_head'.
+
+
+File: texi2html.info, Node: Customizing section, Next: Customizing footer, Prev: Customizing header, Up: Changing the page layout
+
+Customizing the sections
+========================
+
+ The functions associated with the following function references are
+used for the formatting of sections:
+
+ - Function Reference: print_section $filehandle $first_in_page
+ $previous_is_top
+ $FILEHANDLE is the opened filehandle the function should write to.
+ $FIRST_IN_PAGE is true if this section is the first section in the
+ page. $PREVIOUS_IS_TOP is true if this section is the section
+ following the Top section. This function should print the current
+ section.
+
+ - Function Reference: end_section $filehandle
+ $last_element_or_before_top
+ $FILEHANDLE is the opened filehandle the function should write to.
+ $LAST_ELEMENT_OR_BEFORE_TOP is true if this section precedes the
+ top element or is the last one in page, or before the special
+ elements.
+
+
+File: texi2html.info, Node: Customizing footer, Next: Special pages, Prev: Customizing section, Up: Changing the page layout
+
+Customizing the page footer
+===========================
+
+ It is possible to add text just before the `</body>' element with
+the variable `$PRE_BODY_CLOSE'. Nothing is added by default.
+
+ The default functions call the function associated with
+`$print_foot_navigation' to format the navigation panel for the page
+footer. Thus you can control parts of the formatting by redefining the
+function reference.
+
+ - Function Reference: print_foot_navigation $filehandle \@buttons
+ $FILEHANDLE is the opened filehandle the function should write to.
+ \@BUTTONS is an array reference which should hold the
+ specification of the buttons for the navigation panel.
+
+ If you want even more control, you can have full control the page
+footer formatting by redefining three function references. The
+function associated with `$print_chapter_footer' is called if the
+document is split at chapters, or the function associated with
+`$print_section_footer' is called if the document is split at sections.
+After that the function associated with `$print_page_foot' is called.
+
+ - Function Reference: print_page_foot $filehandle
+ $FILEHANDLE is the opened filehandle the function should write to.
+ This function should print the page foot, including the `</body>'
+ element.
+
+ - Function Reference: print_chapter_footer $filehandle
+ $FILEHANDLE is the opened filehandle the function should write to.
+ This function is called if the document is split at chapters,
+ before `print_page_foot'.
+
+ - Function Reference: print_section_footer $filehandle
+ $FILEHANDLE is the opened filehandle the function should write to.
+ This function is called if the document is split at sections,
+ before `print_page_foot'.
+
+
+File: texi2html.info, Node: Special pages, Next: File names, Prev: Customizing footer, Up: Changing the page layout
+
+Special pages formatting
+========================
+
+ For the special elements, two things must be formatted: the content
+and the page layout
+
+* Menu:
+
+* Special pages content::
+* Special pages layout::
+
+
+File: texi2html.info, Node: Special pages content, Next: Special pages layout, Up: Special pages
+
+Customizing the content of the special pages
+--------------------------------------------
+
+* Menu:
+
+* Top element text::
+* Contents and Overview text::
+* Footnotes text::
+* About text::
+
+
+File: texi2html.info, Node: Top element text, Next: Contents and Overview text, Up: Special pages content
+
+Top element text formatting
+...........................
+
+ The top element formatting is controlled by three function which also
+controls the layout of the top element page or section. The associated
+function references are:
+
+ - Function Reference: print_Top_header $filehandle $begin_page
+ $FILEHANDLE is the opened filehandle the function should write to.
+ $BEGIN_PAGE is true if the element is the first in a page. This
+ function should begin the Top element. At the time this function
+ is called the top element text hasn't been parsed.
+
+ - Function Reference: print_Top $filehandle $has_top_heading
+ $FILEHANDLE is the opened filehandle the function should write to.
+ $HAS_TOP_HEADING is true if there is a `@heading' command or
+ `@titlefont' command appearing in the Top element text. This
+ function should be used to format the Top element text and
+ navigation panel.
+
+ - Function Reference: print_Top_footer $filehandle $end_page
+ $FILEHANDLE is the opened filehandle the function should write to.
+ $END_PAGE is true if the element is the last in a page. This
+ function should end the Top element.
+
+
+File: texi2html.info, Node: Contents and Overview text, Next: Footnotes text, Prev: Top element text, Up: Special pages content
+
+Table of contents and Short table of contents
+.............................................
+
+ Several variables may be used to control the formatting of table of
+contents and short table of contents:
+
+`$DO_CONTENTS'
+ If the variable is true a table of contents is done even if there
+ is no `@contents' command.
+
+`$DO_SCONTENTS'
+ If the variable is true a short table of contents is done even if
+ there is no `@summarycontents' command.
+
+`$BEFORE_OVERVIEW'
+ The variable value is inserted before the short table of contents
+ text.
+
+`$AFTER_OVERVIEW'
+ The variable value is inserted after the short table of contents
+ text.
+
+`$BEFORE_TOC_LINES'
+ The variable value is inserted before the table of contents text.
+
+`$AFTER_TOC_LINES'
+ The variable value is inserted after the table of contents text.
+
+`$TOC_LIST_STYLE'
+ This should contain a css style used for the list style if the
+ tables of content are formatted with a list.
+
+`$TOC_LIST_ATTRIBUTE'
+ This should contain an attribute text used for the list element if
+ the tables of content are formatted with a list.
+
+ More control on the table of contents and short table of contents
+formatting may be achieved by redefining a function with the following
+associated function reference:
+
+ - Function Reference: toc_body \@elements
+ \@ELEMENTS is an array reference contining informations about all
+ the elements of the document. Each of the entry of this array is
+ an hash reference which entries correspond with different
+ informations about the element. Interesting keys have the
+ following meaning:
+
+ `top'
+ true if the element is the top element,
+
+ `index_page'
+ true if the element is an index page added because of index
+ splitting,
+
+ `toc_level'
+ level of the element in the table of content. Highest level
+ is 1 for the top element and for chapters, appendix and so on,
+ 2 for section, unnumberedsec and so on...
+
+ `tocid'
+ label used for reference linking to the element in table of
+ contents,
+
+ `file'
+ the file containing the element, usefull to do href to that
+ file in case the document is split,
+
+ `text'
+ text of the element, with section number,
+
+ `name'
+ text of the element, without section number.
+
+ This function doesn't return anything but should fill the array
+ corresponding with the `$Texi2HTML::TOC_LINES' and
+ `$Texi2HTML::OVERVIEW' references with the table of contents and
+ short table of contents.
+
+
+
+File: texi2html.info, Node: Footnotes text, Next: About text, Prev: Contents and Overview text, Up: Special pages content
+
+Formatting of footnotes text
+............................
+
+ The footnotes text is allready formatting when `@footnote' commands
+are expanded. *Note Footnotes::.
+
+
+File: texi2html.info, Node: About text, Prev: Footnotes text, Up: Special pages content
+
+Formatting of about text
+........................
+
+ The default about element contains an explaination of the buttons
+used in the document (`@SECTION_BUTTONS', *Note Button
+specifications::) and an example locating the buttons targets in an
+example. The formatting of this text may be influenced by the following
+hashes and variables:
+
+`$PRE_ABOUT'
+`$AFTER_ABOUT'
+ This variable may be a scalar or a function reference. If it is a
+ scalar, the value is used. If this is a function reference it is
+ expanded and the returned text is used. The text is added before
+ or after the main about text.
+
+`%BUTTONS_GOTO'
+ The keys of this hash are element labels (*note Element labels::).
+ The value is the text associated with the element label in the
+ about text. The element of the hash are defined dynamically, you
+ should in the `init_out' function reference (*note Output
+ initialization::).
+
+`%BUTTONS_EXAMPLE'
+ The keys of this hash are element labels (*note Element
+ labels::). The value is the text associated with the element label
+ in the about example, typically a section number.
+
+
+ If this is not enough and you want to control exactly the formatting
+of the about text, you can redefine the function associated with the
+following function reference:
+
+ - Function Reference: $about_text print_about
+ This function should return the about text.
+
+
+File: texi2html.info, Node: Special pages layout, Prev: Special pages content, Up: Special pages
+
+Customizing the layout of the special pages
+-------------------------------------------
+
+ The formatting of each of the special pages, or section in case the
+document is not split, is controlled by a function. The associated
+function reference is called accordingly:
+
+`print_Top'
+
+`print_Top_header'
+
+`print_Top_footer'
+ Formatting of top element page or section. It is also used for the
+ formatting of the top element text (*note Top element text::).
+
+`print_Toc'
+ Formatting of table of contents page or section
+
+`print_Overview'
+ Formatting of short table of contents page or section
+
+`print_About'
+ Formatting of about (help) page or section
+
+`print_Footnotes'
+ Formatting of footnotes section or page in case footnotes are on a
+ separated page or the document isn't split.
+
+ In the default case, `$print_Top' calls `$print_Top_header' for the
+header and `$print_Top_footer' for the footer of top element. All the
+other function call `$print_misc' which in turn calls
+`$print_misc_header' for the headers and `$print_misc_footer' for the
+footers.
+
+
+File: texi2html.info, Node: File names, Next: External index files, Prev: Special pages, Up: Changing the page layout
+
+Customizing the file names
+==========================
+
+ It is possible to specify the file names with more control than with
+the command line options (*note Output files::). First the extension
+may be overrided by the variable `$EXTENSION' value. Two function
+references enable further customization. One is usefull in case
+`$NODE_FILES' is true and it is used to customize the node file name
+itself and is also used to produce a file name with a redirection
+leading to the node file.
+
+ - Function Reference: ($node_file $redirection_node_file)
+node_file_name $node
+ $NODE is a hash reference with the following interesting keys
+ (there are much more keys):
+ `texi'
+ The texinfo node name.
+
+ `with_section'
+ True if associated with a section.
+ The result is the node file name $NODE_FILE, and the file
+ containing a redirection to the node $REDIRECTION_NODE_FILE.
+
+ The other is usefull if `$NODE_FILES' isn't true. It is used to
+customize the file associated with each element.
+
+ - Function Reference: $file element_file_name $element $is_top
+ $docu_name
+ $ELEMENT is a hash reference with the following interesting keys
+ (there are much more keys):
+ `texi'
+ The texinfo element name.
+
+ `number'
+ The number associated with a section.
+
+ `doc_nr'
+ A number incremented whenever a new file should begin, based
+ on how the document is split (*note Splitting output::).
+
+ `text'
+ The element text.
+
+ `name'
+ The element text without section number.
+ $IS_TOP is true if the element is considered as the top element.
+ $DOCU_NAME is the basename of the texinfo manual. The result is
+ the element file name.
+
+
+File: texi2html.info, Node: External index files, Prev: File names, Up: Changing the page layout
+
+Generation of external files for index entries
+==============================================
+
+ Within the document, `@printindex' commands are expanded as explained
+in *Note Index list::. In case you want to do something special with
+index entries, outside of the document, you should first set the
+variable `$IDX_SUMMARY' true. After that some function reference will
+be called for each non empty index. For each index there are 3 function
+references, one called for initialization, one called for each index
+entry and the last one called for finalazation.
+
+ - Function Reference: index_summary_file_begin $index_name $is_printed
+ $INDEX_NAME is the two letters name for the index. This function
+ is called for each index appearing in the document, before
+ `index_summary_file_entry'. $IS_PRINTED is true if there is a
+ `@printindex' for that index.
+
+ - Function Reference: index_summary_file_entry $index_name $entry_text
+ $entry_reference $formatted_entry $texi_entry
+ $entry_element_reference $entry_element_header $is_printed
+ This function is called for each entry of an index. INDEX_NAME is
+ the name of the index. $ENTRY_TEXT is the entry in plain text,
+ $FORMATTED_ENTRY is the index entry formatted, $TEXI_ENTRY is the
+ entry with texinfo commands. $ENTRY_REFERENCE is the reference
+ placed at the index entry place, in the form `file#id'.
+ $ENTRY_ELEMENT_HEADER is the formatted header of the element
+ containing the index entry. ENTRY_ELEMENT_HEADER is the reference
+ to the beginning of the element containing the index entry, in the
+ form `file#id'. $IS_PRINTED is true if there is a `@printindex'
+ for that index.
+
+ - Function Reference: index_summary_file_end $index_name $is_printed
+ $INDEX_NAME is the two letters name for the index. This function
+ is called for each index appearing in the document, after
+ `index_summary_file_entry'. $IS_PRINTED is true if there is a
+ `@printindex' for that index.
+
+
+File: texi2html.info, Node: Customizing HTML, Next: Internationalization, Prev: Changing the page layout, Up: Top
+
+Customizing HTML and text style in init files
+*********************************************
+
+ Some simple customization may be achieved with the redefinition of
+the variables associated with the command line options. For the
+description and an explanation of the meaning of these variables, *Note
+Style options::.
+
+ Other variables and hash entries can be modified in initialization
+file to achieve more customization. Lastly, functions references
+corresponding with functions called from the main program and
+initialization files may be redefined.
+
+* Menu:
+
+* Three contexts:: there are three different contexts for command
+ expansion: normal text, preformatted text and
+ strings.
+* Commands without argument::
+* Style and accent commands::
+* Anchors images and spaces:: Formatting of `@anchor', `@image', `@sp', `@acronym', `@abbr'
+* Text:: Some characters are processed specially
+* Strings:: `texi2html' write some strings in the output
+ different for each languages
+* References::
+* Alignement commands:: `@center', `@flushleft'...
+* Paragraph and preformatted region::
+* Complex formats:: `@example', `@display'...
+* Lists tables::
+* Definitions::
+* Headings::
+* Special regions:: `@verbatim', `@cartouche', `@quotation'
+* Menus::
+* Indices::
+* Floats and lists of floats:: `@float' and `@listoffloats'
+* Footnotes::
+* Other and unknown commands:: You can handle specifically other commands
+
+
+File: texi2html.info, Node: Three contexts, Next: Commands without argument, Up: Customizing HTML
+
+Three contexts for expansions: preformatted, normal and string
+==============================================================
+
+ There are three contexts of interest, one is the normal context, the
+other is a special context, called the "preformatted" context and the
+last is the string context. The preformatted context occurs when the
+spacing between words is kept. This is the case, for example, in
+`@display' or `@example' regions, and in menu comments (*note Menus::).
+The preformatted regions are usually rendered in `<pre>' elements in
+HTML. The string context occurs when rendering strings without
+formatting elements, in comments or titles for example.
+
+
+File: texi2html.info, Node: Commands without argument, Next: Style and accent commands, Prev: Three contexts, Up: Customizing HTML
+
+Customizing the formatting of commands without argument
+=======================================================
+
+ This includes the commands whose name is a nonletter character like
+`@@', the commands with lettered characters and braces but whose braces
+should be empty, like `@TeX{}', or some commands associated with
+accentted letters like `@AA{}'. If there happens to be something within
+the braces, it is put after the command, thus
+ @TeX{something}
+ leads to the same than
+ @TeX{} something
+
+ Each of these categories of commands have three associated hashes,
+one for normal context, the other for preformatted context and the last
+in strings. The keys of the hashes are the command names, the
+associated value is the text replacing the command.
+
+ The hashes are:
+command type normal text preformatted text string
+one nonlettered character `%simple_map' `%simple_map_pre' `%simple_map_texi'
+nothing in braces `%things_map' `%pre_map' `%texi_map'
+
+ To change the HTML resulting from these constructs, just change the
+value. For example, if you want `&shy;' to be outputted for `@-' in
+normal and preformatted context, write in your init file:
+
+ $simple_map{'-'} = '&shy;';
+ $simple_map_pre{'-'} = '&shy;';
+
+
+File: texi2html.info, Node: Style and accent commands, Next: Anchors images and spaces, Prev: Commands without argument, Up: Customizing HTML
+
+Customizing accent, style and other simple commands
+===================================================
+
+ The formatting of the HTML produced by style and indicatric commands
+(`@tt', `@code', `@email', `@titlefont'), the accentuation related
+commands taking argument (`@'', `@udotaccent', `@dotless') and
+miscalleneous commands (`@email', `@verb', `@w', `@uref', `@math',
+`@asis') is controlled by two hash in the default case, `%style_map'
+for normal context, `%style_map_pre' for preformatted context and
+`%style_map_texi' in string context.
+
+ The key of the hashes are the command names. There are two
+possibilities for the values corresponding with two interfaces. The
+values may be strings or hash references, and you can chose the
+interface depending on the one you prefer. The interface with hash
+reference is a bit more flexible but might also be regarded as more
+complex. If you don't like either of these interfaces you can define
+your own.
+
+ Some remarks are in order:
+
+ * The nonlettered accent commands which following character is
+ considered to be the argument (like in `@`a') should be keys of the
+ hash `%accent_map' hash, even if no value is associated.
+
+ * `@math' is handled differently if LaTeX2HTML is used.
+
+* Menu:
+
+* Hash reference interface::
+* String interface::
+* Define your own interface::
+
+
+File: texi2html.info, Node: Hash reference interface, Next: String interface, Up: Style and accent commands
+
+An interface for commands formatting with a hash reference
+----------------------------------------------------------
+
+ The key of the hashes are the command names. The value determine how
+the command argument is formatted. This value is a reference on a hash.
+In this hash each key corresponds with a type of information for the
+formatting, and the value is the corresponding information. For
+example, in
+
+ $style_map{'command'} = { 'args' => ['code'], 'attribute' => 'code'};
+
+ the arguments for `@command' are interpreted as specified by the
+values associated with the `args' key while the attribute associated
+with that command is `code'.
+
+ The following keys in the hashes associated with each command have
+the following meaning:
+
+`args'
+ The value associated is a reference on an array. Each element of
+ the array defines how the arguments (separated by `,' in the
+ texinfo code) for the @-command should be formatted. The
+ possibilities are
+ `normal'
+ for normal text,
+
+ `code'
+ for text with `---', `--', `''' and ```' kept as is,
+
+ `keep'
+ if the texinfo should be kept as is, without interpretation
+ of the @-commands.
+
+ For example, we have
+ $style_map{'email'}->{'args'} = ['code', 'normal'];
+
+ because `---', `--', `''' and ```' should be kept as is in the
+ first argument of `@email'.
+
+ The default is `['normal']'.
+
+`attribute'
+ If the associated value is a word, it is considered to be an HTML
+ element name, and the argument is enclosed between the element
+ opening and the element closing. For example, if the value is
+ `elem', the resulting HTML is `<elem>ARG</elem>'.
+
+ If the text is a word followed by some text, the word and is
+ interpreted as above, and the text is considered to be the
+ attributes text of the element. Thus `elem class="elem"' leads to
+ `<elem class="elem">ARG</elem>'.
+
+ This works only if there is only one argument.
+
+`begin'
+ The associated value is added in front of the text.
+
+`begin'
+ The associated value is added after the text.
+
+`quotes'
+ If the corresponding value is true, the result is enclosed in
+ quotes `$OPEN_QUOTE_SYMBOL' and `$CLOSE_QUOTE_SYMBOL', with
+ defaults ``' and `''.
+
+`function'
+ The corresponding value should be a function reference. The
+ corresponding function is called with the following arguments:
+
+ `$command'
+ The @-command name
+
+ `$args'
+ A reference on an array containing the arguments of the
+ @-command.
+
+ `$style_stack'
+ A reference on an array containing the name of the @-commands
+ containing the @-command being formatted.
+
+ `$state'
+ A reference on a hash containing a lot of informations about
+ the context of the @-command.
+
+ `$line_nr'
+ An opaque structure containing the information about the line
+ number of the @-command. It can be used to call
+ `main::echo_error' or `main::echo_warning' with first
+ argument a message, and second argument `$line_nr'.
+
+
+File: texi2html.info, Node: String interface, Next: Define your own interface, Prev: Hash reference interface, Up: Style and accent commands
+
+An interface for commands formatting with a string
+--------------------------------------------------
+
+ The keys of the hashes are the command names. The value determine
+how the command argument is formatted. If the value begins with `"',
+the result is enclosed in quotes `$OPEN_QUOTE_SYMBOL' and
+`$CLOSE_QUOTE_SYMBOL', with defaults ``' and `''.
+
+ The command argument is allready formatted as HTML. The remaining
+of the value text (or the value text if there were no `"') is
+interpreted as follow:
+
+ * If the text is empty the argument of the command is left as is.
+
+ * If the text is a `&' followed by a name, like `&function', the
+ name is considered to be a function name, and this function is
+ called to format the argument of the command. The first argument
+ of the function is the command name, the second is the command
+ argument. For example, if the value associated with the
+ (fictituous) command `@foo' is `&my_func' and we have:
+
+ sub my_func
+ {
+ my @args = split /,\s*/ $_[1];
+ return "$_[0]: $args[0]" if ($args[1] = 1);
+ return "$args[0]";
+ }
+
+ The result of
+ @foo{truc, 1}
+ @foo{truc, bidule}
+ will be
+ foo: truc
+ truc
+
+ * If the text is a word, it is considered to be an HTML element
+ name, and the argument is enclosed between the element opening and
+ the element closing. For example, if the value is `elem', the
+ resulting HTML is `<elem>ARG</elem>'. Similarly `"quoted' leads to
+ ``<quoted>ARG</quoted>''.
+
+ * If the text is a word followed by some text, the word and is
+ interpreted as above, and the text is considered to be the
+ attributes text of the element. Thus `elem class="elem"' leads to
+ `<elem class="elem">ARG</elem>'.
+
+
+File: texi2html.info, Node: Define your own interface, Prev: String interface, Up: Style and accent commands
+
+Defining the style and indicatric commands interface
+----------------------------------------------------
+
+ If you don't like this scheme, it is possible to change how those
+commands are processed by redefining the following function reference:
+
+ - Function Reference: $resulting_text style $style $command $text
+ $args $no_close $no_open $line_nr $state $style_stack
+ $COMMAND is the @-command, $STYLE is the value associated with the
+ $COMMAND in the `%style_map', `%style_map_pre' or
+ `%style_map_texi' hashes. The $TEXT is the text appearing within
+ the @-command braces. ARGS is a reference on an array contening
+ the command arguments formatted according to the same conventions
+ than with the reference hash style (provided the value associated
+ with the @-command is a hash reference with a $ARG key as
+ described in *Note Reference hash args::). If $TEXT is split in
+ paragraphs each paragraph is passed through the function, and
+ $NO_CLOSE is true if it is not the last paragraph, while $NO_OPEN
+ is true if it is not the first paragraph. $LINE_NR is an opaque
+ structure containing the information about the line number of the
+ @-command. It can be used to call `main::echo_error' or
+ `main::echo_warning' with first argument a message, and second
+ argument `$line_nr'. $STATE is a reference on a hash containing a
+ lot of informations about the context of the @-command.
+ $STYLE_STACK is a reference on an array containing the name of the
+ @-commands containing the @-command being formatted.
+
+
+
+File: texi2html.info, Node: Anchors images and spaces, Next: Text, Prev: Style and accent commands, Up: Customizing HTML
+
+Formatting of special simple commands
+=====================================
+
+ The formatting of special simple commands is controlled by
+functions. To customize the output, the corresponding function
+references should be redefined. All these functions return a formatted
+text.
+
+ The formatting of anchors is controlled by `$anchor', but the
+function associated with the function reference does more, it is usefull
+to produce a reference target or link.
+
+ - Function Reference: $anchor anchor $identifier $href $text
+ $attributes
+ If $IDENTIFIER is not empty, this value should be used to create a
+ target for links (typically associated with a name or id attribute
+ in HTML). The $HREF argument specifies a hpertextual reference
+ which should be used to link to a target. In case both
+ $IDENTIFIER and $HREF are given the text produced should be both
+ a target for $IDENTIFIER and a link to $HREF. $TEXT is the text
+ to be displayed. $ATTRIBUTES are additional attributes. It
+ should be reasonable to assume that the attributes are for a `<a>'
+ HTML element.
+
+ The formatting of `@image' is controlled by:
+
+ - Function Reference: $image image $file_path $basename $preformatted
+ $file_name
+ $FILE_PATH is the image file name with the path, $BASENAME is the
+ alternate text or the file name without extension if no alternate
+ text is given. $PREFORMATTED is true if the image appears in
+ preformatted text. $FILE_NAME is the file name without path but
+ with extension.
+
+ The formatting of `@sp' is controlled by:
+
+ - Function Reference: $sp sp $number $preformatted
+ $NUMBER is the numeric argument of `@sp'. $PREFORMATTED is true
+ if the `@sp' appears in preformatted text.
+
+ The formatting of `@acronym' and `@abbr' is controlled by:
+
+ - Function Reference: $acronym acronym_like $acronym_texi
+ $acronym_text $with_explanation \@explanation_lines
+ $explanation_text $explanation_simply_formatted
+ $ACRONYM_TEXI is the acronym argument with texinfo @-commands,
+ $ACRONYM_TEXT is formatted.
+
+ The other arguments are related with the explanation, the second
+ arg of the acronym. $WITH_EXPLANATION is true if the second
+ argument of the acronym command is present. If an explanation
+ exists, coming from previous `@acronym' or as an arg of this
+ command, the other args are defined: \@EXPLANATION_LINES is a
+ reference on an array containing the unformatted explanation lines,
+ $EXPLANATION_TEXT is the explanation text formatted,
+ $EXPLANATION_SIMPLY_FORMATTED is the explanation with a light
+ formatting, unabling in HTML (or XML) the explanation to be in an
+ attribute.
+
+
+File: texi2html.info, Node: Text, Next: Strings, Prev: Anchors images and spaces, Up: Customizing HTML
+
+Processing special characters in text
+=====================================
+
+ Some characters are processed especially in text: `---', `--', ```'
+and `'''. This is done only if in normal text and not in some commands
+(`@code', `@env'...). A function reference is called to process those
+characters in text
+
+ - Function Reference: $processed_text normal_text $text
+ The function processes `---', `--', ```' and `''' in $TEXT and
+ returns $PROCESSED_TEXT. The default is to change `---' to `--',
+ `--' to `-', and ```' and `''' to `"'.
+
+ Some characters are special in HTML (`&', `"', `<' and `>') and
+should be protected. This is done by the function associated with the
+function reference
+
+ - Function Reference: $protected_text protect_text $text
+ The function processes the unprotected text $TEXT and returns the
+ resulting protected text $PROTECTED_TEXT.
+
+ Empty lines are processed by the following function reference, which
+could be usefull if empty lines are to be removed for example
+
+ - Function Reference: $resulting_text empty_line $empty_line
+ This function processes an $EMPTY_LINE and returns the resulting
+ text $RESULTING_TEXT. Empty lines are left as is by default.
+
+
+File: texi2html.info, Node: Strings, Next: References, Prev: Text, Up: Customizing HTML
+
+Customizing strings written by `texi2html'
+==========================================
+
+ `texi2html' writes some strings in the generated document at various
+places, at the page footers, on the help page, for special section
+headings, buttons alt text and so on. These strings are customizable.
+The string chosen depends on the language of the document (set by
+`--lang', `$LANG' or `@documentlanguage'). This is the basis for
+internationalization as it allows for strings translations.
+
+ The strings are found in a hash reference, `$LANGUAGES'. Each key
+is a language code. The associated value is also a hash reference. The
+key is an english string and the associated value is the string
+replacing the english string, if present. For example, we have
+
+ $LANGUAGES->{'fr'} = {
+ ' Up ' => 'Plus haut',
+ };
+
+ It means that whenever the string ` Up ' is to be written and the
+language is `fr', `Plus haut' is written. It is possible to customize
+the english strings by redefining the `en' language hash.
+
+ When a string contains a `%' followed by `{' NAME `}' it means that
+the string will be expanded by `texi2html'. For example, if we have
+
+ $LANGUAGES->{'fr'} = {
+ 'See %{node_file_href}' => 'Voir %{node_file_href}',
+ };
+
+ `%{node_file_href}' will be expanded to an href for a node in a file
+by `texi2html' in the string. A `%%' will be expanded as `%'.
+
+ For more on internationalization, see *Note Internationalization::.
+
+
+File: texi2html.info, Node: References, Next: Alignement commands, Prev: Strings, Up: Customizing HTML
+
+References
+==========
+
+* Menu:
+
+* Reference to external manual::
+* Internal reference::
+
+
+File: texi2html.info, Node: Reference to external manual, Next: Internal reference, Up: References
+
+Reference to external manual
+----------------------------
+
+ The references are produced with two function references, one for the
+hypertextual reference construction, the other for the full reference to
+external manual.
+
+ - Function Reference: $href external_href $node $node_identifier
+ $xml_node_identifier $manual_file_name
+ $NODE is the node name, with @-commands. $NODE_IDENTIFER is the
+ node name mapped to an identifier acceptable as a file name.
+ $XML_NODE_IDENTIFIER is the node name mapped to an identifier
+ acceptable as an XML identifier. Those identifiers are built as
+ explained in *Note HTML Xref: (texinfo)HTML Xref, thus allowing
+ for cross references to external manuals. $FILE is the manual or
+ file name of the external reference. This function should return an
+ href leading to the external manual.
+
+ The default for this function is to make a reference compatible
+ with `makeinfo' (*note HTML Xref: (texinfo)HTML Xref.).
+
+ - Function Reference: $text external_ref $command $section $book
+ $node_and_file $href $cross_ref_name
+ This function formats a reference to an external texinfo manual.
+ The $COMMAND is the ref command (`ref', `xref' or `pxref', in
+ text, at sentence beginning or in parenthesis). The optionnal
+ $SECTION argument is the section in the book and BOOK is the book
+ title. $NODE_AND_FILE is the node and file name formatted
+ according to the convention used in info: `(file)node'. $HREF it
+ an hypertextual reference to the distant manual constructed using
+ the above function. $CROSS_REF_NAME is an optionnal cross
+ reference name appearing in the reference command. This function
+ returns the text corresponding with the external html manual
+ reference. This function returns the full formatted text of the
+ external reference.
+
+
+File: texi2html.info, Node: Internal reference, Prev: Reference to external manual, Up: References
+
+Reference to an internal node
+-----------------------------
+
+ A function reference is available for internal references.
+
+ - Function Reference: $text internal_ref $command $href $short_name
+ $name $is_section
+ This function formats a reference to a node in the current manual.
+ The $COMMAND is the ref command (`ref', `xref' or `pxref', in
+ text, at sentence beginning or in parenthesis). $HREF it an
+ hypertextual reference linking to the corresponding node or
+ section. $SHORT_NAME and $NAME hold the text for the reference but
+ $SHORT_NAME can be the node name which is assumed to be shorter
+ than the section name. $IS_SECTION is a boolean true if the
+ reference is a reference to a section. This function returns the
+ full formatted text of the internal reference.
+
+
+File: texi2html.info, Node: Alignement commands, Next: Paragraph and preformatted region, Prev: References, Up: Customizing HTML
+
+Commands used for centering and flushing of text
+================================================
+
+ When a command controlling the alignement of text is used (`@center',
+`@flushleft' and `@flushright'), the main program takes care of opening
+and closing paragraphs. The alignement commands are the key of the
+`%paragraph_style' hash. The value is used in the function doing the
+formatting of the paragraphs. *Note Paragraph and preformatted
+region::.
+
+ A function references allows for a customization of the formatting
+of the text appearing in the command block.
+
+ - Function Reference: $result paragraph_style_command $command $text
+ $COMMAND is the command name, $TEXT is the text appearing within
+ the command. This function returns a formatted text. The default
+ is to return the text unmodified.
+
+
+File: texi2html.info, Node: Paragraph and preformatted region, Next: Complex formats, Prev: Alignement commands, Up: Customizing HTML
+
+Formatting or not a paragraph or a preformatted region
+======================================================
+
+* Menu:
+
+* Paragraph and preformatted formatting::
+* Avoiding paragraphs::
+
+
+File: texi2html.info, Node: Paragraph and preformatted formatting, Next: Avoiding paragraphs, Up: Paragraph and preformatted region
+
+Paragraph and preformatted region formatting
+--------------------------------------------
+
+ The formatting of a paragraph region or a preformatted region, is
+controlled by function references:
+
+ - Function Reference: $paragraph_text paragraph $text $alignement
+ $formatting_command $formatting_command_formatted
+ \$paragraph_number $format $item_number $enumerate_style
+ $number
+ This function formats a paragraph. $TEXT is the text of the
+ paragraph, $ALIGNEMENT is the empty string when no alignement
+ command has been seen, otherwise it is the current alignement
+ command name. *Note Alignement commands::.
+
+ The remaining arguments are usefull when the paragraph appears
+ within a list or table. It is usefull whenever the paragraph has
+ to be formatted differently when appearing in such environments.
+ Moreover in that case the format command (`@itemize'...) may have
+ an associated formatting command. $FORMATTING_COMMAND is this
+ formatting command (like `@minus'). $FORMATTING_COMMAND_FORMATTED
+ is the command formatted in html in case the formatting command is
+ a leading command (like `@minus') which should be leading the
+ first paragraph. \$PARAGRAPH_NUMBER is a reference on the number
+ of paragraphs in that format command. The corresponding variable
+ should be increased when a paragraph is added. $FORMAT is the
+ format command. *Note Table and list items::.
+
+ If the $FORMAT is an enumerate, $ITEM_NUMBER is the number of the
+ item in the list, $ENUMERATE_STYLE is the argument of the
+ enumerate, $NUMBER is the number or letter corresponding with this
+ item.
+
+ - Function Reference: $preformatted_text preformatted $text $style
+ $region_name $formatting_command
+ $formatting_command_formatted \$preformatted_number $format
+ $item_number $enumerate_style $number
+ This function formats a preformatted region. $TEXT is the text of
+ the preformatted region, $STYLE is the css style associated with
+ that preformatted region (*Note css::). $REGION_NAME is the name
+ of the command opening the preformatted region (`example'..., see
+ *Note Complex formats::) or a identifier for the preformatted
+ context (for example `menu-comment', see *Note Menus::). The
+ alignment commands are not taken into account, as the spaces are
+ preserved in preformatted regions, you should flush and center by
+ hand.
+
+ The remaining arguments are usefull when the preformatted region
+ appears within a list or table. It is usefull whenever the
+ preformatted region has to be formatted differently when appearing
+ in such environments. Moreover in that case the format command
+ (`@itemize'...) may have an associated formatting command.
+ $FORMATTING_COMMAND is this formatting command (like `@minus').
+ $FORMATTING_COMMAND_FORMATTED is the command formatted in html in
+ case the formatting command is a leading command (like `@minus')
+ which should be leading the first preformatted region.
+ \$PREFORMATTED_NUMBER is a reference on the number of preformatted
+ regions in that format command. The corresponding variable should
+ be increased when a preformatted region is added. $FORMAT is the
+ format command. *Note Table and list items::.
+
+ If the $FORMAT is an enumerate, $ITEM_NUMBER is the number of the
+ item in the list, $ENUMERATE_STYLE is the argument of the
+ enumerate, $NUMBER is the number or letter corresponding with this
+ item.
+
+
+File: texi2html.info, Node: Avoiding paragraphs, Prev: Paragraph and preformatted formatting, Up: Paragraph and preformatted region
+
+Avoiding paragraphs in formats
+------------------------------
+
+ It is possible to avoid that a format closes the previous paragraph
+or preformatted region and reopens one, by putting the format command
+in a hash, `%format_in_paragraph' with a true value.
+
+
+File: texi2html.info, Node: Complex formats, Next: Lists tables, Prev: Paragraph and preformatted region, Up: Customizing HTML
+
+Formatting of complex formats (`@example', `@display'...)
+=========================================================
+
+ Here we see how a whole complex format is formatted. For the
+formatting of the text, see *Note Paragraph and preformatted region::.
+
+ The formatting of the complex formats is ultimately controlled by a
+function, however the default for this function uses a hash reference
+and changing the hash reference values should be enough in most cases.
+This hash reference is called `$complex_format_map'. It has a key for
+each of the complex format commands (`example', `smallexample', `lisp',
+`smalllisp', `display', `smalldisplay', `format', `smallformat').
+
+ The associated value is also a reference on a hash. The keys are
+`begin' and `end'. An eval of `begin' should lead to the beginning of
+the formatted HTML, an eval of `end' should lead to the end of the
+formatted HTML. The enclosed text will be formatted as described in
+*Note Paragraph and preformatted region::, and the name of the complex
+format will be available to the function formatting the text.
+
+ If you aren't satisfied with this scheme, you can redefine the
+following function reference for a better control over the complex
+format formatting:
+
+ - Function Reference: $complex_format_text complex_format $format_name
+ $preformatted_text
+ $FORMAT_NAME is the complex format name, $PREFORMATTED_TEXT is the
+ text allready formatted as described in *Note Paragraph and
+ preformatted region::. This function returns the whole complex
+ format.
+
+
+File: texi2html.info, Node: Lists tables, Next: Definitions, Prev: Complex formats, Up: Customizing HTML
+
+Customizing the formatting of lists and tables
+==============================================
+
+ The formatting of lists and tables is done at two levels:
+ * At the level of the whole region (table or list),
+
+ * At the level of the individual items, rows or cells of the list or
+ table.
+
+* Menu:
+
+* Table and list items::
+* Whole table list::
+
+
+File: texi2html.info, Node: Table and list items, Next: Whole table list, Up: Lists tables
+
+Formatting individual table and list items
+------------------------------------------
+
+ In texinfo it is possible to give `@itemize' or table command
+(hereafter called a "format command") a "formatting command". For
+example `@minus' is the formatting command here:
+ @table @minus
+
+ The default is to apply the command to the text item, however it is
+possible to avoid it. The hash `%special_list_commands' has an entry
+for each of the format command. Each of these entries is a hash
+reference. If a formatting command is a key of the hash reference, then
+the formatting command is not applied to the text item for that format
+command. For example, if we have:
+
+ $special_list_commands{'itemize'} = { 'bullet' => '' };
+
+ and we have the following `@itemize':
+ @itemize @bullet
+ @item an item
+ @end itemize
+
+ then `@bullet' will not be applied to `an item'.
+
+_lists_
+ The items of lists are formatted using the following function
+ reference:
+
+ - Function Reference: $list_item list_item $text $format $command
+ $formatted_command $item_number $enumerate_style $number
+ This function formats the text between `@item' commands. $TEXT
+ is the text corresponding with the item. $FORMAT is the type
+ of format, `itemize' or `enumerate'. $COMMAND is the
+ formatting command given in argument to `@itemize',
+ $FORMATTED_COMMAND is this command formatted if it is a
+ leading command, like `@minus'.
+
+ If the $FORMAT is an enumerate, $ITEM_NUMBER is the number of
+ the item in the list, $ENUMERATE_STYLE is the argument of the
+ enumerate, $NUMBER is the number or letter corresponding with
+ this item.
+
+_two column tables_
+ The two columns tables (`@table', `@ftable' and `@vtable'), items
+ are formatted using two function references, one for the first
+ line located on the `@item' line corresponding with the first
+ column, the other for the text appearing on the following lines,
+ corresponding with the second column text.
+
+ - Function Reference: $table_item table_item $item_text
+ $index_label_text $format $command $formatted_command
+ This function is used to format the text on the `@item' line.
+ $TEXT_ITEM is the text line. In case there is an index entry
+ associated with the `@item' (as with `@ftable' and
+ `@vtable'), $INDEX_LABEL_TEXT is the text inserted at the
+ place where an index entry appears. *Note Index entry place::.
+ $FORMAT is the type of format, `table', `ftable' or `vtable'.
+ $COMMAND is the formatting command given in argument to the
+ table format command, $FORMATTED_COMMAND is this command
+ formatted if it is a leading command, like `@minus'.
+
+ - Function Reference: $table_line table_line $text
+ This function is used to format the text on the lines
+ following the `@item' line. $TEXT is the corresponding text.
+
+_multitable_
+ The multitable elements formatting is controlled by the functions
+ associated with two function references. One for a cell, and the
+ other for a row.
+
+ - Function Reference: $multitable_cell cell $text
+ This function is used to format the text of a multitable
+ cell, the text following a `@item' or a `@tab'. $TEXT is the
+ corresponding text.
+
+ - Function Reference: $multitable_row row $text $item_command
+ This function is used to format a multitable row. $TEXT is
+ the row text, with cells allready formatted with the `$cell'
+ function reference. $ITEM_COMMAND is the command used to
+ introduce the row, such that it is possible to distinguish
+ between `@item' and `@headitem'.
+
diff --git a/Build/source/utils/texi2html/doc/texi2html.info-3 b/Build/source/utils/texi2html/doc/texi2html.info-3
new file mode 100644
index 00000000000..29fade237c7
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texi2html.info-3
@@ -0,0 +1,1085 @@
+This is texi2html.info, produced by makeinfo version 4.5 from
+texi2html.texi.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+INFO-DIR-SECTION Texinfo documentation system
+START-INFO-DIR-ENTRY
+* Texi2HTML: (texi2html). Texinfo to HTML Converter.
+END-INFO-DIR-ENTRY
+
+ This file, last updated 1 February 2005, documents the `texi2html'
+script which converts Texinfo (http://www.texinfo.org) into HTML
+(http://w3c.org). This edition is for `texi2html' version 1.76.
+
+Copyright (C) 1999, 2000, 2001, 2002, 2003 Free
+Software Foundation, Inc.
+
+Portions
+of
+`texi2html'
+ Copyright (C) 1999, 2000 Lionel Cons
+ Copyright (C) 1999, 2000 Karl Berry
+ Copyright (C) 1999, 2000 Olaf Bachmann
+ Copyright (C) 2002, 2003 Patrice Dumas
+ Copyright (C) 2001, 2002, 2003 Derek Price
+ Copyright (C) many others.
+
+
+Portions
+of this
+manual
+ Copyright (C) 1999, 2000 Karl Heinz Marbaise (manual)
+ Copyright (C) 2003 Patrice Dumas (manual)
+ Copyright (C) 2003 Derek Price (manual)
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+
+File: texi2html.info, Node: Whole table list, Prev: Table and list items, Up: Lists tables
+
+Formatting of a whole table or list
+-----------------------------------
+
+ If the Texinfo command is a key of the `%format_map', the associated
+value is used to specify the formatting of the construct, otherwise a
+function is called. The value in `%format_map' associated with a
+command is interpreted similarly with values associated with more
+simpler commands:
+
+ * If the text is a word, it is considered to be an HTML element
+ name, and the whole table or list is enclosed between the element
+ opening and the element closing.
+
+ * If the text is a word followed by some text, the word and is
+ interpreted as above, and the text is considered to be the
+ attributes text of the element.
+
+ * If the text is empty nothing is added to the text.
+
+ In case the `%format_map' isn't used, a function reference called
+`$table_list' should be redefined, the associated function will be
+called each time a command isn't found in `%format_map'.
+
+ - Function Reference: $whole_table_list table_list $command $text
+ $COMMAND is the Texinfo command name, $TEXT is the formatted items.
+
+ If you still want to use `%format_map' but differently from the
+default, it is possible to redefine the following function reference:
+
+ - Function Reference: $whole_table_list format $command $format $text
+ $COMMAND is the @-command, $FORMAT is the entry associated with
+ $COMMAND in `%format_map'. $TEXT is the formatted items.
+
+
+File: texi2html.info, Node: Definitions, Next: Headings, Prev: Lists tables, Up: Customizing HTML
+
+Definition commands formatting
+==============================
+
+ The formatting of definition commands is controlled by a hash and
+four functions. The hash describes how the text on the definition line
+is interpreted, the functions control the formatting of the definition
+line and the definition function text.
+
+* Menu:
+
+* Definition line::
+* Definition formatting::
+
+
+File: texi2html.info, Node: Definition line, Next: Definition formatting, Up: Definitions
+
+Customizing the interpretation of a definition line
+---------------------------------------------------
+
+ The keys of the hash `%def_map' are definition command names. There
+are two types of entries:
+
+ * If the command is a shortcut for another definition command the
+ value is a text and the definition command is replaced by the text.
+
+ For example if we have:
+ $def_map{'deftruc'} = '@defvr {A truc}';
+
+ and a line like
+ @deftruc var
+
+ the line will be transformed in
+ @defvr {A truc} var
+
+ * If the command isn't a shortcut, it is associated with an array
+ reference. The first element is `f', `v' or `t' corresponding with
+ the index type (`f' for function, `v' for variable, `t' for type).
+
+ The remaining of the array describes how to interpret the text
+ following the definition command on the definition command line.
+ The entry item specify what corresponds with the next bracketed
+ item or word. Currently the possibilities are `category', `name',
+ `type', `class' and `arg'.
+
+ For example if we have
+ def_map{'defvr'} = [ 'v', 'category', 'name' ];
+
+ The first bracketed item following `@defvr' is considered to be
+ the category and the next one is the name. The index associated
+ with the definition line is the variables index.
+
+
+File: texi2html.info, Node: Definition formatting, Prev: Definition line, Up: Definitions
+
+Customization of the definition formatting
+------------------------------------------
+
+ Four functions are used when formatting a definition command:
+
+category name
+ - Function Reference: $category definition_category
+ $category_or_name $class $style
+ This function precise a category or an index entry name
+ associating a class $CLASS (if given) with $CATEGORY_OR_NAME.
+ The $STYLE of the definition may be `f', for function, `v',
+ for variable or `t', for type.
+
+formatting of the definition line
+ - Function Reference: $line def_line $category $name $type
+ $arguments $index_label
+ This function formats the definition line. $CATEGORY is the
+ category formatted with `$definition_category', $NAME, $TYPE
+ and ARGUMENTS are the element of the definition line.
+ $INDEX_LABEL is the text inserted at the place where an index
+ entry appears. *Note Index entry place::.
+
+definition text
+ - Function Reference: $definition_text def_item $text
+ This function formats the definition text, $TEXT.
+
+the whole definition
+ - Function Reference: $definition def $text
+ This function formats the whole definition. The definition
+ line and text formatted by the above functions are in $TEXT.
+
+
+
+File: texi2html.info, Node: Headings, Next: Special regions, Prev: Definitions, Up: Customizing HTML
+
+Customizing headings formatting
+===============================
+
+ A function controls the formatting of sectioning element headings,
+with the corresponding function reference:
+
+ - Function Reference: $heading_text heading \%element_reference
+ The \%ELEMENT_REFERENCE is a reference on a hash corresponding
+ with the sectioning element. The following keys are of interest:
+ `text'
+ The heading text
+
+ `name'
+ The heading text without section number
+
+ `node'
+ true if the sectioning element is a node without associated
+ structuring command
+
+ `level'
+ The level of the element in the document tree. `0' is for
+ `@top', `1' for `@chapter' and so on
+
+ `tag_level'
+ the sectioning element name, with `@raisesections' and
+ `@lowersections' taken into account
+
+
+File: texi2html.info, Node: Special regions, Next: Menus, Prev: Headings, Up: Customizing HTML
+
+Formatting of special regions (`@verbatim', `@cartouche', `@quotation')
+=======================================================================
+
+ Regions corresponding with raw text, like `@verbatim', `@html' or
+`@tex' are formatted according to the following function reference:
+
+ - Function Reference: $raw_region raw $command $text
+ $COMMAND is the command name, $TEXT is the raw text.
+
+ If LaTeX2HTML is used, `@tex' regions are handled differently, from
+within the main program.
+
+ The `@cartouche' command formatting is controlled by the function
+reference:
+
+ - Function Reference: $cartouche cartouche $text
+ $TEXT is the text appearing within the cartouche.
+
+ The formatting of `@quotation' is controlled by two function
+references. The first one is usefull in case the `@quotation' has an
+argument, as it allows to prepend a string to the quotation text:
+
+ - Function Reference: $prepended_string quotation_prepend_text $style
+ $text
+ $STYLE is the first argument of the `@quotation' if there are two
+ arguments. $TEXT is the second argument or the first if there is
+ one argument. There are still @-commands in these strings. This
+ function can return a string which will be prepended to the
+ quotation text.
+
+ The whole quotation is formatted by:
+
+ - Function Reference: $quotation quotation $quotation_text
+ $argument_text $argument_style_texi $argument_style_id
+ $QUOTATION_TEXT is the quotation text, formatted, with the text
+ prepended by the function above. $ARGUMENT_TEXT is the second
+ argument of the `@quotation' or the first if there is one
+ argument, formatted. The other arguments are defiend if there are
+ two arguments for the `@quotation', $ARGUMENT_STYLE_TEXI is this
+ argument, with @-commands, and $ARGUMENT_STYLE_ID is this
+ argument transformed in an identifier which can be used as an XML
+ identifier.
+
+
+File: texi2html.info, Node: Menus, Next: Indices, Prev: Special regions, Up: Customizing HTML
+
+Menu formatting
+===============
+
+ To understand how the formatting of menus is controlled, the
+different parts of a menu are first described, then how to control the
+formatting of each of these parts.
+
+* Menu:
+
+* Menu parts:: A menu consists in menu entry and menu
+ comments
+* Menu formatting::
+
+
+File: texi2html.info, Node: Menu parts, Next: Menu formatting, Up: Menus
+
+The structure of a menu
+-----------------------
+
+ In `texi2html', a menu is considered to be composed of 2 parts, the
+"menu entries" and the "menu comments". Menu entries are further
+divided in an "entry link" and optionnaly an "entry description". The
+entry link consists in a node name and an optionnal menu entry name.
+
+ A menu entry begins with `*' at the beginning of the line. It begins
+with the entry link, followed by the description. The description spans
+until the next menu entry, or some text begining at the first character
+of a line or an empty line, not contained within a command block which
+begun in the description. An empty line or a line with text at the
+first character starts a menu comment, which spans until the next menu
+entry.
+
+ Here is an illustration of these rules:
+
+ @menu
+ * node name: entry name. description begins
+ description continues
+ * another menu entry::
+ description begins
+ description continues
+
+ A menu comment, after an empty line
+
+ * node:: description begins
+ A menu comment. The line starts at the first character
+
+ * last entry:: description begins _text
+ of the description, even if the line begins at the first character,
+ because we are in @emph_.
+ @end menu
+
+
+File: texi2html.info, Node: Menu formatting, Prev: Menu parts, Up: Menus
+
+The formatting of the different menu components
+-----------------------------------------------
+
+ In the default case, the name of the section corresponding with the
+node is used instead of the node name. If `$NODE_NAME_IN_MENU' is true,
+however, node names are used. If `$AVOID_MENU_REDUNDANCY' is true and
+menu entry equal menu description the description isn't printed. This
+is the default. Likewise, if node or section name equal entry name, do
+not print entry name.
+
+ A symbol, `$MENU_SYMBOL' is put at the beginning of menu entries
+when the node name is used. The default is `&bull;'. If
+`$UNNUMBERED_SYMBOL_IN_MENU' is true it is also put at the beginning of
+unnumbered section names. This is not done by default.
+
+ The menu comments are considered to be preformatted text. The style
+associated with this preformatted text is determined by
+`$MENU_PRE_STYLE'. Default is `font-family: serif'. The css class
+associated with menu comments is `menu-comments'.
+
+ Three function references are associated with the formatting of the
+different parts of a menu:
+
+ - Function Reference: $link menu_link $section \%state $href $node
+ $name $ending
+ $SECTION is the section name corresponding with the link, $HREF is
+ the link hypertextual reference. $HREF may be absent. \%STATE
+ holds informations about the current context. The only key which
+ could be of interest is `preformatted', true if the context is a
+ preformatted context. *Note Three contexts::. $NODE is the node
+ name, $NAME is the name of the node, and $ENDING is the text
+ ending the link entry.
+
+ - Function Reference: $description menu_description $description_text
+ \%state
+ $DESCRIPTION_TEXT is the text of the menu description. \%STATE
+ should be used similarly than for the menu link.
+
+ - Function Reference: $menu_comment menu_comment $text
+ $TEXT is the text of the menu comment. It is in a preformatted
+ environment.
+
+ The following function reference controls the formatting of a wole
+menu:
+
+ - Function Reference: $menu menu $menu_components_text
+ $MENU_COMPONENTS_TEXT is the formatted menu components text,
+ obtained as explained above.
+
+ The last function reference corresponds with a special case. It is
+used when a menu entry appears within another block command, to avoid
+the possibilities of invalid HTML production. In that case the menu
+description and menu comments are not formatted specially, but treated
+like normal text.
+
+ - Function Reference: $link simple_menu_link $link_text $href $node
+ $name $ending
+ $LINK_TEXT is the text corresponding with the link name, $HREF is
+ the link hypertextual reference. $NODE is the node name, $NAME is
+ the name of the node, and $ENDING is the text ending the link
+ entry.
+
+
+File: texi2html.info, Node: Indices, Next: Floats and lists of floats, Prev: Menus, Up: Customizing HTML
+
+Indices formatting
+==================
+
+ Two different things needs to be handled for indices formatting, the
+place where the index term appears, the index entry, and the index list
+itself. The indexing commands like `@cindex' determines where index
+entries appear, and the index list is printed with a `@printindex'
+command.
+
+* Menu:
+
+* Index entry place:: Index entries in the main document are
+ targets for hypertext references
+* Index list:: Customizing the formatting of the index list
+
+
+File: texi2html.info, Node: Index entry place, Next: Index list, Up: Indices
+
+Formatting of index entries
+---------------------------
+
+ Index entry places in the main text may be the target for hypertext
+references. Their formatting is controlled by the function associated
+with the following function reference:
+
+ - Function Reference: $target index_entry_label $identifier
+ $preformatted
+ $IDENTIFIER should be used to create a target for links (typically
+ associated with a name or id attribute in HTML). $PREFORMATTED is
+ true if the index entry appeared in preformatted text.
+
+
+File: texi2html.info, Node: Index list, Prev: Index entry place, Up: Indices
+
+Customizing the formatting of index lists
+-----------------------------------------
+
+ The index entries are sorted alphabetically. A whole index list is
+considered to be composed of letter entries. A letter entry is composed
+by all the index entries beginning with that letter. A letter may be a
+non alphabetical character, but we call it letter here.
+
+ An index summary appears at the beginning and at the end of an index
+list, and should be used to jump directly to a letter entry. Indices
+lists may be split across pages, thus the different letters may appear
+on different files. The number of index entries appearing on each page
+is determined by a variable `$SPLIT_INDEX' if set. The default is to
+split indices after 100 entries.
+
+ The formatting of all these elements is controlled by the following
+function references:
+
+_formatting of a letter in a summary_
+ - Function Reference: $letter summary_letter $letter $file
+ $identifier
+ This function is used to format a letter appearing in a
+ summary, refering to a letter entry in the index list.
+ $LETTER is the letter. $FILE is the file name where the letter
+ entry appears. More precisely, it is empty when the letter
+ entry is on the same page than the summary, it contains the
+ file name when the index page is split accross page.
+ $IDENTIFIER is an identifier for the target letter entry.
+
+_formatting of a summary_
+ - Function Reference: $summary index_summary
+ \@alphabetical_letters \@nonalphabetical_letters
+ \@ALPHABETICAL_LETTERS and \@NONALPHABETICAL_LETTERS contain
+ the formatted summary letters, formatted with the above
+ function.
+
+_formatting of an index entry_
+ - Function Reference: $entry index_entry $entry_href $entry_text
+ $section_href $section_heading
+ $ENTRY_HREF is a reference to the place where the index entry
+ appeared, $ENTRY_TEXT is the corresponding text. $SECTION_HREF
+ is a reference to the beginning of the sectioning element
+ containing the index entry, $SECTION_HEADING is the heading
+ of the element.
+
+_formatting of letter entry_
+ - Function Reference: $letter_entry index_letter $letter
+ $identifier $index_entries_text
+ This function formats a letter entry, consisting in all the
+ index entries beginning with this letter. $LETTER is the
+ letter, $IDENTIFIER should be used to create a target for
+ links (typically links from summaries), and
+ $INDEX_ENTRIES_TEXT is the text of the index entries
+ formatted as described above.
+
+_formatting of whole index_
+ - Function Reference: $index print_index $index_text $index_name
+ $INDEX_TEXT is the text of all the index entries grouped by
+ letter appearing in that page formatted as above. INDEX_NAME
+ is the name of the index, the argument of `@printindex'.
+
+
+File: texi2html.info, Node: Floats and lists of floats, Next: Footnotes, Prev: Indices, Up: Customizing HTML
+
+Floats and lists of floats
+==========================
+
+ Floats appear in the `@float' environment, optionaly with a style
+and a label, and with optionnal `@caption' and `@shortcaption'. Their
+list appear after a `@listoffloats'.
+
+ A hash reference is associated with each float, it is available in
+some formatting functions. The keys are:
+`caption_texi'
+`shortcaption_texi'
+ A reference on an array containing the caption or shortcaption
+ lines, unformatted.
+
+`style_texi'
+ The style with texi @-commands.
+
+`style_id'
+ The unique identifier associated with the style.
+
+`nr'
+ The number with the same conventions than makeinfo (use the
+ chapter number a dot and then the number of the float of that
+ style in the chapter, or an absolute number if in unnumbered).
+
+`chapter_nr'
+ The number of the chapter containing the float.
+
+`nr_in_chapter'
+ The number of the float in the chapter.
+
+`absolut_nr'
+ The number of the float in the document.
+
+`texi'
+ The label with @-commands.
+
+`id'
+ The unique identifier associated with the label. Usefull to make
+ an anchor or a reference.
+
+`element'
+ A reference on a structure representing the element the float
+ appear in.
+
+* Menu:
+
+* Floats:: Formatting of floats
+* Lists of floats:: Formatting the lists of floats
+
+
+File: texi2html.info, Node: Floats, Next: Lists of floats, Up: Floats and lists of floats
+
+Formatting a float
+------------------
+
+ First there is an occasion to construct a texinfo text for the
+caption, using the caption texinfo lines and the informations in the
+float structure. The returned lines will be formatted in the main
+program. A function reference is used here:
+
+ - Function Reference: (\@caption_lines_returned,
+\@shortcaption_lines_returned) caption_shortcaption \%float
+ \@caption_lines \@shortcaption_lines
+ \%FLOAT is the structure defined above. \@CAPTION_LINES and
+ \@SHORTCAPTION_LINES are references on arrays containing the
+ texinfo lines for caption and short caption.
+ \@CAPTION_LINES_RETURNED and \@SHORTCAPTION_LINES_RETURNED are
+ references on an array containing the texinfo lines for the
+ caption and shortcaption.
+
+ Then the float is formatted with the following function reference:
+
+ - Function Reference: $text float $float_text \%float $caption_text
+ $shortcaption_text
+ $FLOAT_TEXT is the text appearing within the `@float', formatted.
+ \%FLOAT is still the structure defined above. $CAPTION_TEXT and
+ $SHORTCAPTION_TEXT are the caption and short caption build with the
+ above function and formatted.
+
+
+File: texi2html.info, Node: Lists of floats, Prev: Floats, Up: Floats and lists of floats
+
+Formatting lists of floats
+--------------------------
+
+ A list of floats is introduced by `@listoffloats'. The argument of
+`@listoffloats' is the "style". First the style texinfo can be modified
+with the following function reference:
+
+ - Function Reference: $style_texi_returned listoffloats_style
+ $style_texi
+ $STYLE_TEXI is the `@listoffloats' argument with texinfo
+ @-commands kept. It is possible to make changes to the $STYLE_TEXI
+ and return a modified string, still with @-commands. The modified
+ string is formatted in the main program.
+
+ After that, for each of the floats with that style, first there is a
+possibility to modify the float style and the float caption before they
+are formatted in the main program, with the following function
+references:
+
+ - Function Reference: $float_style_texi_returned
+listoffloats_float_style $style_texi \%float
+ $STYLE_TEXI is the style, and \%FLOAT is the structure described
+ above. This function reference returns a style to be formatted in
+ the main program.
+
+ - Function Reference: $caption_texi_returned listoffloats_caption
+ \%float
+ \%FLOAT is the structure described above. This function reference
+ returns a caption to be formatted in the main program.
+
+ Each entry is formatted by:
+
+ - Function Reference: $listoffloats_entry listoffloats_entry
+ $style_texi \%float $float_style $caption $href
+ $STYLE_TEXI is the style with @-commands, $FLOAT_STYLE is the
+ style returned by the above function and formatted. $CAPTION is the
+ caption returned by the above function formatted. \%FLOAT is the
+ structure corresponding with the float, and $HREF is an href
+ pointing to the float location.
+
+ Lastly, the whole `@listoffloats' is formatted by:
+
+ - Function Reference: $listoffloats listoffloats $style_texi $style
+ \@listoffloats_entries
+ $STYLE_TEXI is the style with @-commands, $STYLE is the style
+ returned by the above function and formatted. The array reference
+ \@LISTOFFLOATS_ENTRIES holds the entries formatted by the above
+ function.
+
+
+File: texi2html.info, Node: Footnotes, Next: Other and unknown commands, Prev: Floats and lists of floats, Up: Customizing HTML
+
+Customizing the footnotes formatting
+====================================
+
+ Each footnote is associated with a footnote entry. Several footnote
+entries are grouped in a footnote section. When a footnote appears, two
+things must be formatted: in the main text the place where the footnote
+appear and the footnote text.
+
+ Two functions, with corresponding function references control the
+formatting of the footnotes:
+
+ - Function Reference: (\@lines $text_for_document) foot_line_and_ref
+ $number_in_doc $number_in_page $footnote_id $place_id
+ $document_file $footnote_file \@lines \%state
+ $NUMBER_IN_DOC is the footnote number in the whole document,
+ $NUMBER_IN_PAGE is the footnote number in the current page.
+ $FOOTNOTE_ID is an identifier for the footnote in the footnote text
+ which should be used to make target for references to that
+ footnote, while $PLACE_ID is an identifier for the location of the
+ footnote in the main document. Similarly, $DOCUMENT_FILE is the
+ file name of the file containing the text where the footnote
+ appears in the main document, while $FOOTNOTE_FILE is the file
+ name of the file where the footnote text appears.
+
+ \@LINES is a reference on an array containing the footnote text
+ lines, allready formatted. And \%STATE holds informations about
+ the context at the footnote place in the main document. As usual
+ the most usefull entry is `preformatted' which is true if the
+ footnote appears in a preformatted context.
+
+ This function returns a reference on an array, \@LINES containing
+ the updated footnote text for the footnote entry, and
+ $TEXT_FOR_DOCUMENT, the text appearing at the footnote place in
+ the main document, linking to the footnote entry.
+
+ The following function is only used when footnotes are at the bottom
+of a page and the document is split. For customization of the
+footnotes page in case they are on a separated page or section, *Note
+Special pages layout::. For the determination of the footnote
+locations, *Note Page layout options::.
+
+ - Function Reference: foot_section \@footnotes_lines
+ This function formats a group of footnotes. \@FOOTNOTES_LINES is a
+ reference on an array holding the lines of all the footnote entries
+ formatted as explained above. This function modifies the reference.
+
+
+File: texi2html.info, Node: Other and unknown commands, Prev: Footnotes, Up: Customizing HTML
+
+Customizing other commands, and unknown commands
+================================================
+
+ Many commands without braces are available in texinfo, sometimes with
+a specific syntax. For example we have `@sp', `@noindent',
+`@documentlanguage', `@oddheading', `@headings', `@shortcontents',
+`@shorttitlepage' or `@comment'. `texi2html' interprets some of these
+commands and some functions or variables are used for their formatting
+or to access their information. In the default case, however, most of
+these constructs are ignored.
+
+ It is possible to change how the things following these commands on
+the line are handled, what is considered to be an arg for those
+commands and it is also possible to keep them instead of discarding
+them such that it is possible to handle them specially, with the same
+function than the one used for unknown commands.
+
+ Those special commands without braces are the key of a hash:
+`%misc_command'. The associated value is a reference on a hash enabling
+to set the properties of these commands. The keys of this hash
+reference is the name of a property, the value is the value of the
+property. For example here we have `line' for the `arg' property for
+the `command' @-command.
+
+ $misc_command{'command'} = {'arg' => 'line', 'skip' => 'space'};
+
+ The properties and possible values are:
+
+`skip'
+ This property enables to set what is skipped after the command
+ arguments. Here are the possible values:
+ `line'
+ The remaining of the line is skipped.
+
+ `space'
+ Spaces are skipped but not newline.
+
+ `whitespace'
+ Spaces are skipped
+
+ `linewhitespace'
+ Spaces are skipped if there are only spaces remaining on the
+ line.
+
+ `linespace'
+ Spaces are skipped, but not newline if there are only spaces
+ remaining on the line
+
+`arg'
+ If the associated value is `line' the line is considered to be the
+ argument. If it is a number it is the number of args (separated by
+ spaces).
+
+`texi'
+ If true the arguments are considered to real texinfo, therefore
+ `@value' and `@macro' are expanded.
+
+`keep'
+ If true the args and the macro are kept, otherwise they are
+ discarded. The defaut is to have `keep' undef for all the
+ commands. If `keep' is true for `@verbatiminclude' the default
+ action for this macro isn't done.
+
+ Commands which don't appear in the hashes `%simple_map',
+`%simple_map_pre', `%simple_map_texi' and `%misc_command', or that
+appear in `%misc_command' but with `keep' true are processed by the
+following function reference:
+
+ - Function Reference: ($result_line, $result, $result_text, $message)
+unknown $command $line
+ $COMMAND is the @-command, $LINE is the line following the
+ $COMMAND. $RESULT is a boolean. If it is true then the other return
+ values are taken into account otherwise the default actions are
+ used. In case $RESULT is true, $RESULT_LINE is the new line to be
+ processed further, $RESULT_TEXT is the resulting formatted text
+ and $MESSAGE, if defined is a message outputted to the output with
+ line number added by `texi2html'.
+
+ Commands with braces not specified above nor in `%style_map',
+`%style_map_pre' and `%style_map_texi' are processed by the following
+function reference
+
+ - Function Reference: ($result, $result_text, $message) unknown_style
+ $command $text
+ $COMMAND is the @-command, $TEXT is the text appearing within the
+ braces (allready formatted). $RESULT is a boolean. If it is true
+ then the other return values are taken into account otherwise the
+ default actions are used. In case $RESULT is true, $RESULT_TEXT is
+ the resulting formatted text and $MESSAGE, if defined is a message
+ outputted to the output with line number added by `texi2html'.
+
+
+File: texi2html.info, Node: Internationalization, Next: Indexop, Prev: Customizing HTML, Up: Top
+
+Internationalization
+********************
+
+ The strings written in the document are selected based on the
+document language. This can be used to customize the strings, as
+described in *Note Strings::. This also enables translation of the
+strings.
+
+* Menu:
+
+* Translating strings::
+* Adding new strings::
+
+
+File: texi2html.info, Node: Translating strings, Next: Adding new strings, Up: Internationalization
+
+Translating strings
+===================
+
+ If the language is allready supported, then there will be a file in
+the `i18n' directory with name the two-letter ISO-639 language code. In
+that case you can enhance the translations by editing this file. There
+is a `$LANGUAGES->{'LANGUAGE'}' hash in that file. The keys are the
+english strings, in `''', the values (in `''' after `=>') are the
+translations. When a string contains a `%' followed by `{' NAME `}' it
+means that the string will be expanded by `texi2html'. For an example,
+see *Note Strings::.
+
+ After that you should run the command `./manage_i18n.pl all' in the
+top directory, it should merge your file with the existing files in
+`translations.pl', which is incorporated to the `texi2html' script by
+`./configure'.
+
+ If the language isn't currently supported, copy the `en' file in
+`i18n' to a file with name the two-letter ISO-639 language code of your
+language and then add your translations to the strings. You could also
+add your two-letter language code in the `manage_i18n.pl' file in the
+`@known_languages' array.
+
+ After that you should similarly run the command `./manage_i18n.pl
+all' in the top directory.
+
+ Obsoleted strings are not removed from the files, they are still
+present in the `$T2H_OBSOLETE_STRINGS->{'LANGUAGE'}' hash in case the
+string is reused later.
+
+ If you made change to strings specified in installed files (*note
+Installation::) you will have to reinstall them otherwise the
+installated files will take precedence (*note Using init files::).
+
+
+File: texi2html.info, Node: Adding new strings, Prev: Translating strings, Up: Internationalization
+
+Adding new strings written to document
+======================================
+
+ If you need to write strings, for example the new string A STRING to
+the resulting document, call `&$I('a string')'. Use simple quotes. If
+you want to substitute a value in the string put `%{STRING_VALUE}', in
+the string, and give a second argument to `&$I', a hash reference with
+key STRING_VALUE and value the what you want to substitute. Here is an
+example:
+
+ return &$I('%{name} of %{class}', { 'name' => $name, 'class' => $class });
+
+ In that case `%{name}' is substituted by `$name' in the translated
+string.
+
+ After that you should run the command `./manage_i18n.pl all' in the
+top directory, it should add your new strings to all the files in the
+`i18n' directory.
+
+
+File: texi2html.info, Node: Indexop, Next: Indexvr, Prev: Internationalization, Up: Top
+
+Command Line Option Index
+*************************
+
+* Menu:
+
+* css-include=FILE: Style options.
+* def-table: Style options.
+* doctype=DTD: Style options.
+* DVAR: Texinfo related options.
+* frames: Page layout options.
+* frameset-doctype: Style options.
+* frameset-doctype=DTD: Style options.
+* html-xref-prefix=PATH: Style options.
+* IDIR: Texinfo related options.
+* if<region>: Expansion.
+* include-css: css.
+* init-file: Using init files.
+* iso: Style options.
+* l2h: Expanding TeX regions.
+* l2h-file: Expanding TeX regions.
+* l2h-l2h=PROGRAM: Expanding TeX regions.
+* l2h-tmp: Expanding TeX regions.
+* lang <1>: Strings.
+* lang: Using init files.
+* lang=LANG: Texinfo related options.
+* menu: Invoking texi2html.
+* no-if<region>: Expansion.
+* node-files: Output files.
+* nomenu <1>: Expansion.
+* nomenu: Invoking texi2html.
+* nosec-nav: Page layout options.
+* number: Style options.
+* output: Output files.
+* PDIR: Texinfo related options.
+* pkgdatadir=dir: Using init files.
+* pkgdatadir=DIR: Installation.
+* prefix: Output files.
+* separated-footnotes: Page layout options.
+* short-ext: Output files.
+* short-ref: Style options.
+* split: Splitting output.
+* sysconfdir=dir: Using init files.
+* toc-file: Output files.
+* toc-links: Style options.
+* top-file: Output files.
+* use-nodes: Splitting output.
+* UVAR: Texinfo related options.
+
+
+File: texi2html.info, Node: Indexvr, Next: Indexcp, Prev: Indexop, Up: Top
+
+Variable Index
+**************
+
+* Menu:
+
+* $AFTER_BODY_OPEN: Customizing header.
+* $AFTER_OVERVIEW: Contents and Overview text.
+* $AFTER_TOC_LINES: Contents and Overview text.
+* $anchor <1>: Anchors images and spaces.
+* $anchor: Redefining functions.
+* $AVOID_MENU_REDUNDANCY: Menu formatting.
+* $BEFORE_OVERVIEW: Contents and Overview text.
+* $BEFORE_TOC_LINES: Contents and Overview text.
+* $BIG_RULE: The page layout.
+* $BODYTEXT <1>: Customizing header.
+* $BODYTEXT: Output initialization.
+* $cell: Table and list items.
+* $CLOSE_QUOTE_SYMBOL <1>: String interface.
+* $CLOSE_QUOTE_SYMBOL: Hash reference interface.
+* $complex_format_map: Complex formats.
+* $CSS_LINES: css.
+* $DEF_TABLE: Style options.
+* $DEFAULT_RULE: The page layout.
+* $definition_category: Definition formatting.
+* $DO_CONTENTS: Contents and Overview text.
+* $DO_SCONTENTS: Contents and Overview text.
+* $DOCTYPE: Style options.
+* $DOCUMENT_DESCRIPTION: Customizing header.
+* $DOCUMENT_ENCODING: Customizing header.
+* $ENCODING: Customizing header.
+* $EXTENSION: File names.
+* $EXTERNAL_DIR: Style options.
+* $EXTRA_HEAD: Customizing header.
+* $FRAMES: Page layout options.
+* $FRAMESET_DOCTYPE: Style options.
+* $ICONS: General purpose variables.
+* $IDX_SUMMARY: External index files.
+* $INDEX_CHAPTER: The page layout.
+* $L2H_L2H: Expanding TeX regions.
+* $L2H_TMP: Expanding TeX regions.
+* $LANG <1>: Strings.
+* $LANG <2>: Using init files.
+* $LANG: Texinfo related options.
+* $LANGUAGES <1>: Translating strings.
+* $LANGUAGES: Strings.
+* $MENU_PRE_STYLE: Menu formatting.
+* $MENU_SYMBOL: Menu formatting.
+* $MIDDLE_RULE: The page layout.
+* $NODE_FILES <1>: File names.
+* $NODE_FILES: Output files.
+* $NODE_NAME_IN_MENU: Menu formatting.
+* $NUMBER_SECTIONS: Style options.
+* $OPEN_QUOTE_SYMBOL <1>: String interface.
+* $OPEN_QUOTE_SYMBOL: Hash reference interface.
+* $OUT: Output files.
+* $PRE_BODY_CLOSE: Customizing footer.
+* $PREFIX: Output files.
+* $print_chapter_footer: Customizing footer.
+* $print_chapter_header: Customizing header.
+* $print_foot_navigation: Customizing footer.
+* $print_head_navigation: Customizing header.
+* $print_misc: Special pages layout.
+* $print_misc_footer: Special pages layout.
+* $print_misc_header: Special pages layout.
+* $print_page_foot: Customizing footer.
+* $print_page_head: Customizing header.
+* $print_section_footer: Customizing footer.
+* $print_section_header: Customizing header.
+* $print_Top: Special pages layout.
+* $print_Top_footer: Special pages layout.
+* $print_Top_header: Special pages layout.
+* $SECTION_NAVIGATION <1>: General purpose variables.
+* $SECTION_NAVIGATION: Page layout options.
+* $SEPARATED_FOOTNOTES: Page layout options.
+* $SHORT_REF: Style options.
+* $SHORTEXTN: Output files.
+* $SHOW_MENU: Expansion.
+* $SMALL_RULE: The page layout.
+* $SPLIT: Splitting output.
+* $SPLIT_INDEX: Index list.
+* $T2H_OBSOLETE_STRINGS: Translating strings.
+* $Texi2HTML::NODE{Next}: Button specifications.
+* $Texi2HTML::OVERVIEW <1>: Contents and Overview text.
+* $Texi2HTML::OVERVIEW: Global informations.
+* $Texi2HTML::THIS_HEADER: Global informations.
+* $Texi2HTML::THIS_SECTION <1>: Global functions.
+* $Texi2HTML::THIS_SECTION: Global informations.
+* $Texi2HTML::TOC_LINES <1>: Contents and Overview text.
+* $Texi2HTML::TOC_LINES: Global informations.
+* $TOC_FILE: Output files.
+* $TOC_LINKS: Style options.
+* $TOC_LIST_ATTRIBUTE: Contents and Overview text.
+* $TOC_LIST_STYLE: Contents and Overview text.
+* $TOP_FILE: Output files.
+* $TOP_HEADING: The page layout.
+* $UNNUMBERED_SYMBOL_IN_MENU: Menu formatting.
+* $USE_ISO: Style options.
+* $USE_NODES: Splitting output.
+* $VERTICAL_HEAD_NAVIGATION: General purpose variables.
+* $WORDS_IN_PAGE <1>: Global functions.
+* $WORDS_IN_PAGE: Button specifications.
+* %accent_map: Style and accent commands.
+* %ACTIVE_ICONS: Button specifications.
+* %BUTTONS_GOTO: Output initialization.
+* %css_map: css.
+* %def_map: Definition line.
+* %format_in_paragraph: Avoiding paragraphs.
+* %format_map: Whole table list.
+* %main::value: Global informations.
+* %misc_command: Other and unknown commands.
+* %NAVIGATION_TEXT <1>: Output initialization.
+* %NAVIGATION_TEXT: Button specifications.
+* %paragraph_style: Alignement commands.
+* %PASSIVE_ICONS: Button specifications.
+* %pre_map: Commands without argument.
+* %simple_map <1>: Other and unknown commands.
+* %simple_map: Commands without argument.
+* %simple_map_pre <1>: Other and unknown commands.
+* %simple_map_pre: Commands without argument.
+* %simple_map_texi <1>: Other and unknown commands.
+* %simple_map_texi: Commands without argument.
+* %special_list_commands: Table and list items.
+* %style_map <1>: Other and unknown commands.
+* %style_map: Style and accent commands.
+* %style_map_pre <1>: Other and unknown commands.
+* %style_map_pre: Style and accent commands.
+* %style_map_texi <1>: Other and unknown commands.
+* %style_map_texi: Style and accent commands.
+* %Texi2HTML::HREF: Elements hashes.
+* %Texi2HTML::NAME: Elements hashes.
+* %Texi2HTML::NO_TEXI: Elements hashes.
+* %Texi2HTML::NODE: Elements hashes.
+* %Texi2HTML::THISDOC: Global informations.
+* %texi_map: Commands without argument.
+* %things_map: Commands without argument.
+* @CHAPTER_BUTTONS: Button specifications.
+* @CSS_FILES: Style options.
+* @EXPAND: Expansion.
+* @INCLUDE_DIRS: Texinfo related options.
+* @MISC_BUTTONS: Button specifications.
+* @NODE_FOOTER_BUTTONS: Button specifications.
+* @PREPEND_DIRS: Texinfo related options.
+* @SECTION_BUTTONS: Button specifications.
+* @SECTION_FOOTER_BUTTONS: Button specifications.
+
+
+File: texi2html.info, Node: Indexcp, Prev: Indexvr, Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* Avoid paragraph opening: Avoiding paragraphs.
+* bug report: Top.
+* centering: Alignement commands.
+* complex format: Complex formats.
+* Config: Using init files.
+* configure: Installation.
+* downloading texi2html source: Obtaining texi2html.
+* examples of manuals: Overview.
+* external manual: Reference to external manual.
+* flushing text: Alignement commands.
+* i18n <1>: Translating strings.
+* i18n: Strings.
+* Installation: Installation.
+* internationalization: Using init files.
+* internationalized strings: Adding new strings.
+* makeinfo: whytexi2html.
+* manage_i18n.pl: Adding new strings.
+* paragraph: Paragraph and preformatted formatting.
+* preformatted region: Paragraph and preformatted formatting.
+* reference: References.
+* skipped command: Other and unknown commands.
+* source code for texi2html, downloading: Obtaining texi2html.
+* texi2html source, downloading: Obtaining texi2html.
+* Texinfo: Overview.
+* text alignement: Alignement commands.
+* Translation: Translating strings.
+* unknown command: Other and unknown commands.
+
+
diff --git a/Build/source/utils/texi2html/doc/texi2html.texi b/Build/source/utils/texi2html/doc/texi2html.texi
new file mode 100644
index 00000000000..b4e2662badb
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texi2html.texi
@@ -0,0 +1,3426 @@
+\input texinfo @c -*-texinfo-*-
+@c This is the ``Texinfo to HTML Converter'' manual which
+@c which is part of the ``texi2html'' distribution.
+@setfilename texi2html.info
+
+@c @macro copyleftnotice
+@copying
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003
+ Free Software Foundation, Inc.
+
+@multitable @columnfractions .12 .88
+@item Portions of @command{texi2html}
+@item @tab Copyright @copyright{} 1999, 2000 Lionel Cons@*
+@item @tab Copyright @copyright{} 1999, 2000 Karl Berry@*
+@item @tab Copyright @copyright{} 1999, 2000 Olaf Bachmann@*
+@item @tab Copyright @copyright{} 2002, 2003 Patrice Dumas@*
+@item @tab Copyright @copyright{} 2001, 2002, 2003 Derek Price@*
+@item @tab Copyright @copyright{} many others.@*
+@item @tab
+@item @tab
+@item Portions of this manual
+@item @tab Copyright @copyright{} 1999, 2000 Karl Heinz Marbaise (manual)@*
+@item @tab Copyright @copyright{} 2003 Patrice Dumas (manual)@*
+@item @tab Copyright @copyright{} 2003 Derek Price (manual)@*
+@end multitable
+
+Permission is granted to make and distribute verbatim
+copies of this manual provided the copyright notice and
+this permission notice are preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and
+print the results, provided the printed document carries
+copying permission notice identical to this one except for
+the removal of this paragraph (this paragraph not being
+relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified
+versions of this manual under the conditions for verbatim
+copying, provided that the entire resulting derived work is
+distributed under the terms of a permission notice
+identical to this one.
+
+Permission is granted to copy and distribute translations
+of this manual into another language, under the above
+conditions for modified versions, except that this
+permission notice may be stated in a translation approved
+by the Free Software Foundation.
+@end copying
+@c @end macro
+
+@c --------------------------------------------------------
+@c This file is part of the Texi2HTML distribution.
+@c
+@c Texi2HTML is free software; you can redistribute it
+@c and/or modify it under the terms of the GNU General Public
+@c License as published by the Free Software Foundation;
+@c either version 2 of the License, or (at your option) any
+@c later version.
+@c
+@c Texi2HTML is distributed in the hope that it will be
+@c useful, but WITHOUT ANY WARRANTY; without even the implied
+@c warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+@c PURPOSE. See the GNU General Public License for more
+@c details.
+@c
+@c You should have received a copy of the GNU General
+@c Public License along with this program; if not, write to
+@c the Free Software Foundation, Inc., 59 Temple Place, Suite
+@c 330, Boston, MA 02111-1307 USA
+@c
+@c Author:
+@c Karl Heinz Marbaise <khmarbaise@gmx.de>
+@c Patrice Dumas
+@c Derek Price
+@c --------------------------------------------------------
+
+@c --------------------------------------------------------
+@c Get the version of the script and the last update time
+@c of this manual.
+@c
+@c version.texi is automatically generated through
+@c configure/autoconf.
+@include version.texi
+@c --------------------------------------------------------
+
+@c --------------------------------------------------------
+@c Define an index for command line options
+@defindex op
+
+@c Define some macros which affect markup and add to the
+@c index simultaneously.
+@macro longopt {arg}
+@opindex \arg\
+@option{--\arg\}
+@end macro
+
+@macro shortopt {arg}
+@opindex \arg\
+@option{-\arg\}
+@end macro
+
+@macro variable {arg}
+@vindex \arg\
+@code{\arg\}
+@end macro
+@c --------------------------------------------------------
+
+@settitle Texi2HTML -- Texinfo to HTML v@value{VERSION}
+@setchapternewpage odd
+@footnotestyle separate
+@ifset shorttitlepage-enabled
+@shorttitlepage Texi2HTML -- Texinfo to HTML v@value{VERSION}
+@end ifset
+
+@c --------------------------------------------------------
+@c support old style Info Dir entries.
+@ifset OLDSTYLE-INFO-DIR
+@ifinfo
+@format
+START-INFO-DIR-ENTRY
+* Texi2HTML: (texi2html). Texinfo 2 HTML Converter (texi2html).
+END-INFO-DIR-ENTRY
+@end format
+@end ifinfo
+@end ifset
+@c --------------------------------------------------------
+@c Informations for install-info.
+@c I think the conversion script should be found
+@c where the documentation system lives.
+@c What do you think?
+@dircategory Texinfo documentation system
+@direntry
+* Texi2HTML: (texi2html). Texinfo to HTML Converter.
+@end direntry
+@c --------------------------------------------------------
+
+@ifnottex
+@ifnothtml
+This file, last updated @value{UPDATED}, documents the @command{texi2html}
+script which converts @uref{http://www.texinfo.org,Texinfo} into
+@uref{http://w3c.org,HTML}. This edition is for @command{texi2html} version
+@value{VERSION}.
+@end ifnothtml
+
+@c @copyleftnotice
+@insertcopying
+@end ifnottex
+@c --------------------------------------------------------
+@titlepage
+@title Texi2HTML -- Texinfo to HTML v@value{VERSION}
+@subtitle Last Update: @value{UPDATED}
+@subtitle for Version @value{VERSION} of the @command{texi2html} script.
+@author Lionel Cons
+@author Karl Berry
+@author Olaf Bachmann
+@author Patrice Dumas
+@author Derek Price
+@author and many others.
+@author Karl Heinz Marbaise (manual)
+@author Patrice Dumas (manual)
+@author Derek Price (manual)
+@page
+@vskip 0pt plus 1filll
+@c @copyleftnotice
+@insertcopying
+@end titlepage
+
+@comment ========================================================
+@comment The real text starts here.
+@comment ========================================================
+
+@summarycontents
+@contents
+
+@ifnottex
+@c ========================================================
+@node Top
+@top Texi2HTML
+
+@cindex bug report
+
+This manual, last updated @value{UPDATED}, describes version @value{VERSION}
+of the @command{texi2html} Perl script which converts
+@c The following construct allows me to get
+@c real URL link in HTML and working refs in
+@c info.
+@c
+@c pertusus: support for html cross manual now
+@c exists in texi2html, but it implies having Texinfo's
+@c HTML manual at the right place, which isn't usually the case.
+@c The resulting ref is also less pretty in info.
+@ifnotinfo
+@uref{http://www.texinfo.org,Texinfo} into @uref{http://w3c.org,HTML}.
+@end ifnotinfo
+@ifinfo
+Texinfo (@pxref{Top,,Texinfo,Texinfo}) into @acronym{HTML}.
+@end ifinfo
+
+Please send bug reports concerning this manual to the Texi2HTML user
+discussion list @email{user@@texi2html.cvshome.org}. Please state the exact
+version of the manual which contains the bug, as given above.
+
+@ifinfo
+@c @copyleftnotice
+@insertcopying
+@end ifinfo
+
+@example
+@strong{This manual is currently under construction and of course incomplete. ;-)}
+@end example
+
+@menu
+@c * MenuName:NodeName. Description
+* Overview::
+* Obtaining texi2html::
+ Obtaining a copy of the @command{texi2html}
+ source code distribution
+* Installation:: Installing @command{texi2html}
+* Invoking texi2html:: Description of the command line options
+* Initialization files:: What kind of variables and subroutines appear
+ in init files and how they are called
+* Changing the page layout:: Fine tuning of the page layout
+* Customizing HTML:: Fine tuning of the @acronym{HTML} elements
+ associated with the texinfo constructs
+* Internationalization:: Help translating !
+* Indexop:: Command Line Option Index
+* Indexvr:: Variable Index
+* Indexcp:: Concept Index
+
+@end menu
+@end ifnottex
+@c ========================================================
+@node Overview
+@chapter Overview
+
+@cindex Texinfo
+@cindex examples of manuals
+
+@uref{http://www.texinfo.org,Texinfo} is the official
+documentation format of the @uref{http://www.gnu.org,GNU}
+project. It uses a single source file to produce both
+online information and printed output.
+
+It is often desirable to have a way to produce
+@acronym{HTML} from Texinfo sources, as GNU-Info files are
+produced. It is much simpler to run a converter than it is to
+rewrite all the documentation in @acronym{HTML}, especially
+considering that there is so much Texinfo documentation in
+the world.
+
+Some time ago @command{makeinfo} wasn't able to produce
+@acronym{HTML} output format, but people still wanted documentation in
+@acronym{HTML}. This was the birthing hour for
+@command{texi2html}. The basic purpose of @command{texi2html}
+is to convert Texinfo documents into @acronym{HTML}.
+
+Since then, @acronym{HTML} support in @command{makeinfo} has improved, but
+@command{texi2html} is still stronger in many areas, including the degree to
+which it allows customization. With @command{texi2html}, some important
+aspects of the resulting @acronym{HTML} files may be specified via command
+line options, and configuration files provide an even finer degree of control
+over the final output, allowing most every aspect of the final output not
+specified in the Texinfo input file to be specified. Configuration files are
+written in @command{perl}, like the main program, and anything which may be
+specified on the command line may also be specified within a configuration
+file.
+
+For an example of the kind of pages @command{texi2html} is capable of
+producing, have a look at the following sites:
+@uref{http://www.singular.uni-kl.de/Manual/html/,the Singular Manual},
+@uref{http://ccvs.cvshome.org/docs/manual,the Cederqvist (CVS Manual)}.
+
+@menu
+* whytexi2html:: Why @command{texi2html} and not @command{makeinfo}?.
+@end menu
+@c --------------------------------------------------------
+
+@node whytexi2html
+@section Why @command{texi2html} and not @command{makeinfo}?
+
+@cindex makeinfo
+
+You would like to produce @acronym{HTML} files from your existing Texinfo
+files? There are two programs you can use to do this. The first is
+@command{makeinfo} (@pxref{Generating HTML,,,texinfo}).
+The second is @command{texi2html}.
+
+The design goal of @command{makeinfo}'s @acronym{HTML} output was to produce
+readable @acronym{HTML} output. It is now possible to use @acronym{CSS}
+for @acronym{HTML} customization. Another possibility is to use intermediate
+formats, like docbook or @command{mekeinfo} @acronym{XML}
+and @acronym{XSL} stylesheets to customize the resulting document. Still the
+output produced by @command{makeinfo} isn't customizable.
+
+The current development of @command{texi2html} tries to
+provide for producing the more interesting and sophisticated @acronym{HTML}
+pages that today's Internet users have come to expect.
+The goal behind @command{texi2html} is to generate attractive @acronym{HTML} by
+default but also to allow users considerable freedom to affect the final
+style and design of the output @acronym{HTML} pages. This is achieved via
+command line options and flexible configuration files.
+
+@c The main disadvantage of @command{makeinfo}'s
+@c @acronym{HTML} output is that it is only available as one big file.
+@c This is of course readable but not very usable. This would be hard to
+@c remedy in @command{makeinfo}, as the Texinfo source has to be read in at
+@c least twice to implement split nodes. This would require a major
+@c rewrite of the @command{makeinfo} source.
+
+@c think more about this????
+In contrast to the @acronym{HTML} produced by @command{makeinfo --html} (the
+@command{makeinfo} program is part of the Texinfo distribution), the
+@command{texi2html} program, among other differences, allows for the
+customization of the entire page layout, including headers, footers, style
+sheets, etc., allows for customization of the low level @acronym{HTML}
+formatting, provides for splitting documents at various levels, and provides
+for using the @command{latex2html} program to convert @code{@@tex} sections of
+the Texinfo source.
+
+The focus on @acronym{HTML} is still present but with the help of the
+customization files it is now possible to use @command{texi2html} to
+produce other formats as well. @command{texi2html} may for example be
+turned into a texinfo to roff translator with the help of a customization file
+provided with the distribution.
+
+@command{texi2html} should reasonably convert all Texinfo
+4.8 constructs. If you find it does not, please send a bug report to the
+@email{users@@texi2html.cvshome.org} email list.
+
+@c ========================================================
+@node Obtaining texi2html
+@chapter Obtaining @command{texi2html}
+@cindex downloading @command{texi2html} source
+@cindex @command{texi2html} source, downloading
+@cindex source code for @command{texi2html}, downloading
+
+The latest version of the source code for @command{texi2html} should be
+available from @uref{http://texi2html.cvshome.org,texi2html.cvshome.org}.
+
+@c ========================================================
+@node Installation
+@chapter Installation of @command{texi2html}
+@cindex Installation
+@cindex configure
+
+To install @command{texi2html}, you must first obtain a copy of the
+source distribution. @xref{Obtaining texi2html}.
+
+@command{texi2html} also requires @command{perl} version
+5.004 or above. The current version has not been tested
+extensively on versions of @command{perl} below 5.6, however.
+
+@command{texi2html} is a standard Automake-based distribution.
+If you have a source version, you should run @command{./configure}
+to regenerate the executable @file{texi2html} file. @command{./configure}
+accepts options to select the installation directory for the @file{texi2html}
+file, the default directories @command{texi2html} will use to look for
+configuration files, and other details. Run @command{./configure --help} for
+more information.
+
+Running @command{./configure} combines four files into the final
+@file{texi2html} program file:
+@itemize
+@item @file{texi2html.pl} contains the base program,
+@item @file{MySimple.pm} handles the command line options,
+@item @file{texi2html.init} is the default configuration file, and
+@item @file{T2h_i18n.pm} is used for internationalization.
+@item @file{translations.pl} contains the translations of the strings used in
+documents.
+@end itemize
+
+Running @command{./configure} also builds the @command{make} configuration
+files (@file{Makefile}s). To make the documentation run @command{make}.
+
+@command{make install} performs the installation to the locations specified to
+the @command{./configure} script. This usually involves placing the actual
+@file{texi2html} file someplace in your path, such as @file{/usr/local/bin} or
+@file{/usr/bin}.
+
+Installing @command{texi2html} in your path should be sufficient
+to run it. To use default initialization files, or a configuration file for
+La@TeX{}2HTML when using @command{latex2html} to convert @code{@@tex} sections
+(@pxref{Expanding TeX regions}), install them in the package data directory
+specified to configure. This is @file{/usr/local/share/texi2html/} by default,
+but depends on the value of the @longopt{pkgdatadir=@var{dir}} option passed to
+the @command{./configure} script. Files used for strings customization and
+internationalization are also searched for in the @file{i18n} directory
+of this directory. @xref{Using init files} for more.
+
+@c ========================================================
+@node Invoking texi2html
+@chapter Invoking @command{texi2html}
+
+To produce an @acronym{HTML} manual, run @command{texi2html} with a Texinfo
+file as an argument. For example, this manual is created with:
+
+@example
+$ texi2html texi2html.texi
+@end example
+
+The behaviour of @command{texi2html} may be changed with command line
+options. These command line options are always associated with corresponding
+@command{perl} variables which may appear in init files, and these
+variables are presented in this chapter each time a switch is described.
+
+Boolean command line switches always have a corresponding negated switch,
+obtained by prepending @samp{no} or @samp{no-} to the switch name. For example
+@c PAT maybe it should be better to have @option{--nomenu} and @option{--menu}
+@c as it is not needed and maybe harmfull to have an index entry for these
+@c options here
+@longopt{nomenu} does the reverse of @longopt{menu}.
+
+@menu
+* Splitting output:: The @acronym{HTML} output may be split at
+ different levels
+* Output files::
+* Expansion::
+* Texinfo related options::
+* Page layout options:: Customizing page layout
+* Style options:: Customizing the @acronym{HTML} and text style
+* Expanding TeX regions::
+* Using init files:: Specifying initialization files for fine tuning
+@end menu
+
+@c --------------------------------------------------------
+@node Splitting output
+@section Specifying where to split the generated document
+
+The @acronym{HTML} manual resulting from the processing of the Texinfo source
+may be split into files at different levels. This is specified with the
+option @longopt{split} which takes an argument, namely the level of splitting
+(variable: @variable{$SPLIT}). This level may be:
+
+@table @asis
+@item @samp{chapter}
+The document is split at @code{@@chapter}, @code{@@appendix}, or @code{@@unnumbered}.
+@item @samp{section}
+The document is split at the same places as it is using the @samp{chapter}
+argument, and also at @code{@@section}, @code{@@appendixsec} or
+@code{@@unnumberedsec}.
+@item @samp{node}
+The document is split at every sectioning command. It is not necessarily
+split at each node, if the @code{@@node} structure doesn't correspond with
+the sectioning command structure (see below).
+@item @samp{none}
+The document isn't split. This is the default.
+@end table
+
+There are two kinds of commands which may be used to define sectioning
+elements in Texinfo: @code{@@node} and the structuring commands (@code{@@top},
+@code{@@section}, @code{@@appendixsubsec}, and so on). A node just preceding
+a structuring command is considered to be part of the same sectioning element
+as that command. If the @code{@@node Top} isn't associated with a structuring
+command it also defines a sectioning element.
+
+By default, nodes which aren't associated with a structuring command are not
+considered to be sectioning commands. They are always considered to be part
+of a sectioning element defined by a structuring command. It is possible to
+change this behaviour via the @longopt{use-nodes} option (variable
+@variable{$USE_NODES}). In this case, nodes not associated with structuring
+commands are also considered to be sectioning commands defining a sectioning
+element.
+
+This default behaviour mimics @command{texi2dvi} behaviour, which ignores
+@code{@@node} commands for the purprose of sectioning, while the second
+looks like @command{makeinfo} behaviour (@pxref{Two Paths,,, texinfo}).
+
+As an illustration, the following table shows how a sample Texinfo document is
+divided into sectioning elements when @longopt{use-nodes} is used and not:
+
+@multitable @columnfractions .2 .1 .2 .1 .2
+@item Texinfo code
+@tab
+@tab
+default case
+@tab
+@tab
+with @longopt{use-nodes}
+@item
+@*
+@*
+@example
+@@node node1
+@@chapter node 1
+node1 text
+
+@@node node2
+node2 text
+
+@@node node3
+node3 text
+@@chapter node 3
+chapter text
+@end example
+@tab
+@tab
+first element:
+
+@example
+@@node node1
+@@chapter node 1
+node1 text
+
+@@node node2
+node2 text
+@end example
+
+second element:
+
+@example
+@@node node3
+node3 text
+@@chapter node 3
+chapter text
+@end example
+
+@tab
+@tab
+first element:
+
+@example
+@@node node1
+@@chapter node 1
+node1 text
+@end example
+
+second element:
+
+@example
+@@node node2
+node2 text
+@end example
+
+third element:
+
+@example
+@@node node3
+node3 text
+@@chapter node 3
+chapter text
+@end example
+
+@end multitable
+
+@c --------------------------------------------------------
+@node Output files
+@section Setting output file and directory names
+
+The manual name is constructed by stripping the @samp{.texi},
+@samp{.txi}, @samp{.texinfo}, or @samp{.txinfo} extension from the Texinfo file
+name.
+
+By default, @command{texi2html} generates the manual file in the current
+directory if the manual isn't split. A @samp{.html} file extension is appended
+to the manual name.
+
+If the manual is split the files are put in a directory named after the
+manual name. The file name is constructed using the manual name as basename.
+An underscore followed by a number is appended
+to the basename for each files corresponding with sectioning elements, with the
+exception of the top element. For the top element there nothing appended.
+The files containing special elements pages
+have an underscore and a 3 letter code corresponding to their content
+(@samp{toc} for table of contents, @samp{abt} for about, @samp{ovr} for
+overview) appended. Lastly, an @samp{.html} file extension is appended.
+
+Thus, if the texinfo file @file{afile.texi} is processed and split at chapters
+into 3 files, the generated files (in directory @file{afile}) will be:
+
+@example
+afile.html --> @code{@@node Top} or @code{@@top} section
+afile_1.html --> Chapter 1
+afile_2.html --> Chapter 2
+afile_toc.html --> Table of Contents
+afile_abt.html --> About Page
+@end example
+
+This default behavior may be modified by several command line options. If the
+output isn't split, the prefix file name may be overrided by the
+@longopt{output} command line option (variable @variable{$OUT}). If the output
+is split, and @longopt{output} is set, the files are placed in the directory
+specified by the argument to the option.
+
+The basename may be overridden with @longopt{prefix} (variable
+@variable{$PREFIX}). If @longopt{short-ext} is given, @samp{.htm} is appended
+instead of @samp{.html} in the final step (variable @variable{$SHORTEXTN}).
+The @longopt{top-file} option
+overrides the top element file name (variable @variable{$TOP_FILE}). This can
+be used to name the top element file @samp{index.html}. Similarly,
+@longopt{toc-file} changes the name of the table of contents file (variable
+@variable{$TOC_FILE}).
+
+Reusing the example above, but this time calling @command{texi2html} like so:
+
+@example
+$ texi2html -split chapter -prefix manual -short-ext -top-file index.htm -toc-file contents.htm afile.texi
+@end example
+
+we get, in @file{manual}:
+
+@example
+index.htm --> @code{@@node Top} or @code{@@top} section
+manual_1.htm --> Chapter 1
+manual_2.htm --> Chapter 2
+contents.htm --> Table of Contents
+manual_abt.htm --> About Page
+@end example
+
+The file names generated by @command{texi2html} differ from those generated
+by @command{makeinfo}. @command{makeinfo} uses the node name to construct
+the file names while splitting at nodes. It is possible to get the same
+behaviour out of @command{texi2html} by specifying the
+@longopt{node-files} option (variable @variable{$NODE_FILES}). If the output
+isn't split at nodes, @command{texi2html} will still output files named after
+the nodes, without real content but redirecting to the right file.
+The default is false for this option.
+@c Is this true? It wasn't in the last version. -DRP
+This trick enables the generated @acronym{HTML} manual to be a
+target for the cross-references of other manuals generated by
+@command{makeinfo} or @command{texi2html}.
+
+@c --------------------------------------------------------
+@node Expansion
+@section Specifying which regions get expanded
+
+The default for @command{texi2html} is to expand the @code{@@ifhtml},
+@code{@@html}, and @code{@@menu} regions, all the @code{@@ifnot} regions
+except @code{@@ifnothtml}, and no other @code{@@if} regions.
+
+It is possible to expand other regions by setting @longopt{if<region>},
+where @samp{<region>} is replaced by the literal name of the region (for
+example, @samp{--iftex}). Symetrically, if @longopt{no-if<region>} is
+specified, the @samp{<region>} region is ignored. The configuration file
+array, @variable{@@EXPAND}, holds the names of regions which should be
+expanded. The only region name present in @code{@@EXPAND} in the default case
+is @samp{html}.
+
+If @longopt{nomenu} is set, the @code{@@menu} sections are not expanded
+(variable @variable{$SHOW_MENU}). The default is to expand @code{@@menu}
+sections.
+@c How is --no-ifhtml specified? -DRP
+
+@c --------------------------------------------------------
+@node Texinfo related options
+@section Command line options related to Texinfo language features
+
+Miscalleneous Texinfo related things may be specified via command line options.
+
+@table @asis
+@item @longopt{lang=@var{lang}}
+Sets the document language similar to the Texinfo directive,
+@code{@@documentlanguage @var{lang}} (variable @variable{$LANG}).
+The default is @samp{en}, that is, use the english language strings.
+@item @shortopt{D@var{var}}
+Sets @var{var}. Equivalent to, @code{@@set @var{var} 1}, in Texinfo.
+@item @shortopt{U@var{var}}
+Clears @var{var}. Equivalent to, @code{@@clear @var{var}}, in Texinfo.
+@item @shortopt{P@var{dir}}
+Prepend @var{dir} to the list of directories to search for
+@code{@@include} files (the associated array is @variable{@@PREPEND_DIRS},
+empty in the default case).
+@item @shortopt{I@var{dir}}
+Append @var{dir} to the list of directories to search for
+@code{@@include} files (the associated array is @variable{@@INCLUDE_DIRS},
+empty in the default case).
+@end table
+
+The include files are always searched for in the current directory.
+
+@c --------------------------------------------------------
+@node Page layout options
+@section Page layout related command line options
+
+If the @longopt{frames} option is specified, @acronym{HTML} frames
+are used. A file describing the frame layout is generated, and the
+document page is associated with a frame where the short table of
+content appears (variable @variable{$FRAMES}). The default is not
+to use frames.
+
+It is also possible to suppress the section navigation panel with
+@longopt{nosec-nav} (variable @variable{$SECTION_NAVIGATION}, the default
+is to output all the navigation panels), and to specify
+whether footnotes should appear at the foot of the same page which contains
+the reference to the note or on a separate page with
+@longopt{separated-footnotes} (variable @variable{$SEPARATED_FOOTNOTES}).
+The default is to have separated footnotes.
+
+@c --------------------------------------------------------
+@node Style options
+@section Customizing the @acronym{HTML} and text style
+
+Miscalleneous style changes may be achieved with command line options.
+
+@table @asis
+@item @longopt{doctype=@var{DTD}}
+@itemx @longopt{frameset-doctype=@var{DTD}}
+You can specify the document DTD by setting these options.
+@longopt{frameset-doctype} applies to the file describing the frames when
+frames are used (corresponding variables are @variable{$DOCTYPE} and
+@variable{$FRAMESET_DOCTYPE}).
+
+The default for the document doctype is:
+@example
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+@end example
+And for the frameset doctype:
+@example
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html401/frameset.dtd">
+@end example
+
+@item @longopt{iso}
+If this option is set, ISO8859 entities are used for some special symbols,
+like Copyright @copyright{} (variable @variable{$USE_ISO}). It is the default.
+
+@item @longopt{css-include=@var{file}}
+This command line switch provides for the inclusion of an external
+Cascading Style Sheet (@acronym{CSS}) file. More than one file may be
+specified, and @samp{-} stands for the standard input (array
+@variable{@@CSS_FILES}).
+
+The option use is the same than for @command{makeinfo} and is described
+extensively in @ref{HTML CSS,,,texinfo}.
+Briefly, the @acronym{CSS} @code{@@import} lines from the external file
+@acronym{CSS} file are pasted before the
+@c What does this mean? I don't think I clarified this one much. -DRP
+@c Is it better ? -PAT
+@command{texi2html} @acronym{CSS} rules, and the external file @acronym{CSS}
+rules are pasted after the @command{texi2html} @acronym{CSS} rules.
+
+@item @longopt{html-xref-prefix=@var{path}}
+This option sets the base directory for external @acronym{HTML} texinfo manuals
+(variable @variable{$EXTERNAL_DIR}). Defaults to @samp{../}.
+
+@item @longopt{def-table}
+If this option is set, @acronym{HTML} tables are used to format definition
+commands, rather than @acronym{HTML} definition tables (variable
+@variable{$DEF_TABLE}). Default is false.
+
+@item @longopt{short-ref}
+If this option is set, cross-references are given without section numbers
+(variable @variable{$SHORT_REF}). Default is false.
+
+@item @longopt{number}
+If this option is set, sections are numbered (variable
+@variable{$NUMBER_SECTIONS}). This is the default.
+
+@item @longopt{toc-links}
+If this option is set, links from headings to @acronym{TOC} entries are
+created (variable @variable{$TOC_LINKS}). Default is false.
+@end table
+
+@c --------------------------------------------------------
+@node Expanding TeX regions
+@section Expanding @code{@@tex} and @code{@@math} regions using La@TeX{}2HTML
+
+It is possible to use @uref{http://www.latex2html.org/,La@TeX{}2HTML}
+to process @code{@@tex} regions and @code{@@math@{@}} commands. This is an
+attractive way to display mathematical constructs in the @acronym{HTML}
+manual. The @longopt{l2h} option activates this feature (variable
+@var{$L2H}). It is usually desirable to expand @code{@@tex} sections when this
+option is specified (@pxref{Expansion}). The default is not to use this
+feature.
+
+The @longopt{l2h-l2h=@var{program}} option enables changing the name/location
+of the La@TeX{}2HTML program processing @TeX{} regions (variable
+@variable{$L2H_L2H}). The default is @command{latex2html}.
+
+@longopt{l2h-tmp} sets the directory used for temporary
+files, this name shouldn't contain a dot @samp{.}
+@c Why not? -DRP
+(variable is @variable{$L2H_TMP}). Defaults to the current dir.
+
+The file specified by @longopt{l2h-file} is
+used as La@TeX{}2HTML init file. It is searched at the same places than
+init files (@pxref{Using init files}), and the default is @file{l2h.init}.
+
+@c --------------------------------------------------------
+@node Using init files
+@section Use initialization files for fine tuning
+
+@cindex internationalization
+@cindex @file{Config}
+
+Initialization variables are read first from
+@file{/usr/local/share/texi2html/Config} (the exact location being
+changeable with the @longopt{pkgdatadir=dir} option of the
+@command{configure} script, see @ref{Installation}),
+@file{/usr/local/etc/texi2html/Config} (the exact location being
+changeable with the @longopt{sysconfdir=dir} option of the
+@command{configure} script, see @ref{Installation}), from @file{./Config}
+then from @file{$HOME/.texi2html/Config}. Any command-line option
+can override the corresponding option set in init file, and the
+option @longopt{init-file} specifies an init file to be loaded, with
+later settings overriding earlier ones.
+
+The init files specified with @longopt{init-file} are searched
+first in the current directory, then in the @file{$HOME/.texi2html/}
+directory, in the @file{/usr/local/etc/texi2html/} directory and lastly
+in the @file{/usr/local/share/texi2html/} directory.
+
+A file is also included based on the language selected,
+by @variable{$LANG}, @longopt{lang} or @code{@@documentlanguage}.
+If no language was selected @samp{en} is considered to be
+the language. All the files with name the language name in
+@file{/usr/local/share/texi2html/i18n/},
+@file{/usr/local/etc/texi2html/i18n/},
+@file{$HOME/.texi2html/i18n/} and then @file{./i18n/} are included.
+
+The default initialization options are defined in the
+@file{texi2html.init} file contained in the @command{texi2html}
+distribution (which gets included near the beginning of the
+@command{texi2html} script that gets installed).
+
+To customize @command{texi2html} it is best if you copy the
+appropriate sections from the @file{texi2html.init}
+contents into an appropriate local initialization file,
+make the necessary changes there, and then have
+@command{texi2html} read this initialization file by one of
+the means described above.
+
+@c ========================================================
+@node Initialization files
+@chapter Overview of initialization files content and loading
+
+The initialization files are @command{perl} files, read as explained
+in @ref{Using init files}. You don't need to know much of @command{perl}
+to do some simple changes in variable values, however, to be able to
+really take advantage of all the features of the initialization file,
+a good knowledge of @command{perl} is required.
+
+In initialization file two kind of variables appear. These are normal
+variables (including arrays and hashes) and references on functions.
+The later permits the dynamic redefinition of functions used to produce
+the @acronym{HTML} manual. You should be able to change the value of some
+normal variables without a deep knowledge of @command{perl}, by looking
+at the existing examples. The possible mistakes in that case could be
+omitted @samp{;}, and bad quoting.
+
+Initialization file are loaded from the main program by
+the mean of a @code{require}, while in the @code{Texi2HTML::Config}
+namespace. This means that the namespace of the main program and
+the namespace of inititalization files are distinct, which ensures
+that no name clash should happen. The variables are declared with the
+@code{our} specifier, such that it should be possible to use the
+@code{use strict} pragma in the initialization file code.
+
+To avoid messing with the variables in the @code{main} namespace
+all the global variables which could be of use in the init files
+are in the @code{Texi2HTML} namespace. Notice that the functions
+of the main program are still in the @code{main} namespace.
+
+@menu
+* Redefining functions:: Function redefinition is achieved with
+ redefinition of references on functions.
+* Function prototypes:: Conventions used in that manual for function
+ reference prototypes display.
+@end menu
+
+@c --------------------------------------------------------
+@node Redefining functions
+@section Redefining functions in initialization files
+
+To redefine a function you must replace the corresponding funtion
+reference with a reference on your function.
+Thus you should write your function, give it a name you
+are certain it is unique in the @code{Texi2HTML::Config} namespace,
+and override the value of the function reference with your own
+function reference. When another function from the main program
+(or from another functions of an initialization file) calls the reference,
+your function will be used.
+
+For example the function
+reference corresponding with the function called when doing an
+anchor is called @variable{$anchor}. Thus if you want to override the
+corresponding function
+you could write:
+
+@example
+# override the function reference
+$anchor = \&my_own_function;
+
+# the function reference now refers to
+sub my_own_function @{
+# process arguments and return an html anchor
+@}
+@end example
+
+@c --------------------------------------------------------
+@node Function prototypes
+@section Conventions used for function prototypes
+
+As the functions are defined by a reference name, we will always
+use the reference name in function prototypes. For the function arguments
+we will use @code{\@@array} for a reference on an array and similarly
+@code{\%hash} for a reference on a hash.
+
+Thus, the prototype for the function associated with the function
+reference @samp{$formatting_function} will be:
+
+@deftypefn {Function Reference} $text formatting_function $arg1 \@@arg2
+@code{formatting_function} takes as first argument @var{$arg2},
+as second argument a reference on an array @var{\@@arg2}
+and returns the formatted text @var{$text}.
+@end deftypefn
+
+To redefined the corresponding function, you should write:
+
+@example
+$formatting_function = \&my_formatting_function
+
+sub my_formatting_function($ $)
+@{
+ my $arg1 = shift;
+ my $arg2 = shift;
+ # prepare $formatted_text
+ .....
+ return $formatted_text
+@}
+@end example
+
+@c --------------------------------------------------------
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@c ========================================================
+@c @include custpage.texi
+@node Changing the page layout
+@chapter Fine tuning of the page layout
+
+Some features of the page layout might be specified with command line
+options, the corresponding variables are described in
+@ref{Page layout options}.
+Fine tuning of the page layout may be achieved
+with redefinition of other variables and function references in the
+initialization files.
+
+@menu
+* The different pages:: The different categories of pages.
+* The page layout:: The elements of a page.
+* Navigation panel:: How to change the navigation panel.
+* Program variables:: The available main program variables and some
+ usefull functions from the main program.
+* Output initialization:: Setting variables before the document
+ production but after the texinfo parsing.
+* Output finalization:: Cleaning after document generation.
+* css:: Customizing css lines.
+* Customizing header::
+* Customizing section::
+* Customizing footer::
+* Special pages:: Customizing table of contents, top, about page.
+* File names:: Customizing the file names.
+* External index files:: Putting index entries in external files.
+@end menu
+
+@c --------------------------------------------------------
+@node The different pages
+@section The different categories of pages and sectioning elements
+
+The following sectioning elements can be associated with pages:
+
+@table @emph
+@item Normal elements
+These are normal sections or nodes. Their association with pages is
+determined by the splitting of the document. @xref{Splitting output}.
+@item Top element
+The top element is the higher element in the document structure.
+If there is a @code{@@top} section it is the element associated with
+that section. Otherwise it is the element associated with the
+@code{@@node Top}. If there is no @code{@@node Top} the first element is the
+top element.
+
+The top element is formatted differently than a normal element if there
+is a @code{@@top} section or the @code{@@node Top} isn't associated
+with a sectioning command.
+@item Misc elements
+These elements are associated with pages if the document is split.
+There are four misc elements:
+@enumerate
+@item Table of contents
+@item Short table of contents, also called Overview
+@item Footnotes page
+@item About page
+@end enumerate
+
+The @emph{About page} shouldn't be present for documents consisting
+in only one sectioning element. The @emph{Footnote page} should only
+be present if the footnotes appear on a separated page
+(@pxref{Page layout options}), however a footnote element is present if
+the document isn't split. The @emph{Table of contents} should only
+be formatted if @code{@@contents} is present in the document.
+Similarly the @emph{Overview} should only appear if @code{@@shortcontents}
+or @code{@@summarycontents} is present.
+@end table
+
+@c --------------------------------------------------------
+@node The page layout
+@section Page layout and navigation panel overview
+
+A page is broken up in three parts. A page header, the sections
+and a page footer. A common element in the page layout is a navigation
+panel with icons or text linking to other sections or pages. Another
+common element is a rule, separating sections or footer. The navigation
+panel and the rules may be part of the sections or part of headers or
+footers. You may use the variables @variable{$SMALL_RULE},
+@variable{$DEFAULT_RULE}, @variable{$MIDDLE_RULE} and @variable{$BIG_RULE}
+for rules of different sizes.
+The defaults are
+@example
+$SMALL_RULE = '<hr size="1">';
+$DEFAULT_RULE = '<hr>';
+$MIDDLE_RULE = '<hr size="2">';
+$BIG_RULE = '<hr size="6">';
+@end example
+
+In the header some important meta data may be defined, like the
+title or style information, and textual informations may be present
+in comments. All this doesn't appear directly in the displayed
+@acronym{HTML}, though.
+
+The page layout is mainly controlled by functions, the precise functions
+called depending on the document splitting. The navigation panel, however,
+can be customized with variables.
+
+@subheading Element labels
+@anchor{Element labels}
+
+There are 19 items associated with elements. Each of these
+is associated with a name and a reference to the
+element they represent, when such an element exists.
+The element is either a global element or an element relative to the current
+element. The relative elements are found with respect with the document
+structure defined by the section structuring commands (@code{@@chapter},
+@code{@@unnumbered}@dots{}) or by the nodes (in that case the node
+directions are specified on node line or in menu organization).
+These items are called @dfn{element labels}. They may be associated with
+a button (@pxref{Button specifications}), and used in the formatting functions
+(@pxref{Program variables}).
+
+Here is the list:
+
+@table @emph
+@item @samp{@ }
+An empty button
+@item Top
+Top element. The associated name is @variable{$TOP_HEADING} if that variable is
+defined. This variable is not set by default.
+@item Contents
+Table of contents
+@item About
+About (help) page
+@item Overview
+Overview, short table of contents
+@item First
+First element in reading order
+@item Last
+Last element in reading order
+@item Index
+The first chapter with @code{@@printindex}. The associated name
+is @variable{$INDEX_CHAPTER}, if the variable is set. This variable is not set
+by default.
+@item This
+The current element
+@item Back
+Preceding element in reading order
+@item FastBack
+Beginning of this chapter or previous chapter if the element is a chapter
+@item Prev
+Previous section on the same level
+@item NodePrev
+Previous node
+@item Forward
+Next element in reading order
+@item FastForward
+Next chapter
+@item Next
+Next section on the same level
+@item NodeNext
+Next node
+@item Following
+Next node in node reading order
+@item Up
+Up section
+@item NodeUp
+Up node
+@end table
+
+@c --------------------------------------------------------
+@node Navigation panel
+@section Customization of the navigation panels buttons
+
+A lot of customization of the navigation panel may be achieved without
+redefining functions, with variables redefinition.
+In case it isn't enough, it is also possible to redefine the function
+doing the navigation panel formatting.
+
+@menu
+* General purpose variables:: Variables controlling the navigation panel
+ at a global level
+* Button specifications::
+* Panel formatting function::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node General purpose variables
+@subsection Controlling the navigation panel panel at a high level
+
+The global formatting of the navigation panels may be
+changed with the following variables:
+
+@vtable @code
+@item $VERTICAL_HEAD_NAVIGATION
+A vertical navigation panel will be used for the header navigation
+panel if this variable is true.
+@item $ICONS
+Icons are used instead of
+textual buttons if this variable is true.
+@item $SECTION_NAVIGATION
+If this variable is false there is no section navigation, no navigation
+panels for the elements within the pages, only at
+the beginning and the end of the page (@pxref{Page layout options}).
+@end vtable
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Button specifications
+@subsection Specifying the buttons formatting
+
+Several arrays and hashes enable a precise control on the buttons and
+their display.
+The following arrays determine the buttons present in navigation panels:
+
+@vtable @code
+@item @@SECTION_BUTTONS
+This array is used for the navigation panel buttons present at the begining
+of sectioning elements. If split at node or section they are also used
+at the page footer, and in the case of section navigation at the page header.
+@item @@SECTION_FOOTER_BUTTONS
+@itemx @@NODE_FOOTER_BUTTONS
+This array is used for the navigation panel buttons present at the footer
+of pages when split at node or at section.
+
+If @variable{$WORDS_IN_PAGE} is set and the output is split at nodes, these
+buttons are only present if there are more than @variable{$WORDS_IN_PAGE}
+words in the sectioning element text. This counting is very rough and include
+punctuation marks, html elements, numbers. The default is to include the
+buttons after 300 words.
+@item @@CHAPTER_BUTTONS
+This array is used for the buttons appearing at the page footer if split at
+chapter, and at the page header if split at chapter and there is no section
+navigation.
+@item @@MISC_BUTTONS
+These buttons appear at the beginning of special and sections
+and at the end of these section pages if the output is split.
+@end vtable
+
+The array specify the buttons displayed in navigation panels,
+and how the button is displayed.
+Each element is associated with
+a button of the navigation panel from left to right.
+The signification of the array element value is the following:
+
+@table @emph
+@item reference on a function
+The function is called with first argument a filehandle reference on the
+current file and second argument a boolean true if the navigation
+panel should be vertical.
+@item reference on a scalar
+The scalar value is printed. For some possibly
+usefull scalars, @ref{Elements hashes}.
+@item reference on an array
+In this case the first array element should be a reference on text and the
+second element an element label. In that case a link to the
+element associated with the element label with the scalar value
+text is generated.
+
+For example if the buttons array element is
+@example
+[ 'Next', \$Texi2HTML::NODE@{Next@} ]
+@end example
+
+The button will be a link to the next section with text
+@variable{$Texi2HTML::NODE@{Next@}}.
+@item element label
+If icons are not used, the button is a link to the corresponding
+element which text is defined by the value associated with the
+element label in the @variable{%NAVIGATION_TEXT} hash, surrounded
+by @samp{[} and @samp{]}. If the element label is @samp{ }, there is
+no @samp{[} and @samp{]}.
+The element of the @code{%NAVIGATION_TEXT} hash are defined
+dynamically, in the @code{init_out} function reference
+(@pxref{Output initialization}).
+
+If icons are used, the button is an image with file determined by
+the value associated with the element label in the @variable{%ACTIVE_ICONS}
+hash if the the link really leads to an element, or in the @variable{%PASSIVE_ICONS}
+hash if there is no element to link to. Of course if there is a link to the
+element the icon links to that element.
+@end table
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Panel formatting function
+@subsection Changing the navigation panel formatting
+
+If you are not satisfied with this scheme, it is possible to
+control exactly the formatting of navigation panels by redefining a function
+reference. The function controlling the display of navigation panel is
+associated with the following function reference:
+
+@deffn {Function Reference} print_navigation $filehandle \@@buttons $vertical
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{\@@buttons} is an array reference which should hold the specification of
+the buttons for that navigation panel. @var{$vertical} is true if the
+navigation panel should be vertical.
+@end deffn
+
+@c --------------------------------------------------------
+@node Program variables
+@section Main program variables and usefull functions
+
+In the functions
+controlling the page layout some global variables set by the main
+program are available, with value corresponding with the current
+layout element.
+
+@menu
+* Elements hashes:: Accessing information related with the
+ different elements
+* Global informations:: Accessing global informations, like date,
+ title@dots{}
+* Global functions:: main program usefull functions
+@end menu
+
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Elements hashes
+@subsection Accessing elements informations
+
+Four hashes are available, with key the elements labels (as described
+in @ref{Element labels}) and values:
+
+@vtable @code
+@item %Texi2HTML::NAME
+The formatted element name
+@item %Texi2HTML::HREF
+The element hypertext reference
+@item %Texi2HTML::NODE
+The element node name
+@item %Texi2HTML::NO_TEXI
+The element name after removal of texi commands
+@end vtable
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Global informations
+@subsection Accessing global informations
+
+Three kinds of global informations are available, miscalleneous global
+strings, flags set by @code{@@set} and special flags and section lines.
+
+@subsubheading Global strings
+The @variable{%Texi2HTML::THISDOC} hash holds some global informations:
+
+@table @code
+@item fulltitle
+title set by @code{@@title}. If there is no @code{@@title} other
+possibilities are tried (@code{@@settitle}, @code{@@shorttitlepage}@dots{}).
+@item title
+title set by @code{@@settitle}, or @code{fulltitle}.
+@item title_no_texi
+title without texi formatting
+@item title_texi
+title with texi commands
+@item author
+Authors list set by @code{@@author}.
+@item authors
+A reference on an array containing each author set by @code{@@author}.
+@item copying
+Text appearing in @code{@@copying} with all the texinfo commands removed,
+put in comments.
+@item program
+The name and version of @command{texi2html}.
+@item program_homepage
+Homepage for @command{texi2html}.
+@item program_authors
+Authors of @command{texi2html}.
+@item file_base_name
+base name of the texinfo manual file.
+@item destination_directory
+Destination directory for the resulting files.
+@item toc_file
+The file name of the table of contents.
+@item today
+The date.
+@end table
+
+It also holds the arg of the following commands, associated with the command
+name: kbdinputstyle, paragraphindent, setchapternewpage, headings,
+footnotestyle,
+ exampleindent, firstparagraphindent, everyheading, everyfooting,
+ evenheading, evenfooting, oddheading, oddfooting.
+
+
+@subsubheading Flags
+Flags defined by @code{@@set} may be accessed through the
+@variable{%main::value} hash. The key is the flag name, the value is the
+flag value at the end of the document.
+
+Special flags are set by the main program. They correspond with a texinfo
+command, like @code{@@setfilename}, or @code{@@settitle},
+@code{@@author}@dots{} The corresponding flag is the command name with
+@samp{_} appended, for example, @code{_titlefont} corresponds with
+@code{@@titlefont}. Like other flags they are available in
+@variable{%main::value}.
+
+
+@subsubheading Section lines
+
+The following array references or arrays holds formatted lines:
+
+@vtable @code
+@item $Texi2HTML::THIS_SECTION
+Lines of the current element.
+@item $Texi2HTML::THIS_HEADER
+Lines of the current element appearing before the element label (anchors).
+@item $Texi2HTML::OVERVIEW
+Lines of short table of contents. @xref{Special pages}.
+@item $Texi2HTML::TOC_LINES
+Lines of table of contents. @xref{Special pages}.
+@end vtable
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Global functions
+@subsection Function usefull in page formatting
+
+The usefull function is a function used to print an array of lines, which
+also counts the number of words in the array, if needed.
+
+@deftypefun $words_number main::print_lines $filehandle \@@lines_array
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{\@@lines_array} is the array line the function should write to the file.
+If this argument is omitted, the function uses @variable{$Texi2HTML::THIS_SECTION}.
+@var{$words_number} is the number of words in the array, only defined if
+split at nodes and @variable{$WORDS_IN_PAGE} is defined.
+@end deftypefun
+
+@c --------------------------------------------------------
+@node Output initialization
+@section Preparing the output
+
+After the texinfo file has been parsed, some information is available
+which can be used to modify some variables and prepare the outputting.
+For example the document language, the document encoding,
+values set with @code{@@set} or @code{@@setfilename} and other similar
+@@-commands are not known before the texinfo parsing.
+
+The following function reference may be redefined to be called after
+texinfo processing and before document generation:
+
+@deftypefn {Function Reference} $encoding init_out
+This function perform the initialization of variables and any other
+task before document outputting. It returns the encoding used for the
+output files.
+@end deftypefn
+
+In the default case the @variable{$BODYTEXT} (@pxref{Customizing header})
+and the hashes @variable{%NAVIGATION_TEXT} (@pxref{Button specifications}) and
+@variable{%BUTTONS_GOTO} (@pxref{About text}) are initialized.
+
+To perform the default initializations and also add more code, you could
+do as in the following example (save the default function reference and call
+it in your own function) :
+
+@example
+my $default_init_out = $init_out;
+$init_out = \&makeinfo_like_init_out;
+sub makeinfo_like_init_out()
+@{
+ my $encoding = &$default_init_out();
+ $NAVIGATION_TEXT@{'Following'@} = ' &gt; ';
+ return $encoding;
+@}
+@end example
+
+@c --------------------------------------------------------
+@node Output finalization
+@section Finalizing the output
+
+If you want to do some cleaning after the document was generated (close
+files, write at the end of files and so on), the following function
+reference may be redefined:
+
+@deffn {Function Reference} finish_out
+This function is called after the document generation.
+@end deffn
+
+The default is to do nothing.
+
+@c --------------------------------------------------------
+@node css
+@section Customizing the @command{texi2html} css lines
+
+It is possible to modify the @command{texi2html} css lines by modifying
+the entries or adding to the @variable{%css_map} hash. Each key is a css
+selector, the corresponding value is a style string.
+
+The whole css text is in the variable @variable{$CSS_LINES}. If this
+variable is defined the variable value is used instead of being
+constructed using the @variable{%css_map} entries. For example if you don't
+want any css entries, set
+
+@example
+$CSS_LINES = '';
+@end example
+
+It is also possible to change completely the way @variable{$CSS_LINES} are
+generated by redefining the following function reference:
+
+
+@deffn {Function Reference} css_lines \@@import_lines \@@rule_lines
+This function should be used to construct the @variable{$CSS_LINES}.
+@var{\@@import_lines} are the @code{@@import} lines of the
+files specified with @longopt{include-css},
+and @var{\@@rule_lines} are the css commands lines of these files.
+@xref{Style options}.
+@end deffn
+
+@c --------------------------------------------------------
+@node Customizing header
+@section Customizing the page header
+
+It is possible to add lines to the text within the @code{<head>}
+@acronym{HTML} elements, by defining the variable @variable{$EXTRA_HEAD}.
+Similarly it is possible to add text just after the @code{<body>}
+element with the variable @variable{$AFTER_BODY_OPEN}.
+These variables are empty by default.
+
+The encoding of the texinfo file is defined by @variable{$DOCUMENT_ENCODING}
+if no @code{@@documentencoding} appears in the document.
+The default is a @samp{en-ascii} encoding.
+The encoding of the resulting document is defined by
+@variable{$ENCODING}. The default is the @code{$DOCUMENT_ENCODING}.
+
+The description of the document may be specified in
+@variable{$DOCUMENT_DESCRIPTION}. If this variable is undef, the text
+associated with @code{@@documentdescription} is used, and if there isn't
+such test a default description is constructed using the document title and
+the name of the first section of the file.
+
+The @code{<body>} element attributes may be set by defining the
+variable @variable{$BODYTEXT}. If you want to define that variable
+dynamically, you should use the @code{init_out} function reference
+(@pxref{Output initialization}).
+
+The default functions call the function associated with
+@variable{$print_head_navigation} to format the navigation panel for the
+page header. Thus you can control parts of the formatting by
+redefining the function reference.
+
+@deffn {Function Reference} print_head_navigation $filehandle \@@buttons
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{\@@buttons} is an array reference which should hold the specification of
+the buttons for the navigation panel.
+@end deffn
+
+If you want even more control, you can have full control over the page header
+formatting by redefining three function references. The function associated
+with @variable{$print_page_head} is called for all the pages, and after that,
+the function associated with @variable{$print_chapter_header} is called
+if the document is split at chapters, or the function associated with
+@variable{$print_section_header} is called if the document is split at sections.
+
+@deffn {Function Reference} print_page_head $filehandle
+@var{$filehandle} is the opened filehandle the function should write to.
+This function should print the page head, including the @code{<body>}
+element.
+@end deffn
+
+@deffn {Function Reference} print_chapter_header $filehandle
+@var{$filehandle} is the opened filehandle the function should write to.
+This function is called if the document is split at chapters, after
+@code{print_page_head}.
+@end deffn
+
+@deffn {Function Reference} print_section_header $filehandle
+@var{$filehandle} is the opened filehandle the function should write to.
+This function is called if the document is split at sections, after
+@code{print_page_head}.
+@end deffn
+
+@c --------------------------------------------------------
+@node Customizing section
+@section Customizing the sections
+
+The functions associated with the following function references are used for
+the formatting of sections:
+
+@deffn {Function Reference} print_section $filehandle $first_in_page $previous_is_top
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{$first_in_page} is true if this section is the first section in the page.
+@var{$previous_is_top} is true if this section is the section following the
+Top section.
+This function should print the current section.
+@end deffn
+
+@deffn {Function Reference} end_section $filehandle $last_element_or_before_top
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{$last_element_or_before_top} is true if this section precedes the top
+element or is the last one in page, or before the special elements.
+@end deffn
+
+@c --------------------------------------------------------
+@node Customizing footer
+@section Customizing the page footer
+
+It is possible to add text just before the @code{</body>}
+element with the variable @variable{$PRE_BODY_CLOSE}. Nothing is added
+by default.
+
+@ignore
+The footer text may be influenced by @variable{$ADDRESS} which should hold
+information about who created the document and how.
+If you want to define that variable
+dynamically, you could redefine the following function reference:
+
+@deftypefn {Function Reference} $address_text address $user $date
+This function should return the address. @var{$user} is the user name
+of the user running @command{texi2html}, @var{$date} is the date of the day.
+@end deftypefn
+@end ignore
+
+The default functions call the function associated with
+@variable{$print_foot_navigation} to format the navigation panel for the
+page footer. Thus you can control parts of the formatting by
+redefining the function reference.
+
+@deffn {Function Reference} print_foot_navigation $filehandle \@@buttons
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{\@@buttons} is an array reference which should hold the specification of
+the buttons for the navigation panel.
+@end deffn
+
+If you want even more control, you can have full control the page footer
+formatting by redefining three function references.
+The function associated with @variable{$print_chapter_footer} is called
+if the document is split at chapters, or the function associated with
+@variable{$print_section_footer} is called if the document is split at sections.
+ After that the function associated
+with @variable{$print_page_foot} is called.
+
+@deffn {Function Reference} print_page_foot $filehandle
+@var{$filehandle} is the opened filehandle the function should write to.
+This function should print the page foot, including the @code{</body>}
+element.
+@end deffn
+
+@deffn {Function Reference} print_chapter_footer $filehandle
+@var{$filehandle} is the opened filehandle the function should write to.
+This function is called if the document is split at chapters, before
+@code{print_page_foot}.
+@end deffn
+
+@deffn {Function Reference} print_section_footer $filehandle
+@var{$filehandle} is the opened filehandle the function should write to.
+This function is called if the document is split at sections, before
+@code{print_page_foot}.
+@end deffn
+
+
+@c --------------------------------------------------------
+@node Special pages
+@section Special pages formatting
+
+For the special elements, two things must be formatted: the content
+and the page layout
+
+@menu
+* Special pages content::
+* Special pages layout::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Special pages content
+@subsection Customizing the content of the special pages
+
+@menu
+* Top element text::
+* Contents and Overview text::
+* Footnotes text::
+* About text::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Top element text
+@subsubsection Top element text formatting
+The top element formatting is controlled by three function which also
+controls the layout of the top element page or section. The associated
+function references are:
+
+@deffn {Function Reference} print_Top_header $filehandle $begin_page
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{$begin_page} is true if the element is the first in a page.
+This function should begin the Top element. At the time this function is called
+the top element text hasn't been parsed.
+@end deffn
+
+@deffn {Function Reference} print_Top $filehandle $has_top_heading
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{$has_top_heading} is true if there is a @code{@@heading} command or
+@code{@@titlefont} command appearing in the Top element text.
+This function should be used to format the Top element text and navigation
+panel.
+@end deffn
+
+@deffn {Function Reference} print_Top_footer $filehandle $end_page
+@var{$filehandle} is the opened filehandle the function should write to.
+@var{$end_page} is true if the element is the last in a page.
+This function should end the Top element.
+@end deffn
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Contents and Overview text
+@subsubsection Table of contents and Short table of contents
+Several variables may be used to control the formatting of table of contents
+and short table of contents:
+
+@vtable @code
+@item $DO_CONTENTS
+If the variable is true a table of contents is done even if there is no
+@code{@@contents} command.
+@item $DO_SCONTENTS
+If the variable is true a short table of contents is done even if there is no
+@code{@@summarycontents} command.
+@item $BEFORE_OVERVIEW
+The variable value is inserted before the short table of contents text.
+@item $AFTER_OVERVIEW
+The variable value is inserted after the short table of contents text.
+@item $BEFORE_TOC_LINES
+The variable value is inserted before the table of contents text.
+@item $AFTER_TOC_LINES
+The variable value is inserted after the table of contents text.
+@item $TOC_LIST_STYLE
+This should contain a css style used for the list style if the tables of
+content are formatted with a list.
+@item $TOC_LIST_ATTRIBUTE
+This should contain an attribute text used for the list element if the tables of
+content are formatted with a list.
+@end vtable
+
+More control on the table of contents and short table of contents formatting
+may be achieved by redefining a function with the following associated
+function reference:
+
+@deffn {Function Reference} toc_body \@@elements
+@var{\@@elements} is an array reference contining informations about
+all the elements of the document. Each of the entry of this array is an hash
+reference which entries correspond with different informations
+about the element. Interesting keys have the following meaning:
+
+@table @code
+@item top
+true if the element is the top element,
+@item index_page
+true if the element is an index page added because of index splitting,
+@item toc_level
+level of the element in the table of content. Highest level
+is 1 for the top element and for chapters, appendix and so on,
+2 for section, unnumberedsec and so on...
+@item tocid
+label used for reference linking to the element in table of
+contents,
+@item file
+the file containing the element, usefull to do href to that file
+in case the document is split,
+@item text
+text of the element, with section number,
+@item name
+text of the element, without section number.
+@end table
+
+This function doesn't return anything but should fill the array corresponding
+with the
+@variable{$Texi2HTML::TOC_LINES} and
+@variable{$Texi2HTML::OVERVIEW} references with the table of contents and short
+table of contents.
+
+@end deffn
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Footnotes text
+@subsubsection Formatting of footnotes text
+
+The footnotes text is allready formatting when @code{@@footnote} commands
+are expanded. @xref{Footnotes}.
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node About text
+@subsubsection Formatting of about text
+
+The default about element contains an explaination of the buttons used
+in the document (@code{@@SECTION_BUTTONS}, @ref{Button specifications}) and
+an example locating the buttons targets in an example.
+The formatting of this text may be influenced by the following
+hashes and variables:
+
+@table @code
+@item $PRE_ABOUT
+@itemx $AFTER_ABOUT
+This variable may be a scalar or a function reference.
+If it is a scalar, the value is used.
+If this is a function reference it is expanded and the returned text is
+used. The text is added before or after the main about text.
+@item %BUTTONS_GOTO
+
+The keys of this hash are element labels (@pxref{Element labels}). The value
+is the text associated with the element label in the about text.
+The element of the hash are defined
+dynamically, you should in the @code{init_out} function reference
+(@pxref{Output initialization}).
+
+
+@item %BUTTONS_EXAMPLE
+
+The keys of this hash are element labels (@pxref{Element labels}). The value
+is the text associated with the element label in the about example,
+typically a section number.
+
+@end table
+
+If this is not enough and you want to control exactly the formatting of
+the about text, you can redefine the function associated with the following
+function reference:
+
+@deftypefn {Function Reference} $about_text print_about
+This function should return the about text.
+@end deftypefn
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Special pages layout
+@subsection Customizing the layout of the special pages
+
+The formatting of each of the special pages, or section in case
+the document is not split, is controlled by a function.
+The associated function reference is called accordingly:
+
+@ftable @code
+@item print_Top
+@item print_Top_header
+@item print_Top_footer
+Formatting of top element page or section. It is also used for the formatting
+of the top element text (@pxref{Top element text}).
+@item print_Toc
+Formatting of table of contents page or section
+@item print_Overview
+Formatting of short table of contents page or section
+@item print_About
+Formatting of about (help) page or section
+@item print_Footnotes
+Formatting of footnotes section or page in case footnotes are on a
+separated page or the document isn't split.
+@end ftable
+
+In the default case, @variable{$print_Top} calls @variable{$print_Top_header} for
+the header and @variable{$print_Top_footer} for the footer of top element.
+All the other function call @variable{$print_misc} which in turn calls
+@variable{$print_misc_header} for the headers and @variable{$print_misc_footer}
+for the footers.
+
+@c --------------------------------------------------------
+@node File names
+@section Customizing the file names
+
+It is possible to specify the file names with more control than with the
+command line options (@pxref{Output files}).
+First the extension may be overrided by the variable @variable{$EXTENSION}
+value.
+Two function references enable
+further customization. One is usefull in case @variable{$NODE_FILES} is true
+and it is used to customize the node file name itself and is also used
+to produce a file name with a redirection leading to the node file.
+
+@deftypefn {Function Reference} {($node_file $redirection_node_file)} node_file_name $node
+@var{$node} is a hash reference with the following interesting keys (there
+are much more keys):
+@table @code
+@item texi
+The texinfo node name.
+@item with_section
+True if associated with a section.
+@end table
+The result is the node file name @var{$node_file}, and the file containing
+a redirection to the node @var{$redirection_node_file}.
+@end deftypefn
+
+The other is usefull if @code{$NODE_FILES} isn't true. It is used to
+customize the file associated with each element.
+@deftypefn {Function Reference} $file element_file_name $element $is_top $docu_name
+@var{$element} is a hash reference with the following interesting keys (there
+are much more keys):
+@table @code
+@item texi
+The texinfo element name.
+@item number
+The number associated with a section.
+@item doc_nr
+A number incremented whenever a new file should begin, based on how the
+document is split (@pxref{Splitting output}).
+@item text
+The element text.
+@item name
+The element text without section number.
+@end table
+@var{$is_top} is true if the element is considered as the top element.
+@var{$docu_name} is the basename of the texinfo manual.
+The result is the element file name.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node External index files
+@section Generation of external files for index entries
+
+Within the document, @code{@@printindex} commands are expanded as explained
+in @ref{Index list}. In case you want to do something special with index
+entries, outside of the document, you should first set the variable
+@variable{$IDX_SUMMARY} true. After that some function reference will be called
+for each non empty index. For each index there are 3 function
+references, one called for initialization, one called for each index entry
+and the last one called for finalazation.
+
+@deffn {Function Reference} index_summary_file_begin $index_name $is_printed
+@var{$index_name} is the two letters name for the index.
+This function
+is called for each index
+appearing in the document, before
+@code{index_summary_file_entry}.
+@var{$is_printed} is true if there is a @code{@@printindex} for that index.
+@end deffn
+
+@deffn {Function Reference} index_summary_file_entry $index_name $entry_text $entry_reference $formatted_entry $texi_entry $entry_element_reference $entry_element_header $is_printed
+This function is called for each entry of an index. @var{index_name} is the
+name of the index. @var{$entry_text} is the entry in plain text,
+@var{$formatted_entry} is the index entry formatted, @var{$texi_entry} is the
+entry with texinfo commands. @var{$entry_reference} is the reference placed
+at the index entry place, in the form @samp{file#id}.
+@var{$entry_element_header} is the formatted header of the element containing
+the index entry. @var{entry_element_header} is the reference to the
+beginning of the element containing the index entry, in the form
+@samp{file#id}.
+@var{$is_printed} is true if there is a @code{@@printindex} for that index.
+@end deffn
+
+@deffn {Function Reference} index_summary_file_end $index_name $is_printed
+@var{$index_name} is the two letters name for the index. This function
+is called for each index appearing in the document, after
+@code{index_summary_file_entry}.
+@var{$is_printed} is true if there is a @code{@@printindex} for that index.
+@end deffn
+
+@c ========================================================
+@node Customizing HTML
+@chapter Customizing @acronym{HTML} and text style in init files
+
+Some simple customization may be achieved with the redefinition of the
+variables
+associated with the command line options. For the description and an
+explanation of the meaning of these variables, @ref{Style options}.
+
+Other variables and hash entries can be modified in initialization file
+to achieve more customization.
+Lastly, functions references corresponding with functions called from
+the main program and initialization files may
+be redefined.
+
+@menu
+* Three contexts:: there are three different contexts for command
+ expansion: normal text, preformatted text and
+ strings.
+* Commands without argument::
+* Style and accent commands::
+* Anchors images and spaces:: Formatting of @code{@@anchor}, @code{@@image}, @code{@@sp}, @code{@@acronym}, @code{@@abbr}
+* Text:: Some characters are processed specially
+* Strings:: @command{texi2html} write some strings in the output
+ different for each languages
+@c * Skipped commands::
+* References::
+* Alignement commands:: @code{@@center}, @code{@@flushleft}@dots{}
+* Paragraph and preformatted region::
+* Complex formats:: @code{@@example}, @code{@@display}@dots{}
+* Lists tables::
+* Definitions::
+* Headings::
+* Special regions:: @code{@@verbatim}, @code{@@cartouche}, @code{@@quotation}
+* Menus::
+* Indices::
+* Floats and lists of floats:: @code{@@float} and @code{@@listoffloats}
+* Footnotes::
+* Other and unknown commands:: You can handle specifically other commands
+
+@end menu
+
+@c --------------------------------------------------------
+@node Three contexts
+@section Three contexts for expansions: preformatted, normal and string
+
+There are three contexts of interest, one is the normal context, the other
+is a special context, called the @dfn{preformatted} context and the last is
+the string context. The preformatted
+context occurs when the spacing between words is kept. This is the
+case, for example, in @code{@@display} or @code{@@example} regions, and in
+menu comments (@pxref{Menus}). The preformatted regions are usually
+rendered in @code{<pre>} elements in @acronym{HTML}.
+The string context occurs when rendering strings without formatting elements,
+in comments or titles for example.
+
+@c --------------------------------------------------------
+@node Commands without argument
+@section Customizing the formatting of commands without argument
+
+This includes the commands whose name is a nonletter character like @code{@@@@},
+the commands with lettered characters and braces
+but whose braces should be empty, like @code{@@TeX@{@}}, or some commands
+associated with accentted letters like @code{@@AA@{@}}. If there happens to
+be something within the braces, it is put after the command, thus
+@example
+@@TeX@{something@}
+@end example
+leads to the same than
+@example
+@@TeX@{@} something
+@end example
+
+Each of these categories of commands have three associated hashes, one
+for normal
+context, the other for preformatted context and the last in strings. The
+keys of the hashes are the
+command names, the associated value is the text replacing the command.
+
+The hashes are:
+@multitable {one nonlettered character} {normal text} {preformatted text} {string}
+@item command type @tab normal text @tab preformatted text @tab string
+@item one nonlettered character @tab @variable{%simple_map} @tab @variable{%simple_map_pre} @tab @variable{%simple_map_texi}
+@item nothing in braces @tab @variable{%things_map} @tab @variable{%pre_map} @tab @variable{%texi_map}
+@end multitable
+
+To change the @acronym{HTML} resulting from these constructs, just change the
+value. For example, if you want @code{&shy;} to be outputted for @code{@@-}
+in normal and preformatted context, write in your init file:
+
+@example
+$simple_map@{'-'@} = '&shy;';
+$simple_map_pre@{'-'@} = '&shy;';
+@end example
+
+@c --------------------------------------------------------
+@node Style and accent commands
+@section Customizing accent, style and other simple commands
+
+The formatting of the @acronym{HTML} produced by style and indicatric
+commands (@code{@@tt}, @code{@@code},
+@code{@@email}, @code{@@titlefont}), the accentuation related
+commands taking argument (@code{@@'}, @code{@@udotaccent}, @code{@@dotless})
+and miscalleneous commands (@code{@@email}, @code{@@verb}, @code{@@w},
+@code{@@uref}, @code{@@math}, @code{@@asis}) is controlled by two hash in the
+default case,
+@variable{%style_map} for normal context, @variable{%style_map_pre} for
+preformatted context and @variable{%style_map_texi} in string context.
+
+The key of the hashes are the command names. There are two possibilities for
+the values corresponding with two interfaces. The values may be strings or
+hash references, and you can chose the interface depending on the one you
+prefer. The interface with hash reference is a bit more flexible but might also
+be regarded as more complex. If you don't like either of these interfaces you
+can define your own.
+
+Some remarks are in order:
+
+@itemize
+@item
+The nonlettered accent commands which following character is considered
+to be the argument (like in @code{@@`a}) should be keys of the
+hash @variable{%accent_map} hash, even if no value is associated.
+@item
+@code{@@math} is handled differently if La@TeX{}2HTML is used.
+@end itemize
+
+@menu
+* Hash reference interface::
+* String interface::
+* Define your own interface::
+@end menu
+
+@node Hash reference interface
+@subsection An interface for commands formatting with a hash reference
+
+The key of the hashes are the command names. The value determine how the command argument
+is formatted. This value is a reference on a hash. In this hash each key
+corresponds with a type of information for the formatting, and the value is
+the corresponding information. For example, in
+
+@example
+$style_map@{'command'@} = @{ 'args' => ['code'], 'attribute' => 'code'@};
+@end example
+
+the arguments for @code{@@command} are interpreted as specified by
+the values associated with the @samp{args} key while the attribute associated
+with that command is @samp{code}.
+
+The following keys in the hashes associated with each command have the
+following meaning:
+
+@table @samp
+@item args
+@anchor{Reference hash args}
+The value associated is a reference on an array. Each element of the array
+defines how the arguments (separated by @samp{,} in the texinfo code) for
+the @@-command should be
+formatted. The possibilities are
+@table @code
+@item normal
+for normal text,
+@item code
+for text with @samp{---}, @samp{--}, @samp{''} and @samp{``} kept as is,
+@item keep
+if the texinfo should be kept as is, without interpretation of the @@-commands.
+@end table
+
+For example, we have
+@example
+$style_map@{'email'@}->@{'args'@} = ['code', 'normal'];
+@end example
+
+because @samp{---}, @samp{--}, @samp{''} and @samp{``} should be kept as is in
+the first argument of @code{@@email}.
+
+The default is @samp{['normal']}.
+
+@item attribute
+
+If the associated value is a word, it is considered to be an @acronym{HTML}
+element name, and the argument is enclosed between the element opening
+and the element closing. For example, if the value is @code{elem}, the
+resulting @acronym{HTML} is @code{<elem>@var{arg}</elem>}.
+
+If the text is a word followed by some text,
+the word and is interpreted as above, and the
+text is considered to be the attributes text of the element.
+Thus @code{elem class="elem"} leads to
+@code{<elem class="elem">@var{arg}</elem>}.
+
+This works only if there is only one argument.
+
+@item begin
+
+The associated value is added in front of the text.
+
+@item begin
+
+The associated value is added after the text.
+
+@item quotes
+
+If the corresponding value is true, the result is
+enclosed in quotes @variable{$OPEN_QUOTE_SYMBOL} and
+@variable{$CLOSE_QUOTE_SYMBOL}, with defaults
+@samp{`} and @samp{'}.
+
+@item function
+
+The corresponding value should be a function reference. The corresponding
+function is called with the following arguments:
+
+@table @code
+@item $command
+The @@-command name
+@item $args
+A reference on an array containing the arguments of the @@-command.
+@item $style_stack
+A reference on an array containing the name of the @@-commands containing
+the @@-command being formatted.
+@item $state
+A reference on a hash containing a lot of informations about the context
+of the @@-command.
+@item $line_nr
+An opaque structure containing the information about the line number of the
+@@-command. It can be used to call @code{main::echo_error} or
+@code{main::echo_warning} with first argument a message, and second argument
+@code{$line_nr}.
+@end table
+@end table
+
+@node String interface
+@subsection An interface for commands formatting with a string
+
+The keys of the hashes are the command names. The value determine
+how the command argument
+is formatted. If the value begins with @samp{"}, the result is
+enclosed in quotes @variable{$OPEN_QUOTE_SYMBOL} and
+@variable{$CLOSE_QUOTE_SYMBOL}, with defaults
+@samp{`} and @samp{'}.
+
+The command argument is allready formatted as @acronym{HTML}.
+The remaining of the value text
+(or the value text if there were no @samp{"}) is interpreted as follow:
+
+@itemize @bullet
+@item
+If the text is empty the argument of the command is left as is.
+@item
+If the text is a @samp{&} followed by a name,
+like @samp{&function}, the name is considered to be a function name,
+and this function is called to format the argument of the command. The
+first argument of the function is the command name, the second is
+the command argument. For example, if the value associated with the
+(fictituous) command @code{@@foo} is @code{&my_func}
+and we have:
+
+@example
+sub my_func
+@{
+ my @@args = split /,\s*/ $_[1];
+ return "$_[0]: $args[0]" if ($args[1] = 1);
+ return "$args[0]";
+@}
+@end example
+
+The result of
+@example
+@@foo@{truc, 1@}
+@@foo@{truc, bidule@}
+@end example
+will be
+@example
+foo: truc
+truc
+@end example
+@item
+If the text is a word, it is considered to be an @acronym{HTML} element
+name, and the argument is enclosed between the element opening
+and the element closing. For example, if the value is @code{elem}, the
+resulting @acronym{HTML} is @code{<elem>@var{arg}</elem>}.
+Similarly @code{"quoted} leads to
+@code{`<quoted>@var{arg}</quoted>'}.
+@item
+If the text is a word followed by some text,
+the word and is interpreted as above, and the
+text is considered to be the attributes text of the element.
+Thus @code{elem class="elem"} leads to
+@code{<elem class="elem">@var{arg}</elem>}.
+@end itemize
+
+@node Define your own interface
+@subsection Defining the style and indicatric commands interface
+
+If you don't like this scheme, it is possible to change how those commands
+are processed by redefining the following function reference:
+
+@deftypefn {Function Reference} $resulting_text style $style $command $text $args $no_close $no_open $line_nr $state $style_stack
+@var{$command} is the @@-command, @var{$style} is the value associated with
+the @var{$command} in the @code{%style_map}, @code{%style_map_pre}
+or @code{%style_map_texi} hashes.
+The @var{$text} is the text appearing within the @@-command braces.
+@var{args} is a reference on an array contening the command arguments
+formatted according to the same conventions than with the reference hash style
+(provided the value associated with the @@-command is a hash reference with a
+@var{$arg} key as described in @ref{Reference hash args}).
+If @var{$text} is split in paragraphs each paragraph is passed through
+the function, and @var{$no_close} is true if it is not the last paragraph,
+while @var{$no_open} is true if it is not the first paragraph.
+@var{$line_nr}
+is an opaque structure containing the information about the line number of the
+@@-command. It can be used to call @code{main::echo_error} or
+@code{main::echo_warning} with first argument a message, and second argument
+@code{$line_nr}.
+@var{$state}
+is a reference on a hash containing a lot of informations about the context
+of the @@-command.
+@var{$style_stack}
+is a reference on an array containing the name of the @@-commands containing
+the @@-command being formatted.
+
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Anchors images and spaces
+@section Formatting of special simple commands
+
+The formatting of special simple commands is controlled by functions. To
+customize the output, the corresponding function references should be
+redefined. All these functions return a formatted text.
+
+The formatting of anchors is controlled by @variable{$anchor}, but the function
+associated with the function reference does more, it is usefull
+to produce a reference target or link.
+@deftypefn {Function Reference} $anchor anchor $identifier $href $text $attributes
+If @var{$identifier} is not empty, this value should be used to create
+a target for links (typically associated with a name or id
+attribute in @acronym{HTML}).
+The @var{$href} argument specifies a hpertextual reference which should be
+used to link to a target.
+In case both @var{$identifier} and @var{$href} are given the text produced
+should be both a target for @var{$identifier} and a link to @var{$href}.
+@var{$text} is the text to be displayed.
+@var{$attributes} are additional attributes.
+It should be reasonable to assume that the attributes are for a @code{<a>}
+@acronym{HTML} element.
+@end deftypefn
+
+The formatting of @code{@@image} is controlled by:
+@deftypefn {Function Reference} $image image $file_path $basename $preformatted $file_name
+@var{$file_path} is the image file name with the path, @var{$basename} is the
+alternate text or the file name without extension if no alternate text is
+given. @var{$preformatted} is true if the image
+appears in preformatted text. @var{$file_name} is the file name without path
+but with extension.
+@end deftypefn
+
+The formatting of @code{@@sp} is controlled by:
+@deftypefn {Function Reference} $sp sp $number $preformatted
+@var{$number} is the numeric argument of @code{@@sp}.
+@var{$preformatted} is true if the @code{@@sp} appears in preformatted text.
+@end deftypefn
+
+The formatting of @code{@@acronym} and @code{@@abbr} is controlled by:
+@deftypefn {Function Reference} $acronym acronym_like $acronym_texi $acronym_text $with_explanation \@@explanation_lines $explanation_text $explanation_simply_formatted
+@var{$acronym_texi} is the acronym argument with texinfo @@-commands,
+@var{$acronym_text} is formatted.
+
+The other arguments are related with
+the explanation, the second arg of the acronym. @var{$with_explanation} is
+true if the second argument of the acronym command is present. If an
+explanation exists, coming from previous @code{@@acronym} or as an arg of this
+command, the other args are defined: @var{\@@explanation_lines} is a
+reference on an array containing the unformatted explanation lines,
+@var{$explanation_text} is the explanation text formatted,
+@var{$explanation_simply_formatted} is the explanation with a light formatting,
+unabling in @acronym{HTML} (or @acronym{XML}) the explanation to be in an
+attribute.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Text
+@section Processing special characters in text
+
+Some characters are processed especially in text: @samp{---}, @samp{--},
+@samp{``} and @samp{''}. This is done only if in normal text and not in
+some commands (@code{@@code}, @code{@@env}@dots{}). A function reference
+is called to process those characters in text
+
+@deftypefn {Function Reference} $processed_text normal_text $text
+The function processes @samp{---}, @samp{--}, @samp{``} and @samp{''}
+in @var{$text} and returns @var{$processed_text}. The default is to
+change @samp{---} to @samp{--}, @samp{--} to @samp{-}, and @samp{``} and
+@samp{''} to @samp{"}.
+@end deftypefn
+
+Some characters are special in @acronym{HTML} (@samp{&}, @samp{"},
+@samp{<} and @samp{>}) and should be protected.
+This is done by the function associated with the function reference
+
+@deftypefn {Function Reference} $protected_text protect_text $text
+The function processes the unprotected text @var{$text} and returns
+the resulting protected text @var{$protected_text}.
+@end deftypefn
+
+Empty lines are processed by the following function reference, which could
+be usefull if empty lines are to be removed for example
+
+@deftypefn {Function Reference} $resulting_text empty_line $empty_line
+This function processes an @var{$empty_line} and returns the resulting
+text @var{$resulting_text}. Empty lines are left as is by default.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Strings
+@section Customizing strings written by @command{texi2html}
+
+@cindex i18n
+
+@command{texi2html} writes some strings in the generated document at
+various places, at the page footers, on the help page, for special
+section headings, buttons alt text and so on. These strings are
+customizable. The string chosen depends on the language of the
+document (set by @longopt{lang}, @variable{$LANG} or
+@code{@@documentlanguage}). This is the basis for internationalization
+as it allows for strings translations.
+
+The strings are found in a hash reference, @variable{$LANGUAGES}.
+Each key is a language code. The associated value is also a hash
+reference. The key is an english string and the associated value
+is the string replacing the english string, if present. For example,
+we have
+
+@example
+$LANGUAGES->@{'fr'@} = @{
+ ' Up ' => 'Plus haut',
+@};
+@end example
+
+It means that whenever the string @samp{@ Up@ } is to be written
+and the language is @samp{fr}, @samp{Plus haut} is written. It is possible
+to customize the english strings by redefining the @samp{en} language hash.
+
+When a string contains a @samp{%} followed by @samp{@{} @var{name} @samp{@}}
+it means that the string will be expanded by @command{texi2html}. For
+example, if we have
+
+@example
+$LANGUAGES->@{'fr'@} = @{
+ 'See %@{node_file_href@}' => 'Voir %@{node_file_href@}',
+@};
+@end example
+
+@samp{%@{node_file_href@}} will be expanded to an href for a node in a
+file by @command{texi2html} in the string. A @samp{%%} will be expanded
+as @samp{%}.
+
+For more on internationalization, see @ref{Internationalization}.
+
+@c --------------------------------------------------------
+@node References
+@section References
+@cindex reference
+
+@menu
+* Reference to external manual::
+* Internal reference::
+@end menu
+
+@node Reference to external manual
+@subsection Reference to external manual
+@cindex external manual
+
+The references are produced with two function references, one for the
+hypertextual reference construction, the other for the full reference to
+external manual.
+
+@deftypefn {Function Reference} $href external_href $node $node_identifier $xml_node_identifier $manual_file_name
+@var{$node} is the node name, with @@-commands. @var{$node_identifer} is the
+node name mapped to an identifier acceptable as a file name.
+@var{$xml_node_identifier} is the
+node name mapped to an identifier acceptable as an @acronym{XML} identifier.
+Those identifiers are built as explained in @ref{HTML Xref,,,texinfo},
+thus allowing for cross references to external manuals. @var{$file} is the
+manual or file name of the external reference. This function should return an
+href leading to the external manual.
+
+The default for this function is to make a reference compatible with
+@command{makeinfo} (@pxref{HTML Xref,,,texinfo}).
+@end deftypefn
+
+@deftypefn {Function Reference} $text external_ref $command $section $book $node_and_file $href $cross_ref_name
+This function formats a reference to an external texinfo manual.
+The @var{$command} is the ref command (@code{ref}, @code{xref} or
+@code{pxref}, in text, at sentence beginning or in parenthesis).
+The optionnal @var{$section} argument is the section in the book and
+ @var{book} is the book title.
+@var{$node_and_file} is the node and file name formatted according to the
+convention used in info: @samp{(file)node}. @var{$href} it an hypertextual
+reference to the distant manual constructed using the above function.
+@var{$cross_ref_name} is an optionnal cross
+reference name appearing in the reference command. This function returns
+the text corresponding with the external html manual reference.
+This function returns the full formatted text of the external reference.
+@end deftypefn
+
+@node Internal reference
+@subsection Reference to an internal node
+
+A function reference is available for internal references.
+
+@deftypefn {Function Reference} $text internal_ref $command $href $short_name $name $is_section
+This function formats a reference to a node in the current manual.
+The @var{$command} is the ref command (@code{ref}, @code{xref} or
+@code{pxref}, in text, at sentence beginning or in parenthesis).
+@var{$href} it an hypertextual reference linking to the corresponding
+node or section. @var{$short_name} and @var{$name} hold the text for the
+reference but @var{$short_name} can be the node name which is assumed to
+be shorter than the section name.
+@var{$is_section} is a boolean true if the reference is a reference to a
+section. This function returns the full formatted text of the internal
+reference.
+@end deftypefn
+
+
+@c --------------------------------------------------------
+@node Alignement commands
+@section Commands used for centering and flushing of text
+
+@cindex centering
+@cindex flushing text
+@cindex text alignement
+
+When a command controlling the alignement of text is used (@code{@@center},
+@code{@@flushleft} and @code{@@flushright}), the main program takes
+care of opening and closing paragraphs. The alignement commands are the
+key of the @variable{%paragraph_style} hash.
+The value is used in the function doing the formatting of the paragraphs.
+@xref{Paragraph and preformatted region}.
+
+A function references allows for a customization of the formatting of the text
+appearing in the command block.
+
+@deftypefn {Function Reference} $result paragraph_style_command $command $text
+@var{$command} is the command name, @var{$text} is the text appearing within
+the command. This function returns a formatted text.
+The default is to return the text unmodified.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Paragraph and preformatted region
+@section Formatting or not a paragraph or a preformatted region
+
+
+@menu
+* Paragraph and preformatted formatting::
+* Avoiding paragraphs::
+@end menu
+
+@node Paragraph and preformatted formatting
+@subsection Paragraph and preformatted region formatting
+
+@cindex paragraph
+@cindex preformatted region
+
+The formatting of a paragraph region or a preformatted region, is controlled
+by function references:
+
+@deftypefn {Function Reference} $paragraph_text paragraph $text $alignement $formatting_command $formatting_command_formatted \$paragraph_number $format $item_number $enumerate_style $number
+This function formats a paragraph. @var{$text} is the text of the paragraph,
+@var{$alignement} is the empty string when no alignement command has
+been seen, otherwise it is the current alignement command name.
+@xref{Alignement commands}.
+
+The remaining arguments are usefull when the paragraph appears within a
+list or table. It is usefull whenever the paragraph has to be formatted
+differently when appearing in such environments.
+Moreover in that case the format command (@code{@@itemize}@dots{})
+may have
+an associated formatting command.
+@var{$formatting_command} is this formatting command
+(like @code{@@minus}).
+@var{$formatting_command_formatted} is the command formatted in html
+in case the formatting command is a leading command (like @code{@@minus})
+which should be leading the first paragraph.
+@var{\$paragraph_number} is a reference on the number of
+paragraphs in that format command. The corresponding variable should be
+increased when a paragraph is added. @var{$format} is the format command.
+@xref{Table and list items}.
+
+If the @var{$format} is an enumerate, @var{$item_number} is the number of
+the item in the list, @var{$enumerate_style} is the argument of the enumerate,
+@var{$number} is the number or letter corresponding with this item.
+@end deftypefn
+
+@deftypefn {Function Reference} $preformatted_text preformatted $text $style $region_name $formatting_command $formatting_command_formatted \$preformatted_number $format $item_number $enumerate_style $number
+This function formats a preformatted region. @var{$text} is the text of the
+preformatted region, @var{$style} is the css style associated with that
+preformatted region (@xref{css}). @var{$region_name} is the
+name of the command opening
+the preformatted region (@code{example}@dots{}, see @ref{Complex formats})
+or a identifier for the preformatted context (for example
+@code{menu-comment}, see @ref{Menus}).
+The alignment commands are not taken into account, as the spaces are
+preserved in preformatted regions, you should flush and center by hand.
+
+The remaining arguments are usefull when the preformatted region appears
+within a list or table. It is usefull whenever the preformatted region
+has to be formatted
+differently when appearing in such environments.
+Moreover in that case the format command (@code{@@itemize}@dots{})
+may have
+an associated formatting command.
+@var{$formatting_command} is this formatting command
+(like @code{@@minus}).
+@var{$formatting_command_formatted} is the command formatted in html
+in case the formatting command is a leading command (like @code{@@minus})
+which should be leading the first preformatted region.
+@var{\$preformatted_number} is a reference on the number of
+preformatted regions in that format command. The corresponding variable
+should be increased when a preformatted region is added. @var{$format} is the
+format command.
+@xref{Table and list items}.
+
+If the @var{$format} is an enumerate, @var{$item_number} is the number of
+the item in the list, @var{$enumerate_style} is the argument of the enumerate,
+@var{$number} is the number or letter corresponding with this item.
+@end deftypefn
+
+@node Avoiding paragraphs
+@subsection Avoiding paragraphs in formats
+
+@cindex Avoid paragraph opening
+
+It is possible to avoid that a format closes the previous paragraph or
+preformatted region and reopens one, by putting the format command in a
+hash, @variable{%format_in_paragraph} with a true value.
+
+@c --------------------------------------------------------
+@node Complex formats
+@section Formatting of complex formats (@code{@@example}, @code{@@display}@dots{})
+
+@cindex complex format
+
+Here we see how a whole complex format is formatted. For the formatting
+of the text, see @ref{Paragraph and preformatted region}.
+
+The formatting of the complex formats is ultimately controlled by a
+function, however the default for this function uses a hash reference and
+changing the hash reference values should be enough in most cases. This
+hash reference is called @variable{$complex_format_map}. It has a key for each
+of the complex format commands (@code{example}, @code{smallexample},
+@code{lisp}, @code{smalllisp}, @code{display}, @code{smalldisplay},
+@code{format}, @code{smallformat}).
+
+The associated value is also a reference on a hash. The keys are @code{begin}
+and @code{end}. An eval of @code{begin} should lead to the beginning of the
+formatted @acronym{HTML}, an eval of @code{end} should lead to the end of the
+formatted @acronym{HTML}. The enclosed text will be formatted as described in
+@ref{Paragraph and preformatted region}, and the name of the complex
+format will be available to the function formatting the text.
+
+If you aren't satisfied with this scheme, you can redefine the following
+function reference for a better control over the complex format formatting:
+
+@deftypefn {Function Reference} $complex_format_text complex_format $format_name $preformatted_text
+
+@var{$format_name} is the complex format name, @var{$preformatted_text} is the
+text allready formatted as described in @ref{Paragraph and preformatted region}.
+This function returns the whole complex format.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Lists tables
+@section Customizing the formatting of lists and tables
+
+The formatting of lists and tables is done at two levels:
+@itemize
+@item
+At the level of the whole region (table or list),
+@item
+At the level of the individual items, rows or cells of the list or table.
+@end itemize
+
+@menu
+* Table and list items::
+* Whole table list::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Table and list items
+@subsection Formatting individual table and list items
+
+In texinfo it is possible to give @code{@@itemize} or table command (hereafter
+called a @dfn{format command}) a @dfn{formatting command}.
+For example @code{@@minus} is the formatting command here:
+@example
+@@table @@minus
+@end example
+
+The default is to apply the command to the text item, however it is possible
+to avoid it.
+The hash @variable{%special_list_commands} has an entry for each of the
+format command. Each of these entries is a hash reference. If a formatting
+command is a key of the hash reference, then the formatting command is not
+applied to the text item for that format command. For example, if we have:
+
+@example
+$special_list_commands@{'itemize'@} = @{ 'bullet' => '' @};
+@end example
+
+and we have the following @code{@@itemize}:
+@example
+@@itemize @@bullet
+@@item an item
+@@end itemize
+@end example
+
+then @code{@@bullet} will not be applied to @code{an item}.
+
+@table @emph
+@item lists
+The items of lists are formatted using the following function reference:
+@deftypefn {Function Reference} $list_item list_item $text $format $command $formatted_command $item_number $enumerate_style $number
+This function formats the text between @code{@@item} commands. @var{$text}
+is the text corresponding with the item. @var{$format} is the type of format,
+@samp{itemize} or @samp{enumerate}. @var{$command} is the formatting command
+given in argument to @code{@@itemize}, @var{$formatted_command} is this command
+formatted if it is a leading command, like @code{@@minus}.
+
+If the @var{$format} is an enumerate, @var{$item_number} is the number of
+the item in the list, @var{$enumerate_style} is the argument of the enumerate,
+@var{$number} is the number or letter corresponding with this item.
+@end deftypefn
+
+@item two column tables
+The two columns tables (@code{@@table}, @code{@@ftable} and @code{@@vtable}),
+items are formatted using two function references,
+one for the first line located on the @code{@@item} line corresponding
+with the first column, the other for the text appearing on the
+following lines, corresponding with the second column text.
+
+@deftypefn {Function Reference} $table_item table_item $item_text $index_label_text $format $command $formatted_command
+This function is used to format the text on the @code{@@item} line.
+@var{$text_item} is the text line. In case there is an index entry
+associated with the @code{@@item} (as with @code{@@ftable} and
+@code{@@vtable}), @var{$index_label_text} is the text inserted at
+the place where an index entry appears. @xref{Index entry place}.
+@var{$format} is the type of format,
+@samp{table}, @samp{ftable} or @samp{vtable}. @var{$command} is the formatting command
+given in argument to the table format command, @var{$formatted_command} is
+this command formatted if it is a leading command, like @code{@@minus}.
+@end deftypefn
+
+@deftypefn {Function Reference} $table_line table_line $text
+This function is used to format the text on the lines following
+the @code{@@item} line. @var{$text} is the corresponding text.
+@end deftypefn
+
+@item multitable
+The multitable elements formatting is controlled by the functions associated
+with two function references. One for a cell, and the other for a row.
+
+@deftypefn {Function Reference} $multitable_cell cell $text
+This function is used to format the text of a multitable cell, the text
+following a @code{@@item} or a @code{@@tab}.
+@var{$text} is the corresponding text.
+@end deftypefn
+
+@deftypefn {Function Reference} $multitable_row row $text $item_command
+This function is used to format a multitable row. @var{$text} is
+the row text, with cells allready formatted with the @variable{$cell}
+function reference. @var{$item_command} is the command used to introduce
+the row, such that it is possible to distinguish between @code{@@item} and
+@code{@@headitem}.
+@end deftypefn
+@end table
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Whole table list
+@subsection Formatting of a whole table or list
+
+If the Texinfo command is a key of the @variable{%format_map}, the associated
+value is used to specify the formatting of the construct, otherwise a function
+is called.
+The value in @code{%format_map} associated with a command is interpreted
+similarly with values associated with more simpler commands:
+
+@itemize
+@item
+If the text is a word, it is considered to be an @acronym{HTML} element
+name, and the whole table or list is enclosed between the element opening
+and the element closing.
+@item
+If the text is a word followed by some text,
+the word and is interpreted as above, and the
+text is considered to be the attributes text of the element.
+@item
+If the text is empty nothing is added to the text.
+@end itemize
+
+In case the @code{%format_map} isn't used, a function reference called
+@code{$table_list}
+should be redefined, the associated function will be called each time
+a command isn't found in @code{%format_map}.
+
+@deftypefn {Function Reference} $whole_table_list table_list $command $text
+@var{$command} is the Texinfo command name, @var{$text} is the formatted
+items.
+@end deftypefn
+
+If you still want to use @variable{%format_map} but differently from
+the default, it is possible to redefine the following function reference:
+
+@deftypefn {Function Reference} $whole_table_list format $command $format $text
+@var{$command} is the @@-command, @var{$format} is the entry associated with
+@var{$command} in @code{%format_map}. @var{$text} is the formatted items.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Definitions
+@section Definition commands formatting
+
+The formatting of definition commands is controlled by a hash and four
+functions. The hash describes how the text on the definition line is
+interpreted, the functions control the formatting of the definition line
+and the definition function text.
+
+@menu
+* Definition line::
+* Definition formatting::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Definition line
+@subsection Customizing the interpretation of a definition line
+
+The keys of the hash @variable{%def_map} are definition command names.
+There are two types of entries:
+
+@itemize
+
+@item If the command is a shortcut for
+another definition command the value is a text and the definition
+command is replaced by the text.
+
+For example if we have:
+@example
+$def_map@{'deftruc'@} = '@@defvr @{A truc@}';
+@end example
+
+and a line like
+@example
+@@deftruc var
+@end example
+
+the line will be transformed in
+@example
+@@defvr @{A truc@} var
+@end example
+
+@item
+If the command isn't a shortcut, it is associated with an array
+reference. The first element is @samp{f}, @samp{v} or @samp{t} corresponding
+with the index type (@samp{f} for function, @samp{v} for variable,
+@samp{t} for type).
+
+The remaining of the array describes how to interpret the text following
+the definition command on the definition command line.
+The entry item specify what corresponds
+with the next bracketed item or word. Currently the possibilities are
+@samp{category}, @samp{name}, @samp{type}, @samp{class} and @samp{arg}.
+
+For example if we have
+@example
+def_map@{'defvr'@} = [ 'v', 'category', 'name' ];
+@end example
+
+The first bracketed item following @code{@@defvr} is considered
+to be the category and the next one is the name. The index associated
+with the definition line is the variables index.
+@end itemize
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Definition formatting
+@subsection Customization of the definition formatting
+
+Four functions are used when formatting a definition command:
+
+@table @asis
+@item category name
+@deftypefn {Function Reference} $category definition_category $category_or_name $class $style
+This function precise a category or an index entry name associating a class
+@var{$class} (if given) with @var{$category_or_name}. The @var{$style} of the
+definition may be @samp{f}, for function, @samp{v}, for variable or @samp{t},
+for type.
+@end deftypefn
+@item formatting of the definition line
+@deftypefn {Function Reference} $line def_line $category $name $type $arguments $index_label
+This function formats the definition line. @var{$category} is the category
+formatted with @variable{$definition_category}, @var{$name}, @var{$type} and
+@var{arguments} are the element of the definition line. @var{$index_label} is
+the text inserted at the place where an index entry appears.
+@xref{Index entry place}.
+@end deftypefn
+
+@item definition text
+@deftypefn {Function Reference} $definition_text def_item $text
+This function formats the definition text, @var{$text}.
+@end deftypefn
+
+@item the whole definition
+@deftypefn {Function Reference} $definition def $text
+This function formats the whole definition. The definition line and text
+formatted by the above functions are in @var{$text}.
+@end deftypefn
+
+@end table
+
+@c --------------------------------------------------------
+@node Headings
+@section Customizing headings formatting
+
+A function controls the formatting of sectioning element headings,
+with the corresponding function reference:
+@deftypefn {Function Reference} $heading_text heading \%element_reference
+The @var{\%element_reference} is a reference on a hash corresponding
+with the sectioning element. The following keys are of interest:
+@table @code
+@item text
+The heading text
+@item name
+The heading text without section number
+@item node
+true if the sectioning element is a node without associated structuring command
+@item level
+The level of the element in the document tree. @samp{0} is for @code{@@top},
+@samp{1} for @code{@@chapter} and so on
+@item tag_level
+the sectioning element name, with @code{@@raisesections} and
+@code{@@lowersections} taken into account
+@end table
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Special regions
+@section Formatting of special regions (@code{@@verbatim}, @code{@@cartouche}, @code{@@quotation})
+
+Regions corresponding with raw text, like @code{@@verbatim}, @code{@@html}
+or @code{@@tex} are formatted according to the following function reference:
+
+@deftypefn {Function Reference} $raw_region raw $command $text
+@var{$command} is the command name, @var{$text} is the raw text.
+@end deftypefn
+
+If La@TeX{}2HTML is used, @code{@@tex} regions are handled differently,
+from within the main program.
+
+The @code{@@cartouche} command formatting is controlled by the
+function reference:
+
+@deftypefn {Function Reference} $cartouche cartouche $text
+@var{$text} is the text appearing within the cartouche.
+@end deftypefn
+
+The formatting of @code{@@quotation} is controlled by two function references.
+The first one is usefull in case the @code{@@quotation} has an argument, as
+it allows to prepend a string to the quotation text:
+
+@deftypefn {Function Reference} $prepended_string quotation_prepend_text $style $text
+@var{$style} is the first argument of the @code{@@quotation} if there are
+two arguments. @var{$text} is the second argument or the first if there is
+one argument. There are still @@-commands in these strings. This function
+can return a string which will be prepended to the quotation text.
+@end deftypefn
+
+The whole quotation is formatted by:
+
+@deftypefn {Function Reference} $quotation quotation $quotation_text $argument_text $argument_style_texi $argument_style_id
+@var{$quotation_text} is the quotation text, formatted, with the text
+prepended by the function above. @var{$argument_text} is the second argument
+of the @code{@@quotation} or the first if there is one argument, formatted.
+The other arguments are defiend if there are two arguments for the
+@code{@@quotation}, @var{$argument_style_texi} is this argument, with
+@@-commands, and @var{$argument_style_id} is this argument transformed in
+an identifier which can be used as an @acronym{XML} identifier.
+@end deftypefn
+
+
+@c --------------------------------------------------------
+@node Menus
+@section Menu formatting
+
+To understand how the formatting of menus is controlled, the different
+parts of a menu are first described, then how to control the formatting
+of each of these parts.
+
+@menu
+* Menu parts:: A menu consists in menu entry and menu
+ comments
+* Menu formatting::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Menu parts
+@subsection The structure of a menu
+
+In @command{texi2html}, a menu is considered to be composed of 2 parts, the
+@dfn{menu entries} and the @dfn{menu comments}. Menu entries are further
+divided in an @dfn{entry link} and optionnaly an @dfn{entry description}.
+The entry link consists in a node name and an optionnal menu entry
+name.
+
+A menu entry begins with @samp{*} at the beginning of the line. It begins
+with the entry link, followed by the description. The description spans until
+the next menu entry, or some text begining at the first character of a line
+or an empty line, not contained within a command block which begun in the
+description. An empty line or a line with text at the first character
+starts a menu comment, which spans until the next menu entry.
+
+Here is an illustration of these rules:
+
+@example
+@@menu
+* node name: entry name. description begins
+ description continues
+* another menu entry::
+ description begins
+ description continues
+
+ A menu comment, after an empty line
+
+* node:: description begins
+A menu comment. The line starts at the first character
+
+* last entry:: description begins @emph{text
+of the description, even if the line begins at the first character,
+because we are in @@emph}.
+@@end menu
+@end example
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Menu formatting
+@subsection The formatting of the different menu components
+
+In the default case, the name of the section corresponding with the
+node is used instead of the node name. If @variable{$NODE_NAME_IN_MENU} is
+true, however, node names are used. If @variable{$AVOID_MENU_REDUNDANCY}
+is true and menu entry equal menu description the description isn't printed.
+This is the default. Likewise, if node or section name equal entry name,
+do not print entry name.
+
+A symbol, @variable{$MENU_SYMBOL} is put at the beginning of menu entries
+when the node name is used. The default is @samp{&bull;}.
+If @variable{$UNNUMBERED_SYMBOL_IN_MENU} is true it is
+also put at the beginning of unnumbered section names. This is not
+done by default.
+
+The menu comments are considered to be preformatted text. The style
+associated with this preformatted text is determined by
+@variable{$MENU_PRE_STYLE}. Default is @samp{font-family: serif}.
+The css class associated with menu comments is @code{menu-comments}.
+
+Three function references are associated with the formatting of the
+different parts of a menu:
+@deftypefn {Function Reference} $link menu_link $section \%state $href $node $name $ending
+@var{$section} is the section name corresponding with the link, @var{$href}
+is the link hypertextual reference. @var{$href} may be absent. @var{\%state}
+holds informations about the current context. The only key which could be
+of interest is @code{preformatted}, true if the context is a preformatted
+context. @xref{Three contexts}.
+@var{$node} is the node name, @var{$name} is the
+name of the node, and @var{$ending} is the text ending the link entry.
+@end deftypefn
+
+@deftypefn {Function Reference} $description menu_description $description_text \%state
+@var{$description_text} is the text of the menu description. @var{\%state}
+should be used similarly than for the menu link.
+@end deftypefn
+
+@deftypefn {Function Reference} $menu_comment menu_comment $text
+@var{$text} is the text of the menu comment. It is in a preformatted
+environment.
+@end deftypefn
+
+The following function reference controls the formatting of a wole menu:
+
+@deftypefn {Function Reference} $menu menu $menu_components_text
+@var{$menu_components_text} is the formatted menu components text, obtained
+as explained above.
+@end deftypefn
+
+The last function reference corresponds with a special case. It
+is used when a menu entry appears within another block command, to
+avoid the possibilities of invalid @acronym{HTML} production.
+In that case the menu description and menu comments are not formatted
+specially, but treated like normal text.
+@deftypefn {Function Reference} $link simple_menu_link $link_text $href $node $name $ending
+@var{$link_text} is the text corresponding with the link name, @var{$href}
+is the link hypertextual reference.
+@var{$node} is the node name, @var{$name} is the
+name of the node, and @var{$ending} is the text ending the link entry.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Indices
+@section Indices formatting
+
+Two different things needs to be handled for indices formatting, the place
+where the index term appears, the index entry, and the index list itself.
+The indexing commands like @code{@@cindex} determines where index entries
+appear, and the index list is printed with a @code{@@printindex} command.
+
+@menu
+* Index entry place:: Index entries in the main document are
+ targets for hypertext references
+* Index list:: Customizing the formatting of the index list
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Index entry place
+@subsection Formatting of index entries
+
+Index entry places in the main text may be the target for hypertext
+references. Their formatting
+is controlled by the function associated with the following function
+reference:
+
+@deftypefn {Function Reference} $target index_entry_label $identifier $preformatted
+@var{$identifier} should be used to create
+a target for links (typically associated with a name or id
+attribute in @acronym{HTML}).
+@var{$preformatted} is true if the index entry appeared in preformatted text.
+@end deftypefn
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Index list
+@subsection Customizing the formatting of index lists
+
+The index entries are sorted alphabetically. A whole index list is
+considered to be composed of letter entries. A letter entry is composed
+by all the index entries beginning with that letter. A letter may
+be a non alphabetical character, but we call it letter here.
+
+An index summary appears at the beginning and at the end of an index list,
+and should be used to jump directly to a letter entry. Indices lists
+may be split across pages, thus the different letters may appear on different
+files. The number of index entries appearing on each page is determined
+by a variable @variable{$SPLIT_INDEX} if set. The default is to split
+indices after 100 entries.
+
+The formatting of all these elements is controlled by the following
+function references:
+
+@table @emph
+@item formatting of a letter in a summary
+@deftypefn {Function Reference} $letter summary_letter $letter $file $identifier
+This function is used to format a letter appearing in a summary, refering
+to a letter entry in the index list.
+@var{$letter} is the letter. @var{$file} is the file name where the letter
+entry appears. More precisely, it is empty when the letter entry is on the
+same page than the summary, it contains the file name when the index page
+is split accross page. @var{$identifier} is an identifier for the target
+letter entry.
+@end deftypefn
+
+@item formatting of a summary
+@deftypefn {Function Reference} $summary index_summary \@@alphabetical_letters \@@nonalphabetical_letters
+@var{\@@alphabetical_letters} and @var{\@@nonalphabetical_letters} contain the
+formatted summary letters, formatted with the above function.
+@end deftypefn
+
+@item formatting of an index entry
+@deftypefn {Function Reference} $entry index_entry $entry_href $entry_text $section_href $section_heading
+@var{$entry_href} is a reference to the place where the index entry
+appeared, @var{$entry_text} is the corresponding text. @var{$section_href}
+is a reference to the beginning of the sectioning element containing
+the index entry, @var{$section_heading} is the heading of the element.
+@end deftypefn
+
+@item formatting of letter entry
+@deftypefn {Function Reference} $letter_entry index_letter $letter $identifier $index_entries_text
+This function formats a letter entry, consisting in all the index entries
+beginning with this letter. @var{$letter} is the letter, @var{$identifier}
+should be used to create a target for links (typically links from summaries),
+and @var{$index_entries_text} is the text of the index entries formatted as
+described above.
+@end deftypefn
+
+@item formatting of whole index
+@deftypefn {Function Reference} $index print_index $index_text $index_name
+@var{$index_text} is the text of all the index entries grouped by letter
+appearing in that page formatted as above. @var{index_name} is the name of
+the index, the argument of @code{@@printindex}.
+@end deftypefn
+@end table
+
+@c --------------------------------------------------------
+@node Floats and lists of floats
+@section Floats and lists of floats
+
+Floats appear in the @code{@@float} environment, optionaly with a style
+and a label, and with optionnal @code{@@caption} and @code{@@shortcaption}.
+Their list appear after a @code{@@listoffloats}.
+
+A hash reference is associated with each float, it is available in some
+formatting functions. The keys are:
+@table @code
+@item caption_texi
+@itemx shortcaption_texi
+A reference on an array containing the caption or shortcaption lines,
+unformatted.
+@item style_texi
+The style with texi @@-commands.
+@item style_id
+The unique identifier associated with the style.
+@item nr
+The number with the same conventions than makeinfo (use the chapter number a
+dot and then the number of the float of that style in the chapter, or an
+absolute number if in unnumbered).
+@item chapter_nr
+The number of the chapter containing the float.
+@item nr_in_chapter
+The number of the float in the chapter.
+@item absolut_nr
+The number of the float in the document.
+@item texi
+The label with @@-commands.
+@item id
+The unique identifier associated with the label. Usefull to make an anchor
+or a reference.
+@item element
+A reference on a structure representing the element the float appear in.
+@end table
+
+@menu
+* Floats:: Formatting of floats
+* Lists of floats:: Formatting the lists of floats
+@end menu
+
+@node Floats
+@subsection Formatting a float
+
+First there is an occasion to construct a texinfo text for the caption, using
+the caption texinfo lines and the informations in the float structure.
+The returned lines will be formatted in the main program. A function reference
+is used here:
+
+@deftypefn {Function Reference} {(\@@caption_lines_returned, \@@shortcaption_lines_returned)} caption_shortcaption \%float \@@caption_lines \@@shortcaption_lines
+@var{\%float} is the structure defined above. @var{\@@caption_lines} and
+@var{\@@shortcaption_lines} are references on arrays containing the
+texinfo lines for caption and short caption. @var{\@@caption_lines_returned}
+and @var{\@@shortcaption_lines_returned} are references on an array
+containing the texinfo lines for the caption and shortcaption.
+@end deftypefn
+
+Then the float is formatted with the following function reference:
+
+@deftypefn {Function Reference} $text float $float_text \%float $caption_text $shortcaption_text
+@var{$float_text} is the text appearing within the @code{@@float}, formatted.
+@var{\%float} is still the structure defined above. @var{$caption_text} and
+@var{$shortcaption_text} are the caption and short caption build with the
+above function and formatted.
+@end deftypefn
+
+@node Lists of floats
+@subsection Formatting lists of floats
+
+A list of floats is introduced by @code{@@listoffloats}. The argument of
+@code{@@listoffloats} is the @dfn{style}. First the style texinfo can be
+modified with the following function reference:
+
+@deftypefn {Function Reference} $style_texi_returned listoffloats_style $style_texi
+@var{$style_texi} is the @code{@@listoffloats} argument with texinfo
+@@-commands kept. It is possible to make changes to the @var{$style_texi} and
+return a modified string, still with @@-commands. The modified string
+is formatted in the main program.
+@end deftypefn
+
+After that, for each of the floats with that style, first there is a
+possibility to modify the float style and the float caption before they
+are formatted in the main program, with the following function references:
+
+@deftypefn {Function Reference} $float_style_texi_returned listoffloats_float_style $style_texi \%float
+@var{$style_texi} is the style, and @var{\%float} is the structure described
+above. This function reference returns a style to be formatted in the
+main program.
+@end deftypefn
+
+@deftypefn {Function Reference} $caption_texi_returned listoffloats_caption \%float
+@var{\%float} is the structure described
+above. This function reference returns a caption to be formatted in the
+main program.
+@end deftypefn
+
+Each entry is formatted by:
+
+@deftypefn {Function Reference} $listoffloats_entry listoffloats_entry $style_texi \%float $float_style $caption $href
+@var{$style_texi} is the style with @@-commands, @var{$float_style} is the
+style returned by the above function and formatted. @var{$caption} is the
+caption returned by the above function formatted. @var{\%float} is the
+structure corresponding with the float, and @var{$href} is an href pointing to
+the float location.
+@end deftypefn
+
+Lastly, the whole @code{@@listoffloats} is formatted by:
+
+@deftypefn {Function Reference} $listoffloats listoffloats $style_texi $style \@@listoffloats_entries
+@var{$style_texi} is the style with @@-commands, @var{$style} is the
+style returned by the above function and formatted. The array reference
+@var{\@@listoffloats_entries} holds the entries formatted by the above
+function.
+@end deftypefn
+
+@c --------------------------------------------------------
+@node Footnotes
+@section Customizing the footnotes formatting
+
+Each footnote is associated with a footnote entry. Several footnote entries
+are grouped in a footnote section. When a footnote appears, two things must
+be formatted: in the main text the place where the footnote appear
+and the footnote text.
+
+Two functions, with corresponding function references control the formatting
+of the footnotes:
+
+@deftypefn {Function Reference} {(\@@lines $text_for_document)} foot_line_and_ref $number_in_doc $number_in_page $footnote_id $place_id $document_file $footnote_file \@@lines \%state
+@var{$number_in_doc} is the footnote number in the whole document,
+@var{$number_in_page} is the footnote number in the current page.
+@var{$footnote_id} is an identifier for the footnote in the footnote text
+which should be used to make target for references to that footnote,
+while @var{$place_id} is an identifier for the location of the footnote
+in the main document. Similarly, @var{$document_file} is the file name
+of the file containing the text where the footnote appears in the main
+document, while @var{$footnote_file} is the file name of the file where
+the footnote text appears.
+
+@var{\@@lines} is a reference on an array containing the footnote text
+lines, allready formatted.
+And @var{\%state} holds informations about the context at the footnote
+place in the main document. As usual the most usefull entry is
+@code{preformatted} which is true if the footnote appears in a preformatted
+context.
+
+This function returns a reference on an array, @var{\@@lines} containing
+the updated footnote text for the footnote entry, and @var{$text_for_document},
+the text appearing at the footnote place in the main document, linking
+to the footnote entry.
+@end deftypefn
+
+The following function is only used when footnotes are at the bottom
+of a page and the document is split.
+For customization of the footnotes page in case they are on a separated
+page or section, @ref{Special pages layout}. For
+the determination of the footnote locations, @ref{Page layout options}.
+
+@deffn {Function Reference} foot_section \@@footnotes_lines
+This function formats a group of footnotes. @var{\@@footnotes_lines} is a
+reference on an array holding the lines of all the footnote entries
+formatted as explained above. This function modifies the reference.
+@end deffn
+
+@c --------------------------------------------------------
+
+@node Other and unknown commands
+@section Customizing other commands, and unknown commands
+
+@c --------------------------------------------------------
+@c @node Skipped commands
+@c @section Customizing ignored commands and text
+
+@cindex skipped command
+@cindex unknown command
+
+Many commands without braces are available in texinfo, sometimes with
+a specific syntax. For example we have @code{@@sp}, @code{@@noindent},
+@code{@@documentlanguage}, @code{@@oddheading}, @code{@@headings},
+@code{@@shortcontents}, @code{@@shorttitlepage} or @code{@@comment}.
+@command{texi2html} interprets
+some of these commands and some functions or variables are used for
+their formatting or to access their information.
+In the default case, however, most of these constructs are ignored.
+
+It is possible to change how the things following these commands
+on the line are handled, what is considered to be an arg for those
+commands and it is also possible to keep them instead of discarding
+them such that it is possible to handle them specially, with the
+same function than the one used for unknown commands.
+
+Those special commands without braces are the key of a hash:
+@variable{%misc_command}. The associated value is a reference on a
+hash enabling to set the properties of these commands. The
+keys of this hash reference is the name of a property, the value
+is the value of the property. For example here we have @code{line}
+for the @code{arg} property for the @code{command} @@-command.
+
+@example
+$misc_command@{'command'@} = @{'arg' => 'line', 'skip' => 'space'@};
+@end example
+
+The properties and possible values are:
+
+@table @code
+@item skip
+This property enables to set what is skipped after the command arguments.
+Here are the possible values:
+@table @code
+@item line
+The remaining of the line is skipped.
+@item space
+Spaces are skipped but not newline.
+@item whitespace
+Spaces are skipped
+@item linewhitespace
+Spaces are skipped if there are only spaces remaining on the line.
+@item linespace
+Spaces are skipped, but not newline if
+there are only spaces remaining on the line
+@end table
+
+@item arg
+If the associated value is @code{line} the line is considered to be the
+argument. If it is a number it is the number of args (separated by spaces).
+@item texi
+If true the arguments are considered to real texinfo, therefore
+ @code{@@value} and @code{@@macro} are expanded.
+@item keep
+If true the args and the macro are kept, otherwise they are discarded.
+The defaut is to have @code{keep} undef for all the commands.
+If @code{keep} is true for @code{@@verbatiminclude} the default
+action for this macro isn't done.
+@end table
+
+
+Commands which don't appear in the hashes
+@c @variable{%things_map} @variable{%pre_map}
+@variable{%simple_map}, @variable{%simple_map_pre},
+@variable{%simple_map_texi} and @code{%misc_command}, or that appear in
+@code{%misc_command} but with @code{keep} true are processed by the
+following function reference:
+
+@deftypefn {Function Reference} {($result_line, $result, $result_text, $message)} unknown $command $line
+@var{$command} is the @@-command, @var{$line} is the line following the
+@var{$command}. @var{$result} is a boolean. If it is true then the other return
+values are taken into account otherwise the default actions are
+used. In case @var{$result} is true, @var{$result_line} is the new line
+to be processed further, @var{$result_text} is the resulting formatted text
+and @var{$message}, if defined is a message outputted to the output
+with line number added by @command{texi2html}.
+@end deftypefn
+
+Commands with braces not specified above
+nor in @variable{%style_map}, @variable{%style_map_pre} and
+@variable{%style_map_texi} are processed
+by the following function reference
+
+@deftypefn {Function Reference} {($result, $result_text, $message)} unknown_style $command $text
+@var{$command} is the @@-command, @var{$text} is the text appearing within
+the braces (allready formatted). @var{$result} is a boolean. If it is true then
+the other return
+values are taken into account otherwise the default actions are
+used. In case @var{$result} is true, @var{$result_text} is the resulting
+formatted text
+and @var{$message}, if defined is a message outputted to the output
+with line number added by @command{texi2html}.
+@end deftypefn
+
+
+@c --------------------------------------------------------
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@c ========================================================
+@c ========================================================
+
+@node Internationalization
+@appendix Internationalization
+
+The strings written in the document are selected based on the
+document language. This can be used to customize the strings,
+as described in @ref{Strings}. This also enables translation of the
+strings.
+
+@menu
+* Translating strings::
+* Adding new strings::
+@end menu
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Translating strings
+@appendixsec Translating strings
+
+@cindex Translation
+@cindex i18n
+@vindex $LANGUAGES
+@vindex $T2H_OBSOLETE_STRINGS
+
+If the language is allready supported, then there will be a file
+in the @file{i18n} directory with name the two-letter
+ISO-639 language code. In that case you can enhance the translations by
+editing this file. There is a @code{$LANGUAGES->@{'@var{language}'@}}
+hash in that file. The keys are the english strings, in @code{''}, the
+values (in @code{''} after @code{=>}) are the translations.
+When a string contains a @samp{%} followed by @samp{@{} @var{name} @samp{@}}
+it means that the string will be expanded by @command{texi2html}. For
+an example, see @ref{Strings}.
+
+After that you should run the command @command{./manage_i18n.pl all} in
+the top directory, it should merge your file with the existing files in
+@file{translations.pl}, which is incorporated to the @file{texi2html} script
+by @command{./configure}.
+
+If the language isn't currently supported, copy the @file{en} file in
+@file{i18n} to a file with name the two-letter ISO-639
+language code of your language
+ and then add your translations to the strings. You could also add your
+two-letter language code in the @file{manage_i18n.pl} file in the
+@code{@@known_languages} array.
+
+After that you should similarly run the command
+@command{./manage_i18n.pl all} in
+the top directory.
+
+Obsoleted strings are not removed from the files, they are still present
+in the @code{$T2H_OBSOLETE_STRINGS->@{'@var{language}'@}} hash in case
+the string is reused later.
+
+If you made change to strings specified in installed files
+(@pxref{Installation})
+you will have to reinstall them otherwise the installated files will
+take precedence (@pxref{Using init files}).
+
+@c -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+@node Adding new strings
+@appendixsec Adding new strings written to document
+
+@cindex internationalized strings
+@cindex @command{manage_i18n.pl}
+
+If you need to write strings, for example the new string @var{a string}
+to the resulting document, call @code{&$I('a string')}. Use simple quotes.
+If you want to substitute a value in the string put
+@code{%@{@var{string_value}@}}, in the string, and give a second argument
+to @code{&$I}, a hash reference with key @var{string_value} and value
+the what you want to substitute.
+Here is an example:
+
+@example
+return &$I('%@{name@} of %@{class@}', @{ 'name' => $name, 'class' => $class @});
+@end example
+
+In that case @code{%@{name@}} is substituted by @code{$name} in the translated
+string.
+
+After that you should run the command @command{./manage_i18n.pl all} in the top
+directory, it should add your new strings to all the files in the @file{i18n}
+directory.
+
+@c --------------------------------------------------------
+@c commandline option index.
+@node Indexop
+@appendix Command Line Option Index
+@printindex op
+@c --------------------------------------------------------
+@node Indexvr
+@appendix Variable Index
+@printindex vr
+@c --------------------------------------------------------
+@node Indexcp
+@appendix Concept Index
+@printindex cp
+@bye
diff --git a/Build/source/utils/texi2html/doc/texinfo.tex b/Build/source/utils/texi2html/doc/texinfo.tex
new file mode 100644
index 00000000000..b88e12dec42
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/texinfo.tex
@@ -0,0 +1,6882 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2004-02-06.08}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+% Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexnoindent=\noindent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+\chardef\spaceChar = `\ %
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode\spaceChar=\spacecat}
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{eshell}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{time-stamp}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\next{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % We cannot use \next here, as it holds the macro to run;
+ % thus we reuse \temp.
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \next.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux file.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=3000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\newdimen\currentparindent
+%
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode\underChar = \active
+ \gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil
+ .\hfil.\hfil.%
+ \hskip 0pt plus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=3000
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+ \pdffalse
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\else
+ \pdftrue
+ \pdfoutput = 1
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}%
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code in a section title
+ % aren't expanded.
+ \atdummies
+ \normalturnoffactive
+ \pdfdest name{#1} xyz%
+ }}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node
+ % text, which might be empty if this toc entry had no
+ % corresponding node. #4 is the page number.
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worthwhile, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \let\thissecnum\empty
+ \let\thissubsecnum\empty
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \let\thissubsecnum\empty
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \let\thischapnum\empty
+ \let\thissecnum\empty
+ \let\thissubsecnum\empty
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \input \jobname.toc
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \turnoffactive
+ \input \jobname.toc
+ \endgroup
+ }
+ %
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \makevalueexpandable
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ % #1
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Text fonts (11.2pt, magstep1).
+\newcount\mainmagstep
+\ifx\bigger\relax
+ % not really supported.
+ \mainmagstep=\magstep1
+ \setfont\textrm\rmshape{12}{1000}
+ \setfont\texttt\ttshape{12}{1000}
+\else
+ \mainmagstep=\magstephalf
+ \setfont\textrm\rmshape{10}{\mainmagstep}
+ \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
+\setfont\deftt\ttshape{10}{\magstep1}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts \rm
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\frenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ }
+\catcode`@=\other
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which is in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ This edition of the manual is dedicated to Karl Berry who should
+ really make affiliations work.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. (Unfortunately
+ % we can't prevent a possible page break at the following
+ % \baselineskip glue.) However, if what follows is an environment
+ % such as @example, there will be no \parskip glue; then
+ % the negative vskip we just would cause the example and the item to
+ % crash together. So we use this bizarre value of 10001 as a signal
+ % to \aboveenvbreak to insert \parskip glue after all.
+ % (Possibly there are other commands that could be followed by
+ % @example which need the same treatment, but not section titles; or
+ % maybe section titles are the only special case and they should be
+ % penalty 10001...)
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablex
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablex
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablex
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away). #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ \let\item\crcr
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore {#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the string `ifinfo'.
+ %
+ % Define a command to find the next `@end #1', which must be on a line
+ % by itself.
+ \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \obeylines %
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux file, @ is the escape character. So we want to redefine
+% everything using @ instead of \realbackslash. When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter{_}%
+ %
+ % Non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ \definedummyword{exclamdown}%
+ \definedummyword{questiondown}%
+ \definedummyword{ordf}%
+ \definedummyword{ordm}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ \definedummyword{LaTeX}%
+ \definedummyword{TeX}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{copyright}%
+ \definedummyword{registeredsymbol}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+% Better have this without active chars.
+{
+ \catcode`\~=\other
+ \gdef\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter{!}%
+ \definedummyletter{"}%
+ \definedummyletter{'}%
+ \definedummyletter{*}%
+ \definedummyletter{,}%
+ \definedummyletter{.}%
+ \definedummyletter{/}%
+ \definedummyletter{:}%
+ \definedummyletter{=}%
+ \definedummyletter{?}%
+ \definedummyletter{^}%
+ \definedummyletter{`}%
+ \definedummyletter{~}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ % Commands that take arguments.
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{tie}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{verb}%
+ \definedummyword{w}%
+ }
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ \def\definedummyword##1{%
+ \expandafter\let\csname ##1\endcsname\asis
+ }%
+ \let\definedummyletter=\definedummyword
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\result{=>}%
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \ifvmode
+ \dosubindsanitize
+ \else
+ \dosubindwrite
+ \fi
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write will make \lastskip zero. The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \skip0 = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \count255 = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\skip0
+ \fi
+ %
+ \dosubindwrite
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % if \lastskip was zero, perhaps the last item was a
+ % penalty, and perhaps it was >=10000, e.g., a \nobreak.
+ % In that case, we want to re-insert the penalty; since we
+ % just inserted a non-discardable item, any following glue
+ % (such as a \parskip) would be a breakpoint. For example:
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\count255>9999 \nobreak \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\skip0
+ \fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \penalty -300
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ \vskip .33\baselineskip plus .1\baselineskip
+ %
+ % Do our best not to break after the initial.
+ \nobreak
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#1}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.\ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \chapterzzz{#2}%
+ \or \seczzz{#2}%
+ \or \numberedsubseczzz{#2}%
+ \or \numberedsubsubseczzz{#2}%
+ \else
+ \ifnum \absseclevel<0 \chapterzzz{#2}%
+ \else \numberedsubsubseczzz{#2}%
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \appendixzzz{#2}%
+ \or \appendixsectionzzz{#2}%
+ \or \appendixsubseczzz{#2}%
+ \or \appendixsubsubseczzz{#2}%
+ \else
+ \ifnum \absseclevel<0 \appendixzzz{#2}%
+ \else \appendixsubsubseczzz{#2}%
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+ \ifcase\absseclevel
+ \unnumberedzzz{#2}%
+ \or \unnumberedseczzz{#2}%
+ \or \unnumberedsubseczzz{#2}%
+ \or \unnumberedsubsubseczzz{#2}%
+ \else
+ \ifnum \absseclevel<0 \unnumberedzzz{#2}%
+ \else \unnumberedsubsubseczzz{#2}%
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{{\unnumberedyyy{#1}}}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they are now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{%
+\global\let\chapmacro=\chfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Normal chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chfplain#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \def\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \xdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+ \def\centerparametersmaybe{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+ }%
+ \chfplain{#1}{Ynothing}{}%
+}}
+
+\CHAPFplain % The default
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{%
+\global\let\chapmacro=\chfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chfplain.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chfplain.
+ \donoderef{#3}%
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This \nobreak is purely so the last item on the list is a \penalty
+ % of 10000. This is so other code, for instance \parsebodycommon, can
+ % check for and avoid allowing breakpoints. Otherwise, it would
+ % insert a valid breakpoint between:
+ % @section sec-whatever
+ % @deffn def-whatever
+ \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ \toks0 = {#2}%
+ \toks2 = \expandafter{\lastnode}%
+ \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
+ {\the\toks2}{\noexpand\folio}}}%
+ \temp
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \input \jobname.toc
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling. So to avoid extra space below the environment...
+\def\Equotation{\parskip = 0pt \afterenvbreak}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later. Many commands won't be
+% allowed in this context, but that's ok.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\begingroup
+ % Define a command to swallow text until we reach `@end copying'.
+ % \ is the escape char in this texinfo.tex file, so it is the
+ % delimiter for the command; @ will be the escape char when we read
+ % it, but that doesn't matter.
+ \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+ %
+ % We must preserve ^^M's in the input file; see \insertcopying below.
+ \catcode`\^^M = \active
+ \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying. Here we must play games with ^^M's. On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active. On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M. On the third hand, two ^^M's in a row should still
+% generate a \par.
+%
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1. If it does, then manually
+% do \par.
+%
+% This messes up the normal definitions of @c[omment], so we redefine
+% it. Similarly for @ignore. (These commands are used in the gcc
+% manual for man page generation.)
+%
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+ \parindent = 0pt % looks wrong on title page
+ \def^^M{%
+ \ifnum \lastpenalty=1 %
+ \par %
+ \else %
+ \space \penalty 1 %
+ \fi %
+ }%
+ %
+ % Fix @c[omment] for catcode 13 ^^M's.
+ \def\c##1^^M{\ignorespaces}%
+ \let\comment = \c %
+ %
+ % Don't bother jumping through all the hoops that \doignore does, it
+ % would be very hard since the catcodes are already set.
+ \long\def\ignore##1\end ignore{\ignorespaces}%
+ %
+ \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check for penalty 10002 (inserted by
+ % \defargscommonending) instead of 10000, since the sectioning
+ % commands insert a \penalty10000, and we don't want to allow a break
+ % between a section heading and a defun.
+ \ifnum\lastpenalty=10002 \penalty2000 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted typewriter, prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl), inconsistently with using tt for the
+ % name. This is because literal text is sometimes needed in the
+ % argument list (groff manual), and ttsl and tt are not very
+ % distinguishable.
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+ \errmessage{Unbalanced parentheses in @def}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \errmessage{Unbalanced square braces in @def}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1\endinput}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ %
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% This does \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\@=\other
+ \catcode`\^^M=\other
+ \usembodybackslash}
+
+\def\macroargctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\@=\other
+ \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\do\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx#1\relax
+ % remove this
+ \else
+ \noexpand\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.
+\parseargdef\node{\checkenv{}\nodexxx #1,\finishnodeparse}
+\def\nodexxx#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \turnoffactive
+ \otherbackslash
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\thissection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \writexrdef{pg}{\folio}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive \otherbackslash
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{#1}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \otherbackslash
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR#1\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readauxfile
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+ %
+ \input \jobname.aux
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc.
+% We don't actually implement floating yet, we just plop the float "here".
+% But it seemed the best name for the future.
+%
+\envparseargdef\float{\dofloat #1,,,\finish}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ % don't lose footnotes inside @float.
+ \startsavinginserts
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \thissection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\thissection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\printedsomething = \empty
+ %
+ \ifx\floattype\empty \else
+ \vskip.5\parskip % space above caption
+ %
+ % Print the float number preceded by the chapter-level number
+ % (empty in the case of unnumbered), as in "Figure 1.1". Although
+ % there are other styles of float numbering, we hardwire this one.
+ \def\floatident{\floattype\tie\chaplevelprefix\the\floatno}%
+ \floatident
+ \let\printedsomething = t%
+ %
+ % Write the text that goes in the list of floats to the aux file
+ % as \floatlabel-lof. Besides the float ident, we include the
+ % short caption if specified, else the full caption if specified,
+ % else nothing.
+ {%
+ \atdummies \turnoffactive \otherbackslash
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{%
+ \floatident
+ \ifx\thisshortcaption\empty
+ \ifx\thiscaption\empty \else
+ : \thiscaption
+ \fi
+ \else
+ : \thisshortcaption
+ \fi
+ }}%
+ }%
+ \fi % end have xref label for this float
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\printedsomething\empty
+ \vskip.5\parskip % space above caption
+ \else
+ :\space % had a number, so print a colon before the caption.
+ \fi
+ %
+ % Print caption text.
+ \thiscaption
+ \let\printedsomething = t%
+ \fi
+ %
+ % Space below caption, if we printed anything.
+ \ifx\printedsomething\empty \else \vskip\parskip \fi
+ \egroup % end of \vtop
+ \checkinserts
+}
+
+\def\caption#1{\checkenv\float \def\thiscaption{#1}}
+\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}}
+\let\thiscaption=\empty
+\let\thisshortcaption=\empty
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{%
+ % use the same \entry we use for the TOC.
+ \entry{\csname XR#1-lof\endcsname}{\csname XR#1-pg\endcsname}%
+}
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@backslashcurfont}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\backslashcurfont}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/Build/source/utils/texi2html/doc/version.texi b/Build/source/utils/texi2html/doc/version.texi
new file mode 100644
index 00000000000..103d48daaa0
--- /dev/null
+++ b/Build/source/utils/texi2html/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 1 February 2005
+@set UPDATED-MONTH February 2005
+@set EDITION 1.76
+@set VERSION 1.76
diff --git a/Build/source/utils/texi2html/examples/book.init b/Build/source/utils/texi2html/examples/book.init
new file mode 100644
index 00000000000..a4147a38305
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/book.init
@@ -0,0 +1,197 @@
+# This is based on the scriptbasic style
+
+$DO_CONTENTS = 1;
+
+@SECTION_BUTTONS =
+ (
+ 'Back', 'Forward', ' ', 'Contents', 'Index', 'About'
+ );
+
+@CHAPTER_BUTTONS =
+ (
+ 'Back', 'Forward', ' ', 'Contents', 'Index', 'About'
+ );
+
+@MISC_BUTTONS = ('Contents', 'Index', 'About');
+
+@SECTION_FOOTER_BUTTONS = ('Contents', 'Index', 'About');
+
+@NODE_FOOTER_BUTTONS = ('Back', 'Forward');
+
+$WORDS_IN_PAGE = undef;
+$SHOW_MENU = 0;
+
+$BIG_RULE = '<hr size="2">';
+
+sub print_sub_toc($$);
+
+sub print_sub_toc($$)
+{
+ my $parent_element = shift;
+ my $element = shift;
+ my $result = &$anchor('', main::href($element, $parent_element->{'file'}), $element->{'text'}) . " <br>\n";
+#print STDERR "SUB_TOC $element->{'text'}\n"; #sleep 1;
+ if (exists($element->{'child'}))
+ {
+#print STDERR "SUB_TOC child $element->{'child'}->{'text'}\n";
+ $result .= "<ul>\n". print_sub_toc($parent_element, $element->{'child'}) ."</ul>\n";
+ }
+ if (exists($element->{'next'}))
+ {
+#print STDERR "SUB_TOC next($element->{'text'}) $element->{'next'}->{'text'}\n";
+ $result .= print_sub_toc($parent_element, $element->{'next'});
+ }
+ return $result;
+}
+
+sub print_up_toc($$)
+{
+ my $fh = shift;
+ my $element = shift;
+ my $current_element = $element;
+ my @elements;
+ while (defined($current_element->{'up'}) and ($current_element->{'up'} ne $current_element))
+ {
+ unshift (@elements, $current_element->{'up'});
+ $current_element = $current_element->{'up'};
+ }
+ #print $fh "<ul>" . &$anchor('', $Texi2HTML::HREF{Contents}, '[' . $Texi2HTML::NAME{Contents} . ']') . " <br>\n";
+ foreach my $elem (@elements)
+ {
+ print $fh "<ul>" . &$anchor('', main::href($elem, $element->{'file'}), $elem->{'text'}) . " <br>\n";
+ }
+ foreach my $elem (@elements)
+ {
+ print $fh "</ul>\n";
+ }
+ print $fh "</ul>\n";
+}
+
+$print_section = \&book_print_section;
+$print_Top = \&book_print_Top;
+$print_Toc = \&book_print_Toc;
+$element_file_name = \&book_element_file_name;
+
+sub book_print_section($$$)
+{
+ my $fh = shift;
+ my $first_in_page = shift;
+ my $previous_is_top = shift;
+ my $buttons = \@SECTION_BUTTONS;
+
+ if ($first_in_page and $SECTION_NAVIGATION)
+ {
+ #print_up_toc($fh, $Texi2HTML::THIS_ELEMENT) if ($SPLIT eq 'node');
+ print_up_toc($fh, $Texi2HTML::THIS_ELEMENT);
+ &$print_head_navigation($fh, $buttons);
+ }
+ else
+ { # got to do this here, as it isn't done in print_head_navigation
+ main::print_lines($fh, $Texi2HTML::THIS_HEADER);
+ &$print_navigation($fh, $buttons) if ($SECTION_NAVIGATION);
+ }
+ my $nw = main::print_lines($fh);
+ if (defined $SPLIT
+ and (($SPLIT eq 'node') && $SECTION_NAVIGATION))
+ {
+ &$print_foot_navigation($fh);
+ print $fh "$SMALL_RULE\n";
+ &$print_navigation($fh, \@NODE_FOOTER_BUTTONS) if (!defined($WORDS_IN_PAGE) or (defined ($nw)
+ and $nw >= $WORDS_IN_PAGE));
+ }
+}
+
+sub book_print_Top($$)
+{
+ my $fh = shift;
+ my $has_top_heading = shift;
+
+ my $buttons = \@MISC_BUTTONS;
+ &$print_head_navigation($fh, $buttons);
+ print $fh $Texi2HTML::TITLEPAGE;
+ print $fh "<h1 class=\"settitle\">$Texi2HTML::NAME{Top}</h1>\n"
+ unless ($has_top_heading);
+ main::print_lines($fh, $Texi2HTML::THIS_SECTION);
+ print $fh '<h2> ' . $Texi2HTML::NAME{'Contents'} . "</h2>\n" ;
+ main::print_lines($fh, $Texi2HTML::TOC_LINES);
+}
+
+sub book_print_Toc
+{
+ my $fh = shift;
+ &$print_page_head($fh) if $SPLIT;
+ #print $fh $Texi2HTML::TITLEPAGE;
+ print $fh '<h2> ' . $Texi2HTML::NAME{'Contents'} . "</h2>\n" ;
+ main::print_lines($fh);
+ &$print_misc_footer($fh, \@MISC_BUTTONS);
+}
+
+my $unumbered_nr = -1;
+my $previous_nr;
+my $previous_file_name;
+
+sub book_element_file_name($$$)
+{
+ my $element = shift;
+ my $is_top = shift;
+ my $prefix = shift;
+
+ if (defined($previous_nr) and ($element->{'doc_nr'} == $previous_nr))
+ {
+ return $previous_file_name;
+ }
+ if ($is_top)
+ {
+ $previous_file_name = "${prefix}_top.html";
+ }
+ elsif (defined($element->{'number'}) and ($element->{'number'} ne ''))
+ {
+ my $number = $element->{'number'};
+ $number .= '.' unless ($number =~ /\.$/);
+ $previous_file_name = "${prefix}_$number" . 'html';
+ }
+ else
+ {
+ $unumbered_nr++;
+ $previous_file_name = "${prefix}_U." . $unumbered_nr . '.html';
+ }
+ $previous_nr = $element->{'doc_nr'};
+ return $previous_file_name;
+}
+
+$heading = \&book_heading;
+
+sub book_heading($)
+{
+ my $element = shift;
+ my $level = 3;
+ if (!$element->{'node'})
+ {
+ $level = $element->{'level'};
+ }
+ $level = 1 if ($level == 0);
+ my $text = $element->{'text'};
+ if (!$element->{'node'} and (!$NUMBER_SECTIONS))
+ {
+ $text = $element->{'name'};
+ }
+ return '' if ($text !~ /\S/);
+ my $class = $element->{'tag_level'};
+ $class = 'unnumbered' if ($class eq 'top');
+ if (defined($element->{'tocid'}) and $TOC_LINKS)
+ {
+ $text = &$anchor ('', "$Texi2HTML::THISDOC{'toc_file'}#$element->{'tocid'}", $text);
+ }
+ $text = "<h$level class=\"$class\"> $text </h$level>\n";
+ #if (defined($SPLIT) and ($SPLIT eq 'node')
+ if (exists($element->{'child'})
+ and ($element->{'tag_level'} !~ /heading/))
+ {
+ $text .= "<ul>\n";
+ $text .= "" . print_sub_toc($element, $element->{'child'});
+ $text .= "</ul>\n";
+ }
+ return $text;
+}
+
+1;
diff --git a/Build/source/utils/texi2html/examples/chm.init b/Build/source/utils/texi2html/examples/chm.init
new file mode 100644
index 00000000000..a809ec87704
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/chm.init
@@ -0,0 +1,366 @@
+# -*-perl-*-
+
+main::load_init_file('', 'noheaders.init');
+
+$SHOW_MENU = 0;
+$SPLIT = 'node';
+$DO_CONTENT = 1;
+$SPLIT_INDEX = undef;
+$IDX_SUMMARY = 1;
+
+$SMALL_RULE = '';
+$DEFAULT_RULE = '';
+$MIDDLE_RULE = '';
+$BIG_RULE = '';
+
+$DOCUMENT_DESCRIPTION = '';
+$SEPARATED_FOOTNOTES = 0;
+
+$index_summary_file_entry = \&chm_index_summary_file_entry;
+$index_summary_file_begin = \&chm_index_summary_file_begin;
+$index_summary_file_end = \&chm_index_summary_file_end;
+
+$print_page_foot = \&chm_print_page_foot;
+
+my $default_toc_body = $toc_body;
+$toc_body = \&chm_toc_body;
+
+$finish_out = \&chm_finish_out;
+my $default_init_out = $init_out;
+
+$init_out = \&chm_init_out;
+
+my %chm_languages = (
+ 'en' => '0x409 English (United States)',
+ 'sq' => '0x041c Albanian',
+# 'ar' => '0x1401 Arabic (ALGERIA)',
+# 'es' => '0x2c0a Spanish (ARGENTINA)',
+# 'en' => '0x0c09 English (AUSTRALIA)',
+# 'de' => '0x0c07 German (AUSTRIA)',
+# 'ar' => '0x3c01 Arabic (BAHRAIN)',
+ 'be' => '0x0423 Byelorussian',
+# 'fr' => '0x080c French (BELGIUM)',
+# 'en' => '0x2809 English (BELIZE)',
+# 'es' => '0x400a Spanish (BOLIVIA)',
+# 'pt' => '0x0416 Portuguese (BRAZIL)',
+# 'ms' => '0x083e Malay (BRUNEI DARUSSALAM)',
+ 'bg' => '0x0402 Bulgarian',
+# 'fr' => '0x0c0c French (CANADA)',
+# 'es' => '0x340a Spanish (CHILE)',
+ 'zh' => '0x0804 Chinese (CHINA)',
+# 'es' => '0x240a Spanish (COLOMBIA)',
+# 'es' => '0x140a Spanish (COSTA RICA)',
+ 'hr' => '0x041a Croatian',
+ 'cs' => '0x0405 Czech',
+ 'da' => '0x0406 Danish',
+# 'es' => '0x1c0a Spanish (DOMINICAN REPUBLIC)',
+# 'es' => '0x300a Spanish (ECUADOR)',
+# 'ar' => '0x0c01 Arabic (EGYPT)',
+# 'es' => '0x440a Spanish (EL SALVADOR)',
+ 'et' => '0x0425 Estonian',
+ 'fo' => '0x0438 Faeroese',
+ 'fi' => '0x040b Finnish',
+ 'fr' => '0x040c French (FRANCE)',
+ 'de' => '0x0407 German (GERMANY)',
+ 'el' => '0x0408 Greek',
+# 'es' => '0x100a Spanish (GUATEMALA)',
+# 'es' => '0x480a Spanish (HONDURAS)',
+# 'zh' => '0x0c04 Chinese (HONG KONG)',
+ 'hu' => '0x040e Hungarian',
+ 'is' => '0x040f Icelandic',
+ 'hi' => '0x0439 Hindi',
+ 'in' => '0x04',
+ 'fa' => '0x0429 Farsi',
+# 'ar' => '0x0801 Arabic (IRAQ)',
+# 'en' => '0x1809 English (IRELAND)',
+ 'iw' => '0x04',
+ 'it' => '0x0410 Italian',
+# 'en' => '0x2009 English (JAMAICA)',
+ 'ja' => '0x0411 Japanese',
+# 'ar' => '0x2c01 Arabic (JORDAN)',
+ 'sw' => '0x0441 Swahili',
+ 'ko' => '0x0412 Korean',
+# 'ar' => '0x3401 Arabic (KUWAIT)',
+ 'al' => '0x0426 Latvian (Lettish)',
+# 'ar' => '0x3001 Arabic (LEBANON)',
+# 'ar' => '0x1001 Arabic (LIBYAN ARAB JAMAHIRIYA)',
+# 'de' => '0x1407 German (LIECHTENSTEIN)',
+ 'lt' => '0x0427 Lithuanian',
+# 'de' => '0x1007 German (LUXEMBOURG)',
+# 'zh' => '0x1404 Chinese (MACAU)',
+ 'mk' => '0x042f Macedonian',
+# 'ms' => '0x043e Malay (MALAYSIA)',
+# 'es' => '0x080a Spanish (MEXICO)',
+# 'fr' => '0x180c French (MONACO)',
+# 'ar' => '0x1801 Arabic (MOROCCO)',
+ 'nl' => '0x0413 Dutch',
+# 'en' => '0x1409 English (NEW ZEALAND)',
+# 'es' => '0x4c0a Spanish (NICARAGUA)',
+ 'no' => '0x0414 Norwegian',
+# 'ar' => '0x2001 Arabic (OMAN)',
+ 'ur' => '0x0420 Urdu',
+# 'es' => '0x180a Spanish (PANAMA)',
+# 'es' => '0x3c0a Spanish (PARAGUAY)',
+# 'es' => '0x280a Spanish (PERU)',
+# 'en' => '0x3409 English (PHILIPPINES)',
+ 'pl' => '0x0415 Polish',
+ 'pt' => '0x0816 Portuguese (PORTUGAL)',
+# 'es' => '0x500a Spanish (PUERTO RICO)',
+# 'ar' => '0x4001 Arabic (QATAR)',
+ 'ro' => '0x0418 Romanian',
+ 'ru' => '0x0419 Russian',
+ 'ar' => '0x0401 Arabic (SAUDI ARABIA)',
+# 'zh' => '0x1004 Chinese (SINGAPORE)',
+ 'sk' => '0x041b Slovak',
+ 'sl' => '0x0424 Slovenian',
+ 'af' => '0x0436 Afrikaans',
+ 'ca' => '0x0403 Catalan',
+ 'sv' => '0x041d Swedish',
+# 'de' => '0x0807 German (SWITZERLAND)',
+# 'ar' => '0x2801 Arabic (SYRIAN ARAB REPUBLIC)',
+# 'zh' => '0x0404 Chinese (TAIWAN, PROVINCE OF CHINA)',
+ 'th' => '0x041e Thai',
+# 'en' => '0x2c09 English (TRINIDAD AND TOBAGO)',
+# 'ar' => '0x1c01 Arabic (TUNISIA)',
+ 'tr' => '0x041f Turkish',
+ 'uk' => '0x0422 Ukrainian',
+# 'ar' => '0x3801 Arabic (UNITED ARAB EMIRATES)',
+# 'en' => '0x0809 English (UNITED KINGDOM)',
+# 'en' => '0x0409 English (UNITED STATES)',
+# 'es' => '0x380a Spanish (URUGUAY)',
+# 'es' => '0x200a Spanish (VENEZUELA)',
+ 'vi' => '0x242a Vietnamese',
+# 'ar' => '0x2401 Arabic (YEMEN)',
+# 'en' => '0x3009 English (ZIMBABWE)',
+ #'' => '',
+);
+
+my %hhk_global_property = (
+ 'ImageType' => 'Folder',
+);
+
+my %hhc_global_property = (
+ 'ImageType' => 'Folder',
+);
+
+# We prepare a environment for conversion of texi to unicode (maybe this
+# could be in utf8.init ?)
+my %chm_texi_map = %texi_map;
+my %chm_simple_map_texi = %simple_map_texi;
+my %chm_style_map_texi = ();
+
+foreach my $command (keys(%style_map_texi))
+{
+ $chm_style_map_texi{$command} = {};
+ foreach my $key (keys (%{$style_map_texi{$command}}))
+ {
+#print STDERR "$command, $key, $style_map_texi{$command}->{$key}\n";
+ $chm_style_map_texi{$command}->{$key} =
+ $style_map_texi{$command}->{$key};
+ }
+}
+
+foreach my $key (keys(%unicode_accents))
+{
+ $chm_style_map_texi{$key}->{'function'} = \&t2h_utf8_accent;
+}
+
+foreach my $key (%things_map)
+{
+ if (exists($unicode_map{$key}) and ($unicode_map{$key} ne ''))
+ {
+ $chm_texi_map{$key} = chr(hex($unicode_map{$key}));
+ }
+}
+
+$chm_simple_map_texi{"\n"} = ' ';
+
+my $hhp_lines = '';
+
+sub chm_init_out()
+{
+ my $encoding = &$default_init_out();
+ $TOC_FILE = $Texi2HTML::THISDOC{'file_base_name'}.'.hhc';
+ my $hhk_file = "$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}" . ".hhk";
+ open(IDXFILE, ">:encoding(utf8)", $hhk_file)
+ || die "Can't open $file_name for writing: $!\n";
+ print "# writing HTML Help index in $hhk_file...\n" if $VERBOSE;
+ print IDXFILE "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<HTML>\n";
+ print IDXFILE "<HEAD>\n<meta name=\"GENERATOR\" content=\"$Texi2HTML::THISDOC{program}\">\n";
+ print IDXFILE "<!-- Sitemap 1.0 -->\n</HEAD>\n<BODY>\n";
+ print IDXFILE "<OBJECT type=\"text/site properties\">\n";
+ foreach my $property (keys(%hhk_global_property))
+ {
+ print IDXFILE "<param name=\"$property\" value=\"$hhk_global_property{$property}\">\n";
+
+ }
+ print IDXFILE "</OBJECT>\n";
+
+ my $hhp_file = "$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}.hhp";
+ print "# writing HTML Help project in $hhp_file...\n" if $VERBOSE;
+ open (HHPFILE, ">:encoding(utf8)", $hhp_file) or
+ die "Can't open $hhp_file for writing: $!\n";
+ my $language = $chm_languages{'en'};
+ if (exists ($chm_languages{$LANG}))
+ {
+ $language = $chm_languages{$LANG};
+ }
+ my $title = to_utf8($Texi2HTML::THISDOC{'title_texi'});
+
+ print HHPFILE <<EOT;
+[OPTIONS]
+Compatibility=1.1 or later
+Compiled file=$Texi2HTML::THISDOC{'file_base_name'}.chm
+Contents file=$Texi2HTML::THISDOC{'file_base_name'}.hhc
+Default Window=Default
+Default topic=$TOP_FILE
+Display compile progress=No
+Full-text search=Yes
+Index file=$Texi2HTML::THISDOC{'file_base_name'}.hhk
+Language=$language
+Title=$title
+
+[WINDOWS]
+Default=,"$Texi2HTML::THISDOC{'file_base_name'}.hhc","$Texi2HTML::THISDOC{'file_base_name'}.hhk","$TOP_FILE","$TOP_FILE",,,,,0x22520,,0x384e,,,,,,,,0
+
+[FILES]
+EOT
+ return $encoding;
+}
+sub chm_print_page_foot($)
+{
+ my $fh = shift;
+ print $fh <<EOT;
+<p>
+$PRE_BODY_CLOSE
+</p>
+</body>
+</html>
+EOT
+}
+
+# Convert texi to string with utf8
+sub to_utf8($)
+{
+ my $text = shift;
+ $main::simple_map_texi_ref = \%chm_simple_map_texi;
+ $main::style_map_texi_ref = \%chm_style_map_texi;
+ $main::texi_map_ref = \%chm_texi_map;
+ my $normal_text_kept = $normal_text;
+ $Texi2HTML::Config::normal_text = \&t2h_utf8_normal_text;
+
+ $text = main::remove_texi($text);
+
+ $normal_text = $normal_text_kept;
+ $main::simple_map_texi_ref = \%simple_map_texi;
+ $style_map_texi_ref = \%style_map_texi;
+ $main::texi_map_ref = \%texi_map;
+ return $text;
+}
+
+
+my @hhc_lines;
+my %chm_files;
+
+sub chm_toc_body($)
+{
+ my $elements_ref = shift;
+ &$default_toc_body($elements_ref);
+ my $level = 0;
+ foreach my $element (@$elements_ref)
+ {
+ while ($level != $element->{'toc_level'})
+ {
+ if ($level < $element->{'toc_level'})
+ {
+ push (@hhc_lines, "<UL>\n");
+ $level++;
+ }
+ elsif ($level > $element->{'toc_level'})
+ {
+ push (@hhc_lines, "</UL>\n");
+ $level--;
+ }
+ }
+ my $text = '';
+ if ($NUMBER_SECTIONS)
+ {
+ $text .= $element->{'number'} . " ";
+
+ }
+ $text .= to_utf8($element->{'texi'});
+ $text =~ s/^\s*//;
+ push (@hhc_lines, "<LI> <OBJECT type=\"text/sitemap\">\n<param name=\"Name\" value=\"$text\">\n<param name=\"Local\" value=\"$element->{'file'}#$element->{'id'}\">\n</OBJECT> </LI>\n");
+ if (!$chm_files{$element->{'file'}})
+ {
+ $hhp_lines .= "$element->{'file'}\n";
+ $chm_files{$element->{'file'}} = 1;
+ }
+ }
+ while ($level > 0)
+ {
+ push (@hhc_lines, "</UL>\n");
+ $level--;
+ }
+}
+
+# key:
+# origin_href:
+# entry:
+# texi entry:
+# element_href:
+# element_text:
+sub chm_index_summary_file_entry ($$$$$$$$)
+{
+ my $name = shift;
+ my $key = shift;
+ my $origin_href = shift;
+ my $entry = shift;
+ my $text = '';
+ #$entry = &$protect_text($key);
+ my $texi_entry = shift;
+ my $element_href = shift;
+ my $element_text = shift;
+ my $is_printed = shift;
+ $entry = to_utf8($texi_entry);
+ print IDXFILE "<LI> <OBJECT type=\"text/sitemap\">\n<param name=\"Name\" value=\"$entry\">\n<param name=\"Local\" value=\"$origin_href\">\n</OBJECT> </LI>\n";
+}
+
+sub chm_index_summary_file_begin($$)
+{
+ my $name = shift;
+ my $is_printed = shift;
+}
+
+# file is not closed here but in finish_out.
+sub chm_index_summary_file_end($$)
+{
+ my $name = shift;
+ my $is_printed = shift;
+}
+
+sub chm_finish_out()
+{
+ print IDXFILE "</BODY>\n</HTML>\n";
+ close (IDXFILE);
+ my $hhc_file = "$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}.hhc";
+ open (HHCFILE, ">:encoding(utf8)", $hhc_file) or
+ die "Can't open $hhc_file for writing: $!\n";
+
+ print HHCFILE "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<HTML>\n";
+ print HHCFILE "<HEAD>\n<meta name=\"GENERATOR\" content=\"$Texi2HTML::THISDOC{program}\">\n";
+ print HHCFILE "<!-- Sitemap 1.0 -->\n</HEAD>\n<BODY>\n";
+ print HHCFILE "<OBJECT type=\"text/site properties\">\n";
+ foreach my $property (keys(%hhc_global_property))
+ {
+ print HHCFILE "<param name=\"$property\" value=\"$hhc_global_property{$property}\">\n";
+
+ }
+ print HHCFILE "</OBJECT>\n";
+ main::print_lines(\*HHCFILE, \@hhc_lines);
+ print HHCFILE "</HTML>\n</BODY>\n";
+ print HHPFILE $hhp_lines;
+ close (HHPFILE);
+}
+
+1;
diff --git a/Build/source/utils/texi2html/examples/html32.init b/Build/source/utils/texi2html/examples/html32.init
new file mode 100644
index 00000000000..4e69eafd7d8
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/html32.init
@@ -0,0 +1,205 @@
+# -*-perl-*-
+# APA: Add SystemLiteral to identify the canonical DTD.
+# [Definition:] The SystemLiteral is called the entity's system
+# identifier. It is a URI, which may be used to retrieve the entity.
+# See http://www.xml.com/axml/target.html#NT-ExternalID
+$DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" "http://www.w3.org/TR/html32/loose.dtd">';
+
+$FRAMESET_DOCTYPE = $DOCTYPE;
+
+$BODYTEXT = 'bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"';
+# this controls the pre style for menus
+$MENU_PRE_STYLE = '';
+
+$TOC_LIST_STYLE ='';
+
+$USE_ISO = 0;
+$MENU_SYMBOL = '*';
+
+# This lines are inserted before and after the shortcontents
+$BEFORE_OVERVIEW = "";
+$AFTER_OVERVIEW = '';
+
+# This lines are inserted before and after the contents
+$BEFORE_TOC_LINES = "";
+$AFTER_TOC_LINES = '';
+
+# html version for latex2html
+$L2H_HTML_VERSION = "3.2";
+
+# no css
+$CSS_LINES = "";
+%css_map = ();
+
+$things_map{'oe'} = '&#156;';
+$things_map{'OE'} = '&#140;';
+$things_map{'dots'} = '<small>...</small>';
+$things_map{'enddots'} = '<small>....</small>';
+$things_map{'euro'} = 'Euro';
+$style_map{'sansserif'} = {};
+
+# formatting functions
+
+$summary_letter = \&t2h_html32_summary_letter;
+$protect_text = \&t2h_html32_protect_text;
+$heading = \&t2h_html32_heading;
+$preformatted = \&t2h_html32_preformatted;
+$raw = \&t2h_html32_raw;
+$menu = \&t2h_html32_menu;
+$foot_section = \&t2h_html32_foot_section;
+$cartouche = \&t2h_html32_cartouche;
+$listoffloats = \&t2h_html32_listoffloats;
+$float = \&t2h_html32_float;
+
+# &quot; is not in html 3.2
+sub t2h_html32_protect_text($)
+{
+ my $text = shift;
+ $text =~ s/&/&amp;/g;
+ $text =~ s/</&lt;/g;
+ $text =~ s/>/&gt;/g;
+ #$text =~ s/\"/&quot;/g;
+ return $text;
+}
+
+# a preformatted section
+sub t2h_html32_preformatted($$$)
+{
+ my $text = shift;
+ my $pre_style = shift;
+ my $class = shift;
+
+ return '' if ($text eq '');
+ return "<pre>$text</pre>";
+}
+
+# a heading for an element
+sub t2h_html32_heading($)
+{
+ my $element = shift;
+ my $level = 3;
+ if (!$element->{'node'})
+ {
+ $level = $element->{'level'};
+ }
+ $level = 1 if ($level == 0);
+ my $text = $element->{'text'};
+ if (!$element->{'node'} and (!$NUMBER_SECTIONS))
+ {
+ $text = $element->{'name'};
+ }
+ return '' if ($text !~ /\S/);
+ if (defined($element->{'tocid'}) and $TOC_LINKS)
+ {
+ $text = &$anchor ('', "$Texi2HTML::THISDOC{'toc_file'}#$element->{'tocid'}", $text);
+ }
+ return "<h$level> $text </h$level>\n";
+}
+
+# formatting of raw regions
+# ih L2H is true another mechanism is used for tex
+sub t2h_html32_raw($$)
+{
+ my $style = shift;
+ my $text = shift;
+ if ($style eq 'verbatim' or $style eq 'tex')
+ {
+ return "<pre>" . &$protect_text($text) . '</pre>';
+ }
+ elsif ($style eq 'html')
+ {
+ return $text;
+ }
+ else
+ {
+ warn "$WARN (bug) unknown style $style\n";
+ return &$protect_text($text);
+ }
+}
+
+# a whole menu
+sub t2h_html32_menu($)
+{
+ my $text = shift;
+ if ($text =~ /\S/)
+ {
+ return "<table border=\"0\" cellspacing=\"0\">\n"
+ . $text . "</table>\n";
+ }
+}
+
+# a simple menu entry ref in case we aren't in a standard menu context
+sub t2h_html32_foot_section($)
+{
+ my $lines = shift;
+ unshift (@$lines, "<hr>\n", "<h3>Footnotes</h3>\n");
+ return $lines;
+}
+
+# a cartouche
+sub t2h_html32_cartouche($)
+{
+ my $text = shift;
+
+ if ($text =~ /\S/)
+ {
+ return "<table border=\"1\"><tr><td>\n" . $text . "</td></tr></table>\n";
+ }
+ return '';
+}
+
+
+# no style
+sub t2h_html32_summary_letter($$$)
+{
+ my $letter = shift;
+ my $file = shift;
+ my $identifier = shift;
+ return &$anchor('', $file . '#' . $identifier, '<b>' . &$protect_text($letter) . '</b>');
+}
+
+sub t2h_html32_float($$$$$)
+{
+ my $text = shift;
+ my $float = shift;
+ my $caption = shift;
+ my $shortcaption = shift;
+
+ my $label = '';
+ if (exists($float->{'id'}))
+ {
+ $label = &$anchor($float->{'id'});
+ }
+ my $caption_text = '';
+
+ if (defined($float->{'caption_texi'}))
+ {
+ $caption_text = $caption;
+ }
+ elsif (defined($float->{'shortcaption_texi'}))
+ {
+ $caption_text = $shortcaption;
+ }
+ elsif (defined($caption))
+ {
+ $caption_text = $caption;
+ }
+
+ return "$label\n" . $text . $caption_text;
+}
+
+sub t2h_html32_listoffloats($$$)
+{
+ my $style_texi = shift;
+ my $style = shift;
+ my $float_entries = shift;
+
+ my $result = "<dl>\n" ;
+ foreach my $float_entry (@$float_entries)
+ {
+ $result .= $float_entry;
+ }
+ return $result . "</dl>\n";
+}
+
+
diff --git a/Build/source/utils/texi2html/examples/inlinestyle.init b/Build/source/utils/texi2html/examples/inlinestyle.init
new file mode 100644
index 00000000000..ecd8c63e4fb
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/inlinestyle.init
@@ -0,0 +1,39 @@
+
+$TOC_LIST_ATTRIBUTE = $TOC_LIST_ATTRIBUTE . " style=\"$TOC_LIST_STYLE\"";
+
+# we empty CSS_LINES as all styles are inlined
+$CSS_LINES = "";
+
+$style_map{'sansserif'} =
+ { 'attribute' => "span style=\"$css_map{'sansserif'}\""};
+
+# formatting functions
+
+$preformatted = \&t2h_inlinestyle_preformatted;
+$summary_letter = \&t2h_inline_summary_letter;
+
+sub t2h_inlinestyle_preformatted($$$)
+{
+ my $text = shift;
+ my $pre_style = shift;
+ my $class = shift;
+
+ return '' if ($text eq '');
+ my $open = '<pre';
+ if ($pre_style)
+ {
+ $open .= " style=\"$pre_style\"";
+ }
+ return $open .= " class=\"$class\">$text</pre>";
+}
+
+sub t2h_inline_summary_letter($$$)
+{
+ my $letter = shift;
+ my $file = shift;
+ my $identifier = shift;
+ return &$anchor('', $file . '#' . $identifier, '<b>' . &$protect_html($letter) . '</b>', 'class="summary-letter" style="text-decoration: none"');
+
+}
+
+1;
diff --git a/Build/source/utils/texi2html/examples/makeinfo.init b/Build/source/utils/texi2html/examples/makeinfo.init
new file mode 100644
index 00000000000..ec3cb92264f
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/makeinfo.init
@@ -0,0 +1,147 @@
+# -*-perl-*-
+$TOP_FILE = 'index.html';
+
+$SHOW_MENU = 1;
+
+$USE_NODES = 1;
+
+$SPLIT = 'node';
+
+$SECTION_NAVIGATION = 1;
+
+$SHORT_REF = 1;
+
+$NODE_NAME_IN_MENU = 1;
+
+$AVOID_MENU_REDUNDANCY = 0;
+
+$SPLIT_INDEX = 0;
+
+$MENU_SYMBOL = '*';
+
+$WORDS_IN_PAGE = 200;
+
+$SEPARATED_FOOTNOTES = 0;
+
+@SECTION_BUTTONS =
+ (
+ \"node: ", \$Texi2HTML::NODE{This}, [ 'NodeNext', \$Texi2HTML::NODE{Next} ] , \",", [ 'NodePrev', \$Texi2HTML::NODE{Prev} ], \",", [ 'NodeUp', \$Texi2HTML::NODE{NodeUp} ], 'Following'
+ );
+
+my $default_init_out = $init_out;
+$init_out = \&makeinfo_like_init_out;
+
+sub makeinfo_like_init_out()
+{
+ my $encoding = &$default_init_out();
+ $NAVIGATION_TEXT{'Following'} = ' &gt; ';
+ return $encoding;
+}
+
+
+@MISC_BUTTONS = @SECTION_BUTTONS;
+
+$foot_line_and_ref = \&makeinfo_like_foot_line_and_ref;
+$foot_lines = \&makeinfo_like_foot_lines;
+$index_summary = \&makeinfo_like_index_summary;
+$summary_letter = \&makeinfo_like_summary_letter;
+$index_entry = \&makeinfo_like_index_entry;
+$index_letter = \&makeinfo_like_index_letter;
+$print_index = \&makeinfo_like_print_index;
+$listoffloats = \&makeinfo_like_listoffloats;
+$listoffloats_entry = \&makeinfo_like_listoffloats_entry;
+
+sub makeinfo_like_foot_line_and_ref($$$$$$$$)
+{
+ my $foot_num = shift;
+ my $relative_num = shift;
+ my $footid = shift;
+ my $docid = shift;
+ my $from_file = shift;
+ my $footnote_file = shift;
+ my $lines = shift;
+ my $state = shift;
+
+ my $foot_anchor = "<sup>" . &$anchor($docid, "$footnote_file#$footid", $relative_num) . "</sup>";
+ $foot_anchor = &$anchor($docid, "$footnote_file#$footid", "($relative_num)") if ($state->{'preformatted'});
+ unshift @$lines, "<li>";
+ push @$lines, "</li>\n";
+ return ($lines, $foot_anchor);
+}
+
+sub makeinfo_like_foot_lines($)
+{
+ my $lines = shift;
+ unshift @$lines, "<hr>\n<h4>$Texi2HTML::I18n::WORDS->{'Footnotes_Title'}</h4>\n<ol type=\"1\">\n";
+ push @$lines, "</ol>";
+ return $lines;
+}
+
+
+sub makeinfo_like_index_summary
+{
+ return '';
+}
+
+sub makeinfo_like_summary_letter
+{
+ return '';
+}
+
+sub makeinfo_like_index_entry($$$$)
+{
+ my $text_href = shift;
+ my $entry = shift;
+ my $element_href = shift;
+ my $element_text = shift;
+
+ return '<li>' . $entry . ': ' . &$anchor('', $element_href, $element_text)
+ . "</li>\n";
+}
+
+sub makeinfo_like_index_letter($$$)
+{
+ my $letter = shift;
+ my $id = shift;
+ my $text = shift;
+ return $text;
+}
+
+sub makeinfo_like_print_index($$)
+{
+ my $text = shift;
+ my $name = shift;
+ return "<ul class=\"index-$name\" compact>\n" . $text . "</ul>\n";
+}
+
+sub makeinfo_like_listoffloats_entry($$$$)
+{
+ my $style_texi = shift;
+ my $float = shift;
+ my $float_style = shift;
+ my $caption = shift;
+ my $href = shift;
+
+ if ($caption ne '')
+ {
+ return '<li>' . &$I('%{href}: %{caption}', { 'href' => &$anchor('', $href, $float_style), 'caption' => $caption }) . "</li>\n";
+ }
+ else
+ {
+ return '<li>' . &$anchor('', $href, $float_style) . "</li>\n";
+ }
+}
+
+sub makeinfo_like_listoffloats($$$)
+{
+ my $style_texi = shift;
+ my $style = shift;
+ my $float_entries = shift;
+
+ my $result = "<ul class=\"listoffloats\">\n" ;
+ foreach my $float_entry (@$float_entries)
+ {
+ $result .= $float_entry;
+ }
+ return $result . "</ul>\n";
+}
diff --git a/Build/source/utils/texi2html/examples/noheaders.init b/Build/source/utils/texi2html/examples/noheaders.init
new file mode 100644
index 00000000000..1daf77a8459
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/noheaders.init
@@ -0,0 +1,137 @@
+# -*-perl-*-
+
+$SPLIT = 'none';
+
+$print_section = \&T2H_NOHEAD_print_section;
+$end_section = \&T2H_NOHEAD_end_section;
+$one_section = \&T2H_NOHEAD_one_section;
+#$print_Top_header = \&T2H_NOHEAD_print_Top_header;
+$print_Top_footer = \&T2H_NOHEAD_print_Top_footer;
+$print_Top = \&T2H_NOHEAD_print_Top;
+$print_misc_header = \&T2H_NOHEAD_print_misc_header;
+$print_misc_footer = \&T2H_NOHEAD_print_misc_footer;
+$print_misc = \&T2H_NOHEAD_print_misc;
+$print_head_navigation = \&T2H_NOHEAD_print_head_navigation;
+$about_body = \&T2H_NOHEAD_about_body;
+#$toc_body = \&T2H_NOHEAD_toc_body;
+
+########################################################################
+# Layout for html for every sections
+#
+sub T2H_NOHEAD_print_section
+{
+ my $fh = shift;
+ my $first_in_page = shift;
+ my $previous_is_top = shift;
+
+ if ($first_in_page)
+ {
+ &$print_head_navigation($fh);
+ }
+ else
+ { # got to do this here, as it isn't done in print_head_navigation
+ main::print_lines($fh, $Texi2HTML::THIS_HEADER);
+ }
+ my $nw = main::print_lines($fh);
+}
+
+sub T2H_NOHEAD_one_section($)
+{
+ my $fh = shift;
+ main::print_lines($fh);
+ print $fh "$SMALL_RULE\n";
+ &$print_page_foot($fh);
+}
+
+###################################################################
+# Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
+# @html within the Top texinfo node to specify content of top-level
+# page.
+#
+# If you enclose everything in @ifnothtml, then title, subtitle,
+# author and overview is printed
+# Texi2HTML::HREF of Next, Prev, Up, Forward, Back are not defined
+# if $T2H_SPLIT then Top page is in its own html file
+sub T2H_NOHEAD_print_Top_footer($$)
+{
+ my $fh = shift;
+ print $fh "$SMALL_RULE\n";
+}
+sub T2H_NOHEAD_print_Top
+{
+ my $fh = shift;
+ my $has_top_heading = shift;
+
+ &$print_head_navigation($fh,[]);
+ if ($Texi2HTML::THIS_SECTION)
+ {
+ # if top-level node has content, then print it with extra header
+ #print $fh "<h1>$Texi2HTML::NAME{Top}</h1>\n"
+ print $fh "<h1 class=\"settitle\">$Texi2HTML::NAME{Top}</h1>\n"
+ unless ($has_top_heading);
+ main::print_lines($fh, $Texi2HTML::THIS_SECTION);
+ }
+ else
+ {
+ # top-level node is fully enclosed in @ifnothtml
+ # print fulltitle, subtitle, author, Overview
+ print $fh $Texi2HTML::TITLEPAGE;
+ if (@{$Texi2HTML::OVERVIEW})
+ {
+ print $fh '<h2> ' . &$I('Overview:') . "</h2>\n" . "<blockquote>\n";
+ my $nw = main::print_lines($fh, $Texi2HTML::OVERVIEW);
+ print $fh "</blockquote>\n";
+ }
+ }
+}
+
+###################################################################
+# Layout of Toc, Overview, and Footnotes pages
+# By default, we use "normal" layout
+# Texi2HTML::HREF of Next, Prev, Up, Forward, Back, etc are not defined
+# use: my $buttons = [...] to redefine navigation buttons
+sub T2H_NOHEAD_print_misc_header
+{
+ my $fh = shift;
+ &$print_page_head($fh) if $SPLIT;
+ &$print_head_navigation($fh);
+}
+sub T2H_NOHEAD_print_misc_footer
+{
+ my $fh = shift;
+ print $fh "$SMALL_RULE\n";
+ if ($SPLIT)
+ {
+ &$print_navigation($fh, $buttons);
+ &$print_page_foot($fh);
+ }
+
+}
+sub T2H_NOHEAD_print_misc
+{
+ my $fh = shift;
+ &$print_misc_header($fh);
+ print $fh "<h1>$Texi2HTML::NAME{This}</h1>\n";
+ main::print_lines($fh);
+ &$print_misc_footer($fh);
+}
+
+sub T2H_NOHEAD_end_section($)
+{
+ my $fh = shift;
+ print $fh "$MIDDLE_RULE\n";
+}
+
+###################################################################
+# Layout of navigation panel
+
+sub T2H_NOHEAD_print_head_navigation
+{
+ my $fh = shift;
+ main::print_lines($fh, $Texi2HTML::THIS_HEADER);
+}
+
+sub T2H_NOHEAD_about_body
+{
+}
+
diff --git a/Build/source/utils/texi2html/examples/roff.init b/Build/source/utils/texi2html/examples/roff.init
new file mode 100644
index 00000000000..221cb214cbf
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/roff.init
@@ -0,0 +1,1165 @@
+# -*-perl-*-
+
+main::load_init_file('', 'noheaders.init');
+
+$SPLIT = 'none';
+@EXPAND = ('info');
+$USE_ISO = 0;
+#$SHOW_MENU = 0;
+$SMALL_RULE = '';
+$DEFAULT_RULE = '';
+$MIDDLE_RULE = '';
+$BIG_RULE = '';
+$NODE_FILE_EXTENSION = "roff";
+$EXTENSION = "roff";
+$MENU_SYMBOL = '*';
+$AVOID_MENU_REDUNDANCY = 0;
+
+$print_Top = \&T2H_ROFF_print_Top;
+$print_misc = \&T2H_ROFF_print_misc;
+$print_page_head = \&T2H_ROFF_print_page_head;
+$print_page_foot = \&T2H_ROFF_print_page_foot;
+$toc_body = \&T2H_ROFF_toc_body;
+$titlepage = \&T2H_ROFF_titlepage;
+
+sub T2H_ROFF_print_page_head
+{
+ my $fh = shift;
+ print $fh <<EOT;
+.nr _- 0
+.tr \\(is'
+.tr \\(if`
+.tr \\(pd"
+
+$AFTER_BODY_OPEN
+
+EOT
+ print $fh $Texi2HTML::THISDOC{'copying'} . "\n";
+ print $fh "" . &$comment("Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program}\n");
+ print $fh "" . &$comment($Texi2HTML::THISDOC{program_authors});
+ print $fh ".ds St " . protect_spaces($Texi2HTML::THISDOC{'title'}) . "\n";
+ print $fh '.oh \'\\\\*(St\'\'%\'' ."\n".'.eh \'%\'\'\\\\*(St\'' . "\n";
+}
+
+sub T2H_ROFF_print_page_foot
+{
+ my $fh = shift;
+ my $program_string = program_string();
+ print $fh <<EOT;
+.br
+.pp
+$program_string
+EOT
+}
+
+sub T2H_ROFF_print_Top($$)
+{
+ my $fh = shift;
+ my $has_top_heading = shift;
+
+ my $buttons = \@MISC_BUTTONS;
+ &$print_head_navigation($fh, $buttons);
+ print $fh $Texi2HTML::TITLEPAGE;
+ main::print_lines($fh, $Texi2HTML::THIS_SECTION);
+}
+
+sub T2H_ROFF_print_misc
+{
+ my $fh = shift;
+ &$print_misc_header($fh);
+ main::print_lines($fh);
+ &$print_misc_footer($fh);
+}
+
+sub T2H_ROFF_titlepage ()
+{
+ my $result = '';
+ if (@{$Texi2HTML::THISDOC{'titles'}}
+ or @{$Texi2HTML::THISDOC{'subtitles'}}
+ or @{$Texi2HTML::THISDOC{'authors'}})
+ {
+ foreach my $title (@{$Texi2HTML::THISDOC{'titles'}})
+ {
+ $result .= ".sz +10\n.ce\n" . protect_spaces($title) . "\n.sz -10\n";
+ }
+ foreach my $subtitle (@{$Texi2HTML::THISDOC{'subtitles'}})
+ {
+ $result .= ".sz +4\n.ce\n" . protect_spaces($subtitle) . "\n.sz -4\n";
+ }
+ $result .= ".sp 4\n" if ($result ne '');
+ foreach my $author (@{$Texi2HTML::THISDOC{'authors'}})
+ {
+ $result .= protect_spaces($author) . "\n.br\n";
+ }
+ $result .= ".sp 2\n" if (@{$Texi2HTML::THISDOC{'authors'}});
+ }
+ if (($result ne '') or ($Texi2HTML::TITLEPAGE ne ''))
+ {
+ $Texi2HTML::TITLEPAGE = ".tp\n" . $result . $Texi2HTML::TITLEPAGE . ".++ C\n";
+ }
+}
+
+########################################################################
+# Control of formatting:
+# 1.) For some changes, it is often enough to change the value of
+# some global map. It might necessitate building a little
+# function along with the change in hash, if the change is the use
+# of another function (in style_map).
+# 2.) For other changes, reimplement one of the t2h_default_<fnc>* routines,
+# give them another name, and assign them to the respective
+# $<fnc> variable (below).
+
+
+#
+# This hash should have keys corresponding with the nonletter command accent
+# whose following character is considered to be the argument
+# This hash associates an accent macro to the ISO name for the accent if any.
+# The customary use of this map is to find the ISO name appearing in html
+# entity (like &eacute;) associated with a texinfo accent macro.
+#
+# The keys of the hash are
+# ": umlaut
+# ~: tilda accent
+# ^: circumflex accent
+# `: grave accent
+# ': acute accent
+# =: macron accent
+%accent_map = (
+ '"', ':',
+ '~', '~',
+ '^', '^',
+ '`', '`',
+ "'", "'",
+ '=', '',
+ );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+# "*", "\n.br\n",
+ ' ', '\ ',
+ "\t", "\\\t",
+ "\n", "\\\n",
+ # "&#173;" or "&shy;" could also be possible for @-, but it seems
+ # that some browser will consider this as an always visible hyphen mark
+ # which is not what we want (see http://www.cs.tut.fi/~jkorpela/shy.html)
+ '-', '', # hyphenation hint
+ '|', '', # used in formatting commands @evenfooting and friends
+ '/', '',
+ # spacing commands
+ ':', '',
+ '!', '!',
+ '?', '?',
+ '.', '\&.',
+ '@', '@',
+ '}', '}',
+ '{', '{',
+ );
+
+# this map is used in preformatted text
+%simple_map_pre = %simple_map;
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+ 'TeX' => 'TeX',
+ 'LaTeX' => 'LaTeX',
+ 'bullet' => '\(bu',
+ 'copyright' => '\(co',
+ 'registeredsymbol' => '\(rg',
+ 'dots' => '\&...',
+ 'enddots' => '\&....',
+ 'equiv' => '\(==',
+# i18n
+ 'error' => 'error->',
+ 'expansion' => '\(->',
+ 'minus' => '\-',
+ 'point' => '*',
+ 'print' => '-|',
+ 'result' => '\(rh',
+ # set in code using the language
+ # 'today', &pretty_date,
+ 'aa' => '\(oa',
+ 'AA' => '\(oA',
+ 'ae' => '\(ae',
+ 'oe' => '\(oe',
+ 'AE' => '\(AE',
+ 'OE' => '\(OE',
+ 'o' => '\(/o',
+ 'O' => '\(/O',
+ 'ss' => '\(ss',
+ 'l' => '\(/l',
+ 'L' => '\(/L',
+ 'exclamdown' => '\(r!',
+ 'questiondown' => '\(r?',
+ 'pounds' => '\(Po',
+ 'ordm' => '\(Om',
+ 'ordf' => '\(Of',
+ 'euro' => '\(eu',
+ );
+
+# This map is used in preformatted environments
+%pre_map = %things_map;
+
+#%style_map = (
+# 'acronym', '',
+# 'asis', '',
+# 'b', ['\fB', '\fR'],
+# 'cite', ['\fI', '\fR'],
+# 'code', ['\fR\&\f(CW', '\fR'],
+# 'command', ['\fR\&\f(CW', '\fR'],
+# 'ctrl', ['\fR\&\f(CW', '\fR'],
+# 'dfn', ['\fI', '\fR'],
+# 'dmn', '',
+# 'email', ['\fB', '\fR'],
+# 'emph', ['\fI', '\fR'],
+# 'env', ['\fR\&\f(CW', '\fR'],
+# 'file', ['\fR\&\f(CW', '\fR', '"'],
+# 'i', ['\fI', '\fR'],
+# 'kbd', ['\fR\&\f(CW', '\fR'],
+# 'key', ['\fR\&\f(CW', '\fR'],
+# 'math', ['\fR\&\f(CW', '\fR'],
+# 'option', ['\fR\&\f(CW', '\fR', '"'],
+# 'r', ['\fR', ''],
+# 'samp', ['\fR\&\f(CW', '\fR', '"'],
+# 'sc', '&roff_sc',
+# 'strong', ['\fB', '\fR'],
+# 't', ['\fR\&\f(CW', '\fR'],
+# 'uref', '&default_uref',
+# 'url', '&default_url',
+# 'var', ['\fI', '\fR'],
+# 'verb', ['\fR\&\f(CW', '\fR'],
+# 'titlefont', ["\n.sz +10\n.ce\n", "\n.sz -10\n"],
+# 'w', '',
+# 'H', '&roff_accent',
+# 'dotaccent', '&roff_accent',
+# 'ringaccent', '&roff_accent',
+# 'tieaccent', '&roff_accent',
+# 'u', '&roff_accent',
+# 'ubaraccent', '&roff_accent',
+# 'udotaccent', '&roff_accent',
+# 'v', '&roff_accent',
+# ',', '&roff_accent',
+# 'dotless', ''
+# );
+
+my @bold_commands = ('strong', 'b', 'email');
+my @italic_commands = ('cite', 'dfn', 'emph', 'i', 'var', 'slanted');
+my @fixed_command = ('code', 'command', 'ctrl', 'env', 'file', 'kbd', 'key',
+ 'math', 'option', 'samp', 't', 'verb');
+
+foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents), keys(%accent_map))
+{
+ #$style_map{$accent_command} = { 'function' => \&t2h_roff_accent };
+ $style_map{$accent_command} = '&roff_accent';
+}
+#foreach my $accent (keys(%accent_map))
+#{
+# $style_map{$accent} = '&roff_accent';
+#}
+
+foreach my $command (keys(%style_map))
+{
+ delete $style_map{$command}->{'attribute'} if (exists($style_map{$command}->{'attribute'}));
+ if (grep {$_ eq $command} @bold_commands)
+ {
+ delete $style_map{$command}->{'function'} if (exists($style_map{$command}->{'function'}));
+ $style_map{$command}->{'begin'} = '\fB';
+ $style_map{$command}->{'end'} = '\fR';
+ next;
+ }
+ elsif (grep {$_ eq $command} @italic_commands)
+ {
+ delete $style_map{$command}->{'function'} if (exists($style_map{$command}->{'function'}));
+ $style_map{$command}->{'begin'} = '\fI';
+ $style_map{$command}->{'end'} = '\fR';
+ next;
+ }
+ elsif (grep {$_ eq $command} @fixed_commands)
+ {
+ delete $style_map{$command}->{'function'} if (exists($style_map{$command}->{'function'}));
+ $style_map{$command}->{'begin'} = '\fR\&\f(CW';
+ $style_map{$command}->{'end'} = '\fR';
+ next;
+ }
+}
+
+delete $style_map{'titlefont'}->{'function'} if (exists($style_map{'titlefont'}->{'function'}));
+$style_map{'titlefont'}->{'begin'} = "\n.sz +10\n.ce\n";
+$style_map{'titlefont'}->{'end'} = "\n.sz -10\n";
+
+delete $style_map{'r'}->{'function'} if (exists($style_map{'r'}->{'function'}));
+$style_map{'r'}->{'begin'} = '\r';
+#$style_map{'r'}->{'end'} = '';
+
+$style_map{'sc'} = '&roff_sc';
+
+$style_map{'indicateurl'}->{'begin'} = '<';
+$style_map{'indicateurl'}->{'end'} = '>';
+
+foreach my $command (keys(%style_map))
+{
+ if (ref($style_map{$command}) ne 'HASH')
+ {
+ $style_map_pre{$command} = $style_map{$command};
+ next;
+ }
+ $style_map_pre{$command} = {};
+ foreach my $key (keys(%{$style_map{$command}}))
+ {
+ $style_map_pre{$command}->{$key} = $style_map{$command}->{$key};
+ }
+}
+
+%special_accents = (
+ 'ringaccent' => 'aA',
+ "'" => 'aeiouyAEIOUY',
+ ',' => 'cC',
+ '^' => 'aeiouAEIOU',
+ '`' => 'aeiouAEIOU',
+ '~' => 'nNaoAO',
+ '"' => 'aeiouyAEIOUY',
+ 'v' => 'sSzZ',
+);
+
+sub roff_accent($$)
+{
+ my $text = shift;
+ my $accent = shift;
+ return $text if ($accent eq 'dotless');
+ return "\\($accent_map{$accent}${text}" if (defined($accent_map{$accent}) and defined($special_accents{$accent}) and ($text =~ /^[$special_accents{$accent}]$/));
+ return "\\(o${text}" if (($accent eq 'ringaccent') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+ return "\\(v${text}" if (($accent eq 'v') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+ return "\\(,${text}" if (($accent eq ',') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+#FIXME maybe we should protect the symbols such that they look like strings and
+# not ponctuation marks ? Like it is done in texi2roff ?
+# otherwise we should use
+# return ascii_accents($text, $accent);
+ return $text . $accent if (defined($accent_map{$accent}));
+ return $text . "''" if ($accent eq 'H');
+ return $text . '\\&.' if ($accent eq 'dotaccent');
+ return $text . '*' if ($accent eq 'ringaccent');
+ return $text . '[' if ($accent eq 'tieaccent');
+ return $text . '(' if ($accent eq 'u');
+ return $text . '_' if ($accent eq 'ubaraccent');
+ return '\\&.' . $text if ($accent eq 'udotaccent');
+ return $text . '<' if ($accent eq 'v');
+ return $text . ',' if ($accent eq ',');
+}
+
+sub roff_sc($$)
+{
+ return "\n.sz -6\n" . uc($_[0]) . "\n.sz +6\n" ;
+}
+
+sub roff_ctrl($$)
+{
+ return "\\*^$_[0]";
+}
+
+$format = \&T2H_ROFF_format;
+
+sub T2H_ROFF_format($$$)
+{
+ my $tag = shift;
+ my $element = shift;
+ my $text = shift;
+ return '' if (!defined($element) or ($text !~ /\S/));
+ return $element->[0] . $text . $element->[1];
+}
+
+%format_map = (
+ 'quotation' => [ ".(q\n", ".)q\n" ],
+ # lists
+ 'itemize' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ],
+ 'enumerate' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ],
+ 'multitable' => [ ".(l M\n.nh\n", ".hy\n.)l\n" ],
+ 'table' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ],
+ 'vtable' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ],
+ 'ftable' => [ ".(l L F\n.ba +5\n", ".ba -5\n.)l\n" ],
+ );
+
+%special_list_commands = (
+ 'table' => {},
+ 'vtable' => {},
+ 'ftable' => {},
+ 'itemize' => {}
+ );
+
+# an eval of these $complex_format_map->{what}->{'begin'} yields beginning
+# an eval of these $complex_format_map->{what}->{'end'} yields end
+# $EXAMPLE_INDENT_CELL and SMALL_EXAMPLE_INDENT_CELL can be usefull here
+$complex_format_map =
+{
+ 'example' =>
+ {
+ 'begin' => q{""},
+ 'end' => q{""},
+ 'begin_region' => ".(l I\n\\&\\fR\\f(CW",
+ 'end_region' => "\\&\\fR\n.)l\n"
+ },
+ 'smallexample' =>
+ {
+ 'begin' => q{""},
+ 'end' => q{""},
+ 'begin_region' => ".(l I\n.size -2\n\\&\\fR\\f(CW",
+ 'end_region' => "\\&\\fR\n.size +2\n.)l\n"
+ },
+ 'display' =>
+ {
+ 'begin' => q{""},
+ 'end' => q{""},
+ 'begin_region' => ".(l I\n\\&\\fR\\f(CW",
+ 'end_region' => "\\&\\fR\n.)l\n"
+ },
+ 'smalldisplay' =>
+ {
+ 'begin' => q{""},
+ 'end' => q{""},
+ 'begin_region' => ".(l I\n.size -2\n\\&\\fR\\f(CW",
+ 'end_region' => "\\&\\fR\n.size +2\n.)l\n"
+ },
+ 'menu-comment' =>
+ {
+ 'begin' => q{""},
+ 'end' => q{""},
+ 'begin_region' => "",
+ 'end_region' => "\n"
+ },
+ 'menu-preformatted' =>
+ {
+ 'begin' => q{""},
+ 'end' => q{""},
+ 'begin_region' => "",
+ 'end_region' => "\n"
+ }
+};
+
+# format shouldn't narrow the margins
+
+$complex_format_map->{'lisp'} = $complex_format_map->{'example'};
+$complex_format_map->{'smalllisp'} = $complex_format_map->{'smallexample'};
+$complex_format_map->{'format'} = $complex_format_map->{'display'};
+$complex_format_map->{'smallformat'} = $complex_format_map->{'smalldisplay'};
+
+sub protect_spaces($)
+{
+ my $text = shift;
+ my $result = '';
+ while($text)
+ {
+ if ($text =~ s/^([^\\]*)\\//o)
+ {
+ my $leading = $1;
+ if (defined($leading))
+ {
+ $leading =~ s/([\t ])/\\$1/go;
+ $result .= $leading . '\\';
+ }
+ if (($text =~ s/^(\s)//o) or ($text =~ s/^(.)//o))
+ {
+ $result .= $1;
+ }
+ }
+ else
+ {
+ $text =~ s/([\t ])/\\$1/go;
+ $result .= $text;
+ $text = '';
+ }
+ }
+ return $result;
+}
+
+# formatting functions
+
+$anchor = \&t2h_roff_anchor;
+$def_item = \&t2h_roff_def_item;
+$def = \&t2h_roff_def;
+$menu = \&t2h_roff_menu;
+$menu_link = \&t2h_roff_menu_link;
+$menu_comment = \&t2h_roff_menu_comment;
+$menu_description = \&t2h_roff_menu_description;
+$simple_menu_link = \&t2h_roff_simple_menu_link;
+$table_item = \&t2h_roff_table_item;
+$table_line = \&t2h_roff_table_line;
+$row = \&t2h_roff_row;
+$cell = \&t2h_roff_cell;
+$list_item = \&t2h_roff_list_item;
+$comment = \&t2h_roff_comment;
+$def_line = \&t2h_roff_def_line;
+$raw = \&t2h_roff_raw;
+$heading = \&t2h_roff_heading;
+$paragraph = \&t2h_roff_paragraph;
+$preformatted = \&t2h_roff_preformatted;
+$foot_line_and_ref = \&t2h_roff_foot_line_and_ref;
+$foot_section = \&t2h_roff_foot_section;
+$image = \&t2h_roff_image;
+$index_entry_label = \&t2h_roff_index_entry_label;
+$index_summary = \&t2h_roff_index_summary;
+$print_index = \&t2h_roff_print_index;
+$protect_text = \&t2h_roff_protect_text;
+$cartouche = \&t2h_roff_cartouche;
+$sp = \&t2h_roff_sp;
+$normal_text = \&t2h_roff_normal_text;
+$empty_line = \&t2h_roff_empty_line;
+$unknown = \&t2h_roff_unknown;
+$float = \&t2h_roff_float;
+$listoffloats = \&t2h_roff_listoffloats;
+$listoffloats_entry = \&t2h_roff_listoffloats_entry;
+
+# This function is used to protect characters which are special in html
+# in inline text: &, ", <, and >.
+#
+# argument:
+# text to be protected
+sub t2h_roff_protect_text($)
+{
+ my $text = shift;
+ $text =~ s/\\/\\e/g;
+ $text =~ s/$;---$;/\\(em/g;
+ $text =~ s/$;--$;/-/g;
+ $text =~ s/$;-$;/\\-/g;
+ $text =~ s/^\./\\&./;
+ $text =~ s/([\s])\./$1\\&./g;
+ return $text;
+}
+
+sub t2h_roff_normal_text($)
+{
+ my $text = shift;
+ #$text =~ s/---/\\(em/g;
+ $text =~ s/(--?-?)/$;$1$;/go;
+ return $text;
+}
+
+sub t2h_roff_unknown($$)
+{
+ my $macro = shift;
+ my $line = shift;
+
+ if ($macro eq '*')
+ {
+ $line = '' if ($line =~ /^\s*$/);
+ return ($line, 1, "\n.br\n", undef);
+ }
+ return ($line, 0, undef, undef);
+}
+
+
+# This function produces an anchor
+#
+# arguments:
+# $name : anchor name
+# $href : anchor href
+# text : text displayed
+# extra_attribs : added to anchor attributes list
+sub t2h_roff_anchor($;$$$)
+{
+ my $name = shift;
+ my $href = shift;
+ my $text = shift;
+ my $attributes = shift;
+ $href = '' if (!defined($href) or ($href !~ /\S/));
+ $text = '' if (!defined($text));
+ return $text if ($text ne '');
+ return "[$href]" if ($href ne '');
+ return '';
+}
+
+# This function is used to format the text associated with a @deff/@end deff
+#
+# argument:
+# text
+sub t2h_roff_def_item($)
+{
+ my $text = shift;
+ if ($text =~ /\S/)
+ {
+ {
+ #return ".ba +5\n.(l L F\n" . $text . ".)l\n.ba -5\n";
+ return ".(l L F\n.ba +5\n" . $text . ".ba -5\n.)l\n";
+ }
+ }
+ return '';
+}
+
+# format the container for the @deffn line and text
+#
+# argument
+# text of the whole @def, line and associated text.
+sub t2h_roff_def($)
+{
+ my $text = shift;
+ return $text;
+}
+
+# a whole menu
+#
+# argument:
+# the whole menu text (entries and menu comments)
+#
+# argument:
+# whole menu text.
+sub t2h_roff_menu($)
+{
+ my $text = shift;
+ chomp $text;
+ return ".(l M\n\\&\\s8" . &$I('Menu:') . "\n" . $text . "\\&\\s0\n.)l\n";
+}
+
+# a simple menu entry ref in case we aren't in a standard menu context
+sub t2h_roff_simple_menu_link($$$$$)
+{
+ my $text = shift;
+ my $href = shift;
+ my $node = shift;
+ my $name = shift;
+ my $ending = shift;
+ $name .= ':' if ($name ne '');
+ return "$MENU_SYMBOL$name$node$ending";
+}
+
+# formats a menu entry link pointing to a node or section
+#
+# arguments:
+# the entry text
+# the state, a hash reference holding informations about the context, with a
+# usefull entry, 'preformatted', true if we are in a preformatted format
+# (a format keeping space between words). In that case a function
+# of the main program, main::do_preformatted($text, $state) might
+# be used to format the text with the current format style.
+# href is optionnal. It is the reference to the section or the node anchor
+# which should be used to make the link (typically it is the argument
+# of a href= attribute in a <a> element).
+sub t2h_roff_menu_link($$$$$$)
+{
+ my $text = shift;
+ my $state = shift;
+ my $href = shift;
+ my $node = shift;
+ my $name = shift;
+ my $ending = shift;
+ $name .= ':' if ($name ne '');
+ return "$MENU_SYMBOL$name$node$ending";
+}
+
+# formats a menu entry description, ie the text appearing after the node
+# specification in a menu entry an spanning until there is another
+# menu entry, an empty line or some text at the very beginning of the line
+# (we consider that text at the beginning of the line begins a menu comment)
+#
+# arguments:
+# the description text
+# the state. See menu_entry.
+sub t2h_roff_menu_description($$)
+{
+ my $text = shift;
+ my $state = shift;
+ return $text;
+}
+
+# a menu comment (between menu lines)
+# formats the container of a menu comment. A menu comment is any text
+# appearing between menu lines, either separated by an empty line from
+# the preceding menu entry, or a text beginning at the first character
+# of the line (text not at the very beginning of the line is considered to
+# be the continuation of a menu entry description text).
+#
+# The text itself is considered to be in a preformatted environment
+# with name 'menu-commment' and with style $MENU_PRE_STYLE.
+#
+# argument
+# text contained in the menu comment.
+sub t2h_roff_menu_comment($)
+{
+ my $text = shift;
+ return $text;
+}
+
+# text after @item in table, vtable and ftable
+sub t2h_roff_table_item($$$$$)
+{
+ my $text = shift;
+ my $index_label = shift;
+ my $format = shift;
+ my $command = shift;
+ my $formatted_command = shift;
+ $formatted_command = '' if (!defined($formatted_command) or
+ exists($special_list_commands{$format}->{$command}));
+ $text = '.ip ' . $formatted_command . protect_spaces($text) . "\n";
+ $text .= $index_label if (defined($index_label));
+ return $text;
+}
+
+# format text on the line following @item (in table, vtable and ftable)
+sub t2h_roff_table_line($)
+{
+ my $text = shift;
+ return $text;
+}
+
+# row in multitable
+sub t2h_roff_row($)
+{
+ my $text = shift;
+
+ if ($text =~ /\S/)
+ {
+ return $text ."\n" ;
+ }
+ return '';
+}
+
+# cell in multitable
+sub t2h_roff_cell($)
+{
+ my $text = shift;
+ chomp $text;
+ return protect_spaces($text) . "\\\t";
+}
+
+# format an item in a list
+#
+# argument:
+# text of the item
+sub t2h_roff_list_item($$$$$$$)
+{
+ my $text = shift;
+ my $format = shift;
+ my $command = shift;
+ my $formatted_command = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+ $formatted_command = '' if (!defined($formatted_command) or
+ exists($special_list_commands{$format}->{$command}));
+ if ($text =~ /\S/)
+ {
+ #return $formatted_command . $text;
+ return $text . "\n";
+ }
+ return '';
+}
+
+# an comment
+sub t2h_roff_comment($)
+{
+ my $text = shift;
+ my $result = '';
+ while ($text)
+ {
+ $text =~ s/$;---$;/--/g;
+ $text =~ s/$;--$;/-/g;
+ $text =~ s/$;-$;/-/g;
+ $text =~ s/^(.*)//;
+ $result .= ".\\\"$1";
+ $result .= "\n" if ($text =~ s/^\n//);
+ }
+ return $result;
+}
+
+# a paragraph
+sub t2h_roff_paragraph($$$$$$$$$)
+{
+ my $text = shift;
+ my $align = shift;
+ my $paragraph_command = shift;
+ my $paragraph_command_formatted = shift;
+ my $paragraph_number = shift;
+ my $format = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+ return '' if ($text =~ /^\s*$/);
+ if (defined($paragraph_number) and defined($$paragraph_number))
+ {
+ $$paragraph_number++;
+ $paragraph_command_formatted = undef if ($$paragraph_number > 1);
+ }
+ $paragraph_command_formatted = '' if (!defined($paragraph_command_formatted) or
+ exists($special_list_commands{$format}->{$paragraph_command}));
+ #return $text if (defined($format) and $format eq 'multitable');
+ return $text if (defined($format) and (($format eq 'multitable') or ($format eq 'quotation')));
+ my $open = ".pp\n";
+ if (defined($format) and (($format eq 'itemize') or ($format eq 'enumerate')) and
+ defined($paragraph_number) and defined($$paragraph_number) and ($$paragraph_number == 1))
+ {
+ $open = ".lp\n";
+ }
+ my $close = '';
+ if ($align)
+ {
+ if ($align eq 'flushleft')
+ {
+ $open .= ".ad l\n";
+ $close .= ".ad b\n";
+ }
+ elsif ($align eq 'flushright')
+ {
+ $open .= ".ad r\n";
+ $close .= ".ad b\n";
+ }
+ elsif ($align eq 'center')
+ {
+ $open .= ".ce\n";
+ }
+ }
+ if (defined($format) and ($format eq 'enumerate') and
+ defined($paragraph_number) and defined($$paragraph_number) and ($$paragraph_number == 1) and defined($number) and ($number ne ''))
+ {
+ $open .= "$number.";
+ }
+ chomp ($text);
+ return $open. $paragraph_command_formatted . $text . "\n" . $close;
+}
+
+# a preformatted region
+sub t2h_roff_preformatted($$$$$$$$$$)
+{
+ my $text = shift;
+ my $pre_style = shift;
+ my $class = shift;
+ my $leading_command = shift;
+ my $leading_command_formatted = shift;
+ my $preformatted_number = shift;
+ my $format = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+ $leading_command_formatted = '' if (!defined($leading_command_formatted) or
+ exists($special_list_commands{$format}->{$leading_command}));
+
+ if (defined($format) and $format eq 'multitable')
+ {
+ my $chomped = chomp($text);
+ my $result = '\&\fR\f(CW' . $text . '\&\fR';
+ $result .= "\n" if ($chomped);
+ return $result;
+ }
+ return '' if ($text eq '');
+ if (defined($preformatted_number) and defined($$preformatted_number))
+ {
+ $$preformatted_number++;
+ $leading_command_formatted = undef if ($$preformatted_number > 1);
+ }
+ $leading_command_formatted = '' if (!defined($leading_command_formatted));
+ chomp $text;
+ my $open = '';
+ if (defined($format) and ($format eq 'enumerate') and
+ defined($paragraph_number) and defined($$paragraph_number) and ($$paragraph_number == 1) and defined($number) and ($number ne ''))
+ {
+ $open = "$number. ";
+ }
+ return $complex_format_map->{$class}->{'begin_region'} . $leading_command_formatted . $open . $text . $complex_format_map->{$class}->{'end_region'};
+}
+
+# This function formats a heading for an element
+#
+# argument:
+# an element. It is a hash reference for a node or a sectionning command.
+# The interesting keys are:
+# 'text': the heading text
+# 'name': the heading text without section number
+# 'node': true if it is a node
+# 'level': level of the element. 0 for @top, 1 for chapter, heading,
+# appendix..., 2 for section and so on...
+# 'tag_level': the sectionning element name, raisesections and lowersections
+# taken into account
+#
+# relevant configuration variable:
+# $NUMBER_SECTIONS
+sub t2h_roff_heading($)
+{
+ my $element = shift;
+ my $name = $element->{'text'};
+ if (!$element->{'node'})
+ {
+ $name = $element->{'name'};
+ }
+ return '' if ($element->{'name'} !~ /\S/);
+ my $class = $element->{'tag_level'};
+ $class = 'unnumbered' if ($class eq 'top');
+ $level = $element->{'level'};
+ $level = 3 if (!defined($level));
+ $level = 1 if ($level == 0);
+ my $heading = '';
+ $heading = ".bp\n" if ($level == 1);
+ $heading .= '.if !\n(_- \{\\' . "\n.nr _- 1\n.nr \$1 0 1\n" . '.af $1 A\}' . "\n"
+ if ($class =~ /^appendix/);
+ $name = protect_spaces($name);
+ my $toc_entry = '\&';
+ if ($class =~ /^unnumbered/ or ($class eq 'node'))
+ {
+ $heading .= ".uh $name\n";
+ $toc_entry .= ' ';
+ }
+ elsif (($class =~ /section$/) or ($class eq 'chapter') or ($class =~ /^appendix/))
+ {
+ $heading .= ".sh $level $name\n";
+ my $number = 1;
+ while ($number < $level)
+ {
+ $toc_entry .= "\\n(\$$number.";
+ $number++;
+ }
+ $toc_entry .= "\\n(\$$number ";
+ }
+ $toc_entry .= $name;
+ return $heading . "\n" if ($class eq 'node');
+ return $heading . ".(x\n" . $toc_entry . "\n.)x\n\\&\\fR\n";
+}
+
+sub T2H_ROFF_toc_body($$$)
+{
+ my $elements_list = shift;
+ my $do_contents = shift;
+ my $do_scontents = shift;
+ if ($do_contents or $do_scontents)
+ {
+ my $lines = ".pp\n.nr % 0 1\n.af % i\n.bp \\n%+1\n.ce\n\\&\\fB" . &$I('Table of Contents') . "\\fR\n.sp 2\n.xp\n";
+ if (!$do_contents)
+ {
+ push @{$Texi2HTML::OVERVIEW}, $lines;
+ }
+ else
+ {
+ push @{$Texi2HTML::TOC_LINES}, $lines;
+ }
+ }
+}
+
+# formatting of raw regions
+# ih L2H is true another mechanism is used for tex
+sub t2h_roff_raw($$)
+{
+ my $style = shift;
+ my $text = shift;
+ if ($style eq 'verbatim' or $style eq 'tex' or $style eq 'html')
+ {
+ chomp ($text);
+ return ".(l M\n\\fR\\&\\f(CW" . &$protect_text($text) . "\\fR\n.)l\n" ;
+ }
+ else
+ {
+ warn "$WARN (bug) unknown style $style\n";
+ return &$protect_text($text);
+ }
+}
+
+# This function formats a footnote reference and the footnote text associated
+# with a given footnote.
+# The footnote reference is the text appearing in the main document pointing
+# to the footnote text.
+#
+# arguments:
+# absolute number of the footnote (in the document)
+# relative number of the footnote (in the page)
+# identifier for the footnote
+# identifier for the footnote reference in the main document
+# main document file
+# footnote text file
+# array with the footnote text lines
+# the state. See menu entry.
+#
+# returns:
+# reference on an array containing the footnote text lines which should
+# have been updated
+# the text for the reference pointing on the footnote text
+sub t2h_roff_foot_line_and_ref($$$$$$$)
+{
+ my $number_in_doc = shift;
+ my $number_in_page = shift;
+ my $footnote_id = shift;
+ my $place_id = shift;
+ my $document_file = shift;
+ my $footnote_file = shift;
+ my $lines = shift;
+ my $state = shift;
+
+ my $text = '';
+ my $line;
+ while (@$lines)
+ {
+ $line = shift @$lines;
+ $text .= $line;
+ }
+ chomp $text;
+ return ([], "\n.(f\n" . $text . "\n.)f\n" );
+}
+
+# formats a group of footnotes.
+#
+# argument:
+# array reference on the footnotes texts lines
+#
+# returns an array reference on the group of footnotes lines
+sub t2h_roff_foot_section($)
+{
+ my $lines = shift;
+ @$lines = ();
+}
+
+# format an image
+#
+# arguments:
+# image file name
+# image basename
+# a boolean true if we are in a preformatted format
+sub t2h_roff_image($$$$)
+{
+ my $file = shift;
+ my $base = shift;
+ my $preformatted = shift;
+ my $file_name = shift;
+ return "[$base src=$file_name]" if ($base ne $file_name);
+ return "[$base]";
+}
+
+# format a target in the main document for an index entry.
+#
+# arguments:
+# target identifier
+# boolean true if in preformatted format
+sub t2h_roff_index_entry_label($$$$)
+{
+ my $identifier = shift;
+ my $preformatted = shift;
+ my $label = shift;
+ my $index_name = shift;
+ return ".(x $index_name\n" . protect_spaces($label) . "\n.)x\n";
+}
+
+# process definition commands line @deffn for example
+sub t2h_roff_def_line($$$$$)
+{
+ my $category = shift;
+ my $name = shift;
+ my $type = shift;
+ my $arguments = shift;
+ my $index_label = shift;
+ $index_label = '' if (!defined($index_label));
+ $name = '' if (!defined($name) or ($name =~ /^\s*$/));
+ $type = '' if (!defined($type) or $type =~ /^\s*$/);
+ if (!defined($arguments) or $arguments =~ /^\s*$/)
+ {
+ $arguments = '';
+ }
+ else
+ {
+ $arguments = '\fI' . protect_spaces($arguments) . '\fR';
+ }
+ my $type_name = ' ';
+ $type_name = " $type" if ($type ne '');
+
+ $type_name .= '\fB' . protect_spaces($name) . '\fR' if ($name ne '');
+ $type_name .= $arguments . "\n";
+ return '\fI' . protect_spaces($category) . ':\fR' . $type_name . $index_label;
+}
+
+# a cartouche
+sub t2h_roff_cartouche($$)
+{
+ my $text = shift;
+ return $text;
+}
+
+sub t2h_roff_sp($$)
+{
+ my $number = shift;
+ my $preformatted = shift;
+ return "\n.sp $number\n";
+}
+
+# format a whole index
+#
+# argument:
+# index text
+# index name
+sub t2h_roff_print_index($$)
+{
+ my $text = shift;
+ my $name = shift;
+ return ".xp $name\n";
+}
+
+# format an index summary. This is a list of letters linking to the letter
+# entries.
+#
+# arguments:
+# array reference containing the formatted alphabetical letters
+# array reference containing the formatted non lphabetical letters
+sub t2h_roff_index_summary($$)
+{
+ my $alpha = shift;
+ my $nonalpha = shift;
+ my $join = '';
+ my $nonalpha_text = '';
+ my $alpha_text = '';
+ return '';
+}
+
+# FIXME the following construct leads to something wrong ?
+# something @c a comment
+#
+# other thing
+sub t2h_roff_empty_line($)
+{
+ my $text = shift;
+ return '';
+}
+
+sub t2h_roff_listoffloats_entry($$$$)
+{
+ my $style_texi = shift;
+ my $float = shift;
+ my $float_style = shift;
+ my $caption = shift;
+ my $href = shift;
+ chomp ($caption);
+
+ return '.ip ' . protect_spaces($float_style) . "\n" . $caption . "\n";
+}
+
+sub t2h_roff_listoffloats($$$)
+{
+ my $style_texi = shift;
+ my $style = shift;
+ my $float_entries = shift;
+
+ my $result = ".(l L F\n.ba +5\n";
+ foreach my $float_entry (@$float_entries)
+ {
+ $result .= $float_entry;
+ }
+ return $result . ".ba -5\n.)l\n";
+}
+
+sub t2h_roff_float($$$$$)
+{
+ my $text = shift;
+ my $float = shift;
+ my $caption = shift;
+ my $shortcaption = shift;
+
+ my $caption_text = '';
+
+ if (defined($float->{'caption_texi'}))
+ {
+ $caption_text = $caption;
+ }
+ elsif (defined($float->{'shortcaption_texi'}))
+ {
+ $caption_text = $shortcaption;
+ }
+ elsif (defined($caption))
+ {
+ $caption_text = $caption;
+ }
+ chomp ($caption_text);
+ return ".(b L F\n" . $text . $caption_text . "\n.b)\n";
+}
+
+1;
diff --git a/Build/source/utils/texi2html/examples/utf8.init b/Build/source/utils/texi2html/examples/utf8.init
new file mode 100644
index 00000000000..2d231e30a8f
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/utf8.init
@@ -0,0 +1,27 @@
+# -*-perl-*-
+$USE_ISO = 0;
+$ENCODING = 'utf-8';
+
+# if the encoding isn't utf-8, we should convert to utf-8 characters.
+
+use Encode;
+use Unicode::Normalize;
+
+foreach my $key (keys(%unicode_accents))
+{
+ $style_map{$key}->{'function'} = \&t2h_utf8_accent;
+ $style_map_texi{$key}->{'function'} = \&t2h_utf8_accent;
+}
+
+foreach my $key (%things_map)
+{
+ if (exists($unicode_map{$key}) and ($unicode_map{$key} ne ''))
+ {
+ $things_map{$key} = chr(hex($unicode_map{$key}));
+ $texi_map{$key} = chr(hex($unicode_map{$key}));
+ }
+}
+
+$normal_text = \&t2h_utf8_normal_text;
+
+1;
diff --git a/Build/source/utils/texi2html/examples/xhtml.init b/Build/source/utils/texi2html/examples/xhtml.init
new file mode 100644
index 00000000000..3343a95c935
--- /dev/null
+++ b/Build/source/utils/texi2html/examples/xhtml.init
@@ -0,0 +1,188 @@
+# -*-perl-*-
+
+# APA: Add SystemLiteral to identify the canonical DTD.
+# [Definition:] The SystemLiteral is called the entity's system
+# identifier. It is a URI, which may be used to retrieve the entity.
+# See http://www.xml.com/axml/target.html#NT-ExternalID
+$DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/xhtml1-transitional.dtd">';
+
+$FRAMESET_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/xhtml1-frameset.dtd">';
+
+# -iso
+# if set, ISO8859 characters are used for special symbols (like copyright, etc)
+$USE_ISO = 1;
+
+# horizontal rules
+$SMALL_RULE = '<hr size="1"/>';
+$DEFAULT_RULE = '<hr/>';
+$MIDDLE_RULE = '<hr size="2"/>';
+$BIG_RULE = '<hr size="6"/>';
+
+# this is added inside <head></head> after <title> and some <meta name>
+# stuff, it can be used for eg. <style>, <script>, <meta> etc. tags.
+$EXTRA_HEAD = '';
+
+$print_page_head = \&T2H_XHTML_print_page_head;
+$print_page_foot = \&T2H_XHTML_print_page_foot;
+$print_frame = \&T2H_XHTML_print_frame;
+$button_icon_img = \&T2H_XHTML_button_icon_img;
+
+#FIXME update once it is more stabilized in texi2html.init
+sub T2H_XHTML_print_page_head
+{
+ my $fh = shift;
+ my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}";
+ $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $T2H_NO_TEXI{'This'};
+ print $fh <<EOT;
+<?xml version="1.0" encoding="iso-8859-1"?>
+$T2H_DOCTYPE
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$T2H_LANG" lang="$T2H_LANG">
+$T2H_THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
+<!--
+$Texi2HTML::THISDOC{program_authors}
+-->
+<head>
+<title>$longtitle</title>
+
+<meta name="description" content="$longtitle"/>
+<meta name="keywords" content="$longtitle"/>
+<meta name="resource-type" content="document"/>
+<meta name="distribution" content="global"/>
+<meta name="Generator" content="$T2H_THISDOC{program}"/>
+$EXTRA_HEAD
+</head>
+
+<body $T2H_BODYTEXT>
+$AFTER_BODY_OPEN
+EOT
+}
+
+# <span> instead of <font>
+sub T2H_XHTML_print_page_foot
+{
+ my $fh = shift;
+ print $fh <<EOT;
+<p>
+ <span style="font-size: smaller">
+ This document was generated $ADDRESS
+ using <a href="$T2H_THISDOC{program_homepage}"><i>$Texi2HTML::THISDOC{program}</i></a>.
+ </span>
+ <br/>
+$PRE_BODY_CLOSE
+</p>
+</body>
+</html>
+EOT
+}
+
+sub T2H_XHTML_print_frame
+{
+ my $fh = shift;
+ my $toc_file = shift;
+ my $main_file = shift;
+ print $fh <<EOT;
+$FRAMESET_DOCTYPE
+<html>
+<head><title>$Texi2HTML::THISDOC{title}</title></head>
+<frameset cols="140,*">
+ <frame name="toc" src="$toc_file"/>
+ <frame name="main" src="$main_file"/>
+</frameset>
+</html>
+EOT
+}
+
+# / in <img>
+sub T2H_XHTML_button_icon_img
+{
+ my $button = shift;
+ my $icon = shift;
+ my $name = shift;
+ return '' if (!defined($icon));
+ if (defined($name) && $name)
+ {
+ $name = ": $name";
+ }
+ else
+ {
+ $name = '';
+ }
+ $button = "" if (!defined ($button));
+ return qq{<img src="$icon" border="0" alt="$button$name" align="middle"/>};
+}
+
+$simple_map{'*'} = '<br/>';
+
+# formatting functions
+
+$def_line = \&t2h_xhtml_def_line;
+$index_summary = \&t2h_xhtml_index_summary;
+$image = \&t2h_xhtml_image;
+
+# need / in <img>
+sub t2h_xhtml_image($$$)
+{
+ my $file = shift;
+ my $base = shift;
+ my $preformatted = shift;
+ return "[ $base ]" if ($preformatted);
+ return "<img src=\"$file\" alt=\"$base\"/>";
+}
+
+# process definition commands line @deffn for example
+# <u> replaced by <span>
+sub t2h_xhtml_def_line($$$$$)
+{
+ my $category = shift;
+ my $name = shift;
+ my $type = shift;
+ my $arguments = shift;
+ my $index_label = shift;
+ $index_label = '' if (!defined($index_label));
+ $name = '' if (!defined($name) or ($name =~ /^\s*$/));
+ $type = '' if (!defined($type) or $type =~ /^\s*$/);
+ if (!defined($arguments) or $arguments =~ /^\s*$/)
+ {
+ $arguments = '';
+ }
+ else
+ {
+ $arguments = '<i>' . $arguments . '</i>';
+ }
+ my $type_name = '';
+ $type_name = " $type" if ($type ne '');
+ $type_name .= ' <b>' . $name . '</b>' if ($name ne '');
+ $type_name .= $arguments . "\n";
+ if (! $DEF_TABLE)
+ {
+ return '<dt>'. '<span style="text-decoration: underline">' . $category . ':</span>' . $type_name . $index_label . "</dt>\n";
+ }
+ else
+ {
+
+ return "<tr>\n<td align=\"left\">" . $type_name .
+ "</td>\n<td align=\"right\">" . $category . $index_label . "</td>\n" . "</tr>\n";
+ }
+}
+
+# There is a br which needs /
+sub t2h_xhtml_index_summary($$)
+{
+ my $alpha = shift;
+ my $nonalpha = shift;
+ my $join = '';
+ my $nonalpha_text = '';
+ my $alpha_text = '';
+ $join = " &nbsp; \n<br/>\n" if (@$nonalpha and @$alpha);
+ if (@$nonalpha)
+ {
+ $nonalpha_text = join("\n &nbsp; \n", @$nonalpha) . "\n";
+ }
+ if (@$alpha)
+ {
+ $alpha_text = join("\n &nbsp; \n", @$alpha) . "\n &nbsp; \n";
+ }
+ #I18n
+ return "<table><tr><th valign=\"top\">Jump to: &nbsp; </th><td>" .
+ $nonalpha_text . $join . $alpha_text . '</td></tr></table>';
+}
diff --git a/Build/source/utils/texi2html/i18n/de b/Build/source/utils/texi2html/i18n/de
new file mode 100644
index 00000000000..fae7f1b8af8
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/de
@@ -0,0 +1,114 @@
+$LANGUAGES->{'de'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '@"Uber dieses Dokument',
+ 'April' => 'April',
+ 'August' => 'August',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'Dezember',
+ 'February' => 'Februar',
+ 'Footnotes' => 'Fu@ss{}noten',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Index',
+ 'Index Entry' => '',
+ 'January' => 'Januar',
+ 'July' => 'Juli',
+ 'Jump to' => '',
+ 'June' => 'Juni',
+ 'March' => 'M@"arz',
+ 'May' => 'Mai',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'November',
+ 'October' => 'Oktober',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'September',
+ 'Short Table of Contents' => 'Kurzes Inhaltsverzeichniss',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Inhaltsverzeichniss',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'de'} = {
+ 'See' => 'Siehe',
+ 'section' => 'Abschnitt',
+ 'see' => 'siehe'
+ };
+
+
diff --git a/Build/source/utils/texi2html/i18n/en b/Build/source/utils/texi2html/i18n/en
new file mode 100644
index 00000000000..4f4939fdade
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/en
@@ -0,0 +1,110 @@
+$LANGUAGES->{'en'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '',
+ 'April' => '',
+ 'August' => '',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => '',
+ 'February' => '',
+ 'Footnotes' => '',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => '',
+ 'Index Entry' => '',
+ 'January' => '',
+ 'July' => '',
+ 'Jump to' => '',
+ 'June' => '',
+ 'March' => '',
+ 'May' => '',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => '',
+ 'October' => '',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => '',
+ 'Short Table of Contents' => '',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '%s, %d %d',
+ 'Table of Contents' => '',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'en'} = {};
+
+
diff --git a/Build/source/utils/texi2html/i18n/es b/Build/source/utils/texi2html/i18n/es
new file mode 100644
index 00000000000..88d75f42777
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/es
@@ -0,0 +1,114 @@
+$LANGUAGES->{'es'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '',
+ 'April' => 'abril',
+ 'August' => 'agosto',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'diciembre',
+ 'February' => 'febrero',
+ 'Footnotes' => '',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Index',
+ 'Index Entry' => '',
+ 'January' => 'enero',
+ 'July' => 'julio',
+ 'Jump to' => '',
+ 'June' => 'junio',
+ 'March' => 'marzo',
+ 'May' => 'mayo',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'noviembre',
+ 'October' => 'octubre',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'septiembre',
+ 'Short Table of Contents' => 'Resumen del Contenido',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => '@\'{@dotless{I}}ndice General',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'es'} = {
+ 'See' => 'V@\'ease',
+ 'section' => 'secci@\'on',
+ 'see' => 'v@\'ase'
+ };
+
+
diff --git a/Build/source/utils/texi2html/i18n/fr b/Build/source/utils/texi2html/i18n/fr
new file mode 100644
index 00000000000..8ab8a3164b2
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/fr
@@ -0,0 +1,139 @@
+$LANGUAGES->{'fr'} = {
+ ' The buttons in the navigation panels have the following meaning:' => ' Les boutons de navigation ont la signification suivante :',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' Dans cet exemple on est @`a @strong{ Sous section un-deux-trois } dans un document dont la structure est :',
+ ' Up ' => 'Plus haut',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => 'le %{day} %{month} %{year}',
+ '%{name} of %{class}' => '%{name} de %{class}',
+ '%{name} on %{class}' => '%{name} de %{class}',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '%{node_file_href} section `%{section}\' dans @cite{%{book}}',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => 'A propos de ce document',
+ 'April' => 'Avril',
+ 'August' => 'Ao@^ut',
+ 'Button' => 'Bouton',
+ 'Contents' => 'Table des mati@`eres',
+ 'Current Position' => 'Position',
+ 'December' => 'D@\'ecembre',
+ 'February' => 'F@\'evrier',
+ 'Footnotes' => 'Notes de bas de page',
+ 'From 1.2.3 go to' => 'Depuis 1.2.3 aller @`a',
+ 'Go to' => 'Aller @`a',
+ 'Index' => 'Index',
+ 'Index Entry' => 'Entr@\'ee d\'index',
+ 'January' => 'Janvier',
+ 'July' => 'Juillet',
+ 'Jump to' => 'Aller @`a',
+ 'June' => 'Juin',
+ 'March' => 'Mars',
+ 'May' => 'Mai',
+ 'Menu:' => 'Menu@ :',
+ 'Name' => 'Nom',
+ 'Next' => 'Suivant',
+ 'November' => 'Novembre',
+ 'October' => 'Octobre',
+ 'Overview' => 'Vue d\'ensemble',
+ 'Overview:' => 'Vue d\'ensemble@ :',
+ 'Prev' => 'Pr@\'ec@\'edent',
+ 'Section' => '',
+ 'Section One' => 'Section un',
+ 'See %{node_file_href}' => 'Voir %{node_file_href}',
+ 'See %{node_file_href} @cite{%{book}}' => 'Voir %{node_file_href} @cite{%{book}}',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => 'Voir %{node_file_href} section `%{section}\' dans @cite{%{book}}',
+ 'See %{reference_name}' => 'Voir %{reference_name}',
+ 'See @cite{%{book}}' => 'Voir @cite{%{book}}',
+ 'See section %{reference_name}' => 'Voir la section %{reference_name}',
+ 'See section `%{section}\' in @cite{%{book}}' => 'Voir la section `%{section}\' dans @cite{%{book}}',
+ 'September' => 'Septembre',
+ 'Short Table of Contents' => 'R@\'esum@\'e du contenu',
+ 'Subsection One-Four' => 'Sous section un-quatre',
+ 'Subsection One-One' => 'Sous section un-un',
+ 'Subsection One-Three' => 'Sous section un-trois',
+ 'Subsection One-Two' => 'Sous section un-deux',
+ 'Subsubsection One-Two-Four' => 'Sous sous section un-deux-quatre',
+ 'Subsubsection One-Two-One' => 'Sous sous section un-deux-un',
+ 'Subsubsection One-Two-Three' => 'Sous sous section un-deux-trois',
+ 'Subsubsection One-Two-Two' => 'Sous sous section un-deux-deux',
+ 'T2H_today' => 'le %2$d %1$s %3$d',
+ 'Table of Contents' => 'Table des mati@`eres',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} @emph{%{date}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'Top' => '',
+ 'Untitled Document' => 'Document sans titre',
+ 'about (help)' => '@`a propos (page d\'aide)',
+ 'beginning of this chapter or previous chapter' => 'd@\'ebut de ce chapitre ou chapitre pr@\'ec@\'edent',
+ 'by @emph{%{user}}' => 'par @emph{%{user}}',
+ 'by @emph{%{user}} on @emph{%{date}}' => 'par @emph{%{user}} @emph{%{date}}',
+ 'cover (top) of document' => 'couverture (top) du document',
+ 'current' => 'courante',
+ 'current section' => 'section actuelle',
+ 'first section in reading order' => 'premi@`e section dans l\'ordre de lecture',
+ 'following node' => 'node suivant',
+ 'index' => 'index',
+ 'last section in reading order' => 'derni@`ere section dans l\'ordre de lecture',
+ 'next chapter' => 'chapitre suivant',
+ 'next node' => 'node suivant',
+ 'next section in reading order' => 'section suivante dans l\'ordre de lecture',
+ 'next section on same level' => 'section suivante au m@^eme niveau',
+ 'node following in node reading order' => 'node suivant dans l\'ordre des nodes',
+ 'node up' => 'node au dessus',
+ 'on @emph{%{date}}' => '@emph{%{date}}',
+ 'previous node' => 'node pr@\'ec@\'edent',
+ 'previous section in reading order' => 'section pr@\'ec@\'edente dans l\'ordre de lecture',
+ 'previous section on same level' => 'section pr@\'ec@\'edente au m@^eme niveau',
+ 'section `%{section}\' in @cite{%{book}}' => 'section `%{section}\' dans @cite{%{book}}',
+ 'see %{node_file_href}' => 'voir %{node_file_href}',
+ 'see %{node_file_href} @cite{%{book}}' => 'voir %{node_file_href} @cite{%{book}}',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => 'voir %{node_file_href} section `%{section}\' dans @cite{%{book}}',
+ 'see %{reference_name}' => 'voir %{reference_name}',
+ 'see @cite{%{book}}' => 'voir @cite{%{book}}',
+ 'see section %{reference_name}' => 'voir la section %{reference_name}',
+ 'see section `%{section}\' in @cite{%{book}}' => 'voir la section `%{section}\' dans @cite{{book}}',
+ 'short table of contents' => 'table des mati@`eres r@\'esum@\'ee',
+ 'table of contents' => 'table des mati@`eres',
+ 'unknown' => 'inconnu',
+ 'up node' => 'node au dessus',
+ 'up section' => 'section sup@\'erieure'
+ };
+
+$T2H_OBSOLETE_STRINGS->{'fr'} = {
+ ' This document was generated %{who_and_when_generated} using %{program_homepage_href}.' => ' Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; %{who_and_when_generated} en utilisant %{program_homepage_href}.',
+ ' where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:' => ' Dans cet exemple on est &agrave; <strong> Sous section un-deux-trois </strong> dans un document dont la structure est :',
+ '%{node_file_href} section `%{section}\' in <cite>%{book}</cite>' => '%{node_file_href} section `%{section}\' dans <cite>%{book}</cite>',
+ 'See' => 'Voir',
+ 'See %{node_file_href} <cite>%{book}</cite>' => 'Voir %{node_file_href} <cite>%{book}</cite>',
+ 'See %{node_file_href} section `%{section}\' in <cite>%{book}</cite>' => 'Voir %{node_file_href} section `%{section}\' dans <cite>%{book}</cite>',
+ 'See <cite>%{book}</cite>' => 'Voir <cite>%{book}</cite>',
+ 'See section `%{section}\' in <cite>%{book}</cite>' => 'Voir la section `%{section}\' dans <cite>%{book}</cite>',
+ 'This document was generated by <i>%{user}</i> on <i>%{date}</i> using %{program_homepage_href}.' => 'Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; par <i>%{user}</i> <i>%{date}</i> en utilisant %{program_homepage_href}.',
+ 'This document was generated by <i>%{user}</i> using %{program_homepage_href}.' => 'Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; par <i>%{user}</i> en utilisant %{program_homepage_href}.',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} @emph{%{date}} en utilisant %{program_homepage_href}.',
+ 'This document was generated by @emph{%{user}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} en utilisant %{program_homepage_href}.',
+ 'This document was generated on <i>%{date}</i> using %{program_homepage_href}.' => 'Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; <i>%{date}</i> en utilisant %{program_homepage_href}.',
+ 'This document was generated on @emph{%{date}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e @emph{%{date}} en utilisant %{program_homepage_href}.',
+ 'This document was generated on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e @emph{%{date}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'This document was generated using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e en utilisant %{program_homepage_href}.',
+ 'about (this page)' => 'a propos (cette page)',
+ 'by <i>%{user}</i>' => 'par <i>%{user}</i>',
+ 'by <i>%{user}</i> on <i>%{date}</i>' => 'par <i>%{user}</i> <i>%{date}</i>',
+ 'concept index' => 'index',
+ 'on <i>%{date}</i>' => '<i>%{date}</i>',
+ 'section' => 'section',
+ 'section `%{section}\' in <cite>%{book}</cite>' => 'section `%{section}\' dans <cite>%{book}</cite>',
+ 'see' => 'voir',
+ 'see %{node_file_href} <cite>%{book}</cite>' => 'voir %{node_file_href} <cite>%{book}</cite>',
+ 'see %{node_file_href} section `%{section}\' in <cite>%{book}</cite>' => 'voir %{node_file_href} section `%{section}\' dans <cite>%{book}</cite>',
+ 'see <cite>%{book}</cite>' => 'voir <cite>%{book}</cite>',
+ 'see section `%{section}\' in <cite>%{book}</cite>' => 'voir la section `%{section}\' dans <cite>%{book}</cite>'
+ };
+
+
diff --git a/Build/source/utils/texi2html/i18n/nl b/Build/source/utils/texi2html/i18n/nl
new file mode 100644
index 00000000000..b9e9d7b30a1
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/nl
@@ -0,0 +1,114 @@
+$LANGUAGES->{'nl'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => 'No translation available!',
+ 'April' => 'April',
+ 'August' => 'Augustus',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'December',
+ 'February' => 'Februari',
+ 'Footnotes' => 'No translation available!',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Index',
+ 'Index Entry' => '',
+ 'January' => 'Januari',
+ 'July' => 'Juli',
+ 'Jump to' => '',
+ 'June' => 'Juni',
+ 'March' => 'Maart',
+ 'May' => 'Mei',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'November',
+ 'October' => 'Oktober',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'September',
+ 'Short Table of Contents' => 'Korte inhoudsopgave',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Inhoudsopgave',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'nl'} = {
+ 'See' => 'Zie',
+ 'section' => 'sectie',
+ 'see' => 'zie'
+ };
+
+
diff --git a/Build/source/utils/texi2html/i18n/no b/Build/source/utils/texi2html/i18n/no
new file mode 100644
index 00000000000..62b6632d6ed
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/no
@@ -0,0 +1,114 @@
+$LANGUAGES->{'no'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => 'No translation available!',
+ 'April' => 'april',
+ 'August' => 'august',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'desember',
+ 'February' => 'februar',
+ 'Footnotes' => 'No translation available!',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Indeks',
+ 'Index Entry' => '',
+ 'January' => 'januar',
+ 'July' => 'juli',
+ 'Jump to' => '',
+ 'June' => 'juni',
+ 'March' => 'mars',
+ 'May' => 'mai',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'november',
+ 'October' => 'oktober',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'september',
+ 'Short Table of Contents' => 'Kort innholdsfortegnelse',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Innholdsfortegnelse',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'no'} = {
+ 'See' => 'Se',
+ 'section' => 'avsnitt',
+ 'see' => 'se'
+ };
+
+
diff --git a/Build/source/utils/texi2html/i18n/pt b/Build/source/utils/texi2html/i18n/pt
new file mode 100644
index 00000000000..79cb65afda7
--- /dev/null
+++ b/Build/source/utils/texi2html/i18n/pt
@@ -0,0 +1,114 @@
+$LANGUAGES->{'pt'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '',
+ 'April' => 'Abril',
+ 'August' => 'Agosto',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'Dezembro',
+ 'February' => 'Fevereiro',
+ 'Footnotes' => '',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => '@\'Indice',
+ 'Index Entry' => '',
+ 'January' => 'Janeiro',
+ 'July' => 'Julho',
+ 'Jump to' => '',
+ 'June' => 'Junho',
+ 'March' => 'Mar@,{c}o',
+ 'May' => 'Maio',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'Novembro',
+ 'October' => 'Outubro',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'Setembro',
+ 'Short Table of Contents' => 'Breve Sum@\'ario',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Sum@\'ario',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'pt'} = {
+ 'See' => 'Veja',
+ 'section' => 'Se@,{c}@~ao',
+ 'see' => 'veja'
+ };
+
+
diff --git a/Build/source/utils/texi2html/images/COPYING b/Build/source/utils/texi2html/images/COPYING
new file mode 100644
index 00000000000..dd6b4c19032
--- /dev/null
+++ b/Build/source/utils/texi2html/images/COPYING
@@ -0,0 +1,6 @@
+Copyright (C) 2003 Free Software Foundation, Inc.
+These images are licensed under the Creative Commons Attribution-ShareAlike
+License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-sa/1.0/
+or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford,
+California 94305, USA.
diff --git a/Build/source/utils/texi2html/images/Mybg.gif b/Build/source/utils/texi2html/images/Mybg.gif
new file mode 100644
index 00000000000..2d95e205845
--- /dev/null
+++ b/Build/source/utils/texi2html/images/Mybg.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_begin.gif b/Build/source/utils/texi2html/images/a_begin.gif
new file mode 100755
index 00000000000..63c80099ff4
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_begin.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_begin_na.gif b/Build/source/utils/texi2html/images/a_begin_na.gif
new file mode 100755
index 00000000000..cff097f9e18
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_begin_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_document.gif b/Build/source/utils/texi2html/images/a_document.gif
new file mode 100755
index 00000000000..7f5576bd322
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_document.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_document_na.gif b/Build/source/utils/texi2html/images/a_document_na.gif
new file mode 100755
index 00000000000..faf92d8c45e
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_document_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_empty.gif b/Build/source/utils/texi2html/images/a_empty.gif
new file mode 100755
index 00000000000..5843e432264
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_empty.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_end.gif b/Build/source/utils/texi2html/images/a_end.gif
new file mode 100755
index 00000000000..6900869902a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_end.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_end_na.gif b/Build/source/utils/texi2html/images/a_end_na.gif
new file mode 100755
index 00000000000..818fe6c9a5e
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_end_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_help.gif b/Build/source/utils/texi2html/images/a_help.gif
new file mode 100755
index 00000000000..dcb99fa904c
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_help.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_help_na.gif b/Build/source/utils/texi2html/images/a_help_na.gif
new file mode 100755
index 00000000000..2dd565df0a0
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_help_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_index.gif b/Build/source/utils/texi2html/images/a_index.gif
new file mode 100755
index 00000000000..b1306b1c3cb
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_index.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_index_na.gif b/Build/source/utils/texi2html/images/a_index_na.gif
new file mode 100755
index 00000000000..c3f663ca1cd
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_index_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_left.gif b/Build/source/utils/texi2html/images/a_left.gif
new file mode 100755
index 00000000000..0a28d9671cf
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_left.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_left_na.gif b/Build/source/utils/texi2html/images/a_left_na.gif
new file mode 100755
index 00000000000..00ef49ff78a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_left_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_leftdouble.gif b/Build/source/utils/texi2html/images/a_leftdouble.gif
new file mode 100755
index 00000000000..6221b203c59
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_leftdouble.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_leftdouble_na.gif b/Build/source/utils/texi2html/images/a_leftdouble_na.gif
new file mode 100755
index 00000000000..ffb2857df8f
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_leftdouble_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_page.gif b/Build/source/utils/texi2html/images/a_page.gif
new file mode 100755
index 00000000000..7d744f9129a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_page.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_page_na.gif b/Build/source/utils/texi2html/images/a_page_na.gif
new file mode 100755
index 00000000000..8e97093765f
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_page_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_right.gif b/Build/source/utils/texi2html/images/a_right.gif
new file mode 100755
index 00000000000..80596f8f042
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_right.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_right_na.gif b/Build/source/utils/texi2html/images/a_right_na.gif
new file mode 100755
index 00000000000..b4a217b89a2
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_right_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_rightdouble.gif b/Build/source/utils/texi2html/images/a_rightdouble.gif
new file mode 100755
index 00000000000..a539dd712ce
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_rightdouble.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_rightdouble_na.gif b/Build/source/utils/texi2html/images/a_rightdouble_na.gif
new file mode 100755
index 00000000000..0f4f4e9284a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_rightdouble_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_search.gif b/Build/source/utils/texi2html/images/a_search.gif
new file mode 100755
index 00000000000..4ba1c159b8d
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_search.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_search_na.gif b/Build/source/utils/texi2html/images/a_search_na.gif
new file mode 100755
index 00000000000..7339e8df3e0
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_search_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_searchdoc.gif b/Build/source/utils/texi2html/images/a_searchdoc.gif
new file mode 100755
index 00000000000..c378f8467dc
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_searchdoc.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_searchdoc_na.gif b/Build/source/utils/texi2html/images/a_searchdoc_na.gif
new file mode 100755
index 00000000000..fb761ed471d
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_searchdoc_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_tableofcon.gif b/Build/source/utils/texi2html/images/a_tableofcon.gif
new file mode 100755
index 00000000000..3ea3b2e8ee8
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_tableofcon.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_tableofcon_na.gif b/Build/source/utils/texi2html/images/a_tableofcon_na.gif
new file mode 100755
index 00000000000..dba67d35eb4
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_tableofcon_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_top.gif b/Build/source/utils/texi2html/images/a_top.gif
new file mode 100755
index 00000000000..467b36e6837
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_top.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_top_na.gif b/Build/source/utils/texi2html/images/a_top_na.gif
new file mode 100755
index 00000000000..51fe09a5ee1
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_top_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_up.gif b/Build/source/utils/texi2html/images/a_up.gif
new file mode 100755
index 00000000000..44bc961ba74
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_up.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/a_up_na.gif b/Build/source/utils/texi2html/images/a_up_na.gif
new file mode 100755
index 00000000000..2744a57818d
--- /dev/null
+++ b/Build/source/utils/texi2html/images/a_up_na.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/bg.jpg b/Build/source/utils/texi2html/images/bg.jpg
new file mode 100644
index 00000000000..409df67444a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/bg.jpg
Binary files differ
diff --git a/Build/source/utils/texi2html/images/bg_left.gif b/Build/source/utils/texi2html/images/bg_left.gif
new file mode 100644
index 00000000000..3a03de5c986
--- /dev/null
+++ b/Build/source/utils/texi2html/images/bg_left.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/bg_right.gif b/Build/source/utils/texi2html/images/bg_right.gif
new file mode 100644
index 00000000000..89e5e4f5da8
--- /dev/null
+++ b/Build/source/utils/texi2html/images/bg_right.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_dir.gif b/Build/source/utils/texi2html/images/blue_dir.gif
new file mode 100644
index 00000000000..6b687bd946c
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_dir.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_down.gif b/Build/source/utils/texi2html/images/blue_down.gif
new file mode 100644
index 00000000000..384430222ba
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_down.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_grab.gif b/Build/source/utils/texi2html/images/blue_grab.gif
new file mode 100644
index 00000000000..8a4f23875dc
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_grab.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_help.gif b/Build/source/utils/texi2html/images/blue_help.gif
new file mode 100644
index 00000000000..fb08df470b4
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_help.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_next.gif b/Build/source/utils/texi2html/images/blue_next.gif
new file mode 100644
index 00000000000..1c8c97edbb1
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_next.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_nnext.gif b/Build/source/utils/texi2html/images/blue_nnext.gif
new file mode 100644
index 00000000000..12cf4aab438
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_nnext.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_pprev.gif b/Build/source/utils/texi2html/images/blue_pprev.gif
new file mode 100644
index 00000000000..0a80d24a5d7
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_pprev.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_prev.gif b/Build/source/utils/texi2html/images/blue_prev.gif
new file mode 100644
index 00000000000..07e88e65375
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_prev.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_readme.gif b/Build/source/utils/texi2html/images/blue_readme.gif
new file mode 100644
index 00000000000..787758a0472
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_readme.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_top.gif b/Build/source/utils/texi2html/images/blue_top.gif
new file mode 100644
index 00000000000..e222a4eb07f
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_top.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_up.gif b/Build/source/utils/texi2html/images/blue_up.gif
new file mode 100644
index 00000000000..4867dd3c079
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_up.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/blue_uup.gif b/Build/source/utils/texi2html/images/blue_uup.gif
new file mode 100644
index 00000000000..2cbce64ee0e
--- /dev/null
+++ b/Build/source/utils/texi2html/images/blue_uup.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/contents_motif.gif b/Build/source/utils/texi2html/images/contents_motif.gif
new file mode 100644
index 00000000000..7b3c904b289
--- /dev/null
+++ b/Build/source/utils/texi2html/images/contents_motif.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/index_motif.gif b/Build/source/utils/texi2html/images/index_motif.gif
new file mode 100644
index 00000000000..b9b3108aa82
--- /dev/null
+++ b/Build/source/utils/texi2html/images/index_motif.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/next_motif.gif b/Build/source/utils/texi2html/images/next_motif.gif
new file mode 100644
index 00000000000..7a2dbe955e0
--- /dev/null
+++ b/Build/source/utils/texi2html/images/next_motif.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/next_motif_gr.gif b/Build/source/utils/texi2html/images/next_motif_gr.gif
new file mode 100644
index 00000000000..1416b1c10d9
--- /dev/null
+++ b/Build/source/utils/texi2html/images/next_motif_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/previous_motif.gif b/Build/source/utils/texi2html/images/previous_motif.gif
new file mode 100644
index 00000000000..aef90f1fc49
--- /dev/null
+++ b/Build/source/utils/texi2html/images/previous_motif.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/previous_motif_gr.gif b/Build/source/utils/texi2html/images/previous_motif_gr.gif
new file mode 100644
index 00000000000..c6acaabc97d
--- /dev/null
+++ b/Build/source/utils/texi2html/images/previous_motif_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/spacer3.gif b/Build/source/utils/texi2html/images/spacer3.gif
new file mode 100644
index 00000000000..0f7d451a9f9
--- /dev/null
+++ b/Build/source/utils/texi2html/images/spacer3.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_contents.gif b/Build/source/utils/texi2html/images/xy_contents.gif
new file mode 100644
index 00000000000..2864102d4af
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_contents.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_foot.gif b/Build/source/utils/texi2html/images/xy_foot.gif
new file mode 100644
index 00000000000..04a365bf56a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_foot.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_next.gif b/Build/source/utils/texi2html/images/xy_next.gif
new file mode 100644
index 00000000000..945aaf05e70
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_next.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_next_gr.gif b/Build/source/utils/texi2html/images/xy_next_gr.gif
new file mode 100644
index 00000000000..8289ed154cb
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_next_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_nextsection.gif b/Build/source/utils/texi2html/images/xy_nextsection.gif
new file mode 100644
index 00000000000..8a7bb0a3681
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_nextsection.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_nextsection_gr.gif b/Build/source/utils/texi2html/images/xy_nextsection_gr.gif
new file mode 100644
index 00000000000..adb336b45fe
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_nextsection_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_previous.gif b/Build/source/utils/texi2html/images/xy_previous.gif
new file mode 100644
index 00000000000..43a8db284a1
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_previous.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_previous_gr.gif b/Build/source/utils/texi2html/images/xy_previous_gr.gif
new file mode 100644
index 00000000000..979831742d0
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_previous_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_previoussection.gif b/Build/source/utils/texi2html/images/xy_previoussection.gif
new file mode 100644
index 00000000000..736fffec195
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_previoussection.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_previoussection_gr.gif b/Build/source/utils/texi2html/images/xy_previoussection_gr.gif
new file mode 100644
index 00000000000..c0de3e3495a
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_previoussection_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_up.gif b/Build/source/utils/texi2html/images/xy_up.gif
new file mode 100644
index 00000000000..56c8bae0fe6
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_up.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/images/xy_up_gr.gif b/Build/source/utils/texi2html/images/xy_up_gr.gif
new file mode 100644
index 00000000000..6da635ac7b5
--- /dev/null
+++ b/Build/source/utils/texi2html/images/xy_up_gr.gif
Binary files differ
diff --git a/Build/source/utils/texi2html/install-sh b/Build/source/utils/texi2html/install-sh
new file mode 100755
index 00000000000..e9de23842dc
--- /dev/null
+++ b/Build/source/utils/texi2html/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/Build/source/utils/texi2html/l2h.init b/Build/source/utils/texi2html/l2h.init
new file mode 100644
index 00000000000..6ee3c32387d
--- /dev/null
+++ b/Build/source/utils/texi2html/l2h.init
@@ -0,0 +1,168 @@
+
+######################################################################
+# from here on, its l2h init stuff
+#
+
+## initialization for latex2html as for Singular manual generation
+## obachman 3/99
+
+#
+# Options controlling Titles, File-Names, Tracing and Sectioning
+#
+$TITLE = '';
+
+$SHORTEXTN = 0;
+
+$LONG_TITLES = 0;
+
+$DESTDIR = '';
+
+$NO_SUBDIR = 1;
+
+$PREFIX = '';
+
+$AUTO_PREFIX = 0;
+
+$AUTO_LINK = 0;
+
+$SPLIT = 0;
+
+$MAX_LINK_DEPTH = 0;
+
+$TMP = '';
+
+$DEBUG = 0;
+
+$VERBOSE = 1;
+
+#
+# Options controlling Extensions and Special Features
+#
+#$HTML_VERSION = "3.2"; # set by command line
+
+$TEXDEFS = 1; # we absolutely need that
+
+$EXTERNAL_FILE = '';
+
+$SCALABLE_FONTS = 1;
+
+$NO_SIMPLE_MATH = 1;
+
+$LOCAL_ICONS = 1;
+
+$SHORT_INDEX = 0;
+
+$NO_FOOTNODE = 1;
+
+$ADDRESS = '';
+
+$INFO = '';
+
+#
+# Switches controlling Image Generation
+#
+$ASCII_MODE = 0;
+
+$NOLATEX = 0;
+
+$EXTERNAL_IMAGES = 0;
+
+$PS_IMAGES = 0;
+
+$NO_IMAGES = 0;
+
+$IMAGES_ONLY = 0;
+
+$REUSE = 2;
+
+$ANTI_ALIAS = 1;
+
+$ANTI_ALIAS_TEXT = 1;
+
+#
+#Switches controlling Navigation Panels
+#
+$NO_NAVIGATION = 1;
+$ADDRESS = '';
+$INFO = 0; # 0 = do not make a "About this document..." section
+
+#
+#Switches for Linking to other documents
+#
+# currently -- we don't care
+
+$MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth
+
+$MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth
+
+$NOLATEX = 0; # 1 = do not pass unknown environments to Latex
+
+$EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document
+
+$ASCII_MODE = 0; # 1 = do not use any icons or internal images
+
+# 1 = use links to external postscript images rather than inlined bitmap
+# images.
+$PS_IMAGES = 0;
+$SHOW_SECTION_NUMBERS = 0;
+
+### Other global variables ###############################################
+$CHILDLINE = "";
+
+# This is the line width measured in pixels and it is used to right justify
+# equations and equation arrays;
+$LINE_WIDTH = 500;
+
+# Used in conjunction with AUTO_NAVIGATION
+$WORDS_IN_PAGE = 300;
+
+# The value of this variable determines how many words to use in each
+# title that is added to the navigation panel (see below)
+#
+$WORDS_IN_NAVIGATION_PANEL_TITLES = 0;
+
+# This number will determine the size of the equations, special characters,
+# and anything which will be converted into an inlined image
+# *except* "image generating environments" such as "figure", "table"
+# or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$MATH_SCALE_FACTOR = 1.5;
+
+# This number will determine the size of
+# image generating environments such as "figure", "table" or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$FIGURE_SCALE_FACTOR = 1.6;
+
+
+# If both of the following two variables are set then the "Up" button
+# of the navigation panel in the first node/page of a converted document
+# will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set
+# to some text which describes this external link.
+$EXTERNAL_UP_LINK = "";
+$EXTERNAL_UP_TITLE = "";
+
+# If this is set then the resulting HTML will look marginally better if viewed
+# with Netscape.
+$NETSCAPE_HTML = 1;
+
+# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0"
+# Paper sizes has no effect other than in the time it takes to create inlined
+# images and in whether large images can be created at all ie
+# - larger paper sizes *MAY* help with large image problems
+# - smaller paper sizes are quicker to handle
+$PAPERSIZE = "a4";
+
+# Replace "english" with another language in order to tell LaTeX2HTML that you
+# want some generated section titles (eg "Table of Contents" or "References")
+# to appear in a different language. Currently only "english" and "french"
+# is supported but it is very easy to add your own. See the example in the
+# file "latex2html.config"
+$TITLES_LANGUAGE = "english";
+
+1; # This must be the last non-comment line
+
+# End File l2h.init
+######################################################################
+
diff --git a/Build/source/utils/texi2html/manage_i18n.pl b/Build/source/utils/texi2html/manage_i18n.pl
new file mode 100755
index 00000000000..8b9621d6af6
--- /dev/null
+++ b/Build/source/utils/texi2html/manage_i18n.pl
@@ -0,0 +1,397 @@
+#! /usr/bin/perl -w
+#+##############################################################################
+#
+# manage_i18n.pl: manage translation files
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#-##############################################################################
+
+# This requires perl version 5 or higher
+require 5.0;
+
+use strict;
+#use vars qw(
+# $T2H_LANGUAGES
+#);
+
+use File::Copy;
+use Data::Dumper;
+
+select(STDERR);
+$| = 1;
+select(STDOUT);
+$| = 1;
+
+my $language;
+my $i18n_dir = 'i18n'; # name of the directory containing the per language files
+my $translation_file = 'translations.pl'; # file containing all the translations
+my @known_languages = ('en', 'de', 'nl', 'es', 'no', 'pt', 'fr'); # The supported
+ # languages
+#my $template = 'template';
+my $template = 'en';
+my $template_file = "$i18n_dir/$template";
+my @source_files = ('texi2html.pl', 'texi2html.init', 'T2h_i18n.pm',
+ 'examples/roff.init', 'examples/noheaders.init');
+
+use vars qw(
+$LANGUAGES
+$T2H_OBSOLETE_STRINGS
+);
+
+# Strings not in code
+my $template_strings =
+{
+ 'January' => '',
+ 'February' => '',
+ 'March' => '',
+ 'April' => '',
+ 'May' => '',
+ 'June' => '',
+ 'July' => '',
+ 'August' => '',
+ 'September' => '',
+ 'October' => '',
+ 'November' => '',
+ 'December' => '',
+ 'T2H_today' => '%s, %d %d',
+};
+
+# Handle per language files
+$Data::Dumper::Sortkeys = 1;
+
+if (@ARGV < 1)
+{
+ die "Need at least one arg\n";
+}
+
+my $command = shift @ARGV;
+
+sub update_language_file($);
+
+die "No suitable $i18n_dir directory\n" unless (-d $i18n_dir and -r $i18n_dir);
+
+sub get_languages
+{
+ unless (opendir DIR, $i18n_dir)
+ {
+ die "Cannot open dir $i18n_dir: $!\n";
+ }
+ my @languages = grep {
+ ! /^\./ &&
+ ! /\.(bak|orig|old|dpkg-old|rpmnew|rpmsave)$/ &&
+ ! /~$/ &&
+ ! /^#.*#$/ &&
+ -f $i18n_dir . '/' . $_
+ } readdir DIR;
+ closedir DIR;
+ my @known = @known_languages;
+ foreach my $lang (@languages)
+ {
+ if (grep {$_ eq $lang} @known)
+ {
+ @known = grep {$_ ne $lang} @known;
+ }
+ else
+ {
+ warn "Remark: you could update the known languages array for `$lang'\n";
+ }
+ }
+ warn "Remark: the following known languages have no corresponding file: @known\n" if (@known);
+ return @languages;
+}
+
+sub manage_i18n_files($)
+{
+ my $command = shift;
+ if ($command eq 'update')
+ {
+ update_i18n_files();
+ }
+ elsif ($command eq 'merge')
+ {
+ merge_i18n_files();
+ }
+ elsif ($command eq 'template')
+ {
+ update_template(@source_files);
+ }
+ elsif ($command eq 'all')
+ {
+ update_template(@source_files);
+ update_i18n_files();
+ merge_i18n_files();
+ }
+ else
+ {
+ warn "Unknown i18n command: $command\n";
+ }
+ exit 0;
+}
+
+sub merge_i18n_files
+{
+ my @languages = get_languages();
+ die "No languages found\n" unless (@languages);
+ if (-f $translation_file)
+ {
+ unless (File::Copy::copy ($translation_file, "$translation_file.old"))
+ {
+ die "Error copying $translation_file to $translation_file.old\n";
+ }
+ }
+ #foreach my $lang ($template, @known_languages)
+ die "open $translation_file failed" unless (open (TRANSLATIONS, ">$translation_file"));
+ foreach my $lang (@languages)
+ {
+ my $file = "$i18n_dir/$lang";
+ next unless (-r $file);
+ unless (open (FILE, $file))
+ {
+ warn "open $file failed: $!\n";
+ return;
+ }
+ while (<FILE>)
+ {
+ print TRANSLATIONS;
+ }
+ close FILE;
+ }
+}
+
+sub update_language_hash($$$)
+{
+ my $file = shift;
+ my $lang = shift;
+ my $reference = shift;
+ if (-f $file)
+ {
+ eval { require($file) ;};
+ if ($@)
+ {
+ warn "require $file failed: $@\n";
+ return;
+ }
+ unless (File::Copy::copy ($file, "$file.old"))
+ {
+ warn "Error copying $file to $file.old\n";
+ return;
+ }
+ if (!defined($LANGUAGES->{$lang}))
+ {
+ warn "LANGUAGES->{$lang} not defined in $file\n";
+ return;
+ }
+ }
+ if (!defined($T2H_OBSOLETE_STRINGS->{$lang}))
+ {
+ $T2H_OBSOLETE_STRINGS->{$lang} = {};
+ }
+ if (!defined($LANGUAGES->{$lang}))
+ {
+ $LANGUAGES->{$lang} = {};
+ }
+
+ foreach my $string (keys %{$LANGUAGES->{$lang}})
+ {
+ $T2H_OBSOLETE_STRINGS->{$lang}->{$string} = $LANGUAGES->{$lang}->{$string}
+ if (defined($LANGUAGES->{$lang}->{$string}) and ($LANGUAGES->{$lang}->{$string} ne ''));
+ }
+
+ $LANGUAGES->{$lang} = {};
+
+ foreach my $string (keys (%{$reference}))
+ {
+ if (exists($T2H_OBSOLETE_STRINGS->{$lang}->{$string}) and
+ defined($T2H_OBSOLETE_STRINGS->{$lang}->{$string}) and
+ ($T2H_OBSOLETE_STRINGS->{$lang}->{$string} ne ''))
+ {
+ $LANGUAGES->{$lang}->{$string} = $T2H_OBSOLETE_STRINGS->{$lang}->{$string};
+ delete $T2H_OBSOLETE_STRINGS->{$lang}->{$string};
+ }
+ else
+ {
+ $LANGUAGES->{$lang}->{$string} = '';
+ }
+ }
+ return 1;
+}
+
+sub update_i18n_files
+{
+ die "No suitable $i18n_dir directory\n" unless (-d $i18n_dir and -w $i18n_dir);
+ #my @languages = @known_languages;
+ my @languages = get_languages();
+ if (@ARGV)
+ {
+ @languages = ();
+ foreach my $lang (@ARGV)
+ {
+ unless (grep {$lang eq $_} @known_languages)
+ {
+ #warn "Unsupported language `$lang'\n";
+ #next;
+ warn "Remark: you could update the known languages array for `$lang'\n";
+ }
+ push (@languages, $lang) unless (grep {$lang eq $_} @languages);
+ }
+ }
+ unless (@languages)
+ {
+ warn "No languages to update\n" ;
+ return;
+ }
+ die "$template_file not readable\n" unless (-r $template_file);
+ eval { require($template_file) ;};
+ if ($@)
+ {
+ die "require $template_file failed: $@\n";
+ }
+ die "LANGUAGE->{'en'} undef after require $template_file\n" unless
+ (defined($LANGUAGES) and defined($LANGUAGES->{'en'}));
+ foreach my $string (keys(%$template_strings))
+ {
+ die "template string $string undef" unless (defined($LANGUAGES->{'en'}->{$string}));
+ }
+ foreach my $lang (@languages)
+ {
+ update_language_file($lang);
+ }
+ return 1;
+}
+
+sub update_language_file($)
+{
+ my $lang = shift;
+ #unless (grep {$lang eq $_} @known_languages)
+ #{
+ # print STDERR "Unsupported language `$lang'\n";
+ # return;
+ #}
+ my $file = "$i18n_dir/$lang";
+
+ return unless (update_language_hash($file, $lang, $LANGUAGES->{'en'}));
+
+ unless (open (FILE, ">$file"))
+ {
+ warn "open $file failed: $!\n";
+ return;
+ }
+
+
+ print FILE "" . Data::Dumper->Dump([$LANGUAGES->{$lang}], [ "LANGUAGES->{'$lang'}" ]);
+ print FILE "\n";
+ print FILE Data::Dumper->Dump([$T2H_OBSOLETE_STRINGS->{$lang}], [ "T2H_OBSOLETE_STRINGS->{'$lang'}"]);
+ print FILE "\n";
+ print FILE "\n";
+ close FILE;
+}
+
+sub update_template (@)
+{
+ my $source_strings = {};
+ foreach my $source_file (@_)
+ {
+ unless (-r $source_file)
+ {
+ warn "$source_file not readable\n";
+ next;
+ }
+ unless (open (FILE, "$source_file"))
+ {
+ warn "open $source_file failed: $!\n";
+ next;
+ }
+ my $line_nr = 0;
+ while (<FILE>)
+ {
+ $line_nr++;
+ my $string;
+ next if /^\s*#/;
+ while ($_)
+ {
+ if (defined($string))
+ {
+ if (s/^([^\\']*)(\\|')//)
+ {
+ $string .= $1 if (defined($1));
+ if ($2 eq "'")
+ {
+ $source_strings->{$string} = '' ;
+ $string = undef;
+ }
+ else
+ {
+ if (s/^(.)//)
+ {
+ #$string .= '\\' . $1;
+ $string .= $1;
+ }
+ else
+ {
+ warn "\\ at end of line, file $source_file, line nr $line_nr\n";
+ $source_strings->{$string} = '' ;
+ $string = undef;
+ }
+ }
+ }
+ else
+ {
+ warn "string not closed file $source_file, line nr $line_nr\n";
+ $source_strings->{$string} = '' ;
+ $string = undef;
+ }
+ }
+ elsif (s/^.*?&\$I\s*\('//)
+ {
+ $string = '';
+ }
+ else
+ {
+ last;
+ }
+ }
+ }
+ close FILE;
+ }
+ foreach my $string (keys (%$template_strings))
+ {
+ $source_strings->{$string} = $template_strings->{$string};
+ }
+ die unless(update_language_hash($template_file, 'en', $source_strings));
+ foreach my $string (keys(%$template_strings))
+ { # use values in template_srings if it exists
+ $LANGUAGES->{'en'}->{$string} = $template_strings->{$string} if ($LANGUAGES->{'en'}->{$string} eq '');
+ }
+ unless (open (TEMPLATE, ">$template_file"))
+ {
+ die "open $template_file failed: $!\n";
+ }
+ print TEMPLATE "" . Data::Dumper->Dump([$LANGUAGES->{'en'}], [ "LANGUAGES->{'en'}" ]);
+ print TEMPLATE "\n";
+ if (keys(%{$T2H_OBSOLETE_STRINGS->{'en'}}))
+ {
+ print TEMPLATE Data::Dumper->Dump([$T2H_OBSOLETE_STRINGS->{'en'}], [ "T2H_OBSOLETE_STRINGS->{'en'}"]);
+ print TEMPLATE "\n";
+ print TEMPLATE "\n";
+ }
+ close TEMPLATE;
+}
+
+manage_i18n_files($command);
+
+1;
diff --git a/Build/source/utils/texi2html/mdate-sh b/Build/source/utils/texi2html/mdate-sh
new file mode 100755
index 00000000000..0c88e758b8c
--- /dev/null
+++ b/Build/source/utils/texi2html/mdate-sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+# Copyright 1995, 1996, 1997 Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# Get the extended ls output of the file or directory.
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ set - x`ls -L -l -d $1`
+else
+ set - x`ls -l -d $1`
+fi
+# The month is at least the fourth argument
+# (3 shifts here, the next inside the loop).
+shift
+shift
+shift
+
+# Find the month. Next argument is day, followed by the year or time.
+month=
+until test $month
+do
+ shift
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+day=$2
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
diff --git a/Build/source/utils/texi2html/missing b/Build/source/utils/texi2html/missing
new file mode 100755
index 00000000000..5f9da90636f
--- /dev/null
+++ b/Build/source/utils/texi2html/missing
@@ -0,0 +1,265 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing 0.3 - GNU automake"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`configure.in'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`configure.in'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`configure.in'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar ${1+"$@"} && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar ${1+"$@"} && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" ${1+"$@"} && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" ${1+"$@"} && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/Build/source/utils/texi2html/missing-texi2html b/Build/source/utils/texi2html/missing-texi2html
new file mode 100755
index 00000000000..f212eebf73d
--- /dev/null
+++ b/Build/source/utils/texi2html/missing-texi2html
@@ -0,0 +1,96 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ texi2html touch output file"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing 0.3 - GNU automake (modified in texi2html)"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ */texi2html)
+ echo 1>&2 "\
+WARNING: \`$1' is missing or broken on your system. You should only
+ need it if you modified \`texi2html.info'. You might want to install
+ the \`Perl' package. Grab it from any GNU archive site."
+ if test -z "$2"; then
+ echo 1>&2 "ERROR: No output file specified!"
+ exit 1
+ fi
+ while test -n "$3"; do
+ shift
+ done
+ file=`echo "$2" |sed 's/\.texi$/.html/'`
+ file=`echo "$file" |sed 's/\.texinfo$/.html/'`
+ touch "$file"
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/Build/source/utils/texi2html/mkinstalldirs b/Build/source/utils/texi2html/mkinstalldirs
new file mode 100755
index 00000000000..8fa2502116c
--- /dev/null
+++ b/Build/source/utils/texi2html/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.2 2001/05/01 21:33:44 dprice Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/Build/source/utils/texi2html/texi2html.1.in b/Build/source/utils/texi2html/texi2html.1.in
new file mode 100644
index 00000000000..8f270f6adee
--- /dev/null
+++ b/Build/source/utils/texi2html/texi2html.1.in
@@ -0,0 +1,164 @@
+.TH TEXI2HTML 1 "@PACKAGE_DATE@"
+.AT 3
+.SH NAME
+texi2html \- a Texinfo to HTML converter
+.SH SYNOPSIS
+.B texi2html [options] file
+.SH DESCRIPTION
+.I Texi2html
+converts the given Texinfo file to a set of HTML files. It tries to handle
+most of the Texinfo commands. It creates hypertext links for cross-references,
+footnotes...
+.PP
+.I Texi2html
+may furthermore use latex2html to generate HTML (code and/or images) for @math
+and @iftex tags (see the
+.B \-\-l2h
+option).
+.PP
+.I Texi2html
+creates several files depending on the contents of the Texinfo file and on
+the chosen options (see FILES).
+.PP
+The HTML files created by
+.I texi2html
+are closer to TeX than to Info.
+.SH OPTIONS
+Options may be abbreviated to th shortests unique prefix. The
+following is only an incomplete list of the available options:
+.TP 12
+.B \-\-help [1|2]
+Print usage instructions and list the most important, all relevant,
+or all recognised (including obsolete) command-line options, and exit.
+.TP
+.B \-\-ifinfo \-\-iftex \-\-ifxml \-\-ifplaintext \-\-ifhtml
+Expand @ifinfo, @iftex and @tex, @ifxml and @xml, @ifplaintext,
+@ifhtml and @html regions, and don't expand @ifnot
+corresponding regions (default: ifhtml).
+.TP
+.B \-\-no\-ifinfo \-\-no\-iftex \-\-no\-ifxml \-\-no\-ifplaintext \-\-no\-html
+Don't expand @ifinfo, @iftex, @ifxml, @ifplaintext regions and expand
+@ifnot corresponding regions.
+.TP
+.B \-I \fIdir\fP
+Append \fIdir\fP to the directory list searched for included files.
+.TP
+.B \-P \fIdir\fP
+Prepend \fIdir\fP to the directory list searched for included files.
+.TP
+.B \-\-no\-menu
+Don't show the Texinfo menus; by default they are shown.
+.TP
+.B \-\-no\-number
+Don't number the sections.
+.TP
+.B \-\-split chapter|section|node
+Split the output into several HTML files (one per main chapter/section or node).
+.TP
+.B \-\-l2h
+Use latex2html for content of @math and @tex tags. Content must be such that
+both, latex and tex, can translate it correctly. I.e., no tex-only constructs
+must be used.
+.TP
+.B \-\-l2h\-l2h \fIprog\fP
+Use \fIprog\fP as latex2html program (default \fIlatex2html\fP).
+Program must be executable.
+.TP
+.B \-\-l2h\-init \fIfile\fP
+Use \fIfile\fP as latex2html init file. \fIfile\fP should be used to specify in which way latex2html handles mathematical expressions and formulas.
+
+Note that latex2html locates
+(and uses) init-files in the following order (provided they exist):
+(1) global init file (usually in latex2html source dir)
+(2) $HOME/.latex2html_init
+(3) ./.latex2html_init
+(4) init file given on command line.
+.TP
+.B \-\-l2h\-tmp \fIdir\fP
+Use \fIdir\fP as tmp dir for latex2html. This directory (resp. its path)
+must not contain a dot (i.e., a ".").
+.TP
+.B \-\-l2h\-clean
+remove all intermediate files generated by latex2html (prevents caching!)
+.TP
+.B \-\-l2h\-skip
+Do not really run latex2html. Use (kept) files of previous runs, instead.
+.TP
+.B \-\-Verbose
+Give a verbose output.
+.TP
+.B \-\-version
+Print version and exit.
+.PP
+.SH FILES
+Initialisation options are read first from @sysconfdir@/texi2html/Config
+(the exact location being changeable with the
+.RI --sysconfdir= dir
+option to the configure script), then from $HOME/.texi2html/Config,
+then any command-line options including \-\-init\-file options;
+with later settings overriding earlier ones.
+.P
+By default
+.I texi2html
+my creates the following files (foo being the name of the Texinfo file):
+.TP 16
+.B foo_toc.html
+The table of contents (if @contents is present).
+.TP
+.B foo.html
+The document's contents or the Top element.
+.TP
+.B foo_fot.html
+The footnotes (if any).
+.TP
+.B foo_abt.html
+An help section.
+.TP
+.B foo_l2h_img*
+Images generated by latex2html (if any).
+.PP
+When used with the
+.B \-\-split
+option, it creates several files (one per chapter or node), named
+.B foo_n.html
+(n being the index of the chapter or node), and the
+.B foo.html
+file contains the Top element.
+.PP
+Otherwise it creates only one file:
+.B foo.html
+.SH VERSION
+This is \fItexi2html\fP version @PACKAGE_VERSION@, @PACKAGE_DATE@.
+.SH AUTHOR
+Texi2html was originally written by is Lionel Cons, CERN IT/DIS/OSE,
+Lionel.Cons@cern.ch. Over time, many other people around the net
+contributed to this program. Its current maintainer is Olaf Bachmann,
+obachman@mathematik.uni-kl.de.
+.SH AVAILABILITY
+The latest version of this program, as well as support in the form of mailing
+lists with archives, bug tracking, documentation, and other tools can be found
+at:
+ http://texi2html.cvshome.org/
+.SH COPYRIGHT
+Copyright \(co 1999, 2000, 2003 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the file named COPYING.
+.SH "SEE ALSO"
+GNU Texinfo Documentation Format
+.br
+http://texinfo.org/
+.br
+World Wide Web (WWW),
+HyperText Markup Language (HTML)
+.br
+http://www.w3.org
+.br
+LaTeX2HTML
+.br
+http://www-dsed.llnl.gov/files/programs/unix/latex2html
+.SH BUGS
+This man-page is not up-to-date and there exists no up-to-date documentation, yet.
+Until it exists, see the beginning of the texi2html.init file for remarks about
+command-line options and configurations.
+.ex
diff --git a/Build/source/utils/texi2html/texi2html.init b/Build/source/utils/texi2html/texi2html.init
new file mode 100644
index 00000000000..7894da96c15
--- /dev/null
+++ b/Build/source/utils/texi2html/texi2html.init
@@ -0,0 +1,4254 @@
+# -*-perl-*-
+######################################################################
+# File: texi2html.init
+#
+# Default values for command-line arguments and for various customizable
+# procedures are set in this file.
+#
+# A copy of this file is pasted into the beginning of texi2html by
+# running './configure'.
+#
+# Copy this file, rename it and make changes to it, if you like.
+# Afterwards, load the file with command-line
+# option -init-file <your_init_file>
+#
+# $Id: texi2html.init,v 1.81 2005/02/01 21:20:28 pertusus Exp $
+
+######################################################################
+# The following variables can also be set by command-line options
+#
+#
+# The default values are set in this file, texi2html.init and the content
+# of this file is included at the beginning of the texi2html script file.
+# Those values may be overrided by values set in $sysconfdir/texi2htmlrc
+# and then by values set in $HOME/texi2htmlrc.
+#
+# command line switches may override these values, and values set in files
+# specified by -init-file are also taken into account.
+# values set in these files overwrite values set by the command-line
+# options appearing before -init-file and might still be overwritten by
+# command-line arguments following the -init-file option.
+
+# -debug
+# The integer value specifies what kind of debugging output is generated.
+$DEBUG = 0;
+
+# -doctype
+# The value is the 'SystemLiteral' which identifies the canonical DTD
+# for the document.
+# Definition: The SystemLiteral is called the entity's system
+# identifier. It is a URI, which may be used to retrieve the entity.
+# See http://www.xml.com/axml/target.html#NT-ExternalID
+$DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">';
+
+# -frameset-doctype
+# When frames are used, this SystemLiteral identifies the DTD used for
+# the file containing the frame description.
+$FRAMESET_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html401/frameset.dtd">';
+
+# -test
+# If this value is true, some variables which should be dynamically generated
+# (the date, the user running texi2html, the version of texi2html) are set to
+# fix and given values. This is usefull in case the resulting manual is
+# compared with a reference. For example this is used in the tests of test.sh.
+$TEST = 0;
+
+# -dump-texi
+# This value is usefull for debugging purposes. The result of the first pass is
+# put in <document name>.passtexi, the result of the second pass is put in
+# <document name>.passfirst.
+$DUMP_TEXI = 0;
+
+# -expand
+# the @EXPAND array contains the expanded section names.
+@EXPAND = ('html');
+
+# -invisible
+# This seems obsolete and is not used anywhere.
+# This was a workaround for a known bug of many WWW browsers, including
+# netscape. This was used to create invisible destination in anchors.
+$INVISIBLE_MARK = '';
+# $INVISIBLE_MARK = '&#160;';
+
+# -iso
+# if this value is true, ISO8859 characters are used for special symbols
+# (like copyright, etc).
+$USE_ISO = 1;
+
+# -I
+# add a directory to the list of directories where @include files are
+# searched for (besides the directory of the file). additional '-I'
+# args are appended to this list.
+# (APA: Don't implicitely search ., to conform with the docs!)
+# my @INCLUDE_DIRS = (".");
+@INCLUDE_DIRS = ();
+
+# -P
+# prepend a directory to the list of directories where @include files are
+# searched for before the directory of the file. additional '-P'
+# args are prepended to this list.
+@PREPEND_DIRS = ();
+
+# -top-file
+# This file name is used for the top-level file.
+# The extension is set appropriately, if necessary.
+# If empty, <basename of document>.html is used.
+# Typically, you would set this to "index.html".
+$TOP_FILE = '';
+
+# -toc-file
+# This file name is used for the table of contents. The
+# extension is set appropriately, if necessary.
+# If empty, <basename of document>_toc.html is used.
+$TOC_FILE = '';
+
+# -frames
+# if the value is true, HTML 4.0 "frames" are used.
+# A file describing the frame layout is generated, together with a file
+# with the short table of contents.
+$FRAMES = 0;
+
+# -menu | -nomenu
+# if the value is true the Texinfo menus are shown.
+$SHOW_MENU = 1;
+
+# -number | -nonumber
+# if this is set the sections are numbered, and section names and numbers
+# are used in references and menus (instead of node names).
+$NUMBER_SECTIONS = 1;
+
+# -use-nodes
+# if this is set the nodes are used as sectionning elements.
+# Otherwise the nodes are incorporated in sections.
+$USE_NODES = 0;
+
+# -node-files
+# if this is set one file per node is generated, which can be a target for
+# cross manual references.
+$NODE_FILES = 0;
+
+# -split section|chapter|node|none
+# if $SPLIT is set to 'section' (resp. 'chapter') one html file per section
+# (resp. chapter) is generated. If $SPLIT is set to 'node' one html file per
+# node or sectionning element is generated. In all these cases separate pages
+# for Top, Table of content (Toc), Overview and About are generated.
+# Otherwise a monolithic html file that contains the whole document is
+# created.
+#$SPLIT = 'section';
+$SPLIT = '';
+
+# -sec-nav|-nosec-nav
+# if this is set then navigation panels are printed at the beginning of each
+# section.
+# If the document is split at nodes then navigation panels are
+# printed at the end if there were more than $WORDS_IN_PAGE words on page.
+#
+# If the document is split at sections this is ignored.
+#
+# This is most useful if you do not want to have section navigation
+# with -split chapter. There will be chapter navigation panel at the
+# beginning and at the end of chapters anyway.
+$SECTION_NAVIGATION = 1;
+
+# -separated-footnotes
+# if this is set footnotes are on a separated page. Otherwise they are at
+# the end of each file (if the document is split).
+$SEPARATED_FOOTNOTES = 1;
+
+# -toc-links
+# if this is set, links from headings to toc entries are created.
+$TOC_LINKS = 0;
+
+# -subdir
+# If this is set, then put result files into the specified directory.
+# If not set, then result files are put into the current directory.
+#$SUBDIR = 'html';
+$SUBDIR = '';
+
+# -short-extn
+# If this is set, then all HTML files will have extension ".htm" instead of
+# ".html". This is helpful when shipping the document to DOS-based systems.
+$SHORTEXTN = 0;
+
+# -prefix
+# This set the output file prefix, prepended to all .html, .gif and .pl files.
+# By default, this is the basename of the document.
+$PREFIX = '';
+
+# -o filename
+# If this is set a monolithic document is outputted into $filename.
+$OUT = '';
+
+# -no-validate
+# suppress node cross-reference validation
+$NOVALIDATE = 0;
+
+# -short-ref
+# if this is set cross-references are given without section numbers.
+$SHORT_REF = '';
+
+# -idx-sum
+# if value is set, then for each @printindex <index name>
+# <document name>_<index name>.idx is created which contains lines of the form
+# key ref sorted alphabetically (case matters).
+$IDX_SUMMARY = 0;
+
+# -def-table
+# If this is set a table construction for @def.... instead of definition
+# lists.
+# (New Option: 27.07.2000 Karl Heinz Marbaise)
+$DEF_TABLE = 0;
+
+# -verbose
+# if this is set chatter about what we are doing.
+$VERBOSE = '';
+
+# -lang
+# FIXME this has changed
+# For page titles use $Texi2HTML::I18n::WORDS->{$T2H_LANG}->{...} as title.
+# To add a new language, supply list of titles (see $Texi2HTML::I18n::WORDS).
+# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02
+# for definitions).
+# Default's to 'en' if not set or no @documentlanguage is specified.
+$LANG = 'en';
+
+# -ignore-preamble-text
+# If this is set the text before @node and sectionning commands is ignored.
+$IGNORE_PREAMBLE_TEXT = 0;
+
+# -html-xref-prefix
+# base directory for external manuals.
+#$EXTERNAL_DIR = '../';
+$EXTERNAL_DIR = undef;
+
+# -l2h
+# if this is set, latex2html is used for generation of math content.
+$L2H = '';
+
+# -css-include
+# All the specified css files are used. More precisely the @import sections
+# are added to the beginning of the CSS_LINES the remaining is added at
+# the end of the CSS_LINES (after the css rules generated by texi2html).
+# cf texinfo manual for more info.
+# - means STDIN
+@CSS_FILES = ();
+
+######################
+# The following options are only relevant if $L2H is set
+#
+# -l2h-l2h
+# name/location of latex2html program
+$L2H_L2H = "latex2html";
+
+# -l2h-skip
+# If this is set the actual call to latex2html is skipped. The previously
+# generated content is reused, instead.
+$L2H_SKIP = '';
+
+# -l2h-tmp
+# If this is set l2h uses the specified directory for temporary files. The path
+# leading to this directory may not contain a dot (i.e., a ".");
+# otherwise, l2h will fail.
+$L2H_TMP = '';
+
+# -l2h-file
+# If set, l2h uses the file as latex2html init file
+$L2H_FILE = 'l2h.init';
+
+# -l2h-clean
+# if this is set the intermediate files generated by texi2html in relation with
+# latex2html are cleaned (they all have the prefix <document name>_l2h_).
+$L2H_CLEAN = 1;
+
+##############################################################################
+#
+# The following can only be set in the init file
+#
+##############################################################################
+
+# If true do table of contents even if there is no @content
+$DO_CONTENTS = 0;
+# If true do short table of contents even if there is no @shortcontent
+$DO_SCONTENTS = 0;
+
+# if set, then use node names in menu entries, instead of section names
+$NODE_NAME_IN_MENU = 0;
+
+# new style for crossrefs
+$NEW_CROSSREF_STYLE = 1;
+
+# if set and menu entry equals menu description, then do not print
+# menu description.
+# Likewise, if node name equals entry name, do not print entry name.
+$AVOID_MENU_REDUNDANCY = 1;
+
+# if set, center @image by default
+# otherwise, do not center by default
+$CENTER_IMAGE = 1;
+
+# used as identation for block enclosing command @example, etc
+# If not empty, must be enclosed in <td></td>
+$EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+
+# same as above, only for @small
+$SMALL_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+
+# font size for @small
+$SMALL_FONT_SIZE = '-1';
+
+# horizontal rules
+$SMALL_RULE = '<hr size="1">';
+$DEFAULT_RULE = '<hr>';
+$MIDDLE_RULE = '<hr size="2">';
+$BIG_RULE = '<hr size="6">';
+
+# if non-empty, and no @..heading appeared in Top node, then
+# use this as header for top node/section, otherwise use value of
+# @settitle or @shorttitle (in that order)
+$TOP_HEADING = '';
+
+# if set, use this chapter for 'Index' button, else
+# use first chapter with @printindex
+$INDEX_CHAPTER = '';
+
+# if set and $SPLIT is set, then split index pages at the next letter
+# after they have more than that many entries
+$SPLIT_INDEX = 100;
+
+# symbol put at the beginning of nodes entry in menu (and optionnaly of
+# unnumbered in menus, see next variable)
+$MENU_SYMBOL = '&bull;';
+#$MENU_SYMBOL = '*';
+
+$OPEN_QUOTE_SYMBOL = "\`";
+$CLOSE_QUOTE_SYMBOL = "'";
+
+# if true put a $MENU_SYMBOL before unnumbered in menus
+$UNNUMBERED_SYMBOL_IN_MENU = 0;
+
+# extension for nodes files when NODE_FILES is true
+$NODE_FILE_EXTENSION = "html";
+
+# extension
+$EXTENSION = "html";
+
+# file name used for Top node when NODE_FILES is true
+$TOP_NODE_FILE = "index";
+
+# this controls the pre style for menus
+$MENU_PRE_STYLE = 'font-family: serif';
+
+# This controls the ul style for toc
+$TOC_LIST_STYLE = 'list-style: none';
+$TOC_LIST_ATTRIBUTE = ' class="toc"';
+
+# These lines are inserted before and after the shortcontents
+$BEFORE_OVERVIEW = "<div class=\"shortcontents\">\n";
+$AFTER_OVERVIEW = "</div>\n";
+
+# These lines are inserted before and after the contents
+$BEFORE_TOC_LINES = "<div class=\"contents\">\n";
+$AFTER_TOC_LINES = "</div>\n";
+
+# if set (e.g., to index.html) replace hrefs to this file
+# (i.e., to index.html) by ./
+$HREF_DIR_INSTEAD_FILE = '';
+
+# text inserted after <body ...>
+$AFTER_BODY_OPEN = '';
+
+# text inserted before </body>, this will be automatically inside <p></p>
+$PRE_BODY_CLOSE = '';
+
+# this is added inside <head></head> after <title> and some <meta name>
+# stuff, it can be used for eg. <style>, <script>, <meta> etc. tags.
+$EXTRA_HEAD = '';
+
+# Specifies the minimum page length required before a navigation panel
+# is placed at the bottom of a page
+# FIXME this is not true:
+# THIS_WORDS_IN_PAGE holds number of words of current page
+$WORDS_IN_PAGE = 300;
+
+# if this is set a vertical navigation panel is used.
+$VERTICAL_HEAD_NAVIGATION = 0;
+
+# html version for latex2html
+$L2H_HTML_VERSION = "4.0";
+
+# specify in this array which "buttons" should appear in which order
+# in the navigation panel for sections; use ' ' for empty buttons (space)
+@SECTION_BUTTONS =
+ (
+ 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',
+ ' ', ' ', ' ', ' ',
+ 'Top', 'Contents', 'Index', 'About',
+ );
+
+# buttons for misc stuff
+@MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About');
+
+# buttons for chapter file footers
+# (and headers but only if SECTION_NAVIGATION is false)
+@CHAPTER_BUTTONS =
+ (
+ 'FastBack', 'FastForward', ' ',
+ ' ', ' ', ' ', ' ',
+ 'Top', 'Contents', 'Index', 'About',
+ );
+
+# buttons for section file footers
+@SECTION_FOOTER_BUTTONS =
+ (
+ 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward'
+ );
+
+@NODE_FOOTER_BUTTONS =
+ (
+ 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',
+ ' ', ' ', ' ', ' ',
+ 'Top', 'Contents', 'Index', 'About',
+# 'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward'
+ );
+
+$ICONS = 0;
+
+# insert here name of icon images for buttons
+# Icons are used, if $ICONS and resp. value are set
+%ACTIVE_ICONS =
+ (
+ 'Top', '',
+ 'Contents', '',
+ 'Overview', '',
+ 'Index', '',
+ 'This', '',
+ 'Back', '',
+ 'FastBack', '',
+ 'Prev', '',
+ 'Up', '',
+ 'Next', '',
+ 'NodeUp', '',
+ 'NodeNext', '',
+ 'NodePrev', '',
+ 'Following', '',
+ 'Forward', '',
+ 'FastForward', '',
+ 'About' , '',
+ 'First', '',
+ 'Last', '',
+ ' ', ''
+ );
+
+# insert here name of icon images for these, if button is inactive
+%PASSIVE_ICONS =
+ (
+ 'Top', '',
+ 'Contents', '',
+ 'Overview', '',
+ 'Index', '',
+ 'This', '',
+ 'Back', '',
+ 'FastBack', '',
+ 'Prev', '',
+ 'Up', '',
+ 'Next', '',
+ 'NodeUp', '',
+ 'NodeNext', '',
+ 'NodePrev', '',
+ 'Following', '',
+ 'Forward', '',
+ 'FastForward', '',
+ 'About', '',
+ 'First', '',
+ 'Last', '',
+ );
+
+
+$init_out = \&t2h_default_init_out;
+$finish_out = \&t2h_default_finish_out;
+
+# We have to do this dynamically because of internationalization and because
+# in body $LANG could be used.
+sub t2h_default_init_out()
+{
+# Names of text as alternative for icons
+ %NAVIGATION_TEXT =
+ (
+ 'Top', &$I('Top'),
+ 'Contents', &$I('Contents'),
+ 'Overview', &$I('Overview'),
+ 'Index', &$I('Index'),
+ ' ', ' &nbsp; ',
+ 'This', &$I('current'),
+ 'Back', ' &lt; ',
+ 'FastBack', ' &lt;&lt; ',
+ 'Prev', &$I('Prev'),
+ 'Up', &$I(' Up '),
+ 'Next', &$I('Next'),
+ 'NodeUp', &$I('node up'),
+ 'NodeNext', &$I('next node'),
+ 'NodePrev', &$I('previous node'),
+ 'Following', &$I('following node'),
+ 'Forward', ' &gt; ',
+ 'FastForward', ' &gt;&gt; ',
+ 'About', ' ? ',
+ 'First', ' |&lt; ',
+ 'Last', ' &gt;| '
+ );
+
+ %BUTTONS_GOTO =
+ (
+ 'Top', &$I('cover (top) of document'),
+ 'Contents', &$I('table of contents'),
+ 'Overview', &$I('short table of contents'),
+ 'Index', &$I('index'),
+ 'This', &$I('current section'),
+ 'Back', &$I('previous section in reading order'),
+ 'FastBack', &$I('beginning of this chapter or previous chapter'),
+ 'Prev', &$I('previous section on same level'),
+ 'Up', &$I('up section'),
+ 'Next', &$I('next section on same level'),
+ 'NodeUp', &$I('up node'),
+ 'NodeNext', &$I('next node'),
+ 'NodePrev', &$I('previous node'),
+ 'Following', &$I('node following in node reading order'),
+ 'Forward', &$I('next section in reading order'),
+ 'FastForward', &$I('next chapter'),
+ 'About' , &$I('about (help)'),
+ 'First', &$I('first section in reading order'),
+ 'Last', &$I('last section in reading order'),
+ );
+ # Set the default body text, inserted between <body ... >
+ $BODYTEXT = 'lang="' . $LANG . '" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"' unless (defined($BODYTEXT));
+ if (!defined($EXTERNAL_CROSSREF_SPLIT))
+ {
+ if ($SPLIT)
+ {
+ $EXTERNAL_CROSSREF_SPLIT = 1;
+ }
+ else
+ {
+ $EXTERNAL_CROSSREF_SPLIT = 0;
+ }
+ }
+ $ENCODING = $DOCUMENT_ENCODING if (!defined($ENCODING));
+ my $to_encoding;
+ if (defined($ENCODING))
+ {
+ $to_encoding = main::set_encoding ($ENCODING);
+
+ if (defined($to_encoding) and defined($perl_charset_to_html{$to_encoding}))
+ {# FIXME is this really right ?
+ $ENCODING = $perl_charset_to_html{$to_encoding};
+ }
+ elsif (defined($to_encoding))
+ {# FIXME is this really right ?
+ $ENCODING = $to_encoding;
+ }
+ }
+ else
+ {
+ #$ENCODING = 'iso-8859-1';
+ $ENCODING = 'us-ascii';
+ }
+ # FIXME default might be utf8 ?
+ $DOCUMENT_ENCODING = 'us-ascii' if (!defined($DOCUMENT_ENCODING));
+
+ return $to_encoding;
+};
+
+sub t2h_default_finish_out()
+{
+}
+
+#######################################################################
+#
+# Values guessed if not set here, set in init_out
+#
+#######################################################################
+
+$BODYTEXT = undef;
+
+# Formatted document encoding. If undef set to @documentencoding. If undef and
+# there is no @documentencoding, set in init_out
+$ENCODING = undef;
+
+# if undef set to @documentdescription. If there is no @documentdescription,
+# set in page_head
+$DOCUMENT_DESCRIPTION = undef;
+
+# if undef set 1 if SPLIT, to 0 otherwise
+$EXTERNAL_CROSSREF_SPLIT = undef;
+
+########################################################################
+# Control of Page layout:
+# You can make changes of the Page layout at two levels:
+# 1.) For small changes, it is often enough to change the value of
+# some global string/hash/array variables
+# 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines,
+# give them another name, and assign them to the respective
+# $<fnc> variable.
+
+# As a general interface, the hashes Texi2HTML::HREF, Texi2HTML::NAME, Texi2HTML::NODE, Texi2HTML::NO_TEXI, hold
+# href, html-name, node-name, name after removal of texi commands of
+# This -- current section (resp. html page)
+# Top -- top page FIXME: ($T2H_TOP_FILE)
+# Contents -- Table of contents
+# Overview -- Short table of contents
+# Index -- Index page
+# About -- page which explain "navigation buttons"
+# First -- first node
+# Last -- last node
+#
+# Whether or not the following hash values are set, depends on the context
+# (all values are w.r.t. 'This' section)
+# Next -- next node of texinfo
+# Prev -- previous node of texinfo
+# NodeUp -- up node of texinfo
+# Following -- following node in node reading order, taking menu into account
+# Forward -- next node in reading order
+# Back -- previous node in reading order
+# Up -- parent given by sectionning commands
+# FastForward -- if leave node, up and next, else next node
+# FastBackward-- if leave node, up and prev, else prev node
+#
+# Furthermore, the following global variabels are set:
+# $Texi2HTML::THISDOC{title} -- title as set by @setttile
+# $Texi2HTML::THISDOC{title_no_texi} -- title without texi (without html elements)
+# $Texi2HTML::THISDOC{title_texi} -- title with texinfo @-commands
+# $Texi2HTML::THISDOC{fulltitle} -- full title as set by @title...
+# $Texi2HTML::THISDOC{subtitle} -- subtitle as set by @subtitle
+# $Texi2HTML::THISDOC{author} -- author as set by @author
+# $Texi2HTML::THISDOC{copying} -- text of @copying and @end copying in comment
+#
+# $Texi2HTML::THISDOC{program} -- name and version of texi2html
+# $Texi2HTML::THISDOC{program_homepage} -- homepage for texi2html
+# $Texi2HTML::THISDOC{program_authors} -- authors of texi2html
+# $Texi2HTML::THISDOC{today} -- date formatted with pretty_date
+# $Texi2HTML::THISDOC{toc_file} -- table of contents file
+# $Texi2HTML::THISDOC{file_base_name} -- base name of the texinfo manual file
+# $Texi2HTML::THISDOC{destination_directory}
+ # -- directory for the resulting files
+# $Texi2HTML::THISDOC{user} -- user running the script
+# other $Texi2HTML::THISDOC keys corresponds with texinfo commands, the value
+# being the command arg, for the following commands:
+# kbdinputstyle, paragraphindent, setchapternewpage, headings, footnotestyle,
+# exampleindent, firstparagraphindent, everyheading, everyfooting,
+# evenheading, evenfooting, oddheading, oddfooting
+#
+# and pointer to arrays of lines which need to be printed by main::print_lines
+# $Texi2HTML::THIS_SECTION -- lines of 'This' section
+# $Texi2HTML::THIS_HEADER -- lines preceding navigation panel of 'This' section
+# $Texi2HTML::OVERVIEW -- lines of short table of contents
+# $Texi2HTML::TOC_LINES -- lines of table of contents
+# $Texi2HTML::TITLEPAGE -- lines of title page
+#
+# $Texi2HTML::THIS_ELEMENT holds the element reference.
+## FIXME: $T2H_TOP -- lines of Top texinfo node
+
+#
+# There are the following subs which control the layout:
+#
+$print_section = \&T2H_DEFAULT_print_section;
+$end_section = \&T2H_DEFAULT_end_section;
+$one_section = \&T2H_DEFAULT_one_section;
+$print_Top_header = \&T2H_DEFAULT_print_Top_header;
+$print_Top_footer = \&T2H_DEFAULT_print_Top_footer;
+$print_Top = \&T2H_DEFAULT_print_Top;
+$print_Toc = \&T2H_DEFAULT_print_Toc;
+$print_Overview = \&T2H_DEFAULT_print_Overview;
+$print_Footnotes = \&T2H_DEFAULT_print_Footnotes;
+$print_About = \&T2H_DEFAULT_print_About;
+$print_misc_header = \&T2H_DEFAULT_print_misc_header;
+$print_misc_footer = \&T2H_DEFAULT_print_misc_footer;
+$print_misc = \&T2H_DEFAULT_print_misc;
+$print_section_footer = \&T2H_DEFAULT_print_section_footer;
+$print_chapter_header = \&T2H_DEFAULT_print_chapter_header;
+$print_section_header = \&T2H_DEFAULT_print_section_header;
+$print_chapter_footer = \&T2H_DEFAULT_print_chapter_footer;
+$print_page_head = \&T2H_DEFAULT_print_page_head;
+$print_page_foot = \&T2H_DEFAULT_print_page_foot;
+$print_head_navigation = \&T2H_DEFAULT_print_head_navigation;
+$print_foot_navigation = \&T2H_DEFAULT_print_foot_navigation;
+$button_icon_img = \&T2H_DEFAULT_button_icon_img;
+$print_navigation = \&T2H_DEFAULT_print_navigation;
+$about_body = \&T2H_DEFAULT_about_body;
+$print_frame = \&T2H_DEFAULT_print_frame;
+$print_toc_frame = \&T2H_DEFAULT_print_toc_frame;
+#$toc_body = \&T2H_DEFAULT_toc_body;
+$titlepage = \&T2H_DEFAULT_titlepage;
+$css_lines = \&T2H_DEFAULT_css_lines;
+$print_redirection_page = \&T2H_DEFAULT_print_redirection_page;
+$node_file_name = \&T2H_DEFAULT_node_file_name;
+
+########################################################################
+# Layout for html for every sections
+#
+sub T2H_DEFAULT_print_section
+{
+ my $fh = shift;
+ my $first_in_page = shift;
+ my $previous_is_top = shift;
+ my $buttons = \@SECTION_BUTTONS;
+
+ if ($first_in_page and $SECTION_NAVIGATION)
+ {
+ &$print_head_navigation($fh, $buttons);
+ }
+ else
+ { # got to do this here, as it isn't done in print_head_navigation
+ main::print_lines($fh, $Texi2HTML::THIS_HEADER);
+ &$print_navigation($fh, $buttons) if ($SECTION_NAVIGATION);
+ }
+ my $nw = main::print_lines($fh);
+ if (defined $SPLIT
+ and (($SPLIT eq 'node') && $SECTION_NAVIGATION))
+ {
+ &$print_foot_navigation($fh);
+ print $fh "$SMALL_RULE\n";
+ &$print_navigation($fh, \@NODE_FOOTER_BUTTONS) if (!defined($WORDS_IN_PAGE) or (defined ($nw)
+ and $nw >= $WORDS_IN_PAGE));
+ }
+}
+
+sub T2H_DEFAULT_one_section($)
+{
+ my $fh = shift;
+ main::print_lines($fh, $Texi2HTML::THIS_HEADER);
+ main::print_lines($fh);
+ print $fh "$SMALL_RULE\n";
+ &$print_foot_navigation($fh);
+ &$print_page_foot($fh);
+}
+
+###################################################################
+# Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
+# @html within the Top texinfo node to specify content of top-level
+# page.
+#
+# If you enclose everything in @ifnothtml, then title, subtitle,
+# author and overview is printed
+# Texi2HTML::HREF of Next, Prev, Up, Forward, Back are not defined
+# if $T2H_SPLIT then Top page is in its own html file
+sub T2H_DEFAULT_print_Top_header($$)
+{
+ my $fh = shift;
+ my $do_page_head = shift;
+ &$print_page_head($fh) if ($do_page_head);
+}
+sub T2H_DEFAULT_print_Top_footer($$)
+{
+ my $fh = shift;
+ my $end_page = shift;
+ my $buttons = \@MISC_BUTTONS;
+ &$print_foot_navigation($fh);
+ print $fh "$SMALL_RULE\n";
+ if ($end_page)
+ {
+ &$print_navigation($fh, $buttons);
+ &$print_page_foot($fh);
+ }
+}
+sub T2H_DEFAULT_print_Top
+{
+ my $fh = shift;
+ my $has_top_heading = shift;
+
+ # for redefining navigation buttons use:
+ # my $buttons = [...];
+ # as it is, 'Top', 'Contents', 'Index', 'About' are printed
+ my $buttons = \@MISC_BUTTONS;
+ &$print_head_navigation($fh, $buttons);
+ my $nw;
+ if ($Texi2HTML::THIS_SECTION)
+ {
+ # if top-level node has content, then print it with extra header
+ #print $fh "<h1>$Texi2HTML::NAME{Top}</h1>\n"
+ print $fh "<h1 class=\"settitle\">$Texi2HTML::NAME{Top}</h1>\n"
+ unless ($has_top_heading);
+ $nw = main::print_lines($fh, $Texi2HTML::THIS_SECTION);
+ }
+ else
+ {
+ # top-level node is fully enclosed in @ifnothtml
+ # print fulltitle, subtitle, author, Overview
+ print $fh $Texi2HTML::TITLEPAGE;
+ if (@{$Texi2HTML::OVERVIEW})
+ {
+ print $fh '<h2> ' . &$I('Overview:') . "</h2>\n" . "<blockquote>\n";
+ my $nw = main::print_lines($fh, $Texi2HTML::OVERVIEW);
+ print $fh "</blockquote>\n";
+ }
+ }
+}
+
+###################################################################
+# Layout of Toc, Overview, and Footnotes pages
+# By default, we use "normal" layout
+# Texi2HTML::HREF of Next, Prev, Up, Forward, Back, etc are not defined
+# use: my $buttons = [...] to redefine navigation buttons
+sub T2H_DEFAULT_print_Toc
+{
+ return &$print_misc(@_);
+}
+sub T2H_DEFAULT_print_Overview
+{
+ return &$print_misc(@_);
+}
+sub T2H_DEFAULT_print_Footnotes
+{
+ return &$print_misc(@_);
+}
+sub T2H_DEFAULT_print_About
+{
+ return &$print_misc(@_);
+}
+
+sub T2H_DEFAULT_print_misc_header
+{
+ my $fh = shift;
+ my $buttons = shift;
+ &$print_page_head($fh) if $SPLIT;
+ &$print_head_navigation($fh, $buttons);
+}
+
+sub T2H_DEFAULT_print_misc_footer
+{
+ my $fh = shift;
+ my $buttons = shift;
+ my $nwords = shift;
+ &$print_foot_navigation($fh, $buttons);
+ print $fh "$SMALL_RULE\n";
+ if ($SPLIT)
+ {
+ &$print_navigation($fh, $buttons);# if ($SPLIT ne 'node');
+ &$print_page_foot($fh);
+ }
+}
+
+sub T2H_DEFAULT_print_misc
+{
+ my $fh = shift;
+ my $buttons = \@MISC_BUTTONS;
+ &$print_misc_header($fh, $buttons);
+ print $fh "<h1>$Texi2HTML::NAME{This}</h1>\n";
+ main::print_lines($fh);
+ &$print_misc_footer($fh, $buttons);
+}
+##################################################################
+# section_footer is only called if SPLIT eq 'section'
+# section_footer: after print_section of last section, before print_page_foot
+#
+
+sub T2H_DEFAULT_print_section_footer
+{
+ my $fh = shift;
+ my $buttons = \@SECTION_FOOTER_BUTTONS;
+ &$end_section ($fh, 1);
+ &$print_navigation($fh, $buttons);
+}
+
+###################################################################
+# chapter_header and chapter_footer are only called if
+# SPLIT eq 'chapter'
+# chapter_header: after print_page_head, before print_section
+# chapter_footer: after print_section of last section, before print_page_foot
+#
+# If you want to get rid of navigation stuff after each section,
+# redefine print_section such that it does not call print_navigation,
+# and put print_navigation into print_chapter_header
+sub T2H_DEFAULT_print_chapter_header
+{
+ # nothing to do there, by default, the navigation panel
+ # is the section navigation panel
+ if (! $SECTION_NAVIGATION)
+ { # in this case print_navigation is called here.
+ my $fh = shift;
+ my $buttons = \@CHAPTER_BUTTONS;
+ &$print_head_navigation($fh, $buttons); #do that instead ?
+ #&$print_head_navigation($fh, $buttons); # FIXME VERTICAL_HEAD_NAVIGATION ?
+ print $fh "\n$MIDDLE_RULE\n";
+ }
+}
+
+sub T2H_DEFAULT_print_chapter_footer
+{
+ my $fh = shift;
+ my $buttons = \@CHAPTER_BUTTONS;
+ &$print_foot_navigation($fh);
+ print $fh "$BIG_RULE\n";
+ &$print_navigation($fh, $buttons);
+}
+
+sub T2H_DEFAULT_print_section_header
+{
+ # nothing to do there, by default
+ if (! $SECTION_NAVIGATION)
+ { # in this case print_navigation is called here.
+ my $fh = shift;
+ my $buttons = \@SECTION_BUTTONS;
+ &$print_head_navigation($fh, $buttons);
+ }
+}
+
+###################################################################
+# Layout of standard header and footer
+#
+
+sub T2H_DEFAULT_print_page_head($)
+{
+ my $fh = shift;
+ my $longtitle = "$Texi2HTML::THISDOC{'title_unformatted'}";
+ $longtitle .= ": $Texi2HTML::UNFORMATTED{'This'}" if exists $Texi2HTML::UNFORMATTED{'This'};
+ #my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}";
+ #$longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'};
+ my $description = $DOCUMENT_DESCRIPTION;
+ $description = $longtitle if (!defined($description));
+ $description = "<meta name=\"description\" content=\"$description\">" if
+ ($description ne '');
+ $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'}));
+ my $encoding = '';
+ $encoding = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$ENCODING\">" if (defined($ENCODING) and ($ENCODING ne ''));
+ print $fh <<EOT;
+$DOCTYPE
+<html>
+$Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
+<!--
+$Texi2HTML::THISDOC{program_authors}
+-->
+<head>
+<title>$longtitle</title>
+
+$description
+<meta name="keywords" content="$longtitle">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
+$encoding
+$CSS_LINES
+$EXTRA_HEAD
+</head>
+
+<body $BODYTEXT>
+$AFTER_BODY_OPEN
+EOT
+}
+
+sub program_string()
+{
+ my $user = $Texi2HTML::THISDOC{'user'};
+ my $date = $Texi2HTML::THISDOC{'today'};
+ $user = '' if (!defined($user));
+ $date = '' if (!defined($date));
+ if (($user ne '') and ($date ne ''))
+ {
+ return &$I('This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.', {
+ 'user' => $user, 'date' => $date, 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} });
+ }
+ elsif ($user ne '')
+ {
+ return &$I('This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.', {
+ 'user' => $user, 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} });
+ }
+ elsif ($date ne '')
+ {
+ return &$I('This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.', {
+ 'date' => $date, 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program' => $Texi2HTML::THISDOC{'program'} });
+ }
+ return &$I('This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.', {
+ 'program_homepage' => $Texi2HTML::THISDOC{'program_homepage'}, 'program'
+=> $Texi2HTML::THISDOC{'program'} });
+}
+
+sub T2H_DEFAULT_end_section($$)
+{
+ my $fh = shift;
+ my $end_foot_navigation = shift;
+ &$print_foot_navigation($fh) if ($end_foot_navigation);
+ print $fh "$BIG_RULE\n";
+}
+
+sub T2H_DEFAULT_print_page_foot($)
+{
+ my $fh = shift;
+ my $program_string = program_string();
+ print $fh <<EOT;
+<p>
+ <font size="-1">
+ $program_string
+ </font>
+ <br>
+$PRE_BODY_CLOSE
+</p>
+</body>
+</html>
+EOT
+}
+
+###################################################################
+# Layout of navigation panel
+
+sub T2H_DEFAULT_print_head_navigation($$)
+{
+ my $fh = shift;
+ my $buttons = shift;
+ if ($VERTICAL_HEAD_NAVIGATION)
+ {
+ print $fh <<EOT;
+<table border="0" cellpadding="0" cellspacing="0">
+<tr valign="top">
+<td align="left">
+EOT
+ }
+ main::print_lines($fh, $Texi2HTML::THIS_HEADER);
+ &$print_navigation($fh, $buttons, $VERTICAL_HEAD_NAVIGATION);
+ if ($VERTICAL_HEAD_NAVIGATION)
+ {
+ print $fh <<EOT;
+</td>
+<td align="left">
+EOT
+ }
+ elsif (defined $SPLIT
+ and ($SPLIT eq 'node'))
+ {
+ print $fh "$SMALL_RULE\n";
+ }
+}
+
+sub T2H_DEFAULT_print_foot_navigation
+{
+ my $fh = shift;
+ if ($VERTICAL_HEAD_NAVIGATION)
+ {
+ print $fh <<EOT;
+</td>
+</tr>
+</table>
+EOT
+ }
+}
+
+######################################################################
+# navigation panel
+#
+# how to create IMG tag
+sub T2H_DEFAULT_button_icon_img
+{
+ my $button = shift;
+ my $icon = shift;
+ my $name = shift;
+ return '' if (!defined($icon));
+ if (defined($name) && $name)
+ {
+ $name = ": $name";
+ }
+ else
+ {
+ $name = '';
+ }
+ $button = "" if (!defined ($button));
+ return qq{<img src="$icon" border="0" alt="$button$name" align="middle">};
+}
+
+sub T2H_DEFAULT_print_navigation
+{
+ my $fh = shift;
+ my $buttons = shift;
+ my $vertical = shift;
+ my $spacing = 1;
+ print $fh '<table cellpadding="', $spacing, '" cellspacing="', $spacing,
+ "\" border=\"0\">\n";
+
+ print $fh "<tr>" unless $vertical;
+ for my $button (@$buttons)
+ {
+ print $fh qq{<tr valign="top" align="left">\n} if $vertical;
+ print $fh qq{<td valign="middle" align="left">};
+
+ if (ref($button) eq 'CODE')
+ {
+ &$button($fh, $vertical);
+ }
+ elsif (ref($button) eq 'SCALAR')
+ {
+ print $fh "$$button" if defined($$button);
+ }
+ elsif (ref($button) eq 'ARRAY')
+ {
+ my $text = $button->[1];
+ my $button_href = $button->[0];
+ if (defined($button_href) and !ref($button_href)
+ and defined($text) and (ref($text) eq 'SCALAR') and defined($$text))
+ { # use given text
+ if ($Texi2HTML::HREF{$button_href})
+ {
+ print $fh "" .
+ &$anchor('',
+ $Texi2HTML::HREF{$button_href},
+ $$text
+ )
+ ;
+ }
+ else
+ {
+ print $fh $$text;
+ }
+ }
+ }
+ elsif ($button eq ' ')
+ { # handle space button
+ print $fh
+ $ICONS && $ACTIVE_ICONS{' '} ?
+ &$button_icon_img($button, $ACTIVE_ICONS{' '}) :
+ $NAVIGATION_TEXT{' '};
+ #next;
+ }
+ elsif ($Texi2HTML::HREF{$button})
+ { # button is active
+ my $btitle = $BUTTONS_GOTO{$button} ?
+ 'title="' . ucfirst($BUTTONS_GOTO{$button}) . '"' : '';
+ if ($ICONS && $ACTIVE_ICONS{$button})
+ { # use icon
+ print $fh '' .
+ &$anchor('',
+ $Texi2HTML::HREF{$button},
+ &$button_icon_img($button,
+ $ACTIVE_ICONS{$button},
+ #$Texi2HTML::NAME{$button}),
+ $Texi2HTML::NO_TEXI{$button}),
+ $btitle
+ );
+ }
+ else
+ { # use text
+ print $fh
+ '[' .
+ &$anchor('',
+ $Texi2HTML::HREF{$button},
+ $NAVIGATION_TEXT{$button},
+ $btitle
+ ) .
+ ']';
+ }
+ }
+ else
+ { # button is passive
+ print $fh
+ $ICONS && $PASSIVE_ICONS{$button} ?
+ &$button_icon_img($button,
+ $PASSIVE_ICONS{$button},
+ #$Texi2HTML::NAME{$button}) :
+ $Texi2HTML::NO_TEXI{$button}) :
+
+ "[" . $NAVIGATION_TEXT{$button} . "]";
+ }
+ print $fh "</td>\n";
+ print $fh "</tr>\n" if $vertical;
+ }
+ print $fh "</tr>" unless $vertical;
+ print $fh "</table>\n";
+}
+
+######################################################################
+# Frames: this is from "Richard Y. Kim" <ryk@coho.net>
+# Should be improved to be more conforming to other _print* functions
+# FIXME pass toc_file and main_file as args or in $Texi2HTML::THISDOC ?
+
+sub T2H_DEFAULT_print_frame
+{
+ my $fh = shift;
+ my $toc_file = shift;
+ my $main_file = shift;
+ print $fh <<EOT;
+$FRAMESET_DOCTYPE
+<html>
+<head><title>$Texi2HTML::THISDOC{title}</title></head>
+<frameset cols="140,*">
+ <frame name="toc" src="$toc_file">
+ <frame name="main" src="$main_file">
+</frameset>
+</html>
+EOT
+}
+
+sub T2H_DEFAULT_print_toc_frame
+{
+ my $fh = shift;
+ my $stoc_lines = shift;
+ &$print_page_head($fh);
+ print $fh <<EOT;
+<h2>Content</h2>
+EOT
+ print $fh map {s/\bhref=/target="main" href=/; $_;} @$stoc_lines;
+ print $fh "</body></html>\n";
+}
+
+# This subroutine is intended to fill @Texi2HTML::TOC_LINES and
+# @Texi2HTML::OVERVIEW with the table of contents and short table of
+# contents.
+#
+# arguments:
+# ref on an array containing all the elements
+
+# each element is a reference on a hash. The following keys might be of
+# use:
+# 'top': true if this is the top element
+# 'index_page': true if the element is an index page added because of index
+# splitting
+# 'toc_level': level of the element in the table of content. Highest level
+# is 1 for the @top element and for chapters, appendix and so on,
+# 2 for section, unnumberedsec and so on...
+# 'tocid': label used for reference linking to the element in table of
+# contents
+# 'file': the file containing the element, usefull to do href to that file
+# in case the document is split.
+# 'text': text of the element, with section number
+# 'name': text of the element, without section number
+
+# Relevant configuration variables are:
+# $NUMBER_SECTIONS
+# $TOC_LIST_ATTRIBUTE: usefull in case a list is used
+# $FRAMES: @Texi2HTML::OVERVIEW is used in one of the frames.
+# $BEFORE_OVERVIEW
+# $AFTER_OVERVIEW
+# $BEFORE_TOC_LINES
+# $AFTER_TOC_LINES
+# $DO_CONTENTS
+# $DO_SCONTENTS
+
+sub T2H_DEFAULT_toc_body($)
+{
+}
+
+sub T2H_DEFAULT_css_lines ($$)
+{
+ my $import_lines = shift;
+ my $rule_lines = shift;
+ return if (defined($CSS_LINES) or (!@$rule_lines and !@$import_lines and (! keys(%css_map))));
+ $CSS_LINES = "<style type=\"text/css\">\n<!--\n";
+ $CSS_LINES .= join('',@$import_lines) . "\n" if (@$import_lines);
+ foreach my $css_rule (sort(keys(%css_map)))
+ {
+ next unless ($css_map{$css_rule});
+ $CSS_LINES .= "$css_rule {$css_map{$css_rule}}\n";
+ }
+ $CSS_LINES .= join('',@$rule_lines) . "\n" if (@$rule_lines);
+ $CSS_LINES .= "-->\n</style>\n";
+}
+
+######################################################################
+# About page
+#
+
+# PRE_ABOUT can be a function reference or a scalar.
+# Note that if it is a scalar, T2H_InitGlobals has not been called,
+# and all global variables like $ADDRESS are not available.
+$PRE_ABOUT = sub
+{
+ return ' ' . program_string() . "\n";
+};
+
+# If customizing $AFTER_ABOUT, be sure to put the content inside <p></p>.
+$AFTER_ABOUT = '';
+
+%BUTTONS_EXAMPLE =
+ (
+ 'Top', ' &nbsp; ',
+ 'Contents', ' &nbsp; ',
+ 'Overview', ' &nbsp; ',
+ 'Index', ' &nbsp; ',
+ 'This', '1.2.3',
+ 'Back', '1.2.2',
+ 'FastBack', '1',
+ 'Prev', '1.2.2',
+ 'Up', '1.2',
+ 'Next', '1.2.4',
+ 'NodeUp', '1.2',
+ 'NodeNext', '1.2.4',
+ 'NodePrev', '1.2.2',
+ 'Following', '1.2.4',
+ 'Forward', '1.2.4',
+ 'FastForward', '2',
+ 'About', ' &nbsp; ',
+ 'First', '1.',
+ 'Last', '1.2.4',
+ );
+
+sub T2H_DEFAULT_about_body
+{
+ my $about = "<p>\n";
+ if (ref($PRE_ABOUT) eq 'CODE')
+ {
+ $about .= &$PRE_ABOUT();
+ }
+ else
+ {
+ $about .= $PRE_ABOUT;
+ }
+ $about .= <<EOT;
+</p>
+<p>
+EOT
+ $about .= &$I(' The buttons in the navigation panels have the following meaning:') . "\n";
+ $about .= <<EOT;
+</p>
+<table border="1">
+ <tr>
+EOT
+ $about .= ' <th> ' . &$I('Button') . " </th>\n" .
+' <th> ' . &$I('Name') . " </th>\n" .
+' <th> ' . &$I('Go to') . " </th>\n" .
+' <th> ' . &$I('From 1.2.3 go to') . "</th>\n" . " </tr>\n";
+
+ for my $button (@SECTION_BUTTONS)
+ {
+ next if $button eq ' ' || ref($button) eq 'CODE' || ref($button) eq 'SCALAR' || ref($button) eq 'ARRAY';
+ $about .= " <tr>\n <td align=\"center\">";
+ $about .=
+ ($ICONS && $ACTIVE_ICONS{$button} ?
+ &$button_icon_img($button, $ACTIVE_ICONS{$button}) :
+ ' [' . $NAVIGATION_TEXT{$button} . '] ');
+ $about .= "</td>\n";
+ $about .= <<EOT;
+ <td align="center">$button</td>
+ <td>$BUTTONS_GOTO{$button}</td>
+ <td>$BUTTONS_EXAMPLE{$button}</td>
+ </tr>
+EOT
+ }
+
+ $about .= <<EOT;
+</table>
+
+<p>
+EOT
+ $about .= &$I(' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:') . "\n";
+
+# where the <strong> Example </strong> assumes that the current position
+# is at <strong> Subsubsection One-Two-Three </strong> of a document of
+# the following structure:
+ $about .= <<EOT;
+</p>
+
+<ul>
+EOT
+ $about .= ' <li> 1. ' . &$I('Section One') . "\n" .
+" <ul>\n" .
+' <li>1.1 ' . &$I('Subsection One-One') . "\n";
+ $about .= <<EOT;
+ <ul>
+ <li>...</li>
+ </ul>
+ </li>
+EOT
+ $about .= ' <li>1.2 ' . &$I('Subsection One-Two') . "\n" .
+" <ul>\n" .
+' <li>1.2.1 ' . &$I('Subsubsection One-Two-One') . "</li>\n" .
+' <li>1.2.2 ' . &$I('Subsubsection One-Two-Two') . "</li>\n" .
+' <li>1.2.3 ' . &$I('Subsubsection One-Two-Three') . " &nbsp; &nbsp;\n"
+.
+' <strong>&lt;== ' . &$I('Current Position') . " </strong></li>\n" .
+' <li>1.2.4 ' . &$I('Subsubsection One-Two-Four') . "</li>\n" .
+" </ul>\n" .
+" </li>\n" .
+' <li>1.3 ' . &$I('Subsection One-Three') . "\n";
+ $about .= <<EOT;
+ <ul>
+ <li>...</li>
+ </ul>
+ </li>
+EOT
+ $about .= ' <li>1.4 ' . &$I('Subsection One-Four') . "</li>\n";
+ $about .= <<EOT;
+ </ul>
+ </li>
+</ul>
+$AFTER_ABOUT
+EOT
+ return $about;
+}
+
+sub T2H_DEFAULT_titlepage()
+{
+ my $result = '';
+ if (@{$Texi2HTML::THISDOC{'titles'}}
+ or @{$Texi2HTML::THISDOC{'subtitles'}}
+ or @{$Texi2HTML::THISDOC{'authors'}})
+ {
+ $result = "<div align=\"center\">\n";
+ foreach my $title (@{$Texi2HTML::THISDOC{'titles'}})
+ {
+ $result .= '<h1>' . $title . "</h1>\n";
+ }
+ foreach my $subtitle (@{$Texi2HTML::THISDOC{'subtitles'}})
+ {
+ $result .= '<h2>' . $subtitle . "</h2>\n";
+ }
+ foreach my $author (@{$Texi2HTML::THISDOC{'authors'}})
+ {
+ $result .= '<strong> ' . $author . " </strong><br>\n";
+ }
+ $result .= "</div>\n$DEFAULT_RULE\n";
+ }
+
+ $Texi2HTML::TITLEPAGE = $result . $Texi2HTML::TITLEPAGE;
+}
+
+# i18n
+sub T2H_DEFAULT_print_redirection_page($)
+{
+ my $fh = shift;
+ my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}";
+ $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'};
+ my $description = $longtitle;
+ $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'}));
+ my $href = &$anchor('', $Texi2HTML::HREF{'This'}, $Texi2HTML::NAME{'This'});
+ print $fh <<EOT;
+$DOCTYPE
+<html>
+<!-- Created on $Texi2HTML::THISDOC{'today'} by $Texi2HTML::THISDOC{'program'} -->
+<!--
+$Texi2HTML::THISDOC{'program_authors'}
+-->
+<head>
+<title>$longtitle</title>
+
+<meta name="description" content="$description">
+<meta name="keywords" content="$longtitle">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="Refresh" content="0; url=$Texi2HTML::HREF{'This'}">
+$EXTRA_HEAD
+</head>
+
+<body $BODYTEXT>
+$AFTER_BODY_OPEN
+<p>The node you are looking for is at $href.</p>
+</body>
+EOT
+}
+
+sub T2H_DEFAULT_node_file_name($)
+{
+ my $node = shift;
+ return (undef, undef) if ($node->{'external_node'} or $node->{'index_page'});
+ my $file;
+ my $node_file;
+
+ if ($NEW_CROSSREF_STYLE)
+ {
+ if (defined($node->{'file'}))
+ {
+ $file = $node->{'file'};
+ $node_file = $node->{'node_file'};
+ }
+ else
+ {
+ $node_file = $node->{'cross_manual_target'} . ".$NODE_FILE_EXTENSION";
+ $file = $node_file if (($SPLIT eq 'node') and ($USE_NODES or $node->{'with_section'}));
+ }
+ }
+ else
+ {
+ return (undef, undef) if (defined($node->{'file'}));
+ my $name = main::remove_texi($node->{'texi'});
+ $name =~ s/[^\w\.\-]/-/g;
+ $name = "${name}.$NODE_FILE_EXTENSION";
+ $file = $name if (($SPLIT eq 'node') and ($USE_NODES or $node->{'with_section'}));
+ $node_file = $name;
+ }
+ return ($file, $node_file);
+}
+
+########################################################################
+# Control of formatting:
+# 1.) For some changes, it is often enough to change the value of
+# some global map. It might necessitate building a little
+# function along with the change in hash, if the change is the use
+# of another function (in style_map).
+# 2.) For other changes, reimplement one of the t2h_default_<fnc>* routines,
+# give them another name, and assign them to the respective
+# $<fnc> variable (below).
+
+
+#
+# This hash should have keys corresponding with the nonletter command accent
+# whose following character is considered to be the argument
+# This hash associates an accent macro to the ISO name for the accent if any.
+# The customary use of this map is to find the ISO name appearing in html
+# entity (like &eacute;) associated with a texinfo accent macro.
+#
+# The keys of the hash are
+# ": umlaut
+# ~: tilda accent
+# ^: circumflex accent
+# `: grave accent
+# ': acute accent
+# =: macron accent
+%accent_map = (
+ '"', 'uml',
+ '~', 'tilde',
+ '^', 'circ',
+ '`', 'grave',
+ "'", 'acute',
+ '=', '',
+ );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+ "*", "<br>", # HTML+
+ ' ', '&nbsp;',
+ "\t", '&nbsp;',
+ "\n", '&nbsp;',
+ # "&#173;" or "&shy;" could also be possible for @-, but it seems
+ # that some browser will consider this as an always visible hyphen mark
+ # which is not what we want (see http://www.cs.tut.fi/~jkorpela/shy.html)
+ '-', '', # hyphenation hint
+ '|', '', # used in formatting commands @evenfooting and friends
+ '/', '',
+ # spacing commands
+ ':', '',
+ '!', '!',
+ '?', '?',
+ '.', '.',
+ '@', '@',
+ '}', '}',
+ '{', '{',
+ );
+
+# this map is used in preformatted text
+%simple_map_pre = %simple_map;
+$simple_map_pre{'*'} = "\n";
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+ 'TeX' => 'TeX',
+ 'LaTeX' => 'LaTeX',
+# pertusus: unknown by makeinfo, not in texinfo manual (@* is the right thing)
+# 'br', '<br>', # paragraph break
+ 'bullet' => '*',
+# #'copyright' => '(C)',
+ 'copyright' => '&copy;',
+ 'registeredsymbol' => '&reg;',
+ 'dots' => '<small class="dots">...</small>',
+ 'enddots' => '<small class="enddots">....</small>',
+ 'equiv' => '==',
+# i18n
+ 'error' => 'error--&gt;',
+ 'expansion' => '==&gt;',
+ 'minus' => '-',
+ 'point' => '-!-',
+ 'print' => '-|',
+ 'result' => '=&gt;',
+ # set in code using the language
+ # 'today', &pretty_date,
+ 'today' => '',
+ 'aa' => '&aring;',
+ 'AA' => '&Aring;',
+ 'ae' => '&aelig;',
+ 'oe' => '&oelig;', #pertusus: also &#156;. &oelig; not in html 3.2
+ 'AE' => '&AElig;',
+ 'OE' => '&OElig;', #pertusus: also &#140;. &OElig; not in html 3.2
+ 'o' => '&oslash;',
+ 'O' => '&Oslash;',
+ 'ss' => '&szlig;',
+ 'l' => '/l',
+ 'L' => '/L',
+ 'exclamdown' => '&iexcl;',
+ 'questiondown' => '&iquest;',
+ 'pounds' => '&pound;',
+ 'ordf' => '&ordf;',
+ 'ordm' => '&ordm;',
+ 'comma' => ',',
+ 'euro' => '&euro;',
+ );
+
+# This map is used in preformatted environments
+%pre_map = %things_map;
+$pre_map{'dots'} = '...';
+$pre_map{'enddots'} = '....';
+#$pre_map{'br'} = "\n";
+
+# ascii representation of @-commands
+%ascii_simple_map = (
+ "*", "\n", # HTML+
+ ' ', ' ',
+ "\t", "\t",
+ "\n", "\n",
+ '-', '', # hyphenation hint
+ '|', '', # used in formatting commands @evenfooting and friends
+ '/', '',
+ ':', '',
+ '!', '!',
+ '?', '?',
+ '.', '.',
+ '@', '@',
+ '}', '}',
+ '{', '{',
+);
+
+%ascii_things_map = (
+ 'TeX' => 'TeX',
+ 'LaTeX' => 'LaTeX',
+ 'bullet' => '*',
+ 'copyright' => '(C)',
+ 'registeredsymbol' => '(R)',
+ 'dots' => '...',
+ 'enddots' => '....',
+ 'equiv' => '==',
+# i18n
+ 'error' => 'error-->',
+ 'expansion' => '==>',
+ 'minus' => '-',
+ 'point' => '-!-',
+ 'print' => '-|',
+ 'result' => '=>',
+ 'today' => '',
+ 'aa' => 'aa',
+ 'AA' => 'AA',
+ 'ae' => 'ae',
+ 'oe' => 'oe',
+ 'AE' => 'AE',
+ 'OE' => 'OE',
+ 'o' => '/o',
+ 'O' => '/O',
+ 'ss' => 'ss',
+ 'l' => '/l',
+ 'L' => '/L',
+ 'exclamdown' => '?',
+ 'questiondown' => '!',
+ 'pounds' => '#',
+ 'ordf' => 'a',
+ 'ordm' => 'o',
+ 'comma' => ',',
+ 'euro' => 'Euro',
+);
+
+#
+# This map is used when texi elements are removed and replaced
+# by simple text
+#
+%simple_map_texi = (
+ "*", "",
+ " ", " ",
+ "\t", " ",
+ "-", "-", # soft hyphen
+ "\n", "\n",
+ "|", "",
+ # spacing commands
+ ":", "",
+ "!", "!",
+ "?", "?",
+ ".", ".",
+ "-", "",
+ '@', '@',
+ '}', '}',
+ '{', '{',
+ );
+
+# text replacing macros when texi commands are removed and plain text is
+# produced
+%texi_map = (
+ 'TeX', 'TeX',
+ 'LaTeX', 'LaTeX',
+ 'bullet', '*',
+ 'copyright', 'C',
+ 'registeredsymbol', 'R',
+ 'dots', '...',
+ 'enddots', '....',
+ 'equiv', '==',
+ 'error', 'error-->',
+ 'expansion', '==>',
+ 'minus', '-',
+ 'point', '-!-',
+ 'print', '-|',
+ 'result', '=>',
+ 'today' => '',
+ 'aa', 'aa',
+ 'AA', 'AA',
+ 'ae', 'ae',
+ 'oe', 'oe',
+ 'AE', 'AE',
+ 'OE', 'OE',
+ 'o', 'o',
+ 'O', 'O',
+ 'ss', 'ss',
+ 'l', 'l',
+ 'L', 'L',
+ 'exclamdown', '! upside-down',
+ #'exclamdown', '&iexcl;',
+ 'questiondown', '? upside-down',
+ #'questiondown', '&iquest;',
+ 'pounds', 'pound sterling',
+ #'pounds', '&pound;'
+ 'ordf' => 'a',
+ 'ordm' => 'o',
+ 'comma' => ',',
+ 'euro' => 'Euro',
+ );
+
+# taken from
+#Latin extended additionnal
+#http://www.alanwood.net/unicode/latin_extended_additional.html
+#C1 Controls and Latin-1 Supplement
+#http://www.alanwood.net/unicode/latin_1_supplement.html
+#Latin Extended-A
+#http://www.alanwood.net/unicode/latin_extended_a.html
+#Latin Extended-B
+#http://www.alanwood.net/unicode/latin_extended_b.html
+#dotless i: 0131
+%unicode_map = (
+ 'bullet' => '2022',
+ 'copyright' => '00A9',
+ 'registeredsymbol' => '00AE',
+ 'dots' => '2026',
+ 'enddots' => '',
+ 'equiv' => '2261',
+ 'error' => '',
+ 'expansion' => '2192',
+ 'minus' => '2212', # in mathematical operators
+# 'minus' => '002D', # in latin1
+ 'point' => '2217',
+ 'print' => '',
+ 'result' => '21D2',
+ 'today' => '',
+ 'aa' => '00E5',
+ 'AA' => '00C5',
+ 'ae' => '00E6',
+ 'oe' => '0153',
+ 'AE' => '00C6',
+ 'OE' => '0152',
+ 'o' => '00F8',
+ 'O' => '00D8',
+ 'ss' => '00DF',
+ 'l' => '0142',
+ 'L' => '0141',
+ 'exclamdown' => '00A1',
+ 'questiondown' => '00BF',
+ 'pounds' => '00A3',
+ 'ordf' => '00AA',
+ 'ordm' => '00BA',
+ 'comma' => '002C',
+ 'euro' => '20AC',
+ );
+
+%ascii_character_map = (
+ ' ' => '0020',
+ '!' => '0021',
+ '"' => '0022',
+ '#' => '0023',
+ '$' => '0024',
+ '%' => '0025',
+ '&' => '0026',
+ "'" => '0027',
+ '(' => '0028',
+ ')' => '0029',
+ '*' => '002A',
+ '+' => '002B',
+ ',' => '002C',
+ '-' => '002D',
+ '.' => '002E',
+ '/' => '002F',
+ ':' => '003A',
+ ';' => '003B',
+ '<' => '003C',
+ '=' => '003D',
+ '>' => '003E',
+ '?' => '003F',
+ '@' => '0040',
+ '[' => '005B',
+ '\\' => '005C',
+ ']' => '005D',
+ '^' => '005E',
+ '_' => '005F',
+ '`' => '0060',
+ '{' => '007B',
+ '|' => '007C',
+ '}' => '007D',
+ '~' => '007E',
+);
+
+%perl_charset_to_html = (
+ 'utf8' => 'utf-8',
+ 'ascii' => 'us-ascii',
+);
+
+# symbols used for the commands if $USE-ISO is true.
+%iso_symbols = (
+ 'equiv' => '&equiv;',
+ 'dots' => '&hellip;',
+ 'bullet' => '&bull;',
+ 'result' => '&rArr;',
+ 'expansion' => '&rarr;',
+ 'point' => '&lowast;',
+ );
+
+# When the value begins with & the function with that name is used to do the
+# html. The first argument is the text enclosed within {}, the second is the
+# style name (which is also the key of the hash)
+#
+# Otherwithe the value is the html element used to enclose the text, and if
+# there is a " the resulting text is also enclosed within `'
+my %old_style_map = (
+ 'acronym', '',
+ 'asis', '',
+ 'b', 'b',
+ 'cite', 'cite',
+ 'code', 'code',
+ 'command', 'code',
+ 'ctrl', '&default_ctrl',
+ 'dfn', 'em',
+ 'dmn', '',
+ 'email', '&default_email',
+ 'emph', 'em',
+ 'env', 'code',
+ 'file', '"tt',
+ 'i', 'i',
+ 'kbd', 'kbd',
+ 'key', 'kbd',
+ 'math', 'em',
+ 'option', '"samp',
+ 'r', '',
+ 'samp', '"samp',
+ 'sc', '&default_sc',
+ 'strong', 'strong',
+ 't', 'tt',
+ 'uref', '&default_uref',
+ 'url', '&default_url',
+ 'var', 'var',
+ 'verb', 'tt',
+ 'titlefont', '&default_titlefont',
+ 'w', '',
+ );
+
+# default is {'args' => ['normal'], 'attribute' => ''},
+%style_map = (
+ 'asis', {},
+ 'b', {'attribute' => 'b'},
+ 'cite', {'attribute' => 'cite'},
+ 'code', {'args' => ['code'], 'attribute' => 'code'},
+ 'command', {'args' => ['code'], 'attribute' => 'code'},
+ 'ctrl', {'function' => \&t2h_default_ctrl},
+ 'dfn', {'attribute' => 'em'},
+ 'dmn', {},
+ 'email', {'args' => ['code', 'normal'],
+ 'function' => \&t2h_default_email},
+ #'email', {'args' => ['normal', 'normal'],
+ # 'function' => \&t2h_default_email},
+ 'emph', {'attribute' => 'em'},
+ 'env', {'args' => ['code'], 'attribute' => 'code'},
+ 'file', {'args' => ['code'], 'attribute' => 'tt', 'quote' => '"'},
+ 'i', {'attribute' => 'i'},
+ 'slanted', {'attribute' => 'i'},
+ 'sansserif', {'attribute' => 'span class="sansserif"'},
+ 'kbd', {'args' => ['code'], 'attribute' => 'kbd'},
+ 'key', {'attribute' => 'kbd'},
+ 'math', {'attribute' => 'em'},
+ 'option', {'args' => ['code'], 'attribute' => 'samp', 'quote' => '"'},
+ 'r', {},
+ 'samp', {'args' => ['code'], 'attribute' => 'samp', 'quote' => '"'},
+ 'sc', {'function' => \&t2h_default_sc},
+ 'strong', {'attribute' => 'strong'},
+ 't', {'attribute' => 'tt'},
+ 'uref', {'function' => \&t2h_default_uref,
+ 'args' => ['code', 'normal', 'normal']},
+ #'uref', {'function' => \&t2h_default_uref,
+ # 'args' => ['normal', 'normal', 'normal']},
+ 'url', {'function' => \&t2h_default_uref,
+ 'args' => ['code', 'normal', 'normal']},
+ 'indicateurl', {'args' => ['code'], 'begin' => '&lt;<code>', 'end' => '</code>&gt;'},
+ 'var', {'attribute' => 'var'},
+ 'verb', {'args' => ['code'], 'attribute' => 'tt'},
+ 'titlefont', {'function' => \&t2h_default_titlefont},
+ 'w', {},
+ );
+
+%unicode_diacritical = (
+ 'H' => '030B',
+ 'ringaccent' => '030A',
+ "'" => '0301',
+ 'v' => '030C',
+ ',' => '0327',
+ '^' => '0302',
+ 'dotaccent' => '0307',
+ '`' => '0300',
+ '=' => '0304',
+ '~' => '0303',
+ '"' => '0308',
+ 'udotaccent' => '0323',
+ 'ubaraccent' => '0332',
+ 'u' => '0306'
+);
+
+%unicode_accents = (
+ 'dotaccent' => { # dot above
+ 'A' => '0226', #C moz-1.2
+ 'a' => '0227', #c moz-1.2
+ 'B' => '1E02',
+ 'b' => '1E03',
+ 'C' => '010A',
+ 'c' => '010B',
+ 'D' => '1E0A',
+ 'd' => '1E0B',
+ 'E' => '0116',
+ 'e' => '0117',
+ 'F' => '1E1E',
+ 'f' => '1E1F',
+ 'G' => '0120',
+ 'g' => '0121',
+ 'H' => '1E22',
+ 'h' => '1E23',
+ 'i' => '0069',
+ 'I' => '0130',
+ 'N' => '1E44',
+ 'n' => '1E45',
+ 'O' => '022E', #Y moz-1.2
+ 'o' => '022F', #v moz-1.2
+ 'P' => '1E56',
+ 'p' => '1E57',
+ 'R' => '1E58',
+ 'r' => '1E59',
+ 'S' => '1E60',
+ 's' => '1E61',
+ 'T' => '1E6A',
+ 't' => '1E6B',
+ 'W' => '1E86',
+ 'w' => '1E87',
+ 'X' => '1E8A',
+ 'x' => '1E8B',
+ 'Y' => '1E8E',
+ 'y' => '1E8F',
+ 'Z' => '017B',
+ 'z' => '017C',
+ },
+ 'udotaccent' => { # dot below
+ 'B' => '1E04',
+ 'b' => '1E05',
+ 'D' => '1E0C',
+ 'd' => '1E0D',
+ 'E' => '1EB8',
+ 'e' => '1EB9',
+ 'H' => '1E24',
+ 'h' => '1E25',
+ 'I' => '1ECA',
+ 'i' => '1ECB',
+ 'K' => '1E32',
+ 'k' => '1E33',
+ 'L' => '1E36',
+ 'l' => '1E37',
+ 'M' => '1E42',
+ 'm' => '1E43',
+ 'N' => '1E46',
+ 'n' => '1E47',
+ 'O' => '1ECC',
+ 'o' => '1ECD',
+ 'R' => '1E5A',
+ 'r' => '1E5B',
+ 'S' => '1E62',
+ 's' => '1E63',
+ 'T' => '1E6C',
+ 't' => '1E6D',
+ 'U' => '1EE4',
+ 'u' => '1EE5',
+ 'V' => '1E7E',
+ 'v' => '1E7F',
+ 'W' => '1E88',
+ 'w' => '1E89',
+ 'Y' => '1EF4',
+ 'y' => '1EF5',
+ 'Z' => '1E92',
+ 'z' => '1E93',
+ },
+ 'ubaraccent' => { # line below
+ 'B' => '1E06',
+ 'b' => '1E07',
+ 'D' => '1E0E',
+ 'd' => '1E0F',
+ 'h' => '1E96',
+ 'K' => '1E34',
+ 'k' => '1E35',
+ 'L' => '1E3A',
+ 'l' => '1E3B',
+ 'N' => '1E48',
+ 'n' => '1E49',
+ 'R' => '1E5E',
+ 'r' => '1E5F',
+ 'T' => '1E6E',
+ 't' => '1E6F',
+ 'Z' => '1E94',
+ 'z' => '1E95',
+ },
+ ',' => { # cedilla
+ 'C' => '00C7',
+ 'c' => '00E7',
+ 'D' => '1E10',
+ 'd' => '1E11',
+ 'E' => '0228', #C moz-1.2
+ 'e' => '0229', #c moz-1.2
+ 'G' => '0122',
+ 'g' => '0123',
+ 'H' => '1E28',
+ 'h' => '1E29',
+ 'K' => '0136',
+ 'k' => '0137',
+ 'L' => '013B',
+ 'l' => '013C',
+ 'N' => '0145',
+ 'n' => '0146',
+ 'R' => '0156',
+ 'r' => '0157',
+ 'S' => '015E',
+ 's' => '015F',
+ 'T' => '0162',
+ 't' => '0163',
+ },
+ '=' => { # macron
+ 'A' => '0100',
+ 'a' => '0101',
+ 'E' => '0112',
+ 'e' => '0113',
+ 'I' => '012A',
+ 'i' => '012B',
+ 'G' => '1E20',
+ 'g' => '1E21',
+ 'O' => '014C',
+ 'o' => '014D',
+ 'U' => '016A',
+ 'u' => '016B',
+ 'Y' => '0232', #? moz-1.2
+ 'y' => '0233', #? moz-1.2
+ },
+ '"' => { # diaeresis
+ 'A' => '00C4',
+ 'a' => '00E4',
+ 'E' => '00CB',
+ 'e' => '00EB',
+ 'H' => '1E26',
+ 'h' => '1E27',
+ 'I' => '00CF',
+ 'i' => '00EF',
+ 'O' => '00D6',
+ 'o' => '00F6',
+ 't' => '1E97',
+ 'U' => '00DC',
+ 'u' => '00FC',
+ 'W' => '1E84',
+ 'w' => '1E85',
+ 'X' => '1E8C',
+ 'x' => '1E8D',
+ 'y' => '00FF',
+ 'Y' => '0178',
+ },
+ 'u' => { # breve
+ 'A' => '0101',
+ 'a' => '0102',
+ 'E' => '0114',
+ 'e' => '0115',
+ 'G' => '011E',
+ 'g' => '011F',
+ 'I' => '012C',
+ 'i' => '012D',
+ 'O' => '014E',
+ 'o' => '014F',
+ 'U' => '016C',
+ 'u' => '016D',
+ },
+ "'" => { # acute
+ 'A' => '00C1',
+ 'a' => '00E1',
+ 'C' => '0106',
+ 'c' => '0107',
+ 'E' => '00C9',
+ 'e' => '00E9',
+ 'G' => '01F4',
+ 'g' => '01F5',
+ 'I' => '00CD',
+ 'i' => '00ED',
+ 'K' => '1E30',
+ 'k' => '1E31',
+ 'L' => '0139',
+ 'l' => '013A',
+ 'M' => '1E3E',
+ 'm' => '1E3F',
+ 'N' => '0143',
+ 'n' => '0144',
+ 'O' => '00D3',
+ 'o' => '00F3',
+ 'P' => '1E54',
+ 'p' => '1E55',
+ 'R' => '0154',
+ 'r' => '0155',
+ 'S' => '015A',
+ 's' => '015B',
+ 'U' => '00DA',
+ 'u' => '00FA',
+ 'W' => '1E82',
+ 'w' => '1E83',
+ 'Y' => '00DD',
+ 'y' => '00FD',
+ 'Z' => '0179',
+ 'z' => '018A',
+ },
+ '~' => { # tilde
+ 'A' => '00C3',
+ 'a' => '00E3',
+ 'E' => '1EBC',
+ 'e' => '1EBD',
+ 'I' => '0128',
+ 'i' => '0129',
+ 'N' => '00D1',
+ 'n' => '00F1',
+ 'O' => '00D5',
+ 'o' => '00F5',
+ 'U' => '0168',
+ 'u' => '0169',
+ 'V' => '1E7C',
+ 'v' => '1E7D',
+ 'Y' => '1EF8',
+ 'y' => '1EF9',
+ },
+ '`' => { # grave
+ 'A' => '00C0',
+ 'a' => '00E0',
+ 'E' => '00C8',
+ 'e' => '00E8',
+ 'I' => '00CC',
+ 'i' => '00EC',
+ 'N' => '01F8',
+ 'n' => '01F9',
+ 'O' => '00D2',
+ 'o' => '00F2',
+ 'U' => '00D9',
+ 'u' => '00F9',
+ 'W' => '1E80',
+ 'w' => '1E81',
+ 'Y' => '1EF2',
+ 'y' => '1EF3',
+ },
+ '^' => { # circumflex
+ 'A' => '00C2',
+ 'a' => '00E2',
+ 'C' => '0108',
+ 'c' => '0109',
+ 'E' => '00CA',
+ 'e' => '00EA',
+ 'G' => '011C',
+ 'g' => '011D',
+ 'H' => '0124',
+ 'h' => '0125',
+ 'I' => '00CE',
+ 'i' => '00EE',
+ 'J' => '0134',
+ 'j' => '0135',
+ 'O' => '00D4',
+ 'o' => '00F4',
+ 'S' => '015C',
+ 's' => '015D',
+ 'U' => '00DB',
+ 'u' => '00FB',
+ 'W' => '0174',
+ 'w' => '0175',
+ 'Y' => '0176',
+ 'y' => '0177',
+ 'Z' => '1E90',
+ 'z' => '1E91',
+ },
+ 'ringaccent' => { # ring
+ 'A' => '00C5',
+ 'a' => '00E5',
+ 'U' => '016E',
+ 'u' => '016F',
+ 'w' => '1E98',
+ 'y' => '1E99',
+ },
+ 'v' => { # caron
+ 'A' => '01CD',
+ 'a' => '01CE',
+ 'C' => '010C',
+ 'c' => '010D',
+ 'D' => '010E',
+ 'd' => '010F',
+ 'E' => '011A',
+ 'e' => '011B',
+ 'G' => '01E6',
+ 'g' => '01E7',
+ 'H' => '021E', #K with moz-1.2
+ 'h' => '021F', #k with moz-1.2
+ 'I' => '01CF',
+ 'i' => '01D0',
+ 'K' => '01E8',
+ 'k' => '01E9',
+ 'L' => '013D', #L' with moz-1.2
+ 'l' => '013E', #l' with moz-1.2
+ 'N' => '0147',
+ 'n' => '0148',
+ 'O' => '01D1',
+ 'o' => '01D2',
+ 'R' => '0158',
+ 'r' => '0159',
+ 'S' => '0160',
+ 's' => '0161',
+ 'T' => '0164',
+ 't' => '0165',
+ 'U' => '01D3',
+ 'u' => '01D4',
+ 'Z' => '017D',
+ 'z' => '017E',
+ },
+ 'H' => { # double acute
+ 'O' => '0150',
+ 'o' => '0151',
+ 'U' => '0170',
+ 'u' => '0171',
+ },
+);
+
+%special_accents = (
+ 'ringaccent' => 'aA',
+ "'" => 'aeiouyAEIOUY',
+ ',' => 'cC',
+ '^' => 'aeiouAEIOU',
+ '`' => 'aeiouAEIOU',
+ '~' => 'nNaoAO',
+ '"' => 'aeiouyAEIOU',
+);
+
+#foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents), keys(%accent_map))
+foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents))
+{
+ $style_map{$accent_command} = { 'function' => \&t2h_default_accent };
+ $old_style_map{$accent_command} = '&default_accent';
+ $style_map_texi{$accent_command} = { 'function' => \&t2h_default_ascii_accent };
+}
+
+sub default_accent($$)
+{
+ my $text = shift;
+ my $accent = shift;
+ return "&${text}$accent_map{$accent};" if (defined($accent_map{$accent}) and defined($special_accents{$accent}) and ($text =~ /^[$special_accents{$accent}]$/));
+ return '&' . $text . 'ring;' if (($accent eq 'ringaccent') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+ return $text . '&lt;' if ($accent eq 'v');
+ return "&${text}cedil;" if (($accent eq ',') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+ return ascii_accents($text, $accent);
+}
+
+sub t2h_default_accent($$)
+{
+ my $accent = shift;
+ my $args = shift;
+
+ my $text = $args->[0];
+
+ return "&${text}$accent_map{$accent};" if (defined($accent_map{$accent}) and defined($special_accents{$accent}) and ($text =~ /^[$special_accents{$accent}]$/));
+ return '&' . $text . 'ring;' if (($accent eq 'ringaccent') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+ return $text . '&lt;' if ($accent eq 'v');
+ return "&${text}cedil;" if (($accent eq ',') and (defined($special_accents{$accent})) and ($text =~ /^[$special_accents{$accent}]$/));
+ return ascii_accents($text, $accent);
+}
+
+sub ascii_accents($$)
+{
+ my $text = shift;
+ my $accent = shift;
+ return $text if ($accent eq 'dotless');
+ return $text . $accent if (defined($accent_map{$accent}));
+ return $text . "''" if ($accent eq 'H');
+ return $text . '.' if ($accent eq 'dotaccent');
+ return $text . '*' if ($accent eq 'ringaccent');
+ return $text . '[' if ($accent eq 'tieaccent');
+ return $text . '(' if ($accent eq 'u');
+ return $text . '_' if ($accent eq 'ubaraccent');
+ return '.' . $text if ($accent eq 'udotaccent');
+ return $text . '<' if ($accent eq 'v');
+ return $text . ',' if ($accent eq ',');
+}
+
+sub default_sc($$)
+{
+ return '<small>' . uc($_[0]) . '</small>';
+}
+
+sub t2h_default_sc($$$)
+{
+ shift;
+ my $args = shift;
+ return '<small>' . uc($args->[0]) . '</small>';
+}
+
+sub default_ctrl($$)
+{
+ return "^$_[0]";
+}
+
+sub t2h_default_ctrl($$$)
+{
+ shift;
+ my $args = shift;
+ return "^$args->[0]";
+}
+
+sub default_sc_pre($$)
+{
+ return uc($_[0]);
+}
+
+sub t2h_default_sc_pre($$$)
+{
+ shift;
+ my $args = shift;
+ return uc($args->[0]);
+}
+
+sub default_titlefont($$)
+{
+ return "<h1 class=\"titlefont\">$_[0]</h1>" if ($_[0] =~ /\S/);
+ return '';
+}
+
+sub t2h_default_titlefont($$$)
+{
+ shift;
+ my $args = shift;
+ return "<h1 class=\"titlefont\">$args->[0]</h1>" if ($args->[0] =~ /\S/);
+ return '';
+}
+
+# According to the texinfo manual this shouldn't lead to a link
+# but rather be formatted like text. If we did like makeinfo do
+# it would be
+#sub url($$)
+#{
+# return '&lt;<code>' . $_[0] . '</code>&gt;';
+#}
+sub t2h_default_url ($$)
+{
+ shift;
+ my $args = shift;
+ my $url = shift @$args;
+ #$url =~ s/\s*$//;
+ #$url =~ s/^\s*//;
+ $url = main::normalise_space($url);
+ return '' unless ($url =~ /\S/);
+ return &$anchor('', $url, $url);
+}
+
+sub default_url ($$)
+{
+ my $url = shift;
+ my $command = shift;
+ $url =~ s/\s*$//;
+ $url =~ s/^\s*//;
+ return '' unless ($url =~ /\S/);
+ return &$anchor('', $url, $url);
+}
+
+sub default_uref($$)
+{
+ my $arg = shift;
+ my $command = shift;
+ my ($url, $text, $replacement);
+ ($url, $text, $replacement) = split /,\s*/, $arg;
+ $url =~ s/\s*$//;
+ $url =~ s/^\s*//;
+ $text = $replacement if (defined($replacement));
+ $text = $url unless ($text);
+ return $text if ($url eq '');
+ return &$anchor('', $url, $text);
+}
+
+sub t2h_default_uref($$)
+{
+ shift;
+ my $args = shift;
+ my $url = shift @$args;
+ my $text = shift @$args;
+ my $replacement = shift @$args;
+ #$url =~ s/\s*$//;
+ #$url =~ s/^\s*//;
+ $url = main::normalise_space($url);
+ $replacement = '' if (!defined($replacement));
+ $replacement = main::normalise_space($replacement);
+ $text = '' if (!defined($text));
+ $text = main::normalise_space($text);
+ $text = $replacement if ($replacement ne '');
+ $text = $url unless ($text ne '');
+ return $text if ($url eq '');
+ return &$anchor('', $url, $text);
+}
+
+sub default_email($$)
+{
+ my $arg = shift;
+ my $command = shift;
+ my ($mail, $text);
+ ($mail, $text) = split /,\s*/, $arg;
+ $mail =~ s/\s*$//;
+ $mail =~ s/^\s*//;
+ $text = $mail unless ($text);
+ return $text if ($mail eq '');
+ return &$anchor('', "mailto:$mail", $text);
+}
+
+sub t2h_default_email($$)
+{
+ my $command = shift;
+ my $args = shift;
+ my $mail = shift @$args;
+ my $text = shift @$args;
+ $mail = main::normalise_space($mail);
+ #$mail =~ s/\s*$//;
+ #$mail =~ s/^\s*//;
+ $text = $mail unless (defined($text) and ($text ne ''));
+ $text = main::normalise_space($text);
+ return $text if ($mail eq '');
+ return &$anchor('', "mailto:$mail", $text);
+}
+
+sub t2h_default_ascii_accent($$$$)
+{
+ my $accent = shift;
+ my $args = shift;
+
+ my $text = $args->[0];
+ return ascii_accents($text, $accent);
+}
+
+sub t2h_default_no_texi_email
+{
+ my $command = shift;
+ my $args = shift;
+ my $mail = shift @$args;
+ my $text = shift @$args;
+ $mail = main::normalise_space($mail);
+ #$mail =~ s/\s*$//;
+ #$mail =~ s/^\s*//;
+ return $text if (defined($text) and ($text ne ''));
+ return $mail;
+}
+
+sub t2h_default_no_texi_image($$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my $text = $args->[0];
+ $text = main::normalise_space($text);
+ my @args = split (/\s*,\s*/, $text);
+ return $args[0];
+}
+
+sub t2h_default_no_texi_acronym_like($$)
+{
+ my $command = shift;
+ my $args = shift;
+ my $acronym_texi = $args->[0];
+ return (main::remove_texi($acronym_texi));
+}
+
+sub t2h_remove_command($$$$)
+{
+ return '';
+}
+
+# This is used for style in preformatted sections
+my %old_style_map_pre = %old_style_map;
+$old_style_map_pre{'sc'} = '&default_sc_pre';
+$old_style_map_pre{'titlefont'} = '';
+
+foreach my $command (keys(%style_map))
+{
+ $style_map_pre{$command} = {};
+ $style_map_texi{$command} = {} if (!exists($style_map_texi{$command}));
+ $style_map_texi{$command}->{'args'} = $style_map{$command}->{'args'}
+ if (exists($style_map{$command}->{'args'}));
+ #print STDERR "COMMAND $command";
+
+ foreach my $key (keys(%{$style_map{$command}}))
+ {
+ $style_map_pre{$command}->{$key} = $style_map{$command}->{$key};
+ }
+}
+
+$style_map_pre{'sc'}->{'function'} = \&t2h_default_sc_pre;
+$style_map_pre{'titlefont'} = {};
+
+$style_map_texi{'sc'}->{'function'} = \&t2h_default_sc_pre;
+$style_map_texi{'email'}->{'function'} = \&t2h_default_no_texi_email;
+
+####### special styles. You shouldn't need to change them
+my %special_style = (
+ #'xref' => ['keep','normal','normal','keep','normal'],
+ 'xref' => { 'args' => ['keep','keep','keep','keep','keep'],
+ 'function' => \&main::do_xref },
+ 'ref' => { 'args' => ['keep','keep','keep','keep','keep'],
+ 'function' => \&main::do_xref },
+ 'pxref' => { 'args' => ['keep','keep','keep','keep','keep'],
+ 'function' => \&main::do_xref },
+ 'inforef' => { 'args' => ['keep','keep','keep'],
+ 'function' => \&main::do_xref },
+ 'image' => { 'args' => ['keep'], 'function' => \&main::do_image },
+ 'anchor' => { 'args' => ['keep'], 'function' => \&main::do_anchor_label },
+ 'footnote' => { 'args' => ['keep'], 'function' => \&main::do_footnote },
+ 'shortcaption' => { 'args' => ['keep'], 'function' => \&main::do_caption_shortcaption },
+ 'caption' => { 'args' => ['keep'], 'function' => \&main::do_caption_shortcaption },
+ 'acronym', {'args' => ['keep','keep'], 'function' => \&main::do_acronym_like},
+ 'abbr', {'args' => ['keep','keep'], 'function' => \&main::do_acronym_like},
+);
+
+# FIXME the unless defined(.... are now unusefull because the user can
+# overwrite.
+
+# @image is replaced by the first arg in strings
+$style_map_texi{'image'} = { 'args' => ['keep'],
+ 'function' => \&t2h_default_no_texi_image }
+ unless (defined($style_map_texi{'image'}));
+
+$style_map_texi{'acronym'} = { 'args' => ['keep','keep'],
+ 'function' => \&t2h_default_no_texi_acronym_like };
+$style_map_texi{'abbr'} = { 'args' => ['keep','keep'],
+ 'function' => \&t2h_default_no_texi_acronym_like };
+
+foreach my $special (keys(%special_style))
+{
+ $style_map{$special} = $special_style{$special}
+ unless (defined($style_map{$special}));
+ $style_map_pre{$special} = $special_style{$special}
+ unless (defined($style_map_pre{$special}));
+ $style_map_texi{$special} = { 'args' => ['keep'],
+ 'function' => \&t2h_remove_command }
+ unless (defined($style_map_texi{$special}));
+}
+####### end special styles.
+
+
+#foreach my $command (keys(%style_map))
+#{
+# print STDERR "STYLE_MAP_TEXI $command($style_map_texi{$command}) ";
+# print STDERR "ARGS $style_map_texi{$command}->{'args'} " if (defined($style_map_texi{$command}->{'args'}));
+# print STDERR "FUN $style_map_texi{$command}->{'function'} " if (defined($style_map_texi{$command}->{'function'}));
+# print STDERR "\n";
+#}
+
+# uncomment to use the old interface
+#%style_map = %old_style_map;
+#%style_map_pre = %old_style_map_pre;
+
+#FIXME USE_ISO ?
+%unformatted_text_simple_map_texi = %simple_map_pre;
+%unformatted_text_texi_map = %pre_map;
+%unformatted_text_style_map_texi = ();
+
+foreach my $command (keys(%style_map_texi))
+{
+ #$unformatted_text_style_map_texi{$command} = {};
+ foreach my $key (keys (%{$style_map_texi{$command}}))
+ {
+ #print STDERR "$command, $key, $style_map_texi{$command}->{$key}\n";
+ $unformatted_text_style_map_texi{$command}->{$key} =
+ $style_map_texi{$command}->{$key};
+ }
+ $unformatted_text_style_map_texi{$command} = {} if (!defined($unformatted_text_style_map_texi{$command}));
+}
+
+foreach my $accent_command ('tieaccent', 'dotless', keys(%unicode_accents))
+{
+# $unformatted_text_style_map_texi{$accent_command}->{'args'} = ['normal'];
+ $unformatted_text_style_map_texi{$accent_command}->{'function'} = \&t2h_default_accent;
+}
+
+%format_map = (
+# 'quotation' => 'blockquote',
+ # lists
+# 'itemize' => 'ul',
+ 'enumerate' => 'ol',
+ 'multitable' => 'table',
+ 'table' => 'dl compact="compact"',
+ 'vtable' => 'dl compact="compact"',
+ 'ftable' => 'dl compact="compact"',
+ 'group' => '',
+ );
+
+%special_list_commands = (
+ 'table' => {},
+ 'vtable' => {},
+ 'ftable' => {},
+ 'itemize' => { 'bullet' => '' }
+ );
+#
+# texinfo format to align attribute of paragraphs
+#
+
+%paragraph_style = (
+ 'center' => 'center',
+ 'flushleft' => 'left',
+ 'flushright' => 'right',
+ );
+
+# an eval of these $complex_format_map->{what}->{'begin'} yields beginning
+# an eval of these $complex_format_map->{what}->{'end'} yields end
+# $EXAMPLE_INDENT_CELL and SMALL_EXAMPLE_INDENT_CELL can be usefull here
+# FIXME add \n at the end ?
+$complex_format_map =
+{
+ 'example' =>
+ {
+ 'begin' => q{"<table><tr>$EXAMPLE_INDENT_CELL<td>"},
+ 'end' => q{'</td></tr></table>'},
+ },
+ 'smallexample' =>
+ {
+ 'begin' => q{"<table><tr>$SMALL_EXAMPLE_INDENT_CELL<td>"},
+ 'end' => q{'</td></tr></table>'},
+ },
+ 'display' =>
+ {
+ 'begin' => q{"<table><tr>$EXAMPLE_INDENT_CELL<td>"},
+ 'end' => q{'</td></tr></table>'},
+ },
+ 'smalldisplay' =>
+ {
+ 'begin' => q{"<table><tr>$SMALL_EXAMPLE_INDENT_CELL<td>"},
+ 'end' => q{'</td></tr></table>'},
+ }
+};
+
+# format shouldn't narrow the margins
+
+$complex_format_map->{'lisp'} = $complex_format_map->{'example'};
+$complex_format_map->{'smalllisp'} = $complex_format_map->{'smallexample'};
+$complex_format_map->{'format'} = $complex_format_map->{'display'};
+$complex_format_map->{'smallformat'} = $complex_format_map->{'smalldisplay'};
+
+%def_map = (
+ # basic commands
+ 'deffn', [ 'f', 'category', 'name', 'arg' ],
+ 'defvr', [ 'v', 'category', 'name' ],
+ 'deftypefn', [ 'f', 'category', 'type', 'name', 'arg' ],
+ 'deftypeop', [ 'f', 'category', 'class' , 'type', 'name', 'arg' ],
+ 'deftypevr', [ 'v', 'category', 'type', 'name' ],
+ 'defcv', [ 'v', 'category', 'class' , 'name' ],
+ 'deftypecv', [ 'v', 'category', 'class' , 'type', 'name' ],
+ 'defop', [ 'f', 'category', 'class' , 'name', 'arg' ],
+ 'deftp', [ 't', 'category', 'name', 'arg' ],
+ # basic x commands
+ # shortcuts
+ # i18n
+ 'defun', 'deffn Function',
+ 'defmac', 'deffn Macro',
+ 'defspec', 'deffn {Special Form}',
+ 'defvar', 'defvr Variable',
+ 'defopt', 'defvr {User Option}',
+ 'deftypefun', 'deftypefn {Function}',
+ 'deftypevar', 'deftypevr Variable',
+ 'defivar', 'defcv {Instance Variable}',
+ 'deftypeivar', 'deftypecv {Instance Variable}',
+ 'defmethod', 'defop Method',
+ 'deftypemethod', 'deftypeop Method',
+ );
+
+foreach my $key (keys(%def_map))
+{
+ $def_map{$key . 'x'} = $def_map{$key};
+}
+
+#
+# miscalleneous commands
+#
+# Depending on the value, the command arg or spaces following the command
+# are handled differently:
+#
+# the value is a reference on a hash.
+# the hash keys are
+# 'arg' if the value is 'line' then the remaining of the line is the arg
+# if it is a number it is the number of args (separated by spaces)
+# 'skip' if the value is 'line' then the remaining of the line is skipped
+# if the value is 'space' space but no newline is skipped
+# if the value is 'whitespace' space is skipped
+# if the value is 'linewhitespace' space is skipped if there are
+# only spaces remaining on the line
+# if the value is 'linespace' space but no newline is skipped if
+# there are only spaces remaining on the line
+# 'texi' if true it is some texinfo code and @value and @macros are expanded
+# 'keep' if true the args and the macro are kept, otherwise the macro
+# args and skipped stuffs are removed
+%misc_command = (
+ # not needed for formatting
+ 'raisesections' => {'skip' => 'line'}, # no arg
+ 'lowersections' => {'skip' => 'line'}, # no arg
+ 'contents' => {}, # no arg
+ 'shortcontents' => {}, # no arg
+ 'summarycontents'=> {}, # no arg
+ 'detailmenu' => {'skip' => 'whitespace'}, # no arg
+ 'end detailmenu' => {'skip' => 'space'}, # no arg
+ #'end detailmenu', 1, # no arg
+ 'bye' => {'skip' => 'line'}, # no arg
+ # comments
+ 'comment' => {'arg' => 'line'},
+ 'c' => {'arg' => 'line'},
+ #'c'=> {'arg' => 'line', 'keep' => 1},
+ # in preamble
+ 'novalidate' => {}, # no arg
+ 'dircategory'=> {'skip' => 'line'}, # line. Position with regard
+ # with direntry is significant
+ 'pagesizes' => {'skip' => 'line', 'arg' => 2}, # can have 2 args
+ 'finalout' => {}, # no arg
+ 'paragraphindent' => {'skip' => 'line', 'arg' => 1}, # arg none asis
+ # or a number and forbids anything else on the line
+ 'firstparagraphindent' => {'skip' => 'line', 'arg' => 1}, # none insert
+ 'exampleindent' => {'skip' => 'line', 'arg' => 1}, # asis or a number
+ 'footnotestyle'=> {'skip' => 'line', 'arg' => 1}, # end and separate
+ # and nothing else on the line
+ 'afourpaper' => {'skip' => 'line'}, # no arg
+ 'afourlatex' => {'skip' => 'line'}, # no arg
+ 'afourwide' => {'skip' => 'line'}, # no arg
+ 'headings'=> {'skip' => 'line', 'arg' => 1},
+ #off on single double singleafter doubleafter
+ # interacts with setchapternewpage
+ 'setchapternewpage' => {'skip' => 'line', 'arg' => 1}, # off on odd
+ 'everyheading' => {'arg' => 'line'},
+ 'everyfooting' => {'arg' => 'line'},
+ 'evenheading' => {'arg' => 'line'},
+ 'evenfooting' => {'arg' => 'line'},
+ 'oddheading' => {'arg' => 'line'},
+ 'oddfooting' => {'arg' => 'line'},
+ 'smallbook' => {'skip' => 'line'}, # no arg
+ 'setfilename' => {'arg' => 'line'},
+ 'shorttitle' => {'arg' => 'line', 'texi' => 1},
+ 'shorttitlepage' => {'arg' => 'line', 'texi' => 1},
+ 'settitle' => {'arg' => 'line', 'texi' => 1},
+ 'author' => {'arg' => 'line', 'texi' => 1},
+ 'subtitle' => {'arg' => 'line', 'texi' => 1},
+ 'title' => {'arg' => 'line', 'texi' => 1},
+ 'syncodeindex' => {'skip' => 'linespace', 'arg' => 2},
+ # args are index identifiers
+ 'synindex' => {'skip' => 'linespace', 'arg' => 2},
+ 'defindex' => {'skip' => 'line', 'arg' => 1}, # one identifier arg
+ 'defcodeindex' => {'skip' => 'line', 'arg' => 1}, # one identifier arg
+ 'documentlanguage' => {'skip' => 'whitespace', 'arg' => 1},
+ # language code arg
+ 'kbdinputstyle' => {'skip' => 'whitespace', 'arg' => 1}, # code
+ #example distinct
+ 'sp' => {'skip' => 'whitespace', 'arg' => 1}, # no arg
+ # at the end of line or a numerical arg
+ # formatting
+ 'page' => {}, # no arg (pagebreak)
+ 'refill' => {}, # no arg (obsolete, to be ignored)
+ 'noindent' => {'skip' => 'space'}, # no arg
+ 'need' => {'skip' => 'line', 'arg' => 1}, # one numerical/real arg
+ 'exdent' => {'skip' => 'space'},
+ # not valid for info (should be in @iftex)
+ 'vskip' => {'arg' => 'line'}, # arg line in TeX
+ 'cropmarks' => {}, # no arg
+ # miscalleneous
+ 'verbatiminclude'=> {'skip' => 'line'},
+ 'noindent' => {'skip' => 'space'},
+ 'documentencoding' => {'arg' => 1},
+ # ???
+ 'filbreak' => {},
+ );
+my %misc_command_old = (
+ # not needed for formatting
+ 'raisesections', 'line', # no arg
+ 'lowersections', 'line', # no arg
+ 'contents', 1, # no arg
+ 'shortcontents', 1, # no arg
+ 'summarycontents', 1, # no arg
+ 'detailmenu', 'whitespace', # no arg
+ 'end detailmenu', 'space', # no arg
+ #'end detailmenu', 1, # no arg
+ 'novalidate', 1, # no arg
+ 'bye', 'line', # no arg
+ # comments
+ 'comment', 'line',
+ 'c', 'line',
+ # in preamble
+ 'dircategory', 'line', # line. Position with regard with direntry is
+ # significant
+ 'pagesizes', 'line arg2', # can have 2 args
+ 'finalout', 1, # no arg
+ 'paragraphindent', 'line arg1', # in fact accepts only none asis
+ # or a number and forbids anything else on the line
+ 'firstparagraphindent', 'line arg1', # in fact accepts only none insert
+ 'exampleindent', 'line arg1', # in fact accepts only asis or a number
+ 'footnotestyle', 'line arg1', # in fact accepts only end and separate
+ # and nothing else on the line
+ 'afourpaper', 'line', # no arg
+ 'afourlatex', 'line', # no arg
+ 'afourwide', 'line', # no arg
+ 'headings', 'line', # one arg, possibilities are
+ #off on single double singleafter doubleafter
+ # interacts with setchapternewpage
+ 'setchapternewpage', 'line', # no arg
+ 'everyheading', 'line',
+ 'everyfooting', 'line',
+ 'evenheading', 'line',
+ 'evenfooting', 'line',
+ 'oddheading', 'line',
+ 'oddfooting', 'line',
+ 'smallbook', 'line', # no arg
+ 'setfilename', 'line',
+ 'shorttitle', 'linetexi',
+ 'shorttitlepage', 'linetexi',
+ 'settitle', 'linetexi',
+ 'author', 'linetexi',
+ 'subtitle', 'linetexi',
+ 'title','linetexi',
+ 'syncodeindex','linespace arg2', # args are
+ 'synindex','linespace arg2',
+ 'defindex', 'line arg1', # one identifier arg
+ 'defcodeindex', 'line arg1', # one identifier arg
+ 'documentlanguage', 'whitespace arg1', # one language code arg
+ 'kbdinputstyle', 'whitespace arg1', # one arg within
+ #code example distnct
+ 'sp', 'whitespace arg1', # no arg at the en of line or a numerical arg
+ # formatting
+ 'page', 1, # no arg (pagebreak)
+ 'refill', 1, # no arg (obsolete, to be ignored))
+ 'noindent', 'space', # no arg
+ 'need', 'line arg1', # one numerical/real arg
+ 'exdent', 'space',
+ # not valid for info (should be in @iftex)
+ 'vskip', 'line', # arg line in TeX
+ 'cropmarks', 1, # no arg
+ # miscalleneous
+ 'verbatiminclude', 'line',
+ 'documentencoding', 'arg1',
+ # ???
+ 'filbreak', 1,
+ );
+
+%format_in_paragraph = (
+ 'group' => 1,
+ 'html' => 1,
+);
+# map mapping css specification to style
+
+%css_map =
+ (
+ 'ul.toc' => "$TOC_LIST_STYLE",
+ 'pre.menu-comment' => "$MENU_PRE_STYLE",
+ 'pre.menu-preformatted' => "$MENU_PRE_STYLE",
+ 'a.summary-letter' => 'text-decoration: none',
+ 'pre.display' => 'font-family: serif',
+ 'pre.smalldisplay' => 'font-family: serif; font-size: smaller',
+ 'pre.smallexample' => 'font-size: smaller',
+ 'span.sansserif' => 'font-family:sans-serif; font-weight:normal;'
+ );
+
+$css_map{'pre.format'} = $css_map{'pre.display'};
+$css_map{'pre.smallformat'} = $css_map{'pre.smalldisplay'};
+$css_map{'pre.smalllisp'} = $css_map{'pre.smallexample'};
+
+# formatting functions
+
+$anchor = \&t2h_default_anchor;
+$def_item = \&t2h_default_def_item;
+$def = \&t2h_default_def;
+$menu = \&t2h_default_menu;
+$menu_link = \&t2h_default_menu_link;
+$menu_comment = \&t2h_default_menu_comment;
+$menu_description = \&t2h_default_menu_description;
+$simple_menu_link = \&t2h_default_simple_menu_link;
+$external_ref = \&t2h_default_external_ref;
+$external_href = \&t2h_default_external_href;
+$internal_ref = \&t2h_default_internal_ref;
+$table_item = \&t2h_default_table_item;
+$table_line = \&t2h_default_table_line;
+$table_list = \&t2h_default_table_list;
+$row = \&t2h_default_row;
+$cell = \&t2h_default_cell;
+$list_item = \&t2h_default_list_item;
+$comment = \&t2h_default_comment;
+$def_line = \&t2h_default_def_line;
+$def_line_no_texi = \&t2h_default_def_line_no_texi;
+$raw = \&t2h_default_raw;
+$heading = \&t2h_default_heading;
+$paragraph = \&t2h_default_paragraph;
+$preformatted = \&t2h_default_preformatted;
+$foot_line_and_ref = \&t2h_default_foot_line_and_ref;
+$foot_section = \&t2h_default_foot_section;
+$image = \&t2h_default_image;
+$address = \&t2h_default_address;
+$index_entry_label = \&t2h_default_index_entry_label;
+$index_summary = \&t2h_default_index_summary;
+$summary_letter = \&t2h_default_summary_letter;
+$index_entry = \&t2h_default_index_entry;
+$index_letter = \&t2h_default_index_letter;
+$print_index = \&t2h_default_print_index;
+$protect_text = \&t2h_default_protect_text;
+$complex_format = \&t2h_default_complex_format;
+$cartouche = \&t2h_default_cartouche;
+$sp = \&t2h_default_sp;
+$definition_category = \&t2h_default_definition_category;
+$copying_comment = \&t2h_default_copying_comment;
+$index_summary_file_entry = \&t2h_default_index_summary_file_entry;
+$index_summary_file_end = \&t2h_default_index_summary_file_end;
+$index_summary_file_begin = \&t2h_default_index_summary_file_begin;
+$empty_line = \&t2h_default_empty_line;
+$unknown = \&t2h_default_unknown;
+$unknown_style = \&t2h_default_unknown_style;
+$caption_shortcaption = \&t2h_caption_shortcaption;
+$float = \&t2h_default_float;
+$listoffloats = \&t2h_default_listoffloats;
+$listoffloats_entry = \&t2h_default_listoffloats_entry;
+$listoffloats_caption = \&t2h_default_listoffloats_caption;
+$listoffloats_float_style = \&t2h_default_listoffloats_float_style;
+$listoffloats_style = \&t2h_default_listoffloats_style;
+$acronym_like = \&t2h_default_acronym_like;
+$quotation = \&t2h_default_quotation;
+$quotation_prepend_text = \&t2h_default_quotation_prepend_text;
+$paragraph_style_command = \&t2h_default_paragraph_style_command;
+
+# This function is called whenever a complex format is processed
+#
+# arguments:
+# name of the format
+# text appearing inside the format
+#
+# an eval of $complex_format->{format name}->{'begin'} should lead to the
+# beginning of the complex format, an eval of
+# $complex_format->{format name}->{'end'} should lead to the end of the
+# complex format.
+sub t2h_default_complex_format($$)
+{
+ my $name = shift;
+ my $text = shift;
+ return '' if ($text eq '');
+ my $beginning = eval "$complex_format_map->{$name}->{'begin'}";
+ if ($@ ne '')
+ {
+ print STDERR "$ERROR Evaluation of $complex_format_map->{$name}->{'begin'}: $@";
+ $beginning = '';
+
+ }
+ my $end = eval "$complex_format_map->{$name}->{'end'}";
+ if ($@ ne '')
+ {
+ print STDERR "$ERROR Evaluation of $complex_format_map->{$name}->{'end'}: $@";
+ $end = '';
+
+ }
+ return $beginning . $text . $end;
+}
+
+sub t2h_default_empty_line($)
+{
+ my $text = shift;
+ return $text;
+}
+
+sub t2h_default_unknown($$)
+{
+ my $macro = shift;
+ my $line = shift;
+
+ my ($result_line, $result, $result_text, $message);
+ return ($line, 0, undef, undef);
+}
+
+sub t2h_default_unknown_style($$)
+{
+ my $command = shift;
+ my $text = shift;
+
+ my ($result, $result_text, $message);
+ return (0, undef, undef);
+}
+
+sub t2h_caption_shortcaption($)
+{
+ my $float = shift;
+ my $caption_lines;
+ my $shortcaption_lines;
+ my $style = $float->{'style_texi'};
+ if (defined($float->{'nr'}))
+ {
+ my $nr = $float->{'nr'};
+ if ($style ne '')
+ {
+ $style = &$I('%{style} %{number}', { 'style' => $style, 'number' => $nr});
+ }
+ else
+ {
+ $style = $nr;
+ }
+ }
+
+ if (defined($float->{'caption_texi'}))
+ {
+ @$caption_lines = @{$float->{'caption_texi'}};
+ if (defined($style))
+ {
+ $caption_lines->[0] = '@strong{' . &$I('%{style}: %{caption_first_line}', { 'style' => $style, 'caption_first_line' => $caption_lines->[0] });
+ }
+ else
+ {
+ $caption_lines->[0] = '@strong{' . $caption_lines->[0];
+ }
+ push @$caption_lines, "}\n";
+ }
+ elsif (defined($style))
+ {
+ $caption_lines->[0] = '@strong{' . $style . '}' . "\n";
+ }
+ if (defined($float->{'shortcaption_texi'}))
+ {
+ @$shortcaption_lines = @{$float->{'shortcaption_texi'}};
+ if (defined($style))
+ {
+ $shortcaption_lines->[0] = '@strong{' . &$I('%{style}: %{shortcaption_first_line}', { 'style' => $style, 'shortcaption_first_line' => $shortcaption_lines->[0] });
+ }
+ else
+ {
+ $shortcaption_lines->[0] = '@strong{' . $shortcaption_lines->[0];
+ }
+ push @$shortcaption_lines, "}\n";
+ }
+ elsif (defined($style))
+ {
+ $shortcaption_lines->[0] = '@strong{' . $style . '}' . "\n";
+ }
+ return ($caption_lines, $shortcaption_lines);
+}
+
+sub t2h_default_float($$$$$)
+{
+ my $text = shift;
+ my $float = shift;
+ my $caption = shift;
+ my $shortcaption = shift;
+
+ my $label = '';
+ if (exists($float->{'id'}))
+ {
+ $label = &$anchor($float->{'id'});
+ }
+ my $caption_text = '';
+
+ if (defined($float->{'caption_texi'}))
+ {
+ $caption_text = $caption;
+ }
+ elsif (defined($float->{'shortcaption_texi'}))
+ {
+ $caption_text = $shortcaption;
+ }
+ elsif (defined($caption))
+ {
+ $caption_text = $caption;
+ }
+
+ return '<div class="float">' . "$label\n" . $text . '</div>' . $caption_text;
+}
+
+sub t2h_default_listoffloats_style($)
+{
+ my $style_texi = shift;
+ return ($style_texi);
+}
+
+sub t2h_default_listoffloats_float_style($$)
+{
+ my $style_texi = shift;
+ my $float = shift;
+
+ my $style = $float->{'style_texi'};
+ if (defined($float->{'nr'}))
+ {
+ my $nr = $float->{'nr'};
+ if ($style ne '')
+ {
+ $style = &$I('%{style} %{number}', { 'style' => $style, 'number' => $nr});
+ }
+ else
+ {
+ $style = $nr;
+ }
+ }
+ return $style;
+}
+
+sub t2h_default_listoffloats_caption($)
+{
+ my $float = shift;
+ if (defined($float->{'shortcaption_texi'}))
+ {
+ return [ @{$float->{'shortcaption_texi'}} ];
+ }
+ elsif (defined($float->{'caption_texi'}))
+ {
+ return [ @{$float->{'caption_texi'}} ];
+ }
+ return [ ];
+}
+
+sub t2h_default_listoffloats_entry($$$$)
+{
+ my $style_texi = shift;
+ my $float = shift;
+ my $float_style = shift;
+ my $caption = shift;
+ my $href = shift;
+
+ return '<dt>' . &$anchor('', $href, $float_style) . '</dt><dd>' . $caption
+. '</dd>' . "\n";
+}
+
+sub t2h_default_listoffloats($$$)
+{
+ my $style_texi = shift;
+ my $style = shift;
+ my $float_entries = shift;
+
+ my $result = "<dl class=\"listoffloats\">\n" ;
+ foreach my $float_entry (@$float_entries)
+ {
+ $result .= $float_entry;
+ }
+ return $result . "</dl>\n";
+}
+
+# This function is used to protect characters which are special in html
+# in inline text: &, ", <, and >.
+#
+# argument:
+# text to be protected
+sub t2h_default_protect_text($)
+{
+ my $text = shift;
+ $text =~ s/&/&amp;/g;
+ $text =~ s/</&lt;/g;
+ $text =~ s/>/&gt;/g;
+ $text =~ s/\"/&quot;/g;
+ return $text;
+}
+
+# This function produces an anchor
+#
+# arguments:
+# $name : anchor name
+# $href : anchor href
+# text : text displayed
+# extra_attribs : added to anchor attributes list
+sub t2h_default_anchor($;$$$)
+{
+ my $name = shift;
+ my $href = shift;
+ my $text = shift;
+ my $attributes = shift;
+#print STDERR "!$name!$href!$text!$attributes!\n";
+ if (!defined($attributes) or ($attributes !~ /\S/))
+ {
+ $attributes = '';
+ }
+ else
+ {
+ $attributes = ' ' . $attributes;
+ }
+ $name = '' if (!defined($name) or ($name !~ /\S/));
+ $href = '' if (!defined($href) or ($href !~ /\S/));
+ $text = '' if (!defined($text));
+ return $text if (($name eq '') and ($href eq ''));
+ $name = "name=\"$name\"" if ($name ne '');
+ $href = "href=\"$href\"" if ($href ne '');
+ $href = ' ' . $href if (($name ne '') and ($href ne ''));
+#print STDERR "!!!$name!$href!$text!$attributes!\n";
+ return "<a ${name}${href}${attributes}>$text</a>";
+}
+
+# This function is used to format the text associated with a @deff/@end deff
+#
+# argument:
+# text
+#
+# $DEF_TABLE should be used to distinguish between @def formatted as table
+# and as definition lists.
+sub t2h_default_def_item($)
+{
+ my $text = shift;
+ if ($text =~ /\S/)
+ {
+ if (! $DEF_TABLE)
+ {
+ return '<dd>' . $text . '</dd>';
+ }
+ else
+ {
+ return '<tr><td colspan="2">' . $text . '</td></tr>';
+ }
+ }
+ return '';
+}
+
+sub t2h_default_definition_category($$$)
+{
+ my $name = shift;
+ my $class = shift;
+ my $style = shift;
+# print STDERR "definition_category $name, class $class, style $style\n";
+ return undef if (!defined($name) or $name =~ /^\s*$/);
+ return ($name) if (!defined($class) or $class =~ /^\s*$/);
+ if ($style eq 'f')
+ {
+ return &$I('%{name} on %{class}', { 'name' => $name, 'class' => $class });
+ }
+ elsif ($style eq 'v')
+ {
+ return &$I('%{name} of %{class}', { 'name' => $name, 'class' => $class });
+ }
+ else
+ {
+ return $name;
+ }
+}
+
+# format the container for the @deffn line and text
+#
+# argument
+# text of the whole @def, line and associated text.
+#
+# $DEF_TABLE should be used.
+sub t2h_default_def($)
+{
+ my $text = shift;
+ if ($text =~ /\S/)
+ {
+ if (! $DEF_TABLE)
+ {
+ return "<dl>\n" . $text . "</dl>\n";
+ }
+ else
+ {
+ return "<table width=\"100%\">\n" . $text . "</table>\n";
+ }
+ }
+ return '';
+
+}
+
+# a whole menu
+#
+# argument:
+# the whole menu text (entries and menu comments)
+#
+# argument:
+# whole menu text.
+sub t2h_default_menu($)
+{
+ my $text = shift;
+ if ($text =~ /\S/)
+ {
+ return "<table class=\"menu\" border=\"0\" cellspacing=\"0\">\n"
+ . $text . "</table>\n";
+ }
+}
+
+# a simple menu entry ref in case we aren't in a standard menu context
+sub t2h_default_simple_menu_link($$$$$$)
+{
+ my $entry = shift;
+ my $preformatted = shift;
+ my $href = shift;
+ my $node = shift;
+ my $name = shift;
+ my $ending = shift;
+ $ending = '' if (!defined($ending));
+ if (($entry eq '') or $NODE_NAME_IN_MENU or $preformatted)
+ {
+ $name .= ':' if ($name ne '');
+ $entry = "$MENU_SYMBOL$name$node";
+ }
+ $entry = &$anchor('', $href, $entry) if ($href);
+ $entry .= $ending if ($preformatted);
+ return $entry . '&nbsp;';
+}
+
+# formats a menu entry link pointing to a node or section
+#
+# arguments:
+# the entry text
+# the state, a hash reference holding informations about the context, with a
+# usefull entry, 'preformatted', true if we are in a preformatted format
+# (a format keeping space between words). In that case a function
+# of the main program, main::do_preformatted($text, $state) might
+# be used to format the text with the current format style.
+# href is optionnal. It is the reference to the section or the node anchor
+# which should be used to make the link (typically it is the argument
+# of a href= attribute in a <a> element).
+sub t2h_default_menu_link($$$$$$)
+{
+ my $entry = shift;
+ my $state = shift;
+ my $href = shift;
+ my $node = shift;
+ my $name = shift;
+ my $ending = shift;
+ if (($entry eq '') or $NODE_NAME_IN_MENU or $state->{'preformatted'})
+ {
+ $name .= ':' if ($name ne '');
+ $entry = "$MENU_SYMBOL$name$node";
+ }
+ $entry = &$anchor ('', $href, $entry) if (defined($href));
+ if ($state->{'preformatted'})
+ {
+ return '<tr><td>' . main::do_preformatted($entry . $ending, $state);
+ }
+ return "<tr><td align=\"left\" valign=\"top\">$entry</td><td>&nbsp;&nbsp;</td>";
+}
+
+# formats a menu entry description, ie the text appearing after the node
+# specification in a menu entry an spanning until there is another
+# menu entry, an empty line or some text at the very beginning of the line
+# (we consider that text at the beginning of the line begins a menu comment)
+#
+# arguments:
+# the description text
+# the state. See menu_entry.
+sub t2h_default_menu_description($$)
+{
+ my $text = shift;
+ my $state = shift;
+ if ($state->{'preformatted'})
+ {
+ return main::do_preformatted($text, $state) . '</td></tr>';
+ }
+ return "<td align=\"left\" valign=\"top\">$text</td></tr>\n";
+}
+
+# a menu comment (between menu lines)
+# formats the container of a menu comment. A menu comment is any text
+# appearing between menu lines, either separated by an empty line from
+# the preceding menu entry, or a text beginning at the first character
+# of the line (text not at the very beginning of the line is considered to
+# be the continuation of a menu entry description text).
+#
+# The text itself is considered to be in a preformatted environment
+# with name 'menu-commment' and with style $MENU_PRE_STYLE.
+#
+# argument
+# text contained in the menu comment.
+sub t2h_default_menu_comment($)
+{
+ my $text = shift;
+ if ($text =~ /\S/)
+ {
+ return "<tr><th colspan=\"3\" align=\"left\" valign=\"top\">$text</th></tr>";
+ }
+ return '';
+}
+
+# Construct a href to an external source of information.
+# node is the node with texinfo @-commands
+# node_id is the node transformed such that it is unique and can be used to
+# make an html cross ref as explained in the texinfo manual
+# file is the file in '(file)node'
+sub t2h_default_external_href($$$)
+{
+ my $node = shift;
+ my $node_id = shift;
+ my $node_xhtml_id = shift;
+ my $file = shift;
+ $file = '' if (!defined($file));
+ my $target_split = $EXTERNAL_CROSSREF_SPLIT;
+ if ($file ne '')
+ {
+ if ($NEW_CROSSREF_STYLE)
+ {
+ $file =~ s/\.[^\.]*$//;
+ $file =~ s/^.*\///;
+ my $href;
+ if (exists($Texi2HTML::THISDOC{'htmlxref'}->{$file}))
+ {
+ $target_split = $Texi2HTML::THISDOC{'htmlxref'}->{$file}->{'split'};
+ $href = $Texi2HTML::THISDOC{'htmlxref'}->{$file}->{'href'};
+ }
+ if ($target_split)
+ {
+ if (defined($href))
+ {
+ $file = "$href";
+ }
+ elsif (defined($EXTERNAL_DIR))
+ {
+ $file = "$EXTERNAL_DIR/$file";
+ }
+ elsif ($SPLIT)
+ {
+ $file = "../$file";
+ }
+ $file .= "/";
+ }
+ else
+ {# target not split
+ if (defined($href))
+ {
+ $file = "$href";
+ }
+ else
+ {
+ if (defined($EXTERNAL_DIR))
+ {
+ $file = "$EXTERNAL_DIR/$file";
+ }
+ elsif ($SPLIT)
+ {
+ $file = "../$file";
+ }
+ $file .= "." . $NODE_FILE_EXTENSION;
+ }
+ }
+ }
+ else
+ {
+ $file .= "/";
+ if (defined($EXTERNAL_DIR))
+ {
+ $file = $EXTERNAL_DIR . $file;
+ }
+ else
+ {
+ $file = '../' . $file;
+ }
+ }
+ }
+ else
+ { # here we necessarily have a ref to a node in the document, but the
+ # node is invalid
+ if ($NEW_CROSSREF_STYLE)
+ {
+ if (!$SPLIT)
+ {
+ $file = $TOP_FILE;
+ }
+ }
+ }
+ if ($node eq '')
+ {
+ if ($NEW_CROSSREF_STYLE)
+ {
+ if ($SPLIT)
+ {
+ return $file . $TOP_NODE_FILE . '.' . $NODE_FILE_EXTENSION . '#Top';
+ # or ?
+ #return $file . '#Top';
+ }
+ else
+ {
+ return $file . '#Top';
+ }
+ }
+ else
+ {
+ return $file;
+ }
+ }
+ my $target;
+ if ($NEW_CROSSREF_STYLE)
+ {
+ $node = $node_id;
+ $target = $node_xhtml_id;
+ }
+ else
+ {
+ $node = main::remove_texi($node);
+ $node =~ s/[^\w\.\-]/-/g;
+ }
+ my $file_basename = $node;
+ $file_basename = $TOP_NODE_FILE if ($node =~ /^top$/i);
+ if ($NEW_CROSSREF_STYLE)
+ {
+ if ($SPLIT)
+ {
+ return $file . $file_basename . ".$NODE_FILE_EXTENSION" . '#' . $target;
+ }
+ else
+ {
+ return $file . '#' . $target;
+ }
+ }
+ else
+ {
+ return $file . $file_basename . ".$NODE_FILE_EXTENSION";
+ }
+}
+# format a reference external to the generated manual. This produces a full
+# reference with introductive words and the reference itself.
+#
+# arguments:
+# type of the reference: xref (reference at the beginning of a sentence),
+# pxref (reference in a parenthesis),
+# section in the book. This might be undef.
+# book name.
+# node and file name formatted according to the convention used in info
+# '(file)node' and no node means the Top node.
+# href linking to the html page containing the referenced node. A typical
+# use for this href is a href attribute in an <a> element
+# an optionnal cross reference name
+sub t2h_default_external_ref($$$$$$)
+{
+ my $type = shift;
+ my $section = shift;
+ my $book = shift;
+ my $file_node = shift;
+ my $href = shift;
+ my $cross_ref = shift;
+
+ $file_node = "$cross_ref: $file_node" if (($file_node ne '') and ($cross_ref ne ''));
+ $file_node = &$anchor('', $href, $file_node) if ($file_node ne '');
+
+ # Yes, this is ugly, but this helps internationalization
+ if ($type eq 'pxref')
+ {
+ if (($book ne '') and ($file_node ne ''))
+ {
+ return &$I('see %{node_file_href} section `%{section}\' in @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book, 'section' => $section }) if ($section ne '');
+ return &$I('see %{node_file_href} @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book });
+ }
+ elsif ($book ne '')
+ {
+ return &$I('see section `%{section}\' in @cite{%{book}}', { 'book' => $book, 'section' => $section }) if ($section ne '');
+ return &$I('see @cite{%{book}}', { 'book' => $book });
+ }
+ elsif ($file_node ne '')
+ {
+ return &$I('see %{node_file_href}', { 'node_file_href' => $file_node });
+ }
+ }
+ if ($type eq 'xref')
+ {
+ if (($book ne '') and ($file_node ne ''))
+ {
+ return &$I('See %{node_file_href} section `%{section}\' in @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book, 'section' => $section }) if ($section ne '');
+ return &$I('See %{node_file_href} @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book });
+ }
+ elsif ($book ne '')
+ {
+ return &$I('See section `%{section}\' in @cite{%{book}}', { 'book' => $book, 'section' => $section }) if ($section ne '');
+ return &$I('See @cite{%{book}}', { 'book' => $book });
+ }
+ elsif ($file_node ne '')
+ {
+ return &$I('See %{node_file_href}', { 'node_file_href' => $file_node });
+ }
+ }
+ if ($type eq 'ref')
+ {
+ if (($book ne '') and ($file_node ne ''))
+ {
+ return &$I('%{node_file_href} section `%{section}\' in @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book, 'section' => $section }) if ($section ne '');
+ return &$I('%{node_file_href} @cite{%{book}}', { 'node_file_href' => $file_node, 'book' => $book });
+ }
+ elsif ($book ne '')
+ {
+ return &$I('section `%{section}\' in @cite{%{book}}', { 'book' => $book, 'section' => $section }) if ($section ne '');
+ return &$I('@cite{%{book}}', { 'book' => $book });
+ }
+ elsif ($file_node ne '')
+ {
+ return &$I('%{node_file_href}', { 'node_file_href' => $file_node });
+ }
+ }
+ return '';
+}
+
+# format a reference to a node or a section in the generated manual. This
+# produces a full reference with introductive words and the reference itself.
+#
+# arguments:
+# type of the reference: xref (reference at the beginning of a sentence),
+# pxref (reference in a parenthesis),
+# href linking to the html page containing the node or the section. A typical
+# use for this href is a href attribute in an <a> element
+# short name for this reference
+# name for this reference
+# boolean true if the reference is a reference to a section
+#
+# $SHORT_REF should be used.
+sub t2h_default_internal_ref($$$$$)
+{
+ my $type = shift;
+ my $href = shift;
+ my $short_name = shift;
+ my $name = shift;
+ my $is_section = shift;
+
+ if (! $SHORT_REF)
+ {
+ $name = &$anchor('', $href, $name);
+ if ($type eq 'pxref')
+ {
+ return &$I('see section %{reference_name}', { 'reference_name' => $name }) if ($is_section);
+ return &$I('see %{reference_name}', { 'reference_name' => $name });
+ }
+ elsif ($type eq 'xref')
+ {
+ return &$I('See section %{reference_name}', { 'reference_name' => $name }) if ($is_section);
+ return &$I('See %{reference_name}', { 'reference_name' => $name });
+ }
+ elsif ($type eq 'ref')
+ {
+ return &$I('%{reference_name}', { 'reference_name' => $name });
+ }
+ }
+ else
+ {
+ $name = &$anchor('', $href, $short_name);
+ if ($type eq 'pxref')
+ {
+ return &$I('see %{reference_name}', { 'reference_name' => $name });
+ }
+ elsif ($type eq 'xref')
+ {
+ return &$I('See %{reference_name}', { 'reference_name' => $name });
+ }
+ elsif ($type eq 'ref')
+ {
+ return &$I('%{reference_name}', { 'reference_name' => $name });
+ }
+ }
+ return '';
+}
+
+# text after @item in table, vtable and ftable
+sub t2h_default_table_item($$$$$)
+{
+ my $text = shift;
+ my $index_label = shift;
+ my $format = shift;
+ my $command = shift;
+ my $formatted_command = shift;
+ $formatted_command = '' if (!defined($formatted_command) or
+ exists($special_list_commands{$format}->{$command}));
+ $text .= "\n" . $index_label if (defined($index_label));
+ return '<dt>' . $formatted_command . $text . '</dt>' . "\n";
+}
+
+# format text on the line following @item (in table, vtable and ftable)
+sub t2h_default_table_line($)
+{
+ my $text = shift;
+
+ if ($text =~ /\S/)
+ {
+ return '<dd>' . $text . '</dd>' . "\n";
+ }
+ return '';
+}
+
+# row in multitable
+sub t2h_default_row($$)
+{
+ my $text = shift;
+ my $macro = shift;
+
+ if ($text =~ /\S/)
+ {
+ if ($macro eq 'headitem')
+ {
+ return '<thead><tr>' . $text . '</tr></thead>' . "\n";
+ }
+ return '<tr>' . $text . '</tr>' . "\n";
+ }
+ return '';
+}
+
+# cell in multitable
+sub t2h_default_cell($$)
+{
+ my $text = shift;
+ my $row_macro = shift;
+
+ if ($row_macro eq 'headitem')
+ {
+ return '<th>' . $text . '</th>';
+ }
+ return '<td>' . $text . '</td>';
+}
+
+# format an item in a list
+#
+# argument:
+# text of the item
+# format of the list (itemize or enumerate)
+# command passed as argument to the format
+# formatted_command leading command formatted, if it is a thing command
+sub t2h_default_list_item($$$$$$$)
+{
+ my $text = shift;
+ my $format = shift;
+ my $command = shift;
+ my $formatted_command = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+
+ $formatted_command = '' if (!defined($formatted_command) or
+ exists($special_list_commands{$format}->{$command}));
+ if ($text =~ /\S/)
+ {
+ return '<li>' . $formatted_command . $text . '</li>';
+ }
+ return '';
+}
+
+sub t2h_default_table_list($$$$$$)
+{
+ my $format = shift;
+ my $text = shift;
+ my $command = shift;
+ my $formatted_command = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+ $formatted_command = '' if (!defined($formatted_command) or
+ exists($special_list_commands{$format}->{$command}));
+ if ($format eq 'itemize')
+ {
+ return "<ul>\n" . $text . "</ul>\n" if ($command eq 'bullet');
+ return "<ul$TOC_LIST_ATTRIBUTE>\n" . $text . "</ul>\n";
+ }
+}
+
+# an html comment
+sub t2h_default_comment($)
+{
+ my $text = shift;
+ while ($text =~ /-->/) # --> ends an html comment !
+ {
+ $text =~ s/-->/->/go;
+ }
+ return '<!--' . $text . '-->' . "\n";
+}
+
+# a paragraph
+# arguments:
+# $text of the paragraph
+# $align for the alignement
+# The following is usefull if the paragraph is in an itemize.
+# $paragraph_command is the leading formatting command (like @minus)
+# $paragraph_command_formatted is the leading formatting command formatted
+# $paragraph_number is a reference on the number of paragraphs appearing
+# in the format. The value should be increased if a paragraph is done
+# $format is the format name (@itemize)
+sub t2h_default_paragraph($$$$$$$$$)
+{
+ my $text = shift;
+ my $align = shift;
+ my $paragraph_command = shift;
+ my $paragraph_command_formatted = shift;
+ my $paragraph_number = shift;
+ my $format = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+#print STDERR "format: $format\n" if (defined($format));
+ $paragraph_command_formatted = '' if (!defined($paragraph_command_formatted) or
+ exists($special_list_commands{$format}->{$paragraph_command}));
+ #my $in_term = shift;
+ return '' if ($text =~ /^\s*$/);
+ if (defined($paragraph_number) and defined($$paragraph_number))
+ {
+ $$paragraph_number++;
+ #return $text . "\n" if (($format eq 'itemize' or $format eq 'enumerate') and
+ return $text if (($format eq 'itemize' or $format eq 'enumerate') and
+ ($$paragraph_number == 1));
+ }
+ my $open = '<p>';
+ if ($align)
+ {
+ $open = "<p align=\"$paragraph_style{$align}\">";
+ }
+ return $open. "$text</p>";
+}
+
+# a preformatted region
+# arguments:
+# $text of the preformatted region
+# $pre_style css style
+# $class identifier for the preformatted region (example, menu-comment)
+# The following is usefull if the preformatted is in an itemize.
+# $leading_command is the leading formatting command (like @minus)
+# $leading_command_formatted is the leading formatting command formatted
+# $preformatted_number is a reference on the number of preformatteds appearing
+# in the format. The value should be increased if a preformatted is done
+sub t2h_default_preformatted($$$$$$$$$$)
+{
+ my $text = shift;
+ my $pre_style = shift;
+ my $class = shift;
+ my $leading_command = shift;
+ my $leading_command_formatted = shift;
+ my $preformatted_number = shift;
+ my $format = shift;
+ my $item_nr = shift;
+ my $enumerate_style = shift;
+ my $number = shift;
+
+ return '' if ($text eq '');
+ $leading_command_formatted = '' if (!defined($leading_command_formatted) or
+ exists($special_list_commands{$format}->{$leading_command}));
+ if (defined($preformatted_number) and defined($$preformatted_number))
+ {
+ $$preformatted_number++;
+ }
+ return "<pre class=\"$class\">$text</pre>";
+}
+
+# This function formats a heading for an element
+#
+# argument:
+# an element. It is a hash reference for a node or a sectionning command.
+# The interesting keys are:
+# 'text': the heading text
+# 'name': the heading text without section number
+# 'node': true if it is a node
+# 'level': level of the element. 0 for @top, 1 for chapter, heading,
+# appendix..., 2 for section and so on...
+# 'tag_level': the sectionning element name, raisesections and lowersections
+# taken into account
+#
+# relevant configuration variable:
+# $NUMBER_SECTIONS
+sub t2h_default_heading($)
+{
+ my $element = shift;
+ my $level = 3;
+ if (!$element->{'node'})
+ {
+ $level = $element->{'level'};
+ }
+ $level = 1 if ($level == 0);
+ my $text = $element->{'text'};
+ if (!$element->{'node'} and (!$NUMBER_SECTIONS))
+ {
+ $text = $element->{'name'};
+ }
+ return '' if ($text !~ /\S/);
+ my $class = $element->{'tag_level'};
+ $class = 'unnumbered' if ($class eq 'top');
+ if (defined($element->{'tocid'}) and $TOC_LINKS)
+ {
+ $text = &$anchor ('', "$Texi2HTML::THISDOC{'toc_file'}#$element->{'tocid'}", $text);
+ }
+ return "<h$level class=\"$class\"> $text </h$level>\n";
+}
+
+# formatting of raw regions
+# ih L2H is true another mechanism is used for tex
+sub t2h_default_raw($$)
+{
+ my $style = shift;
+ my $text = shift;
+ if ($style eq 'verbatim' or $style eq 'tex')
+ {
+ return "<pre class=\"$style\">" . &$protect_text($text) . '</pre>';
+ }
+ elsif ($style eq 'html')
+ {
+ return $text;
+ }
+ else
+ {
+ warn "$WARN (bug) unknown style $style\n";
+ return &$protect_text($text);
+ }
+}
+
+# This function formats a footnote reference and the footnote text associated
+# with a given footnote.
+# The footnote reference is the text appearing in the main document pointing
+# to the footnote text.
+#
+# arguments:
+# absolute number of the footnote (in the document)
+# relative number of the footnote (in the page)
+# identifier for the footnote
+# identifier for the footnote reference in the main document
+# main document file
+# footnote text file
+# array with the footnote text lines
+# the state. See menu entry.
+#
+# returns:
+# reference on an array containing the footnote text lines which should
+# have been updated
+# the text for the reference pointing on the footnote text
+sub t2h_default_foot_line_and_ref($$$$$$$)
+{
+ my $number_in_doc = shift;
+ my $number_in_page = shift;
+ my $footnote_id = shift;
+ my $place_id = shift;
+ my $document_file = shift;
+ my $footnote_file = shift;
+ my $lines = shift;
+ my $state = shift;
+
+ unshift (@$lines, '<h3>' .
+ &$anchor($footnote_id, $document_file . "#$place_id",
+ "($number_in_doc)")
+ . "</h3>\n");
+ return ($lines, &$anchor($place_id, $footnote_file . "#$footnote_id",
+ "($number_in_doc)"));
+}
+
+# formats a group of footnotes.
+#
+# argument:
+# array reference on the footnotes texts lines
+#
+# returns an array reference on the group of footnotes lines
+sub t2h_default_foot_section($)
+{
+ my $lines = shift;
+ unshift (@$lines, "<div class=\"footnote\">\n" ,"$DEFAULT_RULE\n", "<h3>" . &$I('Footnotes') . "</h3>\n");
+ push (@$lines, "</div>\n");
+ return $lines;
+}
+
+# format an image
+#
+# arguments:
+# image file name with path
+# image basename or alt text
+# a boolean true if we are in a preformatted format
+# image file name without path
+sub t2h_default_image($$$$)
+{
+ my $file = shift;
+ my $base = shift;
+ my $preformatted = shift;
+ my $file_name = shift;
+ return "[ $base ]" if ($preformatted);
+ return "<img src=\"$file\" alt=\"$base\">";
+}
+
+# address put in footer describing when was generated and who did the manual
+sub t2h_default_address($$)
+{
+ my $user = shift;
+ my $date = shift;
+ $user = '' if (!defined($user));
+ $date = '' if (!defined($date));
+ if (($user ne '') and ($date ne ''))
+ {
+ return &$I('by @emph{%{user}} on @emph{%{date}}', { 'user' => $user,
+ 'date' => $date });
+ }
+ elsif ($user ne '')
+ {
+ return &$I('by @emph{%{user}}', { 'user' => $user });
+ }
+ elsif ($date ne '')
+ {
+ return &$I('on @emph{%{date}}', { 'date' => $date });
+ }
+ return '';
+}
+
+# format a target in the main document for an index entry.
+#
+# arguments:
+# target identifier
+# boolean true if in preformatted format
+sub t2h_default_index_entry_label($$)
+{
+ my $identifier = shift;
+ my $preformatted = shift;
+
+ return '' if (!defined($identifier) or ($identifier !~ /\S/));
+ my $label = &$anchor($identifier);
+ return $label . "\n" if (!$preformatted);
+ return $label;
+}
+
+# process definition commands line @deffn for example
+sub t2h_default_def_line($$$$$)
+{
+ my $category = shift;
+ my $name = shift;
+ my $type = shift;
+ my $arguments = shift;
+ my $index_label = shift;
+ $index_label = '' if (!defined($index_label));
+ $name = '' if (!defined($name) or ($name =~ /^\s*$/));
+ $type = '' if (!defined($type) or $type =~ /^\s*$/);
+ if (!defined($arguments) or $arguments =~ /^\s*$/)
+ {
+ $arguments = '';
+ }
+ else
+ {
+ $arguments = '<i>' . $arguments . '</i>';
+ }
+ my $type_name = '';
+ $type_name = " $type" if ($type ne '');
+ $type_name .= ' <b>' . $name . '</b>' if ($name ne '');
+ $type_name .= $arguments . "\n";
+ if (! $DEF_TABLE)
+ {
+ return '<dt>'. '<u>' . $category . ':</u>' . $type_name . $index_label . "</dt>\n";
+ }
+ else
+ {
+
+ return "<tr>\n<td align=\"left\">" . $type_name .
+ "</td>\n<td align=\"right\">" . $category . $index_label . "</td>\n" . "</tr>\n";
+ }
+}
+
+# process definition commands line @deffn for example while removing texi
+# commands
+sub t2h_default_def_line_no_texi($$$$$)
+{
+ my $category = shift;
+ my $name = shift;
+ my $type = shift;
+ my $arguments = shift;
+ $name = '' if (!defined($name) or ($name =~ /^\s*$/));
+ $type = '' if (!defined($type) or $type =~ /^\s*$/);
+ if (!defined($arguments) or $arguments =~ /^\s*$/)
+ {
+ $arguments = '';
+ }
+ my $type_name = '';
+ $type_name = " $type" if ($type ne '');
+ $type_name .= ' ' . $name if ($name ne '');
+ $type_name .= $arguments;
+ if (! $DEF_TABLE)
+ {
+ return $category . ':' . $type_name . "\n";
+ }
+ else
+ {
+
+ return $type_name . " " . $category . "\n";
+ }
+}
+
+# a cartouche
+sub t2h_default_cartouche($$)
+{
+ my $text = shift;
+
+ if ($text =~ /\S/)
+ {
+ return "<table class=\"cartouche\" border=\"1\"><tr><td>\n" . $text . "</td></tr></table>\n";
+ }
+ return '';
+}
+
+# key:
+# origin_href:
+# entry:
+# texi entry:
+# element_href:
+# element_text:
+sub t2h_default_index_summary_file_entry ($$$$$$$$)
+{
+ my $index_name = shift;
+ my $key = shift;
+ my $origin_href = shift;
+ my $entry = shift;
+ my $texi_entry = shift;
+ my $element_href = shift;
+ my $element_text = shift;
+ my $is_printed = shift;
+ print IDXFILE "key: $key\n origin_href: $origin_href\n entry: $entry\n"
+ . " texi_entry: $texi_entry\n"
+ . " element_href: $element_href\n element_text: $element_text\n";
+}
+
+sub t2h_default_index_summary_file_begin($$)
+{
+ my $name = shift;
+ my $is_printed = shift;
+ open(IDXFILE, ">$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}" . "_$name.idx")
+ || die "Can't open >$Texi2HTML::THISDOC{'destination_directory'}$Texi2HTML::THISDOC{'file_base_name'}" . "_$name.idx for writing: $!\n";
+}
+
+sub t2h_default_index_summary_file_end($$)
+{
+ my $name = shift;
+ my $is_printed = shift;
+ close (IDXFILE);
+}
+
+sub t2h_default_sp($$)
+{
+ my $number = shift;
+ my $preformatted = shift;
+ return "<br>\n" x $number if (!$preformatted);
+ return "\n" x $number;
+}
+
+sub t2h_default_acronym_like($$$$$$)
+{
+ my $command = shift;
+ my $acronym_texi = shift;
+ my $acronym_text = shift;
+ my $with_explanation = shift;
+ my $explanation_lines = shift;
+ my $explanation_text = shift;
+ my $explanation_unformatted = shift;
+
+ my $attribute = $command;
+ my $opening = "<$attribute>";
+ if (defined($explanation_unformatted))
+ {
+ $opening = "<$attribute title=\"$explanation_unformatted\">";
+ }
+ if ($with_explanation)
+ {
+ return &$I('%{acronym_like} (%{explanation})', {'acronym_like' => $opening . $acronym_text . "</$attribute>", 'explanation' => $explanation_text})
+ }
+ else
+ {
+ return $opening . $acronym_text . "</$attribute>";
+ }
+}
+
+sub t2h_default_quotation_prepend_text($$)
+{
+ my $style = shift;
+ my $text = shift;
+ return &$I('@b{%{quotation_arg}:} ', {'quotation_arg' => $text}, {'keep_texi' => 1}) if (defined($text));
+ return undef;
+}
+
+sub t2h_default_quotation($$$$)
+{
+ my $text = shift;
+ my $argument_text = shift;
+ my $argument_style_texi = shift;
+ my $argument_style_id = shift;
+# if (defined($argument_text))
+# {
+# return '<blockquote>' . &$I('%{style}:%{quotation}',
+# {'style' => $argument_text, 'quotation' => $text}) . '</blockquote>' ;
+# }
+ return '<blockquote>' . $text . "</blockquote>\n";
+}
+
+# format the text within a paragraph style format,
+#
+# argument:
+# format name
+# text within the format
+sub t2h_default_paragraph_style_command($$)
+{
+ my $format = shift;
+ my $text = shift;
+ return $text;
+}
+
+# format a whole index
+#
+# argument:
+# index text
+# index name
+sub t2h_default_print_index($$)
+{
+ my $text = shift;
+ my $name = shift;
+ return "<table border=\"0\" class=\"index-$name\">\n" .
+ "<tr><td></td><th align=\"left\">" . &$I('Index Entry') . "</th><th align=\"left\"> " . &$I('Section') . "</th></tr>\n"
+ . "<tr><td colspan=\"3\"> $DEFAULT_RULE</td></tr>\n" . $text .
+ "</table>\n";
+}
+
+# format a letter entry in an index page. The letter entry contains
+# the index entries for the words beginning with that letter. It is
+# a target for links pointing from the summary of the index.
+#
+# arguments:
+# the letter
+# identifier for the letter entry. This should be used to make the target
+# identifier
+# text of the index entries
+sub t2h_default_index_letter($$$)
+{
+ my $letter = shift;
+ my $id = shift;
+ my $text = shift;
+ return '<tr><th>' . &$anchor($id,'',&$protect_text($letter)) .
+ "</th><td></td><td></td></tr>\n" . $text .
+ "<tr><td colspan=\"3\"> $DEFAULT_RULE</td></tr>\n";
+}
+
+# format an index entry (in a letter entry).
+#
+# arguments:
+# href to the main text, linking to the place where the index entry appears
+# entry text
+# href to the main text, linking to the section or node where the index
+# entry appears
+# section or node heading
+sub t2h_default_index_entry($$$$)
+{
+ my $text_href = shift;
+ my $entry = shift;
+ my $element_href = shift;
+ my $element_text = shift;
+
+ return '<tr><td></td><td valign="top">' . &$anchor('', $text_href, $entry)
+ . '</td><td valign="top">' . &$anchor('', $element_href, $element_text)
+ . "</td></tr>\n";
+}
+
+
+sub t2h_default_copying_comment($)
+{
+ my $copying_lines = shift;
+ my $text = &$comment(main::remove_texi(@$copying_lines));
+ return $text;
+}
+# format a letter appearing in a summary for an index. The letter links to
+# the place where the index elements beginning with this letter are (called
+# a letter entry).
+#
+# arguments:
+# letter
+# file where the target letter entry is
+# identifier for the target letter entry
+sub t2h_default_summary_letter($$$)
+{
+ my $letter = shift;
+ my $file = shift;
+ my $identifier = shift;
+ return &$anchor('', $file . '#' . $identifier, '<b>' . &$protect_text($letter) . '</b>', 'class="summary-letter"');
+}
+
+# format an index summary. This is a list of letters linking to the letter
+# entries.
+#
+# arguments:
+# array reference containing the formatted alphabetical letters
+# array reference containing the formatted non lphabetical letters
+sub t2h_default_index_summary($$)
+{
+ my $alpha = shift;
+ my $nonalpha = shift;
+ my $join = '';
+ my $nonalpha_text = '';
+ my $alpha_text = '';
+ $join = " &nbsp; \n<br>\n" if (@$nonalpha and @$alpha);
+ if (@$nonalpha)
+ {
+ $nonalpha_text = join("\n &nbsp; \n", @$nonalpha) . "\n";
+ }
+ if (@$alpha)
+ {
+ $alpha_text = join("\n &nbsp; \n", @$alpha) . "\n &nbsp; \n";
+ }
+ return "<table><tr><th valign=\"top\">" . &$I('Jump to') .": &nbsp; </th><td>" .
+ $nonalpha_text . $join . $alpha_text . "</td></tr></table>\n";
+}
+
+1;
diff --git a/Build/source/utils/texi2html/texi2html.pl b/Build/source/utils/texi2html/texi2html.pl
new file mode 100755
index 00000000000..8dbca5b19a3
--- /dev/null
+++ b/Build/source/utils/texi2html/texi2html.pl
@@ -0,0 +1,11827 @@
+#! @PERL@
+'di ';
+'ig 00 ';
+#+##############################################################################
+#
+# texi2html: Program to transform Texinfo documents to HTML
+#
+# Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#-##############################################################################
+
+# This requires perl version 5 or higher
+#require 5.0;
+
+# for POSIX::setlocale and File::Spec
+require 5.00405;
+# Perl pragma to restrict unsafe constructs
+use strict;
+# used in case of tests, to revert to "C" locale.
+use POSIX qw(setlocale LC_ALL LC_CTYPE);
+# used to find a relative path back to the current working directory
+use File::Spec;
+#
+# According to
+# larry.jones@sdrc.com (Larry Jones)
+# this pragma is not present in perl5.004_02:
+#
+# Perl pragma to control optional warnings
+# use warnings;
+
+# Declarations. Empty lines separate the different classes of variables:
+
+
+#++##############################################################################
+#
+# NOTE FOR DEBUGGING THIS SCRIPT:
+# You can run 'perl texi2html.pl' directly, provided you have
+# the environment variable T2H_HOME set to the directory containing
+# the texi2html.init file
+#
+#--##############################################################################
+
+# CVS version:
+# $Id: texi2html.pl,v 1.126 2005/02/04 00:14:39 pertusus Exp $
+
+# Homepage:
+my $T2H_HOMEPAGE = "http://texi2html.cvshome.org/";
+
+# Authors (appears in comments):
+my $T2H_AUTHORS = <<EOT;
+Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author)
+ Karl Berry <karl\@freefriends.org>
+ Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people <dev\@texi2html.cvshome.org>
+Send bugs and suggestions to <users\@texi2html.cvshome.org>
+EOT
+
+# Version: set in configure.in
+my $THISVERSION = '@PACKAGE_VERSION@';
+my $THISPROG = "texi2html $THISVERSION"; # program name and version
+
+# set by configure, prefix for the sysconfdir and so on
+my $prefix = '@prefix@';
+my $sysconfdir;
+my $pkgdatadir;
+my $datadir;
+
+# We need to eval as $prefix has to be expanded. However when we haven't
+# run configure @sysconfdir will be expanded as an array, thus we verify
+# whether configure was run or not
+if ('@sysconfdir@' ne '@' . 'sysconfdir@')
+{
+ $sysconfdir = eval '"@sysconfdir@"';
+}
+else
+{
+ $sysconfdir = "/usr/local/etc";
+}
+
+if ('@datadir@' ne '@' . 'datadir@')
+{
+ $pkgdatadir = eval '"@datadir@/@PACKAGE@"';
+ $datadir = eval '"@datadir@"';
+}
+else
+{
+ $pkgdatadir = "/usr/local/share/texi2html";
+ $datadir = "/usr/local/share";
+}
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+
+#+++############################################################################
+# #
+# Constants #
+# #
+#---############################################################################
+
+my $DEBUG_MENU = 1;
+my $DEBUG_INDEX = 2;
+my $DEBUG_TEXI = 4;
+my $DEBUG_MACROS = 8;
+my $DEBUG_FORMATS = 16;
+my $DEBUG_ELEMENTS = 32;
+my $DEBUG_USER = 64;
+my $DEBUG_L2H = 128;
+
+my $ERROR = "***"; # prefix for errors
+my $WARN = "**"; # prefix for warnings
+
+my $VARRE = '[\w\-]+'; # RE for a variable name
+my $NODERE = '[^:]+'; # RE for node names
+
+my $MAX_LEVEL = 4;
+my $MIN_LEVEL = 1;
+
+my $i18n_dir = 'i18n'; # name of the directory containing the per language files
+my $conf_file_name = 'Config' ;
+my $texinfo_htmlxref = 'htmlxref.cnf';
+
+# directories for texi2html init files
+my @texi2html_config_dirs = ('./');
+push @texi2html_config_dirs, "$ENV{'HOME'}/.texi2html/" if (defined($ENV{'HOME'}));
+push @texi2html_config_dirs, "$sysconfdir/texi2html/" if (defined($sysconfdir));
+push @texi2html_config_dirs, "$pkgdatadir" if (defined($pkgdatadir));
+
+# directories for texinfo configuration files
+my @texinfo_config_dirs = ('./.texinfo/');
+push @texinfo_config_dirs, "$ENV{'HOME'}/.texinfo/" if (defined($ENV{'HOME'}));
+push @texinfo_config_dirs, "$sysconfdir/texinfo/" if (defined($sysconfdir));
+push @texinfo_config_dirs, "$datadir/texinfo/" if (defined($datadir));
+
+#+++############################################################################
+# #
+# Initialization #
+# Pasted content of File $(srcdir)/texi2html.init: Default initializations #
+# #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+{
+package Texi2HTML::Config;
+
+
+sub load($)
+{
+ my $file = shift;
+ eval { require($file) ;};
+ if ($@ ne '')
+ {
+ print STDERR "error loading $file: $@\n";
+ return 0;
+ }
+ return 1;
+}
+
+# customization options variables
+
+use vars qw(
+$DEBUG
+$PREFIX
+$VERBOSE
+$SUBDIR
+$IDX_SUMMARY
+$SPLIT
+$SHORT_REF
+@EXPAND
+$EXPAND
+$TOP
+$DOCTYPE
+$FRAMESET_DOCTYPE
+$CHECK
+$TEST
+$DUMP_TEXI
+$MACRO_EXPAND
+$USE_GLOSSARY
+$INVISIBLE_MARK
+$USE_ISO
+$TOP_FILE
+$TOC_FILE
+$FRAMES
+$SHOW_MENU
+$NUMBER_SECTIONS
+$USE_NODES
+$USE_UNICODE
+$NODE_FILES
+$NODE_NAME_IN_MENU
+$AVOID_MENU_REDUNDANCY
+$SECTION_NAVIGATION
+$SHORTEXTN
+$EXTENSION
+$OUT
+$NOVALIDATE
+$DEF_TABLE
+$LANG
+$DO_CONTENTS
+$DO_SCONTENTS
+$SEPARATED_FOOTNOTES
+$TOC_LINKS
+$L2H
+$L2H_L2H
+$L2H_SKIP
+$L2H_TMP
+$L2H_CLEAN
+$L2H_FILE
+$L2H_HTML_VERSION
+$EXTERNAL_DIR
+@INCLUDE_DIRS
+@PREPEND_DIRS
+$IGNORE_PREAMBLE_TEXT
+@CSS_FILES
+);
+
+# customization variables
+use vars qw(
+$ENCODING
+$DOCUMENT_ENCODING
+$MENU_PRE_STYLE
+$CENTER_IMAGE
+$EXAMPLE_INDENT_CELL
+$SMALL_EXAMPLE_INDENT_CELL
+$SMALL_FONT_SIZE
+$SMALL_RULE
+$DEFAULT_RULE
+$MIDDLE_RULE
+$BIG_RULE
+$TOP_HEADING
+$INDEX_CHAPTER
+$SPLIT_INDEX
+$HREF_DIR_INSTEAD_FILE
+$AFTER_BODY_OPEN
+$PRE_BODY_CLOSE
+$EXTRA_HEAD
+$VERTICAL_HEAD_NAVIGATION
+$WORDS_IN_PAGE
+$ICONS
+$UNNUMBERED_SYMBOL_IN_MENU
+$MENU_SYMBOL
+$OPEN_QUOTE_SYMBOL
+$CLOSE_QUOTE_SYMBOL
+$TOC_LIST_STYLE
+$TOC_LIST_ATTRIBUTE
+$TOP_NODE_FILE
+$NODE_FILE_EXTENSION
+$BEFORE_OVERVIEW
+$AFTER_OVERVIEW
+$BEFORE_TOC_LINES
+$AFTER_TOC_LINES
+$NEW_CROSSREF_STYLE
+%ACTIVE_ICONS
+%NAVIGATION_TEXT
+%PASSIVE_ICONS
+%BUTTONS_GOTO
+%BUTTONS_EXAMPLE
+@CHAPTER_BUTTONS
+@MISC_BUTTONS
+@SECTION_BUTTONS
+@SECTION_FOOTER_BUTTONS
+@NODE_FOOTER_BUTTONS
+);
+
+# customization variables which may be guessed in the script
+#our $ADDRESS;
+use vars qw(
+$BODYTEXT
+$CSS_LINES
+$DOCUMENT_DESCRIPTION
+$EXTERNAL_CROSSREF_SPLIT
+);
+
+# I18n
+use vars qw(
+$I
+$LANGUAGES
+);
+
+# customizable subroutines references
+use vars qw(
+$print_section
+$one_section
+$end_section
+$print_Top_header
+$print_Top_footer
+$print_Top
+$print_Toc
+$print_Overview
+$print_Footnotes
+$print_About
+$print_misc_header
+$print_misc_footer
+$print_misc
+$print_section_header
+$print_section_footer
+$print_chapter_header
+$print_chapter_footer
+$print_page_head
+$print_page_foot
+$print_head_navigation
+$print_foot_navigation
+$button_icon_img
+$print_navigation
+$about_body
+$print_frame
+$print_toc_frame
+$toc_body
+$titlepage
+$css_lines
+$print_redirection_page
+$init_out
+$finish_out
+$node_file_name
+$element_file_name
+
+$protect_text
+$anchor
+$def_item
+$def
+$menu
+$menu_link
+$menu_description
+$menu_comment
+$simple_menu_link
+$ref_beginning
+$info_ref
+$book_ref
+$external_href
+$external_ref
+$internal_ref
+$table_item
+$table_line
+$row
+$cell
+$list_item
+$comment
+$def_line
+$def_line_no_texi
+$raw
+$heading
+$paragraph
+$preformatted
+$foot_line_and_ref
+$foot_section
+$address
+$image
+$index_entry_label
+$index_entry
+$index_letter
+$print_index
+$index_summary
+$summary_letter
+$complex_format
+$cartouche
+$sp
+$definition_category
+$table_list
+$copying_comment
+$index_summary_file_entry
+$index_summary_file_end
+$index_summary_file_begin
+$style
+$format
+$normal_text
+$empty_line
+$unknown
+$unknown_style
+$float
+$caption_shortcaption
+$listoffloats
+$listoffloats_entry
+$listoffloats_caption
+$listoffloats_float_style
+$listoffloats_style
+$acronym_like
+$quotation
+$quotation_prepend_text
+$paragraph_style_command
+
+$PRE_ABOUT
+$AFTER_ABOUT
+);
+
+# hash which entries might be redefined by the user
+use vars qw(
+$complex_format_map
+%accent_map
+%def_map
+%format_map
+%simple_map
+%simple_map_pre
+%simple_map_texi
+%style_map
+%style_map_pre
+%style_map_texi
+%unformatted_text_simple_map_texi
+%unformatted_text_style_map_texi
+%unformatted_text_texi_map
+%paragraph_style
+%things_map
+%pre_map
+%texi_map
+%unicode_map
+%unicode_diacritical
+%ascii_character_map
+%ascii_simple_map
+%ascii_things_map
+%perl_charset_to_html
+%iso_symbols
+%misc_command
+%css_map
+%format_in_paragraph
+%special_list_commands
+%accent_letters
+%unicode_accents
+%special_accents
+);
+
+$I = \&Texi2HTML::I18n::get_string;
+
+$toc_body = \&T2H_GPL_toc_body;
+$style = \&T2H_GPL_style;
+$format = \&T2H_GPL_format;
+$normal_text = \&t2h_gpl_normal_text;
+
+sub T2H_GPL_toc_body($)
+{
+ my $elements_list = shift;
+# my $do_contents = shift;
+# my $do_scontents = shift;
+ #return unless ($do_contents or $do_scontents or $FRAMES);
+ return unless ($DO_CONTENTS or $DO_SCONTENTS or $FRAMES);
+ my $current_level = 0;
+ my $ul_style = $NUMBER_SECTIONS ? $TOC_LIST_ATTRIBUTE : '';
+ foreach my $element (@$elements_list)
+ {
+ next if ($element->{'top'} or $element->{'index_page'});
+ my $ind = ' ' x $current_level;
+ my $level = $element->{'toc_level'};
+ print STDERR "Bug no toc_level for ($element) $element->{'texi'}\n" if (!defined ($level));
+ if ($level > $current_level)
+ {
+ while ($level > $current_level)
+ {
+ $current_level++;
+ my $ln = "\n$ind<ul${ul_style}>\n";
+ $ind = ' ' x $current_level;
+ push(@{$Texi2HTML::TOC_LINES}, $ln);
+ }
+ }
+ elsif ($level < $current_level)
+ {
+ while ($level < $current_level)
+ {
+ $current_level--;
+ $ind = ' ' x $current_level;
+ my $line = "</li>\n$ind</ul>";
+ $line .= "</li>" if ($level == $current_level);
+ push(@{$Texi2HTML::TOC_LINES}, "$line\n");
+
+ }
+ }
+ else
+ {
+ push(@{$Texi2HTML::TOC_LINES}, "</li>\n");
+ }
+ my $file = '';
+ $file = $element->{'file'} if ($SPLIT);
+ my $text = $element->{'text'};
+ $text = $element->{'name'} unless ($NUMBER_SECTIONS);
+ my $entry = "<li>" . &$anchor ($element->{'tocid'}, "$file#$element->{'id'}",$text);
+ push (@{$Texi2HTML::TOC_LINES}, $ind . $entry);
+ push(@{$Texi2HTML::OVERVIEW}, $entry. "</li>\n") if ($level == 1);
+ }
+ while (0 < $current_level)
+ {
+ $current_level--;
+ my $ind = ' ' x $current_level;
+ push(@{$Texi2HTML::TOC_LINES}, "</li>\n$ind</ul>\n");
+ }
+ #@{$Texi2HTML::TOC_LINES} = () unless ($do_contents);
+ @{$Texi2HTML::TOC_LINES} = () unless ($DO_CONTENTS);
+ if (@{$Texi2HTML::TOC_LINES})
+ {
+ unshift @{$Texi2HTML::TOC_LINES}, $BEFORE_TOC_LINES;
+ push @{$Texi2HTML::TOC_LINES}, $AFTER_TOC_LINES;
+ }
+ #@{$Texi2HTML::OVERVIEW} = () unless ($do_scontents or $FRAMES);
+ @{$Texi2HTML::OVERVIEW} = () unless ($DO_SCONTENTS or $FRAMES);
+ if (@{$Texi2HTML::OVERVIEW})
+ {
+ unshift @{$Texi2HTML::OVERVIEW}, "<ul${ul_style}>\n";
+ push @{$Texi2HTML::OVERVIEW}, "</ul>\n";
+ unshift @{$Texi2HTML::OVERVIEW}, $BEFORE_OVERVIEW;
+ push @{$Texi2HTML::OVERVIEW}, $AFTER_OVERVIEW;
+ }
+}
+
+sub T2H_GPL_style($$$$$$$$$)
+{ # known style
+ my $style = shift;
+ my $command = shift;
+ my $text = shift;
+ my $args = shift;
+ my $no_close = shift;
+ my $no_open = shift;
+ my $line_nr = shift;
+ my $state = shift;
+ my $style_stack = shift;
+
+ my $do_quotes = 0;
+ my $use_attribute = 0;
+ my $use_begin_end = 0;
+ if (ref($style) eq 'HASH')
+ {
+ #print STDERR "GPL_STYLE $command\n";
+ #print STDERR " @$args\n";
+ $do_quotes = $style->{'quote'};
+ if ((@{$style->{'args'}} == 1) and defined($style->{'attribute'}))
+ {
+ $style = $style->{'attribute'};
+ $use_attribute = 1;
+ $text = $args->[0];
+ }
+ elsif (defined($style->{'function'}))
+ {
+ $text = &{$style->{'function'}}($command, $args, $style_stack, $state, $line_nr);
+ }
+ }
+ else
+ {
+ if ($style =~ s/^\"//)
+ { # add quotes
+ $do_quotes = 1;
+ }
+ if ($style =~ s/^\&//)
+ { # custom
+ $style = 'Texi2HTML::Config::' . $style;
+ eval "\$text = &$style(\$text, \$command, \$style_stack)";
+ }
+ elsif ($style ne '')
+ {
+ $use_attribute = 1;
+ }
+ else
+ { # no style
+ }
+ }
+ if ($use_attribute)
+ { # good style
+ my $attribute_text = '';
+ if ($style =~ /^(\w+)(\s+.*)/)
+ {
+ $style = $1;
+ $attribute_text = $2;
+ }
+ if ($do_quotes)
+ {
+ $text = $OPEN_QUOTE_SYMBOL . "$text" if (!$no_open);
+ $text .= $CLOSE_QUOTE_SYMBOL if (!$no_close);
+ }
+ $text = "<${style}$attribute_text>$text</$style>" ;
+ }
+ if (ref($style) eq 'HASH')
+ {
+ if (defined($style->{'begin'}) and !$no_open)
+ {
+ $text = $style->{'begin'} . $text;
+ }
+ if (defined($style->{'end'}) and !$no_close)
+ {
+ $text = $text . $style->{'end'};
+ }
+ }
+ if ($do_quotes and !$use_attribute)
+ {
+ $text = $OPEN_QUOTE_SYMBOL . "$text" if (!$no_open);
+ $text .= $CLOSE_QUOTE_SYMBOL if (!$no_close);
+ }
+ return $text;
+}
+
+sub T2H_GPL_format($$$)
+{
+ my $tag = shift;
+ my $element = shift;
+ my $text = shift;
+ return '' if (!defined($element) or ($text !~ /\S/));
+ return $text if ($element eq '');
+ my $attribute_text = '';
+ if ($element =~ /^(\w+)(\s+.*)/)
+ {
+ $element = $1;
+ $attribute_text = $2;
+ }
+ return "<${element}$attribute_text>\n" . $text. "</$element>\n";
+}
+
+sub t2h_gpl_normal_text($)
+{
+ my $text = shift;
+ $text =~ s/``/"/go;
+ $text =~ s/''/"/go;
+ $text =~ s/-(--?)/$1/go;
+ return $text;
+}
+# @INIT@
+
+require "$ENV{T2H_HOME}/texi2html.init"
+ if ($0 =~ /\.pl$/ &&
+ -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+my $translation_file = 'translations.pl'; # file containing all the translations
+my $T2H_OBSOLETE_STRINGS;
+require "$ENV{T2H_HOME}/$translation_file"
+ if ($0 =~ /\.pl$/ &&
+ -e "$ENV{T2H_HOME}/$translation_file" && -r "$ENV{T2H_HOME}/$translation_file");
+
+# @T2H_TRANSLATIONS_FILE@
+my $index_name = -1;
+my @index_to_hash = ('style_map', 'style_map_pre', 'style_map_texi');
+foreach my $hash (\%style_map, \%style_map_pre, \%style_map_texi, \%unformatted_text_style_map_texi)
+{
+ $index_name++;
+ my $name = $index_to_hash[$index_name];
+ foreach my $style (keys(%{$hash}))
+ {
+ next unless (ref($hash->{$style}) eq 'HASH');
+ $hash->{$style}->{'args'} = ['normal'] if (!exists($hash->{$style}->{'args'}));
+ die "Bug: args not defined for $style in $name" if (!defined($hash->{$style}->{'args'}));
+#print STDERR "DEFAULT($name, $hash) add normal as arg for $style ($hash->{$style}), $hash->{$style}->{'args'}\n";
+ }
+}
+
+sub t2h_utf8_accent($$)
+{
+ my $accent = shift;
+ my $args = shift;
+ my $style_stack = shift;
+
+ my $text = $args->[0];
+
+ if ($accent eq 'dotless')
+ { # \x{0131}\x{0308} for @dotless{i} @" doesn't lead to NFC 00ef.
+ if (($text eq 'i') and (!defined($style_stack->[-2]) or (!defined($unicode_accents{$style_stack->[-2]})) or ($style_stack->[-2] eq 'tieaccent')))
+ {
+ return "\x{0131}";
+ }
+ #return "\x{}" if ($text eq 'j'); # not found !
+ return $text;
+ }
+
+ return Unicode::Normalize::NFC($text . chr(hex($unicode_diacritical{$accent})))
+ if (defined($unicode_diacritical{$accent}));
+ return ascii_accents($text, $accent);
+}
+
+sub t2h_utf8_normal_text($)
+{
+ my $text = shift;
+ $text =~ s/---/\x{2014}/g;
+ $text =~ s/--/\x{2013}/g;
+ $text =~ s/``/\x{201C}/g;
+ $text =~ s/''/\x{201D}/g;
+ return $text;
+}
+
+sub t2h_cross_manual_normal_text($)
+{
+ my $text = shift;
+ $text = main::normalise_space($text);
+ my $result = '';
+ while ($text ne '')
+ {
+ if ($text =~ s/^([A-Za-z0-9]+)//o)
+ {
+ $result .= $1;
+ }
+ elsif ($text =~ s/^ //o)
+ {
+ $result .= '-';
+ }
+ elsif ($text =~ s/^(.)//o)
+ {
+ if (exists($ascii_character_map{$1}))
+ {
+ $result .= '_' . lc($ascii_character_map{$1});
+ }
+ elsif ($USE_UNICODE)
+ {
+ $result .= $1;
+ }
+ else
+ {
+ $result .= '_' . '00' . lc(sprintf("%02x",ord($1)));
+ }
+ }
+ else
+ {
+ print STDERR "Bug: unknown character in node (likely in infinite loop)\n";
+ sleep 1;
+ }
+ }
+
+ return $result;
+}
+
+sub t2h_nounicode_cross_manual_accent($$)
+{
+ my $accent = shift;
+ my $args = shift;
+
+ my $text = $args->[0];
+
+ return '_' . lc($unicode_accents{$accent}->{$text})
+ if (defined($unicode_accents{$accent}->{$text}));
+ return ($text . '_' . lc($unicode_diacritical{$accent}))
+ if (defined($unicode_diacritical{$accent}));
+ return ascii_accents($text, $accent);
+}
+
+$USE_UNICODE = '@USE_UNICODE@';
+if ($USE_UNICODE eq '@USE_UNICODE@')
+{
+ $USE_UNICODE = 1;
+ eval {
+ require Encode;
+ require Unicode::Normalize;
+ Encode->import('encode');
+ };
+ $USE_UNICODE = 0 if ($@);
+}
+
+}
+
+use vars qw(
+%value
+);
+
+# This is deprecated
+#our %user_sub;
+
+# variables which might be redefined by the user but aren't likely to be
+# they seem to be in the main namespace
+use vars qw(
+$index_properties
+%predefined_index
+%valid_index
+%sec2level
+%code_style_map
+%region_lines
+);
+
+# Some global variables are set in the script, and used in the subroutines
+# they are in the Texi2HTML namespace, thus prefixed with Texi2HTML::.
+# see texi2html.init for details.
+
+#+++############################################################################
+# #
+# Initialization #
+# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing #
+# #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+# @MYSIMPLE@
+
+require "$ENV{T2H_HOME}/MySimple.pm"
+ if ($0 =~ /\.pl$/ &&
+ -e "$ENV{T2H_HOME}/MySimple.pm" && -r "$ENV{T2H_HOME}/MySimple.pm");
+
+#+++############################################################################
+# #
+# Initialization #
+# Pasted content of File $(srcdir)/T2h_i18n.pm: Internationalisation #
+# #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/T2h_i18n.pm
+# exists.
+
+# @T2H_I18N@
+require "$ENV{T2H_HOME}/T2h_i18n.pm"
+ if ($0 =~ /\.pl$/ &&
+ -e "$ENV{T2H_HOME}/T2h_i18n.pm" && -r "$ENV{T2H_HOME}/T2h_i18n.pm");
+
+
+{
+package Texi2HTML::LaTeX2HTML::Config;
+
+# latex2html variables
+# These variables are not used. They are here for information only, and
+# an example of config file for latex2html file is included.
+my $ADDRESS;
+my $ANTI_ALIAS;
+my $ANTI_ALIAS_TEXT;
+my $ASCII_MODE;
+my $AUTO_LINK;
+my $AUTO_PREFIX;
+my $CHILDLINE;
+my $DEBUG;
+my $DESTDIR;
+my $ERROR;
+my $EXTERNAL_FILE;
+my $EXTERNAL_IMAGES;
+my $EXTERNAL_UP_LINK;
+my $EXTERNAL_UP_TITLE;
+my $FIGURE_SCALE_FACTOR;
+my $HTML_VERSION;
+my $IMAGES_ONLY;
+my $INFO;
+my $LINE_WIDTH;
+my $LOCAL_ICONS;
+my $LONG_TITLES;
+my $MATH_SCALE_FACTOR;
+my $MAX_LINK_DEPTH;
+my $MAX_SPLIT_DEPTH;
+my $NETSCAPE_HTML;
+my $NOLATEX;
+my $NO_FOOTNODE;
+my $NO_IMAGES;
+my $NO_NAVIGATION;
+my $NO_SIMPLE_MATH;
+my $NO_SUBDIR;
+my $PAPERSIZE;
+my $PREFIX;
+my $PS_IMAGES;
+my $REUSE;
+my $SCALABLE_FONTS;
+my $SHORTEXTN;
+my $SHORT_INDEX;
+my $SHOW_SECTION_NUMBERS;
+my $SPLIT;
+my $TEXDEFS;
+my $TITLE;
+my $TITLES_LANGUAGE;
+my $TMP;
+my $VERBOSE;
+my $WORDS_IN_NAVIGATION_PANEL_TITLES;
+my $WORDS_IN_PAGE;
+
+# @T2H_L2H_INIT@
+}
+
+package main;
+
+#
+# pre-defined indices
+#
+$index_properties =
+{
+ 'c' => { name => 'cp'},
+ 'f' => { name => 'fn', code => 1},
+ 'v' => { name => 'vr', code => 1},
+ 'k' => { name => 'ky', code => 1},
+ 'p' => { name => 'pg', code => 1},
+ 't' => { name => 'tp', code => 1}
+};
+
+
+%predefined_index = (
+ 'cp', 'c',
+ 'fn', 'f',
+ 'vr', 'v',
+ 'ky', 'k',
+ 'pg', 'p',
+ 'tp', 't',
+ );
+
+#
+# valid indices
+#
+%valid_index = (
+ 'c', 1,
+ 'f', 1,
+ 'v', 1,
+ 'k', 1,
+ 'p', 1,
+ 't', 1,
+ );
+
+#
+# commands with ---, -- '' and `` preserved
+# usefull with the old interface
+
+%code_style_map = (
+ 'code' => 1,
+ 'command' => 1,
+ 'env' => 1,
+ 'file' => 1,
+ 'kbd' => 1,
+ 'option' => 1,
+ 'samp' => 1,
+ 'verb' => 1,
+);
+
+my $simple_map_ref = \%Texi2HTML::Config::simple_map;
+my $simple_map_pre_ref = \%Texi2HTML::Config::simple_map_pre;
+my $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi;
+my $style_map_ref = \%Texi2HTML::Config::style_map;
+my $style_map_pre_ref = \%Texi2HTML::Config::style_map_pre;
+my $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi;
+my $things_map_ref = \%Texi2HTML::Config::things_map;
+my $pre_map_ref = \%Texi2HTML::Config::pre_map;
+my $texi_map_ref = \%Texi2HTML::Config::texi_map;
+
+# delete from hash if we are using te new interface
+foreach my $code (keys(%code_style_map))
+{
+ delete ($code_style_map{$code})
+ if (ref($style_map_ref->{$code}) eq 'HASH');
+}
+
+# no paragraph in these commands
+my %no_paragraph_macro = (
+ 'xref' => 1,
+ 'ref' => 1,
+ 'pxref' => 1,
+ 'inforef' => 1,
+ 'anchor' => 1,
+);
+
+
+#foreach my $command (keys(%Texi2HTML::Config::style_map))
+#{
+# next unless (ref($style_map_ref->{$command}) eq 'HASH');
+# print STDERR "CMD: $command\n";
+# die "Bug: no args for $command in style_map\n" unless defined($style_map_ref->{$command}->{'args'});
+# die "Bug: no args for $command in style_map_pre\n" unless defined($style_map_pre_ref->{$command}->{'args'});
+# die "Bug: non existence of args for $command in style_map_texi\n" unless (exists($style_map_texi_ref->{$command}->{'args'}));
+# die "Bug: no args for $command in style_map_texi\n" unless defined($style_map_texi_ref->{$command}->{'args'});
+#}
+
+#
+# texinfo section names to level
+#
+%sec2level = (
+ 'top', 0,
+ 'chapter', 1,
+ 'unnumbered', 1,
+ 'chapheading', 1,
+ 'appendix', 1,
+ 'section', 2,
+ 'unnumberedsec', 2,
+ 'heading', 2,
+ 'appendixsec', 2,
+ 'subsection', 3,
+ 'unnumberedsubsec', 3,
+ 'subheading', 3,
+ 'appendixsubsec', 3,
+ 'subsubsection', 4,
+ 'unnumberedsubsubsec', 4,
+ 'subsubheading', 4,
+ 'appendixsubsubsec', 4,
+ );
+
+# the reverse mapping. There is an entry for each sectionning command.
+# The value is a ref on an array containing at each index the corresponding
+# sectionning command name.
+my %level2sec;
+{
+ my $sections = [ ];
+ my $appendices = [ ];
+ my $unnumbered = [ ];
+ my $headings = [ ];
+ foreach my $command (keys (%sec2level))
+ {
+ if ($command =~ /^appendix/)
+ {
+ $level2sec{$command} = $appendices;
+ }
+ elsif ($command =~ /^unnumbered/ or $command eq 'top')
+ {
+ $level2sec{$command} = $unnumbered;
+ }
+ elsif ($command =~ /section$/ or $command eq 'chapter')
+ {
+ $level2sec{$command} = $sections;
+ }
+ else
+ {
+ $level2sec{$command} = $headings;
+ }
+ $level2sec{$command}->[$sec2level{$command}] = $command;
+ }
+}
+
+# this are synonyms
+$sec2level{'appendixsection'} = 2;
+# sec2level{'majorheading'} is also 1 and not 0
+$sec2level{'majorheading'} = 1;
+$sec2level{'chapheading'} = 1;
+# FIXME this one could be centered...
+$sec2level{'centerchap'} = 1;
+
+# regions treated especially. The text for these regions is collected in the
+# corresponding array
+%region_lines = (
+ 'titlepage' => [ ],
+ 'documentdescription' => [ ],
+ 'copying' => [ ],
+);
+
+# those macros aren't considered as beginning a paragraph
+my %no_line_macros = (
+ 'macro' => 1,
+ 'unmacro' => 1,
+ 'rmacro' => 1,
+ 'set' => 1,
+ 'clear' => 1,
+ 'titlefont' => 1,
+ 'include' => 1,
+ 'copying' => 1,
+ 'end copying' => 1,
+ 'tab' => 1,
+ 'item' => 1,
+ 'itemx' => 1,
+ '*' => 1,
+ 'float' => 1,
+ 'end float' => 1,
+ 'caption' => 1,
+ 'shortcaption' => 1,
+);
+
+foreach my $key (keys(%Texi2HTML::Config::misc_command))
+{
+ $no_line_macros{$key} = 1;
+}
+
+# a hash associating a format @thing / @end thing with the type of the format
+# 'complex' 'simple' 'deff' 'list' 'menu' 'paragraph_style'
+my %format_type = ();
+
+foreach my $simple_format (keys(%Texi2HTML::Config::format_map))
+{
+ $format_type{$simple_format} = 'simple';
+ $no_line_macros{$simple_format} = 1;
+ $no_line_macros{"end $simple_format"} = 1;
+}
+foreach my $paragraph_style (keys(%Texi2HTML::Config::paragraph_style))
+{
+ $format_type{$paragraph_style} = 'paragraph_style';
+ $no_line_macros{$paragraph_style} = 1;
+ $no_line_macros{"end $paragraph_style"} = 1;
+}
+foreach my $complex_format (keys(%$Texi2HTML::Config::complex_format_map))
+{
+ $format_type{$complex_format} = 'complex';
+ $no_line_macros{$complex_format} = 1;
+ $no_line_macros{"end $complex_format"} = 1;
+}
+foreach my $table (('table', 'ftable', 'vtable', 'multitable'))
+{
+ $format_type{$table} = 'table';
+ $no_line_macros{$table} = 1;
+ $no_line_macros{"end $table"} = 1;
+}
+foreach my $def_format (keys(%Texi2HTML::Config::def_map))
+{
+ $format_type{$def_format} = 'deff';
+ $no_line_macros{$def_format} = 1;
+ $no_line_macros{"end $def_format"} = 1;
+}
+$format_type{'itemize'} = 'list';
+$format_type{'enumerate'} = 'list';
+
+$format_type{'menu'} = 'menu';
+
+$format_type{'cartouche'} = 'cartouche';
+
+$format_type{'float'} = 'float';
+
+$format_type{'quotation'} = 'quotation';
+
+$format_type{'group'} = 'group';
+
+foreach my $macro (('itemize', 'enumerate', 'menu', 'cartouche', 'float', 'quotation'))
+{
+ $no_line_macros{$macro} = 1;
+ $no_line_macros{"end $macro"} = 1;
+}
+
+foreach my $macro (keys(%Texi2HTML::Config::format_in_paragraph))
+{
+ $no_line_macros{$macro} = 1;
+ $no_line_macros{"end $macro"} = 1;
+}
+
+# fake format at the bottom of the stack
+$format_type{'noformat'} = '';
+
+# fake formats are formats used internally within other formats
+# we associate them with a real format, for the error messages
+my %fake_format = (
+ 'line' => 'table',
+ 'term' => 'table',
+ 'item' => 'list or table',
+ 'row' => 'multitable row',
+ 'cell' => 'multitable cell',
+ 'deff_item' => 'definition command',
+ 'menu_comment' => 'menu',
+ 'menu_description' => 'menu',
+ 'menu_preformatted' => 'menu',
+ );
+
+foreach my $key (keys(%fake_format))
+{
+ $format_type{$key} = 'fake';
+}
+
+# A hash associating style @-comand with the type, 'accent', real 'style',
+# 'simple' style, or 'special'.
+my %style_type = ();
+foreach my $style (keys(%Texi2HTML::Config::style_map))
+{
+ $style_type{$style} = 'style';
+}
+foreach my $accent (keys(%Texi2HTML::Config::unicode_accents), 'tieaccent', 'dotless')
+{
+ $style_type{$accent} = 'accent';
+}
+foreach my $simple ('ctrl', 'w', 'url')
+{
+ $style_type{$simple} = 'simple';
+}
+foreach my $special ('footnote', 'ref', 'xref', 'pxref', 'inforef', 'anchor', 'image')
+{
+ $style_type{$special} = 'special';
+}
+
+# raw formats which are expanded especially
+my @raw_regions = ('html', 'verbatim', 'tex', 'xml', 'docbook');
+
+# special raw formats which are expanded between first and second pass
+# and are replaced by specific commands. Currently used for tex. It takes
+# precedence over raw_regions.
+my @special_regions = ();
+
+# regions expanded or not depending on the value of this hash
+my %text_macros = (
+ 'iftex' => 0,
+ 'ignore' => 0,
+ 'menu' => 0,
+ 'ifplaintext' => 0,
+ 'ifinfo' => 0,
+ 'ifxml' => 0,
+ 'ifhtml' => 0,
+ 'ifdocbook' => 0,
+ 'html' => 0,
+ 'tex' => 0,
+ 'xml' => 0,
+ 'titlepage' => 1,
+ 'documentdescription' => 1,
+ 'copying' => 1,
+ 'ifnothtml' => 1,
+ 'ifnottex' => 1,
+ 'ifnotplaintext' => 1,
+ 'ifnotinfo' => 1,
+ 'ifnotxml' => 1,
+ 'ifnotdocbook' => 1,
+ 'direntry' => 0,
+ 'verbatim' => 'raw',
+ 'ifclear' => 'value',
+ 'ifset' => 'value'
+ );
+
+
+
+foreach my $key (keys(%text_macros))
+{
+ unless ($text_macros{$key} eq 'raw')
+ {
+ $no_line_macros{$key} = 1;
+ $no_line_macros{"end $key"} = 1;
+ }
+}
+
+# The css formats are associated with complex format commands, and associated
+# with the 'pre_style' key
+foreach my $complex_format (keys(%$Texi2HTML::Config::complex_format_map))
+{
+ next if (defined($Texi2HTML::Config::complex_format_map->{$complex_format}->{'pre_style'}));
+ $Texi2HTML::Config::complex_format_map->{$complex_format}->{'pre_style'} = '';
+ $Texi2HTML::Config::complex_format_map->{$complex_format}->{'pre_style'} = $Texi2HTML::Config::css_map{"pre.$complex_format"} if (exists($Texi2HTML::Config::css_map{"pre.$complex_format"}));
+}
+
+#+++############################################################################
+# #
+# Argument parsing, initialisation #
+# #
+#---############################################################################
+
+#
+# flush stdout and stderr after every write
+#
+select(STDERR);
+$| = 1;
+select(STDOUT);
+$| = 1;
+
+#FIXME my or our ?
+my $I = \&Texi2HTML::I18n::get_string;
+
+my $T2H_USER; # user running the script
+my $documentdescription; # text in @documentdescription
+
+# shorthand for Texi2HTML::Config::VERBOSE
+my $T2H_VERBOSE;
+
+sub echo_warn($;$);
+#print STDERR "" . &$I('test i18n: \' , \a \\ %% %{unknown}a %known % %{known} \\', { 'known' => 'a known string', 'no' => 'nope'}); exit 0;
+
+# file: file name to locate. It can be a file path.
+# all_files: if true collect all the files with that name, otherwise stop
+# at first match.
+# directories: a reference on a array containing a list of directories to
+# search the file in. default is \@texi2html_config_dirs.
+sub locate_init_file($;$$)
+{
+ my $file = shift;
+ my $all_files = shift;
+ my $directories = shift;
+
+ $directories = \@texi2html_config_dirs if !defined($directories);
+
+ if ($file =~ /^\//)
+ {
+ return $file if (-e $file and -r $file);
+ }
+ else
+ {
+ my @files;
+ foreach my $dir (@$directories)
+ {
+ next unless (-d "$dir");
+ if ($all_files)
+ {
+ push (@files, "$dir/$file") if (-e "$dir/$file" and -r "$dir/$file");
+ }
+ else
+ {
+ return "$dir/$file" if (-e "$dir/$file" and -r "$dir/$file");
+ }
+ }
+ return @files if ($all_files);
+ }
+ return undef;
+}
+
+# called on -init-file
+sub load_init_file
+{
+ # First argument is option
+ shift;
+ # second argument is value of options
+ my $init_file = shift;
+ my $file;
+ if ($file = locate_init_file($init_file))
+ {
+ print STDERR "# reading initialization file from $file\n"
+ if ($T2H_VERBOSE);
+ return (Texi2HTML::Config::load($file));
+ }
+ else
+ {
+ print STDERR "$ERROR Error: can't read init file $init_file\n";
+ return 0;
+ }
+}
+
+my $cmd_line_lang = 0; # 1 if lang was succesfully set by the command line
+ # in that case @documentlanguage is ignored.
+my $lang_set = 0; # 1 if lang was set
+
+#
+# called on -lang
+sub set_document_language ($;$$)
+{
+ my $lang = shift;
+ my $from_command_line = shift;
+ my $line_nr = shift;
+ my @files = locate_init_file("$i18n_dir/$lang", 1);
+ foreach my $file (@files)
+ {
+ Texi2HTML::Config::load($file);
+ }
+ if (Texi2HTML::I18n::set_language($lang))
+ {
+ print STDERR "# using '$lang' as document language\n" if ($T2H_VERBOSE);
+ $Texi2HTML::Config::LANG = $lang;
+ $lang_set = 1;
+ $cmd_line_lang = 1 if ($from_command_line);
+ if (!$Texi2HTML::Config::TEST)
+ {
+ $Texi2HTML::THISDOC{'today'} = Texi2HTML::I18n::pretty_date($Texi2HTML::Config::LANG); # like "20 September 1993";
+ }
+ else
+ {
+ $Texi2HTML::THISDOC{'today'} = 'a sunny day';
+ }
+ $things_map_ref->{'today'} = $Texi2HTML::THISDOC{'today'};
+ $pre_map_ref->{'today'} = $Texi2HTML::THISDOC{'today'};
+ $texi_map_ref->{'today'} = $Texi2HTML::THISDOC{'today'};
+ }
+ else
+ {
+ echo_error ("Language specs for '$lang' do not exists. Reverting to '$Texi2HTML::Config::LANG'", $line_nr);
+ }
+}
+
+sub set_expansion($$)
+{
+ my $region = shift;
+ my $set = shift;
+ $set = 1 if (!defined($set));
+ if ($set)
+ {
+ push (@Texi2HTML::Config::EXPAND, $region) unless (grep {$_ eq $region} @Texi2HTML::Config::EXPAND);
+ }
+ else
+ {
+ @Texi2HTML::Config::EXPAND = grep {$_ ne $region} @Texi2HTML::Config::EXPAND;
+ }
+}
+
+sub set_encoding($)
+{
+ my $encoding = shift;
+ if ($Texi2HTML::Config::USE_UNICODE)
+ {
+ if (! Encode::resolve_alias($encoding))
+ {
+ echo_warn("Encoding $Texi2HTML::Config::DOCUMENT_ENCODING unknown");
+ return undef;
+ }
+ print STDERR "# Using encoding " . Encode::resolve_alias($encoding) . "\n"
+ if ($T2H_VERBOSE);
+ return Encode::resolve_alias($encoding);
+ }
+ else
+ {
+ echo_warn("Nothing specific done for encodings (due to the perl version)");
+ return undef;
+ }
+}
+
+my %cross_ref_texi_map = %Texi2HTML::Config::texi_map;
+my %cross_ref_simple_map_texi = %Texi2HTML::Config::simple_map_texi;
+my %cross_ref_style_map_texi = ();
+
+foreach my $command (keys(%Texi2HTML::Config::style_map_texi))
+{
+ $cross_ref_style_map_texi{$command} = {};
+ foreach my $key (keys (%{$Texi2HTML::Config::style_map_texi{$command}}))
+ {
+#print STDERR "$command, $key, $style_map_texi{$command}->{$key}\n";
+ $cross_ref_style_map_texi{$command}->{$key} =
+ $Texi2HTML::Config::style_map_texi{$command}->{$key};
+ }
+}
+
+$cross_ref_simple_map_texi{"\n"} = ' ';
+
+
+# This function is used to construct a link name from a node name as
+# described in the proposal I posted on texinfo-pretest.
+sub cross_manual_links($$)
+{
+ my $nodes_hash = shift;
+ my $cross_reference_hash = shift;
+
+ $simple_map_texi_ref = \%cross_ref_simple_map_texi;
+ $style_map_texi_ref = \%cross_ref_style_map_texi;
+ $texi_map_ref = \%cross_ref_texi_map;
+ my $normal_text_kept = $Texi2HTML::Config::normal_text;
+ $Texi2HTML::Config::normal_text = \&Texi2HTML::Config::t2h_cross_manual_normal_text;
+
+ foreach my $key (keys(%$nodes_hash))
+ {
+ my $node = $nodes_hash->{$key};
+ next if ($node->{'index_page'});
+ if (!defined($node->{'texi'}))
+ {
+ # begin debug section
+ foreach my $key (keys(%$node))
+ {
+ #print STDERR "$key:$node->{$key}!!!\n";
+ }
+ # end debug section
+ }
+ else
+ {
+ if ($Texi2HTML::Config::USE_UNICODE)
+ {
+ my $text = $node->{'texi'};
+#print STDERR "CROSS_MANUAL $node->{'texi'}\n";
+ if (defined($Texi2HTML::Config::DOCUMENT_ENCODING) and
+ Encode::resolve_alias($Texi2HTML::Config::DOCUMENT_ENCODING) and
+ (Encode::resolve_alias($Texi2HTML::Config::DOCUMENT_ENCODING) ne 'utf8'))
+ {
+ $text = Encode::decode($Texi2HTML::Config::DOCUMENT_ENCODING, $text);
+ }
+ $node->{'cross_manual_target'} = unicode_to_protected(Unicode::Normalize::NFC(remove_texi($text)));
+ }
+ else
+ {
+ $node->{'cross_manual_target'} = remove_texi($node->{'texi'});
+ }
+#print STDERR "CROSS_MANUAL_TARGET $node->{'cross_manual_target'}\n";
+ unless ($node->{'external_node'})
+ {
+ if (defined($cross_reference_hash->{$node->{'cross_manual_target'}}))
+ {
+ echo_error("Node equivalent with `$node->{'texi'}' allready used `$cross_reference_hash->{$node->{'cross_manual_target'}}'");
+ }
+ else
+ {
+ $cross_reference_hash->{$node->{'cross_manual_target'}} = $node->{'texi'};
+ }
+ }
+ #print STDERR "$node->{'texi'}: $node->{'cross_manual_target'}\n";
+ }
+ }
+
+ $Texi2HTML::Config::normal_text = $normal_text_kept;
+ $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi;
+ $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi;
+ $texi_map_ref = \%Texi2HTML::Config::texi_map;
+}
+
+sub unicode_to_protected($)
+{
+ my $text = shift;
+ my $result = '';
+ while ($text ne '')
+ {
+ if ($text =~ s/^([A-Za-z0-9_\-]+)//o)
+ {
+ $result .= $1;
+ }
+ elsif ($text =~ s/^(.)//o)
+ {
+ $result .= '_' . lc(sprintf("%04x",ord($1)));
+ }
+ else
+ {
+ print STDERR "Bug: unknown character in node (likely in infinite loop)\n";
+ sleep 1;
+ }
+ }
+
+ return $result;
+}
+
+sub cross_manual_line($)
+{
+ my $text = shift;
+#print STDERR "cross_manual_line $text\n";
+ $simple_map_texi_ref = \%cross_ref_simple_map_texi;
+ $style_map_texi_ref = \%cross_ref_style_map_texi;
+ $texi_map_ref = \%cross_ref_texi_map;
+ my $normal_text_kept = $Texi2HTML::Config::normal_text;
+ $Texi2HTML::Config::normal_text = \&Texi2HTML::Config::t2h_cross_manual_normal_text;
+
+ my $cross_ref;
+ if ($Texi2HTML::Config::USE_UNICODE)
+ {
+ $cross_ref = unicode_to_protected(Unicode::Normalize::NFC(remove_texi($text)));
+ }
+ else
+ {
+ $cross_ref = remove_texi($text);
+ }
+
+ $Texi2HTML::Config::normal_text = $normal_text_kept;
+ $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi;
+ $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi;
+ $texi_map_ref = \%Texi2HTML::Config::texi_map;
+#print STDERR "cross_ref $cross_ref\n";
+ return $cross_ref;
+}
+
+# T2H_OPTIONS is a hash whose keys are the (long) names of valid
+# command-line options and whose values are a hash with the following keys:
+# type ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info)
+# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info)
+# verbose ==> short description of option (displayed by -h)
+# noHelp ==> if 1 -> for "not so important options": only print description on -h 1
+# 2 -> for obsolete options: only print description on -h 2
+my $T2H_OPTIONS;
+$T2H_OPTIONS -> {'debug'} =
+{
+ type => '=i',
+ linkage => \$Texi2HTML::Config::DEBUG,
+ verbose => 'output HTML with debuging information',
+};
+
+$T2H_OPTIONS -> {'doctype'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::DOCTYPE,
+ verbose => 'document type which is output in header of HTML files',
+ noHelp => 1
+};
+
+$T2H_OPTIONS -> {'frameset-doctype'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::FRAMESET_DOCTYPE,
+ verbose => 'document type for HTML frameset documents',
+ noHelp => 1
+};
+
+$T2H_OPTIONS -> {'test'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::TEST,
+ verbose => 'use predefined information to avoid differences with reference files',
+ noHelp => 1
+};
+
+$T2H_OPTIONS -> {'dump-texi'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::DUMP_TEXI,
+ verbose => 'dump the output of first pass into a file with extension passfirst and exit',
+ noHelp => 1
+};
+
+$T2H_OPTIONS -> {'macro-expand'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::MACRO_EXPAND,
+ verbose => 'output macro expanded source in <file>',
+};
+
+$T2H_OPTIONS -> {'expand'} =
+{
+ type => '=s',
+ linkage => sub {set_expansion($_[1], 1);},
+ verbose => 'Expand info|tex|none section of texinfo source',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'no-expand'} =
+{
+ type => '=s',
+ linkage => sub {set_expansion ($_[1], 0);},
+ verbose => 'Don\'t expand the given section of texinfo source',
+};
+
+$T2H_OPTIONS -> {'noexpand'} =
+{
+ type => '=s',
+ linkage => $T2H_OPTIONS->{'no-expand'}->{'linkage'},
+ verbose => $T2H_OPTIONS->{'no-expand'}->{'verbose'},
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'ifhtml'} =
+{
+ type => '!',
+ linkage => sub { set_expansion('html', $_[1]); },
+ verbose => "expand ifhtml and html sections",
+};
+
+$T2H_OPTIONS -> {'ifinfo'} =
+{
+ type => '!',
+ linkage => sub { set_expansion('info', $_[1]); },
+ verbose => "expand ifinfo",
+};
+
+$T2H_OPTIONS -> {'ifxml'} =
+{
+ type => '!',
+ linkage => sub { set_expansion('xml', $_[1]); },
+ verbose => "expand ifxml and xml sections",
+};
+
+$T2H_OPTIONS -> {'ifdocbook'} =
+{
+ type => '!',
+ linkage => sub { set_expansion('docbook', $_[1]); },
+ verbose => "expand ifdocbook and docbook sections",
+};
+
+$T2H_OPTIONS -> {'iftex'} =
+{
+ type => '!',
+ linkage => sub { set_expansion('tex', $_[1]); },
+ verbose => "expand iftex and tex sections",
+};
+
+$T2H_OPTIONS -> {'ifplaintext'} =
+{
+ type => '!',
+ linkage => sub { set_expansion('plaintext', $_[1]); },
+ verbose => "expand ifplaintext sections",
+};
+
+#$T2H_OPTIONS -> {'no-ifhtml'} =
+#{
+# type => '!',
+# linkage => sub { set_expansion('html', (! $_[1])); },
+# verbose => "don't expand ifhtml and html sections",
+# noHelp => 1,
+#};
+
+#$T2H_OPTIONS -> {'no-ifinfo'} =
+#{
+# type => '!',
+# linkage => sub { set_expansion('info', (! $_[1])); },
+# verbose => "don't expand ifinfo",
+# noHelp => 1,
+#};
+
+#$T2H_OPTIONS -> {'no-ifxml'} =
+#{
+# type => '!',
+# linkage => sub { set_expansion('xml', (! $_[1])); },
+# verbose => "don't expand ifxml and xml sections",
+# noHelp => 1,
+#};
+
+#$T2H_OPTIONS -> {'no-iftex'} =
+#{
+# type => '!',
+# linkage => sub { set_expansion('tex', (! $_[1])); },
+# verbose => "don't expand iftex and tex sections",
+# noHelp => 1,
+#};
+
+#$T2H_OPTIONS -> {'no-ifplaintext'} =
+#{
+# type => '!',
+# linkage => sub { set_expansion('plaintext', (! $_[1])); },
+# verbose => "don't expand ifplaintext sections",
+# noHelp => 1,
+#};
+
+$T2H_OPTIONS -> {'invisible'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::INVISIBLE_MARK,
+ verbose => 'use text in invisble anchor',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'iso'} =
+{
+ type => 'iso',
+ linkage => \$Texi2HTML::Config::USE_ISO,
+ verbose => 'if set, ISO8859 characters are used for special symbols (like copyright, etc)',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'I'} =
+{
+ type => '=s',
+ linkage => \@Texi2HTML::Config::INCLUDE_DIRS,
+ verbose => 'append $s to the @include search path',
+};
+
+$T2H_OPTIONS -> {'P'} =
+{
+ type => '=s',
+ linkage => sub {unshift (@Texi2HTML::Config::PREPEND_DIRS, $_[1]);},
+ verbose => 'prepend $s to the @include search path',
+};
+
+$T2H_OPTIONS -> {'top-file'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::TOP_FILE,
+ verbose => 'use $s as top file, instead of <docname>.html',
+};
+
+
+$T2H_OPTIONS -> {'toc-file'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::TOC_FILE,
+ verbose => 'use $s as ToC file, instead of <docname>_toc.html',
+};
+
+$T2H_OPTIONS -> {'frames'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::FRAMES,
+ verbose => 'output files which use HTML 4.0 frames (experimental)',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'menu'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SHOW_MENU,
+ verbose => 'output Texinfo menus',
+};
+
+#$T2H_OPTIONS -> {'no-menu'} =
+#{
+# type => '!',
+# linkage => sub { $Texi2HTML::Config::SHOW_MENU = (! $_[1]);},
+# verbose => "don't output Texinfo menus",
+# noHelp => 1,
+#};
+
+$T2H_OPTIONS -> {'number'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::NUMBER_SECTIONS,
+ verbose => 'use numbered sections',
+};
+
+#$T2H_OPTIONS -> {'no-number'} =
+#{
+# type => '!',
+# linkage => sub { $Texi2HTML::Config::NUMBER_SECTIONS = (! $_[1]);},
+# verbose => 'sections not numbered',
+# noHelp => 1,
+#};
+
+$T2H_OPTIONS -> {'use-nodes'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::USE_NODES,
+ verbose => 'use nodes for sectionning',
+};
+
+$T2H_OPTIONS -> {'node-files'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::NODE_FILES,
+ verbose => 'produce one file per node for cross references'
+};
+
+$T2H_OPTIONS -> {'separated-footnotes'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SEPARATED_FOOTNOTES,
+ verbose => 'footnotes on a separated page',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'toc-links'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::TOC_LINKS,
+ verbose => 'create links from headings to toc entries'
+};
+
+$T2H_OPTIONS -> {'split'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::SPLIT,
+ verbose => 'split document on section|chapter|node else no splitting',
+};
+
+$T2H_OPTIONS -> {'sec-nav'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SECTION_NAVIGATION,
+ verbose => 'output navigation panels for each section',
+};
+
+$T2H_OPTIONS -> {'subdir'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::SUBDIR,
+ verbose => 'put files in directory $s, not $cwd',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'short-ext'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SHORTEXTN,
+ verbose => 'use "htm" extension for output HTML files',
+};
+
+$T2H_OPTIONS -> {'prefix'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::PREFIX,
+ verbose => 'use as prefix for output files, instead of <docname>',
+};
+
+$T2H_OPTIONS -> {'output'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::OUT,
+ verbose => 'output goes to $s (directory if split)',
+};
+
+$T2H_OPTIONS -> {'no-validate'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::NOVALIDATE,
+ verbose => 'suppress node cross-reference validation',
+};
+
+$T2H_OPTIONS -> {'short-ref'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SHORT_REF,
+ verbose => 'if set, references are without section numbers',
+};
+
+$T2H_OPTIONS -> {'idx-sum'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::IDX_SUMMARY,
+ verbose => 'if set, also output index summary',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'def-table'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::DEF_TABLE,
+ verbose => 'if set, \@def.. are converted using tables.',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'Verbose'} =
+{
+ type => '!',
+ linkage=> \$Texi2HTML::Config::VERBOSE,
+ verbose => 'print progress info to stdout',
+};
+
+$T2H_OPTIONS -> {'lang'} =
+{
+ type => '=s',
+ linkage => sub {set_document_language($_[1], 1)},
+ verbose => 'use $s as document language (ISO 639 encoding)',
+};
+
+$T2H_OPTIONS -> {'ignore-preamble-text'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::IGNORE_PREAMBLE_TEXT,
+ verbose => 'if set, ignore the text before @node and sectionning commands',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'html-xref-prefix'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::EXTERNAL_DIR,
+ verbose => '$s is the base dir for external manual references',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'l2h'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::L2H,
+ verbose => 'if set, uses latex2html for @math and @tex',
+};
+
+$T2H_OPTIONS -> {'l2h-l2h'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::L2H_L2H,
+ verbose => 'program to use for latex2html translation',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'l2h-skip'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::L2H_SKIP,
+ verbose => 'if set, tries to reuse previously latex2html output',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'l2h-tmp'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::L2H_TMP,
+ verbose => 'if set, uses $s as temporary latex2html directory',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'l2h-file'} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::L2H_FILE,
+ verbose => 'if set, uses $s as latex2html init file',
+ noHelp => 1,
+};
+
+
+$T2H_OPTIONS -> {'l2h-clean'} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::L2H_CLEAN,
+ verbose => 'if set, do not keep intermediate latex2html files for later reuse',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'D'} =
+{
+ type => '=s',
+ linkage => sub {$value{$_[1]} = 1;},
+ verbose => 'equivalent to Texinfo "@set $s 1"',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'U'} =
+{
+ type => '=s',
+ linkage => sub {delete $value{$_[1]};},
+ verbose => 'equivalent to Texinfo "@clear $s"',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {'init-file'} =
+{
+ type => '=s',
+ linkage => \&load_init_file,
+ verbose => 'load init file $s'
+};
+
+$T2H_OPTIONS -> {'css-include'} =
+{
+ type => '=s',
+ linkage => \@Texi2HTML::Config::CSS_FILES,
+ verbose => 'use css file $s'
+};
+
+##
+## obsolete cmd line options
+##
+my $T2H_OBSOLETE_OPTIONS;
+
+$T2H_OBSOLETE_OPTIONS -> {'out-file'} =
+{
+ type => '=s',
+ linkage => sub {$Texi2HTML::Config::OUT = $_[1]; $Texi2HTML::Config::SPLIT = '';},
+ verbose => 'if set, all HTML output goes into file $s, obsoleted by "-output" with different semantics',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {init_file} =
+{
+ type => '=s',
+ linkage => \&load_init_file,
+ verbose => 'obsolete, use "-init-file" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {l2h_clean} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::L2H_CLEAN,
+ verbose => 'obsolete, use "-l2h-clean" instead',
+ noHelp => 2,
+};
+
+$T2H_OBSOLETE_OPTIONS -> {l2h_l2h} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::L2H_L2H,
+ verbose => 'obsolete, use "-l2h-l2h" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {l2h_skip} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::L2H_SKIP,
+ verbose => 'obsolete, use "-l2h-skip" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {l2h_tmp} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::L2H_TMP,
+ verbose => 'obsolete, use "-l2h-tmp" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {out_file} =
+{
+ type => '=s',
+ linkage => sub {$Texi2HTML::Config::OUT = $_[1]; $Texi2HTML::Config::SPLIT = '';},
+ verbose => 'obsolete, use "-out-file" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {short_ref} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SHORT_REF,
+ verbose => 'obsolete, use "-short-ref" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {idx_sum} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::IDX_SUMMARY,
+ verbose => 'obsolete, use "-idx-sum" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {def_table} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::DEF_TABLE,
+ verbose => 'obsolete, use "-def-table" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {short_ext} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SHORTEXTN,
+ verbose => 'obsolete, use "-short-ext" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {sec_nav} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SECTION_NAVIGATION,
+ verbose => 'obsolete, use "-sec-nav" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {top_file} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::TOP_FILE,
+ verbose => 'obsolete, use "-top-file" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {toc_file} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::TOC_FILE,
+ verbose => 'obsolete, use "-toc-file" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {glossary} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::USE_GLOSSARY,
+# verbose => "if set, uses section named `Footnotes' for glossary",
+ verbose => "this does nothing",
+ noHelp => 2,
+};
+
+$T2H_OBSOLETE_OPTIONS -> {dump_texi} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::DUMP_TEXI,
+ verbose => 'obsolete, use "-dump-texi" instead',
+ noHelp => 1
+};
+
+$T2H_OBSOLETE_OPTIONS -> {frameset_doctype} =
+{
+ type => '=s',
+ linkage => \$Texi2HTML::Config::FRAMESET_DOCTYPE,
+ verbose => 'obsolete, use "-frameset-doctype" instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
+{
+ type => '!',
+ linkage => sub {$Texi2HTML::Config::SECTION_NAVIGATION = 0;},
+ verbose => 'obsolete, use -nosec_nav',
+ noHelp => 2,
+};
+my $use_acc; # not used
+$T2H_OBSOLETE_OPTIONS -> {use_acc} =
+{
+ type => '!',
+ linkage => \$use_acc,
+ verbose => 'obsolete, set to true unconditionnaly',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {expandinfo} =
+{
+ type => '!',
+ linkage => sub {push @Texi2HTML::Config::EXPAND, 'info';},
+ verbose => 'obsolete, use "-expand info" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {expandtex} =
+{
+ type => '!',
+ linkage => sub {push @Texi2HTML::Config::EXPAND, 'tex';},
+ verbose => 'obsolete, use "-expand tex" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {monolithic} =
+{
+ type => '!',
+ linkage => sub {$Texi2HTML::Config::SPLIT = '';},
+ verbose => 'obsolete, use "-split no" instead',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {split_node} =
+{
+ type => '!',
+ linkage => sub{$Texi2HTML::Config::SPLIT = 'section';},
+ verbose => 'obsolete, use "-split section" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {split_chapter} =
+{
+ type => '!',
+ linkage => sub{$Texi2HTML::Config::SPLIT = 'chapter';},
+ verbose => 'obsolete, use "-split chapter" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {no_verbose} =
+{
+ type => '!',
+ linkage => sub {$Texi2HTML::Config::VERBOSE = 0;},
+ verbose => 'obsolete, use -noverbose instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {output_file} =
+{
+ type => '=s',
+ linkage => sub {$Texi2HTML::Config::OUT = $_[1]; $Texi2HTML::Config::SPLIT = '';},
+ verbose => 'obsolete, use -out_file instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {section_navigation} =
+{
+ type => '!',
+ linkage => \$Texi2HTML::Config::SECTION_NAVIGATION,
+ verbose => 'obsolete, use -sec_nav instead',
+ noHelp => 2,
+};
+
+$T2H_OBSOLETE_OPTIONS -> {verbose} =
+{
+ type => '!',
+ linkage=> \$Texi2HTML::Config::VERBOSE,
+ verbose => 'obsolete, use -Verbose instead',
+ noHelp => 2
+};
+
+# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
+# obsolete.
+my @rc_files = ();
+push @rc_files, "$sysconfdir/texi2htmlrc" if defined($sysconfdir);
+push @rc_files, "$ENV{'HOME'}/.texi2htmlrc" if (defined($ENV{HOME}));
+foreach my $i (@rc_files)
+{
+ if (-e $i and -r $i)
+ {
+ print STDERR "# reading initialization file from $i\n"
+ if ($T2H_VERBOSE);
+ print STDERR "Reading config from $i is obsolete, use texi2html/$conf_file_name instead\n";
+ Texi2HTML::Config::load($i);
+ }
+}
+
+# read initialization files
+foreach my $file (locate_init_file($conf_file_name, 1))
+{
+ print STDERR "# reading initialization file from $file\n" if ($T2H_VERBOSE);
+ Texi2HTML::Config::load($file);
+}
+
+#
+# %value hold texinfo variables, see also -D, -U, @set and @clear.
+# we predefine html (the output format) and texi2html (the translator)
+%value =
+ (
+ 'html' => 1,
+ 'texi2html' => $THISVERSION,
+ );
+
+#+++############################################################################
+# #
+# parse command-line options
+# #
+#---############################################################################
+
+
+my $T2H_USAGE_TEXT = <<EOT;
+Usage: texi2html [OPTIONS] TEXINFO-FILE
+Translates Texinfo source documentation to HTML.
+EOT
+my $T2H_FAILURE_TEXT = <<EOT;
+Try 'texi2html --help' for usage instructions.
+EOT
+
+my $options = new Getopt::MySimple;
+
+$T2H_OPTIONS -> {'help'} =
+{
+ type => ':i',
+ default => '',
+ linkage => sub {$options->helpOptions($_[1]);
+ print "\nSend bugs and suggestions to <users\@texi2html.cvshome.org>\n";
+ exit (0);},
+ verbose => "print help and exit"
+};
+
+# some older version of GetOpt::Long don't have
+# Getopt::Long::Configure("pass_through")
+eval {Getopt::Long::Configure("pass_through");};
+my $Configure_failed = $@ && <<EOT;
+**WARNING: Parsing of obsolete command-line options could have failed.
+ Consider to use only documented command-line options (run
+ 'texi2html --help 2' for a complete list) or upgrade to perl
+ version 5.005 or higher.
+EOT
+# FIXME getOptions is called 2 times, and thus adds 2 times the default
+# help and version and after that warns.
+if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+{
+ print STDERR "$Configure_failed" if $Configure_failed;
+ die $T2H_FAILURE_TEXT;
+}
+if (@ARGV > 1)
+{
+ eval {Getopt::Long::Configure("no_pass_through");};
+ if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+ {
+ print STDERR "$Configure_failed" if $Configure_failed;
+ die $T2H_FAILURE_TEXT;
+ }
+}
+# $T2H_DEBUG and $T2H_VERBOSE are shorthands
+my $T2H_DEBUG = $Texi2HTML::Config::DEBUG;
+$T2H_VERBOSE = $Texi2HTML::Config::VERBOSE;
+
+#+++############################################################################
+# #
+# evaluation of cmd line options
+# #
+#---############################################################################
+
+# retro compatibility for $Texi2HTML::Config::EXPAND
+push (@Texi2HTML::Config::EXPAND, $Texi2HTML::Config::EXPAND) if ($Texi2HTML::Config::EXPAND);
+
+# correct %text_macros and @special_regions based on command line and init
+# variables
+$text_macros{'menu'} = 1 if ($Texi2HTML::Config::SHOW_MENU);
+
+push @special_regions, 'tex' if ($Texi2HTML::Config::L2H);
+
+foreach my $expanded (@Texi2HTML::Config::EXPAND)
+{
+ $text_macros{"if$expanded"} = 1 if (exists($text_macros{"if$expanded"}));
+ next unless (exists($text_macros{$expanded}));
+ if (grep {$_ eq $expanded} @special_regions)
+ {
+ $text_macros{$expanded} = 'special';
+ }
+ elsif (grep {$_ eq $expanded} @raw_regions)
+ {
+ $text_macros{$expanded} = 'raw';
+ }
+ else
+ {
+ $text_macros{$expanded} = 1;
+ }
+}
+
+# handle ifnot regions
+foreach my $region (keys (%text_macros))
+{
+ next if ($region =~ /^ifnot/);
+ if ($text_macros{$region} and $region =~ /^if(\w+)$/)
+ {
+ $text_macros{"ifnot$1"} = 0;
+ }
+}
+
+if ($T2H_VERBOSE)
+{
+ print STDERR "# Expanded: ";
+ foreach my $text_macro (keys(%text_macros))
+ {
+ print STDERR "$text_macro " if ($text_macros{$text_macro});
+ }
+ print STDERR "\n";
+}
+
+# This is kept in that file although it is html formatting as it seems to
+# be rather obsolete
+$Texi2HTML::Config::INVISIBLE_MARK = '<img src="invisible.xbm" alt="">' if $Texi2HTML::Config::INVISIBLE_MARK eq 'xbm';
+
+$T2H_DEBUG |= $DEBUG_TEXI if ($Texi2HTML::Config::DUMP_TEXI);
+
+# Construct hashes used for cross references generation
+# Do it now as the user may have changed $USE_UNICODE
+
+foreach my $key (keys(%Texi2HTML::Config::unicode_map))
+{
+ if ($Texi2HTML::Config::unicode_map{$key} ne '')
+ {
+ if ($Texi2HTML::Config::USE_UNICODE)
+ {
+ $cross_ref_texi_map{$key} = chr(hex($Texi2HTML::Config::unicode_map{$key}));
+ }
+ else
+ {
+ $cross_ref_texi_map{$key} = '_' . lc($Texi2HTML::Config::unicode_map{$key});
+ }
+ }
+}
+
+foreach my $key (keys(%cross_ref_style_map_texi))
+{
+ if ($style_type{$key} eq 'accent'
+ and (ref($cross_ref_style_map_texi{$key}) eq 'HASH'))
+ {
+ if ($Texi2HTML::Config::USE_UNICODE)
+ {
+ $cross_ref_style_map_texi{$key}->{'function'} = \&Texi2HTML::Config::t2h_utf8_accent;
+ }
+ else
+ {
+ $cross_ref_style_map_texi{$key}->{'function'} = \&Texi2HTML::Config::t2h_nounicode_cross_manual_accent;
+ }
+ }
+}
+
+#
+# file name buisness
+#
+
+# this is directly pasted over from latex2html
+sub getcwd
+{
+ local($_) = `pwd`;
+
+ die "'pwd' failed (out of memory?)\n"
+ unless length;
+ chop;
+ $_;
+}
+
+
+my $docu_dir; # directory of the document
+my $docu_name; # basename of the document
+my $docu_rdir; # directory for the output
+#my $docu_ext = "html"; # extension
+my $docu_ext = $Texi2HTML::Config::EXTENSION; # extension
+my $docu_toc; # document's table of contents
+my $docu_stoc; # document's short toc
+my $docu_foot; # document's footnotes
+my $docu_about; # about this document
+my $docu_top; # document top
+my $docu_doc; # document (or document top of split)
+
+die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
+my $docu = shift(@ARGV);
+if ($docu =~ /(.*\/)/)
+{
+ chop($docu_dir = $1);
+ $docu_name = $docu;
+ $docu_name =~ s/.*\///;
+}
+else
+{
+ $docu_dir = '.';
+ $docu_name = $docu;
+}
+unshift(@Texi2HTML::Config::INCLUDE_DIRS, $docu_dir);
+unshift(@Texi2HTML::Config::INCLUDE_DIRS, @Texi2HTML::Config::PREPEND_DIRS);
+$docu_name =~ s/\.te?x(i|info)?$//;
+$docu_name = $Texi2HTML::Config::PREFIX if ($Texi2HTML::Config::PREFIX);
+
+# resulting files splitting
+if ($Texi2HTML::Config::SPLIT =~ /section/i)
+{
+ $Texi2HTML::Config::SPLIT = 'section';
+}
+elsif ($Texi2HTML::Config::SPLIT =~ /node/i)
+{
+ $Texi2HTML::Config::SPLIT = 'node';
+}
+elsif ($Texi2HTML::Config::SPLIT =~ /chapter/i)
+{
+ $Texi2HTML::Config::SPLIT = 'chapter';
+}
+else
+{
+ $Texi2HTML::Config::SPLIT = '';
+}
+
+# Something like backward compatibility
+if ($Texi2HTML::Config::SPLIT and $Texi2HTML::Config::SUBDIR)
+{
+ $Texi2HTML::Config::OUT = $Texi2HTML::Config::SUBDIR;
+}
+
+# subdir
+
+die "output to STDOUT and split or frames incompatible\n"
+ if (($Texi2HTML::Config::SPLIT or $Texi2HTML::Config::FRAMES) and ($Texi2HTML::Config::OUT eq '-'));
+
+if ($Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT eq ''))
+{
+ $Texi2HTML::Config::OUT = $docu_name;
+}
+
+if ($Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT eq '.'))
+{# This is to avoid trouble with latex2html
+ $Texi2HTML::Config::OUT = '';
+}
+
+$docu_rdir = '';
+
+if ($Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT ne ''))
+{
+ $Texi2HTML::Config::OUT =~ s|/*$||;
+ $docu_rdir = "$Texi2HTML::Config::OUT/";
+ unless (-d $Texi2HTML::Config::OUT)
+ {
+ if ( mkdir($Texi2HTML::Config::OUT, oct(755)))
+ {
+ print STDERR "# created directory $Texi2HTML::Config::OUT\n" if ($T2H_VERBOSE);
+ }
+ else
+ {
+ die "$ERROR can't create directory $Texi2HTML::Config::OUT\n";
+ }
+ }
+ print STDERR "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+}
+elsif (! $Texi2HTML::Config::SPLIT and ($Texi2HTML::Config::OUT ne ''))
+{
+ if ($Texi2HTML::Config::OUT =~ m|(.*)/|)
+ {# there is a leading directories
+ $docu_rdir = "$1/";
+ unless (-d $docu_rdir)
+ {
+ if ( mkdir($docu_rdir, oct(755)))
+ {
+ print STDERR "# created directory $docu_rdir\n" if ($T2H_VERBOSE);
+ }
+ else
+ {
+ die "$ERROR can't create directory $docu_rdir\n";
+ }
+ }
+ print STDERR "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+ }
+ else
+ {
+ print STDERR "# putting result files into current directory \n" if ($T2H_VERBOSE);
+ $docu_rdir = '';
+ }
+}
+
+# We don't use "./" as $docu_rdir when $docu_rdir is the current directory
+# because it is problematic for latex2html. To test writability with -w,
+# however we need a real directory.
+my $result_rdir = $docu_rdir;
+$result_rdir = "." if ($docu_rdir eq '');
+unless (-w $result_rdir)
+{
+ $docu_rdir = 'current directory' if ($docu_rdir eq '');
+ die "$ERROR $docu_rdir not writable\n";
+}
+
+# relative path leading to the working directory from the document directory
+my $path_to_working_dir = $docu_rdir;
+if ($docu_rdir ne '')
+{
+ my $cwd = getcwd;
+ my $docu_path = $docu_rdir;
+ $docu_path = $cwd . '/' . $docu_path unless ($docu_path =~ /^\//);
+ my @result = ();
+ foreach my $element (split /\//, File::Spec->canonpath($docu_path))
+ {
+ if ($element eq '')
+ {
+ push @result, '';
+ }
+ elsif ($element eq '..')
+ {
+ if (@result and ($result[-1] eq ''))
+ {
+ print STDERR "Too much .. in absolute file name\n";
+ }
+ elsif (@result and ($result[-1] ne '..'))
+ {
+ pop @result;
+ }
+ else
+ {
+ push @result, $element;
+ }
+ }
+ else
+ {
+ push @result, $element;
+ }
+ }
+ $path_to_working_dir = File::Spec->abs2rel($cwd, join ('/', @result));
+ $path_to_working_dir =~ s|.*/||;
+ $path_to_working_dir .= '/' unless($path_to_working_dir eq '');
+}
+
+# extension
+if ($Texi2HTML::Config::SHORTEXTN)
+{
+ $docu_ext = "htm";
+}
+if ($Texi2HTML::Config::TOP_FILE =~ s/\..*$//)
+{
+ $Texi2HTML::Config::TOP_FILE .= ".$docu_ext";
+}
+
+$docu_doc = "$docu_name.$docu_ext"; # document's contents
+if ($Texi2HTML::Config::SPLIT)
+{
+ # if Texi2HTML::Config::NODE_FILES is true and a node is called ${docu_name}_toc
+ # ${docu_name}_ovr... there may be trouble with the old naming scheme in
+ # very rare circumstances. This won't be fixed, the new scheme will be used
+ # soon.
+ $docu_toc = $Texi2HTML::Config::TOC_FILE || "${docu_name}_toc.$docu_ext";
+ $docu_stoc = "${docu_name}_ovr.$docu_ext";
+ $docu_foot = "${docu_name}_fot.$docu_ext";
+ $docu_about = "${docu_name}_abt.$docu_ext";
+ $docu_top = $Texi2HTML::Config::TOP_FILE || $docu_doc;
+}
+else
+{
+ if ($Texi2HTML::Config::OUT)
+ {
+ $docu_doc = $Texi2HTML::Config::OUT;
+ $docu_doc =~ s|.*/||;
+ }
+ $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
+}
+
+# For use in init files
+$Texi2HTML::Config::TOP_FILE = $docu_top;
+$Texi2HTML::Config::TOC_FILE = $docu_toc;
+
+my $docu_doc_file = "$docu_rdir$docu_doc";
+my $docu_toc_file = "$docu_rdir$docu_toc";
+my $docu_stoc_file = "$docu_rdir$docu_stoc";
+my $docu_foot_file = "$docu_rdir$docu_foot";
+my $docu_about_file = "$docu_rdir$docu_about";
+my $docu_top_file = "$docu_rdir$docu_top";
+
+my $docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext";
+my $docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
+
+#
+# _foo: internal variables to track @foo
+#
+foreach my $key ('_author', '_title', '_subtitle', '_shorttitlepage',
+ '_settitle', '_setfilename', '_shorttitle', '_titlefont')
+{
+ $value{$key} = ''; # prevent -w warnings
+}
+my $index; # ref on a hash for the index entries
+my %indices = (); # hash of indices names containing
+ #[ $Pages, $Entries ] (page indices and
+ # raw index entries)
+my @index_labels = (); # array corresponding with @?index commands
+ # constructed during pass_texi, used to
+ # put labels in pass_text
+#
+# initial counters
+#
+my $foot_num = 0;
+my $relative_foot_num = 0;
+my $idx_num = 0;
+my $sec_num = 0;
+my $anchor_num = 0;
+
+#
+# can I use ISO8859 characters? (HTML+)
+#
+if ($Texi2HTML::Config::USE_ISO)
+{
+ foreach my $thing (keys(%Texi2HTML::Config::iso_symbols))
+ {
+ $things_map_ref->{$thing} = $Texi2HTML::Config::iso_symbols{$thing};
+ $pre_map_ref->{$thing} = $Texi2HTML::Config::iso_symbols{$thing};
+ }
+}
+
+# process a css file
+sub process_css_file ($$)
+{
+ my $fh =shift;
+ my $file = shift;
+ my $in_rules = 0;
+ my $in_comment = 0;
+ my $in_import = 0;
+ my $in_string = 0;
+ my $rules = [];
+ my $imports = [];
+ while (<$fh>)
+ {
+ #print STDERR "Line: $_";
+ if ($in_rules)
+ {
+ push @$rules, $_;
+ next;
+ }
+ my $text = '';
+ while (1)
+ {
+ #sleep 1;
+ #print STDERR "${text}!in_comment $in_comment in_rules $in_rules in_import $in_import in_string $in_string: $_";
+ if ($in_comment)
+ {
+ if (s/^(.*?\*\/)//)
+ {
+ $text .= $1;
+ $in_comment = 0;
+ }
+ else
+ {
+ push @$imports, $text . $_;
+ last;
+ }
+ }
+ elsif (!$in_string and s/^\///)
+ { # what do '\' do here ?
+ if (s/^\*//)
+ {
+ $text .= '/*';
+ $in_comment = 1;
+ }
+ else
+ {
+ push (@$imports, $text. "\n") if ($text ne '');
+ push (@$rules, '/' . $_);
+ $in_rules = 1;
+ last;
+ }
+ }
+ elsif (!$in_string and $in_import and s/^([\"\'])//)
+ { # strings outside of import start rules
+ $text .= "$1";
+ $in_string = quotemeta("$1");
+ }
+ elsif ($in_string and s/^(\\$in_string)//)
+ {
+ $text .= $1;
+ }
+ elsif ($in_string and s/^($in_string)//)
+ {
+ $text .= $1;
+ $in_string = 0;
+ }
+ elsif ((! $in_string and !$in_import) and (s/^([\\]?\@import)$// or s/^([\\]?\@import\s+)//))
+ {
+ $text .= $1;
+ $in_import = 1;
+ }
+ elsif (!$in_string and $in_import and s/^\;//)
+ {
+ $text .= ';';
+ $in_import = 0;
+ }
+ elsif (($in_import or $in_string) and s/^(.)//)
+ {
+ $text .= $1;
+ }
+ elsif (!$in_import and s/^([^\s])//)
+ {
+ push (@$imports, $text. "\n") if ($text ne '');
+ push (@$rules, $1 . $_);
+ $in_rules = 1;
+ last;
+ }
+ elsif (s/^(\s)//)
+ {
+ $text .= $1;
+ }
+ elsif ($_ eq '')
+ {
+ push (@$imports, $text);
+ last;
+ }
+ }
+ }
+ warn "$WARN string not closed in css file $file\n" if ($in_string);
+ warn "$WARN comment not closed in css file $file\n" if ($in_comment);
+ warn "$WARN \@import not finished in css file $file\n" if ($in_import and !$in_comment and !$in_string);
+ return ($imports, $rules);
+}
+
+my @css_import_lines;
+my @css_rule_lines;
+
+# process css files
+foreach my $file (@Texi2HTML::Config::CSS_FILES)
+{
+ my $css_file_fh;
+ my $css_file;
+ if ($file eq '-')
+ {
+ $css_file_fh = \*STDIN;
+ $css_file = '-';
+ }
+ else
+ {
+ $css_file = locate_init_file ($file);
+ unless (defined($css_file))
+ {
+ warn "css file $file not found\n";
+ next;
+ }
+ unless (open (CSSFILE, "$css_file"))
+ {
+ warn "Cannot open ${css_file}: $!";
+ next;
+ }
+ $css_file_fh = \*CSSFILE;
+ }
+ my ($import_lines, $rules_lines);
+ ($import_lines, $rules_lines) = process_css_file ($css_file_fh, $css_file);
+ push @css_import_lines, @$import_lines;
+ push @css_rule_lines, @$rules_lines;
+}
+
+if ($T2H_DEBUG & $DEBUG_USER)
+{
+ if (@css_import_lines)
+ {
+ print STDERR "# css import lines\n";
+ foreach my $line (@css_import_lines)
+ {
+ print STDERR "$line";
+ }
+ }
+ if (@css_rule_lines)
+ {
+ print STDERR "# css rule lines\n";
+ foreach my $line (@css_rule_lines)
+ {
+ print STDERR "$line";
+ }
+ }
+}
+
+#
+# read texi2html extensions (if any)
+# FIXME isn't that obsolete ? (obsoleted by -init-file)
+my $extensions = 'texi2html.ext'; # extensions in working directory
+if (-f $extensions)
+{
+ print STDERR "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+ require($extensions);
+}
+my $progdir;
+($progdir = $0) =~ s/[^\/]+$//;
+if ($progdir && ($progdir ne './'))
+{
+ $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
+ if (-f $extensions)
+ {
+ print STDERR "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+ require($extensions);
+ }
+}
+
+# parse texinfo cnf file for external manual specifications.
+my @texinfo_htmlxref_files = locate_init_file ($texinfo_htmlxref, 1, \@texinfo_config_dirs);
+foreach my $file (@texinfo_htmlxref_files)
+{
+ open (HTMLXREF, $file);
+ while (<HTMLXREF>)
+ {
+ my $line = $_;
+ s/[#]\s.*//;
+ s/^\s*//;
+ next if /^\s*$/;
+ my @htmlxref = split /\s+/;
+ my $manual = shift @htmlxref;
+ next if (exists($Texi2HTML::THISDOC{'htmlxref'}->{$manual}));
+ my $split_or_mono = shift @htmlxref;
+ if (!defined($split_or_mono) or ($split_or_mono ne 'split' and $split_or_mono ne 'mono'))
+ {
+ echo_warn("Bad line in $file: $line");
+ next;
+ }
+ my $href = shift @htmlxref;
+ if ($split_or_mono eq 'split')
+ {
+ $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'} = 1;
+ $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'mono'} = 0;
+ }
+ else
+ {
+ $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'} = 0;
+ $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'mono'} = 1;
+ }
+ if (defined($href))
+ {
+ if ($Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'})
+ {
+ $href =~ s/\/*$//;
+ }
+ $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'href'} = $href;
+ }
+ }
+ close (HTMLXREF);
+}
+
+if ($T2H_DEBUG)
+{
+ foreach my $manual (keys(%{$Texi2HTML::THISDOC{'htmlxref'}}))
+ {
+ my $href = 'NO';
+ $href = $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'href'} if
+ defined($Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'href'});
+ print STDERR "$manual: split $Texi2HTML::THISDOC{'htmlxref'}->{$manual}->{'split'}, href: $href\n";
+ }
+}
+
+print STDERR "# reading from $docu\n" if $T2H_VERBOSE;
+
+{
+
+package Texi2HTML::LaTeX2HTML;
+
+#########################################################################
+#
+# latex2html stuff
+#
+# latex2html conversions consist of three stages:
+# 1) ToLatex: Put "latex" code into a latex file
+# 2) ToHtml: Use latex2html to generate corresponding html code and images
+# 3) FromHtml: Extract generated code and images from latex2html run
+#
+
+# init l2h defaults for files and names
+
+# variable which shouldn't be global FIXME
+use vars qw(
+ %l2h_img
+ );
+my ($l2h_name, $l2h_latex_file, $l2h_cache_file, $l2h_html_file, $l2h_prefix);
+
+# holds the status of latex2html operations. If 0 it means that there was
+# an error
+my $status = 0;
+my $debug;
+my $docu_rdir;
+
+#if ($Texi2HTML::Config::L2H)
+sub init($$$)
+{
+ my $docu_name = shift;
+ $docu_rdir = shift;
+ $debug = shift;
+ $l2h_name = "${docu_name}_l2h";
+ $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
+ $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
+ # destination dir -- generated images are put there, should be the same
+ # as dir of enclosing html document --
+ $l2h_html_file = "$docu_rdir${l2h_name}.html";
+ $l2h_prefix = "${l2h_name}_";
+ $status = init_to_latex();
+}
+
+##########################
+#
+# First stage: Generation of Latex file
+# Initialize with: l2h_InitToLatex
+# Add content with: l2h_ToLatex($text) --> HTML placeholder comment
+# Finish with: l2h_FinishToLatex
+#
+
+my $l2h_latex_preamble = <<EOT;
+% This document was automatically generated by the l2h extenstion of texi2html
+% DO NOT EDIT !!!
+\\documentclass{article}
+\\usepackage{html}
+\\begin{document}
+EOT
+
+my $l2h_latex_closing = <<EOT;
+\\end{document}
+EOT
+
+my %l2h_to_latex = ();
+my @l2h_to_latex = ();
+my $l2h_latex_count = 0; # number of latex texts really stored
+my $l2h_to_latex_count = 0; # total number of latex texts processed
+my $l2h_cached_count = 0; # number of cached latex text
+my %l2h_cache = ();
+#$Texi2HTML::Config::L2H = l2h_InitToLatex() if ($Texi2HTML::Config::L2H);
+
+# return used latex 1, if l2h could be initalized properly, 0 otherwise
+#sub l2h_InitToLatex
+sub init_to_latex()
+{
+ unless ($Texi2HTML::Config::L2H_SKIP)
+ {
+ unless (open(L2H_LATEX, ">$l2h_latex_file"))
+ {
+ warn "$ERROR Error l2h: Can't open latex file '$l2h_latex_file' for writing\n";
+ return 0;
+ }
+ print STDERR "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
+ print L2H_LATEX $l2h_latex_preamble;
+ }
+ # open database for caching
+ #l2h_InitCache();
+ init_cache();
+ return 1;
+}
+
+
+# print text (1st arg) into latex file (if not already there), return
+# @tex_$number which can be later on replaced by the latex2html
+# generated text
+#sub l2h_ToLatex
+sub to_latex
+{
+ my($text) = @_;
+ my($count);
+ $l2h_to_latex_count++;
+ $text =~ s/(\s*)$//;
+ # try whether we can cache it
+ #my $cached_text = l2h_FromCache($text);
+ my $cached_text = from_cache($text);
+ if ($cached_text)
+ {
+ $l2h_cached_count++;
+ return $cached_text;
+ }
+ # try whether we have text already on things to do
+ unless ($count = $l2h_to_latex{$text})
+ {
+ $count = $l2h_latex_count;
+ $l2h_latex_count++;
+ $l2h_to_latex{$text} = $count;
+ $l2h_to_latex[$count] = $text;
+ unless ($Texi2HTML::Config::L2H_SKIP)
+ {
+ print L2H_LATEX "\\begin{rawhtml}\n";
+ print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
+ print L2H_LATEX "\\end{rawhtml}\n";
+
+ print L2H_LATEX "$text\n";
+
+ print L2H_LATEX "\\begin{rawhtml}\n";
+ print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
+ print L2H_LATEX "\\end{rawhtml}\n";
+ }
+ }
+ return "\@tex_${count} ";
+}
+
+# print closing into latex file and close it
+#sub l2h_FinishToLatex
+sub finish_to_latex()
+{
+ my ($reused);
+ $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
+ unless ($Texi2HTML::Config::L2H_SKIP)
+ {
+ print L2H_LATEX $l2h_latex_closing;
+ close(L2H_LATEX);
+ }
+ print STDERR "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
+ unless ($l2h_latex_count)
+ {
+ #l2h_Finish();
+ finish();
+ return 0;
+ }
+ return 1;
+}
+
+###################################
+# Second stage: Use latex2html to generate corresponding html code and images
+#
+# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
+# Call latex2html on $l2h_latex_file
+# Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
+# Return 1, on success
+# 0, otherwise
+#
+#sub l2h_ToHtml
+sub to_html()
+{
+ my ($call, $dotbug);
+ if ($Texi2HTML::Config::L2H_SKIP)
+ {
+ print STDERR "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
+ return 1;
+ }
+ # Check for dot in directory where dvips will work
+ if ($Texi2HTML::Config::L2H_TMP)
+ {
+ if ($Texi2HTML::Config::L2H_TMP =~ /\./)
+ {
+ warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
+ $dotbug = 1;
+ }
+ }
+ else
+ {
+ if (main::getcwd() =~ /\./)
+ {
+ warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
+ $dotbug = 1;
+ }
+ }
+ # fix it, if necessary and hope that it works
+ $Texi2HTML::Config::L2H_TMP = "/tmp" if ($dotbug);
+
+ $call = $Texi2HTML::Config::L2H_L2H;
+ # use init file, if specified
+ my $init_file = main::locate_init_file($Texi2HTML::Config::L2H_FILE);
+ $call = $call . " -init_file " . $init_file if ($init_file);
+ # set output dir
+ $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
+ # use l2h_tmp, if specified
+ $call = $call . " -tmp $Texi2HTML::Config::L2H_TMP" if ($Texi2HTML::Config::L2H_TMP);
+ # use a given html version if specified
+ $call = $call . " -html_version $Texi2HTML::Config::L2H_HTML_VERSION" if ($Texi2HTML::Config::L2H_HTML_VERSION);
+ # options we want to be sure of
+ $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
+ $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file";
+
+ print STDERR "# l2h: executing '$call'\n" if ($Texi2HTML::Config::VERBOSE);
+ if (system($call))
+ {
+ warn "l2h ***Error: '${call}' did not succeed\n";
+ return 0;
+ }
+ else
+ {
+ print STDERR "# l2h: latex2html finished successfully\n" if ($Texi2HTML::Config::VERBOSE);
+ return 1;
+ }
+}
+
+##########################
+# Third stage: Extract generated contents from latex2html run
+# Initialize with: l2h_InitFromHtml
+# open $l2h_html_file for reading
+# reads in contents into array indexed by numbers
+# return 1, on success -- 0, otherwise
+# Extract Html code with: l2h_FromHtml($text)
+# replaces in $text all previosuly inserted comments by generated html code
+# returns (possibly changed) $text
+# Finish with: l2h_FinishFromHtml
+# closes $l2h_html_dir/$l2h_name.".$docu_ext"
+
+my $l2h_extract_error = 0;
+my $l2h_range_error = 0;
+my @l2h_from_html;
+
+#sub l2h_InitFromHtml()
+sub init_from_html()
+{
+ local(%l2h_img);
+ my ($count, $h_line);
+
+ if (! open(L2H_HTML, "<${l2h_html_file}"))
+ {
+ print STDERR "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
+ return 0;
+ }
+ print STDERR "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
+
+ my $l2h_html_count = 0;
+ while ($h_line = <L2H_HTML>)
+ {
+ if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
+ {
+ $count = $1;
+ my $h_content = "";
+ while ($h_line = <L2H_HTML>)
+ {
+ if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
+ {
+ chomp $h_content;
+ chomp $h_content;
+ $l2h_html_count++;
+ #$h_content = l2h_ToCache($count, $h_content);
+ $h_content = to_cache($count, $h_content);
+ $l2h_from_html[$count] = $h_content;
+ $h_content = '';
+ last;
+ }
+ $h_content = $h_content.$h_line;
+ }
+ if ($h_content)
+ {
+ print STDERR "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n"
+ if ($Texi2HTML::Config::VERBOSE);
+ close(L2H_HTML);
+ return 0;
+ }
+ }
+ }
+ print STDERR "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
+ if ($Texi2HTML::Config::VERBOSE);
+
+ close(L2H_HTML);
+ return 1;
+}
+
+sub latex2html()
+{
+ return unless($status);
+ return unless ($status = finish_to_latex());
+ return unless ($status = to_html());
+ return unless ($status = init_from_html());
+}
+
+# FIXME used ??
+#sub l2h_FromHtml($)
+sub from_html($)
+{
+ my($text) = @_;
+ my($done, $to_do, $count);
+ $to_do = $text;
+ $done = '';
+ while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
+ {
+ $to_do = $1;
+ $count = $2;
+ $done = $3.$done;
+ $done = "<!-- l2h_end $l2h_name $count -->".$done
+ #if ($T2H_DEBUG & $DEBUG_L2H);
+ if ($debug);
+
+ #$done = l2h_ExtractFromHtml($count) . $done;
+ $done = extract_from_html($count) . $done;
+
+ $done = "<!-- l2h_begin $l2h_name $count -->".$done
+ #if ($T2H_DEBUG & $DEBUG_L2H);
+ if ($debug);
+ }
+ return $to_do.$done;
+}
+
+sub do_tex($)
+{
+ my $count = shift;
+ my $result = '';
+ $result = "<!-- l2h_begin $l2h_name $count -->"
+ #if ($T2H_DEBUG & $DEBUG_L2H);
+ if ($debug);
+ $result .= extract_from_html($count);
+ $result .= "<!-- l2h_end $l2h_name $count -->"
+ #if ($T2H_DEBUG & $DEBUG_L2H);
+ if ($debug);
+ return $result;
+}
+
+#sub l2h_ExtractFromHtml($)
+sub extract_from_html($)
+{
+ my $count = shift;
+ return $l2h_from_html[$count] if ($l2h_from_html[$count]);
+ if ($count >= 0 && $count < $l2h_latex_count)
+ {
+ # now we are in trouble
+ my $line;
+ $l2h_extract_error++;
+ print STDERR "$ERROR l2h: can't extract content $count from html\n"
+ if ($T2H_VERBOSE);
+ # try simple (ordinary) substition (without l2h)
+ #my $l_l2h = $Texi2HTML::Config::L2H;
+ $Texi2HTML::Config::L2H = 0;
+ my $l_l2h = $status;
+ $status = 0;
+ $line = $l2h_to_latex{$count};
+ $line = main::substitute_text({}, $line);
+ $line = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $line
+ #if ($T2H_DEBUG & $DEBUG_L2H);
+ if ($debug);
+ #$Texi2HTML::Config::L2H = $l_l2h;
+ $status = $l_l2h;
+ return $line;
+ }
+ else
+ {
+ # now we have been incorrectly called
+ $l2h_range_error++;
+ print STDERR "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
+ return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
+ #if ($T2H_DEBUG & $DEBUG_L2H);
+ if ($debug);
+ return "<!-- l2h: out of range count $count -->";
+ }
+}
+
+#sub l2h_FinishFromHtml()
+sub finish_from_html()
+{
+ if ($Texi2HTML::Config::VERBOSE)
+ {
+ if ($l2h_extract_error + $l2h_range_error)
+ {
+ print STDERR "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
+ }
+ else
+ {
+ print STDERR "# l2h: finished from html (no errors)\n";
+ }
+ }
+}
+
+#sub l2h_Finish()
+sub finish()
+{
+ return unless($status);
+ finish_from_html();
+ #l2h_StoreCache();
+ store_cache();
+ if ($Texi2HTML::Config::L2H_CLEAN)
+ {
+ local ($_);
+ print STDERR "# l2h: removing temporary files generated by l2h extension\n"
+ if $Texi2HTML::Config::VERBOSE;
+ while (<"$docu_rdir$l2h_name"*>)
+ {
+ unlink $_;
+ }
+ }
+ print STDERR "# l2h: Finished\n" if $Texi2HTML::Config::VERBOSE;
+ return 1;
+}
+
+##############################
+# stuff for l2h caching
+#
+
+# I tried doing this with a dbm data base, but it did not store all
+# keys/values. Hence, I did as latex2html does it
+#sub l2h_InitCache
+sub init_cache
+{
+ if (-r "$l2h_cache_file")
+ {
+ my $rdo = do "$l2h_cache_file";
+ warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
+ unless ($rdo);
+ }
+}
+
+#sub l2h_StoreCache
+sub store_cache
+{
+ return unless $l2h_latex_count;
+ my ($key, $value);
+ open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
+ while (($key, $value) = each %l2h_cache)
+ {
+ # escape stuff
+ $key =~ s|/|\\/|g;
+ $key =~ s|\\\\/|\\/|g;
+ # weird, a \ at the end of the key results in an error
+ # maybe this also broke the dbm database stuff
+ $key =~ s|\\$|\\\\|;
+ $value =~ s/\|/\\\|/go;
+ $value =~ s/\\\\\|/\\\|/go;
+ $value =~ s|\\\\|\\\\\\\\|g;
+ print FH "\n\$l2h_cache_key = q/$key/;\n";
+ print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
+ }
+ print FH "1;";
+ close(FH);
+}
+
+# return cached html, if it exists for text, and if all pictures
+# are there, as well
+#sub l2h_FromCache
+sub from_cache
+{
+ my $text = shift;
+ my $cached = $l2h_cache{$text};
+ if ($cached)
+ {
+ while ($cached =~ m/SRC="(.*?)"/g)
+ {
+ unless (-e "$docu_rdir$1")
+ {
+ return undef;
+ }
+ }
+ return $cached;
+ }
+ return undef;
+}
+
+# insert generated html into cache, move away images,
+# return transformed html
+my $maximage = 1;
+#sub l2h_ToCache($$)
+sub to_cache($$)
+{
+ my $count = shift;
+ my $content = shift;
+ my @images = ($content =~ /SRC="(.*?)"/g);
+ my ($src, $dest);
+
+ for $src (@images)
+ {
+ $dest = $l2h_img{$src};
+ unless ($dest)
+ {
+ my $ext;
+ if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
+ {
+ $ext = $1;
+ }
+ else
+ {
+ warn "$ERROR: L2h image $src has invalid extension\n";
+ next;
+ }
+ while (-e "$docu_rdir${docu_name}_$maximage.$ext")
+ {
+ $maximage++;
+ }
+ $dest = "${docu_name}_$maximage.$ext";
+ system("cp -f $docu_rdir$src $docu_rdir$dest");
+ $l2h_img{$src} = $dest;
+ #unlink "$docu_rdir$src" unless ($T2H_DEBUG & $DEBUG_L2H);
+ unlink "$docu_rdir$src" unless ($debug);
+ }
+ $content =~ s/$src/$dest/g;
+ }
+ $l2h_cache{$l2h_to_latex[$count]} = $content;
+ return $content;
+}
+
+}
+
+#+++###########################################################################
+# #
+# Pass texi: read source, handle variable, ignored text, #
+# #
+#---###########################################################################
+
+my @fhs = (); # hold the file handles to read
+my $input_spool; # spooled lines to read
+my @lines = (); # whole document
+my @lines_numbers = (); # line number, originating file associated with
+ # whole document
+my $macros; # macros. reference on a hash
+my %info_enclose; # macros defined with definfoenclose
+my $texi_line_number = { 'file_name' => '', 'line_nr' => 0, 'macro' => '' };
+my @floats = (); # floats list
+my %floats = (); # floats by style
+
+sub initialise_state_texi($)
+{
+ my $state = shift;
+ $state->{'texi'} = 1; # for substitute_text and close_stack:
+ # 1 if pass_texi/scan_texi is to be used
+}
+
+my @first_lines = ();
+
+sub pass_texi()
+{
+ my $first_lines = 1; # is it the first lines
+ my $state = {};
+ # holds the informations about the context
+ # to pass it down to the functions
+ initialise_state_texi($state);
+ my @stack;
+ my $text;
+ INPUT_LINE: while (defined($_ = next_line($texi_line_number)))
+ {
+ #
+ # remove the lines preceding \input or an @-command
+ #
+ if ($first_lines)
+ {
+ if (/^\\input/)
+ {
+ push @first_lines, $_;
+ $first_lines = 0;
+ next;
+ }
+ if (/^\s*\@/)
+ {
+ $first_lines = 0;
+ }
+ else
+ {
+ push @first_lines, $_;
+ next;
+ }
+ }
+ #print STDERR "line_nr $texi_line_number->{'line_nr'} :$_";
+ my $chomped_line = $_;
+ if (scan_texi ($_, \$text, \@stack, $state, $texi_line_number) and chomp($chomped_line))
+ {
+ #print STDERR "scan_texi line_nr $texi_line_number->{'line_nr'}\n";
+ push (@lines_numbers, { 'file_name' => $texi_line_number->{'file_name'},
+ 'line_nr' => $texi_line_number->{'line_nr'},
+ 'macro' => $texi_line_number->{'macro'} });
+ }
+
+ #dump_stack (\$text, \@stack, $state);
+ if ($state->{'bye'})
+ {
+ #dump_stack(\$text, \@stack, $state);
+ # close stack after bye
+ close_stack_texi_structure(\$text, \@stack, $state, $texi_line_number);
+ }
+ next if (@stack);
+ $_ = $text;
+ $text = '';
+ next if !defined($_);
+ push @lines, split_lines ($_);
+ last if ($state->{'bye'});
+ }
+ # close stack at the end of pass texi
+ close_stack_texi_structure(\$text, \@stack, $state, $texi_line_number);
+ push @lines, split_lines ($text);
+ print STDERR "# end of pass texi\n" if $T2H_VERBOSE;
+}
+
+# return the line after preserving things according to misc_command map.
+sub preserve_command($$)
+{
+ my $line = shift;
+ my $macro = shift;
+ my $text = '';
+ my $args = '';
+ my $skip_spec = '';
+ my $arg_spec = '';
+
+ $skip_spec = $Texi2HTML::Config::misc_command{$macro}->{'skip'}
+ if (defined($Texi2HTML::Config::misc_command{$macro}->{'skip'}));
+ $arg_spec = $Texi2HTML::Config::misc_command{$macro}->{'arg'}
+ if (defined($Texi2HTML::Config::misc_command{$macro}->{'arg'}));
+
+ if ($arg_spec eq 'line')
+ {
+ $text .= $line;
+ $args .= $line;
+ $line = '';
+ }
+ elsif ($arg_spec)
+ {
+ my $arg_nr = $Texi2HTML::Config::misc_command{$macro}->{'arg'};
+ while ($arg_nr)
+ {
+ $line =~ s/(\s+\S*)//o;
+ $text .= $1 if defined($1);
+ $args .= $1 if defined($1);
+ $arg_nr--;
+ }
+ }
+
+ if ($macro eq 'bye')
+ {
+ $line = '';
+ $text = "\n";
+ }
+ elsif ($skip_spec eq 'linespace')
+ {
+ if ($line =~ /^\s*$/o)
+ {
+ $line =~ s/([ \t]*)//o;
+ $text .= $1;
+ }
+ }
+ elsif ($skip_spec eq 'linewhitespace')
+ {
+ if ($line =~ /^\s*$/o)
+ {
+ $text .= $line;
+ $line = '';
+ }
+ }
+ elsif ($skip_spec eq 'line')
+ {
+ $text .= $line;
+ $line = '';
+ }
+ elsif ($skip_spec eq 'whitespace')
+ {
+ $line =~ s/(\s*)//o;
+ $text .= $1;
+ }
+ elsif ($skip_spec eq 'space')
+ {
+ $line =~ s/([ \t]*)//o;
+ $text .= $1;
+ }
+ $line = '' if (!defined($line));
+ return ($line, "\@$macro" . $text, $args);
+}
+
+#+++###########################################################################
+# #
+# Pass structure: parse document structure #
+# #
+#---###########################################################################
+
+# This is a virtual element for things appearing before @node and
+# sectionning commands
+my $element_before_anything =
+{
+ 'before_anything' => 1,
+ 'place' => [],
+ 'texi' => 'VIRTUAL ELEMENT BEFORE ANYTHING',
+};
+
+sub initialise_state_structure($)
+{
+ my $state = shift;
+ $state->{'structure'} = 1; # for substitute_text and close_stack:
+ # 1 if pass_structure/scan_structure is
+ # to be used
+ $state->{'menu'} = 0; # number of opened menus
+ $state->{'detailmenu'} = 0; # number of opened detailed menus
+ $state->{'level'} = 0; # current sectionning level
+ $state->{'table_stack'} = [ "no table" ]; # a stack of opened tables/lists
+ delete ($state->{'region_lines'}) unless (defined($state->{'region_lines'}));
+}
+
+my @doc_lines = (); # whole document
+my @doc_numbers = (); # whole document line numbers and file names
+my @nodes_list = (); # nodes in document reading order
+ # each member is a reference on a hash
+my @sections_list = (); # sections in reading order
+ # each member is a reference on a hash
+my @elements_list = (); # sectionning elements (nodes and sections)
+ # in reading order. Each member is a reference
+ # on a hash which also appears in %nodes,
+ # @sections_list @nodes_list, @all_elements
+my @all_elements; # all the elements in document order
+my %nodes = (); # nodes hash. The key is the texi node name
+my %cross_reference_nodes = (); # normalized node names
+my %sections = (); # sections hash. The key is the section number
+ # headings are there, although they are not elements
+my $element_top; # Top element
+my $node_top; # Top node
+my $node_first; # First node
+my $element_index; # element with first index
+my $element_chapter_index; # chapter with first index
+my $element_first; # first element
+my $element_last; # last element
+
+# This is a virtual element used to have the right hrefs for index entries
+# and anchors in footnotes
+my $footnote_element =
+{
+ 'id' => 'SEC_Foot',
+ 'file' => $docu_foot,
+ 'footnote' => 1,
+ 'element' => 1,
+ 'place' => [],
+};
+
+#my $do_contents; # do table of contents if true
+#my $do_scontents; # do short table of contents if true
+my $novalidate = $Texi2HTML::Config::NOVALIDATE; # @novalidate appeared
+
+sub pass_structure()
+{
+ my $state = {};
+ # holds the informations about the context
+ # to pass it down to the functions
+ initialise_state_structure($state);
+ $state->{'element'} = $element_before_anything;
+ $state->{'place'} = $element_before_anything->{'place'};
+ my @stack;
+ my $text;
+ my $line_nr;
+
+ while (@lines)
+ {
+ $_ = shift @lines;
+ my $chomped_line = $_;
+ if (!chomp($chomped_line) and @lines)
+ {
+ $lines[0] = $_ . $lines[0];
+ next;
+ }
+ $line_nr = shift (@lines_numbers);
+ #print STDERR "PASS_STRUCTURE: $_";
+ if (!$state->{'raw'} and !$state->{'special'} and !$state->{'verb'})
+ {
+ my $tag = '';
+ if (/^\s*\@(\w+)\b/)
+ {
+ $tag = $1;
+ }
+
+ #
+ # analyze the tag
+ #
+ if ($tag and $tag eq 'node' or defined($sec2level{$tag}) or $tag eq 'printindex' or $tag eq 'float')
+ {
+ $_ = substitute_texi_line($_); #usefull if there is an anchor ???
+ if (@stack and $tag eq 'node' or defined($sec2level{$tag}) or
+$tag eq 'float')
+ {# in pass structure node and float shouldn't appear in formats
+ close_stack_texi_structure(\$text, \@stack, $state, $line_nr);
+ if (exists($state->{'region_lines'}))
+ {
+ push @{$region_lines{$state->{'region_lines'}->{'format'}}}, split_lines ($text);
+ }
+ else
+ {
+ push @doc_lines, split_lines ($text);
+ }
+ $text = '';
+ }
+ if ($tag eq 'node')
+ {
+ my $node_ref;
+ my $auto_directions;
+ $auto_directions = 1 unless (/,/o);
+ my ($node, $node_next, $node_prev, $node_up) = split(/,/, $_);
+ $node =~ s/^\@node\s+// if ($node);
+ if ($node)
+ {
+ $node = normalise_space($node);
+ if (exists($nodes{$node}) and defined($nodes{$node})
+ and $nodes{$node}->{'seen'})
+ {
+ echo_error ("Duplicate node found: $node", $line_nr);
+ next;
+ }
+ else
+ {
+ if (exists($nodes{$node}) and defined($nodes{$node}))
+ { # node appeared in a menu
+ $node_ref = $nodes{$node};
+ }
+ else
+ {
+ my $first;
+ $first = 1 if (!defined($node_ref));
+ $node_ref = {};
+ $node_first = $node_ref if ($first);
+ $nodes{$node} = $node_ref;
+ }
+ $node_ref->{'node'} = 1;
+ $node_ref->{'tag'} = 'node';
+ $node_ref->{'tag_level'} = 'node';
+ $node_ref->{'texi'} = $node;
+ $node_ref->{'seen'} = 1;
+ $node_ref->{'automatic_directions'} = $auto_directions;
+ $node_ref->{'place'} = [];
+ $node_ref->{'current_place'} = [];
+ merge_element_before_anything($node_ref);
+ $node_ref->{'index_names'} = [];
+ $state->{'place'} = $node_ref->{'current_place'};
+ $state->{'element'} = $node_ref;
+ $state->{'after_element'} = 1;
+ $state->{'node_ref'} = $node_ref;
+ # makeinfo treats differently case variants of
+ # top in nodes and anchors and in refs commands and
+ # refs from nodes.
+ if ($node =~ /^top$/i)
+ {
+ if (!defined($node_top))
+ {
+ $node_top = $node_ref;
+ $node_top->{'texi'} = 'Top';
+ delete $nodes{$node};
+ $nodes{$node_top->{'texi'}} = $node_ref;
+ }
+ else
+ { # All the refs are going to point to the first Top
+ echo_warn ("Top node allready exists", $line_nr);
+ #warn "$WARN Top node allready exists\n";
+ }
+ }
+ unless (@nodes_list)
+ {
+ $node_ref->{'first'} = 1;
+ }
+ push (@nodes_list, $node_ref);
+ push @elements_list, $node_ref;
+ }
+ }
+ else
+ {
+ echo_error ("Node is undefined: $_ (eg. \@node NODE-NAME, NEXT, PREVIOUS, UP)", $line_nr);
+ next;
+ }
+
+ if ($node_next)
+ {
+ $node_ref->{'node_next'} = normalise_node($node_next);
+ }
+ if ($node_prev)
+ {
+ $node_ref->{'node_prev'} = normalise_node($node_prev);
+ }
+ if ($node_up)
+ {
+ $node_ref->{'node_up'} = normalise_node($node_up);
+ }
+ }
+ elsif (defined($sec2level{$tag}))
+ {
+ if (/^\@$tag\s*(.*)$/)
+ {
+ my $name = normalise_space($1);
+ $name = '' if (!defined($name));
+ my $level = $sec2level{$tag};
+ $state->{'after_element'} = 1;
+ my ($docid, $num);
+ if($tag ne 'top')
+ {
+ $sec_num++;
+ $num = $sec_num;
+ $docid = "SEC$sec_num";
+ }
+ else
+ {
+ $num = 0;
+ $docid = "SEC_Top";
+ }
+ if ($tag !~ /heading/)
+ {
+ my $section_ref = { 'texi' => $name,
+ 'level' => $level,
+ 'tag' => $tag,
+ 'sec_num' => $num,
+ 'section' => 1,
+ 'id' => $docid,
+ 'seen' => 1,
+ 'index_names' => [],
+ 'current_place' => [],
+ 'place' => []
+ };
+
+ if ($tag eq 'top')
+ {
+ $section_ref->{'top'} = 1;
+ $section_ref->{'number'} = '';
+ $sections{0} = $section_ref;
+ $element_top = $section_ref;
+ }
+ $sections{$num} = $section_ref;
+ merge_element_before_anything($section_ref);
+ if ($state->{'node_ref'} and !exists($state->{'node_ref'}->{'with_section'}))
+ {
+ my $node_ref = $state->{'node_ref'};
+ $section_ref->{'node_ref'} = $node_ref;
+ $section_ref->{'titlefont'} = $node_ref->{'titlefont'};
+ $node_ref->{'with_section'} = $section_ref;
+ $node_ref->{'top'} = 1 if ($tag eq 'top');
+ }
+ if (! $name and $level)
+ {
+ echo_warn ("$tag without name", $line_nr);
+ }
+ push @sections_list, $section_ref;
+ push @elements_list, $section_ref;
+ $state->{'section_ref'} = $section_ref;
+ $state->{'element'} = $section_ref;
+ $state->{'place'} = $section_ref->{'current_place'};
+ my $node_ref = "NO NODE";
+ my $node_texi ='';
+ if ($state->{'node_ref'})
+ {
+ $node_ref = $state->{'node_ref'};
+ $node_texi = $state->{'node_ref'}->{'texi'};
+ }
+ print STDERR "# pass_structure node($node_ref)$node_texi, tag \@$tag($level) ref $section_ref, num,id $num,$docid\n $name\n"
+ if $T2H_DEBUG & $DEBUG_ELEMENTS;
+ }
+ else
+ {
+ my $section_ref = { 'texi' => $name,
+ 'level' => $level,
+ 'heading' => 1,
+ 'tag' => $tag,
+ 'tag_level' => $tag,
+ 'sec_num' => $sec_num,
+ 'id' => $docid,
+ 'number' => '' };
+ $state->{'element'} = $section_ref;
+ push @{$state->{'place'}}, $section_ref;
+ $sections{$sec_num} = $section_ref;
+ }
+ }
+ }
+ elsif ($tag eq 'float')
+ {
+ my ($style_texi, $label_texi) = split(/,/, $_);
+ $style_texi =~ s/^\@float\s*//;
+ $style_texi = normalise_space($style_texi);
+ $label_texi = undef if (defined($label_texi) and ($label_texi =~ /^\s*$/));
+ if (defined($label_texi))
+ {
+ $label_texi = normalise_node($label_texi);
+ if (exists($nodes{$label_texi}) and defined($nodes{$label_texi})
+ and $nodes{$label_texi}->{'seen'})
+ {
+ echo_error ("Duplicate label found: $label_texi", $line_nr);
+ while ($_ =~ /,/)
+ {
+ $_ =~ s/,.*$//;
+ }
+ }
+ else
+ {
+ my $float = { };
+ if (exists($nodes{$label_texi}) and defined($nodes{$label_texi}))
+ { # float appeared in a menu
+ $float = $nodes{$label_texi};
+ }
+ else
+ {
+ $nodes{$label_texi} = $float;
+ }
+ $float->{'float'} = 1;
+ $float->{'tag'} = 'float';
+ $float->{'texi'} = $label_texi;
+ $float->{'seen'} = 1;
+ $float->{'id'} = $label_texi;
+#print STDERR "FLOAT: $float $float->{'texi'}, place $state->{'place'}\n";
+ push @{$state->{'place'}}, $float;
+ $float->{'element'} = $state->{'element'};
+ $state->{'float'} = $float;
+ $float->{'style_texi'} = $style_texi;
+ push @floats, $float;
+ }
+ }
+ }
+ elsif (/^\@printindex\s+(\w+)/)
+ {
+ unless (@elements_list)
+ {
+ echo_warn ("Printindex before document beginning: \@printindex $1", $line_nr);
+ next;
+ }
+ $state->{'after_element'} = 0;
+ # $element_index is the first element with index
+ $element_index = $elements_list[-1] unless (defined($element_index));
+ # associate the index to the element such that the page
+ # number is right
+ my $placed_elements = [];
+ push @{$elements_list[-1]->{'index_names'}}, { 'name' => $1, 'place' => $placed_elements };
+ $state->{'place'} = $placed_elements;
+ }
+ if (exists($state->{'region_lines'}))
+ {
+ push @{$region_lines{$state->{'region_lines'}->{'format'}}}, $_;
+ }
+ else
+ {
+ push @doc_lines, $_;
+ push @doc_numbers, $line_nr;
+ }
+ next;
+ }
+ }
+ if (scan_structure ($_, \$text, \@stack, $state, $line_nr) and !(exists($state->{'region_lines'})))
+ {
+ push (@doc_numbers, $line_nr);
+ }
+ next if (@stack);
+ $_ = $text;
+ $text = '';
+ next if (!defined($_));
+ if ($state->{'region_lines'})
+ {
+ push @{$region_lines{$state->{'region_lines'}->{'format'}}}, split_lines ($_);
+ }
+ else
+ {
+ push @doc_lines, split_lines ($_);
+ }
+ }
+ if (@stack)
+ {# close stack at the end of pass structure
+ close_stack_texi_structure(\$text, \@stack, $state, $line_nr);
+ push @doc_lines, split_lines ($text) if ($text and (!exists($state->{'region_lines'})));
+ }
+ echo_warn ("At end of document, $state->{'region_lines'}->{'number'} $state->{'region_lines'}->{'format'} not closed") if (exists($state->{'region_lines'}));
+ print STDERR "# end of pass structure\n" if $T2H_VERBOSE;
+}
+
+# split line at end of line and put each resulting line in an array
+sub split_lines($)
+{
+ my $line = shift;
+ my @result = ();
+ my $i = 0;
+ while ($line)
+ {
+ $result[$i] = '';
+ $line =~ s/^(.*)//;
+ $result[$i] .= $1;
+ $result[$i] .= "\n" if ($line =~ s/^\n//);
+ #print STDERR "$i: $result[$i]";
+ $i++;
+ }
+ return @result;
+}
+
+sub misc_command_structure($$$$)
+{
+ my $line = shift;
+ my $macro = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $text;
+ my $args;
+
+ if ($macro eq 'lowersections')
+ {
+ my ($sec, $level);
+ while (($sec, $level) = each %sec2level)
+ {
+ $sec2level{$sec} = $level + 1;
+ }
+ $state->{'level'}--;
+ }
+ elsif ($macro eq 'raisesections')
+ {
+ my ($sec, $level);
+ while (($sec, $level) = each %sec2level)
+ {
+ $sec2level{$sec} = $level - 1;
+ }
+ $state->{'level'}++;
+ }
+ elsif ($macro eq 'contents')
+ {
+ $Texi2HTML::Config::DO_CONTENTS = 1;
+ }
+ elsif ($macro eq 'detailmenu')
+ {
+ $state->{'detailmenu'}++;
+ }
+ elsif (($macro eq 'summarycontents') or ($macro eq 'shortcontents'))
+ {
+ $Texi2HTML::Config::DO_SCONTENTS = 1;
+ }
+ elsif ($macro eq 'novalidate')
+ {
+ $novalidate = 1;
+ }
+ elsif (grep {$_ eq $macro} ('settitle','setfilename','shortitle','shorttitlepage')
+ and ($line =~ /^\s+(.*)$/))
+ {
+ $value{"_$macro"} = substitute_texi_line($1);
+ }
+ elsif (grep {$_ eq $macro} ('author','subtitle','title')
+ and ($line =~ /^\s+(.*)$/))
+ {
+ $value{"_$macro"} .= substitute_texi_line($1)."\n";
+ push @{$Texi2HTML::THISDOC{"${macro}s"}}, substitute_texi_line($1);
+ }
+ elsif ($macro eq 'synindex' || $macro eq 'syncodeindex')
+ {
+ if ($line =~ /^\s+(\w+)\s+(\w+)/)
+ {
+ my $from = $1;
+ my $to = $2;
+ my $prefix_from = index_name2prefix($from);
+ my $prefix_to = index_name2prefix($to);
+ echo_error ("unknown from index name $from in \@$macro", $line_nr)
+ unless $prefix_from;
+ echo_error ("unknown to index name $to in \@$macro", $line_nr)
+ unless $prefix_to;
+ if ($prefix_from and $prefix_to)
+ {
+ if ($macro eq 'syncodeindex')
+ {
+ $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
+ }
+ else
+ {
+ $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
+ }
+ }
+ }
+ else
+ {
+ echo_error ("Bad $macro line: $line", $line_nr);
+ }
+ }
+ elsif ($macro eq 'defindex' || $macro eq 'defcodeindex')
+ {
+ if ($line =~ /^\s+(\w+)\s*$/)
+ {
+ my $name = $1;
+ $index_properties->{$name}->{'name'} = $name;
+ $index_properties->{$name}->{'code'} = 1 if $macro eq 'defcodeindex';
+ }
+ else
+ {# FIXME makeinfo don't warn ?
+ echo_error ("Bad $macro line: $line", $line_nr);
+ }
+ }
+ elsif ($macro eq 'documentlanguage')
+ {
+ if ($line =~ /\s+(\w+)/)
+ {
+ my $lang = $1;
+ set_document_language($lang, 0, $line_nr) if (!$cmd_line_lang && $lang);
+ }
+ }
+ elsif ($macro eq 'kbdinputstyle')
+ {# FIXME makeinfo ignores that with --html
+ if ($line =~ /\s+([a-z]+)/)
+ {
+ if ($1 eq 'code')
+ {
+ $style_map_ref->{'kbd'} = $style_map_ref->{'code'};
+ $style_map_pre_ref->{'kbd'} = $style_map_pre_ref->{'code'};
+ $Texi2HTML::THISDOC{'kbdinputstyle'} = $1;
+ }
+ elsif ($1 eq 'example')
+ {
+ $style_map_pre_ref->{'kbd'} = $style_map_pre_ref->{'code'};
+ $Texi2HTML::THISDOC{'kbdinputstyle'} = $1;
+ }
+ elsif ($1 ne 'distinct')
+ {
+ echo_error ("Unknown argument for \@$macro: $1", $line_nr);
+ }
+ }
+ else
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif ($macro eq 'paragraphindent')
+ {
+ if ($line =~ /\s+([0-9]+)/)
+ {
+ $Texi2HTML::THISDOC{'paragraphindent'} = $1;
+ }
+ elsif (($line =~ /\s+(none)[^\w\-]/) or ($line =~ /\s+(asis)[^\w\-]/))
+ {
+ $Texi2HTML::THISDOC{'paragraphindent'} = $1;
+ }
+ else
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif ($macro eq 'firstparagraphindent')
+ {
+ if (($line =~ /\s+(none)[^\w\-]/) or ($line =~ /\s+(insert)[^\w\-]/))
+ {
+ $Texi2HTML::THISDOC{'firstparagraphindent'} = $1;
+ }
+ else
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif ($macro eq 'exampleindent')
+ {
+ if ($line =~ /^\s+([0-9]+)/)
+ {
+ $Texi2HTML::THISDOC{'exampleindent'} = $1;
+ }
+ elsif ($line =~ /^\s+(asis)[^\w\-]/)
+ {
+ $Texi2HTML::THISDOC{'exampleindent'} = $1;
+ }
+ else
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif ($macro eq 'footnotestyle')
+ {
+ if (($line =~ /^\s+(end)[^\w\-]/) or ($line =~ /^\s+(separate)[^\w\-]/))
+ {
+ $Texi2HTML::THISDOC{'footnotestyle'} = $1;
+ }
+ else
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif ($macro eq 'headings')
+ {
+ my $valid_arg = 0;
+ foreach my $possible_arg (('off','on','single','double',
+ 'singleafter','doubleafter'))
+ {
+ if ($line =~ /^\s+($possible_arg)[^\w\-]/)
+ {
+ $valid_arg = 1;
+ $Texi2HTML::THISDOC{'headings'} = $possible_arg;
+ last;
+ }
+ }
+ unless ($valid_arg)
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif ($macro eq 'setchapternewpage')
+ {
+ if (($line =~ /^\s+(on)[^\w\-]/) or ($line =~ /^\s+(off)[^\w\-]/)
+ or ($line =~ /^\s+(odd)[^\w\-]/))
+ {
+ $Texi2HTML::THISDOC{'setchapternewpage'} = $1;
+ }
+ else
+ {
+ echo_error ("Bad \@$macro", $line_nr);
+ }
+ }
+ elsif (grep {$macro eq $_} ('everyheading', 'everyfooting',
+ 'evenheading', 'evenfooting', 'oddheading', 'oddfooting'))
+ {
+ my $arg = $line;
+ $arg =~ s/^\s+//;
+ $Texi2HTML::THISDOC{$macro} = $arg;
+ }
+
+ ($text, $line, $args) = preserve_command($line, $macro);
+ return ($text, $line);
+}
+
+# return the line after removing things according to misc_command map.
+# if the skipped macro has an effect it is done here
+# this is used during pass_text
+sub misc_command_text($$$$$$)
+{
+ my $line = shift;
+ my $macro = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $text = shift;
+ my $line_nr = shift;
+ my ($skipped, $remaining, $args);
+ my $keep = $Texi2HTML::Config::misc_command{$macro}->{'keep'};
+
+ if ($macro eq 'detailmenu')
+ {
+ $state->{'detailmenu'}++;
+ }
+ elsif ($macro eq 'sp')
+ {
+ my $sp_number;
+ if ($line =~ /^\s+(\d+)\s/)
+ {
+ $sp_number = $1;
+ }
+ elsif ($line =~ /(\s*)$/)
+ {
+ $sp_number = '';
+ }
+ else
+ {
+ echo_error ("\@$macro needs a numeric arg or no arg", $line_nr);
+ }
+ $sp_number = 1 if ($sp_number eq '');
+ add_prev($text, $stack, &$Texi2HTML::Config::sp($sp_number, $state->{'preformatted'}));
+ }
+ elsif($macro eq 'verbatiminclude' and !$keep)
+ {
+ if ($line =~ /\s+(.+)/)
+ {
+ my $arg = $1;
+ my $file = locate_include_file($arg);
+ if (defined($file))
+ {
+ if (!open(VERBINCLUDE, $file))
+ {
+ echo_warn ("Can't read file $file: $!",$line_nr);
+ }
+ else
+ {
+ my $verb_text = '';
+ while (my $line = <VERBINCLUDE>)
+ {
+ $verb_text .= $line;
+ }
+ add_prev($text, $stack, &$Texi2HTML::Config::raw('verbatim',$verb_text));
+ close VERBINCLUDE;
+ }
+ }
+ else
+ {
+ echo_error ("Can't find $arg, skipping", $line_nr);
+ }
+ }
+ else
+ {
+ echo_error ("Bad \@$macro line: $_", $line_nr);
+ }
+ }
+ elsif ($macro eq 'need')
+ {
+ unless (($line =~ /\s+([0-9]+(\.[0-9]*)?)[^\w\-]/) or
+ ($line =~ /\s+(\.[0-9]+)[^\w\-]/))
+ {
+ echo_warn ("Bad \@$macro", $line_nr);
+ }
+ }
+ ($remaining, $skipped, $args) = preserve_command($line, $macro);
+ if ($keep)
+ {
+ $remaining = $args . $remaining;
+ }
+ return $remaining if ($remaining ne '');
+ return undef;
+}
+
+# merge the things appearing before the first @node or sectionning command
+# (held by element_before_anything) with the current element if not allready
+# done
+sub merge_element_before_anything($)
+{
+ my $element = shift;
+ if (exists($element_before_anything->{'place'}))
+ {
+ $element->{'current_place'} = $element_before_anything->{'place'};
+ $element->{'titlefont'} = $element_before_anything->{'titlefont'};
+ delete $element_before_anything->{'place'};
+ foreach my $placed_thing (@{$element->{'current_place'}})
+ {
+ $placed_thing->{'element'} = $element if (exists($placed_thing->{'element'}));
+ }
+ }
+}
+
+# find menu_prev, menu_up... for a node in menu
+sub menu_entry_texi($$$)
+{
+ my $node = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $node_menu_ref = {};
+ if (exists($nodes{$node}))
+ {
+ $node_menu_ref = $nodes{$node};
+ }
+ else
+ {
+ $nodes{$node} = $node_menu_ref;
+ $node_menu_ref->{'texi'} = $node;
+ $node_menu_ref->{'external_node'} = 1 if ($node =~ /\(.+\)/);
+# or $novalidate);
+ }
+ #$node_menu_ref->{'menu_node'} = 1;
+ if ($state->{'node_ref'})
+ {
+ $node_menu_ref->{'menu_up'} = $state->{'node_ref'};
+ $node_menu_ref->{'menu_up_hash'}->{$state->{'node_ref'}->{'texi'}} = 1;
+ }
+ else
+ {
+ echo_warn ("menu entry without previous node: $node", $line_nr) unless ($node =~ /\(.+\)/);
+ #warn "$WARN menu entry without previous node: $node\n" unless ($node =~ /\(.+\)/);
+ }
+ return if ($state->{'detailmenu'});
+ if ($state->{'prev_menu_node'})
+ {
+ $node_menu_ref->{'menu_prev'} = $state->{'prev_menu_node'};
+ $state->{'prev_menu_node'}->{'menu_next'} = $node_menu_ref;
+ }
+ elsif ($state->{'node_ref'})
+ {
+ $state->{'node_ref'}->{'menu_child'} = $node_menu_ref;
+ }
+ $state->{'prev_menu_node'} = $node_menu_ref;
+}
+
+my %files = (); # keys are files. This is used to avoid reusing an allready
+ # used file name
+my %empty_indices = (); # value is true for an index name key if the index
+ # is empty
+my %printed_indices = (); # value is true for an index name not empty and
+ # printed
+
+# find next, prev, up, back, forward, fastback, fastforward
+# find element id and file
+# split index pages
+# associate placed items (items which have links to them) with the right
+# file and id
+# associate nodes with sections
+sub rearrange_elements()
+{
+ @all_elements = @elements_list;
+
+ print STDERR "# find sections levels and toplevel\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+
+ my $toplevel = 4;
+ # correct level if raisesections or lowersections overflowed
+ # and find toplevel
+ foreach my $element (values(%sections))
+ {
+ my $level = $element->{'level'};
+ if ($level > $MAX_LEVEL)
+ {
+ $element->{'level'} = $MAX_LEVEL;
+ }
+ elsif ($level < $MIN_LEVEL and !$element->{'top'})
+ {
+ $element->{'level'} = $MIN_LEVEL;
+ }
+ else
+ {
+ $element->{'level'} = $level;
+ }
+ $element->{'toc_level'} = $element->{'level'};
+ # This is for top
+ $element->{'toc_level'} = $MIN_LEVEL if ($element->{'level'} < $MIN_LEVEL);
+ # find the new tag corresponding with the level of the section
+ $element->{'tag_level'} = $level2sec{$element->{'tag'}}->[$element->{'level'}] if ($element->{'tag'} !~ /heading/);
+ $toplevel = $element->{'level'} if (($element->{'level'} < $toplevel) and ($element->{'level'} > 0 and ($element->{'tag'} !~ /heading/)));
+ print STDERR "# section level $level: $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ }
+
+ print STDERR "# find sections structure, construct section numbers (toplevel=$toplevel)\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+
+ my $in_appendix = 0;
+ # these arrays heve an element per sectionning level.
+ my @previous_numbers = (); # holds the number of the previous sections
+ # at the same and upper levels
+ my @previous_sections = (); # holds the ref of the previous sections
+
+ foreach my $section (@sections_list)
+ {
+ next if ($section->{'top'});
+ print STDERR "Bug level undef for ($section) $section->{'texi'}\n" if (!defined($section->{'level'}));
+ $section->{'toplevel'} = 1 if ($section->{'level'} == $toplevel);
+ # undef things under that section level
+ for (my $level = $section->{'level'} + 1; $level < $MAX_LEVEL + 1 ; $level++)
+ {
+ $previous_numbers[$level] = undef;
+ $previous_sections[$level] = undef;
+ }
+ my $number_set;
+ # find number at the current level
+ if ($section->{'tag'} =~ /appendix/ and !$in_appendix)
+ {
+ $previous_numbers[$toplevel] = 'A';
+ $in_appendix = 1;
+ $number_set = 1 if ($section->{'level'} == $toplevel);
+ }
+ if (!defined($previous_numbers[$section->{'level'}]) and !$number_set)
+ {
+ if ($section->{'tag'} =~ /unnumbered/)
+ {
+ $previous_numbers[$section->{'level'}] = undef;
+ }
+ else
+ {
+ $previous_numbers[$section->{'level'}] = 1;
+ }
+ }
+ elsif ($section->{'tag'} !~ /unnumbered/ and !$number_set)
+ {
+ $previous_numbers[$section->{'level'}]++;
+ }
+ # construct the section number
+ $section->{'number'} = '';
+
+ unless ($section->{'tag'} =~ /unnumbered/)
+ {
+ my $level = $section->{'level'};
+ while ($level > $toplevel)
+ {
+ my $number = $previous_numbers[$level];
+ $number = 0 if (!defined($number));
+ if ($section->{'number'})
+ {
+ $section->{'number'} = "$number.$section->{'number'}";
+ }
+ else
+ {
+ $section->{'number'} = $number;
+ }
+ $level--;
+ }
+ my $toplevel_number = $previous_numbers[$toplevel];
+ $toplevel_number = 0 if (!defined($toplevel_number));
+ $section->{'number'} = "$toplevel_number.$section->{'number'}";
+ }
+ # find the previous section
+ if (defined($previous_sections[$section->{'level'}]))
+ {
+ my $prev_section = $previous_sections[$section->{'level'}];
+ $section->{'section_prev'} = $prev_section;
+ $prev_section->{'next'} = $section;
+ $prev_section->{'element_next'} = $section;
+ }
+ # find the up section
+ if ($section->{'level'} == $toplevel)
+ {
+ $section->{'up'} = undef;
+ }
+ else
+ {
+ my $level = $section->{'level'} - 1;
+ while (!defined($previous_sections[$level]) and ($level >= 0))
+ {
+ $level--;
+ }
+ if ($level >= 0)
+ {
+ $section->{'up'} = $previous_sections[$level];
+ # 'child' is the first child
+ $section->{'up'}->{'child'} = $section unless ($section->{'section_prev'});
+ }
+ else
+ {
+ $section->{'up'} = undef;
+ }
+ }
+ $previous_sections[$section->{'level'}] = $section;
+ # element_up is used for reparenting in case an index page
+ # splitted a section. This is used in order to preserve the up which
+ # points to the up section. See below at index pages generation.
+ $section->{'element_up'} = $section->{'up'};
+
+ my $up = "NO_UP";
+ $up = $section->{'up'} if (defined($section->{'up'}));
+ print STDERR "# numbering section ($section->{'level'}): $section->{'number'}: (up: $up) $section->{'texi'}\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ }
+
+ my @node_directions = ('node_prev', 'node_next', 'node_up');
+ # handle nodes
+ # the node_prev... are texinfo strings, find the associated node references
+ print STDERR "# Resolve nodes directions\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ foreach my $node (@nodes_list)
+ {
+ foreach my $direction (@node_directions)
+ {
+ if ($node->{$direction} and !ref($node->{$direction}))
+ {
+ if ($nodes{$node->{$direction}} and $nodes{$node->{$direction}}->{'seen'})
+ {
+ $node->{$direction} = $nodes{$node->{$direction}};
+ }
+ elsif (($node->{$direction} =~ /^\(.*\)/) or $novalidate)
+ { # ref to an external node
+ if (exists($nodes{$node->{$direction}}))
+ {
+ $node->{$direction} = $nodes{$node->{$direction}};
+ }
+ else
+ {
+ # FIXME if {'seen'} this is a node appearing in the
+ # document and a node like `(file)node'. What to
+ # do then ?
+ my $node_ref = { 'texi' => $node->{$direction} };
+ $node_ref->{'external_node'} = 1 if ($node->{$direction} =~ /^\(.*\)/);
+ #my $node_ref = { 'texi' => $node->{$direction},
+ # 'external_node' => 1 };
+ $nodes{$node->{$direction}} = $node_ref;
+ $node->{$direction} = $node_ref;
+ }
+ }
+ else
+ {
+ echo_warn ("$direction `$node->{$direction}' for `$node->{'texi'}' not found");
+ delete $node->{$direction};
+ }
+ }
+ }
+ }
+
+ # find section preceding and following top
+ my $section_before_top; # section preceding the top node
+ my $section_after_top; # section following the top node
+ if ($node_top)
+ {
+ my $previous_is_top = 0;
+ foreach my $element (@all_elements)
+ {
+ if ($element eq $node_top)
+ {
+ $previous_is_top = 1;
+ next;
+ }
+ if ($previous_is_top)
+ {
+ if ($element->{'section'})
+ {
+ $section_after_top = $element;
+ last;
+ }
+ next;
+ }
+ $section_before_top = $element if ($element->{'section'});
+ }
+ }
+ print STDERR "# section before Top: $section_before_top->{'texi'}\n"
+ if ($section_before_top and ($T2H_DEBUG & $DEBUG_ELEMENTS));
+ print STDERR "# section after Top: $section_after_top->{'texi'}\n"
+ if ($section_after_top and ($T2H_DEBUG & $DEBUG_ELEMENTS));
+
+ print STDERR "# Build the elements list\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ if (!$Texi2HTML::Config::USE_NODES)
+ {
+ #the only sectionning elements are sections
+ @elements_list = @sections_list;
+ # if there is no section we use nodes...
+ if (!@elements_list)
+ {
+ print STDERR "# no section\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ @elements_list = @all_elements;
+ }
+ elsif (!$element_top and $node_top and !$node_top->{'with_section'})
+ { # special case for the top node if it isn't associated with
+ # a section. The top node element is inserted between the
+ # $section_before_top and the $section_after_top
+ $node_top->{'as_section'} = 1;
+ $node_top->{'section_ref'} = $node_top;
+ my @old_element_lists = @elements_list;
+ @elements_list = ();
+ while (@old_element_lists)
+ {
+ my $section = shift @old_element_lists;
+ if ($section_before_top and ($section eq $section_before_top))
+ {
+ push @elements_list, $section;
+ push @elements_list, $node_top;
+ last;
+ }
+ elsif ($section_after_top and ($section eq $section_after_top))
+ {
+ push @elements_list, $node_top;
+ push @elements_list, $section;
+ last;
+ }
+ push @elements_list, $section;
+ }
+ push @elements_list, @old_element_lists;
+ }
+
+ foreach my $element (@elements_list)
+ {
+ print STDERR "# new section element $element->{'texi'}\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ }
+ }
+ else
+ {
+ # elements are sections if possible, and node if no section associated
+ my @elements = ();
+ while (@elements_list)
+ {
+ my $element = shift @elements_list;
+ if ($element->{'node'})
+ {
+ if (!defined($element->{'with_section'}))
+ {
+ $element->{'toc_level'} = $MIN_LEVEL if (!defined($element->{'toc_level'}));
+ print STDERR "# new node element ($element) $element->{'texi'}\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ push @elements, $element;
+ }
+ }
+ else
+ {
+ print STDERR "# new section element ($element) $element->{'texi'}\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ push @elements, $element;
+ }
+ }
+ @elements_list = @elements;
+ }
+ foreach my $element (@elements_list)
+ {
+ $element->{'element'} = 1;
+ }
+
+ # nodes are attached to the section preceding them if not allready
+ # associated with a section
+ print STDERR "# Find the section associated with each node\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ my $current_section = $sections_list[0];
+ $current_section = $node_top if ($node_top and $node_top->{'as_section'} and !$section_before_top);
+ my $current;
+ foreach my $element (@all_elements)
+ {
+ if ($element->{'node'} and !$element->{'as_section'})
+ {
+ if ($element->{'with_section'})
+ { # the node is associated with a section
+ $element->{'section_ref'} = $element->{'with_section'};
+ push @{$element->{'section_ref'}->{'nodes'}}, $element;
+ }
+ elsif (defined($current_section))
+ {
+ $current_section = $section_after_top
+ if ($current_section->{'node'} and $section_after_top);
+ $element->{'in_top'} = 1 if ($current_section->{'top'});
+ $element->{'section_ref'} = $current_section;
+ # nodes are considered sub elements for the purprose of
+ # reparenting and their element_next and element_prev
+ # are next and prev node associated with the same section
+ $element->{'element_up'} = $current_section;
+ $element->{'toc_level'} = $current_section->{'toc_level'};
+ if (defined($current))
+ {
+ $current->{'element_next'} = $element;
+ $element->{'element_prev'} = $current;
+ }
+ $current = $element;
+ push @{$element->{'section_ref'}->{'nodes'}}, $element;
+ }
+ else
+ {
+ $element->{'toc_level'} = $MIN_LEVEL;
+ }
+ }
+ else
+ {
+ $current = undef;
+ $current_section = $element;
+ if ($element->{'node'})
+ { # Top node
+ $element->{'toc_level'} = $MIN_LEVEL;
+ push @{$element->{'section_ref'}->{'nodes'}}, $element;
+ }
+ }
+ }
+ print STDERR "# Complete nodes next prev and up based on menus and sections\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ foreach my $node (@nodes_list)
+ {
+ if (!$node->{'first'} and !$node->{'top'} and !$node->{'menu_up'} and ($node->{'texi'} !~ /^top$/i) and $Texi2HTML::Config::SHOW_MENU)
+ {
+ warn "$WARN `$node->{'texi'}' doesn't appear in menus\n";
+ }
+
+ # use values deduced from menus to complete missing up, next, prev
+ # or from sectionning commands if automatic sectionning
+ if ($node->{'node_up'})
+ {
+ $node->{'up'} = $node->{'node_up'};
+ }
+ elsif ($node->{'automatic_directions'} and $node->{'section_ref'} and defined($node->{'section_ref'}->{'up'}))
+ {
+ $node->{'up'} = get_node($node->{'section_ref'}->{'up'});
+ }
+ elsif ($node->{'menu_up'})
+ {
+ $node->{'up'} = $node->{'menu_up'};
+ }
+
+ if ($node->{'up'} and !$node->{'up'}->{'external_node'})
+ {
+ # We detect when the up node has no menu entry for that node, as
+ # there may be infinite loops when finding following node (see below)
+ unless (defined($node->{'menu_up_hash'}) and ($node->{'menu_up_hash'}->{$node->{'up'}->{'texi'}}))
+ {
+ print STDERR "$WARN `$node->{'up'}->{'texi'}' is up for `$node->{'texi'}', but has no menu entry for this node\n" if ($Texi2HTML::Config::SHOW_MENU);
+ push @{$node->{'up_not_in_menu'}}, $node->{'up'}->{'texi'};
+ }
+ }
+
+ # Find next node
+ if ($node->{'node_next'})
+ {
+ $node->{'next'} = $node->{'node_next'};
+ }
+ elsif ($node->{'texi'} eq 'Top')
+ { # special case as said in the texinfo manual
+ $node->{'next'} = $node->{'menu_child'} if ($node->{'menu_child'});
+ }
+ elsif ($node->{'automatic_directions'})
+ {
+ if (defined($node->{'section_ref'}))
+ {
+ my $next;
+ my $section = $node->{'section_ref'};
+ if (defined($section->{'next'}))
+ {
+ $next = get_node($section->{'next'})
+ }
+ else
+ {
+ while (defined($section->{'up'}) and !defined($section->{'next'}))
+ {
+ $section = $section->{'up'};
+ }
+ if (defined($section->{'next'}))
+ {
+ $next = get_node($section->{'next'});
+ }
+ }
+ $node->{'next'} = $next;
+ }
+ }
+ if (!defined($node->{'next'}) and $node->{'menu_next'})
+ {
+ $node->{'next'} = $node->{'menu_next'};
+ }
+ # Find prev node
+ if ($node->{'node_prev'})
+ {
+ $node->{'prev'} = $node->{'node_prev'};
+ }
+ elsif ($node->{'automatic_directions'})
+ {
+ if (defined($node->{'section_ref'}))
+ {
+ my $section = $node->{'section_ref'};
+ if (defined($section->{'section_prev'}))
+ {
+ $node->{'prev'} = get_node($section->{'section_prev'});
+ }
+ elsif (defined($section->{'up'}))
+ {
+ $node->{'prev'} = get_node($section->{'up'});
+ }
+ }
+ }
+ # next we try menus. makeinfo don't do that
+ if (!defined($node->{'prev'}) and $node->{'menu_prev'})
+ {
+ $node->{'prev'} = $node->{'menu_prev'};
+ }
+ # the prev node is the parent node
+ elsif (!defined($node->{'prev'}) and $node->{'menu_up'})
+ {
+ $node->{'prev'} = $node->{'menu_up'};
+ }
+
+ # the following node is the node following in node reading order
+ # it is thus first the child, else the next, else the next following
+ # the up
+ if ($node->{'menu_child'})
+ {
+ $node->{'following'} = $node->{'menu_child'};
+ }
+ elsif ($node->{'automatic_directions'} and defined($node->{'section_ref'}) and defined($node->{'section_ref'}->{'child'}))
+ {
+ $node->{'following'} = get_node ($node->{'section_ref'}->{'child'});
+ }
+ elsif (defined($node->{'next'}))
+ {
+ $node->{'following'} = $node->{'next'};
+ }
+ else
+ {
+ my $up = $node->{'up'};
+ # in order to avoid infinite recursion in case the up node is the
+ # node itself we use the up node as following when there isn't
+ # a correct menu structure, here and also below.
+ $node->{'following'} = $up if (defined($up) and grep {$_ eq $up->{'texi'}} @{$node->{'up_not_in_menu'}});
+ while ((!defined($node->{'following'})) and (defined($up)))
+ {
+ if (($node_top) and ($up eq $node_top))
+ { # if we are at Top, Top is following
+ $node->{'following'} = $node_top;
+ $up = undef;
+ }
+ if (defined($up->{'next'}))
+ {
+ $node->{'following'} = $up->{'next'};
+ }
+ elsif (defined($up->{'up'}))
+ {
+ if (! grep { $_ eq $up->{'up'}->{'texi'} } @{$node->{'up_not_in_menu'}})
+ {
+ $up = $up->{'up'};
+ }
+ else
+ { # in that case we can go into a infinite loop
+ $node->{'following'} = $up->{'up'};
+ }
+ }
+ else
+ {
+ $up = undef;
+ }
+ }
+ }
+ }
+
+ # find first and last elements before we split indices
+ # FIXME Is it right for the last element ? Or should it be the last
+ # with indices taken into account ?
+ $element_first = $elements_list[0];
+ print STDERR "# element first: $element_first->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ print STDERR "# top node: $node_top->{'texi'}\n" if (defined($node_top) and
+ ($T2H_DEBUG & $DEBUG_ELEMENTS));
+ # If there is no @top section no top node the first node is the top element
+ $element_top = $node_top if (!defined($element_top) and defined($node_top));
+ $element_top = $element_first unless (defined($element_top));
+ $element_top->{'top'} = 1 if ($element_top->{'node'});
+ $element_last = $elements_list[-1];
+ print STDERR "# element top: $element_top->{'texi'}\n" if ($element_top and
+ ($T2H_DEBUG & $DEBUG_ELEMENTS));
+
+ print STDERR "# find forward and back\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ my $prev;
+ foreach my $element (@elements_list)
+ {
+ # complete the up for toplevel elements
+ if ($element->{'toplevel'} and !defined($element->{'up'}) and $element ne $element_top)
+ {
+ $element->{'up'} = $element_top;
+ }
+ # The childs are element which should be reparented in cas a chapter
+ # is split by an index
+ push @{$element->{'element_up'}->{'childs'}}, $element if (defined($element->{'element_up'}));
+ if ($prev)
+ {
+ $element->{'back'} = $prev;
+ $prev->{'forward'} = $element;
+ $prev = $element;
+ }
+ else
+ {
+ $prev = $element;
+ }
+ # If the element is not a node, then all the node directions are copied
+ # if there is an associated node
+ if (defined($element->{'node_ref'}))
+ {
+ $element->{'nodenext'} = $element->{'node_ref'}->{'next'};
+ $element->{'nodeprev'} = $element->{'node_ref'}->{'prev'};
+ $element->{'menu_next'} = $element->{'node_ref'}->{'menu_next'};
+ $element->{'menu_prev'} = $element->{'node_ref'}->{'menu_prev'};
+ $element->{'menu_child'} = $element->{'node_ref'}->{'menu_child'};
+ $element->{'menu_up'} = $element->{'node_ref'}->{'menu_up'};
+ $element->{'nodeup'} = $element->{'node_ref'}->{'up'};
+ $element->{'following'} = $element->{'node_ref'}->{'following'};
+ }
+ elsif (! $element->{'node'})
+ { # the section has no node associated. Find the node directions using
+ # sections
+ if (defined($element->{'next'}))
+ {
+ $element->{'nodenext'} = get_node($element->{'next'});
+ }
+ if (defined($element->{'section_prev'}))
+ {
+ $element->{'nodeprev'} = get_node($element->{'section_prev'});
+ }
+ if (defined($element->{'up'}))
+ {
+ $element->{'nodeup'} = get_node($element->{'up'});
+ }
+ if ($element->{'child'})
+ {
+ $element->{'following'} = get_node($element->{'child'});
+ }
+ elsif ($element->{'next'})
+ {
+ $element->{'following'} = get_node($element->{'next'});
+ }
+ elsif ($element->{'up'})
+ {
+ my $up = $element;
+ while ($up->{'up'} and !$element->{'following'})
+ {
+ $up = $up->{'up'};
+ if ($up->{'next_section'})
+ {
+ $element->{'following'} = get_node ($up->{'next_section'});
+ }
+ }
+ }
+ }
+ if ($element->{'node'})
+ {
+ $element->{'nodeup'} = $element->{'up'};
+ $element->{'nodeprev'} = $element->{'prev'};
+ $element->{'nodenext'} = $element->{'next'};
+ }
+ }
+
+ my @new_elements = ();
+ print STDERR "# preparing indices\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+
+ while(@elements_list)
+ {
+ my $element = shift @elements_list;
+ # @checked_elements are the elements included in the $element (including
+ # itself) and are searched for indices
+ my @checked_elements = ();
+ if (!$element->{'node'} or $element->{'as_section'})
+ {
+ if (!$Texi2HTML::Config::USE_NODES)
+ {
+ foreach my $node (@{$element->{'nodes'}})
+ {
+ # we update the element index, first element with index
+ # if it is a node
+ $element_index = $element if ($element_index and ($node eq $element_index));
+ push @checked_elements, $node;
+ # we push the section itself after the corresponding node
+ if (defined($element->{'node_ref'}) and ($node eq $element->{'node_ref'}))
+ {
+ push @checked_elements, $element;
+ }
+ }
+ if (!defined($element->{'node_ref'}) and !$element->{'node'})
+ {
+ push @checked_elements, $element;
+ }
+ $element->{'nodes'} = []; # We reset the element nodes list
+ # as the nodes may be associated below to another element if
+ # the element is split accross several other elements/pages
+ }
+ else
+ {
+ if ($element->{'node_ref'})
+ {
+ push @checked_elements, $element->{'node_ref'};
+ $element_index = $element if ($element_index and ($element->{'node_ref'} eq $element_index));
+ }
+ push @checked_elements, $element;
+ $element->{'nodes'} = [];
+ }
+ }
+ else
+ {
+ push @checked_elements, $element;
+ }
+ my $checked_nodes = '';
+ foreach my $checked (@checked_elements)
+ {
+ $checked_nodes .= "$checked->{'texi'}, ";
+ }
+ print STDERR "# Elements checked for $element->{'texi'}: $checked_nodes\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ # current_element is the last element holding text
+ my $current_element = { 'holder' => 1, 'texi' => 'HOLDER',
+ 'place' => [], 'indices' => [] };
+ # back is sed to find back and forward
+ my $back = $element->{'back'} if defined($element->{'back'});
+ # forward is sed to find forward of the last inserted element
+ my $forward = $element->{'forward'};
+ my $element_next = $element->{'element_next'};
+ my $index_num = 0;
+ my @waiting_elements = (); # elements (nodes) not used for sectionning
+ # waiting to be associated with an element
+ foreach my $checked_element(@checked_elements)
+ {
+ if ($checked_element->{'element'})
+ { # this is the element, we must add it
+ push @new_elements, $checked_element;
+ if ($current_element->{'holder'})
+ { # no previous element added
+ push @{$checked_element->{'place'}}, @{$current_element->{'place'}};
+ foreach my $index(@{$current_element->{'indices'}})
+ {
+ push @{$checked_element->{'indices'}}, [ { 'element' => $checked_element, 'page' => $index->[0]->{'page'}, 'name' => $index->[0]->{'name'} } ] ;
+ }
+ }
+ else
+ {
+ if ($checked_element->{'toplevel'})
+ # there was an index_page added, this index_page is toplevel.
+ # it begun a new chapter. The element next for this
+ # index page (current_element) is the checked_element
+ {
+ $current_element->{'element_next'} = $checked_element;
+ }
+ $current_element->{'next'} = $checked_element;
+ $current_element->{'following'} = $checked_element;
+ $checked_element->{'prev'} = $current_element;
+ }
+ $current_element = $checked_element;
+ $checked_element->{'back'} = $back;
+ $back->{'forward'} = $checked_element if (defined($back));
+ $back = $checked_element;
+ push @{$checked_element->{'nodes'}}, @waiting_elements;
+ my $waiting_element;
+ while (@waiting_elements)
+ {
+ $waiting_element = shift @waiting_elements;
+ $waiting_element->{'section_ref'} = $checked_element;
+ }
+ }
+ elsif ($current_element->{'holder'})
+ {
+ push @waiting_elements, $checked_element;
+ }
+ else
+ {
+ push @{$current_element->{'nodes'}}, $checked_element;
+ $checked_element->{'section_ref'} = $current_element;
+ }
+ push @{$current_element->{'place'}}, @{$checked_element->{'current_place'}};
+ foreach my $index (@{$checked_element->{'index_names'}})
+ {
+ print STDERR "# Index in `$checked_element->{'texi'}': $index->{'name'}. Current is `$current_element->{'texi'}'\n"
+ if ($T2H_DEBUG & $DEBUG_INDEX);
+ my ($Pages, $Entries) = get_index($index->{'name'});
+ if (defined($Pages))
+ {
+ my @pages = @$Pages;
+ my $first_page = shift @pages;
+ # begin debug section
+ my $back_texi = 'NO_BACK';
+ $back_texi = $back->{'texi'} if (defined($back));
+ print STDERR "# New index first page (back `$back_texi', current `$current_element->{'texi'}')\n" if ($T2H_DEBUG & $DEBUG_INDEX);
+ # end debug section
+ push @{$current_element->{'indices'}}, [ {'element' => $current_element, 'page' => $first_page, 'name' => $index->{'name'} } ];
+ if (@pages)
+ {
+ if ($current_element->{'holder'})
+ { # the current element isn't a real element.
+ # We add the real element
+ # we are in a node of a section but the element
+ # is splitted by the index, thus we must add
+ # a new element which will contain the text
+ # between the beginning of the element and the index
+ push @new_elements, $checked_element;
+ print STDERR "# Add element `$element->{'texi'}' before index page\n"
+ if ($T2H_DEBUG & $DEBUG_INDEX);
+ $checked_element->{'element'} = 1;
+ $checked_element->{'level'} = $element->{'level'};
+ $checked_element->{'toc_level'} = $element->{'toc_level'};
+ $checked_element->{'toplevel'} = $element->{'toplevel'};
+ $checked_element->{'up'} = $element->{'up'};
+ $checked_element->{'element_added'} = 1;
+ print STDERR "Bug: checked element wasn't seen" if
+ (!$checked_element->{'seen'});
+ delete $checked_element->{'with_section'};
+ if ($checked_element->{'toplevel'})
+ {
+ $element->{'element_prev'}->{'element_next'} = $checked_element if (exists($element->{'element_prev'}));
+ }
+ push @{$checked_element->{'place'}}, @{$current_element->{'place'}};
+ foreach my $index(@{$current_element->{'indices'}})
+ {
+ push @{$checked_element->{'indices'}}, [ { 'element' => $checked_element, 'page' => $index->[0]->{'page'}, 'name' => $index->[0]->{'name'} } ] ;
+ }
+ push @{$checked_element->{'nodes'}}, @waiting_elements;
+ my $waiting_element;
+ while (@waiting_elements)
+ {
+ $waiting_element = shift @waiting_elements;
+ $waiting_element->{'section_ref'} = $checked_element;
+ }
+ $checked_element->{'back'} = $back;
+ $back->{'forward'} = $checked_element if (defined($back));
+ $current_element = $checked_element;
+ $back = $checked_element;
+ }
+ my $index_page;
+ while(@pages)
+ {
+ print STDERR "# New page (back `$back->{'texi'}', current `$current_element->{'texi'}')\n" if ($T2H_DEBUG & $DEBUG_INDEX);
+ $index_num++;
+ my $page = shift @pages;
+ $index_page = { 'index_page' => 1,
+ 'texi' => "$element->{'texi'} index $index->{'name'} page $index_num",
+ 'level' => $element->{'level'},
+ 'tag' => $element->{'tag'},
+ 'tag_level' => $element->{'tag_level'},
+ 'toplevel' => $element->{'toplevel'},
+ 'up' => $element->{'up'},
+ 'element_up' => $element->{'element_up'},
+ 'element_next' => $element_next,
+ 'element_ref' => $element,
+ 'back' => $back,
+ 'prev' => $back,
+ 'next' => $current_element->{'next'},
+ 'following' => $current_element->{'following'},
+ 'nodeup' => $current_element->{'nodeup'},
+ 'nodenext' => $current_element->{'nodenext'},
+ 'nodeprev' => $back,
+ 'place' => [],
+ 'seen' => 1,
+ 'page' => $page
+ };
+ $index_page->{'node'} = 1 if ($element->{'node'});
+ while ($nodes{$index_page->{'texi'}})
+ {
+ $nodes{$index_page->{'texi'}} .= ' ';
+ }
+ $nodes{$index_page->{'texi'}} = $index_page;
+ push @{$current_element->{'indices'}->[-1]}, {'element' => $index_page, 'page' => $page, 'name' => $index->{'name'} };
+ push @new_elements, $index_page;
+ $back->{'forward'} = $index_page;
+ $back->{'next'} = $index_page;
+ $back->{'nodenext'} = $index_page;
+ $back->{'element_next'} = $index_page unless ($back->{'top'});
+ $back->{'following'} = $index_page;
+ $back = $index_page;
+ $index_page->{'toplevel'} = 1 if ($element->{'top'});
+ }
+ $current_element = $index_page;
+ }
+ }
+ else
+ {
+ print STDERR "# Empty index: $index->{'name'}\n"
+ if ($T2H_DEBUG & $DEBUG_INDEX);
+ $empty_indices{$index->{'name'}} = 1;
+ }
+ push @{$current_element->{'place'}}, @{$index->{'place'}};
+ }
+ }
+ if ($forward and ($current_element ne $element))
+ {
+ $current_element->{'forward'} = $forward;
+ $forward->{'back'} = $current_element;
+ }
+ next if ($current_element eq $element or !$current_element->{'toplevel'});
+ # reparent the elements below $element, following element
+ # and following parent of element to the last index page
+ print STDERR "# Reparent `$element->{'texi'}':\n" if ($T2H_DEBUG & $DEBUG_INDEX);
+ my @reparented_elements = ();
+ @reparented_elements = (@{$element->{'childs'}}) if (defined($element->{'childs'}));
+ push @reparented_elements, $element->{'element_next'} if (defined($element->{'element_next'}));
+ foreach my $reparented(@reparented_elements)
+ {
+ next if ($reparented->{'toplevel'});
+ $reparented->{'element_up'} = $current_element;
+ print STDERR " reparented: $reparented->{'texi'}\n"
+ if ($T2H_DEBUG & $DEBUG_INDEX);
+ }
+ }
+ @elements_list = @new_elements;
+
+ print STDERR "# find fastback and fastforward\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ foreach my $element (@elements_list)
+ {
+ my $up = get_top($element);
+ next unless (defined($up));
+ $element_chapter_index = $up if ($element_index and ($element_index eq $element));
+ #print STDERR "$element->{'texi'} (top: $element->{'top'}, toplevel: $element->{'toplevel'}, $element->{'element_up'}, $element->{'element_up'}->{'texi'}): up: $up, $up->{'texi'}\n";
+ # fastforward is the next element on same level than the upper parent
+ # element
+ $element->{'fastforward'} = $up->{'element_next'} if (exists ($up->{'element_next'}));
+ # if the element isn't at the highest level, fastback is the
+ # highest parent element
+ if ($up and ($up ne $element))
+ {
+ $element->{'fastback'} = $up;
+ }
+ elsif ($element->{'toplevel'})
+ {
+ # the element is a top level element, we adjust the next
+ # toplevel element fastback
+ $element->{'fastforward'}->{'fastback'} = $element if ($element->{'fastforward'});
+ }
+ }
+ my $index_nr = 0;
+ # convert directions in direction with first letter in all caps, to be
+ # consistent with the convention used in the .init file.
+ # find id for nodes and indices
+ foreach my $element (@elements_list)
+ {
+ $element->{'this'} = $element;
+ foreach my $direction (('Up', 'Forward', 'Back', 'Next',
+ 'Prev', 'FastForward', 'FastBack', 'This', 'NodeUp',
+ 'NodePrev', 'NodeNext', 'Following' ))
+ {
+ my $direction_no_caps = $direction;
+ $direction_no_caps =~ tr/A-Z/a-z/;
+ $element->{$direction} = $element->{$direction_no_caps};
+ }
+ if ($element->{'index_page'})
+ {
+ $element->{'id'} = "INDEX" . $index_nr;
+ $index_nr++;
+ }
+ }
+ my $node_nr = 1;
+ foreach my $node (@nodes_list)
+ {
+ $node->{'id'} = 'NOD' . $node_nr;
+ $node_nr++;
+ # debug check
+ print STDERR "Bug: level defined for node `$node->{'texi'}'\n" if (defined($node->{'level'}) and !$node->{'element_added'});
+ }
+
+ # Find cross manual links as explained on the texinfo mailing list
+ cross_manual_links(\%nodes, \%cross_reference_nodes);
+
+ foreach my $float (@floats)
+ {
+ $float->{'id'} = cross_manual_line (normalise_node($float->{'texi'}));
+ $float->{'style_id'} = cross_manual_line (normalise_space($float->{'style_texi'}));
+ my $float_style = { };
+ if (exists($floats{$float->{'style_id'}}))
+ {
+ $float_style = $floats{$float->{'style_id'}};
+ }
+ else
+ {
+ $floats{$float->{'style_id'}} = $float_style;
+ }
+ push @{$float_style->{'floats'}}, $float;
+ $float->{'absolute_nr'} = scalar(@{$float_style->{'floats'}});
+ my $up = get_top($float->{'element'});
+ if (!defined($float_style->{'current_chapter'}) or ($up->{'texi'} ne $float_style->{'current_chapter'}))
+ {
+ $float_style->{'current_chapter'} = $up->{'texi'};
+ $float_style->{'nr_in_chapter'} = 1;
+ }
+ else
+ {
+ $float_style->{'nr_in_chapter'}++;
+ }
+ if ($up->{'number'} ne '')
+ {
+ $float->{'chapter_nr'} = $up->{'number'};
+ $float->{'nr'} = $float->{'chapter_nr'} . $float_style->{'nr_in_chapter'};
+ }
+ else
+ {
+ $float->{'nr'} = $float->{'absolute_nr'};
+ }
+ }
+
+ if ($Texi2HTML::Config::NEW_CROSSREF_STYLE)
+ { # FIXME allready done for floats?
+ foreach my $key (keys(%nodes))
+ {
+ my $node = $nodes{$key};
+ next if ($node->{'external_node'} or $node->{'index_page'});
+ $node->{'id'} = node_to_id($node->{'cross_manual_target'});
+ }
+ }
+
+ # Find node file names
+ if ($Texi2HTML::Config::NODE_FILES)
+ {
+ my $top;
+ if ($node_top)
+ {
+ $top = $node_top;
+ }
+ elsif ($element_top->{'node_ref'})
+ {
+ $top = $element_top->{'node_ref'};
+ }
+ else
+ {
+ $top = $node_first;
+ }
+ if ($top)
+ {
+ my $file = "$Texi2HTML::Config::TOP_NODE_FILE.$Texi2HTML::Config::NODE_FILE_EXTENSION";
+ $top->{'file'} = $file if ($Texi2HTML::Config::SPLIT eq 'node');
+ $top->{'node_file'} = $file;
+ }
+ foreach my $key (keys(%nodes))
+ {
+ my $node = $nodes{$key};
+ my ($file, $node_file);
+ ($file, $node_file) = &$Texi2HTML::Config::node_file_name ($node);
+ $node->{'file'} = $file if (defined($file));
+ $node->{'node_file'} = $node_file if (defined($node_file));
+# next if ($node->{'external_node'} or $node->{'index_page'});
+# if (defined($Texi2HTML::Config::node_file_name))
+# {
+# ($node->{'file'}, $node->{'node_file'}) =
+# &$Texi2HTML::Config::node_file_name ($node);
+# }
+# else
+# {
+# next if (defined($node->{'file'}));
+# my $name = remove_texi($node->{'texi'});
+# $name =~ s/[^\w\.\-]/-/g;
+# my $file = "${name}.$Texi2HTML::Config::NODE_FILE_EXTENSION";
+# $node->{'file'} = $file if (($Texi2HTML::Config::SPLIT eq 'node') and ($Texi2HTML::Config::USE_NODES or $node->{'with_section'}));
+# $node->{'node_file'} = $file;
+# }
+ }
+ }
+ # find document nr and document file for sections and nodes.
+ # Split according to Texi2HTML::Config::SPLIT.
+ # find file and id for placed elements (anchors, index entries, headings)
+ if ($Texi2HTML::Config::SPLIT)
+ {
+ my $cut_section = $toplevel;
+ my $doc_nr = -1;
+ if ($Texi2HTML::Config::SPLIT eq 'section')
+ {
+ $cut_section = 2 if ($toplevel <= 2);
+ }
+ my $top_doc_nr;
+ my $prev_nr;
+ foreach my $element (@elements_list)
+ {
+ print STDERR "# Splitting ($Texi2HTML::Config::SPLIT) $element->{'texi'}\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ $doc_nr++ if (
+ ($Texi2HTML::Config::SPLIT eq 'node') or
+ (
+ (!$element->{'node'} or $element->{'element_added'}) and ($element->{'level'} <= $cut_section)
+ )
+ );
+ $doc_nr = 0 if ($doc_nr < 0); # happens if first elements are nodes
+ $element->{'doc_nr'} = $doc_nr;
+ if ($Texi2HTML::Config::NODE_FILES and ($Texi2HTML::Config::SPLIT eq 'node'))
+ {
+ my $node = get_node($element);
+ if ($node and $node->{'file'})
+ {
+ $element->{'file'} = $node->{'file'};
+ }
+ unless ($element->{'file'})
+ {
+ $element->{'file'} = "${docu_name}_$doc_nr.$docu_ext";
+ $element->{'doc_nr'} = $doc_nr;
+ }
+ }
+ else
+ {
+ $element->{'file'} = "${docu_name}_$doc_nr.$docu_ext";
+ my $is_top = 0;
+ if (defined($top_doc_nr))
+ {
+ if ($doc_nr eq $top_doc_nr)
+ {
+ $element->{'file'} = "$docu_top";
+ if ($element->{'level'} # this is an element below @top.
+ # It starts a new file.
+ or ($element->{'node'} and ($element ne $node_top) and (!defined($element->{'section_ref'}) or $element->{'section_ref'} ne $element_top))
+ )# this is a node not associated with top
+ {
+ $doc_nr++;
+ $element->{'doc_nr'} = $doc_nr;
+ $element->{'file'} = "${docu_name}_$doc_nr.$docu_ext";
+ }
+ }
+ }
+ elsif ($element eq $element_top or (defined($element->{'section_ref'}) and $element->{'section_ref'} eq $element_top) or (defined($element->{'node_ref'}) and !$element->{'node_ref'}->{'element_added'} and $element->{'node_ref'} eq $element_top))
+ { # the top element
+ $is_top = 1;
+ $element->{'file'} = "$docu_top";
+ # if there is a previous element, we force it to be in
+ # another file than top
+ $doc_nr++ if (defined($prev_nr) and $doc_nr == $prev_nr);
+ $top_doc_nr = $doc_nr;
+ $element->{'doc_nr'} = $doc_nr;
+ }
+ if (defined($Texi2HTML::Config::element_file_name))
+ {
+ $element->{'file'} =
+ &$Texi2HTML::Config::element_file_name ($element, $is_top, $docu_name);
+ }
+ }
+ add_file($element->{'file'});
+ $prev_nr = $doc_nr;
+ foreach my $place(@{$element->{'place'}})
+ {
+ $place->{'file'} = $element->{'file'};
+ $place->{'id'} = $element->{'id'} unless defined($place->{'id'});
+ }
+ if ($element->{'nodes'})
+ {
+ foreach my $node (@{$element->{'nodes'}})
+ {
+ $node->{'doc_nr'} = $element->{'doc_nr'};
+ $node->{'file'} = $element->{'file'};
+ }
+ }
+ elsif ($element->{'node_ref'} and !$element->{'node_ref'}->{'element_added'})
+ {
+ $element->{'node_ref'}->{'doc_nr'} = $element->{'doc_nr'} ;
+ $element->{'node_ref'}->{'file'} = $element->{'file'};
+ }
+ }
+ }
+ else
+ {
+ add_file($docu_doc);
+ foreach my $element(@elements_list)
+ {
+ #die "$ERROR monolithic file and a node have the same file name $docu_doc\n" if ($Texi2HTML::Config::NODE_FILES and $files{$docu_doc});
+ $element->{'file'} = "$docu_doc";
+ $element->{'doc_nr'} = 0;
+ foreach my $place(@{$element->{'place'}})
+ {
+ $place->{'file'} = "$element->{'file'}";
+ $place->{'id'} = $element->{'id'} unless defined($place->{'id'});
+ }
+ }
+ foreach my $node(@nodes_list)
+ {
+ $node->{'file'} = "$docu_doc";
+ $node->{'doc_nr'} = 0;
+ }
+ }
+ # correct the id and file for the things placed in footnotes
+ foreach my $place(@{$footnote_element->{'place'}})
+ {
+ $place->{'file'} = $footnote_element->{'file'};
+ $place->{'id'} = $footnote_element->{'id'} unless defined($place->{'id'});
+ }
+ foreach my $file (keys(%files))
+ {
+ last unless ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ print STDERR "$file: $files{$file}->{'counter'}\n";
+ }
+ foreach my $element ((@elements_list, $footnote_element))
+ {
+ last unless ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ my $is_toplevel = 'not top';
+ $is_toplevel = 'top' if ($element->{'toplevel'});
+ print STDERR "$element ";
+ if ($element->{'index_page'})
+ {
+ print STDERR "index($element->{'id'}, $is_toplevel, doc_nr $element->{'doc_nr'}($element->{'file'})): $element->{'texi'}\n";
+ }
+ elsif ($element->{'node'})
+ {
+ my $added = '';
+ $added = 'added, ' if ($element->{'element_added'});
+ print STDERR "node($element->{'id'}, toc_level $element->{'toc_level'}, $is_toplevel, ${added}doc_nr $element->{'doc_nr'}($element->{'file'})) $element->{'texi'}:\n";
+ print STDERR " section_ref: $element->{'section_ref'}->{'texi'}\n" if (defined($element->{'section_ref'}));
+ }
+ elsif ($element->{'footnote'})
+ {
+ print STDERR "footnotes($element->{'id'}, file $element->{'file'})\n";
+ }
+ else
+ {
+ my $number = "UNNUMBERED";
+ $number = $element->{'number'} if ($element->{'number'});
+ print STDERR "$number ($element->{'id'}, $is_toplevel, level $element->{'level'}-$element->{'toc_level'}, doc_nr $element->{'doc_nr'}($element->{'file'})) $element->{'texi'}:\n";
+ print STDERR " node_ref: $element->{'node_ref'}->{'texi'}\n" if (defined($element->{'node_ref'}));
+ }
+
+ if (!$element->{'footnote'})
+ {
+ if (!defined($files{$element->{'file'}}))
+ {
+ die "Bug: files{\$element->{'file'}} undef element $element->{'texi'}, file $element->{'file'}.";
+ }
+ print STDERR " file: $element->{'file'} $files{$element->{'file'}}, counter $files{$element->{'file'}}->{'counter'}\n";
+ }
+ print STDERR " TOP($toplevel) " if ($element->{'top'});
+ print STDERR " u: $element->{'up'}->{'texi'}\n" if (defined($element->{'up'}));
+ print STDERR " ch: $element->{'child'}->{'texi'}\n" if (defined($element->{'child'}));
+ print STDERR " fb: $element->{'fastback'}->{'texi'}\n" if (defined($element->{'fastback'}));
+ print STDERR " b: $element->{'back'}->{'texi'}\n" if (defined($element->{'back'}));
+ print STDERR " p: $element->{'prev'}->{'texi'}\n" if (defined($element->{'prev'}));
+ print STDERR " n: $element->{'next'}->{'texi'}\n" if (defined($element->{'next'}));
+ print STDERR " n_u: $element->{'nodeup'}->{'texi'}\n" if (defined($element->{'nodeup'}));
+ print STDERR " f: $element->{'forward'}->{'texi'}\n" if (defined($element->{'forward'}));
+ print STDERR " follow: $element->{'following'}->{'texi'}\n" if (defined($element->{'following'}));
+ print STDERR " m_p: $element->{'menu_prev'}->{'texi'}\n" if (defined($element->{'menu_prev'}));
+ print STDERR " m_n: $element->{'menu_next'}->{'texi'}\n" if (defined($element->{'menu_next'}));
+ print STDERR " m_u: $element->{'menu_up'}->{'texi'}\n" if (defined($element->{'menu_up'}));
+ print STDERR " m_ch: $element->{'menu_child'}->{'texi'}\n" if (defined($element->{'menu_child'}));
+ print STDERR " u_e: $element->{'element_up'}->{'texi'}\n" if (defined($element->{'element_up'}));
+ print STDERR " n_e: $element->{'element_next'}->{'texi'}\n" if (defined($element->{'element_next'}));
+ print STDERR " ff: $element->{'fastforward'}->{'texi'}\n" if (defined($element->{'fastforward'}));
+ if (defined($element->{'menu_up_hash'}))
+ {
+ print STDERR " parent nodes:\n";
+ foreach my $menu_up (keys%{$element->{'menu_up_hash'}})
+ {
+ print STDERR " $menu_up ($element->{'menu_up_hash'}->{$menu_up})\n";
+ }
+ }
+ if (defined($element->{'nodes'}))
+ {
+ print STDERR " nodes: $element->{'nodes'} (@{$element->{'nodes'}})\n";
+ foreach my $node (@{$element->{'nodes'}})
+ {
+ my $beginning = " ";
+ $beginning = " *" if ($node->{'with_section'});
+ my $file = $node->{'file'};
+ $file = "file undef" if (! defined($node->{'file'}));
+ print STDERR "${beginning}$node->{'texi'} $file\n";
+ }
+ }
+ print STDERR " places: $element->{'place'}\n";
+ foreach my $place(@{$element->{'place'}})
+ {
+ if (!$place->{'entry'} and !$place->{'float'} and !$place->{'texi'})
+ {
+ print STDERR "BUG: unknown placed stuff ========\n";
+ foreach my $key (keys(%$place))
+ {
+ print STDERR "$key: $place->{$key}\n";
+ }
+ print STDERR "==================================\n";
+ }
+ elsif ($place->{'entry'})
+ {
+ print STDERR " index($place): $place->{'entry'}\n";
+ }
+ elsif ($place->{'anchor'})
+ {
+ print STDERR " anchor: $place->{'texi'}\n";
+ }
+ elsif ($place->{'float'})
+ {
+ if (defined($place->{'texi'}))
+ {
+ print STDERR " float($place): $place->{'texi'}\n";
+ }
+ else
+ {
+ print STDERR " float($place): NO LABEL\n";
+ }
+ }
+ else
+ {
+ print STDERR " heading: $place->{'texi'}\n";
+ }
+ }
+ if ($element->{'indices'})
+ {
+ print STDERR " indices: $element->{'indices'}\n";
+ foreach my $index(@{$element->{'indices'}})
+ {
+ print STDERR " $index: ";
+ foreach my $page (@$index)
+ {
+ print STDERR "'$page->{'element'}->{'texi'}'($page->{'name'}): $page->{'page'} ";
+ }
+ print STDERR "\n";
+ }
+ }
+ }
+}
+
+sub add_file($)
+{
+ my $file = shift;
+ if ($files{$file})
+ {
+ $files{$file}->{'counter'}++;
+ }
+ else
+ {
+ $files{$file} = {
+ #'type' => 'section',
+ 'counter' => 1
+ };
+ }
+}
+
+# find parent element which is a top element, or a node within the top section
+sub get_top($)
+{
+ my $element = shift;
+ my $up = $element;
+ while (!$up->{'toplevel'} and !$up->{'top'})
+ {
+ $up = $up->{'element_up'};
+ if (!defined($up))
+ {
+ # If there is no section, it is normal not to have toplevel element,
+ # and it is also the case if there is a low level element before
+ # a top level element
+ print STDERR "$WARN no toplevel for $element->{'texi'} (could be normal)\n" if (@sections_list);
+ return undef;
+ }
+ }
+ return $up;
+}
+
+sub get_node($)
+{
+ my $element = shift;
+ return undef if (!defined($element));
+ return $element if ($element->{'node'});
+ return $element->{'node_ref'} if ($element->{'node_ref'} and !$element->{'node_ref'}->{'element_added'});
+ return $element;
+}
+# get the html names from the texi for all elements
+sub do_names()
+{
+ # for nodes and anchors we haven't any state defined
+ # This seems right, however, as we don't want @refs or @footnotes
+ # or @anchors within nodes, section commands or anchors.
+ foreach my $node (%nodes)
+ {
+ next if ($nodes{$node}->{'index_page'}); # some nodes are index pages.
+ $nodes{$node}->{'text'} = substitute_line ($nodes{$node}->{'texi'});
+ $nodes{$node}->{'name'} = $nodes{$node}->{'text'};
+ $nodes{$node}->{'no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($nodes{$node}->{'texi'}));
+ $nodes{$node}->{'unformatted'} = unformatted_text (undef, $nodes{$node}->{'texi'});
+ # FIXME : what to do if $nodes{$node}->{'external_node'} and
+ # $nodes{$node}->{'seen'}
+ }
+ foreach my $number (keys(%sections))
+ {
+ my $section = $sections{$number};
+ $section->{'name'} = substitute_line ($section->{'texi'});
+ $section->{'text'} = $section->{'number'} . " " . $section->{'name'};
+ $section->{'text'} =~ s/^\s*//;
+ $section->{'no_texi'} = &$Texi2HTML::Config::protect_text($section->{'number'} . " " .remove_texi($section->{'texi'}));
+ $section->{'no_texi'} =~ s/^\s*//;
+ $section->{'unformatted'} = &$Texi2HTML::Config::protect_text($section->{'number'}) . " " .unformatted_text(undef,$section->{'texi'});
+ $section->{'unformatted'} =~ s/^\s*//;
+ }
+ my $tocnr = 1;
+ foreach my $element (@elements_list)
+ {
+ if (!$element->{'top'} and !$element->{'index_page'})
+ {
+ $element->{'tocid'} = 'TOC' . $tocnr;
+ $tocnr++;
+ }
+ next if (defined($element->{'text'}));
+ if ($element->{'index_page'})
+ {
+ my $page = $element->{'page'};
+ my $sec_name = $element->{'element_ref'}->{'text'};
+ $element->{'text'} = ($page->{First} ne $page->{Last} ?
+ "$sec_name: $page->{First} -- $page->{Last}" :
+ "$sec_name: $page->{First}");
+ $sec_name = $element->{'element_ref'}->{'no_texi'};
+ $element->{'no_texi'} = &$Texi2HTML::Config::protect_text($page->{First} ne $page->{Last} ?
+ "$sec_name: $page->{First} -- $page->{Last}" :
+ "$sec_name: $page->{First}");
+ $sec_name = $element->{'element_ref'}->{'unformatted'};
+ $element->{'unformatted'} = $page->{First} ne $page->{Last} ?
+ "$sec_name: " . &$Texi2HTML::Config::protect_text("$page->{First} -- $page->{Last}") :
+ "$sec_name: " . &$Texi2HTML::Config::protect_text("$page->{First}");
+ }
+ }
+}
+
+@{$Texi2HTML::TOC_LINES} = (); # table of contents
+@{$Texi2HTML::OVERVIEW} = (); # short table of contents
+
+
+
+#+++############################################################################
+# #
+# Stuff related to Index generation #
+# #
+#---############################################################################
+
+# FIXME what to do with index entries appearing in @copying
+# @documentdescription and @titlepage
+sub enter_index_entry($$$$$$)
+{
+ my $prefix = shift;
+ my $line_nr = shift;
+ my $key = shift;
+ my $place = shift;
+ my $element = shift;
+ my $use_section_id = shift;
+ unless (exists ($index_properties->{$prefix}))
+ {
+ echo_error ("Undefined index command: ${prefix}index", $line_nr);
+ #warn "$ERROR Undefined index command: ${prefix}index\n";
+ return 0;
+ }
+ if (!exists($element->{'tag'}) and !$element->{'footnote'})
+ {
+ echo_warn ("Index entry before document: \@${prefix}index $key", $line_nr);
+ }
+ $key =~ s/\s+$//;
+ $key =~ s/^\s*//;
+ my $entry = $key;
+ # The $key is mostly usefull for alphabetical sorting
+ $key = remove_texi($key);
+ return if ($key =~ /^\s*$/);
+ while (exists $index->{$prefix}->{$key})
+ {
+ $key .= ' ';
+ }
+ my $id = '';
+ unless ($use_section_id)
+ {
+ $id = 'IDX' . ++$idx_num;
+ }
+ $index->{$prefix}->{$key}->{'entry'} = $entry;
+ $index->{$prefix}->{$key}->{'element'} = $element;
+ $index->{$prefix}->{$key}->{'label'} = $id;
+ $index->{$prefix}->{$key}->{'prefix'} = $prefix;
+ push @$place, $index->{$prefix}->{$key};
+ print STDERR "# enter ${prefix}index '$key' with id $id ($index->{$prefix}->{$key})\n"
+ if ($T2H_DEBUG & $DEBUG_INDEX);
+ push @index_labels, $index->{$prefix}->{$key};
+ return $index->{$prefix}->{$key};
+}
+
+# returns prefix of @?index command associated with 2 letters prefix name
+# for example returns 'c' for 'cp'
+sub index_name2prefix
+{
+ my $name = shift;
+ my $prefix;
+
+ for $prefix (keys %$index_properties)
+ {
+ return $prefix if ($index_properties->{$prefix}->{'name'} eq $name);
+ }
+ return undef;
+}
+
+# get all the entries (for all the prefixes) in the $normal and $code
+# references, formatted with @code{code } if it is a $code entry.
+sub get_index_entries($$)
+{
+ my $normal = shift;
+ my $code = shift;
+ my $entries = {};
+ foreach my $prefix (keys %$normal)
+ {
+ for my $key (keys %{$index->{$prefix}})
+ {
+ $entries->{$key} = $index->{$prefix}->{$key};
+ }
+ }
+
+ if (defined($code))
+ {
+ foreach my $prefix (keys %$code)
+ {
+ unless (exists $normal->{$prefix})
+ {
+ foreach my $key (keys %{$index->{$prefix}})
+ {
+ $entries->{$key} = $index->{$prefix}->{$key};
+ # use @code for code style index entry
+ $entries->{$key}->{'entry'} = "\@code{$entries->{$key}->{entry}}";
+ }
+ }
+ }
+ }
+ return $entries;
+}
+
+# sort according to cmp if both $a and $b are alphabetical or non alphabetical,
+# otherwise the alphabetical is ranked first
+sub by_alpha
+{
+ if ($a =~ /^[A-Za-z]/)
+ {
+ if ($b =~ /^[A-Za-z]/)
+ {
+ return lc($a) cmp lc($b);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ elsif ($b =~ /^[A-Za-z]/)
+ {
+ return -1;
+ }
+ else
+ {
+ return lc($a) cmp lc($b);
+ }
+}
+
+# returns an array of index entries pages splitted by letters
+# each page has the following members:
+# {First} first letter on that page
+# {Last} last letter on that page
+# {Letters} ref on an array with all the letters for that page
+# {EntriesByLetter} ref on a hash. Each key is a letter, with value
+# a ref on arrays of index entries begining with this letter
+sub get_index_pages($)
+{
+ my $entries = shift;
+ my (@Letters);
+ my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
+ my @keys = sort by_alpha keys %$entries;
+
+ # each index entry is placed according to its first letter in
+ # EntriesByLetter
+ for my $key (@keys)
+ {
+ push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
+ }
+ @Letters = sort by_alpha keys %$EntriesByLetter;
+ $Texi2HTML::Config::SPLIT_INDEX = 0 unless $Texi2HTML::Config::SPLIT;
+
+ if ($Texi2HTML::Config::SPLIT_INDEX and $Texi2HTML::Config::SPLIT_INDEX =~ /^\d+$/)
+ {
+ my $i = 0;
+ my ($prev_letter);
+ for my $letter (@Letters)
+ {
+ if ($i > $Texi2HTML::Config::SPLIT_INDEX)
+ {
+ $page->{Last} = $prev_letter;
+ push @$Pages, $page;
+ $i=0;
+ }
+ if ($i == 0)
+ {
+ $page = {};
+ $page->{Letters} = [];
+ $page->{EntriesByLetter} = {};
+ $page->{First} = $letter;
+ }
+ push @{$page->{Letters}}, $letter;
+ $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
+ $i += scalar(@{$EntriesByLetter->{$letter}});
+ $prev_letter = $letter;
+ }
+ $page->{Last} = $Letters[$#Letters];
+ push @$Pages, $page;
+ }
+ else
+ {
+ warn "$WARN Bad Texi2HTML::Config::SPLIT_INDEX: $Texi2HTML::Config::SPLIT_INDEX\n" if ($Texi2HTML::Config::SPLIT_INDEX);
+ $page->{First} = $Letters[0];
+ $page->{Last} = $Letters[$#Letters];
+ $page->{Letters} = \@Letters;
+ $page->{EntriesByLetter} = $EntriesByLetter;
+ push @$Pages, $page;
+ return $Pages;
+ }
+ return $Pages;
+}
+
+sub get_index($;$)
+{
+ my $name = shift;
+ my $line_nr = shift;
+ return (@{$indices{$name}}) if ($indices{$name});
+ my $prefix = index_name2prefix($name);
+ unless ($prefix)
+ {
+ echo_error ("Bad index name: $name", $line_nr);
+ #warn "$ERROR Bad index name: $name\n";
+ return;
+ }
+ if ($index_properties->{$prefix}->{code})
+ {
+ $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
+ }
+ else
+ {
+ $index_properties->{$prefix}->{from}->{$prefix}= 1;
+ }
+
+ my $Entries = get_index_entries($index_properties->{$prefix}->{from},
+ $index_properties->{$prefix}->{from_code});
+ return unless %$Entries;
+ my $Pages = get_index_pages($Entries);
+ $indices{$name} = [ $Pages, $Entries ];
+ return ($Pages, $Entries);
+}
+
+my @foot_lines = (); # footnotes
+my $copying_comment = ''; # comment constructed from text between
+ # @copying and @end copying with licence
+my $from_encoding; # texinfo file encoding
+my $to_encoding; # out file encoding
+my %acronyms_like = (); # acronyms or similar commands associated texts
+ # the key are the commands, the values are
+ # hash references associating shorthands to
+ # texts.
+
+sub initialise_state($)
+{
+ my $state = shift;
+ $state->{'preformatted'} = 0 unless exists($state->{'preformatted'});
+ $state->{'code_style'} = 0 unless exists($state->{'code_style'});
+ $state->{'keep_texi'} = 0 unless exists($state->{'keep_texi'});
+ $state->{'keep_nr'} = 0 unless exists($state->{'keep_nr'});
+ $state->{'detailmenu'} = 0 unless exists($state->{'detailmenu'}); # number of opened detailed menus
+ $state->{'format_stack'} = [ {'format' => "noformat"} ] unless exists($state->{'format_stack'});
+ $state->{'paragraph_style'} = [ '' ] unless exists($state->{'paragraph_style'});
+ $state->{'preformatted_stack'} = [ '' ] unless exists($state->{'preformatted_stack'});
+ $state->{'menu'} = 0 unless exists($state->{'menu'});
+ $state->{'style_stack'} = [] unless exists($state->{'style_stack'});
+ $state->{'quotation_stack'} = [] unless exists($state->{'quotation_stack'});
+ # if there is no $state->{'element'} the first element is used
+ $state->{'element'} = $elements_list[0] unless (exists($state->{'element'}) and !$state->{'element'}->{'before_anything'});
+}
+
+sub pass_text()
+{
+ my %state;
+ initialise_state (\%state);
+ my @stack;
+ my $text;
+ my $doc_nr;
+ my $in_doc = 0;
+ my $element;
+ my @text =();
+ my @section_lines = ();
+ my @head_lines = ();
+ my $one_section = 1 if (@elements_list == 1);
+
+ if (@elements_list == 0)
+ {
+ warn "$WARN empty document\n";
+ exit (0);
+ }
+
+ # We set titlefont only if the titlefont appeared in the top element
+ if (defined($element_top->{'titlefont'}))
+ {
+ $element_top->{'has_heading'} = 1;
+ $value{'_titlefont'} = $element_top->{'titlefont'};
+ }
+
+ # prepare %Texi2HTML::THISDOC
+# $Texi2HTML::THISDOC{'settitle_texi'} = $value{'_settitle'};
+ $Texi2HTML::THISDOC{'fulltitle_texi'} = '';
+ $Texi2HTML::THISDOC{'title_texi'} = '';
+ foreach my $possible_fulltitle (('_title', '_settitle', '_shorttitlepage', '_titlefont'))
+ {
+ if ($value{$possible_fulltitle} ne '')
+ {
+ $Texi2HTML::THISDOC{'fulltitle_texi'} = $value{$possible_fulltitle};
+ last;
+ }
+ }
+ foreach my $possible_title_texi ($value{'_settitle'}, $Texi2HTML::THISDOC{'fulltitle_texi'})
+ {
+ if ($possible_title_texi ne '')
+ {
+ $Texi2HTML::THISDOC{'title_texi'} = $possible_title_texi;
+ last;
+ }
+ }
+# $Texi2HTML::THISDOC{'fulltitle_texi'} = $value{'_title'} || $value{'_settitle'} || $value{'_shorttitlepage'} || $value{'_titlefont'};
+# $Texi2HTML::THISDOC{'title_texi'} = $value{'_title'} || $value{'_settitle'} || $value{'_shorttitlepage'} || $value{'_titlefont'};
+ foreach my $texi_cmd (('shorttitlepage', 'settitle', 'author',
+ 'titlefont', 'subtitle', 'shorttitle'))
+ {
+ $Texi2HTML::THISDOC{$texi_cmd . '_texi'} = $value{'_' . $texi_cmd};
+ }
+ foreach my $doc_thing (('shorttitlepage', 'settitle', 'author',
+ 'titlefont', 'subtitle', 'shorttitle', 'fulltitle', 'title'))
+ {
+ my $thing_texi = $Texi2HTML::THISDOC{$doc_thing . '_texi'};
+ $Texi2HTML::THISDOC{$doc_thing} = substitute_line($thing_texi);
+ $Texi2HTML::THISDOC{$doc_thing . '_no_texi'} =
+ &$Texi2HTML::Config::protect_text(remove_texi($thing_texi));
+ $Texi2HTML::THISDOC{$doc_thing . '_unformatted'} =
+ unformatted_text(undef, $thing_texi);
+ }
+# $Texi2HTML::THISDOC{'shorttitlepage_texi'} = $value{'_shorttitlepage'};
+# $Texi2HTML::THISDOC{'fulltitle'} = substitute_line($value{'_title'}) || substitute_line($value{'_settitle'}) || substitute_line($value{'_shorttitlepage'}) || substitute_line($value{'_titlefont'});
+# $Texi2HTML::THISDOC{'title'} = substitute_line($value{'_settitle'}) || $Texi2HTML::THISDOC{'fulltitle'};
+# $Texi2HTML::THISDOC{'shorttitle'} = substitute_line($value{'_shorttitle'});
+
+ # find Top name
+ my $element_top_text = '';
+ my $top_no_texi = '';
+ my $top_unformatted = '';
+ my $top_name;
+ if ($element_top and $element_top->{'text'} and (!$node_top or ($element_top ne $node_top)))
+ {
+ $element_top_text = $element_top->{'text'};
+ $top_no_texi = $element_top->{'no_texi'};
+ $top_unformatted = $element_top->{'unformatted'};
+ }
+ foreach my $possible_top_name ($Texi2HTML::Config::TOP_HEADING,
+ $element_top_text, $Texi2HTML::THISDOC{'title'},
+ $Texi2HTML::THISDOC{'shorttitle'}, &$I('Top'))
+ {
+ if (defined($possible_top_name) and $possible_top_name ne '')
+ {
+ $top_name = $possible_top_name;
+ last;
+ }
+ }
+ foreach my $possible_top_no_texi ($Texi2HTML::Config::TOP_HEADING,
+ $top_no_texi, $Texi2HTML::THISDOC{'title_no_texi'},
+ $Texi2HTML::THISDOC{'shorttitle_no_texi'},
+ &$I('Top',{},{'remove_texi' => 1, 'no_protection' => 1}))
+ {
+ if (defined($possible_top_no_texi) and $possible_top_no_texi ne '')
+ {
+ $top_no_texi = $possible_top_no_texi;
+ last;
+ }
+ }
+
+ foreach my $possible_top_unformatted ($top_unformatted,
+ $Texi2HTML::THISDOC{'title_unformatted'},
+ $Texi2HTML::THISDOC{'shorttitle_unformatted'},
+ &$I('Top',{}, {'unformatted' => 1}))
+ {
+ if (defined($possible_top_unformatted) and $possible_top_unformatted ne '')
+ {
+ $top_unformatted = $possible_top_unformatted;
+ last;
+ }
+ }
+
+
+# my $top_name = $Texi2HTML::Config::TOP_HEADING || $element_top_text || $Texi2HTML::THISDOC{'title'} || $Texi2HTML::THISDOC{'shorttitle'} || &$I('Top');
+
+ if ($Texi2HTML::THISDOC{'fulltitle_texi'} eq '')
+ {
+ $Texi2HTML::THISDOC{'fulltitle_texi'} = &$I('Untitled Document',{},
+ {'keep_texi' => 1});
+ }
+ $Texi2HTML::THISDOC{'title_texi'} = $Texi2HTML::THISDOC{'settitle_texi'};
+ $Texi2HTML::THISDOC{'title_texi'} = $Texi2HTML::THISDOC{'fulltitle_texi'}
+ if ($Texi2HTML::THISDOC{'title_texi'} eq '');
+
+ foreach my $doc_thing (('fulltitle', 'title'))
+ {
+ my $thing_texi = $Texi2HTML::THISDOC{$doc_thing . '_texi'};
+ $Texi2HTML::THISDOC{$doc_thing} = substitute_line($thing_texi);
+ $Texi2HTML::THISDOC{$doc_thing . '_no_texi'} =
+ &$Texi2HTML::Config::protect_text(remove_texi($thing_texi));
+ $Texi2HTML::THISDOC{$doc_thing . '_unformatted'} =
+ unformatted_text(undef, $thing_texi);
+ }
+# $Texi2HTML::THISDOC{'fulltitle'} = $Texi2HTML::THISDOC{'fulltitle'} || &$I('Untitled Document') ;
+# $Texi2HTML::THISDOC{'title'} = $Texi2HTML::THISDOC{'settitle'} || $Texi2HTML::THISDOC{'fulltitle'};
+# $Texi2HTML::THISDOC{'author'} = substitute_line($value{'_author'});
+# $Texi2HTML::THISDOC{'titlefont'} = substitute_line($value{'_titlefont'});
+# $Texi2HTML::THISDOC{'subtitle'} = substitute_line($value{'_subtitle'});
+
+# $Texi2HTML::THISDOC{'title_unformatted'} = unformatted_text(undef, $Texi2HTML::THISDOC{'title_texi'});
+# $Texi2HTML::THISDOC{'shorttitle_unformatted'} = unformatted_text(undef, $value{'_shorttitle'});
+# $Texi2HTML::THISDOC{'title_no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($value{'_title'})) || &$Texi2HTML::Config::protect_text(remove_texi($value{'_settitle'})) || &$Texi2HTML::Config::protect_text(remove_texi($value{'_shorttitlepage'})) || &$Texi2HTML::Config::protect_text(remove_texi($value{'_titlefont'}));
+# $Texi2HTML::THISDOC{'shorttitle_no_texi'} = &$Texi2HTML::Config::protect_text(remove_texi($value{'_shorttitle'}));
+
+# my $top_no_texi = '';
+# my $top_unformatted = '';
+# if ($element_top and $element_top->{'no_texi'} and (!$node_top or ($element_top ne $node_top)))
+# {
+# $top_no_texi = $element_top->{'no_texi'};
+# $top_unformatted = $element_top->{'unformatted'};
+# }
+
+# $top_no_texi = $Texi2HTML::Config::TOP_HEADING || $top_no_texi || $Texi2HTML::THISDOC{'title_no_texi'} || $Texi2HTML::THISDOC{'shorttitle_no_texi'} || &$I('Top',{}, {'remove_texi' => 1, 'no_protection' => 1});
+# $top_unformatted = $top_unformatted || $Texi2HTML::THISDOC{'title_unformatted'} || $Texi2HTML::THISDOC{'shorttitle_unformatted'} || &$I('Top',{}, {'unformatted' => 1});
+# $Texi2HTML::THISDOC{'title_unformatted'} = $Texi2HTML::THISDOC{'title_unformatted'} || &$I('Untitled Document',{}, {'unformatted' => 1});
+# $Texi2HTML::THISDOC{'title_no_texi'} = $Texi2HTML::THISDOC{'title_no_texi'} || &$I('Untitled Document',{}, {'remove_texi' => 1, 'no_protection' => 1});
+
+ for my $key (keys %Texi2HTML::THISDOC)
+ {
+ next if (ref($Texi2HTML::THISDOC{$key}));
+print STDERR "!!$key\n" if (!defined($Texi2HTML::THISDOC{$key}));
+ $Texi2HTML::THISDOC{$key} =~ s/\s*$//;
+ }
+ $Texi2HTML::THISDOC{'program'} = $THISPROG;
+ $Texi2HTML::THISDOC{'program_homepage'} = $T2H_HOMEPAGE;
+ $Texi2HTML::THISDOC{'program_authors'} = $T2H_AUTHORS;
+ $Texi2HTML::THISDOC{'user'} = $T2H_USER;
+# $Texi2HTML::THISDOC{'documentdescription'} = $documentdescription;
+ $Texi2HTML::THISDOC{'copying'} = $copying_comment;
+ $Texi2HTML::THISDOC{'toc_file'} = '';
+ $Texi2HTML::THISDOC{'toc_file'} = $docu_toc if ($Texi2HTML::Config::SPLIT);
+ $Texi2HTML::THISDOC{'file_base_name'} = $docu_name;
+ $Texi2HTML::THISDOC{'destination_directory'} = $docu_rdir;
+ $Texi2HTML::THISDOC{'authors'} = [] if (!defined($Texi2HTML::THISDOC{'authors'}));
+ $Texi2HTML::THISDOC{'subtitles'} = [] if (!defined($Texi2HTML::THISDOC{'subtitles'}));
+ $Texi2HTML::THISDOC{'titles'} = [] if (!defined($Texi2HTML::THISDOC{'titles'}));
+ foreach my $element (('authors', 'subtitles', 'titles'))
+ {
+ my $i;
+ for ($i = 0; $i < $#{$Texi2HTML::THISDOC{$element}} + 1; $i++)
+ {
+ chomp ($Texi2HTML::THISDOC{$element}->[$i]);
+ $Texi2HTML::THISDOC{$element}->[$i] = substitute_line($Texi2HTML::THISDOC{$element}->[$i]);
+ #print STDERR "$element:$i: $Texi2HTML::THISDOC{$element}->[$i]\n";
+ }
+ }
+ # prepare TOC, OVERVIEW
+ if ($Texi2HTML::Config::SPLIT)
+ {
+ $Texi2HTML::HREF{'Contents'} = $docu_toc.'#SEC_Contents' if @{$Texi2HTML::TOC_LINES};
+ $Texi2HTML::HREF{'Overview'} = $docu_stoc.'#SEC_Overview' if @{$Texi2HTML::OVERVIEW};
+ $Texi2HTML::HREF{'Footnotes'} = $docu_foot. '#SEC_Foot';
+ $Texi2HTML::HREF{'About'} = $docu_about . '#SEC_About' unless $one_section;
+ }
+ else
+ {
+ $Texi2HTML::HREF{'Contents'} = '#SEC_Contents' if @{$Texi2HTML::TOC_LINES};
+ $Texi2HTML::HREF{'Overview'} = '#SEC_Overview' if @{$Texi2HTML::OVERVIEW};
+ $Texi2HTML::HREF{'Footnotes'} = '#SEC_Foot';
+ $Texi2HTML::HREF{'About'} = '#SEC_About' unless $one_section;
+ }
+
+ %Texi2HTML::NAME =
+ (
+ 'First', $element_first->{'text'},
+ 'Last', $element_last->{'text'},
+ 'About', &$I('About This Document'),
+ 'Contents', &$I('Table of Contents'),
+ 'Overview', &$I('Short Table of Contents'),
+ 'Top', $top_name,
+ 'Footnotes', &$I('Footnotes'),
+ );
+ $Texi2HTML::NAME{'Index'} = $element_chapter_index->{'text'} if (defined($element_chapter_index));
+ $Texi2HTML::NAME{'Index'} = $Texi2HTML::Config::INDEX_CHAPTER if ($Texi2HTML::Config::INDEX_CHAPTER ne '');
+
+ %Texi2HTML::NO_TEXI =
+ (
+ 'First', $element_first->{'no_texi'},
+ 'Last', $element_last->{'no_texi'},
+#FIXME this is not really NO_TEXI as there may be some formatting expanded
+# in &$I, using substitute_line
+ 'About', &$I('About This Document', {}, {'remove_texi' => 1, 'no_protection' => 1} ),
+ 'Contents', &$I('Table of Contents', {}, {'remove_texi' => 1, 'no_protection' => 1} ),
+ 'Overview', &$I('Short Table of Contents', {}, {'remove_texi' => 1, 'no_protection' => 1} ),
+ 'Top', $top_no_texi,
+ 'Footnotes', &$I('Footnotes', {}, {'remove_texi' => 1, 'no_protection' => 1} ),
+ );
+ $Texi2HTML::NO_TEXI{'Index'} = $element_chapter_index->{'no_texi'} if (defined($element_chapter_index));
+ %Texi2HTML::UNFORMATTED =
+ (
+ 'First', $element_first->{'unformatted'},
+ 'Last', $element_last->{'unformatted'},
+#FIXME this is not really UNFORMATTED as there may be some formatting expanded
+# in &$I, using substitute_line
+ 'About', &$I('About This Document', {}, {'unformatted' => 1}),
+ 'Contents', &$I('Table of Contents',{}, {'unformatted' => 1}),
+ 'Overview', &$I('Short Table of Contents', {}, {'unformatted' => 1}),
+ 'Top', $top_unformatted,
+ 'Footnotes', &$I('Footnotes', {},{'unformatted' => 1}),
+ );
+ $Texi2HTML::UNFORMATTED{'Index'} = $element_chapter_index->{'unformatted'} if (defined($element_chapter_index));
+ $Texi2HTML::TITLEPAGE = '';
+ $Texi2HTML::TITLEPAGE = substitute_text({}, @{$region_lines{'titlepage'}})
+ if (@{$region_lines{'titlepage'}});
+ &$Texi2HTML::Config::titlepage();
+
+ $to_encoding = &$Texi2HTML::Config::init_out();
+
+ ############################################################################
+ # print frame and frame toc file
+ #
+ if ( $Texi2HTML::Config::FRAMES )
+ {
+ #open(FILE, "> $docu_frame_file")
+ # || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
+ my $FH = open_out($docu_frame_file);
+ print STDERR "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+ &$Texi2HTML::Config::print_frame($FH, $docu_toc_frame_file, $docu_top_file);
+ close_out($FH, $docu_frame_file);
+
+ #open(FILE, "> $docu_toc_frame_file")
+ # || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
+ $FH = open_out($docu_toc_frame_file);
+ print STDERR "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+ #&$Texi2HTML::Config::print_toc_frame(\*FILE, $Texi2HTML::OVERVIEW);
+ &$Texi2HTML::Config::print_toc_frame($FH, $Texi2HTML::OVERVIEW);
+ #close(FILE);
+ close_out($FH, $docu_toc_frame_file);
+ }
+
+ ############################################################################
+ #
+ #
+
+ my $FH;
+ my $index_pages;
+ my $index_pages_nr;
+ my $index_nr = 0;
+ my $line_nr;
+ my $first_section = 0; # 1 if it is the first section of a page
+ while (@doc_lines)
+ {
+ unless ($index_pages)
+ { # not in a index split over sections
+ $_ = shift @doc_lines;
+ my $chomped_line = $_;
+ if (!chomp($chomped_line) and @doc_lines)
+ { # if the line has no end of line it is concatenated with the next
+ $doc_lines[0] = $_ . $doc_lines[0];
+ next;
+ }
+ $line_nr = shift (@doc_numbers);
+ #print STDERR "$line_nr->{'file_name'}($line_nr->{'macro'},$line_nr->{'line_nr'}) $_" if ($line_nr);
+ }
+ #print STDERR "PASS_TEXT: $_";
+ #dump_stack(\$text, \@stack, \%state);
+ if (!$state{'raw'} and !$state{'verb'})
+ {
+ my $tag = '';
+ $tag = $1 if (/^\@(\w+)/ and !$index_pages);
+
+ if (($tag eq 'node') or defined($sec2level{$tag}) or $index_pages)
+ {
+ if (@stack or (defined($text) and $text ne ''))
+ {# in pass text node and section shouldn't appear in formats
+ #print STDERR "close_stack before \@$tag\n";
+ #print STDERR "text!$text%" if (! @stack);
+ close_stack(\$text, \@stack, \%state, $line_nr);
+ push @section_lines, $text;
+ $text = '';
+ }
+ $sec_num++ if ($sec2level{$tag});
+ my $new_element;
+ my $current_element;
+ if ($tag =~ /heading/)
+ {# handle headings, they are not in element lists
+ $current_element = $sections{$sec_num};
+ #print STDERR "HEADING $_";
+ if (! $element)
+ {
+ $new_element = shift @elements_list;
+ $element->{'has_heading'} = 1 if ($new_element->{'top'});
+ }
+ else
+ {
+ if ($element->{'top'})
+ {
+ $element->{'has_heading'} = 1;
+ }
+ push (@section_lines, &$Texi2HTML::Config::anchor($current_element->{'id'}) . "\n");
+ push @section_lines, &$Texi2HTML::Config::heading($current_element);
+ next;
+ }
+ }
+ elsif (!$index_pages)
+ {# handle node and structuring elements
+ $current_element = shift (@all_elements);
+ #begin debug section
+ if ($current_element->{'node'})
+ {
+ print STDERR 'NODE ' . "$current_element->{'texi'}($current_element->{'file'})" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ print STDERR "($current_element->{'section_ref'}->{'texi'})" if ($current_element->{'section_ref'} and ($T2H_DEBUG & $DEBUG_ELEMENTS));
+ }
+ else
+ {
+ print STDERR 'SECTION ' . $current_element->{'texi'} if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ }
+ print STDERR ": $_" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ #end debug section
+
+ # The element begins a new section if there is no previous
+ # or it is an element and not the current one or the
+ # associated section (in case of node) is not the current one
+ if (!$element
+ or ($current_element->{'element'} and ($current_element ne $element))
+ or ($current_element->{'section_ref'} and ($current_element->{'section_ref'} ne $element)))
+ {
+ $new_element = shift @elements_list;
+ }
+ # begin debugging section
+ my $section_element = $new_element;
+ $section_element = $element unless ($section_element);
+ if (!$current_element->{'node'} and !$current_element->{'index_page'} and ($section_element ne $current_element))
+ {
+ print STDERR "NODE: $element->{'texi'}\n" if ($element->{'node'});
+ warn "elements_list and all_elements not in sync (elements $section_element->{'texi'}, all $current_element->{'texi'}): $_";
+ }
+ # end debugging section
+ }
+ else
+ { # this is a new index section
+ $new_element = $index_pages->[$index_pages_nr]->{'element'};
+ $current_element = $index_pages->[$index_pages_nr]->{'element'};
+ print STDERR "New index page '$new_element->{'texi'}' nr: $index_pages_nr\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ my $list_element = shift @elements_list;
+ die "element in index_pages $new_element->{'texi'} and in list $list_element->{'texi'} differs\n" unless ($list_element eq $new_element);
+ }
+ if ($new_element)
+ {
+ $index_nr = 0;
+ my $old = 'NO_OLD';
+ $old = $element->{'texi'} if (defined($element));
+ print STDERR "NEW: $new_element->{'texi'}, OLD: $old\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+# FIXME this should be done differently now that there could be elements
+# associated with the same file
+ if ($element and ($new_element->{'doc_nr'} != $element->{'doc_nr'}) and @foot_lines and !$Texi2HTML::Config::SEPARATED_FOOTNOTES)
+ { # note that this can only happen if $Texi2HTML::Config::SPLIT
+ &$Texi2HTML::Config::foot_section (\@foot_lines);
+ push @section_lines, @foot_lines;
+ @foot_lines = ();
+ $relative_foot_num = 0;
+ }
+ # print the element that just finished
+ $Texi2HTML::THIS_SECTION = \@section_lines;
+ $Texi2HTML::THIS_HEADER = \@head_lines;
+ if ($element)
+ {
+ #$FH = finish_element($FH, $element, $new_element, $first_section);
+ finish_element($FH, $element, $new_element, $first_section);
+ $first_section = 0;
+ @section_lines = ();
+ @head_lines = ();
+ }
+ else
+ {
+ print STDERR "# Writing elements:" if ($T2H_VERBOSE);
+ if ($Texi2HTML::Config::IGNORE_PREAMBLE_TEXT)
+ {
+ @section_lines = ();
+ @head_lines = ();
+ }
+ # remove empty line at the beginning of @section_lines
+ shift @section_lines while (@section_lines and ($section_lines[0] =~ /^\s*$/));
+ }
+ # begin new element
+ my $previous_file;
+ $previous_file = $element->{'file'} if (defined($element));
+ $element = $new_element;
+ $state{'element'} = $element;
+ $Texi2HTML::THIS_ELEMENT = $element;
+ #print STDERR "Doing hrefs for $element->{'texi'} First ";
+ $Texi2HTML::HREF{'First'} = href($element_first, $element->{'file'});
+ #print STDERR "Last ";
+ $Texi2HTML::HREF{'Last'} = href($element_last, $element->{'file'});
+ #print STDERR "Index ";
+ $Texi2HTML::HREF{'Index'} = href($element_chapter_index, $element->{'file'}) if (defined($element_chapter_index));
+ #print STDERR "Top ";
+ $Texi2HTML::HREF{'Top'} = href($element_top, $element->{'file'});
+ foreach my $direction (('Up', 'Forward', 'Back', 'Next',
+ 'Prev', 'FastForward', 'FastBack', 'This', 'NodeUp',
+ 'NodePrev', 'NodeNext', 'Following' ))
+ {
+ my $elem = $element->{$direction};
+ $Texi2HTML::NODE{$direction} = undef;
+ $Texi2HTML::HREF{$direction} = undef;
+ next unless (defined($elem));
+ #print STDERR "$direction ";
+ if ($elem->{'node'} or $elem->{'external_node'} or $elem->{'index_page'} or !$elem->{'seen'})
+ {
+ $Texi2HTML::NODE{$direction} = $elem->{'text'};
+ }
+ elsif ($elem->{'node_ref'})
+ {
+ $Texi2HTML::NODE{$direction} = $elem->{'node_ref'}->{'text'};
+ }
+ if (!$elem->{'seen'})
+ {
+ $Texi2HTML::HREF{$direction} = do_external_href($elem->{'texi'});
+ }
+ else
+ {
+ $Texi2HTML::HREF{$direction} = href($elem, $element->{'file'});
+ }
+ $Texi2HTML::NAME{$direction} = $elem->{'text'};
+ $Texi2HTML::NO_TEXI{$direction} = $elem->{'no_texi'};
+ $Texi2HTML::UNFORMATTED{$direction} = $elem->{'unformatted'};
+ #print STDERR "$direction ($element->{'texi'}): \n NO_TEXI: $Texi2HTML::NO_TEXI{$direction}\n NAME $Texi2HTML::NAME{$direction}\n NODE $Texi2HTML::NODE{$direction}\n HREF $Texi2HTML::HREF{$direction}\n\n";
+ }
+ #print STDERR "\nDone hrefs for $element->{'texi'}\n";
+ $files{$element->{'file'}}->{'counter'}--;
+ #if (! defined($FH))
+ if (!defined($previous_file) or ($element->{'file'} ne $previous_file))
+ {
+ my $file = $element->{'file'};
+ print STDERR "\n" if ($T2H_VERBOSE and !$T2H_DEBUG);
+ print STDERR "# Writing to $docu_rdir$file " if $T2H_VERBOSE;
+ my $do_page_head = 0;
+ if ($files{$file}->{'filehandle'})
+ {
+ $FH = $files{$file}->{'filehandle'};
+ }
+ else
+ {
+ $FH = open_out("$docu_rdir$file");
+ $files{$file}->{'filehandle'} = $FH;
+ $do_page_head = 1;
+ }
+ if ($element->{'top'})
+ {
+ &$Texi2HTML::Config::print_Top_header($FH, $do_page_head);
+ }
+ else
+ {
+ &$Texi2HTML::Config::print_page_head($FH) if ($do_page_head);
+ &$Texi2HTML::Config::print_chapter_header($FH) if $Texi2HTML::Config::SPLIT eq 'chapter';
+ &$Texi2HTML::Config::print_section_header($FH) if $Texi2HTML::Config::SPLIT eq 'section';
+ }
+ $first_section = 1;
+ }
+ print STDERR "." if ($T2H_VERBOSE);
+ print STDERR "\n" if ($T2H_DEBUG);
+ }
+ my $label = &$Texi2HTML::Config::anchor($current_element->{'id'}) . "\n";
+ if (@section_lines)
+ {
+ push (@section_lines, $label);
+ }
+ else
+ {
+ push @head_lines, $label;
+ }
+ if ($index_pages)
+ {
+ push @section_lines, &$Texi2HTML::Config::heading($element);
+ #print STDERR "Do index page $index_pages_nr\n";
+ my $page = do_index_page($index_pages, $index_pages_nr);
+ push @section_lines, $page;
+ if (defined ($index_pages->[$index_pages_nr + 1]))
+ {
+ $index_pages_nr++;
+ }
+ else
+ {
+ $index_pages = undef;
+ }
+ next;
+ }
+ push @section_lines, &$Texi2HTML::Config::heading($current_element) if ($current_element->{'element'} and !$current_element->{'top'});
+ next;
+ }
+ elsif ($tag eq 'printindex')
+ {
+ s/\s+(\w+)\s*//;
+ my $name = $1;
+ close_paragraph(\$text, \@stack, \%state);
+ next if (!index_name2prefix($name) or $empty_indices{$name});
+ $printed_indices{$name} = 1;
+ print STDERR "print index $name($index_nr) in `$element->{'texi'}', element->{'indices'}: $element->{'indices'},\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS or $T2H_DEBUG & $DEBUG_INDEX);
+ print STDERR "element->{'indices'}->[index_nr]: $element->{'indices'}->[$index_nr] (@{$element->{'indices'}->[$index_nr]})\n" if ($T2H_DEBUG & $DEBUG_ELEMENTS or $T2H_DEBUG & $DEBUG_INDEX);
+ $index_pages = $element->{'indices'}->[$index_nr] if (@{$element->{'indices'}->[$index_nr]} > 1);
+ $index_pages_nr = 0;
+ add_prev(\$text, \@stack, do_index_page($element->{'indices'}->[$index_nr], 0));
+ $index_pages_nr++;
+ $index_nr++;
+ begin_paragraph (\@stack, \%state) if ($state{'preformatted'});
+ next if (@stack);
+ push @section_lines, $text;
+ $text = '';
+ next;
+ }
+ elsif ($tag eq 'contents')
+ {
+ next;
+ }
+ }
+ scan_line($_, \$text, \@stack, \%state, $line_nr);
+ #print STDERR "after scan_line: $_";
+ #dump_stack(\$text, \@stack, \%state);
+ next if (@stack);
+ if ($text ne '' )
+ {
+ push @section_lines, $text;
+ $text = '';
+ }
+ }
+ if (@stack)
+ {# close stack at the end of pass text
+ close_stack(\$text, \@stack, \%state, $line_nr);
+ }
+ if (defined($text))
+ {
+ push @section_lines, $text;
+ }
+ print STDERR "\n" if ($T2H_VERBOSE);
+ $Texi2HTML::THIS_SECTION = \@section_lines;
+ # if no sections, then simply print document as is
+ if ($one_section)
+ {
+ if (@foot_lines)
+ {
+ &$Texi2HTML::Config::foot_section (\@foot_lines);
+ push @section_lines, @foot_lines;
+ }
+ $Texi2HTML::THIS_HEADER = \@head_lines;
+ if ($element->{'top'})
+ {
+ print STDERR "Bug: `$element->{'texi'}' level undef\n" if (!$element->{'node'} and !defined($element->{'level'}));
+ $element->{'level'} = 1 if (!defined($element->{'level'}));
+ $element->{'node'} = 0; # otherwise Texi2HTML::Config::heading may uses the node level
+ $element->{'text'} = $Texi2HTML::NAME{'Top'};
+ print STDERR "[Top]" if ($T2H_VERBOSE);
+ unless ($element->{'has_heading'})
+ {
+ unshift @section_lines, &$Texi2HTML::Config::heading($element);
+ }
+ }
+ print STDERR "# Write the section $element->{'texi'}\n" if ($T2H_VERBOSE);
+ &$Texi2HTML::Config::one_section($FH);
+ close_out($FH);
+ return;
+ }
+
+ finish_element ($FH, $element, undef, $first_section);
+
+ ############################################################################
+ # Print ToC, Overview, Footnotes
+ #
+ for my $direction (('Prev', 'Next', 'Back', 'Forward', 'Up', 'NodeUp',
+ 'NodePrev', 'NodeNext', 'Following', 'This'))
+ {
+ delete $Texi2HTML::HREF{$direction};
+ # it is better to undef in case the references to these hash entries
+ # are used, as if deleted, the
+ # references are still refering to the old, undeleted element
+ # (we could do both)
+ $Texi2HTML::NAME{$direction} = undef;
+ $Texi2HTML::NO_TEXI{$direction} = undef;
+ $Texi2HTML::UNFORMATTED{$direction} = undef;
+ $Texi2HTML::NODE{$direction} = undef;
+
+ $Texi2HTML::THIS_ELEMENT = undef;
+ }
+ if (@foot_lines)
+ {
+ print STDERR "# writing Footnotes in $docu_foot_file\n" if $T2H_VERBOSE;
+ #open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
+ $FH = open_out ($docu_foot_file)
+ if $Texi2HTML::Config::SPLIT;
+ $Texi2HTML::HREF{'This'} = $Texi2HTML::HREF{'Footnotes'};
+ $Texi2HTML::HREF{'Footnotes'} = '#' . $footnote_element->{'id'};
+ $Texi2HTML::NAME{'This'} = $Texi2HTML::NAME{'Footnotes'};
+ $Texi2HTML::NO_TEXI{'This'} = $Texi2HTML::NO_TEXI{'Footnotes'};
+ $Texi2HTML::UNFORMATTED{'This'} = $Texi2HTML::UNFORMATTED{'Footnotes'};
+ $Texi2HTML::THIS_SECTION = \@foot_lines;
+ $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor($footnote_element->{'id'}) . "\n" ];
+ #&$Texi2HTML::Config::print_Footnotes(\*FILE);
+ &$Texi2HTML::Config::print_Footnotes($FH);
+ #close(FILE) if $Texi2HTML::Config::SPLIT;
+ close_out($FH, $docu_foot_file)
+ #|| die "$ERROR: Error occurred when closing $docu_foot_file: $!\n"
+ if ($Texi2HTML::Config::SPLIT);
+ $Texi2HTML::HREF{'Footnotes'} = $Texi2HTML::HREF{'This'};
+ }
+
+ if (@{$Texi2HTML::TOC_LINES})
+ {
+ print STDERR "# writing Toc in $docu_toc_file\n" if $T2H_VERBOSE;
+ #open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
+ $FH = open_out ($docu_toc_file)
+ if $Texi2HTML::Config::SPLIT;
+ $Texi2HTML::HREF{'This'} = $Texi2HTML::HREF{'Contents'};
+ $Texi2HTML::HREF{'Contents'} = "#SEC_Contents";
+ $Texi2HTML::NAME{'This'} = $Texi2HTML::NAME{'Contents'};
+ $Texi2HTML::NO_TEXI{'This'} = $Texi2HTML::NO_TEXI{'Contents'};
+ $Texi2HTML::UNFORMATTED{'This'} = $Texi2HTML::UNFORMATTED{'Contents'};
+ $Texi2HTML::THIS_SECTION = $Texi2HTML::TOC_LINES;
+ $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor("SEC_Contents") . "\n" ];
+ #&$Texi2HTML::Config::print_Toc(\*FILE);
+ #close(FILE) if $Texi2HTML::Config::SPLIT;
+ &$Texi2HTML::Config::print_Toc($FH);
+ close_out($FH, $docu_toc_file)
+ #|| die "$ERROR: Error occurred when closing $docu_toc_file: $!\n"
+ if ($Texi2HTML::Config::SPLIT);
+ $Texi2HTML::HREF{'Contents'} = $Texi2HTML::HREF{'This'};
+ }
+
+ if (@{$Texi2HTML::OVERVIEW})
+ {
+ print STDERR "# writing Overview in $docu_stoc_file\n" if $T2H_VERBOSE;
+ #open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
+ $FH = open_out ($docu_stoc_file)
+ if $Texi2HTML::Config::SPLIT;
+ $Texi2HTML::HREF{This} = $Texi2HTML::HREF{Overview};
+ $Texi2HTML::HREF{Overview} = "#SEC_Overview";
+ $Texi2HTML::NAME{This} = $Texi2HTML::NAME{Overview};
+ $Texi2HTML::NO_TEXI{This} = $Texi2HTML::NO_TEXI{Overview};
+ $Texi2HTML::UNFORMATTED{This} = $Texi2HTML::UNFORMATTED{Overview};
+ $Texi2HTML::THIS_SECTION = $Texi2HTML::OVERVIEW;
+ $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor("SEC_Overview") . "\n" ];
+ #&$Texi2HTML::Config::print_Overview(\*FILE);
+ #close(FILE) if $Texi2HTML::Config::SPLIT;
+ &$Texi2HTML::Config::print_Overview($FH);
+ close_out($FH,$docu_stoc_file)
+ #|| die "$ERROR: Error occurred when closing $docu_stoc_file: $!\n"
+ if ($Texi2HTML::Config::SPLIT);
+ $Texi2HTML::HREF{Overview} = $Texi2HTML::HREF{This};
+ }
+ my $about_body;
+ if ($about_body = &$Texi2HTML::Config::about_body())
+ {
+ print STDERR "# writing About in $docu_about_file\n" if $T2H_VERBOSE;
+ #open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
+ $FH = open_out ($docu_about_file)
+ if $Texi2HTML::Config::SPLIT;
+
+ $Texi2HTML::HREF{This} = $Texi2HTML::HREF{About};
+ $Texi2HTML::HREF{About} = "#SEC_About";
+ $Texi2HTML::NAME{This} = $Texi2HTML::NAME{About};
+ $Texi2HTML::NO_TEXI{This} = $Texi2HTML::NO_TEXI{About};
+ $Texi2HTML::UNFORMATTED{This} = $Texi2HTML::UNFORMATTED{About};
+ $Texi2HTML::THIS_SECTION = [$about_body];
+ $Texi2HTML::THIS_HEADER = [ &$Texi2HTML::Config::anchor("SEC_About") . "\n" ];
+ #&$Texi2HTML::Config::print_About(\*FILE);
+ #close(FILE) if $Texi2HTML::Config::SPLIT;
+ &$Texi2HTML::Config::print_About($FH);
+ close_out($FH, $docu_stoc_file)
+ #|| die "$ERROR: Error occurred when closing $docu_stoc_file: $!\n"
+ if ($Texi2HTML::Config::SPLIT);
+ $Texi2HTML::HREF{About} = $Texi2HTML::HREF{This};
+ }
+
+ unless ($Texi2HTML::Config::SPLIT)
+ {
+ &$Texi2HTML::Config::print_page_foot($FH);
+ close_out ($FH);
+ # || die "$ERROR: Error occurred when closing: $!\n";
+ }
+}
+
+# print section, close file and undef FH if needed.
+sub finish_element($$$$)
+{
+ my $FH = shift;
+ my $element = shift;
+ my $new_element = shift;
+ my $first_section = shift;
+#print STDERR "FINISH_ELEMENT($FH)($element->{'texi'})[$element->{'file'}] counter $files{$element->{'file'}}->{'counter'}\n";
+ if ($element->{'top'})
+ {
+ my $top_file = $docu_top_file;
+ #print STDERR "TOP $element->{'texi'}, @section_lines\n";
+ print STDERR "[Top]" if ($T2H_VERBOSE);
+ $Texi2HTML::HREF{'Top'} = href($element_top, $element->{'file'});
+ &$Texi2HTML::Config::print_Top($FH, $element->{'has_heading'});
+ my $end_page = 0;
+ if ($Texi2HTML::Config::SPLIT)
+ {
+ if (!$files{$element->{'file'}}->{'counter'})
+ {
+ $end_page = 1;
+ }
+ }
+ &$Texi2HTML::Config::print_Top_footer($FH, $end_page);
+ close_out($FH, $top_file) if ($end_page);
+ }
+ else
+ {
+ print STDERR "# do element $element->{'texi'}\n"
+ if ($T2H_DEBUG & $DEBUG_ELEMENTS);
+ &$Texi2HTML::Config::print_section($FH, $first_section);
+ if (defined($new_element) and ($new_element->{'file'} ne $element->{'file'}))
+ {
+ if (!$files{$element->{'file'}}->{'counter'})
+ {
+ &$Texi2HTML::Config::print_chapter_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'chapter');
+ &$Texi2HTML::Config::print_section_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'section');
+ #print STDERR "Close file after $element->{'texi'}\n";
+ &$Texi2HTML::Config::print_page_foot($FH);
+ close_out($FH);
+ }
+ else
+ {
+ print STDERR "counter $files{$element->{'file'}}->{'counter'} ne 0, file $element->{'file'}\n";
+ }
+ undef $FH;
+ }
+ elsif (!defined($new_element))
+ {
+ if ($Texi2HTML::Config::SPLIT)
+ { # end of last splitted section
+ &$Texi2HTML::Config::print_chapter_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'chapter');
+ &$Texi2HTML::Config::print_section_footer($FH) if ($Texi2HTML::Config::SPLIT eq 'section');
+ &$Texi2HTML::Config::print_page_foot($FH);
+ close_out($FH);
+ }
+ else
+ {
+ &$Texi2HTML::Config::end_section($FH, 1);
+ }
+ }
+ elsif ($new_element->{'top'})
+ {
+ &$Texi2HTML::Config::end_section($FH, 1);
+ }
+ else
+ {
+ &$Texi2HTML::Config::end_section($FH);
+ }
+ }
+ return $FH;
+}
+
+# write to files with name the node name for cross manual references.
+sub do_node_files()
+{
+ foreach my $key (keys(%nodes))
+ {
+ my $node = $nodes{$key};
+ next unless ($node->{'node_file'});
+ my $redirection_file = $docu_doc;
+ $redirection_file = $node->{'file'} if ($Texi2HTML::Config::SPLIT);
+ if (!$redirection_file)
+ {
+ print STDERR "Bug: file for redirection for `$node->{'texi'}' don't exist\n" unless ($novalidate);
+ next;
+ }
+ next if ($redirection_file eq $node->{'node_file'});
+ my $file = "${docu_rdir}$node->{'node_file'}";
+ $Texi2HTML::NODE{'This'} = $node->{'text'};
+ $Texi2HTML::NO_TEXI{'This'} = $node->{'no_texi'};
+ $Texi2HTML::UNFORMATTED{'This'} = $node->{'no_texi'};
+ $Texi2HTML::NAME{'This'} = $node->{'text'};
+ $Texi2HTML::HREF{'This'} = "$node->{'file'}#$node->{'id'}";
+ open (NODEFILE, "> $file") || die "$ERROR Can't open $file for writing: $!\n";
+ &$Texi2HTML::Config::print_redirection_page (\*NODEFILE);
+ close NODEFILE || die "$ERROR: Can't close $file: $!\n";
+ }
+}
+
+#+++############################################################################
+# #
+# Low level functions #
+# #
+#---############################################################################
+
+sub locate_include_file($)
+{
+ my $file = shift;
+
+ # APA: Don't implicitely search ., to conform with the docs!
+ # return $file if (-e $file && -r $file);
+ foreach my $dir (@Texi2HTML::Config::INCLUDE_DIRS)
+ {
+ return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
+ }
+ return undef;
+}
+
+sub open_file($$)
+{
+ my $name = shift;
+ my $line_number = shift;
+ local *FH;
+ #if ((defined($from_encoding) and open(*FH, ":encoding($from_encoding)", $name)) or open(*FH, $name))
+ #if ((defined($from_encoding) and open(*FH, "<:$from_encoding", $name)) or open(*FH, $name))
+ if (open(*FH, "<$name"))
+ {
+ if (defined($from_encoding))
+ {
+ binmode(*FH, ":encoding($from_encoding)");
+ }
+ my $file = { 'fh' => *FH,
+ 'input_spool' => { 'spool' => [],
+ 'macro' => '' },
+ 'name' => $name,
+ 'line_nr' => 0 };
+ unshift(@fhs, $file);
+ $input_spool = $file->{'input_spool'};
+ $line_number->{'file_name'} = $name;
+ $line_number->{'line_nr'} = 1;
+ }
+ else
+ {
+ warn "$ERROR Can't read file $name: $!\n";
+ }
+}
+
+sub open_out($)
+{
+ my $file = shift;
+ if ($file eq '-')
+ {
+ binmode(STDOUT, ":encoding($to_encoding)") if (defined($to_encoding));
+ return \*STDOUT;
+ }
+ #unless ((defined($to_encoding) and open(FILE, ">:encoding($to_encoding)", $file)) or open(FILE, "> $file"))
+ #my $open_style = 'bytes';
+ #$open_style = 'utf8' if (defined($to_encoding) and $to_encoding eq 'utf8');
+ #if (defined($to_encoding) and $to_encoding eq 'utf8')
+ #{
+ # $open_style = 'utf8';
+ # print STDERR "$open_style\n";
+ #}
+ #unless ((defined($to_encoding) and open(FILE, ">:$open_style", $file)) or open(FILE, "> $file"))
+ unless (open(FILE, ">$file"))
+ {
+ die "$ERROR Can't open $file for writing: $!\n";
+ }
+ if (defined($to_encoding))
+ {
+ if ($to_encoding eq 'utf8')
+ {
+ binmode(FILE, ':utf8');
+ }
+ else
+ {
+ binmode(FILE, ':bytes');
+ }
+ binmode(FILE, ":encoding($to_encoding)");
+ }
+ return \*FILE;
+}
+
+sub close_out($;$)
+{
+ my $FH = shift;
+ my $file = shift;
+ $file = '' if (!defined($file));
+ return if ($Texi2HTML::Config::OUT eq '');
+ close ($FH) || die "$ERROR: Error occurred when closing $file: $!\n";
+}
+
+sub next_line($)
+{
+ my $line_number = shift;
+ while (@fhs)
+ {
+ my $file = $fhs[0];
+ $line_number->{'file_name'} = $file->{'name'};
+ $input_spool = $file->{'input_spool'};
+ if (@{$input_spool->{'spool'}})
+ {
+ $line_number->{'macro'} = $file->{'input_spool'}->{'macro'};
+ $line_number->{'line_nr'} = $file->{'line_nr'};
+ my $line = shift(@{$input_spool->{'spool'}});
+ print STDERR "# unspooling $line" if ($T2H_DEBUG & $DEBUG_MACROS);
+ return($line);
+ }
+ else
+ {
+ $file->{'input_spool'}->{'macro'} = '';
+ $line_number->{'macro'} = '';
+ }
+ my $fh = $file->{'fh'};
+ no strict "refs";
+ my $line = <$fh>;
+ use strict "refs";
+ my $chomped_line = $line;
+ $file->{'line_nr'}++ if (defined($line) and chomp($chomped_line));
+ $line_number->{'line_nr'} = $file->{'line_nr'};
+ return($line) if (defined($line));
+ no strict "refs";
+ close($fh);
+ use strict "refs";
+ shift(@fhs);
+ }
+ return(undef);
+}
+
+# echo a warning
+sub echo_warn($;$)
+{
+ my $text = shift;
+ chomp ($text);
+ my $line_number = shift;
+ warn "$WARN $text " . format_line_number($line_number) . "\n";
+}
+
+sub echo_error($;$)
+{
+ my $text = shift;
+ chomp ($text);
+ my $line_number = shift;
+ warn "$ERROR $text " . format_line_number($line_number) . "\n";
+}
+
+sub format_line_number($)
+{
+ my $line_number = shift;
+ my $macro_text = '';
+ #$line_number = undef;
+ return '' unless (defined($line_number));
+ $macro_text = " in $line_number->{'macro'}" if ($line_number->{'macro'} ne '');
+ my $file_text = '(';
+ $file_text = "(in $line_number->{'file_name'} " if ($line_number->{'file_name'} ne $docu);
+ return "${file_text}l. $line_number->{'line_nr'}" . $macro_text . ')';
+}
+
+# to debug, dump the result of pass_texi and pass_structure in a file
+sub dump_texi($$;$$)
+{
+ my $lines = shift;
+ my $pass = shift;
+ my $numbers = shift;
+ my $file = shift;
+ $file = "$docu_rdir$docu_name" . ".pass$pass" if (!defined($file));
+ unless (open(DMPTEXI, ">$file"))
+ {
+ warn "Can't open $file for writing: $!\n";
+ }
+ print STDERR "# Dump texi\n" if ($T2H_VERBOSE);
+ my $index = 0;
+ foreach my $line (@$lines)
+ {
+ my $number_information = '';
+ my $chomped_line = $line;
+ $number_information = "$numbers->[$index]->{'file_name'}($numbers->[$index]->{'macro'},$numbers->[$index]->{'line_nr'}) " if (defined($numbers));
+ print DMPTEXI "${number_information}$line";
+ $index++ if (chomp($chomped_line));
+ }
+ close DMPTEXI;
+}
+
+# return next tag on the line
+sub next_tag($)
+{
+ my $line = shift;
+ if ($line =~ /^\s*\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])/o or $line =~ /^\s*\@([a-zA-Z]\w*)([\s\{\}\@])/ or $line =~ /^\s*\@([a-zA-Z]\w*)$/)
+ {
+ return ($1);
+ }
+ return '';
+}
+
+sub top_stack($)
+{
+ my $stack = shift;
+ return undef unless(@$stack);
+ return $stack->[-1];
+}
+
+# return the next element with balanced {}
+sub next_bracketed($$)
+{
+ my $line = shift;
+ my $line_nr = shift;
+ my $opened_braces = 0;
+ my $result = '';
+ my $spaces;
+ if ($line =~ /^(\s*)$/)
+ {
+ return ('','',$1);
+ }
+ while ($line !~ /^\s*$/)
+ {
+#print STDERR "next_bracketed($opened_braces): $result !!! $line";
+ if (!$opened_braces)
+ { # beginning of item
+ $line =~ s/^(\s*)//;
+ $spaces = $1;
+ #if ($line =~ s/^([^\{\}\s]+)//)
+ if ($line =~ s/^([^\{\}]+?)(\s+)/$2/ or $line =~ s/^([^\{\}]+?)$//)
+ {
+ $result = $1;
+ $result =~ s/\s*$//;
+ return ($result, $line, $spaces);
+ }
+ elsif ($line =~ s/^([^\{\}]+?)([\{\}])/$2/)
+ {
+ $result = $1;
+ }
+ }
+ elsif($line =~ s/^([^\{\}]+)//)
+ {
+ $result .= $1;
+ }
+ if ($line =~ s/^([\{\}])//)
+ {
+ my $brace = $1;
+ $opened_braces++ if ($brace eq '{');
+ $opened_braces-- if ($brace eq '}');
+
+ if ($opened_braces < 0)
+ {
+ echo_error("too much '}' in specification", $line_nr);
+ $opened_braces = 0;
+ next;
+ }
+ $result .= $brace;
+ return ($result, $line, $spaces) if ($opened_braces == 0);
+ }
+ }
+ if ($opened_braces)
+ {
+ echo_error("'{' not closed in specification", $line_nr);
+ return ($result . ( '}' x $opened_braces), '', $spaces);
+ }
+ print STDERR "BUG: at the end of next_bracketed\n";
+ return undef;
+}
+
+# do a href using file and id and taking care of ommitting file if it is
+# the same
+# element: structuring element to point to
+# file: current file
+sub href($$)
+{
+ my $element = shift;
+ my $file = shift;
+ return '' unless defined($element);
+ my $href = '';
+ print STDERR "Bug: $element->{'texi'}, id undef\n" if (!defined($element->{'id'}));
+ print STDERR "Bug: $element->{'texi'}, file undef\n" if (!defined($element->{'file'}));
+#foreach my $key (keys(%{$element}))
+#{
+# my $value = 'UNDEF'; $value = $element->{$key} if defined($element->{$key});
+# print STDERR "$key: $value\n";
+#}print STDERR "\n";
+ $href .= $element->{'file'} if (defined($element->{'file'}) and $file ne $element->{'file'});
+ $href .= "#$element->{'id'}" if (defined($element->{'id'}));
+ return $href;
+}
+
+sub normalise_space($)
+{
+ return undef unless (defined ($_[0]));
+ my $text = shift;
+ $text =~ s/\s+/ /go;
+ $text =~ s/ $//;
+ $text =~ s/^ //;
+ return $text;
+}
+
+sub normalise_node($)
+{
+ return undef unless (defined ($_[0]));
+ my $text = shift;
+ $text = normalise_space($text);
+ $text =~ s/^top$/Top/i;
+ return $text;
+}
+
+sub do_math($;$)
+{
+ #return l2h_ToLatex("\$".$_[0]."\$");
+ return Texi2HTML::LaTeX2HTML::to_latex("\$".$_[0]."\$");
+}
+
+sub do_anchor_label($$$$)
+{
+ my $command = shift;
+ #my $anchor = shift;
+ my $args = shift;
+ my $anchor = $args->[0];
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ return '' if ($state->{'multiple_pass'});
+ $anchor = normalise_node($anchor);
+ return &$Texi2HTML::Config::anchor($nodes{$anchor}->{'id'});
+}
+
+sub get_format_command($)
+{
+ my $format = shift;
+ my $command = '';
+ my $format_name = '';
+ my $term = 0;
+ my $item_nr;
+ my $paragraph_number;
+ my $enumerate_type;
+ my $number;
+
+ if (defined($format) and ref($format) eq "HASH")
+ {
+ $command = $format->{'command'};
+ $command = '' if (!defined($command));
+ $paragraph_number = \$format->{'paragraph_number'};
+ $format_name = $format->{'format'};
+ $term = 1 if ($format->{'term'}); #This should never happen
+ $item_nr = $format->{'item_nr'};
+ $enumerate_type = $format->{'spec'};
+ $number = $format->{'number'};
+ }
+ return ($format_name, $command, $paragraph_number, $term, $item_nr,
+ $enumerate_type, $number);
+}
+
+sub do_paragraph($$)
+{
+ my $text = shift;
+ my $state = shift;
+ my ($format, $paragraph_command, $paragraph_number, $term, $item_nr,
+ $enumerate_type, $number) = get_format_command ($state->{'paragraph'});
+ delete $state->{'paragraph'};
+ my $paragraph_command_formatted;
+ $state->{'paragraph_nr'}--;
+ (print STDERR "Bug text undef in do_paragraph", return '') unless defined($text);
+ my $align = '';
+ $align = $state->{'paragraph_style'}->[-1] if ($state->{'paragraph_style'}->[-1]);
+
+ if (exists($style_map_ref->{$paragraph_command}) and
+ !exists($Texi2HTML::Config::special_list_commands{$format}->{$paragraph_command}))
+ {
+ if ($format eq 'itemize')
+ {
+ chomp ($text);
+ $text = do_simple($paragraph_command, $text, $state, [$text]);
+ $text = $text . "\n";
+ }
+ }
+ elsif (exists($things_map_ref->{$paragraph_command}))
+ {
+ $paragraph_command_formatted = do_simple($paragraph_command, '', $state);
+ }
+ return &$Texi2HTML::Config::paragraph($text, $align, $paragraph_command, $paragraph_command_formatted, $paragraph_number, $format, $item_nr, $enumerate_type, $number);
+}
+
+sub do_preformatted($$)
+{
+ my $text = shift;
+ my $state = shift;
+ my ($format, $leading_command, $preformatted_number, $term, $item_nr, $enumerate_type,
+ $number) = get_format_command($state->{'preformatted_format'});
+ delete ($state->{'preformatted_format'});
+ my $leading_command_formatted;
+ my $pre_style = '';
+ my $class = '';
+ $pre_style = $state->{'preformatted_stack'}->[-1]->{'pre_style'} if ($state->{'preformatted_stack'}->[-1]->{'pre_style'});
+ $class = $state->{'preformatted_stack'}->[-1]->{'class'};
+ print STDERR "BUG: !state->{'preformatted_stack'}->[-1]->{'class'}\n" unless ($class);
+ if (exists($style_map_ref->{$leading_command}) and
+ !exists($Texi2HTML::Config::special_list_commands{$format}->{$leading_command}) and ($style_type{$leading_command} eq 'style'))
+ {
+ $text = do_simple($leading_command, $text, $state,[$text]) if ($format eq 'itemize');
+ }
+ elsif (exists($things_map_ref->{$leading_command}))
+ {
+ $leading_command_formatted = do_simple($leading_command, '', $state);
+ }
+ return &$Texi2HTML::Config::preformatted($text, $pre_style, $class, $leading_command, $leading_command_formatted, $preformatted_number, $format, $item_nr, $enumerate_type, $number);
+}
+
+sub do_external_href($)
+{
+ my $texi_node = shift;
+ my $file = '';
+ my $node_id = '';
+ my $node_xhtml_id = '';
+ if ($texi_node =~ s/^\((.+?)\)//)
+ {
+ $file = $1;
+ }
+ $texi_node = normalise_node($texi_node);
+ if ($texi_node ne '')
+ {
+ if (exists($nodes{$texi_node}) and ($nodes{$texi_node}->{'cross_manual_target'}))
+ {
+ $node_id = $nodes{$texi_node}->{'cross_manual_target'};
+ }
+ else
+ {
+ $node_id = cross_manual_line($texi_node);
+ }
+ $node_xhtml_id = node_to_id($node_id);
+ }
+ return &$Texi2HTML::Config::external_href($texi_node, $node_id,
+ $node_xhtml_id, $file);
+}
+
+# transform node for cross ref name to id suitable for xhtml.
+sub node_to_id($)
+{
+ my $cross_ref_node_name = shift;
+ $cross_ref_node_name =~ s/^([0-9_])/g_t$1/;
+ return $cross_ref_node_name;
+}
+
+# return 1 if the following tag shouldn't begin a line
+sub no_line($)
+{
+ my $line = shift;
+ my $next_tag = next_tag($line);
+ return 1 if (($line =~ /^\s*$/) or $no_line_macros{$next_tag} or
+ (($next_tag =~ /^(\w+?)index$/) and ($1 ne 'print')) or
+ (($line =~ /^\@end\s+(\w+)/) and $no_line_macros{"end $1"}));
+ return 0;
+}
+
+sub no_paragraph($$)
+{
+ my $state = shift;
+ my $line = shift;
+ return ($state->{'paragraph'} or $state->{'preformatted'} or $state->{'remove_texi'} or no_line($line) or $state->{'no_paragraph'});
+}
+
+sub automatic_preformatted($$)
+{
+ my $state = shift;
+ my $macro = shift;
+ return ($state->{'preformatted'} and
+ !$Texi2HTML::Config::format_in_paragraph{$macro});
+}
+
+# handle raw formatting, ignored regions...
+sub do_text_macro($$$$)
+{
+ my $type = shift;
+ my $line = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $value;
+ #print STDERR "do_text_macro $type\n";
+
+ if (not $text_macros{$type})
+ { # ignored text
+ $state->{'ignored'} = $type;
+ #print STDERR "IGNORED\n";
+ }
+ elsif ($text_macros{$type} eq 'raw' or $text_macros{$type} eq 'special')
+ {
+ $state->{'raw'} = $type;
+ #print STDERR "RAW\n";
+ }
+ elsif ($text_macros{$type} eq 'value')
+ {
+ if (($line =~ s/(\s+)($VARRE)$//) or ($line =~ s/(\s+)($VARRE)(\s)//))
+ {
+ $value = $1 . $2;
+ $value .= $3 if defined($3);
+ if ($type eq 'ifclear')
+ {
+ if (defined($value{$2}))
+ {
+ $state->{'ignored'} = $type;
+ }
+ else
+ {
+ push @{$state->{'text_macro_stack'}}, $type;
+ }
+ }
+ elsif ($type eq 'ifset')
+ {
+ unless (defined($value{$2}))
+ {
+ $state->{'ignored'} = $type;
+ }
+ else
+ {
+ push @{$state->{'text_macro_stack'}}, $type;
+ }
+ }
+ }
+ else
+ {
+ echo_error ("Bad $type line: $line", $line_nr);
+ #warn "$ERROR Bad $type line: $line";
+ }
+ }
+ else
+ {
+ push @{$state->{'text_macro_stack'}}, $type;
+ }
+ my $text = "\@$type";
+ $text .= $value if defined($value);
+ return ($line, $text);
+}
+
+# do regions handled specially, currently only tex, going throug latex2html
+sub do_special ($$)
+{
+ my $style = shift;
+ my $text = shift;
+ if ($style eq 'tex')
+ {
+ # add space to the end -- tex(i2dvi) does this, as well
+ #return (l2h_ToLatex($text . " "));
+ return (Texi2HTML::LaTeX2HTML::to_latex($text . " "));
+ }
+}
+
+sub do_insertcopying($)
+{
+ my $state = shift;
+ return '' unless @{$region_lines{'copying'}};
+ return substitute_text(duplicate_state($state), @{$region_lines{'copying'}});
+}
+
+sub get_deff_index($$$)
+{
+ my $tag = shift;
+ my $line = shift;
+ my $line_nr = shift;
+
+ $tag =~ s/x$// if $tag =~ /x$/;
+ my ($style, $category, $name, $type, $class, $arguments);
+ ($style, $category, $name, $type, $class, $arguments) = parse_def($tag, $line, $line_nr);
+ # FIXME -- --- ''... should be protected for name and maybe class
+ $name = &$Texi2HTML::Config::definition_category($name, $class, $style);
+ return undef if (!$name or ($name =~ /^\s*$/));
+ return ($style, $name);
+}
+
+sub parse_def($$$)
+{
+ my $tag = shift;
+ my $line = shift;
+ my $line_nr = shift;
+
+ if (!ref ($Texi2HTML::Config::def_map{$tag}))
+ {
+ # substitute shortcuts for definition commands
+ my $substituted = $Texi2HTML::Config::def_map{$tag};
+ $substituted =~ s/(\w+)//;
+ $tag = $1;
+ $line = $substituted . $line;
+ }
+#print STDERR "PARSE_DEF $line";
+ my ($category, $name, $type, $class, $arguments);
+ my @args = @{$Texi2HTML::Config::def_map{$tag}};
+ my $style = shift @args;
+ while (@args)
+ {
+ my $arg = shift @args;
+ if (defined($arg))
+ {
+ # backward compatibility, it was possible to have a { in front.
+ $arg =~ s/^\{//;
+ my $item;
+ my $spaces;
+ ($item, $line,$spaces) = next_bracketed($line, $line_nr);
+ last if (!defined($item));
+ $item =~ s/^\{(.*)\}$/$1/ if ($item =~ /^\{/);
+ if ($arg eq 'category')
+ {
+ $category = $item;
+ }
+ elsif ($arg eq 'name')
+ {
+ $name = $item;
+ }
+ elsif ($arg eq 'type')
+ {
+ $type = $item;
+ }
+ elsif ($arg eq 'class')
+ {
+ $class = $item;
+ }
+ elsif ($arg eq 'arg')
+ {
+ $line = $spaces . $item . $line;
+ }
+ }
+ else
+ {
+ # chomp ($line);
+ # $line =~ s/\s*$//;
+ # $arguments = $line if ($line ne '');
+ last;
+ }
+ }
+ #return ($style, $category, $name, $type, $class, $arguments);
+#print STDERR "PARSE_DEF (style $style, category $category, name $name, type $type, class $class, line $line)\n";
+ return ($style, $category, $name, $type, $class, $line);
+}
+
+#FIXME this is rather fragile.
+sub begin_deff_item($$;$)
+{
+ my $stack = shift;
+ my $state = shift;
+ my $no_paragraph = shift;
+ return if ($state->{'cmd_line'});
+ #print STDERR "DEF push deff_item for $state->{'deff'}\n";
+ push @$stack, { 'format' => 'deff_item', 'text' => '' };
+ # there is no paragraph when a new deff just follows the deff we are
+ # opening
+ begin_paragraph($stack, $state) if ($state->{'preformatted'} and !$no_paragraph);
+ $state->{'deff'} = undef;
+ delete($state->{'deff'});
+ #dump_stack(undef, $stack, $state);
+}
+
+sub begin_paragraph($$)
+{
+ my $stack = shift;
+ my $state = shift;
+
+ my $command = 1;
+ my $top_format = top_format($stack);
+ if (defined($top_format))
+ {
+ $command = $top_format;
+ }
+ if ($state->{'preformatted'})
+ {
+ push @$stack, {'format' => 'preformatted', 'text' => '' };
+ $state->{'preformatted_format'} = $command if ($command ne '1');
+ push @$stack, @{$state->{'paragraph_macros'}} if $state->{'paragraph_macros'};
+ delete $state->{'paragraph_macros'};
+ return;
+ }
+ $state->{'paragraph'} = $command;
+ $state->{'paragraph_nr'}++;
+ push @$stack, {'format' => 'paragraph', 'text' => '' };
+ # if there are macros which weren't closed when the previous
+ # paragraph was closed we reopen them here
+ push @$stack, @{$state->{'paragraph_macros'}} if $state->{'paragraph_macros'};
+ delete $state->{'paragraph_macros'};
+}
+
+sub parse_format_command($$)
+{
+ my $line = shift;
+ my $tag = shift;
+ my $command = 'asis';
+ if (($line =~ /^\s*\@([A-Za-z]\w*)(\{\})?$/ or $line =~ /^\s*\@([A-Za-z]\w*)(\{\})?\s/) and ($things_map_ref->{$1} or defined($style_map_ref->{$1})))
+ {
+ $line =~ s/^\s*\@([A-Za-z]\w*)(\{\})?\s*//;
+ $command = $1;
+ }
+ return ('', $command) if ($line =~ /^\s*$/);
+ chomp $line;
+ $line = substitute_text ({'keep_nr' => 1, 'keep_texi' => 1, 'check_item' => $tag}, $line);
+ return ($line, $command);
+}
+
+sub parse_enumerate($)
+{
+ my $line = shift;
+ my $spec;
+ if ($line =~ /^\s*(\w)\b/ and ($1 ne '_'))
+ {
+ $spec = $1;
+ $line =~ s/^\s*(\w)\s*//;
+ }
+ return ($line, $spec);
+}
+
+sub parse_multitable($$)
+{
+ my $line = shift;
+ my $line_nr = shift;
+ # first find the table width
+ my $table_width = 0;
+ if ($line =~ s/^\s+\@columnfractions\s+//)
+ {
+ my @fractions = split /\s+/, $line;
+ $table_width = $#fractions + 1;
+ while (@fractions)
+ {
+ my $fraction = shift @fractions;
+ unless ($fraction =~ /^(\d*\.\d+)|(\d+)\.?$/)
+ {
+ echo_error ("column fraction not a number: $fraction", $line_nr);
+ #warn "$ERROR column fraction not a number: $fraction";
+ }
+ }
+ }
+ else
+ {
+ my $element;
+ my $line_orig = $line;
+ while ($line !~ /^\s*$/)
+ {
+ my $spaces;
+ ($element, $line, $spaces) = next_bracketed($line, $line_nr);
+ if ($element =~ /^\{/)
+ {
+ $table_width++;
+ }
+ else
+ {
+ echo_error ("garbage in multitable specification: $element", $line_nr);
+ }
+ }
+ }
+ return ($table_width);
+}
+
+sub end_format($$$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $format = shift;
+ my $line_nr = shift;
+ #print STDERR "END FORMAT $format\n";
+ #dump_stack($text, $stack, $state);
+ #sleep 1;
+ close_menu($text, $stack, $state, $line_nr) if ($format_type{$format} eq 'menu');
+ if (($format_type{$format} eq 'list') or ($format_type{$format} eq 'table'))
+ { # those functions return if they detect an inapropriate context
+ add_item($text, $stack, $state, $line_nr, '', 1); # handle lists
+ add_term($text, $stack, $state, $line_nr, 1); # handle table
+ add_line($text, $stack, $state, $line_nr, 1); # handle table
+ add_row($text, $stack, $state, $line_nr); # handle multitable
+ }
+
+ #print STDERR "END_FORMAT\n";
+ #dump_stack($text, $stack, $state);
+
+ my $format_ref = pop @$stack;
+
+ # debug
+ if (!defined($format_ref->{'text'}))
+ {
+ push @$stack, $format_ref;
+ print STDERR "Bug: text undef in end_format $format\n";
+ dump_stack($text, $stack, $state);
+ pop @$stack;
+ }
+
+ if (defined($Texi2HTML::Config::def_map{$format}))
+ {
+ close_stack($text, $stack, $state, $line_nr, undef, 'deff_item') unless ($format_ref->{'format'} eq 'deff_item');
+ add_prev($text, $stack, &$Texi2HTML::Config::def_item($format_ref->{'text'}));
+ $format_ref = pop @$stack; # pop deff
+ if (!defined($format_ref->{'format'}) or !defined($Texi2HTML::Config::def_map{$format_ref->{'format'}}))
+ {
+ print STDERR "Bug: not a def* under deff_item\n";
+ push (@$stack, $format_ref);
+ dump_stack($text, $stack, $state);
+ pop @$stack;
+ }
+ elsif ($format_ref->{'format'} ne $format)
+ {
+ echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr);
+ }
+ add_prev($text, $stack, &$Texi2HTML::Config::def($format_ref->{'text'}));
+ }
+ elsif ($format_type{$format} eq 'cartouche')
+ {
+ add_prev($text, $stack, &$Texi2HTML::Config::cartouche($format_ref->{'text'}));
+ }
+ elsif ($format eq 'float')
+ {
+ if (!defined($state->{'float'}))
+ {
+ echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr);
+ }
+ else
+ {
+ my ($caption_lines, $shortcaption_lines) = &$Texi2HTML::Config::caption_shortcaption($state->{'float'});
+ my ($caption_text, $shortcaption_text);
+ $caption_text = substitute_text(duplicate_state($state), @$caption_lines) if (defined($caption_lines));
+ $shortcaption_text = substitute_text(duplicate_state($state), @$shortcaption_lines) if (defined($shortcaption_lines));
+ add_prev($text, $stack, &$Texi2HTML::Config::float($format_ref->{'text'}, $state->{'float'}, $caption_text, $shortcaption_text));
+ delete $state->{'float'};
+ }
+ }
+ elsif ($format_type{$format} eq 'menu')
+ {
+ if ($state->{'preformatted'})
+ {
+ # end the fake complex format
+ $state->{'preformatted'}--;
+ pop @{$state->{'preformatted_stack'}};
+ pop @$stack;
+ }
+ $state->{'menu'}--;
+ add_prev($text, $stack, &$Texi2HTML::Config::menu($format_ref->{'text'}));
+ }
+ elsif ($format_type{$format} eq 'complex')
+ {
+ $state->{'preformatted'}--;
+ pop @{$state->{'preformatted_stack'}};
+ # debug
+ if (!defined($Texi2HTML::Config::complex_format_map->{$format_ref->{'format'}}->{'begin'}))
+ {
+ print STDERR "Bug undef $format_ref->{'format'}" . "->{'begin'} (for $format...)\n";
+ dump_stack ($text, $stack, $state);
+ }
+ #print STDERR "before $format\n";
+ #dump_stack ($text, $stack, $state);
+ add_prev($text, $stack, &$Texi2HTML::Config::complex_format($format_ref->{'format'}, $format_ref->{'text'}));
+ #print STDERR "after $format\n";
+ #dump_stack ($text, $stack, $state);
+ }
+ elsif (($format_type{$format} eq 'table') or ($format_type{$format} eq 'list'))
+ {
+ #print STDERR "CLOSE $format ($format_ref->{'format'})\n$format_ref->{'text'}\n";
+ pop @{$state->{'format_stack'}};
+ #dump_stack($text, $stack, $state);
+ if ($format_ref->{'format'} ne $format)
+ {
+ echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr);
+ }
+ if ($Texi2HTML::Config::format_map{$format})
+ { # table or list has a simple format
+ add_prev($text, $stack, end_simple_format($format_ref->{'format'}, $format_ref->{'text'}));
+ }
+ else
+ { # table or list handler defined by the user
+ add_prev($text, $stack, &$Texi2HTML::Config::table_list($format_ref->{'format'}, $format_ref->{'text'}, $format_ref->{'command'}));
+ }
+ }
+ elsif ($format eq 'quotation')
+ {
+ my $quotation_args = pop @{$state->{'quotation_stack'}};
+ add_prev($text, $stack, &$Texi2HTML::Config::quotation($format_ref->{'text'}, $quotation_args->{'text'}, $quotation_args->{'style_texi'}, $quotation_args->{'style_id'}));
+ }
+ elsif ($format_type{$format} eq 'paragraph_style')
+ {
+ if ($state->{'paragraph_style'}->[-1] eq $format)
+ {
+ pop @{$state->{'paragraph_style'}};
+ }
+ add_prev($text, $stack, &$Texi2HTML::Config::paragraph_style_command($format_ref->{'format'},$format_ref->{'text'}));
+ }
+ elsif (exists($Texi2HTML::Config::format_map{$format}))
+ {
+ if ($format_ref->{'format'} ne $format)
+ { # FIXME hasn't that case been handled before ?
+ echo_warn ("Waiting for \@end $format_ref->{'format'}, found \@end $format", $line_nr);
+ }
+ add_prev($text, $stack, end_simple_format($format_ref->{'format'}, $format_ref->{'text'}));
+ }
+ else
+ {
+ echo_warn("Unknown format $format", $line_nr);
+ }
+ # We restart the preformatted format which was stopped by the format
+ # if in preformatted
+ if (automatic_preformatted($state,$format))
+ {
+ #print STDERR "restart preformatted, $format\n";
+ begin_paragraph($stack, $state);
+ }
+}
+
+sub do_text($;$)
+{
+ my $text = shift;
+ my $state = shift;
+ return $text if ($state->{'keep_texi'});
+ if (defined($state) and !$state->{'preformatted'} and !$state->{'code_style'})
+ {
+ # in normal text `` and '' serve as quotes, --- is for a long dash
+ # and -- for a medium dash.
+ # (see texinfo.txi, @node Conventions)
+ $text = &$Texi2HTML::Config::normal_text($text);
+ }
+ if ($state->{'no_protection'})
+ {
+ return $text;
+ }
+ return &$Texi2HTML::Config::protect_text($text);
+}
+
+sub end_simple_format($$)
+{
+ my $tag = shift;
+ my $text = shift;
+
+ my $element = $Texi2HTML::Config::format_map{$tag};
+ return &$Texi2HTML::Config::format($tag, $element, $text);
+}
+
+sub close_menu($$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ if ($state->{'menu_comment'})
+ {
+ #print STDERR "close MENU_COMMENT Before close_stack\n";
+ #dump_stack($text, $stack, $state);
+ close_stack($text, $stack, $state, $line_nr, undef, 'menu_comment');
+ # close_paragraph isn't needed in most cases, but A preformatted may
+ # appear after close_stack if we closed a format, as formats reopen
+ # preformatted. However it is empty and close_paragraph will remove it
+ close_paragraph($text, $stack, $state);
+ my $menu_comment = pop @$stack;
+ if (!$menu_comment->{'format'} or $menu_comment->{'format'} ne 'menu_comment')
+ {
+ warn "Bug waiting for menu_comment, got $menu_comment->{'format'}\n";
+ dump_stack($text, $stack, $state);
+ }
+ add_prev($text, $stack, &$Texi2HTML::Config::menu_comment($menu_comment->{'text'}));
+ pop @{$state->{'preformatted_stack'}};
+ $state->{'preformatted'}--;
+ $state->{'menu_comment'}--;
+ }
+ if ($state->{'menu_entry'})
+ {
+ close_stack($text, $stack,$state, $line_nr, undef, 'menu_description');
+ my $descr = pop(@$stack);
+ print STDERR "# close_menu: close description\n" if ($T2H_DEBUG & $DEBUG_MENU);
+ add_prev($text, $stack, menu_description($descr->{'text'}, $state));
+ delete $state->{'menu_entry'};
+ }
+}
+
+# Format menu link, the
+sub do_menu_link($$;$)
+{
+ my $state = shift;
+ my $line_nr = shift;
+ my $simple = shift;
+ my $menu_entry = $state->{'menu_entry'};
+ my $file = $state->{'element'}->{'file'};
+ my $node_name = normalise_node($menu_entry->{'node'});
+
+ my $substitution_state = duplicate_state($state);
+ my $name = substitute_line($menu_entry->{'name'}, $substitution_state);
+ my $node = substitute_line($menu_entry->{'node'}, $substitution_state);
+
+ if (($name ne '') and !$state->{'preformatted'} and $Texi2HTML::Config::AVOID_MENU_REDUNDANCY)
+ {
+ $name = '' unless (clean_text(remove_texi($menu_entry->{'name'}))
+ ne clean_text(remove_texi($menu_entry->{'node'})))
+ }
+
+ my $entry = '';
+ my $href;
+ my $element = $nodes{$node_name};
+ if ($element->{'seen'})
+ {
+ if ($element->{'with_section'})
+ {
+ $element = $element->{'with_section'};
+ }
+
+ #print STDERR "SUBHREF in menu for $element->{'texi'}\n";
+ $href = href($element, $file);
+ if (! $element->{'node'})
+ {
+ $entry = $element->{'text'}; # this is the section name without number
+ $entry = $element->{'name'} if (!$Texi2HTML::Config::NUMBER_SECTIONS);
+ $entry = "$Texi2HTML::Config::MENU_SYMBOL $entry" if (($entry ne '') and (!defined($element->{'number'}) or ($element->{'number'} =~ /^\s*$/)) and $Texi2HTML::Config::UNNUMBERED_SYMBOL_IN_MENU);
+ }
+ }
+ elsif ($menu_entry->{'node'} =~ /^\s*\(.*\)/ or $novalidate)
+ {#FIXME this is wrong for $novalidate
+ # menu entry points to another info manual
+ #$href = $nodes{$node_name}->{'file'};
+ $href = do_external_href($node_name);
+ }
+ else
+ {
+ echo_error ("Unknown node in menu entry `$node_name'", $line_nr);
+ }
+ return &$Texi2HTML::Config::menu_link($entry, $state, $href, $node, $name, $menu_entry->{'ending'}) unless ($simple);
+ return &$Texi2HTML::Config::simple_menu_link($entry, $state->{'preformatted'}, $href, $node, $name, $menu_entry->{'ending'});
+}
+
+sub menu_description($$)
+{
+ my $descr = shift;
+ my $state = shift;
+ my $menu_entry = $state->{'menu_entry'};
+ my $node_name = normalise_node($menu_entry->{'node'});
+
+ my $element = $nodes{$node_name};
+ if ($element->{'seen'})
+ {
+ if ($element->{'with_section'})
+ {
+ $element = $element->{'with_section'};
+ }
+ if ($Texi2HTML::Config::AVOID_MENU_REDUNDANCY && ($descr ne '') && !$state->{'preformatted'})
+ {
+ $descr = '' if (clean_text($element->{'name'}) eq clean_text($descr));
+ }
+ }
+ return &$Texi2HTML::Config::menu_description($descr, $state);
+}
+
+sub clean_text($)
+{
+ my $text = shift;
+ $text =~ s/[^\w]//g;
+ return $text;
+}
+
+sub do_xref($$$$)
+{
+ my $macro = shift;
+ #my $text = shift;
+ my $args = shift;
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ my $result = '';
+ #$text =~ s/\s+/ /gos; # remove useless spaces and newlines
+ #my @args = split(/\s*,\s*/, $text);
+ my @args = @$args;
+ #print STDERR "DO_XREF: $macro\n";
+ my $j = 0;
+ for ($j = 0; $j <= $#$args; $j++)
+ {
+ $args[$j] = normalise_space($args[$j]);
+ # print STDERR " ($j)$args[$j]\n";
+ }
+ #$args[0] = normalise_space($args[0]);
+ $args[0] = '' if (!defined($args[0]));
+ my $node_texi = normalise_node($args[0]);
+ # a ref to a node in an info manual
+ if ($args[0] =~ s/^\(([^\)]+)\)\s*//)
+ {
+ if ($macro eq 'inforef')
+ {
+ $args[2] = $1 unless ($args[2]);
+ }
+ else
+ {
+ $args[3] = $1 unless ($args[3]);
+ }
+ }
+ if (($macro ne 'inforef') and $args[3])
+ {
+ $node_texi = "($args[3])" . normalise_node($args[0]);
+ }
+
+ if ($macro eq 'inforef')
+ {
+ if ((@args < 1) or ($args[0] eq ''))
+ {
+ echo_error ("Need a node name for \@$macro", $line_nr);
+ return '';
+ }
+ if (@args > 3)
+ {
+ echo_warn ("Too much arguments for \@$macro", $line_nr);
+ }
+ $args[2] = '' if (!defined($args[2]));
+ $args[1] = '' if (!defined($args[1]));
+ $node_texi = "($args[2])$args[0]";
+ }
+
+ my $i;
+ my $new_state = duplicate_state($state);
+ $new_state->{'keep_texi'} = 0;
+ $new_state->{'keep_nr'} = 0;
+ for ($i = 0; $i < 5; $i++)
+ {
+ $args[$i] = substitute_line($args[$i], $new_state);
+ }
+ #print STDERR "(@args)\n";
+
+ if (($macro eq 'inforef') or ($args[3] ne '') or ($args[4] ne ''))
+ {# external ref
+ if ($macro eq 'inforef')
+ {
+ $macro = 'xref';
+ $args[3] = $args[2];
+ }
+ my $href = '';
+ my $node_file = '';
+ if ($args[3] ne '')
+ {
+ $href = do_external_href($node_texi);
+ $node_file = "($args[3])$args[0]";
+ }
+ my $section = '';
+ if ($args[4] ne '')
+ {
+ $section = $args[0];
+ if ($args[2] ne '')
+ {
+ $section = $args[2];
+ }
+ }
+ $result = &$Texi2HTML::Config::external_ref($macro, $section, $args[4], $node_file, $href, $args[1]);
+ }
+ else
+ {
+ my $element = $nodes{$node_texi};
+ if ($element and $element->{'seen'})
+ {
+ if ($element->{'with_section'})
+ {
+ $element = $element->{'with_section'};
+ }
+ my $file = '';
+ if (defined($state->{'element'}))
+ {
+ $file = $state->{'element'}->{'file'};
+ }
+ else
+ {
+ echo_warn ("\@$macro not in text (in anchor, node, section...)", $line_nr);
+ # if Texi2HTML::Config::SPLIT the file is '' which ensures a href with the file
+ # name. if ! Texi2HTML::Config::SPLIT the 2 file will be the same thus there
+ # won't be the file name
+ $file = $element->{'file'} unless ($Texi2HTML::Config::SPLIT);
+ }
+ #print STDERR "SUBHREF in ref `$node_texi': $_";
+ my $href = href($element, $file);
+ my $section = $args[2];
+ $section = $args[1] if ($section eq '');
+ my $name = $section;
+ my $short_name = $section;
+ if ($section eq '')
+ {
+ $name = $element->{'name'};
+ $short_name = $args[0];
+ }
+ $result = &$Texi2HTML::Config::internal_ref ($macro, $href, $short_name, $name, $element->{'section'});
+ }
+ else
+ {
+ if (($node_texi eq '') or !$novalidate)
+ {
+ echo_error ("Undefined node `$node_texi' in \@$macro", $line_nr);
+ my $text = '';
+ for (my $i = 0; $i < @$args -1; $i++)
+ {
+ $text .= $args->[$i] .',';
+ }
+ $text .= $args->[-1];
+ $result = "\@$macro"."{${text}}";
+ }
+ else
+ {
+ $result = &$Texi2HTML::Config::external_ref($macro, '', '', $args[0], do_external_href($node_texi), $args[1]);
+ }
+ }
+ }
+ return $result;
+}
+
+sub do_acronym_like($$$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my $acronym_texi = shift @$args;
+ my $explanation = shift @$args;
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ my $explanation_lines;
+ my $explanation_text;
+ my $explanation_unformatted;
+
+ if (defined($explanation))
+ {
+ $explanation =~ s/^\s*//;
+ $explanation =~ s/\s*$//;
+ $explanation = undef if ($explanation eq '');
+ }
+ $acronym_texi =~ s/^\s*//;
+ $acronym_texi =~ s/\s*$//;
+
+ return '' if ($acronym_texi eq '');
+
+ my $with_explanation = 0;
+ my $normalized_text = cross_manual_line (normalise_node($acronym_texi));
+ if (defined($explanation))
+ {
+ $with_explanation = 1;
+ $acronyms_like{$command}->{$normalized_text} = $explanation;
+ }
+ elsif (exists($acronyms_like{$command}->{$normalized_text}))
+ {
+ $explanation = $acronyms_like{$command}->{$normalized_text};
+ }
+
+ if (defined($explanation))
+ {
+ @$explanation_lines = map {$_ = $_."\n"} split (/\n/, $explanation);
+ my $text = '';
+ foreach my $line(@$explanation_lines)
+ {
+ $line .= ' ' if (chomp ($line));
+ $text .= $line
+ }
+ $text =~ s/ $//;
+ my $unformatted_state = duplicate_state($state);
+ $unformatted_state->{'unformatted'} = 1;
+ $explanation_unformatted = substitute_line($text, $unformatted_state);
+ $explanation_text = substitute_line($text, duplicate_state($state));
+ }
+ return &$Texi2HTML::Config::acronym_like($command, $acronym_texi, substitute_line ($acronym_texi, duplicate_state($state)),
+ $with_explanation, $explanation_lines, $explanation_text, $explanation_unformatted);
+}
+
+sub do_caption_shortcaption($$$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my $text = $args->[0];
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ if (!exists($state->{'float'}))
+ {
+#dump_stack(\"", [], $state);
+ echo_error("\@$command outside of float", $line_nr);
+ return '';
+ }
+ my $float = $state->{'float'};
+ my @texi_lines = map {$_ = $_."\n"} split (/\n/, $text);
+ $float->{"${command}_texi"} = \@texi_lines;
+ return '';
+}
+
+sub do_float_line($$$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my @args = @$args;
+ my $style_texi = shift @args;
+ my $label_texi = shift @args;
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ $style_texi = undef if (defined($style_texi) and $style_texi=~/^\s*$/);
+ $label_texi = undef if (defined($label_texi) and $label_texi=~/^\s*$/);
+ if (defined($label_texi))
+ {
+ #my $id = cross_manual_line($label_texi);
+ $state->{'float'} = $nodes{normalise_node($label_texi)};
+ #print STDERR "float: $state->{'float'}, $state->{'float'}->{'texi'}\n";
+ }
+ else
+ {
+ $state->{'float'} = { 'float' => 1 };
+ if (defined($style_texi))
+ {
+ $state->{'float'}->{'style_texi'} = normalise_space($style_texi);
+ $state->{'float'}->{'style_id'} = cross_manual_line($style_texi);
+ $state->{'float'}->{'style'} = substitute_line($style_texi);
+ }
+ #print STDERR "float: (no label) $state->{'float'}\n";
+ }
+ return '';
+}
+
+sub do_quotation_line($$$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my @args = @$args;
+ my $style_texi = shift @args;
+ my $text_texi = shift @args;
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $text;
+
+ $style_texi = undef if (defined($style_texi) and $style_texi=~/^\s*$/);
+ $text_texi = undef if (defined($text_texi) and $text_texi=~/^\s*$/);
+ if (defined($style_texi) and !defined($text_texi))
+ {
+ $text_texi = $style_texi;
+ $style_texi = undef;
+ }
+ if (defined($text_texi))
+ {
+ $text = substitute_line($text_texi, duplicate_state($state));
+ $text =~ s/\s*$//;
+ }
+ my $quotation_args = { 'style_texi' => $style_texi, 'text' => $text, 'text_texi' => $text_texi };
+ if (defined($style_texi))
+ {
+ $quotation_args->{'style_id'} = cross_manual_line(normalize_space($style_texi));
+ }
+ push @{$state->{'quotation_stack'}}, $quotation_args;
+ $state->{'prepend_text'} = &$Texi2HTML::Config::quotation_prepend_text($style_texi, $text_texi);
+ return '';
+}
+
+sub do_def_line($$$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my @args = @$args;
+ my $arguments = shift @args;
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ $state->{'deff'}->{'arguments'} = $arguments;
+ return '';
+}
+
+sub do_footnote($$$$)
+{
+ my $command = shift;
+ my $args = shift;
+ my $text = $args->[0];
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ $text .= "\n";
+ $foot_num++;
+ $relative_foot_num++;
+ my $docid = "DOCF$foot_num";
+ my $footid = "FOOT$foot_num";
+ my $from_file = '';
+ if ($state->{'element'} and $Texi2HTML::Config::SPLIT and $Texi2HTML::Config::SEPARATED_FOOTNOTES)
+ {
+ $from_file = $state->{'element'}->{'file'};
+ }
+ my %state;
+ initialise_state (\%state);
+ if ($Texi2HTML::Config::SEPARATED_FOOTNOTES)
+ {
+ $state{'element'} = $footnote_element;
+ }
+ else
+ {
+ $state{'element'} = $state->{'element'};
+ }
+ my $file = '';
+ $file = $docu_foot if ($Texi2HTML::Config::SPLIT and $Texi2HTML::Config::SEPARATED_FOOTNOTES);
+
+ # FIXME use split_lines ? It seems to work like it is now ?
+ my @lines = substitute_text(\%state, map {$_ = $_."\n"} split (/\n/, $text));
+ my ($foot_lines, $foot_label) = &$Texi2HTML::Config::foot_line_and_ref ($foot_num,
+ $relative_foot_num, $footid, $docid, $from_file, $file, \@lines, $state);
+ push(@foot_lines, @{$foot_lines});
+ return $foot_label;
+}
+
+sub do_image($$$$)
+{
+ # replace images
+ my $command = shift;
+ my $args = shift;
+ my $text = $args->[0];
+ my $style_stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ $text =~ s/\s+/ /gos; # remove useless spaces and newlines
+ my @args = split (/\s*,\s*/, $text);
+ my $base = $args[0];
+ if ($base eq '')
+ {
+ echo_error ("no file argument for \@image", $line_nr);
+ #warn "$ERROR no file argument for \@image\n";
+ return '';
+ }
+ $args[4] = '' if (!defined($args[4]));
+ $args[3] = '' if (!defined($args[3]));
+ my $image;
+ my $file_name;
+ $image = locate_include_file("$base.$args[4]") if (defined($args[4]) and ($args[4] ne ''));
+ if (defined($image))
+ {
+ $file_name = "$base.$args[4]";
+ }
+ elsif ($image = locate_include_file("$base.png"))
+ {
+ $file_name = "$base.png";
+ }
+ elsif ($image = locate_include_file("$base.jpg"))
+ {
+ $file_name = "$base.jpg";
+ }
+ elsif ($image = locate_include_file("$base.gif"))
+ {
+ $file_name = "$base.gif";
+ }
+ else
+ {
+ $image = "$base.jpg";
+ $image = "$base.$args[4]" if (defined($args[4]) and ($args[4] ne ''));
+ $file_name = $image;
+ echo_error ("no image file for $base, (using $image)", $line_nr);
+ #warn "$ERROR no image file for $base, (using $image) : $text\n";
+ } # FIXME use full file name for alt instead of base when there is no
+ # alttext ?
+ if ($args[3] =~ /\S/)
+ {
+ # FIXME makeinfo don't do that.
+ $args[3] = do_text($args[3]);
+ $base = $args[3] if ($args[3] =~ /\S/);
+ }
+ return &$Texi2HTML::Config::image(
+ &$Texi2HTML::Config::protect_text($path_to_working_dir . $image),
+ &$Texi2HTML::Config::protect_text($base),
+ $state->{'preformatted'}, &$Texi2HTML::Config::protect_text($file_name));
+}
+
+sub duplicate_state($)
+{
+ my $state = shift;
+ my $new_state = { 'element' => $state->{'element'},
+ 'preformatted' => $state->{'preformatted'},
+ 'code_style' => $state->{'code_style'},
+ 'keep_texi' => $state->{'keep_texi'},
+ 'keep_nr' => $state->{'keep_nr'},
+ 'preformatted_stack' => $state->{'preformatted_stack'}
+ };
+ return $new_state;
+}
+
+sub expand_macro($$$$$)
+{
+ my $name = shift;
+ my $args = shift;
+ my $end_line = shift;
+ my $line_nr = shift;
+ my $state = shift;
+
+ my $index = 0;
+ foreach my $arg (@$args)
+ { # expand @macros in arguments
+ $args->[$index] = substitute_text({'texi' => 1, 'arg_expansion' => 1}, split_lines($arg));
+ $index++;
+ }
+ my $macrobody = $macros->{$name}->{'Body'};
+ my $formal_args = $macros->{$name}->{'Args'};
+ my $args_index = $macros->{$name}->{'Args_index'};
+ my $i;
+
+ die "Bug end_line not defined" if (!defined($end_line));
+
+ for ($i=0; $i<=$#$formal_args; $i++)
+ {
+ $args->[$i] = "" unless (defined($args->[$i]));
+ print STDERR "# arg($i): $args->[$i]\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ }
+ echo_error ("too much arguments for macro $name", $line_nr) if (defined($args->[$i + 1]));
+ #warn "$ERROR too much arguments for macro $name" if (defined($args->[$i + 1]));
+ my $result = '';
+ while ($macrobody)
+ {
+ if ($macrobody =~ s/^([^\\]*)\\//o)
+ {
+ $result .= $1 if defined($1);
+ if ($macrobody =~ s/^\\//)
+ {
+ $result .= '\\';
+ }
+ elsif ($macrobody =~ s/^(\@end\sr?macro)$// or $macrobody =~ s/^(\@end\sr?macro\s)// or $macrobody =~ s/^(\@r?macro\s+\w+\s*.*)//)
+ { # \ protect @end macro
+ $result .= $1;
+ }
+ elsif ($macrobody =~ s/^([^\\]*)\\//)
+ {
+ my $arg = $1;
+ if (defined($args_index->{$arg}))
+ {
+ $result .= $args->[$args_index->{$arg}];
+ }
+ else
+ {
+ warn "$ERROR \\ not followed by \\ or an arg but by $arg in macro\n";
+ $result .= '\\' . $arg;
+ }
+ }
+ next;
+ }
+ $result .= $macrobody;
+ last;
+ }
+ #$result .= $end_line;
+ my @result = split(/^/m, $result);
+ #my $first_line = shift (@result);
+ if ($state->{'arg_expansion'})
+ {
+ unshift @{$state->{'spool'}}, (@result, $end_line);
+ }
+ else
+ {
+ unshift @{$input_spool->{'spool'}}, (@result, $end_line);
+ $input_spool->{'macro'} = $name if ($input_spool->{'macro'} eq '');
+ }
+ if ($T2H_DEBUG & $DEBUG_MACROS)
+ {
+ print STDERR "# macro expansion result:\n";
+ #print STDERR "$first_line";
+ foreach my $line (@result)
+ {
+ print STDERR "$line";
+ }
+ print STDERR "# macro expansion result end\n";
+ }
+ #return $first_line;
+}
+
+sub do_index_summary_file($)
+{
+ my $name = shift;
+ my ($Pages, $Entries) = get_index($name);
+ &$Texi2HTML::Config::index_summary_file_begin ($name, $printed_indices{$name});
+ #open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
+ # || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
+ #print STDERR "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
+ print STDERR "# writing $name index summary\n" if $T2H_VERBOSE;
+
+ foreach my $key (sort keys %$Entries)
+ {
+ #print FHIDX "$key\t$Entries->{$key}->{href}\n";
+ my $entry = $Entries->{$key};
+ my $label = $entry->{'element'};
+ my $entry_element = $label;
+ # notice that we use the section associated with a node even when
+ # there is no with_section, i.e. when there is another node preceding
+ # the sectionning command.
+ # However when it is the Top node, we use the node instead.
+ # (for the Top node, 'section_ref' is himself, and 'as_section' is
+ # true)
+ $entry_element = $entry_element->{'section_ref'} if ($entry_element->{'node'} and $entry_element->{'section_ref'} and !$entry_element->{'section_ref'}->{'as_section'});
+ my $origin_href = $entry->{'file'};
+ #print STDERR "$entry $entry->{'entry'}, real elem $label->{'texi'}, section $entry_element->{'texi'}, real $label->{'file'}, entry file $entry->{'file'}\n";
+ if ($entry->{'label'})
+ {
+ $origin_href .= '#' . $entry->{'label'};
+ }
+ else
+ {
+ # If the $label element and the $index entry are on the same
+ # file the label is prefered. If they aren't on the same file
+ # the entry id is choosed as it means that the label element
+ # and the index entry are separated by a printindex.
+ print STDERR "id undef ($entry) entry: $entry->{'entry'}, label: $label->{'text'}\n" if (!defined($entry->{'id'}));
+ if ($entry->{'file'} eq $label->{'file'})
+ {
+ $origin_href .= '#' . $label->{'id'};
+ }
+ else
+ {
+ $origin_href .= '#' . $entry->{'id'} ;
+ }
+ }
+ #print STDERR "SUBHREF in index summary file for $entry_element->{'texi'}\n";
+ #print FHIDX '' .
+ &$Texi2HTML::Config::index_summary_file_entry ($name,
+ $key, $origin_href,
+ substitute_line($entry->{'entry'}), $entry->{'entry'},
+ href($entry_element, ''),
+ $entry_element->{'text'},
+ $printed_indices{$name});
+ }
+ &$Texi2HTML::Config::index_summary_file_end ($name, $printed_indices{$name});
+}
+
+sub do_index_page($$;$)
+{
+ my $index_elements = shift;
+ my $nr = shift;
+ my $page = shift;
+ my $index_element = $index_elements->[$nr];
+ my $summary = do_index_summary($index_element->{'element'}, $index_elements);
+ my $entries = do_index_entries($index_element->{'element'}, $index_element->{'page'}, $index_element->{'name'});
+ return $summary . $entries . $summary;
+}
+
+sub do_index_summary($$)
+{
+ my $element = shift;
+ my $index_elements = shift;
+
+ my @letters;
+ my @symbols;
+
+ for my $index_element_item (@$index_elements)
+ {
+ my $index_element = $index_element_item->{'element'};
+ my $file = '';
+ $file .= $index_element->{'file'} if ($index_element->{'file'} ne $element->{'file'});
+ my $index = 0;
+ for my $letter (@{$index_element_item->{'page'}->{Letters}})
+ {
+ if ($letter =~ /^[A-Za-z]/)
+ {
+ push @letters, &$Texi2HTML::Config::summary_letter($letter, $file, "$index_element->{'id'}" . "_$index");
+ }
+ else
+ {
+ push @symbols, &$Texi2HTML::Config::summary_letter($letter, $file, "$index_element->{'id'}" . "_$index");
+ }
+ $index++;
+ }
+ }
+ return &$Texi2HTML::Config::index_summary(\@letters, \@symbols);
+}
+
+sub do_index_entries($$$)
+{
+ my $element = shift;
+ my $page = shift;
+ my $name = shift;
+
+ my $letters = '';
+ my $index = 0;
+ for my $letter (@{$page->{'Letters'}})
+ {
+ my $entries = '';
+ for my $entry (@{$page->{'EntriesByLetter'}->{$letter}})
+ {
+ my $label = $entry->{'element'};
+ my $entry_element = $label;
+ # notice that we use the section associated with a node even when
+ # there is no with_section, i.e. when there is another node preceding
+ # the sectionning command.
+ # However when it is the Top node, we use the node instead.
+ # (for the Top node, 'section_ref' is himself, and 'as_section' is
+ # true)
+ $entry_element = $entry_element->{'section_ref'} if ($entry_element->{'node'} and $entry_element->{'section_ref'} and !$entry_element->{'section_ref'}->{'as_section'});
+ my $origin_href = '';
+ $origin_href = $entry->{'file'} if ($Texi2HTML::Config::SPLIT and $entry->{'file'} ne $element->{'file'});
+ #print STDERR "$entry $entry->{'entry'}, real elem $label->{'texi'}, section $entry_element->{'texi'}, real $label->{'file'}, entry file $entry->{'file'}\n";
+ if ($entry->{'label'})
+ {
+ $origin_href .= '#' . $entry->{'label'};
+ }
+ else
+ {
+ # If the $label element and the $index entry are on the same
+ # file the label is prefered. If they aren't on the same file
+ # the entry id is choosed as it means that the label element
+ # and the index entry are separated by a printindex.
+ print STDERR "id undef ($entry) entry: $entry->{'entry'}, label: $label->{'text'}\n" if (!defined($entry->{'id'}));
+ if ($entry->{'file'} eq $label->{'file'})
+ {
+ $origin_href .= '#' . $label->{'id'};
+ }
+ else
+ {
+ $origin_href .= '#' . $entry->{'id'} ;
+ }
+ }
+ #print STDERR "SUBHREF in index for $entry_element->{'texi'}\n";
+ $entries .= &$Texi2HTML::Config::index_entry ($origin_href,
+ substitute_line($entry->{'entry'}),
+ href($entry_element, $element->{'file'}),
+ $entry_element->{'text'});
+ }
+ $letters .= &$Texi2HTML::Config::index_letter ($letter, "$element->{'id'}" . "_$index", $entries);
+ $index++;
+ }
+ return &$Texi2HTML::Config::print_index($letters, $name);
+}
+
+# remove texi commands, replacing with what seems adequate. see simple_map_texi
+# and texi_map.
+# Doesn't protect html
+sub remove_texi(@)
+{
+ return substitute_text ({ 'remove_texi' => 1, 'no_protection' => 1 }, @_);
+}
+
+# Same as remove texi but protect text and use special maps for @-commands
+sub unformatted_text($@)
+{
+ my $state = shift;
+ $state = {} if (!defined($state));
+ $state->{'remove_texi'} = 1;
+ $simple_map_texi_ref = \%Texi2HTML::Config::unformatted_text_simple_map_texi;
+ $style_map_texi_ref = \%Texi2HTML::Config::unformatted_text_style_map_texi;
+ $texi_map_ref = \%Texi2HTML::Config::unformatted_text_texi_map;
+ my $text = substitute_text ($state, @_);
+ $simple_map_texi_ref = \%Texi2HTML::Config::simple_map_texi;
+ $style_map_texi_ref = \%Texi2HTML::Config::style_map_texi;
+ $texi_map_ref = \%Texi2HTML::Config::texi_map;
+ return $text;
+}
+
+sub enter_table_index_entry($$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ if ($state->{'item'} and ($state->{'table_stack'}->[-1] =~ /^(v|f)table$/))
+ {
+ my $index = $1;
+ my $macro = $state->{'item'};
+ delete $state->{'item'};
+ close_stack($text, $stack, $state, $line_nr, undef, 'index_item');
+ my $item = pop @$stack;
+ my $element = $state->{'element'};
+ $element = $state->{'node_ref'} unless ($element);
+ #print STDERR "enter_table_index_entry $item->{'text'}";
+ enter_index_entry($index, $line_nr, $item->{'text'}, $state->{'place'}, $element, 0);
+ add_prev($text, $stack, "\@$macro" . $item->{'text'});
+ }
+}
+
+sub scan_texi($$$$;$)
+{
+ my $line = shift;
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ die "stack not an array ref" unless (ref($stack) eq "ARRAY");
+ local $_ = $line;
+
+ while(1)
+ {
+ # scan_texi
+ #print STDERR "WHILE:$_";
+ #dump_stack($text, $stack, $state);
+
+ # In ignored region
+ if ($state->{'ignored'})
+ {
+ my $line;
+ if (s/^(.*?\@end\s+$state->{'ignored'})//)
+ {
+ $line = $1;
+ if (s/^$// or s/(\s+)//)
+ {
+ $line = $line . $1 if (defined($1));
+ }
+ elsif (/[^\@]/)
+ {
+ $_ .= $line;
+ $line = undef;
+ }
+ }
+ if (defined($line))
+ {
+ delete $state->{'ignored'};
+ #dump_stack($text, $stack, $state);
+ # MACRO_ARG => keep ignored text
+ if ($state->{'arg_expansion'})
+ {
+ #add_prev ($text, $stack, $1);
+ add_prev ($text, $stack, $line);
+ next;
+ }
+ return if /^\s*$/o;
+ next;
+ }
+ add_prev ($text, $stack, $_) if ($state->{'arg_expansion'});
+ return;
+ }
+
+ # in macro definition
+ if (defined($state->{'macro'}))
+ {
+ if (s/^([^\\\@]*\\)//)
+ {# I believe it is correct, although makeinfo don't do that.
+ $state->{'macro'}->{'Body'} .= $1;
+ if (s/^\\//)
+ {
+ $state->{'macro'}->{'Body'} .= '\\';
+ next;
+ }
+ elsif (s/^(\@end\sr?macro)$//o or s/^(\@end\sr?macro\s)//o
+ or s/^(\@r?macro\s+\w+\s*.*)//o)
+ {
+ $state->{'macro'}->{'Body'} .= $1;
+ next;
+ }
+ }
+ #if (s/^(.*?)\@end\sr?macro$//o or s/^(.*?)\@end\sr?macro\s+//o)
+ if (s/^(\@end\sr?macro)$//o or s/^(\@end\sr?macro\s+)//o)
+ {
+ $state->{'macro_inside'}--;
+ if ($state->{'macro_inside'})
+ {
+ $state->{'macro'}->{'Body'} .= $1;
+ next;
+ }
+ #$state->{'macro'}->{'Body'} .= $1 if defined($1) ;
+ chomp $state->{'macro'}->{'Body'};
+ print STDERR "# end macro def. Body:\n$state->{'macro'}->{'Body'}"
+ if ($T2H_DEBUG & $DEBUG_MACROS);
+ delete $state->{'macro'};
+ return if (/^\s*$/);
+ next;
+ }
+ elsif(/^(\@r?macro\s+\w+\s*.*)/)
+ {
+ $state->{'macro'}->{'Body'} .= $_;
+ $state->{'macro_inside'}++;
+ return;
+ }
+ elsif (s/^\@(.)//)
+ {
+ $state->{'macro'}->{'Body'} .= '@' . $1;
+ next;
+ }
+ elsif (s/^\@//)
+ {
+ $state->{'macro'}->{'Body'} .= '@';
+ next;
+ }
+ else
+ {
+ s/([^\@\\]*)//;
+ $state->{'macro'}->{'Body'} .= $1 if (defined($1));
+ if (/^$/)
+ {
+ $state->{'macro'}->{'Body'} .= $_;
+ return;
+ }
+ next;
+ #$state->{'macro'}->{'Body'} .= $_ if defined($_) ;
+ #return;
+ }
+ }
+ # in macro arguments parsing/expansion
+ if (defined($state->{'macro_name'}))
+ {
+ my $special_chars = quotemeta ('\{}');
+ my $multi_args = 0;
+ my $formal_args = $macros->{$state->{'macro_name'}}->{'Args'};
+ $multi_args = 1 if ($#$formal_args >= 1);
+ $special_chars .= quotemeta(',') if ($multi_args);
+ if ($state->{'macro_args'}->[-1] eq '')
+ {
+ s/^\s*//o;
+ }
+ if (s/^([^$special_chars]*)([$special_chars])//)
+ {
+ $state->{'macro_args'}->[-1] .= $1 if defined($1);
+ # \ protects any character in macro arguments
+ if ($2 eq '\\')
+ {
+ print STDERR "# macro call: protected char\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ if (s/^(.)//)
+ {
+ $state->{'macro_args'}->[-1] .= $1;
+ }
+ else
+ {
+ $state->{'macro_args'}->[-1] .= '\\';
+ }
+ }
+ elsif ($2 eq ',')
+ { # separate args
+ print STDERR "# macro call: new arg\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ s/^\s*//o;
+ push @{$state->{'macro_args'}}, '';
+ }
+ elsif ($2 eq '}')
+ { # balanced } ends the macro call, otherwise it is in the arg
+ $state->{'macro_depth'}--;
+ if ($state->{'macro_depth'} == 0)
+ {
+ print STDERR "# expanding macro $state->{'macro_name'}\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ $_ = expand_macro($state->{'macro_name'}, $state->{'macro_args'}, $_, $line_nr, $state);
+ delete $state->{'macro_name'};
+ delete $state->{'macro_depth'};
+ delete $state->{'macro_args'};
+ return;
+ }
+ else
+ {
+ print STDERR "# macro call: closing }\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ add_text('}', \$state->{'macro_args'}->[-1]);
+ }
+ }
+ elsif ($2 eq '{')
+ {
+ print STDERR "# macro call: opening {\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ $state->{'macro_depth'}++;
+ add_text('{', \$state->{'macro_args'}->[-1]);
+ }
+ next;
+ }
+ print STDERR "# macro call: end of line\n" if ($T2H_DEBUG & $DEBUG_MACROS);
+ $state->{'macro_args'}->[-1] .= $_;
+ return;
+ }
+
+ # in a raw format, verbatim, tex or html
+ if ($state->{'raw'})
+ {
+ my $tag = $state->{'raw'};
+
+ # debugging
+ if (! @$stack or ($stack->[-1]->{'style'} ne $tag))
+ {
+ print STDERR "Bug: raw or special: $tag but not on top of stack\n";
+ print STDERR "line: $_";
+ dump_stack($text, $stack, $state);
+ exit 1;
+ }
+
+ if (s/^(.*?)(\@end\s$tag)$// or s/^(.*?)(\@end\s$tag\s)//)
+ {
+ add_prev ($text, $stack, $1);
+ my $end = $2;
+ my $style = pop @$stack;
+ if ($style->{'text'} !~ /^\s*$/ or $state->{'arg_expansion'})
+ {
+ my $after_macro = '';
+ $after_macro = ' ' unless (/^\s*$/);
+ add_prev ($text, $stack, $style->{'text'} . $end . $after_macro);
+ delete $state->{'raw'};
+ }
+ next;
+ }
+ else
+ {
+ add_prev ($text, $stack, $_);
+ last;
+ }
+ }
+
+ # in a @verb{ .. } macro
+ if (defined($state->{'verb'}))
+ {
+ my $char = quotemeta($state->{'verb'});
+ if (s/^(.*?)$char\}/\}/)
+ {
+ add_prev($text, $stack, $1 . $state->{'verb'});
+ $stack->[-1]->{'text'} = $state->{'verb'} . $stack->[-1]->{'text'};
+ delete $state->{'verb'};
+ next;
+ }
+ else
+ {
+ add_prev($text, $stack, $_);
+ last;
+ }
+ }
+
+ # an @end tag
+ if (s/^([^{}@]*)\@end(\s+)([a-zA-Z]\w*)//)
+ {
+ add_prev($text, $stack, $1);
+ my $space = $2;
+ my $end_tag = $3;
+ if (defined($state->{'text_macro_stack'})
+ and @{$state->{'text_macro_stack'}}
+ and ($end_tag eq $state->{'text_macro_stack'}->[-1]))
+ {
+ pop @{$state->{'text_macro_stack'}};
+ # we keep menu and titlepage for the following pass
+ if ((($end_tag eq 'menu') and $text_macros{'menu'}) or ($region_lines{$end_tag}) or $state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, "\@end${space}$end_tag");
+ }
+ else
+ {
+ #print STDERR "End $end_tag\n";
+ #dump_stack($text, $stack, $state);
+ return if (/^\s*$/);
+ }
+ }
+ elsif ($text_macros{$end_tag})
+ {
+ echo_error ("\@end $end_tag without corresponding element", $line_nr);
+ }
+ else
+ {
+ add_prev($text, $stack, "\@end${space}$end_tag");
+ }
+ next;
+ }
+ elsif (s/^([^{}@]*)\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])//o or s/^([^{}@]*)\@([a-zA-Z]\w*)([\s\{\}\@])/$3/o or s/^([^{}@]*)\@([a-zA-Z]\w*)$//o)
+ {
+ add_prev($text, $stack, $1);
+ my $macro = $2;
+ #print STDERR "MACRO $macro\n";
+ $state->{'bye'} = 1 if ($macro eq 'bye');
+ if (defined($Texi2HTML::Config::misc_command{$macro}) and
+ !$Texi2HTML::Config::misc_command{$macro}->{'texi'}
+ and $macro ne 'documentencoding')
+ {
+ my ($line, $args);
+ ($_, $line, $args) = preserve_command($_, $macro);
+ add_prev ($text, $stack, $line);
+ next;
+ }
+ # pertusus: it seems that value substitution are performed after
+ # macro argument expansions: if we have
+ # @set comma ,
+ # and a call to a macro @macro {arg1 @value{comma} arg2}
+ # the macro arg is arg1 , arg2 and the comma don't separate
+ # args. Likewise it seems that the @value are not expanded
+ # in macro definitions
+
+ # track variables
+ my $value_macro = 1;
+ if ($macro eq 'set' and s/^(\s+)($VARRE)(\s+)(.*)$//o)
+ {
+ if ($state->{'arg_expansion'})
+ {
+ my $line = "\@$macro" . $1.$2.$3;
+ $line .= $4 if (defined($4));
+ add_prev($text, $stack, $line);
+ next;
+ }
+ $value{$2} = $4;
+ }
+ elsif ($macro eq 'clear' and s/^(\s+)($VARRE)//o)
+ {
+ if ($state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, "\@$macro" . $1 . $2);
+ next;
+ }
+ delete $value{$2};
+ }
+ else
+ {
+ $value_macro = 0;
+ }
+ if ($value_macro)
+ {
+ return if (/^\s*$/);
+ next;
+ }
+
+ if ($macro =~ /^r?macro$/)
+ { #FIXME what to do if 'arg_expansion' is true (ie within another
+ # macro call arguments ?
+ if (/^\s+(\w+)\s*(.*)/)
+ {
+ my $name = $1;
+ if (exists($macros->{$name}))
+ {
+ echo_warn ("macro `$name' allready defined " .
+ format_line_number($macros->{$name}->{'line_nr'}) . " redefined", $line_nr);
+ }
+ $state->{'macro_inside'} = 1;
+ my @args = ();
+ @args = split(/\s*,\s*/ , $1)
+ if ($2 =~ /^\s*{\s*(.*?)\s*}\s*/);
+ # keep the context information of the definition
+ $macros->{$name}->{'line_nr'} = { 'file_name' => $line_nr->{'file_name'},
+ 'line_nr' => $line_nr->{'line_nr'}, 'macro' => $line_nr->{'macro'} } if (defined($line_nr));
+ $macros->{$name}->{'Args'} = \@args;
+ my $arg_index = 0;
+ my $debug_msg = '';
+ foreach my $arg (@args)
+ { # when expanding macros, the argument index is retrieved
+ # with Args_index
+ $macros->{$name}->{'Args_index'}->{$arg} = $arg_index;
+ $debug_msg .= "$arg($arg_index) ";
+ $arg_index++;
+ }
+ $macros->{$name}->{'Body'} = '';
+ $state->{'macro'} = $macros->{$name};
+ print STDERR "# macro def $name: $debug_msg\n"
+ if ($T2H_DEBUG & $DEBUG_MACROS);
+ }
+ else
+ {
+ echo_error ("Bad macro defintion $_", $line_nr);
+ #warn "$ERROR Bad macro defintion $_";
+ }
+ return;
+ }
+ elsif (defined($text_macros{$macro}))
+ {
+ my $tag;
+ ($_, $tag) = do_text_macro ($macro, $_, $state, $line_nr);
+ # if it is a raw formatting command or a menu command
+ # we must keep it for later
+ my $macro_kept;
+ if ($state->{'raw'} or (($macro eq 'menu') and $text_macros{'menu'}) or (exists($region_lines{$macro})) or $state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, $tag);
+ $macro_kept = 1;
+ }
+ if ($state->{'raw'})
+ {
+ push @$stack, { 'style' => $macro, 'text' => '' };
+ }
+ next if $macro_kept;
+ #dump_stack ($text, $stack, $state);
+ return if (/^\s*$/);
+ }
+ elsif ($macro eq 'value')
+ {
+ if (s/^{($VARRE)}//)
+ {
+ if ($state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, "\@$macro" . '{' . $1 . '}');
+ next;
+ }
+ $_ = get_value($1) . $_;
+ }
+ else
+ {
+ if ($state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, "\@$macro");
+ next;
+ }
+ echo_error ("bad \@value macro", $line_nr);
+ #warn "$ERROR bad \@value macro";
+ }
+ }
+ elsif ($macro eq 'definfoenclose')
+ {
+ if ($state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, "\@$macro" . $_);
+ return;
+ }
+ if (s/^\s+([a-z]+)\s*,\s*([^\s]+)\s*,\s*([^\s]+)//)
+ {
+ $info_enclose{$1} = [ $2, $3 ];
+ }
+ else
+ {
+ echo_error("Bad \@$macro", $line_nr);
+ }
+ return if (/^\s*$/);
+ s/^\s*//;
+ }
+ elsif ($macro eq 'include')
+ {
+ if ($state->{'arg_expansion'})
+ {
+ add_prev($text, $stack, "\@$macro" . $_);
+ return;
+ }
+ #if (s/^\s+([\/\w.+-]+)//o)
+ if (s/^(\s+)(.*)//o)
+ {
+ my $file = locate_include_file($2);
+ if (defined($file))
+ {
+ open_file($file, $line_nr);
+ print STDERR "# including $file\n" if $T2H_VERBOSE;
+ }
+ else
+ {
+ echo_error ("Can't find $2, skipping", $line_nr);
+ #warn "$ERROR Can't find $1, skipping\n";
+ }
+ }
+ else
+ {
+ echo_error ("Bad include line: $_", $line_nr);
+ return;
+ } # makeinfo remove the @include but not the end of line
+ # FIXME verify if it is right
+ #return if (/^\s*$/);
+ }
+ elsif ($macro eq 'documentencoding')
+ {
+ if (s/(\s+)([0-9\w\-]+)//)
+ {
+ my $encoding = $2;
+ $Texi2HTML::Config::DOCUMENT_ENCODING = $encoding;
+ $from_encoding = set_encoding($encoding);
+ if (defined($from_encoding))
+ {
+ foreach my $file (@fhs)
+ {
+ binmode($file->{'fh'}, ":encoding($from_encoding)");
+ }
+ }
+ }
+ add_prev($text, $stack, "\@$macro" . $1 . $2);
+ }
+ elsif ($macro eq 'unmacro')
+ { #FIXME with 'arg_expansion' should it be passed unmodified ?
+ delete $macros->{$1} if (s/^\s+(\w+)//);
+ return if (/^\s*$/);
+ s/^\s*//;
+ }
+ elsif (exists($macros->{$macro}))
+ {
+ my $ref = $macros->{$macro}->{'Args'};
+ # we remove any space/new line before the argument
+ if (s/^\s*{\s*//)
+ {
+ $state->{'macro_args'} = [ "" ];
+ $state->{'macro_name'} = $macro;
+ $state->{'macro_depth'} = 1;
+ }
+ elsif ($#$ref >= 1)
+ { # no brace -> no arg
+ $_ = expand_macro ($macro, [], $_, $line_nr, $state);
+ return;
+ }
+ else
+ { # macro with one arg on the line
+ chomp $_;
+ $_ = expand_macro ($macro, [$_], "\n", $line_nr, $state);
+ return;
+ }
+ }
+ elsif ($macro eq ',')
+ {# the @, causes problems when `,' separates things (in @node, @ref)
+ $_ = "\@m_cedilla" . $_;
+ }
+ elsif (s/^{//)
+ {
+ if ($macro eq 'verb')
+ {
+ if (/^$/)
+ {
+ echo_error ("verb at end of line", $line_nr);
+ #warn "$ERROR verb at end of line";
+ }
+ else
+ {
+ s/^(.)//;
+ $state->{'verb'} = $1;
+ }
+ }
+ push (@$stack, { 'style' => $macro, 'text' => '' });
+ }
+ else
+ {
+ add_prev($text, $stack, "\@$macro");
+ }
+ next;
+ }
+ #elsif(s/^([^{}@]*)\@(.)//o)
+ elsif(s/^([^{}@]*)\@([^\s\}\{\@]*)//o)
+ {
+ # No need to warn here it is done later
+ add_prev($text, $stack, $1 . "\@$2");
+ next;
+ }
+ elsif (s/^([^{}]*)([{}])//o)
+ {
+ add_prev($text, $stack, $1);
+ if ($2 eq '{')
+ {
+ push @$stack, { 'style' => '', 'text' => '' };
+ }
+ else
+ {
+ if (@$stack)
+ {
+ my $style = pop @$stack;
+ my $result;
+ if (($style->{'style'} ne '') and exists($info_enclose{$style->{'style'}}) and !$state->{'arg_expansion'})
+ {
+ $result = $info_enclose{$style->{'style'}}->[0] . $style->{'text'} . $info_enclose{$style->{'style'}}->[1];
+ }
+ elsif ($style->{'style'} ne '')
+ {
+ $result = '@' . $style->{'style'} . '{' . $style->{'text'} . '}';
+ }
+ else
+ {
+ $result = '{' . $style->{'text'};
+ # don't close { if we are closing stack as we are not
+ # sure this is a licit { ... } construct.
+ $result .= '}' unless ($state->{'close_stack'} or $state->{'arg_expansion'});
+ }
+ add_prev ($text, $stack, $result);
+ #print STDERR "MACRO end $style->{'style'} remaining: $_";
+ next;
+ }
+ else
+ {
+ # we warn in the last pass
+ #echo_error ("'}' without opening '{', before: $_", $line_nr);
+ #warn "$ERROR '}' without opening '{' line: $line";
+ add_prev ($text, $stack, '}');
+ }
+ }
+ }
+ else
+ {
+ #print STDERR "END_LINE $_";
+ add_prev($text, $stack, $_);
+ last;
+ }
+ }
+ return 1;
+}
+
+sub scan_structure($$$$;$)
+{
+ my $line = shift;
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ die "stack not an array ref" unless (ref($stack) eq "ARRAY");
+ local $_ = $line;
+ #print STDERR "SCAN_STRUCTURE: $line";
+ #dump_stack ($text, $stack, $state);
+ if (!$state->{'raw'} and !$state->{'special'} and (!exists($state->{'region_lines'})))
+ {
+ if (!$state->{'verb'} and $state->{'menu'} and /^\*/o)
+ {
+ # new menu entry
+ delete ($state->{'after_element'});
+ my $menu_line = $_;
+ my $node;
+ if (/^\*\s+($NODERE)::/)
+ {
+ $node = $1;
+ }
+ elsif (/^\*\s+([^:]+):\s*([^\t,\.\n]+)[\t,\.\n]/)
+ {
+ #$name = $1;
+ $node = $2;
+ }
+ if ($node)
+ {
+ menu_entry_texi(normalise_node($node), $state, $line_nr);
+ }
+ }
+ if (/\S/ and !no_line($_))
+ {
+ delete $state->{'after_element'};
+ }
+ }
+
+ while(1)
+ {
+ # scan structure
+ #print STDERR "WHILE\n";
+ #dump_stack($text, $stack, $state);
+
+ # as texinfo 4.5
+ # verbatim might begin at another position than beginning
+ # of line, and end verbatim might too. To end a verbatim section
+ # @end verbatim must have exactly one space between end and verbatim
+ # things following end verbatim are not ignored.
+ #
+ # html might begin at another position than beginning
+ # of line, but @end html must begin the line, and have
+ # exactly one space. Things following end html are ignored.
+ # tex and ignore works like html
+ #
+ # ifnothtml might begin at another position than beginning
+ # of line, and @end ifnothtml might too, there might be more
+ # than one space between @end and ifnothtml but nothing more on
+ # the line.
+ # @end itemize, @end ftable works like @end ifnothtml.
+ # except that @item on the same line than @end vtable doesn't work
+ #
+ # text right after the itemize before an item is displayed.
+ # @item might be somewhere in a line.
+ # strangely @item on the same line than @end vtable doesn't work
+ # there should be nothing else than a command following @itemize...
+ #
+ # see more examples in formatting directory
+
+ if ($state->{'raw'} or $state->{'special'})
+ {
+ my $tag = $state->{'raw'};
+ $tag = $state->{'special'} unless $tag;
+ if (! @$stack or ($stack->[-1]->{'style'} ne $tag))
+ {
+ print STDERR "Bug: raw or special: $tag but not on top of stack\n";
+ print STDERR "line: $_";
+ dump_stack($text, $stack, $state);
+ exit 1;
+ }
+ if (s/^(.*?)\@end\s$tag$// or s/^(.*?)\@end\s$tag\s//)
+ {
+ add_prev ($text, $stack, $1);
+ my $style = pop @$stack;
+ if ($state->{'special'})
+ {
+ delete $state->{'special'};
+ if ($style->{'text'} !~ /^\s*$/)
+ {
+ add_prev ($text, $stack, do_special($style->{'style'}, $style->{'text'}));
+ }
+
+ }
+ else
+ {
+ my $after_macro = '';
+ $after_macro = ' ' unless (/^\s*$/);
+ add_prev ($text, $stack, $style->{'text'} . "\@end $state->{'raw'}" . $after_macro);
+ delete $state->{'raw'};
+ }
+ unless (no_line($_))
+ {
+ delete ($state->{'after_element'});
+ }
+ next;
+ }
+ else
+ {
+ add_prev ($text, $stack, $_);
+ last unless ($state->{'special'});
+ return;
+ }
+ }
+
+ if (defined($state->{'verb'}))
+ {
+ my $char = quotemeta($state->{'verb'});
+ if (s/^(.*?)$char\}/\}/)
+ {
+ add_prev($text, $stack, $1 . $state->{'verb'});
+ $stack->[-1]->{'text'} = $state->{'verb'} . $stack->[-1]->{'text'};
+ delete $state->{'verb'};
+ next;
+ }
+ else
+ {
+ add_prev($text, $stack, $_);
+ last;
+ }
+ }
+
+ unless (no_line($_))
+ {
+ delete $state->{'after_element'};
+ }
+ if (s/^([^{}@]*)\@end\s+([a-zA-Z]\w*)//)
+ {
+ add_prev($text, $stack, $1);
+ my $end_tag = $2;
+ $state->{'detailmenu'}-- if ($end_tag eq 'detailmenu' and $state->{'detailmenu'});
+ if (defined($state->{'text_macro_stack'})
+ and @{$state->{'text_macro_stack'}}
+ and ($end_tag eq $state->{'text_macro_stack'}->[-1]))
+ {
+ pop @{$state->{'text_macro_stack'}};
+ if (exists($region_lines{$end_tag}))
+ {
+ print STDERR "Bug: end_tag $end_tag ne $state->{'region_lines'}->{'format'}"
+ if ( $end_tag ne $state->{'region_lines'}->{'format'});
+ $state->{'region_lines'}->{'number'}--;
+ if ($state->{'region_lines'}->{'number'} == 0)
+ {
+ $state->{'after_element'} = 1;
+ delete $state->{'after_element'} unless
+ ($state->{'region_lines'}->{'after_element'});
+ delete $state->{'region_lines'}->{'number'};
+ delete $state->{'region_lines'}->{'format'};
+ delete $state->{'region_lines'}->{'after_element'};
+ delete $state->{'region_lines'};
+ }
+ #dump_stack($text, $stack, $state);
+ }
+ if ($end_tag eq 'menu')
+ {
+ add_prev($text, $stack, "\@end $end_tag");
+ $state->{'menu'}--;
+ }
+ else
+ {
+ #print STDERR "End $end_tag\n";
+ #dump_stack($text, $stack, $state);
+ return if (/^\s*$/);
+ }
+ }
+ elsif ($text_macros{$end_tag})
+ {
+ echo_error ("\@end $end_tag without corresponding element", $line_nr);
+ #dump_stack($text, $stack, $state);
+ }
+ else
+ {
+ if ($end_tag eq 'float' and $state->{'float'})
+ {
+ delete $state->{'float'};
+ }
+ elsif ($end_tag eq $state->{'table_stack'}->[-1])
+ {
+ enter_table_index_entry($text, $stack, $state, $line_nr);
+ pop @{$state->{'table_stack'}};
+ }
+ #add end tag
+ add_prev($text, $stack, "\@end $end_tag");
+ }
+ next;
+ }
+ #elsif (s/^([^{}@]*)\@([a-zA-Z]\w*|["'~\@\}\{,\.!\?\s\*\-\^`=:\/])//o)
+ elsif (s/^([^{}@]*)\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])//o or s/^([^{}@]*)\@([a-zA-Z]\w*)([\s\{\}\@])/$3/o or s/^([^{}@]*)\@([a-zA-Z]\w*)$//o)
+ {
+ add_prev($text, $stack, $1);
+ my $macro = $2;
+ #print STDERR "MACRO $macro\n";
+ if (defined($Texi2HTML::Config::misc_command{$macro}))
+ {
+ my $line;
+ ($_, $line) = misc_command_structure($_, $macro, $state,
+ $line_nr);
+ add_prev ($text, $stack, $line);
+ next;
+ }
+
+ if ($macro =~ /^(\w+?)index/ and ($1 ne 'print') and ($1 ne 'syncode') and ($1 ne 'syn') and ($1 ne 'def') and ($1 ne 'defcode'))
+ {
+ my $index_prefix = $1;
+ if (/^\s+(.*)/)
+ {
+ my $key = $1;
+ $_ = substitute_texi_line($_);
+ my $index_entry = enter_index_entry($index_prefix, $line_nr, $key, $state->{'place'}, $state->{'element'}, $state->{'after_element'});
+ if ($index_entry)
+ {
+ add_prev ($text, $stack, "\@$macro" . $_);
+ last;
+ }
+ elsif (!defined($index_entry))
+ {
+ echo_warn ("Bad index entry: $_", $line_nr);
+ #warn "$WARN Bad index entry: $_";
+ }
+ }
+ else
+ {
+ echo_warn ("empty index entry", $line_nr);
+ #warn "$WARN empty index entry\n";
+ }
+ return;
+ }
+ elsif (defined($text_macros{$macro}))
+ {
+ #print STDERR "TEXT_MACRO: $macro\n";
+ if ($text_macros{$macro} eq 'special')
+ {
+ $state->{'special'} = $macro;
+ }
+ elsif ($text_macros{$macro} eq 'raw')
+ {
+ $state->{'raw'} = $macro;
+ #print STDERR "RAW\n";
+ }
+ elsif ($format_type{$macro} and $format_type{$macro} eq 'menu')
+ {
+ $state->{'menu'}++;
+ delete ($state->{'prev_menu_node'});
+ push @{$state->{'text_macro_stack'}}, $macro;
+ #print STDERR "MENU (text_macro_stack: @{$state->{'text_macro_stack'}})\n";
+ }
+ elsif (exists($region_lines{$macro}))
+ {
+ if (exists($state->{'region_lines'}) and ($state->{'region_lines'}->{'format'} ne $macro))
+ {
+ echo_error("\@$macro not allowed within $state->{'region_lines'}->{'format'}", $line_nr);
+ next;
+ }
+ if (!exists($state->{'region_lines'}))
+ {
+ $state->{'region_lines'}->{'format'} = $macro;
+ $state->{'region_lines'}->{'number'} = 1;
+ $state->{'region_lines'}->{'after_element'} = 1 if ($state->{'after_element'});
+ }
+ else
+ {
+ $state->{'region_lines'}->{'number'}++;
+ }
+ push @{$state->{'text_macro_stack'}}, $macro;
+ }
+ # if it is a raw formatting command or a menu command
+ # we must keep it for later
+ my $macro_kept;
+ if ($state->{'raw'} or ($macro eq 'menu'))
+ {
+ add_prev($text, $stack, "\@$macro");
+ $macro_kept = 1;
+ }
+ if ($state->{'raw'} or $state->{'special'})
+ {
+ push @$stack, { 'style' => $macro, 'text' => '' };
+ }
+ next if $macro_kept;
+ #dump_stack ($text, $stack, $state);
+ return if (/^\s*$/);
+ }
+ elsif (defined($Texi2HTML::Config::def_map{$macro}))
+ {
+ #We must enter the index entries
+ my ($prefix, $entry) = get_deff_index($macro, $_, $line_nr);
+ enter_index_entry($prefix, $line_nr, $entry, $state->{'place'}, $state->{'element'}, 0) if ($prefix and defined($entry));
+ s/(.*)//;
+ add_prev($text, $stack, "\@$macro" . $1);
+ }
+ elsif ($macro =~ /^itemx?$/)
+ {
+ enter_table_index_entry($text, $stack, $state, $line_nr);
+ if ($state->{'table_stack'}->[-1] =~ /^(v|f)table$/)
+ {
+ $state->{'item'} = $macro;
+ push @$stack, { 'format' => 'index_item', 'text' => "" };
+ }
+ else
+ {
+ add_prev($text, $stack, "\@$macro");
+ }
+ }
+ elsif ($format_type{$macro} and ($format_type{$macro} eq 'table' or $format_type{$macro} eq 'list'))
+ { # We must enter the index entries of (v|f)table thus we track
+ # in which table we are
+ push @{$state->{'table_stack'}}, $macro;
+ add_prev($text, $stack, "\@$macro");
+ }
+ elsif (s/^{//)
+ {
+ if ($macro eq 'verb')
+ {
+ if (/^$/)
+ {
+ # We allready warned in pass texi
+ #warn "$ERROR verb at end of line";
+ }
+ else
+ {
+ s/^(.)//;
+ $state->{'verb'} = $1;
+ }
+ }
+ elsif ($macro eq 'footnote' and $Texi2HTML::Config::SEPARATED_FOOTNOTES)
+ {
+ $state->{'footnote_element'} = $state->{'element'};
+ $state->{'footnote_place'} = $state->{'place'};
+ $state->{'element'} = $footnote_element;
+ $state->{'place'} = $footnote_element->{'place'};
+ }
+ push (@$stack, { 'style' => $macro, 'text' => '' });
+ }
+ else
+ {
+ add_prev($text, $stack, "\@$macro");
+ }
+ next;
+ }
+ #elsif(s/^([^{}@]*)\@(.)//o)
+ elsif(s/^([^{}@]*)\@([^\s\}\{\@]*)//o)
+ {
+ add_prev($text, $stack, $1 . "\@$2");
+ next;
+ }
+ elsif (s/^([^{}]*)([{}])//o)
+ {
+ add_prev($text, $stack, $1);
+ if ($2 eq '{')
+ {
+ push @$stack, { 'style' => '', 'text' => '' };
+ }
+ else
+ {
+ if (@$stack)
+ {
+ my $style = pop @$stack;
+ my $result;
+ if ($style->{'style'} eq 'anchor')
+ {
+ my $anchor = $style->{'text'};
+ $anchor = normalise_node($anchor);
+ if ($nodes{$anchor})
+ {
+ echo_error ("Duplicate node for anchor found: $anchor", $line_nr);
+ next;
+ }
+ $anchor_num++;
+ $nodes{$anchor} = { 'anchor' => 1, 'seen' => 1, 'texi' => $anchor, 'id' => 'ANC' . $anchor_num};
+ push @{$state->{'place'}}, $nodes{$anchor};
+ }
+ elsif ($style->{'style'} eq 'footnote')
+ {
+ if ($Texi2HTML::Config::SEPARATED_FOOTNOTES)
+ {
+ $state->{'element'} = $state->{'footnote_element'};
+ $state->{'place'} = $state->{'footnote_place'};
+ }
+ }
+ elsif ($style->{'style'} eq 'math' and $Texi2HTML::Config::L2H)
+ {
+ add_prev ($text, $stack, do_math($style->{'text'}));
+ next;
+ }
+ elsif ($style->{'style'} eq 'caption' or $style->{'style'}
+eq 'shortcaption' and $state->{'float'})
+ {
+ my @texi_lines = map {$_ = $_."\n"} split (/\n/, $style->{'text'});
+ $state->{'float'}->{$style->{'style'} . "_texi"} = \@texi_lines;
+ }
+ if (($style->{'style'} eq 'titlefont') and ($style->{'text'} =~ /\S/))
+ {
+ $state->{'element'}->{'titlefont'} = $style->{'text'} unless ((exists($state->{'region_lines'}) and ($state->{'region_lines'}->{'format'} eq 'titlepage')) or defined($state->{'element'}->{'titlefont'})) ;
+ }
+ if ($style->{'style'})
+ {
+ $result = '@' . $style->{'style'} . '{' . $style->{'text'} . '}';
+ }
+ else
+ {
+ $result = '{' . $style->{'text'};
+ # don't close { if we are closing stack as we are not
+ # sure this is a licit { ... } construct.
+ $result .= '}' unless $state->{'close_stack'};
+ }
+ add_prev ($text, $stack, $result);
+ #print STDERR "MACRO end $style->{'style'} remaining: $_";
+ next;
+ }
+ else
+ {
+ # We warn in the last pass
+ #warn "$ERROR '}' without opening '{' line: $line";
+ #echo_error ("'}' without opening '{' line: $line", $line_nr);
+ add_prev ($text, $stack, '}');
+ }
+ }
+ }
+ else
+ {
+ #print STDERR "END_LINE $_";
+ add_prev($text, $stack, $_);
+ enter_table_index_entry($text, $stack, $state, $line_nr);
+ last;
+ }
+ }
+ return 1;
+}
+
+sub scan_line($$$$;$)
+{
+ my $line = shift;
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ die "stack not an array ref" unless (ref($stack) eq "ARRAY");
+ local $_ = $line;
+ #print STDERR "SCAN_LINE: $line";
+ #dump_stack($text, $stack, $state );
+ my $new_menu_entry; # true if there is a new menu entry
+ my $menu_description_in_format; # true if we are in a menu description
+ # but in another format section (@table....)
+ if (defined($state->{'prepend_text'}))
+ {
+ $_ = $state->{'prepend_text'} . $_;
+ $state->{'prepend_text'} = undef;
+ delete $state->{'prepend_text'};
+ }
+ if (defined($state->{'end_of_line_protected'}))
+ {
+ #print STDERR "END_OF_LINE_PROTECTED, $_";
+ #dump_stack($text, $stack, $state);
+ delete $state->{'end_of_line_protected'};
+ }
+ if (!$state->{'raw'} and !$state->{'verb'} and $state->{'menu'})
+ { # new menu entry
+ my ($node, $name, $ending);
+ if (s/^\*(\s+$NODERE)(::)//o)
+ {
+ $node = $1;
+ $ending = $2;
+ }
+ elsif (s/^\*(\s+[^:]+):(\s*[^\t,\.\n]+)([\t,\.\n])//o)
+ {
+ $name = $1;
+ $node = $2;
+ $ending = $3;
+ }
+ if ($node)
+ {
+ my $top_stack = top_stack($stack);
+ if ($top_stack and $top_stack->{'format'} and
+ (
+ ($top_stack->{'format'} eq 'menu_description') or
+ ($top_stack->{'format'} eq 'menu') or
+ (($top_stack->{'format'} eq 'preformatted') and (stack_order($stack, 'preformatted', 'menu_comment'))) or
+ ($top_stack->{'format'} eq 'menu_preformatted') or
+ ($top_stack->{'format'} eq 'menu_comment')
+ )
+ )
+ { # we are in a normal menu state.
+ close_menu($text, $stack, $state, $line_nr);
+ $new_menu_entry = 1;
+ $state->{'menu_entry'} = { 'name' => $name, 'node' => $node,
+ 'ending' => $ending };
+ add_prev ($text, $stack, do_menu_link($state, $line_nr));
+ print STDERR "# New menu entry: $node\n" if ($T2H_DEBUG & $DEBUG_MENU);
+ push @$stack, {'format' => 'menu_description', 'text' => ''};
+ }
+ else
+ { # we are within a macro or a format. In that case we use
+ # a simplified formatting of menu which should be right whatever
+ # the context
+ my $menu_entry = $state->{'menu_entry'};
+ $state->{'menu_entry'} = { 'name' => $name, 'node' => $node,
+ 'ending' => $ending };
+ add_prev ($text, $stack, do_menu_link($state, $line_nr, 1));
+ $state->{'menu_entry'} = $menu_entry;
+ }
+ }
+ }
+ # we're in a menu entry description
+ if ($state->{'menu_entry'} and !$new_menu_entry)
+ {
+ my $top_stack = top_stack($stack);
+ if (/^\s+\S.*$/ or (!$top_stack->{'format'} or ($top_stack->{'format'} ne 'menu_description')))
+ { # description continues
+ $menu_description_in_format = 1 if ($top_stack->{'format'} and ($top_stack->{'format'} ne 'menu_description'));
+ print STDERR "# Description continues\n" if ($T2H_DEBUG & $DEBUG_MENU);
+ #dump_stack ($text, $stack, $state);
+ }
+ else
+ { # enter menu comment after menu entry
+ if (!$top_stack->{'format'} or ($top_stack->{'format'} ne 'menu_description'))
+ {
+ print STDERR "Bug: begin menu comment but previous isn't menu_description\n";
+ dump_stack ($text, $stack, $state);
+ }
+ print STDERR "# Menu comment begins\n" if ($T2H_DEBUG & $DEBUG_MENU);
+ #dump_stack ($text, $stack, $state);
+ my $descr = pop(@$stack);
+ add_prev ($text, $stack, menu_description($descr->{'text'}, $state));
+ delete $state->{'menu_entry'};
+ unless (/^\s*\@end\s+menu\b/)
+ {
+ $state->{'menu_comment'}++;
+ push @$stack, {'format' => 'menu_comment', 'text' => ''};
+ push @{$state->{'preformatted_stack'}}, {'pre_style' => $Texi2HTML::Config::MENU_PRE_STYLE, 'class' => 'menu-comment' };
+ $state->{'preformatted'}++;
+ begin_paragraph($stack, $state);
+ }
+ #dump_stack ($text, $stack, $state);
+ }
+ }
+ if ($state->{'open_paragraph'} and !$state->{'no_paragraph'})
+ {
+ delete $state->{'open_paragraph'};
+ if ($state->{'preformatted'} or !no_paragraph($state,$_))
+ {
+ begin_paragraph($stack, $state);
+ }
+ }
+ if (($state->{'menu_entry'} and !$menu_description_in_format) or $state->{'raw'} or $state->{'preformatted'} or $state->{'no_paragraph'} or $state->{'keep_texi'} or $state->{'remove_texi'})
+ { # empty lines are left unmodified
+ if (/^\s*$/)
+ {
+ add_prev($text, $stack, $_);
+ return;
+ }
+ else
+ {
+ my $next_tag = next_tag($_);
+ if ($state->{'deff'} and !defined($Texi2HTML::Config::def_map{$next_tag}))
+ {
+ begin_deff_item($stack, $state);
+ }
+ }
+ }
+ else
+ { #FIXME @syncodeindex cp fn
+ # on a line should also end paragraphs.
+ if (/^\s*$/)
+ {
+ #ignore the line if it just follows a deff
+ return if ($state->{'deff'});
+
+ if ($state->{'paragraph'})
+ { # An empty line ends a paragraph
+ close_paragraph($text, $stack, $state, $line_nr);
+ add_prev($text, $stack, &$Texi2HTML::Config::empty_line($_));
+ return 1;
+ }
+ else
+ {
+ add_prev($text, $stack, &$Texi2HTML::Config::empty_line($_));
+ return 1;
+ }
+ }
+ else
+ {
+ #print STDERR "a line not empty and not in no paragraph format\n";
+ my $next_tag = next_tag($_);
+ if ($state->{'deff'} and !defined($Texi2HTML::Config::def_map{$next_tag}))
+ { # finish opening the deff, as this is not a deff tag, it can't be
+ # a deff macro with x
+ begin_deff_item($stack, $state);
+ }
+ #print STDERR "NEXT_TAG $next_tag:$_";
+ if (!no_paragraph($state,$_))
+ { # index entries, @html and @* don't trigger new paragraph beginning
+ # otherwise we begin a new paragraph
+ #print STDERR "begin paragraph\n";
+ begin_paragraph($stack, $state);
+ }
+ }
+ }
+
+ while(1)
+ {
+ # scan_line
+ #print STDERR "WHILE: $_";
+ #dump_stack($text, $stack, $state);
+ # we're in a raw format (html, tex if !L2H, verbatim)
+ if (defined($state->{'raw'}))
+ {
+ (dump_stack($text, $stack, $state), die "Bug for raw ($state->{'raw'})") if (! @$stack or ! ($stack->[-1]->{'style'} eq $state->{'raw'}));
+ if (s/^(.*?)\@end\s$state->{'raw'}$// or s/^(.*?)\@end\s$state->{'raw'}\s+//)
+ # don't protect html, it is done by Texi2HTML::Config::raw if needed
+ {
+ print STDERR "# end raw $state->{'raw'}\n" if ($T2H_DEBUG & $DEBUG_FORMATS);
+ add_prev ($text, $stack, $1);
+ my $style = pop @$stack;
+ if ($style->{'text'} !~ /^\s*$/)
+ {
+ if ($state->{'remove_texi'})
+ {
+ add_prev ($text, $stack, $style->{'text'});
+ }
+ elsif ($state->{'keep_texi'})
+ {
+ add_prev ($text, $stack, $style->{'text'} . "\@end $state->{'raw'}");
+ }
+ else
+ {
+ add_prev($text, $stack, &$Texi2HTML::Config::raw($style->{'style'}, $style->{'text'}));
+ }
+ }
+ if (!$state->{'keep_texi'} and !$state->{'remove_texi'})
+ {
+ # reopen preformatted if it was interrupted by the raw format
+ # if raw format is html the preformatted wasn't interrupted
+ begin_paragraph($stack, $state) if ($state->{'preformatted'} and (!$Texi2HTML::Config::format_in_paragraph{$state->{'raw'}}));
+ delete $state->{'raw'};
+ return if (/^\s*$/);
+ }
+ delete $state->{'raw'};
+ next;
+ }
+ else
+ {
+ print STDERR "#within raw $state->{'raw'}:$_" if ($T2H_DEBUG & $DEBUG_FORMATS);
+ add_prev ($text, $stack, $_);
+ last;
+ }
+ }
+
+ # we are within a @verb
+ if (defined($state->{'verb'}))
+ {
+ my $char = quotemeta($state->{'verb'});
+ if (s/^(.*?)$char\}/\}/)
+ {
+ if ($state->{'keep_texi'})
+ {
+ add_prev($text, $stack, $1 . $state->{'verb'});
+ $stack->[-1]->{'text'} = $state->{'verb'} . $stack->[-1]->{'text'};
+ }
+ elsif ($state->{'remove_texi'})
+ {
+ add_prev($text, $stack, $1);
+ }
+ else
+ {
+ add_prev($text, $stack, do_text($1, $state));
+ }
+ delete $state->{'verb'};
+ next;
+ }
+ else
+ {
+ add_prev($text, $stack, $_);
+ last;
+ }
+ }
+
+ # We handle now the end tags
+ if ($state->{'keep_texi'} and s/^([^{}@]*)\@end\s+([a-zA-Z]\w*)//)
+ {
+ my $end_tag = $2;
+ add_prev($text, $stack, $1 . "\@end $end_tag");
+ next;
+ }
+ elsif ($state->{'remove_texi'} and s/^([^{}@]*)\@end\s+([a-zA-Z]\w*)//)
+ {
+ add_prev($text, $stack, $1);
+ next;
+ }
+
+ if (s/^([^{}@,]*)\@end\s+([a-zA-Z]\w*)\s// or s/^([^{}@,]*)\@end\s+([a-zA-Z]\w*)$//)
+ {
+ add_prev($text, $stack, do_text($1, $state));
+ my $end_tag = $2;
+ #print STDERR "END_MACRO $end_tag\n";
+ #dump_stack ($text, $stack, $state);
+
+ # First we test if the stack is not empty.
+ # Then we test if the end tag is a format tag.
+ # If so, we close the styles.
+ # We then close paragraphs and preformatted at top of the stack.
+ # We handle the end tag (even when it was not the tag which appears
+ # on the top of the stack; in that case we close anything
+ # until that element)
+ $state->{'detailmenu'}-- if ($end_tag eq 'detailmenu' and $state->{'detailmenu'});
+ # FIXME handle in sub skip
+ next if (defined($Texi2HTML::Config::misc_command{"end $end_tag"}));
+ my $top_stack = top_stack($stack);
+ if (!$top_stack)
+ {
+ echo_error ("\@end $end_tag without corresponding opening", $line_nr);
+ add_prev($text, $stack, "\@end $end_tag");
+ next;
+ }
+
+ if (!$format_type{$end_tag})
+ {
+ echo_warn ("Unknown \@end $end_tag", $line_nr);
+ #warn "$ERROR Unknown \@end $end_tag\n";
+ add_prev($text, $stack, "\@end $end_tag");
+ next;
+ }
+ unless ($Texi2HTML::Config::format_in_paragraph{$end_tag})
+ {
+ close_paragraph($text, $stack, $state, $line_nr);
+ }
+
+ $top_stack = top_stack($stack);
+ if (!$top_stack or (!defined($top_stack->{'format'})))
+ {
+ echo_error ("\@end $end_tag without corresponding opening element", $line_nr);
+ add_prev($text, $stack, "\@end $end_tag");
+ next;
+ }
+ # Warn if the format on top of stack is not compatible with the
+ # end tag, and find the end tag.
+ unless (
+ ($top_stack->{'format'} eq $end_tag)
+ or
+ (
+ ($format_type{$end_tag} eq 'menu') and
+ (
+ ($top_stack->{'format'} eq 'menu_preformatted') or
+ ($top_stack->{'format'} eq 'menu_comment') or
+ ($top_stack->{'format'} eq 'menu_description')
+ )
+ ) or
+ (
+ ($end_tag eq 'multitable') and
+ (
+ ($top_stack->{'format'} eq 'cell') or
+ ($top_stack->{'format'} eq 'null')
+ )
+ ) or
+ (
+ ($format_type{$end_tag} eq 'list' ) and
+ ($top_stack->{'format'} eq 'item')
+ ) or
+ (
+ (
+ ($format_type{$end_tag} eq 'table') and
+ ($end_tag ne 'multitable')
+ ) and
+ (
+ ($top_stack->{'format'} eq 'term') or
+ ($top_stack->{'format'} eq 'line')
+ )
+ ) or
+ (
+ (defined($Texi2HTML::Config::def_map{$end_tag})) and
+ ($top_stack->{'format'} eq 'deff_item')
+ ) or
+ (
+ ($end_tag eq 'row') and
+ ($top_stack->{'format'} eq 'cell')
+ )
+ )
+ {
+ my $waited_format = $top_stack->{'format'};
+ $waited_format = $fake_format{$top_stack->{'format'}} if ($format_type{$top_stack->{'format'}} eq 'fake');
+ echo_error ("waiting for end of $waited_format, found \@end $end_tag", $line_nr);
+ close_stack($text, $stack, $state, $line_nr, undef, $end_tag);
+ # an empty preformatted may appear when closing things as
+ # when closed, formats reopen the preformatted environment
+ # in case there is some text following, but we know it isn't
+ # the case here, thus we can close paragraphs.
+ close_paragraph($text, $stack, $state);
+ my $new_top_stack = top_stack($stack);
+ next unless ($new_top_stack and defined($new_top_stack->{'format'}) and (($new_top_stack->{'format'} eq $end_tag)
+ or (($format_type{$new_top_stack->{'format'}} eq 'fake') and ($fake_format{$new_top_stack->{'format'}} eq $format_type{$end_tag}))));
+ }
+ # We should now be able to handle the format
+ if (defined($format_type{$end_tag}) and $format_type{$end_tag} ne 'fake')
+ {
+ end_format($text, $stack, $state, $end_tag, $line_nr);
+ }
+ else
+ { # this is a fake format, ie a format used internally, inside
+ # a real format. We do nothing, hoping the real format will
+ # get closed, closing the fake internal formats
+ #print STDERR "FAKE \@end $end_tag\n";
+ #add_prev($text, $stack, "\@end $end_tag");
+ }
+ next;
+ }
+ # This is a macro
+ #elsif (s/^([^{}@]*)\@([a-zA-Z]\w*|["'~\@\}\{,\.!\?\s\*\-\^`=:\/])//o)
+ elsif (s/^([^{},@]*)\@(["'~\@\}\{,\.!\?\s\*\-\^`=:\|\/])//o or s/^([^{}@,]*)\@([a-zA-Z]\w*)([\s\{\}\@])/$3/o or s/^([^{},@]*)\@([a-zA-Z]\w*)$//o)
+ {
+ add_prev($text, $stack, do_text($1, $state));
+ my $macro = $2;
+ #print STDERR "MACRO $macro\n";
+ #dump_stack ($text, $stack, $state);
+ # This is a macro added by close_stack to mark paragraph end
+ if ($macro eq 'end_paragraph')
+ {
+ my $top_stack = top_stack($stack);
+ if (!$top_stack or !$top_stack->{'format'}
+ or ($top_stack->{'format'} ne 'paragraph'))
+ {
+ print STDERR "Bug: end_paragraph but no paragraph to end\n";
+ dump_stack ($text, $stack, $state);
+ next;
+ }
+ s/^\s//;
+ my $paragraph = pop @$stack;
+ add_prev ($text, $stack, do_paragraph($paragraph->{'text'}, $state));
+ next;
+ }
+ # Handle macro added by close_stack to mark preformatted region end
+ elsif ($macro eq 'end_preformatted')
+ {
+ my $top_stack = top_stack($stack);
+ if (!$top_stack or !$top_stack->{'format'}
+ or ($top_stack->{'format'} ne 'preformatted'))
+ {
+ print STDERR "Bug: end_preformatted but no preformatted to end\n";
+ dump_stack ($text, $stack, $state);
+ next;
+ }
+ my $paragraph = pop @$stack;
+ s/^\s//;
+ add_prev ($text, $stack, do_preformatted($paragraph->{'text'}, $state));
+ next;
+ }
+ if (defined($Texi2HTML::Config::misc_command{$macro}))
+ {
+ # This strange condition is there because for an argument
+ # appearing on an @itemize line, appended to an @item
+ # we don't want to keep @c or @comment as otherwise it eats
+ # the line. Other commands could do that too but then the user
+ # deserves what he gets.
+ if (($state->{'keep_texi'} and
+ (!$state->{'check_item'} or ($macro ne 'c' and $macro ne 'comment')))
+ or $state->{'remove_texi'})
+ {
+ my ($line, $args);
+ ($_, $line, $args) = preserve_command($_, $macro);
+ if ($state->{'keep_texi'})
+ {
+ add_prev($text, $stack, $line);
+ }
+ next;
+ }
+ my $keep = $Texi2HTML::Config::misc_command{$macro}->{'keep'};
+ $_ = misc_command_text($_, $macro, $stack, $state, $text, $line_nr);
+ return unless (defined($_));
+ unless ($keep)
+ {
+ begin_paragraph($stack, $state) if
+ (!no_paragraph($state,$_));
+ next;
+ }
+ }
+# if ($macro eq 'sp')
+# {
+# my ($space1, $sp_number, $space2);
+# if (s/^(\s+)(\d+)(\s*)//)
+# {
+# $space1 = $1;
+# $sp_number = $2;
+# $space2 = $3;
+# }
+# elsif (s/(\s*)$//)
+# {
+# $space1 = $1;
+# $sp_number = '';
+# $space2 = '';
+# }
+# else
+# {
+# next if ($state->{'remove_texi'});
+# if ($state->{'keep_texi'})
+# {
+# add_prev($text, $stack, "\@$macro");
+# next;
+# }
+# echo_error ("\@$macro needs a numeric arg or no arg", $line_nr);
+# next;
+# }
+# next if ($state->{'remove_texi'});
+# if ($state->{'keep_texi'})
+# {
+# add_prev($text, $stack, "\@$macro" . $space1 . $sp_number . $space2);
+# next;
+# }
+# $sp_number = 1 if ($sp_number eq '');
+# add_prev($text, $stack, &$Texi2HTML::Config::sp($sp_number, $state->{'preformatted'}));
+# next;
+# }
+ #if ($macro eq 'verbatiminclude' or $macro eq 'listoffloats')
+ if ($macro eq 'listoffloats')
+ {
+ if ($state->{'keep_texi'})
+ {
+ if (s/(.*)//o)
+ {
+ add_prev($text, $stack, "\@$macro" . $1);
+ }
+ next;
+ }
+ return undef if ($state->{'remove_texi'});
+
+ if (s/^(\s+)(.*)//o)
+ {
+ my $arg = $2;
+# if ($macro eq 'verbatiminclude')
+# {
+# my $file = locate_include_file($arg);
+# if (defined($file))
+# {
+# if (!open(VERBINCLUDE, $file))
+# {
+# echo_warn ("Can't read file $file: $!",$line_nr);
+# }
+# else
+# {
+# my $verb_text = '';
+# while (my $line = <VERBINCLUDE>)
+# {
+# $verb_text .= $line;
+# }
+# add_prev($text, $stack, &$Texi2HTML::Config::raw('verbatim',$verb_text));
+# close VERBINCLUDE;
+# }
+# }
+# else
+# {
+# echo_error ("Can't find $arg, skipping", $line_nr);
+# }
+# }
+# elsif ($macro eq 'listoffloats')
+# {
+ my $style_id = cross_manual_line (normalise_space($arg));
+ my $style = substitute_line (&$Texi2HTML::Config::listoffloats_style($arg));
+ if (exists ($floats{$style_id}))
+ {
+ close_paragraph($text, $stack, $state, $line_nr);
+ my @listoffloats_entries = ();
+ foreach my $float (@{$floats{$style_id}->{'floats'}})
+ {
+ my $float_style = substitute_line(&$Texi2HTML::Config::listoffloats_float_style($arg, $float));
+ my $caption_lines = &$Texi2HTML::Config::listoffloats_caption($float);
+ my $caption = substitute_text({ 'multiple_pass' => 1 }, @$caption_lines);
+ push @listoffloats_entries, &$Texi2HTML::Config::listoffloats_entry($arg, $float, $float_style, $caption, href($float, $state->{'element'}->{'file'}));
+ }
+ add_prev($text, $stack, &$Texi2HTML::Config::listoffloats($arg, $style, \@listoffloats_entries));
+ }
+ else
+ {
+ echo_warn ("Unknown float style $arg", $line_nr);
+ }
+# }
+ }
+ else
+ {
+ echo_error ("Bad \@$macro line: $_", $line_nr);
+ }
+ return undef;
+ }
+ # This is a @macroname{...} construct. We add it on top of stack
+ # It will be handled when we encounter the '}'
+ if (s/^{//)
+ {
+ if ($macro eq 'verb')
+ {
+ if (/^$/)
+ {
+ # Allready warned
+ #warn "$ERROR verb at end of line";
+ }
+ else
+ {
+ s/^(.)//;
+ $state->{'verb'} = $1;
+ }
+ } #FIXME what to do if remove_texi and anchor/ref/footnote ?
+ elsif ($macro eq 'm_cedilla' and !$state->{'keep_texi'})
+ {
+ $macro = ',';
+ }
+ push (@$stack, { 'style' => $macro, 'text' => '', 'arg_nr' => 0 });
+ $state->{'no_paragraph'}++ if ($no_paragraph_macro{$macro});
+ open_arg($macro, 0, $state);
+ push (@{$state->{'style_stack'}}, $macro) if (defined($style_type{$macro}) and (($style_type{$macro} eq 'style') or ($style_type{$macro} eq 'accent')));
+ next;
+ }
+
+ # special case if we are checking items
+
+ if ($state->{'check_item'} and ($macro =~ /^itemx?$/ or $macro eq 'headitem'))
+ {
+ echo_error("\@$macro on \@$state->{'check_item'} line", $line_nr);
+ next;
+ }
+
+ # if we're keeping texi unmodified we can do it now
+ if ($state->{'keep_texi'})
+ {
+ # We treat specially formats accepting {} on command line
+ if ($macro eq 'multitable' or defined($Texi2HTML::Config::def_map{$macro}))
+ {
+ add_prev($text, $stack, "\@$macro" . $_);
+ $_ = '';
+ next;
+ }
+ # @ at the end of line may protect te end of line even when
+ # keeping texi
+ if ($macro eq "\n")
+ {
+ $state->{'end_of_line_protected'} = 1;
+ #print STDERR "PROTECTING END OF LINE\n";
+ }
+
+ add_prev($text, $stack, "\@$macro");
+ if ($text_macros{$macro} and $text_macros{$macro} eq 'raw')
+ {
+ $state->{'raw'} = $macro;
+ push (@$stack, {'style' => $macro, 'text' => ''});
+ }
+ next;
+ }
+ # If we are removing texi, the following macros are not removed
+ # as is but modified
+
+ # a raw macro beginning
+ if ($text_macros{$macro} and $text_macros{$macro} eq 'raw')
+ {
+ if (!$Texi2HTML::Config::format_in_paragraph{$macro})
+ { # close paragraph before verbatim (and tex if !L2H)
+ close_paragraph($text, $stack, $state, $line_nr);
+ }
+ $state->{'raw'} = $macro;
+ push (@$stack, {'style' => $macro, 'text' => ''});
+ return if (/^\s*$/);
+ next;
+ }
+ my $simple_macro = 1;
+ # An accent macro
+ if (exists($Texi2HTML::Config::accent_map{$macro}))
+ {
+ if (s/^(\S)//o)
+ {
+ add_prev($text, $stack, do_simple($macro, $1, $state, [ $1 ], $line_nr));
+ }
+ else
+ { # The accent is at end of line
+ add_prev($text, $stack, do_text($macro, $state));
+ }
+ }
+ # an @-command which should be like @command{}. We handle it...
+ elsif ($things_map_ref->{$macro})
+ {
+ echo_warn ("$macro requires {}", $line_nr);
+ add_prev($text, $stack, do_simple($macro, '', $state));
+ }
+ # an @-command like @command
+ elsif (defined($simple_map_ref->{$macro}))
+ {
+ add_prev($text, $stack, do_simple($macro, '', $state));
+ }
+ else
+ {
+ $simple_macro = 0;
+ }
+ if ($simple_macro)
+ {# if the macro didn't triggered a paragraph start it might now
+ begin_paragraph($stack, $state) if
+ ($no_line_macros{$macro} and !no_paragraph($state,$_));
+ next;
+ }
+ # the following macros are not modified but just ignored
+ # if we are removing texi
+ if ($macro =~ /^tex_(\d+)$/o)
+ {
+ add_prev($text, $stack, Texi2HTML::LaTeX2HTML::do_tex($1));
+ next;
+ }
+ if ($state->{'remove_texi'})
+ {
+ if ((($macro =~ /^(\w+?)index$/) and ($1 ne 'print')) or
+ ($macro eq 'itemize') or ($macro =~ /^(|v|f)table$/)
+ or ($macro eq 'multitable') or ($macro eq 'quotation'))
+ {
+ return;
+ }
+ elsif ($macro eq 'enumerate')
+ {
+ my $spec;
+ ($_, $spec) = parse_enumerate ($_);
+ return if (/^\s*$/);
+ next;
+ }
+ elsif (defined($Texi2HTML::Config::def_map{$macro}))
+ {
+ my ($style, $category, $name, $type, $class, $arguments);
+ ($style, $category, $name, $type, $class, $arguments) = parse_def($macro, $_, $line_nr);
+ # FIXME maybe a call to substitute_line with state would
+ # be better ?
+ $category = remove_texi($category) if (defined($category));
+ # FIXME -- --- ''... should be protected (not by makeinfo)
+ $name = remove_texi($name) if (defined($name));
+ # FIXME -- --- ''... should be protected (not by makeinfo)
+ $type = remove_texi($type) if (defined($type));
+ # FIXME -- --- ''... should be protected (not by makeinfo)
+ $class = remove_texi($class) if (defined($class));
+ # FIXME -- --- ''... should be protected
+ $arguments = remove_texi($arguments) if (defined($arguments));
+ chomp($arguments);
+ add_prev($text, $stack, &$Texi2HTML::Config::def_line_no_texi($category, $name, $type, $arguments));
+ return;
+ }
+ next;
+ }
+ if (($macro =~ /^(\w+?)index$/) and ($1 ne 'print'))
+ {
+ add_prev($text, $stack, do_index_entry_label($state,$line_nr));
+ return;
+ }
+ # a macro which triggers paragraph closing
+ if ($macro eq 'insertcopying')
+ {
+ close_paragraph($text, $stack, $state, $line_nr);
+ add_prev($text, $stack, do_insertcopying($state));
+ # reopen a preformatted format if it was interrupted by the macro
+ begin_paragraph ($stack, $state) if ($state->{'preformatted'});
+ return;
+ }
+ if ($macro =~ /^itemx?$/ or ($macro eq 'headitem'))
+ {
+ #print STDERR "ITEM: $_";
+ #dump_stack($text, $stack, $state);
+ # these functions return true if the context was their own
+ abort_empty_preformatted($stack, $state);
+ # FIXME let the user be able not to close the paragraph
+ close_paragraph($text, $stack, $state, $line_nr);
+ my $format;
+ if ($format = add_item($text, $stack, $state, $line_nr, $_))
+ { # handle lists
+ }
+ elsif ($format = add_term($text, $stack, $state, $line_nr))
+ {# handle table
+ }
+ elsif ($format = add_line($text, $stack, $state, $line_nr))
+ {# handle table
+ }
+ if ($format)
+ {
+ if (defined($format->{'appended'}))
+ {
+ $_ = $format->{'appended'} . ' ' . $_ if ($format->{'appended'} ne '');
+ }
+ if (defined($format->{'command'}))
+ {
+ open_arg($format->{'command'},0, $state);
+ }
+ next;
+ }
+ $format = add_row ($text, $stack, $state, $line_nr); # handle multitable
+ unless ($format)
+ {
+ echo_warn ("\@$macro outside of table or list", $line_nr);
+ next;
+ }
+ push @$stack, {'format' => 'row', 'text' => '', 'item_cmd' => $macro };
+ if ($format->{'max_columns'})
+ {
+ push @$stack, {'format' => 'cell', 'text' => ''};
+ $format->{'cell'} = 1;
+
+ if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro))
+ {
+ begin_paragraph($stack, $state);
+ }
+ }
+ else
+ {
+ echo_warn ("\@$macro in empty multitable", $line_nr);
+ }
+ next;
+ }
+ if ($macro eq 'tab')
+ {
+ # FIXME let the user be able not to close the paragraph
+ abort_empty_preformatted($stack, $state);
+ close_paragraph($text, $stack, $state, $line_nr);
+ my $format = add_cell ($text, $stack, $state);
+ #print STDERR "tab, $format->{'cell'}, max $format->{'max_columns'}\n";
+ if (!$format)
+ {
+ echo_warn ("\@tab outside of multitable", $line_nr);
+ #warn "$WARN \@tab outside of multitable\n";
+ }
+ elsif (!$format->{'max_columns'})
+ {
+ echo_warn ("\@$macro in empty multitable", $line_nr);
+ #warn "$WARN \@$macro in empty multitable\n";
+ push @$stack, {'format' => 'null', 'text' => ''};
+ next;
+ }
+ elsif ($format->{'cell'} > $format->{'max_columns'})
+ {
+ echo_warn ("too much \@$macro (multitable has only $format->{'max_columns'} column(s))", $line_nr);
+ #warn "$WARN cell over table width\n";
+ push @$stack, {'format' => 'null', 'text' => ''};
+ next;
+ }
+ else
+ {
+ push @$stack, {'format' => 'cell', 'text' => ''};
+ }
+ if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro))
+ {
+ begin_paragraph($stack, $state);
+ }
+ next;
+ }
+ # Macro opening a format (table, list, deff, example...)
+ if ($format_type{$macro} and ($format_type{$macro} ne 'fake'))
+ {
+ unless ($Texi2HTML::Config::format_in_paragraph{$macro})
+ {
+ close_paragraph($text, $stack, $state, $line_nr);
+ }
+ #print STDERR "begin $macro\n";
+ # A deff like macro
+ if (defined($Texi2HTML::Config::def_map{$macro}))
+ {
+ if ($state->{'deff'} and ("$state->{'deff'}->{'command'}x" eq $macro))
+ {
+ $macro =~ s/x$//o;
+ #print STDERR "DEFx $macro\n";
+ }
+ else
+ {
+ # The previous @def command isn't the same @def
+ # command. We begin the item for the previous @def
+ # command and immediatly open the new one.
+ begin_deff_item($stack, $state, 1) if ($state->{'deff'});
+ $macro =~ s/x$//o;
+ #print STDERR "DEF begin $macro\n";
+ push @$stack, { 'format' => $macro, 'text' => '' };
+ }
+ #print STDERR "BEGIN_DEFF $macro\n";
+ #dump_stack ($text, $stack, $state);
+ $state->{'deff'}->{'command'} = $macro;
+ my ($style, $category, $name, $type, $class, $arguments);
+ #($style, $category, $name, $type, $class, $arguments) = parse_def($macro, $_, $line_nr);
+ ($style, $category, $name, $type, $class, $_) = parse_def($macro, $_, $line_nr);
+ #print STDERR "AFTER parse_def $_";
+ # duplicate_state ?
+ #$category = substitute_line($category) if (defined($category));
+ $state->{'deff'}->{'style'} = $style;
+ $state->{'deff'}->{'category'} = substitute_line($category) if (defined($category));
+ # FIXME -- --- ''... should be protected (not by makeinfo)
+ #$name = substitute_line($name) if (defined($name));
+ $state->{'deff'}->{'name'} = substitute_line($name) if (defined($name));
+ # FIXME -- --- ''... should be protected (not by makeinfo)
+ #$type = substitute_line($type) if (defined($type));
+ $state->{'deff'}->{'type'} = substitute_line($type) if (defined($type));
+ # FIXME -- --- ''... should be protected (not by makeinfo)
+ #$class = substitute_line($class) if (defined($class));
+ $state->{'deff'}->{'class'} = substitute_line($class) if (defined($class));
+ # FIXME -- --- ''... should be protected
+ open_cmd_line($stack, $state, ['keep'], \&do_def_line);
+ next;
+ #$arguments = substitute_line($arguments) if (defined($arguments));
+ #$category = &$Texi2HTML::Config::definition_category($category, $class, $style);
+ #if (! $category) # category cannot be 0
+ #{
+ # echo_warn("Bad definition line $_", $line_nr);
+ # return;
+ #}
+ #my $index_label = main::do_index_entry_label ($state) if ($name ne '');
+ #add_prev ($text, $stack, &$Texi2HTML::Config::def_line($category, $name, $type, $arguments, $index_label));
+ #return;
+ }
+ elsif ($format_type{$macro} eq 'menu')
+ {
+ # if we are allready in a menu we must close it first
+ # in order to close the menu comments and entries
+ close_menu($text, $stack, $state, $line_nr);
+ $state->{'menu'}++;
+ push @$stack, { 'format' => $macro, 'text' => '' };
+ if ($state->{'preformatted'})
+ {
+ # Start a fake complex format in order to have a given pre style
+ $state->{'preformatted'}++;
+ push @$stack, { 'format' => 'menu_preformatted', 'text' => '', 'pre_style' => $Texi2HTML::Config::MENU_PRE_STYLE };
+ push @{$state->{'preformatted_stack'}}, {'pre_style' => $Texi2HTML::Config::MENU_PRE_STYLE, 'class' => 'menu-preformatted' };
+ }
+ }
+ elsif (exists ($Texi2HTML::Config::complex_format_map->{$macro}))
+ {
+ $state->{'preformatted'}++;
+ my $format = { 'format' => $macro, 'text' => '', 'pre_style' => $Texi2HTML::Config::complex_format_map->{$macro}->{'pre_style'} };
+ push @{$state->{'preformatted_stack'}}, {'pre_style' =>$Texi2HTML::Config::complex_format_map->{$macro}->{'pre_style'}, 'class' => $macro };
+ push @$stack, $format;
+ unless ($Texi2HTML::Config::format_in_paragraph{$macro})
+ {
+ begin_paragraph($stack, $state);
+ }
+ }
+ elsif ($Texi2HTML::Config::paragraph_style{$macro})
+ {
+ # if there are only spaces after the @center, then the end
+ # of line has allready been removed and the code triggered
+ # by end of line for @center closing won't be called.
+ # thus we don't open it (opening @center means pushing it
+ # on the paragraph_style stack)
+ next if (($macro eq 'center') and /^\s*$/);
+ push @{$state->{'paragraph_style'}}, $macro;
+ push (@$stack, { 'format' => $macro, 'text' => '' }) unless ($macro eq 'center');
+ if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro))
+ {
+ begin_paragraph($stack, $state);
+ }
+ }
+ elsif (($format_type{$macro} eq 'list') or ($format_type{$macro} eq 'table'))
+ {
+ my $format;
+ #print STDERR "BEGIN $macro\n";
+ #dump_stack($text, $stack, $state);
+ if (($macro eq 'itemize') or ($macro =~ /^(|v|f)table$/))
+ {
+ my $command;
+ my $appended;
+ ($appended, $command) = parse_format_command($_,$macro);
+ $format = { 'format' => $macro, 'text' => '', 'command' => $command, 'appended' => $appended, 'term' => 0 };
+ $_ = '';
+ }
+ elsif ($macro eq 'enumerate')
+ {
+ my $spec;
+ ($_, $spec) = parse_enumerate ($_);
+ $spec = 1 if (!defined($spec));
+ $format = { 'format' => $macro, 'text' => '', 'spec' => $spec, 'item_nr' => 0 };
+ }
+ elsif ($macro eq 'multitable')
+ {
+ my $max_columns = parse_multitable ($_, $line_nr);
+ if (!$max_columns)
+ {
+ echo_warn ("empty multitable", $line_nr);
+ #warn "$WARN empty multitable\n";
+ $max_columns = 0;
+ }
+ $format = { 'format' => $macro, 'text' => '', 'max_columns' => $max_columns, 'cell' => 1 };
+ }
+ $format->{'first'} = 1;
+ $format->{'paragraph_number'} = 0;
+ push @$stack, $format;
+ push @{$state->{'format_stack'}}, $format;
+ if ($macro =~ /^(|v|f)table$/)
+ {
+ push @$stack, { 'format' => 'line', 'text' => ''};
+ }
+ elsif ($macro eq 'multitable')
+ {
+ if ($format->{'max_columns'})
+ {
+ push @$stack, { 'format' => 'row', 'text' => '', 'item_cmd' => $macro };
+ push @$stack, { 'format' => 'cell', 'text' => ''};
+ }
+ else
+ {
+ # multitable without row... We use the special null
+ # format which content is ignored
+ push @$stack, { 'format' => 'null', 'text' => ''};
+ push @$stack, { 'format' => 'null', 'text' => ''};
+ }
+ }
+ if ($format_type{$macro} eq 'list')
+ {
+ push @$stack, { 'format' => 'item', 'text' => ''};
+ }
+ if (($macro ne 'multitable') and
+ !no_paragraph($state,$_) or automatic_preformatted($state,$macro))
+ {
+ begin_paragraph($stack, $state);
+ }
+ return if ($format_type{$macro} eq 'table' or $macro eq 'itemize');
+ }
+ elsif ($macro eq 'float' or $macro eq 'quotation')
+ {
+ push @$stack, {'format' => $macro, 'text' => '' };
+ if ($macro eq 'float')
+ {
+ open_cmd_line($stack, $state, ['keep','keep'], \&do_float_line);
+ }
+ elsif ($macro eq 'quotation')
+ {
+ open_cmd_line($stack, $state, ['keep','keep'], \&do_quotation_line);
+ }
+ #print STDERR "Begin cmd_line\n";
+ #dump_stack($text, $stack, $state);
+ next;
+ }
+ # keep this one at the end as there are some other formats
+ # which are also in format_map
+ elsif (defined($Texi2HTML::Config::format_map{$macro}) or ($format_type{$macro} eq 'cartouche'))
+ {
+ push @$stack, { 'format' => $macro, 'text' => '' };
+ if (!no_paragraph($state,$_) or automatic_preformatted($state,$macro))
+ {
+ begin_paragraph($stack, $state);
+ }
+ }
+ return if (/^\s*$/);
+ next;
+ }
+ $_ = do_unknown ($macro, $_, $text, $stack, $state, $line_nr);
+ next;
+ }
+ elsif(s/^([^{}@,]*)\@([^\s\}\{\@]*)//o)
+ { # A macro with a character which shouldn't appear in macro name
+ add_prev($text, $stack, do_text($1, $state));
+ $_ = do_unknown ($2, $_, $text, $stack, $state, $line_nr);
+ #add_prev($text, $stack, do_text($1 ."\@$2", $state));
+ next;
+ }
+ elsif (s/^([^{},]*)([{}])//o or ($state->{'cmd_line'} and /^([^{},]*)$/))
+ {
+ my $leading_text = $1;
+ my $brace = $2;
+ if (!defined($brace))#in a command line
+ {
+ if (/^$/ and $state->{'end_of_line_protected'} and $state->{'deff'})
+ {
+ return;
+ }
+ chomp $leading_text;
+ }
+ # a brace closed, at the end of line. If in cmd_line we remove
+ # the end of line, such that the end of line is detected
+ elsif ($state->{'cmd_line'} and /^$/)
+ {
+ chomp $_;
+ }
+ add_prev($text, $stack, do_text($leading_text, $state));
+#if ($state->{'cmd_line'}){print STDERR "CMD_LINE\n"; dump_stack($text, $stack, $state);}
+ if (defined($brace) and ($brace eq '{'))
+ {
+ add_prev($text, $stack, '{');
+ unless ($state->{'keep_texi'} or $state->{'remove_texi'})
+ {
+ echo_error ("'{' without macro before: $_", $line_nr);
+ }
+ }
+ else
+ { # A @macroname{ ...} is closed
+ if (@$stack and defined($stack->[-1]->{'style'}))
+ {
+ my $macro = $stack->[-1]->{'style'};
+ if (($macro eq 'cmd_line') and $brace and ($brace eq '}'))
+ {
+ add_prev($text, $stack, '}');
+ unless ($state->{'keep_texi'} or $state->{'remove_texi'})
+ {
+ echo_error ("A '}' without opening '{' before: $_", $line_nr);
+ }
+ next;
+ }
+ my $style = pop @$stack;
+ my $result;
+ if (ref($style_map_ref->{$macro}) eq 'HASH')
+ {
+ push (@{$style->{'args'}}, $style->{'text'});
+ $style->{'fulltext'} .= $style->{'text'};
+ my $number = 0;
+ #foreach my $arg(@{$style->{'args'}})
+ #{
+ #print STDERR " $number: $arg\n";
+ # $number++;
+ #}
+ $style->{'text'} = $style->{'fulltext'};
+ $state->{'keep_texi'} = 0 if (#$state->{'keep_texi'}
+ ($style_map_ref->{$macro}->{'args'}->[$style->{'arg_nr'}] eq 'keep')
+ and ($state->{'keep_nr'} == 1));
+ }
+ $state->{'no_paragraph'}-- if ($no_paragraph_macro{$macro});
+ if ($macro)
+ {
+ $style->{'no_close'} = 1 if ($state->{'no_close'});
+ if ($state->{'keep_texi'})
+ { # don't expand macros in anchor and ref
+ close_arg ($macro, $style->{'arg_nr'}, $state);
+ $result = '@' . $macro . '{' . $style->{'text'} . '}';
+ }
+ else
+ {
+ if ($style_map_ref->{$macro} and !$style->{'no_close'} and (defined($style_type{'$macro'})) and (($style_type{'$macro'} eq 'style') or ($style_type{'$macro'} eq 'accent')))
+ {
+ my $style = pop @{$state->{'style_stack'}};
+ print STDERR "Bug: $style on 'style_stack', not $macro\n" if ($style ne $macro);
+ }
+ $result = do_simple($macro, $style->{'text'}, $state, $style->{'args'}, $line_nr, $style->{'no_open'}, $style->{'no_close'});
+ if ($state->{'code_style'} < 0)
+ {
+ echo_error ("Bug: negative code_style: $state->{'code_style'}, line:$_", $line_nr);
+ }
+ }
+ }
+ else
+ {
+ #$result = $style->{'text'} . '}';
+ print STDERR "Bug: empty style in pass_text\n";
+ }
+ add_prev($text, $stack, $result);
+ if ($state->{'cmd_line'} and ($style->{'style'} eq 'cmd_line'))
+ {
+ if ($state->{'deff'})
+ {
+#print STDERR "DO DEFF $state->{'deff'}->{'command'} $state->{'deff'}->{'arguments'}\n";
+ my $def_style = $state->{'deff'}->{'style'};
+ my $category = $state->{'deff'}->{'category'};
+ my $class = $state->{'deff'}->{'class'};
+ my $type = $state->{'deff'}->{'type'};
+ my $name = $state->{'deff'}->{'name'};
+ #my $arguments = $state->{'deff'}->{'arguments'};
+ my $arguments;
+ $arguments = substitute_line($state->{'deff'}->{'arguments'}) if (defined($state->{'deff'}->{'arguments'}));
+
+ $category = &$Texi2HTML::Config::definition_category($category, $class, $def_style);
+ if (! $category) # category cannot be 0
+ {
+ echo_warn("Bad definition line $_", $line_nr);
+ delete $state->{'cmd_line'};
+ return '';
+ }
+ my $index_label = do_index_entry_label ($state,$line_nr) if ($name ne '');
+ add_prev($text, $stack, &$Texi2HTML::Config::def_line($category, $name, $type, $arguments, $index_label));
+ }
+ else
+ # we've got to mark paragraph here as the following
+ # line will determine whether or not we open a paragraph
+ {
+ $state->{'open_paragraph'} = 1;
+ }
+ delete $state->{'cmd_line'};
+ $state->{'no_paragraph'}--;
+ return;
+ }
+ next;
+ }
+ else
+ {
+ echo_error("'}' without opening '{' before: $_", $line_nr);
+ # we cannot be in cmd_line as the stack is empty
+ if ($state->{'cmd_line'})
+ {
+ print STDERR "Bug: state->{'cmd_line'} true but stack empty\n";
+ dump_stack($text, $stack, $state);
+ delete $state->{'cmd_line'};
+ }
+ add_prev($text, $stack, '}') if ($state->{'keep_texi'});
+ }
+ }
+ }
+ elsif (s/^([^,]*)([,])//o)
+ {
+ add_prev($text, $stack, do_text($1, $state));
+ my $comma = $2;
+ if ($state->{'cmd_line'} and !@$stack)
+ {
+ print STDERR "Bug: state->{'cmd_line'} = $state->{'cmd_line'} but no stack\n";
+ dump_stack($text, $stack, $state);
+ }
+ if (@$stack and defined($stack->[-1]->{'style'})
+ and (ref($style_map_ref->{$stack->[-1]->{'style'}}) eq 'HASH'))
+ {
+ my $macro = $stack->[-1]->{'style'};
+ my $style_args = $style_map_ref->{$macro}->{'args'};
+ if (defined($style_args->[$stack->[-1]->{'arg_nr'} + 1]))
+ {
+ push (@{$stack->[-1]->{'args'}}, $stack->[-1]->{'text'});
+ $stack->[-1]->{'fulltext'} .= $stack->[-1]->{'text'} . do_text(',', $state);
+ $stack->[-1]->{'text'} = '';
+ close_arg ($macro, $stack->[-1]->{'arg_nr'}, $state);
+ $stack->[-1]->{'arg_nr'}++;
+ open_arg ($macro, $stack->[-1]->{'arg_nr'}, $state);
+ next;
+ }
+ }
+ add_prev($text, $stack, do_text(',', $state));
+ }
+ else
+ { # no macro nor '}', but normal text
+ add_prev($text, $stack, do_text($_, $state));
+ #print STDERR "END LINE: $_";
+ #dump_stack($text, $stack, $state);
+
+ # @item line is closed by end of line
+ add_term($text, $stack, $state, $line_nr);
+ # FIXME test @center @item and @item @center
+ if ($state->{'paragraph_style'}->[-1] eq 'center' and !$state->{'close_stack'})
+ {
+ close_paragraph($text, $stack, $state, $line_nr);
+ pop @{$state->{'paragraph_style'}};
+ #$_ = $/ if (chomp($_));
+ $_ = '';
+ next;
+ }
+ last;
+ }
+ }
+ return 1;
+}
+
+sub open_arg($$$)
+{
+ my $macro = shift;
+ my $arg_nr = shift;
+ my $state = shift;
+ if (ref($style_map_ref->{$macro}) eq 'HASH')
+ {
+ my $arg = $style_map_ref->{$macro}->{'args'}->[$arg_nr];
+ if ($arg eq 'code' and !$state->{'keep_texi'})
+ {
+ $state->{'code_style'}++;
+ }
+ elsif ($arg eq 'keep')
+ {
+ $state->{'keep_nr'}++;
+ $state->{'keep_texi'} = 1;
+ }
+ }
+ elsif ($code_style_map{$macro} and !$state->{'keep_texi'})
+ {
+ $state->{'code_style'}++;
+ }
+}
+
+sub close_arg($$$)
+{
+ my $macro = shift;
+ my $arg_nr = shift;
+ my $state = shift;
+ if (ref($style_map_ref->{$macro}) eq 'HASH')
+ {
+ my $arg = $style_map_ref->{$macro}->{'args'}->[$arg_nr];
+ if ($arg eq 'code' and !$state->{'keep_texi'})
+ {
+ $state->{'code_style'}--;
+ }
+ elsif ($arg eq 'keep')
+ {
+ $state->{'keep_nr'}--;
+ $state->{'keep_texi'} = 0 if ($state->{'keep_nr'} == 0);
+ }
+#print STDERR "c $arg_nr $macro $arg $state->{'code_style'}\n";
+ }
+ elsif ($code_style_map{$macro} and !$state->{'keep_texi'})
+ {
+ $state->{'code_style'}--;
+ }
+}
+
+sub open_cmd_line($$$$)
+{
+ my $stack = shift;
+ my $state = shift;
+ my $args = shift;
+ my $function = shift;
+ push @$stack, {'style' => 'cmd_line', 'text' => '', 'arg_nr' => 0};
+ foreach my $hash (\%Texi2HTML::Config::style_map, \%Texi2HTML::Config::style_map_pre, \%Texi2HTML::Config::style_map_texi, \%Texi2HTML::Config::unformatted_text_style_map_texi)
+ {
+ $hash->{'cmd_line'}->{'args'} = $args;
+ $hash->{'cmd_line'}->{'function'} = $function;
+ }
+ $state->{'no_paragraph'}++;
+ open_arg ('cmd_line', 0, $state);
+ $state->{'cmd_line'} = 1;
+}
+
+sub get_value($)
+{
+ my $value = shift;
+ return $value{$value} if ($value{$value});
+ return "No value for $value";
+}
+
+sub add_term($$$$;$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $end = shift;
+ return unless (exists ($state->{'format_stack'}));
+ my $format = $state->{'format_stack'}->[-1];
+ return unless (($format_type{$format->{'format'}} eq 'table') and ($format->{'format'} ne 'multitable' ) and $format->{'term'});
+ #print STDERR "ADD_TERM\n";
+ # we set 'term' = 0 early such that if we encounter an end of line
+ # during close_stack we don't try to do the term once more
+ $state->{'format_stack'}->[-1]->{'term'} = 0;
+ $format->{'paragraph_number'} = 0;
+ # no <pre> allowed in <dt>, thus it is possible there is a @t added
+ # to have teletype in preformatted.
+ if ($state->{'preformatted'} and $stack->[-1]->{'style'} and ($stack->[-1]->{'style'} eq 't'))
+ {
+ my $style = pop @$stack;
+ add_prev($text, $stack, do_simple($style->{'style'}, $style->{'text'}, $state, [$style->{'text'}]));
+ }
+
+ #dump_stack($text, $stack, $state);
+ close_stack($text, $stack, $state, $line_nr, undef, 'term');
+ my $term = pop @$stack;
+ my $command_formatted;
+ chomp ($term->{'text'});
+ if (exists($style_map_ref->{$format->{'command'}}) and
+ !exists($Texi2HTML::Config::special_list_commands{$format->{'format'}}->{$format->{'command'}}) and ($style_type{$format->{'command'}} eq 'style'))
+ {
+ my $leading_spaces = '';
+ my $trailing_spaces = '';
+ $term->{'text'} =~ s/^(\s*)//;
+ $leading_spaces = $1 if (defined($1));
+ $term->{'text'} =~ s/(\s*)$//;
+ $trailing_spaces = $1 if (defined($1));
+ $term->{'text'} = do_simple($format->{'command'}, $term->{'text'}, $state, [$term->{'text'}]);
+ $term->{'text'} = $leading_spaces. $term->{'text'} .$trailing_spaces;
+ }
+ elsif (exists($things_map_ref->{$format->{'command'}}))
+ {
+ $command_formatted = do_simple($format->{'command'}, '', $state);
+ }
+ my $index_label;
+ if ($format->{'format'} =~ /^(f|v)/)
+ {
+ $index_label = do_index_entry_label($state,$line_nr);
+ print STDERR "Bug: no index entry for $text" unless defined($index_label);
+ }
+ add_prev($text, $stack, &$Texi2HTML::Config::table_item($term->{'text'}, $index_label,$format->{'format'},$format->{'command'}, $command_formatted));
+ #add_prev($text, $stack, &$Texi2HTML::Config::table_item($term->{'text'}, $index_entry, $state));
+ unless ($end)
+ {
+ push (@$stack, { 'format' => 'line', 'text' => '' });
+ begin_paragraph($stack, $state) if ($state->{'preformatted'});
+ }
+ return $format;
+}
+
+sub add_row($$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $format = $state->{'format_stack'}->[-1];
+ return unless ($format->{'format'} eq 'multitable');
+ if ($format->{'cell'} > $format->{'max_columns'})
+ {
+ close_stack($text, $stack, $state, $line_nr, undef, 'null');
+ pop @$stack;
+ }
+ unless ($format->{'max_columns'})
+ { # empty multitable
+ pop @$stack; # pop 'row'
+ return $format;
+ }
+ if ($format->{'first'})
+ { # first row
+ $format->{'first'} = 0;
+ #dump_stack($text, $stack, $state);
+ #if ($stack->[-1]->{'format'} and ($stack->[-1]->{'format'} eq 'paragraph') and ($stack->[-1]->{'text'} =~ /^\s*$/) and ($format->{'cell'} == 1))
+ if ($stack->[-1]->{'format'} and ($stack->[-1]->{'format'} eq 'cell') and ($stack->[-1]->{'text'} =~ /^\s*$/) and ($format->{'cell'} == 1))
+ {
+ pop @$stack;
+ pop @$stack;
+ #pop @$stack;
+ return $format;
+ }
+ }
+ add_cell($text, $stack, $state);
+ my $row = pop @$stack;
+ add_prev($text, $stack, &$Texi2HTML::Config::row($row->{'text'}, $row->{'item_cmd'}));
+ return $format;
+}
+
+sub add_cell($$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $format = $state->{'format_stack'}->[-1];
+ return unless ($format->{'format'} eq 'multitable');
+ if ($format->{'cell'} <= $format->{'max_columns'})
+ {
+ close_stack($text, $stack, $state, $line_nr, undef, 'cell');
+ my $cell = pop @$stack;
+ my $row = top_stack($stack);
+ print STDERR "Bug: top_stack of cell not a row\n" if (!defined($row) or !defined($row->{'format'}) or ($row->{'format'} ne 'row'));
+ add_prev($text, $stack, &$Texi2HTML::Config::cell($cell->{'text'}, $row->{'item_cmd'}));
+ $format->{'cell'}++;
+ }
+ return $format;
+}
+
+sub add_line($$$$;$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $end = shift;
+ my $format = $state->{'format_stack'}->[-1];
+ return unless ($format_type{$format->{'format'}} eq 'table' and ($format->{'format'} ne 'multitable') and ($format->{'term'} == 0));
+ #print STDERR "ADD_LINE\n";
+ #dump_stack($text, $stack, $state);
+ # as in pre the end of line are kept, we must explicitely abort empty
+ # preformatted, close_stack doesn't abort the empty preformatted regions.
+ abort_empty_preformatted($stack, $state) if ($format->{'first'});
+ close_stack($text, $stack, $state, $line_nr, undef, 'line');
+ my $line = pop @$stack;
+ $format->{'paragraph_number'} = 0;
+ my $first = 0;
+ $first = 1 if ($format->{'first'});
+ if ($first)
+ {
+ $format->{'first'} = 0;
+ # we must have <dd> or <dt> following <dl> thus we do a
+ # &$Texi2HTML::Config::table_line here too, although it could have been nice to
+ # have a normal paragraph.
+ add_prev($text, $stack, &$Texi2HTML::Config::table_line($line->{'text'})) if ($line->{'text'} =~ /\S/o);
+ }
+ else
+ {
+ add_prev($text, $stack, &$Texi2HTML::Config::table_line($line->{'text'}));
+ }
+ unless($end)
+ {
+ push (@$stack, { 'format' => 'term', 'text' => '' });
+ # we cannot have a preformatted in table term (no <pre> in <dt>)
+ # thus we set teletyped style @t if there is no pre_style
+ push (@$stack, { 'style' => 't', 'text' => '' }) if ($state->{'preformatted'} and (!$state->{'preformatted_stack'}->[-1]->{'pre_style'}));
+ #push (@$stack, { 'style' => $format->{'command'}, 'text' => $format->{'appended'} });
+ }
+ $format->{'term'} = 1;
+ return $format;
+}
+
+sub add_item($$$$;$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $line = shift;
+ my $end = shift;
+ my $format = $state->{'format_stack'}->[-1];
+ return unless ($format_type{$format->{'format'}} eq 'list');
+ #print STDERR "ADD_ITEM: \n";
+ # as in pre the end of line are kept, we must explicitely abort empty
+ # preformatted, close_stack doesn't do that.
+ abort_empty_preformatted($stack, $state) if ($format->{'first'});
+ close_stack($text, $stack, $state, $line_nr, undef, 'item');
+ $format->{'paragraph_number'} = 0;
+ if ($format->{'format'} eq 'enumerate')
+ {
+ $format->{'number'} = '';
+ my $spec = $format->{'spec'};
+ $format->{'item_nr'}++;
+ if ($spec =~ /^[0-9]$/)
+ {
+ $format->{'number'} = $spec + $format->{'item_nr'} - 1;
+ }
+ else
+ {
+ my $base_letter = ord('a');
+ $base_letter = ord('A') if (ucfirst($spec) eq $spec);
+
+ my @letter_ords = decompose(ord($spec) - $base_letter + $format->{'item_nr'} - 1, 26);
+ foreach my $ord (@letter_ords)
+ {#FIXME? we go directly to 'ba' after 'z', and not 'aa'
+ #because 'ba' is 1,0 and 'aa' is 0,0.
+ $format->{'number'} = chr($base_letter + $ord) . $format->{'number'};
+ }
+ }
+ }
+
+ #dump_stack ($text, $stack, $state);
+ my $item = pop @$stack;
+ # the element following ol or ul must be li. Thus even though there
+ # is no @item we put a normal item.
+
+ # don't do an item if it is the first and it is empty
+ if (!$format->{'first'} or ($item->{'text'} =~ /\S/o))
+ {
+ my $formatted_command;
+ if (defined($format->{'command'}) and exists($things_map_ref->{$format->{'command'}}))
+ {
+ $formatted_command = do_simple($format->{'command'}, '', $state);
+ }
+ #chomp($item->{'text'});
+ add_prev($text, $stack, &$Texi2HTML::Config::list_item($item->{'text'},$format->{'format'},$format->{'command'}, $formatted_command, $format->{'item_nr'}, $format->{'spec'}, $format->{'number'}));
+ }
+ if ($format->{'first'})
+ {
+ $format->{'first'} = 0;
+ }
+
+ # Now prepare the new item
+ unless($end)
+ {
+ push (@$stack, { 'format' => 'item', 'text' => '' });
+ begin_paragraph($stack, $state) unless (!$state->{'preformatted'} and no_line($line));
+ }
+ return $format;
+}
+
+# format ``simple'' macros, that is macros without arg or style macros
+sub do_simple($$$;$$$$)
+{
+ my $macro = shift;
+ my $text = shift;
+ my $state = shift;
+ my $args = shift;
+ my $line_nr = shift;
+ my $no_open = shift;
+ my $no_close = shift;
+ my $result;
+
+ my $arg_nr = 0;
+ $arg_nr = @$args - 1 if (defined($args));
+
+#print STDERR "DO_SIMPLE $macro $arg_nr $args @$args\n" if (defined($args));
+ if (defined($simple_map_ref->{$macro}))
+ {
+ # \n may in certain circumstances, protect end of lines
+ if ($macro eq "\n")
+ {
+ $state->{'end_of_line_protected'} = 1;
+ #print STDERR "PROTECTING END OF LINE\n";
+ }
+ if ($state->{'keep_texi'})
+ {
+ return "\@$macro";
+ }
+ elsif ($state->{'remove_texi'})
+ {
+#print STDERR "DO_SIMPLE remove_texi $macro\n";
+ return $simple_map_texi_ref->{$macro};
+ }
+ elsif ($state->{'preformatted'})
+ {
+ return $simple_map_pre_ref->{$macro};
+ }
+ else
+ {
+ return $simple_map_ref->{$macro};
+ }
+ }
+ if (defined($things_map_ref->{$macro}))
+ {
+ if ($state->{'keep_texi'})
+ {
+ $result = "\@$macro" . '{}';
+ }
+ elsif ($state->{'remove_texi'})
+ {
+ $result = $texi_map_ref->{$macro};
+#print STDERR "DO_SIMPLE remove_texi texi_map $macro\n";
+ }
+ elsif ($state->{'preformatted'})
+ {
+ $result = $pre_map_ref->{$macro};
+ }
+ else
+ {
+ $result = $things_map_ref->{$macro};
+ }
+ return $result . $text;
+ }
+ elsif (defined($style_map_ref->{$macro}))
+ {
+ if ($state->{'keep_texi'})
+ {
+ $result = "\@$macro" . '{' . $text . '}';
+ }
+ else
+ {
+ my $style;
+ if ($state->{'remove_texi'})
+ {
+#print STDERR "REMOVE $macro, $style_map_texi_ref->{$macro}, fun $style_map_texi_ref->{$macro}->{'function'} remove cmd " . \&Texi2HTML::Config::t2h_remove_command . " ascii acc " . \&t2h_default_ascii_accent;
+ $style = $style_map_texi_ref->{$macro};
+ }
+ elsif ($state->{'preformatted'})
+ {
+ $style = $style_map_pre_ref->{$macro};
+ }
+ else
+ {
+ $style = $style_map_ref->{$macro};
+ }
+ if (defined($style))
+ { # known style
+ $result = &$Texi2HTML::Config::style($style, $macro, $text, $args, $no_close, $no_open, $line_nr, $state, $state->{'style_stack'});
+ }
+ if (!$no_close)
+ {
+ close_arg($macro,$arg_nr, $state);
+ }
+ }
+ return $result;
+ }
+ # Unknown macro
+ $result = '';
+ my ($done, $result_text, $message) = &$Texi2HTML::Config::unknown_style($macro, $text);
+ if ($done)
+ {
+ echo_warn($message, $line_nr) if (defined($message));
+ if (defined($result_text))
+ {
+ $result = $result_text;
+ }
+ }
+ else
+ {
+ unless ($no_open)
+ { # we warn only if no_open is true, i.e. it is the first time we
+ # close the macro for a multiline macro
+ echo_warn ("Unknown command with braces `\@$macro'", $line_nr);
+ $result = do_text("\@$macro") . "{";
+ }
+ $result .= $text;
+ $result .= '}' unless ($no_close);
+ }
+ return $result;
+}
+
+sub do_unknown($$$$$$)
+{
+ my $macro = shift;
+ my $line = shift;
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my ($result_line, $result, $result_text, $message) = &$Texi2HTML::Config::unknown($macro, $line);
+ if ($result)
+ {
+ add_prev ($text, $stack, $result_text) if (defined($result_text));
+ echo_warn($message, $line_nr) if (defined($message));
+ return $result_line;
+ }
+ else
+ {
+ echo_warn ("Unknown command `\@$macro' (left as is)", $line_nr);
+ add_prev ($text, $stack, do_text("\@$macro"));
+ return $line;
+ }
+}
+
+# used only during @macro processing
+sub add_text($@)
+{
+ my $string = shift;
+
+ return if (!defined($string));
+ foreach my $scalar_ref (@_)
+ {
+ next unless defined($scalar_ref);
+ if (!defined($$scalar_ref))
+ {
+ $$scalar_ref = $string;
+ }
+ else
+ {
+ $$scalar_ref .= $string;
+ }
+ return;
+ }
+}
+
+sub add_prev ($$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $string = shift;
+
+ unless (defined($text) and ref($text) eq "SCALAR")
+ {
+ die "text not a SCALAR ref: " . ref($text) . "";
+ }
+ #if (!defined($stack) or (ref($stack) ne "ARRAY"))
+ #{
+ # $string = $stack;
+ # $stack = [];
+ #}
+
+ return if (!defined($string));
+ if (@$stack)
+ {
+ $stack->[-1]->{'text'} .= $string;
+ return;
+ }
+
+ if (!defined($$text))
+ {
+ $$text = $string;
+ }
+ else
+ {
+ $$text .= $string;
+ }
+}
+
+sub close_stack_texi_structure($$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+
+ return undef unless (@$stack or $state->{'raw'} or $state->{'macro'} or $state->{'macro_name'} or $state->{'ignored'});
+
+ my $stack_level = $#$stack + 1;
+ my $string = '';
+
+ if ($state->{'ignored'})
+ {
+ $string .= "\@end $state->{'ignored'} ";
+ echo_warn ("closing $state->{'ignored'}", $line_nr);
+ }
+ if ($state->{'texi'})
+ {
+ if ($state->{'macro'})
+ {
+ $string .= "\@end macro ";
+ echo_warn ("closing macro", $line_nr);
+ }
+ elsif ($state->{'macro_name'})
+ {
+ $string .= ('}' x $state->{'macro_depth'}) . " ";
+ echo_warn ("closing $state->{'macro_name'} ($state->{'macro_depth'} braces missing)", $line_nr);
+ }
+ elsif ($state->{'verb'})
+ {
+ echo_warn ("closing \@verb", $line_nr);
+ $string .= $state->{'verb'} . '}';
+ }
+ elsif ($state->{'raw'})
+ {
+ echo_warn ("closing \@$state->{'raw'} raw format", $line_nr);
+ $string .= "\@end $state->{'raw'} ";
+ }
+ if ($string ne '')
+ {
+ #print STDERR "scan_texi ($string)\n";
+ scan_texi ($string, $text, $stack, $state, $line_nr);
+ $string = '';
+ }
+ }
+ elsif ($state->{'verb'})
+ {
+ $string .= $state->{'verb'};
+ }
+
+ while ($stack_level--)
+ {
+ my $stack_text = $stack->[$stack_level]->{'text'};
+ $stack_text = '' if (!defined($stack_text));
+ if ($stack->[$stack_level]->{'format'})
+ {
+ my $format = $stack->[$stack_level]->{'format'};
+ if ($format eq 'index_item')
+ {
+ enter_table_index_entry($text, $stack, $state, $line_nr);
+ next;
+ }
+ elsif (!defined($format_type{$format}) or ($format_type{$format} ne 'fake'))
+ {
+ $stack_text = "\@$format\n" . $stack_text;
+ }
+ }
+ elsif (defined($stack->[$stack_level]->{'style'}))
+ {
+ my $style = $stack->[$stack_level]->{'style'};
+ if ($style ne '')
+ {
+ $stack_text = "\@$style\{" . $stack_text;
+ }
+ else
+ {
+ $stack_text = "\{" . $stack_text;
+ }
+ }
+ pop @$stack;
+ add_prev($text, $stack, $stack_text);
+ }
+ $stack = [ ];
+ $stack_level = 0;
+ #return ($text, [ ], $state);
+
+ $state->{'close_stack'} = 1;
+ if ($string ne '')
+ {
+ if ($state->{'texi'})
+ {
+ #print STDERR "scan_texi in close_stack ($string)\n";
+ scan_texi($string, $text, $stack, $state, $line_nr);
+ }
+ elsif ($state->{'structure'})
+ {
+ #print STDERR "scan_structure in close_stack ($string)\n";
+ scan_structure($string, $text, $stack, $state, $line_nr);
+ }
+ }
+ delete $state->{'close_stack'};
+}
+
+
+# close the stack, closing macros and formats left open.
+# the precise behavior of the function depends on $close_paragraph:
+# undef -> close everything
+# defined -> remove empty paragraphs, close until the first format or paragraph.
+# 1 -> don't close styles, duplicate stack of styles not closed
+# FIXME never used
+# '' -> close styles, don't duplicate
+
+# if a $format is given the stack is closed according to $close_paragraph but
+# if $format is encountered the closing stops
+
+sub close_stack($$$$;$$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ my $close_paragraph = shift;
+ my $format = shift;
+ # FIXME this is not used
+ my $search_style = shift;
+ my $new_stack;
+
+ # cancel paragraph states
+ $state->{'paragraph_style'} = [ '' ] unless (defined($close_paragraph) or defined($format));
+ #print STDERR "sub_close_stack\n";
+ return $new_stack unless (@$stack);
+
+ my $stack_level = $#$stack + 1;
+ my $string = '';
+ my $verb = '';
+
+ if ($state->{'verb'})
+ {
+ $string .= $state->{'verb'};
+ $verb = $state->{'verb'};
+ }
+
+ #debugging
+ #my $print_format = 'NO FORMAT';
+ #$print_format = $format if ($format);
+ #my $print_close_paragraph = 'close everything';
+ #$print_close_paragraph = 'close paragraph without duplicating' if (defined($close_paragraph));
+ #$print_close_paragraph = $close_paragraph if ($close_paragraph);
+ #print STDERR "Close_stack: format $print_format, close_paragraph: $print_close_paragraph\n";
+
+ while ($stack_level--)
+ {
+ if ($stack->[$stack_level]->{'format'})
+ {
+ my $stack_format = $stack->[$stack_level]->{'format'};
+ last if (defined($close_paragraph) or (defined($format) and $stack_format eq $format));
+ # We silently close paragraphs, preformatted sections and fake formats
+ if ($stack_format eq 'paragraph')
+ {
+ $string .= "\@end_paragraph ";
+ }
+ elsif ($stack_format eq 'preformatted')
+ {
+ $string .= "\@end_preformatted ";
+ }
+ else
+ {
+ if ($fake_format{$stack_format})
+ {
+ warn "# Closing a fake format `$stack_format'\n" if ($T2H_VERBOSE);
+ }
+ else
+ {
+ echo_warn ("closing `$stack_format'", $line_nr);
+ #dump_stack ($text, $stack, $state);
+ #warn "$WARN closing `$stack_format'\n";
+ }
+ $string .= "\@end $stack_format ";
+ }
+ }
+ else
+ {
+ my $style = $stack->[$stack_level]->{'style'};
+ last if (defined($search_style) and $style eq $search_style);
+ # FIXME images, footnotes, xrefs, anchors with $close_paragraphs ?
+ if ($close_paragraph)
+ { #duplicate the stack
+ if (exists($style_type{$style}) and ($style_type{$style} eq 'style') or (!exists($style_type{$style})))
+ {
+ push @$new_stack, { 'style' => $style, 'text' => '', 'no_open' => 1, 'arg_nr' => 0 };
+ $string .= '} ';
+ }
+ elsif (exists($style_type{$style}) and ($style_type{$style} eq 'simple'))
+ {
+ $string .= '} ';
+ }
+ }
+ else
+ {
+ dump_stack ($text, $stack, $state) if (!defined($style));
+ $string .= '}';
+ echo_warn ("closing $style", $line_nr) if ($style);
+ }
+ }
+ }
+ $state->{'no_close'} = 1 if ($close_paragraph);
+ $state->{'close_stack'} = 1;
+ if ($string ne '')
+ {
+ #print STDERR "scan_line in CLOSE_STACK ($string)\n";
+ #dump_stack ($text, $stack, $state);
+ scan_line($string, $text, $stack, $state, $line_nr);
+ }
+ delete $state->{'no_close'};
+ delete $state->{'close_stack'};
+ $state->{'verb'} = $verb if (($verb ne '') and $close_paragraph);
+ return $new_stack;
+}
+
+# given a stack and a list of formats, return true if the stack contains
+# these formats, first on top
+sub stack_order($@)
+{
+ my $stack = shift;
+ my $stack_level = $#$stack + 1;
+ while (@_)
+ {
+ my $format = shift;
+ while ($stack_level--)
+ {
+ if ($stack->[$stack_level]->{'format'})
+ {
+ if ($stack->[$stack_level]->{'format'} eq $format)
+ {
+ $format = undef;
+ last;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+ return 0 if ($format);
+ }
+ return 1;
+}
+
+sub top_format($)
+{
+ my $stack = shift;
+ my $stack_level = $#$stack + 1;
+ while ($stack_level--)
+ {
+ if ($stack->[$stack_level]->{'format'} and !$fake_format{$stack->[$stack_level]->{'format'}})
+ {
+ return $stack->[$stack_level];
+ }
+ }
+ return undef;
+}
+
+sub close_paragraph($$$;$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+ my $line_nr = shift;
+ #my $macro = shift;
+ #print STDERR "CLOSE_PARAGRAPH\n";
+ #dump_stack($text, $stack, $state);
+ my $new_stack = close_stack($text, $stack, $state, $line_nr, 1);
+ my $top_stack = top_stack($stack);
+ if ($top_stack and !defined($top_stack->{'format'}))
+ { #debug
+ print STDERR "Bug: no format on top stack\n";
+ dump_stack($text, $stack, $state);
+ }
+ if ($top_stack and ($top_stack->{'format'} eq 'paragraph'))
+ {
+ my $paragraph = pop @$stack;
+ add_prev($text, $stack, do_paragraph($paragraph->{'text'}, $state));
+ $state->{'paragraph_macros'} = $new_stack;
+ return 1;
+ #return "\@$macro ";
+ }
+ elsif ($top_stack and ($top_stack->{'format'} eq 'preformatted'))
+ {
+ my $paragraph = pop @$stack;
+ add_prev($text, $stack, do_preformatted($paragraph->{'text'}, $state));
+ $state->{'paragraph_macros'} = $new_stack;
+ return 1;
+ #return "\@$macro ";
+ }
+ return;
+}
+
+sub abort_empty_preformatted($$)
+{
+ my $stack = shift;
+ my $state = shift;
+ if (@$stack and $stack->[-1]->{'format'}
+ and ($stack->[-1]->{'format'} eq 'preformatted')
+ and ($stack->[-1]->{'text'} !~ /\S/))
+ {
+ pop @$stack;
+ return 1;
+ }
+ return 0;
+}
+
+# for debugging
+sub dump_stack($$$)
+{
+ my $text = shift;
+ my $stack = shift;
+ my $state = shift;
+
+ if (defined($$text))
+ {
+ print STDERR "text: $$text\n";
+ }
+ else
+ {
+ print STDERR "text: UNDEF\n";
+ }
+ print STDERR "state: ";
+ foreach my $key (keys(%$state))
+ {
+ my $value = 'UNDEF';
+ $value = $state->{$key} if (defined($state->{$key}));
+ print STDERR "$key: $value ";
+ }
+ print STDERR "\n";
+ my $stack_level = $#$stack + 1;
+ while ($stack_level--)
+ {
+ print STDERR " $stack_level-> ";
+ foreach my $key (keys(%{$stack->[$stack_level]}))
+ {
+ my $value = 'UNDEF';
+ $value = $stack->[$stack_level]->{$key} if
+ (defined($stack->[$stack_level]->{$key}));
+ print STDERR "$key: $value ";
+ }
+ print STDERR "\n";
+ }
+ if (defined($state->{'format_stack'}))
+ {
+ print STDERR "format_stack: ";
+ foreach my $format (@{$state->{'format_stack'}})
+ {
+ print STDERR "$format->{'format'} ";
+ }
+ print STDERR "\n";
+ }
+}
+
+# for debugging
+sub print_elements($)
+{
+ my $elements = shift;
+ foreach my $elem(@$elements)
+ {
+ if ($elem->{'node'})
+ {
+ print STDERR "node-> $elem ";
+ }
+ else
+ {
+ print STDERR "chap=> $elem ";
+ }
+ foreach my $key (keys(%$elem))
+ {
+ my $value = "UNDEF";
+ $value = $elem->{$key} if (defined($elem->{$key}));
+ print STDERR "$key: $value ";
+ }
+ print STDERR "\n";
+ }
+}
+
+sub substitute_line($;$)
+{
+ my $line = shift;
+ my $state = shift;
+ $state = {} if (!defined($state));
+ $state->{'no_paragraph'} = 1;
+ return unformatted_text($state, $line) if ($state->{'unformatted'});
+ return substitute_text($state, $line);
+}
+
+sub substitute_text($@)
+{
+ my $state = shift;
+ my @stack = ();
+ my $text = '';
+ my $result = '';
+ if ($state->{'structure'})
+ {
+ initialise_state_structure($state);
+ }
+ elsif ($state->{'texi'})
+ {
+ initialise_state_texi($state);
+ }
+ else
+ {
+ initialise_state($state);
+ }
+ $state->{'spool'} = [];
+ #print STDERR "SUBST_TEXT begin\n";
+
+ while (@_ or @{$state->{'spool'}})
+ {
+ my $line;
+ if (@{$state->{'spool'}})
+ {
+ $line = shift @{$state->{'spool'}};
+ }
+ else
+ {
+ $line = shift @_;
+ }
+ next unless (defined($line));
+ if ($state->{'structure'})
+ {
+ scan_structure ($line, \$text, \@stack, $state);
+ }
+ elsif ($state->{'texi'})
+ {
+ scan_texi ($line, \$text, \@stack, $state);
+ }
+ else
+ {
+ scan_line($line, \$text, \@stack, $state);
+ }
+ next if (@stack);
+ $result .= $text;
+ $text = '';
+ }
+ # FIXME could we have the line number ?
+ # close stack in substitute_text
+ if ($state->{'texi'} or $state->{'structure'})
+ {
+ close_stack_texi_structure(\$text, \@stack, $state, undef);
+ }
+ else
+ {
+ close_stack(\$text, \@stack, $state, undef);
+ }
+ #print STDERR "SUBST_TEXT end\n";
+ return $result . $text;
+}
+
+sub substitute_texi_line($)
+{
+ my $text = shift;
+ my @text = substitute_text({'structure' => 1}, $text);
+ my @result = ();
+ while (@text)
+ {
+ push @result, split (/\n/, shift (@text));
+ }
+ return '' unless (@result);
+ my $result = shift @result;
+ return $result . "\n" unless (@result);
+ foreach my $line (@result)
+ {
+ chomp $line;
+ $result .= ' ' . $line;
+ }
+ return $result . "\n";
+}
+
+sub print_lines($;$)
+{
+ my ($fh, $lines) = @_;
+ $lines = $Texi2HTML::THIS_SECTION unless $lines;
+ my @cnt;
+ my $cnt;
+ for my $line (@$lines)
+ {
+ print $fh $line;
+ if (defined($Texi2HTML::Config::WORDS_IN_PAGE) and ($Texi2HTML::Config::SPLIT eq 'node'))
+ {
+ @cnt = split(/\W*\s+\W*/, $line);
+ $cnt += scalar(@cnt);
+ }
+ }
+ return $cnt;
+}
+
+sub do_index_entry_label($$)
+{
+ my $state = shift;
+ my $line_nr = shift;
+ my $entry = shift @index_labels;
+ return '' if ($state->{'multiple_pass'});
+ if (!defined($entry))
+ {
+ echo_warn ("Not enough index entries !", $line_nr);
+ return '';
+ }
+
+ print STDERR "[(index) $entry->{'entry'} $entry->{'label'}]\n"
+ if ($T2H_DEBUG & $DEBUG_INDEX);
+ return &$Texi2HTML::Config::index_entry_label ($entry->{'label'}, $state->{'preformatted'}, substitute_line($entry->{'entry'}), $index_properties->{$entry->{'prefix'}}->{'name'});
+}
+
+# decompose a decimal number on a given base. The algorithm looks like
+# the division with growing powers (division suivant les puissances
+# croissantes) ?
+sub decompose($$)
+{
+ my $number = shift;
+ my $base = shift;
+ my @result = ();
+
+ return (0) if ($number == 0);
+ my $power = 1;
+ my $remaining = $number;
+
+ while ($remaining)
+ {
+ my $factor = $remaining % ($base ** $power);
+ $remaining -= $factor;
+ push (@result, $factor / ($base ** ($power - 1)));
+ $power++;
+ }
+ return @result;
+}
+
+# main processing is called here
+set_document_language('en') unless ($lang_set);
+# APA: There's got to be a better way:
+$T2H_USER = &$I('unknown');
+
+if ($Texi2HTML::Config::TEST)
+{
+ # to generate files similar to reference ones to be able to check for
+ # real changes we use these dummy values if -test is given
+ $T2H_USER = 'a tester';
+ $THISPROG = 'texi2html';
+ setlocale( LC_ALL, "C" );
+}
+else
+{
+ # the eval prevents this from breaking on system which do not have
+ # a proper getpwuid implemented
+ eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
+ # APA: Provide Windows NT workaround until getpwuid gets
+ # implemented there.
+ $T2H_USER = $ENV{'USERNAME'} unless defined $T2H_USER;
+}
+
+open_file($docu, $texi_line_number);
+Texi2HTML::LaTeX2HTML::init($docu_name, $docu_rdir, $T2H_DEBUG & $DEBUG_L2H)
+ if ($Texi2HTML::Config::L2H);
+pass_texi();
+dump_texi(\@lines, 'texi', \@lines_numbers) if ($T2H_DEBUG & $DEBUG_TEXI);
+if (defined($Texi2HTML::Config::MACRO_EXPAND))
+{
+ my @texi_lines = (@first_lines, @lines);
+ dump_texi(\@texi_lines, '', undef, $Texi2HTML::Config::MACRO_EXPAND);
+}
+pass_structure();
+if ($T2H_DEBUG & $DEBUG_TEXI)
+{
+ dump_texi(\@doc_lines, 'first', \@doc_numbers);
+ if (defined($Texi2HTML::Config::MACRO_EXPAND and $Texi2HTML::Config::DUMP_TEXI))
+ {
+ unshift (@doc_lines, @first_lines);
+ push (@doc_lines, "\@bye\n");
+ dump_texi(\@doc_lines, '', undef, $Texi2HTML::Config::MACRO_EXPAND . ".first");
+ }
+}
+exit(0) if ($Texi2HTML::Config::DUMP_TEXI or defined($Texi2HTML::Config::MACRO_EXPAND));
+rearrange_elements();
+do_names();
+if (@{$region_lines{'documentdescription'}} and (!defined($Texi2HTML::Config::DOCUMENT_DESCRIPTION)))
+{
+ my $documentdescription = remove_texi(@{$region_lines{'documentdescription'}});
+ my @documentdescription = split (/\n/, $documentdescription);
+ $Texi2HTML::Config::DOCUMENT_DESCRIPTION = shift @documentdescription;
+ chomp $Texi2HTML::Config::DOCUMENT_DESCRIPTION;
+ foreach my $line (@documentdescription)
+ {
+ chomp $line;
+ $Texi2HTML::Config::DOCUMENT_DESCRIPTION .= ' ' . $line;
+ }
+}
+# do copyright notice inserted in comment at the begining of the files
+if (@{$region_lines{'copying'}})
+{
+ $copying_comment = &$Texi2HTML::Config::copying_comment($region_lines{'copying'});
+ #$copying_comment = remove_texi(@{$region_lines{'copying'}});
+ #$copying_comment = &$Texi2HTML::Config::comment($copying_comment);
+}
+&$Texi2HTML::Config::toc_body(\@elements_list);
+#&$Texi2HTML::Config::toc_body(\@elements_list, $do_contents, $do_scontents);
+&$Texi2HTML::Config::css_lines(\@css_import_lines, \@css_rule_lines);
+$sec_num = 0;
+#$Texi2HTML::Config::L2H = l2h_FinishToLatex() if ($Texi2HTML::Config::L2H);
+#$Texi2HTML::Config::L2H = l2h_ToHtml() if ($Texi2HTML::Config::L2H);
+#$Texi2HTML::Config::L2H = l2h_InitFromHtml() if ($Texi2HTML::Config::L2H);
+Texi2HTML::LaTeX2HTML::latex2html();
+pass_text();
+#do_node_files() if ($Texi2HTML::Config::SPLIT ne 'node' and $Texi2HTML::Config::NODE_FILES);
+if ($Texi2HTML::Config::IDX_SUMMARY)
+{
+ foreach my $entry (keys(%$index_properties))
+ {
+ my $name = $index_properties->{$entry}->{'name'};
+ do_index_summary_file($name)
+ unless ($empty_indices{$name});
+ }
+}
+do_node_files() if ($Texi2HTML::Config::NODE_FILES);
+#l2h_FinishFromHtml() if ($Texi2HTML::Config::L2H);
+#l2h_Finish() if($Texi2HTML::Config::L2H);
+Texi2HTML::LaTeX2HTML::finish();
+&$Texi2HTML::Config::finish_out();
+print STDERR "# that's all folks\n" if $T2H_VERBOSE;
+
+exit(0);
+
+
+##############################################################################
+
+# These next few lines are legal in both Perl and nroff.
+
+.00 ; # finish .ig
+
+'di \" finish diversion--previous line must be blank
+.nr nl 0-1 \" fake up transition to first page again
+.nr % 0 \" start at page 1
+'; __END__ ############# From here on it's a standard manual page ############
+ .so @mandir@/man1/texi2html.1
diff --git a/Build/source/utils/texi2html/texi2html.spec b/Build/source/utils/texi2html/texi2html.spec
new file mode 100644
index 00000000000..d716b1dc714
--- /dev/null
+++ b/Build/source/utils/texi2html/texi2html.spec
@@ -0,0 +1,65 @@
+Name: texi2html
+Version: 1.76
+Release: 1
+Epoch: 0
+License: GPL
+Group: Applications/Text
+Summary: A highly customizable texinfo to HTML and other formats translator
+Source0: %{name}-%{version}.tar.bz2
+#Source: http://texi2html.cvshome.org/servlets/ProjectDownloadList
+URL: http://texi2html.cvshome.org/
+
+Requires: perl >= 5.004
+Prefix: %{_prefix}
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+%description
+The basic purpose of texi2html is to convert Texinfo documents into HTML,
+and other formats. Configuration files written in perl provide fine degree
+of control over the final output, allowing most every aspect of the final
+output not specified in the Texinfo input file to be specified.
+
+%prep
+%setup -q
+
+%build
+%configure
+make clean
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT
+#%find_lang %{name}
+
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || :
+
+%preun
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete %{_infodir}/%{name}.info \
+ %{_infodir}/dir 2>/dev/null || :
+fi
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS NEWS README ChangeLog TODO %{name}.init
+%{_bindir}/%{name}
+%{_datadir}/texinfo/html/%{name}.html
+%{_mandir}/man*/%{name}*
+%{_infodir}/%{name}.info*
+%dir %{_datadir}/%{name}
+%{_datadir}/%{name}/*.init
+%dir %{_datadir}/%{name}/i18n/
+%{_datadir}/%{name}/i18n/*
+%dir %{_datadir}/%{name}/images/
+%{_datadir}/%{name}/images/*
+
+%changelog
+* Mon Mar 23 2004 Patrice Dumas <pertusus@free.fr> 0:1.69-0.fdr.1
+- Initial build.
diff --git a/Build/source/utils/texi2html/texi2html.spec.in b/Build/source/utils/texi2html/texi2html.spec.in
new file mode 100644
index 00000000000..18ab7e9ff84
--- /dev/null
+++ b/Build/source/utils/texi2html/texi2html.spec.in
@@ -0,0 +1,65 @@
+Name: @PACKAGE_TARNAME@
+Version: @PACKAGE_VERSION@
+Release: 1
+Epoch: 0
+License: GPL
+Group: Applications/Text
+Summary: A highly customizable texinfo to HTML and other formats translator
+Source0: %{name}-%{version}.tar.bz2
+#Source: http://texi2html.cvshome.org/servlets/ProjectDownloadList
+URL: http://texi2html.cvshome.org/
+
+Requires: perl >= 5.004
+Prefix: %{_prefix}
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+%description
+The basic purpose of texi2html is to convert Texinfo documents into HTML,
+and other formats. Configuration files written in perl provide fine degree
+of control over the final output, allowing most every aspect of the final
+output not specified in the Texinfo input file to be specified.
+
+%prep
+%setup -q
+
+%build
+%configure
+make clean
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT
+#%find_lang %{name}
+
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || :
+
+%preun
+if [ $1 = 0 ]; then
+ /sbin/install-info --delete %{_infodir}/%{name}.info \
+ %{_infodir}/dir 2>/dev/null || :
+fi
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS NEWS README ChangeLog TODO %{name}.init
+%{_bindir}/%{name}
+%{_datadir}/texinfo/html/%{name}.html
+%{_mandir}/man*/%{name}*
+%{_infodir}/%{name}.info*
+%dir %{_datadir}/%{name}
+%{_datadir}/%{name}/*.init
+%dir %{_datadir}/%{name}/i18n/
+%{_datadir}/%{name}/i18n/*
+%dir %{_datadir}/%{name}/images/
+%{_datadir}/%{name}/images/*
+
+%changelog
+* Mon Mar 23 2004 Patrice Dumas <pertusus@free.fr> 0:1.69-0.fdr.1
+- Initial build.
diff --git a/Build/source/utils/texi2html/translations.pl b/Build/source/utils/texi2html/translations.pl
new file mode 100644
index 00000000000..7ae6d45cfd4
--- /dev/null
+++ b/Build/source/utils/texi2html/translations.pl
@@ -0,0 +1,819 @@
+$LANGUAGES->{'de'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '@"Uber dieses Dokument',
+ 'April' => 'April',
+ 'August' => 'August',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'Dezember',
+ 'February' => 'Februar',
+ 'Footnotes' => 'Fu@ss{}noten',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Index',
+ 'Index Entry' => '',
+ 'January' => 'Januar',
+ 'July' => 'Juli',
+ 'Jump to' => '',
+ 'June' => 'Juni',
+ 'March' => 'M@"arz',
+ 'May' => 'Mai',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'November',
+ 'October' => 'Oktober',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'September',
+ 'Short Table of Contents' => 'Kurzes Inhaltsverzeichniss',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Inhaltsverzeichniss',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'de'} = {
+ 'See' => 'Siehe',
+ 'section' => 'Abschnitt',
+ 'see' => 'siehe'
+ };
+
+
+$LANGUAGES->{'es'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '',
+ 'April' => 'abril',
+ 'August' => 'agosto',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'diciembre',
+ 'February' => 'febrero',
+ 'Footnotes' => '',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Index',
+ 'Index Entry' => '',
+ 'January' => 'enero',
+ 'July' => 'julio',
+ 'Jump to' => '',
+ 'June' => 'junio',
+ 'March' => 'marzo',
+ 'May' => 'mayo',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'noviembre',
+ 'October' => 'octubre',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'septiembre',
+ 'Short Table of Contents' => 'Resumen del Contenido',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => '@\'{@dotless{I}}ndice General',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'es'} = {
+ 'See' => 'V@\'ease',
+ 'section' => 'secci@\'on',
+ 'see' => 'v@\'ase'
+ };
+
+
+$LANGUAGES->{'fr'} = {
+ ' The buttons in the navigation panels have the following meaning:' => ' Les boutons de navigation ont la signification suivante :',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' Dans cet exemple on est @`a @strong{ Sous section un-deux-trois } dans un document dont la structure est :',
+ ' Up ' => 'Plus haut',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => 'le %{day} %{month} %{year}',
+ '%{name} of %{class}' => '%{name} de %{class}',
+ '%{name} on %{class}' => '%{name} de %{class}',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '%{node_file_href} section `%{section}\' dans @cite{%{book}}',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => 'A propos de ce document',
+ 'April' => 'Avril',
+ 'August' => 'Ao@^ut',
+ 'Button' => 'Bouton',
+ 'Contents' => 'Table des mati@`eres',
+ 'Current Position' => 'Position',
+ 'December' => 'D@\'ecembre',
+ 'February' => 'F@\'evrier',
+ 'Footnotes' => 'Notes de bas de page',
+ 'From 1.2.3 go to' => 'Depuis 1.2.3 aller @`a',
+ 'Go to' => 'Aller @`a',
+ 'Index' => 'Index',
+ 'Index Entry' => 'Entr@\'ee d\'index',
+ 'January' => 'Janvier',
+ 'July' => 'Juillet',
+ 'Jump to' => 'Aller @`a',
+ 'June' => 'Juin',
+ 'March' => 'Mars',
+ 'May' => 'Mai',
+ 'Menu:' => 'Menu@ :',
+ 'Name' => 'Nom',
+ 'Next' => 'Suivant',
+ 'November' => 'Novembre',
+ 'October' => 'Octobre',
+ 'Overview' => 'Vue d\'ensemble',
+ 'Overview:' => 'Vue d\'ensemble@ :',
+ 'Prev' => 'Pr@\'ec@\'edent',
+ 'Section' => '',
+ 'Section One' => 'Section un',
+ 'See %{node_file_href}' => 'Voir %{node_file_href}',
+ 'See %{node_file_href} @cite{%{book}}' => 'Voir %{node_file_href} @cite{%{book}}',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => 'Voir %{node_file_href} section `%{section}\' dans @cite{%{book}}',
+ 'See %{reference_name}' => 'Voir %{reference_name}',
+ 'See @cite{%{book}}' => 'Voir @cite{%{book}}',
+ 'See section %{reference_name}' => 'Voir la section %{reference_name}',
+ 'See section `%{section}\' in @cite{%{book}}' => 'Voir la section `%{section}\' dans @cite{%{book}}',
+ 'September' => 'Septembre',
+ 'Short Table of Contents' => 'R@\'esum@\'e du contenu',
+ 'Subsection One-Four' => 'Sous section un-quatre',
+ 'Subsection One-One' => 'Sous section un-un',
+ 'Subsection One-Three' => 'Sous section un-trois',
+ 'Subsection One-Two' => 'Sous section un-deux',
+ 'Subsubsection One-Two-Four' => 'Sous sous section un-deux-quatre',
+ 'Subsubsection One-Two-One' => 'Sous sous section un-deux-un',
+ 'Subsubsection One-Two-Three' => 'Sous sous section un-deux-trois',
+ 'Subsubsection One-Two-Two' => 'Sous sous section un-deux-deux',
+ 'T2H_today' => 'le %2$d %1$s %3$d',
+ 'Table of Contents' => 'Table des mati@`eres',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} @emph{%{date}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'Top' => '',
+ 'Untitled Document' => 'Document sans titre',
+ 'about (help)' => '@`a propos (page d\'aide)',
+ 'beginning of this chapter or previous chapter' => 'd@\'ebut de ce chapitre ou chapitre pr@\'ec@\'edent',
+ 'by @emph{%{user}}' => 'par @emph{%{user}}',
+ 'by @emph{%{user}} on @emph{%{date}}' => 'par @emph{%{user}} @emph{%{date}}',
+ 'cover (top) of document' => 'couverture (top) du document',
+ 'current' => 'courante',
+ 'current section' => 'section actuelle',
+ 'first section in reading order' => 'premi@`e section dans l\'ordre de lecture',
+ 'following node' => 'node suivant',
+ 'index' => 'index',
+ 'last section in reading order' => 'derni@`ere section dans l\'ordre de lecture',
+ 'next chapter' => 'chapitre suivant',
+ 'next node' => 'node suivant',
+ 'next section in reading order' => 'section suivante dans l\'ordre de lecture',
+ 'next section on same level' => 'section suivante au m@^eme niveau',
+ 'node following in node reading order' => 'node suivant dans l\'ordre des nodes',
+ 'node up' => 'node au dessus',
+ 'on @emph{%{date}}' => '@emph{%{date}}',
+ 'previous node' => 'node pr@\'ec@\'edent',
+ 'previous section in reading order' => 'section pr@\'ec@\'edente dans l\'ordre de lecture',
+ 'previous section on same level' => 'section pr@\'ec@\'edente au m@^eme niveau',
+ 'section `%{section}\' in @cite{%{book}}' => 'section `%{section}\' dans @cite{%{book}}',
+ 'see %{node_file_href}' => 'voir %{node_file_href}',
+ 'see %{node_file_href} @cite{%{book}}' => 'voir %{node_file_href} @cite{%{book}}',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => 'voir %{node_file_href} section `%{section}\' dans @cite{%{book}}',
+ 'see %{reference_name}' => 'voir %{reference_name}',
+ 'see @cite{%{book}}' => 'voir @cite{%{book}}',
+ 'see section %{reference_name}' => 'voir la section %{reference_name}',
+ 'see section `%{section}\' in @cite{%{book}}' => 'voir la section `%{section}\' dans @cite{{book}}',
+ 'short table of contents' => 'table des mati@`eres r@\'esum@\'ee',
+ 'table of contents' => 'table des mati@`eres',
+ 'unknown' => 'inconnu',
+ 'up node' => 'node au dessus',
+ 'up section' => 'section sup@\'erieure'
+ };
+
+$T2H_OBSOLETE_STRINGS->{'fr'} = {
+ ' This document was generated %{who_and_when_generated} using %{program_homepage_href}.' => ' Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; %{who_and_when_generated} en utilisant %{program_homepage_href}.',
+ ' where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:' => ' Dans cet exemple on est &agrave; <strong> Sous section un-deux-trois </strong> dans un document dont la structure est :',
+ '%{node_file_href} section `%{section}\' in <cite>%{book}</cite>' => '%{node_file_href} section `%{section}\' dans <cite>%{book}</cite>',
+ 'See' => 'Voir',
+ 'See %{node_file_href} <cite>%{book}</cite>' => 'Voir %{node_file_href} <cite>%{book}</cite>',
+ 'See %{node_file_href} section `%{section}\' in <cite>%{book}</cite>' => 'Voir %{node_file_href} section `%{section}\' dans <cite>%{book}</cite>',
+ 'See <cite>%{book}</cite>' => 'Voir <cite>%{book}</cite>',
+ 'See section `%{section}\' in <cite>%{book}</cite>' => 'Voir la section `%{section}\' dans <cite>%{book}</cite>',
+ 'This document was generated by <i>%{user}</i> on <i>%{date}</i> using %{program_homepage_href}.' => 'Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; par <i>%{user}</i> <i>%{date}</i> en utilisant %{program_homepage_href}.',
+ 'This document was generated by <i>%{user}</i> using %{program_homepage_href}.' => 'Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; par <i>%{user}</i> en utilisant %{program_homepage_href}.',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} @emph{%{date}} en utilisant %{program_homepage_href}.',
+ 'This document was generated by @emph{%{user}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e par @emph{%{user}} en utilisant %{program_homepage_href}.',
+ 'This document was generated on <i>%{date}</i> using %{program_homepage_href}.' => 'Ce document a &eacute;t&eacute; g&eacute;n&eacute;r&eacute; <i>%{date}</i> en utilisant %{program_homepage_href}.',
+ 'This document was generated on @emph{%{date}} using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e @emph{%{date}} en utilisant %{program_homepage_href}.',
+ 'This document was generated on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e @emph{%{date}} en utilisant @uref{%{program_homepage}, @emph{%{program}}}.',
+ 'This document was generated using %{program_homepage_href}.' => 'Ce document a @\'et@\'e g@\'en@\'er@\'e en utilisant %{program_homepage_href}.',
+ 'about (this page)' => 'a propos (cette page)',
+ 'by <i>%{user}</i>' => 'par <i>%{user}</i>',
+ 'by <i>%{user}</i> on <i>%{date}</i>' => 'par <i>%{user}</i> <i>%{date}</i>',
+ 'concept index' => 'index',
+ 'on <i>%{date}</i>' => '<i>%{date}</i>',
+ 'section' => 'section',
+ 'section `%{section}\' in <cite>%{book}</cite>' => 'section `%{section}\' dans <cite>%{book}</cite>',
+ 'see' => 'voir',
+ 'see %{node_file_href} <cite>%{book}</cite>' => 'voir %{node_file_href} <cite>%{book}</cite>',
+ 'see %{node_file_href} section `%{section}\' in <cite>%{book}</cite>' => 'voir %{node_file_href} section `%{section}\' dans <cite>%{book}</cite>',
+ 'see <cite>%{book}</cite>' => 'voir <cite>%{book}</cite>',
+ 'see section `%{section}\' in <cite>%{book}</cite>' => 'voir la section `%{section}\' dans <cite>%{book}</cite>'
+ };
+
+
+$LANGUAGES->{'nl'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => 'No translation available!',
+ 'April' => 'April',
+ 'August' => 'Augustus',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'December',
+ 'February' => 'Februari',
+ 'Footnotes' => 'No translation available!',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Index',
+ 'Index Entry' => '',
+ 'January' => 'Januari',
+ 'July' => 'Juli',
+ 'Jump to' => '',
+ 'June' => 'Juni',
+ 'March' => 'Maart',
+ 'May' => 'Mei',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'November',
+ 'October' => 'Oktober',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'September',
+ 'Short Table of Contents' => 'Korte inhoudsopgave',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Inhoudsopgave',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'nl'} = {
+ 'See' => 'Zie',
+ 'section' => 'sectie',
+ 'see' => 'zie'
+ };
+
+
+$LANGUAGES->{'no'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => 'No translation available!',
+ 'April' => 'april',
+ 'August' => 'august',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'desember',
+ 'February' => 'februar',
+ 'Footnotes' => 'No translation available!',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => 'Indeks',
+ 'Index Entry' => '',
+ 'January' => 'januar',
+ 'July' => 'juli',
+ 'Jump to' => '',
+ 'June' => 'juni',
+ 'March' => 'mars',
+ 'May' => 'mai',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'november',
+ 'October' => 'oktober',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'september',
+ 'Short Table of Contents' => 'Kort innholdsfortegnelse',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Innholdsfortegnelse',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'no'} = {
+ 'See' => 'Se',
+ 'section' => 'avsnitt',
+ 'see' => 'se'
+ };
+
+
+$LANGUAGES->{'pt'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '',
+ 'April' => 'Abril',
+ 'August' => 'Agosto',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => 'Dezembro',
+ 'February' => 'Fevereiro',
+ 'Footnotes' => '',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => '@\'Indice',
+ 'Index Entry' => '',
+ 'January' => 'Janeiro',
+ 'July' => 'Julho',
+ 'Jump to' => '',
+ 'June' => 'Junho',
+ 'March' => 'Mar@,{c}o',
+ 'May' => 'Maio',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => 'Novembro',
+ 'October' => 'Outubro',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => 'Setembro',
+ 'Short Table of Contents' => 'Breve Sum@\'ario',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '',
+ 'Table of Contents' => 'Sum@\'ario',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'pt'} = {
+ 'See' => 'Veja',
+ 'section' => 'Se@,{c}@~ao',
+ 'see' => 'veja'
+ };
+
+
+$LANGUAGES->{'en'} = {
+ ' The buttons in the navigation panels have the following meaning:' => '',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => '',
+ ' Up ' => '',
+ '%{acronym_like} (%{explanation})' => '',
+ '%{month}, %{day} %{year}' => '',
+ '%{name} of %{class}' => '',
+ '%{name} on %{class}' => '',
+ '%{node_file_href}' => '',
+ '%{node_file_href} @cite{%{book}}' => '',
+ '%{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ '%{reference_name}' => '',
+ '%{style} %{number}' => '',
+ '%{style}: %{caption_first_line}' => '',
+ '%{style}: %{shortcaption_first_line}' => '',
+ '@b{%{quotation_arg}:} ' => '',
+ '@cite{%{book}}' => '',
+ 'About This Document' => '',
+ 'April' => '',
+ 'August' => '',
+ 'Button' => '',
+ 'Contents' => '',
+ 'Current Position' => '',
+ 'December' => '',
+ 'February' => '',
+ 'Footnotes' => '',
+ 'From 1.2.3 go to' => '',
+ 'Go to' => '',
+ 'Index' => '',
+ 'Index Entry' => '',
+ 'January' => '',
+ 'July' => '',
+ 'Jump to' => '',
+ 'June' => '',
+ 'March' => '',
+ 'May' => '',
+ 'Menu:' => '',
+ 'Name' => '',
+ 'Next' => '',
+ 'November' => '',
+ 'October' => '',
+ 'Overview' => '',
+ 'Overview:' => '',
+ 'Prev' => '',
+ 'Section' => '',
+ 'Section One' => '',
+ 'See %{node_file_href}' => '',
+ 'See %{node_file_href} @cite{%{book}}' => '',
+ 'See %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'See %{reference_name}' => '',
+ 'See @cite{%{book}}' => '',
+ 'See section %{reference_name}' => '',
+ 'See section `%{section}\' in @cite{%{book}}' => '',
+ 'September' => '',
+ 'Short Table of Contents' => '',
+ 'Subsection One-Four' => '',
+ 'Subsection One-One' => '',
+ 'Subsection One-Three' => '',
+ 'Subsection One-Two' => '',
+ 'Subsubsection One-Two-Four' => '',
+ 'Subsubsection One-Two-One' => '',
+ 'Subsubsection One-Two-Three' => '',
+ 'Subsubsection One-Two-Two' => '',
+ 'T2H_today' => '%s, %d %d',
+ 'Table of Contents' => '',
+ 'This document was generated by @emph{%{user}} on @emph{%{date}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated by @emph{%{user}} using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'This document was generated on @i{%{date}} using @uref{%{program_homepage}, @i{%{program}}}.' => '',
+ 'This document was generated using @uref{%{program_homepage}, @emph{%{program}}}.' => '',
+ 'Top' => '',
+ 'Untitled Document' => '',
+ 'about (help)' => '',
+ 'beginning of this chapter or previous chapter' => '',
+ 'by @emph{%{user}}' => '',
+ 'by @emph{%{user}} on @emph{%{date}}' => '',
+ 'cover (top) of document' => '',
+ 'current' => '',
+ 'current section' => '',
+ 'first section in reading order' => '',
+ 'following node' => '',
+ 'index' => '',
+ 'last section in reading order' => '',
+ 'next chapter' => '',
+ 'next node' => '',
+ 'next section in reading order' => '',
+ 'next section on same level' => '',
+ 'node following in node reading order' => '',
+ 'node up' => '',
+ 'on @emph{%{date}}' => '',
+ 'previous node' => '',
+ 'previous section in reading order' => '',
+ 'previous section on same level' => '',
+ 'section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{node_file_href}' => '',
+ 'see %{node_file_href} @cite{%{book}}' => '',
+ 'see %{node_file_href} section `%{section}\' in @cite{%{book}}' => '',
+ 'see %{reference_name}' => '',
+ 'see @cite{%{book}}' => '',
+ 'see section %{reference_name}' => '',
+ 'see section `%{section}\' in @cite{%{book}}' => '',
+ 'short table of contents' => '',
+ 'table of contents' => '',
+ 'unknown' => '',
+ 'up node' => '',
+ 'up section' => ''
+ };
+
+$T2H_OBSOLETE_STRINGS->{'en'} = {};
+
+
diff --git a/Build/source/utils/texinfo/ABOUT-NLS b/Build/source/utils/texinfo/ABOUT-NLS
new file mode 100644
index 00000000000..2f50c6693ef
--- /dev/null
+++ b/Build/source/utils/texinfo/ABOUT-NLS
@@ -0,0 +1,768 @@
+Notes on the Free Translation Project
+*************************************
+
+Free software is going international! The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+Quick configuration advice
+==========================
+
+If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation. Future versions of GNU `gettext' will
+very likely convey even more functionality. So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+ So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language. Most such
+packages use GNU `gettext'. Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU `gettext' functions. If not, the GNU `gettext' own
+library will be used. This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is _not_ required. Installers may use
+special options at configuration time for changing the default
+behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --disable-nls
+
+will respectively bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might be not what is desirable. You
+should use the more recent version of the GNU `gettext' library. I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ The configuration process will not test for the `catgets' function
+and therefore it will not be used. The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+ Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code. For example, let's
+suppose that you speak German and live in Germany. At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc. On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
+locales supported by your system for your country by running the command
+`locale -a | grep '^LL''.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+ In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+Translating Teams
+=================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+ If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of January
+2004. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+ Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es
+ +----------------------------------------------------+
+ a2ps | [] [] [] [] |
+ aegis | () |
+ ant-phone | () |
+ anubis | |
+ ap-utils | |
+ aspell | [] |
+ bash | [] [] [] [] |
+ batchelor | |
+ bfd | [] [] |
+ binutils | [] [] |
+ bison | [] [] [] |
+ bluez-pin | [] [] [] |
+ clisp | |
+ clisp | [] [] [] |
+ console-tools | [] [] |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] |
+ darkstat | [] () [] |
+ diffutils | [] [] [] [] [] [] [] |
+ e2fsprogs | [] [] [] |
+ enscript | [] [] [] [] |
+ error | [] [] [] [] [] |
+ fetchmail | [] () [] [] [] [] |
+ fileutils | [] [] [] |
+ findutils | [] [] [] [] [] [] [] |
+ flex | [] [] [] [] |
+ fslint | |
+ gas | [] |
+ gawk | [] [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] [] |
+ gettext | [] [] [] [] [] |
+ gettext-examples | [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gimp-print | [] [] [] [] [] |
+ gliv | |
+ glunarclock | [] [] |
+ gnubiff | [] |
+ gnucash | [] () [] [] |
+ gnucash-glossary | [] () [] |
+ gnupg | [] () [] [] [] [] |
+ gpe-aerial | [] |
+ gpe-beam | [] [] |
+ gpe-calendar | [] [] |
+ gpe-clock | [] [] |
+ gpe-conf | [] [] |
+ gpe-contacts | [] [] |
+ gpe-edit | [] |
+ gpe-go | [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] |
+ gpe-taskmanager | [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] [] |
+ gpe-todo | [] [] |
+ gphoto2 | [] [] [] [] |
+ gprof | [] [] [] |
+ gpsdrive | () () () |
+ gramadoir | [] |
+ grep | [] [] [] [] [] [] |
+ gretl | [] |
+ gtick | [] () |
+ hello | [] [] [] [] [] [] |
+ id-utils | [] [] |
+ indent | [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] |
+ iso_3166_1 | [] [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | [] |
+ iso_4217 | [] [] [] [] |
+ iso_639 | |
+ jpilot | [] [] [] |
+ jtag | |
+ jwhois | [] |
+ kbd | [] [] [] [] [] |
+ latrine | () |
+ ld | [] [] |
+ libc | [] [] [] [] [] [] |
+ libgpewidget | [] [] |
+ libiconv | [] [] [] [] [] |
+ lifelines | [] () |
+ lilypond | [] |
+ lingoteach | |
+ lingoteach_lessons | () () |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | [] [] |
+ make | [] [] [] |
+ man-db | [] () [] [] () |
+ minicom | [] [] [] |
+ mysecretdiary | [] [] [] |
+ nano | [] () [] [] [] |
+ nano_1_0 | [] () [] [] [] |
+ opcodes | [] |
+ parted | [] [] [] [] [] |
+ ptx | [] [] [] [] [] |
+ python | |
+ radius | [] |
+ recode | [] [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] |
+ sh-utils | [] [] [] |
+ shared-mime-info | |
+ sharutils | [] [] [] [] [] [] |
+ silky | () |
+ skencil | [] () [] |
+ sketch | [] () [] |
+ soundtracker | [] [] [] |
+ sp | [] |
+ tar | [] [] [] [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] [] |
+ tin | () () |
+ tp-robot | |
+ tuxpaint | [] [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] [] |
+ vorbis-tools | [] [] [] [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] |
+ wget | [] [] [] [] [] [] |
+ xchat | [] [] [] [] |
+ xfree86_xkb_xml | [] [] |
+ xpad | [] |
+ +----------------------------------------------------+
+ af am ar az be bg bs ca cs da de el en en_GB eo es
+ 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68
+
+ et eu fa fi fr ga gl he hr hu id is it ja ko lg
+ +-------------------------------------------------+
+ a2ps | [] [] [] () () |
+ aegis | |
+ ant-phone | [] |
+ anubis | [] |
+ ap-utils | [] |
+ aspell | [] [] |
+ bash | [] [] |
+ batchelor | [] [] |
+ bfd | [] |
+ binutils | [] [] |
+ bison | [] [] [] [] |
+ bluez-pin | [] [] [] [] [] |
+ clisp | |
+ clisp | [] |
+ console-tools | |
+ coreutils | [] [] [] [] [] [] |
+ cpio | [] [] [] [] |
+ darkstat | () [] [] [] |
+ diffutils | [] [] [] [] [] [] [] |
+ e2fsprogs | |
+ enscript | [] [] |
+ error | [] [] [] [] |
+ fetchmail | [] |
+ fileutils | [] [] [] [] [] [] |
+ findutils | [] [] [] [] [] [] [] [] [] [] [] |
+ flex | [] [] [] |
+ fslint | [] |
+ gas | [] |
+ gawk | [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] |
+ gettext | [] [] [] |
+ gettext-examples | [] [] |
+ gettext-runtime | [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gimp-print | [] [] |
+ gliv | () |
+ glunarclock | [] [] [] [] |
+ gnubiff | [] |
+ gnucash | () [] |
+ gnucash-glossary | [] |
+ gnupg | [] [] [] [] [] [] [] |
+ gpe-aerial | [] |
+ gpe-beam | [] |
+ gpe-calendar | [] [] [] |
+ gpe-clock | [] |
+ gpe-conf | [] |
+ gpe-contacts | [] [] |
+ gpe-edit | [] [] |
+ gpe-go | [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] [] [] |
+ gpe-sketchbook | [] |
+ gpe-su | [] |
+ gpe-taskmanager | [] |
+ gpe-timesheet | [] [] [] |
+ gpe-today | [] [] |
+ gpe-todo | [] [] |
+ gphoto2 | [] [] [] |
+ gprof | [] [] |
+ gpsdrive | () () () |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] [] [] [] [] [] |
+ gretl | [] [] |
+ gtick | [] [] [] |
+ hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] |
+ indent | [] [] [] [] [] [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] [] |
+ iso_3166_1 | [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | |
+ iso_4217 | [] [] [] [] [] [] |
+ iso_639 | |
+ jpilot | [] () |
+ jtag | [] |
+ jwhois | [] [] [] [] |
+ kbd | [] |
+ latrine | [] |
+ ld | [] |
+ libc | [] [] [] [] [] [] |
+ libgpewidget | [] [] [] [] |
+ libiconv | [] [] [] [] [] [] [] [] [] |
+ lifelines | () |
+ lilypond | [] |
+ lingoteach | [] [] |
+ lingoteach_lessons | |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | |
+ make | [] [] [] [] [] [] |
+ man-db | () () |
+ minicom | [] [] [] [] |
+ mysecretdiary | [] [] |
+ nano | [] [] [] [] |
+ nano_1_0 | [] [] [] [] |
+ opcodes | [] |
+ parted | [] [] [] |
+ ptx | [] [] [] [] [] [] [] |
+ python | |
+ radius | [] |
+ recode | [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] |
+ sed | [] [] [] [] [] [] [] [] [] |
+ sh-utils | [] [] [] [] [] [] [] |
+ shared-mime-info | [] [] [] |
+ sharutils | [] [] [] [] [] |
+ silky | () [] () () |
+ skencil | [] |
+ sketch | [] |
+ soundtracker | [] [] |
+ sp | [] () |
+ tar | [] [] [] [] [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ textutils | [] [] [] [] [] [] |
+ tin | [] () |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | [] [] |
+ util-linux | [] [] [] [] () [] |
+ vorbis-tools | [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] [] [] |
+ wget | [] [] [] [] [] [] [] |
+ xchat | [] [] [] |
+ xfree86_xkb_xml | [] [] |
+ xpad | [] [] |
+ +-------------------------------------------------+
+ et eu fa fi fr ga gl he hr hu id is it ja ko lg
+ 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0
+
+ lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
+ +-----------------------------------------------------+
+ a2ps | [] [] () () [] [] [] |
+ aegis | () () () |
+ ant-phone | [] [] |
+ anubis | [] [] [] [] [] [] |
+ ap-utils | [] () [] |
+ aspell | [] |
+ bash | [] [] [] |
+ batchelor | [] |
+ bfd | [] |
+ binutils | [] |
+ bison | [] [] [] [] [] |
+ bluez-pin | [] [] [] |
+ clisp | |
+ clisp | [] |
+ console-tools | [] |
+ coreutils | [] [] |
+ cpio | [] [] [] [] [] |
+ darkstat | [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ e2fsprogs | [] |
+ enscript | [] [] [] [] |
+ error | [] [] [] |
+ fetchmail | [] [] () [] |
+ fileutils | [] [] [] |
+ findutils | [] [] [] [] [] |
+ flex | [] [] [] [] |
+ fslint | [] [] |
+ gas | |
+ gawk | [] [] [] |
+ gbiff | [] [] |
+ gcal | |
+ gcc | |
+ gettext | [] [] [] |
+ gettext-examples | [] [] [] |
+ gettext-runtime | [] [] [] [] |
+ gettext-tools | [] [] |
+ gimp-print | [] |
+ gliv | [] [] [] |
+ glunarclock | [] [] [] [] |
+ gnubiff | [] |
+ gnucash | [] [] () [] |
+ gnucash-glossary | [] [] |
+ gnupg | [] |
+ gpe-aerial | [] [] [] [] |
+ gpe-beam | [] [] [] [] |
+ gpe-calendar | [] [] [] [] |
+ gpe-clock | [] [] [] [] |
+ gpe-conf | [] [] [] [] |
+ gpe-contacts | [] [] [] [] |
+ gpe-edit | [] [] [] [] |
+ gpe-go | [] [] [] |
+ gpe-login | [] [] [] [] |
+ gpe-ownerinfo | [] [] [] [] |
+ gpe-sketchbook | [] [] [] [] |
+ gpe-su | [] [] [] [] |
+ gpe-taskmanager | [] [] [] [] |
+ gpe-timesheet | [] [] [] [] |
+ gpe-today | [] [] [] [] |
+ gpe-todo | [] [] [] [] |
+ gphoto2 | [] |
+ gprof | [] [] |
+ gpsdrive | () () [] |
+ gramadoir | () [] |
+ grep | [] [] [] [] [] |
+ gretl | |
+ gtick | [] [] [] |
+ hello | [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] |
+ indent | [] [] [] [] |
+ iso_3166 | [] [] [] |
+ iso_3166_1 | [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | [] |
+ iso_4217 | [] [] [] [] [] [] [] [] |
+ iso_639 | [] |
+ jpilot | () () |
+ jtag | |
+ jwhois | [] [] [] [] () |
+ kbd | [] [] [] |
+ latrine | [] |
+ ld | |
+ libc | [] [] [] [] |
+ libgpewidget | [] [] [] |
+ libiconv | [] [] [] [] [] |
+ lifelines | |
+ lilypond | |
+ lingoteach | |
+ lingoteach_lessons | |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailutils | [] [] [] |
+ make | [] [] [] [] |
+ man-db | [] |
+ minicom | [] [] [] [] |
+ mysecretdiary | [] [] [] |
+ nano | [] [] [] [] [] |
+ nano_1_0 | [] [] [] [] [] [] |
+ opcodes | [] [] |
+ parted | [] [] [] [] |
+ ptx | [] [] [] [] [] [] [] [] |
+ python | |
+ radius | [] [] |
+ recode | [] [] [] [] |
+ rpm | [] [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] |
+ sed | [] [] [] |
+ sh-utils | [] [] |
+ shared-mime-info | [] [] |
+ sharutils | [] [] |
+ silky | () |
+ skencil | [] [] |
+ sketch | [] [] |
+ soundtracker | |
+ sp | |
+ tar | [] [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ textutils | [] [] |
+ tin | |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] |
+ vorbis-tools | [] [] [] |
+ wastesedge | |
+ wdiff | [] [] [] [] [] |
+ wget | [] [] [] |
+ xchat | [] [] [] |
+ xfree86_xkb_xml | [] [] |
+ xpad | [] [] |
+ +-----------------------------------------------------+
+ lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
+ 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63
+
+ sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
+ +-----------------------------------------------------+
+ a2ps | [] [] [] [] | 16
+ aegis | | 0
+ ant-phone | | 3
+ anubis | [] [] | 9
+ ap-utils | () | 3
+ aspell | | 4
+ bash | | 9
+ batchelor | | 3
+ bfd | [] [] | 6
+ binutils | [] [] [] | 8
+ bison | [] [] | 14
+ bluez-pin | [] [] [] | 14
+ clisp | | 0
+ clisp | | 5
+ console-tools | | 3
+ coreutils | [] [] [] [] | 16
+ cpio | [] [] | 14
+ darkstat | [] [] [] () () | 12
+ diffutils | [] [] [] | 23
+ e2fsprogs | [] [] | 6
+ enscript | [] [] | 12
+ error | [] [] [] | 15
+ fetchmail | [] [] | 11
+ fileutils | [] [] [] [] [] | 17
+ findutils | [] [] [] [] [] [] | 29
+ flex | [] [] | 13
+ fslint | | 3
+ gas | [] | 3
+ gawk | [] [] | 12
+ gbiff | | 4
+ gcal | [] [] | 4
+ gcc | [] | 4
+ gettext | [] [] [] [] [] | 16
+ gettext-examples | [] [] [] [] [] | 14
+ gettext-runtime | [] [] [] [] [] [] [] [] | 22
+ gettext-tools | [] [] [] [] [] [] | 14
+ gimp-print | [] [] | 10
+ gliv | | 3
+ glunarclock | [] [] [] | 13
+ gnubiff | | 3
+ gnucash | [] [] | 9
+ gnucash-glossary | [] [] [] | 8
+ gnupg | [] [] [] [] | 17
+ gpe-aerial | [] | 7
+ gpe-beam | [] | 8
+ gpe-calendar | [] [] [] [] | 13
+ gpe-clock | [] [] [] | 10
+ gpe-conf | [] [] | 9
+ gpe-contacts | [] [] [] | 11
+ gpe-edit | [] [] [] [] [] | 12
+ gpe-go | | 5
+ gpe-login | [] [] [] [] [] | 13
+ gpe-ownerinfo | [] [] [] [] | 13
+ gpe-sketchbook | [] [] | 9
+ gpe-su | [] [] [] | 10
+ gpe-taskmanager | [] [] [] | 10
+ gpe-timesheet | [] [] [] [] | 12
+ gpe-today | [] [] [] [] [] | 13
+ gpe-todo | [] [] [] [] | 12
+ gphoto2 | [] [] [] | 11
+ gprof | [] [] | 9
+ gpsdrive | [] [] | 3
+ gramadoir | [] | 5
+ grep | [] [] [] [] | 26
+ gretl | | 3
+ gtick | | 7
+ hello | [] [] [] [] [] | 34
+ id-utils | [] [] | 12
+ indent | [] [] [] [] | 21
+ iso_3166 | [] [] [] [] [] [] [] | 27
+ iso_3166_1 | [] [] [] | 16
+ iso_3166_2 | | 0
+ iso_3166_3 | | 2
+ iso_4217 | [] [] [] [] [] [] | 24
+ iso_639 | | 1
+ jpilot | [] [] [] [] [] | 9
+ jtag | [] | 2
+ jwhois | () [] [] | 11
+ kbd | [] [] | 11
+ latrine | | 2
+ ld | [] [] | 5
+ libc | [] [] [] [] | 20
+ libgpewidget | [] [] [] [] | 13
+ libiconv | [] [] [] [] [] [] [] [] | 27
+ lifelines | [] | 2
+ lilypond | [] | 3
+ lingoteach | | 2
+ lingoteach_lessons | () | 0
+ lynx | [] [] [] | 14
+ m4 | [] [] | 15
+ mailutils | | 5
+ make | [] [] [] | 16
+ man-db | [] | 5
+ minicom | | 11
+ mysecretdiary | [] [] | 10
+ nano | [] [] [] [] | 17
+ nano_1_0 | [] [] [] | 17
+ opcodes | [] [] | 6
+ parted | [] [] [] | 15
+ ptx | [] [] | 22
+ python | | 0
+ radius | | 4
+ recode | [] [] [] | 20
+ rpm | [] [] | 9
+ screem | [] [] | 2
+ scrollkeeper | [] [] [] | 15
+ sed | [] [] [] [] [] [] | 24
+ sh-utils | [] [] | 14
+ shared-mime-info | [] [] | 7
+ sharutils | [] [] [] [] | 17
+ silky | () | 3
+ skencil | [] | 6
+ sketch | [] | 6
+ soundtracker | [] [] | 7
+ sp | [] | 3
+ tar | [] [] [] [] [] | 24
+ texinfo | [] [] [] | 14
+ textutils | [] [] [] [] | 16
+ tin | | 1
+ tp-robot | | 2
+ tuxpaint | [] [] [] [] [] | 29
+ unicode-han-tra... | | 0
+ unicode-transla... | | 2
+ util-linux | [] [] | 15
+ vorbis-tools | | 8
+ wastesedge | | 0
+ wdiff | [] [] [] | 18
+ wget | [] [] [] [] [] [] [] [] | 24
+ xchat | [] [] [] [] [] | 15
+ xfree86_xkb_xml | [] [] [] [] [] | 11
+ xpad | | 5
+ +-----------------------------------------------------+
+ 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
+ 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If January 2004 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+Using `gettext' in new packages
+===============================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library. This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+ Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/Build/source/utils/texinfo/AUTHORS b/Build/source/utils/texinfo/AUTHORS
new file mode 100644
index 00000000000..ce8ee85e6d0
--- /dev/null
+++ b/Build/source/utils/texinfo/AUTHORS
@@ -0,0 +1,31 @@
+$Id: AUTHORS,v 1.10 2004/04/11 17:56:45 karl Exp $
+Texinfo authors.
+
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Akim Demaille texi2dvi.
+Alper Ersoy makeinfo: enhancements in all files, especially
+ html-, xml-, and docbook-related.
+Andreas Schwab texinfo.tex, configure.ac, most makeinfo files.
+Bob Chassell texinfo.tex, original texinfo.txi.
+Brian Fox all makeinfo/* and info/* files, info-stnd.texi.
+Dave Love original makeinfo/html.[ch].
+Eli Zaretskii all files.
+Karl Berry all files.
+Karl Heinz Marbaise original makeinfo language support, most files.
+Noah Friedman original texi2dvi.
+Paul Rubin original makeinfo/multi.c.
+Philippe Martin original makeinfo xml/docbook output.
+Richard Stallman original texinfo.tex, install-info.c,
+ texindex.c, texinfo.txi.
+Zack Weinberg texinfo.tex: @macro implementation.
+
+See http://www.iro.umontreal.ca/contrib/po/HTML/team-LL.html for the
+translation teams for a given language LL.
+
+Many files included in the Texinfo distribution are copied from other
+locations, no author information is given for those. See util/srclist*.
diff --git a/Build/source/utils/texinfo/COPYING b/Build/source/utils/texinfo/COPYING
new file mode 100644
index 00000000000..d60c31a97a5
--- /dev/null
+++ b/Build/source/utils/texinfo/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/utils/texinfo/ChangeLog b/Build/source/utils/texinfo/ChangeLog
new file mode 100644
index 00000000000..7c53a091188
--- /dev/null
+++ b/Build/source/utils/texinfo/ChangeLog
@@ -0,0 +1,5008 @@
+2004-12-31 Karl Berry <karl@gnu.org>
+
+ * Version 4.8.
+
+2004-12-21 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.7.94.
+
+ * makeinfo/xref.c: doc fix.
+
+2004-12-20 Karl Berry <karl@gnu.org>
+
+ * makeinfo/html.c (cm_node) <html>: need old-style names in the normal
+ (not no_headers) html case, too, of course.
+ (add_html_names): canon_white the new name, too.
+
+2004-12-19 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.7.93.
+
+ * automake 1.9.4.
+
+ * makeinfo/xml.c (try_docbook_image): new fn.
+ (xml_insert_docbook_image): call it, trying additional formats
+ pdf, svg, etc.
+ * makeinfo/makeinfo.c (cm_image): check for gif too.
+ http://www.gnu.org/philosophy/gif.html says:
+ "we can and will include support for displaying GIF files in GNU
+ software." Leaving it undocumented, though.
+ Based on patch from Jens Elkner, 18 Dec 2004 01:56:28 +0100.
+
+2004-12-19 Torsten Bronger <bronger@physik.rwth-aachen.de>
+
+ * util/texinfo.dtd: define most entities, add <neos>.
+
+2004-12-17 Juan M. Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>
+
+ * djgpp/config.bat: remove files like coXXXXXX.tmp created
+ in the top_srcdir by the gl_FUNC_MKSTEMP test.
+
+2004-12-15 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.7.92.
+
+ * util/texinfo.dtd: merge with makeinfo/texinfo.dtd.
+ * makeinfo/texinfo.dtd, makeinfo/texinfo.xsl: remove.
+
+2004-12-15 Stepan Kasal <kasal@ucw.cz>
+
+ * Makefile.am (EXTRA_DIST): Removed po/Makevars.template, sorry.
+
+2004-12-15 Juan M. Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>
+
+ * djgpp/config.sed: adjust for new autoconf.
+ * makeinfo/node.c (enumerate_filename): make dos_file_names const
+ instead of static, since it may involve a fn call to pathconf.
+
+2004-12-15 Karl Berry <karl@gnu.org>
+
+ * Makefile.am (EXTRA_DIST): include ChangeLog.46, README.dev,
+ and po/Makevars.template. From Stepan.
+
+2004-12-14 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (inforef): try to explain possible uses more
+ thoroughly.
+ From: Luc Teirlinck, 13 Dec 2004 21:45:58 -0600.
+
+ * doc/texinfo.txi (pxref): more explanation.
+ * doc/info-stnd.texi (Basic Windows): put pxref in parens.
+ help-texinfo mail from adl, 13 Dec 2004 17:07:50 +0100.
+
+2004-12-13 Andreas Schwab <schwab@suse.de>
+
+ * info/echo-area.c (DECLARE_INFO_COMMAND): Add intermediate cast
+ to avoid warning.
+ * info/infokey.c (compile): Likewise.
+ * info/session.c (forward_move_node_structure): Likewise.
+ (DECLARE_INFO_COMMAND): Likewise.
+
+ * makeinfo/makeinfo.c (init_paragraph): Don't use free_and_clear
+ to avoid strict aliasing issue.
+
+ * makeinfo/cmds.c (cm_center): Avoid strict aliasing issue.
+
+2004-12-13 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (HTML Cross-reference Command Expansion): add
+ @euro{} -> U+20AC. texinfo-pretest mail from Patrice,
+ 12 Dec 2004 23:49:50 +0100.
+
+2004-12-12 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (makeinfo options): don't be so suggestive about
+ skipping xref validation.
+ emacs-devel mail from: Luc Teirlinck, 12 Dec 2004 13:02:11 -0600.
+
+2004-12-08 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.7.91.
+
+ * info/echo-area.c, info/infokey.c, info/session.c: omit useless
+ casts to intptr_t, since we're just casting to (void *) next.
+ intptr_t is not defined with gcc 3.04 on Tru64 Unix V5.1
+ (This whole vararg stuff needs to be redone correctly.)
+ Report from: Svend Tollak Munkejord (via te)
+ 8 Dec 2004 17:15:17 +0100.
+
+ * doc/texinfo.txi (ref): rewrite last two redundant paragraphs.
+
+2004-12-07 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Macro Details): document @c kludge in macro
+ definitions to work around some newline problems. (From Werner.)
+
+2004-12-05 Karl Berry <karl@gnu.org>
+
+ * makeinfo/html.c (add_escaped_anchor_name): prefix g_t if the
+ nodename begins with a nonletter. Ugh.
+ * doc/texinfo.txi (HTML Xref Node Name Expansion): document this.
+ http://ff0.org/pipermail/texinfo-pretest/2004-December/000210.html
+
+ * doc/texinfo.txi (HTML Xref 8-bit Character Expansion): define
+ behavior for Unicode code points above 0xfff.
+
+ * makeinfo/makeinfo.c (reader_loop): <wbr> didn't make it into
+ HTML 4, remove it. Sigh.
+ texinfo-pretest mail from wl, 05 Dec 2004 23:39:05 +0100.
+
+2004-12-02 Karl Berry <karl@gnu.org>
+
+ * configure.ac (install-warnings): simplify default case. From te.
+
+2004-12-01 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.7.90.
+
+ * util/texi2dvi (recode): new option, off by default.
+ Unconditionally calling recode seems problematic, when there
+ hasn't been a release for years and its Texinfo support is less than
+ perfect.
+
+2004-11-30 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Quotations and Examples): @quotation does not
+ reduce interparagraph spacing.
+
+ * makeinfo/node.c (cm_node) <html>: do not bother calling
+ add_html_nodes in the split case, the filename is wrong.
+
+2004-11-29 Karl Berry <karl@gnu.org>
+
+ Support for writing <a name="..."> using the old-style node name
+ to HTML name conversion, to keep the gcc folks happy.
+ * makeinfo/node.c (add_html_names): new routine, factoring out
+ common code (plus new code) from cm_node.
+ (cm_node) <html>: call it.
+ * makeinfo/makeinfo.h (OLD_HTML_SAFE, OLD_URL_SAFE_CHAR):
+ (re)define these.
+ * makeinfo/html.c (add_escaped_anchor_name): take new argument to
+ optionally output the old-style conversion.
+ (add_anchor_name): change call.
+ * index.c: change calls.
+ * makeinfo/html.h (add_escaped_anchor_name): change decl.
+
+2004-11-26 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (reader_loop): allow <wbr> after &mdash;
+
+2004-11-25 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Fonts): document new command @sansserif.
+ * doc/texinfo.tex (\sansserif): new command.
+ * makeinfo/cmds.h (cm_sansserif): new cmd.
+ * makeinfo/cmds.c (cm_sansserif): new cmd.
+ (command_table): add it.
+ * makeinfo/texinfo.dtd (Inline.fonts): add it; also slanted.
+ * makeinfo/xml.h (SANSSERIF, SLANTED): define these new elements.
+ * makeinfo/xml.c (texinfoml_element_list): add them.
+ From: Frank Küster, 21 Oct 2004 23:27:33 +0200, Debian bug#277754.
+
+ * doc/texinfo.txi (Quotations and Examples, end titlepage): state
+ that there must be only one space between the @end and its
+ argument. Report from: christoph.sobotka, 26 Oct 2004 22:04:03 +0200.
+
+2004-11-22 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (euro): new node, documenting new command,
+ @euro{}, for the Euro currency symbol.
+ * doc/texinfo.tex (\euro): new command, along with \eurofont to
+ support it. The following extra font support is also related to
+ supporting @euro{}:
+ (\bfstylename): define this.
+ (\textnominalsize .. \ssecnominalsize): new macros.
+ (\textfonts .. \ssecfonts): define \curfontsize.
+ * makeinfo/cmds.c (command_table): add euro.
+ * makeinfo/lang.c (cm_special_char): handle euro.
+ (iso8859_15_map): new global.
+
+2004-11-18 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\ptexnewwrite): Save \newwrite.
+ (\newwrite): Call it.
+
+2004-11-17 Karl Berry <karl@gnu.org>
+
+ * configure.ac (install-warnings): new --enable option, requested
+ by te.
+
+2004-11-11 Karl Berry <karl@gnu.org>
+
+ * texinfo.dtd (metainformation): add documentdescription.
+ (documentdescription): define.
+ * xml.h (DOCUMENTDESCRIPTION): new value for xml_element.
+ * xml.c (texinfoml_element_list): define documentdescription.
+ (docbook_element_list): likewise, but don't know how to handle it.
+ * cmds.c (cm_documentdescription): insert opening xml tag.
+ * insertion.c (end_insertion): insert closing xml tag.
+
+ * makeinfo/makeinfo.c (insert_string): declare const char * arg.
+ * makeinfo/makeinfo.h: likewise.
+ Report from: Vincent Lefevre, 20 Oct 2004 15:40:39 +0200,
+ noting a spurious </para> after </dircategory>.
+
+2004-11-08 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\pdfmakeoutlines): in the first run through the
+ toc, define \thischapnum...\thissubsecnum as 0, rather than \empty.
+ This is so \expnumber doesn't end up trying to expand
+ \csname sec\empty\endcsname, i.e., \sec, which is the secant function.
+ Report from: Oliver Beck, help-texinfo, 8 Nov 2004 08:05:55 +0100.
+
+2004-11-07 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (main) [LC_MESSAGES]: #ifdef the setlocale
+ using LC_MESSAGES. From te, 6 Nov 2004 23:36:10 +0100.
+
+2004-11-06 Karl Berry <karl@gnu.org>
+
+ * lib/Makefile.am (libtxi_a_SOURCES): add strdup.h.
+ Report from: Thomas Esser <te@dbs.uni-hannover.de>,
+ 6 Nov 2004 18:11:51 +0100.
+
+2004-11-01 Karl Berry <karl@gnu.org>
+
+ * makeinfo/xref.c (cm_xref): don't include the external file name
+ in the HTML output, since it's pretty traditional not to
+ distinguish internal and external links in HTML, and it disturbs
+ the flow of reading.
+ From: Han-Wen Nienhuys <hanwen@xs4all.nl>, 31 Oct 2004 00:13:36 +0200.
+ (For lilypond.)
+
+2004-10-31 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\setmultitablespacing): just let \multistrut be
+ the same as \strut. Its previous computation was wrong.
+ See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+
+2004-10-22 Stepan Kasal <kasal@ucw.cz>
+
+ * info/Makefile.am (generated_sources): Add dependencies defining
+ a total order on the files, to prevent race conditions with
+ parallel make.
+ Move the code about generated sources to the end of the file.
+
+2004-10-20 Stepan Kasal <kasal@ucw.cz>
+
+ * info/Makefile.am (doc.c, key.c, funs.h): Don't distribute them.
+ of these three files.
+ (ginfo_SOURCES, nodist_ginfo_SOURCES): Move files.
+ (infokey_SOURCES, nodist_infokey_SOURCES): Likewise.
+ (DISTCLEANFILES): Include generated_sources.
+
+2004-10-20 Stepan Kasal <kasal@ucw.cz>
+
+ BUILT_SOURCES is a special variable for a hack to supplement
+ the automatic dependency tracking; we need it for funs.h only.
+ See the explanation in the automake manual.
+
+ * info/Makefile.am (BUILT_SOURCES): All occurences replaced by ...
+ (generated_sources): ... this new variable.
+ (BUILT_SOURCES): set to ``funs.h''.
+
+2004-10-20 Stepan Kasal <kasal@ucw.cz>
+
+ * info/Makefile.am (ginfo_SOURCES): replace $(BUILT_SOURCES)
+ with ``doc.c funs.h''; this reflects the true situation.
+ (infokey_SOURCES): Add funs.h.
+
+2004-10-20 Stepan Kasal <kasal@ucw.cz>
+
+ * info/Makefile.am (EXTRA_DIST): No need to mention the generated
+ sources here, they are in ginfo_SOURCES or infokey_SOURCES.
+
+2004-10-19 Stepan Kasal <kasal@ucw.cz>
+
+ * configure.ac: When cross compiling, we have to remove
+ ./config.status, not "$native_tools"/config.status.
+ Replace ``echo'' with AC_MSG_NOTICE. Quote the variable
+ values passed to ``env.''
+
+2004-10-17 Karl Berry <karl@gnu.org>
+
+ * makeinfo/node.c (cm_node): don't output <br> after the
+ navigation line, it's apparently just extra space.
+
+ * configure.ac: Clean environment for native configure.
+ From: Mark Fortescue <mark@mtfhpc.demon.co.uk>,
+ 17 Oct 2004 19:09:53 +0100.
+
+2004-10-11 Stepan Kasal <kasal@ucw.cz>
+
+ * configure.ac: Add a short explanation about cross compile.
+
+2004-10-08 Karl Berry <karl@gnu.org>
+
+ * info/Makefile.am (generated_sources): remove. Found by Stepan.
+
+2004-10-08 Stepan Kasal <kasal@ucw.cz>
+
+ Support cross compiling. Based on research by Mark Fortescue.
+ Maciej W. Rozycki pointed out this issue previously.
+
+ * configure.ac: If cross compiling, run second configure script
+ in a subdirectory ${native_tools}. New automake conditional
+ TOOLS_ONLY is set inside that subdirectory.
+ * Makefile.am (SUBDIRS): Add $(native_tools); restrict the
+ SUBDIRS to minimum, if we are inside the $(native_toos) dir.
+ (distclean-local): Remove directory $(native_tools).
+ * doc/Makefile.am: If necessary, use makeinfo and install-info
+ from $(native_tools).
+ * info/Makefile.am: Similarily with the ``makedoc'' program.
+
+2004-10-07 Stepan Kasal <kasal@ucw.cz>
+
+ @table command doesn't work inside environment @display.
+ There is no point in trying to fix it: just give up with a cry.
+
+ * doc/texinfo.tex (\table, \ftable, \vtable): Instead of calling
+ \tablex directly, call ...
+ (\tablecheck): ... this new macro which checks for active newline;
+ if it's found, it reports an error and uses \doignore to recover.
+ * doc/texinfo.txi (display): mention this.
+
+2004-10-06 Karl Berry <karl@gnu.org>
+
+ * doc/*.texi: more consistent use of dashes.
+ From Stepan and Benno Schulenberg <benno@nietvergeten.nl>.
+
+2004-10-04 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_value): increment and restore
+ input_text_offset before execute_string on the value,
+ so cm_xref doesn't complain about missing punctuation.
+ From: Sergey Poznyakoff <gray@Mirddin.farlep.net>,
+ 04 Oct 2004 15:04:33 +0300.
+
+2004-10-01 Karl Berry <karl@gnu.org>
+
+ * lib/Makefile.am (libtxi_a_SOURCES): add getopt_.h.
+
+ * configure.ac: bump version to 4.7.90, although we're not really
+ pretesting yet. (I need a distribution to check an
+ automake issue.)
+
+2004-09-14 Karl Berry <karl@gnu.org>
+
+ * util/srclist.txt (getopt.h): renamed to getopt_.h.
+ * lib/getopt_.h: new file.
+ * lib/getopt.h: just include getopt.h.
+
+2004-09-09 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Image Syntax): mention @noindent, @center.
+
+2004-09-06 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\Efloat): Take care to run \scantokens on
+ \thisshortcaption before writing the lof line to auxfile.
+ Otherwise, when a newline appears in the argument to
+ @shortcaption, a literal ^^M is written to the aux file.
+ Report from Patrice, 1 Aug 2004 15:54:44 +0200.
+
+2004-09-01 Karl Berry <karl@gnu.org>
+
+ * util/gendocs.sh: show commands, allow / in description.
+
+2004-08-30 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (maybe_escaped_expansion): new routine, like
+ expansion but does HTML escapes.
+ * makeinfo/makeinfo.h (maybe_escaped_expansion): declare.
+ * makeinfo/index.c (cm_printindex): call it.
+ This is @cindex Kahrs, J@"urgen does not get
+ gawk.texi:23425: Unknown command `&quot;urgen'.
+ (in gawk 3.1.4).
+ Report from: Stepan Kasal <kasal@ucw.cz>, 24 Aug 2004 12:36:34 +0200.
+
+2004-08-29 Karl Berry <karl@gnu.org>
+
+ * makeinfo/node.c (split_file): do not search for output file
+ along the path when calling find_and_load (can cause seg
+ fault when cross-compiling).
+ From: Martin Husemann <martin@duskware.de>, 29 Aug 2004 08:40:33 +0200.
+ http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=26791
+
+2004-08-27 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Macro details): more warnings about macro usage.
+ Report from: Stepan Kasal <kasal@ucw.cz>, 24 Aug 2004 09:29:35 +0200.
+
+ * doc/texinfo.tex (\Efloat): \vskip\parskip after printing the
+ caption; previous \printedsomething code to do this had become
+ obsolete. Reported by Stepan.
+
+ * doc/texinfo.txi (caption shortcaption): show an example for
+ @shortcaption, and remark that weird commands like @c and @verb
+ are not allowed. Suggested by Stepan.
+
+2004-08-27 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\initial): when breaking the column before the
+ initial, allow for some space at the bottom of the column, so
+ the baselineskip is preserved (more or less).
+ Don't give negative penalty, it encouradges creating of underfull
+ columns with stretched baselineskip.
+ At the end, the \nobreak should be before \vskip, not after it.
+
+2004-08-26 Stepan Kasal <kasal@ucw.cz>
+
+ * util/texi2dvi: fix the sed script searching for @documentencoding;
+ Double-quote some instances of "$filename_???"
+
+2004-08-26 Akim Demaille <akim@epita.fr>
+
+ Let DVI and PDF files honor the document encoding in TeX.
+
+ * util/texi2dvi ($language): Be sure to set its value.
+ (get_xref_files): Turn this external shell script into a function.
+ (filename_rcd, $tmpdir_rcd): New.
+ If the file is in Texinfo, and has @documentencoding, and recode
+ is available, then run it.
+
+2004-08-25 Akim Demaille <akim@epita.fr>
+
+ * util/Makefile.am (texinfo.cat): Fix for srcdir != builddir.
+
+2004-08-25 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: @ is also ok for the first character of xref_files.
+
+2004-08-20 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\tablez): accidentally removed assignments
+ enabling @item and @itemx within @table.
+
+2004-08-19 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\multitable): \def\item to \crcr, instead of
+ \let, to avoid errors with a nested @itemize inside
+ @multitable.
+ Report from: Pierre-Luc Veilleux <plv@centretiv.com>,
+ 18 Aug 2004 13:26:00 -0400.
+
+2004-08-19 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\scanmacro): Make backslash active, not other,
+ as this is the default when processing texinfo files.
+ Otherwise, a \ inside @copying will eventually print as ``.
+
+2004-08-18 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\scantxt): " is another active char to be
+ sanitized.
+
+2004-08-18 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (exampleindent): document that the default is
+ different in TeX.
+ From: Simon Josefsson <jas@extundo.com>, 18 Aug 2004 13:44:32 +0200.
+
+2004-08-14 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\cslet): equivalent-or-better, and shorter,
+ version from dak, 12 Aug 2004 19:17:27 +0200.
+
+ * doc/texinfo.txi (makeinfo options): use --no-number-sections
+ with non-hierarchical manuals.
+
+2004-08-13 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: check for -file-line-error, since -style is no
+ longer part of the name.
+
+2004-08-07 Karl Berry <karl@gnu.org>
+
+ * info/echo-area.c (inform_in_echo_area): avoid buffer overrun.
+ Report from: Roman Werpachowski <rwerp@gazeta.pl>,
+ 7 Aug 2004 01:18:32 +0200.
+
+ * info/echo-area.h (inform_in_echo_area): declare arg as const,
+ while we're at it.
+
+2004-08-02 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_acronym_or_abbr): use strchr, not index.
+ Report from: Prof Brian Ripley <ripley@stats.ox.ac.uk>,
+ 2 Aug 2004 12:47:36 +0100 (BST)
+
+2004-07-31 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi,
+ * doc/texinfo.tex,
+ * makeinfo/cmds.c, cmds.h, xml.c, xml.h,
+ * util/texinfo.dtd: new command @abbr, suggested by Paul Eggert,
+ who also sent the original documentation.
+
+2004-07-30 Karl Berry <karl@gnu.org>
+
+ * info/infomap.c (initialize_vi_like_keymaps): bind j to
+ info_next_line and k to info_prev_line. From Eli.
+
+2004-07-30 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * info/filesys.c (extract_colon_unit): Clean up handling of the
+ end of string.
+
+2004-07-27 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (verb): explicitly warn that @verb cannot be
+ used in xref contexts.
+
+2004-07-27 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\float): The parameters for @float are
+ separated by commas; allow a space after each of the commas.
+
+ The TeX code for @caption, @shortcaption and @copying now uses
+ a similar mechanism to macro definitions. In detail:
+
+ * doc/texinfo.tex (\macrobodyctxt, \macroargctxt): Generalize, ...
+ (\scanctxt, \scanargctxt): ... and introduce new variants.
+ (\scanexp): New macro--expand the parameter and call \scantokens.
+ (\copying, \docopying, \insertcopying): Use \scanargctxt and
+ \scanexp--this simplifies things a lot.
+ (\caption, \shortcaption): Redefine, using \scanargctxt via ...
+ (\docaption, \defcaption): ... these new macros.
+ (\appendtomacro): Simplify code, using \expandafter.
+
+2004-07-26 Karl Berry <karl@gnu.org>
+
+ Avoid using the path for output files, since this led to problems
+ when incompatible files created by previous versions were found.
+ * makeinfo/files.c (find_and_load): introduce second parameter
+ use_path, set to 0 from the call in handle_delayed_writes,
+ 1 in all cases.
+ * makeinfo/files.h: change decl.
+ * makeinfo/cmds.c, makeinfo.c, node.c: change calls.
+ From: Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at>,
+ 14 Jul 2004 00:31:54 +0200.
+
+2004-07-25 Werner Lemberg <wl@gnu.org>
+
+ Rename @s to @slanted.
+
+ * doc/texinfo.tex (\s): Replace with...
+ (\slanted): This.
+ * doc/texinfo.txi: Updated.
+
+ * makeinfo/cmds.c (command_table): Add @slanted, not @s.
+ (cm_s): Replace with...
+ (cm_slanted): This.
+ * makeinfo/cmds.h: Add cm_slanted, not cm_s..
+
+ * NEWS: Updated.
+
+2004-07-24 Karl Berry <karl@gnu.org>
+
+ * info/echo-area.c (ea_possible_completions),
+ * info/session.c (forward_move_node_structure),
+ * info/infokey.c (compile): cast to intptr_t to avoid cast to
+ pointer from integer of different size.
+ From Havard Eidnes <he@netbsd.org>, 14 Jul 2004 20:38:59 +0200.
+
+2004-07-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): with XML, instead of directly calling
+ handle_variable_internal for -D and -U command line flags, hold the
+ variable declarations until output document is started.
+ (convert_from_loaded_file): handle variables provided with -D and -U
+ flags here, just before entering the reader_loop.
+ (Otherwise, -D/-U with --xml cause a segfault.)
+
+2004-07-15 Werner Lemberg <wl@gnu.org>
+
+ * doc/texinfo.tex (\s): New command to typeset text with a slanted
+ font.
+ * doc/texinfo.txi: Document @s.
+
+ * makeinfo/cmds.c (command_table): Add @s.
+ (cm_s): New function. Currently the same as cm_i -- it probably
+ has to be adapted to Docbook and XML.
+ * makeinfo/cmds.h: Add prototype for cm_s.
+
+ * NEWS: Document new command @s.
+
+2004-07-15 Werner Lemberg <wl@gnu.org>
+
+ * doc/texinfo.tex (\TeX): Adjust \spacefactor to make it act like a
+ lowercase letter, not like a period.
+
+2004-07-12 Karl Berry <karl@gnu.org>
+
+ * texinfo/texinfo.txi (Useful Highlighting): Include
+ cross-references to each of the commands. Suggestion from
+ Wolfgang Pausch, 12 Jul 2004 08:26:28 +0200.
+
+ * texinfo/texinfo.txi (Invoking makeinfo),
+ * makeinfo/makeinfo.c: mention that --if-noFORMAT also processes
+ @ifnotFORMAT blocks.
+ Suggestion from Stepan.
+
+2004-07-11 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (discard_until): leave input_text_offset at
+ the end of input_text if not found, not at one past the
+ end of input_text. (Had erroneously put that in the block
+ only if an error was given.) The result was a null byte
+ after macro expansions. Report from Werner,
+ 10 Jul 2004 15:36:40 +0200.
+
+ * makeinfo/node.c (split_file): fwrite Local Variables trailer so
+ it actually gets into the output of the top-level info
+ file; don't just insert_string.
+ Report from: Werner LEMBERG, 11 Jul 2004 08:58:13 +0200.
+
+2004-07-10 Karl Berry <karl@gnu.org>
+
+ * util/texi2pdf: new script.
+ * util/Makefile.am: install it.
+ * doc/texinfo.txi: document it.
+
+2004-07-05 Karl Berry <karl@gnu.org>
+
+ * makeinfo/xref.c (cm_email, cm_uref, et al.):
+ * makeinfo/xml.c (xml_insert_indexentry, xml_insert_indexterm):
+ * makeinfo/sectioning.c (sectioning_underscore):
+ * makeinfo/makeinfo.c (cm_listoffloats): use %s, don't pass string to
+ execute_string. Report from Christian Schenk.
+
+2004-07-02 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makinfo.c (execute_string): don't worry about
+ mismatched multiline commands if executing_macro.
+
+2004-06-27 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: Various doc fixes.
+ (\dosubindsanitize): propagate the same penalty
+ >10000, don't just use \nobreak.
+ (\sectionheading): insert a final penalty of
+ 10001, not 10000. This causes \aboveenvbreak to
+ insert \parskip glue, cancelling the
+ \vskip-\parskip done here. Otherwise, when (e.g.)
+ @section is followed immediately by @example, the
+ example can be shrunk up above the section title.
+
+2004-06-14 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\commondummies, \indexnofonts): dummy-up @comma.
+ Report from Arnold.
+
+2004-06-06 Karl Berry <karl@gnu.org>
+
+ * makeinfo/index.c (index_add_arg): ensure all elements are always
+ initialized, including output_file, section, and section_name.
+ (cm_printindex): don't pass index->output_file to
+ add_html_block_elt_args if it is null. Also do
+ not pass spurious extra index_name argument.
+
+ * makeinfo/makeinfo.c (add_char): don't call html_output_head if
+ only_macro_expansion (e.g., a macro call in the
+ Top menu). From: Yuri D'Elia <wavexx@yuv.info>,
+ 05 Jun 2004 21:11:00 +0200.
+
+2004-06-03 Karl Berry <karl@gnu.org>
+
+ * info/session.c (info_menu_digit): use menu, rather than entry, to
+ avoid seg fault on "0" (the last item),
+ since menu has already been checked.
+ From: Malcolm Rowe <malcolm-gnu@farside.org.uk>,
+ 02 Jun 2004 21:32:37 +0100.
+
+2004-05-17 Karl Berry <karl@gnu.org>
+
+ * util/gendocs.sh, gendocs_template: use package.format.tar.gz
+ consistently. Before, -, _, and . were all used.
+
+2004-05-16 Karl Berry <karl@gnu.org>
+
+ * lib/Makefile.am (libtxi_a_SOURCES): include strcase.h.
+ From: "Gerrit P. Haase" <gp@familiehaase.de>,
+ 15 May 2004 21:50:52 +0200.
+
+ * util/gendocs.sh: force HTML output name, otherwise Emacs fails
+ with its "@setfilename ../...".
+
+2004-05-04 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi (TEX): don't use the value when it ends in
+ "latex"; TEX is also used by mpost. Report from
+ Yvon.Henel@wanadoo.fr.
+
+2004-04-29 Karl Berry <karl@gnu.org>
+
+ * doc.texinfo.txi (Invoking makeinfo): mention --plaintext.
+ From Akim.
+
+ * doc/texinfo.tex (\emptyusermacros): can use \asis.
+ (\identity): remove.
+
+2004-04-29 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\commondummiesnofonts, \indexnofonts): In order
+ to correctly transform words like `Dvo\v{r}\'{a}k' to `Dvorak'
+ for index sorting, one has to define all accent control sequences
+ as @asis. (Current code would produce `Dvor{a}k'.)
+
+2004-04-29 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo/makeinfo.c (remember_error): Try cm_bye not more than
+ twice. Fixes `Too many errors! Gave up.' looping.
+
+2004-04-26 Karl Berry <karl@gnu.org>
+
+ * lib/system.h (STRCASEEQ, STRNCASEEQ): new #defines for
+ convenience.
+ * makeinfo/cmds.c (cm_strong): actually change the output to avoid a
+ spurious xref. Suggestion from Jan Nieuwenhuizen
+ <janneke@gnu.org>, 26 Apr 2004 00:04:04 +0200, emacs-devel.
+
+ * automake 1.8.4.
+
+2004-04-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\emptyusermacros, \identity): new macros.
+ (\indexdummiesnofonts): call it.
+ This is to semi-support macro calls in the arg to @deffn.
+ Report from: Akim Demaille <akim@epita.fr>, 20 Apr 2004 17:48:28 +0200.
+
+2004-04-21 Karl Berry <karl@gnu.org>
+
+ * configure.ac (gl_FUNC_MKSTEMP): rename from UTILS_FUNC_MKSTEMP,
+ per new gnulib code.
+
+2004-04-20 Karl Berry <karl@gnu.org>
+
+ * makeinfo/tests/copying: force POSIX language setting.
+
+2004-04-19 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_code): use <samp> for commands other than
+ @code, so we get typewriter output; and add `...'
+ for @samp.
+ Report from: John Blevin <blevin@lucent.com>,
+ 16 Apr 2004 11:40:01 -0400.
+
+ * makeinfo/html.c (html_output_head) [CSS_FONT_ROMAN,
+ CSS_FONT_SMALL_CAPS]: prettify.
+
+2004-04-18 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\Orb): define if undefined.
+ Report from Laurent Siebenmann.
+
+ * util/dir-example: diff updates.
+
+2004-04-13 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: remove trailing blanks. suggestion from Jim.
+
+2004-04-12 Paul Eggert <eggert@twinsun.com>
+
+ * doc/Makefile.am (info.1, infokey.1, install-info.1,
+ makeinfo.1, texi2dvi.1, texindex.1): Don't use $< in ordinary
+ rules; it's not portable.
+ * util/Makefile.am (texinfo.cat): Likewise.
+
+2004-04-12 Karl Berry <karl@gnu.org>
+
+ * bootstrap: update from berlios.
+
+2004-04-11 Karl Berry <karl@gnu.org>
+
+ * Version 4.7.
+
+2004-04-09 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (execute_string): do not free the temporary copy
+ of input_filename until we're definitely done with
+ it. It is used in line_error, etc.
+
+ * INSTALL: mention texinfo.tex install step.
+
+ * util/Makefile.am (texinfo.cat): new name instead of just
+ `catalog'. rename files.
+ * util/Makefile.am (EXTRA_DIST): texinfo-cat.in now, not
+ catalog.in.
+
+2004-04-09 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): after @copying, do not
+ discard until a newline if we are looking at one.
+ (end_insertion): decrement input line number after @end copying.
+
+2004-04-08 Karl Berry <karl@gnu.org>
+
+ * util/Makefile.am: doc fix, as automake.diff is no longer needed.
+
+2004-04-07 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.6.95.
+
+ * doc/texinfo.tex (\dodonode): new macro to remove trailing comma.
+ (\donode): call it, after removing space-comma.
+
+ * doc/texinfo.txi (indicateurl): new name for url.
+ (uref): url is now a synonym for uref.
+ * doc/texinfo.tex (\url, \indicateurl): implement.
+ * makeinfo/cmds.c (cm_indicate_url): rename from cm_url.
+ (command_table): make "url" a synonym for "uref".
+ * makeinfo/cmds.h (cm_indicate_url): declare it.
+
+2004-04-06 Karl Berry <karl@gnu.org>
+
+ * makeinfo/sectioning.c (insert_and_underscore): use `...' quote
+ instead of "..." in error message.
+ * info/*.c: likewise.
+
+2004-04-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_colon): check if the character we are erasing
+ from the output belongs to an XML tag.
+
+2004-04-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_author): use author element in XML output
+ for attribution.
+
+2004-04-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): do not call
+ write_tag_table if the output filename is "-".
+
+2004-04-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): <pre> blocks implicitly ends
+ the previous paragraph, so avoid </p> after the end tag.
+
+ * makeinfo/footnote.c (output_pending_notes): made Footnotes anchor
+ non translatable, and changed it to "texinfo-footnotes-in-document" to
+ lessen the chance of getting in the way of another Footnotes anchor.
+
+2004-04-04 Jim Meyering <jim@meyering.net>
+
+ * info/nodes.c (info_load_file_internal): Don't free lowered_name
+ until *after* using fullpath, since they may be one and the same.
+
+2004-04-03 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Image Syntax): had missing @'s in cookies.
+
+ * makeinfo/cmds.c (cm_w): insert a comment at the end of @w, so that
+ @w{$}Log$ doesn't end up as <dollar>Log<dollar>.
+ Report from rms.
+ * doc/texinfo.txi (GNU Sample Texts, w): mention this.
+
+2004-04-02 Karl Berry <karl@gnu.org>
+
+ * configure.ac: pretest version 4.6.94.
+
+ * doc/texinfo.txi (Node Line Requirements): discuss whitespace.
+
+ * doc/texinfo.tex (\node, \donode): remove trailing
+ spaces (before the first comma) in the @node line.
+
+2004-03-29 Karl Berry <karl@gnu.org>
+
+ * util/install-info.c (menu_line_lessp, menu_line_equal): move to
+ before all uses.
+
+2004-03-27 Karl Berry <karl@gnu.org>
+
+ * info/signals.c (initialize_info_signal_handler) [SA_NOCLDSTOP]:
+ use instead of HAVE_SIGACTION, since Solaris 2.7+
+ with Sun CC don't have sa_handler, sa_flags, sa_mask.
+
+ * info/session.c (search_string_index): remove unused variable.
+ * info/terminal.c (term_mo): remove unused variable.
+ * info/display.c (display_clear_display): remove unused variable
+ display_line.
+ * util/install-info.c (infilelen_sans_info): remove unused
+ variable.
+
+ * doc/texinfo.txi: mistakenly had * name: node: in menu items instead
+ of * name: node.
+
+ * util/install-info.c (menu_item_equal): must declare ret at beginning
+ of function. From Werner.
+
+2004-03-27 Jim Meyering <jim@meyering.net>
+
+ * info/info-utils.c (info_parse_node): Don't read beyond end
+ of buffer when looking for ``(line ...)'' in a menu item.
+
+2004-03-27 Andreas Schwab <schwab@suse.de>
+
+ * util/install-info.c (menu_item_equal): Don't scan past
+ term_char.
+
+2004-03-26 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.6.93.
+
+ * util/install-info.c (menu_item_equal): compare basenames,
+ so lilypond/ subdir will match. Bug report from Werner,
+ 21 Mar 2004 08:31:10 +0100.
+
+ * configure.ac (AC_CHECK_DECLS): skip strncasecmp again.
+ * lib/system.h (strcase.h): change conditional to
+ !HAVE_STRNCASECMP || !HAVE_STRCASECMP. Extra
+ !HAVE_DECL seems superfluous.
+
+ * lib/system.h: include <unistd.h> last, following Autoconf's
+ ac_includes_default.
+
+2004-03-25 Karl Berry <karl@gnu.org>
+
+ All these changes are because strncasecmp is only declared in
+ <strings.h> on IBM AIX 4.2. (Report from Nelson Beebe.)
+
+ * configure.ac (AC_CHECK_DECLS): add memchr; no need to check for
+ strcasecmp.(gl_STRCASE): call this ...
+ (AC_REPLACE_FUNCS): ... replacing checks for
+ strcasecmp and strncasecmp here.
+ * lib/system.h (memchr) [!HAVE_DECL_MEMCHR]: add conditional
+ declaration.
+ (strcase.h) [!HAVE_DECL_STRNCASE]: add conditional include.
+ (strings.h) [HAVE_STRINGS_H]: include if
+ available, even if <string.h> is also available.
+ * info/session.c (strncasecmp) [M_XENIX]: remove this conditional
+ declaration, since we haven't been testing for M_XENIX in many
+ years.
+ * m4/Makefile.am (EXTRA_DIST): add strcase.m4.
+ * util/srclist.txt (lib/strcase.h, m4/strcase.m4): add, updating
+ from gnulib.
+
+2004-03-24 Karl Berry <karl@gnu.org>
+
+ * makeinfo/index.c:
+ * makeinfo/float.c: avoid use of snprintf, which is not available on
+ all platforms. Bug report by Nelson and Vin Shelton (22mar03).
+
+ * automake 1.8.3.
+
+2004-03-23 Karl Berry <karl@gnu.org>
+
+ * doc/info-stnd.texi (Searching Commands): typo from jesper.
+
+2004-03-21 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\indexnofonts): \definedummyletter needs to
+ define the control letters to be empty, without
+ taking any argument; most control letters, such as
+ @:, don't take arguments, and it won't hurt to
+ just always ignore them for index sorting.
+ Report from Arnold.
+
+ * info/doc.h (InfoFunction): cast NULL to VFunction *, to
+ prevent pgcc from complaining. From Nelson.
+
+2004-03-20 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Structuring Command Types): be even more explicit
+ about @unnumbered vs. @heading.
+
+ * makeinfo/html.c (insert_html_tag_with_attributes): use the same
+ parameter names (start_or_end and tag) in both stdc and !stdc
+ cases. Report from Nelson.
+
+ * info/m-x.c (info_execute_command): don't dereference
+ InfoFunction(command) as a function call if it's NULL. Report
+ from Nelson, pgcc-5.1-3 complains.
+
+2004-03-19 Karl Berry <karl@gnu.org>
+
+ * info/signals.h [!SA_NOCLDSTOP]: borrow test from coreutils'
+ sort.c, to avoid using sigset_t when it's not
+ defined (apparently).
+
+ * makeinfo/html.c (escape_string): escape ", too, for @image's
+ alttext among others.
+ * makeinfo/html.h: doc fix.
+ * doc/texinfo.txi (Image Syntax): making empty alt text, do
+ escaping.
+
+ * util/dir-example: reorder.
+
+ * doc/texinfo.txi (title subtitle author): using them outside
+ @titlepage is an error, they're not actually "ignored".
+ * makeinfo/insertion.c (cm_author): one mdash suffices.
+
+2004-03-19 Jim Meyering <jim@meyering.net>
+
+ * makeinfo/makeinfo.c (add_char): Use memmove, rather than strncpy,
+ since source and destination strings overlap.
+
+ * makeinfo/float.c (add_new_float): Avoid buffer overrun when
+ appending `.' to a chapter number.
+
+2004-03-18 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.6.92.
+
+2004-03-18 Andreas Schwab <schwab@suse.de>
+
+ * lib/xmalloc.c: Include "system.h" instead of declaring malloc
+ and realloc ourselves.
+ (xmalloc): Change type of size parameter to size_t.
+ (xrealloc): Likewise.
+
+ * lib/system.h (xmalloc, xrealloc): Change type of size parameter
+ to size_t.
+
+2004-03-18 Karl Berry <karl@gnu.org>
+
+ * makeinfo/xref.c (cm_xref): ignore any directory part or extension
+ in html case, warn if nothing left.
+ * doc/texinfo.txi (HTML Xref Link Basics): ignore directory part in
+ @xref cmd.
+
+ * lib/getopt.h (__GNUC_PREREQ) [! __GNUC_PREREQ]: change
+ conditional to the actual symbol, instead of just
+ __GNUC, else --disable-nls compilation fails under
+ SunOS 5.8 with gcc 3.2.3 (at least).
+ Report from Vin Shelton, 15 Mar 2004 08:51:14 -0500.
+
+ * util/texindex.c: add some const declarations.
+ * util/install-info.c: add some const declarations.
+ (by no means all)
+
+ * doc/texinfo.txi (HTML Xref *): new nodes.
+
+2004-03-15 Karl Berry <karl@gnu.org>
+
+ * makeinfo/xref.c (cm_xref): need ../ in reference to foreign html
+ manual, if splitting.
+
+2004-03-14 Jim Meyering <jim@meyering.net>
+
+ * makeinfo/index.c (insert_index_output_line_no): Ensure that `i'
+ is larger than zero before (not after) using `i-1' as an array index.
+
+ * makeinfo/cmds.c (cm_acronym): Don't write description[-1]
+ when description is the empty string.
+
+ * makeinfo/makeinfo.c (insert): Avoid buffer under-run when
+ output_paragraph_offset is zero.
+ (canon_white): Rewrite not to use strcpy (was used with
+ overlapping source and destination)
+
+2004-03-14 Andreas Schwab <schwab@suse.de>
+
+ * info/session.c: Fix buffer overflows.
+
+2004-03-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xref.c (cm_xref): print the fifth arg (or fourth if it's
+ not available), in parens for the visible text of the HTML link.
+
+2004-03-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/tests/node-expand.txi:
+ * makeinfo/tests/node-whitespace.txi: added titles to @top.
+
+2004-03-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (sectioning_underscore): check if title is
+ pointing to NULL before calling strlen (happens when there is no
+ @settitle before @top.)
+
+2004-03-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (sectioning_underscore): warn if both @top and
+ @settitle are empty.
+ (sectioning_html, insert_and_underscore): use @settitle argument if
+ @top is empty.
+ (insert_and_underscore): removed with_char argument from function
+ declaration.
+
+ * makeinfo/sectioning.h: insert_and_underscore proto update.
+
+2004-03-13 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.6.91.
+
+ * info/*.[ch]: copyright dates, and final ugly casts.
+
+ * doc/texinfo.txi (Generating HTML): make its own chapter, since we
+ have lots to say about xrefs now.
+
+ * doc/texinfo.txi (Refilling Paragraphs): @ignore this, just
+ describe @refill better in the summary.
+ (Obtaining TeX): make a section of Hardcopy,
+ instead of its own appendix.
+ (Command Syntax): subnode of @@-Command List.
+ This reduction in the number of appendices will hopefully make the
+ manual less overwhelming.
+
+2004-03-13 Alper Ersoy <dirt@gtk.org>
+
+ * info/dir.c:
+ * info/display.c:
+ * info/display.h:
+ * info/doc.h:
+ * info/dribble.c:
+ * info/dribble.h:
+ * info/echo-area.c:
+ * info/echo-area.h:
+ * info/filesys.c:
+ * info/filesys.h:
+ * info/footnotes.c:
+ * info/footnotes.h:
+ * info/gc.c:
+ * info/gc.h:
+ * info/indices.c:
+ * info/indices.h:
+ * info/info-utils.c:
+ * info/info-utils.h:
+ * info/info.c:
+ * info/info.h:
+ * info/infodoc.c:
+ * info/infokey.c:
+ * info/infomap.c:
+ * info/infomap.h:
+ * info/m-x.c:
+ * info/makedoc.c:
+ * info/man.c:
+ * info/man.h:
+ * info/nodemenu.c:
+ * info/nodes.c:
+ * info/nodes.h:
+ * info/search.c:
+ * info/search.h:
+ * info/session.c:
+ * info/session.h:
+ * info/signals.c:
+ * info/terminal.c:
+ * info/terminal.h:
+ * info/tilde.c:
+ * info/tilde.h:
+ * info/variables.c:
+ * info/variables.h:
+ * info/window.c:
+ * info/window.h:
+ * lib/system.h: protoized.
+
+2004-03-12 Karl Berry <karl@gnu.org>
+
+ * makeinfo/sectioning.c (sectioning_underscore): don't segfault when
+ generating xml if @top arg was empty. Report from Pat.
+
+2004-03-11 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\pdfoutput): check also for \relax and 0, not
+ just \undefined, in case pdftex is being run in dvi mode.
+ Reported by Thomas Esser.
+
+ * lib/Makefile.am (libtxi_a_SOURCES): add getopt_int.h.
+
+2004-03-11 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (add_escaped_anchor_name): removed unnecessary
+ ampersand check.
+ (fix_filename): removed size calculation and memory reallocation for
+ filename as it is already PATH_MAX bytes. Added a check so we don't
+ cross PATH_MAX boundary while expanding not-isalnum to hex values.
+
+ * makeinfo/toc.c (toc_add_entry): generate links following html cross
+ refs proposal from Patrice Dumas.
+
+2004-03-11 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.h: changed URL_SAFE_CHAR to isalnum.
+
+ * makeinfo/html.c (add_escaped_anchor_name, add_anchor_name)
+ (fix_filename): generate links following html cross refs proposal
+ from Patrice Dumas.
+
+ * makeinfo/xref.c (cm_xref): tweaked references to external manuals,
+ to better follow html cross refs proposal.
+
+2004-03-08 Karl Berry <karl@gnu.org>
+
+ * pretest version 4.6.90.
+
+ * makeinfo/Makefile.am (makeinfo_SOURCES): include multi.h.
+ * makeinfo/cmds.c (cm_verb): avoid spurious warning.
+
+2004-03-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/lang.c (cm_special_char): call add_encoded_char for Info
+ output too.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_minus): use minus entity for HTML too.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (reader_loop): disable multiple dashes and
+ quotes entity substitution for HTML and XML, if escape_html is not
+ true.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * util/texinfo.dtd: added math element and updated footnote.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_footnote): start <para> if not already
+ started.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (index_add_arg): make entry node name 'Footnotes'
+ if the output format is non-split HTML, and we are handling footnotes.
+
+ * makeinfo/footnote.c (output_pending_notes): added anchor at the
+ start of footnotes block for the non-split HTML output, so @printindex
+ can refer to that point as the nodename.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/defun.c (defun_internal): use var element for HTML, instead
+ of i.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): reset filling_enable to its previous
+ state after getting the cookie done.
+
+2004-03-01 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): insert magic cookie only if there's
+ a bitmap file (if all we have is a text file, skip the cookie.)
+
+2004-02-29 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (cm_node): moved node order handling to ...
+ (remember_node): here.
+
+2004-02-29 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.c (draw_horizontal_separator): insert a space before
+ the newline so it looks different than @subsection's.
+
+2004-02-29 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (insert): do not strip trailing whitespace in
+ multitables.
+
+2004-02-29 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (execute_string): removed XML tag balance
+ checks.
+
+2004-02-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion): for rawxml,
+ rawhtml and rawdocbook blocks, change the state of escaping depending
+ on raw_output_block in order to avoid problems when these blocks are
+ used within a @rmacro.
+
+2004-02-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): for quotation use
+ default_indentation_increment.
+
+2004-02-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (info_trailer): call current_document_encoding
+ here too.
+
+2004-02-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/lang.h: new variable unknown_encoding.
+
+ * makeinfo/lang.c (cm_documentencoding): save and use the encoding
+ argument even if it's unknown.
+
+ * makeingo/html.c (html_output_head): call current_document_encoding
+ instead of checking document_encoding_code.
+
+2004-02-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): simplified entry generation.
+
+2004-02-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/files.h: new members node_order and index_order in
+ DELAYED_WRITE struct.
+
+ * makeinfo/files.c (register_delayed_write): save current node and
+ index order.
+ (handle_delayed_writes): update tag_table positions and index line
+ numbers by comparing orders, not line numbers they are defined.
+
+ * makeinfo/index.c: made index_counter not static and ...
+ * makeinfo/index.h: extern.
+
+ * makeinfo/node.h: new member order in TAG_ENTRY struct.
+
+ * makeinfo/node.c (cm_node): keep the order of the node entry.
+
+2004-02-27 Karl Berry <karl@gnu.org>
+
+ * util/gendocs.sh: generate ASCII in static file, not stdout, so
+ toc/index can get written.
+
+ * util/gendocs_template: XHTML version from
+ http://www.gnu.org/boilerplate.html, via John Darrington
+ <john@cellform.com.au>, 9 Jan 2004 07:24:27 +0800.
+
+2004-02-27 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * doc/texinfo.txi (Image Syntax): Update.
+
+ * makeinfo/makeinfo.c (cm_image): Only insert a period between the
+ image's NAME and EXTENSION as a second guess, to retain backward
+ compatibility.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_element_with_attribute): if we are
+ closing either TABLEITEM, ITEM or DEFINITIONITEM during string
+ execution, update relevant state.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (execute_string): moved state updates below
+ insertion and element stack checks, so any code executed in those
+ checks will be aware of executing_string.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_docbook_image): for Docbook, if paragraph
+ is open, use inlinemediaobject instead of mediaobject in an
+ informalfigure.
+ (xml_insert_element_with_attribute): indent after informalfigure.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new element INLINEIMAGE.
+
+ * makeinfo/makeinfo.c (cm_image): for XML, use INLINEIMAGE or IMAGE
+ depending on paragraph state.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): for Info, enclose text image in
+ brackets if @image is used inline (ie. paragraph is open).
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_noindent_cmd, cm_indent): start paragraph for
+ Info too.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): for HTML, if paragraph is not open,
+ enclose image in a <div> block.
+
+2004-02-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_noindent_cmd, cm_indent): insert <p> for HTML.
+
+2004-02-26 Alper Ersoy <dirt@gtk.org>
+
+ * util/texinfo.dtd: moved verbatim to &block;.
+
+2004-02-25 Stepan Kasal <kasal@ucw.cz>
+
+ A first step towards general cleanup of sectioning macros:
+ * doc/texinfo.tex (\genhead): A generalized version of ...
+ (\numhead, \apphead, unnmhead): ... these, which uses ...
+ (\chapheadtype, \unmlevel, \maxseclevel): ... these "variables".
+
+2004-02-25 Karl Berry <karl@gnu.org>
+
+ * makeinfo/index.c (cm_printindex): insert cookie in Info output
+ for benefit of Info readers.
+
+2004-02-26 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): removed obsolete Docbook
+ indentation work-around.
+
+2004-02-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_author): new function.
+ (cm_titlepage_cmds): removed @author parts.
+
+ * makeinfo/cmds.c: made @author call cm_author.
+
+2004-02-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: avoid duplicate index entries within the same
+ node (from Alper): syncodeindex, lines 9627 and 9633 TEXINPUTS,
+ lines 14157 and 14202 texinfo-format-buffer 15131 and 15159
+ texinfo-format-region 15130 and 15149
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.h: new variable example_indentation_increment.
+
+ * makeinfo/cmds.c (set_default_indentation_increment): renamed to
+ set_example_indentation_increment.
+ (cm_exampleindent): call set_example_indentation_increment.
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion): @example,
+ @display and the like now rely on example_indentation_increment.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion): @float should
+ not play with indentation.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): check if we are crossing the
+ caption boundaries looking for a space to break at.
+
+2004-02-24 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: TEXINFO_OUTPUT -> TEXINFO_OUTPUT_FORMAT,
+ after discussion with tar maintainer.
+
+2004-02-20 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\infochapter, \infosection, etc.): these stubs
+ of sectioning commands nuked.
+
+2004-02-24 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\centerchap): Fixed to work again,
+ don't open group.
+ (\centerparameters): New macro.
+ (\centerchfplain): Nuked.
+
+ The following continues with prosecution of @setchapterstyle{open}:
+ * doc/texinfo.tex (\chfplain): renamed to \chapmacro.
+ (\CHAPFplain): Nuked.
+ (\setchapterstyle): Moved next to its deprecated friends.
+
+2004-02-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\dofloat): start a paragraph.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_caption): check if the innermost
+ environment is @float.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * info/session.c (info_menu_digit): if the menu entry has a line
+ number, go to that line.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * info/info.c (main): make sure dir file is not listed for option
+ --where.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_element_with_attribute, xml_add_char)
+ (xml_begin_table, xml_end_table, xml_begin_table_item)
+ (xml_continue_table_item): separated ITEM and TABLEITEM states to
+ handle @table environments better.
+
+2004-02-24 Alper Ersoy <dirt@gtk.org>
+
+ * util/texinfo.dtd: added float and friends, updated tableitem and
+ Inline.reference.
+
+2004-02-23 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Structuring Command Types): slightly more info
+ about headings. Fix other references, too.
+
+ * Makefile.am (EXTRA_DIST): explicitly list every file in djgpp,
+ so that the CVS directory is not included in the dist.tar.gz.
+
+2004-02-23 Arnold D. Robbins <arnold@skeeve.com>
+
+ * makeinfo/cmds.c (cm_code): For @samp, using single quotes instead of
+ double quotes, to match TeX output more closely.
+
+2004-02-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.h: new output_file and entry_number members in
+ index_elt struct.
+
+ * makeinfo/index.c (index_add_arg, cm_printindex): rewrote hyperlink
+ generation for HTML to avoid duplicate anchors, and to work with
+ splitting enabled.
+
+2004-02-20 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): create HTML hyperlinks with
+ add_word instead of using @ref to avoid problems with commas in
+ captions.
+
+2004-02-20 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (cm_node): remove whitespace before the node
+ separator sequence.
+
+2004-02-20 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (handle_enum_increment): do not increment
+ counters for ENUM_SECT_NO heading commands (ie. @unnumbered,
+ @majorheading, etc.)
+
+2004-02-20 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.c (multitable_item): unset hsep if item command is
+ not @headitem.
+
+2004-02-19 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: More hyphenation exceptions.
+ (\author, \quotation): implement @author inside
+ @quotation, for attribution purposes.
+
+2004-02-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_exampleindent): fixed paragraph handling after
+ @exampleindent lines.
+
+2004-02-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (index_add_arg): create an anchor where @index is
+ used in HTML documents.
+ (cm_printindex): make index text an hyperlink to the created anchor.
+
+2004-02-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): skip empty lines following
+ @table, @ftable, @vtable and @itemize lines.
+
+2004-02-18 Karl Berry <karl@gnu.org>
+
+ * lib/substring.c,
+ * lib/xexit.c,
+ * lib/xmalloc.c,
+ * lib/system.h: ANSI-fy. (Other lib files come from gnulib.)
+
+ * doc/texinfo.txi (Definition Commands): describe the argument/@var
+ situation more accurately.
+
+ * doc/texinfo.txi (Definition Commands): explicitly document the
+ implicit index entry creation in all cases.
+
+ * doc/texinfo.txi (Printing Indices & Menus, Indices, Predefined
+ Indices): remove redundancies, make different
+ purposes clear, etc.
+
+2004-02-18 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.h:
+ * makeinfo/xml.c (xml_get_assoc_for_id, xml_associate_title_with_id):
+ removed these functions.
+
+ * makeinfo/xref.c (cm_xref): do not call xml_get_assoc_for_id.
+
+ * makeinfo/sectioning.c (sectioning_underscore): added xreflabel
+ attribute to @unnumbered for Docbook.
+
+2004-02-18 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xref.c (cm_xref): for Docbook, use lowercase ``see'' when
+ printing index.
+
+2004-02-18 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_indexentry): removed ``see'' from index
+ entries as cm_xref takes care of it.
+
+2004-02-17 Karl Berry <karl@gnu.org>
+
+ * doc/info.texi (Help-Int): mention the new line number feature.
+ * doc/texinfo.txi (Indices): plural correction.
+ * doc/info-stnd.texi (Invoking Info): matche typo.
+ (Searching Commands): grammar.
+ * info/session.c (info_menu_or_ref_item): need to subtract 1 from
+ the actual line number to get to the right place,
+ don't really know why.
+
+ * makeinfo/makeinfo.c, info/info.c, util/texindex.c,
+ utils/install-info.c, util/texi2dvi: update copyright year to
+ 2004, and do not mark copyright line for translation, since
+ international law says to always use the English word "copyright".
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): use add_html_block_elt instead
+ of add_word for </pre> ending @example and the like.
+ * makeinfo/float.c (cm_listoffloats): use add_html_block_elt for <li>.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): do not expand @copying for
+ HTML and Info too.
+ (cm_insert_copying): expand copying_text for all formats here.
+
+ * makeinfo/html.c (html_output_head): use text_expansion for copying
+ text.
+
+2004-02-17 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (float): mention @multitable and @image
+ as typical contents. From Arnold.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_element_with_attribute): removed check
+ to see if current element contains para before calling xml_start_para,
+ as that check is performed in xml_start_para too.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): indent float caption.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): for XML and Docbook, do not
+ expand @copying text. Instead of calling @anchor, use <float
+ name="floatlabel"> for XML.
+ (cm_copying): removed ugly copying_text manipulation for Docbook.
+ Warn if there is no @copying before @insertcopying.
+
+ * makeinfo/xml.c: made floats contain para.
+ (xml_start_para): check if current element can contain para.
+ (xml_add_char): removed @copying checks.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): if the output format is XML,
+ do not call close_insertion_paragraph after @end menu.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_insert_element_with_attribute): indentation
+ fixes for @multitable.
+
+2004-02-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.c (do_multitable): remove trailing newline when the
+ output format is Docbook or XML, as output_paragraph becomes unusable
+ later for xml_indent during select_output_environment.
+
+2004-02-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_bye): do not call flush_output as text appended
+ by convert_from_loaded_file may need to play with output_paragraph.
+
+2004-02-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_end_document): insert newline after </texinfo>
+ only if indentation is disabled (otherwise xml_indent takes care of
+ the newline.)
+ (xml_insert_indexentry): disable warnings when executing implicit
+ @xref commands for Docbook, otherwise makeinfo will warn about
+ missing punctuation.
+
+2004-02-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): eat one newline after
+ @xml/@docbook blocks for proper indentation.
+
+2004-02-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_center): fixed line wrapping after the @center
+ command.
+
+2004-02-15 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_begin_document): disabled warnings around the
+ implicit register_delayed_write("@documentencoding") call.
+
+2004-02-15 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion): when handling
+ @xml, @html and @docbook blocks, do not touch para elements, and keep
+ whitespace as-is.
+
+2004-02-15 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.h: made xml_keep_space extern.
+
+2004-02-15 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_noindent_cmd, cm_indent): implicitly start
+ para element for Docbook and XML.
+
+2004-02-15 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\hyphenation): add more hyphenation exceptions,
+ gleaned from the log in TUGboat.
+ * doc/info-stnd.texi: document new option --where.
+ * info/info.c (main): in print_where_p case, ensure we don't try
+ to print NULL.
+
+2004-02-14 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\addtokens): had two identical definitions,
+ remove one.
+ (\maketoks): no space token after |ENDTOKS|,
+ although I guess it hasn't mattered.
+ (\entry): make clear what is the argument to
+ \pdfgettoks and what is output.
+ (\appendtomacro): use our own token registers,
+ for safety.
+ (\listoffloatsdoentry): fully expand the page
+ number, and don't expand the lof text.
+
+2004-02-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_strong):
+ * makeinfo/xml.c (xml_begin_index): cast output_paragraph to char, to
+ avoid warnings with -pedantic.
+
+2004-02-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c:
+ * makeinfo/cmds.h:
+ * makeinfo/defun.c:
+ * makeinfo/defun.h:
+ * makeinfo/files.c:
+ * makeinfo/files.h:
+ * makeinfo/float.c:
+ * makeinfo/float.h:
+ * makeinfo/footnote.c:
+ * makeinfo/footnote.h:
+ * makeinfo/html.c:
+ * makeinfo/html.h:
+ * makeinfo/index.c:
+ * makeinfo/index.h:
+ * makeinfo/insertion.c:
+ * makeinfo/insertion.h:
+ * makeinfo/lang.c:
+ * makeinfo/lang.h:
+ * makeinfo/macro.c:
+ * makeinfo/macro.h:
+ * makeinfo/makeinfo.c:
+ * makeinfo/makeinfo.h:
+ * makeinfo/multi.c:
+ * makeinfo/node.c:
+ * makeinfo/node.h:
+ * makeinfo/sectioning.c:
+ * makeinfo/sectioning.h:
+ * makeinfo/toc.c:
+ * makeinfo/toc.h:
+ * makeinfo/xml.c:
+ * makeinfo/xml.h:
+ * makeinfo/xref.c:
+ * makeinfo/xref.h: protoized functions.
+
+2004-02-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.h: new file.
+
+2004-02-13 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\caption): make \long.
+ * doc/texinfo.txi (Nodes): mention that changing node names is bad.
+ (caption shortcaption, listoffloats): write these, finishing the
+ first cut at @float documentation.
+
+2004-02-12 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_verb): end @verb only if delimiter is followed
+ by a closing brace.
+
+2004-02-12 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/lang.c (cm_accent_generic): warn if accented character is
+ whitespace.
+
+2004-02-12 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertionc. (end_insertion): decrement current_indent
+ only if the output format is Info.
+
+2004-02-12 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): adjusted caption styles for
+ label and type conditions.
+ (begin_insertion, end_insertion): indent first paragraphs inside
+ @float, even if first paragraph in a chapter. Increment/decrement
+ current_indent.
+
+2004-02-12 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/tests/defxcond: look for `--' instead of `-'.
+
+2004-02-12 Karl Berry <karl@gnu.org>
+
+ * makeinfo/float.c (cm_listoffloats): change warning wording.
+
+2004-02-11 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\dofloat): initialize caption macros here, not
+ globally.
+ (\Efloat): rewrite for more consistent caption
+ line, matching documentation.
+ (\appendtomacro): new macro.
+ (\currentparindent): this \newdimen was not used; removed.
+ * doc/texinfo.txi (float): continue documenting.
+
+ * makeinfo/files.c (register_delayed_write): change wording of msgs.
+
+2004-02-10 Karl Berry <karl@gnu.org>
+
+ * makeinfo/defun.c: --- (which gets reduced to --)
+ instead of -- (which gets reduced to -).
+ Report from Akim Demaille <akim@epita.fr>, 09 Feb 2004 18:06:29 +0100.
+
+2004-02-09 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\pickupwholefraction): allow the fraction to be
+ an integer without a decimal point, like `1'. Report from: Dumas
+ Patrice <dumas@centre-cired.fr>, 9 Feb 2004 16:46:30 +0100.
+ * makeinfo/multi.c (setup_multitable_parameters): compute width
+ and pass it, for clarity.
+
+2004-02-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_insert_copying): insert double newlines
+ instead of one in non XML outputs.
+
+2004-02-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_code): do not decrement in_fixed_width_font as
+ it gets decremented elsewhere.
+
+2004-02-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (next_nonwhitespace_character): also check
+ global input_text since filestack does not contain it.
+
+2004-02-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (next_nonwhitespace_character): go through the
+ whole filestack looking for the next character.
+
+2004-02-06 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\indexnofonts): define \bullet .. \result, so
+ they can be used in @?index commands.
+ Report from: Akim Demaille <akim@epita.fr>, 06 Feb 2004 13:34:15 +0100.
+
+2004-02-05 Karl Berry <karl@gnu.org>
+
+ * makeinfo/xref.c (add_xref_punctuation): if we insert anything,
+ make it a period.
+ (cm_xref): include command name in error message.
+ * doc/texinfo.txi (ref): mention generating a period, if needed.
+ Too many complaints when we made a warning for @ref not followed
+ by period or comma.
+
+2004-02-05 Alper Ersoy <dirt@gtk.org>
+
+ * info/info-utils.c (info_parse_node): look for ``(line '' instead of
+ skipping any non-digit characters.
+
+2004-02-05 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (insert_index_output_line_no): made ``(line NNN)'' not
+ translatable for Info output.
+
+2004-02-03 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (flush_output): increment node_line_number too.
+
+ * makeinfo/makeinfo.h: new variable node_line_number to hold the last
+ output line number the current node.
+
+ * makeinfo/nodes.c (cm_node): reset node_line_number just before the
+ node start cookie.
+
+ * makeinfo/files.h: new node member in DELAYED_WRITE struct.
+ * makeinfo/files.c (register_delayed_write): save current node name if
+ there's one.
+ (handle_delayed_writes): adjust line numbers in indices only if the
+ output is plaintext, or the index entry appears in the changed node.
+
+ * makeinfo/index.c (index_add_arg, cm_printindex): use
+ node_line_number instead of output_line_number if the output is an
+ Info file.
+
+2004-02-03 Alper Ersoy <dirt@gtk.org>
+
+ * info/info-utils.h: new line_number member in REFERENCE struct.
+
+ * info/info-utils.c (info_parse_node): parse (line ...) strings
+ from menu items.
+ (info_references_internal): save parsed line number in the entry.
+
+ * info/session.c (info_menu_of_ref_item): if selected entry has a line
+ number associated with it, jump to that line after updating window.
+
+2004-02-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (add_xref_punctuation): new function that inserts
+ necessary punctuation after @ref and @pxref commands.
+ (cm_xref): call add_xref_punctuation when multiple parameters are
+ given, make use of next_nonwhitespace_character function in the END
+ case.
+ (cm_ref): do not call cm_xref in the END case.
+
+2004-02-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (next_nonwhitespace_character): new function.
+
+2004-02-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_code): call xml_start_para instead of tweaking
+ in_fixed_width_font, and use entities rather than quotes.
+
+2004-02-02 Arnold D. Robbins <arnold@skeeve.com>
+
+ * makeinfo/cmds.c (cm_TeX, cm_LaTeX): Add docbook support.
+ (cm_code): Add opening and closing single quotes for @samp in the
+ Docbook output.
+ * makeinfo/xml.c (xml_begin_document): Add `tex' and `latex' entities.
+ * makeinfo/xref.c (cm_xref): Add `See' and `see' strings for docbook
+ and xml.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): fixed ``--option: makeinfo'' messages.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_TeX, cm_LaTeX): really ignore the arguments as
+ the warning suggests.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_TeX, cm_LaTeX): warn if there are any arguments.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/files.c (pop_path_from_include_path): do not mock with
+ include_files_path address directly, as it confuses realloc.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main, usage): new --output-indent option.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_add_char): break long lines in paragraphs
+ when the output format is Docbook.
+
+2004-01-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/files.c (prepend_to_include_path, append_to_include_path)
+ (pop_path_from_include_path): new functions to manipulate
+ include_files_path.
+
+ * makeinfo/makeinfo.c (convert_from_file): prepend the loaded file's
+ path to include_files_path in order to make relative include files to
+ be found, then remove afterwards.
+ (main): make use of new functions for -I and -P options.
+
+2004-01-30 Alper Ersoy <dirt@gtk.org>
+
+ * util/texinfo.dtd: added exdent element.
+
+2004-01-29 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): call
+ xml_begin_document after opening the output stream for writing.
+
+ * makeinfo/files.c (register_delayed_write): use delayed_command
+ instead of command in messages as it may differ from the actual
+ command name. Check the usability of current_output_filename.
+
+2004-01-28 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (HTML Splitting): describe when two nodes are
+ written to one output file.
+
+ * doc/texinfo.tex (\TeX): \edef using original \TeX definition.
+
+2004-01-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/defun.c (process_defun_args, defun_internal):
+ * makeinfo/insertion.c (begin_insertion, end_insertion): execute XML
+ only blocks for Docbook also.
+
+ * makeinfo/xml.c: added Docbook elements for definition commands.
+ (xml_begin_def_term): for Docbook, generate an Info-like @defun line.
+ (xml_insert_element_with_attribute): do not indent DEFINITION and
+ DEFINITIONTERM when the output is Docbook.
+
+2004-01-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c: changed majorheading and the like with bridgehead
+ for Docbook.
+
+ * makeinfo/sectioning.c (sectioning_underscore): do not start sections
+ with @majorheading and the like, only insert title.
+
+2004-01-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new element EXDENT.
+
+ * makeinfo/cmds.c (cm_comment): save the paragraph state.
+ (cm_exdent): use EXDENT element for XML, LINEANNOTATION for Docbook.
+
+ * makeinfo/html.c (html_output_head):
+ * makeinfo/xml.c (xml_begin_document): erase output_paragraph.
+
+ * makeinfo/insertion.c (begin_insertion): canonize whitespace around
+ copying text.
+ (cm_insert_copying): comment fixes. Do not append newline if the
+ output is Docbook.
+
+ * makeinfo/makeinfo.c (close_paragraph): return if Docbook too.
+
+ * makeinfo/sectioning.c (sectioning_underscore): removed newline from
+ the end of titles.
+
+ * makeinfo/lang.c (cm_documentencoding): insert encoding attribute
+ into XML and Docbook prologs when handling delayed writes.
+
+ * makeinfo/xml.c (xml_begin_document): register a delayed write for
+ @documentencoding when writing the prolog.
+ (xml_end_para): removed docbook checks.
+ (xml_insert_element_with_attribute): skip indentation if
+ xml_keep_space is true, indent after table element. When the output
+ is Docbook, do not insert xml:space attribute, and do not remove from
+ the end of group element and keep_space blocks.
+ (xml_add_char): join lines in a paragraph for Docbook too.
+
+2004-01-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.c (out_char): simple use add_char for XML and Docbook
+ outputs too.
+
+ * makeinfo/makeinfo.c (close_paragraph): just return when the output
+ format is XML.
+
+ * makeinfo/makeinfo.h: new variable xml_indendation_increment.
+
+ * makeinfo/cmds.c (cm_comment): insert a newline before the comment,
+ if there is not already one.
+ (cm_noindent_cmd): skip whitespace after the command.
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new element DETAILMENU.
+
+ * makeinfo/xml.c: menuentry and menucomment should not contain para.
+ (xml_indent, xml_indent_end_para): use xml_indentation_increment
+ value, and indent only if it is a positive number.
+ (xml_start_para): apply indentation for XML output too.
+ (xml_end_para): add newline if xml_indentation_increment is positive.
+ (xml_insert_element_with_attribute): major indentation fixes.
+ (xml_start_menu_entry): skip whitespace at the start of menu comments.
+ (xml_add_char): fixed paragraph detection in menus, and added a check
+ to detect multiple whitespaces after newline in menu comments. Do not
+ return when inside multitable to avoid concatenation of two lines
+ without a space char in between.
+
+ * makeinfo/insertion.c (cm_insert_copying, cm_lisp, cm_smalllisp)
+ (cm_format, cm_smallformat, cm_display, cm_smalldisplay, cm_example)
+ (cm_smallexample): do not insert newline when the output is XML.
+ (end_insertion): ditto for the above mentioned block commands and
+ @group. Do not increment in_fixed_font for XML output.
+ (begin_insertion, end_insertion): enclose @detailmenu in a detailmenu
+ element.
+
+ * util/texinfo.dtd: added detailmenu, and fixed menucomment and
+ tableitem definitions.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * util/Makefile.am: substituted catalog in EXTRA_DIST with catalog.in,
+ and added catalog to CLEANFILES.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/files.h: new input_filename member in delayed_write struct.
+
+ * makeinfo/files.c (register_delayed_write): added input_filename to
+ saved variables, and adjusted line_number saving.
+ (handle_delayed_writes): set input_filename and line_number for
+ correct warning and error messages.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats):
+ * makeinfo/index.c (cm_printindex): decrement line_number only if
+ not handling delayed writes.
+
+ * makeinfo/float.c (float_type_exists): check if float has a label.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): updated copyright year in --version text.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/tests/Makefile.am: commented top2.texi to fix distcheck.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_begin_document): use PUBLIC id for TexinfoML
+ instead of SYSTEM.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/Makefile.am: removed texinfo.dtd and texinfo.xsl and ...
+
+ * util/Makefile.am: added here.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * utils/catalog.in: catalog file for texinfo.dtd.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/texinfo.dtd:
+ * makeinfo/texinfo.xsl: moved to ...
+
+ * utils/texinfo.dtd:
+ * utils/texinfo.xsl: here.
+
+2004-01-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/texinfo.dtd: added ordm and ordf entities and dmn element.
+ updated indexterm location in tables.
+
+2004-01-22 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\dofloat): handle empty float type and empty
+ float label separately, matching makeinfo behavior.
+ * doc/texinfo.txi (Floats): new section, not yet fully written.
+ (Special Displays): new chapter to hold it.
+ (Footnotes, Images): move these sections to the new chapter.
+ (@@-Command Summary): list new commands.
+ * NEWS: mention new commands here too.
+
+2004-01-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_begin_index): move data to a temporary location
+ for delayed use and insert back when handling delayed writes.
+
+ * makeinfo/index.c (cm_printindex): call xml_begin_index when not
+ handling delayed writes too.
+
+2004-01-19 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: doc fix.
+
+2004-01-18 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\commondummies): dummify @tie and remaining
+ @<char> commands.
+ (\tocindent): reduce to 15pt to match \defaultparindent.
+ (\setref): use XR as control sequence prefix
+ instead of just X; seems nicer. Change calls.
+
+ Finish implementing @listoffloats:
+ (\xrdef): keep lists of each float type.
+ (\dofloat): save the floattype in the aux file.
+ (\Efloat): write the lof text to the aux file.
+ (\iffloat, \doiffloat, \listoffloats,
+ \listoffloatsdo, \listoffloatsentry): new macros.
+ * bootstrap: autoheader should come after aclocal, I think.
+
+2004-01-17 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\doitemize): rename from \itemizey.
+ (\itemizeitem): do not set \parskip=0 if the last
+ thing was a \nobreak (e.g., from \sectionheading).
+ Report from: Jesper Harder <harder@ifa.au.dk>,
+ 17 Jan 2004 22:03:51 +0100.
+
+ * doc/texinfo.txi (email): no angle brackets in TeX output.
+ Report from: Jesper Harder <harder@ifa.au.dk>,
+ 17 Jan 2004 21:03:21 +0100.
+
+2004-01-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): Prefixed captions with
+ float_type. For HTML, used an <ul> block.
+
+2004-01-17 Alper Ersoy <dirt@gtk.org>
+
+ * info/info.c (main, info_short_help): new option -w, --where,
+ --location that prints the physical location of Info file.
+
+2004-01-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/defun.c (defun_internal):
+ * makeinfo/insertion.c (end_insertion): enclose paragraphs in @def
+ blocks in a blockquote element for indentation in the HTML output.
+
+2004-01-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (insert_html_tag_with_attribute): new function.
+ (insert_html_tag): only call insert_html_tag_with_attribute with
+ NULL attribute string and return.
+ (push_tag, pop_tag): keep the element attributes in stack too.
+ (html_output_head): fixed span.roman in the default CSS.
+
+ * makeinfo/html.h: new attribs member in hstack struct.
+
+ * makeinfo/cmds.c (cm_dmn, cm_code, cm_sc, cm_r): use
+ insert_html_tag_with_attribute for setting element class.
+
+2004-01-15 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\readauxfile): \ must have catcode other to
+ handle \ in node/section names.
+
+2004-01-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/toc.c (cm_contents): fixed Docbook element stack underflow.
+
+ * makeinfo/xml.c (xml_insert_indexterm): set xml_dont_touch_items_defs
+ for only XML output.
+
+2004-01-14 Simon Josefsson <jas@extundo.com>
+
+ * util/gendocs.sh: new option --html.
+
+2004-01-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (rollback_empty_tag): rewrote to also identify empty
+ elements with attributes.
+ (insert_html_tag): increment and decrement in_html_elt.
+
+ * makeinfo/index.c (index_add_arg): do not call flush_output for xml
+ and html outputs as they do not need an accurate output line number
+ tracking, and flush_output makes rollback_empty tag useless.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_code): increment and decrement in_html_elt when
+ inserting the class attribute to avoid space char being replaced with
+ entities.
+ (cm_r, cm_dmn): use insert_string instead of add_word for the class
+ attribute.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_r): changed add_word_args with insert_html_tag,
+ and changed inline style with a class attribute.
+
+ * makeinfo/html.c (insert_html_tag): when the current element is the
+ same with the last in the stack, do not return if it's span.
+ (html_output_head): new CSS class roman (for @r.)
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (cm_node): reset output_position when closing the
+ current HTML output file.
+
+ * makeinfo/files.c (handle_delayed_writes): fixed position updating of
+ the next writes.
+
+2004-01-13 Karl Berry <karl@gnu.org>
+
+ * makeinfo/files.c (register_delayed_write): reword warning, and
+ only warn if writing to stdout, not /dev/null.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (glean_node_from_menu): removed unnecessary
+ line_number incrementation.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats):
+ * makeinfo/index.c (cm_printindex): decrement line_number just after
+ get_rest_of_line to make messages refer to the correct line,
+ re-increment it just before returning.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (cm_node): fixed prev, next, up nodes defaulting
+ code to not make use of @menus after @bye.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (cm_printindex): handle @printindex immediately
+ if the output format is Docbook, rather than waiting for delayed
+ writes.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): insert xml elements also for
+ docbook.
+
+2004-01-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (float_type_exists): new function that checks if a
+ specific type of @float is previously used.
+ (cm_listoffloats): warn if requested float_type is unknown.
+
+2004-01-12 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/files.c (register_delayed_write): warn if delayed write is
+ requested when the output file is not seekable.
+
+2004-01-10 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Using Include Files): mention the possibility
+ of no nodes in an include file. From Bob.
+
+2004-01-10 Simon Josefsson <jas@extundo.com>
+
+ * makeinfo/node.c (cm_node): Only print ",\n" at correct places.
+
+2004-01-10 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (html_output_head): use insert_string instead of
+ add_word for css inclusion to avoid reformatting.
+
+2004-01-09 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new variable xml_dont_touch_items_defs.
+
+ * makeinfo/cmds.c (cm_comment, cm_sp):
+ * makeinfo/xml.c (xml_insert_indexterm): set and unset
+ xml_dont_touch_items_defs.
+
+ * makeinfo/xml.c (xml_insert_element_with_attribute)
+ (xml_add_char): do not do anything about @deffnx and @itemx commands
+ if xml_dont_touch_items_defs is non-zero.
+
+2004-01-09 Alper Ersoy <dirt@gtk.org>
+
+ * info/Makefile.am: define INFODIR2 that points to $datadir/info.
+
+ * info/info.c (main): prepend INFODIR2 to infopath, if defined and if
+ not the same with INFODIR.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (cm_printindex): adapted to delayed writing,
+ decreased the space between the columns of plaintext output.
+
+ * makeinfo/float.c (cm_listoffloats): disabled menu header checks,
+ synced column_width with @printindex.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c: moved INDEX_ELT and INDEX_ALIST typedefs to ...
+
+ * makeinfo/index.h: here
+
+ * makeinfo/files.h:
+ * makeinfo/files.c (register_delayed_write): save line number in input
+ document that the calling command is in.
+ (handle_delayed_writes): adjust byte offsets in tag table and output
+ line numbers in all of the indices,
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): when finished, write
+ the tag table after handling delayed writes.
+
+ * makeinfo/node.c (write_tag_table): accept a filename argument, and
+ open the file in append mode.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (add_new_float):
+ * makeinfo/float.h: save the line number @float command used.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/toc.c (cm_contents): moved the call to html_output_head
+ to ...
+
+ * makeinfo/files.c (register_delayed_write): here.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): adapted for delayed writing,
+ and slightly fixed formatting with no_headers.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c: use cm_contents for @shortcontents
+ and @summarycontents too.
+
+ * makeinfo/files.c (register_delayed_write)
+ (handle_delayed_writes): new functions.
+
+ * makeinfo/files.h: new delayed_write struct and
+ handling_delayed_writes variable.
+
+ * makeinfo/makeinfo.c (insert): use whitespace macro instead of
+ testing characters manually.
+ (convert_from_loaded_file): call handle_delayed_writes when finished.
+
+ * makeinfo/toc.c (contents_update_html, contents_update_info)
+ (shortcontents_update_html, shortcontents_update_info): changed file
+ read/writes with insert and insert_string.
+ (rewrite_top, contents_update, shortcontents_update)
+ (toc_update, cm_shortcontents): removed functions.
+ (cm_contents): for HTML and Info, only call register_delayed_write if
+ handling_delayed_writes is not true. Call contents_update_html and
+ other variants according to output format and command name.
+
+ * makeinfo/toc.h: removed obsolete variables and functions.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (index_add_arg): keep line number of the index
+ entry where it appears in the output.
+ (insert_index_output_line_no): new function.
+ (cm_printindex): call insert_index_output_line_no for info and
+ plaintext outputs.
+
+2004-01-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.h: new variable output_line_number.
+
+ * makeinfo/makeinfo.c (flush_output): keep number of lines in the
+ flushed data, in output_line_number variable.
+
+2004-01-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): when there is no caption, do not
+ insert space between the float number and the colon.
+
+2004-01-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): use shorttitle only if it's
+ defined.
+
+2004-01-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c: new command @shortcaption.
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new element SHORTCAPTION.
+
+ * makeinfo/insertion.c (cm_caption): insert CAPTION or SHORTCAPTION
+ according to command.
+ (begin_insertion): read @shortcaption too. Fixed XML floatpos
+ contents.
+
+ * makeinfo/float.h: added shorttitle and position to the float_elt
+ struct.
+
+ * makeinfo/float.c (add_new_float): accept a shorttitle argument.
+ (current_float_shorttitle, current_float_position): new functions.
+ (cm_listoffloats): if title is too long to fit into a line, try
+ shorttitle.
+
+2004-01-07 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.h: new variable node_has_listoffloats.
+
+ * makeinfo/float.c (cm_listoffloats): insert menu header string only
+ if node_has_listoffloats is not true.
+
+ * makeinfo/node.c (cm_node): reset node_has_listoffloats.
+
+2004-01-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): fixed a thinko in @float
+ arguments parsing code, regarding string termination; changed manual
+ input text skipping with skip_whitespace_and_newlines for proper
+ line_number handling; and changed magic number 10 with sizeof for
+ improved readability.
+
+ * makeinfo/float.c (cm_listoffloats): end paragraph before the menu
+ header. Use add_html_block_elt to insert <div> element.
+
+2004-01-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/crossrefs.c:
+ * makeinfo/crossrefs.h: moved to ...
+
+ * makeinfo/xref.c:
+ * makeinfo/xref.h: new files.
+
+ * makeinfo/Makefile.am:
+ * makeinfo/cmds.c:
+ * makeinfo/footnote.c:
+ * makeinfo/html.c:
+ * makeinfo/makeinfo.c:
+ * makeinfo/node.c:
+ * makeinfo/node.h:
+ * makeinfo/sectioning.c:
+ * makeinfo/toc.c: adjusted for new names.
+
+2004-01-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c:
+ * makeinfo/makeinfo.h: moved cross referencing commands to ...
+
+ * makeinfo/crossrefs.c:
+ * makeinfo/crossrefs.h: new files.
+
+ * makeinfo/cmds.c:
+ * makeinfo/footnote.c:
+ * makeinfo/html.c:
+ * makeinfo/makeinfo.c:
+ * makeinfo/node.c:
+ * makeinfo/sectioning.c:
+ * makeinfo/toc.c: added crossrefs.h to includes.
+
+ * makeinfo/Makefile.am: added new files crossrefs.c and crossrefs.h
+
+2004-01-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (cm_node): removed ``Node: <nodename>'' from the
+ node headers.
+
+2004-01-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): keep line_number the same
+ before and after get_until, so messages issued inside full_expansion
+ have correct line numbers.
+
+2004-01-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (handle_menu_entry):
+ * makeinfo/node.c (glean_node_from_menu): adjust line_number.
+
+2004-01-05 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\rawbackslashxx): rename to \backslashcurfont,
+ to keep reducing the number of `xx's here.
+
+ * doc/texinfo.tex (\setref): call \atdummies, not \indexnofonts; we
+ need to keep the user's commands.
+ (\dofloat): call \indexnofonts and \turnoffactive
+ to support commands and special characters in the
+ float type name.
+
+ * doc/texinfo.txi (firstparindent): shorten name so it doesn't
+ break in the toc.
+
+2004-01-05 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (html_output_head): new CSS entry span.sc for
+ small-caps font variant.
+
+ * makeinfo/cmds.c (cm_sc): use span with class attribute sc, instead
+ of small.
+
+2004-01-04 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\commondummies, \indexnofonts): Merge the
+ common part of these two to ...
+ (\commondummiesnofonts): ... a new macro.
+ (\indexdummylatex, \indexdummytex, \indexdummydots): Nuke,
+ the time saved is not worth the hassle.
+
+2004-01-04 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\makedispenv): Determine the size of the fonts
+ according to the value of SETdispenvsize, using ...
+ (\setnormaldispenv, \setsmalldispenv, \SETdispenvsize, \smallword):
+ (\nosmallword): ... these new macros.
+ (\flushleft): No longer defined via \makedispenv.
+
+2004-01-03 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\TeX): new macro, copying plain but make a
+ period following end a sentence. Idea from LaTeX.
+
+2004-01-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/node.c (clean_old_split_files): new function.
+ (split_file): moved filename generation code to a ...
+ (enumerate_filename): new function.
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): call
+ clean_old_split_files before calling split_file.
+
+2004-01-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (create_html_directory): new function.
+ (insert_toplevel_subdirectory): moved common if blocks to
+ create_html_directory. Adjusted checks to reuse existing
+ directories, and remove existing <output>.html files, when
+ falling back to suffices.
+
+2004-01-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_code): for HTML, use span for @command, @env,
+ @file, @option and @samp, and insert command name as class attribute.
+
+2003-12-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (add_char, handle_menu_entry): end <ul> block
+ before inserting <p>, and restart afterwards.
+
+2003-12-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (handle_menu_entry): for HTML, append colon only
+ if there is a description following the menu item.
+
+2003-12-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (usage): removed short forms of output options.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * cmds.c (cm_comment): do not output comments before HTML header is
+ written.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): new option --plaintext.
+ (usage): added short forms of --html, --xml, --docbook and --plaintext
+ to the help text.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.c (multitable_item): removed thead and tbody from
+ HTML tables. Added hsep after @headitem for Info.
+ (multitable_item, multitable_tab): for HTML, use th instead of td for
+ @headitem rows.
+
+ * makeinfo/xml.c (xml_begin_multitable): moved Docbook TGROUP code to
+ a ...
+ (xml_begin_multitable_group): new function.
+ (xml_end_multitable_row): restart TGROUP on @headitem.
+ (xml_end_multitable): warn if @headitem is the last item in
+ multitable, and output format is Docbook. Joined common code between
+ XML and Docbook.
+
+2003-12-30 Arnold D. Robbins <arnold@skeeve.com>
+
+ * makeinfo/cmds.c (cm_strong): Use <emphasis role="bold"> for docbook.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): substituted fixed numbers with
+ the sizeof operator where possible, and commented code where not, to
+ improve code readability.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): do not escape backslash and double
+ quote characters in plaintext output.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): do not write magic cookie when
+ output format is plaintext.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (add_char): added forgotten html check to
+ in_html_block_level_elt if block.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: added new element alttext (IMAGEALTTEXT),
+ as a child of image.
+
+ * makeinfo/makeinfo.c (cm_image): moved alttext attribute to the new
+ alttext child in XML output, to keep markup intact. Moved filename
+ CDATA to name attribute.
+
+ * makeinfo/texinfo.dtd: updated image element.
+
+2003-12-30 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): use HTML entities in alt attribute.
+
+2003-12-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_item): do not call close_single_paragraph
+ and use rollback_empty_tag for empty <dd> removal.
+
+2003-12-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (rollback_empty_tag): new function.
+ (insert_html_tag): try rollback_empty_tag before closing both
+ tag and old_tag.
+
+2003-12-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_sp): for HTML use <pre>.
+
+ * makeinfo/defun.c (defun_internal): do not close paragraph when
+ outputting HTML to avoid empty <p> elements.
+ (process_defun_args): joined duplicate if/else blocks.
+
+ * makeinfo/html.c (insert_html_tag): removed redundant paragraph
+ starting code.
+
+ * makeinfo/insertion.c (begin_insertion): keep state of the first <dt>
+ child of a <dl> in the new html_deflist_has_term variable for ...
+ (cm_item): cleaner <br> insertion checks. Fixed non-functional empty
+ <dd> rollback code.
+
+ * makeinfo/makeinfo.c (add_html_block_elt, add_html_block_elt_args):
+ new functions for inserting block level elements that must not be
+ preceded by a <p> element.
+ (add_char): insert <p> only if in_html_block_level_elt is not true.
+
+ * makeinfo/cmds.c (cm_comment, cm_center):
+ * makeinfo/footnote.c (output_pending_notes):
+ * makeinfo/html.c (html_output_head):
+ * makeinfo/index.c (cm_printindex):
+ * makeinfo/insertion.c (enum_html, begin_insertion, end_insertion)
+ (handle_verbatim_environment, cm_item):
+ * makeinfo/makeinfo.c (handle_menu_entry):
+ * makeinfo/multi.c (do_multitable):
+ * makeinfo/node.c (cm_node):
+ * makeinfo/sectioning.c (sectioning_html): use add_html_block_elt and
+ add_html_block_elt_args instead of add_word and add_word_args
+ respectively, when inserting <ul>, <div>, <h?> and the like.
+
+2003-12-25 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Def Cmd Continuation Lines): new node.
+ * NEWS: mention this new feature.
+
+2003-12-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): inhibit paragraph indentation
+ for more cases after example, display and the like environments.
+
+ * makeinfo/xml.c (xml_start_para, xml_end_para): made <para> and
+ </para> indentation more newline-aware.
+
+2003-12-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion, cm_example, cm_smallexample)
+ (cm_lisp, cm_smalllisp, cm_format, cm_smallformat, cm_display)
+ (cm_smalldisplay): unified whitespaces inside these elements
+ in XML and Docbook output (always one newline at the beginning
+ and one at the end).
+
+2003-12-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/lang.c (cm_accent_generic_no_headers): do not issue
+ warnings when substituting non-ASCII accents with punctuation.
+
+2003-12-24 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_xref): rparen is not allowed after all,
+ confirmed by experimentation (thanks to Luc).
+ * doc/texinfo.txi (ref): remove it from doc.
+
+2003-12-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): when finished, do
+ not indent body and html closing tags, and do not use comment tags if
+ there is no trailing information.
+
+2003-12-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_acronym):
+ * makeinfo/cmds.h: save second arguments of acronym in acronyms_stack
+ and reuse them as title attributes of acronym element of HTML output,
+ when there is only one argument given.
+
+2003-12-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): use text_expansion for alt
+ attribute of images.
+
+2003-12-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (sectioning_html): do not insert "%s "
+ unconditionally for title enumerations, which causes unnecessary
+ blanks for @unnumbered and @top.
+
+2003-12-23 Arnold D. Robbins <arnold@skeeve.com>
+
+ * float.h (FLOAT_ELT): New member: `title_used'. Avoids reuse of
+ title inside nested floats.
+ (current_float_used_title, current_float_set_title_used): declared.
+
+ * float.c (add_new_float): Init `new->title_used' to zero.
+ (current_float_used_title, current_float_set_title_used): new
+ functions.
+
+ * xml.c (xml_begin_docbook_float): Make use of new functions to
+ avoid omitting title, tag, id if have already done so inside
+ nested float.
+
+2003-12-22 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_xref): warn if character after @ref does
+ not produce a valid Info ref.
+ (cm_ref): call cm_xref in both START and END cases.
+ * doc/texinfo.txi (ref): make the second example being a "wrong"
+ one explicit (report from Luc), and mention the warning.
+
+2003-12-21 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\comma): new command.
+ * makeinfo/cmds.c (cm_comma): new fn.
+ (command_table): use it for @comma.
+ * doc/texinfo.txi (Atsign Braces Comma): Rename node.
+ (Inserting a Comma): new node.
+ (@@-Command Summary): include it here.
+
+2003-12-20 gettextize <bug-gnu-gettext@gnu.org>
+
+ * configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.13.1.
+
+2003-12-19 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\ordf, \ordm): use \lllsize instead of \lsize.
+ Advice from Steve Peter.
+
+ * doc/texinfo.txi (Printing Indices & Menus): typo, @@index ->
+ @@vindex. From Luc.
+
+2003-12-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_acronym): read and make use of second argument
+ like texinfo.tex does.
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h:
+ * makeinfo/texinfo.dtd: new elements acronymword and acronymdesc.
+
+2003-12-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): insert float element for
+ docbook too.
+
+2003-12-18 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi, doc/info-stnd.texi: fix incorrect cross-manual
+ xrefs. From: Juri Linkov <juri@jurta.org>, 18 Dec 2003 05:01:07 +0200.
+
+2003-12-18 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (insert): rollback unnecessary whitespace before
+ newline characters.
+
+2003-12-17 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\ordf, \ordm): new macros.
+ (\commondummies): include them.
+ (\indexnofonts): here too.
+ * makeinfo/makeinfo.c (command_table): add them.
+ * makeinfo/lang.c (cm_special_char): first cut at handling them.
+ * doc/texinfo.txi (Inserting Accents): document them.
+
+2003-12-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/defun.c (process_defun_args): use execute_string instead
+ of add_word so accent commands are honored.
+
+2003-12-16 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_begin_document): output xml process instruction
+ also in the Docbook prolog.
+
+2003-12-16 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (dots): document enddots spacing.
+
+2003-12-16 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\dots): Use \hfil instead of \hss and only
+ the stretch factor in explicit skips; I don't suppose the dots
+ will overlap.
+ (\enddots): Merged with \dots.
+
+2003-12-16 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_image): quote the src= arg in the Info
+ case, since apparently that's what Jan implemented. Report from:
+ Torsten Bronger <bronger@physik.rwth-aachen.de>, 16 Dec 2003
+ 12:55:30 +0100.
+
+ * util/dir-example: wdiff tools.
+
+2003-12-15 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\dofloat): Move \startsavinginserts before
+ the begin of the vtop; it's still local---within the group
+ open by \float.
+ (\dofloat, \Efloat): Fix indentation.
+
+2003-12-15 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\innerdef, \innernewcount): Nuked.
+ (\getfloatno): New macro, to establish the right float count.
+
+2003-12-15 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\innernewbox): Nuked, the call expanded.
+
+2003-12-14 Karl Berry <karl@gnu.org>
+
+ * makeinfo/tests/*: unset TEXINFO_OUTPUT where necessary.
+
+2003-12-13 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Smallcaps, acronym): Compare and contrast these
+ a bit more fully.
+ * doc/texinfo.tex (\setfontstyle): just \def the string; since we
+ are \edef'd, we can't make ourselves a control sequence.
+ (\selectfonts): new macro.
+ (\doacronym): print acronym in smaller size, and \unsepspaces for
+ if we're called inside @display.
+ (\registeredsymbol): we can use \lllsize here too.
+
+ * configure.ac: gettext 0.13 (many generated files updated).
+
+ * Makefile.am (AUTOMAKE_OPTIONS): 1.8.
+
+ * makeinfo/makeinfo.c: give warning if TEXINFO_OUTPUT value is
+ unrecognized.
+ * doc/texinfo.txi (makeinfo options): document TEXINFO_OUTPUT.
+
+ * doc/texinfo.txi (tex): document @LaTeX.
+
+ * doc/texinfo.tex (\loggingall): reduce \errorcontextlines for
+ sake of infinite loops.
+ (\setfontstyle): \def better than \edef?
+ (\commondummies): LaTeX is a new dummy.
+ (\indexdummies): likewise.
+ (\indexdummylatex): sorted the obvious way.
+
+ * doc/texinfo.tex (\LaTeX): New macro for new command.
+ (\setfontstyle): new macro to remember current font style.
+ (\rm,\it,\sl,\bf,\tt,\sf,\ttsl): call it; all but
+ the last two are new too.
+ (\ssecsc): use correct magnification, we do for everything else.
+ (\reducedrm..\reducedsy): new fonts.
+ (\reducedfonts): new macro.
+ (\textfonts..\smallerfonts): set \lsize and \lllsize macros.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): changed TEXINFO_XML_OUTPUT to
+ TEXINFO_OUTPUT. It now specifies the default output format.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/defun.c (defun_internal): implemented basic line
+ continuation.
+
+2003-12-13 Karl Berry <karl@gnu.org>
+
+ * CVSROOT/loginfo: put filename/version number in mail subject.
+
+ * util/srclist.txt (help2man): remove, we require cvs-builders to
+ have this installed now (or accept `missing's replacement),
+ along with the rest of the dev tools.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/defun.c (defun_internal):
+ * makeinfo/insertion.c (end_insertion): do not use tables for HTML
+ @deffns.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): strip whitespace from @float
+ arguments.
+
+ * makeinfo/sectioning.c: last_section_title and last_section_number
+ now default to empty strings.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_LaTeX): new function for @LaTeX{}.
+
+ * makeinfo/texinfo.dtd: new latex entity.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.h:
+ * makeinfo/xml.c: new element DIMENSION.
+
+ * makeinfo/cmds.c (cm_dmn): new function for @dmn.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): if TEXINFO_XML_OUTPUT envvar is set,
+ default to XML output.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): enabling one output format effectively
+ disables others.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/lang.h:
+ * makeinfo/lang.c (current_document_encoding): new function.
+
+ * makeinfo/xml.c (xml_begin_document): specify encoding in the XML
+ prolog if different from no_encoding.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/texinfo.dtd: moved documentlanguage out of para.
+
+2003-12-13 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (add_new_float): now expects position argument too.
+
+ * makeinfo/insertion.c (begin_insertion): read arguments from @float
+ line, do not look for @anchor.
+ (end_insertion): changed info caption style.
+ (cm_caption): use is_in_insertion_of_type instead of
+ current_insertion_type.
+
+ * makeinfo/xml.h:
+ * makeinfo/xml.c: new element floatpos.
+ (xml_begin_enumerate): check actual supplied value, not first digit.
+ Also special case for GPL's silly `@enumerate 0'. From Aharon Robbins
+ <arnold@skeeve.com> Tue, 9 Dec 2003 12:38:04 +0200.
+
+2003-12-12 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (ifnotdocbook,ifnotxml): define these @-commands.
+ Report from Arnold.
+
+ * doc/texinfo.tex (\setfilename): make the \openout\auxfile be
+ \immediate, again.
+
+2003-12-09 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\envparseargdef): New macro, a combination
+ of \envdef and \parseargdef.
+ (\enumerate, \float): Use it.
+
+2003-12-09 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\float, \Efloat, \caption, \shortcaption):
+ (\listoffloats): Adapt to the new environment definition framework.
+
+2003-12-09 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\setref, \xrefX): Make the ``\indexnofonts''
+ setups in these two consistent.
+
+2003-12-09 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\innernewbox): New macro, non-outer \newbox.
+ (\newsaveinsX): Use it.
+
+2003-12-09 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex: after test for epsf.tex, \closein 1, even if the
+ file wasn't there.
+ (\summarycontents, \tryauxfile): Similarily, \closein 1 even if eof.
+ (\startcontents, \contents, \summarycontents): fix indentation.
+
+2003-12-09 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\pdfmakeoutlines): Fix a typo, need
+ \def\thisubsecnum not \let.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\makedefun): Add `\def\deffnheader' or the like
+ at the end; all calls of this macro changed.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\normaldefunargs): Renamed to ...
+ (\defunargs): ... this; all callers changed.
+ (\ampdefunargs): Nuked, the only call expanded.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\setfilename): Simplify the code for conditional
+ \input of texinfo.cnf.
+ (\contents): Call \pdfmakeoutlines only if .toc exists.
+ (\pdfmakeoutlines): Thus .toc must exist, no need to check again.
+ (\documentlanguage): Simplify, fix indentation.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\center): Separate the horizontal and vetical...
+ (\centerH, \centerV): ... versions; account for \leftskip in \centerV.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\group, \Egroup): Don't call \offinterlineskip;
+ to fix the line spacing after the group, propagate \prevdepth.
+ (Else, @exdent inside @group gets the wrong spacing.)
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\acronym): Check for second parameter, ...
+ (\doacronym): using this new function; remove smallcaps.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\pdfmakeoutlines): Make the counting macros
+ robust, so that they won't break on incorrectly nested sections.
+ (For instance, in the bzip2 manual.)
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\author): If appears inside a @quotation
+ environment, interpret it as an affiliation; otherwise it has to
+ appear directly inside @titlepage.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\argremovec, \argcheckspaces): Add support for
+ continued lines to \parsearg, while ...
+ (\domakedefun, \printdefunline): ... removing it from @defun's ...
+ (\parsedefunline): ... and thus nuking this.
+ (\startdefunx): Replaced by ...
+ (\dodefunx): ... this; it reuses the code of the respective @defun.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\defparsearg): Rename to ...
+ (\parseargdef): ... this; all uses changed.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ New framework for environments in texinfo.tex. It's used like this:
+ \envdef\foo{...}
+ \def\Efoo{...}
+ It's the responsibility of \envdef to insert \begingroup before the
+ actual body; @end closes the group after calling \Efoo.
+ \envdef also defines \thisenv, so the current environment is known;
+ @end checks whether the environment name matches.
+ The \checkenv macro can be used also elsewhere to check whether the
+ current environment is the one expected.
+
+ Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+ are not treated as enviroments; they don't open a group.
+ (The implementation of @end takes care not to call \endgroup in this
+ special case.)
+
+ * doc/texinfo.tex: All environment definitions, true conditionals and
+ @ifset, @ifclear, changed.
+
+ Another issue:
+ @set and @value allowed - and _ in variable names, but @clear, @ifset
+ and @ifclear were not ready to accept such variables.
+
+ * doc/texinfo.tex (@set, @clear, @ifset, @ifclear): Call
+ \makevalueexpandable.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\multitable): Move \everytab={} and the check
+ for saved inserts to \everycr; thus \item is \crcr again.
+ (\Emultitable): Call \setpercentfalse only after the last \crcr.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\readauxfile): Read it, unconditinally;
+ don't open the aux file for writing.
+ (\tryauxfile): A new wrapper around \readauxfile, which checks
+ whether the file exists.
+ (\setfilename): Call \tryauxfile, then open the aux file for writing.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\readauxfile): Don't hide serious problems by
+ setting the catcode of backslash to other.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\setref): Call \indexnofonts to get nicer names
+ of reference identifiers expanded in \edef.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\scanmacro): Add \spaceisspace, in case we are
+ in an environment with active spaces; without this, \eatspaces
+ didn't work.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\scanmacro): Define only one version, using ...
+ (\scantokens): ... which is a primitive of e-TeX; under ordinary
+ TeX, define a replacement.
+
+2003-12-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\spaceisspace): A macro which resets space's
+ catcode to its normal value; use where appropriate.
+
+2003-12-08 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: use etex/pdfetex if available.
+ (findprog): new helper fn.
+ * NEWS (texi2dvi): mention this.
+ * doc/texinfo.txi (Format with texi2dvi): use @TeX{} instead of
+ @code{tex}, since we don't literally run `tex' any more.
+
+ * info/session.c (info_select_reference_this_line): don't crash if
+ we have no window->line_starts, as it is after
+ set-screen-height to less than 5.
+ Report from: Christian Biere <christianbiere@gmx.de>,
+ 8 Dec 2003 19:12:08 +0100.
+
+ * doc/texinfo.tex (\comma): new command.
+
+ * bootstrap: make need for --enable-maintainer-mode more explicit.
+
+ * doc/texinfo.tex (\xrefX): otherify everything before getting the
+ -title \csname, so that _'s (et al.) are allowed.
+
+2003-12-07 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\xrefX): handle float case.
+ (\parsefloat): take additional optional arg for xref label.
+ (\dofloat): call \setref to define the float in
+ the aux file.
+ (\Yfloat): new macro for \setref.
+ (\floatmagic): new macro for \xrefX and \dofloat
+ to communicate.
+
+2003-12-03 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Not Ending a Sentence): mention special
+ entities output for @: in Docbook and XML.
+
+2003-12-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_punct): new function to handle @., @! and @?
+ commands.
+ (cm_comment): crunch multiple dashes to a single dash for XML
+ validity.
+
+ * makeinfo/texinfo.dtd: new entities: period, eosperiod, quest,
+ eosquest, excl, eosexcl.
+
+2003-12-02 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): look for a newline before
+ @anchor and @caption commands in floatenv.
+
+2003-12-2 Arnold Robbins <arnold@skeeve.com>
+
+ * makeinfo/insertion.c (end_insertion): Change tests for docbook
+ and insertion to check current insertion type instead of if deep
+ inside a float insertion.
+ (cm_example, cm_smallexample, cm_lisp, cm_smalllisp, cm_cartouche)
+ (cm_caption): Same.
+
+ * xml.h (FLOATCARTOUCHE): New constant.
+ * xml.c (texinfoxml_element_list, docbook_element_list): Add "sidebar"
+ for FLOATCARTOUCHE. For docbook, map @display, @smalldisplay to
+ "literallayout".
+ (replacement_elements): Add entry for CARTOUCHE -> FLOATCARTOUCHE.
+ (xml_begin_docbook_float): Special case for CARTOUCHE, sidebars don't
+ have labels.
+
+2003-12-01 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\float, \listoffloats): new macros for new
+ @-commands -- skeletal implementation only now.
+
+ From: Aharon Robbins <arnold@skeeve.com>, 1 Dec 2003 17:43:12 +0200:
+ * makeinfo/float.h (current_float_type): declare.
+ * makeinfo/cmds.c (cm_colon): new fn.
+ (command_table): use it for @:.
+
+2003-11-29 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (@turnoffactive): include @unsepspaces, so
+ spaces in anchor names don't expand in the .aux file. From
+ Stepan.
+
+2003-11-28 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Abstract Objects): class names are no longer
+ printed in rm by default.
+ * doc/texinfo.tex (\cite): redefine to always use \sl, never \ttsl.
+ * doc/texinfo.tex (\ttslanted): new macro.
+ (\normaldefunargs): use it for @var; go back to
+ \sl by default.
+
+ * doc/texinfo.txi: document @deftypecv.
+
+2003-11-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_comment): do not perform expansion.
+
+2003-11-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_r): also set font-weight to normal in HTML.
+
+2003-11-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_comment): new function to output comments in
+ HTML, XML and Docbook outputs.
+
+2003-11-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c: new section and section_name properties in
+ index_elt struct.
+
+ * makeinfo/index.c (index_add_arg): save current section number and
+ title for plain text output.
+ (cm_printindex): simplified printing with no_headers output.
+
+2003-11-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.h: new section and section_name properties in
+ float_elt struct.
+
+ * makeinfo/float.c (add_new_float): save current section number and
+ title for plain text output.
+ (cm_listoffloats): list floats with no_headers too, following
+ printindex @example.
+
+2003-11-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.h:
+ * makeinfo/sectioning.c (current_sectioning_number)
+ (current_sectioning_title): new functions.
+
+ * makeinfo/sectioning.c (get_sectioning_number): moved space char at
+ the end of numbers to ...
+ (insert_and_underscore, sectioning_html): here.
+ (get_sectioning_number, insert_and_underscore): keep track of the last
+ number/title to be used by @float, @cindex like commands that need to
+ know in which section they are used.
+
+2003-11-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_math): new function that encloses @math
+ statements in a math element in XML.
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new element math.
+
+2003-11-27 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): made the layout in Info output
+ the same with indices.
+
+2003-11-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c (cm_listoffloats): generate a menu for Info, with
+ automatically shortened captions.
+
+2003-11-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_acronym): use acronym element for HTML.
+ Report from: Torsten Bronger <bronger@physik.rwth-aachen.de>
+ Tue, 25 Nov 2003 10:30:52 +0100.
+
+2003-11-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (cm_appendix): reset numbers only when
+ changing enum_marker.
+
+2003-11-25 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (cm_printindex): made Appendix matching locale
+ aware.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/index.c (cm_printindex): also catch Appendix and A.1 kind
+ of numbers with --no-headers Info output.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_example):
+ * makeinfo/xml.c (xml_insert_docbook_image, xml_begin_multitable):
+ moved common floatenv handling to ...
+ (xml_begin_docbook_float): here.
+
+ * makeinfo/insertion.c (end_insertion, cm_smallexample, cm_lisp)
+ (cm_smalllisp): insert FLOATEXAMPLE for Docbook if inside @float.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (is_in_insertion_of_type): don't return the
+ level, as it is not useful.
+ (begin_insertion): instead of is_in_insertion_of_type, use
+ float_active.
+
+ * makeinfo/insertion.c (cm_example):
+ * makeinfo/xml.c (xml_insert_docbook_image, xml_begin_multitable):
+ insert empty label for @floats with no @anchor.
+
+2003-11-24 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile.am (EXTRA_DIST): remove no-longer-defined
+ noinst_SCRIPTS.
+
+2003-11-24 Akim Demaille <akim@epita.fr>
+
+ * configure.ac (HELP2MAN): Look for it.
+ * doc/help2man: Remove.
+ * doc/Makefile.am (HELP2MAN, noinst_SCRIPT): Remove.
+ (common_mandeps): Don't depend on HELP2MAN which can be a complex
+ command such as "missing --run help2man.
+
+2003-11-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: doc/\global fixes.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c: new command @listoffloats.
+
+ * makeinfo/float.c (count_floats_of_type_in_chapter): only count
+ floats with @anchors.
+ (cm_listoffloats): new function.
+
+ * makeinfo/insertion.c (end_insertion): do not prepend float type and
+ number if no @anchors.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new element listoffloats.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.h: number sections by default.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_xref): if a reference is being made to a
+ float with only one parameter, use the float number in HTML, and
+ prepend it to the link in Info outputs.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.h:
+ * makeinfo/float.c (get_float_ref): new function to retrieve a float's
+ number by its id.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (end_insertion): indent the first paragraph
+ after @float.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c: new commands @float and @caption.
+
+ * makeinfo/insertion.h: new environment floatenv.
+
+ * makeinfo/insertion.c (cm_float, cm_caption): new functions.
+ (begin_insertion, end_insertion): handle floatenv.
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new elements float, floattype, caption, floattable,
+ floatfigure, floatexample.
+
+ * makeinfo/insertion.c (cm_example):
+ * makeinfo/xml.c (xml_insert_docbook_image, xml_begin_multitable):
+ insert label and id attributes, title element for docbook if used
+ inside @float.
+
+ * makeinfo/xml.c: replacements for multitable and informalfigure.
+ (xml_insert_element_with_attribute): special-cased float element for
+ docbook to make it appear in element stack and thus enable element
+ replacements inside floatenv.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/float.c:
+ * makeinfo/float.h: new files for float environment functions.
+
+ * makeinfo/Makefile.am: added new files to makeinfo_SOURCES.
+
+2003-11-24 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_xref): xstrdup the result from
+ xml_get_assoc_for_id, as it gets freed later.
+
+ * makeinfo/xml.c (xml_get_assoc_for_id, xml_associate_title_with_id):
+ reimplemented unnumbered_labels handling.
+ (xml_insert_docbook_image): Docbook expects format attribute values to
+ be uppercase.
+
+2003-11-23 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: doc fix for multitable.
+ * util/gendocs.sh: docbook support, from Simon Josefsson.
+
+ * doc/texinfo.tex (\defttsl): new font.
+ (\df): set ttsl too.
+ (\deffngeneral,\deftypefngeneral,\deftypecvgeneral,
+ \deftypheader): call \ampdefunargs or \normaldefunargs.
+ (\normaldefunargs): new macro, typesetting defun
+ args in ttsl (instead of sl).
+ (\ampdefunargs): treat & specially and then call \normaldefunargs.
+ (\defname): typeset defun name in tt (instead of bf).
+
+ * doc/texinfo.tex: uniformly comment out eol with {% at macro
+ starts.
+
+2003-11-23 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (is_in_insertion_of_type): return the level
+ where the insertion is found.
+
+ * makeinfo/makeinfo.c (search_forward_until_pos): new function that
+ sets search_forward boundary.
+ (text_expansion): also reset docbook.
+
+ * makeinfo/sectioning.h:
+ * makeinfo/sectioning.c (current_chapter_number): new function that
+ returns top level chapter numbers.
+ (handle_enum_increment): always do the incrementation. but return
+ strings conditionally.
+
+ * makeinfo/xml.c: changed screen element's contained_in_para to 0 for
+ Docbook. @lisp/@smalllisp create programlisting.
+ (xml_insert_quotation): reimplemented quotation_stack handling.
+
+2003-11-22 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\tocentry): same as \entry, no second 1pt of
+ stretch. And a couple doc fixes.
+
+ * doc/texinfo.txi (Conventions): finally, get rid of @vskip
+ -@baselineskip kludge, we handle index entries after @item's now.
+
+2003-11-22 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.txi: use new @quotation feature.
+
+ * texinfo.tex (\putwordDeftypevar, \putwordDeftypefun): Remove.
+ * txi-cs.tex, txi-de.tex, txi-en.tex, txi-es.tex, txi-fr.tex,
+ txi-it.tex. txi-nl.tex, txi-no.tex, txi-pl.tex, txi-pt.tex,
+ txi-tr.tex: The same.
+ [texinfo-20031120-deftype-del.patch]
+
+ * doc/texinfo.tex (\verbatim,\Everbatim): remove one extra level
+ of grouping; move two lines of code ...
+ (\setupverbatim): ... here.
+ (\doverbatiminclude): just call the new \setupverbatim.
+ (\setupverbatiminclude): remove.
+ [texinfo-20031121-verbatim2.patch]
+
+ * doc/texinfo.tex (\math): no need for \mathcode, and we actually
+ can use $ not \implicitmath.
+ [texinfo-20031121-math.patch]
+
+ * doc/texinfo.tex (\zeroskipmacro): new macro, so we can
+ check for true zero skip.
+ (\dosubindsanitize): use it.
+ [texinfo-20031120-zeroskip.patch]
+
+ * doc/texinfo.tex (\doignore): scan in verbatim mode. Without this,
+ if the last line of ignored text ended with ``@'', the ``@end ifxxx''
+ tag was missed.
+ (\dodoignore): use \_STOP_ instead of \ST@P.
+ [texinfo-20031120-ignore-at.patch]
+
+ * doc/texinfo.tex (\defparsearg): new macro, to simplify places
+ where the user macro just calls \parsearg. Use it in many places.
+ [texinfo-20031121-defparsearg.patch]
+
+ * doc/texinfo.tex (\begin): remove, this is undocumented
+ and unused.
+ [texinfo-20031121-begin.patch]
+
+ * doc/texinfo.tex (\title,\subtitle,\author,...): move to outer
+ level (was inside \titlepage), it's more readable than nested
+ definitions.
+ [texinfo-20031116-titlepage1.patch]
+
+ * doc/texinfo.tex (\evenheadingxxx,\oddfootingyyy): might as well
+ use \ and avoid changing catcode of @.
+ [texinfo-20031116-catofat.patch]
+
+ * doc/texinfo.tex (\set): use new macros: \parseargusing and
+ \makecsname.
+ [texinfo-20031116-set.patch]
+
+ * doc/texinfo.tex (\cartouche): avoid \par if we are already in
+ vertical mode, in case it has an effect, eg. in an @example;
+ avoid extra space from the @cartouche line itself.
+ (\Ecartouche): force vertical mode, so that the \kern has the desired
+ effect.
+ [texinfo-20031120-cart.patch]
+
+ * doc/texinfo.tex (\ptexfootnote,\ptexinsert): save orig definitions.
+ (\startsavinginserts): new macro (with relatives), call from
+ \cartouche, \group, \table.
+ [texinfo-20031118-saveins.patch]
+
+ * doc/texinfo.tex (\table, \ftable, \vtable, \tablex, \tabley,
+ \tablez): Cleaned up indentation, etc.
+ (\kitem, \kitemx, \xitem, \xtemx, \description): Removed; they
+ didn't look as if they would work in their present state, anyway.
+ [texinfo-20031114-table.patch]
+
+ * doc/texinfo.tex (\filenamecatcodes): new macro.
+ (\include,\verbatiminclude): use it, with new \parseargusing.
+ (\pushthisfilestack,etc.): implement our own stack of filenames
+ instead of reading the @include argument in a group.
+ [texinfo-20031109-include.patch]
+
+ * doc/texinfo.tex (\indexbreaks): remove, and remove call.
+ (\entry): read arguments on the fly, to avoid fixing catcodes.
+ [texinfo-20031121-indexbreaks.patch]
+
+ * doc/texinfo.tex (\makevalueexpandable): new macro.
+ Change occurrences of \let\value=\expandablevalue to use it,
+ to reduce code duplication.
+ [texinfo-20031121-value.patch]
+
+ * doc/texinfo.tex (\parsedefunlineX,\defunchkspace,defunchktab,
+ \defunloop,\defunchkfinish,\replaceeols): New macros.
+ (\parsedefunline): start them off. This is to support continuations
+ lines for @defun headers.
+ [texinfo-20031108-defun-cont.patch]
+
+ * doc/texinfo.tex (\defun and all related commands):
+ rewrite to use \parsearg and uniform command generation.
+ (\makecsname): New macro, to be used within \edef's only.
+ [texinfo-20031120-defun.patch]
+
+ * doc/texinfo.tex (=, \equalChar): remove active definition of =
+ and hacks that printed = in \tt sometimes. We want to print
+ everything in \tt anyway, ultimately.
+ [texinfo-20031120-defun-pres3.patch]
+
+ * doc/texinfo.tex (\defopheader,\defcvarheader,defivarheader):
+ use \code for the class name.
+ [texinfo-defun-pres2.patch]
+
+ * doc/texinfo.tex (\parsearg): Reset the catcode of space before
+ we scan the argument; so we don't have to worry about
+ obeyed spaces before and after the argument.
+ (\parseargx, \parseargy): Nuke, it was wrong anyway--\obeyedspace,
+ which is a macro, was compared with \temp which could have been let
+ to an obeyed space, but it couldn't be a macro.
+ (\removeactivespaces,\removeactivespacesX,\removeactivespacesY): Nuke.
+ (\argremovespace): If the argument scanned by \parsearg ends with
+ a space, remove it.
+ [texinfo-20031108-parsearg-space.patch]
+
+ * doc/texinfo.tex: use \other, for clarity and efficiency;
+ use `\^^M instead of raw number 13.
+ [texinfo-20031108-other.patch]
+
+ * doc/texinfo.tex (\doverbatim): \xdef and \gobble, to avoid
+ the active space between `\end' and `verbatim'.
+ [texinfo-20031120-verbatim.patch]
+
+ * doc/texinfo.tex (\quotationlabel): new macro to print label,
+ with a \bf space.
+ (\quotation): change call so \parsearg is at the end.
+ [texinfo-20031118-quot.patch]
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_xref): removed the warning about
+ @xrefs to @unnumbered sections, as there are many situations where
+ there is no way to fix them.
+
+ * makeinfo/insertion.c: removed lingering titlepage_cmd_present
+ declaration.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_titlepage, cm_titlepage_cmds): moved to ...
+ * makeinfo/insertion.c: here.
+
+ * makeinfo/cmds.h (titlepage_cmd_present): moved to ...
+ * makeinfo/makeinfo.h: here.
+
+ * makeinfo/insertion.c (is_in_insertion_of_type): new function to
+ query insertion_stack to see if we are inside a given insertion type.
+
+ * makeinfo/makeinfo.h:
+ * makeinfo/insertion.c (begin_insertion, end_insertion):
+ * makeinfo/xml.c (xml_add_char):
+ * makeinfo/xml.h: removed xml_in_copying and inside_titlepage_cmd
+ global variables in favor of the new query function.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (discard_until, execute_string): reworded
+ multiline related error messages.
+ (discard_until): rollback input_text_offset only if not dealing with a
+ multiline error, otherwise the same block gets in the way repeatedly.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.h:
+ * makeinfo/xml.c (xml_get_assoc_for_id, xml_associate_title_with_id):
+ new functions.
+ (xml_insert_indexentry): call execute_string(xref) instead of creating
+ references directly.
+
+ * makeinfo/makeinfo.c (cm_xref): check to see if xref is being made to
+ an @unnumbered, and only one argument is given. issue a warning, use
+ @unnumbered's title as the third argument.
+
+ * makeinfo/sectioning.c (sectioning_underscore): keep track of
+ unnumbered sections, and their node names.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (sectioning_underscore): for Docbook, always
+ provide label attribute for chapter and unnumbered.
+ (handle_enum_increment): simplified enumeration constraints, and
+ changed to follow TeX way. Moved marker handling to ...
+ (cm_chapter, cm_unnumbered, cm_appendix): here.
+ (cm_appendix): restart numbering.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.h:
+ * makeinfo/insertion.c: new rawdocbook and rawxml insertion types to
+ provide better block names in error messages (instead of "rawhtml" for
+ everything.)
+ (current_item_function, insertion_type_pname, find_type_from_name)
+ (begin_insertion, end_insertion, discard_insertions, cm_docbook)
+ (cm_xml, cm_item): honor new types.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_image): issue only a warning instead of an
+ error when .txt file is unreadable, to better comply with the manual.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (sectioning_underscore): insert label="" only
+ when the output format is Docbook.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_end): get rest of the line before returning
+ in case of error, so the parameter to @end does not get leaked into
+ the output document.
+
+ * makeinfo/makeinfo.c (discard_until): when the expected string is not
+ found, check to see if we are looking for @end, and if so issue a more
+ descriptive error message.
+ (execute_string): keep track of insertion stack to catch multiline
+ commands where they are not allowed.
+ Report from: Dumas Patrice <dumas@centre-cired.fr>, Wed, 18 Jun 2003
+ 09:41:56 +0200.
+
+2003-11-21 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/multi.c (multitable_item): start <tbody> immediately if
+ this a regular @item, and first in the table
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/footnote.c (output_pending_notes): always output footnotes
+ with in_fixed_width_font = 0, so entity substitutions can take place.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/footnote.c (cm_footnote, output_pending_notes): provide
+ back link from footnote marker.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (cm_insert_copying): remove blockquote from
+ copying_text when inside bookinfo and the output format is Docbook.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_value): return immediately instead of
+ just suppressing bogus warnings.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_value): do not issue bogus warnings about
+ undefined values when @value is used inside a @menu environment, and
+ the output format is Docbook.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (sectioning_underscore): use @settitle value
+ if @top parameter is empty.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_begin_index): make sure we are removing the
+ label attribute and not something else.
+
+2003-11-19 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/sectioning.c (get_sectioning_number): do not append space
+ with Docbook.
+ (sectioning_underscore): insert label attribute to make
+ distinction between chapter and unnumbered in Docbook.
+ (handle_enum_increment): also increment for Docbook.
+
+ * makeinfo/xml.c (xml_begin_index): remove label attribute from index
+ element.
+
+2003-11-18 Karl Berry <karl@gnu.org>
+
+ * cmds.c (command_table): new commands @deftypecv, @deftypecvx.
+ * defun.c, insertion.[ch], xml.c: implement them.
+
+2003-11-18 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (execute_string): better para handling in case
+ of nested executions.
+
+2003-11-18 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Multi-column Tables): include cmd name in
+ section name.
+ (Multitable Rows): use @headitem in example.
+
+2003-11-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_begin_document): upgraded docbook DTD to Docbook
+ XML 4.2.
+
+ * makeinfo/makeinfo.c (cm_xref):
+ * makeinfo/xml.c (xml_insert_docbook_image, xml_insert_indexentry)
+ (xml_begin_multitable): close previously open-tag-only elements.
+
+2003-11-17 Karl Berry <karl@gnu.org>
+
+ * bootstrap: honor environment variables.
+
+2003-11-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (execute_string): end paragraphs if
+ executing @copying text with xml.
+
+ * makeinfo/xml.c: disallow nested quotations, legalnotice in abstract,
+ and samp in var with Docbook.
+
+2003-11-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/insertion.c (begin_insertion): keep @copying state.
+ use legalnotice instead of abstract for @copying.
+ (cm_insert_copying): removed redundant work arounds.
+
+ * makeinfo/makeinfo.c (execute_string): try to keep tags balanced with
+ Docbook and xml.
+
+ * makeinfo/xml.c
+ (xml_current_stack_index, xml_end_current_element): new functions.
+ (xml_add_char): enclose @copying text in a quotation element with
+ Docbook.
+
+2003-11-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_settitle): do not automatically start bookinfo
+ element after settitle.
+
+2003-11-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c (xml_synindex): new function to keep track of index
+ redirections.
+ (xml_insert_indexterm): added a check to see if any index
+ redirections are made.
+
+ * makeinfo/index.c (cm_synindex): let xml_synindex() handle xml part.
+
+2003-11-17 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_uref):
+ * makeinfo/xml.c: use ulink for @uref with Docbook.
+
+2003-11-16 Karl Berry <karl@gnu.org>
+
+ * util/install-info.c: protoize.
+ * util/texindex.c: protoize.
+ * util/dir-example (protoize,unprotoize): add.
+
+ * doc/texinfo.tex (\everytab): new \toks.
+ (\headitem): use it to typeset in bold.
+ (\item): reset it.
+
+2003-11-15 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (quotation): document it.
+ * doc/texinfo.tex (\quotation): accept optional argument.
+ (\doquotation): new macro to test for and typeset it.
+
+ * doc/texinfo.txi (Multitable Rows): document @headitem.
+
+ * doc/texinfo.tex (\headitem): error by default, redefine inside
+ @multitable (= \dotable). New command suggested by Arnold.
+
+2003-11-15 Akim Demaille <akim@epita.fr>
+
+ * util/texi2dvi (fatal): New function. Use it.
+ (txiversion): Be robust to broken texinfo.tex.
+
+ * doc/texinfo.txi (example): mention use of @r for annotations.
+
+2003-11-15 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c: new command @headitem.
+
+ * makeinfo/insertion.c (cm_headitem): new function.
+
+ * makeinfo/insertion.h: new variables to keep head item state.
+
+ * makeinfo/multi.c (multitable_item, end_multitable):
+ * makeinfo/xml.c (xml_end_multitable_row, xml_end_multitable):
+ insert thead element if @headitem is used.
+
+ * makeinfo/xml.h: new element THEAD.
+
+ * makeinfo/texinfo.dtd: updated multitable structure.
+
+ * NEWS: announced @headitem.
+
+2003-11-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (cm_xref): make use of third and fifth arguments
+ of @xref with Docbook.
+
+ * makeinfo/xml.c: use Docbook citetitle for @cite.
+
+2003-11-13 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: doc fixes.
+
+ * configure.ac, NEWS: autoconf 2.59.
+
+2003-11-13 Akim Demaille <akim@epita.fr>
+
+ * configure.ac: Use AC_CHECK_DECLS, not txi_CHECK_DECLS.
+ Also use # instead of dnl for comments.
+ * acinclude.m4: Remove.
+
+2003-11-14 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_noindent): output continued paragraphs with
+ docbook and xml only when @noindent command is used.
+ (cm_noindent_cmd): new function. Patch from Arnold Robbins
+ <arnold@skeeve.com>, 13 Nov 2003 15:43:02 +0200.
+
+2003-11-11 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_i, cm_b, cm_r): do not use lineannotation if we
+ are printing indices.
+
+ * makeinfo/insertion.c (cm_insert_copying): removed unnecessary xml
+ fix.
+
+ * makeinfo/texinfo.dtd: added OElig and oelig entities.
+
+2003-11-11 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_sp): disabled parameter expansion.
+
+2003-11-10 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c:
+ * makeinfo/insertion.c (cm_html): do not process @xml blocks.
+ (cm_xml): new function to process @xml.
+
+ * makeinfo/xml.c (xml_start_para, xml_end_para): skip para handling in
+ footnote.
+ (xml_insert_footnote): keep state in xml_in_footnote variable.
+
+ * makeinfo/texinfo.dtd: updated settitle definition.
+
+2003-11-10 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Output Formats): rewrite to fix underfull
+ boxes.
+
+2003-11-10 Alper Ersoy <dirt@gtk.org>
+
+ * doc/texinfo.tex (\commondummies): added registeredsymbol.
+
+2003-11-09 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/makeinfo.c (main): fixed a segfault with --html
+ --no-header.
+
+2003-11-09 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (html_output_head): output node name in title first.
+
+2003-11-09 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new Docbook elements for quotation: tip, note,
+ important, warning, caution.
+
+ * makeinfo/xml.c: better font tags for Docbook.
+ (xml_insert_quotation): new function that is aware of specialized
+ Docbook elements for quotation.
+ (xml_insert_entity): use add_char() instead of insert() for correct
+ paragraph handling.
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion): use
+ xml_insert_quotation() for quotations.
+ (cm_quotation): removed quotation element insertion.
+ (cm_insert_copying): also work around xml tags.
+
+ * makeinfo/cmds.c (cm_b): really use bold with Docbook.
+
+ * NEWS: @quotation changes.
+
+2003-11-08 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (registeredsymbol): new node.
+
+ * doc/Makefile.am (HELP2MAN): invoke explicitly from $(srcdir), in
+ case . is not in PATH.
+
+ * configure.ac (AC_CONFIG_HEADERS): apparent AM_CONFIG_HEADERS is
+ obsolete now, and we get to use AC_CONFIG_HEADERS again.
+
+ * doc/texinfo.txi (Fonts): mention <lineannotation> feature in
+ Docbook feature.
+
+ * doc/texinfo.txi (itemx): warn not to use blank lines between
+ @itemx's.
+
+2003-11-08 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c (cm_i, cm_b, cm_r): for Docbook, use <lineannotation>
+ in @example-like environments.
+ (cm_r): For HTML use <span> to make sure we always get roman text.
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h: new docbook element <lineannotation>. Added also to
+ replace_elements to avoid nesting.
+
+2003-11-08 Alper Ersoy <dirt@gtk.org>
+
+ * doc/texinfo.txi (Custom Headings): removed a newline that broke
+ Docbook output.
+
+ * NEWS:
+ * makeinfo/cmds.c: new command @registeredsymbol
+
+ * makeinfo/cmds.c (cm_registeredsymbol): new function.
+ (cm_code): fixed in_fixed_width_font adjustment for XML and Docbook
+ outputs.
+ (cm_noindent, cm_indent): set xml_no_indent as well.
+
+ * makeinfo/makeinfo.c (reader_loop): use entities for double quotes
+ and dashes in HTML, XML and Docbook outputs.
+
+ * makeinfo/multi.c (setup_multitable_parameters): convert
+ @columnfractions to integer percentages (original code from Arnold
+ Robbins <arnold@skeeve.com>.)
+ (multitable_item, cm_tab): add width attribute to <td> element if
+ @columnfractions is used.
+
+ * makeinfo/texinfo.dtd: added an optional role attribute to para
+ element (used for @noindent.) New attributes ldquo, rdquo, ndash,
+ mdash, registered.
+
+ * makeinfo/xml.c: replaced repeated command element with more
+ appropriate Docbook elements in docbook_element_list.
+ (xml_start_para, xml_end_para): new functions to centralize paragraph
+ handling.
+
+ * makeinfo/xml.h: new variable xml_no_indent.
+
+2003-11-07 Karl Berry <karl@gnu.org>
+
+ * bootstrap: run the various auto* tools we need instead of
+ autoreconf, which copies in older versions of files.
+
+ * doc/Makefile.am (texinfo): remove the special rule, it seems to
+ be fixed.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): bump to 1.7.8.
+ * doc/version.texi, doc/version-stnd.texi: cvs add these again,
+ because with AM_MAINTAINER_MODE they are not created
+ (unless --enable-maintainer-mode is given).
+
+ * doc/Makefile.am (*.1) [MAINTAINER_MODE]: use this conditional
+ instead of TEXINFO_MAINT, now that we have it.
+ * configure.ac (TEXINFO_MAINT): no longer needed, since we call
+ AM_MAINTAINER_MODE.
+
+2003-11-06 Karl Berry <karl@gnu.org>
+
+ * bootstrap: ok, restore --force since it doesn't help Alper
+ anyway.
+
+ * AUTHORS: Silly syntax.
+ * bootstrap: no --force, everything is considered obsolete then
+ (thanks Alper).
+
+2003-11-06 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (html_output_head): add <link> elements pointing to
+ top, up, next, prev nodes when splitting output, and to top when not
+ splitting. Also provide a link to Texinfo homepage.
+ (add_link): use nodename as title attribute.
+
+2003-11-05 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/html.c (html_output_head): append node name to title if
+ splitting. Escape special chars in title.
+
+ * makeinfo/node.c (cm_node): removed <link> elements from HTML node
+ navigation <div> as they are only allowed in <head>.
+
+2003-11-05 Alper Ersoy <dirt@gtk.org>
+
+ * doc/texinfo.txi (Installing Dir Entries): fixed @uref for Free
+ Software Directory.
+ (Command List): Escaped @/.
+
+ * info/display.c (handle_tag, handle_tag_start, handle_tag_end): new
+ functions.
+ (display_update_one_window): ignore the text between magic
+ tags/cookies.
+
+ * makeinfo/cmds.c (cm_dots, cm_enddots): use insert_string() for HTML
+ to avoid escaping.
+ (cm_bullet): use entity name (bull) instead of number (149).
+
+ * makeinfo/index.c (cm_printindex): escape expanded_index.
+
+ * makeinfo/lang.c (cm_accent_generic_html): handle @dotless{i}
+ correctly.
+ (cm_special_char): use entity names for @OE (OElig) and @oe (oelig)
+ instead of numbers.
+
+ * makeinfo/node.c (cm_node): escape node names in HTML output.
+
+ * makeinfo/xml.c (xml_id): check to see if the character is allowed.
+
+ * makeinfo/tests/accent-text.txi: new @dotless{j} lines.
+
+ * makeinfo/tests/accent: look for &acute;j instead of &acute;i.
+
+ * TODO: removed item about @dotless in HTML output.
+
+2003-11-04 Karl Berry <karl@gnu.org>
+
+ * util/Makefile.am (EXTRA_DIST): spurious space after trailing
+ backslash.
+
+ * configure.ac (AC_PREREQ): 2.58.
+
+2003-11-03 Karl Berry <karl@gnu.org>
+
+ * util/Makefile.am (EXTRA_DIST): add gdoc.
+
+2003-11-02 Karl Berry <karl@gnu.org>
+
+ * util/gendocs.sh: doc fix.
+
+ * doc/texinfo.txi (Using Texinfo): merge most details into ...
+ (Output Formats): ... this section.
+
+ * util/dir-example (VM): add.
+
+2003-11-01 Alper Ersoy <dirt@gtk.org>
+
+ * doc/texinfo.txi (Conditional Commands): Docbook text should
+ really use @ifdocbook.
+
+ * info/info.c (raw_escapes_p): 1 by default.
+ (long_options): new option no-raw-escapes.
+ * doc/info-stnd.texi (Invoking Info): document it.
+
+2003-10-31 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/xml.c:
+ * makeinfo/xml.h:
+ * makeinfo/insertion.c (handle_verbatim_environment): use
+ <![[CDATA...]]> for @verbatim in docbook output too.
+
+2003-10-31 Karl Berry <karl@gnu.org>
+
+ * TODO: image scaling in html needed.
+ * makeinfo/cmds.c (cm_strong): only give the warning if we're
+ actually producing Info output.
+
+ * makeinfo/cmds.c (cm_strong): reword message and check for only
+ *Note:, not *Note:*. From: Kevin Ryde <user42@zip.com.au>, 31 Oct
+ 2003 06:19:05 +1000.
+
+2003-10-29 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Def Cmd Template): shorten.
+ * makeinfo/makeinfo.c: help message.
+ * doc/texinfo.tex: version update.
+ * makeinfo/texinfo.dtd: update copyright.
+
+2003-10-28 Alper Ersoy <dirt@gtk.org>
+
+ * makeinfo/cmds.c: output correct elements for @command,
+ @env, @file, @option and @samp commands, and also handle
+ @titlepage in xml output. New commands: @docbook,
+ @ifdocbook and @ifnotdocbook for conditional docbook output.
+
+ * makeinfo/defun.c (args_from_string): allow comma to be
+ recognized as a separate token to help XML side of things.
+ (process_defun_args): let xml.c handle xml output.
+
+ * makeinfo/insertion.c: handle @verbatim properly when
+ outputting xml. This means: surround data with a <verbatim>
+ block, use <![[CDATA ... ]]> and disable escaping.
+ Recognize @titlepage, @docbook, @ifdocbook and
+ @ifnotdocbook.
+ (cm_insert_copying): do not trust the consistency of
+ copying_text, because full_expansion doesn't let open
+ docbook elements to be closed.
+ (cm_item): generate correct index entries in xml output.
+
+ * makeinfo/insertion.h: new insertion types: ifdocbook,
+ ifnotdocbook, titlepage.
+
+ * makeinfo/lang.c: notify language changes with
+ @documentlanguage in xml output, using <documentlanguage
+ xml:lang=".." /> elements.
+
+ * makeinfo/makeinfo.c: trailing encoding settings in html
+ output are commented. Do not append any encoding settings
+ to xml and docbook outputs. Set process_docbook variable
+ for @docbook, etc. and updated --help about it.
+ (set):
+ (clear): Output @set and @clear in xml so it's possible to
+ pass variables to further processors.
+
+ * makeinfo/makeinfo.h: process_docbook and
+ inside_titlepage_cmd (to check validity of @author, @title,
+ @subtitle, etc.)
+
+ * makeinfo/sectioning.c: heading-only commands (@chaphading,
+ etc.) do not start/end sections in xml output. They are now
+ equivalents of the title element.
+
+ * makeinfo/toc.c: @contents and @shortcontents now appear in
+ the output.
+
+ * makeinfo/xml.c: changed element_list typedefs to also note
+ whether an element is filled. Prefilled elements get
+ xml:space="preserve" attribute. Added xml prolog. Root element
+ in xml output gets the document language like it does in
+ docbook, but with xml:lang. Removed indentation for xml
+ output. Also lines in paragraphs are joined.
+ (xml_process_defun_args):
+ (xml_begin_definition):
+ (xml_end_definition):
+ (xml_begin_def_term):
+ (xml_end_def_term): functions to handle @def environments.
+
+ * makeinfo/xml.h: new elements in xml_element enum:
+ TITLEPAGE, AUTHOR, BOOKTITLE, BOOKSUBTITLE, COMMAND_TAG,
+ ENV, FILE_TAG, OPTION, SAMP, CONTENTS, SHORTCONTENTS,
+ DOCUMENTLANGUAGE, VERBATIM, SETVALUE, CLEARVALUE, DEF*.
+ (Suffices of COMMAND_TAG and FILE_TAG are to avoid variable
+ name clashes.)
+
+ * makeinfo/texinfo.dtd: updated to reflect changes.
+
+ * doc/texinfo.tex: skip @docbook and @ifdocbook.
+
+2003-10-28 Karl Berry <karl@gnu.org>
+
+ * util/gendocs.sh: new -o option to specify output directory.
+
+2003-10-27 Karl Berry <karl@gnu.org>
+
+ * lib/system.h (LC_MESSAGES): no longer needed according to
+ Bruno, libintl.h defines it.
+ Message of 16 Jul 2003 18:17:23 +0200.
+
+2003-10-27 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\defname): be sure to declare the space
+ we get from \rightskip in the first line.
+ (\parsebodycommon): Be careful not to issue \medbreak after
+ \penalty 2000.
+ (\defxbodycommon): The penalty changed from 2000 to 3000;
+ it should be higher that the one in \parsebodycommon.
+ -- added "@c vim:sw=2:" near the end, for my comfort.
+
+2003-10-27 Stepan Kasal <kasal@ucw.cz>
+
+ More cleanup of active chars in @defxx arguments:
+
+ * doc/texinfo.tex (\opnr, \clnr): Reimplemented, ...
+ (\oprm, \clrm, \opnested, \ampnr): ... nuking these, and using ...
+ (\parenfont, \infirstlevel, \bfafterword): ... 3 new macros, ...
+ (\ifampseen): ... and a new \if.
+ (\brackcount): New count, to count also square braces, ...
+ (\lbrb, \rbrb): ... here.
+ (\checkparencounts): Macros to check whether both counts get back
+ to 0; ...
+ (\badparencount, \badbrackcount): ... if not, issue an error
+ message and reset the respective count.
+ (\deftypefnheaderx): Don't call \normalparens, it has no effect.
+ (\defvarargs): Call \boldbrax instead of \normalparens.
+ (\normalparens): Nuked.
+
+2003-10-26 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/session.c (info_menu_or_ref_item): If point is before all
+ the cross-references, use the first one as the default, instead of
+ setting which to -1 and crashing. (Patch originally sent 2000-10-09.)
+ Debian bug 74278, reported from: Josip Rodin <joy@cibalia.gkvk.hr>,
+ 7 Oct 2000 19:44:24 +0200.
+
+2003-10-26 Karl Berry <karl@gnu.org>
+
+ * configure.ac (AM_MAINTAINER_MODE): enable, to avoid lossage
+ when Texinfo sources are imported into other
+ repositories (NetBSD, TeX Live).
+ Most recently suggested by Thomas Klausner
+ <wiz@danbala.ifoer.tuwien.ac.at>, 9 Sep 2003 14:57:09 +0200.
+
+ * makeinfo/node.c (validate_file): ensure tem1 && tem2 before
+ running STREQ. Report from: Akim Demaille <akim@epita.fr>,
+ 13 Oct 2003 10:43:10 +0200.
+
+ * doc/Makefile.am (infokey.1): new target.
+ (man_MANS): include infokey.1.
+ Noticed this in Debian diff.
+
+ * util/texi2dvi: check for tex up front; inspired by Debian diff.
+
+ * TODO: makeinfo -E should do simple macro expansion, not
+ validity checking (even syntax, for @tex processing).
+
+ From: Stepan Kasal <kasal@ucw.cz>, 24 Oct 2003 19:10:02 +0200.
+ Start at making makeinfo -E behave more like a macro preprocessor,
+ avoiding consistency checks.
+ * makeinfo/insertion.c (cm_menu,cm_detailmenu): avoid checks if
+ macro_expansion_output_stream.
+ * makeinfo/makeinfo.c (main): set validating=0 if
+ macro_expansion_output_stream.
+
+ * util/texi2dvi (comment_iftex_sed): don't think we need to
+ comment out @ifhtml sections here, makeinfo will not expand them
+ by default.
+
+2003-10-25 Karl Berry <karl@gnu.org>
+
+ * info/info.c: --raw-escapes affects Info files, not just man
+ pages.
+
+ * doc/texinfo.tex: novalis doesn't like my clarification, so make
+ it a special exception instead.
+
+2003-10-24 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\defname): Cleanup of this macro.
+ (\boldbraxnoamp): Nuked, it's equivalent to \boldbrax;
+ the caller changed.
+ Other minor cleanups around active paretheses.
+ (\defunargs): After reporting the "Unbalanced paretheses" error,
+ reset the count.
+
+2003-10-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (makeinfo advantages): mention that plain text
+ --no-headers does --enable-encoding.
+
+2003-10-23 Karl Berry <karl@gnu.org>
+
+ * makeinfo/macro.c (define_macro): write the macro definition
+ itself to the output stream, to give texinfo.tex a chance at it.
+ Report from: Akim Demaille <akim@epita.fr>, 22 Oct 2003 17:15:34
+ +0200.
+
+ * doc/texinfo.tex (\readauxfile): make the \openout\auxfile be
+ \immediate, to avoid spurious terminal output from the
+ \immediate's in \setref.
+
+2003-10-23 Stepan Kasal <kasal@ucw.cz>
+
+ Rewrite \parsearg:
+ * doc/texinfo.tex (\parsearg, \parseargusing): \parseargusing is
+ a new macro which works just like good old \parsearg but takes
+ one more parameter which contains code to be performed within
+ a group just before we slurp the rest of the line---typically,
+ some catcode chages go here.
+ (\parseargx): Insert an \empty token before the arg to be read,
+ to prevent loosing of braces. (Thus @end{foo} no longer works.)
+ (\parseargline, \argremovecomment, \argremovec): Change the way
+ comments are stripped; do not use \toks0.
+ (\removeactivespaces): is now called directly from \parsearg (via
+ \parseargusing and \argremovec), and stripps only the trainling
+ active spaces, doesn't perform expansion.
+ (\finishparsearg): New macro, finishes \parsearg by nuking the
+ added \empty token.
+ (\end, \endxxx): Don't call \removeactivespaces, don't use \toks0;
+ because of efficiency, move the error handling to ...
+ (\badenderror): ... a new macro.
+ (\doverbatim): ``\end{verbatim}'' changed to ``\end verbatim.''
+
+ Cleanup of various details with active spaces.
+ (\parseargx): Do the \futurelet and move the rest ...
+ (\parseargy): ... to a new macro;
+ (\parseargusing): caller changed;
+ (\parseargdiscardspace): the other caller nuked.
+ (\obeyedspace, \sepspaces, \unsepspaces): Move near to \parsearg.
+ (\obeyedspace): Is now a macro containing the active space.
+ (\unsepspaces): No longer makes spaces active.
+ (\ignoreactivespaces): Nuked, it's only appearance in ...
+ (\aliasxxx): ... replaced by direct code.
+
+2003-10-23 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: comments at top.
+
+ * AUTHORS: add kama. (kama's address is now khmarbaise@gmx.de.)
+
+2003-10-21 Karl Berry <karl@gnu.org>
+
+ * util/gendocs.sh: revision of mohit's original.
+ * util/Makefile.am (EXTRA_DIST): add gendocs.sh and
+ gendocs_template.
+
+2003-10-20 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (handle_include): only close_paragraph if
+ !insertion_stack, else we get extra blank lines when
+ used inside @example.
+ * makeinfo/insertion.c (handle_verbatim_include): likewise, plus
+ move the indentation around.
+ Report from: Brian Gough <bjg@network-theory.co.uk>,
+ 20 Oct 2003 14:36:49 +0100.
+
+ * makeinfo/makeinfo.c (close_paragraph): formatting changes to
+ minimize lines.
+
+ * makeinfo/insertion.c (end_insertion): for html output in the
+ example/etc. case, kill_self_indent to get rid of
+ leading whitespace.
+ Report from: Brian Gough <bjg@network-theory.co.uk>,
+ 20 Oct 2003 14:36:49 +0100.
+
+2003-10-16 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\shortcontbf): cmb10 scaled \magstep1, not cmb12,
+ since cmb12 is not a standard font.
+ Report from: Staszek Wawrykiewicz <staw@gust.org.pl>,
+ 16 Oct 2003 06:44:40 +0200.
+
+2003-10-14 Karl Berry <karl@gnu.org>
+
+ * lib/xstrdup.c: put old version back, we're not ready for gnulib
+ xmalloc yet.
+
+ * makeinfo/insertion.c: undo xml_no_para change, it causes more
+ problems than it solves, according to Alper (Ersoy, <dirt@gtk.org>).
+
+2003-10-12 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c (begin_insertion,end_insertion): in rawhtml
+ case (also used for rawxml), increment and decrement xml_no_para.
+
+ * makeinfo/lang.c (cm_documentencoding): force the normal (info)
+ expansion when reading the arg, even when parsing xml/html/docbook.
+ Report from: Kevin Ryde <user42@zip.com.au>,
+ 13 Oct 2003 10:02:23 +1000.
+
+2003-10-09 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\chapterzzz,...,\unnumberedsubsubseczzz): make
+ section number settings \global. Otherwise, when chapters are
+ @included, they are ineffective and every chapter is numbered 1.
+ For instance, the Emacs and Elisp manuals. Thanks to Stepan for
+ analysis.
+
+ * doc/texinfo.tex: add arch-tag for miles.
+
+2003-10-08 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\onepageout): At the beginning of \shipout, call
+ \pdfdest directly, not via \pdfmkdest.
+ (\pdfmkdest): Call also \atdummies before \pdfdest.
+ (\donoderef): Remove the unsuccessful attempt to expand \lastnode
+ before passing it to \setref (it only expanded `{' twice);
+ things would screw up if \lastnode was expanded too much.
+ (\setref): Rewritten, don't call \atdummies, don't expand
+ \thissection.
+ (\dosetq, \internalsetq, \Ypagenumber, \Ytitle): Nuked.
+ (\chfplain): Remove referrence to \Ytitle from a comment.
+
+2003-10-08 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: spurious space and comment (from Stepan).
+
+ * NEWS: automake 1.7.8.
+ * util/dir-example: include netpbm.
+
+2003-10-07 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\defbf, shortcontbf): use \bfshape instead of
+ \bxshape, so we use cmb consistently instead of cmbx.
+
+ * doc/texinfo.txi: more index entries for em/en dashes, fix
+ capitalizations of cindex entries.
+
+2003-10-07 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\defname): Don't use \ifempty.
+ (\ifempty): Nuke.
+
+2003-10-06 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\dosubind, \doind): Cleanup, move code ...
+ (\dosubindwrite, \dosubindsanitize): ... to new macros,
+ (\emptymacro): and nuke this one.
+
+ * doc/texinfo.tex (\Ypagenumber): Add `\noexpand,' so that ...
+ (\dosetq): ... doesn't have to redefine \folio. Move \iflinks ...
+ (\setref): ... here.
+
+2003-10-06 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\setdeffont): remove; this used DEF instead of
+ def, and thus had no effect for some years, so
+ clearly no one has been using it. Noticed by Stepan.
+
+2003-10-04 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: document hyphen -> dash suppression in literal
+ contexts, and verbatim commands not working inside other commands.
+ Report from: Luc Teirlinck <teirllm@dms.auburn.edu>, 2 Oct 2003
+ 22:45:14 -0500,
+
+ * doc/texinfo.tex (\commondummies,\indexnofonts): no-op @verb; I
+ doubt this is sufficient to make @verb work in index entries etc.,
+ but it's a start. Analysis from: Andreas Schwab <schwab@suse.de>,
+ 02 Oct 2003 18:54:40 +0200.
+
+2003-09-28 Karl Berry <karl@gnu.org>
+
+ * TODO: add item for conversion of non-texinfo manuals.
+
+2003-09-26 Karl Berry <karl@gnu.org>
+
+ * CVSROOT/loginfo: back to log_accum.
+
+ * doc/texinfo.tex (\parsebodycommon): increase \penalty between
+ headers to 2000 from 0.
+ (\defxbodycommon): check for 10002, not 1000. We don't want to
+ allow a page break after a section heading. Hmm, but it seems
+ this should never be called next after a section heading?
+
+2003-09-25 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_strong): warn if argument is exactly
+ "Note:", since that conflicts with Info usage. Suggestion from
+ rms.
+
+2003-09-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\dosubind): must propagate penalty after all,
+ because we insert a non-discardable item (the whatsit), which
+ makes following glue a breakpoint. Now I understand (maybe).
+ (\sectionheading): must end with \nobreak after
+ all, purely to make \lastpenalty 10000 so future code can check
+ that and avoid breaks.
+ (\parsebodycommon): such as this code; don't do a
+ \medbreak if lastpenalty >=10000.
+
+ * doc/texinfo.tex (\tocindent): decrease to 2pc.
+ (\{app,unn}sub{sub,}secentry): redefine so that they
+ indent properly.
+
+2003-09-23 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\dosubind): remove my misbegotten idea of
+ propagating the penalty; all that did was increase the chance of a
+ valid breakpoint. Bug report from: Werner LEMBERG <wl@gnu.org>,
+ 23 Sep 2003 15:47:31 +0200.
+ (\numhead,\apphead,\unnmhead): avoid spurious
+ blank spaces, for cleanliness.
+
+ * CVSROOT/loginfo: syncmail instead of external log_accum.
+ * doc/texinfo.tex (\sectionheading): remove extraneous \nobreak,
+ found by Stepan (of course).
+
+2003-09-22 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\sectionheading): the space below a section
+ heading should have fixed size; \nobreak after a \vskip is
+ redundant.
+
+2003-09-21 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\sectionheading): make space below be half of
+ space above, and don't add \parskip to space above. Suggestion
+ from Han-Wen Nienhuys <hanwen@cs.uu.nl>, implementation ideas from
+ Stepan Kasal <kasal@math.cas.cz>, 16 Sep 2003 11:30:43 +0200.
+
+2003-09-21 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\dosuppressfirstparagraphindent): change the
+ redefinition of \indent and \noindent and factor out common
+ parts of all redefinitions to ...
+ (\restorefirstparagraphindent): ... a new macro.
+
+2003-09-20 Karl Berry <karl@gnu.org>
+
+ * makeinfo/macro.c (cm_alias): do not expand when calling
+ get_until_in_line, since xml/docbook expansion is empty.
+ Report from: Richard Kreuter <kreuter@anduril.rutgers.edu>,
+ 17 Sep 2003 17:59:58 -0400.
+
+ * info/signals.c: Clear the screen when exiting from a SIGQUIT.
+ From: Wojciech Polak <polak@gnu.org>, 19 Sep 2003 10:27:28 +0200.
+
+2003-09-16 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\sectionheading): there is no need to insert
+ \nobreak before a kern which is not followed by
+ a glue. Such a kern is not a permissible breakpoint.
+
+2003-09-16 Simon Law <sfllaw@uwaterloo.ca>
+
+ * doc/texinfo.tex (\dosuppressfirstparagraph): Gobble \noindent
+ if it occurs in the first paragraph.
+ (\ptexnoindent): for saving/restoring \noindent in @tex.
+ (\footnote): Neutralise the effect of @noindent within a footnote.
+
+2003-09-16 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: Changes to make pdf references go to the correct
+ place on the page. This is most easily testable
+ at high magnifications (I used 400% and 800%).
+ (\output): put \the\pageno pdfdest at very
+ beginning of \shipout.(\dopdfoutline): new macro.
+ (\pdfmakeoutlines): recompute all section numbers.
+ (\unnumberedno): \newcount.
+ (\chapterzzz,\appendixzzz,\unnumberedzzz,
+ ..., \unnumberedsubsubseczzz): abstract common
+ elements, keep track of numbering for everything.
+ (\doheading,\dosubheading,\dosubsubheading): call
+ \sectionheading directly instead of \plain*secheading.
+ (\chfplain, \sectionheading): take additional section type
+ argument; call \writetocentry and \donoderef.
+ (\unnchfopen): mention this is deprecated.
+ (\writetocentry): handle "omit" case, and
+ \global\pdfmakepagedesttrue.
+ (\startcontents, \summarycontents): sectioning
+ commands take an extra arg.
+ (\dosub*secentry): take extra arg with section
+ number; change callers.
+ (\pdfcatalog): move this call to the opening PDF
+ commands, for clarity.
+ (\unnumbnoderef): no longer needed, collapsed into
+ \donoderef.(\Yomitfromtoc): new xref constant.
+ (\Ynumbered,\Yappendix): renamed from
+ \Ysectionnumberedandtype and
+ \Yappendixletterandtype, for clarity.
+
+ * doc/texinfo.txi (cartouche): omit invalid @group.
+
+ * makeinfo/node.c (cm_node): restore accesskey= on the <link>s.
+ From hanwen.
+
+2003-09-15 Karl Berry <karl@gnu.org>
+
+ * util/dir-example: add guile-tut.
+
+ * info/session.c (info_follow_menus): take the first best_guess
+ rather than the last.
+ From: Rob Browning <rlb@defaultvalue.org>,
+ 15 Sep 2003 01:26:17 -0500.
+
+2003-09-13 Karl Berry <karl@gnu.org>
+
+ * automake 1.7.7.
+
+ * makeinfo/insertion.c (begin_insertion): start cartouche html output
+ with <p>. @cartouche can't be used meaningfully
+ within a paragraph.
+ Report from: Simon Josefsson <jas@extundo.com>,
+ 11 Sep 2003 19:25:20 +0200.
+
+2003-09-12 Karl Berry <karl@gnu.org>
+
+ * makeinfo/tests/html-manuals: include -I../../doc for case when
+ version-stnd.texi is in build tree.
+ From: ezra peisach <epeisach@med-xtal.bu.edu>,
+ 12 Sep 2003 13:53:32 -0400.
+
+2003-09-11 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Cartouche): document that @cartouche needs to
+ be outside the @example for HTML output to work. This
+ is painful to fix in the current makeinfo.
+ Report from: Simon Josefsson <jas@extundo.com>,
+ 11 Sep 2003 15:21:44 +0200.
+
+2003-09-10 Karl Berry <karl@gnu.org>
+
+ * makeinfo/sectioning.c (section_alist): add entry for centerchap,
+ so at least makeinfo does not bomb out. (No centering is actually
+ done.) From: Denys Duchier <duchier@ps.uni-sb.de>, 10 Sep 2003
+ 21:35:24 +0200.
+
+ * lib/system.h: __CYGWIN__ in comments, too.
+
+2003-09-09 Karl Berry <karl@gnu.org>
+
+ * bootstrap: --include=m4. From Werner.
+
+2003-09-08 Karl Berry <karl@gnu.org>
+
+ * lib/system.h: make that __CYGWIN__, not __unix__. From Eli.
+ * lib/system.h (DEFAULT_TMPDIR,PATH_SEP) [O_BINARY && !__unix__]:
+ new case for cygwin, from: Thomas Klausner
+ <wiz@danbala.ifoer.tuwien.ac.at>, 8 Sep 2003 13:43:29 +0200
+ (for cross-building netbsd).
+
+2003-09-04 Karl Berry <karl@gnu.org>
+
+ * texinfo.txi (Conventions): say more about quotations and dashes,
+ based on a report to help-texinfo from
+ David.Billinghurst@riotinto.com, 18 Jul 2003 16:07:00 +1000.
+
+ * NEWS: mention @tex/@iftex are executed in a group.
+
+2003-09-03 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Macro Details): mention some makeinfo
+ limitations too, from recent bug reports by Patrice Dumas
+ <dumas@centre-cired.fr> and (16 Jul 2003 17:21:56 +0200) Jesper
+ Harder <harder@ifa.au.dk>.
+ * makeinfo/macro.c (define_macro): "end rmacro" is 10 chars long.
+
+2003-08-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * makeinfo/lang.c (encoding_table): Downcase coding system
+ names, since Emacs does not recognize the uppercase names.
+
+ * makeinfo/lang.h: doc fixes.
+
+2003-08-28 Karl Berry <karl@gnu.org>
+
+ * bootstrap: new file (cvs only).
+ * README.dev: mention it.
+ Report from hanwen@cs.uu.nl, sample script from
+ Akim Demaille <akim@epita.fr>.
+ * aclocal.m4: remove from cvs repository.
+
+2003-08-26 Karl Berry <karl@gnu.org>
+
+ * makeinfo/node.c (cm_node): add <LINK> tags. This will produce a
+ navigation bar in Mozilla 1.4 (and perhaps earlier). Original
+ code from Han-Wen Nienhuys <hanwen@cs.uu.nl>.
+
+2003-08-23 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Run tex --help in $tmpdir, to avoid leaving
+ texput.log for old TeX versions. Report from Patrick Welche
+ <prlw1@newn.cam.ac.uk>, patch from Akim.
+
+2003-08-20 Karl Berry <karl@gnu.org>
+
+ * makeinfo/defun.c (cm_defun): skip @ifset/@ifclear insertions
+ when looking for the @defun going with this @defunx. Report from:
+ Akim Demaille <akim@epita.fr>, 14 Aug 2003 12:10:37 +0200.
+
+ * makeinfo/insertion.c (cm_end): rewrite error message for
+ clarity.
+
+2003-08-13 Karl Berry <karl@gnu.org>
+
+ * info/indices.c (info_index_apropos): correct typo, whoses ->
+ whose. From: Jesper Harder <harder@ifa.au.dk>, 13 Aug 2003
+ 14:49:26 +0200.
+
+2003-08-11 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex: excise spurious spaces, etc.
+
+2003-08-09 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: don't use @ifinfo/@heading construct to replace
+ @section any more, the XML output is wrong.
+
+ * doc/texinfo.tex (\pdfmakeoutlines): doc fixes, and use \def once
+ instead of \let twice.
+
+ * doc/texinfo.txi: rewrite @ifinfo text sections to take better
+ account of HTML. Suggestion from: Dumas Patrice
+ <dumas@centre-cired.fr>, 8 Aug 2003 17:19:22 +0200.
+
+2003-08-07 Derek Price <derek@ximbiot.com>
+
+ * makeinfo/insertion.c (cm_direntry): Skip @direntry in --no-headers
+ mode.
+
+2003-08-05 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Beginning a File, title, titlefont): more
+ clarifications. Suggestions from Patrice.
+
+ * doc/texinfo.txi (emph & strong): inconsistent source & example.
+ From Jesper Harder.
+
+2003-08-04 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (titlefont): discuss html output a bit.
+ Suggestion from Patrice.
+
+2003-07-31 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.tex (\doignorecount): no need to initialize.
+ (\doignoreyyy): doc fix.
+ From Stepan.
+
+2003-07-29 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\doignorecount): No need to initialize the
+ count while reading texinfo.tex.
+ (\doignoreyyy): Tiny comment change.
+
+2003-07-28 Karl Berry <karl@gnu.org>
+
+ * makeinfo/html.c (process_css_file): @c (for @charset) should
+ also put us into import_state.
+
+ * doc/texinfo.txi (Conditional Nesting): new section; also change
+ other conditional sections slightly.
+
+ * doc/texinfo.tex (\doignoretext, \doignoretextyyy): Only look for
+ conditionals at the beginning of a line, to avoid problems with a
+ commented conditional. Fix from: Stepan Kasal
+ <kasal@math.cas.cz>, 28 Jul 2003 02:50:41 +0200.
+
+2003-07-27 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\doignore): Rewritten to handle nesting.
+ (\ignoremorecommands, \obstexwarn, \ifwarnedobs): No longer needed.
+ (\nestedignore): No longer needed.
+ (\readauxfile): Remove reference to \warnedobstrue.
+
+2003-07-27 Karl Berry <karl@gnu.org>
+
+ * util/dir-example: lowercase automake.
+
+2003-07-26 Karl Berry <karl@gnu.org>
+
+ * makeinfo/html.c (process_css_file): in null_state, only consider
+ @i to be the start of an @import, since @media can get misparsed.
+ Report from: Dumas Patrice <dumas@centre-cired.fr>, 22 Jul 2003
+ 12:13:29 +0200.
+
+2003-07-25 <karl@gnu.org>
+
+ * doc/texinfo.txi (Raise/lower sections): mention difficulties with
+ node pointer creation and top nodes.
+ Report from: Dumas Patrice <dumas@centre-cired.fr>,
+ 22 Jul 2003 13:08:24 +0200.
+
+2003-07-24 <karl@gnu.org>
+
+ * makeinfo/sectioning.c (what_section): take additional SECNAME
+ argument; change callers.
+ * makeinfo/sectioning.h (what_section): remove redundant decl.
+ * makeinfo/node.c (cm_node): change what_section call here, too.
+ Report from: Dumas Patrice <dumas@centre-cired.fr>,
+ 22 Jul 2003 13:09:19 +0200.
+
+ * doc/texinfo.tex (\doheading,\dosubheading,\dosubsubheading):
+ rationalize names.
+ (\heading,\subheading,\subsubheading): change
+ calls. (yesterday's patch called the undefined
+ \subsecheadingyyy, etc.)
+
+2003-07-23 Stepan Kasal <kasal@ucw.cz>
+
+ * doc/texinfo.tex (\heading, \subheading, \subsubheading): Call
+ \suppressfirstparagraphindent after setting the heading.
+ (\headingyyy, \subheadingyyy, \subsubheadingyyy): New macros.
+ (\chapheadingzzz): Call \suppressfirstparagraphindent at the end
+ and move \chapbreak ...
+ (\chapheading): ... here.
+ (\majorheading): Do a modified \chapbreak, then call \chapheadingzzz.
+ (\majorheadingzzz): Deleted.
+
+2003-07-16 <karl@gnu.org>
+
+ * doc/texinfo.txi (makeinfo Pointer Creation): must pxref Menus,
+ since Menu Location is not a valid xref point for
+ TeX, because of the special @heading stuff.
+
+ * makeinfo/insertion.c (begin_insertion): lack of */ caused
+ display: and smalldisplay: cases to be ignored.
+
+ * lib/system.h (LC_MESSAGES) [!defined (HAVE_LC_MESSAGES) &&
+ !defined (LC_MESSAGES)]: change conditional. Report from
+ Christian Krackowizer <ckrackowiz@std.schuler-ag.com>, 16 Jul 2003
+ 14:40:30 +0200.
+
+2003-07-14 <karl@gnu.org>
+
+ * util/install-info.c (ensure_dirfile_exists): replace literal ^_ with
+ \x1f. Report from Trond Endrestřl
+ <trond@ramstind.gtf.ol.no>, 14 Jul 2003 13:31:29 +0200.
+
+ * makeinfo/sectioning.c (sectioning_html): forgot to change closing </hN>
+ to match opening <hN> (that is, maximum h3).
+ Report from: Jesper Harder <harder@ifa.au.dk>,
+ 14 Jul 2003 15:04:04 +0200.
+
+2003-07-03 <karl@gnu.org>
+
+ * doc/info.texi: copy from Emacs (with revisions by Luc).
+
+2003-07-02 Akim Demaille <akim@epita.fr>
+
+ * util/texi2dvi: Add thumbpdf support.
+ Use FD 6 instead of /dev/null so that when --debugging, the output
+ from auxiliary tools can be observed.
+
+2003-07-02 <karl@gnu.org>
+
+ * doc/texinfo.txi (kbd): document actual makeinfo behavior.
+
+2003-07-01 <karl@gnu.org>
+
+ * doc/texinfo.txi (Menus): require that menus come at the end of the
+ node, since Info readers can't determine the end
+ of a menu.
+ Report from: Luc Teirlinck <teirllm@dms.auburn.edu>,
+ 29 Jun 2003 21:33:19 -0500.
+
+ * makeinfo/insertion.c (begin_insertion): do not increment
+ in_fixed_width_font for @display or @format; this
+ incorrectly caused quotes to be omitted in @kbd
+ output in those environments.
+ Report from: Luc Teirlinck <teirllm@dms.auburn.edu>,
+ 26 Jun 2003 21:59:48 -0500.
+
+2003-06-24 <karl@gnu.org>
+
+ * doc/texinfo.txi (tex): misplaced period.
+ From: Jesper Harder <harder@ifa.au.dk>.
+ (GNU Sample Texts): don't end the $Id index entries with a :.
+ Report from: Luc Teirlinck <teirllm@dms.auburn.edu>.
+
+2003-06-20 <karl@gnu.org>
+
+ * makeinfo/defun.c (process_defun_args): only insert the HTML
+ start/end tags if we're actually generating html.
+ Report from: Shawn Betts <sabetts@sfu.ca>, 12 Jun 2003
+ 16:48:50 -0700.
+
+ * TODO: support translated manuals, from polak@gnu.org.
+
+ * doc/texinfo.txi: Edit Options node no longer exists in the Emacs
+ manual. From: Luc Teirlinck <teirllm@dms.auburn.edu>.
+
+2003-06-18 <karl@gnu.org>
+
+ * config.{guess,sub}, install-sh, lib/xalloc.h: update from gnulib.
+
+2003-06-10 <karl@gnu.org>
+
+ * version 4.6.
+
+
+Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+
+Local Variables:
+mode: indented-text
+left-margin: 8
+fill-column: 76
+version-control: never
+End:
diff --git a/Build/source/utils/texinfo/ChangeLog.46 b/Build/source/utils/texinfo/ChangeLog.46
new file mode 100644
index 00000000000..c495abfedad
--- /dev/null
+++ b/Build/source/utils/texinfo/ChangeLog.46
@@ -0,0 +1,12516 @@
+2003-06-10 <karl@gnu.org>
+
+ * version 4.6.
+
+2003-06-04 <karl@gnu.org>
+
+ * config.sub: update from gnulib.
+
+2003-06-03 <karl@gnu.org>
+
+ * mkinstalldirs: update from gnulib.
+
+2003-06-02 Akim Demaille <akim@epita.fr>
+
+ * util/texi2dvi (tex_envvars): New.
+ Use it to forward -I directories to BIBINPUTS and BSTINPUTS, in
+ addition of INDEXSTYLE and TEXINPUTS.
+
+2003-06-02 <karl@gnu.org>
+
+ * makeinfo/html.c (html_output_head): don't output the <link>, to
+ avoid having mozilla put up a document navigation bar when
+ we don't have anything else to support it yet. Report from:
+ Per Bothner.
+ * makeinfo/makeinfo.c: no need to declare add_link or
+ add_escaped_anchor_name, since they are not used.
+
+ * doc/texinfo.txi (Contents): recommend @contents at the beginning
+ more strongly. Suggestions from Kevin Ryde.
+
+2003-06-01 <karl@gnu.org>
+
+ * makeinfo/macro.c (apply): make \\ expand to \ even if the macro
+ has no arguments. Report from: Jesper Harder <harder@ifa.au.dk>,
+ 31 May 2003 02:56:20 +0200.
+
+2003-05-31 <karl@gnu.org>
+
+ * util/dir-example (C++ libraries): new category, suggested by Bruno.
+
+2003-05-29 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.5.93.
+
+2003-05-29 gettextize <bug-gnu-gettext@gnu.org>
+
+ * configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.12.1.
+
+2003-05-26 <karl@gnu.org>
+
+ * util/texi2dvi: spurious \ in tex_args assignment.
+
+ * doc/texinfo.txi (Contents): trim excess words.
+
+2003-05-25 <karl@gnu.org>
+
+ * util/texi2dvi: extra quotes for the tex_args assignment in
+ --batch mode.
+
+2003-05-19 <karl@gnu.org>
+
+ * lib/xexit.c: translate fflush error messages, add newlines
+ (report from Jim Meyering).
+ * util/{texindex.c,install-info.c},
+ * makeinfo/makeinfo.c,
+ * info/info.c: use xexit again, with redundant return to avoid
+ warnings.
+
+2003-05-18 <karl@gnu.org>
+
+ * lib/xexit.c (xexit): fputs not fprintf, so we get newline;
+ translate the messages, too. Report from Jim Meyering.
+
+ * util/dir-example: move gcc/automake entries.
+
+ * pretest version 4.5.92.
+
+ * update to automake 1.7.5.
+
+ * makeinfo/html.c (append_char): forgot to increment length, duh.
+ Report from: "Torsten Bronger" <bronger@physik.rwth-aachen.de>,
+ 18 May 2003 14:36:23 +0200.
+
+2003-05-17 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (defining_copying): new fn.
+ (add_char): call it, when testing if we should
+ call html_output_head.
+ Report from: Torsten Bronger <bronger@physik.rwth-aachen.de>,
+ 17 May 2003 22:10:42 +0200.
+
+ * configure.ac: pretest version 4.5.91.
+
+2003-05-16 <karl@gnu.org>
+
+ * makeinfo/index.c (sort_index): don't deref NULL. Report from Jan.
+
+2003-05-13 <karl@gnu.org>
+
+ * makeinfo/html.c (append_char): appease sgi compiler.
+ * makeinfo/html.c (insert_html_tag): remove spurious arg to pop_tag,
+ From: ezra peisach <epeisach@med-xtal.bu.edu>, 13
+ May 2003 12:13:40 -0400.
+
+ Fix a few GCC warnings, reported by Jim Meyering:
+
+ * info/nodes.c: parenthesize assignment used as truth value.
+ * info/nodemenu.c (format_node_info): strcpy instead of sprintf,
+ since there's no format.
+ * makeinfo/makeinfo.c (isolate_nodename): remove spurious decl.
+ * makeinfo/xml.c (xml_insert_indexterm): declare as void.
+ * info/key.c: initialize with 0,0 at end.
+ * info/infokey.c (main): return instead of xexit, and remove
+ unused variable.
+ * makeinfo/html.c (init_buffer): forgot to return buf.
+ * info/info.c (remember_info_program_name): remove spurious
+ declaration.
+
+ * makeinfo/sectioning.c,
+ * info/infomap.c: remove unused variables.
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory),
+ * info/man.c,
+ * info/infodoc.c (info_find_or_create_help_window): parenthesize
+ && within ||.
+ * info/display.c (display_update_one_window): initialize rep to
+ NULL, parenthesize && within ||.
+
+ * util/install-info.c,
+ * info/info.c (main),
+ * info/makedoc.c (main): return instead of xexit.
+
+2003-05-13 Akim Demaille <akim@epita.fr>
+
+ * util/texi2dvi (get_xref_files): Pass --file-line-error-style
+ to TeX when supported.
+
+2003-05-12 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.5.90.
+
+ * Makefile.am (EXTRA_DIST): add onceonly.m4.
+
+ * makeinfo/tests/accentenc: must discard stderr since we expect
+ two errors in this case.
+
+ * makeinfo/makeinfo.c (main): new option --css-include.
+ (usage): add to --help message.
+ * makeinfo/makeinfo.h (css_include): new global.
+ * makeinfo/html.c (append_char, process_css_file): new fns
+ implementing it.
+ (html_output_head): call it.
+ * doc/texinfo.txi (HTML CSS): new node describing it.
+ Also split up the Generating HTML node into subnodes.
+
+ * config.{guess,sub}: update from gnulib.
+
+2003-05-10 <karl@gnu.org>
+
+ * makeinfo/index.c (sort_index): allocate the sorted index in new
+ memory, and set the original index to that, to avoid problems with
+ @printindex being called twice on the same index.
+ (cm_printindex): do not free the returned index.
+ Report from: Dumas Patrice <dumas@centre-cired.fr>, 9 May 2003
+ 15:12:21 +0200.
+
+2003-05-09 <karl@gnu.org>
+
+ * makeinfo/defun.c (cm_defun): issue error message without extra
+ x's. Report from: Dumas Patrice <dumas@centre-cired.fr>, 9 May
+ 2003 17:24:25 +0200.
+
+2003-05-07 Akim Demaille <akim@epita.fr>
+
+ * util/texi2dvi (textra_cmd): New.
+ (textra): Escape escapes from sed's evaluation.
+ Use them to support additional TeX/LaTeX commands.
+ Support --command as a synonym for --texinfo.
+
+2003-05-06 <karl@gnu.org>
+
+ * util/dir-example: finish getting rid of GNU packages.
+
+2003-05-04 <karl@gnu.org>
+
+ * doc/texinfo.tex (\itemizey): if no arg to @itemize, default to
+ @bullet. Fix from: Stepan Kasal <kasal@math.cas.cz> 2 May 2003
+ 09:32:11 +0200, report from: Jesper Harder <harder@ifa.au.dk>.
+
+2003-04-30 <karl@gnu.org>
+
+ * makeinfo/.gdbinit: no colon on local variables.
+
+ * doc/texinfo.txi (documentencoding): Document new Info output feature.
+ makeinfo/lang.h (encoding_type): rename `ecname' member to `encname'.
+ makeinfo/html.c, lang.c: change usage.
+ makeinfo/lang.c (cm_documentencoding): fix typo in warning.
+ makeinfo/makeinfo.h (SPLIT_SIZE_THRESHOLD): remove.
+ (info_trailer): declare.
+ makeinfo/makeinfo.c (info_trailer): new fn to generate Local
+ Variables: section if --enable-encoding and
+ @documentencoding are given.
+ (convert_from_loaded_file): call it.
+ * makeinfo/node.c (split_file): write trailer into each split
+ file. Also, simply split files if file size is less than
+ --split-size, removing SPLIT_SIZE_THRESHOLD.
+
+ * doc/texinfo.tex: remove trailing whitespace.
+
+2003-04-29 <karl@gnu.org>
+
+ * makeinfo/node.c (cm_anchor): normalize_node_name so that an
+ anchor named "TOP" or "top" or whatever is not allowed. Report
+ from: Dumas Patrice <dumas@centre-cired.fr>, 29 Apr 2003 18:56:51
+ +0200.
+
+2003-04-28 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: whitespace cleanup.
+
+ * doc/texinfo.tex (\doprintindex): don't \kern-\parindent, it makes
+ the first index entry stick out to the left.
+ Report from: Jesper Harder <harder@ifa.au.dk>,
+ 28 Apr 2003 03:10:36 +0200.
+
+ From Akim Demaille <akim@epita.fr>:
+ * makeinfo/makeinfo.c (cm_value): Warn for undefined flags.
+
+2003-04-27 <karl@gnu.org>
+
+ * doc/texinfo.tex (\footnote, \smartitalicx): use \ptexslash
+ for italic correction instead of \/, since we've redefined \/ now.
+ Report from: Jesper Harder <harder@ifa.au.dk>, 27 Apr 2003
+ 23:30:29 +0200.
+
+ * util/dir-example (mailutils): more from Wojciech Polak.
+ (autoconf): align/edit/sort entries.
+
+2003-04-26 <karl@gnu.org>
+
+ * doc/texinfo.txi (Image Syntax): second and following @image args
+ optional. Report from: Max Techter <mtechter@gmx.de>, 26 Apr 2003
+ 15:50:02 +0200.
+
+ * util/dir-example (anubis): request from Wojciech Polak.
+
+2003-04-25 <karl@gnu.org>
+
+ * makeinfo/defun.c (defun_internal): whitespace needed in docbook
+ output for deftype*. From: José Fonseca
+ <j_r_fonseca@yahoo.co.uk>, 25 Apr 2003 13:07:13 +0100.
+
+2003-04-21 <karl@gnu.org>
+
+ * doc/texinfo.tex (\dofirstparagraphindent): forgot to rename the
+ \...word's.
+ (\suppressfirstparagraphindent): forgot to rename
+ to \dosuppress... Reported by Simon.
+
+2003-04-20 <karl@gnu.org>
+
+ * Installed changes from Simon for suppressing indentation on the
+ first paragraph after section headings, and for new @indent command:
+
+ 2003-04-12 Simon Law <sfllaw@engmail.uwaterloo.ca>
+ * doc/texinfo.tex (\firstparagraphindent): implement suppression
+ of the indentation of the first paragraph.
+ (\dofirstparagraphindent): for parsing arguments.
+ (\suppressfirstparagraphindent): suppress, or don't suppress.
+ (\dosuppressfirstparagraphindent): the actual gobbling of indentation.
+ (\footnote): Compensate for the hanging-indent side-effect.
+ (\numhead, \apphead, \unnmhead): call \dosuppress...
+ * makeinfo/cmds.c (command_table): add "firstparagraphindent"
+ (as cm_firstparagraphindent)
+ (set_firstparagraphindent, cm_firstparagraphindent): implement
+ @firstparagraphindent parsing of options.
+ * makeinfo/makeinfo.h: declare "do_first_par_indent".
+ * makeinfo/sectioning.c (sectioning_underscore): suppress
+ indentation if requested.
+ * doc/texinfo.txi: document it.
+
+ * doc/texinfo.tex (\indent): override \indent primitive to
+ clear \everypar.
+ (\ptexindent): for saving/restoring \indent in @tex.
+ (\footnote): Neutralise the effect of @indent
+ within a footnote.
+ * makeinfo/cmds.c (command_table): add "indent" (as cm_indent).
+ (cm_indent): un-inhibit_paragraph_indentation.
+ * doc/texinfo.txi: document it.
+
+ * doc/texinfo.txi (Conventions): remove spurious extra vertical space
+ from bulleted itemize which starts with a quote.
+
+ * makeinfo/cmds.c (command_table): fix @novalidate definition.
+
+
+ * Installed changes from Jan for @image support in Info format:
+
+ 2003-04-14 Jan Nieuwenhuizen <janneke@gnu.org>
+ * info/display.c (display_update_one_window): Skip new style
+ image tag/cookie.
+
+ 2003-04-09 Jan Nieuwenhuizen <janneke@gnu.org>
+ * makeinfo/makeinfo.c (cm_image): Write ^@^H[image ...^@^H] tag.
+
+
+ * makeinfo/html.c (html_output_head): use <style> to get the
+ regular roman font instead of typewriter for @format and @display;
+ likewise to reduce the font size for @small*. Suggestion from:
+ "Torsten Bronger" <bronger@physik.rwth-aachen.de>, 20 Apr 2003
+ 11:03:59 +0200.
+
+2003-04-18 <karl@gnu.org>
+
+ * configure.ac (ncurses/termcap.h): move test to after termlib's
+ definition, of course. Reported by Norton Allen
+ <allen@huarp.harvard.edu>, 18 Apr 2003 13:31:35 -0400.
+
+ * configure.ac: remove comma from comment in AC_TRY_LINK program,
+ to avoid spurious misinterpretation as an argument delimiter.
+
+2003-04-08 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (usage): avoid double blank line.
+
+2003-04-05 <karl@gnu.org>
+
+ * Makefile.am (all of them): use $(VAR) instead of @VAR@, since
+ automake now emits definitions for all substituted variables.
+
+ * makeinfo/makeinfo.h (DEFAULT_SPLIT_SIZE): increase to 300,000.
+ (SPLIT_SIZE_THRESHOLD): increase to 500,000.
+ Implicit suggestion via Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>.
+
+2003-04-04 <karl@gnu.org>
+
+ * util/texi2dvi (replace_empty): new variable to do the empty path
+ element detection; don't hardwire path separator as :.
+
+2003-04-02 <karl@gnu.org>
+
+ * doc/txi-pl.tex: new file, from polak@gnu.org.
+ * doc/Makefile.am (TXI_XLATE): add it.
+
+2003-04-01 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (main): correct wording of html/no-headers/split
+ error message, and don't complain if output is to stdout.
+
+ * makeinfo/insertion.c (end_insertion): for @end menu html output,
+ don't output </ul> if no_headers. Report from: Jesper
+ Harder <harder@ifa.au.dk>, 01 Apr 2003 00:00:37 +0200.
+
+ * info/infomap.c (fetch_user_maps): don't complain if .info
+ doesn't exist.
+
+2003-03-31 <karl@gnu.org>
+
+ * makeinfo/lang.c (iso8859_2_map): new encoding map.
+ (encoding_table): enable it.
+
+ * info/pcterm.c (pc_up_line): use MAX instead of max (no longer
+ defined). Reported by Richard Dawes.
+
+ * doc/texinfo.txi (documentencoding): mention that all processors
+ recognize the command.
+
+2003-03-30 <karl@gnu.org>
+
+ * makeinfo/lang.c (cm_special_character): incorrectly added html
+ sequences for @oe and @OE even in info output.
+
+2003-03-25 <karl@gnu.org>
+
+ * util/srclist.txt (COPYING): get from gnulib/doc, not gnulib.
+
+2003-03-24 <karl@gnu.org>
+
+ * TODO: need to write real definition of Info format.
+
+ * makeinfo/node.c (cm_node): use &nbsp; instead of ` ', to avoid
+ line breaks.
+
+2003-03-22 <karl@gnu.org>
+
+ * makeinfo/node.c (cm_node): output a space after the Node: and
+ similar headers, since Bob wants one.
+
+ * info/pcterm.c (MIN,MAX): moved to system.h.
+ * info/session.c (MIN): moved to system.h.
+ * makeinfo/sectioning.c (MIN): move to system.h.
+ * lib/system.h (MIN,MAX): define here.
+
+ * makeinfo/sectioning.c (sectioning_html): don't go smaller than <h3>.
+ Reported by Bob.
+ (MIN): new macro.
+
+ * info/session.c (MIN) [MIN]: #undef first if already #define'd.
+
+ * doc/texinfo.tex (\nodexxx): use a control sequence instead of
+ brackets to parse the parts of @node. Otherwise node names with
+ brackets cause spurious output. Reported by Bob.
+ (\xrefprintnodename): separate this out from
+ \xrefX, for easier redefining by Bob.
+
+2003-03-18 <karl@gnu.org>
+
+ * makeinfo/insertion.c (cm_item): ensure we don't go off the end
+ of the string when using strncmp. From: Peter N Lewis
+ <peter@stairways.com.au>, 13 Mar 2003 16:08:27 +0800.
+
+ * doc/texinfo.txi (Raw Formatter Commands): mention using \gdef
+ within @tex, not \def.
+
+2003-03-12 <karl@gnu.org>
+
+ * doc/texinfo.txi (Preparing for TeX): mention extra colons.
+
+2003-03-07 <karl@gnu.org>
+
+ * doc/texinfo.tex (\/): new command to allow a line break.
+ (\ptexslash): for saving/restoring primitive \/ in @tex.
+ * makeinfo/cmds.c (command_table): add "/" (as cm_no_op).
+ * makeinfo/makeinfo.c (self_delimiting): add /.
+ * doc/texinfo.txi (Line Breaks, Command Summary): document it.
+ Suggestion from wl.
+
+ * doc/texinfo.tex (\hyphenation): time-stamp.
+
+2003-03-06 <karl@gnu.org>
+
+ * info/session.c (nearest_xref): new fn.
+ (info_menu_or_ref_item): call it when we are
+ searching for xrefs, instead of just looking on
+ the current line.
+ * info/info-utils.c (info_copy_reference): new fn.
+ * info/info-utils.h (info_copy_reference): declare.
+ Bug report from: rich@phekda.freeserve.co.uk,
+ 04 Mar 2003 17:51:47 +0000.
+
+ * */.gdbinit: set env MALLOC_CHECK_.
+
+ 2003-03-06 Ralph Schleicher <rs@nunatak.allgaeu.org>
+ * makeinfo/files.h (get_file_info_in_path): Declare function.
+ * makeinfo/files.c (get_file_info_in_path): Remove static keyword.
+ * makeinfo/makeinfo.c (cm_image): Lookup image file name in the
+ search path for include files.
+
+2003-03-05 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): always make
+ subdirectory for html. Before, if the current directory happened
+ to be named `foo' and the @setfilename was foo.info, we would
+ write the split html files into the current directory. Reported
+ by rich@phekda.freeserve.co.uk, 01 Mar 2003 12:03:13 +0000.
+
+ * makeinfo/files.c (filename_part): simplify assignment.
+
+2003-02-24 <karl@gnu.org>
+
+ * makeinfo/insertion.c (get_item_function): check for @item in
+ argument to @itemize. Report from: Dumas Patrice
+ <dumas@centre-cired.fr>, 24 Feb 2003 13:13:52 +0100.
+
+ * makeinfo/makeinfo.c (remember_brace): say `braces' instead of
+ `{...}', since often we don't actually expect text inside the
+ braces.
+
+2003-02-21 <karl@gnu.org>
+
+ * aclocal.m4: automake 1.7.3.
+
+2003-02-19 <karl@gnu.org>
+
+ * doc/info-stnd.texi: omit all node pointers.
+
+2003-02-18 <karl@gnu.org>
+
+ * util/texindex.c (maketempname): use already-set `tempdir' instead
+ of half-redoing the logic.
+ (concat): only need two args, not three; change callers.
+ (perror_with_name): really call perror, putting
+ the name first a la gcc.
+ (pfatal_with_name): call perror_with_name.
+
+ * util/texi2dvi (get_xref_files): a file whose first line is
+ \input texinfo is not an index file. Report from: Anton Ertl
+ <anton@a0.complang.tuwien.ac.at>, 18 Feb 2003 14:41:47 +0100.
+
+2003-02-16 <karl@gnu.org>
+
+ * makeinfo/index.c (init_indices): don't try to free indexes that
+ undefindex already freed. Report from: Arkadiusz
+ Miskiewicz <misiek@pld.ORG.PL>,
+ 15 Feb 2003 13:22:49 +0100.
+
+ * configure.ac (curses): forgot to quote arg to AC_TRY_LINK.
+ From vojta and te, 16 Feb 2003 01:37:09 +0100.
+
+2003-02-13 <karl@gnu.org>
+
+ * makeinfo/insertion.c (begin_insertion): for html cartouche
+ output, add class="cartouche". Suggestion from Stephen.
+
+2003-02-11 <karl@gnu.org>
+
+ * Installed patch:
+ 2003-02-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+ * info/indices.c, info/info.c, info/info.h, info/nodemenu.c,
+ info/session.c, info/window.c, makeinfo/defun.c, makeinfo/html.c,
+ makeinfo/index.c, makeinfo/insertion.c, makeinfo/makeinfo.c,
+ makeinfo/makeinfo.h, makeinfo/node.c: declare all constant
+ strings as such in order to avoid lots of gcc warnings (for
+ --disable-nls and maybe without that as well).
+
+ * doc/texinfo.tex (\registeredsymbol): new command for Arnold.
+
+ * util/dir-example: dc to basics.
+
+ * doc/texinfo.txi (Defining Macros): document new requirements on
+ macro names. Report from: Alper Ersoy
+ <dirt@gtk.org>, 11 Feb 2003 05:11:35 +0200.
+
+2003-02-07 <karl@gnu.org>
+
+ * makeinfo/insertion.c (begin_insertion): output a table with a border
+ for @cartouche.
+ (end_insertion): end the table.
+ From: Joshua N Pritikin <vishnu@pobox.com>,
+ 7 Feb 2003 21:59:49 +0530.
+
+2003-02-05 <karl@gnu.org>
+
+ * info/info.c (short_options): add h.
+ (main): treat -h same as --help.
+ From: rwhron@earthlink.net, 31 Aug 2002 19:56:57 -0400.
+
+ * info/session.c (show_isearch_prompt): compute length of
+ translated "Failing ", don't assume 20 is enough.
+ (It's 21 bytes in UTF-8 Russian.)
+ Report from: varg@thsun1.jinr.ru,
+ 25 Jul 2002 15:26:42 +0400.
+
+ * info/display.c (display_update_one_window): don't derefence null
+ `entry' (if the screen is very small).
+ From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>,
+ 8 Jul 2002 15:21:14 -0700.
+
+ * doc/.cvsignore: ignore *.info and texput.log.
+
+2003-02-04 <karl@gnu.org>
+
+ * Version 4.5 (that info bug was a killer).
+
+ * configure.ac (AC_CHECK_HEADERS): test for sys/stream.h.
+ (sys/ptem.h): write separate test since it needs
+ sys/stream.h on Solaris. From: Lars Hecking
+ <lhecking@nmrc.ucc.ie>, 4 Feb 2003 19:47:54 +0000.
+
+ * doc/texinfo.txi: comment about using @example instead of
+ @verbatim due to automake doesn't apply any more.
+
+2003-02-03 <karl@gnu.org>
+
+ * doc/texinfo.tex (\verbatiminclude): use \other instead of 12.
+
+2003-02-02 <karl@gnu.org>
+
+ * doc/texinfo.tex (\cartouche): explicit \par, as @cartouche does
+ not work inside a paragraph.
+ Bug report from: Stephen Gildea <gildea@intouchsys.com>,
+ 15 Oct 1999 09:25:31 EDT.
+
+2003-02-01 <karl@gnu.org>
+
+ * util/fix-info-dir, util/gen-dir-node, util/install-info-html,
+ util/tex3patch, util/txitextest: test && test instead of test -a, etc.
+ From: Paul Eggert <eggert@twinsun.com>,
+ 31 Jan 2003 22:59:35 -0800.
+
+2003-01-31 <karl@gnu.org>
+
+ * doc/texinfo.tex (\groupbox): \newbox.
+ (\vfilllimit): new \def.
+ (\group): insert an explicit \page if the group is
+ big, and doesn't fit on the current page.
+ Otherwise, the previous page gets stretched unreasonably.
+ From: Werner LEMBERG <wl@gnu.org>,
+ 31 Jan 2003 19:19:33 +0100.
+
+ * doc/texinfo.tex (\defargscommonending): insert \penalty10002.
+ (\parsebodycommon): check for \penalty10002 to
+ allow a breakpoint between @def's, not 10000.
+
+ * doc/texinfo.tex (\defargscommonending): new macro.
+ (\defunargs, etc.): call it, instead of repeating code.
+ (No functional change.)
+
+ * info/filesys.c (extract_colon_unit): return last colon unit
+ before claiming we're done. Report from: Alexandre Duret-Lutz
+ <duret_g@lrde.epita.fr>, 31 Jan 2003 18:18:22 +0100.
+
+ * Version 4.4.
+
+2003-01-30 <karl@gnu.org>
+
+ * doc/texinfo.tex (\dosubind): need full expansion of the index
+ sort string.
+
+ * doc/texinfo.tex (\startcontents,\contents,\shortcontents):
+ assignments to \pageno must be \global; otherwise
+ if it's run inside a group, as in
+ @ifnothtml
+ @contents
+ @end ifnothtml
+ the rest of the pages in the document get roman numerals.
+ Reported by rlp.
+
+ * doc/texinfo.tex (\dosubind): need space between entry and
+ subentry in printed output. Bug report from: Robin Lee Powell
+ <rlpowell@digitalkingdom.org>, 30 Jan 2003 15:13:48 -0800.
+ (\defophead, \defcvarhead, \defivarheader): show
+ method name in \code.
+
+ * doc/texinfo.tex (\dosubind): need to \vskip-\skip0, not
+ -\lastskip, since \lastskip gets cleared by the \nobreak. Bug
+ report from: Werner LEMBERG <wl@gnu.org>, 29 Jan 2003 09:18:16
+ +0100.
+
+2003-01-29 <karl@gnu.org>
+
+ * info/signals.c (initialize_info_signal_handler): initialize the
+ sigaction struct here, not statically, since we can't rely on the
+ ordering of the elements; it's different on IRIX and FreeBSD, at
+ least. Patch from: ezra peisach <epeisach@med-xtal.bu.edu>, 28
+ Jan 2003 13:09:18 -0500 (EST).
+
+2003-01-28 <karl@gnu.org>
+
+ * util/dir-example: bring emacs section up to date.
+
+2003-01-27 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.3d.
+
+ More changes to use @ fully in the .aux file, otherwise something
+ as simple as:
+ @node foo
+ @section @code{foo}
+ was broken.
+ * doc/texinfo.tex (\setref): call \atdummies.
+ (\atdummies): new macro, based on \indexdummies.
+ (\commondummies): separate out common redefinitions.
+ (\lbraceatcmd,\rbraceatcmd): @{ and @}, as strings.
+
+ * configure.ac (AC_CHECK_FUNCS): add sigaction.
+ * info/signals.c (set_termsig) [HAVE_SIGACTION]: second arg to
+ sigaction is a pointer, not a struct.
+
+ From: AIDA Shinra <aida-s@jcom.home.ne.jp>, 25 Jan 2003 18:53:19 +0900:
+ * info/signals.c (mask_termsig,set_termsig,restore_termsig): new fns.
+ (initialize_info_signal_handler): use sigaction if we have it.
+ (info_signal_proc): reread window size in case it has changed
+ while we were suspended.
+
+ Mon Jan 27 08:09:07 CET 2003 Stepan Kasal <kasal@math.cas.cz>
+ * doc/texinfo.tex (\acuteaccent): the workaround is no longer needed.
+ (\xrefX): \normalturnoffactive changed to \turnoffactive, since
+ we \otherbackslash right afterwards anyway.
+
+2003-01-24 <karl@gnu.org>
+
+ * doc/texinfo.tex: These changes allow ' in node and anchor names:
+ (\internalsetq): use @ instead of ' as the escape
+ character for .aux files.
+ (\xrdef): don't need to play games with \ now.
+ (\readauxfile): don't set catcode' to 0, and do
+ set catcode@ to 0.
+
+ These changes allow \ in node and anchor names
+ (this worked once, but we broke it somewhere along the line):
+ (\setref, \xrefX, \dosetq, \refx): call \otherbackslash.
+ (\otherbackslash): new macro to make an active
+ backslash expand to a literal `\' character with
+ catcode other.
+
+
+ * configure.ac: pretest version 4.3c.
+
+ * doc/texinfo.tex (\smallenvironments): remove, and change callers.
+ (\small...x): rename to just \small...
+ (\smallexamplefonts): set to \smallfonts, not
+ \smallerfonts, at least until people complain again.
+
+ The effect of these changes is to make the
+ @small... commands print in a smaller font (9pt)
+ for all formats, not just @smallbook and @afivepaper.
+
+
+ * info/filesys.c (extract_colon_unit): rewrite so that an empty
+ unit does not stop us from processing the rest. Report from:
+ Werner LEMBERG <wl@gnu.org>, 24 Jan 2003 07:01:09 +0100.
+
+
+ Date: Mon, 02 Dec 2002 01:06:37 +0900
+ From: AIDA Shinra <aida-s@jcom.home.ne.jp>
+
+ * "info infokey" says key bindings in .info take precedence over
+ the default mapping, but this is not true. Only bindings to
+ undefined keys take effects.
+ * Binding to "invalid" action results crash.
+ * No code to disable prefix keys. Some users might want to bind
+ escape or C-x to a non-prefix key, but this does not allowed.
+ ... It always allows '^h' in incremental
+ search. Some terminals map 'backspace' to '^h' by default.
+
+ These are the changes:
+ * info/session.c (incremental_search): check for Control('h') as
+ well as DEL.
+ * info/infomap.c (find_function_keyseq, add_function_keyseq,
+ remove_function_keyseq): new fns.
+ (keymap_copy_keymap, keymap_discard_keymap): take
+ rootmap arg.
+
+Wed Jan 22 14:25:39 CET 2003 Stepan Kasal <kasal@math.cas.cz>
+
+ * doc/texinfo.tex (\footnotezzz): the very beginning was moved
+ to \startfootins;
+ (\startfootins): new macro;
+ (\multitable, \dotable): redefine \startfootins to get footnotes
+ saved, use \crcrwithfootnotes;
+ (\crcrwithfootnotes): check for postponed footnotes each time a row
+ of a multitable is finished;
+ (\tab): no longer defined globally, just \let to & inside
+ @multitable.
+
+2003-01-22 <karl@gnu.org>
+
+ * doc/texinfo.tex: doc fix.
+ * doc/texinfo.tex (\dofootnote): rename from \footnotezzz.
+
+ Wed Jan 22 14:23:51 CET 2003 Stepan Kasal <kasal@math.cas.cz>
+ * doc/texinfo.tex (\cartouche, \footnotezzz): removed \long, it
+ has no effect for macros without a parameter;
+ (\fo@t, \f@@t, \f@t, \@foot): removed, local \def has no effect.
+
+2003-01-21 <karl@gnu.org>
+
+ * doc/texinfo.txi (Output Formats): new section.
+
+2003-01-19 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.3b.
+
+ * makeinfo/tests/include-value: need -I $srcdir.
+
+ * util/texindex.c:
+ * util/install-info.c:
+ * info/infokey.c:
+ * info/info.c:
+ * makeinfo/makeinfo.c:
+ * util/texi2dvi: 2003.
+
+2003-01-18 <karl@gnu.org>
+
+ * makeinfo/node.c: add `(perhaps incorrect sectioning?)' to some of
+ the error messages. Unfortunately we can't easily
+ determine when the error stems from actual
+ mistyped node pointers, and when from incorrect
+ menus causing the implicit pointer creation to fail.
+
+2003-01-17 <karl@gnu.org>
+
+ Thu Jan 16 10:28:32 CET 2003 Stepan Kasal <kasal@math.cas.cz>
+ * doc/texinfo.tex (\refx): Set locally \indexdummies before expanding
+ the \csname, in case there are macros; foreign accents, for example.
+ Bug report from Dumas Patrice <dumas@centre-cired.fr>.
+
+ * makeinfo/makeinfo.c (COMMAND_CHAR): new macro, and exclude ^ and
+ _ from command names.
+ (read_token): call it.
+
+ * makeinfo/makeinfo.h (command_char): move to makeinfo.c, since
+ it's only used in one place.
+
+2003-01-16 <karl@gnu.org>
+
+ * TODO: @else
+
+2003-01-12 <karl@gnu.org>
+
+ * doc/texinfo.tex (\dounmacro): simplify method for removing from
+ macro list. From Stepan. (Also rename from \unmacroxxx.)
+ (\unmacrodo): new macro, called with new method.
+
+ * doc/texinfo.tex (\dotChar, questChar, exclamChar, colonChar,
+ semiChar, commaChar, underChar): names for catcode chars, defined using
+ \chardef. From Stepan.
+
+ * doc/texinfo.tex (\conditionalsucceed): back to the easy
+ definition, since @set is global now. From Stepan.
+
+ * doc/texinfo.tex (\doifclear,\doifset): use \let\next instead of
+ \expandafter, so that we'll succeed on no
+ conditional text. From Stepan.
+ Also rename from \ifclearxxx and \ifsetxxx.
+
+ * doc/texinfo.tex (\expandablevalue): give a \message if the
+ variable is not set. Based on patch from Stepan.
+
+ * doc/texinfo.tex (\setuptable): insert an actual \space after
+ \unskip. From Stepan.
+
+ * doc/texinfo.tex (\kbdinputstyle): give error if unknown argument,
+ and call the macro to set the default. From Stepan.
+
+ * doc/texinfo.tex: typo from Stepan.
+
+ * doc/texinfo.tex (\docenter): rename from \centerzzz and do \hfil
+ instead of using plain's \centerline and \hss. Also force line
+ breaks before and after in horizontal mode.
+ Based on patch from Stepan, 11 Apr 2000 19:44:31 +0200.
+
+ * doc/texinfo.tex: use \other and \active consistently.
+ From: Stepan Kasal <kasal@suse.cz>, 11 Apr 2000 19:44:31 +0200.
+
+ * makeinfo/cmds.c (handle_include): call text_expansion on the
+ filename, so @value constructs are expanded.
+
+ * doc/texinfo.txi (verbatiminclude, Using Include Files): mention
+ @value expansion.
+ Also, update samples to be copyright 2003.
+
+ * doc/texinfo.tex (\doverbatiminclude, \verbatimzzz): expand
+ @value(but nothing else).
+ Bug from: Alper Ersoy <aersoy@tfz.net>,
+ 6 Jan 2003 13:14:28 +0200.
+
+2003-01-11 <karl@gnu.org>
+
+ * doc/texinfo.tex (\definedummyword): new macro.
+ (\indexdummies): call it, instead of defining each
+ command separately; many trailing spaces had been omitted.
+ Alternate implementation of a patch from: Stepan
+ Kasal <kasal@math.cas.cz>, 10 Jan 2003 22:42:05 +0100.
+
+ * doc/texinfo.tex (\acuteaccent): new defn.
+ (\indexdummies): use it instead of \' in the aux file.
+ Variation of a patch from: Stepan Kasal <kasal@math.cas.cz>,
+ 10 Jan 2003 21:28:40 +0100.
+
+ * doc/texinfo.tex: doc fix.
+
+2003-01-10 <karl@gnu.org>
+
+ * doc/texinfo.tex (\indexnofonts, \indexdummies): handle more
+ accent commands.
+ (\indexdummyfont): not needed, use \asis instead.
+
+ * doc/texinfo.tex (\indexdummies,\indexnofonts): indent, no other
+ changes.
+
+ * doc/texinfo.tex (\chapter .. \subsubsection): indent the
+ definitions; no other change.
+
+ * doc/texinfo.txi (Macro details): no multiple-line args is
+ another limitation.
+
+ Fri Jan 10 07:12:23 CET 2003 Stepan Kasal <kasal@math.cas.cz>
+ * texinfo.tex (\writetocentry): The
+ common work on building the line for \write\tocfile was
+ moved into the macro itself and thus all callers has been changed.
+
+2003-01-09 <karl@gnu.org>
+
+ * info/session.c (incremental_search): don't interpret the
+ `function' element as an InfoCommand when it's really a Keymap.
+ This caused arrow keys to be inserted literally under Solaris, but
+ not GNU/Linux. Bug report from: Jeremy Lin
+ <jjlin@OCF.Berkeley.EDU>, 5 Jan 2003 01:59:29 -0800.
+
+ * info/infomap.c: add comment about strange pointer cast.
+
+2003-01-08 <karl@gnu.org>
+
+ * doc/texinfo.tex (\ignoremorecommands): define \Edef... and
+ \def...x for all @def... commands, and use \empty
+ instead of \relax. Bug report from Paul Eggert
+ <eggert@twinsun.com>, 7 Jan 2003 22:29:07 -0800.
+
+2003-01-06 <karl@gnu.org>
+
+ * doc/texinfo.txi (table): mention @option as a useful indicating
+ command, and need for blank lines before and
+ after. Suggestion from: Kevin Ryde
+ <user42@zip.com.au>, 03 Jan 2003 10:02:55 +1000.
+
+2003-01-05 <karl@gnu.org>
+
+ * util/texi2dvi: make egrep a variable (EGREP). Suggestion from:
+ Kurt Hornik <hornik@ci.tuwien.ac.at>.
+ Also, replace fgrep with grep.
+
+ * doc/Makefile.am (TXI_XLATE): include txi-tr.tex from Alper Ersoy
+ <dirt@gtk.org>.
+
+2003-01-02 <karl@gnu.org>
+
+ * makeinfo/insertion.c (end_insertion): in table case, call
+ close_insertion_paragraph. Bug report from: Kevin
+ Ryde <user42@zip.com.au>, 03 Jan 2003 08:09:54 +1000.
+
+ * doc/texinfo.tex: remove spurious CTRL-G.
+
+ * util/srclist.txt: more m4 files from gnulib now.
+
+2003-01-01 <karl@gnu.org>
+
+ * doc/texinfo.tex (\_): more space afterwards, so __ comes out
+ better. Noticed in the gcc manual.
+
+2002-12-31 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (usage): omit all the help message when something
+ goes wrong in argument parsing, as intended.
+
+2002-12-26 <karl@gnu.org>
+
+ * doc/texinfo.tex (\insertcopying): ignore @c, @comment, and
+ @ignore...@end ignore as best we can. Report from
+ "Joseph S. Myers" <jsm28@cam.ac.uk>, 24 Dec 2002
+ 18:08:10 +0000 (GMT), for the gcc manual, which
+ uses these constructs for automatic man page generation.
+
+2002-12-23 <karl@gnu.org>
+
+ * doc/texinfo.txi (example): note that Texinfo commands are
+ expanded, plus other changes. Suggestion from Nelson Beebe.
+
+2002-12-20 <karl@gnu.org>
+
+ * config.guess: update from prep.
+
+2002-12-17 <karl@gnu.org>
+
+ * makeinfo/texinfo.dtd (indexterm): index not INDEX.
+ (node): only any block, not just para|menu.
+ * makeinfo/xml.c (texinfoml_element_list): format and like can
+ contain para.
+ From: Alper Ersoy <aersoy@tfz.net>.
+
+2002-12-14 <karl@gnu.org>
+
+ * doc/texinfo.txi (makeinfo in Emacs): does not prompt for
+ filename.
+ From: Kevin Ryde <user42@zip.com.au>.
+
+2002-12-13 <karl@gnu.org>
+
+ * doc/texinfo.txi: short sample needs @top (from jas), gnu sample
+ can use @verbatim (automake fix).
+
+2002-12-11 <karl@gnu.org>
+
+ * doc/texinfo.txi: typos.
+
+2002-12-07 <karl@gnu.org>
+
+ * makeinfo/xml.c: use lowercase, allow more chars in id's. From:
+ Jaime Davila <jdavila@engr.uconn.edu>, 6 Dec 2002 11:00:25 -0500.
+
+2002-12-05 <karl@gnu.org>
+
+ * util/dir-example: alphabetize make.
+
+ * NEWS: change texinfo.tex url.
+
+ * doc/texinfo.tex (\obstexwarn): fix url's to TeX.README and
+ texinfo.tex.
+
+2002-12-02 <karl@gnu.org>
+
+ * doc/texinfo.txi (Line Breaks): fixes.
+
+2002-12-01 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.3a.
+
+2002-11-30 <karl@gnu.org>
+
+ * doc/Makefile.am (texinfo): restore rule since this won't quite
+ be fixed until automake 1.7.2 or later.
+
+2002-11-29 19:19 feloy
+
+ * makeinfo/xml.c: Fix the <para>&lt; bug in XML, reported by K.
+ Ryde
+
+2002-11-29 <karl@gnu.org>
+
+ * lib/strdup.c: gnulib update.
+
+2002-11-29 Alexandre Duret-Lutz <adl@gnu.org>
+
+ * doc/Makefile.am (.texi.info, texinfo): Remove. Automake 1.7+
+ no longer output info files in the source tree.
+
+2002-11-26 <karl@gnu.org>
+
+ * makeinfo/insertion.c (cm_insertion_copying): flush_output, so that
+ output_position gets updated, which in turn makes
+ the tag table positions reflect the copying text.
+ Report from: "W. L. Estes" <wlestes@uncg.edu>, 15
+ Nov 2002 15:57:04 -0500.
+
+ * makeinfo/index.c (init_indices): undefindex after we know
+ name_index_alist[i] is not null.
+ From: "Ronald F. Guilmette" <rfg@monkeys.com>, 26 Nov 2002
+ 01:08:04 -0800.
+
+ * doc/Makefile.am (texinfo): depend on version
+ files. Report from: Kevin Ryde
+ <user42@zip.com.au>, 27 Nov 2002 07:52:57 +1000.
+
+2002-11-25 <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_verb): use <tt> not <pre>, as this is an
+ inline construct. Also, decrement
+ in_fixed_width_font, else the next paragraph does
+ not get a <p>.
+ Report from: Torsten Bronger <bronger@physik.rwth-aachen.de>
+ 26 Nov 2002 00:37:35 +0100.
+
+ * doc/texinfo.tex (\dospecials): must include all other characters
+ that we set active, namely <>|_", or they got
+ mysteriously lost as the first character on a
+ verbatim line.
+ Report from: Torsten Bronger <bronger@physik.rwth-aachen.de>
+ 25 Nov 2002 18:26:12 +0100.
+
+ (\doverbatim): ignore everything up to the first
+ ^^M, to avoid an extra blank line in the output.
+
+ * lib/getopt*, strdup.c, tempname.c: update from gnulib (bruno
+ changes + gpl).
+
+2002-11-24 <karl@gnu.org>
+
+ * doc/texinfo.txi (Multiple Spaces): xref tie rather w for
+ unbreakable spaces.
+
+2002-11-22 <karl@gnu.org>
+
+ * doc/texinfo.txi: editorial changes from Max's editor.
+
+2002-11-21 <karl@gnu.org>
+
+ * doc/texinfo.txi (Conventions): add item for blank lines as
+ paragraph separator. Report from: Maxim Masiutin
+ <max@ritlabs.com>, 21 Nov 2002 00:03:07 +0200.
+
+2002-11-19 <karl@gnu.org>
+
+ * util/install-info.c (ensure_dirfile_exists): don't translate the `*
+ Menu' keyword. Report from: Ingo Krabbe
+ <i.krabbe@dokom.net>, 19 Nov 2002 09:24:45 +0100.
+
+2002-11-18 <karl@gnu.org>
+
+ * po/.cvsignore: exclude *.gmo instead of listing each individually.
+ From: Frédéric L. W. Meunier <0@pervalidus.net>,
+ 15 Nov 2002 20:16:09 -0200 (BRST).
+
+ * configure.ac (--enable-multiplatform): new option for teTeX and
+ TeX Live. From te.
+
+2002-11-14 <karl@gnu.org>
+
+ * configure.ac, util/texi2dvi, NEWS: release version 4.3.
+
+ * util/texi2dvi, mkinstalldirs: use `for var<newline>do"' instead
+ of `for var; do', for Solaris.
+
+ * doc/texinfo.txi (math): emphasize that makeinfo does not interpret
+ the arg.
+
+ * config.{guess,sub}: update from prep.
+
+2002-11-13 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.2f.
+
+ * makeinfo/xml.c (INDEX_SEP): define as a string that will never
+ appear, so that we don't try to break index terms
+ at commas. Idea from: Stepan Kasal
+ <kasal@math.cas.cz>, problem reported by José
+ Fonseca <j_r_fonseca@yahoo.co.uk>.
+
+2002-11-12 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: make sure command is non-null, for sake of bogus
+ input (\def\x{}). Report from
+ Neil.Turton@broadcom.com, debian bug#168689.
+
+ * makeinfo/Makefile.am (makeinfo_SOURCES): remove docbook.[ch],
+ per feloy the docbook stuff is in xml.[ch] now.
+
+2002-11-12 19:48 feloy
+
+ * makeinfo/: lang.c, makeinfo.c: (docbook) Entities for accented
+ characters are written correctly
+
+2002-11-12 19:34 feloy
+
+ * makeinfo/xml.c: (docbook) Do not expand @set contents
+
+2002-11-11 18:14 feloy
+
+ * makeinfo/xml.c: Better <bookinfo> support
+
+2002-11-11 13:37 feloy
+
+ * makeinfo/: cmds.c, insertion.c, xml.c, xml.h: Better use of
+ <bookinfo> and <abstract> with docbook output
+
+2002-11-11 01:57 feloy
+
+ * makeinfo/: defun.c, xml.c, xml.h: Removed all references to
+ docbook.[ch] which was the old sources for docbook output, replaced
+ by xml.[ch]
+
+2002-11-10 23:31 feloy
+
+ * makeinfo/: insertion.c, xml.c, xml.h: Some bugfixes in docbook
+ output
+
+2002-11-09 18:47 feloy
+
+ * makeinfo/insertion.c: In Docbook, Copying paragraph is not
+ inserted at @copying/@end copying point.
+
+2002-11-08 21:01 feloy
+
+ * makeinfo/xml.c: take care of indexterm at beginning of table
+
+2002-11-08 20:52 feloy
+
+ * makeinfo/xml.c: Text before first @item in @table is inserted as
+ the <title> of <variablelist>
+
+2002-11-08 20:24 feloy
+
+ * makeinfo/xml.c: subsubheading is simplesect and not sect3
+
+2002-11-08 19:13 feloy
+
+ * makeinfo/: makeinfo.c, xml.c, xml.h: makeinfo/xml.c (xml_id):
+ Added more forbidden characters makeinfo/{xml.c,xml.h,makeinfo.c}:
+ Defined xml_in_xref_token variable
+
+2002-11-07 <karl@gnu.org>
+
+ * makeinfo/sectioning.c: doc.
+ * makeinfo/sectioning.c: revert last change, it breaks gcc.
+
+ * makeinfo/xml.c (xml-add_char): don't insert BOOKINFO and ABSTRACT
+ if executing_string. From Jos? Fonseca.
+
+ * configure.ac: pretest version 4.2e.
+
+ From: José Fonseca <j_r_fonseca@yahoo.co.uk>,
+ 7 Nov 2002 00:31:28 +0000.
+ * makeinfo/index.c (cm_printindex): in docbook case, pass the
+ unexpanded index term.
+ * makeinfo/xml.c (xml_insert_indexterm): execute_string instead of
+ insert_string.
+ (Otherwise, <>& are not escaped in the docbook index output.)
+
+ * util/dir-example: sed.
+
+ * makeinfo/lang.c: copyright.
+ * makeinfo/lang.h: copyright.
+
+2002-11-07 Stephen Gildea
+
+ * makeinfo/sectioning.c (sectioning_html): have A tag enclose
+ section name rather than preceding it.
+
+ * makeinfo/toc.c (contents_update_html): put name attribute into
+ existing A tag rather than making a separate tag for it.
+
+2002-11-07 Stephen Gildea
+
+ * makeinfo/lang.c: support @documentencoding US-ASCII:
+ Put NULL at end of map tables so they can be of varying lengths.
+ (us_ascii_map): new iso_map_type table.
+ (encoding_table): add US_ASCII.
+ (cm_search_iso_map): don't assume all maps are the same length.
+ (cm_documentencoding): don't assume ISO_8859_1 is first table entry.
+ * makeinfo/lang.h (encoding_code_type): add US_ASCII.
+
+2002-11-05 <karl@gnu.org>
+
+ * doc/info-stnd.texi: untabify.
+ * doc/info-stnd.texi: document that.
+ * info/footnotes.c (auto_footnotes_p): turn off by default.
+
+ * info/infodoc.c (info_internal_help_text): had
+ scroll-{forward,backward} twice instead of {next,prev}-line.
+ * info/infodoc.c: untabify.
+
+ * util/texi2dvi: untabify.
+ * doc/texinfo.tex: untabify.
+ * util/texindex.c: untabify.
+ * util/install-info.c: untabify.
+ * makeinfo/makeinfo.c: indentation fix.
+ * makeinfo/cmds.c: doc fix.
+
+2002-11-04 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.2d.
+ * doc/fdl.texi: better line break to avoid overfull hbox.
+
+2002-11-04 Stephen Gildea
+
+ * makeinfo/{footnote.c,cmds.c,html.c,index.c,insertion.c,
+ makeinfo.c,node.c,toc.c,sectioning.c}: add a class attribute
+ to tags generated in special circumstances that wouldn't be
+ obvious to a user agent.
+
+ Quote all attribute values (for XHTML).
+
+2002-11-04 <karl@gnu.org>
+
+ * doc/texinfo.txi (File End): grammar.
+
+ These changes from gildea:
+ * makeinfo/cmds.c (cm_titlepage): new fn, and use it for @titlepage.
+
+ * makeinfo/cmds.h (titlepage_cmd_present): new global.
+ * makeinfo/html.c (html_output_head): check titlepage_cmd_present
+ before outputting the <h1>.
+
+ * makeinfo/html.c (html_output_head): put a class on the <h1> from
+ settitle.
+
+ * makeinfo/cmds.c (cm_titlefont): put the class directly on the h1
+ rather than a separate <span> element.
+
+2002-10-31 <karl@gnu.org>
+
+ * doc/texinfo.tex (\mathactive): new fn.
+ (\math): call it, to change definitions of active characters.
+ (\ptex{gtr,hat,less,plus}): save original characters.
+ Report from wl.
+
+ * doc/texinfo.tex (\itemzzz): \penalty10001 instead of 10000
+ before the putative \parskip.
+ (\aboveenvbreak): insert \parskip if penalty!=10000,
+ rather than <10000. Otherwise, @item some long item label /
+ @example has too little spacing.
+ Report from: Werner LEMBERG <wl@gnu.org>,
+ 26 Apr 2002 08:37:41 +0200 (CEST).
+
+ * makeinfo/makeinfo.c (executing_macro): new static.
+ (read_command): set it, if we execute a macro.
+ (add_char): if it is set, call html_output_head.
+ This is so if a macro expansion is first in the document body, the
+ html head gets written before the macro body.
+ Report from: Stephen Gildea <gildea@stop.mail-abuse.org>,
+ 10 Jul 2002 13:35:13 -0400.
+
+ * makeinfo/html.c (html_title_written),
+ * makeinfo/html.h (html_title_written): make available.
+ * makeinfo/cmds.c (cm_titlefont): set html_title_written for html
+ output.
+
+ * util/texindex.c: texindex.c (need_initials, first_initial): New
+ globals.
+ (main): Clear them for each index.
+ (parsefile): Set need_initials when there is more than one
+ initial in this index.
+ (indexify): Do not emit \initial commands unless need_initials
+ is set. Use toupper.
+
+ From: Zack Weinberg <zack@codesourcery.com>
+ Date: Tue, 26 Mar 2002 17:20:06 -0800
+
+ * lib/system.h: doc fix from gildea.
+
+2002-10-30 <karl@gnu.org>
+
+ (Following reported by Bob Wilson.)
+
+ * doc/texinfo.tex (\sectionheading): add either
+ \normalbaselineskip or \parskip after the heading, whichever is
+ larger, instead of hardwiring 10pt.
+
+ * doc/texinfo.tex (\defxbodycommon): new defn, including a
+ potential breakpoint if we have multiple consecutive @def...x commands.
+ (\def*parsebody): use it.
+
+ * doc/texinfo.tex (\singlespace): remove, since we fixed the
+ regular line spacing a long time ago to not be double-spaced.
+ In @smallbook mode, it ironically caused excessive line spacing.
+ (\nonfillstart, \quotation): don't call it.
+
+ * doc/texinfo.tex (\smartslanted, \smartitalic): use \ttsl if in
+ typewriter.
+ From: Bob Wilson <bwilson@tensilica.com>.
+
+ * doc/texinfo.tex (\defmethparsebody): pass \empty to \smallsplit
+ to keep a brace-delimited argument to @deffn from having the braces
+ stripped.
+ (Report from: Han-Wen Nienhuys <hanwen@cs.uu.nl>.)
+
+2002-10-28 <karl@gnu.org>
+
+ * doc/texinfo.tex (\loggingall): rewrite to minimize log file
+ output (ideas from Frank Mittelbach's trace.sty) and explicitly
+ show the etex changes.
+
+ * configure.ac: pretest version 4.2c.
+
+ * NEWS: mention Werner's fixes.
+
+2002-10-27 Werner Lemberg <wl@gnu.org>
+
+ * makeinfo/html.c (insert_html_tag): Fix handling of nested,
+ identical tags.
+
+2002-10-27 <karl@gnu.org>
+
+ * configure.ac (AM_INIT_AUTOMAKE): add dist-bzip2 option.
+
+2002-10-26 <karl@gnu.org>
+
+ * 2002-10-24 Werner Lemberg <wl@gnu.org>
+ Fix html font tags, i.e., make the output similar to
+ texinfo.tex. The main idea is to avoid nested font tags.
+
+ * makeinfo/html.c (push_tag, pop_tag): New functions.
+ (insert_html_tag): Use them.
+ Don't emit more than a single font attribute.
+
+ * makeinfo/html.h (HSTACK): New structure.
+
+ * makeinfo/defun.c: Include cmds.h and html.h.
+ (process_defun_args): Don't apply <i>...</i> to parentheses
+ and brackets.
+ (defun_internal): Use insert_html_tag for emitting font tags.
+
+ * makeinfo/cmds.c (cm_url): Use insert_html_tag for emitting
+ font tag.
+ (cm_r): Simplify.
+
+2002-10-25 Alexandre Duret-Lutz <adl@gnu.org>
+
+ * util/texi2dvi: Preserve empty components when expansing
+ TEXINPUTS and INDEXSTYLE.
+
+2002-10-24 <karl@gnu.org>
+
+ * doc/info-stnd.texi: missing period.
+
+ * m4/{check-decl.m4,mkstemp.m4,prereq.m4}: new files from gnulib.
+ * lib/mkstemp.c, lib/tempname.c: likewise.
+ * aclocal.m4, configure.ac: support for mkstemp instead of mktemp.
+ * util/texindex.c: use mkstemp instead of mktemp.
+
+ 2002-10-24 Alexandre Duret-Lutz <adl@gnu.org>
+ * util/texi2dvi: Turn relative entries $TEXINPUTS and $INDEXSTYLE
+ into absolute paths. (Allows --clean to work with relative dirs
+ in TEXINPUTS, etc.)
+
+ * doc/texinfo.tex: update \texinfoversion timestamp.
+
+2002-10-22 <karl@gnu.org>
+
+ 2002-10-16 Werner Lemberg <wl@gnu.org>
+
+ * texinfo.tex (\appendixbox): New macro to compute a
+ fixed-width box for the appendix entry in the TOC.
+ (\appendixzzz, \appendixentry): Use it.
+
+ (\shortconttt): New font.
+ (\summarycontents): Use it to set the font size of the \tt
+ font properly.
+
+ (\authortt): New macro.
+ (\authorfont): Use it to provide a proper font size for
+ @email used within @author.
+
+2002-10-21 <karl@gnu.org>
+
+ * automake 1.7.1.
+
+2002-10-18 <karl@gnu.org>
+
+ * doc/texinfo.tex (\defname): get rid of the unused
+ \deftypemargin; typeset the function type word flush right, in
+ brackets. Partially suggested by bob.
+
+2002-10-16 <karl@gnu.org>
+
+ * makeinfo/html.c: Just > after all on <meta> and <link> to
+ appease HTML 4.01 (and break XHTML). From Janis.
+
+2002-10-15 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.2b.
+
+ * makeinfo/cmds.c (cm_dots, cm_enddots): don't use small if
+ in_fixed_width_fonts; this violates the html specs, which don't
+ want you to change fonts within <pre>. (Argh.)
+ Report from: Janis Johnson <janis187@us.ibm.com>,
+ 14 Oct 2002 15:59:16 -0700.
+
+2002-10-14 Alexandre Duret-Lutz <adl@gnu.org>
+ * util/texi2dvi (common, txincludes): Fix definitions so that
+ an empty $txincludes doesn't result in a empty path element
+ in TEXINPUTS.
+
+2002-10-14 <karl@gnu.org>
+
+ * info/infokey.c: copyright 2002 not 02.
+ * makeinfo/lang.c: copyright 2001 not 01.
+
+ * makeinfo/insertion.c (begin_insertion): for enumerate, set
+ in_paragraph=0 as we do for itemize.
+ Otherwise a </p> gets inserted at the next @item, which is wrong.
+
+ Report from: Janis Johnson <janis187@us.ibm.com>, 14 Oct 2002
+ 12:35:30 -0700.
+
+2002-10-13 <karl@gnu.org>
+
+ * util/install-info.c (longopts): make --infodir a synonym for
+ --info-dir, for some compatibility with the Debian install-info.
+ Reported by Bob Chassell, Yves Codet <ycodet@club-internet.fr>,
+ and many others.
+
+ * doc/texinfo.txi (makeinfo advantages): document various options
+ that have crept in to the source. (Werner Lemberg noted that
+ --iftex and companions were missing.)
+
+2002-10-10 <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_tie): new fn for new cmd @tie{}.
+ * doc/texinfo.txi: document it.
+
+2002-10-09 <karl@gnu.org>
+
+ * doc/texinfo.txi: recommend free software directory categories
+ (suggestion from rms),
+ more info about @noindent (fut_nis@d3.dion.ne.jp and ryk@dspwiz.com),
+ version specification (spectorhome@rcn.com).
+
+ * makeinfo/{cmds,footnote,html,insertion,makeinfo,multi,node}.c:
+ use <br /> instead of plain <br>, for the sake of XHTML. Likewise
+ with <hr /> and <meta />, and quote all <meta> values.
+ Suggestion (and assurance of compatibility) from
+ Janis Johnson <janis187@us.ibm.com>
+ and Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+ (the gcc web page maintainers).
+
+ * util/infosrch: new contrib script.
+ * util/Makefile.am (EXTRA_DIST): add infosrch.
+
+2002-10-04 <karl@gnu.org>
+
+ * configure.ac: pretest version 4.2a.
+
+ * TODO: more info on dir categories.
+
+2002-10-02 <karl@gnu.org>
+
+ * doc/.cvsignore: ignore tex output files.
+
+ * util/dir-example: remove unused categories, etc.
+
+2002-10-01 <karl@gnu.org>
+
+ * doc/texinfo.tex (\xml,\ifxml): more \doignore's.
+ (\copying,\insertcopying): new implementation to save the uninterpreted
+ tokens instead of typesetting a box, so that the page size, fonts,
+ etc., don't have to be defined before @copying is run.
+
+ These changes from Werner Lemberg <wl@gnu.org>:
+ (\internalpagesizes): take two new arguments for the physical paper
+ height and width.
+ (\smallbook,\afourpaper,\afivepaper,\letterpaper,\afourwide,
+ \pagesizes): pass them.
+
+2002-09-30 <karl@gnu.org>
+
+ * util/texi2dvi: doc fixes.
+
+ * README: mention autoreconf.
+
+2002-09-29 <karl@gnu.org>
+
+ * doc/texinfo.tex (\pdfmakeoutlines): call \turnoffactive to handle all special characters
+ except \{}.
+ (\normalturnoffactive): call \turnoffactive instead of repeating all the
+ redefinitions.
+
+ * doc/texinfo.tex (\afourpaper, \afourlatex, \afourwide): new
+ formatting values.
+ From: Eric.Belpaire@equant.com, 30 Aug 2002 19:03:30 +0200.
+
+ * aclocal.m4: $Id now omitted.
+
+ * doc/texinfo.txi: document @xml and @ifxml.
+
+ * makeinfo/makeinfo.c (usage): mention the new options.
+ * info/Makefile.am (BUILT_SOURCES): define this unconditionally,
+ no more TEXINFO_MAINT. We handle it in the top-level
+ Makefile.am by defining distcleancheck_listfiles.
+
+ * acinclude.m4: can't have $Id, then it gets propagated to
+ aclocal.m4.
+
+ From: Philippe Martin <feloy@free.fr>, 11 Aug 2002 20:17:44 +0200.
+ * makeinfo/cmds.c: new commands @ifnotxml, @ifxml, @xml.
+ * insertion.c: likewise.
+ (cm_ifxml, cm_ifnotxml): new functions.
+ * insertion.h: likewise.
+ * makeinfo.c: new options --ifxml, --no-ifxml.
+ (cm_image): better xml output.
+ * makeinfo.h (process_xml): new global.
+ * xml.c: call xml_close_sections.
+
+2002-09-28 <karl@gnu.org>
+
+ * makeinfo/insertion.c (begin_insertion): only do <pre>, not
+ <br><pre>; suggestion from Werner.
+
+ * info/infodoc.c: document the bug regarding where_is_rep_index,
+ but don't fix it since it's in the [!INFOKEY] code.
+
+ 2002-05-18 Eli Zaretskii <eliz@is.elta.co.il>
+ These changes make @example be indented in HTML output, and make
+ @exdent work inside an @example in HTML.
+
+ * makeinfo/insertion.c (begin_insertion) <example>: Insert spaces
+ after <pre> to produce indentation of the first line in HTML mode.
+
+ * makeinfo/makeinfo.c (indent): Do indent even in HTML mode.
+
+ These patches from: Thierry Vignaud <tvignaud@mandrakesoft.com>,
+ 24 Apr 2002 20:52:37 +0200.
+
+ * makeinfo/insertion.c: doc fix.
+
+ * info/infomap.c: had h and l functions reversed in vi mode.
+
+ * util/install-info.c: bzip2 support.
+
+ * util/texi2dvi: don't allow whitespace as one of the ?'s around
+ the o in foo.?o?, that could lead to misparsing.
+
+2002-09-27 <karl@gnu.org>
+
+ * doc/Makefile.am (*.1): call the binary, not the source file.
+
+ * util/texindex.c (sort_in_core): int not off_t.
+ (main): cast argument to sort_in_core to int.
+ (sort_offline): nfiles parameter is not actually passed (or used);
+ need to pass &tempfiles[i] to sort_in_core.
+ From: Christopher League <league@contrapunctus.net>,
+ 26 Apr 2002 22:45:45 -0400.
+
+ * doc/texinfo.tex (\unnumb...entry): make analogous to \...entry
+ (except when actually outputting the text, of course), so pdf
+ bookmarks can go to the right level.
+ From: Christopher League <league@contrapunctus.net>,
+ 25 Apr 2002 15:29:24 -0400.
+
+ * install-sh: update from gnulib.
+
+ * makeinfo/insertion.c (handle_verbatim_environment): need to
+ quote & and <.
+ From: Philippe Martin <feloy@free.fr>, 18 Aug 2002 15:39:10 +0200.
+
+ 2002-06-04 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/cmds.c (cm_exdent): Call start_paragraph to restore
+ previous indentation of text. (exponent.tex test.)
+
+ 2002-05-11 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/node.c (remember_node): If the argument FNAME is NULL,
+ as it happens for "Top", use the basename of current_output_filename.
+
+2002-09-26 <karl@gnu.org>
+
+ * lib/system.h [MIKTEX]: include gnu-miktex.h, define S_ISDIR.
+ [! MIKTEX]: declare substring.
+ From: Stephen Gildea <gildea@stop.mail-abuse.org>,
+ 08 May 2002 18:12:58 -0400.
+
+ * doc/texinfo.tex: spurious \let when setting \mainmagstep.
+ From: Stephen Gildea <gildea@stop.mail-abuse.org>,
+ 08 May 2002 08:38:39 -0400.
+
+ * doc/texinfo.txi: copyright symbol: use @code{@copyright@{@}},
+ with the braces in the @code.
+ From: Paul Eggert <eggert@twinsun.com>, 1 Apr 2002 11:37:52 -0800.
+
+ * info/infodoc.c (replace_in_documentation): always allocate at
+ least one byte for replen, otherwise things crash when MALLOC_CHECK_=2.
+ From: "Andreas Herrmann" <AHERRMAN@de.ibm.com>.
+
+ * lib/Makefile.am (libtxi_a_SOURCES): include xalloc.h.
+
+ * doc/Makefile.am (EXTRA_DIST): skip macro.texi and userdoc.texi now.
+ (common_mandeps): new var.
+ (*.1): use that, and depend on the source files with the version strings
+ instead of the binaries. Suggestion from Alexandre.
+
+ * util/Makefile.am (bin_PROGRAMS, ginstall_info_SOURCES,
+ transform): build as ginstall-info, to avoid clashing with the
+ install-info target inserted by Automake. (Suggestion from Akim.)
+
+ * Makefile.am (distcleancheck_listfiles): new definition so
+ distcheck doesn't complain about our generated files in info/,
+ which are conditionalized on TEXINFO_MAINT.
+
+ * lib/gettext.h: update from gettext 0.11.5.
+
+2002-09-24 <karl@gnu.org>
+
+ * util/srclist.txt: m4 files from aclocal rather than gnulib.
+
+ * Makefile.am, util/Makefile.am, dir-example: move dir-example to util.
+
+2002-09-23 <karl@gnu.org>
+
+ * INSTALL.generic: update from autoconf 2.54.
+
+2002-09-20 gettextize <bug-gnu-gettext@gnu.org>
+
+ * configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.11.5.
+
+2002-09-12 <karl@gnu.org>
+
+ * util/srclist.txt: INSTALL to INSTALL.generic.
+
+2002-08-04 <karl@gnu.org>
+
+ * doc/texinfo.5:
+ * lib/system.h:
+ * doc/texinfo.tex:
+ * doc/info-fr.texi:
+ * configure.ac: non-copyright notice.
+ * doc/info-fr.texi:
+ * doc/info-stnd.texi:
+ * doc/texinfo.txi: copyright years should be written out in full.
+
+2002-07-23 <karl@gnu.org>
+
+ * doc/texinfo.txi: verbatim license sample per rms and chassell.
+
+2002-07-19 <karl@gnu.org>
+
+ * doc/texinfo.txi:
+
+2002-06-05 <karl@gnu.org>
+
+ * doc/Makefile.am (TXI_XLATE): txi-it.tex from Paolo Bonzini
+ <bonzini@gnu.org>.
+
+2002-06-04 <karl@gnu.org>
+
+ * doc/texinfo.tex (\defparsebodycommon): do \penalty0 if the last
+ item was a \nobreak, since that means we have two function headers
+ in a row. Report from: Brian Gough <bjg@network-theory.co.uk>.
+
+ (\defparsebody,...): use \defparsebodycommon instead of repeating code.
+
+2002-05-09 <karl@gnu.org>
+
+ * doc/texinfo.5: lowercase NAME to `texinfo' for Solaris man.
+ From gildea.
+
+2002-04-29 <karl@gnu.org>
+
+ * doc/texinfo.txi: mention it.
+ * util/texi2dvi: allow -E as well as -e.
+
+2002-04-10 <karl@gnu.org>
+
+ * doc/texinfo.txi:
+
+2002-04-01 <karl@gnu.org>
+
+ * configure.ac: version 4.2.
+ * util/texi2dvi: 4.2
+
+ * makeinfo/toc.c: doc fix.
+ * util/install-info-html:
+ * makeinfo/texinfo.xsl: Fixes From: Ville Skyttä
+ <ville.skytta@iki.fi>.
+
+ * makeinfo/insertion.c (begin_insertion): (copying case) omit
+ cm_insert_copying if no_headers.
+ Bug report from Stephen Gildea.
+
+2002-03-28 <karl@gnu.org>
+
+ * configure.ac: pretest 4.1d.
+
+ * doc/texinfo.txi:
+ * makeinfo/cmds.c: ignore headings commands. From Stephen Gildea.
+
+ * doc/texinfo.txi: @ifplaintext
+
+2002-03-26 <karl@gnu.org>
+
+ * doc/texinfo.tex (\ifplaintext,\ifnotplaintext): new output
+ format conditional.
+
+ * makeinfo/cmds.c (cm_settitle):
+ * makeinfo/node.c (cm_node): need to pass output filename arg to
+ * xml_begin_document.
+
+ * makeinfo/cmds.c (cm_sp): need close_single_paragraph instead of
+ close_paragraph to avoid an extra blank line. Bug report from Stephen Gildea.
+
+ * doc/texinfo.tex (\doignore): can't do c kludge for
+ documentdescription. Bug report from Stephen Gildea.
+
+ * doc/texinfo.txi: missing t in documentdescription example, from
+ Stephen Gildea.
+
+2002-03-24 <karl@gnu.org>
+
+ * doc/texinfo.txi: invar sec
+
+2002-03-23 <karl@gnu.org>
+
+ * configure.ac: pretest 4.1c.
+
+2002-03-23 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/search.c (skip_non_whitespace): Don't go beyond the
+ terminating null character.
+
+ * info/filesys.c (filesys_read_info_file)
+ (filesys_read_compressed): Null-terminate the contents of the file
+ we've read, so it could be used as a C string.
+
+2002-03-23 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): Fix
+ computation of output_filename's length, to avoid overrunning
+ malloc'ed buffer. If mkdir returns with EEXIST, assume we can use
+ an existing directory only if the existing file is indeed a
+ directory. On MS-DOS, allow for EACCES in addition to EEXIST.
+ <max_name_len>: Remove this variable.
+
+ * makeinfo/makeinfo.c (expansion): Protect execute_string from too
+ long strings.
+ (EXECUTE_STRING_MAX): New macro.
+ (execute_string): Use EXECUTE_STRING_MAX, not 4000.
+
+2002-03-23 <karl@gnu.org>
+
+ * doc/texinfo.txi:
+ * makeinfo/insertion.h:
+ * makeinfo/texinfo.dtd:
+ * makeinfo/xml.h:
+ * makeinfo/xml.c:
+ * makeinfo/makeinfo.h:
+ * makeinfo/insertion.c:
+ * makeinfo/html.c:
+ * makeinfo/cmds.c:
+ * doc/info-stnd.texi: @permissions -> @copying.
+ * doc/texinfo.tex: permissions -> copying.
+
+2002-03-22 <karl@gnu.org>
+
+ * configure.ac: pretest 4.1b.
+
+ * info/Makefile.am (BUILT_SOURCES): conditionalize on
+ TEXINFO_MAINT, to appease distcheck.
+
+ * From: Matthew Woodcraft <mattheww@chiark.greenend.org.uk>:
+ * makeinfo/makeinfo.h (next_menu_item_number): New global.
+ * makeinfo/insertion.c (begin_insertion): Initialise it.
+ * makeinfo/makeinfo.c (handle_menu_entry): Emit accesskey attribute
+ in html output, according to next_menu_item_number.
+ * makeinfo/node.c (cm_node): Emit accesskey attributes in html output.
+
+ * doc/texinfo.txi: GNU texts.
+
+ * doc/info-stnd.texi: @syncodeindex, not @synindex.
+
+2002-03-21 <karl@gnu.org>
+
+ * doc/texinfo.txi: @permissions.
+
+2002-03-20 <karl@gnu.org>
+
+ * doc/texinfo.txi: document --no-headers a bit better.
+ * makeinfo/makeinfo.c: better description of --no-headers,
+ suggested by Stephen Gildea.
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): use
+ command-line specified output name unchanged.
+
+ * makeinfo/makeinfo.c (full_expansion): new routine, separated
+ from expansion, that does not tamper with the formatting parameters.
+ * makeinfo/insertion.c: copying -> permissions.
+ (cm_insert_permissions): insert rather than add.
+ * makeinfo/texinfo.dtd:
+ * makeinfo/xml.h:
+ * makeinfo/xml.c:
+ * makeinfo/cmds.c: copying -> permissions.
+ * makeinfo/makeinfo.h: copying -> permissions.
+ (full_expansion): declare.
+
+ * doc/texinfo.txi: @copying -> @permissions, @include fdl.texi.
+ * doc/info-stnd.texi: @copying -> @permissions, always include the FDL.
+
+ * makeinfo/html.c (html_output_head): copying -> permissions, use
+ insert_string.
+ * makeinfo/insertion.h: copying -> permissions.
+ * doc/texinfo.tex: \copying -> \permissions.
+
+ * doc/Makefile.am (EXTRA_DIST): include fdl.texi.
+
+2002-03-19 <karl@gnu.org>
+
+ * makeinfo/insertion.c (cm_insert_copying): use insert_string in
+ the xml case, sigh.
+
+ * doc/info-stnd.texi: copying
+
+ * dir-example: info standalone.
+
+ * makeinfo/html.c: copyright_text -> copying_text.
+ * makeinfo/texinfo.dtd:
+ * makeinfo/insertion.c:
+ * makeinfo/insertion.h:
+ * makeinfo/makeinfo.h:
+ * makeinfo/xml.c:
+ * makeinfo/xml.h:
+ * makeinfo/cmds.c: copyrighttext -> copying.
+ * doc/info-stnd.texi: copyrighttext -> copying.
+ * doc/texinfo.tex (\copying, \insertcopying): rename from
+ copyrighttext per rms.
+
+ * makeinfo/index.c (index_add_arg): don't emit warning for index
+ entries containing : after all.
+
+ * info/infokey.c: remove non-ansi trailing commas from last items
+ of enums. From: Albert Chin-A-Young <china@thewrittenword.com>.
+
+2002-03-18 <karl@gnu.org>
+
+ * doc/info-stnd.texi: @include after @setfilename.
+ * doc/texinfo.txi: @insertcopyrighttext, @settitle GNU ...
+
+ * doc/texinfo.txi: mention @setfilename and source filename
+ exceptions at the top.
+
+ * makeinfo/defun.c (scan_group_in_string): handle escaped @{ and @}.
+ Bug report from Werner Lemberg.
+
+ * doc/info-stnd.texi: add version number to title a la Texinfo.
+ * doc/info-stnd.texi: file -> manual.
+ * doc/info-stnd.texi: use @copyrighttext.
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion):
+ copyrighttext case.
+ * makeinfo/makeinfo.h (copyright_text): declare/define.
+ * makeinfo/html.c (html_output_head): output copyrighttext.
+ * makeinfo/texinfo.dtd: Add copyrighttext.
+ * makeinfo/xml.h (xml_element): add COPYRIGHTTEXT.
+ * makeinfo/xml.c (texinfoml_element_list, docbook_element_list):
+ copyrighttext case.
+
+2002-03-17 <karl@gnu.org>
+
+ * makeinfo/insertion.h (insertion_type): include copyrighttext.
+ * makeinfo/cmds.c (command_table): new command copyrighttext.
+
+ * doc/texinfo.tex (\copyrighttext, \insertcopyrighttext): new
+ Texinfo commands to handle the copyright and permission text cleanly.
+ (\dblarrowbox,\longdblarrowbox,\pushcharbox,\equivbox,\bullbox):
+ remove these definitions that have not been used for ages.
+
+ * configure.ac: call AC_CANONICAL_BUILD before the termcap
+ checking. Bug report from Eli.
+
+2002-03-16 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/node.c (cm_anchor): When recording the anchor position,
+ account for output_paragraph_offset, since the current paragraph
+ might not be closed yet (happens inside a menu, for example).
+
+ * djgpp/config.sed: Tweak to adapt to the new Automake/Autoconf.
+
+ * djgpp/README: Update.
+
+2002-03-15 <karl@gnu.org>
+
+ * dir-example: GNU organization.
+
+2002-03-14 <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_titlepage): do not declare nonexistent
+ function.
+
+2002-03-14 <karl@gnu.org>
+
+ * doc/texinfo.txi: don't say specifically html 3.2, since <html
+ lang=...> is not 3.2.
+ Bug reprt from: Matthew Woodcraft <mattheww@chiark.greenend.org.uk>.
+
+2002-03-13 <karl@gnu.org>
+
+ * doc/texinfo.tex (\writetocentry): set \pdfmakepagedesttrue here.
+ (\Etitlepage): instead of here. In case the document has no
+ @titlepage. Bug report from Stephen Gildea.
+
+ * util/texi2dvi: be verbose after the definition of cmd, not
+ before. From Andreas Schwab.
+
+2002-03-12 <karl@gnu.org>
+
+ * pretest 4.1a.
+ * doc/info-stnd.texi: update to FDL.
+
+2002-03-11 <karl@gnu.org>
+
+ * util/texi2dvi:
+ * util/texindex.c:
+ * util/install-info.c:
+ * makeinfo/makeinfo.c:
+ * info/infokey.c:
+ * info/info.c: home page and help message.
+
+ * doc/texinfo.txi (math): document @\ (aka \\) for literal \.
+ regularize index entries.
+ * makeinfo/cmds.c (command_table): \\ -> insert_self.
+
+ * doc/texinfo.tex (\mathbackslash): new definition.
+ (\math): handle \\ too.
+ (\codeunder): handle @code{\} in mmode.
+
+ * makeinfo/html.c: make home page be gnu's.
+
+ * doc/texinfo.txi (Conventions): rewrite description of quotes so
+ as to work in all formats; there was no output for HTML.
+ Report from: David Merrill <david@lupercalia.net>.
+
+2002-03-10 <karl@gnu.org>
+
+ * doc/texinfo.txi (Texinfo Copying Conditions): mention this
+ manual's license specifically.
+
+2002-03-09 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/indices.c (add_index_to_index_nodenames): Fix an off-by-one
+ error when computing the number of the last index entry.
+
+2002-03-08 <karl@gnu.org>
+
+ * doc/texinfo.tex: Rewrite unnumbered toc handling to keep track
+ of their sequence, so they can be handled correctly in
+ the PDF toc (= bookmarks).
+ From: Werner LEMBERG <wl@gnu.org>.
+
+ * configure.ac: AC_MSG_WARN if can't find a term library. From:
+ Marc.Herbert@ens-lyon.fr.
+
+ * info/info.c: alphabetize.
+ * info/info.c: include short option names.
+
+2002-03-08 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/display.c (display_update_one_window): Dynamically reallocate
+ printed_line[] as needed. When under -R, ignore ANSI escapes for
+ the purposes of line wrap display. Clear the line to EOL if it
+ used escape sequences. Reallocate entry->text if the new
+ printed_line is longer than screenwidth.
+
+ * info/window.c (string_width): Don't count ANSI escape sequences
+ in string width, when under -R..
+ (calculate_line_starts): Don't count ANSI escape sequences in line
+ width, when under -R.
+ (window_get_cursor_column, window_chars_to_goal): When under -R,
+ ANSI escapes don't affect the horizontal position.
+
+ * info/info-utils.c (printed_representation): If -R is in effect,
+ treat ESC as a normal character.
+
+2002-03-08 <karl@gnu.org>
+
+ * util/Makefile.am:
+ * info/Makefile.am:
+ * makeinfo/Makefile.am:
+ * lib/Makefile.am: doc fix.
+
+ * doc/Makefile.am (install-tex): prefix the install directories
+ with $(DESTDIR), because that is what automake does for all
+ generated install rules. The file pdfcolor.tex should be
+ installed as such (and not as epsf.tex).
+ From: Peter Breitenlohner <peb@mppmu.mpg.de>.
+
+ * configure.ac (AC_INIT): now pass [GNU Texinfo].
+ (AM_INIT_AUTOMAKE): now no args, for automake 1.6.
+
+2002-03-05 <karl@gnu.org>
+
+ * doc/texinfo.txi: history
+
+2002-03-04 <karl@gnu.org>
+
+ * configure.ac: version 4.1.
+ * util/texi2dvi: version.
+
+ * doc/texinfo.txi: @settitle is used in html output (from Eli),
+ various underfull hbox fixes.
+
+2002-03-02 <karl@gnu.org>
+
+ * configure.ac: pretest 4.0k
+
+ * info/info.c: declare add_file_to_directory to avoid warning.
+
+ * doc/info-stnd.texi: info standalone so as not to collide with
+ `standards' in dir.
+
+2002-03-01 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/insertion.c (end_insertion): Insert the /td and /tr
+ directives in lower case. From Per Bothner <per@bothner.com>.
+
+ * makeinfo/macro.c (cm_alias): Ignore whitespace around the alias
+ name, like the manual promises.
+
+ * doc/texinfo.txi (Invoking Macros, Macro Details): Document that
+ commas in macro arguments don't work in TeX. Advise texi2dvi -e
+ when macros don't work with TeX.
+
+ * doc/texinfo.txi (Node Line Requirements): Add restrictions about
+ parens and some punctuation characters in node names.
+ (Def Cmd Template): Document that macros are not expanded.
+
+ The following two changes allow to say "info foo" if there's an
+ Info file `foo' somewhere along INFOPATH.
+
+ * info/info.c (add_file_directory_to_path): New function, code
+ moved from `main'.
+ (main): Use add_file_directory_to_path.
+
+ * info/session.c (info_follow_menus): If the first menu entry
+ couldn't be found as an item in DIR's menu, try it as a file name.
+
+ 2001-06-19 Mark Montague <markmont@umich.edu>
+
+ * info/filesys.c: Fix for sparc64 (offsets should be "long"s).
+
+ * info/session.c: Fix typos in function calls.
+
+ 2001-08-23 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/footnote.c (cm_footnote): Don't allow footnotes inside
+ footnotes.
+ (output_pending_notes): Increment already_outputting_pending_notes
+ in the HTML case as well, to protect execute_string from
+ recursively entering output_pending_notes.
+
+2002-03-01 <karl@gnu.org>
+
+ * doc/texinfo.tex: fix mismatched $'s for sake of emacs font-lock.
+ From: Stephen Gildea <gildea@stop.mail-abuse.org>.
+
+2002-02-27 <karl@gnu.org>
+
+ * configure.ac: pretest 4.0j.
+
+ * info/infodoc.c: 1scroll-forward typo.
+
+2002-02-26 <karl@gnu.org>
+
+ * lib/system.h [! ENABLE_NLS]: let's not go const.
+
+2002-02-26 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/config.sed: Add tweaking of file names in "install-info"
+ and "uninstall-info" targets.
+
+ * doc/inf-stnd.texi (Custom Key Bindings, Invoking infokey):
+ Add footnotes about DOS file names.
+
+ * info/infokey.c (main) [__MSDOS__]: If HOME is not defined,
+ default to the current directory.
+
+2002-02-26 <karl@gnu.org>
+
+ * lib/system.h (LC_MESSAGES) [! LC_MESSAGES]: need this after all.
+
+2002-02-25 <karl@gnu.org>
+
+ * doc/info-stnd.texi: contents at top, avoid overfull hbox.
+ * lib/Makefile.am (libtxi_a_sources): include gettext.h.
+
+ * lib/system.h (LC_MESSAGES): don't need conditional, Bruno says
+ that locale.h or libintl.h does so.
+
+ * configure.ac: pretest 4.0i.
+
+ * dir-example: infokey.
+ * doc/info-stnd.texi: invoking infokey.
+ * info/infokey.c (short_help): reorganize slightly.
+
+ * lib/system.h: use "gettext.h" instead of <libintl.h> per gettext
+ 0.11 recommendation.
+
+2002-02-25 gettextize <bug-gnu-gettext@gnu.org>
+
+ * Makefile.am (SUBDIRS): Add intl.
+ * configure.ac (AC_CONFIG_FILES): Add intl/Makefile.
+
+2002-02-25 <karl@gnu.org>
+
+ * util/Makefile.am (LDADD):
+ * makeinfo/Makefile.am (LDADD):
+ * info/Makefile.am (LDADD): @LIBINTL@ per gettextize.
+
+ * configure.ac: gettextize changes.
+ * Makefile.am: gettextize changes.
+
+2002-02-25 gettextize <bug-gnu-gettext@gnu.org>
+
+ * Makefile.am (SUBDIRS): Add m4.
+ (SUBDIRS): Remove intl.
+ (ACLOCAL_AMFLAGS): New variable.
+ (EXTRA_DIST): Add config.rpath.
+ * configure.ac (AC_CONFIG_FILES): Add m4/Makefile.
+ (AC_CONFIG_FILES): Remove intl/Makefile.
+
+2002-02-23 <karl@gnu.org>
+
+ * pretest 4.0h.
+
+ * 2002-02-23 Eli Zaretskii <eliz@is.elta.co.il>
+ * doc/info-stnd.texi (Invoking Info): Add a reference to the
+ description of index-apropos and index-search. Document the
+ --raw-escapes option.
+ (Searching Commands): Describe index-search and index-apropos.
+
+ * info/man.c (clean_manpage): If raw_escapes_p is not set, remove
+ ANSI escape sequences from the man page.
+
+ * info/info.h: Declare raw_escapes_p.
+
+ * info/info.c: <raw_escapes_p>: New variable.
+ New option --raw-escapes or -R.
+ (main): Handle it.
+ (info_short_help): Document it.
+ (main): Honor --output together with --usage, by dumping the node
+ we found to the named file.
+
+ 2002-02-23 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/html.c (nodename_to_filename): Call
+ nodename_to_filename_1 with the last argument 1, not 0.
+
+ * makeinfo/toc.c (shortcontents_update_html)
+ (contents_update_html): Don't omit the entry for the Top node.
+
+ * 2002-01-30 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/node.c (cm_node): Don't condition splitting on
+ top_node_seen being non-zero. If current_node is NULL, use the
+ current output file name to get at the file name for the previous
+ node. Don't compute a new file name for a node if we didn't close
+ the current file.
+
+ 2002-02-01 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/node.c (cm_node): Call html_output_head whenever we
+ create a new split-HTML file.
+
+ * makeinfo/html.c (html_output_head): Make html_title static.
+ Compute it only once, and don't free it. Output the <h1> title
+ header only once per run.
+
+ 2002-02-02 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/toc.c (contents_update_html): Fix the condition for
+ omitting duplicate TOC entries. Fix comparison with the TOC entry
+ for "Top".
+
+2002-02-14 <karl@gnu.org>
+
+ * doc/Makefile.am (DISTCLEANFILES): use this variable instead of
+ the distclean-aminfo target, which apparently is no longer used.
+
+ * pretest 4.0g.
+
+ * doc/texinfo.tex (\appendixentry): new macro for typesetting
+ appendix toc entries.
+ (\appendixzzz, \summarycontents, \pdfoutlines): use it, instead of
+ usurping \chapentry. This allows the bookmarks in the pdf output
+ to come out right. Report from: Kurt Hornik
+ <Kurt.Hornik@ci.tuwien.ac.at>.
+
+2002-02-13 <karl@gnu.org>
+
+ * configure.ac: ALL_LINGUAS is deprecated as of gettext 0.11.
+ * doc/texinfo.tex (\image): remove spurious \loggingall.
+
+ * doc/texinfo.txi: @math now implies @tex.
+ * doc/texinfo.tex (\math): imply @tex.
+
+2002-02-11 <karl@gnu.org>
+
+ * makeinfo/insertion.c (handle_verbatim_environment): save and
+ restore filling_enabled and inhibit_paragraph_indentation. Bug
+ report from: Alexandre Duret-Lutz <duret_g@lrde.epita.fr>.
+
+ * makeinfo/makeinfo.c (reader_loop): don't worry about bare braces
+ inside @math.
+
+2002-02-08 <karl@gnu.org>
+
+ * info/infodoc.c: keep underlines with the text they refer to, for
+ translation purposes.
+ Pointed out by Christian Rose <menthos@menthos.com>, 20 nov 2001.
+
+ * doc/info.texi: recommend setting INFOPATH.
+
+ * doc/Makefile.am (install-tex): need $(srcdir) for install.
+ From: istry <istry@mail.ru>.
+
+ * doc/texinfo.tex: replace $$$ delimiter with $.$, for sake of
+ font-lock in Emacs 21.1. Suggestion from: Stephen Gildea
+ <gildea@stop.mail-abuse.org>.
+
+ 2002-01-26 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/infomap.c (default_emacs_like_info_keys)
+ (default_emacs_like_ea_keys, default_vi_like_info_keys)
+ (default_vi_like_ea_keys): Fix default keybindings to be
+ consistent with non-INFOKEY branch. Add bindings for Home, End,
+ and Delete keys.
+
+ 2002-01-23 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/toc.h <TOC_ENTRY_ELT>: New member html_file.
+
+ * makeinfo/toc.c (toc_add_entry): Compute and set the html_file
+ member.
+ (shortcontents_update_html): Produce the toc_* links correctly,
+ without duplicating the link text. Fix comparison with "Top".
+ Handle the case when there's @shortcontents, but no @contents.
+ (contents_update_html): Fix the way toc_* anchors are produced
+ from toc_entry_alist[i]->name: take only the node name from the
+ string in toc_entry_alist[i]->name. Fix comparison with "Top".
+
+ * makeinfo/sectioning.c (sectioning_html): Take the toc_anchor
+ substring before closing the anchor with </a>. Fix the closing
+ </hN> tag--add 2 to level, not 1. Use sizeof instead of a magic
+ value of 9.
+
+ * makeinfo/cmds.c: Make @summarycontents call cm_shortcontents, as
+ promised by the docs.
+
+ 2002-01-19 Eli Zaretskii <eliz@is.elta.co.il>
+ * djgpp/config.sed: Fix a problem with AC_CONFIG_LINKS that
+ prevented building from a directory on another drive.
+
+ * djgpp/config.bat: Fix problems with long --srcdir diectory names.
+
+ * djgpp/README: Update.
+
+2002-01-31 <karl@gnu.org>
+
+ * doc/texinfo.txi: mention dvips
+
+2002-01-28 <karl@gnu.org>
+
+ * configure.ac (ALL_LINGUAS): add hr.
+
+2002-01-22 <karl@gnu.org>
+
+ * makeinfo/defun.c (defun.c): only warn about ( immediately
+ following a defun name, since the groff manual needs other
+ characters there where whitespace is incorrect.
+ Reported by Werner Lemberg <wl@gnu.org>.
+
+ * doc/info-stnd.texi: alphabetize variable list.
+
+ * doc/texinfo.txi: no :'s in index entries, index @page/@group
+ some more.
+
+ * makeinfo/index.c (index_add_arg): warn if index entry contains a
+ colon. From: Kenneth Lorber <keni@his.com>.
+
+2002-01-21 <karl@gnu.org>
+
+ * makeinfo/insertion.c: </pre not /<pre, reported by Mike
+ Benefield <mike@duckbrain.com>.
+
+2002-01-18 <karl@gnu.org>
+
+ * configure.ac: pretest 4.0f.
+
+ * util/texindex.c:
+ * util/install-info.c:
+ * makeinfo/makeinfo.c:
+ * info/info.c: it's 2002.
+
+ * info/session.c: pass right args to info_scroll_half_screen_up.
+ From Eli.
+
+2002-01-18 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/multi.c (multitable_item): Always return a value.
+
+ * util/install-info.c (xmalloc, xrealloc, pfatal_with_name)
+ (open_possibly_compressed_file, parse_input): Call `fatal' with 3
+ arguments, to avoid compiler warnings.
+ (main): Call `fatal', `error', and `warning' with the right number
+ of arguments.
+
+ * makeinfo/makeinfo.c (main): Remove extraneous first arg of
+ usage().
+
+ * info/window.c (build_message_node): Supply a 4th argument to
+ build_message_buffer.
+
+
+2002-01-18 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/sectioning.c (sectioning_html): End the anchor properly
+ with a </a>.
+
+ * info/session.c (info_menu_or_ref_item): If we didn't find a
+ cross-reference on this line, try the one before.
+
+ * info/infomap.c (fetch_user_maps): Provide two different
+ translations for ``file too small'' and ``file too big'' error.
+
+ * info/info.c (info_short_help): Print the --speech-friendly
+ option together with the other options, not at the end of the help
+ screen.
+
+2002-01-18 Andreas Schwab <schwab@suse.de>
+
+ * makeinfo/html.c (escape_string): When string is empty don't read
+ past end of it.
+
+2002-01-17 <karl@gnu.org>
+
+ * doc/info-stnd.texi: overfull box in table.
+
+2002-01-16 <karl@gnu.org>
+
+ * configure.ac: pretest 4.0e.
+
+ * doc/info.texi: update from emacs.
+
+2002-01-03 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (file_line_error): New function.
+
+ * makeinfo/insertion.c (discard_insertions): Call file_line_error
+ instead of changing global variables.
+
+ * makeinfo/sectioning.c (cm_top): Ditto.
+
+ * makeinfo/node.c (validate_file): Ditto.
+
+ * makeinfo/makeinfo.c (discard_braces, handle_variable_internal):
+ Ditto.
+
+ * makeinfo/macro.c (define_macro): Ditto.
+
+ 2001-12-31 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/node.h (TAG_ENTRY): New struct member html_fname.
+
+ * makeinfo/node.c (find_node_by_fname): New function.
+ (remember_node): Accept an additional argument FNAME, the node's
+ file name, and record it in the list of nodes; callers changed.
+ (cm_node): Call find_node_by_fname to see if this node's file name
+ clashes with another node or anchor. If it clashes with another
+ node, append the new node to the same file instead of erasing the
+ other node. If it clashes with an anchor, print an error message
+ and overwrite the anchor's file.
+ (cm_anchor): If this anchor's file name clashes with another
+ anchor or node, print an error message and ignore the anchor.
+
+ * makeinfo/files.c (normalize_filename): New function.
+
+ * makeinfo/files.h <normalize_filename>: Add declaration.
+
+ * makeinfo/html.c (nodename_to_filename_1): Call
+ normalize_filename before returning the file name to the caller.
+ Disable the code which adds #Nodified-filename to the file name we
+ produce.
+
+ * makeinfo/makeinfo.c (add_char): Don't replace whitespace with
+ &nbsp; if we are producing an HTML directive.
+ (add_html_elt): New function.
+ (cm_xref, cm_inforef, cm_uref, cm_email, cm_image): Use
+ add_html_elt instead of add_word, where appropriate.
+
+ * makeinfo/html.c (add_link): Ditto.
+
+ * makeinfo/footnote.c (cm_footnote): Ditto.
+
+ * makeinfo/defun.c (defun_internal): Ditto.
+
+ 2001-12-27 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/node.c (cm_node): Don't omit links to (DIR) from the
+ navigation bar, add_anchor_name will DTRT now.
+
+ * makeinfo/makeinfo.c (cm_xref): Produce a split-HTML file name
+ from arg1, the node name, not from arg3 or arg2, which are the
+ reference name. Use arg2 or arg3 for the text to be displayed as
+ a link between ">" and "</a>". Use add_anchor_name instead of
+ add_nodename_to_filename.
+ (cm_inforef): Use add_anchor_name instead of
+ add_nodename_to_filename. Handle the case of a missing second
+ argument in @inforef.
+
+ * makeinfo/html.c (add_anchor_name): Always add # and the anchor
+ name, even if we are splitting. If the node is "(dir)", treat it
+ as if it were "dir".
+ (nodename_to_filename_1): Don't append #Top for the Top node.
+ (add_link): Don't punt if nodename is "(dir)". Output "</a>"
+ after the link.
+
+ 2001-12-25 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (cm_xref, cm_inforef): Output the target
+ file name via add_nodename_to_filename.
+
+ 2001-12-20 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/html.c (nodename_to_filename_1): Make references to Top
+ to refer to index.html#Top.
+ (add_nodename_to_filename): Accept additional argument HREF;
+ callers changed.
+
+ * makeinfo/toc.c (rewrite_top): If the filename to rewrite is
+ stdout or the null device, do nothing.
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): Use
+ FILENAME_CMP instead of strcmp. Search for a period forward, not
+ backward. Make index_name[] a static const array, and its len
+ computed at compile time.
+ (convert_from_loaded_file): If output_filename is the null device,
+ turn off HTML splitting.
+ (cm_xref): Use add_anchor_name, rather than add_escaped_anchor_name,
+ in the 5-argument case in HTML mode.
+ (cm_inforef): Fix external references in HTML mode.
+
+ * makeinfo/node.c (cm_node): Use FILENAME_CMP instead of strcmp.
+ Don't open a new file if the new node's name is empty. Take the
+ directory part of split-HTML files from current_output_filename,
+ not from toplevel_output_filename (the latter doesn't include the
+ manual's subdirectory part).
+
+ * makeinfo/html.c (nodename_to_filename_1): Use FILENAME_CMPN
+ instead of strncmp. Support *.inf files in references.
+
+2001-12-11 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/config.bat, djgpp/config.sed, djgpp/config.site: Update
+ for Texinfo 4.0d.
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): Use IS_SLASH
+ instead of literal `/'.
+ (convert_from_loaded_file): Flush the output stream before
+ creating the TOC.
+
+
+2002-01-14 <karl@gnu.org>
+
+ * info/info.c: translate --speech-friendly (from Eli).
+ * makeinfo/index.c: formatting.
+
+ 2001-12-24 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/infomap.c (initialize_info_keymaps): Bind the user-defined
+ keys on top of the default ones, not the other way around.
+
+2002-01-11 <karl@gnu.org>
+
+ * info/info.c: can't do #ifdef inside of printf any more.
+ From: Tyler <tyler@zerodivide.cx>
+
+ * configure.ac (ALL_LINGUAS): add he, from Eli.
+
+2002-01-09 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/window.c (calculate_line_starts): Cast node->contents[i] to
+ unsigned char.
+
+2002-01-04 <karl@gnu.org>
+
+ * doc/texinfo.tex (\footnotezzz): \noindent=\relax.
+
+2002-01-03 <karl@gnu.org>
+
+ * doc/texinfo.tex (\imagexxx): handle pdf and dvi cases the same.
+ (\dopdfimage): need \immediate to avoid seg fault when including the
+ same image twice.
+ Bug reports from Alexandre Duret-Lutz <duret_g@lrde.epita.fr>.
+
+2001-12-31 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_image): check *ext_arg as well as
+ ext_arg when computing length of fullname.
+
+ * makeinfo/defun.c: docbook changes.
+ * makeinfo/docbook.c (docbook_punctuation): remove deprecated
+ default: at end of statement.
+
+ * makeinfo/docbook.c: initial.
+ * makeinfo/docbook.h: initial.
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add docbook.[ch].
+ * makeinfo/makeinfo.c (add_char): use &nbsp; in docbook case.
+
+ * doc/texinfo.tex (\footnotezzz): use \everypar={\hang} instead of
+ just \hang in case a footnote extends for multiple paragraphs.
+
+2001-12-18 <karl@gnu.org>
+
+ * info/Makefile.am (BUILT_SOURCES): include $(EXEEXT) on makedoc
+ dependency since automake doesn't do it.
+
+ 2001-12-11 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/config.bat, djgpp/config.sed, djgpp/config.site: Update
+ for Texinfo 4.0d.
+
+ * info/infomap.c (fetch_user_maps): Initialize `filename' to NULL
+ and don't try to call `open' if `filename' is NULL.
+ [__MSDOS__]: Try the current directory if neither $INFOKEY nor
+ $HOME are defined.
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): Use IS_SLASH
+ instead of literal `/'.
+ (convert_from_loaded_file): Flush the output stream before
+ creating the TOC.
+
+ 2001-12-10 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/infokey.c (main): Use FOPEN_WBIN instead of "w".
+
+ * info/infokey.h (INFOKEY_SRCFILE, INFOKEY_FILE) [__MSDOS__]:
+ Special definitions for MS-DOS.
+
+ 2001-12-09 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * lib/system.h: Condition inclusion of libintl.h on ENABLE_NLS.
+ (gettext, bindtextdomain, textdomain) [!ENABLE_NLS]: Provide
+ trivial definitions for when NLS is not used.
+ (LC_MESSAGES) [!ENABLE_NLS]: Define if undefined by locale.h.
+
+2001-12-18 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/infomap.c (decode_keys): Change the return type to int;
+ callers changed. Return zero if some of the special keys in SRC
+ are not defined by the terminal; return non-zero otherwise.
+ (section_to_keymaps): If decode_keys returns zero, don't bind the
+ key sequence.
+
+2001-12-18 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/xml.c (xml_insert_element_with_attribute)
+ (xml_insert_element): Rename the argument `element' to `elt'.
+
+ * info/infokey.c (compile): Use \033 instead of (non-standard) \e.
+
+2001-12-17 <karl@gnu.org>
+
+ 2001-12-16 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/pcterm.c (pc_initialize_terminal) [INFOKEY]: Store term_kh,
+ term_ke, term_ki, and term_kx sequences.
+ (DJGPP_keytab): Map Home, End, and Insert to escape sequences, not
+ to C-a, C-e, etc.
+
+ * info/infomap.c (default_emacs_like_info_keys)
+ (default_emacs_like_ea_keys, default_vi_like_info_keys)
+ (default_vi_like_ea_keys): Add the leading suppress-default flag,
+ to be consistent with the table which comes from a file.
+
+ * info/session.c (info_do_lowercase_version): Add a doc string.
+
+ * info/infodoc.c (describe_key) [INFOKEY]: If keystroke is bound
+ to do-lowercase-version, but its lower-case variant is undefined,
+ say that keystroke is also undefined.
+
+
+2001-12-12 <karl@gnu.org>
+
+ * makeinfo/files.c (find_and_load): remove conditionals on
+ VMS|O_BINARY, always just read as many bytes as we can.
+
+ 2001-12-11 Eli Zaretskii <eliz@is.elta.co.il>
+ * new files for djgpp/.
+
+ 2001-09-09 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/echo-area.c (build_completions): Look for a candidate
+ completion which matches user's request including the letter-case,
+ use that as the value of LCD_completion.
+
+ 2001-12-06 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/echo-area.c (build_completions): When looking for the best
+ completion candidate, only compare as much characters as the user
+ typed.
+
+
+2001-12-04 <karl@gnu.org>
+
+ * doc/texinfo.tex (\pdfmkpgn): remove trailing @ in link names
+ again. Also from Kurt.
+
+ * doc/texinfo.tex (\image): need five commas to ignore additional
+ optional args to @image. From Kurt.Hornik@ci.tuwien.ac.at.
+
+ * doc/texinfo.tex (\afourlatex): reset \globaldefs=0 explicitly.
+ From Trond Endrestřl <trond@ramstind.gtf.ol.no>.
+
+2001-12-01 <karl@gnu.org>
+
+ * makeinfo/files.c (find_and_load): remove O_BINARY from open
+ call, this messes up under Windows. From eli.
+
+2001-11-20 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_image): reword error messages.
+
+2001-11-19 <karl@gnu.org>
+
+ * Pretest 4.0d.
+ * doc/texinfo.txi: index ragged right/left.
+
+ * info/window.c (build_message_buffer): handle %1$s as used in
+ ja.po. From Fumitoshi UKAI <ukai@debian.or.jp>.
+
+ * configure.ac (ALL_LINGUAS): add sv.
+
+2001-11-16 <karl@gnu.org>
+
+ * Makefile.am (EXTRA_DIST): add COPYING.DOC.
+
+ 1999-10-30 Andrew Bettison <andrewb@zip.com.au>
+
+ All these changes are to implement user-configurable key mapping
+ using the new 'infokey' program. For the time being, the new
+ code is conditional on [INFOKEY] and the old code is still there
+ in case we want to revert.
+
+ * info/session.c (incremental_search): test for printable chars
+ _before_ isearch command keys -- makes a difference if the
+ isearch commands are bound to printable chars.
+
+ * info/doc.h,
+ * info/infodoc.c,
+ * info/infomap.c,
+ * info/m-x.c,
+ * info/session.c: New typedef InfoCommand, plus a bunch of
+ supporting macros, to abstract a "command" away from being a
+ function pointer.
+
+ * info/doc.h (pretty_keyseq),
+ * info/infodoc.c (pretty_keyseq),
+ * info/session.c (pretty_keyseq): Moved definition from
+ session.c into infodoc.c, and rewrote to recognise special
+ terminal sequences (PgUp, PgDn, etc.).
+
+ * info/infodoc.c (create_internal_info_help_node,
+ replace_in_documentation, info_where_is),
+ * info/m-x.c (info_execute_command): Cleaned up references to
+ hardwired keystrokes.
+
+ * info/infodoc.c (replace_in_documentation):
+ Extended the \\[foo] syntax to recognise \\%-X.Y[foo], which
+ causes the replacement text to be inserted using sprintf("%-X.Ys").
+
+ * info/session.c (_scroll_forward, _scroll_backward,
+ scroll_forward_page_only, scroll_backward_page_only,
+ scroll_forward_page_only_set_window,
+ scroll_backward_page_only_set_window): New functions, eliminating
+ need for SPC and DEL hack.
+
+ * info/session.c (scroll_forward, scroll_backward,
+ scroll_forward_set_window, scroll_backward_set_window): Call
+ _scroll_forward and _scroll_backward to do all the work.
+
+ * info/infomap.c (initialize_info_keymaps)[!INFOKEY]: set 'v'
+ and Control('v') key bindings to info_scroll_backward_page_only
+ and info_scroll_forward_page_only respectively.
+
+ * info/Makefile.am (bin_PROGRAMS): Added new executable `infokey'.
+ (infokey_SOURCES): Defined.
+ (EXTRA_DIST): Added `sample_infokey'.
+ (BUILT_SOURCES): Added `key.c'.
+
+ * info/infokey.h,
+ * info/infokey.c: Created, for new program `infokey' which
+ creates a $HOME/.info file by compiling a text source file with
+ syntax very similar to that used by `lesskey' in less 3.4.0.
+
+ * info/makedoc.c: Generate new file `key.c' defining an array to
+ map command names to codes.
+
+ * info/key.h: Created, to define contents of new `key.c' now
+ created by makedoc.
+
+ * info/info.h (INFOKEY): Define, to enable all following changes.
+ (set_variable_to_value)[INFOKEY]: Declare new function.
+
+ * info/makedoc.c [INFOKEY]: Write '#define A_' numeric command
+ code definitions into `funs.h' to support new key binding system.
+
+ * info/session.c (info_dispatch_on_key, info_numeric_arg_digit_loop)
+ [INFOKEY],
+ * info/infomap.c [INFOKEY],
+ * info/infodoc.c (function_documentation, function_name,
+ describe_key, pretty_keyname, pretty_keyseq_internal,
+ where_is_internal)[INFOKEY],
+ * info/terminal.h (term_kh, term_ke, term_kx, term_ki)[INFOKEY],
+ * info/terminal.c (term_kh, term_ke, term_kx, term_ki,
+ terminal_initialize_terminal)[INFOKEY],
+ * info/variables.c (set_variable_to_value)[INFOKEY],
+ * info/sample_infokey: Added infokey functionality, copied more
+ or less wholesale from 'lesskey' in GNU Less 3.4.0. Added a new
+ typedef struct FUNCTION_KEYSEQ, and a new element `keys' to
+ typedef struct FUNCTION_DOC, to give the user some control over
+ the keystrokes that appear in the documentation node generated
+ by get-help-window, and to improve efficiency a little.
+
+ * info/infodoc.c (info_internal_help_text,
+ create_internal_info_help_node)[INFOKEY]: Rewrote all code that
+ assumes fixed keystrokes, replacing %10s sequences with \\%10[foo]
+ sequences instead.
+
+ * doc/info-stnd.texi: Documented above changes.
+
+2001-09-19 <karl@gnu.org>
+
+ * makeinfo/cmds.c: </ not /<, duh :). From janneke.
+
+2001-09-12 <karl@gnu.org>
+
+ * configure.ac (AC_SYS_POSIX_TERMIOS, AC_HEADER_TIOCGWINSZ): use
+ these new autoconf macros instead of the old automake ones.
+
+ * info/terminal.c: remove unconditional include of sys/ioctl.h.
+ * info/termdep.h: <sys/ioctl.h> [GWINSZ_IN_SYS_IOCTL]: include outside of HAVE_TERMIOS_H,
+ per autoconf manual.
+
+ * doc/Makefile.am (install-info-am): remove override of automake's
+ target, instead enable looking in . for info files within automake.
+
+ * doc/info-stnd.texi: include separate version-stnd.texi
+ * configure.ac: autoconf 2.52, and rename to configure.ac.
+
+2001-09-11 <karl@gnu.org>
+
+ * doc/texinfo.txi: recommend against using - and _ in @set names,
+ * and rearrange that section.
+
+ * info/infodoc.c (replace_in_documentation): free fun_name to fix
+ memory leak.
+ From: "Art Haas" <ahaas@neosoft.com>, Sat, 4 Aug 2001 08:34:31 -0500.
+
+ * makeinfo/lang.c: encoding support for info output from kama.
+ * makeinfo/lang.h: encoding support for info output from kama.
+
+ * makeinfo/html.c: include document encoding code unless
+ no_encoding.
+ * makeinfo/insertion.c (cm_direntry): don't call begin_insertion
+ if ignoring.
+ (cm_documentdescription): moved here, and likewise.
+ (begin_insertion): don't need output format conditionals here.
+
+ * makeinfo/cmds.c (cm_documentdescription): move to insertion.c.
+ * makeinfo/makeinfo.h (enable_encoding): new global.
+ * makeinfo/makeinfo.c: new option --enable-encoding, rearrange help.
+
+ Sun Oct 31 18:44:24 UTC 1999 Karl Heinz Marbaise <kama@hippo.fido.de>
+
+ - lang.{c,h}:
+ o added translation map between HTML markups and 8-Bit
+ (ISO-8859-1 codes; supplemental is Unicode for the future).
+ o added cm_search_iso_map:
+ search for characters based on HTML markup names for
+ translation 8-Bit code.
+ o recognizing of @documentencoding improved.
+ now we can recognize things like ISO-8859-{1...15}
+
+ - makeinfo.{c,h}:
+ o added two command line switches.
+ + info-encoding to activate the encoding for info output
+ which is correctly shown by info. Default is NOT to
+ encode the output to be compatible with earlier versions.
+ + no-encoding to suppress encoding e.g. while producing
+ ASCII output (--no-headers) results in that you get
+ "A for &Auml; as before.
+ o help output changed to document the switches.
+
+ - html.c:
+ charset encoding in html based on @documentencoding.
+
+
+2001-07-31 <karl@gnu.org>
+
+ * doc/texinfo.txi: mention pdfcolor.tex.
+ * doc/texinfo.tex: doc.
+ * doc/Makefile.am (install-tex): install pdfcolor.tex too.
+ * doc/pdfcolor.tex: new file, since Kurt.Hornik@ci.tuwien.ac.at
+ reports that not all pdftex installations include it.
+
+2001-07-25 <karl@gnu.org>
+
+ * doc/texinfo.tex (\Etitlepage): need \HEADINGSon before the
+ \...aftertitlepage checks to get page numbers. Report from
+ 3diff@gnu.org.
+
+2001-07-06 <karl@gnu.org>
+
+ * doc/texinfo.txi: mention http://docbook2X.sourceforge.net/.
+
+2001-06-29 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: make output to stdout imply --no-split for
+ HTML, too.
+
+ * makeinfo/html.c (html_output_head): use documentdescription if set.
+ * makeinfo/insertion.h (insertion_type): new case documentdescription.
+ * makeinfo/insertion.c (begin_insertion, end_insertion,
+ insertion_type_names): new case for documentdescription.
+ * makeinfo/cmds.c (cm_documentdescription): new fn.
+ * makeinfo/makeinfo.h (document_description): new global.
+ * doc/texinfo.txi: @documentdescription.
+ @documentdescription implementation from patches by Will Estes.
+
+2001-06-26 <karl@gnu.org>
+
+ * doc/texinfo.txi: documentdescription
+ * doc/texinfo.tex: Ignore @documentdescription ... @end
+ documentdescription.
+
+ * doc/texinfo.txi: document sequential punctuation in @footnote is
+ normal, suggested by rms.
+
+2001-06-21 <karl@gnu.org>
+
+ * doc/texinfo.tex (\textfonts): call \setleading here, so that we can
+ switch font sizes back and forth inside @tex with \globaldefs=1
+ and not lose the leading.
+
+ * doc/texinfo.txi: allow @smallbook to run without overfull or
+ underfull boxes.
+
+2001-06-19 <karl@gnu.org>
+
+ * doc/texinfo.tex (\imagexxx): ignore new optional args to @image.
+
+ * makeinfo/html.c (html_output_head): include <h1>title</h1> at
+ beginning of document.
+ * makeinfo/sectioning.c (cm_top): don't include explicit links in
+ HTML output, the regular code for @node will do it.
+ (sectioning_html): use <h2> for chapter instead of <h1>, etc.
+ * makeinfo/node.c (cm_node): do not include code to output the
+ HTML <head>, we do that elsewhere now.
+
+ 1999-11-26 W. L. Estes <will@fumblers.org>
+ * makeinfo/insertion.c (begin_insertion): add an explicit <br>
+ before beginning a <pre> block. for flushleft and flushright, use
+ <div> tag with an align attribute set.
+ * makeinfo/insertion.c (end_insertion): for flushleft and
+ flushright, end the </div> block.
+
+ * makeinfo/makeinfo.c (cm_image): new variable, alt_arg now allows
+ user-supplied alt attribute value and
+ ext_arg allows user-supplied extension for image files.
+
+ * makeinfo/toc.c (contents_update_html): add anchors at chapter
+ level entries
+ (shortcontents_update_html): hrefs in shortcontents point to the
+ above anchors in the detailed contents
+
+ * doc/texinfo.txi: document changes to @image and the new behavior
+ of shortcontents entries
+
+2001-06-14 <karl@gnu.org>
+
+ * makeinfo/node.c: no need for size_t.
+
+2001-06-13 <karl@gnu.org>
+
+ * texinfo.tex (\pdfmkdest): \normalturnoffactive, so refs and
+ defs match.
+ (\xrefX): pdf link defs no longer use @, so link refs shouldn't use @
+ either. (All xrefs in pdf were failing.)
+ (\mkpgn): remove redundant second definition.
+
+ * texinfo.tex (\smallerfonts): new font size.
+ (\smallexample, et al.): use it, in all cases, not just @smallbook.
+
+ 1999-11-30 Andreas Schwab <schwab@suse.de>
+ * doc/texinfo.tex (\xrefX): Turn off active characters when writing
+ out the link name for pdf.
+
+2001-06-13 <karl@gnu.org>
+
+ * doc/texinfo.txi: document that @smallexample is smaller in all
+ page formats now.
+
+2001-06-11 <karl@gnu.org>
+
+ * 4.0c.
+ * util/Makefile.am: Don't need automake patch any more, with
+ automake 1.4p4.
+
+ * configure.in (AC_FUNC_SETVBUF_REVERSED): only needed on
+ pre-sysvr3 systems that nobody has anymore? Or so Russ Allbery
+ informs me ...
+
+2001-06-08 <karl@gnu.org>
+
+ * makeinfo/Makefile.am (EXTRA_DIST): include texinfo.{dtd,xsl}.
+
+ * util/Makefile.am: automake-1.4p3 now.
+
+2001-06-07 <karl@gnu.org>
+
+ * util/texi2dvi: comment out conditional text, from Werner LEMBERG
+ <wl@gnu.org>.
+
+ 2001-06-02 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/echo-area.c (info_read_completing_internal): If there are
+ no completions, say that instead of "Not complete".
+
+ * configure.in (ALL_LINGUAS): add da
+
+ * makeinfo/Makefile.am (pkgdata_DATA): include texinfo.xsl.
+
+ * configure.in: update for autoconf 2.50.
+
+2001-06-04 <karl@gnu.org>
+
+ * util/Makefile.am (EXTRA_DIST): automake-14p2.patch now.
+ * util/automake-14p2.patch: rename from 14p1.
+
+2001-05-22 <karl@gnu.org>
+
+ * changes from feloy for lowercase xml names, etc.
+
+2001-05-21 <karl@gnu.org>
+
+ * util/Makefile.am (EXTRA_DIST): add automake-14p1.patch.
+ * makeinfo/Makefile.am (pkgdata_DATA): define to install
+ texinfo.dtd.
+
+ 2001-05-17 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/makeinfo.c (cm_xref, cm_inforef): Don't allow empty
+ first arguments in cross references.
+
+ * makeinfo/makeinfo.c: redo --help, basic patch from ke@suse.de.
+
+2001-05-03 <karl@gnu.org>
+
+ * doc/info.texi: move help-cross to be subnode of cross-refs,
+ instead dangling out in space.
+ * doc/info.texi: update from eli
+
+2001-05-02 <karl@gnu.org>
+
+ * makeinfo/xml.c (xml_push_current_element): need to select the
+ `name' member.
+
+2001-05-01 <karl@gnu.org>
+
+ * configure.in: 4.0b
+
+ * doc/info.texi (Help-Cross): subsection of Cross-refs.
+
+ * lib/system.h (va_alist, etc.): moved from makeinfo.c.
+ * makeinfo/makeinfo.c (va_alist, etc.): move to system.h
+
+ * makeinfo/xml.[ch]: new files from Philippe Martin <feloy@free.fr>.
+ * pretty much all files also modified for XML/DocBook output.
+ * doc/texinfo.txi: minimally mention --xml and --docbook.
+ * makeinfo/xml.c: convert to K&R until we can do ansi2knr.
+
+ * util/texindex.c,
+ * util/install-info.c,
+ * info/info.c: it's 2001.
+
+2001-04-15 <karl@gnu.org>
+
+ * doc/info.texi: major update from eli.
+
+2001-04-13 <karl@gnu.org>
+
+ 1999-10-16 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/node.c (cm_node): Don't generate cross-references to
+ "(DIR)".
+ * makeinfo/html.c (add_link): Likewise.
+
+ 1999-10-16 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/makeinfo.c (insert): Don't call html_output_head here.
+ (add_char): Call html_output_head here...
+ * makeinfo/cmds.c (cm_sp): ...and here...
+ * makeinfo/toc.c (cm_contents, cm_shortcontents): ...and here...
+ * makeinfo/node.c (cm_anchor): ...and here.
+
+ * makeinfo/html.c (html_output_head): `free' html_title if
+ expanded. Make <head> and <body> stand out.
+
+2001-04-12 <karl@gnu.org>
+
+ 1999-12-26 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/defun.c (defun_internal): Use execute_string instead
+ add_word_args to expand defined_name, type_name and category (in
+ HTML mode).
+
+2001-03-29 <karl@gnu.org>
+
+ * Makefile.am: simple license.
+
+2001-02-27 <karl@gnu.org>
+
+ 1999-12-17 Yoshiki Hayashi <t90553@mail.ecc.u-tokyo.ac.jp>
+ * info/terminal.h, info/terminal.c (term_kh, term_ke, term_kD):
+ New variables to hold Home, End, Delete key sequences.
+ * info/infomap.c (initialize_emacs_like_keymaps,
+ initialize_vi_like_keymaps): Set them.
+
+ * makeinfo/makeinfo.h,
+ * makeinfo/makeinfo.c: --split-size option from Yoshiki:
+ 1999-12-09 Yoshiki Hayashi <t90553@mail.ecc.u-tokyo.ac.jp>
+ * makeinfo/makeinfo.h (split_size): New option.
+ * makeinfo/makeinfo.c (long_options): Add split_size.
+ (usage): Ditto. Suggested by Richard Y. Kim.
+
+ * util/texi2dvi: -o support from Akim.
+
+2001-02-02 <karl@gnu.org>
+
+ * dir-example: don't need zsh twice.
+
+ From: Nishio Futoshi <fut_nis@d3.dion.ne.jp>, 02 Apr 2000.
+ * doc/texinfo.txi: capitalization fixes.
+ * doc/info.texi: up pointer fixes.
+ * doc/texinfo.txi: installing an info file.
+
+ * makeinfo/makeinfo.c: --output is for split html, not non-split.
+ From: Karl Eichwalder <keichwa@gmx.net>
+
+2001-01-12 <karl@gnu.org>
+
+ 1999-10-15 Eli Zaretskii <eliz@is.elta.co.il>
+ * makeinfo/cmds.c (cm_sc): Don't print the warning about
+ all-uppercase argument in menus under --no-headers.
+
+ * makeinfo/files.c: pass O_BINARY flag to open, suggested by bfox.
+
+2001-01-11 <karl@gnu.org>
+
+ * info/terminal.c [HAVE_TERMIOS_H && TCOON]: tcflow TCOOFF/TCCON
+ to resume output if user presses CTRL-S at the beginning of
+ things.
+ [HAVE_TERMIO_H && TCXONC]: ditto.
+ From Kevin Ryde <user42@zip.com.au>, 16jun2000;
+ cf. emacs/src/sysdep.c.
+
+2001-01-08 <karl@gnu.org>
+
+ * makeinfo/cmds.c: afivepaper, afourwide, afourlatex.
+ * doc/texinfo.txi: afivepaper
+
+2001-01-05 <karl@gnu.org>
+
+ * doc/info.texi: typo from: Martin Buchholz <martin@xemacs.org>.
+ * doc/info.texi: typo fixes from meyering.
+
+2001-01-02 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (remember_brace_1): don't assume command is
+ non-null, an (erroneous) input line like \hbox to7in{ passes in a
+ null.
+
+ * makeinfo/toc.c: fix from jan
+ * makeinfo/html.c: fix from jan for top-level references.
+
+2000-12-22 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: --help changes.
+ * doc/texinfo.txi: -o means the directory name for HTML output.
+
+2000-12-21 <karl@gnu.org>
+
+ * doc/texinfo.txi: switch to fdl
+
+ * makeinfo/html.c: doc fix.
+ * makeinfo/insertion.c: no space after _ I guess.
+ * makeinfo/cmds.c: no space after _ I guess.
+
+ * makeinfo/html.c (nodename_to_filename_1): fix up external
+ * top-node references.
+
+2000-12-20 <karl@gnu.org>
+
+* HTML table patch from Jan:
+ 2000-12-19 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo/multi.c (multitable_item),
+ (cm_tab): close html table columns. Also, align cell contents to
+ top, which is probably the most sensible thing to do for text.
+
+
+2000-12-19 <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (insert_toplevel_subdirectory): try
+ name.html if just name doesn't work.
+
+ * doc/texinfo.txi: document html output in .html directory
+ sometimes.
+
+ * util/Makefile.am (EXTRA_DIST): add install-info-html.
+
+ * util/texindex.c: 2000
+ * util/install-info.c: 2000
+ * info/info.c: 2000
+ * configure.in: 4.0a
+
+ * lib/system.h: include limits.h
+
+ * Applied HTML splitting changes from Jan:
+ 2000-11-10 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo: removed code for numbered split HTML output, removed
+ SPLIT_JCN conditional.
+
+ 2000-11-09 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo/html.c: prepared nodifying filename functions for
+ linking not non-spit HTML documents, by adding ``#anchor'' to
+ external refernces.
+
+ * doc/texinfo.txi (Installing HTML info): updated doco for --html
+ option, added node Installing HTML info.
+
+ * util/install-info-html.in: new script. The bare minimum
+ required for generating HTML index.
+
+ * lib/system.h: compilation fix.
+
+ 2000-11-08 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): [SPLIT_JCN]:
+ overloaded already way too hairy function with logic to put split
+ html output into subdirectory with basename of toplevel output
+ file.
+
+ * makeinfo/html.c (fix_filename): new function.
+
+ 2000-11-07 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * toc.c (toc_add_entry):
+ (contents_update_html):
+ (shortcontents_update_html): [SPLIT_JCN]: use hrefs for nodename based
+ html files.
+
+ * node.c (cm_node): [SPLIT_JCN]: create html filename based on
+ nodename (instead of a numbered node<num>.html filename).
+
+ * makeinfo/makeinfo.c (main): [SPLIT_JCN]: enable splitting of
+ html output.
+
+ * makeinfo/html.c
+ (add_url_name,add_nodename_to_filename,nodename_to_filename): new
+ functions.
+
+2000-12-15 <karl@gnu.org>
+
+ * configure.in (AC_CHECK_HEADERS): add limits.h explicitly.
+
+2000-11-10 <karl@gnu.org>
+
+ * dir-example: update
+ * info/nodes.c: doc fixes, etc.
+
+ * incorporated verbatim patch from janneke:
+ 2000-04-14 <janneke@gnu.org>
+
+ * applied texinfo-3.12s.jcn4 patch
+
+ 1999-09-02 <janneke@gnu.org>
+
+ * makeinfo/cmds.c,
+ * makeinfo/insertion.c: @verbatiminclude file
+ * doc/texinfo.tex: @verbatiminclude file
+ * doc/texinfo.txi: @vebatiminclude file doco
+ * NEWS: added @verbatiminclude to Language section
+
+ 1999-09-01 <janneke@gnu.org>
+
+ * makeinfo/makeinfo.c: bf: @exdent (urg6.texi) -- Rolled into 4.0
+ * NEWS: added verb* to Language section
+ * doc/texinfo.txi: @verb, @verbatim doco
+ * doc/texinfo.tex: tricky tex-fix for @verb{<char>..<char>}
+ * doc/texinfo.tex: real tab expansion for @verbatim mode
+ * doc/texinfo.tex: proper start of environment, no indentation
+
+ 1999-08-31 <janneke@gnu.org>
+
+ * makeinfo/cmds.c:
+ * makeinfo/insertion.{c,h},
+ * makeinfo/makeinfo.{c,h}: redo of @verbatim, @verb{<char>..<char>}
+ * doc/texinfo.tex: fixed @verb{<char>..<char>}
+
+ 1999-08-30 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo/cmds.c,
+ * makeinfo/insertion.{c,h},
+ * makeinfo/makeinfo.{c,h}: added @verbatim (and preliminary @verb)
+ support
+ * doc/texinfo.tex: added @verbatim (and preliminary @verb) support
+
+ 1999-08-24 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * bf: empty node: makeinfo/node.c:cm_node () -- Rolled into 4.0
+
+
+2000-10-18 <karl@gnu.org>
+
+ * doc/info.texi: eli update
+
+2000-09-22 <karl@gnu.org>
+
+ * makeinfo/defun.c: warn if non-whitespace follows @defun'd name
+ (suggestion from Akim).
+
+ Installed some patches:
+
+ 2000-08-04 Paul Eggert <eggert@twinsun.com>
+ * makeinfo/multi.c (find_template_width):
+ Don't access before start of *PARAMS.
+
+ 2000-08-21 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/filesys.c (info_file_in_path): Reject FILENAME if it is
+ empty, or ".", or "..".
+
+ 2000-08-23 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/session.c (info_menu_or_ref_item): If the user have chosen
+ menu item or xref that's identical to defentry's label, use
+ defentry instead of looking for its label. Otherwise, select the
+ entry whose position is the closest to the window's point, in
+ case there's more than a single entry with that label.
+
+2000-09-12 <karl@gnu.org>
+
+ * doc/texinfo.txi: it's 2000 now.
+ * doc/texinfo.txi: document the only real (and rare) reason for not using implicit pointer
+ creation.
+
+2000-09-06 <karl@gnu.org>
+
+ * configure.in: test all termcap variables for existence. From
+ andy@rz.uni-karlsruhe.de.
+
+ * configure.in (ALL_LINGUAS): include ja.
+ * lib/system.h [HAVE_IO_H]: make #include <io.h> conditional for
+ BeOS. Reported by Dan Moore, dan@moore.cx.
+ * configure.in (AC_CHECK_HEADERS): add io.h.
+
+2000-06-05 <karl@gnu.org>
+
+ * doc/texinfo.txi: forgot to escape {}.
+
+2000-05-30 <karl@gnu.org>
+
+ * info/filesys.c (is_dir_name): check all info suffixes as well as
+ the compression suffixes. Fixes segmentation fault on a dir.info
+ file ending after the * Menu.
+
+2000-05-28 <karl@gnu.org>
+
+ * doc/texinfo.txi: Forgot {arg} in @rmacro example. From Olaf B.
+
+2000-05-27 <karl@gnu.org>
+
+ * doc/txi-cs.tex: update from: Stepan Kasal <kasal@suse.cz>.
+
+ * doc/Makefile.am (install-data-local): reformat warning per
+ François to hopefully make it more noticeable.
+
+ 2000-02-08 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/session.c (incremental_search): Don't retain RET when
+ exiting isearch. Suggested by Hrvoje Niksic <hniksic@iskon.hr>.
+
+2000-05-22 <karl@gnu.org>
+
+ * doc/texinfo.txi: pageparams -> pagesizes
+
+2000-05-18 <karl@gnu.org>
+
+ * makeinfo/lang.c (cm_accent_tilde): need N in list.
+ From: kama@hippo.fido.de (Karl Heinz Marbaise)
+
+ * makeinfo/files.c (find_and_load): read only the number of bytes
+ available in the buffer. Also, remove one-byte-at-a-time reading
+ in the WIN32 case.
+ From: "J. David Bryan" <dbryan@bcpl.net>
+
+ * info/man.c: use eli's patch after all, we re-increment j at the
+ top of the loop.
+
+2000-05-16 <karl@gnu.org>
+
+ * info/man.c (clean_manpage): don't write before the beginning of
+ newpage.
+ (based on patch from Eli).
+
+2000-02-03 <karl@gnu.org>
+
+ * doc/texinfo.txi: remove spurious space. from kaja.
+
+1999-10-12 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile.am (install-tex): install all txi-?? files.
+
+1999-10-01 W. L. Estes <will@fumblers.org>
+
+ * makeinfo/cmds.c: dont treat @center as separate paragraph,
+ use div element to output center
+
+1999-09-29 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/README: Say `dir-example', not DIR.
+
+ * lib/system.h (DEFAULT_INFOPATH) [__DJGPP__]: Define.
+
+1999-09-28 Karl Berry <karl@gnu.org>
+
+ * configure.in,
+ util/texi2dvi: version 4.0.
+ * doc/texinfo.txi: New isbn.
+
+1999-09-24 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Fixes from Oleg.
+
+1999-09-20 Karl Berry <karl@gnu.org>
+
+ * makeinfo/node.c: Don't write region at an anchor.
+ From: Thomas Esken <esken@nmlab.informatik.fh-dortmund.de>
+
+ * info/terminal.c: Only set dumb terminal if tgetent returns < 0,
+ not 0.
+ For HP-UP 11.
+ From jeff.hull@state.co.us.
+
+ * makeinfo/footnote.c: Don't translate the `Footnotes' string
+ according to LANG, it should be according to
+ @documentlanguage, which isn't implemented yet.
+ From: Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * doc/texinfo.txi: @end direntry from kama.
+
+1999-09-19 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: \ninett is now \smalltt.
+
+ * doc/texinfo.txi: arnold changes
+
+ 1999-09-03 Akim Demaille <akim@epita.fr>
+ * texi2dvi (getopt): batch has to be assigned `eval', not `echo'.
+ (bibtex): Launch BibTeX also when the LOG file complains that
+ there are no BBL file.
+
+ * doc/texinfo.txi: Document that @anchor ignores spaces.
+
+ * makeinfo/cmds.c (cm_shyph): remove, &shy; is not supported in
+ browsers.
+ From: Thomas Esken <esken@nmlab.informatik.fh-dortmund.de>
+
+ * makeinfo/makeinfo.c: Don't crash if current_indent = 0.
+ From: Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * makeinfo/makeinfo.c: Avoid blank lines between @menu entries.
+ * configure.in: 3.12t
+
+ 1999-08-31 Eli Zaretskii <eliz@is.elta.co.il>
+ * info/info.c (info_short_help): Document --apropos.
+
+1999-09-18 Karl Berry <karl@gnu.org>
+
+ * makeinfo/html.c (html_output_head): use text for <title>, not
+ html markup. From François.
+ * makeinfo/makeinfo.c (text_expansion): new routine.
+ * makeinfo/cmds.c (cm_settitle): don't expand the title here,
+ we'll do it later.
+
+ * makeinfo/makeinfo.h (text_expansion): declare.
+
+ * info/indices.c,
+ * info/infodoc.c,
+ * info/session.c,
+ * info/footnotes.c: translate errors.
+ * info/info.h: Use `' instead of "" in errors.
+
+1999-09-06 Karl Berry <karl@gnu.org>
+
+ +1999-08-24 Jan Nieuwenhuizen <janneke@gnu.org>
+ * makeinfo/node.c:cm_node: don't compare current_node when null.
+
+ 1999-08-23 W. L. Estes <will@fumblers.org>
+ * makeinfo/node.c (cm_node): write <a name=> tags even
+ ifusing --no-headers
+
+ * configure.in: ospeedlib -> trylib
+ From: Andreas Schwab <schwab@suse.de>
+
+ * makeinfo/makeinfo.c (read_command): add explicit 0 to return if
+ enclosure command. From: Andreas Jaeger <aj@arthur.rhein-neckar.de>.
+
+1999-08-19 Karl Berry <karl@gnu.org>
+
+ * configure.in: add missing quotes, logic in new termcap library
+ check.
+
+1999-08-17 Karl Berry <karl@gnu.org>
+
+ * makeinfo/multi.c,
+ * makeinfo/sectioning.c,
+ * makeinfo/node.c,
+ * makeinfo/macro.c: omit unused vars
+ * info/session.c (info_goto_invocation_node): omit unused decl.
+
+ * configure.in: Check for extra termlib variable necessary on
+ HP-UX 9.
+ From: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+
+ 1999-08-16 Andreas Schwab <schwab@suse.de>
+ * info/terminal.c (terminal_initialize_terminal): Try tcgetattr
+ and cfgetospeed in preference to TIOCGETP.
+ (original_tchars, original_ltchars): Define them only if needed.
+
+1999-08-16 Karl Berry <karl@gnu.org>
+
+ * info/infodoc.c (create_internal_info_help_node): rename arg.
+ (info_find_or_create_help_window): avoid deref of null eligible.
+
+ * info/terminal.c (TIOCGETP, TIOCGETC, TIOCGLTC) [alpha && linux]:
+ #undef. Useless stubs are present.
+
+1999-08-15 Karl Berry <karl@gnu.org>
+
+ * info/nodes.c: Remove reference to nonexistent RFC for Info
+ files.
+
+1999-08-11 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/nodes.c (info_find_file_internal): If the file's contents
+ were gc'ed since last time it was loaded, reload the file.
+
+Wed Aug 11 06:42:47 1999 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile.am (EXTRA_DIST): add txi-pt.tex from Lalo.
+
+Mon Aug 9 16:28:18 1999 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Support preloaded texinfo.tex, from Stephen.
+
+ * makeinfo/makeinfo.c (add_char): restore ugly check for first
+ character being <.
+
+ * makeinfo/cmds.c (cm_kbd): Increment in_fixed_width_font for
+ html.
+
+ * doc/texinfo.txi: effect not affect
+
+ * makeinfo/makeinfo.c: Rearrange help.
+
+ * makeinfo/toc.c: Cast %* arguments to (int) to placate gcc
+ -Wformat.
+
+Fri Aug 6 13:03:14 1999 Karl Berry <karl@gnu.org>
+
+ * util/install-info.c: Hardwire the File: dir, Node: top part of
+ the skeleton dir file.
+ Report from: Stanislav Brabec <utx@k332.feld.cvut.cz>
+
+ * info/Makefile.am (BUILT_SOURCES): rm -f $(BUILT_SOURCES), a
+ kludge.
+
+ 1999-07-28 Karl Eichwalder <ke@gnu.franken.de>
+
+ * makeinfo/makeinfo.c: Fix help string (-o).
+
+ 1999-07-30 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (cm_uref, cm_email): Don't collapse -- and
+ `` in the URL part of the reference.
+
+ 1999-08-03 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * util/install-info.c (main): For entries given on command line,
+ set entry_sections and entry_sections_tail members to NULL, and
+ set text_len member to the entry length. After processing the
+ Info file, update the entry_sections pointers of all entries that
+ came from the command line.
+
+ * util/texindex.c (sort_offline, sort_in_core): use off_t rather
+ than long.
+ Found on FreedBSD 2.2.8 by "Trond Endrestol" <endrestol@hotmail.com>.
+
+Mon Jul 19 17:16:46 1999 Karl Berry <karl@gnu.org>
+
+ * configure.in: 3.12n
+
+ * makeinfo/makeinfo.c (add_char): Don't insert <p> if we're in
+ @html.
+
+ * makeinfo/html.c (add_escaped_anchor_name),
+ * makeinfo/toc.c (toc_add_entry): use URL_SAFE_CHAR.
+ * makeinfo/makeinfo.h (HTML_SAFE, URL_SAFE_CHAR): new macros.
+
+Sun Jul 18 14:47:40 1999 Karl Berry <karl@gnu.org>
+
+ * dir-example: Add bzip2.
+
+ * configure.in: 3.12m.
+
+ * doc/texinfo.txi (@afourlatex,@afourwide): add to command list.
+
+1999-07-17 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (cm_xref): Don't collapse `` and -- while
+ expanding node names. Generate a terminating period for
+ @pxref, when it has more than a single argument.
+
+ * makeinfo/index.c (cm_printindex): Don't collapse `` and -- while
+ expanding node names.
+
+Sat Jul 17 16:33:45 1999 Karl Berry <karl@gnu.org>
+
+ * 3.12l.
+
+ * doc/texinfo.txi: @alias, @definfoenclose, etc.
+
+ * util/texindex.c (indexify): error message instead of abort(2)
+ when no page number.
+
+Fri Jul 16 18:00:26 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Overfull boxes, help2man, etc.
+
+ * util/Makefile.am (EXTRA_DIST): texi-outline.gawk is really
+ outline.gawk, add fixref.gawk and prepinfo.awk and
+ texi-docstring-magic.el.
+
+Thu Jul 15 18:57:54 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: .fmt, etc.
+ * doc/texinfo.txi: More macro docs, etc.
+
+Wed Jul 14 19:58:47 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Give good quote.
+
+ * util/Makefile.am (EXTRA_DIST): add texi-outline.gawk.
+
+ From: kama@hippo.fido.de (Karl Heinz Marbaise)
+ * makeinfo/toc.c (contents_update_html): go back to start level.
+ * doc/texinfo.txi: deftypeop
+
+ From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>
+ * makeinfo/toc.c (toc_add_entry): don't assume sprintf return type
+ is int.
+ * makeinfo/sectioning.c (insert_and_underscore): declare more
+ unsigned char *.
+ * makeinfo/macro.h (itext_info, itext_size): remove declarations,
+ they're defined static.
+ * makeinfo/makeinfo.c: Split up help string even more.
+
+Tue Jul 13 17:16:18 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Document @rmacro.
+ * makeinfo/macro.c (cm_rmacro): new command to do @allow-recursion
+ by default.
+ (define_macro): split off from cm_macro.
+
+ * makeinfo/macro.h (cm_rmacro): declare.
+ * makeinfo/macro.h (delete_macro): do not need to export.
+ * makeinfo/cmds.c (rmacro): new command.
+
+ * makeinfo/html.c,
+ * makeinfo/toc.c,
+ * makeinfo/lang.c,
+ * makeinfo/makeinfo.c: Use strchr instead of member.
+
+Mon Jul 12 08:01:19 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: document this.
+ * makeinfo/macro.c (apply): warn if \ in macro body is not
+ followed by a parameter name or \, instead of silently
+ accepting it, for compatibility with TeX.
+
+ * makeinfo/macro.c: Doc fix.
+
+Sun Jul 11 12:49:50 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/macro.c (cm_macro): do @quote-arg implicitly if single
+ argument to macro.
+ * doc/texinfo.txi: Document this.
+
+ * doc/texinfo.txi (Smallcaps): Document makeinfo warning if arg is
+ all uppercase.
+ * makeinfo/cmds.c (cm_sc): warn if arg is all upper (suggested by
+ Jim Meyering).
+
+ * makeinfo/cmds.c (cm_var): warn if argument contains any of ,[]()
+ which are unlikely to be allowable in real variable names.
+ Suggested by rms.
+
+ * makeinfo/makeinfo.h (member): remove weird masking macro.
+
+ * doc/texinfo.txi: Probably ok to indent @example.
+
+ * configure.in: 3.12k.
+
+ * makeinfo/html.c (add_escaped_anchor_name): Cast to unsigned char
+ for 8-bit chars. From Yoshiki.
+
+ * makeinfo/makeinfo.c: complain -> warn for sake of <80 chars.
+
+1999-07-09 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/multi.c (multitable_item): Quote the value of align=
+ property.
+
+ * makeinfo/defun.c (defun_internal): Ditto.
+
+ * makeinfo/cmds.c (cm_center): Ditto.
+
+ * makeinfo/toc.c (toc_add_entry): New argument ANCHOR; all callers
+ changed. In HTML mode, expand NODE_NAME, or use ANCHOR, if
+ non-NULL, and save it together with the TOC name in the name
+ member of the TOC entry.
+ (toc_add_entry, toc_find_section_of_node): Add a warning in a
+ comment that the NODE argument must be unexpanded.
+ (contents_update_html): Terminate the TOC entry with </a>.
+
+ * makeinfo/sectioning.c (sectioning_html): If the sectioning
+ command is outside any node, generate explicit anchor and pass it
+ to toc_add_entry.
+
+ * makeinfo/node.c (expand_node_name): Now external instead of
+ static.
+ (cm_node): Output expanded node name in the navigation bar.
+
+ * makeinfo/node.h: Declare expand_node_name.
+
+ * makeinfo/index.c (cm_printindex): Produce valid HTML links, even
+ if index->node is NULL or empty. Fix format of index under
+ --no-headers.
+
+Fri Jul 9 18:09:28 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Pair @end html properly. From Olaf B.
+
+ * doc/Makefile.am (EXTRA_DIST): add txi-nl.tex from Marcel van der Boom
+ <marcel@virtualprojects.org>.
+
+ * doc/txi-en.tex: Doc fix.
+
+Wed Jul 7 16:07:44 1999 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile.am: Doc fix.
+
+ * configure.in (txi_CHECK_DECLS): call this new macro (in
+ acinclude.m4).
+ * acinclude.m4: new file.
+
+Tue Jul 6 19:12:37 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.h,
+ * makeinfo/insertion.c,
+ * makeinfo/cmds.c,
+ * makeinfo/defun.c: new command @deftypeop.
+ Suggestion from: booth@us.ibm.com.
+
+1999-07-05 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (cm_value): Don't convert quotes and dashes
+ in the argument of @value, since @set doesn't.
+
+Mon Jul 5 16:43:23 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c (get_item_function): return "@ " rather
+ than "@". (command_needs_braces): new fn.
+ (cm_item): handle @itemize markers that don't take braces.
+ Bug reported by Stephen, prototype fix from Yoshiki.
+
+ * doc/texinfo.txi (Contents): @contents ignored at beginning when
+ outputting to stdout.
+ Installed this.
+>1999-05-02 Eli Zaretskii <eliz@is.elta.co.il>
+> * makeinfo/toc.c (cm_contents, cm_shortcontents): If writing to
+> stdout, output the contents and short contents immediately, and
+> assign NULL to contents_filename and shortcontents_filename, so
+> that toc_update won't try to rewrite stdout.
+
+
+ * makeinfo/sectioning.c (sectioning_html): declare starting_pos
+ and ending_pos as unsigned char * since they're based on
+ output_paragraph.
+
+ * makeinfo/insertion.c: Cast output_paragraph to char * for sake
+ of strncmp prototype (on IRIX 4).
+ From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>
+
+
+ * info/man.c (get_manpage_contents): restore previous (default)
+ SIGCHLD handler so the pclose when gunzipping info files
+ doesn't fail with `No child processes' (because
+ reap_children reaped it).
+ From: Josip Rodin <jrodin@public.srce.hr>
+ njs@uclink4.berkeley.edu, 38063-forwarded@bugs.debian.org
+
+Fri Jul 2 14:26:22 1999 Karl Berry <karl@gnu.org>
+
+ From gildea:
+ * info/terminal.c (TIOCGETC) [M_XENIX && TIOCGETC]: #undef.
+ * info/session.c (strncasecmp) [M_XENIX]: declare.
+
+Thu Jul 1 19:25:12 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_value): erroneous capitalization in
+ error message.
+
+ * makeinfo/insertion.c (end_insertion): @end html should turn html
+ escaping back on. From esr.
+
+ * makeinfo/makeinfo.c (cm_pxref): No period needed to terminate
+ cross-reference.
+
+Sun Jun 13 16:12:41 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Remove some more node links.
+
+Sat May 1 16:01:36 1999 Karl Berry <karl@gnu.org>
+
+ * info/info.c: Single space for option indent to match others.
+
+ * makeinfo/makeinfo.c,
+ * util/texindex.c,
+ * util/install-info.c: Must indent option list for help2man.
+
+ * info/infodoc.c [HELP_NODE_GETS_REGENERATED]: set to true.
+ (info_internal_help_text): put moving cmds first so they know how to go
+ forward in the help window.
+ (create_internal_info_help_node): can't always quit help with C-x 0.
+ (info_find_or_create_help_window): pass !one_window_p.
+
+1999-04-29 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * makeinfo/makeinfo.c (cm_xref): Don't collapse --- to -- etc.,
+ in references.
+
+Mon Apr 26 16:41:55 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/node.c (validate): arrange to translate the reference type.
+ Report from Sergio.
+
+ * makeinfo/makeinfo.c (validate): should not be declared here.
+
+ * makeinfo/index.c (cm_printindex): <ul compact> is not
+ translatable. From Yoshiki.
+
+ * doc/Makefile.am (EXTRA_DIST): include new txi-es.tex from Adrian
+ Perez Jorge <alu1415@csi.ull.es>. And new txi-en.tex.
+
+Sun Apr 25 16:08:27 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_settitle): don't output html head here.
+
+ * makeinfo/makeinfo.c: Move html routines to html.c.
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add html.[ch].
+ * makeinfo/html.[ch]: new files.
+
+ * makeinfo/makeinfo.c: Restore -- in --output line. From Sergio.
+
+1999-04-23 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * makeinfo/cmds.c (cm_center): Recover the previous state when
+ called with --html.
+
+1999-04-24 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/cmds.c (cm_bye): Flush the output, in case some command
+ produced it immediately before @bye.
+
+ * makeinfo/toc.h (TOC_ENTRY_ELT): New member: containing_node.
+
+ * makeinfo/toc.c (lots_of_stars): New variable.
+ (toc_add_entry): Add a new parameter node_name; all callers
+ changed. Record the name of the node containing the section.
+ (toc_find_section_of_node): New function.
+ (toc_free): Free the new containing_node member.
+ (contents_update_info, shortcontents_update_info): Underline the
+ title with stars. Output two empty lines after the TOC.
+ (contents_update): Fix off-by-one error in writing the rest of the
+ file after updating the TOC.
+
+ * makeinfo/index.c (cm_printindex): Save and restore line_number
+ and input_filename. Don't output the "* Menu" header when
+ --no-headers is in effect. Make the fake node name for index
+ entries that are outside any node be more explanatory, and emit an
+ error for such index entries. Under --no-headers, output a
+ reference to the section name, as returned by a call to
+ toc_find_section_of_node, instead of a node name.
+
+1999-04-24 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/index.c (struct index_elt): Add a new member
+ entry_text.
+ (free_index, make_index_entries_unique): Free the entry_text
+ member.
+ (index_add_arg): Don't HTML-escape the index entry here.
+ (index_add_arg): Initialize the entry member to NULL. Put the
+ entry text into the entry_text member.
+ (sort_index): Expand the index entries as if in non-HTML mode.
+ Put the expansion into the entry member of struct index_elt.
+ (cm_printindex): Allocate the line[] array in Info mode only.
+ In HTML mode, escape and expand the original index entry text,
+ don't use the results of expansion inside sort_index.
+
+ * makeinfo/cmds.c (cm_r): Undo the effect of @code while printing
+ one of the "code"-style indices in HTML mode.
+
+1999-04-23 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/infomap.c (initialize_vi_like_keymaps): Bind DEL in echo
+ area to ea_rubout, except for __MSDOS__.
+
+ * doc/info-stnd.texi (Node Commands): Document that `I' only
+ produces its effect for programs documented in the current Info
+ file. Tell them to invoke `I' from DIR if it doesn't work from
+ current place.
+
+Thu Apr 22 09:59:02 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c,
+ * info/info.c: Rewrite help string a little more.
+
+ * doc/info-stnd.texi: Change chapter name to match node name,
+ * other changes.
+
+ * makeinfo/cmds.c (cm_bye): call discard_braces.
+
+ * makeinfo/cmds.c (cm_settitle): output more meta and link tags.
+
+ * configure.in (ALL_LINGUAS): add eo.
+
+ * util/install-info.c [STRIP_DOT_EXE]: #if not #ifdef
+
+Wed Apr 21 19:40:51 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: Doc fix.
+
+ * makeinfo/sectioning.c (insert_and_underscore): do not output
+ html anchor here.
+ * makeinfo/node.c (cm_node): do anchor at node name not sectioning
+ title.
+
+ * makeinfo/node.c: Newlines on node lines.
+
+Tue Apr 20 13:02:46 1999 Karl Berry <karl@gnu.org>
+
+ * info/man.c (get_manpage_contents): freopen stdin and stderr to
+ /dev/null rather than closing them. http://bugs.debian.org/14787
+
+Mon Apr 19 14:12:09 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Document possibility of `titlepage' stuff for
+ plain text output using @ifinfo.
+ Report from: Kurt Hornik <Kurt.Hornik@ci.tuwien.ac.at>.
+
+ * makeinfo/cmds.c: Screw that.
+ * doc/texinfo.txi: Fix up frontmatter a bit.
+
+ * dir-example: Spaces not tabs.
+ * dir-example (R FAQ): add.
+
+ * makeinfo/makeinfo.c: Lowercase makeinfo in first line.
+
+ * doc/info.texi (The node reached...): is a @subsection not a
+ @subsub.
+
+ * doc/texinfo.txi: Document option rename.
+ * makeinfo/makeinfo.c: Rename option to commands-in-node-names.
+
+ * makeinfo/index.h (index_compare_fn): declare.
+ * makeinfo/index.c (index_element_compare): call through new
+ variable index_compare_fn, and set it to strcoll if
+ @documentlanguage was used and LANG != en.
+ #include lang.h.
+
+Sat Apr 17 14:46:47 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c (current_item_function, cm_item): rewrite
+ to skip all conditionals.
+ (cm_item): use current_item_function rather than current_insertion_type
+ to check what to use for @item, so @ifset etc. can be used around
+ @items.
+ Report from: "W. L. Estes" <wlestes@br20920.uncg.edu>.
+
+ * makeinfo/makeinfo.c (current_insertion_type): no need to
+ declare.
+
+ * makeinfo/makeinfo.c: Add examples to help message.
+
+ * util/texindex.c (usage): Rearrange --help, avoid extra newline.
+
+ * info/info.c: Sort --help in the usual place.
+
+ * makeinfo/makeinfo.c: Reindent help message, rename
+ --expensive-validation to --commands-in-nodes.
+
+Fri Apr 16 17:53:48 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_ignore_arg): new routine.
+ (cm_ignore_line_no_op): remove, can use cm_ignore_line.
+
+Tue Apr 13 16:45:39 1999 Karl Berry <karl@gnu.org>
+
+ * doc/info-stnd.texi: Frontmatter changes.
+
+ * doc/info.texi: Remove advanced remark in first node.
+
+ * doc/texinfo.txi: Texinfo.tex does macros now. From Eli.
+
+ * doc/texinfo.txi: Document @w{ } to produce an unbreakable space.
+
+ * util/texi2dvi: Update from Akim, avoid Solaris ucb echo weirdness.
+
+ * info/infodoc.c: Parenthesize function calls, don't depend on
+ gettext being there. Report from: Doug Semler
+ <doug@seaspace.com>.
+
+1999-04-12 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/infomap.c (initialize_vi_like_keymaps): Initialize the echo
+ are keymap *before* it is filled up with keys.
+
+1999-04-10 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/macro.c (execute_macro): Reset the line number to where
+ the macro argumenst begin, before executing its expansion.
+
+ * makeinfo/makeinfo.c (cm_xref): Expand the name of arguments
+ before writing them in HTML mode.
+ (handle_menu_entry): Expand the name of the gleaned node before
+ writing it in HTML mode.
+
+ * makeinfo/sectioning.c (sectioning_html): Expand the name of the
+ current node when producing the <a name=... anchor.
+
+ * makeinfo/node.c (cm_node): Expand the name of node and its links
+ before outputting them in HTML mode.
+
+ * makeinfo/index.c (cm_printindex): Expand node names to which the
+ index points.
+
+ * makeinfo/footnote.c (cm_footnote): Call execute_string instead
+ of add_word_args, since current_node needs to be expanded. Expand
+ the name of the Footnotes node before calling
+ remember_node_reference.
+
+ * makeinfo/tests/node-expand.txi: New test, for testing how node
+ names are expanded in @node, @menu, cross-references, and
+ indices.
+
+ * makeinfo/makeinfo.c (add_char): If we output <p>, adjust the
+ affected brace positions by 3, so cm_xxx functions get what they
+ expect in START and END.
+ (insert_html_tag): Likewise.
+
+ * makeinfo/cmds.c (cm_sc): Remove the kludge that looks for the
+ beginning of <small>, it is no longer needed.
+
+ * makeinfo/macro.c (cm_definfoenclose): Don't stop at the first
+ blank after the second comma: the blank may belong to the second
+ delimiter.
+
+ * makeinfo/tests/htmlpara.txi: New test, for the commands affected
+ by the <p> output at paragraph beginning.
+
+ * makeinfo/makeinfo.h (expensive_validation): New option.
+
+ * makeinfo/makeinfo.c (long_options): Add expensive_validation.
+ (usage): Likewise.
+
+ * makeinfo/node.c (find_node): If NAME isn't found verbatim, try
+ expanding it and every node name in tag table, before comparing
+ them, but only if expensive_validation is non-zero.
+ (find_node_reference): Likewise.
+ (cm_node): Don't expand node name and its links here.
+ (validate_file): If direct comparisons fail, try expanding the
+ comparees before giving up, unless expensive_validation is zero.
+ Switch the order of NODE and UP in error message about a lacking
+ menu item.
+
+1999-04-07 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/index.c (cm_printindex): Don't output "Menu" header.
+
+ * makeinfo/node.c (get_node_token): Collapse whitespace in node
+ names.
+ (glean_node_from_menu, expand_node_name): Likewise.
+
+ * info/infomap.c (initialize_vi_like_keymaps): Bind all the 256
+ keys to ea_insert, like the Emacs-like case does.
+
+ * doc/info-stnd.texi (Invoking Info): Document support for files
+ compessed with bzip2, and the --vi-keys option.
+ (Many places): Document key bindings under --vi-keys.
+
+1999-04-06 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/session.c (info_last_node, info_first_node): With a numeric
+ argument, go to ARGth node counting from the beginning. Skip
+ anchor tags when looking for the target node--the last tag can be
+ an anchor, for example.
+ (last_search_direction, last_search_case_sensitive): New
+ variables.
+ (last_search_for_string): Remove variable.
+ (info_search_internal): Always move point by one notch before
+ beginning the search, to avoid complications in repeated search
+ commands. When looking for the next node tag, skip any anchor
+ tags.
+ (info_search_1): Accept a 5th argument ASK_FOR_STRING, and only
+ prompt for search string if it's non-zero. All callers changed.
+ Look for the COUNTth occurence of the string.
+ (info_search, info_search_backward, info_search_case_sensitively):
+ Set last_search_direction and last_search_case_sensitive.
+ (info_search_next, info_search_previous): New commands, repeat
+ last search in the same or reverse direction without prompting the
+ user for the string.
+
+ * info/infomap.c (initialize_emacs_like_keymaps): Bind `C-x n' to
+ info_search_next and `C-x N' to info_search_previous.
+ (initialize_vi_like_keymaps): Bind `n' to info_search_next and `N'
+ to info_search_previous.
+
+1999-04-04 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (get_rest_of_line): Don't expand non-macros,
+ so that macro-expanded output will still have them.
+
+1999-04-03 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/node.c (cm_node): Expand the node name and its links
+ completely before using them, so that they could use e.g. @value{}
+ etc.
+
+ * makeinfo/makeinfo.c (replace_with_expansion): Don't
+ remember_itext if we are executing_string.
+
+ * makeinfo/sectioning.c (sectioning_html): Remove #ifdef
+ HAVE_MACROS. Don't call me_execute_string if already
+ executing_string.
+
+ * makeinfo/toc.c (toc_add_entry): Expand macros in TOCNAME right
+ here, since the macro can be later redefined.
+ (contents_update_html, contents_update_info,
+ shortcontents_update_html, shortcontents_update_info): Use stdio
+ functions for output instead of add_word etc.
+ (rewrite_top, contents_update, shortcontents_update, toc_update):
+ New functions, replace the TOC placebo with the actual TOC.
+ (cm_contents): Output a placebo instead of writing the TOC.
+ (cm_shortcontents): Output a placebo instead of writing the short
+ TOC.
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): Call toc_update
+ if appropriate.
+
+ * makeinfo/sectioning.c (cm_top): Don't output the HTML header
+ here, since the Top node might be preceeded by other commands,
+ like @contents.
+
+ * makeinfo/cmds.c (cm_settitle): Output the HTML header here.
+
+ * makeinfo/node.c (set_current_output_filename): New function,
+ saves the name of the actual file we are now writing, including in
+ the case of split-HTML output.
+ (cm_node): Call it to record the name of output file.
+
+ * makeinfo/footnote.c (free_pending_notes): Re-initialize
+ current_footnote_number to 1.
+
+ * makeinfo/index.c (index_add_arg): Remove redundant xstrdup.
+ (cm_printindex): Don't free index->entry: it is freed in
+ free_index, if, e.g., there's more than one file to convert.
+
+ * makeinfo/makeinfo.c (init_internals): Call toc_free.
+
+Mon Apr 5 16:53:33 1999 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile.am: Texmf_{texinfo,dvips}: dirs not files. From
+ Kurt Hornik.
+
+Wed Mar 31 13:50:09 1999 Karl Berry <karl@gnu.org>
+
+ * Pretest 3.12h.
+
+ * makeinfo/node.c (last_node_p): new fn.
+ (split_file): call it, instead of assuming no more entries means
+ no more nodes. (Loses with anchors.)
+ Report from: "Oleg S. Tihonov" <ost@benetnash.ffke-campus.mipt.ru>.
+
+ * makeinfo/index.c (sort_index): whether an entry is @code or not
+ depends on the element, not the index, because of synindex.
+
+ * doc/Makefile.am (install-tex): Must use $(TEXMF), do
+ $(mkinstalldirs) on tex dirs.
+ From: Nathan Sidwell <nathan@acm.org>.
+
+ * doc/texinfo.txi: Document need for blank line before @image if
+ you want space.
+
+ * Install changes from Eli:
+
+ 1999-03-09 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/infodoc.c (info_internal_help_text): Remove hard-wired key
+ names, use %-10s instead.
+ (info_help_keys_text): New variable, holds two variants of keys
+ that invoke basic commands, indexed by vi_keys_p.
+ (create_internal_info_help_node): Use info_help_keys_text[].
+
+ * info/window.c (build_message_buffer): Support more general
+ format strings, like %-10.15s, %+4d etc.
+
+ * info/infomap.c (initialize_vi_like_keymaps): Bind ESC-h, ESC-t,
+ C-x LFD and C-x RET.
+
+ 1999-03-08 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * util/install-info.c (output_dirfile): Sort the entries and
+ output them in alphabetic order. Output each entry only in those
+ sections where it belongs.
+ (parse_input): New function, code moved from main. Process
+ sections and entries in a single loop, and record with each entry
+ the list of sections where that entry belongs. Record each entry
+ separately, not all of them together as a single block.
+ (parse_dir_file): New function, code moved from main.
+ (main): Move code to parse_input and parse_dir_file. Put the new
+ entries only into sections where they belong.
+ (compare_entries_text): New function, called when sorting new
+ entries.
+
+ * info/infomap.c (initialize_vi_like_keymaps): New function. Bind
+ keys a-la Less, including new functions from session.c below.
+ (initialize_emacs_like_keymaps): New function, with the guts of
+ initialize_info_keymaps.
+
+ * info/session.c (info_scroll_forward, info_scroll_backward): If
+ default_window_size is non-negative, use it as the default number
+ of lines to scroll.
+ (info_scroll_forward_set_window, info_scroll_backward_set_window,
+ info_down_line, info_up_line, info_scroll_half_screen_down,
+ info_scroll_half_screen_up, info_search_backward): New functions,
+ for Less-like look and feel.
+
+Tue Mar 30 16:44:53 UTC 1999 Karl Heinz Marbaise <kama@hippo.fido.de>
+
+ * doc/txi-de.tex:
+ - added additional putwordin
+ * doc/texinfo.txi:
+ - changed defivar into deftypeivar
+ * makeinfo/sectioning.c:
+ - changed output of anchors based on problems with ie.
+ * makeinfo/defun.c:
+ - output in HTML mode changed to be on previous state.
+ * makeinfo/insertion.c:
+ - fixed up HTML output for deftypeivar.
+
+1999-03-30 Akim Demaille <demaille@inf.enst.fr>
+
+ * texi2dvi ($tmpdir): Avoid security holes.
+
+Fri Mar 26 17:06:55 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c (cm_exdent): rewrite to preserve blank lines.
+ Bug from: "Oleg S. Tihonov" <ost@benetnash.ffke-campus.mipt.ru>.
+
+ * makeinfo/cmds.c (cm_exdent): arg is in `roman'.
+
+Thu Mar 25 16:21:27 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c,
+ * makeinfo/defun.c,
+ * makeinfo/insertion.h (insertion_type): add deftypeivar.
+ * makeinfo/defun.h (cm_defun): declare here.
+ * makeinfo/cmds.c (defun.h): include.
+ * doc/texinfo.txi (deftypeivar[x]): new commands.
+ * makeinfo/cmds.c (deftypeivar[x]): new commands.
+
+ * makeinfo/cmds.c (cm_exdent): save, set and restore
+ in_fixed_width_font.
+
+ * doc/texinfo.txi (uref): rewrite.
+
+ * info/info.c (info_short_help): more spaces for new help2man.
+
+ * makeinfo/node.c (cm_node): output node name in html, change
+ navbar punctuation.
+
+ * doc/texinfo.5: Fix URL.
+
+ * Finally installed this:
+ 1998-05-01 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ * makeinfo/makeinfo.c (convert_from_loaded_file): When the file
+ contains no @setfilename then always look for \input (not
+ \include) in the first line and skip that. Don't skip the first
+ line if no \input was found.
+
+1999-03-24 Akim Demaille <demaille@inf.enst.fr>
+
+ * configure.in (AC_HEADER_STAT): Added.
+ * util/texindex.c (main): Check infiles are not directories.
+
+1999-03-24 Akim Demaille <demaille@inf.enst.fr>
+
+ * texi2dvi (index_files): Don't use `!' to run sed -e "s!foo$!!"
+ since the shell will interpret `$!'.
+
+Tue Mar 23 16:41:08 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (uref): rewrite to make HTML output read more
+ nicely. From Tim S.
+
+ * info/info.c (info_short_help): include examples.
+
+ * makeinfo/makeinfo.c (close_paragraph_with_lines): move earlier
+ so can be static.
+
+ * makeinfo/sectioning.c,
+ * makeinfo/node.c,
+ * makeinfo/makeinfo.h,
+ * makeinfo/makeinfo.c,
+ * makeinfo/macro.c,
+ * makeinfo/insertion.c,
+ * makeinfo/cmds.c,
+ * makeinfo/files.c,
+ * makeinfo/footnote.c (size_of_input_text): rename to
+ input_text_length.
+
+ * makeinfo/makeinfo.c (cm_xref): make wrong-char-following a warning.
+ (replace_with_expansion): remove bogus conditional that was duplicated
+ unconditionally.
+ From: Hans-Bernhard Broeker <broeker@physik.rwth-aachen.de>
+
+Mon Mar 22 14:39:59 1999 Karl Berry <karl@gnu.org>
+
+ * doc/Makefile.am (install-tex): parenthesize.
+
+ * Makefile.am (dist-hook): remove, it uses hard links so we chmod
+ all our sources.
+
+ * makeinfo/toc.c,
+ * makeinfo/defun.c,
+ * makeinfo/sectioning.c: Use _, not N_.
+
+ * info/Makefile.am (ginfo_SOURCES): include $(BUILT_SOURCES)
+ explicitly.
+
+ * makeinfo/lang.c,
+ * makeinfo/lang.h: ISO-639 updates.
+
+ * makeinfo/cmds.c: exampleindent changes.
+
+ * info/info.c (info_short_help): reformat somewhat, and don't say
+ info info options any more.
+
+ * doc/info-stnd.texi (Invoking): make description format somewhat
+ more standard.
+
+ * info/infomap.c (Initialize_info_keymaps): do ea_insert bindings
+ first so subsequent bindings (e.g., for ESC) override.
+
+Sun Mar 21 17:31:00 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/multi.c (output_multitable_row): remove unnecessary
+ trailing whitespace from output, output blank row for blank @item.
+
+ * doc/texinfo.txi: Remove extra @item in language multitable.
+
+Sat Mar 20 12:30:25 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Update language table from ISO 639:
+ http://www.iro.umontreal.ca/contrib/po/iso-639. From kama.
+
+ * doc/texinfo.txi (exampleindent): document.
+
+ * doc/texinfo.txi (Creating an Info File): use this for the node name.
+
+ * doc/info.texi: Make Texinfo references consistent, etc.
+
+1999-03-18 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * makeinfo/makeinfo.c (set_default_indentation_increment): new
+ routine.
+ * makeinfo/insertion.c (cm_exampleindent): new routine.
+ Call set_default_indentation_increment.
+
+Mon Mar 15 17:06:15 1999 Karl Berry <karl@gnu.org>
+
+ * info/Makefile.am (ginfo_SOURCES): Remove doc.c and funs.h in
+ hopes they then won't be distributed. Report from Andreas.
+
+ * makeinfo/cmds.c (cm_sp): close paragraph and disable filling to
+ produce blank lines in info.
+ Report from: Michael Vanier <mvanier@bbb.caltech.edu>.
+
+ * doc/texinfo.txi: Attempt to get Edition info on one line.
+
+ * makeinfo/makeinfo.h (cr_or_whitespace): use whitespace and check
+ for \r. (skip_whitespace_and_newlines, command_char): use it.
+ Report from bonzini@gnu.org.
+
+ * makeinfo/cmds.c (cm_center): save and restore filling_enabled,
+ so @center can be used inside an @example. Bug from kama.
+
+1999-03-13 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/footnote.c (cm_footnote): In separate footnote style,
+ generate a reference to "foo-Footnote-NN" for each footnote.
+ (output_pending_notes): In separate footnote style, generate an
+ anchor "foo-Footnote-NN" for each footnote, so that the link in
+ the parent node would lead directly to the footnote.
+
+ * info/footnotes.c (make_footnotes_node): Recognize the new
+ "foo-Footnote-NN" style of footnote references.
+
+1999-03-09 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * configure.in (AC_OUTPUT): Remove command to create po/Makefile,
+ already done by AM_GNU_GETTEXT.
+
+Tue Mar 9 17:48:46 1999 Karl Berry <karl@gnu.org>
+
+ * Makefile.am (dist-hook): make distribution directory writable.
+
+ * Installed these changes:
+
+ 1999-03-04 Akim Demaille <demaille@inf.enst.fr>
+
+ * texi2dvi (bibtex): Allow several runs of bibtex, this can be
+ used if bibentries reference other bibentries. Moreover, looking
+ for `Citation' in the LOG should be enough to avoid uneless runs.
+
+ Sun Mar 7 15:15:00 1999 UTC Karl Heinz Marbaise <kama@hippo.fido.de>
+
+ * makeinfo/sectioning.{c,h}:
+ - using defines instead of literals.
+ - cleaned up some stylistic matters like Karl Berry
+ suggested. Handling of things like:
+ @unnumbered ..
+ @section ...
+ now it works correct.
+
+ * makeinfo/toc.{c,h}
+ - addTocEntry, freeToc changed into toc_add_entry
+ toc_free. stylistics changed.
+
+ * makeinfo/iso2cht.pl,iso-639: script, table from the web.
+ - perl script converting the iso-639 table from the web
+ into the appropiate files (isoenum.h, isotab.c and
+ iso.texi) which can be inserted directly into
+ lang.c, lang.h and texinfo.txi.
+
+Tue Mar 9 17:47:59 1999 Karl Berry <karl@gnu.org>
+
+ * configure.in: Bump to 3.12g.
+
+Sun Mar 7 07:01:19 1999 Karl Berry <karl@gnu.org>
+
+ * info/infomap.c: Don't do isprint, just bind everything.
+
+Fri Mar 5 14:31:42 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi,
+ * makeinfo/makeinfo.c: Document that --no-headers writes to stdout
+ by default.
+
+ * doc/texinfo.txi: @setchapternewpage doesn't change
+ \bindingoffset, just headers. Recommend not including it in the
+ manual source at all.
+
+ * makeinfo/node.c (write_tag_table_internal): set
+ in_fixed_width_font while constructing this so --- doesn't
+ collapse to --, etc. Bug report from Sergio.
+
+ * dir-example: Add a2ps stuff.
+
+ * info/session.c: Allow any character in search string.
+
+ * info/infodoc.c (describe_key): don't assume non-latin1
+ characters are undefined.
+
+ * info/infomap.c (initialize_info_keymaps): make all characters
+ insertable by default in echo area. From Eli.
+
+ * Installed these changes:
+
+ Wed Feb 23 22:00:00 1999 Karl Heinz Marbaise <kama@hippo.fido.de>
+
+ * makeinfo/sectioning.{c,h}:
+ - added to hold complete handling of sectioning
+ a little step towards modularization ;-)
+
+ * makeinfo/cmds.c:
+ - sectioning_alist moved to sectioning.c and
+ added information about enumerated chapter,
+ section ..., appendix or not. Everything
+ which has any relationship with sectioning
+ moved to sectioning.{c,h} I hope I have found
+ all.
+
+ * makeinfo/toc.{c,h}:
+ - added for complete handling of "table of contents"
+ "short contents". Better ASCII only support
+ (--no-headers) so no Text "Menu" is printed.
+ May be we can do more.
+
+ * makeinfo/makeinfo.{c,h}:
+ - added new command line switch --number to enumerate
+ chapter, sections etc.
+
+ * doc/texinfo.txi:
+ - --number option documented.
+
+ 1999-02-28 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * makeinfo/insertion.c (in_paragraph): New variable.
+ (cm_item): Add </p> only if <p> is open.
+ * makeinfo/makeinfo.c (handle_menu_entry): Ditto.
+
+ * makeinfo/insertion.c (begin_insertion),
+ * makeinfo/makeinfo.c (handle_menu_entry): If commentary
+ precedes first menu item, put them outside of <ul>.
+ Put <p> and </p> correctly.
+
+ 1999-02-27 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/info.c (info_short_help): Document --show-options and
+ --usage.
+
+ 1999-02-26 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/makedoc.c (main) [STRIP_DOT_EXE]: Strip the .exe suffix, so
+ that doc.c says "./makedoc.c", not "./makedoc.exe.c".
+
+ * info/info.c (goto_invocation_p): New variable.
+ (long_options): New options --show-options and its alias --usage.
+ (main): Don't update the display until we find the first node to
+ be displayed, to avoid flushing incorrect display. If user wants
+ to see the command-line options node right away, display whatever
+ info_intuit_options_node finds.
+
+ * info/session.c (info_intuit_options_node): New function, uses
+ heuristics to find the node which describes program's invocation.
+ (info_goto_invocation_node): New command, asks for a program's
+ name and displays the invocation node of that program.
+ (entry_in_menu): New function, fuzzily looks for a menu entry in a
+ node's menu.
+ (program_name_from_file_name): New function, suggests a program
+ name given a name of its Info file.
+ (info_search_in_node): Accept an additional argument: a flag to
+ search case-sensitively; all callers changed. If case-sensitive
+ search is required, don't turn on the case-fold flag in the search
+ binding.
+ (info_search_internal): Accept an additional argument: a flag to
+ search case-sensitively; all callers changed. Share the last
+ search string between normal and case-sensitive search commands.
+ (info_search_1): New function, with the guts that previously
+ belonged to info_search. If the search is case-sensitive,
+ mentions that in the prompt for the search string. If the search
+ string includes upper-case characters, searches case-sensitively.
+ (info_search): Calls info_search_1 with zero case-sensitivity
+ flag.
+ (info_search_case_sensitively): New command, calls info_search_1
+ with non-zero case-sensitivity flag.
+ (incremental_search): If the search
+ string includes upper-case characters, searches case-sensitively.
+
+ * info/search.c (search_backward): Fix bug in case-sensitive
+ search.
+
+ * info/infomap.c (initialize_info_keymaps): `-' in info window map
+ produces negative arguments. `S' invokes case-sensitive search.
+ `O' and `I' invoke goto-invocation.
+
+ * doc/info-stnd.texi (Invoking Info): Document --show-options.
+ (Node Commands): Document `O', goto-invocation.
+ (Searching Commands): Document `S' and the case-sensitive search
+ when the search string includes upper-case letters. Document `/'
+ as a synonym for `s'.
+ (Miscellaneous Commands): Document `M--' and `-'.
+
+ 1999-02-25 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/info.c (main): Under --index-search, search indices *after*
+ following menus, so that we don't look for an index in DIR.
+
+
+Wed Mar 3 17:20:07 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c: Do not output <small> in info mode.
+ From: Eli Zaretskii <eliz@is.elta.co.il>.
+
+ * makeinfo/insertion.c (enum_html): Remove unused var temp.
+ From: Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * info/infodoc.c: Avoid translation of blank lines.
+
+ * info/tilde.c,
+ * info/man.c,
+ * makeinfo/index.c (index_add_arg): avoid use of alloca.
+
+ * info/echo-area.c: Don't pause for an additional 75 microseconds.
+ Noted by Eli.
+
+ * configure.in: Bump to 3.12f.
+
+ * doc/texinfo.txi: findex enddots. From Eli.
+
+1999-03-01 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * makeinfo/makeinfo.c (insert_html_tag): Add <p> when
+ paragraph is not opened.
+ (sectioning_html): Call close_paragraph so that paragraph
+ will be started.
+
+1999-02-26 Akim Demaille <demaille@inf.enst.fr>
+
+ * texi2dvi (get_xref_files): Take $filename_noext as $1.
+ (get_xref_files): Look for $1.idx only, not *.idx.
+ (get_xref_files): Look for $1.cb files (\usepackage{changebar}).
+ * texi2dvi: Look for rerun requests in LOG files in addition to
+ xref files comparison.
+ (bibtex): Remove useless `./' (already added in
+ command_line_filename).
+ (filename_dir): Smarter sed expression that handles file names
+ with no directory part.
+ (txiversion): Removed useless () (`` already guarantee a subshell).
+
+1999-02-25 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * makeinfo/multi.c (find_template_width): Fix operator precedence.
+
+Tue Feb 23 10:35:53 1999 Karl Berry <karl@gnu.org>
+
+ * dir-example: ccmode not cc-mode. From hds.
+
+Mon Feb 22 07:34:00 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/lang.c,
+ * doc/texinfo.txi: Fix kazakhkh typo.
+
+1999-02-21 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/config.sed: Add pcterm.c to terminal.o dependencies.
+
+1999-02-21 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * makeinfo/lang.c (cm_accent_generic): Emit the accent character
+ only once, after the argument.
+
+Sun Feb 21 16:36:14 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (handle_menu_entry): new routine.
+ (reader_loop): call it, allowing for comments in menus.
+
+ * makeinfo/node.c: Rearrange functions to make static, etc.
+
+ * doc/Makefile.am (EXTRA_DIST, install-tex): Add txi-cs and txi-no.
+
+1999-02-20 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * util/install-info.c (open_possibly_compressed_file): Output
+ explicit message about empty input files.
+ (insert_entry_here): Insert multiple entries in alphabetical order.
+
+Fri Feb 19 09:13:28 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c (enum_html): new routine.
+ (begin_insertion): call it.
+ Based on code from: Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>.
+
+ * lib/xexit.c (EXIT_FAILURE) [!defined EXIT_SUCCESS && VMS]: weird
+ long value.
+ From: Lars Hecking <lhecking@nmrc.ucc.ie>
+
+Thu Feb 18 16:42:10 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/node.h (remember_node_reference): decl.
+ * makeinfo/makeinfo.c (find_unused_reference): dump unused decl.
+
+1999-02-18 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/cmds.c (cm_dots, cm_enddots): Don't produce &#133; for
+ HTML, as too many browsers don't support it; use "..." in a
+ smaller font (with <small>).
+ (cm_top): Output the lang= attribute inside <html>.
+
+ * makeinfo/node.c (cm_node): Output the lang= attribute inside
+ <html>.
+
+ * makeinfo/footnote.c (output_pending_notes): Generate <ol>
+ instead of <dl compact>. Make the text of each footnote start a
+ new paragraph.
+
+1999-02-17 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/insertion.c (cm_item): Remove <dd> when immediately
+ followed by a <dt>. Add a <br> before every <dt>, except if we
+ are converting @itemx, or in the first item after <dl>.
+ (begin_insertion): Use <dl> for tables, to make it look closer to
+ the Info output. Don't output a newline after a <pre>.
+
+1999-02-17 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (handle_variable): Don't backup input
+ pointer if we hit the end of text (usually, inside
+ execute_string).
+ * makeinfo/insertion.c (get_item_function): Likewise.
+
+Wed Feb 17 15:09:06 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Better indexing of space entries.
+
+ * makeinfo/multi.c (find_template_width): new routine to really
+ parse @multitable {...} templates.
+ (setup_multitable_parameters): call it.
+ Bug report from: Sergio Pokrovskij <pok@nbsp.nsk.su>.
+
+ * lib/system.h (substring): declare.
+
+ * lib/Makefile.am (libtxi_a_SOURCES): add substring.c.
+
+ * makeinfo/defun.c: Move substring to lib.
+
+ * util/texindex.c (tempcopy): no longer used.
+ (maketempname): make static.
+
+ * Installed these changes:
+
+1999-02-13 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/cmds.c (cm_acronym): New function, makes @acronym
+ produce a smaller font size in HTML mode.
+ (cm_sc): Produce smaller font size in HTML mode.
+
+ * makeinfo/footnote.c (cm_footnote): In HTML output, make the
+ footnote number be a superscript; remove [] around the link.
+
+ * makeinfo/cmds.c (cm_var_sc): Separated into two functions:
+ cm_var and cm_sc, since @var and @sc have different effects in
+ HTML output.
+
+ * makeinfo/makeinfo.c (cm_xref, cm_inforef): Don't put "[]" around
+ HTML links.
+
+ * info/pcterm.c (DJGPP_keytab): Add translation for Alt-PgUp and
+ Alt-PgDn, to support the new M-prior key.
+
+Wed Feb 17 11:50:46 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Don't mention texi2roff so prominently.
+
+ * makeinfo/makeinfo.c: Pass enclose_expand to remember_brace
+ rather than enclose_command. From Eli.
+
+ * makeinfo/macro.c (cm_alias, cm_definfoenclose): Expand macros in
+ first call to get_until_in_line. From Eli.
+
+ * info/makedoc.c,
+ * info/session.c,
+ * info/man.c,
+ * info/tilde.c,
+ * info/info.c,
+ * makeinfo/files.c,
+ * makeinfo/multi.c,
+ * makeinfo/node.c,
+ * makeinfo/makeinfo.c: Use xexit.
+ * makeinfo/makeinfo.h (NO_ERROR, FATAL, SYNTAX): remove.
+
+ * info/terminal.c: Avoid sleep unless on sun-cmd terminal.
+
+ * lib/xexit.c (EXIT_FAILURE) [!EXIT_FAILURE]: #define to 1 to fix
+ Sony NEWS-OS 4.0C lossage. From Akim.
+
+ * info/infodoc.c: Translate where is doc string, underline lines
+ in help.
+ From: Trond Endrestol <trond@agamemnon.gtf.ol.no>
+
+ * makeinfo/cmds.c (cm_dots, cm_enddots): go back to ... and ....,
+ &#133; apparently doesn't work widely enough.
+
+Tue Feb 16 07:37:54 1999 Karl Berry <karl@gnu.org>
+
+ * configure.in (ALL_LINGUAS): add de_AT.
+
+ * util/texi2dvi: Redirect cd output to /dev/null when determining
+ txiversion.
+
+Mon Feb 15 13:43:37 1999 Karl Berry <karl@gnu.org>
+
+ * util/install-info.c,
+ * util/texindex.c: Call xexit instead of exit.
+
+ * lib/system.h (xexit): Declare.
+
+ * lib/Makefile.am (libtxi_a_SOURCES): Add xexit.c.
+
+ * doc/texinfo.txi: Document that @documentencoding is used in the
+ HTML output.
+
+ * makeinfo/cmds.c (cm_top): use document_encoding if set.
+ (command_table): call cm_documentencoding instead of no-op.
+ * makeinfo/lang.c (document_encoding, cm_documentencoding): define.
+ * makeinfo/lang.h (document_encoding, cm_documentencoding): declare.
+
+ * makeinfo/insertion.c: Restore </p> before <li>.
+
+ * util/texi2dvi: If texinfo.tex version is too low for macros, use
+ makeinfo.
+
+ * makeinfo/cmds.c (cm_center): save and restore value of
+ indented_fill, otherwise @center within an @enumerate (say)
+ also closes the indentation.
+ Bug from: Sergio Pokrovskij <pok@nbsp.nsk.su>.
+
+Sun Feb 14 15:25:02 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: Doc fix.
+
+ * doc/texinfo.txi: Be enthusiastic if people want to implement
+ more output formats, but use makeinfo to do the job.
+
+ * makeinfo/index.c (index_element_compare): Use strcoll if it's
+ available.
+ * configure.in: Call AC_FUNC_STRCOLL.
+ * makeinfo/makeinfo.c (main): Use LC_CTYPE and LC_COLLATE
+ categories. Suggestion from Oleg.
+
+ * lib/system.h (setlocale) [!HAVE_SETLOCALE]: #define away.
+ Suggestion from Akim.
+
+ * doc/texinfo.txi: Document @paragraphindent working in TeX now.
+
+ * doc/texinfo.txi,
+ * makeinfo/lang.c,
+ * makeinfo/lang.h (language_code_type): abbrev changes from Oleg.
+
+ * makeinfo/cmds.c,
+ * makeinfo/node.c: Only translate `Next:', `Previous:', and `Up:',
+ not the whole href. From Eli.
+
+ * doc/texinfo.txi: Document that only unsplit html output is
+ supported in this release.
+
+Sat Feb 13 17:55:30 1999 Karl Berry <karl@gnu.org>
+
+ * configure.in: Check for termlib before termcap for sake of
+ Solaris (judging from less-332 configure.in) and maybe
+ HP-UX 11.
+
+ * doc/texinfo.txi (Footnote commands): incoherency reported by Aharon.
+ Language vs country fixes from Oleg.
+
+1999-02-13 Karl Eichwalder <ke@gnu.franken.de>
+
+ * makeinfo/node.c (cm_node): Tag navigation links as translatable.
+ * makeinfo/cmds.c (cm_top): Ditto.
+
+Wed Feb 10 22:00:00 1999 Karl Heinz Marbaise <kama@hippo.fido.de>
+
+ * makeinfo/defun.h:
+ - new because we need get_base_type-function
+ accessible in insertion.c
+
+ * makeinfo/defun.c:
+ - complete HTML handling of the @def... things.
+
+ * makeinfo/Makefile.am:
+ - defun.h added as part of makeinfo.
+
+ * makeinfo/makeinfo.c:
+ - define looking_at moved into header-file, because
+ we need it in defun.c
+
+ * makeinfo/insertion.c:
+ - some minor changes made to support the @def...
+ things in HTML.
+
+ * makeinfo/lang.c: (cm_accent_generic)
+ - bug fixed. Using umlaut (accent ...)
+ would produce &A only if an umlaut follows
+ an empty line.
+ - bug fixed. Because things like &tilde; &grave;
+ and &circ; do not exist as standalone characters
+ in HTML.
+ - cm_special_char now produce correct HTML for
+ @O{} and @o{}.
+ - warning using _("Text") instead "Text" (gettext).
+
+ * makeinfo/cmds.c:
+ - @url fixed. Display the given Text.
+
+ * doc/texinfo.txi:
+ - corrected the references for @uref, because
+ they were given as "url" instead of "uref".
+ @uref has three arguments, so show them in
+ command list.
+
+Wed Feb 10 17:27:58 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Rewrite for overfull box.
+
+Tue Feb 9 19:03:16 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Document more HTML output stuff. Based on esr
+ changes.
+ * makeinfo/macro.c,
+ * makeinfo/macro.h,
+ * makeinfo/makeinfo.c: Do alias and definfoenclose expansion.
+ From esr.
+
+Mon Feb 8 14:41:07 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/cmds.c: New commands @alias and @definfoenclose.
+ From: "Eric S. Raymond" <esr@snark.thyrsus.com>.
+
+ * doc/texinfo.txi: Document @documentlanguage and
+ @documentencoding.
+
+ * makeinfo/cmds.c: Move accent support to lang.c.
+
+ * makeinfo/makeinfo.c (add_char): add &nbsp; rather than an 8-bit
+ char for html.
+
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add lang.[ch].
+
+ * doc/texinfo.txi: Be even more emphatic that @url is not
+ typically what you want.
+ * doc/texinfo.txi: Document that macro calls must use empty
+ braces.
+
+ * info/session.c: Do not translate node pointers. From Karl E.
+
+ * makeinfo/cmds.c (cm_dfn): Use <dfn>. Suggestion from Eli.
+
+Sun Feb 7 07:00:08 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: Make --html imply --no-split.
+
+ * makeinfo/cmds.c (cm_top): don't core dump if the top node has no
+ next.
+
+ * makeinfo/makeinfo.c (replace_with_expansion): compare length
+ after expansion with length of full input text before
+ expansion, not just the length of the expanded text.
+ Bug (contents2) reported by kama.
+
+ * info/infodoc.c (create_internal_info_help_node): gettext calls
+ to help msg strings. From Ulrich.
+
+Fri Feb 5 17:35:13 1999 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: set makeinfo= for latex case.
+
+ * doc/texinfo.txi (@deftp summary): ref Data Types node that
+ actually describes it. From kama.
+
+Thu Feb 4 07:39:10 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: Take it back. Emacs info needs that text
+ before the CTRL-_.
+ * makeinfo/makeinfo.c: Don't bother to output the header (This is
+ -, produced ...) to stdout.
+
+ * doc/texinfo.txi (Other Info Directories): Mention that dir files
+ must be named dir.
+
+ * makeinfo/makeinfo.c (cm_uref): implement optional third
+ argument.
+ * doc/texinfo.txi (uref): document it.
+ Suggestion from: Charles Karney <karney@pppl.gov>
+
+ * doc/Makefile.am (info_TEXINFOS): put texinfo.txi first so
+ UPDATED reflects its modtime, rather than info-stnd's.
+
+ * makeinfo/files.c (full_pathname) [!WIN32]: #endif in wrong place.
+ From: Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * makeinfo/cmds.c (cm_url): Remove URL: from output. It's ugly.
+
+Wed Feb 3 16:05:03 1999 Karl Berry <karl@gnu.org>
+
+ * info/infodoc.c: Doc fix, zero not oh.
+
+ * makeinfo/makeinfo.c (add_char): don't ignore if
+ only_macro_expansion, even in no_headers case.
+ Otherwise menu items don't get remembered and defaulting
+ doesn't work. Macros suck!
+
+ * util/texi2dvi (common): include orig_pwd.
+ (language): reguess for each file if not explicitly set.
+
+Tue Feb 2 16:22:32 1999 Karl Berry <karl@gnu.org>
+
+ * configure.in: Bump to 3.12d now.
+
+Mon Feb 1 14:46:45 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c (cm_item): For itemize and enumerate, do
+ </p> before the <li> for html. Bug from Eli.
+
+ * makeinfo/index.c: Installed change in index.c:
+ Mon Dec 28 12:50:14 1998 Matthew Fredette <fredette@mit.edu>
+ * makeinfo.c (index_add_arg): Use xstrdup on input_filename
+ when saving it in the new index entry.
+
+ * util/texi2dvi: cd / before cd $orig_pwd in case of DOS drive
+ change.
+
+Sun Jan 31 16:39:01 1999 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Used sed to expand only the @{if,}tex parts of
+ the source since makeinfo's conditional options aren't ready yet
+ (from Akim).
+ Also use ${1+"$@"} for Digital Unix "$@" expansion bug (from Noah).
+
+ * util/install-info.c: Doc fix from Eli.
+
+ * doc/texinfo.txi: Oops, said we looked for .png twice.
+
+Sat Jan 30 17:18:14 1999 Karl Berry <karl@gnu.org>
+
+ * info/session.c (forward_move_node_structure): remove tangled
+ code to merely print words instead of numbers; too hard to translate.
+
+ * info/session.c: Missing _'s for more i18n. From Trond.
+
+ * doc/Makefile.am (EXTRA_DIST): Include txi-no.tex from Trond.
+
+Sun Jan 24 09:28:12 1999 Karl Berry <karl@gnu.org>
+
+ * Makefile.am (EXTRA_DIST): Use djgpp by itself instead of listing
+ each file separately (new feature in automake 1.4).
+
+ * makeinfo/insertion.c (begin_insertion): for quotation, always
+ increment current_indent even if html output, why not.
+ (Otherwise must not decrement current_indent in end_insertion.)
+
+ * doc/texinfo.txi: More overfull box fixes.
+
+ * makeinfo/insertion.c: Add some assertions and the beginnings of
+ handling @tex.
+
+ * doc/texinfo.txi: Fix overfull boxes, but tables of contents at
+ the front.
+
+ * util/texi2dvi: Can't pass --no-ifinfo --iftex to makeinfo yet,
+ it's not ready.
+
+Sat Jan 23 10:22:16 1999 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Pass --no-ifinfo --iftex to makeinfo.
+
+Fri Jan 22 19:09:49 1999 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Include version.texi before @settitle so
+ @value{VERSION} gets expanded in the html title. From kama.
+
+ * These patches from Tim Singletary <talon@clark.net>.
+ * makeinfo/makeinfo.c: Simplify and improve html menus.
+ * makeinfo/insertion.c (begin_insertion): simplify html menu case
+ and set had_menu_commentary.
+ * makeinfo/insertion.h (had_menu_commentary): declare new global.
+ * makeinfo/node.h (glean_node_from_menu): declare.
+ * makeinfo/node.c (glean_node_from_menu): new arg to specify what
+ type of reference to remember as.
+
+ Date: Sun, 29 Nov 1998 09:21:01 -0500 (EST)
+ From: Tim Singletary <tsingle@talon.clark.net>
+ To: texinfo-pretest@tug.org
+ Subject: explanation of previous patches
+
+ > These diffs introduce some non-trivial changes into very
+ > sensitive parts of makeinfo, and it is hard to judge them without
+ > knowing what exactly do they solve.
+
+ At a high level, these patches fix (or at least significantly improve)
+ the html conversion of menus. Specifically, they fix bugs in the
+ conversion of menu commentary and detailmenu entries.
+
+ The menu commentary fixes require some justification: The unpatched
+ makeinfo attempts, with many bugs, to place menu commentary outside
+ the <menu> by adding </ul> and <ul> tags. While I understand the
+ motivation for this, that there might be browsers that don't support
+ <p> within <menu>, I'm not aware of any such browser and don't see any
+ compelling reason to continue the </ul> kludge.
+
+ Certainly
+ <menu>
+ <li>First paragraph.
+ <p>Second paragraph.
+ <li>Second item.
+ </menu>
+ is valid html!
+
+ Anyway, here's what my patches do:
+
+ 1) Deleted the `<h4>Menu</h4>' at the beginning of each menu. Using
+ `<h4>' is wrong since menus don't usually come after an `h3'
+ header. `<b>' looks the same on most browsers, but my opinion is
+ that there's no need for any header at all!
+
+ 2) Deleted the `<li>' kludge at the begining of each menu. It's no
+ longer needed since I'm deleting the </ul> kludge.
+
+ 3) Replace `in_menu_para', declared static in makeinfo.c:add_char()
+ with `had_menu_commentary', declared globally. Modified
+ insertion.c:begin_insertion() to initialize had_menu_commentary to
+ 1 when beginning a menu. Now there's enough state information for
+ menu commentary to be processed within <menu> ... </menu>; the
+ commentary can be seperated from the rest of the menu by bracketing
+ it between <p>'s.
+
+ Note that the first patch had a bug initializing
+ had_menu_commentary; the second patch fixes this bug.
+
+ 4) Changed the semantics of the argument to
+ node.c:glean_node_from_menu(). Previously, glean_node_from_menu()
+ only called remember_node_reference() when the argument was
+ non-zero. But add_char() didn't call `glean_node_from_menu(1)'
+ when processing detailmenu entries. In other words, detailmenu
+ entries didn't get registered as references, which lead to the html
+ conversion of detailmenu entries not producing proper hrefs!
+
+ The new semantics are that glean_node_from_menu always calls
+ remember_node_reference(), but calls it with `menu_reference' when
+ the first arg to glean_node_from_menu() is 1 and with
+ `followed_reference' otherwise. Now, detailmenu entries get
+ registered as `followed_reference' (normal menu entries still get
+ registered as `menu_reference') and the html conversion produces
+ proper hrefs.
+
+ 5) The above changes made it possible to streamline the section of
+ add_char() that deals with html menu text.
+
+ 6) In an otherwise unrelated change, rewrote a section of
+ glean_node_from_menu to no longer use `goto save_node;'.
+
+
+Thu Jan 21 12:55:42 1999 Karl Berry <karl@gnu.org>
+
+ * doc/info-stnd.texi: OK, let's try restoring the @include
+ version.texi with the new automake.
+
+ * makeinfo/cmds.c: Improve HTML @pounds, @bullet, etc.
+
+ * doc/Makefile.am (install-tex): new target.
+ (EXTRA_DIST): Include txi-??.tex.
+ txi-de.tex: new file from kama.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Bump to 1.4.
+ (install-tex): new target.
+
+ * util/texi2dvi: Restore "$@" for explicitness in main loop.
+
+ * doc/Makefile.am (*.1) [TEXINFO_MAINT]: Conditionalize.
+
+ * configure.in (AC_PREREQ): Bump to 2.13.
+ (TEXINFO_MAINT): Define this AM_CONDITIONAL.
+
+ * doc/texinfo.txi: Document that the HTML output name is derived
+ from @setfilename.
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): Use @setfilename
+ for basename of html output.
+
+ * doc/texinfo.txi (url): Use example.org for the example.
+
+ * makeinfo/cmds.c (cm_url): @url should not produce a link, sorry
+ to say.
+
+Wed Jan 20 16:31:55 1999 Karl Berry <karl@gnu.org>
+
+ * util/texindex.c,
+ * util/install-info.c,
+ * makeinfo/makeinfo.c,
+ * info/info.c: It's 1999.
+
+ * doc/info.texi (Advanced info commands): Fix typos from Gildea.
+
+ * makeinfo/makeinfo.c (end_of_sentence_p): don't check negative
+ array offset.
+ From: Enrico Scholz <enrico.scholz@wirtschaft.tu-chemnitz.de>
+
+Sun Jan 17 16:42:16 1999 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Restore --batch, handle changing escape character
+ more cleanly. From Akim (as always).
+
+Thu Jan 14 16:47:41 1999 Karl Berry <karl@gnu.org>
+
+ * configure.in (ALL_LINGUAS): Add no.
+ From: Trond Endrestol <trond@agamemnon.gtf.ol.no>
+
+ * util/texi2dvi: Doc fix from Akim and do not always exit 1 from trap.
+ And it's 1999.
+
+ * doc/texinfo.txi (image): Document imagename.pdf.
+
+ * Apply this change from Eli:
+
+ 1998-11-20 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.h (meta_char_pos): New variable.
+ * makeinfo/makeinfo.c (init_paragraph): Initialize it.
+ (add_char): Use META to create a non-breakable space character.
+ (add_meta_char): New function.
+ (end_of_sentence_p): Don't handle characters at meta_char_pos as
+ normal sentence enders.
+ (flush_output): Only unMETA the non-breaking space character.
+ Reset meta_char_pos to zero.
+ (do_flush_right_indentation): Call adjust_braces_following.
+ (indent): Likewise.
+ (cm_value): Save and restore the value of meta_char_pos.
+ (expansion): Likewise.
+ * makeinfo/macro.c (me_execute_string_keep_state): Save and
+ restore the value of meta_char_pos.
+ * makeinfo/node.c (cm_node): Save and restore the value of
+ meta_char_pos.
+ * makeinfo/cmds.c (cm_accent): Make the dot we add due to
+ @dotaccent be a meta-character.
+ (cm_code, cm_dfn): Call add_meta_char to insert the closing
+ quote.
+ (cm_cite): Call add_char instead of add_word.
+
+Thu Jan 7 18:04:26 1999 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Handle pdf files more cleanly. From Akim.
+
+Wed Jan 6 17:49:11 1999 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_image): Check for .png also.
+
+Sun Dec 20 07:54:47 1998 Karl Berry <karl@gnu.org>
+
+ * util/texi2dvi: Add --pdf.
+
+ * util/texi2dvi: New option -@ to use @input and @nonstopmode, in
+ case texinfo is preloaded.
+ From: Khimenko Victor <khim@sch57.msk.ru>
+ Date: Sun, 20 Dec 1998 02:04:12 +0300 (EET)
+
+Sat Dec 19 17:37:37 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi (Multitable Column Widths): leading zero ok for
+ @columnfractions.
+
+ * util/texi2dvi: New version from Akim, plus --quiet is like
+ --batch, etc.
+
+Fri Dec 18 17:22:44 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Document that the Texinfo source can't be
+ arbitrarily ordered (for print) even if all pointers are supplied.
+
+ * makeinfo/insertion.c (end_insertion): In itemize case,
+ close_insertion_paragraph so @end itemize cause a line break.
+ Report from: Sergei Pokrovsky <pok@nbsp.nsk.su>
+ Date: Sun, 22 Nov 1998 19:45:21 +0700 (GMT)
+
+Tue Dec 15 16:21:51 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: More fixes from Oleg.
+
+ * configure.in: Bump version to 3.12c for next pretest.
+
+ * util/install-info.c (open_possibly_compressed_file)
+ [STRIP_DOT_EXE]: logic for compression_program assignment
+ was reversed.
+ From: wlestes@wlestes.uncg.edu
+
+Sat Dec 12 18:02:48 1998 Karl Berry <karl@gnu.org>
+
+ * Merged these changes from Andreas:
+
+1998-12-06 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * makeinfo/node.c (cm_node): When searching for @menu don't
+ require a space after it.
+
+1998-12-06 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * makeinfo/cmds.c (cm_top): free top_name only after done using it.
+
+Sat Dec 12 15:40:13 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Various typos and fixes from Oleg.
+
+ * doc/texinfo.txi: Move @node's outside of @ifinfo for the sake of
+ HTML processing.
+
+ * doc/texinfo.txi (titlepage): @pxref was not in parens. From Oleg.
+
+Sun Dec 6 16:49:09 1998 Karl Berry <karl@gnu.org>
+
+ * dir-example: Amd is now am-utils.
+
+ * doc/Makefile.am: Reinstate help2man invocations for development.
+
+ * doc/texinfo.txi: Document @set...contentsaftertitlepage (from kama).
+ Fix incorrect sense for @image and Hungariam typo (from Oleg).
+
+ * lib/system.h: #include libintl.h here instead of acconfig.h, so
+ the system include files have a chance to #define NULL
+ before it does.
+ * acconfig.h: Remove libintl.h and #defines from here.
+ From: "Philippe De Muyter" <phdm@macqel.be>
+ Date: Fri, 4 Dec 1998 00:56:25 +0100 (CET)
+
+ * info/signals.c: Start #ifdef's in column one for cc on sysv68
+ (m68k-motorola-sysv).
+ From: "Philippe De Muyter" <phdm@macqel.be>
+ Date: Fri, 4 Dec 1998 00:56:25 +0100 (CET)
+
+ * info/filesys.c (is_dir_name): use strcpy instead of automatic
+ array initialization.
+ From: "Philippe De Muyter" <phdm@macqel.be>
+ Date: Fri, 4 Dec 1998 00:56:25 +0100 (CET)
+
+ * configure.in (ALL_LINGUAS): add ru.
+
+Fri Dec 4 08:12:11 1998 Karl Berry <karl@gnu.org>
+
+ * info/infodoc.c: Gettextize the help buffer string.
+
+Sun Nov 29 17:12:35 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Use @ifnottex rather than @ifinfo for @top.
+ (makeinfo top): document this.
+
+ * doc/info-stnd.texi,
+ * doc/info.texi: Use @ifnottex rather than @ifinfo for @top.
+
+ * makeinfo/insertion.c (cm_menu): Implicitly insert @top command
+ so we can construct the node tree as usual when we see @menu
+ before @node. Probably this is when the input uses
+ @ifinfo instead of @ifnottex, as virtually all existing
+ manuals do.
+
+ * makeinfo/insertion.c (discard_insertions): Let any conditional
+ cross node boundary. (So the @top node can be wrapped
+ in @ifnottex, for example.)
+
+ * Installed these:
+
+1998-11-21 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (expansion): Save and restore
+ last_inserted_character and last_char_was_newline.
+
+ * makeinfo/cmds.c (cm_dircategory): Kill any indentation before
+ INFO-DIR-SECTION. install-info relies on this.
+
+1998-11-20 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/multi.c (struct env): Add meta_char_pos member.
+ (select_output_environment): Save and restore meta_char_pos.
+ (out_char): Output characters by switching environment to #0 and
+ calling insert. Call flush_output when a newline is output.
+ (output_multitable_row): Update the current environment's
+ output_paragraph_offset as well, after removing trailing
+ whitespace. Fix typo in loop index.
+ (do_multitable): Call close_single_paragraph.
+ (end_multitable): Call close_insertion_paragraph. Don't output
+ an extra newline.
+
+1998-11-20 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.h (meta_char_pos): New variable.
+ * makeinfo/makeinfo.c (init_paragraph): Initialize it.
+ (add_char): Use META to create a non-breakable space character.
+ (add_meta_char): New function.
+ (end_of_sentence_p): Don't handle characters at meta_char_pos as
+ normal sentence enders.
+ (flush_output): Only unMETA the non-breaking space character.
+ Reset meta_char_pos to zero.
+ (do_flush_right_indentation): Call adjust_braces_following.
+ (indent): Likewise.
+ (cm_value): Save and restore the value of meta_char_pos.
+ (expansion): Likewise.
+ * makeinfo/macro.c (me_execute_string_keep_state): Save and
+ restore the value of meta_char_pos.
+ * makeinfo/node.c (cm_node): Save and restore the value of
+ meta_char_pos.
+ * makeinfo/cmds.c (cm_accent): Make the dot we add due to
+ @dotaccent be a meta-character.
+ (cm_code, cm_dfn): Call add_meta_char to insert the closing
+ quote.
+ (cm_cite): Call add_char instead of add_word.
+
+Sun Nov 29 16:30:06 1998 Karl Berry <karl@gnu.org>
+
+ * info/info.h,
+ * info/footnotes.h (FOOTNOTE_LABEL),
+ * info/indices.c (APROPOS_NONE): Use N_ rather than _.
+
+ * info/infodoc.c (create_internal_info_help_node,
+ function_documentation): Do not translate the empty string.
+ Date: Fri, 25 Sep 1998 15:09:42 +0400
+ From: "Oleg S. Tihonov" <tihonov@ffke-campus.mipt.ru>
+
+ * doc/info-stnd.texi: Mention PRIOR as another alias for
+ PREVIOUS/PageUp.
+
+ * doc/texinfo.txi: @emph produces _emph_ not *emph*. Spurious
+ junk before makeinfo bison example.
+ From: tihonov@ffke-campus.mipt.ru.
+
+1998-11-16 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/defun.c (defun_internal): Don't expand the arguments to
+ @defun and its ilk.
+
+ * makeinfo/makeinfo.c (expansion): Copy the name of the currently-
+ executing command and restore it after expansion.
+
+Sun Nov 15 17:40:51 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: Rearrange usage, allow -v for verbose, only
+ output `Making' line when verbose.
+ * makeinfo/makeinfo.h (process_html, process_info, process_tex):
+ declare.
+ * makeinfo/cmds.c: Use conditional commands.
+ * makeinfo/insertion.c (find_type_from_name): Handle rawhtml and
+ rawtex.
+ (conditional commands): Allow individual switching on and off.
+
+ * makeinfo/insertion.h: Declare conditionals.
+
+1998-11-14 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/insertion.c (begin_insertion, end_insertion): Use <pre>
+ to convert @display and @smalldisplay into HTML.
+
+ * makeinfo/cmds.c (cm_asterisk): Don't insert an extra newline in
+ HTML mode, since input includes a newline right after the @*.
+ (cm_sp): Output "<br><p>\n" as many times as the argument says.
+ (cm_url): Don't include "<a href=" in the anchor text in HTML
+ output.
+
+ * makeinfo/makeinfo.c (cm_pxref): Don't add a period after @pxref
+ if in HTML mode.
+ (get_rest_of_line): Accept an additional argument EXPAND, and
+ expand the rest of line if it's non-zero. All callers changed.
+ (close_paragraph): When in HTML mode, honor the formatting of the
+ source paragraphs by generating "<p>" for every closed paragraph;
+ follow it by as many "<p>"'s as paragraph_spacing specifies.
+
+Sat Nov 14 17:38:27 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/insertion.c: Use <ul compact> instead of deprecated <menu>.
+ Omit extra <li> after the menu beginning.
+
+ * makeinfo/index.c: Use <ul compact> instead of deprecated <menu>.
+
+Thu Nov 12 16:33:09 1998 Karl Berry <karl@gnu.org>
+
+ * Makefile.am (EXTRA_DIST): add djgpp/config.sed.
+
+ * info/terminal.c: #include <sys/ioctl.h> to define TIOCGWINSZ
+ under LynxOS. From: Marius Groeger <mag@sysgo.de>.
+
+1998-11-06 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * makeinfo/insertion.c (begin_insertion): Correctly handle
+ ifnottex and ifnothtml.
+ (end_insertion): Likewise.
+
+Sun Nov 8 17:30:23 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/index.c,
+ * makeinfo/insertion.c: Menu is special to Info.
+ * makeinfo/node.c: Top is a special name, don't translate it.
+ * info/session.c (info_top_node): Top is a special name, don't
+ translate it.
+ From: "Oleg S. Tihonov" <tihonov@ffke-campus.mipt.ru>.
+
+Fri Nov 6 17:18:43 1998 Karl Berry <karl@gnu.org>
+
+ * configure.in: Version 3.12b.
+
+ * util/texi2dvi: Fixes from Eli and Christoph Martin.
+
+ Mon Oct 5 13:58:53 1998 Dave Glowacki <dglo@ssec.wisc.edu>
+ * util/install-info.c: Fix off-by-one error in findlines()
+
+ * util/texindex.c (usage): avoid trigraph until Ulrich fixes
+ po2tbl.sed.in. From Paul Eggert.
+
+1998-11-03 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (cm_xref): Don't bypass the test that an
+ xref ends with a period or a comma if the reference has a single
+ argument.
+
+1998-10-31 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/insertion.c (end_insertion): Don't decrement
+ in_fixed_width_font when leaving a menu, the previous value is
+ restored by pop_insertion.
+
+ * makeinfo/makeinfo.c (add_char): Don't increment output_column
+ twice when a newline is inserted into the output.
+
+ * doc/texinfo.txi (emph & strong): Document the use of underscores
+ for @emph in the Info output.
+
+1998-10-30 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/config.bat: Make sure intl/po2tblsed.in exists before we
+ begin the configure boogie.
+ * djgpp/config.sed: Sed script, to be run by config.bat.
+
+ * doc/info-stnd.texi (Node Commands): Document the new G command.
+
+ * info/session.c (info_follow_menus): Step over a possible leading
+ space in a menu entry in menus[].
+ (split_list_of_nodenames): Renamed from split_words. Split the
+ string on commas, not on spaces, since a menu entry can have
+ embedded whitespace. Get past the null byte after inserting it.
+ (info_menu_sequence): Don't crash if there's no DIR node; try
+ using Top of the current Info file, and if that doesn't work
+ either, throw an error.
+
+ * util/texi2dvi: Use $path_sep in TEXINPUTS. Don't include any
+ dots in $tmpdir, 8+3 filesystems won't like that.
+
+ * makeinfo/makeinfo.c (reader_loop): Expand any macros in a menu
+ entry when creating a <menu> item for HTML. Fix an off-by-one
+ error in counting input lines.
+
+ * makeinfo/files.c (expand_filename): Don't treat .foo/bar as
+ absolute file name.
+
+ * makeinfo/makeinfo.c (add_char): Use strncpy instead of memcpy,
+ since the buffers overlap. If the line being refilled includes
+ nothing but the indentation and the word being added, do NOT add
+ an extra newline.
+
+ * util/install-info.c (strip_info_suffix, menu_item_equal,
+ open_possibly_compressed_file) [__MSDOS__]: Allow .inz and .igz as
+ suffuxes for compressed files.
+ (open_possibly_compressed_file): Return an indication whether we
+ opened a file or a pipe. Use FOPEN_RBIN from system.h.
+ [STRIP_DOT_EXE]: Use gzip.exe with an explicit .exe extension.
+ [O_BINARY]: If the file is not compressed, switch its stream to
+ text mode.
+ (readfile): Close the file or the pipe.
+ (output_dirfile): Call pclose to actually run the compressor.
+
+Thu Nov 5 08:33:06 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: effect -> affect
+ From: Eric Hanchrow <offby1@blarg.net>
+
+Tue Nov 3 14:26:59 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c (cm_image): Allocate enough space for the
+ zero byte.
+
+ * doc/texinfo.txi: Document epsf.tex standard location.
+
+Tue Oct 27 10:45:47 1998 Karl Berry <karl@gnu.org>
+
+ * Makefile.am (TEXINFO_TEX): add definition.
+
+ * doc/info-stnd.texi: Avoid unnecessary overfull boxes from
+ examples.
+
+ * doc/Makefile.am (install-data-local): missing ".
+
+ * doc/Makefile.am: Don't try to run help2man in distribution.
+
+Mon Oct 26 13:43:53 1998 Karl Berry <karl@gnu.org>
+
+ * configure.in (TEXMF): lose this whole block. It is too painful
+ to maintain with the different tex installations out there.
+
+ * util/Makefile.am (EXTRA_DIST): update-info renamed to
+ fix-info-dir.
+
+ * makeinfo/footnote.h: Doc fix.
+
+ * makeinfo/multi.c: #include "insertion.h"
+ * makeinfo/cmds.c: #include "node.h"
+ * makeinfo/makeinfo.h,
+ * makeinfo/makeinfo.c: Move globals, functions for insertions and
+ nodes.
+ * makeinfo/defun.c: #include "insertion.h"
+ * makeinfo/Makefile.am: Add insertion.[ch], node.[ch].
+ * node.[ch], insertion.[ch]: New files.
+
+ * makeinfo/makeinfo.c,
+ * makeinfo/makeinfo.h: Move globals for cmds.h.
+ * makeinfo/index.h: Include cmds.h.
+ * makeinfo/Makefile.am (makeinfo_SOURCES): Add cmds.h, cmds.c.
+ * cmds.c, cmds.h: New files.
+
+Sat Oct 24 17:28:14 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c,
+ * makeinfo/makeinfo.h: Globals for files.c.
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add files.[ch].
+
+Tue Oct 20 17:03:10 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add macro.c and
+ macro.h.
+ * makeinfo/makeinfo.c: Move macro code to macro.h and macro.c.
+ * makeinfo/makeinfo.h: Move macro stuff to macro.h, expose global
+ last_char_was_newline for macro.c.
+ * makeinfo/index.c,
+ * makeinfo/footnote.c: #include macro.h.
+
+Wed Oct 7 16:24:07 1998 Karl Berry <karl@gnu.org>
+
+ * doc/info-stnd.texi: For now don't include version.texi due to
+ automake error.
+
+ * makeinfo/index.h: #include makeinfo.h for sake of COMMAND type.
+ * makeinfo/index.c: No need to include makeinfo.h, index.h does
+ now.
+
+ * makeinfo/makeinfo.c: Move footnote code to footnote.c.
+ * makeinfo/makeinfo.h: Globals for footnote.c.
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add footnote.[ch].
+
+ * makeinfo/makeinfo.c: Move defun code to defun.c, necessary
+ global to makeinfo.h.
+ * makeinfo/makeinfo.h (default_indentation_increment): move here
+ for defun.c.
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add defun.c.
+
+ * Makefile.am: Doc fix.
+
+ * configure.in (AC_OUTPUT): generate makeinfo/tests/Makefile.
+
+ * makeinfo/makeinfo.c,
+ * makeinfo/makeinfo.h,
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add index.[ch].
+
+Fri Oct 2 17:42:26 1998 Karl Berry <karl@gnu.org>
+
+ * lib/system.h (STREQ): new macro.
+
+Thu Oct 1 09:26:57 1998 Karl Berry <karl@gnu.org>
+
+ * doc/texinfo.txi: Delete spare copy since out of date,
+ add makeinfo html to menu,
+ detailmenu doesn't take braces in summary.
+
+Wed Sep 30 14:38:21 1998 Karl Berry <karl@gnu.org>
+
+ * makeinfo/makeinfo.c: Remove != NULL comparisons,
+ xmalloc/xrealloc casts, assignments in if statements.
+
+Wed Sep 30 14:16:01 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Remove NULL casts and parentheses in return
+ statements.
+
+ * makeinfo/makeinfo.c (add_link): Don't add a link if the node is null.
+ (reader_loop): don't glean_node_from_menu if detailmenu, even if html.
+ Various formatting changes.
+
+ * doc/help2man: Always exit successfully.
+
+ * makeinfo/Makefile.am (SUBDIRS): add.
+ (makeinfo_SOURCES): no more html.h.
+
+Fri Sep 11 18:47:15 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Fiddle with html output.
+
+1998-09-07 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (maybe_update_execution_strings): Only
+ reallocate TEXT if the existing storage is too small, otherwise
+ leave TEXT alone.
+ (replace_with_expansion): Call maybe_update_execution_strings to
+ reallocate input_text if we are executing_string, since storage
+ for execution_string is assumed to be large enough to hold every
+ possible string.
+ (me_execute_string): xstrdup the argument, so callees could freely
+ relocate it as needed.
+
+1998-09-06 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (replace_with_expansion): Don't remember
+ macro-expansion pointers if we are executing_string.
+
+1998-09-05 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/filesys.c (info_suffixes): Put the empty suffix last in the
+ list, so that `foo.info' is found before `foo', if both exist.
+
+1998-09-05 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (maybe_update_execution_strings): New
+ function, updates an entry in execution_strings[] array after
+ input_text is relocated by replace_with_expansion.
+ (replace_with_expansion): Call it.
+
+1998-09-04 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (expand_macro): If a macro is called with
+ too many arguments, return NULL and print the line number where
+ the call begins.
+ (execute_macro): If expand_macro returns NULL, return
+ immediately.
+
+Sun Sep 6 19:11:28 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c,
+ * makeinfo/makeinfo.h,
+ * makeinfo/multi.c: Html output. Specifically, these changes:
+
+ Fri Jul 4 22:58:29 1997 Dave Love <d.love@dl.ac.uk>
+
+ * doc/makeinfo.texi: Document HTML output.
+
+ * makeinfo/makeinfo.c: Wrap strings in _() in bits changed for
+ HTML.
+ (cm_image): Generate <img> for HTML.
+
+ Sun Jun 22 22:50:07 1997 Dave Love <d.love@dl.ac.uk>
+
+ * makeinfo/makeinfo.c (NAMED_NODE_ANCHORS): New define.
+ (title, outstanding_node, node_number, node_node_references,
+ escape_html, ifinfo_as_html): New variables.
+ (tentry.number, node_ref.number, fn.number): New fields.
+ (CommandTable): Various additions and alterations for HTML.
+ (long_options): Add html and no-info-as-html.
+ (main): Extra code for HTML.
+ (usage): Add HTML stuff.
+ (expand_filename): Deal with .html.
+ (escape_string): New procedure.
+ (convert_from_loaded_file): Extra code for HTML.
+ (init_internals): Call free_node_references, initialize
+ node_number.
+ (reader_loop): Process menu items for HTML hyperlinks. Escape
+ HTML special characters.
+ (add_char): Code for line breaks and paragraph insertions in
+ HTML.
+ (flush_output): Don't UNMETA for HTML.
+ (indent): Do nothing for HTML.
+ (current_item_function): Case for ifhtml.
+ (begin_insertion): Deal with HTML in various cases.
+ (insert_html_tag): new procedure.
+ (cm_asterisk, cm_copyright, cm_accent, cm_code, cm_kbd,
+ cm_angle_brackets, cm_var, cm_defn, cm_var, cm_emph, cm_string,
+ cm_cite, cm_top, cm_xref, cm_inforef, cm_uref, cm_direntry,
+ cm_ifinfo, cm_item, process_defun_args, defun_internal, cm_sp,
+ cm_dircategory, cm_center, cm_result, cm_expansion, cm_error,
+ cm_exdent, index_add_arg, make_index_entries_unique,
+ cm_printindex, cm_footnote, output_pending_notes,
+ me_execute_string): Code for HTML.
+ (cm_shyph): New procedure.
+ (cm_special_char): Add start, end args. Code for HTML.
+ (cm_email, cm_url, cm_i, cm_b, cm_r): New procedures.
+ (sectioning_html): New procedure.
+ (sectioning_underscore): Use it.
+ (add_link): New procedure.
+ (remember_node): Add number field and update node_number. Note
+ next, etc. nodes for HTML.
+ (add_escaped_anchor_name, add_anchor_name): New procedures.
+ (cm_node): New code for HTML. Move some other code to more
+ useful place.
+ (remember_node_reference): Add number field and update
+ node_number.
+ (remember_node_node_reference, free_node_node_references,
+ number_of_node): New procedures.
+ (cm_ifhtml, cm_html): New procedures.
+ (expansion): Take care of HTML escaping.
+ (cm_settitle): New procedure.
+ (remember_note): Set number field.
+
+ Declare various procedures in advance.
+
+ * doc/texinfo.txi: Makeinfo --html documentation from Dave Love.
+ Typo fixes from: Paul DuBois <dubois@primate.wisc.edu>.
+
+Thu Sep 3 11:11:01 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/Makefile.am (makeinfo_SOURCES): add html.[ch].
+
+1998-08-28 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c (cm_uref, cm_email): Use get_xref_token to
+ gather arguments.
+ (get_xref_token): Keep track of input line number when expanding
+ xref arguments.
+
+Tue Aug 25 14:36:44 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/texi2dvi: Exit the script if TeX exits with bad status.
+
+1998-08-16 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/indices.c (info_index_apropos): In the *Apropos*
+ menu, print the label first, then the Info file name and
+ the node name. Make the Info file name part of the menu
+ entry, so that all entries are distinct.
+ (apropos_in_all_indices): Scan each Info file only once, thus
+ avoiding multiple identical entries in the *Apropos* menu.
+ Free xstrdup'ed buffer, to avoid leaking memory.
+
+Thu Aug 13 12:54:58 1998 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Set version to 3.12a.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): bump required version to 1.3,
+ add readme-alpha option.
+
+ * util/texindex.c (program_name),
+ * util/install-info.c (progname),
+ * info/info.c (program_name),
+ * makeinfo/makeinfo.c (progname): hardwire per coding standards.
+ * doc/help2man: Remove ginfo special case.
+
+Tue Aug 11 17:41:15 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/gen-dir-node: New version from drk@sgi.com.
+
+Mon Aug 10 13:55:37 1998 Karl Berry <karl@cs.umb.edu>
+
+ * dir-example: Add entries from Linux.
+
+ * info/info-utils.c (get_window_of_node): New fn.
+ * info/info-utils.h (get_window_of_node): New fn.
+ * (strchr,...) [!HAVE_STRCHR]: remove these #defines.
+ * info/infodoc.c (info_find_or_create_help_window): Call
+ get_window_of_node instead of get_internal_info_window.
+ This is so pressing ? repeatedly will always get to the same Help
+ window instead of popping up new ones.
+ From: "Brian J. Fox" <bfox@prospero.datawave.net>
+
+ * info/signals.c: Ignore SIGWINCH if we're in the midst of it.
+ We might get a whole lot of them. Noticed on Afterstep.
+ From: "Brian J. Fox" <bfox@prospero.datawave.net>
+
+1998-07-25 Bruno Haible <bruno@linuix.math.u-bordeaux.fr>
+
+ * install-info.c (findlines): Allocate room for one more line,
+ to avoid crash if dir file has exactly 512 lines.
+
+Tue Aug 4 07:14:35 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/info.c: Improve help message.
+
+ * dir-example: Add mtools.
+
+Fri Jul 31 13:29:52 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/help2man: Various hacks for texinfo.
+
+ * doc/texinfo.txi: Make dir entries more consistent.
+
+ * doc/Makefile.am: Generate man pages with help2man.
+
+ * util/texi2dvi,
+ * util/install-info.c,
+ * makeinfo/makeinfo.c,
+ * util/texindex.c: Improve help message.
+
+ * doc/info.5: Initial.
+ * doc/texinfo.5: Section 5.
+
+Thu Jul 30 17:31:42 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/info-stnd.texi,
+ * doc/texinfo.txi: Use Automake-standard VERSION and UPDATED.
+
+Wed Jul 29 17:34:41 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Describe macro limitations a bit more.
+
+ * dir-example: Correct makeinfo link.
+
+Tue Jul 28 16:44:06 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (remember_brace_1): xstrdup command, since
+ we free it later.
+
+Mon Jul 27 16:27:30 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/session.c (node_printed_rep): New fn.
+ Change calls.
+
+ * info/session.c (info_set_node_of_window): Simplify by taking new
+ argument to say whether to call
+ set_remembered_pagetop_and_point. Change calls.
+ * info/indices.c: Change call.
+
+ * info/info.c: Rewrite initial menu-sequence following stuff as a
+ function in session.c, and call it.
+
+ * info/infomap.c: Define `G' as info_menu_sequence.
+ * info/session.h (info_menu_sequence, info_follow_menus): declare
+ new fns.
+ * info/session.c (info_follow_menus, split_words,
+ * info_menu_sequence): New functions for new command.
+
+Thu Jul 23 16:44:42 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/session.c (info_scroll_other_window_backward): new command.
+ * info/infomap.c (initialize_info_keymaps): bind M-DEL and M-prior to
+ scroll-other-window-backward.
+ Report from: Vladimir Alexiev <vladimir@cs.ualberta.ca>
+ Date: Tue, 2 Dec 1997 14:54:30 -0700
+
+ * info/info-utils.c (printed_representation): If ISO_Latin_p, show
+ characters as-is. Don't assume iscntrl(x) returns false
+ for meta characters.
+ Report from: Francois Pinard <pinard@iro.umontreal.ca>
+ Date: 15 Jan 1998 17:48:51 -0500
+
+ * info/pcterm.c (pc_initialize_terminal): now no need to set it
+ here.
+ * info/info-utils.c (ISO_Latin_p): set to 1 by default.
+
+ * doc/info-stnd.texi: Document SPC, add goto-node anchor.
+
+Wed Jul 22 18:58:38 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/window.c (message_buffer_to_node),
+ * info/session.c (kill_node),
+ * info/nodes.c (info_get_node_of_file_buffer,
+ info_node_of_file_buffer_tags),
+ * info/man.c (manpage_node_of_file_buffer),
+ * info/footnotes.c (make_footnotes_node): set display_pos member
+ in new node.
+
+Tue Jul 21 14:04:52 1998 Karl Berry <karl@cs.umb.edu>
+
+ (all of this is to make SPC/DEL not move outside the current
+ document, i.e., not up through dir)
+ * info/info-utils.h (info_label_was_found): Move from here.
+ * (info_prev_label_of_node): Don't use it any more.
+ * info/session.c (INFO_LABEL_WAS_FOUND): Move to here, add test
+ for filename not dir.
+ (forward_move_node_structure): Change calls, notice if no more nodes.
+ (backward_move_node_structure): Check for moving outside current
+ document to dir.
+ * info/filesys.c (compression_suffixes): Add bz2 for bunzip2.
+ (is_dir_name): New fn.
+ * info/filesys.h: Declare it.
+ * info/nodes.c (info_get_node, info_find_file_internal): Use it.
+
+ * makeinfo/makeinfo.c: Set in_fixed_width_font to avoid munging
+ node names.
+
+Sat Jul 18 17:14:10 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/man.c (reap_children): Call wait (NULL), since we don't
+ actually use the return status for anything. NEXTSTEP 3.3
+ doesn't like an int * even though that is the POSIX
+ specification.
+ Date: Fri, 22 Aug 1997 13:55:42 +0200
+ From: "Felix H. Gatzemeier" <fxg@imib.rwth-aachen.de>
+ Via: Thomas Esser <te@informatik.uni-hannover.de>
+
+ * info/session.c (kill_node): Restore point when we go back.
+
+Thu Jul 16 18:54:04 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (BRACE_ELEMENT): Add `command' to the save
+ stack.
+ (MAYBE_BRACE_ARGS): New possibility, somewhat like TeX's
+ next-token-as-argument.
+ (command_table): Use cm_accent and MAYBE_BRACE_ARGS for all accents.
+ (read_command): Implement MAYBE_BRACE_ARGS.
+ (init_brace_stack): save current command.
+ (pop_and_call_brace): restore current command.
+ (cm_accent): move almost all accent characters to after the argument.
+ Suggested by Fran,cois.
+
+ * info/info.c (version_string): Remove defn.
+ Change call for --version option.
+ * info/session.c (display_startup_message_and_start): Just use
+ VERSION.
+ * info/info.h (version_string): Remove decl.
+
+Tue Jul 14 16:46:58 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.h: Doc fix.
+
+ * makeinfo/makeinfo.c (validate_file): Don't complain about
+ unreferenced anchors.
+
+ * doc/texinfo.txi: Document @anchor.
+
+Sun Jul 12 14:14:50 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (remember_node): Only set `current_node' if
+ this is not an anchor.
+
+ * info/nodes.c (get_tags_of_indirect_tags_table): Don't set
+ nodelen to -1 when fixing up the subfile entries, it might be 0
+ from an anchor.
+
+ * info/nodes.c (find_node_of_anchor): Offset display_pos for
+ anchor tags by the amount that node references are off by (- 1).
+
+Sat Jul 11 17:37:18 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_anchor): Add output_column for anchors
+ embedded in a line.
+
+Fri Jul 10 16:28:21 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/session.c (info_menu_or_ref_item): Don't search for the
+ xref text if it's an anchor.
+ * info/nodes.h (N_FromAnchor): New NODE flag.
+ * info/nodes.c (find_node_of_anchor): New fn.
+ (info_node_of_file_buffer_tags): Handle anchor case.
+
+Wed Jul 8 17:48:59 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/window.c (window_set_node_of_window): Set window->point to
+ node->display_pos.
+ Remove unneeded casts.
+
+Tue Jul 7 08:06:14 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (add_word_args) [!VA_SPRINTF]: Use buffer,
+ not the undeclared temp_string.
+ From: Tobias Naehring <naehring@eeetw3.et.tu-dresden.de>
+ To: egcs-bugs@cygnus.com
+ Date: Mon, 6 Jul 98 13:51:55 +0200
+
+Mon Jul 6 17:43:25 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/nodes.h (NODE): Add display_pos member.
+
+Sun Jul 5 08:17:43 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/nodes.h (INFO_REF_LABEL): Define.
+
+ * util/texi2dvi: Rationalize use of `index' vs. more general
+ `xref'.
+
+Thu Jul 2 18:53:43 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Don't translate -Footnotes, it's a magic
+ cookie. From Eli.
+
+Wed Jul 1 08:42:41 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi (url): Missing word `command'.
+
+Tue Jun 30 10:35:48 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/info.c: Missing \n in try --help msg.
+
+ * makeinfo/makeinfo.c (cm_anchor): New fn for new cmd.
+ (TAG_FLAG_ANCHOR): New flag for tag entries.
+ (write_tag_table_internal): Handle anchor case.
+ (TAG_FLAG_{{PREV,NEXT,UP}_ERROR,NO_WARN,IS_TOP}): Add TAG_FLAG_ prefix
+ for clarity, change uses.
+
+ * doc/texinfo.txi: Remove warning about footnotes with @item, that
+ works now.
+
+Mon Jun 29 10:17:50 1998 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in (AM_CONFIG_HEADER): Use second argument to be 8.3
+ compliant.
+ * config.h.in: Rename to config.in.
+
+ * info/Makefile.am (EXTRA_DIST),
+ * info/terminal.c [__MSDOS__]: Change #include to pcterm.c and
+ rename file.
+
+Sun Jun 28 14:29:27 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/Makefile.am (EXTRA_DIST): Add pc_term.c.
+
+ * makeinfo/makeinfo.c (HAVE_MACROS): Remove this conditional, we
+ always want macros now.
+
+ * info/indices.c: Copyright.
+
+1998-06-26 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * makeinfo/makeinfo.c: (only_macro_expansion): New variable,
+ suppresses all expansions except macros.
+ (replace_with_expansion): New function, replaces a portion of
+ input text with its expansion. Avoids moving the text around if
+ we are positive it will expand into itself. If the length of the
+ expanded text is the same as the length of the original text, just
+ replaces the original text without moving the rest. Resyncs the
+ remembered text pointers with the realloc'ed input_text, when it
+ is realloc'ed.
+ (reader_loop): When only_macro_expansion is non-zero, only handle
+ macros, but leave the rest of input intact.
+ (read_command): Now returns an int, zero means no known command or
+ macro is found after the prefix character; all callers changed.
+ Support operation under non-zero only_macro_expansion.
+ (cm_node): Expand only the macros in the @node line. Allocate and
+ generate the macro-expanded @node line in one swell whoop.
+ (glean_node_from_menu): Expand macros in menu entries.
+ (get_xref_token): A new argument EXPAND, when non-zero, means
+ expand macros in the entire brace-delimited argument before
+ looking for the next comma; all callers changed.
+ (expansion): Save and restore additional state variables important
+ for output generation machinery. Disable indentation and filling
+ during the recursive expansion, so that the output buffer offset
+ is not invalidated by filling.
+ (me_execute_string_keep_state): New function, calls
+ me_execute_string, but saves and restores state variables
+ important for output generation, so that -E doesn't change the
+ generated Info output.
+ (index_add_arg, cm_footnote): Call me_execute_string_keep_state.
+ (expand_macro): New function, returns the macro expansion as a
+ malloc'ed string.
+ (execute_macro): Call expand_macro.
+ (me_execute_string): Avoid memory leak by freeing input_filename.
+ (get_until_in_braces, replace_with_expansion, add_char,
+ cm_footnote, cm_macro, cm_unmacro, get_brace_args,
+ extract_colon_unit): Use the faster memcpy/memmove instead of
+ strncpy.
+
+Sat Jun 27 14:18:54 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/info.texi: Use @subsubsection instead of
+ @unnumberedsubsubsection, since it's in a numbered chapter.
+
+ * Started installation of following DOS patches from Eli.
+>1998-05-16 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * info/session.c (info_goto_node): Don't show the nodes of the
+> current Info file twice in *Completions*.
+> * info/echo-area.c (ea_possible_completions): Actually pass the
+> number of completions to printf_to_message_buffer.
+>
+> * info/man.c (manpage_node_of_file_buffer): xstrdup the nodename
+> member of manpage nodes, since the tags are freed and recomputed
+> when a new man page is added to *manpages* file_buffer.
+> (get_manpage_node): Recompute info_windows[]->nodes[] for all
+> windows showing the man pages after nodes[]->contents are
+> invalidated by reallocation of file_buffer->contents.
+>
+>1998-05-15 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * lib/system.h (DEFAULT_INFO_PRINT_COMMAND) [__MSDOS__]: Define to
+> ">PRN".
+> * info/session.c (print_node): Support ">printer" in
+> INFO_PRINT_COMMAND, to mean write to the named file/device insead
+> of piping to it as a program.
+> (kill_node): Compare window in addition to the nodename, when
+> looking for the node to kill.
+>
+>1998-05-09 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * lib/system.h (SET_SCREEN_SIZE_HELPER) [__MSDOS__]: Define a new
+> macro.
+> * info/m-x.c (set_screen_height): Use SET_SCREEN_SIZE_HELPER, if
+> defined. If the screen size did'n change, redisplay the previous
+> screen contents.
+>
+> * info/infomap.c (initialize_info_keymaps) [__MSDOS__]: Bind DEL
+> to ea_delete in the echo-area keymap.
+> * info/session.c (incremental_search): If the key is
+> isearch_terminate_search_key, but buffered input is pending, don't
+> gobble the ESC key.
+>
+> * info/info.c (main): Switch the order thet terminal_prep_terminal
+> and terminal_clear_screen are called, to make it consistent with
+> what initialize_info_session does when called with non-zero second
+> argument. Call terminal_unprep_terminal last, after moving the
+> cursor to the bottom of the screen. If user_filename is of the
+> form "d:foo", add "d:." to the INFOPATH, not "d:".
+>
+> * info/signals.c (initialize_info_signal_handler): Save old
+> SIGUSR1 handler.
+> (info_signal_handler): Handle SIGUSR1.
+>
+> * info/indices.c (info_apropos): Print the results to stdout.
+>
+>1998-05-02 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * makeinfo/makeinfo.c (ALSO_NULL_DEVICE): New macro, for alternate
+> null device name.
+>
+> * info/man.c (get_manpage_contents): Redirect stderr of the man
+> page formatter to the null device.
+> (executable_file_in_path): Use IS_SLASH.
+>
+> * info/session.c (info_gather_typeahead) [__DJGPP__]: Call
+> pc_term_chars_avail to get the number of pending characters.
+>
+> * info/filesys.c (convert_eols): New function, converts DOS-style
+> EOLs to a single Newline.
+> (filesys_read_info_file, filesys_read_compressed): Call it.
+> (filesys_read_compressed) [STRIP_DOT_EXE]: Use explicit .exe
+> suffix.
+> (filesys_read_compressed): Check return status of `pclose'.
+>
+>1998-05-01 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * info/filesys.c (filesys_read_info_file): Add additional
+> parameter: is_compressed. All callers changed.
+>
+> * makeinfo/makeinfo.c (convert_from_loaded_file): Compare file
+> names with FILENAME_CMP. Use NULL_DEVICE.
+> (cm_node): Compare file names with FILENAME_CMP.
+> * info/tilde.c (tilde_find_suffix, tilde_expand_word): Use
+> IS_SLASH.
+>
+> * info/pc_term.c: New file, handles the PC terminal on MS-DOS and
+> MS-Windows.
+> * info/terminal.c [__MSDOS__]: Include pc_term.c.
+> * info/Makefile.in (ginfo_SOURCES): Add pc_term.c
+> Add pc_term.c to dependencies of terminal.o.
+>
+> * info/session.c (info_get_input_char): Reassign tty after EOF
+> from a non-stdin input stream.
+>
+>1998-04-30 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * info/session.c (info_set_input_from_file): Use binary input.
+> (info_gc_file_buffers): Compare file names with FILENAME_CMP.
+> * info/search.c (skip_whitespace_and_newlines): Use
+> whitespace_or_newline macro instead of reinventing the wheel.
+> * info/nodes.c (info_find_file_internal): Use IS_ABSOLUTE and
+> FILENAME_CMP.
+> (info_load_file_internal): Call filename_non_directory to find out
+> where the basename begins.
+> (get_tags_of_indirect_tags_table): Call filename_non_directory.
+> containing_dir of "d:foo" is "d:.", not "d:".
+> (forget_info_file): Compare file names with FILENAME_CMP.
+> * info/nodemenu.c (get_visited_nodes): Use FILENAME_CMP to find
+> duplicate lines.
+>
+> * lib/system.h (PIPE_USE_FORK): New macro.
+> * info/man.c (get_manpage_contents): Use it to determine whether
+> to call pipe/fork/exec or popen/pclose to run the man page
+> formatter.
+> (executable_file_in_path): Search for the file with several known
+> extensions such as .exe, where appropriate.
+>
+> * lib/system.h (NULL_DEVICE): A new macro.
+> * info/makedoc.c (main): Use it.
+> (maybe_dump_tags): Switch output strem to binary mode when
+> appropriate.
+> (process_one_file): Update file_size after reading the file.
+>
+> * info/infodoc.c: Add TAB, RET, and `i' to the list of important
+> commands in info_internal_help_text.
+>
+> * info/info.c (main): Support the --speech-friendly option. Use
+> PATH_SEP to separate directories.
+> (info_short_help) [__MSDOS__]: Mention the --speech-friendly
+> option.
+>
+> * info/info-utils.c (filename_non_directory): Use HAVE_DRIVE and
+> IS_SLASH.
+> * info/indices.c (do_info_index_search, index_entry_exists): Use
+> FILENAME_CMP to compare file names.
+> * info/filesys.c: Add ".inf" to the list of known extensions.
+> Look for .z before .Z, for the sake of case-insensitive
+> filesystems. Add DOS-specific extensions to work around 8+3
+> namespace restrictions.
+> (info_absolute_file): New function.
+> (info_find_fullpath): Call it for candidates which are absolute
+> file names. Use IS_SLASH and IS_ABSOLUTE.
+> (info_file_in_path): Use IS_SLASH.
+> (extract_colon_unit, info_add_path): Use PATH_SEP instead of ":".
+> (lookup_info_filename): Compare file names with FILENAME_CMP.
+> (filesys_read_info_file): Read Info files in binary mode.
+> (filesys_decompressor_for_file): Read Info files in binary mode.
+> Compare file names with FILENAME_CMP. On MS-DOS, allow files
+> whose names end with a `z' be decompressed with gunzip.
+> * info/dribble.c (open_dribble_file): Open dribble file in
+> FOPEN_WBIN mode.
+> * info/dir.c (maybe_build_dir_node): Use IS_SLASH.
+> * util/texindex.c (maketempname): Put the numeric suffix after the
+> dot, to salvage 3 more characters on 8+3 filesystems.
+>
+>1998-04-29 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * util/texindex.c (main): Use IS_SLASH to find the basename of
+> argv[0]. Lose the .exe suffix, if any.
+> (decode_command): Look at $TEMP and $TMP in addition to $TMPDIR.
+> Use DEFAULT_TMPDIR.
+> * util/texi2dvi: Use either `:' or `;' as directory separator in
+> TEXINPUTS, computed at run time. Save previous versions of index
+> files in a separate backup directory.
+> * util/install-info.c (main): Support backslashes in file names by
+> using IS_SLASH. Avoid recomputing length of infile_basename
+> unnecessarily. Use FILENAME_CMP for comparing file names
+> case-insensitively, where appropriate. Allow foo.inf as well as
+> foo.info to be an Info file name.
+> * lib/system.h (PATH_SEP, STRIP_DOT_EXE, FILENAME_CMPN,
+> DEFAULT_TMPDIR): New macros.
+>
+>1998-04-25 Eli Zaretskii <eliz@is.elta.co.il>
+>
+> * lib/system.h (O_BINARY, SET_BINARY, FOPEN_RBIN, FOPEN_WBIN,
+> IS_SLASH, HAVE_DRIVE, IS_ABSOLUTE, FILENAME_CMP, PATH_SEP,
+> HAVE_LONG_FILENAMES): New macros.
+> * makeinfo/makeinfo.c (find_and_load): Use O_BINARY to decide when
+> read returning a value different from what st_size says is not an
+> error. Realloc the buffer after we've read the file.
+> (skip_directory_part): New function, skips leading directory in a
+> way that works on DOSISH systems.
+> (filename_non_directory, pathname_part): Call it.
+> (filename_part): Call filename_non_directory.
+> (expand_filename, full_pathname): Use IS_ABSOLUTE and IS_SLASH.
+> (convert_from_file): Check .txi extension first.
+> (split_file): Support splitting output files on 8+3 filesystems.
+> (main, extract_colon_unit): Use PATH_SEP instead of ':'.
+> (get_file_info_in_path): Use IS_ABSOLUTE and IS_SLASH.
+
+
+ * doc/texinfo.txi: Changes from Eli for MS-DOS stuff.
+ * doc/info-stnd.texi: Fixes from Eli: he documented all the
+ missing keys and command-line options, corrected
+ inaccuracies (probably left-overs from previous versions),
+ and added some clarifications where I thought the manual
+ was not clear enough.
+ * Makefile.am (EXTRA_DIST): Add djgpp files.
+
+ * makeinfo/makeinfo.c: New no-op commands @setcontentsaftertitlepage
+ and @setshortcontentsaftertitlepage.
+ * doc/texinfo.txi: Document the new @set{,short}contentsaftertitlepage
+ commands and the possibility of putting @contents and
+ @shortcontents after @end titlepage.
+
+ * util/texi2dvi: Check that the toc file has not changed (as well
+ as .aux and .??).
+
+Thu Jun 25 16:58:46 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Document new commands @env, @command, @option.
+
+ * makeinfo/makeinfo.c (option, command, env): New markup commands, same
+ as @code in info.
+
+Wed Jun 24 15:39:38 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: New no-op command @acronym.
+
+ * doc/texinfo.txi: Document new command @acronym.
+
+ * util/install-info.c (strip_info_suffix, menu_item_equal): New fns.
+ (main): Call them instead of doing the filename test inline; all the
+ .info variations are too confusing to write out twice.
+
+Tue Jun 23 18:01:40 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Fix some overfull boxes.
+
+Mon Jun 22 19:22:17 1998 Karl Berry <karl@north>
+
+ * configure.in: Remove AC_LINK_FILES call, that was an old gettext
+ thing, no longer necessary, and causes problems with Autoconf.
+
+Sun Jun 14 07:00:15 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/texi2dvi: Indent options so help2man will work. From Akim.
+
+Sat Jun 13 10:45:25 1998 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in (ALL_LINGUAS): Add nl.
+
+ * util/texi2dvi: Avoid tabs.
+
+Wed Jun 10 17:38:21 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (gen_defindex): Use xmalloc instead of alloca.
+ This was our only use of alloca, so also remove all the #if junk
+ at the beginning to define it.
+
+ * makeinfo/makeinfo.c: Fix grammar in multiply-defined-node error
+ message.
+
+Tue Jun 9 17:53:54 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Document new commands @smallformat,
+ @smalldisplay.
+
+ * makeinfo/makeinfo.c: New commands @smalldisplay and @smallformat.
+ Suggestion from: Eli Zaretskii <eliz@is.elta.co.il>.
+
+ * makeinfo/makeinfo.h (insertion_type, insertion_type_names):
+ Declare smalldisplay and smallformat.
+
+Mon Jun 8 07:57:52 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Document possibility of combining @titlefont
+ and @title. From Eli.
+
+ * util/texi2dvi: Set verbose to : instead of false by default.
+
+ * util/texi2dvi: Missing \\ for sed with -t text. From Akim.
+
+Sun Jun 7 13:02:13 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Document @pagesizes and texidvi -t.
+
+ * makeinfo/makeinfo.c: Define no-op @pagesizes and @afourpaper.
+ (major_version, minor_version): Remove these globals, just use the
+ Texinfo package version.
+ (print_version_info): Ditto.
+
+Fri Jun 5 17:54:16 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Change texi2dvi documentation a bit.
+
+ * util/texi2dvi: Handle --option=argument style of specifying
+ arguments.
+
+Sat May 30 14:01:37 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: More.
+
+ * util/install-info.c (open_possibly_compressed_file): Finish
+ implementation.
+
+ * doc/texinfo.txi: Document install-info compression support.
+
+Fri May 29 08:01:43 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c (open_possibly_compressed_file): Initial
+ implementation.
+
+ * util/install-info.c (output_dirfile): Attempt to write dir.gz if
+ that's what we read.
+ (readfile): Pass back the actual opened filename, too.
+
+ * info/indices.c: Check in Eli's patch.
+
+Thu May 28 17:09:45 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c (readfile): Set up to handle compressed
+ input (and output) files. Change callers.
+ Rearrange function order to avoid forward declarations.
+
+ * configure.in: Remove check for libz, we'll fork gzip instead.
+
+Tue May 26 18:01:13 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c (print_help): Missing \n\ in help string.
+
+ * makeinfo/makeinfo.c (POST_SENTENCE): Rename from post_sentence.
+ Change calls.
+ (flush_output): Strip 8th bit if post_sentence char as well as space.
+ (cm_code, etc.): Change add_char calls for post_sentence chars to set
+ 8th bit.
+
+1998-05-23 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * info/indices.c (info_next_index_match): Call
+ info_set_node_of_window to display the node, so that footnotes are
+ displayed as well.
+
+Thu May 21 11:05:50 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c (output_dirfile): New function, extracted
+ from the end of main.
+
+ * makeinfo/makeinfo.c (begin_insertion): Ignore @group in all the
+ example-like environments, not just @example. Otherwise the first
+ line in the environment is not indented correctly. Reported by rms.
+
+Wed May 20 17:44:38 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c: Doc fixes.
+
+ * util/install-info.c: Handle XEmacs-style dir entries:
+ * FILENAME::PROGRAM DESCRIPTION.
+ Date: Wed, 13 May 1998 13:58:28 +0900
+ From: KIRIYAMA Kazuhiko <kiri@kiri.toba-cmt.ac.jp>
+
+ Also, do not set something_deleted on continuation lines; they are only
+ deleted if the entry was deleted.
+
+Tue May 19 17:22:50 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c: Do not read the dir file if we are only
+ deleting -- it might not exist, and we don't actually need it.
+ From: David Kaelbling <drk@sgi.com>
+ Date: Tue, 12 May 1998 11:05:26 -0400
+
+ * util/gen-dir-node:
+ From: David Kaelbling <drk@sgi.com>
+ Date: Tue, 12 May 1998 16:05:16 -0400 -
+ - The "dir" moobler header is slightly different from the default
+ dir file.
+ - If all files in ${infofiles} appear in the skeleton the last one
+ is processed twice.
+ - INFO-DIR-SECTION data is ignored.
+ - Don't generate entries for directories.
+
+Sat May 16 17:16:56 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_novalidate): New fn for new command
+ @novalidate, like --no-validate.
+
+Thu May 14 18:02:31 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Document the @novalidate command.
+
+Wed May 13 17:47:20 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi: Document limitation on @set/@value names in
+ index commands.
+
+Fri May 1 14:12:15 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi (Command List): @deftypevar out of order.
+
+ * configure.in (ALL_LINGUAS): Add cs.
+
+Tue Apr 28 09:33:41 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (strcasecmp): This is in lib now.
+
+1998-04-26 Richard Stallman <rms@psilocin.gnu.org>
+
+ * util/install-info.c (print_help): Doc clarifications.
+
+Sun Apr 19 15:55:10 1998 Karl Berry <karl@cs.umb.edu>
+
+ * lib/system.h (strcasecmp, strncasecmp) [!HAVE_STR[N]CASECMP]:
+ Declare these.
+
+ * info/search.h (str[n]casecmp): Remove decl from here.
+
+ * configure.in (AC_REPLACE_FUNCS): Check for strcasecmp and
+ strncasecmp here.
+ (AC_CHECK_FUNCS): Instead of just strcasecmp here.
+
+ * configure.in (texconfig): Use TEXMFMAIN in preference to TEXMF
+ for post-0.4 teTeX.
+
+Wed Apr 15 17:20:31 1998 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.txi (Reporting Bugs): New section.
+ Suggestion from: Andrew Shapira <shapiraa@cs.rpi.edu>
+ Date: Mon, 4 Aug 1997 19:06:06 -0400 (EDT)
+
+ * info/infomap.c: Define / to be info_search.
+ Suggestion from: Egil Kvaleberg <egil@kvaleberg.no>
+ Date: Fri, 1 Aug 1997 08:16:45 +0200 (MET DST)
+
+ * doc/texinfo.txi (uref): Document reason for not using <URL: format.
+ Also use ftp.gnu.org instead of ftp.gnu.ai.mit.edu throughout.
+
+Tue Apr 14 10:43:39 1998 Karl Berry <karl@cs.umb.edu>
+
+ 1998-04-05 Karl Eichwalder <ke@suse.de>
+ * makeinfo/makeinfo.c (begin_insertion): No need to
+ gettext; it's a keyword. From carl-friedriech.spilcke-liss@ensae.fr.
+ (cm_printindex): ditto.
+
+ * util/texi2dvi: Always remove the $tmp_dir's.
+ From: Dean Gaudet <dgaudet@arctic.org>
+ Date: Tue, 14 Apr 1998 00:55:36 -0700 (PDT)
+
+Mon Apr 13 18:02:57 1998 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Include
+ AM_SYS_POSIX_TERMIOS
+ AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL
+ to avoid window resizing being ignored under glibc2 systems,
+ e.g., Red Hat Linux 5.0. Actually any system where the ioctls are not
+ defined in <termios.h>.
+ See also http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl/full/206.
+ * acconfig.h (GWINSZ_IN_SYS_IOCTL): New #undef for autoheader.
+ * info/termdep.h [GWINSZ_IN_SYSIOCTL]: #include <sys/ioctl> if
+ this is defined.
+ From: Mark Jefferys <mjeffery@cse.ogi.edu>
+ Date: Thu, 9 Apr 1998 12:38:27 -0700 (PDT)
+
+Fri Apr 3 01:18:22 1998 Philippe De Muyter <phdm@macqel.be>
+
+ * info/info.c (main): Use 0, not NULL, as ? : alternative.
+
+Tue Mar 3 13:29:17 1998 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Version 3.12.
+
+ * po/de.po: New version.
+
+ * po/POTFILES.in: Do not include doc.c; that gets built at
+ runtime, thus causing texinfo.pot to try to get rebuilt. Besides,
+ it doesn't have any translatable strings.
+
+Sun Mar 1 10:38:47 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/install-info.c: No need for i18n on version message. From
+ ke@suse.de.
+
+Fri Feb 27 16:06:23 1998 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Run texconfig conf instead of confall.
+
+ * doc/Makefile.am (INSTALL_INFO): New variable.
+ (install-info-am): Use install-info from our distribution.
+
+ * info/info.c (info_minor_version): Increment.
+ * (info_patch_level),
+ * info/info.h (info_patch_level): Remove.
+
+ * info/info.c (program_name): Move decl.
+
+ * util/install-info.c (ensure_dirfile_exists): Use commas and \t
+ instead of an explicit tab, which make dist expands.
+
+ * doc/texinfo.txi: @prep.ai.mit.edu -> @gnu.org.
+
+ * info/info.c: Make help messages consistent with others.
+
+ * util/install-info.c (print_help): Format consistently.
+
+ (readfile): Support gzipped files via libz.
+ From: Elliot Lee <sopwith@redhat.com>
+ Date: Mon, 1 Sep 1997 23:37:14 -0400 (EDT)
+
+Thu Feb 26 16:13:14 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/echo-area.c: Whoops, _ might not start with parens.
+
+ * configure.in: Check for libz.
+ Do not output emacs/Makefile.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Set to 1.2f.
+
+ * util/texi2dvi: Always remove temporary directories. (From Akim.)
+ Formatting changes.
+
+Wed Feb 25 15:26:26 1998 Karl Berry <karl@cs.umb.edu>
+
+ * util/texi2dvi: New options --batch, --clean.
+ From: Akim Demaille <demaille@inf.enst.fr>
+ Date: 15 Aug 1997 18:05:33 +0200
+ * doc/texinfo.txi (Format with texi2dvi): Mention --help.
+
+ Applied this:
+1997-08-09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * makeinfo/makeinfo.c (me_executing_string): New variable.
+ (me_execute_string): Use it instead of executing_string.
+ (popfile): Check for me_executing_string as well as
+ executing_string.
+ (get_until_in_line): Likewise.
+ (insert_and_underscore): Do not write any expansion output if
+ executing a string.
+ (cm_node, cm_include, index_add_arg, cm_footnote, execute_macro,
+ cm_macro, cm_unmacro): Likewise.
+ (cm_footnote): Include the footnote marker in the expansion
+ output.
+ (append_to_expansion_output): Do nothing if the input_text wasn't
+ a remembered text.
+ (defun_internal): Make the index entry even if expanding macros.
+ (expansion): Don't reset macro_expansion_output_stream around call
+ to execute_string.
+ (apply): Fix typo.
+
+Tue Feb 24 17:33:44 1998 Karl Berry <karl@cs.umb.edu>
+
+ 1997-11-10 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ * makeinfo/makeinfo.c (get_until_in_line): Don't use xstrdup on
+ the unterminated input_text.
+
+ * makeinfo/makeinfo.c: Don't assume all \'s in macro bodies are
+ arguments.
+ From: Mathias.Herberts@irisa.fr (Mathias Herberts)
+ Date: Tue, 6 Jan 1998 18:54:26 +0100
+
+ * configure.in: Check for sigblock in libc before libbsd.
+ * From: hjl@lucon.org (H.J. Lu)
+ * Date: Fri, 23 Jan 1998 21:50:25 -0800 (PST)
+
+Mon Feb 23 16:26:31 1998 Karl Berry <karl@cs.umb.edu>
+
+ * info/window.c (character_width): If ISO_Latin_p is set, make
+ printable_limit 255, not 160. ISO Latin 1 uses
+ essentially all of the 256 characters.
+ Reported by: Marius Groeger <mag@sysgo.de>
+ Date: Wed, 17 Dec 1997 16:05:27 +0100
+
+ * info/info.c: Improve help message.
+
+Sun Feb 22 17:38:32 1998 Karl Berry <karl@cs.umb.edu>
+
+ * Makefile.am (SUBDIRS): Remove emacs; we'll just distribute the
+ Elisp files with Emacs.
+
+ * doc/Makefile.am (info_TEXINFOS, texinfo): Rename manual to
+ texinfo.txi to avoid DOS filename clash with texinfo.tex.
+
+ * info/tilde.c: Copy slightly updated alloca stuff from makeinfo.
+
+ * util/texindex.c (main): Declare as returning int to placate
+ warnings.
+
+ * info/Makefile.am: Uncomment BUILT_SOURCES stuff and add missing _.
+ From: "Joel N. Weber II" <devnull@gnu.org>
+ Date: Fri, 30 Jan 1998 17:21:38 -1000
+
+ * util/texindex.c,
+ * util/install-info.c,
+ * makeinfo/makeinfo.c,
+ * info/info.c: Change help address to @gnu.org.
+
+ 1998-01-22 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ * makeinfo/makeinfo.c (usage): Fix order of arguments to help
+ format string.
+
+ * makeinfo/makeinfo.c (cm_top): Error message wording.
+
+ * doc/texinfo.texi (Functions in Typed Languages): Remove
+ duplicate description of @deftypemethod.
+ From: KHMarbaise@p69.ks.fido.de (Karl Heinz Marbaise)
+ Date: Wed, 07 Jan 1998 11:11:50 +0100
+
+ * info/session.c (info_get_input_char) [EINTR]: Keep reading if we
+ get EINTR.
+ From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ Date: 22 Dec 1997 10:32:53 +0100
+
+Sat Feb 21 17:41:26 1998 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (find_and_load): Malloc enough room for the
+ null as well as the newline.
+ From: "John W. Eaton" <jwe@bevo.che.wisc.edu>
+ Date: Tue, 30 Sep 1997 21:12:01 -0500
+
+ * util/texindex.c (--version),
+ * makeinfo/makeinfo.c (cm_today),
+ * makeinfo/makeinfo.c (print_version_info): Version strings etc. do not
+ need translation.
+ From: Karl Eichwalder <ke@suse.de>
+ Date: 13 Sep 1997 16:20:02 +0200
+
+ * info/echo-area.c: Rewrite pluralization to be translatable.
+ From: Karl Eichwalder <ke@suse.de>
+ Date: 13 Sep 1997 16:20:02 +0200
+
+ * util/texindex.c,
+ * info/info.c,
+ * makeinfo/makeinfo.c,
+ * util/install-info.c: --version: Give year as argument to printf,
+ to reduce the number of translations needed.
+ From: Ulrich Drepper <drepper@ipd.info.uni-karlsruhe.de>
+ Date: 02 Sep 1997 18:01:26 +0200
+
+ * util/texindex.c: Remove the fnctl.h and sys/file.h conditional #includes, they are
+ already in lib/system.h.
+ From: "Philippe De Muyter" <phdm@macqel.be>
+ Date: Thu, 21 Aug 1997 20:16:49 +0200 (MET DST)
+
+ * info/terminal.c (terminal_begin_using_terminal,
+ terminal_end_using_terminal): #ifdef SIGWINCH settings for
+ m68k-motorola-sysv.
+ From: "Philippe De Muyter" <phdm@macqel.be>
+ Date: Thu, 21 Aug 1997 20:16:49 +0200 (MET DST)
+
+ * info/filesys.c (info_suffixes): Add /index as a possibility for
+ subdirectories.
+ From: Matthew Wilcox <willy@odie.barnet.ac.uk>
+ Date: Wed, 6 Aug 1997 15:55:16 +0100 (BST)
+
+ * configure.in: Redirect texconfig input from /dev/null to avoid
+ stoppage.
+ From: Thomas Esser <te@informatik.uni-hannover.de>
+ Date: Mon, 4 Aug 1997 18:15:49 +0200
+
+ * makeinfo/makeinfo.c (find_and_load): Null-terminate the input text.
+ From: Kenneth Stailey <kstailey@disclosure.com>.
+
+ * info/Makefile.am (INCLUDES): Add -I.. -I$(srcdir).
+
+Fri Aug 22 16:24:59 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Adjust ISBN, edition number for print run.
+
+Mon Aug 4 16:12:42 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/info.c (main) [INFODIR]: Add this to infopath, if set.
+ * info/Makefile.am (DEFS): New define, include -DINFODIR.
+ From: Larry Schwimmer <rosebud@cyclone.Stanford.EDU>.
+
+ * util/install-info.c (ensure_dirfile_exists): Use tabs instead of
+ spaces on the File: dir line.
+ Bug from: Dave Love <d.love@dl.ac.uk>.
+
+Sat Aug 2 12:43:57 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_value, cm_email, cm_uref): Have to cast
+ from unsigned char * to char * or IRIX cc complains.
+ From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>.
+
+Fri Aug 1 14:05:10 1997 Karl Berry <karl@cs.umb.edu>
+
+ * Makefile.am (EXTRA_DIST): Remove README-alpha.
+ From: "ir. Mark M._Kettenis" <kettenis@phys.uva.nl>.
+
+1997-07-31 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * configure.in: Use AC_CHECK_HEADERS, not AC_CHECK_HEADER.
+
+Thu Jul 31 11:57:46 1997 Karl Berry <karl@cs.umb.edu>
+
+ * Version 3.11.
+
+ * info/man.c (reap_children): Declare status as int, not unsigned,
+ since that's what POSIX says the arg to wait should be.
+
+ * makeinfo/makeinfo.c (cm_uref, cm_email): Rewrite to do macro
+ expansion in the arguments.
+
+ * makeinfo/makeinfo.c (main): setlocale LC_MESSAGES and LC_TIME,
+ instead of LC_ALL.
+ From: Akim Demaille <demaille@inf.enst.fr>.
+
+ * makeinfo/makeinfo.c (cm_today): Let the %d %s %d be translated,
+ so other languages can change the order of day/month/year.
+ From: Akim Demaille <demaille@inf.enst.fr>.
+
+ * info/infomap.c: Doc fix.
+
+ * lib/system.h [!O_RDONLY]: Prefer <fcntl.h> to <sys/fcntl.h>.
+
+ * configure.in (AC_CHECK_HEADERS): Check for fcntl.h.
+
+ * doc/Makefile.am (install-data-local): Suggest tex/generic/dvips
+ for epsf.tex.
+ From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>.
+
+ * configure.in (TEXMF): Move check to block with other program
+ checks.
+
+Wed Jul 30 11:20:37 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (defun_internal): Allow extra text after
+ most @def... commands, for tzname[2] in libc.texinfo.
+
+ * info/info.c: Include indices.h.
+ * configure.in (AC_CHECK_HEADERS): Test for sys/wait.h, info/man.c
+ uses it.
+ From: Erick Branderhorst <Erick.Branderhorst@asml.nl>.
+
+Tue Jul 29 15:55:19 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Version 3.9j.
+
+ * info/terminal.c (output_character_function): Return int (the
+ arg), not void.
+
+ * info/infomap.c: Don't define term_kP as 'v', since that's undefined.
+ From: Tom Hageman <tom@basil.icce.rug.nl>.
+
+ * makeinfo/makeinfo.c: Parameterize some messages to avoid
+ duplicate translations.
+
+ * info/terminal.c: Only try to declare ospeed, PC, tputs, etc. if
+ we don't have <ncurses.h/termcap.h> or <termcap.h>.
+
+ * makeinfo/makeinfo.c (cm_email): New function, like cm_uref.
+
+Sun Jul 27 17:09:20 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Only check for <ncurses/termcap.h> if we're using
+ -lncurses.
+ From: Bo Johansson <bo.johansson@mbox2.swipnet.se>.
+
+ * info/dir.c (new_dir_file_p): Avoid automatic struct
+ initialization, SunOS 4 etc. cc can't handle it.
+ From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>.
+
+Sat Jul 26 15:08:13 1997 Karl Berry <karl@cs.umb.edu>
+
+ * Version 3.9i.
+
+ * configure.in: Check for termcap.h and ncurses/termcap.h.
+ From: bo.johansson@mbox2.swipnet.se.
+
+Fri Jul 25 14:09:05 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Document new second optional arg to email.
+
+ * info/infodoc.c: Document CTRL-x 0 as the way to get out of help.
+
+ * info/dir.c (maybe_build_dir_node): Really check for the same dir
+ file twice, not just by name.
+ (new_dir_file_p): New function.
+
+ * util/install-info.c: Tell them about --help in doc strings.
+
+Thu Jul 24 14:25:44 1997 Karl Berry <karl@cs.umb.edu>
+
+ * util/texindex.c (memory_error): Move to avoid incorrect implicit
+ decl.
+
+ * makeinfo/makeinfo.c,
+ * makeinfo/multi.c,
+ * util/install-info.c,
+ * util/texindex.c,
+ * info/tilde.c,
+ * info/man.c,
+ * info/gc.c,
+ * info/session.c (info_replace_key_to_typeahead): Remove unused
+ function,
+ * info/nodemenu.c,
+ * info/man.c,
+ * info/m-x.c,
+ * info/footnotes.c
+ * info/info.c
+ * info/indices.c,
+ * info/filesys.c: Parenthesize to avoid -Wall warnings
+ remove unused variables,
+ make return types explicit,
+ printf type corrections.
+
+ * lib/system.h: <ctype.h>: Include this.
+ * util/texindex.c,
+ * makeinfo/makeinfo.c,
+ * info/echo-area.c,
+ * info/display.c: ctype.h: Included in system.h now.
+
+ * info/echo-area.c: Parenthesize to avoid -Wall warnings.
+ (ctype.h): #include for isprint.
+ (echo_area_stack_depth): Remove unused function.
+ * info/display.c: Parenthesize to avoid -Wall warnings.
+ (ctype.h): #include for isprint.
+ * info/dir.c: Parenthesize to avoid -Wall warnings.
+ (build_dir_node_internal): Remove declaration of nonexistent function.
+ From: Erick Branderhorst <Erick.Branderhorst@asml.nl>.
+
+ * configure.in (TEXMF): Call texconfig to discover the default value,
+ for the sake of the warning in doc/Makefile.
+ From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>.
+
+ * doc/Makefile.am (TEXMF): New variable.
+ (install-data-local): Use it in warning.
+ From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>.
+
+ * info/session.c (initialize_info_session): Only call
+ terminal_prep_terminal if clear_screen is true. Otherwise, failed
+ --index-searches prep the terminal but do not unprep it.
+ From: William Edward Webber <wew@yallara.cs.rmit.EDU.AU>.
+
+ * info/nodemenu.c: Doc fix.
+
+Mon Jul 21 17:11:09 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Comment out @smallbook and @set smallbook so
+ people at other sites can print it the way they want.
+ From: Thomas Walter <walter@pctc.chemie.uni-erlangen.de>
+
+Sun Jul 20 07:52:25 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: 3.9h.
+
+ * doc/Makefile.am (install-info-am, distclean-aminfo): New targets
+ to avoid assuming info files are in srcdir.
+
+ * lib/system.h (xstrdup): Returns char *, not void *.
+
+ * doc/Makefile.am (.texi.info),
+ * doc/Makefile.am (texinfo): Don't run in $(srcdir).
+
+ * util/install-info.c (main): Remove unnecessary decl of strrchr.
+
+ * info/tilde.c: Include info.h (for config.h) before alloca stuff.
+
+ * makeinfo/makeinfo.c (validate_file): Rename `valid' to `valid_p'
+ to avoid conflict with SunOS 4 header files.
+ From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>.
+
+ * info/session.c (initialize_info_session): Call
+ terminal_prep_terminal here (before calling terminal_clear_screen).
+ (info_session): Instead of here.
+ From: William Edward Webber <wew@yallara.cs.rmit.EDU.AU>.
+
+ * Makefile.am (EXTRA_DIST): Add README-alpha.
+
+Sat Jul 19 13:50:27 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/terminal.c: Use `keypad transmit' sequence if it's defined:
+ (term_keypad_on, term_keypad_off): New statics.
+ (terminal_begin_using_terminal): If term_keypad_on, send it.
+ (terminal_end_using_terminal): If term_keypad_off, send it.
+ (terminal_initialize_terminal): Look up ks and ke termcap strings.
+ From: William Edward Webber <wew@yallara.cs.rmit.EDU.AU>.
+
+ * info/infomap.c (initialize_info_keymaps): Initialize hardwired
+ cases for arrow keys a la readline. Found by John Eaton,
+ jwe@bevo.che.wisc.edu.
+
+ * makeinfo/makeinfo.c (output_pending_notes): Remove footnote
+ macro expansion code I #if 0'd out some time ago. And doc fixes.
+
+ * Applied this patch:
+
+Sat Jul 19 16:29:01 1997 Karl Eichwalder <ke@suse.de>
+
+ * info/info.c (main): setlocale, bindtextdomain, and textdomain.
+
+Fri Jul 18 10:02:18 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/Makefile.am (install-data-local),
+ * emacs/Makefile.am (install-data-local): Give subdir in warning.
+
+ * configure.in: Version 3.9f.
+
+ * doc/texinfo.texi: Correct \^ to @^.
+ From Andreas S.
+
+ * Merged these changes:
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * info/display.c (display_cursor_at_point): Flush ouput.
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * info/session.c (remember_window_and_node): Don't crash when the
+ current window has no current node.
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * util/texindex.c (usage): Translate the doc strings.
+ * makeinfo/makeinfo.c (cm_today): Translate the month names.
+ * info/variables.c (describe_variable): Translate the doc strings.
+ * info/nodes.h: Don't translate the strings defining the info format.
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * makeinfo/makeinfo.c (get_item_function): Remove superfluous call
+ to canon_white after get_rest_of_line.
+ (cm_end): Likewise.
+ (handle_variable): Likewise.
+ (cm_item): Likewise.
+ (cm_unmacro): Likewise.
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * info/nodemenu.c (list_visited_nodes): Don't clear the internal
+ flag, this and other functions depend on it. Don't insist on
+ displaying the menu below the current window.
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * makeinfo/makeinfo.c (cm_uref): Fix memory leaks.
+ (cm_inforef): Likewise. Handle empty cross reference name.
+
+1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * info/echo-area.c (ea_possible_completions): Check that the
+ current window can actually be split.
+
+Thu Jul 17 17:19:34 1997 Karl Berry <karl@cs.umb.edu>
+
+
+ * emacs/Makefile.am (*clean-lisp): Define, as Automake didn't.
+ From: Kenneth Stailey <kstailey@disclosure.com>.
+
+ * doc/Makefile.am: Do not distribute info.1.
+ * makeinfo/macros: Do not distribute this directory, it's merged
+ into the main documentation.
+ * doc/makeinfo.texi: Don't distribute this either, it's in the
+ main manual.
+
+ * util/install-info.c: Use \n\ for multiline string constant.
+ From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>.
+
+Wed Jul 16 15:29:50 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: @set must be after @setfilename, I guess.
+ Noted by Erick Branderhorst.
+
+ * Applied this change:
+
+Tue Nov 12 22:20:22 1996 John Eaton <jwe@bevo.che.wisc.edu>
+
+ * makeinfo.c (INDEX_ALIST): Use two indices, read_index and
+ write_index, instead of just one.
+ (find_index_offset): If a match is found, return index to the
+ current INDEX_ALIST struct, not the index pointing to the list of
+ index entries.
+ (translate_index): Return read_index from the matching
+ INDEX_ALIST.
+ (undefindex): Delete the list of index elements pointed to by
+ read_index from the INDEX_ALIST that matches name.
+ (defindex): Initialize read_index and write_index.
+ (index_add_arg): Add entries to the list pointed to by write_index
+ from the INDEX_ALIST matching name.
+ (index_append): Delete unused function.
+ (cm_synindex): Don't merge indcies, just make the write_index for
+ redirectee the same as the write_index for redirector.
+
+Tue Jul 15 09:32:04 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Bump edition number for 2.24.
+
+ * util/Makefile.am (localedir): Define.
+
+ * info/window.h: Rename __window__ to window_struct.
+
+ * info/window.h,
+ * info/variables.h,
+ * info/search.h,
+ * info/man.h,
+ * info/info-utils.h,
+ * info/gc.h,
+ * info/footnotes.h,
+ * info/filesys.h,
+ * info/echo-area.h,
+ * info/display.h: Avoid leading _ in #define for #include protection.
+
+ * makeinfo/makeinfo.c: Version 1.68.
+ * info/info.c: Version 2.17.
+
+ * Most all files: Untabify.
+
+ * doc/Makefile.am (texinfo): Add explicit target.
+
+ * emacs/Makefile.am (noinst_LISP): Remove the obsolete
+ detexinfo.el (makeinfo --no-headers is better) and
+ texnfo-tex.el (now handled by TeX modes in general).
+
+Mon Jul 14 15:21:03 1997 Karl Berry <karl@cs.umb.edu>
+
+ * util/texi2dvi: Update RCS file from 3.9 distribution.
+
+ * util/Makefile.am (EXTRA_DIST): Add update-info, from
+ rhawes@dmapub.dma.org
+
+Sun Jul 13 17:05:03 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/signals.c: Use RETSIGTYPE instead of hardwiring void.
+ From: "Jeffery L. JT Vogt" <lfm@atw.earthreach.com>.
+
+ * info/session.c (info_history_node): Rewrite as
+ info_kill_node (current_node).
+ (kill_node, read_nodename_to_kill): New functions from info_kill_node.
+ (info_kill_node): Now this just calls them.
+
+Fri Jul 11 11:56:58 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Fix `Conditionals' xref.
+
+Thu Jul 10 17:58:12 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/info.texi: Don't say SPC clears ? screen.
+
+Sun Jul 6 16:26:41 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/info-stnd.texi: Document --index-search.
+
+ * info/tilde.c,
+ * info/session.c: Remove redundant getenv decl.
+
+ * Installed following change:
+Tue Nov 12 14:44:00 1996 John W. Eaton <jwe@bevo.che.wisc.edu>
+
+ * info/info.c (main): Handle new option, --index-search STRING.
+ (index_search_p, index_search_string): New static variables, used
+ to handle --index-search option.
+
+ * info/session.c (initialize_info_session): New arg,
+ clear_screen. Change all callers.
+
+ * info/indices.h (do_info_index_search, index_intry_exists):
+ Provide declarations here.
+
+ * info/indices.c (do_info_index_search): New function, extracted
+ from info_index_search.
+ (info_index_search): Simply call do_info_index_search() with
+ search_string set to NULL.
+ (index_entry_exists): New function.
+
+Sat Jul 5 17:17:14 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Document @kbdinputstyle.
+
+ * makeinfo/makeinfo.c (kbdinputstyle): New command.
+ (cm_no_op_line_arg): New function.
+
+ * info/termdep.h (HAVE_TERMIOS_H) [NeXT]: #undef.
+ From: Gregor Hoffleit <flight@mathi.uni-heidelberg.de> et al.
+
+Fri Jul 4 14:18:08 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/Makefile.am (EXTRA_DIST),
+ * util/Makefile.am (EXTRA_DIST),
+ * makeinfo/Makefile.am (EXTRA_DIST),
+ * lib/Makefile.am (EXTRA_DIST): Include README.
+
+ * doc/texinfo.texi (makeinfo options): Document --paragraph-indent
+ values more completely.
+ * makeinfo/makeinfo.c (set_paragraph_indent): Allow translated
+ asis or none, improve doc.
+ From ke.
+
+ * doc/Makefile.am (dist-info): New empty target so that we do not
+ distribute info files.
+ From Erick Branderhorst.
+
+ * doc/texinfo.texi (Invoking install-info): Document that the dir
+ file is created now if need be.
+ * Makefile.am (EXTRA_DIST): No longer need dir.
+ * util/install-info.c (ensure_dirfile_exists): New routine.
+ (main): Call it before trying to open dirfile for reading.
+
+ * doc/texinfo.texi: Document install-info --delete a little better.
+ * util/install-info.c: Set something_deleted when we delete a
+ normal line.
+ Bug from: Denis Kosygin <dkosygin@math.Princeton.EDU>.
+
+ * util/install-info.c: If no info dir entry, give warning and exit 0.
+
+Wed Jul 2 06:35:17 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in (ALL_LINGUAS): Add fr.
+
+ * makeinfo/makeinfo.h (insertion_type, insertion_type_names): Add
+ ifnot... entries. Alphabetize.
+
+Tue Jul 1 17:21:54 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (sort_index): Set defining_line and
+ input_filename so errors in index entries are reported at
+ the correct location. From rms.
+
+ * makeinfo/makeinfo.c (cm_ifnothtml, etc.): Routines for new
+ commands.
+
+Sun Jun 29 09:44:01 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Document new @ifnot... commands, etc.
+ * doc/texinfo.texi: Document @image, etc.
+
+Thu Jun 26 17:57:37 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_image): New routine for new command @image.
+ (cm_end): Move to better place, doesn't need its own page.
+ Doc fixes.
+
+Mon Jun 23 16:54:03 1997 Karl Berry <karl@cs.umb.edu>
+
+ * Makefile.am (SUBDIRS): Do intl first.
+
+ * doc/Makefile.am (EXTRA_DIST): Include epsf.tex.
+ (install-data-local): Suggest possible installation directory.
+ * epsf.tex: New file.
+
+Wed Jun 18 17:51:52 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Document texinfo.cnf.
+
+Sun Jun 15 14:37:58 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi (Command List): Various commands missing or
+ erroneous.
+ From: Karl_Heinz_Marbaise@p69.ks.fido.de.
+
+ * makeinfo/makeinfo.c: Oops, failed to break out of loop.
+
+ * util/texindex.c: Use <getopt.h> not "getopt.h".
+
+ * All source files: Merge gettext changes from Karl E.;
+ his ChangeLog entries below.
+
+Sat Jun 14 17:04:28 1997 Karl Berry <karl@cs.umb.edu>
+
+ * Makefile.am,
+ * makeinfo/Makefile.am: Doc fix.
+ * util/Makefile.am (EXTRA_DIST): Add texi2dvi. From Karl E.
+
+Fri Jun 13 17:39:34 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c [WIN32]: Handle read bogosity and c:\
+ absolute paths.
+ From: Eric Hanchrow <erich@MICROSOFT.com>.
+
+ * configure.in (AC_CHECK_HEADERS): Check for pwd.h.
+ * info/tilde.c (pwd.h): Move #include to system.h.
+
+ * makeinfo/makeinfo.c (main): New option -P to prepend to search path.
+ From: Kenneth Stailey <kstailey@cvs.openbsd.org>.
+
+ * doc/texinfo.texi (Invoking makeinfo),
+ * doc/makeinfo.texi: Mention -P.
+
+Thu Jun 12 16:25:40 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/signals.h (SIGCHLD): #define as SIGCLD if undefined, for sysV68.
+ From: "Philippe De Muyter" <phdm%labauto1@ulb.ac.be>.
+
+ * util/install-info.c (O_RDONLY): Remove this stuff, it's in system.h.
+ (main): Handle existing entry in dir file having .info extension.
+ From: "Bradley C. Kuszmaul" <bradley@GRANITE.SYSTEMSX.CS.YALE.EDU>.
+
+ * makeinfo/makeinfo.c (get_char_len): Don't count 8-bit characters
+ as two chars in the output.
+ From: Sung-Hyun Nam <namsh@amuna.rms.lgic.co.kr>.
+
+Wed Jun 11 16:36:51 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi (Other Info Directories): Document new trailing
+ : in INFOPATH feature.
+
+ * info/info.c (main): Have trailing : in INFOPATH expand to the
+ default path.
+
+Fri Jun 6 13:22:02 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi (uref): New node for new command.
+
+Thu Jun 5 18:13:48 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_uref): New function to accept optional
+ second argument. Call it in command table.
+
+Sat Jun 14 10:54:16 1997 Karl Eichwalder <ke@suse.de>
+
+ * mkinstalldirs: Update from automake-1.1p.
+
+ * configure.in: Touch po/ChangeLog (gettext needs it).
+
+Thu Jun 12 08:37:52 1997 Karl Eichwalder <ke@ke.Central.DE>
+
+ * util/texindex.c: Include system.h, remove config.h.
+
+ * po/POTFILES.in: Fill it.
+
+ * makeinfo/multi.c: Include system.h.
+
+ * info/Makefile.am:
+ * makeinfo/Makefile.am:
+ * util/Makefile.am:
+ (localedir): Set.
+ (INCLUDES): Add intl/ and LOCALEDIR.
+ (LDADD): Add @INTLLIBS@.
+
+ * makeinfo/makeinfo.c (main):
+ * util/texindex.c (main):
+ * util/install-info.c (main):
+ setlocale, bindtextdomain, and textdomain.
+
+ * lib/system.h: Include locale.h and libintl.h.
+
+ * acconfig.h: Include libintl.h.
+ (_, N_): Define.
+ Add ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_LC_MESSAGES,
+ HAVE_STPCPY for libintl.
+ Add @TOP@ and @BOTTOM@.
+
+ * configure.in (AM_GNU_GETTEXT): Add.
+ (AC_OUTPUT): Process Makefiles in intl/ and po/.
+ (ALL_LINGUAS): Available languages.
+
+ * Makefile.am (AUTOMAKE_OPTIONS): Now use 1.1p.
+
+Wed Jun 11 17:05:37 1997 Karl Eichwalder <ke@ke.Central.DE>
+
+ * Makefile.am (SUBDIRS): Add intl/ and po/ for NLS.
+
+ * run `gettextize -c' to get the i18n skeleton.
+
+Wed Jun 4 17:51:08 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (uref): New command, another alias for @code
+ for now.
+
+Wed Jun 4 02:02:33 1997 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * doc/texinfo.texi (email): { and } need @ escapes.
+
+Sun Jun 1 16:34:12 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi (itemx): @itemx should always follow @item.
+
+ * makeinfo/makeinfo.c (cm_item): Insert blank line if two
+ consecutive @item's.
+ From: Karl Eichwalder <ke@ke.central.de>.
+ Also various doc fixes.
+
+Tue May 27 17:20:44 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi (various): Document @deftypemethod.
+ (email): @ should have been @@ in the example.
+ From: Mate Wierdl <mw@wierdlmpc.msci.memphis.edu>
+
+Mon May 26 16:56:26 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/multi.c (setup_multitable_parameters): Avoid use of %n
+ for sake of m68k-hp-bsd.
+ From: Derek L Davies <ddavies@world.std.com>.
+
+ * info/terminal.c (terminal_begin_using_terminal,
+ terminal_end_using_terminal): Call fflush and sleep to handle
+ cmdtool/shelltool with scrollbars. Also ignore
+ SIGWINCH so we do not prematurely exit. Move call.
+ (terminal_prep_terminal): Disable LNEXT (CTRL-V).
+ From: strube@physik3.gwdg.de (Hans Werner Strube).
+
+ * configure.in (AC_TYPE_SIGNAL): Check this.
+
+Sun May 25 16:49:58 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (discard_insertions): Take arg saying
+ whether ifinfo/ifset/etc. are ok.
+ (convert_from_loaded_file): At `finished', call discard_insertions.
+ (handle_variable_internal): Complain if we reach eof before the
+ @end for a false condition.
+ From: HERBERT@boevm4.vnet.ibm.com.
+
+ * info/Makefile.am (ginfo_SOURCES): Add doc.h.
+ * lib/Makefile.am (libtxi_a_SOURCES): Add system.h.
+
+Sat May 24 18:08:27 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Check that we have macro_expansion_filename
+ before using strcmp.
+
+Thu May 22 17:59:46 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/makeinfo.texi: Minimally document --force.
+
+ * makeinfo/makeinfo.c (--force): New option.
+ (-E): Allow stdout via `-'.
+ (convert_from_loaded_file): Unlink output files if errors and !force.
+
+Tue May 20 17:48:42 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Change all strdup calls to xstrdup.
+ (xmalloc, xrealloc, memory_error): Remove these functions, they're
+ in lib.
+ (set_paragraph_indent, cm_paragraph_indent): Move to misc page.
+ (cm_footnote): Expand macros in the arg for the macro expansion output.
+
+Fri May 16 17:26:59 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_macro): Allocate an empty body if the
+ macro was empty.
+ (cm_unmacro): Allocate one more byte for the null.
+ From: Robert Hoehne <robert.hoehne@Mathematik.TU-Chemnitz.DE>.
+
+Sun May 11 17:51:21 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * makeinfo/makeinfo.c (cm_printindex): Fix calculation of the
+ length of an index line.
+
+Sun May 11 14:47:42 1997 Tom Tromey <tromey@cygnus.com>
+
+ * makeinfo/makeinfo.c (main): Don't unconditionally run usage when
+ -e specified.
+
+Sun May 11 17:47:42 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (init_indices): Free the source for an @synindex.
+ (undefindex): Do not go further if the target was already freed.
+ (free_index): Do not free the node names, as init_tags already did.
+ (cm_synindex, index_add_arg): Improve error message.
+ (program_index, function_index, etc.): Remove these unused #defines.
+
+Tue May 6 17:53:37 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (init_internals): Do not free current_node,
+ it already is, at least when multiple input files are specified.
+ From: Karl Eichwalder <ke@ke.central.de>.
+
+Mon May 5 16:14:39 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Mention both alignment and non-alignment of
+ continuation description lines in menus (Arnold).
+
+Sun Apr 27 16:12:44 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (apply): Handle body being `\string'.
+ Also, avoid dereferencing a null pointer when a macro has no named
+ parameters.
+ From: Eli Zaretskii <eliz@is.elta.co.il>.
+
+ * makeinfo/makeinfo.c: Wording changes/fixes in warnings.
+
+ * info/session.c (info_get_input_char): Do not mix stdio with raw I/O.
+ From: Egil Kvaleberg <egilk@sn.no>.
+
+ From Tom Hageman <tom@basil.icce.rug.nl>. These changes make
+ arrow keys work:
+ * info/infomap.c: Add arrow key bindings.
+ (keymap_bind_keyseq): New support function.
+ (initialize_info_keymaps): Use it.
+ (term_ku,term_kd,term_kl,term_kr): Remove explicit declarations;
+ use #include "terminal.h" instead.
+ * info/session.c (initialize_info_session): Unbuffer stdin.
+ (info_get_another_input_char): Fix bug in `ready' logic.
+ * info/terminal.h,
+ * info/terminal.c (term_kP, term_kN): New variables to hold
+ PageUp, PageDown key sequences.
+ (terminal_initialize_terminal): Set them.
+
+ * util/texindex.c (main),
+ * util/install-info.c (main),
+ * makeinfo/makeinfo.c (print_version_info),
+ * info/info.c (main): Use PACKAGE and VERSION from Automake for
+ printing version number.
+
+Sat Apr 26 19:19:46 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (get_until_in_line): Do not expand if
+ executing_string.
+ Also, free temporary strings.
+ Also, untabify entire file.
+
+ * doc/texinfo.texi: Many corrections from Arnold.
+
+Thu Apr 24 16:31:09 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/multi.c (draw_horizontal_separator): Account for indent
+ here also. From Ulrich.
+
+Wed Apr 23 15:15:34 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_today): Use time_t instead of long;
+ everyone else does.
+ (LOCALTIME_CAST): Remove kludge, we'll always use time_t now.
+
+ * info/Makefile.am (ginfo_SOURCES): Remove general.h, that got
+ merged into system.h.
+
+Mon Apr 21 17:13:25 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/multi.c (output_multitable_row): Account for
+ column_indent, both the global one and for each column.
+ (setup_multitable_parameters): Account for column_indent in the table
+ width in the columnfrac case, but don't bother with the template
+ case for now.
+
+Sun Apr 20 16:32:00 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (output_stream): Remove redundant
+ definition; it's in makeinfo.h,
+ and a vaxstation-ultrix4.3 fails to link because of the two defns.
+ From: Anders Olofsson <anders@kid025.ericsson.se>.
+
+ * makeinfo/makeinfo.c (expansion): Inhibit appending to the macro
+ expansion stream.
+ (get_until_in_line): Possibly expand the text.
+ Change caller in get_node_token to do the expansion,
+ all other calls to remain the same.
+
+ * makeinfo/makeinfo.c (cm_node): No need to call strlen to check
+ for the empty string.
+
+ * doc/texinfo.texi: Restore missing @c for initial comment.
+
+Fri Apr 18 17:41:36 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Mention that .info is unnecessary in the info
+ file name argument of an xref.
+
+ * doc/texinfo.texi: Mention texi2dvi -t instead of embedding
+ @smallbook or @afourpaper in the document source.
+
+Sun Apr 13 15:19:08 1997 Karl Berry <karl@cs.umb.edu>
+
+ * lib/system.h (_GNU_SOURCE): #define.
+
+Mon Apr 7 16:30:11 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/info.texi,
+ * doc/info-stnd.texi,
+ * doc/texinfo.texi: Do not make (dir) the previous ptr from the top node,
+ and tell people not to do that in the manual.
+ From: rmedina@kanojo.ivic.ve (Rodrigo Medina),
+ confirmed by rms.
+
+Fri Apr 4 16:30:33 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Move error page to top to avoid
+ prototypes, and do add prototypes for add_word_args and execute_string,
+ so we can use <stdarg.h>.
+
+ * info/makedoc.c,
+ * info/nodemenu.c: Use %ld instead of %d for file offsets.
+ * makeinfo/makeinfo.c (delete_macro): Decrement macro_list_len.
+ (get_macro_args): Decrement line number if see \n.
+ * utils/texindex.c (indexify): Use fputs instead of fprintf
+ for constant string.
+ From: Eli Zaretskii <eliz@is.elta.co.il>.
+
+Thu Apr 3 17:40:52 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in (AC_CHECK_HEADERS): No need to check for vararg.h
+ here, AC_FUNC_VPRINTF does it.
+ (AC_CHECK_FUNCS): Likewise for vsprintf and vfprintf.
+ * makeinfo/makeinfo.c (add_word_args, execute_string): Rewrite
+ like the error functions.
+
+Wed Apr 2 17:46:28 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in: Add AC_FUNC_VPRINTF.
+ * makeinfo/makeinfo.c (error, line_error, warning): Rewrite a la
+ error.c from the *utils to use <stdarg.h> if available.
+
+Tue Apr 1 11:48:40 1997 Karl Berry <karl@cs.umb.edu>
+
+ * doc/texinfo.texi: Tabs are a bad idea.
+
+ * doc/userdoc.texi,
+ * doc/info.texi: Untabify.
+
+Sun Mar 30 17:36:47 1997 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (end_of_sentence_p): New function.
+ (add_char): Call it, instead of simply sentence_ender.
+ (post_sentence): New macro.
+ Also, remove some #include's now in system.h.
+ * lib/system.h [VMS]: #include <perror.h>, from makeinfo.
+
+Thu Mar 27 17:41:03 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/search.c (skip_node_characters): Do not arbitrarily
+ strip trailing period from end of node name; this is valid.
+
+Mon Mar 24 16:44:42 1997 Karl Berry <karl@cs.umb.edu>
+
+ * configure.in (AC_OUTPUT): Don't need to create stamp-h here,
+ tromey says AM_CONFIG_HEADER will do it.
+
+ * info/Makefile.am, util/Makefile.am, makeinfo/Makefile.am (INCLUDES):
+ Don't need -I.. (for config.h) or -I$(srcdir), says tromey.
+ Automake includes those already.
+
+Fri Mar 14 15:05:17 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/Makefile.am: Build as ginfo, install as info,
+ to avoid conflict with the standard info target.
+
+ * lib/system.h: New file.
+ * makeinfo/makeinfo.c (strerror): Remove declaration,
+ include system.h, remove other redundant #if stuff.
+ * info/general.h: Include system.h instead of doing common stuff.
+ * util/install-info.c (my_strerror): Remove this, use strerror,
+ include system.h.
+
+ * info/terminal.c (terminal_prep_terminal): Only use OCRNL and
+ ONLCR if they are defined. Reported by many people.
+
+ * Installed:
+
+ Sun Dec 1 19:23:54 1996 Karl Eichwalder <ke@ke.Central.DE>
+
+ * configure.in (TERMLIBS): Add ncurses.
+
+Thu Mar 13 13:59:45 1997 Karl Berry <karl@cs.umb.edu>
+
+ * lib/Makefile.am (libtxi_a_SOURCES): Add xstrdup.c.
+ * info/*.c: Use xstrdup instead of strdup everywhere.
+
+ * info/tilde.c: Do not include clib.h, move stdlib.h include to
+ * info/general.h: here.
+
+ * configure.in (AC_CONFIG_HEADER): Use this,
+ to avoid hugely long compile line with all the -D's.
+ * info/general.h: Include <config.h>.
+
+ * emacs/Makefile.am (install, install-data): Do @echo
+ to tell the user to compile/install the elisp manually.
+
+ * configure.in (AC_REPLACE_FUNCS): Move strerror check to here.
+ (AC_CHECK_FUNCS): From here.
+
+ * lib/strerror.c: New file, from enscript (et al.) distribution.
+
+Tue Mar 11 16:36:25 1997 Karl Berry <karl@cs.umb.edu>
+
+ * info/Makefile.am (info_SOURCES): Add doc.c, dribble.c, infodoc.c.
+ (LDADD): Add @TERMLIBS@.
+
+ * info/info.h: HANDLE_MAN_PAGES, NAMED_FUNCTIONS: Define these.
+
+ * info/filesys.h: Spurious ! when DEFAULT_INFOPATH is not defined.
+
+ * configure.in (AC_OUTPUT): Do lib first and doc last.
+
+ * info/echo-area.c,
+ * info/echo-area.h,
+ * info/info.h: Rename echo_area to echo-area.
+
+Mon Mar 10 17:59:05 1997 Karl Berry <karl@cs.umb.edu>
+
+ * */Makefile.am: Write Makefile.am files for Automake.
+ * doc: New subdirectory, move all manuals and texinfo.tex there.
+ * AUTHORS, THANKS, config.guess, config.sub, mkinstalldirs: New files,
+ required by Automake.
+ * lib/xmalloc.c: Move from info/.
+
+Fri Oct 4 07:49:49 1996 Karl Berry <karl@cs.umb.edu>
+
+ * Version 3.9.
+
+ * Makefile.in (install): Say to install texinfo.tex manually.
+
+ * util/texi2dvi,
+ * util/texindex.c,
+ * makeinfo/makeinfo.c,
+ * info/info.c: Include only the current year in the copyright message.
+
+ * util/texi2dvi: Exit successfully.
+ From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
+
+Thu Oct 3 12:58:32 1996 Karl Berry <karl@cs.umb.edu>
+
+ * Rename install.sh to the preferred install-sh.
+
+ * Makefile.in (VERSION),
+ * util/texi2dvi,
+ * util/texindex.c,
+ * util/install-info.c,
+ * makeinfo/makeinfo.c (minor_version, print_version_info),
+ * info/info.c: Update version number.
+
+ * util/texi2dvi: Only show diff if verbose.
+
+ * util/install-info.c (main): Check for a missing dir file as well
+ as a missing info files.
+ (main): At start of a node, completely initialize the newly-malloced
+ node structure.
+
+ * texinfo.texi: Fix incorrect uses of @key,
+ insert missing newline in Installing Dir Entries' @menu item,
+ document install-info invocation.
+
+ * Makefile.in (DISTFILES): Do not put .gdbinit's in distribution.
+ (dist): Use || instead of && (and invert sense) so make doesn't think
+ the command failed.
+ (dist): Exclude more junk.
+
+ * makeinfo/makeinfo.c (cm_xref): Back out patch from Tom T., since
+ we generate a good-enough error message that is suppressible
+ without it.
+
+ * util/gen-dir-node: The recommended name for the top-level info
+ file is dir, not dir.info.
+
+ * util/install-info.c (main): At `Mark the end of the Top node',
+ make sure the node name is non-NULL before comparing it. From
+ lvirden@cas.org.
+
+ * configure.in (AC_REPLACE_FUNCS): Use this for memcpy, memmove,
+ and strdup.
+ (AC_CHECK_FUNCS): Instead of this.
+ Because both bcopy and memmove are missing on the 3b2, as reported by
+ Gaylen Miller <gaylen@proaxis.com>, hence we must provide our own.
+ * libtxi/Makefile.in (LIBOBJS): New variable.
+ (OBJS): Include it.
+ * libtxi/memcpy.c, libtxi/memmove.c, libtxi/strdup.c: New files,
+ taken from fileutils 3.13.
+ * makeinfo/makeinfo.c,
+ * info/clib.c (strdup): Move to libtxi.
+
+Wed Oct 2 18:23:30 1996 Karl Berry <karl@cs.umb.edu>
+
+ * info/info-utils.h (memcpy) [!HAVE_MEMCPY],
+ * info/termdep.h (memcpy) [!HAVE_MEMCPY],
+ * makeinfo/makeinfo.c (memmove) [!HAVE_MEMMOVE]: Remove this
+ #ifdef, as we now include it in libtxi if missing.
+
+Tue Oct 1 17:41:52 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/Makefile.in (install),
+ * info/Makefile.in (install),
+ * Makefile.in (install): Use new option name --info-dir instead of
+ --infodir.
+
+ * makeinfo/multi.c (out_char): New fn. Replace all calls to
+ putc/fprintf with calls to this.
+
+ * util/install-info.c: Rename --infodir to info-dir.
+
+Mon Sep 30 10:07:21 1996 Karl Berry <karl@cs.umb.edu>
+
+ * Version 3.8.
+
+ * texinfo.tex: Untabify.
+
+ * texinfo.tex (\ptexl, \ptexL): Do not save, we have our own
+ commands now.
+ (\onepageout): Reformat for readability, and call \indexdummies
+ to avoid expansion of Texinfo commands (e.g., accents) in \write's.
+ (\,, \dotaccent, \ringaccent, \tieaccent, \ubaraccent, udotaccent,
+ \questiondown, \exclamdown, \dotless): New macros.
+ (\l): Let plain TeX definition remain, instead of switching
+ to ``lisp'' font.
+ (\multitable): Ensure space between the columns,
+ insert struts to make interline spacing constant,
+ use real strut instead of a box containing `Xy'.
+ (\indexdummies): Do not define \rm, \char, but
+ do define \@, \{, \}, \dotless, and \,. And \t should generate
+ \t, not \r.
+ (\indexnofonts): Define \, and \dotless as \indexdummyfont,
+ and let \@ be @.
+ (\doind): Reformat for readability, and use temp control sequence
+ names that actually make sense.
+ (\doublecolumnout, \pagesofar, \enddoublecolumns): Restore
+ Knuth's original code to avoid spurious overfull vbox messages.
+ (No boxes are actually overfull).
+ (\shortcontents): Do not allow hyphenations.
+ (\dochapentry, \tocentry): Make glue above and below flexible, to allow
+ better page breaks.
+ (\tex): Reset \, to its plain TeX meaning,
+ and do not reset \l.
+
+ * COPYING: Update for new FSF address (from gcc dist).
+
+ * libtxi/Makefile.in: Various simplifications.
+
+Sun Sep 29 12:58:44 1996 Karl Berry <karl@cs.umb.edu>
+
+ * util/texi2dvi: Use $progname instead of $0 for --version.
+
+ * util/install-info.c (xmalloc, xrealloc): Declare malloc and
+ realloc as returning void *,
+ to avoid ptr/int problems on Digital Unix.
+
+ * info/tilde.c (tilde_expand_word): Declare getenv as returning char *,
+ to avoid warning on Digital Unix.
+
+ * makeinfo/multi.c (multitable_active): Declare extern here to
+ avoid ld warning on rs6000.
+
+ * util/texindex.c (usage): Avoid ??' trigraph.
+
+ * util/install-info.c: Include <sys/fcntl.h> or <fnctl.h>,
+ according to HAVE_SYS_FCNTL_H,
+ and only include <sys/file.h> if HAVE_SYS_FILE_H.
+ (readlines): Oops, had NULL's and 0's reversed for ptr/int members.
+
+ * info/terminal.c (terminal_goto_xy): Remove spurious extra ;.
+
+ * util/install-info.c: Untabify. (input_sections): Initialize.
+ (find_lines): Initialize the terminating element of the array.
+ (print_help): Document --infodir.
+ (main): Compare the basename of infile sans .info to the dir entry,
+ not infile itself.
+ * util/Makefile.in (clean): Remove the install-info binary.
+
+ * info/Makefile.in (distclean): Remove *.info* files.
+
+ * Makefile.in (install),
+ * info/Makefile.in (install),
+ * makeinfo/Makefile.in (install): Use --infodir instead of --info-file.
+
+ * info/info.c,
+ * makeinfo/makeinfo.c: Avoid newlines in string constants for the
+ sake of SunOS cc.
+
+ * makeinfo/multi.c: Do not assume ANSI C.
+
+ * info/info.texi: Oops, need @end vtable for a @vtable.
+
+Sat Sep 28 16:31:28 1996 Karl Berry <karl@cs.umb.edu>
+
+ * Makefile.in (texinfo): Do not depend on sub-all, as then
+ makeinfo is always run. Instead, depend on texinfo.texi.
+
+ * makeinfo/Makefile.in (info, dvi): New targets.
+ makeinfo.info, makeinfo.dvi: Do not depend on macro.texi for now.
+
+ * info/Makefile.in (install): Must call install-info twice.
+
+ * info/info-stnd.texi,
+ * info/info.texi,
+ * makeinfo/makeinfo.texi: Include direntry.
+
+ * emacs/Makefile.in: Use && after cd, etc.
+
+ * texinfo.texi: Kludges so makeinfo -E will not create spurious
+ differences. Add new direntries.
+
+ * util/install-info.c,
+ * util/texindex.c,
+ * makeinfo/makeinfo.c,
+ * info/info.c: Standardize --version output.
+
+ * makeinfo/makeinfo.c (defun_internal): Don't insert index command
+ if expanding macros.
+ (cm_footnotestyle): Don't change the footnote style if it was set
+ on the command line.
+
+ * util/texi2dvi: Recompute original index files each time through loop.
+ Make indentation uniform.
+ Use same basename for the temp input files.
+ Standardize --version output.
+
+ * info/Makefile.in (install),
+ * makeinfo/Makefile.in (install): Insert $(POST_INSTALL).
+
+Fri Sep 27 13:27:30 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi (Format with texi2dvi): Rewrite now that the script
+ runs in a loop.
+
+ * info/Makefile.in (MAKEINFO): Simplify to ../makeinfo/makeinfo.
+
+Fri Sep 27 00:26:03 1996 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * info/terminal.c [HAVE_TERMIOS_H] (terminal_prep_terminal,
+ terminal_unprep_terminal): Add code for termios.
+ [HAVE_TERMIOS_H] (original_termios, ttybuff): New variables.
+ * info/termdep.h: [HAVE_TERMIOS_H]: Add include of <termios.h>.
+ * configure.in: Add check for <termios.h>.
+
+Thu Sep 26 10:46:34 1996 Karl Berry <karl@cs.umb.edu>
+
+ * emacs/texnfo-upd.el,
+ * emacs/texinfo.el,
+ * emacs/texinfmt.el: Update from bob for new Texinfo commands, etc.
+
+ * emacs/info.el, emacs/informat.el, emacs/makeinfo.el,
+ emacs/texnfo-tex.el: Update from Emacs 19.34 dist.
+
+ * emacs/elisp-comp: Use TMPDIR if set.
+
+ * util/Makefile.in (libdir): Remove.
+
+ * makeinfo/Makefile.in (install),
+ * Makefile.in (install),
+ * info/Makefile.in (install): Run install-info.
+ (libdir): Remove.
+
+ * texinfo.texi: Various fixes as I make this go through TeX.
+
+ * util/install-info.c: Quote newlines in help message.
+
+ * util/texi2dvi (texi2dvi): Run TeX until the aux/index files
+ stabilize, instead of just twice. From: David Shaw
+ <daves@gsms01.alcatel.com.au>.
+
+Tue Sep 24 14:43:03 1996 Karl Berry <karl@cs.umb.edu>
+
+ * dir: Blank dir file for installation on new systems.
+
+Mon Sep 23 12:18:43 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (args_from_string): Do not back up at a };
+ that leads to an infinite loop.
+
+Sat Sep 21 17:48:04 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_xref): Do not seg fault if outside of
+ any node. From: Tom Tromey <tromey@creche.cygnus.com>.
+ (cm_ctrl): Make obsolete.
+
+Tue Sep 17 13:30:08 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\inforef): Move to more appropriate place.
+ (\pounds): Remove spurious extra $.
+ (\email): Typeset argument in angle brackets.
+ (\macro): Use \doignore for robustness, instead of just letting TeX
+ parse the argument.
+ (\unmacro): Define.
+
+Sat Sep 14 16:17:35 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi: Document multitables, new ISBN number.
+
+Wed Sep 11 18:01:24 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/multi.c (struct env): Remove unused output_position
+ field; this needs to be global.
+ (setup_multitable_parameters): Implement template-defined multitables.
+ (output_multitable_row): Remove trailing whitespace.
+
+ * makeinfo/makeinfo.c (_READ_BUFFER_GROWTH, struct _defines):
+ Remove leading underscore for POSIX/ANSI pedants.
+ (init_conversion): Initialize output_position here.
+ (init_paragraph): Instead of here, where it loses with the
+ multitable calls, eventually resulting in negative counts to the
+ write call when the output file is split.
+
+ * texinfo.texi: First cut at macro documentation.
+ Change accent doc to use tables.
+ Remove whitespace experiments, they are now the default.
+
+Mon Sep 9 14:16:24 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c: Use putc instead of fprintf where possible.
+ (cm_accent): Put _ from @ubaraccent after argument.
+
+ * util/texindex.c (strerror) [!strerror]: Conditionalize
+ declaration.
+
+Sat Sep 7 14:13:24 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (commandTable): Obsolete @setchapterstyle.
+
+Thu Sep 5 15:45:11 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): Oops, fix
+ wording of initial output comment.
+
+ * makeinfo/makeinfo.c (cm_angle_brackets): Rename from cm_key.
+ (commandTable): @email should produce angle brackets.
+ @key: Change name.
+
+Tue Sep 3 14:52:17 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\hsize): Decrease.
+ (\hoffset): Increase.
+ (\setleading): Decrease dramatically.
+ This change affects 8.5x11 format only.
+
+ * texinfo.texi: Document accent commands.
+
+Mon Sep 2 11:10:49 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (commandTable): Deprecate @ichapter and
+ @titlespec.
+ Move all the deprecated @i<section> commands to the end of the list.
+
+ * texinfo.texi: Document @pounds{} and @centerchap{}.
+
+ * texinfo.tex (\centerchfplain): Rewrite to use \chfplain, and to
+ actually center.
+ (\unnchfplain): Just call \chfplain.
+ (\chfplain): Rewrite to be generally callable.
+ (\centerparametersmaybe): Hook, a no-op except with @centerchap.
+
+Sun Sep 1 15:01:49 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi: Document @<whitespace>, rearrange spacing section.
+
+ * makeinfo.c (commandTable): Make @. @? @! insert themselves,
+ not be sentence-non-enders. They are sentence *enders*. Also,
+ make @\t and @\n insert a normal space character, not themselves.
+ Also, define @hyphenation.
+ (insert_space): New function.
+ (cm_ignore_sentence_ender): Remove this.
+ (flush_output): Check only for META-SPC, not META-<sentence-ender>.
+
+Fri Aug 30 18:55:30 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi: Document @- and @hyphenation{}.
+ Miscellanous fixes.
+
+ * makeinfo/makeinfo.c (commandTable): Define @- as cm_no_op, since
+ makeinfo doesn't do hyphenation.
+
+Thu Aug 29 13:05:38 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\key): Do not uppercase the argument; key names
+ can be mixed case, e.g., `Control'.
+
+ * makeinfo/makeinfo.c: @infotop, @infounnumbered,
+ @infounnumberedsec, @infounnumberedsubsec,
+ @infounnumberedsubsubsec, @infoappendix, @infoappendixsec,
+ @infoappendixsubsec, @infoappendixsubsubsec, @infochapter,
+ @infosection, @infosubsection, @infosubsubsection:
+ Remove these long-since obsolete commands.
+ @iappendix, @iappendixsection, @iappendixsec, @iappendixsubsec,
+ @iappendixsubsubsec, @ichapter, @isection, @isubsection,
+ @isubsubsection, @iunnumbered, @iunnumberedsec, @iunnumberedsubsec,
+ @iunnumberedsubsubsec:
+ Deprecate these.
+ @infoinclude:
+ Obsolete this.
+ @,: Have to take an argument, since have to do @,{c} not c@,; can't
+ feasibly implement the latter in TeX.
+
+ * makeinfo/makeinfo.c: Rename @d to @udotaccent, since this is
+ relatively infrequently used.
+
+Tue Aug 27 14:58:56 1996 Karl Berry <karl@cs.umb.edu>
+
+ * info/info.c (print_short_help),
+ * util/install-info.c (print_help),
+ * util/texi2dvi,
+ * makeinfo/makeinfo.c (usage) Include bug reporting address.
+
+Mon Aug 26 15:27:17 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (commandTable): Remove @input, @medbreak,
+ @smallbreak, @overfullrule, @br.
+
+Sun Aug 25 17:25:48 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (commandTable): Unify commands that perform
+ the same operation, such as cm_file, cm_samp, cm_email,
+ etc., which all do cm_code.
+
+ * texinfo.texi: Document @ifhtml ... @end ifhtml. Change
+ `PlainTeX' to `plain TeX'.
+
+Fri Aug 23 16:03:16 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\pounds): New Texinfo command @pounds{}.
+ (\parskip): New smaller value.
+ (\chapheadingskip, \secheadingskip, \subsecheadingskip): New smaller
+ values, both for 8.5x11 and @smallbook formats. From Bob.
+
+ * makeinfo/makeinfo.c (cm_special_char): @pounds{} prints a #.
+ (commandTable): Add new command @pounds.
+
+Tue Aug 20 13:47:20 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (CommandTable): Restore "!", accidentally
+ removed previously.
+
+ * texinfo.tex (\key): Typeset a lozenge around the argument (from
+ gildea@intouchsys.com).
+ * makeinfo/makeinfo.c (cm_key): Surround arg with <...> to match
+ new lozenge style in TeX.
+
+Wed Aug 14 16:59:23 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi: Propagate change from rms.
+
+Tue Aug 13 11:33:27 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi: Propagate change from rms.
+
+ * texinfo.texi: Document other @headings options.
+
+Sun Aug 11 13:19:42 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (cm_accent, cm_special_char, cm_dotless):
+ New functions.
+ (CommandTable): Add new commands for all of plain.tex's
+ accents and non-English characters.
+
+Fri Aug 9 14:12:07 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): Say we're making
+ ``text'' file if no_headers. Also, use `input_filename' instead
+ of just `name' for clarity.
+ (suffixes): Check for no suffix last, i.e., prefer `foo.texi' as an
+ input file to `foo'. (The latter is probably a binary.)
+
+Mon Aug 5 13:52:39 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\heading, \subheading, \subsubheading): Can no
+ longer call the nonexistent \*secheadingi series. Instead, call
+ \plain*secheading.
+ (\plainsubsecheading, \plainsubsubsecheading): New macros, by analogy
+ with \plainsecheading.
+ (\unnumberedsubseczzz, \unnumberedsubsubseczzz): Call them.
+
+Sun Aug 4 16:46:10 1996 Karl Berry <karl@cs.umb.edu>
+
+ * makeinfo/makeinfo.c (flush_output): Mask out eighth bit, that we
+ turned on in non-sentence enders.
+
+Sat Aug 3 14:03:10 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\HEADINGSdouble, \HEADINGSsingle,
+ HEADINGSdoubleafter, \HEADINGSsingleafter, \CHAPPAGoff,
+ \CHAPPAGon, \CHAPPAGodd): Set \contentsalignmacro, analogous to
+ \pagealignmacro.
+ (\startcontents): Call \contentsalignmacro instead of \pagealignmacro.
+
+Mon Jul 29 14:44:33 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\indexfonts): Make leading be 12pt. Otherwise, it's
+ too crammed.
+ (\smalllispx): Remove \setleading{10pt}. That was too small.
+ (\doprintindex): Do not call \tex ... \Etex. Index files are Texinfo
+ source, not TeX source, except for using \ instead of @ as the
+ escape character (for now).
+
+Sun Jul 28 13:37:05 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (paragraphindent): Move to more reasonable place in
+ the source file.
+ (chapfonts, secfonts, subsecfonts, indexfonts): Call \setleading.
+ (\chfplain, \secheading, \plainsecheading, \subsecheading,
+ \subsubheading): Rewrite to properly \hangindent the title.
+ (\sectionheading): New generic macro to print section titles.
+
+ * texinfo.texi: Update the `Obtaining TeX' node.
+
+Fri Jul 26 14:11:48 1996 Karl Berry <karl@cs.umb.edu>
+
+ * util/texi2dvi: Do macro expansion with makeinfo before running TeX.
+ Various expansion safety measures added for test; avoid use of -o.
+
+ * makeinfo/makeinfo.c (usage): More usage message tweaks.
+
+Fri Jul 26 11:55:37 1996 Karl Berry <karl@laurie>
+
+ * util/texi2dvi: Format usage message to conform to the other *utils.
+
+Thu Jul 25 17:05:47 1996 Karl Berry <karl@cs.umb.edu>
+
+ * emacs/Makefile.in: Do not compile the Elisp by default. We
+ don't install it, so it confuses people to compile it.
+
+Sun Jul 21 07:20:09 1996 Karl Berry <karl@cs.umb.edu>
+
+ * util/Makefile.in (install-info): Dependency should be
+ install-info.o, not install-info. Also, update copyright years.
+
+ * makeinfo/makeinfo.c (cm_printindex): Don't call execute_string
+ to print index entries, we've already done the expansion now.
+
+ * makeinfo/makeinfo.h: Add copyright. Finish merge of rms changes.
+ * makeinfo/makeinfo.c: Finish merge, add my expansion changes again.
+ * makeinfo/multi.c: Add copyright message.
+
+Fri Jul 19 10:35:22 1996 Karl Berry <karl@cs.umb.edu>
+
+ * info/info.c: Update copyright date.
+
+ * info/info.texi,
+ * util/install-info.c,
+ * emacs/Makefile.in,
+ * emacs/texnfo-tex.el,
+ * emacs/Makefile.in: Change FSF address.
+
+ * Merged changes from bfox -- below, plus multitable changes, plus
+ lots more.
+
+ Sun Apr 14 08:49:50 1996 Brian J. Fox <bfox@nirvana.samsara.com>
+
+ * makeinfo/makeinfo.c (remember_node_reference): Numerous commands
+ call remember_node_reference. If a node has not yet been defined,
+ use the empty string as the current node for those cases.
+
+ Mon Feb 12 17:35:38 1996 Brian J. Fox <bfox@nirvana.samsara.com>
+
+ * makeinfo/makeinfo.c (push_node_filename): Clean up calls to
+ xmalloc and xrealloc. Only have to call xrealloc.
+
+ Fri Jan 26 08:00:38 1996 Brian J. Fox <bfox@nirvana.samsara.com>
+
+ * info/session.c (info_input_buffer_space_available): Fix typo
+ which forced the limitation of the sizeof (int) instead of sizeof
+ (buffer).
+
+ * Makefile.in (PACKVER): now at 3.8. Add TERMIOS support to
+ Info. Minor bugs fixed in Makeinfo.
+
+Sat Jul 13 11:58:57 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.texi (ftable vtable): Mention example.
+
+Sun Jun 30 14:59:51 1996 Karl Berry <karl@goldman.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_email): New function for new @email command.
+ * texinfo.texi (email): New node documenting it.
+
+Wed Apr 17 18:07:34 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_kbd): Do nothing if in @example or @code.
+ (struct brace_element): New field in_fixed_with_font.
+ (remember_brace_1): Save in_fixed_with_font.
+ (pop_and_call_brace): Restore in_fixed_with_font.
+ (cm_code): Don't decrement in_fixed_with_font at end of construct.
+ (struct istack_elt): New field in_fixed_with_font.
+ (push_insertion, pop_insertion): Save and restore in_fixed_with_font.
+ (end_insertion): Don't decrement in_fixed_with_font here.
+ (not_fixed_width): New function.
+ (cm_sc, cm_var, cm_italic, cm_roman, cm_titlefont):
+ Use not_fixed_width.
+
+Sat Apr 13 23:22:05 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * util/install-info.c (main): Fatal error if no input file spec'd.
+ Look for START-INFO-DIR-ENTRY, not BEGIN-INFO-DIR-ENTRY.
+
+Thu Apr 11 18:21:50 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_enddots): New function.
+ (self_delimiting): Accept -, ^ and ".
+ (CommandTable): Add commands -, ^, ", enddots, centerchap.
+
+Sun Mar 24 12:18:32 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (enum insertion_type): Add `direntry'.
+ (insertion_type_names): Add "direntry".
+ (cm_dircategory): New function.
+ (cm_direntry): New function.
+ (CommandTable): Add "dircategory" and "direntry".
+ (insert_string): New function.
+ (end_insertion): Handle direntry.
+ (begin_insertion): Handle direntry.
+
+Sun Mar 24 11:10:05 1996 Karl Berry <karl@spiff.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_url): New function for new @url command.
+
+Fri Feb 23 21:14:40 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * info/Makefile.in (install, uninstall): Use manprefix.
+
+Fri Feb 23 19:50:18 1996 Richard Stallman <rms@whiz-bang.gnu.ai.mit.edu>
+
+ * util/Makefile.in (install-info, install-info.o): New targets.
+ (all): Depend on install-info.
+ (install, uninstall): Operate on install-info.
+
+ * install-info.c: New file.
+
+Wed Jan 3 10:01:45 1996 Brian J. Fox <bfox@nirvana.datawave.net>
+
+ * makeinfo/makeinfo.c (make_index_entries_unique): Be a little bit
+ stricter about what makes two index entries identical.
+
+Fri Dec 29 13:00:24 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * makeinfo/makeinfo.c (Whole File): Add @detailmenu for allowing
+ detailed menu listings to appear while still defaulting nodes.
+
+Wed Dec 27 13:54:30 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_code): Always notice that we are in
+ fixed_width_font, even if other formatting changes are not to take
+ place.
+
+Sat Dec 23 11:48:43 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * info/man.c: (clean_manpage) Remove ^L's from page.
+
+ * makeinfo/makeinfo.c (get_brace_args): Change some memcpy's to
+ memmoves.
+
+ * info/info.c (main): Prefer caseless matches over partial
+ matches.
+
+ * Makefile.in (All Subdir Targets): Change suggested by Debian
+ people which allows errors in recursive makes to kill the
+ top-level make.
+
+ * makeinfo/Makefile.in (makeinfo.dvi): New target.
+
+ * info/info.c (main): Print version of containing texinfo package.
+
+ * makeinfo/makeinfo.c (flush_output): Don't strip high-bit from
+ sentence_enders.
+ Print the version number of the containing texinfo package.
+
+ * info/man.c (locate_manpage_xref): Count the 0th entry.
+
+ * makeinfo/makeinfo.c (cm_menu): If a menu is seen before a node
+ has been defined, warn, and create the node `Top'.
+
+Wed Jun 21 03:19:39 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_infoinclude): Clean up after printing
+ error if the file couldn't be included.
+ (discard_braces): Print errors only for those unmatched open
+ braces that belong to a texinfo command.
+
+ * */Makefile.in: Use @CFLAGS@ and @LDFLAGS@.
+
+ * makeinfo/makeinfo.c: End `node_search_string' and friends with a
+ terminating null character.
+
+Wed Jun 21 01:23:49 1995 Jim Meyering (meyering@comco.com)
+
+ * makeinfo/makeinfo.c: Close comment after #endif.
+
+Tue Jun 20 04:58:26 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * emacs/Makefile.in (install): Fix typo: "fle" -> "file".
+
+ * Makefile.in (VERSION): Bump to 3.6
+
+ * info/clib.c: Include general.h for `info_toupper' and friends.
+
+ * info/clib.h: strncmp and strncascmp return an int. What kind of
+ drugs was I on?
+
+Mon Jun 19 23:34:47 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (make_index_entries_unique): Copy the last
+ index entry.
+
+Mon Jun 19 21:55:49 1995 Noah Friedman <friedman@prep.ai.mit.edu>
+
+ * util/texi2dvi (--version): New option.
+ Cosmetic changes.
+
+Mon Jun 19 16:06:40 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c (cm_macro): Fix typo. `x != y' is not the
+ same as `x |= y'.
+
+ * info/Makefile.in (exec_prefix): Use @exec_prefix@ not $(prefix).
+ * makeinfo/Makefile.in (exec_prefix): Use @exec_prefix@ not $(prefix).
+ * util/Makefile.in (exec_prefix): Use @exec_prefix@ not $(prefix).
+ * libtxi/Makefile.in (exec_prefix): Use @exec_prefix@ not $(prefix).
+
+ * emacs/Makefile.in (uninstall): New target.
+ (install): Use the definition of $(lispdir), don't dynamically
+ find it. Use INSTALL_DATA not cp.
+ (exec_prefix): use @exec_prefix@ not $(prefix).
+
+ * makeinfo/makeinfo.c (apply): If there isn't an actual argument
+ for a named argument, default it to "".
+
+ * Makefile.in (VERSION): Now at 3.5.
+ (texinfo): Make ./makeinfo/makeinfo depend on sub-all for parallel
+ makes.
+
+ * emacs/Makefile.in (ELISP_OBJS): Explictly declare .el and .elc
+ in the SUFFIXES list.
+
+ * makeinfo/makeinfo.c (cm_today): Special case for losing alpha.
+ * (minor_version): Increase to 63.
+
+ * info/info.c (version_string): Now at 2.14.
+ * info/tilde.c: Declare getenv to return (char *).
+ * info/window.c (build_message_buffer): Jump through hoops to keep
+ DEC Alpha's happy.
+
+ * info/xmalloc.c: Declare malloc and realloc as (void *) returning
+ functions.
+
+Sun Jun 18 12:47:21 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * emacs/detexinfo.el (detexinfo-line-cmds-without-arg):
+ Handle ifhtml.
+
+Fri Jun 16 13:48:14 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * util/texindex.c: Update TEXINDEX_VERSION_STRING for texinfo 3.4
+
+ * (All *.c *.h *.in): Change FSF old address to new.
+ * texinfo.texi (Obtaining TeX): Change FSF old address to new
+ address. Change Old phone numbers to new phone numbers.
+
+ * Makefile.in (VERSION): Change to 3.4.
+
+Thu Jun 15 22:49:07 1995 Robert J. Chassell <bob@hill.gnu.ai.mit.edu>
+
+ * texinfo.texi, emacs/=development/cover.texi: update
+ Texinfo distribution package version number
+
+Thu Jun 15 09:23:02 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * info/info.c: (minor_version): Set to 13.
+
+ * info/clib.c,h: New files gather together replacement functions
+ for those POSIX-style C library functions that are not present on
+ the target system.
+
+ * info/Makefile.in (SRCS): Add clib.c and clib.h. makedoc now
+ needs clib.o to build on systems missing various string.h stuff.
+
+ * info/variables.c (whole file): Call strdup, not savestring.
+ * info/tilde.c (whole file): Call strdup, not savestring.
+ * info/search.c (whole file): Call strdup, not savestring.
+ * info/nodes.c (whole file): Call strdup, not savestring.
+ * info/nodemenu.c (whole file): Call strdup, not savestring.
+ * info/man.c (whole file): Call strdup, not savestring.
+ * info/makedoc.c (whole file): Call strdup, not savestring.
+ * info/m-x.c (whole file): Call strdup, not savestring.
+ * info/info.c (whole file): Call strdup, not savestring.
+ * info/indices.c (whole file): Call strdup, not savestring.
+ * info/echo_area.c (whole file): Call strdup, not savestring.
+ * info/session.c (whole file): Call strdup, not savestring.
+ * info/filesys.c (whole file): Call strdup, not savestring.
+
+ * makeinfo/makeinfo.c (minor_version): Change to 1.62.
+ * makeinfo/makeinfo.c (get_execution_string): Initialize `i' to 0
+ in case there are no execution_strings.
+
+Wed Jun 14 17:48:06 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * texinfo.texi: include "texinfo.tex", not "texinfo".
+ * info/session.c (forget_window_and_nodes): Place a sequence point
+ in between "info_windows[i] = info_windows[++i];" as per various
+ compiler experts.
+
+ * makeinfo/makeinfo.c (strdup): Create this function if the system
+ doesn't have it.
+ (discard_insertions): Use the insertion's filename, not the
+ current input file.
+ (push_insertion): Remember the current input file with each
+ insertion.
+ (pop_insertion): Free storage used by remembered input file.
+
+ * makeinfo/makeinfo.c (whole file): Use `strdup' instead of
+ `savestring'.
+ * configure.in: Check for `strdup'.
+
+Wed Jun 14 15:58:51 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * libtxi/Makefile.in (prefix): Use @prefix@, not /usr/local/
+
+Wed Jun 14 10:50:57 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * Makefile.in (DISTFILES): Don't include *.elc files in the list
+ of files to distribute.
+ (installdirs): Include `emacs' in the list of sub-dirs with
+ Makefile.in's.
+
+ * emacs/elisp-comp: Shell script which batch compiles the *.el files.
+ * emacs/Makefile.in: New file contains targets to build the elc files.
+ * configure.in: Add `emacs/Makefile' to the list of created makefiles.
+ * makeinfo/makeinfo.c (whole file): Give every function a return
+ type. All cm_xxx functions are now void. Add declarations for
+ functions to top of file.
+
+Mon Jun 12 12:00:57 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * info/man.c (reference_section_starters): Add versions of "SEE
+ ALSO" and "RELATED INFORMATION" with tabs instead of spaces as
+ well.
+
+ * util/texindex.c: Back out changes for OFF_T. Explicity coerce
+ the result of lseek to a long, and use longs everywhere.
+
+ * texinfo.texi: Change "@end shorttitlepage" to "@end titlepage".
+ * makeinfo/makeinfo.c: Make @shorttitlepage ignore the rest of the
+ line.
+
+ * util/texindex.c (strrchr): Create if not present.
+ Test for HAVE_STRCHR and HAVE_STRING_H.
+ (main): Make PROGRAM_NAME be just the last path componenet of argv[0].
+ (decode_command): Rewrite.
+ (usage): Rewrite. Now texindex handles --version.
+
+ * makeinfo/makeinfo.c (make_index_entries_unique): Rewrite from
+ scratch.
+
+ * Don't distribute created info files with texinfo. After all,
+ the user will have the tools necessary to create them, yes?
+
+ * Makefile.in (distclean): Remove *.log
+
+ * info/man.c (read_from_fd): Change timeout value for select to 15
+ seconds. Some systems (e.g., albert.ai.mit.edu) actually need
+ more than 10 seconds to format a man page.
+
+ * info/tilde.c: Fix typo in declaration for
+ `tilde_expansion_failure_hook'.
+
+Wed Jun 7 13:36:53 1995 Brian Fox <bfox@albert.gnu.ai.mit.edu>
+
+ * info/tilde.h: Change type of tilde_expansion_failure_hook to
+ a pointer to a function returning a (char *).
+ * info/tilde.c: Change type of tilde_expansion_failure_hook to a
+ pointer to function returning a (char *).
+
+ * makeinfo/makeinfo.c (get_execution_string): Don't use `i' in the
+ latter assignment, use `execution_strings_index' instead.
+
+ * info/man.c (read_from_fd): Change logic to avoid using FIONREAD.
+
+ * info/xmalloc.c (xrealloc): Use (void *), not (caddr_t *).
+ * info/xmalloc.c (xmalloc): Use (void *), not (caddr_t *).
+
+ * Makefile.in (DISTFILES): Don't find RCS no "=" directories.
+
+ * util/Makefile.in (prefix): Use @prefix@ as the value.
+ * info/Makefile.in (prefix): Use @prefix@ as the value.
+ * makeinfo/Makefile.in (prefix): Use @prefix@ as the value.
+
+Wed Jun 7 12:29:28 1995 Robert J. Chassell <bob@hill.gnu.ai.mit.edu>
+
+ * texinfo.texi: Correct minor typos.
+
+ * emacs/texinfmt.el: Don't require @shorttitlepage to be inside
+ of @iftex ... @end iftex
+
+Mon May 8 18:33:52 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * info/nodes.c: #include "man.h" if HANDLE_MAN_PAGES.
+ (info_get_node_of_file_buffer): If the file buffer is one
+ associated with manpages, call the manpage node finding
+ function instead.
+ (info_find_file_internal): If the file buffer is one associated
+ with manpages, avoid doing any file I/O.
+ (info_reload_file_buffer_contents): Ditto.
+ (info_find_file_internal): Call create_manpage_file_buffer instead
+ of info_load_file_internal.
+
+ * info/info.c: #include "man.h" if HANDLE_MAN_PAGES.
+ (main): If the initial node cannot be found, perhaps find it as a
+ manpage.
+ * info/info-utils.c: #include "man.h" if HANDLE_MAN_PAGES.
+ (info_xrefs_of_node): If handling man pages, and this is a manpage
+ node, use xrefs_of_manpage.
+
+ * info/session.c (info_set_input_from_file): Only fclose (stream)
+ if it is non-null and not stdin.
+ #include "man.h" if HANDLE_MAN_PAGES.
+ (info_menu_or_ref_item): If handling man pages, and this is a
+ manpage node, get the xrefs from manpage_xrefs_in_binding.
+ (info_man): Compile in for M-x man if handling man pages.
+ (info_move_to_xref): If handling man pages, and the current node
+ is a manpage node, use locate_manpage_xref to get xrefs.
+
+Thu May 4 08:55:23 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * info/info.c (main): If the output device is not a terminal, and
+ no output filename has been specified, make user_output_filename
+ be "-", so that the info is written to stdout, and turn on the
+ dumping of subnodes.
+
+Thu Apr 13 18:05:06 1995 Daniel Hagerty <hag@churchy.gnu.ai.mit.edu>
+
+ * texinfo.texi: Fixed @end titlepage/@end shorttitlepage
+
+Sat Apr 8 12:51:49 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * makeinfo/makeinfo.c [! HAVE_STRERROR] (strerror): New function,
+ snarfed from ../info/filesys.c.
+ (cm_infoinclude): Use strerror instead of sys_errlist.
+
+Tue Apr 4 18:44:00 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * util/texindex.c (sort_offline): Change TOTAL to be an off_t.
+ * util/texindex.c (sort_in_core): Change TOTAL to be an off_t.
+ * util/texindex.c (MAX_IN_CORE_SORT): Cast to off_t.
+
+Sun Apr 2 16:20:13 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * info/Makefile.in: Define DEFAULT_INFOPATH in case we are
+ compiling in the current directory.
+ * info/Makefile.in (info.o): Add filesys.h because of DEFAULT_INFOPATH.
+ * info/(search.c,h, nodes.c info-utils.c) Use strcasecmp and
+ strncasecmp instead of stricmp and strnicmp. Define strcasecmp
+ and strncasecmp in search.c if !HAVE_STRCASECMP.
+ * info/search.c: If HAVE_STRING_H include it.
+ * info/nodes.c: If HAVE_STRING_H include it.
+ * info/info-utils.c: If HAVE_STRING_H include it.
+ * info/info.h: If HAVE_STRING_H include it.
+ * configure.in (AC_HAVE_FUNCS): Check for strcasecmp.
+ * makeinfo/makeinfo.c (strcasecmp): Define if !HAVE_STRCASECMP.
+ * makeinfo/makeinfo.c (entire file): Use `strcasecmp' instead of
+ `stricmp'.
+ * makeinfo/makeinfo.c (cm_ifeq): New command takes three args.
+ Compares first two, executes remainder if the first two are
+ string-wise eq.
+ * makeinfo/makeinfo.c (ifhtml): Add to command list. Shouldn't be
+ used, but it is by people who don't want to hack macros.
+
+Sat Apr 1 09:20:14 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * makeinfo/makeinfo.c (begin_insertion): Fix reversed arguments to
+ line_error.
+
+ * info/info-stnd.texi: Use "end" footnote style instead of "separate".
+
+ * info/Makefile.in: Change "rm -f" to $(RM).
+
+ * info/general.h: Define zero_mem in terms of memset if we have
+ it, else in terms of bzero if we have that, else as inline code.
+
+ * info/NEWS: Updated to reflect changes in 2.11.
+
+Fri Mar 31 22:38:31 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * Makefile (DISTFILES): Don't include *.a, *orig, nor *.e
+ files.
+ (DISTFILES):
+
+Sat Mar 4 12:16:29 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * Makefile.in: Use @prefix@ instead of hardwired `/usr/local'.
+ Clean up makefile rules which make in subdirs.
+ (ALL_SUBDIRS): Add makeinfo/macros to list of subdirectories.
+
+ * configure.in (AC_CHECK_FUNCS): Add `bcopy' to list of things to
+ check for.
+
+Fri Mar 3 13:54:10 1995 Robert J. Chassell <bob@hill.gnu.ai.mit.edu>
+
+ * texinfo.texi: Minor changes for incremental new edition 2.20.
+
+Fri Mar 3 19:01:36 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * filesys.c (filesys_read_info_file): Local variable ST_SIZE is a
+ long which has the value of finfo->st_size casted to it.
+ * nodes.c (whole file): Similar changes.
+
+ These changes and the following for makedoc.c were required for
+ proper operation on HPm68k NetBSD.
+
+Mon Feb 27 15:16:27 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * makedoc.c (process_one_file): Local variable FILE_SIZE is a long
+ which has the value of finfo.st_size casted to it.
+
+
+Fri Mar 3 18:58:38 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * makeinfo.c (find_and_load): Cast fileinfo.st_size to a long for
+ internal use. This makes things work on NetBSD.
+
+
+Fri Mar 3 13:54:10 1995 Robert J. Chassell <bob@hill.gnu.ai.mit.edu>
+
+ * texinfo.texi: Minor changes for incremental new edition 2.20.
+
+Fri Mar 3 09:41:39 1995 Brian J. Fox <bfox@wizard.datawave.net>
+
+ * configure.in (TERMLIBS): Use AC_CHECK_LIB instead of
+ AC_HAVE_LIBRARY.
+
+Mon Jan 9 16:55:31 1995 Brian Fox <bfox@churchy.gnu.ai.mit.edu>
+
+ * Makefile.in (DISTFILES): Add the directory EMACS-BACKUPS to the
+ list of things to avoid distributing.
+
+Tue Nov 29 17:48:37 1994 David J. MacKenzie <djm@duality.gnu.ai.mit.edu>
+
+ * configure.in: Check for off_t.
+ * util/texindex.c (main): Use it.
+
+Fri Nov 11 14:46:28 1994 David J. MacKenzie <djm@duality.gnu.ai.mit.edu>
+
+ * configure.in: Update for Autoconf v2.
+
+Thu Oct 13 02:17:38 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * emacs/detexinfo.el (detexinfo): Handle @!, @?, @^, @".
+
+Mon Aug 1 03:26:13 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texindex.c: Move the memset define down past string.h include.
+
+Tue Jun 28 14:21:43 1994 David J. MacKenzie (djm@churchy.gnu.ai.mit.edu)
+
+ * makeinfo/makeinfo.c: Add --help option.
+ (usage): Take args for stream and error code.
+ Change callers.
+ (print_version_info): Write to stdout, not stderr.
+
+Wed May 18 18:55:24 1994 Brian J. Fox (bfox@ai.mit.edu)
+
+ * info/session.c (forget_window_and_nodes): Negate test for
+ internal_info_node_p. We only want to free the text if it is
+ not an internal node.
+
+Thu Mar 10 03:07:18 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texindex.c (memset): Fix invalid parm name (was 0).
+
+Thu Feb 10 12:56:52 1994 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * makeinfo/makeinfo.c (current_item_function): Don't loop if elt
+ is NULL.
+
+Wed Feb 9 12:21:09 1994 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo/makeinfo.c (minor_version): Release now at 1.60.
+
+ * makeinfo/makeinfo.c (expand_filename): Additional fixes. Now
+ when called with NULL filename, makes an output filename from the
+ input filename.
+ (convert_from_loaded_file): If REQUIRE_SETFILENAME is #defined (no
+ longer the default case) then error if no @setfilename was found
+ in the file. If REQUIRE_SETFILENAME is not #defined, the input
+ file starts either at the first line, or at the second line if the
+ first line contains the text "\input", and the output filename is
+ the input file name without directory and with ".info" replacing
+ any extension found.
+ (convert_from_loaded_file): Fixed bug in search for first
+ occurence of "@setfilename".
+
+Tue Feb 8 14:16:58 1994 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * configure.in: Check for sys/file.h.
+ info/dir.c, info/filesys.c, info/makedoc.c, info/nodes.c,
+ info/session.c, info/termdep.h, makeinfo/makeinfo.c
+ [HAVE_SYS_FILE_H]: Include <sys/file.h>.
+
+ * makeinfo/makeinfo.c (convert_from_loaded_file): Print
+ real_output_filename instead of output_filename, so user knows
+ exactly where output file is going.
+
+ Fri Jun 11 14:34:30 1993 Ian Lance Taylor (ian@cygnus.com)
+ * configure.in: Check for sigprocmask and sigsetmask.
+ * info/signals.h (HAVE_SIGSETMASK): Don't define.
+ (HAVE_SIGPROCMASK): Use instead of _POSIX_VERSION.
+ (BLOCK_SIGNAL, UNBLOCK_SIGNAL): If neither HAVE_SIGPROCMASK nor
+ HAVE_SIGSETMASK is defined, define these to do nothing.
+ * info/signals.c (sigprocmask): Don't compile if HAVE_SIGSETMASK
+ is not defined.
+
+ * info/terminal.c (terminal_prep_terminal): Don't clobber VINTR
+ and VQUIT in conditionals.
+
+Mon Feb 7 18:10:22 1994 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo/makeinfo.c (full_pathname): Correct to really return
+ the full pathname of the input argument. Now makeinfo
+ /foo/bar.texi, where /foo/bar.texi contains "@setfilename
+ bar.info", correctly leaves the output file in "./bar.info".
+ Note that "@setfilename ../bar.info" still works; this is already
+ an absolute pathname.
+
+Sat Feb 5 13:04:05 1994 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo/makeinfo.c: Version 1.59 released.
+
+ * makeinfo/makeinfo.c (whole file): Large number of changes allow
+ the "-E filename" option to be used to write a macro expanded
+ output file. On a file which contains no @include's and no
+ @macro's, the output file is identical to the input file.
+
+ * makeinfo/makeinfo.c (declarations): Remove cm_tex (). It is
+ never used since it is implemented with `command_name_condition'.
+
+ * makeinfo/makeinfo.c (add_char): Shift braces following the
+ current break point if we have deleted any characters.
+ (adjust_braces_following): New function adjusts all of the markers
+ in the brace stack which follow HERE by AMOUNT. This fixes a bug
+ where (for example) @var{} immediately following a line break
+ which is the end of a sentence modified the output incorrectly.
+
+Wed Feb 2 14:14:03 1994 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo: Version 1.58.
+
+ * makeinfo/makeinfo.c (cm_node): Add extra hair to allow
+ backtracking through execution strings. Add extra hair to allow
+ the first node seen after a @top node is seen to adjust the
+ sectioning level of the @top node and associated menus.
+ Fix a few typos.
+ Add facility for macros to invoke the original definition. This
+ works by not allowing a single macro to recurse. Mutual recursion
+ is also disallowed with this plan.
+
+ * makeinfo/macros: New directory contains shippable macros.
+ * makeinfo/macros/simpledoc.texi: Macros which simplify the most
+ common uses of TeXinfo. See the example file.
+ Macros are now a reasonable way to get people started using
+ TeXinfo.
+
+Mon Jan 31 12:54:36 1994 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo/makeinfo.c (minor_version): Increase to 57.
+
+ * makeinfo/makeinfo.c (cm_node): Call execute_string on the node,
+ next, prev, and up pointers.
+ (reader_loop): Change logic for `@bye'. No longer required at the
+ ends of executed strings.
+ (execute_string): Do not append `@bye' to the string to execute.
+
+ * makeinfo/makeinfo.c (whole file): Use COMMAND_PREFIX instead of
+ hardcoding `@' character in strings and searches.
+
+ * makeinfo/makeinfo.c (read_command): If HAVE_MACROS is defined,
+ then recognize and execute macros here.
+ (CommandTable): Add "macro" and "unmacro" to table if HAVE_MACROS
+ is defined.
+
+ * makeinfo/makeinfo.c (cm_macro, cm_unmacro, execute_macro)
+ makeinfo/makeinfo.c (get_macro_args, find_macro, add_macro)
+ makeinfo/makeinfo.c (delete_macro, array_len, apply):
+ New functions implement macro facility if HAVE_MACROS is
+ defined.
+
+ * makeinfo/macro.texi (new file): Examples of using the new macro
+ facility.
+
+Mon Jan 31 10:24:52 1994 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * makeinfo/makeinfo.c (executing_string): Restore global
+ declaration.
+
+Mon Jan 24 23:48:26 1994 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * texinfo.texi: Various typo fixes from Bob Chassell
+ <bob@gnu.ai.mit.edu>.
+
+Thu Jan 6 13:34:21 1994 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * texinfo.texi: Turned on smallbook format and @set smallbook.
+
+Wed Dec 15 20:08:43 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * info/filesys.h (DEFAULT_INFOPATH): Added /usr/local/info,
+ /opt/gnu/info, /usr/share/info, and /usr/local/share/info.
+
+Tue Dec 14 19:10:20 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * libtxi/Makefile.in (ALLOCA): Define from configure.
+
+Fri Dec 10 04:33:12 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/texi2dvi: Put under RCS control.
+
+Sun Dec 26 11:55:46 1993 Brian J. Fox (bfox@ai.mit.edu)
+
+ * info/session.c (info_numeric_digit_arg_loop): Fix doc string.
+
+ * info/infodoc.c (create_internal_info_help_node): Print out list
+ of functions which have to keystroke equivalent if we support
+ NAMED_FUNCTIONS.
+
+ * info/filesys.c (compress_suffixes): Add ".gz" for "gunzip" to
+ alist.
+
+ * info/footnotes.c (make_footnotes_node): If refs[i] doesn't have
+ a nodename, then it couldn't be a reference to a footnote.
+
+ * info/nodemenu.c (get_visited_nodes): Handle the case where
+ filter_func has left no possible buffers to select.
+
+Sat Dec 25 10:35:56 1993 Brian J. Fox (bfox@ai.mit.edu)
+
+ * info/infodoc.c (create_internal_info_help_node): Conditionalize
+ generation of the help node based on the #define
+ HELP_NODE_GETS_REGENERATED. When this is not set (the default)
+ the help node is generated exactly once, and is not gc'able.
+ Otherwise, a new node is always created for the help window, and
+ the old node gets garbage collected by the gc system.
+ (info_find_or_create_help_window): Conditionalize window node
+ selected based on the #define HELP_NODE_GETS_REGENERATED.
+
+ * info/dir.c (add_menu_to_file_buffer): Place exactly one blank
+ line between directory entries.
+
+ * info/info.c (version_string): Update minor version to "11".
+
+ * info/info.h: Update comment to "2.11".
+
+ * info/dir.c (maybe_build_dir_node): Only add the contents of a
+ new file if it is not identical to the file of the DIR buffer.
+
+ * info/nodes.c (info_get_node): Call `maybe_build_dir_node' on
+ "dir" as well as "localdir" to mimic emacs-19.22 "dir" merging
+ behaviour.
+
+Fri Dec 3 13:41:44 1993 Brian J. Fox (bfox@ai.mit.edu)
+
+ * info/info-utils.c (canonicalize_whitespace): Suppress whitespace
+ found at the start of STRING.
+
+Sat Nov 20 14:00:50 1993 Brian J. Fox (bfox@hippie)
+
+ * info/indices.c (DECLARE_INFO_COMMAND): Fix typo in assignment to
+ `old_offset' (= instead of ==).
+
+Tue Nov 2 12:22:40 1993 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo/makeinfo.c (make_index_entries_unique): New function
+ makes a sorted array have all unique entries by appending numbers
+ to the ends of strings.
+ (sort_index): Call `make_index_entries_unique'.
+
+Mon Sep 20 12:04:05 1993 Brian J. Fox (bfox@ai.mit.edu)
+
+ * makeinfo/makeinfo.c (get_execution_string): New Function returns
+ a pointer to an EXECUTION_STRING structure.
+ (execute_string): No longer uses a static string; call
+ `get_execution_string' instead in order to get a free buffer for
+ consing.
+
+Sun May 23 07:00:20 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * Texinfo 3.1 released.
+
+Sat May 22 18:21:27 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * info/info.c (info_patch_level): Increment constant to 1.
+
+ * info/Makefile.in (DEFAULT_INFOPATH): Default definition deleted.
+ Makefile.in: Put it here instead.
+ * Makefile.in (MDEFINES): Add DEFAULT_INFOPATH.
+
+ * configure.in: check for vfprintf and vsprintf.
+
+ * makeinfo/makeinfo.c: Version 1.55.
+
+ * makeinfo/makeinfo.c (add_word_args, execute_string) [HAVE_VARARGS_H]:
+ Don't use this definition unless HAVE_VSPRINTF is also defined.
+ (error, line_error, warning) [HAVE_VARARGS_H]: Don't use this
+ definition unless HAVE_VFPRINTF is also defined.
+ Remove indentation of all cpp directives, except for #pragma.
+
+Fri May 21 14:34:24 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * texinfo.texi: Rename to texi.texi.
+ Change @setfilenname and START-INFO-DIR-ENTRY to `texi.info'.
+
+ * Makefile.in (MDEFINES): Pass LDFLAGS to sub-makes.
+ (realclean): Delete `configure'.
+ Changed all references to texinfo.info to texi.info
+
+ * configure.in: Add AC_PROG_RANLIB, and AC_CONST.
+ Check for `rindex' function.
+ Check for varargs.h.
+ Clean up symbol names for header files so a single AC_HAVE_HEADERS
+ can be used.
+ (AC_INIT): Use texi.texi instead of makeinfo/makeinfo.c
+
+ * info/info-utils.h: Copy definitions of bcopy, index, and rindex
+ (with appropriate #ifdef wrappers) from termdep.h. These are
+ included by a mutually exclusive set of files.
+
+ * info/termdep.h [HAVE_SYS_PTEM]: Use HAVE_SYS_PTEM_H instead.
+
+ * info/terminal.c, info/termdep.h [HAVE_TERMIO]: Use HAVE_TERMIO_H
+ instead.
+
+ * info/makedoc.c, info/filesys.c [!O_RDONLY]: Include fcntl.h or
+ sys/fnctl.h, depending on whether HAVE_SYS_FCNTL_H is set.
+
+ * info/termdep.h: Remove all indentation in #-exprs.
+ Remove old assumptions about bcopy, index, and rindex.
+ [HAVE_BCOPY]: Define bcopy.
+ [HAVE_RINDEX]: Define index and rindex.
+
+ * info/nodes.c (info_get_node): Don't call stricmp if nodename is
+ NULL. Remove indentation in #-exprs.
+
+ * info/echo_area.c (echo_area_stack_depth): Declare static.
+
+ * info/Makefile.in (DEFAULT_INFOPATH): Make separate Makefile
+ variable so it can be overridden more easily by the user. Add `.'
+ to beginning of path.
+ (clean): Delete core.* (386bsd core files).
+ (MAKEDOC): Variable removed. Refer to `makedoc' explicitly.
+ (funs.h): Add `:' commands after if, to avoid spurious nonzero
+ exit statuses.
+
+ * info/userdoc.texi: Improved comments explaining its purpose.
+
+ * makeinfo/makeinfo.c [HAVE_VARARGS_H]: Include varargs.h.
+ (error, line_error, warning, add_word_args,
+ execute_string)[HAVE_VARARGS_H]: New versions that
+ use varargs. From bfox.
+
+ * makeinfo/Makefile.in (clean): Delete core.* (386bsd core files).
+
+ * util/Makefile.in (clean): Remove core.* (386bsd core files).
+
+ * libtxi/Makefile.in: Remove all references to $(common).
+ (RANLIB): New variable, set from autoconf.
+ (libtxi.a): Use $(RANLIB) instead of `ranlib' in target rules.
+ (clean): Delete core.* (386bsd core files).
+
+Tue May 18 12:08:24 1993 Robert J. Chassell (bob at grackle.stockbridge.ma.us)
+
+ * emacs/texinfmt.el (texinfo-format-refill): Do not fill a section
+ title line with the asterisks, hyphens, etc. that underline
+ it in any circumstance.
+
+Sun May 16 13:53:43 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/mkinstalldirs: handle relative pathnames.
+
+Fri May 14 20:18:49 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/mkinstalldirs: initialize IFS if unset.
+
+Tue May 11 06:33:14 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * makeinfo/makeinfo.c (cm_item): don't dereference item_func if NULL.
+
+Mon May 10 14:50:31 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * Texinfo 3.0 released.
+
+ * Makefile.in (ALLOCA): Provide for substitution.
+
+Mon May 10 10:12:53 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * emacs/texinfmt.el (texinfmt-version): Updated year.
+
+Fri Apr 16 04:48:03 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * makeinfo/makeinfo.c: Version 1.54 from bfox.
+
+ * util/fixfonts: Replace instances of `[..]' with `test'.
+ Use more portable `test' arguments: `z$foo = z' instead of `! $foo'.
+ Robustify quoting in eval assignments.
+ (textfmdir, texpkdir, texgfdir): Don't override definition from
+ environment, if any.
+ Trap EXIT, SIGHUP, SIGINT, SIGQUIT, SIGTERM to delete temp files
+ instead of trying to remove them explicitly before calling exit.
+ When changing cwd, do so in subshell, in case various tex*dir
+ variables are relative.
+ Don't use `head', `dirname', or `basename'. These don't behave
+ consistently and/or don't even exist on some systems. They can
+ all be emulated with `sed' anyway.
+ (tempfile2_line1): New variable. Use it instead of running
+ process to extract first line out of tempfile2 multiple times.
+ Eliminate some gratuitous uses of $tempfile2, such as in for loops.
+
+Fri Mar 26 23:25:13 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * texinfo.texi: @setfilename texinfo.info.
+
+ * makeinfo/makeinfo.c (reader_loop, end_insertion): Fix typos in
+ comments.
+ (handle_variable_internal): Handle the case that there further
+ menu text after a false ifset/ifclear.
+
+ * util/texi2dvi: Version 0.4
+ Replace all instances of `[ ... ]' with `test'.
+ Updated bug-reporting address.
+
+Thu Mar 25 12:31:30 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * info/Makefile.in (install): Install info.1 man page.
+ (uninstall): Remove installed info.1 man page.
+
+ * info/infoman.texi: Standalone manual renamed to info-stnd.texi.
+ Makefile.in: Targets updated appropriately.
+
+ * info/Makefile.in (LDEFS): New variable. Use it for info-local
+ macros, since DEFS will be inherited from parent make and any
+ local definitions will get clobbered.
+
+ * info/RELEASE: Renamed to info/NEWS.
+
+ * README: New file.
+
+ * Makefile.in (topclean): New target.
+
+ * Getting-started: Renamed to INTRODUCTION. Former name is too
+ long (over 14 chars).
+
+ * New-features: Renamed to NEWS.
+
+ * Makefile.in (MDEFINES): Set it.
+
+ * Makefile.in (dist): Use --gzip option to tar to make sure
+ resulting file is compressed with gzip. Change tar file
+ extension from `.Z' to `.z'.
+
+ * Makefile.in (DISTFILES): Filter out any file or directory names
+ starting with `='.
+
+ * fixfonts: Moved to util/fixfonts.
+
+ * RELEASE: Deleted.
+
+ * makeinfo/Makefile.in (VPATH): Use $(srcdir), not @srcdir@.
+ (common): Use ../libtxi, not ../common.
+ (makeinfo.in): Run makeinfo with --no-split.
+
+ * makeinfo/makeinfo.texi: Changes from bob.
+
+ * util/Makefile.in (VPATH): Use $(srcdir), not @srcdir@.
+ (common): Use ../libtxi, not ../common.
+
+ * util/fixfonts: Moved from top-level directory.
+
+Wed Mar 24 10:21:31 1993 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-format-region): Do not require
+ `@setfilename' line; delete `\input texinfo' line if part of
+ region.
+
+ * emacs/texinfmt.el (texinfo-raise-lower-sections): Raise or lower the
+ hierarchical level of chapters, sections, etc. according to
+ `@raisesections' and `@lowersections' commands.
+
+Thu Mar 18 16:02:27 1993 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfo.el (texinfo-show-structure): Indent *Occur* buffer
+ according to the structure of the file.
+
+Sat Mar 6 05:16:44 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/texi2dvi: use ${1+"$@"}, not just "$@".
+
+Tue Feb 2 08:38:06 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * info/Makefile.in: Replace all "--nosplit" arguments to makeinfo
+ with "--no-split"
+
+Sun Jan 31 18:16:58 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/texi2dvi: Don't put .dvi and related auxillary files in same
+ directory as source files. Put them in current directory instead.
+ (TEXINPUTS_orig): New variable.
+ (file_texi): Variable removed.
+ (filename_texi): New variable.
+ (command_line_filename): Use this wherever references to file_texi
+ occured except in setting filename_noext.
+ (TEXINPUTS): Current directory and source directory where input
+ file resides prepended to standard path before invoking TeX.
+
+Wed Jan 27 16:24:37 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/Makefile.in: overhauled.
+
+Tue Jan 26 21:04:23 1993 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * Makefile.in, info/Makefile.in, makeinfo/Makefile.in: Overhauled.
+
+ * configure.in: Renamed from texinfo.in.
+ Incorporated makeinfo/makeinfo.in, info/info.in, and
+ util/util.in. Create all child Makefiles.
+
+ * makeinfo/makeinfo.in, info/info.in: Deleted (incorporated into
+ top configure.in).
+
+ * util/util.in: Deleted (incorporated into ../configure.in).
+
+Mon Jan 25 10:59:49 1993 Brian Fox (bfox@cubit)
+
+ * info/info.c: New version 2.9; new variable INFO_PATCH_LEVEL
+ appears in the version string if it is non-zero. New function
+ version_string () produces the current version string, as in 2.8-p1.
+
+ * info/dir.c: New file implements Gillespies `localdir' hacks.
+
+ * info/nodes.c (info_get_node): Now calls maybe_build_dir_node ()
+ if the file name to look for is "dir".
+
+ * info/nodes.h: New flag N_CannotGC unconditionally prevents garbage
+ collection of a file buffer's contents. Used when "dir" is made
+ from at least one "localdir".
+
+Fri Jan 22 11:36:42 1993 Brian Fox (bfox@cubit)
+
+ * info/footnotes.c: Do not declare auto_footnotes_p as "extern" in
+ this file.
+
+Thu Jan 21 08:57:08 1993 Brian Fox (bfox@cubit)
+
+ * info/info.c: New version 2.8.
+
+ * info/userdoc.texi, info/infoman.texi, info/info.texi: Fully
+ document Info; create both online and printed manual versions.
+ "userdoc.texi" contains exactly the documentation for GNU Info 2.x.
+ "infoman.texi" is a wrapper for that file; it is meant to produce
+ printed documentation. "info.texi" has the user documentation as a
+ complete chapter within itself, but continues to contain the Info
+ tutorial.
+
+ * info/makedoc.c: Convert "ea_" into "echo_area_" when creating the
+ command name.
+
+Fri Jan 15 16:50:35 1993 Brian Fox (bfox@cubit)
+
+ * info/search.c (skip_node_characters): New argument NEWLINES_OKAY if
+ non-zero says that newlines should be skipped over during parsing.
+
+ * info/info-utils.c (info_parse_node): New argument NEWLINES_OKAY if
+ non-zero says that newlines should be skipped while parsing out
+ the nodename specification.
+
+Wed Jan 13 14:42:33 1993 Brian Fox (bfox@cubit)
+
+ * info/makedoc.c: Remove "info_" from the front of the command name
+ before installing it.
+
+ * info/session.c (info_menu_or_ref_item): A label of "Menu" is okay if
+ the builder is not info_menu_of_node ();
+
+ * info/m-x.c: New function replace_in_documentation () replaces \\[foo]
+ with the keystrokes you type to get that command. Now used in
+ indices.c, info.c, infodoc.c.
+
+Mon Jan 11 10:27:41 1993 Brian Fox (bfox@cubit)
+
+ * info/variables.c, h: New files contain describe-variable and stuff
+ moved out of m-x.c.
+
+ * info/m-x.c: Move VARIABLE_ALIST and variable functions into
+ variables.c. Add documentation string to variable definition.
+
+ * info/echo_area.c (push_echo_area): Zero the contents of
+ echo_area_completion_items after pushing the vars.
+
+Sat Jan 9 11:59:47 1993 Brian Fox (bfox@cubit)
+
+ * info/Makefile.in: Add footnotes.c,h,o to the appropriate Makefile
+ variables.
+
+ * info/window.c (window_tile_windows): New function divides the
+ available space among the visible windows.
+
+ * info/session.c (info_tile_windows): New function calls
+ window_tile_windows.
+
+ * info/footnotes.c, footnotes.h: New file implements functions for
+ aiding automatic footnote display when entering a node which has
+ footnotes.
+
+ * info/m-x.c: New user-variable "automatic-footnotes".
+
+ * info/window.c (window_physical_lines) New function counts the
+ carriage returns found in NODE.
+
+Wed Jan 6 11:24:19 1993 Brian Fox (bfox@cubit)
+
+ * info/general.h: #include <unistd.h> if we have it.
+
+Tue Jan 5 11:12:33 1993 Brian Fox (bfox@cubit)
+
+ * info/info-utils.c (info_concatenate_references): If either arg is
+ NULL, return the other arg.
+
+ * info/indices.c (info_indices_of_file_buffer): Simplified and
+ corrected loop through tags/nodes of file buffer looking for
+ indices.
+
+ * info/search.c (skip_node_characters): Rewrite "if" statement for
+ clarification and conciseness.
+
+Fri Jan 1 03:18:26 1993 Brian Fox (bfox@cubit)
+
+ * info/info.in: Check for setvbuf (), and check to see whether the args
+ are reversed.
+
+ * info/dribble.c (open_dribble_file) Check HAVE_SETVBUF and
+ SETVBUF_REVERSED when setting the buffering on info_dribble_file.
+
+Thu Dec 31 20:14:13 1992 Brian Fox (bfox@cubit)
+
+ * info/session.c (info_select_reference) If the node couldn't be found,
+ look for the label as a filename (i.e., "(LABEL)Top").
+
+Wed Dec 30 01:57:50 1992 Brian Fox (bfox@cubit)
+
+ * New Version 2.7 Beta.
+
+ * info/echo_area.c: Numerous functions now do something with the
+ numeric argument. Kill ring implemented, as well as yank and
+ yank_pop. Also transpose-chars.
+
+ * info/window.c (window_make_modeline): Check node->flags for
+ N_IsCompressed and display "zz" in the modeline if the node comes
+ from a file which is compressed on disk.
+
+Mon Dec 28 17:33:12 1992 Brian Fox (bfox@cubit)
+
+ * info/filesys.c, info/nodes.c: New member of FILE_BUFFER "FILESIZE"
+ contains the size of file_buffer->contents. finfo.st_size is no
+ longer relied upon to read the contents of files, since the new
+ function (filesys_read_info_file) can read compressed files.
+
+ * info/filesys.c (info_find_fullpath) If a file starts with a slash (or
+ tilde expansion causes it to start with a slash) still call
+ info_find_file_in_path () on it so that we can find files with
+ compression suffixes.
+
+ * info/m-x.c: New variable "gc-compressed-files".
+
+Tue Dec 22 03:45:28 1992 Brian Fox (bfox@cubit)
+
+ * info/info.c: Version 2.6 Beta.
+
+ * info/indices.c (info_index_next): Improve the final search for the
+ matched index entry.
+
+ * info/session.c (move_to_screen_line): New function implements `M-r'.
+ Given a numeric argument, move point to the start of that line in
+ the current window; without an arg, move to the center line.
+ * infomap.c: Put move_to_screen_line () on `M-r'.
+
+ * info/nodes.c (adjust_nodestart): Don't set N_UpdateTags unless the
+ node came from a tags table.
+
+ * info/nodes.c (info_find_file_internal): If the filename being looked
+ for doesn't start with a `/', then additionally compare the
+ filename against the fullpath of the file buffer sans the
+ directory name. This can happen when selecting nodemenu items.
+
+Mon Dec 21 10:07:18 1992 Brian Fox (bfox@cubit)
+
+ * info/session.c, info/display.c: Remove all references to
+ active_window_ch, active_window_cv, cursor_h, and cursor_v. The
+ single function display_cursor_at_point () is used for all cursor
+ movement, and to place the terminal's cursor at the right location
+ on the screen.
+
+Sat Dec 19 12:01:33 1992 Brian Fox (bfox@cubit)
+
+ * info/nodemenu.c: New file implements a few functions for manipulating
+ previously visited nodes. `list-visited-nodes' produces a menu of
+ the nodes that could be reached by info_history_node () in some
+ window. `select-visited-node' is similar to `list-visited-node'
+ followed by `info-menu-item', but doesn't display a window with
+ the visited nodes menu.
+
+ * info/session.c (info_numeric_arg_digit_loop): If redisplay had been
+ interrupted, then redisplay all of the windows while waiting for
+ input.
+
+ * info/display.c (display_was_interrupted_p): New variable keeps track
+ of interrupted display. Used in
+ info/session.c:info_numeric_arg_digit_loop ().
+
+ * info/session.c (info_global_next, info_global_prev): Use the numeric
+ argument passed to determine how many nodes to move.
+
+ * info/session.c (info_scroll_forward, info_scroll_backward): If the
+ invoking key is not SPC or DEL only do Page Only scrolling.
+
+Thu Dec 17 01:34:22 1992 Brian Fox (bfox@cubit)
+
+ * info/display.c (display_update_one_window): Allow W_NoWrap to affect
+ window display.
+
+ * info/window.c (calculate_line_starts): Now takes a WINDOW * as an
+ argument, and simply does the calculation, placing the results
+ into window->line_starts and window->line_count. It also handles
+ W_NoWrap in window->flags.
+
+Mon Dec 14 02:18:55 1992 Brian Fox (bfox@cubit)
+
+ * info/session.c (info_backward_scroll): Don't try to get previous node
+ if the top of the node isn't currently being displayed.
+
+ * info/window.c (window_adjust_pagetop) Use new variable
+ "window_scroll_step" to attempt to control the amount which the
+ window scrolls.
+
+ * info/m-x.c (info_variables) Add "scroll-step" to the list.
+
+Thu Dec 10 08:52:10 1992 Brian Fox (bfox@cubit)
+
+ * info/m-x.c: New variable entry show-index-matches. When set to
+ non-zero the matched portion of the search string is indicated
+ with ` and '. Perhaps I should use `|' inst|ea|d?
+
+ * info/echo_area.c (ea_possible_completions): Always build completions
+ before checking to see how many there were.
+
+ * info/info-utils.c: (info_concatenate_references): New utility
+ function concatenates references.
+
+ * info/Makefile.in: Add indices.c and indices.h to SRCS and HDRS.
+ Add indices.c to CMDFILES.
+
+ * info/indices.c, info/indices.h: New file implements `i' and `,'
+ commands of info, and provides index searching capabilities.
+
+ * info/echo_area.c (info_read_completing_in_echo_area): Split off into
+ separate callable function info_read_completing_internal ().
+
+ * info/echo_area.c (info_read_maybe_completing): New function calls
+ info_read_completing_internal () with non-forcing argument.
+
+ * info/session.c: Rename down_next_upnext_or_error () and
+ prev_up_or_error () to forward_move_node_structure (), and
+ backward_move_node_structure (). Implement new commands
+ info_global_next () and info_global_prev ().
+
+ * info/infomap.c (initialize_info_keymaps): Bind `[' and `]' to
+ backward_, forward_move_node_structure () respectively.
+
+ * info/session.c (info_menu_digit): Called with "0" as arg, select the
+ last menu item.
+
+ * info/infomap.c (initialize_info_keymaps): "0" calls
+ info_menu_digit ().
+
+ * info/session.c (info_move_to_xref): Take dir into account when there
+ are xrefs and menu items in the node and we are wrapping
+ backwards.
+
+Tue Dec 8 09:57:58 1992 Brian Fox (bfox@cubit)
+
+ * info/info.c: Version 2.5 Beta.
+
+ * info/terminal.c (terminal_insert_lines, terminal_delete_lines) Do not
+ expect tgoto to return a new string; it returns the address of a
+ static buffer.
+
+ * info/infodoc.c (info_find_or_create_help_window) Correct check for
+ prior existing help node.
+
+ * info/m-x.c (set_variable): Allow variables to have a list of choices.
+ Add new variable scroll-behaviour.
+
+ * info/session.c (down_next_upnext_or_error, prev_up_or_error) New
+ functions implement user-controlled behaviour when attempting to
+ scroll past the bottom or top of a node. New variable
+ info_scroll_behaviour is user visible as "scroll-behaviour".
+
+ * info/session.c (info_scroll_forward, info_scroll_backward) Call new
+ functions for user-controlled scroll behaviour.
+
+ * info/terminal.c (terminal_initialize_terminal) Set PC from BC not
+ from BUFFER.
+
+Mon Dec 7 11:26:12 1992 Brian Fox (bfox@cubit)
+
+ * util/texindex.c: Change EXIT_SUCCESS and EXIT_FATAL to TI_NO_ERROR
+ and TI_FATAL_ERROR respectively. This avoids namespace conflicts
+ on NeXT 2.0.
+
+Sat Dec 5 00:07:59 1992 Brian Fox (bfox@cubit)
+
+ * info/info.c: New option "--subnodes" says to recursively dump the
+ menus of the nodes that you wish to dump. Menu items which point
+ to external nodes are not dumped, and no node is dumped twice.
+
+Thu Dec 3 16:11:02 1992 Brian Fox (bfox@cubit)
+
+ * info/session.c (info_error) Don't ring the bell if
+ info_error_rings_bell_p is zero. (info_abort_key) Ring the bell
+ if printing "Quit" in the echo area wouldn't do it.
+
+ * info/m-x.c (set_variable) New functions allows setting of
+ variables in the echo area. Currently, only visilble-bell and
+ errors-ring-bell are implemented.
+
+Wed Dec 2 13:11:37 1992 Brian Fox (bfox@cubit)
+
+ * info/nodes.c, info/makedoc.c: If O_RDONLY is not defined by
+ sys/file.h, include sys/fcntl.h.
+
+ * info/filesys.c (info_file_in_path): Expand leading tildes found
+ within directory names.
+
+ * info/terminal.c (terminal_initialize_terminal) Set ospeed to 13 if
+ not settable any other way. It is an index into an array of
+ output speeds.
+
+ * info/display.c (free_display) Do not free a NULL display.
+
+ * info/display.c (string_width): New functions returns the width of
+ STRING when printed at HPOS.
+
+Sun Nov 29 01:24:42 1992 Brian Fox (bfox@cubit)
+
+ * info/info.c: New version 2.4 beta.
+
+ * info/general.h: #define info_toupper and info_tolower which check
+ their arguments before performing any conversion.
+
+ * info/search.c, info/echo_area.c: Use info_toupper.
+
+Sat Nov 28 14:23:24 1992 Brian Fox (bfox@cubit)
+
+ * info/session.c (info_scroll_forward, info_scroll_backward) If at
+ last/first page of the node, and the last command was
+ forward/backward, do info_next/prev/_node.
+
+ * info/session.c: New function info_select_reference_this_line gets
+ menu or cross reference immediately.
+
+ * info/infomap.c (initialize_info_keymaps): Add info_keymap[LFD] to
+ invoke info_select_reference_this_line ().
+
+ * info/session.c (info_last_reference) Rename to
+ info_history_reference. Wrote info_last_reference, and
+ info_first_reference which go to the last or first node of an info
+ file.
+
+Fri Nov 27 00:59:02 1992 Brian Fox (bfox@cubit)
+
+ * info/info.c: New version 2.3. Completed implementing contents of
+ TODO file.
+
+ * info/session.c (info_redraw_display): Fix C-l with numeric arg.
+
+Thu Nov 26 20:14:18 1992 Brian Fox (bfox@cubit)
+
+ * info/m-x.c: New file implements reading named commands in the echo
+ area, along with a new function "info-set-screen-height".
+ Compilation of this file and some code in others controlled by the
+ Makefile variable NAMED_COMMANDS (set to -DNAMED_COMMANDS).
+
+ * info/window.c (window_new_screen_size) Rewrite from scratch, allowing
+ clean growth and shrinkage of the screen. New variable
+ window_deletion_notifier is a pointer to a function to call when
+ the screen changes size, and some windows have to get deleted.
+ The function is called with the window to be deleted as an
+ argument, and it should clean up dangling references to that
+ window.
+
+ * info/session.c (initialize_info_session): Set
+ window_deletion_function to forget_window_and_nodes.
+
+ * info/display.c (display_update_one_window): If the first row of the
+ window to display wouldn't appear in the_screen, don't try to
+ display it. This happens when the screen has been made
+ unreasonably small, and we attempt to display the echo area.
+
+Tue Nov 24 00:47:20 1992 Brian Fox (bfox@cubit)
+
+ * Release Info 2.2.
+
+ * info/session.c: New functions implement reading typeahead and
+ implement C-g flushing typed ahead characters.
+ (info_search_internal): allows C-g to exit multi-file searches.
+
+Mon Nov 23 01:53:35 1992 Brian Fox (bfox@cubit)
+
+ * info/nodes.c: Remove calls to sscanf (), replacing them with calls to
+ atol (), since that is much faster.
+ (get_nodes_of_tags_table) Only check for "(Indirect)" if we
+ haven't parsed any nodes out of the tags table. Increase the
+ amount that file_buffer->nodes grows to 100 from 50. These two
+ together sufficiently speed up the parsing process.
+
+ * info/nodes.c: info_get_node_of_file_buffer_tags (),
+ info_get_node_of_file_buffer_nodes (): Search the appropriate list
+ and return a node. This was simply a cut and paste edit to
+ functionalize the code.
+
+ * info/TODO: Remove suggestion for partial tag parsing, since tag
+ parsing is much faster now.
+
+Sat Nov 21 02:48:23 1992 Brian Fox (bfox@cubit)
+
+ * info/makedoc.c: New File replaces makedoc.sh shell script.
+
+ * info/infomap.c: Install info_isearch (on C-s) and
+ info_reverse_isearch (on C-r) for Info windows.
+
+ * info/session.c (incremental_search, info_isearch,
+ info_reverse_isearch) New functions implement incremental
+ searching.
+
+Fri Nov 20 00:01:35 1992 Brian Fox (bfox@cubit)
+
+ * info/terminal.c (terminal_initialize_terminal): Declare and set up
+ `ospeed'. Turn off C-s and C-q processing.
+
+ * info/session.c (info_show_point) When this function is called, the
+ desired result is to show the point immediately. So now it calls
+ set_window_pagetop () if the new pagetop is not the same as the
+ old one. This means that info_prev_line (), info_next_line (),
+ info_forward_word (), and info_backward_word () can all scroll the
+ window if they have to.
+
+Thu Nov 19 12:27:07 1992 Brian Fox (bfox@cubit)
+
+ * info/session.c (set_window_pagetop): Add scrolling to make this
+ faster.
+
+ * info/echo_area.c (push/pop_echo_area): Remember the list of items to
+ complete over.
+
+ * info/session.c (info_forward_char): Don't let point get equal to
+ nodelen, only to nodelen - 1.
+
+ * info/display.c: New function display_scroll_display () scrolls the
+ rmembered display as well as the text on the actual display.
+
+ * info/terminal.c: New functions terminal_scroll_terminal (),
+ terminal_scroll_down (), and terminal_scroll_up (). All
+ implemented using "al" and "dl" termcap capabilities. (i.e.,
+ insert and delete line).
+
+Wed Nov 18 15:05:14 1992 Brian Fox (bfox@cubit)
+
+ * info/termdep.h: Only define HAVE_FCNTL_H if !aix and !ultrix.
+
+Tue Nov 17 20:35:08 1992 Brian Fox (bfox@cubit)
+
+ * First Beta Release of Info 2.0.
+
+Sun Nov 1 02:21:05 1992 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/texi2dvi (--force): Option removed. Always run tex at least
+ once, don't bother checking if .dvi file is newer than source.
+
+Fri Oct 30 02:16:28 1992 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/texi2dvi (-D): debugging option renamed from '-d'.
+ Made check to enable debugging more terse.
+ When checking if index files have changed, use
+ variable $this_file instead of $file in for loop.
+ (file_texi): wherever the variable $file was used to reference
+ the texinfo file, substituted $file_texi.
+
+Sat Oct 17 07:30:34 1992 Brian J. Fox (bfox@helios)
+
+ * util/texindex.c: Remove references to USG replacing them with a
+ define declaring the actual feature required or missing.
+
+Thu Oct 15 16:17:47 1992 Robert J. Chassell (bob@nutrimat.gnu.ai.mit.edu)
+
+ * emacs/texinfmt.el (texinfo-format-setfilename): Remove date from
+ Info file header so regression testing is easier.
+
+Tue Sep 15 16:28:35 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfmt-version): New variable.
+ (texinfo-format-setfilename): Include date and
+ version in Info file header.
+ Better documentation for @definfoenclose
+ Handle whitespace after @end iftex, etc.
+
+Thu Sep 3 09:25:37 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el: Fix typo re `texinfo-sequential-node-update.'
+
+Tue Aug 18 08:56:24 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-value): Revise syntax.
+
+ * emacs/texnfo-upd.el (texinfo-start-menu-description):
+ New function to insert title as description in a menu.
+ (texinfo-make-menu-list): Remove automatic title insertion.
+
+ * emacs/texinfo.el (texinfo-mode-map): Add keybinding for
+ texinfo-start-menu-description.
+
+Wed Jul 29 11:58:53 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-set): Revise to set a string to the flag.
+ (texinfo-value): @value{flag}: New command which inserts the
+ string to which the flag is set.
+
+Tue Jul 7 15:10:52 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el (texinfo-master-menu): Error message if file
+ contains too few nodes for a master menu.
+ (texinfo-insert-master-menu-list): Only attempt to insert detailed
+ master menu if there is one.
+
+Wed Jun 10 15:26:18 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-append-refill): Refill properly when lines
+ begin with within-paragraph @-commands.
+
+Tue Jun 9 12:28:11 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el: Add `texinfo-deffn-formatting-property' and
+ `texinfo-defun-indexing-property' to @deffn commands.
+
+Mon Jun 8 11:52:01 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el: Replace `(mark-whole-buffer)' with
+ `(push-mark (point-max) t) (goto-char (point-min))'
+ to avoid `Mark set' messages.
+
+Fri Jun 5 15:15:16 1992 Robert J. Chassell (bob@kropotkin.gnu.ai.mit.edu)
+
+ * emacs/texnfo-upd.el (texinfo-check-for-node-name): Offer section
+ title as prompt.
+ (texinfo-copy-next-section-title): Copy title correctly.
+
+Thu May 28 20:34:17 1992 Robert J. Chassell (bob@hill.gnu.ai.mit.edu)
+
+ * emacs/texinfmt.el: @vtable defined, parallel to @ftable, for
+ variables.
+ (texinfo-append-refill): set case-fold-search nil so @TeX is not
+ confused with @tex.
+
+Thu Mar 26 21:36:41 1992 Robert J. Chassell (bob@kropotkin.gnu.ai.mit.edu)
+
+ * emacs/makeinfo.el: Rename temp buffer from `*Makeinfo*' back to
+ `*compilation*' so `next-error' works; unfortunately,
+ `*compilation*' is written into the code as the name
+ `next-error' needs.
+ Rename `makeinfo-recenter-makeinfo-buffer' back to
+ `makeinfo-recenter-makeinfo-buffer'
+
+Thu May 14 21:14:25 1992 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/fixfonts: Enclosed most variable references with "" to prevent
+ potential globbing and other weirdness. Eliminated uses of
+ ${var-value}, which unfortunately isn't portable.
+
+ * util/texi2dvi: rewritten from scratch.
+
+Sat Apr 18 23:46:25 1992 Charles Hannum (mycroft@hal.gnu.ai.mit.edu)
+
+ * util/fixfonts: Re-evaluate prefix and libdir if inherited (to resolve
+ variable references from make).
+ (texlibdir): Don't add '/tex', since it's already there.
+
+Fri Apr 10 14:51:23 1992 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * util/fixfonts: set prefix and libdir only if they are not already
+ defined (i.e. not inherited from the environment).
+ Changed default path for libdir to be consistent with Makefile.
+
+Tue Mar 3 13:17:42 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el (texinfo-insert-master-menu-list): Insert a
+ master menu only after `Top' node and before next node.
+ (texinfo-copy-menu): Error message if menu empty.
+
+Mon Feb 24 15:47:49 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-format-region): Make sure region ends in a
+ newline.
+ (texinfo-itemize-item): Recognize all non-whitespace on same line
+ as @item command.
+
+Sat Feb 22 02:15:00 1992 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * util/texindex.c: New version 1.45 has cleanups, should compile under
+ VMS quietly.
+
+Wed Feb 12 10:50:51 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/makeinfo.el: Rename temp buffer as *Makeinfo*.
+ Rename `makeinfo-recenter-compilation-buffer'.
+ (makeinfo-buffer): Offer to save buffer if it is modified.
+ (makeinfo-compile): Do not offer to save other buffers.
+ (makeinfo-compilation-sentinel): Switch to Info file.
+
+Tue Feb 4 13:07:39 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-print-index): Format so that node names in
+ the index are lined up.
+
+Mon Feb 3 09:08:14 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-itemize-item): Format entry when text
+ is on the same line as @item command. Also, handle @-commands.
+ (texinfo-format-region, texinfo-format-buffer-1): Set fill column
+ to local value of Texinfo buffer.
+
+ * emacs/texnfo-upd.el (texinfo-pointer-name): Find only those
+ section commands that are accompanied by `@node' lines.
+
+Tue Jan 14 16:10:16 1992 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el: Ensure that no commands depend on the value of
+ case-fold-search.
+
+Fri Jan 10 15:13:55 1992 Robert J. Chassell (bob at kropotkin)
+
+ * emacs/texinfmt.el (texinfo-append-refill): Replace use of
+ unsupported function `looking-at-backward' with
+ `re-search-backward'.
+
+Mon Dec 23 23:46:42 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * util/texindex.c: Change POSIX ifdefs to HAVE_UNISTD_H and
+ _POSIX_VERSION.
+
+Mon Dec 16 15:01:36 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-append-refill): New function appends
+ @refill to all appropriate paragraphs so you no longer need to
+ append @refill command yourself.
+ (texinfo-format-region, texinfo-format-buffer-1,
+ texinfo-format-include): Call `texinfo-append-refill'.
+
+Fri Dec 6 01:25:09 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * util/texindex.c: Conditionalize on _AIX (which is predefined) instead
+ of AIX, just like makeinfo does.
+
+Tue Nov 26 10:21:04 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el (texinfo-section-types-regexp): `@subtitle' no
+ longer treated as subsection.
+
+Sat Nov 16 08:27:42 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * util/fixfonts: New file, from Karl Berry.
+
+Tue Nov 12 16:13:24 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el: Create @end smalllisp.
+
+Mon Nov 11 16:50:13 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfo.el (texinfo-environment-regexp): Add all other block
+ enclosing Texinfo commands.
+
+Thu Nov 7 10:23:51 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfo.el (texinfo-insert-@end): Attempt to insert correct end
+ command statement, eg, @end table. Fails with nested lists.
+ (texinfo-insert-*): Accept prefix arg to surround following N
+ words with braces for command.
+
+Thu Oct 31 21:31:41 1991 Robert J. Chassell (bob at kropotki)
+
+ * emacs/texinfmt.el (texinfo-clear): Clear flag even if flag not
+ previously set.
+
+Wed Oct 23 11:15:58 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfo.el (texinfo-mode): page-delimiter now finds top node as
+ well as chapters.
+
+Tue Oct 22 11:46:12 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-do-flushright): Test whether a line is too
+ long for the flush right command (line length must be less than
+ the value of fill column).
+
+ * emacs/texnfo-tex.el (texinfo-tex-buffer): Prompt for original file
+ even if point moved to *texinfo-tex-shell*.
+ texinfo-tex-original-file: variable to hold file name.
+
+Wed Oct 16 08:32:05 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-format-center): Expand string before
+ centering so @-commands not included.
+
+Thu Oct 10 22:01:47 1991 Robert J. Chassell (bob at kropotki)
+
+ * emacs/texnfo-tex.el (texinfo-show-tex-print-queue): Do not kill a
+ running process; do start a process none exists.
+
+Thu Sep 26 21:58:47 1991 Robert J. Chassell (bob at kropotki)
+
+ * util/texi2dvi: Misc. bugs fixed.
+
+ * emacs/texinfo.el: Remove extraneous references to TeX.
+
+Thu Sep 19 20:45:29 1991 Robert J. Chassell (bob at kropotki)
+
+ * emacs/texinfmt.el: add @cartouche as a noop (makes box with rounded
+ corners in TeX)
+
+Tue Sep 10 20:44:57 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el (texinfo-make-one-menu): Copy node-name correctly
+ for message.
+
+Thu Aug 29 17:54:07 1991 Robert J. Chassell (bob at kropotki)
+
+ * emacs/texnfo-tex.el (texinfo-quit-tex-job): Do not set mark.
+
+Wed Aug 21 10:36:21 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el: (texinfo-copy-menu-title): Copy title as it
+ should rather than node line.
+
+Mon Aug 5 15:27:12 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el (texinfo-format-convert): Changed regexp that
+ looks for three hyphens in a row to find those between word
+ constituent characters, as now, for Oxford Univ. style dashes and
+ also between spaces, for Cambridge Univ. Press style dashes.
+
+ * emacs/texnfo-tex.el (texinfo-tex-start-shell): Runs "/bin/sh" so
+ `explicit-shell-file-name' is not set globally.
+
+ * emacs/texnfo-upd.el: Rewrite messages.
+ (texinfo-find-higher-level-node): Stop search at limit.
+ (texinfo-copy-menu-title): Rewrite to handle outer include files.
+ (texinfo-multi-file-update): Update all nodes properly;
+ rewrite doc string and interactive.
+
+Sat Aug 3 10:46:13 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-upd.el (texinfo-all-menus-update): Fixed typo that
+ caused the function to create a master menu when it shouldn't.
+
+ * emacs/texinfo.el (texinfo-mode): Make `indent-tabs-mode' a local
+ variable and set to nil to prevent TABs troubles with TeX.
+
+Wed Jul 31 11:07:08 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texnfo-tex.el (texinfo-quit-tex-job): New function: quit
+ currently running TeX job, by sending an `x' to it.
+ (texinfo-tex-shell-sentinel): New function to
+ restart texinfo-tex-shell after it is killed.
+ (texinfo-kill-tex-job): Rewrite to use kill-process rather than
+ quit-process; uses `texinfo-tex-shell-sentinel' to restart
+ texinfo-tex-shell after it is killed.
+ (texinfo-tex-region, texinfo-tex-buffer): Replace
+ texinfo-kill-tex-job with quit-process.
+
+ * emacs/texinfo.el (texinfo-define-common-keys): Add keybinding for
+ texinfo-quit-tex-job
+
+Wed Jul 10 15:15:03 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el: New commands @set, @clear, @ifset...@end
+ ifset, and @ifclear...@end ifclear.
+ Definition functions rewritten to make them easier to
+ maintain.
+
+Wed Jul 3 19:37:04 1991 Robert J. Chassell (bob at kropotki)
+
+ * emacs/texinfmt.el (texinfo-format-deftypefn-index): Remove reference
+ to data-type to make consistent with texinfo.tex and makeinfo.
+ texinfo.el: Fix page-delimiter and texinfo-chapter-level-regexp
+ variables.
+
+Thu Jun 27 18:35:36 1991 Robert J. Chassell (bob at nutrimat)
+
+ * emacs/texinfmt.el: Add @dmn as `texinfo-format-noop'.
+ texinfo2.texi: Document @dmn.
+ texinfmt.el (texinfo{,-end}-{eleterate,ecapitate} renamed
+ {alphaenumerate, capsenumerate}.
+
+Fri Jun 14 12:46:32 1991 Robert J. Chassell (bob at churchy.gnu.ai.mit.edu)
+
+ * emacs/texinfmt.el (texinfo-format-defun-1): @defivar prints name
+ correctly.
+
+Thu Jun 6 21:38:33 1991 Robert J. Chassell (bob at churchy.gnu.ai.mit.edu)
+
+ * emacs/texinfo.el (texinfo-mode): Set page delimiter to
+ 'texinfo-chapter-level-regexp' so that page commands work by
+ chapter or equivalent.
+
+ * emacs/texinfmt.el (texinfo-format-defun-1): @defop prints name
+ correctly.
+ (batch-texinfo-format): replace unsupported
+ 'buffer-disable-undo' with 'buffer-flush-undo'
+
+Fri Apr 5 15:17:17 1991 Robert J. Chassell (bob at wookumz.gnu.ai.mit.edu)
+
+ * emacs/makeinfo.el (makeinfo-compilation-sentinel): Check for
+ existance of makeinfo-temp-file to avoid harmless error message.
+ texinfo2.texi: Minor typos fixed.
+
+Thu Mar 28 19:13:24 1991 Robert J. Chassell (bob at pogo.gnu.ai.mit.edu)
+
+ * util/texi2dvi: Revised.
+
+Mon Mar 11 12:35:51 1991 Robert J. Chassell (bob at grackle)
+
+ * emacs/texinfmt.el: (@footnotestyle): New command to set
+ footnotestyle.
+ (@paragraphindent): New command to set indentation.
+ (texinfo-format-refill): Add indentation feature so as to
+ indent paragraph or leave indentation asis before refilling
+ according to value set by @paragraphindent command.
+ (texinfo-format-region): Insert header, if any, into Info buffer.
+ (texinfo-format-separate-node, texinfo-format-end-node): Run
+ texinfo-format-scan on footnote text only once.
+ (texinfo-format-scan): Shorten `---' to `--'.
+
+ * emacs/texinfo.el: Define key for `texinfo-master-menu'; define
+ start and end of header expressions.
+
+ * emacs/texnfo-upd.el (texinfo-all-menus-update): Update
+ pre-existing master menu, if there is one.
+
+Fri May 11 14:36:07 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * util/texindex.c: Rename `lines' to `nlines'.
+ (bzero): Pass arg to lib$movc5 through non-register var.
+ (perror_with_file, pfatal_with_file): Move extern decls and includes
+ to top of file.
+ [VMS]: If not using VMS C, define away `noshare' keyword.
+ Include perror.h.
+
+Mon Jul 11 18:02:29 1988 Chris Hanson (cph at kleph)
+
+ * util/texindex.c (indexify): when comparing to initial strings to
+ decide whether to change the header, must use `strncmp' to avoid
+ comparing entire strings of which initials are a substring.
+
+Sun Jun 26 18:46:16 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * util/texindex.c (sort_in_core, sort_offline, parsefile):
+ Give up on input file if any line doesn't start with backslash.
+
+/* changelog for texinfo.tex before 19jun01. */
+
+2001-05-24 <karl@gnu.org>
+
+ * texinfo.tex (\smallbreak, \medbreak, \bigbreak): add check for
+ \ifnum\lastpenalty to plain tex definitions, so that we won't
+ insert space right after a section title.
+ (\aboveenvbreak): similar check of \lastpenalty.
+
+2001-05-21 <karl@gnu.org>
+
+ * texinfo.tex (\pdfurl): \let\value=\expandablevalue, so at least
+ some cases can be properly handled.
+
+2001-03-28 <karl@gnu.org>
+
+ * texinfo.tex: Copyright.
+
+ * texinfo.tex (\pdfmkdest): remove trailing @ in target names;
+ suggestion from: Reiner Schlotte <R.Schlotte@science-computing.de>.
+ (\imagexxx): call \normalturnoffactive so _ (among others) will be
+ allowed in filenames; report from arnold@skeeve.com.
+
+2001-02-02 <karl@gnu.org>
+
+ * texinfo.tex (\secondary): handle pdf case.
+ (\dosubind): secondary index entry not written as separate arg for
+ texindex.
+ From: Trevin Beattie <trevin@eyring.com>
+ Date: Tue, 21 Mar 2000 13:04:06 -0700
+
+2001-01-12 <karl@gnu.org>
+
+ * texinfo.tex (\dopdfimage): different syntax for filename
+ inclusion (foo vs {foo}). From: <Kurt.Hornik@ci.tuwien.ac.at>,
+ 22dec99.
+
+2001-01-08 <karl@gnu.org>
+
+ * texinfo.tex (\afivepaper): new command from Jose Romildo
+ Malaquias <romildo@urano.iceb.ufop.br>.
+
+2000-12-12 <karl@gnu.org>
+
+ * texinfo.tex: oops, had outside page reversed.
+
+2000-12-11 <karl@gnu.org>
+
+ * texinfo.tex (\inmargin): allow lefttext and righttext as args.
+
+2000-11-10 <karl@gnu.org>
+
+ * texinfo.tex: implementation of new commands @verbatim, @verb,
+ and @verbatiminclude from janneke@gnu.org.
+
+2000-11-09 <karl@gnu.org>
+
+ * texinfo.tex (\inmargin): rewrite to allow for placing the
+ material either in the right or left margin.
+
+2000-10-27 <karl@gnu.org>
+
+ * texinfo.tex (\dosynindex): new macro subroutine, do not
+ \closeout twice the index being redirected.
+ (\synindex, \syncodeindex): call it.
+
+2000-10-18 <karl@gnu.org>
+
+ * texinfo.tex (\inmargin): rewrite to allow argument to be vmode
+ material, such as a box from an image.
+
+2000-09-06 <karl@gnu.org>
+
+ * texinfo.tex (\doublecolumnout): must subtract \ht\partialpage
+ here, not in \begindoublecolumns. Otherwise the \partialpage on
+ the first page of double columns affects every subsequent page,
+ e.g., if @setchapternewpage off. Reported by Aharon Robbins
+ <arnold@skeeve.com> for standards.texi.
+
+2000-05-28 <karl@gnu.org>
+
+ * texinfo.tex (\linkcolor): replace Cyan with Blue.
+ (\output): do \pdfmkdest at top.
+ (\pdfmakeoutlines): set \_ to \normalunderscore.
+ From: Trevin Beattie <trevin@eyring.com>.
+
+2000-05-27 <karl@gnu.org>
+
+ * texinfo.tex (\today): only define if undefined.
+ From: Stepan Kasal <kasal@suse.cz>.
+
+2000-05-16 <karl@gnu.org>
+
+ * texinfo.tex (\deftypeivarheader): need defheaderxcond. From:
+ Marcel van der Boom <marcel@hsdev.com>.
+
+1999-10-01 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\afourwide): had hsize and vsize reversed.
+ From: Pascal Obry <pascal_obry@csi.com>
+
+1999-09-25 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\alias): fix from Andreas.
+
+1999-09-19 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\key): rename the \smallrm and \smallsy here.
+
+ * texinfo.tex (\indexfonts): rename to \smallfonts, along with
+ \indrm, etc.
+ Define all the fonts, too.
+ (\footnotezzz): use \smallfonts.
+
+ * texinfo.tex (\needx): get better leading; do nothing if @need
+ value is less than one linespace. From Arnold.
+ (\douref, \xrefX, \doemail [pdf]): make spaces normal again, so our
+ \ignorespaces commands are effective even in an @display.
+
+ * texinfo.tex (\finishtitlepage): remove FINISH TITLE debugging
+ message.
+
+ * texinfo.tex (\anchor): rewrite to always \ignorespaces.
+ Bug from esken.
+
+ * texinfo.tex (\indexnofonts): dummy up \acronym.
+ From: Thomas Esken <esken@nmlab.informatik.fh-dortmund.de>
+
+1999-09-06 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\texinfoversion): update.
+
+ * texinfo.tex: Avoid multiparagraph cells losing linespace between
+ paragraphs. From: Andreas Schwab <schwab@suse.de>.
+ Bug from: Lalo Martins <lalo@webcom.com>.
+
+1999-08-19 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\shortchaplabel): move computation of width of
+ "Appendix" inside, in case it's been changed by a language.
+
+Mon Aug 9 16:31:55 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: pdf updates from Han.
+
+Fri Aug 6 13:48:22 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\charcode): remove unused counter.
+ From: Akira KAKUTO <kakuto@fsci.fuk.kindai.ac.jp>.
+
+Thu Jul 22 19:08:19 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Update from Han.
+
+Tue Jul 20 17:13:16 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: More pdf improvements from Han.
+
+Mon Jul 19 16:33:31 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Better pdf support from: Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+Sun Jul 18 14:21:03 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: pdfimage takes braces.
+
+Tue Jul 6 19:40:14 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\deftypeop): New command.
+
+Mon Jul 5 17:17:33 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\contents): call \pdfmakeoutlines here instead of
+ inline (!).
+ (\pdfmakeoutlines): call \indexnofonts instead of making a separate
+ attempt at it.
+
+Tue May 25 06:16:06 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (time-stamp-format): use %02H.
+
+ * texinfo.tex: Had PDF and DVI transposed.
+
+Sun Apr 25 15:30:00 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\appendixletter): restore \the, necessary for .toc.
+
+Thu Apr 22 19:22:12 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\emergencystretch): Increase to .15\hsize.
+
+Tue Apr 20 05:11:04 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\defunargs): use \tensl\hyphenchar\font to work
+ better with Gildea's PostScript version.
+
+ * texinfo.tex (\tab): Change back to just &.
+ From: Nathan Sidwell <nathan@acm.org>.
+
+ * texinfo.tex: No \fi.
+
+Mon Apr 19 17:38:54 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\pdflink) [!\ifpdf]: define to ignore arg.
+
+ * texinfo.tex: Add pdf support. Merge from: Kurt Hornik
+ <Kurt.Hornik@ci.tuwien.ac.at>.
+
+Wed Mar 31 13:24:16 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\defopheader): missing word space before `on'.
+ Report from: Chris Hanson <cph@martigny.ai.mit.edu>.
+
+Fri Mar 26 17:00:41 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\imagexxx): Equalize space above and below if in
+ vmode. From rms.
+
+Thu Mar 25 20:00:00 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\deftypeivar): new command.
+
+Tue Mar 23 17:53:37 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (&): be sure active & is defined for @deftypefn
+ operator&.
+ Report from: Nathan Sidwell <nathan@acm.org>.
+
+Sat Mar 20 12:31:53 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\exampleindent): new command. From Yoshiki.
+
+ * texinfo.tex: Changes from Andreas to use \sl\$ inside italics
+ and to avoid extra spaces around @anchor.
+
+ * texinfo.tex (\image, \imagexx): move pdf test to imagexxx for
+ correct filename parsing.
+
+Mon Mar 15 16:51:20 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\imagexxx): reset catcode ^^M in case we're inside
+ in an example. Report from kama.
+
+ * texinfo.tex (\putwordin): new macro for word `in'.
+ (\xrefX): use it.
+ Report from: "Alexey A. Nikiforov" <A.A.Nikiforov@inp.nsk.su>
+
+Sun Feb 21 16:47:28 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Expand tabs.
+
+Sun Feb 14 16:02:29 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\paragraphindent): implement.
+ Suggestion from: Paul DuBois <dubois@primate.wisc.edu>.
+
+Tue Feb 9 07:25:07 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\alias): use def rather than \let.
+ Change timestamp format to include hours.
+
+ * texinfo.tex: New commands @alias and @definfoenclose.
+ From: "Eric S. Raymond" <esr@snark.thyrsus.com>.
+
+Mon Feb 8 14:46:56 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\scanmacro): Use \endinput to avoid spurious space,
+ and various other space fixes. From: Andreas Schwab
+ <schwab@ls5.informatik.uni-dortmund.de>.
+
+Thu Feb 4 15:24:40 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\uref): implement optional third arg.
+
+ * texinfo.tex (\dosubind): Include index entry in third arg to
+ \entry instead of writing as bogus fourth arg.
+ Report from: kama@hippo.fido.de (Karl Heinz Marbaise).
+
+ * texinfo.tex (\setemergencystretch): Increase somewhat.
+
+ * texinfo.tex (\putwordof): rename from \putwordOf.
+ * texinfo.tex (defivarhead, \defcvarheader): Use \putwordof.
+
+Tue Feb 2 16:57:00 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\documentlanguage, \documentencoding): new
+ commands. \documentlanguage based on an implementation by kama.
+
+Sat Jan 30 17:23:45 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\putwordMMai): Should be MMay. From Trond.
+
+Fri Jan 29 17:52:16 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Fix @macro expansion inside @section. Patch from
+ Andreas:
+
+ From: Andreas Schwab <schwab@ls5.informatik.uni-dortmund.de>
+
+ The general idea is to construct a list a all defined macros in
+ the form \do\macro1\do\macro2..., then temporarily define
+ \do to something appropriate and execute the list to do
+ whatever is needed. Here is a patch, and i have also
+ fixed a few other bugs that i found while browsing through
+ the @macro implementation. Additionally i have added a
+ check to prevent the user from doing silly things like
+ @macro shipout.
+
+Sun Jan 24 09:59:42 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\obstexwarn): Don't use *** in message, it
+ interferes with make output parsing.
+
+Thu Jan 21 15:45:20 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Internationalization improvements from kama.
+
+Wed Jan 20 17:12:52 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\contents, \shortcontents): Run \contentspagealignmacro.
+ From: Trond Endrestol <trond@agamemnon.gtf.ol.no>
+
+Thu Jan 14 16:53:43 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\begindoublecolumns): Ship out \partialpage
+ immediately if it is nonvoid, instead of saving it. This avoids a
+ bug where the index could end up printing one line per page (see
+ the indexspread.tex test).
+ From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * texinfo.tex (\image): If running pdftex, do \pdfimage{imagefile.pdf}.
+ From: Samuel Tardieu <sam@inf.enst.fr>
+
+ Also, update copyright year.
+
+Tue Jan 5 17:50:45 1999 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\enddoublecolumns): Move \pagegoal reset to after
+ the \endgroup so we get the restored single-column \vsize
+ as intended.
+
+Sun Dec 20 17:57:22 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\indexdummies): Set \{ and \} to \mylbrace and
+ \mybrace to avoid braces in the index file, which
+ texindex can't handle.
+
+Sat Dec 19 18:13:16 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\pickupwholefraction): Ignore whole-number part.
+ (\setuptable): Always pass whole-number part and decimal point. This
+ allows leading zeroes.
+ Suggestion from: Ben Bullock <ben@hayamasa.demon.co.uk>.
+ Date: Fri, 21 Aug 1998 14:06:50 +0100 (BST)
+
+Tue Dec 15 16:38:07 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\indexdummies): set \{ and \} to \lbracecmd and
+ \rbracecmd to avoid lossage if @tex is active during \shipout.
+ Report from: "Peter Kabal" <Kabal@ece.mcgill.ca>.
+
+Sun Dec 6 17:11:17 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Doc fix.
+
+1998-11-11 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * doc/texinfo.tex (\onepageout): Put the cropmarks in vboxes of
+ zero height so that they don't contribute space themselves.
+ Compensate for \topandbottommargin.
+ (\internalpagesizes): Advance \outervsize by 2\topandbottommargin,
+ not only 0.6in.
+
+Fri Nov 6 17:27:57 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex: Use standard time-stamp.el package instead of
+ update-date.el.
+
+Sat Oct 31 19:23:02 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\indexnofonts,\indexdummies): add \url and \uref to
+ list.
+
+Fri Oct 30 08:16:23 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (\expandablevalue): Delete spurious `v' character.
+
+Tue Oct 27 11:18:40 1998 Karl Berry <karl@gnu.org>
+
+ * texinfo.tex (@env, @command, @option): Must disable for index
+ and xref commands. Also, \input plain if necessary before
+ using {} in the version number.
+
+Wed Sep 30 11:40:36 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Use date as version number instead of RCS, and
+ update-date to update it.
+
+Thu Sep 17 13:22:44 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Fix @macro expansion of @code with _ in the
+ argument.
+ From: Zack Weinberg <zack@rabi.columbia.edu>.
+
+Fri Aug 28 10:30:29 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\itemzzz): take \itemmargin into account when
+ unhboxing. Reported by Bob.
+
+Fri Aug 14 16:56:58 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Change @defun environments so that right margin is
+ not changed, and instead the defun type label is outdented
+ into the margin.
+
+Thu Aug 13 13:31:41 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\smartslanted): define this separately from
+ \smartitalic.
+ (\emph, \i): use \smartitalic for true italics.
+
+Mon Aug 10 11:51:13 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\value): handle active _ or - in argument (happens
+ if called from @code).
+ Report from: Dave Love <d.love@dl.ac.uk>.
+
+Sun Jul 19 09:49:23 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\dosubind): Don't do \vskip to preserve \lastskip
+ unless we are in vertical mode. Otherwise we might end a
+ paragraph prematurely, and \folio won't get expanded by
+ \output.
+ Report from: "Richard E. Stone" <res@rstone.mn.org>
+
+Thu Jul 16 15:33:37 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Keep track of how negative the page numbers have
+ gotten:
+ (\lastnegativepageno): New \count register.
+ (\startcontents): Use it.
+ (\contents, \summarycontents): set it.
+
+Mon Jul 13 16:58:11 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\imagexxx): Add some space around the image if it's
+ by itself.
+
+1998-07-09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * texinfo.tex (chapterzzz): Put a space before the chapter number
+ in the message.
+ (appendixzzz): Use \putwordAppendix in the message.
+
+Thu Jul 9 08:39:53 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\macro): Globalize assignments since it's done
+ inside a group. From Zack.
+
+Mon Jul 6 17:21:25 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\comment): Speed up.
+ (\loggingall): Turn on eTeX's extended tracing.
+ More macro fixes.
+ Date: Sat, 04 Jul 1998 14:51:49 -0400
+ From: Zack Weinberg <zack@rabi.phys.columbia.edu>
+
+Thu Jul 2 10:20:32 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\contents, \summarycontents, \startcontents): Use
+ roman numerals for toc, arabic outside, even when toc is
+ at the beginning.
+
+Mon Jun 29 10:05:28 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\anchor): New command @anchor.
+ (\xrefX): Avoid double space when xref to an @anchor or an @unnumbered.
+
+ * texinfo.tex (\itemzzz): Use kerns and \unhbox when item text
+ fits in the space, so footnotes can work.
+
+ * texinfo.tex (\setref): Take additional argument for the -snt
+ xref. Call \indexdummies.
+ (\donoderef, \appendixnoderef, \unnumbnoderef): Change \setref calls.
+
+Sat Jun 27 19:16:34 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\contents, \summarycontents): Must not be \outer.
+
+Fri Jun 26 16:15:14 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\writetocentry): New macro.
+ (\chapternofonts): No longer needed.
+ (\chapter, ..., \unnumberedsubsubsec): Change all the sectioning
+ commands to call \writetocentry instead of doing it inline.
+ Also, do not call \chapternofonts, we avoid expansion with
+ \the\toks instead.
+ (\opencontents): No longer needed, instead \writetocentry opens
+ the file when necessary.
+ (\setfilename): Don't call \opencontents.
+ (\ifsetcontentsaftertitlepage, \ifsetshortcontentsaftertitlepage):
+ New conditionals.
+ (\Etitlepage): Call \contents and/or \shortcontents if
+ conditionals are set.
+
+ Global: use \nobreak instead of \penalty 10000 for epsilon efficiency.
+
+Thu Jun 25 08:29:32 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\option,\env,\command): New markup commands.
+ Suggested by arnold@gnu.org.
+
+ * texinfo.tex (\afourpaper): More reasonable margins.
+ From: Wilhelm Mueller <muewi@hb.senbvs43.uni-bremen.de>
+ Date: Thu, 25 Jun 1998 10:48:13 +0200 (MET DST)
+
+Wed Jun 24 17:46:43 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\acronym): New Texinfo command.
+
+Tue Jun 23 17:36:39 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\dots, \enddots): Missing \leavevmode.
+ Report from: Thomas Esken <esken@nmlab.informatik.fh-dortmund.de>
+ Date: Tue, 23 Jun 1998 14:22:27 +0200 (MET DST)
+
+Mon Jun 22 16:00:53 1998 Karl Berry <karl@north>
+
+ * texinfo.tex: Rewrite of index stuff to do better column breaking
+ and balancing.
+ The old code failed miserably when the index was just the wrong size,
+ e.g., the Autoconf manual with @afourpaper.
+ Bug report from: Wilhelm Mueller <muewi@hb.senbvs43.uni-bremen.de>
+ Date: Fri, 12 Jun 1998 16:34:49 +0200 (MET DST)
+ (\initial): Add more glue around the initial, and make it a
+ multiple of \baselineskip.
+ (\entry): Add glue before each entry so the columns can always be the
+ same height.
+ (\doublecolumnout): Available space no longer needs to handle
+ \partialpage specially.
+ (\pagesofar): Take \ht\partialpage into account with \vsize.
+ (\enddoublecolumns): Reset \output to avoid calling
+ \balancecolumns twice
+ (\balancecolumns): Format for readability.
+ (\initialskipamount): No longer needed, remove.
+
+ (\hbadness): Increase a bit, boxes that are a little underfull look ok.
+
+Sun Jun 21 16:48:38 1998 Karl Berry <karl@north>
+
+ * texinfo.tex (\ninettsl): cmsltt10 is not standard, so use
+ cmsltt10 scaled 900.
+ Date: Mon, 15 Jun 1998 12:35:41 +0200 (MET DST)
+ From: Werner Struckmann <struck@ips.cs.tu-bs.de>.
+
+Thu Jun 18 08:32:15 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: @macro fixes from Zack Weinberg
+ <zack@rabi.phys.columbia.edu>.
+ - @ifblah did not work inside @macro
+ - spaces in parameter lists in macro definitions caused errors
+ - leading spaces in parameter lists in macro invocations were
+ preserved inappropriately.
+
+Wed Jun 10 16:50:53 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\smallformatx, \smalldisplayx): New macros.
+ (\smallbook): Arrange to use them.
+ (\display, \flushleft, etc.): Rewrite to avoid duplication.
+
+Sun Jun 7 18:13:45 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\pagesizes): Rename to \internalpagesizes.
+ (\custompaper): Rename to \pagesizes.
+
+Sat Jun 6 13:16:32 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Rewrite paper size definitions, add @custompaper.
+
+ * texinfo.tex: Fix for macros in arguments to other commands.
+ From Zack.
+
+Thu Jun 4 11:21:07 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Better @macro implementation.
+ From: Zack Weinberg <zack@rabi.phys.columbia.edu>.
+
+Tue May 26 17:43:21 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\imagexxx): Center image if it is not part of a
+ paragraph.
+
+Tue May 19 17:17:12 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: \linkstrue by default.
+ Also, first implementation of @macro; can only handle some cases,
+ but that is better than nothing.
+ From: Zack Weinberg <zack@rabi.phys.columbia.edu>
+
+Thu May 14 17:32:47 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: New command @novalidate along the lines of makeinfo
+ --no-validate.
+ Date: Sun, 26 Oct 1997 18:54:47 -0500
+ From: Zack Weinberg <zack@rabi.phys.columbia.edu>
+
+Tue May 12 16:19:35 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\valuexxx): Split up into expandable and
+ non-expandable parts.
+ (\expandablevalue): New macro.
+ (\indexdummies): \let\value = \expandable value.
+
+ * texinfo.tex: Doc fixes.
+
+ * texinfo.tex (\doind): Just call \dosubind with empty third arg.
+ (\dosubind): Replace with \doind definition and suitable code to handle
+ possible third arg. And propagate glue past the whatsit from the
+ \write so index entries don't cause extra space between
+ @defuns (for example).
+
+Wed May 6 12:51:27 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\deftypemethparsebody): Handle the extra arg in
+ @deftypemethodx, too.
+ (\deftypefunx): Error definition was misspelled as \deftypeunx.
+
+Fri May 1 17:31:58 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo/texinfo.tex (\putwordon, \putwordMethodon): New macros.
+ Use in \def... commands.
+ (\indexdummies): make `\ ' be just ` ' for sorting.
+ (\deftypemethparsebody): New macro.
+ (\defmethod): Call it.
+ Various doc fixes.
+ Repored by: KHMarbaise@p69.ks.fido.de (Karl Heinz Marbaise)
+ Date: Wed, 07 Jan 1998 10:19:42 +0100
+
+Fri Apr 10 16:54:48 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: @cartouche: Align right side correctly.
+ From: dale.smith@bellhow.com (Dale Smith)
+ Date: Fri, 06 Mar 1998 14:47:02 GMT
+
+Sun Apr 5 17:19:03 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\dosetq): Use \normalturnoffactive instead of just
+ \turnoffactive, so \'s in node names are handled properly.
+ (\tie): Move definition to more rational position in the file.
+ (\@, \{, etc.): Use decimal numbers in all cases, to avoid use of '.
+ Paranoia only.
+ (\+): Turn off once and for all at the beginning, and define as
+ \tabalign in @tex.
+
+Tue Mar 31 19:33:31 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\synindex, \syncodeindex): \closeout the redirected
+ index.
+ From: Jakob Stoklund Olesen <stoklund@mi.aau.dk>
+
+ * texinfo.tex (\doignore): Ignore everything after `c', so @end
+ ifinfo and the like can be commented out.
+ (\macrocsname): New macro.
+ Reported by: "James A. Lupo" <lupoja@feynman.ml.wpafb.af.mil>
+
+Wed Feb 25 15:48:51 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\doprintindex): Change catcode of @ before \read,
+ in case of \initial{@} being the line that is read.
+ Reported by: Drew Csillag <drew_csillag@geocities.com>
+
+ * texinfo.tex (\dotable): Add \leftskip to \hsize in the first column.
+ Don't inherit \rightskip from surrounding environment.
+ Set \item to \crcr to avoid empty first row.
+ Prepend \parskip glue before table.
+ Set \everycr locally outside of alignment, don't reset it
+ explicitly in \Emultitable.
+ All from Andreas Schwab, to avoid overfull hboxes.
+
+ Also, work on leading commentary in file a bit.
+
+Tue Feb 24 17:48:29 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: \!: Save and restore this for @tex.
+ From: Jean-Pierre Moreau <jpmoreau@ciframedical.com>
+ Date: Fri, 22 Aug 1997 16:47:36 -0400
+
+ * texinfo.tex (\angleleft, \angleright): New macros.
+ (\refx, \email, \key): Use them.
+ From: Stephen Gildea <gildea@intouchsys.com>
+ Date: Fri, 26 Dec 1997 11:43:32 EST
+
+Mon Feb 23 17:34:23 1998 Karl Berry <karl@cs.umb.edu>
+
+ 1997-08-28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ * doc/texinfo.tex (xrdef): Read the second argument with \
+ as an escape character.
+
+1998-01-22 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * texinfo.tex (\tocentry): Don't \turnoffactive before typesetting
+ the arguments, it causes special characters to be printed
+ incorrectly.
+
+Mon Jan 19 10:58:25 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texi2html: Correct version number, home page reference.
+
+Sat Jan 17 15:12:03 1998 Karl Berry <karl@cs.umb.edu>
+
+ * texi2html: Version 1.54. Handle @image better, etc.
+ * From: Bob Friesenhahn <bfriesen@simple.dallas.tx.us>.
+
+Wed Dec 24 13:59:07 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\dots, \enddots): Use current font instead of
+ always using math italic. From Stephen Gildea.
+
+Tue Dec 23 11:33:07 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: Spurious xepsf.tex should be epsf.tex.
+
+Mon Oct 13 15:49:28 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\titlefont): Explicitly set \rm.
+
+Sat Jul 26 15:12:37 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\email): Let to \uref instead of \code, as a second
+ optional argument makes sense for this, too.
+
+Mon Jul 14 13:43:43 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\indexdummies): Add \value.
+
+Thu Jul 10 13:34:30 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\authorrm): Must use \def instead of \let, as
+ \secrm is not yet defined.
+
+1997-07-09 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * texinfo.tex (\titlefont): Define again, using \titlefonts.
+
+Wed Jul 9 16:45:30 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\startcontents): Leave ^ catcode as other.
+
+Sat Jul 5 17:16:40 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\titlefonts): New macro to set title font styles,
+ so italic etc. work in @title.
+ (\titlefont): No longer needed.
+ (\titlepage): Call \titlefonts instead of \titlefont.
+ (\chapsf, \ssecsy, \ssecttsl): Correct magstep values.
+ From: Stephen Gildea <gildea@intouchsys.com>.
+
+ * texinfo.tex (\onepageout): Back up to 2\baselineskip per Stephen.
+ (\kbdinputstyle): New command.
+
+1997-04-03 00:07:28 1997 Richard Stallman <rms@gnu.ai.mit.edu>
+
+ * texinfo.tex (\kbdfont, \kbdexamplefont): New macros, parms that
+ tell @@kbd what to do.
+ (\setkbdinputdistinct, \setkbdinputexample): New commands set them.
+ (\kbd): Use those parms.
+
+Thu Jul 3 16:52:39 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\onepageout): Leave only one line space above the
+ footline, to be more like plain. Suggested by Stephen Gildea.
+ (\evenfootline): Left one too many line spaces here, so reduce by two.
+
+ (\ifnottex): Another ignore command.
+ (\ifnothtml,\ifnotinfo): New commands.
+ (\doignore): Ignore brace characters, so mismatched braces in ignored
+ text do not cause complaints.
+
+Fri Jun 27 15:09:16 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\image): New definition for new @image command.
+
+Wed Jun 18 15:58:20 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\oddfootingxxx),
+ (\onepageout): Leave space for the footline if present.
+ (\everyfootingxxx, \everyheadingxxx): Call \oddfootingxxx and
+ \evenfootingxxx instead of repeating their code. From: Stephen
+ Gildea <gildea@intouchsys.com>.
+
+ (\setfilename): Read texinfo.cnf if present.
+
+ (\indexdummies, \indexnofonts): No-op additional commands @result @equiv
+ @expansion @print @error @point. From: Dave Bodenstab
+ <imdave@ais.net> (for texi2www doc).
+
+Fri Jun 6 10:31:34 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\setmultitablespacing): Restore bad typing mistake
+ from yesterday.
+
+Thu Jun 5 18:04:26 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\uref): Write real definition, taking one mandatory
+ argument and one optional one.
+
+Wed Jun 4 17:16:09 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\mainmagstep): Define this as a \count variable
+ instead of with \let, to make changing to \magstep1 more transparent.
+ From: HERBERT@boevm4.vnet.ibm.com.
+ (\uref): New command a la \url.
+
+Sat May 24 18:06:41 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\deftypemethod, \deftypemethodheader): New macros
+ to implement new commands @deftypemethod and @deftypemethodx.
+ Suggestion from: KHMarbaise@p69.ks.fido.de (Karl Heinz Marbaise).
+
+Wed May 21 17:17:52 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\opnr, \clnr): Increment/decrement \parencount, for
+ @defun lines with nested parens. From Bill Schelter
+ <wfs@fireant.ma.utexas.edu>.
+ (\itemizeitem): Correct \errmessage.
+
+Mon May 19 17:34:40 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\codeunder): Use \_ and \ifusingtt to avoid
+ dotaccent from _ in roman fonts, e.g., @deftypefn.
+ (\tex): Remove spurious spaces at the end of subdefinitions.
+ From: "John W. Eaton" <jwe@bevo.che.wisc.edu>.
+ (\url, \email): \let to \code; no quotes or angle brackets.
+
+Mon May 5 17:06:35 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\onepageout): \ifcropmarks, center the page body.
+ Lost this when merged \croppageout with \onepageout. Found by
+ Arnold.
+
+ (\doprintindex): Do not bother to go into double column mode unless
+ there actually is a non-empty index.
+
+ (\begindoublecolumns): Include any existing \partialpage in the new one,
+ lest we lose a whole page of output. Found by M J Morley
+ <mjm@scs.leeds.ac.uk>.
+
+ (\chapternofonts): Remove spurious spaces, both in the definitions that
+ get output to the aux file(s) and in this macro.
+
+ Fix comments and rationalize whitespace in various other places.
+
+Sun Apr 27 15:41:16 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\chapter, etc.): Avoid expansion of section title
+ when writing the toc.
+
+Thu Apr 24 16:35:46 1997 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\onepageout): Integrate cropmarks case here,
+ instead of having a completely different routine.
+ (\croppageout): Remove this.
+
+Sun Jun 9 14:26:42 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\ignoremorecommands): Ignore \defcodeindex, and do
+ not ignore \message.
+
+Thu Apr 11 12:59:42 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\macro): New macro.
+ (\enddots, \endldots): New macros.
+ (\centerchap, \centerchapyyy): New macros.
+ (\centerchfplain, \centerchfopen): New macros.
+ (\CHAPFplain, \CHAPFopen): Set \centerchapmacro.
+
+Wed Mar 13 11:42:17 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\url): New macro, like \samp for now.
+
+Sun Mar 10 13:05:08 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex: Changes in @multitable code.
+ Change meaning of @multitablelinespace.
+
+Tue Mar 5 18:56:08 1996 Dave Love <d.love@dl.ac.uk>
+
+ * texinfo.tex (\set): Set catcode of space explicitly (inside a
+ group) to avoid losing inside @example, say.
+
+Sun Mar 3 17:01:27 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\itemxpar): Protect the \vskip here with \nobreak,
+ to avoid a possible page break at an @itemx.
+
+Sun Feb 25 14:53:15 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\obstexwarn): Use \global to avoid ever getting the
+ warning twice.
+
+ * texinfo.tex (\include): Allow underscores and other such
+ characters we made active in the file name argument.
+
+Tue Feb 6 15:06:27 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\afourlatex): Delete the old duplicate definition
+ of \afourlatex.
+
+Sun Feb 4 15:20:16 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\tab): New definition.
+ (\setuptable): Fix previous change.
+ (\multitablecolspace): Renamed from \multitablecolmargin.
+ (\multitablelinespace): Renamed from \multitablelineskip.
+
+Fri Feb 2 02:20:16 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\multitableparskip): Renamed from \intableparskip.
+ Allocate with \newskip.
+ (\multitableparindent): Renamed from \intableparindent. Use \newskip.
+ (\multitablelineskip): Renamed from \spacebetweenlines. Use \newskip.
+ (\multitablecolmargin): Renamed from \spacebetweencols.
+ (\columnfractions): Renamed from \percentofhsize.
+ (xcolumnfractions): Renamed from \xpercentofhsize.
+
+ * texinfo.tex (\setuptable): Handle >1 digits after @percentofsize.
+ (\pickupwholepercent): New macro.
+
+Sun Jan 28 21:14:46 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\key, \kbdfoo): Use \ttsl unconditionally.
+ (\setkeyfont): Definition deleted.
+
+Tue Jan 23 14:57:23 1996 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex: @kbd within @example selects slanted tty font:
+ (\ttsl, \ttslshape): Define this new font shape.
+ (\kbdfoo): Set the font to \ttsl if already using \tt.
+ (\setkeyfont, \ifmonospace): New macros.
+
+Wed Jan 17 23:57:48 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\changepagesizes): Additional arg for topskip.
+ (\afourlatex): Total rewrite.
+ (\afourwide): Pass new arg to \changepagesizes.
+
+Wed Jan 3 17:15:00 1996 Stephen Gildea <gildea@x.org>
+
+ * texinfo.tex (\slbshape, \itbshape): Use bold slant and and
+ bold italic in titles to match the bold roman. Do not use
+ bold sf or bold tt, which would be too heavy.
+
+ * texinfo.tex (\setfont): Pass font name in more pieces.
+ (\*shape): New macros defining symbolic names for all font
+ shapes so can use other font families with different naming
+ conventions.
+
+Wed Jan 3 15:52:18 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\ignoremorecommands): Turn off @everyheading and
+ friends, @headings, @setchapternewpage, @setchapterstyle.
+
+Sat Dec 30 17:20:48 1995 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\inmargin): Don't allow a break before the vertical
+ kern. Do allow a whole paragraph of marginal text, not just one line.
+ Use \inmarginspacing.
+
+Thu Dec 28 23:22:08 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\inmargin): New command @inmargin.
+ (\dircategory): Ignore @dircategory.
+
+Tue Dec 12 17:25:36 1995 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\lvvmode): Remove this; use \leavevmode as usual,
+ so spaces/underscores at beginnings of lines inside @example work.
+ Bogus index entries should be (and now are, I think) handled in
+ other ways.
+
+Mon Nov 13 16:07:09 1995 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\xrefX): Test for xref-automatic-section-title
+ being @set correctly, and remove spurious redefinition of
+ \printednodename in that case.
+
+Mon Oct 16 15:16:34 1995 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\unsepspaces): New macro to make active space
+ expand into a normal space char in index entries.
+ (\indexdummies): Use \unsepspaces.
+
+Thu Oct 12 14:56:52 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\tie): Use \lvvmode, not \leavevmode.
+ Don't use \@M directly either.
+
+Sun Aug 27 21:17:09 1995 Paul Eggert <eggert@twinsun.com>
+
+ * texinfo.tex (\appendixsection): Fix misspelled defn.
+
+Mon Jul 31 23:57:57 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\ttfont): Don't call \nohyphenation.
+
+Sun Jul 30 18:30:47 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\tocentry): Use \turnoffactive.
+
+Sun Feb 5 05:34:13 1995 Richard Stallman <rms@pogo.gnu.ai.mit.edu>
+
+ * texinfo.tex (\boldbraxnoamp): New function.
+ (\deftypefunargs): Use that, not \boldbrax.
+
+Tue Jan 31 12:15:28 1995 Karl Berry <karl@cs.umb.edu>
+
+ * texinfo.tex (\set): Use \gdef, not \xdef.
+
+Sat Jan 21 16:39:36 1995 Richard Stallman <rms@pogo.gnu.ai.mit.edu>
+
+ * texinfo.tex: Initially make _ and + \active,
+ then later make them \other.
+ (\otherifyactive): New command.
+
+Thu Jan 19 21:59:22 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\afourwide): New command.
+
+Mon Jan 16 09:29:38 1995 Stephen Gildea <gildea@x.org>
+
+ * texinfo.tex: Initially make + and _ "other" characters.
+ (\fixbackslash, \everyjob): Make + and _ active characters.
+
+Tue Jan 10 19:16:09 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex: At beginning, \input plain if necessary.
+ (\deftypefunargs): Use \boldbrax, not \functionparens.
+
+Sun Dec 18 16:40:11 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\indsc): Use csc10 (at 9pt), not indrm.
+
+Mon Oct 31 00:51:20 1994 Richard Stallman <rms@pogo.gnu.ai.mit.edu>
+
+ * texinfo.tex (\changepapersizes): Fix definition syntax.
+ (\fontprefix): Define only if not yet defined.
+
+ * texinfo.tex (\margin): Define a new insert.
+ (\SETmarginindex): Initialize to \relax.
+ (\doindex): Optionally put the entry in the margin.
+ (\pagecontents): Print the index entries put in the margin.
+
+Sat Oct 29 19:50:10 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\auxhat): New macro.
+ (\dosetq): Use \auxhat.
+ (reading the aux file): Give ^ catcode 7.
+
+Wed Oct 26 03:28:04 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\setfont): New macro. Use it for specifying
+ most of the fonts that are normally cm fonts.
+ (\fontprefix): New macro, normally `cm'.
+
+Mon Oct 24 01:27:09 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\startcontents): Set catcode of ^.
+
+Thu Oct 13 02:19:43 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\ifhtml, \html, \enddots, \?, \!): New commands.
+
+Fri Sep 16 16:30:52 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\defheaderxcond): New macro.
+ (\deftypefnheaderx): Use defheaderxcond when calling defname.
+ (\deftypefunheaderx, \deftypevarheader, \deftypevrheader): Likewise.
+
+Fri Aug 26 03:08:08 1994 Amy Hendickson <amyh@ai.mit.edu>
+
+ * texinfo.tex (\multitable): New command.
+
+Mon Aug 1 14:28:57 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * texinfo.tex (\changepagesizes, \afourlatex): New macros.
+
+Tue Jul 12 11:45:58 1994 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\quotation): Set \parskip to zero to avoid extra
+ space below the environment.
+ (\quotation): Clean up comments and indentation.
+
+Wed Jul 13 05:36:40 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Put back, and correct, the test of
+ SETxref-automatic-section-title.
+
+Thu Jul 7 15:57:52 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * Set catcodes of chars 128-255 to \other.
+
+Mon Jul 4 15:32:41 1994 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\tie): Set \catcode of @ to 11 before using \@M.
+
+ * texinfo.tex (\xrefX): Undo \turnoffactive while printing the node
+ name, so _ in node names doesn't come out as the dot accent.
+
+Sat Jul 2 14:49:26 1994 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\tie): Ensure we're in horizontal mode before the
+ \penalty.
+
+Tue May 10 01:21:28 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\donoderef, \unnumbnoderef, \appendixnoderef):
+ Set \lastnode globally.
+
+Sun Apr 17 15:35:43 1994 Karl Berry (karl@ra.cs.umb.edu)
+
+ * texinfo.tex (\~): Define to be a tie.
+ (\ptextilde): New defn to save the plain's tilde accent.
+ (\tex): Restore plain tilde.
+
+Sun Mar 27 23:35:17 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\smallbook): Set \defbodyindent and \deftypemargin.
+
+Sun Mar 20 19:47:59 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Define and use \correctnodename.
+ (@turnoffactive): Move after @ becomes available
+ and turn off backslash as well as other chars. Use @realbackslash.
+ (@normalturnoffactive): Like @turnoffactive but use @normalbackslash.
+
+Sat Mar 19 12:26:25 1994 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\singlespaceskip): Increase to 12.5pt.
+ (\singlespace): Call \setleading instead of just assigning to
+ \baselineskip, so the strut box will be reset.
+ (\smalllispx): Likewise.
+
+Sun Mar 13 20:32:28 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\dots): Change back to \ldots.
+
+Sat Mar 12 22:34:10 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\indexnofonts): Add %'s to suppress newlines after \def.
+
+Sat Feb 26 15:51:37 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\deftexinfoversion): New macro.
+ (\texinfoversion): Define using \deftexinfoversion.
+
+Wed Jan 26 12:40:52 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\putwordSee, \putwordInfo, \putwordfile)
+ (\putwordChapter, \putwordAppendix, \putwordSection)
+ (\putwordsection, \putwordpage)
+ (\putwordTableofContents, \putwordShortContents): New macros.
+ Used in various places instead of fixed words.
+
+Mon Jan 24 22:51:36 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\ignoremorecommands): Turn off @item and @message.
+
+Thu Jan 20 17:01:53 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\indexnofonts): Treat accents as dummies.
+ Turn modified European letters into one or more ordinary letters.
+
+Tue Jan 18 14:54:32 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\indexdummies): Handle tex accents and European letters.
+
+Wed Nov 24 16:11:51 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\dots): Use $\,$ for spacing.
+
+Sun Nov 21 22:16:21 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\dots): Avoid using \ldots; use periods and kern.
+ (\indexdotfill): Use italic periods.
+
+Fri Nov 19 20:50:31 1993 Roland H. Pesch (pesch@apple-gunkies.gnu.ai.mit.edu)
+
+ * texinfo.tex (\deftypefunargs): use \tclose rather than \code to
+ avoid side effects on active chars
+
+Tue Sep 28 16:01:58 1993 Roland H. Pesch (pesch@apple-gunkies.gnu.ai.mit.edu)
+
+ * texinfo.tex (\obeyedspace defn): remove blank after \sepspaces
+ (left destructive penalty in vertical list)
+
+Mon Aug 30 14:17:27 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * texinfo.tex (\setref, \unnumbsetref, \appendixsetref): Uncomment
+ \dosetq for title.
+ (\Ytitle): Define as \thissection instead of \thischapter.
+ (\xrefX): If there is no printed-title arg given, and @ifset
+ xref-automatic-section-title, try to use the real section title.
+
+Tue Jul 27 12:47:24 1993 Charles Hannym (mycroft@trinity.gnu.ai.mit.edu)
+
+ * texinfo.tex (\ifitemxneedsnegativevskip): New \if; set immediately
+ following a short \item.
+ (\itemxpar): \par and then if \ifitemxneedsnegativevskip is set, do
+ a \vskip-\parskip.
+ (\internalBitemx, \internalBxitemx, \internalBkitemx): Use \itemxpar
+ rather than \par.
+ (\itemzzz): Set \ifitemxneedsnegativevskip as appropriate.
+
+Thu Jul 22 16:08:33 1993 Charles Hannum (mycroft@trinity.gnu.ai.mit.edu)
+
+ * texinfo.tex (\titlezzz, \finishtitlepage): Explicitly make hrules
+ have a width of \hsize so they aren't too long in smallbook format.
+
+Tue Jun 29 15:56:19 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\deftypefnheaderx): call \normalparens to permit
+ normal typesetting of strings (e.g. for C++ docn) containing `&'
+
+Fri Jun 25 14:08:44 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\nestedignore): turn off \ind... fonts too
+ (primarily for use within @smallexample)
+
+Wed Jun 23 11:58:48 1993 Jim Kingdon (kingdon@wombat.gnu.ai.mit.edu)
+
+ * longopts.table: Update GDB options.
+
+Sun Jun 20 22:00:11 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * lgpl.texinfo: Use @smallexample instead of @example. Reformat
+ example disclaimer to avoid overfull \hbox.
+
+Mon Jun 14 04:09:47 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\entry): Don't make a line of dots
+ if there are no page numbers.
+
+Fri Jun 11 16:35:23 1993 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\defparsebodycommon): New macro from \defvrparsebody.
+ (\deftpparsebody): Call it; can't use \defvrparsebody.
+ (\deftpheaderline, \removeemptybraces): New macros.
+
+Sat May 8 10:49:25 1993 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\itemzzz): Only change \parskip temporarily, and
+ unskip by it later if the item text is on its own line.
+
+ * texinfo.tex (\tablez): Do \afterenvbreak before the \endgroup,
+ so the \parskip value is the table's, not the surrounding text's.
+ (\vtable, \ftable, \itemizey): Likewise.
+ Note: for most environments, \nonfillfinish deals with this.
+
+ * texinfo.tex (\smalllisp): New definition for non-small case, a
+ la @smallexample.
+
+ * texinfo.tex: Delete \message{} at beginning; it does nothing.
+
+ (These changes are all trying to make space above and below
+ environments more equal.)
+ * texinfo.tex (\singlespace): Don't insert a kern.
+ (\group): Do \offinterlineskip, and reset \par to insert a blank
+ line's worth of space.
+ (\lisppar): Delete meaningless call to \obeyspaces before making
+ the definition.
+ (\Elisp [the outer one]): Rename to \nonfillfinish, and end the
+ paragraph before the group.
+ (\lisp): Set \Elisp (the inner one) to \nonfillfinish
+ (\example, \smallexample, \display, \format, \flushleft,
+ \flushright, \quotation): Use \nonfillfinish.
+ (\lineskipfactor, \strut{height,depth}percent): Set to more exact
+ values.
+ (\setleading): Set \normallineskip and call \normalbaselines, for
+ cleanliness.
+
+Thu May 6 16:00:59 1993 Jeffrey Osier (jeffrey@deneb.cygnus.com)
+
+ * texinfo.tex (\ignoremorecommands): Turn off \set and \clear.
+
+Tue Apr 20 17:02:34 1993 Roland H. Pesch (pesch@apple-gunkies.gnu.ai.mit.edu)
+
+ * texinfo.tex (\codex): Delete space.
+
+Thu Apr 15 14:59:04 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\ignoremorecommands): Turn off @raisesections, @up,
+ @lowersections, @down within false conditionals.
+
+Sun Apr 18 04:33:13 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\code): Define - and _ to permit line-breaking
+ despite the fact that hyphenation is disabled.
+ (\codex, \codedash, \codeunder): New macros.
+
+Tue Mar 16 18:19:16 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\ignoremorecommands): Turn off @printindex within
+ false conditionals.
+
+Sun Mar 14 10:47:36 1993 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\footnote): Don't bother to take the footnote text
+ as an argument, and hence don't define as \long.
+ (\footnotezzz): Do \footstrut after we start the paragraph.
+ (Also reformat these macros to make them easier to read.)
+
+Fri Feb 26 13:02:44 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (@include): Use \thisfile rather than #1 as \input arg.
+
+ * texinfo.tex (\readauxfile): Call \warnedobstrue to turn off warning
+ re TeX 3.0 on second and subsequent runs.
+
+Thu Feb 25 18:03:38 1993 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\realeverypar): Delete, as it was unused.
+
+ * texinfo.tex (\group): Do a \strut in \everypar.
+
+Mon Feb 22 17:10:06 1993 Karl Berry (karl@claude.cs.umb.edu)
+
+ * texinfo.tex (\obeyedspace): Define to be whatever \sepspaces
+ does (and move the definition to after \sepspaces).
+
+Wed Feb 17 01:55:20 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\nonfillstart): Do \singlespaces and \let\par
+ before \obeylines.
+
+Fri Feb 12 12:32:56 1993 Roland H. Pesch (pesch at el_bosque.cygnus.com)
+
+ * texinfo.tex (\obstexwarn): issue message re bug in TeX 3.0.
+ (\nullfont): commented-out redefinition, to enable w/TeX 3.0.
+ (\nestedignore): call \obstexwarn for manuals that may trip bug
+
+ * texinfo.tex (\nestedignore): avoid @tex contents with \doignore
+
+Thu Feb 11 15:41:06 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\indexdummies): enable @dfn and @emph in index entries
+
+Thu Feb 11 13:32:32 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\ignoremorecommands): ignore @include within
+ failing conditionals
+
+Sat Feb 6 19:44:28 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\nestedignore): Set \globaldefs--make all defs local.
+
+Tue Feb 2 15:57:37 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (@raisesections, @lowersections): new commands.
+ * (@up, down): original BFox synonyms for above.
+ * (\numhead, \apphead, \unnmhead): internal macros to map headings
+ to appropriate level
+ * (@nwnode): new synonym for @node, used in newest
+ makeinfo
+
+Tue Jan 26 17:05:02 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\include): avoid group around file contents
+
+Tue Jan 19 18:58:56 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\ignoremorecommands, used in \nestedignore): also
+ ignore cross-ref commands and \settitle
+ (\setyyy, used in @set): make definitions global
+ (\clearxxx, used in @clear): clear definitions globally
+
+Thu Jan 14 17:43:32 1993 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * texinfo.tex: Added \shorttitlepage.
+
+Sat Jan 2 15:01:45 1993 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\tclose): Use \spaceskip instead of modifying
+ \fontdimen's to normalize the interword space.
+
+ * texinfo.tex (\t, \key, \tclose): Use \hyphenchar instead of
+ \exhyphenpenalty, to turn off hyphenation for real.
+ (\{no,restore}hyphenation): New macros.
+
+Sat Jan 2 15:01:45 1993 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\t, \key, \tclose): Use \hyphenchar instead of
+ \exhyphenpenalty, to turn off hyphenation for real.
+ (\{no,restore}hyphenation): New macros.
+
+Tue Jan 5 19:15:46 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\deftpparsebody): Make synonymous with \defvrparsebody.
+
+Sun Dec 27 09:40:08 1992 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\inforef, \inforefzzz): Use the \ignorespaces
+ primitive instead of \losespace.
+ (\losespace): Delete.
+
+ * texinfo.tex (\menu, \direntry): Handle like \ifinfo.
+
+ * texinfo.tex (\unmatchedenderror, \defineunmatchedend): New macros.
+ (\endxxx): Call it, instead of just doing it inline.
+ (\conditionalsucceed, \nece): More new macros.
+ (\iftex): Call \conditionalsucceed.
+ (\Eiftex): Define to give an error at the outer level.
+
+ * texinfo.tex (\ignoremorecommands, \nestedignore): New macros.
+ (\ifset, \ifclear): Expand a macro on success as well as failure;
+ also switch to using expansion instead of assignments to act after
+ the conditional.
+ (\if{set,clear}succeed): Call \conditionalsucceed.
+ (\if{set,clear}fail): Call \nestedignore instead of \doignore.
+
+ * texinfo.tex (\clear): Don't insert a spurious space.
+
+ * texinfo.tex (\value): Put comment next to definition.
+
+ * texinfo.tex (\setyyy): Call \setzzz, and define the variable as
+ simply the parameter, no \unskip.
+ (\setzzz): New macro; do not globally define the variable.
+
+Thu Dec 3 17:24:05 1992 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (croppageout): use same escape-char switching as
+ default output routine. Permits using _ in TOC entries.
+
+Fri Nov 13 17:35:38 1992 Charles Hannum (mycroft@gnu.ai.mit.edu)
+
+ * texinfo.tex (indexing): Rewrote double-column mode to fix a
+ rare breakage.
+
+Sun Oct 25 07:13:31 1992 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\obeyedspace): No need to define with \gdef, we're
+ at the outer level.
+
+Fri Oct 16 18:04:40 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * lgpl.texinfo: Change "This program" to "This library" in example
+ copying notice.
+
+Sat Oct 10 09:43:45 1992 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\bullet, \minus): Use \implicitmath instead of $.
+
+Fri Oct 2 08:35:51 1992 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\Egroup): Don't do the \strut and \nointerlineskip.
+
+Sat Sep 26 09:08:59 1992 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\doignore, \enddoignore): New macros.
+ (\ifinfo): Call \doignore.
+ (\ifxinfoxxx): Deleted.
+ (\ignore, \ifsetfail, \ifclearfail): use \doignore.
+
+ * texinfo.tex (\unnumbered): Expand the arg only once for the \message.
+
+ * texinfo.tex (\deftpparsebody, \parsetpheaderline): New macros.
+ (\deftp): Call \deftpparsebody.
+
+Thu Sep 24 10:12:45 1992 Karl Berry (karl@cs.umb.edu)
+
+ * texinfo.tex (\entry): Do \par first; add comments.
+ (\short{chap,unnumbered}entry,\do{chap,sec,subsec,subsubsec}entry):
+ Call \tocentry, instead of using \vbox.
+ (\tocentry): New macro.
+
+Sat Sep 19 14:36:11 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\`, \'): Definitions deleted.
+
+Fri Sep 18 14:33:09 1992 Roland H. Pesch (pesch@cygnus.com)
+
+ * texinfo.tex (\ifset, \ifclear): Standardize catcode of space as
+ for \ignore.
+
+Fri Sep 11 15:25:01 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\finalout): Move out of final section of file,
+ which claims not to define new control words.
+
+ * texinfo.tex (\setleading): New macro.
+ (outer level, @smallbook, @afourpaper): Call it, instead of
+ setting \baselineskip directly.
+
+ * texinfo.tex (\|): New definition for changebars.
+
+Tue Sep 1 17:32:48 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\begindoublecolumns): Exactly double \vsize.
+
+Sat Aug 29 10:12:16 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\group): Define \Egroup to use struts instead of
+ letting TeX do its own interline spacing.
+
+ * texinfo.tex (\{remove,ignore}activespaces): New macros.
+ (\end): Call \removeactivespaces; give the correct error messages;
+ don't try to expand a nonexistent \E... macro.
+
+ * texinfo.tex (\EMsimple): End the help message with a period.
+
+ * texinfo.tex (\gobble): New macro.
+ (\lisp): Call it (instead of defining it every time).
+ (\example, \smallexample): Define \E... within the macro.
+
+Tue Aug 25 11:56:26 1992 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex (\readauxfile): Make + normal while reading aux file.
+
+Thu Aug 20 21:32:34 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\doublecolumnhsize): Compute value in
+ \begindoublecolumns.
+ (\afourpaper, \smallbook, <outer level>): Remove these (virtually
+ identical) computations.
+
+ * texinfo.tex (\doublecolumnvsize): Deleted.
+ (\afourpaper, \smallbook): Don't compute it.
+ (\begindoublecolumns): Just double \vsize here (thus decreasing
+ the value considerably from the old value of 19.1in, which was far
+ too large.)
+
+Fri Aug 14 10:16:42 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\parseargx): Use \expandafter instead of
+ \aftergroup to continue the processing.
+ (\parsearglinex): Renamed to \parseargline, since the former
+ \parseargline is no longer needed.
+
+ * texinfo.tex (\parseargline) Remove a trailing @c or @comment.
+ (\argremovec, \argremovecomment): New macros.
+
+Thu Aug 6 11:28:55 1992 Roland H. Pesch (pesch@fowanton.cygnus.com)
+
+ * texinfo.tex: extended @set to define expandable vars;
+ @value expands same. Auxiliary macros \setxxx, \setyyy
+ used for @set.
+
+Sun Aug 2 14:34:48 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\entry): do line-breaking on the index entry.
+
+Wed Jul 1 17:05:26 1992 Karl Berry (karl@claude.cs.umb.edu)
+
+ * texinfo.tex (\lparen, \rparen): new definitions.
+ ((,[,],)): new global definitions for these four active
+ characters, so parens and brackets can be used in @deffn names.
+
+Sat Jun 27 11:32:58 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\shortchaplabel): new macro to align chapter and
+ appendix labels.
+ (\shortchapentry): call it.
+ (\shortappendixwidth): new dimen register.
+
+Wed Jun 24 09:45:34 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\afterenvbreak): make the same as \aboveenvbreak,
+ so space below environments doesn't get lost.
+ (\aboveenvskipamount): rename to \envskipamount, since it's used
+ both above and below.
+
+Wed Jun 24 09:45:34 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\group): do @comment at the end, to avoid excessive
+ white space when called inside @group.
+
+Wed Jun 24 16:36:04 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\startcontents): End page before setting pageno.
+
+Thu May 28 20:27:25 1992 Robert J. Chassell (bob@hill.gnu.ai.mit.edu)
+
+ * texinfo.tex (\vtable): Like @ftable, but for variables.
+
+Fri May 22 07:04:32 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\w): do \leavevmode before the \hbox.
+
+Sat May 16 11:16:27 1992 Karl Berry (karl@hayley)
+
+ * texinfo.tex (\smallbook): decrease \topskip somewhat.
+
+ * texinfo.tex (\group): use \vtop instead of \vbox.
+
+ * texinfo.tex (\newlinechar): define for use in help strings.
+ (\groupinvalidhelp): define this for use with \errhelp.
+ (\group): set \errhelp to above.
+
+Thu Apr 30 16:19:17 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\need): Rewritten by karl.
+
+Sat Apr 18 16:24:00 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\exdentamount): New var, set by environments.
+ (\exdent, \exdentyyy): Define suitably for filled environments.
+ Always exdent by innermost indentation step.
+ (\nofillexdent, \nofillexdentyyy): Alternates for nofill envs.
+ (\lisp, \smalllispx, \display): Set \exdent to \nofillexdent.
+
+Thu Apr 2 15:04:15 1992 Robert J. Chassell (bob@kropotkin.gnu.ai.mit.edu)
+
+ * texinfo.tex (\Esmalllisp): Smaller baseline skip for smallexamples.
+
+Sun Mar 29 20:44:49 1992 Brendan Kehoe (brendan@cs.widener.edu)
+
+ * texinfo.tex (\startcontents): Always close contentsfile and
+ adjust the page.
+
+Fri Mar 27 17:41:52 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\chapternofonts): Deal with \result, \equiv, etc.
+
+Sat Mar 21 08:22:29 1992 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\entry): format entries better if the page number
+ and entry text don't fit on one line.
+
+ * texinfo.tex (\loggingall, \gloggingall): new macros to help with
+ debugging.
+
+Fri Mar 20 15:35:42 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\result, \expansion, \print, \equiv):
+ Don't copy prefabricated boxes; must adapt to current font.
+ (\dblarrowbox, \longdblarrowbox, \pushcharbox, \equivbox): Deleted.
+ (\bullbox): Deleted.
+
+Thu Mar 19 22:17:14 1992 Robert J. Chassell (bob@kropotkin.gnu.ai.mit.edu)
+
+ * texinfo.tex (\widowpenalty, \clubpenalty): Set them to 10000, since
+ 8000 did not work.
+
+Fri Mar 6 13:26:36 1992 Robert J. Chassell (bob@kropotkin.gnu.ai.mit.edu)
+
+ * texinfo.tex (\widowpenalty, \clubpenalty): Set them to 8000, since
+ 2000 did not work (but \widowpenalty at 20000 did work).
+
+Thu Feb 27 12:27:14 1992 Karl Berry (karl@wombat.gnu.ai.mit.edu)
+
+ * texinfo.tex (\widowpenalty): set to 2000, not 20000.
+
+Sat Feb 8 14:34:45 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\widowpenalty, \clubpenalty): Set them to 2000.
+ (\itemizeitem): Use penalty 1200.
+ (\itemzzz): Add \nobreak near beginning.
+
+ * texinfo.tex (\quotation): Increase right margin, instead of
+ left margin twice.
+
+Wed Feb 5 12:08:30 1992 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\alphaenumerate, \capsenumerate): redefine as a call
+ to \enumerate.
+ (\{lower,upper}caseenumerate): Rename from \{alpha,caps}enumerate.
+
+Sun Feb 2 21:07:19 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\itemzzz): Compensate in line-by-itself case for
+ a table that is indented.
+
+Mon Jan 13 21:04:07 1992 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex: Use 26 instead of control-z as character constant.
+
+Sat Jan 11 02:20:58 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu)
+
+ * gpl.texinfo: Unfilled Yoyodyne example.
+
+Sat Dec 7 16:16:54 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\cartouche): Set \nonarrowing.
+ (\lisp, \smalllisp, \quotation, \display): If set, don't narrow.
+
+Mon Dec 2 08:15:08 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\itemzzz): don't start a paragraph if the item text
+ is on a line by itself; don't allow a page break after that
+ line; always do \par before typesetting anything.
+
+Tue Nov 26 15:13:13 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu)
+
+ * lgpl.texinfo: @ifset lgpl-appendix, use @appendix instead of
+ @unnumbered.
+
+Sun Nov 10 12:00:06 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\doprintindex): only \read if the file existed;
+ \closein the test stream in all cases.
+ (\initial, \entry): do not \outer, so that \read does not get an
+ error if the index exists.
+
+Fri Nov 8 18:13:28 1991 Michael Bushnell (roland@churchy.gnu.ai.mit.edu)
+
+ * texinfo.tex (\itemizey): missing %'s in macro defn.
+ Also, add \begingroup; accidentally deleted by Karl Berry.
+
+Thu Nov 7 11:41:25 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\doprintindex): \read from the index file to make
+ \ifeof true when the file exists but is empty.
+
+Tue Nov 5 08:29:13 1991 Robert J. Chassell (bob at grackle)
+
+ * texinfo.tex (@thischaptername): Provide default value for when
+ @chapter not defined.
+
+Sat Nov 2 17:59:02 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\itemizezzz): do \begingroup here, since \itemizey
+ can't any longer.
+
+Tue Oct 29 12:17:41 1991 Robert J. Chassell (bob at grackle)
+
+ * texinfo.tex: @paragraphindent defined as a no op.
+
+Fri Oct 25 15:19:47 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\enumeratey): allow any lowercase letter, uppercase
+ letter, or number as argument; initialize \itemno and begin the
+ environment's group here.
+ (\itemizey): don't initialize \itemno here.
+ (\numericenumerate, \startenumeration): new macro.
+
+Wed Oct 23 16:26:30 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\ifclear, \ifset): Remove \outer.
+
+ * texinfo.tex (\afourpaper): Set various parameters.
+
+Tue Oct 22 18:42:31 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\alphaenumerate, \capsenumerate):
+ Let @end enumerate end these.
+ (\Ealphaenumerate, \Ecapsenumerate): Aliases for \Eenumerate.
+
+Sun Oct 20 18:23:18 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\mainmagstep): New parameter macro.
+ (Defining fonts): Use that parameter to scale them.
+ If \bigger is defined, use 12 point fonts.
+
+Tue Sep 24 00:30:07 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * texi2dvi: Iterate over the right variable to look for new idx files.
+
+ * texi2dvi: GPL 2.
+
+ * texi2dvi: Fix 2nd invocation of texindex to pass right args.
+
+Wed Sep 11 20:52:42 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\cartouche): New macro.
+
+Fri Aug 23 16:13:46 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\section, \subsection, \subsubsection):
+ Initially define for numbered chapters.
+
+Fri Aug 2 01:46:09 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\footnote): Use \unskip instead of \removelastskip.
+
+Mon Jul 29 14:06:54 1991 Roland H. Pesch (pesch at cygint.cygnus.com)
+
+ * texinfo.tex (\majorheadingzzz, \chapheadingzzz, \chfplain,
+ \unnchfplain, \unnchfopen, \secheadingi, \subsecheadingi,
+ \subsubsecheadingi): allow line breaks in headings.
+ (\shortchapentry, \shortunnumberedentry, \dochapentry, \dosecentry,
+ \dosubsecentry, \dosubsubsecentry): allow line breaks in table of
+ contents entries.
+
+Thu Jul 18 19:01:53 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\secfonts, \indexfonts): Fix typos.
+
+Sun Jul 7 16:36:28 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\afourpaper): New command.
+
+ * texinfo.tex (\numberedsec): Renamed from \section.
+ (\numberedsubsec): Renamed from \subsection.
+ (\numberedsubsubsec): Renamed from \subsubsection.
+ (\chapter, \appendix, \unnumbered): Define \section, \subsection,
+ and \subsubsection here according to type of chapter.
+
+Thu Jul 4 14:19:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\defvarparsebody, \defvrparsebody, \defopvarparsebody):
+ New functions.
+ (\defvar, \defvr, \defopt, \defcv, \defivar): Use them.
+ (\deftypevar, \deftypevr): Likewise.
+
+Mon Jul 1 13:49:25 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\group): Report error if used outside @example, etc.
+
+ * texinfo.tex (\defname): Reduce \leftskip
+ to cancel temporarily the increase made in \defparsebody.
+
+ * texinfo.tex (\enumerate): Allow optional arg to specify type
+ of counting.
+
+ * texinfo.tex (\set, \clear): New commands.
+
+Mon Jun 24 12:22:44 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu)
+
+ * texinfo.tex (\eleterate): Renamed to \alphaenumerate. Sigh.
+ (\ecapitate): Likewise \capsenumerate.
+
+Thu Jun 6 20:02:48 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * lgpl.texinfo: Created from /fsf/rms/gnuorg/lgpl.text.
+
+ * gpl.texinfo: Created from /fsf/rms/gnuorg/gpl.text (GPL v2).
+
+ * texinfo.tex (\eleterate, \ecapitate): New commands, like @itemize,
+ but with [a..z] or [A..Z] instead of [1..n].
+
+Tue May 21 15:46:32 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\dmn): new command to typeset a dimension.
+
+Tue May 21 20:58:22 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\doind, \dosubind): Make new group around \indexdummies
+ and most of body, excluding the \penalty commands.
+
+Mon May 20 21:16:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\tex): Typo in redefining \@.
+
+ * texinfo.tex (\_): Use \lvvmode, not \leavevmode.
+ (\lvvmode): New macro.
+
+ * texinfo.tex (\authorrm, \titlerm): Move to after section fonts.
+
+Tue May 14 21:13:29 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\defunargs): Set \hyphenchar in \tensl, not \sl.
+
+Thu May 9 17:07:08 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\ignore): Standardize catcode of space.
+
+Wed May 8 13:49:45 1991 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\sffam, \sf): New macros; support sans serif
+ type style in math.
+ (top level): Set up \textfonts early on, so we can create boxes w/ it.
+ (\tenrm...\tensf): Define these to be \textrm...\textsf instead.
+ (\df, \textfonts, \chapfonts, \secfonts, \subsecfonts):
+ (\indexfonts): Redefine \tenrm (etc.) instead of just \rm, so that
+ the math family assignment doesn't get lost; call \resetmathfonts.
+ (\resetmathfonts): New macro; redefines \textfont of each math family.
+ (\indsc, \indi, \indsy \chapsc, \chapi, \chapsy, \secsc, \seci):
+ (\secsy, \ssecsc, \sseci, \ssecsy): New font definitions.
+
+Mon May 6 21:30:19 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\indexdummies): Write \_ when an _ is seen.
+
+Mon Apr 29 01:41:44 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\defname): Use \dimen2, \dimen3 for outer margins.
+ Use outer margins for influencing \rightline.
+ (\tclose, \key, \t): Turn off line breaks at hyphens.
+
+Fri Apr 12 03:12:14 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\authorrm): Move definition to top level; copy \secrm.
+
+Tue Apr 2 22:48:39 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\defname): Adjust size of \rlap box, not \dimen0
+ or \dimen1, for current width.
+
+ * texinfo.tex (\Yappendixletterandtype): End with {}.
+
+Sat Mar 30 16:13:25 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Really use \cite.
+ (\inforefzzz): Use \samp for node name.
+
+ * texinfo.tex (\defname): Use current width for \dimen0, \dimen1.
+
+ * texinfo.tex (\doprintindex): Put lots of whitespace before index.
+
+Fri Mar 29 17:00:58 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\xrdef): Take out last change.
+
+ * texinfo.tex (\needx): Turn off \baselineskip. Use kern, and no glue.
+
+ * texinfo.tex (\shortcontrm): Renamed from \truesecrm.
+ (\shortcontbf, \shortcontsl): New fonts for short contents lines.
+ (\summarycontents): Use them.
+
+ * texinfo.tex (\defname): Don't set \leftskip to 0; just decrease by
+ one indent level.
+ (\defparsebody, \def*parsebody): Increment both margins by one level.
+
+Tue Mar 26 22:41:38 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * texinfo.tex (\xrdef): Change catcode before reading args.
+
+Wed Mar 20 14:21:57 1991 Roland McGrath (roland at geech.gnu.ai.mit.edu)
+
+ * texi2dvi: Use p modifier in sed -n command, so it works.
+ Duplicate code to find the index files, instead of being smart in
+ one place and dumb in another.
+
+Thu Mar 7 17:08:32 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\defaultparindent): New variable.
+ (\footnotezzz): Reset \parindent to default.
+ (\xrefX): Use \cite for printed manual and node names.
+
+Tue Mar 5 13:39:34 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\emergencystretch feature): Use \thisisundefined.
+
+Mon Mar 4 00:35:57 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\ftablex): Define \Eftable; undefine \Etable.
+
+ * texinfo.tex (\footnote): Discard preceding whitespace.
+
+ * texinfo.tex: Use the \emergencystretch feature if available.
+
+Fri Feb 22 03:50:58 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\tex): Make + not active.
+
+Fri Feb 15 10:05:24 1991 Roland McGrath (mcgrath at cygint.cygnus.com)
+
+ * texi2dvi: Use $TEXINFO in place of $TEX (falling back to $TEX
+ if $TEXINFO is undefined).
+
+ * texi2dvi: Renamed from texinfo. Bob (I believe) did this at some
+ point at and didn't make a ChangeLog entry. I'd shoot him myself if
+ he weren't the person who signs my paychecks.
+
+Sun Feb 10 22:51:52 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\doprintindex): If index is empty, print a dummy.
+ (\need): Use vskips and penalties; don't use \pagetotal.
+
+Fri Feb 8 17:36:53 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\ignoresections):
+ Turn off \contents, \smallbook and \titlepage.
+
+ * texinfo.tex (\Etitlepage): Do a page break before ending the group.
+
+ * texinfo.tex (\setref, \unnumbsetref, \appendixsetref):
+ Comment out recording the chapter title.
+
+Thu Jan 24 23:28:41 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\top): Synonym for \unnumbered.
+ (\infotop): Synonym for \infounnumbered.
+ (\ignoresections): Handle \top.
+
+Thu Jan 24 12:41:33 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex: Delete spurious character at beginning.
+
+Thu Jan 17 16:34:25 1991 Roland McGrath (roland at cygint.cygnus.com)
+
+ * texinfo: Check the exit status of tex and texindex. Don't procede
+ after a failing run.
+
+Thu Jan 10 15:16:47 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Get rid of blank line.
+
+Wed Jan 9 18:06:20 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\entry, \secondary): Use \indexdotfill.
+ (\indexdotfill): New macro.
+
+Tue Jan 8 17:44:01 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\donoderef): Define a ...-title cross-reference.
+ (Ytitle): Subroutine for that.
+ (xrefX): Use the real title by default (but this is commented out).
+
+Tue Jan 1 23:18:21 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\indexnofonts): Delete troublemaking blank line.
+
+Sat Dec 22 00:47:21 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Prevent extra space.
+
+Fri Dec 21 21:14:50 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\comment, \commentxxx): Ignore @ in comment.
+
+Thu Dec 13 22:38:31 1990 Chris Hanson (cph at kleph)
+
+ * texinfo.tex (\defivarheader): Capitalize "Variable".
+
+Sun Dec 2 01:46:04 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\indexdummies, \indexnofonts): Handle \t like \r.
+
+ * texinfo.tex (heading fonts): New fonts based on cm...12.
+
+Tue Nov 27 16:59:35 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\indexnofonts): Also supersede \TeX and \dots.
+
+Sun Nov 18 16:18:14 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\*): End with \ignorespaces.
+
+Fri Nov 2 17:41:48 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\*): Output empty hbox to avoid losing whitespace.
+ (\deftypevarheader, \deftypevrheader): End the paragraph
+ with suitable penalties.
+ (\deftypevrheader): Do print the data type.
+
+Thu Nov 1 12:04:52 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\defmethodheader): Print `method', not `operation'.
+
+Fri Oct 26 17:11:08 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\indexdummies): Temporarily redefine \_.
+ (\ptexdots): Copy of plain tex \dots.
+ (\tex): Temporarily reinstall that.
+
+Fri Oct 19 16:57:48 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\subsubsecheadingi, \subsecheadingi): New subroutines.
+
+Mon Oct 8 13:34:19 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (active _): Use \normalunderscore.
+
+Tue Sep 25 22:32:55 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\deftypefn, \deftypevar, \deftypevr): New macros.
+ Their subroutines also new.
+
+Tue Sep 25 16:42:52 1990 Roland McGrath (roland at geech.ai.mit.edu)
+
+ * texinfo: Recognize `.tex' as a suffix.
+
+Tue Sep 25 01:46:54 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\deftypefun): New macro.
+ (\deftypefunheader, \deftypefunheaderx, \deftypefunargs): Also new.
+
+Fri Sep 14 00:38:28 1990 Roland McGrath (roland at churchy.ai.mit.edu)
+
+ * texinfo: Weed out files that have two-letter extensions but don't
+ start with a backslash, and therefore aren't index files.
+
+ * texinfo: Handle index files that have any two-letter extension,
+ rather than using a static list of extensions.
+
+ * texinfo: Handle .texi extension as well as .texinfo.
+
+ * texinfo: New file, a sh script to do .texinfo -> .dvi.
+
+Mon Sep 10 13:14:39 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * texinfo.tex (\math): New macro.
+
+Tue Sep 4 07:43:33 1990 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\chfplain): Do not print a period after the chapter
+ number, for consistency with sections et al.
+
+ * texinfo.tex (\refX): hyphenate `undefined' so that the ligature
+ is not lost.
+
+ * texinfo.tex (_): use \_ unless we're in tt.
+ (\ifusingtt): new macro for such conditionalization.
+
+ * texinfo.tex (\xrefX): don't use \unhbox to print the node names,
+ since that loses on hyphens.
+ Use \ignorespaces rather than \losespace.
+
+Thu Aug 2 07:03:26 1990 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\linenumber): new macro.
+ (\refx): give the line number in the message.
+
+Tue Jul 31 09:13:32 1990 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\refx): improve warning messages, remove
+ unnecessary groups, and improve logic.
+
+Thu Jul 26 20:53:38 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\subheading, \subsubheading): Missing macros defined.
+
+Thu Jul 19 22:48:26 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\titlepage): Don't print rule for \page unless already
+ printed a rule.
+ (\abstract): Deleted.
+ (\direntry): New command, much like \ignore.
+
+Sun Jul 15 16:28:42 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\abstract): New construct; trivial in tex.
+
+Sun Jun 17 01:03:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\defcv): Protect space before `of'.
+ (\defspec): Capitalize `Form'.
+
+Sat Jun 16 19:36:56 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\kbd, \kbdfoo): Use \par to term. arg to \kbdfoo.
+
+Fri Jun 15 10:47:12 1990 Robert J. Chassell (bob at pogo.ai.mit.edu)
+
+ * texinfo.tex (\defcv): Use \defcvarheader instead of (undefined)
+ \defcvheader.
+
+Fri May 25 18:04:31 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Use \turnoffactive.
+
+Mon May 21 21:17:34 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\turnoffactive): New command.
+ (\normaldoublequote, ...): New commands.
+ (\dosetq): Use \turnoffactive.
+
+Sat May 19 12:31:17 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\indit): Use slanted font, not italic.
+ (\smalllispx): Do \indexfonts.
+
+Fri May 4 17:35:04 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\footnote, \footnotezzz): Make it \long.
+
+Wed May 2 01:19:55 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\titlerm): Go back to cmbx10 scaled \magstep5.
+ (\hsize): Don't set it, use the default.
+
+Fri Mar 23 21:07:02 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\footnote): Read arg in braces, not as a line.
+
+Mon Mar 19 19:30:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\unnumbsubsubsecentry): Typo in name being defined.
+
+Tue Mar 13 18:49:27 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\defvarargs): Add penalty at end.
+
+ * texinfo.tex (\synindex, \syncodeindex): Copy one index file name
+ into the other.
+
+Tue Mar 6 16:58:54 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\deftt): Make this a distinct font.
+
+ * texinfo.tex (\initial): Define \tt like \tentt.
+
+ * texinfo.tex (\ifinfo): End with \losespace.
+ (\ignore, \ifsetfailxxx, \ifclearfailxxx): Likewise.
+
+Sun Mar 4 19:55:57 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\lbrb, \rbrb): Use \bf.
+
+Sat Mar 3 17:53:22 1990 Richard Stallman (rms at geech)
+
+ * texinfo.tex (\onepageout): Set \escapechar here.
+
+ * texinfo.tex (\rawbackslash): Define using \chardef.
+
+ * texinfo.tex (\@): Use ttfont.
+
+Thu Mar 1 16:37:46 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (Ysectionnumberandtype, Yappendixletterandtype):
+ Capitalize "chapter", "appendix" and "section".
+
+Mon Feb 19 20:26:22 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\xkey): Attempt to eliminate spurious space from
+ output. Look at y-or-n-p.
+
+Mon Feb 12 16:34:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\errorbox): Get \dimen0 from \tentt.
+
+Sun Feb 11 15:11:57 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\defunargs): Use ragged right for args.
+ Add large penalty at end.
+
+ * texinfo.tex: Make active definition for = using \tt, but disable.
+ (\defparsebody): Make = active.
+ (\defunheader, etc.): Make inactive again.
+
+ * texinfo.tex (\errorbox): Try to equalize outside space to both sides.
+
+Fri Feb 2 14:47:21 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\appendix): Don't use \the before \appendixletter.
+
+Sat Dec 16 14:02:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\chapter, \appendix): Make defn of \thischapter
+ refer to \thischaptername, and store actual name there.
+ (\chapternofonts): Turn off more macros.
+ (\indexdummies): Likewise.
+
+Sun Nov 19 15:29:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\titlerm): There were two definitions of this command.
+ Put them together and commented out one of them.
+ (\subtitlerm): Was same as \tenrm, so just copy that.
+ (\ninett): Always define this.
+ (\indtt): Copy from \ninett.
+
+Sat Nov 18 22:57:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\ssecrm, etc.): Scale by 1315, rather than to 13pt.
+
+Wed Nov 8 18:38:33 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\titlepage): Turn on iffinishedtitlepage so
+ bottom rule is not printed.
+ (\titlezzz): Turn it off, so bottom rule is printed.
+
+Mon Nov 6 09:23:29 1989 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\chapterzzz, \appendixzzz): include `Chapter
+ \the\chapno' and `Appendix \appendixletter' in \thischapter; use
+ \xdef instead of \gdef to define \thischapter, to avoid timing
+ problems with \chapno or \appendixletter.
+ (\startcontents): don't bother putting `Table of Contents' or
+ `Short Contents' in the headline.
+
+Fri Oct 20 09:11:35 1989 Karl Berry (karl at hayley)
+
+ * texinfo.tex (\titlepage): remove obsolete code for subtitles.
+ (\titlezzz): end with \relax, to avoid misinterpretation of a
+ following `plus' or `minus'
+ (\page (inside \titlepage)): call \finishtitlepage.
+ (\Etitlepage): call \finishtitlepage, if it hasn't been.
+ (\finishtitlepage): new macro to print a rule and leave some space
+ at the bottom of the title page.
+ (\iffinishedtitlepage): new; says whether \finishtitlepage has been
+ called.
+
+Mon Nov 6 21:35:34 1989 Robert J. Chassell (bob at rice-chex)
+
+ * texinfo.tex: Replaced `GNU CC' in the copyleft of this file with
+ the phrase `this texinfo.tex file'.
+
+Fri Oct 27 10:36:32 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\setfilename): Do nothing except 1st time used.
+ (\titlepage): Brace misplaced in \titlezzz.
+ (\indexdummies, \indexnofonts): Handle @w.
+
+ (\readauxfile): Set \ifhavexrefs true.
+ (\refX): Warn for every use of an undefined xref,
+ but if no xref values are known, warn just once that none are known.
+
+Tue Sep 19 04:12:51 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\xrefX): Go back to `section N [Foo], page M'.
+ (\exp): Delete it.
+
+Mon Sep 18 15:29:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\chapentryfonts): Try using \rm for chap title.
+
+Tue Sep 12 03:41:10 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\titlepage): Missing closeparen after \title.
+ Delete excess paren after \page.
+
+ * texinfo.tex (\samp): Use \tclose.
+
+Mon Sep 11 23:28:04 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\tclose): Make `@ ' a full-width space.
+
+Sat Sep 9 20:11:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\balancecolumns): Handle properly the case where
+ the index ends before one page is output, so \partialpage is nonempty.
+ In this case we may need to output two pages if the data
+ would just barely fit if not for \partialpage.
+
+Wed Aug 30 22:45:31 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\refx): New 2nd operand, output if xref is non-null.
+ (\xrefX): Use that to output the comma after the section number.
+ (\appendixnoderef, \appendixsetref, \Yappendixletterandtype):
+ Define xrefs for appendices that say "Appendix N".
+ Used in \appendix, \appendixsec, etc.
+
+ * texinfo.tex (\smartitalic): The actual italic correction was omitted.
+
+Mon Aug 28 00:21:33 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * texinfo.tex (\ref): New kind of cross-reference.
+ (\xrefX): Put single quotes around section name.
+ (\refx): Allow hyphenation in `undefined'.
+
+ * texinfo.tex (+): Make it active.
+ (Altmode): Delete active defn.
+
+ * texinfo.tex (\defunargs): Prevent hyphenation at `-' in args.
+ Move the penalty at the end so that it works.
+ (\defvarargs): Move the penalty at the end so that it works.
+
+ * texinfo.tex (\defparsebody): Do increase right margin.
+
+ * texinfo.tex (\defbodyindent): Now .4 inch.
+
+ * texinfo.tex (\point, \result, \expansion, \print, \equiv, \error):
+ New macros for Lisp manual.
+
+ * texinfo.tex (\tex): Set = to code 12.
+
+ * texinfo.tex (\entry): Hairier way to output dots.
+
+ * texinfo.tex (\kbd): If arg consists of one \key command, be a no op.
+
+ * texinfo.tex (\sc): Delete spurious \.
+
+ * texinfo.tex (\smartitalic): New macro, does italic correction at end.
+ (\i, \var, \dfn, \emph, \cite): Use that.
+
+ * texinfo.tex (\node): Do \ENVcheck.
+
+ * texinfo.tex (\initial): Infinite penalty at end.
+
+ * texinfo.tex (\chapternofonts): New macro, sets \code, etc. to
+ output selves into file. Also undef \frenchspacing and \rawbackslash.
+ (\xhapterzzz, etc.): Call that. Make a group to undo it.
+ (\indexdummies): Do like \chapternofonts.
+
+Sun Aug 27 16:05:23 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * texinfo.tex (\frenchspacing): Our own definition, using
+ decimal numbers for all character codes. The standard one fails.
+
+ * texinfo.tex (\indexnofonts): Handle \file, \tt, and many more.
+
+Fri Aug 25 22:05:24 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * texinfo.tex (\chapter, etc.): Undefine \tclose around \edef\temp.
+
+Mon Aug 21 15:42:47 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * texinfo.tex (\tclose): Like \t but make space same width
+ as in surrounding text.
+ (\code, \kbd): Use \tclose.
+
+Tue Jul 4 20:53:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (titlepage): Don't set \everypar; start just one group.
+ See comments in the code.
+
+ * texinfo.tex (defop,defcv): Use defopparsebody.
+ * texinfo.tex (defopparsebody): Like defmethparsebody but defines
+ def...x for more arguments.
+
+Sat Jun 17 13:49:13 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\titlepage): Rename @subtext, etc., to @subtitle, etc.
+
+ * texinfo.tex (\titlepage): Don't print the title automatically.
+ Define @title to print it, and the rule underneath it.
+ This should make @titlepage upward compatible with the old one.
+
+ * texinfo.tex (\titlepage): Revert local definition of @page
+ to previous. Don't print a rule.
+
+Mon Jun 12 20:49:17 1989 Karl Berry. (karl at mote)
+
+ * texinfo.tex (\titlepage): allow intensional definition of the
+ items on the title page. New control sequences (allowed only
+ within the titlepage environment:)
+ (@subtext): may take either a paragraph (e.g., a brief
+ description of the program) or just a line (e.g., the date).
+ May appear more than once.
+ (@author): must come after all the @subtext's. Can appear more
+ than once, also.
+ Also, use the title defined by @settitle.
+ (\subtextfont, \authorfont): switch to using the appropriate
+ fonts with appropriate leading.
+ (\titlepagetopglue, \titlepagebottomglue): define space that
+ never stretches or shrinks.
+ (\realeverypar): formatting for the @subtext's.
+
+Sun Jun 4 15:04:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (\shortchapentry, \shortunnumberedentry):
+ Use dots, right justify page numbers. Don't use italics.
+
+Fri Jun 2 14:40:28 1989 Karl Berry. (karl at mote)
+
+ * texinfo.tex (\entry, \secondary): use plain TeX \dotfill for
+ better leaders than the homegrown one.
+ (\Dotsbox): Deleted.
+ (\dotfill): Deleted; use Plain TeX definition.
+
+Wed May 31 17:19:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (ignore): Undefine the chapter/section macros
+ while reading the args, since they are \outer.
+ (ifinfo): Likewise
+ (ifsetxxx, ifclearxxx): Call another macro to parse the
+ conditionalized text, and do to that macro as with \ignore.
+
+Tue May 30 15:04:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex (unnumbered): Change back from \long to \outer.
+
+ * texinfo.tex: Changes by Karl Berry for toc format.
+ Rewrite the table of contents for appearance's sake. Add a
+ synonym for \summarycontents, \shortcontents, since that is the
+ traditional name. Two subroutines are now shared by \contents and
+ \summarycontents: \prepareforcontents, to reset the page number
+ and such; and \startcontents, which begins the \unnumbered and
+ resets catcodes before \input \jobname.toc. Some other macros --
+ \labelspace, \dopageno, \shortpageno -- are shared by the printing
+ macros.
+
+ * texinfo.tex (\truesecrm): New font, section-size roman, used in the
+ new toc. (cmr12)
+
+Sun May 28 07:25:42 1989 Karl Berry. (karl at mote)
+
+ * texinfo.tex (\eatinput): Do not print the `\input texinfo' if a
+ .fmt file is being used; ignore it, instead. This is the initial
+ definition for `\' now.
+ (\fixbackslash): on the other hand, subsequent backslashes should
+ be printed, and if the file does not have an `\input texinfo', the
+ first one should be printed. This new macro makes the definition
+ for `\' be \normalbackslash, if it is \eatinput.
+ (\setfilename): use \fixbackslash.
+
+Wed May 24 15:34:59 1989 Joseph Arceneaux (jla at apple-gunkies.ai.mit.edu)
+
+ * texinfo.tex: Changed def of unnumbered from \outer to \long.
+
+Tue May 23 12:27:59 1989 Karl Berry. (karl at mote)
+
+ * texinfo.tex: Allow one to make a texinfo.fmt file (with the
+ invocation:
+ initex \&plain texinfo
+ and then saying
+ @dump
+ after texinfo.tex has been read.
+ Changes:
+ (\setfilename): Instead of being a no-op, read the xref info, and
+ open the contents and index files. These actions were done as
+ texinfo.tex was read before.
+ (\opencontents, \openindices): new macros to open those files.
+ (\readauxfile): and one to read the aux file.
+
+Sat Apr 29 22:28:02 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex: `@headings on' no longer does a page break.
+
+Sun Apr 2 11:22:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex: Defined `@headings single' and `@headings double'.
+ `@headings on' picks one of them: `@setchapternewpage odd'
+ says `@headings on' means double; otherwise it means single.
+
+Mon Jan 30 22:00:35 1989 Robert J. Chassell (bob at rice-krispies.ai.mit.edu)
+
+ * texinfo.tex: Changed the size of the subsection fonts so they
+ are scaled at13pt rather than at magstep 2. This makes them
+ smaller than the section fonts, which are scaled at magstep 2.
+ In addition, changed the ssecrm font from cmbx to cmb.
+
+Fri Jan 6 15:00:44 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * texinfo.tex: Changed @lisp, @smalllisp, @display not to change
+ the right margin.
+
+Mon Dec 5 22:01:49 1988 Robert J. Chassell (bob at rice-krispies.ai.mit.edu)
+
+ * texinfo.tex: Tested the use of `cmbx10' vrs `cmb10' font and
+ stayed with cmb10 font since cmb10 looks better when the bold face
+ is part of a sentence although the cmbx10 font looks better on its own.
+
+Mon Aug 15 14:33:51 1988 Robert J. Chassell (bob at spiff)
+
+ * texinfo.tex: Changed the (undocumented) @today command from a
+ Month Day, Year format to a Day Month Year format. Left old
+ version commented out.
+
+
+Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+
+Local Variables:
+mode: indented-text
+left-margin: 8
+fill-column: 76
+version-control: never
+End:
diff --git a/Build/source/utils/texinfo/INSTALL b/Build/source/utils/texinfo/INSTALL
new file mode 100644
index 00000000000..58346285203
--- /dev/null
+++ b/Build/source/utils/texinfo/INSTALL
@@ -0,0 +1,45 @@
+$Id: INSTALL,v 1.5 2004/11/19 13:08:47 karl Exp $
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+For generic installation instructions on compiling and installing this
+Automake-based distribution, please read the file `INSTALL.generic'.
+
+Installation notes specific to Texinfo:
+
+* texinfo.tex and the other *.tex files are not installed by `make
+ install'. This is because there is no reliable way to know where to
+ install them. Instead, you have to run an additional make command
+ after the normal make install:
+ make TEXMF=/your/texmf install-tex
+ texinfo.tex is installed in ${TEXMF}/tex/texinfo/texinfo.tex, etc.
+
+* On the other hand, if you're maintaining a TeX distribution, you don't
+ want your users to see the installation warnings, because you already
+ have the files installed. (And you're keeping them up to date, right?)
+ In this case, run configure --disable-install-warnings, or set
+ enable_install_warnings=no in the environment.
+
+* On MacOSX, if configure fails with the error:
+ ac_cv_build='config.sub: invalid option -apple-darwin7.2.0
+this is probably because your uname -p is returning "unknown". Use
+/usr/bin/uname instead.
+
+* For instructions on compiling this distribution with DJGPP tools
+ for MS-DOS and MS-Windows, see the file djgpp/README.
+
+* The Info tree uses a file `dir' as its root node; the `dir-example'
+ file in this distribution is included as a possible starting point.
+ Use it, modify it, or ignore it just as you like.
+
+* You can create a file texinfo.cnf to be read by TeX when
+ processing Texinfo manuals. For example, you might like to use
+ @afourpaper by default. See the `Preparing for TeX' node in
+ texinfo.txi for more details. You don't have to create the file if
+ you have nothing to put in it.
+
+* If your info files are not in $prefix/info, you may wish to add a line
+#define DEFAULT_INFOPATH "/mydir1:/mydir2:..."
+ to config.h after running configure.
diff --git a/Build/source/utils/texinfo/INSTALL.generic b/Build/source/utils/texinfo/INSTALL.generic
new file mode 100644
index 00000000000..095b1eb4063
--- /dev/null
+++ b/Build/source/utils/texinfo/INSTALL.generic
@@ -0,0 +1,231 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about. Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/Build/source/utils/texinfo/INTRODUCTION b/Build/source/utils/texinfo/INTRODUCTION
new file mode 100644
index 00000000000..718c1c525de
--- /dev/null
+++ b/Build/source/utils/texinfo/INTRODUCTION
@@ -0,0 +1,108 @@
+$Id: INTRODUCTION,v 1.3 2004/04/11 17:56:45 karl Exp $
+Getting started with Texinfo.
+
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+ Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+
+
+Getting Started with Texinfo
+============================
+
+"Texinfo" is a documentation system that uses a single source file to
+produce both on-line information and printed output. Using Texinfo,
+you can create a printed document with the normal features of a book,
+including chapters, sections, cross references, and indices. From the
+same Texinfo source file, you can create a menu-driven, on-line Info
+file with nodes, menus, cross references, and indices.
+
+The name of the Texinfo source documentation file is `texinfo.txi'.
+You can produce both on-line information and printed output from this
+source file. The documentation describes Texinfo in detail, including
+how to write Texinfo files, how to format them for both hard copy and
+Info, and how to install Info files.
+
+To get started, you need to create either a printed manual or an
+on-line Info file from the `texinfo.txi' file. You do not need to
+create both, although you will probably want both eventually.
+
+To learn how to use Info, read the info documentation. You can do this in
+one of two ways: using the standalone `info' program, or using Info mode in
+GNU Emacs.
+
+ * If you want to use the `info' program, run
+
+ info -f info-stnd
+
+ * If you want to use Emacs, start up emacs and type `C-h i' [M-x info].
+ Follow the instructions to learn how to use Info.
+
+After learning how to use Info, you can read the Texinfo documentation.
+Using the standalone `info', type the following at the shell prompt:
+
+ info -f texinfo
+
+To use read this manual in Emacs, you first need to edit the Info-directory
+menu (the file `dir' in the system info directory) to contain the
+appropriate node. To learn how to do this, see node: Add in the Info
+documentation.
+
+The Texinfo documentation describes Texinfo in detail; among other things,
+it tells how to install Info files in the usual manner. (See node: Install
+an Info File.)
+
+The `info-stnd.info' file describes the standalone Info reader in detail. To
+read this file, type
+
+ $ info -f info-stnd
+
+
+To create a printed manual
+==========================
+
+You need:
+
+ * The `tex' program, which typesets the manual using TeX.
+ * The `texinfo.tex' definition file that tells TeX how to typeset
+ a Texinfo file.
+ * The `texindex' program, which sorts the unsorted index files
+ created by TeX.
+ * A printing program such as `lp' or `lpr',
+ * A printer.
+
+This Texinfo distribution package contains `texinfo.tex', the C source
+for `texindex', and the handy shell script `texi2dvi'. The `tex'
+program is not part of this distribution, but is available separately.
+(See `How to Obtain TeX' in the Texinfo documentation.)
+
+ * Install `tex'. (`texindex' is installed automagically by
+ `make install' in this distribution.)
+
+ * Move the `texinfo.tex' file to an appropriate directory; the current
+ directory will do. (`/usr/local/lib/tex/inputs' might be a good place.
+ See ``Preparing to Use TeX'' in the Texinfo manual, for more
+ information.)
+
+After following those instructions, type the following to make the .dvi
+files:
+
+ $ (cd doc; make dvi)
+
+You can then print the resulting .dvi files with the `lpr' or `lp'
+commands, or maybe `dvips'.
+
+For example, the command to print the texinfo.dvi file might be:
+
+ $ lpr -d texinfo.dvi
+
+The name of the printing command depends on the system; `lpr -d' is
+common, and is illustrated here. You may use a different name for the
+printing command.
+
+Please report bugs to bug-texinfo@gnu.org.
+
+Happy formatting.
diff --git a/Build/source/utils/texinfo/Makefile.am b/Build/source/utils/texinfo/Makefile.am
new file mode 100644
index 00000000000..9e5ffc02f29
--- /dev/null
+++ b/Build/source/utils/texinfo/Makefile.am
@@ -0,0 +1,55 @@
+# Makefile.am for texinfo.
+# $Id: Makefile.am,v 1.13 2004/12/15 16:53:59 kasal Exp $
+# Process this file with automake to produce Makefile.in in all directories.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# Be sure we're using the right version of Automake.
+AUTOMAKE_OPTIONS = 1.8 readme-alpha
+
+# Additional files to distribute.
+EXTRA_DIST = ChangeLog.46 INSTALL.generic INTRODUCTION README.dev \
+ config.rpath \
+ djgpp/README djgpp/config.bat djgpp/config.sed djgpp/config.site
+
+# This is to prevent texinfo.tex from being included in the top-level
+# distribution directory.
+TEXINFO_TEX = doc/texinfo.tex
+
+if TOOLS_ONLY
+ # Build native tools only.
+ SUBDIRS = lib info makeinfo util
+else
+ # All subdirectories.
+ # Do intl, m4, and lib first since the C programs depend on them.
+ # Do doc last so makeinfo will be built when we get there.
+ # Others are alphabetical.
+ SUBDIRS = $(native_tools) intl m4 lib info makeinfo po util doc
+endif
+
+# for gettext.
+ACLOCAL_AMFLAGS = -I m4
+
+# In case TEXINFO_MAINT is set during make distcheck; in this case, the
+# simple doc-related files generated in info/ make distcleancheck fail.
+distcleancheck_listfiles = \
+ find -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
+
+# One special target for installers to use by hand if desired.
+install-tex:
+ cd doc && $(MAKE) TEXMF=$(TEXMF) install-tex
+
+distclean-local:
+ -test -d "$(native_tools)" && rm -rf "$(native_tools)"
+
+# Don't install native tools for cross compile.
+if TOOLS_ONLY
+install:
+
+endif
diff --git a/Build/source/utils/texinfo/Makefile.in b/Build/source/utils/texinfo/Makefile.in
new file mode 100644
index 00000000000..fc803966d4d
--- /dev/null
+++ b/Build/source/utils/texinfo/Makefile.in
@@ -0,0 +1,679 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile.am for texinfo.
+# $Id: Makefile.am,v 1.13 2004/12/15 16:53:59 kasal Exp $
+# Process this file with automake to produce Makefile.in in all directories.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.in \
+ $(top_srcdir)/configure $(top_srcdir)/intl/Makefile.in \
+ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS TODO \
+ config.guess config.rpath config.sub depcomp install-sh \
+ missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = intl/Makefile
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = @native_tools@ intl m4 lib info makeinfo po util doc
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+
+# Be sure we're using the right version of Automake.
+AUTOMAKE_OPTIONS = 1.8 readme-alpha
+
+# Additional files to distribute.
+EXTRA_DIST = ChangeLog.46 INSTALL.generic INTRODUCTION README.dev \
+ config.rpath \
+ djgpp/README djgpp/config.bat djgpp/config.sed djgpp/config.site
+
+
+# This is to prevent texinfo.tex from being included in the top-level
+# distribution directory.
+TEXINFO_TEX = doc/texinfo.tex
+@TOOLS_ONLY_FALSE@SUBDIRS = $(native_tools) intl m4 lib info makeinfo po util doc
+@TOOLS_ONLY_TRUE@SUBDIRS = lib info makeinfo util
+
+# for gettext.
+ACLOCAL_AMFLAGS = -I m4
+
+# In case TEXINFO_MAINT is set during make distcheck; in this case, the
+# simple doc-related files generated in info/ make distcleancheck fail.
+distcleancheck_listfiles = \
+ find -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
+
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/djgpp $(distdir)/intl $(distdir)/m4 $(distdir)/po
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ --with-included-gettext \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+@TOOLS_ONLY_FALSE@install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-local \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-generic \
+ distclean-hdr distclean-local distclean-recursive \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-info-am
+
+
+@TOOLS_ONLY_TRUE@ # Build native tools only.
+@TOOLS_ONLY_FALSE@ # All subdirectories.
+@TOOLS_ONLY_FALSE@ # Do intl, m4, and lib first since the C programs depend on them.
+@TOOLS_ONLY_FALSE@ # Do doc last so makeinfo will be built when we get there.
+@TOOLS_ONLY_FALSE@ # Others are alphabetical.
+
+# One special target for installers to use by hand if desired.
+install-tex:
+ cd doc && $(MAKE) TEXMF=$(TEXMF) install-tex
+
+distclean-local:
+ -test -d "$(native_tools)" && rm -rf "$(native_tools)"
+
+# Don't install native tools for cross compile.
+@TOOLS_ONLY_TRUE@install:
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/NEWS b/Build/source/utils/texinfo/NEWS
new file mode 100644
index 00000000000..7d73e149744
--- /dev/null
+++ b/Build/source/utils/texinfo/NEWS
@@ -0,0 +1,728 @@
+$Id: NEWS,v 1.103 2004/12/24 16:43:58 karl Exp $
+This file records noteworthy changes, very tersely.
+See the manual for detailed information.
+
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+
+*** IMPORTANT NEWS FOR ALL AUTHORS OF TEXINFO MANUALS ***
+
+As of version 4.2, Texinfo has a new command @copying to define the
+copyright and copying permissions for a manual. It's important to
+switch to using it as soon as possible (as in your next release),
+because the historical method of doing copyright permissions using
+@ifinfo failed to output copyright information in the HTML (or XML)
+formats. The manual has detailed explanations and examples. For
+convenience, here's a url to one of the relevant sections:
+ http://www.gnu.org/software/texinfo/manual/texinfo/html_node/Document-Permissions.html
+
+-------------------------------------------------------------------------------
+
+4.8 (31 December 2004)
+* Language:
+ . new command @euro for the Euro currency symbol, and
+ @documentencoding has some support for ISO-8859-15.
+ . new command @abbr for general abbreviations.
+ . new command @slanted to typeset text in a slanted font,
+ and @sansserif to typeset in a sans serif font.
+* makeinfo:
+ . An empty first argument to cross-reference commands, such as @xref,
+ causes an error. This change was made in 4.1, but not mentioned in NEWS.
+ . HTML output:
+ - <a name="..."> constructs are added for the old-style
+ conversion of node names to HTML names, so that external references
+ to them can continue to work.
+ - "g_t" prefixed to targets for node names beginning with a
+ nonletter, for XHTML compatibility.
+ . Docbook output: recognize more image formats.
+* texi2dvi:
+ . new option --recode, to call recode for input character translation.
+* Distribution:
+ . new convenience script texi2pdf, equivalent to texi2dvi --pdf (from tetex).
+ . some cross-compiling support in configure && make.
+ . new configure option --disable-install-warnings, for TeX.
+ distributions which do have the files installed.
+ . automake 1.9.4.
+
+
+4.7 (9 April 2004)
+* Language:
+ . new commands @float, @caption, @shortcaption, @listoffloats for
+ initial implementation of floating material (figures, tables, etc).
+ Ironically, they do not yet actually float anywhere.
+ . new commands @docbook, @ifdocbook, @ifnotdocbook for conditional Docbook.
+ . new commands @ordf{} and @ordm{} for Spanish feminine/masculine ordinals.
+ . new commands @deftypecv[x] for class variables in typed OO languages.
+ . new command @registeredsymbol for the r-in-a-circle symbol.
+ . new command @headitem to make a heading row in @multitable.
+ . new command @LaTeX{} for the LaTeX logo.
+ . new command @comma{} to avoid comma-parsing problems.
+ . @url is now a synonym for @uref; new command @indicateurl has the
+ old meaning of just displaying a url as text.
+ . @quotation now accepts an optional argument for labelling the text
+ as a `Note', `Tip', etc.
+ . @defun (et al.) heading lines can now be continued with a lone @.
+ . @acronym accepts an optional argument for the meaning of the acronym.
+* makeinfo:
+ . New environment variable TEXINFO_OUTPUT_FORMAT determines the output
+ format at runtime, if no options are specified.
+ . New option --plaintext, equivalent to --no-headers with Info output.
+ . All outputs:
+ - sections are numbered by default.
+ . Info output:
+ - punctuation is inserted after @pxref and @ref, if needed to make
+ cross-references valid.
+ - line numbers included in index menus, so Info readers can go to
+ the exact line of an entry, not just a node. Also in plaintext output.
+ - ^@^H[index^@^H] cookie included in index menus, so Info readers
+ can handle the ] etc. commands better.
+ . HTML output:
+ - new algorithm for cross-references to other manuals, for maximum
+ portability and stability.
+ - include node name in <title> with split output.
+ - @multicolumn fractions become percentages.
+ - entities used for bullets, quotes, dashes, and others.
+ - index entries are links to the exact locations.
+ - <h4> and <h5> used for @sub and @subsubsections again.
+ - accented dotless i supported.
+ . XML output: many new tags and structure to preserve more source features.
+ . Docbook output:
+ - upgraded DTD to Docbook XML 4.2, no longer using Docbook SGML.
+ - improved translation in general, for instance:
+ - line annotations and marked quotations.
+* texi2dvi:
+ . if available, use etex (pdfetex if --pdf) by default.
+ . if the input file includes thumbpdf.sty (for LaTeX), then run thumbpdf.
+ . more output if --debug.
+* texinfo.tex:
+ . @defun names are now printed in typewriter (instead of bold), and
+ within the arguments, @var text is printed in slanted typewriter.
+ . @tex code is executed inside a TeX group, so that any changes must
+ be prefixed with \global (or the equivalent) to be effective. (This
+ change was actually made years ago, but never made it into the NEWS.)
+* info:
+ . new option --where (aka --location, -w) to report where an Info file
+ would be found, instead of reading it.
+ . by default, output ANSI terminal escape sequences as-is; new option
+ --no-raw-escapes overrides this.
+ . use the newly-generated index line numbers.
+* Distribution:
+ . new script gendocs.sh (not installed), for use by GNU maintainers in
+ getting their manuals on the GNU web site. Documented in
+ maintain.texi (http://www.gnu.org/prep/maintain/).
+ . Most code uses ANSI C prototypes, to some extent.
+ . New translation: nb.
+ . automake 1.8.3, autoconf 2.59, gettext 0.14.1.
+
+
+4.6 (10 June 2003)
+* Language:
+ . new command @/ specifies an allowable breakpoint within a line.
+ . new command @dofirstparagraphindent to control whether the first
+ paragraph following a section heading is indented. Default is to
+ omit this indentation, unlike the output up to now.
+ . new command @indent for explicitly indenting a paragraph.
+ . makeinfo writes a new construct for @image in Info output, so that
+ graphical Info browsers (such as Emacs Info under X) can display an
+ actual image. (Standalone Info ignores this, since it runs in a tty.)
+* makeinfo:
+ . Common:
+ - search for image files in the include file search path.
+ - warns if @value is used on an undefined variable.
+ . Info output:
+ - default --split-size now 300,000 bytes, up from 50,000.
+ - with --enable-encoding and a given @documentencoding,
+ output a Local Variables section specifying that encoding, for use
+ with Emacs.
+ . HTML output:
+ - uses <h3> at the smallest.
+ - a few css <style> definitions are included to better
+ implement @format, @display, @small..., etc.
+ - new option --css-include=FILE includes FILE in the <style>.
+ - @cartouche now outputs a <table> with a border.
+* texinfo.tex:
+ . new Polish translation txi-pl.tex.
+* texi2dvi:
+ . --command=CMD replaces --texinfo=CMD; it inserts CMD at the first
+ line of LaTeX files now, or after the @setfilename for Texinfo files.
+* info:
+ . RET now goes to the nearest xref (rather like Emacs Info),
+ instead of the next xref starting on the current line.
+* Distribution:
+ . new Romanian (ro) translation.
+ . variables now declared const where appropriate.
+ . gettext 0.12.1, automake 1.7.5.
+
+
+4.5 (4 February 2003)
+* info:
+ . a bug in 4.4 prevented compressed info files from being found.
+* Distribution:
+ . detect sys/ptem.h on Solaris.
+
+
+4.4 (31 January 2003)
+* Language:
+ . The ' (ASCII apostrophe/right quote) character is finally allowed in
+ node and anchor names. Thus, after installing this texinfo.tex,
+ existing .aux files will cause errors! Remove them and rerun TeX to
+ generate good ones.
+ . @value constructs are now expanded in the filename arguments to
+ @include and @verbatiminclude.
+* makeinfo:
+ . @macro names may no longer include ^ or _, for the sake of math mode.
+ . bug fix: @copying text is now reflected in tag table positions;
+ before, nodes may not have been found with a long-enough @copying.
+ . bug fix: html @verb arg is quoted properly, and does not imply
+ a paragraph break.
+* texinfo.tex:
+ . @smallexample and the like now output in a smaller font (9pt) in all
+ paper formats, not just @smallbook and @afourpaper.
+ . new translation txi-tr.tex.
+ . bug fix: <>| and other characters do not disappear when they are
+ first on a line in @verbatim.
+* install-info:
+ . bug fix: don't translate the `* Menu' info keyword.
+* info:
+ . CTRL-H is treated like DEL in incremental search.
+ . arrow keys once again work in isearch contexts under Solaris.
+* infokey:
+ . use .info key bindings before defaults.
+ . allow prefix keys to be disabled.
+* Distribution:
+ . update to GNU FDL 1.2 (http://www.gnu.org/licenses/fdl.html).
+ . getopt and other common library files updated from gnulib
+ (http://savannah.gnu.org/projects/gnulib/).
+ . autoconf 2.57, automake 1.7.2.
+
+
+4.3 (14 November 2002)
+* Language:
+ . new command @tie{} to do a real tie (unbreakable interword space).
+* makeinfo:
+ . html output for @defun and friends now has font changes.
+ . html output has some class attributes.
+ . xml and docbook output improved in many details.
+* texinfo.tex:
+ . new Italian translations, txi-it.tex.
+ . pdf bookmarks for unnumbered sections work.
+ . type name for @defun and friends no longer extends into margin.
+* info:
+ . automatic-footnotes now off by default, for emacs compatibility.
+ . crash when MALLOC_CHECK_=2 fixed.
+* install-info:
+ . new option --infodir synonym for --info-dir, for compatibility with
+ the Debian install-info.
+ . support for bzip2-compressed files.
+* texindex:
+ . omit initial if the entire index is under one character.
+* Distribution:
+ . development sources now available under CVS, see
+ http://savannah.gnu.org/projects/texinfo/
+ . Turkish message translation.
+ . gettext 0.11.5, autoconf 2.54, automake 1.7.1.
+
+
+4.2 (1 April 2002)
+* Language:
+ . new command @copying to define copying permissions. See above.
+ . new conditionals @ifplaintext, @ifnotplaintext for the plain text
+ (--no-headers) output format.
+ . new command @\ to produce literal \ inside @math, since \ by itself
+ no longer works.
+* makeinfo:
+ . emit accesskey attributes for keyboard shortcuts to menu items.
+ . @{even,every,odd}{footing,header} are ignored by makeinfo now, so
+ they no longer need to be enclosed in @iftex.
+* texinfo.tex:
+ . bug fix for pdf-format table of contents.
+* info:
+ . bug fixes for -R (--raw-escapes).
+ . --help shows short option names.
+* Distribution:
+ . the doc.c, funs.h, and key.c files in info/ are no longer generated
+ at make time, to appease Automake's make distcheck.
+ . gettext 0.11.1, autoconf 2.53, automake 1.6 (with install-info kludge).
+
+
+4.1 (4 March 2002)
+* Language:
+ . new commands @verbatim and @verb for printing verbatim inserts.
+ . new command @verbatiminclude for verbatim include of files.
+ . new environment @documentdescription for defining the HTML description.
+ . new command @afivepaper for the A5 paper size.
+* makeinfo:
+ . supports xml and docbook output.
+ . supports HTML splitting by node, which is now the default.
+ . new option --split-size to control maximum size of split info files.
+ . new option --enable-encoding to enable
+* info:
+ . user-specified key bindings supported.
+ . ANSI escape sequences (as produced by groff) removed from man output
+ by default; use --raw-escapes to let them through if your terminal
+ supports them.
+ . RET terminates incremental search normally.
+* texinfo.tex:
+ . @math implies @tex, so all the usual plain TeX math is supported.
+ . smaller fonts for @smallexample, in all page sizes.
+ . improvements in the PDF support.
+* texi2dvi:
+ . new option -o to explicitly specify output filename.
+* Distribution:
+ . switch to GNU Free Documentation License (http://www.gnu.org/copyleft/).
+ . update to GNU gettext 0.11, autoconf 2.52, and automake 1.5.
+ . Danish, Swedish, and Hebrew message translations.
+
+
+4.0 (28 September 1999)
+* Language:
+ . New command @anchor for cross references to arbitrary points.
+ . New commands @documentlanguage sets the main document language,
+ and @documentencoding sets the document input encoding (although not
+ much is done yet with either).
+ . New command @pagesizes allows limited control of text area for typesetting.
+ . New command @acronym for abbreviations in all caps, such as `NASA'.
+ . New command @alias for simple command aliases.
+ . New command @definfoenclose for better control of info output.
+ . New commands @deftypeivar for typed instance variables of a class
+ and @deftypeop for typed operations of a class.
+ . New command @novalidate suppresses cross-reference checking and (in
+ TeX) auxiliary file creation.
+ . New commands @setcontentsaftertitlepage and
+ @setshortcontentsaftertitlepage to force printing the table of
+ contents after @end titlepage. Also, @contents and @shortcontents
+ themselves can now appear at the beginning of the document as
+ well as the end.
+ . New markup commands: @env (for environment variables), @command (for
+ command names), @option (for command-line options).
+ . New commands @smallformat and @smalldisplay, a la @smallexample.
+ . New command @exampleindent to set indentation of example-like
+ environments a la @paragraphindent.
+ . @uref takes an optional third argument of text to show instead of
+ (rather than in addition to) the url for info and dvi output.
+ . @footnote works in an @item for a @table.
+* texinfo.tex:
+ . latest version always at ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+ (and mirrors).
+ . implements @macro.
+ . implements @paragraphindent (except asis).
+ . @emph and @i use true italic type (cmti) instead of slanted (cmsl).
+ . implements pdf output when run with pdftex.
+ . better support for internationalization via txi-??.tex files.
+ . footnotes now set in a smaller point size.
+* makeinfo:
+ . supports HTML output with the --html option.
+ . implication of --html: @top nodes should be wrapped in @ifnottex
+ rather than @ifinfo. @ifinfo conditionals are not expanded with --html.
+ . new option --number-sections to output chapter/section numbers.
+ . dashes and quotes are not treated specially in node names.
+ . new option --commands-in-node-names to allow @-commands in node names.
+ (Not implemented in TeX, and most likely never will be.)
+ . @emph output uses _underscores_.
+ . @image looks for .png files before .jpg.
+ . only output `Making ... file' line when verbose.
+ . allow -v as synonym for --verbose.
+ . new command line options to specify which conditionals to process
+ (but --iftex is not fully implemented).
+ . warns if @var contains any of ,[]().
+ . @quote-arg implicitly done for all one-argument macros, so commas in
+ the argument text are allowed.
+ . \\ required in macro body to get single \, no other `escapes' defined.
+* info:
+ . ISO Latin 1 characters are displayed and input as-is by default.
+ . new option --vi-keys to enable vi-like and less-like key bindings.
+ . new command S does case-sensitive searching.
+ . new commands C-x n and C-x N repeat last search, respectively, in the
+ same and in reverse direction, without prompting for the string. These
+ commands are bound to n and N under --vi-keys, like in Less.
+ . new command G menu1 menu2 ... searches for menu items from (dir),
+ as allowed on the command line.
+ . new command O (capital o, not zero) goes directly to the node that
+ describes command-line options.
+ . new command-line option --show-options causes the node which
+ describes command-line options to be the first node displayed.
+ . M-prior and M-DEL do new command info-scroll-other-window-backward.
+ . / searches like s does.
+ . If the search string includes upper-case letters, in both incremental
+ and non-incremental search, the search is case-sensitive.
+ . S searches case-sensitively even if the search string is all
+ lower-case.
+ . - makes the argument negative (so e.g. `- /' searches backward).
+ . l restores point in the window returned to.
+ . SPC/DEL do not move outside the current document.
+ . foo.info is found before foo.
+ . `info foo --index-search=bar' now searches for bar in foo's index.
+ . support for files compressed with bzip2.
+* install-info:
+ . handles gzipped dir files.
+ . sort entries into alphabetical order.
+ . install direntries only in preceding dircategory, not in all.
+ . --delete does not require the info file to exist.
+ . --delete can handle XEmacs-style dir entries.
+* texi2dvi:
+ . bug fixed: now uses only the @iftex and @tex parts of the source.
+ . process LaTeX source as well as Texinfo source.
+ . output PDF (using pdftex) with new option --pdf.
+ . handles --OPTION=ARG style of command line arguments.
+ . new option --batch for progress reports but no interaction.
+ . new option --clean to remove all auxiliary files.
+ . new option --quiet for silence (unless there are errors).
+ . new option -I for specifying directories for @include to search.
+ . handles LaTeX files (running BibTeX etc.).
+* Fixes to util/gen-dir-node and util/fix-info-dir (formerly util/update-info).
+* Distribution:
+ . Man pages included.
+ . Czech and Norwegian message translations.
+ . Various translations for texinfo.tex fixed words included.
+ . DJGPP support.
+
+
+3.12 (3 March 1998)
+* Elisp files removed, since they are only usefully distributed with Emacs.
+* Restore inclusion of compile-time $(infodir) to INFOPATH.
+* install-info creates a proper dir file.
+* Various portability fixes.
+
+
+3.11 (31 July 1997)
+* New commands:
+ - @uref to make a reference to a url; @url now only indicates such.
+ - @image to include graphics (epsf for TeX).
+ - @deftypemethod and @deftypemethodx to document methods in strongly
+ typed object-oriented languages, such as C++.
+ - @html for raw HTML.
+ - @ifnothtml @ifnotinfo @ifnottex for more precise conditionals.
+ - @kbdinputstyle to control when @kbd uses the slanted typewriter font.
+ - @email takes second optional argument.
+* texinfo.tex reads texinfo.cnf (if present) for site-wide TeX
+ configuration; for example, A4 paper sizes.
+* info:
+ - arrow keys supported.
+ - trailing : in INFOPATH appends default path.
+ - new option --index-search for online help support.
+* makeinfo:
+ - output files removed if errors unless (new option) --force.
+ - new option -P to prepend to search path.
+ - macro expansion file can be standard output.
+* install-info creates a new dir file if necessary.
+* update-info script to create a dir file from all info files.
+* Elisp: texnfo-tex.el and detexinfo.el removed from the distribution;
+ - texnfo-tex features are now part of standard TeX & Texinfo packages;
+ - makeinfo --no-headers does a better job than detexinfo.el.
+* Documentation:
+ - Updates, revisions, corrections in the manual.
+ - makeinfo.texi removed, as it was a copy of what was in texinfo.texi.
+* gettext support in sources, French and German translations included.
+* info man page removed; use the Texinfo manual.
+* Automake used, other portability fixes.
+
+3.10 (nonexistent)
+
+
+3.9 (4 October 1996)
+* makeinfo:
+ - Give a suppressible (with --no-validate) error for references
+ outside of any node.
+ - Keep track of multitable output correctly for split files; this
+ caused nodes after the first multitable to be ``undefined''.
+* install-info:
+ - Rename --infodir option to --info-dir.
+ - More robust error checking to avoid various crashes.
+* configure: Include replacements for memcpy and memmove functions in
+ the distribution, in case they are missing.
+
+
+3.8 (30 September 1996)
+* Define and/or document new and/or previously existing commands:
+ Accents: @" @' @, @" @= @^ @` @~ @H @d @dotaccent @dotless @ringaccent
+ @tieaccent @u @ubaraccent @v
+ Special characters: @AA @AE @L @O @OE @aa @ae @exclamdown @l @o @oe
+ @pounds @questiondown @ss
+ Special punctuation: @! @? @enddots
+ dir file maintenance: @dircategory @direntry; also new program, install-info
+ HTML support: @email @url @ifhtml...@end ifhtml
+ Macros: @macro @unmacro
+ Tables: @multitable @tab
+ Hyphenation: @- @hyphenation
+ Spacing: @ @<TAB> @<NEWLINE>
+ Sectioning:
+ @headings singleafter/doubleafter (change heading style after current page)
+ @centerchap
+ @setchapterstyle
+ Other:
+ @shorttitlepage (simple title pages)
+ @detailmenu...@end detailmenu (help makeinfo parse master menus)
+* Makeinfo prefers an input file named `foo.texinfo' or `foo.texi' or
+ `foo.txinfo' to just `foo' (the latter most likely being an executable).
+* Makeinfo implements @. @! @? correctly, as end-of-sentence punctuation.
+* @key marks its argument with a lozenge in TeX and <...> in Info.
+* TeX output has substantially decreased interline spacing and other
+ formatting changes.
+* Remove these obsolete and never-documented commands:
+ @infotop
+ @infoappendix @infoappendixsec @infoappendixsubsec @infoappendixsubsubsec
+ @infochapter @infosection @infosubsection @infosubsubsection
+ @infounnumbered @infounnumberedsec @infounnumberedsubsec
+ @infounnumberedsubsubsec
+ @input
+ @smallbreak @medbreak
+ @overfullrule
+ @br
+* Deprecate these obsolete commands, to be removed in the next release:
+ @ctrl
+ @infoinclude
+ @iappendix @iappendixsection @iappendixsec @iappendixsubsec
+ @iappendixsubsubsec
+ @ichapter @isection @isubsection @isubsubsection
+ @iunnumbered @iunnumberedsec @iunnumberedsubsec @iunnumberedsubsubsec
+ @setchapterstyle
+ @titlespec
+
+
+3.7 (24 December 1995)
+* Have --version print texinfo release number as well as the individual
+ program version.
+* Better man page cleaning.
+* Update Elisp files from current Emacs release.
+
+
+3.6 (21 June 1995)
+* Unmatched brace error reporting improved.
+* Missing comment terminator prevented compilation.
+
+
+3.5 (20 June 1995)
+* Autoconf update.
+* Support for parallel makes.
+* make install does not install Elisp files.
+
+
+3.4 (19 June 1995)
+* Handle @ifhtml in Elisp.
+* Update FSF address.
+
+
+3.3 (15 June 1995)
+* Portability changes.
+* Compile Elisp files.
+* Don't distribute .info* files.
+
+
+3.2 (9 June 1995)
+* Standalone Info can read Unix man pages.
+* New commands: @! @? @^ @" @enddots.
+* makeinfo -E does macro expansion (and nothing else).
+
+
+3.1 (23 May 1993)
+Just bug fixes, see ChangeLog for full details.
+
+
+3.0: first release of Texinfo version 2, with many new commands.
+
+
+
+Here is the separate NEWS for old releases of Info:
+
+Version 2.11, Sat Apr 1 09:15:21 1995
+
+Changes since 2.7 beta:
+
+Although the basic code remains the same, there are numerous nits
+fixed, including some display bugs, and a memory leak. Some changes
+that have taken place with larger impact include the way in which the
+(dir) node is built; I have added in support for "localdir"
+directories among other things. Info files may be stored in
+compressed formats, and in their own subdirectories; menu items which
+do not explicitly name the node to which they are attached have the
+menu item name looked up as an Info file if it is not found within the
+current document. This means that the menu item:
+
+* Info:: The Info documentation reader.
+
+in (dir) refers to the info node "(info)Top".
+
+Please see the ChangeLog and documentation for details on other
+changes.
+
+Version 2.7 beta, Wed Dec 30 02:02:38 1992
+Version 2.6 beta, Tue Dec 22 03:58:07 1992
+Version 2.5 beta, Tue Dec 8 14:50:35 1992
+Version 2.4 beta, Sat Nov 28 14:34:02 1992
+Version 2.3 beta, Fri Nov 27 01:04:13 1992
+Version 2.2 beta, Tue Nov 24 09:36:08 1992
+Version 2.1 beta, Tue Nov 17 23:29:36 1992
+
+Changes since 2.5 beta:
+
+Note that versions 2.6 and 2.7 Beta were only released to a select group.
+
+* "info-" removed from the front of M-x commands.
+
+* Automatic footnote display. When you enter a node which contains
+ footnotes, and the variable "automatic-footnotes" is "On", Info pops
+ up a window containing the footnotes. Likewise, when you leave that
+ node, the window containing the footnotes goes away.
+
+* Cleaner built in documentation, and documentation functions.
+
+ Use:
+ o `M-x describe-variable' to read a variable's documenation
+ o `M-x describe-key' to find out what a particular keystroke does.
+ o `M-x describe-function' to read a function's documentation.
+ o `M-x where-is' to find out what keys invoke a particular function.
+
+* Info can "tile" the displayed windows (via "M-x tile-windows"). If
+ the variable "automatic-tiling" is "On", then splitting a window or
+ deleting a window causes the remaining windows to be retiled.
+
+* You can save every keystroke you type in a "dribble file" by using the
+ `--dribble FILENAME' option. You can initially read keystrokes from an
+ alternate input stream with `--restore FILENAME', or by redirecting
+ input on the command line `info < old-dribble'.
+
+* New behaviour of menu items. If the label is the same as the
+ target node name, and the node couldn't be found in the current file,
+ treat the label as a file name. For example, a menu entry in "DIR"
+ might contain:
+
+ * Emacs:: Cool text-editor.
+
+ Info would not find the node "(dir)Emacs", so just plain "(emacs)"
+ would be tried.
+
+* New variable "ISO-Latin" allows you to use European machines with
+ 8-bit character sets.
+
+* Cleanups in echo area reading, and redisplay. Cleanups in handling the
+ window which shows possible completions.
+
+* Info can now read files that have been compressed. An array in filesys.c
+ maps extensions to programs that can decompress stdin, and write the results
+ to stdout. Currently, ".Z"/uncompress, ".z"/gunzip, and ".Y"/unyabba are
+ supported. The modeline for a compressed file shows "zz" in it.
+
+* There is a new variable "gc-compressed-files" which, if non-zero, says
+ it is okay to reclaim the file buffer space allocated to a file which
+ was compressed, if, and only if, that file's contents do not appear in
+ any history node.
+
+* New file `nodemenu.c' implements a few functions for manipulating
+ previously visited nodes. `C-x C-b' (list-visited-nodes) produces a
+ menu of the nodes that could be reached by info-history-node in some
+ window. `C-x b' (select-visited-node) is similar, but reads one of
+ the node names with completion.
+
+* Keystroke `M-r' (move_to_screen_line) allows the user to place the cursor at
+ the start of a specific screen line. Without a numeric argument, place the
+ cursor on the center line; with an arg, place the cursor on that line.
+
+* Interruptible display implemented. Basic display speedups and hacks.
+* The message "*** Tags Out of Date ***" now means what it says.
+* Index searching with `,' (info-index-next) has been improved.
+* When scrolling with C-v, C-M-v, or M-v, only "Page Only" scrolling
+ will happen.
+
+* Continous scrolling (along with `]' (info-global-next) and `['
+ (info-global-prev) works better. `]' and `[' accept numeric
+ arguments, moving that many nodes in that case.
+
+* `C-x w' (info-toggle-wrap) controls how lines wider than the width
+ of the screen are displayed. If a line is too long, a `$' is
+ displayed in the rightmost column of the window.
+
+* There are some new variables for controlling the behaviour of Info
+ interactively. The current list of variables is as follows:
+
+ Variable Name Default Value Description
+ ------------- ------------- -----------
+ `automatic-footnotes' On When "On", footnotes appear and
+ disappear automatically.
+
+ `automatic-tiling' Off When "On", creating of deleting a
+ window resizes other windows.
+
+ `visible-bell' Off If non-zero, try to use a visible bell.
+
+ `errors-ring-bell' On If non-zero, errors cause a ring.
+
+ `show-index-match' On If non-zero, the portion of the string
+ matched is highlighted by changing its
+ case.
+
+ `scroll-behaviour' Continuous One of "Continuous", "Next Only", or
+ "Page Only". "Page Only" prevents you from
+ scrolling past the bottom or top of a node.
+ "Next Only" causes the Next or Prev node to
+ be selected when you scroll past the bottom
+ or top of a node. "Continous" moves
+ linearly through the files hierchichal
+ structure.
+
+ `scroll-step' 0 Controls how scrolling is done for you when
+ the cursor moves out of the current window.
+ Non-zero means it is the number of lines
+ you would like the screen to shift. A
+ value of 0 means to center the line
+ containing the cursor in the window.
+
+ `gc-compressed-files' Off If non-zero means it is okay to reclaim the
+ file buffer space allocated to a file which
+ was compressed, if, and only if, that
+ file's contents do not appear in the node
+ list of any window.
+
+ `ISO-Latin' Off Non-zero means that you are using an ISO
+ Latin character set. By default, standard
+ ASCII characters are assumed.
+________________________________________
+This release of Info is version 2.5 beta.
+
+Changes since 2.4 beta:
+
+* Index (i) and (,) commands fully implemented.
+* "configure" script now shipped with Info.
+* New function "set-variable" allows users to set various variables.
+* User-settable behaviour on end or beginning of node scrolling. This
+ supercedes the SPC and DEL changes in 2.3 beta.
+
+________________________________________
+This release of Info is version 2.4 beta.
+
+Changes since 2.3 beta:
+
+* info-last-node now means move to the last node of this info file.
+* info-history-node means move backwards through this window's node history.
+* info-first-node moves to the first node in the Info file. This node is
+ not necessarily "Top"!
+* SPC and DEL can select the Next or Prev node after printing an informative
+ message when pressed at the end/beg of a node.
+
+----------------------------------------
+This release of Info is version 2.3 beta.
+
+Changes since 2.2 beta:
+
+* M-x command lines if NAMED_COMMANDS is #defined. Variable in Makefile.
+* Screen height changes made quite robust.
+* Interactive function "set-screen-height" implements user height changes.
+* Scrolling on some terminals is faster now.
+* C-l with numeric arguement is fixed.
+
+----------------------------------------
+This release of Info is version 2.2 beta.
+
+Changes since 2.0:
+
+* C-g can now interrupt multi-file searches.
+* Incremental search is fully implemented.
+* Loading large tag tables is much faster now.
+* makedoc.c replaces shell script, speeding incremental builds.
+* Scrolling in redisplay is implemented.
+* Recursive uses of the echo area made more robust.
+* Garbage collection of unreferenced nodes.
diff --git a/Build/source/utils/texinfo/README b/Build/source/utils/texinfo/README
new file mode 100644
index 00000000000..879b59b4b36
--- /dev/null
+++ b/Build/source/utils/texinfo/README
@@ -0,0 +1,112 @@
+$Id: README,v 1.16 2004/12/13 13:36:32 karl Exp $
+This is the README file for the GNU Texinfo distribution. Texinfo is
+the preferred documentation format for GNU software.
+
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+See ./INSTALL* for installation instructions.
+
+Primary distribution point: ftp://ftp.gnu.org/gnu/texinfo/
+ (list of mirrors at: http://www.gnu.org/prep/ftp.html)
+
+Home page: http://www.gnu.org/software/texinfo/
+ (list of mirrors at: http://www.gnu.org/server/list-mirrors.html)
+ This page includes links to other Texinfo-related programs.
+
+Mailing lists and archives:
+- bug-texinfo@gnu.org for bug reports or enhancement suggestions,
+ archive: http://mail.gnu.org/pipermail/bug-texinfo
+- help-texinfo@gnu.org for authoring questions and general discussion,
+ archive: http://mail.gnu.org/pipermail/help-texinfo
+- texinfo-pretest@texinfo.org for pretests of new releases,
+ archive: http://texinfo.org/ftp/texinfo-pretest-archive
+There are no corresponding newsgroups.
+
+Bug reports:
+ please include enough information for the maintainers to reproduce the
+ problem. Generally speaking, that means:
+- the contents of any input files necessary to reproduce the bug (crucial!).
+- a description of the problem and any samples of the erroneous output.
+- the version number of Texinfo and the program(s) involved (use --version).
+- hardware, operating system, and compiler versions (uname -a).
+- unusual options you gave to configure, if any (see config.status).
+- anything else that you think would be helpful.
+
+Patches are most welcome; if possible, please make them with diff -c and
+include ChangeLog entries.
+
+When sending email, please do not encode or split the messages in any
+way if at all possible; it's easier to deal with one large message than
+many small ones. GNU shar (http://www.gnu.org/software/sharutils/) is a
+convenient way of packaging multiple and/or binary files for email.
+
+See README.dev for information on the Texinfo development environment --
+any interested parties are welcome. If you're a programmer and wish to
+contribute, this should get you started. And if you're not a
+programmer, you can still make significant contributions by writing test
+cases, checking the documentation against the implementation, etc.
+
+This distribution includes the following files, among others:
+ README This file.
+ README.dev Texinfo developer information.
+
+ INSTALL Texinfo-specific installation notes.
+ NEWS Summary of new features by release.
+ INTRODUCTION Brief introduction to the system, and
+ how to create readable files from the
+ Texinfo source files in this distribution.
+
+Texinfo documentation files (in ./doc):
+ texinfo.txi Describes the Texinfo language and many
+ of the associated tools. It tells how
+ to use Texinfo to write documentation,
+ how to use Texinfo mode in GNU Emacs,
+ TeX, makeinfo, and the Emacs Lisp
+ Texinfo formatting commands.
+
+ info.texi This manual tells you how to use
+ Info. This document also comes as part of
+ GNU Emacs. If you do not have Emacs,
+ you can format this Texinfo source
+ file with makeinfo or TeX and then
+ read the resulting Info file with the
+ standalone Info reader that is part of
+ this distribution.
+
+ info-stnd.texi This manual tells you how to use
+ the standalone GNU Info reader that is
+ included in this distribution as C
+ source (./info).
+
+Printing related files:
+ doc/texinfo.tex This TeX definitions file tells
+ the TeX program how to typeset a
+ Texinfo file into a DVI file ready for
+ printing.
+
+ util/texindex.c This file contains the source for
+ the `texindex' program that generates
+ sorted indices used by TeX when
+ typesetting a file for printing.
+
+ util/texi2dvi This is a shell script for
+ producing an indexed DVI file using
+ TeX and texindex.
+
+Source files for standalone C programs:
+ ./lib
+ ./makeinfo
+ ./info
+
+Installation files:
+ Makefile.am What Automake uses to make a Makefile.in.
+ Makefile.in What `configure' uses to make a Makefile,
+ created by Automake.
+ configure.ac What Autoconf uses to create `configure'.
+ configure Configuration script for local conditions,
+ created by Autoconf.
diff --git a/Build/source/utils/texinfo/README.dev b/Build/source/utils/texinfo/README.dev
new file mode 100644
index 00000000000..cf0dc9de961
--- /dev/null
+++ b/Build/source/utils/texinfo/README.dev
@@ -0,0 +1,44 @@
+$Id: README.dev,v 1.7 2003/11/24 15:11:06 karl Exp $
+README.dev - Texinfo developer information.
+
+ Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+The development sources for Texinfo is available through anonymous cvs
+at Savannah, see
+ http://savannah.gnu.org/cvs/?group=texinfo
+
+This distribution uses whatever versions of automake, autoconf, and
+gettext are listed in NEWS; usually the latest ones released. If you
+are getting the Texinfo sources from cvs, or change the Texinfo
+configure.ac, you'll need to have these tools installed to (re)build.
+You'll also need help2man. (All of these are available from
+ftp://ftp.gnu.org/gnu.)
+
+Here's the order in which to run the tools for a fresh build:
+
+ autoheader # creates config.in, not necessarily needed every time
+ aclocal -I m4 # for a new version of automake
+ automake
+ autoconf
+ configure CFLAGS=-g --enable-maintainer-mode
+ make
+
+(with arguments to taste, of course.) Or you can run
+
+ ./bootstrap
+
+instead of the various auto* tools.
+
+
+One final note: If you would like to contribute to the GNU project by
+implementing additional documentation output formats for Texinfo, that
+would be great. But please do not write a separate translator texi2foo
+for your favorite format foo! That is the hard way to do the job, and
+makes extra work in subsequent maintenance, since the Texinfo language
+is continually being enhanced and updated. Instead, the best approach
+is modify Makeinfo to generate the new format, as it does now for Info,
+HTML, XML, and DocBook.
diff --git a/Build/source/utils/texinfo/TODO b/Build/source/utils/texinfo/TODO
new file mode 100644
index 00000000000..0fcaa5c5991
--- /dev/null
+++ b/Build/source/utils/texinfo/TODO
@@ -0,0 +1,181 @@
+$Id: TODO,v 1.26 2004/11/22 23:57:32 karl Exp $
+This is the todo list for GNU Texinfo.
+If you are interested in working on any of these, email bug-texinfo@gnu.org.
+
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003,
+ 2001, 2002, 2003, 2004 Free Software Foundation.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+* General:
+ - @euro{}.
+ - Support installation of manuals in different languages, along these lines:
+ . support a LINGUAS file or variable saying which subdirs LL in the
+ source to descend into (under doc/).
+ . within each subdir LL, install the info files into $infodir/LL,
+ and run install-info on $infodir/LL/dir.
+ . info (both emacs and standalone) should read $infodir/$LANG/dir
+ as the first dir file, and likewise read info files first from
+ $infodir/$LANG, before falling back to $infodir.
+ . consider ways to avoid installing images in both places.
+ In fact, images probably need to be installed in a subdir
+ $infodir/MANUAL/ in the first place, to avoid conflicts of having
+ the same image name in different manuals.
+ For a test case, see texinfo cvs, with its one translated manual
+ (info-fr.texi).
+ From Wojciech Polak.
+ - Monitor and improve the dir categories in existing manuals,
+ following the Free Software Directory categories. Much mail to
+ developers has already been sent, what's needed now is to check new
+ releases and make sure they are using the right categories.
+ See the util/dir-example in the Texinfo distribution for our current
+ recommended categories.
+ For background, see the thread (which discusses a lot of other
+ issues too) at
+ http://mail.gnu.org/pipermail/emacs-devel/2002-10/msg00011.html,
+ especially
+ http://mail.gnu.org/archive/html/emacs-devel/2002-10/msg00090.html
+ http://mail.gnu.org/archive/html/emacs-devel/2002-10/msg00137.html
+ - Get Info declared as a MIME Content-Type.
+ - Likewise the `info:' URI scheme; a library consortium has proposed a
+ completely different purpose for the URI scheme, but I don't know
+ how to send comments, despite it being a "request for comments". Sigh.
+ There is mail about this in the bug-texinfo archives:
+ http://mail.gnu.org/archive/html/bug-texinfo/2003-09/msg00086.html
+ - Support compressed image files.
+ - Support reference card creation, perhaps by only paying attention to
+ sectioning and @def... commands.
+ - Allow @end (and other?) commands to be indented in the source.
+ - Test for memory leaks, e.g., with valgrind:
+ http://developer.kde.org/~sewardj/
+ - Extend and improve the tests.
+
+* Language:
+ - @else for the @if... conditionals.
+ - @xindexterm [def] primary [,secondary [,tertiary]] or some such?
+ - Allow subitems and `see' and `see also' in indices.
+ - multicolumn * width to take up `the rest'.
+ - another table command to take N succeeding items and split them
+ into M columns (see eplain).
+ - support bibliographies with BibTeX (see web2c/doc for kludge prototype).
+ - @flushboth to combine @flushleft and @flushright, for RFC's.
+ - @part sectioning command.
+ - @exercise/@answer command for, e.g., gawk.
+ - Allow @hsep/@vsep at @item, instead of just in template.
+ - Support automatic line numbering of examples.
+ - Better macro syntax.
+ - Better def... command syntax.
+ - Allow : in node names for info files, for names like
+ `class::method'. Likewise index entries. A quoting mechanism such
+ as surrounding node names with SPACE BACKSPACE is probably the best
+ solution, although this is an incompatible change to Info format, sigh.
+ - Glossary/general definition support (dumas msg 28 Nov 2003 17:09:57 +0100).
+ - Add support for other Latin 9 (and Latin 2 and Latin 1) characters.
+
+* Makeinfo:
+ - Translation of "Appendix" etc. should depend on @doclang not $LANG.
+ - Try directory of main source file.
+ - Make makeinfo -E just do macro expansion, avoiding all error checks.
+ That way, texi2dvi could run makeinfo --iftex -E.
+ - A detexinfo program, like detex or delatex. This command would
+ strip all the texinfo commands out, and would be used as a filter on
+ the way to a speller. An option would be to NOT strip comments out.
+ makeinfo --no-headers comes close.
+ - If node name contains an @ command, complain explicitly.
+ - Use @documentlanguage instead of LANG for many translations.
+ - HTML: split output by chapter to improve context, per Akim.
+ Generate dummy files for all nodes for the sake of cross-references.
+ - HTML: support thumbnails.
+ - HTML: make images of math, maybe.
+ - HTML: allow settable background color, table colors and spacing,
+ <head> meta tags, etc. A la http://texi2html.cvshome.org. In fact:
+ - HTML: have a library of different CSS styles.
+ http://mail.gnu.org/archive/html/bug-texinfo/2004-01/msg00025.html
+ - XML: cannot be loaded directly in a browser; why not?
+ - Docbook: &euro; and other entities do not work; does anything work?
+ - Rewrite completely to simplify generation of different formats.
+
+* TeX:
+ - Use @ as the escape character, and Texinfo syntax generally, in the
+ table of contents and index files. Eliminate all the crazy
+ multiple redefinitions of every Texinfo command in different contexts.
+ - Support input in any encoding and language, via ec or Latin Modern fonts.
+ - Reasonable way to change fonts from the default (some work has been
+ done), to allow for PostScript fonts, for example.
+ - @multitable: handle @hsep and @vsep.
+ - @multitable: repeat table headings if multiple pages long.
+ - @multitable: support a heading line concept (<thead> in HTML).
+ - Introduce new command to change \bindingoffset.
+ - How about using latex2html to produce HTML?
+ - Table of contents gets misaligned if there are 10 or more [sub]sections.
+ - Use url.sty (or something) to allow linebreak of url's.
+ - Include hyperlink \special's in the DVI output for xdvi, etc.
+ - PDF: make each letter of the index (A, B, ...) a section in the TOC.
+ From Carsten Dominik <dominik@astro.uva.nl>.
+
+* Doc:
+ - Include a complete functional summary, as in a reference card, in
+ the manual.
+ - Improve the manuals, especially for makeinfo, standalone info, etc.
+ - new section on doing dedication pages. See gawk.texi
+ for an example of doing it in both the tex and info versions.
+
+* Info:
+ - Regular expression search.
+ - Full-text search across all info files installed on the system.
+ - Support character sets other than ISO Latin 1.
+ - Perhaps comply with LANGUAGE setting on a per-node basis, to allow
+ incremental translation of Texinfo files.
+ - Search all nodes of dir file at startup, then can have
+ INFO-DIR-SEPARATE-GROUPS and other such.
+ - Better dir file merging.
+ - Global dir file (as in /etc/conf/dir) and texinfo config file
+ specifying which info directories to search. From Dale Mellor.
+ http://mail.gnu.org/mailman/private/gnu-prog-discuss/2003q4/000439.html
+ - Steal interface ideas from Lynx: number links, use color, etc.
+ Perhaps code from the pinfo viewer can be reused:
+ http://zeus.polsl.gliwice.pl/~pborys/.
+ - More sample .infokey files, so people can choose without writing their own.
+ - q within help should quit help like C-x 0.
+ - Incorporate an X-based viewer, perhaps saxinfo or tkinfo
+ http://www.math.ucsb.edu/~boldt/tkinfo/
+ - Make "info foo bar" search for bar in foo's index(es) if no menu match.
+ - Handle M-n, C-u m, and C-u g like Emacs Info (opening new windows).
+ - Write technical definition of Info format.
+
+* install-info:
+ - be able to copy the info file to compile-time $infodir, to
+ simplify by-hand installation.
+ - also support installing HTML files, etc., along with subsidiary
+ @image (or other) files. In subdirs. Or something.
+ - support info dir entries for other than the current info file name;
+ see comments in menu_item_equal.
+ - merge features with Debian install-info, so we can have one program.
+
+* texindex:
+ - read source file (specified by new option) for @documentlanguage
+ and/or @documentencoding, and change the sorting appropriately.
+ From: Wojciech Polak, 26 Apr 2003 11:30:59 +0200.
+
+* Distribution:
+ - generate txi-??.tex from .po's to make translators' jobs easier.
+ From Akim and Karl E.
+
+Ideas that will not be implemented:
+- Process Texinfo files directly instead of converting to Info:
+ ftp://ftp.cs.berkeley.edu/ucb/people/phelps/tcltk/tkman.tar.Z, which
+ uses Tcl/Tk 8.0 from ftp.smli.com in the /pub/tcl directory.
+ From: phelps@ecstasy.CS.Berkeley.EDU (Tom Phelps)
+ [This has the disadvantage of needing to be updated when the
+ Texinfo language changes, so don't.]
+
+- Call Ghostscript to get ASCII/jpg output for the @image command.
+ [makeinfo should not try to be make, or assume it knows how the user
+ wants to generate images. Too many different methods are possible.]
+
+- Change bars. This is difficult or impossible in TeX,
+ unfortunately. To do it right requires device driver support.
+ wdiff or ediff may be all we can do. Merely specifying what should be
+ changed is not obvious.
diff --git a/Build/source/utils/texinfo/acinclude.m4 b/Build/source/utils/texinfo/acinclude.m4
new file mode 100644
index 00000000000..1e107db4021
--- /dev/null
+++ b/Build/source/utils/texinfo/acinclude.m4
@@ -0,0 +1,89 @@
+# Source file used by aclocal in generating aclocal.m4.
+
+#serial 3
+
+AC_DEFUN(jm_CHECK_DECLARATION,
+[
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ test -z "$ac_cv_header_memory_h" && AC_CHECK_HEADERS(memory.h)
+ test -z "$ac_cv_header_string_h" && AC_CHECK_HEADERS(string.h)
+ test -z "$ac_cv_header_strings_h" && AC_CHECK_HEADERS(strings.h)
+ test -z "$ac_cv_header_stdlib_h" && AC_CHECK_HEADERS(stdlib.h)
+ test -z "$ac_cv_header_unistd_h" && AC_CHECK_HEADERS(unistd.h)
+ AC_MSG_CHECKING([whether $1 is declared])
+ AC_CACHE_VAL(jm_cv_func_decl_$1,
+ [AC_TRY_COMPILE($2,
+ [
+#ifndef $1
+char *(*pfn) = (char *(*)) $1
+#endif
+ ],
+ eval "jm_cv_func_decl_$1=yes",
+ eval "jm_cv_func_decl_$1=no")])
+
+ if eval "test \"`echo '$jm_cv_func_decl_'$1`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ ifelse([$3], , :, [$3])
+ else
+ AC_MSG_RESULT(no)
+ ifelse([$4], , , [$4
+])dnl
+ fi
+])dnl
+
+dnl jm_CHECK_DECLARATIONS(INCLUDES, FUNCTION... [, ACTION-IF-DECLARED
+dnl [, ACTION-IF-NOT-DECLARED]])
+AC_DEFUN(jm_CHECK_DECLARATIONS,
+[
+ for jm_func in $2
+ do
+ jm_CHECK_DECLARATION($jm_func, $1,
+ [
+ jm_tr_func=HAVE_DECL_`echo $jm_func | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+ AC_DEFINE_UNQUOTED($jm_tr_func) $3], $4)dnl
+ done
+])
+
+#serial 1
+# this is check-decl.m4 in sh-utils 1.16k/m4/check-decl.m4
+# with a different function list.
+
+dnl This is just a wrapper function to encapsulate this kludge.
+dnl Putting it in a separate file like this helps share it between
+dnl different packages.
+AC_DEFUN(txi_CHECK_DECLS,
+[
+ headers='
+#include <stdio.h>
+#ifdef HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#else
+# ifdef HAVE_STRINGS_H
+# include <strings.h>
+# endif
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+'
+
+ if test x = y; then
+ dnl This code is deliberately never run via ./configure.
+ dnl FIXME: this is a gross hack to make autoheader put entries
+ dnl for each of these symbols in the config.h.in.
+ dnl Otherwise, I'd have to update acconfig.h every time I change
+ dnl this list of functions.
+ AC_DEFINE(HAVE_DECL_STRERROR, 1, [Define if this function is declared.])
+ AC_DEFINE(HAVE_DECL_STRCASECMP, 1, [Define if this function is declared.])
+ AC_DEFINE(HAVE_DECL_STRNCASECMP, 1, [Define if this function is declared.])
+ AC_DEFINE(HAVE_DECL_STRCOLL, 1, [Define if this function is declared.])
+ fi
+
+ jm_CHECK_DECLARATIONS($headers, strerror strcasecmp strncasecmp strcoll)
+])
diff --git a/Build/source/utils/texinfo/aclocal.m4 b/Build/source/utils/texinfo/aclocal.m4
new file mode 100644
index 00000000000..aae5484d262
--- /dev/null
+++ b/Build/source/utils/texinfo/aclocal.m4
@@ -0,0 +1,1090 @@
+# generated automatically by aclocal 1.9.4 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# -*- Autoconf -*-
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Generated from amversion.in; do not edit by hand.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.4])])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 6
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# serial 7 -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+#serial 2
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# This macro actually does too much some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 11
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# -*- Autoconf -*-
+# Copyright (C) 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# -*- Autoconf -*-
+
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/codeset.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/glibc21.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/intdiv0.m4])
+m4_include([m4/intmax.m4])
+m4_include([m4/inttypes-pri.m4])
+m4_include([m4/inttypes.m4])
+m4_include([m4/inttypes_h.m4])
+m4_include([m4/lcmessage.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/longdouble.m4])
+m4_include([m4/longlong.m4])
+m4_include([m4/mkstemp.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/onceonly_2_57.m4])
+m4_include([m4/po.m4])
+m4_include([m4/printf-posix.m4])
+m4_include([m4/progtest.m4])
+m4_include([m4/signed.m4])
+m4_include([m4/size_max.m4])
+m4_include([m4/stdint_h.m4])
+m4_include([m4/strcase.m4])
+m4_include([m4/uintmax_t.m4])
+m4_include([m4/ulonglong.m4])
+m4_include([m4/wchar_t.m4])
+m4_include([m4/wint_t.m4])
+m4_include([m4/xsize.m4])
diff --git a/Build/source/utils/texinfo/config.guess b/Build/source/utils/texinfo/config.guess
new file mode 100755
index 00000000000..d0d57f6945f
--- /dev/null
+++ b/Build/source/utils/texinfo/config.guess
@@ -0,0 +1,1465 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-09-19'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/utils/texinfo/config.in b/Build/source/utils/texinfo/config.in
new file mode 100644
index 00000000000..cc9fc88828c
--- /dev/null
+++ b/Build/source/utils/texinfo/config.in
@@ -0,0 +1,420 @@
+/* config.in. Generated from configure.ac by autoheader. */
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */
+#undef ENABLE_NLS
+
+/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
+#undef GWINSZ_IN_SYS_IOCTL
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define to 1 if you have the `asprintf' function. */
+#undef HAVE_ASPRINTF
+
+/* Define to 1 if you have the `bzero' function. */
+#undef HAVE_BZERO
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+ */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FEOF_UNLOCKED
+
+/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FGETS_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETC_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `memchr', and to 0 if you don't.
+ */
+#undef HAVE_DECL_MEMCHR
+
+/* Define to 1 if you have the declaration of `strcoll', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRCOLL
+
+/* Define to 1 if you have the declaration of `strerror', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRERROR
+
+/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL__SNPRINTF
+
+/* Define to 1 if you have the declaration of `_snwprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL__SNWPRINTF
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fwprintf' function. */
+#undef HAVE_FWPRINTF
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getegid' function. */
+#undef HAVE_GETEGID
+
+/* Define to 1 if you have the `geteuid' function. */
+#undef HAVE_GETEUID
+
+/* Define to 1 if you have the `getgid' function. */
+#undef HAVE_GETGID
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the `getuid' function. */
+#undef HAVE_GETUID
+
+/* Define if you have the iconv() function. */
+#undef HAVE_ICONV
+
+/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_INTMAX_T
+
+/* Define if <inttypes.h> exists and doesn't clash with <sys/types.h>. */
+#undef HAVE_INTTYPES_H
+
+/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
+ declares uintmax_t. */
+#undef HAVE_INTTYPES_H_WITH_UINTMAX
+
+/* Define to 1 if you have the <io.h> header file. */
+#undef HAVE_IO_H
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if you have the `bsd' library (-lbsd). */
+#undef HAVE_LIBBSD
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the 'long double' type. */
+#undef HAVE_LONG_DOUBLE
+
+/* Define if you have the 'long long' type. */
+#undef HAVE_LONG_LONG
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the `memmove' function. */
+#undef HAVE_MEMMOVE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `munmap' function. */
+#undef HAVE_MUNMAP
+
+/* Define to 1 if you have the <ncurses/termcap.h> header file. */
+#undef HAVE_NCURSES_TERMCAP_H
+
+/* Define to 1 if you have the <nl_types.h> header file. */
+#undef HAVE_NL_TYPES_H
+
+/* Define if your printf() function supports format strings with positions. */
+#undef HAVE_POSIX_PRINTF
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `setenv' function. */
+#undef HAVE_SETENV
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the `setvbuf' function. */
+#undef HAVE_SETVBUF
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the `sigprocmask' function. */
+#undef HAVE_SIGPROCMASK
+
+/* Define to 1 if you have the `sigsetmask' function. */
+#undef HAVE_SIGSETMASK
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
+ uintmax_t. */
+#undef HAVE_STDINT_H_WITH_UINTMAX
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strcoll' function and it is properly defined.
+ */
+#undef HAVE_STRCOLL
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if you have the <sys/fcntl.h> header file. */
+#undef HAVE_SYS_FCNTL_H
+
+/* Define to 1 if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/ptem.h> header file. */
+#undef HAVE_SYS_PTEM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/stream.h> header file. */
+#undef HAVE_SYS_STREAM_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/ttold.h> header file. */
+#undef HAVE_SYS_TTOLD_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <termcap.h> header file. */
+#undef HAVE_TERMCAP_H
+
+/* Define to 1 if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define to 1 if you have the <termio.h> header file. */
+#undef HAVE_TERMIO_H
+
+/* Define to 1 if you have the `tsearch' function. */
+#undef HAVE_TSEARCH
+
+/* Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_UINTMAX_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the 'unsigned long long' type. */
+#undef HAVE_UNSIGNED_LONG_LONG
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define if you have the 'wchar_t' type. */
+#undef HAVE_WCHAR_T
+
+/* Define to 1 if you have the `wcslen' function. */
+#undef HAVE_WCSLEN
+
+/* Define if you have the 'wint_t' type. */
+#undef HAVE_WINT_T
+
+/* Define to 1 if you have the `__argz_count' function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define to 1 if you have the `__argz_next' function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define to 1 if you have the `__argz_stringify' function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define to 1 if you have the `__fsetlocking' function. */
+#undef HAVE___FSETLOCKING
+
+/* Define to 1 if you have the `__secure_getenv' function. */
+#undef HAVE___SECURE_GETENV
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define if integer division by zero raises signal SIGFPE. */
+#undef INTDIV0_RAISES_SIGFPE
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
+#undef PRI_MACROS_BROKEN
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define as the maximum value of type 'size_t', if the system doesn't define
+ it. */
+#undef SIZE_MAX
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to rpl_mkstemp if the replacement function should be used. */
+#undef mkstemp
+
+/* Define to `long' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Define as the type of the result of subtracting two pointers, if the system
+ doesn't define it. */
+#undef ptrdiff_t
+
+/* Define to empty if the C compiler doesn't support this keyword. */
+#undef signed
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to unsigned long or unsigned long long if <stdint.h> and
+ <inttypes.h> don't define. */
+#undef uintmax_t
diff --git a/Build/source/utils/texinfo/config.rpath b/Build/source/utils/texinfo/config.rpath
new file mode 100755
index 00000000000..4db13e50f66
--- /dev/null
+++ b/Build/source/utils/texinfo/config.rpath
@@ -0,0 +1,548 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2003 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | pw32* | os2*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ newsos6)
+ ;;
+ linux*)
+ case $CC in
+ icc|ecc)
+ wl='-Wl,'
+ ;;
+ ccc)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ wl='-Wl,'
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ case "$host_os" in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can use
+ # them.
+ ld_shlibs=no
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = yes; then
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+ bsdi4*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then
+ hardcode_direct=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+ freebsd2.2*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ freebsd2*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10* | hpux11*)
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=no
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=no
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ openbsd*)
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4.2uw2*)
+ hardcode_direct=yes
+ hardcode_minus_L=no
+ ;;
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ ;;
+ sysv5*)
+ hardcode_libdir_flag_spec=
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ ;;
+ aix4* | aix5*)
+ ;;
+ amigaos*)
+ ;;
+ beos*)
+ ;;
+ bsdi4*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ shrext=.dll
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ ;;
+ dgux*)
+ ;;
+ freebsd1*)
+ ;;
+ freebsd*)
+ ;;
+ gnu*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case "$host_cpu" in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux*)
+ ;;
+ netbsd*)
+ ;;
+ newsos6)
+ ;;
+ nto-qnx)
+ ;;
+ openbsd*)
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ ;;
+ osf3* | osf4* | osf5*)
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ ;;
+ sunos4*)
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ ;;
+ sysv4*MP*)
+ ;;
+ uts4*)
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/Build/source/utils/texinfo/config.sub b/Build/source/utils/texinfo/config.sub
new file mode 100755
index 00000000000..1c366dfde9a
--- /dev/null
+++ b/Build/source/utils/texinfo/config.sub
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | ms1 \
+ | msp430 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | ms1-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/utils/texinfo/configure b/Build/source/utils/texinfo/configure
new file mode 100755
index 00000000000..f38ef266cb1
--- /dev/null
+++ b/Build/source/utils/texinfo/configure
@@ -0,0 +1,14795 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for GNU Texinfo 4.8.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='GNU Texinfo'
+PACKAGE_TARNAME='texinfo'
+PACKAGE_VERSION='4.8'
+PACKAGE_STRING='GNU Texinfo 4.8'
+PACKAGE_BUGREPORT=''
+
+ac_unique_file="makeinfo/makeinfo.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+gl_header_list=
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP RANLIB ac_ct_RANLIB HELP2MAN ALLOCA LIBOBJS build build_cpu build_vendor build_os native_tools TOOLS_ONLY_TRUE TOOLS_ONLY_FALSE TERMLIBS host host_cpu host_vendor host_os INSTALL_WARNINGS_TRUE INSTALL_WARNINGS_FALSE MKINSTALLDIRS USE_NLS MSGFMT GMSGFMT XGETTEXT MSGMERGE GLIBC21 HAVE_POSIX_PRINTF HAVE_ASPRINTF HAVE_SNPRINTF HAVE_WPRINTF LIBICONV LTLIBICONV INTLBISON BUILD_INCLUDED_LIBINTL USE_INCLUDED_LIBINTL CATOBJEXT DATADIRNAME INSTOBJEXT GENCAT INTLOBJS INTL_LIBTOOL_SUFFIX_PREFIX INTLLIBS LIBINTL LTLIBINTL POSUB LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures GNU Texinfo 4.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of GNU Texinfo 4.8:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-multiplatform put executables in bin/PLATFORM
+ --disable-install-warnings omit make install warnings about TeX files
+ --disable-nls do not use Native Language Support
+ --disable-rpath do not hardcode runtime library paths
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-gnu-ld assume the C compiler uses GNU ld default=no
+ --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
+ --without-libiconv-prefix don't search for libiconv in includedir and libdir
+ --with-included-gettext use the GNU gettext library included here
+ --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib
+ --without-libintl-prefix don't search for libintl in includedir and libdir
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+GNU Texinfo configure 4.8
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by GNU Texinfo $as_me 4.8, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+gl_header_list="$gl_header_list fcntl.h"
+gl_header_list="$gl_header_list sys/time.h"
+gl_header_list="$gl_header_list unistd.h"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_headers="$ac_config_headers config.h:config.in"
+# Keep filename to 8.3 for MS-DOS.
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='texinfo'
+ VERSION='4.8'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+# When the Texinfo source is imported into other repositories
+# (NetBSD and TeX Live), timestamps are generally not preserved. This
+# causes lots of annoyance, so --enable-maintainer-mode. Sorry.
+echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi;
+ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+# Checks for programs.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+if test $ac_cv_c_compiler_gnu = yes; then
+ echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5
+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
+if test "${ac_cv_prog_gcc_traditional+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sgtty.h>
+Autoconf TIOCGETP
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "$ac_pattern" >/dev/null 2>&1; then
+ ac_cv_prog_gcc_traditional=yes
+else
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <termio.h>
+Autoconf TCGETA
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "$ac_pattern" >/dev/null 2>&1; then
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5
+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"}
+
+
+echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
+if test "${ac_cv_search_strerror+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+ac_cv_search_strerror=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strerror ();
+int
+main ()
+{
+strerror ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_strerror="none required"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_strerror" = no; then
+ for ac_lib in cposix; do
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strerror ();
+int
+main ()
+{
+strerror ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_strerror="-l$ac_lib"
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6
+if test "$ac_cv_search_strerror" != no; then
+ test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
+
+fi
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for minix/config.h" >&5
+echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking minix/config.h usability" >&5
+echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <minix/config.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking minix/config.h presence" >&5
+echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <minix/config.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for minix/config.h" >&5
+echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_minix_config_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
+
+fi
+if test $ac_cv_header_minix_config_h = yes; then
+ MINIX=yes
+else
+ MINIX=
+fi
+
+
+if test "$MINIX" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_SOURCE 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_1_SOURCE 2
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _MINIX 1
+_ACEOF
+
+fi
+
+
+# Needed on sysV68 for sigblock, sigsetmask. But check for it in libc first.
+echo "$as_me:$LINENO: checking for sigblock" >&5
+echo $ECHO_N "checking for sigblock... $ECHO_C" >&6
+if test "${ac_cv_func_sigblock+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define sigblock to an innocuous variant, in case <limits.h> declares sigblock.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define sigblock innocuous_sigblock
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char sigblock (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef sigblock
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char sigblock ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_sigblock) || defined (__stub___sigblock)
+choke me
+#else
+char (*f) () = sigblock;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != sigblock;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_sigblock=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_sigblock=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_sigblock" >&5
+echo "${ECHO_T}$ac_cv_func_sigblock" >&6
+if test $ac_cv_func_sigblock = yes; then
+ :
+else
+
+echo "$as_me:$LINENO: checking for sigblock in -lbsd" >&5
+echo $ECHO_N "checking for sigblock in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_sigblock+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char sigblock ();
+int
+main ()
+{
+sigblock ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_bsd_sigblock=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_bsd_sigblock=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_sigblock" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_sigblock" >&6
+if test $ac_cv_lib_bsd_sigblock = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBBSD 1
+_ACEOF
+
+ LIBS="-lbsd $LIBS"
+
+fi
+
+fi
+
+
+# Checks for header files.
+echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5
+echo $ECHO_N "checking whether stat file-mode macros are broken... $ECHO_C" >&6
+if test "${ac_cv_header_stat_broken+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined(S_ISBLK) && defined(S_IFDIR)
+# if S_ISBLK (S_IFDIR)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISBLK) && defined(S_IFCHR)
+# if S_ISBLK (S_IFCHR)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISLNK) && defined(S_IFREG)
+# if S_ISLNK (S_IFREG)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISSOCK) && defined(S_IFREG)
+# if S_ISSOCK (S_IFREG)
+You lose.
+# endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "You lose" >/dev/null 2>&1; then
+ ac_cv_header_stat_broken=yes
+else
+ ac_cv_header_stat_broken=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5
+echo "${ECHO_T}$ac_cv_header_stat_broken" >&6
+if test $ac_cv_header_stat_broken = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STAT_MACROS_BROKEN 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in fcntl.h io.h limits.h pwd.h string.h strings.h \
+ termcap.h termio.h termios.h unistd.h \
+ sys/fcntl.h sys/file.h sys/stream.h sys/time.h sys/ttold.h sys/wait.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# sys/ptem.h requires sys/stream.h for mblk_t on Solaris.
+
+for ac_header in sys/ptem.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if HAVE_SYS_STREAM_H
+#include <sys/stream.h>
+#endif
+
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking POSIX termios" >&5
+echo $ECHO_N "checking POSIX termios... $ECHO_C" >&6
+if test "${ac_cv_sys_posix_termios+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <unistd.h>
+#include <termios.h>
+
+int
+main ()
+{
+/* SunOS 4.0.3 has termios.h but not the library calls. */
+ tcgetattr(0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sys_posix_termios=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_sys_posix_termios=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sys_posix_termios" >&5
+echo "${ECHO_T}$ac_cv_sys_posix_termios" >&6
+
+echo "$as_me:$LINENO: checking whether termios.h defines TIOCGWINSZ" >&5
+echo $ECHO_N "checking whether termios.h defines TIOCGWINSZ... $ECHO_C" >&6
+if test "${ac_cv_sys_tiocgwinsz_in_termios_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <termios.h>
+#ifdef TIOCGWINSZ
+ yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ ac_cv_sys_tiocgwinsz_in_termios_h=yes
+else
+ ac_cv_sys_tiocgwinsz_in_termios_h=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5
+echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_termios_h" >&6
+
+if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then
+ echo "$as_me:$LINENO: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5
+echo $ECHO_N "checking whether sys/ioctl.h defines TIOCGWINSZ... $ECHO_C" >&6
+if test "${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef TIOCGWINSZ
+ yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes
+else
+ ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5
+echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6
+
+ if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define GWINSZ_IN_SYS_IOCTL 1
+_ACEOF
+
+ fi
+fi
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+if test "${ac_cv_type_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((off_t *) 0)
+ return 0;
+if (sizeof (off_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_off_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_off_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6
+if test $ac_cv_type_off_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking return type of signal handlers" >&5
+echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
+if test "${ac_cv_type_signal+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+# undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int
+main ()
+{
+int i;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_signal=void
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_signal=int
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
+echo "${ECHO_T}$ac_cv_type_signal" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5
+echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6
+if test "${ac_cv_struct_tm+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <time.h>
+
+int
+main ()
+{
+struct tm *tp; tp->tm_sec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_struct_tm=time.h
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5
+echo "${ECHO_T}$ac_cv_struct_tm" >&6
+if test $ac_cv_struct_tm = sys/time.h; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TM_IN_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+# Checks for function declarations.
+echo "$as_me:$LINENO: checking whether memchr is declared" >&5
+echo $ECHO_N "checking whether memchr is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_memchr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef memchr
+ char *p = (char *) memchr;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_memchr=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_memchr=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_memchr" >&5
+echo "${ECHO_T}$ac_cv_have_decl_memchr" >&6
+if test $ac_cv_have_decl_memchr = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MEMCHR 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MEMCHR 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strcoll is declared" >&5
+echo $ECHO_N "checking whether strcoll is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strcoll+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strcoll
+ char *p = (char *) strcoll;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strcoll=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strcoll=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strcoll" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strcoll" >&6
+if test $ac_cv_have_decl_strcoll = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRCOLL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRCOLL 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strerror is declared" >&5
+echo $ECHO_N "checking whether strerror is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strerror+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef strerror
+ char *p = (char *) strerror;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strerror=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strerror=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strerror" >&6
+if test $ac_cv_have_decl_strerror = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRERROR 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRERROR 0
+_ACEOF
+
+
+fi
+
+
+
+# Checks for library functions.
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo "$as_me:$LINENO: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
+if test "${ac_cv_working_alloca_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_working_alloca_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_working_alloca_h=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA_H 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6
+if test "${ac_cv_func_alloca_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_alloca_works=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_alloca_works=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA 1
+_ACEOF
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=alloca.$ac_objext
+
+cat >>confdefs.h <<\_ACEOF
+#define C_ALLOCA 1
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
+if test "${ac_cv_os_cray+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "webecray" >/dev/null 2>&1; then
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+ break
+fi
+
+ done
+fi
+
+echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
+if test "${ac_cv_c_stack_direction+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main ()
+{
+ exit (find_stack_direction () < 0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_stack_direction=1
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+echo "$as_me:$LINENO: checking for working strcoll" >&5
+echo $ECHO_N "checking for working strcoll... $ECHO_C" >&6
+if test "${ac_cv_func_strcoll_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_strcoll_works=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+exit (strcoll ("abc", "def") >= 0 ||
+ strcoll ("ABC", "DEF") >= 0 ||
+ strcoll ("123", "456") >= 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strcoll_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_strcoll_works=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_strcoll_works" >&5
+echo "${ECHO_T}$ac_cv_func_strcoll_works" >&6
+if test $ac_cv_func_strcoll_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRCOLL 1
+_ACEOF
+
+fi
+
+
+for ac_func in vprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+echo "$as_me:$LINENO: checking for _doprnt" >&5
+echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6
+if test "${ac_cv_func__doprnt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define _doprnt to an innocuous variant, in case <limits.h> declares _doprnt.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define _doprnt innocuous__doprnt
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char _doprnt (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef _doprnt
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char _doprnt ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+char (*f) () = _doprnt;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != _doprnt;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func__doprnt=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func__doprnt=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5
+echo "${ECHO_T}$ac_cv_func__doprnt" >&6
+if test $ac_cv_func__doprnt = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DOPRNT 1
+_ACEOF
+
+fi
+
+fi
+done
+
+
+# in theory only pre-sysvr3 systems needed this and it's not likely
+# that anyone compiling new texinfo still has such a thing? we'll see.
+# AC_FUNC_SETVBUF_REVERSED
+
+
+
+
+
+
+
+
+for ac_func in bzero getcwd memset setvbuf sigaction sigprocmask \
+ sigsetmask strchr
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+for ac_func in memcpy memmove strdup strerror
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case $LIBOBJS in
+ "$ac_func.$ac_objext" | \
+ *" $ac_func.$ac_objext" | \
+ "$ac_func.$ac_objext "* | \
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
+esac
+
+fi
+done
+
+
+
+# strcasecmp and strncasecmp, gnulib-style.
+
+
+
+for ac_func in strcasecmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case $LIBOBJS in
+ "$ac_func.$ac_objext" | \
+ *" $ac_func.$ac_objext" | \
+ "$ac_func.$ac_objext "* | \
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
+esac
+
+fi
+done
+
+
+ if test $ac_cv_func_strcasecmp = no; then
+
+ :
+
+ fi
+
+
+
+for ac_func in strncasecmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case $LIBOBJS in
+ "$ac_func.$ac_objext" | \
+ *" $ac_func.$ac_objext" | \
+ "$ac_func.$ac_objext "* | \
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
+esac
+
+fi
+done
+
+
+ if test $ac_cv_func_strncasecmp = no; then
+
+ :
+
+ fi
+
+
+
+# We want to recognize djgpp to avoid the useless warning about no
+# term library.
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+# We need to run some of our own binaries, most notably makedoc, but as
+# long as we have this process, we also use our own makeinfo and
+# install-info.
+#
+# This means that if we are cross compiling, we have to configure the
+# package twice: once with the native compiler (this is done in a
+# subdirectory $native_tools), and once with the cross compiler.
+# The former is invoked automatically here, with --host=$build.
+# $native_tools is also added to SUBDIRS in the main Makefile.am,
+# so that make compiles the native tools first.
+#
+if test "$cross_compiling" = no; then
+ native_tools=
+else
+ native_tools=tools
+ test -d "$native_tools" || mkdir "$native_tools"
+ confdir=`(cd "$srcdir";pwd)`
+ # Make sure the secondary configure won't fail with
+ # "error: source directory already configured".
+ rm -f config.status
+ { echo "$as_me:$LINENO: Doing configure of native tools (${build})." >&5
+echo "$as_me: Doing configure of native tools (${build})." >&6;}
+ cd "$native_tools" || exit 1
+ # Run secondary configure in alternate environment or
+ # it gets the wrong CC etc. env -i gives this build host configure
+ # a clean environment.
+ env -i CC="${BUILD_CC}" AR="${BUILD_AR}" RANLIB="${BUILD_RANLIB}" \
+ PATH="${PATH}" \
+ tools_only=1 \
+ ${confdir}/configure --build=${build} --host=${build} \
+ --disable-rpath --disable-nls
+ cd .. || exit 1
+ { echo "$as_me:$LINENO: Continuing with main configure (${host})." >&5
+echo "$as_me: Continuing with main configure (${host})." >&6;}
+fi
+
+
+
+if test "x$tools_only" = x1; then
+ TOOLS_ONLY_TRUE=
+ TOOLS_ONLY_FALSE='#'
+else
+ TOOLS_ONLY_TRUE='#'
+ TOOLS_ONLY_FALSE=
+fi
+
+
+# Some GNU/Linux systems (e.g., SuSE 4.3, 1996) don't have curses, but
+# rather ncurses. So we check for it.
+TERMLIBS=
+# Check for termlib before termcap because Solaris termcap needs libucb.
+TERMLIB_VARIANTS="ncurses curses termlib termcap terminfo"
+for termlib in ${TERMLIB_VARIANTS}; do
+ as_ac_Lib=`echo "ac_cv_lib_${termlib}''_tgetent" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for tgetent in -l${termlib}" >&5
+echo $ECHO_N "checking for tgetent in -l${termlib}... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${termlib} $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgetent ();
+int
+main ()
+{
+tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Lib=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Lib=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6
+if test `eval echo '${'$as_ac_Lib'}'` = yes; then
+ TERMLIBS="${TERMLIBS} -l${termlib}"; break
+fi
+
+done
+# don't bother warning on djgpp, it doesn't have a term library, it
+# ports each termcap-needing program separately according to its needs.
+if test -z "$TERMLIBS" && echo "$build" | grep -v djgpp >/dev/null; then
+ { echo "$as_me:$LINENO: WARNING: probably need a terminal library, one of: ${TERMLIB_VARIANTS}" >&5
+echo "$as_me: WARNING: probably need a terminal library, one of: ${TERMLIB_VARIANTS}" >&2;}
+fi
+
+# Checks for variables.
+# HP-UX 9 (at least) needs -lncurses which defines termcap variables PC etc.
+echo "$as_me:$LINENO: checking for library with termcap variables" >&5
+echo $ECHO_N "checking for library with termcap variables... $ECHO_C" >&6
+if test "${ac_cv_var_ospeed+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ oldLIBS=$LIBS
+for trylib in $termlib ${TERMLIB_VARIANTS}; do
+ if test "x$trylib" != "x$termlib"; then
+ LIBS="$oldLIBS -l$termlib -l$trylib"
+ else
+ LIBS="$oldLIBS -l$termlib"
+ fi
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifdef HAVE_NCURSES_TERMCAP_H
+#include <ncurses/termcap.h>
+#else
+#ifdef HAVE_TERMCAP_H
+#include <termcap.h>
+#else
+#undef PC
+char *BC;
+char **UP;
+char PC;
+short ospeed;
+#endif
+#endif
+/* Make sure all variables actually exist. AIX 4.3 has ospeed but no BC.
+ --Andreas Ley <andy@rz.uni-karlsruhe.de> 24 Aug 2000. */
+BC++;
+UP++;
+PC++;
+return ospeed != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_var_ospeed=$trylib; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+done
+LIBS=$oldLIBS
+
+fi
+
+echo "$as_me:$LINENO: result: $ac_cv_var_ospeed" >&5
+echo "${ECHO_T}$ac_cv_var_ospeed" >&6
+if test -n "$ac_cv_var_ospeed" \
+ && test "x$termlib" != "x$ac_cv_var_ospeed"; then
+ TERMLIBS="${TERMLIBS} -l${ac_cv_var_ospeed}"
+fi
+#
+
+# Do not use <ncurses/termcap.h> unless we're linking with ncurses.
+# Must come after the termlib tests.
+if test "x$termlib" = xncurses; then
+ # Use AC_CHECK_HEADERS so the HAVE_*_H symbol gets defined.
+
+for ac_header in ncurses/termcap.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+# gnulib.
+
+
+
+
+
+for ac_header in $gl_header_list
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_getenv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getenv
+ char *p = (char *) getenv;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getenv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_getenv=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
+if test $ac_cv_have_decl_getenv = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 0
+_ACEOF
+
+
+fi
+
+
+
+
+ echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
+if test "${gl_cv_header_inttypes_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_inttypes_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gl_cv_header_inttypes_h=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gl_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$gl_cv_header_inttypes_h" >&6
+ if test $gl_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H_WITH_UINTMAX 1
+_ACEOF
+
+ fi
+
+
+ echo "$as_me:$LINENO: checking for stdint.h" >&5
+echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6
+if test "${gl_cv_header_stdint_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <stdint.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_header_stdint_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gl_cv_header_stdint_h=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gl_cv_header_stdint_h" >&5
+echo "${ECHO_T}$gl_cv_header_stdint_h" >&6
+ if test $gl_cv_header_stdint_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STDINT_H_WITH_UINTMAX 1
+_ACEOF
+
+ fi
+
+
+ echo "$as_me:$LINENO: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+unsigned long long ull = 1ULL; int i = 63;
+int
+main ()
+{
+unsigned long long ullmax = (unsigned long long) -1;
+ return ull << i | ull >> i | ullmax / ull | ullmax % ull;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_long_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
+ if test $ac_cv_type_unsigned_long_long = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UNSIGNED_LONG_LONG 1
+_ACEOF
+
+ fi
+
+
+
+
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+
+ test $ac_cv_type_unsigned_long_long = yes \
+ && ac_type='unsigned long long' \
+ || ac_type='unsigned long'
+
+cat >>confdefs.h <<_ACEOF
+#define uintmax_t $ac_type
+_ACEOF
+
+ else
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UINTMAX_T 1
+_ACEOF
+
+ fi
+
+
+for ac_func in mkstemp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case $LIBOBJS in
+ "$ac_func.$ac_objext" | \
+ *" $ac_func.$ac_objext" | \
+ "$ac_func.$ac_objext "* | \
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
+esac
+
+fi
+done
+
+
+ if test $ac_cv_func_mkstemp = no; then
+ gl_cv_func_mkstemp_limitations=yes
+ else
+ echo "$as_me:$LINENO: checking for mkstemp limitations" >&5
+echo $ECHO_N "checking for mkstemp limitations... $ECHO_C" >&6
+if test "${gl_cv_func_mkstemp_limitations+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ if test "$cross_compiling" = yes; then
+ gl_cv_func_mkstemp_limitations=yes
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+# include <stdlib.h>
+ int main ()
+ {
+ int i;
+ for (i = 0; i < 70; i++)
+ {
+ char template[] = "conftestXXXXXX";
+ int fd = mkstemp (template);
+ if (fd == -1)
+ exit (1);
+ close (fd);
+ }
+ exit (0);
+ }
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gl_cv_func_mkstemp_limitations=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gl_cv_func_mkstemp_limitations=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+echo "$as_me:$LINENO: result: $gl_cv_func_mkstemp_limitations" >&5
+echo "${ECHO_T}$gl_cv_func_mkstemp_limitations" >&6
+ fi
+
+ if test $gl_cv_func_mkstemp_limitations = yes; then
+ case $LIBOBJS in
+ "mkstemp.$ac_objext" | \
+ *" mkstemp.$ac_objext" | \
+ "mkstemp.$ac_objext "* | \
+ *" mkstemp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS mkstemp.$ac_objext" ;;
+esac
+
+ case $LIBOBJS in
+ "tempname.$ac_objext" | \
+ *" tempname.$ac_objext" | \
+ "tempname.$ac_objext "* | \
+ *" tempname.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS tempname.$ac_objext" ;;
+esac
+
+
+cat >>confdefs.h <<\_ACEOF
+#define mkstemp rpl_mkstemp
+_ACEOF
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in stdint.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_func in __secure_getenv gettimeofday
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ :
+
+
+
+
+
+
+
+ fi
+
+
+# For teTeX and TeX Live.
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+# Check whether --enable-multiplatform or --disable-multiplatform was given.
+if test "${enable_multiplatform+set}" = set; then
+ enableval="$enable_multiplatform"
+
+fi;
+# if enable_multiplatform is set in the environment, use that.
+test "x$enable_multiplatform" = xyes \
+&& test "x$bindir" = 'x${exec_prefix}/bin' \
+&& bindir="$bindir/$host"
+
+# Taken from the example in
+# http://www.gnu.org/software/automake/manual/html_node/Conditionals.html.
+# Check whether --enable-install-warnings or --disable-install-warnings was given.
+if test "${enable_install_warnings+set}" = set; then
+ enableval="$enable_install_warnings"
+ case "${enableval}" in
+ yes) install_warnings=true ;;
+ no) install_warnings=false ;;
+ *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-install-warnings" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-install-warnings" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ esac
+else
+ install_warnings=true
+fi;
+
+
+if test x"$install_warnings" = xtrue || test x"$install_warnings" = xyes; then
+ INSTALL_WARNINGS_TRUE=
+ INSTALL_WARNINGS_FALSE='#'
+else
+ INSTALL_WARNINGS_TRUE='#'
+ INSTALL_WARNINGS_FALSE=
+fi
+
+
+# i18n support. To update to a new version of gettext, run:
+# gettextize -f -c --intl
+
+
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ case "$ac_aux_dir" in
+ /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+ *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+ esac
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+
+
+
+ echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+ # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi;
+ echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+
+
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$MSGFMT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+ echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+
+if test -n "$GMSGFMT"; then
+ echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$XGETTEXT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ rm -f messages.po
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGMERGE+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$MSGMERGE" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+ echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+ if test "$GMSGFMT" != ":"; then
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+ (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+ echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6
+ GMSGFMT=":"
+ fi
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+ (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+ XGETTEXT=":"
+ fi
+ rm -f messages.po
+ fi
+
+ ac_config_commands="$ac_config_commands default-1"
+
+
+
+ echo "$as_me:$LINENO: checking for signed" >&5
+echo $ECHO_N "checking for signed... $ECHO_C" >&6
+if test "${bh_cv_c_signed+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+signed char x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ bh_cv_c_signed=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bh_cv_c_signed=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bh_cv_c_signed" >&5
+echo "${ECHO_T}$bh_cv_c_signed" >&6
+ if test $bh_cv_c_signed = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define signed
+_ACEOF
+
+ fi
+
+echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+
+ echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6
+if test "${ac_cv_type_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+long long ll = 1LL; int i = 63;
+int
+main ()
+{
+long long llmax = (long long) -1;
+ return ll << i | ll >> i | llmax / ll | llmax % ll;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6
+ if test $ac_cv_type_long_long = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_LONG 1
+_ACEOF
+
+ fi
+
+
+ echo "$as_me:$LINENO: checking for long double" >&5
+echo $ECHO_N "checking for long double... $ECHO_C" >&6
+if test "${gt_cv_c_long_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$GCC" = yes; then
+ gt_cv_c_long_double=yes
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+ /* The Stardent Vistra knows sizeof(long double), but does not support it. */
+ long double foo = 0.0;
+ /* On Ultrix 4.3 cc, long double is 4 and double is 8. */
+ int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_long_double=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_c_long_double=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+fi
+echo "$as_me:$LINENO: result: $gt_cv_c_long_double" >&5
+echo "${ECHO_T}$gt_cv_c_long_double" >&6
+ if test $gt_cv_c_long_double = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_DOUBLE 1
+_ACEOF
+
+ fi
+
+
+ echo "$as_me:$LINENO: checking for wchar_t" >&5
+echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6
+if test "${gt_cv_c_wchar_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_wchar_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_c_wchar_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gt_cv_c_wchar_t" >&5
+echo "${ECHO_T}$gt_cv_c_wchar_t" >&6
+ if test $gt_cv_c_wchar_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCHAR_T 1
+_ACEOF
+
+ fi
+
+
+ echo "$as_me:$LINENO: checking for wint_t" >&5
+echo $ECHO_N "checking for wint_t... $ECHO_C" >&6
+if test "${gt_cv_c_wint_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_wint_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_c_wint_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gt_cv_c_wint_t" >&5
+echo "${ECHO_T}$gt_cv_c_wint_t" >&6
+ if test $gt_cv_c_wint_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WINT_T 1
+_ACEOF
+
+ fi
+
+
+
+
+ echo "$as_me:$LINENO: checking for intmax_t" >&5
+echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6
+if test "${gt_cv_c_intmax_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+
+int
+main ()
+{
+intmax_t x = -1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_c_intmax_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_c_intmax_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gt_cv_c_intmax_t" >&5
+echo "${ECHO_T}$gt_cv_c_intmax_t" >&6
+ if test $gt_cv_c_intmax_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_INTMAX_T 1
+_ACEOF
+
+ fi
+
+
+
+ echo "$as_me:$LINENO: checking whether printf() supports POSIX/XSI format strings" >&5
+echo $ECHO_N "checking whether printf() supports POSIX/XSI format strings... $ECHO_C" >&6
+if test "${gt_cv_func_printf_posix+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ if test "$cross_compiling" = yes; then
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+ notposix
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "notposix" >/dev/null 2>&1; then
+ gt_cv_func_printf_posix="guessing no"
+else
+ gt_cv_func_printf_posix="guessing yes"
+fi
+rm -f conftest*
+
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_func_printf_posix=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gt_cv_func_printf_posix=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+echo "$as_me:$LINENO: result: $gt_cv_func_printf_posix" >&5
+echo "${ECHO_T}$gt_cv_func_printf_posix" >&6
+ case $gt_cv_func_printf_posix in
+ *yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_POSIX_PRINTF 1
+_ACEOF
+
+ ;;
+ esac
+
+
+
+for ac_header in stdlib.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+echo "$as_me:$LINENO: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the file system buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propagated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !STDC_HEADERS && !HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h. */
+#if !HAVE_GETPAGESIZE
+/* Assume that all systems that can run configure have sys/param.h. */
+# if !HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize ();
+
+ /* First, make a file with some known garbage in it. */
+ data = (char *) malloc (pagesize);
+ if (!data)
+ exit (1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand ();
+ umask (0);
+ fd = creat ("conftest.mmap", 0600);
+ if (fd < 0)
+ exit (1);
+ if (write (fd, data, pagesize) != pagesize)
+ exit (1);
+ close (fd);
+
+ /* Next, try to mmap the file at a fixed address which already has
+ something else allocated at it. If we can, also make sure that
+ we see the same garbage. */
+ fd = open ("conftest.mmap", O_RDWR);
+ if (fd < 0)
+ exit (1);
+ data2 = (char *) malloc (2 * pagesize);
+ if (!data2)
+ exit (1);
+ data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit (1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit (1);
+
+ /* Finally, make sure that changes to the mapped area do not
+ percolate back to the file as seen by read(). (This is a bug on
+ some variants of i386 svr4.0.) */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = (char *) malloc (pagesize);
+ if (!data3)
+ exit (1);
+ if (read (fd, data3, pagesize) != pagesize)
+ exit (1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit (1);
+ close (fd);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MMAP 1
+_ACEOF
+
+fi
+rm -f conftest.mmap
+
+
+ echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6
+if test "${ac_cv_gnu_library_2_1+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1; then
+ ac_cv_gnu_library_2_1=yes
+else
+ ac_cv_gnu_library_2_1=no
+fi
+rm -f conftest*
+
+
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5
+echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6
+
+ GLIBC21="$ac_cv_gnu_library_2_1"
+
+
+
+
+ echo "$as_me:$LINENO: checking whether integer division by zero raises SIGFPE" >&5
+echo $ECHO_N "checking whether integer division by zero raises SIGFPE... $ECHO_C" >&6
+if test "${gt_cv_int_divbyzero_sigfpe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ if test "$cross_compiling" = yes; then
+
+ # Guess based on the CPU.
+ case "$host_cpu" in
+ alpha* | i3456786 | m68k | s390*)
+ gt_cv_int_divbyzero_sigfpe="guessing yes";;
+ *)
+ gt_cv_int_divbyzero_sigfpe="guessing no";;
+ esac
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+ /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
+ exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+ signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+ signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL. */
+#if defined (__sparc__) && defined (__linux__)
+ signal (SIGILL, sigfpe_handler);
+#endif
+
+ z = x / y;
+ nan = y / y;
+ exit (1);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_int_divbyzero_sigfpe=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gt_cv_int_divbyzero_sigfpe=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+echo "$as_me:$LINENO: result: $gt_cv_int_divbyzero_sigfpe" >&5
+echo "${ECHO_T}$gt_cv_int_divbyzero_sigfpe" >&6
+ case "$gt_cv_int_divbyzero_sigfpe" in
+ *yes) value=1;;
+ *) value=0;;
+ esac
+
+cat >>confdefs.h <<_ACEOF
+#define INTDIV0_RAISES_SIGFPE $value
+_ACEOF
+
+
+
+ echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
+if test "${gt_cv_header_inttypes_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_header_inttypes_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_header_inttypes_h=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $gt_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$gt_cv_header_inttypes_h" >&6
+ if test $gt_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H 1
+_ACEOF
+
+ fi
+
+
+
+ if test $gt_cv_header_inttypes_h = yes; then
+ echo "$as_me:$LINENO: checking whether the inttypes.h PRIxNN macros are broken" >&5
+echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6
+if test "${gt_cv_inttypes_pri_broken+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_inttypes_pri_broken=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_inttypes_pri_broken=yes
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $gt_cv_inttypes_pri_broken" >&5
+echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define PRI_MACROS_BROKEN 1
+_ACEOF
+
+ fi
+
+
+
+for ac_header in stdint.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ echo "$as_me:$LINENO: checking for SIZE_MAX" >&5
+echo $ECHO_N "checking for SIZE_MAX... $ECHO_C" >&6
+ result=
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Found it" >/dev/null 2>&1; then
+ result=yes
+fi
+rm -f conftest*
+
+ if test -z "$result"; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) res_hi=$ac_lo;;
+'') result=? ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+long longval () { return ~(size_t)0 / 10; }
+unsigned long ulongval () { return ~(size_t)0 / 10; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if ((~(size_t)0 / 10) < 0)
+ {
+ long i = longval ();
+ if (i != (~(size_t)0 / 10))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != (~(size_t)0 / 10))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ res_hi=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=?
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) res_lo=$ac_lo;;
+'') result=? ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+long longval () { return ~(size_t)0 % 10; }
+unsigned long ulongval () { return ~(size_t)0 % 10; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if ((~(size_t)0 % 10) < 0)
+ {
+ long i = longval ();
+ if (i != (~(size_t)0 % 10))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != (~(size_t)0 % 10))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ res_lo=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=?
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) fits_in_uint=$ac_lo;;
+'') result=? ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+long longval () { return sizeof (size_t) <= sizeof (unsigned int); }
+unsigned long ulongval () { return sizeof (size_t) <= sizeof (unsigned int); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if ((sizeof (size_t) <= sizeof (unsigned int)) < 0)
+ {
+ long i = longval ();
+ if (i != (sizeof (size_t) <= sizeof (unsigned int)))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != (sizeof (size_t) <= sizeof (unsigned int)))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fits_in_uint=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=?
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+ if test "$fits_in_uint" = 1; then
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fits_in_uint=0
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test -z "$result"; then
+ if test "$fits_in_uint" = 1; then
+ result="$res_hi$res_lo"U
+ else
+ result="$res_hi$res_lo"UL
+ fi
+ else
+ result='~(size_t)0'
+ fi
+ fi
+ echo "$as_me:$LINENO: result: $result" >&5
+echo "${ECHO_T}$result" >&6
+ if test "$result" != yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define SIZE_MAX $result
+_ACEOF
+
+ fi
+
+
+
+
+for ac_header in stdint.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${acl_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break ;;
+ *)
+ test "$with_gnu_ld" != yes && break ;;
+ esac
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${acl_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+ echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
+if test "${acl_cv_rpath+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+
+fi
+echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ # Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+ enableval="$enable_rpath"
+ :
+else
+ enable_rpath=yes
+fi;
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+ withval="$with_libiconv_prefix"
+
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+
+fi;
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='iconv '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$hardcode_direct" = yes; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+
+
+ echo "$as_me:$LINENO: checking for ptrdiff_t" >&5
+echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6
+if test "${ac_cv_type_ptrdiff_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((ptrdiff_t *) 0)
+ return 0;
+if (sizeof (ptrdiff_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_ptrdiff_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_ptrdiff_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_ptrdiff_t" >&5
+echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6
+if test $ac_cv_type_ptrdiff_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define ptrdiff_t long
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## -------------------------------------- ##
+## Report this to the GNU Texinfo lists. ##
+## -------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in asprintf fwprintf getcwd getegid geteuid getgid getuid \
+mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \
+strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \
+__fsetlocking
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+ echo "$as_me:$LINENO: checking whether _snprintf is declared" >&5
+echo $ECHO_N "checking whether _snprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl__snprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef _snprintf
+ char *p = (char *) _snprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl__snprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl__snprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl__snprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl__snprintf" >&6
+ if test $ac_cv_have_decl__snprintf = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SNPRINTF $gt_value
+_ACEOF
+
+
+
+ echo "$as_me:$LINENO: checking whether _snwprintf is declared" >&5
+echo $ECHO_N "checking whether _snwprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl__snwprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef _snwprintf
+ char *p = (char *) _snwprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl__snwprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl__snwprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl__snwprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl__snwprintf" >&6
+ if test $ac_cv_have_decl__snwprintf = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SNWPRINTF $gt_value
+_ACEOF
+
+
+
+
+ echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5
+echo $ECHO_N "checking whether feof_unlocked is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef feof_unlocked
+ char *p = (char *) feof_unlocked;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_feof_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_feof_unlocked=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_feof_unlocked" >&6
+ if test $ac_cv_have_decl_feof_unlocked = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FEOF_UNLOCKED $gt_value
+_ACEOF
+
+
+
+ echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5
+echo $ECHO_N "checking whether fgets_unlocked is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef fgets_unlocked
+ char *p = (char *) fgets_unlocked;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fgets_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fgets_unlocked=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fgets_unlocked" >&6
+ if test $ac_cv_have_decl_fgets_unlocked = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FGETS_UNLOCKED $gt_value
+_ACEOF
+
+
+
+ echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5
+echo $ECHO_N "checking whether getc_unlocked is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef getc_unlocked
+ char *p = (char *) getc_unlocked;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getc_unlocked=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_getc_unlocked=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getc_unlocked" >&6
+ if test $ac_cv_have_decl_getc_unlocked = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETC_UNLOCKED $gt_value
+_ACEOF
+
+
+
+ case $gt_cv_func_printf_posix in
+ *yes) HAVE_POSIX_PRINTF=1 ;;
+ *) HAVE_POSIX_PRINTF=0 ;;
+ esac
+
+ if test "$ac_cv_func_asprintf" = yes; then
+ HAVE_ASPRINTF=1
+ else
+ HAVE_ASPRINTF=0
+ fi
+
+ if test "$ac_cv_func_snprintf" = yes; then
+ HAVE_SNPRINTF=1
+ else
+ HAVE_SNPRINTF=0
+ fi
+
+ if test "$ac_cv_func_wprintf" = yes; then
+ HAVE_WPRINTF=1
+ else
+ HAVE_WPRINTF=0
+ fi
+
+
+
+
+
+
+
+ am_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ echo "$as_me:$LINENO: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6
+if test "${am_cv_func_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_func_iconv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6
+ if test "$am_cv_func_iconv" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ICONV 1
+_ACEOF
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ echo "$as_me:$LINENO: checking how to link with libiconv" >&5
+echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6
+ echo "$as_me:$LINENO: result: $LIBICONV" >&5
+echo "${ECHO_T}$LIBICONV" >&6
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+ if test "$am_cv_func_iconv" = yes; then
+ echo "$as_me:$LINENO: checking for iconv declaration" >&5
+echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6
+ if test "${am_cv_proto_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_proto_iconv_arg1=""
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+am_cv_proto_iconv_arg1="const"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+ am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ echo "$as_me:$LINENO: result: ${ac_t:-
+ }$am_cv_proto_iconv" >&5
+echo "${ECHO_T}${ac_t:-
+ }$am_cv_proto_iconv" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+_ACEOF
+
+ fi
+
+
+ echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+if test "${am_cv_langinfo_codeset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_langinfo_codeset=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+am_cv_langinfo_codeset=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
+ if test $am_cv_langinfo_codeset = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LANGINFO_CODESET 1
+_ACEOF
+
+ fi
+
+ if test $ac_cv_header_locale_h = yes; then
+
+ echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5
+echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6
+if test "${am_cv_val_LC_MESSAGES+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ am_cv_val_LC_MESSAGES=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5
+echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6
+ if test $am_cv_val_LC_MESSAGES = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LC_MESSAGES 1
+_ACEOF
+
+ fi
+
+ fi
+
+ for ac_prog in bison
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_INTLBISON+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$INTLBISON"; then
+ ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_INTLBISON="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+INTLBISON=$ac_cv_prog_INTLBISON
+if test -n "$INTLBISON"; then
+ echo "$as_me:$LINENO: result: $INTLBISON" >&5
+echo "${ECHO_T}$INTLBISON" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$INTLBISON" && break
+done
+
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ echo "$as_me:$LINENO: checking version of bison" >&5
+echo $ECHO_N "checking version of bison... $ECHO_C" >&6
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ echo "$as_me:$LINENO: result: $ac_prog_version" >&5
+echo "${ECHO_T}$ac_prog_version" >&6
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+ # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi;
+ echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+
+
+
+
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+
+ echo "$as_me:$LINENO: checking whether included gettext is requested" >&5
+echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6
+
+# Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+ withval="$with_included_gettext"
+ nls_cv_force_use_gnu_gettext=$withval
+else
+ nls_cv_force_use_gnu_gettext=no
+fi;
+ echo "$as_me:$LINENO: result: $nls_cv_force_use_gnu_gettext" >&5
+echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+
+
+
+
+
+
+ echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5
+echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6
+if test "${gt_cv_func_gnugettext1_libc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_func_gnugettext1_libc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_func_gnugettext1_libc=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libc" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext1_libc" >&6
+
+ if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix or --without-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then
+ withval="$with_libintl_prefix"
+
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+
+fi;
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='intl '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$hardcode_direct" = yes; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+ done
+ fi
+
+ echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5
+echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6
+if test "${gt_cv_func_gnugettext1_libintl+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ gt_cv_func_gnugettext1_libintl=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gt_cv_func_gnugettext1_libintl=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ gt_cv_func_gnugettext1_libintl=yes
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"
+fi
+echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libintl" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext1_libintl" >&6
+ fi
+
+ if test "$gt_cv_func_gnugettext1_libc" = "yes" \
+ || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV"
+ LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ CATOBJEXT=.gmo
+ fi
+
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_NLS 1
+_ACEOF
+
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ echo "$as_me:$LINENO: checking whether to use NLS" >&5
+echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6
+ echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+ if test "$USE_NLS" = "yes"; then
+ echo "$as_me:$LINENO: checking where the gettext function comes from" >&5
+echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ echo "$as_me:$LINENO: result: $gt_source" >&5
+echo "${ECHO_T}$gt_source" >&6
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
+ echo "$as_me:$LINENO: checking how to link with libintl" >&5
+echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6
+ echo "$as_me:$LINENO: result: $LIBINTL" >&5
+echo "${ECHO_T}$LIBINTL" >&6
+
+ for element in $INCINTL; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+ fi
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETTEXT 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DCGETTEXT 1
+_ACEOF
+
+ fi
+
+ POSUB=po
+ fi
+
+
+ if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+
+
+
+
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ DATADIRNAME=share
+
+
+ INSTOBJEXT=.mo
+
+
+ GENCAT=gencat
+
+
+ if test "$USE_INCLUDED_LIBINTL" = yes; then
+ INTLOBJS="\$(GETTOBJS)"
+ fi
+
+
+ INTL_LIBTOOL_SUFFIX_PREFIX=
+
+
+
+ INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+ ac_config_files="$ac_config_files Makefile doc/Makefile info/Makefile intl/Makefile lib/Makefile m4/Makefile makeinfo/Makefile makeinfo/tests/Makefile po/Makefile.in util/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${TOOLS_ONLY_TRUE}" && test -z "${TOOLS_ONLY_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"TOOLS_ONLY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"TOOLS_ONLY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${INSTALL_WARNINGS_TRUE}" && test -z "${INSTALL_WARNINGS_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"INSTALL_WARNINGS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"INSTALL_WARNINGS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by GNU Texinfo $as_me 4.8, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+GNU Texinfo config.status 4.8
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "info/Makefile" ) CONFIG_FILES="$CONFIG_FILES info/Makefile" ;;
+ "intl/Makefile" ) CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;;
+ "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
+ "m4/Makefile" ) CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+ "makeinfo/Makefile" ) CONFIG_FILES="$CONFIG_FILES makeinfo/Makefile" ;;
+ "makeinfo/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES makeinfo/tests/Makefile" ;;
+ "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "util/Makefile" ) CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@HELP2MAN@,$HELP2MAN,;t t
+s,@ALLOCA@,$ALLOCA,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@native_tools@,$native_tools,;t t
+s,@TOOLS_ONLY_TRUE@,$TOOLS_ONLY_TRUE,;t t
+s,@TOOLS_ONLY_FALSE@,$TOOLS_ONLY_FALSE,;t t
+s,@TERMLIBS@,$TERMLIBS,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@INSTALL_WARNINGS_TRUE@,$INSTALL_WARNINGS_TRUE,;t t
+s,@INSTALL_WARNINGS_FALSE@,$INSTALL_WARNINGS_FALSE,;t t
+s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
+s,@USE_NLS@,$USE_NLS,;t t
+s,@MSGFMT@,$MSGFMT,;t t
+s,@GMSGFMT@,$GMSGFMT,;t t
+s,@XGETTEXT@,$XGETTEXT,;t t
+s,@MSGMERGE@,$MSGMERGE,;t t
+s,@GLIBC21@,$GLIBC21,;t t
+s,@HAVE_POSIX_PRINTF@,$HAVE_POSIX_PRINTF,;t t
+s,@HAVE_ASPRINTF@,$HAVE_ASPRINTF,;t t
+s,@HAVE_SNPRINTF@,$HAVE_SNPRINTF,;t t
+s,@HAVE_WPRINTF@,$HAVE_WPRINTF,;t t
+s,@LIBICONV@,$LIBICONV,;t t
+s,@LTLIBICONV@,$LTLIBICONV,;t t
+s,@INTLBISON@,$INTLBISON,;t t
+s,@BUILD_INCLUDED_LIBINTL@,$BUILD_INCLUDED_LIBINTL,;t t
+s,@USE_INCLUDED_LIBINTL@,$USE_INCLUDED_LIBINTL,;t t
+s,@CATOBJEXT@,$CATOBJEXT,;t t
+s,@DATADIRNAME@,$DATADIRNAME,;t t
+s,@INSTOBJEXT@,$INSTOBJEXT,;t t
+s,@GENCAT@,$GENCAT,;t t
+s,@INTLOBJS@,$INTLOBJS,;t t
+s,@INTL_LIBTOOL_SUFFIX_PREFIX@,$INTL_LIBTOOL_SUFFIX_PREFIX,;t t
+s,@INTLLIBS@,$INTLLIBS,;t t
+s,@LIBINTL@,$LIBINTL,;t t
+s,@LTLIBINTL@,$LTLIBINTL,;t t
+s,@POSUB@,$POSUB,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ default-1 )
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Build/source/utils/texinfo/configure.ac b/Build/source/utils/texinfo/configure.ac
new file mode 100644
index 00000000000..dd889d00575
--- /dev/null
+++ b/Build/source/utils/texinfo/configure.ac
@@ -0,0 +1,224 @@
+# Process this file with autoconf to produce a configure script.
+# $Id: configure.ac,v 1.50 2004/12/22 13:29:44 karl Exp $
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+AC_PREREQ(2.59)# Minimum Autoconf version required.
+#
+AC_INIT([GNU Texinfo], [4.8])
+AC_CONFIG_HEADERS(config.h:config.in)# Keep filename to 8.3 for MS-DOS.
+AC_CONFIG_SRCDIR([makeinfo/makeinfo.c])
+AM_INIT_AUTOMAKE([dist-bzip2])
+
+# When the Texinfo source is imported into other repositories
+# (NetBSD and TeX Live), timestamps are generally not preserved. This
+# causes lots of annoyance, so --enable-maintainer-mode. Sorry.
+AM_MAINTAINER_MODE
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_GCC_TRADITIONAL
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+AM_MISSING_PROG(HELP2MAN, help2man)
+
+AC_ISC_POSIX
+AC_MINIX
+
+# Needed on sysV68 for sigblock, sigsetmask. But check for it in libc first.
+AC_CHECK_FUNC(sigblock, , AC_CHECK_LIB(bsd, sigblock))
+
+# Checks for header files.
+AC_HEADER_STAT
+AC_HEADER_STDC
+AC_CHECK_HEADERS(fcntl.h io.h limits.h pwd.h string.h strings.h \
+ termcap.h termio.h termios.h unistd.h \
+ sys/fcntl.h sys/file.h sys/stream.h sys/time.h sys/ttold.h sys/wait.h)
+
+# sys/ptem.h requires sys/stream.h for mblk_t on Solaris.
+AC_CHECK_HEADERS([sys/ptem.h],,,
+[#if HAVE_SYS_STREAM_H
+#include <sys/stream.h>
+#endif
+])
+
+AC_SYS_POSIX_TERMIOS
+AC_HEADER_TIOCGWINSZ
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_TYPE_OFF_T
+AC_TYPE_SIGNAL
+AC_C_CONST
+AC_STRUCT_TM
+
+# Checks for function declarations.
+AC_CHECK_DECLS([memchr, strcoll, strerror])
+
+# Checks for library functions.
+AC_FUNC_ALLOCA
+AC_FUNC_STRCOLL
+AC_FUNC_VPRINTF
+# in theory only pre-sysvr3 systems needed this and it's not likely
+# that anyone compiling new texinfo still has such a thing? we'll see.
+# AC_FUNC_SETVBUF_REVERSED
+AC_CHECK_FUNCS(bzero getcwd memset setvbuf sigaction sigprocmask \
+ sigsetmask strchr)
+AC_REPLACE_FUNCS(memcpy memmove strdup strerror)
+
+# strcasecmp and strncasecmp, gnulib-style.
+gl_STRCASE
+
+# We want to recognize djgpp to avoid the useless warning about no
+# term library.
+AC_CANONICAL_BUILD
+
+# We need to run some of our own binaries, most notably makedoc, but as
+# long as we have this process, we also use our own makeinfo and
+# install-info.
+#
+# This means that if we are cross compiling, we have to configure the
+# package twice: once with the native compiler (this is done in a
+# subdirectory $native_tools), and once with the cross compiler.
+# The former is invoked automatically here, with --host=$build.
+# $native_tools is also added to SUBDIRS in the main Makefile.am,
+# so that make compiles the native tools first.
+#
+if test "$cross_compiling" = no; then
+ native_tools=
+else
+ native_tools=tools
+ test -d "$native_tools" || mkdir "$native_tools"
+ confdir=`(cd "$srcdir";pwd)`
+ # Make sure the secondary configure won't fail with
+ # "error: source directory already configured".
+ rm -f config.status
+ AC_MSG_NOTICE([[Doing configure of native tools (${build}).]])
+ cd "$native_tools" || exit 1
+ # Run secondary configure in alternate environment or
+ # it gets the wrong CC etc. env -i gives this build host configure
+ # a clean environment.
+ env -i CC="${BUILD_CC}" AR="${BUILD_AR}" RANLIB="${BUILD_RANLIB}" \
+ PATH="${PATH}" \
+ tools_only=1 \
+ ${confdir}/configure --build=${build} --host=${build} \
+ --disable-rpath --disable-nls
+ cd .. || exit 1
+ AC_MSG_NOTICE([[Continuing with main configure (${host}).]])
+fi
+AC_SUBST(native_tools)
+AM_CONDITIONAL(TOOLS_ONLY, [[test "x$tools_only" = x1]])
+
+# Some GNU/Linux systems (e.g., SuSE 4.3, 1996) don't have curses, but
+# rather ncurses. So we check for it.
+TERMLIBS=
+# Check for termlib before termcap because Solaris termcap needs libucb.
+TERMLIB_VARIANTS="ncurses curses termlib termcap terminfo"
+for termlib in ${TERMLIB_VARIANTS}; do
+ AC_CHECK_LIB(${termlib}, tgetent,
+ [TERMLIBS="${TERMLIBS} -l${termlib}"; break])
+done
+# don't bother warning on djgpp, it doesn't have a term library, it
+# ports each termcap-needing program separately according to its needs.
+if test -z "$TERMLIBS" && echo "$build" | grep -v djgpp >/dev/null; then
+ AC_MSG_WARN([probably need a terminal library, one of: ${TERMLIB_VARIANTS}])
+fi
+
+# Checks for variables.
+# HP-UX 9 (at least) needs -lncurses which defines termcap variables PC etc.
+AC_MSG_CHECKING(for library with termcap variables)
+AC_CACHE_VAL(ac_cv_var_ospeed,
+oldLIBS=$LIBS
+for trylib in $termlib ${TERMLIB_VARIANTS}; do
+ if test "x$trylib" != "x$termlib"; then
+ LIBS="$oldLIBS -l$termlib -l$trylib"
+ else
+ LIBS="$oldLIBS -l$termlib"
+ fi
+ AC_TRY_LINK(,
+[#ifdef HAVE_NCURSES_TERMCAP_H
+#include <ncurses/termcap.h>
+#else
+#ifdef HAVE_TERMCAP_H
+#include <termcap.h>
+#else
+#undef PC
+char *BC;
+char **UP;
+char PC;
+short ospeed;
+#endif
+#endif
+/* Make sure all variables actually exist. AIX 4.3 has ospeed but no BC.
+ --Andreas Ley <andy@rz.uni-karlsruhe.de> 24 Aug 2000. */
+BC++;
+UP++;
+PC++;
+return ospeed != 0;
+], ac_cv_var_ospeed=$trylib; break)
+done
+LIBS=$oldLIBS
+)
+AC_MSG_RESULT($ac_cv_var_ospeed)
+if test -n "$ac_cv_var_ospeed" \
+ && test "x$termlib" != "x$ac_cv_var_ospeed"; then
+ TERMLIBS="${TERMLIBS} -l${ac_cv_var_ospeed}"
+fi
+AC_SUBST(TERMLIBS)#
+
+# Do not use <ncurses/termcap.h> unless we're linking with ncurses.
+# Must come after the termlib tests.
+if test "x$termlib" = xncurses; then
+ # Use AC_CHECK_HEADERS so the HAVE_*_H symbol gets defined.
+ AC_CHECK_HEADERS(ncurses/termcap.h)
+fi
+
+# gnulib.
+gl_FUNC_MKSTEMP
+
+# For teTeX and TeX Live.
+AC_CANONICAL_HOST
+AC_ARG_ENABLE(multiplatform,
+ [ --enable-multiplatform put executables in bin/PLATFORM])
+# if enable_multiplatform is set in the environment, use that.
+test "x$enable_multiplatform" = xyes \
+&& test "x$bindir" = 'x${exec_prefix}/bin' \
+&& bindir="$bindir/$host"
+
+# Taken from the example in
+# http://www.gnu.org/software/automake/manual/html_node/Conditionals.html.
+AC_ARG_ENABLE(install-warnings,
+ [ --disable-install-warnings omit make install warnings about TeX files],
+ [case "${enableval}" in
+ yes) install_warnings=true ;;
+ no) install_warnings=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-install-warnings) ;;
+ esac],
+ [install_warnings=true])
+AM_CONDITIONAL(INSTALL_WARNINGS,
+ test x"$install_warnings" = xtrue || test x"$install_warnings" = xyes)
+
+# i18n support. To update to a new version of gettext, run:
+# gettextize -f -c --intl
+AM_GNU_GETTEXT_VERSION(0.14.1)
+AM_GNU_GETTEXT()
+
+AC_CONFIG_FILES([
+ Makefile
+ doc/Makefile
+ info/Makefile
+ intl/Makefile
+ lib/Makefile
+ m4/Makefile
+ makeinfo/Makefile
+ makeinfo/tests/Makefile
+ po/Makefile.in
+ util/Makefile
+])
+AC_OUTPUT
diff --git a/Build/source/utils/texinfo/depcomp b/Build/source/utils/texinfo/depcomp
new file mode 100755
index 00000000000..11e2d3bfe1c
--- /dev/null
+++ b/Build/source/utils/texinfo/depcomp
@@ -0,0 +1,522 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2004-05-31.23
+
+# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit 0
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit 0
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # Dependencies are output in .lo.d with libtool 1.4.
+ # With libtool 1.5 they are output both in $dir.libs/$base.o.d
+ # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the
+ # latter, because the former will be cleaned when $dir.libs is
+ # erased.
+ tmpdepfile1="$dir.libs/$base.lo.d"
+ tmpdepfile2="$dir$base.o.d"
+ tmpdepfile3="$dir.libs/$base.d"
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1="$dir$base.o.d"
+ tmpdepfile2="$dir$base.d"
+ tmpdepfile3="$dir$base.d"
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ elif test -f "$tmpdepfile2"; then
+ tmpdepfile="$tmpdepfile2"
+ else
+ tmpdepfile="$tmpdepfile3"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/texinfo/djgpp/README b/Build/source/utils/texinfo/djgpp/README
new file mode 100644
index 00000000000..bfe96551e96
--- /dev/null
+++ b/Build/source/utils/texinfo/djgpp/README
@@ -0,0 +1,431 @@
+Building and installing GNU Texinfo with DJGPP v2.x
+===================================================
+
+This directory holds files required for building Texinfo with DJGPP
+tools for MS-DOS and MS-Windows. If you got this file with a binary
+distribution, look for the "Installation" section below.
+
+
+1. Building Texinfo
+ ----------------
+
+ a. To compile Texinfo, you will need the following tools:
+
+ - basic DJGPP development environment: GCC, Binutils and djdev;
+ - a DJGPP port of GNU Make version 3.78 or later;
+ - a DJGPP port of Bash 2.04 or later;
+ - a port of GNU Sed 3.02 or later;
+ - DJGPP ports of Fileutils, Textutils, Sh-utils, Diffutils,
+ Gawk and Grep;
+ - etags (from the Emacs distribution) and mkid (from ID-utils)
+ if you need the TAGS and ID targets of the Makefile's.
+
+ All of the above are available from the DJGPP ftp sites on
+ SimTel.NET mirrors, in the v2gnu directory.
+
+ b. From the root of your DJGPP installation, unzip the source package:
+
+ - if you are unpacking the official GNU source distribution:
+
+ tar -xvzf texinfo-X.YZ.tar.gz
+
+ or
+
+ djtar -x texinfo-X.YZ.tar.gz
+
+ where X.YZ is the version number. (Users of MS-DOS and
+ MS-Windows 3.X, which don't support long file names, will need
+ to rename the archive to something like texi-XYZ.tgz.)
+
+ - if you are unpacking a source distribution from a DJGPP ftp
+ site:
+
+ unzip txiXYZs
+
+ or
+
+ pkunzip -d txiXYZs
+
+ If you build Texinfo on Windows 9X, Windows ME, Windows 2000 or
+ Windows XP, you are advised to use a version of Unzip which
+ supports long filenames, so that the original long filenames of
+ the source files will be preserved. Otherwise, the build
+ procedure will most probably fail.
+
+ Do NOT use an unzip program which supports long file names on
+ Windows NT 4, as DJGPP doesn't support long names there.
+
+ The program unzip32.exe, available from the SimTel.NET site,
+ will deal correctly with long file names on any platform, so it
+ is the recommended way of unzipping txiXYZs.zip archives.
+
+ c. If the source distribution comes with a ready Makefile (this is
+ usually the case with archives downloaded from the DJGPP sites),
+ and all you need is to build Texinfo, you may skip the configure
+ step below and go directly to step e.
+
+ d. To build the official GNU distribution, or to configure Texinfo
+ for any environment but stock DJGPP v2.x, run djgpp\config.bat
+ first, like this:
+
+ SRCDIR\djgpp\config SRCDIR
+
+ Here SRCDIR is the directory where you unpacked the sources. If
+ you are configuring from the source directory itself, you may
+ omit the argument to the config.bat file. If you do supply the
+ argument, you MUST use forward slashes in it, or else the batch
+ file might fail.
+
+ config.bat sets some environment variables, then invokes the
+ configure script. The script will run for a few minutes and
+ create Makefile's in all the directories, and the config.h file.
+
+ e. Run `Make'. This builds the programs and the Info files.
+
+
+
+2. Installation
+ ------------
+
+ a. If you are installing the binary distribution, then go to your
+ main DJGPP directory and unzip the files. For instance, if your
+ DJGPP installation is rooted on C:\DJGPP, then type this (XYZ is
+ the version number):
+
+ cd c:\djgpp
+ unzip txiXYZb
+
+ or, if you prefer `pkunzip':
+
+ pkunzip -d txiXYZb
+
+ b. If you downloaded and built Texinfo from sources, install by
+ invoking Make:
+
+ make install
+
+ This requires a port of Unix-like program `install.exe'. It is
+ available from the DJGPP port of GNU Fileutils on SimTel.NET.
+
+ c. Info needs a file named DIR with the top-level menu of all the
+ Info files installed on your system. If you installed the DJGPP
+ development environment (djdevNN.zip), then you already have
+ this file in the info/ subdirectory of your DJGPP installation.
+ Otherwise, you will need to create it. A minimal DIR file is
+ available in this distribution under the name `dir-example',
+ which you can use as a starting point. Copy it to the directory
+ where you install the Info files from this distribution.
+
+ Even if you already have a DIR file, you should review it to
+ make sure it is consistent with the names of the Info file you
+ are installing. Here's how your Texinfo-related entries in DIR
+ should look like:
+
+ * Info: (info).
+ Documentation browsing system. This topic teaches you about
+ how to use the online help information.
+
+ * Info-Standalone: (info-stnd).
+ This topic helps you use the standalone Info-Program (info.exe)
+
+ * infokey: (info-stnd)Invoking infokey.
+ Compile Info key customizations.
+
+ * Makeinfo: (texinfo)Invoking makeinfo.
+ Convert a .texinfo file (.txi) to an info file suitable for the
+ info reader or Emacs, into plain ASCII, into HTML, into XML,
+ or into DocBook.
+
+ * Texinfo: (texinfo).
+ With one source file, make either a printed manual (through TeX)
+ or an on-line manual (through makeinfo). This topic includes
+ a full description of the Texinfo language and related
+ facilities, including Emacs commands to work with Texinfo files.
+
+ * install-info: (texinfo)Invoking install-info.
+ How to update info/dir entries when installing GNU packages.
+
+ * texi2dvi: (texinfo)Format with texi2dvi.
+ Printing Texinfo documentation with TeX.
+
+ * texindex: (texinfo)Format with tex/texindex.
+ Sorting Texinfo index files automatically.
+
+
+ Note that the asterisk `*' should be flushed all the way to the
+ left, it is indented here just to make reading more convenient.
+
+ If your DIR file entries differ from these, I suggest to edit them
+ so they are as shown above. Otherwise, Info might not be able to
+ find some of the files. You HAVE been warned!
+
+ d. Optionally, set up environment variables for Info. These are:
+
+ * INFO_LINES -- screen size for Info.
+ * INFO_COLORS -- screen colors for Info.
+
+ (If you have DJGPP installed on your system, the file djgpp.env
+ which comes with it already has entries for Info, see the [info]
+ section there.)
+
+ INFO_LINES can be one of 25 (the default), 28, 35, 40, 43, or 50
+ (that's if you have a VGA; EGAs only support 25, 35 and 43 lines).
+ I recommend 40 if your monitor is 17" or larger, and at least 28
+ lines for smaller monitors (I work with 40 lines even on 14"
+ monitors).
+
+ INFO_COLORS should have the following syntax:
+
+ set INFO_COLORS=XX.YY
+
+ where XX is the text attribute for text displayed in the text
+ windows and the echo area, and YY is the text attribute for the
+ modeline (aka the status line). Each attribute is a numeric
+ value of a byte which describes the desired combination of
+ foreground and background colors. The individual bits in the
+ attribute byte are defined as follows:
+
+ bBBBFFFF
+
+ where `b' is the blink bit, `BBB' are the 3 bits for background
+ color and `FFFF' are the 4 bits for the foreground color. This is
+ the usual PC text attribute byte structure, and is further explained
+ in any standard reference on text-mode programming for the PC.
+
+ My favorite setting for INFO_COLORS is `0x1e.0x31'. This makes
+ Info use yellow foreground on blue background for the text and
+ blue foreground on cyan background for the modelines.
+
+ After you've played with these variables and have chosen the values
+ you like, it's a good idea to put them on the DJGPP.ENV file, in the
+ [info] section.
+
+ e. Beginning with version 3.6, GNU Info can read Unix man pages. If
+ you have a `man' clone on your system and would like to be able to
+ read man pages with Info, read the chapter ``Reading Man Pages''
+ below. One such clone is available as v2apps/manXYb.zip from
+ the DJGPP sites (XY is the version number).
+
+ f. This port supports compressed Info files, like what Info under Unix
+ gives you. For this to work, you will need to install a DOS port of
+ GNU `Gzip' package and to observe certain rules of file naming, so
+ that Info will find the compressed files working around the DOS 8.3
+ filename restriction. The chapter ``Compressed Info Files'' below
+ explains the details of this.
+
+ g. If you need to use the `print-node' command, read the chapter
+ ``Printing Nodes'' below.
+
+ h. That's it! You are now ready to use Info, Makeinfo, and Texindex.
+ To learn about them, type `Info' and press [Enter]. You will be
+ presented with the top-level menu of GNU/DJGPP hypertext
+ documentation. If you are unfamiliar with Info, press `?' to see
+ the available commands. Pressing `h' will cause Info to take you on
+ a guided tour through its features (recommended for first-time
+ users).
+
+ i. If you are used to Info ports of versions before 3.6, you should
+ know that the command bindings to PC-specific keys has changed: the
+ numeric keypad keys invoke the same commands as their extended
+ namesakes. That is, e.g., the key `PgUp' on the numeric keypad
+ invokes the same command as the grey `PgUp' key on the extended
+ keypad. This was done at DJ's request, because laptop machines
+ don't have extended keys. Commands to move between nodes
+ (previously bound to numeric keypad) are now bound to Ctrl-
+ varieties of numeric keypad keys (e.g., `next-node' is on
+ `Ctrl-PgDn', `prev-node' is on `Ctrl-PgUp', etc.). You can use
+ the `Alt-x describe-key' command to see which command is invoked
+ by a particular key.
+
+ j. There are several MSDOS-specific changes in Texinfo, relative to
+ previous Texinfo ports (for other changes, see the file NEWS):
+
+ * Full support for both forward and backslashes in all file
+ names. Previously, Info was sensitive to the style of
+ slashes in directories mentioned in the INFOPATH environment
+ variable.
+
+ * The default operation of the `print-node' command has been
+ changed so that it automatically prints to the local printer
+ device connected to the PRN port. (If your printer is
+ connected to another port, set the INFO_PRINT_COMMAND
+ environment variable like this:
+
+ set INFO_PRINT_COMMAND=>LPT2
+
+ In other words, if the value of INFO_PRINT_COMMAND begins
+ wih a `>' character, Info will write to the file or device
+ whose name follows the `>' character. (Don't leave any
+ blanks between `>' and the device name!).
+
+ Note that some old versions of stock DOS shell won't let you
+ use the `>' character in environment variables set from the
+ DOS prompt or batch files, but you can set it in the [info]
+ section of your DJGPP.ENV file.
+
+ * The `set-screen-height' command now actually changes the
+ screen dimensions from within Info if you specify one of the
+ sizes supported by your video hardware.
+
+ * If you don't have a `man' clone installed, and you invoke
+ Info with a name of a document which Info cannot find, it
+ will no longer wait for 15 seconds.
+
+ * Several bugs in handling of man pages were corrected.
+
+ * Info opens the dribble and input files in BINARY mode. This
+ allows to record keystrokes and restore them in another Info
+ session, thus using dribble files as a startup or init file
+ which changes default behavior, binds keys, etc.
+
+ * Info recognizes a new DOS-specific command-line option `-b'
+ or `--speech-friendly'. This option causes Info to use DOS
+ I/O functions (`printf', `puts', etc.) instead of direct
+ screen writes, which is required to enable speech
+ synthesizer software (used by visually-impaired people) to
+ grab the output. When this option is given, the screen
+ colors defined by the `INFO_COLORS' environment variable and
+ the visible-bell feature will be disabled, because stdio
+ functions don't support neither color text nor inverting
+ screen colors. This improvement was suggested and
+ originally implemented by Hans-Bernhard Broeker
+ <Broeker@physik.rwth-aachen.de>.
+
+ * Makeinfo now generates full .info-NN filenames when long
+ filenames are supported (e.g. on Win9x) and short .iNN
+ filenames otherwise. When the Texinfo source or the
+ command-line parameter -o specify an output file with no
+ extension (like `texinfo'), and long filenames aren't
+ supported, Makeinfo will make sure the generated names will
+ be unique (it will create e.g. `texinf-1', `texin-10' etc.).
+
+ * The texi2dvi script is now fully compatible with
+ MS-DOS/MS-Windows and with the DJGPP port of TeX.
+
+
+3. Reading Man Pages
+ -----------------
+
+ Yes, Info can now read man pages! This port supports that feature,
+ but for it to work, you will have to make sure your `man' clone is
+ set up correctly:
+
+ a. You should have an executable file named `man.exe', `man.com'
+ etc. somewhere on your PATH.
+
+ b. When invoked with redirected stdout, that executable should
+ print the contents of the file it gets as its argument to stdout
+ and exit. If your man command calls some pager, that pager
+ should have this behavior (various ports of Unix command `more'
+ and the DJGPP port of GNU Less behave that way).
+
+ One `man' clone is available as v2apps/manNNb.zip from the DJGPP
+ sites on SimTel.NET.
+
+
+4. Compressed Info Files
+ ---------------------
+
+ Info allows you to hold your Info files in compressed form, to save
+ disk space. When a file Info wants cannot be found, it will
+ automatically try to find that file in compressed form. Info does
+ this by trying to find the original file with specific extensions.
+ Each extension tells Info which program should be called to
+ decompress the file.
+
+ This port supports compression by the GNU Gzip program. When Info
+ cannot find a file `foo', it will first try to find `foo.z' or
+ `foo.gz'. If this fails, and the file has an extension, the last
+ one or two characters of the extension are replaced by `z' and `gz'
+ respectively, and Info tries again. If it finds any of these, it
+ will call the `GUnzip' program to decompress the file, catch its
+ output and display it. (The original compressed file stays
+ intact.)
+
+ So, to use this feature, compress your files with Gzip and call the
+ compressed files using the following as guidelines:
+
+ foo --> foo.gz
+ foo.inf --> foo.igz
+ foo.i5 --> foo.i5z
+ foo.25 --> foo.25z
+
+ If you have a package whose Info docs are split into more than 9
+ sub-files and you need to compress those files, you will have to
+ rename the sub-files from `foo.iNN' to `foo.NN' so that there will
+ be place for the trailing `z' in the compressed names. Don't
+ forget to edit the indirect file table in the main Info file and
+ change the sub-file filenames there too!
+
+ An alternative for those packages which have more than 99 Info
+ sub-files is to generate them from the Texinfo sources and force
+ Makeinfo to produce files without the .iNN extensions, like this:
+
+ makeinfo -o foo foo.txi
+
+ This causes Makeinfo to generate file names like foo-1, foo-2,
+ etc., which leave more place for the numeric index. If necessary,
+ Makeinfo will automatically remove characters from the end of the
+ argument to `-o'. For example, "-o texinfo" produces files
+ texinf-1, ..., texin-10, ..., texi-100, etc. on platforms which
+ only support 8+3 file names.
+
+ Saying "@setfilename foo" near the beginning of the Texinfo source
+ file is another way of forcing Makeinfo to produce files without
+ the .iNN extensions.
+
+ Using Makeinfo to produce files whose names are "compression-ready"
+ is more convenient, since you don't need to edit the the indirect
+ file table to reflect the changes in file names.
+
+ On platforms which support long filenames, the usual Info behavior
+ of appending `.gz' or `.Z' to the original filename also works;
+ this is done *before* Info checks the above butchered names.
+
+ Special considerations apply if you are installing Info on dual
+ DOS/Windows 9X/ME/2K/XP system, where you'd like Info to work with
+ the same files both in plain DOS and from the Windows DOS box. In
+ this case, you should make sure your compressed Info files follow
+ the 8+3 DOS naming conventions outlined above, even though Info
+ supports long file names on Windows 9X. Also, you need to turn off
+ the generation of numeric tails in short 8+3 aliases Windows
+ creates for long names (if you don't know how, the DJGPP FAQ list
+ explains it).
+
+ Please note: for the automatic decompression to work, Info must be
+ able to find the file it looks for with an extension which
+ indicates that the file is compressed. Do NOT call the compressed
+ files as the original uncompressed files were called, or Info
+ won't be able to find them! File names like bison-1, gcc.i10 or
+ make.info-3 have nothing in them to suggest that they are
+ compressed, so don't expect Info to uncompress them.
+
+
+5. Printing Nodes
+ --------------
+
+ Info has a `print-node' command. It works by piping the contents of
+ the current node through a program which is named by the environment
+ variable INFO_PRINT_COMMAND. That command should read its standard
+ input and write it to your printer. Find any such program, put its
+ name into the above environment variable, and you can print nodes from
+ within Info.
+
+ If the value of INFO_PRINT_COMMAND begins with a redirection
+ character `>', Info will write the contents of the node to the file
+ whose name follows the `>' character.
+
+ If INFO_PRINT_COMMAND is not defined, the DJGPP port will use
+ ">PRN" as the default, which causes it to print to the local printer
+ device, PRN.
+
+6. Bug Reports
+ -----------
+
+ If you see any bugs which seem specific to this DOS port, please tell
+ me about them.
+
+
+ Enjoy,
+
+ Eli Zaretskii <eliz@is.elta.co.il>
diff --git a/Build/source/utils/texinfo/djgpp/config.bat b/Build/source/utils/texinfo/djgpp/config.bat
new file mode 100755
index 00000000000..3b000ee6dc2
--- /dev/null
+++ b/Build/source/utils/texinfo/djgpp/config.bat
@@ -0,0 +1,240 @@
+@echo off
+
+echo Configuring GNU Texinfo for DJGPP v2.x...
+
+Rem The small_env tests protect against fixed and too small size
+Rem of the environment in stock DOS shell.
+
+Rem Find out if NLS is wanted or not, if dependency-tracking is
+Rem wanted or not, if cache is wanted or not, and where the sources are.
+set ARGS=
+set NLS=disabled
+if not "%NLS%" == "disabled" goto small_env
+set CACHE=enabled
+if not "%CACHE%" == "enabled" goto small_env
+set DEPTRAK=disabled
+if not "%DEPTRAK%" == "disabled" goto small_env
+set XSRC=.
+if not "%XSRC%" == "." goto small_env
+
+Rem Loop over all arguments.
+Rem Special arguments are: NLS, XSRC CACHE and DEPS.
+Rem All other arguments are stored into ARGS.
+:arg_loop
+set SPECARG=0
+if not "%SPECARG%" == "0" goto small_env
+if not "%1" == "NLS" if not "%1" == "nls" goto cache_opt
+if "%1" == "nls" set NLS=enabled
+if "%1" == "NLS" set NLS=enabled
+if not "%NLS%" == "enabled" goto small_env
+set SPECARG=1
+if not "%SPECARG%" == "1" goto small_env
+shift
+:cache_opt
+set SPECARG=0
+if not "%SPECARG%" == "0" goto small_env
+if "%1" == "no-cache" goto cache_off
+if "%1" == "no-CACHE" goto cache_off
+if not "%1" == "NO-CACHE" goto dependency_opt
+:cache_off
+if "%1" == "no-cache" set CACHE=disabled
+if "%1" == "no-CACHE" set CACHE=disabled
+if "%1" == "NO-CACHE" set CACHE=disabled
+if not "%CACHE%" == "disabled" goto small_env
+set SPECARG=1
+if not "%SPECARG%" == "1" goto small_env
+shift
+:dependency_opt
+set SPECARG=0
+if not "%SPECARG%" == "0" goto small_env
+if "%1" == "dep" goto dep_off
+if not "%1" == "DEP" goto src_dir_opt
+:dep_off
+if "%1" == "dep" set DEPTRAK=enabled
+if "%1" == "DEP" set DEPTRAK=enabled
+if not "%DEPTRAK%" == "enabled" goto small_env
+set SPECARG=1
+if not "%SPECARG%" == "1" goto small_env
+shift
+:src_dir_opt
+set SPECARG=0
+if not "%SPECARG%" == "0" goto small_env
+echo %1 | grep -q "/"
+if errorlevel 1 goto collect_arg
+set XSRC=%1
+if not "%XSRC%" == "%1" goto small_env
+set SPECARG=1
+if not "%SPECARG%" == "1" goto small_env
+:collect_arg
+if "%SPECARG%" == "0" set _ARGS=%ARGS% %1
+if "%SPECARG%" == "0" if not "%_ARGS%" == "%ARGS% %1" goto small_env
+echo %_ARGS% | grep -q "[^ ]"
+if not errorlevel 0 set ARGS=%_ARGS%
+set _ARGS=
+shift
+if not "%1" == "" goto arg_loop
+set SPECARG=
+
+Rem Create a response file for the configure script.
+echo --srcdir=%XSRC% > arguments
+if "%CACHE%" == "enabled" echo --config-cache >>arguments
+if "%DEPTRAK%" == "enabled" echo --enable-dependency-tracking >>arguments
+if "%DEPTRAK%" == "disabled" echo --disable-dependency-tracking >>arguments
+if not "%ARGS%" == "" echo %ARGS% >>arguments
+set ARGS=
+set CACHE=
+set DEPTRAK=
+
+if "%XSRC%" == "." goto in_place
+
+:not_in_place
+redir -e /dev/null update %XSRC%/configure.orig ./configure
+test -f ./configure
+if errorlevel 1 update %XSRC%/configure ./configure
+
+:in_place
+Rem Update configuration files
+echo Updating configuration scripts...
+test -f ./configure.orig
+if errorlevel 1 update configure configure.orig
+sed -f %XSRC%/djgpp/config.sed configure.orig > configure
+if errorlevel 1 goto sed_error
+
+Rem Make sure they have a config.site file
+set CONFIG_SITE=%XSRC%/djgpp/config.site
+if not "%CONFIG_SITE%" == "%XSRC%/djgpp/config.site" goto small_env
+
+Rem Make sure crucial file names are not munged by unpacking
+test -f %XSRC%/po/Makefile.in.in
+if not errorlevel 1 mv -f %XSRC%/po/Makefile.in.in %XSRC%/po/Makefile.in-in
+test -f %XSRC%/po/Makefile.am.in
+if not errorlevel 1 mv -f %XSRC%/po/Makefile.am.in %XSRC%/po/Makefile.am-in
+
+Rem This is required because DOS/Windows are case-insensitive
+Rem to file names, and "make install" will do nothing if Make
+Rem finds a file called `install'.
+if exist INSTALL ren INSTALL INSTALL.txt
+
+Rem Set HOME to a sane default so configure stops complaining.
+if not "%HOME%" == "" goto host_name
+set HOME=%XSRC%/djgpp
+if not "%HOME%" == "%XSRC%/djgpp" goto small_env
+echo No HOME found in the environment, using default value
+
+:host_name
+Rem Set HOSTNAME so it shows in config.status
+if not "%HOSTNAME%" == "" goto hostdone
+if "%windir%" == "" goto msdos
+set OS=MS-Windows
+if not "%OS%" == "MS-Windows" goto small_env
+goto haveos
+:msdos
+set OS=MS-DOS
+if not "%OS%" == "MS-DOS" goto small_env
+:haveos
+if not "%USERNAME%" == "" goto haveuname
+if not "%USER%" == "" goto haveuser
+echo No USERNAME and no USER found in the environment, using default values
+set HOSTNAME=Unknown PC
+if not "%HOSTNAME%" == "Unknown PC" goto small_env
+goto userdone
+:haveuser
+set HOSTNAME=%USER%'s PC
+if not "%HOSTNAME%" == "%USER%'s PC" goto small_env
+goto userdone
+:haveuname
+set HOSTNAME=%USERNAME%'s PC
+if not "%HOSTNAME%" == "%USERNAME%'s PC" goto small_env
+:userdone
+set _HOSTNAME=%HOSTNAME%, %OS%
+if not "%_HOSTNAME%" == "%HOSTNAME%, %OS%" goto small_env
+set HOSTNAME=%_HOSTNAME%
+:hostdone
+set _HOSTNAME=
+set OS=
+
+Rem install-sh is required by the configure script but clashes with the
+Rem various Makefile install-foo targets, so we MUST have it before the
+Rem script runs and rename it afterwards
+test -f %XSRC%/install-sh
+if not errorlevel 1 goto no_ren0
+test -f %XSRC%/install-sh.sh
+if not errorlevel 1 mv -f %XSRC%/install-sh.sh %XSRC%/install-sh
+:no_ren0
+
+if "%NLS%" == "disabled" goto without_NLS
+
+:with_NLS
+Rem Check for the needed libraries and binaries.
+test -x /dev/env/DJDIR/bin/msgfmt.exe
+if not errorlevel 0 goto missing_NLS_tools
+test -x /dev/env/DJDIR/bin/xgettext.exe
+if not errorlevel 0 goto missing_NLS_tools
+test -f /dev/env/DJDIR/include/libcharset.h
+if not errorlevel 0 goto missing_NLS_tools
+test -f /dev/env/DJDIR/lib/libcharset.a
+if not errorlevel 0 goto missing_NLS_tools
+test -f /dev/env/DJDIR/include/iconv.h
+if not errorlevel 0 goto missing_NLS_tools
+test -f /dev/env/DJDIR/lib/libiconv.a
+if not errorlevel 0 goto missing_NLS_tools
+test -f /dev/env/DJDIR/include/libintl.h
+if not errorlevel 0 goto missing_NLS_tools
+test -f /dev/env/DJDIR/lib/libintl.a
+if not errorlevel 0 goto missing_NLS_tools
+
+Rem Recreate the files in the %XSRC%/po subdir with our ported tools.
+redir -e /dev/null rm %XSRC%/po/*.gmo
+redir -e /dev/null rm %XSRC%/po/diffutil*.pot
+redir -e /dev/null rm %XSRC%/po/cat-id-tbl.c
+redir -e /dev/null rm %XSRC%/po/stamp-cat-id
+
+Rem Update the arguments file for the configure script.
+Rem We prefer without-included-gettext because libintl.a from gettext package
+Rem is the only one that is guaranteed to have been ported to DJGPP.
+echo --enable-nls --without-included-gettext >> arguments
+goto configure_package
+
+:missing_NLS_tools
+echo Needed libs/tools for NLS not found. Configuring without NLS.
+:without_NLS
+Rem Update the arguments file for the configure script.
+echo --disable-nls >> arguments
+
+:configure_package
+echo Running the ./configure script...
+sh ./configure @arguments
+if errorlevel 1 goto cfg_error
+rm arguments
+
+Rem Remove files created by the gl_FUNC_MKSTEMP test.
+rm co*.tmp
+echo Done.
+goto End
+
+:sed_error
+echo ./configure script editing failed!
+goto End
+
+:cfg_error
+echo ./configure script exited abnormally!
+goto End
+
+:small_env
+echo Your environment size is too small. Enlarge it and run me again.
+echo Configuration NOT done!
+
+:End
+test -f %XSRC%/install-sh.sh
+if not errorlevel 1 goto no_ren1
+test -f %XSRC%/install-sh
+if not errorlevel 1 mv -f %XSRC%/install-sh %XSRC%/install-sh.sh
+:no_ren1
+if "%HOME%" == "%XSRC%/djgpp" set HOME=
+set ARGS=
+set CONFIG_SITE=
+set HOSTNAME=
+set NLS=
+set CACHE=
+set DEPTRAK=
+set XSRC=
diff --git a/Build/source/utils/texinfo/djgpp/config.sed b/Build/source/utils/texinfo/djgpp/config.sed
new file mode 100644
index 00000000000..c4193df0fbd
--- /dev/null
+++ b/Build/source/utils/texinfo/djgpp/config.sed
@@ -0,0 +1,67 @@
+# Additional editing of configure and Makefiles for DJGPP
+
+/(echo[ ]*':t/ a\
+# DJGPP specific Makefile changes.\
+ /^aliaspath * *=/s,:,";",g;t t\
+ /TEXINPUTS=/s,:,";",g;t t\
+ /PATH=/s,:,";",g;t t\
+ s,\\.deps,_deps,g;t t\
+ s,\\.new\\.,_new.,g;t t\
+ s,\\.old\\.,_old.,g;t t\
+ s,\\.tab\\.,_tab.,g;t t\
+ s,Makefile\\.in\\.in,Makefile.in-in,g;t t\
+ s,Makefile\\.am\\.in,Makefile.am-in,g;t t\
+ /^install-info-am:/,/^$/ {\
+ /@list=.\\\$(INFO_DEPS)\[^ \]/s,DEPS),& texinf- texin- info-stn.i info.inf,\
+ s,\\(\\\$\\\$d/\\\$\\\$file-\\[0-9\\]\\[0-9\\]\\)\\(\[^ \]\\),\\1 \\$\\$d/\\$\\$file[0-9] \\$\\$d/\\$\\$file[0-9][0-9]\\2,\
+ s,\\( \\\$\\\$file-\\[0-9\\]\\[0-9\\]\\)\\(\[^ \]\\),\\1 \\$\\$file[0-9] \\$\\$file[0-9][0-9]\\2,\
+ }\
+ /^uninstall-info-am:/,/^$/ {\
+ /@list=.\\\$(INFO_DEPS)\[^ \]/s,DEPS),& texinf- texin- info-stn.i info.inf,\
+ s,\\(file-\\[0-9\\]\\[0-9\\]\\)\\(\[^ \]\\),\\1 \\$\\$file[0-9] \\$\\$file[0-9][0-9]\\2,\
+ }
+
+# Makefile.in.in is renamed to Makefile.in-in.
+/ac_config_files=/,/_ACEOF/ {
+ s|po/Makefile\.in|&:po/Makefile.in-in|
+}
+/CONFIG_FILES=/ s|po/Makefile\.in|&:po/Makefile.in-in|2
+
+# We always use _deps instead of .deps, because the latter is an
+# invalid name on 8+3 MS-DOS filesystem. This makes the generated
+# Makefiles good for every DJGPP installation, not only the one
+# where the package was configured (which could happen to be a
+# Windows box, where leading dots in file names are allowed).
+s,\.deps,_deps,g
+
+# The following two items are changes needed for configuring
+# and compiling across partitions.
+# The given srcdir value is always translated from the
+# "x:" syntax into "/dev/x" syntax while we run configure.
+/^[ ]*-srcdir=\*.*$/ a\
+ ac_optarg=`echo "$ac_optarg" | sed "s,^\\([A-Za-z]\\):,/dev/\\1,"`
+/set X `ls -Lt \$srcdir/ i\
+ if `echo $srcdir | grep "^/dev/" - > /dev/null`; then\
+ srcdir=`echo "$srcdir" | sed -e "s%^/dev/%%" -e "s%/%:/%"`\
+ fi
+
+# Autoconf 2.52e generated configure scripts
+# write absolute paths into Makefiles making
+# them useless for DJGPP installations for which
+# the package has not been configured for.
+/MISSING=/,/^$/ {
+ /^fi$/ a\
+am_missing_run=`echo "$am_missing_run" | sed 's%/dev.*/texinfo-\\{0,1\\}4\\.[0-9][a-z]\\{0,1\\}%${top_srcdir}%;s%.:.*/texinfo-\\{0,1\\}4\\.[0-9][a-z]\\{0,1\\}%${top_srcdir}%'`
+}
+/^install_sh=/a\
+install_sh=`echo "$install_sh" | sed 's%/dev.*/texinfo-\\{0,1\\}4\\.[0-9][a-z]\\{0,1\\}%${top_srcdir}%;s%.:.*/texinfo-\\{0,1\\}4\\.[0-9][a-z]\\{0,1\\}%${top_srcdir}%'`
+
+# The following makes sure we are not going to remove a directory
+# which is the cwd on its drive (DOS doesn't allow to remove such
+# a directory). The trick is to chdir to the root directory on
+# temp directory's drive before removing $tmp.
+/^ *trap 'exit_status=\$\?; rm -rf/s%rm -rf%cd $tmp; cd /; &%
+
+# AC_CONFIG_LINKS fails if the source and destination are on
+# different file systems and symlinks don't work.
+/^ ln \$srcdir/s%||%|| cp -pf $srcdir/$ac_source $ac_dest ||%
diff --git a/Build/source/utils/texinfo/djgpp/config.site b/Build/source/utils/texinfo/djgpp/config.site
new file mode 100644
index 00000000000..c7768b11f06
--- /dev/null
+++ b/Build/source/utils/texinfo/djgpp/config.site
@@ -0,0 +1,53 @@
+#! /bin/sh
+# Site defaults for the DJGPP configuration
+
+# These two variables are required, otherwise looking for
+# programs along the PATH will not work.
+PATH_SEPARATOR=:
+PATH_EXPAND=y
+
+# This is required in for "test -f foo" to find foo.exe.
+export TEST_FINDS_EXE=y
+
+# The root of the DJGPP tree serves as the default prefix
+# for all paths that are hardcoded in the binaries.
+# When installing the installation prefix must be supplied.
+test "x$prefix" = xNONE && prefix='/dev/env/DJDIR'
+
+# This is required for config.status script to be run, since
+# ./configure runs it by invoking ${CONFIG_SHELL-/bin/sh}
+# CONFIG_SHELL=${CONFIG_SHELL='sh'}
+
+# These are set here so the generated Makefile's will be good
+# for every DJGPP installation, not only the one where the
+# package was configured.
+# $INSTALL must be an absolute path name, otherwise config.status
+# will try to prepend ./ and ../ to it when it goes into subdirs.
+INSTALL=${INSTALL='/dev/env/DJDIR/bin/ginstall -c'}
+RANLIB=${RANLIB='ranlib'}
+GMSGFMT=${GMSGFMT='/dev/env/DJDIR/bin/msgfmt'}
+MSGFMT=${MSGFMT='/dev/env/DJDIR/bin/msgfmt'}
+XGETTEXT=${XGETTEXT='/dev/env/DJDIR/bin/xgettext'}
+
+# Sane defaults for standard programs used by the build process.
+# We force the values of these variables so that the resultant
+# Makefile's will work on any DJGPP platform, not only on the
+# machine where the package was configured.
+ac_cv_prog_AWK=${AWK='gawk'}
+ac_cv_prog_INTLBISON=${INTLBISON='bison'}
+ac_cv_prog_CC=${CC='gcc'}
+
+# These are set here so the generated libtool/Makefile's will
+# be good for every DJGPP installation, not only the one where
+# the package was configured.
+NM=${NM='nm'}
+LD=${LD='ld'}
+MAKEINFO=${MAKEINFO='makeinfo'}
+
+# Force the test for 'ln -s' to report 'cp -pf'.
+ac_cv_prog_LN_S='cp -pf'
+
+# We have `fork', but it always fails. Don't trust Autoconf to be
+# smart enough to detect that...
+ac_cv_func_fork=no
+ac_cv_func_vfork=no
diff --git a/Build/source/utils/texinfo/doc/Makefile.am b/Build/source/utils/texinfo/doc/Makefile.am
new file mode 100644
index 00000000000..5e36cb74c86
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/Makefile.am
@@ -0,0 +1,80 @@
+# $Id: Makefile.am,v 1.20 2004/11/18 01:10:59 karl Exp $
+# Makefile.am for texinfo/doc.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# Put texinfo.txi first because that's the most important.
+info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
+DISTCLEANFILES = texinfo texinfo-* info*.info*
+
+man_MANS = info.1 infokey.1 install-info.1 makeinfo.1 texindex.1 texi2dvi.1 \
+ info.5 texinfo.5
+
+# Use the programs built in our distribution, taking account of possible
+# cross-compiling.
+MAKEINFO = $(top_builddir)/$(native_tools)/makeinfo/makeinfo
+INSTALL_INFO = $(top_builddir)/$(native_tools)/util/install-info
+
+TXI_XLATE = txi-cs.tex txi-de.tex txi-en.tex txi-es.tex txi-fr.tex \
+ txi-it.tex txi-nl.tex txi-no.tex txi-pl.tex txi-pt.tex txi-tr.tex
+
+# Include our texinfo.tex, not Automake's.
+EXTRA_DIST = epsf.tex pdfcolor.tex texinfo.tex \
+ fdl.texi \
+ $(man_MANS) $(TXI_XLATE)
+
+if INSTALL_WARNINGS
+install-data-local:
+ @echo
+ @echo "WARNING: If your texmf tree does not already contain"
+ @echo " up-to-date versions, you must install"
+ @echo " texinfo.tex and txi-??.tex manually,"
+ @echo " perhaps in TEXMF/tex/texinfo/,"
+ @echo " where TEXMF is a root of your TeX tree."
+ @echo " See doc/README for some considerations."
+ @echo " You can run make TEXMF=/your/texmf install-tex to do this."
+ @echo
+ @echo " You may also need to install epsf.tex and (if you"
+ @echo " use pdftex) pdfcolor.tex in TEXMF/tex/generic/dvips"
+ @echo " and TEXMF/pdftex/plain/misc/pdfcolor.tex respectively,"
+ @echo " if your TeX installation did not include them."
+endif
+
+texmf_texinfo = $(TEXMF)/tex/texinfo
+texmf_dvips = $(TEXMF)/tex/generic/epsf
+texmf_pdftex_misc = $(TEXMF)/tex/plain/pdfcolor
+install-tex:
+ test -n "$(TEXMF)" || (echo "TEXMF must be set." >&2; exit 1)
+ $(mkinstalldirs) $(DESTDIR)$(texmf_texinfo) $(DESTDIR)$(texmf_dvips) $(DESTDIR)$(texmf_pdftex_misc)
+ $(INSTALL_DATA) $(srcdir)/texinfo.tex $(DESTDIR)$(texmf_texinfo)/texinfo.tex
+ $(INSTALL_DATA) $(srcdir)/epsf.tex $(DESTDIR)$(texmf_dvips)/epsf.tex
+ $(INSTALL_DATA) $(srcdir)/pdfcolor.tex $(DESTDIR)$(texmf_pdftex_misc)/pdfcolor.tex
+ for f in $(TXI_XLATE); do \
+ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(texmf_texinfo)/$$f; done
+
+# The man pages depend on the --help strings and the version number.
+if MAINTAINER_MODE
+common_mandeps = $(top_srcdir)/configure.ac
+info.1: $(top_srcdir)/info/info.c $(common_mandeps)
+ $(HELP2MAN) --name="read Info documents" `basename $@ .1` >$@
+infokey.1: $(top_srcdir)/info/infokey.c $(common_mandeps)
+ $(HELP2MAN) --name="compile customizations for Info" `basename $@ .1` >$@
+install-info.1: $(top_srcdir)/util/install-info.c $(common_mandeps)
+ $(HELP2MAN) --name="update info/dir entries" `basename $@ .1` >$@
+makeinfo.1: $(top_srcdir)/makeinfo/makeinfo.c $(common_mandeps)
+ $(HELP2MAN) --name="translate Texinfo documents" `basename $@ .1` >$@
+texi2dvi.1: $(top_srcdir)/util/texi2dvi $(common_mandeps)
+ $(HELP2MAN) --name="print Texinfo documents" `basename $@ .1` >$@
+texindex.1: $(top_srcdir)/util/texindex.c $(common_mandeps)
+ $(HELP2MAN) --name="sort Texinfo index files" `basename $@ .1` >$@
+endif
+
+# Do not create info files for distribution.
+dist-info:
diff --git a/Build/source/utils/texinfo/doc/Makefile.in b/Build/source/utils/texinfo/doc/Makefile.in
new file mode 100644
index 00000000000..2c8efe54c21
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/Makefile.in
@@ -0,0 +1,772 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.20 2004/11/18 01:10:59 karl Exp $
+# Makefile.am for texinfo/doc.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = README $(info_TEXINFOS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/stamp-1 $(srcdir)/stamp-vti \
+ $(srcdir)/version-stnd.texi $(srcdir)/version.texi mdate-sh \
+ texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = texinfo info-stnd.info info.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = texinfo.dvi info-stnd.dvi info.dvi
+PDFS = texinfo.pdf info-stnd.pdf info.pdf
+PSS = texinfo.ps info-stnd.ps info.ps
+HTMLS = texinfo.html info-stnd.html info.html
+TEXINFOS = texinfo.txi info-stnd.texi info.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \
+ "$(DESTDIR)$(man5dir)"
+man1dir = $(mandir)/man1
+man5dir = $(mandir)/man5
+NROFF = nroff
+MANS = $(man_MANS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+
+# Use the programs built in our distribution, taking account of possible
+# cross-compiling.
+MAKEINFO = $(top_builddir)/$(native_tools)/makeinfo/makeinfo
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+
+# Put texinfo.txi first because that's the most important.
+info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
+DISTCLEANFILES = texinfo texinfo-* info*.info*
+man_MANS = info.1 infokey.1 install-info.1 makeinfo.1 texindex.1 texi2dvi.1 \
+ info.5 texinfo.5
+
+INSTALL_INFO = $(top_builddir)/$(native_tools)/util/install-info
+TXI_XLATE = txi-cs.tex txi-de.tex txi-en.tex txi-es.tex txi-fr.tex \
+ txi-it.tex txi-nl.tex txi-no.tex txi-pl.tex txi-pt.tex txi-tr.tex
+
+
+# Include our texinfo.tex, not Automake's.
+EXTRA_DIST = epsf.tex pdfcolor.tex texinfo.tex \
+ fdl.texi \
+ $(man_MANS) $(TXI_XLATE)
+
+texmf_texinfo = $(TEXMF)/tex/texinfo
+texmf_dvips = $(TEXMF)/tex/generic/epsf
+texmf_pdftex_misc = $(TEXMF)/tex/plain/pdfcolor
+
+# The man pages depend on the --help strings and the version number.
+@MAINTAINER_MODE_TRUE@common_mandeps = $(top_srcdir)/configure.ac
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .ps
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+texinfo: texinfo.txi $(srcdir)/version.texi
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ `test -f 'texinfo.txi' || echo '$(srcdir)/'`texinfo.txi; \
+ then \
+ rc=0; \
+ else \
+ rc=$$?; \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+texinfo.dvi: texinfo.txi $(srcdir)/version.texi
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) -o $@ `test -f 'texinfo.txi' || echo '$(srcdir)/'`texinfo.txi
+
+texinfo.pdf: texinfo.txi $(srcdir)/version.texi
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) -o $@ `test -f 'texinfo.txi' || echo '$(srcdir)/'`texinfo.txi
+
+texinfo.html: texinfo.txi $(srcdir)/version.texi
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) `test -f 'texinfo.txi' || echo '$(srcdir)/'`texinfo.txi; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: texinfo.txi $(top_srcdir)/configure
+ @(dir=.; test -f ./texinfo.txi || dir=$(srcdir); \
+ set `$(SHELL) $(srcdir)/mdate-sh $$dir/texinfo.txi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+
+info-stnd.info: info-stnd.texi $(srcdir)/version-stnd.texi
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ `test -f 'info-stnd.texi' || echo '$(srcdir)/'`info-stnd.texi; \
+ then \
+ rc=0; \
+ else \
+ rc=$$?; \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+info-stnd.dvi: info-stnd.texi $(srcdir)/version-stnd.texi
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) -o $@ `test -f 'info-stnd.texi' || echo '$(srcdir)/'`info-stnd.texi
+
+info-stnd.pdf: info-stnd.texi $(srcdir)/version-stnd.texi
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) -o $@ `test -f 'info-stnd.texi' || echo '$(srcdir)/'`info-stnd.texi
+
+info-stnd.html: info-stnd.texi $(srcdir)/version-stnd.texi
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) `test -f 'info-stnd.texi' || echo '$(srcdir)/'`info-stnd.texi; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/version-stnd.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-1
+$(srcdir)/stamp-1: info-stnd.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./info-stnd.texi || dir=$(srcdir); \
+ set `$(SHELL) $(srcdir)/mdate-sh $$dir/info-stnd.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > 1.tmp
+ @cmp -s 1.tmp $(srcdir)/version-stnd.texi \
+ || (echo "Updating $(srcdir)/version-stnd.texi"; \
+ cp 1.tmp $(srcdir)/version-stnd.texi)
+ -@rm -f 1.tmp
+ @cp $(srcdir)/version-stnd.texi $@
+
+mostlyclean-1:
+ -rm -f 1.tmp
+
+maintainer-clean-1:
+@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-1 $(srcdir)/version-stnd.texi
+
+info.info: info.texi $(info_TEXINFOS)
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ `test -f 'info.texi' || echo '$(srcdir)/'`info.texi; \
+ then \
+ rc=0; \
+ else \
+ rc=$$?; \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+info.dvi: info.texi $(info_TEXINFOS)
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) -o $@ `test -f 'info.texi' || echo '$(srcdir)/'`info.texi
+
+info.pdf: info.texi $(info_TEXINFOS)
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) -o $@ `test -f 'info.texi' || echo '$(srcdir)/'`info.texi
+
+info.html: info.texi $(info_TEXINFOS)
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) `test -f 'info.texi' || echo '$(srcdir)/'`info.texi; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+.dvi.ps:
+ $(DVIPS) -o $@ $<
+
+uninstall-info-am:
+ $(PRE_UNINSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if cd "$(DESTDIR)$(infodir)"; then \
+ echo " rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9])"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf texinfo.aux texinfo.cp texinfo.cps texinfo.fn texinfo.fns texinfo.ky \
+ texinfo.kys texinfo.log texinfo.op texinfo.pg texinfo.tmp \
+ texinfo.toc texinfo.tp texinfo.tps texinfo.vr texinfo.dvi \
+ texinfo.pdf texinfo.ps texinfo.html info-stnd.aux \
+ info-stnd.cp info-stnd.cps info-stnd.fn info-stnd.ky \
+ info-stnd.log info-stnd.pg info-stnd.pgs info-stnd.tmp \
+ info-stnd.toc info-stnd.tp info-stnd.tps info-stnd.vr \
+ info-stnd.dvi info-stnd.pdf info-stnd.ps info-stnd.html \
+ info.aux info.cp info.cps info.fn info.ky info.log info.pg \
+ info.pgs info.tmp info.toc info.tp info.tps info.vr info.dvi \
+ info.pdf info.ps info.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+install-man5: $(man5_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man5dir)" || $(mkdir_p) "$(DESTDIR)$(man5dir)"
+ @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.5*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 5*) ;; \
+ *) ext='5' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst"; \
+ done
+uninstall-man5:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.5*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 5*) ;; \
+ *) ext='5' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man5dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man5dir)/$$inst"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+@INSTALL_WARNINGS_FALSE@install-data-local:
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-data-local install-info-am install-man
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man: install-man1 install-man5
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-1 \
+ maintainer-clean-aminfo maintainer-clean-generic \
+ maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \
+ mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1 uninstall-man5
+
+.PHONY: all all-am check check-am clean clean-generic dist-info \
+ distclean distclean-generic distdir dvi dvi-am html html-am \
+ info info-am install install-am install-data install-data-am \
+ install-data-local install-exec install-exec-am install-info \
+ install-info-am install-man install-man1 install-man5 \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-1 maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti mostlyclean \
+ mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \
+ mostlyclean-vti pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-am uninstall-man uninstall-man1 uninstall-man5
+
+
+@INSTALL_WARNINGS_TRUE@install-data-local:
+@INSTALL_WARNINGS_TRUE@ @echo
+@INSTALL_WARNINGS_TRUE@ @echo "WARNING: If your texmf tree does not already contain"
+@INSTALL_WARNINGS_TRUE@ @echo " up-to-date versions, you must install"
+@INSTALL_WARNINGS_TRUE@ @echo " texinfo.tex and txi-??.tex manually,"
+@INSTALL_WARNINGS_TRUE@ @echo " perhaps in TEXMF/tex/texinfo/,"
+@INSTALL_WARNINGS_TRUE@ @echo " where TEXMF is a root of your TeX tree."
+@INSTALL_WARNINGS_TRUE@ @echo " See doc/README for some considerations."
+@INSTALL_WARNINGS_TRUE@ @echo " You can run make TEXMF=/your/texmf install-tex to do this."
+@INSTALL_WARNINGS_TRUE@ @echo
+@INSTALL_WARNINGS_TRUE@ @echo " You may also need to install epsf.tex and (if you"
+@INSTALL_WARNINGS_TRUE@ @echo " use pdftex) pdfcolor.tex in TEXMF/tex/generic/dvips"
+@INSTALL_WARNINGS_TRUE@ @echo " and TEXMF/pdftex/plain/misc/pdfcolor.tex respectively,"
+@INSTALL_WARNINGS_TRUE@ @echo " if your TeX installation did not include them."
+install-tex:
+ test -n "$(TEXMF)" || (echo "TEXMF must be set." >&2; exit 1)
+ $(mkinstalldirs) $(DESTDIR)$(texmf_texinfo) $(DESTDIR)$(texmf_dvips) $(DESTDIR)$(texmf_pdftex_misc)
+ $(INSTALL_DATA) $(srcdir)/texinfo.tex $(DESTDIR)$(texmf_texinfo)/texinfo.tex
+ $(INSTALL_DATA) $(srcdir)/epsf.tex $(DESTDIR)$(texmf_dvips)/epsf.tex
+ $(INSTALL_DATA) $(srcdir)/pdfcolor.tex $(DESTDIR)$(texmf_pdftex_misc)/pdfcolor.tex
+ for f in $(TXI_XLATE); do \
+ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(texmf_texinfo)/$$f; done
+@MAINTAINER_MODE_TRUE@info.1: $(top_srcdir)/info/info.c $(common_mandeps)
+@MAINTAINER_MODE_TRUE@ $(HELP2MAN) --name="read Info documents" `basename $@ .1` >$@
+@MAINTAINER_MODE_TRUE@infokey.1: $(top_srcdir)/info/infokey.c $(common_mandeps)
+@MAINTAINER_MODE_TRUE@ $(HELP2MAN) --name="compile customizations for Info" `basename $@ .1` >$@
+@MAINTAINER_MODE_TRUE@install-info.1: $(top_srcdir)/util/install-info.c $(common_mandeps)
+@MAINTAINER_MODE_TRUE@ $(HELP2MAN) --name="update info/dir entries" `basename $@ .1` >$@
+@MAINTAINER_MODE_TRUE@makeinfo.1: $(top_srcdir)/makeinfo/makeinfo.c $(common_mandeps)
+@MAINTAINER_MODE_TRUE@ $(HELP2MAN) --name="translate Texinfo documents" `basename $@ .1` >$@
+@MAINTAINER_MODE_TRUE@texi2dvi.1: $(top_srcdir)/util/texi2dvi $(common_mandeps)
+@MAINTAINER_MODE_TRUE@ $(HELP2MAN) --name="print Texinfo documents" `basename $@ .1` >$@
+@MAINTAINER_MODE_TRUE@texindex.1: $(top_srcdir)/util/texindex.c $(common_mandeps)
+@MAINTAINER_MODE_TRUE@ $(HELP2MAN) --name="sort Texinfo index files" `basename $@ .1` >$@
+
+# Do not create info files for distribution.
+dist-info:
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/doc/README b/Build/source/utils/texinfo/doc/README
new file mode 100644
index 00000000000..63f1ba29219
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/README
@@ -0,0 +1,44 @@
+$Id: README,v 1.4 2004/04/11 17:56:45 karl Exp $
+texinfo/doc/README
+
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+This directory contains documentation on the Texinfo system and the TeX
+sources needed to process Texinfo sources. We recommend using the
+texi2dvi included in this distribution to run a Texinfo manual through
+TeX to produce a DVI file.
+
+The .tex files are not installed automatically because TeX installations
+vary so widely. Installing them in the wrong place would give a false
+sense of security. So, you should simply cp *.tex to the appropriate
+place. If your installation follows the TeX Directory Structure
+standard (http://tug.org/tds/), this will be the directory
+TEXMF/tex/texinfo/ for texinfo.tex, TEXMF/tex/generic/dvips/ for epsf.tex,
+and TEXMF/pdftex/plain/misc for pdfcolor.tex. If you use the default
+installation paths, TEXMF will be /usr/local/share/texmf. On systems
+with TeX preinstalled, as most GNU/Linux distributions offer, TEXMF
+will often be something like /usr/share/texmf.
+
+It is also possible to put these .tex files in a `local' place instead
+of overwriting existing ones, but this is more complicated. See your TeX
+documentation in general and the texmf.cnf file in particular for information.
+
+If you add files to your TeX installations, not just replace existing
+ones, you very likely have to update your ls-R file; do this with the
+mktexlsr command. In older versions, this was named MakeTeXls-R.
+
+You can get the latest texinfo.tex from
+ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex (and all GNU mirrors)
+ftp://tug.org/tex/texinfo.tex (and all CTAN mirrors)
+or on the FSF machines in /home/gd/gnu/doc/texinfo.tex.
+If you have problems with the version in this distribution, please check
+for a newer version.
+
+epsf.tex comes with dvips distributions, and you may already have it
+installed. The version here is functionally identical but slightly
+nicer than the one in dvips574. The changes have been sent to the
+epsf.tex maintainer.
diff --git a/Build/source/utils/texinfo/doc/epsf.tex b/Build/source/utils/texinfo/doc/epsf.tex
new file mode 100644
index 00000000000..db2cd2031bd
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/epsf.tex
@@ -0,0 +1,547 @@
+%%% ====================================================================
+%%% This file is freely redistributable and placed into the
+%%% public domain by Tomas Rokicki.
+%%% @TeX-file{
+%%% author = "Tom Rokicki",
+%%% version = "2.7k",
+%%% date = "19 July 1997",
+%%% time = "10:00:05 MDT",
+%%% filename = "epsf.tex",
+%%% address = "Tom Rokicki
+%%% Box 2081
+%%% Stanford, CA 94309
+%%% USA",
+%%% telephone = "+1 415 855 9989",
+%%% email = "rokicki@cs.stanford.edu (Internet)",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "PostScript, TeX",
+%%% supported = "yes",
+%%% abstract = "This file contains macros to support the inclusion
+%%% of Encapsulated PostScript files in TeX documents.",
+%%% docstring = "This file contains TeX macros to include an
+%%% Encapsulated PostScript graphic. It works
+%%% by finding the bounding box comment,
+%%% calculating the correct scale values, and
+%%% inserting a vbox of the appropriate size at
+%%% the current position in the TeX document.
+%%%
+%%% To use, simply say
+%%%
+%%% \input epsf % somewhere early on in your TeX file
+%%%
+%%% % then where you want to insert a vbox for a figure:
+%%% \epsfbox{filename.ps}
+%%%
+%%% Alternatively, you can supply your own
+%%% bounding box by
+%%%
+%%% \epsfbox[0 0 30 50]{filename.ps}
+%%%
+%%% This will not read in the file, and will
+%%% instead use the bounding box you specify.
+%%%
+%%% The effect will be to typeset the figure as
+%%% a TeX box, at the point of your \epsfbox
+%%% command. By default, the graphic will have
+%%% its `natural' width (namely the width of
+%%% its bounding box, as described in
+%%% filename.ps). The TeX box will have depth
+%%% zero.
+%%%
+%%% You can enlarge or reduce the figure by
+%%% saying
+%%%
+%%% \epsfxsize=<dimen> \epsfbox{filename.ps}
+%%% or
+%%% \epsfysize=<dimen> \epsfbox{filename.ps}
+%%%
+%%% instead. Then the width of the TeX box will
+%%% be \epsfxsize and its height will be scaled
+%%% proportionately (or the height will be
+%%% \epsfysize and its width will be scaled
+%%% proportionately).
+%%%
+%%% The width (and height) is restored to zero
+%%% after each use, so \epsfxsize or \epsfysize
+%%% must be specified before EACH use of
+%%% \epsfbox.
+%%%
+%%% A more general facility for sizing is
+%%% available by defining the \epsfsize macro.
+%%% Normally you can redefine this macro to do
+%%% almost anything. The first parameter is
+%%% the natural x size of the PostScript
+%%% graphic, the second parameter is the
+%%% natural y size of the PostScript graphic.
+%%% It must return the xsize to use, or 0 if
+%%% natural scaling is to be used. Common uses
+%%% include:
+%%%
+%%% \epsfxsize % just leave the old value alone
+%%% 0pt % use the natural sizes
+%%% #1 % use the natural sizes
+%%% \hsize % scale to full width
+%%% 0.5#1 % scale to 50% of natural size
+%%% \ifnum #1>\hsize\hsize\else#1\fi
+%%% % smaller of natural, hsize
+%%%
+%%% If you want TeX to report the size of the
+%%% figure (as a message on your terminal when
+%%% it processes each figure), say
+%%% `\epsfverbosetrue'.
+%%%
+%%% If you only want to get the bounding box
+%%% extents, without producing any output boxes
+%%% or \special{}, then say
+%%% \epsfgetbb{filename}. The extents will be
+%%% saved in the macros \epsfllx \epsflly
+%%% \epsfurx \epsfury in PostScript units of
+%%% big points.
+%%%
+%%% Revision history:
+%%%
+%%% ---------------------------------------------
+%%% epsf.tex macro file:
+%%% Originally written by Tomas Rokicki of
+%%% Radical Eye Software, 29 Mar 1989.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Don Knuth, 3 Jan 1990.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Tomas Rokicki, 18 Jul 1990.
+%%% Accept bounding boxes with no space after
+%%% the colon.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 03 Dec 1991 [2.0].
+%%% Add version number and date typeout.
+%%%
+%%% Use \immediate\write16 instead of \message
+%%% to ensure output on new line.
+%%%
+%%% Handle nested EPS files.
+%%%
+%%% Handle %%BoundingBox: (atend) lines.
+%%%
+%%% Do not quit when blank lines are found.
+%%%
+%%% Add a few percents to remove generation of
+%%% spurious blank space.
+%%%
+%%% Move \special output to
+%%% \epsfspecial{filename} so that other macro
+%%% packages can input this one, then change
+%%% the definition of \epsfspecial to match
+%%% another DVI driver.
+%%%
+%%% Move size computation to \epsfsetsize which
+%%% can be called by the user; the verbose
+%%% output of the bounding box and scaled width
+%%% and height happens here.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 05 May 1992 [2.1].
+%%% Wrap \leavevmode\hbox{} around \vbox{} with
+%%% the \special so that \epsffile{} can be
+%%% used inside \begin{center}...\end{center}
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 09 Dec 1992 [2.2].
+%%% Introduce \epsfshow{true,false} and
+%%% \epsfframe{true,false} macros; the latter
+%%% suppresses the insertion of the PostScript,
+%%% and instead just creates an empty box,
+%%% which may be handy for rapid prototyping.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 14 Dec 1992 [2.3].
+%%% Add \epsfshowfilename{true,false}. When
+%%% true, and \epsfshowfalse is specified, the
+%%% PostScript file name will be displayed
+%%% centered in the figure box.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 20 June 1993 [2.4].
+%%% Remove non-zero debug setting of \epsfframemargin,
+%%% and change margin handling to preserve EPS image
+%%% size and aspect ratio, so that the actual
+%%% box is \epsfxsize+\epsfframemargin wide by
+%%% \epsfysize+\epsfframemargin high.
+%%% Reduce output of \epsfshowfilenametrue to
+%%% just the bare file name.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 13 July 1993 [2.5].
+%%% Add \epsfframethickness for control of
+%%% \epsfframe frame lines.
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 02 July 1996 [2.6]
+%%% Add missing initialization \epsfatendfalse;
+%%% the lack of this resulted in the wrong
+%%% BoundingBox being picked up, mea culpa, sigh...
+%%% ---------------------------------------------
+%%%
+%%% ---------------------------------------------
+%%% Revised by Nelson H. F. Beebe
+%%% <beebe@math.utah.edu>, 25 October 1996 [2.7]
+%%% Update to match changes in from dvips 5-600
+%%% distribution: new user-accessible macros:
+%%% \epsfclipon, \epsfclipoff, \epsfdrafton,
+%%% \epsfdraftoff, change \empty to \epsfempty.
+%%% ---------------------------------------------
+%%%
+%%% Modified to avoid verbosity, give help.
+%%% --kb@cs.umb.edu, for Texinfo.
+%%% }
+%%% ====================================================================
+%
+\ifx\epsfannounce\undefined \def\epsfannounce{\immediate\write16}\fi
+ \epsfannounce{This is `epsf.tex' v2.7k <10 July 1997>}%
+%
+\newread\epsffilein % file to \read
+\newif\ifepsfatend % need to scan to LAST %%BoundingBox comment?
+\newif\ifepsfbbfound % success?
+\newif\ifepsfdraft % use draft mode?
+\newif\ifepsffileok % continue looking for the bounding box?
+\newif\ifepsfframe % frame the bounding box?
+\newif\ifepsfshow % show PostScript file, or just bounding box?
+\epsfshowtrue % default is to display PostScript file
+\newif\ifepsfshowfilename % show the file name if \epsfshowfalse specified?
+\newif\ifepsfverbose % report what you're making?
+\newdimen\epsfframemargin % margin between box and frame
+\newdimen\epsfframethickness % thickness of frame rules
+\newdimen\epsfrsize % vertical size before scaling
+\newdimen\epsftmp % register for arithmetic manipulation
+\newdimen\epsftsize % horizontal size before scaling
+\newdimen\epsfxsize % horizontal size after scaling
+\newdimen\epsfysize % vertical size after scaling
+\newdimen\pspoints % conversion factor
+%
+\pspoints = 1bp % Adobe points are `big'
+\epsfxsize = 0pt % default value, means `use natural size'
+\epsfysize = 0pt % ditto
+\epsfframemargin = 0pt % default value: frame box flush around picture
+\epsfframethickness = 0.4pt % TeX's default rule thickness
+%
+\def\epsfbox#1{\global\def\epsfllx{72}\global\def\epsflly{72}%
+ \global\def\epsfurx{540}\global\def\epsfury{720}%
+ \def\lbracket{[}\def\testit{#1}\ifx\testit\lbracket
+ \let\next=\epsfgetlitbb\else\let\next=\epsfnormal\fi\next{#1}}%
+%
+% We use \epsfgetlitbb if the user specified an explicit bounding box,
+% and \epsfnormal otherwise. Because \epsfgetbb can be called
+% separately to retrieve the bounding box, we move the verbose
+% printing the bounding box extents and size on the terminal to
+% \epsfstatus. Therefore, when the user provided the bounding box,
+% \epsfgetbb will not be called, so we must call \epsfsetsize and
+% \epsfstatus ourselves.
+%
+\def\epsfgetlitbb#1#2 #3 #4 #5]#6{%
+ \epsfgrab #2 #3 #4 #5 .\\%
+ \epsfsetsize
+ \epsfstatus{#6}%
+ \epsfsetgraph{#6}%
+}%
+%
+\def\epsfnormal#1{%
+ \epsfgetbb{#1}%
+ \epsfsetgraph{#1}%
+}%
+%
+\newhelp\epsfnoopenhelp{The PostScript image file must be findable by
+TeX, i.e., somewhere in the TEXINPUTS (or equivalent) path.}%
+%
+\def\epsfgetbb#1{%
+%
+% The first thing we need to do is to open the
+% PostScript file, if possible.
+%
+ \openin\epsffilein=#1
+ \ifeof\epsffilein
+ \errhelp = \epsfnoopenhelp
+ \errmessage{Could not open file #1, ignoring it}%
+ \else %process the file
+ {% %start a group to contain catcode changes
+ % Make all special characters, except space, to be of type
+ % `other' so we process the file in almost verbatim mode
+ % (TeXbook, p. 344).
+ \chardef\other=12
+ \def\do##1{\catcode`##1=\other}%
+ \dospecials
+ \catcode`\ =10
+ \epsffileoktrue %true while we are looping
+ \epsfatendfalse %[02-Jul-1996]: add forgotten initialization
+ \loop %reading lines from the EPS file
+ \read\epsffilein to \epsffileline
+ \ifeof\epsffilein %then no more input
+ \epsffileokfalse %so set completion flag
+ \else %otherwise process one line
+ \expandafter\epsfaux\epsffileline:. \\%
+ \fi
+ \ifepsffileok
+ \repeat
+ \ifepsfbbfound
+ \else
+ \ifepsfverbose
+ \immediate\write16{No BoundingBox comment found in %
+ file #1; using defaults}%
+ \fi
+ \fi
+ }% %end catcode changes
+ \closein\epsffilein
+ \fi %end of file processing
+ \epsfsetsize %compute size parameters
+ \epsfstatus{#1}%
+}%
+%
+% Clipping control:
+\def\epsfclipon{\def\epsfclipstring{ clip}}%
+\def\epsfclipoff{\def\epsfclipstring{\ifepsfdraft\space clip\fi}}%
+\epsfclipoff % default for dvips is OFF
+%
+% The special that is emitted by \epsfsetgraph comes from this macro.
+% It is defined separately to allow easy customization by other
+% packages that first \input epsf.tex, then redefine \epsfspecial.
+% This macro is invoked in the lower-left corner of a box of the
+% width and height determined from the arguments to \epsffile, or
+% from the %%BoundingBox in the EPS file itself.
+%
+% This version is for dvips:
+\def\epsfspecial#1{%
+ \epsftmp=10\epsfxsize
+ \divide\epsftmp\pspoints
+ \ifnum\epsfrsize=0\relax
+ \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space
+ llx=\epsfllx\space
+ lly=\epsflly\space
+ urx=\epsfurx\space
+ ury=\epsfury\space
+ rwi=\number\epsftmp
+ \epsfclipstring
+ }%
+ \else
+ \epsfrsize=10\epsfysize
+ \divide\epsfrsize\pspoints
+ \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space
+ llx=\epsfllx\space
+ lly=\epsflly\space
+ urx=\epsfurx\space
+ ury=\epsfury\space
+ rwi=\number\epsftmp\space
+ rhi=\number\epsfrsize
+ \epsfclipstring
+ }%
+ \fi
+}%
+%
+% \epsfframe macro adapted from the TeXbook, exercise 21.3, p. 223, 331.
+% but modified to set the box width to the natural width, rather
+% than the line width, and to include space for margins and rules
+\def\epsfframe#1%
+{%
+ \leavevmode % so we can put this inside
+ % a centered environment
+ \setbox0 = \hbox{#1}%
+ \dimen0 = \wd0 % natural width of argument
+ \advance \dimen0 by 2\epsfframemargin % plus width of 2 margins
+ \advance \dimen0 by 2\epsfframethickness % plus width of 2 rule lines
+ \vbox
+ {%
+ \hrule height \epsfframethickness depth 0pt
+ \hbox to \dimen0
+ {%
+ \hss
+ \vrule width \epsfframethickness
+ \kern \epsfframemargin
+ \vbox {\kern \epsfframemargin \box0 \kern \epsfframemargin }%
+ \kern \epsfframemargin
+ \vrule width \epsfframethickness
+ \hss
+ }% end hbox
+ \hrule height 0pt depth \epsfframethickness
+ }% end vbox
+}%
+%
+\def\epsfsetgraph#1%
+{%
+ %
+ % Make the vbox and stick in a \special that the DVI driver can
+ % parse. \vfil and \hfil are used to place the \special origin at
+ % the lower-left corner of the vbox. \epsfspecial can be redefined
+ % to produce alternate \special syntaxes.
+ %
+ \leavevmode
+ \hbox{% so we can put this in \begin{center}...\end{center}
+ \ifepsfframe\expandafter\epsfframe\fi
+ {\vbox to\epsfysize
+ {%
+ \ifepsfshow
+ % output \special{} at lower-left corner of figure box
+ \vfil
+ \hbox to \epsfxsize{\epsfspecial{#1}\hfil}%
+ \else
+ \vfil
+ \hbox to\epsfxsize{%
+ \hss
+ \ifepsfshowfilename
+ {%
+ \epsfframemargin=3pt % local change of margin
+ \epsfframe{{\tt #1}}%
+ }%
+ \fi
+ \hss
+ }%
+ \vfil
+ \fi
+ }%
+ }}%
+ %
+ % Reset \epsfxsize and \epsfysize, as documented above.
+ %
+ \global\epsfxsize=0pt
+ \global\epsfysize=0pt
+}%
+%
+% Now we have to calculate the scale and offset values to use.
+% First we compute the natural sizes.
+%
+\def\epsfsetsize
+{%
+ \epsfrsize=\epsfury\pspoints
+ \advance\epsfrsize by-\epsflly\pspoints
+ \epsftsize=\epsfurx\pspoints
+ \advance\epsftsize by-\epsfllx\pspoints
+%
+% If `epsfxsize' is 0, we default to the natural size of the picture.
+% Otherwise we scale the graph to be \epsfxsize wide.
+%
+ \epsfxsize=\epsfsize{\epsftsize}{\epsfrsize}%
+ \ifnum \epsfxsize=0
+ \ifnum \epsfysize=0
+ \epsfxsize=\epsftsize
+ \epsfysize=\epsfrsize
+ \epsfrsize=0pt
+%
+% We have a sticky problem here: TeX doesn't do floating point arithmetic!
+% Our goal is to compute y = rx/t. The following loop does this reasonably
+% fast, with an error of at most about 16 sp (about 1/4000 pt).
+%
+ \else
+ \epsftmp=\epsftsize \divide\epsftmp\epsfrsize
+ \epsfxsize=\epsfysize \multiply\epsfxsize\epsftmp
+ \multiply\epsftmp\epsfrsize \advance\epsftsize-\epsftmp
+ \epsftmp=\epsfysize
+ \loop \advance\epsftsize\epsftsize \divide\epsftmp 2
+ \ifnum \epsftmp>0
+ \ifnum \epsftsize<\epsfrsize
+ \else
+ \advance\epsftsize-\epsfrsize \advance\epsfxsize\epsftmp
+ \fi
+ \repeat
+ \epsfrsize=0pt
+ \fi
+ \else
+ \ifnum \epsfysize=0
+ \epsftmp=\epsfrsize \divide\epsftmp\epsftsize
+ \epsfysize=\epsfxsize \multiply\epsfysize\epsftmp
+ \multiply\epsftmp\epsftsize \advance\epsfrsize-\epsftmp
+ \epsftmp=\epsfxsize
+ \loop \advance\epsfrsize\epsfrsize \divide\epsftmp 2
+ \ifnum \epsftmp>0
+ \ifnum \epsfrsize<\epsftsize
+ \else
+ \advance\epsfrsize-\epsftsize \advance\epsfysize\epsftmp
+ \fi
+ \repeat
+ \epsfrsize=0pt
+ \else
+ \epsfrsize=\epsfysize
+ \fi
+ \fi
+}%
+%
+% Issue some status messages if the user requested them
+%
+\def\epsfstatus#1{% arg = filename
+ \ifepsfverbose
+ \immediate\write16{#1: BoundingBox:
+ llx = \epsfllx\space lly = \epsflly\space
+ urx = \epsfurx\space ury = \epsfury\space}%
+ \immediate\write16{#1: scaled width = \the\epsfxsize\space
+ scaled height = \the\epsfysize}%
+ \fi
+}%
+%
+% We still need to define the tricky \epsfaux macro. This requires
+% a couple of magic constants for comparison purposes.
+%
+{\catcode`\%=12 \global\let\epsfpercent=%\global\def\epsfbblit{%BoundingBox}}%
+\global\def\epsfatend{(atend)}%
+%
+% So we're ready to check for `%BoundingBox:' and to grab the
+% values if they are found.
+%
+% If we find a line
+%
+% %%BoundingBox: (atend)
+%
+% then we ignore it, but set a flag to force parsing all of the
+% file, so the last %%BoundingBox parsed will be the one used. This
+% is necessary, because EPS files can themselves contain other EPS
+% files with their own %%BoundingBox comments.
+%
+% If we find a line
+%
+% %%BoundingBox: llx lly urx ury
+%
+% then we save the 4 values in \epsfllx, \epsflly, \epsfurx, \epsfury.
+% Then, if we have not previously parsed an (atend), we flag completion
+% and can stop reading the file. Otherwise, we must keep on reading
+% to end of file so that we find the values on the LAST %%BoundingBox.
+\long\def\epsfaux#1#2:#3\\%
+{%
+ \def\testit{#2}% % save second character up to just before colon
+ \ifx#1\epsfpercent % then first char is percent (quick test)
+ \ifx\testit\epsfbblit % then (slow test) we have %%BoundingBox
+ \epsfgrab #3 . . . \\%
+ \ifx\epsfllx\epsfatend % then ignore %%BoundingBox: (atend)
+ \global\epsfatendtrue
+ \else % else found %%BoundingBox: llx lly urx ury
+ \ifepsfatend % then keep parsing ALL %%BoundingBox lines
+ \else % else stop after first one parsed
+ \epsffileokfalse
+ \fi
+ \global\epsfbbfoundtrue
+ \fi
+ \fi
+ \fi
+}%
+%
+% Here we grab the values and stuff them in the appropriate definitions.
+%
+\def\epsfempty{}%
+\def\epsfgrab #1 #2 #3 #4 #5\\{%
+ \global\def\epsfllx{#1}\ifx\epsfllx\epsfempty
+ \epsfgrab #2 #3 #4 #5 .\\\else
+ \global\def\epsflly{#2}%
+ \global\def\epsfurx{#3}\global\def\epsfury{#4}\fi
+}%
+%
+% We default the epsfsize macro.
+%
+\def\epsfsize#1#2{\epsfxsize}%
+%
+% Finally, another definition for compatibility with older macros.
+%
+\let\epsffile=\epsfbox
+\endinput
+
diff --git a/Build/source/utils/texinfo/doc/fdl.texi b/Build/source/utils/texinfo/doc/fdl.texi
new file mode 100644
index 00000000000..11737cc89bd
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/fdl.texi
@@ -0,0 +1,452 @@
+
+@node GNU Free Documentation License
+@appendixsec GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@center Version 1.2, November 2002
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+@end enumerate
+
+@page
+@appendixsubsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/Build/source/utils/texinfo/doc/help2man b/Build/source/utils/texinfo/doc/help2man
new file mode 100755
index 00000000000..ea180b70a89
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/help2man
@@ -0,0 +1,559 @@
+#!/usr/local/bin/perl -w
+
+# Generate a short man page from --help and --version output.
+# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Written by Brendan O'Dea <bod@debian.org>
+# Available from ftp://ftp.gnu.org/gnu/help2man/
+
+use 5.005;
+use strict;
+use Getopt::Long;
+use Text::Tabs qw(expand);
+use POSIX qw(strftime setlocale LC_TIME);
+
+my $this_program = 'help2man';
+my $this_version = '1.29';
+my $version_info = <<EOT;
+GNU $this_program $this_version
+
+Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Written by Brendan O'Dea <bod\@debian.org>
+EOT
+
+my $help_info = <<EOT;
+`$this_program' generates a man page out of `--help' and `--version' output.
+
+Usage: $this_program [OPTION]... EXECUTABLE
+
+ -n, --name=STRING description for the NAME paragraph
+ -s, --section=SECTION section number for manual page (1, 6, 8)
+ -m, --manual=TEXT name of manual (User Commands, ...)
+ -S, --source=TEXT source of program (FSF, Debian, ...)
+ -i, --include=FILE include material from `FILE'
+ -I, --opt-include=FILE include material from `FILE' if it exists
+ -o, --output=FILE send output to `FILE'
+ -p, --info-page=TEXT name of Texinfo manual
+ -N, --no-info suppress pointer to Texinfo manual
+ --help print this help, then exit
+ --version print version number, then exit
+
+EXECUTABLE should accept `--help' and `--version' options although
+alternatives may be specified using:
+
+ -h, --help-option=STRING help option string
+ -v, --version-option=STRING version option string
+
+Report bugs to <bug-help2man\@gnu.org>.
+EOT
+
+my $section = 1;
+my $manual = '';
+my $source = '';
+my $help_option = '--help';
+my $version_option = '--version';
+my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info);
+
+my %opt_def = (
+ 'n|name=s' => \$opt_name,
+ 's|section=s' => \$section,
+ 'm|manual=s' => \$manual,
+ 'S|source=s' => \$source,
+ 'i|include=s' => sub { push @opt_include, [ pop, 1 ] },
+ 'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] },
+ 'o|output=s' => \$opt_output,
+ 'p|info-page=s' => \$opt_info,
+ 'N|no-info' => \$opt_no_info,
+ 'h|help-option=s' => \$help_option,
+ 'v|version-option=s' => \$version_option,
+);
+
+# Parse options.
+Getopt::Long::config('bundling');
+GetOptions (%opt_def,
+ help => sub { print $help_info; exit },
+ version => sub { print $version_info; exit },
+) or die $help_info;
+
+die $help_info unless @ARGV == 1;
+
+my %include = ();
+my %append = ();
+my @include = (); # retain order given in include file
+
+# Process include file (if given). Format is:
+#
+# [section name]
+# verbatim text
+#
+# or
+#
+# /pattern/
+# verbatim text
+#
+
+while (@opt_include)
+{
+ my ($inc, $required) = @{shift @opt_include};
+
+ next unless -f $inc or $required;
+ die "$this_program: can't open `$inc' ($!)\n"
+ unless open INC, $inc;
+
+ my $key;
+ my $hash = \%include;
+
+ while (<INC>)
+ {
+ # [section]
+ if (/^\[([^]]+)\]/)
+ {
+ $key = uc $1;
+ $key =~ s/^\s+//;
+ $key =~ s/\s+$//;
+ $hash = \%include;
+ push @include, $key unless $include{$key};
+ next;
+ }
+
+ # /pattern/
+ if (m!^/(.*)/([ims]*)!)
+ {
+ my $pat = $2 ? "(?$2)$1" : $1;
+
+ # Check pattern.
+ eval { $key = qr($pat) };
+ if ($@)
+ {
+ $@ =~ s/ at .*? line \d.*//;
+ die "$inc:$.:$@";
+ }
+
+ $hash = \%append;
+ next;
+ }
+
+ # Check for options before the first section--anything else is
+ # silently ignored, allowing the first for comments and
+ # revision info.
+ unless ($key)
+ {
+ # handle options
+ if (/^-/)
+ {
+ local @ARGV = split;
+ GetOptions %opt_def;
+ }
+
+ next;
+ }
+
+ $hash->{$key} ||= '';
+ $hash->{$key} .= $_;
+ }
+
+ close INC;
+
+ die "$this_program: no valid information found in `$inc'\n"
+ unless $key;
+}
+
+# Compress trailing blank lines.
+for my $hash (\(%include, %append))
+{
+ for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ }
+}
+
+# Turn off localisation of executable's ouput.
+@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
+
+# Turn off localisation of date (for strftime).
+setlocale LC_TIME, 'C';
+
+# Grab help and version info from executable.
+my ($help_text, $version_text) = map {
+ join '', map { s/ +$//; expand $_ } `$ARGV[0] $_ 2>/dev/null`
+ or die "$this_program: can't get `$_' info from $ARGV[0]\n"
+} $help_option, $version_option;
+
+my $date = strftime "%B %Y", localtime;
+(my $program = $ARGV[0]) =~ s!.*/!!;
+my $package = $program;
+my $version;
+
+if ($opt_output)
+{
+ unlink $opt_output
+ or die "$this_program: can't unlink $opt_output ($!)\n"
+ if -e $opt_output;
+
+ open STDOUT, ">$opt_output"
+ or die "$this_program: can't create $opt_output ($!)\n";
+}
+
+# The first line of the --version information is assumed to be in one
+# of the following formats:
+#
+# <version>
+# <program> <version>
+# {GNU,Free} <program> <version>
+# <program> ({GNU,Free} <package>) <version>
+# <program> - {GNU,Free} <package> <version>
+#
+# and seperated from any copyright/author details by a blank line.
+
+($_, $version_text) = split /\n+/, $version_text, 2;
+
+if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or
+ /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/)
+{
+ $program = $1;
+ $package = $2;
+ $version = $3;
+}
+elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/)
+{
+ $program = $2;
+ $package = $1 ? "$1$2" : $2;
+ $version = $3;
+}
+else
+{
+ $version = $_;
+}
+
+$program =~ s!.*/!!;
+
+# No info for `info' itself.
+$opt_no_info = 1 if $program eq 'info';
+
+# --name overrides --include contents.
+$include{NAME} = "$program \\- $opt_name\n" if $opt_name;
+
+# Default (useless) NAME paragraph.
+$include{NAME} ||= "$program \\- manual page for $program $version\n";
+
+# Man pages traditionally have the page title in caps.
+my $PROGRAM = uc $program;
+
+# Set default page head/footers
+$source ||= "$program $version";
+unless ($manual)
+{
+ for ($section)
+ {
+ if (/^(1[Mm]|8)/) { $manual = 'System Administration Utilities' }
+ elsif (/^6/) { $manual = 'Games' }
+ else { $manual = 'User Commands' }
+ }
+}
+
+# Extract usage clause(s) [if any] for SYNOPSIS.
+if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m)
+{
+ my @syn = $2 . $3;
+
+ if ($_ = $4)
+ {
+ s/^\n//;
+ for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ }
+ }
+
+ my $synopsis = '';
+ for (@syn)
+ {
+ $synopsis .= ".br\n" if $synopsis;
+ s!^\S*/!!;
+ s/^(\S+) *//;
+ $synopsis .= ".B $1\n";
+ s/\s+$//;
+ s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
+ s/^/\\fI/ unless s/^\\fR//;
+ $_ .= '\fR';
+ s/(\\fI)( *)/$2$1/g;
+ s/\\fI\\fR//g;
+ s/^\\fR//;
+ s/\\fI$//;
+ s/^\./\\&./;
+
+ $synopsis .= "$_\n";
+ }
+
+ $include{SYNOPSIS} ||= $synopsis;
+}
+
+# Process text, initial section is DESCRIPTION.
+my $sect = 'DESCRIPTION';
+$_ = "$help_text\n\n$version_text";
+
+# Normalise paragraph breaks.
+s/^\n+//;
+s/\n*$/\n/;
+s/\n\n+/\n\n/g;
+
+# Temporarily exchange leading dots, apostrophes and backslashes for
+# tokens.
+s/^\./\x80/mg;
+s/^'/\x81/mg;
+s/\\/\x82/g;
+
+# Start a new paragraph (if required) for these.
+s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g;
+
+sub convert_option;
+
+while (length)
+{
+ # Convert some standard paragraph names.
+ if (s/^(Options|Examples): *\n//)
+ {
+ $sect = uc $1;
+ next;
+ }
+
+ # Copyright section
+ if (/^Copyright +[(\xa9]/)
+ {
+ $sect = 'COPYRIGHT';
+ $include{$sect} ||= '';
+ $include{$sect} .= ".PP\n" if $include{$sect};
+
+ my $copy;
+ ($copy, $_) = split /\n\n/, $_, 2;
+
+ for ($copy)
+ {
+ # Add back newline
+ s/\n*$/\n/;
+
+ # Convert iso9959-1 copyright symbol or (c) to nroff
+ # character.
+ s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg;
+
+ # Insert line breaks before additional copyright messages
+ # and the disclaimer.
+ s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g;
+
+ # Join hyphenated lines.
+ s/([A-Za-z])-\n */$1/g;
+ }
+
+ $include{$sect} .= $copy;
+ $_ ||= '';
+ next;
+ }
+
+ # Catch bug report text.
+ if (/^(Report +bugs|Email +bug +reports +to) /)
+ {
+ $sect = 'REPORTING BUGS';
+ }
+
+ # Author section.
+ elsif (/^Written +by/)
+ {
+ $sect = 'AUTHOR';
+ }
+
+ # Examples, indicated by an indented leading $, % or > are
+ # rendered in a constant width font.
+ if (/^( +)([\$\%>] )\S/)
+ {
+ my $indent = $1;
+ my $prefix = $2;
+ my $break = '.IP';
+ $include{$sect} ||= '';
+ while (s/^$indent\Q$prefix\E(\S.*)\n*//)
+ {
+ $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n";
+ $break = '.br';
+ }
+
+ next;
+ }
+
+ my $matched = '';
+ $include{$sect} ||= '';
+
+ # Sub-sections have a trailing colon and the second line indented.
+ if (s/^(\S.*:) *\n / /)
+ {
+ $matched .= $& if %append;
+ $include{$sect} .= qq(.SS "$1"\n);
+ }
+
+ my $indent = 0;
+ my $content = '';
+
+ # Option with description.
+ if (s/^( {1,10}([+-]\S.*?))(?:( +(?!-))|\n( {20,}))(\S.*)\n//)
+ {
+ $matched .= $& if %append;
+ $indent = length ($4 || "$1$3");
+ $content = ".TP\n\x83$2\n\x83$5\n";
+ unless ($4)
+ {
+ # Indent may be different on second line.
+ $indent = length $& if /^ {20,}/;
+ }
+ }
+
+ # Option without description.
+ elsif (s/^ {1,10}([+-]\S.*)\n//)
+ {
+ $matched .= $& if %append;
+ $content = ".HP\n\x83$1\n";
+ $indent = 80; # not continued
+ }
+
+ # Indented paragraph with tag.
+ elsif (s/^( +(\S.*?) +)(\S.*)\n//)
+ {
+ $matched .= $& if %append;
+ $indent = length $1;
+ $content = ".TP\n\x83$2\n\x83$3\n";
+ }
+
+ # Indented paragraph.
+ elsif (s/^( +)(\S.*)\n//)
+ {
+ $matched .= $& if %append;
+ $indent = length $1;
+ $content = ".IP\n\x83$2\n";
+ }
+
+ # Left justified paragraph.
+ else
+ {
+ s/(.*)\n//;
+ $matched .= $& if %append;
+ $content = ".PP\n" if $include{$sect};
+ $content .= "$1\n";
+ }
+
+ # Append continuations.
+ while (s/^ {$indent}(\S.*)\n//)
+ {
+ $matched .= $& if %append;
+ $content .= "\x83$1\n"
+ }
+
+ # Move to next paragraph.
+ s/^\n+//;
+
+ for ($content)
+ {
+ # Leading dot and apostrophe protection.
+ s/\x83\./\x80/g;
+ s/\x83'/\x81/g;
+ s/\x83//g;
+
+ # Convert options.
+ s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge;
+ }
+
+ # Check if matched paragraph contains /pat/.
+ if (%append)
+ {
+ for my $pat (keys %append)
+ {
+ if ($matched =~ $pat)
+ {
+ $content .= ".PP\n" unless $append{$pat} =~ /^\./;
+ $content .= $append{$pat};
+ }
+ }
+ }
+
+ $include{$sect} .= $content;
+}
+
+# Refer to the real documentation.
+unless ($opt_no_info)
+{
+ my $info_page = $opt_info || $program;
+
+ $sect = 'SEE ALSO';
+ $include{$sect} ||= '';
+ $include{$sect} .= ".PP\n" if $include{$sect};
+ $include{$sect} .= <<EOT;
+The full documentation for
+.B $program
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B $program
+programs are properly installed at your site, the command
+.IP
+.B info $info_page
+.PP
+should give you access to the complete manual.
+EOT
+}
+
+# Output header.
+print <<EOT;
+.\\" DO NOT MODIFY THIS FILE! It was generated by $this_program $this_version.
+.TH $PROGRAM "$section" "$date" "$source" "$manual"
+EOT
+
+# Section ordering.
+my @pre = qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES);
+my @post = ('AUTHOR', 'REPORTING BUGS', 'COPYRIGHT', 'SEE ALSO');
+my $filter = join '|', @pre, @post;
+
+# Output content.
+for (@pre, (grep ! /^($filter)$/o, @include), @post)
+{
+ if ($include{$_})
+ {
+ my $quote = /\W/ ? '"' : '';
+ print ".SH $quote$_$quote\n";
+
+ for ($include{$_})
+ {
+ # Replace leading dot, apostrophe and backslash tokens.
+ s/\x80/\\&./g;
+ s/\x81/\\&'/g;
+ s/\x82/\\e/g;
+ print;
+ }
+ }
+}
+
+exit;
+
+# Convert option dashes to \- to stop nroff from hyphenating 'em, and
+# embolden. Option arguments get italicised.
+sub convert_option
+{
+ local $_ = '\fB' . shift;
+
+ s/-/\\-/g;
+ unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
+ {
+ s/=(.)/\\fR=\\fI$1/;
+ s/ (.)/ \\fI$1/;
+ $_ .= '\fR';
+ }
+
+ $_;
+}
diff --git a/Build/source/utils/texinfo/doc/info-stnd.texi b/Build/source/utils/texinfo/doc/info-stnd.texi
new file mode 100644
index 00000000000..1a1df6fb6d8
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/info-stnd.texi
@@ -0,0 +1,2203 @@
+\input texinfo.tex @c -*-texinfo-*-
+@comment $Id: info-stnd.texi,v 1.9 2004/12/14 16:58:15 karl Exp $
+@c We must \input texinfo.tex instead of texinfo, otherwise make
+@c distcheck in the Texinfo distribution fails, because the texinfo Info
+@c file is made first, and texi2dvi must include . first in the path.
+@comment %**start of header
+@setfilename info-stnd.info
+@include version-stnd.texi
+@settitle GNU Info @value{VERSION}
+@syncodeindex vr cp
+@syncodeindex fn cp
+@syncodeindex ky cp
+@comment %**end of header
+
+@copying
+This manual is for GNU Info (version @value{VERSION}, @value{UPDATED}),
+a program for viewing documents in Info format (usually created from
+Texinfo source files).
+
+Copyright @copyright{} 1992, 1993, 1996, 1997, 1998, 1999, 2001, 2002,
+2003, 2004 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below. A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software. Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Texinfo documentation system
+@direntry
+* info standalone: (info-stnd). Read Info documents without Emacs.
+* infokey: (info-stnd)Invoking infokey. Compile Info customizations.
+@end direntry
+
+@titlepage
+@title GNU Info
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author Brian J. Fox (bfox@@gnu.org)
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Info
+
+@insertcopying
+
+This documentation is different from the documentation for the Info
+reader that is part of GNU Emacs. If you do not know how to use Info,
+but have a working Info reader, you should read the Emacs documentation
+first, as it includes more background information and a thorough tutorial.
+@end ifnottex
+
+@menu
+* What is Info:: What is Info?
+* Invoking Info:: Options you can pass on the command line.
+* Cursor Commands:: Commands which move the cursor within a node.
+* Scrolling Commands:: Commands for reading the text within a node.
+* Node Commands:: Commands for selecting a new node.
+* Searching Commands:: Commands for searching an Info file.
+* Xref Commands:: Commands for selecting cross references.
+* Window Commands:: Commands which manipulate multiple windows.
+* Printing Nodes:: How to print out the contents of a node.
+* Miscellaneous Commands:: A few commands that defy categories.
+* Variables:: How to change the default behavior of Info.
+* Custom Key Bindings:: How to define your own key-to-command bindings.
+* Copying This Manual:: The GNU Free Documentation License.
+* Index:: Global index containing keystrokes,
+ command names, variable names,
+ and general concepts.
+@end menu
+
+
+@node What is Info
+@chapter What is Info?
+
+@dfn{Info} is a program which is used to view Info files on an ASCII
+terminal. @dfn{Info files} are the result of processing Texinfo files
+with the program @code{makeinfo} or with one of the Emacs commands, such
+as @code{M-x texinfo-format-buffer}. Texinfo itself is a documentation
+system that uses a single source file to produce both on-line
+information and printed output. You can typeset and print the files
+that you read in Info.
+
+
+@node Invoking Info
+@chapter Invoking Info
+
+@cindex Info, invoking
+@cindex invoking Info
+@cindex command line options
+@cindex options, command line
+@cindex arguments, command line
+
+GNU Info accepts several options to control the initial node being
+viewed, and to specify which directories to search for Info files. Here
+is a template showing an invocation of GNU Info from the shell:
+
+@example
+info [@var{option}]@dots{} [@var{menu-item}@dots{}]
+@end example
+
+The program accepts the following options:
+
+@table @code
+@anchor{--apropos}
+@item --apropos=@var{string}
+@cindex Searching all indices
+@cindex Info files@r{, searching all indices}
+@cindex Apropos@r{, in Info files}
+Specify a string to search in every index of every Info file installed
+on your system. Info looks up the named @var{string} in all the indices
+it can find, prints the results to standard output, and then exits. If
+you are not sure which Info file explains certain issues, this option is
+your friend. Note that if your system has a lot of Info files
+installed, searching all of them might take some time.
+
+You can invoke the apropos command from inside Info; see
+@ref{Searching Commands}.
+
+@cindex directory path
+@item --directory @var{directory-path}
+@itemx -d @var{directory-path}
+Prepend @var{directory-path} to the list of directory paths searched
+when Info needs to find a file. You may issue @code{--directory}
+multiple times; once for each directory which contains Info files. The
+list of directories searched by Info is constructed from the value of
+the environment variable @code{INFOPATH}; @code{--directory} causes the
+named @var{directory-path} to be prepended to that list. The value of
+@code{INFOPATH} is a list of directories usually separated by a colon;
+on MS-DOS/MS-Windows systems, the semicolon is used. If you do not
+define @code{INFOPATH}, Info uses a default path defined when Info was
+built as the initial list of directories. If the value of
+@code{INFOPATH} ends with a colon (or semicolon on MS-DOS/MS-Windows),
+the initial list of directories is constructed by appending the
+build-time default to the value of @code{INFOPATH}.
+
+@cindex keystrokes, recording
+@cindex remembering user keystrokes
+@item --dribble=@var{dribble-file}
+Specify a file where all user keystrokes will be recorded. This file
+can be used later to replay the same sequence of commands, see the
+@samp{--restore} option below.
+
+@item --file @var{filename}
+@itemx -f @var{filename}
+@cindex Info file, selecting
+Specify a particular Info file to visit. By default, Info visits
+the file @code{dir}; if you use this option, Info will start with
+@code{(@var{filename})Top} as the first file and node.
+
+@cindex relative Info file names
+@cindex file names, relative
+@cindex Info files, relative
+If @var{filename} is an absolute file name, or begins with @file{./} or
+@file{../}, Info looks for @var{filename} only in the directory of the
+specified @var{filename}, and adds the directory of @var{filename} to
+the value of @code{INFOPATH}. In contrast, if @var{filename} is in the
+form of a relative file name, but without the @file{./} or @file{../}
+prefix, Info will only look for it in the directories specified in
+@code{INFOPATH}. In other words, Info does @emph{not} treat file names
+which lack @file{./} and @file{../} prefix as relative to the current
+directory.
+
+@cindex compressed Info files
+@cindex files, compressed
+@cindex Info files, compressed
+In every directory Info tries, if @var{filename} is not found, Info
+looks for it with a number of known extensions of Info files@footnote{
+@file{.info}, @file{-info}, @file{/index}, and @file{.inf}.}. For every
+known extension, Info looks for a compressed file, if a regular file
+isn't found. Info supports files compressed with @code{gzip},
+@code{bzip2}, @code{compress} and @code{yabba} programs; it calls
+@code{gunzip}, @code{bunzip2}, @code{uncompress} and @code{unyabba},
+accordingly, to decompress such files. Compressed Info files are
+assumed to have @file{.z}, @file{.gz}, @file{.bz2}, @file{.Z}, or
+@file{.Y} extensions, possibly in addition to one of the known Info
+files extensions@footnote{The MS-DOS version allows for the Info
+extension, such as @code{.inf}, and the short compressed file
+extensions, such as @file{.z} and @file{.gz}, to be merged into a single
+extension, since DOS doesn't allow more than a single dot in the
+basename of a file. Thus, on MS-DOS, if Info looks for @file{bison},
+file names like @file{bison.igz} and @file{bison.inz} will be found and
+decompressed by @code{gunzip}.}.
+
+@item --help
+@itemx -h
+Produces a relatively brief description of the available Info options.
+
+@item --index-search @var{string}
+@cindex index search, selecting from the command line
+@cindex online help, using Info as
+After processing all command-line arguments, go to the index in the Info
+file and search for index entries which match @var{string}. If such an
+entry is found, the Info session begins with displaying the node pointed
+to by the first matching index entry; press @kbd{,} to step through the
+rest of the matching entries. If no such entry exists, print @samp{no
+entries found} and exit with nonzero status. This can be used from
+another program as a way to provide online help, or as a quick way of
+starting to read an Info file at a certain node when you don't know the
+exact name of that node.
+
+This command can also be invoked from inside Info; see @ref{Searching
+Commands}.
+
+@item --node @var{nodename}
+@itemx -n @var{nodename}
+@cindex node, selecting from the command line
+Specify a particular node to visit in the initial file that Info
+loads. This is especially useful in conjunction with
+@code{--file}@footnote{Of course, you can specify both the file and node
+in a @code{--node} command; but don't forget to escape the open and
+close parentheses and whitespace from the shell as in: @code{info --node
+"(emacs)Buffers"}.}. You may specify @code{--node} multiple times; for
+an interactive Info, each @var{nodename} is visited in its own window,
+for a non-interactive Info (such as when @code{--output} is given) each
+@var{nodename} is processed sequentially.
+
+@item --output @var{filename}
+@itemx -o @var{filename}
+@cindex file, outputting to
+@cindex outputting to a file
+Specify @var{filename} as the name of a file to which to direct output.
+Each node that Info visits will be output to @var{filename} instead of
+interactively viewed. A value of @code{-} for @var{filename} specifies
+the standard output.
+
+@cindex colors in documents
+@cindex ANSI escape sequences in documents
+@item --raw-escapes
+@itemx --no-raw-escapes
+@itemx -R
+Do not remove ANSI escape sequences from documents. Some versions of
+Groff, the GNU document formatter, produce man pages with ANSI escape
+sequences for bold, italics, and underlined characters, and for
+colorized text. By default, Info lets those escape sequences pass
+through directly to the terminal. If your terminal does not support
+these escapes, use @code{--no-raw-escapes} to make Info remove them.
+
+@cindex replaying recorded keystrokes
+@item --restore=@var{dribble-file}
+Read keystrokes from @var{dribble-file}, presumably recorded during
+previous Info session (see the description of the @samp{--dribble}
+option above). When the keystrokes in the files are all read, Info
+reverts its input to the usual interactive operation.
+
+@anchor{--show-options}
+@cindex command-line options, how to find
+@cindex invocation description, how to find
+@item --show-options
+@itemx --usage
+@itemx -O
+This option causes Info to look for the node that describes how to
+invoke the program and its command-line options, and begin the session
+by displaying that node. It is provided to make it easier to find the
+most important usage information in a manual without the need to wade
+through complex menu hierarchies. The effect is similar to the
+@code{M-x goto-invocation} command (@pxref{goto-invocation}) from inside
+Info.
+
+@cindex speech synthesizers
+@item --speech-friendly
+@itemx -b
+On MS-DOS/MS-Windows only, this option causes Info to use standard file
+I/O functions for screen writes. (By default, Info uses direct writes
+to the video memory on these systems, for faster operation and colored
+display support.) This allows the speech synthesizers used by blind
+persons to catch the output and convert it to audible speech.
+
+@item --subnodes
+@cindex @code{--subnodes}, command line option
+This option only has meaning when given in conjunction with
+@code{--output}. It means to recursively output the nodes appearing in
+the menus of each node being output. Menu items which resolve to
+external Info files are not output, and neither are menu items which are
+members of an index. Each node is only output once.
+
+@item --version
+@cindex version information
+Prints the version information of Info and exits.
+
+@anchor{--vi-keys}
+@cindex vi-like key bindings
+@cindex Less-like key bindings
+@item --vi-keys
+This option binds functions to keys differently, to emulate the key
+bindings of @code{vi} and Less. The default key bindings are generally
+modeled after Emacs.
+(@xref{Custom Key Bindings},
+for a more general way of altering GNU Info's key bindings.)
+
+@cindex Info manual location
+@cindex Where is an Info manual?
+@item --where
+@itemx --location
+@itemx -w
+Show the filename that would be read and exit, instead of actually
+reading it and starting Info.
+
+@item @var{menu-item}
+@cindex menu, following
+@anchor{command-line menu items}
+Info treats its remaining arguments as the names of menu items. The
+first argument is a menu item in the initial node visited (generally
+@code{dir}), the second argument is a menu item in the first argument's
+node, etc. You can easily move to the node of your choice by specifying
+the menu names which describe the path to that node. For example,
+
+@example
+info emacs buffers
+@end example
+
+@noindent
+first selects the menu item @samp{Emacs} in the node @samp{(dir)Top},
+and then selects the menu item @samp{Buffers} in the node
+@samp{(emacs)Top}.
+@end table
+
+To avoid searching the @file{dir} files and just show some arbitrary
+file, use @samp{-f} and the filename, as in @samp{info -f ./foo.info}.
+
+The index search and the search for the node which describes program
+invocation and command-line options begins @emph{after} processing all
+the command-line menu items. Therefore, the Info file searched for the
+index or the invocation node is the file where Info finds itself after
+following all the menu items given on the command line. This is so
+@samp{info emacs --show-options} does what you'd expect.
+
+@c FIXME: the feature with lowercasing the file name isn't documented
+
+
+@node Cursor Commands
+@chapter Moving the Cursor
+@cindex cursor, moving
+@cindex moving the cursor
+
+Many people find that reading screens of text page by page is made
+easier when one is able to indicate particular pieces of text with
+some kind of pointing device. Since this is the case, GNU Info (both
+the Emacs and standalone versions) have several commands which allow
+you to move the cursor about the screen. The notation used in this
+manual to describe keystrokes is identical to the notation used within
+the Emacs manual, and the GNU Readline manual. @xref{User Input,,,
+emacs, the GNU Emacs Manual}, if you are unfamiliar with the
+notation.@footnote{Here's a short summary. @kbd{C-@var{x}} means
+press the @kbd{CTRL} key and the key @var{x}. @kbd{M-@var{x}} means
+press the @kbd{META} key and the key @var{x}. On many terminals th
+@kbd{META} key is known as the @kbd{ALT} key. @kbd{SPC} is the space
+bar. The other keys are usually called by the names imprinted on
+them.}
+
+The following table lists the basic cursor movement commands in Info.
+Each entry consists of the key sequence you should type to execute the
+cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it
+invokes @code{execute-extended-command}. @xref{M-x, , Executing an
+extended command, emacs, the GNU Emacs Manual}, for more detailed
+information.} command name (displayed in parentheses), and a short
+description of what the command does. All of the cursor motion commands
+can take a @dfn{numeric} argument (see @ref{Miscellaneous Commands,
+@code{universal-argument}, to find out how to supply them}. With a
+numeric argument, the motion commands are simply executed that
+many times; for example, a numeric argument of 4 given to
+@code{next-line} causes the cursor to move down 4 lines. With a
+negative numeric argument, the motion is reversed; an argument of -4
+given to the @code{next-line} command would cause the cursor to move
+@emph{up} 4 lines.
+
+@table @asis
+@item @key{C-n} (@code{next-line})
+@itemx @key{DOWN} (an arrow key)
+@kindex C-n
+@kindex DOWN (an arrow key)
+@findex next-line
+Move the cursor down to the next line.
+
+@item @key{C-p} (@code{prev-line})
+@itemx @key{UP} (an arrow key)
+@kindex C-p
+@kindex UP (an arrow key)
+@findex prev-line
+Move the cursor up to the previous line.
+
+@item @key{C-a} (@code{beginning-of-line})
+@itemx @key{Home} (on DOS/Windows only)
+@kindex C-a, in Info windows
+@kindex Home
+@findex beginning-of-line
+Move the cursor to the start of the current line.
+
+@item @key{C-e} (@code{end-of-line})
+@itemx @key{End} (on DOS/Windows only)
+@kindex C-e, in Info windows
+@kindex End
+@findex end-of-line
+Move the cursor to the end of the current line.
+
+@item @key{C-f} (@code{forward-char})
+@itemx @key{RIGHT} (an arrow key)
+@kindex C-f, in Info windows
+@kindex RIGHT (an arrow key)
+@findex forward-char
+Move the cursor forward a character.
+
+@item @key{C-b} (@code{backward-char})
+@itemx @key{LEFT} (an arrow key)
+@kindex C-b, in Info windows
+@kindex LEFT (an arrow key)
+@findex backward-char
+Move the cursor backward a character.
+
+@item @key{M-f} (@code{forward-word})
+@itemx @kbd{C-@key{RIGHT}} (on DOS/Windows only)
+@kindex M-f, in Info windows
+@kindex C-RIGHT
+@findex forward-word
+Move the cursor forward a word.
+
+@item @key{M-b} (@code{backward-word})
+@itemx @kbd{C-@key{LEFT}} (on DOS/Windows only)
+@kindex M-b, in Info windows
+@kindex C-LEFT
+@findex backward-word
+Move the cursor backward a word.
+
+@item @key{M-<} (@code{beginning-of-node})
+@itemx @key{C-@key{Home}} (on DOS/Windows only)
+@itemx @key{b}
+@itemx @key{M-b}, vi-like operation
+@kindex b, in Info windows
+@kindex M-<
+@kindex C-Home
+@kindex M-b, vi-like operation
+@findex beginning-of-node
+Move the cursor to the start of the current node.
+
+@item @key{M->} (@code{end-of-node})
+@itemx @key{C-@key{End}} (on DOS/Windows only)
+@itemx @key{e}
+@kindex M->
+@kindex e, in Info windows
+@kindex C-End
+@findex end-of-node
+Move the cursor to the end of the current node.
+
+@item @key{M-r} (@code{move-to-window-line})
+@kindex M-r
+@findex move-to-window-line
+Move the cursor to a specific line of the window. Without a numeric
+argument, @code{M-r} moves the cursor to the start of the line in the
+center of the window. With a numeric argument of @var{n}, @code{M-r}
+moves the cursor to the start of the @var{n}th line in the window.
+@end table
+
+
+@node Scrolling Commands
+@chapter Moving Text Within a Window
+@cindex scrolling
+
+Sometimes you are looking at a screenful of text, and only part of the
+current paragraph you are reading is visible on the screen. The
+commands detailed in this section are used to shift which part of the
+current node is visible on the screen.
+
+Scrolling commands are bound differently when @samp{--vi-keys} operation
+is in effect (@pxref{--vi-keys}). These key bindings are designated
+with ``vi-like operation''.
+
+@table @asis
+@item @key{SPC} (@code{scroll-forward})
+@kindex SPC, in Info windows
+@findex scroll-forward
+Shift the text in this window up. That is, show more of the node which
+is currently below the bottom of the window. With a numeric argument,
+show that many more lines at the bottom of the window; a numeric
+argument of 4 would shift all of the text in the window up 4 lines
+(discarding the top 4 lines), and show you four new lines at the bottom
+of the window. Without a numeric argument, @key{SPC} takes the bottom
+two lines of the window and places them at the top of the window,
+redisplaying almost a completely new screenful of lines. If you are at
+the end of a node, @key{SPC} takes you to the ``next'' node, so that you can
+read an entire manual from start to finish by repeating @key{SPC}.
+
+The default scroll size is one screen-full, but it can be changed by
+invoking the (@code{scroll-forward-page-only-set-window}) command,
+@samp{z} under @samp{--vi-keys}, with a numeric argument.
+
+@item @key{NEXT} (an arrow key) (@code{scroll-forward-page-only})
+@itemx @key{C-v}
+@itemx @key{C-f}, vi-like operation
+@itemx @key{f}, vi-like operation
+@itemx @key{M-SPC}, vi-like operation
+@kindex NEXT
+@kindex C-v
+@kindex C-f, vi-like operation
+@kindex f, vi-like operation
+@kindex M-SPC, vi-like operation
+@findex scroll-forward-page-only
+Shift the text in this window up. This is identical to the @key{SPC}
+operation above, except that it never scrolls beyond the end of the
+current node.
+
+@kindex PageDown
+The @key{NEXT} key is known as the @key{PageDown} key on some
+keyboards.
+
+@item @key{z} (@code{scroll-forward-page-only-set-window}, vi-like operation)
+@kindex z, vi-like operation
+@findex scroll-forward-page-only-set-window
+Scroll forward, like with @key{NEXT}, but if a numeric argument is
+specified, it becomes the default scroll size for subsequent
+@code{scroll-forward} and @code{scroll-backward} commands and their
+ilk.
+
+@item @key{DEL} (@code{scroll-backward})
+@kindex DEL, in Info windows
+@findex scroll-backward
+Shift the text in this window down. The inverse of
+@code{scroll-forward}.
+If you are at the start of a node, @key{DEL} takes you to the
+``previous'' node, so that you can read an entire manual from finish to
+start by repeating @key{DEL}. The default scroll size can be changed by
+invoking the (@code{scroll-backward-page-only-set-window}) command,
+@samp{w} under @samp{--vi-keys}, with a numeric argument.
+
+@itemx @key{PREVIOUS} (arrow key) (@code{scroll-backward-page-only})
+@itemx @key{PRIOR} (arrow key)
+@itemx @key{M-v}
+@itemx @key{b}, vi-like operation
+@itemx @key{C-b}, vi-like operation
+@kindex PREVIOUS
+@kindex M-v
+@kindex b, vi-like operation
+@kindex C-b, vi-like operation
+@findex scroll-backward-page-only
+Shift the text in this window down. The inverse of
+@code{scroll-forward-page-only}. Does not scroll beyond the start of
+the current node. The default scroll size can be changed by invoking
+the(@code{scroll-backward-page-only-set-window}) command, @samp{w} under
+@samp{--vi-keys}, with a numeric argument.
+
+@item @key{w} (@code{scroll-backward-page-only-set-window}, vi-like operation)
+@kindex w, vi-like operation
+@findex scroll-backward-page-only-set-window
+Scroll backward, like with @key{PREVIOUS}, but if a numeric argument is
+specified, it becomes the default scroll size for subsequent
+@code{scroll-forward} and @code{scroll-backward} commands.
+
+@item @key{C-n} (@code{down-line}, vi-like operation)
+@itemx @key{C-e}, vi-like operation
+@itemx @key{RET}, vi-like operation
+@itemx @key{LFD}, vi-like operation
+@itemx @key{DOWN}, vi-like operation
+@kindex C-n, vi-like operation
+@kindex C-e, vi-like operation
+@kindex RET, vi-like operation
+@kindex LFD, vi-like operation
+@kindex DOWN, vi-like operation
+@findex down-line
+Scroll forward by one line. With a numeric argument, scroll forward
+that many lines.
+
+@item @key{C-p} (@code{up-line}, vi-like operation)
+@itemx @key{UP}, vi-like operation
+@itemx @key{y}, vi-like operation
+@itemx @key{k}, vi-like operation
+@itemx @key{C-k}, vi-like operation
+@itemx @key{C-y}, vi-like operation
+@kindex C-p, vi-like operation
+@kindex UP, vi-like operation
+@kindex y, vi-like operation
+@kindex k, vi-like operation
+@kindex C-k, vi-like operation
+@kindex C-y, vi-like operation
+@findex up-line
+Scroll backward one line. With a numeric argument, scroll backward that
+many lines.
+
+@item @key{d} (@code{scroll-half-screen-down}, vi-like operation)
+@itemx @key{C-d}, vi-like operation
+@kindex d, vi-like operation
+@kindex C-d, vi-like operation
+@findex scroll-half-screen-down
+Scroll forward by half of the screen size. With a numeric argument,
+scroll that many lines. If an argument is specified, it becomes the new
+default number of lines to scroll for subsequent @samp{d} and @samp{u}
+commands.
+
+@item @key{u} (@code{scroll-half-screen-up}, vi-like operation)
+@itemx @key{C-u}, vi-like operation
+@kindex u, vi-like operation
+@kindex C-u, vi-like operation
+@findex scroll-half-screen-up
+Scroll back by half of the screen size. With a numeric argument,
+scroll that many lines. If an argument is specified, it becomes the new
+default number of lines to scroll for subsequent @samp{u} and @samp{d}
+commands.
+@end table
+
+@cindex scrolling through node structure
+The @code{scroll-forward} and @code{scroll-backward} commands can also
+move forward and backward through the node structure of the file. If
+you press @key{SPC} while viewing the end of a node, or @key{DEL} while
+viewing the beginning of a node, what happens is controlled by the
+variable @code{scroll-behavior}. @xref{Variables,
+@code{scroll-behavior}}, for more information.
+
+The @code{scroll-forward-page-only} and @code{scroll-backward-page-only}
+commands never scroll beyond the current node.
+
+@kindex PageUp
+The @key{PREVIOUS} key is the @key{PageUp} key on many keyboards. Emacs
+refers to it by the name @key{PRIOR}. When you use @key{PRIOR} or
+@key{PageUp} to scroll, Info never scrolls beyond the beginning of the
+current node.
+
+@kindex BS (backspace)
+If your keyboard lacks the @key{DEL} key, look for a key called
+@key{BS}, or @samp{BackSpace}, sometimes designated with an arrow which
+points to the left, which should perform the same function.
+
+@table @asis
+@item @key{C-l} (@code{redraw-display})
+@kindex C-l
+@findex redraw-display
+Redraw the display from scratch, or shift the line containing the cursor
+to a specified location. With no numeric argument, @samp{C-l} clears
+the screen, and then redraws its entire contents. Given a numeric
+argument of @var{n}, the line containing the cursor is shifted so that
+it is on the @var{n}th line of the window.
+
+@item @kbd{C-x @key{w}} (@code{toggle-wrap})
+@kindex C-w
+@findex toggle-wrap
+Toggles the state of line wrapping in the current window. Normally,
+lines which are longer than the screen width @dfn{wrap}, i.e., they are
+continued on the next line. Lines which wrap have a @samp{\} appearing
+in the rightmost column of the screen. You can cause such lines to be
+terminated at the rightmost column by changing the state of line
+wrapping in the window with @code{C-x w}. When a line which needs more
+space than one screen width to display is displayed, a @samp{$} appears
+in the rightmost column of the screen, and the remainder of the line is
+invisible. When long lines are truncated, the modeline displays the
+@samp{$} character near its left edge.
+@end table
+
+
+@node Node Commands
+@chapter Selecting a Node
+@cindex nodes, selection of
+
+This section details the numerous Info commands which select a new node
+to view in the current window.
+
+The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and
+@samp{l}. Note that the commands to select nodes are mapped differently
+when @samp{--vi-keys} is in effect; these keybindings are designated
+below as ``vi-like operation''.
+
+When you are viewing a node, the top line of the node contains some Info
+@dfn{pointers} which describe where the next, previous, and up nodes
+are. Info uses this line to move about the node structure of the file
+when you use the following commands:
+
+@table @asis
+@item @key{n} (@code{next-node})
+@itemx @kbd{C-@key{NEXT}} (on DOS/Windows only)
+@itemx @kbd{C-x @key{n}}, vi-like operation
+@kindex n
+@kindex C-NEXT
+@kindex C-x n, vi-like operation
+@findex next-node
+Select the `Next' node.
+
+@kindex C-PgDn
+The @key{NEXT} key is known as the @key{PgDn} key on some
+keyboards.
+
+@item @key{p} (@code{prev-node})
+@itemx @kbd{C-@key{PREVIOUS}} (on DOS/Windows only)
+@kindex p
+@kindex C-PREVIOUS
+@findex prev-node
+Select the `Prev' node.
+
+@kindex C-PgUp
+The @key{PREVIOUS} key is known as the @key{PgUp} key on some
+keyboards.
+
+@item @key{u} (@code{up-node})
+@itemx @kbd{C-@key{UP}} (an arrow key on DOS/Windows only)
+@itemx @kbd{C-x @key{u}}, vi-like operation
+@kindex u
+@kindex C-UP
+@kindex C-x u, vi-like operation
+@findex up-node
+Select the `Up' node.
+@end table
+
+You can easily select a node that you have already viewed in this window
+by using the @samp{l} command---this name stands for ``last'', and
+actually moves backwards through the history of visited nodes for this
+window. This is handy when you followed a reference to another node,
+possibly to read about a related issue, and would like then to resume
+reading at the same place where you started the excursion.
+
+Each node where you press @samp{l} is discarded from the history. Thus,
+by the time you get to the first node you visited in a window, the
+entire history of that window is discarded.
+
+@table @asis
+@item @key{l} (@code{history-node})
+@itemx @key{C-@key{CENTER}} (on DOS/Windows only)
+@itemx @key{'}, vi-like operation
+@kindex l
+@kindex C-CENTER
+@kindex ', vi-like operation
+@findex history-node
+Pop the most recently selected node in this window from the node
+history.
+@end table
+
+Two additional commands make it easy to select the most commonly
+selected nodes; they are @samp{t} and @samp{d}.
+
+@table @asis
+@item @key{t} (@code{top-node})
+@itemx @key{M-t}, vi-like operation
+@kindex t
+@kindex M-t, vi-like operation
+@findex top-node
+Select the node @samp{Top} in the current Info file.
+
+@item @key{d} (@code{dir-node})
+@itemx @key{M-d}, vi-like operation
+@kindex d
+@kindex M-d, vi-like operation
+@findex dir-node
+Select the directory node (i.e., the node @samp{(dir)}).
+@end table
+
+Here are some other commands which immediately result in the selection
+of a different node in the current window:
+
+@table @asis
+@item @key{<} (@code{first-node})
+@itemx @key{g}, vi-like operation
+@kindex <
+@kindex g, vi-like operation
+@findex first-node
+Selects the first node which appears in this file. This node is most
+often @samp{Top}, but it does not have to be. With a numeric argument
+@var{N}, select the @var{N}th node (the first node is node 1). An
+argument of zero is the same as the argument of 1.
+
+@item @key{>} (@code{last-node})
+@itemx @key{G}, vi-like operation
+@kindex >
+@kindex G, vi-like operation
+@findex last-node
+Select the last node which appears in this file. With a numeric argument
+@var{N}, select the @var{N}th node (the first node is node 1). An
+argument of zero is the same as no argument, i.e., it selects the last
+node.
+
+@item @key{]} (@code{global-next-node})
+@kindex ]
+@findex global-next-node
+Move forward or down through node structure. If the node that you are
+currently viewing has a @samp{Next} pointer, that node is selected.
+Otherwise, if this node has a menu, the first menu item is selected. If
+there is no @samp{Next} and no menu, the same process is tried with the
+@samp{Up} node of this node.
+
+@item @key{[} (@code{global-prev-node})
+@kindex [
+@findex global-prev-node
+Move backward or up through node structure. If the node that you are
+currently viewing has a @samp{Prev} pointer, that node is selected.
+Otherwise, if the node has an @samp{Up} pointer, that node is selected,
+and if it has a menu, the last item in the menu is selected.
+@end table
+
+You can get the same behavior as @code{global-next-node} and
+@code{global-prev-node} while simply scrolling through the file with
+@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behavior}}, for
+more information.
+
+@table @asis
+@anchor{goto-node}
+@item @key{g} (@code{goto-node})
+@itemx @kbd{C-x @key{g}}, vi-like operation
+@kindex g
+@kindex C-x g, vi-like operation
+@findex goto-node
+Read the name of a node and select it. While reading the node name,
+completion (@pxref{The Echo Area, completion}) is only done for the
+nodes which reside in one of the Info files that were loaded in the
+current Info session; if the desired node resides in some other file,
+you must type the node exactly as it appears in that Info file, and you
+must include the Info file of the other file. For example,
+
+@example
+@code{g(emacs)Buffers}
+@end example
+
+finds the node @samp{Buffers} in the Info file @file{emacs}.
+
+@anchor{goto-invocation}
+@item @key{O} (@code{goto-invocation}
+@itemx @key{I}
+@kindex O
+@kindex I
+@findex goto-invocation
+@cindex finding the Invocation node
+Read the name of a program and look for a node in the current Info file
+which describes the invocation and the command-line options for that
+program. The default program name is derived from the name of the
+current Info file. This command does the same as the
+@samp{--show-options} command-line option (@pxref{--show-options}), but
+it also allows to specify the program name; this is important for those
+manuals which describe several programs.
+
+If you need to find the Invocation node of a program that is documented
+in another Info file, you need to visit that file before invoking
+@samp{I}. For example, if you are reading the Emacs manual and want to
+see the command-line options of the @code{makeinfo} program, type @kbd{g
+(texinfo) @key{RET}} and then @kbd{I makeinfo @key{RET}}. If you don't
+know what Info file documents the command, or if invoking @samp{I}
+doesn't display the right node, go to the @samp{(dir)} node (using the
+@samp{d} command) and invoke @samp{I} from there.
+
+@item @key{G} (@code{menu-sequence})
+@kindex G
+@findex menu-sequence
+@cindex menu, following, from inside Info
+Read a sequence of menu entries and follow it. Info prompts for a
+sequence of menu items separated by commas. (Since commas are not
+allowed in a node name, they are a natural choice for a delimiter in a
+list of menu items.) Info then looks up the first item in the menu of
+the node @samp{(dir)} (if the @samp{(dir)} node cannot be found, Info
+uses @samp{Top}). If such an entry is found, Info goes to the node it
+points to and looks up the second item in the menu of that node, etc.
+In other words, you can specify a complete path which descends through
+the menu hierarchy of a particular Info file starting at the
+@samp{(dir)} node. This has the same effect as if you typed the menu
+item sequence on Info's command line, see @ref{command-line menu items,,
+Info command-line arguments processing}. For example,
+
+@example
+ @kbd{G Texinfo,Overview,Reporting Bugs @key{RET}}
+@end example
+
+@noindent
+displays the node @samp{Reporting Bugs} in the Texinfo manual. (You
+don't actually need to type the menu items in their full length, or in
+their exact letter-case. However, if you do type the menu items
+exactly, Info will find it faster.)
+
+If any of the menu items you type are not found, Info stops at the last
+entry it did find and reports an error.
+
+@item @kbd{C-x @key{k}} (@code{kill-node})
+@kindex C-x k
+@findex kill-node
+Kill a node. The node name is prompted for in the echo area, with a
+default of the current node. @dfn{Killing} a node means that Info tries
+hard to forget about it, removing it from the list of history nodes kept
+for the window where that node is found. Another node is selected in
+the window which contained the killed node.
+
+@item @kbd{C-x C-f} (@code{view-file})
+@kindex C-x C-f
+@findex view-file
+Read the name of a file and selects the entire file. The command
+@example
+@code{C-x C-f @var{filename}}
+@end example
+is equivalent to typing
+@example
+@code{g(@var{filename})*}
+@end example
+
+@item @kbd{C-x C-b} (@code{list-visited-nodes})
+@kindex C-x C-b
+@findex list-visited-nodes
+Make a window containing a menu of all of the currently visited nodes.
+This window becomes the selected window, and you may use the standard
+Info commands within it.
+
+@item @kbd{C-x @key{b}} (@code{select-visited-node})
+@kindex C-x b
+@findex select-visited-node
+Select a node which has been previously visited in a visible window.
+This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is
+created.
+@end table
+
+
+@node Searching Commands
+@chapter Searching an Info File
+@cindex searching
+
+GNU Info allows you to search for a sequence of characters throughout an
+entire Info file, search through the indices of an Info file, or find
+areas within an Info file which discuss a particular topic.
+
+@table @asis
+@item @key{s} (@code{search})
+@itemx @key{/}
+@kindex s
+@kindex /
+@findex search
+Read a string in the echo area and search for it. If the string
+includes upper-case characters, the Info file is searched
+case-sensitively; otherwise Info ignores the letter case. With a
+numeric argument of @var{N}, search for @var{N}th occurrence of the
+string. Negative arguments search backwards.
+
+@item @key{?} (@code{search-backward}, vi-like operation)
+@kindex ?, vi-like operation
+@findex search-backward
+Read a string in the echo area and search backward through the Info file
+for that string. If the string includes upper-case characters, the Info
+file is searched case-sensitively; otherwise Info ignores the letter
+case. With a numeric argument of @var{N}, search for @var{N}th
+occurrence of the string. Negative arguments search forward.
+
+@item @key{S} (@code{search-case-sensitively}
+@kindex S
+@findex search-case-sensitively
+@cindex search, case-sensitive
+@cindex case-sensitive search
+Read a string in the echo area and search for it case-sensitively, even
+if the string includes only lower-case letters. With a numeric argument
+of @var{N}, search for @var{N}th occurrence of the string. Negative
+arguments search backwards.
+
+@item @kbd{C-x @key{n}} (@code{search-next})
+@itemx @key{n}, vi-like operation
+@kindex C-x n
+@kindex n, vi-like operation
+@findex search-next
+@cindex repeated search
+Search for the same string used in the last search command, in the same
+direction, and with the same case-sensitivity option. With a numeric
+argument of @var{N}, search for @var{N}th next occurrence.
+
+@item @kbd{C-x @key{N}} (@code{search-previous})
+@itemx @key{N}, vi-like operation
+@kindex C-x N
+@kindex n, vi-like operation
+@findex search-previous
+Search for the same string used in the last search command, and with the
+same case-sensitivity option, but in the reverse direction. With a
+numeric argument of @var{N}, search for @var{N}th previous occurrence.
+
+@item @key{C-s} (@code{isearch-forward})
+@kindex C-s
+@findex isearch-forward
+@cindex incremental search
+Interactively search forward through the Info file for a string as you
+type it. If the string includes upper-case characters, the search is
+case-sensitive; otherwise Info ignores the letter case.
+
+@item @key{C-r} (@code{isearch-backward})
+@kindex C-r
+@findex isearch-backward
+Interactively search backward through the Info file for a string as
+you type it. If the string includes upper-case characters, the search
+is case-sensitive; otherwise Info ignores the letter case.
+
+@item @key{i} (@code{index-search})
+@kindex i
+@findex index-search
+@cindex index, searching
+@cindex searching, in the indices
+Look up a string in the indices for this Info file, and select a node
+to which the found index entry points.
+
+@item @key{,} (@code{next-index-match})
+@kindex ,
+@findex next-index-match
+Move to the node containing the next matching index item from the last
+@samp{i} command.
+
+@item @kbd{M-x index-apropos}
+@findex index-apropos
+Grovel the indices of all the known Info files on your system for a
+string, and build a menu of the possible matches.
+@end table
+
+The most basic searching command is @samp{s} or @samp{/}
+(@code{search}). The @samp{s} command prompts you for a string in the
+echo area, and then searches the remainder of the Info file for an
+occurrence of that string. If the string is found, the node containing
+it is selected, and the cursor is left positioned at the start of the
+found string. Subsequent @samp{s} commands show you the default search
+string within @samp{[} and @samp{]}; pressing @key{RET} instead of
+typing a new string will use the default search string. Under
+@samp{--vi-keys} (@pxref{--vi-keys}), using the @samp{n} or @samp{N}
+commands is a faster way of searching for the same string.
+
+@dfn{Incremental searching} is similar to basic searching, but the
+string is looked up while you are typing it, instead of waiting until
+the entire search string has been specified.
+
+@cindex search, and case-sensitivity
+@cindex case-sensitivity, and search
+Both incremental and non-incremental search by default ignore the case
+of letters when comparing the Info file text with the search string.
+However, an uppercase letter in the search string makes the search
+case-sensitive. You can force a case-sensitive non-incremental search,
+even for a string that includes only lower-case letters, by using the
+@samp{S} command (@code{search-case-sensitively}). The @samp{n} and
+@samp{N} commands operate case-sensitively if the last search command
+was @samp{S}.
+
+The most efficient means of finding something quickly in a manual is
+the @samp{i} command (@code{index-search}). This command prompts for
+a string, and then looks for that string in all the indices of the
+current Info manual. If it finds a matching index entry, it displays
+the node to which that entry refers and prints the full text of the
+entry in the echo area. You can press @samp{,}
+(@code{next-index-match}) to find more matches. A good Info manual
+has all of its important concepts indexed, so the @samp{i} command
+lets you use a manual as a reference.
+
+If you don't know what manual documents something, try the @kbd{M-x
+index-apropos} command. It prompts for a string and then looks up
+that string in all the indices of all the Info documents installed on
+your system. It can also be invoked from the command line; see
+@ref{--apropos}.
+
+
+@node Xref Commands
+@chapter Selecting Cross References
+
+We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up}
+pointers which appear at the top of a node. In addition to these
+pointers, a node may contain other pointers which refer you to a
+different node, perhaps in another Info file. Such pointers are called
+@dfn{cross references}, or @dfn{xrefs} for short.
+
+@menu
+* Parts of an Xref:: What a cross reference is made of.
+* Selecting Xrefs:: Commands for selecting menu or note items.
+@end menu
+
+@node Parts of an Xref
+@section Parts of an Xref
+
+Cross references have two major parts: the first part is called the
+@dfn{label}; it is the name that you can use to refer to the cross
+reference, and the second is the @dfn{target}; it is the full name of
+the node that the cross reference points to.
+
+The target is separated from the label by a colon @samp{:}; first the
+label appears, and then the target. For example, in the sample menu
+cross reference below, the single colon separates the label from the
+target.
+
+@example
+* Foo Label: Foo Target. More information about Foo.
+@end example
+
+Note the @samp{.} which ends the name of the target. The @samp{.} is
+not part of the target; it serves only to let Info know where the target
+name ends.
+
+A shorthand way of specifying references allows two adjacent colons to
+stand for a target name which is the same as the label name:
+
+@example
+* Foo Commands:: Commands pertaining to Foo.
+@end example
+
+In the above example, the name of the target is the same as the name of
+the label, in this case @code{Foo Commands}.
+
+You will normally see two types of cross reference while viewing nodes:
+@dfn{menu} references, and @dfn{note} references. Menu references
+appear within a node's menu; they begin with a @samp{*} at the beginning
+of a line, and continue with a label, a target, and a comment which
+describes what the contents of the node pointed to contains.
+
+Note references appear within the body of the node text; they begin with
+@code{*Note}, and continue with a label and a target.
+
+Like @samp{Next}, @samp{Prev}, and @samp{Up} pointers, cross references
+can point to any valid node. They are used to refer you to a place
+where more detailed information can be found on a particular subject.
+Here is a cross reference which points to a node within the Texinfo
+documentation: @xref{xref, , Writing an Xref, texinfo, the Texinfo
+Manual}, for more information on creating your own texinfo cross
+references.
+
+@node Selecting Xrefs
+@section Selecting Xrefs
+
+The following table lists the Info commands which operate on menu items.
+
+@table @asis
+@item @key{1} (@code{menu-digit})
+@itemx @key{2} @dots{} @key{9}
+@itemx @key{M-1}, vi-like operation
+@itemx @key{M-2} @dots{} @key{M-9}, vi-like operation
+@cindex 1 @dots{} 9, in Info windows
+@cindex M-1 @dots{} M-9, vi-like operation
+@kindex 1 @dots{} 9, in Info windows
+@kindex M-1 @dots{} M-9, vi-like operation
+@findex menu-digit
+Within an Info window, pressing a single digit, (such as @samp{1}),
+selects that menu item, and places its node in the current window.
+For convenience, there is one exception; pressing @samp{0} selects the
+@emph{last} item in the node's menu. When @samp{--vi-keys} is in
+effect, digits set the numeric argument, so these commands are remapped
+to their @samp{M-} varieties. For example, to select the last menu
+item, press @key{M-0}.
+
+@item @key{0} (@code{last-menu-item})
+@itemx @key{M-0}, vi-like operation
+@kindex 0, in Info windows
+@kindex M-0, vi-like operation
+@findex last-menu-item
+Select the last item in the current node's menu.
+
+@item @key{m} (@code{menu-item})
+@kindex m
+@findex menu-item
+Reads the name of a menu item in the echo area and selects its node.
+Completion is available while reading the menu label. @xref{The Echo
+Area, completion}.
+
+@item @kbd{M-x find-menu}
+@findex find-menu
+Move the cursor to the start of this node's menu.
+@end table
+
+This table lists the Info commands which operate on cross references.
+
+@table @asis
+@item @key{f} (@code{xref-item})
+@itemx @key{r}
+@item @key{M-f}, vi-like operation
+@itemx @kbd{C-x @key{r}}, vi-like operation
+@kindex f
+@kindex r
+@kindex M-f, vi-like operation
+@kindex C-x r, vi-like operation
+@findex xref-item
+Reads the name of a note cross reference in the echo area and selects
+its node. Completion is available while reading the cross reference
+label. @xref{The Echo Area, completion}.
+@end table
+
+Finally, the next few commands operate on menu or note references alike:
+
+@table @asis
+@item @key{TAB} (@code{move-to-next-xref})
+@kindex TAB, in Info windows
+@findex move-to-next-xref
+Move the cursor to the start of the next nearest menu item or note
+reference in this node. You can then use @key{RET}
+(@code{select-reference-this-line}) to select the menu or note reference.
+
+@item @key{M-TAB} (@code{move-to-prev-xref})
+@itemx @key{Shift-@key{TAB}} (on DOS/Windows only)
+@kindex M-TAB, in Info windows
+@findex move-to-prev-xref
+Move the cursor the start of the nearest previous menu item or note
+reference in this node.
+
+@kindex Shift-TAB, in Info windows
+@kindex BackTab, in Info windows
+On DOS/Windows only, the @kbd{Shift-@key{TAB}} key is an alias for
+@kbd{M-@key{TAB}}. This key is sometimes called @samp{BackTab}.
+
+@item @key{RET} (@code{select-reference-this-line})
+@itemx @key{M-g}, vi-like operation
+@kindex RET, in Info windows
+@kindex M-g, vi-like operation
+@findex select-reference-this-line
+Select the menu item or note reference appearing on this line.
+@end table
+
+
+@node Window Commands
+@chapter Manipulating Multiple Windows
+@cindex windows, manipulating
+
+A @dfn{window} is a place to show the text of a node. Windows have a
+view area where the text of the node is displayed, and an associated
+@dfn{mode line}, which briefly describes the node being viewed.
+
+GNU Info supports multiple windows appearing in a single screen; each
+window is separated from the next by its modeline. At any time, there
+is only one @dfn{active} window, that is, the window in which the cursor
+appears. There are commands available for creating windows, changing
+the size of windows, selecting which window is active, and for deleting
+windows.
+
+@menu
+* The Mode Line:: What appears in the mode line?
+* Basic Windows:: Manipulating windows in Info.
+* The Echo Area:: Used for displaying errors and reading input.
+@end menu
+
+@node The Mode Line
+@section The Mode Line
+
+A @dfn{mode line} is a line of inverse video which appears at the bottom
+of an Info window. It describes the contents of the window just above
+it; this information includes the name of the file and node appearing in
+that window, the number of screen lines it takes to display the node,
+and the percentage of text that is above the top of the window. It can
+also tell you if the indirect tags table for this Info file needs to be
+updated, and whether or not the Info file was compressed when stored on
+disk.
+
+Here is a sample mode line for a window containing an uncompressed file
+named @file{dir}, showing the node @samp{Top}.
+
+@example
+@group
+-----Info: (dir)Top, 40 lines --Top-------------------------------------
+ ^^ ^ ^^^ ^^
+ (file)Node #lines where
+@end group
+@end example
+
+When a node comes from a file which is compressed on disk, this is
+indicated in the mode line with two small @samp{z}'s. In addition, if
+the Info file containing the node has been split into subfiles, the name
+of the subfile containing the node appears in the modeline as well:
+
+@example
+--zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z-------------
+@end example
+
+Truncation of long lines (as opposed to wrapping them to the next
+display line, @pxref{Scrolling Commands, toggle-wrap}) is indicated by a
+@samp{$} at the left edge of the mode line:
+
+@example
+--$--Info: (texinfo)Top, 480 lines --Top-- Subfile: texinfo-1-----------
+@end example
+
+When Info makes a node internally, such that there is no corresponding
+info file on disk, the name of the node is surrounded by asterisks
+(@samp{*}). The name itself tells you what the contents of the window
+are; the sample mode line below shows an internally constructed node
+showing possible completions:
+
+@example
+-----Info: *Completions*, 7 lines --All---------------------------------
+@end example
+
+@node Basic Windows
+@section Window Commands
+
+It can be convenient to view more than one node at a time. To allow
+this, Info can display more than one @dfn{window}. Each window has its
+own mode line (@pxref{The Mode Line}) and history of nodes viewed in that
+window (@pxref{Node Commands, , @code{history-node}}).
+
+@table @asis
+@item @kbd{C-x @key{o}} (@code{next-window})
+@cindex windows, selecting
+@kindex C-x o
+@findex next-window
+Select the next window on the screen. Note that the echo area can only be
+selected if it is already in use, and you have left it temporarily.
+Normally, @samp{C-x o} simply moves the cursor into the next window on
+the screen, or if you are already within the last window, into the first
+window on the screen. Given a numeric argument, @samp{C-x o} moves over
+that many windows. A negative argument causes @samp{C-x o} to select
+the previous window on the screen.
+
+@item @kbd{M-x prev-window}
+@findex prev-window
+Select the previous window on the screen. This is identical to
+@samp{C-x o} with a negative argument.
+
+@item @kbd{C-x @key{2}} (@code{split-window})
+@cindex windows, creating
+@kindex C-x 2
+@findex split-window
+Split the current window into two windows, both showing the same node.
+Each window is one half the size of the original window, and the cursor
+remains in the original window. The variable @code{automatic-tiling}
+can cause all of the windows on the screen to be resized for you
+automatically (@pxref{Variables, , automatic-tiling}).
+
+@item @kbd{C-x @key{0}} (@code{delete-window})
+@cindex windows, deleting
+@kindex C-x 0
+@findex delete-window
+Delete the current window from the screen. If you have made too many
+windows and your screen appears cluttered, this is the way to get rid of
+some of them.
+
+@item @kbd{C-x @key{1}} (@code{keep-one-window})
+@kindex C-x 1
+@findex keep-one-window
+Delete all of the windows excepting the current one.
+
+@item @kbd{ESC @key{C-v}} (@code{scroll-other-window})
+@kindex ESC C-v, in Info windows
+@findex scroll-other-window
+Scroll the other window, in the same fashion that @samp{C-v} might
+scroll the current window. Given a negative argument, scroll the
+``other'' window backward.
+
+@item @kbd{C-x @key{^}} (@code{grow-window})
+@kindex C-x ^
+@findex grow-window
+Grow (or shrink) the current window. Given a numeric argument, grow
+the current window that many lines; with a negative numeric argument,
+shrink the window instead.
+
+@item @kbd{C-x @key{t}} (@code{tile-windows})
+@cindex tiling
+@kindex C-x t
+@findex tile-windows
+Divide the available screen space among all of the visible windows.
+Each window is given an equal portion of the screen in which to display
+its contents. The variable @code{automatic-tiling} can cause
+@code{tile-windows} to be called when a window is created or deleted.
+@xref{Variables, , @code{automatic-tiling}}.
+@end table
+
+@node The Echo Area
+@section The Echo Area
+@cindex echo area
+
+The @dfn{echo area} is a one line window which appears at the bottom of
+the screen. It is used to display informative or error messages, and to
+read lines of input from you when that is necessary. Almost all of the
+commands available in the echo area are identical to their Emacs
+counterparts, so please refer to that documentation for greater depth of
+discussion on the concepts of editing a line of text. The following
+table briefly lists the commands that are available while input is being
+read in the echo area:
+
+@table @asis
+@item @key{C-f} (@code{echo-area-forward})
+@itemx @key{RIGHT} (an arrow key)
+@itemx @key{M-h}, vi-like operation
+@kindex C-f, in the echo area
+@kindex RIGHT, in the echo area
+@kindex M-h, in the echo area, vi-like operation
+@findex echo-area-forward
+Move forward a character.
+
+@item @key{C-b} (@code{echo-area-backward})
+@itemx @key{LEFT} (an arrow key)
+@itemx @key{M-l}, vi-like operation
+@kindex LEFT, in the echo area
+@kindex C-b, in the echo area
+@kindex M-l, in the echo area, vi-like operation
+@findex echo-area-backward
+Move backward a character.
+
+@item @key{C-a} (@code{echo-area-beg-of-line})
+@itemx @key{M-0}, vi-like operation
+@kindex C-a, in the echo area
+@kindex M-0, in the echo area, vi-like operation
+@findex echo-area-beg-of-line
+Move to the start of the input line.
+
+@item @key{C-e} (@code{echo-area-end-of-line})
+@itemx @key{M-$}, vi-like operation
+@kindex C-e, in the echo area
+@kindex M-$, vi-like operation
+@findex echo-area-end-of-line
+Move to the end of the input line.
+
+@item @key{M-f} (@code{echo-area-forward-word})
+@itemx @key{C-@key{RIGHT}} (DOS/Windows only)
+@itemx @key{M-w}, vi-like operation
+@kindex M-f, in the echo area
+@kindex M-w, in the echo area, vi-like operation
+@findex echo-area-forward-word
+Move forward a word.
+
+@kindex C-RIGHT, in the echo area
+On DOS/Windows, @kbd{C-@key{RIGHT}} moves forward by words.
+
+@item @key{M-b} (@code{echo-area-backward-word})
+@itemx @key{C-@key{LEFT}} (DOS/Windows only)
+@kindex M-b, in the echo area
+@findex echo-area-backward-word
+Move backward a word.
+
+@kindex C-LEFT, in the echo area
+On DOS/Windows, @kbd{C-@key{LEFT}} moves backward by words.
+
+@item @key{C-d} (@code{echo-area-delete})
+@itemx @key{M-x}, vi-like operation
+@kindex C-d, in the echo area
+@kindex M-x, in the echo area, vi-like operation
+@findex echo-area-delete
+Delete the character under the cursor.
+
+@item @key{DEL} (@code{echo-area-rubout})
+@kindex DEL, in the echo area
+@findex echo-area-rubout
+Delete the character behind the cursor.
+
+On some keyboards, this key is designated @key{BS}, for
+@samp{BackSpace}. Those keyboards will usually bind @key{DEL} in the
+echo area to @code{echo-area-delete}.
+
+@item @key{C-g} (@code{echo-area-abort})
+@itemx @key{C-u}, vi-like operation
+@kindex C-g, in the echo area
+@kindex C-u, in the echo area, vi-like operation
+@findex echo-area-abort
+Cancel or quit the current operation. If completion is being read, this
+command discards the text of the input line which does not match any
+completion. If the input line is empty, it aborts the calling function.
+
+@item @key{RET} (@code{echo-area-newline})
+@kindex RET, in the echo area
+@findex echo-area-newline
+Accept (or forces completion of) the current input line.
+
+@item @key{C-q} (@code{echo-area-quoted-insert})
+@itemx @key{C-v}, vi-like operation
+@kindex C-q, in the echo area
+@kindex C-v, in the echo area, vi-like operation
+@findex echo-area-quoted-insert
+Insert the next character verbatim. This is how you can insert control
+characters into a search string, for example, or the @samp{?} character
+when Info prompts with completion.
+
+@item @var{printing character} (@code{echo-area-insert})
+@kindex printing characters, in the echo area
+@findex echo-area-insert
+Insert the character. Characters that have their 8th bit set, and not
+bound to @samp{M-} commands, are also inserted verbatim; this is useful
+for terminals which support Latin scripts.
+
+@item @key{M-TAB} (@code{echo-area-tab-insert})
+@itemx @key{Shift-@key{TAB}} (on DOS/Windows only)
+@kindex M-TAB, in the echo area
+@kindex Shift-TAB, in the echo area
+@findex echo-area-tab-insert
+Insert a TAB character.
+
+@kindex Shift-TAB, in the echo area
+@kindex BackTab, in the echo area
+On DOS/Windows only, the @kbd{Shift-@key{TAB}} key is an alias for
+@kbd{M-@key{TAB}}. This key is sometimes called @samp{BackTab}.
+
+@item @key{C-t} (@code{echo-area-transpose-chars})
+@kindex C-t, in the echo area
+@findex echo-area-transpose-chars
+Transpose the characters at the cursor.
+@end table
+
+The next group of commands deal with @dfn{killing}, and @dfn{yanking}
+text@footnote{
+Some people are used to calling these operations @dfn{cut} and
+@dfn{paste}, respectively.}. For an in-depth discussion of killing and
+yanking, see @ref{Killing, , Killing and Deleting, emacs, the GNU Emacs
+Manual}.
+
+@table @asis
+@item @key{M-d} (@code{echo-area-kill-word})
+@itemx @key{M-X}, vi-like operation
+@kindex M-d, in the echo area
+@kindex M-X, in the echo area, vi-like operation
+@findex echo-area-kill-word
+Kill the word following the cursor.
+
+@item @key{M-DEL} (@code{echo-area-backward-kill-word})
+@itemx @key{M-@key{BS}}
+@kindex M-DEL, in the echo area
+@findex echo-area-backward-kill-word
+Kill the word preceding the cursor.
+
+@kindex M-BS, in the echo area
+On some keyboards, the @code{Backspace} key is used instead of
+@code{DEL}, so @code{M-@key{Backspace}} has the same effect as
+@code{M-@key{DEL}}.
+
+@item @key{C-k} (@code{echo-area-kill-line})
+@kindex C-k, in the echo area
+@findex echo-area-kill-line
+Kill the text from the cursor to the end of the line.
+
+@item @kbd{C-x @key{DEL}} (@code{echo-area-backward-kill-line})
+@kindex C-x DEL, in the echo area
+@findex echo-area-backward-kill-line
+Kill the text from the cursor to the beginning of the line.
+
+@item @key{C-y} (@code{echo-area-yank})
+@kindex C-y, in the echo area
+@findex echo-area-yank
+Yank back the contents of the last kill.
+
+@item @key{M-y} (@code{echo-area-yank-pop})
+@kindex M-y, in the echo area
+@findex echo-area-yank-pop
+Yank back a previous kill, removing the last yanked text first.
+@end table
+
+@cindex completion
+Sometimes when reading input in the echo area, the command that needed
+input will only accept one of a list of several choices. The choices
+represent the @dfn{possible completions}, and you must respond with one
+of them. Since there are a limited number of responses you can make,
+Info allows you to abbreviate what you type, only typing as much of the
+response as is necessary to uniquely identify it. In addition, you can
+request Info to fill in as much of the response as is possible; this
+is called @dfn{completion}.
+
+The following commands are available when completing in the echo area:
+
+@table @asis
+@item @key{TAB} (@code{echo-area-complete})
+@itemx @key{SPC}
+@kindex TAB, in the echo area
+@kindex SPC, in the echo area
+@findex echo-area-complete
+Insert as much of a completion as is possible.
+
+@item @key{?} (@code{echo-area-possible-completions})
+@kindex ?, in the echo area
+@findex echo-area-possible-completions
+Display a window containing a list of the possible completions of what
+you have typed so far. For example, if the available choices are:
+
+@example
+@group
+bar
+foliate
+food
+forget
+@end group
+@end example
+
+@noindent
+and you have typed an @samp{f}, followed by @samp{?}, Info will pop up a
+window showing a node called @samp{*Completions*} which lists the
+possible completions like this:
+
+@example
+@group
+3 completions:
+foliate food
+forget
+@end group
+@end example
+
+@noindent
+i.e., all of the choices which begin with @samp{f}. Pressing @key{SPC}
+or @key{TAB} would result in @samp{fo} appearing in the echo area, since
+all of the choices which begin with @samp{f} continue with @samp{o}.
+Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate}
+appearing in the echo area, since that is the only choice which begins
+with @samp{fol}.
+
+@item @key{ESC C-v} (@code{echo-area-scroll-completions-window})
+@kindex ESC C-v, in the echo area
+@findex echo-area-scroll-completions-window
+Scroll the completions window, if that is visible, or the ``other''
+window if not.
+@end table
+
+
+@node Printing Nodes
+@chapter Printing Nodes
+@cindex printing
+
+In general, we recommend that you use @TeX{} to format the document and
+print sections of it, by running @code{tex} on the Texinfo source file.
+However, you may wish to print out the contents of a node as a quick
+reference document for later use, or if you don't have @TeX{} installed.
+Info provides you with a command for doing this.
+
+@table @asis
+@item @kbd{M-x print-node}
+@findex print-node
+@cindex INFO_PRINT_COMMAND, environment variable
+Pipe the contents of the current node through the command in the
+environment variable @code{INFO_PRINT_COMMAND}. If the variable does not
+exist, the node is simply piped to @code{lpr} (on DOS/Windows, the
+default is to print the node to the local printer device, @file{PRN}).
+
+@cindex printing nodes to the local printer
+@cindex local printer device
+The value of @code{INFO_PRINT_COMMAND} may begin with the @samp{>}
+character, as in @samp{>/dev/printer}, in which case Info treats the
+rest as the name of a file or a device. Instead of piping to a command,
+Info opens the file, writes the node contents, and closes the file,
+under the assumption that text written to that file will be printed by
+the underlying OS.
+@end table
+
+
+@node Miscellaneous Commands
+@chapter Miscellaneous Commands
+
+GNU Info contains several commands which self-document GNU Info:
+
+@table @asis
+@item @kbd{M-x describe-command}
+@cindex functions, describing
+@cindex commands, describing
+@findex describe-command
+Read the name of an Info command in the echo area and then display a
+brief description of what that command does.
+
+@item @kbd{M-x describe-key}
+@cindex keys, describing
+@findex describe-key
+Read a key sequence in the echo area, and then display the name and
+documentation of the Info command that the key sequence invokes.
+
+@item @kbd{M-x describe-variable}
+Read the name of a variable in the echo area and then display a brief
+description of what the variable affects.
+
+@item @kbd{M-x where-is}
+@findex where-is
+Read the name of an Info command in the echo area, and then display
+a key sequence which can be typed in order to invoke that command.
+
+@item @key{C-h} (@code{get-help-window})
+@itemx @key{?}
+@itemx @key{F1} (on DOS/Windows only)
+@itemx h, vi-like operation
+@kindex C-h
+@kindex ?, in Info windows
+@kindex F1
+@kindex h, vi-like operation
+@findex get-help-window
+Create (or Move into) the window displaying @code{*Help*}, and place
+a node containing a quick reference card into it. This window displays
+the most concise information about GNU Info available.
+
+@item @key{h} (@code{get-info-help-node})
+@itemx @key{M-h}, vi-like operation
+@kindex h
+@kindex M-h, vi-like operation
+@findex get-info-help-node
+Try hard to visit the node @code{(info)Help}. The Info file
+@file{info.texi} distributed with GNU Info contains this node. Of
+course, the file must first be processed with @code{makeinfo}, and then
+placed into the location of your Info directory.
+@end table
+
+Here are the commands for creating a numeric argument:
+
+@table @asis
+@item @key{C-u} (@code{universal-argument})
+@cindex numeric arguments
+@kindex C-u
+@findex universal-argument
+Start (or multiply by 4) the current numeric argument. @samp{C-u} is
+a good way to give a small numeric argument to cursor movement or
+scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while
+@samp{C-u C-u C-n} moves the cursor down 16 lines. @samp{C-u} followed
+by digit keys sets the numeric argument to the number thus typed:
+@kbd{C-u 1 2 0} sets the argument to 120.
+
+@item @key{M-1} (@code{add-digit-to-numeric-arg})
+@itemx @key{1}, vi-like operation
+@itemx @key{M-2} @dots{} @key{M-9}
+@itemx @key{2} @dots{} @key{9}, vi-like operation
+@itemx @key{M-0}
+@itemx @key{0}, vi-like operation
+@kindex M-0 @dots{} M-9
+@kindex 0 @dots{} 9, vi-like operation
+@findex add-digit-to-numeric-arg
+Add the digit value of the invoking key to the current numeric
+argument. Once Info is reading a numeric argument, you may just type
+the digits of the argument, without the Meta prefix. For example, you
+might give @samp{C-l} a numeric argument of 32 by typing:
+
+@example
+@kbd{C-u 3 2 C-l}
+@end example
+
+@noindent
+or
+
+@example
+@kbd{M-3 2 C-l}
+@end example
+
+@item @key{M--} (@code{add-digit-to-numeric-arg}
+@itemx @key{-}
+@kindex M--
+@kindex -
+@cindex negative arguments
+@cindex arguments, negative
+@cindex numeric arguments, negative
+To make a negative argument, type @kbd{-}. Typing @kbd{-} alone makes a
+negative argument with a value of -1. If you continue to type digit or
+Meta-digit keys after @kbd{-}, the result is a negative number produced
+by those digits.
+
+@kbd{-} doesn't work when you type in the echo area, because you need to
+be able to insert the @samp{-} character itself; use @kbd{M--} instead,
+if you need to specify negative arguments in the echo area.
+@end table
+
+@samp{C-g} is used to abort the reading of a multi-character key
+sequence, to cancel lengthy operations (such as multi-file searches) and
+to cancel reading input in the echo area.
+
+@table @asis
+@item @key{C-g} (@code{abort-key})
+@itemx @key{C-u}, vi-like operation
+@cindex cancelling typeahead
+@cindex cancelling the current operation
+@kindex C-g, in Info windows
+@kindex C-u cancels typeahead, vi-like operation
+@findex abort-key
+Cancel current operation.
+@end table
+
+The @samp{q} command of Info simply quits running Info. Under
+@samp{--vi-keys} (@pxref{--vi-keys}), you can also exit with @samp{:q}
+or @samp{ZZ}.
+
+@table @asis
+@item @key{q} (@code{quit})
+@itemx @kbd{C-x C-c}
+@itemx @kbd{:q}, vi-like operation
+@itemx @kbd{ZZ}, vi-like operation
+@cindex quitting
+@kindex q
+@kindex C-x C-c
+@kindex ZZ, vi-like operation
+@findex quit
+Exit GNU Info.
+@end table
+
+If the operating system tells GNU Info that the screen is 60 lines tall,
+and it is actually only 40 lines tall, here is a way to tell Info that
+the operating system is correct.
+
+@table @asis
+@item @kbd{M-x set-screen-height}
+@findex set-screen-height
+@cindex screen, changing the height of
+Read a height value in the echo area and set the height of the
+displayed screen to that value.
+@end table
+
+On MS-DOS/MS-Windows, this command actually tries to change the
+dimensions of the visible screen to the value you type in the echo
+area.
+
+Finally, Info provides a convenient way to display footnotes which might
+be associated with the current node that you are viewing:
+
+@table @asis
+@item @key{ESC C-f} (@code{show-footnotes})
+@kindex ESC C-f
+@findex show-footnotes
+@cindex footnotes, displaying
+Show the footnotes (if any) associated with the current node in another
+window. You can have Info automatically display the footnotes
+associated with a node when the node is selected by setting the variable
+@code{automatic-footnotes}. @xref{Variables, , @code{automatic-footnotes}}.
+@end table
+
+
+@node Variables
+@chapter Manipulating Variables
+
+GNU Info contains several @dfn{variables} whose values are looked at by
+various Info commands. You can change the values of these variables,
+and thus change the behavior of Info to more closely match your
+environment and Info file reading manner.
+
+There are two ways to set the value of a variable: interactively, using
+the @code{set-variable} command described below, or in the @code{#var}
+section of the @code{.infokey} file. @xref{Custom Key Bindings}.
+
+@table @asis
+@item @kbd{M-x set-variable}
+@cindex variables, setting
+@findex set-variable
+Read the name of a variable, and the value for it, in the echo area and
+then set the variable to that value. Completion is available when
+reading the variable name (@pxref{The Echo Area, completion}); often,
+completion is available when reading the value to give to the variable,
+but that depends on the variable itself. If a variable does @emph{not}
+supply multiple choices to complete over, it expects a numeric value.
+
+@item @kbd{M-x describe-variable}
+@cindex variables, describing
+@findex describe-variable
+Read the name of a variable in the echo area and then display a brief
+description of what the variable affects.
+@end table
+
+Here is a list of the variables that you can set in Info.
+
+@table @code
+@item automatic-footnotes
+@vindex automatic-footnotes
+When set to @code{On}, footnotes appear and disappear automatically;
+else, they appear at the bottom of the node text. This variable is
+@code{Off} by default. When a node is selected, a window containing
+the footnotes which appear in that node is created, and the footnotes
+are displayed within the new window. The window that Info creates to
+contain the footnotes is called @samp{*Footnotes*}. If a node is
+selected which contains no footnotes, and a @samp{*Footnotes*} window
+is on the screen, the @samp{*Footnotes*} window is deleted. Footnote
+windows created in this fashion are not automatically tiled so that
+they can use as little of the display as is possible.
+
+@item automatic-tiling
+@vindex automatic-tiling
+When set to @code{On}, creating or deleting a window resizes other
+windows. This variable is @code{Off} by default. Normally, typing
+@samp{C-x 2} divides the current window into two equal parts. When
+@code{automatic-tiling} is set to @code{On}, all of the windows are
+resized automatically, keeping an equal number of lines visible in each
+window. There are exceptions to the automatic tiling; specifically, the
+windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not}
+resized through automatic tiling; they remain their original size.
+
+@item errors-ring-bell
+@vindex errors-ring-bell
+When set to @code{On}, errors cause the bell to ring. The default
+setting of this variable is @code{On}.
+
+@item gc-compressed-files
+@vindex gc-compressed-files
+When set to @code{On}, Info garbage collects files which had to be
+uncompressed. The default value of this variable is @code{Off}.
+Whenever a node is visited in Info, the Info file containing that node
+is read into core, and Info reads information about the tags and nodes
+contained in that file. Once the tags information is read by Info, it
+is never forgotten. However, the actual text of the nodes does not need
+to remain in core unless a particular Info window needs it. For
+non-compressed files, the text of the nodes does not remain in core when
+it is no longer in use. But de-compressing a file can be a time
+consuming operation, and so Info tries hard not to do it twice.
+@code{gc-compressed-files} tells Info it is okay to garbage collect the
+text of the nodes of a file which was compressed on disk.
+
+@item ISO-Latin
+@cindex ISO Latin characters
+@vindex ISO-Latin
+When set to @code{On}, Info accepts and displays ISO Latin characters.
+By default, Info assumes an ASCII character set. @code{ISO-Latin} tells
+Info that it is running in an environment where the European standard
+character set is in use, and allows you to input such characters to
+Info, as well as display them.
+
+@item scroll-behavior
+@vindex scroll-behavior
+Control what happens when forward scrolling is requested at the end of
+a node, or when backward scrolling is requested at the beginning of a
+node. The default value for this variable is @code{Continuous}. There
+are three possible values for this variable:
+
+@table @code
+@item Continuous
+Try to get the first item in this node's menu, or failing that, the
+@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}.
+This behavior is identical to using the @samp{]}
+(@code{global-next-node}) and @samp{[} (@code{global-prev-node})
+commands.
+
+@item Next Only
+Only try to get the @samp{Next} node.
+
+@item Page Only
+Simply give up, changing nothing. If @code{scroll-behavior} is
+@code{Page Only}, no scrolling command can change the node that is being
+viewed.
+@end table
+
+@item scroll-step
+@vindex scroll-step
+The number of lines to scroll when the cursor moves out of the window.
+Scrolling happens automatically if the cursor has moved out of the
+visible portion of the node text when it is time to display. Usually
+the scrolling is done so as to put the cursor on the center line of the
+current window. However, if the variable @code{scroll-step} has a
+nonzero value, Info attempts to scroll the node text by that many lines;
+if that is enough to bring the cursor back into the window, that is what
+is done. The default value of this variable is 0, thus placing the
+cursor (and the text it is attached to) in the center of the window.
+Setting this variable to 1 causes a kind of ``smooth scrolling'' which
+some people prefer.
+
+@item show-index-match
+@vindex show-index-match
+When set to @code{On}, the portion of the matched search string is
+highlighted in the message which explains where the matched search
+string was found. The default value of this variable is @code{On}.
+When Info displays the location where an index match was found,
+(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the
+string that you had typed is highlighted by displaying it in the inverse
+case from its surrounding characters.
+
+@item visible-bell
+@vindex visible-bell
+When set to @code{On}, GNU Info attempts to flash the screen instead of
+ringing the bell. This variable is @code{Off} by default. Of course,
+Info can only flash the screen if the terminal allows it; in the case
+that the terminal does not allow it, the setting of this variable has no
+effect. However, you can make Info perform quietly by setting the
+@code{errors-ring-bell} variable to @code{Off}.
+
+@end table
+
+
+@node Custom Key Bindings
+@chapter Customizing Key Bindings and Variables
+
+@cindex default key bindings, overriding
+@cindex overriding default key bindings
+@cindex customizing key bindings
+@cindex key bindings, customizing
+@cindex infokey
+@cindex .info
+@cindex .infokey
+@cindex _info file (MS-DOS)
+
+For those whose editor/pager of choice is not Emacs and who are not
+entirely satisfied with the --vi-keys option (@pxref{--vi-keys}), GNU
+Info provides a way to define different key-to-command bindings and
+variable settings from the defaults described in this document.
+
+On startup, GNU Info looks for a configuration file in the invoker's
+HOME directory called @file{.info}@footnote{Due to the limitations of
+DOS filesystems, the MS-DOS version of Info looks for a file
+@file{_info} instead. If the @env{HOME} variable is not defined, Info
+additionally looks in the current directory.}. If it is present, and
+appears to contain Info configuration data, and was created with the
+current version of the @code{infokey} command, then Info adopts the
+key bindings and variable settings contained therein.
+
+The @file{.info} file contains compact, non-textual data for reasons of
+efficiency and because its design was lifted wholesale from the GNU Less
+program, which also does it that way. It must be created by compiling a
+textual source file using the @code{infokey} command.
+
+@menu
+* Invoking infokey::
+* infokey source format::
+@end menu
+
+
+@node Invoking infokey
+@section Invoking @command{infokey}
+
+@cindex invoking infokey
+@cindex infokey, invoking
+@cindex _infokey file (MS-DOS)
+
+@command{infokey} compiles a source file
+(@file{$HOME/.infokey}@footnote{This file is named @file{_infokey} in
+the MS-DOS version, and is looked for in the current directory if
+@env{HOME} is undefined.} by default) containing Info customizations
+into a binary format (@file{$HOME/.info} by default). GNU Info reads
+the binary file at startup to override the default key bindings and
+variable definitions. Synopsis:
+
+@example
+infokey [@var{option}@dots{}] [@var{input-file}]
+@end example
+
+Besides the standard @option{--help} and @option{--version}, the only
+option is @option{--output @var{file}}. This tells @command{infokey} to
+write the binary data to @var{file} instead of @file{$HOME/.info}.
+
+
+@node infokey source format
+@section @command{infokey} source format
+
+@cindex infokey source format
+@cindex .infokey source format
+@cindex format of .infokey source
+
+The format of the source file read by @command{infokey} is most easily
+illustrated by example. For instance, here is a sample @file{.infokey}
+source file suitable for aficionados of @command{vi} or @command{less}:
+
+@example
+#info
+j next-line
+k prev-line
+l forward-char
+h backward-char
+\kd next-line
+\ku prev-line
+\kr forward-char
+\kl backward-char
+\ scroll-forward
+\kD scroll-forward-page-only
+b scroll-backward
+\kU scroll-backward-page-only
+g beginning-of-node
+\kh beginning-of-node
+G end-of-node
+\ke end-of-node
+\t select-reference-this-line
+- history-node
+n next-node
+p prev-node
+u up-node
+t top-node
+d dir-node
+#var
+scroll-step=1
+@end example
+
+The source file consists of one or more @dfn{sections}.
+Each section starts with a line that identifies the type of section.
+Possible sections are:
+
+@table @code
+@item #info
+Key bindings for Info windows.
+The start of this section is indicated by a line containing just
+@code{#info} by itself. If this is the first section in the source
+file, the @code{#info} line can be omitted. The rest of this section
+consists of lines of the form:
+
+@example
+@var{string} whitespace @var{action} [ whitespace [ # comment ] ] newline
+@end example
+
+Whitespace is any sequence of one or more spaces and/or tabs. Comment
+is any sequence of any characters, excluding newline. @var{string} is
+the key sequence which invokes the action. @var{action} is the name of
+an Info command. The characters in @var{string} are interpreted
+literally or prefixed by a caret (@code{^}) to indicate a control
+character. A backslash followed by certain characters specifies input
+keystrokes as follows:
+
+@table @code
+@item \b
+Backspace
+@item \e
+Escape (ESC)
+@item \n
+Newline
+@item \r
+Return
+@item \t
+Tab
+@item \ku
+Up arrow
+@item \kd
+Down arrow
+@item \kl
+Left arrow
+@item \kr
+Right arrow
+@item \kU
+Page Up
+@item \kD
+Page Down
+@item \kh
+HOME
+@item \ke
+END
+@item \kx
+Delete (DEL)
+@item \m@var{x}
+Meta-@var{x} where @var{x} is any character as described above.
+@end table
+
+Backslash followed by any other character indicates that character is to
+be taken literally. Characters which must be preceded by a backslash
+include caret, space, tab, and backslash itself.
+
+@item #echo-area
+Key bindings for the echo area.
+The start of this section is indicated by a line containing just
+@code{#echo-area} by itself. The rest of this section has a syntax
+identical to that for the key definitions for the Info area, described
+above.
+
+@item #var
+Variable initializations.
+The start of this section is indicated by a line containing just
+@code{#var} by itself. Following this line is a list of variable
+assignments, one per line. Each line consists of a variable name
+(@xref{Variables},) followed by @code{=} followed by a value.
+There may be no white space between the variable name and the @code{=},
+and all characters following the @code{=}, including white space,
+are included in the value.
+@end table
+
+Blank lines and lines starting with @code{#} are ignored, except for
+the special section header lines.
+
+Key bindings defined in the @file{.info} file take precedence over GNU
+Info's default key bindings, whether or not @samp{--vi-keys} is used. A
+default key binding may be disabled by overriding it in the @file{.info}
+file with the action @code{invalid}. In addition, @emph{all} default
+key bindings can be disabled by adding this line @emph{anywhere} in the
+relevant section:
+
+@example
+#stop
+@end example
+
+This will cause GNU Info to ignore all the default key commands for that
+section.
+
+Beware: @code{#stop} can be dangerous. Since it disables all default
+key bindings, you must supply enough new key bindings to enable all
+necessary actions. Failure to bind any key to the @code{quit} command,
+for example, can lead to frustration.
+
+The order in which key bindings are defined in the @file{.info} file is
+not important, except that the command summary produced by the
+@code{get-help-window} command only displays the @emph{first} key that
+is bound to each command.
+
+
+@c the following is incomplete
+@ignore
+@c node Info for Sys Admins
+@c chapter Info for System Administrators
+
+This text describes some common ways of setting up an Info hierarchy
+from scratch, and details the various options that are available when
+installing Info. This text is designed for the person who is installing
+GNU Info on the system; although users may find the information present
+in this section interesting, none of it is vital to understanding how to
+use GNU Info.
+
+@menu
+* Setting the INFOPATH:: Where are my Info files kept?
+* Editing the DIR node:: What goes in `DIR', and why?
+* Storing Info files:: Alternate formats allow flexibility in setups.
+* Using `localdir':: Building DIR on the fly.
+* Example setups:: Some common ways to organize Info files.
+@end menu
+
+@c node Setting the INFOPATH
+@c section Setting the INFOPATH
+
+Where are my Info files kept?
+
+@c node Editing the DIR node
+@c section Editing the DIR node
+
+What goes in `DIR', and why?
+
+@c node Storing Info files
+@c section Storing Info files
+
+Alternate formats allow flexibility in setups.
+
+@c node Using `localdir'
+@c section Using `localdir'
+
+Building DIR on the fly.
+
+@c node Example setups
+@c section Example setups
+
+Some common ways to organize Info files.
+@end ignore
+
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+
+@node Index
+@appendix Index
+
+@printindex cp
+
+@bye
diff --git a/Build/source/utils/texinfo/doc/info.1 b/Build/source/utils/texinfo/doc/info.1
new file mode 100644
index 00000000000..39ca1d32ac3
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/info.1
@@ -0,0 +1,89 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.34.
+.TH INFO "1" "December 2004" "info 4.8" "User Commands"
+.SH NAME
+info \- read Info documents
+.SH SYNOPSIS
+.B info
+[\fIOPTION\fR]... [\fIMENU-ITEM\fR...]
+.SH DESCRIPTION
+Read documentation in Info format.
+.SH OPTIONS
+.TP
+\fB\-\-apropos\fR=\fISTRING\fR
+look up STRING in all indices of all manuals.
+.TP
+\fB\-d\fR, \fB\-\-directory\fR=\fIDIR\fR
+add DIR to INFOPATH.
+.TP
+\fB\-\-dribble\fR=\fIFILENAME\fR
+remember user keystrokes in FILENAME.
+.TP
+\fB\-f\fR, \fB\-\-file\fR=\fIFILENAME\fR
+specify Info file to visit.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+display this help and exit.
+.TP
+\fB\-\-index\-search\fR=\fISTRING\fR
+go to node pointed by index entry STRING.
+.TP
+\fB\-n\fR, \fB\-\-node\fR=\fINODENAME\fR
+specify nodes in first visited Info file.
+.TP
+\fB\-o\fR, \fB\-\-output\fR=\fIFILENAME\fR
+output selected nodes to FILENAME.
+.TP
+\fB\-R\fR, \fB\-\-raw\-escapes\fR
+output "raw" ANSI escapes (default).
+.TP
+\fB\-\-no\-raw\-escapes\fR
+output escapes as literal text.
+.TP
+\fB\-\-restore\fR=\fIFILENAME\fR
+read initial keystrokes from FILENAME.
+.TP
+\fB\-O\fR, \fB\-\-show\-options\fR, \fB\-\-usage\fR
+go to command\-line options node.
+.TP
+\fB\-\-subnodes\fR
+recursively output menu items.
+.TP
+\fB\-w\fR, \fB\-\-where\fR, \fB\-\-location\fR
+print physical location of Info file.
+.TP
+\fB\-\-vi\-keys\fR
+use vi\-like and less\-like key bindings.
+.TP
+\fB\-\-version\fR
+display version information and exit.
+.PP
+The first non\-option argument, if present, is the menu entry to start from;
+it is searched for in all `dir' files along INFOPATH.
+If it is not present, info merges all `dir' files and shows the result.
+Any remaining arguments are treated as the names of menu
+items relative to the initial node visited.
+.SH EXAMPLES
+.TP
+info
+show top\-level dir menu
+.TP
+info emacs
+start at emacs node from top\-level dir
+.TP
+info emacs buffers
+start at buffers node within emacs manual
+.TP
+info \fB\-\-show\-options\fR emacs
+start at node with emacs' command line options
+.TP
+info \fB\-f\fR ./foo.info
+show file ./foo.info, not searching dir
+.SH "REPORTING BUGS"
+Email bug reports to bug\-texinfo@gnu.org,
+general questions and discussion to help\-texinfo@gnu.org.
+Texinfo home page: http://www.gnu.org/software/texinfo/
+.SH COPYRIGHT
+Copyright \(co 2004 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
diff --git a/Build/source/utils/texinfo/doc/info.5 b/Build/source/utils/texinfo/doc/info.5
new file mode 100644
index 00000000000..08fd289908f
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/info.5
@@ -0,0 +1,72 @@
+.\" info(5)
+.\" $Id: info.5,v 1.2 2004/04/11 17:56:45 karl Exp $
+.\"
+.\" Copyright (C) 1998 Free Software Foundation, Inc.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of
+.\" this manual under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Permission is granted to copy and distribute translations of this
+.\" manual into another language, under the above conditions for modified
+.\" versions, except that this permission notice may be stated in a
+.\" translation approved by the Foundation.
+.\"
+.de EX
+.nf
+.ft CW
+.in +5
+..
+.de EE
+.in -5
+.ft R
+.fi
+..
+.TH INFO 5 "GNU Info" "FSF"
+.SH NAME
+info \- readable online documentation
+.SH DESCRIPTION
+The Info file format is an easily-parsable representation for online
+documents. It can be read by
+.I emacs(1)
+and
+.I info(1)
+among other programs.
+.PP
+Info files are usually created from
+.I texinfo(5)
+sources by
+.IR makeinfo(1) ,
+but can be created from scratch if so desired.
+.PP
+For a full description of the Texinfo language and associated tools,
+please see the Texinfo manual (written in Texinfo itself). Most likely,
+running this command from your shell:
+.EX
+info texinfo
+.EE
+or this key sequence from inside Emacs:
+.EX
+M-x info RET m texinfo RET
+.EE
+will get you there.
+.SH AVAILABILITY
+ftp://ftp.gnu.org/pub/gnu/texinfo-<version>.tar.gz
+.br
+or any GNU mirror site.
+.SH "REPORTING BUGS"
+Please send bug reports to bug-texinfo@gnu.org,
+general questions and discussion to help-texinfo@gnu.org.
+.SH "SEE ALSO"
+info(1), install-info(1), makeinfo(1), texi2dvi(1),
+.br
+texindex(1).
+.br
+emacs(1), tex(1).
+.br
+texinfo(5).
diff --git a/Build/source/utils/texinfo/doc/info.texi b/Build/source/utils/texinfo/doc/info.texi
new file mode 100644
index 00000000000..014e9165087
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/info.texi
@@ -0,0 +1,1498 @@
+\input texinfo.tex @c -*-texinfo-*-
+@c We must \input texinfo.tex instead of texinfo, otherwise make
+@c distcheck in the Texinfo distribution fails, because the texinfo Info
+@c file is made first, and texi2dvi must include . first in the path.
+@comment %**start of header
+@setfilename info.info
+@settitle Info
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@comment %**end of header
+
+@copying
+This file describes how to use Info, the on-line, menu-driven GNU
+documentation system.
+
+Copyright (C) 1989, 1992, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software. Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License. If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Texinfo documentation system
+@direntry
+* Info: (info). How to use the documentation browsing system.
+@end direntry
+
+@titlepage
+@title Info
+@subtitle The online, hyper-text GNU documentation system
+@author Brian Fox
+@author and the GNU Texinfo community
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top Info: An Introduction
+
+The GNU Project distributes most of its on-line manuals in the
+@dfn{Info format}, which you read using an @dfn{Info reader}. You are
+probably using an Info reader to read this now.
+
+There are two primary Info readers: @code{info}, a stand-alone program
+designed just to read Info files, and the @code{info} package in GNU
+Emacs, a general-purpose editor. At present, only the Emacs reader
+supports using a mouse.
+
+@ifinfo
+If you are new to the Info reader and want to learn how to use it,
+type the command @kbd{h} now. It brings you to a programmed
+instruction sequence.
+
+To read about expert-level Info commands, type @kbd{n} twice. This
+brings you to @cite{Info for Experts}, skipping over the `Getting
+Started' chapter.
+@end ifinfo
+@end ifnottex
+
+@menu
+* Getting Started:: Getting started using an Info reader.
+* Expert Info:: Info commands for experts.
+* Creating an Info File:: How to make your own Info file.
+* Index:: An index of topics, commands, and variables.
+@end menu
+
+@node Getting Started, Expert Info, Top, Top
+@comment node-name, next, previous, up
+@chapter Getting Started
+
+This first part of this Info manual describes how to get around inside
+of Info. The second part of the manual describes various advanced
+Info commands, and how to write an Info as distinct from a Texinfo
+file. The third part briefly explains how to generate Info files from
+Texinfo files.
+
+@ifnotinfo
+This manual is primarily designed for browsing with an Info reader
+program on a computer, so that you can try Info commands while reading
+about them. Reading it on paper or with an HTML browser is less
+effective, since you must take it on faith that the commands described
+really do what the manual says. By all means go through this manual
+now that you have it; but please try going through the on-line version
+as well.
+
+@cindex Info reader, how to invoke
+@cindex entering Info
+There are two ways of looking at the online version of this manual:
+
+@enumerate
+@item
+Type @code{info} at your shell's command line. This approach uses a
+stand-alone program designed just to read Info files.
+
+@item
+Type @code{emacs} at the command line; then type @kbd{C-h i}
+(@kbd{Control-h}, followed by @kbd{i}). This approach uses the Info
+mode of the Emacs editor.
+@end enumerate
+
+In either case, then type @kbd{mInfo} (just the letters), followed by
+@key{RET}---the ``Return'' or ``Enter'' key. At this point, you should
+be ready to follow the instructions in this manual as you read them on
+the screen.
+@c FIXME! (pesch@cygnus.com, 14 dec 1992)
+@c Is it worth worrying about what-if the beginner goes to somebody
+@c else's Emacs session, which already has an Info running in the middle
+@c of something---in which case these simple instructions won't work?
+@end ifnotinfo
+
+@menu
+* Help-Small-Screen:: Starting Info on a Small Screen.
+* Help:: How to use Info.
+* Help-P:: Returning to the Previous node.
+* Help-^L:: The Space, DEL, B and ^L commands.
+* Help-Inv:: Invisible text in Emacs Info.
+* Help-M:: Menus.
+* Help-Xref:: Following cross-references.
+* Help-Int:: Some intermediate Info commands.
+* Help-Q:: Quitting Info.
+@end menu
+
+@node Help-Small-Screen
+@section Starting Info on a Small Screen
+
+@ifnotinfo
+(In Info, you only see this section if your terminal has a small
+number of lines; most readers pass by it without seeing it.)
+@end ifnotinfo
+
+@cindex small screen, moving around
+Since your terminal has a relatively small number of lines on its
+screen, it is necessary to give you special advice at the beginning.
+
+If you see the text @samp{--All----} near the bottom right corner
+of the screen, it means the entire text you are looking at fits on the
+screen. If you see @samp{--Top----} instead, it means that there is
+more text below that does not fit. To move forward through the text
+and see another screen full, press @key{SPC}, the Space bar. To move
+back up, press the key labeled @samp{Backspace} or @samp{DEL} (on some
+keyboards, this key might be labeled @samp{Delete}).
+
+@ifinfo
+Here are 40 lines of junk, so you can try @key{SPC} and @key{DEL} and
+see what they do. At the end are instructions of what you should do
+next.
+
+@format
+This is line 20
+This is line 21
+This is line 22
+This is line 23
+This is line 24
+This is line 25
+This is line 26
+This is line 27
+This is line 28
+This is line 29
+This is line 30
+This is line 31
+This is line 32
+This is line 33
+This is line 34
+This is line 35
+This is line 36
+This is line 37
+This is line 38
+This is line 39
+This is line 40
+This is line 41
+This is line 42
+This is line 43
+This is line 44
+This is line 45
+This is line 46
+This is line 47
+This is line 48
+This is line 49
+This is line 50
+This is line 51
+This is line 52
+This is line 53
+This is line 54
+This is line 55
+This is line 56
+This is line 57
+This is line 58
+This is line 59
+@end format
+
+If you have managed to get here, go back to the beginning with
+@kbd{DEL} (or @key{BACKSPACE}), and come back here again, then you
+understand the about the @samp{Space} and @samp{Backspace} keys. So
+now type an @kbd{n}---just one character; don't type the quotes and
+don't type the Return key afterward---to get to the normal start of
+the course.
+@end ifinfo
+
+@node Help, Help-P, Help-Small-Screen, Getting Started
+@comment node-name, next, previous, up
+@section How to use Info
+
+You are talking to the program Info, for reading documentation.
+
+ There are two ways to use Info: from within Emacs or as a
+stand-alone reader that you can invoke from a shell using the command
+@command{info}.
+
+@cindex node, in Info documents
+ Right now you are looking at one @dfn{Node} of Information.
+A node contains text describing a specific topic at a specific
+level of detail. This node's topic is ``how to use Info''. The mode
+line says that this is node @samp{Help} in the file @file{info}.
+
+@cindex header of Info node
+ The top line of a node is its @dfn{header}. This node's header
+(look at it now) says that the @samp{Next} node after this one is the
+node called @samp{Help-P}. An advanced Info command lets you go to
+any node whose name you know. In the stand-alone Info reader program,
+the header line shows the names of this node and the info file as
+well. In Emacs, the header line is duplicated in a special typeface,
+and the duplicate remains at the top of the window all the time even
+if you scroll through the node.
+
+ Besides a @samp{Next}, a node can have a @samp{Previous} link, or an
+@samp{Up} link, or both. As you can see, this node has all of these
+links.
+
+@kindex n @r{(Info mode)}
+ Now it is time to move on to the @samp{Next} node, named @samp{Help-P}.
+
+@format
+>> Type @kbd{n} to move there. Type just one character;
+ do not type the quotes and do not type a @key{RET} afterward.
+@end format
+
+@noindent
+@samp{>>} in the margin means it is really time to try a command.
+
+@format
+>> If you are in Emacs and have a mouse, and if you already practiced
+ typing @kbd{n} to get to the next node, click now with the middle
+ mouse button on the @samp{Next} link to do the same ``the mouse way''.
+@end format
+
+@node Help-P, Help-^L, Help, Getting Started
+@comment node-name, next, previous, up
+@section Returning to the Previous node
+
+@kindex p @r{(Info mode)}
+This node is called @samp{Help-P}. The @samp{Previous} node, as you see,
+is @samp{Help}, which is the one you just came from using the @kbd{n}
+command. Another @kbd{n} command now would take you to the next
+node, @samp{Help-^L}.
+
+@format
+>> But do not type @kbd{n} yet. First, try the @kbd{p} command, or
+ (in Emacs) click the middle mouse button on the @samp{Prev} link.
+ That takes you to the @samp{Previous} node. Then use @kbd{n} to
+ return here.
+@end format
+
+ If you read this in Emacs, you will see an @samp{Info} item in the
+menu bar, close to its right edge. Clicking the mouse on the
+@samp{Info} menu-bar item opens a menu of commands which include
+@samp{Next} and @samp{Prev} (and also some others which you didn't yet
+learn about).
+
+ This all probably seems insultingly simple so far, but @emph{please
+don't} start skimming. Things will get complicated soon enough!
+Also, please do not try a new command until you are told it is time
+to. You could make Info skip past an important warning that was
+coming up.
+
+@format
+>> Now do an @kbd{n}, or (in Emacs) click the middle mouse button on
+ the @samp{Next} link, to get to the node @samp{Help-^L} and learn more.
+@end format
+
+@node Help-^L, Help-Inv, Help-P, Getting Started
+@comment node-name, next, previous, up
+@section The Space, DEL, B and ^L commands
+
+ This node's mode line tells you that you are now at node
+@samp{Help-^L}, and the header line tells you that @kbd{p} would get
+you back to @samp{Help-P}. The node's title is highlighted and may be
+underlined as well; it says what the node is about.
+
+ This is a big node and it does not all fit on your display screen.
+You can tell that there is more that is not visible because you
+can see the string @samp{--Top-----} rather than @samp{--All----} near
+the bottom right corner of the screen.
+
+@kindex SPC @r{(Info mode)}
+@kindex DEL @r{(Info mode)}
+@kindex BACKSPACE @r{(Info mode)}
+@findex Info-scroll-up
+@findex Info-scroll-down
+ The @key{SPC}, @key{BACKSPACE} (or @key{DEL})@footnote{The key which
+we call ``Backspace or DEL'' in this manual is labeled differently on
+different keyboards. Look for a key which is a little ways above the
+@key{ENTER} or @key{RET} key and which you normally use outside Emacs
+to erase the character before the cursor, i.e.@: the character you
+typed last. It might be labeled @samp{Backspace} or @samp{<-} or
+@samp{DEL}, or sometimes @samp{Delete}.} and @kbd{b} commands exist to
+allow you to ``move around'' in a node that does not all fit on the
+screen at once. @key{SPC} moves forward, to show what was below the
+bottom of the screen. @key{DEL} or @key{BACKSPACE} moves backward, to
+show what was above the top of the screen (there is not anything above
+the top until you have typed some spaces).
+
+@format
+>> Now try typing a @key{SPC} (afterward, type a @key{BACKSPACE} to
+ return here).
+@end format
+
+ When you type the @key{SPC}, the two lines that were at the bottom of
+the screen appear at the top, followed by more lines. @key{DEL} or
+@key{BACKSPACE} takes the two lines from the top and moves them to the
+bottom, @emph{usually}, but if there are not a full screen's worth of
+lines above them they may not make it all the way to the bottom.
+
+ If you are reading this in Emacs, note that the header line is
+always visible, never scrolling off the display. That way, you can
+always see the @samp{Next}, @samp{Prev}, and @samp{Up} links, and you
+can conveniently go to one of these links at any time by
+clicking the middle mouse button on the link.
+
+@cindex reading Info documents top to bottom
+@cindex Info documents as tutorials
+ @key{SPC} and @key{DEL} not only move forward and backward through
+the current node. They also move between nodes. @key{SPC} at the end
+of a node moves to the next node; @key{DEL} (or @key{BACKSPACE}) at
+the beginning of a node moves to the previous node. In effect, these
+commands scroll through all the nodes in an Info file as a single
+logical sequence. You can read an entire manual top to bottom by just
+typing @key{SPC}, and move backward through the entire manual from
+bottom to top by typing @key{DEL} (or @key{BACKSPACE}).
+
+ In this sequence, a node's subnodes appear following their parent.
+If a node has a menu, @key{SPC} takes you into the subnodes listed in
+the menu, one by one. Once you reach the end of a node, and have seen
+all of its subnodes, @key{SPC} takes you to the next node or to the
+parent's next node.
+
+@kindex PAGEUP @r{(Info mode)}
+@kindex PAGEDOWN @r{(Info mode)}
+ Many keyboards nowadays have two scroll keys labeled @samp{PageUp}
+and @samp{PageDown} (or maybe @samp{Prior} and @samp{Next}). If your
+keyboard has these keys, you can use them to move forward and backward
+through the text of one node, like @key{SPC} and @key{BACKSPACE} (or
+@key{DEL}). However, @key{PAGEUP} and @key{PAGEDOWN} keys never
+scroll beyond the beginning or the end of the current node.
+
+@kindex C-l @r{(Info mode)}
+ If your screen is ever garbaged, you can tell Info to display it
+again by typing @kbd{C-l} (@kbd{Control-L}---that is, hold down
+@key{CTRL} and type @kbd{L} or @kbd{l}).
+
+@format
+>> Type @kbd{C-l} now.
+@end format
+
+@kindex b @r{(Info mode)}
+ To move back to the beginning of the node you are on, you can type
+the @key{BACKSPACE} key (or @key{DEL}) many times. You can also type
+@kbd{b} just once. @kbd{b} stands for ``beginning.''
+
+@format
+>> Try that now. (We have put in enough verbiage to push this past
+ the first screenful, but screens are so big nowadays that perhaps it
+ isn't enough. You may need to shrink your Emacs or Info window.)
+ Then come back, by typing @key{SPC} one or more times.
+@end format
+
+ If your screen is very tall, all of this node might fit at once. In
+that case, @kbd{b} won't do anything. But you could observe the
+effect of the @kbd{b} key if you use a smaller window.
+
+@kindex ? @r{(Info mode)}
+@findex Info-summary
+ You have just learned a considerable number of commands. If you
+want to use one but have trouble remembering which, you should type
+a @kbd{?} (in Emacs it runs the @code{Info-summary} command) which
+displays a brief list of commands. When you are finished looking at
+the list, make it go away by typing a @key{SPC} repeatedly.
+
+@format
+>> Type a @key{?} now. Press @key{SPC} to see consecutive screenfuls of
+ the list until finished. Then type @key{SPC} several times. If
+ you are using Emacs, the help will then go away automatically.
+@end format
+
+ (If you are using the stand-alone Info reader, type @kbd{C-x 0} to
+return here, that is---press and hold @key{CTRL}, type an @kbd{x},
+then release @key{CTRL} and @kbd{x}, and press @kbd{0}; that's a zero,
+not the letter ``o''.)
+
+ From now on, you will encounter large nodes without warning, and
+will be expected to know how to use @key{SPC} and @key{BACKSPACE} to
+move around in them without being told. Since not all terminals have
+the same size screen, it would be impossible to warn you anyway.
+
+@format
+>> Now type @kbd{n}, or click the middle mouse button on the @samp{Next} link,
+ to visit the next node.
+@end format
+
+@node Help-Inv, Help-M, Help-^L, Getting Started
+@comment node-name, next, previous, up
+@section Invisible text in Emacs Info
+
+ Before discussing menus, we need to make some remarks that are only
+relevant to users reading Info using Emacs. Users of the stand-alone
+version can skip this node by typing @kbd{]} now.
+
+@cindex invisible text in Emacs
+ In Emacs, certain text that appears in the stand-alone version is
+normally hidden, technically because it has the @samp{invisibility}
+property. Invisible text is really a part of the text. It becomes
+visible (by default) after killing and yanking, it appears in printed
+output, it gets saved to file just like any other text, and so on.
+Thus it is useful to know it is there.
+
+@findex visible-mode
+You can make invisible text visible by using the command @kbd{M-x
+visible-mode}. Visible mode is a minor mode, so using the command a
+second time will make the text invisible again. Watch the effects of
+the command on the ``menu'' below and the top line of this node.
+
+If you prefer to @emph{always} see the invisible text, you can set
+@code{Info-hide-note-references} to @code{nil}. Enabling Visible mode
+permanently is not a real alternative, because Emacs Info also uses
+(although less extensively) another text property that can change the
+text being displayed, the @samp{display} property. Only the
+invisibility property is affected by Visible mode. When, in this
+tutorial, we refer to the @samp{Emacs} behavior, we mean the
+@emph{default} Emacs behavior.
+
+Now type @kbd{]}, to learn about the @kbd{]} and @kbd{[} commands.
+
+@menu
+* ]: Help-]. Node telling about ].
+* stuff: Help-]. Same node.
+* Help-]:: Yet again, same node.
+@end menu
+
+@node Help-], , , Help-Inv
+@subsection The @kbd{]} and @kbd{[} commands
+
+If you type @kbd{n} now, you get an error message saying that this
+node has no next node. Similarly, if you type @kbd{p}, the error
+message tells you that there is no previous node. (The exact message
+depends on the Info reader you use.) This is because @kbd{n} and
+@kbd{p} carry you to the next and previous node @emph{at the same
+level}. The present node is contained in a menu (see next) of the
+node you came from, and hence is considered to be at a lower level.
+It is the only node in the previous node's menu (even though it was
+listed three times). Hence it has no next or previous node that
+@kbd{n} or @kbd{p} could move to.
+
+If you systematically move through a manual by typing @kbd{n}, you run
+the risk of skipping many nodes. You do not run this risk if you
+systematically use @kbd{@key{SPC}}, because, when you scroll to the
+bottom of a node and type another @kbd{@key{SPC}}, then this carries
+you to the following node in the manual @emph{regardless of level}.
+If you immediately want to go to that node, without having to scroll
+to the bottom of the screen first, you can type @kbd{]}.
+
+Similarly, @kbd{@key{BACKSPACE}} carries you to the preceding node
+regardless of level, after you scrolled to the beginning of the
+present node. If you want to go to the preceding node immediately,
+you can type @kbd{[}.
+
+For instance, typing this sequence will come back here in three steps:
+@kbd{[ n [}. To do the same backward, type @kbd{] p ]}.
+
+Now type @kbd{]} to go to the next node and learn about menus.
+
+@node Help-M, Help-Xref, Help-Inv, Getting Started
+@comment node-name, next, previous, up
+@section Menus and the @kbd{m} command
+
+@cindex menus in an Info document
+@cindex Info menus
+ With only the @kbd{n} (next), @kbd{p} (previous), @kbd{@key{SPC}},
+@kbd{@key{BACKSPACE}}, @kbd{]} and @kbd{[} commands for moving between
+nodes, nodes are restricted to a linear sequence. Menus allow a
+branching structure. A menu is a list of other nodes you can move to.
+It is actually just part of the text of the node formatted specially
+so that Info can interpret it. The beginning of a menu is always
+identified by a line which starts with @w{@samp{* Menu:}}. A node
+contains a menu if and only if it has a line in it which starts that
+way. The only menu you can use at any moment is the one in the node
+you are in. To use a menu in any other node, you must move to that
+node first.
+
+ After the start of the menu, each line that starts with a @samp{*}
+identifies one subtopic. The line usually contains a brief name for
+the subtopic (followed by a @samp{:}, normally hidden in Emacs), the
+name of the node that talks about that subtopic (again, normally
+hidden in Emacs), and optionally some further description of the
+subtopic. Lines in the menu that do not start with a @samp{*} have no
+special meaning---they are only for the human reader's benefit and do
+not define additional subtopics. Here is an example:
+
+@example
+* Foo: Node about FOO. This tells about FOO.
+@end example
+
+The subtopic name is Foo, and the node describing it is @samp{Node
+about FOO}. The rest of the line is just for the reader's
+Information. [[ But this line is not a real menu item, simply because
+there is no line above it which starts with @w{@samp{* Menu:}}. Also,
+in a real menu item, the @samp{*} would appear at the very start of
+the line. This is why the ``normally hidden'' text in Emacs, namely
+@samp{: Node about FOO.}, is actually visible in this example, even
+when Visible mode is off.]]
+
+ When you use a menu to go to another node (in a way that will be
+described soon), what you specify is the subtopic name, the first
+thing in the menu line. Info uses it to find the menu line, extracts
+the node name from it, and goes to that node. The reason that there
+is both a subtopic name and a node name is that the node name must be
+meaningful to the computer and may therefore have to be ugly looking.
+The subtopic name can be chosen just to be convenient for the user to
+specify. Often the node name is convenient for the user to specify
+and so both it and the subtopic name are the same. There is an
+abbreviation for this:
+
+@example
+* Foo:: This tells about FOO.
+@end example
+
+@noindent
+This means that the subtopic name and node name are the same; they are
+both @samp{Foo}. (The @samp{::} is normally hidden in Emacs.)
+
+@format
+>> Now use @key{SPC} to find the menu in this node, then come back to
+ the front with a @kbd{b} and some @key{SPC}s. As you see, a menu is
+ actually visible in its node. If you cannot find a menu in a node
+ by looking at it, then the node does not have a menu and the
+ @kbd{m} command is not available.
+@end format
+
+If you keep typing @key{SPC} once the menu appears on the screen, it
+will move to another node (the first one in the menu). If that
+happens, type @key{BACKSPACE} to come back.
+
+@kindex m @r{(Info mode)}
+ The command to go to one of the subnodes is @kbd{m}. This is very
+different from the commands you have used: it is a command that
+prompts you for more input.
+
+ The Info commands you know do not need additional input; when you
+type one of them, Info processes it instantly and then is ready for
+another command. The @kbd{m} command is different: it needs to know
+the @dfn{name of the subtopic}. Once you have typed @kbd{m}, Info
+tries to read the subtopic name.
+
+ Now, in the stand-alone Info, look for the line containing many
+dashes near the bottom of the screen. (This is the stand-alone
+equivalent for the mode line in Emacs.) There is one more line
+beneath that one, but usually it is blank. (In Emacs, this is the
+echo area.) When it is blank, Info is ready for a command, such as
+@kbd{n} or @kbd{b} or @key{SPC} or @kbd{m}. If that line contains
+text ending in a colon, it means Info is reading more input for the
+last command. You can't type an Info command then, because Info is
+trying to read input, not commands. You must either give the input
+and finish the command you started, or type @kbd{Control-g} to cancel
+the command. When you have done one of those things, the input entry
+line becomes blank again. Then you can type Info commands again.
+
+@findex Info-menu
+ The command to go to a subnode via a menu is @kbd{m}. After you type
+the @kbd{m}, the line at the bottom of the screen says @samp{Menu item: }.
+You must then type the name of the subtopic you want, and end it with
+a @key{RET}. In Emacs, @kbd{m} runs the command @code{Info-menu}.
+
+@cindex abbreviating Info subnodes
+ You can abbreviate the subtopic name. If the abbreviation is not
+unique, the first matching subtopic is chosen. Some menus put
+the shortest possible abbreviation for each subtopic name in capital
+letters, so you can see how much you need to type. It does not
+matter whether you use upper case or lower case when you type the
+subtopic. You should not put any spaces at the end, or inside of the
+item name, except for one space where a space appears in the item in
+the menu.
+
+@cindex completion of Info node names
+ You can also use the @dfn{completion} feature to help enter the
+subtopic name. If you type the @key{TAB} key after entering part of a
+name, it will fill in more of the name---as much as Info can deduce
+from the part you have entered.
+
+ If you move the cursor to one of the menu subtopic lines, then you do
+not need to type the argument: you just type a @key{RET}, and it
+stands for the subtopic of the line you are on. You can also click
+the middle mouse button directly on the subtopic line to go there.
+
+Here is a menu to give you a chance to practice. This menu gives you
+three ways of going to one place, Help-FOO:
+
+@menu
+* Foo: Help-FOO. A node you can visit for fun.
+* Bar: Help-FOO. We have made two ways to get to the same place.
+* Help-FOO:: And yet another!
+@end menu
+
+(Turn Visible mode on if you are using Emacs.)
+
+@format
+>> Now type just an @kbd{m} and see what happens:
+@end format
+
+ Now you are ``inside'' an @kbd{m} command. Commands cannot be used
+now; the next thing you will type must be the name of a subtopic.
+
+ You can change your mind about doing the @kbd{m} by typing
+@kbd{Control-g}.
+
+@format
+>> Try that now; notice the bottom line clear.
+@end format
+
+@format
+>> Then type another @kbd{m}.
+@end format
+
+@format
+>> Now type @kbd{BAR}, the item name. Do not type @key{RET} yet.
+@end format
+
+ While you are typing the item name, you can use the @key{DEL} (or
+@key{BACKSPACE}) key to cancel one character at a time if you make a
+mistake.
+
+@format
+>> Press @key{DEL} to cancel the @samp{R}. You could type another @kbd{R}
+ to replace it. But you do not have to, since @samp{BA} is a valid
+ abbreviation.
+@end format
+
+@format
+>> Now you are ready to go. Type a @key{RET}.
+@end format
+
+ After visiting @samp{Help-FOO}, you should return here.
+
+ Another way to move to the menu subtopic lines and between them is
+to type @key{TAB}. Each time you type a @key{TAB}, you move to the
+next subtopic line. To move to a previous subtopic line, type
+@kbd{M-@key{TAB}}---that is, press and hold the @key{META} key and then
+press @key{TAB}. (On some keyboards, the @key{META} key might be labeled
+@samp{Alt}.)
+
+ Once you move cursor to a subtopic line, press @key{RET} to go to
+that subtopic's node.
+
+@cindex mouse support in Info mode
+@kindex Mouse-2 @r{(Info mode)}
+ If your terminal supports a mouse, you have yet another way of going
+to a subtopic. Move your mouse pointer to the subtopic line,
+somewhere between the beginning @samp{*} and the colon @samp{:} which
+ends the subtopic's brief name. You will see the subtopic's name
+change its appearance (usually, its background color will change), and
+the shape of the mouse pointer will change if your platform supports
+that. After a while, if you leave the mouse on that spot, a small
+window will pop up, saying ``Mouse-2: go to that node'', or the same
+message may appear at the bottom of the screen.
+
+ @kbd{Mouse-2} is the second button of your mouse counting from the
+left---the middle button on a 3-button mouse. (On a 2-button mouse,
+you may have to press both buttons together to ``press the middle
+button''.) The message tells you pressing @kbd{Mouse-2} with the
+current position of the mouse pointer (on subtopic in the menu) will
+go to that subtopic.
+
+@findex Info-mouse-follow-nearest-node
+ More generally, @kbd{Mouse-2} in an Info buffer finds the nearest
+link to another node and goes there. For example, near a cross
+reference it acts like @kbd{f}, in a menu it acts like @kbd{m}, on the
+node's header line it acts like @kbd{n}, @kbd{p}, or @kbd{u}, etc. At
+end of the node's text @kbd{Mouse-2} moves to the next node, or up if
+there's no next node.
+
+@format
+>> Type @kbd{n} to see more commands.
+@end format
+
+@node Help-FOO, , , Help-M
+@subsection The @kbd{u} command
+
+ Congratulations! This is the node @samp{Help-FOO}. It has an @samp{Up}
+pointer @samp{Help-M}, the node you just came from via the @kbd{m}
+command. This is the usual convention---the nodes you reach from a menu
+have @samp{Up} nodes that lead back to the menu. Menus move Down in the
+tree, and @samp{Up} moves Up. @samp{Previous}, on the other hand, is
+usually used to ``stay on the same level but go backwards''.
+
+@kindex u @r{(Info mode)}
+@findex Info-up
+ You can go back to the node @samp{Help-M} by typing the command
+@kbd{u} for ``Up'' (the Emacs command run by @kbd{u} is
+@code{Info-up}). That puts you at the @emph{front} of the node---to
+get back to where you were reading you have to type some @key{SPC}s.
+(Some Info readers, such as the one built into Emacs, put you at the
+same place where you were reading in @samp{Help-M}.)
+
+ Another way to go Up is to click @kbd{Mouse-2} on the @samp{Up}
+pointer shown in the header line (provided that you have a mouse).
+
+@format
+>> Now type @kbd{u} to move back up to @samp{Help-M}.
+@end format
+
+@node Help-Xref, Help-Int, Help-M, Getting Started
+@comment node-name, next, previous, up
+@section Following Cross-References
+
+@cindex cross references in Info documents
+ In Info documentation, you will see many @dfn{cross references}.
+Cross references look like this: @xref{Help-Cross, Cross}. That text
+is a real, live cross reference, whose name is @samp{Cross} and which
+points to the node named @samp{Help-Cross}. (The node name is hidden
+in Emacs. Do @kbd{M-x visible-mode} to show or hide it.)
+
+@kindex f @r{(Info mode)}
+@findex Info-follow-reference
+ There are two ways to follow a cross reference. You can move the
+cursor to it and press @key{RET}, just as in a menu. @key{RET}
+follows the cross reference that the cursor is on. Or you can type
+@kbd{f} and then specify the name of the cross reference (in this
+case, @samp{Cross}) as an argument. In Emacs Info, @kbd{f} runs
+@code{Info-follow-reference},
+
+ In the @kbd{f} command, you select the cross reference with its
+name, so it does not matter where the cursor was. If the cursor is on
+or near a cross reference, @kbd{f} suggests that reference name in
+parentheses as the default; typing @key{RET} will follow that
+reference. However, if you type a different reference name, @kbd{f}
+will follow the other reference which has that name.
+
+@format
+>> Type @kbd{f}, followed by @kbd{Cross}, and then @key{RET}.
+@end format
+
+ As you enter the reference name, you can use the @key{DEL} (or
+@key{BACKSPACE}) key to edit your input. If you change your mind
+about following any reference, you can use @kbd{Control-g} to cancel
+the command. Completion is available in the @kbd{f} command; you can
+complete among all the cross reference names in the current node by
+typing a @key{TAB}.
+
+ To get a list of all the cross references in the current node, you
+can type @kbd{?} after an @kbd{f}. The @kbd{f} continues to await a
+cross reference name even after displaying the list, so if you don't
+actually want to follow a reference, you should type a @kbd{Control-g}
+to cancel the @kbd{f}.
+
+@format
+>> Type @kbd{f?} to get a list of the cross references in this node. Then
+ type a @kbd{Control-g} and see how the @samp{f} gives up.
+@end format
+
+ The @key{TAB} and @kbd{M-@key{TAB}} key, which move between menu
+items in a menu, also move between cross references outside of menus.
+
+ Sometimes a cross reference (or a node) can lead to another file (in
+other words another ``manual''), or, on occasion, even a file on a
+remote machine (although Info files distributed with Emacs or the
+stand-alone Info avoid using remote links). Such a cross reference
+looks like this: @xref{Top,, Overview of Texinfo, texinfo, Texinfo:
+The GNU Documentation Format}. (After following this link, type
+@kbd{l} to get back to this node.) Here the name @samp{texinfo}
+between parentheses (shown in the stand-alone version) refers to the
+file name. This file name appears in cross references and node names
+if it differs from the current file. In Emacs, the file name is
+hidden (along with other text). (Use @kbd{M-x visible-mode} to show
+or hide it.)
+
+ The remainder of this node applies only to the Emacs version. If
+you use the stand-alone version, you can type @kbd{n} immediately.
+
+ To some users, switching manuals is a much bigger switch than
+switching sections. These users like to know that they are going to
+be switching to another manual (and which one) before actually doing
+so, especially given that, if one does not notice, Info commands like
+@kbd{t} (see the next node) can have confusing results.
+
+ If you put your mouse over the cross reference and if the cross
+reference leads to a different manual, then the information appearing
+in a separate box (tool tip) or in the echo area, will mention the
+file the cross reference will carry you to (between parentheses).
+This is also true for menu subtopic names. If you have a mouse, just
+leave it over the @samp{Overview} cross reference above and watch what
+happens.
+
+ If you always like to have that information available without having
+to move your mouse over the cross reference, set
+@code{Info-hide-note-references} to a value other than t (@pxref{Emacs
+Info Variables}). You might also want to do that if you have a lot of
+cross references to files on remote machines and have non-permanent or
+slow access, since otherwise you might not be able to distinguish
+between local and remote links.
+
+@format
+>> Now type @kbd{n} to learn more commands.
+@end format
+
+@node Help-Int, Help-Q, Help-Xref, Getting Started
+@comment node-name, next, previous, up
+@section Some intermediate Info commands
+
+ The introductory course is almost over; please continue
+a little longer to learn some intermediate-level commands.
+
+ Most Info files have an index, which is actually a large node
+containing little but a menu. The menu has one menu item for each
+topic listed in the index. (As a special feature, menus for indices
+may also include the line number within the node of the index entry.
+This allows Info readers to go to the exact line of an entry, not just
+the start of the containing node.)
+
+ You can get to the index from the main menu of the file with the
+@kbd{m} command; then you can use the @kbd{m} command again in the
+index node to go to the node that describes the topic you want.
+
+ There is also a short-cut Info command, @kbd{i}, which does all of
+that for you. It searches the index for a given topic (a string) and
+goes to the node which is listed in the index for that topic.
+@xref{Info Search}, for a full explanation.
+
+@kindex l @r{(Info mode)}
+@findex Info-last
+@cindex going back in Info mode
+ If you have been moving around to different nodes and wish to
+retrace your steps, the @kbd{l} command (@kbd{l} for @dfn{last}) will
+do that, one node-step at a time. As you move from node to node, Info
+records the nodes where you have been in a special history list. The
+@kbd{l} command revisits nodes in the history list; each successive
+@kbd{l} command moves one step back through the history.
+
+ In Emacs, @kbd{l} runs the command @code{Info-last}.
+
+@format
+>> Try typing @kbd{p p n} and then three @kbd{l}'s, pausing in between
+to see what each @kbd{l} does. You should wind up right back here.
+@end format
+
+ Note the difference between @kbd{l} and @kbd{p}: @kbd{l} moves to
+where @emph{you} last were, whereas @kbd{p} always moves to the node
+which the header says is the @samp{Previous} node (from this node, the
+@samp{Prev} link leads to @samp{Help-Xref}).
+
+@kindex d @r{(Info mode)}
+@findex Info-directory
+@cindex go to Directory node
+ The @kbd{d} command (@code{Info-directory} in Emacs) gets you
+instantly to the Directory node. This node, which is the first one
+you saw when you entered Info, has a menu which leads (directly or
+indirectly, through other menus), to all the nodes that exist. The
+Directory node lists all the manuals and other Info documents that
+are, or could be, installed on your system.
+
+@format
+>> Try doing a @kbd{d}, then do an @kbd{l} to return here (yes,
+ @emph{do} return).
+@end format
+
+@kindex t @r{(Info mode)}
+@findex Info-top-node
+@cindex go to Top node
+ The @kbd{t} command moves to the @samp{Top} node of the manual.
+This is useful if you want to browse the manual's main menu, or select
+some specific top-level menu item. The Emacs command run by @kbd{t}
+is @code{Info-top-node}.
+
+ Clicking @kbd{Mouse-2} on or near a cross reference also follows the
+reference. You can see that the cross reference is mouse-sensitive by
+moving the mouse pointer to the reference and watching how the
+underlying text and the mouse pointer change in response.
+
+@format
+>> Now type @kbd{n} to see the last node of the course.
+@end format
+
+ @xref{Expert Info}, for more advanced Info features.
+
+@c If a menu appears at the end of this node, remove it.
+@c It is an accident of the menu updating command.
+
+@node Expert Info
+@chapter Info for Experts
+
+ This chapter describes various Info commands for experts. (If you
+are using a stand-alone Info reader, there are additional commands
+specific to it, which are documented in several chapters of @ref{Top,,
+GNU Info, info-stnd, GNU Info}.)
+
+ This chapter also explains how to write an Info as distinct from a
+Texinfo file. (However, in most cases, writing a Texinfo file is
+better, since you can use it to make a printed manual or produce other
+formats, such as HTML and DocBook, as well as for generating Info
+files.) @xref{Top,, Overview of Texinfo, texinfo, Texinfo: The GNU
+Documentation Format}.
+
+@menu
+* Advanced:: Advanced Info commands: g, e, and 1 - 9.
+* Info Search:: How to search Info documents for specific subjects.
+* Add:: Describes how to add new nodes to the hierarchy.
+ Also tells what nodes look like.
+* Menus:: How to add to or create menus in Info nodes.
+* Cross-refs:: How to add cross-references to Info nodes.
+* Tags:: How to make tags tables for Info files.
+* Checking:: Checking an Info File
+* Emacs Info Variables:: Variables modifying the behavior of Emacs Info.
+@end menu
+
+@node Advanced, Info Search, , Expert Info
+@comment node-name, next, previous, up
+@section Advanced Info Commands
+
+Here are some more Info commands that make it easier to move around.
+
+@subheading @kbd{g} goes to a node by name
+
+@kindex g @r{(Info mode)}
+@findex Info-goto-node
+@cindex go to a node by name
+ If you know a node's name, you can go there by typing @kbd{g}, the
+name, and @key{RET}. Thus, @kbd{gTop@key{RET}} would go to the node
+called @samp{Top} in this file. (This is equivalent to @kbd{t}, see
+@ref{Help-Int}.) @kbd{gAdvanced@key{RET}} would come back here.
+@kbd{g} in Emacs runs the command @code{Info-goto-node}.
+
+ Unlike @kbd{m}, @kbd{g} does not allow the use of abbreviations.
+But it does allow completion, so you can type @key{TAB} to complete a
+partial node name.
+
+@cindex go to another Info file
+ To go to a node in another file, you can include the file name in the
+node name by putting it at the front, in parentheses. Thus,
+@kbd{g(dir)Top@key{RET}} would go to the Info Directory node, which is
+the node @samp{Top} in the Info file @file{dir}. Likewise,
+@kbd{g(emacs)Top@key{RET}} goes to the top node of the Emacs manual.
+
+ The node name @samp{*} specifies the whole file. So you can look at
+all of the current file by typing @kbd{g*@key{RET}} or all of any
+other file with @kbd{g(@var{filename})@key{RET}}.
+
+@subheading @kbd{1}--@kbd{9} choose a menu subtopic by its number
+
+@kindex 1 @r{through} 9 @r{(Info mode)}
+@findex Info-nth-menu-item
+@cindex select @var{n}'th menu item
+ If you begrudge each character of type-in which your system requires,
+you might like to use the commands @kbd{1}, @kbd{2}, @kbd{3}, @kbd{4},
+@dots{}, @kbd{9}. They are short for the @kbd{m} command together
+with a name of a menu subtopic. @kbd{1} goes through the first item
+in the current node's menu; @kbd{2} goes through the second item, etc.
+In the stand-alone reader, @kbd{0} goes through the last menu item;
+this is so you need not count how many entries are there. In Emacs,
+the digit keys run the command @code{Info-nth-menu-item}.
+
+ If your display supports multiple fonts, colors or underlining, and
+you are using Emacs' Info mode to read Info files, the third, sixth
+and ninth menu items have a @samp{*} that stands out, either in color
+or in some other attribute, such as underline; this makes it easy to
+see at a glance which number to use for an item.
+
+ Some terminals don't support either multiple fonts, colors or
+underlining. If you need to actually count items, it is better to use
+@kbd{m} instead, and specify the name, or use @key{TAB} to quickly
+move between menu items.
+
+@subheading @kbd{e} makes Info document editable
+
+@kindex e @r{(Info mode)}
+@findex Info-edit
+@cindex edit Info document
+ The Info command @kbd{e} changes from Info mode to an ordinary
+Emacs editing mode, so that you can edit the text of the current node.
+Type @kbd{C-c C-c} to switch back to Info. The @kbd{e} command is allowed
+only if the variable @code{Info-enable-edit} is non-@code{nil}.
+
+ The @kbd{e} command only works in Emacs, where it runs the command
+@code{Info-edit}. The stand-alone Info reader doesn't allow you to
+edit the Info file, so typing @kbd{e} there goes to the end of the
+current node.
+
+@subheading @kbd{M-n} creates a new independent Info buffer in Emacs
+
+@kindex M-n @r{(Info mode)}
+@findex clone-buffer
+@cindex multiple Info buffers
+ If you are reading Info in Emacs, you can select a new independent
+Info buffer in another window by typing @kbd{M-n}. The new buffer
+starts out as an exact copy of the old one, but you will be able to
+move independently between nodes in the two buffers. (In Info mode,
+@kbd{M-n} runs the Emacs command @code{clone-buffer}.)
+
+ In Emacs Info, you can also produce new Info buffers by giving a
+numeric prefix argument to the @kbd{m} and @kbd{g} commands. @kbd{C-u
+m} and @kbd{C-u g} go to a new node in exactly the same way that
+@kbd{m} and @kbd{g} do, but they do so in a new Info buffer which they
+select in another window.
+
+@node Info Search, Add, Advanced, Expert Info
+@comment node-name, next, previous, up
+@section How to search Info documents for specific subjects
+
+@cindex searching Info documents
+@cindex Info document as a reference
+ The commands which move between and inside nodes allow you to read
+the entire manual or its large portions. But what if you need to find
+some information in the manual as fast as you can, and you don't know
+or don't remember in what node to look for it? This need arises when
+you use a manual as a @dfn{reference}, or when it is impractical to
+read the entire manual before you start using the programs it
+describes.
+
+ Info has powerful searching facilities that let you find things
+quickly. You can search either the manual indices or its text.
+
+@kindex i @r{(Info mode)}
+@findex Info-index
+ Since most subjects related to what the manual describes should be
+indexed, you should try the index search first. The @kbd{i} command
+prompts you for a subject and then looks up that subject in the
+indices. If it finds an index entry with the subject you typed, it
+goes to the node to which that index entry points. You should browse
+through that node to see whether the issue you are looking for is
+described there. If it isn't, type @kbd{,} one or more times to go
+through additional index entries which match your subject.
+
+ The @kbd{i} command finds all index entries which include the string
+you typed @emph{as a substring}. For each match, Info shows in the
+echo area the full index entry it found. Often, the text of the full
+index entry already gives you enough information to decide whether it
+is relevant to what you are looking for, so we recommend that you read
+what Info shows in the echo area before looking at the node it
+displays.
+
+ Since @kbd{i} looks for a substring, you can search for subjects even
+if you are not sure how they are spelled in the index. For example,
+suppose you want to find something that is pertinent to commands which
+complete partial input (e.g., when you type @key{TAB}). If you want
+to catch index entries that refer to ``complete'', ``completion'', and
+``completing'', you could type @kbd{icomplet@key{RET}}.
+
+ Info documents which describe programs should index the commands,
+options, and key sequences that the program provides. If you are
+looking for a description of a command, an option, or a key, just type
+their names when @kbd{i} prompts you for a topic. For example, if you
+want to read the description of what the @kbd{C-f} key does, type
+@kbd{i C - f @key{RET}}. Here @kbd{C-f} are 3 literal characters
+@samp{C}, @samp{-}, and @samp{f}, not the ``Control-f'' command key
+you type inside Emacs to run the command bound to @kbd{C-f}.
+
+ In Emacs, @kbd{i} runs the command @code{Info-index}.
+
+@findex info-apropos
+If you don't know what manual documents something, try the @kbd{M-x
+info-apropos} command. It prompts for a string and then looks up that
+string in all the indices of all the Info documents installed on your
+system.
+
+@kindex s @r{(Info mode)}
+@findex Info-search
+ The @kbd{s} command allows you to search a whole file for a string.
+It switches to the next node if and when that is necessary. You
+type @kbd{s} followed by the string to search for, terminated by
+@key{RET}. To search for the same string again, just @kbd{s} followed
+by @key{RET} will do. The file's nodes are scanned in the order
+they are in in the file, which has no necessary relationship to the
+order that they may be in the tree structure of menus and @samp{next}
+pointers. But normally the two orders are not very different. In any
+case, you can always do a @kbd{b} to find out what node you have
+reached, if the header is not visible (this can happen, because @kbd{s}
+puts your cursor at the occurrence of the string, not at the beginning
+of the node).
+
+@kindex M-s @r{(Info mode)}
+ In Emacs, @kbd{Meta-s} is equivalent to @kbd{s}. That is for
+compatibility with other GNU packages that use @kbd{M-s} for a similar
+kind of search command. Both @kbd{s} and @kbd{M-s} run in Emacs the
+command @code{Info-search}.
+
+
+@node Add, Menus, Info Search, Expert Info
+@comment node-name, next, previous, up
+@section Adding a new node to Info
+
+To add a new topic to the list in the Info directory, you must:
+
+@enumerate
+@item
+Create some nodes, in some file, to document that topic.
+@item
+Put that topic in the menu in the directory. @xref{Menus, Menu}.
+@end enumerate
+
+ Usually, the way to create the nodes is with Texinfo (@pxref{Top,,
+Overview of Texinfo, texinfo, Texinfo: The GNU Documentation Format});
+this has the advantage that you can also make a printed manual or HTML
+from them. You would use the @samp{@@dircategory} and
+@samp{@@direntry} commands to put the manual into the Info directory.
+However, if you want to edit an Info file manually and install it
+manually, here is how.
+
+@cindex node delimiters
+ The new node can live in an existing documentation file, or in a new
+one. It must have a @samp{^_} character before it (invisible to the
+user; this node has one but you cannot see it), and it ends with either
+a @samp{^_}, a @samp{^L} (``formfeed''), or the end of file.@footnote{If
+you put in a @samp{^L} to end a new node, be sure that there is a
+@samp{^_} after it to start the next one, since @samp{^L} cannot
+@emph{start} a node. Also, a nicer way to make a node boundary be a
+page boundary as well is to put a @samp{^L} @emph{right after} the
+@samp{^_}.}
+
+ The @samp{^_} starting a node must be followed by a newline or a
+@samp{^L} newline, after which comes the node's header line. The
+header line must give the node's name (by which Info finds it), and
+state the names of the @samp{Next}, @samp{Previous}, and @samp{Up}
+nodes (if there are any). As you can see, this node's @samp{Up} node
+is the node @samp{Expert Info}. The @samp{Next} node is @samp{Menus}.
+
+@cindex node header line format
+@cindex format of node headers
+ The keywords @dfn{Node}, @dfn{Next}, @dfn{Previous}, and @dfn{Up}
+may appear in any order, anywhere in the header line, but the
+recommended order is the one in this sentence. Each keyword must be
+followed by a colon, spaces and tabs, and then the appropriate name.
+The name may be terminated with a tab, a comma, or a newline. A space
+does not end it; node names may contain spaces. The case of letters
+in the names is insignificant.
+
+@cindex node name format
+@cindex Directory node
+ A node name has two forms. A node in the current file is named by
+what appears after the @samp{Node: } in that node's first line. For
+example, this node's name is @samp{Add}. A node in another file is
+named by @samp{(@var{filename})@var{node-within-file}}, as in
+@samp{(info)Add} for this node. If the file name starts with ``./'',
+then it is relative to the current directory; otherwise, it is
+relative starting from the standard directory for Info files of your
+site. The name @samp{(@var{filename})Top} can be abbreviated to just
+@samp{(@var{filename})}. By convention, the name @samp{Top} is used
+for the ``highest'' node in any single file---the node whose @samp{Up}
+points out of the file. The @samp{Directory} node is @file{(dir)}, it
+points to a file @file{dir} which holds a large menu listing all the
+Info documents installed on your site. The @samp{Top} node of a
+document file listed in the @samp{Directory} should have an @samp{Up:
+(dir)} in it.
+
+@cindex unstructured documents
+ The node name @kbd{*} is special: it refers to the entire file.
+Thus, @kbd{g*} shows you the whole current file. The use of the
+node @kbd{*} is to make it possible to make old-fashioned,
+unstructured files into nodes of the tree.
+
+ The @samp{Node:} name, in which a node states its own name, must not
+contain a file name, since when Info searches for a node, it does not
+expect a file name to be there. The @samp{Next}, @samp{Previous} and
+@samp{Up} names may contain them. In this node, since the @samp{Up}
+node is in the same file, it was not necessary to use one.
+
+ Note that the nodes in this file have a file name in the header
+line. The file names are ignored by Info, but they serve as comments
+to help identify the node for the user.
+
+@node Menus, Cross-refs, Add, Expert Info
+@comment node-name, next, previous, up
+@section How to Create Menus
+
+ Any node in the Info hierarchy may have a @dfn{menu}---a list of subnodes.
+The @kbd{m} command searches the current node's menu for the topic which it
+reads from the terminal.
+
+@cindex menu and menu entry format
+ A menu begins with a line starting with @w{@samp{* Menu:}}. The
+rest of the line is a comment. After the starting line, every line
+that begins with a @samp{* } lists a single topic. The name of the
+topic---what the user must type at the @kbd{m}'s command prompt to
+select this topic---comes right after the star and space, and is
+followed by a colon, spaces and tabs, and the name of the node which
+discusses that topic. The node name, like node names following
+@samp{Next}, @samp{Previous} and @samp{Up}, may be terminated with a
+tab, comma, or newline; it may also be terminated with a period.
+
+ If the node name and topic name are the same, then rather than
+giving the name twice, the abbreviation @samp{* @var{name}::} may be
+used (and should be used, whenever possible, as it reduces the visual
+clutter in the menu).
+
+ It is considerate to choose the topic names so that they differ
+from each other very near the beginning---this allows the user to type
+short abbreviations. In a long menu, it is a good idea to capitalize
+the beginning of each item name which is the minimum acceptable
+abbreviation for it (a long menu is more than 5 or so entries).
+
+ The nodes listed in a node's menu are called its ``subnodes'', and it
+is their ``superior''. They should each have an @samp{Up:} pointing at
+the superior. It is often useful to arrange all or most of the subnodes
+in a sequence of @samp{Next} and @samp{Previous} pointers so that
+someone who wants to see them all need not keep revisiting the Menu.
+
+ The Info Directory is simply the menu of the node @samp{(dir)Top}---that
+is, node @samp{Top} in file @file{.../info/dir}. You can put new entries
+in that menu just like any other menu. The Info Directory is @emph{not} the
+same as the file directory called @file{info}. It happens that many of
+Info's files live in that file directory, but they do not have to; and
+files in that directory are not automatically listed in the Info
+Directory node.
+
+ Also, although the Info node graph is claimed to be a ``hierarchy'',
+in fact it can be @emph{any} directed graph. Shared structures and
+pointer cycles are perfectly possible, and can be used if they are
+appropriate to the meaning to be expressed. There is no need for all
+the nodes in a file to form a connected structure. In fact, this file
+has two connected components. You are in one of them, which is under
+the node @samp{Top}; the other contains the node @samp{Help} which the
+@kbd{h} command goes to. In fact, since there is no garbage
+collector, nothing terrible happens if a substructure is not pointed
+to, but such a substructure is rather useless since nobody can
+ever find out that it exists.
+
+@node Cross-refs, Tags, Menus, Expert Info
+@comment node-name, next, previous, up
+@section Creating Cross References
+
+@cindex cross reference format
+ A cross reference can be placed anywhere in the text, unlike a menu
+item which must go at the front of a line. A cross reference looks
+like a menu item except that it has @samp{*note} instead of @samp{*}.
+It @emph{cannot} be terminated by a @samp{)}, because @samp{)}'s are
+so often part of node names. If you wish to enclose a cross reference
+in parentheses, terminate it with a period first. Here are two
+examples of cross references pointers:
+
+@example
+*Note details: commands. (See *note 3: Full Proof.)
+@end example
+
+@noindent
+@emph{These are just examples.} The places they ``lead to'' do not
+really exist!
+
+@menu
+* Help-Cross:: Target of a cross-reference.
+@end menu
+
+
+@node Help-Cross, , , Cross-refs
+@subsection The node reached by the cross reference in Info
+
+ This is the node reached by the cross reference named @samp{Cross}.
+
+ While this node is specifically intended to be reached by a cross
+reference, most cross references lead to nodes that ``belong''
+someplace else far away in the structure of an Info document. So you
+cannot expect this node to have a @samp{Next}, @samp{Previous} or
+@samp{Up} links pointing back to where you came from. In general, the
+@kbd{l} (el) command is the only way to get back there.
+
+@format
+>> Type @kbd{l} to return to the node where the cross reference was.
+@end format
+
+@node Help-Q, , Help-Int, Getting Started
+@comment node-name, next, previous, up
+@section Quitting Info
+
+@kindex q @r{(Info mode)}
+@findex Info-exit
+@cindex quitting Info mode
+ To get out of Info, back to what you were doing before, type @kbd{q}
+for @dfn{Quit}. This runs @code{Info-exit} in Emacs.
+
+ This is the end of the basic course on using Info. You have learned
+how to move in an Info document, and how to follow menus and cross
+references. This makes you ready for reading manuals top to bottom,
+as new users should do when they learn a new package.
+
+ Another set of Info commands is useful when you need to find
+something quickly in a manual---that is, when you need to use a manual
+as a reference rather than as a tutorial. We urge you to learn
+these search commands as well. If you want to do that now, follow this
+cross reference to @ref{Info Search}.
+
+Yet another set of commands are meant for experienced users; you can
+find them by looking in the Directory node for documentation on Info.
+Finding them will be a good exercise in using Info in the usual
+manner.
+
+@format
+>> Type @kbd{d} to go to the Info directory node; then type
+ @kbd{mInfo} and Return, to get to the node about Info and
+ see what other help is available.
+@end format
+
+
+@node Tags, Checking, Cross-refs, Expert Info
+@comment node-name, next, previous, up
+@section Tags Tables for Info Files
+
+@cindex tags tables in info files
+ You can speed up the access to nodes of a large Info file by giving
+it a tags table. Unlike the tags table for a program, the tags table for
+an Info file lives inside the file itself and is used
+automatically whenever Info reads in the file.
+
+@findex Info-tagify
+ To make a tags table, go to a node in the file using Emacs Info mode and type
+@kbd{M-x Info-tagify}. Then you must use @kbd{C-x C-s} to save the
+file. Info files produced by the @code{makeinfo} command that is part
+of the Texinfo package always have tags tables to begin with.
+
+@cindex stale tags tables
+@cindex update Info tags table
+ Once the Info file has a tags table, you must make certain it is up
+to date. If you edit an Info file directly (as opposed to editing its
+Texinfo source), and, as a result of deletion of text, any node moves back
+more than a thousand characters in the file from the position
+recorded in the tags table, Info will no longer be able to find that
+node. To update the tags table, use the @code{Info-tagify} command
+again.
+
+ An Info file tags table appears at the end of the file and looks like
+this:
+
+@example
+^_^L
+Tag Table:
+File: info, Node: Cross-refs^?21419
+File: info, Node: Tags^?22145
+^_
+End Tag Table
+@end example
+
+@noindent
+Note that it contains one line per node, and this line contains
+the beginning of the node's header (ending just after the node name),
+a @samp{DEL} character, and the character position in the file of the
+beginning of the node.
+
+
+@node Checking, Emacs Info Variables, Tags, Expert Info
+@section Checking an Info File
+
+When creating an Info file, it is easy to forget the name of a node when
+you are making a pointer to it from another node. If you put in the
+wrong name for a node, this is not detected until someone tries to go
+through the pointer using Info. Verification of the Info file is an
+automatic process which checks all pointers to nodes and reports any
+pointers which are invalid. Every @samp{Next}, @samp{Previous}, and
+@samp{Up} is checked, as is every menu item and every cross reference. In
+addition, any @samp{Next} which does not have a @samp{Previous} pointing
+back is reported. Only pointers within the file are checked, because
+checking pointers to other files would be terribly slow. But those are
+usually few.
+
+@findex Info-validate
+To check an Info file, do @kbd{M-x Info-validate} while looking at any
+node of the file with Emacs Info mode.
+
+@node Emacs Info Variables, , Checking, Expert Info
+@section Emacs Info-mode Variables
+
+The following variables may modify the behavior of Info-mode in Emacs;
+you may wish to set one or several of these variables interactively, or
+in your @file{~/.emacs} init file. @xref{Examining, Examining and Setting
+Variables, Examining and Setting Variables, emacs, The GNU Emacs
+Manual}. The stand-alone Info reader program has its own set of
+variables, described in @ref{Variables,, Manipulating Variables,
+info-stnd, GNU Info}.
+
+@vtable @code
+@item Info-directory-list
+The list of directories to search for Info files. Each element is a
+string (directory name) or @code{nil} (try default directory). If not
+initialized Info uses the environment variable @env{INFOPATH} to
+initialize it, or @code{Info-default-directory-list} if there is no
+@env{INFOPATH} variable in the environment.
+
+If you wish to customize the Info directory search list for both Emacs
+info and stand-alone Info, it is best to set the @env{INFOPATH}
+environment variable, since that applies to both programs.
+
+@item Info-additional-directory-list
+A list of additional directories to search for Info documentation files.
+These directories are not searched for merging the @file{dir} file.
+
+@item Info-fontify
+When set to a non-@code{nil} value, enables highlighting of Info
+files. The default is @code{t}. You can change how the highlighting
+looks by customizing the faces @code{info-node}, @code{info-xref},
+@code{info-header-xref}, @code{info-header-node}, @code{info-menu-5},
+@code{info-menu-header}, and @code{info-title-@var{n}-face} (where
+@var{n} is the level of the section, a number between 1 and 4). To
+customize a face, type @kbd{M-x customize-face @key{RET} @var{face}
+@key{RET}}, where @var{face} is one of the face names listed here.
+
+@item Info-use-header-line
+If non-@code{nil}, Emacs puts in the Info buffer a header line showing
+the @samp{Next}, @samp{Prev}, and @samp{Up} links. A header line does
+not scroll with the rest of the buffer, making these links always
+visible.
+
+@item Info-hide-note-references
+As explained in earlier nodes, the Emacs version of Info normally
+hides some text in menus and cross-references. You can completely
+disable this feature, by setting this option to @code{nil}. Setting
+it to a value that is neither @code{nil} nor @code{t} produces an
+intermediate behavior, hiding a limited amount of text, but showing
+all text that could potentially be useful.
+
+@item Info-scroll-prefer-subnodes
+If set to a non-@code{nil} value, @key{SPC} and @key{BACKSPACE} (or
+@key{DEL}) keys in a menu visit subnodes of the current node before
+scrolling to its end or beginning, respectively. For example, if the
+node's menu appears on the screen, the next @key{SPC} moves to a
+subnode indicated by the following menu item. Setting this option to
+@code{nil} results in behavior similar to the stand-alone Info reader
+program, which visits the first subnode from the menu only when you
+hit the end of the current node. The default is @code{nil}.
+
+@item Info-enable-active-nodes
+When set to a non-@code{nil} value, allows Info to execute Lisp code
+associated with nodes. The Lisp code is executed when the node is
+selected. The Lisp code to be executed should follow the node
+delimiter (the @samp{DEL} character) and an @samp{execute: } tag, like
+this:
+
+@example
+^_execute: (message "This is an active node!")
+@end example
+
+@item Info-enable-edit
+Set to @code{nil}, disables the @samp{e} (@code{Info-edit}) command. A
+non-@code{nil} value enables it. @xref{Add, Edit}.
+@end vtable
+
+
+@node Creating an Info File
+@chapter Creating an Info File from a Texinfo File
+
+@code{makeinfo} is a utility that converts a Texinfo file into an Info
+file; @code{texinfo-format-region} and @code{texinfo-format-buffer} are
+GNU Emacs functions that do the same.
+
+@xref{Top,, Overview of Texinfo, texinfo, Texinfo: The GNU
+Documentation Format}, to learn how to write a Texinfo file.
+
+@xref{Creating an Info File,,, texinfo, Texinfo: The GNU Documentation
+Format}, to learn how to create an Info file from a Texinfo file.
+
+@xref{Installing an Info File,,, texinfo, Texinfo: The GNU
+Documentation Format}, to learn how to install an Info file after you
+have created one.
+
+@node Index
+@unnumbered Index
+
+This is an alphabetical listing of all the commands, variables, and
+topics discussed in this document.
+
+@printindex cp
+
+@bye
+
+@ignore
+ arch-tag: 965c1638-01d6-4156-9227-b10418b9d8e8
+@end ignore
diff --git a/Build/source/utils/texinfo/doc/infokey.1 b/Build/source/utils/texinfo/doc/infokey.1
new file mode 100644
index 00000000000..fb8f4634f40
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/infokey.1
@@ -0,0 +1,41 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.34.
+.TH INFOKEY "1" "December 2004" "infokey 4.8" "User Commands"
+.SH NAME
+infokey \- compile customizations for Info
+.SH SYNOPSIS
+.B infokey
+[\fIOPTION\fR]... [\fIINPUT-FILE\fR]
+.SH DESCRIPTION
+Compile infokey source file to infokey file. Reads INPUT\-FILE (default
+$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.
+.SH OPTIONS
+.TP
+\fB\-\-output\fR FILE
+output to FILE instead of $HOME/.info
+.TP
+\fB\-\-help\fR
+display this help and exit.
+.TP
+\fB\-\-version\fR
+display version information and exit.
+.SH "REPORTING BUGS"
+Email bug reports to bug\-texinfo@gnu.org,
+general questions and discussion to help\-texinfo@gnu.org.
+Texinfo home page: http://www.gnu.org/software/texinfo/
+.SH COPYRIGHT
+Copyright \(co 2003 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
+.SH "SEE ALSO"
+The full documentation for
+.B infokey
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B infokey
+programs are properly installed at your site, the command
+.IP
+.B info infokey
+.PP
+should give you access to the complete manual.
diff --git a/Build/source/utils/texinfo/doc/install-info.1 b/Build/source/utils/texinfo/doc/install-info.1
new file mode 100644
index 00000000000..004d5d0f97d
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/install-info.1
@@ -0,0 +1,78 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.34.
+.TH INSTALL-INFO "1" "December 2004" "install-info 4.8" "User Commands"
+.SH NAME
+install-info \- update info/dir entries
+.SH SYNOPSIS
+.B install-info
+[\fIOPTION\fR]... [\fIINFO-FILE \fR[\fIDIR-FILE\fR]]
+.SH DESCRIPTION
+Install or delete dir entries from INFO\-FILE in the Info directory file
+DIR\-FILE.
+.SH OPTIONS
+.TP
+\fB\-\-delete\fR
+delete existing entries for INFO\-FILE from DIR\-FILE;
+don't insert any new entries.
+.TP
+\fB\-\-dir\-file\fR=\fINAME\fR
+specify file name of Info directory file.
+This is equivalent to using the DIR\-FILE argument.
+.TP
+\fB\-\-entry\fR=\fITEXT\fR
+insert TEXT as an Info directory entry.
+TEXT should have the form of an Info menu item line
+plus zero or more extra lines starting with whitespace.
+If you specify more than one entry, they are all added.
+If you don't specify any entries, they are determined
+from information in the Info file itself.
+.TP
+\fB\-\-help\fR
+display this help and exit.
+.TP
+\fB\-\-info\-file\fR=\fIFILE\fR
+specify Info file to install in the directory.
+This is equivalent to using the INFO\-FILE argument.
+.TP
+\fB\-\-info\-dir\fR=\fIDIR\fR
+same as \fB\-\-dir\-file\fR=\fIDIR\fR/dir.
+.TP
+\fB\-\-item\fR=\fITEXT\fR
+same as \fB\-\-entry\fR TEXT.
+An Info directory entry is actually a menu item.
+.TP
+\fB\-\-quiet\fR
+suppress warnings.
+.TP
+\fB\-\-remove\fR
+same as \fB\-\-delete\fR.
+.TP
+\fB\-\-section\fR=\fISEC\fR
+put this file's entries in section SEC of the directory.
+If you specify more than one section, all the entries
+are added in each of the sections.
+If you don't specify any sections, they are determined
+from information in the Info file itself.
+.TP
+\fB\-\-version\fR
+display version information and exit.
+.SH "REPORTING BUGS"
+Email bug reports to bug\-texinfo@gnu.org,
+general questions and discussion to help\-texinfo@gnu.org.
+Texinfo home page: http://www.gnu.org/software/texinfo/
+.SH COPYRIGHT
+Copyright \(co 2004 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
+.SH "SEE ALSO"
+The full documentation for
+.B install-info
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B install-info
+programs are properly installed at your site, the command
+.IP
+.B info install-info
+.PP
+should give you access to the complete manual.
diff --git a/Build/source/utils/texinfo/doc/makeinfo.1 b/Build/source/utils/texinfo/doc/makeinfo.1
new file mode 100644
index 00000000000..7b46491e0a6
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/makeinfo.1
@@ -0,0 +1,205 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.34.
+.TH MAKEINFO "1" "December 2004" "makeinfo 4.8" "User Commands"
+.SH NAME
+makeinfo \- translate Texinfo documents
+.SH SYNOPSIS
+.B makeinfo
+[\fIOPTION\fR]... \fITEXINFO-FILE\fR...
+.SH DESCRIPTION
+Translate Texinfo source documentation to various other formats, by default
+Info files suitable for reading online with Emacs or standalone GNU Info.
+.SS "General options:"
+.TP
+\fB\-\-error\-limit\fR=\fINUM\fR
+quit after NUM errors (default 100).
+.TP
+\fB\-\-force\fR
+preserve output even if errors.
+.TP
+\fB\-\-help\fR
+display this help and exit.
+.TP
+\fB\-\-no\-validate\fR
+suppress node cross\-reference validation.
+.TP
+\fB\-\-no\-warn\fR
+suppress warnings (but not errors).
+.TP
+\fB\-\-reference\-limit\fR=\fINUM\fR
+warn about at most NUM references (default 1000).
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+explain what is being done.
+.TP
+\fB\-\-version\fR
+display version information and exit.
+.SS "Output format selection (default is to produce Info):"
+.TP
+\fB\-\-docbook\fR
+output Docbook XML rather than Info.
+.TP
+\fB\-\-html\fR
+output HTML rather than Info.
+.TP
+\fB\-\-xml\fR
+output Texinfo XML rather than Info.
+.TP
+\fB\-\-plaintext\fR
+output plain text rather than Info.
+.SS "General output options:"
+.TP
+\fB\-E\fR, \fB\-\-macro\-expand\fR FILE
+output macro\-expanded source to FILE.
+ignoring any @setfilename.
+.TP
+\fB\-\-no\-headers\fR
+suppress node separators, Node: lines, and menus
+from Info output (thus producing plain text)
+or from HTML (thus producing shorter output);
+also, write to standard output by default.
+.TP
+\fB\-\-no\-split\fR
+suppress splitting of Info or HTML output,
+generate only one output file.
+.TP
+\fB\-\-number\-sections\fR
+output chapter and sectioning numbers.
+.TP
+\fB\-o\fR, \fB\-\-output\fR=\fIFILE\fR
+output to FILE (directory if split HTML),
+.SS "Options for Info and plain text:"
+.TP
+\fB\-\-enable\-encoding\fR
+output accented and special characters in
+Info output based on @documentencoding.
+.TP
+\fB\-\-fill\-column\fR=\fINUM\fR
+break Info lines at NUM characters (default 72).
+.TP
+\fB\-\-footnote\-style\fR=\fISTYLE\fR
+output footnotes in Info according to STYLE:
+`separate' to put them in their own node;
+`end' to put them at the end of the node
+.IP
+in which they are defined (default).
+.TP
+\fB\-\-paragraph\-indent\fR=\fIVAL\fR
+indent Info paragraphs by VAL spaces (default 3).
+If VAL is `none', do not indent; if VAL is
+`asis', preserve existing indentation.
+.TP
+\fB\-\-split\-size\fR=\fINUM\fR
+split Info files at size NUM (default 300000).
+.SS "Options for HTML:"
+.TP
+\fB\-\-css\-include\fR=\fIFILE\fR
+include FILE in HTML <style> output;
+read stdin if FILE is \-.
+.SS "Options for XML and Docbook:"
+.TP
+\fB\-\-output\-indent\fR=\fIVAL\fR
+indent XML elements by VAL spaces (default 2).
+If VAL is 0, ignorable whitespace is dropped.
+.SS "Input file options:"
+.TP
+\fB\-\-commands\-in\-node\-names\fR
+allow @ commands in node names.
+.TP
+\fB\-D\fR VAR
+define the variable VAR, as with @set.
+.TP
+\fB\-I\fR DIR
+append DIR to the @include search path.
+.TP
+\fB\-P\fR DIR
+prepend DIR to the @include search path.
+.TP
+\fB\-U\fR VAR
+undefine the variable VAR, as with @clear.
+.SS "Conditional processing in input:"
+.TP
+\fB\-\-ifdocbook\fR
+process @ifdocbook and @docbook even if
+not generating Docbook.
+.TP
+\fB\-\-ifhtml\fR
+process @ifhtml and @html even if not generating HTML.
+.TP
+\fB\-\-ifinfo\fR
+process @ifinfo even if not generating Info.
+.TP
+\fB\-\-ifplaintext\fR
+process @ifplaintext even if not generating plain text.
+.TP
+\fB\-\-iftex\fR
+process @iftex and @tex; implies \fB\-\-no\-split\fR.
+.TP
+\fB\-\-ifxml\fR
+process @ifxml and @xml.
+.TP
+\fB\-\-no\-ifdocbook\fR
+do not process @ifdocbook and @docbook text.
+.TP
+\fB\-\-no\-ifhtml\fR
+do not process @ifhtml and @html text.
+.TP
+\fB\-\-no\-ifinfo\fR
+do not process @ifinfo text.
+.TP
+\fB\-\-no\-ifplaintext\fR
+do not process @ifplaintext text.
+.TP
+\fB\-\-no\-iftex\fR
+do not process @iftex and @tex text.
+.TP
+\fB\-\-no\-ifxml\fR
+do not process @ifxml and @xml text.
+.IP
+Also, for the \fB\-\-no\-ifFORMAT\fR options, do process @ifnotFORMAT text.
+.IP
+The defaults for the @if... conditionals depend on the output format:
+if generating HTML, \fB\-\-ifhtml\fR is on and the others are off;
+if generating Info, \fB\-\-ifinfo\fR is on and the others are off;
+if generating plain text, \fB\-\-ifplaintext\fR is on and the others are off;
+if generating XML, \fB\-\-ifxml\fR is on and the others are off.
+.SH EXAMPLES
+.TP
+makeinfo foo.texi
+write Info to foo's @setfilename
+.TP
+makeinfo \fB\-\-html\fR foo.texi
+write HTML to @setfilename
+.TP
+makeinfo \fB\-\-xml\fR foo.texi
+write Texinfo XML to @setfilename
+.TP
+makeinfo \fB\-\-docbook\fR foo.texi
+write DocBook XML to @setfilename
+.TP
+makeinfo \fB\-\-no\-headers\fR foo.texi
+write plain text to standard output
+.IP
+makeinfo \fB\-\-html\fR \fB\-\-no\-headers\fR foo.texi write html without node lines, menus
+makeinfo \fB\-\-number\-sections\fR foo.texi write Info with numbered sections
+makeinfo \fB\-\-no\-split\fR foo.texi write one Info file however big
+.SH "REPORTING BUGS"
+Email bug reports to bug\-texinfo@gnu.org,
+general questions and discussion to help\-texinfo@gnu.org.
+Texinfo home page: http://www.gnu.org/software/texinfo/
+.SH COPYRIGHT
+Copyright \(co 2004 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
+.SH "SEE ALSO"
+The full documentation for
+.B makeinfo
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B makeinfo
+programs are properly installed at your site, the command
+.IP
+.B info makeinfo
+.PP
+should give you access to the complete manual.
diff --git a/Build/source/utils/texinfo/doc/mdate-sh b/Build/source/utils/texinfo/doc/mdate-sh
new file mode 100755
index 00000000000..881782eb55e
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/mdate-sh
@@ -0,0 +1,170 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2004-12-08.12
+
+# Copyright (C) 1995, 1996, 1997, 2003, 2004 Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No file. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: mdate-sh [--help] [--version] FILE
+
+Pretty-print the modification time of FILE.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit 0
+ ;;
+ -v | --v*)
+ echo "mdate-sh $scriptversion"
+ exit 0
+ ;;
+esac
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+save_arg1="$1"
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ ls_command='ls -L -l -d'
+else
+ ls_command='ls -l -d'
+fi
+
+# A `ls -l' line looks as follows on OS/2.
+# drwxrwx--- 0 Aug 11 2001 foo
+# This differs from Unix, which adds ownership information.
+# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month. This cannot work with files whose owner is a
+# user named `Jan', or `Feb', etc. However, it's unlikely that `/'
+# will be owned by a user whose name is a month. So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`ls -l -d /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+ shift
+ # Add another shift to the command.
+ command="$command shift;"
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+# Get the extended ls output of the file or directory.
+set x`eval "$ls_command \"\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Get the month. Next argument is day, followed by the year or time.
+case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+esac
+
+day=$2
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/texinfo/doc/pdfcolor.tex b/Build/source/utils/texinfo/doc/pdfcolor.tex
new file mode 100644
index 00000000000..f09ecbcb750
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/pdfcolor.tex
@@ -0,0 +1,158 @@
+% Very simple macros to show how to use colors with pdftex
+
+\def\cmykGreenYellow{0.15 0 0.69 0}
+\def\cmykYellow{0 0 1 0}
+\def\cmykGoldenrod{0 0.10 0.84 0}
+\def\cmykDandelion{0 0.29 0.84 0}
+\def\cmykApricot{0 0.32 0.52 0}
+\def\cmykPeach{0 0.50 0.70 0}
+\def\cmykMelon{0 0.46 0.50 0}
+\def\cmykYellowOrange{0 0.42 1 0}
+\def\cmykOrange{0 0.61 0.87 0}
+\def\cmykBurntOrange{0 0.51 1 0}
+\def\cmykBittersweet{0 0.75 1 0.24}
+\def\cmykRedOrange{0 0.77 0.87 0}
+\def\cmykMahogany{0 0.85 0.87 0.35}
+\def\cmykMaroon{0 0.87 0.68 0.32}
+\def\cmykBrickRed{0 0.89 0.94 0.28}
+\def\cmykRed{0 1 1 0}
+\def\cmykOrangeRed{0 1 0.50 0}
+\def\cmykRubineRed{0 1 0.13 0}
+\def\cmykWildStrawberry{0 0.96 0.39 0}
+\def\cmykSalmon{0 0.53 0.38 0}
+\def\cmykCarnationPink{0 0.63 0 0}
+\def\cmykMagenta{0 1 0 0}
+\def\cmykVioletRed{0 0.81 0 0}
+\def\cmykRhodamine{0 0.82 0 0}
+\def\cmykMulberry{0.34 0.90 0 0.02}
+\def\cmykRedViolet{0.07 0.90 0 0.34}
+\def\cmykFuchsia{0.47 0.91 0 0.08}
+\def\cmykLavender{0 0.48 0 0}
+\def\cmykThistle{0.12 0.59 0 0}
+\def\cmykOrchid{0.32 0.64 0 0}
+\def\cmykDarkOrchid{0.40 0.80 0.20 0}
+\def\cmykPurple{0.45 0.86 0 0}
+\def\cmykPlum{0.50 1 0 0}
+\def\cmykViolet{0.79 0.88 0 0}
+\def\cmykRoyalPurple{0.75 0.90 0 0}
+\def\cmykBlueViolet{0.86 0.91 0 0.04}
+\def\cmykPeriwinkle{0.57 0.55 0 0}
+\def\cmykCadetBlue{0.62 0.57 0.23 0}
+\def\cmykCornflowerBlue{0.65 0.13 0 0}
+\def\cmykMidnightBlue{0.98 0.13 0 0.43}
+\def\cmykNavyBlue{0.94 0.54 0 0}
+\def\cmykRoyalBlue{1 0.50 0 0}
+\def\cmykBlue{1 1 0 0}
+\def\cmykCerulean{0.94 0.11 0 0}
+\def\cmykCyan{1 0 0 0}
+\def\cmykProcessBlue{0.96 0 0 0}
+\def\cmykSkyBlue{0.62 0 0.12 0}
+\def\cmykTurquoise{0.85 0 0.20 0}
+\def\cmykTealBlue{0.86 0 0.34 0.02}
+\def\cmykAquamarine{0.82 0 0.30 0}
+\def\cmykBlueGreen{0.85 0 0.33 0}
+\def\cmykEmerald{1 0 0.50 0}
+\def\cmykJungleGreen{0.99 0 0.52 0}
+\def\cmykSeaGreen{0.69 0 0.50 0}
+\def\cmykGreen{1 0 1 0}
+\def\cmykForestGreen{0.91 0 0.88 0.12}
+\def\cmykPineGreen{0.92 0 0.59 0.25}
+\def\cmykLimeGreen{0.50 0 1 0}
+\def\cmykYellowGreen{0.44 0 0.74 0}
+\def\cmykSpringGreen{0.26 0 0.76 0}
+\def\cmykOliveGreen{0.64 0 0.95 0.40}
+\def\cmykRawSienna{0 0.72 1 0.45}
+\def\cmykSepia{0 0.83 1 0.70}
+\def\cmykBrown{0 0.81 1 0.60}
+\def\cmykTan{0.14 0.42 0.56 0}
+\def\cmykGray{0 0 0 0.50}
+\def\cmykBlack{0 0 0 1}
+\def\cmykWhite{0 0 0 0}
+
+\def\GreenYellow{\pdfsetcolor{\cmykGreenYellow}}
+\def\Yellow{\pdfsetcolor{\cmykYellow}}
+\def\Goldenrod{\pdfsetcolor{\cmykGoldenrod}}
+\def\Dandelion{\pdfsetcolor{\cmykDandelion}}
+\def\Apricot{\pdfsetcolor{\cmykApricot}}
+\def\Peach{\pdfsetcolor{\cmykPeach}}
+\def\Melon{\pdfsetcolor{\cmykMelon}}
+\def\YellowOrange{\pdfsetcolor{\cmykYellowOrange}}
+\def\Orange{\pdfsetcolor{\cmykOrange}}
+\def\BurntOrange{\pdfsetcolor{\cmykBurntOrange}}
+\def\Bittersweet{\pdfsetcolor{\cmykBittersweet}}
+\def\RedOrange{\pdfsetcolor{\cmykRedOrange}}
+\def\Mahogany{\pdfsetcolor{\cmykMahogany}}
+\def\Maroon{\pdfsetcolor{\cmykMaroon}}
+\def\BrickRed{\pdfsetcolor{\cmykBrickRed}}
+\def\Red{\pdfsetcolor{\cmykRed}}
+\def\OrangeRed{\pdfsetcolor{\cmykOrangeRed}}
+\def\RubineRed{\pdfsetcolor{\cmykRubineRed}}
+\def\WildStrawberry{\pdfsetcolor{\cmykWildStrawberry}}
+\def\Salmon{\pdfsetcolor{\cmykSalmon}}
+\def\CarnationPink{\pdfsetcolor{\cmykCarnationPink}}
+\def\Magenta{\pdfsetcolor{\cmykMagenta}}
+\def\VioletRed{\pdfsetcolor{\cmykVioletRed}}
+\def\Rhodamine{\pdfsetcolor{\cmykRhodamine}}
+\def\Mulberry{\pdfsetcolor{\cmykMulberry}}
+\def\RedViolet{\pdfsetcolor{\cmykRedViolet}}
+\def\Fuchsia{\pdfsetcolor{\cmykFuchsia}}
+\def\Lavender{\pdfsetcolor{\cmykLavender}}
+\def\Thistle{\pdfsetcolor{\cmykThistle}}
+\def\Orchid{\pdfsetcolor{\cmykOrchid}}
+\def\DarkOrchid{\pdfsetcolor{\cmykDarkOrchid}}
+\def\Purple{\pdfsetcolor{\cmykPurple}}
+\def\Plum{\pdfsetcolor{\cmykPlum}}
+\def\Violet{\pdfsetcolor{\cmykViolet}}
+\def\RoyalPurple{\pdfsetcolor{\cmykRoyalPurple}}
+\def\BlueViolet{\pdfsetcolor{\cmykBlueViolet}}
+\def\Periwinkle{\pdfsetcolor{\cmykPeriwinkle}}
+\def\CadetBlue{\pdfsetcolor{\cmykCadetBlue}}
+\def\CornflowerBlue{\pdfsetcolor{\cmykCornflowerBlue}}
+\def\MidnightBlue{\pdfsetcolor{\cmykMidnightBlue}}
+\def\NavyBlue{\pdfsetcolor{\cmykNavyBlue}}
+\def\RoyalBlue{\pdfsetcolor{\cmykRoyalBlue}}
+\def\Blue{\pdfsetcolor{\cmykBlue}}
+\def\Cerulean{\pdfsetcolor{\cmykCerulean}}
+\def\Cyan{\pdfsetcolor{\cmykCyan}}
+\def\ProcessBlue{\pdfsetcolor{\cmykProcessBlue}}
+\def\SkyBlue{\pdfsetcolor{\cmykSkyBlue}}
+\def\Turquoise{\pdfsetcolor{\cmykTurquoise}}
+\def\TealBlue{\pdfsetcolor{\cmykTealBlue}}
+\def\Aquamarine{\pdfsetcolor{\cmykAquamarine}}
+\def\BlueGreen{\pdfsetcolor{\cmykBlueGreen}}
+\def\Emerald{\pdfsetcolor{\cmykEmerald}}
+\def\JungleGreen{\pdfsetcolor{\cmykJungleGreen}}
+\def\SeaGreen{\pdfsetcolor{\cmykSeaGreen}}
+\def\Green{\pdfsetcolor{\cmykGreen}}
+\def\ForestGreen{\pdfsetcolor{\cmykForestGreen}}
+\def\PineGreen{\pdfsetcolor{\cmykPineGreen}}
+\def\LimeGreen{\pdfsetcolor{\cmykLimeGreen}}
+\def\YellowGreen{\pdfsetcolor{\cmykYellowGreen}}
+\def\SpringGreen{\pdfsetcolor{\cmykSpringGreen}}
+\def\OliveGreen{\pdfsetcolor{\cmykOliveGreen}}
+\def\RawSienna{\pdfsetcolor{\cmykRawSienna}}
+\def\Sepia{\pdfsetcolor{\cmykSepia}}
+\def\Brown{\pdfsetcolor{\cmykBrown}}
+\def\Tan{\pdfsetcolor{\cmykTan}}
+\def\Gray{\pdfsetcolor{\cmykGray}}
+\def\Black{\pdfsetcolor{\cmykBlack}}
+\def\White{\pdfsetcolor{\cmykWhite}}
+
+\def\pdfsetcolor#1{\pdfliteral{#1 k}}
+\def\setcolor#1{\mark{#1}\pdfsetcolor{#1}}
+
+\pdfoutput=1
+\def\maincolor{\cmykBlack}
+\pdfsetcolor{\maincolor}
+
+\def\makefootline{
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}}
+
+\def\makeheadline{%
+ \edef\M{\topmark}
+ \ifx\M\empty\let\M=\maincolor\fi
+ \vbox to 0pt{\vskip-22.5pt
+ \line{\vbox to8.5pt{}%
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\M}}\vss}%
+ \nointerlineskip}
diff --git a/Build/source/utils/texinfo/doc/stamp-1 b/Build/source/utils/texinfo/doc/stamp-1
new file mode 100644
index 00000000000..32973a788b2
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/stamp-1
@@ -0,0 +1,4 @@
+@set UPDATED 14 December 2004
+@set UPDATED-MONTH December 2004
+@set EDITION 4.8
+@set VERSION 4.8
diff --git a/Build/source/utils/texinfo/doc/stamp-vti b/Build/source/utils/texinfo/doc/stamp-vti
new file mode 100644
index 00000000000..ae55f879d47
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 29 December 2004
+@set UPDATED-MONTH December 2004
+@set EDITION 4.8
+@set VERSION 4.8
diff --git a/Build/source/utils/texinfo/doc/texi2dvi.1 b/Build/source/utils/texinfo/doc/texi2dvi.1
new file mode 100644
index 00000000000..41fae2f7d5e
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/texi2dvi.1
@@ -0,0 +1,95 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.33.
+.TH TEXI2DVI "1" "February 2005" "texi2dvi 1.39" "User Commands"
+.SH NAME
+texi2dvi \- print Texinfo documents
+.SH SYNOPSIS
+.B texi2dvi
+[\fIOPTION\fR]... \fIFILE\fR...
+.SH DESCRIPTION
+Run each Texinfo or LaTeX FILE through TeX in turn until all
+cross-references are resolved, building all indices. The directory
+containing each FILE is searched for included files. The suffix of FILE
+is used to determine its language (LaTeX or Texinfo).
+.PP
+Makeinfo is used to perform Texinfo macro expansion before running TeX
+when needed.
+.SS "Operation modes:"
+.TP
+\fB\-b\fR, \fB\-\-batch\fR
+no interaction
+.TP
+\fB\-c\fR, \fB\-\-clean\fR
+remove all auxiliary files
+.TP
+\fB\-D\fR, \fB\-\-debug\fR
+turn on shell debugging (set \fB\-x\fR)
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+display this help and exit successfully
+.TP
+\fB\-o\fR, \fB\-\-output\fR=\fIOFILE\fR
+leave output in OFILE (implies \fB\-\-clean\fR);
+Only one input FILE may be specified in this case
+.TP
+\fB\-q\fR, \fB\-\-quiet\fR
+no output unless errors (implies \fB\-\-batch\fR)
+.TP
+\fB\-s\fR, \fB\-\-silent\fR
+same as \fB\-\-quiet\fR
+.TP
+\fB\-v\fR, \fB\-\-version\fR
+display version information and exit successfully
+.TP
+\fB\-V\fR, \fB\-\-verbose\fR
+report on what is done
+.SS "TeX tuning:"
+.TP
+-@
+use @input instead of \einput; for preloaded Texinfo
+.TP
+\fB\-e\fR, \fB\-E\fR, \fB\-\-expand\fR
+force macro expansion using makeinfo
+.TP
+\fB\-I\fR DIR
+search DIR for Texinfo files
+.TP
+\fB\-l\fR, \fB\-\-language\fR=\fILANG\fR
+specify the LANG of FILE (LaTeX or Texinfo)
+.TP
+\fB\-p\fR, \fB\-\-pdf\fR
+use pdftex or pdflatex for processing
+.TP
+\fB\-r\fR, \fB\-\-recode\fR
+call recode before TeX to translate input characters
+.TP
+\fB\-t\fR, \fB\-\-command\fR=\fICMD\fR
+insert CMD in copy of input file
+.TP
+or \fB\-\-texinfo\fR=\fICMD\fR
+multiple values accumulate
+.PP
+The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
+TEX (or PDFTEX), TEXINDEX, and THUMBPDF environment variables are used
+to run those commands, if they are set. Any CMD strings are added
+after @setfilename for Texinfo input, in the first line for LaTeX input.
+.SH "REPORTING BUGS"
+Email bug reports to <bug-texinfo@gnu.org>,
+general questions and discussion to <help-texinfo@gnu.org>.
+Texinfo home page: http://www.gnu.org/software/texinfo/
+.SH COPYRIGHT
+Copyright \(co 2005 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
+.SH "SEE ALSO"
+The full documentation for
+.B texi2dvi
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B texi2dvi
+programs are properly installed at your site, the command
+.IP
+.B info texi2dvi
+.PP
+should give you access to the complete manual.
diff --git a/Build/source/utils/texinfo/doc/texindex.1 b/Build/source/utils/texinfo/doc/texindex.1
new file mode 100644
index 00000000000..732e12b8874
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/texindex.1
@@ -0,0 +1,47 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.34.
+.TH TEXINDEX "1" "December 2004" "texindex 4.8" "User Commands"
+.SH NAME
+texindex \- sort Texinfo index files
+.SH SYNOPSIS
+.B texindex
+[\fIOPTION\fR]... \fIFILE\fR...
+.SH DESCRIPTION
+Generate a sorted index for each TeX output FILE.
+Usually FILE... is specified as `foo.??' for a document `foo.texi'.
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+display this help and exit
+.TP
+\fB\-k\fR, \fB\-\-keep\fR
+keep temporary files around after processing
+.TP
+\fB\-\-no\-keep\fR
+do not keep temporary files around after processing (default)
+.TP
+\fB\-o\fR, \fB\-\-output\fR FILE
+send output to FILE
+.TP
+\fB\-\-version\fR
+display version information and exit
+.SH "REPORTING BUGS"
+Email bug reports to bug\-texinfo@gnu.org,
+general questions and discussion to help\-texinfo@gnu.org.
+Texinfo home page: http://www.gnu.org/software/texinfo/
+.SH COPYRIGHT
+Copyright \(co 2004 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
+.SH "SEE ALSO"
+The full documentation for
+.B texindex
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B texindex
+programs are properly installed at your site, the command
+.IP
+.B info texindex
+.PP
+should give you access to the complete manual.
diff --git a/Build/source/utils/texinfo/doc/texinfo.5 b/Build/source/utils/texinfo/doc/texinfo.5
new file mode 100644
index 00000000000..0ca35cac0d5
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/texinfo.5
@@ -0,0 +1,61 @@
+.\" texinfo(5)
+.\" $Id: texinfo.5,v 1.2 2004/04/11 17:56:45 karl Exp $
+.\"
+.\" Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of
+.\" this manual under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Permission is granted to copy and distribute translations of this
+.\" manual into another language, under the above conditions for modified
+.\" versions, except that this permission notice may be stated in a
+.\" translation approved by the Foundation.
+.\"
+.de EX
+.nf
+.ft CW
+.in +5
+..
+.de EE
+.in -5
+.ft R
+.fi
+..
+.TH TEXINFO 5 "GNU Texinfo" "FSF"
+.SH NAME
+texinfo \- software documentation system
+.SH DESCRIPTION
+Texinfo is a documentation system that uses a single source file to
+produce both online information and printed output. It is primarily
+designed for writing software manuals.
+.PP
+For a full description of the Texinfo language and associated tools,
+please see the Texinfo manual (written in Texinfo itself). Most likely,
+running this command from your shell:
+.EX
+info texinfo
+.EE
+or this key sequence from inside Emacs:
+.EX
+M-x info RET m texinfo RET
+.EE
+will get you there.
+.SH AVAILABILITY
+ftp://ftp.gnu.org/gnu/texinfo/
+.br
+or any GNU mirror site.
+.SH "REPORTING BUGS"
+Please send bug reports to bug-texinfo@gnu.org,
+general questions and discussion to help-texinfo@gnu.org.
+.SH "SEE ALSO"
+info(1), install-info(1), makeinfo(1), texi2dvi(1), texindex(1).
+.br
+emacs(1), tex(1).
+.br
+info(5).
diff --git a/Build/source/utils/texinfo/doc/texinfo.tex b/Build/source/utils/texinfo/doc/texinfo.tex
new file mode 100644
index 00000000000..8d20e47dee7
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/texinfo.tex
@@ -0,0 +1,7217 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2005-03-21.17}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
+% Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\backChar = `\\
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\plusChar = `\+
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+\chardef\spaceChar = `\ %
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode\spaceChar=\spacecat}
+
+{% for help with debugging.
+ % example usage: \expandafter\show\activebackslash
+ \catcode`\! = 0 \catcode`\\ = \active
+ !global!def!activebackslash{\}
+}
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\next{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % We cannot use \next here, as it holds the macro to run;
+ % thus we reuse \temp.
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \next.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux/toc files.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor}
+
+% @frenchspacing on|off says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+ \def\temp{#1}%
+ \ifx\temp\onword \plainfrenchspacing
+ \else\ifx\temp\offword \plainnonfrenchspacing
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+ \fi\fi
+}
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode\underChar = \active
+ \gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil
+ .\hfil.\hfil.%
+ \hskip 0pt plus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets, to
+% for display in the outlines, and in other places. Thus, we have to
+% double any backslashes. Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e. Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's we do).
+
+% double active backslashes.
+%
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslash{@catcode`@\=@active @otherbackslash}
+ @gdef@activebackslashdouble{%
+ @catcode@backChar=@active
+ @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters. hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens. I've
+% tinkered with it a little for texinfo, but it's definitely from there.
+%
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+%
+\def\HyPsdSubst#1#2#3{%
+ \def\HyPsdReplace##1#1##2\END{%
+ ##1%
+ \ifx\\##2\\%
+ \else
+ #2%
+ \HyReturnAfterFi{%
+ \HyPsdReplace##2\END
+ }%
+ \fi
+ }%
+ \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+ \xdef#1{#1}% redefine it as its expansion; the definition is simply
+ % \lastnode when called from \setref -> \pdfmkdest.
+ \HyPsdSubst{(}{\backslashlparen}{#1}%
+ \HyPsdSubst{)}{\backslashrparen}{#1}%
+}
+
+{\catcode\exclamChar = 0 \catcode\backChar = \other
+ !gdef!backslashlparen{\(}%
+ !gdef!backslashrparen{\)}%
+}
+
+\ifpdf
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}%
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code, and characters
+ % such as \, aren't expanded when present in a section title.
+ \atdummies
+ \turnoffactive
+ \activebackslashdouble
+ \def\pdfdestname{#1}%
+ \backslashparens\pdfdestname
+ \pdfdest name{\pdfdestname} xyz%
+ }}%
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}%
+ %
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text, which is what will be displayed in the
+ % outline by the pdf viewer. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node text,
+ % which might be empty if this toc entry had no corresponding node.
+ % #4 is the page number
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worth the trouble, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty
+ \def\pdfoutlinedest{#4}%
+ \else
+ % Doubled backslashes in the name.
+ {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+ \backslashparens\pdfoutlinedest}%
+ \fi
+ %
+ % Also double the backslashes in the display string.
+ {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+ \backslashparens\pdfoutlinetext}%
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \readdatafile{toc}%
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \setupdatafile
+ \activebackslash
+ \input \jobname.toc
+ \endgroup
+ }
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \makevalueexpandable
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
+\setfont\deftt\ttshape{10}{\magstep1}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts \rm
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\plainfrenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ \def\endofsentencespacefactor{1000}% for @. and friends
+ }
+ \def\plainnonfrenchspacing{%
+ \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+ \def\endofsentencespacefactor{3000}% for @. and friends
+ }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+ {\tt \rawbackslash \plainfrenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \plainfrenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \catcode`\_=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\realdash
+ \let_\realunder
+ \fi
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general. @allowcodebreaks provides a way to control this.
+%
+\newif\ifallowcodebreaks \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+ \def\arg{#1}%
+ \ifx\arg\keywordtrue
+ \allowcodebreakstrue
+ \else\ifx\arg\keywordfalse
+ \allowcodebreaksfalse
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @allowcodebreaks option `\arg'}%
+ \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\plainfrenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that. The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math. Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+ % We set the font at each command, rather than predefining it in
+ % \textfonts and the other font-switching commands, so that
+ % installations which never need the symbol don't have to have the
+ % font installed.
+ %
+ % There is only one designed size (nominal 10pt), so we always scale
+ % that to the current nominal size.
+ %
+ % By the way, simply using "at 1em" works for cmr10 and the like, but
+ % does not work for cmbx10 and other extended/shrunken fonts.
+ %
+ \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+ %
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+ \else
+ % regular:
+ \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+ \fi
+ \thiseurofont
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1', which must be on a line
+ % by itself.
+ \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \obeylines %
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ \let\definedummyaccent\definedummyletter
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux and toc files, @ is the escape character. So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files). When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ \let\definedummyaccent\definedummyletter
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter{_}%
+ %
+ % Non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ \definedummyword{exclamdown}%
+ \definedummyword{questiondown}%
+ \definedummyword{ordf}%
+ \definedummyword{ordm}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ \definedummyword{LaTeX}%
+ \definedummyword{TeX}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{comma}%
+ \definedummyword{copyright}%
+ \definedummyword{registeredsymbol}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{euro}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+% Better have this without active chars.
+{
+ \catcode`\~=\other
+ \gdef\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter{!}%
+ \definedummyaccent{"}%
+ \definedummyaccent{'}%
+ \definedummyletter{*}%
+ \definedummyaccent{,}%
+ \definedummyletter{.}%
+ \definedummyletter{/}%
+ \definedummyletter{:}%
+ \definedummyaccent{=}%
+ \definedummyletter{?}%
+ \definedummyaccent{^}%
+ \definedummyaccent{`}%
+ \definedummyaccent{~}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ % Commands that take arguments.
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{tie}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{verb}%
+ \definedummyword{w}%
+ }
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{%
+ \expandafter\let\csname ##1\endcsname\asis
+ }%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{}%
+ }%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\result{=>}%
+ %
+ % Don't write macro names.
+ \emptyusermacros
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \ifvmode
+ \dosubindsanitize
+ \else
+ \dosubindwrite
+ \fi
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write will make \lastskip zero. The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \skip0 = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \count255 = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\skip0
+ \fi
+ %
+ \dosubindwrite
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ %
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\count255>9999 \penalty\count255 \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\skip0
+ \fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#1}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \gdef\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \gdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chfplain.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chfplain.
+ \donoderef{#3}%
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ {\atdummies \turnoffactive
+ \edef\temp{%
+ \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+ \temp
+ }
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care. This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+ \catcode`\"=\active
+ \catcode`\$=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\\=\active
+ \catcode`\^=\active
+ \catcode`\_=\active
+ \catcode`\|=\active
+ \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+ \setupdatafile
+ \activecatcodes
+ \input \jobname.toc
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ \let\frenchspacing=\plainfrenchspacing
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \defargscommonending, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ \ifnum\lastpenalty=10002 \penalty2000 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+ \errmessage{Unbalanced parentheses in @def}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \errmessage{Unbalanced square braces in @def}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ %
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\do\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx#1\relax
+ % remove this
+ \else
+ \noexpand\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We want to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+% For \indexnofonts, we need to get rid of all macros, leaving only the
+% arguments (if present). Of course this is not nearly correct, but it
+% is the best we can do for now. makeinfo does not expand macros in the
+% argument to @deffn, which ends up writing an index entry, and texindex
+% isn't prepared for an index sort entry that starts with \.
+%
+% Since macro invocations are followed by braces, we can just redefine them
+% to take a single TeX argument. The case of a macro invocation that
+% goes to end-of-line is not handled.
+%
+\def\emptyusermacros{\begingroup
+ \def\do##1{\let\noexpand##1=\noexpand\asis}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \turnoffactive
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\thissection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \writexrdef{pg}{\folio}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive
+ % See comments at \activebackslashdouble.
+ {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+ \backslashparens\pdfxrefdest}%
+ %
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{\pdfxrefdest}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{\pdfxrefdest}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR#1\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readdatafile{aux}%
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\setupdatafile{%
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count1=128
+ \def\loop{%
+ \catcode\count1=\other
+ \advance\count1 by 1
+ \ifnum \count1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+ \setupdatafile
+ \input\jobname.#1
+\endgroup}
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \thissection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\thissection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies \turnoffactive
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@backslashcurfont}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\backslashcurfont}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/Build/source/utils/texinfo/doc/texinfo.txi b/Build/source/utils/texinfo/doc/texinfo.txi
new file mode 100644
index 00000000000..15ef1dd0cab
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/texinfo.txi
@@ -0,0 +1,20513 @@
+\input texinfo.tex @c -*-texinfo-*-
+@c $Id: texinfo.txi,v 1.128 2004/12/29 15:06:41 karl Exp $
+@c Ordinarily, Texinfo files have the extension .texi. But texinfo.texi
+@c clashes with texinfo.tex on 8.3 filesystems, so we use texinfo.txi.
+
+@c Everything between the start/end of header lines will be passed by
+@c Emacs's {texinfo,makeinfo}-format region commands. See the `start of
+@c header' node for more info.
+@c %**start of header
+
+@c makeinfo and texinfo.tex ignore all text before @setfilename.
+@c
+@c Ordinarily, the setfilename argument ends with .info. But
+@c texinfo.info-13 is too long for 14-character filesystems.
+@setfilename texinfo
+
+@c Automake automatically updates version.texi to @set VERSION and
+@c @set UPDATED to appropriate values.
+@include version.texi
+@settitle GNU Texinfo @value{VERSION}
+
+@c Define a new index for options.
+@defcodeindex op
+@c Put everything except function (command, in this case) names in one
+@c index (arbitrarily chosen to be the concept index).
+@syncodeindex op cp
+@syncodeindex vr cp
+@syncodeindex pg cp
+
+@paragraphindent 2
+@c finalout
+
+@comment %**end of header
+
+@copying
+This manual is for GNU Texinfo (version @value{VERSION}, @value{UPDATED}),
+a documentation system that can produce both online information and a
+printed manual from a single source.
+
+Copyright (C) 1988, 1990, 1991, 1992, 1993, 1995, 1996, 1997, 1998,
+1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below. A copy of the license is
+included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software. Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Texinfo documentation system
+@direntry
+* Texinfo: (texinfo). The GNU documentation format.
+* install-info: (texinfo)Invoking install-info. Update info/dir entries.
+* texi2dvi: (texinfo)Format with texi2dvi. Print Texinfo documents.
+* texi2pdf: (texinfo)PDF Output. PDF output for Texinfo.
+* texindex: (texinfo)Format with tex/texindex. Sort Texinfo index files.
+* makeinfo: (texinfo)Invoking makeinfo. Translate Texinfo source.
+@end direntry
+
+@c Before release, run C-u C-c C-u C-a (texinfo-all-menus-update with a
+@c prefix arg). This updates the node pointers, which texinfmt.el needs.
+
+@c Set smallbook if printing in smallbook format so the example of the
+@c smallbook font is actually written using smallbook; in bigbook, a kludge
+@c is used for TeX output. Do this through the -t option to texi2dvi,
+@c so this same source can be used for other paper sizes as well.
+@c smallbook
+@c set smallbook
+@c @@clear smallbook
+
+@c If you like blank pages, add through texi2dvi -t.
+@c setchapternewpage odd
+
+@c Currently undocumented command, 5 December 1993:
+@c nwnode (Same as node, but no warnings; for `makeinfo'.)
+
+
+@shorttitlepage GNU Texinfo
+
+@titlepage
+@title Texinfo
+@subtitle The GNU Documentation Format
+@subtitle for Texinfo version @value{VERSION}, @value{UPDATED}
+
+@author Robert J. Chassell
+@author Richard M. Stallman
+
+@c Include the Distribution inside the titlepage so
+@c that headings are turned off.
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@sp 1
+Published by the Free Software Foundation @*
+59 Temple Place Suite 330 @*
+Boston, MA 02111-1307 @*
+USA @*
+ISBN 1-882114-67-1 @c for version 4.0, September 1999.
+@c ISBN 1-882114-65-5 is for version 3.12, March 1998.
+@c ISBN 1-882114-64-7 is for edition 2.24 of November 1996.
+@c ISBN 1-882114-63-9 is for edition 2.20 of 28 February 1995.
+
+@sp 1
+Cover art by Etienne Suvasa.
+@end titlepage
+
+
+@summarycontents
+@contents
+
+
+@ifnottex
+@node Top
+@top Texinfo
+
+@insertcopying
+
+The first part of this master menu lists the major nodes in this Info
+document, including the @@-command and concept indices. The rest of
+the menu lists all the lower level nodes in the document.
+
+@end ifnottex
+
+@menu
+* Copying Conditions:: Your rights.
+* Overview:: Texinfo in brief.
+* Texinfo Mode:: Using the GNU Emacs Texinfo mode.
+* Beginning a File:: What is at the beginning of a Texinfo file?
+* Ending a File:: What is at the end of a Texinfo file?
+* Structuring:: Creating chapters, sections, appendices, etc.
+* Nodes:: Writing nodes, the basic unit of Texinfo.
+* Menus:: Writing menus.
+* Cross References:: Writing cross references.
+* Marking Text:: Marking words and phrases as code,
+ keyboard input, meta-syntactic
+ variables, and the like.
+* Quotations and Examples:: Block quotations, examples, etc.
+* Lists and Tables:: Itemized or numbered lists, and tables.
+* Special Displays:: Floating figures and footnotes.
+* Indices:: Creating indices.
+* Insertions:: Inserting @@-signs, braces, etc.
+* Breaks:: Forcing or preventing line and page breaks.
+* Definition Commands:: Describing functions and the like uniformly.
+* Conditionals:: Specifying text for only some output cases.
+* Internationalization:: Supporting languages other than English.
+* Defining New Texinfo Commands:: User-defined macros and aliases.
+* Hardcopy:: Output for paper, with @TeX{}.
+* Creating and Installing Info Files:: Details on Info output.
+* Generating HTML:: Details on HTML output.
+
+* Command List:: All the Texinfo @@-commands.
+* Tips:: Hints on how to write a Texinfo document.
+* Sample Texinfo Files:: Complete examples, including full texts.
+* Include Files:: How to incorporate other Texinfo files.
+* Headings:: How to write page headings and footings.
+* Catching Mistakes:: How to find formatting mistakes.
+* Copying This Manual:: The GNU Free Documentation License.
+* Command and Variable Index:: A menu containing commands and variables.
+* Concept Index:: A menu covering many topics.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Overview of Texinfo
+
+* Reporting Bugs:: Submitting effective bug reports.
+* Using Texinfo:: Create printed or online output.
+* Output Formats:: Overview of the supported output formats.
+* Info Files:: What is an Info file?
+* Printed Books:: Characteristics of a printed book or manual.
+* Formatting Commands:: @@-commands are used for formatting.
+* Conventions:: General rules for writing a Texinfo file.
+* Comments:: Writing comments and ignored text in general.
+* Minimum:: What a Texinfo file must have.
+* Six Parts:: Usually, a Texinfo file has six parts.
+* Short Sample:: A short sample Texinfo file.
+* History:: Acknowledgements, contributors and genesis.
+
+Using Texinfo Mode
+
+* Texinfo Mode Overview:: How Texinfo mode can help you.
+* Emacs Editing:: Texinfo mode adds to GNU Emacs' general
+ purpose editing features.
+* Inserting:: How to insert frequently used @@-commands.
+* Showing the Structure:: How to show the structure of a file.
+* Updating Nodes and Menus:: How to update or create new nodes and menus.
+* Info Formatting:: How to format for Info.
+* Printing:: How to format and print part or all of a file.
+* Texinfo Mode Summary:: Summary of all the Texinfo mode commands.
+
+Updating Nodes and Menus
+
+* Updating Commands:: Five major updating commands.
+* Updating Requirements:: How to structure a Texinfo file for
+ using the updating command.
+* Other Updating Commands:: How to indent descriptions, insert
+ missing nodes lines, and update
+ nodes in sequence.
+
+Beginning a Texinfo File
+
+* Sample Beginning:: A sample beginning for a Texinfo file.
+* Texinfo File Header:: The first lines.
+* Document Permissions:: Ensuring your manual is free.
+* Titlepage & Copyright Page:: Creating the title and copyright pages.
+* Contents:: How to create a table of contents.
+* The Top Node:: Creating the `Top' node and master menu.
+* Global Document Commands:: Affecting formatting throughout.
+* Software Copying Permissions:: Ensure that you and others continue to
+ have the right to use and share software.
+
+Texinfo File Header
+
+* First Line:: The first line of a Texinfo file.
+* Start of Header:: Formatting a region requires this.
+* setfilename:: Tell Info the name of the Info file.
+* settitle:: Create a title for the printed work.
+* End of Header:: Formatting a region requires this.
+
+Document Permissions
+
+* copying:: Declare the document's copying permissions.
+* insertcopying:: Where to insert the permissions.
+
+Title and Copyright Pages
+
+* titlepage:: Create a title for the printed document.
+* titlefont center sp:: The @code{@@titlefont}, @code{@@center},
+ and @code{@@sp} commands.
+* title subtitle author:: The @code{@@title}, @code{@@subtitle},
+ and @code{@@author} commands.
+* Copyright:: How to write the copyright notice and
+ include copying permissions.
+* end titlepage:: Turn on page headings after the title and
+ copyright pages.
+* headings on off:: An option for turning headings on and off
+ and double or single sided printing.
+
+The `Top' Node and Master Menu
+
+* Top Node Example::
+* Master Menu Parts::
+
+Global Document Commands
+
+* documentdescription:: Document summary for the HTML output.
+* setchapternewpage:: Start chapters on right-hand pages.
+* paragraphindent:: Specify paragraph indentation.
+* firstparagraphindent:: Suppress indentation of the first paragraph.
+* exampleindent:: Specify environment indentation.
+
+Ending a Texinfo File
+
+* Printing Indices & Menus:: How to print an index in hardcopy and
+ generate index menus in Info.
+* File End:: How to mark the end of a file.
+
+Chapter Structuring
+
+* Tree Structuring:: A manual is like an upside down tree @dots{}
+* Structuring Command Types:: How to divide a manual into parts.
+* makeinfo top:: The @code{@@top} command, part of the `Top' node.
+* chapter::
+* unnumbered & appendix::
+* majorheading & chapheading::
+* section::
+* unnumberedsec appendixsec heading::
+* subsection::
+* unnumberedsubsec appendixsubsec subheading::
+* subsubsection:: Commands for the lowest level sections.
+* Raise/lower sections:: How to change commands' hierarchical level.
+
+Nodes
+
+* Two Paths:: Different commands to structure
+ Info output and printed output.
+* Node Menu Illustration:: A diagram, and sample nodes and menus.
+* node:: Creating nodes, in detail.
+* makeinfo Pointer Creation:: Letting makeinfo determine node pointers.
+* anchor:: Defining arbitrary cross-reference targets.
+
+The @code{@@node} Command
+
+* Node Names:: How to choose node and pointer names.
+* Writing a Node:: How to write an @code{@@node} line.
+* Node Line Tips:: Keep names short.
+* Node Line Requirements:: Keep names unique, without @@-commands.
+* First Node:: How to write a `Top' node.
+* makeinfo top command:: How to use the @code{@@top} command.
+
+Menus
+
+* Menu Location:: Menus go at the ends of short nodes.
+* Writing a Menu:: What is a menu?
+* Menu Parts:: A menu entry has three parts.
+* Less Cluttered Menu Entry:: Two part menu entry.
+* Menu Example:: Two and three part menu entries.
+* Other Info Files:: How to refer to a different Info file.
+
+Cross References
+
+* References:: What cross references are for.
+* Cross Reference Commands:: A summary of the different commands.
+* Cross Reference Parts:: A cross reference has several parts.
+* xref:: Begin a reference with `See' @dots{}
+* Top Node Naming:: How to refer to the beginning of another file.
+* ref:: A reference for the last part of a sentence.
+* pxref:: How to write a parenthetical cross reference.
+* inforef:: How to refer to an Info-only file.
+* uref:: How to refer to a uniform resource locator.
+
+@code{@@xref}
+
+* Reference Syntax:: What a reference looks like and requires.
+* One Argument:: @code{@@xref} with one argument.
+* Two Arguments:: @code{@@xref} with two arguments.
+* Three Arguments:: @code{@@xref} with three arguments.
+* Four and Five Arguments:: @code{@@xref} with four and five arguments.
+
+Marking Words and Phrases
+
+* Indicating:: How to indicate definitions, files, etc.
+* Emphasis:: How to emphasize text.
+
+Indicating Definitions, Commands, etc.
+
+* Useful Highlighting:: Highlighting provides useful information.
+* code:: Indicating program code.
+* kbd:: Showing keyboard input.
+* key:: Specifying keys.
+* samp:: A literal sequence of characters.
+* verb:: A verbatim sequence of characters.
+* var:: Indicating metasyntactic variables.
+* env:: Indicating environment variables.
+* file:: Indicating file names.
+* command:: Indicating command names.
+* option:: Indicating option names.
+* dfn:: Specifying definitions.
+* cite:: Referring to books not in the Info system.
+* abbr:: Indicating abbreviations.
+* acronym:: Indicating acronyms.
+* indicateurl:: Indicating a World Wide Web reference.
+* email:: Indicating an electronic mail address.
+
+Emphasizing Text
+
+* emph & strong:: How to emphasize text in Texinfo.
+* Smallcaps:: How to use the small caps font.
+* Fonts:: Various font commands for printed output.
+
+Quotations and Examples
+
+* Block Enclosing Commands:: Different constructs for different purposes.
+* quotation:: Writing a quotation.
+* example:: Writing an example in a fixed-width font.
+* verbatim:: Writing a verbatim example.
+* verbatiminclude:: Including a file verbatim.
+* lisp:: Illustrating Lisp code.
+* small:: Examples in a smaller font.
+* display:: Writing an example in the current font.
+* format:: Writing an example without narrowed margins.
+* exdent:: Undo indentation on a line.
+* flushleft & flushright:: Pushing text flush left or flush right.
+* noindent:: Preventing paragraph indentation.
+* indent:: Forcing paragraph indentation.
+* cartouche:: Drawing rounded rectangles around examples.
+
+Lists and Tables
+
+* Introducing Lists:: Texinfo formats lists for you.
+* itemize:: How to construct a simple list.
+* enumerate:: How to construct a numbered list.
+* Two-column Tables:: How to construct a two-column table.
+* Multi-column Tables:: How to construct generalized tables.
+
+Making a Two-column Table
+
+* table:: How to construct a two-column table.
+* ftable vtable:: Automatic indexing for two-column tables.
+* itemx:: How to put more entries in the first column.
+
+@code{@@multitable}: Multi-column Tables
+
+* Multitable Column Widths:: Defining multitable column widths.
+* Multitable Rows:: Defining multitable rows, with examples.
+
+Special Displays
+
+* Floats:: Figures, tables, and the like.
+* Images:: Including graphics and images.
+* Footnotes:: Writing footnotes.
+
+Floats
+
+* float:: Producing floating material.
+* caption shortcaption:: Specifying descriptions for floats.
+* listoffloats:: A table of contents for floats.
+
+Inserting Images
+
+* Image Syntax::
+* Image Scaling::
+
+Footnotes
+
+* Footnote Commands:: How to write a footnote in Texinfo.
+* Footnote Styles:: Controlling how footnotes appear in Info.
+
+Indices
+
+* Index Entries:: Choose different words for index entries.
+* Predefined Indices:: Use different indices for different kinds
+ of entries.
+* Indexing Commands:: How to make an index entry.
+* Combining Indices:: How to combine indices.
+* New Indices:: How to define your own indices.
+
+Combining Indices
+
+* syncodeindex:: How to merge two indices, using @code{@@code}
+ font for the merged-from index.
+* synindex:: How to merge two indices, using the
+ default font of the merged-to index.
+
+Special Insertions
+
+* Atsign Braces Comma:: Inserting @@ and @{@} and ,.
+* Inserting Space:: How to insert the right amount of space
+ within a sentence.
+* Inserting Accents:: How to insert accents and special characters.
+* Dots Bullets:: How to insert dots and bullets.
+* TeX and copyright:: How to insert the @TeX{} logo
+ and the copyright symbol.
+* euro:: How to insert the Euro currency symbol.
+* pounds:: How to insert the pounds currency symbol.
+* minus:: How to insert a minus sign.
+* math:: How to format a mathematical expression.
+* Glyphs:: How to indicate results of evaluation,
+ expansion of macros, errors, etc.
+
+Inserting @@ and @{@} and @comma{}
+
+* Inserting an Atsign::
+* Inserting Braces::
+* Inserting a Comma::
+
+Inserting Space
+
+* Not Ending a Sentence:: Sometimes a . doesn't end a sentence.
+* Ending a Sentence:: Sometimes it does.
+* Multiple Spaces:: Inserting multiple spaces.
+* dmn:: How to format a dimension.
+
+Inserting Ellipsis and Bullets
+
+* dots:: How to insert dots @dots{}
+* bullet:: How to insert a bullet.
+
+Inserting @TeX{} and Legal Symbols: @copyright{}, @registeredsymbol{}
+
+* tex:: The @TeX{} logos.
+* copyright symbol:: The copyright symbol (c in a circle).
+* registered symbol:: The registered symbol (R in a circle).
+
+Glyphs for Examples
+
+* Glyphs Summary::
+* result:: How to show the result of expression.
+* expansion:: How to indicate an expansion.
+* Print Glyph:: How to indicate printed output.
+* Error Glyph:: How to indicate an error message.
+* Equivalence:: How to indicate equivalence.
+* Point Glyph:: How to indicate the location of point.
+
+Glyphs Summary
+
+* result::
+* expansion::
+* Print Glyph::
+* Error Glyph::
+* Equivalence::
+* Point Glyph::
+
+Forcing and Preventing Breaks
+
+* Break Commands:: Summary of break-related commands.
+* Line Breaks:: Forcing line breaks.
+* - and hyphenation:: Helping @TeX{} with hyphenation points.
+* w:: Preventing unwanted line breaks in text.
+* tie:: Inserting an unbreakable but varying space.
+* sp:: Inserting blank lines.
+* page:: Forcing the start of a new page.
+* group:: Preventing unwanted page breaks.
+* need:: Another way to prevent unwanted page breaks.
+
+Definition Commands
+
+* Def Cmd Template:: Writing descriptions using definition commands.
+* Def Cmd Continuation Lines:: Continuing the heading over source lines.
+* Optional Arguments:: Handling optional and repeated arguments.
+* deffnx:: Group two or more `first' lines.
+* Def Cmds in Detail:: Reference for all the definition commands.
+* Def Cmd Conventions:: Conventions for writing definitions.
+* Sample Function Definition:: An example.
+
+The Definition Commands
+
+* Functions Commands:: Commands for functions and similar entities.
+* Variables Commands:: Commands for variables and similar entities.
+* Typed Functions:: Commands for functions in typed languages.
+* Typed Variables:: Commands for variables in typed languages.
+* Data Types:: The definition command for data types.
+* Abstract Objects:: Commands for object-oriented programming.
+
+Object-Oriented Programming
+
+* Variables: Object-Oriented Variables.
+* Methods: Object-Oriented Methods.
+
+Conditionally Visible Text
+
+* Conditional Commands:: Text for a given format.
+* Conditional Not Commands:: Text for any format other than a given one.
+* Raw Formatter Commands:: Using raw formatter commands.
+* set clear value:: Variable tests and substitutions.
+* Conditional Nesting:: Using conditionals inside conditionals.
+
+@code{@@set}, @code{@@clear}, and @code{@@value}
+
+* set value:: Expand a flag variable to a string.
+* ifset ifclear:: Format a region if a flag is set.
+* value Example:: An easy way to update edition information.
+
+Internationalization
+
+* documentlanguage:: Declaring the current language.
+* documentencoding:: Declaring the input encoding.
+
+Defining New Texinfo Commands
+
+* Defining Macros:: Defining and undefining new commands.
+* Invoking Macros:: Using a macro, once you've defined it.
+* Macro Details:: Limitations of Texinfo macros.
+* alias:: Command aliases.
+* definfoenclose:: Customized highlighting.
+
+Formatting and Printing Hardcopy
+
+* Use TeX:: Use @TeX{} to format for hardcopy.
+* Format with tex/texindex:: How to format with explicit shell commands.
+* Format with texi2dvi:: A simpler way to format.
+* Print with lpr:: How to print.
+* Within Emacs:: How to format and print from an Emacs shell.
+* Texinfo Mode Printing:: How to format and print in Texinfo mode.
+* Compile-Command:: How to print using Emacs's compile command.
+* Requirements Summary:: @TeX{} formatting requirements summary.
+* Preparing for TeX:: What to do before you use @TeX{}.
+* Overfull hboxes:: What are and what to do with overfull hboxes.
+* smallbook:: How to print small format books and manuals.
+* A4 Paper:: How to print on A4 or A5 paper.
+* pagesizes:: How to print with customized page sizes.
+* Cropmarks and Magnification:: How to print marks to indicate the size
+ of pages and how to print scaled up output.
+* PDF Output:: Portable Document Format output.
+* Obtaining TeX:: How to Obtain @TeX{}.
+
+Creating and Installing Info Files
+
+* Creating an Info File::
+* Installing an Info File::
+
+Creating an Info File
+
+* makeinfo advantages:: @code{makeinfo} provides better error checking.
+* Invoking makeinfo:: How to run @code{makeinfo} from a shell.
+* makeinfo options:: Specify fill-column and other options.
+* Pointer Validation:: How to check that pointers point somewhere.
+* makeinfo in Emacs:: How to run @code{makeinfo} from Emacs.
+* texinfo-format commands:: Two Info formatting commands written
+ in Emacs Lisp are an alternative
+ to @code{makeinfo}.
+* Batch Formatting:: How to format for Info in Emacs Batch mode.
+* Tag and Split Files:: How tagged and split files help Info
+ to run better.
+
+Installing an Info File
+
+* Directory File:: The top level menu for all Info files.
+* New Info File:: Listing a new Info file.
+* Other Info Directories:: How to specify Info files that are
+ located in other directories.
+* Installing Dir Entries:: How to specify what menu entry to add
+ to the Info directory.
+* Invoking install-info:: @code{install-info} options.
+
+Generating HTML
+
+* HTML Translation:: Details of the HTML output.
+* HTML Splitting:: How HTML output is split.
+* HTML CSS:: Influencing HTML output with Cascading Style Sheets.
+* HTML Xref:: Cross-references in HTML output.
+
+HTML Cross-references
+
+* Link Basics: HTML Xref Link Basics.
+* Node Expansion: HTML Xref Node Name Expansion.
+* Command Expansion: HTML Xref Command Expansion.
+* 8-bit Expansion: HTML Xref 8-bit Character Expansion.
+* Mismatch: HTML Xref Mismatch.
+
+@@-Command List
+
+* Command Syntax:: General syntax for varieties of @@-commands.
+
+Sample Texinfo Files
+
+* Short Sample Texinfo File::
+* GNU Sample Texts::
+* Verbatim Copying License::
+* All-permissive Copying License::
+
+Copying This Manual
+
+* GNU Free Documentation License:: License for copying this manual.
+
+Include Files
+
+* Using Include Files:: How to use the @code{@@include} command.
+* texinfo-multiple-files-update:: How to create and update nodes and
+ menus when using included files.
+* Include Files Requirements:: @code{texinfo-multiple-files-update} needs.
+* Sample Include File:: A sample outer file with included files
+ within it; and a sample included file.
+* Include Files Evolution:: How use of the @code{@@include} command
+ has changed over time.
+
+Page Headings
+
+* Headings Introduced:: Conventions for using page headings.
+* Heading Format:: Standard page heading formats.
+* Heading Choice:: How to specify the type of page heading.
+* Custom Headings:: How to create your own headings and footings.
+
+Formatting Mistakes
+
+* makeinfo Preferred:: @code{makeinfo} finds errors.
+* Debugging with Info:: How to catch errors with Info formatting.
+* Debugging with TeX:: How to catch errors with @TeX{} formatting.
+* Using texinfo-show-structure:: How to use @code{texinfo-show-structure}.
+* Using occur:: How to list all lines containing a pattern.
+* Running Info-Validate:: How to find badly referenced nodes.
+
+Finding Badly Referenced Nodes
+
+* Using Info-validate:: How to run @code{Info-validate}.
+* Unsplit:: How to create an unsplit file.
+* Tagifying:: How to tagify a file.
+* Splitting:: How to split a file manually.
+
+Copying This Manual
+
+* GNU Free Documentation License:: License for copying this manual.
+
+@end detailmenu
+@end menu
+
+@c Reward readers for getting to the end of the menu :).
+@c Contributed by Arnold Robbins.
+@quotation
+Documentation is like sex: when it is good, it is very, very good; and
+when it is bad, it is better than nothing.
+---Dick Brandon
+@end quotation
+
+
+@node Copying Conditions
+@unnumbered Texinfo Copying Conditions
+@cindex Copying conditions
+@cindex Conditions for copying Texinfo
+
+The programs currently being distributed that relate to Texinfo include
+@code{makeinfo}, @code{info}, @code{texindex}, and @file{texinfo.tex}.
+These programs are @dfn{free}; this means that everyone is free to use
+them and free to redistribute them on a free basis. The Texinfo-related
+programs are not in the public domain; they are copyrighted and there
+are restrictions on their distribution, but these restrictions are
+designed to permit everything that a good cooperating citizen would want
+to do. What is not allowed is to try to prevent others from further
+sharing any version of these programs that they might get from you.
+
+Specifically, we want to make sure that you have the right to give away
+copies of the programs that relate to Texinfo, that you receive source
+code or else can get it if you want it, that you can change these
+programs or use pieces of them in new free programs, and that you know
+you can do these things.
+
+To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies of the Texinfo related programs, you must give the recipients all
+the rights that you have. You must make sure that they, too, receive or
+can get the source code. And you must tell them their rights.
+
+Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for the programs that relate to Texinfo.
+If these programs are modified by someone else and passed on, we want
+their recipients to know that what they have is not what we distributed,
+so that any problems introduced by others will not reflect on our
+reputation.
+
+The precise conditions of the licenses for the programs currently being
+distributed that relate to Texinfo are found in the General Public
+Licenses that accompany them. This manual specifically is covered by
+the GNU Free Documentation License (@pxref{GNU Free Documentation
+License}).
+
+
+@node Overview
+@chapter Overview of Texinfo
+@cindex Overview of Texinfo
+@cindex Texinfo overview
+
+@dfn{Texinfo}@footnote{The first syllable of ``Texinfo'' is pronounced
+like ``speck'', not ``hex''. This odd pronunciation is derived from,
+but is not the same as, the pronunciation of @TeX{}. In the word
+@TeX{}, the @samp{X} is actually the Greek letter ``chi'' rather than
+the English letter ``ex''. Pronounce @TeX{} as if the @samp{X} were the
+last sound in the name `Bach'; but pronounce Texinfo as if the @samp{x}
+were a `k'. Spell ``Texinfo'' with a capital ``T'' and the other
+letters in lower case.} is a documentation system that uses a single
+source file to produce both online information and printed output. This
+means that instead of writing two different documents, one for the
+online information and the other for a printed work, you need write only
+one document. Therefore, when the work is revised, you need revise only
+that one document.
+
+@menu
+* Reporting Bugs:: Submitting effective bug reports.
+* Using Texinfo:: Create printed or online output.
+* Output Formats:: Overview of the supported output formats.
+* Info Files:: What is an Info file?
+* Printed Books:: Characteristics of a printed book or manual.
+* Formatting Commands:: @@-commands are used for formatting.
+* Conventions:: General rules for writing a Texinfo file.
+* Comments:: Writing comments and ignored text in general.
+* Minimum:: What a Texinfo file must have.
+* Six Parts:: Usually, a Texinfo file has six parts.
+* Short Sample:: A short sample Texinfo file.
+* History:: Acknowledgements, contributors and genesis.
+@end menu
+
+
+@node Reporting Bugs
+@section Reporting Bugs
+
+@cindex Bugs, reporting
+@cindex Suggestions for Texinfo, making
+@cindex Reporting bugs
+We welcome bug reports and suggestions for any aspect of the Texinfo system,
+programs, documentation, installation, anything. Please email them to
+@email{bug-texinfo@@gnu.org}. You can get the latest version of Texinfo
+from @uref{ftp://ftp.gnu.org/gnu/texinfo/} and its mirrors worldwide.
+
+@cindex Checklist for bug reports
+For bug reports, please include enough information for the maintainers
+to reproduce the problem. Generally speaking, that means:
+
+@itemize @bullet
+@item the version number of Texinfo and the program(s) or manual(s) involved.
+@item hardware and operating system names and versions.
+@item the contents of any input files necessary to reproduce the bug.
+@item a description of the problem and samples of any erroneous output.
+@item any unusual options you gave to @command{configure}.
+@item anything else that you think would be helpful.
+@end itemize
+
+When in doubt whether something is needed or not, include it. It's
+better to include too much than to leave out something important.
+
+@cindex Patches, contributing
+Patches are most welcome; if possible, please make them with
+@samp{@w{diff -c}} (@pxref{Top,, Overview, diff, Comparing and Merging
+Files}) and include @file{ChangeLog} entries (@pxref{Change Log,,,
+emacs, The GNU Emacs Manual}).
+
+When sending patches, if possible please do not encode or split them in
+any way; it's much easier to deal with one plain text message, however
+large, than many small ones. @uref{ftp://ftp.gnu.org/gnu/sharutils/,
+GNU shar} is a convenient way of packaging multiple and/or binary files
+for email.
+
+
+@node Using Texinfo
+@section Using Texinfo
+
+@cindex Using Texinfo in general
+@cindex Texinfo, introduction to
+@cindex Introduction to Texinfo
+
+Using Texinfo, you can create a printed document (via the @TeX{}
+typesetting system) the normal features of a book, including chapters,
+sections, cross references, and indices. From the same Texinfo source
+file, you can create an Info file with special features to make
+documentation browsing easy. You can also create from that same
+source file an HTML output file suitable for use with a web browser,
+or an XML file. See the next section (@pxref{Output Formats}) for
+details and the exact commands to generate output from the source.
+
+@TeX{} works with virtually all printers; Info works with virtually all
+computer terminals; the HTML output works with virtually all web
+browsers. Thus Texinfo can be used by almost any computer user.
+
+@cindex Source file format
+A Texinfo source file is a plain @sc{ascii} file containing text
+interspersed with @dfn{@@-commands} (words preceded by an @samp{@@})
+that tell the typesetting and formatting programs what to do. You can
+edit a Texinfo file with any text editor, but it is especially
+convenient to use GNU Emacs since that editor has a special mode,
+called Texinfo mode, that provides various Texinfo-related features.
+(@xref{Texinfo Mode}.)
+
+You can use Texinfo to create both online help and printed manuals;
+moreover, Texinfo is freely redistributable. For these reasons, Texinfo
+is the official documentation format of the GNU project. More
+information is available at the @uref{http://www.gnu.org/doc/, GNU
+documentation web page}.
+
+
+@node Output Formats
+@section Output Formats
+@cindex Output formats
+@cindex Back-end output formats
+
+Here is a brief overview of the output formats currently supported by
+Texinfo.
+
+@table @asis
+@item Info
+@cindex Info output
+(Generated via @command{makeinfo}.) This format is essentially a
+plain text transliteration of the Texinfo source. It adds a few
+control characters to separate nodes and provide navigational
+information for menus, cross-references, indices, and so on. See the
+next section (@pxref{Info Files}) for more details on this format.
+The Emacs Info subsystem (@pxref{Top,,Getting Started,info, Info}),
+and the standalone @command{info} program (@pxref{Top
+,, Info Standalone, info-stnd, GNU Info}), among others, can read these
+files. @xref{Creating and Installing Info Files}.
+
+@item Plain text
+@cindex Plain text output
+(Generated via @command{makeinfo --no-headers}.) This is almost the
+same as Info output, except the navigational control characters are
+omitted. Also, standard output is used by default.
+
+@item HTML
+@cindex HTML output
+@cindex W3 consortium
+@cindex Mozilla
+@cindex Lynx
+@cindex Emacs-W3
+(Generated via @command{makeinfo --html}.) This is the Hyper Text
+Markup Language that has become the most commonly used language for
+writing documents on the World Wide Web. Web browsers, such as
+Mozilla, Lynx, and Emacs-W3, can render this language online. There
+are many versions of HTML; @command{makeinfo} tries to use a subset
+of the language that can be interpreted by any common browser. For
+details of the HTML language and much related information, see
+@uref{http://www.w3.org/MarkUp/}. @xref{Generating HTML}.
+
+@item DVI
+@cindex DVI output
+@pindex dvips
+@pindex xdvi
+(Generated via @command{texi2dvi}.) This DeVice Independent binary
+format is output by the @TeX{} typesetting program
+(@uref{http://tug.org}). This is then read by a DVI `driver', which
+writes the actual device-specific commands that can be viewed or
+printed, notably Dvips for translation to PostScript (@pxref{Invoking
+Dvips,,, dvips, Dvips}) and Xdvi for viewing on an X display
+(@uref{http://sourceforge.net/projects/xdvi/}). @xref{Hardcopy}.
+
+Be aware that the Texinfo language is very different from and much
+stricter than @TeX{}'s usual languages, plain @TeX{} and @LaTeX{}.
+For more information on @TeX{} in general, please see the book
+@cite{@TeX{} for the Impatient}, available from
+@uref{http://savannah.gnu.org/projects/teximpatient}.
+
+@item PDF
+@cindex PDF output
+@cindex Beebe, Nelson
+@pindex pdftex
+(Generated via @command{texi2dvi --pdf} or @command{texi2pdf}.) This
+was developed by Adobe Systems for portable document interchange,
+based on their previous PostScript language. It can represent the exact
+appearance of a document, including fonts, and supporting arbitrary
+scaling. It is intended to be platform-independent and easily
+viewable, among other design goals; for a discussion, see
+@uref{http://tug.org/TUGboat/Articles/tb22-3/tb72beebeI.pdf}. Texinfo
+uses the @command{pdftex} program, a variant of @TeX{}, to output PDF;
+see @uref{http://tug.org/applications/pdftex}. @xref{PDF Output}.
+
+@item XML
+@cindex XML output
+@cindex DTD, for Texinfo XML
+@pindex texinfo.dtd
+(Generated via @command{makeinfo --xml}.) XML is a generic syntax
+specification usable for any sort of content (see, for example,
+@uref{http://www.w3.org/XML/}). The @command{makeinfo} xml output,
+unlike all the formats above, interprets very little of the Texinfo
+source. Rather, it merely translates the Texinfo markup commands into
+XML syntax, for processing by further XML tools. The particular
+syntax output is defined in the file @file{texinfo.dtd} included in
+the Texinfo source distribution.
+
+@item Docbook
+@cindex Docbook output
+(Generated via @command{makeinfo --docbook}.) This is an XML-based
+format developed some years ago, primarily for technical
+documentation. It therefore bears some resemblance, in broad
+outlines, to Texinfo. See @uref{http://www.docbook.org}. If you want
+to convert from Docbook @emph{to} Texinfo, please see
+@uref{http://docbook2X.sourceforge.net}.
+
+@end table
+
+@cindex Man page output, not supported
+From time to time, proposals are made to generate traditional Unix man
+pages from Texinfo source. However, because man pages have a very
+strict conventional format, generating a good man page requires a
+completely different source than the typical Texinfo applications of
+writing a good user tutorial and/or a good reference manual. This
+makes generating man pages incompatible with the Texinfo design goal
+of not having to document the same information in different ways for
+different output formats. You might as well just write the man page
+directly.
+
+@pindex help2man
+@cindex O'Dea, Brendan
+Man pages still have their place, and if you wish to support them, you
+may find the program @command{help2man} to be useful; it generates a
+traditional man page from the @samp{--help} output of a program. In
+fact, this is currently used to generate man pages for the programs in
+the Texinfo distribution. It is GNU software written by Brendan
+O'Dea, available from @uref{ftp://ftp.gnu.org/gnu/help2man/}.
+
+@cindex Output formats, supporting more
+@cindex SGML-tools output format
+If you are a programmer and would like to contribute to the GNU project
+by implementing additional output formats for Texinfo, that would be
+excellent. But please do not write a separate translator texi2foo for
+your favorite format foo! That is the hard way to do the job, and makes
+extra work in subsequent maintenance, since the Texinfo language is
+continually being enhanced and updated. Instead, the best approach is
+modify @code{makeinfo} to generate the new format.
+
+
+@node Info Files
+@section Info Files
+@cindex Info files
+
+An Info file is a Texinfo file formatted so that the Info documentation
+reading program can operate on it. (@code{makeinfo}
+and @code{texinfo-format-buffer} are two commands that convert a Texinfo file
+into an Info file.)
+
+Info files are divided into pieces called @dfn{nodes}, each of which
+contains the discussion of one topic. Each node has a name, and
+contains both text for the user to read and pointers to other nodes,
+which are identified by their names. The Info program displays one node
+at a time, and provides commands with which the user can move to other
+related nodes.
+
+@xref{Top,,, info, GNU Info}, for more information about using Info.
+
+Each node of an Info file may have any number of child nodes that
+describe subtopics of the node's topic. The names of child
+nodes are listed in a @dfn{menu} within the parent node; this
+allows you to use certain Info commands to move to one of the child
+nodes. Generally, an Info file is organized like a book. If a node
+is at the logical level of a chapter, its child nodes are at the level
+of sections; likewise, the child nodes of sections are at the level
+of subsections.
+
+All the children of any one parent are linked together in a
+bidirectional chain of `Next' and `Previous' pointers. The `Next'
+pointer provides a link to the next section, and the `Previous' pointer
+provides a link to the previous section. This means that all the nodes
+that are at the level of sections within a chapter are linked together.
+Normally the order in this chain is the same as the order of the
+children in the parent's menu. Each child node records the parent node
+name as its `Up' pointer. The last child has no `Next' pointer, and the
+first child has the parent both as its `Previous' and as its `Up'
+pointer.@footnote{In some documents, the first child has no `Previous'
+pointer. Occasionally, the last child has the node name of the next
+following higher level node as its `Next' pointer.}
+
+The book-like structuring of an Info file into nodes that correspond
+to chapters, sections, and the like is a matter of convention, not a
+requirement. The `Up', `Previous', and `Next' pointers of a node can
+point to any other nodes, and a menu can contain any other nodes.
+Thus, the node structure can be any directed graph. But it is usually
+more comprehensible to follow a structure that corresponds to the
+structure of chapters and sections in a printed book or report.@refill
+
+In addition to menus and to `Next', `Previous', and `Up' pointers, Info
+provides pointers of another kind, called references, that can be
+sprinkled throughout the text. This is usually the best way to
+represent links that do not fit a hierarchical structure.@refill
+
+Usually, you will design a document so that its nodes match the
+structure of chapters and sections in the printed output. But
+occasionally there are times when this is not right for the material
+being discussed. Therefore, Texinfo uses separate commands to specify
+the node structure for the Info file and the section structure for the
+printed output.@refill
+
+Generally, you enter an Info file through a node that by convention is
+named `Top'. This node normally contains just a brief summary of the
+file's purpose, and a large menu through which the rest of the file is
+reached. From this node, you can either traverse the file
+systematically by going from node to node, or you can go to a specific
+node listed in the main menu, or you can search the index menus and then
+go directly to the node that has the information you want. Alternatively,
+with the standalone Info program, you can specify specific menu items on
+the command line (@pxref{Top,,, info, Info}).
+
+If you want to read through an Info file in sequence, as if it were a
+printed manual, you can hit @key{SPC} repeatedly, or you get the whole
+file with the advanced Info command @kbd{g *}. (@inforef{Advanced,
+Advanced Info commands, info}.)@refill
+
+@c !!! dir file may be located in one of many places:
+@c /usr/local/emacs/info mentioned in info.c DEFAULT_INFOPATH
+@c /usr/local/lib/emacs/info mentioned in info.c DEFAULT_INFOPATH
+@c /usr/gnu/info mentioned in info.c DEFAULT_INFOPATH
+@c /usr/local/info
+@c /usr/local/lib/info
+The @file{dir} file in the @file{info} directory serves as the
+departure point for the whole Info system. From it, you can reach the
+`Top' nodes of each of the documents in a complete Info system.@refill
+
+@cindex URI syntax for Info
+If you wish to refer to an Info file in a URI, you can use the
+(unofficial) syntax exemplified in the following. This works with
+Emacs/W3, for example:
+@example
+info:///usr/info/emacs#Dissociated%20Press
+info:emacs#Dissociated%20Press
+info://localhost/usr/info/emacs#Dissociated%20Press
+@end example
+
+The @command{info} program itself does not follow URI's of any kind.
+
+
+@node Printed Books
+@section Printed Books
+@cindex Printed book and manual characteristics
+@cindex Manual characteristics, printed
+@cindex Book characteristics, printed
+@cindex Texinfo printed book characteristics
+@cindex Characteristics, printed books or manuals
+
+@cindex Knuth, Donald
+A Texinfo file can be formatted and typeset as a printed book or manual.
+To do this, you need @TeX{}, a powerful, sophisticated typesetting
+program written by Donald Knuth.@footnote{You can also use the
+@pindex texi2roff@r{, unsupported software}
+@uref{ftp://tug.org/texi2roff.tar.gz, @code{texi2roff}} program if you
+do not have @TeX{}; since Texinfo is designed for use with @TeX{},
+@code{texi2roff} is not described here. @code{texi2roff} is not part of
+the standard GNU distribution and is not maintained or up-to-date with
+all the Texinfo features described in this manual.}
+
+A Texinfo-based book is similar to any other typeset, printed work: it
+can have a title page, copyright page, table of contents, and preface,
+as well as chapters, numbered or unnumbered sections and subsections,
+page headers, cross references, footnotes, and indices.@refill
+
+You can use Texinfo to write a book without ever having the intention
+of converting it into online information. You can use Texinfo for
+writing a printed novel, and even to write a printed memo, although
+this latter application is not recommended since electronic mail is so
+much easier.@refill
+
+@TeX{} is a general purpose typesetting program. Texinfo provides a
+file @file{texinfo.tex} that contains information (definitions or
+@dfn{macros}) that @TeX{} uses when it typesets a Texinfo file.
+(@file{texinfo.tex} tells @TeX{} how to convert the Texinfo @@-commands
+to @TeX{} commands, which @TeX{} can then process to create the typeset
+document.) @file{texinfo.tex} contains the specifications for printing
+a document. You can get the latest version of @file{texinfo.tex} from
+@uref{ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex}.
+
+In the United States, documents are most often printed on 8.5 inch by 11
+inch pages (216@dmn{mm} by 280@dmn{mm}); this is the default size. But
+you can also print for 7 inch by 9.25 inch pages (178@dmn{mm} by
+235@dmn{mm}, the @code{@@smallbook} size; or on A4 or A5 size paper
+(@code{@@afourpaper}, @code{@@afivepaper}). (@xref{smallbook, ,
+Printing ``Small'' Books}. Also, see @ref{A4 Paper, ,Printing on A4
+Paper}.)
+
+By changing the parameters in @file{texinfo.tex}, you can change the
+size of the printed document. In addition, you can change the style in
+which the printed document is formatted; for example, you can change the
+sizes and fonts used, the amount of indentation for each paragraph, the
+degree to which words are hyphenated, and the like. By changing the
+specifications, you can make a book look dignified, old and serious, or
+light-hearted, young and cheery.
+
+@TeX{} is freely distributable. It is written in a superset of Pascal
+called WEB and can be compiled either in Pascal or (by using a
+conversion program that comes with the @TeX{} distribution) in C.
+(@xref{TeX Mode, ,@TeX{} Mode, emacs, The GNU Emacs Manual}, for information
+about @TeX{}.)@refill
+
+@TeX{} is very powerful and has a great many features. Because a
+Texinfo file must be able to present information both on a
+character-only terminal in Info form and in a typeset book, the
+formatting commands that Texinfo supports are necessarily limited.
+
+To get a copy of @TeX{}, see
+@ref{Obtaining TeX, , How to Obtain @TeX{}}.
+
+
+@node Formatting Commands
+@section @@-commands
+@cindex @@-commands
+@cindex Formatting commands
+
+In a Texinfo file, the commands that tell @TeX{} how to typeset the
+printed manual and tell @code{makeinfo} and
+@code{texinfo-format-buffer} how to create an Info file are preceded
+by @samp{@@}; they are called @dfn{@@-commands}. For example,
+@code{@@node} is the command to indicate a node and @code{@@chapter}
+is the command to indicate the start of a chapter.@refill
+
+@quotation Note
+Almost all @@ command names are entirely lower case.
+@end quotation
+
+The Texinfo @@-commands are a strictly limited set of constructs. The
+strict limits make it possible for Texinfo files to be understood both
+by @TeX{} and by the code that converts them into Info files. You can
+display Info files on any terminal that displays alphabetic and
+numeric characters. Similarly, you can print the output generated by
+@TeX{} on a wide variety of printers.@refill
+
+Depending on what they do or what arguments@footnote{The word
+@dfn{argument} comes from the way it is used in mathematics and does not
+refer to a dispute between two people; it refers to the information
+presented to the command. According to the @cite{Oxford English
+Dictionary}, the word derives from the Latin for @dfn{to make clear,
+prove}; thus it came to mean `the evidence offered as proof', which is
+to say, `the information offered', which led to its mathematical
+meaning. In its other thread of derivation, the word came to mean `to
+assert in a manner against which others may make counter assertions',
+which led to the meaning of `argument' as a dispute.} they take, you
+need to write @@-commands on lines of their own or as part of
+sentences:
+
+@itemize @bullet
+@item
+Write a command such as @code{@@quotation} at the beginning of a line as
+the only text on the line. (@code{@@quotation} begins an indented
+environment.)
+
+@item
+Write a command such as @code{@@chapter} at the beginning of a line
+followed by the command's arguments, in this case the chapter title, on
+the rest of the line. (@code{@@chapter} creates chapter titles.)@refill
+
+@item
+Write a command such as @code{@@dots@{@}} wherever you wish but usually
+within a sentence. (@code{@@dots@{@}} creates dots @dots{})@refill
+
+@item
+Write a command such as @code{@@code@{@var{sample-code}@}} wherever you
+wish (but usually within a sentence) with its argument,
+@var{sample-code} in this example, between the braces. (@code{@@code}
+marks text as being code.)@refill
+
+@item
+Write a command such as @code{@@example} on a line of its own; write the
+body-text on following lines; and write the matching @code{@@end}
+command, @code{@@end example} in this case, on a line of its own
+after the body-text. (@code{@@example} @dots{} @code{@@end example}
+indents and typesets body-text as an example.) It's usually ok to
+indent environment commands like this, but in complicated and
+hard-to-define circumstances the extra spaces cause extra space to
+appear in the output, so beware.
+@end itemize
+
+@noindent
+@cindex Braces, when to use
+As a general rule, a command requires braces if it mingles among other
+text; but it does not need braces if it starts a line of its own. The
+non-alphabetic commands, such as @code{@@:}, are exceptions to the rule;
+they do not need braces.@refill
+
+As you gain experience with Texinfo, you will rapidly learn how to
+write the different commands: the different ways to write commands
+actually make it easier to write and read Texinfo files than if all
+commands followed exactly the same syntax. @xref{Command Syntax, ,
+@@-Command Syntax}, for all the details.
+
+
+@node Conventions
+@section General Syntactic Conventions
+@cindex General syntactic conventions
+@cindex Syntactic conventions
+@cindex Conventions, syntactic
+@cindex Characters, basic input
+
+This section describes the general conventions used in all Texinfo documents.
+
+@itemize @bullet
+@item
+@cindex Source files, characters used
+All printable @sc{ascii} characters except @samp{@@}, @samp{@{} and
+@samp{@}} can appear in a Texinfo file and stand for themselves.
+@samp{@@} is the escape character which introduces commands, while
+@samp{@{} and @samp{@}} are used to surround arguments to certain
+commands. To put one of these special characters into the document, put
+an @samp{@@} character in front of it, like this: @samp{@@@@},
+@samp{@@@{}, and @samp{@@@}}.
+
+@item
+@cindex Paragraph separator
+@cindex Blank lines, as paragraph separator
+@cindex Newlines, as blank lines
+Separate paragraphs with one or more blank lines. Currently Texinfo
+only recognizes newline characters as end of line, not the CRLF
+sequence used on some systems; so a @dfn{blank line} means exactly two
+consecutive newlines. Sometimes blank lines are useful or convenient
+in other cases as well; you can use the @code{@@noindent} to inhibit
+paragraph indentation if required (@pxref{noindent,,@code{@@noindent}}).
+
+@item
+@cindex Quotation characters (`'), in source
+Use doubled single-quote characters to begin and end quotations:
+@w{@t{`@w{}`@dots{}'@w{}'}}. @TeX{} converts two single quotes to
+left- and right-hand doubled quotation marks,
+@c this comes out as "like this" in Info, which is just confusing.
+@iftex
+``like this'',
+@end iftex
+and Info converts doubled single-quote characters to @sc{ascii}
+double-quotes: @w{@t{`@w{}`@dots{}'@w{}'}} becomes @w{@t{"@dots{}"}}.
+
+You may occasionally need to produce two consecutive single quotes;
+for example, in documenting a computer language such as Maxima where
+@t{'@w{}'} is a valid command. You can do this with the input
+@t{'@@w@{@}'}; the empty @code{@@w} command stops the combination into
+the double-quote characters.
+
+@cindex Unicode quotation characters
+@cindex Grave accent, vs.@: left quote
+The left quote character (@t{`}, ASCII code 96) used in Texinfo is a
+grave accent in ANSI and ISO character set standards. We use it as a
+quote character because that is how @TeX{} is set up, by default. We
+hope to eventually support the various quotation characters in
+Unicode.
+
+@item
+@cindex Multiple dashes in source
+@cindex Dashes in source
+@cindex Hyphens in source, two or three in a row
+@cindex Em dash, producing
+@cindex En dash, producing
+Use three hyphens in a row, @samp{---}, to produce a long dash---like
+this (called an @dfn{em dash}), used for punctuation in sentences.
+Use two hyphens, @samp{--}, to produce a medium dash (called an
+@dfn{en dash}), used primarily for numeric ranges, as in ``June
+25--26''. Use a single hyphen, @samp{-}, to produce a standard hyphen
+used in compound words. For display on the screen, Info reduces three
+hyphens to two and two hyphens to one (not transitively!). Of course,
+any number of hyphens in the source remain as they are in literal
+contexts, such as @code{@@code} and @code{@@example}.
+
+@item
+@cindex Tabs; don't use!
+@strong{Caution:} Last and most important, do not use tab characters
+in a Texinfo file (except in verbatim modes)! @TeX{} uses
+variable-width fonts, which means that it is impractical at best to
+define a tab to work in all circumstances. Consequently, @TeX{}
+treats tabs like single spaces, and that is not what they look like in
+the source. Furthermore, @code{makeinfo} does nothing special with
+tabs, and thus a tab character in your input file will usually appear
+differently in the output.
+
+@noindent
+To avoid this problem, Texinfo mode causes GNU Emacs to insert multiple
+spaces when you press the @key{TAB} key.
+
+@noindent
+Also, you can run @code{untabify} in Emacs to convert tabs in a region
+to multiple spaces, or use the @code{unexpand} command from the shell.
+
+@end itemize
+
+@node Comments
+@section Comments
+
+@cindex Comments
+@findex comment
+@findex c @r{(comment)}
+
+You can write comments in a Texinfo file that will not appear in
+either the Info file or the printed manual by using the
+@code{@@comment} command (which may be abbreviated to @code{@@c}).
+Such comments are for the person who revises the Texinfo file. All the
+text on a line that follows either @code{@@comment} or @code{@@c} is a
+comment; the rest of the line does not appear in either the Info file
+or the printed manual.
+
+Often, you can write the @code{@@comment} or @code{@@c} in the middle of
+a line, and only the text that follows after the @code{@@comment} or
+@code{@@c} command does not appear; but some commands, such as
+@code{@@settitle} and @code{@@setfilename}, work on a whole line. You
+cannot use @code{@@comment} or @code{@@c} in a line beginning with such
+a command.
+
+@cindex Ignored text
+@cindex Unprocessed text
+@findex ignore
+You can write long stretches of text that will not appear in either
+the Info file or the printed manual by using the @code{@@ignore} and
+@code{@@end ignore} commands. Write each of these commands on a line
+of its own, starting each command at the beginning of the line. Text
+between these two commands does not appear in the processed output.
+You can use @code{@@ignore} and @code{@@end ignore} for writing
+comments.
+
+Text enclosed by @code{@@ignore} or by failing @code{@@ifset} or
+@code{@@ifclear} conditions is ignored in the sense that it will not
+contribute to the formatted output. However, @TeX{} and makeinfo must
+still parse the ignored text, in order to understand when to @emph{stop}
+ignoring text from the source file; that means that you may still get
+error messages if you have invalid Texinfo commands within ignored text.
+
+
+@node Minimum
+@section What a Texinfo File Must Have
+@cindex Minimal Texinfo file (requirements)
+@cindex Must have in Texinfo file
+@cindex Required in Texinfo file
+@cindex Texinfo file minimum
+
+By convention, the namea of a Texinfo file ends with (in order of
+preference) one of the extensions @file{.texinfo}, @file{.texi},
+@file{.txi}, or @file{.tex}. The longer extensions are preferred since
+they describe more clearly to a human reader the nature of the file.
+The shorter extensions are for operating systems that cannot handle long
+file names.
+
+In order to be made into a printed manual and an Info file, a Texinfo
+file @strong{must} begin with lines like this:
+
+@example
+@group
+\input texinfo
+@@setfilename @var{info-file-name}
+@@settitle @var{name-of-manual}
+@end group
+@end example
+
+@noindent
+The contents of the file follow this beginning, and then you
+@strong{must} end a Texinfo file with a line like this:
+
+@example
+@@bye
+@end example
+
+@findex \input @r{(raw @TeX{} startup)}
+@noindent
+Here's an explanation:
+
+@itemize @bullet
+@item
+The @samp{\input texinfo} line tells @TeX{} to use the
+@file{texinfo.tex} file, which tells @TeX{} how to translate the Texinfo
+@@-commands into @TeX{} typesetting commands. (Note the use of the
+backslash, @samp{\}; this is correct for @TeX{}.)
+
+@item
+The @code{@@setfilename} line provides a name for the Info file and
+tells @TeX{} to open auxiliary files. @strong{All text before
+@code{@@setfilename} is ignored!}
+
+@item
+The @code{@@settitle} line specifies a title for the page headers (or
+footers) of the printed manual, and the default document description for
+the @samp{<head>} in HTML format. Strictly speaking, @code{@@settitle}
+is optional---if you don't mind your document being titled `Untitled'.
+
+@item
+The @code{@@bye} line at the end of the file on a line of its own tells
+the formatters that the file is ended and to stop formatting.
+
+@end itemize
+
+Typically, you will not use quite such a spare format, but will include
+mode setting and start-of-header and end-of-header lines at the
+beginning of a Texinfo file, like this:
+
+@example
+@group
+\input texinfo @@c -*-texinfo-*-
+@@c %**start of header
+@@setfilename @var{info-file-name}
+@@settitle @var{name-of-manual}
+@@c %**end of header
+@end group
+@end example
+
+@noindent
+In the first line, @samp{-*-texinfo-*-} causes Emacs to switch into
+Texinfo mode when you edit the file.
+
+The @code{@@c} lines which surround the @code{@@setfilename} and
+@code{@@settitle} lines are optional, but you need them in order to
+run @TeX{} or Info on just part of the file. (@xref{Start of Header}.)
+
+Furthermore, you will usually provide a Texinfo file with a title page,
+indices, and the like, all of which are explained in this manual. But
+the minimum, which can be useful for short documents, is just the three
+lines at the beginning and the one line at the end.
+
+
+@node Six Parts
+@section Six Parts of a Texinfo File
+
+Generally, a Texinfo file contains more than the minimal beginning and
+end described in the previous section---it usually contains the six
+parts listed below. These are described fully in the following sections.
+
+@table @r
+@item 1. Header
+The @dfn{Header} names the file, tells @TeX{} which definitions file to
+use, and other such housekeeping tasks.
+
+@item 2. Summary and Copyright
+The @dfn{Summary and Copyright} segment describes the document and
+contains the copyright notice and copying permissions. This is done
+with the @code{@@copying} command.
+
+@item 3. Title and Copyright
+The @dfn{Title and Copyright} segment contains the title and copyright
+pages for the printed manual. The segment must be enclosed between
+@code{@@titlepage} and @code{@@end titlepage} commands. The title and
+copyright page appear only in the printed manual.
+
+@item 4. `Top' Node and Master Menu
+The `Top' node starts off the online output; it does not appear in the
+printed manual. We recommend including the copying permissions here as
+well as the segments above. And it contains at least a top-level menu
+listing the chapters, and possibly a @dfn{Master Menu} listing all the
+nodes in the entire document.
+
+@item 5. Body
+The @dfn{Body} of the document is typically structured like a
+traditional book or encyclopedia, but it may be free form.
+
+@item 6. End
+The @dfn{End} segment contains commands for printing indices and
+generating the table of contents, and the @code{@@bye} command on a line
+of its own.
+@end table
+
+
+@node Short Sample
+@section A Short Sample Texinfo File
+@cindex Sample Texinfo file, with comments
+
+Here is a very short but complete Texinfo file, in the six conventional
+parts enumerated in the previous section, so you can see how Texinfo
+source appears in practice. The first three parts of the file, from
+@samp{\input texinfo} through to @samp{@@end titlepage}, look more
+intimidating than they are: most of the material is standard
+boilerplate; when writing a manual, you simply change the names as
+appropriate.
+
+@xref{Beginning a File}, for full documentation on the commands listed
+here. @xref{GNU Sample Texts}, for the full texts to be used in GNU
+manuals.
+
+In the following, the sample text is @emph{indented}; comments on it are
+not. The complete file, without interspersed comments, is shown in
+@ref{Short Sample Texinfo File}.
+
+@subheading Part 1: Header
+
+@noindent
+The header does not appear in either the Info file or the
+printed output. It sets various parameters, including the
+name of the Info file and the title used in the header.
+
+@example
+@group
+\input texinfo @@c -*-texinfo-*-
+@@c %**start of header
+@@setfilename sample.info
+@@settitle Sample Manual 1.0
+@@c %**end of header
+@end group
+@end example
+
+@subheading Part 2: Summary Description and Copyright
+
+@noindent
+A real manual includes more text here, according to the license under
+which it is distributed. @xref{GNU Sample Texts}.
+
+@example
+@group
+@@copying
+This is a short example of a complete Texinfo file, version 1.0.
+
+Copyright @@copyright@{@} 2004 Free Software Foundation, Inc.
+@@end copying
+@end group
+@end example
+
+@subheading Part 3: Titlepage, Contents, Copyright
+
+@noindent
+The titlepage segment does not appear in the online output, only in the
+printed manual. We use the @code{@@insertcopying} command to
+include the permission text from the previous section, instead of
+writing it out again; it is output on the back of the title page. The
+@code{@@contents} command generates a table of contents.
+
+@example
+@group
+@@titlepage
+@@title Sample Title
+@end group
+
+@group
+@@c The following two commands start the copyright page.
+@@page
+@@vskip 0pt plus 1filll
+@@insertcopying
+@@end titlepage
+@end group
+
+@@c Output the table of contents at the beginning.
+@@contents
+@end example
+
+@subheading Part 4: `Top' Node and Master Menu
+
+@noindent
+The `Top' node contains the master menu for the Info file. Since the
+printed manual uses a table of contents rather than a menu, it
+excludes the `Top' node. We also include the copying text again for
+the benefit of online readers. Since the copying text begins with
+a brief description of the manual, no other text is needed in this
+case. The @samp{@@top} command itself helps @command{makeinfo}
+determine the relationships between nodes.
+
+@example
+@@ifnottex
+@@node Top
+@@top Short Sample
+
+@@insertcopying
+@@end ifnottex
+
+@group
+@@menu
+* First Chapter:: The first chapter is the
+ only chapter in this sample.
+* Index:: Complete index.
+@@end menu
+@end group
+@end example
+
+
+@subheading Part 5: The Body of the Document
+
+@noindent
+The body segment contains all the text of the document, but not the
+indices or table of contents. This example illustrates a node and a
+chapter containing an enumerated list.
+
+@example
+@group
+@@node First Chapter
+@@chapter First Chapter
+
+@@cindex chapter, first
+@end group
+
+@group
+This is the first chapter.
+@@cindex index entry, another
+@end group
+
+@group
+Here is a numbered list.
+
+@@enumerate
+@@item
+This is the first item.
+
+@@item
+This is the second item.
+@@end enumerate
+@end group
+@end example
+
+
+@subheading Part 6: The End of the Document
+
+@noindent
+The end segment contains commands for generating an index in a node and
+unnumbered chapter of its own, and the @code{@@bye} command that marks
+the end of the document.
+
+@example
+@group
+@@node Index
+@@unnumbered Index
+@end group
+
+@group
+@@printindex cp
+
+@@bye
+@end group
+@end example
+
+
+@subheading Some Results
+
+Here is what the contents of the first chapter of the sample look like:
+
+@sp 1
+@need 700
+@quotation
+This is the first chapter.
+
+Here is a numbered list.
+
+@enumerate
+@item
+This is the first item.
+
+@item
+This is the second item.
+@end enumerate
+@end quotation
+
+
+@node History
+@section History
+
+@cindex Stallman, Richard M.
+@cindex Chassell, Robert J.
+@cindex Fox, Brian
+@cindex Berry, Karl
+Richard M.@: Stallman invented the Texinfo format, wrote the initial
+processors, and created Edition 1.0 of this manual. @w{Robert J.@:}
+Chassell greatly revised and extended the manual, starting with Edition
+1.1. Brian Fox was responsible for the standalone Texinfo distribution
+until version 3.8, and wrote the standalone @command{makeinfo} and
+@command{info} programs. Karl Berry has continued maintenance since
+Texinfo 3.8 (manual edition 2.22).
+
+@cindex Pinard, Fran@,{c}ois
+@cindex Zuhn, David D.
+@cindex Weisshaus, Melissa
+@cindex Zaretskii, Eli
+@cindex Schwab, Andreas
+@cindex Weinberg, Zack
+Our thanks go out to all who helped improve this work, particularly the
+indefatigable Eli Zaretskii and Andreas Schwab, who have provided
+patches beyond counting. Fran@,{c}ois Pinard and @w{David D.@: Zuhn},
+tirelessly recorded and reported mistakes and obscurities. Zack
+Weinberg did the impossible by implementing the macro syntax in
+@file{texinfo.tex}. Special thanks go to Melissa Weisshaus for her
+frequent reviews of nearly similar editions. Dozens of others have
+contributed patches and suggestions, they are gratefully acknowledged in
+the @file{ChangeLog} file. Our mistakes are our own.
+
+@cindex Scribe
+@cindex Reid, Brian
+@cindex History of Texinfo
+@cindex Texinfo history
+A bit of history: in the 1970's at CMU, Brian Reid developed a program
+and format named Scribe to mark up documents for printing. It used the
+@code{@@} character to introduce commands, as Texinfo does. Much more
+consequentially, it strived to describe document contents rather than
+formatting, an idea wholeheartedly adopted by Texinfo.
+
+@cindex Bolio
+@cindex Bo@TeX{}
+Meanwhile, people at MIT developed another, not too dissimilar format
+called Bolio. This then was converted to using @TeX{} as its typesetting
+language: Bo@TeX{}. The earliest Bo@TeX{} version seems to have been
+0.02 on October 31, 1984.
+
+Bo@TeX{} could only be used as a markup language for documents to be
+printed, not for online documents. Richard Stallman (RMS) worked on
+both Bolio and Bo@TeX{}. He also developed a nifty on-line help format
+called Info, and then combined Bo@TeX{} and Info to create Texinfo, a
+mark up language for text that is intended to be read both online and
+as printed hard copy.
+
+
+@node Texinfo Mode
+@chapter Using Texinfo Mode
+@cindex Texinfo mode
+@cindex Mode, using Texinfo
+@cindex GNU Emacs
+@cindex Emacs
+
+You may edit a Texinfo file with any text editor you choose. A Texinfo
+file is no different from any other @sc{ascii} file. However, GNU Emacs
+comes with a special mode, called Texinfo mode, that provides Emacs
+commands and tools to help ease your work.
+
+This chapter describes features of GNU Emacs' Texinfo mode but not any
+features of the Texinfo formatting language. So if you are reading this
+manual straight through from the beginning, you may want to skim through
+this chapter briefly and come back to it after reading succeeding
+chapters which describe the Texinfo formatting language in detail.
+
+@menu
+* Texinfo Mode Overview:: How Texinfo mode can help you.
+* Emacs Editing:: Texinfo mode adds to GNU Emacs' general
+ purpose editing features.
+* Inserting:: How to insert frequently used @@-commands.
+* Showing the Structure:: How to show the structure of a file.
+* Updating Nodes and Menus:: How to update or create new nodes and menus.
+* Info Formatting:: How to format for Info.
+* Printing:: How to format and print part or all of a file.
+* Texinfo Mode Summary:: Summary of all the Texinfo mode commands.
+@end menu
+
+@node Texinfo Mode Overview
+@section Texinfo Mode Overview
+
+Texinfo mode provides special features for working with Texinfo files.
+You can:
+
+@itemize @bullet
+@item
+Insert frequently used @@-commands. @refill
+
+@item
+Automatically create @code{@@node} lines.
+
+@item
+Show the structure of a Texinfo source file.@refill
+
+@item
+Automatically create or update the `Next',
+`Previous', and `Up' pointers of a node.
+
+@item
+Automatically create or update menus.@refill
+
+@item
+Automatically create a master menu.@refill
+
+@item
+Format a part or all of a file for Info.@refill
+
+@item
+Typeset and print part or all of a file.@refill
+@end itemize
+
+Perhaps the two most helpful features are those for inserting frequently
+used @@-commands and for creating node pointers and menus.@refill
+
+@node Emacs Editing
+@section The Usual GNU Emacs Editing Commands
+
+In most cases, the usual Text mode commands work the same in Texinfo
+mode as they do in Text mode. Texinfo mode adds new editing commands
+and tools to GNU Emacs' general purpose editing features. The major
+difference concerns filling. In Texinfo mode, the paragraph
+separation variable and syntax table are redefined so that Texinfo
+commands that should be on lines of their own are not inadvertently
+included in paragraphs. Thus, the @kbd{M-q} (@code{fill-paragraph})
+command will refill a paragraph but not mix an indexing command on a
+line adjacent to it into the paragraph.@refill
+
+In addition, Texinfo mode sets the @code{page-delimiter} variable to
+the value of @code{texinfo-chapter-level-regexp}; by default, this is
+a regular expression matching the commands for chapters and their
+equivalents, such as appendices. With this value for the page
+delimiter, you can jump from chapter title to chapter title with the
+@kbd{C-x ]} (@code{forward-page}) and @kbd{C-x [}
+(@code{backward-page}) commands and narrow to a chapter with the
+@kbd{C-x p} (@code{narrow-to-page}) command. (@xref{Pages, , ,emacs,
+The GNU Emacs Manual}, for details about the page commands.)@refill
+
+You may name a Texinfo file however you wish, but the convention is to
+end a Texinfo file name with one of the extensions
+@file{.texinfo}, @file{.texi}, @file{.txi}, or @file{.tex}. A longer
+extension is preferred, since it is explicit, but a shorter extension
+may be necessary for operating systems that limit the length of file
+names. GNU Emacs automatically enters Texinfo mode when you visit a
+file with a @file{.texinfo}, @file{.texi} or @file{.txi}
+extension. Also, Emacs switches to Texinfo mode
+when you visit a
+file that has @samp{-*-texinfo-*-} in its first line. If ever you are
+in another mode and wish to switch to Texinfo mode, type @code{M-x
+texinfo-mode}.@refill
+
+Like all other Emacs features, you can customize or enhance Texinfo
+mode as you wish. In particular, the keybindings are very easy to
+change. The keybindings described here are the default or standard
+ones.@refill
+
+@node Inserting
+@comment node-name, next, previous, up
+@section Inserting Frequently Used Commands
+@cindex Inserting frequently used commands
+@cindex Frequently used commands, inserting
+@cindex Commands, inserting them
+
+Texinfo mode provides commands to insert various frequently used
+@@-commands into the buffer. You can use these commands to save
+keystrokes.@refill
+
+The insert commands are invoked by typing @kbd{C-c} twice and then the
+first letter of the @@-command:@refill
+
+@table @kbd
+@item C-c C-c c
+@itemx M-x texinfo-insert-@@code
+@findex texinfo-insert-@@code
+Insert @code{@@code@{@}} and put the
+cursor between the braces.@refill
+
+@item C-c C-c d
+@itemx M-x texinfo-insert-@@dfn
+@findex texinfo-insert-@@dfn
+Insert @code{@@dfn@{@}} and put the
+cursor between the braces.@refill
+
+@item C-c C-c e
+@itemx M-x texinfo-insert-@@end
+@findex texinfo-insert-@@end
+Insert @code{@@end} and attempt to insert the correct following word,
+such as @samp{example} or @samp{table}. (This command does not handle
+nested lists correctly, but inserts the word appropriate to the
+immediately preceding list.)@refill
+
+@item C-c C-c i
+@itemx M-x texinfo-insert-@@item
+@findex texinfo-insert-@@item
+Insert @code{@@item} and put the
+cursor at the beginning of the next line.@refill
+
+@item C-c C-c k
+@itemx M-x texinfo-insert-@@kbd
+@findex texinfo-insert-@@kbd
+Insert @code{@@kbd@{@}} and put the
+cursor between the braces.@refill
+
+@item C-c C-c n
+@itemx M-x texinfo-insert-@@node
+@findex texinfo-insert-@@node
+Insert @code{@@node} and a comment line
+listing the sequence for the `Next',
+`Previous', and `Up' nodes.
+Leave point after the @code{@@node}.@refill
+
+@item C-c C-c o
+@itemx M-x texinfo-insert-@@noindent
+@findex texinfo-insert-@@noindent
+Insert @code{@@noindent} and put the
+cursor at the beginning of the next line.@refill
+
+@item C-c C-c s
+@itemx M-x texinfo-insert-@@samp
+@findex texinfo-insert-@@samp
+Insert @code{@@samp@{@}} and put the
+cursor between the braces.@refill
+
+@item C-c C-c t
+@itemx M-x texinfo-insert-@@table
+@findex texinfo-insert-@@table
+Insert @code{@@table} followed by a @key{SPC}
+and leave the cursor after the @key{SPC}.@refill
+
+@item C-c C-c v
+@itemx M-x texinfo-insert-@@var
+@findex texinfo-insert-@@var
+Insert @code{@@var@{@}} and put the
+cursor between the braces.@refill
+
+@item C-c C-c x
+@itemx M-x texinfo-insert-@@example
+@findex texinfo-insert-@@example
+Insert @code{@@example} and put the
+cursor at the beginning of the next line.@refill
+
+@c M-@{ was the binding for texinfo-insert-braces;
+@c in Emacs 19, backward-paragraph will take this binding.
+@item C-c C-c @{
+@itemx M-x texinfo-insert-braces
+@findex texinfo-insert-braces
+Insert @code{@{@}} and put the cursor between the braces.@refill
+
+@item C-c C-c @}
+@itemx C-c C-c ]
+@itemx M-x up-list
+@findex up-list
+Move from between a pair of braces forward past the closing brace.
+Typing @kbd{C-c C-c ]} is easier than typing @kbd{C-c C-c @}}, which
+is, however, more mnemonic; hence the two keybindings. (Also, you can
+move out from between braces by typing @kbd{C-f}.)@refill
+@end table
+
+To put a command such as @w{@code{@@code@{@dots{}@}}} around an
+@emph{existing} word, position the cursor in front of the word and type
+@kbd{C-u 1 C-c C-c c}. This makes it easy to edit existing plain text.
+The value of the prefix argument tells Emacs how many words following
+point to include between braces---@samp{1} for one word, @samp{2} for
+two words, and so on. Use a negative argument to enclose the previous
+word or words. If you do not specify a prefix argument, Emacs inserts
+the @@-command string and positions the cursor between the braces. This
+feature works only for those @@-commands that operate on a word or words
+within one line, such as @code{@@kbd} and @code{@@var}.@refill
+
+This set of insert commands was created after analyzing the frequency
+with which different @@-commands are used in the @cite{GNU Emacs
+Manual} and the @cite{GDB Manual}. If you wish to add your own insert
+commands, you can bind a keyboard macro to a key, use abbreviations,
+or extend the code in @file{texinfo.el}.@refill
+
+@findex texinfo-start-menu-description
+@cindex Menu description, start
+@cindex Description for menu, start
+@kbd{C-c C-c C-d} (@code{texinfo-start-menu-description}) is an insert
+command that works differently from the other insert commands. It
+inserts a node's section or chapter title in the space for the
+description in a menu entry line. (A menu entry has three parts, the
+entry name, the node name, and the description. Only the node name is
+required, but a description helps explain what the node is about.
+@xref{Menu Parts, , The Parts of a Menu}.)@refill
+
+To use @code{texinfo-start-menu-description}, position point in a menu
+entry line and type @kbd{C-c C-c C-d}. The command looks for and copies
+the title that goes with the node name, and inserts the title as a
+description; it positions point at beginning of the inserted text so you
+can edit it. The function does not insert the title if the menu entry
+line already contains a description.@refill
+
+This command is only an aid to writing descriptions; it does not do the
+whole job. You must edit the inserted text since a title tends to use
+the same words as a node name but a useful description uses different
+words.@refill
+
+@node Showing the Structure
+@comment node-name, next, previous, up
+@section Showing the Section Structure of a File
+@cindex Showing the section structure of a file
+@cindex Section structure of a file, showing it
+@cindex Structure of a file, showing it
+@cindex Outline of file structure, showing it
+@cindex Contents-like outline of file structure
+@cindex File section structure, showing it
+@cindex Texinfo file section structure, showing it
+
+You can show the section structure of a Texinfo file by using the
+@kbd{C-c C-s} command (@code{texinfo-show-structure}). This command
+shows the section structure of a Texinfo file by listing the lines
+that begin with the @@-commands for @code{@@chapter},
+@code{@@section}, and the like. It constructs what amounts
+to a table of contents. These lines are displayed in another buffer
+called the @samp{*Occur*} buffer. In that buffer, you can position
+the cursor over one of the lines and use the @kbd{C-c C-c} command
+(@code{occur-mode-goto-occurrence}), to jump to the corresponding spot
+in the Texinfo file.@refill
+
+@table @kbd
+@item C-c C-s
+@itemx M-x texinfo-show-structure
+@findex texinfo-show-structure
+Show the @code{@@chapter}, @code{@@section}, and such lines of a
+Texinfo file.@refill
+
+@item C-c C-c
+@itemx M-x occur-mode-goto-occurrence
+@findex occur-mode-goto-occurrence
+Go to the line in the Texinfo file corresponding to the line under the
+cursor in the @file{*Occur*} buffer.@refill
+@end table
+
+If you call @code{texinfo-show-structure} with a prefix argument by
+typing @w{@kbd{C-u C-c C-s}}, it will list not only those lines with the
+@@-commands for @code{@@chapter}, @code{@@section}, and the like, but
+also the @code{@@node} lines. You can use @code{texinfo-show-structure}
+with a prefix argument to check whether the `Next', `Previous', and `Up'
+pointers of an @code{@@node} line are correct.
+
+Often, when you are working on a manual, you will be interested only
+in the structure of the current chapter. In this case, you can mark
+off the region of the buffer that you are interested in by using the
+@kbd{C-x n n} (@code{narrow-to-region}) command and
+@code{texinfo-show-structure} will work on only that region. To see
+the whole buffer again, use @w{@kbd{C-x n w}} (@code{widen}).
+(@xref{Narrowing, , , emacs, The GNU Emacs Manual}, for more
+information about the narrowing commands.)@refill
+
+@vindex page-delimiter
+@cindex Page delimiter in Texinfo mode
+In addition to providing the @code{texinfo-show-structure} command,
+Texinfo mode sets the value of the page delimiter variable to match
+the chapter-level @@-commands. This enables you to use the @kbd{C-x
+]} (@code{forward-page}) and @kbd{C-x [} (@code{backward-page})
+commands to move forward and backward by chapter, and to use the
+@kbd{C-x p} (@code{narrow-to-page}) command to narrow to a chapter.
+@xref{Pages, , , emacs, The GNU Emacs Manual}, for more information
+about the page commands.@refill
+
+@node Updating Nodes and Menus
+@comment node-name, next, previous, up
+@section Updating Nodes and Menus
+@cindex Updating nodes and menus
+@cindex Create nodes, menus automatically
+@cindex Insert nodes, menus automatically
+@cindex Automatically insert nodes, menus
+
+Texinfo mode provides commands for automatically creating or updating
+menus and node pointers. The commands are called ``update'' commands
+because their most frequent use is for updating a Texinfo file after you
+have worked on it; but you can use them to insert the `Next',
+`Previous', and `Up' pointers into an @code{@@node} line that has none
+and to create menus in a file that has none.
+
+If you do not use the updating commands, you need to write menus and
+node pointers by hand, which is a tedious task.@refill
+
+@menu
+* Updating Commands:: Five major updating commands.
+* Updating Requirements:: How to structure a Texinfo file for
+ using the updating command.
+* Other Updating Commands:: How to indent descriptions, insert
+ missing nodes lines, and update
+ nodes in sequence.
+@end menu
+
+@node Updating Commands
+@subsection The Updating Commands
+
+You can use the updating commands to:@refill
+
+@itemize @bullet
+@item
+insert or update the `Next', `Previous', and `Up' pointers of a
+node,@refill
+
+@item
+insert or update the menu for a section, and@refill
+
+@item
+create a master menu for a Texinfo source file.@refill
+@end itemize
+
+You can also use the commands to update all the nodes and menus in a
+region or in a whole Texinfo file.@refill
+
+The updating commands work only with conventional Texinfo files, which
+are structured hierarchically like books. In such files, a structuring
+command line must follow closely after each @code{@@node} line, except
+for the `Top' @code{@@node} line. (A @dfn{structuring command line} is
+a line beginning with @code{@@chapter}, @code{@@section}, or other
+similar command.)
+
+You can write the structuring command line on the line that follows
+immediately after an @code{@@node} line or else on the line that
+follows after a single @code{@@comment} line or a single
+@code{@@ifinfo} line. You cannot interpose more than one line between
+the @code{@@node} line and the structuring command line; and you may
+interpose only an @code{@@comment} line or an @code{@@ifinfo} line.
+
+Commands which work on a whole buffer require that the `Top' node be
+followed by a node with an @code{@@chapter} or equivalent-level command.
+The menu updating commands will not create a main or master menu for a
+Texinfo file that has only @code{@@chapter}-level nodes! The menu
+updating commands only create menus @emph{within} nodes for lower level
+nodes. To create a menu of chapters, you must provide a `Top'
+node.
+
+The menu updating commands remove menu entries that refer to other Info
+files since they do not refer to nodes within the current buffer. This
+is a deficiency. Rather than use menu entries, you can use cross
+references to refer to other Info files. None of the updating commands
+affect cross references.@refill
+
+Texinfo mode has five updating commands that are used most often: two
+are for updating the node pointers or menu of a single node (or a
+region); two are for updating every node pointer and menu in a file;
+and one, the @code{texinfo-master-menu} command, is for creating a
+master menu for a complete file, and optionally, for updating every
+node and menu in the whole Texinfo file.@refill
+
+The @code{texinfo-master-menu} command is the primary command:@refill
+
+@table @kbd
+@item C-c C-u m
+@itemx M-x texinfo-master-menu
+@findex texinfo-master-menu
+Create or update a master menu that includes all the other menus
+(incorporating the descriptions from pre-existing menus, if
+any).@refill
+
+With an argument (prefix argument, @kbd{C-u,} if interactive), first create or
+update all the nodes and all the regular menus in the buffer before
+constructing the master menu. (@xref{The Top Node, , The Top Node and
+Master Menu}, for more about a master menu.)@refill
+
+For @code{texinfo-master-menu} to work, the Texinfo file must have a
+`Top' node and at least one subsequent node.@refill
+
+After extensively editing a Texinfo file, you can type the following:
+
+@example
+C-u M-x texinfo-master-menu
+@exdent or
+C-u C-c C-u m
+@end example
+
+@noindent
+This updates all the nodes and menus completely and all at once.@refill
+@end table
+
+The other major updating commands do smaller jobs and are designed for
+the person who updates nodes and menus as he or she writes a Texinfo
+file.@refill
+
+@need 1000
+The commands are:@refill
+
+@table @kbd
+@item C-c C-u C-n
+@itemx M-x texinfo-update-node
+@findex texinfo-update-node
+Insert the `Next', `Previous', and `Up' pointers for the node that point is
+within (i.e., for the @code{@@node} line preceding point). If the
+@code{@@node} line has pre-existing `Next', `Previous', or `Up'
+pointers in it, the old pointers are removed and new ones inserted.
+With an argument (prefix argument, @kbd{C-u}, if interactive), this command
+updates all @code{@@node} lines in the region (which is the text
+between point and mark).@refill
+
+@item C-c C-u C-m
+@itemx M-x texinfo-make-menu
+@findex texinfo-make-menu
+Create or update the menu in the node that point is within.
+With an argument (@kbd{C-u} as prefix argument, if
+interactive), the command makes or updates menus for the
+nodes which are either within or a part of the
+region.@refill
+
+Whenever @code{texinfo-make-menu} updates an existing menu, the
+descriptions from that menu are incorporated into the new menu. This
+is done by copying descriptions from the existing menu to the entries
+in the new menu that have the same node names. If the node names are
+different, the descriptions are not copied to the new menu.@refill
+
+@item C-c C-u C-e
+@itemx M-x texinfo-every-node-update
+@findex texinfo-every-node-update
+Insert or update the `Next', `Previous', and `Up' pointers for every
+node in the buffer.@refill
+
+@item C-c C-u C-a
+@itemx M-x texinfo-all-menus-update
+@findex texinfo-all-menus-update
+Create or update all the menus in the buffer. With an argument
+(@kbd{C-u} as prefix argument, if interactive), first insert
+or update all the node
+pointers before working on the menus.@refill
+
+If a master menu exists, the @code{texinfo-all-menus-update} command
+updates it; but the command does not create a new master menu if none
+already exists. (Use the @code{texinfo-master-menu} command for
+that.)@refill
+
+When working on a document that does not merit a master menu, you can
+type the following:
+
+@example
+C-u C-c C-u C-a
+@exdent or
+C-u M-x texinfo-all-menus-update
+@end example
+
+@noindent
+This updates all the nodes and menus.@refill
+@end table
+
+The @code{texinfo-column-for-description} variable specifies the
+column to which menu descriptions are indented. By default, the value
+is 32 although it is often useful to reduce it to as low as 24. You
+can set the variable via customization (@pxref{Changing an Option,,,
+emacs, The GNU Emacs Manual}) or with the @kbd{M-x set-variable}
+command (@pxref{Examining, , Examining and Setting Variables, emacs,
+The GNU Emacs Manual}).
+
+Also, the @code{texinfo-indent-menu-description} command may be used to
+indent existing menu descriptions to a specified column. Finally, if
+you wish, you can use the @code{texinfo-insert-node-lines} command to
+insert missing @code{@@node} lines into a file. (@xref{Other Updating
+Commands}, for more information.)@refill
+
+@node Updating Requirements
+@subsection Updating Requirements
+@cindex Updating requirements
+@cindex Requirements for updating commands
+
+To use the updating commands, you must organize the Texinfo file
+hierarchically with chapters, sections, subsections, and the like.
+When you construct the hierarchy of the manual, do not `jump down'
+more than one level at a time: you can follow the `Top' node with a
+chapter, but not with a section; you can follow a chapter with a
+section, but not with a subsection. However, you may `jump up' any
+number of levels at one time---for example, from a subsection to a
+chapter.@refill
+
+Each @code{@@node} line, with the exception of the line for the `Top'
+node, must be followed by a line with a structuring command such as
+@code{@@chapter}, @code{@@section}, or
+@code{@@unnumberedsubsec}.@refill
+
+Each @code{@@node} line/structuring-command line combination
+must look either like this:
+
+@example
+@group
+@@node Comments, Minimum, Conventions, Overview
+@@comment node-name, next, previous, up
+@@section Comments
+@end group
+@end example
+
+or like this (without the @code{@@comment} line):
+
+@example
+@group
+@@node Comments, Minimum, Conventions, Overview
+@@section Comments
+@end group
+@end example
+
+or like this (without the explicit node pointers):
+
+@example
+@group
+@@node Comments
+@@section Comments
+@end group
+@end example
+
+@noindent
+In this example, `Comments' is the name of both the node and the
+section. The next node is called `Minimum' and the previous node is
+called `Conventions'. The `Comments' section is within the `Overview'
+node, which is specified by the `Up' pointer. (Instead of an
+@code{@@comment} line, you may also write an @code{@@ifinfo} line.)
+
+If a file has a `Top' node, it must be called @samp{top} or @samp{Top}
+and be the first node in the file.
+
+The menu updating commands create a menu of sections within a chapter,
+a menu of subsections within a section, and so on. This means that
+you must have a `Top' node if you want a menu of chapters.@refill
+
+Incidentally, the @code{makeinfo} command will create an Info file for a
+hierarchically organized Texinfo file that lacks `Next', `Previous' and
+`Up' pointers. Thus, if you can be sure that your Texinfo file will be
+formatted with @code{makeinfo}, you have no need for the update node
+commands. (@xref{Creating an Info File}, for more information about
+@code{makeinfo}.) However, both @code{makeinfo} and the
+@code{texinfo-format-@dots{}} commands require that you insert menus in
+the file.
+
+
+@node Other Updating Commands
+@subsection Other Updating Commands
+
+In addition to the five major updating commands, Texinfo mode
+possesses several less frequently used updating commands:@refill
+
+@table @kbd
+@item M-x texinfo-insert-node-lines
+@findex texinfo-insert-node-lines
+Insert @code{@@node} lines before the @code{@@chapter},
+@code{@@section}, and other sectioning commands wherever they are
+missing throughout a region in a Texinfo file.@refill
+
+With an argument (@kbd{C-u} as prefix argument, if interactive), the
+@code{texinfo-insert-node-lines} command not only inserts
+@code{@@node} lines but also inserts the chapter or section titles as
+the names of the corresponding nodes. In addition, it inserts the
+titles as node names in pre-existing @code{@@node} lines that lack
+names. Since node names should be more concise than section or
+chapter titles, you must manually edit node names so inserted.@refill
+
+For example, the following marks a whole buffer as a region and inserts
+@code{@@node} lines and titles throughout:@refill
+
+@example
+C-x h C-u M-x texinfo-insert-node-lines
+@end example
+
+This command inserts titles as node names in @code{@@node} lines; the
+@code{texinfo-start-menu-description} command (@pxref{Inserting,
+Inserting Frequently Used Commands}) inserts titles as descriptions in
+menu entries, a different action. However, in both cases, you need to
+edit the inserted text.
+
+@item M-x texinfo-multiple-files-update
+@findex texinfo-multiple-files-update @r{(in brief)}
+Update nodes and menus in a document built from several separate files.
+With @kbd{C-u} as a prefix argument, create and insert a master menu in
+the outer file. With a numeric prefix argument, such as @kbd{C-u 2}, first
+update all the menus and all the `Next', `Previous', and `Up' pointers
+of all the included files before creating and inserting a master menu in
+the outer file. The @code{texinfo-multiple-files-update} command is
+described in the appendix on @code{@@include} files.
+@xref{texinfo-multiple-files-update}.
+
+@item M-x texinfo-indent-menu-description
+@findex texinfo-indent-menu-description
+Indent every description in the menu following point to the specified
+column. You can use this command to give yourself more space for
+descriptions. With an argument (@kbd{C-u} as prefix argument, if
+interactive), the @code{texinfo-indent-menu-description} command indents
+every description in every menu in the region. However, this command
+does not indent the second and subsequent lines of a multi-line
+description.@refill
+
+@item M-x texinfo-sequential-node-update
+@findex texinfo-sequential-node-update
+Insert the names of the nodes immediately following and preceding the
+current node as the `Next' or `Previous' pointers regardless of those
+nodes' hierarchical level. This means that the `Next' node of a
+subsection may well be the next chapter. Sequentially ordered nodes are
+useful for novels and other documents that you read through
+sequentially. (However, in Info, the @kbd{g *} command lets
+you look through the file sequentially, so sequentially ordered nodes
+are not strictly necessary.) With an argument (prefix argument, if
+interactive), the @code{texinfo-sequential-node-update} command
+sequentially updates all the nodes in the region.@refill
+@end table
+
+@node Info Formatting
+@comment node-name, next, previous, up
+@section Formatting for Info
+@cindex Formatting for Info
+@cindex Running an Info formatter
+@cindex Info formatting
+
+Texinfo mode provides several commands for formatting part or all of a
+Texinfo file for Info. Often, when you are writing a document, you
+want to format only part of a file---that is, a region.@refill
+
+You can use either the @code{texinfo-format-region} or the
+@code{makeinfo-region} command to format a region:@refill
+
+@table @kbd
+@findex texinfo-format-region
+@item C-c C-e C-r
+@itemx M-x texinfo-format-region
+@itemx C-c C-m C-r
+@itemx M-x makeinfo-region
+Format the current region for Info.@refill
+@end table
+
+You can use either the @code{texinfo-format-buffer} or the
+@code{makeinfo-buffer} command to format a whole buffer:@refill
+
+@table @kbd
+@findex texinfo-format-buffer
+@item C-c C-e C-b
+@itemx M-x texinfo-format-buffer
+@itemx C-c C-m C-b
+@itemx M-x makeinfo-buffer
+Format the current buffer for Info.@refill
+@end table
+
+@need 1000
+For example, after writing a Texinfo file, you can type the following:
+
+@example
+C-u C-c C-u m
+@exdent or
+C-u M-x texinfo-master-menu
+@end example
+
+@noindent
+This updates all the nodes and menus. Then type the following to create
+an Info file:
+
+@example
+C-c C-m C-b
+@exdent or
+M-x makeinfo-buffer
+@end example
+
+For @TeX{} or the Info formatting commands to work, the file @emph{must}
+include a line that has @code{@@setfilename} in its header.
+
+@xref{Creating an Info File}, for details about Info formatting.@refill
+
+@node Printing
+@comment node-name, next, previous, up
+@section Printing
+@cindex Formatting for printing
+@cindex Printing a region or buffer
+@cindex Region formatting and printing
+@cindex Buffer formatting and printing
+@cindex Part of file formatting and printing
+
+Typesetting and printing a Texinfo file is a multi-step process in which
+you first create a file for printing (called a DVI file), and then
+print the file. Optionally, you may also create indices. To do this,
+you must run the @code{texindex} command after first running the
+@code{tex} typesetting command; and then you must run the @code{tex}
+command again. Or else run the @code{texi2dvi} command which
+automatically creates indices as needed (@pxref{Format with texi2dvi}).
+
+Often, when you are writing a document, you want to typeset and print
+only part of a file to see what it will look like. You can use the
+@code{texinfo-tex-region} and related commands for this purpose. Use
+the @code{texinfo-tex-buffer} command to format all of a
+buffer.@refill
+
+@table @kbd
+@item C-c C-t C-b
+@itemx M-x texinfo-tex-buffer
+@findex texinfo-tex-buffer
+Run @code{texi2dvi} on the buffer. In addition to running @TeX{} on the
+buffer, this command automatically creates or updates indices as
+needed.@refill
+
+@item C-c C-t C-r
+@itemx M-x texinfo-tex-region
+@findex texinfo-tex-region
+Run @TeX{} on the region.@refill
+
+@item C-c C-t C-i
+@itemx M-x texinfo-texindex
+Run @code{texindex} to sort the indices of a Texinfo file formatted with
+@code{texinfo-tex-region}. The @code{texinfo-tex-region} command does
+not run @code{texindex} automatically; it only runs the @code{tex}
+typesetting command. You must run the @code{texinfo-tex-region} command
+a second time after sorting the raw index files with the @code{texindex}
+command. (Usually, you do not format an index when you format a region,
+only when you format a buffer. Now that the @code{texi2dvi} command
+exists, there is little or no need for this command.)@refill
+
+@item C-c C-t C-p
+@itemx M-x texinfo-tex-print
+@findex texinfo-tex-print
+Print the file (or the part of the file) previously formatted with
+@code{texinfo-tex-buffer} or @code{texinfo-tex-region}.@refill
+@end table
+
+For @code{texinfo-tex-region} or @code{texinfo-tex-buffer} to work, the
+file @emph{must} start with a @samp{\input texinfo} line and must
+include an @code{@@settitle} line. The file must end with @code{@@bye}
+on a line by itself. (When you use @code{texinfo-tex-region}, you must
+surround the @code{@@settitle} line with start-of-header and
+end-of-header lines.)@refill
+
+@xref{Hardcopy}, for a description of the other @TeX{} related
+commands, such as @code{tex-show-print-queue}.@refill
+
+@node Texinfo Mode Summary
+@comment node-name, next, previous, up
+@section Texinfo Mode Summary
+
+In Texinfo mode, each set of commands has default keybindings that
+begin with the same keys. All the commands that are custom-created
+for Texinfo mode begin with @kbd{C-c}. The keys are somewhat
+mnemonic.@refill
+
+@subheading Insert Commands
+
+The insert commands are invoked by typing @kbd{C-c} twice and then the
+first letter of the @@-command to be inserted. (It might make more
+sense mnemonically to use @kbd{C-c C-i}, for `custom insert', but
+@kbd{C-c C-c} is quick to type.)@refill
+
+@example
+C-c C-c c @r{Insert} @samp{@@code}.
+C-c C-c d @r{Insert} @samp{@@dfn}.
+C-c C-c e @r{Insert} @samp{@@end}.
+C-c C-c i @r{Insert} @samp{@@item}.
+C-c C-c n @r{Insert} @samp{@@node}.
+C-c C-c s @r{Insert} @samp{@@samp}.
+C-c C-c v @r{Insert} @samp{@@var}.
+C-c C-c @{ @r{Insert braces.}
+C-c C-c ]
+C-c C-c @} @r{Move out of enclosing braces.}
+
+@group
+C-c C-c C-d @r{Insert a node's section title}
+ @r{in the space for the description}
+ @r{in a menu entry line.}
+@end group
+@end example
+
+@subheading Show Structure
+
+The @code{texinfo-show-structure} command is often used within a
+narrowed region.@refill
+
+@example
+C-c C-s @r{List all the headings.}
+@end example
+
+@subheading The Master Update Command
+
+The @code{texinfo-master-menu} command creates a master menu; and can
+be used to update every node and menu in a file as well.@refill
+
+@c Probably should use @tables in this section.
+@example
+@group
+C-c C-u m
+M-x texinfo-master-menu
+ @r{Create or update a master menu.}
+@end group
+
+@group
+C-u C-c C-u m @r{With @kbd{C-u} as a prefix argument, first}
+ @r{create or update all nodes and regular}
+ @r{menus, and then create a master menu.}
+@end group
+@end example
+
+@subheading Update Pointers
+
+The update pointer commands are invoked by typing @kbd{C-c C-u} and
+then either @kbd{C-n} for @code{texinfo-update-node} or @kbd{C-e} for
+@code{texinfo-every-node-update}.@refill
+
+@example
+C-c C-u C-n @r{Update a node.}
+C-c C-u C-e @r{Update every node in the buffer.}
+@end example
+
+@subheading Update Menus
+
+Invoke the update menu commands by typing @kbd{C-c C-u}
+and then either @kbd{C-m} for @code{texinfo-make-menu} or
+@kbd{C-a} for @code{texinfo-all-menus-update}. To update
+both nodes and menus at the same time, precede @kbd{C-c C-u
+C-a} with @kbd{C-u}.@refill
+
+@example
+C-c C-u C-m @r{Make or update a menu.}
+
+@group
+C-c C-u C-a @r{Make or update all}
+ @r{menus in a buffer.}
+@end group
+
+@group
+C-u C-c C-u C-a @r{With @kbd{C-u} as a prefix argument,}
+ @r{first create or update all nodes and}
+ @r{then create or update all menus.}
+@end group
+@end example
+
+@subheading Format for Info
+
+The Info formatting commands that are written in Emacs Lisp are
+invoked by typing @kbd{C-c C-e} and then either @kbd{C-r} for a region
+or @kbd{C-b} for the whole buffer.@refill
+
+The Info formatting commands that are written in C and based on the
+@code{makeinfo} program are invoked by typing @kbd{C-c C-m} and then
+either @kbd{C-r} for a region or @kbd{C-b} for the whole buffer.@refill
+
+@need 800
+@noindent
+Use the @code{texinfo-format@dots{}} commands:
+
+@example
+@group
+C-c C-e C-r @r{Format the region.}
+C-c C-e C-b @r{Format the buffer.}
+@end group
+@end example
+
+@need 750
+@noindent
+Use @code{makeinfo}:
+
+@example
+C-c C-m C-r @r{Format the region.}
+C-c C-m C-b @r{Format the buffer.}
+C-c C-m C-l @r{Recenter the @code{makeinfo} output buffer.}
+C-c C-m C-k @r{Kill the @code{makeinfo} formatting job.}
+@end example
+
+@subheading Typeset and Print
+
+The @TeX{} typesetting and printing commands are invoked by typing
+@kbd{C-c C-t} and then another control command: @kbd{C-r} for
+@code{texinfo-tex-region}, @kbd{C-b} for @code{texinfo-tex-buffer},
+and so on.@refill
+
+@example
+C-c C-t C-r @r{Run @TeX{} on the region.}
+C-c C-t C-b @r{Run} @code{texi2dvi} @r{on the buffer.}
+C-c C-t C-i @r{Run} @code{texindex}.
+C-c C-t C-p @r{Print the DVI file.}
+C-c C-t C-q @r{Show the print queue.}
+C-c C-t C-d @r{Delete a job from the print queue.}
+C-c C-t C-k @r{Kill the current @TeX{} formatting job.}
+C-c C-t C-x @r{Quit a currently stopped @TeX{} formatting job.}
+C-c C-t C-l @r{Recenter the output buffer.}
+@end example
+
+@subheading Other Updating Commands
+
+The remaining updating commands do not have standard keybindings because
+they are rarely used.
+
+@example
+@group
+M-x texinfo-insert-node-lines
+ @r{Insert missing @code{@@node} lines in region.}
+ @r{With @kbd{C-u} as a prefix argument,}
+ @r{use section titles as node names.}
+@end group
+
+@group
+M-x texinfo-multiple-files-update
+ @r{Update a multi-file document.}
+ @r{With @kbd{C-u 2} as a prefix argument,}
+ @r{create or update all nodes and menus}
+ @r{in all included files first.}
+@end group
+
+@group
+M-x texinfo-indent-menu-description
+ @r{Indent descriptions.}
+@end group
+
+@group
+M-x texinfo-sequential-node-update
+ @r{Insert node pointers in strict sequence.}
+@end group
+@end example
+
+
+@node Beginning a File
+@chapter Beginning a Texinfo File
+@cindex Beginning a Texinfo file
+@cindex Texinfo file beginning
+@cindex File beginning
+
+Certain pieces of information must be provided at the beginning of a
+Texinfo file, such as the name for the output file(s), the title of the
+document, and the Top node. A table of contents is also generally
+produced here.
+
+This chapter expands on the minimal complete Texinfo source file
+previously given (@pxref{Six Parts}). It describes the numerous
+commands for handling the traditional frontmatter items in Texinfo.
+
+@cindex Frontmatter, text in
+Straight text outside of any command before the Top node should be
+avoided. Such text is treated differently in the different output
+formats: visible in @TeX{} and HTML, by default not shown in Info
+readers, and so on.
+
+@menu
+* Sample Beginning:: A sample beginning for a Texinfo file.
+* Texinfo File Header:: The first lines.
+* Document Permissions:: Ensuring your manual is free.
+* Titlepage & Copyright Page:: Creating the title and copyright pages.
+* Contents:: How to create a table of contents.
+* The Top Node:: Creating the `Top' node and master menu.
+* Global Document Commands:: Affecting formatting throughout.
+* Software Copying Permissions:: Ensure that you and others continue to
+ have the right to use and share software.
+@end menu
+
+
+@node Sample Beginning
+@section Sample Texinfo File Beginning
+
+@cindex Example beginning of Texinfo file
+
+The following sample shows what is needed. The elements given here are
+explained in more detail in the following sections. Other commands are
+often included at the beginning of Texinfo files, but the ones here are
+the most critical.
+
+@xref{GNU Sample Texts}, for the full texts to be used in GNU manuals.
+
+@example
+\input texinfo @@c -*-texinfo-*-
+@@c %**start of header
+@@setfilename @var{infoname}.info
+@@settitle @var{name-of-manual} @var{version}
+@@c %**end of header
+
+@@copying
+This manual is for @var{program}, version @var{version}.
+
+Copyright @@copyright@{@} @var{years} @var{copyright-owner}.
+
+@group
+@@quotation
+Permission is granted to @dots{}
+@@end quotation
+@@end copying
+@end group
+
+@group
+@@titlepage
+@@title @var{name-of-manual-when-printed}
+@@subtitle @var{subtitle-if-any}
+@@subtitle @var{second-subtitle}
+@@author @var{author}
+@end group
+
+@group
+@@c The following two commands
+@@c start the copyright page.
+@@page
+@@vskip 0pt plus 1filll
+@@insertcopying
+@end group
+
+Published by @dots{}
+@@end titlepage
+
+@@c So the toc is printed at the start.
+@@contents
+
+@@ifnottex
+@@node Top
+@@top @var{title}
+
+@@insertcopying
+@@end ifnottex
+
+@group
+@@menu
+* First Chapter:: Getting started @dots{}
+* Second Chapter:: @dots{}
+ @dots{}
+* Copying:: Your rights and freedoms.
+@@end menu
+@end group
+
+@group
+@@node First Chapter
+@@chapter First Chapter
+
+@@cindex first chapter
+@@cindex chapter, first
+@dots{}
+@end group
+@end example
+
+
+@node Texinfo File Header
+@section Texinfo File Header
+@cindex Header for Texinfo files
+@cindex Texinfo file header
+
+Texinfo files start with at least three lines that provide Info and
+@TeX{} with necessary information. These are the @code{\input texinfo}
+line, the @code{@@settitle} line, and the @code{@@setfilename} line.
+
+Also, if you want to format just part of the Texinfo file, you must
+write the @code{@@settitle} and @code{@@setfilename} lines between
+start-of-header and end-of-header lines. The start- and end-of-header
+lines are optional, but they do no harm, so you might as well always
+include them.
+
+Any command that affects document formatting as a whole makes sense to
+include in the header. @code{@@synindex} (@pxref{synindex}), for
+instance, is another command often included in the header. @xref{GNU
+Sample Texts}, for complete sample texts.
+
+Thus, the beginning of a Texinfo file generally looks like this:
+
+@example
+@group
+\input texinfo @@c -*-texinfo-*-
+@@c %**start of header
+@@setfilename sample.info
+@@settitle Sample Manual 1.0
+@@c %**end of header
+@end group
+@end example
+
+@menu
+* First Line:: The first line of a Texinfo file.
+* Start of Header:: Formatting a region requires this.
+* setfilename:: Tell Info the name of the Info file.
+* settitle:: Create a title for the printed work.
+* End of Header:: Formatting a region requires this.
+@end menu
+
+
+@node First Line
+@subsection The First Line of a Texinfo File
+@cindex First line of a Texinfo file
+@cindex Beginning line of a Texinfo file
+@cindex Header of a Texinfo file
+
+Every Texinfo file that is to be the top-level input to @TeX{} must begin
+with a line that looks like this:
+
+@example
+\input texinfo @@c -*-texinfo-*-
+@end example
+
+@noindent
+This line serves two functions:
+
+@enumerate
+@item
+When the file is processed by @TeX{}, the @samp{\input texinfo} command
+tells @TeX{} to load the macros needed for processing a Texinfo file.
+These are in a file called @file{texinfo.tex}, which should have been
+installed on your system along with either the @TeX{} or Texinfo
+software. @TeX{} uses the backslash, @samp{\}, to mark the beginning of
+a command, exactly as Texinfo uses @samp{@@}. The @file{texinfo.tex}
+file causes the switch from @samp{\} to @samp{@@}; before the switch
+occurs, @TeX{} requires @samp{\}, which is why it appears at the
+beginning of the file.
+
+@item
+When the file is edited in GNU Emacs, the @samp{-*-texinfo-*-} mode
+specification tells Emacs to use Texinfo mode.
+@end enumerate
+
+
+@node Start of Header
+@subsection Start of Header
+@cindex Start of header line
+
+A start-of-header line is a Texinfo comment that looks like this:
+
+@example
+@@c %**start of header
+@end example
+
+Write the start-of-header line on the second line of a Texinfo file.
+Follow the start-of-header line with @code{@@setfilename} and
+@code{@@settitle} lines and, optionally, with other commands that
+globally affect the document formatting, such as @code{@@synindex} or
+@code{@@footnotestyle}; and then by an end-of-header line (@pxref{End of
+Header}).
+
+The start- and end-of-header lines allow you to format only part of a
+Texinfo file for Info or printing. @xref{texinfo-format commands}.
+
+The odd string of characters, @samp{%**}, is to ensure that no other
+comment is accidentally taken for a start-of-header line. You can
+change it if you wish by setting the @code{tex-start-of-header} and/or
+@code{tex-end-of-header} Emacs variables. @xref{Texinfo Mode Printing}.
+
+
+@node setfilename
+@subsection @code{@@setfilename}: Set the output file name
+@findex setfilename
+@cindex Texinfo requires @code{@@setfilename}
+
+In order to serve as the primary input file for either @code{makeinfo}
+or @TeX{}, a Texinfo file must contain a line that looks like this:
+
+@example
+@@setfilename @var{info-file-name}
+@end example
+
+Write the @code{@@setfilename} command at the beginning of a line and
+follow it on the same line by the Info file name. Do not write anything
+else on the line; anything on the line after the command is considered
+part of the file name, including what would otherwise be a
+comment.
+
+@cindex Ignored before @code{@@setfilename}
+@cindex @samp{\input} source line ignored
+The Info formatting commands ignore everything written before the
+@code{@@setfilename} line, which is why the very first line of
+the file (the @code{\input} line) does not show up in the output.
+
+The @code{@@setfilename} line specifies the name of the output file to
+be generated. This name must be different from the name of the Texinfo
+file. There are two conventions for choosing the name: you can either
+remove the extension (such as @samp{.texi}) entirely from the input file
+name, or, preferably, replace it with the @samp{.info} extension.
+
+@cindex Length of file names
+@cindex File name collision
+@cindex Info file name, choosing
+Although an explicit @samp{.info} extension is preferable, some
+operating systems cannot handle long file names. You can run into a
+problem even when the file name you specify is itself short enough.
+This occurs because the Info formatters split a long Info file into
+short indirect subfiles, and name them by appending @samp{-1},
+@samp{-2}, @dots{}, @samp{-10}, @samp{-11}, and so on, to the original
+file name. (@xref{Tag and Split Files}.) The subfile name
+@file{texinfo.info-10}, for example, is too long for old systems with a
+14-character limit on filenames; so the Info file name for this document
+is @file{texinfo} rather than @file{texinfo.info}. When @code{makeinfo}
+is running on operating systems such as MS-DOS which impose severe
+limits on file names, it may remove some characters from the original
+file name to leave enough space for the subfile suffix, thus producing
+files named @file{texin-10}, @file{gcc.i12}, etc.
+
+When producing HTML output, @code{makeinfo} will replace any extension
+with @samp{html}, or add @samp{.html} if the given name has no
+extension.
+
+@pindex texinfo.cnf
+The @code{@@setfilename} line produces no output when you typeset a
+manual with @TeX{}, but it is nevertheless essential: it opens the
+index, cross-reference, and other auxiliary files used by Texinfo, and
+also reads @file{texinfo.cnf} if that file is present on your system
+(@pxref{Preparing for TeX,, Preparing for @TeX{}}).
+
+
+@node settitle
+@subsection @code{@@settitle}: Set the document title
+@findex settitle
+
+In order to be made into a printed manual, a Texinfo file must contain
+a line that looks like this:
+
+@example
+@@settitle @var{title}
+@end example
+
+Write the @code{@@settitle} command at the beginning of a line and
+follow it on the same line by the title. This tells @TeX{} the title to
+use in a header or footer. Do not write anything else on the line;
+anything on the line after the command is considered part of the title,
+including what would otherwise be a comment.
+
+The @code{@@settitle} command should precede everything that generates
+actual output. The best place for it is right after the
+@code{@@setfilename} command (see the previous section).
+
+@cindex <title> HTML tag
+In the HTML file produced by @command{makeinfo}, @var{title} serves as
+the document @samp{<title>}. It also becomes the default document
+description in the @samp{<head>} part (@pxref{documentdescription}).
+
+The title in the @code{@@settitle} command does not affect the title as
+it appears on the title page. Thus, the two do not need not match
+exactly. A practice we recommend is to include the version or edition
+number of the manual in the @code{@@settitle} title; on the title page,
+the version number generally appears as a @code{@@subtitle} so it would
+be omitted from the @code{@@title}. @xref{titlepage}.
+
+Conventionally, when @TeX{} formats a Texinfo file for double-sided
+output, the title is printed in the left-hand (even-numbered) page
+headings and the current chapter title is printed in the right-hand
+(odd-numbered) page headings. (@TeX{} learns the title of each chapter
+from each @code{@@chapter} command.) By default, no page footer is
+printed.
+
+Even if you are printing in a single-sided style, @TeX{} looks for an
+@code{@@settitle} command line, in case you include the manual title
+in the heading.
+
+@TeX{} prints page headings only for that text that comes after the
+@code{@@end titlepage} command in the Texinfo file, or that comes
+after an @code{@@headings} command that turns on headings.
+(@xref{headings on off, , The @code{@@headings} Command}, for more
+information.)
+
+You may, if you wish, create your own, customized headings and footings.
+@xref{Headings}, for a detailed discussion of this.
+
+
+@node End of Header
+@subsection End of Header
+@cindex End of header line
+
+Follow the header lines with an @w{end-of-header} line, which is a
+Texinfo comment that looks like this:
+
+@example
+@@c %**end of header
+@end example
+
+@xref{Start of Header}.
+
+
+@node Document Permissions
+@section Document Permissions
+@cindex Document Permissions
+@cindex Copying Permissions
+
+The copyright notice and copying permissions for a document need to
+appear in several places in the various Texinfo output formats.
+Therefore, Texinfo provides a command (@code{@@copying}) to declare
+this text once, and another command (@code{@@insertcopying}) to
+insert the text at appropriate points.
+
+@menu
+* copying:: Declare the document's copying permissions.
+* insertcopying:: Where to insert the permissions.
+@end menu
+
+
+@node copying
+@subsection @code{@@copying}: Declare Copying Permissions
+@findex copying
+
+The @code{@@copying} command should be given very early in the document;
+the recommended location is right after the header material
+(@pxref{Texinfo File Header}). It conventionally consists of a sentence
+or two about what the program is, identification of the documentation
+itself, the legal copyright line, and the copying permissions. Here is
+a skeletal example:
+
+@example
+@@copying
+This manual is for @var{program} (version @var{version}, updated
+@var{date}), which @dots{}
+
+Copyright @@copyright@{@} @var{years} @var{copyright-owner}.
+
+@@quotation
+Permission is granted to @dots{}
+@@end quotation
+@@end copying
+@end example
+
+The @code{@@quotation} has no legal significance; it's there to improve
+readability in some contexts.
+
+@xref{GNU Sample Texts}, for the full text to be used in GNU manuals.
+@xref{GNU Free Documentation License}, for the license itself under
+which GNU and other free manuals are distributed. You need to include
+the license as an appendix to your document.
+
+The text of @code{@@copying} is output as a comment at the beginning of
+Info, HTML, and XML output files. It is @emph{not} output implicitly in
+plain text or @TeX{}; it's up to you to use @code{@@insertcopying} to
+emit the copying information. See the next section for details.
+
+@findex copyright
+The @code{@@copyright@{@}} command generates a @samp{c} inside a circle
+in output formats that support this (print and HTML). In the other
+formats (Info and plain text), it generates @samp{(C)}. The copyright
+notice itself has the following legally defined sequence:
+
+@example
+Copyright @copyright{} @var{years} @var{copyright-owner}.
+@end example
+
+@cindex Copyright word, always in English
+The word `Copyright' must always be written in English, even if the
+document is otherwise written in another language. This is due to
+international law.
+
+@cindex Years, in copyright line
+The list of years should include all years in which a version was
+completed (even if it was released in a subsequent year). Ranges are
+not allowed; each year must be written out individually and in full,
+separated by commas.
+
+@cindex Copyright holder for FSF works
+@cindex Holder of copyright for FSF works
+@cindex Owner of copyright for FSF works
+The copyright owner (or owners) is whoever holds legal copyright on the
+work. In the case of works assigned to the FSF, the owner is `Free
+Software Foundation, Inc.'.
+
+The copyright `line' may actually be split across multiple
+lines, both in the source document and in the output. This often
+happens for documents with a long history, having many different years
+of publication.
+
+@xref{Copyright Notices,,,maintain,GNU Maintenance Instructions}, for
+additional information.
+
+
+@node insertcopying
+@subsection @code{@@insertcopying}: Include Permissions Text
+@findex insertcopying
+@cindex Copying text, including
+@cindex Permissions text, including
+@cindex Including permissions text
+
+The @code{@@insertcopying} command is simply written on a line by
+itself, like this:
+
+@example
+@@insertcopying
+@end example
+
+This inserts the text previously defined by @code{@@copying}. To meet
+legal requirements, it must be used on the copyright page in the printed
+manual (@pxref{Copyright}).
+
+We also strongly recommend using @code{@@insertcopying} in the Top node
+of your manual (@pxref{The Top Node}), although it is not required
+legally. Here's why:
+
+The @code{@@copying} command itself causes the permissions text to
+appear in an Info file @emph{before} the first node. The text is also
+copied into the beginning of each split Info output file, as is legally
+necessary. This location implies a human reading the manual using Info
+does @emph{not} see this text (except when using the advanced Info
+command @kbd{g *}). Therefore, an explicit @code{@@insertcopying}
+in the Top node makes it apparent to readers that the manual is free.
+
+Similarly, the @code{@@copying} text is automatically included at the
+beginning of each HTML output file, as an HTML comment. Again, this
+text is not visible (unless the reader views the HTML source). And
+therefore again, the @code{@@insertcopying} in the Top node is valuable
+because it makes the copying permissions visible and thus promotes
+freedom.
+
+The permissions text defined by @code{@@copying} also appears
+automatically at the beginning of the XML output file.
+
+
+@node Titlepage & Copyright Page
+@section Title and Copyright Pages
+
+In hard copy output, the manual's name and author are usually printed on
+a title page. Copyright information is usually printed on the back of
+the title page.
+
+The title and copyright pages appear in the printed manual, but not in
+the Info file. Because of this, it is possible to use several slightly
+obscure @TeX{} typesetting commands that cannot be used in an Info file.
+In addition, this part of the beginning of a Texinfo file contains the
+text of the copying permissions that appears in the printed manual.
+
+@cindex Title page, for plain text
+@cindex Copyright page, for plain text
+You may wish to include titlepage-like information for plain text
+output. Simply place any such leading material between
+@code{@@ifplaintext} and @code{@@end ifplaintext}; @command{makeinfo}
+includes this when writing plain text (@samp{--no-headers}), along with
+an @code{@@insertcopying}.
+
+@menu
+* titlepage:: Create a title for the printed document.
+* titlefont center sp:: The @code{@@titlefont}, @code{@@center},
+ and @code{@@sp} commands.
+* title subtitle author:: The @code{@@title}, @code{@@subtitle},
+ and @code{@@author} commands.
+* Copyright:: How to write the copyright notice and
+ include copying permissions.
+* end titlepage:: Turn on page headings after the title and
+ copyright pages.
+* headings on off:: An option for turning headings on and off
+ and double or single sided printing.
+@end menu
+
+
+@node titlepage
+@subsection @code{@@titlepage}
+@cindex Title page
+@findex titlepage
+
+Start the material for the title page and following copyright page
+with @code{@@titlepage} on a line by itself and end it with
+@code{@@end titlepage} on a line by itself.
+
+The @code{@@end titlepage} command starts a new page and turns on page
+numbering. (@xref{Headings, , Page Headings}, for details about how to
+generate page headings.) All the material that you want to appear on
+unnumbered pages should be put between the @code{@@titlepage} and
+@code{@@end titlepage} commands. You can force the table of contents to
+appear there with the @code{@@setcontentsaftertitlepage} command
+(@pxref{Contents}).
+
+@findex page@r{, within @code{@@titlepage}}
+By using the @code{@@page} command you can force a page break within the
+region delineated by the @code{@@titlepage} and @code{@@end titlepage}
+commands and thereby create more than one unnumbered page. This is how
+the copyright page is produced. (The @code{@@titlepage} command might
+perhaps have been better named the @code{@@titleandadditionalpages}
+command, but that would have been rather long!)
+
+When you write a manual about a computer program, you should write the
+version of the program to which the manual applies on the title page.
+If the manual changes more frequently than the program or is independent
+of it, you should also include an edition number@footnote{We have found
+that it is helpful to refer to versions of independent manuals as
+`editions' and versions of programs as `versions'; otherwise, we find we
+are liable to confuse each other in conversation by referring to both
+the documentation and the software with the same words.} for the manual.
+This helps readers keep track of which manual is for which version of
+the program. (The `Top' node should also contain this information; see
+@ref{The Top Node}.)
+
+Texinfo provides two main methods for creating a title page. One method
+uses the @code{@@titlefont}, @code{@@sp}, and @code{@@center} commands
+to generate a title page in which the words on the page are
+centered.
+
+The second method uses the @code{@@title}, @code{@@subtitle}, and
+@code{@@author} commands to create a title page with black rules under
+the title and author lines and the subtitle text set flush to the
+right hand side of the page. With this method, you do not specify any
+of the actual formatting of the title page. You specify the text
+you want, and Texinfo does the formatting.
+
+You may use either method, or you may combine them; see the examples in
+the sections below.
+
+@findex shorttitlepage
+@cindex Bastard title page
+@cindex Title page, bastard
+For extremely simple documents, and for the bastard title page in
+traditional book frontmatter, Texinfo also provides a command
+@code{@@shorttitlepage} which takes the rest of the line as the title.
+The argument is typeset on a page by itself and followed by a blank
+page.
+
+
+@node titlefont center sp
+@subsection @code{@@titlefont}, @code{@@center}, and @code{@@sp}
+@findex titlefont
+@findex center
+@findex sp @r{(titlepage line spacing)}
+
+You can use the @code{@@titlefont}, @code{@@sp}, and @code{@@center}
+commands to create a title page for a printed document. (This is the
+first of the two methods for creating a title page in Texinfo.)
+
+Use the @code{@@titlefont} command to select a large font suitable for
+the title itself. You can use @code{@@titlefont} more than once if you
+have an especially long title.
+
+For HTML output, each @code{@@titlefont} command produces an
+@code{<h1>} heading, but the HTML document @code{<title>} is not
+affected. For that, you must put an @code{@@settitle} command before
+the @code{@@titlefont} command (@pxref{settitle}).
+
+@need 700
+For example:
+
+@example
+@@titlefont@{Texinfo@}
+@end example
+
+Use the @code{@@center} command at the beginning of a line to center
+the remaining text on that line. Thus,
+
+@example
+@@center @@titlefont@{Texinfo@}
+@end example
+
+@noindent
+centers the title, which in this example is ``Texinfo'' printed
+in the title font.
+
+Use the @code{@@sp} command to insert vertical space. For example:
+
+@example
+@@sp 2
+@end example
+
+@noindent
+This inserts two blank lines on the printed page. (@xref{sp, ,
+@code{@@sp}}, for more information about the @code{@@sp}
+command.)
+
+A template for this method looks like this:
+
+@example
+@group
+@@titlepage
+@@sp 10
+@@center @@titlefont@{@var{name-of-manual-when-printed}@}
+@@sp 2
+@@center @var{subtitle-if-any}
+@@sp 2
+@@center @var{author}
+@dots{}
+@@end titlepage
+@end group
+@end example
+
+The spacing of the example fits an 8.5 by 11 inch manual.
+
+You can in fact use these commands anywhere, not just on a title page,
+but since they are not logical markup commands, we don't recommend
+them.
+
+@node title subtitle author
+@subsection @code{@@title}, @code{@@subtitle}, and @code{@@author}
+@findex title
+@findex subtitle
+@findex author
+
+You can use the @code{@@title}, @code{@@subtitle}, and @code{@@author}
+commands to create a title page in which the vertical and horizontal
+spacing is done for you automatically. This contrasts with the method
+described in the previous section, in which the @code{@@sp} command is
+needed to adjust vertical spacing.
+
+Write the @code{@@title}, @code{@@subtitle}, or @code{@@author}
+commands at the beginning of a line followed by the title, subtitle,
+or author. These commands are only effective in @TeX{} output; it's
+an error to use them anywhere except within @code{@@titlepage}.
+
+The @code{@@title} command produces a line in which the title is set
+flush to the left-hand side of the page in a larger than normal font.
+The title is underlined with a black rule. Only a single line is
+allowed; the @code{@@*} command may not be used to break the title into
+two lines. To handle very long titles, you may find it profitable to
+use both @code{@@title} and @code{@@titlefont}; see the final example in
+this section.
+
+The @code{@@subtitle} command sets subtitles in a normal-sized font
+flush to the right-hand side of the page.
+
+The @code{@@author} command sets the names of the author or authors in
+a middle-sized font flush to the left-hand side of the page on a line
+near the bottom of the title page. The names are underlined with a
+black rule that is thinner than the rule that underlines the title.
+(The black rule only occurs if the @code{@@author} command line is
+followed by an @code{@@page} command line.)
+
+There are two ways to use the @code{@@author} command: you can write
+the name or names on the remaining part of the line that starts with
+an @code{@@author} command:
+
+@example
+@@author by Jane Smith and John Doe
+@end example
+
+@noindent
+or you can write the names one above each other by using two (or more)
+@code{@@author} commands:
+
+@example
+@group
+@@author Jane Smith
+@@author John Doe
+@end group
+@end example
+
+@noindent
+(Only the bottom name is underlined with a black rule.)
+
+@need 950
+A template for this method looks like this:
+
+@example
+@group
+@@titlepage
+@@title @var{name-of-manual-when-printed}
+@@subtitle @var{subtitle-if-any}
+@@subtitle @var{second-subtitle}
+@@author @var{author}
+@@page
+@dots{}
+@@end titlepage
+@end group
+@end example
+
+You may also combine the @code{@@titlefont} method described in the
+previous section and @code{@@title} method described in this one. This
+may be useful if you have a very long title. Here is a real-life example:
+
+@example
+@group
+@@titlepage
+@@titlefont@{GNU Software@}
+@@sp 1
+@@title for MS-Windows and MS-DOS
+@@subtitle Edition @@value@{e@} for Release @@value@{cde@}
+@@author by Daniel Hagerty, Melissa Weisshaus
+@@author and Eli Zaretskii
+@end group
+@end example
+
+@noindent
+(The use of @code{@@value} here is explained in @ref{value Example}.
+
+
+@node Copyright
+@subsection Copyright Page
+@cindex Copyright page
+@cindex Printed permissions
+@cindex Permissions, printed
+
+By international treaty, the copyright notice for a book must be either
+on the title page or on the back of the title page. When the copyright
+notice is on the back of the title page, that page is customarily not
+numbered. Therefore, in Texinfo, the information on the copyright page
+should be within @code{@@titlepage} and @code{@@end titlepage}
+commands.
+
+@findex vskip @r{@TeX{} vertical skip}
+@findex filll @r{@TeX{} dimension}
+Use the @code{@@page} command to cause a page break. To push the
+copyright notice and the other text on the copyright page towards the
+bottom of the page, use the following incantantion after @code{@@page}:
+
+@example
+@@vskip 0pt plus 1filll
+@end example
+
+@noindent
+This is a @TeX{} command that is not supported by the Info formatting
+commands. The @code{@@vskip} command inserts whitespace. The @samp{0pt
+plus 1filll} means to put in zero points of mandatory whitespace, and as
+much optional whitespace as needed to push the following text to the
+bottom of the page. Note the use of three @samp{l}s in the word
+@samp{filll}; this is correct.
+
+To insert the copyright text itself, write @code{@@insertcopying}
+next (@pxref{Document Permissions}):
+
+@example
+@@insertcopying
+@end example
+
+Follow the copying text by the publisher, ISBN numbers, cover art
+credits, and other such information.
+
+Here is an example putting all this together:
+
+@example
+@@titlepage
+@dots{}
+@@page
+@@vskip 0pt plus 1filll
+@@insertcopying
+
+Published by @dots{}
+
+Cover art by @dots{}
+@@end titlepage
+@end example
+
+
+@node end titlepage
+@subsection Heading Generation
+@findex end titlepage
+@cindex Headings, page, begin to appear
+@cindex Titlepage end starts headings
+@cindex End titlepage starts headings
+
+Like all @code{@@end} commands (@pxref{Quotations and Examples}), the @code{@@end titlepage} command
+must be written at the beginning of a line by itself, with only one
+space between the @code{@@end} and the @code{titlepage}. It not only
+marks the end of the title and copyright pages, but also causes @TeX{}
+to start generating page headings and page numbers.
+
+To repeat what is said elsewhere, Texinfo has two standard page heading
+formats, one for documents which are printed on one side of each sheet of paper
+(single-sided printing), and the other for documents which are printed on both
+sides of each sheet (double-sided printing).
+You can specify these formats in different ways:
+
+@itemize @bullet
+@item
+The conventional way is to write an @code{@@setchapternewpage} command
+before the title page commands, and then have the @code{@@end
+titlepage} command start generating page headings in the manner desired.
+(@xref{setchapternewpage}.)
+
+@item
+Alternatively, you can use the @code{@@headings} command to prevent page
+headings from being generated or to start them for either single or
+double-sided printing. (Write an @code{@@headings} command immediately
+after the @code{@@end titlepage} command. @xref{headings on off, , The
+@code{@@headings} Command}, for more information.)@refill
+
+@item
+Or, you may specify your own page heading and footing format.
+@xref{Headings, , Page Headings}, for detailed
+information about page headings and footings.
+@end itemize
+
+Most documents are formatted with the standard single-sided or
+double-sided format, using @code{@@setchapternewpage odd} for
+double-sided printing and no @code{@@setchapternewpage} command for
+single-sided printing.
+
+
+@node headings on off
+@subsection The @code{@@headings} Command
+@findex headings
+
+The @code{@@headings} command is rarely used. It specifies what kind of
+page headings and footings to print on each page. Usually, this is
+controlled by the @code{@@setchapternewpage} command. You need the
+@code{@@headings} command only if the @code{@@setchapternewpage} command
+does not do what you want, or if you want to turn off pre-defined page
+headings prior to defining your own. Write an @code{@@headings} command
+immediately after the @code{@@end titlepage} command.@refill
+
+You can use @code{@@headings} as follows:@refill
+
+@table @code
+@item @@headings off
+Turn off printing of page headings.@refill
+
+@item @@headings single
+Turn on page headings appropriate for single-sided printing.
+@refill
+
+@item @@headings double
+@itemx @@headings on
+Turn on page headings appropriate for double-sided printing. The two
+commands, @code{@@headings on} and @code{@@headings double}, are
+synonymous.@refill
+
+@item @@headings singleafter
+@itemx @@headings doubleafter
+Turn on @code{single} or @code{double} headings, respectively, after the
+current page is output.
+
+@item @@headings on
+Turn on page headings: @code{single} if @samp{@@setchapternewpage
+on}, @code{double} otherwise.
+@end table
+
+For example, suppose you write @code{@@setchapternewpage off} before the
+@code{@@titlepage} command to tell @TeX{} to start a new chapter on the
+same page as the end of the last chapter. This command also causes
+@TeX{} to typeset page headers for single-sided printing. To cause
+@TeX{} to typeset for double sided printing, write @code{@@headings
+double} after the @code{@@end titlepage} command.
+
+You can stop @TeX{} from generating any page headings at all by
+writing @code{@@headings off} on a line of its own immediately after the
+line containing the @code{@@end titlepage} command, like this:@refill
+
+@example
+@@end titlepage
+@@headings off
+@end example
+
+@noindent
+The @code{@@headings off} command overrides the @code{@@end titlepage}
+command, which would otherwise cause @TeX{} to print page
+headings.@refill
+
+You can also specify your own style of page heading and footing.
+@xref{Headings, , Page Headings}, for more information.@refill
+
+
+@node Contents
+@section Generating a Table of Contents
+@cindex Table of contents
+@cindex Contents, Table of
+@cindex Short table of contents
+@findex contents
+@findex summarycontents
+@findex shortcontents
+
+The @code{@@chapter}, @code{@@section}, and other structuring commands
+(@pxref{Structuring}) supply the information to make up a
+table of contents, but they do not cause an actual table to appear in
+the manual. To do this, you must use the @code{@@contents} and/or
+@code{@@summarycontents} command(s).
+
+@table @code
+@item @@contents
+Generates a table of contents in a printed manual, including all
+chapters, sections, subsections, etc., as well as appendices and
+unnumbered chapters. Headings generated by @code{@@majorheading},
+@code{@@chapheading}, and the other @code{@@@dots{}heading} commands
+do not appear in the table of contents (@pxref{Structuring Command
+Types}).
+
+@item @@shortcontents
+@itemx @@summarycontents
+(@code{@@summarycontents} is a synonym for @code{@@shortcontents}.)
+
+Generates a short or summary table of contents that lists only the
+chapters, appendices, and unnumbered chapters. Sections, subsections
+and subsubsections are omitted. Only a long manual needs a short
+table of contents in addition to the full table of contents.
+
+@end table
+
+Both contents commands should be written on a line by themselves, and
+are best placed near the beginning of the file, after the @code{@@end
+titlepage} (@pxref{titlepage}). The contents commands automatically
+generate a chapter-like heading at the top of the first table of
+contents page, so don't include any sectioning command such as
+@code{@@unnumbered} before them.
+
+Since an Info file uses menus instead of tables of contents, the Info
+formatting commands ignore the contents commands. But the contents are
+included in plain text output (generated by @code{makeinfo
+--no-headers}), unless @code{makeinfo} is writing its output to standard
+output.
+
+When @code{makeinfo} writes a short table of contents while producing
+html output, the links in the short table of contents point to
+corresponding entries in the full table of contents rather than the text
+of the document. The links in the full table of contents point to the
+main text of the document.
+
+In the past, the contents commands were sometimes placed at the end of
+the file, after any indices and just before the @code{@@bye}, but we
+no longer recommend this.
+
+@findex setcontentsaftertitlepage
+@findex setshortcontentsaftertitlepage
+@cindex Contents, after title page
+@cindex Table of contents, after title page
+However, since many existing Texinfo documents still do have the
+@code{@@contents} at the end of the manual, if you are a user printing
+a manual, you may wish to force the contents to be printed after the
+title page. You can do this by specifying
+@code{@@setcontentsaftertitlepage} and/or
+@code{@@setshortcontentsaftertitlepage}. The first prints only the
+main contents after the @code{@@end titlepage}; the second prints both
+the short contents and the main contents. In either case, any
+subsequent @code{@@contents} or @code{@@shortcontents} is ignored
+(unless, erroneously, no @code{@@end titlepage} is ever encountered).
+
+You need to include the @code{@@set@dots{}contentsaftertitlepage}
+commands early in the document (just after @code{@@setfilename}, for
+example). We recommend using @command{texi2dvi} (@pxref{Format with
+texi2dvi}) to specify this without altering the source file at all. For
+example:
+@example
+texi2dvi --texinfo=@@setcontentsaftertitlepage foo.texi
+@end example
+
+
+@node The Top Node
+@section The `Top' Node and Master Menu
+@cindex Top node
+@cindex Node, `Top'
+
+The `Top' node is the node in which a reader enters an Info manual. As
+such, it should begin with the @code{@@insertcopying} command
+(@pxref{Document Permissions}) to provide a brief description of the
+manual (including the version number) and copying permissions, and end
+with a master menu for the whole manual. Of course you should include
+any other general information you feel a reader would find helpful.
+
+@findex top
+It is also conventional to write an @code{@@top} sectioning command line
+containing the title of the document immediately after the @code{@@node
+Top} line (@pxref{makeinfo top command, , The @code{@@top} Sectioning
+Command}).
+
+The contents of the `Top' node should appear only in the online output;
+none of it should appear in printed output, so enclose it between
+@code{@@ifnottex} and @code{@@end ifnottex} commands. (@TeX{} does not
+print either an @code{@@node} line or a menu; they appear only in Info;
+strictly speaking, you are not required to enclose these parts between
+@code{@@ifnottex} and @code{@@end ifnottext}, but it is simplest to do
+so. @xref{Conditionals, , Conditionally Visible Text}.)
+
+@menu
+* Top Node Example::
+* Master Menu Parts::
+@end menu
+
+
+@node Top Node Example
+@subsection Top Node Example
+
+@cindex Top node example
+
+Here is an example of a Top node.
+
+@example
+@group
+@@ifnottex
+@@node Top
+@@top Sample Title
+
+@@insertcopying
+@end group
+
+Additional general information.
+
+@group
+@@menu
+* First Chapter::
+* Second Chapter::
+@dots{}
+* Index::
+@end group
+@@end menu
+@end example
+
+
+@node Master Menu Parts
+@subsection Parts of a Master Menu
+@cindex Master menu
+@cindex Menu, master
+@cindex Parts of a master menu
+
+A @dfn{master menu} is a detailed main menu listing all the nodes in a
+file.
+
+A master menu is enclosed in @code{@@menu} and @code{@@end menu}
+commands and does not appear in the printed document.
+
+Generally, a master menu is divided into parts.
+
+@itemize @bullet
+@item
+The first part contains the major nodes in the Texinfo file: the nodes
+for the chapters, chapter-like sections, and the appendices.
+
+@item
+The second part contains nodes for the indices.
+
+@item
+The third and subsequent parts contain a listing of the other, lower
+level nodes, often ordered by chapter. This way, rather than go
+through an intermediary menu, an inquirer can go directly to a
+particular node when searching for specific information. These menu
+items are not required; add them if you think they are a
+convenience. If you do use them, put @code{@@detailmenu} before the
+first one, and @code{@@end detailmenu} after the last; otherwise,
+@code{makeinfo} will get confused.
+@end itemize
+
+Each section in the menu can be introduced by a descriptive line. So
+long as the line does not begin with an asterisk, it will not be
+treated as a menu entry. (@xref{Writing a Menu}, for more
+information.)
+
+For example, the master menu for this manual looks like the following
+(but has many more entries):
+
+@example
+@group
+@@menu
+* Copying Conditions:: Your rights.
+* Overview:: Texinfo in brief.
+@dots{}
+@end group
+@group
+* Command and Variable Index::
+* Concept Index::
+@end group
+
+@group
+@@detailmenu
+--- The Detailed Node Listing ---
+
+Overview of Texinfo
+
+* Reporting Bugs:: @dots{}
+@dots{}
+@end group
+
+@group
+Beginning a Texinfo File
+
+* Sample Beginning:: @dots{}
+@dots{}
+@@end detailmenu
+@@end menu
+@end group
+@end example
+
+
+@node Global Document Commands
+@section Global Document Commands
+@cindex Global Document Commands
+
+Besides the basic commands mentioned in the previous sections, here are
+additional commands which affect the document as a whole. They are
+generally all given before the Top node, if they are given at all.
+
+@menu
+* documentdescription:: Document summary for the HTML output.
+* setchapternewpage:: Start chapters on right-hand pages.
+* paragraphindent:: Specify paragraph indentation.
+* firstparagraphindent:: Suppress indentation of the first paragraph.
+* exampleindent:: Specify environment indentation.
+@end menu
+
+
+@node documentdescription
+@subsection @code{@@documentdescription}: Summary Text
+@cindex Document description
+@cindex Description of document
+@cindex Summary of document
+@cindex Abstract of document
+@cindex <meta> HTML tag, and document description
+@findex documentdescription
+
+When producing HTML output for a document, @command{makeinfo} writes a
+@samp{<meta>} element in the @samp{<head>} to give some idea of the
+content of the document. By default, this @dfn{description} is the title
+of the document, taken from the @code{@@settitle} command
+(@pxref{settitle}). To change this, use the @code{@@documentdescription}
+environment, as in:
+
+@example
+@@documentdescription
+descriptive text.
+@@end documentdescription
+@end example
+
+@noindent
+This will produce the following output in the @samp{<head>} of the HTML:
+
+@example
+<meta name=description content="descriptive text.">
+@end example
+
+@code{@@documentdescription} must be specified before the first node of
+the document.
+
+
+@node setchapternewpage
+@subsection @code{@@setchapternewpage}:
+@cindex Starting chapters
+@cindex Pages, starting odd
+@findex setchapternewpage
+
+In an officially bound book, text is usually printed on both sides of
+the paper, chapters start on right-hand pages, and right-hand pages have
+odd numbers. But in short reports, text often is printed only on one
+side of the paper. Also in short reports, chapters sometimes do not
+start on new pages, but are printed on the same page as the end of the
+preceding chapter, after a small amount of vertical whitespace.
+
+You can use the @code{@@setchapternewpage} command with various
+arguments to specify how @TeX{} should start chapters and whether it
+should format headers for printing on one or both sides of the paper
+(single-sided or double-sided printing).
+
+Write the @code{@@setchapternewpage} command at the beginning of a
+line followed by its argument.
+
+For example, you would write the following to cause each chapter to
+start on a fresh odd-numbered page:
+
+@example
+@@setchapternewpage odd
+@end example
+
+You can specify one of three alternatives with the
+@code{@@setchapternewpage} command:
+
+@table @asis
+
+@item @code{@@setchapternewpage off}
+Cause @TeX{} to typeset a new chapter on the same page as the last
+chapter, after skipping some vertical whitespace. Also, cause @TeX{} to
+format page headers for single-sided printing.
+
+@item @code{@@setchapternewpage on}
+Cause @TeX{} to start new chapters on new pages and to format page
+headers for single-sided printing. This is the form most often used for
+short reports or personal printing. This is the default.
+
+@item @code{@@setchapternewpage odd}
+Cause @TeX{} to start new chapters on new, odd-numbered pages
+(right-handed pages) and to typeset for double-sided printing. This is
+the form most often used for books and manuals.
+@end table
+
+Texinfo does not have an @code{@@setchapternewpage even} command,
+because there is no printing tradition of starting chapters or books on
+an even-numbered page.
+
+If you don't like the default headers that @code{@@setchapternewpage}
+sets, you can explicit control them with the @code{@@headings} command.
+@xref{headings on off, , The @code{@@headings} Command}.
+
+At the beginning of a manual or book, pages are not numbered---for
+example, the title and copyright pages of a book are not numbered. By
+convention, table of contents and frontmatter pages are numbered with
+roman numerals and not in sequence with the rest of the document.
+
+Since an Info file does not have pages, the @code{@@setchapternewpage}
+command has no effect on it.
+
+We recommend not including any @code{@@setchapternewpage} command in
+your manual sources at all, since the desired output is not intrinsic to
+the document. For a particular hard copy run, if you don't want the
+default option (no blank pages, same headers on all pages) use the
+@option{--texinfo} option to @command{texi2dvi} to specify the output
+you want.
+
+
+@node paragraphindent
+@subsection @code{@@paragraphindent}: Paragraph Indenting
+@cindex Indenting paragraphs, control of
+@cindex Paragraph indentation control
+@findex paragraphindent
+
+The Texinfo processors may insert whitespace at the beginning of the
+first line of each paragraph, thereby indenting that paragraph. You can
+use the @code{@@paragraphindent} command to specify this indentation.
+Write an @code{@@paragraphindent} command at the beginning of a line
+followed by either @samp{asis} or a number:
+
+@example
+@@paragraphindent @var{indent}
+@end example
+
+The indentation is according to the value of @var{indent}:
+
+@table @asis
+@item @code{asis}
+Do not change the existing indentation (not implemented in @TeX{}).
+
+@item @code{none}
+@itemx 0
+Omit all indentation.
+
+@item @var{n}
+Indent by @var{n} space characters in Info output, by @var{n} ems in
+@TeX{}.
+
+@end table
+
+The default value of @var{indent} is 3. @code{@@paragraphindent} is
+ignored for HTML output.
+
+It is best to write the @code{@@paragraphindent} command before the
+end-of-header line at the beginning of a Texinfo file, so the region
+formatting commands indent paragraphs as specified. @xref{Start of
+Header}.
+
+A peculiarity of the @code{texinfo-format-buffer} and
+@code{texinfo-format-region} commands is that they do not indent (nor
+fill) paragraphs that contain @code{@@w} or @code{@@*} commands.
+
+
+@node firstparagraphindent
+@subsection @code{@@firstparagraphindent}: Indenting After Headings
+@cindex First paragraph, suppressing indentation of
+@cindex Suppressing first paragraph indentation
+@cindex Preventing first paragraph indentation
+@cindex Indenting, suppressing of first paragraph
+@cindex Headings, indentation after
+@findex firstparagraphindent
+
+As you can see in the present manual, the first paragraph in any
+section is not indented by default. Typographically, indentation is a
+paragraph separator, which means that it is unnecessary when a new
+section begins. This indentation is controlled with the
+@code{@@firstparagraphindent} command:
+
+@example
+@@firstparagraphindent @var{word}
+@end example
+
+The first paragraph after a heading is indented according to the value
+of @var{word}:
+
+@table @asis
+@item @code{none}
+Prevents the first paragraph from being indented (default).
+This option is ignored by @command{makeinfo} if
+@code{@@paragraphindent asis} is in effect.
+
+@item @code{insert}
+Include normal paragraph indentation. This respects the paragraph
+indentation set by a @code{@@paragraphindent} command
+(@pxref{paragraphindent}).
+@end table
+
+For HTML and XML output, the @code{@@firstparagraphindent} setting is
+ignored.
+
+It is best to write the @code{@@paragraphindent} command before the
+end-of-header line at the beginning of a Texinfo file, so the region
+formatting commands indent paragraphs as specified. @xref{Start of
+Header}.
+
+
+@node exampleindent
+@subsection @code{@@exampleindent}: Environment Indenting
+@cindex Indenting environments
+@cindex Environment indentation
+@cindex Example indentation
+@findex exampleindent
+
+The Texinfo processors indent each line of @code{@@example} and similar
+environments. You can use the @code{@@exampleindent} command to specify
+this indentation. Write an @code{@@exampleindent} command at the
+beginning of a line followed by either @samp{asis} or a number:
+
+@example
+@@exampleindent @var{indent}
+@end example
+
+@code{@@exampleindent} is ignored for HTML output. Otherwise, the
+indentation is according to the value of @var{indent}:
+
+@table @asis
+@item @code{asis}
+Do not change the existing indentation (not implemented in @TeX{}).
+
+@item 0
+Omit all indentation.
+
+@item @var{n}
+Indent environments by @var{n} space characters in Info output, by
+@var{n} ems in @TeX{}.
+
+@end table
+
+The default value of @var{indent} is 5 spaces in Info, and 0.4@dmn{in}
+in @TeX{}, which is somewhat less. (The reduction is to help @TeX{}
+fit more characters onto physical lines.)
+
+It is best to write the @code{@@exampleindent} command before the
+end-of-header line at the beginning of a Texinfo file, so the region
+formatting commands indent paragraphs as specified. @xref{Start of
+Header}.
+
+
+@node Software Copying Permissions
+@section Software Copying Permissions
+@cindex Software copying permissions
+@cindex Copying software
+@cindex Distribution
+@cindex License agreement
+
+If the Texinfo file has a section containing the ``General Public
+License'' and the distribution information and a warranty disclaimer for
+the software that is documented, we recommend placing this right after
+the `Top' node. The General Public License is very important to Project
+GNU software. It ensures that you and others will continue to have a
+right to use and share the software.
+
+The copying and distribution information and the disclaimer are followed
+by an introduction or else by the first chapter of the manual.
+
+@cindex Introduction, as part of file
+Although an introduction is not a required part of a Texinfo file, it
+is very helpful. Ideally, it should state clearly and concisely what
+the file is about and who would be interested in reading it. In
+general, an introduction would follow the licensing and distribution
+information, although sometimes people put it earlier in the document.
+
+
+@node Ending a File
+@chapter Ending a Texinfo File
+@cindex Ending a Texinfo file
+@cindex Texinfo file ending
+@cindex File ending
+@findex bye
+
+The end of a Texinfo file should include commands to create indices,
+and the @code{@@bye} command to mark the last line to be processed.
+
+For example:
+
+@example
+@@node Index
+@@unnumbered Index
+
+@@printindex cp
+
+@@bye
+@end example
+
+@menu
+* Printing Indices & Menus:: How to print an index in hardcopy and
+ generate index menus in Info.
+* File End:: How to mark the end of a file.
+@end menu
+
+
+@node Printing Indices & Menus
+@section Printing Indices and Menus
+@cindex Printing an index
+@cindex Indices, printing and menus
+@cindex Generating menus with indices
+@cindex Menus generated with indices
+
+To print an index means to include it as part of a manual or Info file.
+This does not happen automatically just because you use @code{@@cindex}
+or other index-entry generating commands in the Texinfo file; those just
+cause the raw data for the index to be accumulated. To generate an
+index, you must include the @code{@@printindex} command at the place in
+the document where you want the index to appear. Also, as part of the
+process of creating a printed manual, you must run a program called
+@code{texindex} (@pxref{Hardcopy}) to sort the raw data to produce a
+sorted index file. The sorted index file is what is actually used to
+print the index.
+
+Texinfo offers six separate types of predefined index, which suffice
+in most cases. @xref{Indices}, for information on this, as well
+defining your own new indices, combining indices, and, most
+importantly advice on writing the actual index entries. This section
+focuses on printing indices, which is done with the
+@code{@@printindex} command.
+
+@findex printindex
+@code{@@printindex} takes one argument, a two-letter index
+abbreviation. It reads the corresponding sorted index file (for
+printed output), and formats it appropriately into an index.
+
+The @code{@@printindex} command does not generate a chapter heading
+for the index, since different manuals have different needs.
+Consequently, you should precede the @code{@@printindex} command with
+a suitable section or chapter command (usually @code{@@appendix} or
+@code{@@unnumbered}) to supply the chapter heading and put the index
+into the table of contents. Precede the chapter heading with an
+@code{@@node} line as usual.
+
+For example:
+
+@smallexample
+@group
+@@node Variable Index
+@@unnumbered Variable Index
+
+@@printindex vr
+@end group
+
+@group
+@@node Concept Index
+@@unnumbered Concept Index
+
+@@printindex cp
+@end group
+@end smallexample
+
+If you have more than one index, we recommend placing the concept index last.
+
+@itemize
+@item
+In printed output, @code{@@printindex} produces a traditional
+two-column index, with dot leaders between the index terms and page
+numbers.
+
+@item
+In Info output, @code{@@printindex} produces a special menu containing
+the line number of the entry, relative to the start of the node. Info
+readers can use this to go to the exact line of an entry, not just the
+containing node. (Older Info readers will just go to the node.)
+Here's an example:
+
+@smallexample
+* First index entry: Top. (line 7)
+@end smallexample
+
+@noindent The actual number of spaces is variable, to right-justify
+the line number; it's been reduced here to make the line fit in the
+printed manual.
+
+@item
+In plain text output, @code{@@printindex} produces the same menu, but
+the line numbers are relative to the start of the file, since that's
+more convenient for that format.
+
+@item
+In HTML and Docbook output, @code{@@printindex} produces links
+to the index entries.
+
+@item
+In XML output, it simply records the index to be printed.
+@end itemize
+
+It's not possible to generate an index when writing to standard
+output; @command{makeinfo} generates a warning in this case.
+
+
+@node File End
+@section @code{@@bye} File Ending
+@findex bye
+
+An @code{@@bye} command terminates Texinfo processing. None of the
+formatters read anything following @code{@@bye}. The @code{@@bye}
+command should be on a line by itself.
+
+If you wish, you may follow the @code{@@bye} line with notes. These
+notes will not be formatted and will not appear in either Info or a
+printed manual; it is as if text after @code{@@bye} were within
+@code{@@ignore} @dots{} @code{@@end ignore}. Also, you may follow the
+@code{@@bye} line with a local variables list for Emacs.
+@xref{Compile-Command, , Using Local Variables and the Compile Command},
+for more information.
+
+
+@node Structuring
+@chapter Chapter Structuring
+@cindex Chapter structuring
+@cindex Structuring of chapters
+
+The @dfn{chapter structuring} commands divide a document into a hierarchy of
+chapters, sections, subsections, and subsubsections. These commands
+generate large headings; they also provide information for the table
+of contents of a printed manual (@pxref{Contents, , Generating a Table
+of Contents}).@refill
+
+The chapter structuring commands do not create an Info node structure,
+so normally you should put an @code{@@node} command immediately before
+each chapter structuring command (@pxref{Nodes}). The only time you
+are likely to use the chapter structuring commands without using the
+node structuring commands is if you are writing a document that
+contains no cross references and will never be transformed into Info
+format.@refill
+
+It is unlikely that you will ever write a Texinfo file that is
+intended only as an Info file and not as a printable document. If you
+do, you might still use chapter structuring commands to create a
+heading at the top of each node---but you don't need to.@refill
+
+@menu
+* Tree Structuring:: A manual is like an upside down tree @dots{}
+* Structuring Command Types:: How to divide a manual into parts.
+* makeinfo top:: The @code{@@top} command, part of the `Top' node.
+* chapter::
+* unnumbered & appendix::
+* majorheading & chapheading::
+* section::
+* unnumberedsec appendixsec heading::
+* subsection::
+* unnumberedsubsec appendixsubsec subheading::
+* subsubsection:: Commands for the lowest level sections.
+* Raise/lower sections:: How to change commands' hierarchical level.
+@end menu
+
+
+@node Tree Structuring
+@section Tree Structure of Sections
+@cindex Tree structuring
+
+A Texinfo file is usually structured like a book with chapters,
+sections, subsections, and the like. This structure can be visualized
+as a tree (or rather as an upside-down tree) with the root at the top
+and the levels corresponding to chapters, sections, subsection, and
+subsubsections.@refill
+
+Here is a diagram that shows a Texinfo file with three chapters,
+each of which has two sections.@refill
+
+@example
+@group
+ Top
+ |
+ -------------------------------------
+ | | |
+ Chapter 1 Chapter 2 Chapter 3
+ | | |
+ -------- -------- --------
+ | | | | | |
+Section Section Section Section Section Section
+ 1.1 1.2 2.1 2.2 3.1 3.2
+
+@end group
+@end example
+
+In a Texinfo file that has this structure, the beginning of Chapter 2
+looks like this:@refill
+
+@example
+@group
+@@node Chapter 2, Chapter 3, Chapter 1, top
+@@chapter Chapter 2
+@end group
+@end example
+
+The chapter structuring commands are described in the sections that
+follow; the @code{@@node} and @code{@@menu} commands are described in
+following chapters. (@xref{Nodes}, and see @ref{Menus}.)@refill
+
+
+@node Structuring Command Types
+@section Structuring Command Types
+
+The chapter structuring commands fall into four groups or series, each
+of which contains structuring commands corresponding to the
+hierarchical levels of chapters, sections, subsections, and
+subsubsections.@refill
+
+The four groups are the @code{@@chapter} series, the
+@code{@@unnumbered} series, the @code{@@appendix} series, and the
+@code{@@heading} series.@refill
+
+Each command produces titles that have a different appearance on the
+printed page or Info file; only some of the commands produce
+titles that are listed in the table of contents of a printed book or
+manual.@refill
+
+@itemize @bullet
+@item
+The @code{@@chapter} and @code{@@appendix} series of commands produce
+numbered or lettered entries both in the body of a printed work and in
+its table of contents.@refill
+
+@item
+The @code{@@unnumbered} series of commands produce unnumbered entries
+both in the body of a printed work and in its table of contents. The
+@code{@@top} command, which has a special use, is a member of this
+series (@pxref{makeinfo top, , @code{@@top}}). An @code{@@unnumbered}
+section should be associated with a node and be a normal part of the
+document structure.
+
+@item
+The @code{@@heading} series of commands produce simple unnumbered
+headings that do not appear in a table of contents, are not associated
+with nodes, and cannot be cross-referenced. The heading commands
+never start a new page.
+
+@item
+The @code{@@majorheading} command is similar to @code{@@chapheading},
+except that it generates a larger vertical whitespace before the
+heading.
+
+@item
+When an @code{@@setchapternewpage} command says to do so, the
+@code{@@chapter}, @code{@@unnumbered}, and @code{@@appendix} commands
+start new pages in the printed manual; the @code{@@heading} commands
+do not.@refill
+@end itemize
+
+Here are the four groups of chapter structuring commands:
+
+@tex
+{\globaldefs = 1 \smallfonts}
+@end tex
+
+@multitable @columnfractions .19 .30 .29 .22
+@item @tab @tab @tab No new page
+@item @i{Numbered} @tab @i{Unnumbered} @tab @i{Lettered/numbered} @tab @i{Unnumbered}
+@item In contents @tab In contents @tab In contents @tab Not in contents
+@item @tab @code{@@top} @tab @tab @code{@@majorheading}
+@item @code{@@chapter} @tab @code{@@unnumbered} @tab @code{@@appendix} @tab @code{@@chapheading}
+@item @code{@@section} @tab @code{@@unnumberedsec} @tab @code{@@appendixsec} @tab @code{@@heading}
+@item @code{@@subsection} @tab @code{@@unnumberedsubsec} @tab @code{@@appendixsubsec} @tab @code{@@subheading}
+@item @code{@@subsubsection} @tab @code{@@unnumberedsubsubsec} @tab @code{@@appendixsubsubsec} @tab @code{@@subsubheading}
+@end multitable
+@tex
+{\globaldefs = 1 \textfonts}
+@end tex
+
+
+@node makeinfo top
+@section @code{@@top}
+
+The @code{@@top} command is a special sectioning command that you use
+only after an @samp{@@node Top} line at the beginning of a Texinfo file.
+The @code{@@top} command tells the @code{makeinfo} formatter which node
+is the `Top' node, so it can use it as the root of the node tree if your
+manual uses implicit node pointers. It has the same typesetting effect as
+@code{@@unnumbered} (@pxref{unnumbered & appendix, , @code{@@unnumbered}
+and @code{@@appendix}}). For detailed information, see @ref{makeinfo
+top command, , The @code{@@top} Command}.
+
+The @code{@@top} node and its menu (if any) is conventionally wrapped in
+an @code{@@ifnottex} conditional so that it will appear only in Info and
+HTML output, not @TeX{}.
+
+
+@node chapter
+@comment node-name, next, previous, up
+@section @code{@@chapter}
+@findex chapter
+
+@code{@@chapter} identifies a chapter in the document. Write the
+command at the beginning of a line and follow it on the same line by
+the title of the chapter.@refill
+
+For example, this chapter in this manual is entitled ``Chapter
+Structuring''; the @code{@@chapter} line looks like this:@refill
+
+@example
+@@chapter Chapter Structuring
+@end example
+
+In @TeX{}, the @code{@@chapter} command creates a chapter in the
+document, specifying the chapter title. The chapter is numbered
+automatically.@refill
+
+In Info, the @code{@@chapter} command causes the title to appear on a
+line by itself, with a line of asterisks inserted underneath. Thus,
+in Info, the above example produces the following output:@refill
+
+@example
+Chapter Structuring
+*******************
+@end example
+
+@findex centerchap
+Texinfo also provides a command @code{@@centerchap}, which is analogous
+to @code{@@unnumbered}, but centers its argument in the printed output.
+This kind of stylistic choice is not usually offered by Texinfo.
+@c but the Hacker's Dictionary wanted it ...
+
+
+@node unnumbered & appendix
+@section @code{@@unnumbered} and @code{@@appendix}
+@findex unnumbered
+@findex appendix
+
+Use the @code{@@unnumbered} command to create a chapter that appears
+in a printed manual without chapter numbers of any kind. Use the
+@code{@@appendix} command to create an appendix in a printed manual
+that is labelled by letter instead of by number.@refill
+
+For Info file output, the @code{@@unnumbered} and @code{@@appendix}
+commands are equivalent to @code{@@chapter}: the title is printed on a
+line by itself with a line of asterisks underneath. (@xref{chapter, ,
+@code{@@chapter}}.)@refill
+
+To create an appendix or an unnumbered chapter, write an
+@code{@@appendix} or @code{@@unnumbered} command at the beginning of a
+line and follow it on the same line by the title, as you would if you
+were creating a chapter.@refill
+
+
+@node majorheading & chapheading
+@section @code{@@majorheading}, @code{@@chapheading}
+@findex majorheading
+@findex chapheading
+
+The @code{@@majorheading} and @code{@@chapheading} commands put
+chapter-like headings in the body of a document.@refill
+
+However, neither command causes @TeX{} to produce a numbered heading
+or an entry in the table of contents; and neither command causes
+@TeX{} to start a new page in a printed manual.@refill
+
+In @TeX{}, an @code{@@majorheading} command generates a larger vertical
+whitespace before the heading than an @code{@@chapheading} command but
+is otherwise the same.
+
+In Info,
+the @code{@@majorheading} and
+@code{@@chapheading} commands are equivalent to
+@code{@@chapter}: the title is printed on a line by itself with a line
+of asterisks underneath. (@xref{chapter, , @code{@@chapter}}.)@refill
+
+
+@node section
+@comment node-name, next, previous, up
+@section @code{@@section}
+@findex section
+
+In a printed manual, an @code{@@section} command identifies a
+numbered section within a chapter. The section title appears in the
+table of contents. In Info, an @code{@@section} command provides a
+title for a segment of text, underlined with @samp{=}.@refill
+
+This section is headed with an @code{@@section} command and looks like
+this in the Texinfo file:@refill
+
+@example
+@@section @@code@{@@@@section@}
+@end example
+
+To create a section, write the @code{@@section} command at the
+beginning of a line and follow it on the same line by the section
+title.@refill
+
+Thus,
+
+@example
+@@section This is a section
+@end example
+
+@noindent
+produces
+
+@example
+@group
+This is a section
+=================
+@end group
+@end example
+
+@noindent
+in Info.
+
+
+@node unnumberedsec appendixsec heading
+@comment node-name, next, previous, up
+@section @code{@@unnumberedsec}, @code{@@appendixsec}, @code{@@heading}
+@findex unnumberedsec
+@findex appendixsec
+@findex heading
+
+The @code{@@unnumberedsec}, @code{@@appendixsec}, and @code{@@heading}
+commands are, respectively, the unnumbered, appendix-like, and
+heading-like equivalents of the @code{@@section} command.
+(@xref{section, , @code{@@section}}.)@refill
+
+@table @code
+@item @@unnumberedsec
+The @code{@@unnumberedsec} command may be used within an
+unnumbered chapter or within a regular chapter or appendix to
+provide an unnumbered section.@refill
+
+@item @@appendixsec
+@itemx @@appendixsection
+@code{@@appendixsection} is a longer spelling of the
+@code{@@appendixsec} command; the two are synonymous.@refill
+@findex appendixsection
+
+Conventionally, the @code{@@appendixsec} or @code{@@appendixsection}
+command is used only within appendices.@refill
+
+@item @@heading
+You may use the @code{@@heading} command anywhere you wish for a
+section-style heading that will not appear in the table of contents.@refill
+@end table
+
+
+@node subsection
+@comment node-name, next, previous, up
+@section The @code{@@subsection} Command
+@findex subsection
+
+Subsections are to sections as sections are to chapters.
+(@xref{section, , @code{@@section}}.) In Info, subsection titles are
+underlined with @samp{-}. For example,@refill
+
+@example
+@@subsection This is a subsection
+@end example
+
+@noindent
+produces
+
+@example
+@group
+This is a subsection
+--------------------
+@end group
+@end example
+
+In a printed manual, subsections are listed in the table of contents
+and are numbered three levels deep.@refill
+
+@node unnumberedsubsec appendixsubsec subheading
+@comment node-name, next, previous, up
+@section The @code{@@subsection}-like Commands
+@cindex Subsection-like commands
+@findex unnumberedsubsec
+@findex appendixsubsec
+@findex subheading
+
+The @code{@@unnumberedsubsec}, @code{@@appendixsubsec}, and
+@code{@@subheading} commands are, respectively, the unnumbered,
+appendix-like, and heading-like equivalents of the @code{@@subsection}
+command. (@xref{subsection, , @code{@@subsection}}.)@refill
+
+In Info, the @code{@@subsection}-like commands generate a title
+underlined with hyphens. In a printed manual, an @code{@@subheading}
+command produces a heading like that of a subsection except that it is
+not numbered and does not appear in the table of contents. Similarly,
+an @code{@@unnumberedsubsec} command produces an unnumbered heading like
+that of a subsection and an @code{@@appendixsubsec} command produces a
+subsection-like heading labelled with a letter and numbers; both of
+these commands produce headings that appear in the table of
+contents.@refill
+
+@node subsubsection
+@section The `subsub' Commands
+@cindex Subsub commands
+@findex subsubsection
+@findex unnumberedsubsubsec
+@findex appendixsubsubsec
+@findex subsubheading
+
+The fourth and lowest level sectioning commands in Texinfo are the
+`subsub' commands. They are:@refill
+
+@table @code
+@item @@subsubsection
+Subsubsections are to subsections as subsections are to sections.
+(@xref{subsection, , @code{@@subsection}}.) In a printed manual,
+subsubsection titles appear in the table of contents and are numbered
+four levels deep.@refill
+
+@item @@unnumberedsubsubsec
+Unnumbered subsubsection titles appear in the table of contents of a
+printed manual, but lack numbers. Otherwise, unnumbered
+subsubsections are the same as subsubsections. In Info, unnumbered
+subsubsections look exactly like ordinary subsubsections.@refill
+
+@item @@appendixsubsubsec
+Conventionally, appendix commands are used only for appendices and are
+lettered and numbered appropriately in a printed manual. They also
+appear in the table of contents. In Info, appendix subsubsections look
+exactly like ordinary subsubsections.@refill
+
+@item @@subsubheading
+The @code{@@subsubheading} command may be used anywhere that you need
+a small heading that will not appear in the table of contents. In
+Info, subsubheadings look exactly like ordinary subsubsection
+headings.@refill
+@end table
+
+In Info, `subsub' titles are underlined with periods.
+For example,@refill
+
+@example
+@@subsubsection This is a subsubsection
+@end example
+
+@noindent
+produces
+
+@example
+@group
+This is a subsubsection
+.......................
+@end group
+@end example
+
+
+@node Raise/lower sections
+@section @code{@@raisesections} and @code{@@lowersections}
+@findex raisesections
+@findex lowersections
+@cindex Raising and lowering sections
+@cindex Lowering and raising sections
+@cindex Sections, raising and lowering
+
+The @code{@@raisesections} and @code{@@lowersections} commands
+implicitly raise and lower the hierarchical level of following
+chapters, sections and the other sectioning commands.
+
+That is, the @code{@@raisesections} command changes sections to
+chapters, subsections to sections, and so on. Conversely, the
+@code{@@lowersections} command changes chapters to sections, sections
+to subsections, and so on. Thus, an @code{@@lowersections} command
+cancels an @code{@@raisesections} command, and vice versa.
+
+@cindex Include files, and section levels
+You can use @code{@@lowersections} to include text written as an outer
+or standalone Texinfo file in another Texinfo file as an inner,
+included file. Typical usage looks like this:
+
+@example
+@@lowersections
+@@include somefile.texi
+@@raisesections
+@end example
+
+@noindent (Without the @code{@@raisesections}, all the subsequent
+sections in the document would be lowered.)
+
+If the included file being lowered has a @code{@@top} node, you'll
+need to conditionalize its inclusion with a flag (@pxref{set value}).
+
+Another difficulty can arise with documents that use the (recommended)
+feature of @command{makeinfo} for implicitly determining node
+pointers. Since @command{makeinfo} must assume a hierarchically
+organized document to determine the pointers, you cannot just
+arbitrarily sprinkle @code{@@raisesections} and @code{@@lowersections}
+commands in the document. The final result has to have menus that
+take the raising and lowering into account. Therefore, as a practical
+matter, you generally only want to raise or lower large chunks,
+usually in external files as shown above.
+
+Repeated use of the commands continue to raise or lower the
+hierarchical level a step at a time. An attempt to raise above
+`chapter' reproduces chapter commands; an attempt to lower below
+`subsubsection' reproduces subsubsection commands. Also, lowered
+subsubsections and raised chapters will not work with
+@command{makeinfo}'s feature of implicitly determining node pointers,
+since the menu structure won't be correct.
+
+Write each @code{@@raisesections} and @code{@@lowersections} command
+on a line of its own.
+
+
+@node Nodes
+@chapter Nodes
+
+@dfn{Nodes} are the primary segments of a Texinfo file. They do not
+in and of themselves impose a hierarchical or any other kind of
+structure on a file. Nodes contain @dfn{node pointers} that name
+other nodes, and can contain @dfn{menus} which are lists of nodes. In
+Info, the movement commands can carry you to a pointed-to node or to a
+node listed in a menu.
+
+Node pointers and menus provide structure for Info files just as
+chapters, sections, subsections, and the like, provide structure for
+printed books.
+
+Because node names are used in cross-references, it is not desirable
+to casually change them. Such name changes invalidate references from
+other manuals, from mail archives, and so on.
+
+@menu
+* Two Paths:: Different commands to structure
+ Info output and printed output.
+* Node Menu Illustration:: A diagram, and sample nodes and menus.
+* node:: Creating nodes, in detail.
+* makeinfo Pointer Creation:: Letting makeinfo determine node pointers.
+* anchor:: Defining arbitrary cross-reference targets.
+@end menu
+
+
+@node Two Paths
+@section Two Paths
+
+The node and menu commands and the chapter structuring commands are
+technically independent of each other:
+
+@itemize @bullet
+@item
+In Info, node and menu commands provide structure. The chapter
+structuring commands generate headings with different kinds of
+underlining---asterisks for chapters, hyphens for sections, and so on;
+they do nothing else.@refill
+
+@item
+In @TeX{}, the chapter structuring commands generate chapter and section
+numbers and tables of contents. The node and menu commands provide
+information for cross references; they do nothing else.@refill
+@end itemize
+
+You can use node pointers and menus to structure an Info file any way
+you want; and you can write a Texinfo file so that its Info output has a
+different structure than its printed output. However, virtually all
+Texinfo files are written such that the structure for the Info output
+corresponds to the structure for the printed output. It is neither
+convenient nor understandable to the reader to do otherwise.@refill
+
+Generally, printed output is structured in a tree-like hierarchy in
+which the chapters are the major limbs from which the sections branch
+out. Similarly, node pointers and menus are organized to create a
+matching structure in the Info output.@refill
+
+
+@node Node Menu Illustration
+@section Node and Menu Illustration
+
+Here is a copy of the diagram shown earlier that illustrates a Texinfo
+file with three chapters, each of which contains two sections.@refill
+
+The ``root'' is at the top of the diagram and the ``leaves'' are at the
+bottom. This is how such a diagram is drawn conventionally; it
+illustrates an upside-down tree. For this reason, the root node is
+called the `Top' node, and `Up' node pointers carry you closer to the
+root.@refill
+
+@example
+@group
+ Top
+ |
+ -------------------------------------
+ | | |
+ Chapter 1 Chapter 2 Chapter 3
+ | | |
+ -------- -------- --------
+ | | | | | |
+Section Section Section Section Section Section
+ 1.1 1.2 2.1 2.2 3.1 3.2
+@end group
+@end example
+
+The fully-written command to start Chapter 2 would be this:
+
+@example
+@group
+@@node Chapter 2, Chapter 3, Chapter 1, Top
+@@comment node-name, next, previous, up
+@end group
+@end example
+
+@noindent
+This @code{@@node} line says that the name of this node is ``Chapter
+2'', the name of the `Next' node is ``Chapter 3'', the name of the
+`Previous' node is ``Chapter 1'', and the name of the `Up' node is
+``Top''. You can omit writing out these node names if your document is
+hierarchically organized (@pxref{makeinfo Pointer Creation}), but the
+pointer relationships still obtain.
+
+@quotation Note
+@strong{Please Note:} `Next' refers to the next node at the same
+hierarchical level in the manual, not necessarily to the next node
+within the Texinfo file. In the Texinfo file, the subsequent node may
+be at a lower level---a section-level node most often follows a
+chapter-level node, for example. `Next' and `Previous' refer to nodes
+at the @emph{same} hierarchical level. (The `Top' node contains the
+exception to this rule. Since the `Top' node is the only node at that
+level, `Next' refers to the first following node, which is almost always
+a chapter or chapter-level node.)@refill
+@end quotation
+
+To go to Sections 2.1 and 2.2 using Info, you need a menu inside Chapter
+2. (@xref{Menus}.) You would write the menu just
+before the beginning of Section 2.1, like this:@refill
+
+@example
+@group
+ @@menu
+ * Sect. 2.1:: Description of this section.
+ * Sect. 2.2::
+ @@end menu
+@end group
+@end example
+
+Write the node for Sect. 2.1 like this:@refill
+
+@example
+@group
+ @@node Sect. 2.1, Sect. 2.2, Chapter 2, Chapter 2
+ @@comment node-name, next, previous, up
+@end group
+@end example
+
+In Info format, the `Next' and `Previous' pointers of a node usually
+lead to other nodes at the same level---from chapter to chapter or from
+section to section (sometimes, as shown, the `Previous' pointer points
+up); an `Up' pointer usually leads to a node at the level above (closer
+to the `Top' node); and a `Menu' leads to nodes at a level below (closer
+to `leaves'). (A cross reference can point to a node at any level;
+see @ref{Cross References}.)@refill
+
+Usually, an @code{@@node} command and a chapter structuring command are
+used in sequence, along with indexing commands. (You may follow the
+@code{@@node} line with a comment line that reminds you which pointer is
+which.)@refill
+
+Here is the beginning of the chapter in this manual called ``Ending a
+Texinfo File''. This shows an @code{@@node} line followed by a comment
+line, an @code{@@chapter} line, and then by indexing lines.@refill
+
+@example
+@group
+@@node Ending a File, Structuring, Beginning a File, Top
+@@comment node-name, next, previous, up
+@@chapter Ending a Texinfo File
+@@cindex Ending a Texinfo file
+@@cindex Texinfo file ending
+@@cindex File ending
+@end group
+@end example
+
+
+@node node
+@section The @code{@@node} Command
+
+@cindex Node, defined
+@findex node
+
+A @dfn{node} is a segment of text that begins at an @code{@@node}
+command and continues until the next @code{@@node} command. The
+definition of node is different from that for chapter or section. A
+chapter may contain sections and a section may contain subsections;
+but a node cannot contain subnodes; the text of a node continues only
+until the next @code{@@node} command in the file. A node usually
+contains only one chapter structuring command, the one that follows
+the @code{@@node} line. On the other hand, in printed output nodes
+are used only for cross references, so a chapter or section may
+contain any number of nodes. Indeed, a chapter usually contains
+several nodes, one for each section, subsection, and
+subsubsection.
+
+To create a node, write an @code{@@node} command at the beginning of a
+line, and follow it with up to four arguments, separated by commas, on
+the rest of the same line. The first argument is required; it is the
+name of this node. The subsequent arguments are the names of the
+`Next', `Previous', and `Up' pointers, in that order, and may be omitted
+if your Texinfo document is hierarchically organized (@pxref{makeinfo
+Pointer Creation}).
+
+You may insert spaces before each name if you wish; the spaces are
+ignored. You must write the name of the node and (if present) the names
+of the `Next', `Previous', and `Up' pointers all on the same line.
+Otherwise, the formatters fail. (@inforef{Top, info, info}, for more
+information about nodes in Info.)
+
+Usually, you write one of the chapter-structuring command lines
+immediately after an @code{@@node} line---for example, an
+@code{@@section} or @code{@@subsection} line. (@xref{Structuring
+Command Types}.)
+
+@quotation Note
+The GNU Emacs Texinfo mode updating commands work
+only with Texinfo files in which @code{@@node} lines are followed by chapter
+structuring lines. @xref{Updating Requirements}.
+@end quotation
+
+@TeX{} uses @code{@@node} lines to identify the names to use for cross
+references. For this reason, you must write @code{@@node} lines in a
+Texinfo file that you intend to format for printing, even if you do not
+intend to format it for Info. (Cross references, such as the one at the
+end of this sentence, are made with @code{@@xref} and related commands;
+see @ref{Cross References}.)
+
+@menu
+* Node Names:: How to choose node and pointer names.
+* Writing a Node:: How to write an @code{@@node} line.
+* Node Line Tips:: Keep names short.
+* Node Line Requirements:: Keep names unique, without @@-commands.
+* First Node:: How to write a `Top' node.
+* makeinfo top command:: How to use the @code{@@top} command.
+@end menu
+
+
+@node Node Names
+@subsection Choosing Node and Pointer Names
+
+@cindex Node names, choosing
+The name of a node identifies the node. The pointers enable
+you to reach other nodes and consist simply of the names of those nodes.
+
+Normally, a node's `Up' pointer contains the name of the node whose menu
+mentions that node. The node's `Next' pointer contains the name of the
+node that follows that node in that menu and its `Previous' pointer
+contains the name of the node that precedes it in that menu. When a
+node's `Previous' node is the same as its `Up' node, both node pointers
+name the same node.
+
+Usually, the first node of a Texinfo file is the `Top' node, and its
+`Up' and `Previous' pointers point to the @file{dir} file, which
+contains the main menu for all of Info.
+
+The `Top' node itself contains the main or master menu for the manual.
+Also, it is helpful to include a brief description of the manual in the
+`Top' node. @xref{First Node}, for information on how to write the
+first node of a Texinfo file.
+
+Even when you explicitly specify all pointers, that does not mean you
+can write the nodes in the Texinfo source file in an arbitrary order!
+Because @TeX{} processes the file sequentially, irrespective of node
+pointers, you must write the nodes in the order you wish them to appear
+in the printed output.
+
+
+@node Writing a Node
+@subsection How to Write an @code{@@node} Line
+@cindex Writing an @code{@@node} line
+@cindex @code{@@node} line writing
+@cindex Node line writing
+
+The easiest way to write an @code{@@node} line is to write @code{@@node}
+at the beginning of a line and then the name of the node, like
+this:@refill
+
+@example
+@@node @var{node-name}
+@end example
+
+If you are using GNU Emacs, you can use the update node commands
+provided by Texinfo mode to insert the names of the pointers; or you
+can leave the pointers out of the Texinfo file and let @code{makeinfo}
+insert node pointers into the Info file it creates. (@xref{Texinfo
+Mode}, and @ref{makeinfo Pointer Creation}.)@refill
+
+Alternatively, you can insert the `Next', `Previous', and `Up'
+pointers yourself. If you do this, you may find it helpful to use the
+Texinfo mode keyboard command @kbd{C-c C-c n}. This command inserts
+@samp{@@node} and a comment line listing the names of the pointers in
+their proper order. The comment line helps you keep track of which
+arguments are for which pointers. This comment line is especially useful
+if you are not familiar with Texinfo.@refill
+
+The template for a fully-written-out node line with `Next', `Previous',
+and `Up' pointers looks like this:@refill
+
+@example
+@@node @var{node-name}, @var{next}, @var{previous}, @var{up}
+@end example
+
+If you wish, you can ignore @code{@@node} lines altogether in your first
+draft and then use the @code{texinfo-insert-node-lines} command to
+create @code{@@node} lines for you. However, we do not recommend this
+practice. It is better to name the node itself at the same time that
+you write a segment so you can easily make cross references. A large
+number of cross references are an especially important feature of a good
+Info file.
+
+After you have inserted an @code{@@node} line, you should immediately
+write an @@-command for the chapter or section and insert its name.
+Next (and this is important!), put in several index entries. Usually,
+you will find at least two and often as many as four or five ways of
+referring to the node in the index. Use them all. This will make it
+much easier for people to find the node.
+
+
+@node Node Line Tips
+@subsection @code{@@node} Line Tips
+
+Here are three suggestions:
+
+@itemize @bullet
+@item
+Try to pick node names that are informative but short.@refill
+
+In the Info file, the file name, node name, and pointer names are all
+inserted on one line, which may run into the right edge of the window.
+(This does not cause a problem with Info, but is ugly.)@refill
+
+@item
+Try to pick node names that differ from each other near the beginnings
+of their names. This way, it is easy to use automatic name completion in
+Info.@refill
+
+@item
+By convention, node names are capitalized just as they would be for
+section or chapter titles---initial and significant words are
+capitalized; others are not.@refill
+@end itemize
+
+
+@node Node Line Requirements
+@subsection @code{@@node} Line Requirements
+
+@cindex Node line requirements
+@cindex Restrictions on node names
+Here are several requirements for @code{@@node} lines:
+
+@itemize @bullet
+@cindex Unique nodename requirement
+@cindex Node name must be unique
+@item
+All the node names for a single Info file must be unique.
+
+Duplicates confuse the Info movement commands. This means, for
+example, that if you end every chapter with a summary, you must name
+each summary node differently. You cannot just call each one
+``Summary''. You may, however, duplicate the titles of chapters, sections,
+and the like. Thus you can end each chapter in a book with a section
+called ``Summary'', so long as the node names for those sections are all
+different.
+
+@item
+A pointer name must be the name of a node.
+
+The node to which a pointer points may come before or after the
+node containing the pointer.
+
+@cindex @@-commands in nodename
+@cindex Node name, should not contain @@-commands
+@item
+@@-commands in node names are not allowed. This includes punctuation
+characters that are escaped with a @samp{@@}, such as @code{@@} and
+@code{@{}, and accent commands such as @samp{@@'}. (For a few cases
+when this is useful, Texinfo has limited support for using
+@w{@@-commands} in node names; see @ref{Pointer Validation}.) Perhaps
+this limitation will be removed some day.
+
+@item
+@cindex Colon in nodename
+@cindex Comma in nodename
+@cindex Parentheses in nodename
+@cindex Period in nodename
+@cindex Characters, invalid in node name
+@cindex Invalid characters in node names
+@cindex Node names, invalid characters in
+Unfortunately, you cannot use periods, commas, colons or parentheses
+within a node name; these confuse the Texinfo processors. Perhaps
+this limitation will be removed some day, too.
+
+@need 700
+For example, the following is a section title in this manual:
+
+@smallexample
+@@code@{@@@@unnumberedsec@}, @@code@{@@@@appendixsec@}, @@code@{@@@@heading@}
+@end smallexample
+
+@noindent
+But the corresponding node name lacks the commas and the @@'s:
+
+@smallexample
+unnumberedsec appendixsec heading
+@end smallexample
+
+@cindex Case in node name
+@item
+Case is significant in node names.
+
+@cindex White space in node name
+@cindex Spaces in node name
+Spaces before and after names on the @samp{@@node} line are ignored,
+but spaces ``inside'' a name are significant. For example:
+
+@example
+@@node foo bar,
+@@node foo bar ,
+@@node foo bar ,
+@end example
+
+@noindent all define the same node, @samp{foo bar}. References to the
+node should all use that name, without the leading or trailing spaces,
+but with the internal spaces.
+@end itemize
+
+
+@node First Node
+@subsection The First Node
+@cindex Top node is first
+@cindex First node
+
+The first node of a Texinfo file is the @dfn{Top} node, except in an
+included file (@pxref{Include Files}). The Top node should contain a
+short summary, copying permissions, and a master menu. @xref{The Top
+Node}, for more information on the Top node contents and examples.
+
+Here is a description of the node pointers to be used in the Top node:
+
+@itemize @bullet
+
+@item
+@cindex Up node of Top node
+@cindex (dir) as Up node of Top node
+The Top node (which must be named @samp{top} or @samp{Top}) should have
+as its `Up' node the name of a node in another file, where there is a
+menu that leads to this file. Specify the file name in parentheses.
+
+Usually, all Info files are installed in the same Info directory tree;
+in this case, use @samp{(dir)} as the parent of the Top node; this is
+short for @samp{(dir)top}, and specifies the Top node in the @file{dir}
+file, which contains the main menu for the Info system as a whole.
+
+@item
+@cindex Previous node of Top node
+On the other hand, do not define the `Previous' node of the Top node to
+be @samp{(dir)}, as it causes confusing behavior for users: if you are
+in the Top node and hits @key{DEL} to go backwards, you wind up in the
+middle of the some other entry in the @file{dir} file, which has nothing
+to do with what you were reading.
+
+@item
+@cindex Next node of Top node
+The `Next' node of the Top node should be the first chapter in your
+document.
+
+@end itemize
+
+@xref{Installing an Info File}, for more information about installing
+an Info file in the @file{info} directory.
+
+For concreteness, here is an example with explicit pointers (which you
+can maintain automatically with the texinfo mode commands):
+
+Or you can leave the pointers off entirely and let the tools implicitly
+define them. This is recommended. Thus:
+
+@example
+@@node Top
+@end example
+
+
+@node makeinfo top command
+@subsection The @code{@@top} Sectioning Command
+@findex top @r{(@@-command)}
+
+A special sectioning command, @code{@@top} should be used with the
+@code{@@node Top} line. The @code{@@top} sectioning command tells
+@code{makeinfo} that it marks the `Top' node in the file. It provides
+the information that @code{makeinfo} needs to insert node pointers
+automatically. Write the @code{@@top} command at the beginning of the
+line immediately following the @code{@@node Top} line. Write the title
+on the remaining part of the same line as the @code{@@top} command.
+
+In Info, the @code{@@top} sectioning command causes the title to appear
+on a line by itself, with a line of asterisks inserted underneath, as
+other sectioning commands do.
+
+In @TeX{} and @code{texinfo-format-buffer}, the @code{@@top}
+sectioning command is merely a synonym for @code{@@unnumbered}.
+Neither of these formatters require an @code{@@top} command, and do
+nothing special with it. You can use @code{@@chapter} or
+@code{@@unnumbered} after the @code{@@node Top} line when you use
+these formatters. Also, you can use @code{@@chapter} or
+@code{@@unnumbered} when you use the Texinfo updating commands to
+create or update pointers and menus.
+
+Thus, in practice, a Top node starts like this:
+
+@example
+@@node Top
+@@top Your Manual Title
+@end example
+
+
+@node makeinfo Pointer Creation
+@section Creating Pointers with @code{makeinfo}
+@cindex Creating pointers with @code{makeinfo}
+@cindex Pointer creation with @code{makeinfo}
+@cindex Automatic pointer creation with @code{makeinfo}
+
+The @code{makeinfo} program has a feature for automatically determining
+node pointers for a hierarchically organized document.
+
+When you take advantage of this feature, you do not need to write the
+`Next', `Previous', and `Up' pointers after the name of a node.
+However, you must write a sectioning command, such as @code{@@chapter}
+or @code{@@section}, on the line immediately following each truncated
+@code{@@node} line (except that comment lines may intervene).
+
+In addition, you must follow the `Top' @code{@@node} line with a line
+beginning with @code{@@top} to mark the `Top' node in the
+file. @xref{makeinfo top, , @code{@@top}}.
+
+Finally, you must write the name of each node (except for the `Top'
+node) in a menu that is one or more hierarchical levels above the
+node's hierarchical level.
+
+This implicit node pointer insertion feature in @code{makeinfo}
+relieves you from the need to update menus and pointers manually or
+with Texinfo mode commands. (@xref{Updating Nodes and Menus}.)
+
+In most cases, you will want to take advantage of this feature and not
+redundantly specify node pointers. However, Texinfo documents are not
+required to be organized hierarchically or in fact to contain
+sectioning commands at all (for example, if you never intend the
+document to be printed). The special procedure for handling the short
+text before a menu (@pxref{Menus}) also disables this
+feature, for that group of nodes. In those cases, you will need to
+explicitly specify the pointers.
+
+
+@node anchor
+@section @code{@@anchor}: Defining Arbitrary Cross-reference Targets
+
+@findex anchor
+@cindex Anchors
+@cindex Cross-reference targets, arbitrary
+@cindex Targets for cross-references, arbitrary
+
+An @dfn{anchor} is a position in your document, labeled so that
+cross-references can refer to it, just as they can to nodes. You create
+an anchor with the @code{@@anchor} command, and give the label as a
+normal brace-delimited argument. For example:
+
+@example
+This marks the @@anchor@{x-spot@}spot.
+@dots{}
+@@xref@{x-spot,,the spot@}.
+@end example
+
+@noindent produces:
+
+@example
+This marks the spot.
+@dots{}
+See [the spot], page 1.
+@end example
+
+As you can see, the @code{@@anchor} command itself produces no output.
+This example defines an anchor `x-spot' just before the word `spot'.
+You can refer to it later with an @code{@@xref} or other cross-reference
+command, as shown. @xref{Cross References}, for details on the
+cross-reference commands.
+
+It is best to put @code{@@anchor} commands just before the position you
+wish to refer to; that way, the reader's eye is led on to the correct
+text when they jump to the anchor. You can put the @code{@@anchor}
+command on a line by itself if that helps readability of the source.
+Spaces are always ignored after @code{@@anchor}.
+
+Anchor names and node names may not conflict. Anchors and nodes are
+given similar treatment in some ways; for example, the @code{goto-node}
+command in standalone Info takes either an anchor name or a node name as
+an argument. (@xref{goto-node,,,info-stnd,GNU Info}.)
+
+
+@node Menus
+@chapter Menus
+@cindex Menus
+@findex menu
+
+@dfn{Menus} contain pointers to subordinate nodes. In online output,
+you use menus to go to such nodes. Menus have no effect in printed
+manuals and do not appear in them.
+
+A node with a menu should not contain much text. If you find yourself
+writing a lot of before a menu, we generally recommend moving most of
+the text into a new subnode---all but a paragraph or two. Otherwise,
+a reader with a terminal that displays only a few lines may miss the
+menu and its associated text. As a practical matter, it is best to
+locate a menu within 20 or so lines of the beginning of the node.
+
+@menu
+* Menu Location:: Menus go at the ends of short nodes.
+* Writing a Menu:: What is a menu?
+* Menu Parts:: A menu entry has three parts.
+* Less Cluttered Menu Entry:: Two part menu entry.
+* Menu Example:: Two and three part menu entries.
+* Other Info Files:: How to refer to a different Info file.
+@end menu
+
+
+@node Menu Location
+@section Menu Location
+@cindex Menu location
+@cindex Location of menus
+
+A menu must be located at the end of a node, without any regular text
+or additional commands between the @code{@@end menu} and the beginning
+of the next node. (As a consequence, there may be at most one menu in
+a node.)
+
+@cindex Info format, and menus
+This is actually a useful restriction, since a reader who uses the
+menu could easily miss any such text. Technically, it is necessary
+because in Info format, there is no marker for the end of a menu, so
+Info-reading programs would have no way to know when the menu ends and
+normal text resumes.
+
+@cindex Hierarchical documents, and menus
+Technically, menus can carry you to any node, regardless of the
+structure of the document; even to nodes in a different Info file.
+However, we do not recommend ever making use of this, because the
+@command{makeinfo} implicit pointer creation feature (@pxref{makeinfo
+Pointer Creation}) and GNU Emacs Texinfo mode updating commands work
+only to create menus of subordinate nodes in a hierarchically
+structured document. Instead, use cross references to refer to
+arbitrary nodes.
+
+In the past, we recommended using a @samp{@@heading} command within an
+@code{@@ifinfo} conditional instead of the normal sectioning commands
+after a very short node with a menu. This had the advantage of making
+the printed output look better, because there was no very short text
+between two headings on the page. But aside from not working with
+@command{makeinfo}'s implicit pointer creation, it also makes the XML
+output incorrect, since it does not reflect the true document
+structure. So, unfortunately we can no longer recommend this.
+
+
+@node Writing a Menu
+@section Writing a Menu
+@cindex Writing a menu
+@cindex Menu writing
+
+A menu consists of an @code{@@menu} command on a line by itself
+followed by menu entry lines or menu comment lines and then by an
+@code{@@end menu} command on a line by itself.
+
+A menu looks like this:
+
+@example
+@group
+@@menu
+Larger Units of Text
+
+* Files:: All about handling files.
+* Multiples: Buffers. Multiple buffers; editing
+ several files at once.
+@@end menu
+@end group
+@end example
+
+In a menu, every line that begins with an @w{@samp{* }} is a @dfn{menu
+entry}. (Note the space after the asterisk.) A line that does not
+start with an @w{@samp{* }} may also appear in a menu. Such a line is
+not a menu entry but is a menu comment line that appears in the Info
+file. In the example above, the line @samp{Larger Units of Text} is a
+menu comment line; the two lines starting with @w{@samp{* }} are menu
+@cindex Spaces, in menus
+entries. Space characters in a menu are preserved as-is; this allows
+you to format the menu as you wish.
+
+
+@node Menu Parts
+@section The Parts of a Menu
+@cindex Parts of a menu
+@cindex Menu parts
+@cindex @code{@@menu} parts
+
+A menu entry has three parts, only the second of which is required:
+
+@enumerate
+@item
+The menu entry name (optional).
+
+@item
+The name of the node (required).
+
+@item
+A description of the item (optional).
+@end enumerate
+
+The template for a menu entry looks like this:@refill
+
+@example
+* @var{menu-entry-name}: @var{node-name}. @var{description}
+@end example
+
+Follow the menu entry name with a single colon and follow the node name
+with tab, comma, period, or newline.@refill
+
+In Info, a user selects a node with the @kbd{m} (@code{Info-menu})
+command. The menu entry name is what the user types after the @kbd{m}
+command.@refill
+
+The third part of a menu entry is a descriptive phrase or sentence.
+Menu entry names and node names are often short; the description
+explains to the reader what the node is about. A useful description
+complements the node name rather than repeats it. The description,
+which is optional, can spread over two or more lines; if it does, some
+authors prefer to indent the second line while others prefer to align it
+with the first (and all others). It's up to you.
+
+
+@node Less Cluttered Menu Entry
+@comment node-name, next, previous, up
+@section Less Cluttered Menu Entry
+@cindex Two part menu entry
+@cindex Double-colon menu entries
+@cindex Menu entries with two colons
+@cindex Less cluttered menu entry
+@cindex Uncluttered menu entry
+
+When the menu entry name and node name are the same, you can write
+the name immediately after the asterisk and space at the beginning of
+the line and follow the name with two colons.@refill
+
+@need 800
+For example, write
+
+@example
+* Name:: @var{description}
+@end example
+
+@need 800
+@noindent
+instead of
+
+@example
+* Name: Name. @var{description}
+@end example
+
+You should use the node name for the menu entry name whenever possible,
+since it reduces visual clutter in the menu.@refill
+
+@node Menu Example
+@comment node-name, next, previous, up
+@section A Menu Example
+@cindex Menu example
+@cindex Example menu
+
+A menu looks like this in Texinfo:@refill
+
+@example
+@group
+@@menu
+* menu entry name: Node name. A short description.
+* Node name:: This form is preferred.
+@@end menu
+@end group
+@end example
+
+@need 800
+@noindent
+This produces:
+
+@example
+@group
+* menu:
+
+* menu entry name: Node name. A short description.
+* Node name:: This form is preferred.
+@end group
+@end example
+
+@need 700
+Here is an example as you might see it in a Texinfo file:@refill
+
+@example
+@group
+@@menu
+Larger Units of Text
+
+* Files:: All about handling files.
+* Multiples: Buffers. Multiple buffers; editing
+ several files at once.
+@@end menu
+@end group
+@end example
+
+@need 800
+@noindent
+This produces:
+
+@example
+@group
+* menu:
+Larger Units of Text
+
+* Files:: All about handling files.
+* Multiples: Buffers. Multiple buffers; editing
+ several files at once.
+@end group
+@end example
+
+In this example, the menu has two entries. @samp{Files} is both a menu
+entry name and the name of the node referred to by that name.
+@samp{Multiples} is the menu entry name; it refers to the node named
+@samp{Buffers}. The line @samp{Larger Units of Text} is a comment; it
+appears in the menu, but is not an entry.@refill
+
+Since no file name is specified with either @samp{Files} or
+@samp{Buffers}, they must be the names of nodes in the same Info file
+(@pxref{Other Info Files, , Referring to Other Info Files}).@refill
+
+@node Other Info Files
+@comment node-name, next, previous, up
+@section Referring to Other Info Files
+@cindex Referring to other Info files
+@cindex Nodes in other Info files
+@cindex Other Info files' nodes
+@cindex Going to other Info files' nodes
+@cindex Info; other files' nodes
+
+You can create a menu entry that enables a reader in Info to go to a
+node in another Info file by writing the file name in parentheses just
+before the node name. In this case, you should use the three-part menu
+entry format, which saves the reader from having to type the file
+name.@refill
+
+@need 800
+The format looks like this:@refill
+
+@example
+@group
+@@menu
+* @var{first-entry-name}:(@var{filename})@var{nodename}. @var{description}
+* @var{second-entry-name}:(@var{filename})@var{second-node}. @var{description}
+@@end menu
+@end group
+@end example
+
+For example, to refer directly to the @samp{Outlining} and
+@samp{Rebinding} nodes in the @cite{Emacs Manual}, you would write a
+menu like this:@refill
+
+@example
+@group
+@@menu
+* Outlining: (emacs)Outline Mode. The major mode for
+ editing outlines.
+* Rebinding: (emacs)Rebinding. How to redefine the
+ meaning of a key.
+@@end menu
+@end group
+@end example
+
+If you do not list the node name, but only name the file, then Info
+presumes that you are referring to the `Top' node.@refill
+
+The @file{dir} file that contains the main menu for Info has menu
+entries that list only file names. These take you directly to the `Top'
+nodes of each Info document. (@xref{Installing an Info File}.)
+
+@need 700
+For example:
+
+@example
+@group
+* Info: (info). Documentation browsing system.
+* Emacs: (emacs). The extensible, self-documenting
+ text editor.
+@end group
+@end example
+
+@noindent
+(The @file{dir} top level directory for the Info system is an Info file,
+not a Texinfo file, but a menu entry looks the same in both types of
+file.)@refill
+
+The GNU Emacs Texinfo mode menu updating commands only work with nodes
+within the current buffer, so you cannot use them to create menus that
+refer to other files. You must write such menus by hand.
+
+
+@node Cross References
+@chapter Cross References
+@cindex Making cross references
+@cindex Cross references
+@cindex References
+
+@dfn{Cross references} are used to refer the reader to other parts of the
+same or different Texinfo files. In Texinfo, nodes and anchors are the
+places to which cross references can refer.
+
+@menu
+* References:: What cross references are for.
+* Cross Reference Commands:: A summary of the different commands.
+* Cross Reference Parts:: A cross reference has several parts.
+* xref:: Begin a reference with `See' @dots{}
+* Top Node Naming:: How to refer to the beginning of another file.
+* ref:: A reference for the last part of a sentence.
+* pxref:: How to write a parenthetical cross reference.
+* inforef:: How to refer to an Info-only file.
+* uref:: How to refer to a uniform resource locator.
+@end menu
+
+@node References
+@section What References Are For
+
+Often, but not always, a printed document should be designed so that
+it can be read sequentially. People tire of flipping back and forth
+to find information that should be presented to them as they need
+it.@refill
+
+However, in any document, some information will be too detailed for
+the current context, or incidental to it; use cross references to
+provide access to such information. Also, an online help system or a
+reference manual is not like a novel; few read such documents in
+sequence from beginning to end. Instead, people look up what they
+need. For this reason, such creations should contain many cross
+references to help readers find other information that they may not
+have read.@refill
+
+In a printed manual, a cross reference results in a page reference,
+unless it is to another manual altogether, in which case the cross
+reference names that manual.@refill
+
+In Info, a cross reference results in an entry that you can follow
+using the Info @samp{f} command. (@inforef{Help-Xref, Following
+cross-references, info}.)
+
+The various cross reference commands use nodes (or anchors,
+@pxref{anchor,,@code{@@anchor}}) to define cross reference locations.
+This is evident in Info, in which a cross reference takes you to the
+specified location. @TeX{} also uses nodes to define cross reference
+locations, but the action is less obvious. When @TeX{} generates a DVI
+file, it records each node's page number and uses the page numbers in making
+references. Thus, if you are writing a manual that will only be
+printed, and will not be used online, you must nonetheless write
+@code{@@node} lines to name the places to which you make cross
+references.@refill
+
+@need 800
+@node Cross Reference Commands
+@comment node-name, next, previous, up
+@section Different Cross Reference Commands
+@cindex Different cross reference commands
+
+There are four different cross reference commands:@refill
+
+@table @code
+@item @@xref
+Used to start a sentence in the printed manual saying @w{`See @dots{}'}
+or an Info cross-reference saying @samp{*Note @var{name}: @var{node}.}.
+
+@item @@ref
+Used within or, more often, at the end of a sentence; same as
+@code{@@xref} for Info; produces just the reference in the printed
+manual without a preceding `See'.@refill
+
+@item @@pxref
+Used within parentheses to make a reference that suits both an Info
+file and a printed book. Starts with a lower case `see' within the
+printed manual. (@samp{p} is for `parenthesis'.)@refill
+
+@item @@inforef
+Used to make a reference to an Info file for which there is no printed
+manual.@refill
+@end table
+
+@noindent
+(The @code{@@cite} command is used to make references to books and
+manuals for which there is no corresponding Info file and, therefore,
+no node to which to point. @xref{cite, , @code{@@cite}}.)@refill
+
+@node Cross Reference Parts
+@comment node-name, next, previous, up
+@section Parts of a Cross Reference
+@cindex Cross reference parts
+@cindex Parts of a cross reference
+
+A cross reference command requires only one argument, which is the
+name of the node to which it refers. But a cross reference command
+may contain up to four additional arguments. By using these
+arguments, you can provide a cross reference name for Info, a topic
+description or section title for the printed output, the name of a
+different Info file, and the name of a different printed
+manual.@refill
+
+Here is a simple cross reference example:@refill
+
+@example
+@@xref@{Node name@}.
+@end example
+
+@noindent
+which produces
+
+@example
+*Note Node name::.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section @var{nnn} [Node name], page @var{ppp}.
+@end quotation
+
+@need 700
+Here is an example of a full five-part cross reference:@refill
+
+@example
+@group
+@@xref@{Node name, Cross Reference Name, Particular Topic,
+info-file-name, A Printed Manual@}, for details.
+@end group
+@end example
+
+@noindent
+which produces
+
+@example
+*Note Cross Reference Name: (info-file-name)Node name,
+for details.
+@end example
+
+@noindent
+in Info and
+
+@quotation
+See section ``Particular Topic'' in @i{A Printed Manual}, for details.
+@end quotation
+
+@noindent
+in a printed book.
+
+The five possible arguments for a cross reference are:@refill
+
+@enumerate
+@item
+The node or anchor name (required). This is the location to which the
+cross reference takes you. In a printed document, the location of the
+node provides the page reference only for references within the same
+document.@refill
+
+@item
+The cross reference name for the Info reference, if it is to be different
+from the node name. If you include this argument, it becomes
+the first part of the cross reference. It is usually omitted.@refill
+
+@item
+A topic description or section name. Often, this is the title of the
+section. This is used as the name of the reference in the printed
+manual. If omitted, the node name is used.@refill
+
+@item
+The name of the Info file in which the reference is located, if it is
+different from the current file. You need not include any @samp{.info}
+suffix on the file name, since Info readers try appending it
+automatically.
+
+@item
+The name of a printed manual from a different Texinfo file.@refill
+@end enumerate
+
+The template for a full five argument cross reference looks like
+this:@refill
+
+@example
+@group
+@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic},
+@var{info-file-name}, @var{printed-manual-title}@}.
+@end group
+@end example
+
+Cross references with one, two, three, four, and five arguments are
+described separately following the description of @code{@@xref}.@refill
+
+Write a node name in a cross reference in exactly the same way as in
+the @code{@@node} line, including the same capitalization; otherwise, the
+formatters may not find the reference.@refill
+
+You can write cross reference commands within a paragraph, but note
+how Info and @TeX{} format the output of each of the various commands:
+write @code{@@xref} at the beginning of a sentence; write
+@code{@@pxref} only within parentheses, and so on.@refill
+
+@node xref
+@comment node-name, next, previous, up
+@section @code{@@xref}
+@findex xref
+@cindex Cross references using @code{@@xref}
+@cindex References using @code{@@xref}
+
+The @code{@@xref} command generates a cross reference for the
+beginning of a sentence. The Info formatting commands convert it into
+an Info cross reference, which the Info @samp{f} command can use to
+bring you directly to another node. The @TeX{} typesetting commands
+convert it into a page reference, or a reference to another book or
+manual.@refill
+
+@menu
+* Reference Syntax:: What a reference looks like and requires.
+* One Argument:: @code{@@xref} with one argument.
+* Two Arguments:: @code{@@xref} with two arguments.
+* Three Arguments:: @code{@@xref} with three arguments.
+* Four and Five Arguments:: @code{@@xref} with four and five arguments.
+@end menu
+
+@node Reference Syntax
+@subsection What a Reference Looks Like and Requires
+
+Most often, an Info cross reference looks like this:@refill
+
+@example
+*Note @var{node-name}::.
+@end example
+
+@noindent
+or like this
+
+@example
+*Note @var{cross-reference-name}: @var{node-name}.
+@end example
+
+@noindent
+In @TeX{}, a cross reference looks like this:
+
+@quotation
+See Section @var{section-number} [@var{node-name}], page @var{page}.
+@end quotation
+
+@noindent
+or like this
+
+@quotation
+See Section @var{section-number} [@var{title-or-topic}], page @var{page}.
+@end quotation
+
+The @code{@@xref} command does not generate a period or comma to end
+the cross reference in either the Info file or the printed output.
+You must write that period or comma yourself; otherwise, Info will not
+recognize the end of the reference. (The @code{@@pxref} command works
+differently. @xref{pxref, , @code{@@pxref}}.)@refill
+
+@quotation Caution
+A period or comma @strong{must} follow the closing
+brace of an @code{@@xref}. It is required to terminate the cross
+reference. This period or comma will appear in the output, both in
+the Info file and in the printed manual.@refill
+@end quotation
+
+@code{@@xref} must refer to an Info node by name. Use @code{@@node}
+to define the node (@pxref{Writing a Node}).@refill
+
+@code{@@xref} is followed by several arguments inside braces, separated by
+commas. Whitespace before and after these commas is ignored.@refill
+
+A cross reference requires only the name of a node; but it may contain
+up to four additional arguments. Each of these variations produces a
+cross reference that looks somewhat different.@refill
+
+@quotation Note
+Commas separate arguments in a cross reference;
+avoid including them in the title or other part lest the formatters
+mistake them for separators.@refill
+@end quotation
+
+@node One Argument
+@subsection @code{@@xref} with One Argument
+
+The simplest form of @code{@@xref} takes one argument, the name of
+another node in the same Info file. The Info formatters produce
+output that the Info readers can use to jump to the reference; @TeX{}
+produces output that specifies the page and section number for you.@refill
+
+@need 700
+@noindent
+For example,
+
+@example
+@@xref@{Tropical Storms@}.
+@end example
+
+@noindent
+produces
+
+@example
+*Note Tropical Storms::.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section 3.1 [Tropical Storms], page 24.
+@end quotation
+
+@noindent
+(Note that in the preceding example the closing brace is followed by a
+period.)@refill
+
+You can write a clause after the cross reference, like this:@refill
+
+@example
+@@xref@{Tropical Storms@}, for more info.
+@end example
+
+@noindent
+which produces
+
+@example
+*Note Tropical Storms::, for more info.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section 3.1 [Tropical Storms], page 24, for more info.
+@end quotation
+
+@noindent
+(Note that in the preceding example the closing brace is followed by a
+comma, and then by the clause, which is followed by a period.)@refill
+
+@node Two Arguments
+@subsection @code{@@xref} with Two Arguments
+
+With two arguments, the second is used as the name of the Info cross
+reference, while the first is still the name of the node to which the
+cross reference points.@refill
+
+@need 750
+@noindent
+The template is like this:
+
+@example
+@@xref@{@var{node-name}, @var{cross-reference-name}@}.
+@end example
+
+@need 700
+@noindent
+For example,
+
+@example
+@@xref@{Electrical Effects, Lightning@}.
+@end example
+
+@noindent
+produces:
+
+@example
+*Note Lightning: Electrical Effects.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section 5.2 [Electrical Effects], page 57.
+@end quotation
+
+@noindent
+(Note that in the preceding example the closing brace is followed by a
+period; and that the node name is printed, not the cross reference name.)
+
+You can write a clause after the cross reference, like this:@refill
+
+@example
+@@xref@{Electrical Effects, Lightning@}, for more info.
+@end example
+
+@noindent
+which produces
+@example
+*Note Lightning: Electrical Effects, for more info.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section 5.2 [Electrical Effects], page 57, for more info.
+@end quotation
+
+@noindent
+(Note that in the preceding example the closing brace is followed by a
+comma, and then by the clause, which is followed by a period.)@refill
+
+@node Three Arguments
+@subsection @code{@@xref} with Three Arguments
+
+A third argument replaces the node name in the @TeX{} output. The third
+argument should be the name of the section in the printed output, or
+else state the topic discussed by that section. Often, you will want to
+use initial upper case letters so it will be easier to read when the
+reference is printed. Use a third argument when the node name is
+unsuitable because of syntax or meaning.@refill
+
+Remember to avoid placing a comma within the title or topic section of
+a cross reference, or within any other section. The formatters divide
+cross references into arguments according to the commas; a comma
+within a title or other section will divide it into two arguments. In
+a reference, you need to write a title such as ``Clouds, Mist, and
+Fog'' without the commas.@refill
+
+Also, remember to write a comma or period after the closing brace of an
+@code{@@xref} to terminate the cross reference. In the following
+examples, a clause follows a terminating comma.@refill
+
+
+@need 750
+@noindent
+The template is like this:
+
+@example
+@group
+@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}@}.
+@end group
+@end example
+
+@need 700
+@noindent
+For example,
+
+@example
+@group
+@@xref@{Electrical Effects, Lightning, Thunder and Lightning@},
+for details.
+@end group
+@end example
+
+@noindent
+produces
+
+@example
+*Note Lightning: Electrical Effects, for details.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section 5.2 [Thunder and Lightning], page 57, for details.
+@end quotation
+
+If a third argument is given and the second one is empty, then the
+third argument serves both. (Note how two commas, side by side, mark
+the empty second argument.)@refill
+
+@example
+@group
+@@xref@{Electrical Effects, , Thunder and Lightning@},
+for details.
+@end group
+@end example
+
+@noindent
+produces
+
+@example
+*Note Thunder and Lightning: Electrical Effects, for details.
+@end example
+
+@noindent
+and
+
+@quotation
+See Section 5.2 [Thunder and Lightning], page 57, for details.
+@end quotation
+
+As a practical matter, it is often best to write cross references with
+just the first argument if the node name and the section title are the
+same, and with the first and third arguments if the node name and title
+are different.@refill
+
+Here are several examples from @cite{The GNU Awk User's Guide}:@refill
+
+@smallexample
+@@xref@{Sample Program@}.
+@@xref@{Glossary@}.
+@@xref@{Case-sensitivity, ,Case-sensitivity in Matching@}.
+@@xref@{Close Output, , Closing Output Files and Pipes@},
+ for more information.
+@@xref@{Regexp, , Regular Expressions as Patterns@}.
+@end smallexample
+
+@node Four and Five Arguments
+@subsection @code{@@xref} with Four and Five Arguments
+
+In a cross reference, a fourth argument specifies the name of another
+Info file, different from the file in which the reference appears, and
+a fifth argument specifies its title as a printed manual.@refill
+
+Remember that a comma or period must follow the closing brace of an
+@code{@@xref} command to terminate the cross reference. In the
+following examples, a clause follows a terminating comma.@refill
+
+@need 800
+@noindent
+The template is:
+
+@example
+@group
+@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic},
+@var{info-file-name}, @var{printed-manual-title}@}.
+@end group
+@end example
+
+@need 700
+@noindent
+For example,
+
+@example
+@@xref@{Electrical Effects, Lightning, Thunder and Lightning,
+weather, An Introduction to Meteorology@}, for details.
+@end example
+
+@noindent
+produces
+
+@example
+*Note Lightning: (weather)Electrical Effects, for details.
+@end example
+
+@noindent
+The name of the Info file is enclosed in parentheses and precedes
+the name of the node.
+
+@noindent
+In a printed manual, the reference looks like this:@refill
+
+@quotation
+See section ``Thunder and Lightning'' in @i{An Introduction to
+Meteorology}, for details.
+@end quotation
+
+@noindent
+The title of the printed manual is typeset in italics; and the
+reference lacks a page number since @TeX{} cannot know to which page a
+reference refers when that reference is to another manual.@refill
+
+Often, you will leave out the second argument when you use the long
+version of @code{@@xref}. In this case, the third argument, the topic
+description, will be used as the cross reference name in Info.@refill
+
+@noindent
+The template looks like this:
+
+@example
+@@xref@{@var{node-name}, , @var{title-or-topic}, @var{info-file-name},
+@var{printed-manual-title}@}, for details.
+@end example
+
+@noindent
+which produces
+
+@example
+*Note @var{title-or-topic}: (@var{info-file-name})@var{node-name}, for details.
+@end example
+
+@noindent
+and
+
+@quotation
+See section @var{title-or-topic} in @var{printed-manual-title}, for details.
+@end quotation
+
+@need 700
+@noindent
+For example,
+
+@example
+@@xref@{Electrical Effects, , Thunder and Lightning,
+weather, An Introduction to Meteorology@}, for details.
+@end example
+
+@noindent
+produces
+
+@example
+@group
+*Note Thunder and Lightning: (weather)Electrical Effects,
+for details.
+@end group
+@end example
+
+@noindent
+and
+
+@quotation
+See section ``Thunder and Lightning'' in @i{An Introduction to
+Meteorology}, for details.
+@end quotation
+
+On rare occasions, you may want to refer to another Info file that
+is within a single printed manual---when multiple Texinfo files are
+incorporated into the same @TeX{} run but make separate Info files.
+In this case, you need to specify only the fourth argument, and not
+the fifth.@refill
+
+@node Top Node Naming
+@section Naming a `Top' Node
+@cindex Naming a `Top' Node in references
+@cindex @samp{@r{Top}} node naming for references
+
+In a cross reference, you must always name a node. This means that in
+order to refer to a whole manual, you must identify the `Top' node by
+writing it as the first argument to the @code{@@xref} command. (This
+is different from the way you write a menu entry; see @ref{Other Info
+Files, , Referring to Other Info Files}.) At the same time, to
+provide a meaningful section topic or title in the printed cross
+reference (instead of the word `Top'), you must write an appropriate
+entry for the third argument to the @code{@@xref} command.
+@refill
+
+@noindent
+Thus, to make a cross reference to @cite{The GNU Make Manual},
+write:@refill
+
+@example
+@@xref@{Top, , Overview, make, The GNU Make Manual@}.
+@end example
+
+@noindent
+which produces
+
+@example
+*Note Overview: (make)Top.
+@end example
+
+@noindent
+and
+
+@quotation
+See section ``Overview'' in @i{The GNU Make Manual}.
+@end quotation
+
+@noindent
+In this example, @samp{Top} is the name of the first node, and
+@samp{Overview} is the name of the first section of the manual.
+
+
+@node ref
+@section @code{@@ref}
+@cindex Cross references using @code{@@ref}
+@cindex References using @code{@@ref}
+@findex ref
+
+@code{@@ref} is nearly the same as @code{@@xref} except that it does
+not generate a `See' in the printed output, just the reference itself.
+This makes it useful as the last part of a sentence.
+
+@noindent For example,
+
+@cindex Hurricanes
+@example
+For more information, see @@ref@{Hurricanes@}.
+@end example
+
+@noindent produces (in Info):
+
+@example
+For more information, see *Note Hurricanes::.
+@end example
+
+@noindent and (in printed output):
+
+@quotation
+For more information, see Section 8.2 [Hurricanes], page 123.
+@end quotation
+
+The @code{@@ref} command sometimes tempts writers to express
+themselves in a manner that is suitable for a printed manual but looks
+awkward in the Info format. Bear in mind that your audience will be
+using both the printed and the Info format. For example:
+
+@cindex Sea surges
+@example
+Sea surges are described in @@ref@{Hurricanes@}.
+@end example
+
+@noindent looks ok in the printed output:
+
+@quotation
+Sea surges are described in Section 6.7 [Hurricanes], page 72.
+@end quotation
+
+@noindent but is awkward to read in Info:
+
+@example
+Sea surges are described in *Note Hurricanes::.
+@end example
+
+As a general rule, you should write a period or comma immediately
+after an @code{@@ref} command with two or more arguments.
+
+If there is no such following punctuation, @command{makeinfo} will
+generate a (grammatically incorrect) period in the Info output;
+otherwise, the cross-reference would fail completely, due to the
+current syntax of Info format.
+
+
+@node pxref
+@section @code{@@pxref}
+@cindex Cross references using @code{@@pxref}
+@cindex References using @code{@@pxref}
+@findex pxref
+
+The parenthetical reference command, @code{@@pxref}, is nearly the
+same as @code{@@xref}, but you use it @emph{only} inside parentheses
+and you do @emph{not} type a comma or period (or anything else) after
+the command's closing brace. The command differs from @code{@@xref}
+in two ways:
+
+@enumerate
+@item
+@TeX{} typesets the reference for the printed manual with a lower case
+`see' rather than an upper case `See'.@refill
+
+@item
+The Info formatting commands automatically end the reference with a
+closing colon or period.@refill
+@end enumerate
+
+Because one type of formatting automatically inserts closing
+punctuation and the other does not, you should use @code{@@pxref}
+@emph{only} inside parentheses as part of another sentence. Also, you
+yourself should not insert punctuation after the reference (or any
+other text), as you do with @code{@@xref}. In the Info
+output, such text would follow a period, which is grammatically wrong.
+
+@code{@@pxref} is designed so that the output looks right and works
+right between parentheses both in printed output and in an Info file.
+In a printed manual, a closing comma or period should not follow a
+cross reference within parentheses; such punctuation is wrong. But in
+an Info file, suitable closing punctuation must follow the cross
+reference so Info can recognize its end. @code{@@pxref} spares you
+the need to use complicated methods to put a terminator into one form
+of the output and not the other.@refill
+
+@noindent
+With one argument, a parenthetical cross reference looks like
+this:@refill
+
+@cindex Flooding
+@example
+@dots{} storms cause flooding (@@pxref@{Hurricanes@}) @dots{}
+@end example
+
+@need 800
+@noindent
+which produces
+
+@example
+@group
+@dots{} storms cause flooding (*Note Hurricanes::) @dots{}
+@end group
+@end example
+
+@noindent
+and
+
+@quotation
+@dots{} storms cause flooding (see Section 6.7 [Hurricanes], page 72) @dots{}
+@end quotation
+
+With two arguments, a parenthetical cross reference has this
+template:@refill
+
+@example
+@dots{} (@@pxref@{@var{node-name}, @var{cross-reference-name}@}) @dots{}
+@end example
+
+@noindent
+which produces
+
+@example
+@dots{} (*Note @var{cross-reference-name}: @var{node-name}.) @dots{}
+@end example
+
+@noindent
+and
+
+@need 1500
+@quotation
+@dots{} (see Section @var{nnn} [@var{node-name}], page @var{ppp}) @dots{}
+@end quotation
+
+@code{@@pxref} can be used with up to five arguments just like
+@code{@@xref} (@pxref{xref, , @code{@@xref}}).@refill
+
+@quotation Caution
+Use @code{@@pxref} only as a parenthetical
+reference. Do not try to use @code{@@pxref} as a clause in a sentence.
+It will look bad in either the Info file, the printed output, or
+both.@refill
+@end quotation
+
+Parenthetical cross references look best at the ends of sentences.
+Although they technically work in the middle of a sentence, that
+location breaks up the flow of reading.
+
+
+@node inforef
+@section @code{@@inforef}
+@cindex Cross references using @code{@@inforef}
+@cindex References using @code{@@inforef}
+@findex inforef
+
+@code{@@inforef} is used for making cross references to Info
+documents---even from a printed manual. This might be because you
+want to refer to conditional @code{@@ifinfo} text
+(@pxref{Conditionals}), or because printed output is not available
+(perhaps because there is no Texinfo source), among other
+possibilities.
+
+The command takes either two or three arguments, in the following
+order:@refill
+
+@enumerate
+@item
+The node name.
+
+@item
+The cross reference name (optional).
+
+@item
+The Info file name.
+@end enumerate
+
+@noindent
+Separate the arguments with commas, as with @code{@@xref}. Also, you
+must terminate the reference with a comma or period after the
+@samp{@}}, as you do with @code{@@xref}.@refill
+
+@noindent
+The template is:
+
+@example
+@@inforef@{@var{node-name}, @var{cross-reference-name}, @var{info-file-name}@},
+@end example
+
+@need 800
+@noindent
+For example,
+
+@example
+@group
+@@inforef@{Advanced, Advanced Info commands, info@},
+for more information.
+@end group
+@end example
+
+@need 800
+@noindent
+produces (in Info):
+
+@example
+@group
+*Note Advanced Info commands: (info)Advanced,
+for more information.
+@end group
+@end example
+
+@need 800
+@noindent
+and (in the printed output):
+
+@quotation
+See Info file @file{info}, node @samp{Advanced}, for more information.
+@end quotation
+
+(This particular example is not realistic, since the Info manual is
+written in Texinfo, so all formats are available.)
+
+The converse of @code{@@inforef} is @code{@@cite}, which is used to
+refer to printed works for which no Info form exists. @xref{cite, ,
+@code{@@cite}}.
+
+
+@node uref
+@section @code{@@url}, @code{@@uref@{@var{url}[, @var{text}][, @var{replacement}]@}}
+@findex uref
+@cindex Uniform resource locator, referring to
+@cindex URL, referring to
+
+@cindex @code{href}, producing HTML
+@code{@@uref} produces a reference to a uniform resource locator (url).
+It takes one mandatory argument, the url, and two optional arguments
+which control the text that is displayed. In HTML output, @code{@@uref}
+produces a link you can follow.
+
+@code{@@url} is a synonym for @code{@@uref}. Originally, @code{@@url}
+had the meaning of @code{@@indicateurl}
+(@pxref{indicateurl,,@code{@@indicateurl}}), but in actual practice it
+was misused the vast majority of the time. So we've changed the
+definitions.
+
+The second argument, if specified, is the text to display (the default
+is the url itself); in Info and DVI output, but not in HTML output, the
+url is also output.
+
+@cindex Man page, reference to
+The third argument, if specified, is the text to display, but in this
+case the url is @emph{not} output in any format. This is useful when
+the text is already sufficiently referential, as in a man page. If
+the third argument is given, the second argument is ignored.
+
+If the url is long enough to cause problems with line breaking, you
+may find it useful to insert @code{@@/} at places where a line break
+would be acceptable (after @samp{/} characters, for instance). This
+tells @TeX{} to allow (but not force) a line break at those places.
+@xref{Line Breaks}.
+
+Here is an example of the simple one argument form, where the url is
+both the target and the text of the link:
+
+@example
+The official GNU ftp site is @@uref@{ftp://ftp.gnu.org/gnu@}.
+@end example
+
+@noindent produces:
+@display
+The official GNU ftp site is @uref{ftp://ftp.gnu.org/gnu}.
+@end display
+
+
+An example of the two-argument form:
+@example
+The official @@uref@{ftp://ftp.gnu.org/gnu, GNU ftp site@}
+holds programs and texts.
+@end example
+
+@noindent produces:
+@display
+The official @uref{ftp://ftp.gnu.org/gnu, GNU ftp site}
+holds programs and texts.
+@end display
+
+@noindent that is, the Info output is this:
+@example
+The official GNU ftp site (ftp://ftp.gnu.org/gnu)
+holds programs and texts.
+@end example
+
+@noindent and the HTML output is this:
+@example
+The official <a href="ftp://ftp.gnu.org/gnu">GNU ftp site</a>
+holds programs and texts.
+@end example
+
+
+An example of the three-argument form:
+@example
+The @@uref@{/man.cgi/1/ls,,ls(1)@} program @dots{}
+@end example
+
+@noindent produces:
+@display
+The @uref{/man.cgi/1/ls,,ls(1)} program @dots{}
+@end display
+
+@noindent but with HTML:
+@example
+The <a href="/man.cgi/1/ls">ls(1)</a> program @dots{}
+@end example
+
+To merely indicate a url without creating a link people can follow, use
+@code{@@indicateurl} (@pxref{indicateurl, @code{@@indicateurl}}).
+
+Some people prefer to display url's in the unambiguous format:
+
+@display
+<URL:http://@var{host}/@var{path}>
+@end display
+
+@noindent
+@cindex <URL: convention, not used
+You can use this form in the input file if you wish. We feel it's not
+necessary to include the @samp{<URL:} and @samp{>} in the output,
+since any software that tries to detect url's in text already has to
+detect them without the @samp{<URL:} to be useful.
+
+
+@node Marking Text
+@chapter Marking Words and Phrases
+@cindex Paragraph, marking text within
+@cindex Marking words and phrases
+@cindex Words and phrases, marking them
+@cindex Marking text within a paragraph
+@cindex Text, marking up
+
+In Texinfo, you can mark words and phrases in a variety of ways.
+The Texinfo formatters use this information to determine how to
+highlight the text.
+You can specify, for example, whether a word or phrase is a
+defining occurrence, a metasyntactic variable, or a symbol used in a
+program. Also, you can emphasize text, in several different ways.
+
+@menu
+* Indicating:: How to indicate definitions, files, etc.
+* Emphasis:: How to emphasize text.
+@end menu
+
+
+@node Indicating
+@section Indicating Definitions, Commands, etc.
+@cindex Highlighting text
+@cindex Indicating commands, definitions, etc.
+
+Texinfo has commands for indicating just what kind of object a piece of
+text refers to. For example, metasyntactic variables are marked by
+@code{@@var}, and code by @code{@@code}. Since the pieces of text are
+labelled by commands that tell what kind of object they are, it is easy
+to change the way the Texinfo formatters prepare such text. (Texinfo is
+an @emph{intentional} formatting language rather than a @emph{typesetting}
+formatting language.)@refill
+
+For example, in a printed manual,
+code is usually illustrated in a typewriter font;
+@code{@@code} tells @TeX{} to typeset this text in this font. But it
+would be easy to change the way @TeX{} highlights code to use another
+font, and this change would not affect how keystroke examples are
+highlighted. If straight typesetting commands were used in the body
+of the file and you wanted to make a change, you would need to check
+every single occurrence to make sure that you were changing code and
+not something else that should not be changed.@refill
+
+@menu
+* Useful Highlighting:: Highlighting provides useful information.
+* code:: Indicating program code.
+* kbd:: Showing keyboard input.
+* key:: Specifying keys.
+* samp:: Indicating a literal sequence of characters.
+* verb:: Indicating a verbatim sequence of characters.
+* var:: Indicating metasyntactic variables.
+* env:: Indicating environment variables.
+* file:: Indicating file names.
+* command:: Indicating command names.
+* option:: Indicating option names.
+* dfn:: Specifying definitions.
+* cite:: Referring to books not in the Info system.
+* abbr:: Indicating abbreviations.
+* acronym:: Indicating acronyms.
+* indicateurl:: Indicating an example URL.
+* email:: Indicating an electronic mail address.
+@end menu
+
+
+@node Useful Highlighting
+@subsection Highlighting Commands are Useful
+
+The highlighting commands can be used to extract useful information
+from the file, such as lists of functions or file names. It is
+possible, for example, to write a program in Emacs Lisp (or a keyboard
+macro) to insert an index entry after every paragraph that contains
+words or phrases marked by a specified command. You could do this to
+construct an index of functions if you had not already made the
+entries.@refill
+
+The commands serve a variety of purposes:@refill
+
+@table @code
+@item @@code@{@var{sample-code}@}
+Indicate text that is a literal example of a piece of a program.
+@xref{code,,@code{@@code}}.
+
+@item @@kbd@{@var{keyboard-characters}@}
+Indicate keyboard input.
+@xref{kbd,,@code{@@kbd}}.
+
+@item @@key@{@var{key-name}@}
+Indicate the conventional name for a key on a keyboard.
+@xref{key,,@code{@@key}}.
+
+@item @@samp@{@var{text}@}
+Indicate text that is a literal example of a sequence of characters.
+@xref{samp,,@code{@@samp}}.
+
+@item @@verb@{@var{text}@}
+Write a verbatim sequence of characters.
+@xref{verb,,@code{@@verb}}.
+
+@item @@var@{@var{metasyntactic-variable}@}
+Indicate a metasyntactic variable.
+@xref{var,,@code{@@var}}.
+
+@item @@env@{@var{environment-variable}@}
+Indicate an environment variable.
+@xref{env,,@code{@@kenv}}.
+
+@item @@file@{@var{file-name}@}
+Indicate the name of a file.
+@xref{file,,@code{@@file}}.
+
+@item @@command@{@var{command-name}@}
+Indicate the name of a command.
+@xref{command,,@code{@@command}}.
+
+@item @@option@{@var{option}@}
+Indicate a command-line option.
+@xref{option,,@code{@@option}}.
+
+@item @@dfn@{@var{term}@}
+Indicate the introductory or defining use of a term.
+@xref{dfn,,@code{@@dfn}}.
+
+@item @@cite@{@var{reference}@}
+Indicate the name of a book.
+@xref{cite,,@code{@@cite}}.
+
+@item @@abbr@{@var{abbreviation}@}
+Indicate an abbreviation.
+
+@item @@acronym@{@var{acronym}@}
+Indicate an acronym.
+@xref{acronym,,@code{@@acronym}}.
+
+@item @@indicateurl@{@var{uniform-resource-locator}@}
+Indicate an example (that is, nonfunctional) uniform resource locator.
+@xref{indicateurl,,@code{@@indicateurl}}. (Use @code{@@url}
+(@pxref{uref,,@code{@@url}}) for live url's.)
+
+@item @@email@{@var{email-address}[, @var{displayed-text}]@}
+Indicate an electronic mail address.
+@xref{email,,@code{@@email}}.
+
+@ignore
+@item @@ctrl@{@var{ctrl-char}@}
+Use for an @sc{ascii} control character.@refill
+@end ignore
+@end table
+
+
+@node code
+@subsection @code{@@code}@{@var{sample-code}@}
+@findex code
+
+@cindex Syntactic tokens, indicating
+Use the @code{@@code} command to indicate text that is a piece of a
+program and which consists of entire syntactic tokens. Enclose the
+text in braces.
+
+@cindex Expressions in a program, indicating
+@cindex Keywords, indicating
+@cindex Reserved words, indicating
+Thus, you should use @code{@@code} for an expression in a program, for
+the name of a variable or function used in a program, or for a
+keyword in a programming language.
+
+Use @code{@@code} for command names in languages that resemble
+programming languages, such as Texinfo. For example, @code{@@code} and
+@code{@@samp} are produced by writing @samp{@@code@{@@@@code@}} and
+@samp{@@code@{@@@@samp@}} in the Texinfo source, respectively.
+
+@cindex Case, not altering in @code{@@code}
+It is incorrect to alter the case of a word inside an @code{@@code}
+command when it appears at the beginning of a sentence. Most computer
+languages are case sensitive. In C, for example, @code{Printf} is
+different from the identifier @code{printf}, and most likely is a
+misspelling of it. Even in languages which are not case sensitive, it
+is confusing to a human reader to see identifiers spelled in different
+ways. Pick one spelling and always use that. If you do not want to
+start a sentence with a command name written all in lower case, you
+should rearrange the sentence.
+
+In the printed manual, @code{@@code} causes @TeX{} to typeset the
+argument in a typewriter face. In the Info file, it causes the Info
+formatting commands to use single quotation marks around the text.
+
+@need 700
+For example,
+
+@example
+The function returns @@code@{nil@}.
+@end example
+
+@noindent
+produces this in the printed manual:
+
+@quotation
+The function returns @code{nil}.
+@end quotation
+
+@iftex
+@noindent
+and this in the Info file:
+@example
+The function returns `nil'.
+@end example
+@end iftex
+
+Here are some cases for which it is preferable not to use @code{@@code}:
+
+@itemize @bullet
+@item
+For shell command names such as @command{ls} (use @code{@@command}).
+
+@item
+For shell options such as @samp{-c} when such options stand alone (use
+@code{@@option}).
+
+@item
+Also, an entire shell command often looks better if written using
+@code{@@samp} rather than @code{@@code}. In this case, the rule is to
+choose the more pleasing format.
+
+@item
+For environment variable such as @env{TEXINPUTS} (use @code{@@env}).
+
+@item
+For a string of characters shorter than a syntactic token. For example,
+if you are writing about @samp{goto-ch}, which is just a part of the
+name for the @code{goto-char} Emacs Lisp function, you should use
+@code{@@samp}.
+
+@item
+In general, when writing about the characters used in a token; for
+example, do not use @code{@@code} when you are explaining what letters
+or printable symbols can be used in the names of functions. (Use
+@code{@@samp}.) Also, you should not use @code{@@code} to mark text
+that is considered input to programs unless the input is written in a
+language that is like a programming language. For example, you should
+not use @code{@@code} for the keystroke commands of GNU Emacs (use
+@code{@@kbd} instead) although you may use @code{@@code} for the names
+of the Emacs Lisp functions that the keystroke commands invoke.
+
+@end itemize
+
+Since @code{@@command}, @code{@@option}, and @code{@@env} were
+introduced relatively recently, it is acceptable to use @code{@@code} or
+@code{@@samp} for command names, options, and environment variables.
+The new commands allow you to express the markup more precisely, but
+there is no real harm in using the older commands, and of course the
+long-standing manuals do so.
+
+
+@node kbd
+@subsection @code{@@kbd}@{@var{keyboard-characters}@}
+@findex kbd
+@cindex Keyboard input
+
+Use the @code{@@kbd} command for characters of input to be typed by
+users. For example, to refer to the characters @kbd{M-a}, write:
+
+@example
+@@kbd@{M-a@}
+@end example
+
+@noindent
+and to refer to the characters @kbd{M-x shell}, write:
+
+@example
+@@kbd@{M-x shell@}
+@end example
+
+@cindex User input
+@cindex Slanted typewriter font, for @code{@@kbd}
+By default, the @code{@@kbd} command produces a different font
+(slanted typewriter instead of normal typewriter) in the printed
+manual, so users can distinguish the characters that they are supposed
+to type from those that the computer outputs.
+
+In Info output, @code{@@kbd} is usually the same as @code{@@code},
+producing `quotes' around its argument. However, in typewriter-like
+contexts such as the @code{@@example} environment (@pxref{example})
+and @code{@@code} command itself, the quotes are omitted, since Info
+format cannot use distinguishing fonts.
+
+@findex kbdinputstyle
+Since the usage of @code{@@kbd} varies from manual to manual, you can
+control the font switching with the @code{@@kbdinputstyle} command.
+This command has no effect on Info output. Write this command at the
+beginning of a line with a single word as an argument, one of the
+following:
+
+@vindex distinct@r{, value for @code{@@kbdinputstyle}}
+@vindex example@r{, value for @code{@@kbdinputstyle}}
+@vindex code@r{, value for @code{@@kbdinputstyle}}
+@table @samp
+@item code
+Always use the same font for @code{@@kbd} as @code{@@code}.
+@item example
+Use the distinguishing font for @code{@@kbd} only in @code{@@example}
+and similar environments.
+@item distinct
+(the default) Always use the distinguishing font for @code{@@kbd}.
+@end table
+
+You can embed another @@-command inside the braces of an @code{@@kbd}
+command. Here, for example, is the way to describe a command that
+would be described more verbosely as ``press the @samp{r} key and then
+press the @key{RETURN} key'':
+
+@example
+@@kbd@{r @@key@{RET@}@}
+@end example
+
+@noindent
+This produces: @kbd{r @key{RET}}. (The present manual accepts the
+default for @code{@@kbdinputstyle}.)
+
+You also use the @code{@@kbd} command if you are spelling out the letters
+you type; for example:
+
+@example
+To give the @@code@{logout@} command,
+type the characters @@kbd@{l o g o u t @@key@{RET@}@}.
+@end example
+
+@noindent
+This produces:
+
+@quotation
+To give the @code{logout} command,
+type the characters @kbd{l o g o u t @key{RET}}.
+@end quotation
+
+(Also, this example shows that you can add spaces for clarity. If you
+explicitly want to mention a space character as one of the characters of
+input, write @kbd{@@key@{SPC@}} for it.)@refill
+
+
+@node key
+@comment node-name, next, previous, up
+@subsection @code{@@key}@{@var{key-name}@}
+@findex key
+
+Use the @code{@@key} command for the conventional name for a key on a
+keyboard, as in:@refill
+
+@example
+@@key@{RET@}
+@end example
+
+You can use the @code{@@key} command within the argument of an
+@code{@@kbd} command when the sequence of characters to be typed
+includes one or more keys that are described by name.@refill
+
+@need 700
+For example, to produce @kbd{C-x @key{ESC}} you would type:@refill
+
+@example
+@@kbd@{C-x @@key@{ESC@}@}
+@end example
+
+Here is a list of the recommended names for keys:
+@cindex Recommended names for keys
+@cindex Keys, recommended names
+@cindex Names recommended for keys
+@cindex Abbreviations for keys
+
+@quotation
+@table @t
+@item SPC
+Space
+@item RET
+Return
+@item LFD
+Linefeed (however, since most keyboards nowadays do not have a Linefeed key,
+it might be better to call this character @kbd{C-j}.
+@item TAB
+Tab
+@item BS
+Backspace
+@item ESC
+Escape
+@item DEL
+Delete
+@item SHIFT
+Shift
+@item CTRL
+Control
+@item META
+Meta
+@end table
+@end quotation
+
+@cindex META key
+There are subtleties to handling words like `meta' or `ctrl' that are
+names of modifier keys. When mentioning a character in which the
+modifier key is used, such as @kbd{Meta-a}, use the @code{@@kbd} command
+alone; do not use the @code{@@key} command; but when you are referring
+to the modifier key in isolation, use the @code{@@key} command. For
+example, write @samp{@@kbd@{Meta-a@}} to produce @kbd{Meta-a} and
+@samp{@@key@{META@}} to produce @key{META}.
+
+@c I don't think this is a good explanation.
+@c I think it will puzzle readers more than it clarifies matters. -- rms.
+@c In other words, use @code{@@kbd} for what you do, and use @code{@@key}
+@c for what you talk about: ``Press @code{@@kbd@{M-a@}} to move point to
+@c the beginning of the sentence. The @code{@@key@{META@}} key is often in
+@c the lower left of the keyboard.''@refill
+
+@node samp
+@subsection @code{@@samp}@{@var{text}@}
+@findex samp
+
+Use the @code{@@samp} command to indicate text that is a literal example
+or `sample' of a sequence of characters in a file, string, pattern, etc.
+Enclose the text in braces. The argument appears within single
+quotation marks in both the Info file and the printed manual; in
+addition, it is printed in a fixed-width font.@refill
+
+@example
+To match @@samp@{foo@} at the end of the line,
+use the regexp @@samp@{foo$@}.
+@end example
+
+@noindent
+produces
+
+@quotation
+To match @samp{foo} at the end of the line, use the regexp
+@samp{foo$}.@refill
+@end quotation
+
+Any time you are referring to single characters, you should use
+@code{@@samp} unless @code{@@kbd} or @code{@@key} is more appropriate.
+Also, you may use @code{@@samp} for entire statements in C and for entire
+shell commands---in this case, @code{@@samp} often looks better than
+@code{@@code}. Basically, @code{@@samp} is a catchall for whatever is
+not covered by @code{@@code}, @code{@@kbd}, or @code{@@key}.@refill
+
+Only include punctuation marks within braces if they are part of the
+string you are specifying. Write punctuation marks outside the braces
+if those punctuation marks are part of the English text that surrounds
+the string. In the following sentence, for example, the commas and
+period are outside of the braces:@refill
+
+@example
+@group
+In English, the vowels are @@samp@{a@}, @@samp@{e@},
+@@samp@{i@}, @@samp@{o@}, @@samp@{u@}, and sometimes
+@@samp@{y@}.
+@end group
+@end example
+
+@noindent
+This produces:
+
+@quotation
+In English, the vowels are @samp{a}, @samp{e},
+@samp{i}, @samp{o}, @samp{u}, and sometimes
+@samp{y}.
+@end quotation
+
+
+@node verb
+@subsection @code{@@verb}@{<char>@var{text}<char>@}
+@findex verb
+@cindex Verbatim in-line text
+
+@cindex Delimiter character, for verbatim
+Use the @code{@@verb} command to print a verbatim sequence of
+characters.
+
+Like @LaTeX{}'s @code{\verb} command, the verbatim text can be quoted using
+any unique delimiter character. Enclose the verbatim text, including the
+delimiters, in braces. Text is printed in a fixed-width font:
+
+@example
+How many @@verb@{|@@|@}-escapes does one need to print this
+@@verb@{.@@a @@b @@c.@} string or @@verb@{+@@'e@?`@!`@{@}\+@} this?
+@end example
+
+@noindent
+produces
+
+@example
+How many @verb{|@|}-escapes does one need to print this
+@verb{.@a @b @c.} string or these @verb{+@'e?`{}!`\+} this?
+@end example
+
+This is in contrast to @code{@@samp} (see the previous section),
+@code{@@code}, and similar commands; in those cases, the argument is
+normal Texinfo text, where the three characters @code{@@@{@}} are
+special. With @code{@@verb}, nothing is special except the delimiter
+character you choose.
+
+It is not reliable to use @code{@@verb} inside other Texinfo
+constructs. In particular, it does not work to use @code{@@verb} in
+anything related to cross-referencing, such as section titles or
+figure captions.
+
+
+@node var
+@subsection @code{@@var}@{@var{metasyntactic-variable}@}
+@findex var
+
+Use the @code{@@var} command to indicate metasyntactic variables. A
+@dfn{metasyntactic variable} is something that stands for another piece of
+text. For example, you should use a metasyntactic variable in the
+documentation of a function to describe the arguments that are passed
+to that function.@refill
+
+Do not use @code{@@var} for the names of particular variables in
+programming languages. These are specific names from a program, so
+@code{@@code} is correct for them (@pxref{code}). For example, the
+Emacs Lisp variable @code{texinfo-tex-command} is not a metasyntactic
+variable; it is properly formatted using @code{@@code}.
+
+Do not use @code{@@var} for environment variables either; @code{@@env}
+is correct for them (see the next section).
+
+The effect of @code{@@var} in the Info file is to change the case of the
+argument to all upper case. In the printed manual and HTML output, the
+argument is printed in slanted type.
+
+@need 700
+For example,
+
+@example
+To delete file @@var@{filename@},
+type @@samp@{rm @@var@{filename@}@}.
+@end example
+
+@noindent
+produces
+
+@quotation
+To delete file @var{filename}, type @samp{rm @var{filename}}.
+@end quotation
+
+@noindent
+(Note that @code{@@var} may appear inside @code{@@code},
+@code{@@samp}, @code{@@file}, etc.)@refill
+
+Write a metasyntactic variable all in lower case without spaces, and
+use hyphens to make it more readable. Thus, the Texinfo source for
+the illustration of how to begin a Texinfo manual looks like
+this:@refill
+
+@example
+@group
+\input texinfo
+@@@@setfilename @@var@{info-file-name@}
+@@@@settitle @@var@{name-of-manual@}
+@end group
+@end example
+
+@noindent
+This produces:
+
+@example
+@group
+\input texinfo
+@@setfilename @var{info-file-name}
+@@settitle @var{name-of-manual}
+@end group
+@end example
+
+In some documentation styles, metasyntactic variables are shown with
+angle brackets, for example:@refill
+
+@example
+@dots{}, type rm <filename>
+@end example
+
+@noindent
+However, that is not the style that Texinfo uses. (You can, of
+course, modify the sources to @file{texinfo.tex} and the Info formatting commands
+to output the @code{<@dots{}>} format if you wish.)@refill
+
+
+@node env
+@subsection @code{@@env}@{@var{environment-variable}@}
+@findex env
+
+Use the @code{@@env} command to indicate environment variables, as used
+by many operating systems, including GNU. Do not use it for
+metasyntactic variables; use @code{@@var} instead (see the previous
+section).
+
+@code{@@env} is equivalent to @code{@@code} in its effects.
+For example:
+
+@example
+The @@env@{PATH@} environment variable @dots{}
+@end example
+@noindent produces
+@quotation
+The @env{PATH} environment variable @dots{}
+@end quotation
+
+
+@node file
+@subsection @code{@@file}@{@var{file-name}@}
+@findex file
+
+Use the @code{@@file} command to indicate text that is the name of a
+file, buffer, or directory, or is the name of a node in Info. You can
+also use the command for file name suffixes. Do not use @code{@@file}
+for symbols in a programming language; use @code{@@code}.
+
+Currently, @code{@@file} is equivalent to @code{@@samp} in its effects.
+For example,@refill
+
+@example
+The @@file@{.el@} files are in
+the @@file@{/usr/local/emacs/lisp@} directory.
+@end example
+
+@noindent
+produces
+
+@quotation
+The @file{.el} files are in
+the @file{/usr/local/emacs/lisp} directory.
+@end quotation
+
+
+@node command
+@subsection @code{@@command}@{@var{command-name}@}
+@findex command
+@cindex Command names, indicating
+@cindex Program names, indicating
+
+Use the @code{@@command} command to indicate command names, such as
+@command{ls} or @command{cc}.
+
+@code{@@command} is equivalent to @code{@@code} in its effects.
+For example:
+
+@example
+The command @@command@{ls@} lists directory contents.
+@end example
+@noindent produces
+@quotation
+The command @command{ls} lists directory contents.
+@end quotation
+
+You should write the name of a program in the ordinary text font, rather
+than using @code{@@command}, if you regard it as a new English word,
+such as `Emacs' or `Bison'.
+
+When writing an entire shell command invocation, as in @samp{ls -l},
+you should use either @code{@@samp} or @code{@@code} at your discretion.
+
+
+@node option
+@subsection @code{@@option}@{@var{option-name}@}
+@findex option
+
+Use the @code{@@option} command to indicate a command-line option; for
+example, @option{-l} or @option{--version} or
+@option{--output=@var{filename}}.
+
+@code{@@option} is equivalent to @code{@@samp} in its effects.
+For example:
+
+@example
+The option @@option@{-l@} produces a long listing.
+@end example
+@noindent produces
+@quotation
+The option @option{-l} produces a long listing.
+@end quotation
+
+In tables, putting options inside @code{@@code} produces a
+more pleasing effect.
+
+@node dfn
+@comment node-name, next, previous, up
+@subsection @code{@@dfn}@{@var{term}@}
+@findex dfn
+
+Use the @code{@@dfn} command to identify the introductory or defining
+use of a technical term. Use the command only in passages whose
+purpose is to introduce a term which will be used again or which the
+reader ought to know. Mere passing mention of a term for the first
+time does not deserve @code{@@dfn}. The command generates italics in
+the printed manual, and double quotation marks in the Info file. For
+example:@refill
+
+@example
+Getting rid of a file is called @@dfn@{deleting@} it.
+@end example
+
+@noindent
+produces
+
+@quotation
+Getting rid of a file is called @dfn{deleting} it.
+@end quotation
+
+As a general rule, a sentence containing the defining occurrence of a
+term should be a definition of the term. The sentence does not need
+to say explicitly that it is a definition, but it should contain the
+information of a definition---it should make the meaning clear.
+
+@node cite
+@subsection @code{@@cite}@{@var{reference}@}
+@findex cite
+
+Use the @code{@@cite} command for the name of a book that lacks a
+companion Info file. The command produces italics in the printed
+manual, and quotation marks in the Info file.
+
+If a book is written in Texinfo, it is better to use a cross reference
+command since a reader can easily follow such a reference in Info.
+@xref{xref, , @code{@@xref}}.
+
+
+@ignore
+@c node ctrl, , cite, Indicating
+@comment node-name, next, previous, up
+@c subsection @code{@@ctrl}@{@var{ctrl-char}@}
+@findex ctrl
+
+The @code{@@ctrl} command is seldom used. It describes an @sc{ascii}
+control character by inserting the actual character into the Info
+file.
+
+Usually, in Texinfo, you talk what you type as keyboard entry by
+describing it with @code{@@kbd}: thus, @samp{@@kbd@{C-a@}} for
+@kbd{C-a}. Use @code{@@kbd} in this way when talking about a control
+character that is typed on the keyboard by the user. When talking
+about a control character appearing in a file or a string, do not use
+@code{@@kbd} since the control character is not typed. Also, do not
+use @samp{C-} but spell out @code{control-}, as in @samp{control-a},
+to make it easier for a reader to understand.@refill
+
+@code{@@ctrl} is an idea from the beginnings of Texinfo which may not
+really fit in to the scheme of things. But there may be times when
+you want to use the command. The pattern is
+@code{@@ctrl@{@var{ch}@}}, where @var{ch} is an @sc{ascii} character
+whose control-equivalent is wanted. For example, to specify
+@samp{control-f}, you would enter@refill
+
+@example
+@@ctrl@{f@}
+@end example
+
+@noindent
+produces
+
+@quotation
+@ctrl{f}
+@end quotation
+
+In the Info file, this generates the specified control character, output
+literally into the file. This is done so a user can copy the specified
+control character (along with whatever else he or she wants) into another
+Emacs buffer and use it. Since the `control-h',`control-i', and
+`control-j' characters are formatting characters, they should not be
+indicated with @code{@@ctrl}.@refill
+
+In a printed manual, @code{@@ctrl} generates text to describe or
+identify that control character: an uparrow followed by the character
+@var{ch}.@refill
+@end ignore
+
+
+@node abbr
+@subsection @code{@@abbr}@{@var{abbreviation}[, @var{meaning}]@}
+@findex abbr
+
+@cindex Abbreviations, tagging
+You can use the @code{@@abbr} command for general abbreviations. The
+abbreviation is given as the single argument in braces, as in
+@samp{@@abbr@{Comput.@}}. As a matter of style, or for particular
+abbreviations, you may prefer to omit periods, as in
+@samp{@@abbr@{Mr@} Stallman}.
+
+@code{@@abbr} accepts an optional second argument, intended to be used
+for the meaning of the abbreviation.
+
+If the abbreviation ends with a lowercase letter and a period, and is
+not at the end of a sentence, and has no second argument, remember to
+use the @code{@@.} command (@pxref{Not Ending a
+Sentence}) to get the correct spacing. However, you do not have to
+use @code{@@.} within the abbreviation itself; Texinfo automatically
+assumes periods within the abbreivation do not end a sentence.
+
+@cindex <abbr> tag
+In @TeX{} and in the Info output, the first argument is printed as-is;
+if the second argument is present, it is printed in parentheses after
+the abbreviation. In HTML and XML, the @code{<abbr>} tag is
+used; in Docbook, the @code{<abbrev>} tag is used. For instance:
+
+@example
+@@abbr@{Comput. J., Computer Journal@}
+@end example
+
+@noindent produces:
+
+@display
+@abbr{Comput. J., Computer Journal}
+@end display
+
+For abbreviations consisting of all capital letters, you may prefer to
+use the @code{@@acronym} command instead. See the next section for
+more on the usage of these two commands.
+
+
+@node acronym
+@subsection @code{@@acronym}@{@var{acronym}[, @var{meaning}]@}
+@findex acronym
+
+@cindex NASA, as acronym
+@cindex Acronyms, tagging
+Use the @code{@@acronym} command for abbreviations written in all
+capital letters, such as `@acronym{NASA}'. The abbreviation is given as
+the single argument in braces, as in @samp{@@acronym@{NASA@}}. As
+a matter of style, or for particular acronyms, you may prefer to
+use periods, as in @samp{@@acronym@{N.A.S.A.@}}.
+
+@code{@@acronym} accepts an optional second argument, intended to be
+used for the meaning of the acronym.
+
+If the acronym is at the end of a sentence, and if there is no second
+argument, remember to use the @code{@@.} or similar command
+(@pxref{Ending a Sentence}) to get the correct spacing.
+
+@cindex <acronym> tag
+In @TeX{}, the acronym is printed in slightly smaller font. In the
+Info output, the argument is printed as-is. In either format, if the
+second argument is present, it is printed in parentheses after the
+acronym. In HTML, Docbook, and XML, the @code{<acronym>} tag is
+used.
+
+For instance (since GNU is a recursive acronym, we use
+@code{@@acronym} recursively):
+
+@example
+@@acronym@{GNU, @@acronym@{GNU@}'s Not Unix@}
+@end example
+
+@noindent produces:
+
+@display
+@acronym{GNU, @acronym{GNU}'s Not Unix}
+@end display
+
+In some circumstances, it is conventional to print family names in all
+capitals. Don't use @code{@@acronym} for this, since a name is not an
+acronym. Use @code{@@sc} instead (@pxref{Smallcaps}).
+
+@code{@@abbr} and @code{@@acronym} are closely related commands: they
+both signal to the reader that a shortened form is being used, and
+possibly give a meaning. When choosing whether to use these two
+commands, please bear the following in mind.
+
+@itemize @minus
+@item
+In standard English usage, acronyms are a subset of abbreviations:
+they include pronounceable words like `@acronym{NATO}', `radar', and
+`snafu', and some sources also include syllable acronyms like
+`Usenet', hybrids like `@acronym{SIGGRAPH}', and unpronounceable
+initialisms like `@acronym{FBI}'.
+
+@item
+In Texinfo, an acronym (but not an abbreviation) should consist only
+of capital letters and periods, no lowercase.
+
+@item
+In @TeX{}, an acronym (but not an abbreviation) is printed in a
+slightly smaller font.
+
+@item
+Some browsers place a dotted bottom border under abbreviations but not
+acronyms.
+
+@item
+It's not essential to use these commands for all abbreviations. Text
+is perfectly readable without them, and for common abbreviations like
+`etc.@:', we consider them to be overkill.
+
+@end itemize
+
+
+@node indicateurl
+@subsection @code{@@indicateurl}@{@var{uniform-resource-locator}@}
+@findex indicateurl
+@cindex Uniform resource locator, indicating
+@cindex URL, indicating
+
+Use the @code{@@indicateurl} command to indicate a uniform resource
+locator on the World Wide Web. This is analogous to @code{@@file},
+@code{@@var}, etc., and is purely for markup purposes. It does not
+produce a link you can follow in HTML output (use the @code{@@uref}
+command for that, @pxref{uref,, @code{@@uref}}). It is useful for
+url's which do not actually exist. For example:
+
+@example
+For example, the url might be @@indicateurl@{http://example.org/path@}.
+@end example
+
+@noindent which produces:
+
+@display
+For example, the url might be @indicateurl{http://example.org/path}.
+@end display
+
+
+@node email
+@subsection @code{@@email}@{@var{email-address}[, @var{displayed-text}]@}
+@findex email
+
+Use the @code{@@email} command to indicate an electronic mail address.
+It takes one mandatory argument, the address, and one optional argument, the
+text to display (the default is the address itself).
+
+@cindex Mailto link
+In Info, the address is shown in angle brackets, preceded by the text
+to display if any. In @TeX{}, the angle brackets are omitted. In
+HTML output, @code{@@email} produces a @samp{mailto} link that usually
+brings up a mail composition window. For example:
+
+@example
+Send bug reports to @@email@{bug-texinfo@@@@gnu.org@},
+suggestions to the @@email@{bug-texinfo@@@@gnu.org, same place@}.
+@end example
+@noindent produces
+@display
+Send bug reports to @email{bug-texinfo@@gnu.org},
+suggestions to the @email{bug-texinfo@@gnu.org, same place}.
+@end display
+
+
+@node Emphasis
+@comment node-name, next, previous, up
+@section Emphasizing Text
+@cindex Emphasizing text
+
+Usually, Texinfo changes the font to mark words in the text according to
+what category the words belong to; an example is the @code{@@code} command.
+Most often, this is the best way to mark words.
+However, sometimes you will want to emphasize text without indicating a
+category. Texinfo has two commands to do this. Also, Texinfo has
+several commands that specify the font in which @TeX{} will typeset
+text. These commands have no effect on Info and only one of them,
+the @code{@@r} command, has any regular use.@refill
+
+@menu
+* emph & strong:: How to emphasize text in Texinfo.
+* Smallcaps:: How to use the small caps font.
+* Fonts:: Various font commands for printed output.
+@end menu
+
+@node emph & strong
+@subsection @code{@@emph}@{@var{text}@} and @code{@@strong}@{@var{text}@}
+@cindex Emphasizing text, font for
+@findex emph
+@findex strong
+
+The @code{@@emph} and @code{@@strong} commands are for emphasis;
+@code{@@strong} is stronger. In printed output, @code{@@emph} produces
+@emph{italics} and @code{@@strong} produces @strong{bold}.
+
+For example,
+
+@example
+@group
+@@strong@{Caution:@} @@samp@{rm * .[^.]*@}
+removes @@emph@{all@} files in the directory.
+@end group
+@end example
+
+@noindent
+produces the following in printed output and HTML:
+
+@quotation
+@strong{Caution}: @samp{rm * .[^.]*}
+removes @emph{all} files in the directory.
+@end quotation
+
+@noindent
+and the following in Info:
+
+@example
+*Caution:* `rm * .[^.]*' removes _all_
+files in the directory.
+@end example
+
+The @code{@@strong} command is seldom used except to mark what is, in
+effect, a typographical element, such as the word `Caution' in the
+preceding example.
+
+In the Info output, @code{@@emph} surrounds the text with underscores
+(@samp{_}), and @code{@@strong} puts asterisks around the text.
+
+@quotation Caution
+Do not use @code{@@strong} with the word @samp{Note}; Info will
+mistake the combination for a cross reference. (It's usually
+redundant, anyway.) Use a phrase such as @strong{Please notice} or
+@strong{Caution} instead, or the optional argument to
+@code{@@quotation}---@samp{Note} is allowable there.
+@end quotation
+
+
+@node Smallcaps
+@subsection @code{@@sc}@{@var{text}@}: The Small Caps Font
+@cindex Small caps font
+@findex sc @r{(small caps font)}
+
+Use the @samp{@@sc} command to set text in @sc{a small caps font}
+(where possible). Write the text you want to be in small caps between
+braces in lower case, like this:
+
+@example
+Richard @@sc@{Stallman@} founded @@acronym@{GNU@}.
+@end example
+
+@noindent
+This produces:
+
+@display
+Richard @sc{Stallman} founded @acronym{GNU}.
+@end display
+
+As shown here, we recommend using @code{@@acronym} for actual
+acronyms (@pxref{acronym}), and reserving @code{@@sc} for special
+cases where you want small caps. The output is not the same
+(@code{@@acronym} prints in a smaller text font, not the small caps
+font), but more importantly it describes the actual text more
+accurately.
+
+Family names are one case where small capitals are sometimes desirable,
+also as shown here.
+
+@cindex <small> tag
+@TeX{} typesets any uppercase letters between the braces of an
+@code{@@sc} command in full-size capitals; only lowercase letters are
+printed in the small caps font. In the Info output, the argument to
+@code{@@sc} is printed in all upper case. In HTML, the argument is
+uppercased and the output marked with the @code{<small>} tag to reduce
+the font size.
+
+Since it's redundant to mark all-uppercase text with @code{@@sc},
+@command{makeinfo} warns about such usage.
+
+We recommend using regular mixed case wherever possible.
+
+
+@node Fonts
+@subsection Fonts for Printing, Not Info
+@cindex Fonts for printing, not Info
+
+Texinfo provides a number of font commands that specify font changes
+in the printed manual and (where possible) in the HTML output, but
+have no effect in the Info file. All the commands apply to an
+argument that follows, surrounded by braces.
+
+@table @code
+@item @@b
+@findex b @r{(bold font)}
+@cindex Bold font
+selects @b{bold} face;
+
+@item @@i
+@findex i @r{(italic font)}
+@cindex Italic font
+selects an @i{italic} font;
+
+@item @@r
+@findex r @r{(roman font)}
+@cindex Roman font
+@cindex Default font
+selects a @r{roman} font, which is the usual font in which text is
+printed. It may or may not be seriffed.
+
+@item @@sansserif
+@findex sansserif @r{(sans serif font)}
+@cindex Sans serif font
+selects a @sansserif{sans serif} font;
+
+@item @@slanted
+@findex slanted @r{(slanted font)}
+@cindex Slanted font
+@cindex Oblique font
+rselects a @slanted{slanted} font;
+
+@item @@t
+@findex t @r{(typewriter font)}
+@cindex Monospace font
+@cindex Fixed-width font
+@cindex Typewriter font
+selects the @t{fixed-width}, typewriter-style font used by @code{@@code};
+
+@end table
+
+(The commands with longer names were invented much later than the
+others, when it did not seem desirable to use very short names for
+such an infrequently needed feature.)
+
+@cindex <lineannotation> Docbook tag
+Only the @code{@@r} command has much use: in example-like
+environments, you can use the @code{@@r} command to write comments in
+the standard roman font instead of the fixed-width font. This looks
+better in printed output, and produces a @code{<lineannotation>} tag
+in Docbook output.
+
+For example,
+
+@example
+@group
+@@lisp
+(+ 2 2) ; @@r@{Add two plus two.@}
+@@end lisp
+@end group
+@end example
+
+@noindent
+produces
+
+@lisp
+(+ 2 2) ; @r{Add two plus two.}
+@end lisp
+
+In general, you should avoid using the other font commands. Some of
+them are only useful when documenting functionality with specific font
+effects, such as in \TeX\ and related packages.
+
+
+@node Quotations and Examples
+@chapter Quotations and Examples
+
+Quotations and examples are blocks of text consisting of one or more
+whole paragraphs that are set off from the bulk of the text and
+treated differently. They are usually indented in the output.
+
+@findex end
+In Texinfo, you always begin a quotation or example by writing an
+@@-command at the beginning of a line by itself, and end it by writing
+an @code{@@end} command that is also at the beginning of a line by
+itself. For instance, you begin an example by writing @code{@@example}
+by itself at the beginning of a line and end the example by writing
+@code{@@end example} on a line by itself, at the beginning of that
+line, and with only one space between the @code{@@end} and the
+@code{example}.
+
+@menu
+* Block Enclosing Commands:: Different constructs for different purposes.
+* quotation:: Writing a quotation.
+* example:: Writing an example in a fixed-width font.
+* verbatim:: Writing a verbatim example.
+* verbatiminclude:: Including a file verbatim.
+* lisp:: Illustrating Lisp code.
+* small:: Examples in a smaller font.
+* display:: Writing an example in the current font.
+* format:: Writing an example without narrowed margins.
+* exdent:: Undo indentation on a line.
+* flushleft & flushright:: Pushing text flush left or flush right.
+* noindent:: Preventing paragraph indentation.
+* indent:: Forcing paragraph indentation.
+* cartouche:: Drawing rounded rectangles around examples.
+@end menu
+
+
+@node Block Enclosing Commands
+@section Block Enclosing Commands
+
+Here are commands for quotations and examples, explained further in the
+following sections:
+
+@table @code
+@item @@quotation
+Indicate text that is quoted. The text is filled, indented (from both
+margins), and printed in a roman font by default.
+
+@item @@example
+Illustrate code, commands, and the like. The text is printed
+in a fixed-width font, and indented but not filled.
+
+@item @@verbatim
+Mark a piece of text that is to be printed verbatim; no character
+substitutions are made and all commands are ignored, until the next
+@code{@@end verbatim}. The text is printed in a fixed-width font,
+and not indented or filled. Extra spaces and blank lines are
+significant, and tabs are expanded.
+
+@item @@smallexample
+Same as @code{@@example}, except that in @TeX{} this command typesets
+text in a smaller font.
+
+@item @@lisp
+Like @code{@@example}, but specifically for illustrating Lisp code. The
+text is printed in a fixed-width font, and indented but not filled.
+
+@item @@smalllisp
+Is to @code{@@lisp} as @code{@@smallexample} is to @code{@@example}.
+
+@item @@display
+Display illustrative text. The text is indented but not filled, and
+no font is selected (so, by default, the font is roman).@refill
+
+@item @@smalldisplay
+Is to @code{@@display} as @code{@@smallexample} is to @code{@@example}.
+
+@item @@format
+Like @code{@@display} (the text is not filled and no font is selected),
+but the text is not indented.
+
+@item @@smallformat
+Is to @code{@@format} as @code{@@smallexample} is to @code{@@example}.
+@end table
+
+The @code{@@exdent} command is used within the above constructs to
+undo the indentation of a line.
+
+The @code{@@flushleft} and @code{@@flushright} commands are used to line
+up the left or right margins of unfilled text.@refill
+
+The @code{@@noindent} command may be used after one of the above
+constructs to prevent the following text from being indented as a new
+paragraph.
+
+You can use the @code{@@cartouche} environment around one of the above
+constructs to highlight the example or quotation by drawing a box with
+rounded corners around it. @xref{cartouche, , Drawing Cartouches Around
+Examples}.
+
+
+@node quotation
+@section @code{@@quotation}: Block quotations
+@cindex Quotations
+@findex quotation
+
+The text of a quotation is processed normally (regular font, text is
+filled) except that:
+
+@itemize @bullet
+@item
+the margins are closer to the center of the page, so the whole of the
+quotation is indented;
+
+@item
+and the first lines of paragraphs are indented no more than other lines.
+
+@end itemize
+
+@quotation
+This is an example of text written between an @code{@@quotation}
+command and an @code{@@end quotation} command. An @code{@@quotation}
+command is most often used to indicate text that is excerpted from
+another (real or hypothetical) printed work.
+@end quotation
+
+Write an @code{@@quotation} command as text on a line by itself. This
+line will disappear from the output. Mark the end of the quotation
+with a line beginning with and containing only @code{@@end quotation}.
+The @code{@@end quotation} line will likewise disappear from the
+output.
+
+@code{@@quotation} takes one optional argument, given on the remainder
+of the line. This text, if present, is included at the beginning of
+the quotation in bold or otherwise emphasized, and followed with a
+@samp{:}. For example:
+
+@example
+@@quotation Note
+This is
+a foo.
+@@end quotation
+@end example
+
+@noindent
+produces
+
+@quotation Note
+This is
+a foo.
+@end quotation
+
+If the @code{@@quotation} argument is exactly one of these words:
+
+@example
+Caution Important Note Tip Warning
+@end example
+
+@cindex <note> Docbook tag
+@cindex <blockquote> HTML tag
+@noindent then the Docbook output uses corresponding special tags
+(@code{<note>}, etc.) instead of the default @code{<blockquote>}.
+HTML output always uses @code{<blockquote>}.
+
+
+@node example
+@section @code{@@example}: Example Text
+@cindex Examples, formatting them
+@cindex Formatting examples
+@findex example
+
+The @code{@@example} environment is used to indicate an example that
+is not part of the running text, such as computer input or output.
+Write an @code{@@example} command at the beginning of a line by
+itself. Mark the end of the example with an @code{@@end example}
+command, also written at the beginning of a line by itself.
+
+An @code{@@example} environment has the following characteristics:
+
+@itemize
+@item Each line in the input file is a line in the output; that is,
+the source text is not filled as it normally is.
+@item Extra spaces and blank lines are significant.
+@item The output is indented.
+@item The output uses a fixed-width font.
+@item Texinfo commands @emph{are} expanded; if you want the output to
+be the input verbatim, use the @code{@@verbatim} environment instead
+(@pxref{verbatim,,@code{@@verbatim}}).
+@end itemize
+
+For example,
+
+@example
+@@example
+cp foo @@var@{dest1@}; \
+ cp foo @@var@{dest2@}
+@@end example
+@end example
+
+@noindent
+produces
+
+@example
+cp foo @var{dest1}; \
+ cp foo @var{dest2}
+@end example
+
+The lines containing @code{@@example} and @code{@@end example} will
+disappear from the output. To make the output look good, you should
+put a blank line before the @code{@@example} and another blank line
+after the @code{@@end example}. Blank lines inside the beginning
+@code{@@example} and the ending @code{@@end example}, on the other
+hand, do appear in the output.
+
+@quotation Caution
+Do not use tabs in the lines of an example! (Or anywhere else in
+Texinfo, except in verbatim environments.) @TeX{} treats tabs as
+single spaces, and that is not what they look like. In Emacs, you can
+use @kbd{M-x untabify} to convert tabs in a region to multiple spaces.
+@end quotation
+
+Examples are often, logically speaking, ``in the middle'' of a
+paragraph, and the text that continues afterwards should not be
+indented, as in the example above. The @code{@@noindent} command
+prevents a piece of text from being indented as if it were a new
+paragraph (@pxref{noindent,,@code{@@noindent}}.
+
+If you want to embed code fragments within sentences, instead of
+displaying them, use the @code{@@code} command or its relatives
+(@pxref{code,,@code{@@code}}).
+
+If you wish to write a ``comment'' on a line of an example in the
+normal roman font, you can use the @code{@@r} command (@pxref{Fonts}).
+
+
+@node verbatim
+@section @code{@@verbatim}: Literal Text
+@findex verbatim
+@cindex Verbatim environment
+
+Use the @code{@@verbatim} environment for printing of text that may
+contain special characters or commands that should not be interpreted,
+such as computer input or output (@code{@@example} interprets its text
+as regular Texinfo commands). This is especially useful for including
+automatically generated output in a Texinfo manual. Here is an example;
+the output you see is just the same as the input, with a line
+@code{@@verbatim} before and a line @code{@@end verbatim} after.
+
+@verbatim
+This is an example of text written in a @verbatim
+block. No character substitutions are made. All commands
+are ignored, until `<at>end verbatim'.
+
+In the printed manual, the text is typeset in a
+fixed-width font, and not indented or filled. All
+spaces and blank lines are significant, including tabs.
+@end verbatim
+
+Write a @code{@@verbatim} command at the beginning of a line by itself.
+This line will disappear from the output. Mark the end of the verbatim
+block with a @code{@@end verbatim} command, also written at the
+beginning of a line by itself. The @code{@@end verbatim} will also
+disappear from the output.
+
+For example:
+@c oops, got to trick this a bit: can't use @end verbatim inside @verbatim
+
+@example
+@exdent @t{@@verbatim}
+@exdent @t{@{}
+@exdent @key{TAB}@t{@@command with strange characters: @@'e}
+@exdent @t{expand@key{TAB}me}
+@exdent @t{@}}
+@exdent @t{@@end verbatim}
+@end example
+
+@noindent
+produces
+
+@verbatim
+{
+ @command with strange characters: @'e
+expand me
+}
+@end verbatim
+
+Since the lines containing @code{@@verbatim} and @code{@@end verbatim}
+produce no output, typically you should put a blank line before the
+@code{@@verbatim} and another blank line after the @code{@@end
+verbatim}. Blank lines between the beginning @code{@@verbatim} and
+the ending @code{@@end verbatim} will appear in the output.
+
+It is not reliable to use @code{@@verbatim} inside other Texinfo constructs.
+
+
+@node verbatiminclude
+@section @code{@@verbatiminclude} @var{file}: Include a File Verbatim
+@cindex Verbatim, include file
+@cindex Including a file verbatim
+@findex verbatiminclude
+
+You can include the exact contents of a file in the document with the
+@code{@@verbatiminclude} command:
+
+@example
+@@verbatiminclude @var{filename}
+@end example
+
+The contents of @var{filename} is printed in a verbatim environment
+(@pxref{verbatim,,@code{@@verbatim}}). Generally, the file is printed
+exactly as it is, with all special characters and white space
+retained. No indentation is added; if you want indentation, enclose
+the @code{@@verbatiminclude} within @code{@@example}
+(@pxref{example,,@code{@@example}}).
+
+The name of the file is taken literally, with a single exception:
+@code{@@value@{@var{var}@}} references are expanded. This makes it
+possible to reliably include files in other directories in a
+distribution, for instance:
+
+@example
+@@include @@value@{top_srcdir@}/NEWS
+@end example
+
+@noindent (You still have to get @code{top_srcdir} defined in the
+first place.)
+
+
+@node lisp
+@section @code{@@lisp}: Marking a Lisp Example
+@findex lisp
+@cindex Lisp example
+
+The @code{@@lisp} command is used for Lisp code. It is synonymous
+with the @code{@@example} command.
+
+@lisp
+This is an example of text written between an
+@code{@@lisp} command and an @code{@@end lisp} command.
+@end lisp
+
+Use @code{@@lisp} instead of @code{@@example} to preserve information
+regarding the nature of the example. This is useful, for example, if
+you write a function that evaluates only and all the Lisp code in a
+Texinfo file. Then you can use the Texinfo file as a Lisp
+library.@footnote{It would be straightforward to extend Texinfo to work
+in a similar fashion for C, Fortran, or other languages.}
+
+Mark the end of @code{@@lisp} with @code{@@end lisp} on a line by
+itself.
+
+
+@node small
+@section @code{@@small@dots{}} Block Commands
+@cindex Small examples
+@cindex Examples in smaller fonts
+@cindex Lisp examples in smaller fonts
+@findex smalldisplay
+@findex smallexample
+@findex smallformat
+@findex smalllisp
+
+In addition to the regular @code{@@example} and @code{@@lisp} commands,
+Texinfo has ``small'' example-style commands. These are
+@code{@@smalldisplay}, @code{@@smallexample}, @code{@@smallformat}, and
+@code{@@smalllisp}.
+
+In Info, the @code{@@small@dots{}} commands are equivalent to their
+non-small companion commands.
+
+In @TeX{}, however, the @code{@@small@dots{}} commands typeset text in
+a smaller font than the non-small example commands. Consequently,
+many examples containing long lines fit on a page without needing to
+be shortened.
+
+Mark the end of an @code{@@small@dots{}} block with a corresponding
+@code{@@end small@dots{}}. For example, pair @code{@@smallexample} with
+@code{@@end smallexample}.
+
+Here is an example of the font used by the @code{@@small@dots{}}
+commands (in Info, the output will be the same as usual):
+
+@smallexample
+@dots{} to make sure that you have the freedom to
+distribute copies of free software (and charge for
+this service if you wish), that you receive source
+code or can get it if you want it, that you can
+change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+@end smallexample
+
+The @code{@@small@dots{}} commands make it easier to prepare manuals
+without forcing you to edit examples by hand to fit them onto narrower
+pages.
+
+As a general rule, a printed document looks much better if you use
+only one of (for instance) @code{@@example} or @code{@@smallexample}
+consistently within a chapter.
+
+
+@node display
+@section @code{@@display} and @code{@@smalldisplay}
+@cindex Display formatting
+@findex display
+
+The @code{@@display} command begins a kind of example, where each line
+of input produces a line of output, and the output is indented. It is
+thus like the @code{@@example} command except that, in a printed
+manual, @code{@@display} does not select the fixed-width font. In
+fact, it does not specify the font at all, so that the text appears in
+the same font it would have appeared in without the @code{@@display}
+command.
+
+@display
+This is an example of text written between an @code{@@display} command
+and an @code{@@end display} command. The @code{@@display} command
+indents the text, but does not fill it.
+@end display
+
+@findex smalldisplay
+Texinfo also provides a command @code{@@smalldisplay}, which is like
+@code{@@display} but uses a smaller font in @code{@@smallbook} format.
+@xref{small}.
+
+The @code{@@table} command (@pxref{table}) does not work inside
+@code{@@display}. Since @code{@@display} is line-oriented, it doesn't
+make sense to use them together. If you want to indent a table, try
+@code{@@quotation} (@pxref{quotation}).
+
+
+@node format
+@section @code{@@format} and @code{@@smallformat}
+@findex format
+
+The @code{@@format} command is similar to @code{@@example} except
+that, in the printed manual, @code{@@format} does not select the
+fixed-width font and does not narrow the margins.@refill
+
+@format
+This is an example of text written between an @code{@@format} command
+and an @code{@@end format} command. As you can see
+from this example,
+the @code{@@format} command does not fill the text.
+@end format
+
+@findex smallformat
+Texinfo also provides a command @code{@@smallformat}, which is like
+@code{@@format} but uses a smaller font in @code{@@smallbook} format.
+@xref{small}.
+
+
+
+@node exdent
+@section @code{@@exdent}: Undoing a Line's Indentation
+@cindex Indentation undoing
+@findex exdent
+
+The @code{@@exdent} command removes any indentation a line might have.
+The command is written at the beginning of a line and applies only to
+the text that follows the command that is on the same line. Do not use
+braces around the text. In a printed manual, the text on an
+@code{@@exdent} line is printed in the roman font.@refill
+
+@code{@@exdent} is usually used within examples. Thus,@refill
+
+@example
+@group
+@@example
+This line follows an @@@@example command.
+@@exdent This line is exdented.
+This line follows the exdented line.
+The @@@@end example comes on the next line.
+@@end group
+@end group
+@end example
+
+@noindent
+produces
+
+@example
+@group
+This line follows an @@example command.
+@exdent This line is exdented.
+This line follows the exdented line.
+The @@end example comes on the next line.
+@end group
+@end example
+
+In practice, the @code{@@exdent} command is rarely used.
+Usually, you un-indent text by ending the example and
+returning the page to its normal width.@refill
+
+
+@node flushleft & flushright
+@section @code{@@flushleft} and @code{@@flushright}
+@findex flushleft
+@findex flushright
+@cindex Ragged right
+@cindex Ragged left
+
+The @code{@@flushleft} and @code{@@flushright} commands line up the
+ends of lines on the left and right margins of a page,
+but do not fill the text. The commands are written on lines of their
+own, without braces. The @code{@@flushleft} and @code{@@flushright}
+commands are ended by @code{@@end flushleft} and @code{@@end
+flushright} commands on lines of their own.@refill
+
+@need 1500
+For example,
+
+@example
+@group
+@@flushleft
+This text is
+written flushleft.
+@@end flushleft
+@end group
+@end example
+
+@noindent
+produces
+
+@quotation
+@flushleft
+This text is
+written flushleft.
+@end flushleft
+@end quotation
+
+
+@code{@@flushright} produces the type of indentation often used in the
+return address of letters. For example,
+
+@example
+@group
+@@flushright
+Here is an example of text written
+flushright. The @@code@{@@flushright@} command
+right justifies every line but leaves the
+left end ragged.
+@@end flushright
+@end group
+@end example
+
+@noindent
+produces
+
+@flushright
+Here is an example of text written
+flushright. The @code{@@flushright} command
+right justifies every line but leaves the
+left end ragged.
+@end flushright
+
+
+@node noindent
+@section @code{@@noindent}: Omitting Indentation
+@cindex Omitting indentation
+@cindex Suppressing indentation
+@cindex Indentation, omitting
+@findex noindent
+
+An example or other inclusion can break a paragraph into segments.
+Ordinarily, the formatters indent text that follows an example as a new
+paragraph. You can prevent this on a case-by-case basis by writing
+@code{@@noindent} at the beginning of a line, preceding the continuation
+text. You can also disable indentation for all paragraphs globally with
+@code{@@paragraphindent} (@pxref{paragraphindent, Paragraph Indenting}).
+
+It is best to write @code{@@noindent} on a line by itself, since in most
+environments, spaces following the command will not be ignored. It's ok
+to use it at the beginning of a line, with text following, outside of
+any environment.
+
+@need 1500
+For example:
+
+@example
+@group
+@@example
+This is an example
+@@end example
+
+@@noindent
+This line is not indented. As you can see, the
+beginning of the line is fully flush left with the line
+that follows after it. (This whole example is between
+@@code@{@@@@display@} and @@code@{@@@@end display@}.)
+@end group
+@end example
+
+@noindent produces:
+
+@display
+
+@example
+This is an example
+@end example
+
+@noindent
+This line is not indented. As you can see, the
+beginning of the line is fully flush left with the line
+that follows after it. (This whole example is between
+@code{@@display} and @code{@@end display}.)
+
+@end display
+
+To adjust the number of blank lines properly in the Info file output,
+remember that the line containing @code{@@noindent} does not generate a
+blank line, and neither does the @code{@@end example} line.
+
+In the Texinfo source file for this manual, each line that says
+`produces' is preceded by @code{@@noindent}.
+
+Do not put braces after an @code{@@noindent} command; they are not
+necessary, since @code{@@noindent} is a command used outside of
+paragraphs (@pxref{Command Syntax}).
+
+
+@node indent
+@section @code{@@indent}: Forcing Indentation
+@cindex Forcing indentation
+@cindex Inserting indentation
+@cindex Indentation, forcing
+@findex indent
+
+@indent
+To complement the @code{@@noindent} command (see the previous
+section), Texinfo provides the @code{@@indent} command that forces a
+paragraph to be indented. This paragraph, for instance, is indented
+using an @code{@@indent} command. The first paragraph of a section is
+the most likely place to use @code{@@indent}, to override the normal
+behavior of no indentation there (@pxref{paragraphindent}).
+
+It is best to write @code{@@indent} on a line by itself, since in most
+environments, spaces following the command will not be ignored. The
+@code{@@indent} line will not generate a blank line in the Info output
+within an environment.
+
+However, it is ok to use it at the beginning of a line, with text
+following, outside of any environment.
+
+Do not put braces after an @code{@@indent} command; they are not
+necessary, since @code{@@indent} is a command used outside of
+paragraphs (@pxref{Command Syntax}).
+
+
+@node cartouche
+@section @code{@@cartouche}: Rounded Rectangles Around Examples
+@findex cartouche
+@cindex Box with rounded corners
+@cindex Rounded rectangles, around examples
+
+In a printed manual, the @code{@@cartouche} command draws a box with
+rounded corners around its contents. In HTML, a normal rectangle is
+drawn (that's the best HTML can do). @code{@@cartouche} has no effect
+in Info output.
+
+You can use this command to further highlight an example or quotation.
+For instance, you could write a manual in which one type of example is
+surrounded by a cartouche for emphasis.
+
+For example,
+
+@example
+@@cartouche
+@@example
+% pwd
+/usr/local/share/emacs
+@@end example
+@@end cartouche
+@end example
+
+@noindent
+surrounds the two-line example with a box with rounded corners, in the
+printed manual.
+
+The output from the example looks like this (if you're reading this in
+Info, you'll see the @code{@@cartouche} had no effect):
+
+@cartouche
+@example
+% pwd
+/usr/local/info
+@end example
+@end cartouche
+
+For proper output in HTML, it's necessary to put the
+@code{@@cartouche} around the @code{@@example}, and not the other way
+around. This limitation of @command{makeinfo} may be removed one day.
+
+@code{@@cartouche} also implies @code{@@group} (@pxref{group}).
+
+@node Lists and Tables
+@chapter Lists and Tables
+@cindex Making lists and tables
+@cindex Lists and tables, making
+@cindex Tables and lists, making
+
+Texinfo has several ways of making lists and tables. Lists can be
+bulleted or numbered; two-column tables can highlight the items in
+the first column; multi-column tables are also supported.
+
+@menu
+* Introducing Lists:: Texinfo formats lists for you.
+* itemize:: How to construct a simple list.
+* enumerate:: How to construct a numbered list.
+* Two-column Tables:: How to construct a two-column table.
+* Multi-column Tables:: How to construct generalized tables.
+@end menu
+
+@node Introducing Lists
+@section Introducing Lists
+
+Texinfo automatically indents the text in lists or tables, and numbers
+an enumerated list. This last feature is useful if you modify the
+list, since you do not need to renumber it yourself.@refill
+
+Numbered lists and tables begin with the appropriate @@-command at the
+beginning of a line, and end with the corresponding @code{@@end}
+command on a line by itself. The table and itemized-list commands
+also require that you write formatting information on the same line as
+the beginning @@-command.@refill
+
+Begin an enumerated list, for example, with an @code{@@enumerate}
+command and end the list with an @code{@@end enumerate} command.
+Begin an itemized list with an @code{@@itemize} command, followed on
+the same line by a formatting command such as @code{@@bullet}, and end
+the list with an @code{@@end itemize} command.@refill
+@findex end
+
+Precede each element of a list with an @code{@@item} or @code{@@itemx}
+command.@refill
+
+@sp 1
+@noindent
+Here is an itemized list of the different kinds of table and lists:@refill
+
+@itemize @bullet
+@item
+Itemized lists with and without bullets.
+
+@item
+Enumerated lists, using numbers or letters.
+
+@item
+Two-column tables with highlighting.
+@end itemize
+
+@sp 1
+@noindent
+Here is an enumerated list with the same items:@refill
+
+@enumerate
+@item
+Itemized lists with and without bullets.
+
+@item
+Enumerated lists, using numbers or letters.
+
+@item
+Two-column tables with highlighting.
+@end enumerate
+
+@sp 1
+@noindent
+And here is a two-column table with the same items and their
+@w{@@-commands}:@refill
+
+@table @code
+@item @@itemize
+Itemized lists with and without bullets.
+
+@item @@enumerate
+Enumerated lists, using numbers or letters.
+
+@item @@table
+@itemx @@ftable
+@itemx @@vtable
+Two-column tables, optionally with indexing.
+@end table
+
+
+@node itemize
+@section @code{@@itemize}: Making an Itemized List
+@cindex Itemization
+@findex itemize
+
+The @code{@@itemize} command produces sequences of indented
+paragraphs, with a bullet or other mark inside the left margin
+at the beginning of each paragraph for which such a mark is desired.@refill
+
+@cindex @code{@@w}, for blank items
+Begin an itemized list by writing @code{@@itemize} at the beginning of
+a line. Follow the command, on the same line, with a character or a
+Texinfo command that generates a mark. Usually, you will write
+@code{@@bullet} after @code{@@itemize}, but you can use
+@code{@@minus}, or any command or character that results in a single
+character in the Info file. If you don't want any mark at all, use
+@code{@@w}. (When you write the mark command such as
+@code{@@bullet} after an @code{@@itemize} command, you may omit the
+@samp{@{@}}.) If you don't specify a mark command, the default is
+@code{@@bullet}.
+
+Write the text of the indented paragraphs themselves after the
+@code{@@itemize}, up to another line that says @code{@@end
+itemize}.@refill
+
+@findex item
+At the beginning of each paragraph for which a mark in the margin is
+desired, write a line that starts with @code{@@item}. It is ok to
+have text following the @code{@@item}.
+
+Usually, you should put a blank line before an @code{@@item}. This
+puts a blank line in the Info file. (@TeX{} inserts the proper
+interline whitespace in either case.) Except when the entries are
+very brief, these blank lines make the list look better.@refill
+
+Here is an example of the use of @code{@@itemize}, followed by the
+output it produces. @code{@@bullet} produces an @samp{*} in Info and a
+round dot in @TeX{}.
+
+@example
+@group
+@@itemize @@bullet
+@@item
+Some text for foo.
+
+@@item
+Some text
+for bar.
+@@end itemize
+@end group
+@end example
+
+@noindent
+This produces:
+
+@quotation
+@itemize @bullet
+@item
+Some text for foo.
+
+@item
+Some text
+for bar.
+@end itemize
+@end quotation
+
+Itemized lists may be embedded within other itemized lists. Here is a
+list marked with dashes embedded in a list marked with bullets:@refill
+
+@example
+@group
+@@itemize @@bullet
+@@item
+First item.
+
+@@itemize @@minus
+@@item
+Inner item.
+
+@@item
+Second inner item.
+@@end itemize
+
+@@item
+Second outer item.
+@@end itemize
+@end group
+@end example
+
+@noindent
+This produces:
+
+@quotation
+@itemize @bullet
+@item
+First item.
+
+@itemize @minus
+@item
+Inner item.
+
+@item
+Second inner item.
+@end itemize
+
+@item
+Second outer item.
+@end itemize
+@end quotation
+
+
+@node enumerate
+@section @code{@@enumerate}: Making a Numbered or Lettered List
+@cindex Enumeration
+@findex enumerate
+
+@code{@@enumerate} is like @code{@@itemize} (@pxref{itemize,,
+@code{@@itemize}}), except that the labels on the items are
+successive integers or letters instead of bullets.
+
+Write the @code{@@enumerate} command at the beginning of a line. The
+command does not require an argument, but accepts either a number or a
+letter as an option. Without an argument, @code{@@enumerate} starts the
+list with the number @samp{1}. With a numeric argument, such as
+@samp{3}, the command starts the list with that number. With an upper
+or lower case letter, such as @samp{a} or @samp{A}, the command starts
+the list with that letter.
+
+Write the text of the enumerated list in the same way as an itemized
+list: write a line starting with @code{@@item} at the beginning of
+each paragraph that you want enumerated. It is ok to have text
+following the @code{@@item}.
+
+You should put a blank line between entries in the list.
+This generally makes it easier to read the Info file.
+
+@need 1500
+Here is an example of @code{@@enumerate} without an argument:
+
+@example
+@group
+@@enumerate
+@@item
+Underlying causes.
+
+@@item
+Proximate causes.
+@@end enumerate
+@end group
+@end example
+
+@noindent
+This produces:
+
+@enumerate
+@item
+Underlying causes.
+
+@item
+Proximate causes.
+@end enumerate
+@sp 1
+Here is an example with an argument of @kbd{3}:@refill
+@sp 1
+@example
+@group
+@@enumerate 3
+@@item
+Predisposing causes.
+
+@@item
+Precipitating causes.
+
+@@item
+Perpetuating causes.
+@@end enumerate
+@end group
+@end example
+
+@noindent
+This produces:
+
+@enumerate 3
+@item
+Predisposing causes.
+
+@item
+Precipitating causes.
+
+@item
+Perpetuating causes.
+@end enumerate
+@sp 1
+Here is a brief summary of the alternatives. The summary is constructed
+using @code{@@enumerate} with an argument of @kbd{a}.@refill
+@sp 1
+@enumerate a
+@item
+@code{@@enumerate}
+
+Without an argument, produce a numbered list, starting with the number
+1.@refill
+
+@item
+@code{@@enumerate @var{positive-integer}}
+
+With a (positive) numeric argument, start a numbered list with that
+number. You can use this to continue a list that you interrupted with
+other text.@refill
+
+@item
+@code{@@enumerate @var{upper-case-letter}}
+
+With an upper case letter as argument, start a list
+in which each item is marked
+by a letter, beginning with that upper case letter.@refill
+
+@item
+@code{@@enumerate @var{lower-case-letter}}
+
+With a lower case letter as argument, start a list
+in which each item is marked by
+a letter, beginning with that lower case letter.@refill
+@end enumerate
+
+You can also nest enumerated lists, as in an outline.@refill
+
+@node Two-column Tables
+@section Making a Two-column Table
+@cindex Tables, making two-column
+@findex table
+
+@code{@@table} is similar to @code{@@itemize} (@pxref{itemize,,
+@code{@@itemize}}), but allows you to specify a name or heading line for
+each item. The @code{@@table} command is used to produce two-column
+tables, and is especially useful for glossaries, explanatory
+exhibits, and command-line option summaries.
+
+@menu
+* table:: How to construct a two-column table.
+* ftable vtable:: Automatic indexing for two-column tables.
+* itemx:: How to put more entries in the first column.
+@end menu
+
+@node table
+@subsection Using the @code{@@table} Command
+
+@cindex Definition lists, typesetting
+Use the @code{@@table} command to produce two-column tables. It is
+usually listed for ``definition lists'' of various sorts, where you
+have a list of terms and a brief text with each one.
+
+Write the @code{@@table} command at the beginning of a line, after a
+blank line, and follow it on the same line with an argument that is a
+Texinfo ``indicating'' command such as @code{@@code}, @code{@@samp},
+@code{@@var}, @code{@@option}, or @code{@@kbd} (@pxref{Indicating}).
+
+This command will be applied to the text that goes into the first
+column of each item and thus determines how it will be highlighted.
+For example, @code{@@table @@code} will cause the text in the first
+column to be output as if it @code{@@code} command.
+
+@findex asis
+You may also use the @code{@@asis} command as an argument to
+@code{@@table}. @code{@@asis} is a command that does nothing; if you
+use this command after @code{@@table}, the first column entries are
+output without added highlighting (``as is'').
+
+The @code{@@table} command works with other commands besides those
+explicitly mentioned here. However, you can only use commands that
+normally take arguments in braces. (In this case, however, you use
+the command name without an argument, because the subsequent
+@code{@@item}'s will supply the argument.)
+
+@findex item
+Begin each table entry with an @code{@@item} command at the beginning
+of a line. Write the first column text on the same line as the
+@code{@@item} command. Write the second column text on the line
+following the @code{@@item} line and on subsequent lines. (You do not
+need to type anything for an empty second column entry.) You may
+write as many lines of supporting text as you wish, even several
+paragraphs. But only the text on the same line as the @code{@@item}
+will be placed in the first column (including any footnotes).
+
+Normally, you should put a blank line before an @code{@@item} line.
+This puts a blank line in the Info file. Except when the entries are
+very brief, a blank line looks better.
+
+End the table with a line consisting of @code{@@end table}, followed
+by a blank line. @TeX{} will always start a new paragraph after the
+table, so the blank line is needed for the Info output to be analogous.
+
+@need 1500
+The following table, for example, highlights the text in the first
+column with an @code{@@samp} command:
+
+@example
+@group
+@@table @@samp
+@@item foo
+This is the text for
+@@samp@{foo@}.
+
+@@item bar
+Text for @@samp@{bar@}.
+@@end table
+@end group
+@end example
+
+@noindent
+This produces:
+
+@table @samp
+@item foo
+This is the text for
+@samp{foo}.
+@item bar
+Text for @samp{bar}.
+@end table
+
+If you want to list two or more named items with a single block of
+text, use the @code{@@itemx} command. (@xref{itemx,,@code{@@itemx}}.)
+
+
+@node ftable vtable
+@subsection @code{@@ftable} and @code{@@vtable}
+@cindex Tables with indexes
+@cindex Indexing table entries automatically
+@findex ftable
+@findex vtable
+
+The @code{@@ftable} and @code{@@vtable} commands are the same as the
+@code{@@table} command except that @code{@@ftable} automatically enters
+each of the items in the first column of the table into the index of
+functions and @code{@@vtable} automatically enters each of the items in
+the first column of the table into the index of variables. This
+simplifies the task of creating indices. Only the items on the same
+line as the @code{@@item} commands are indexed, and they are indexed in
+exactly the form that they appear on that line. @xref{Indices},
+for more information about indices.@refill
+
+Begin a two-column table using @code{@@ftable} or @code{@@vtable} by
+writing the @@-command at the beginning of a line, followed on the same
+line by an argument that is a Texinfo command such as @code{@@code},
+exactly as you would for an @code{@@table} command; and end the table
+with an @code{@@end ftable} or @code{@@end vtable} command on a line by
+itself.
+
+See the example for @code{@@table} in the previous section.
+
+@node itemx
+@subsection @code{@@itemx}
+@cindex Two named items for @code{@@table}
+@findex itemx
+
+Use the @code{@@itemx} command inside a table when you have two or more
+first column entries for the same item, each of which should appear on a
+line of its own.
+
+Use @code{@@item} for the first entry, and @code{@@itemx} for all
+subsequent entries; @code{@@itemx} must always follow an @code{@@item}
+command, with no blank line intervening.
+
+The @code{@@itemx} command works exactly like @code{@@item} except
+that it does not generate extra vertical space above the first column
+text. If you have multiple consecutive @code{@@itemx} commands, do
+not insert any blank lines between them.
+
+For example,
+
+@example
+@group
+@@table @@code
+@@item upcase
+@@itemx downcase
+These two functions accept a character or a string as
+argument, and return the corresponding upper case (lower
+case) character or string.
+@@end table
+@end group
+@end example
+
+@noindent
+This produces:
+
+@table @code
+@item upcase
+@itemx downcase
+These two functions accept a character or a string as
+argument, and return the corresponding upper case (lower
+case) character or string.@refill
+@end table
+
+@noindent
+(Note also that this example illustrates multi-line supporting text in
+a two-column table.)@refill
+
+
+@node Multi-column Tables
+@section @code{@@multitable}: Multi-column Tables
+@cindex Tables, making multi-column
+@findex multitable
+
+@code{@@multitable} allows you to construct tables with any number of
+columns, with each column having any width you like.
+
+You define the column widths on the @code{@@multitable} line itself, and
+write each row of the actual table following an @code{@@item} command,
+with columns separated by an @code{@@tab} command. Finally, @code{@@end
+multitable} completes the table. Details in the sections below.
+
+@menu
+* Multitable Column Widths:: Defining multitable column widths.
+* Multitable Rows:: Defining multitable rows, with examples.
+@end menu
+
+@node Multitable Column Widths
+@subsection Multitable Column Widths
+@cindex Multitable column widths
+@cindex Column widths, defining for multitables
+@cindex Widths, defining multitable column
+
+You can define the column widths for a multitable in two ways: as
+fractions of the line length; or with a prototype row. Mixing the two
+methods is not supported. In either case, the widths are defined
+entirely on the same line as the @code{@@multitable} command.
+
+@enumerate
+@item
+@findex columnfractions
+@cindex Line length, column widths as fraction of
+To specify column widths as fractions of the line length, write
+@code{@@columnfractions} and the decimal numbers (presumably less than
+1; a leading zero is allowed and ignored) after the
+@code{@@multitable} command, as in:
+
+@example
+@@multitable @@columnfractions .33 .33 .33
+@end example
+
+The fractions need not add up exactly to 1.0, as these do not. This
+allows you to produce tables that do not need the full line length.
+
+@item
+@cindex Prototype row, column widths defined by
+To specify a prototype row, write the longest entry for each column
+enclosed in braces after the @code{@@multitable} command. For example:
+
+@example
+@@multitable @{some text for column one@} @{for column two@}
+@end example
+
+@noindent
+The first column will then have the width of the typeset `some text for
+column one', and the second column the width of `for column two'.
+
+The prototype entries need not appear in the table itself.
+
+Although we used simple text in this example, the prototype entries can
+contain Texinfo commands; markup commands such as @code{@@code} are
+particularly likely to be useful.
+
+@end enumerate
+
+
+@node Multitable Rows
+@subsection Multitable Rows
+@cindex Multitable rows
+@cindex Rows, of a multitable
+
+@findex item
+@findex tab
+After the @code{@@multitable} command defining the column widths (see
+the previous section), you begin each row in the body of a multitable
+with @code{@@item}, and separate the column entries with @code{@@tab}.
+Line breaks are not special within the table body, and you may break
+input lines in your source file as necessary.
+
+@findex headitem
+@cindex Heading row, in table
+@cindex <thead> HTML tag
+You can also use @code{@@headitem} instead of @code{@@item} to produce
+a @dfn{heading row}. The @TeX{} output for such a row is in bold, and
+the HTML, XML, and Docbook output uses the @code{<thead>} tag.
+
+Here is a complete example of a multi-column table (the text is from
+@cite{The GNU Emacs Manual}, @pxref{Split Window,, Splitting Windows,
+emacs, The GNU Emacs Manual}):
+
+@example
+@@multitable @@columnfractions .15 .45 .4
+@@headitem Key @@tab Command @@tab Description
+@@item C-x 2
+@@tab @@code@{split-window-vertically@}
+@@tab Split the selected window into two windows,
+with one above the other.
+@@item C-x 3
+@@tab @@code@{split-window-horizontally@}
+@@tab Split the selected window into two windows
+positioned side by side.
+@@item C-Mouse-2
+@@tab
+@@tab In the mode line or scroll bar of a window,
+split that window.
+@@end multitable
+@end example
+
+@noindent produces:
+
+@multitable @columnfractions .15 .45 .4
+@headitem Key @tab Command @tab Description
+@item C-x 2
+@tab @code{split-window-vertically}
+@tab Split the selected window into two windows,
+with one above the other.
+@item C-x 3
+@tab @code{split-window-horizontally}
+@tab Split the selected window into two windows
+positioned side by side.
+@item C-Mouse-2
+@tab
+@tab In the mode line or scroll bar of a window,
+split that window.
+@end multitable
+
+
+@node Special Displays
+@chapter Special Displays
+@cindex Special displays
+
+The commands in this chapter allow you to write text that is specially
+displayed (output format permitting), outside of the normal document
+flow.
+
+One set of such commands is for creating ``floats'', that is, figures,
+tables, and the like, set off from the main text, possibly numbered,
+captioned, and/or referred to from elsewhere in the document. Images
+are often included in these displays.
+
+Another group of commands is for creating footnotes in Texinfo.
+
+@menu
+* Floats:: Figures, tables, and the like.
+* Images:: Including graphics and images.
+* Footnotes:: Writing footnotes.
+@end menu
+
+
+@node Floats
+@section Floats
+@cindex Floats, in general
+
+A @dfn{float} is a display which is set off from the main text. It is
+typically labelled as being a ``Figure'', ``Table'', ``Example'', or
+some similar type.
+
+@cindex Floating, not yet implemented
+A float is so-named because, in principle, it can be moved to the
+bottom or top of the current page, or to a following page, in the
+printed output. (Floating does not make sense in other output
+formats.) In the present version of Texinfo, however, this floating
+is unfortunately not yet implemented. Instead, the floating material
+is simply output at the current location, more or less as if it were
+an @code{@@group} (@pxref{group,,@code{@@group}}).
+
+@menu
+* float:: Producing floating material.
+* caption shortcaption:: Specifying descriptions for floats.
+* listoffloats:: A table of contents for floats.
+@end menu
+
+
+@node float
+@subsection @code{@@float} [@var{type}][,@var{label}]: Floating material
+@findex float
+@cindex Float environment
+
+To produce floating material, enclose the material you want to be
+displayed separate between @code{@@float} and @code{@@end float}
+commands, on lines by themselves.
+
+Floating material uses @code{@@image} to display an already-existing
+graphic (@pxref{Images}), or @code{@@multitable} to display a table
+(@pxref{Multi-column Tables}). However, the contents of the float can
+be anything. Here's an example with simple text:
+
+@example
+@@float Figure,fig:ex1
+This is an example float.
+@@end float
+@end example
+
+@noindent And the output:
+
+@float Figure,fig:ex1
+This is an example float.
+@end float
+
+As shown in the example, @code{@@float} takes two arguments (separated
+by a comma), @var{type} and @var{label}. Both are optional.
+
+@table @var
+@item type
+Specifies the sort of float this is; typically a word such as
+``Figure'', ``Table'', etc. If not given, and @var{label} is, any
+cross-referencing will simply use a bare number.
+
+@item label
+Specifies a cross-reference label for this float. If given, this
+float is automatically given a number, and will appear in any
+@code{@@listofloats} output (@pxref{listoffloats}). Cross-references
+to @var{label} are allowed.
+
+@cindex Floats, making unnumbered
+@cindex Unnumbered float, creating
+On the other hand, if @var{label} is not given, then the float will
+not be numbered and consequently will not appear in the
+@code{@@listoffloats} output or be cross-referenceable.
+@end table
+
+@noindent Normally, you specify both @var{type} and @var{label}, to get a
+labeled and numbered float.
+
+@cindex Floats, numbering of
+@cindex Numbering of floats
+In Texinfo, all floats are numbered the same way: with the chapter
+number (or appendix letter), a period, and the float number, which
+simply counts 1, 2, 3, @dots{}, and is reset at each chapter. Each
+float type is counted independently.
+
+Floats within an @code{@@unnumbered} are numbered, or outside of any
+chapter, are simply numbered consecutively from 1.
+
+These numbering conventions are not, at present, changeable.
+
+
+@node caption shortcaption
+@subsection @code{@@caption} & @code{@@shortcaption}
+@findex caption
+@findex shortcaption
+@cindex Captions, for floats
+@cindex Short captions, for lists of floats
+
+You may write an @code{@@caption} anywhere within a @code{@@float}
+environment, to define a caption for the float. It is not allowed in
+any other context. @code{@@caption} takes a single argument, enclosed
+in braces. Here's an example:
+
+@example
+@@float
+An example float, with caption.
+@@caption@{Caption for example float.@}
+@@end float
+@end example
+
+@noindent The output is:
+
+@float
+An example float, with caption.
+@caption{Caption for example float.}
+@end float
+
+@code{@@caption} can appear anywhere within the float; it is not
+processed until the @code{@@end float}. The caption text is usually a
+sentence or two, but may consist of several paragraphs if necessary.
+
+In the output, the caption always appears below the float; this is not
+currently changeable. It is preceded by the float type and/or number,
+as specified to the @code{@@float} command (see the previous section).
+
+The @code{@@shortcaption} command likewise may be used only within
+@code{@@float}, and takes a single argument in braces. The short
+caption text is used instead of the caption text in a list of floats
+(see the next section). Thus, you can write a long caption for the
+main document, and a short title to appear in the list of floats. For
+example:
+
+@example
+@@float
+... as above ...
+@@shortcaption@{Text for list of floats.@}
+@@end float
+@end example
+
+The text for @code{@@caption} and @code{@@shortcaption} may not
+contain comments (@code{@@c}), verbatim text (@code{@@verb}),
+environments such as @code{@@example}, or other complex constructs.
+
+
+@node listoffloats
+@subsection @code{@@listoffloats}: Tables of contents for floats
+@findex listoffloats
+@cindex List of floats
+@cindex Floats, list of
+@cindex Table of contents, for floats
+
+You can write a @code{@@listoffloats} command to generate a list of
+floats for a given float type (@pxref{float}), analogous to the
+document's overall table of contents. Typically, it is written in its
+own @code{@@unnumbered} node to provide a heading and structure,
+rather like @code{@@printindex} (@pxref{Printing Indices & Menus}).
+
+@code{@@listoffloats} takes one optional argument, the float type.
+Here's an example:
+
+@example
+@@node List of Figures
+@@unnumbered List of Figures
+@@listoffloats Figure
+@end example
+
+@noindent And the output from @code{@@listoffloats}:
+
+@display
+@listoffloats Figure
+@end display
+
+Without any argument, @code{@@listoffloats} generates a list of
+floats for which no float type was specified, i.e., no first argument
+to the @code{@@float} command (@pxref{float}).
+
+Each line in the list of floats contains the float type (if any),
+the float number, and the caption, if any---the @code{@@shortcaption}
+argument, if it was specified, else the @code{@@caption} argument.
+In Info, the result is a menu where each float can be selected. In
+HTML, each line is a link to the float. In printed output, the page
+number is included.
+
+Unnumbered floats (those without cross-reference labels) are omitted
+from the list of floats.
+
+
+@node Images
+@section Inserting Images
+
+@cindex Images, inserting
+@cindex Pictures, inserting
+@findex image
+
+You can insert an image given in an external file with the
+@code{@@image} command. Although images can be used anywhere,
+including the middle of a paragraph, we describe them in this chapter
+since they are most often part of a displayed figure or example.
+
+@menu
+* Image Syntax::
+* Image Scaling::
+@end menu
+
+
+@node Image Syntax
+@subsection Image Syntax
+
+Here is the basic synopsis of the @code{@@image} command:
+
+@example
+@@image@{@var{filename}@r{[,} @var{width}@r{[,} @var{height}@r{[,} @var{alttext}@r{[, }@var{extension}@r{]]]]}@}
+@end example
+
+@cindex Formats for images
+@cindex Image formats
+The @var{filename} argument is mandatory, and must not have an
+extension, because the different processors support different formats:
+
+@itemize @bullet
+@item
+@TeX{} reads the file @file{@var{filename}.eps} (Encapsulated PostScript
+format).
+@item
+@pindex pdftex@r{, and images}
+PDF@TeX{} reads @file{@var{filename}.pdf} (Adobe's Portable Document Format).
+@item
+@code{makeinfo} includes @file{@var{filename}.txt} verbatim for
+Info output (more or less as if it was an @code{@@example}).
+@item
+@code{makeinfo} uses the optional fifth argument @var{extension} to
+@code{@@image} for the filename extension, if it is specified. For example:
+
+@pindex XPM image format
+@example
+@@image@{foo,,,,.xpm@}
+@end example
+
+@noindent
+will cause @code{makeinfo} to look for @file{foo.xpm} before any others.
+
+@end itemize
+
+The @var{width} and @var{height} arguments are described in the next
+section.
+
+For @TeX{} output, if an image is the first thing in a paragraph, for
+example if you want two images side-by-side, you must precede it with
+@code{@@noindent} (@pxref{noindent,,@code{@@noindent}}). Otherwise it
+will be displayed on a line by itself. If you want it centered,
+use @code{@@center} (@pxref{titlefont center sp,,@code{@@titlefont
+@@center @@sp}}).
+
+@cindex Alt attribute for images
+@cindex Images, alternate text for
+When producing html, @code{makeinfo} sets the @dfn{alt attribute} for
+inline images to the optional @var{alttext} (fourth) argument to
+@code{@@image}, if supplied. If not supplied, @code{makeinfo} uses
+the full file name of the image being displayed. If you want an empty
+@code{alt} string, use @code{@@-}. The @var{alttext} is taken as
+Texinfo text, so special characters such as @samp{"} and @samp{<} and
+@samp{&} are escaped in the HTML and XML output.
+
+@cindex GIF images, unsupported due to patents
+@cindex PNG image format
+@cindex JPG image format
+If you do not supply the optional @var{extension} (fifth) argument,
+@code{makeinfo} first tries @file{@var{filename}.png}; if that does
+not exist, it tries @file{@var{filename}.jpg}. If that does not exist
+either, it complains. (We cannot support GIF format directly due to
+software patents.)
+
+In Info output, @code{makeinfo} writes a reference to the binary image
+file (trying @var{filename} suffixed with @file{@var{extension}},
+@file{@var{.extension}}, @file{.png}, or @file{.jpg}, in that order)
+if one exists. It also literally includes the @file{.txt} file if one
+exists. This way, Info readers which can display images (such as the
+Emacs Info browser, running under X) can do so, whereas Info readers
+which can only use text (such as the standalone Info reader) can
+display the textual version.
+
+The implementation of this is to put the following construct into the
+Info output:
+
+@example
+^@@^H[image src="@var{binaryfile}" text="@var{txtfile}"
+ alt="@var{alttext} ... ^@@^H]
+@end example
+
+@noindent where @samp{^@@} and @samp{^H} stand for the actual null and
+backspace control characters. If one of the files is not present, the
+corresponding argument is omitted.
+
+The reason for mentioning this here is that older Info browsers (this
+feature was introduced in Texinfo version 4.6) will display the above
+literally, which, although not pretty, should not be harmful.
+
+
+@node Image Scaling
+@subsection Image Scaling
+
+@cindex Images, scaling
+@cindex Scaling images
+@cindex Width of images
+@cindex Height of images
+@cindex Aspect ratio of images
+@cindex Distorting images
+The optional @var{width} and @var{height} arguments to the
+@code{@@image} command (see the previous section) specify the size to
+scale the image to. They are ignored for Info output. If neither is
+specified, the image is presented in its natural size (given in the
+file); if only one is specified, the other is scaled proportionately;
+and if both are specified, both are respected, thus possibly distorting
+the original image by changing its aspect ratio.
+
+@cindex Dimensions and image sizes
+The @var{width} and @var{height} may be specified using any valid @TeX{}
+dimension, namely:
+
+@table @asis
+@item pt
+@cindex Points (dimension)
+point (72.27pt = 1in)
+@item pc
+@cindex Picas
+pica (1pc = 12pt)
+@item bp
+@cindex Big points
+big point (72bp = 1in)
+@item in
+@cindex Inches
+inch
+@item cm
+@cindex Centimeters
+centimeter (2.54cm = 1in)
+@item mm
+@cindex Millimeters
+millimeter (10mm = 1cm)
+@item dd
+@cindex Did@^ot points
+did@^ot point (1157dd = 1238pt)
+@item cc
+@cindex Ciceros
+cicero (1cc = 12dd)
+@item sp
+@cindex Scaled points
+scaled point (65536sp = 1pt)
+@end table
+
+@pindex ridt.eps
+For example, the following will scale a file @file{ridt.eps} to one
+inch vertically, with the width scaled proportionately:
+
+@example
+@@image@{ridt,,1in@}
+@end example
+
+@pindex epsf.tex
+For @code{@@image} to work with @TeX{}, the file @file{epsf.tex} must be
+installed somewhere that @TeX{} can find it. (The standard location is
+@file{@var{texmf}/tex/generic/dvips/epsf.tex}, where @var{texmf} is a
+root of your @TeX{} directory tree.) This file is included in the
+Texinfo distribution and is also available from
+@uref{ftp://tug.org/tex/epsf.tex}, among other places.
+
+@code{@@image} can be used within a line as well as for displayed
+figures. Therefore, if you intend it to be displayed, be sure to leave
+a blank line before the command, or the output will run into the
+preceding text.
+
+Image scaling is presently implemented only in @TeX{}, not in HTML or
+any other sort of output.
+
+
+@node Footnotes
+@section Footnotes
+@cindex Footnotes
+@findex footnote
+
+A @dfn{footnote} is for a reference that documents or elucidates the
+primary text.@footnote{A footnote should complement or expand upon
+the primary text, but a reader should not need to read a footnote to
+understand the primary text. For a thorough discussion of footnotes,
+see @cite{The Chicago Manual of Style}, which is published by the
+University of Chicago Press.} Footnotes are distracting; use them
+sparingly, if at all. Standard bibliographical references are better
+placed in a bibliography at the end of a document than in footnotes
+throughout.
+
+@menu
+* Footnote Commands:: How to write a footnote in Texinfo.
+* Footnote Styles:: Controlling how footnotes appear in Info.
+@end menu
+
+
+@node Footnote Commands
+@subsection Footnote Commands
+
+In Texinfo, footnotes are created with the @code{@@footnote} command.
+This command is followed immediately by a left brace, then by the text
+of the footnote, and then by a terminating right brace. Footnotes may
+be of any length (they will be broken across pages if necessary), but
+are usually short. The template is:
+
+@example
+ordinary text@@footnote@{@var{text of footnote}@}
+@end example
+
+As shown here, the @code{@@footnote} command should come right after the
+text being footnoted, with no intervening space; otherwise, the footnote
+marker might end up starting a line.
+
+For example, this clause is followed by a sample footnote@footnote{Here
+is the sample footnote.}; in the Texinfo source, it looks like
+this:
+
+@example
+@dots{}a sample footnote@@footnote@{Here is the sample
+footnote.@}; in the Texinfo source@dots{}
+@end example
+
+As you can see, the source includes two punctuation marks next to each
+other; in this case, @samp{.@};} is the sequence. This is normal (the
+first ends the footnote and the second belongs to the sentence being
+footnoted), so don't worry that it looks odd.
+
+In a printed manual or book, the reference mark for a footnote is a
+small, superscripted number; the text of the footnote appears at the
+bottom of the page, below a horizontal line.
+
+In Info, the reference mark for a footnote is a pair of parentheses
+with the footnote number between them, like this: @samp{(1)}. The
+reference mark is followed by a cross-reference link to the footnote's
+text.
+
+In the HTML output, footnote references are marked with a small,
+superscripted number which is rendered as a hypertext link to the
+footnote text.
+
+By the way, footnotes in the argument of an @code{@@item} command for a
+@code{@@table} must be on the same line as the @code{@@item}
+(as usual). @xref{Two-column Tables}.
+
+
+@node Footnote Styles
+@subsection Footnote Styles
+
+Info has two footnote styles, which determine where the text of the
+footnote is located:
+
+@itemize @bullet
+@cindex @samp{@r{End}} node footnote style
+@item
+In the `End' node style, all the footnotes for a single node
+are placed at the end of that node. The footnotes are separated from
+the rest of the node by a line of dashes with the word
+@samp{Footnotes} within it. Each footnote begins with an
+@samp{(@var{n})} reference mark.
+
+@need 700
+@noindent
+Here is an example of a single footnote in the end of node style:@refill
+
+@example
+@group
+--------- Footnotes ---------
+
+(1) Here is a sample footnote.
+@end group
+@end example
+
+@cindex @samp{@r{Separate}} footnote style
+@item
+In the `Separate' node style, all the footnotes for a single
+node are placed in an automatically constructed node of
+their own. In this style, a ``footnote reference'' follows
+each @samp{(@var{n})} reference mark in the body of the
+node. The footnote reference is actually a cross reference
+which you use to reach the footnote node.
+
+The name of the node with the footnotes is constructed
+by appending @w{@samp{-Footnotes}} to the name of the node
+that contains the footnotes. (Consequently, the footnotes'
+node for the @file{Footnotes} node is
+@w{@file{Footnotes-Footnotes}}!) The footnotes' node has an
+`Up' node pointer that leads back to its parent node.
+
+@noindent
+Here is how the first footnote in this manual looks after being
+formatted for Info in the separate node style:
+
+@smallexample
+@group
+File: texinfo.info Node: Overview-Footnotes, Up: Overview
+
+(1) The first syllable of "Texinfo" is pronounced like "speck", not
+"hex". @dots{}
+@end group
+@end smallexample
+@end itemize
+
+Unless your document has long and important footnotes (as in, say,
+Gibbon's @cite{Decline and Fall @dots{}}), we recommend the @samp{end}
+style, as it is simpler for readers to follow.
+
+@findex footnotestyle
+Use the @code{@@footnotestyle} command to specify an Info file's
+footnote style. Write this command at the beginning of a line followed
+by an argument, either @samp{end} for the end node style or
+@samp{separate} for the separate node style.
+
+@need 700
+For example,
+
+@example
+@@footnotestyle end
+@end example
+@noindent
+or
+@example
+@@footnotestyle separate
+@end example
+
+Write an @code{@@footnotestyle} command before or shortly after the
+end-of-header line at the beginning of a Texinfo file. (If you
+include the @code{@@footnotestyle} command between the start-of-header
+and end-of-header lines, the region formatting commands will format
+footnotes as specified.)@refill
+
+If you do not specify a footnote style, the formatting commands use
+their default style. Currently, @code{texinfo-format-buffer} and
+@code{texinfo-format-region} use the `separate' style and
+@code{makeinfo} uses the `end' style.
+
+
+@node Indices
+@chapter Indices
+@cindex Indices
+
+Using Texinfo, you can generate indices without having to sort and
+collate entries manually. In an index, the entries are listed in
+alphabetical order, together with information on how to find the
+discussion of each entry. In a printed manual, this information
+consists of page numbers. In an Info file, this information is a menu
+entry leading to the first node referenced.
+
+Texinfo provides several predefined kinds of index: an index
+for functions, an index for variables, an index for concepts, and so
+on. You can combine indices or use them for other than their
+canonical purpose. Lastly, you can define your own new indices.
+
+@xref{Printing Indices & Menus}, for information on how to print
+indices.
+
+@menu
+* Index Entries:: Choose different words for index entries.
+* Predefined Indices:: Use different indices for different kinds
+ of entries.
+* Indexing Commands:: How to make an index entry.
+* Combining Indices:: How to combine indices.
+* New Indices:: How to define your own indices.
+@end menu
+
+
+@node Index Entries
+@section Making Index Entries
+@cindex Index entries, making
+@cindex Entries, making index
+
+When you are making index entries, it is good practice to think of the
+different ways people may look for something. Different people
+@emph{do not} think of the same words when they look something up. A
+helpful index will have items indexed under all the different words
+that people may use. For example, one reader may think it obvious that
+the two-letter names for indices should be listed under ``Indices,
+two-letter names'', since the word ``Index'' is the general concept.
+But another reader may remember the specific concept of two-letter
+names and search for the entry listed as ``Two letter names for
+indices''. A good index will have both entries and will help both
+readers.@refill
+
+Like typesetting, the construction of an index is a highly skilled,
+professional art, the subtleties of which are not appreciated until you
+need to do it yourself.@refill
+
+@xref{Printing Indices & Menus}, for information about printing an index
+at the end of a book or creating an index menu in an Info file.@refill
+
+
+@node Predefined Indices
+@section Predefined Indices
+
+Texinfo provides six predefined indices. Here are their nominal
+meanings, abbreviations, and the corresponding index entry commands:
+
+@table @samp
+@item cp
+@cindex @code{cp} (concept) index
+(@code{@@cindex}) concept index, for general concepts.
+@item fn
+@cindex @code{fn} (function) index
+(@code{@@findex}) function index, for function and function-like
+names (such as entry points of libraries).
+@item ky
+@cindex @code{ky} (keystroke) index
+(@code{@@kindex}) keystroke index, for keyboard commands.
+@item pg
+@cindex @code{pg} (program) index
+(@code{@@pindex}) program index, for names of programs.
+@item tp
+@cindex @code{tp} (data type) index
+(@code{@@tindex}) data type index, for type names (such as structures
+defined in header files).
+@item vr
+@cindex @code{vr} (variable) index
+(@code{@@vindex}) variable index, for variable names (such as global
+variables of libraries).
+@end table
+
+@noindent
+Not every manual needs all of these, and most manuals use only two or
+three at most. The present manual, for example, has two indices: a
+concept index and an @@-command index (that is actually the function
+index but is called a command index in the chapter heading).
+
+You are not required to use the predefined indices strictly for their
+canonical purposes. For example, suppose you wish to index some C
+preprocessor macros. You could put them in the function index along
+with actual functions, just by writing @code{@@findex} commands for
+them; then, when you print the ``Function Index'' as an unnumbered
+chapter, you could give it the title `Function and Macro Index' and
+all will be consistent for the reader.
+
+On the other hand, it is best not to stray too far from the meaning of
+the predefined indices. Otherwise, in the event that your text is
+combined with other text from other manuals, the index entries will
+not match up. Instead, define your own new index (@pxref{New
+Indices}).
+
+We recommend having a single index in the final document whenever
+possible, however many source indices you use, since then readers have
+only one place to look. Two or more source indices can be combined
+into one output index using the @code{@@synindex} or
+@code{@@syncodeindex} commands (@pxref{Combining Indices}).
+
+
+@node Indexing Commands
+@section Defining the Entries of an Index
+@cindex Defining indexing entries
+@cindex Index entries
+@cindex Entries for an index
+@cindex Specifying index entries
+@cindex Creating index entries
+
+The data to make an index come from many individual indexing commands
+scattered throughout the Texinfo source file. Each command says to add
+one entry to a particular index; after formatting, the index will give
+the current page number or node name as the reference.@refill
+
+An index entry consists of an indexing command at the beginning of a
+line followed, on the rest of the line, by the entry.@refill
+
+For example, this section begins with the following five entries for
+the concept index:@refill
+
+@example
+@@cindex Defining indexing entries
+@@cindex Index entries, defining
+@@cindex Entries for an index
+@@cindex Specifying index entries
+@@cindex Creating index entries
+@end example
+
+Each predefined index has its own indexing command---@code{@@cindex}
+for the concept index, @code{@@findex} for the function index, and so
+on, as listed in the previous section.
+
+@cindex Writing index entries
+@cindex Index entry writing
+Concept index entries consist of text. The best way to write an index
+is to choose entries that are terse yet clear. If you can do this,
+the index often looks better if the entries are not capitalized, but
+written just as they would appear in the middle of a sentence.
+(Capitalize proper names and acronyms that always call for upper case
+letters.) This is the case convention we use in most GNU manuals'
+indices.
+
+If you don't see how to make an entry terse yet clear, make it longer
+and clear---not terse and confusing. If many of the entries are several
+words long, the index may look better if you use a different convention:
+to capitalize the first word of each entry. But do not capitalize a
+case-sensitive name such as a C or Lisp function name or a shell
+command; that would be a spelling error.
+
+Whichever case convention you use, please use it consistently!
+
+Entries in indices other than the concept index are symbol names in
+programming languages, or program names; these names are usually
+case-sensitive, so use upper and lower case as required for them.
+
+@cindex Index font types
+By default, entries for a concept index are printed in a small roman
+font and entries for the other indices are printed in a small
+@code{@@code} font. You may change the way part of an entry is
+printed with the usual Texinfo commands, such as @code{@@file} for
+file names (@pxref{Marking Text}), and @code{@@r} for the normal roman
+font (@pxref{Fonts}).
+
+@quotation Caution
+Do not use a colon in an index entry. In Info, a colon separates the
+menu entry name from the node name, so a colon in the entry itself
+confuses Info. @xref{Menu Parts}, for more information about the
+structure of a menu entry.
+@end quotation
+
+
+@node Combining Indices
+@section Combining Indices
+@cindex Combining indices
+@cindex Indices, combining them
+
+Sometimes you will want to combine two disparate indices such as
+functions and concepts, perhaps because you have few enough entries
+that a separate index would look silly.
+
+You could put functions into the concept index by writing
+@code{@@cindex} commands for them instead of @code{@@findex} commands,
+and produce a consistent manual by printing the concept index with the
+title `Function and Concept Index' and not printing the `Function
+Index' at all; but this is not a robust procedure. It works only if
+your document is never included as part of another document that is
+designed to have a separate function index; if your document were to
+be included with such a document, the functions from your document and
+those from the other would not end up together. Also, to make your
+function names appear in the right font in the concept index, you
+would need to enclose every one of them between the braces of
+@code{@@code}.
+
+@menu
+* syncodeindex:: How to merge two indices, using @code{@@code}
+ font for the merged-from index.
+* synindex:: How to merge two indices, using the
+ default font of the merged-to index.
+@end menu
+
+@node syncodeindex
+@subsection @code{@@syncodeindex}
+@findex syncodeindex
+
+When you want to combine functions and concepts into one index, you
+should index the functions with @code{@@findex} and index the concepts
+with @code{@@cindex}, and use the @code{@@syncodeindex} command to
+redirect the function index entries into the concept index.@refill
+
+The @code{@@syncodeindex} command takes two arguments; they are the name
+of the index to redirect, and the name of the index to redirect it to.
+The template looks like this:@refill
+
+@example
+@@syncodeindex @var{from} @var{to}
+@end example
+
+@cindex Predefined names for indices
+@cindex Two letter names for indices
+@cindex Indices, two letter names
+@cindex Names for indices
+For this purpose, the indices are given two-letter names:@refill
+
+@table @samp
+@item cp
+concept index
+@item fn
+function index
+@item vr
+variable index
+@item ky
+key index
+@item pg
+program index
+@item tp
+data type index
+@end table
+
+Write an @code{@@syncodeindex} command before or shortly after the
+end-of-header line at the beginning of a Texinfo file. For example,
+to merge a function index with a concept index, write the
+following:@refill
+
+@example
+@@syncodeindex fn cp
+@end example
+
+@noindent
+This will cause all entries designated for the function index to merge
+in with the concept index instead.@refill
+
+To merge both a variables index and a function index into a concept
+index, write the following:@refill
+
+@example
+@group
+@@syncodeindex vr cp
+@@syncodeindex fn cp
+@end group
+@end example
+
+@cindex Fonts for indices
+The @code{@@syncodeindex} command puts all the entries from the `from'
+index (the redirected index) into the @code{@@code} font, overriding
+whatever default font is used by the index to which the entries are
+now directed. This way, if you direct function names from a function
+index into a concept index, all the function names are printed in the
+@code{@@code} font as you would expect.@refill
+
+@node synindex
+@subsection @code{@@synindex}
+@findex synindex
+
+The @code{@@synindex} command is nearly the same as the
+@code{@@syncodeindex} command, except that it does not put the
+`from' index entries into the @code{@@code} font; rather it puts
+them in the roman font. Thus, you use @code{@@synindex} when you
+merge a concept index into a function index.@refill
+
+@xref{Printing Indices & Menus}, for information about printing an index
+at the end of a book or creating an index menu in an Info file.@refill
+
+
+@node New Indices
+@section Defining New Indices
+@cindex Defining new indices
+@cindex Indices, defining new
+@cindex New index defining
+@findex defindex
+@findex defcodeindex
+
+In addition to the predefined indices, you may use the
+@code{@@defindex} and @code{@@defcodeindex} commands to define new
+indices. These commands create new indexing @@-commands with which
+you mark index entries. The @code{@@defindex} command is used like
+this:
+
+@example
+@@defindex @var{name}
+@end example
+
+The name of an index should be a two letter word, such as @samp{au}.
+For example:
+
+@example
+@@defindex au
+@end example
+
+This defines a new index, called the @samp{au} index. At the same
+time, it creates a new indexing command, @code{@@auindex}, that you
+can use to make index entries. Use this new indexing command just as
+you would use a predefined indexing command.
+
+For example, here is a section heading followed by a concept index
+entry and two @samp{au} index entries.
+
+@example
+@@section Cognitive Semantics
+@@cindex kinesthetic image schemas
+@@auindex Johnson, Mark
+@@auindex Lakoff, George
+@end example
+
+@noindent
+(Evidently, @samp{au} serves here as an abbreviation for ``author''.)
+
+In general, Texinfo constructs the new indexing command by
+concatenating the name of the index with @samp{index}; thus, defining
+an @samp{xy} index leads to the automatic creation of an
+@code{@@xyindex} command.
+
+Use the @code{@@printindex} command to print the index, as you do with
+the predefined indices. For example:
+
+@example
+@group
+@@node Author Index
+@@unnumbered Author Index
+
+@@printindex au
+@end group
+@end example
+
+The @code{@@defcodeindex} is like the @code{@@defindex} command,
+except that, in the printed output, it prints entries in an
+@code{@@code} font by default instead of a roman font.
+
+You should define new indices before the end-of-header line of a
+Texinfo file, and (of course) before any @code{@@synindex} or
+@code{@@syncodeindex} commands (@pxref{Texinfo File Header}).
+
+
+@node Insertions
+@chapter Special Insertions
+@cindex Inserting special characters and symbols
+@cindex Special insertions
+
+Texinfo provides several commands for inserting characters that have
+special meaning in Texinfo, such as braces, and for other graphic
+elements that do not correspond to simple characters you can type.
+
+@iftex
+These are:
+
+@itemize @bullet
+@item @samp{@@} and braces and commas.
+@item Whitespace within and around a sentence.
+@item Accents.
+@item Dots and bullets.
+@item The @TeX{} logo and the copyright symbol.
+@item The pounds currency symbol.
+@item The minus sign.
+@item Mathematical expressions.
+@item Glyphs for evaluation, macros, errors, etc.
+@item Footnotes.
+@item Images.
+@end itemize
+@end iftex
+
+@menu
+* Atsign Braces Comma:: Inserting @@ and @{@} and ,.
+* Inserting Space:: How to insert the right amount of space
+ within a sentence.
+* Inserting Accents:: How to insert accents and special characters.
+* Dots Bullets:: How to insert dots and bullets.
+* TeX and copyright:: How to insert the @TeX{} logo
+ and the copyright symbol.
+* euro:: How to insert the Euro currency symbol.
+* pounds:: How to insert the pounds currency symbol.
+* minus:: How to insert a minus sign.
+* math:: How to format a mathematical expression.
+* Glyphs:: How to indicate results of evaluation,
+ expansion of macros, errors, etc.
+@end menu
+
+
+@node Atsign Braces Comma
+@section Inserting @@ and @{@} and @comma{}
+@cindex Special characters, inserting
+@cindex Commands to insert special characters
+
+@samp{@@} and curly braces are special characters in Texinfo. To insert
+these characters so they appear in text, you must put an @samp{@@} in
+front of these characters to prevent Texinfo from misinterpreting
+them.
+
+The comma `,' is a special character only in one uncommon context:
+it separates arguments to commands that take multiple arguments.
+
+@menu
+* Inserting an Atsign::
+* Inserting Braces::
+* Inserting a Comma::
+@end menu
+
+
+@node Inserting an Atsign
+@subsection Inserting `@@' with @code{@@@@}
+@findex @@ @r{(literal @samp{@@})}
+@cindex Inserting @@ @r{(literal @samp{@@})}
+
+@code{@@@@} stands for a single @samp{@@} in either printed or Info
+output.
+
+Do not put braces after an @code{@@@@} command.
+
+
+@node Inserting Braces
+@subsection Inserting `@{' and `@}' with @code{@@@{} and @code{@@@}}
+@cindex Braces, inserting
+@findex @{ @r{(literal @samp{@{})}
+@findex @} @r{(literal @samp{@}})}
+
+@code{@@@{} stands for a single @samp{@{} in either printed or Info
+output.
+
+@code{@@@}} stands for a single @samp{@}} in either printed or Info
+output.
+
+Do not put braces after either an @code{@@@{} or an @code{@@@}}
+command.ppp
+
+
+@node Inserting a Comma
+@subsection Inserting `,' with @code{@@comma@{@}}
+@cindex Commas, inserting
+@findex comma
+
+Ordinarily, a comma `,' is a normal character that can be simply typed
+in your input where you need it.
+
+However, Texinfo uses the comma as a special character in one uncommon
+context: some commands, such as @code{@@acronym} (@pxref{acronym}) and
+@code{@@xref} (@pxref{Cross References}), as well as user-defined
+macros (@pxref{Defining Macros}), can take more than one argument. In
+these cases, the comma character is used to separate arguments.
+
+Since a comma chacter would confuse Texinfo's parsing for these
+commands, you must use the command @samp{@comma{}} instead if you want
+to have an actual comma in the output. Here are some examples:
+
+@example
+@@acronym@{ABC, A Bizarre @@comma@{@}@}
+@@xref@{Comma,, The @@comma@{@} symbol@}
+@@mymac@{One argument@@comma@{@} containing a comma@}
+@end example
+
+Although @comma{} can be used anywhere, there is no need for it
+anywhere except in this unusual case.
+
+
+@node Inserting Space
+@section Inserting Space
+
+@cindex Inserting space
+@cindex Spacing, inserting
+The following sections describe commands that control spacing of various
+kinds within and after sentences.
+
+@menu
+* Not Ending a Sentence:: Sometimes a . doesn't end a sentence.
+* Ending a Sentence:: Sometimes it does.
+* Multiple Spaces:: Inserting multiple spaces.
+* dmn:: How to format a dimension.
+@end menu
+
+
+@node Not Ending a Sentence
+@subsection Not Ending a Sentence
+
+@cindex Not ending a sentence
+@cindex Sentence non-ending punctuation
+@cindex Periods, inserting
+Depending on whether a period or exclamation point or question mark is
+inside or at the end of a sentence, less or more space is inserted after
+a period in a typeset manual. Since it is not always possible
+to determine when a period ends a sentence and when it is used
+in an abbreviation, special commands are needed in some circumstances.
+Usually, Texinfo can guess how to handle periods, so you do not need to
+use the special commands; you just enter a period as you would if you
+were using a typewriter, which means you put two spaces after the
+period, question mark, or exclamation mark that ends a sentence.
+
+@findex <colon> @r{(suppress end-of-sentence space)}
+Use the @code{@@:}@: command after a period, question mark,
+exclamation mark, or colon that should not be followed by extra space.
+For example, use @code{@@:}@: after periods that end abbreviations
+which are not at the ends of sentences.
+
+For example,
+
+@example
+The s.o.p.@@: has three parts @dots{}
+The s.o.p. has three parts @dots{}
+@end example
+
+@noindent
+@ifnottex
+produces
+@end ifnottex
+@iftex
+produces the following. If you look carefully at this printed output,
+you will see a little extraneous space after @samp{s.o.p.} in the second
+line.
+@end iftex
+
+@quotation
+The s.o.p.@: has three parts @dots{}@*
+The s.o.p. has three parts @dots{}
+@end quotation
+
+@noindent
+(Incidentally, @samp{s.o.p.} is an abbreviation for ``Standard Operating
+Procedure''.)
+
+@code{@@:} has no effect on the Info and HTML output. In Docbook and
+XML, the previous punctuation character (.?!:) is output as an entity
+instead of as the normal character: @samp{&period; &quest; &excl;
+&colon;}. This gives further processors a chance to notice and not
+add the usual extra space.
+
+Do not put braces after @code{@@:} (or any non-alphabetic command).
+
+
+@node Ending a Sentence
+@subsection Ending a Sentence
+
+@cindex Ending a Sentence
+@cindex Sentence ending punctuation
+
+@findex . @r{(end of sentence)}
+@findex ! @r{(end of sentence)}
+@findex ? @r{(end of sentence)}
+Use @code{@@.}@: instead of a period, @code{@@!}@: instead of an
+exclamation point, and @code{@@?}@: instead of a question mark at the end
+of a sentence that ends with a capital letter. Otherwise, @TeX{}
+will think the letter is an abbreviation and will not insert the correct
+end-of-sentence spacing. Here is an example:
+
+@example
+Give it to M.I.B. and to M.E.W@@. Also, give it to R.J.C@@.
+Give it to M.I.B. and to M.E.W. Also, give it to R.J.C.
+@end example
+
+@noindent
+@ifnottex
+produces
+@end ifnottex
+@iftex
+produces the following. If you look carefully at this printed output,
+you will see a little more whitespace after the @samp{W} in the first
+line.
+@end iftex
+
+@quotation
+Give it to M.I.B. and to M.E.W@. Also, give it to R.J.C@.@*
+Give it to M.I.B. and to M.E.W. Also, give it to R.J.C.
+@end quotation
+
+In the Info file output, @code{@@.}@: is equivalent to a simple
+@samp{.}; likewise for @code{@@!}@: and @code{@@?}@:.
+
+The meanings of @code{@@:} and @code{@@.}@: in Texinfo are designed to
+work well with the Emacs sentence motion commands (@pxref{Sentences,,,
+emacs, The GNU Emacs Manual}).
+
+Do not put braces after any of these commands.
+
+
+@node Multiple Spaces
+@subsection Multiple Spaces
+
+@cindex Multiple spaces
+@cindex Whitespace, inserting
+@cindex Space, inserting horizontal
+@findex <space>
+@findex <tab>
+@findex <newline>
+
+Ordinarily, @TeX{} collapses multiple whitespace characters (space, tab,
+and newline) into a single space. Info output, on the other hand,
+preserves whitespace as you type it, except for changing a newline into
+a space; this is why it is important to put two spaces at the end of
+sentences in Texinfo documents.
+
+Occasionally, you may want to actually insert several consecutive
+spaces, either for purposes of example (what your program does with
+multiple spaces as input), or merely for purposes of appearance in
+headings or lists. Texinfo supports three commands:
+@code{@@@kbd{SPACE}}, @code{@@@kbd{TAB}}, and @code{@@@kbd{NL}}, all of
+which insert a single space into the output. (Here,
+@code{@@@kbd{SPACE}} represents an @samp{@@} character followed by a
+space, i.e., @samp{@@ }, and @kbd{TAB} and @kbd{NL} represent the tab
+character and end-of-line, i.e., when @samp{@@} is the last character on
+a line.)
+
+For example,
+@example
+Spacey@@ @@ @@ @@
+example.
+@end example
+
+@noindent produces
+
+@example
+Spacey@ @ @ @
+example.
+@end example
+
+Other possible uses of @code{@@@kbd{SPACE}} have been subsumed by
+@code{@@multitable} (@pxref{Multi-column Tables}).
+
+Do not follow any of these commands with braces.
+
+To produce a non-breakable space, see @ref{tie, @code{@@tie}}.
+
+
+@node dmn
+@subsection @code{@@dmn}@{@var{dimension}@}: Format a Dimension
+@cindex Thin space between number, dimension
+@cindex Dimension formatting
+@cindex Format a dimension
+@findex dmn
+
+At times, you may want to write @samp{12@dmn{pt}} or
+@samp{8.5@dmn{in}} with little or no space between the number and the
+abbreviation for the dimension. You can use the @code{@@dmn} command
+to do this. On seeing the command, @TeX{} inserts just enough space
+for proper typesetting; the Info formatting commands insert no space
+at all, since the Info file does not require it.
+
+To use the @code{@@dmn} command, write the number and then follow it
+immediately, with no intervening space, by @code{@@dmn}, and then by
+the dimension within braces. For example,
+
+@example
+A4 paper is 8.27@@dmn@{in@} wide.
+@end example
+
+@noindent
+produces
+
+@quotation
+A4 paper is 8.27@dmn{in} wide.
+@end quotation
+
+Not everyone uses this style. Some people prefer @w{@samp{8.27 in.@@:}}
+or @w{@samp{8.27 inches}} to @samp{8.27@@dmn@{in@}} in the Texinfo file.
+In these cases, however, the formatters may insert a line break between
+the number and the dimension, so use @code{@@w} (@pxref{w}). Also, if
+you write a period after an abbreviation within a sentence, you should
+write @samp{@@:} after the period to prevent @TeX{} from inserting extra
+whitespace, as shown here. @xref{Not Ending a Sentence}.
+
+
+@node Inserting Accents
+@section Inserting Accents
+
+@cindex Inserting accents
+@cindex Accents, inserting
+@cindex Floating accents, inserting
+
+Here is a table with the commands Texinfo provides for inserting
+floating accents. The commands with non-alphabetic names do not take
+braces around their argument (which is taken to be the next character).
+(Exception: @code{@@,} @emph{does} take braces around its argument.)
+This is so as to make the source as convenient to type and read as
+possible, since accented characters are very common in some languages.
+
+To get the true accented characters output in Info, and not just the
+ASCII transliterations, you can use the @option{--enable-encoding}
+option to @command{makeinfo} (@pxref{makeinfo options}).
+
+@findex " @r{(umlaut accent)}
+@cindex Umlaut accent
+@findex ' @r{(umlaut accent)}
+@cindex Acute accent
+@findex = @r{(macron accent)}
+@cindex Macron accent
+@findex ^ @r{(circumflex accent)}
+@cindex Circumflex accent
+@findex ` @r{(grave accent)}
+@cindex Grave accent
+@findex ~ @r{(tilde accent)}
+@cindex Tilde accent
+@findex , @r{(cedilla accent)}
+@cindex Cedilla accent
+@findex dotaccent
+@cindex Dot accent
+@findex H @r{(Hungarian umlaut accent)}
+@cindex Hungarian umlaut accent
+@findex ringaccent
+@cindex Ring accent
+@findex tieaccent
+@cindex Tie-after accent
+@findex u @r{(breve accent)}
+@cindex Breve accent
+@findex ubaraccent
+@cindex Underbar accent
+@findex udotaccent
+@cindex Underdot accent
+@findex v @r{(check accent)}
+@cindex Hacek accent
+@cindex Check accent
+@cindex Caron accent
+@multitable {@@questiondown@{@}} {Output} {hacek/check/caron accent}
+@item Command @tab Output @tab What
+@item @t{@@"o} @tab @"o @tab umlaut accent
+@item @t{@@'o} @tab @'o @tab acute accent
+@item @t{@@,@{c@}} @tab @,{c} @tab cedilla accent
+@item @t{@@=o} @tab @=o @tab macron/overbar accent
+@item @t{@@^o} @tab @^o @tab circumflex accent
+@item @t{@@`o} @tab @`o @tab grave accent
+@item @t{@@~o} @tab @~o @tab tilde accent
+@item @t{@@dotaccent@{o@}} @tab @dotaccent{o} @tab overdot accent
+@item @t{@@H@{o@}} @tab @H{o} @tab long Hungarian umlaut
+@item @t{@@ringaccent@{o@}} @tab @ringaccent{o} @tab ring accent
+@item @t{@@tieaccent@{oo@}} @tab @tieaccent{oo} @tab tie-after accent
+@item @t{@@u@{o@}} @tab @u{o} @tab breve accent
+@item @t{@@ubaraccent@{o@}} @tab @ubaraccent{o} @tab underbar accent
+@item @t{@@udotaccent@{o@}} @tab @udotaccent{o} @tab underdot accent
+@item @t{@@v@{o@}} @tab @v{o} @tab hacek/check/caron accent
+@end multitable
+
+This table lists the Texinfo commands for inserting other characters
+commonly used in languages other than English.
+
+@findex questiondown
+@cindex @questiondown{}
+@findex exclamdown
+@cindex @exclamdown{}
+@findex aa
+@cindex @aa{}
+@findex AA
+@cindex @AA{}
+@findex ae
+@cindex @ae{}
+@findex AE
+@cindex @AE{}
+@findex dotless
+@cindex @dotless{i} (dotless i)
+@cindex @dotless{j} (dotless j)
+@cindex Dotless i, j
+@findex l
+@cindex @l{}
+@findex L
+@cindex @L{}
+@findex o
+@cindex @o{}
+@findex O
+@cindex @O{}
+@findex oe
+@cindex @oe{}
+@findex OE
+@cindex @OE{}
+@cindex Romance ordinals
+@cindex Ordinals, Romance
+@cindex Feminine ordinal
+@findex ordf
+@cindex @ordf{}
+@cindex Masculine ordinal
+@findex ordm
+@cindex @ordm{}
+@findex ss
+@cindex @ss{}
+@cindex Es-zet
+@cindex Sharp S
+@cindex German S
+@multitable {x@@questiondown@{@}} {oe OE} {es-zet or sharp S}
+@item @t{@@exclamdown@{@}} @tab @exclamdown{} @tab upside-down !
+@item @t{@@questiondown@{@}} @tab @questiondown{} @tab upside-down ?
+@item @t{@@aa@{@} @@AA@{@}} @tab @aa{} @AA{} @tab a,A with circle
+@item @t{@@ae@{@} @@AE@{@}} @tab @ae{} @AE{} @tab ae,AE ligatures
+@item @t{@@dotless@{i@}} @tab @dotless{i} @tab dotless i
+@item @t{@@dotless@{j@}} @tab @dotless{j} @tab dotless j
+@item @t{@@l@{@} @@L@{@}} @tab @l{} @L{} @tab suppressed-L,l
+@item @t{@@o@{@} @@O@{@}} @tab @o{} @O{} @tab O,o with slash
+@item @t{@@oe@{@} @@OE@{@}} @tab @oe{} @OE{} @tab oe,OE ligatures
+@item @t{@@ordf@{@} @@ordm@{@}} @tab @ordf{} @ordm{} @tab Spanish ordinals
+@item @t{@@ss@{@}} @tab @ss{} @tab es-zet or sharp S
+@end multitable
+
+
+@node Dots Bullets
+@section Inserting Ellipsis and Bullets
+@cindex Dots, inserting
+@cindex Bullets, inserting
+@cindex Ellipsis, inserting
+@cindex Inserting ellipsis
+@cindex Inserting dots
+@cindex Special typesetting commands
+@cindex Typesetting commands for dots, etc.
+
+An @dfn{ellipsis} (a line of dots) is not typeset as a string of
+periods, so a special command is used for ellipsis in Texinfo. The
+@code{@@bullet} command is special, too. Each of these commands is
+followed by a pair of braces, @samp{@{@}}, without any whitespace
+between the name of the command and the braces. (You need to use braces
+with these commands because you can use them next to other text; without
+the braces, the formatters would be confused. @xref{Command Syntax, ,
+@@-Command Syntax}, for further information.)@refill
+
+@menu
+* dots:: How to insert dots @dots{}
+* bullet:: How to insert a bullet.
+@end menu
+
+
+@node dots
+@subsection @code{@@dots}@{@} (@dots{}) and @code{@@enddots}@{@} (@enddots{})
+@findex dots
+@findex enddots
+@cindex Inserting dots
+@cindex Dots, inserting
+
+Use the @code{@@dots@{@}} command to generate an ellipsis, which is
+three dots in a row, appropriately spaced @dots{} like so. Do
+not simply write three periods in the input file; that would work for
+the Info file output, but would produce the wrong amount of space
+between the periods in the printed manual.
+
+Similarly, the @code{@@enddots@{@}} command generates an
+end-of-sentence ellipsis, which has different spacing afterwards,
+@enddots{} Look closely to see the difference.
+
+@iftex
+Here is an ellipsis: @dots{}
+Here are three periods in a row: ...
+
+In printed output, the three periods in a row are closer together than
+the dots in the ellipsis.
+@end iftex
+
+
+@node bullet
+@subsection @code{@@bullet}@{@} (@bullet{})
+@findex bullet
+
+Use the @code{@@bullet@{@}} command to generate a large round dot, or
+the closest possible thing to one. In Info, an asterisk is used.@refill
+
+Here is a bullet: @bullet{}
+
+When you use @code{@@bullet} in @code{@@itemize}, you do not need to
+type the braces, because @code{@@itemize} supplies them.
+(@xref{itemize, , @code{@@itemize}}.)@refill
+
+
+@node TeX and copyright
+@section Inserting @TeX{} and Legal Symbols: @copyright{}, @registeredsymbol{}
+
+The logo `@TeX{}' is typeset in a special fashion and it needs an
+@@-command. The copyright and registered symbols, `@copyright{}' and
+`@registeredsymbol{}', is also special. Each of these commands is
+followed by a pair of braces, @samp{@{@}}, without any whitespace
+between the name of the command and the braces.
+
+@menu
+* tex:: The @TeX{} logos.
+* copyright symbol:: The copyright symbol (c in a circle).
+* registered symbol:: The registered symbol (R in a circle).
+@end menu
+
+
+@node tex
+@subsection @code{@@TeX}@{@} (@TeX{}) and @code{@@LaTeX}@{@} (@LaTeX{})
+@findex TeX
+@findex LaTeX
+
+Use the @code{@@TeX@{@}} command to generate `@TeX{}'. In a printed
+manual, this is a special logo that is different from three ordinary
+letters. In Info, it just looks like @samp{TeX}.
+
+Similarly, use the @code{@@LaTeX@{@}} command to generate `@LaTeX{}',
+which is even more special in printed manuals (and different from the
+incorrect @code{La@@TeX@{@}}. In Info, the result is just
+@samp{LaTeX}. (@LaTeX{} is another macro package built on top of
+@TeX{}, very loosely analogous to Texinfo in that it emphasizes
+logical structure, but much (much) larger.)
+
+The spelling of these commands are unusual among Texinfo commands in
+that they use both uppercase and lowercase letters.
+
+
+@node copyright symbol
+@subsection @code{@@copyright@{@}} (@copyright{})
+@findex copyright
+
+Use the @code{@@copyright@{@}} command to generate the copyright
+symbol, `@copyright{}'. Where possible, this is a @samp{c}
+inside a circle; in Info, this is @samp{(C)}.
+
+
+@node registered symbol
+@subsection @code{@@registeredsymbol@{@}} (@registeredsymbol{})
+@findex registeredsymbol
+
+Use the @code{@@registeredsymbol@{@}} command to generate the
+registered symbol, `@registeredsymbol{}'. Where possible, this is an
+@samp{R} inside a circle; in Info, this is @samp{(R)}.
+
+
+@node euro
+@section @code{@@euro}@{@} (@euro{}): Euro currency symbol
+@findex euro
+
+Use the @code{@@euro@{@}} command to generate `@euro{}'. Where
+possible, this is the symbol for the Euro currency, invented as part
+of the European economic unification relatively recently. In plain
+Info, it is the word @samp{Euro }. (The space is included in the text
+transliteration since typically there would be no space after the
+symbol, so it would be inappropriate to have a space in the source document.)
+
+Texinfo cannot magically synthesize support for the Euro symbol where
+the underlying system (fonts, software, whatever) does not support
+it. Therefore, in many cases it is preferable to use the word
+``Euro''. (In banking circles, the abbreviation for the Euro is EUR.)
+
+@cindex ISO 8859-15
+@cindex Latin 9
+In order to get the Euro symbol in encoded Info output, for example,
+it is necessary to specify @code{@@documentencoding ISO-8859-15}.
+(@xref{documentencoding,,@code{@@documentencoding}}.) The Euro symbol
+is in ISO 8859-15 (aka Latin@tie{}9), and is @emph{not} in the more
+widely-used and supported ISO 8859-1 (Latin@tie{}1).
+
+
+@node pounds
+@section @code{@@pounds}@{@} (@pounds{}): Pounds Sterling
+@findex pounds
+
+Use the @code{@@pounds@{@}} command to generate `@pounds{}'. Where
+possible, this is the symbol for the currency pounds sterling. In
+Info, it is a @samp{#}.
+
+
+@node minus
+@section @code{@@minus}@{@} (@minus{}): Inserting a Minus Sign
+@findex minus
+
+@cindex Em dash, compared to minus sign
+@cindex Hyphen, compared to minus
+Use the @code{@@minus@{@}} command to generate a minus sign. In a
+fixed-width font, this is a single hyphen, but in a proportional font,
+the symbol is the customary length for a minus sign---a little longer
+than a hyphen, shorter than an em-dash:
+
+@display
+@samp{@minus{}} is a minus sign generated with @samp{@@minus@{@}},
+
+`-' is a hyphen generated with the character @samp{-},
+
+`---' is an em-dash for text.
+@end display
+
+@noindent
+In the fixed-width font used by Info, @code{@@minus@{@}} is the same
+as a hyphen.
+
+You should not use @code{@@minus@{@}} inside @code{@@code} or
+@code{@@example} because the width distinction is not made in the
+fixed-width font they use.
+
+When you use @code{@@minus} to specify the mark beginning each entry in
+an itemized list, you do not need to type the braces
+(@pxref{itemize, , @code{@@itemize}}).
+
+
+@node math
+@section @code{@@math}: Inserting Mathematical Expressions
+@findex math
+@cindex Mathematical expressions
+@cindex Formulas, mathematical
+
+You can write a short mathematical expression with the @code{@@math}
+command. Write the mathematical expression between braces, like this:
+
+@example
+@@math@{(a + b)(a + b) = a^2 + 2ab + b^2@}
+@end example
+
+@iftex
+@noindent This produces the following in @TeX{}:
+
+@display
+@math{(a + b)(a + b) = a^2 + 2ab + b^2}
+@end display
+
+@noindent and the following in other formats:
+@end iftex
+@ifnottex
+@noindent This produces the following in Info and HTML:
+@end ifnottex
+
+@example
+(a + b)(a + b) = a^2 + 2ab + b^2
+@end example
+
+Thus, the @code{@@math} command has no effect on the Info and HTML
+output; @command{makeinfo} just reproduces the input, it does not try
+to interpret the mathematics in any way.
+
+@code{@@math} implies @code{@@tex}. This not only makes it possible to
+write superscripts and subscripts (as in the above example), but also
+allows you to use any of the plain @TeX{} math control sequences. It's
+conventional to use @samp{\} instead of @samp{@@} for these commands.
+As in:
+@example
+@@math@{\sin 2\pi \equiv \cos 3\pi@}
+@end example
+
+@iftex
+@noindent which looks like this in @TeX{}:
+@display
+@math{\sin 2\pi \equiv \cos 3\pi}
+@end display
+
+@noindent and
+@end iftex
+@noindent which looks like the input in Info and HTML:
+@example
+\sin 2\pi \equiv \cos 3\pi
+@end example
+
+@findex \ @r{(literal \ in @code{@@math})}
+Since @samp{\} is an escape character inside @code{@@math}, you can use
+@code{@@\} to get a literal backslash (@code{\\} will work in @TeX{},
+but you'll get the literal @samp{\\} in Info). @code{@@\} is not
+defined outside of @code{@@math}, since a @samp{\} ordinarily produces a
+literal @samp{\}.
+
+
+@cindex Displayed equations
+@cindex Equations, displayed
+For displayed equations, you must at present use @TeX{} directly
+(@pxref{Raw Formatter Commands}).
+
+
+@node Glyphs
+@section Glyphs for Examples
+@cindex Glyphs
+@cindex Examples, glyphs for
+
+In Texinfo, code is often illustrated in examples that are delimited
+by @code{@@example} and @code{@@end example}, or by @code{@@lisp} and
+@code{@@end lisp}. In such examples, you can indicate the results of
+evaluation or an expansion using @samp{@result{}} or
+@samp{@expansion{}}. Likewise, there are commands to insert glyphs
+to indicate
+printed output, error messages, equivalence of expressions, and the
+location of point.@refill
+
+The glyph-insertion commands do not need to be used within an example, but
+most often they are. Every glyph-insertion command is followed by a pair of
+left- and right-hand braces.@refill
+
+@menu
+* Glyphs Summary::
+* result:: How to show the result of expression.
+* expansion:: How to indicate an expansion.
+* Print Glyph:: How to indicate printed output.
+* Error Glyph:: How to indicate an error message.
+* Equivalence:: How to indicate equivalence.
+* Point Glyph:: How to indicate the location of point.
+@end menu
+
+
+@node Glyphs Summary
+@subsection Glyphs Summary
+
+Here are the different glyph commands:@refill
+
+@table @asis
+@item @result{}
+@code{@@result@{@}} points to the result of an expression.@refill
+
+@item @expansion{}
+@code{@@expansion@{@}} shows the results of a macro expansion.@refill
+
+@item @print{}
+@code{@@print@{@}} indicates printed output.@refill
+
+@item @error{}
+@code{@@error@{@}} indicates that the following text is an error
+message.@refill
+
+@item @equiv{}
+@code{@@equiv@{@}} indicates the exact equivalence of two forms.@refill
+
+@item @point{}
+@code{@@point@{@}} shows the location of point.@refill
+@end table
+
+@menu
+* result::
+* expansion::
+* Print Glyph::
+* Error Glyph::
+* Equivalence::
+* Point Glyph::
+@end menu
+
+
+@node result
+@subsection @code{@@result@{@}} (@result{}): Indicating Evaluation
+@cindex Result of an expression
+@cindex Indicating evaluation
+@cindex Evaluation glyph
+@cindex Value of an expression, indicating
+@findex result
+
+Use the @code{@@result@{@}} command to indicate the result of
+evaluating an expression.@refill
+
+@iftex
+The @code{@@result@{@}} command is displayed as @samp{@result{}} in
+the printed output and as @samp{=>} in other formats.
+@end iftex
+@ifnottex
+The @code{@@result@{@}} command is displayed as @samp{@result{}} in
+Info and HTML and as a true double stemmed arrow in the printed output.
+@end ifnottex
+
+Thus, the following,
+
+@lisp
+(cdr '(1 2 3))
+ @result{} (2 3)
+@end lisp
+
+@noindent
+may be read as ``@code{(cdr '(1 2 3))} evaluates to @code{(2 3)}''.
+
+
+@node expansion
+@subsection @code{@@expansion@{@}} (@expansion{}): Indicating an Expansion
+@cindex Expansion, indicating
+@cindex Macro expansion, indicating
+@findex expansion
+
+When an expression is a macro call, it expands into a new expression.
+You can indicate the result of the expansion with the
+@code{@@expansion@{@}} command.@refill
+
+@iftex
+The @code{@@expansion@{@}} command is displayed as @samp{@expansion{}}
+in the printed output. and as @samp{==>} in other formats.
+@end iftex
+@ifnottex
+The @code{@@expansion@{@}} command is displayed as @samp{@expansion{}}
+in Info and HTML, and as a long arrow with a flat base in the printed
+output.
+@end ifnottex
+
+@need 700
+For example, the following
+
+@example
+@group
+@@lisp
+(third '(a b c))
+ @@expansion@{@} (car (cdr (cdr '(a b c))))
+ @@result@{@} c
+@@end lisp
+@end group
+@end example
+
+@noindent
+produces
+
+@lisp
+@group
+(third '(a b c))
+ @expansion{} (car (cdr (cdr '(a b c))))
+ @result{} c
+@end group
+@end lisp
+
+@noindent
+which may be read as:
+
+@quotation
+@code{(third '(a b c))} expands to @code{(car (cdr (cdr '(a b c))))};
+the result of evaluating the expression is @code{c}.
+@end quotation
+
+@noindent
+Often, as in this case, an example looks better if the
+@code{@@expansion@{@}} and @code{@@result@{@}} commands are indented.
+
+
+@node Print Glyph
+@subsection @code{@@print@{@}} (@print{}): Indicating Printed Output
+@cindex Printed output, indicating
+@findex print
+
+Sometimes an expression will print output during its execution. You
+can indicate the printed output with the @code{@@print@{@}} command.@refill
+
+@iftex
+The @code{@@print@{@}} command is displayed as @samp{-|} in Info and
+HTML and as @samp{@print{}} in the printed output.
+@end iftex
+@ifnottex
+The @code{@@print@{@}} command is displayed as @samp{@print{}} in Info
+and HTML and (similarly) as a horizontal dash butting against a
+vertical bar in the printed output.
+@end ifnottex
+
+In the following example, the printed text is indicated with
+@samp{@print{}}, and the value of the expression follows on the
+last line.
+
+@lisp
+@group
+(progn (print 'foo) (print 'bar))
+ @print{} foo
+ @print{} bar
+ @result{} bar
+@end group
+@end lisp
+
+@noindent
+In a Texinfo source file, this example is written as follows:
+
+@lisp
+@group
+@@lisp
+(progn (print 'foo) (print 'bar))
+ @@print@{@} foo
+ @@print@{@} bar
+ @@result@{@} bar
+@@end lisp
+@end group
+@end lisp
+
+
+@node Error Glyph
+@subsection @code{@@error@{@}} (@error{}): Indicating an Error Message
+@cindex Error message, indicating
+@findex error
+
+A piece of code may cause an error when you evaluate it. You can
+designate the error message with the @code{@@error@{@}} command.@refill
+
+@iftex
+The @code{@@error@{@}} command is displayed as @samp{error-->} in Info
+and HTML and as @samp{@error{}} in the printed output.
+@end iftex
+@ifnottex
+The @code{@@error@{@}} command is displayed as @samp{@error{}} in Info
+and HTML and as the word `error' in a box in the printed output.
+@end ifnottex
+
+@need 700
+Thus,
+
+@example
+@@lisp
+(+ 23 'x)
+@@error@{@} Wrong type argument: integer-or-marker-p, x
+@@end lisp
+@end example
+
+@noindent
+produces
+
+@lisp
+(+ 23 'x)
+@error{} Wrong type argument: integer-or-marker-p, x
+@end lisp
+
+@noindent
+This indicates that the following error message is printed
+when you evaluate the expression:
+
+@lisp
+Wrong type argument: integer-or-marker-p, x
+@end lisp
+
+@samp{@error{}} itself is not part of the error message.
+
+
+@node Equivalence
+@subsection @code{@@equiv@{@}} (@equiv{}): Indicating Equivalence
+@cindex Equivalence, indicating
+@findex equiv
+
+Sometimes two expressions produce identical results. You can indicate the
+exact equivalence of two forms with the @code{@@equiv@{@}} command.@refill
+
+@iftex
+The @code{@@equiv@{@}} command is displayed as @samp{==} in Info and
+HTML and as @samp{@equiv{}} in the printed output.
+@end iftex
+@ifnottex
+The @code{@@equiv@{@}} command is displayed as @samp{@equiv{}} in Info
+and HTML and as a standard mathematical equivalence sign (three
+parallel horizontal lines) in the printed output.
+@end ifnottex
+
+Thus,
+
+@example
+@@lisp
+(make-sparse-keymap) @@equiv@{@} (list 'keymap)
+@@end lisp
+@end example
+
+@noindent
+produces
+
+@lisp
+(make-sparse-keymap) @equiv{} (list 'keymap)
+@end lisp
+
+@noindent
+This indicates that evaluating @code{(make-sparse-keymap)} produces
+identical results to evaluating @code{(list 'keymap)}.
+
+
+@node Point Glyph
+@subsection @code{@@point@{@}} (@point{}): Indicating Point in a Buffer
+@cindex Point, indicating in a buffer
+@findex point
+
+Sometimes you need to show an example of text in an Emacs buffer. In
+such examples, the convention is to include the entire contents of the
+buffer in question between two lines of dashes containing the buffer
+name.@refill
+
+You can use the @samp{@@point@{@}} command to show the location of point
+in the text in the buffer. (The symbol for point, of course, is not
+part of the text in the buffer; it indicates the place @emph{between}
+two characters where point is located.)@refill
+
+@iftex
+The @code{@@point@{@}} command is displayed as @samp{-!-} in Info and
+HTML and as @samp{@point{}} in the printed output.
+@end iftex
+@ifnottex
+The @code{@@point@{@}} command is displayed as @samp{@point{}} in Info
+and HTML and as a small five pointed star in the printed
+output.
+@end ifnottex
+
+The following example shows the contents of buffer @file{foo} before
+and after evaluating a Lisp command to insert the word @code{changed}.@refill
+
+@example
+@group
+---------- Buffer: foo ----------
+This is the @point{}contents of foo.
+---------- Buffer: foo ----------
+
+@end group
+@end example
+
+@example
+@group
+(insert "changed ")
+ @result{} nil
+---------- Buffer: foo ----------
+This is the changed @point{}contents of foo.
+---------- Buffer: foo ----------
+
+@end group
+@end example
+
+In a Texinfo source file, the example is written like this:@refill
+
+@example
+@@example
+---------- Buffer: foo ----------
+This is the @@point@{@}contents of foo.
+---------- Buffer: foo ----------
+
+(insert "changed ")
+ @@result@{@} nil
+---------- Buffer: foo ----------
+This is the changed @@point@{@}contents of foo.
+---------- Buffer: foo ----------
+@@end example
+@end example
+
+
+@node Breaks
+@chapter Forcing and Preventing Breaks
+@cindex Forcing line and page breaks
+@cindex Making line and page breaks
+@cindex Preventing line and page breaks
+
+@cindex Line breaks
+Usually, a Texinfo file is processed both by @TeX{} and by one of the
+Info formatting commands. Line, paragraph, or page breaks sometimes
+occur in the `wrong' place in one or other form of output. You must
+ensure that text looks right both in the printed manual and in the
+Info file.
+
+@cindex White space, excessive
+@cindex Page breaks
+For example, in a printed manual, page breaks may occur awkwardly in
+the middle of an example; to prevent this, you can hold text together
+using a grouping command that keeps the text from being split across
+two pages. Conversely, you may want to force a page break where none
+would occur normally. Fortunately, problems like these do not often
+arise. When they do, use the break, break prevention, or pagination
+commands.
+
+@menu
+* Break Commands:: Summary of break-related commands.
+* Line Breaks:: Forcing line breaks.
+* - and hyphenation:: Helping @TeX{} with hyphenation points.
+* w:: Preventing unwanted line breaks in text.
+* tie:: Inserting an unbreakable but varying space.
+* sp:: Inserting blank lines.
+* page:: Forcing the start of a new page.
+* group:: Preventing unwanted page breaks.
+* need:: Another way to prevent unwanted page breaks.
+@end menu
+
+
+@node Break Commands
+@section Break Commands
+
+The break commands create or allow line and paragraph breaks:
+
+@table @code
+@item @@*
+Force a line break.
+
+@item @@sp @var{n}
+Skip @var{n} blank lines.
+
+@item @@-
+Insert a discretionary hyphen.
+
+@item @@hyphenation@{@var{hy-phen-a-ted words}@}
+Define hyphen points in @var{hy-phen-a-ted words}.
+@end table
+
+These commands hold text together on a single line:
+
+@table @code
+@item @@w@{@var{text}@}
+Prevent @var{text} from being split and hyphenated across two lines.
+@item @@tie@{@}
+Insert a normal interword space at which a line break may not occur.
+@end table
+@iftex
+@sp 1
+@end iftex
+
+The pagination commands apply only to printed output, since Info
+files do not have pages.
+
+@table @code
+@item @@page
+Start a new page in the printed manual.
+
+@item @@group
+Hold text together that must appear on one printed page.
+
+@item @@need @var{mils}
+Start a new printed page if not enough space on this one.
+@end table
+
+
+@node Line Breaks
+@section @code{@@*} and @code{@@/}: Generate and Allow Line Breaks
+@findex * @r{(force line break)}
+@findex / @r{(allow line break)}
+@cindex Line breaks
+@cindex Breaks in a line
+@cindex Force line break
+@cindex Allow line break
+
+The @code{@@*} command forces a line break in both the printed manual and
+in Info. The @code{@@/} command allows a line break (printed manual only).
+
+Here is an example with @code{@@*}:
+
+@example
+This line @@* is broken @@*in two places.
+@end example
+
+@noindent produces
+
+@example
+@group
+This line
+is broken
+in two places.
+@end group
+@end example
+
+The @code{@@/} command can be useful within a url
+(@pxref{uref,,@code{@@uref}}), which tend to be long and are otherwise
+unbreakable. For example:
+
+@example
+The official Texinfo home page is on the GNU web site:
+@@uref@{http://www.gnu.org/@@/software/@@/gnu/@@/texinfo@}.
+@end example
+
+@noindent produces
+
+@display
+The official Texinfo home page is on the GNU web site:
+@uref{http://www.gnu.org/@/software/@/gnu/@/texinfo}.
+@end display
+
+@noindent Without the @code{@@/} commands, @TeX{} would have nowhere to
+break the line. @code{@@/} has no effect in the online output.
+
+
+@node - and hyphenation
+@section @code{@@-} and @code{@@hyphenation}: Helping @TeX{} Hyphenate
+
+@findex - @r{(discretionary hyphen)}
+@findex hyphenation
+@cindex Hyphenation, helping @TeX{} do
+@cindex Fine-tuning, and hyphenation
+
+Although @TeX{}'s hyphenation algorithm is generally pretty good, it
+does miss useful hyphenation points from time to time. (Or, far more
+rarely, insert an incorrect hyphenation.) So, for documents with an
+unusual vocabulary or when fine-tuning for a printed edition, you may
+wish to help @TeX{} out. Texinfo supports two commands for this:
+
+@table @code
+@item @@-
+Insert a discretionary hyphen, i.e., a place where @TeX{} can (but does
+not have to) hyphenate. This is especially useful when you notice an
+overfull hbox is due to @TeX{} missing a hyphenation (@pxref{Overfull
+hboxes}). @TeX{} will not insert any hyphenation points itself into a
+word containing @code{@@-}.
+
+@item @@hyphenation@{@var{hy-phen-a-ted words}@}
+Tell @TeX{} how to hyphenate @var{hy-phen-a-ted words}. As shown, you
+put a @samp{-} at each hyphenation point. For example:
+@example
+@@hyphenation@{man-u-script man-u-scripts@}
+@end example
+@noindent @TeX{} only uses the specified hyphenation points when the
+words match exactly, so give all necessary variants.
+@end table
+
+Info output is not hyphenated, so these commands have no effect there.
+
+
+@node w
+@section @code{@@w}@{@var{text}@}: Prevent Line Breaks
+@findex w @r{(prevent line break)}
+@cindex Line breaks, preventing
+
+@code{@@w@{@var{text}@}} outputs @var{text} and prohibits line breaks
+within @var{text}, for both @TeX{} and @command{makeinfo}.
+
+@cindex Non-breakable space, fixed
+@cindex Unbreakable space, fixed
+Thus, you can use @code{@@w} to produce a non-breakable space, fixed at
+the width of a normal interword space:
+
+@example
+@@w@{ @} @@w@{ @} @@w@{ @} indentation.
+@end example
+
+@noindent produces:
+
+@display
+@w{ } @w{ } @w{ } indentation.
+@end display
+
+The space from @code{@@w@{@w{ }@}}, as well as being non-breakable,
+also will not stretch or shrink. Sometimes that is what you want, for
+instance if you're doing indenting manual. However, usually you want
+a normal interword space that does stretch and shrink (in the printed
+output); see the @code{@@tie} command in the next section.
+
+@cindex Hyphenation, preventing
+You can also use the @code{@@w} command to prevent @TeX{} from
+automatically hyphenating a long name or phrase that happens to fall
+near the end of a line. @command{makeinfo} does not ever hyphenate
+words.
+
+@cindex Keyword expansion, preventing
+@cindex Version control keywords, preventing expansion of
+@cindex $Id expansion, preventing
+You can also use @code{@@w} to avoid unwanted keyword expansion in
+source control systems. For example, to literally write @t{@w{$}Id$}
+in your document, use @code{@@w@{$@}Id$}.
+
+
+@node tie
+@section @code{@@tie@{@}}: Inserting an Unbreakable Space
+@findex tie @r{(unbreakable interword space)}
+@cindex Tied space
+@cindex Non-breakable space, variable
+@cindex Unbreakable space, variable
+
+The @code{@@tie@{@}} command produces a normal interword space at which
+a line break may not occur. Always write it with following (empty)
+braces, as usual for commands used within a paragraph. Here's an
+example:
+
+@example
+@@TeX@{@} was written by Donald E.@@tie@{@}Knuth.
+@end example
+
+@noindent produces:
+
+@display
+@TeX{} was written by Donald E.@tie{}Knuth.
+@end display
+
+There are two important differences between @code{@@tie@{@}} and
+@code{@@w@{@w{ }@}}:
+
+@itemize
+@item
+The space produced by @code{@@tie@{@}} will stretch and shrink slightly
+along with the normal interword spaces in the paragraph; the space
+produced by @code{@@w@{@w{ }@}} will not vary.
+
+@item
+@code{@@tie@{@}} allows hyphenation of the surrounding words, while
+@code{@@w@{@w{ }@}} inhibits hyphenation of those words (for @TeX{}nical
+reasons, namely that it produces an @samp{\hbox}).
+
+@end itemize
+
+
+@node sp
+@section @code{@@sp} @var{n}: Insert Blank Lines
+@findex sp @r{(line spacing)}
+@cindex Space, inserting vertical
+@cindex Blank lines
+@cindex Line spacing
+
+A line beginning with and containing only @code{@@sp @var{n}}
+generates @var{n} blank lines of space in both the printed manual and
+the Info file. @code{@@sp} also forces a paragraph break. For
+example,
+
+@example
+@@sp 2
+@end example
+
+@noindent
+generates two blank lines.
+
+The @code{@@sp} command is most often used in the title page.@refill
+
+@ignore
+@c node br, page, sp, Breaks
+@comment node-name, next, previous, up
+@c section @code{@@br}: Generate Paragraph Breaks
+@findex br @r{(paragraph breaks)}
+@cindex Paragraph breaks
+@cindex Breaks in a paragraph
+
+The @code{@@br} command forces a paragraph break. It inserts a blank
+line. You can use the command within or at the end of a line. If
+used within a line, the @code{@@br@{@}} command must be followed by
+left and right braces (as shown here) to mark the end of the
+command.@refill
+
+@need 700
+For example,
+
+@example
+@group
+This line @@br@{@}contains and is ended by paragraph breaks@@br
+and is followed by another line.
+@end group
+@end example
+
+@noindent
+produces
+
+@example
+@group
+This line
+
+contains and is ended by paragraph breaks
+
+and is followed by another line.
+@end group
+@end example
+
+The @code{@@br} command is seldom used.
+@end ignore
+
+
+@node page
+@section @code{@@page}: Start a New Page
+@cindex Page breaks
+@findex page
+
+A line containing only @code{@@page} starts a new page in a printed
+manual. The command has no effect on Info files since they are not
+paginated. An @code{@@page} command is often used in the @code{@@titlepage}
+section of a Texinfo file to start the copyright page.
+
+
+@node group
+@comment node-name, next, previous, up
+@section @code{@@group}: Prevent Page Breaks
+@cindex Group (hold text together vertically)
+@cindex Holding text together vertically
+@cindex Vertically holding text together
+@findex group
+
+The @code{@@group} command (on a line by itself) is used inside an
+@code{@@example} or similar construct to begin an unsplittable vertical
+group, which will appear entirely on one page in the printed output.
+The group is terminated by a line containing only @code{@@end group}.
+These two lines produce no output of their own, and in the Info file
+output they have no effect at all.@refill
+
+@c Once said that these environments
+@c turn off vertical spacing between ``paragraphs''.
+@c Also, quotation used to work, but doesn't in texinfo-2.72
+Although @code{@@group} would make sense conceptually in a wide
+variety of contexts, its current implementation works reliably only
+within @code{@@example} and variants, and within @code{@@display},
+@code{@@format}, @code{@@flushleft} and @code{@@flushright}.
+@xref{Quotations and Examples}. (What all these commands have in
+common is that each line of input produces a line of output.) In
+other contexts, @code{@@group} can cause anomalous vertical
+spacing.@refill
+
+@need 750
+This formatting requirement means that you should write:
+
+@example
+@group
+@@example
+@@group
+@dots{}
+@@end group
+@@end example
+@end group
+@end example
+
+@noindent
+with the @code{@@group} and @code{@@end group} commands inside the
+@code{@@example} and @code{@@end example} commands.
+
+The @code{@@group} command is most often used to hold an example
+together on one page. In this Texinfo manual, more than 100 examples
+contain text that is enclosed between @code{@@group} and @code{@@end
+group}.
+
+If you forget to end a group, you may get strange and unfathomable
+error messages when you run @TeX{}. This is because @TeX{} keeps
+trying to put the rest of the Texinfo file onto the one page and does
+not start to generate error messages until it has processed
+considerable text. It is a good rule of thumb to look for a missing
+@code{@@end group} if you get incomprehensible error messages in
+@TeX{}.@refill
+
+@node need
+@comment node-name, next, previous, up
+@section @code{@@need @var{mils}}: Prevent Page Breaks
+@cindex Need space at page bottom
+@findex need
+
+A line containing only @code{@@need @var{n}} starts
+a new page in a printed manual if fewer than @var{n} mils (thousandths
+of an inch) remain on the current page. Do not use
+braces around the argument @var{n}. The @code{@@need} command has no
+effect on Info files since they are not paginated.@refill
+
+@need 800
+This paragraph is preceded by an @code{@@need} command that tells
+@TeX{} to start a new page if fewer than 800 mils (eight-tenths
+inch) remain on the page. It looks like this:@refill
+
+@example
+@group
+@@need 800
+This paragraph is preceded by @dots{}
+@end group
+@end example
+
+The @code{@@need} command is useful for preventing orphans (single
+lines at the bottoms of printed pages).@refill
+
+
+@node Definition Commands
+@chapter Definition Commands
+@cindex Definition commands
+
+The @code{@@deffn} command and the other @dfn{definition commands}
+enable you to describe functions, variables, macros, commands, user
+options, special forms and other such artifacts in a uniform
+format.@refill
+
+In the Info file, a definition causes the entity
+category---`Function', `Variable', or whatever---to appear at the
+beginning of the first line of the definition, followed by the
+entity's name and arguments. In the printed manual, the command
+causes @TeX{} to print the entity's name and its arguments on the left
+margin and print the category next to the right margin. In both
+output formats, the body of the definition is indented. Also, the
+name of the entity is entered into the appropriate index:
+@code{@@deffn} enters the name into the index of functions,
+@code{@@defvr} enters it into the index of variables, and so
+on (@pxref{Predefined Indices}).
+
+A manual need not and should not contain more than one definition for
+a given name. An appendix containing a summary should use
+@code{@@table} rather than the definition commands.@refill
+
+@menu
+* Def Cmd Template:: Writing descriptions using definition commands.
+* Def Cmd Continuation Lines:: Continuing the heading over source lines.
+* Optional Arguments:: Handling optional and repeated arguments.
+* deffnx:: Group two or more `first' lines.
+* Def Cmds in Detail:: Reference for all the definition commands.
+* Def Cmd Conventions:: Conventions for writing definitions.
+* Sample Function Definition:: An example.
+@end menu
+
+
+@node Def Cmd Template
+@section The Template for a Definition
+@cindex Definition template
+@cindex Template for a definition
+
+The @code{@@deffn} command is used for definitions of entities that
+resemble functions. To write a definition using the @code{@@deffn}
+command, write the @code{@@deffn} command at the beginning of a line
+and follow it on the same line by the category of the entity, the name
+of the entity itself, and its arguments (if any). Then write the body
+of the definition on succeeding lines. (You may embed examples in the
+body.) Finally, end the definition with an @code{@@end deffn} command
+written on a line of its own.
+
+The other definition commands follow the same format: a line with the
+@code{@@def@dots{}} command and whatever arguments are appropriate for
+that command; the body of the definition; and a corresponding
+@code{@@end} line.
+
+The template for a definition looks like this:
+
+@example
+@group
+@@deffn @var{category} @var{name} @var{arguments}@dots{}
+@var{body-of-definition}
+@@end deffn
+@end group
+@end example
+
+@need 700
+@noindent
+For example,
+
+@example
+@group
+@@deffn Command forward-word count
+This command moves point forward @@var@{count@} words
+(or backward if @@var@{count@} is negative). @dots{}
+@@end deffn
+@end group
+@end example
+
+@noindent
+produces
+
+@quotation
+@deffn Command forward-word count
+This function moves point forward @var{count} words
+(or backward if @var{count} is negative). @dots{}
+@end deffn
+@end quotation
+
+Capitalize the category name like a title. If the name of the
+category contains spaces, as in the phrase `Interactive Command',
+enclose it in braces. For example:
+
+@example
+@group
+@@deffn @{Interactive Command@} isearch-forward
+@dots{}
+@@end deffn
+@end group
+@end example
+
+@noindent
+Otherwise, the second word will be mistaken for the name of the
+entity. As a general rule, when any of the arguments in the heading
+line @emph{except} the last one are more than one word, you need to
+enclose them in braces.
+
+Some of the definition commands are more general than others. The
+@code{@@deffn} command, for example, is the general definition command
+for functions and the like---for entities that may take arguments.
+When you use this command, you specify the category to which the
+entity belongs. Three predefined, specialized variations
+(@code{@@defun}, @code{@@defmac}, and @code{@@defspec}) specify the
+category for you: ``Function'', ``Macro'', and ``Special Form''
+respectively. (In Lisp, a special form is an entity much like a
+function.) Similarly, the general @code{@@defvr} command is
+accompanied by several specialized variations for describing
+particular kinds of variables.
+
+@xref{Sample Function Definition}, for a detailed example of a
+function definition, including the use of @code{@@example} inside the
+definition.
+
+@cindex Macros in definition commands
+Unfortunately, due to implementation difficulties, macros are not expanded
+in @code{@@deffn} and all the other definition commands.
+
+
+@node Def Cmd Continuation Lines
+@section Definition Command Continuation Lines
+@cindex Continuation lines in definition commands
+@cindex Definition command headings, continuing
+@cindex @samp{@@} as continuation in definition commands
+
+The heading line of a definition command can get very long.
+Therefore, Texinfo has a special syntax allowing them to be continued
+over multiple lines of the source file: a lone @samp{@@} at the end of
+each line to be continued. Here's an example:
+
+@example
+@@defun fn-name @@
+ arg1 arg2 arg3
+This is the basic continued defun.
+@@end defun
+@end example
+
+@noindent produces:
+
+@defun fn-name @
+ arg1 arg2 arg3
+This is the basic continued defun.
+@end defun
+
+@noindent
+As you can see, the continued lines are combined, as if they had been
+typed on one source line.
+
+Although this example only shows a one-line continuation,
+continuations may extend over any number of lines; simply put an
+@code{@@} at the end of each line to be continued.
+
+The @code{@@} character does not have to be the last character on the
+physical line: whitespace is allowed (and ignored) afterwards.
+
+@cindex Whitespace, collapsed around continuations
+@cindex Collapsing whitespace around continuations
+In general, any number of spaces or tabs around the @code{@@}
+continuation character, both on the line with the @code{@@} and on the
+continued line, are collapsed into a single space. There is one
+exception: the Texinfo processors will not fully collapse whitespace
+around a continuation inside braces. For example:
+
+@example
+@@deffn @{Category @@
+ Name@} @dots{}
+@end example
+
+@noindent The output (not shown) has excess space between `Category'
+and `Name'. In this case, simply elide any unwanted whitespace in
+your input, or put the continuation @code{@@} outside braces.
+
+@code{@@} does not (currently) function as a continuation character in
+@emph{any} other context. Ordinarily, @samp{@@} followed by a
+whitespace character (space, tab, newline) produces a normal interword
+space (@pxref{Multiple Spaces}).
+
+
+@node Optional Arguments
+@section Optional and Repeated Arguments
+@cindex Optional and repeated arguments
+@cindex Repeated and optional arguments
+@cindex Arguments, repeated and optional
+@cindex Syntax, optional & repeated arguments
+@cindex Meta-syntactic chars for arguments
+
+Some entities take optional or repeated arguments, which may be
+specified by a distinctive glyph that uses square brackets and
+ellipses. For @w{example}, a special form often breaks its argument list
+into separate arguments in more complicated ways than a
+straightforward function.
+
+@c This is consistent with Emacs Lisp Reference manual
+An argument enclosed within square brackets is optional.
+Thus, [@var{optional-arg}] means that @var{optional-arg} is optional.
+An argument followed by an ellipsis is optional
+and may be repeated more than once.
+@c This is consistent with Emacs Lisp Reference manual
+Thus, @var{repeated-args}@samp{@dots{}} stands for zero or more
+arguments. Parentheses are used when several arguments are grouped
+into additional levels of list structure in Lisp.
+
+Here is the @code{@@defspec} line of an example of an imaginary
+special form:
+
+@quotation
+@defspec foobar (@var{var} [@var{from} @var{to} [@var{inc}]]) @var{body}@dots{}
+@end defspec
+@tex
+\vskip \parskip
+@end tex
+@end quotation
+
+@noindent
+In this example, the arguments @var{from} and @var{to} are optional,
+but must both be present or both absent. If they are present,
+@var{inc} may optionally be specified as well. These arguments are
+grouped with the argument @var{var} into a list, to distinguish them
+from @var{body}, which includes all remaining elements of the
+form.@refill
+
+In a Texinfo source file, this @code{@@defspec} line is written like
+this (except it would not be split over two lines, as it is in this
+example).@refill
+
+@example
+@group
+@@defspec foobar (@@var@{var@} [@@var@{from@} @@var@{to@}
+ [@@var@{inc@}]]) @@var@{body@}@@dots@{@}
+@end group
+@end example
+
+@noindent
+The function is listed in the Command and Variable Index under
+@samp{foobar}.@refill
+
+
+@node deffnx
+@section Two or More `First' Lines
+@cindex Two `First' Lines for @code{@@deffn}
+@cindex Grouping two definitions together
+@cindex Definitions grouped together
+@findex deffnx
+
+To create two or more `first' or header lines for a definition, follow
+the first @code{@@deffn} line by a line beginning with @code{@@deffnx}.
+The @code{@@deffnx} command works exactly like @code{@@deffn}
+except that it does not generate extra vertical white space between it
+and the preceding line.@refill
+
+@need 1000
+For example,
+
+@example
+@group
+@@deffn @{Interactive Command@} isearch-forward
+@@deffnx @{Interactive Command@} isearch-backward
+These two search commands are similar except @dots{}
+@@end deffn
+@end group
+@end example
+
+@noindent
+produces
+
+@deffn {Interactive Command} isearch-forward
+@deffnx {Interactive Command} isearch-backward
+These two search commands are similar except @dots{}
+@end deffn
+
+Each definition command has an `x' form: @code{@@defunx},
+@code{@@defvrx}, @code{@@deftypefunx}, etc.
+
+The `x' forms work similarly to @code{@@itemx} (@pxref{itemx}).
+
+
+@node Def Cmds in Detail
+@section The Definition Commands
+
+Texinfo provides more than a dozen definition commands, all of which
+are described in this section.@refill
+
+The definition commands automatically enter the name of the entity in
+the appropriate index: for example, @code{@@deffn}, @code{@@defun},
+and @code{@@defmac} enter function names in the index of functions;
+@code{@@defvr} and @code{@@defvar} enter variable names in the index
+of variables.@refill
+
+Although the examples that follow mostly illustrate Lisp, the commands
+can be used for other programming languages.@refill
+
+@menu
+* Functions Commands:: Commands for functions and similar entities.
+* Variables Commands:: Commands for variables and similar entities.
+* Typed Functions:: Commands for functions in typed languages.
+* Typed Variables:: Commands for variables in typed languages.
+* Data Types:: The definition command for data types.
+* Abstract Objects:: Commands for object-oriented programming.
+@end menu
+
+@node Functions Commands
+@subsection Functions and Similar Entities
+
+This section describes the commands for describing functions and similar
+entities:@refill
+
+@table @code
+@findex deffn
+@item @@deffn @var{category} @var{name} @var{arguments}@dots{}
+The @code{@@deffn} command is the general definition command for
+functions, interactive commands, and similar entities that may take
+arguments. You must choose a term to describe the category of entity
+being defined; for example, ``Function'' could be used if the entity is
+a function. The @code{@@deffn} command is written at the beginning of a
+line and is followed on the same line by the category of entity being
+described, the name of this particular entity, and its arguments, if
+any. Terminate the definition with @code{@@end deffn} on a line of its
+own.@refill
+
+@need 750
+For example, here is a definition:
+
+@example
+@group
+@@deffn Command forward-char nchars
+Move point forward @@var@{nchars@} characters.
+@@end deffn
+@end group
+@end example
+
+@noindent
+This shows a rather terse definition for a ``command'' named
+@code{forward-char} with one argument, @var{nchars}.
+
+@code{@@deffn} and prints argument names such as @var{nchars} in slanted
+type in the printed output, because we think of these names as
+metasyntactic variables---they stand for the actual argument values.
+Within the text of the description, however, write an argument name
+explicitly with @code{@@var} to refer to the value of the argument.
+In the example above, we used @samp{@@var@{nchars@}} in this way.
+
+In the unusual case when an argument name contains @samp{--}, or
+another character sequence which is treated specially
+(@pxref{Conventions}), use @code{@@var} around the argument. This
+causes the name to be printed in slanted typewriter, instead of the
+regular slanted font, exactly as input.
+@c except for ?` and !`, but we won't explain that.
+
+The template for @code{@@deffn} is:
+
+@example
+@group
+@@deffn @var{category} @var{name} @var{arguments}@dots{}
+@var{body-of-definition}
+@@end deffn
+@end group
+@end example
+
+@findex defun
+@item @@defun @var{name} @var{arguments}@dots{}
+The @code{@@defun} command is the definition command for functions.
+@code{@@defun} is equivalent to @samp{@@deffn Function @dots{}}.
+Terminate the definition with @code{@@end defun} on a line of its own.
+Thus, the template is:
+
+@example
+@group
+@@defun @var{function-name} @var{arguments}@dots{}
+@var{body-of-definition}
+@@end defun
+@end group
+@end example
+
+@findex defmac
+@item @@defmac @var{name} @var{arguments}@dots{}
+The @code{@@defmac} command is the definition command for macros.
+@code{@@defmac} is equivalent to @samp{@@deffn Macro @dots{}} and
+works like @code{@@defun}.
+
+@findex defspec
+@item @@defspec @var{name} @var{arguments}@dots{}
+The @code{@@defspec} command is the definition command for special
+forms. (In Lisp, a special form is an entity much like a function,
+@pxref{Special Forms,,, elisp, GNU Emacs Lisp Reference Manual}.)
+@code{@@defspec} is equivalent to @samp{@@deffn @{Special Form@}
+@dots{}} and works like @code{@@defun}.
+@end table
+
+All these commands create entries in the index of functions.
+
+
+@node Variables Commands
+@subsection Variables and Similar Entities
+
+Here are the commands for defining variables and similar
+entities:@refill
+
+@table @code
+@findex defvr
+@item @@defvr @var{category} @var{name}
+The @code{@@defvr} command is a general definition command for
+something like a variable---an entity that records a value. You must
+choose a term to describe the category of entity being defined; for
+example, ``Variable'' could be used if the entity is a variable.
+Write the @code{@@defvr} command at the beginning of a line and
+follow it on the same line by the category of the entity and the
+name of the entity.
+
+Capitalize the category name like a title. If the name of the category
+contains spaces, as in the name ``User Option'', enclose it in braces.
+Otherwise, the second word will be mistaken for the name of the entity.
+For example,
+
+@example
+@group
+@@defvr @{User Option@} fill-column
+This buffer-local variable specifies
+the maximum width of filled lines.
+@dots{}
+@@end defvr
+@end group
+@end example
+
+Terminate the definition with @code{@@end defvr} on a line of its
+own.@refill
+
+The template is:
+
+@example
+@group
+@@defvr @var{category} @var{name}
+@var{body-of-definition}
+@@end defvr
+@end group
+@end example
+
+@code{@@defvr} creates an entry in the index of variables for @var{name}.
+
+@findex defvar
+@item @@defvar @var{name}
+The @code{@@defvar} command is the definition command for variables.
+@code{@@defvar} is equivalent to @samp{@@defvr Variable
+@dots{}}.@refill
+
+@need 750
+For example:
+
+@example
+@group
+@@defvar kill-ring
+@dots{}
+@@end defvar
+@end group
+@end example
+
+The template is:
+
+@example
+@group
+@@defvar @var{name}
+@var{body-of-definition}
+@@end defvar
+@end group
+@end example
+
+@code{@@defvar} creates an entry in the index of variables for
+@var{name}.@refill
+
+@findex defopt
+@item @@defopt @var{name}
+@cindex User options, marking
+The @code{@@defopt} command is the definition command for @dfn{user
+options}, i.e., variables intended for users to change according to
+taste; Emacs has many such (@pxref{Variables,,, emacs, The GNU Emacs
+Manual}). @code{@@defopt} is equivalent to @samp{@@defvr @{User
+Option@} @dots{}} and works like @code{@@defvar}. It creates an entry
+in the index of variables.
+@end table
+
+
+@node Typed Functions
+@subsection Functions in Typed Languages
+
+The @code{@@deftypefn} command and its variations are for describing
+functions in languages in which you must declare types of variables and
+functions, such as C and C++.
+
+@table @code
+@findex deftypefn
+@item @@deftypefn @var{category} @var{data-type} @var{name} @var{arguments}@dots{}
+The @code{@@deftypefn} command is the general definition command for
+functions and similar entities that may take arguments and that are
+typed. The @code{@@deftypefn} command is written at the beginning of
+a line and is followed on the same line by the category of entity
+being described, the type of the returned value, the name of this
+particular entity, and its arguments, if any.@refill
+
+@need 800
+@noindent
+For example,
+
+@example
+@group
+@@deftypefn @{Library Function@} int foobar
+ (int @@var@{foo@}, float @@var@{bar@})
+@dots{}
+@@end deftypefn
+@end group
+@end example
+
+@need 1000
+@noindent
+(where the text before the ``@dots{}'', shown above as two lines, would
+actually be a single line in a real Texinfo file) produces the following
+in Info:
+
+@smallexample
+@group
+-- Library Function: int foobar (int FOO, float BAR)
+@dots{}
+@end group
+@end smallexample
+@iftex
+
+In a printed manual, it produces:
+
+@quotation
+@deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+@dots{}
+@end deftypefn
+@end quotation
+@end iftex
+
+This means that @code{foobar} is a ``library function'' that returns an
+@code{int}, and its arguments are @var{foo} (an @code{int}) and
+@var{bar} (a @code{float}).@refill
+
+Since in typed languages, the actual names of the arguments are
+typically scattered among data type names and keywords, Texinfo cannot
+find them without help. You can either (a)@tie{}write everything
+as straight text, and it will be printed in slanted type; (b)@tie{}use
+@code{@@var} for the variable names, which will uppercase the
+variable names in Info and use the slanted typewriter font in printed
+output; (c)@tie{}use @code{@@var} for the variable names and
+@code{@@code} for the type names and keywords, which will be dutifully
+obeyed.
+
+The template for @code{@@deftypefn} is:@refill
+
+@example
+@group
+@@deftypefn @var{category} @var{data-type} @var{name} @var{arguments} @dots{}
+@var{body-of-description}
+@@end deftypefn
+@end group
+@end example
+
+@noindent
+Note that if the @var{category} or @var{data type} is more than one
+word then it must be enclosed in braces to make it a single argument.@refill
+
+If you are describing a procedure in a language that has packages,
+such as Ada, you might consider using @code{@@deftypefn} in a manner
+somewhat contrary to the convention described in the preceding
+paragraphs. For example:
+
+@example
+@group
+@@deftypefn stacks private push @@
+ (@@var@{s@}:in out stack; @@
+ @@var@{n@}:in integer)
+@dots{}
+@@end deftypefn
+@end group
+@end example
+
+@noindent
+(The @code{@@deftypefn} arguments are shown using continuations
+(@pxref{Def Cmd Continuation Lines}), but could be on a single line in
+a real Texinfo file.)
+
+In this instance, the procedure is classified as belonging to the
+package @code{stacks} rather than classified as a `procedure' and its
+data type is described as @code{private}. (The name of the procedure
+is @code{push}, and its arguments are @var{s} and @var{n}.)@refill
+
+@code{@@deftypefn} creates an entry in the index of functions for
+@var{name}.
+
+@item @@deftypefun @var{data-type} @var{name} @var{arguments}@dots{}
+@findex deftypefun
+The @code{@@deftypefun} command is the specialized definition command
+for functions in typed languages. The command is equivalent to
+@samp{@@deftypefn Function @dots{}}. The template is:
+
+@example
+@group
+@@deftypefun @var{type} @var{name} @var{arguments}@dots{}
+@var{body-of-description}
+@@end deftypefun
+@end group
+@end example
+
+@code{@@deftypefun} creates an entry in the index of functions for
+@var{name}.
+
+@end table
+
+
+@node Typed Variables
+@subsection Variables in Typed Languages
+
+Variables in typed languages are handled in a manner similar to
+functions in typed languages. @xref{Typed Functions}. The general
+definition command @code{@@deftypevr} corresponds to
+@code{@@deftypefn} and the specialized definition command
+@code{@@deftypevar} corresponds to @code{@@deftypefun}.@refill
+
+@table @code
+@findex deftypevr
+@item @@deftypevr @var{category} @var{data-type} @var{name}
+The @code{@@deftypevr} command is the general definition command for
+something like a variable in a typed language---an entity that records
+a value. You must choose a term to describe the category of the
+entity being defined; for example, ``Variable'' could be used if the
+entity is a variable.@refill
+
+The @code{@@deftypevr} command is written at the beginning of a line
+and is followed on the same line by the category of the entity
+being described, the data type, and the name of this particular
+entity.@refill
+
+@need 800
+@noindent
+For example:
+
+@example
+@group
+@@deftypevr @{Global Flag@} int enable
+@dots{}
+@@end deftypevr
+@end group
+@end example
+
+@noindent
+produces the following in Info:
+
+@example
+@group
+-- Global Flag: int enable
+@dots{}
+@end group
+@end example
+@iftex
+
+@noindent
+and the following in a printed manual:
+
+@quotation
+@deftypevr {Global Flag} int enable
+@dots{}
+@end deftypevr
+@end quotation
+@end iftex
+
+@need 800
+The template is:
+
+@example
+@@deftypevr @var{category} @var{data-type} @var{name}
+@var{body-of-description}
+@@end deftypevr
+@end example
+
+@findex deftypevar
+@item @@deftypevar @var{data-type} @var{name}
+The @code{@@deftypevar} command is the specialized definition command
+for variables in typed languages. @code{@@deftypevar} is equivalent
+to @samp{@@deftypevr Variable @dots{}}. The template is:
+
+@example
+@group
+@@deftypevar @var{data-type} @var{name}
+@var{body-of-description}
+@@end deftypevar
+@end group
+@end example
+@end table
+
+These commands create entries in the index of variables.
+
+@node Data Types
+@subsection Data Types
+
+Here is the command for data types:@refill
+
+@table @code
+@findex deftp
+@item @@deftp @var{category} @var{name} @var{attributes}@dots{}
+The @code{@@deftp} command is the generic definition command for data
+types. The command is written at the beginning of a line and is
+followed on the same line by the category, by the name of the type
+(which is a word like @code{int} or @code{float}), and then by names of
+attributes of objects of that type. Thus, you could use this command
+for describing @code{int} or @code{float}, in which case you could use
+@code{data type} as the category. (A data type is a category of
+certain objects for purposes of deciding which operations can be
+performed on them.)@refill
+
+In Lisp, for example, @dfn{pair} names a particular data
+type, and an object of that type has two slots called the
+@sc{car} and the @sc{cdr}. Here is how you would write the first line
+of a definition of @code{pair}.@refill
+
+@example
+@group
+@@deftp @{Data type@} pair car cdr
+@dots{}
+@@end deftp
+@end group
+@end example
+
+@need 950
+The template is:
+
+@example
+@group
+@@deftp @var{category} @var{name-of-type} @var{attributes}@dots{}
+@var{body-of-definition}
+@@end deftp
+@end group
+@end example
+
+@code{@@deftp} creates an entry in the index of data types.
+@end table
+
+
+@node Abstract Objects
+@subsection Object-Oriented Programming
+
+@cindex Object-oriented programming
+
+Here are the commands for formatting descriptions about abstract
+objects, such as are used in object-oriented programming. A class is
+a defined type of abstract object. An instance of a class is a
+particular object that has the type of the class. An instance
+variable is a variable that belongs to the class but for which each
+instance has its own value.
+
+@menu
+* Variables: Object-Oriented Variables.
+* Methods: Object-Oriented Methods.
+@end menu
+
+
+@node Object-Oriented Variables
+@subsubsection Object-Oriented Variables
+
+@cindex Variables, object-oriented
+
+These commands allow you to define different sorts of variables in
+object-oriented programming languages.
+
+@table @code
+@item @@defcv @var{category} @var{class} @var{name}
+@findex defcv
+The @code{@@defcv} command is the general definition command for
+variables associated with classes in object-oriented programming. The
+@code{@@defcv} command is followed by three arguments: the category of
+thing being defined, the class to which it belongs, and its
+name. For instance:
+
+@example
+@group
+@@defcv @{Class Option@} Window border-pattern
+@dots{}
+@@end defcv
+@end group
+@end example
+
+@noindent produces:
+@defcv {Class Option} Window border-pattern
+@dots{}
+@end defcv
+
+@code{@@defcv} creates an entry in the index of variables.
+
+@item @@deftypecv @var{category} @var{class} @var{data-type} @var{name}
+@findex deftypecv
+The @code{@@deftypecv} command is the definition command for typed
+class variables in object-oriented programming. It is analogous to
+@code{@@defcv} with the addition of the @var{data-type} parameter to
+specify the type of the instance variable. Ordinarily, the data type
+is a programming language construct that should be marked with
+@code{@@code}. For instance:
+
+@example
+@group
+@@deftypecv @{Class Option@} Window @@code@{int@} border-pattern
+@dots{}
+@@end deftypecv
+@end group
+@end example
+
+@noindent produces:
+
+@deftypecv {Class Option} Window @code{int} border-pattern
+@dots{}
+@end deftypecv
+
+@code{@@deftypecv} creates an entry in the index of variables.
+
+@item @@defivar @var{class} @var{name}
+@findex defivar
+The @code{@@defivar} command is the definition command for instance
+variables in object-oriented programming. @code{@@defivar} is
+equivalent to @samp{@@defcv @{Instance Variable@} @dots{}}. For
+instance:
+
+@example
+@group
+@@defivar Window border-pattern
+@dots{}
+@@end defivar
+@end group
+@end example
+
+@noindent produces:
+
+@defivar Window border-pattern
+@dots{}
+@end defivar
+
+@code{@@defivar} creates an entry in the index of variables.
+
+@item @@deftypeivar @var{class} @var{data-type} @var{name}
+@findex deftypeivar
+The @code{@@deftypeivar} command is the definition command for typed
+instance variables in object-oriented programming. It is analogous to
+@code{@@defivar} with the addition of the @var{data-type} parameter to
+specify the type of the instance variable. Ordinarily, the data type
+is a programming language construct that should be marked with
+@code{@@code}. For instance:
+
+@example
+@group
+@@deftypeivar Window @@code@{int@} border-pattern
+@dots{}
+@@end deftypeivar
+@end group
+@end example
+
+@noindent produces:
+
+@deftypeivar Window @code{int} border-pattern
+@dots{}
+@end deftypeivar
+
+@code{@@deftypeivar} creates an entry in the index of variables.
+
+@end table
+
+@node Object-Oriented Methods
+@subsubsection Object-Oriented Methods
+
+@cindex Methods, object-oriented
+
+These commands allow you to define different sorts of function-like
+entities resembling methods in object-oriented programming languages.
+These entities take arguments, as functions do, but are associated with
+particular classes of objects.
+
+@table @code
+
+@findex defop
+@item @@defop @var{category} @var{class} @var{name} @var{arguments}@dots{}
+The @code{@@defop} command is the general definition command for these
+method-like entities.
+
+For example, some systems have constructs called @dfn{wrappers} that
+are associated with classes as methods are, but that act more like
+macros than like functions. You could use @code{@@defop Wrapper} to
+describe one of these.@refill
+
+Sometimes it is useful to distinguish methods and @dfn{operations}.
+You can think of an operation as the specification for a method.
+Thus, a window system might specify that all window classes have a
+method named @code{expose}; we would say that this window system
+defines an @code{expose} operation on windows in general. Typically,
+the operation has a name and also specifies the pattern of arguments;
+all methods that implement the operation must accept the same
+arguments, since applications that use the operation do so without
+knowing which method will implement it.@refill
+
+Often it makes more sense to document operations than methods. For
+example, window application developers need to know about the
+@code{expose} operation, but need not be concerned with whether a
+given class of windows has its own method to implement this operation.
+To describe this operation, you would write:@refill
+
+@example
+@@defop Operation windows expose
+@end example
+
+The @code{@@defop} command is written at the beginning of a line and
+is followed on the same line by the overall name of the category of
+operation, the name of the class of the operation, the name of the
+operation, and its arguments, if any.@refill
+
+The template is:
+@example
+@group
+@@defop @var{category} @var{class} @var{name} @var{arguments}@dots{}
+@var{body-of-definition}
+@@end defop
+@end group
+@end example
+
+@code{@@defop} creates an entry, such as `@code{expose} on
+@code{windows}', in the index of functions.@refill
+
+@findex deftypeop
+@item @@deftypeop @var{category} @var{class} @var{data-type} @var{name} @var{arguments}@dots{}
+The @code{@@deftypeop} command is the definition command for typed
+operations in object-oriented programming. It is similar to
+@code{@@defop} with the addition of the @var{data-type} parameter to
+specify the return type of the method. @code{@@deftypeop} creates an
+entry in the index of functions.
+
+@item @@defmethod @var{class} @var{name} @var{arguments}@dots{}
+@findex defmethod
+The @code{@@defmethod} command is the definition command for methods
+in object-oriented programming. A method is a kind of function that
+implements an operation for a particular class of objects and its
+subclasses.
+@ignore
+@c ADR: Who cares?!?
+@c KB: Oh, I don't know, I think this info is crucial!
+In the Lisp Machine, methods actually were functions, but
+they were usually defined with @code{defmethod}.
+@end ignore
+
+@code{@@defmethod} is equivalent to @samp{@@defop Method @dots{}}.
+The command is written at the beginning of a line and is followed by
+the name of the class of the method, the name of the method, and its
+arguments, if any.@refill
+
+@noindent
+For example:
+@example
+@group
+@@defmethod @code{bar-class} bar-method argument
+@dots{}
+@@end defmethod
+@end group
+@end example
+
+@noindent
+illustrates the definition for a method called @code{bar-method} of
+the class @code{bar-class}. The method takes an argument.
+
+@code{@@defmethod} creates an entry in the index of functions.
+
+@item @@deftypemethod @var{class} @var{data-type} @var{name} @var{arguments}@dots{}
+@findex defmethod
+The @code{@@deftypemethod} command is the definition command for methods
+in object-oriented typed languages, such as C++ and Java. It is similar
+to the @code{@@defmethod} command with the addition of the
+@var{data-type} parameter to specify the return type of the method.
+@code{@@deftypemethod} creates an entry in the index of functions.
+
+@end table
+
+
+@node Def Cmd Conventions
+@section Conventions for Writing Definitions
+@cindex Definition conventions
+@cindex Conventions for writing definitions
+
+When you write a definition using @code{@@deffn}, @code{@@defun}, or
+one of the other definition commands, please take care to use
+arguments that indicate the meaning, as with the @var{count} argument
+to the @code{forward-word} function. Also, if the name of an argument
+contains the name of a type, such as @var{integer}, take care that the
+argument actually is of that type.@refill
+
+
+@node Sample Function Definition
+@section A Sample Function Definition
+@cindex Function definitions
+@cindex Command definitions
+@cindex Macro definitions
+@cindex Sample function definition
+
+A function definition uses the @code{@@defun} and @code{@@end defun}
+commands. The name of the function follows immediately after the
+@code{@@defun} command and it is followed, on the same line, by the
+parameter list.@refill
+
+Here is a definition from @ref{Calling Functions,,, elisp, The GNU Emacs
+Lisp Reference Manual}.
+
+@quotation
+@defun apply function &rest arguments
+@code{apply} calls @var{function} with @var{arguments}, just
+like @code{funcall} but with one difference: the last of
+@var{arguments} is a list of arguments to give to
+@var{function}, rather than a single argument. We also say
+that this list is @dfn{appended} to the other arguments.
+
+@code{apply} returns the result of calling @var{function}.
+As with @code{funcall}, @var{function} must either be a Lisp
+function or a primitive function; special forms and macros
+do not make sense in @code{apply}.
+
+@example
+(setq f 'list)
+ @result{} list
+(apply f 'x 'y 'z)
+@error{} Wrong type argument: listp, z
+(apply '+ 1 2 '(3 4))
+ @result{} 10
+(apply '+ '(1 2 3 4))
+ @result{} 10
+
+(apply 'append '((a b c) nil (x y z) nil))
+ @result{} (a b c x y z)
+@end example
+
+An interesting example of using @code{apply} is found in the description
+of @code{mapcar}.@refill
+@end defun
+@end quotation
+
+@need 1200
+In the Texinfo source file, this example looks like this:
+
+@example
+@group
+@@defun apply function &rest arguments
+@@code@{apply@} calls @@var@{function@} with
+@@var@{arguments@}, just like @@code@{funcall@} but with one
+difference: the last of @@var@{arguments@} is a list of
+arguments to give to @@var@{function@}, rather than a single
+argument. We also say that this list is @@dfn@{appended@}
+to the other arguments.
+@end group
+
+@group
+@@code@{apply@} returns the result of calling
+@@var@{function@}. As with @@code@{funcall@},
+@@var@{function@} must either be a Lisp function or a
+primitive function; special forms and macros do not make
+sense in @@code@{apply@}.
+@end group
+
+@group
+@@example
+(setq f 'list)
+ @@result@{@} list
+(apply f 'x 'y 'z)
+@@error@{@} Wrong type argument: listp, z
+(apply '+ 1 2 '(3 4))
+ @@result@{@} 10
+(apply '+ '(1 2 3 4))
+ @@result@{@} 10
+
+(apply 'append '((a b c) nil (x y z) nil))
+ @@result@{@} (a b c x y z)
+@@end example
+@end group
+
+@group
+An interesting example of using @@code@{apply@} is found
+in the description of @@code@{mapcar@}.
+@@end defun
+@end group
+@end example
+
+@noindent
+In this manual, this function is listed in the Command and Variable
+Index under @code{apply}.@refill
+
+Ordinary variables and user options are described using a format like
+that for functions except that variables do not take arguments.
+
+
+@node Conditionals
+@chapter Conditionally Visible Text
+@cindex Conditionally visible text
+@cindex Text, conditionally visible
+@cindex Visibility of conditional text
+@cindex If text conditionally visible
+
+The @dfn{conditional commands} allow you to use different text for
+different output formats, or for general conditions that you define.
+For example, you can use them to specify different text for the
+printed manual and the Info output.
+
+The conditional commands comprise the following categories.
+
+@itemize @bullet
+@item
+Commands specific to an output format (Info, @TeX{}, HTML, @dots{}).
+
+@item
+Commands specific to any output format @emph{other} than a given
+one (not Info, not @TeX{}, @dots{}).
+
+@item
+`Raw' formatter text for any output format, passed straight
+through with no interpretation of @@-commands.
+
+@item
+Format-independent variable substitutions, and testing if a variable
+is set or clear.
+
+@end itemize
+
+@menu
+* Conditional Commands:: Text for a given format.
+* Conditional Not Commands:: Text for any format other than a given one.
+* Raw Formatter Commands:: Using raw formatter commands.
+* set clear value:: Variable tests and substitutions.
+* Conditional Nesting:: Using conditionals inside conditionals.
+@end menu
+
+
+@node Conditional Commands
+@section Conditional Commands
+
+Texinfo has an @code{@@if@var{format}} environment for each output
+format, to allow conditional inclusion of text for a particular output
+format.
+
+@findex ifinfo
+@code{@@ifinfo} begins segments of text that should be ignored by
+@TeX{} when it typesets the printed manual, and by @command{makeinfo}
+when not producing Info output. The segment of text appears only in
+the Info file and, for historical compatibility, the plain text
+output.
+
+@findex ifdocbook
+@findex ifhtml
+@findex ifplaintext
+@findex iftex
+@findex ifxml
+The environments for the other formats are analogous:
+
+@table @code
+@item @@ifdocbook @dots{} @@end ifdocbook
+Text to appear only in the Docbook output.
+
+@item @@ifhtml @dots{} @@end ifhtml
+Text to appear only in the HTML output.
+
+@item @@ifplaintext @dots{} @@end ifplaintext
+Text to appear only in the plain text output.
+
+@item @@iftex @dots{} @@end iftex
+Text to appear only in the printed manual.
+
+@item @@ifxml @dots{} @@end ifxml
+Text to appear only in the XML output.
+@end table
+
+The @code{@@if@dots{}} and @code{@@end if@dots{}} commands must appear
+on lines by themselves in your source file.
+
+Here is an example showing all these conditionals:
+
+@example
+@@iftex
+This text will appear only in the printed manual.
+@@end iftex
+@@ifinfo
+However, this text will appear only in Info and plain text.
+@@end ifinfo
+@@ifhtml
+And this text will only appear in HTML.
+@@end ifhtml
+@@ifplaintext
+Whereas this text will only appear in plain text.
+@@end ifplaintext
+@@ifxml
+Notwithstanding that this will only appear in XML.
+@@end ifxml
+@@ifdocbook
+Nevertheless, this will only appear in Docbook.
+@@end ifdocbook
+@end example
+
+@noindent
+The preceding example produces the following line:
+
+@iftex
+This text will appear only in the printed manual.
+@end iftex
+@ifinfo
+However, this text will appear only in Info and plain text.
+@end ifinfo
+@ifhtml
+And this text will only appear in HTML.
+@end ifhtml
+@ifplaintext
+Whereas this text will only appear in plain text.
+@end ifplaintext
+@ifxml
+Notwithstanding that this will only appear in XML.
+@end ifxml
+@ifdocbook
+Nevertheless, this will only appear in Docbook.
+@end ifdocbook
+
+@noindent
+Notice that you only see one of the input lines, depending on which
+version of the manual you are reading.
+
+
+@node Conditional Not Commands
+@section Conditional Not Commands
+@findex ifnotdocbook
+@findex ifnothtml
+@findex ifnotinfo
+@findex ifnotplaintext
+@findex ifnottex
+@findex ifnotxml
+
+You can specify text to be included in any output format @emph{other}
+than a given one with the @code{@@ifnot@dots{}} environments:
+
+@example
+@@ifnotdocbook @dots{} @@end ifnotdocbook
+@@ifnothtml @dots{} @@end ifnothtml
+@@ifnotinfo @dots{} @@end ifnotinfo
+@@ifnotplaintext @dots{} @@end ifnotplaintext
+@@ifnottex @dots{} @@end ifnottex
+@@ifnotxml @dots{} @@end ifnotxml
+@end example
+
+@noindent
+The @code{@@ifnot@dots{}} command and the @code{@@end} command must
+appear on lines by themselves in your actual source file.
+
+If the output file is being made in the given format, the
+region is @emph{ignored}. Otherwise, it is included.
+
+There is one exception (for historical compatibility):
+@code{@@ifnotinfo} text is omitted for both Info and plain text
+output, not just Info. To specify text which appears only in Info and
+not in plain text, use @code{@@ifnotplaintext}, like this:
+
+@example
+@@ifinfo
+@@ifnotplaintext
+This will be in Info, but not plain text.
+@@end ifnotplaintext
+@@end ifinfo
+@end example
+
+The regions delimited by these commands are ordinary Texinfo source as
+with @code{@@iftex}, not raw formatter source as with @code{@@tex}
+(@pxref{Raw Formatter Commands}).
+
+
+@node Raw Formatter Commands
+@section Raw Formatter Commands
+@cindex Raw formatter commands
+@cindex @TeX{} commands, using ordinary
+@cindex Ordinary @TeX{} commands, using
+@cindex Commands using raw @TeX{}
+@cindex Docbook, including raw
+@cindex HTML, including raw
+@cindex XML, including raw
+@cindex Plain @TeX{}
+
+Inside a region delineated by @code{@@iftex} and @code{@@end iftex},
+you can embed some raw @TeX{} commands. The Texinfo processors will
+ignore such a region unless @TeX{} output is being produced. You can
+write the @TeX{} commands as you would write them in a normal @TeX{}
+file, except that you must replace the @samp{\} used by @TeX{} with an
+@samp{@@}. For example, in the @code{@@titlepage} section of a
+Texinfo file, you can use the @TeX{} command @code{@@vskip} to format
+the copyright page. (The @code{@@titlepage} command causes Info to
+ignore the region automatically, as it does with the @code{@@iftex}
+command.)
+
+However, most features of plain @TeX{} will not work within
+@code{@@iftex}, as they are overridden by Texinfo features. The
+purpose of @code{@@iftex} is to provide conditional processing for the
+Texinfo source, not provide access to underlying formatting features.
+
+@findex tex
+You can enter plain @TeX{} completely, and use @samp{\} in the @TeX{}
+commands, by delineating a region with the @code{@@tex} and @code{@@end
+tex} commands. All plain @TeX{} commands and category codes are
+restored within an @code{@@tex} region. The sole exception is that the
+@code{@@} character still introduces a command, so that @code{@@end tex}
+can be recognized properly. As with @code{@@iftex}, Texinfo
+processors will ignore such a region unless @TeX{} output is being produced.
+
+@findex \gdef @r{within @code{@@tex}}
+In complex cases, you may wish to define new @TeX{} macros within
+@code{@@tex}. You must use @code{\gdef} to do this, not @code{\def},
+because @code{@@tex} regions are processed in a @TeX{} group.
+
+@cindex Mathematical expressions
+As an example, here is a mathematical expression written in plain @TeX{}:
+
+@example
+@@tex
+$$ \chi^2 = \sum_@{i=1@}^N
+ \left (y_i - (a + b x_i)
+ \over \sigma_i\right)^2 $$
+@@end tex
+@end example
+
+@noindent
+The output of this example will appear only in a printed manual. If
+you are reading this in Info, you will not see the equation that appears
+in the printed manual.
+@iftex
+In a printed manual, the above expression looks like
+this:
+@end iftex
+
+@tex
+$$ \chi^2 = \sum_{i=1}^N
+ \left(y_i - (a + b x_i)
+ \over \sigma_i\right)^2 $$
+@end tex
+
+@findex ifhtml
+@findex html
+Analogously, you can use @code{@@ifhtml @dots{} @@end ifhtml} to delimit
+a region to be included in HTML output only, and @code{@@html @dots{}
+@@end html} for a region of raw HTML.
+
+@findex ifxml
+@findex xml
+Likewise, you can use @code{@@ifxml @dots{} @@end ifxml} to delimit
+a region to be included in XML output only, and @code{@@xml @dots{}
+@@end xml} for a region of raw XML.
+
+@findex ifdocbook
+@findex docbook
+Again likewise, you can use @code{@@ifdocbook @dots{} @@end ifdocbook}
+to delimit a region to be included in Docbook output only, and
+@code{@@docbook @dots{} @@end docbook} for a region of raw Docbook.
+
+In all cases, the exception to the raw processing is that @code{@@} is
+still an escape character, so the @code{@@end} command can be
+recognized.
+
+
+@node set clear value
+@section @code{@@set}, @code{@@clear}, and @code{@@value}
+
+You can direct the Texinfo formatting commands to format or ignore parts
+of a Texinfo file with the @code{@@set}, @code{@@clear}, @code{@@ifset},
+and @code{@@ifclear} commands.
+
+Here are brief descriptions of these commands, see the following
+sections for more details:
+
+@table @code
+@item @@set @var{flag} [@var{value}]
+Set the variable @var{flag}, to the optional @var{value} if specifed.
+
+@item @@clear @var{flag}
+Undefine the variable @var{flag}, whether or not it was previously defined.
+
+@item @@ifset @var{flag}
+If @var{flag} is set, text through the next @code{@@end ifset} command
+is formatted. If @var{flag} is clear, text through the following
+@code{@@end ifset} command is ignored.
+
+@item @@ifclear @var{flag}
+If @var{flag} is set, text through the next @code{@@end ifclear} command
+is ignored. If @var{flag} is clear, text through the following
+@code{@@end ifclear} command is formatted.
+@end table
+
+@menu
+* set value:: Expand a flag variable to a string.
+* ifset ifclear:: Format a region if a flag is set.
+* value Example:: An easy way to update edition information.
+@end menu
+
+
+@node set value
+@subsection @code{@@set} and @code{@@value}
+@findex value
+
+You use the @code{@@set} command to specify a value for a flag, which
+is later expanded by the @code{@@value} command.
+
+A @dfn{flag} (aka @dfn{variable}) is an identifier. It is best to use
+only letters and numerals in a flag name, not @samp{-} or
+@samp{_}---they will work in some contexts, but not all, due to
+limitations in @TeX{}.
+
+The value is the remainder of the input line, and can contain anything.
+
+Write the @code{@@set} command like this:
+
+@example
+@@set foo This is a string.
+@end example
+
+@noindent
+This sets the value of the flag @code{foo} to ``This is a string.''.
+
+The Texinfo formatters then replace an @code{@@value@{@var{flag}@}}
+command with the string to which @var{flag} is set. Thus, when
+@code{foo} is set as shown above, the Texinfo formatters convert this:
+
+@example
+@group
+@@value@{foo@}
+@exdent @r{to this:}
+This is a string.
+@end group
+@end example
+
+You can write an @code{@@value} command within a paragraph; but you
+must write an @code{@@set} command on a line of its own.
+
+If you write the @code{@@set} command like this:
+
+@example
+@@set foo
+@end example
+
+@noindent
+without specifying a string, the value of @code{foo} is the empty string.
+
+If you clear a previously set flag with @code{@@clear @var{flag}}, a
+subsequent @code{@@value@{flag@}} command will report an error.
+
+For example, if you set @code{foo} as follows:
+
+@example
+@@set howmuch very, very, very
+@end example
+
+@noindent
+then the formatters transform
+
+@example
+@group
+It is a @@value@{howmuch@} wet day.
+@exdent @r{into}
+It is a very, very, very wet day.
+@end group
+@end example
+
+If you write
+
+@example
+@@clear howmuch
+@end example
+
+@noindent
+then the formatters transform
+
+@example
+@group
+It is a @@value@{howmuch@} wet day.
+@exdent @r{into}
+It is a @{No value for "howmuch"@} wet day.
+@end group
+@end example
+
+
+@node ifset ifclear
+@subsection @code{@@ifset} and @code{@@ifclear}
+
+@findex ifset
+When a @var{flag} is set, the Texinfo formatting commands format text
+between subsequent pairs of @code{@@ifset @var{flag}} and @code{@@end
+ifset} commands. When the @var{flag} is cleared, the Texinfo formatting
+commands do @emph{not} format the text. @code{@@ifclear} operates
+analogously.
+
+Write the conditionally formatted text between @code{@@ifset @var{flag}}
+and @code{@@end ifset} commands, like this:
+
+@example
+@group
+@@ifset @var{flag}
+@var{conditional-text}
+@@end ifset
+@end group
+@end example
+
+For example, you can create one document that has two variants, such as
+a manual for a `large' and `small' model:
+
+@cindex Shrubbery
+@example
+You can use this machine to dig up shrubs
+without hurting them.
+
+@@set large
+
+@@ifset large
+It can also dig up fully grown trees.
+@@end ifset
+
+Remember to replant promptly @dots{}
+@end example
+
+@noindent
+In the example, the formatting commands will format the text between
+@code{@@ifset large} and @code{@@end ifset} because the @code{large}
+flag is set.
+
+When @var{flag} is cleared, the Texinfo formatting commands do
+@emph{not} format the text between @code{@@ifset @var{flag}} and
+@code{@@end ifset}; that text is ignored and does not appear in either
+printed or Info output.
+
+For example, if you clear the flag of the preceding example by writing
+an @code{@@clear large} command after the @code{@@set large} command
+(but before the conditional text), then the Texinfo formatting commands
+ignore the text between the @code{@@ifset large} and @code{@@end ifset}
+commands. In the formatted output, that text does not appear; in both
+printed and Info output, you see only the lines that say, ``You can use
+this machine to dig up shrubs without hurting them. Remember to replant
+promptly @dots{}''.
+
+@findex ifclear
+If a flag is cleared with an @code{@@clear @var{flag}} command, then
+the formatting commands format text between subsequent pairs of
+@code{@@ifclear} and @code{@@end ifclear} commands. But if the flag
+is set with @code{@@set @var{flag}}, then the formatting commands do
+@emph{not} format text between an @code{@@ifclear} and an @code{@@end
+ifclear} command; rather, they ignore that text. An @code{@@ifclear}
+command looks like this:
+
+@example
+@@ifclear @var{flag}
+@end example
+
+
+@node value Example
+@subsection @code{@@value} Example
+
+You can use the @code{@@value} command to minimize the number of
+places you need to change when you record an update to a manual.
+@xref{GNU Sample Texts}, for the full text of an example of using this
+to work with Automake distributions.
+
+This example is adapted from @ref{Top,, Overview, make, The GNU Make
+Manual}.
+
+@enumerate
+@item
+Set the flags:
+
+@example
+@group
+@@set EDITION 0.35 Beta
+@@set VERSION 3.63 Beta
+@@set UPDATED 14 August 1992
+@@set UPDATE-MONTH August 1992
+@end group
+@end example
+
+@item
+Write text for the @code{@@copying} section (@pxref{copying}):
+
+@example
+@group
+@@copying
+This is Edition @@value@{EDITION@},
+last updated @@value@{UPDATED@},
+of @@cite@{The GNU Make Manual@},
+for @@code@{make@}, version @@value@{VERSION@}.
+
+Copyright @dots{}
+
+Permission is granted @dots{}
+@@end copying
+@end group
+@end example
+
+@item
+Write text for the title page, for people reading the printed manual:
+
+@example
+@group
+@@titlepage
+@@title GNU Make
+@@subtitle A Program for Directing Recompilation
+@@subtitle Edition @@value@{EDITION@}, @dots{}
+@@subtitle @@value@{UPDATE-MONTH@}
+@@page
+@@insertcopying
+@dots{}
+@@end titlepage
+@end group
+@end example
+
+@noindent
+(On a printed cover, a date listing the month and the year looks less
+fussy than a date listing the day as well as the month and year.)
+
+@item
+Write text for the Top node, for people reading the Info file:
+
+@example
+@group
+@@ifnottex
+@@node Top
+@@top Make
+
+@@insertcopying
+@dots{}
+@@end ifnottex
+@end group
+@end example
+
+After you format the manual, the @code{@@value} constructs have been
+expanded, so the output contains text like this:
+
+@example
+@group
+This is Edition 0.35 Beta, last updated 14 August 1992,
+of `The GNU Make Manual', for `make', Version 3.63 Beta.
+@end group
+@end example
+@end enumerate
+
+When you update the manual, you change only the values of the flags; you
+do not need to edit the three sections.
+
+
+@node Conditional Nesting
+@section Conditional Nesting
+@cindex Conditionals, nested
+@cindex Nesting conditionals
+
+Conditionals can be nested; however, the details are a little tricky.
+The difficulty comes with failing conditionals, such as
+@code{@@ifhtml} when HTML is not being produced, where the included
+text is to be ignored. However, it is not to be @emph{completely}
+ignored, since it is useful to have one @code{@@ifset} inside another,
+for example---that is a way to include text only if two conditions are
+met. Here's an example:
+
+@example
+@@ifset somevar
+@@ifset anothervar
+Both somevar and anothervar are set.
+@@end ifset
+@@ifclear anothervar
+Somevar is set, anothervar is not.
+@@end ifclear
+@@end ifset
+@end example
+
+Technically, Texinfo requires that for a failing conditional, the
+ignored text must be properly nested with respect to that failing
+conditional. Unfortunately, it's not always feasible to check that
+@emph{all} conditionals are properly nested, because then the
+processors could have to fully interpret the ignored text, which
+defeats the purpose of the command. Here's an example illustrating
+these rules:
+
+@example
+@@ifset a
+@@ifset b
+@@ifclear ok - ok, ignored
+@@end junky - ok, ignored
+@@end ifset
+@@c WRONG - missing @@end ifset.
+@end example
+
+Finally, as mentioned above, all conditional commands must be on lines
+by themselves, with no text (even spaces) before or after. Otherwise,
+the processors cannot reliably determine which commands to consider
+for nesting purposes.
+
+
+@node Internationalization
+@chapter Internationalization
+
+@cindex Internationalization
+Texinfo has some support for writing in languages other than English,
+although this area still needs considerable work.
+
+For a list of the various accented and special characters Texinfo
+supports, see @ref{Inserting Accents}.
+
+@menu
+* documentlanguage:: Declaring the current language.
+* documentencoding:: Declaring the input encoding.
+@end menu
+
+
+@node documentlanguage
+@section @code{@@documentlanguage @var{cc}}: Set the Document Language
+
+@findex documentlanguage
+@cindex Language, declaring
+@cindex Document language, declaring
+
+The @code{@@documentlanguage} command declares the current document
+language. Write it on a line by itself, with a two-letter ISO-639
+language code following (list is included below). If you have a
+multilingual document, the intent is to be able to use this command
+multiple times, to declare each language change. If the command is not
+used at all, the default is @code{en} for English.
+
+@cindex @file{txi-@var{cc}.tex}
+At present, this command is ignored in Info and HTML output. For
+@TeX{}, it causes the file @file{txi-@var{cc}.tex} to be read (if it
+exists). Such a file appropriately redefines the various English words
+used in @TeX{} output, such as `Chapter', `See', and so on.
+
+@cindex Hyphenation patterns, language-dependent
+It would be good if this command also changed @TeX{}'s ideas of the
+current hyphenation patterns (via the @TeX{} primitive
+@code{\language}), but this is unfortunately not currently implemented.
+
+@cindex ISO 639 codes
+@cindex Language codes
+Hereare the valid language codes, from ISO-639.
+
+@multitable @columnfractions .07 .26 .07 .26 .07 .26
+@item
+@code{aa} @tab Afar @tab
+@code{ab} @tab Abkhazian @tab
+@code{af} @tab Afrikaans
+@item
+@code{am} @tab Amharic @tab
+@code{ar} @tab Arabic @tab
+@code{as} @tab Assamese
+@item
+@code{ay} @tab Aymara @tab
+@code{az} @tab Azerbaijani @tab
+@code{ba} @tab Bashkir
+@item
+@code{be} @tab Byelorussian @tab
+@code{bg} @tab Bulgarian @tab
+@code{bh} @tab Bihari
+@item
+@code{bi} @tab Bislama @tab
+@code{bn} @tab Bengali; Bangla @tab
+@code{bo} @tab Tibetan
+@item
+@code{br} @tab Breton @tab
+@code{ca} @tab Catalan @tab
+@code{co} @tab Corsican
+@item
+@code{cs} @tab Czech @tab
+@code{cy} @tab Welsh @tab
+@code{da} @tab Danish
+@item
+@code{de} @tab German @tab
+@code{dz} @tab Bhutani @tab
+@code{el} @tab Greek
+@item
+@code{en} @tab English @tab
+@code{eo} @tab Esperanto @tab
+@code{es} @tab Spanish
+@item
+@code{et} @tab Estonian @tab
+@code{eu} @tab Basque @tab
+@code{fa} @tab Persian
+@item
+@code{fi} @tab Finnish @tab
+@code{fj} @tab Fiji @tab
+@code{fo} @tab Faroese
+@item
+@code{fr} @tab French @tab
+@code{fy} @tab Frisian @tab
+@code{ga} @tab Irish
+@item
+@code{gd} @tab Scots Gaelic @tab
+@code{gl} @tab Galician @tab
+@code{gn} @tab Guarani
+@item
+@code{gu} @tab Gujarati @tab
+@code{ha} @tab Hausa @tab
+@code{he} @tab Hebrew
+@item
+@code{hi} @tab Hindi @tab
+@code{hr} @tab Croatian @tab
+@code{hu} @tab Hungarian
+@item
+@code{hy} @tab Armenian @tab
+@code{ia} @tab Interlingua @tab
+@code{id} @tab Indonesian
+@item
+@code{ie} @tab Interlingue @tab
+@code{ik} @tab Inupiak @tab
+@code{is} @tab Icelandic
+@item
+@code{it} @tab Italian @tab
+@code{iu} @tab Inuktitut @tab
+@code{ja} @tab Japanese
+@item
+@code{jw} @tab Javanese @tab
+@code{ka} @tab Georgian @tab
+@code{kk} @tab Kazakh
+@item
+@code{kl} @tab Greenlandic @tab
+@code{km} @tab Cambodian @tab
+@code{kn} @tab Kannada
+@item
+@code{ks} @tab Kashmiri @tab
+@code{ko} @tab Korean @tab
+@code{ku} @tab Kurdish
+@item
+@code{ky} @tab Kirghiz @tab
+@code{la} @tab Latin @tab
+@code{ln} @tab Lingala
+@item
+@code{lt} @tab Lithuanian @tab
+@code{lo} @tab Laothian @tab
+@code{lv} @tab Latvian, Lettish
+@item
+@code{mg} @tab Malagasy @tab
+@code{mi} @tab Maori @tab
+@code{mk} @tab Macedonian
+@item
+@code{ml} @tab Malayalam @tab
+@code{mn} @tab Mongolian @tab
+@code{mo} @tab Moldavian
+@item
+@code{mr} @tab Marathi @tab
+@code{ms} @tab Malay @tab
+@code{mt} @tab Maltese
+@item
+@code{my} @tab Burmese @tab
+@code{na} @tab Nauru @tab
+@code{ne} @tab Nepali
+@item
+@code{nl} @tab Dutch @tab
+@code{no} @tab Norwegian @tab
+@code{oc} @tab Occitan
+@item
+@code{om} @tab (Afan) Oromo @tab
+@code{or} @tab Oriya @tab
+@code{pa} @tab Punjabi
+@item
+@code{pl} @tab Polish @tab
+@code{ps} @tab Pashto, Pushto @tab
+@code{pt} @tab Portuguese
+@item
+@code{qu} @tab Quechua @tab
+@code{rm} @tab Rhaeto-Romance @tab
+@code{rn} @tab Kirundi
+@item
+@code{ro} @tab Romanian @tab
+@code{ru} @tab Russian @tab
+@code{rw} @tab Kinyarwanda
+@item
+@code{sa} @tab Sanskrit @tab
+@code{sd} @tab Sindhi @tab
+@code{sg} @tab Sangro
+@item
+@code{sh} @tab Serbo-Croatian @tab
+@code{si} @tab Sinhalese @tab
+@code{sk} @tab Slovak
+@item
+@code{sl} @tab Slovenian @tab
+@code{sm} @tab Samoan @tab
+@code{sn} @tab Shona
+@item
+@code{so} @tab Somali @tab
+@code{sq} @tab Albanian @tab
+@code{sr} @tab Serbian
+@item
+@code{ss} @tab Siswati @tab
+@code{st} @tab Sesotho @tab
+@code{su} @tab Sundanese
+@item
+@code{sv} @tab Swedish @tab
+@code{sw} @tab Swahili @tab
+@code{ta} @tab Tamil
+@item
+@code{te} @tab Telugu @tab
+@code{tg} @tab Tajik @tab
+@code{th} @tab Thai
+@item
+@code{ti} @tab Tigrinya @tab
+@code{tk} @tab Turkmen @tab
+@code{tl} @tab Tagalog
+@item
+@code{tn} @tab Setswana @tab
+@code{to} @tab Tonga @tab
+@code{tr} @tab Turkish
+@item
+@code{ts} @tab Tsonga @tab
+@code{tt} @tab Tatar @tab
+@code{tw} @tab Twi
+@item
+@code{ug} @tab Uighur @tab
+@code{uk} @tab Ukrainian @tab
+@code{ur} @tab Urdu
+@item
+@code{uz} @tab Uzbek @tab
+@code{vi} @tab Vietnamese @tab
+@code{vo} @tab Volapuk
+@item
+@code{wo} @tab Wolof @tab
+@code{xh} @tab Xhosa @tab
+@code{yi} @tab Yiddish
+@item
+@code{yo} @tab Yoruba @tab
+@code{za} @tab Zhuang @tab
+@code{zh} @tab Chinese
+@item
+@code{zu} @tab Zulu
+@end multitable
+
+
+@node documentencoding
+@section @code{@@documentencoding @var{enc}}: Set Input Encoding
+
+@findex documentencoding
+@cindex Encoding, declaring
+@cindex Input encoding, declaring
+@cindex Character set, declaring
+@cindex Document input encoding
+
+The @code{@@documentencoding} command declares the input document
+encoding. Write it on a line by itself, with a valid encoding
+specification following.
+
+At present, Texinfo supports only these encodings:
+
+@table @code
+@item US-ASCII
+This has no particular effect, but it's included for completeness.
+
+@itemx ISO-8859-1
+@itemx ISO-8859-15
+@item ISO-8859-2
+These specify the standard encodings for Western European (the first
+two) and Eastern European languages (the third), respectively. ISO
+8859-15 replaces some little-used characters from 8859-1 (e.g.,
+precomposed fractions) with more commonly needed ones, such as the
+Euro symbol.
+
+A full description of the encodings is beyond our scope here;
+one useful reference is @uref{http://czyborra.com/charsets/iso8859.html}.
+@end table
+
+Specifying an encoding @var{enc} has the following effects:
+
+@opindex --enable-encoding
+@cindex Local Variables: section, for encoding
+@cindex Info output, and encoding
+In Info output, if the option @option{--enable-encoding} is given
+to @command{makeinfo}, a so-called `Local Variables' section
+(@pxref{File Variables,,,emacs,The GNU Emacs Manual}) is output
+including @var{enc}. This allows Info readers to set the encoding
+appropriately.
+
+@example
+Local Variables:
+coding: @var{enc}
+End:
+@end example
+
+@cindex HTML output, and encodings
+@cindex @code{http-equiv}, and charset specification
+@cindex @code{<meta>} HTML tag, and charset specification
+In HTML output, a @samp{<meta>} tag is output, in the @samp{<head>}
+section of the HTML, that specifies @var{enc}. Web servers and
+browsers cooperate to use this information so the correct encoding is
+used to display the page, if supported by the system.
+
+@example
+<meta http-equiv="Content-Type" content="text/html;
+ charset=@var{enc}">
+@end example
+
+In all other cases, it is recognized but ignored.
+
+
+@node Defining New Texinfo Commands
+@chapter Defining New Texinfo Commands
+@cindex Macros
+@cindex Defining new Texinfo commands
+@cindex New Texinfo commands, defining
+@cindex Texinfo commands, defining new
+@cindex User-defined Texinfo commands
+
+Texinfo provides several ways to define new commands:
+
+@itemize @bullet
+@item
+A Texinfo @dfn{macro} allows you to define a new Texinfo command as any
+sequence of text and/or existing commands (including other macros). The
+macro can have any number of @dfn{parameters}---text you supply each
+time you use the macro.
+
+Incidentally, these macros have nothing to do with the @code{@@defmac}
+command, which is for documenting macros in the subject of the manual
+(@pxref{Def Cmd Template}).
+
+@item
+@samp{@@alias} is a convenient way to define a new name for an existing
+command.
+
+@item
+@samp{@@definfoenclose} allows you to define new commands with
+customized output in the Info file.
+
+@end itemize
+
+@menu
+* Defining Macros:: Defining and undefining new commands.
+* Invoking Macros:: Using a macro, once you've defined it.
+* Macro Details:: Limitations of Texinfo macros.
+* alias:: Command aliases.
+* definfoenclose:: Customized highlighting.
+@end menu
+
+
+@node Defining Macros
+@section Defining Macros
+@cindex Defining macros
+@cindex Macro definitions
+
+@findex macro
+You use the Texinfo @code{@@macro} command to define a macro, like this:
+
+@example
+@@macro @var{macroname}@{@var{param1}, @var{param2}, @dots{}@}
+@var{text} @dots{} \@var{param1}\ @dots{}
+@@end macro
+@end example
+
+The @dfn{parameters} @var{param1}, @var{param2}, @dots{} correspond to
+arguments supplied when the macro is subsequently used in the document
+(described in the next section).
+
+@cindex Macro names, valid characters in
+@cindex Names of macros, valid characters of
+For a macro to work consistently with @TeX{}, @var{macroname} must
+consist entirely of letters: no digits, hyphens, underscores, or other
+special characters. So, we recommend using only letters. However,
+@command{makeinfo} will accept anything except @samp{@{@}_^=};
+@samp{_} and @samp{^} are excluded so that macros can be called in
+@code{@@math} mode without a following space
+(@pxref{math,,@code{@@math}}).
+
+If a macro needs no parameters, you can define it either with an empty
+list (@samp{@@macro foo @{@}}) or with no braces at all (@samp{@@macro
+foo}).
+
+@cindex Body of a macro
+@cindex Mutually recursive macros
+@cindex Recursion, mutual
+The definition or @dfn{body} of the macro can contain most Texinfo
+commands, including previously-defined macros. Not-yet-defined macro
+invocations are not allowed; thus, it is not possible to have mutually
+recursive Texinfo macros. Also, a macro definition that defines another
+macro does not work in @TeX{} due to limitations in the design of
+@code{@@macro}.
+
+@cindex Parameters to macros
+In the macro body, instances of a parameter name surrounded by
+backslashes, as in @samp{\@var{param1}\} in the example above, are
+replaced by the corresponding argument from the macro invocation. You
+can use parameter names any number of times in the body, including zero.
+
+@cindex Backslash in macros
+To get a single @samp{\} in the macro expansion, use @samp{\\}. Any
+other use of @samp{\} in the body yields a warning.
+
+@cindex Spaces in macros
+@cindex Whitespace in macros
+The newlines after the @code{@@macro} line and before the @code{@@end
+macro} line are ignored, that is, not included in the macro body. All
+other whitespace is treated according to the usual Texinfo rules.
+
+@cindex Recursive macro invocations
+@findex rmacro
+To allow a macro to be used recursively, that is, in an argument to a
+call to itself, you must define it with @samp{@@rmacro}, like this:
+
+@example
+@@rmacro rmac @{arg@}
+a\arg\b
+@@end rmacro
+@dots{}
+@@rmac@{1@@rmac@{text@}2@}
+@end example
+
+This produces the output `a1atextb2b'. With @samp{@@macro} instead of
+@samp{@@rmacro}, an error message is given.
+
+@findex unmacro
+@cindex Macros, undefining
+@cindex Undefining macros
+You can undefine a macro @var{foo} with @code{@@unmacro @var{foo}}.
+It is not an error to undefine a macro that is already undefined.
+For example:
+
+@example
+@@unmacro foo
+@end example
+
+
+@node Invoking Macros
+@section Invoking Macros
+@cindex Invoking macros
+@cindex Expanding macros
+@cindex Running macros
+@cindex Macro invocation
+
+After a macro is defined (see the previous section), you can use
+(@dfn{invoke}) it in your document like this:
+
+@example
+@@@var{macroname} @{@var{arg1}, @var{arg2}, @dots{}@}
+@end example
+
+@noindent and the result will be just as if you typed the body of
+@var{macroname} at that spot. For example:
+
+@example
+@@macro foo @{p, q@}
+Together: \p\ & \q\.
+@@end macro
+@@foo@{a, b@}
+@end example
+
+@noindent produces:
+
+@display
+Together: a & b.
+@end display
+
+@cindex Backslash, and macros
+Thus, the arguments and parameters are separated by commas and delimited
+by braces; any whitespace after (but not before) a comma is ignored.
+The braces are required in the invocation (but not the definition), even
+when the macro takes no arguments, consistent with all other Texinfo
+commands. For example:
+
+@example
+@@macro argless @{@}
+No arguments here.
+@@end macro
+@@argless@{@}
+@end example
+
+@noindent produces:
+
+@display
+No arguments here.
+@end display
+
+@cindex Comma, in macro arguments
+@cindex Braces, in macro arguments
+To insert a comma, brace, or backslash in an argument, prepend a
+backslash, as in
+
+@example
+@@@var{macname} @{\\\@{\@}\,@}
+@end example
+
+@noindent
+which will pass the (almost certainly error-producing) argument
+@samp{\@{@},} to @var{macname}. However, commas in parameters, even
+if escaped by a backslash, might cause trouble in @TeX{}.
+
+If the macro is defined to take a single argument, and is invoked
+without any braces, the entire rest of the line after the macro name is
+supplied as the argument. For example:
+
+@example
+@@macro bar @{p@}
+Twice: \p\ & \p\.
+@@end macro
+@@bar aah
+@end example
+
+@noindent produces:
+
+@c Sorry for cheating, but let's not require macros to process the manual.
+@display
+Twice: aah & aah.
+@end display
+
+If the macro is defined to take a single argument, and is invoked with
+braces, the braced text is passed as the argument, regardless of
+commas. For example:
+
+@example
+@@macro bar @{p@}
+Twice: \p\ & \p\.
+@@end macro
+@@bar@{a,b@}
+@end example
+
+@noindent produces:
+
+@display
+Twice: a,b & a,b.
+@end display
+
+
+@node Macro Details
+@section Macro Details and Caveats
+@cindex Macro details
+@cindex Details of macro usage
+@cindex Caveats for macro usage
+
+Due to unavoidable limitations, certain macro-related constructs cause
+problems with @TeX{}. If you get macro-related errors when producing
+the printed version of a manual, try expanding the macros with
+@command{makeinfo} by invoking @command{texi2dvi} with the @samp{-E}
+option (@pxref{Format with texi2dvi}).
+
+@itemize @bullet
+@item
+As mentioned earlier, macro names must consist entirely of letters.
+
+@item
+It is not advisable to redefine any @TeX{} primitive, plain, or
+Texinfo command name as a macro. Unfortunately this is a very large
+set of names, and the possible resulting errors are unpredictable.
+
+@item
+All macros are expanded inside at least one @TeX{} group. This means
+that @code{@@set} and other such commands have no effect inside a
+macro.
+
+@item
+Commas in macro arguments, even if escaped by a backslash, don't
+always work.
+
+@item
+Macro arguments cannot cross lines.
+
+@item
+It is (usually) best to avoid comments inside macro definitions, but
+see the next item.
+
+@item
+Macros containing a command which must be on a line by itself, such as
+a conditional, cannot be invoked in the middle of a line. In general,
+the interaction of newlines in the macro definitions and invocations
+depends on the precise commands and context. You may be able to work
+around some problems with judicious use of @code{@@c}. Suppose you
+define a macro that is always intended to be used on a line by itself:
+
+@example
+@@macro linemac
+@@cindex whatever
+@@c
+@@end macro
+...
+foo
+@@linemac
+bar
+@end example
+
+Without the @code{@@c}, there will be an unwanted blank line between
+the @samp{@@cindex whatever} and the @samp{bar} (one newline comes
+from the macro definition, one from after the invocation), causing a
+paragraph break.
+
+On the other hand, you wouldn't want the @code{@@c} if the macro was
+sometimes invoked in the middle of a line (the text after the
+invocation would be treated as a comment).
+
+@item
+In general, you can't arbitrarily substitute a macro call for Texinfo
+command arguments, even when the text is the same. It might work with
+some commands, it fails with others. Best not to do it at all. For
+instance, this fails:
+
+@example
+@@macro offmacro
+off
+@@end macro
+@@headings @@offmacro
+@end example
+
+@noindent
+You would expect this to be equivalent to @code{@@headings off}, but
+for @TeX{}nical reasons, it fails with a mysterious error message
+(@code{Paragraph ended before @@headings was complete}).
+
+@item
+Macros cannot define macros in the natural way. To do this, you must
+use conditionals and raw @TeX{}. For example:
+
+@example
+@@ifnottex
+@@macro ctor @{name, arg@}
+@@macro \name\
+something involving \arg\ somehow
+@@end macro
+@@end macro
+@@end ifnottex
+@@tex
+\gdef\ctor#1@{\ctorx#1,@}
+\gdef\ctorx#1,#2,@{\def#1@{something involving #2 somehow@}@}
+@@end tex
+@end example
+
+@end itemize
+
+The @command{makeinfo} implementation also has limitations:
+
+@itemize
+@item
+@code{@@verbatim} and macros do not mix; for instance, you can't start
+a verbatim block inside a macro and end it outside.
+(@xref{verbatim}.) Starting any environment inside a macro and ending
+it outside may or may not work, for that matter.
+
+@item
+Macros that completely define macros are ok, but it's not possible to
+have incorrectly nested macro definitions. That is, @code{@@macro}
+and @code{@@end macro} (likewise for @code{@@rmacro}) must be
+correctly paired. For example, you cannot start a macro definition
+within a macro, and then end the nested definition outside the macro.
+
+@item
+@code{@@rmacro} is a kludge.
+
+@end itemize
+
+One more limitation is common to both implementations: white space is
+ignored at the beginnings of lines.
+
+Future major revisions of Texinfo may ease some of these limitations
+(by introducing a new macro syntax).
+
+
+@node alias
+@section @samp{@@alias @var{new}=@var{existing}}
+@cindex Aliases, command
+@cindex Command aliases
+@findex alias
+
+The @samp{@@alias} command defines a new command to be just like an
+existing one. This is useful for defining additional markup names, thus
+preserving semantic information in the input even though the output
+result may be the same.
+
+Write the @samp{@@alias} command on a line by itself, followed by the
+new command name, an equals sign, and the existing command name.
+Whitespace around the equals sign is ignored. Thus:
+@example
+@@alias @var{new} = @var{existing}
+@end example
+
+For example, if your document contains citations for both books and
+some other media (movies, for example), you might like to define a
+macro @code{@@moviecite@{@}} that does the same thing as an ordinary
+@code{@@cite@{@}} but conveys the extra semantic information as well.
+You'd do this as follows:
+
+@example
+@@alias moviecite = cite
+@end example
+
+Macros do not always have the same effect as aliases, due to vagaries
+of argument parsing. Also, aliases are much simpler to define than
+macros. So the command is not redundant. (It was also heavily used
+in the Jargon File!)
+
+Aliases must not be recursive, directly or indirectly.
+
+It is not advisable to redefine any @TeX{} primitive, plain, or
+Texinfo command name as an alias. Unfortunately this is a very large
+set of names, and the possible resulting errors are completely random.
+
+
+@node definfoenclose
+@section @samp{definfoenclose}: Customized Highlighting
+@cindex Highlighting, customized
+@cindex Customized highlighting
+@findex definfoenclose
+
+A @code{@@definfoenclose} command may be used to define a highlighting
+command for Info, but not for @TeX{}. A command defined using
+@code{@@definfoenclose} marks text by enclosing it in strings that
+precede and follow the text. You can use this to get closer control of
+your Info output.
+
+Presumably, if you define a command with @code{@@definfoenclose} for Info,
+you will create a corresponding command for @TeX{}, either in
+@file{texinfo.tex}, @file{texinfo.cnf}, or within an @samp{@@iftex} in
+your document.
+
+Write a @code{@@definfoenclose} command on a line and follow it with
+three arguments separated by commas. The first argument to
+@code{@@definfoenclose} is the @@-command name (without the @code{@@});
+the second argument is the Info start delimiter string; and the third
+argument is the Info end delimiter string. The latter two arguments
+enclose the highlighted text in the Info file. A delimiter string may
+contain spaces. Neither the start nor end delimiter is required. If
+you do not want a start delimiter but do want an end delimiter, you must
+follow the command name with two commas in a row; otherwise, the Info
+formatting commands will naturally misinterpret the end delimiter string
+you intended as the start delimiter string.
+
+If you do a @code{@@definfoenclose} on the name of a pre-defined macro
+(such as @code{@@emph}, @code{@@strong}, @code{@@t}, or @code{@@i}), the
+enclosure definition will override the built-in definition.
+
+An enclosure command defined this way takes one argument in braces; this
+is intended for new markup commands (@pxref{Marking Text}).
+
+@findex phoo
+For example, you can write:
+
+@example
+@@definfoenclose phoo,//,\\
+@end example
+
+@noindent
+near the beginning of a Texinfo file to define @code{@@phoo} as an Info
+formatting command that inserts `//' before and `\\' after the argument
+to @code{@@phoo}. You can then write @code{@@phoo@{bar@}} wherever you
+want `//bar\\' highlighted in Info.
+
+Also, for @TeX{} formatting, you could write
+
+@example
+@@iftex
+@@global@@let@@phoo=@@i
+@@end iftex
+@end example
+
+@noindent
+to define @code{@@phoo} as a command that causes @TeX{} to typeset the
+argument to @code{@@phoo} in italics.
+
+Each definition applies to its own formatter: one for @TeX{}, the other
+for @code{texinfo-format-buffer} or @code{texinfo-format-region}. The
+@code{@@definfoenclose} command need not be within @samp{@@ifinfo}, but
+the raw @TeX{} commands do need to be in @samp{@@iftex}.
+
+@findex headword
+Here is another example: write
+
+@example
+@@definfoenclose headword, , :
+@end example
+
+@noindent
+near the beginning of the file, to define @code{@@headword} as an Info
+formatting command that inserts nothing before and a colon after the
+argument to @code{@@headword}.
+
+@samp{@@definfoenclose} definitions must not be recursive, directly or
+indirectly.
+
+
+@node Hardcopy
+@chapter Formatting and Printing Hardcopy
+@cindex Format and print hardcopy
+@cindex Printing hardcopy
+@cindex Hardcopy, printing it
+@cindex Making a printed manual
+@cindex Sorting indices
+@cindex Indices, sorting
+@cindex @TeX{} index sorting
+@pindex texindex
+
+There are three major shell commands for making a printed manual from a
+Texinfo file: one for converting the Texinfo file into a file that will be
+printed, a second for sorting indices, and a third for printing the
+formatted document. When you use the shell commands, you can either
+work directly in the operating system shell or work within a shell
+inside GNU Emacs.
+
+If you are using GNU Emacs, you can use commands provided by Texinfo
+mode instead of shell commands. In addition to the three commands to
+format a file, sort the indices, and print the result, Texinfo mode
+offers key bindings for commands to recenter the output buffer, show the
+print queue, and delete a job from the print queue.
+
+@menu
+* Use TeX:: Use @TeX{} to format for hardcopy.
+* Format with tex/texindex:: How to format with explicit shell commands.
+* Format with texi2dvi:: A simpler way to format.
+* Print with lpr:: How to print.
+* Within Emacs:: How to format and print from an Emacs shell.
+* Texinfo Mode Printing:: How to format and print in Texinfo mode.
+* Compile-Command:: How to print using Emacs's compile command.
+* Requirements Summary:: @TeX{} formatting requirements summary.
+* Preparing for TeX:: What to do before you use @TeX{}.
+* Overfull hboxes:: What are and what to do with overfull hboxes.
+* smallbook:: How to print small format books and manuals.
+* A4 Paper:: How to print on A4 or A5 paper.
+* pagesizes:: How to print with customized page sizes.
+* Cropmarks and Magnification:: How to print marks to indicate the size
+ of pages and how to print scaled up output.
+* PDF Output:: Portable Document Format output.
+* Obtaining TeX:: How to Obtain @TeX{}.
+@end menu
+
+@node Use TeX
+@section Use @TeX{}
+
+The typesetting program called @TeX{} is used for formatting a Texinfo
+file. @TeX{} is a very powerful typesetting program and, if used correctly,
+does an exceptionally good job. (@xref{Obtaining TeX, , How to Obtain
+@TeX{}}, for information on how to obtain @TeX{}.)
+
+The standalone @code{makeinfo} program and Emacs functions
+@code{texinfo-format-region} and @code{texinfo-format-buffer} commands
+read the very same @@-commands in the Texinfo file as does @TeX{}, but
+process them differently to make an Info file (@pxref{Creating an Info
+File}).
+
+
+@node Format with tex/texindex
+@section Format with @code{tex} and @code{texindex}
+@cindex Shell formatting with @code{tex} and @code{texindex}
+@cindex Formatting with @code{tex} and @code{texindex}
+@cindex DVI file
+
+You can format the Texinfo file with the shell command @code{tex}
+followed by the name of the Texinfo file. For example:
+
+@example
+tex foo.texi
+@end example
+
+@noindent @TeX{} will produce a @dfn{DVI file} as well as several auxiliary
+files containing information for indices, cross references, etc. The
+DVI file (for @dfn{DeVice Independent} file) can be printed on virtually
+any device (see the following sections).
+
+@pindex texindex
+The @code{tex} formatting command itself does not sort the indices; it
+writes an output file of unsorted index data. To generate a printed
+index after running the @command{tex} command, you first need a sorted
+index to work from. The @command{texindex} command sorts indices.
+(The source file @file{texindex.c} comes as part of the standard
+Texinfo distribution, among other places.) (@command{texi2dvi} runs
+@command{tex} and @command{texindex} as necessary.)
+
+@cindex Names of index files
+@cindex Index file names
+The @code{tex} formatting command outputs unsorted index files under
+names that obey a standard convention: the name of your main input file
+with any @samp{.tex} (or similar, @pxref{tex invocation,,, web2c,
+Web2c}) extension removed, followed by the two letter names of indices.
+For example, the raw index output files for the input file
+@file{foo.texinfo} would be @file{foo.cp}, @file{foo.vr}, @file{foo.fn},
+@file{foo.tp}, @file{foo.pg} and @file{foo.ky}. Those are exactly the
+arguments to give to @code{texindex}.
+
+@need 1000
+@cindex Wildcards
+@cindex Globbing
+Instead of specifying all the unsorted index file names explicitly, you
+can use @samp{??} as shell wildcards and give the command in this
+form:
+
+@example
+texindex foo.??
+@end example
+
+@noindent
+This command will run @code{texindex} on all the unsorted index files,
+including any that you have defined yourself using @code{@@defindex}
+or @code{@@defcodeindex}. (You may execute @samp{texindex foo.??}
+even if there are similarly named files with two letter extensions
+that are not index files, such as @samp{foo.el}. The @code{texindex}
+command reports but otherwise ignores such files.)
+
+For each file specified, @code{texindex} generates a sorted index file
+whose name is made by appending @samp{s} to the input file name. The
+@code{@@printindex} command looks for a file with that name
+(@pxref{Printing Indices & Menus}). @code{texindex} does not alter the
+raw index output file.
+
+After you have sorted the indices, you need to rerun @code{tex} on the
+Texinfo file. This regenerates the DVI file, this time with
+up-to-date index entries.
+
+Finally, you may need to run @code{tex} one more time, to get the page
+numbers in the cross-references correct.
+
+To summarize, this is a five step process:
+
+@enumerate
+@item
+Run @code{tex} on your Texinfo file. This generates a DVI file (with
+undefined cross-references and no indices), and the raw index files
+(with two letter extensions).
+
+@item
+Run @code{texindex} on the raw index files. This creates the
+corresponding sorted index files (with three letter extensions).
+
+@item
+Run @code{tex} again on your Texinfo file. This regenerates the DVI
+file, this time with indices and defined cross-references, but with page
+numbers for the cross-references from last time, generally incorrect.
+
+@item
+Sort the indices again, with @code{texindex}.
+
+@item
+Run @code{tex} one last time. This time the correct page numbers are
+written for the cross-references.
+@end enumerate
+
+@pindex texi2dvi
+Alternatively, it's a one-step process: run @code{texi2dvi}
+(@pxref{Format with texi2dvi}).
+
+You need not run @code{texindex} each time after you run @code{tex}. If
+you do not, on the next run, the @code{tex} formatting command will use
+whatever sorted index files happen to exist from the previous use of
+@code{texindex}. This is usually ok while you are debugging.
+
+@cindex Auxiliary files, avoiding
+@findex novalidate
+@cindex Pointer validation, suppressing
+@cindex Chapters, formatting one at a time
+Sometimes you may wish to print a document while you know it is
+incomplete, or to print just one chapter of a document. In that case,
+the usual auxiliary files that @TeX{} creates and warnings @TeX{} gives
+when cross-references are not satisfied are just nuisances. You can
+avoid them with the @code{@@novalidate} command, which you must give
+@emph{before} the @code{@@setfilename} command
+(@pxref{setfilename,,@code{@@setfilename}}). Thus, the beginning of
+your file would look approximately like this:
+
+@example
+\input texinfo
+@@novalidate
+@@setfilename myfile.info
+@dots{}
+@end example
+
+@noindent @code{@@novalidate} also turns off validation in
+@code{makeinfo}, just like its @code{--no-validate} option
+(@pxref{Pointer Validation}).
+
+
+@node Format with texi2dvi
+@section Format with @code{texi2dvi}
+@pindex texi2dvi @r{(shell script)}
+
+The @code{texi2dvi} command automatically runs both @TeX{} and
+@command{texindex} as many times as necessary to produce a DVI file
+with sorted indices and all cross-references resolved. It is
+therefore simpler than manually executing the
+@code{tex}---@code{texindex}---@code{tex}---@code{tex} sequence
+described in the previous section.
+
+To run @code{texi2dvi} on an input file @file{foo.texi}, do this (where
+@samp{prompt$ } is your shell prompt):
+
+@example
+prompt$ @kbd{texi2dvi foo.texi}
+@end example
+
+As shown in this example, the input filenames to @code{texi2dvi} must
+include any extension (@samp{.texi}, @samp{.texinfo}, etc.). Under
+MS-DOS and perhaps in other circumstances, you may need to run @samp{sh
+texi2dvi foo.texi} instead of relying on the operating system to invoke
+the shell on the @samp{texi2dvi} script.
+
+Perhaps the most useful option to @code{texi2dvi} is
+@samp{--command=@var{cmd}}. This inserts @var{cmd} on a line by itself
+after the @code{@@setfilename} in a temporary copy of the input file
+before running @TeX{}. With this, you can specify different printing
+formats, such as @code{@@smallbook} (@pxref{smallbook}),
+@code{@@afourpaper} (@pxref{A4 Paper}), or @code{@@pagesizes}
+(@pxref{pagesizes}), without actually changing the document source.
+(You can also do this on a site-wide basis with @file{texinfo.cnf};
+@pxref{Preparing for TeX,,Preparing for @TeX{}}).
+
+With the @option{--pdf} option, @command{texi2dvi} produces PDF output
+instead of DVI (@pxref{PDF Output}), by running @command{pdftex}
+instead of @command{tex}. Alternatively, the command
+@command{texi2pdf} is an abbreviation for running @samp{texi2dvi --pdf}.
+
+@cindex @LaTeX{}, processing with @command{texi2dvi}
+@command{texi2dvi} can also be used to process @LaTeX{} files; simply
+run @samp{texi2dvi filename.ext}.
+
+@command{texi2dvi} will use @command{etex} (or @command{pdfetex}) if
+they are available; these extended versions of @TeX{} are not
+required, and the DVI (or PDF) output is identical, but they simplify
+the @TeX{} programming in some cases, and provide additional tracing
+information when debugging @file{texinfo.tex}.
+
+For a list of other options, run @samp{texi2dvi --help}.
+
+
+@node Print with lpr
+@section Shell Print Using @code{lpr -d}
+@pindex lpr @r{(DVI print command)}
+
+The precise command to print a DVI file depends on your system
+installation. Two common ones are @samp{dvips foo.dvi -o} and @samp{lpr
+-d foo.dvi}.
+
+For example, the following commands will (perhaps) suffice to sort the
+indices, format, and print the @cite{Bison Manual}:
+
+@example
+@group
+tex bison.texinfo
+texindex bison.??
+tex bison.texinfo
+lpr -d bison.dvi
+@end group
+@end example
+
+@noindent
+(Remember that the shell commands may be different at your site; but
+these are commonly used versions.)
+
+Using the @code{texi2dvi} shell script (see the previous section):
+
+@example
+@group
+texi2dvi bison.texinfo
+lpr -d bison.dvi
+# or perhaps dvips bison.dvi -o
+@end group
+@end example
+
+@cindex Shell printing, on MS-DOS/MS-Windows
+@cindex Printing DVI files, on MS-DOS/MS-Windows
+@pindex lpr@r{-d, replacements on MS-DOS/MS-Windows}
+@code{lpr} is a standard program on Unix systems, but it is usually
+absent on MS-DOS/MS-Windows. Some network packages come with a
+program named @code{lpr}, but these are usually limited to sending files
+to a print server over the network, and generally don't support the
+@samp{-d} option. If you are unfortunate enough to work on one of these
+systems, you have several alternative ways of printing DVI files:
+
+@itemize @bullet{}
+@item Find and install a Unix-like @code{lpr} program, or its clone.
+If you can do that, you will be able to print DVI files just like
+described above.
+
+@item Send the DVI files to a network printer queue for DVI files.
+Some network printers have special queues for printing DVI files. You
+should be able to set up your network software to send files to that
+queue. In some cases, the version of @code{lpr} which comes with your
+network software will have a special option to send a file to specific
+queues, like this:
+
+@example
+lpr -Qdvi -hprint.server.domain bison.dvi
+@end example
+
+@item Convert the DVI file to a Postscript or PCL file and send it to your
+local printer. @xref{Invoking Dvips,,, dvips, Dvips}, and the man
+pages for @code{dvilj}, for detailed description of these tools. Once
+the DVI file is converted to the format your local printer understands
+directly, just send it to the appropriate port, usually @samp{PRN}.
+@end itemize
+
+
+@node Within Emacs
+@section From an Emacs Shell
+@cindex Print, format from Emacs shell
+@cindex Format, print from Emacs shell
+@cindex Shell, format, print from
+@cindex Emacs shell, format, print from
+@cindex GNU Emacs shell, format, print from
+
+You can give formatting and printing commands from a shell within GNU
+Emacs. To create a shell within Emacs, type @kbd{M-x shell}. In this
+shell, you can format and print the document. @xref{Hardcopy, , Format
+and Print Hardcopy}, for details.
+
+You can switch to and from the shell buffer while @code{tex} is
+running and do other editing. If you are formatting a long document
+on a slow machine, this can be very convenient.@refill
+
+You can also use @code{texi2dvi} from an Emacs shell. For example,
+here is how to use @code{texi2dvi} to format and print @cite{Using and
+Porting GNU CC} from a shell within Emacs:
+
+@example
+@group
+texi2dvi gcc.texinfo
+lpr -d gcc.dvi
+@end group
+@end example
+
+See the next section for more information about formatting
+and printing in Texinfo mode.
+
+
+@node Texinfo Mode Printing
+@section Formatting and Printing in Texinfo Mode
+@cindex Region printing in Texinfo mode
+@cindex Format and print in Texinfo mode
+@cindex Print and format in Texinfo mode
+
+Texinfo mode provides several predefined key commands for @TeX{}
+formatting and printing. These include commands for sorting indices,
+looking at the printer queue, killing the formatting job, and
+recentering the display of the buffer in which the operations
+occur.@refill
+
+@table @kbd
+@item C-c C-t C-b
+@itemx M-x texinfo-tex-buffer
+Run @code{texi2dvi} on the current buffer.@refill
+
+@item C-c C-t C-r
+@itemx M-x texinfo-tex-region
+Run @TeX{} on the current region.@refill
+
+@item C-c C-t C-i
+@itemx M-x texinfo-texindex
+Sort the indices of a Texinfo file formatted with
+@code{texinfo-tex-region}.@refill
+
+@item C-c C-t C-p
+@itemx M-x texinfo-tex-print
+Print a DVI file that was made with @code{texinfo-tex-region} or
+@code{texinfo-tex-buffer}.@refill
+
+@item C-c C-t C-q
+@itemx M-x tex-show-print-queue
+Show the print queue.@refill
+
+@item C-c C-t C-d
+@itemx M-x texinfo-delete-from-print-queue
+Delete a job from the print queue; you will be prompted for the job
+number shown by a preceding @kbd{C-c C-t C-q} command
+(@code{texinfo-show-tex-print-queue}).@refill
+
+@item C-c C-t C-k
+@itemx M-x tex-kill-job
+Kill the currently running @TeX{} job started by either
+@code{texinfo-tex-region} or @code{texinfo-tex-buffer}, or any other
+process running in the Texinfo shell buffer.@refill
+
+@item C-c C-t C-x
+@itemx M-x texinfo-quit-job
+Quit a @TeX{} formatting job that has stopped because of an error by
+sending an @key{x} to it. When you do this, @TeX{} preserves a record
+of what it did in a @file{.log} file.@refill
+
+@item C-c C-t C-l
+@itemx M-x tex-recenter-output-buffer
+Redisplay the shell buffer in which the @TeX{} printing and formatting
+commands are run to show its most recent output.@refill
+@end table
+
+@need 1000
+Thus, the usual sequence of commands for formatting a buffer is as
+follows (with comments to the right):@refill
+
+@example
+@group
+C-c C-t C-b @r{Run @code{texi2dvi} on the buffer.}
+C-c C-t C-p @r{Print the DVI file.}
+C-c C-t C-q @r{Display the printer queue.}
+@end group
+@end example
+
+The Texinfo mode @TeX{} formatting commands start a subshell in Emacs
+called the @file{*tex-shell*}. The @code{texinfo-tex-command},
+@code{texinfo-texindex-command}, and @code{tex-dvi-print-command}
+commands are all run in this shell.
+
+You can watch the commands operate in the @samp{*tex-shell*} buffer,
+and you can switch to and from and use the @samp{*tex-shell*} buffer
+as you would any other shell buffer.@refill
+
+@need 1500
+The formatting and print commands depend on the values of several variables.
+The default values are:@refill
+
+@example
+@group
+ @r{Variable} @r{Default value}
+
+texinfo-texi2dvi-command "texi2dvi"
+texinfo-tex-command "tex"
+texinfo-texindex-command "texindex"
+texinfo-delete-from-print-queue-command "lprm"
+texinfo-tex-trailer "@@bye"
+tex-start-of-header "%**start"
+tex-end-of-header "%**end"
+tex-dvi-print-command "lpr -d"
+tex-show-queue-command "lpq"
+@end group
+@end example
+
+You can change the values of these variables with the @kbd{M-x
+set-variable} command (@pxref{Examining, , Examining and Setting
+Variables, emacs, The GNU Emacs Manual}), or with your @file{.emacs}
+initialization file (@pxref{Init File, , , emacs, The GNU Emacs
+Manual}).
+
+@cindex Customize Emacs package (@t{Development/Docs/Texinfo})
+Beginning with version 20, GNU Emacs offers a user-friendly interface,
+called @dfn{Customize}, for changing values of user-definable variables.
+@xref{Easy Customization, , Easy Customization Interface, emacs, The GNU
+Emacs Manual}, for more details about this. The Texinfo variables can
+be found in the @samp{Development/Docs/Texinfo} group, once you invoke
+the @kbd{M-x customize} command.
+
+
+@node Compile-Command
+@section Using the Local Variables List
+@cindex Local variables
+@cindex Compile command for formatting
+@cindex Format with the compile command
+
+Yet another way to apply the @TeX{} formatting command to a Texinfo file
+is to put that command in a @dfn{local variables list} at the end of the
+Texinfo file. You can then specify the @code{tex} or @code{texi2dvi}
+commands as a @code{compile-command} and have Emacs run it by typing
+@kbd{M-x compile}. This creates a special shell called the
+@file{*compilation*} buffer in which Emacs runs the compile command.
+For example, at the end of the @file{gdb.texinfo} file, after the
+@code{@@bye}, you could put the following:@refill
+
+@example
+@group
+Local Variables:
+compile-command: "texi2dvi gdb.texinfo"
+End:
+@end group
+@end example
+
+@noindent
+This technique is most often used by programmers who also compile programs
+this way; see @ref{Compilation, , , emacs, The GNU Emacs Manual}.@refill
+
+
+@node Requirements Summary
+@section @TeX{} Formatting Requirements Summary
+@cindex Requirements for formatting
+@cindex Minimal requirements for formatting
+@cindex Formatting requirements
+
+Every Texinfo file that is to be input to @TeX{} must begin with a
+@code{\input} command and must contain an @code{@@setfilename} command:
+
+@example
+\input texinfo
+@@setfilename @var{arg-not-used-by-@TeX{}}
+@end example
+
+@noindent
+The first command instructs @TeX{} to load the macros it needs to
+process a Texinfo file and the second command opens auxiliary files.
+
+Every Texinfo file must end with a line that terminates @TeX{}'s
+processing and forces out unfinished pages:
+
+@example
+@@bye
+@end example
+
+Strictly speaking, these lines are all a Texinfo file needs to be
+processed successfully by @TeX{}.
+
+Usually, however, the beginning includes an @code{@@settitle} command to
+define the title of the printed manual, an @code{@@setchapternewpage}
+command, a title page, a copyright page, and permissions. Besides an
+@code{@@bye}, the end of a file usually includes indices and a table of
+contents. (And of course most manuals contain a body of text as well.)
+
+For more information, see:
+
+@itemize @bullet
+@item @ref{settitle, , @code{@@settitle}}.
+@item @ref{setchapternewpage, , @code{@@setchapternewpage}}.
+@item @ref{Headings, ,Page Headings}.
+@item @ref{Titlepage & Copyright Page}.
+@item @ref{Printing Indices & Menus}.
+@item @ref{Contents}.
+@end itemize
+
+
+@node Preparing for TeX
+@section Preparing for @TeX{}
+@cindex Preparing for @TeX{}
+@cindex @TeX{} input initialization
+@cindex @b{.profile} initialization file
+@cindex @b{.cshrc} initialization file
+@cindex Initialization file for @TeX{} input
+
+@TeX{} needs to know where to find the @file{texinfo.tex} file that the
+@samp{\input texinfo} command on the first line reads. The
+@file{texinfo.tex} file tells @TeX{} how to handle @@-commands; it is
+included in all standard GNU distributions. The latest version is
+always available from the Texinfo source repository:
+@smalldisplay
+@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/doc/texinfo.tex?rev=HEAD}
+@end smalldisplay
+
+@pindex texinfo.tex@r{, installing}
+
+Usually, the installer has put the @file{texinfo.tex} file in the
+default directory that contains @TeX{} macros when GNU Texinfo, Emacs or
+other GNU software is installed. In this case, @TeX{} will find the
+file and you do not need to do anything special. If this has not been
+done, you can put @file{texinfo.tex} in the current directory when you
+run @TeX{}, and @TeX{} will find it there.
+
+@pindex epsf.tex@r{, installing}
+Also, you should install @file{epsf.tex}, if it is not already installed
+from another distribution. More details are at the end of the description
+of the @code{@@image} command (@pxref{Images}).
+
+@pindex pdfcolor.tex@r{, installing}
+Likewise for @file{pdfcolor.tex}, if it is not already installed and you
+use pdftex.
+
+@pindex texinfo.cnf @r{installation}
+@cindex Customizing of @TeX{} for Texinfo
+@cindex Site-wide Texinfo configuration file
+Optionally, you may create an additional @file{texinfo.cnf}, and install
+it as well. This file is read by @TeX{} when the @code{@@setfilename}
+command is executed (@pxref{setfilename,, @code{@@setfilename}}). You can put any
+commands you like there, according to local site-wide conventions. They
+will be read by @TeX{} when processing any Texinfo document. For
+example, if @file{texinfo.cnf} contains the line @samp{@@afourpaper}
+(@pxref{A4 Paper}), then all Texinfo documents will be processed with
+that page size in effect. If you have nothing to put in
+@file{texinfo.cnf}, you do not need to create it.
+
+@cindex Environment variable @code{TEXINPUTS}
+@vindex TEXINPUTS
+If neither of the above locations for these system files suffice for
+you, you can specify the directories explicitly. For
+@file{texinfo.tex}, you can do this by writing the complete path for the
+file after the @code{\input} command. Another way, that works for both
+@file{texinfo.tex} and @file{texinfo.cnf} (and any other file @TeX{}
+might read), is to set the @code{TEXINPUTS} environment variable in your
+@file{.cshrc} or @file{.profile} file.
+
+Which you use of @file{.cshrc} or @file{.profile} depends on
+whether you use a Bourne shell-compatible (@code{sh}, @code{bash},
+@code{ksh}, @dots{}) or C shell-compatible (@code{csh}, @code{tcsh})
+command interpreter. The latter read the @file{.cshrc} file for
+initialization information, and the former read @file{.profile}.
+
+In a @file{.cshrc} file, you could use the following @code{csh} command
+sequence:
+
+@example
+setenv TEXINPUTS .:/home/me/mylib:
+@end example
+
+@need 1000
+In a @file{.profile} file, you could use the following @code{sh} command
+sequence:
+
+@example
+@group
+TEXINPUTS=.:/home/me/mylib:
+export TEXINPUTS
+@end group
+@end example
+
+On MS-DOS/MS-Windows, you would say it like this@footnote{Note the use
+of the @samp{;} character, instead of @samp{:}, as directory separator
+on these systems.}:
+
+@example
+@group
+set TEXINPUTS=.;d:/home/me/mylib;c:
+@end group
+@end example
+
+@noindent
+It is customary for DOS/Windows users to put such commands in the
+@file{autoexec.bat} file, or in the Windows Registry.
+
+@noindent
+These settings would cause @TeX{} to look for @file{\input} file first
+in the current directory, indicated by the @samp{.}, then in a
+hypothetical user @samp{me}'s @file{mylib} directory, and finally in
+the system directories. (A leading, trailing, or doubled @samp{:}
+indicates searching the system directories at that point.)
+
+@cindex Dumping a .fmt file
+@cindex Format file, dumping
+Finally, you may wish to dump a @file{.fmt} file (@pxref{Memory dumps,,,
+web2c, Web2c}) so that @TeX{} can load Texinfo faster. (The
+disadvantage is that then updating @file{texinfo.tex} requires
+redumping.) You can do this by running this command, assuming
+@file{epsf.tex} is findable by @TeX{}:
+
+@example
+initex texinfo @@dump
+@end example
+
+(@code{dump} is a @TeX{} primitive.) Then, move @file{texinfo.fmt} to
+wherever your @code{.fmt} files are found; typically, this will be in the
+subdirectory @file{web2c} of your @TeX{} installation.
+
+
+@node Overfull hboxes
+@section Overfull ``hboxes''
+@cindex Overfull @samp{hboxes}
+@cindex @samp{hboxes}, overfull
+@cindex Final output
+
+@TeX{} is sometimes unable to typeset a line without extending it into
+the right margin. This can occur when @TeX{} comes upon what it
+interprets as a long word that it cannot hyphenate, such as an
+electronic mail network address or a very long title. When this
+happens, @TeX{} prints an error message like this:
+
+@example
+Overfull @@hbox (20.76302pt too wide)
+@end example
+
+@findex hbox
+@noindent
+(In @TeX{}, lines are in ``horizontal boxes'', hence the term, ``hbox''.
+@samp{@@hbox} is a @TeX{} primitive not needed in the Texinfo language.)
+
+@TeX{} also provides the line number in the Texinfo source file and
+the text of the offending line, which is marked at all the places that
+@TeX{} considered hyphenation.
+@xref{Debugging with TeX, , Catching Errors with @TeX{} Formatting},
+for more information about typesetting errors.
+
+If the Texinfo file has an overfull hbox, you can rewrite the sentence
+so the overfull hbox does not occur, or you can decide to leave it. A
+small excursion into the right margin often does not matter and may not
+even be noticeable.
+
+If you have many overfull boxes and/or an antipathy to rewriting, you
+can coerce @TeX{} into greatly increasing the allowable interword
+spacing, thus (if you're lucky) avoiding many of the bad line breaks,
+like this:
+
+@findex \emergencystretch
+@example
+@@tex
+\global\emergencystretch = .9\hsize
+@@end tex
+@end example
+
+@noindent
+(You should adjust the fraction as needed.) This huge value for
+@code{\emergencystretch} cannot be the default, since then the typeset
+output would generally be of noticeably lower quality; the default
+is @samp{.15\hsize}. @code{\hsize} is the @TeX{} dimension
+containing the current line width.
+
+@cindex Black rectangle in hardcopy
+@cindex Rectangle, black in hardcopy
+@cindex Box, ugly black in hardcopy
+@cindex Ugly black rectangles in hardcopy
+For what overfull boxes you have, however, @TeX{} will print a large,
+ugly, black rectangle beside the line that contains the overfull hbox
+unless told otherwise. This is so you will notice the location of the
+problem if you are correcting a draft.
+
+@findex finalout
+To prevent such a monstrosity from marring your final printout, write
+the following in the beginning of the Texinfo file on a line of its own,
+before the @code{@@titlepage} command:
+
+@example
+@@finalout
+@end example
+
+
+@node smallbook
+@section Printing ``Small'' Books
+@findex smallbook
+@cindex Small book size
+@cindex Book, printing small
+@cindex Page sizes for books
+@cindex Size of printed book
+
+By default, @TeX{} typesets pages for printing in an 8.5 by 11 inch
+format. However, you can direct @TeX{} to typeset a document in a 7 by
+9.25 inch format that is suitable for bound books by inserting the
+following command on a line by itself at the beginning of the Texinfo
+file, before the title page:@refill
+
+@example
+@@smallbook
+@end example
+
+@noindent
+(Since many books are about 7 by 9.25 inches, this command might better
+have been called the @code{@@regularbooksize} command, but it came to be
+called the @code{@@smallbook} command by comparison to the 8.5 by 11
+inch format.)
+
+If you write the @code{@@smallbook} command between the
+start-of-header and end-of-header lines, the Texinfo mode @TeX{}
+region formatting command, @code{texinfo-tex-region}, will format the
+region in ``small'' book size (@pxref{Start of Header}).@refill
+
+@xref{small}, for information about
+commands that make it easier to produce examples for a smaller manual.
+
+@xref{Format with texi2dvi}, and @ref{Preparing for TeX,,Preparing for
+@TeX{}}, for other ways to format with @code{@@smallbook} that do not
+require changing the source file.
+
+
+@node A4 Paper
+@section Printing on A4 Paper
+@cindex A4 paper, printing on
+@cindex A5 paper, printing on
+@cindex Paper size, A4
+@cindex European A4 paper
+@findex afourpaper
+
+You can tell @TeX{} to format a document for printing on European size
+A4 paper (or A5) with the @code{@@afourpaper} (or @code{@@afivepaper})
+command. Write the command on a line by itself near the beginning of
+the Texinfo file, before the title page. For example, this is how you
+would write the header for this manual:
+
+@example
+@group
+\input texinfo @@c -*-texinfo-*-
+@@c %**start of header
+@@setfilename texinfo
+@@settitle Texinfo
+@@afourpaper
+@@c %**end of header
+@end group
+@end example
+
+@xref{Format with texi2dvi}, and @ref{Preparing for TeX,,Preparing for
+@TeX{}}, for other ways to format for different paper sizes that do not
+require changing the source file.
+
+@findex afourlatex
+@findex afourwide
+You may or may not prefer the formatting that results from the command
+@code{@@afourlatex}. There's also @code{@@afourwide} for A4 paper in
+wide format.
+
+@node pagesizes
+@section @code{@@pagesizes} [@var{width}][, @var{height}]: Custom Page Sizes
+@findex pagesizes
+@cindex Custom page sizes
+@cindex Page sizes, customized
+@cindex Text width and height
+@cindex Width of text area
+@cindex Height of text area
+@cindex Depth of text area
+
+You can explicitly specify the height and (optionally) width of the main
+text area on the page with the @code{@@pagesizes} command. Write this
+on a line by itself near the beginning of the Texinfo file, before the
+title page. The height comes first, then the width if desired,
+separated by a comma. Examples:
+
+@example
+@@pagesizes 200mm,150mm @c for b5 paper
+@end example
+@noindent and
+@example
+@@pagesizes 11.5in @c for legal paper
+@end example
+
+@cindex B5 paper, printing on
+@cindex Legal paper, printing on
+This would be reasonable for printing on B5-size paper. To emphasize,
+this command specifies the size of the @emph{text area}, not the size of
+the paper (which is 250@dmn{mm} by 177@dmn{mm} for B5, 14@dmn{in} by
+8.5@dmn{in} for legal).
+
+@cindex Margins on page, not controllable
+To make more elaborate changes, such as changing any of the page
+margins, you must define a new command in @file{texinfo.tex} (or
+@file{texinfo.cnf}, @pxref{Preparing for TeX,,Preparing for @TeX{}}).
+
+@xref{Format with texi2dvi}, and @ref{Preparing for TeX,,Preparing for
+@TeX{}}, for other ways to specify @code{@@pagesizes} that do not
+require changing the source file.
+
+@code{@@pagesizes} is ignored by @code{makeinfo}.
+
+
+@node Cropmarks and Magnification
+@section Cropmarks and Magnification
+@findex cropmarks
+@cindex Cropmarks for printing
+@cindex Printing cropmarks
+You can (attempt to) direct @TeX{} to print cropmarks at the corners of
+pages with the @code{@@cropmarks} command. Write the @code{@@cropmarks}
+command on a line by itself between @code{@@iftex} and @code{@@end
+iftex} lines near the beginning of the Texinfo file, before the title
+page, like this:@refill
+
+@example
+@group
+@@iftex
+@@cropmarks
+@@end iftex
+@end group
+@end example
+
+This command is mainly for printers that typeset several pages on one
+sheet of film; but you can attempt to use it to mark the corners of a
+book set to 7 by 9.25 inches with the @code{@@smallbook} command.
+(Printers will not produce cropmarks for regular sized output that is
+printed on regular sized paper.) Since different printing machines work
+in different ways, you should explore the use of this command with a
+spirit of adventure. You may have to redefine the command in
+@file{texinfo.tex}.
+
+@findex \mag @r{(raw @TeX{} magnification)}
+@cindex Magnified printing
+@cindex Larger or smaller pages
+You can attempt to direct @TeX{} to typeset pages larger or smaller than
+usual with the @code{\mag} @TeX{} command. Everything that is typeset
+is scaled proportionally larger or smaller. (@code{\mag} stands for
+``magnification''.) This is @emph{not} a Texinfo @@-command, but is a
+plain @TeX{} command that is prefixed with a backslash. You have to
+write this command between @code{@@tex} and @code{@@end tex}
+(@pxref{Raw Formatter Commands}).
+
+Follow the @code{\mag} command with an @samp{=} and then a number that
+is 1000 times the magnification you desire. For example, to print pages
+at 1.2 normal size, write the following near the beginning of the
+Texinfo file, before the title page:
+
+@example
+@group
+@@tex
+\mag=1200
+@@end tex
+@end group
+@end example
+
+With some printing technologies, you can print normal-sized copies that
+look better than usual by giving a larger-than-normal master to your
+print shop. They do the reduction, thus effectively increasing the
+resolution.
+
+Depending on your system, DVI files prepared with a
+nonstandard-@code{\mag} may not print or may print only with certain
+magnifications. Be prepared to experiment.
+
+
+@node PDF Output
+@section PDF Output
+@cindex PDF output
+
+@pindex pdftex
+The simplest way to generate PDF output from Texinfo source is to run
+the convenience script @command{texi2pdf}; this simply executes the
+@command{texi2dvi} script with the @option{--pdf} option
+(@pxref{Format with texi2dvi}). If for some reason you want to
+process by hand, simply run the @command{pdftex} program instead of
+plain @command{tex}. That is, run @samp{pdftex foo.texi} instead of
+@samp{tex foo.texi}.
+
+@dfn{PDF} stands for `Portable Document Format'. It was invented by
+Adobe Systems some years ago for document interchange, based on their
+PostScript language. Related links:
+
+@itemize
+@item
+GNU GV, a @uref{http://www.foolabs.com/xpdf/, Ghostscript-based PDF
+reader}. (It can also preview PostScript documents.)
+
+@item
+A freely available standalone @uref{http://www.foolabs.com/xpdf/,
+PDF reader} for the X window system.
+
+@item
+@uref{http://partners.adobe.com/asn/acrobat/sdk/public/docs/, PDF definition}.
+
+@end itemize
+
+At present, Texinfo does not provide
+@samp{@@ifpdf} or @samp{@@pdf} commands as for the other output
+formats, since PDF documents contain many internal links that would be
+hard or impossible to get right at the Texinfo source level.
+
+PDF files require special software to be displayed, unlike the plain
+ASCII formats (Info, HTML) that Texinfo supports. They also tend to
+be much larger than the DVI files output by @TeX{} by default.
+Nevertheless, a PDF file does define an actual typeset document in a
+self-contained file, so it has its place.
+
+
+@node Obtaining TeX
+@section How to Obtain @TeX{}
+@cindex Obtaining @TeX{}
+@cindex @TeX{}, how to obtain
+
+@c !!! Here is information about obtaining TeX. Update it whenever.
+@c !!! Also consider updating TeX.README on ftp.gnu.org.
+@c Updated by RJC on 1 March 1995, conversation with MacKay.
+@c Updated by kb@cs.umb.edu on 29 July 1996.
+@c Updated by kb@cs.umb.edu on 25 April 1997.
+@c Updated by kb@cs.umb.edu on 27 February 1998.
+@TeX{} is freely redistributable. You can obtain @TeX{} for Unix
+systems via anonymous ftp or on physical media. The core material
+consists of the Web2c @TeX{} distribution (@uref{http://tug.org/web2c}).
+
+Instructions for retrieval by anonymous ftp and information on other
+available distributions:
+@uref{http://tug.org/unixtex.ftp}.
+
+The Free Software Foundation provides a core distribution on its Source
+Code CD-ROM suitable for printing Texinfo manuals. To order it, contact:
+
+@display
+@group
+Free Software Foundation, Inc.
+59 Temple Place Suite 330
+Boston, MA @ @ 02111-1307
+USA
+Telephone: @w{+1-617-542-5942}
+Fax: (including Japan) @w{+1-617-542-2652}
+Free Dial Fax (in Japan):
+@w{ } @w{ } @w{ } 0031-13-2473 (KDD)
+@w{ } @w{ } @w{ } 0066-3382-0158 (IDC)
+Electronic mail: @code{gnu@@gnu.org}
+@end group
+@end display
+
+Many other @TeX{} distributions are available; see
+@uref{http://tug.org/}.
+
+
+@node Creating and Installing Info Files
+@chapter Creating and Installing Info Files
+
+This chapter describes how to create and install Info files. @xref{Info
+Files}, for general information about the file format itself.
+
+@menu
+* Creating an Info File::
+* Installing an Info File::
+@end menu
+
+
+@node Creating an Info File
+@section Creating an Info File
+@cindex Creating an Info file
+@cindex Info, creating an online file
+@cindex Formatting a file for Info
+
+@code{makeinfo} is a program that converts a Texinfo file into an Info
+file, HTML file, or plain text. @code{texinfo-format-region} and
+@code{texinfo-format-buffer} are GNU Emacs functions that convert
+Texinfo to Info.
+
+For information on installing the Info file in the Info system,
+@pxref{Installing an Info File}.
+
+@menu
+* makeinfo advantages:: @code{makeinfo} provides better error checking.
+* Invoking makeinfo:: How to run @code{makeinfo} from a shell.
+* makeinfo options:: Specify fill-column and other options.
+* Pointer Validation:: How to check that pointers point somewhere.
+* makeinfo in Emacs:: How to run @code{makeinfo} from Emacs.
+* texinfo-format commands:: Two Info formatting commands written
+ in Emacs Lisp are an alternative
+ to @code{makeinfo}.
+* Batch Formatting:: How to format for Info in Emacs Batch mode.
+* Tag and Split Files:: How tagged and split files help Info
+ to run better.
+@end menu
+
+
+@node makeinfo advantages
+@subsection @code{makeinfo} Preferred
+
+The @code{makeinfo} utility creates an Info file from a Texinfo source
+file more quickly than either of the Emacs formatting commands and
+provides better error messages. We recommend it. @code{makeinfo} is a
+C program that is independent of Emacs. You do not need to run Emacs to
+use @code{makeinfo}, which means you can use @code{makeinfo} on machines
+that are too small to run Emacs. You can run @code{makeinfo} in any one
+of three ways: from an operating system shell, from a shell inside
+Emacs, or by typing the @kbd{C-c C-m C-r} or the @kbd{C-c C-m C-b}
+command in Texinfo mode in Emacs.
+
+The @code{texinfo-format-region} and the @code{texinfo-format-buffer}
+commands are useful if you cannot run @code{makeinfo}. Also, in some
+circumstances, they format short regions or buffers more quickly than
+@code{makeinfo}.
+
+
+@node Invoking makeinfo
+@subsection Running @code{makeinfo} from a Shell
+@pindex makeinfo
+
+To create an Info file from a Texinfo file, invoke @command{makeinfo}
+followed by the name of the Texinfo file. Thus, to create the Info
+file for Bison, type the following to the shell:
+
+@example
+makeinfo bison.texinfo
+@end example
+
+(You can run a shell inside Emacs by typing @kbd{M-x shell}.)
+
+@command{makeinfo} has many options to control its actions and output;
+see the next section.
+
+
+@node makeinfo options
+@subsection Options for @code{makeinfo}
+@cindex @code{makeinfo} options
+@cindex Options for @code{makeinfo}
+
+The @command{makeinfo} program accepts many options. Perhaps the most
+commonly needed are those that change the output format. By default,
+@command{makeinfo} outputs Info files.
+
+Each command line option is a word preceded by @samp{--} or a letter
+preceded by @samp{-}. You can use abbreviations for the long option
+names as long as they are unique.
+
+For example, you could use the following shell command to create an Info
+file for @file{bison.texinfo} in which each line is filled to only 68
+columns:
+
+@example
+makeinfo --fill-column=68 bison.texinfo
+@end example
+
+You can write two or more options in sequence, like this:@refill
+
+@example
+makeinfo --no-split --fill-column=70 @dots{}
+@end example
+
+@noindent
+This would keep the Info file together as one possibly very long
+file and would also set the fill column to 70.
+
+The options are:
+
+@table @code
+
+@item -D @var{var}
+@opindex -D @var{var}
+Cause the variable @var{var} to be defined. This is equivalent to
+@code{@@set @var{var}} in the Texinfo file (@pxref{set clear value}).
+
+@item --commands-in-node-names
+@opindex --commands-in-node-names
+Allow @code{@@}-commands in node names. This is not recommended, as it
+can probably never be implemented in @TeX{}. It also makes
+@code{makeinfo} much slower. Also, this option is ignored when
+@samp{--no-validate} is used. @xref{Pointer Validation}, for more
+details.
+
+@item --css-include=@var{file}
+@opindex --css-include
+Include the contents of @var{file}, which should contain cascading
+style sheets specifications, in the @samp{<style>} block of the HTML
+output. @xref{HTML CSS}. If @var{file} is @samp{-}, read standard
+input.
+
+@item --docbook
+@opindex --docbook
+Generate Docbook output rather than Info.
+
+@item --enable-encoding
+@opindex --enable-encoding
+Output accented and special characters in Info or plain text output
+based on @samp{@@documentencoding}.
+@xref{documentencoding,,@code{documentencoding}}, and @ref{Inserting Accents}.
+
+@item --error-limit=@var{limit}
+@itemx -e @var{limit}
+@opindex --error-limit=@var{limit}
+@opindex -e @var{limit}
+Set the maximum number of errors that @code{makeinfo} will report
+before exiting (on the assumption that continuing would be useless);
+default 100.
+
+@item --fill-column=@var{width}
+@itemx -f @var{width}
+@opindex --fill-column=@var{width}
+@opindex -f @var{width}
+Specify the maximum number of columns in a line; this is the right-hand
+edge of a line. Paragraphs that are filled will be filled to this
+width. (Filling is the process of breaking up and connecting lines so
+that lines are the same length as or shorter than the number specified
+as the fill column. Lines are broken between words.) The default value
+is 72. Ignored with @samp{--html}.
+
+@item --footnote-style=@var{style}
+@itemx -s @var{style}
+@opindex --footnote-style=@var{style}
+@opindex -s @var{style}
+Set the footnote style to @var{style}, either @samp{end} for the end
+node style (the default) or @samp{separate} for the separate node style.
+The value set by this option overrides the value set in a Texinfo file
+by an @code{@@footnotestyle} command (@pxref{Footnotes}). When the
+footnote style is @samp{separate}, @code{makeinfo} makes a new node
+containing the footnotes found in the current node. When the footnote
+style is @samp{end}, @code{makeinfo} places the footnote references at
+the end of the current node. Ignored with @samp{--html}.
+
+@item --force
+@itemx -F
+@opindex --force
+@opindex -F
+Ordinarily, if the input file has errors, the output files are not
+created. With this option, they are preserved.
+
+@item --help
+@itemx -h
+@opindex --help
+@opindex -h
+Print a usage message listing all available options, then exit successfully.
+
+@item --html
+@opindex --html
+Generate HTML output rather than Info. @xref{Generating HTML}. By
+default, the HTML output is split into one output file per Texinfo
+source node, and the split output is written into a subdirectory with
+the name of the top-level info file.
+
+@item -I @var{dir}
+@opindex -I @var{dir}
+Append @var{dir} to the directory search list for finding files that
+are included using the @code{@@include} command. By default,
+@code{makeinfo} searches only the current directory. If @var{dir} is
+not given, the current directory @file{.} is appended. Note that
+@var{dir} can actually be a list of several directories separated by the
+usual path separator character (@samp{:} on Unix, @samp{;} on
+MS-DOS/MS-Windows).
+
+@item --ifdocbook
+@opindex --ifdocbook
+@itemx --ifhtml
+@opindex --ifhtml
+@itemx --ifinfo
+@opindex --ifinfo
+@itemx --ifplaintext
+@opindex --ifplaintext
+@itemx --iftex
+@opindex --iftex
+@itemx --ifxml
+@opindex --ifxml
+For the specified format, process @samp{@@if@var{format}} and
+@samp{@@@var{format}} commands even if not generating the given output
+format. For instance, if @option{--iftex} is specified, then
+@samp{@@iftex} and @samp{@@tex} blocks will be read.
+
+@item --macro-expand=@var{file}
+@itemx -E @var{file}
+@opindex --macro-expand=@var{file}
+@opindex -E @var{file}
+Output the Texinfo source with all the macros expanded to the named
+file. Normally, the results of macro expansion are used internally by
+@code{makeinfo} and then discarded. This option is used by
+@command{texi2dvi}.
+
+@item --no-headers
+@item --plaintext
+@opindex --no-headers
+@opindex --plaintext
+@cindex Plain text output
+@cindex ASCII text output
+@cindex Generating plain text files
+@cindex @file{INSTALL} file, generating
+@cindex Node separators, omitting
+@cindex Menus, omitting
+Do not include menus or node separator lines in the output, and
+implicitly @option{--enable-encoding} (see above). This results in a
+simple plain text file that you can (for example) send in email
+without complications, or include in a distribution (as in an
+@file{INSTALL} file).
+
+@cindex Navigation links, omitting
+For HTML output, likewise omit menus. And if @samp{--no-split} is also
+specified, do not include a navigation links at the top of each node
+(these are never included in the default case of split output).
+@xref{Generating HTML}.
+
+In both cases, ignore @code{@@setfilename} and write to standard
+output by default---can be overridden with @option{-o}.
+
+@item --no-ifdocbook
+@opindex --no-ifdocbook
+@itemx --no-ifhtml
+@opindex --no-ifhtml
+@itemx --no-ifinfo
+@opindex --no-ifinfo
+@itemx --no-ifplaintext
+@opindex --no-ifplaintext
+@itemx --no-iftex
+@opindex --no-iftex
+@itemx --no-ifxml
+@opindex --no-ifxml
+Do not process @samp{@@if@var{format}} and @samp{@@@var{format}}
+commands, and do process @samp{@@ifnot@var{format}}, even if
+generating the given format. For instance, if @option{--no-ifhtml} is
+specified, then @samp{@@ifhtml} and @samp{@@html} blocks will not be
+read, and @samp{@@ifnothtml} blocks will be.
+
+@item --no-number-footnotes
+@opindex --no-number-footnotes
+Suppress automatic footnote numbering. By default, @code{makeinfo}
+numbers each footnote sequentially in a single node, resetting the
+current footnote number to 1 at the start of each node.
+
+@item --no-number-sections
+@opindex --no-number-sections
+Do not output chapter, section, and appendix numbers.
+You need to specify this if your manual is not hierarchically-structured.
+
+@item --no-split
+@opindex --no-split
+@cindex Splitting of output files
+@cindex Output file splitting
+Suppress the splitting stage of @code{makeinfo}. By default, large
+output files (where the size is greater than 70k bytes) are split into
+smaller subfiles. For Info output, each one is approximately 50k bytes.
+For HTML output, each file contains one node (@pxref{Generating HTML}).
+
+@item --no-pointer-validate
+@itemx --no-validate
+@opindex --no-pointer-validate
+@opindex --no-validate
+@cindex Pointer validation, suppressing
+Suppress the pointer-validation phase of @code{makeinfo}---a dangerous
+thing to do. This can also be done with the @code{@@novalidate}
+command (@pxref{Use TeX,,Use @TeX{}}). Normally, after a Texinfo file
+is processed, some consistency checks are made to ensure that cross
+references can be resolved, etc. @xref{Pointer Validation}.
+
+@item --no-warn
+@opindex --no-warn
+Suppress warning messages (but @emph{not} error messages).
+
+@item --number-sections
+@opindex --number-sections
+Output chapter, section, and appendix numbers as in printed manuals.
+This is the default. It works only with hierarchically-structured
+manuals.
+
+@item --output=@var{file}
+@itemx -o @var{file}
+@opindex --output=@var{file}
+@opindex -o @var{file}
+Specify that the output should be directed to @var{file} and not to the
+file name specified in the @code{@@setfilename} command found in the
+Texinfo source (@pxref{setfilename}). If @var{file} is @samp{-}, output
+goes to standard output and @samp{--no-split} is implied. For split
+HTML output, @var{file} is the name for the directory into which all
+HTML nodes are written (@pxref{Generating HTML}).
+
+@item -P @var{dir}
+@opindex -P @var{dir}
+Prepend @var{dir} to the directory search list for @code{@@include}.
+If @var{dir} is not given, the current directory @file{.} is prepended.
+See @samp{-I} for more details.
+
+@item --paragraph-indent=@var{indent}
+@itemx -p @var{indent}
+@opindex --paragraph-indent=@var{indent}
+@opindex -p @var{indent}
+Set the paragraph indentation style to @var{indent}. The value set by
+this option overrides the value set in a Texinfo file by an
+@code{@@paragraphindent} command (@pxref{paragraphindent}). The value
+of @var{indent} is interpreted as follows:
+
+@table @asis
+@item @samp{asis}
+Preserve any existing indentation at the starts of paragraphs.
+
+@item @samp{0} or @samp{none}
+Delete any existing indentation.
+
+@item @var{num}
+Indent each paragraph by @var{num} spaces.
+@end table
+
+@item --reference-limit=@var{limit}
+@itemx -r @var{limit}
+@opindex --reference-limit=@var{limit}
+@opindex -r @var{limit}
+Set the value of the number of references to a node that
+@code{makeinfo} will make without reporting a warning. If a node has more
+than this number of references in it, @code{makeinfo} will make the
+references but also report a warning. The default is 1000.
+
+@item --split-size=@var{num}
+@opindex --split-size=@var{num}
+Keep Info files to at most @var{num} characters; default is 300,000.
+
+@item -U @var{var}
+Cause @var{var} to be undefined. This is equivalent to
+@code{@@clear @var{var}} in the Texinfo file (@pxref{set clear value}).
+
+@item --verbose
+@opindex --verbose
+Cause @code{makeinfo} to display messages saying what it is doing.
+Normally, @code{makeinfo} only outputs messages if there are errors or
+warnings.
+
+@item --version
+@itemx -V
+@opindex --version
+@opindex -V
+Print the version number, then exit successfully.
+
+@item --xml
+@opindex --xml
+Generate XML output rather than Info.
+
+@end table
+
+@vindex TEXINFO_OUTPUT_FORMAT
+@cindex Environment variable @code{TEXINFO_OUTPUT_FORMAT}
+@command{makeinfo} also reads the environment variable
+@env{TEXINFO_OUTPUT_FORMAT} to determine the output format, if not
+overridden by a command line option. The possible values are:
+
+@example
+docbook html info plaintext xml
+@end example
+
+If not set, Info output is the default.
+
+
+@node Pointer Validation
+@subsection Pointer Validation
+@cindex Pointer validation with @code{makeinfo}
+@cindex Validation of pointers
+
+If you do not suppress pointer validation with the @samp{--no-validate}
+option or the @code{@@novalidate} command in the source file (@pxref{Use
+TeX,,Use @TeX{}}), @code{makeinfo} will check the validity of the final
+Info file. Mostly, this means ensuring that nodes you have referenced
+really exist. Here is a complete list of what is checked:
+
+@enumerate
+@item
+If a `Next', `Previous', or `Up' node reference is a reference to a
+node in the current file and is not an external reference such as to
+@file{(dir)}, then the referenced node must exist.@refill
+
+@item
+In every node, if the `Previous' node is different from the `Up' node,
+then the node pointed to by the `Previous' field must have a `Next'
+field which points back to this node.@refill
+
+@item
+Every node except the `Top' node must have an `Up' pointer.@refill
+
+@item
+The node referenced by an `Up' pointer must itself reference the current
+node through a menu item, unless the node referenced by `Up'
+has the form `(@var{file})'.
+
+@item
+If the `Next' reference of a node is not the same as the `Next' reference
+of the `Up' reference, then the node referenced by the `Next' pointer
+must have a `Previous' pointer that points back to the current node.
+This rule allows the last node in a section to point to the first node
+of the next chapter.@refill
+
+@item
+Every node except `Top' should be referenced by at least one other node,
+either via the `Previous' or `Next' links, or via a menu or a
+cross-reference.@refill
+@end enumerate
+
+@cindex @@-commands in @@node, limited support
+Some Texinfo documents might fail during the validation phase because
+they use commands like @code{@@value} and @code{@@definfoenclose} in
+node definitions and cross-references inconsistently. (Your best bet
+is to avoid using @@-commands in node names.) Consider the
+following example:
+
+@example
+@group
+@@set nodename Node 1
+
+@@node @@value@{nodename@}, Node 2, Top, Top
+
+This is node 1.
+
+@@node Node 2, , Node 1, Top
+
+This is node 2.
+@end group
+@end example
+
+@noindent
+Here, the node ``Node 1'' was referenced both verbatim and through
+@code{@@value}.
+
+By default, @code{makeinfo} fails such cases, because node names are not
+fully expanded until they are written to the output file. You should
+always try to reference nodes consistently; e.g., in the above example,
+the second @code{@@node} line should have also used @code{@@value}.
+However, if, for some reason, you @emph{must} reference node names
+inconsistently, and @code{makeinfo} fails to validate the file, you can
+use the @samp{--commands-in-node-names} option to force @code{makeinfo}
+to perform the expensive expansion of all node names it finds in the
+document. This might considerably slow down the program, though;
+twofold increase in conversion time was measured for large documents
+such as the Jargon file.
+
+@cindex @@value in @@node lines
+The support for @code{@@}-commands in @code{@@node} directives is not
+general enough to be freely used. For example, if the example above
+redefined @code{nodename} somewhere in the document, @code{makeinfo}
+will fail to convert it, even if invoked with the
+@samp{--commands-in-node-names} option.
+
+@samp{--commands-in-node-names} has no effect if the @samp{--no-validate}
+option is given.
+
+
+@node makeinfo in Emacs
+@subsection Running @code{makeinfo} Within Emacs
+@cindex Running @code{makeinfo} in Emacs
+@cindex @code{makeinfo} inside Emacs
+@cindex Shell, running @code{makeinfo} in
+
+You can run @code{makeinfo} in GNU Emacs Texinfo mode by using either the
+@code{makeinfo-region} or the @code{makeinfo-buffer} commands. In
+Texinfo mode, the commands are bound to @kbd{C-c C-m C-r} and @kbd{C-c
+C-m C-b} by default.@refill
+
+@table @kbd
+@item C-c C-m C-r
+@itemx M-x makeinfo-region
+Format the current region for Info.@refill
+@findex makeinfo-region
+
+@item C-c C-m C-b
+@itemx M-x makeinfo-buffer
+Format the current buffer for Info.@refill
+@findex makeinfo-buffer
+@end table
+
+When you invoke @code{makeinfo-region} the output goes to a temporary
+buffer. When you invoke @code{makeinfo-buffer} output goes to the
+file set with @code{@@setfilename} (@pxref{setfilename}).
+
+The Emacs @code{makeinfo-region} and @code{makeinfo-buffer} commands
+run the @code{makeinfo} program in a temporary shell buffer. If
+@code{makeinfo} finds any errors, Emacs displays the error messages in
+the temporary buffer.@refill
+
+@cindex Errors, parsing
+@cindex Parsing errors
+@findex next-error
+You can parse the error messages by typing @kbd{C-x `}
+(@code{next-error}). This causes Emacs to go to and position the
+cursor on the line in the Texinfo source that @code{makeinfo} thinks
+caused the error. @xref{Compilation, , Running @code{make} or
+Compilers Generally, emacs, The GNU Emacs Manual}, for more
+information about using the @code{next-error} command.@refill
+
+In addition, you can kill the shell in which the @code{makeinfo}
+command is running or make the shell buffer display its most recent
+output.@refill
+
+@table @kbd
+@item C-c C-m C-k
+@itemx M-x makeinfo-kill-job
+@findex makeinfo-kill-job
+Kill the current running @code{makeinfo} job
+(from @code{makeinfo-region} or @code{makeinfo-buffer}).@refill
+
+@item C-c C-m C-l
+@itemx M-x makeinfo-recenter-output-buffer
+@findex makeinfo-recenter-output-buffer
+Redisplay the @code{makeinfo} shell buffer to display its most recent
+output.@refill
+@end table
+
+@noindent
+(Note that the parallel commands for killing and recentering a @TeX{}
+job are @kbd{C-c C-t C-k} and @kbd{C-c C-t C-l}. @xref{Texinfo Mode
+Printing}.)@refill
+
+You can specify options for @code{makeinfo} by setting the
+@code{makeinfo-options} variable with either the @kbd{M-x
+customize} or the @kbd{M-x set-variable} command, or by setting the
+variable in your @file{.emacs} initialization file.
+
+For example, you could write the following in your @file{.emacs} file:@refill
+
+@example
+@group
+(setq makeinfo-options
+ "--paragraph-indent=0 --no-split
+ --fill-column=70 --verbose")
+@end group
+@end example
+
+@noindent
+@c If you write these three cross references using xref, you see
+@c three references to the same named manual, which looks strange.
+@iftex
+For more information, see @ref{makeinfo options, , Options for
+@code{makeinfo}}, as well as ``Easy Customization Interface,'' ``Examining
+and Setting Variables,'' and ``Init File'' in @cite{The GNU Emacs
+Manual}.
+@end iftex
+@ifnottex
+For more information, see@*
+@ref{Easy Customization, , Easy Customization Interface, emacs, The GNU Emacs Manual},@*
+@ref{Examining, , Examining and Setting Variables, emacs, The GNU Emacs Manual},@*
+@ref{Init File, , , emacs, The GNU Emacs Manual}, and@*
+@ref{makeinfo options, , Options for @code{makeinfo}}.
+@end ifnottex
+
+@node texinfo-format commands
+@subsection The @code{texinfo-format@dots{}} Commands
+
+In GNU Emacs in Texinfo mode, you can format part or all of a Texinfo
+file with the @code{texinfo-format-region} command. This formats the
+current region and displays the formatted text in a temporary buffer
+called @samp{*Info Region*}.@refill
+
+Similarly, you can format a buffer with the
+@code{texinfo-format-buffer} command. This command creates a new
+buffer and generates the Info file in it. Typing @kbd{C-x C-s} will
+save the Info file under the name specified by the
+@code{@@setfilename} line which must be near the beginning of the
+Texinfo file.@refill
+
+@table @kbd
+@item C-c C-e C-r
+@itemx @code{texinfo-format-region}
+@findex texinfo-format-region
+Format the current region for Info.
+
+@item C-c C-e C-b
+@itemx @code{texinfo-format-buffer}
+@findex texinfo-format-buffer
+Format the current buffer for Info.
+@end table
+
+The @code{texinfo-format-region} and @code{texinfo-format-buffer}
+commands provide you with some error checking, and other functions can
+provide you with further help in finding formatting errors. These
+procedures are described in an appendix; see @ref{Catching Mistakes}.
+However, the @code{makeinfo} program is often faster and
+provides better error checking (@pxref{makeinfo in Emacs}).@refill
+
+@node Batch Formatting
+@comment node-name, next, previous, up
+@subsection Batch Formatting
+@cindex Batch formatting for Info
+@cindex Info batch formatting
+
+You can format Texinfo files for Info using @code{batch-texinfo-format}
+and Emacs Batch mode. You can run Emacs in Batch mode from any shell,
+including a shell inside of Emacs. (@xref{Command Arguments,,,
+emacs, The GNU Emacs Manual}.)
+
+Here is a shell command to format all the files that end in
+@file{.texinfo} in the current directory:
+
+@example
+emacs -batch -funcall batch-texinfo-format *.texinfo
+@end example
+
+@noindent
+Emacs processes all the files listed on the command line, even if an
+error occurs while attempting to format some of them.@refill
+
+Run @code{batch-texinfo-format} only with Emacs in Batch mode as shown;
+it is not interactive. It kills the Batch mode Emacs on completion.@refill
+
+@code{batch-texinfo-format} is convenient if you lack @code{makeinfo}
+and want to format several Texinfo files at once. When you use Batch
+mode, you create a new Emacs process. This frees your current Emacs, so
+you can continue working in it. (When you run
+@code{texinfo-format-region} or @code{texinfo-format-buffer}, you cannot
+use that Emacs for anything else until the command finishes.)@refill
+
+@node Tag and Split Files
+@comment node-name, next, previous, up
+@subsection Tag Files and Split Files
+@cindex Making a tag table automatically
+@cindex Tag table, making automatically
+
+If a Texinfo file has more than 30,000 bytes,
+@code{texinfo-format-buffer} automatically creates a tag table
+for its Info file; @code{makeinfo} always creates a tag table. With
+a @dfn{tag table}, Info can jump to new nodes more quickly than it can
+otherwise.@refill
+
+@cindex Indirect subfiles
+In addition, if the Texinfo file contains more than about 300,000
+bytes, @code{texinfo-format-buffer} and @code{makeinfo} split the
+large Info file into shorter @dfn{indirect} subfiles of about 300,000
+bytes each. Big files are split into smaller files so that Emacs does
+not need to make a large buffer to hold the whole of a large Info
+file; instead, Emacs allocates just enough memory for the small, split-off
+file that is needed at the time. This way, Emacs avoids wasting
+memory when you run Info. (Before splitting was implemented, Info
+files were always kept short and @dfn{include files} were designed as
+a way to create a single, large printed manual out of the smaller Info
+files. @xref{Include Files}, for more information. Include files are
+still used for very large documents, such as @cite{The Emacs Lisp
+Reference Manual}, in which each chapter is a separate file.)@refill
+
+When a file is split, Info itself makes use of a shortened version of
+the original file that contains just the tag table and references to
+the files that were split off. The split-off files are called
+@dfn{indirect} files.@refill
+
+The split-off files have names that are created by appending @w{@samp{-1}},
+@w{@samp{-2}}, @w{@samp{-3}} and so on to the file name specified by the
+@code{@@setfilename} command. The shortened version of the original file
+continues to have the name specified by @code{@@setfilename}.@refill
+
+At one stage in writing this document, for example, the Info file was saved
+as the file @file{test-texinfo} and that file looked like this:@refill
+
+@example
+@group
+Info file: test-texinfo, -*-Text-*-
+produced by texinfo-format-buffer
+from file: new-texinfo-manual.texinfo
+
+^_
+Indirect:
+test-texinfo-1: 102
+test-texinfo-2: 50422
+@end group
+@group
+test-texinfo-3: 101300
+^_^L
+Tag table:
+(Indirect)
+Node: overview^?104
+Node: info file^?1271
+@end group
+@group
+Node: printed manual^?4853
+Node: conventions^?6855
+@dots{}
+@end group
+@end example
+
+@noindent
+(But @file{test-texinfo} had far more nodes than are shown here.) Each of
+the split-off, indirect files, @file{test-texinfo-1},
+@file{test-texinfo-2}, and @file{test-texinfo-3}, is listed in this file
+after the line that says @samp{Indirect:}. The tag table is listed after
+the line that says @samp{Tag table:}. @refill
+
+In the list of indirect files, the number following the file name
+records the cumulative number of bytes in the preceding indirect files,
+not counting the file list itself, the tag table, or the permissions
+text in each file. In the tag table, the number following the node name
+records the location of the beginning of the node, in bytes from the
+beginning of the (unsplit) output.
+
+If you are using @code{texinfo-format-buffer} to create Info files,
+you may want to run the @code{Info-validate} command. (The
+@code{makeinfo} command does such a good job on its own, you do not
+need @code{Info-validate}.) However, you cannot run the @kbd{M-x
+Info-validate} node-checking command on indirect files. For
+information on how to prevent files from being split and how to
+validate the structure of the nodes, see @ref{Using Info-validate}.
+
+
+@node Installing an Info File
+@section Installing an Info File
+@cindex Installing an Info file
+@cindex Info file installation
+@cindex @file{dir} directory for Info installation
+
+Info files are usually kept in the @file{info} directory. You can read
+Info files using the standalone Info program or the Info reader built
+into Emacs. (@inforef{Top, info, info}, for an introduction to Info.)
+
+@menu
+* Directory File:: The top level menu for all Info files.
+* New Info File:: Listing a new Info file.
+* Other Info Directories:: How to specify Info files that are
+ located in other directories.
+* Installing Dir Entries:: How to specify what menu entry to add
+ to the Info directory.
+* Invoking install-info:: @code{install-info} options.
+@end menu
+
+
+@node Directory File
+@subsection The Directory File @file{dir}
+
+For Info to work, the @file{info} directory must contain a file that
+serves as a top level directory for the Info system. By convention,
+this file is called @file{dir}. (You can find the location of this file
+within Emacs by typing @kbd{C-h i} to enter Info and then typing
+@kbd{C-x C-f} to see the pathname to the @file{info} directory.)
+
+The @file{dir} file is itself an Info file. It contains the top level
+menu for all the Info files in the system. The menu looks like
+this:@refill
+
+@example
+@group
+* Menu:
+* Info: (info). Documentation browsing system.
+* Emacs: (emacs). The extensible, self-documenting
+ text editor.
+* Texinfo: (texinfo). With one source file, make
+ either a printed manual using
+ @@TeX@{@} or an Info file.
+@dots{}
+@end group
+@end example
+
+Each of these menu entries points to the `Top' node of the Info file
+that is named in parentheses. (The menu entry does not need to
+specify the `Top' node, since Info goes to the `Top' node if no node
+name is mentioned. @xref{Other Info Files, , Nodes in Other Info
+Files}.)@refill
+
+Thus, the @samp{Info} entry points to the `Top' node of the
+@file{info} file and the @samp{Emacs} entry points to the `Top' node
+of the @file{emacs} file.@refill
+
+In each of the Info files, the `Up' pointer of the `Top' node refers
+back to the @code{dir} file. For example, the line for the `Top'
+node of the Emacs manual looks like this in Info:@refill
+
+@example
+File: emacs Node: Top, Up: (DIR), Next: Distrib
+@end example
+
+@noindent
+In this case, the @file{dir} file name is written in upper case
+letters---it can be written in either upper or lower case. This is not
+true in general, it is a special case for @file{dir}.
+
+
+@node New Info File
+@subsection Listing a New Info File
+@cindex Adding a new Info file
+@cindex Listing a new Info file
+@cindex New Info file, listing it in @file{dir} file
+@cindex Info file, listing a new
+@cindex @file{dir} file listing
+
+To add a new Info file to your system, you must write a menu entry to
+add to the menu in the @file{dir} file in the @file{info} directory.
+For example, if you were adding documentation for GDB, you would write
+the following new entry:@refill
+
+@example
+* GDB: (gdb). The source-level C debugger.
+@end example
+
+@noindent
+The first part of the menu entry is the menu entry name, followed by a
+colon. The second part is the name of the Info file, in parentheses,
+followed by a period. The third part is the description.
+
+The name of an Info file often has a @file{.info} extension. Thus, the
+Info file for GDB might be called either @file{gdb} or @file{gdb.info}.
+The Info reader programs automatically try the file name both with and
+without @file{.info}@footnote{On MS-DOS/MS-Windows systems, Info will
+try the @file{.inf} extension as well.}; so it is better to avoid
+clutter and not to write @samp{.info} explicitly in the menu entry. For
+example, the GDB menu entry should use just @samp{gdb} for the file
+name, not @samp{gdb.info}.
+
+
+@node Other Info Directories
+@subsection Info Files in Other Directories
+@cindex Installing Info in another directory
+@cindex Info installed in another directory
+@cindex Another Info directory
+@cindex @file{dir} files and Info directories
+
+If an Info file is not in the @file{info} directory, there are three
+ways to specify its location:@refill
+
+@enumerate
+@item
+Write the pathname in the @file{dir} file as the second part of the menu.
+
+@item
+If you are using Emacs, list the name of the file in a second @file{dir}
+file, in its directory; and then add the name of that directory to the
+@code{Info-directory-list} variable in your personal or site
+initialization file.
+
+This variable tells Emacs where to look for @file{dir} files (the files
+must be named @file{dir}). Emacs merges the files named @file{dir} from
+each of the listed directories. (In Emacs version 18, you can set the
+@code{Info-directory} variable to the name of only one
+directory.)@refill
+
+@item
+Specify the Info directory name in the @code{INFOPATH} environment
+variable in your @file{.profile} or @file{.cshrc} initialization file.
+(Only you and others who set this environment variable will be able to
+find Info files whose location is specified this way.)
+@end enumerate
+
+For example, to reach a test file in the @file{/home/bob/info}
+directory, you could add an entry like this to the menu in the
+standard @file{dir} file:@refill
+
+@example
+* Test: (/home/bob/info/info-test). Bob's own test file.
+@end example
+
+@noindent
+In this case, the absolute file name of the @file{info-test} file is
+written as the second part of the menu entry.@refill
+
+Alternatively, you could write the following in your @file{.emacs} file:
+
+@vindex Info-directory-list
+@example
+@group
+(require 'info)
+(setq Info-directory-list
+ (cons (expand-file-name "/home/bob/info")
+ Info-directory-list))
+@end group
+@end example
+
+This tells Emacs to merge the system @file{dir} file with the @file{dir}
+file in @file{/home/bob/info}. Thus, Info will list the
+@file{/home/bob/info/info-test} file as a menu entry in the
+@file{/home/bob/info/dir} file. Emacs does the merging only when
+@kbd{M-x info} is first run, so if you want to set
+@code{Info-directory-list} in an Emacs session where you've already run
+@code{info}, you must @code{(setq Info-dir-contents nil)} to force Emacs
+to recompose the @file{dir} file.
+
+@vindex INFOPATH
+@cindex Environment variable @code{INFOPATH}
+Finally, you can tell Info where to look by setting the @code{INFOPATH}
+environment variable in your shell startup file, such as @file{.cshrc},
+@file{.profile} or @file{autoexec.bat}. If you use a Bourne-compatible
+shell such as @code{sh} or @code{bash} for your shell command
+interpreter, you set the @code{INFOPATH} environment variable in the
+@file{.profile} initialization file; but if you use @code{csh} or
+@code{tcsh}, you set the variable in the @file{.cshrc} initialization
+file. On MS-DOS/MS-Windows systems, you must set @code{INFOPATH} in
+your @file{autoexec.bat} file or in the Registry. Each type of shell
+uses a different syntax.
+
+@itemize @bullet
+@item
+In a @file{.cshrc} file, you could set the @code{INFOPATH}
+variable as follows:@refill
+
+@smallexample
+setenv INFOPATH .:~/info:/usr/local/emacs/info
+@end smallexample
+
+@item
+In a @file{.profile} file, you would achieve the same effect by
+writing:@refill
+
+@smallexample
+INFOPATH=.:$HOME/info:/usr/local/emacs/info
+export INFOPATH
+@end smallexample
+
+@item
+@pindex autoexec.bat
+In a @file{autoexec.bat} file, you write this command@footnote{Note the
+use of @samp{;} as the directory separator, and a different syntax for
+using values of other environment variables.}:
+
+@smallexample
+set INFOPATH=.;%HOME%/info;c:/usr/local/emacs/info
+@end smallexample
+@end itemize
+
+@noindent
+The @samp{.} indicates the current directory as usual. Emacs uses the
+@code{INFOPATH} environment variable to initialize the value of Emacs's
+own @code{Info-directory-list} variable. The stand-alone Info reader
+merges any files named @file{dir} in any directory listed in the
+@env{INFOPATH} variable into a single menu presented to you in the node
+called @samp{(dir)Top}.
+
+@cindex Colon, last in @env{INFOPATH}
+However you set @env{INFOPATH}, if its last character is a
+colon@footnote{On MS-DOS/MS-Windows systems, use semi-colon instead.}, this
+is replaced by the default (compiled-in) path. This gives you a way to
+augment the default path with new directories without having to list all
+the standard places. For example (using @code{sh} syntax):
+
+@example
+INFOPATH=/local/info:
+export INFOPATH
+@end example
+
+@noindent
+will search @file{/local/info} first, then the standard directories.
+Leading or doubled colons are not treated specially.
+
+@cindex @file{dir} file, creating your own
+When you create your own @file{dir} file for use with
+@code{Info-directory-list} or @env{INFOPATH}, it's easiest to start by
+copying an existing @file{dir} file and replace all the text after the
+@samp{* Menu:} with your desired entries. That way, the punctuation and
+special CTRL-_ characters that Info needs will be present.
+
+
+@node Installing Dir Entries
+@subsection Installing Info Directory Files
+
+When you install an Info file onto your system, you can use the program
+@code{install-info} to update the Info directory file @file{dir}.
+Normally the makefile for the package runs @code{install-info}, just
+after copying the Info file into its proper installed location.
+
+@findex dircategory
+@findex direntry
+In order for the Info file to work with @code{install-info}, you include
+the commands @code{@@dircategory} and
+@code{@@direntry}@dots{}@code{@@end direntry} in the Texinfo source
+file. Use @code{@@direntry} to specify the menu entries to add to the
+Info directory file, and use @code{@@dircategory} to specify which part
+of the Info directory to put it in. Here is how these commands are used
+in this manual:
+
+@smallexample
+@@dircategory Texinfo documentation system
+@@direntry
+* Texinfo: (texinfo). The GNU documentation format.
+* install-info: (texinfo)Invoking install-info. @dots{}
+@dots{}
+@@end direntry
+@end smallexample
+
+Here's what this produces in the Info file:
+
+@smallexample
+INFO-DIR-SECTION Texinfo documentation system
+START-INFO-DIR-ENTRY
+* Texinfo: (texinfo). The GNU documentation format.
+* install-info: (texinfo)Invoking install-info. @dots{}
+@dots{}
+END-INFO-DIR-ENTRY
+@end smallexample
+
+@noindent
+The @code{install-info} program sees these lines in the Info file, and
+that is how it knows what to do.
+
+Always use the @code{@@direntry} and @code{@@dircategory} commands near
+the beginning of the Texinfo input, before the first @code{@@node}
+command. If you use them later on in the input, @code{install-info}
+will not notice them.
+
+If you use @code{@@dircategory} more than once in the Texinfo source,
+each usage specifies the `current' category; any subsequent
+@code{@@direntry} commands will add to that category.
+
+@cindex Free Software Directory
+@cindex Dir categories, choosing
+@cindex Categories, choosing
+When choosing a category name for the @code{@@dircategory} command, we
+recommend consulting the @uref{http://www.gnu.org/directory,
+Free Software Directory}. If your program is not listed there,
+or listed incorrectly or incompletely, please report the situation to
+the directory maintainers (@email{bug-directory@@gnu.org}) so that the
+category names can be kept in sync.
+
+Here are a few examples (see the @file{util/dir-example} file in the
+Texinfo distribution for large sample @code{dir} file):
+
+@display
+Emacs
+Localization
+Printing
+Software development
+Software libraries
+Text creation and manipulation
+@end display
+
+@cindex Invoking nodes, including in dir file
+Each `Invoking' node for every program installed should have a
+corresponding @code{@@direntry}. This lets users easily find the
+documentation for the different programs they can run, as with the
+traditional @command{man} system.
+
+
+@node Invoking install-info
+@subsection Invoking @command{install-info}
+@pindex install-info
+
+@code{install-info} inserts menu entries from an Info file into the
+top-level @file{dir} file in the Info system (see the previous sections
+for an explanation of how the @file{dir} file works). It's most often
+run as part of software installation, or when constructing a @file{dir} file
+for all manuals on a system. Synopsis:
+
+@example
+install-info [@var{option}]@dots{} [@var{info-file} [@var{dir-file}]]
+@end example
+
+If @var{info-file} or @var{dir-file} are not specified, the options
+(described below) that define them must be. There are no compile-time
+defaults, and standard input is never used. @code{install-info} can
+read only one Info file and write only one @file{dir} file per invocation.
+
+@cindex @file{dir}, created by @code{install-info}
+If @var{dir-file} (however specified) does not exist,
+@code{install-info} creates it if possible (with no entries).
+
+@cindex Compressed files, reading
+@cindex Dir files, compressed
+If any input file is compressed with @code{gzip} (@pxref{Invoking
+gzip,,,gzip, Gzip}), @code{install-info} automatically uncompresses it
+for reading. And if @var{dir-file} is compressed, @code{install-info}
+also automatically leaves it compressed after writing any changes.
+If @var{dir-file} itself does not exist, @code{install-info} tries to
+open @file{@var{dir-file}.gz}.
+
+Options:
+
+@table @code
+@item --delete
+@opindex --delete
+Delete the entries in @var{info-file} from @var{dir-file}. The file
+name in the entry in @var{dir-file} must be @var{info-file} (except for
+an optional @samp{.info} in either one). Don't insert any new entries.
+
+@item --dir-file=@var{name}
+@itemx -d @var{name}
+@opindex --dir-file=@var{name}
+@opindex -d @var{name}
+Specify file name of the Info directory file. This is equivalent to
+using the @var{dir-file} argument.
+
+@item --entry=@var{text}
+@itemx -e @var{text}
+@opindex --entry=@var{text}
+@opindex -e @var{text}
+Insert @var{text} as an Info directory entry; @var{text} should have the
+form of an Info menu item line plus zero or more extra lines starting
+with whitespace. If you specify more than one entry, they are all
+added. If you don't specify any entries, they are determined from
+information in the Info file itself.
+
+@item --help
+@itemx -h
+@opindex --help
+@opindex -h
+Display a usage message listing basic usage and all available options,
+then exit successfully.
+
+@item --info-file=@var{file}
+@itemx -i @var{file}
+@opindex --info-file=@var{file}
+@opindex -i @var{file}
+Specify Info file to install in the directory.
+Equivalent to using the @var{info-file} argument.
+
+@item --info-dir=@var{dir}
+@itemx -D @var{dir}
+@opindex --info-dir=@var{dir}
+@opindex -D @var{dir}
+Specify the directory where the directory file @file{dir} resides.
+Equivalent to @samp{--dir-file=@var{dir}/dir}.
+
+@item --item=@var{text}
+@opindex --item=@var{text}
+Same as @samp{--entry=@var{text}}. An Info directory entry is actually
+a menu item.
+
+@item --quiet
+@opindex --quiet
+Suppress warnings.
+
+@item --remove
+@itemx -r
+@opindex --remove
+@opindex -r
+Same as @samp{--delete}.
+
+@item --section=@var{sec}
+@itemx -s @var{sec}
+@opindex --section=@var{sec}
+@opindex -s @var{sec}
+Put this file's entries in section @var{sec} of the directory. If you
+specify more than one section, all the entries are added in each of the
+sections. If you don't specify any sections, they are determined from
+information in the Info file itself.
+
+@item --version
+@itemx -V
+@opindex --version
+@opindex -V
+@cindex Version number, for install-info
+Display version information and exit successfully.
+
+@end table
+
+
+@node Generating HTML
+@chapter Generating HTML
+@cindex HTML output
+
+@command{makeinfo} generates Info output by default, but given the
+@option{--html} option, it will generate HTML, for web browsers and
+other programs. This chapter gives some details on such HTML output.
+
+
+@command{makeinfo} can also write in XML and Docbook format, but we do
+not as yet describe these further. @xref{Output Formats}, for a brief
+overview of all the output formats.
+
+@menu
+* HTML Translation:: Details of the HTML output.
+* HTML Splitting:: How HTML output is split.
+* HTML CSS:: Influencing HTML output with Cascading Style Sheets.
+* HTML Xref:: Cross-references in HTML output.
+@end menu
+
+
+@node HTML Translation
+@section HTML Translation
+
+@command{makeinfo} will include segments of Texinfo source between
+@code{@@ifhtml} and @code{@@end ifhtml} in the HTML output (but not
+any of the other conditionals, by default). Source between
+@code{@@html} and @code{@@end html} is passed without change to the
+output (i.e., suppressing the normal escaping of input @samp{<},
+@samp{>} and @samp{&} characters which have special significance in
+HTML). @xref{Conditional Commands}.
+
+@opindex --footnote-style@r{, ignored in HTML output}
+The @option{--footnote-style} option is currently ignored for HTML output;
+footnotes are always linked to the end of the output file.
+
+@cindex Navigation bar, in HTML output
+By default, a navigation bar is inserted at the start of each node,
+analogous to Info output. The @samp{--no-headers} option suppresses
+this if used with @samp{--no-split}. Header @code{<link>} elements in
+split output can support info-like navigation with browsers like Lynx
+and @w{Emacs W3} which implement this HTML@tie{}1.0 feature.
+
+@cindex HTML output, browser compatibility of
+The HTML generated is mostly standard (i.e., HTML@tie{}2.0, RFC-1866).
+One exception is that HTML@tie{}3.2 tables are generated from the
+@code{@@multitable} command, but tagged to degrade as well as possible
+in browsers without table support. The HTML@tie{}4 @samp{lang}
+attribute on the @samp{<html>} attribute is also used. (Please report
+output from an error-free run of @code{makeinfo} which has browser
+portability problems as a bug.)
+
+
+@node HTML Splitting
+@section HTML Splitting
+@cindex Split HTML output
+@cindex HTML output, split
+
+When splitting output (which is the default), @command{makeinfo}
+writes HTML output into (generally) one output file per Texinfo source
+@code{@@node}.
+
+The output file name is the node name with special characters replaced
+by @samp{-}'s, so it can work as a filename. In the unusual case of
+two different nodes having the same name after this treatment, they
+are written consecutively to the same file, with HTML anchors so each
+can be referred to separately. If @command{makeinfo} is run on a
+system which does not distinguish case in filenames, nodes which are
+the same except for case will also be folded into the same output
+file.
+
+When splitting, the HTML output files are written into a subdirectory,
+with the name chosen as follows:
+@enumerate
+@item
+@command{makeinfo} first tries the subdirectory with the base name
+from @code{@@setfilename} (that is, any extension is removed). For
+example, HTML output for @code{@@setfilename gcc.info} would be
+written into a subdirectory named @samp{gcc}.
+
+@item
+If that directory cannot be created for any reason, then
+@command{makeinfo} tries appending @samp{.html} to the directory name.
+For example, output for @code{@@setfilename texinfo} would be written
+to @samp{texinfo.html}.
+
+@item
+If the @samp{@var{name}.html} directory can't be
+created either, @code{makeinfo} gives up.
+
+@end enumerate
+
+@noindent In any case, the top-level output file within the directory
+is always named @samp{index.html}.
+
+Monolithic output (@code{--no-split}) is named according to
+@code{@@setfilename} (with any @samp{.info} extension is replaced with
+@samp{.html}) or @code{--output} (the argument is used literally).
+
+
+@node HTML CSS
+@section HTML CSS
+@cindex HTML, and CSS
+@cindex CSS, and HTML output
+@cindex Cascading Style Sheets, and HTML output
+
+Cascading Style Sheets (CSS for short) is an Internet standard for
+influencing the display of HTML documents: see
+@uref{http://www.w3.org/Style/CSS/}.
+
+By default, @command{makeinfo} includes a few simple CSS commands to
+better implement the appearance of some of the environments. Here
+are two of them, as an example:
+
+@example
+pre.display @{ font-family:inherit @}
+pre.smalldisplay @{ font-family:inherit; font-size:smaller @}
+@end example
+
+A full explanation of CSS is (far) beyond this manual; please see the
+reference above. In brief, however, this specification tells the web
+browser to use a `smaller' font size for @code{@@smalldisplay} text,
+and to use the `inherited' font (generally a regular roman typeface)
+for both @code{@@smalldisplay} and @code{@@display}. By default, the
+HTML @samp{<pre>} command uses a monospaced font.
+
+You can influence the CSS in the HTML output with the
+@option{--css-include=@var{file}} option to @command{makeinfo}. This
+includes the contents @var{file} in the HTML output, as you might
+expect. However, the details are somewhat tricky, as described in the
+following, to provide maximum flexibility.
+
+@cindex @@import specifications, in CSS files
+The CSS file may begin with so-called @samp{@@import} directives,
+which link to external CSS specifications for browsers to use when
+interpreting the document. Again, a full description is beyond our
+scope here, but we'll describe how they work syntactically, so we can
+explain how @command{makeinfo} handles them.
+
+@cindex Comments, in CSS files
+There can be more than one @samp{@@import}, but they have to come
+first in the file, with only whitespace and comments interspersed, no
+normal definitions. (Technical exception: an @samp{@@charset}
+directive may precede the @samp{@@import}'s. This does not alter
+@command{makeinfo}'s behavior, it just copies the @samp{@@charset} if
+present.) Comments in CSS files are delimited by @samp{/* ... */}, as
+in C. An @samp{@@import} directive must be in one of these two forms:
+
+@example
+@@import url(http://example.org/foo.css);
+@@import "http://example.net/bar.css";
+@end example
+
+As far as @command{makeinfo} is concerned, the crucial characters are
+the @samp{@@} at the beginning and the semicolon terminating the
+directive. When reading the CSS file, it simply copies any such
+@samp{@@}-directive into the output, as follows:
+
+@itemize
+@item If @var{file} contains only normal CSS declarations, it is
+included after @command{makeinfo}'s default CSS, thus overriding it.
+
+@item If @var{file} begins with @samp{@@import} specifications (see
+below), then the @samp{import}'s are included first (they have to come
+first, according to the standard), and then @command{makeinfo}'s
+default CSS is included. If you need to override @command{makeinfo}'s
+defaults from an @samp{@@import}, you can do so with the @samp{!@:
+important} CSS construct, as in:
+@example
+pre.smallexample @{ font-size: inherit ! important @}
+@end example
+
+@item If @var{file} contains both @samp{@@import} and inline CSS
+specifications, the @samp{@@import}'s are included first, then
+@command{makeinfo}'s defaults, and lastly the inline CSS from
+@var{file}.
+
+@item Any @@-directive other than @samp{@@import} and @samp{@@charset}
+is treated as a CSS declaration, meaning @command{makeinfo} includes
+its default CSS and then the rest of the file.
+
+@end itemize
+
+If the CSS file is malformed or erroneous, @command{makeinfo}'s output
+is unspecified. @command{makeinfo} does not try to interpret the
+meaning of the CSS file in any way; it just looks for the special
+@samp{@@} and @samp{;} characters and blindly copies the text into the
+output. Comments in the CSS file may or may not be included in the
+output.
+
+
+@node HTML Xref
+@section HTML Cross-references
+@cindex HTML cross-references
+@cindex Cross-references, in HTML output
+
+Cross-references between Texinfo manuals in HTML format amount, in the
+end, to a standard HTML @code{<a>} link, but the details are
+unfortunately complex. This section describes the algorithm used in
+detail, so that Texinfo can cooperate with other programs, such as
+@command{texi2html}, by writing mutually compatible HTML files.
+
+This algorithm may or may not be used for links @emph{within} HTML
+output for a Texinfo file. Since no issues of compatibility arise in
+such cases, we do not need to specify this.
+
+We try to support references to such ``external'' manuals in both
+monolithic and split forms. A @dfn{monolithic} (mono) manual is
+entirely contained in one file, and a @dfn{split} manual has a file
+for each node. (@xref{HTML Splitting}.)
+
+@cindex Dumas, Patrice
+Acknowledgement: this algorithm was primarily devised by Patrice Dumas
+in 2003--04.
+
+@menu
+* Link Basics: HTML Xref Link Basics.
+* Node Expansion: HTML Xref Node Name Expansion.
+* Command Expansion: HTML Xref Command Expansion.
+* 8-bit Expansion: HTML Xref 8-bit Character Expansion.
+* Mismatch: HTML Xref Mismatch.
+@end menu
+
+
+@node HTML Xref Link Basics
+@subsection HTML Cross-reference Link Basics
+@cindex HTML cross-reference link basics
+
+For our purposes, an HTML link consists of four components: a host
+name, a directory part, a file part, and a target part. We
+always assume the @code{http} protocol. For example:
+
+@example
+http://@var{host}/@var{dir}/@var{file}.html#@var{target}
+@end example
+
+The information to construct a link comes from the node name and
+manual name in the cross-reference command in the Texinfo source
+(@pxref{Cross References}), and from @dfn{external information}, which
+is currently simply hardwired. In the future, it may come from an
+external data file.
+
+We now consider each part in turn.
+
+The @var{host} is hardwired to be the local host. This could either
+be the literal string @samp{localhost}, or, according to the rules for
+HTML links, the @samp{http://localhost/} could be omitted entirely.
+
+The @var{dir} and @var{file} parts are more complicated, and depend on
+the relative split/mono nature of both the manual being processed and
+the manual that the cross-reference refers to. The underlying idea is
+that there is one directory for Texinfo manuals in HTML, and each
+manual is either available as a monolithic file @file{manual.html}, or a
+split subdirectory @file{manual/*.html}. Here are the cases:
+
+@itemize @bullet
+@item
+If the present manual is split, and the referent manual is also split,
+the directory is @samp{../@var{referent/}} and the file is the
+expanded node name (described later).
+
+@item
+If the present manual is split, and the referent manual is mono, the
+directory is @samp{../} and the file is @file{@var{referent}.html}.
+
+@item
+If the present manual is mono, and the referent manual is split, the
+directory is @file{@var{referent}/} and the file is the expanded node
+name.
+
+@item
+If the present manual is mono, and the referent manual is also mono,
+the directory is @file{./} (or just the empty string), and the file is
+@file{@var{referent}.html}.
+
+@end itemize
+
+One exception: the algorithm for node name expansion prefixes the
+string @samp{g_t} when the node name begins with a non-letter. This
+kludge (due to XHTML rules) is not necessary for filenames, and is
+therefore omitted.
+
+Any directory part in the filename argument of the source
+cross-reference command is ignored. Thus, @code{@@xref@{,,,../foo@}}
+and @code{@@xref@{,,,foo@}} both use @samp{foo} as the manual name.
+This is because any such attempted hardwiring of the directory is very
+unlikely to be useful for both Info and HTML output.
+
+Finally, the @var{target} part is always the expanded node name.
+
+Whether the present manual is split or mono is determined by user
+option; @command{makeinfo} defaults to split, with the
+@option{--no-split} option overriding this.
+
+Whether the referent manual is split or mono is another bit of the
+external information. For now, @command{makeinfo} simply assumes the
+referent manual is the same as the present manual.
+
+There can be a mismatch between the format of the referent manual that
+the generating software assumes, and the format it's actually present
+in. @xref{HTML Xref Mismatch}.
+
+
+@node HTML Xref Node Name Expansion
+@subsection HTML Cross-reference Node Name Expansion
+@cindex HTML cross-reference node name expansion
+@cindex node name expansion, in HTML cross-references
+@cindex expansion, of node names in HTML cross-references
+
+As mentioned in the previous section, the key part of the HTML
+cross-reference algorithm is the conversion of node names in the
+Texinfo source into strings suitable for XHTML identifiers and
+filenames. The restrictions are similar for each: plain ASCII
+letters, numbers, and the @samp{-} and @samp{_} characters are all
+that can be used. (Although HTML anchors can contain most characters,
+XHTML is more restrictive.)
+
+Cross-references in Texinfo can actually refer either to nodes or
+anchors (@pxref{anchor}), but anchors are treated identically to nodes
+in this context, so we'll continue to say ``node'' names for
+simplicity.
+
+(@@-commands and 8-bit characters are not presently handled by
+@command{makeinfo} for HTML cross-references. See the next section.)
+
+A special exception: the Top node (@pxref{The Top Node}) is always
+mapped to the file @file{index.html}, to match web server software.
+However, the HTML @emph{target} is @samp{Top}. Thus (in the split case):
+
+@example
+@@xref@{Top, Introduction,, emacs, The GNU Emacs Manual@}.
+@result{} <a href="emacs/index.html#Top">
+@end example
+
+@enumerate
+@item
+The standard ASCII letters (a-z and A-Z) are not modified. All other
+characters are changed as specified below.
+
+@item
+The standard ASCII numbers (0-9) are not modified except when a number
+is the first character of the node name. In that case, see below.
+
+@item
+Multiple consecutive space, tab and newline characters are transformed
+into just one space. (It's not possible to have newlines in node
+names with the current implementation, but we specify it anyway, just
+in case.)
+
+@item
+Leading and trailing spaces are removed.
+
+@item
+After the above has been applied, each remaining space character is
+converted into a @samp{-} character.
+
+@item
+Other ASCII 7-bit characters are transformed into @samp{_00@var{xx}},
+where @var{xx} is the ASCII character code in (lowercase) hexadecimal.
+This includes @samp{_}, which is mapped to @samp{_005f}.
+
+@item
+If the node name does not begin with a letter, the literal string
+@samp{g_t} is prefixed to the result. (Due to the rules above, that
+string can never occur otherwise; it is an arbitrary choice, standing
+for ``GNU Texinfo''.) This is necessary because XHTML requires that
+identifiers begin with a letter.
+
+@end enumerate
+
+For example:
+
+@example
+@@node A node --- with _'%
+@result{} A-node-_002d_002d_002d-with-_005f_0027_0025
+@end example
+
+Notice in particular:
+
+@itemize @bullet
+@item @samp{_} @result{} @samp{_005f}
+@item @samp{-} @result{} @samp{_002d}
+@item @samp{A node} @result{} @samp{A-node}
+@end itemize
+
+On case-folding computer systems, nodes differing only by case will be
+mapped to the same file.
+
+In particular, as mentioned above, Top always maps to the file
+@file{index.html}. Thus, on a case-folding system, Top and a node
+named `Index' will both be written to @file{index.html}.
+
+Fortunately, the targets serve to distinguish these cases, since HTML
+target names are always case-sensitive, independent of operating
+system.
+
+
+@node HTML Xref Command Expansion
+@subsection HTML Cross-reference Command Expansion
+@cindex HTML cross-reference command expansion
+
+In standard Texinfo, node names may not contain @@-commands.
+@command{makeinfo} has an option @option{--commands-in-node-names}
+which partially supports it (@pxref{Invoking makeinfo}), but it is not
+robust and not recommended.
+
+Thus, @command{makeinfo} also does not fully implement this part of
+the HTML cross-reference algorithm, but it is documented here for the
+sake of completeness.
+
+First, comments are removed.
+
+Next, any @code{@@value} commands (@pxref{set value}) and macro invocations
+(@pxref{Invoking Macros}) are fully expanded.
+
+Then, for the following commands, the command name and braces are removed,
+the text of the argument is recursively transformed:
+@example
+@@asis @@b @@cite @@code @@command @@dfn @@dmn @@dotless
+@@emph @@env @@file @@indicateurl @@kbd @@key
+@@samp @@sc @@slanted @@strong @@t @@var @@w
+@end example
+
+@noindent For @code{@@sc}, any letters are capitalized.
+
+The following commands are replaced by constant text, as shown. If
+any of these commands have non-empty arguments, as in
+@code{@@TeX@{bad@}}, it is an error, and the result is unspecified.
+`(space)' means a space character, `(nothing)' means the empty string,
+etc. The notation `U+@var{xxxx}' means Unicode code point @var{xxxx}.
+There are further transformations of many of these expansions for the
+final file or target name, such as space characters to @samp{-}, etc.,
+according to the other rules.
+
+@multitable @columnfractions .3 .5
+@item @code{@@(newline)} @tab (space)
+@item @code{@@(space)} @tab (space)
+@item @code{@@(tab)} @tab (space)
+@item @code{@@!} @tab @samp{!}
+@item @code{@@*} @tab (space)
+@item @code{@@-} @tab (nothing)
+@item @code{@@.} @tab @samp{.}
+@item @code{@@:} @tab (nothing)
+@item @code{@@?} @tab @samp{?}
+@item @code{@@@@} @tab @samp{@@}
+@item @code{@@@{} @tab @samp{@{}
+@item @code{@@@}} @tab @samp{@}}
+@item @code{@@LaTeX} @tab @samp{LaTeX}
+@item @code{@@TeX} @tab @samp{TeX}
+@item @code{@@bullet} @tab U+2022
+@item @code{@@comma} @tab @samp{,}
+@item @code{@@copyright} @tab U+00A9
+@item @code{@@dots} @tab U+2026
+@item @code{@@enddots} @tab @samp{...}
+@item @code{@@equiv} @tab U+2261
+@item @code{@@error} @tab @samp{error-->}
+@item @code{@@euro} @tab U+20AC
+@item @code{@@exclamdown} @tab U+00A1
+@item @code{@@expansion} @tab U+2192
+@item @code{@@minus} @tab U+2212
+@item @code{@@ordf} @tab U+00AA
+@item @code{@@ordm} @tab U+00BA
+@item @code{@@point} @tab U+2217
+@item @code{@@pounds} @tab U+00A3
+@item @code{@@print} @tab @samp{-|}
+@item @code{@@questiondown} @tab U+00BF
+@item @code{@@registeredsymbol} @tab U+00AE
+@item @code{@@result} @tab U+21D2
+@item @code{@@tie} @tab (space)
+@end multitable
+
+An @code{@@acronym} or @code{@@abbr} command is replaced by the first
+argument, followed by the second argument in parentheses, if present.
+@xref{acronym}.
+
+An @code{@@email} command is replaced by the @var{text} argument if
+present, else the address. @xref{email}.
+
+An @code{@@image} command is replaced by the filename (first)
+argument. @xref{Images}.
+
+A @code{@@verb} command is replaced by its transformed argument.
+@xref{verb}.
+
+Any other command is an error, and the result is unspecified.
+
+
+@node HTML Xref 8-bit Character Expansion
+@subsection HTML Cross-reference 8-bit Character Expansion
+@cindex HTML cross-reference 8-bit character expansion
+@cindex 8-bit characters, in HTML cross-references
+@cindex Expansion of 8-bit characters in HTML cross-references
+
+Usually, characters other than plain 7-bit ASCII are transformed into
+the corresponding Unicode code point(s) in Normalization Form C, which
+uses precomposed characters where available. (This is the
+normalization form recommended by the W3C and other bodies.) This
+holds when that code point is 0xffff or less, as it almost always is.
+
+These will then be further transformed by the rules above into the
+string @samp{_@var{xxxx}}, where @var{xxxx} is the code point in hex.
+
+For example, combining this rule and the previous section:
+
+@example
+@@node @@b@{A@} @@TeX@{@} @@u@{B@} @@point@{@}@@enddots@{@}
+@result{} A-TeX-B_0306-_2605_002e_002e_002e
+@end example
+
+Notice: 1)@tie{}@code{@@enddots} expands to three periods which in
+turn expands to three @samp{_002e}'s; 2)@tie{}@code{@@u@{B@}} is a `B'
+with a breve accent, which does not exist as a pre-accented Unicode
+character, therefore expands to @samp{B_0306} (B with combining
+breve).
+
+When the Unicode code point is above 0xffff, the transformation is
+@samp{__@var{xxxxxx}}, that is, two leading underscores followed by
+six hex digits. Since Unicode has declared that their highest code
+point is 0x10ffff, this is sufficient. (We felt it was better to
+define this extra escape than to always use six hex digits, since the
+first two would nearly always be zeros.)
+
+For the definition of Unicode Normalization Form C, see Unicode report
+UAX#15, @uref{http://www.unicode.org/reports/tr15/}. Many related
+documents and implementations are available elsewhere on the web.
+
+
+@node HTML Xref Mismatch
+@subsection HTML Cross-reference Mismatch
+@cindex HTML cross-reference mismatch
+@cindex Mismatched HTML cross-reference source and target
+
+As mentioned earlier (@pxref{HTML Xref Link Basics}), the generating
+software has to guess whether a given manual being cross-referenced is
+available in split or monolithic form---and, inevitably, it might
+guess wrong. However, it is possible when the referent manual itself
+is generated, it is possible to handle at least some mismatches.
+
+In the case where we assume the referent is split, but it is actually
+available in mono, the only recourse would be to generate a
+@file{manual/} subdirectory full of HTML files which redirect back to
+the monolithic @file{manual.html}. Since this is essentially the same
+as a split manual in the first place, it's not very appealing.
+
+On the other hand, in the case where we assume the referent is mono,
+but it is actually available in split, it is possible to use
+JavaScript to redirect from the putatively monolithic
+@file{manual.html} to the different @file{manual/node.html} files.
+Here's an example:
+
+@example
+function redirect() @{
+ switch (location.hash) @{
+ case "#Node1":
+ location.replace("manual/Node1.html#Node1"); break;
+ case "#Node2" :
+ location.replace("manual/Node2.html#Node2"); break;
+ @dots{}
+ default:;
+ @}
+@}
+@end example
+
+Then, in the @code{<body>} tag of @file{manual.html}:
+
+@example
+<body onLoad="redirect();">
+@end example
+
+Once again, this is something the software which generated the
+@emph{referent} manual has to do in advance, it's not something the
+software generating the actual cross-reference in the present manual
+can control.
+
+Ultimately, we hope to allow for an external configuration file to
+control which manuals are available from where, and how.
+
+
+@ignore
+-- not yet --
+
+external information
+--------------------
+
+The information for the reference is searched in the file
+`htmlxref.cnf' present in the following directories:
+<srcdir>/.texinfo/, ~/.texinfo/, SYSCONFDIR/texinfo/,
+DATADIR/texinfo/
+The first match should be used.
+
+The file is line-oriented, with the following format:
+ <manualname> <whitespace> <keyword> <whitespace> <urlprefix>
+with <keyword> being "mono" or "split". Thus
+texinfo split http://www.gnu.org/software/texinfo/manual/texinfo/html_node/
+texinfo mono http://www.gnu.org/software/texinfo/manual/texinfo/texinfo.html
+
+If the keyword is 'split', that is the target is split, the urlprefix gives
+the directory and host name.
+If the keyword is 'mono', that is the target is mono, the urlprefix gives
+directory, host and file name.
+
+'#' followed by a space begins comments. '#' followed by another character
+cannot begin comments as there are # in urls.
+
+@end ignore
+
+
+@node Command List
+@appendix @@-Command List
+@cindex Alphabetical @@-command list
+@cindex List of @@-commands
+@cindex @@-command list
+@cindex Reference to @@-commands
+
+Here is an alphabetical list of the @@-commands in Texinfo. Square
+brackets, @t{[}@w{ }@t{]}, indicate optional arguments; an ellipsis,
+@samp{@dots{}}, indicates repeated text.
+
+More specifics on the general syntax of different @@-commands are
+given in the section below.
+
+@menu
+* Command Syntax:: General syntax for varieties of @@-commands.
+@end menu
+
+@sp 1
+@table @code
+@item @@@var{whitespace}
+An @code{@@} followed by a space, tab, or newline produces a normal,
+stretchable, interword space. @xref{Multiple Spaces}.
+
+@item @@!
+Generate an exclamation point that really does end a sentence (usually
+after an end-of-sentence capital letter). @xref{Ending a Sentence}.
+
+@item @@"
+@itemx @@'
+Generate an umlaut or acute accent, respectively, over the next
+character, as in @"o and @'o. @xref{Inserting Accents}.
+
+@item @@*
+Force a line break. @xref{Line Breaks}.
+
+@item @@,@{@var{c}@}
+Generate a cedilla accent under @var{c}, as in @,{c}. @xref{Inserting
+Accents}.
+
+@item @@-
+Insert a discretionary hyphenation point. @xref{- and hyphenation}.
+
+@item @@.
+Produce a period that really does end a sentence (usually after an
+end-of-sentence capital letter). @xref{Ending a Sentence}.
+
+@item @@/
+Produces no output, but allows a line break. @xref{Line Breaks}.
+
+@item @@:
+Indicate to @TeX{} that an immediately preceding period, question
+mark, exclamation mark, or colon does not end a sentence. Prevent
+@TeX{} from inserting extra whitespace as it does at the end of a
+sentence. The command has no effect on the Info file output.
+@xref{Not Ending a Sentence}.
+
+@item @@=
+Generate a macron (bar) accent over the next character, as in @=o.
+@xref{Inserting Accents}.
+
+@item @@?
+Generate a question mark that really does end a sentence (usually after
+an end-of-sentence capital letter). @xref{Ending a Sentence}.
+
+@item @@@@
+Stands for an at sign, @samp{@@}.
+@xref{Atsign Braces Comma, , Inserting @@ and @{@} and @comma{}}.
+
+@item @@\
+Stands for a backslash (@samp{\}) inside @code{@@math}.
+@xref{math,,@code{math}}.
+
+@item @@^
+@itemx @@`
+Generate a circumflex (hat) or grave accent, respectively, over the next
+character, as in @^o and @`e.
+@xref{Inserting Accents}.
+
+@item @@@{
+Stands for a left brace, @samp{@{}.
+@xref{Atsign Braces Comma, , Inserting @@ and @{@} and @comma{}}.
+
+@item @@@}
+Stands for a right-hand brace, @samp{@}}.@*
+@xref{Atsign Braces Comma, , Inserting @@ and @{@} and @comma{}}.
+
+@item @@~
+Generate a tilde accent over the next character, as in @~N.
+@xref{Inserting Accents}.
+
+@item @@AA@{@}
+@itemx @@aa@{@}
+Generate the uppercase and lowercase Scandinavian A-ring letters,
+respectively: @AA{}, @aa{}. @xref{Inserting Accents}.
+
+@item @@abbr@{@var{abbreviation}@}
+Tag @var{abbreviation} as an abbreviation, such as `Comput.'.
+@xref{abbr,, @code{abbr}}.
+
+@item @@acronym@{@var{acronym}@}
+Tag @var{acronym} as an acronym, such as `NASA'.
+@xref{acronym,, @code{acronym}}.
+
+@item @@AE@{@}
+@itemx @@ae@{@}
+Generate the uppercase and lowercase AE ligatures, respectively:
+@AE{}, @ae{}. @xref{Inserting Accents}.
+
+@itemx @@afivepaper
+Change page dimensions for the A5 paper size. @xref{A4 Paper}.
+
+@item @@afourlatex
+@itemx @@afourpaper
+@itemx @@afourwide
+Change page dimensions for the A4 paper size. @xref{A4 Paper}.
+
+@item @@alias @var{new}=@var{existing}
+Make the command @samp{@@@var{new}} an alias for the existing command
+@samp{@@@var{existing}}. @xref{alias}.
+
+@item @@anchor@{@var{name}@}
+Define @var{name} as the current location for use as a cross-reference
+target. @xref{anchor,, @code{@@anchor}}.
+
+@item @@appendix @var{title}
+Begin an appendix. The title appears in the table
+of contents of a printed manual. In Info, the title is
+underlined with asterisks. @xref{unnumbered & appendix, , The
+@code{@@unnumbered} and @code{@@appendix} Commands}.@refill
+
+@item @@appendixsec @var{title}
+@itemx @@appendixsection @var{title}
+Begin an appendix section within an appendix. The section title appears
+in the table of contents of a printed manual. In Info, the title is
+underlined with equal signs. @code{@@appendixsection} is a longer
+spelling of the @code{@@appendixsec} command. @xref{unnumberedsec
+appendixsec heading, , Section Commands}.@refill
+
+@item @@appendixsubsec @var{title}
+Begin an appendix subsection within an appendix. The title appears
+in the table of contents of a printed manual. In Info, the title is
+underlined with hyphens. @xref{unnumberedsubsec appendixsubsec
+subheading, , Subsection Commands}.@refill
+
+@item @@appendixsubsubsec @var{title}
+Begin an appendix subsubsection within an appendix subsection. The
+title appears in the table of contents of a printed manual. In Info,
+the title is underlined with periods. @xref{subsubsection,, The
+`subsub' Commands}.@refill
+
+@item @@asis
+Used following @code{@@table}, @code{@@ftable}, and @code{@@vtable} to
+print the table's first column without highlighting (``as is'').
+@xref{Two-column Tables, , Making a Two-column Table}.@refill
+
+@item @@author @var{author}
+Typeset @var{author} flushleft and underline it. @xref{title
+subtitle author, , The @code{@@title} and @code{@@author}
+Commands}.@refill
+
+@item @@b@{@var{text}@}
+Print @var{text} in @b{bold} font. No effect in Info. @xref{Fonts}.@refill
+
+@ignore
+@item @@br
+Force a paragraph break. If used within a line, follow @code{@@br}
+with braces. @xref{br, , @code{@@br}}.@refill
+@end ignore
+
+@item @@bullet@{@}
+Generate a large round dot, or the closest possible
+thing to one. @xref{bullet, , @code{@@bullet}}.@refill
+
+@item @@bye
+Stop formatting a file. The formatters do not see the contents of a
+file following an @code{@@bye} command. @xref{Ending a File}.@refill
+
+@item @@c @var{comment}
+Begin a comment in Texinfo. The rest of the line does not appear in
+either the Info file or the printed manual. A synonym for
+@code{@@comment}. @xref{Comments}.
+
+@item @@caption
+Define the full caption for a @code{@@float}. @xref{caption shortcaption}.
+
+@item @@cartouche
+Highlight an example or quotation by drawing a box with rounded
+corners around it. Pair with @code{@@end cartouche}. No effect in
+Info. @xref{cartouche, , Drawing Cartouches Around Examples}.)@refill
+
+@item @@center @var{line-of-text}
+Center the line of text following the command.
+@xref{titlefont center sp, , @code{@@center}}.@refill
+
+@item @@centerchap @var{line-of-text}
+Like @code{@@chapter}, but centers the chapter title. @xref{chapter,,
+@code{@@chapter}}.
+
+@item @@chapheading @var{title}
+Print a chapter-like heading in the text, but not in the table of
+contents of a printed manual. In Info, the title is underlined with
+asterisks. @xref{majorheading & chapheading, , @code{@@majorheading}
+and @code{@@chapheading}}.@refill
+
+@item @@chapter @var{title}
+Begin a chapter. The chapter title appears in the table of
+contents of a printed manual. In Info, the title is underlined with
+asterisks. @xref{chapter, , @code{@@chapter}}.@refill
+
+@item @@cindex @var{entry}
+Add @var{entry} to the index of concepts. @xref{Index Entries, ,
+Defining the Entries of an Index}.@refill
+
+@item @@cite@{@var{reference}@}
+Highlight the name of a book or other reference that lacks a
+companion Info file. @xref{cite, , @code{@@cite}}.@refill
+
+@item @@clear @var{flag}
+Unset @var{flag}, preventing the Texinfo formatting commands from
+formatting text between subsequent pairs of @code{@@ifset @var{flag}}
+and @code{@@end ifset} commands, and preventing
+@code{@@value@{@var{flag}@}} from expanding to the value to which
+@var{flag} is set.
+@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill
+
+@item @@code@{@var{sample-code}@}
+Highlight text that is an expression, a syntactically complete token
+of a program, or a program name. @xref{code, , @code{@@code}}.@refill
+
+@item @@comma@{@}
+Insert a comma `,' character; only needed when a literal comma would
+be taken as an argument separator. @xref{Inserting a Comma}.
+
+@item @@command@{@var{command-name}@}
+Indicate a command name, such as @command{ls}.
+@xref{command,, @code{@@command}}.
+
+@item @@comment @var{comment}
+Begin a comment in Texinfo. The rest of the line does not appear in
+either the Info file or the printed manual. A synonym for @code{@@c}.
+@xref{Comments}.
+
+@item @@contents
+Print a complete table of contents. Has no effect in Info, which uses
+menus instead. @xref{Contents, , Generating a Table of
+Contents}.@refill
+
+@item @@copyright@{@}
+Generate the copyright symbol @copyright{}. @xref{copyright symbol,,
+@code{@@copyright@{@}}}.
+
+@ignore
+@item @@ctrl@{@var{ctrl-char}@}
+Describe an @sc{ascii} control character. Insert actual control character
+into Info file. @xref{ctrl, , @code{@@ctrl}}.@refill
+@end ignore
+
+@item @@defcodeindex @var{index-name}
+Define a new index and its indexing command. Print entries in an
+@code{@@code} font. @xref{New Indices, , Defining New
+Indices}.@refill
+
+@item @@defcv @var{category} @var{class} @var{name}
+@itemx @@defcvx @var{category} @var{class} @var{name}
+Format a description for a variable associated with a class in
+object-oriented programming. Takes three arguments: the category of
+thing being defined, the class to which it belongs, and its name.
+@xref{Definition Commands}, and @ref{deffnx,, Def Cmds in Detail}.
+
+@item @@deffn @var{category} @var{name} @var{arguments}@dots{}
+@itemx @@deffnx @var{category} @var{name} @var{arguments}@dots{}
+Format a description for a function, interactive command, or similar
+entity that may take arguments. @code{@@deffn} takes as arguments the
+category of entity being described, the name of this particular
+entity, and its arguments, if any. @xref{Definition Commands}.@refill
+
+@item @@defindex @var{index-name}
+Define a new index and its indexing command. Print entries in a roman
+font. @xref{New Indices, , Defining New Indices}.@refill
+
+@item @@definfoenclose @var{newcmd}, @var{before}, @var{after},
+Create new @@-command @var{newcmd} for Info that marks text by enclosing
+it in strings that precede and follow the text. @xref{definfoenclose}.
+
+@item @@defivar @var{class} @var{instance-variable-name}
+@itemx @@defivarx @var{class} @var{instance-variable-name}
+This command formats a description for an instance variable in
+object-oriented programming. The command is equivalent to @samp{@@defcv
+@{Instance Variable@} @dots{}}. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@defmac @var{macroname} @var{arguments}@dots{}
+@itemx @@defmacx @var{macroname} @var{arguments}@dots{}
+Format a description for a macro. The command is equivalent to
+@samp{@@deffn Macro @dots{}}. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@defmethod @var{class} @var{method-name} @var{arguments}@dots{}
+@itemx @@defmethodx @var{class} @var{method-name} @var{arguments}@dots{}
+Format a description for a method in object-oriented programming. The
+command is equivalent to @samp{@@defop Method @dots{}}. Takes as
+arguments the name of the class of the method, the name of the
+method, and its arguments, if any. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@defop @var{category} @var{class} @var{name} @var{arguments}@dots{}
+@itemx @@defopx @var{category} @var{class} @var{name} @var{arguments}@dots{}
+Format a description for an operation in object-oriented programming.
+@code{@@defop} takes as arguments the overall name of the category of
+operation, the name of the class of the operation, the name of the
+operation, and its arguments, if any. @xref{Definition
+Commands}, and @ref{Abstract Objects}.
+
+@item @@defopt @var{option-name}
+@itemx @@defoptx @var{option-name}
+Format a description for a user option. The command is equivalent to
+@samp{@@defvr @{User Option@} @dots{}}. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@defspec @var{special-form-name} @var{arguments}@dots{}
+@itemx @@defspecx @var{special-form-name} @var{arguments}@dots{}
+Format a description for a special form. The command is equivalent to
+@samp{@@deffn @{Special Form@} @dots{}}. @xref{Definition Commands},
+and @ref{deffnx,, Def Cmds in Detail}.
+
+@item @@deftp @var{category} @var{name-of-type} @var{attributes}@dots{}
+@itemx @@deftpx @var{category} @var{name-of-type} @var{attributes}@dots{}
+Format a description for a data type. @code{@@deftp} takes as arguments
+the category, the name of the type (which is a word like @samp{int} or
+@samp{float}), and then the names of attributes of objects of that type.
+@xref{Definition Commands}, and @ref{Data Types}.
+
+@item @@deftypecv @var{category} @var{class} @var{data-type} @var{name}
+@itemx @@deftypecvx @var{category} @var{class} @var{data-type} @var{name}
+Format a description for a typed class variable in object-oriented programming.
+@xref{Definition Commands}, and @ref{Abstract Objects}.
+
+@item @@deftypefn @var{classification} @var{data-type} @var{name} @var{arguments}@dots{}
+@itemx @@deftypefnx @var{classification} @var{data-type} @var{name} @var{arguments}@dots{}
+Format a description for a function or similar entity that may take
+arguments and that is typed. @code{@@deftypefn} takes as arguments the
+classification of entity being described, the type, the name of the
+entity, and its arguments, if any. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@deftypefun @var{data-type} @var{function-name} @var{arguments}@dots{}
+@itemx @@deftypefunx @var{data-type} @var{function-name} @var{arguments}@dots{}
+Format a description for a function in a typed language.
+The command is equivalent to @samp{@@deftypefn Function @dots{}}.
+@xref{Definition Commands}, and @ref{deffnx,, Def Cmds in Detail}.
+
+@item @@deftypeivar @var{class} @var{data-type} @var{variable-name}
+@itemx @@deftypeivarx @var{class} @var{data-type} @var{variable-name}
+Format a description for a typed instance variable in object-oriented
+programming. @xref{Definition Commands}, and @ref{Abstract Objects}.
+
+@item @@deftypemethod @var{class} @var{data-type} @var{method-name} @var{arguments}@dots{}
+@itemx @@deftypemethodx @var{class} @var{data-type} @var{method-name} @var{arguments}@dots{}
+Format a description for a typed method in object-oriented programming.
+@xref{Definition Commands}, and @ref{deffnx,, Def Cmds in Detail}.
+
+@item @@deftypeop @var{category} @var{class} @var{data-type} @var{name} @var{arguments}@dots{}
+@itemx @@deftypeopx @var{category} @var{class} @var{data-type} @var{name} @var{arguments}@dots{}
+Format a description for a typed operation in object-oriented programming.
+@xref{Definition Commands}, and @ref{Abstract Objects}.
+
+@item @@deftypevar @var{data-type} @var{variable-name}
+@itemx @@deftypevarx @var{data-type} @var{variable-name}
+Format a description for a variable in a typed language. The command is
+equivalent to @samp{@@deftypevr Variable @dots{}}. @xref{Definition
+Commands}, and @ref{deffnx,, Def Cmds in Detail}.
+
+@item @@deftypevr @var{classification} @var{data-type} @var{name}
+@itemx @@deftypevrx @var{classification} @var{data-type} @var{name}
+Format a description for something like a variable in a typed
+language---an entity that records a value. Takes as arguments the
+classification of entity being described, the type, and the name of the
+entity. @xref{Definition Commands}, and @ref{deffnx,, Def Cmds in
+Detail}.
+
+@item @@defun @var{function-name} @var{arguments}@dots{}
+@itemx @@defunx @var{function-name} @var{arguments}@dots{}
+Format a description for functions. The command is equivalent to
+@samp{@@deffn Function @dots{}}. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@defvar @var{variable-name}
+@itemx @@defvarx @var{variable-name}
+Format a description for variables. The command is equivalent to
+@samp{@@defvr Variable @dots{}}. @xref{Definition Commands}, and
+@ref{deffnx,, Def Cmds in Detail}.
+
+@item @@defvr @var{category} @var{name}
+@itemx @@defvrx @var{category} @var{name}
+Format a description for any kind of variable. @code{@@defvr} takes
+as arguments the category of the entity and the name of the entity.
+@xref{Definition Commands},
+and @ref{deffnx,, Def Cmds in Detail}.
+
+@item @@detailmenu
+Avoid @code{makeinfo} confusion stemming from the detailed node listing
+in a master menu. @xref{Master Menu Parts}.
+
+@item @@dfn@{@var{term}@}
+Highlight the introductory or defining use of a term.
+@xref{dfn, , @code{@@dfn}}.@refill
+
+@item @@dircategory @var{dirpart}
+Specify a part of the Info directory menu where this file's entry should
+go. @xref{Installing Dir Entries}.
+
+@item @@direntry
+Begin the Info directory menu entry for this file. Pair with
+@code{@@end direntry}. @xref{Installing Dir Entries}.
+
+@item @@display
+Begin a kind of example. Like @code{@@example} (indent text, do not
+fill), but do not select a new font. Pair with @code{@@end display}.
+@xref{display, , @code{@@display}}.
+
+@item @@dmn@{@var{dimension}@}
+Format a unit of measure, as in 12@dmn{pt}. Causes @TeX{} to insert a
+thin space before @var{dimension}. No effect in Info.
+@xref{dmn, , @code{@@dmn}}.
+
+@item @@docbook
+Enter Docbook completely. Pair with @code{@@end docbook}. @xref{Raw
+Formatter Commands}.
+
+@item @@documentdescription
+Set the document description text, included in the HTML output. Pair
+with @code{@@end documentdescription}. @xref{documentdescription,,
+@code{@@documentdescription}}.
+
+@item @@documentencoding @var{enc}
+Declare the input encoding to be @var{enc}.
+@xref{documentencoding,, @code{@@documentencoding}}.
+
+@item @@documentlanguage @var{CC}
+Declare the document language as the two-character ISO-639 abbreviation
+@var{CC}. @xref{documentlanguage,, @code{@@documentlanguage}}.
+
+@item @@dotaccent@{@var{c}@}
+Generate a dot accent over the character @var{c}, as in @dotaccent{o}.
+@xref{Inserting Accents}.
+
+@item @@dots@{@}
+Insert an ellipsis: @samp{@dots{}}.
+@xref{dots, , @code{@@dots}}.@refill
+
+@item @@email@{@var{address}[, @var{displayed-text}]@}
+Indicate an electronic mail address.
+@xref{email, , @code{@@email}}.
+
+@item @@emph@{@var{text}@}
+Highlight @var{text}; text is displayed in @emph{italics} in printed
+output, and surrounded by asterisks in Info. @xref{Emphasis, ,
+Emphasizing Text}.
+
+@item @@end @var{environment}
+Ends @var{environment}, as in @samp{@@end example}. @xref{Formatting
+Commands,,@@-commands}.
+
+@item @@env@{@var{environment-variable}@}
+Indicate an environment variable name, such as @env{PATH}.
+@xref{env,, @code{@@env}}.
+
+@item @@enddots@{@}
+Generate an end-of-sentence of ellipsis, like this @enddots{}
+@xref{dots,,@code{@@dots@{@}}}.
+
+@item @@enumerate [@var{number-or-letter}]
+Begin a numbered list, using @code{@@item} for each entry.
+Optionally, start list with @var{number-or-letter}. Pair with
+@code{@@end enumerate}. @xref{enumerate, ,
+@code{@@enumerate}}.@refill
+
+@item @@equiv@{@}
+Indicate to the reader the exact equivalence of two forms with a
+glyph: @samp{@equiv{}}. @xref{Equivalence}.@refill
+
+@item @@euro@{@}
+Generate the Euro currency sign.
+@xref{euro,,@code{@@euro@{@}}}.
+
+@item @@error@{@}
+Indicate to the reader with a glyph that the following text is
+an error message: @samp{@error{}}. @xref{Error Glyph}.@refill
+
+@item @@evenfooting [@var{left}] @@| [@var{center}] @@| [@var{right}]
+@itemx @@evenheading [@var{left}] @@| [@var{center}] @@| [@var{right}]
+Specify page footings resp.@: headings for even-numbered (left-hand)
+pages. @xref{Custom Headings, ,
+How to Make Your Own Headings}.@refill
+
+@item @@everyfooting [@var{left}] @@| [@var{center}] @@| [@var{right}]
+@itemx @@everyheading [@var{left}] @@| [@var{center}] @@| [@var{right}]
+Specify page footings resp.@: headings for every page. Not relevant to
+Info. @xref{Custom Headings, , How to Make Your Own Headings}.@refill
+
+@item @@example
+Begin an example. Indent text, do not fill, and select fixed-width font.
+Pair with @code{@@end example}. @xref{example, ,
+@code{@@example}}.@refill
+
+@item @@exampleindent @var{indent}
+Indent example-like environments by @var{indent} number of spaces
+(perhaps 0). @xref{exampleindent,, Paragraph Indenting}.
+
+@item @@exclamdown@{@}
+Produce an upside-down exclamation point. @xref{Inserting Accents}.
+
+@item @@exdent @var{line-of-text}
+Remove any indentation a line might have. @xref{exdent, ,
+Undoing the Indentation of a Line}.@refill
+
+@item @@expansion@{@}
+Indicate the result of a macro expansion to the reader with a special
+glyph: @samp{@expansion{}}.
+@xref{expansion, , @expansion{} Indicating an Expansion}.@refill
+
+@item @@file@{@var{filename}@}
+Highlight the name of a file, buffer, node, or directory. @xref{file, ,
+@code{@@file}}.@refill
+
+@item @@finalout
+Prevent @TeX{} from printing large black warning rectangles beside
+over-wide lines. @xref{Overfull hboxes}.@refill
+
+@item @@findex @var{entry}
+Add @var{entry} to the index of functions. @xref{Index Entries, ,
+Defining the Entries of an Index}.@refill
+
+@item @@float
+Environment to define floating material. Pair with @code{@@end float}.
+@xref{Floats}.
+
+@item @@flushleft
+@itemx @@flushright
+Left justify every line but leave the right end ragged.
+Leave font as is. Pair with @code{@@end flushleft}.
+@code{@@flushright} analogous.
+@xref{flushleft & flushright, , @code{@@flushleft} and
+@code{@@flushright}}.@refill
+
+@item @@footnote@{@var{text-of-footnote}@}
+Enter a footnote. Footnote text is printed at the bottom of the page
+by @TeX{}; Info may format in either `End' node or `Separate' node style.
+@xref{Footnotes}.@refill
+
+@item @@footnotestyle @var{style}
+Specify an Info file's footnote style, either @samp{end} for the end
+node style or @samp{separate} for the separate node style.
+@xref{Footnotes}.@refill
+
+@item @@format
+Begin a kind of example. Like @code{@@display}, but do not narrow the
+margins. Pair with @code{@@end format}. @xref{example,,
+@code{@@example}}.
+
+@item @@ftable @var{formatting-command}
+Begin a two-column table, using @code{@@item} for each entry.
+Automatically enter each of the items in the first column into the
+index of functions. Pair with @code{@@end ftable}. The same as
+@code{@@table}, except for indexing. @xref{ftable vtable, ,
+@code{@@ftable} and @code{@@vtable}}.@refill
+
+@item @@group
+Hold text together that must appear on one printed page. Pair with
+@code{@@end group}. Not relevant to Info. @xref{group, ,
+@code{@@group}}.@refill
+
+@item @@H@{@var{c}@}
+Generate the long Hungarian umlaut accent over @var{c}, as in @H{o}.
+
+@item @@heading @var{title}
+Print an unnumbered section-like heading in the text, but not in the
+table of contents of a printed manual. In Info, the title is
+underlined with equal signs. @xref{unnumberedsec appendixsec heading,
+, Section Commands}.@refill
+
+@item @@headings @var{on-off-single-double}
+Turn page headings on or off, and/or specify single-sided or double-sided
+page headings for printing. @xref{headings on off, , The
+@code{@@headings} Command}.
+
+@item @@html
+Enter HTML completely. Pair with @code{@@end html}. @xref{Raw
+Formatter Commands}.
+
+@item @@hyphenation@{@var{hy-phen-a-ted words}@}
+Explicitly define hyphenation points. @xref{- and hyphenation,,
+@code{@@-} and @code{@@hyphenation}}.
+
+@item @@i@{@var{text}@}
+Print @var{text} in @i{italic} font. No effect in Info. @xref{Fonts}.
+
+@item @@ifclear @var{flag}
+If @var{flag} is cleared, the Texinfo formatting commands format text
+between @code{@@ifclear @var{flag}} and the following @code{@@end
+ifclear} command.
+@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill
+
+@item @@ifdocbook
+@itemx @@ifhtml
+@itemx @@ifinfo
+Begin text that will appear only in the given output format.
+@code{@@ifinfo} output appears in both Info and (for historical
+compatibility) plain text output. Pair with @code{@@end ifdocbook}
+resp.@: @code{@@end ifhtml} resp.@: @code{@@end ifinfo}.
+@xref{Conditionals}.
+
+@item @@ifnotdocbook
+@itemx @@ifnothtml
+@itemx @@ifnotinfo
+@itemx @@ifnotplaintext
+@itemx @@ifnottex
+@itemx @@ifnotxml
+Begin a stretch of text that will be ignored in one output format but
+not the others. The text appears in the formats not specified:
+@code{@@ifnothtml} text is omitted from html output, etc. The exception
+is @code{@@ifnotinfo} text, which is omitted from plain text output as
+well as Info output. Pair with the corresponding @code{@@end
+ifnot@var{format}}. @xref{Conditionals}.
+
+@item @@ifplaintext
+Begin text that will appear only in the plain text output.
+Pair with @code{@@end ifplaintext}. @xref{Conditionals}.
+
+@item @@ifset @var{flag}
+If @var{flag} is set, the Texinfo formatting commands format text
+between @code{@@ifset @var{flag}} and the following @code{@@end ifset}
+command.
+@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill
+
+@item @@iftex
+Begin text that will not appear in the Info file or other output, but
+will be processed only by @TeX{}. Pair with @code{@@end iftex}.
+@xref{Conditionals, , Conditionally Visible Text}.@refill
+
+@item @@ifxml
+Begin text that will appear only in the XML output. Pair with
+@code{@@end ifxml}. @xref{Conditionals}.
+
+@item @@ignore
+Begin text that will not appear in any output. Pair with @code{@@end
+ignore}. @xref{Comments, , Comments and Ignored Text}.
+
+@item @@image@{@var{filename}, [@var{width}], [@var{height}], [@var{alt}], [@var{ext}]@}
+Include graphics image in external @var{filename} scaled to the given
+@var{width} and/or @var{height}, using @var{alt} text and looking for
+@samp{@var{filename}.@var{ext}} in HTML. @xref{Images}.
+
+@item @@include @var{filename}
+Incorporate the contents of the file @var{filename} into the Info file
+or printed document. @xref{Include Files}.@refill
+
+@item @@indicateurl@{@var{indicateurl}@}
+Indicate text that is a uniform resource locator for the World Wide
+Web. @xref{indicateurl, , @code{@@indicateurl}}.
+
+@item @@inforef@{@var{node-name}, [@var{entry-name}], @var{info-file-name}@}
+Make a cross reference to an Info file for which there is no printed
+manual. @xref{inforef, , Cross references using
+@code{@@inforef}}.@refill
+
+@item \input @var{macro-definitions-file}
+Use the specified macro definitions file. This command is used only
+in the first line of a Texinfo file to cause @TeX{} to make use of the
+@file{texinfo} macro definitions file. The backslash in @code{\input}
+is used instead of an @code{@@} because @TeX{} does not
+recognize @code{@@} until after it has read the definitions file.
+@xref{Texinfo File Header}.
+
+@item @@item
+Indicate the beginning of a marked paragraph for @code{@@itemize} and
+@code{@@enumerate}; indicate the beginning of the text of a first column
+entry for @code{@@table}, @code{@@ftable}, and @code{@@vtable}.
+@xref{Lists and Tables}.@refill
+
+@item @@itemize @var{mark-generating-character-or-command}
+Produce a sequence of indented paragraphs, with a mark inside the left
+margin at the beginning of each paragraph. Pair with @code{@@end
+itemize}. @xref{itemize, , @code{@@itemize}}.@refill
+
+@item @@itemx
+Like @code{@@item} but do not generate extra vertical space above the
+item text. @xref{itemx, , @code{@@itemx}}.@refill
+
+@item @@kbd@{@var{keyboard-characters}@}
+Indicate text that is characters of input to be typed by
+users. @xref{kbd, , @code{@@kbd}}.@refill
+
+@item @@kbdinputstyle @var{style}
+Specify when @code{@@kbd} should use a font distinct from @code{@@code}.
+@xref{kbd, , @code{@@kbd}}.@refill
+
+@item @@key@{@var{key-name}@}
+Indicate a name for a key on a keyboard.
+@xref{key, , @code{@@key}}.@refill
+
+@item @@kindex @var{entry}
+Add @var{entry} to the index of keys.
+@xref{Index Entries, , Defining the Entries of an Index}.@refill
+
+@item @@L@{@}
+@itemx @@l@{@}
+Generate the uppercase and lowercase Polish suppressed-L letters,
+respectively: @L{}, @l{}.
+
+@item @@LaTeX@{@}
+Insert the logo @LaTeX{}. @xref{tex, , @TeX{} and @LaTeX{}}.
+
+@item @@lisp
+Begin an example of Lisp code. Indent text, do not fill, and select
+fixed-width font. Pair with @code{@@end lisp}. @xref{lisp, , @code{@@lisp}}.
+
+@item @@listoffloats
+Produce a table-of-contents-like listing of @code{@@float}s.
+@xref{listoffloats}.
+
+@item @@lowersections
+Change subsequent chapters to sections, sections to subsections, and so
+on. @xref{Raise/lower sections, , @code{@@raisesections} and
+@code{@@lowersections}}.@refill
+
+@item @@macro @var{macroname} @{@var{params}@}
+Define a new Texinfo command @code{@@@var{macroname}@{@var{params}@}}.
+Only supported by @code{makeinfo} and @code{texi2dvi}. @xref{Defining
+Macros}.
+
+@item @@majorheading @var{title}
+Print a chapter-like heading in the text, but not in the table of
+contents of a printed manual. Generate more vertical whitespace before
+the heading than the @code{@@chapheading} command. @xref{majorheading &
+chapheading, , @code{@@majorheading} and @code{@@chapheading}}.@refill
+
+@item @@math@{@var{mathematical-expression}@}
+Format a mathematical expression.
+@xref{math, , @code{@@math}: Inserting Mathematical Expressions}.
+
+@item @@menu
+Mark the beginning of a menu of nodes in Info. No effect in a printed
+manual. Pair with @code{@@end menu}. @xref{Menus}.@refill
+
+@item @@minus@{@}
+Generate a minus sign, `@minus{}'. @xref{minus, , @code{@@minus}}.@refill
+
+@item @@multitable @var{column-width-spec}
+Begin a multi-column table. Pair with @code{@@end multitable}.
+@xref{Multitable Column Widths}.
+
+@item @@need @var{n}
+Start a new page in a printed manual if fewer than @var{n} mils
+(thousandths of an inch) remain on the current page. @xref{need, ,
+@code{@@need}}.@refill
+
+@item @@node @var{name}, @var{next}, @var{previous}, @var{up}
+Define the beginning of a new node in Info, and serve as a locator for
+references for @TeX{}. @xref{node, , @code{@@node}}.@refill
+
+@item @@noindent
+Prevent text from being indented as if it were a new paragraph.
+@xref{noindent, , @code{@@noindent}}.@refill
+
+@item @@novalidate
+Suppress validation of node references, omit creation of auxiliary files
+with @TeX{}. Use before @code{@@setfilename}. @xref{Pointer Validation}.
+
+@item @@O@{@}
+@itemx @@o@{@}
+Generate the uppercase and lowercase O-with-slash letters, respectively:
+@O{}, @o{}.
+
+@item @@oddfooting [@var{left}] @@| [@var{center}] @@| [@var{right}]
+@itemx @@oddheading [@var{left}] @@| [@var{center}] @@| [@var{right}]
+Specify page footings resp.@: headings for odd-numbered (right-hand)
+pages. @xref{Custom Headings, ,
+How to Make Your Own Headings}.@refill
+
+@item @@OE@{@}
+@itemx @@oe@{@}
+Generate the uppercase and lowercase OE ligatures, respectively:
+@OE{}, @oe{}. @xref{Inserting Accents}.
+
+@item @@option@{@var{option-name}@}
+Indicate a command-line option, such as @option{-l} or @option{--help}.
+@xref{option,, @code{@@option}}.
+
+@item @@page
+Start a new page in a printed manual. No effect in Info.
+@xref{page, , @code{@@page}}.@refill
+
+@item @@pagesizes [@var{width}][, @var{height}]
+Change page dimensions. @xref{pagesizes}.
+
+@item @@paragraphindent @var{indent}
+Indent paragraphs by @var{indent} number of spaces (perhaps 0); preserve
+source file indentation if @var{indent} is @code{asis}.
+@xref{paragraphindent,, Paragraph Indenting}.
+
+@item @@pindex @var{entry}
+Add @var{entry} to the index of programs. @xref{Index Entries, , Defining
+the Entries of an Index}.@refill
+
+@item @@point@{@}
+Indicate the position of point in a buffer to the reader with a
+glyph: @samp{@point{}}. @xref{Point Glyph, , Indicating
+Point in a Buffer}.@refill
+
+@item @@pounds@{@}
+Generate the pounds sterling currency sign.
+@xref{pounds,,@code{@@pounds@{@}}}.
+
+@item @@print@{@}
+Indicate printed output to the reader with a glyph:
+@samp{@print{}}. @xref{Print Glyph}.@refill
+
+@item @@printindex @var{index-name}
+Print an alphabetized two-column index in a printed manual or generate
+an alphabetized menu of index entries for Info. @xref{Printing
+Indices & Menus}.@refill
+
+@item @@pxref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@}
+Make a reference that starts with a lower case `see' in a printed
+manual. Use within parentheses only. Do not follow command with a
+punctuation mark---the Info formatting commands automatically insert
+terminating punctuation as needed. Only the first argument is mandatory.
+@xref{pxref, , @code{@@pxref}}.@refill
+
+@item @@questiondown@{@}
+Generate an upside-down question mark. @xref{Inserting Accents}.
+
+@item @@quotation
+Narrow the margins to indicate text that is quoted from another real
+or imaginary work. Takes optional argument of prefix text. Pair with
+@code{@@end quotation}. @xref{quotation, ,
+@code{@@quotation}}.@refill
+
+@item @@r@{@var{text}@}
+Print @var{text} in @r{roman} font. No effect in Info.
+@xref{Fonts}.@refill
+
+@item @@raisesections
+Change subsequent sections to chapters, subsections to sections, and so
+on. @xref{Raise/lower sections, , @code{@@raisesections} and
+@code{@@lowersections}}.@refill
+
+@item @@ref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@}
+Make a reference. In a printed manual, the reference does not start
+with a `See'. Follow command with a punctuation mark. Only the first
+argument is mandatory. @xref{ref, , @code{@@ref}}.@refill
+
+@item @@refill
+This command used to refill and indent the paragraph after all the
+other processing has been done. It is no longer needed, since all
+formatters now automatically refill as needed, but you may still see
+it in the source to some manuals, as it does no harm.
+
+@item @@registeredsymbol@{@}
+Generate the legal symbol @registeredsymbol{}. @xref{registered
+symbol,, @code{@@registeredsymbol@{@}}}.
+
+@item @@result@{@}
+Indicate the result of an expression to the reader with a special
+glyph: @samp{@result{}}. @xref{result, , @code{@@result}}.@refill
+
+@item @@ringaccent@{@var{c}@}
+Generate a ring accent over the next character, as in @ringaccent{o}.
+@xref{Inserting Accents}.
+
+@item @@samp@{@var{text}@}
+Highlight @var{text} that is a literal example of a sequence of
+characters. Used for single characters, for statements, and often for
+entire shell commands. @xref{samp, , @code{@@samp}}.@refill
+
+@item @@sansserif@{@var{text}@}
+Print @var{text} in a @sansserif{sans serif} font if possible. No
+effect in Info. @xref{Fonts}.
+
+@item @@sc@{@var{text}@}
+Set @var{text} in a printed output in @sc{the small caps font} and
+set text in the Info file in uppercase letters.
+@xref{Smallcaps}.@refill
+
+@item @@section @var{title}
+Begin a section within a chapter. In a printed manual, the section
+title is numbered and appears in the table of contents. In Info, the
+title is underlined with equal signs. @xref{section, ,
+@code{@@section}}.@refill
+
+@item @@set @var{flag} [@var{string}]
+Make @var{flag} active, causing the Texinfo formatting commands to
+format text between subsequent pairs of @code{@@ifset @var{flag}} and
+@code{@@end ifset} commands. Optionally, set value of @var{flag} to
+@var{string}.
+@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.
+
+@item @@setchapternewpage @var{on-off-odd}
+Specify whether chapters start on new pages, and if so, whether on
+odd-numbered (right-hand) new pages. @xref{setchapternewpage, ,
+@code{@@setchapternewpage}}.
+
+@item @@setcontentsaftertitlepage
+Put the table of contents after the @samp{@@end titlepage} even if the
+@code{@@contents} command is not there. @xref{Contents}.
+
+@item @@setfilename @var{info-file-name}
+Provide a name to be used by the Info file. This command is essential
+for @TeX{} formatting as well, even though it produces no output.
+@xref{setfilename, , @code{@@setfilename}}.
+
+@item @@setshortcontentsaftertitlepage
+Place the short table of contents after the @samp{@@end titlepage}
+command even if the @code{@@shortcontents} command is not there.
+@xref{Contents}.
+
+@item @@settitle @var{title}
+Provide a title for page headers in a printed manual, and the default
+document description for HTML @samp{<head>}.
+@xref{settitle, , @code{@@settitle}}.@refill
+
+@item @@shortcaption
+Define the short caption for a @code{@@float}. @xref{caption shortcaption}.
+
+@item @@shortcontents
+Print a short table of contents. Not relevant to Info, which uses
+menus rather than tables of contents. A synonym for
+@code{@@summarycontents}. @xref{Contents, , Generating a Table of
+Contents}.@refill
+
+@item @@shorttitlepage @var{title}
+Generate a minimal title page. @xref{titlepage,,@code{@@titlepage}}.
+
+@item @@slanted@{@var{text}@}
+Print @var{text} in a @slanted{slanted} font if possible. No effect
+in Info. @xref{Fonts}.
+
+@item @@smallbook
+Cause @TeX{} to produce a printed manual in a 7 by 9.25 inch format
+rather than the regular 8.5 by 11 inch format. @xref{smallbook, ,
+Printing Small Books}. Also, see @ref{small}.
+
+@item @@smalldisplay
+Begin a kind of example. Like @code{@@smallexample} (narrow margins, no
+filling), but do not select the fixed-width font. Pair with @code{@@end
+smalldisplay}. @xref{small}.
+
+@item @@smallexample
+Indent text to indicate an example. Do not fill, select fixed-width
+font, narrow the margins. In printed manuals, print text in a smaller
+font than with @code{@@example}. Pair with @code{@@end smallexample}.
+@xref{small}.
+
+@item @@smallformat
+Begin a kind of example. Like @code{@@smalldisplay}, but do not narrow
+the margins. Pair with @code{@@end smallformat}. @xref{small}.
+
+@item @@smalllisp
+Begin an example of Lisp code. Same as @code{@@smallexample}. Pair
+with @code{@@end smalllisp}. @xref{small}.
+
+@item @@sp @var{n}
+Skip @var{n} blank lines. @xref{sp, , @code{@@sp}}.@refill
+
+@item @@ss@{@}
+Generate the German sharp-S es-zet letter, @ss{}. @xref{Inserting Accents}.
+
+@item @@strong @{@var{text}@}
+Emphasize @var{text} by typesetting it in a @strong{bold} font for the
+printed manual and by surrounding it with asterisks for Info.
+@xref{emph & strong, , Emphasizing Text}.@refill
+
+@item @@subheading @var{title}
+Print an unnumbered subsection-like heading in the text, but not in
+the table of contents of a printed manual. In Info, the title is
+underlined with hyphens. @xref{unnumberedsubsec appendixsubsec
+subheading, , @code{@@unnumberedsubsec} @code{@@appendixsubsec}
+@code{@@subheading}}.@refill
+
+@item @@subsection @var{title}
+Begin a subsection within a section. In a printed manual, the
+subsection title is numbered and appears in the table of contents. In
+Info, the title is underlined with hyphens. @xref{subsection, ,
+@code{@@subsection}}.@refill
+
+@item @@subsubheading @var{title}
+Print an unnumbered subsubsection-like heading in the text, but not in
+the table of contents of a printed manual. In Info, the title is
+underlined with periods. @xref{subsubsection, , The `subsub'
+Commands}.@refill
+
+@item @@subsubsection @var{title}
+Begin a subsubsection within a subsection. In a printed manual,
+the subsubsection title is numbered and appears in the table of
+contents. In Info, the title is underlined with periods.
+@xref{subsubsection, , The `subsub' Commands}.@refill
+
+@item @@subtitle @var{title}
+In a printed manual, set a subtitle in a normal sized font flush to
+the right-hand side of the page. Not relevant to Info, which does not
+have title pages. @xref{title subtitle author, , @code{@@title}
+@code{@@subtitle} and @code{@@author} Commands}.@refill
+
+@item @@summarycontents
+Print a short table of contents. Not relevant to Info, which uses
+menus rather than tables of contents. A synonym for
+@code{@@shortcontents}. @xref{Contents, , Generating a Table of
+Contents}.@refill
+
+@item @@syncodeindex @var{from-index} @var{into-index}
+Merge the index named in the first argument into the index named in
+the second argument, printing the entries from the first index in
+@code{@@code} font. @xref{Combining Indices}.@refill
+
+@item @@synindex @var{from-index} @var{into-index}
+Merge the index named in the first argument into the index named in
+the second argument. Do not change the font of @var{from-index}
+entries. @xref{Combining Indices}.@refill
+
+@item @@t@{@var{text}@}
+Print @var{text} in a @t{fixed-width}, typewriter-like font.
+No effect in Info. @xref{Fonts}.@refill
+
+@item @@tab
+Separate columns in a multitable. @xref{Multitable Rows}.
+
+@item @@table @var{formatting-command}
+Begin a two-column table, using @code{@@item} for each entry. Write
+each first column entry on the same line as @code{@@item}. First
+column entries are printed in the font resulting from
+@var{formatting-command}. Pair with @code{@@end table}.
+@xref{Two-column Tables, , Making a Two-column Table}.
+Also see @ref{ftable vtable, , @code{@@ftable} and @code{@@vtable}},
+and @ref{itemx, , @code{@@itemx}}.@refill
+
+@item @@TeX@{@}
+Insert the logo @TeX{}. @xref{tex, , @TeX{} and @LaTeX{}}.
+
+@item @@tex
+Enter @TeX{} completely. Pair with @code{@@end tex}. @xref{Raw
+Formatter Commands}.
+
+@item @@thischapter
+@itemx @@thischaptername
+@itemx @@thisfile
+@itemx @@thispage
+@itemx @@thistitle
+Only allowed in a heading or footing. Stands for the number and name of
+the current chapter (in the format `Chapter 1: Title'), the chapter name
+only, the filename, the current page number, and the title of the
+document, respectively. @xref{Custom Headings, , How to Make Your Own
+Headings}.@refill
+
+@item @@tie@{@}
+Generate a normal interword space at which a line break is not allowed.
+@xref{tie,, @code{@@tie@{@}}}.
+
+@item @@tieaccent@{@var{cc}@}
+Generate a tie-after accent over the next two characters @var{cc}, as in
+`@tieaccent{oo}'. @xref{Inserting Accents}.
+
+@item @@tindex @var{entry}
+Add @var{entry} to the index of data types. @xref{Index Entries, ,
+Defining the Entries of an Index}.@refill
+
+@item @@title @var{title}
+In a printed manual, set a title flush to the left-hand side of the
+page in a larger than normal font and underline it with a black rule.
+Not relevant to Info, which does not have title pages. @xref{title
+subtitle author, , The @code{@@title} @code{@@subtitle} and
+@code{@@author} Commands}.@refill
+
+@item @@titlefont@{@var{text}@}
+In a printed manual, print @var{text} in a larger than normal font.
+Not relevant to Info, which does not have title pages.
+@xref{titlefont center sp, , The @code{@@titlefont} @code{@@center}
+and @code{@@sp} Commands}.@refill
+
+@item @@titlepage
+Indicate to Texinfo the beginning of the title page. Write command on
+a line of its own. Pair with @code{@@end titlepage}. Nothing between
+@code{@@titlepage} and @code{@@end titlepage} appears in Info.
+@xref{titlepage, , @code{@@titlepage}}.@refill
+
+@item @@today@{@}
+Insert the current date, in `1 Jan 1900' style. @xref{Custom
+Headings, , How to Make Your Own Headings}.@refill
+
+@item @@top @var{title}
+In a Texinfo file to be formatted with @code{makeinfo}, identify the
+topmost @code{@@node} in the file, which must be written on the line
+immediately preceding the @code{@@top} command. Used for
+@code{makeinfo}'s node pointer insertion feature. The title is
+underlined with asterisks. Both the @code{@@node} line and the @code{@@top}
+line normally should be enclosed by @code{@@ifnottex} and @code{@@end
+ifnottex}. In @TeX{} and @code{texinfo-format-buffer}, the @code{@@top}
+command is merely a synonym for @code{@@unnumbered}. @xref{makeinfo
+Pointer Creation, , Creating Pointers with @code{makeinfo}}.
+
+@item @@u@{@var{c}@}
+@itemx @@ubaraccent@{@var{c}@}
+@itemx @@udotaccent@{@var{c}@}
+Generate a breve, underbar, or underdot accent, respectively, over or
+under the character @var{c}, as in @u{o}, @ubaraccent{o},
+@udotaccent{o}. @xref{Inserting Accents}.
+
+@item @@unnumbered @var{title}
+In a printed manual, begin a chapter that appears without chapter
+numbers of any kind. The title appears in the table of contents of a
+printed manual. In Info, the title is underlined with asterisks.
+@xref{unnumbered & appendix, , @code{@@unnumbered} and
+@code{@@appendix}}.@refill
+
+@item @@unnumberedsec @var{title}
+In a printed manual, begin a section that appears without section
+numbers of any kind. The title appears in the table of contents of a
+printed manual. In Info, the title is underlined with equal signs.
+@xref{unnumberedsec appendixsec heading, , Section Commands}.@refill
+
+@item @@unnumberedsubsec @var{title}
+In a printed manual, begin an unnumbered subsection within a
+chapter. The title appears in the table of contents of a printed
+manual. In Info, the title is underlined with hyphens.
+@xref{unnumberedsubsec appendixsubsec subheading, ,
+@code{@@unnumberedsubsec} @code{@@appendixsubsec}
+@code{@@subheading}}.@refill
+
+@item @@unnumberedsubsubsec @var{title}
+In a printed manual, begin an unnumbered subsubsection within a
+chapter. The title appears in the table of contents of a printed
+manual. In Info, the title is underlined with periods.
+@xref{subsubsection, , The `subsub' Commands}.@refill
+
+@item @@uref@{@var{url}[, @var{displayed-text}][, @var{replacement}@}
+@itemx @@url@{@var{url}[, @var{displayed-text}][, @var{replacement}@}
+Define a cross reference to an external uniform resource locator for the
+World Wide Web. @xref{uref, , @code{@@uref}}.
+
+@item @@v@{@var{c}@}
+Generate check accent over the character @var{c}, as in @v{o}.
+@xref{Inserting Accents}.
+
+@item @@value@{@var{flag}@}
+Replace @var{flag} with the value to which it is set by @code{@@set
+@var{flag}}.
+@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill
+
+@item @@var@{@var{metasyntactic-variable}@}
+Highlight a metasyntactic variable, which is something that stands for
+another piece of text. @xref{var, , Indicating Metasyntactic
+Variables}.@refill
+
+@item @@verb@{@var{delim} @var{literal} @var{delim}@}
+Output @var{literal}, delimited by the single character @var{delim},
+exactly as is (in the fixed-width font), including any whitespace or
+Texinfo special characters. @xref{verb,,@code{verb}}.
+
+@item @@verbatim
+Output the text of the environment exactly as is (in the fixed-width
+font). Pair with @code{@@end verbatim}. @xref{verbatim,,@code{verbatim}}.
+
+@item @@verbatiminclude @var{filename}
+Output the contents of @var{filename} exactly as is (in the fixed-width font).
+@xref{verbatiminclude,,@code{verbatiminclude}}.
+
+@item @@vindex @var{entry}
+Add @var{entry} to the index of variables. @xref{Index Entries, ,
+Defining the Entries of an Index}.@refill
+
+@item @@vskip @var{amount}
+In a printed manual, insert whitespace so as to push text on the
+remainder of the page towards the bottom of the page. Used in
+formatting the copyright page with the argument @samp{0pt plus
+1filll}. (Note spelling of @samp{filll}.) @code{@@vskip} may be used
+only in contexts ignored for Info. @xref{Copyright}.
+
+@item @@vtable @var{formatting-command}
+Begin a two-column table, using @code{@@item} for each entry.
+Automatically enter each of the items in the first column into the
+index of variables. Pair with @code{@@end vtable}. The same as
+@code{@@table}, except for indexing. @xref{ftable vtable, ,
+@code{@@ftable} and @code{@@vtable}}.@refill
+
+@item @@w@{@var{text}@}
+Prevent @var{text} from being split across two lines.
+@xref{w, , @code{@@w}}.@refill
+
+@item @@xml
+Enter XML completely. Pair with @code{@@end xml}. @xref{Raw
+Formatter Commands}.
+
+@item @@xref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@}
+Make a reference that starts with `See' in a printed manual. Follow
+command with a punctuation mark. Only the first argument is
+mandatory. @xref{xref, , @code{@@xref}}.@refill
+@end table
+
+
+@node Command Syntax
+@section @@-Command Syntax
+@cindex @@-command syntax
+@cindex Syntax, of @@-commands
+@cindex Command syntax
+
+The character @samp{@@} is used to start special Texinfo commands.
+(It has the same meaning that @samp{\} has in plain @TeX{}.) Texinfo
+has four types of @@-command:@refill
+
+@table @asis
+@item 1. Non-alphabetic commands.
+These commands consist of an @@ followed by a punctuation mark or other
+character that is not part of the alphabet. Non-alphabetic commands are
+almost always part of the text within a paragraph, and never take any
+argument. The two characters (@@ and the other one) are complete in
+themselves; none is followed by braces. The non-alphabetic commands
+are: @code{@@.}, @code{@@:}, @code{@@*}, @code{@@@kbd{SPACE}},
+@code{@@@kbd{TAB}}, @code{@@@kbd{NL}}, @code{@@@@}, @code{@@@{}, and
+@code{@@@}}.@refill
+
+@item 2. Alphabetic commands that do not require arguments.
+These commands start with @@ followed by a word followed by left- and
+right-hand braces. These commands insert special symbols in the
+document; they do not require arguments. For example,
+@code{@@dots@{@}} @result{} @samp{@dots{}}, @code{@@equiv@{@}}
+@result{} @samp{@equiv{}}, @code{@@TeX@{@}} @result{} `@TeX{}',
+and @code{@@bullet@{@}} @result{} @samp{@bullet{}}.@refill
+
+@item 3. Alphabetic commands that require arguments within braces.
+These commands start with @@ followed by a letter or a word, followed by an
+argument within braces. For example, the command @code{@@dfn} indicates
+the introductory or defining use of a term; it is used as follows: @samp{In
+Texinfo, @@@@-commands are @@dfn@{mark-up@} commands.}@refill
+
+@item 4. Alphabetic commands that occupy an entire line.
+These commands occupy an entire line. The line starts with @@,
+followed by the name of the command (a word); for example, @code{@@center}
+or @code{@@cindex}. If no argument is needed, the word is followed by
+the end of the line. If there is an argument, it is separated from
+the command name by a space. Braces are not used.@refill
+@end table
+
+@cindex Braces and argument syntax
+Thus, the alphabetic commands fall into classes that have
+different argument syntaxes. You cannot tell to which class a command
+belongs by the appearance of its name, but you can tell by the
+command's meaning: if the command stands for a glyph, it is in
+class 2 and does not require an argument; if it makes sense to use the
+command together with other text as part of a paragraph, the command
+is in class 3 and must be followed by an argument in braces;
+otherwise, it is in class 4 and uses the rest of the line as its
+argument.@refill
+
+The purpose of having a different syntax for commands of classes 3 and
+4 is to make Texinfo files easier to read, and also to help the GNU
+Emacs paragraph and filling commands work properly. There is only one
+exception to this rule: the command @code{@@refill}, which is always
+used at the end of a paragraph immediately following the final period
+or other punctuation character. @code{@@refill} takes no argument and
+does @emph{not} require braces. @code{@@refill} never confuses the
+Emacs paragraph commands because it cannot appear at the beginning of
+a line. It is also no longer needed, since all formatters now refill
+paragraphs automatically.
+
+
+@node Tips
+@appendix Tips and Hints
+
+Here are some tips for writing Texinfo documentation:@refill
+
+@cindex Tips
+@cindex Usage tips
+@cindex Hints
+@itemize @bullet
+@item
+Write in the present tense, not in the past or the future.
+
+@item
+Write actively! For example, write ``We recommend that @dots{}'' rather
+than ``It is recommended that @dots{}''.
+
+@item
+Use 70 or 72 as your fill column. Longer lines are hard to read.
+
+@item
+Include a copyright notice and copying permissions.
+@end itemize
+
+@subsubheading Index, Index, Index!
+
+Write many index entries, in different ways.
+Readers like indices; they are helpful and convenient.
+
+Although it is easiest to write index entries as you write the body of
+the text, some people prefer to write entries afterwards. In either
+case, write an entry before the paragraph to which it applies. This
+way, an index entry points to the first page of a paragraph that is
+split across pages.
+
+Here are more hints we have found valuable:
+
+@itemize @bullet
+@item
+Write each index entry differently, so each entry refers to a different
+place in the document.
+
+@item
+Write index entries only where a topic is discussed significantly. For
+example, it is not useful to index ``debugging information'' in a
+chapter on reporting bugs. Someone who wants to know about debugging
+information will certainly not find it in that chapter.
+
+@item
+Consistently capitalize the first word of every concept index entry,
+or else consistently use lower case. Terse entries often call for
+lower case; longer entries for capitalization. Whichever case
+convention you use, please use one or the other consistently! Mixing
+the two styles looks bad.
+
+@item
+Always capitalize or use upper case for those words in an index for
+which this is proper, such as names of countries or acronyms. Always
+use the appropriate case for case-sensitive names, such as those in C or
+Lisp.
+
+@item
+Write the indexing commands that refer to a whole section immediately
+after the section command, and write the indexing commands that refer to
+a paragraph before that paragraph.
+
+In the example that follows, a blank line comes after the index
+entry for ``Leaping'':
+
+@example
+@group
+@@section The Dog and the Fox
+@@cindex Jumping, in general
+@@cindex Leaping
+
+@@cindex Dog, lazy, jumped over
+@@cindex Lazy dog jumped over
+@@cindex Fox, jumps over dog
+@@cindex Quick fox jumps over dog
+The quick brown fox jumps over the lazy dog.
+@end group
+@end example
+
+@noindent
+(Note that the example shows entries for the same concept that are
+written in different ways---@samp{Lazy dog}, and @samp{Dog, lazy}---so
+readers can look up the concept in different ways.)
+@end itemize
+
+@subsubheading Blank Lines
+
+@itemize @bullet
+@item
+Insert a blank line between a sectioning command and the first following
+sentence or paragraph, or between the indexing commands associated with
+the sectioning command and the first following sentence or paragraph, as
+shown in the tip on indexing. Otherwise, a formatter may fold title and
+paragraph together.
+
+@item
+Always insert a blank line before an @code{@@table} command and after an
+@code{@@end table} command; but never insert a blank line after an
+@code{@@table} command or before an @code{@@end table} command.
+
+@need 1000
+For example,
+
+@example
+@group
+Types of fox:
+
+@@table @@samp
+@@item Quick
+Jump over lazy dogs.
+@end group
+
+@group
+@@item Brown
+Also jump over lazy dogs.
+@@end table
+
+@end group
+@group
+@@noindent
+On the other hand, @dots{}
+@end group
+@end example
+
+Insert blank lines before and after @code{@@itemize} @dots{} @code{@@end
+itemize} and @code{@@enumerate} @dots{} @code{@@end enumerate} in the
+same way.
+@end itemize
+
+@subsubheading Complete Phrases
+
+Complete phrases are easier to read than @dots{}
+
+@itemize @bullet
+@item
+Write entries in an itemized list as complete sentences; or at least, as
+complete phrases. Incomplete expressions @dots{} awkward @dots{} like
+this.
+
+@item
+Write the prefatory sentence or phrase for a multi-item list or table as
+a complete expression. Do not write ``You can set:''; instead, write
+``You can set these variables:''. The former expression sounds cut off.
+@end itemize
+
+@subsubheading Editions, Dates and Versions
+
+Include edition numbers, version numbers, and dates in the
+@code{@@copying} text (for people reading the Texinfo file, and for the
+legal copyright in the output files). Then use @code{@@insertcopying}
+in the @code{@@titlepage} section (for people reading the printed
+output) and the Top node (for people reading the online output).
+
+It is easiest to do this using @code{@@set} and @code{@@value}.
+@xref{value Example, , @code{@@value} Example}, and @ref{GNU Sample Texts}.
+
+
+@subsubheading Definition Commands
+
+Definition commands are @code{@@deffn}, @code{@@defun},
+@code{@@defmac}, and the like, and enable you to write descriptions in
+a uniform format.@refill
+
+@itemize @bullet
+@item
+Write just one definition command for each entity you define with a
+definition command. The automatic indexing feature creates an index
+entry that leads the reader to the definition.
+
+@item
+Use @code{@@table} @dots{} @code{@@end table} in an appendix that
+contains a summary of functions, not @code{@@deffn} or other definition
+commands.
+@end itemize
+
+@subsubheading Capitalization
+
+@itemize @bullet
+@item
+Capitalize ``Texinfo''; it is a name. Do not write the @samp{x} or
+@samp{i} in upper case.
+
+@item
+Capitalize ``Info''; it is a name.
+
+@item
+Write @TeX{} using the @code{@@TeX@{@}} command. Note the uppercase
+@samp{T} and @samp{X}. This command causes the formatters to
+typeset the name according to the wishes of Donald Knuth, who wrote
+@TeX{}.
+@end itemize
+
+@subsubheading Spaces
+
+Do not use spaces to format a Texinfo file, except inside of
+@code{@@example} @dots{} @code{@@end example} and other literal
+environments and commands.
+
+@need 700
+For example, @TeX{} fills the following:
+
+@example
+@group
+ @@kbd@{C-x v@}
+ @@kbd@{M-x vc-next-action@}
+ Perform the next logical operation
+ on the version-controlled file
+ corresponding to the current buffer.
+@end group
+@end example
+
+@need 950
+@noindent
+so it looks like this:
+
+@iftex
+@quotation
+ @kbd{C-x v}
+ @kbd{M-x vc-next-action}
+ Perform the next logical operation on the version-controlled file
+ corresponding to the current buffer.
+@end quotation
+@end iftex
+@ifnottex
+@quotation
+`C-x v' `M-x vc-next-action' Perform the next logical operation on the
+version-controlled file corresponding to the current buffer.
+@end quotation
+@end ifnottex
+
+@noindent
+In this case, the text should be formatted with
+@code{@@table}, @code{@@item}, and @code{@@itemx}, to create a table.
+
+
+@subsubheading @@code, @@samp, @@var, and @samp{---}
+
+@itemize @bullet
+@item
+Use @code{@@code} around Lisp symbols, including command names.
+For example,
+
+@example
+The main function is @@code@{vc-next-action@}, @dots{}
+@end example
+
+@item
+Avoid putting letters such as @samp{s} immediately after an
+@samp{@@code}. Such letters look bad.
+
+@item
+Use @code{@@var} around meta-variables. Do not write angle brackets
+around them.
+
+@item
+Use three hyphens in a row, @samp{---}, to indicate a long dash. @TeX{}
+typesets these as a long dash and the Info formatters reduce three
+hyphens to two.
+@end itemize
+
+@subsubheading Periods Outside of Quotes
+
+Place periods and other punctuation marks @emph{outside} of quotations,
+unless the punctuation is part of the quotation. This practice goes
+against publishing conventions in the United States, but enables the
+reader to distinguish between the contents of the quotation and the
+whole passage.
+
+For example, you should write the following sentence with the period
+outside the end quotation marks:
+
+@example
+Evidently, @samp{au} is an abbreviation for ``author''.
+@end example
+
+@noindent
+since @samp{au} does @emph{not} serve as an abbreviation for
+@samp{author.} (with a period following the word).
+
+@subsubheading Introducing New Terms
+
+@itemize @bullet
+@item
+Introduce new terms so that a reader who does not know them can
+understand them from context; or write a definition for the term.
+
+For example, in the following, the terms ``check in'', ``register'' and
+``delta'' are all appearing for the first time; the example sentence should be
+rewritten so they are understandable.
+
+@quotation
+The major function assists you in checking in a file to your
+version control system and registering successive sets of changes to
+it as deltas.
+@end quotation
+
+@item
+Use the @code{@@dfn} command around a word being introduced, to indicate
+that the reader should not expect to know the meaning already, and
+should expect to learn the meaning from this passage.
+@end itemize
+
+@subsubheading @@pxref
+
+@c !!! maybe include this in the tips on pxref
+@ignore
+By the way, it is okay to use pxref with something else in front of
+it within the parens, as long as the pxref is followed by the close
+paren, and the material inside the parens is not part of a larger
+sentence. Also, you can use xref inside parens as part of a complete
+sentence so long as you terminate the cross reference with punctuation.
+@end ignore
+Absolutely never use @code{@@pxref} except in the special context for
+which it is designed: inside parentheses, with the closing parenthesis
+following immediately after the closing brace. One formatter
+automatically inserts closing punctuation and the other does not. This
+means that the output looks right both in printed output and in an Info
+file, but only when the command is used inside parentheses.
+
+@subsubheading Invoking from a Shell
+
+You can invoke programs such as Emacs, GCC, and @code{gawk} from a
+shell. The documentation for each program should contain a section that
+describes this. Unfortunately, if the node names and titles for these
+sections are all different, they are difficult for users to find.
+
+So, there is a convention to name such sections with a phrase beginning
+with the word `Invoking', as in `Invoking Emacs'; this way, users can
+find the section easily.
+
+
+@subsubheading ANSI C Syntax
+
+When you use @code{@@example} to describe a C function's calling
+conventions, use the ANSI C syntax, like this:@refill
+
+@example
+void dld_init (char *@@var@{path@});
+@end example
+
+@noindent
+And in the subsequent discussion, refer to the argument values by
+writing the same argument names, again highlighted with
+@code{@@var}.@refill
+
+@need 800
+Avoid the obsolete style that looks like this:@refill
+
+@example
+#include <dld.h>
+
+dld_init (path)
+char *path;
+@end example
+
+Also, it is best to avoid writing @code{#include} above the
+declaration just to indicate that the function is declared in a
+header file. The practice may give the misimpression that the
+@code{#include} belongs near the declaration of the function. Either
+state explicitly which header file holds the declaration or, better
+yet, name the header file used for a group of functions at the
+beginning of the section that describes the functions.@refill
+
+@subsubheading Bad Examples
+
+Here are several examples of bad writing to avoid:
+
+In this example, say, `` @dots{} you must @code{@@dfn}@{check
+in@} the new version.'' That flows better.
+
+@quotation
+When you are done editing the file, you must perform a
+@code{@@dfn}@{check in@}.
+@end quotation
+
+In the following example, say, ``@dots{} makes a unified interface such as VC
+mode possible.''
+
+@quotation
+SCCS, RCS and other version-control systems all perform similar
+functions in broadly similar ways (it is this resemblance which makes
+a unified control mode like this possible).
+@end quotation
+
+And in this example, you should specify what `it' refers to:
+
+@quotation
+If you are working with other people, it assists in coordinating
+everyone's changes so they do not step on each other.
+@end quotation
+
+@subsubheading And Finally @dots{}
+
+@itemize @bullet
+@item
+Pronounce @TeX{} as if the @samp{X} were a Greek `chi', as the last
+sound in the name `Bach'. But pronounce Texinfo as in `speck':
+``teckinfo''.
+
+@item
+Write notes for yourself at the very end of a Texinfo file after the
+@code{@@bye}. None of the formatters process text after the
+@code{@@bye}; it is as if the text were within @code{@@ignore} @dots{}
+@code{@@end ignore}.
+@end itemize
+
+
+@node Sample Texinfo Files
+@appendix Sample Texinfo Files
+@cindex Sample Texinfo files
+
+The first example is from the first chapter (@pxref{Short Sample}),
+given here in its entirety, without commentary. The second
+includes the full texts to be used in GNU manuals.
+
+@menu
+* Short Sample Texinfo File::
+* GNU Sample Texts::
+* Verbatim Copying License::
+* All-permissive Copying License::
+@end menu
+
+
+@node Short Sample Texinfo File
+@section Short Sample
+@cindex Sample Texinfo file, no comments
+
+Here is a complete, short sample Texinfo file, without any commentary.
+You can see this file, with comments, in the first chapter. @xref{Short
+Sample}.
+
+In a nutshell: The @command{makeinfo} program transforms a Texinfo
+source file such as this into an Info file or HTML; and @TeX{} typesets
+it for a printed manual.
+
+
+@sp 1
+@example
+\input texinfo @@c -*-texinfo-*-
+@@c %**start of header
+@@setfilename sample.info
+@@settitle Sample Manual 1.0
+@@c %**end of header
+
+@@copying
+This is a short example of a complete Texinfo file.
+
+Copyright (C) 2004 Free Software Foundation, Inc.
+@@end copying
+
+@@titlepage
+@@title Sample Title
+@@page
+@@vskip 0pt plus 1filll
+@@insertcopying
+@@end titlepage
+
+@@c Output the table of the contents at the beginning.
+@@contents
+
+@@ifnottex
+@@node Top
+@@top GNU Sample
+
+@@insertcopying
+@@end ifnottex
+
+@@menu
+* First Chapter:: The first chapter is the
+ only chapter in this sample.
+* Index:: Complete index.
+@@end menu
+
+
+@@node First Chapter
+@@chapter First Chapter
+
+@@cindex chapter, first
+
+This is the first chapter.
+@@cindex index entry, another
+
+Here is a numbered list.
+
+@@enumerate
+@@item
+This is the first item.
+
+@@item
+This is the second item.
+@@end enumerate
+
+
+@@node Index
+@@unnumbered Index
+
+@@printindex cp
+
+@@bye
+@end example
+
+
+@node GNU Sample Texts
+@section GNU Sample Texts
+
+@cindex GNU sample texts
+@cindex Sample texts, GNU
+@cindex Full texts, GNU
+
+Following is a sample Texinfo document with the full texts that should
+be used in GNU manuals.
+
+As well as the legal texts, it also serves as a practical example of how
+many elements in a GNU system can affect the manual. If you're not
+familiar with all these different elements, don't worry. They're not
+required and a perfectly good manual can be written without them.
+They're included here nonetheless because many manuals do (or could)
+benefit from them.
+
+@xref{Short Sample}, for a minimal example of a Texinfo file.
+@xref{Beginning a File}, for a full explanation of that minimal
+example.
+
+Here are some notes on the example:
+
+@itemize @bullet
+@item
+@cindex $Id
+@cindex CVS $Id
+@cindex RCS $Id
+@cindex Documentation identification
+@cindex Identification of documentation
+The @samp{$Id:} comment is for the CVS (@pxref{Top,, Overview, cvs,
+Concurrent Versions System}) or RCS (see rcsintro(1)) version control
+systems, which expand it into a string such as:
+@example
+$Id: texinfo.txi,v 1.128 2004/12/29 15:06:41 karl Exp $
+@end example
+(This is useful in all sources that use version control, not just manuals.)
+You may wish to include the @samp{$Id:} comment in the @code{@@copying}
+text, if you want a completely unambiguous reference to the
+documentation version.
+
+If you want to literally write @t{@w{$}Id$}, use @code{@@w}:
+@code{@@w@{$@}Id$}.
+
+@item
+@pindex automake@r{, and version info}
+@vindex UPDATED @r{Automake variable}
+@vindex VERSION @r{Automake variable}
+@pindex time-stamp.el
+The @file{version.texi} in the @code{@@include} command is maintained
+automatically by Automake (@pxref{Top,, Introduction, automake, GNU
+Automake}). It sets the @samp{VERSION} and @samp{UPDATED} values used
+elsewhere. If your distribution doesn't use Automake, but you do use
+Emacs, you may find the time-stamp.el package helpful (@pxref{Time
+Stamps,,,emacs,The GNU Emacs Manual}).
+
+@item
+The @code{@@syncodeindex} command reflects the recommendation to use
+only one index where possible, to make it easier for readers to look up
+index entries.
+
+@item
+The @code{@@dircategory} is for constructing the Info directory.
+@xref{Installing Dir Entries}, which includes a variety of recommended
+category names.
+
+@item
+The `Invoking' node is a GNU standard to help users find the basic
+information about command-line usage of a given program. @xref{Manual
+Structure Details,,,standards, GNU Coding Standards}.
+
+@item
+@cindex GNU Free Documentation License, including entire
+@cindex Free Documentation License, including entire
+It is best to include the entire GNU Free Documentation License in a GNU
+manual, unless the manual is only a few pages long. Of course this
+sample is even shorter than that, but it includes the FDL anyway in
+order to show one conventional way to do so. The @file{fdl.texi} file
+is available on the GNU machines and in the Texinfo and other GNU
+source distributions.
+
+The FDL provides for omitting itself under certain conditions, but in
+that case the sample texts given here have to be modified. @xref{GNU
+Free Documentation License}.
+
+@item
+If your manual has invariant sections (again, see the license itself for
+details), then don't forget to change the text here accordingly.
+
+@item
+For documents that express your personal views, feelings or experiences,
+it is more appropriate to use a license permitting only verbatim
+copying, rather than the FDL. @xref{Verbatim Copying License}.
+
+@end itemize
+
+Here is the sample document:
+
+@verbatim
+\input texinfo @c -*-texinfo-*-
+@comment $Id: texinfo.txi,v 1.128 2004/12/29 15:06:41 karl Exp $
+@comment %**start of header
+@setfilename sample.info
+@include version.texi
+@settitle GNU Sample @value{VERSION}
+@syncodeindex pg cp
+@comment %**end of header
+@copying
+This manual is for GNU Sample
+(version @value{VERSION}, @value{UPDATED}),
+which is an example in the Texinfo documentation.
+
+Copyright @copyright{} 2004 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below. A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software. Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Texinfo documentation system
+@direntry
+* sample: (sample)Invoking sample.
+@end direntry
+
+@titlepage
+@title GNU Sample
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author A.U. Thor (@email{bug-texinfo@@gnu.org})
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Sample
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Invoking sample::
+* Copying This Manual::
+* Index::
+@end menu
+
+
+@node Invoking sample
+@chapter Invoking sample
+
+@pindex sample
+@cindex invoking @command{sample}
+
+This is a sample manual. There is no sample program to
+invoke, but if there was, you could see its basic usage
+and command line options here.
+
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
+@end verbatim
+
+
+@node Verbatim Copying License
+@section Verbatim Copying License
+
+@cindex Verbatim copying license
+@cindex License for verbatim copying
+
+For software manuals and other documentation, it is important to use a
+license permitting free redistribution and updating, so that when a free
+program is changed, the documentation can be updated as well.
+
+On the other hand, for documents that express your personal views,
+feelings or experiences, it is more appropriate to use a license
+permitting only verbatim copying.
+
+Here is sample text for such a license permitting verbatim copying only.
+This is just the license text itself. For a complete sample document,
+see the previous sections.
+
+@verbatim
+@copying
+This document is a sample for allowing verbatim copying only.
+
+Copyright @copyright{} 2004 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to make and distribute verbatim copies
+of this entire document without royalty provided the
+copyright notice and this permission notice are preserved.
+@end quotation
+@end copying
+@end verbatim
+
+
+@node All-permissive Copying License
+@section All-permissive Copying License
+
+@cindex All-permissive copying license
+@cindex License for all-permissive copying
+
+For software manuals and other documentation, it is important to use a
+license permitting free redistribution and updating, so that when a free
+program is changed, the documentation can be updated as well.
+
+On the other hand, for small supporting files, short manuals (under 300
+lines long) and rough documentation (README files, INSTALL files, etc.),
+the full FDL would be overkill. They can use a simple all-permissive
+license.
+
+Here is sample text for such an all-permissive license. This is just
+the license text itself. For a complete sample document, see the
+previous sections.
+
+@example
+Copyright @copyright{} 2004 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+@end example
+
+
+@node Include Files
+@appendix Include Files
+@cindex Include files
+
+When @TeX{} or an Info formatting command sees an @code{@@include}
+command in a Texinfo file, it processes the contents of the file named
+by the command and incorporates them into the DVI or Info file being
+created. Index entries from the included file are incorporated into
+the indices of the output file.
+
+Include files let you keep a single large document as a collection of
+conveniently small parts.
+
+@menu
+* Using Include Files:: How to use the @code{@@include} command.
+* texinfo-multiple-files-update:: How to create and update nodes and
+ menus when using included files.
+* Include Files Requirements:: @code{texinfo-multiple-files-update} needs.
+* Sample Include File:: A sample outer file with included files
+ within it; and a sample included file.
+* Include Files Evolution:: How use of the @code{@@include} command
+ has changed over time.
+@end menu
+
+@node Using Include Files
+@section How to Use Include Files
+@findex include
+
+To include another file within a Texinfo file, write the
+@code{@@include} command at the beginning of a line and follow it on
+the same line by the name of a file to be included. For example:
+
+@example
+@@include buffers.texi
+@end example
+
+The name of the file is taken literally, with a single exception:
+@code{@@value@{@var{var}@}} references are expanded. This makes it
+possible to reliably include files in other directories in a
+distribution. @xref{verbatiminclude,,@code{@@verbatiminclude}}, for
+an example.
+
+An included file should simply be a segment of text that you expect to
+be included as is into the overall or @dfn{outer} Texinfo file; it
+should not contain the standard beginning and end parts of a Texinfo
+file. In particular, you should not start an included file with a
+line saying @samp{\input texinfo}; if you do, that phrase is inserted
+into the output file as is. Likewise, you should not end an included
+file with an @code{@@bye} command; nothing after @code{@@bye} is
+formatted.
+
+In the past, you were required to write an @code{@@setfilename} line at the
+beginning of an included file, but no longer. Now, it does not matter
+whether you write such a line. If an @code{@@setfilename} line exists
+in an included file, it is ignored.@refill
+
+Conventionally, an included file begins with an @code{@@node} line that
+is followed by an @code{@@chapter} line. Each included file is one
+chapter. This makes it easy to use the regular node and menu creating
+and updating commands to create the node pointers and menus within the
+included file. However, the simple Emacs node and menu creating and
+updating commands do not work with multiple Texinfo files. Thus you
+cannot use these commands to fill in the `Next', `Previous', and `Up'
+pointers of the @code{@@node} line that begins the included file. Also,
+you cannot use the regular commands to create a master menu for the
+whole file. Either you must insert the menus and the `Next',
+`Previous', and `Up' pointers by hand, or you must use the GNU Emacs
+Texinfo mode command, @code{texinfo-multiple-files-update}, that is
+designed for @code{@@include} files.@refill
+
+When an included file does not have any node lines in it, the
+multiple files update command does not try to create a menu entry
+for it. Consequently, you can include any file, such as a
+version or an update file without node lines, not just files that
+are chapters. Small includable files like this are created by
+Automake (@pxref{GNU Sample Texts}).
+
+
+@node texinfo-multiple-files-update
+@section @code{texinfo-multiple-files-update}
+@findex texinfo-multiple-files-update
+
+GNU Emacs Texinfo mode provides the @code{texinfo-multiple-files-update}
+command. This command creates or updates `Next', `Previous', and `Up'
+pointers of included files as well as those in the outer or overall
+Texinfo file, and it creates or updates a main menu in the outer file.
+Depending whether you call it with optional arguments, the command
+updates only the pointers in the first @code{@@node} line of the
+included files or all of them:@refill
+
+@table @kbd
+@item M-x texinfo-multiple-files-update
+Called without any arguments:@refill
+
+@itemize @minus
+@item
+Create or update the `Next', `Previous', and `Up' pointers of the
+first @code{@@node} line in each file included in an outer or overall
+Texinfo file.@refill
+
+@item
+Create or update the `Top' level node pointers of the outer or
+overall file.@refill
+
+@item
+Create or update a main menu in the outer file.@refill
+@end itemize
+
+@item C-u M-x texinfo-multiple-files-update
+Called with @kbd{C-u} as a prefix argument:
+
+@itemize @minus{}
+@item
+Create or update pointers in the first @code{@@node} line in each
+included file.
+
+@item
+Create or update the `Top' level node pointers of the outer file.
+
+@item
+Create and insert a master menu in the outer file. The master menu
+is made from all the menus in all the included files.@refill
+@end itemize
+
+@item C-u 8 M-x texinfo-multiple-files-update
+Called with a numeric prefix argument, such as @kbd{C-u 8}:
+
+@itemize @minus
+@item
+Create or update @strong{all} the `Next', `Previous', and `Up' pointers
+of all the included files.@refill
+
+@item
+Create or update @strong{all} the menus of all the included
+files.@refill
+
+@item
+Create or update the `Top' level node pointers of the outer or
+overall file.@refill
+
+@item
+And then create a master menu in the outer file. This is similar to
+invoking @code{texinfo-master-menu} with an argument when you are
+working with just one file.@refill
+@end itemize
+@end table
+
+Note the use of the prefix argument in interactive use: with a regular
+prefix argument, just @w{@kbd{C-u}}, the
+@code{texinfo-multiple-files-update} command inserts a master menu;
+with a numeric prefix argument, such as @kbd{C-u 8}, the command
+updates @strong{every} pointer and menu in @strong{all} the files and then inserts a
+master menu.@refill
+
+
+@node Include Files Requirements
+@section Include Files Requirements
+@cindex Include files requirements
+@cindex Requirements for include files
+
+If you plan to use the @code{texinfo-multiple-files-update} command,
+the outer Texinfo file that lists included files within it should
+contain nothing but the beginning and end parts of a Texinfo file, and
+a number of @code{@@include} commands listing the included files. It
+should not even include indices, which should be listed in an included
+file of their own.@refill
+
+Moreover, each of the included files must contain exactly one highest
+level node (conventionally, @code{@@chapter} or equivalent),
+and this node must be the first node in the included file.
+Furthermore, each of these highest level nodes in each included file
+must be at the same hierarchical level in the file structure.
+Usually, each is an @code{@@chapter}, an @code{@@appendix}, or an
+@code{@@unnumbered} node. Thus, normally, each included file contains
+one, and only one, chapter or equivalent-level node.@refill
+
+The outer file should contain only @emph{one} node, the `Top' node. It
+should @emph{not} contain any nodes besides the single `Top' node. The
+@code{texinfo-multiple-files-update} command will not process
+them.@refill
+
+
+@node Sample Include File
+@section Sample File with @code{@@include}
+@cindex Sample @code{@@include} file
+@cindex Include file sample
+@cindex @code{@@include} file sample
+
+Here is an example of an outer Texinfo file with @code{@@include} files
+within it before running @code{texinfo-multiple-files-update}, which
+would insert a main or master menu:
+
+@example
+@group
+\input texinfo @@c -*-texinfo-*-
+@c %**start of header
+@@setfilename include-example.info
+@@settitle Include Example
+@c %**end of header
+@end group
+
+... @xref{Sample Texinfo Files}, for
+examples of the rest of the frontmatter ...
+
+@group
+@@ifnottex
+@@node Top
+@@top Include Example
+@@end ifnottex
+@end group
+
+@group
+@@include foo.texinfo
+@@include bar.texinfo
+@@include concept-index.texinfo
+@@bye
+@end group
+@end example
+
+An included file, such as @file{foo.texinfo}, might look like this:
+
+@example
+@group
+@@node First
+@@chapter First Chapter
+
+Contents of first chapter @dots{}
+@end group
+@end example
+
+The full contents of @file{concept-index.texinfo} might be as simple as this:
+
+@example
+@group
+@@node Concept Index
+@@unnumbered Concept Index
+
+@@printindex cp
+@end group
+@end example
+
+The outer Texinfo source file for @cite{The GNU Emacs Lisp Reference
+Manual} is named @file{elisp.texi}. This outer file contains a master
+menu with 417 entries and a list of 41 @code{@@include}
+files.
+
+
+@node Include Files Evolution
+@section Evolution of Include Files
+
+When Info was first created, it was customary to create many small
+Info files on one subject. Each Info file was formatted from its own
+Texinfo source file. This custom meant that Emacs did not need to
+make a large buffer to hold the whole of a large Info file when
+someone wanted information; instead, Emacs allocated just enough
+memory for the small Info file that contained the particular
+information sought. This way, Emacs could avoid wasting memory.@refill
+
+References from one file to another were made by referring to the file
+name as well as the node name. (@xref{Other Info Files, , Referring to
+Other Info Files}. Also, see @ref{Four and Five Arguments, ,
+@code{@@xref} with Four and Five Arguments}.)@refill
+
+Include files were designed primarily as a way to create a single,
+large printed manual out of several smaller Info files. In a printed
+manual, all the references were within the same document, so @TeX{}
+could automatically determine the references' page numbers. The Info
+formatting commands used include files only for creating joint
+indices; each of the individual Texinfo files had to be formatted for
+Info individually. (Each, therefore, required its own
+@code{@@setfilename} line.)@refill
+
+However, because large Info files are now split automatically, it is
+no longer necessary to keep them small.@refill
+
+Nowadays, multiple Texinfo files are used mostly for large documents,
+such as @cite{The GNU Emacs Lisp Reference Manual}, and for projects
+in which several different people write different sections of a
+document simultaneously.@refill
+
+In addition, the Info formatting commands have been extended to work
+with the @code{@@include} command so as to create a single large Info
+file that is split into smaller files if necessary. This means that
+you can write menus and cross references without naming the different
+Texinfo files.@refill
+
+
+@node Headings
+@appendix Page Headings
+@cindex Headings
+@cindex Footings
+@cindex Page numbering
+@cindex Page headings
+@cindex Formatting headings and footings
+
+Most printed manuals contain headings along the top of every page
+except the title and copyright pages. Some manuals also contain
+footings. (Headings and footings have no meaning to Info, which is
+not paginated.)@refill
+
+@menu
+* Headings Introduced:: Conventions for using page headings.
+* Heading Format:: Standard page heading formats.
+* Heading Choice:: How to specify the type of page heading.
+* Custom Headings:: How to create your own headings and footings.
+@end menu
+
+@node Headings Introduced
+@section Headings Introduced
+
+Texinfo provides standard page heading formats for manuals that are
+printed on one side of each sheet of paper and for manuals that are
+printed on both sides of the paper. Typically, you will use these
+formats, but you can specify your own format if you wish.@refill
+
+In addition, you can specify whether chapters should begin on a new
+page, or merely continue the same page as the previous chapter; and if
+chapters begin on new pages, you can specify whether they must be
+odd-numbered pages.@refill
+
+By convention, a book is printed on both sides of each sheet of paper.
+When you open a book, the right-hand page is odd-numbered, and
+chapters begin on right-hand pages---a preceding left-hand page is
+left blank if necessary. Reports, however, are often printed on just
+one side of paper, and chapters begin on a fresh page immediately
+following the end of the preceding chapter. In short or informal
+reports, chapters often do not begin on a new page at all, but are
+separated from the preceding text by a small amount of whitespace.@refill
+
+The @code{@@setchapternewpage} command controls whether chapters begin
+on new pages, and whether one of the standard heading formats is used.
+In addition, Texinfo has several heading and footing commands that you
+can use to generate your own heading and footing formats.@refill
+
+In Texinfo, headings and footings are single lines at the tops and
+bottoms of pages; you cannot create multiline headings or footings.
+Each header or footer line is divided into three parts: a left part, a
+middle part, and a right part. Any part, or a whole line, may be left
+blank. Text for the left part of a header or footer line is set
+flushleft; text for the middle part is centered; and, text for the
+right part is set flushright.@refill
+
+@node Heading Format
+@comment node-name, next, previous, up
+@section Standard Heading Formats
+
+Texinfo provides two standard heading formats, one for manuals printed
+on one side of each sheet of paper, and the other for manuals printed
+on both sides of the paper.
+
+By default, nothing is specified for the footing of a Texinfo file,
+so the footing remains blank.@refill
+
+The standard format for single-sided printing consists of a header
+line in which the left-hand part contains the name of the chapter, the
+central part is blank, and the right-hand part contains the page
+number.@refill
+
+@need 950
+A single-sided page looks like this:
+
+@example
+@group
+ _______________________
+ | |
+ | chapter page number |
+ | |
+ | Start of text ... |
+ | ... |
+ | |
+@end group
+@end example
+
+The standard format for two-sided printing depends on whether the page
+number is even or odd. By convention, even-numbered pages are on the
+left- and odd-numbered pages are on the right. (@TeX{} will adjust the
+widths of the left- and right-hand margins. Usually, widths are
+correct, but during double-sided printing, it is wise to check that
+pages will bind properly---sometimes a printer will produce output in
+which the even-numbered pages have a larger right-hand margin than the
+odd-numbered pages.)@refill
+
+In the standard double-sided format, the left part of the left-hand
+(even-numbered) page contains the page number, the central part is
+blank, and the right part contains the title (specified by the
+@code{@@settitle} command). The left part of the right-hand
+(odd-numbered) page contains the name of the chapter, the central part
+is blank, and the right part contains the page number.@refill
+
+@need 750
+Two pages, side by side as in an open book, look like this:@refill
+
+@example
+@group
+ _______________________ _______________________
+ | | | |
+ | page number title | | chapter page number |
+ | | | |
+ | Start of text ... | | More text ... |
+ | ... | | ... |
+ | | | |
+@end group
+@end example
+
+@noindent
+The chapter name is preceded by the word ``Chapter'', the chapter number
+and a colon. This makes it easier to keep track of where you are in the
+manual.@refill
+
+@node Heading Choice
+@comment node-name, next, previous, up
+@section Specifying the Type of Heading
+
+@TeX{} does not begin to generate page headings for a standard Texinfo
+file until it reaches the @code{@@end titlepage} command. Thus, the
+title and copyright pages are not numbered. The @code{@@end
+titlepage} command causes @TeX{} to begin to generate page headings
+according to a standard format specified by the
+@code{@@setchapternewpage} command that precedes the
+@code{@@titlepage} section.@refill
+
+@need 1000
+There are four possibilities:@refill
+
+@table @asis
+@item No @code{@@setchapternewpage} command
+Cause @TeX{} to specify the single-sided heading format, with chapters
+on new pages. This is the same as @code{@@setchapternewpage on}.@refill
+
+@item @code{@@setchapternewpage on}
+Specify the single-sided heading format, with chapters on new pages.@refill
+
+@item @code{@@setchapternewpage off}
+Cause @TeX{} to start a new chapter on the same page as the last page of
+the preceding chapter, after skipping some vertical whitespace. Also
+cause @TeX{} to typeset for single-sided printing. (You can override
+the headers format with the @code{@@headings double} command; see
+@ref{headings on off, , The @code{@@headings} Command}.)@refill
+
+@item @code{@@setchapternewpage odd}
+Specify the double-sided heading format, with chapters on new pages.@refill
+@end table
+
+@noindent
+Texinfo lacks an @code{@@setchapternewpage even} command.@refill
+
+@node Custom Headings
+@comment node-name, next, previous, up
+@section How to Make Your Own Headings
+
+You can use the standard headings provided with Texinfo or specify
+your own. By default, Texinfo has no footers, so if you specify them,
+the available page size for the main text will be slightly reduced.
+
+Texinfo provides six commands for specifying headings and
+footings:
+@itemize @bullet
+@item
+@code{@@everyheading} @code{@@everyfooting} generate page headers and
+footers that are the same for both even- and odd-numbered pages.
+@item
+@code{@@evenheading} and @code{@@evenfooting} command generate headers
+and footers for even-numbered (left-hand) pages.
+@item
+@code{@@oddheading} and @code{@@oddfooting} generate headers and footers
+for odd-numbered (right-hand) pages.
+@end itemize
+
+Write custom heading specifications in the Texinfo file immediately
+after the @code{@@end titlepage} command.
+You must cancel the predefined heading commands with the
+@code{@@headings off} command before defining your own
+specifications.@refill
+
+@need 1000
+Here is how to tell @TeX{} to place the chapter name at the left, the
+page number in the center, and the date at the right of every header
+for both even- and odd-numbered pages:@refill
+
+@example
+@group
+@@headings off
+@@everyheading @@thischapter @@| @@thispage @@| @@today@{@}
+@end group
+@end example
+
+@noindent
+You need to divide the left part from the central part and the central
+part from the right part by inserting @samp{@@|} between parts.
+Otherwise, the specification command will not be able to tell where
+the text for one part ends and the next part begins.@refill
+
+Each part can contain text or @@-commands. The text
+is printed as if the part were within an ordinary paragraph in the
+body of the page. The @@-commands replace
+themselves with the page number, date, chapter name, or
+whatever.@refill
+
+@need 950
+Here are the six heading and footing commands:@refill
+
+@findex everyheading
+@findex everyfooting
+@table @code
+@item @@everyheading @var{left} @@| @var{center} @@| @var{right}
+@itemx @@everyfooting @var{left} @@| @var{center} @@| @var{right}
+
+The `every' commands specify the format for both even- and odd-numbered
+pages. These commands are for documents that are printed on one side
+of each sheet of paper, or for documents in which you want symmetrical
+headers or footers.@refill
+
+@findex evenheading
+@findex evenfooting
+@findex oddheading
+@findex oddfooting
+@item @@evenheading @var{left} @@| @var{center} @@| @var{right}
+@itemx @@oddheading @var{left} @@| @var{center} @@| @var{right}
+@itemx @@evenfooting @var{left} @@| @var{center} @@| @var{right}
+@itemx @@oddfooting @var{left} @@| @var{center} @@| @var{right}
+
+The `even' and `odd' commands specify the format for even-numbered
+pages and odd-numbered pages. These commands are for books and
+manuals that are printed on both sides of each sheet of paper.
+@end table
+
+Use the @samp{@@this@dots{}} series of @@-commands to
+provide the names of chapters
+and sections and the page number. You can use the
+@samp{@@this@dots{}} commands in the left, center, or right portions
+of headers and footers, or anywhere else in a Texinfo file so long as
+they are between @code{@@iftex} and @code{@@end iftex} commands.@refill
+
+@need 1000
+Here are the @samp{@@this@dots{}} commands:@refill
+
+@table @code
+@findex thispage
+@item @@thispage
+Expands to the current page number.@refill
+@c !!! Karl Berry says that `thissection' can fail on page breaks.
+@ignore
+@item @@thissection
+Expands to the name of the current section.@refill
+@end ignore
+
+@findex thischaptername
+@item @@thischaptername
+Expands to the name of the current chapter.@refill
+
+@findex thischapter
+@item @@thischapter
+Expands to the number and name of the current
+chapter, in the format `Chapter 1: Title'.@refill
+
+@findex thistitle
+@item @@thistitle
+Expands to the name of the document, as specified by the
+@code{@@settitle} command.@refill
+
+@findex thisfile
+@item @@thisfile
+For @code{@@include} files only: expands to the name of the current
+@code{@@include} file. If the current Texinfo source file is not an
+@code{@@include} file, this command has no effect. This command does
+@emph{not} provide the name of the current Texinfo source file unless
+it is an @code{@@include} file. (@xref{Include Files}, for more
+information about @code{@@include} files.)@refill
+@end table
+
+@noindent
+You can also use the @code{@@today@{@}} command, which expands to the
+current date, in `1 Jan 1900' format.@refill
+@findex today
+
+Other @@-commands and text are printed in a header or footer just as
+if they were in the body of a page. It is useful to incorporate text,
+particularly when you are writing drafts:@refill
+
+@example
+@group
+@@headings off
+@@everyheading @@emph@{Draft!@} @@| @@thispage @@| @@thischapter
+@@everyfooting @@| @@| Version: 0.27: @@today@{@}
+@end group
+@end example
+
+Beware of overlong titles: they may overlap another part of the
+header or footer and blot it out.@refill
+
+
+@node Catching Mistakes
+@appendix Formatting Mistakes
+@cindex Structure, catching mistakes in
+@cindex Nodes, catching mistakes
+@cindex Catching mistakes
+@cindex Correcting mistakes
+@cindex Mistakes, catching
+@cindex Problems, catching
+@cindex Debugging the Texinfo structure
+
+Besides mistakes in the content of your documentation, there are two
+kinds of mistake you can make with Texinfo: you can make mistakes with
+@@-commands, and you can make mistakes with the structure of the nodes
+and chapters.
+
+Emacs has two tools for catching the @@-command mistakes and two for
+catching structuring mistakes.@refill
+
+For finding problems with @@-commands, you can run @TeX{} or a region
+formatting command on the region that has a problem; indeed, you can
+run these commands on each region as you write it.@refill
+
+For finding problems with the structure of nodes and chapters, you can use
+@kbd{C-c C-s} (@code{texinfo-show-structure}) and the related @code{occur}
+command and you can use the @kbd{M-x Info-validate} command.@refill
+
+@menu
+* makeinfo Preferred:: @code{makeinfo} finds errors.
+* Debugging with Info:: How to catch errors with Info formatting.
+* Debugging with TeX:: How to catch errors with @TeX{} formatting.
+* Using texinfo-show-structure:: How to use @code{texinfo-show-structure}.
+* Using occur:: How to list all lines containing a pattern.
+* Running Info-Validate:: How to find badly referenced nodes.
+@end menu
+
+
+@node makeinfo Preferred
+@section @code{makeinfo} Find Errors
+
+The @code{makeinfo} program does an excellent job of catching errors
+and reporting them---far better than @code{texinfo-format-region} or
+@code{texinfo-format-buffer}. In addition, the various functions for
+automatically creating and updating node pointers and menus remove
+many opportunities for human error.@refill
+
+If you can, use the updating commands to create and insert pointers
+and menus. These prevent many errors. Then use @code{makeinfo} (or
+its Texinfo mode manifestations, @code{makeinfo-region} and
+@code{makeinfo-buffer}) to format your file and check for other
+errors. This is the best way to work with Texinfo. But if you
+cannot use @code{makeinfo}, or your problem is very puzzling, then you
+may want to use the tools described in this appendix.@refill
+
+@node Debugging with Info
+@comment node-name, next, previous, up
+@section Catching Errors with Info Formatting
+@cindex Catching errors with Info formatting
+@cindex Debugging with Info formatting
+
+After you have written part of a Texinfo file, you can use the
+@code{texinfo-format-region} or the @code{makeinfo-region} command to
+see whether the region formats properly.@refill
+
+Most likely, however, you are reading this section because for some
+reason you cannot use the @code{makeinfo-region} command; therefore, the
+rest of this section presumes that you are using
+@code{texinfo-format-region}.@refill
+
+If you have made a mistake with an @@-command,
+@code{texinfo-format-region} will stop processing at or after the
+error and display an error message. To see where in the buffer the
+error occurred, switch to the @samp{*Info Region*} buffer; the cursor
+will be in a position that is after the location of the error. Also,
+the text will not be formatted after the place where the error
+occurred (or more precisely, where it was detected).@refill
+
+For example, if you accidentally end a menu with the command @code{@@end
+menus} with an `s' on the end, instead of with @code{@@end menu}, you
+will see an error message that says:@refill
+
+@example
+@@end menus is not handled by texinfo
+@end example
+
+@noindent
+The cursor will stop at the point in the buffer where the error
+occurs, or not long after it. The buffer will look like this:@refill
+
+@example
+@group
+---------- Buffer: *Info Region* ----------
+* Menu:
+
+* Using texinfo-show-structure:: How to use
+ `texinfo-show-structure'
+ to catch mistakes.
+* Running Info-Validate:: How to check for
+ unreferenced nodes.
+@@end menus
+@point{}
+---------- Buffer: *Info Region* ----------
+@end group
+@end example
+
+The @code{texinfo-format-region} command sometimes provides slightly
+odd error messages. For example, the following cross reference fails to format:@refill
+
+@example
+(@@xref@{Catching Mistakes, for more info.)
+@end example
+
+@noindent
+In this case, @code{texinfo-format-region} detects the missing closing
+brace but displays a message that says @samp{Unbalanced parentheses}
+rather than @samp{Unbalanced braces}. This is because the formatting
+command looks for mismatches between braces as if they were
+parentheses.@refill
+
+Sometimes @code{texinfo-format-region} fails to detect mistakes. For
+example, in the following, the closing brace is swapped with the
+closing parenthesis:@refill
+
+@example
+(@@xref@{Catching Mistakes), for more info.@}
+@end example
+
+@noindent
+Formatting produces:
+@example
+(*Note for more info.: Catching Mistakes)
+@end example
+
+The only way for you to detect this error is to realize that the
+reference should have looked like this:@refill
+
+@example
+(*Note Catching Mistakes::, for more info.)
+@end example
+
+Incidentally, if you are reading this node in Info and type @kbd{f
+@key{RET}} (@code{Info-follow-reference}), you will generate an error
+message that says:
+
+@example
+No such node: "Catching Mistakes) The only way @dots{}
+@end example
+
+@noindent
+This is because Info perceives the example of the error as the first
+cross reference in this node and if you type a @key{RET} immediately
+after typing the Info @kbd{f} command, Info will attempt to go to the
+referenced node. If you type @kbd{f catch @key{TAB} @key{RET}}, Info
+will complete the node name of the correctly written example and take
+you to the `Catching Mistakes' node. (If you try this, you can return
+from the `Catching Mistakes' node by typing @kbd{l}
+(@code{Info-last}).)
+
+@c !!! section on using Elisp debugger ignored.
+@ignore
+Sometimes @code{texinfo-format-region} will stop long after the
+original error; this is because it does not discover the problem until
+then. In this case, you will need to backtrack.@refill
+
+@c menu
+@c * Using the Emacs Lisp Debugger:: How to use the Emacs Lisp debugger.
+@c end menu
+
+@c node Using the Emacs Lisp Debugger
+@c appendixsubsec Using the Emacs Lisp Debugger
+@c index Using the Emacs Lisp debugger
+@c index Emacs Lisp debugger
+@c index Debugger, using the Emacs Lisp
+
+If an error is especially elusive, you can turn on the Emacs Lisp
+debugger and look at the backtrace; this tells you where in the
+@code{texinfo-format-region} function the problem occurred. You can
+turn on the debugger with the command:@refill
+
+@example
+M-x set-variable @key{RET} debug-on-error @key{RET} t @key{RET}
+@end example
+
+@noindent
+and turn it off with
+
+@example
+M-x set-variable @key{RET} debug-on-error @key{RET} nil @key{RET}
+@end example
+
+Often, when you are using the debugger, it is easier to follow what is
+going on if you use the Emacs Lisp files that are not byte-compiled.
+The byte-compiled sources send octal numbers to the debugger that may
+look mysterious. To use the uncompiled source files, load
+@file{texinfmt.el} and @file{texinfo.el} with the @kbd{M-x load-file}
+command.@refill
+
+The debugger will not catch an error if @code{texinfo-format-region}
+does not detect one. In the example shown above,
+@code{texinfo-format-region} did not find the error when the whole
+list was formatted, but only when part of the list was formatted.
+When @code{texinfo-format-region} did not find an error, the debugger
+did not find one either. @refill
+
+However, when @code{texinfo-format-region} did report an error, it
+invoked the debugger. This is the backtrace it produced:@refill
+
+@example
+---------- Buffer: *Backtrace* ----------
+Signalling: (search-failed "[@},]")
+ re-search-forward("[@},]")
+ (while ...)
+ (let ...)
+ texinfo-format-parse-args()
+ (let ...)
+ texinfo-format-xref()
+ funcall(texinfo-format-xref)
+ (if ...)
+ (let ...)
+ (if ...)
+ (while ...)
+ texinfo-format-scan()
+ (save-excursion ...)
+ (let ...)
+ texinfo-format-region(103370 103631)
+* call-interactively(texinfo-format-region)
+---------- Buffer: *Backtrace* ----------
+@end example
+
+The backtrace is read from the bottom up.
+@code{texinfo-format-region} was called interactively; and it, in
+turn, called various functions, including @code{texinfo-format-scan},
+@code{texinfo-format-xref} and @code{texinfo-format-parse-args}.
+Inside the function @code{texinfo-format-parse-args}, the function
+@code{re-search-forward} was called; it was this function that could
+not find the missing right-hand brace.@refill
+
+@xref{Lisp Debug, , Debugging Emacs Lisp, emacs, The GNU Emacs
+Manual}, for more information.@refill
+@end ignore
+
+@node Debugging with TeX
+@comment node-name, next, previous, up
+@section Catching Errors with @TeX{} Formatting
+@cindex Catching errors with @TeX{} formatting
+@cindex Debugging with @TeX{} formatting
+
+You can also catch mistakes when you format a file with @TeX{}.@refill
+
+Usually, you will want to do this after you have run
+@code{texinfo-format-buffer} (or, better, @code{makeinfo-buffer}) on
+the same file, because @code{texinfo-format-buffer} sometimes displays
+error messages that make more sense than @TeX{}. (@xref{Debugging
+with Info}, for more information.)@refill
+
+For example, @TeX{} was run on a Texinfo file, part of which is shown
+here:@refill
+
+@example
+---------- Buffer: texinfo.texi ----------
+name of the Texinfo file as an extension. The
+@@samp@{??@} are `wildcards' that cause the shell to
+substitute all the raw index files. (@@xref@{sorting
+indices, for more information about sorting
+indices.)@@refill
+---------- Buffer: texinfo.texi ----------
+@end example
+
+@noindent
+(The cross reference lacks a closing brace.)
+@TeX{} produced the following output, after which it stopped:@refill
+
+@example
+---------- Buffer: *tex-shell* ----------
+Runaway argument?
+@{sorting indices, for more information about sorting
+indices.) @@refill @@ETC.
+! Paragraph ended before @@xref was complete.
+<to be read again>
+ @@par
+l.27
+
+?
+---------- Buffer: *tex-shell* ----------
+@end example
+
+In this case, @TeX{} produced an accurate and
+understandable error message:
+
+@example
+Paragraph ended before @@xref was complete.
+@end example
+
+@noindent
+@samp{@@par} is an internal @TeX{} command of no relevance to Texinfo.
+@samp{l.27} means that @TeX{} detected the problem on line 27 of the
+Texinfo file. The @samp{?} is the prompt @TeX{} uses in this
+circumstance.@refill
+
+Unfortunately, @TeX{} is not always so helpful, and sometimes you must
+truly be a Sherlock Holmes to discover what went wrong.@refill
+
+In any case, if you run into a problem like this, you can do one of three
+things.@refill
+
+@enumerate
+@item
+You can tell @TeX{} to continue running and ignore just this error by
+typing @key{RET} at the @samp{?} prompt.@refill
+
+@item
+You can tell @TeX{} to continue running and to ignore all errors as best
+it can by typing @kbd{r @key{RET}} at the @samp{?} prompt.@refill
+
+This is often the best thing to do. However, beware: the one error
+may produce a cascade of additional error messages as its consequences
+are felt through the rest of the file. To stop @TeX{} when it is
+producing such an avalanche of error messages, type @kbd{C-c} (or
+@kbd{C-c C-c}, if you are running a shell inside Emacs).
+
+@item
+You can tell @TeX{} to stop this run by typing @kbd{x @key{RET}}
+at the @samp{?} prompt.@refill
+@end enumerate
+
+If you are running @TeX{} inside Emacs, you need to switch to the shell
+buffer and line at which @TeX{} offers the @samp{?} prompt.
+
+Sometimes @TeX{} will format a file without producing error messages even
+though there is a problem. This usually occurs if a command is not ended
+but @TeX{} is able to continue processing anyhow. For example, if you fail
+to end an itemized list with the @code{@@end itemize} command, @TeX{} will
+write a DVI file that you can print out. The only error message that
+@TeX{} will give you is the somewhat mysterious comment that@refill
+
+@example
+(@@end occurred inside a group at level 1)
+@end example
+
+@noindent
+However, if you print the DVI file, you will find that the text
+of the file that follows the itemized list is entirely indented as if
+it were part of the last item in the itemized list. The error message
+is the way @TeX{} says that it expected to find an @code{@@end}
+command somewhere in the file; but that it could not determine where
+it was needed.@refill
+
+Another source of notoriously hard-to-find errors is a missing
+@code{@@end group} command. If you ever are stumped by
+incomprehensible errors, look for a missing @code{@@end group} command
+first.@refill
+
+If the Texinfo file lacks header lines,
+@TeX{} may stop in the
+beginning of its run and display output that looks like the following.
+The @samp{*} indicates that @TeX{} is waiting for input.@refill
+
+@example
+This is TeX, Version 3.14159 (Web2c 7.0)
+(test.texinfo [1])
+*
+@end example
+
+@noindent
+In this case, simply type @kbd{\end @key{RET}} after the asterisk. Then
+write the header lines in the Texinfo file and run the @TeX{} command
+again. (Note the use of the backslash, @samp{\}. @TeX{} uses @samp{\}
+instead of @samp{@@}; and in this circumstance, you are working
+directly with @TeX{}, not with Texinfo.)@refill
+
+@node Using texinfo-show-structure
+@comment node-name, next, previous, up
+@section Using @code{texinfo-show-structure}
+@cindex Showing the structure of a file
+@findex texinfo-show-structure
+
+It is not always easy to keep track of the nodes, chapters, sections, and
+subsections of a Texinfo file. This is especially true if you are revising
+or adding to a Texinfo file that someone else has written.@refill
+
+In GNU Emacs, in Texinfo mode, the @code{texinfo-show-structure}
+command lists all the lines that begin with the @@-commands that
+specify the structure: @code{@@chapter}, @code{@@section},
+@code{@@appendix}, and so on. With an argument (@w{@kbd{C-u}}
+as prefix argument, if interactive),
+the command also shows the @code{@@node} lines. The
+@code{texinfo-show-structure} command is bound to @kbd{C-c C-s} in
+Texinfo mode, by default.@refill
+
+The lines are displayed in a buffer called the @samp{*Occur*} buffer,
+indented by hierarchical level. For example, here is a part of what was
+produced by running @code{texinfo-show-structure} on this manual:@refill
+
+@example
+@group
+Lines matching "^@@\\(chapter \\|sect\\|subs\\|subh\\|
+unnum\\|major\\|chapheading \\|heading \\|appendix\\)"
+in buffer texinfo.texi.
+@dots{}
+4177:@@chapter Nodes
+4198: @@heading Two Paths
+4231: @@section Node and Menu Illustration
+4337: @@section The @@code@{@@@@node@} Command
+4393: @@subheading Choosing Node and Pointer Names
+4417: @@subsection How to Write an @@code@{@@@@node@} Line
+4469: @@subsection @@code@{@@@@node@} Line Tips
+@dots{}
+@end group
+@end example
+
+This says that lines 4337, 4393, and 4417 of @file{texinfo.texi} begin
+with the @code{@@section}, @code{@@subheading}, and @code{@@subsection}
+commands respectively. If you move your cursor into the @samp{*Occur*}
+window, you can position the cursor over one of the lines and use the
+@kbd{C-c C-c} command (@code{occur-mode-goto-occurrence}), to jump to
+the corresponding spot in the Texinfo file. @xref{Other Repeating
+Search, , Using Occur, emacs, The GNU Emacs Manual}, for more
+information about @code{occur-mode-goto-occurrence}.@refill
+
+The first line in the @samp{*Occur*} window describes the @dfn{regular
+expression} specified by @var{texinfo-heading-pattern}. This regular
+expression is the pattern that @code{texinfo-show-structure} looks for.
+@xref{Regexps, , Using Regular Expressions, emacs, The GNU Emacs Manual},
+for more information.@refill
+
+When you invoke the @code{texinfo-show-structure} command, Emacs will
+display the structure of the whole buffer. If you want to see the
+structure of just a part of the buffer, of one chapter, for example,
+use the @kbd{C-x n n} (@code{narrow-to-region}) command to mark the
+region. (@xref{Narrowing, , , emacs, The GNU Emacs Manual}.) This is
+how the example used above was generated. (To see the whole buffer
+again, use @kbd{C-x n w} (@code{widen}).)@refill
+
+If you call @code{texinfo-show-structure} with a prefix argument by
+typing @w{@kbd{C-u C-c C-s}}, it will list lines beginning with
+@code{@@node} as well as the lines beginning with the @@-sign commands
+for @code{@@chapter}, @code{@@section}, and the like.@refill
+
+You can remind yourself of the structure of a Texinfo file by looking at
+the list in the @samp{*Occur*} window; and if you have mis-named a node
+or left out a section, you can correct the mistake.@refill
+
+@node Using occur
+@comment node-name, next, previous, up
+@section Using @code{occur}
+@cindex Occurrences, listing with @code{@@occur}
+@findex occur
+
+Sometimes the @code{texinfo-show-structure} command produces too much
+information. Perhaps you want to remind yourself of the overall structure
+of a Texinfo file, and are overwhelmed by the detailed list produced by
+@code{texinfo-show-structure}. In this case, you can use the @code{occur}
+command directly. To do this, type@refill
+
+@example
+@kbd{M-x occur}
+@end example
+
+@noindent
+and then, when prompted, type a @dfn{regexp}, a regular expression for
+the pattern you want to match. (@xref{Regexps, , Regular Expressions,
+emacs, The GNU Emacs Manual}.) The @code{occur} command works from
+the current location of the cursor in the buffer to the end of the
+buffer. If you want to run @code{occur} on the whole buffer, place
+the cursor at the beginning of the buffer.@refill
+
+For example, to see all the lines that contain the word
+@samp{@@chapter} in them, just type @samp{@@chapter}. This will
+produce a list of the chapters. It will also list all the sentences
+with @samp{@@chapter} in the middle of the line.@refill
+
+If you want to see only those lines that start with the word
+@samp{@@chapter}, type @samp{^@@chapter} when prompted by
+@code{occur}. If you want to see all the lines that end with a word
+or phrase, end the last word with a @samp{$}; for example,
+@samp{catching mistakes$}. This can be helpful when you want to see
+all the nodes that are part of the same chapter or section and
+therefore have the same `Up' pointer.@refill
+
+@xref{Other Repeating Search, , Using Occur, emacs , The GNU Emacs Manual},
+for more information.@refill
+
+@node Running Info-Validate
+@comment node-name, next, previous, up
+@section Finding Badly Referenced Nodes
+@findex Info-validate
+@cindex Nodes, checking for badly referenced
+@cindex Checking for badly referenced nodes
+@cindex Looking for badly referenced nodes
+@cindex Finding badly referenced nodes
+@cindex Badly referenced nodes
+
+You can use the @code{Info-validate} command to check whether any of
+the `Next', `Previous', `Up' or other node pointers fail to point to a
+node. This command checks that every node pointer points to an
+existing node. The @code{Info-validate} command works only on Info
+files, not on Texinfo files.@refill
+
+The @code{makeinfo} program validates pointers automatically, so you
+do not need to use the @code{Info-validate} command if you are using
+@code{makeinfo}. You only may need to use @code{Info-validate} if you
+are unable to run @code{makeinfo} and instead must create an Info file
+using @code{texinfo-format-region} or @code{texinfo-format-buffer}, or
+if you write an Info file from scratch.@refill
+
+@menu
+* Using Info-validate:: How to run @code{Info-validate}.
+* Unsplit:: How to create an unsplit file.
+* Tagifying:: How to tagify a file.
+* Splitting:: How to split a file manually.
+@end menu
+
+@node Using Info-validate
+@subsection Running @code{Info-validate}
+@cindex Running @code{Info-validate}
+@cindex Info validating a large file
+@cindex Validating a large file
+
+To use @code{Info-validate}, visit the Info file you wish to check and
+type:@refill
+
+@example
+M-x Info-validate
+@end example
+
+@noindent
+Note that the @code{Info-validate} command requires an upper case
+`I'. You may also need to create a tag table before running
+@code{Info-validate}. @xref{Tagifying}.
+
+If your file is valid, you will receive a message that says ``File appears
+valid''. However, if you have a pointer that does not point to a node,
+error messages will be displayed in a buffer called @samp{*problems in
+info file*}.@refill
+
+For example, @code{Info-validate} was run on a test file that contained
+only the first node of this manual. One of the messages said:@refill
+
+@example
+In node "Overview", invalid Next: Texinfo Mode
+@end example
+
+@noindent
+This meant that the node called @samp{Overview} had a `Next' pointer that
+did not point to anything (which was true in this case, since the test file
+had only one node in it).@refill
+
+Now suppose we add a node named @samp{Texinfo Mode} to our test case
+but we do not specify a `Previous' for this node. Then we will get
+the following error message:@refill
+
+@example
+In node "Texinfo Mode", should have Previous: Overview
+@end example
+
+@noindent
+This is because every `Next' pointer should be matched by a
+`Previous' (in the node where the `Next' points) which points back.@refill
+
+@code{Info-validate} also checks that all menu entries and cross references
+point to actual nodes.@refill
+
+@code{Info-validate} requires a tag table and does not work with files
+that have been split. (The @code{texinfo-format-buffer} command
+automatically splits large files.) In order to use @code{Info-validate}
+on a large file, you must run @code{texinfo-format-buffer} with an
+argument so that it does not split the Info file; and you must create a
+tag table for the unsplit file.
+
+@node Unsplit
+@comment node-name, next, previous, up
+@subsection Creating an Unsplit File
+@cindex Creating an unsplit file
+@cindex Unsplit file creation
+
+You can run @code{Info-validate} only on a single Info file that has a
+tag table. The command will not work on the indirect subfiles that
+are generated when a master file is split. If you have a large file
+(longer than 300,000 bytes or so), you need to run the
+@code{texinfo-format-buffer} or @code{makeinfo-buffer} command in such
+a way that it does not create indirect subfiles. You will also need
+to create a tag table for the Info file. After you have done this,
+you can run @code{Info-validate} and look for badly referenced
+nodes.@refill
+
+The first step is to create an unsplit Info file. To prevent
+@code{texinfo-format-buffer} from splitting a Texinfo file into
+smaller Info files, give a prefix to the @kbd{M-x
+texinfo-format-buffer} command:@refill
+
+@example
+C-u M-x texinfo-format-buffer
+@end example
+
+@noindent
+or else
+
+@example
+C-u C-c C-e C-b
+@end example
+
+@noindent
+When you do this, Texinfo will not split the file and will not create
+a tag table for it. @refill
+@cindex Making a tag table manually
+@cindex Tag table, making manually
+
+@node Tagifying
+@subsection Tagifying a File
+
+After creating an unsplit Info file, you must create a tag table for
+it. Visit the Info file you wish to tagify and type:@refill
+
+@example
+M-x Info-tagify
+@end example
+
+@noindent
+(Note the upper case @samp{I} in @code{Info-tagify}.) This creates an
+Info file with a tag table that you can validate.@refill
+
+The third step is to validate the Info file:@refill
+
+@example
+M-x Info-validate
+@end example
+
+@noindent
+(Note the upper case @samp{I} in @code{Info-validate}.)
+In brief, the steps are:@refill
+
+@example
+@group
+C-u M-x texinfo-format-buffer
+M-x Info-tagify
+M-x Info-validate
+@end group
+@end example
+
+After you have validated the node structure, you can rerun
+@code{texinfo-format-buffer} in the normal way so it will construct a
+tag table and split the file automatically, or you can make the tag
+table and split the file manually.@refill
+
+@node Splitting
+@comment node-name, next, previous, up
+@subsection Splitting a File Manually
+@cindex Splitting an Info file manually
+@cindex Info file, splitting manually
+
+You should split a large file or else let the
+@code{texinfo-format-buffer} or @code{makeinfo-buffer} command do it
+for you automatically. (Generally you will let one of the formatting
+commands do this job for you. @xref{Creating an Info File}.)@refill
+
+The split-off files are called the indirect subfiles.@refill
+
+Info files are split to save memory. With smaller files, Emacs does not
+have make such a large buffer to hold the information.@refill
+
+If an Info file has more than 30 nodes, you should also make a tag
+table for it. @xref{Using Info-validate}, for information
+about creating a tag table. (Again, tag tables are usually created
+automatically by the formatting command; you only need to create a tag
+table yourself if you are doing the job manually. Most likely, you
+will do this for a large, unsplit file on which you have run
+@code{Info-validate}.)@refill
+
+@c Info-split is autoloaded in `loaddefs.el' in Emacs 18.51
+@ignore
+Before running @code{Info-split}, you need to load the @code{info} library
+into Emacs by giving the command @kbd{M-x load-library @key{RET} info
+@key{RET}}.
+@end ignore
+
+Visit the Info file you wish to tagify and split and type the two
+commands:@refill
+
+@example
+M-x Info-tagify
+M-x Info-split
+@end example
+
+@noindent
+(Note that the @samp{I} in @samp{Info} is upper case.)@refill
+
+When you use the @code{Info-split} command, the buffer is modified into a
+(small) Info file which lists the indirect subfiles. This file should be
+saved in place of the original visited file. The indirect subfiles are
+written in the same directory the original file is in, with names generated
+by appending @samp{-} and a number to the original file name.@refill
+
+The primary file still functions as an Info file, but it contains just
+the tag table and a directory of subfiles.@refill
+
+
+@ignore
+The simple description in the command summary seems sufficient to me
+these days, so ignore this appendix. --karl, 13mar04.
+
+@node Refilling Paragraphs
+@appendix Refilling Paragraphs
+@cindex Refilling paragraphs
+@cindex Filling paragraphs
+@cindex Paragraphs, filling
+@findex refill
+
+The @code{@@refill} command refills and, optionally, indents the first
+line of a paragraph.@footnote{Perhaps the command should have been
+called the @code{@@refillandindent} command, but @code{@@refill} is
+shorter and the name was chosen before indenting was possible.} The
+@code{@@refill} command is no longer important, but we describe it here
+because you once needed it. You will see it in many old Texinfo
+files.@refill
+
+Without refilling, paragraphs containing long @@-constructs may look
+bad after formatting because the formatter removes @@-commands and
+shortens some lines more than others. In the past, neither the
+@code{texinfo-format-region} command nor the
+@code{texinfo-format-buffer} command refilled paragraphs
+automatically. The @code{@@refill} command had to be written at the
+end of every paragraph to cause these formatters to fill them. (Both
+@TeX{} and @code{makeinfo} have always refilled paragraphs
+automatically.) Now, all the Info formatters automatically fill and
+indent those paragraphs that need to be filled and indented.@refill
+
+The @code{@@refill} command causes @code{texinfo-format-region} and
+@code{texinfo-format-buffer} to refill a paragraph in the Info file
+@emph{after} all the other processing has been done. For this reason,
+you can not use @code{@@refill} with a paragraph containing either
+@code{@@*} or @code{@@w@{ @dots{} @}} since the refilling action will
+override those two commands.@refill
+
+The @code{texinfo-format-region} and @code{texinfo-format-buffer}
+commands now automatically append @code{@@refill} to the end of each
+paragraph that should be filled. They do not append @code{@@refill} to
+the ends of paragraphs that contain @code{@@*} or @w{@code{@@w@{ @dots{}@}}}
+and therefore do not refill or indent them.@refill
+
+@end ignore
+
+
+@c These are no longer ``new'', and the explanations
+@c are all given elsewhere anyway, I think. --karl, 25apr97.
+@c So ignore the entire appendix.
+@ignore
+@c node New Features, Command and Variable Index, Obtaining TeX, Top
+@c appendix Second Edition Features
+
+@tex
+% Widen the space for the first column so three control-character
+% strings fit in the first column. Switched back to default .8in
+% value at end of chapter.
+\global\tableindent=1.0in
+@end tex
+
+The second edition of the Texinfo manual describes more than 20 new
+Texinfo mode commands and more than 50 previously undocumented Texinfo
+@@-commands. This edition is more than twice the length of the first
+edition.@refill
+
+Here is a brief description of the new commands.@refill
+
+@c menu
+* New Texinfo Mode Commands:: The updating commands are especially useful.
+* New Commands:: Many newly described @@-commands.
+@c end menu
+
+@c node New Texinfo Mode Commands, New Commands, Obtaining TeX, Obtaining TeX
+@c appendixsec New Texinfo Mode Commands
+
+Texinfo mode provides commands and features especially designed for
+working with Texinfo files. More than 20 new commands have been
+added, including commands for automatically creating and updating
+both nodes and menus. This is a tedious task when done by hand.@refill
+
+The keybindings are intended to be somewhat mnemonic.@refill
+
+@c subheading Update all nodes and menus
+
+The @code{texinfo-master-menu} command is the primary command:
+
+@table @kbd
+@item C-c C-u m
+@itemx M-x texinfo-master-menu
+Create or update a master menu.
+With @kbd{C-u} as a prefix argument,
+first create or update all nodes
+and regular menus.
+@end table
+
+@c subheading Update Pointers
+
+@noindent
+Create or update `Next', `Previous', and `Up' node pointers.@refill
+
+@noindent
+@xref{Updating Nodes and Menus}.
+
+@table @kbd
+@item C-c C-u C-n
+@itemx M-x texinfo-update-node
+Update a node.
+
+@item C-c C-u C-e
+@itemx M-x texinfo-every-node-update
+Update every node in the buffer.
+@end table
+
+@c subheading Update Menus
+
+@noindent
+Create or update menus.@refill
+
+@noindent
+@xref{Updating Nodes and Menus}.
+
+@table @kbd
+@item C-c C-u C-m
+@itemx M-x texinfo-make-menu
+Make or update a menu.
+
+@item C-c C-u C-a
+@itemx M-x texinfo-all-menus-update
+Make or update all the menus in a buffer.
+With @kbd{C-u} as a prefix argument,
+first update all the nodes.
+@end table
+
+@c subheading Insert Title as Description
+
+@noindent
+Insert a node's chapter or section title in the space for the
+description in a menu entry line; position point so you can edit the
+insert. (This command works somewhat differently than the other
+insertion commands, which insert only a predefined string.)@refill
+
+@noindent
+@xref{Inserting, Inserting Frequently Used Commands}.
+
+@table @kbd
+@item C-c C-c C-d
+Insert title.
+@end table
+
+@c subheading Format for Info
+
+@noindent
+Provide keybindings both for the Info formatting commands that are
+written in Emacs Lisp and for @code{makeinfo} that is written in
+C.@refill
+
+@noindent
+@xref{Info Formatting}.
+
+@noindent
+Use the Emacs lisp @code{texinfo-format@dots{}} commands:
+
+@table @kbd
+@item C-c C-e C-r
+Format the region.
+
+@item C-c C-e C-b
+Format the buffer.
+@end table
+
+@noindent
+Use @code{makeinfo}:
+
+@table @kbd
+@item C-c C-m C-r
+Format the region.
+
+@item C-c C-m C-b
+Format the buffer.
+
+@item C-c C-m C-l
+Recenter the @code{makeinfo} output buffer.
+
+@item C-c C-m C-k
+Kill the @code{makeinfo} formatting job.
+@end table
+
+@c subheading Typeset and Print
+
+@noindent
+Typeset and print Texinfo documents from within Emacs.
+
+@noindent
+@xref{Printing}.
+
+@table @kbd
+@item C-c C-t C-b
+Run @code{texi2dvi} on the buffer.
+
+@item C-c C-t C-r
+Run @TeX{} on the region.
+
+@item C-c C-t C-i
+Run @code{texindex}.
+
+@item C-c C-t C-p
+Print the DVI file.
+
+@item C-c C-t C-q
+Show the print queue.
+
+@item C-c C-t C-d
+Delete a job from the print queue.
+
+@item C-c C-t C-k
+Kill the current @TeX{} formatting job.
+
+@item C-c C-t C-x
+Quit a currently stopped @TeX{} formatting job.
+
+@item C-c C-t C-l
+Recenter the output buffer.
+@end table
+
+@c subheading Other Updating Commands
+
+@noindent
+The ``other updating commands'' do not have standard keybindings because
+they are used less frequently.@refill
+
+@noindent
+@xref{Other Updating Commands}.
+
+@table @kbd
+@item M-x texinfo-insert-node-lines
+Insert missing @code{@@node} lines using
+section titles as node names.
+
+@item M-x texinfo-multiple-files-update
+Update a multi-file document.
+With a numeric prefix, such as @kbd{C-u 8},
+update @strong{every} pointer and
+menu in @strong{all} the files and
+then insert a master menu.
+
+@item M-x texinfo-indent-menu-description
+Indent descriptions in menus.
+
+@item M-x texinfo-sequential-node-update
+Insert node pointers in strict sequence.
+@end table
+
+@c no.de New Commands, , New Texinfo Mode Commands, Obtaining TeX
+@c appendix.sec New Texinfo @@-Commands
+
+The second edition of the Texinfo manual describes more than 50
+commands that were not described in the first edition. A third or so
+of these commands existed in Texinfo but were not documented in the
+manual; the others are new. Here is a listing, with brief
+descriptions of them:@refill
+
+@c subheading Indexing
+
+@noindent
+Create your own index, and merge indices.@refill
+
+@noindent
+@xref{Indices}.
+
+@table @kbd
+@item @@defindex @var{index-name}
+Define a new index and its indexing command.
+See also the @code{@@defcodeindex} command.
+
+@c written verbosely to avoid overfull hbox
+@item @@synindex @var{from-index} @var{into-index}
+Merge the @var{from-index} index into the @var{into-index} index.
+See also the @code{@@syncodeindex} command.
+@end table
+
+@c subheading Definitions
+
+@noindent
+Describe functions, variables, macros,
+commands, user options, special forms, and other such artifacts in a
+uniform format.@refill
+
+@noindent
+@xref{Definition Commands}.
+
+@table @kbd
+@item @@deffn @var{category} @var{name} @var{arguments}@dots{}
+Format a description for functions, interactive
+commands, and similar entities.
+
+@item @@defvr, @@defop, @dots{}
+15 other related commands.
+@end table
+
+@c subheading Glyphs
+
+@noindent
+Indicate the results of evaluation, expansion,
+printed output, an error message, equivalence of expressions, and the
+location of point.@refill
+
+@noindent
+@xref{Glyphs}.
+
+@table @kbd
+@item @@equiv@{@}
+@itemx @equiv{}
+Equivalence:
+
+@item @@error@{@}
+@itemx @error{}
+Error message
+
+@item @@expansion@{@}
+@itemx @expansion{}
+Macro expansion
+
+@item @@point@{@}
+@itemx @point{}
+Position of point
+
+@item @@print@{@}
+@itemx @print{}
+Printed output
+
+@item @@result@{@}
+@itemx @result{}
+Result of an expression
+@end table
+
+@c subheading Page Headings
+
+@noindent
+Customize page headings.
+
+@noindent
+@xref{Headings}.
+
+@table @kbd
+@item @@headings @var{on-off-single-double}
+Headings on or off, single, or double-sided.
+
+@item @@evenfooting [@var{left}] @@| [@var{center}] @@| [@var{right}]
+Footings for even-numbered (left-hand) pages.
+
+@item @@evenheading, @@everyheading, @@oddheading, @dots{}
+Five other related commands.
+
+@item @@thischapter
+Insert name of chapter and chapter number.
+
+@item @@thischaptername, @@thisfile, @@thistitle, @@thispage
+Related commands.
+@end table
+
+@c subheading Formatting
+
+@noindent
+Format blocks of text.
+
+@noindent
+@xref{Quotations and Examples}, and@*
+@ref{Lists and Tables, , Making Lists and Tables}.
+
+@table @kbd
+@item @@cartouche
+Draw rounded box surrounding text (no effect in Info).
+
+@item @@enumerate @var{optional-arg}
+Enumerate a list with letters or numbers.
+
+@item @@exdent @var{line-of-text}
+Remove indentation.
+
+@item @@flushleft
+Left justify.
+
+@item @@flushright
+Right justify.
+
+@item @@format
+Do not narrow nor change font.
+
+@item @@ftable @var{formatting-command}
+@itemx @@vtable @var{formatting-command}
+Two-column table with indexing.
+
+@item @@lisp
+For an example of Lisp code.
+
+@item @@smallexample
+@itemx @@smalllisp
+Like @@table and @@lisp, but for (originally) @@smallbook.
+@end table
+
+@c subheading Conditionals
+
+@noindent
+Conditionally format text.
+
+@noindent
+@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill
+
+@table @kbd
+@item @@set @var{flag} [@var{string}]
+Set a flag. Optionally, set value
+of @var{flag} to @var{string}.
+
+@item @@clear @var{flag}
+Clear a flag.
+
+@item @@value@{@var{flag}@}
+Replace with value to which @var{flag} is set.
+
+@item @@ifset @var{flag}
+Format, if @var{flag} is set.
+
+@item @@ifclear @var{flag}
+Ignore, if @var{flag} is set.
+@end table
+
+@c subheading @@heading series for Titles
+
+@noindent
+Produce unnumbered headings that do not appear in a table of contents.
+
+@noindent
+@xref{Structuring}.
+
+@table @kbd
+@item @@heading @var{title}
+Unnumbered section-like heading not listed
+in the table of contents of a printed manual.
+
+@item @@chapheading, @@majorheading, @@c subheading, @@subsubheading
+Related commands.
+@end table
+
+@need 1000
+@c subheading Font commands
+
+@need 1000
+@noindent
+@xref{Smallcaps}, and @*
+@ref{Fonts}.
+
+@table @kbd
+@item @@r@{@var{text}@}
+Print in roman font.
+
+@item @@sc@{@var{text}@}
+Print in @sc{small caps} font.
+@end table
+
+@c subheading Miscellaneous
+
+@noindent
+See @ref{title subtitle author, , @code{@@title} @code{@@subtitle} and @code{@@author} Commands},@*
+see @ref{Customized Highlighting},@*
+see @ref{Overfull hboxes},@*
+see @ref{Footnotes},@*
+see @ref{dmn, , Format a Dimension},@*
+see @ref{Raise/lower sections, , @code{@@raisesections} and @code{@@lowersections}},@*
+see @ref{math, , @code{@@math}: Inserting Mathematical Expressions}.@*
+see @ref{minus, , Inserting a Minus Sign},@*
+see @ref{paragraphindent, , Paragraph Indenting},@*
+see @ref{Cross Reference Commands},@*
+see @ref{title subtitle author, , @code{@@title} @code{@@subtitle} and @code{@@author}}, and@*
+see @ref{Custom Headings, , How to Make Your Own Headings}.
+
+@table @kbd
+@item @@author @var{author}
+Typeset author's name.
+
+@c @item @@definfoenclose @var{new-command}, @var{before}, @var{after},
+@c Define a highlighting command for Info. (Info only.)
+
+@item @@finalout
+Produce cleaner printed output.
+
+@item @@footnotestyle @var{end-or-separate}
+Specify footnote style.
+
+@item @@dmn@{@var{dimension}@}
+Format a dimension.
+
+@item @@global@@let@var{new-cmd}=@var{existing-cmd}
+Define a highlighting command for @TeX{}. (@TeX{} only.)
+
+@item @@lowersections
+Reduce hierarchical level of sectioning commands.
+
+@item @@math@{@var{mathematical-expression}@}
+Format a mathematical expression.
+
+@item @@minus@{@}
+Generate a minus sign.
+
+@item @@paragraphindent @var{asis-or-number}
+Specify paragraph indentation.
+
+@item @@raisesections
+Raise hierarchical level of sectioning commands.
+
+@item @@ref@{@var{node-name}, @r{[}@var{entry}@r{]}, @r{[}@var{topic-or-title}@r{]}, @r{[}@var{info-file}@r{]}, @r{[}@var{manual}@r{]}@}
+Make a reference. In the printed manual, the
+reference does not start with the word `see'.
+
+@item @@title @var{title}
+Typeset @var{title} in the alternative
+title page format.
+
+@item @@subtitle @var{subtitle}
+Typeset @var{subtitle} in the alternative
+title page format.
+
+@item @@today@{@}
+Insert the current date.
+@end table
+@tex
+% Switch width of first column of tables back to default value
+\global\tableindent=.8in
+@end tex
+@end ignore
+
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+
+@node Command and Variable Index
+@unnumbered Command and Variable Index
+
+This is an alphabetical list of all the @@-commands, assorted Emacs Lisp
+functions, and several variables. To make the list easier to use, the
+commands are listed without their preceding @samp{@@}.@refill
+
+@printindex fn
+
+
+@node Concept Index
+@unnumbered Concept Index
+
+@printindex cp
+
+
+@bye
diff --git a/Build/source/utils/texinfo/doc/txi-cs.tex b/Build/source/utils/texinfo/doc/txi-cs.tex
new file mode 100644
index 00000000000..cdbc3c0d226
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-cs.tex
@@ -0,0 +1,74 @@
+% $Id: txi-cs.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+% Czech translation for texinfo.tex.
+%
+% Copyright (C) 1999, 2000 Free Software Foundation.
+%
+% Authors:
+% Vladimir Michl <Vladimir.Michl@mujweb.cz>
+% Stepan Kasal <kasal@ucw.cz>
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+%
+\gdef\putwordAppendix{Přílohy}
+\gdef\putwordChapter{Kapitola}
+\gdef\putwordfile{soubor}
+\gdef\putwordin{v~knize}
+\gdef\putwordIndexIsEmpty{(Rejstřík je prázdný.)}
+\gdef\putwordIndexNonexistent{(Rejstřík neexistuje.)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Proměnná pro instance třídy}
+\gdef\putwordMethodon{Metoda třídy}
+\gdef\putwordNoTitle{Bez nadpisu}
+\gdef\putwordof{třídy}
+\global\let\putwordon\putwordof
+\gdef\putwordpage{stránka}
+\gdef\putwordsection{oddíl}
+\gdef\putwordSection{Oddíl}
+\gdef\putwordsee{viz}
+\gdef\putwordSee{Viz}
+\gdef\putwordShortTOC{Stručný obsah}
+\gdef\putwordTOC{Obsah}
+%
+\gdef\putwordMJan{ledna}
+\gdef\putwordMFeb{února}
+\gdef\putwordMMar{března}
+\gdef\putwordMApr{dubna}
+\gdef\putwordMMai{května}
+\gdef\putwordMJun{června}
+\gdef\putwordMJul{července}
+\gdef\putwordMAug{srpna}
+\gdef\putwordMSep{září}
+\gdef\putwordMOct{října}
+\gdef\putwordMNov{listopadu}
+\gdef\putwordMDec{prosince}
+%
+\gdef\putwordDefmac{Makro}
+\gdef\putwordDefspec{Speciální forma}
+\gdef\putwordDefvar{Proměnná}
+\gdef\putwordDefopt{Volby}
+\gdef\putwordDeffunc{Funkce}
+%
+% Redefine \today to produce Czech
+% preferred dates such as 28. januar 1999.
+%
+\gdef\today{%
+ \number\day.\nobreak\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMai\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \penalty3000\relax\space\number\year}
+%
diff --git a/Build/source/utils/texinfo/doc/txi-de.tex b/Build/source/utils/texinfo/doc/txi-de.tex
new file mode 100644
index 00000000000..f3726c3677a
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-de.tex
@@ -0,0 +1,79 @@
+% txi-de.tex -- adaptation to German for texinfo.tex.
+% $Id: txi-de.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 1999 Free Software Foundation, Inc.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2, or (at your option)
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+%
+% Written by Karl Heinz Marbaise, 18. January 1999, <kama@hippo.fido.de>
+%%
+%% german translation of the used words.
+%% Don't use checking because if it is our turn they have
+%% been defined.
+\gdef\putwordAppendix{Anhang}
+\gdef\putwordChapter{Kapitel}
+\gdef\putwordfile{Datei}
+\gdef\putwordin{in}
+\gdef\putwordInfo{Info}
+\gdef\putwordMethodon{Methode von}
+\gdef\putwordon{auf}
+\gdef\putwordof{von}
+\gdef\putwordpage{Seite}
+\gdef\putwordsection{Abschnitt}
+\gdef\putwordSection{Abschnitt}
+\gdef\putwordsee{siehe}
+\gdef\putwordSee{Siehe}
+\gdef\putwordShortTOC{Kurzverzeichnis}
+\gdef\putwordTOC{Inhaltsverzeichnis}
+%%
+\gdef\putwordNoTitle{Kein Titel}
+%%
+%% New defintion for the output of months.
+\gdef\putwordMJan{Januar}
+\gdef\putwordMFeb{Februar}
+\gdef\putwordMMar{M\"arz}
+\gdef\putwordMApr{April}
+\gdef\putwordMMai{Mai}
+\gdef\putwordMJun{Juni}
+\gdef\putwordMJul{Juli}
+\gdef\putwordMAug{August}
+\gdef\putwordMSep{September}
+\gdef\putwordMOct{Oktober}
+\gdef\putwordMNov{November}
+\gdef\putwordMDec{Dezember}
+%%
+%% some hyphenation for german language. Might be changed.
+\hyphenation{An-hang}
+%%\hyphenation{mini-buf-fer mini-buf-fers}
+%%\hyphenation{eshell}
+%%\hyphenation{white-space}
+%%
+%% Index handling should also work correct in german
+\gdef\putwordIndexNonexistent{(Index ist nicht vorhanden)}
+\gdef\putwordIndexIsEmpty{(Der Index ist leer)}
+%%
+%% \defmac
+\gdef\putwordDefmac{Makro}
+%% \defspec
+\gdef\putwordDefspec{Spezial Form}
+%% \defivar
+\gdef\putwordDefivar{exemplar Variable}
+%% \defvar leave unchanged because no difference in
+%% writing but in phonectics.
+\gdef\putwordDefvar{Variable}
+%% \defopt
+\gdef\putwordDefopt{Benutzer Option}
+%% \deffun
+\gdef\putwordDeffunc{Funktion}
diff --git a/Build/source/utils/texinfo/doc/txi-en.tex b/Build/source/utils/texinfo/doc/txi-en.tex
new file mode 100644
index 00000000000..721c49a49f1
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-en.tex
@@ -0,0 +1,69 @@
+% English non-translation for texinfo.tex. This is read when a source
+% document says @documentlanguage en (which might happen after another
+% @documentlanguage). The actual values are the same as defaults.
+% $Id: txi-en.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 1999 Free Software Foundation.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+\gdef\putwordAppendix{Appendix}
+\gdef\putwordChapter{Chapter}
+\gdef\putwordfile{file}
+\gdef\putwordin{in}
+\gdef\putwordIndexIsEmpty{(Index is empty)}
+\gdef\putwordIndexNonexistent{(Index is nonexistent)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Instance Variable of}
+\gdef\putwordMethodon{Method on}
+\gdef\putwordNoTitle{No Title}
+\gdef\putwordof{of}
+\gdef\putwordon{on}
+\gdef\putwordpage{page}
+\gdef\putwordsection{section}
+\gdef\putwordSection{Section}
+\gdef\putwordsee{see}
+\gdef\putwordSee{See}
+\gdef\putwordShortTOC{Short Contents}
+\gdef\putwordTOC{Table of Contents}
+%
+\gdef\putwordMJan{January}
+\gdef\putwordMFeb{February}
+\gdef\putwordMMar{March}
+\gdef\putwordMApr{April}
+\gdef\putwordMMay{May}
+\gdef\putwordMJun{June}
+\gdef\putwordMJul{July}
+\gdef\putwordMAug{August}
+\gdef\putwordMSep{September}
+\gdef\putwordMOct{October}
+\gdef\putwordMNov{November}
+\gdef\putwordMDec{December}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Special Form}
+\gdef\putwordDefvar{Variable}
+\gdef\putwordDefopt{User Option}
+\gdef\putwordDeffunc{Function}
+
+% Produces Day Month Year style of output.
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/txi-es.tex b/Build/source/utils/texinfo/doc/txi-es.tex
new file mode 100644
index 00000000000..334e2d1e109
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-es.tex
@@ -0,0 +1,58 @@
+% txi-es.tex -- TeX macros to handle Spanish language documents.
+%
+% Copyright (C) 1999 by Adrian Perez Jorge
+%
+% This txi-es.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 2, or (at
+% your option) any later version.
+%
+% This txi-es.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+
+%
+% Set up fixed words for Spanish.
+%
+
+\gdef\putwordAppendix{Ap\'endice}
+\gdef\putwordChapter{Cap\'{\char16{}}tulo}
+\gdef\putwordfile{archivo}
+\gdef\putwordIndexIsEmpty{(El \'Indice est\'a vac\'{\char16{}}o)}
+\gdef\putwordIndexNonexistent{(No existe el \'Indice)}
+\gdef\putwordInfo{Info}
+\gdef\putwordMethodon{M\'etodo de}
+\gdef\putwordNoTitle{Sin T\'{\char{16}}tulo}
+\gdef\putwordof{de}
+\gdef\putwordon{de}
+\gdef\putwordpage{p\'agina}
+\gdef\putwordsection{secci\'on}
+\gdef\putwordSection{Secci\'on}
+\gdef\putwordsee{v\'ease}
+\gdef\putwordSee{V\'ease}
+\gdef\putwordShortTOC{Resumen del Contenido}
+\gdef\putwordTOC{\'Indice General}
+%
+\gdef\putwordMJan{enero}
+\gdef\putwordMFeb{febrero}
+\gdef\putwordMMar{marzo}
+\gdef\putwordMApr{abril}
+\gdef\putwordMMay{mayo}
+\gdef\putwordMJun{junio}
+\gdef\putwordMJul{julio}
+\gdef\putwordMAug{agosto}
+\gdef\putwordMSep{septiembre}
+\gdef\putwordMOct{octubre}
+\gdef\putwordMNov{noviembre}
+\gdef\putwordMDec{diciembre}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Forma Especial}
+\gdef\putwordDefivar{Variable de Instancia}
+\gdef\putwordDefvar{Variable}
+\gdef\putwordDefopt{Opci\'on de Usuario}
+\gdef\putwordDeffunc{Funci\'on}
+
+\endinput
diff --git a/Build/source/utils/texinfo/doc/txi-fr.tex b/Build/source/utils/texinfo/doc/txi-fr.tex
new file mode 100644
index 00000000000..0a83f04ac0d
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-fr.tex
@@ -0,0 +1,73 @@
+% txi-fr.tex -- TeX macros to handle French language for texinfo.tex documents.
+% $Id: txi-fr.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 1999 Free Software Foundation.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+% Set up fixed words for French.
+% Translated by Laurent Bourbeau <bourbeau@progiciels-bpi.ca>
+% Translation date: le 10 décembre 1999.
+% Transmitted to: Karl Berry <karl@cs.umb.edu>
+
+\gdef\putwordAppendix{Annexe}
+\gdef\putwordChapter{Chapitre}
+\gdef\putwordfile{fichier}
+\gdef\putwordin{dans}
+\gdef\putwordIndexIsEmpty{(Index est vide)}
+\gdef\putwordIndexNonexistent{(Index n'existe pas)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Variable d'instance de}
+\gdef\putwordMethodon{M\'ethode sur}
+\gdef\putwordNoTitle{Sans Titre}
+\gdef\putwordof{de}
+\gdef\putwordon{sur}
+\gdef\putwordpage{page}
+\gdef\putwordsection{section}
+\gdef\putwordSection{Section}
+\gdef\putwordsee{voir}
+\gdef\putwordSee{Voir}
+\gdef\putwordShortTOC{Sommaire}
+\gdef\putwordTOC{Table des mati\`eres}
+%
+\gdef\putwordMJan{janvier}
+\gdef\putwordMFeb{f\'evrier}
+\gdef\putwordMMar{mars}
+\gdef\putwordMApr{avril}
+\gdef\putwordMMay{mai}
+\gdef\putwordMJun{juin}
+\gdef\putwordMJul{juillet}
+\gdef\putwordMAug{ao\^ut}
+\gdef\putwordMSep{septembre}
+\gdef\putwordMOct{octobre}
+\gdef\putwordMNov{novembre}
+\gdef\putwordMDec{d\'ecembre}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Forme Sp\'eciale}
+\gdef\putwordDefvar{Variable}
+\gdef\putwordDefopt{Option de l'usager}
+\gdef\putwordDeffunc{Fonction}
+
+% Produces Day Month Year style of output.
+% French datation - for instance: 10 janvier 2000.
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/txi-it.tex b/Build/source/utils/texinfo/doc/txi-it.tex
new file mode 100644
index 00000000000..28e51eaa3f0
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-it.tex
@@ -0,0 +1,69 @@
+% English non-translation for texinfo.tex. This is read when a source
+% document says @documentlanguage en (which might happen after another
+% @documentlanguage). The actual values are the same as defaults.
+% $Id: txi-it.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 1999 Free Software Foundation.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+\gdef\putwordAppendix{Appendice}
+\gdef\putwordChapter{Capitolo}
+\gdef\putwordfile{file}
+\gdef\putwordin{in}
+\gdef\putwordIndexIsEmpty{(L'indice \'e vuoto)}
+\gdef\putwordIndexNonexistent{(L'indice non esiste)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Variabile di istanza di}
+\gdef\putwordMethodon{Metodo di}
+\gdef\putwordNoTitle{Nessun titolo}
+\gdef\putwordof{di}
+\gdef\putwordon{su}
+\gdef\putwordpage{pagina}
+\gdef\putwordsection{sezione}
+\gdef\putwordSection{Sezione}
+\gdef\putwordsee{vedi}
+\gdef\putwordSee{Vedi}
+\gdef\putwordShortTOC{Sommario abbreviato}
+\gdef\putwordTOC{Sommario}
+%
+\gdef\putwordMJan{Gennaio}
+\gdef\putwordMFeb{Febbraio}
+\gdef\putwordMMar{Marzo}
+\gdef\putwordMApr{Aprile}
+\gdef\putwordMMay{Maggio}
+\gdef\putwordMJun{Giugno}
+\gdef\putwordMJul{Luglio}
+\gdef\putwordMAug{Agosto}
+\gdef\putwordMSep{Settembre}
+\gdef\putwordMOct{Ottobre}
+\gdef\putwordMNov{Novembre}
+\gdef\putwordMDec{Dicembre}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Forma speciale}
+\gdef\putwordDefvar{Variabile}
+\gdef\putwordDefopt{Opzione}
+\gdef\putwordDeffunc{Funzione}
+
+% Produces Day Month Year style of output.
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/txi-nl.tex b/Build/source/utils/texinfo/doc/txi-nl.tex
new file mode 100644
index 00000000000..aab69f7ecb0
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-nl.tex
@@ -0,0 +1,68 @@
+% Dutch translation for texinfo.tex.
+% $Id: txi-nl.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 1999 Free Software Foundation.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+% Set up fixed words if not already set.
+\gdef\putwordAppendix{Appendix}
+\gdef\putwordChapter{Hoofdstuk}
+\gdef\putwordfile{bestand}
+\gdef\putwordin{in}
+\gdef\putwordIndexIsEmpty{(Index is leeg)}
+\gdef\putwordIndexNonexistent{(Index bestaat niet)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Instantie Variabele van}
+\gdef\putwordMethodon{Methode van}
+\gdef\putwordNoTitle{Geen titel}
+\gdef\putwordof{van}
+\gdef\putwordon{op}
+\gdef\putwordpage{pagina}
+\gdef\putwordsection{sectie}
+\gdef\putwordSection{Sectie}
+\gdef\putwordsee{zie}
+\gdef\putwordSee{Zie}
+\gdef\putwordShortTOC{Korte inhoudsopgave}
+\gdef\putwordTOC{Inhoudsopgave}
+%
+\gdef\putwordMJan{Januari}
+\gdef\putwordMFeb{Februari}
+\gdef\putwordMMar{Maart}
+\gdef\putwordMApr{April}
+\gdef\putwordMMay{Mei}
+\gdef\putwordMJun{Juni}
+\gdef\putwordMJul{Juli}
+\gdef\putwordMAug{Augustus}
+\gdef\putwordMSep{September}
+\gdef\putwordMOct{Oktober}
+\gdef\putwordMNov{November}
+\gdef\putwordMDec{December}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Speciale Vorm}
+\gdef\putwordDefvar{Variabele}
+\gdef\putwordDefopt{Gebruikers optie}
+\gdef\putwordDeffunc{Functie}
+
+% Produces Day Month Year style of output.
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/txi-no.tex b/Build/source/utils/texinfo/doc/txi-no.tex
new file mode 100644
index 00000000000..a4e589382ed
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-no.tex
@@ -0,0 +1,69 @@
+% Norwegian translation for texinfo.tex (1999-10-29, GNU Texinfo 4.0).
+% Enables the use of words like Kapittel instead of Chapter, etc.
+%
+% Copyright (C) 1999 Trond Endrest=F8l <endrestol@hotmail.com>
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+% MA 02111-1307, USA.
+%
+\gdef\putwordAppendix{Vedlegg}
+\gdef\putwordChapter{Kapittel}
+\gdef\putwordfile{fil}
+\gdef\putwordIndexIsEmpty{(Indeks er tom)}
+\gdef\putwordIndexNonexistent{(Indeks eksisterer ikke)}
+\gdef\putwordInfo{Info}
+\gdef\putwordMethodon{Metode p\aa}
+\gdef\putwordNoTitle{Ingen tittel}
+\gdef\putwordof{av}
+\gdef\putwordon{p\aa}
+\gdef\putwordpage{side}
+\gdef\putwordsection{avsnitt}
+\gdef\putwordSection{Avsnitt}
+\gdef\putwordsee{se}
+\gdef\putwordSee{Se}
+\gdef\putwordShortTOC{Kort innholdsfortegnelse}
+\gdef\putwordTOC{Innholdsfortegnelse}
+%
+\gdef\putwordMJan{januar}
+\gdef\putwordMFeb{februar}
+\gdef\putwordMMar{mars}
+\gdef\putwordMApr{april}
+\gdef\putwordMMay{mai}
+\gdef\putwordMJun{juni}
+\gdef\putwordMJul{juli}
+\gdef\putwordMAug{august}
+\gdef\putwordMSep{september}
+\gdef\putwordMOct{oktober}
+\gdef\putwordMNov{november}
+\gdef\putwordMDec{desember}
+%
+\gdef\putwordDefmac{Makro}
+\gdef\putwordDefspec{Spesiell form}
+\gdef\putwordDefivar{Forekomstvariabel}
+\gdef\putwordDefvar{Variabel}
+\gdef\putwordDefopt{Brukervalg}
+\gdef\putwordDeffunc{Funksjon}
+%
+% Redefine \today to produce Norwegian
+% preferred dates such as 28. januar 1999.
+%
+\gdef\today{%
+ \number\day.\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/txi-pl.tex b/Build/source/utils/texinfo/doc/txi-pl.tex
new file mode 100644
index 00000000000..b5895a2942d
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-pl.tex
@@ -0,0 +1,73 @@
+% txi-pl.tex -- adaptation to Polish for texinfo.tex.
+% $Id: txi-pl.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 2003 Free Software Foundation.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+%
+% Written by Wojciech Polak <polak@gnu.org> on 29-03-2003.
+% Modified by Staszek Wawrykiewicz <staw@gust.org.pl> on 01-04-2003.
+%
+\prefixing
+\gdef\putwordAppendix{Suplement}
+\gdef\putwordChapter{Rozdzia/l}
+\gdef\putwordfile{plik}
+\gdef\putwordin{w}
+\gdef\putwordIndexIsEmpty{(Skorowidz jest pusty)}
+\gdef\putwordIndexNonexistent{(Brak skorowidza)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Przyk/ladowa zmienna}
+\gdef\putwordMethodon{Metoda}
+\gdef\putwordNoTitle{Brak tytu/lu}
+\gdef\putwordof{z}
+\gdef\putwordon{na}
+\gdef\putwordpage{strona}
+\gdef\putwordsection{cz/e/s/c}
+\gdef\putwordSection{Cz/e/s/c}
+\gdef\putwordsee{zobacz}
+\gdef\putwordSee{Zobacz}
+\gdef\putwordShortTOC{Kr/otka zawarto/s/c}
+\gdef\putwordTOC{Spis tre/sci}
+%
+\gdef\putwordMJan{stycznia}
+\gdef\putwordMFeb{lutego}
+\gdef\putwordMMar{marca}
+\gdef\putwordMApr{kwietnia}
+\gdef\putwordMMay{maja}
+\gdef\putwordMJun{czerwca}
+\gdef\putwordMJul{lipca}
+\gdef\putwordMAug{sierpnia}
+\gdef\putwordMSep{wrze/snia}
+\gdef\putwordMOct{pa/xdziernika}
+\gdef\putwordMNov{listopada}
+\gdef\putwordMDec{grudnia}
+%
+\gdef\putwordDefmac{Makro}
+\gdef\putwordDefspec{Specjalna forma}
+\gdef\putwordDefvar{Zmienna}
+\gdef\putwordDefopt{Opcja u/zytkownika}
+\gdef\putwordDeffunc{Funkcja}
+\nonprefixing
+%
+% Produces Day Month Year style of output.
+%
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/txi-pt.tex b/Build/source/utils/texinfo/doc/txi-pt.tex
new file mode 100644
index 00000000000..c65bc5e1d5a
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-pt.tex
@@ -0,0 +1,69 @@
+% txi-pt.tex -- adaptation to Portuguese for texinfo.tex.
+%
+% Copyright (C) 1999 Free Software Foundation, Inc.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2, or (at your option)
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+%
+% Written by Lalo Martins <lalo@webcom.com> at 05 August 1999
+%%
+%% Portuguese translation of the used words.
+\gdef\putwordAppendix{Ap\^endice}
+\gdef\putwordChapter{Cap\'\ptexi tulo}
+\gdef\putwordfile{Data}
+\gdef\putwordin{em}
+\gdef\putwordInfo{Info}
+\gdef\putwordMethodon{M\'etodo de}
+\gdef\putwordon{em}
+\gdef\putwordof{de}
+\gdef\putwordpage{P\'agina}
+\gdef\putwordsection{se\,c\~ao}
+\gdef\putwordSection{Se\,c\~ao}
+\gdef\putwordsee{veja}
+\gdef\putwordSee{Veja}
+\gdef\putwordShortTOC{Breve Sum\'ario}
+\gdef\putwordTOC{Sum\'ario}
+%%
+\gdef\putwordNoTitle{Sem T\'\ptexi tulo}
+%%
+%% New defintion for the output of months.
+\gdef\putwordMJan{Janeiro}
+\gdef\putwordMFeb{Fevereiro}
+\gdef\putwordMMar{Mar\,co}
+\gdef\putwordMApr{Abril}
+\gdef\putwordMMai{Maio}
+\gdef\putwordMJun{Junho}
+\gdef\putwordMJul{Julho}
+\gdef\putwordMAug{Agosto}
+\gdef\putwordMSep{Setembro}
+\gdef\putwordMOct{Outubro}
+\gdef\putwordMNov{Novembro}
+\gdef\putwordMDec{Dezembro}
+%%
+%% Index handling should also work correct in german
+\gdef\putwordIndexNonexistent{(\'Indice inexistente)}
+\gdef\putwordIndexIsEmpty{(\'Indice vazio)}
+%%
+%% \defmac
+\gdef\putwordDefmac{Macro}
+%% \defspec
+\gdef\putwordDefspec{Forma Especial}
+%% \defivar
+\gdef\putwordDefivar{Vari\'avel de Inst\^ancia}
+%% \defvar
+\gdef\putwordDefvar{Vari\'avel}
+%% \defopt
+\gdef\putwordDefopt{Op\,c\~ao de Usu\'ario}
+%% \deffun
+\gdef\putwordDeffunc{Fun\,c\~ao}
diff --git a/Build/source/utils/texinfo/doc/txi-tr.tex b/Build/source/utils/texinfo/doc/txi-tr.tex
new file mode 100644
index 00000000000..eafba9f9848
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/txi-tr.tex
@@ -0,0 +1,82 @@
+% txi-en.tex -- adaptation to Turkish for texinfo.tex.
+% $Id: txi-tr.tex,v 1.3 2004/04/11 17:56:45 karl Exp $
+%
+% Copyright (C) 2003 Free Software Foundation, Inc.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2, or (at your option)
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+%
+% Written by Alper Ersoy, 5 January 2003, <aersoy@tfz.net>
+%
+%%
+%% Turkish translations of the used words.
+%%
+%%
+\gdef\putwordAppendix{Ek}
+\gdef\putwordChapter{Kesim}
+\gdef\putwordfile{dosya}
+\gdef\putwordInfo{Bilgi}
+\gdef\putwordpage{Sayfa}
+\gdef\putwordsection{b\"ol\"um}
+\gdef\putwordSection{B\"ol\"um}
+\gdef\putwordsee{bkz.}
+\gdef\putwordSee{Bkz.}
+\gdef\putwordShortTOC{\dotaccent{I}\,cindekiler (K\dotless{i}saca)}
+\gdef\putwordTOC{\dotaccent{I}\,cindekiler}
+%%
+%% This one really sucks :\
+\gdef\putwordMethodon{S\dotless{i}n\dotless{i}f:}
+%%
+%% I could not translate these ones, need examples :\
+%% If anybody out there is using these in turkish, please
+%% don't hesitate to send me patches ;)
+\gdef\putwordin{in}
+\gdef\putwordon{on}
+\gdef\putwordof{of}
+%%
+%%
+\gdef\putwordNoTitle{Ba\,sl\dotless{i}s\dotless{i}z}
+\gdef\putwordIndexNonexistent{(Dizin bulunmamakta)}
+\gdef\putwordIndexIsEmpty{(Dizin bo\,s)}
+%%
+%% Months
+\gdef\putwordMJan{Ocak}
+\gdef\putwordMFeb{\,Subat}
+\gdef\putwordMMar{Mart}
+\gdef\putwordMApr{Nisan}
+\gdef\putwordMMai{May\dotless{i}s}
+\gdef\putwordMJun{Haziran}
+\gdef\putwordMJul{Temmuz}
+\gdef\putwordMAug{A\u{g}ustos}
+\gdef\putwordMSep{Eyl\"ul}
+\gdef\putwordMOct{Ekim}
+\gdef\putwordMNov{Kas\dotless{i}m}
+\gdef\putwordMDec{Aral\dotless{i}k}
+%%
+%% Definitions
+\gdef\putwordDefmac{Makro}
+\gdef\putwordDefspec{\"Ozel Yap\dotless{i}}
+\gdef\putwordDefopt{Se\,cenek}
+\gdef\putwordDefvar{De\u{g}i\,sken}
+\gdef\putwordDeffunc{Fonksiyon}
+%%
+% Produces Day Month Year style of output.
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
diff --git a/Build/source/utils/texinfo/doc/version-stnd.texi b/Build/source/utils/texinfo/doc/version-stnd.texi
new file mode 100644
index 00000000000..32973a788b2
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/version-stnd.texi
@@ -0,0 +1,4 @@
+@set UPDATED 14 December 2004
+@set UPDATED-MONTH December 2004
+@set EDITION 4.8
+@set VERSION 4.8
diff --git a/Build/source/utils/texinfo/doc/version.texi b/Build/source/utils/texinfo/doc/version.texi
new file mode 100644
index 00000000000..ae55f879d47
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 29 December 2004
+@set UPDATED-MONTH December 2004
+@set EDITION 4.8
+@set VERSION 4.8
diff --git a/Build/source/utils/texinfo/doc/win32.mak b/Build/source/utils/texinfo/doc/win32.mak
new file mode 100644
index 00000000000..97c0c22df89
--- /dev/null
+++ b/Build/source/utils/texinfo/doc/win32.mak
@@ -0,0 +1,41 @@
+################################################################################
+#
+# Makefile : TeXInfo / Doc
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <03/08/14 21:22:55 popineau>
+#
+################################################################################
+root_srcdir = ..\..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+!include <msvc/common.mak>
+
+default: all
+
+all:
+
+infofiles = info-stnd.info info.info texinfo.info
+pdfdocfiles = info-stnd.pdf info.pdf texinfo.pdf
+htmldocfiles = info-stnd.html info.html texinfo.html
+docsubdir = texinfo
+
+install:: install-doc
+
+depend::
+
+!include <msvc/install.mak>
+!include <msvc/clean.mak>
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/texinfo/info/Makefile.am b/Build/source/utils/texinfo/info/Makefile.am
new file mode 100644
index 00000000000..176f5939a53
--- /dev/null
+++ b/Build/source/utils/texinfo/info/Makefile.am
@@ -0,0 +1,74 @@
+# $Id: Makefile.am,v 1.8 2004/10/28 14:03:27 karl Exp $
+# Makefile.am for texinfo/info.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# Use `ginfo' for building to avoid confusion with the standard `info'
+# target. Removes the `g' in the install rule before applying any
+# user-specified name transformations.
+bin_PROGRAMS = ginfo infokey
+transform = s/ginfo/info/; $(program_transform_name)
+
+localedir = $(datadir)/locale
+infodir2 = $(datadir)/info
+
+# -I. for funs.h.
+# Automake puts -I.. and -I$(srcdir) into DEFS by default, but
+# we need to override it, so include them ourselves.
+INCLUDES = -I. -I$(top_srcdir)/lib -I../intl -I.. -I$(srcdir)
+DEFS += -DLOCALEDIR=\"$(localedir)\" -DINFODIR=\"$(infodir)\" \
+ -DINFODIR2=\"$(infodir2)\"
+LDADD = ../lib/libtxi.a $(TERMLIBS) $(LIBINTL)
+
+EXTRA_DIST = README pcterm.c
+
+ginfo_SOURCES = dir.c display.c display.h doc.h dribble.c dribble.h \
+ echo-area.c echo-area.h \
+ filesys.c filesys.h footnotes.c footnotes.h gc.c gc.h \
+ indices.c indices.h info-utils.c info-utils.h info.c info.h infodoc.c \
+ infomap.c infomap.h m-x.c man.c man.h nodemenu.c nodes.c nodes.h \
+ search.c search.h session.c session.h signals.c signals.h \
+ termdep.h terminal.c terminal.h tilde.c tilde.h \
+ variables.c variables.h window.c window.h
+nodist_ginfo_SOURCES = doc.c funs.h
+infokey_SOURCES = infokey.c infokey.h key.h
+nodist_infokey_SOURCES = key.c funs.h
+
+# The files `doc.c', `key.c' and `funs.h' are created by ./makedoc run over the
+# source files which contain DECLARE_INFO_COMMAND. `funs.h' is a header file
+# listing the functions found. `doc.c' is a structure containing pointers
+# to those functions along with completable names and documentation strings.
+#
+generated_sources = doc.c key.c funs.h
+
+# We need a linear ordering to prevent race condition in parallel make.
+# See the node ``(automake)Multiple Outputs'' for an explanation.
+doc.c: key.c
+key.c: funs.h
+
+# These files are not distributed.
+DISTCLEANFILES = $(generated_sources)
+
+noinst_PROGRAMS = makedoc
+makedoc_SOURCES = makedoc.c
+
+# Files with Info commands defined that makedoc should read.
+cmd_sources = $(srcdir)/session.c $(srcdir)/echo-area.c $(srcdir)/infodoc.c \
+ $(srcdir)/m-x.c $(srcdir)/indices.c $(srcdir)/nodemenu.c \
+ $(srcdir)/footnotes.c $(srcdir)/variables.c
+
+# The $(EXEEXT) should be added by Automake, but isn't. Fine.
+$(generated_sources): makedoc$(EXEEXT) $(cmd_sources)
+ rm -f $(generated_sources)
+ $(top_builddir)/$(native_tools)/info/makedoc $(cmd_sources)
+
+# The following hack is necessary to hint make before the automatic
+# dependencies are built.
+BUILT_SOURCES = funs.h
diff --git a/Build/source/utils/texinfo/info/Makefile.in b/Build/source/utils/texinfo/info/Makefile.in
new file mode 100644
index 00000000000..56fc64f82e5
--- /dev/null
+++ b/Build/source/utils/texinfo/info/Makefile.in
@@ -0,0 +1,584 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.8 2004/10/28 14:03:27 karl Exp $
+# Makefile.am for texinfo/info.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+SOURCES = $(ginfo_SOURCES) $(nodist_ginfo_SOURCES) $(infokey_SOURCES) $(nodist_infokey_SOURCES) $(makedoc_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ginfo$(EXEEXT) infokey$(EXEEXT)
+noinst_PROGRAMS = makedoc$(EXEEXT)
+subdir = info
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am_ginfo_OBJECTS = dir.$(OBJEXT) display.$(OBJEXT) dribble.$(OBJEXT) \
+ echo-area.$(OBJEXT) filesys.$(OBJEXT) footnotes.$(OBJEXT) \
+ gc.$(OBJEXT) indices.$(OBJEXT) info-utils.$(OBJEXT) \
+ info.$(OBJEXT) infodoc.$(OBJEXT) infomap.$(OBJEXT) \
+ m-x.$(OBJEXT) man.$(OBJEXT) nodemenu.$(OBJEXT) nodes.$(OBJEXT) \
+ search.$(OBJEXT) session.$(OBJEXT) signals.$(OBJEXT) \
+ terminal.$(OBJEXT) tilde.$(OBJEXT) variables.$(OBJEXT) \
+ window.$(OBJEXT)
+nodist_ginfo_OBJECTS = doc.$(OBJEXT)
+ginfo_OBJECTS = $(am_ginfo_OBJECTS) $(nodist_ginfo_OBJECTS)
+ginfo_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+ginfo_DEPENDENCIES = ../lib/libtxi.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_infokey_OBJECTS = infokey.$(OBJEXT)
+nodist_infokey_OBJECTS = key.$(OBJEXT)
+infokey_OBJECTS = $(am_infokey_OBJECTS) $(nodist_infokey_OBJECTS)
+infokey_LDADD = $(LDADD)
+infokey_DEPENDENCIES = ../lib/libtxi.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am_makedoc_OBJECTS = makedoc.$(OBJEXT)
+makedoc_OBJECTS = $(am_makedoc_OBJECTS)
+makedoc_LDADD = $(LDADD)
+makedoc_DEPENDENCIES = ../lib/libtxi.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ginfo_SOURCES) $(nodist_ginfo_SOURCES) $(infokey_SOURCES) \
+ $(nodist_infokey_SOURCES) $(makedoc_SOURCES)
+DIST_SOURCES = $(ginfo_SOURCES) $(infokey_SOURCES) $(makedoc_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+transform = s/ginfo/info/; $(program_transform_name)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" -DINFODIR=\"$(infodir)\" \
+ -DINFODIR2=\"$(infodir2)\"
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+localedir = $(datadir)/locale
+infodir2 = $(datadir)/info
+
+# -I. for funs.h.
+# Automake puts -I.. and -I$(srcdir) into DEFS by default, but
+# we need to override it, so include them ourselves.
+INCLUDES = -I. -I$(top_srcdir)/lib -I../intl -I.. -I$(srcdir)
+LDADD = ../lib/libtxi.a $(TERMLIBS) $(LIBINTL)
+EXTRA_DIST = README pcterm.c
+ginfo_SOURCES = dir.c display.c display.h doc.h dribble.c dribble.h \
+ echo-area.c echo-area.h \
+ filesys.c filesys.h footnotes.c footnotes.h gc.c gc.h \
+ indices.c indices.h info-utils.c info-utils.h info.c info.h infodoc.c \
+ infomap.c infomap.h m-x.c man.c man.h nodemenu.c nodes.c nodes.h \
+ search.c search.h session.c session.h signals.c signals.h \
+ termdep.h terminal.c terminal.h tilde.c tilde.h \
+ variables.c variables.h window.c window.h
+
+nodist_ginfo_SOURCES = doc.c funs.h
+infokey_SOURCES = infokey.c infokey.h key.h
+nodist_infokey_SOURCES = key.c funs.h
+
+# The files `doc.c', `key.c' and `funs.h' are created by ./makedoc run over the
+# source files which contain DECLARE_INFO_COMMAND. `funs.h' is a header file
+# listing the functions found. `doc.c' is a structure containing pointers
+# to those functions along with completable names and documentation strings.
+#
+generated_sources = doc.c key.c funs.h
+
+# These files are not distributed.
+DISTCLEANFILES = $(generated_sources)
+makedoc_SOURCES = makedoc.c
+
+# Files with Info commands defined that makedoc should read.
+cmd_sources = $(srcdir)/session.c $(srcdir)/echo-area.c $(srcdir)/infodoc.c \
+ $(srcdir)/m-x.c $(srcdir)/indices.c $(srcdir)/nodemenu.c \
+ $(srcdir)/footnotes.c $(srcdir)/variables.c
+
+
+# The following hack is necessary to hint make before the automatic
+# dependencies are built.
+BUILT_SOURCES = funs.h
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu info/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu info/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+ginfo$(EXEEXT): $(ginfo_OBJECTS) $(ginfo_DEPENDENCIES)
+ @rm -f ginfo$(EXEEXT)
+ $(LINK) $(ginfo_LDFLAGS) $(ginfo_OBJECTS) $(ginfo_LDADD) $(LIBS)
+infokey$(EXEEXT): $(infokey_OBJECTS) $(infokey_DEPENDENCIES)
+ @rm -f infokey$(EXEEXT)
+ $(LINK) $(infokey_LDFLAGS) $(infokey_OBJECTS) $(infokey_LDADD) $(LIBS)
+makedoc$(EXEEXT): $(makedoc_OBJECTS) $(makedoc_DEPENDENCIES)
+ @rm -f makedoc$(EXEEXT)
+ $(LINK) $(makedoc_LDFLAGS) $(makedoc_OBJECTS) $(makedoc_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/doc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dribble.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/echo-area.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filesys.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/footnotes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indices.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info-utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infodoc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infokey.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infomap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m-x.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makedoc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/man.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nodemenu.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nodes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terminal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tilde.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-noinstPROGRAMS ctags distclean \
+ distclean-compile distclean-generic distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am
+
+
+# We need a linear ordering to prevent race condition in parallel make.
+# See the node ``(automake)Multiple Outputs'' for an explanation.
+doc.c: key.c
+key.c: funs.h
+
+# The $(EXEEXT) should be added by Automake, but isn't. Fine.
+$(generated_sources): makedoc$(EXEEXT) $(cmd_sources)
+ rm -f $(generated_sources)
+ $(top_builddir)/$(native_tools)/info/makedoc $(cmd_sources)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/info/README b/Build/source/utils/texinfo/info/README
new file mode 100644
index 00000000000..4178a0107e0
--- /dev/null
+++ b/Build/source/utils/texinfo/info/README
@@ -0,0 +1,30 @@
+$Id: README,v 1.3 2004/04/11 17:56:45 karl Exp $
+texinfo/info/README
+
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Info 2.0 is a complete rewrite of the original standalone Info I wrote in
+1987, the first program I wrote for rms. That program was something like
+my second Unix program ever, and my die-hard machine language coding habits
+tended to show through. I found the original Info hard to read and
+maintain, and thus decided to write this one.
+
+The rewrite consists of about 12,000 lines of code written in about 12
+days. I believe this version of Info to be in much better shape than the
+original Info.
+
+Info 2.0 is substantially different from its original standalone
+predecessor. It appears almost identical to the GNU Emacs version, but has
+the advantages of smaller size, ease of portability, and a built in library
+which can be used in other programs (to get or display documentation from
+Info files, for example).
+
+A full listing of the commands available in Info can be gotten by typing
+`?' while within an Info window. This produces a node in a window which
+can be viewed just like any Info node.
+
+--Brian Fox <bfox@gnu.org>
diff --git a/Build/source/utils/texinfo/info/dir.c b/Build/source/utils/texinfo/info/dir.c
new file mode 100644
index 00000000000..98061dfdfa6
--- /dev/null
+++ b/Build/source/utils/texinfo/info/dir.c
@@ -0,0 +1,290 @@
+/* dir.c -- how to build a special "dir" node from "localdir" files.
+ $Id: dir.c,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "info-utils.h"
+#include "filesys.h"
+#include "tilde.h"
+
+/* The "dir" node can be built from the contents of a file called "dir",
+ with the addition of the menus of every file named in the array
+ dirs_to_add which are found in INFOPATH. */
+
+static void add_menu_to_file_buffer (char *contents, long int size,
+ FILE_BUFFER *fb);
+static void insert_text_into_fb_at_binding (FILE_BUFFER *fb,
+ SEARCH_BINDING *binding, char *text, int textlen);
+void maybe_build_dir_node (char *dirname);
+
+static char *dirs_to_add[] = {
+ "dir", "localdir", (char *)NULL
+};
+
+
+/* Return zero if the file represented in the stat structure TEST has
+ already been seen, nonzero else. */
+
+typedef struct
+{
+ unsigned long device;
+ unsigned long inode;
+} dir_file_list_entry_type;
+
+static int
+new_dir_file_p (struct stat *test)
+{
+ static unsigned dir_file_list_len = 0;
+ static dir_file_list_entry_type *dir_file_list = NULL;
+ unsigned i;
+
+ for (i = 0; i < dir_file_list_len; i++)
+ {
+ dir_file_list_entry_type entry;
+ entry = dir_file_list[i];
+ if (entry.device == test->st_dev && entry.inode == test->st_ino)
+ return 0;
+ }
+
+ dir_file_list_len++;
+ dir_file_list = xrealloc (dir_file_list,
+ dir_file_list_len * sizeof (dir_file_list_entry_type));
+ dir_file_list[dir_file_list_len - 1].device = test->st_dev;
+ dir_file_list[dir_file_list_len - 1].inode = test->st_ino;
+ return 1;
+}
+
+
+void
+maybe_build_dir_node (char *dirname)
+{
+ int path_index, update_tags;
+ char *this_dir;
+ FILE_BUFFER *dir_buffer = info_find_file (dirname);
+
+ /* If there is no "dir" in the current info path, we cannot build one
+ from nothing. */
+ if (!dir_buffer)
+ return;
+
+ /* If this directory has already been built, return now. */
+ if (dir_buffer->flags & N_CannotGC)
+ return;
+
+ /* Initialize the list we use to avoid reading the same dir file twice
+ with the dir file just found. */
+ new_dir_file_p (&dir_buffer->finfo);
+
+ path_index = update_tags = 0;
+
+ /* Using each element of the path, check for one of the files in
+ DIRS_TO_ADD. Do not check for "localdir.info.Z" or anything else.
+ Only files explictly named are eligible. This is a design decision.
+ There can be an info file name "localdir.info" which contains
+ information on the setting up of "localdir" files. */
+ while ((this_dir = extract_colon_unit (infopath, &path_index)))
+ {
+ register int da_index;
+ char *from_file;
+
+ /* Expand a leading tilde if one is present. */
+ if (*this_dir == '~')
+ {
+ char *tilde_expanded_dirname;
+
+ tilde_expanded_dirname = tilde_expand_word (this_dir);
+ if (tilde_expanded_dirname != this_dir)
+ {
+ free (this_dir);
+ this_dir = tilde_expanded_dirname;
+ }
+ }
+
+ /* For every different file named in DIRS_TO_ADD found in the
+ search path, add that file's menu to our "dir" node. */
+ for (da_index = 0; (from_file = dirs_to_add[da_index]); da_index++)
+ {
+ struct stat finfo;
+ int statable;
+ int namelen = strlen (from_file);
+ char *fullpath = xmalloc (3 + strlen (this_dir) + namelen);
+
+ strcpy (fullpath, this_dir);
+ if (!IS_SLASH (fullpath[strlen (fullpath) - 1]))
+ strcat (fullpath, "/");
+ strcat (fullpath, from_file);
+
+ statable = (stat (fullpath, &finfo) == 0);
+
+ /* Only add this file if we have not seen it before. */
+ if (statable && S_ISREG (finfo.st_mode) && new_dir_file_p (&finfo))
+ {
+ long filesize;
+ int compressed;
+ char *contents = filesys_read_info_file (fullpath, &filesize,
+ &finfo, &compressed);
+ if (contents)
+ {
+ update_tags++;
+ add_menu_to_file_buffer (contents, filesize, dir_buffer);
+ free (contents);
+ }
+ }
+
+ free (fullpath);
+ }
+ free (this_dir);
+ }
+
+ if (update_tags)
+ build_tags_and_nodes (dir_buffer);
+
+ /* Flag that the dir buffer has been built. */
+ dir_buffer->flags |= N_CannotGC;
+}
+
+/* Given CONTENTS and FB (a file buffer), add the menu found in CONTENTS
+ to the menu found in FB->contents. Second argument SIZE is the total
+ size of CONTENTS. */
+static void
+add_menu_to_file_buffer (char *contents, long int size, FILE_BUFFER *fb)
+{
+ SEARCH_BINDING contents_binding, fb_binding;
+ long contents_offset, fb_offset;
+
+ contents_binding.buffer = contents;
+ contents_binding.start = 0;
+ contents_binding.end = size;
+ contents_binding.flags = S_FoldCase | S_SkipDest;
+
+ fb_binding.buffer = fb->contents;
+ fb_binding.start = 0;
+ fb_binding.end = fb->filesize;
+ fb_binding.flags = S_FoldCase | S_SkipDest;
+
+ /* Move to the start of the menus in CONTENTS and FB. */
+ contents_offset = search_forward (INFO_MENU_LABEL, &contents_binding);
+ fb_offset = search_forward (INFO_MENU_LABEL, &fb_binding);
+
+ /* If there is no menu in CONTENTS, quit now. */
+ if (contents_offset == -1)
+ return;
+
+ /* There is a menu in CONTENTS, and contents_offset points to the first
+ character following the menu starter string. Skip all whitespace
+ and newline characters. */
+ contents_offset += skip_whitespace_and_newlines (contents + contents_offset);
+
+ /* If there is no menu in FB, make one. */
+ if (fb_offset == -1)
+ {
+ /* Find the start of the second node in this file buffer. If there
+ is only one node, we will be adding the contents to the end of
+ this node. */
+ fb_offset = find_node_separator (&fb_binding);
+
+ /* If not even a single node separator, give up. */
+ if (fb_offset == -1)
+ return;
+
+ fb_binding.start = fb_offset;
+ fb_binding.start +=
+ skip_node_separator (fb_binding.buffer + fb_binding.start);
+
+ /* Try to find the next node separator. */
+ fb_offset = find_node_separator (&fb_binding);
+
+ /* If found one, consider that the start of the menu. Otherwise, the
+ start of this menu is the end of the file buffer (i.e., fb->size). */
+ if (fb_offset != -1)
+ fb_binding.start = fb_offset;
+ else
+ fb_binding.start = fb_binding.end;
+
+ insert_text_into_fb_at_binding
+ (fb, &fb_binding, INFO_MENU_LABEL, strlen (INFO_MENU_LABEL));
+
+ fb_binding.buffer = fb->contents;
+ fb_binding.start = 0;
+ fb_binding.end = fb->filesize;
+ fb_offset = search_forward (INFO_MENU_LABEL, &fb_binding);
+ if (fb_offset == -1)
+ abort ();
+ }
+
+ /* CONTENTS_OFFSET and FB_OFFSET point to the starts of the menus that
+ appear in their respective buffers. Add the remainder of CONTENTS
+ to the end of FB's menu. */
+ fb_binding.start = fb_offset;
+ fb_offset = find_node_separator (&fb_binding);
+ if (fb_offset != -1)
+ fb_binding.start = fb_offset;
+ else
+ fb_binding.start = fb_binding.end;
+
+ /* Leave exactly one blank line between directory entries. */
+ {
+ int num_found = 0;
+
+ while ((fb_binding.start > 0) &&
+ (whitespace_or_newline (fb_binding.buffer[fb_binding.start - 1])))
+ {
+ num_found++;
+ fb_binding.start--;
+ }
+
+ /* Optimize if possible. */
+ if (num_found >= 2)
+ {
+ fb_binding.buffer[fb_binding.start++] = '\n';
+ fb_binding.buffer[fb_binding.start++] = '\n';
+ }
+ else
+ {
+ /* Do it the hard way. */
+ insert_text_into_fb_at_binding (fb, &fb_binding, "\n\n", 2);
+ fb_binding.start += 2;
+ }
+ }
+
+ /* Insert the new menu. */
+ insert_text_into_fb_at_binding
+ (fb, &fb_binding, contents + contents_offset, size - contents_offset);
+}
+
+static void
+insert_text_into_fb_at_binding (FILE_BUFFER *fb,
+ SEARCH_BINDING *binding, char *text, int textlen)
+{
+ char *contents;
+ long start, end;
+
+ start = binding->start;
+ end = fb->filesize;
+
+ contents = (char *)xmalloc (fb->filesize + textlen + 1);
+ memcpy (contents, fb->contents, start);
+ memcpy (contents + start, text, textlen);
+ memcpy (contents + start + textlen, fb->contents + start, end - start);
+ free (fb->contents);
+ fb->contents = contents;
+ fb->filesize += textlen;
+ fb->finfo.st_size = fb->filesize;
+}
diff --git a/Build/source/utils/texinfo/info/display.c b/Build/source/utils/texinfo/info/display.c
new file mode 100644
index 00000000000..1a9fd0a9ae4
--- /dev/null
+++ b/Build/source/utils/texinfo/info/display.c
@@ -0,0 +1,646 @@
+/* display.c -- How to display Info windows.
+ $Id: display.c,v 1.7 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "display.h"
+
+extern int info_any_buffered_input_p (void); /* Found in session.c. */
+
+static void free_display (DISPLAY_LINE **display);
+static DISPLAY_LINE **make_display (int width, int height);
+
+void handle_tag (char *tag);
+void handle_tag_start (char *tag);
+void handle_tag_end (char *tag);
+
+/* An array of display lines which tell us what is currently visible on
+ the display. */
+DISPLAY_LINE **the_display = (DISPLAY_LINE **)NULL;
+
+/* Non-zero means do no output. */
+int display_inhibited = 0;
+
+/* Initialize THE_DISPLAY to WIDTH and HEIGHT, with nothing in it. */
+void
+display_initialize_display (int width, int height)
+{
+ free_display (the_display);
+ the_display = make_display (width, height);
+ display_clear_display (the_display);
+}
+
+/* Clear all of the lines in DISPLAY making the screen blank. */
+void
+display_clear_display (DISPLAY_LINE **display)
+{
+ register int i;
+
+ for (i = 0; display[i]; i++)
+ {
+ display[i]->text[0] = '\0';
+ display[i]->textlen = 0;
+ display[i]->inverse = 0;
+ }
+}
+
+/* Non-zero if we didn't completely redisplay a window. */
+int display_was_interrupted_p = 0;
+
+/* Update the windows pointed to by WINDOW in the_display. This actually
+ writes the text on the screen. */
+void
+display_update_display (WINDOW *window)
+{
+ register WINDOW *win;
+
+ display_was_interrupted_p = 0;
+
+ /* For every window in the list, check contents against the display. */
+ for (win = window; win; win = win->next)
+ {
+ /* Only re-display visible windows which need updating. */
+ if (((win->flags & W_WindowVisible) == 0) ||
+ ((win->flags & W_UpdateWindow) == 0) ||
+ (win->height == 0))
+ continue;
+
+ display_update_one_window (win);
+ if (display_was_interrupted_p)
+ break;
+ }
+
+ /* Always update the echo area. */
+ display_update_one_window (the_echo_area);
+}
+
+void
+handle_tag_start (char *tag)
+{
+ /* TODO really handle this tag. */
+ return;
+}
+
+void
+handle_tag_end (char *tag)
+{
+ /* TODO really handle this tag. */
+ return;
+}
+
+void
+handle_tag (char *tag)
+{
+ if (tag[0] == '/')
+ {
+ tag++;
+ handle_tag_end (tag);
+ }
+ else
+ handle_tag_start (tag);
+}
+
+/* Display WIN on the_display. Unlike display_update_display (), this
+ function only does one window. */
+void
+display_update_one_window (WINDOW *win)
+{
+ register char *nodetext; /* Current character to display. */
+ register char *last_node_char; /* Position of the last character in node. */
+ register int i; /* General use index. */
+ char *printed_line; /* Buffer for a printed line. */
+ int pl_index = 0; /* Index into PRINTED_LINE. */
+ int line_index = 0; /* Number of lines done so far. */
+ int pl_ignore = 0; /* How many chars use zero width on screen. */
+ int allocated_win_width;
+ DISPLAY_LINE **display = the_display;
+
+ /* If display is inhibited, that counts as an interrupted display. */
+ if (display_inhibited)
+ display_was_interrupted_p = 1;
+
+ /* If the window has no height, or display is inhibited, quit now. */
+ if (!win->height || display_inhibited)
+ return;
+
+ /* If the window's first row doesn't appear in the_screen, then it
+ cannot be displayed. This can happen when the_echo_area is the
+ window to be displayed, and the screen has shrunk to less than one
+ line. */
+ if ((win->first_row < 0) || (win->first_row > the_screen->height))
+ return;
+
+ /* Print each line in the window into our local buffer, and then
+ check the contents of that buffer against the display. If they
+ differ, update the display. */
+ allocated_win_width = win->width + 1;
+ printed_line = (char *)xmalloc (allocated_win_width);
+
+ if (!win->node || !win->line_starts)
+ goto done_with_node_display;
+
+ nodetext = win->line_starts[win->pagetop];
+ last_node_char = win->node->contents + win->node->nodelen;
+
+ for (; nodetext < last_node_char; nodetext++)
+ {
+ char *rep = NULL, *rep_carried_over, rep_temp[2];
+ int replen;
+
+ if (isprint (*nodetext))
+ {
+ rep_temp[0] = *nodetext;
+ replen = 1;
+ rep_temp[1] = '\0';
+ rep = rep_temp;
+ }
+ else
+ {
+ if (*nodetext == '\r' || *nodetext == '\n')
+ {
+ replen = win->width - pl_index + pl_ignore;
+ }
+ else if (*nodetext == '\0'
+ && (nodetext + 2) < last_node_char
+ && *(nodetext + 1) == '\b'
+ && *(nodetext + 2) == '[')
+ {
+ /* Found new style tag/cookie \0\b[
+ Read until the closing tag \0\b] */
+ int element_len = 0;
+ char *element;
+
+ /* Skip the escapes. */
+ nodetext += 3;
+
+ while (!(*nodetext == '\0'
+ && *(nodetext + 1) == '\b'
+ && *(nodetext + 2) == ']'))
+ {
+ nodetext++;
+ element_len++;
+ }
+
+ element = (char *) malloc (element_len + 1);
+ strncpy (element, nodetext - element_len, element_len);
+
+ /* Skip the escapes. */
+ nodetext += 2;
+ pl_ignore += element_len + 5;
+ /* Append string terminator. */
+ element[element_len] = '\0';
+
+ handle_tag (element);
+
+ /* Over and out */
+ free (element);
+
+ continue;
+ }
+ else
+ {
+ rep = printed_representation (*nodetext, pl_index);
+ replen = strlen (rep);
+ }
+ }
+
+ /* Support ANSI escape sequences under -R. */
+ if (raw_escapes_p
+ && *nodetext == '\033'
+ && nodetext[1] == '['
+ && isdigit (nodetext[2]))
+ {
+ if (nodetext[3] == 'm')
+ pl_ignore += 4;
+ else if (isdigit (nodetext[3]) && nodetext[4] == 'm')
+ pl_ignore += 5;
+ }
+ while (pl_index + 2 >= allocated_win_width - 1)
+ {
+ allocated_win_width *= 2;
+ printed_line = (char *)xrealloc (printed_line, allocated_win_width);
+ }
+
+ /* If this character can be printed without passing the width of
+ the line, then stuff it into the line. */
+ if (replen + pl_index < win->width + pl_ignore)
+ {
+ /* Optimize if possible. */
+ if (replen == 1)
+ {
+ printed_line[pl_index++] = *rep;
+ }
+ else
+ {
+ for (i = 0; i < replen; i++)
+ printed_line[pl_index++] = rep[i];
+ }
+ }
+ else
+ {
+ DISPLAY_LINE *entry;
+
+ /* If this character cannot be printed in this line, we have
+ found the end of this line as it would appear on the screen.
+ Carefully print the end of the line, and then compare. */
+ if (*nodetext == '\n' || *nodetext == '\r' || *nodetext == '\t')
+ {
+ printed_line[pl_index] = '\0';
+ rep_carried_over = (char *)NULL;
+ }
+ else
+ {
+ /* The printed representation of this character extends into
+ the next line. Remember the offset of the last character
+ printed out of REP so that we can carry the character over
+ to the next line. */
+ for (i = 0; pl_index < (win->width + pl_ignore - 1);)
+ printed_line[pl_index++] = rep[i++];
+
+ rep_carried_over = rep + i;
+
+ /* If printing the last character in this window couldn't
+ possibly cause the screen to scroll, place a backslash
+ in the rightmost column. */
+ if (1 + line_index + win->first_row < the_screen->height)
+ {
+ if (win->flags & W_NoWrap)
+ printed_line[pl_index++] = '$';
+ else
+ printed_line[pl_index++] = '\\';
+ }
+ printed_line[pl_index] = '\0';
+ }
+
+ /* We have the exact line as it should appear on the screen.
+ Check to see if this line matches the one already appearing
+ on the screen. */
+ entry = display[line_index + win->first_row];
+
+ /* If the screen line is inversed, then we have to clear
+ the line from the screen first. Why, I don't know.
+ (But don't do this if we have no visible entries, as can
+ happen if the window is shrunk very small.) */
+ if ((entry && entry->inverse)
+ /* Need to erase the line if it has escape sequences. */
+ || (raw_escapes_p && strchr (entry->text, '\033') != 0))
+ {
+ terminal_goto_xy (0, line_index + win->first_row);
+ terminal_clear_to_eol ();
+ entry->inverse = 0;
+ entry->text[0] = '\0';
+ entry->textlen = 0;
+ }
+
+ /* Find the offset where these lines differ. */
+ for (i = 0; i < pl_index; i++)
+ if (printed_line[i] != entry->text[i])
+ break;
+
+ /* If the lines are not the same length, or if they differed
+ at all, we must do some redrawing. */
+ if ((i != pl_index) || (pl_index != entry->textlen))
+ {
+ /* Move to the proper point on the terminal. */
+ terminal_goto_xy (i, line_index + win->first_row);
+
+ /* If there is any text to print, print it. */
+ if (i != pl_index)
+ terminal_put_text (printed_line + i);
+
+ /* If the printed text didn't extend all the way to the edge
+ of the window, and text was appearing between here and the
+ edge of the window, clear from here to the end of the line. */
+ if ((pl_index < win->width + pl_ignore
+ && pl_index < entry->textlen)
+ || (entry->inverse))
+ terminal_clear_to_eol ();
+
+ fflush (stdout);
+
+ /* Update the display text buffer. */
+ if (strlen (printed_line) > (unsigned int) screenwidth)
+ /* printed_line[] can include more than screenwidth
+ characters if we are under -R and there are escape
+ sequences in it. However, entry->text was
+ allocated (in display_initialize_display) for
+ screenwidth characters only. */
+ entry->text = xrealloc (entry->text, strlen (printed_line)+1);
+ strcpy (entry->text + i, printed_line + i);
+ entry->textlen = pl_index;
+
+ /* Lines showing node text are not in inverse. Only modelines
+ have that distinction. */
+ entry->inverse = 0;
+ }
+
+ /* We have done at least one line. Increment our screen line
+ index, and check against the bottom of the window. */
+ if (++line_index == win->height)
+ break;
+
+ /* A line has been displayed, and the screen reflects that state.
+ If there is typeahead pending, then let that typeahead be read
+ now, instead of continuing with the display. */
+ if (info_any_buffered_input_p ())
+ {
+ free (printed_line);
+ display_was_interrupted_p = 1;
+ return;
+ }
+
+ /* Reset PL_INDEX to the start of the line. */
+ pl_index = 0;
+ pl_ignore = 0; /* this is computed per line */
+
+ /* If there are characters from REP left to print, stuff them
+ into the buffer now. */
+ if (rep_carried_over)
+ for (; rep[pl_index]; pl_index++)
+ printed_line[pl_index] = rep[pl_index];
+
+ /* If this window has chosen not to wrap lines, skip to the end
+ of the physical line in the buffer, and start a new line here. */
+ if (pl_index && (win->flags & W_NoWrap))
+ {
+ char *begin;
+
+ pl_index = 0;
+ printed_line[0] = '\0';
+
+ begin = nodetext;
+
+ while ((nodetext < last_node_char) && (*nodetext != '\n'))
+ nodetext++;
+ }
+ }
+ }
+
+ done_with_node_display:
+ /* We have reached the end of the node or the end of the window. If it
+ is the end of the node, then clear the lines of the window from here
+ to the end of the window. */
+ for (; line_index < win->height; line_index++)
+ {
+ DISPLAY_LINE *entry = display[line_index + win->first_row];
+
+ /* If this line has text on it then make it go away. */
+ if (entry && entry->textlen)
+ {
+ entry->textlen = 0;
+ entry->text[0] = '\0';
+
+ terminal_goto_xy (0, line_index + win->first_row);
+ terminal_clear_to_eol ();
+ }
+ }
+
+ /* Finally, if this window has a modeline it might need to be redisplayed.
+ Check the window's modeline against the one in the display, and update
+ if necessary. */
+ if ((win->flags & W_InhibitMode) == 0)
+ {
+ window_make_modeline (win);
+ line_index = win->first_row + win->height;
+
+ /* This display line must both be in inverse, and have the same
+ contents. */
+ if ((!display[line_index]->inverse) ||
+ (strcmp (display[line_index]->text, win->modeline) != 0))
+ {
+ terminal_goto_xy (0, line_index);
+ terminal_begin_inverse ();
+ terminal_put_text (win->modeline);
+ terminal_end_inverse ();
+ strcpy (display[line_index]->text, win->modeline);
+ display[line_index]->inverse = 1;
+ display[line_index]->textlen = strlen (win->modeline);
+ fflush (stdout);
+ }
+ }
+
+ /* Okay, this window doesn't need updating anymore. */
+ win->flags &= ~W_UpdateWindow;
+ free (printed_line);
+ fflush (stdout);
+}
+
+/* Scroll the region of the_display starting at START, ending at END, and
+ moving the lines AMOUNT lines. If AMOUNT is less than zero, the lines
+ are moved up in the screen, otherwise down. Actually, it is possible
+ for no scrolling to take place in the case that the terminal doesn't
+ support it. This doesn't matter to us. */
+void
+display_scroll_display (int start, int end, int amount)
+{
+ register int i, last;
+ DISPLAY_LINE *temp;
+
+ /* If this terminal cannot do scrolling, give up now. */
+ if (!terminal_can_scroll)
+ return;
+
+ /* If there isn't anything displayed on the screen because it is too
+ small, quit now. */
+ if (!the_display[0])
+ return;
+
+ /* If there is typeahead pending, then don't actually do any scrolling. */
+ if (info_any_buffered_input_p ())
+ return;
+
+ /* Do it on the screen. */
+ terminal_scroll_terminal (start, end, amount);
+
+ /* Now do it in the display buffer so our contents match the screen. */
+ if (amount > 0)
+ {
+ last = end + amount;
+
+ /* Shift the lines to scroll right into place. */
+ for (i = 0; i < (end - start); i++)
+ {
+ temp = the_display[last - i];
+ the_display[last - i] = the_display[end - i];
+ the_display[end - i] = temp;
+ }
+
+ /* The lines have been shifted down in the buffer. Clear all of the
+ lines that were vacated. */
+ for (i = start; i != (start + amount); i++)
+ {
+ the_display[i]->text[0] = '\0';
+ the_display[i]->textlen = 0;
+ the_display[i]->inverse = 0;
+ }
+ }
+
+ if (amount < 0)
+ {
+ last = start + amount;
+ for (i = 0; i < (end - start); i++)
+ {
+ temp = the_display[last + i];
+ the_display[last + i] = the_display[start + i];
+ the_display[start + i] = temp;
+ }
+
+ /* The lines have been shifted up in the buffer. Clear all of the
+ lines that are left over. */
+ for (i = end + amount; i != end; i++)
+ {
+ the_display[i]->text[0] = '\0';
+ the_display[i]->textlen = 0;
+ the_display[i]->inverse = 0;
+ }
+ }
+}
+
+/* Try to scroll lines in WINDOW. OLD_PAGETOP is the pagetop of WINDOW before
+ having had its line starts recalculated. OLD_STARTS is the list of line
+ starts that used to appear in this window. OLD_COUNT is the number of lines
+ that appear in the OLD_STARTS array. */
+void
+display_scroll_line_starts (WINDOW *window, int old_pagetop,
+ char **old_starts, int old_count)
+{
+ register int i, old, new; /* Indices into the line starts arrays. */
+ int last_new, last_old; /* Index of the last visible line. */
+ int old_first, new_first; /* Index of the first changed line. */
+ int unchanged_at_top = 0;
+ int already_scrolled = 0;
+
+ /* Locate the first line which was displayed on the old window. */
+ old_first = old_pagetop;
+ new_first = window->pagetop;
+
+ /* Find the last line currently visible in this window. */
+ last_new = window->pagetop + (window->height - 1);
+ if (last_new > window->line_count)
+ last_new = window->line_count - 1;
+
+ /* Find the last line which used to be currently visible in this window. */
+ last_old = old_pagetop + (window->height - 1);
+ if (last_old > old_count)
+ last_old = old_count - 1;
+
+ for (old = old_first, new = new_first;
+ old < last_old && new < last_new;
+ old++, new++)
+ if (old_starts[old] != window->line_starts[new])
+ break;
+ else
+ unchanged_at_top++;
+
+ /* Loop through the old lines looking for a match in the new lines. */
+ for (old = old_first + unchanged_at_top; old < last_old; old++)
+ {
+ for (new = new_first; new < last_new; new++)
+ if (old_starts[old] == window->line_starts[new])
+ {
+ /* Find the extent of the matching lines. */
+ for (i = 0; (old + i) < last_old; i++)
+ if (old_starts[old + i] != window->line_starts[new + i])
+ break;
+
+ /* Scroll these lines if there are enough of them. */
+ {
+ int start, end, amount;
+
+ start = (window->first_row
+ + ((old + already_scrolled) - old_pagetop));
+ amount = new - (old + already_scrolled);
+ end = window->first_row + window->height;
+
+ /* If we are shifting the block of lines down, then the last
+ AMOUNT lines will become invisible. Thus, don't bother
+ scrolling them. */
+ if (amount > 0)
+ end -= amount;
+
+ if ((end - start) > 0)
+ {
+ display_scroll_display (start, end, amount);
+
+ /* Some lines have been scrolled. Simulate the scrolling
+ by offsetting the value of the old index. */
+ old += i;
+ already_scrolled += amount;
+ }
+ }
+ }
+ }
+}
+
+/* Move the screen cursor to directly over the current character in WINDOW. */
+void
+display_cursor_at_point (WINDOW *window)
+{
+ int vpos, hpos;
+
+ vpos = window_line_of_point (window) - window->pagetop + window->first_row;
+ hpos = window_get_cursor_column (window);
+ terminal_goto_xy (hpos, vpos);
+ fflush (stdout);
+}
+
+/* **************************************************************** */
+/* */
+/* Functions Static to this File */
+/* */
+/* **************************************************************** */
+
+/* Make a DISPLAY_LINE ** with width and height. */
+static DISPLAY_LINE **
+make_display (int width, int height)
+{
+ register int i;
+ DISPLAY_LINE **display;
+
+ display = (DISPLAY_LINE **)xmalloc ((1 + height) * sizeof (DISPLAY_LINE *));
+
+ for (i = 0; i < height; i++)
+ {
+ display[i] = (DISPLAY_LINE *)xmalloc (sizeof (DISPLAY_LINE));
+ display[i]->text = (char *)xmalloc (1 + width);
+ display[i]->textlen = 0;
+ display[i]->inverse = 0;
+ }
+ display[i] = (DISPLAY_LINE *)NULL;
+ return (display);
+}
+
+/* Free the storage allocated to DISPLAY. */
+static void
+free_display (DISPLAY_LINE **display)
+{
+ register int i;
+ register DISPLAY_LINE *display_line;
+
+ if (!display)
+ return;
+
+ for (i = 0; (display_line = display[i]); i++)
+ {
+ free (display_line->text);
+ free (display_line);
+ }
+ free (display);
+}
diff --git a/Build/source/utils/texinfo/info/display.h b/Build/source/utils/texinfo/info/display.h
new file mode 100644
index 00000000000..286db293ee2
--- /dev/null
+++ b/Build/source/utils/texinfo/info/display.h
@@ -0,0 +1,78 @@
+/* display.h -- How the display in Info is done.
+ $Id: display.h,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_DISPLAY_H
+#define INFO_DISPLAY_H
+
+#include "info-utils.h"
+#include "terminal.h"
+
+typedef struct {
+ char *text; /* Text of the line as it appears. */
+ int textlen; /* Printable Length of TEXT. */
+ int inverse; /* Non-zero means this line is inverse. */
+} DISPLAY_LINE;
+
+/* An array of display lines which tell us what is currently visible on
+ the display. */
+extern DISPLAY_LINE **the_display;
+
+/* Non-zero means do no output. */
+extern int display_inhibited;
+
+/* Non-zero if we didn't completely redisplay a window. */
+extern int display_was_interrupted_p;
+
+/* Initialize THE_DISPLAY to WIDTH and HEIGHT, with nothing in it. */
+extern void display_initialize_display (int width, int height);
+
+/* Clear all of the lines in DISPLAY making the screen blank. */
+extern void display_clear_display (DISPLAY_LINE **display);
+
+/* Update the windows pointed to by WINDOWS in THE_DISPLAY. This actually
+ writes the text on the screen. */
+extern void display_update_display (WINDOW *window);
+
+/* Display WIN on THE_DISPLAY. Unlike display_update_display (), this
+ function only does one window. */
+extern void display_update_one_window (WINDOW *win);
+
+/* Move the screen cursor to directly over the current character in WINDOW. */
+extern void display_cursor_at_point (WINDOW *window);
+
+/* Scroll the region of the_display starting at START, ending at END, and
+ moving the lines AMOUNT lines. If AMOUNT is less than zero, the lines
+ are moved up in the screen, otherwise down. Actually, it is possible
+ for no scrolling to take place in the case that the terminal doesn't
+ support it. This doesn't matter to us. */
+extern void display_scroll_display (int start, int end, int amount);
+
+/* Try to scroll lines in WINDOW. OLD_PAGETOP is the pagetop of WINDOW before
+ having had its line starts recalculated. OLD_STARTS is the list of line
+ starts that used to appear in this window. OLD_COUNT is the number of lines
+ that appear in the OLD_STARTS array. */
+extern void display_scroll_line_starts (WINDOW *window, int old_pagetop,
+ char **old_starts, int old_count);
+
+#endif /* not INFO_DISPLAY_H */
diff --git a/Build/source/utils/texinfo/info/doc.h b/Build/source/utils/texinfo/info/doc.h
new file mode 100644
index 00000000000..9315e8adc36
--- /dev/null
+++ b/Build/source/utils/texinfo/info/doc.h
@@ -0,0 +1,103 @@
+/* doc.h -- Structures associating function pointers with documentation.
+ $Id: doc.h,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 2001, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#if !defined (DOC_H)
+#define DOC_H
+
+#include "info.h" /* for NAMED_FUNCTIONS, VFunction, etc. */
+
+#if defined (INFOKEY)
+/* For each function, we keep track of the first defined key sequence
+ which invokes that function, for each different map. This is so that
+ the dynamic documentation generation in infodoc.c (a) doesn't have to
+ search through copious KEYMAP_ENTRYs, and, more importantly, (b) the
+ user and programmer can choose the preferred key sequence that is
+ printed for any given function -- it's just the first one that
+ appears in the user's infokey file or the default keymaps in
+ infomap.c.
+
+ Each FUNCTION_DOC has a linked list of FUNCTION_KEYSEQ structs
+ hanging off it, which are created on startup when the user and/or
+ default keymaps are being parsed. */
+typedef struct function_keyseq
+{
+ struct function_keyseq *next;
+ struct keymap_entry *map;
+ char *keyseq;
+} FUNCTION_KEYSEQ;
+
+#endif /* INFOKEY */
+
+
+/* An array of FUNCTION_DOC structures is defined in doc.c, which is
+ automagically generated by the makedoc utility, whose job is to scan
+ through the source files for command function declarations and
+ compile a list of all the ones it finds. This saves tedious
+ housekeeping and avoids errors of omission. */
+typedef struct
+{
+ VFunction *func;
+#if defined (NAMED_FUNCTIONS)
+ char *func_name;
+#endif /* NAMED_FUNCTIONS */
+#if defined (INFOKEY)
+ FUNCTION_KEYSEQ *keys;
+#endif /* INFOKEY */
+ char *doc;
+} FUNCTION_DOC;
+
+extern FUNCTION_DOC function_doc_array[];
+
+/* Under the old key-binding system, an info command is specified by
+ the pointer to its function. Under the new INFOKEY binding system,
+ it is specified by a pointer to the command's FUNCTION_DOC structure,
+ defined in doc.c, from which the pointer to the function can be
+ easily divined using the InfoFunction() extractor. */
+#if defined(INFOKEY)
+typedef FUNCTION_DOC InfoCommand;
+/* The cast to VFunction * prevents pgcc from complaining about
+ dereferencing a void *. */
+#define InfoFunction(ic) ((ic) ? (ic)->func : (VFunction *) NULL)
+#define InfoCmd(fn) (&function_doc_array[A_##fn])
+#define DocInfoCmd(fd) ((fd) && (fd)->func ? (fd) : NULL)
+#else /* !INFOKEY */
+typedef VFunction InfoCommand;
+#define InfoFunction(vf) ((vf))
+#define InfoCmd(fn) fn
+#define DocInfoCmd(fd) ((fd)->func)
+#endif /* !INFOKEY */
+
+#include "infomap.h" /* for Keymap. */
+
+#if defined (NAMED_FUNCTIONS)
+extern char *function_name (InfoCommand *cmd);
+extern InfoCommand *named_function (char *name);
+#endif /* NAMED_FUNCTIONS */
+
+extern char *function_documentation (InfoCommand *cmd);
+extern char *key_documentation (char key, Keymap map);
+extern char *pretty_keyname (unsigned char key);
+extern char *pretty_keyseq (char *keyseq);
+extern char *where_is (Keymap map, InfoCommand *cmd);
+extern char *replace_in_documentation (char *string, int help_is_only_window_p);
+extern void dump_map_to_message_buffer (char *prefix, Keymap map);
+
+#endif /* !DOC_H */
diff --git a/Build/source/utils/texinfo/info/dribble.c b/Build/source/utils/texinfo/info/dribble.c
new file mode 100644
index 00000000000..d4563193661
--- /dev/null
+++ b/Build/source/utils/texinfo/info/dribble.c
@@ -0,0 +1,68 @@
+/* dribble.c -- dribble files for Info.
+ $Id: dribble.c,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1998, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "dribble.h"
+
+/* When non-zero, it is a stream to write all input characters to for the
+ duration of this info session. */
+FILE *info_dribble_file = (FILE *)NULL;
+
+/* Open a dribble file named NAME, perhaps closing an already open one.
+ This sets the global variable INFO_DRIBBLE_FILE to the open stream. */
+void
+open_dribble_file (char *name)
+{
+ /* Perhaps close existing dribble file. */
+ close_dribble_file ();
+
+ /* Keystrokes can be non-printable characters, so we need binary I/O. */
+ info_dribble_file = fopen (name, FOPEN_WBIN);
+
+#if defined (HAVE_SETVBUF)
+ if (info_dribble_file)
+# if defined (SETVBUF_REVERSED)
+ setvbuf (info_dribble_file, _IONBF, (char *)NULL, 1);
+# else
+ setvbuf (info_dribble_file, (char *)NULL, _IONBF, 1);
+# endif /* !SETVBUF_REVERSED */
+#endif /* HAVE_SETVBUF */
+}
+
+/* If there is a dribble file already open, close it. */
+void
+close_dribble_file (void)
+{
+ if (info_dribble_file)
+ {
+ fflush (info_dribble_file);
+ fclose (info_dribble_file);
+ info_dribble_file = (FILE *)NULL;
+ }
+}
+
+/* Write some output to our existing dribble file. */
+void
+dribble (unsigned char byte)
+{
+ if (info_dribble_file)
+ fwrite (&byte, sizeof (unsigned char), 1, info_dribble_file);
+}
diff --git a/Build/source/utils/texinfo/info/dribble.h b/Build/source/utils/texinfo/info/dribble.h
new file mode 100644
index 00000000000..f30f2040d8e
--- /dev/null
+++ b/Build/source/utils/texinfo/info/dribble.h
@@ -0,0 +1,41 @@
+/* dribble.h -- Functions and vars declared in dribble.c. */
+
+/* This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#if !defined (_DRIBBLE_H_)
+#define _DRIBBLE_H_
+
+/* When non-zero, it is a stream to write all input characters to for the
+ duration of this info session. */
+extern FILE *info_dribble_file;
+
+/* Open a dribble file named NAME, perhaps closing an already open one.
+ This sets the global variable INFO_DRIBBLE_FILE to the open stream. */
+extern void open_dribble_file (char *name);
+
+/* If there is a dribble file already open, close it. */
+extern void close_dribble_file (void);
+
+/* Write some output to our existing dribble file. */
+extern void dribble (unsigned char byte);
+
+#endif /* !_DRIBBLE_H_ */
diff --git a/Build/source/utils/texinfo/info/echo-area.c b/Build/source/utils/texinfo/info/echo-area.c
new file mode 100644
index 00000000000..31385c88a37
--- /dev/null
+++ b/Build/source/utils/texinfo/info/echo-area.c
@@ -0,0 +1,1524 @@
+/* echo-area.c -- how to read a line in the echo area.
+ $Id: echo-area.c,v 1.7 2004/12/14 00:15:36 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2001, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+#if defined (FD_SET)
+# if defined (hpux)
+# define fd_set_cast(x) (int *)(x)
+# else
+# define fd_set_cast(x) (fd_set *)(x)
+# endif /* !hpux */
+#endif /* FD_SET */
+
+/* Non-zero means that C-g was used to quit reading input. */
+int info_aborted_echo_area = 0;
+
+/* Non-zero means that the echo area is being used to read input. */
+int echo_area_is_active = 0;
+
+/* The address of the last command executed in the echo area. */
+VFunction *ea_last_executed_command = (VFunction *)NULL;
+
+/* Non-zero means that the last command executed while reading input
+ killed some text. */
+int echo_area_last_command_was_kill = 0;
+
+/* Variables which hold on to the current state of the input line. */
+static char input_line[1 + EA_MAX_INPUT];
+static char *input_line_prompt;
+static int input_line_point;
+static int input_line_beg;
+static int input_line_end;
+static NODE input_line_node = {
+ (char *)NULL, (char *)NULL, (char *)NULL, input_line,
+ EA_MAX_INPUT, 0, N_IsInternal
+};
+
+static void echo_area_initialize_node (void);
+static void push_echo_area (void), pop_echo_area (void);
+static int echo_area_stack_contains_completions_p (void);
+
+static void ea_kill_text (int from, int to);
+
+/* Non-zero means we force the user to complete. */
+static int echo_area_must_complete_p = 0;
+static int completions_window_p (WINDOW *window);
+
+/* If non-null, this is a window which was specifically created to display
+ possible completions output. We remember it so we can delete it when
+ appropriate. */
+static WINDOW *echo_area_completions_window = (WINDOW *)NULL;
+
+/* Variables which keep track of the window which was active prior to
+ entering the echo area. */
+static WINDOW *calling_window = (WINDOW *)NULL;
+static NODE *calling_window_node = (NODE *)NULL;
+static long calling_window_point = 0;
+static long calling_window_pagetop = 0;
+
+/* Remember the node and pertinent variables of the calling window. */
+static void
+remember_calling_window (WINDOW *window)
+{
+ /* Only do this if the calling window is not the completions window, or,
+ if it is the completions window and there is no other window. */
+ if (!completions_window_p (window) ||
+ ((window == windows) && !(window->next)))
+ {
+ calling_window = window;
+ calling_window_node = window->node;
+ calling_window_point = window->point;
+ calling_window_pagetop = window->pagetop;
+ }
+}
+
+/* Restore the caller's window so that it shows the node that it was showing
+ on entry to info_read_xxx_echo_area (). */
+static void
+restore_calling_window (void)
+{
+ register WINDOW *win, *compwin = (WINDOW *)NULL;
+
+ /* If the calling window is still visible, and it is the window that
+ we used for completions output, then restore the calling window. */
+ for (win = windows; win; win = win->next)
+ {
+ if (completions_window_p (win))
+ compwin = win;
+
+ if (win == calling_window && win == compwin)
+ {
+ window_set_node_of_window (calling_window, calling_window_node);
+ calling_window->point = calling_window_point;
+ calling_window->pagetop = calling_window_pagetop;
+ compwin = (WINDOW *)NULL;
+ break;
+ }
+ }
+
+ /* Delete the completions window if it is still present, it isn't the
+ last window on the screen, and there aren't any prior echo area reads
+ pending which created a completions window. */
+ if (compwin)
+ {
+ if ((compwin != windows || windows->next) &&
+ !echo_area_stack_contains_completions_p ())
+ {
+ WINDOW *next;
+ int pagetop = 0;
+ int start = 0;
+ int end = 0;
+ int amount = 0;
+
+ next = compwin->next;
+ if (next)
+ {
+ start = next->first_row;
+ end = start + next->height;
+ amount = - (compwin->height + 1);
+ pagetop = next->pagetop;
+ }
+
+ info_delete_window_internal (compwin);
+
+ /* This is not necessary because info_delete_window_internal ()
+ calls echo_area_inform_of_deleted_window (), which does the
+ right thing. */
+#if defined (UNNECESSARY)
+ echo_area_completions_window = (WINDOW *)NULL;
+#endif /* UNNECESSARY */
+
+ if (next)
+ {
+ display_scroll_display (start, end, amount);
+ next->pagetop = pagetop;
+ display_update_display (windows);
+ }
+ }
+ }
+}
+
+/* Set up a new input line with PROMPT. */
+static void
+initialize_input_line (char *prompt)
+{
+ input_line_prompt = prompt;
+ if (prompt)
+ strcpy (input_line, prompt);
+ else
+ input_line[0] = '\0';
+
+ input_line_beg = input_line_end = input_line_point = strlen (prompt);
+}
+
+static char *
+echo_area_after_read (void)
+{
+ char *return_value;
+
+ if (info_aborted_echo_area)
+ {
+ info_aborted_echo_area = 0;
+ return_value = (char *)NULL;
+ }
+ else
+ {
+ if (input_line_beg == input_line_end)
+ return_value = xstrdup ("");
+ else
+ {
+ int line_len = input_line_end - input_line_beg;
+ return_value = (char *) xmalloc (1 + line_len);
+ strncpy (return_value, &input_line[input_line_beg], line_len);
+ return_value[line_len] = '\0';
+ }
+ }
+ return (return_value);
+}
+
+/* Read a line of text in the echo area. Return a malloc ()'ed string,
+ or NULL if the user aborted out of this read. WINDOW is the currently
+ active window, so that we can restore it when we need to. PROMPT, if
+ non-null, is a prompt to print before reading the line. */
+char *
+info_read_in_echo_area (WINDOW *window, char *prompt)
+{
+ char *line;
+
+ /* If the echo area is already active, remember the current state. */
+ if (echo_area_is_active)
+ push_echo_area ();
+
+ /* Initialize our local variables. */
+ initialize_input_line (prompt);
+
+ /* Initialize the echo area for the first (but maybe not the last) time. */
+ echo_area_initialize_node ();
+
+ /* Save away the original node of this window, and the window itself,
+ so echo area commands can temporarily use this window. */
+ remember_calling_window (window);
+
+ /* Let the rest of Info know that the echo area is active. */
+ echo_area_is_active++;
+ active_window = the_echo_area;
+
+ /* Read characters in the echo area. */
+ info_read_and_dispatch ();
+
+ echo_area_is_active--;
+
+ /* Restore the original active window and show point in it. */
+ active_window = calling_window;
+ restore_calling_window ();
+ display_cursor_at_point (active_window);
+ fflush (stdout);
+
+ /* Get the value of the line. */
+ line = echo_area_after_read ();
+
+ /* If there is a previous loop waiting for us, restore it now. */
+ if (echo_area_is_active)
+ pop_echo_area ();
+
+ /* Return the results to the caller. */
+ return (line);
+}
+
+/* (re) Initialize the echo area node. */
+static void
+echo_area_initialize_node (void)
+{
+ register int i;
+
+ for (i = input_line_end; (unsigned int) i < sizeof (input_line); i++)
+ input_line[i] = ' ';
+
+ input_line[i - 1] = '\n';
+ window_set_node_of_window (the_echo_area, &input_line_node);
+ input_line[input_line_end] = '\n';
+}
+
+/* Prepare to read characters in the echo area. This can initialize the
+ echo area node, but its primary purpose is to side effect the input
+ line buffer contents. */
+void
+echo_area_prep_read (void)
+{
+ if (the_echo_area->node != &input_line_node)
+ echo_area_initialize_node ();
+
+ the_echo_area->point = input_line_point;
+ input_line[input_line_end] = '\n';
+ display_update_one_window (the_echo_area);
+ display_cursor_at_point (active_window);
+}
+
+
+/* **************************************************************** */
+/* */
+/* Echo Area Movement Commands */
+/* */
+/* **************************************************************** */
+
+DECLARE_INFO_COMMAND (ea_forward, _("Move forward a character"))
+{
+ if (count < 0)
+ ea_backward (window, -count, key);
+ else
+ {
+ input_line_point += count;
+ if (input_line_point > input_line_end)
+ input_line_point = input_line_end;
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_backward, _("Move backward a character"))
+{
+ if (count < 0)
+ ea_forward (window, -count, key);
+ else
+ {
+ input_line_point -= count;
+ if (input_line_point < input_line_beg)
+ input_line_point = input_line_beg;
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_beg_of_line, _("Move to the start of this line"))
+{
+ input_line_point = input_line_beg;
+}
+
+DECLARE_INFO_COMMAND (ea_end_of_line, _("Move to the end of this line"))
+{
+ input_line_point = input_line_end;
+}
+
+#define alphabetic(c) (islower (c) || isupper (c) || isdigit (c))
+
+/* Move forward a word in the input line. */
+DECLARE_INFO_COMMAND (ea_forward_word, _("Move forward a word"))
+{
+ int c;
+
+ if (count < 0)
+ ea_backward_word (window, -count, key);
+ else
+ {
+ while (count--)
+ {
+ if (input_line_point == input_line_end)
+ return;
+
+ /* If we are not in a word, move forward until we are in one.
+ Then, move forward until we hit a non-alphabetic character. */
+ c = input_line[input_line_point];
+
+ if (!alphabetic (c))
+ {
+ while (++input_line_point < input_line_end)
+ {
+ c = input_line[input_line_point];
+ if (alphabetic (c))
+ break;
+ }
+ }
+
+ if (input_line_point == input_line_end)
+ return;
+
+ while (++input_line_point < input_line_end)
+ {
+ c = input_line[input_line_point];
+ if (!alphabetic (c))
+ break;
+ }
+ }
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_backward_word, _("Move backward a word"))
+{
+ int c;
+
+ if (count < 0)
+ ea_forward_word (window, -count, key);
+ else
+ {
+ while (count--)
+ {
+ if (input_line_point == input_line_beg)
+ return;
+
+ /* Like ea_forward_word (), except that we look at the
+ characters just before point. */
+
+ c = input_line[input_line_point - 1];
+
+ if (!alphabetic (c))
+ {
+ while ((--input_line_point) != input_line_beg)
+ {
+ c = input_line[input_line_point - 1];
+ if (alphabetic (c))
+ break;
+ }
+ }
+
+ while (input_line_point != input_line_beg)
+ {
+ c = input_line[input_line_point - 1];
+ if (!alphabetic (c))
+ break;
+ else
+ --input_line_point;
+ }
+ }
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_delete, _("Delete the character under the cursor"))
+{
+ register int i;
+
+ if (count < 0)
+ ea_rubout (window, -count, key);
+ else
+ {
+ if (input_line_point == input_line_end)
+ return;
+
+ if (info_explicit_arg || count > 1)
+ {
+ int orig_point;
+
+ orig_point = input_line_point;
+ ea_forward (window, count, key);
+ ea_kill_text (orig_point, input_line_point);
+ input_line_point = orig_point;
+ }
+ else
+ {
+ for (i = input_line_point; i < input_line_end; i++)
+ input_line[i] = input_line[i + 1];
+
+ input_line_end--;
+ }
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_rubout, _("Delete the character behind the cursor"))
+{
+ if (count < 0)
+ ea_delete (window, -count, key);
+ else
+ {
+ int start;
+
+ if (input_line_point == input_line_beg)
+ return;
+
+ start = input_line_point;
+ ea_backward (window, count, key);
+
+ if (info_explicit_arg || count > 1)
+ ea_kill_text (start, input_line_point);
+ else
+ ea_delete (window, count, key);
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_abort, _("Cancel or quit operation"))
+{
+ /* If any text, just discard it, and restore the calling window's node.
+ If no text, quit. */
+ if (input_line_end != input_line_beg)
+ {
+ terminal_ring_bell ();
+ input_line_end = input_line_point = input_line_beg;
+ if (calling_window->node != calling_window_node)
+ restore_calling_window ();
+ }
+ else
+ info_aborted_echo_area = 1;
+}
+
+DECLARE_INFO_COMMAND (ea_newline, _("Accept (or force completion of) this line"))
+{
+ /* Stub does nothing. Simply here to see if it has been executed. */
+}
+
+DECLARE_INFO_COMMAND (ea_quoted_insert, _("Insert next character verbatim"))
+{
+ unsigned char character;
+
+ character = info_get_another_input_char ();
+ ea_insert (window, count, character);
+}
+
+DECLARE_INFO_COMMAND (ea_insert, _("Insert this character"))
+{
+ register int i;
+
+ if ((input_line_end + 1) == EA_MAX_INPUT)
+ {
+ terminal_ring_bell ();
+ return;
+ }
+
+ for (i = input_line_end + 1; i != input_line_point; i--)
+ input_line[i] = input_line[i - 1];
+
+ input_line[input_line_point] = key;
+ input_line_point++;
+ input_line_end++;
+}
+
+DECLARE_INFO_COMMAND (ea_tab_insert, _("Insert a TAB character"))
+{
+ ea_insert (window, count, '\t');
+}
+
+/* Transpose the characters at point. If point is at the end of the line,
+ then transpose the characters before point. */
+DECLARE_INFO_COMMAND (ea_transpose_chars, _("Transpose characters at point"))
+{
+ /* Handle conditions that would make it impossible to transpose
+ characters. */
+ if (!count || !input_line_point || (input_line_end - input_line_beg) < 2)
+ return;
+
+ while (count)
+ {
+ int t;
+ if (input_line_point == input_line_end)
+ {
+ t = input_line[input_line_point - 1];
+
+ input_line[input_line_point - 1] = input_line[input_line_point - 2];
+ input_line[input_line_point - 2] = t;
+ }
+ else
+ {
+ t = input_line[input_line_point];
+
+ input_line[input_line_point] = input_line[input_line_point - 1];
+ input_line[input_line_point - 1] = t;
+
+ if (count < 0 && input_line_point != input_line_beg)
+ input_line_point--;
+ else
+ input_line_point++;
+ }
+
+ if (count < 0)
+ count++;
+ else
+ count--;
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Echo Area Killing and Yanking */
+/* */
+/* **************************************************************** */
+
+static char **kill_ring = (char **)NULL;
+static int kill_ring_index = 0; /* Number of kills appearing in KILL_RING. */
+static int kill_ring_slots = 0; /* Number of slots allocated to KILL_RING. */
+static int kill_ring_loc = 0; /* Location of current yank pointer. */
+
+/* The largest number of kills that we remember at one time. */
+static int max_retained_kills = 15;
+
+DECLARE_INFO_COMMAND (ea_yank, _("Yank back the contents of the last kill"))
+{
+ register int i;
+ register char *text;
+
+ if (!kill_ring_index)
+ {
+ inform_in_echo_area ((char *) _("Kill ring is empty"));
+ return;
+ }
+
+ text = kill_ring[kill_ring_loc];
+
+ for (i = 0; text[i]; i++)
+ ea_insert (window, 1, text[i]);
+}
+
+/* If the last command was yank, or yank_pop, and the text just before
+ point is identical to the current kill item, then delete that text
+ from the line, rotate the index down, and yank back some other text. */
+DECLARE_INFO_COMMAND (ea_yank_pop, _("Yank back a previous kill"))
+{
+ register int len;
+
+ if (((ea_last_executed_command != (VFunction *) ea_yank) &&
+ (ea_last_executed_command != (VFunction *) ea_yank_pop)) ||
+ (kill_ring_index == 0))
+ return;
+
+ len = strlen (kill_ring[kill_ring_loc]);
+
+ /* Delete the last yanked item from the line. */
+ {
+ register int i, counter;
+
+ counter = input_line_end - input_line_point;
+
+ for (i = input_line_point - len; counter; i++, counter--)
+ input_line[i] = input_line[i + len];
+
+ input_line_end -= len;
+ input_line_point -= len;
+ }
+
+ /* Get a previous kill, and yank that. */
+ kill_ring_loc--;
+ if (kill_ring_loc < 0)
+ kill_ring_loc = kill_ring_index - 1;
+
+ ea_yank (window, count, key);
+}
+
+/* Delete the text from point to end of line. */
+DECLARE_INFO_COMMAND (ea_kill_line, _("Kill to the end of the line"))
+{
+ if (count < 0)
+ {
+ ea_kill_text (input_line_point, input_line_beg);
+ input_line_point = input_line_beg;
+ }
+ else
+ ea_kill_text (input_line_point, input_line_end);
+}
+
+/* Delete the text from point to beg of line. */
+DECLARE_INFO_COMMAND (ea_backward_kill_line,
+ _("Kill to the beginning of the line"))
+{
+ if (count < 0)
+ ea_kill_text (input_line_point, input_line_end);
+ else
+ {
+ ea_kill_text (input_line_point, input_line_beg);
+ input_line_point = input_line_beg;
+ }
+}
+
+/* Delete from point to the end of the current word. */
+DECLARE_INFO_COMMAND (ea_kill_word, _("Kill the word following the cursor"))
+{
+ int orig_point = input_line_point;
+
+ if (count < 0)
+ ea_backward_kill_word (window, -count, key);
+ else
+ {
+ ea_forward_word (window, count, key);
+
+ if (input_line_point != orig_point)
+ ea_kill_text (orig_point, input_line_point);
+
+ input_line_point = orig_point;
+ }
+}
+
+/* Delete from point to the start of the current word. */
+DECLARE_INFO_COMMAND (ea_backward_kill_word,
+ _("Kill the word preceding the cursor"))
+{
+ int orig_point = input_line_point;
+
+ if (count < 0)
+ ea_kill_word (window, -count, key);
+ else
+ {
+ ea_backward_word (window, count, key);
+
+ if (input_line_point != orig_point)
+ ea_kill_text (orig_point, input_line_point);
+ }
+}
+
+/* The way to kill something. This appends or prepends to the last
+ kill, if the last command was a kill command. If FROM is less
+ than TO, then the killed text is appended to the most recent kill,
+ otherwise it is prepended. If the last command was not a kill command,
+ then a new slot is made for this kill. */
+static void
+ea_kill_text (int from, int to)
+{
+ register int i, counter, distance;
+ int killing_backwards, slot;
+ char *killed_text;
+
+ killing_backwards = (from > to);
+
+ /* If killing backwards, reverse the values of FROM and TO. */
+ if (killing_backwards)
+ {
+ int temp = from;
+ from = to;
+ to = temp;
+ }
+
+ /* Remember the text that we are about to delete. */
+ distance = to - from;
+ killed_text = (char *)xmalloc (1 + distance);
+ strncpy (killed_text, &input_line[from], distance);
+ killed_text[distance] = '\0';
+
+ /* Actually delete the text from the line. */
+ counter = input_line_end - to;
+
+ for (i = from; counter; i++, counter--)
+ input_line[i] = input_line[i + distance];
+
+ input_line_end -= distance;
+
+ /* If the last command was a kill, append or prepend the killed text to
+ the last command's killed text. */
+ if (echo_area_last_command_was_kill)
+ {
+ char *old, *new;
+
+ slot = kill_ring_loc;
+ old = kill_ring[slot];
+ new = (char *)xmalloc (1 + strlen (old) + strlen (killed_text));
+
+ if (killing_backwards)
+ {
+ /* Prepend TEXT to current kill. */
+ strcpy (new, killed_text);
+ strcat (new, old);
+ }
+ else
+ {
+ /* Append TEXT to current kill. */
+ strcpy (new, old);
+ strcat (new, killed_text);
+ }
+
+ free (old);
+ free (killed_text);
+ kill_ring[slot] = new;
+ }
+ else
+ {
+ /* Try to store the kill in a new slot, unless that would cause there
+ to be too many remembered kills. */
+ slot = kill_ring_index;
+
+ if (slot == max_retained_kills)
+ slot = 0;
+
+ if (slot + 1 > kill_ring_slots)
+ kill_ring = (char **) xrealloc
+ (kill_ring,
+ (kill_ring_slots += max_retained_kills) * sizeof (char *));
+
+ if (slot != kill_ring_index)
+ free (kill_ring[slot]);
+ else
+ kill_ring_index++;
+
+ kill_ring[slot] = killed_text;
+
+ kill_ring_loc = slot;
+ }
+
+ /* Notice that the last command was a kill. */
+ echo_area_last_command_was_kill++;
+}
+
+/* **************************************************************** */
+/* */
+/* Echo Area Completion */
+/* */
+/* **************************************************************** */
+
+/* Pointer to an array of REFERENCE to complete over. */
+static REFERENCE **echo_area_completion_items = (REFERENCE **)NULL;
+
+/* Sorted array of REFERENCE * which is the possible completions found in
+ the variable echo_area_completion_items. If there is only one element,
+ it is the only possible completion. */
+static REFERENCE **completions_found = (REFERENCE **)NULL;
+static int completions_found_index = 0;
+static int completions_found_slots = 0;
+
+/* The lowest common denominator found while completing. */
+static REFERENCE *LCD_completion;
+
+/* Internal functions used by the user calls. */
+static void build_completions (void), completions_must_be_rebuilt (void);
+
+/* Variable which holds the output of completions. */
+static NODE *possible_completions_output_node = (NODE *)NULL;
+
+static char *compwin_name = "*Completions*";
+
+/* Return non-zero if WINDOW is a window used for completions output. */
+static int
+completions_window_p (WINDOW *window)
+{
+ int result = 0;
+
+ if (internal_info_node_p (window->node) &&
+ (strcmp (window->node->nodename, compwin_name) == 0))
+ result = 1;
+
+ return (result);
+}
+
+/* Workhorse for completion readers. If FORCE is non-zero, the user cannot
+ exit unless the line read completes, or is empty. */
+char *
+info_read_completing_internal (WINDOW *window, char *prompt,
+ REFERENCE **completions, int force)
+{
+ char *line;
+
+ /* If the echo area is already active, remember the current state. */
+ if (echo_area_is_active)
+ push_echo_area ();
+
+ echo_area_must_complete_p = force;
+
+ /* Initialize our local variables. */
+ initialize_input_line (prompt);
+
+ /* Initialize the echo area for the first (but maybe not the last) time. */
+ echo_area_initialize_node ();
+
+ /* Save away the original node of this window, and the window itself,
+ so echo area commands can temporarily use this window. */
+ remember_calling_window (window);
+
+ /* Save away the list of items to complete over. */
+ echo_area_completion_items = completions;
+ completions_must_be_rebuilt ();
+
+ active_window = the_echo_area;
+ echo_area_is_active++;
+
+ /* Read characters in the echo area. */
+ while (1)
+ {
+ info_read_and_dispatch ();
+
+ line = echo_area_after_read ();
+
+ /* Force the completion to take place if the user hasn't accepted
+ a default or aborted, and if FORCE is active. */
+ if (force && line && *line && completions)
+ {
+ register int i;
+
+ build_completions ();
+
+ /* If there is only one completion, then make the line be that
+ completion. */
+ if (completions_found_index == 1)
+ {
+ free (line);
+ line = xstrdup (completions_found[0]->label);
+ break;
+ }
+
+ /* If one of the completions matches exactly, then that is okay, so
+ return the current line. */
+ for (i = 0; i < completions_found_index; i++)
+ if (strcasecmp (completions_found[i]->label, line) == 0)
+ {
+ free (line);
+ line = xstrdup (completions_found[i]->label);
+ break;
+ }
+
+ /* If no match, go back and try again. */
+ if (i == completions_found_index)
+ {
+ if (!completions_found_index)
+ inform_in_echo_area ((char *) _("No completions"));
+ else
+ inform_in_echo_area ((char *) _("Not complete"));
+ continue;
+ }
+ }
+ break;
+ }
+ echo_area_is_active--;
+
+ /* Restore the original active window and show point in it. */
+ active_window = calling_window;
+ restore_calling_window ();
+ display_cursor_at_point (active_window);
+ fflush (stdout);
+
+ echo_area_completion_items = (REFERENCE **)NULL;
+ completions_must_be_rebuilt ();
+
+ /* If there is a previous loop waiting for us, restore it now. */
+ if (echo_area_is_active)
+ pop_echo_area ();
+
+ return (line);
+}
+
+/* Read a line in the echo area with completion over COMPLETIONS. */
+char *
+info_read_completing_in_echo_area (WINDOW *window,
+ char *prompt, REFERENCE **completions)
+{
+ return (info_read_completing_internal (window, prompt, completions, 1));
+}
+
+/* Read a line in the echo area allowing completion over COMPLETIONS, but
+ not requiring it. */
+char *
+info_read_maybe_completing (WINDOW *window,
+ char *prompt, REFERENCE **completions)
+{
+ return (info_read_completing_internal (window, prompt, completions, 0));
+}
+
+DECLARE_INFO_COMMAND (ea_possible_completions, _("List possible completions"))
+{
+ if (!echo_area_completion_items)
+ {
+ ea_insert (window, count, key);
+ return;
+ }
+
+ build_completions ();
+
+ if (!completions_found_index)
+ {
+ terminal_ring_bell ();
+ inform_in_echo_area ((char *) _("No completions"));
+ }
+ else if ((completions_found_index == 1) && (key != '?'))
+ {
+ inform_in_echo_area ((char *) _("Sole completion"));
+ }
+ else
+ {
+ register int i, l;
+ int limit, iterations, max_label = 0;
+
+ initialize_message_buffer ();
+ printf_to_message_buffer (completions_found_index == 1
+ ? (char *) _("One completion:\n")
+ : (char *) _("%d completions:\n"),
+ (void *) (long) completions_found_index,
+ NULL, NULL);
+
+ /* Find the maximum length of a label. */
+ for (i = 0; i < completions_found_index; i++)
+ {
+ int len = strlen (completions_found[i]->label);
+ if (len > max_label)
+ max_label = len;
+ }
+
+ max_label += 4;
+
+ /* Find out how many columns we should print in. */
+ limit = calling_window->width / max_label;
+ if (limit != 1 && (limit * max_label == calling_window->width))
+ limit--;
+
+ /* Avoid a possible floating exception. If max_label > width then
+ the limit will be 0 and a divide-by-zero fault will result. */
+ if (limit == 0)
+ limit = 1;
+
+ /* How many iterations of the printing loop? */
+ iterations = (completions_found_index + (limit - 1)) / limit;
+
+ /* Watch out for special case. If the number of completions is less
+ than LIMIT, then just do the inner printing loop. */
+ if (completions_found_index < limit)
+ iterations = 1;
+
+ /* Print the sorted items, up-and-down alphabetically. */
+ for (i = 0; i < iterations; i++)
+ {
+ register int j;
+
+ for (j = 0, l = i; j < limit; j++)
+ {
+ if (l >= completions_found_index)
+ break;
+ else
+ {
+ char *label;
+ int printed_length, k;
+
+ label = completions_found[l]->label;
+ printed_length = strlen (label);
+ printf_to_message_buffer ("%s", label, NULL, NULL);
+
+ if (j + 1 < limit)
+ {
+ for (k = 0; k < max_label - printed_length; k++)
+ printf_to_message_buffer (" ", NULL, NULL, NULL);
+ }
+ }
+ l += iterations;
+ }
+ printf_to_message_buffer ("\n", NULL, NULL, NULL);
+ }
+
+ /* Make a new node to hold onto possible completions. Don't destroy
+ dangling pointers. */
+ {
+ NODE *temp;
+
+ temp = message_buffer_to_node ();
+ add_gcable_pointer (temp->contents);
+ name_internal_node (temp, compwin_name);
+ possible_completions_output_node = temp;
+ }
+
+ /* Find a suitable window for displaying the completions output.
+ First choice is an existing window showing completions output.
+ If there is only one window, and it is large, make another
+ (smaller) window, and use that one. Otherwise, use the caller's
+ window. */
+ {
+ WINDOW *compwin;
+
+ compwin = get_internal_info_window (compwin_name);
+
+ if (!compwin)
+ {
+ /* If we can split the window to display most of the completion
+ items, then do so. */
+ if (calling_window->height > (iterations * 2)
+ && calling_window->height / 2 >= WINDOW_MIN_SIZE)
+ {
+ int start, pagetop;
+#ifdef SPLIT_BEFORE_ACTIVE
+ int end;
+#endif
+
+ active_window = calling_window;
+
+ /* Perhaps we can scroll this window on redisplay. */
+ start = calling_window->first_row;
+ pagetop = calling_window->pagetop;
+
+ compwin =
+ window_make_window (possible_completions_output_node);
+ active_window = the_echo_area;
+ window_change_window_height
+ (compwin, -(compwin->height - (iterations + 2)));
+
+ window_adjust_pagetop (calling_window);
+ remember_calling_window (calling_window);
+
+#if defined (SPLIT_BEFORE_ACTIVE)
+ /* If the pagetop hasn't changed, scrolling the calling
+ window is a reasonable thing to do. */
+ if (pagetop == calling_window->pagetop)
+ {
+ end = start + calling_window->height;
+ display_scroll_display
+ (start, end, calling_window->prev->height + 1);
+ }
+#else /* !SPLIT_BEFORE_ACTIVE */
+ /* If the pagetop has changed, set the new pagetop here. */
+ if (pagetop != calling_window->pagetop)
+ {
+ int newtop = calling_window->pagetop;
+ calling_window->pagetop = pagetop;
+ set_window_pagetop (calling_window, newtop);
+ }
+#endif /* !SPLIT_BEFORE_ACTIVE */
+
+ echo_area_completions_window = compwin;
+ remember_window_and_node (compwin, compwin->node);
+ }
+ else
+ compwin = calling_window;
+ }
+
+ if (compwin->node != possible_completions_output_node)
+ {
+ window_set_node_of_window
+ (compwin, possible_completions_output_node);
+ remember_window_and_node (compwin, compwin->node);
+ }
+
+ display_update_display (windows);
+ }
+ }
+}
+
+DECLARE_INFO_COMMAND (ea_complete, _("Insert completion"))
+{
+ if (!echo_area_completion_items)
+ {
+ ea_insert (window, count, key);
+ return;
+ }
+
+ /* If KEY is SPC, and we are not forcing completion to take place, simply
+ insert the key. */
+ if (!echo_area_must_complete_p && key == SPC)
+ {
+ ea_insert (window, count, key);
+ return;
+ }
+
+ if (ea_last_executed_command == (VFunction *) ea_complete)
+ {
+ /* If the keypress is a SPC character, and we have already tried
+ completing once, and there are several completions, then check
+ the batch of completions to see if any continue with a space.
+ If there are some, insert the space character and continue. */
+ if (key == SPC && completions_found_index > 1)
+ {
+ register int i, offset;
+
+ offset = input_line_end - input_line_beg;
+
+ for (i = 0; i < completions_found_index; i++)
+ if (completions_found[i]->label[offset] == ' ')
+ break;
+
+ if (completions_found[i])
+ ea_insert (window, 1, ' ');
+ else
+ {
+ ea_possible_completions (window, count, key);
+ return;
+ }
+ }
+ else
+ {
+ ea_possible_completions (window, count, key);
+ return;
+ }
+ }
+
+ input_line_point = input_line_end;
+ build_completions ();
+
+ if (!completions_found_index)
+ terminal_ring_bell ();
+ else if (LCD_completion->label[0] == '\0')
+ ea_possible_completions (window, count, key);
+ else
+ {
+ register int i;
+ input_line_point = input_line_end = input_line_beg;
+ for (i = 0; LCD_completion->label[i]; i++)
+ ea_insert (window, 1, LCD_completion->label[i]);
+ }
+}
+
+/* Utility REFERENCE used to store possible LCD. */
+static REFERENCE LCD_reference = {
+ (char *)NULL, (char *)NULL, (char *)NULL, 0, 0, 0
+};
+
+static void remove_completion_duplicates (void);
+
+/* Variables which remember the state of the most recent call
+ to build_completions (). */
+static char *last_completion_request = (char *)NULL;
+static REFERENCE **last_completion_items = (REFERENCE **)NULL;
+
+/* How to tell the completion builder to reset internal state. */
+static void
+completions_must_be_rebuilt (void)
+{
+ maybe_free (last_completion_request);
+ last_completion_request = (char *)NULL;
+ last_completion_items = (REFERENCE **)NULL;
+}
+
+/* Build a list of possible completions from echo_area_completion_items,
+ and the contents of input_line. */
+static void
+build_completions (void)
+{
+ register int i, len;
+ register REFERENCE *entry;
+ char *request;
+ int informed_of_lengthy_job = 0;
+
+ /* If there are no items to complete over, exit immediately. */
+ if (!echo_area_completion_items)
+ {
+ completions_found_index = 0;
+ LCD_completion = (REFERENCE *)NULL;
+ return;
+ }
+
+ /* Check to see if this call to build completions is the same as the last
+ call to build completions. */
+ len = input_line_end - input_line_beg;
+ request = (char *)xmalloc (1 + len);
+ strncpy (request, &input_line[input_line_beg], len);
+ request[len] = '\0';
+
+ if (last_completion_request && last_completion_items &&
+ last_completion_items == echo_area_completion_items &&
+ (strcmp (last_completion_request, request) == 0))
+ {
+ free (request);
+ return;
+ }
+
+ maybe_free (last_completion_request);
+ last_completion_request = request;
+ last_completion_items = echo_area_completion_items;
+
+ /* Always start at the beginning of the list. */
+ completions_found_index = 0;
+ LCD_completion = (REFERENCE *)NULL;
+
+ for (i = 0; (entry = echo_area_completion_items[i]); i++)
+ {
+ if (strncasecmp (request, entry->label, len) == 0)
+ add_pointer_to_array (entry, completions_found_index,
+ completions_found, completions_found_slots,
+ 20, REFERENCE *);
+
+ if (!informed_of_lengthy_job && completions_found_index > 100)
+ {
+ informed_of_lengthy_job = 1;
+ window_message_in_echo_area ((char *) _("Building completions..."),
+ NULL, NULL);
+ }
+ }
+
+ if (!completions_found_index)
+ return;
+
+ /* Sort and prune duplicate entries from the completions array. */
+ remove_completion_duplicates ();
+
+ /* If there is only one completion, just return that. */
+ if (completions_found_index == 1)
+ {
+ LCD_completion = completions_found[0];
+ return;
+ }
+
+ /* Find the least common denominator. */
+ {
+ long shortest = 100000;
+
+ for (i = 1; i < completions_found_index; i++)
+ {
+ register int j;
+ int c1, c2;
+
+ for (j = 0;
+ (c1 = info_tolower (completions_found[i - 1]->label[j])) &&
+ (c2 = info_tolower (completions_found[i]->label[j]));
+ j++)
+ if (c1 != c2)
+ break;
+
+ if (shortest > j)
+ shortest = j;
+ }
+
+ maybe_free (LCD_reference.label);
+ LCD_reference.label = (char *)xmalloc (1 + shortest);
+ /* Since both the sorting done inside remove_completion_duplicates
+ and all the comparisons above are case-insensitive, it's
+ possible that the completion we are going to return is
+ identical to what the user typed but for the letter-case. This
+ is confusing, since the user could type FOOBAR<TAB> and get her
+ string change letter-case for no good reason. So try to find a
+ possible completion whose letter-case is identical, and if so,
+ use that. */
+ if (completions_found_index > 1)
+ {
+ int req_len = strlen (request);
+
+ for (i = 0; i < completions_found_index; i++)
+ if (strncmp (request, completions_found[i]->label, req_len) == 0)
+ break;
+ /* If none of the candidates match exactly, use the first one. */
+ if (i >= completions_found_index)
+ i = 0;
+ }
+ strncpy (LCD_reference.label, completions_found[i]->label, shortest);
+ LCD_reference.label[shortest] = '\0';
+ LCD_completion = &LCD_reference;
+ }
+
+ if (informed_of_lengthy_job)
+ echo_area_initialize_node ();
+}
+
+/* Function called by qsort. */
+static int
+compare_references (const void *entry1, const void *entry2)
+{
+ REFERENCE **e1 = (REFERENCE **) entry1;
+ REFERENCE **e2 = (REFERENCE **) entry2;
+
+ return (strcasecmp ((*e1)->label, (*e2)->label));
+}
+
+/* Prune duplicate entries from COMPLETIONS_FOUND. */
+static void
+remove_completion_duplicates (void)
+{
+ register int i, j;
+ REFERENCE **temp;
+ int newlen;
+
+ if (!completions_found_index)
+ return;
+
+ /* Sort the items. */
+ qsort (completions_found, completions_found_index, sizeof (REFERENCE *),
+ compare_references);
+
+ for (i = 0, newlen = 1; i < completions_found_index - 1; i++)
+ {
+ if (strcmp (completions_found[i]->label,
+ completions_found[i + 1]->label) == 0)
+ completions_found[i] = (REFERENCE *)NULL;
+ else
+ newlen++;
+ }
+
+ /* We have marked all the dead slots. It is faster to copy the live slots
+ twice than to prune the dead slots one by one. */
+ temp = (REFERENCE **)xmalloc ((1 + newlen) * sizeof (REFERENCE *));
+ for (i = 0, j = 0; i < completions_found_index; i++)
+ if (completions_found[i])
+ temp[j++] = completions_found[i];
+
+ for (i = 0; i < newlen; i++)
+ completions_found[i] = temp[i];
+
+ completions_found[i] = (REFERENCE *)NULL;
+ completions_found_index = newlen;
+ free (temp);
+}
+
+/* Scroll the "other" window. If there is a window showing completions, scroll
+ that one, otherwise scroll the window which was active on entering the read
+ function. */
+DECLARE_INFO_COMMAND (ea_scroll_completions_window, _("Scroll the completions window"))
+{
+ WINDOW *compwin;
+ int old_pagetop;
+
+ compwin = get_internal_info_window (compwin_name);
+
+ if (!compwin)
+ compwin = calling_window;
+
+ old_pagetop = compwin->pagetop;
+
+ /* Let info_scroll_forward () do the work, and print any messages that
+ need to be displayed. */
+ info_scroll_forward (compwin, count, key);
+}
+
+/* Function which gets called when an Info window is deleted while the
+ echo area is active. WINDOW is the window which has just been deleted. */
+void
+echo_area_inform_of_deleted_window (WINDOW *window)
+{
+ /* If this is the calling_window, forget what we remembered about it. */
+ if (window == calling_window)
+ {
+ if (active_window != the_echo_area)
+ remember_calling_window (active_window);
+ else
+ remember_calling_window (windows);
+ }
+
+ /* If this window was the echo_area_completions_window, then notice that
+ the window has been deleted. */
+ if (window == echo_area_completions_window)
+ echo_area_completions_window = (WINDOW *)NULL;
+}
+
+/* **************************************************************** */
+/* */
+/* Pushing and Popping the Echo Area */
+/* */
+/* **************************************************************** */
+
+/* Push and Pop the echo area. */
+typedef struct {
+ char *line;
+ char *prompt;
+ REFERENCE **comp_items;
+ int point, beg, end;
+ int must_complete;
+ NODE node;
+ WINDOW *compwin;
+} PUSHED_EA;
+
+static PUSHED_EA **pushed_echo_areas = (PUSHED_EA **)NULL;
+static int pushed_echo_areas_index = 0;
+static int pushed_echo_areas_slots = 0;
+
+/* Pushing the echo_area has a side effect of zeroing the completion_items. */
+static void
+push_echo_area (void)
+{
+ PUSHED_EA *pushed;
+
+ pushed = (PUSHED_EA *)xmalloc (sizeof (PUSHED_EA));
+ pushed->line = xstrdup (input_line);
+ pushed->prompt = input_line_prompt;
+ pushed->point = input_line_point;
+ pushed->beg = input_line_beg;
+ pushed->end = input_line_end;
+ pushed->node = input_line_node;
+ pushed->comp_items = echo_area_completion_items;
+ pushed->must_complete = echo_area_must_complete_p;
+ pushed->compwin = echo_area_completions_window;
+
+ add_pointer_to_array (pushed, pushed_echo_areas_index, pushed_echo_areas,
+ pushed_echo_areas_slots, 4, PUSHED_EA *);
+
+ echo_area_completion_items = (REFERENCE **)NULL;
+}
+
+static void
+pop_echo_area (void)
+{
+ PUSHED_EA *popped;
+
+ popped = pushed_echo_areas[--pushed_echo_areas_index];
+
+ strcpy (input_line, popped->line);
+ free (popped->line);
+ input_line_prompt = popped->prompt;
+ input_line_point = popped->point;
+ input_line_beg = popped->beg;
+ input_line_end = popped->end;
+ input_line_node = popped->node;
+ echo_area_completion_items = popped->comp_items;
+ echo_area_must_complete_p = popped->must_complete;
+ echo_area_completions_window = popped->compwin;
+ completions_must_be_rebuilt ();
+
+ /* If the completion window no longer exists, forget about it. */
+ if (echo_area_completions_window)
+ {
+ register WINDOW *win;
+
+ for (win = windows; win; win = win->next)
+ if (echo_area_completions_window == win)
+ break;
+
+ /* If the window wasn't found, then it has already been deleted. */
+ if (!win)
+ echo_area_completions_window = (WINDOW *)NULL;
+ }
+
+ free (popped);
+}
+
+/* Returns non-zero if any of the prior stacked calls to read in the echo
+ area produced a completions window. */
+static int
+echo_area_stack_contains_completions_p (void)
+{
+ register int i;
+
+ for (i = 0; i < pushed_echo_areas_index; i++)
+ if (pushed_echo_areas[i]->compwin)
+ return (1);
+
+ return (0);
+}
+
+/* **************************************************************** */
+/* */
+/* Error Messages While Reading in Echo Area */
+/* */
+/* **************************************************************** */
+
+#if defined (HAVE_SYS_TIME_H)
+# include <sys/time.h>
+# define HAVE_STRUCT_TIMEVAL
+#endif /* HAVE_SYS_TIME_H */
+
+static void
+pause_or_input (void)
+{
+#ifdef FD_SET
+ struct timeval timer;
+ fd_set readfds;
+ int ready;
+
+ FD_ZERO (&readfds);
+ FD_SET (fileno (stdin), &readfds);
+ timer.tv_sec = 2;
+ timer.tv_usec = 0;
+ ready = select (fileno (stdin) + 1, &readfds, (fd_set *) NULL,
+ (fd_set *) NULL, &timer);
+#endif /* FD_SET */
+}
+
+/* Print MESSAGE right after the end of the current line, and wait
+ for input or a couple of seconds, whichever comes first. Then flush the
+ informational message that was printed. */
+void
+inform_in_echo_area (const char *message)
+{
+ int i;
+ char *text;
+ int avail = EA_MAX_INPUT + 1 - input_line_end;
+
+ text = xstrdup (message);
+ for (i = 0; text[i] && text[i] != '\n' && i < avail; i++)
+ ;
+ text[i] = 0;
+
+ echo_area_initialize_node ();
+ sprintf (&input_line[input_line_end], "%s[%s]\n",
+ echo_area_is_active ? " ": "", text);
+ free (text);
+ the_echo_area->point = input_line_point;
+ display_update_one_window (the_echo_area);
+ display_cursor_at_point (active_window);
+ fflush (stdout);
+ pause_or_input ();
+ echo_area_initialize_node ();
+}
diff --git a/Build/source/utils/texinfo/info/echo-area.h b/Build/source/utils/texinfo/info/echo-area.h
new file mode 100644
index 00000000000..31784282485
--- /dev/null
+++ b/Build/source/utils/texinfo/info/echo-area.h
@@ -0,0 +1,85 @@
+/* echo-area.h -- Functions used in reading information from the echo area.
+ $Id: echo-area.h,v 1.4 2004/08/07 22:03:08 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_ECHO_AREA_H
+#define INFO_ECHO_AREA_H
+
+#define EA_MAX_INPUT 256
+
+extern int echo_area_is_active, info_aborted_echo_area;
+
+/* Non-zero means that the last command executed while reading input
+ killed some text. */
+extern int echo_area_last_command_was_kill;
+
+extern void inform_in_echo_area (const char *message);
+extern void echo_area_inform_of_deleted_window (WINDOW *window);
+extern void echo_area_prep_read (void);
+extern VFunction *ea_last_executed_command;
+extern char * info_read_completing_internal (WINDOW *window, char *prompt,
+ REFERENCE **completions, int force);
+
+/* Read a line of text in the echo area. Return a malloc ()'ed string,
+ or NULL if the user aborted out of this read. WINDOW is the currently
+ active window, so that we can restore it when we need to. PROMPT, if
+ non-null, is a prompt to print before reading the line. */
+extern char *info_read_in_echo_area (WINDOW *window, char *prompt);
+
+/* Read a line in the echo area with completion over COMPLETIONS.
+ Takes arguments of WINDOW, PROMPT, and COMPLETIONS, a REFERENCE **. */
+char *info_read_completing_in_echo_area (WINDOW *window,
+ char *prompt, REFERENCE **completions);
+
+/* Read a line in the echo area allowing completion over COMPLETIONS, but
+ not requiring it. Takes arguments of WINDOW, PROMPT, and COMPLETIONS,
+ a REFERENCE **. */
+extern char *info_read_maybe_completing (WINDOW *window,
+ char *prompt, REFERENCE **completions);
+
+extern void ea_insert (WINDOW *window, int count, unsigned char key);
+extern void ea_quoted_insert (WINDOW *window, int count, unsigned char key);
+extern void ea_beg_of_line (WINDOW *window, int count, unsigned char key);
+extern void ea_backward (WINDOW *window, int count, unsigned char key);
+extern void ea_delete (WINDOW *window, int count, unsigned char key);
+extern void ea_end_of_line (WINDOW *window, int count, unsigned char key);
+extern void ea_forward (WINDOW *window, int count, unsigned char key);
+extern void ea_abort (WINDOW *window, int count, unsigned char key);
+extern void ea_rubout (WINDOW *window, int count, unsigned char key);
+extern void ea_complete (WINDOW *window, int count, unsigned char key);
+extern void ea_newline (WINDOW *window, int count, unsigned char key);
+extern void ea_kill_line (WINDOW *window, int count, unsigned char key);
+extern void ea_backward_kill_line (WINDOW *window, int count, unsigned char key);
+extern void ea_transpose_chars (WINDOW *window, int count, unsigned char key);
+extern void ea_yank (WINDOW *window, int count, unsigned char key);
+extern void ea_tab_insert (WINDOW *window, int count, unsigned char key);
+extern void ea_possible_completions (WINDOW *window, int count, unsigned char key);
+extern void ea_backward_word (WINDOW *window, int count, unsigned char key);
+extern void ea_kill_word (WINDOW *window, int count, unsigned char key);
+extern void ea_forward_word (WINDOW *window, int count, unsigned char key);
+extern void ea_yank_pop (WINDOW *window, int count, unsigned char key);
+extern void ea_backward_kill_word (WINDOW *window, int count, unsigned char key);
+extern void ea_scroll_completions_window (WINDOW *window, int count,
+ unsigned char key);
+
+#endif /* not INFO_ECHO_AREA_H */
diff --git a/Build/source/utils/texinfo/info/filesys.c b/Build/source/utils/texinfo/info/filesys.c
new file mode 100644
index 00000000000..81344806456
--- /dev/null
+++ b/Build/source/utils/texinfo/info/filesys.c
@@ -0,0 +1,711 @@
+/* filesys.c -- filesystem specific functions.
+ $Id: filesys.c,v 1.6 2004/07/30 17:17:40 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2000, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+#include "tilde.h"
+#include "filesys.h"
+
+/* Local to this file. */
+static char *info_file_in_path (char *filename, char *path);
+static char *lookup_info_filename (char *filename);
+static char *info_absolute_file (char *fname);
+
+static void remember_info_filename (char *filename, char *expansion);
+static void maybe_initialize_infopath (void);
+
+typedef struct
+{
+ char *suffix;
+ char *decompressor;
+} COMPRESSION_ALIST;
+
+static char *info_suffixes[] = {
+ ".info",
+ "-info",
+ "/index",
+ ".inf", /* 8+3 file on filesystem which supports long file names */
+#ifdef __MSDOS__
+ /* 8+3 file names strike again... */
+ ".in", /* for .inz, .igz etc. */
+ ".i",
+#endif
+ "",
+ NULL
+};
+
+static COMPRESSION_ALIST compress_suffixes[] = {
+ { ".gz", "gunzip" },
+ { ".bz2", "bunzip2" },
+ { ".z", "gunzip" },
+ { ".Z", "uncompress" },
+ { ".Y", "unyabba" },
+#ifdef __MSDOS__
+ { "gz", "gunzip" },
+ { "z", "gunzip" },
+#endif
+ { (char *)NULL, (char *)NULL }
+};
+
+/* The path on which we look for info files. You can initialize this
+ from the environment variable INFOPATH if there is one, or you can
+ call info_add_path () to add paths to the beginning or end of it.
+ You can call zap_infopath () to make the path go away. */
+char *infopath = (char *)NULL;
+static int infopath_size = 0;
+
+/* Expand the filename in PARTIAL to make a real name for this operating
+ system. This looks in INFO_PATHS in order to find the correct file.
+ If it can't find the file, it returns NULL. */
+static char *local_temp_filename = (char *)NULL;
+static int local_temp_filename_size = 0;
+
+char *
+info_find_fullpath (char *partial)
+{
+ int initial_character;
+ char *temp;
+
+ filesys_error_number = 0;
+
+ maybe_initialize_infopath ();
+
+ if (partial && (initial_character = *partial))
+ {
+ char *expansion;
+
+ expansion = lookup_info_filename (partial);
+
+ if (expansion)
+ return (expansion);
+
+ /* If we have the full path to this file, we still may have to add
+ various extensions to it. I guess we have to stat this file
+ after all. */
+ if (IS_ABSOLUTE (partial))
+ temp = info_absolute_file (partial);
+ else if (initial_character == '~')
+ {
+ expansion = tilde_expand_word (partial);
+ if (IS_ABSOLUTE (expansion))
+ {
+ temp = info_absolute_file (expansion);
+ free (expansion);
+ }
+ else
+ temp = expansion;
+ }
+ else if (initial_character == '.' &&
+ (IS_SLASH (partial[1]) ||
+ (partial[1] == '.' && IS_SLASH (partial[2]))))
+ {
+ if (local_temp_filename_size < 1024)
+ local_temp_filename = (char *)xrealloc
+ (local_temp_filename, (local_temp_filename_size = 1024));
+#if defined (HAVE_GETCWD)
+ if (!getcwd (local_temp_filename, local_temp_filename_size))
+#else /* !HAVE_GETCWD */
+ if (!getwd (local_temp_filename))
+#endif /* !HAVE_GETCWD */
+ {
+ filesys_error_number = errno;
+ return (partial);
+ }
+
+ strcat (local_temp_filename, "/");
+ strcat (local_temp_filename, partial);
+ temp = info_absolute_file (local_temp_filename); /* try extensions */
+ if (!temp)
+ partial = local_temp_filename;
+ }
+ else
+ temp = info_file_in_path (partial, infopath);
+
+ if (temp)
+ {
+ remember_info_filename (partial, temp);
+ if (strlen (temp) > (unsigned int) local_temp_filename_size)
+ local_temp_filename = (char *) xrealloc
+ (local_temp_filename,
+ (local_temp_filename_size = (50 + strlen (temp))));
+ strcpy (local_temp_filename, temp);
+ free (temp);
+ return (local_temp_filename);
+ }
+ }
+ return (partial);
+}
+
+/* Scan the list of directories in PATH looking for FILENAME. If we find
+ one that is a regular file, return it as a new string. Otherwise, return
+ a NULL pointer. */
+static char *
+info_file_in_path (char *filename, char *path)
+{
+ struct stat finfo;
+ char *temp_dirname;
+ int statable, dirname_index;
+
+ /* Reject ridiculous cases up front, to prevent infinite recursion
+ later on. E.g., someone might say "info '(.)foo'"... */
+ if (!*filename || STREQ (filename, ".") || STREQ (filename, ".."))
+ return NULL;
+
+ dirname_index = 0;
+
+ while ((temp_dirname = extract_colon_unit (path, &dirname_index)))
+ {
+ register int i, pre_suffix_length;
+ char *temp;
+
+ /* Expand a leading tilde if one is present. */
+ if (*temp_dirname == '~')
+ {
+ char *expanded_dirname;
+
+ expanded_dirname = tilde_expand_word (temp_dirname);
+ free (temp_dirname);
+ temp_dirname = expanded_dirname;
+ }
+
+ temp = (char *)xmalloc (30 + strlen (temp_dirname) + strlen (filename));
+ strcpy (temp, temp_dirname);
+ if (!IS_SLASH (temp[(strlen (temp)) - 1]))
+ strcat (temp, "/");
+ strcat (temp, filename);
+
+ pre_suffix_length = strlen (temp);
+
+ free (temp_dirname);
+
+ for (i = 0; info_suffixes[i]; i++)
+ {
+ strcpy (temp + pre_suffix_length, info_suffixes[i]);
+
+ statable = (stat (temp, &finfo) == 0);
+
+ /* If we have found a regular file, then use that. Else, if we
+ have found a directory, look in that directory for this file. */
+ if (statable)
+ {
+ if (S_ISREG (finfo.st_mode))
+ {
+ return (temp);
+ }
+ else if (S_ISDIR (finfo.st_mode))
+ {
+ char *newpath, *filename_only, *newtemp;
+
+ newpath = xstrdup (temp);
+ filename_only = filename_non_directory (filename);
+ newtemp = info_file_in_path (filename_only, newpath);
+
+ free (newpath);
+ if (newtemp)
+ {
+ free (temp);
+ return (newtemp);
+ }
+ }
+ }
+ else
+ {
+ /* Add various compression suffixes to the name to see if
+ the file is present in compressed format. */
+ register int j, pre_compress_suffix_length;
+
+ pre_compress_suffix_length = strlen (temp);
+
+ for (j = 0; compress_suffixes[j].suffix; j++)
+ {
+ strcpy (temp + pre_compress_suffix_length,
+ compress_suffixes[j].suffix);
+
+ statable = (stat (temp, &finfo) == 0);
+ if (statable && (S_ISREG (finfo.st_mode)))
+ return (temp);
+ }
+ }
+ }
+ free (temp);
+ }
+ return ((char *)NULL);
+}
+
+/* Assume FNAME is an absolute file name, and check whether it is
+ a regular file. If it is, return it as a new string; otherwise
+ return a NULL pointer. We do it by taking the file name apart
+ into its directory and basename parts, and calling info_file_in_path.*/
+static char *
+info_absolute_file (char *fname)
+{
+ char *containing_dir = xstrdup (fname);
+ char *base = filename_non_directory (containing_dir);
+
+ if (base > containing_dir)
+ base[-1] = '\0';
+
+ return info_file_in_path (filename_non_directory (fname), containing_dir);
+}
+
+
+/* Given a string containing units of information separated by the
+ PATH_SEP character, return the next one after IDX, or NULL if there
+ are no more. Advance IDX to the character after the colon. */
+
+char *
+extract_colon_unit (char *string, int *idx)
+{
+ unsigned int i = (unsigned int) *idx;
+ unsigned int start = i;
+
+ if (!string || i >= strlen (string))
+ return NULL;
+
+ if (!string[i]) /* end of string */
+ return NULL;
+
+ /* Advance to next PATH_SEP. */
+ while (string[i] && string[i] != PATH_SEP[0])
+ i++;
+
+ {
+ char *value = xmalloc ((i - start) + 1);
+ strncpy (value, &string[start], (i - start));
+ value[i - start] = 0;
+
+ i++; /* move past PATH_SEP */
+ *idx = i;
+ return value;
+ }
+}
+
+/* A structure which associates a filename with its expansion. */
+typedef struct
+{
+ char *filename;
+ char *expansion;
+} FILENAME_LIST;
+
+/* An array of remembered arguments and results. */
+static FILENAME_LIST **names_and_files = (FILENAME_LIST **)NULL;
+static int names_and_files_index = 0;
+static int names_and_files_slots = 0;
+
+/* Find the result for having already called info_find_fullpath () with
+ FILENAME. */
+static char *
+lookup_info_filename (char *filename)
+{
+ if (filename && names_and_files)
+ {
+ register int i;
+ for (i = 0; names_and_files[i]; i++)
+ {
+ if (FILENAME_CMP (names_and_files[i]->filename, filename) == 0)
+ return (names_and_files[i]->expansion);
+ }
+ }
+ return (char *)NULL;;
+}
+
+/* Add a filename and its expansion to our list. */
+static void
+remember_info_filename (char *filename, char *expansion)
+{
+ FILENAME_LIST *new;
+
+ if (names_and_files_index + 2 > names_and_files_slots)
+ {
+ int alloc_size;
+ names_and_files_slots += 10;
+
+ alloc_size = names_and_files_slots * sizeof (FILENAME_LIST *);
+
+ names_and_files =
+ (FILENAME_LIST **) xrealloc (names_and_files, alloc_size);
+ }
+
+ new = (FILENAME_LIST *)xmalloc (sizeof (FILENAME_LIST));
+ new->filename = xstrdup (filename);
+ new->expansion = expansion ? xstrdup (expansion) : (char *)NULL;
+
+ names_and_files[names_and_files_index++] = new;
+ names_and_files[names_and_files_index] = (FILENAME_LIST *)NULL;
+}
+
+static void
+maybe_initialize_infopath (void)
+{
+ if (!infopath_size)
+ {
+ infopath = (char *)
+ xmalloc (infopath_size = (1 + strlen (DEFAULT_INFOPATH)));
+
+ strcpy (infopath, DEFAULT_INFOPATH);
+ }
+}
+
+/* Add PATH to the list of paths found in INFOPATH. 2nd argument says
+ whether to put PATH at the front or end of INFOPATH. */
+void
+info_add_path (char *path, int where)
+{
+ int len;
+
+ if (!infopath)
+ {
+ infopath = (char *)xmalloc (infopath_size = 200 + strlen (path));
+ infopath[0] = '\0';
+ }
+
+ len = strlen (path) + strlen (infopath);
+
+ if (len + 2 >= infopath_size)
+ infopath = (char *)xrealloc (infopath, (infopath_size += (2 * len) + 2));
+
+ if (!*infopath)
+ strcpy (infopath, path);
+ else if (where == INFOPATH_APPEND)
+ {
+ strcat (infopath, PATH_SEP);
+ strcat (infopath, path);
+ }
+ else if (where == INFOPATH_PREPEND)
+ {
+ char *temp = xstrdup (infopath);
+ strcpy (infopath, path);
+ strcat (infopath, PATH_SEP);
+ strcat (infopath, temp);
+ free (temp);
+ }
+}
+
+/* Make INFOPATH have absolutely nothing in it. */
+void
+zap_infopath (void)
+{
+ if (infopath)
+ free (infopath);
+
+ infopath = (char *)NULL;
+ infopath_size = 0;
+}
+
+/* Given a chunk of text and its length, convert all CRLF pairs at every
+ end-of-line into a single Newline character. Return the length of
+ produced text.
+
+ This is required because the rest of code is too entrenched in having
+ a single newline at each EOL; in particular, searching for various
+ Info headers and cookies can become extremely tricky if that assumption
+ breaks.
+
+ FIXME: this could also support Mac-style text files with a single CR
+ at the EOL, but what about random CR characters in non-Mac files? Can
+ we afford converting them into newlines as well? Maybe implement some
+ heuristics here, like in Emacs 20.
+
+ FIXME: is it a good idea to show the EOL type on the modeline? */
+long
+convert_eols (char *text, long int textlen)
+{
+ register char *s = text;
+ register char *d = text;
+
+ while (textlen--)
+ {
+ if (*s == '\r' && textlen && s[1] == '\n')
+ {
+ s++;
+ textlen--;
+ }
+ *d++ = *s++;
+ }
+
+ return (long)(d - text);
+}
+
+/* Read the contents of PATHNAME, returning a buffer with the contents of
+ that file in it, and returning the size of that buffer in FILESIZE.
+ FINFO is a stat struct which has already been filled in by the caller.
+ If the file turns out to be compressed, set IS_COMPRESSED to non-zero.
+ If the file cannot be read, return a NULL pointer. */
+char *
+filesys_read_info_file (char *pathname, long int *filesize,
+ struct stat *finfo, int *is_compressed)
+{
+ long st_size;
+
+ *filesize = filesys_error_number = 0;
+
+ if (compressed_filename_p (pathname))
+ {
+ *is_compressed = 1;
+ return (filesys_read_compressed (pathname, filesize));
+ }
+ else
+ {
+ int descriptor;
+ char *contents;
+
+ *is_compressed = 0;
+ descriptor = open (pathname, O_RDONLY | O_BINARY, 0666);
+
+ /* If the file couldn't be opened, give up. */
+ if (descriptor < 0)
+ {
+ filesys_error_number = errno;
+ return ((char *)NULL);
+ }
+
+ /* Try to read the contents of this file. */
+ st_size = (long) finfo->st_size;
+ contents = (char *)xmalloc (1 + st_size);
+ if ((read (descriptor, contents, st_size)) != st_size)
+ {
+ filesys_error_number = errno;
+ close (descriptor);
+ free (contents);
+ return ((char *)NULL);
+ }
+
+ close (descriptor);
+
+ /* Convert any DOS-style CRLF EOLs into Unix-style NL.
+ Seems like a good idea to have even on Unix, in case the Info
+ files are coming from some Windows system across a network. */
+ *filesize = convert_eols (contents, st_size);
+
+ /* EOL conversion can shrink the text quite a bit. We don't
+ want to waste storage. */
+ if (*filesize < st_size)
+ contents = (char *)xrealloc (contents, 1 + *filesize);
+ contents[*filesize] = '\0';
+
+ return (contents);
+ }
+}
+
+/* Typically, pipe buffers are 4k. */
+#define BASIC_PIPE_BUFFER (4 * 1024)
+
+/* We use some large multiple of that. */
+#define FILESYS_PIPE_BUFFER_SIZE (16 * BASIC_PIPE_BUFFER)
+
+char *
+filesys_read_compressed (char *pathname, long int *filesize)
+{
+ FILE *stream;
+ char *command, *decompressor;
+ char *contents = (char *)NULL;
+
+ *filesize = filesys_error_number = 0;
+
+ decompressor = filesys_decompressor_for_file (pathname);
+
+ if (!decompressor)
+ return ((char *)NULL);
+
+ command = (char *)xmalloc (15 + strlen (pathname) + strlen (decompressor));
+ /* Explicit .exe suffix makes the diagnostics of `popen'
+ better on systems where COMMAND.COM is the stock shell. */
+ sprintf (command, "%s%s < %s",
+ decompressor, STRIP_DOT_EXE ? ".exe" : "", pathname);
+
+#if !defined (BUILDING_LIBRARY)
+ if (info_windows_initialized_p)
+ {
+ char *temp;
+
+ temp = (char *)xmalloc (5 + strlen (command));
+ sprintf (temp, "%s...", command);
+ message_in_echo_area ("%s", temp, NULL);
+ free (temp);
+ }
+#endif /* !BUILDING_LIBRARY */
+
+ stream = popen (command, FOPEN_RBIN);
+ free (command);
+
+ /* Read chunks from this file until there are none left to read. */
+ if (stream)
+ {
+ long offset, size;
+ char *chunk;
+
+ offset = size = 0;
+ chunk = (char *)xmalloc (FILESYS_PIPE_BUFFER_SIZE);
+
+ while (1)
+ {
+ int bytes_read;
+
+ bytes_read = fread (chunk, 1, FILESYS_PIPE_BUFFER_SIZE, stream);
+
+ if (bytes_read + offset >= size)
+ contents = (char *)xrealloc
+ (contents, size += (2 * FILESYS_PIPE_BUFFER_SIZE));
+
+ memcpy (contents + offset, chunk, bytes_read);
+ offset += bytes_read;
+ if (bytes_read != FILESYS_PIPE_BUFFER_SIZE)
+ break;
+ }
+
+ free (chunk);
+ if (pclose (stream) == -1)
+ {
+ if (contents)
+ free (contents);
+ contents = (char *)NULL;
+ filesys_error_number = errno;
+ }
+ else
+ {
+ *filesize = convert_eols (contents, offset);
+ contents = (char *)xrealloc (contents, 1 + *filesize);
+ contents[*filesize] = '\0';
+ }
+ }
+ else
+ {
+ filesys_error_number = errno;
+ }
+
+#if !defined (BUILDING_LIBARARY)
+ if (info_windows_initialized_p)
+ unmessage_in_echo_area ();
+#endif /* !BUILDING_LIBRARY */
+ return (contents);
+}
+
+/* Return non-zero if FILENAME belongs to a compressed file. */
+int
+compressed_filename_p (char *filename)
+{
+ char *decompressor;
+
+ /* Find the final extension of this filename, and see if it matches one
+ of our known ones. */
+ decompressor = filesys_decompressor_for_file (filename);
+
+ if (decompressor)
+ return (1);
+ else
+ return (0);
+}
+
+/* Return the command string that would be used to decompress FILENAME. */
+char *
+filesys_decompressor_for_file (char *filename)
+{
+ register int i;
+ char *extension = (char *)NULL;
+
+ /* Find the final extension of FILENAME, and see if it appears in our
+ list of known compression extensions. */
+ for (i = strlen (filename) - 1; i > 0; i--)
+ if (filename[i] == '.')
+ {
+ extension = filename + i;
+ break;
+ }
+
+ if (!extension)
+ return ((char *)NULL);
+
+ for (i = 0; compress_suffixes[i].suffix; i++)
+ if (FILENAME_CMP (extension, compress_suffixes[i].suffix) == 0)
+ return (compress_suffixes[i].decompressor);
+
+#if defined (__MSDOS__)
+ /* If no other suffix matched, allow any extension which ends
+ with `z' to be decompressed by gunzip. Due to limited 8+3 DOS
+ file namespace, we can expect many such cases, and supporting
+ every weird suffix thus produced would be a pain. */
+ if (extension[strlen (extension) - 1] == 'z' ||
+ extension[strlen (extension) - 1] == 'Z')
+ return "gunzip";
+#endif
+
+ return ((char *)NULL);
+}
+
+/* The number of the most recent file system error. */
+int filesys_error_number = 0;
+
+/* A function which returns a pointer to a static buffer containing
+ an error message for FILENAME and ERROR_NUM. */
+static char *errmsg_buf = (char *)NULL;
+static int errmsg_buf_size = 0;
+
+char *
+filesys_error_string (char *filename, int error_num)
+{
+ int len;
+ char *result;
+
+ if (error_num == 0)
+ return ((char *)NULL);
+
+ result = strerror (error_num);
+
+ len = 4 + strlen (filename) + strlen (result);
+ if (len >= errmsg_buf_size)
+ errmsg_buf = (char *)xrealloc (errmsg_buf, (errmsg_buf_size = 2 + len));
+
+ sprintf (errmsg_buf, "%s: %s", filename, result);
+ return (errmsg_buf);
+}
+
+
+/* Check for "dir" with all the possible info and compression suffixes,
+ in combination. */
+
+int
+is_dir_name (char *filename)
+{
+ unsigned i;
+
+ for (i = 0; info_suffixes[i]; i++)
+ {
+ unsigned c;
+ char trydir[50];
+ strcpy (trydir, "dir");
+ strcat (trydir, info_suffixes[i]);
+
+ if (strcasecmp (filename, trydir) == 0)
+ return 1;
+
+ for (c = 0; compress_suffixes[c].suffix; c++)
+ {
+ char dir_compressed[50]; /* can be short */
+ strcpy (dir_compressed, trydir);
+ strcat (dir_compressed, compress_suffixes[c].suffix);
+ if (strcasecmp (filename, dir_compressed) == 0)
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/Build/source/utils/texinfo/info/filesys.h b/Build/source/utils/texinfo/info/filesys.h
new file mode 100644
index 00000000000..89ca5430807
--- /dev/null
+++ b/Build/source/utils/texinfo/info/filesys.h
@@ -0,0 +1,92 @@
+/* filesys.h -- external declarations for filesys.c.
+ $Id: filesys.h,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_FILESYS_H
+#define INFO_FILESYS_H
+
+/* The path on which we look for info files. You can initialize this
+ from the environment variable INFOPATH if there is one, or you can
+ call info_add_path () to add paths to the beginning or end of it. */
+extern char *infopath;
+
+/* Make INFOPATH have absolutely nothing in it. */
+extern void zap_infopath (void);
+
+/* Add PATH to the list of paths found in INFOPATH. 2nd argument says
+ whether to put PATH at the front or end of INFOPATH. */
+extern void info_add_path (char *path, int where);
+
+/* Defines that are passed along with the pathname to info_add_path (). */
+#define INFOPATH_PREPEND 0
+#define INFOPATH_APPEND 1
+
+/* Expand the filename in PARTIAL to make a real name for this operating
+ system. This looks in INFO_PATHS in order to find the correct file.
+ If it can't find the file, it returns NULL. */
+extern char *info_find_fullpath (char *partial);
+
+/* Given a chunk of text and its length, convert all CRLF pairs at the
+ EOLs into a single Newline character. Return the length of produced
+ text. */
+long convert_eols (char *text, long textlen);
+
+/* Read the contents of PATHNAME, returning a buffer with the contents of
+ that file in it, and returning the size of that buffer in FILESIZE.
+ FINFO is a stat struct which has already been filled in by the caller.
+ If the file cannot be read, return a NULL pointer. */
+extern char *filesys_read_info_file (char *pathname, long int *filesize,
+ struct stat *finfo, int *is_compressed);
+
+extern char *filesys_read_compressed (char *pathname, long int *filesize);
+
+/* Return the command string that would be used to decompress FILENAME. */
+extern char *filesys_decompressor_for_file (char *filename);
+extern int compressed_filename_p (char *filename);
+
+/* A function which returns a pointer to a static buffer containing
+ an error message for FILENAME and ERROR_NUM. */
+extern char *filesys_error_string (char *filename, int error_num);
+
+/* The number of the most recent file system error. */
+extern int filesys_error_number;
+
+/* Given a string containing units of information separated by colons,
+ return the next one pointed to by IDX, or NULL if there are no more.
+ Advance IDX to the character after the colon. */
+extern char *extract_colon_unit (char *string, int *idx);
+
+/* Return true if FILENAME is `dir', with a possible compression suffix. */
+extern int is_dir_name (char *filename);
+
+/* The default value of INFOPATH. */
+#if !defined (DEFAULT_INFOPATH)
+# define DEFAULT_INFOPATH "/usr/local/info:/usr/info:/usr/local/lib/info:/usr/lib/info:/usr/local/gnu/info:/usr/local/gnu/lib/info:/usr/gnu/info:/usr/gnu/lib/info:/opt/gnu/info:/usr/share/info:/usr/share/lib/info:/usr/local/share/info:/usr/local/share/lib/info:/usr/gnu/lib/emacs/info:/usr/local/gnu/lib/emacs/info:/usr/local/lib/emacs/info:/usr/local/emacs/info:."
+#endif /* !DEFAULT_INFOPATH */
+
+#if !defined (S_ISREG) && defined (S_IFREG)
+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif /* !S_ISREG && S_IFREG */
+
+#if !defined (S_ISDIR) && defined (S_IFDIR)
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif /* !S_ISDIR && S_IFDIR */
+
+#endif /* not INFO_FILESYS_H */
diff --git a/Build/source/utils/texinfo/info/footnotes.c b/Build/source/utils/texinfo/info/footnotes.c
new file mode 100644
index 00000000000..c8cd7b54a27
--- /dev/null
+++ b/Build/source/utils/texinfo/info/footnotes.c
@@ -0,0 +1,268 @@
+/* footnotes.c -- Some functions for manipulating footnotes.
+ $Id: footnotes.c,v 1.4 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2002, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+/* Nonzero means attempt to show footnotes when displaying a new window. */
+int auto_footnotes_p = 0;
+
+static char *footnote_nodename = "*Footnotes*";
+
+NODE * make_footnotes_node (NODE *node);
+
+#define FOOTNOTE_HEADER_FORMAT \
+ "*** Footnotes appearing in the node `%s' ***\n"
+
+/* Find the window currently showing footnotes. */
+static WINDOW *
+find_footnotes_window (void)
+{
+ WINDOW *win;
+
+ /* Try to find an existing window first. */
+ for (win = windows; win; win = win->next)
+ if (internal_info_node_p (win->node) &&
+ (strcmp (win->node->nodename, footnote_nodename) == 0))
+ break;
+
+ return (win);
+}
+
+/* Manufacture a node containing the footnotes of this node, and
+ return the manufactured node. If NODE has no footnotes, return a
+ NULL pointer. */
+NODE *
+make_footnotes_node (NODE *node)
+{
+ NODE *fn_node, *result = (NODE *)NULL;
+ long fn_start;
+
+ /* Make the initial assumption that the footnotes appear as simple
+ text within this windows node. */
+ fn_node = node;
+
+ /* See if this node contains the magic footnote label. */
+ fn_start =
+ info_search_in_node (FOOTNOTE_LABEL, node, 0, (WINDOW *)NULL, 1, 0);
+
+ /* If it doesn't, check to see if it has an associated footnotes node. */
+ if (fn_start == -1)
+ {
+ REFERENCE **refs;
+
+ refs = info_xrefs_of_node (node);
+
+ if (refs)
+ {
+ register int i;
+ char *refname;
+ int reflen = strlen ("-Footnotes") + strlen (node->nodename);
+
+ refname = (char *)xmalloc (reflen + 1);
+
+ strcpy (refname, node->nodename);
+ strcat (refname, "-Footnotes");
+
+ for (i = 0; refs[i]; i++)
+ if ((refs[i]->nodename != (char *)NULL) &&
+ /* Support both the older "foo-Footnotes" and the new
+ style "foo-Footnote-NN" references. */
+ (strcmp (refs[i]->nodename, refname) == 0 ||
+ (strncmp (refs[i]->nodename, refname, reflen - 1) == 0 &&
+ refs[i]->nodename[reflen - 1] == '-' &&
+ isdigit (refs[i]->nodename[reflen]))))
+ {
+ char *filename;
+
+ filename = node->parent;
+ if (!filename)
+ filename = node->filename;
+
+ fn_node = info_get_node (filename, refname);
+
+ if (fn_node)
+ fn_start = 0;
+
+ break;
+ }
+
+ free (refname);
+ info_free_references (refs);
+ }
+ }
+
+ /* If we never found the start of a footnotes area, quit now. */
+ if (fn_start == -1)
+ return ((NODE *)NULL);
+
+ /* Make the new node. */
+ result = (NODE *)xmalloc (sizeof (NODE));
+ result->flags = 0;
+ result->display_pos = 0;
+
+ /* Get the size of the footnotes appearing within this node. */
+ {
+ char *header;
+ long text_start = fn_start;
+
+ header = (char *)xmalloc
+ (1 + strlen (node->nodename) + strlen (FOOTNOTE_HEADER_FORMAT));
+ sprintf (header, FOOTNOTE_HEADER_FORMAT, node->nodename);
+
+ /* Move the start of the displayed text to right after the first line.
+ This effectively skips either "---- footno...", or "File: foo...". */
+ while (text_start < fn_node->nodelen)
+ if (fn_node->contents[text_start++] == '\n')
+ break;
+
+ result->nodelen = strlen (header) + fn_node->nodelen - text_start;
+
+ /* Set the contents of this node. */
+ result->contents = (char *)xmalloc (1 + result->nodelen);
+ sprintf (result->contents, "%s", header);
+ memcpy (result->contents + strlen (header),
+ fn_node->contents + text_start, fn_node->nodelen - text_start);
+
+ name_internal_node (result, footnote_nodename);
+ free (header);
+ }
+
+#if defined (NOTDEF)
+ /* If the footnotes were gleaned from the node that we were called with,
+ shorten the calling node's display length. */
+ if (fn_node == node)
+ narrow_node (node, 0, fn_start);
+#endif /* NOTDEF */
+
+ return (result);
+}
+
+/* Create or delete the footnotes window depending on whether footnotes
+ exist in WINDOW's node or not. Returns FN_FOUND if footnotes were found
+ and displayed. Returns FN_UNFOUND if there were no footnotes found
+ in WINDOW's node. Returns FN_UNABLE if there were footnotes, but the
+ window to show them couldn't be made. */
+int
+info_get_or_remove_footnotes (WINDOW *window)
+{
+ WINDOW *fn_win;
+ NODE *new_footnotes;
+
+ fn_win = find_footnotes_window ();
+
+ /* If we are in the footnotes window, change nothing. */
+ if (fn_win == window)
+ return (FN_FOUND);
+
+ /* Try to find footnotes for this window's node. */
+ new_footnotes = make_footnotes_node (window->node);
+
+ /* If there was a window showing footnotes, and there are no footnotes
+ for the current window, delete the old footnote window. */
+ if (fn_win && !new_footnotes)
+ {
+ if (windows->next)
+ info_delete_window_internal (fn_win);
+ }
+
+ /* If there are footnotes for this window's node, but no window around
+ showing footnotes, try to make a new window. */
+ if (new_footnotes && !fn_win)
+ {
+ WINDOW *old_active;
+ WINDOW *last, *win;
+
+ /* Always make this window be the last one appearing in the list. Find
+ the last window in the chain. */
+ for (win = windows, last = windows; win; last = win, win = win->next);
+
+ /* Try to split this window, and make the split window the one to
+ contain the footnotes. */
+ old_active = active_window;
+ active_window = last;
+ fn_win = window_make_window (new_footnotes);
+ active_window = old_active;
+
+ if (!fn_win)
+ {
+ free (new_footnotes->contents);
+ free (new_footnotes);
+
+ /* If we are hacking automatic footnotes, and there are footnotes
+ but we couldn't display them, print a message to that effect. */
+ if (auto_footnotes_p)
+ inform_in_echo_area ((char *) _("Footnotes could not be displayed"));
+ return (FN_UNABLE);
+ }
+ }
+
+ /* If there are footnotes, and there is a window to display them,
+ make that window be the number of lines appearing in the footnotes. */
+ if (new_footnotes && fn_win)
+ {
+ window_set_node_of_window (fn_win, new_footnotes);
+
+ window_change_window_height
+ (fn_win, fn_win->line_count - fn_win->height);
+
+ remember_window_and_node (fn_win, new_footnotes);
+ add_gcable_pointer (new_footnotes->contents);
+ }
+
+ if (!new_footnotes)
+ return (FN_UNFOUND);
+ else
+ return (FN_FOUND);
+}
+
+/* Show the footnotes associated with this node in another window. */
+DECLARE_INFO_COMMAND (info_show_footnotes,
+ _("Show the footnotes associated with this node in another window"))
+{
+ /* A negative argument means just make the window go away. */
+ if (count < 0)
+ {
+ WINDOW *fn_win = find_footnotes_window ();
+
+ /* If there is an old footnotes window, and it isn't the only window
+ on the screen, delete it. */
+ if (fn_win && windows->next)
+ info_delete_window_internal (fn_win);
+ }
+ else
+ {
+ int result;
+
+ result = info_get_or_remove_footnotes (window);
+
+ switch (result)
+ {
+ case FN_UNFOUND:
+ info_error ((char *) msg_no_foot_node, NULL, NULL);
+ break;
+
+ case FN_UNABLE:
+ info_error ((char *) msg_win_too_small, NULL, NULL);
+ break;
+ }
+ }
+}
diff --git a/Build/source/utils/texinfo/info/footnotes.h b/Build/source/utils/texinfo/info/footnotes.h
new file mode 100644
index 00000000000..7f583994261
--- /dev/null
+++ b/Build/source/utils/texinfo/info/footnotes.h
@@ -0,0 +1,43 @@
+/* footnotes.h -- Some functions for manipulating footnotes.
+ $Id: footnotes.h,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_FOOTNOTES_H
+#define INFO_FOOTNOTES_H
+
+/* Magic string which indicates following text is footnotes. */
+#define FOOTNOTE_LABEL N_("---------- Footnotes ----------")
+
+#define FN_FOUND 0
+#define FN_UNFOUND 1
+#define FN_UNABLE 2
+
+
+/* Create or delete the footnotes window depending on whether footnotes
+ exist in WINDOW's node or not. Returns FN_FOUND if footnotes were found
+ and displayed. Returns FN_UNFOUND if there were no footnotes found
+ in WINDOW's node. Returns FN_UNABLE if there were footnotes, but the
+ window to show them couldn't be made. */
+extern int info_get_or_remove_footnotes (WINDOW *window);
+
+/* Non-zero means attempt to show footnotes when displaying a new window. */
+extern int auto_footnotes_p;
+
+#endif /* not INFO_FOOTNOTES_H */
diff --git a/Build/source/utils/texinfo/info/gc.c b/Build/source/utils/texinfo/info/gc.c
new file mode 100644
index 00000000000..9416e3bb2e8
--- /dev/null
+++ b/Build/source/utils/texinfo/info/gc.c
@@ -0,0 +1,92 @@
+/* gc.c -- Functions to remember and garbage collect unused node contents.
+ $Id: gc.c,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+/* Array of pointers to the contents of gc-able nodes. A pointer on this
+ list can be garbage collected when no info window contains a node whose
+ contents member match the pointer. */
+static char **gcable_pointers = (char **)NULL;
+static int gcable_pointers_index = 0;
+static int gcable_pointers_slots = 0;
+
+/* Add POINTER to the list of garbage collectible pointers. A pointer
+ is not actually garbage collected until no info window contains a node
+ whose contents member is equal to the pointer. */
+void
+add_gcable_pointer (char *pointer)
+{
+ gc_pointers ();
+ add_pointer_to_array (pointer, gcable_pointers_index, gcable_pointers,
+ gcable_pointers_slots, 10, char *);
+}
+
+/* Grovel the list of info windows and gc-able pointers finding those
+ node->contents which are collectible, and free them. */
+void
+gc_pointers (void)
+{
+ register int i, j, k;
+ INFO_WINDOW *iw;
+ char **new = (char **)NULL;
+ int new_index = 0;
+ int new_slots = 0;
+
+ if (!info_windows || !gcable_pointers_index)
+ return;
+
+ for (i = 0; (iw = info_windows[i]); i++)
+ {
+ for (j = 0; j < iw->nodes_index; j++)
+ {
+ NODE *node = iw->nodes[j];
+
+ /* If this node->contents appears in our list of gcable_pointers,
+ it is not gc-able, so save it. */
+ for (k = 0; k < gcable_pointers_index; k++)
+ if (gcable_pointers[k] == node->contents)
+ {
+ add_pointer_to_array
+ (node->contents, new_index, new, new_slots, 10, char *);
+ break;
+ }
+ }
+ }
+
+ /* We have gathered all of the pointers which need to be saved. Free any
+ of the original pointers which do not appear in the new list. */
+ for (i = 0; i < gcable_pointers_index; i++)
+ {
+ for (j = 0; j < new_index; j++)
+ if (gcable_pointers[i] == new[j])
+ break;
+
+ /* If we got all the way through the new list, then the old pointer
+ can be garbage collected. */
+ if (new && !new[j])
+ free (gcable_pointers[i]);
+ }
+
+ free (gcable_pointers);
+ gcable_pointers = new;
+ gcable_pointers_slots = new_slots;
+ gcable_pointers_index = new_index;
+}
diff --git a/Build/source/utils/texinfo/info/gc.h b/Build/source/utils/texinfo/info/gc.h
new file mode 100644
index 00000000000..67d031f9b87
--- /dev/null
+++ b/Build/source/utils/texinfo/info/gc.h
@@ -0,0 +1,37 @@
+/* gc.h -- Functions for garbage collecting unused node contents.
+ $Id: gc.h,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_GC_H
+#define INFO_GC_H
+
+/* Add POINTER to the list of garbage collectible pointers. A pointer
+ is not actually garbage collected until no info window contains a node
+ whose contents member is equal to the pointer. */
+extern void add_gcable_pointer (char *pointer);
+
+/* Grovel the list of info windows and gc-able pointers finding those
+ node->contents which are collectible, and free them. */
+extern void gc_pointers (void);
+
+#endif /* not INFO_GC_H */
diff --git a/Build/source/utils/texinfo/info/indices.c b/Build/source/utils/texinfo/info/indices.c
new file mode 100644
index 00000000000..f5b0eb57633
--- /dev/null
+++ b/Build/source/utils/texinfo/info/indices.c
@@ -0,0 +1,735 @@
+/* indices.c -- deal with an Info file index.
+ $Id: indices.c,v 1.5 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "indices.h"
+
+/* User-visible variable controls the output of info-index-next. */
+int show_index_match = 1;
+
+/* In the Info sense, an index is a menu. This variable holds the last
+ parsed index. */
+static REFERENCE **index_index = (REFERENCE **)NULL;
+
+/* The offset of the most recently selected index element. */
+static int index_offset = 0;
+
+/* Variable which holds the last string searched for. */
+static char *index_search = (char *)NULL;
+
+/* A couple of "globals" describing where the initial index was found. */
+static char *initial_index_filename = (char *)NULL;
+static char *initial_index_nodename = (char *)NULL;
+
+/* A structure associating index names with index offset ranges. */
+typedef struct {
+ char *name; /* The nodename of this index. */
+ int first; /* The index in our list of the first entry. */
+ int last; /* The index in our list of the last entry. */
+} INDEX_NAME_ASSOC;
+
+/* An array associating index nodenames with index offset ranges. */
+static INDEX_NAME_ASSOC **index_nodenames = (INDEX_NAME_ASSOC **)NULL;
+static int index_nodenames_index = 0;
+static int index_nodenames_slots = 0;
+
+/* Add the name of NODE, and the range of the associated index elements
+ (passed in ARRAY) to index_nodenames. */
+static void
+add_index_to_index_nodenames (REFERENCE **array, NODE *node)
+{
+ register int i, last;
+ INDEX_NAME_ASSOC *assoc;
+
+ for (last = 0; array[last + 1]; last++);
+ assoc = (INDEX_NAME_ASSOC *)xmalloc (sizeof (INDEX_NAME_ASSOC));
+ assoc->name = xstrdup (node->nodename);
+
+ if (!index_nodenames_index)
+ {
+ assoc->first = 0;
+ assoc->last = last;
+ }
+ else
+ {
+ for (i = 0; index_nodenames[i + 1]; i++);
+ assoc->first = 1 + index_nodenames[i]->last;
+ assoc->last = assoc->first + last;
+ }
+ add_pointer_to_array
+ (assoc, index_nodenames_index, index_nodenames, index_nodenames_slots,
+ 10, INDEX_NAME_ASSOC *);
+}
+
+/* Find and return the indices of WINDOW's file. The indices are defined
+ as the first node in the file containing the word "Index" and any
+ immediately following nodes whose names also contain "Index". All such
+ indices are concatenated and the result returned. If WINDOW's info file
+ doesn't have any indices, a NULL pointer is returned. */
+REFERENCE **
+info_indices_of_window (WINDOW *window)
+{
+ FILE_BUFFER *fb;
+
+ fb = file_buffer_of_window (window);
+
+ return (info_indices_of_file_buffer (fb));
+}
+
+REFERENCE **
+info_indices_of_file_buffer (FILE_BUFFER *file_buffer)
+{
+ register int i;
+ REFERENCE **result = (REFERENCE **)NULL;
+
+ /* No file buffer, no indices. */
+ if (!file_buffer)
+ return ((REFERENCE **)NULL);
+
+ /* Reset globals describing where the index was found. */
+ maybe_free (initial_index_filename);
+ maybe_free (initial_index_nodename);
+ initial_index_filename = (char *)NULL;
+ initial_index_nodename = (char *)NULL;
+
+ if (index_nodenames)
+ {
+ for (i = 0; index_nodenames[i]; i++)
+ {
+ free (index_nodenames[i]->name);
+ free (index_nodenames[i]);
+ }
+
+ index_nodenames_index = 0;
+ index_nodenames[0] = (INDEX_NAME_ASSOC *)NULL;
+ }
+
+ /* Grovel the names of the nodes found in this file. */
+ if (file_buffer->tags)
+ {
+ TAG *tag;
+
+ for (i = 0; (tag = file_buffer->tags[i]); i++)
+ {
+ if (string_in_line ("Index", tag->nodename) != -1)
+ {
+ NODE *node;
+ REFERENCE **menu;
+
+ /* Found one. Get its menu. */
+ node = info_get_node (tag->filename, tag->nodename);
+ if (!node)
+ continue;
+
+ /* Remember the filename and nodename of this index. */
+ initial_index_filename = xstrdup (file_buffer->filename);
+ initial_index_nodename = xstrdup (tag->nodename);
+
+ menu = info_menu_of_node (node);
+
+ /* If we have a menu, add this index's nodename and range
+ to our list of index_nodenames. */
+ if (menu)
+ {
+ add_index_to_index_nodenames (menu, node);
+
+ /* Concatenate the references found so far. */
+ result = info_concatenate_references (result, menu);
+ }
+ free (node);
+ }
+ }
+ }
+
+ /* If there is a result, clean it up so that every entry has a filename. */
+ for (i = 0; result && result[i]; i++)
+ if (!result[i]->filename)
+ result[i]->filename = xstrdup (file_buffer->filename);
+
+ return (result);
+}
+
+DECLARE_INFO_COMMAND (info_index_search,
+ _("Look up a string in the index for this file"))
+{
+ do_info_index_search (window, count, 0);
+}
+
+/* Look up SEARCH_STRING in the index for this file. If SEARCH_STRING
+ is NULL, prompt user for input. */
+void
+do_info_index_search (WINDOW *window, int count, char *search_string)
+{
+ FILE_BUFFER *fb;
+ char *line;
+
+ /* Reset the index offset, since this is not the info-index-next command. */
+ index_offset = 0;
+
+ /* The user is selecting a new search string, so flush the old one. */
+ maybe_free (index_search);
+ index_search = (char *)NULL;
+
+ /* If this window's file is not the same as the one that we last built an
+ index for, build and remember an index now. */
+ fb = file_buffer_of_window (window);
+ if (!initial_index_filename ||
+ (FILENAME_CMP (initial_index_filename, fb->filename) != 0))
+ {
+ info_free_references (index_index);
+ window_message_in_echo_area ((char *) _("Finding index entries..."),
+ NULL, NULL);
+ index_index = info_indices_of_file_buffer (fb);
+ }
+
+ /* If there is no index, quit now. */
+ if (!index_index)
+ {
+ info_error ((char *) _("No indices found."), NULL, NULL);
+ return;
+ }
+
+ /* Okay, there is an index. Look for SEARCH_STRING, or, if it is
+ empty, prompt for one. */
+ if (search_string && *search_string)
+ line = xstrdup (search_string);
+ else
+ {
+ line = info_read_maybe_completing (window, (char *) _("Index entry: "),
+ index_index);
+ window = active_window;
+
+ /* User aborted? */
+ if (!line)
+ {
+ info_abort_key (active_window, 1, 0);
+ return;
+ }
+
+ /* Empty line means move to the Index node. */
+ if (!*line)
+ {
+ free (line);
+
+ if (initial_index_filename && initial_index_nodename)
+ {
+ NODE *node;
+
+ node = info_get_node (initial_index_filename,
+ initial_index_nodename);
+ set_remembered_pagetop_and_point (window);
+ window_set_node_of_window (window, node);
+ remember_window_and_node (window, node);
+ window_clear_echo_area ();
+ return;
+ }
+ }
+ }
+
+ /* The user typed either a completed index label, or a partial string.
+ Find an exact match, or, failing that, the first index entry containing
+ the partial string. So, we just call info_next_index_match () with minor
+ manipulation of INDEX_OFFSET. */
+ {
+ int old_offset;
+
+ /* Start the search right after/before this index. */
+ if (count < 0)
+ {
+ register int i;
+ for (i = 0; index_index[i]; i++);
+ index_offset = i;
+ }
+ else
+ index_offset = -1;
+
+ old_offset = index_offset;
+
+ /* The "last" string searched for is this one. */
+ index_search = line;
+
+ /* Find it, or error. */
+ info_next_index_match (window, count, 0);
+
+ /* If the search failed, return the index offset to where it belongs. */
+ if (index_offset == old_offset)
+ index_offset = 0;
+ }
+}
+
+int
+index_entry_exists (WINDOW *window, char *string)
+{
+ register int i;
+ FILE_BUFFER *fb;
+
+ /* If there is no previous search string, the user hasn't built an index
+ yet. */
+ if (!string)
+ return 0;
+
+ fb = file_buffer_of_window (window);
+ if (!initial_index_filename
+ || (FILENAME_CMP (initial_index_filename, fb->filename) != 0))
+ {
+ info_free_references (index_index);
+ index_index = info_indices_of_file_buffer (fb);
+ }
+
+ /* If there is no index, that is an error. */
+ if (!index_index)
+ return 0;
+
+ for (i = 0; (i > -1) && (index_index[i]); i++)
+ if (strcmp (string, index_index[i]->label) == 0)
+ break;
+
+ /* If that failed, look for the next substring match. */
+ if ((i < 0) || (!index_index[i]))
+ {
+ for (i = 0; (i > -1) && (index_index[i]); i++)
+ if (string_in_line (string, index_index[i]->label) != -1)
+ break;
+
+ if ((i > -1) && (index_index[i]))
+ string_in_line (string, index_index[i]->label);
+ }
+
+ /* If that failed, return 0. */
+ if ((i < 0) || (!index_index[i]))
+ return 0;
+
+ return 1;
+}
+
+DECLARE_INFO_COMMAND (info_next_index_match,
+ _("Go to the next matching index item from the last `\\[index-search]' command"))
+{
+ register int i;
+ int partial, dir;
+ NODE *node;
+
+ /* If there is no previous search string, the user hasn't built an index
+ yet. */
+ if (!index_search)
+ {
+ info_error ((char *) _("No previous index search string."), NULL, NULL);
+ return;
+ }
+
+ /* If there is no index, that is an error. */
+ if (!index_index)
+ {
+ info_error ((char *) _("No index entries."), NULL, NULL);
+ return;
+ }
+
+ /* The direction of this search is controlled by the value of the
+ numeric argument. */
+ if (count < 0)
+ dir = -1;
+ else
+ dir = 1;
+
+ /* Search for the next occurence of index_search. First try to find
+ an exact match. */
+ partial = 0;
+
+ for (i = index_offset + dir; (i > -1) && (index_index[i]); i += dir)
+ if (strcmp (index_search, index_index[i]->label) == 0)
+ break;
+
+ /* If that failed, look for the next substring match. */
+ if ((i < 0) || (!index_index[i]))
+ {
+ for (i = index_offset + dir; (i > -1) && (index_index[i]); i += dir)
+ if (string_in_line (index_search, index_index[i]->label) != -1)
+ break;
+
+ if ((i > -1) && (index_index[i]))
+ partial = string_in_line (index_search, index_index[i]->label);
+ }
+
+ /* If that failed, print an error. */
+ if ((i < 0) || (!index_index[i]))
+ {
+ info_error ((char *) _("No %sindex entries containing `%s'."),
+ index_offset > 0 ? (char *) _("more ") : "", index_search);
+ return;
+ }
+
+ /* Okay, we found the next one. Move the offset to the current entry. */
+ index_offset = i;
+
+ /* Report to the user on what we have found. */
+ {
+ register int j;
+ const char *name = _("CAN'T SEE THIS");
+ char *match;
+
+ for (j = 0; index_nodenames[j]; j++)
+ {
+ if ((i >= index_nodenames[j]->first) &&
+ (i <= index_nodenames[j]->last))
+ {
+ name = index_nodenames[j]->name;
+ break;
+ }
+ }
+
+ /* If we had a partial match, indicate to the user which part of the
+ string matched. */
+ match = xstrdup (index_index[i]->label);
+
+ if (partial && show_index_match)
+ {
+ int k, ls, start, upper;
+
+ ls = strlen (index_search);
+ start = partial - ls;
+ upper = isupper (match[start]) ? 1 : 0;
+
+ for (k = 0; k < ls; k++)
+ if (upper)
+ match[k + start] = info_tolower (match[k + start]);
+ else
+ match[k + start] = info_toupper (match[k + start]);
+ }
+
+ {
+ char *format;
+
+ format = replace_in_documentation
+ ((char *) _("Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"),
+ 0);
+
+ window_message_in_echo_area (format, match, (char *) name);
+ }
+
+ free (match);
+ }
+
+ /* Select the node corresponding to this index entry. */
+ node = info_get_node (index_index[i]->filename, index_index[i]->nodename);
+
+ if (!node)
+ {
+ info_error ((char *) msg_cant_file_node,
+ index_index[i]->filename, index_index[i]->nodename);
+ return;
+ }
+
+ info_set_node_of_window (1, window, node);
+
+ /* Try to find an occurence of LABEL in this node. */
+ {
+ long start, loc;
+
+ start = window->line_starts[1] - window->node->contents;
+ loc = info_target_search_node (node, index_index[i]->label, start);
+
+ if (loc != -1)
+ {
+ window->point = loc;
+ window_adjust_pagetop (window);
+ }
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Info APROPOS: Search every known index. */
+/* */
+/* **************************************************************** */
+
+/* For every menu item in DIR, search the indices of that file for
+ SEARCH_STRING. */
+REFERENCE **
+apropos_in_all_indices (char *search_string, int inform)
+{
+ register int i, dir_index;
+ REFERENCE **all_indices = (REFERENCE **)NULL;
+ REFERENCE **dir_menu = (REFERENCE **)NULL;
+ NODE *dir_node;
+
+ dir_node = info_get_node ("dir", "Top");
+ if (dir_node)
+ dir_menu = info_menu_of_node (dir_node);
+
+ if (!dir_menu)
+ return NULL;
+
+ /* For every menu item in DIR, get the associated node's file buffer and
+ read the indices of that file buffer. Gather all of the indices into
+ one large one. */
+ for (dir_index = 0; dir_menu[dir_index]; dir_index++)
+ {
+ REFERENCE **this_index, *this_item;
+ NODE *this_node;
+ FILE_BUFFER *this_fb;
+ int dir_node_duplicated = 0;
+
+ this_item = dir_menu[dir_index];
+
+ if (!this_item->filename)
+ {
+ dir_node_duplicated = 1;
+ if (dir_node->parent)
+ this_item->filename = xstrdup (dir_node->parent);
+ else
+ this_item->filename = xstrdup (dir_node->filename);
+ }
+
+ /* Find this node. If we cannot find it, try using the label of the
+ entry as a file (i.e., "(LABEL)Top"). */
+ this_node = info_get_node (this_item->filename, this_item->nodename);
+
+ if (!this_node && this_item->nodename &&
+ (strcmp (this_item->label, this_item->nodename) == 0))
+ this_node = info_get_node (this_item->label, "Top");
+
+ if (!this_node)
+ {
+ if (dir_node_duplicated)
+ free (this_item->filename);
+ continue;
+ }
+
+ /* Get the file buffer associated with this node. */
+ {
+ char *files_name;
+
+ files_name = this_node->parent;
+ if (!files_name)
+ files_name = this_node->filename;
+
+ this_fb = info_find_file (files_name);
+
+ /* If we already scanned this file, don't do that again.
+ In addition to being faster, this also avoids having
+ multiple identical entries in the *Apropos* menu. */
+ for (i = 0; i < dir_index; i++)
+ if (FILENAME_CMP (this_fb->filename, dir_menu[i]->filename) == 0)
+ break;
+ if (i < dir_index)
+ {
+ if (dir_node_duplicated)
+ free (this_item->filename);
+ continue;
+ }
+
+ if (this_fb && inform)
+ message_in_echo_area ((char *) _("Scanning indices of `%s'..."),
+ files_name, NULL);
+
+ this_index = info_indices_of_file_buffer (this_fb);
+ free (this_node);
+
+ if (this_fb && inform)
+ unmessage_in_echo_area ();
+ }
+
+ if (this_index)
+ {
+ /* Remember the filename which contains this set of references. */
+ for (i = 0; this_index && this_index[i]; i++)
+ if (!this_index[i]->filename)
+ this_index[i]->filename = xstrdup (this_fb->filename);
+
+ /* Concatenate with the other indices. */
+ all_indices = info_concatenate_references (all_indices, this_index);
+ }
+ }
+
+ info_free_references (dir_menu);
+
+ /* Build a list of the references which contain SEARCH_STRING. */
+ if (all_indices)
+ {
+ REFERENCE *entry, **apropos_list = (REFERENCE **)NULL;
+ int apropos_list_index = 0;
+ int apropos_list_slots = 0;
+
+ for (i = 0; (entry = all_indices[i]); i++)
+ {
+ if (string_in_line (search_string, entry->label) != -1)
+ {
+ add_pointer_to_array
+ (entry, apropos_list_index, apropos_list, apropos_list_slots,
+ 100, REFERENCE *);
+ }
+ else
+ {
+ maybe_free (entry->label);
+ maybe_free (entry->filename);
+ maybe_free (entry->nodename);
+ free (entry);
+ }
+ }
+
+ free (all_indices);
+ all_indices = apropos_list;
+ }
+ return (all_indices);
+}
+
+#define APROPOS_NONE \
+ N_("No available info files have `%s' in their indices.")
+
+void
+info_apropos (char *string)
+{
+ REFERENCE **apropos_list;
+
+ apropos_list = apropos_in_all_indices (string, 0);
+
+ if (!apropos_list)
+ info_error ((char *) _(APROPOS_NONE), string, NULL);
+ else
+ {
+ register int i;
+ REFERENCE *entry;
+
+ for (i = 0; (entry = apropos_list[i]); i++)
+ fprintf (stdout, "\"(%s)%s\" -- %s\n",
+ entry->filename, entry->nodename, entry->label);
+ }
+ info_free_references (apropos_list);
+}
+
+static char *apropos_list_nodename = "*Apropos*";
+
+DECLARE_INFO_COMMAND (info_index_apropos,
+ _("Grovel all known info file's indices for a string and build a menu"))
+{
+ char *line;
+
+ line = info_read_in_echo_area (window, (char *) _("Index apropos: "));
+
+ window = active_window;
+
+ /* User aborted? */
+ if (!line)
+ {
+ info_abort_key (window, 1, 1);
+ return;
+ }
+
+ /* User typed something? */
+ if (*line)
+ {
+ REFERENCE **apropos_list;
+ NODE *apropos_node;
+
+ apropos_list = apropos_in_all_indices (line, 1);
+
+ if (!apropos_list)
+ info_error ((char *) _(APROPOS_NONE), line, NULL);
+ else
+ {
+ register int i;
+ char *line_buffer;
+
+ initialize_message_buffer ();
+ printf_to_message_buffer
+ ((char *) _("\n* Menu: Nodes whose indices contain `%s':\n"),
+ line, NULL, NULL);
+ line_buffer = (char *)xmalloc (500);
+
+ for (i = 0; apropos_list[i]; i++)
+ {
+ int len;
+ /* The label might be identical to that of another index
+ entry in another Info file. Therefore, we make the file
+ name part of the menu entry, to make them all distinct. */
+ sprintf (line_buffer, "* %s [%s]: ",
+ apropos_list[i]->label, apropos_list[i]->filename);
+ len = pad_to (40, line_buffer);
+ sprintf (line_buffer + len, "(%s)%s.",
+ apropos_list[i]->filename, apropos_list[i]->nodename);
+ printf_to_message_buffer ("%s\n", line_buffer, NULL, NULL);
+ }
+ free (line_buffer);
+ }
+
+ apropos_node = message_buffer_to_node ();
+ add_gcable_pointer (apropos_node->contents);
+ name_internal_node (apropos_node, apropos_list_nodename);
+
+ /* Even though this is an internal node, we don't want the window
+ system to treat it specially. So we turn off the internalness
+ of it here. */
+ apropos_node->flags &= ~N_IsInternal;
+
+ /* Find/Create a window to contain this node. */
+ {
+ WINDOW *new;
+ NODE *node;
+
+ set_remembered_pagetop_and_point (window);
+
+ /* If a window is visible and showing an apropos list already,
+ re-use it. */
+ for (new = windows; new; new = new->next)
+ {
+ node = new->node;
+
+ if (internal_info_node_p (node) &&
+ (strcmp (node->nodename, apropos_list_nodename) == 0))
+ break;
+ }
+
+ /* If we couldn't find an existing window, try to use the next window
+ in the chain. */
+ if (!new && window->next)
+ new = window->next;
+
+ /* If we still don't have a window, make a new one to contain
+ the list. */
+ if (!new)
+ {
+ WINDOW *old_active;
+
+ old_active = active_window;
+ active_window = window;
+ new = window_make_window ((NODE *)NULL);
+ active_window = old_active;
+ }
+
+ /* If we couldn't make a new window, use this one. */
+ if (!new)
+ new = window;
+
+ /* Lines do not wrap in this window. */
+ new->flags |= W_NoWrap;
+
+ window_set_node_of_window (new, apropos_node);
+ remember_window_and_node (new, apropos_node);
+ active_window = new;
+ }
+ info_free_references (apropos_list);
+ }
+ free (line);
+
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
diff --git a/Build/source/utils/texinfo/info/indices.h b/Build/source/utils/texinfo/info/indices.h
new file mode 100644
index 00000000000..1ccd6763616
--- /dev/null
+++ b/Build/source/utils/texinfo/info/indices.h
@@ -0,0 +1,45 @@
+/* indices.h -- Functions defined in indices.c.
+ $Id: indices.h,v 1.3 2004/04/11 17:56:45 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_INDICES_H
+#define INFO_INDICES_H
+
+/* User-visible variable controls the output of info-index-next. */
+extern int show_index_match;
+
+extern REFERENCE **info_indices_of_window (WINDOW *window);
+extern REFERENCE **info_indices_of_file_buffer (FILE_BUFFER *file_buffer);
+extern void info_apropos (char *string);
+
+/* For every menu item in DIR, search the indices of that file for STRING. */
+REFERENCE **apropos_in_all_indices (char *search_string, int inform);
+
+/* User visible functions declared in indices.c. */
+extern void info_index_search (WINDOW *window, int count, unsigned char key);
+extern void info_next_index_match (WINDOW *window, int count, unsigned char key);
+extern void info_index_apropos (WINDOW *window, int count, unsigned char key);
+extern void do_info_index_search (WINDOW *window, int count, char *search_string);
+extern int index_entry_exists (WINDOW *window, char *string);
+
+#endif /* not INFO_INDICES_H */
diff --git a/Build/source/utils/texinfo/info/info-utils.c b/Build/source/utils/texinfo/info/info-utils.c
new file mode 100644
index 00000000000..c23bac571ae
--- /dev/null
+++ b/Build/source/utils/texinfo/info/info-utils.c
@@ -0,0 +1,701 @@
+/* info-utils.c -- miscellanous.
+ $Id: info-utils.c,v 1.4 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1998, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "info-utils.h"
+#if defined (HANDLE_MAN_PAGES)
+# include "man.h"
+#endif /* HANDLE_MAN_PAGES */
+
+/* When non-zero, various display and input functions handle ISO Latin
+ character sets correctly. */
+int ISO_Latin_p = 1;
+
+/* Variable which holds the most recent filename parsed as a result of
+ calling info_parse_xxx (). */
+char *info_parsed_filename = (char *)NULL;
+
+/* Variable which holds the most recent nodename parsed as a result of
+ calling info_parse_xxx (). */
+char *info_parsed_nodename = (char *)NULL;
+
+/* Variable which holds the most recent line number parsed as a result of
+ calling info_parse_xxx (). */
+int info_parsed_line_number = 0;
+
+/* Functions to remember a filename or nodename for later return. */
+static void save_filename (char *filename);
+static void saven_filename (char *filename, int len);
+static void save_nodename (char *nodename);
+static void saven_nodename (char *nodename, int len);
+
+/* How to get a reference (either menu or cross). */
+static REFERENCE **info_references_internal (char *label,
+ SEARCH_BINDING *binding);
+
+/* Parse the filename and nodename out of STRING. If STRING doesn't
+ contain a filename (i.e., it is NOT (FILENAME)NODENAME) then set
+ INFO_PARSED_FILENAME to NULL. If second argument NEWLINES_OKAY is
+ non-zero, it says to allow the nodename specification to cross a
+ newline boundary (i.e., only `,', `.', or `TAB' can end the spec). */
+void
+info_parse_node (char *string, int newlines_okay)
+{
+ register int i = 0;
+
+ /* Default the answer. */
+ save_filename ((char *)NULL);
+ save_nodename ((char *)NULL);
+
+ /* Special case of nothing passed. Return nothing. */
+ if (!string || !*string)
+ return;
+
+ string += skip_whitespace (string);
+
+ /* Check for (FILENAME)NODENAME. */
+ if (*string == '(')
+ {
+ i = 0;
+ /* Advance past the opening paren. */
+ string++;
+
+ /* Find the closing paren. */
+ while (string[i] && string[i] != ')')
+ i++;
+
+ /* Remember parsed filename. */
+ saven_filename (string, i);
+
+ /* Point directly at the nodename. */
+ string += i;
+
+ if (*string)
+ string++;
+ }
+
+ /* Parse out nodename. */
+ i = skip_node_characters (string, newlines_okay);
+ saven_nodename (string, i);
+ canonicalize_whitespace (info_parsed_nodename);
+ if (info_parsed_nodename && !*info_parsed_nodename)
+ {
+ free (info_parsed_nodename);
+ info_parsed_nodename = (char *)NULL;
+ }
+
+ /* Parse ``(line ...)'' part of menus, if any. */
+ {
+ char *rest = string + i;
+
+ /* Advance only if it's not already at end of string. */
+ if (*rest)
+ rest++;
+
+ /* Skip any whitespace first, and then a newline in case the item
+ was so long to contain the ``(line ...)'' string in the same
+ physical line. */
+ while (whitespace(*rest))
+ rest++;
+ if (*rest == '\n')
+ {
+ rest++;
+ while (whitespace(*rest))
+ rest++;
+ }
+
+ /* Are we looking at an opening parenthesis? That can only mean
+ we have a winner. :) */
+ if (strncmp (rest, "(line ", strlen ("(line ")) == 0)
+ {
+ rest += strlen ("(line ");
+ info_parsed_line_number = strtol (rest, NULL, 0);
+ }
+ else
+ info_parsed_line_number = 0;
+ }
+}
+
+/* Return the node addressed by LABEL in NODE (usually one of "Prev:",
+ "Next:", "Up:", "File:", or "Node:". After a call to this function,
+ the global INFO_PARSED_NODENAME and INFO_PARSED_FILENAME contain
+ the information. */
+void
+info_parse_label (char *label, NODE *node)
+{
+ register int i;
+ char *nodeline;
+
+ /* Default answer to failure. */
+ save_nodename ((char *)NULL);
+ save_filename ((char *)NULL);
+
+ /* Find the label in the first line of this node. */
+ nodeline = node->contents;
+ i = string_in_line (label, nodeline);
+
+ if (i == -1)
+ return;
+
+ nodeline += i;
+ nodeline += skip_whitespace (nodeline);
+ info_parse_node (nodeline, DONT_SKIP_NEWLINES);
+}
+
+/* **************************************************************** */
+/* */
+/* Finding and Building Menus */
+/* */
+/* **************************************************************** */
+
+/* Return a NULL terminated array of REFERENCE * which represents the menu
+ found in NODE. If there is no menu in NODE, just return a NULL pointer. */
+REFERENCE **
+info_menu_of_node (NODE *node)
+{
+ long position;
+ SEARCH_BINDING tmp_search;
+ REFERENCE **menu = (REFERENCE **)NULL;
+
+ tmp_search.buffer = node->contents;
+ tmp_search.start = 0;
+ tmp_search.end = node->nodelen;
+ tmp_search.flags = S_FoldCase;
+
+ /* Find the start of the menu. */
+ position = search_forward (INFO_MENU_LABEL, &tmp_search);
+
+ if (position == -1)
+ return ((REFERENCE **) NULL);
+
+ /* We have the start of the menu now. Glean menu items from the rest
+ of the node. */
+ tmp_search.start = position + strlen (INFO_MENU_LABEL);
+ tmp_search.start += skip_line (tmp_search.buffer + tmp_search.start);
+ tmp_search.start--;
+ menu = info_menu_items (&tmp_search);
+ return (menu);
+}
+
+/* Return a NULL terminated array of REFERENCE * which represents the cross
+ refrences found in NODE. If there are no cross references in NODE, just
+ return a NULL pointer. */
+REFERENCE **
+info_xrefs_of_node (NODE *node)
+{
+ SEARCH_BINDING tmp_search;
+
+#if defined (HANDLE_MAN_PAGES)
+ if (node->flags & N_IsManPage)
+ return (xrefs_of_manpage (node));
+#endif
+
+ tmp_search.buffer = node->contents;
+ tmp_search.start = 0;
+ tmp_search.end = node->nodelen;
+ tmp_search.flags = S_FoldCase;
+
+ return (info_xrefs (&tmp_search));
+}
+
+/* Glean menu entries from BINDING->buffer + BINDING->start until we
+ have looked at the entire contents of BINDING. Return an array
+ of REFERENCE * that represents each menu item in this range. */
+REFERENCE **
+info_menu_items (SEARCH_BINDING *binding)
+{
+ return (info_references_internal (INFO_MENU_ENTRY_LABEL, binding));
+}
+
+/* Glean cross references from BINDING->buffer + BINDING->start until
+ BINDING->end. Return an array of REFERENCE * that represents each
+ cross reference in this range. */
+REFERENCE **
+info_xrefs (SEARCH_BINDING *binding)
+{
+ return (info_references_internal (INFO_XREF_LABEL, binding));
+}
+
+/* Glean cross references or menu items from BINDING. Return an array
+ of REFERENCE * that represents the items found. */
+static REFERENCE **
+info_references_internal (char *label, SEARCH_BINDING *binding)
+{
+ SEARCH_BINDING tmp_search;
+ REFERENCE **refs = (REFERENCE **)NULL;
+ int refs_index = 0, refs_slots = 0;
+ int searching_for_menu_items = 0;
+ long position;
+
+ tmp_search.buffer = binding->buffer;
+ tmp_search.start = binding->start;
+ tmp_search.end = binding->end;
+ tmp_search.flags = S_FoldCase | S_SkipDest;
+
+ searching_for_menu_items = (strcasecmp (label, INFO_MENU_ENTRY_LABEL) == 0);
+
+ while ((position = search_forward (label, &tmp_search)) != -1)
+ {
+ int offset, start;
+ char *refdef;
+ REFERENCE *entry;
+
+ tmp_search.start = position;
+ tmp_search.start += skip_whitespace (tmp_search.buffer + tmp_search.start);
+ start = tmp_search.start - binding->start;
+ refdef = tmp_search.buffer + tmp_search.start;
+ offset = string_in_line (":", refdef);
+
+ /* When searching for menu items, if no colon, there is no
+ menu item on this line. */
+ if (offset == -1)
+ {
+ if (searching_for_menu_items)
+ continue;
+ else
+ {
+ int temp;
+
+ temp = skip_line (refdef);
+ offset = string_in_line (":", refdef + temp);
+ if (offset == -1)
+ continue; /* Give up? */
+ else
+ offset += temp;
+ }
+ }
+
+ entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->filename = (char *)NULL;
+ entry->nodename = (char *)NULL;
+ entry->label = (char *)xmalloc (offset);
+ strncpy (entry->label, refdef, offset - 1);
+ entry->label[offset - 1] = '\0';
+ canonicalize_whitespace (entry->label);
+
+ refdef += offset;
+ entry->start = start;
+ entry->end = refdef - binding->buffer;
+
+ /* If this reference entry continues with another ':' then the
+ nodename is the same as the label. */
+ if (*refdef == ':')
+ {
+ entry->nodename = xstrdup (entry->label);
+ }
+ else
+ {
+ /* This entry continues with a specific nodename. Parse the
+ nodename from the specification. */
+
+ refdef += skip_whitespace_and_newlines (refdef);
+
+ if (searching_for_menu_items)
+ info_parse_node (refdef, DONT_SKIP_NEWLINES);
+ else
+ info_parse_node (refdef, SKIP_NEWLINES);
+
+ if (info_parsed_filename)
+ entry->filename = xstrdup (info_parsed_filename);
+
+ if (info_parsed_nodename)
+ entry->nodename = xstrdup (info_parsed_nodename);
+
+ entry->line_number = info_parsed_line_number;
+ }
+
+ add_pointer_to_array
+ (entry, refs_index, refs, refs_slots, 50, REFERENCE *);
+ }
+ return (refs);
+}
+
+/* Get the entry associated with LABEL in REFERENCES. Return a pointer
+ to the ENTRY if found, or NULL. */
+REFERENCE *
+info_get_labeled_reference (char *label, REFERENCE **references)
+{
+ register int i;
+ REFERENCE *entry;
+
+ for (i = 0; references && (entry = references[i]); i++)
+ {
+ if (strcmp (label, entry->label) == 0)
+ return (entry);
+ }
+ return ((REFERENCE *)NULL);
+}
+
+/* A utility function for concatenating REFERENCE **. Returns a new
+ REFERENCE ** which is the concatenation of REF1 and REF2. The REF1
+ and REF2 arrays are freed, but their contents are not. */
+REFERENCE **
+info_concatenate_references (REFERENCE **ref1, REFERENCE **ref2)
+{
+ register int i, j;
+ REFERENCE **result;
+ int size;
+
+ /* With one argument passed as NULL, simply return the other arg. */
+ if (!ref1)
+ return (ref2);
+ else if (!ref2)
+ return (ref1);
+
+ /* Get the total size of the slots that we will need. */
+ for (i = 0; ref1[i]; i++);
+ size = i;
+ for (i = 0; ref2[i]; i++);
+ size += i;
+
+ result = (REFERENCE **)xmalloc ((1 + size) * sizeof (REFERENCE *));
+
+ /* Copy the contents over. */
+ for (i = 0; ref1[i]; i++)
+ result[i] = ref1[i];
+
+ j = i;
+ for (i = 0; ref2[i]; i++)
+ result[j++] = ref2[i];
+
+ result[j] = (REFERENCE *)NULL;
+ free (ref1);
+ free (ref2);
+ return (result);
+}
+
+
+
+/* Copy a reference structure. Since we tend to free everything at
+ every opportunity, we don't share any points, but copy everything into
+ new memory. */
+REFERENCE *
+info_copy_reference (REFERENCE *src)
+{
+ REFERENCE *dest = xmalloc (sizeof (REFERENCE));
+ dest->label = src->label ? xstrdup (src->label) : NULL;
+ dest->filename = src->filename ? xstrdup (src->filename) : NULL;
+ dest->nodename = src->nodename ? xstrdup (src->nodename) : NULL;
+ dest->start = src->start;
+ dest->end = src->end;
+
+ return dest;
+}
+
+
+
+/* Free the data associated with REFERENCES. */
+void
+info_free_references (REFERENCE **references)
+{
+ register int i;
+ REFERENCE *entry;
+
+ if (references)
+ {
+ for (i = 0; references && (entry = references[i]); i++)
+ {
+ maybe_free (entry->label);
+ maybe_free (entry->filename);
+ maybe_free (entry->nodename);
+
+ free (entry);
+ }
+
+ free (references);
+ }
+}
+
+/* Search for sequences of whitespace or newlines in STRING, replacing
+ all such sequences with just a single space. Remove whitespace from
+ start and end of string. */
+void
+canonicalize_whitespace (char *string)
+{
+ register int i, j;
+ int len, whitespace_found, whitespace_loc = 0;
+ char *temp;
+
+ if (!string)
+ return;
+
+ len = strlen (string);
+ temp = (char *)xmalloc (1 + len);
+
+ /* Search for sequences of whitespace or newlines. Replace all such
+ sequences in the string with just a single space. */
+
+ whitespace_found = 0;
+ for (i = 0, j = 0; string[i]; i++)
+ {
+ if (whitespace_or_newline (string[i]))
+ {
+ whitespace_found++;
+ whitespace_loc = i;
+ continue;
+ }
+ else
+ {
+ if (whitespace_found && whitespace_loc)
+ {
+ whitespace_found = 0;
+
+ /* Suppress whitespace at start of string. */
+ if (j)
+ temp[j++] = ' ';
+ }
+
+ temp[j++] = string[i];
+ }
+ }
+
+ /* Kill trailing whitespace. */
+ if (j && whitespace (temp[j - 1]))
+ j--;
+
+ temp[j] = '\0';
+ strcpy (string, temp);
+ free (temp);
+}
+
+/* String representation of a char returned by printed_representation (). */
+static char the_rep[10];
+
+/* Return a pointer to a string which is the printed representation
+ of CHARACTER if it were printed at HPOS. */
+char *
+printed_representation (unsigned char character, int hpos)
+{
+ register int i = 0;
+ int printable_limit = ISO_Latin_p ? 255 : 127;
+
+ if (raw_escapes_p && character == '\033')
+ the_rep[i++] = character;
+ /* Show CTRL-x as ^X. */
+ else if (iscntrl (character) && character < 127)
+ {
+ switch (character)
+ {
+ case '\r':
+ case '\n':
+ the_rep[i++] = character;
+ break;
+
+ case '\t':
+ {
+ int tw;
+
+ tw = ((hpos + 8) & 0xf8) - hpos;
+ while (i < tw)
+ the_rep[i++] = ' ';
+ }
+ break;
+
+ default:
+ the_rep[i++] = '^';
+ the_rep[i++] = (character | 0x40);
+ }
+ }
+ /* Show META-x as 0370. */
+ else if (character > printable_limit)
+ {
+ sprintf (the_rep + i, "\\%0o", character);
+ i = strlen (the_rep);
+ }
+ else if (character == DEL)
+ {
+ the_rep[i++] = '^';
+ the_rep[i++] = '?';
+ }
+ else
+ the_rep[i++] = character;
+
+ the_rep[i] = 0;
+
+ return the_rep;
+}
+
+
+/* **************************************************************** */
+/* */
+/* Functions Static To This File */
+/* */
+/* **************************************************************** */
+
+/* Amount of space allocated to INFO_PARSED_FILENAME via xmalloc (). */
+static int parsed_filename_size = 0;
+
+/* Amount of space allocated to INFO_PARSED_NODENAME via xmalloc (). */
+static int parsed_nodename_size = 0;
+
+static void save_string (char *string, char **string_p, int *string_size_p);
+static void saven_string (char *string, int len, char **string_p,
+ int *string_size_p);
+
+/* Remember FILENAME in PARSED_FILENAME. An empty FILENAME is translated
+ to a NULL pointer in PARSED_FILENAME. */
+static void
+save_filename (char *filename)
+{
+ save_string (filename, &info_parsed_filename, &parsed_filename_size);
+}
+
+/* Just like save_filename (), but you pass the length of the string. */
+static void
+saven_filename (char *filename, int len)
+{
+ saven_string (filename, len,
+ &info_parsed_filename, &parsed_filename_size);
+}
+
+/* Remember NODENAME in PARSED_NODENAME. An empty NODENAME is translated
+ to a NULL pointer in PARSED_NODENAME. */
+static void
+save_nodename (char *nodename)
+{
+ save_string (nodename, &info_parsed_nodename, &parsed_nodename_size);
+}
+
+/* Just like save_nodename (), but you pass the length of the string. */
+static void
+saven_nodename (char *nodename, int len)
+{
+ saven_string (nodename, len,
+ &info_parsed_nodename, &parsed_nodename_size);
+}
+
+/* Remember STRING in STRING_P. STRING_P should currently have STRING_SIZE_P
+ bytes allocated to it. An empty STRING is translated to a NULL pointer
+ in STRING_P. */
+static void
+save_string (char *string, char **string_p, int *string_size_p)
+{
+ if (!string || !*string)
+ {
+ if (*string_p)
+ free (*string_p);
+
+ *string_p = (char *)NULL;
+ *string_size_p = 0;
+ }
+ else
+ {
+ if (strlen (string) >= (unsigned int) *string_size_p)
+ *string_p = (char *)xrealloc
+ (*string_p, (*string_size_p = 1 + strlen (string)));
+
+ strcpy (*string_p, string);
+ }
+}
+
+/* Just like save_string (), but you also pass the length of STRING. */
+static void
+saven_string (char *string, int len, char **string_p, int *string_size_p)
+{
+ if (!string)
+ {
+ if (*string_p)
+ free (*string_p);
+
+ *string_p = (char *)NULL;
+ *string_size_p = 0;
+ }
+ else
+ {
+ if (len >= *string_size_p)
+ *string_p = (char *)xrealloc (*string_p, (*string_size_p = 1 + len));
+
+ strncpy (*string_p, string, len);
+ (*string_p)[len] = '\0';
+ }
+}
+
+/* Return a pointer to the part of PATHNAME that simply defines the file. */
+char *
+filename_non_directory (char *pathname)
+{
+ register char *filename = pathname + strlen (pathname);
+
+ if (HAVE_DRIVE (pathname))
+ pathname += 2;
+
+ while (filename > pathname && !IS_SLASH (filename[-1]))
+ filename--;
+
+ return (filename);
+}
+
+/* Return non-zero if NODE is one especially created by Info. */
+int
+internal_info_node_p (NODE *node)
+{
+#if defined (NEVER)
+ if (node &&
+ (node->filename && !*node->filename) &&
+ !node->parent && node->nodename)
+ return (1);
+ else
+ return (0);
+#else
+ return ((node != (NODE *)NULL) && ((node->flags & N_IsInternal) != 0));
+#endif /* !NEVER */
+}
+
+/* Make NODE appear to be one especially created by Info. */
+void
+name_internal_node (NODE *node, char *name)
+{
+ if (!node)
+ return;
+
+ node->filename = "";
+ node->parent = (char *)NULL;
+ node->nodename = name;
+ node->flags |= N_IsInternal;
+}
+
+/* Return the window displaying NAME, the name of an internally created
+ Info window. */
+WINDOW *
+get_internal_info_window (char *name)
+{
+ WINDOW *win;
+
+ for (win = windows; win; win = win->next)
+ if (internal_info_node_p (win->node) &&
+ (strcmp (win->node->nodename, name) == 0))
+ break;
+
+ return (win);
+}
+
+/* Return a window displaying the node NODE. */
+WINDOW *
+get_window_of_node (NODE *node)
+{
+ WINDOW *win = (WINDOW *)NULL;
+
+ for (win = windows; win; win = win->next)
+ if (win->node == node)
+ break;
+
+ return (win);
+}
diff --git a/Build/source/utils/texinfo/info/info-utils.h b/Build/source/utils/texinfo/info/info-utils.h
new file mode 100644
index 00000000000..6517b152069
--- /dev/null
+++ b/Build/source/utils/texinfo/info/info-utils.h
@@ -0,0 +1,136 @@
+/* info-utils.h -- Exported functions and variables from info-utils.c.
+ $Id: info-utils.h,v 1.4 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1996, 1998, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_UTILS_H
+#define INFO_UTILS_H
+
+#include "nodes.h"
+#include "window.h"
+#include "search.h"
+
+/* Structure which describes a node reference, such as a menu entry or
+ cross reference. Arrays of such references can be built by calling
+ info_menus_of_node () or info_xrefs_of_node (). */
+typedef struct {
+ char *label; /* User Label. */
+ char *filename; /* File where this node can be found. */
+ char *nodename; /* Name of the node. */
+ int start, end; /* Offsets within the containing node of LABEL. */
+ int line_number; /* Specific line number a menu item points to. */
+} REFERENCE;
+
+/* When non-zero, various display and input functions handle ISO Latin
+ character sets correctly. */
+extern int ISO_Latin_p;
+
+/* Variable which holds the most recent filename parsed as a result of
+ calling info_parse_xxx (). */
+extern char *info_parsed_filename;
+
+/* Variable which holds the most recent nodename parsed as a result of
+ calling info_parse_xxx (). */
+extern char *info_parsed_nodename;
+
+/* Parse the filename and nodename out of STRING. If STRING doesn't
+ contain a filename (i.e., it is NOT (FILENAME)NODENAME) then set
+ INFO_PARSED_FILENAME to NULL. If second argument NEWLINES_OKAY is
+ non-zero, it says to allow the nodename specification to cross a
+ newline boundary (i.e., only `,', `.', or `TAB' can end the spec). */
+void info_parse_node (char *string, int newlines_okay);
+
+/* Return a NULL terminated array of REFERENCE * which represents the menu
+ found in NODE. If there is no menu in NODE, just return a NULL pointer. */
+extern REFERENCE **info_menu_of_node (NODE *node);
+
+/* Return a NULL terminated array of REFERENCE * which represents the cross
+ refrences found in NODE. If there are no cross references in NODE, just
+ return a NULL pointer. */
+extern REFERENCE **info_xrefs_of_node (NODE *node);
+
+/* Glean cross references from BINDING->buffer + BINDING->start until
+ BINDING->end. Return an array of REFERENCE * that represents each
+ cross reference in this range. */
+extern REFERENCE **info_xrefs (SEARCH_BINDING *binding);
+
+/* Get the entry associated with LABEL in REFERENCES. Return a pointer to
+ the reference if found, or NULL. */
+extern REFERENCE *info_get_labeled_reference (char *label,
+ REFERENCE **references);
+
+/* Glean menu entries from BINDING->buffer + BINDING->start until we
+ have looked at the entire contents of BINDING. Return an array
+ of REFERENCE * that represents each menu item in this range. */
+extern REFERENCE **info_menu_items (SEARCH_BINDING *binding);
+
+/* A utility function for concatenating REFERENCE **. Returns a new
+ REFERENCE ** which is the concatenation of REF1 and REF2. The REF1
+ and REF2 arrays are freed, but their contents are not. */
+REFERENCE **info_concatenate_references (REFERENCE **ref1, REFERENCE **ref2);
+
+/* Copy an existing reference into new memory. */
+extern REFERENCE *info_copy_reference (REFERENCE *src);
+
+/* Free the data associated with REFERENCES. */
+extern void info_free_references (REFERENCE **references);
+
+/* Search for sequences of whitespace or newlines in STRING, replacing
+ all such sequences with just a single space. Remove whitespace from
+ start and end of string. */
+void canonicalize_whitespace (char *string);
+
+/* Return a pointer to a string which is the printed representation
+ of CHARACTER if it were printed at HPOS. */
+extern char *printed_representation (unsigned char character, int hpos);
+
+/* Return a pointer to the part of PATHNAME that simply defines the file. */
+extern char *filename_non_directory (char *pathname);
+
+/* Return non-zero if NODE is one especially created by Info. */
+extern int internal_info_node_p (NODE *node);
+
+/* Make NODE appear to be one especially created by Info, and give it NAME. */
+extern void name_internal_node (NODE *node, char *name);
+
+/* Return the window displaying NAME, the name of an internally created
+ Info window. */
+extern WINDOW *get_internal_info_window (char *name);
+
+/* Return a window displaying the node NODE. */
+extern WINDOW *get_window_of_node (NODE *node);
+
+/* Return the node addressed by LABEL in NODE (usually one of "Prev:",
+ "Next:", "Up:", "File:", or "Node:". After a call to this function,
+ the globals `info_parsed_nodename' and `info_parsed_filename' contain
+ the information. */
+extern void info_parse_label (char *label, NODE *node);
+
+#define info_file_label_of_node(n) info_parse_label (INFO_FILE_LABEL, n)
+#define info_next_label_of_node(n) info_parse_label (INFO_NEXT_LABEL, n)
+#define info_up_label_of_node(n) info_parse_label (INFO_UP_LABEL, n)
+#define info_prev_label_of_node(n) \
+ do { \
+ info_parse_label (INFO_PREV_LABEL, n); \
+ if (!info_parsed_nodename && !info_parsed_filename) \
+ info_parse_label (INFO_ALTPREV_LABEL, n); \
+ } while (0)
+
+#endif /* not INFO_UTILS_H */
diff --git a/Build/source/utils/texinfo/info/info.c b/Build/source/utils/texinfo/info/info.c
new file mode 100644
index 00000000000..79dd0240c0a
--- /dev/null
+++ b/Build/source/utils/texinfo/info/info.c
@@ -0,0 +1,685 @@
+/* info.c -- Display nodes of Info files in multiple windows.
+ $Id: info.c,v 1.11 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+ 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "indices.h"
+#include "dribble.h"
+#include "getopt.h"
+#if defined (HANDLE_MAN_PAGES)
+# include "man.h"
+#endif /* HANDLE_MAN_PAGES */
+
+static char *program_name = "info";
+
+/* Non-zero means search all indices for APROPOS_SEARCH_STRING. */
+static int apropos_p = 0;
+
+/* Variable containing the string to search for when apropos_p is non-zero. */
+static char *apropos_search_string = (char *)NULL;
+
+/* Non-zero means search all indices for INDEX_SEARCH_STRING. Unlike
+ apropos, this puts the user at the node, running info. */
+static int index_search_p = 0;
+
+/* Non-zero means look for the node which describes the invocation
+ and command-line options of the program, and start the info
+ session at that node. */
+static int goto_invocation_p = 0;
+
+/* Variable containing the string to search for when index_search_p is
+ non-zero. */
+static char *index_search_string = (char *)NULL;
+
+/* Non-zero means print version info only. */
+static int print_version_p = 0;
+
+/* Non-zero means print a short description of the options. */
+static int print_help_p = 0;
+
+/* Array of the names of nodes that the user specified with "--node" on the
+ command line. */
+static char **user_nodenames = (char **)NULL;
+static int user_nodenames_index = 0;
+static int user_nodenames_slots = 0;
+
+/* String specifying the first file to load. This string can only be set
+ by the user specifying "--file" on the command line. */
+static char *user_filename = (char *)NULL;
+
+/* String specifying the name of the file to dump nodes to. This value is
+ filled if the user speficies "--output" on the command line. */
+static char *user_output_filename = (char *)NULL;
+
+/* Non-zero indicates that when "--output" is specified, all of the menu
+ items of the specified nodes (and their subnodes as well) should be
+ dumped in the order encountered. This basically can print a book. */
+int dump_subnodes = 0;
+
+/* Non-zero means make default keybindings be loosely modeled on vi(1). */
+int vi_keys_p = 0;
+
+/* Non-zero means don't remove ANSI escape sequences. */
+int raw_escapes_p = 1;
+
+/* Non-zero means print the absolute location of the file to be loaded. */
+static int print_where_p = 0;
+
+#ifdef __MSDOS__
+/* Non-zero indicates that screen output should be made 'speech-friendly'.
+ Since on MSDOS the usual behavior is to write directly to the video
+ memory, speech synthesizer software cannot grab the output. Therefore,
+ we provide a user option which tells us to avoid direct screen output
+ and use stdout instead (which loses the color output). */
+int speech_friendly = 0;
+#endif
+
+/* Structure describing the options that Info accepts. We pass this structure
+ to getopt_long (). If you add or otherwise change this structure, you must
+ also change the string which follows it. */
+#define APROPOS_OPTION 1
+#define DRIBBLE_OPTION 2
+#define RESTORE_OPTION 3
+#define IDXSRCH_OPTION 4
+static struct option long_options[] = {
+ { "apropos", 1, 0, APROPOS_OPTION },
+ { "directory", 1, 0, 'd' },
+ { "dribble", 1, 0, DRIBBLE_OPTION },
+ { "file", 1, 0, 'f' },
+ { "help", 0, &print_help_p, 1 },
+ { "index-search", 1, 0, IDXSRCH_OPTION },
+ { "location", 0, &print_where_p, 1 },
+ { "node", 1, 0, 'n' },
+ { "output", 1, 0, 'o' },
+ { "raw-escapes", 0, &raw_escapes_p, 1 },
+ { "no-raw-escapes", 0, &raw_escapes_p, 0 },
+ { "restore", 1, 0, RESTORE_OPTION },
+ { "show-options", 0, 0, 'O' },
+ { "subnodes", 0, &dump_subnodes, 1 },
+ { "usage", 0, 0, 'O' },
+ { "version", 0, &print_version_p, 1 },
+ { "vi-keys", 0, &vi_keys_p, 1 },
+ { "where", 0, &print_where_p, 1 },
+#ifdef __MSDOS__
+ { "speech-friendly", 0, &speech_friendly, 1 },
+#endif
+ {NULL, 0, NULL, 0}
+};
+
+/* String describing the shorthand versions of the long options found above. */
+#ifdef __MSDOS__
+static char *short_options = "d:n:f:ho:ORswb";
+#else
+static char *short_options = "d:n:f:ho:ORws";
+#endif
+
+/* When non-zero, the Info window system has been initialized. */
+int info_windows_initialized_p = 0;
+
+/* Some "forward" declarations. */
+static void info_short_help (void);
+static void init_messages (void);
+
+
+/* **************************************************************** */
+/* */
+/* Main Entry Point to the Info Program */
+/* */
+/* **************************************************************** */
+
+int
+main (int argc, char **argv)
+{
+ int getopt_long_index; /* Index returned by getopt_long (). */
+ NODE *initial_node; /* First node loaded by Info. */
+
+#ifdef HAVE_SETLOCALE
+ /* Set locale via LC_ALL. */
+ setlocale (LC_ALL, "");
+#endif
+
+#ifdef ENABLE_NLS
+ /* Set the text message domain. */
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+#endif
+
+ init_messages ();
+
+ while (1)
+ {
+ int option_character;
+
+ option_character = getopt_long
+ (argc, argv, short_options, long_options, &getopt_long_index);
+
+ /* getopt_long returns EOF when there are no more long options. */
+ if (option_character == EOF)
+ break;
+
+ /* If this is a long option, then get the short version of it. */
+ if (option_character == 0 && long_options[getopt_long_index].flag == 0)
+ option_character = long_options[getopt_long_index].val;
+
+ /* Case on the option that we have received. */
+ switch (option_character)
+ {
+ case 0:
+ break;
+
+ /* User wants to add a directory. */
+ case 'd':
+ info_add_path (optarg, INFOPATH_PREPEND);
+ break;
+
+ /* User is specifying a particular node. */
+ case 'n':
+ add_pointer_to_array (optarg, user_nodenames_index, user_nodenames,
+ user_nodenames_slots, 10, char *);
+ break;
+
+ /* User is specifying a particular Info file. */
+ case 'f':
+ if (user_filename)
+ free (user_filename);
+
+ user_filename = xstrdup (optarg);
+ break;
+
+ /* Treat -h like --help. */
+ case 'h':
+ print_help_p = 1;
+ break;
+
+ /* User is specifying the name of a file to output to. */
+ case 'o':
+ if (user_output_filename)
+ free (user_output_filename);
+ user_output_filename = xstrdup (optarg);
+ break;
+
+ /* User has specified that she wants to find the "Options"
+ or "Invocation" node for the program. */
+ case 'O':
+ goto_invocation_p = 1;
+ break;
+
+ /* User has specified that she wants the escape sequences
+ in man pages to be passed thru unaltered. */
+ case 'R':
+ raw_escapes_p = 1;
+ break;
+
+ /* User is specifying that she wishes to dump the subnodes of
+ the node that she is dumping. */
+ case 's':
+ dump_subnodes = 1;
+ break;
+
+ /* For compatibility with man, -w is --where. */
+ case 'w':
+ print_where_p = 1;
+ break;
+
+#ifdef __MSDOS__
+ /* User wants speech-friendly output. */
+ case 'b':
+ speech_friendly = 1;
+ break;
+#endif /* __MSDOS__ */
+
+ /* User has specified a string to search all indices for. */
+ case APROPOS_OPTION:
+ apropos_p = 1;
+ maybe_free (apropos_search_string);
+ apropos_search_string = xstrdup (optarg);
+ break;
+
+ /* User has specified a dribble file to receive keystrokes. */
+ case DRIBBLE_OPTION:
+ close_dribble_file ();
+ open_dribble_file (optarg);
+ break;
+
+ /* User has specified an alternate input stream. */
+ case RESTORE_OPTION:
+ info_set_input_from_file (optarg);
+ break;
+
+ /* User has specified a string to search all indices for. */
+ case IDXSRCH_OPTION:
+ index_search_p = 1;
+ maybe_free (index_search_string);
+ index_search_string = xstrdup (optarg);
+ break;
+
+ default:
+ fprintf (stderr, _("Try --help for more information.\n"));
+ xexit (1);
+ }
+ }
+
+ /* If the output device is not a terminal, and no output filename has been
+ specified, make user_output_filename be "-", so that the info is written
+ to stdout, and turn on the dumping of subnodes. */
+ if ((!isatty (fileno (stdout))) && (user_output_filename == (char *)NULL))
+ {
+ user_output_filename = xstrdup ("-");
+ dump_subnodes = 1;
+ }
+
+ /* If the user specified --version, then show the version and exit. */
+ if (print_version_p)
+ {
+ printf ("%s (GNU %s) %s\n", program_name, PACKAGE, VERSION);
+ puts ("");
+ puts ("Copyright (C) 2004 Free Software Foundation, Inc.");
+ printf (_("There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License.\n\
+For more information about these matters, see the files named COPYING.\n"));
+ xexit (0);
+ }
+
+ /* If the `--help' option was present, show the help and exit. */
+ if (print_help_p)
+ {
+ info_short_help ();
+ xexit (0);
+ }
+
+ /* If the user hasn't specified a path for Info files, default it.
+ Lowest priority is our messy hardwired list in filesys.h.
+ Then comes the user's INFODIR from the Makefile.
+ Highest priority is the environment variable, if set. */
+ if (!infopath)
+ {
+ char *path_from_env = getenv ("INFOPATH");
+
+ if (path_from_env)
+ {
+ unsigned len = strlen (path_from_env);
+ /* Trailing : on INFOPATH means insert the default path. */
+ if (len && path_from_env[len - 1] == PATH_SEP[0])
+ {
+ path_from_env[len - 1] = 0;
+ info_add_path (DEFAULT_INFOPATH, INFOPATH_PREPEND);
+ }
+#ifdef INFODIR /* from the Makefile */
+ info_add_path (INFODIR, INFOPATH_PREPEND);
+#endif
+ info_add_path (path_from_env, INFOPATH_PREPEND);
+ }
+ else
+ {
+ info_add_path (DEFAULT_INFOPATH, INFOPATH_PREPEND);
+#ifdef INFODIR /* from the Makefile */
+ info_add_path (INFODIR, INFOPATH_PREPEND);
+#endif
+#ifdef INFODIR2 /* from the Makefile, too */
+# ifdef INFODIR
+ if (!STREQ (INFODIR, INFODIR2))
+# endif
+ info_add_path (INFODIR2, INFOPATH_PREPEND);
+#endif
+ }
+ }
+
+ /* If the user specified a particular filename, add the path of that
+ file to the contents of INFOPATH. */
+ if (user_filename)
+ add_file_directory_to_path (user_filename);
+
+ /* If the user wants to search every known index for a given string,
+ do that now, and report the results. */
+ if (apropos_p)
+ {
+ info_apropos (apropos_search_string);
+ xexit (0);
+ }
+
+ /* Get the initial Info node. It is either "(dir)Top", or what the user
+ specifed with values in user_filename and user_nodenames. */
+ initial_node = info_get_node (user_filename,
+ user_nodenames ? user_nodenames[0] : 0);
+
+ /* If we couldn't get the initial node, this user is in trouble. */
+ if (!initial_node)
+ {
+ if (info_recent_file_error)
+ info_error (info_recent_file_error, NULL, NULL);
+ else
+ info_error ((char *) msg_cant_find_node,
+ user_nodenames ? user_nodenames[0] : "Top", NULL);
+ xexit (1);
+ }
+
+ /* Special cases for when the user specifies multiple nodes. If we
+ are dumping to an output file, dump all of the nodes specified.
+ Otherwise, attempt to create enough windows to handle the nodes
+ that this user wants displayed. */
+ if (user_nodenames_index > 1)
+ {
+ free (initial_node);
+
+ if (print_where_p)
+ printf ("%s\n", user_filename ? user_filename : "unknown?!");
+ else if (user_output_filename)
+ dump_nodes_to_file
+ (user_filename, user_nodenames, user_output_filename, dump_subnodes);
+ else
+ begin_multiple_window_info_session (user_filename, user_nodenames);
+
+ xexit (0);
+ }
+
+ /* If there are arguments remaining, they are the names of menu items
+ in sequential info files starting from the first one loaded. That
+ file name is either "dir", or the contents of user_filename if one
+ was specified. */
+ {
+ const char *errstr;
+ char *errarg1, *errarg2;
+
+ NODE *new_initial_node = info_follow_menus (initial_node, argv + optind,
+ &errstr, &errarg1, &errarg2);
+
+ if (new_initial_node && new_initial_node != initial_node)
+ initial_node = new_initial_node;
+
+ if (print_where_p)
+ {
+ if (initial_node->parent)
+ printf ("%s\n", initial_node->parent);
+ else if (initial_node->filename
+ && !is_dir_name (filename_non_directory (initial_node->filename)))
+ printf ("%s\n", initial_node->filename);
+ else
+ xexit (1);
+ xexit (0);
+ }
+
+ /* If the user specified that this node should be output, then do that
+ now. Otherwise, start the Info session with this node. Or act
+ accordingly if the initial node was not found. */
+ if (user_output_filename && !goto_invocation_p)
+ {
+ if (!errstr)
+ dump_node_to_file (initial_node, user_output_filename,
+ dump_subnodes);
+ else
+ info_error ((char *) errstr, errarg1, errarg2);
+ }
+ else
+ {
+
+ if (errstr)
+ begin_info_session_with_error (initial_node, (char *) errstr,
+ errarg1, errarg2);
+ /* If the user specified `--index-search=STRING' or
+ --show-options, start the info session in the node
+ corresponding to what they want. */
+ else if (index_search_p || goto_invocation_p)
+ {
+ int status = 0;
+
+ initialize_info_session (initial_node, 0);
+
+ if (goto_invocation_p
+ || index_entry_exists (windows, index_search_string))
+ {
+ terminal_prep_terminal ();
+ terminal_clear_screen ();
+ info_last_executed_command = (VFunction *)NULL;
+
+ if (index_search_p)
+ do_info_index_search (windows, 0, index_search_string);
+ else
+ {
+ /* If they said "info --show-options foo bar baz",
+ the last of the arguments is the program whose
+ options they want to see. */
+ char **p = argv + optind;
+ char *program;
+
+ if (*p)
+ {
+ while (p[1])
+ p++;
+ program = xstrdup (*p);
+ }
+ else if (user_filename)
+ /* If there's no command-line arguments to
+ supply the program name, use the Info file
+ name (sans extension and leading directories)
+ instead. */
+ program = program_name_from_file_name (user_filename);
+ else
+ program = xstrdup ("");
+
+ info_intuit_options_node (windows, initial_node, program);
+ free (program);
+ }
+
+ if (user_output_filename)
+ {
+ dump_node_to_file (windows->node, user_output_filename,
+ dump_subnodes);
+ }
+ else
+ info_read_and_dispatch ();
+
+ /* On program exit, leave the cursor at the bottom of the
+ window, and restore the terminal IO. */
+ terminal_goto_xy (0, screenheight - 1);
+ terminal_clear_to_eol ();
+ fflush (stdout);
+ terminal_unprep_terminal ();
+ }
+ else
+ {
+ fprintf (stderr, _("no index entries found for `%s'\n"),
+ index_search_string);
+ status = 2;
+ }
+
+ close_dribble_file ();
+ xexit (status);
+ }
+ else
+ begin_info_session (initial_node);
+ }
+
+ xexit (0);
+ }
+
+ return 0; /* Avoid bogus warnings. */
+}
+
+void
+add_file_directory_to_path (char *filename)
+{
+ char *directory_name = xstrdup (filename);
+ char *temp = filename_non_directory (directory_name);
+
+ if (temp != directory_name)
+ {
+ if (HAVE_DRIVE (directory_name) && temp == directory_name + 2)
+ {
+ /* The directory of "d:foo" is stored as "d:.", to avoid
+ mixing it with "d:/" when a slash is appended. */
+ *temp = '.';
+ temp += 2;
+ }
+ temp[-1] = 0;
+ info_add_path (directory_name, INFOPATH_PREPEND);
+ }
+
+ free (directory_name);
+}
+
+
+/* Error handling. */
+
+/* Non-zero if an error has been signalled. */
+int info_error_was_printed = 0;
+
+/* Non-zero means ring terminal bell on errors. */
+int info_error_rings_bell_p = 1;
+
+/* Print FORMAT with ARG1 and ARG2. If the window system was initialized,
+ then the message is printed in the echo area. Otherwise, a message is
+ output to stderr. */
+void
+info_error (char *format, void *arg1, void *arg2)
+{
+ info_error_was_printed = 1;
+
+ if (!info_windows_initialized_p || display_inhibited)
+ {
+ fprintf (stderr, "%s: ", program_name);
+ fprintf (stderr, format, arg1, arg2);
+ fprintf (stderr, "\n");
+ fflush (stderr);
+ }
+ else
+ {
+ if (!echo_area_is_active)
+ {
+ if (info_error_rings_bell_p)
+ terminal_ring_bell ();
+ window_message_in_echo_area (format, arg1, arg2);
+ }
+ else
+ {
+ NODE *temp;
+
+ temp = build_message_node (format, arg1, arg2);
+ if (info_error_rings_bell_p)
+ terminal_ring_bell ();
+ inform_in_echo_area (temp->contents);
+ free (temp->contents);
+ free (temp);
+ }
+ }
+}
+
+
+/* Produce a scaled down description of the available options to Info. */
+static void
+info_short_help (void)
+{
+#ifdef __MSDOS__
+ static const char speech_friendly_string[] = N_("\
+ -b, --speech-friendly be friendly to speech synthesizers.\n");
+#else
+ static const char speech_friendly_string[] = "";
+#endif
+
+
+ printf (_("\
+Usage: %s [OPTION]... [MENU-ITEM...]\n\
+\n\
+Read documentation in Info format.\n\
+\n\
+Options:\n\
+ --apropos=STRING look up STRING in all indices of all manuals.\n\
+ -d, --directory=DIR add DIR to INFOPATH.\n\
+ --dribble=FILENAME remember user keystrokes in FILENAME.\n\
+ -f, --file=FILENAME specify Info file to visit.\n\
+ -h, --help display this help and exit.\n\
+ --index-search=STRING go to node pointed by index entry STRING.\n\
+ -n, --node=NODENAME specify nodes in first visited Info file.\n\
+ -o, --output=FILENAME output selected nodes to FILENAME.\n\
+ -R, --raw-escapes output \"raw\" ANSI escapes (default).\n\
+ --no-raw-escapes output escapes as literal text.\n\
+ --restore=FILENAME read initial keystrokes from FILENAME.\n\
+ -O, --show-options, --usage go to command-line options node.\n%s\
+ --subnodes recursively output menu items.\n\
+ -w, --where, --location print physical location of Info file.\n\
+ --vi-keys use vi-like and less-like key bindings.\n\
+ --version display version information and exit.\n\
+\n\
+The first non-option argument, if present, is the menu entry to start from;\n\
+it is searched for in all `dir' files along INFOPATH.\n\
+If it is not present, info merges all `dir' files and shows the result.\n\
+Any remaining arguments are treated as the names of menu\n\
+items relative to the initial node visited.\n\
+\n\
+Examples:\n\
+ info show top-level dir menu\n\
+ info emacs start at emacs node from top-level dir\n\
+ info emacs buffers start at buffers node within emacs manual\n\
+ info --show-options emacs start at node with emacs' command line options\n\
+ info -f ./foo.info show file ./foo.info, not searching dir\n\
+"),
+ program_name, speech_friendly_string);
+
+ puts (_("\n\
+Email bug reports to bug-texinfo@gnu.org,\n\
+general questions and discussion to help-texinfo@gnu.org.\n\
+Texinfo home page: http://www.gnu.org/software/texinfo/"));
+
+ xexit (0);
+}
+
+
+/* Initialize strings for gettext. Because gettext doesn't handle N_ or
+ _ within macro definitions, we put shared messages into variables and
+ use them that way. This also has the advantage that there's only one
+ copy of the strings. */
+
+const char *msg_cant_find_node;
+const char *msg_cant_file_node;
+const char *msg_cant_find_window;
+const char *msg_cant_find_point;
+const char *msg_cant_kill_last;
+const char *msg_no_menu_node;
+const char *msg_no_foot_node;
+const char *msg_no_xref_node;
+const char *msg_no_pointer;
+const char *msg_unknown_command;
+const char *msg_term_too_dumb;
+const char *msg_at_node_bottom;
+const char *msg_at_node_top;
+const char *msg_one_window;
+const char *msg_win_too_small;
+const char *msg_cant_make_help;
+
+static void
+init_messages (void)
+{
+ msg_cant_find_node = _("Cannot find node `%s'.");
+ msg_cant_file_node = _("Cannot find node `(%s)%s'.");
+ msg_cant_find_window = _("Cannot find a window!");
+ msg_cant_find_point = _("Point doesn't appear within this window's node!");
+ msg_cant_kill_last = _("Cannot delete the last window.");
+ msg_no_menu_node = _("No menu in this node.");
+ msg_no_foot_node = _("No footnotes in this node.");
+ msg_no_xref_node = _("No cross references in this node.");
+ msg_no_pointer = _("No `%s' pointer for this node.");
+ msg_unknown_command = _("Unknown Info command `%c'; try `?' for help.");
+ msg_term_too_dumb = _("Terminal type `%s' is not smart enough to run Info.");
+ msg_at_node_bottom = _("You are already at the last page of this node.");
+ msg_at_node_top = _("You are already at the first page of this node.");
+ msg_one_window = _("Only one window.");
+ msg_win_too_small = _("Resulting window would be too small.");
+ msg_cant_make_help = _("Not enough room for a help window, please delete a window.");
+}
diff --git a/Build/source/utils/texinfo/info/info.h b/Build/source/utils/texinfo/info/info.h
new file mode 100644
index 00000000000..7ff8abe9b19
--- /dev/null
+++ b/Build/source/utils/texinfo/info/info.h
@@ -0,0 +1,160 @@
+/* info.h -- Header file which includes all of the other headers.
+ $Id: info.h,v 1.4 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_H
+#define INFO_H
+
+/* We always want these, so why clutter up the compile command? */
+#define HANDLE_MAN_PAGES
+#define NAMED_FUNCTIONS
+#define INFOKEY
+
+/* System dependencies. */
+#include "system.h"
+
+/* Some of our other include files use these. */
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CFunction ();
+
+#include "filesys.h"
+#include "doc.h"
+#include "display.h"
+#include "session.h"
+#include "echo-area.h"
+#include "footnotes.h"
+#include "gc.h"
+
+#define info_toupper(x) (islower (x) ? toupper (x) : x)
+#define info_tolower(x) (isupper (x) ? tolower (x) : x)
+
+#if !defined (whitespace)
+# define whitespace(c) ((c == ' ') || (c == '\t'))
+#endif /* !whitespace */
+
+#if !defined (whitespace_or_newline)
+# define whitespace_or_newline(c) (whitespace (c) || (c == '\n'))
+#endif /* !whitespace_or_newline */
+
+/* Add POINTER to the list of pointers found in ARRAY. SLOTS is the number
+ of slots that have already been allocated. INDEX is the index into the
+ array where POINTER should be added. GROW is the number of slots to grow
+ ARRAY by, in the case that it needs growing. TYPE is a cast of the type
+ of object stored in ARRAY (e.g., NODE_ENTRY *. */
+#define add_pointer_to_array(pointer, idx, array, slots, grow, type) \
+ do { \
+ if (idx + 2 >= slots) \
+ array = (type *)(xrealloc (array, (slots += grow) * sizeof (type))); \
+ array[idx++] = (type)pointer; \
+ array[idx] = (type)NULL; \
+ } while (0)
+
+#define maybe_free(x) do { if (x) free (x); } while (0)
+
+#if !defined (zero_mem) && defined (HAVE_MEMSET)
+# define zero_mem(mem, length) memset (mem, 0, length)
+#endif /* !zero_mem && HAVE_MEMSET */
+
+#if !defined (zero_mem) && defined (HAVE_BZERO)
+# define zero_mem(mem, length) bzero (mem, length)
+#endif /* !zero_mem && HAVE_BZERO */
+
+#if !defined (zero_mem)
+# define zero_mem(mem, length) \
+ do { \
+ register int zi; \
+ register unsigned char *place; \
+ \
+ place = (unsigned char *)mem; \
+ for (zi = 0; zi < length; zi++) \
+ place[zi] = 0; \
+ } while (0)
+#endif /* !zero_mem */
+
+
+/* A structure associating the nodes visited in a particular window. */
+typedef struct {
+ WINDOW *window; /* The window that this list is attached to. */
+ NODE **nodes; /* Array of nodes visited in this window. */
+ int *pagetops; /* For each node in NODES, the pagetop. */
+ long *points; /* For each node in NODES, the point. */
+ int current; /* Index in NODES of the current node. */
+ int nodes_index; /* Index where to add the next node. */
+ int nodes_slots; /* Number of slots allocated to NODES. */
+} INFO_WINDOW;
+
+/* Array of structures describing for each window which nodes have been
+ visited in that window. */
+extern INFO_WINDOW **info_windows;
+
+/* For handling errors. If you initialize the window system, you should
+ also set info_windows_initialized_p to non-zero. It is used by the
+ info_error () function to determine how to format and output errors. */
+extern int info_windows_initialized_p;
+
+/* Non-zero if an error message has been printed. */
+extern int info_error_was_printed;
+
+/* Non-zero means ring terminal bell on errors. */
+extern int info_error_rings_bell_p;
+
+/* Non-zero means default keybindings are loosely modeled on vi(1). */
+extern int vi_keys_p;
+
+/* Non-zero means don't remove ANSI escape sequences from man pages. */
+extern int raw_escapes_p;
+
+/* Print FORMAT with ARG1 and ARG2. If the window system was initialized,
+ then the message is printed in the echo area. Otherwise, a message is
+ output to stderr. */
+extern void info_error (char *format, void *arg1, void *arg2);
+
+extern void add_file_directory_to_path (char *filename);
+
+/* Error message defines. */
+extern const char *msg_cant_find_node;
+extern const char *msg_cant_file_node;
+extern const char *msg_cant_find_window;
+extern const char *msg_cant_find_point;
+extern const char *msg_cant_kill_last;
+extern const char *msg_no_menu_node;
+extern const char *msg_no_foot_node;
+extern const char *msg_no_xref_node;
+extern const char *msg_no_pointer;
+extern const char *msg_unknown_command;
+extern const char *msg_term_too_dumb;
+extern const char *msg_at_node_bottom;
+extern const char *msg_at_node_top;
+extern const char *msg_one_window;
+extern const char *msg_win_too_small;
+extern const char *msg_cant_make_help;
+
+
+#if defined(INFOKEY)
+/* Found in variables.c. */
+extern void set_variable_to_value (char *name, char *value);
+#endif /* INFOKEY */
+
+/* Found in m-x.c. */
+extern char *read_function_name (char *prompt, WINDOW *window);
+
+#endif /* !INFO_H */
diff --git a/Build/source/utils/texinfo/info/infodoc.c b/Build/source/utils/texinfo/info/infodoc.c
new file mode 100644
index 00000000000..eeea147a967
--- /dev/null
+++ b/Build/source/utils/texinfo/info/infodoc.c
@@ -0,0 +1,1200 @@
+/* infodoc.c -- functions which build documentation nodes.
+ $Id: infodoc.c,v 1.8 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "funs.h"
+
+/* HELP_NODE_GETS_REGENERATED is always defined now that keys may get
+ rebound, or other changes in the help text may occur. */
+#define HELP_NODE_GETS_REGENERATED 1
+
+/* The name of the node used in the help window. */
+static char *info_help_nodename = "*Info Help*";
+
+/* A node containing printed key bindings and their documentation. */
+static NODE *internal_info_help_node = (NODE *)NULL;
+
+/* A pointer to the contents of the help node. */
+static char *internal_info_help_node_contents = (char *)NULL;
+
+/* The (more or less) static text which appears in the internal info
+ help node. The actual key bindings are inserted. Keep the
+ underlines (****, etc.) in the same N_ call as the text lines they
+ refer to, so translations can make the number of *'s or -'s match. */
+#if defined(INFOKEY)
+
+static char *info_internal_help_text[] = {
+ N_("Basic Commands in Info Windows\n\
+******************************\n"),
+ "\n",
+ N_("\\%-10[quit-help] Quit this help.\n"),
+ N_("\\%-10[quit] Quit Info altogether.\n"),
+ N_("\\%-10[get-info-help-node] Invoke the Info tutorial.\n"),
+ "\n",
+ N_("Selecting other nodes:\n\
+----------------------\n"),
+ N_("\\%-10[next-node] Move to the \"next\" node of this node.\n"),
+ N_("\\%-10[prev-node] Move to the \"previous\" node of this node.\n"),
+ N_("\\%-10[up-node] Move \"up\" from this node.\n"),
+ N_("\\%-10[menu-item] Pick menu item specified by name.\n\
+ Picking a menu item causes another node to be selected.\n"),
+ N_("\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"),
+ N_("\\%-10[history-node] Move to the last node seen in this window.\n"),
+ N_("\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"),
+ N_("\\%-10[move-to-prev-xref] Skip to previous hypertext link within this node.\n"),
+ N_("\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"),
+ N_("\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-node] (DIR)'.\n"),
+ N_("\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"),
+ "\n",
+ N_("Moving within a node:\n\
+---------------------\n"),
+ N_("\\%-10[beginning-of-node] Go to the beginning of this node.\n"),
+ N_("\\%-10[end-of-node] Go to the end of this node.\n"),
+ N_("\\%-10[next-line] Scroll forward 1 line.\n"),
+ N_("\\%-10[prev-line] Scroll backward 1 line.\n"),
+ N_("\\%-10[scroll-forward] Scroll forward a page.\n"),
+ N_("\\%-10[scroll-backward] Scroll backward a page.\n"),
+ "\n",
+ N_("Other commands:\n\
+---------------\n"),
+ N_("\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"),
+ N_("\\%-10[last-menu-item] Pick last item in node's menu.\n"),
+ N_("\\%-10[index-search] Search for a specified string in the index entries of this Info\n\
+ file, and select the node referenced by the first entry found.\n"),
+ N_("\\%-10[goto-node] Move to node specified by name.\n\
+ You may include a filename as well, as in (FILENAME)NODENAME.\n"),
+ N_("\\%-10[search] Search forward for a specified string\n\
+ and select the node in which the next occurrence is found.\n"),
+ N_("\\%-10[search-backward] Search backward for a specified string\n\
+ and select the node in which the previous occurrence is found.\n"),
+ NULL
+};
+
+#else /* !INFOKEY */
+
+static char *info_internal_help_text[] = {
+ N_("Basic Commands in Info Windows\n\
+******************************\n"),
+ "\n",
+ N_(" %-10s Quit this help.\n"),
+ N_(" %-10s Quit Info altogether.\n"),
+ N_(" %-10s Invoke the Info tutorial.\n"),
+ "\n",
+ N_("Selecting other nodes:\n\
+----------------------\n",
+ N_(" %-10s Move to the `next' node of this node.\n"),
+ N_(" %-10s Move to the `previous' node of this node.\n"),
+ N_(" %-10s Move `up' from this node.\n"),
+ N_(" %-10s Pick menu item specified by name.\n"),
+ N_(" Picking a menu item causes another node to be selected.\n"),
+ N_(" %-10s Follow a cross reference. Reads name of reference.\n"),
+ N_(" %-10s Move to the last node seen in this window.\n"),
+ N_(" %-10s Skip to next hypertext link within this node.\n"),
+ N_(" %-10s Follow the hypertext link under cursor.\n"),
+ N_(" %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"),
+ N_(" %-10s Move to the Top node. Equivalent to `g Top'.\n"),
+ "\n",
+ N_("Moving within a node:\n\
+---------------------\n"),
+ N_(" %-10s Scroll forward a page.\n"),
+ N_(" %-10s Scroll backward a page.\n"),
+ N_(" %-10s Go to the beginning of this node.\n"),
+ N_(" %-10s Go to the end of this node.\n"),
+ N_(" %-10s Scroll forward 1 line.\n"),
+ N_(" %-10s Scroll backward 1 line.\n"),
+ "\n",
+ N_("Other commands:\n\
+---------------\n"),
+ N_(" %-10s Pick first ... ninth item in node's menu.\n"),
+ N_(" %-10s Pick last item in node's menu.\n"),
+ N_(" %-10s Search for a specified string in the index entries of this Info\n"),
+ N_(" file, and select the node referenced by the first entry found.\n"),
+ N_(" %-10s Move to node specified by name.\n"),
+ N_(" You may include a filename as well, as in (FILENAME)NODENAME.\n"),
+ N_(" %-10s Search forward for a specified string,\n"),
+ N_(" and select the node in which the next occurrence is found.\n"),
+ N_(" %-10s Search backward for a specified string\n"),
+ N_(" and select the node in which the next occurrence is found.\n"),
+ NULL
+};
+
+static char *info_help_keys_text[][2] = {
+ { "", "" },
+ { "", "" },
+ { "", "" },
+ { "CTRL-x 0", "CTRL-x 0" },
+ { "q", "q" },
+ { "h", "ESC h" },
+ { "", "" },
+ { "", "" },
+ { "", "" },
+ { "SPC", "SPC" },
+ { "DEL", "b" },
+ { "b", "ESC b" },
+ { "e", "ESC e" },
+ { "ESC 1 SPC", "RET" },
+ { "ESC 1 DEL", "y" },
+ { "", "" },
+ { "", "" },
+ { "", "" },
+ { "n", "CTRL-x n" },
+ { "p", "CTRL-x p" },
+ { "u", "CTRL-x u" },
+ { "m", "ESC m" },
+ { "", "" },
+ { "f", "ESC f" },
+ { "l", "l" },
+ { "TAB", "TAB" },
+ { "RET", "CTRL-x RET" },
+ { "d", "ESC d" },
+ { "t", "ESC t" },
+ { "", "" },
+ { "", "" },
+ { "", "" },
+ { "1-9", "ESC 1-9" },
+ { "0", "ESC 0" },
+ { "i", "CTRL-x i" },
+ { "", "" },
+ { "g", "CTRL-x g" },
+ { "", "" },
+ { "s", "/" },
+ { "", "" },
+ { "ESC - s", "?" },
+ { "", "" },
+ NULL
+};
+
+#endif /* !INFOKEY */
+
+static char *where_is_internal (Keymap map, InfoCommand *cmd);
+
+void
+dump_map_to_message_buffer (char *prefix, Keymap map)
+{
+ register int i;
+ unsigned prefix_len = strlen (prefix);
+ char *new_prefix = (char *)xmalloc (prefix_len + 2);
+
+ strncpy (new_prefix, prefix, prefix_len);
+ new_prefix[prefix_len + 1] = '\0';
+
+ for (i = 0; i < 256; i++)
+ {
+ new_prefix[prefix_len] = i;
+ if (map[i].type == ISKMAP)
+ {
+ dump_map_to_message_buffer (new_prefix, (Keymap)map[i].function);
+ }
+ else if (map[i].function)
+ {
+ register int last;
+ char *doc, *name;
+
+ doc = function_documentation (map[i].function);
+ name = function_name (map[i].function);
+
+ if (!*doc)
+ continue;
+
+ /* Find out if there is a series of identical functions, as in
+ ea_insert (). */
+ for (last = i + 1; last < 256; last++)
+ if ((map[last].type != ISFUNC) ||
+ (map[last].function != map[i].function))
+ break;
+
+ if (last - 1 != i)
+ {
+ printf_to_message_buffer ("%s .. ", pretty_keyseq (new_prefix),
+ NULL, NULL);
+ new_prefix[prefix_len] = last - 1;
+ printf_to_message_buffer ("%s\t", pretty_keyseq (new_prefix),
+ NULL, NULL);
+ i = last - 1;
+ }
+ else
+ printf_to_message_buffer ("%s\t", pretty_keyseq (new_prefix),
+ NULL, NULL);
+
+#if defined (NAMED_FUNCTIONS)
+ /* Print the name of the function, and some padding before the
+ documentation string is printed. */
+ {
+ int length_so_far;
+ int desired_doc_start = 40; /* Must be multiple of 8. */
+
+ printf_to_message_buffer ("(%s)", name, NULL, NULL);
+ length_so_far = message_buffer_length_this_line ();
+
+ if ((desired_doc_start + strlen (doc))
+ >= (unsigned int) the_screen->width)
+ printf_to_message_buffer ("\n ", NULL, NULL, NULL);
+ else
+ {
+ while (length_so_far < desired_doc_start)
+ {
+ printf_to_message_buffer ("\t", NULL, NULL, NULL);
+ length_so_far += character_width ('\t', length_so_far);
+ }
+ }
+ }
+#endif /* NAMED_FUNCTIONS */
+ printf_to_message_buffer ("%s\n", doc, NULL, NULL);
+ }
+ }
+ free (new_prefix);
+}
+
+/* How to create internal_info_help_node. HELP_IS_ONLY_WINDOW_P says
+ whether we're going to end up in a second (or more) window of our
+ own, or whether there's only one window and we're going to usurp it.
+ This determines how to quit the help window. Maybe we should just
+ make q do the right thing in both cases. */
+
+static void
+create_internal_info_help_node (int help_is_only_window_p)
+{
+ register int i;
+ NODE *node;
+ char *contents = NULL;
+ char *exec_keys;
+
+#ifndef HELP_NODE_GETS_REGENERATED
+ if (internal_info_help_node_contents)
+ contents = internal_info_help_node_contents;
+#endif /* !HELP_NODE_GETS_REGENERATED */
+
+ if (!contents)
+ {
+ int printed_one_mx = 0;
+
+ initialize_message_buffer ();
+
+ for (i = 0; info_internal_help_text[i]; i++)
+ {
+#ifdef INFOKEY
+ printf_to_message_buffer (replace_in_documentation
+ ((char *) _(info_internal_help_text[i]), help_is_only_window_p),
+ NULL, NULL, NULL);
+#else
+ /* Don't translate blank lines, gettext outputs the po file
+ header in that case. We want a blank line. */
+ char *msg = *(info_internal_help_text[i])
+ ? _(info_internal_help_text[i])
+ : info_internal_help_text[i];
+ char *key = info_help_keys_text[i][vi_keys_p];
+
+ /* If we have only one window (because the window size was too
+ small to split it), CTRL-x 0 doesn't work to `quit' help. */
+ if (STREQ (key, "CTRL-x 0") && help_is_only_window_p)
+ key = "l";
+
+ printf_to_message_buffer (msg, key, NULL, NULL);
+#endif /* !INFOKEY */
+ }
+
+ printf_to_message_buffer ("---------------------\n\n", NULL, NULL, NULL);
+ printf_to_message_buffer ((char *) _("The current search path is:\n"),
+ NULL, NULL, NULL);
+ printf_to_message_buffer (" %s\n", infopath, NULL, NULL);
+ printf_to_message_buffer ("---------------------\n\n", NULL, NULL, NULL);
+ printf_to_message_buffer ((char *) _("Commands available in Info windows:\n\n"),
+ NULL, NULL, NULL);
+ dump_map_to_message_buffer ("", info_keymap);
+ printf_to_message_buffer ("---------------------\n\n", NULL, NULL, NULL);
+ printf_to_message_buffer ((char *) _("Commands available in the echo area:\n\n"),
+ NULL, NULL, NULL);
+ dump_map_to_message_buffer ("", echo_area_keymap);
+
+#if defined (NAMED_FUNCTIONS)
+ /* Get a list of commands which have no keystroke equivs. */
+ exec_keys = where_is (info_keymap, InfoCmd(info_execute_command));
+ if (exec_keys)
+ exec_keys = xstrdup (exec_keys);
+ for (i = 0; function_doc_array[i].func; i++)
+ {
+ InfoCommand *cmd = DocInfoCmd(&function_doc_array[i]);
+
+ if (InfoFunction(cmd) != (VFunction *) info_do_lowercase_version
+ && !where_is_internal (info_keymap, cmd)
+ && !where_is_internal (echo_area_keymap, cmd))
+ {
+ if (!printed_one_mx)
+ {
+ printf_to_message_buffer ("---------------------\n\n",
+ NULL, NULL, NULL);
+ if (exec_keys && exec_keys[0])
+ printf_to_message_buffer
+ ((char *) _("The following commands can only be invoked via %s:\n\n"),
+ exec_keys, NULL, NULL);
+ else
+ printf_to_message_buffer
+ ((char *) _("The following commands cannot be invoked at all:\n\n"),
+ NULL, NULL, NULL);
+ printed_one_mx = 1;
+ }
+
+ printf_to_message_buffer
+ ("%s %s\n %s\n",
+ exec_keys,
+ function_doc_array[i].func_name,
+ replace_in_documentation (strlen (function_doc_array[i].doc)
+ ? (char *) _(function_doc_array[i].doc) : "", 0)
+ );
+
+ }
+ }
+
+ if (printed_one_mx)
+ printf_to_message_buffer ("\n", NULL, NULL, NULL);
+
+ maybe_free (exec_keys);
+#endif /* NAMED_FUNCTIONS */
+
+ printf_to_message_buffer
+ ("%s", replace_in_documentation
+ ((char *) _("--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"), 0),
+ NULL, NULL);
+ node = message_buffer_to_node ();
+ internal_info_help_node_contents = node->contents;
+ }
+ else
+ {
+ /* We already had the right contents, so simply use them. */
+ node = build_message_node ("", 0, 0);
+ free (node->contents);
+ node->contents = contents;
+ node->nodelen = 1 + strlen (contents);
+ }
+
+ internal_info_help_node = node;
+
+ /* Do not GC this node's contents. It never changes, and we never need
+ to delete it once it is made. If you change some things (such as
+ placing information about dynamic variables in the help text) then
+ you will need to allow the contents to be gc'd, and you will have to
+ arrange to always regenerate the help node. */
+#if defined (HELP_NODE_GETS_REGENERATED)
+ add_gcable_pointer (internal_info_help_node->contents);
+#endif
+
+ name_internal_node (internal_info_help_node, info_help_nodename);
+
+ /* Even though this is an internal node, we don't want the window
+ system to treat it specially. So we turn off the internalness
+ of it here. */
+ internal_info_help_node->flags &= ~N_IsInternal;
+}
+
+/* Return a window which is the window showing help in this Info. */
+
+/* If the eligible window's height is >= this, split it to make the help
+ window. Otherwise display the help window in the current window. */
+#define HELP_SPLIT_SIZE 24
+
+static WINDOW *
+info_find_or_create_help_window (void)
+{
+ int help_is_only_window_p;
+ WINDOW *eligible = NULL;
+ WINDOW *help_window = get_window_of_node (internal_info_help_node);
+
+ /* If we couldn't find the help window, then make it. */
+ if (!help_window)
+ {
+ WINDOW *window;
+ int max = 0;
+
+ for (window = windows; window; window = window->next)
+ {
+ if (window->height > max)
+ {
+ max = window->height;
+ eligible = window;
+ }
+ }
+
+ if (!eligible)
+ return NULL;
+ }
+#ifndef HELP_NODE_GETS_REGENERATED
+ else
+ /* help window is static, just return it. */
+ return help_window;
+#endif /* not HELP_NODE_GETS_REGENERATED */
+
+ /* Make sure that we have a node containing the help text. The
+ argument is false if help will be the only window (so l must be used
+ to quit help), true if help will be one of several visible windows
+ (so CTRL-x 0 must be used to quit help). */
+ help_is_only_window_p = ((help_window && !windows->next)
+ || (!help_window && eligible->height < HELP_SPLIT_SIZE));
+ create_internal_info_help_node (help_is_only_window_p);
+
+ /* Either use the existing window to display the help node, or create
+ a new window if there was no existing help window. */
+ if (!help_window)
+ { /* Split the largest window into 2 windows, and show the help text
+ in that window. */
+ if (eligible->height >= HELP_SPLIT_SIZE)
+ {
+ active_window = eligible;
+ help_window = window_make_window (internal_info_help_node);
+ }
+ else
+ {
+ set_remembered_pagetop_and_point (active_window);
+ window_set_node_of_window (active_window, internal_info_help_node);
+ help_window = active_window;
+ }
+ }
+ else
+ { /* Case where help node always gets regenerated, and we have an
+ existing window in which to place the node. */
+ if (active_window != help_window)
+ {
+ set_remembered_pagetop_and_point (active_window);
+ active_window = help_window;
+ }
+ window_set_node_of_window (active_window, internal_info_help_node);
+ }
+ remember_window_and_node (help_window, help_window->node);
+ return help_window;
+}
+
+/* Create or move to the help window. */
+DECLARE_INFO_COMMAND (info_get_help_window, _("Display help message"))
+{
+ WINDOW *help_window;
+
+ help_window = info_find_or_create_help_window ();
+ if (help_window)
+ {
+ active_window = help_window;
+ active_window->flags |= W_UpdateWindow;
+ }
+ else
+ {
+ info_error ((char *) msg_cant_make_help, NULL, NULL);
+ }
+}
+
+/* Show the Info help node. This means that the "info" file is installed
+ where it can easily be found on your system. */
+DECLARE_INFO_COMMAND (info_get_info_help_node, _("Visit Info node `(info)Help'"))
+{
+ NODE *node;
+ char *nodename;
+
+ /* If there is a window on the screen showing the node "(info)Help" or
+ the node "(info)Help-Small-Screen", simply select that window. */
+ {
+ WINDOW *win;
+
+ for (win = windows; win; win = win->next)
+ {
+ if (win->node && win->node->filename &&
+ (strcasecmp
+ (filename_non_directory (win->node->filename), "info") == 0) &&
+ ((strcmp (win->node->nodename, "Help") == 0) ||
+ (strcmp (win->node->nodename, "Help-Small-Screen") == 0)))
+ {
+ active_window = win;
+ return;
+ }
+ }
+ }
+
+ /* If the current window is small, show the small screen help. */
+ if (active_window->height < 24)
+ nodename = "Help-Small-Screen";
+ else
+ nodename = "Help";
+
+ /* Try to get the info file for Info. */
+ node = info_get_node ("Info", nodename);
+
+ if (!node)
+ {
+ if (info_recent_file_error)
+ info_error (info_recent_file_error, NULL, NULL);
+ else
+ info_error ((char *) msg_cant_file_node, "Info", nodename);
+ }
+ else
+ {
+ /* If the current window is very large (greater than 45 lines),
+ then split it and show the help node in another window.
+ Otherwise, use the current window. */
+
+ if (active_window->height > 45)
+ active_window = window_make_window (node);
+ else
+ {
+ set_remembered_pagetop_and_point (active_window);
+ window_set_node_of_window (active_window, node);
+ }
+
+ remember_window_and_node (active_window, node);
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Groveling Info Keymaps and Docs */
+/* */
+/* **************************************************************** */
+
+/* Return the documentation associated with the Info command FUNCTION. */
+char *
+function_documentation (InfoCommand *cmd)
+{
+ char *doc;
+
+#if defined (INFOKEY)
+
+ doc = cmd->doc;
+
+#else /* !INFOKEY */
+
+ register int i;
+
+ for (i = 0; function_doc_array[i].func; i++)
+ if (InfoFunction(cmd) == function_doc_array[i].func)
+ break;
+
+ doc = function_doc_array[i].func ? function_doc_array[i].doc : "";
+
+#endif /* !INFOKEY */
+
+ return replace_in_documentation ((strlen (doc) == 0) ? doc : (char *) _(doc), 0);
+}
+
+#if defined (NAMED_FUNCTIONS)
+/* Return the user-visible name of the function associated with the
+ Info command FUNCTION. */
+char *
+function_name (InfoCommand *cmd)
+{
+#if defined (INFOKEY)
+
+ return cmd->func_name;
+
+#else /* !INFOKEY */
+
+ register int i;
+
+ for (i = 0; function_doc_array[i].func; i++)
+ if (InfoFunction(cmd) == function_doc_array[i].func)
+ break;
+
+ return (function_doc_array[i].func_name);
+
+#endif /* !INFOKEY */
+}
+
+/* Return a pointer to the info command for function NAME. */
+InfoCommand *
+named_function (char *name)
+{
+ register int i;
+
+ for (i = 0; function_doc_array[i].func; i++)
+ if (strcmp (function_doc_array[i].func_name, name) == 0)
+ break;
+
+ return (DocInfoCmd(&function_doc_array[i]));
+}
+#endif /* NAMED_FUNCTIONS */
+
+/* Return the documentation associated with KEY in MAP. */
+char *
+key_documentation (char key, Keymap map)
+{
+ InfoCommand *function = map[key].function;
+
+ if (function)
+ return (function_documentation (function));
+ else
+ return ((char *)NULL);
+}
+
+DECLARE_INFO_COMMAND (describe_key, _("Print documentation for KEY"))
+{
+ char keys[50];
+ unsigned char keystroke;
+ char *k = keys;
+ Keymap map;
+
+ *k = '\0';
+ map = window->keymap;
+
+ for (;;)
+ {
+ message_in_echo_area ((char *) _("Describe key: %s"),
+ pretty_keyseq (keys), NULL);
+ keystroke = info_get_input_char ();
+ unmessage_in_echo_area ();
+
+#if !defined (INFOKEY)
+ if (Meta_p (keystroke))
+ {
+ if (map[ESC].type != ISKMAP)
+ {
+ window_message_in_echo_area
+ (_("ESC %s is undefined."), pretty_keyname (UnMeta (keystroke)));
+ return;
+ }
+
+ *k++ = '\e';
+ keystroke = UnMeta (keystroke);
+ map = (Keymap)map[ESC].function;
+ }
+#endif /* !INFOKEY */
+
+ /* Add the KEYSTROKE to our list. */
+ *k++ = keystroke;
+ *k = '\0';
+
+ if (map[keystroke].function == (InfoCommand *)NULL)
+ {
+ message_in_echo_area ((char *) _("%s is undefined."),
+ pretty_keyseq (keys), NULL);
+ return;
+ }
+ else if (map[keystroke].type == ISKMAP)
+ {
+ map = (Keymap)map[keystroke].function;
+ continue;
+ }
+ else
+ {
+ char *keyname, *message, *fundoc, *funname = "";
+
+#if defined (INFOKEY)
+ /* If the key is bound to do-lowercase-version, but its
+ lower-case variant is undefined, say that this key is
+ also undefined. This is especially important for unbound
+ edit keys that emit an escape sequence: it's terribly
+ confusing to see a message "Home (do-lowercase-version)"
+ or some such when Home is unbound. */
+ if (InfoFunction(map[keystroke].function)
+ == (VFunction *) info_do_lowercase_version)
+ {
+ unsigned char lowerkey = Meta_p(keystroke)
+ ? Meta (tolower (UnMeta (keystroke)))
+ : tolower (keystroke);
+
+ if (map[lowerkey].function == (InfoCommand *)NULL)
+ {
+ message_in_echo_area ((char *) _("%s is undefined."),
+ pretty_keyseq (keys), NULL);
+ return;
+ }
+ }
+#endif
+
+ keyname = pretty_keyseq (keys);
+
+#if defined (NAMED_FUNCTIONS)
+ funname = function_name (map[keystroke].function);
+#endif /* NAMED_FUNCTIONS */
+
+ fundoc = function_documentation (map[keystroke].function);
+
+ message = (char *)xmalloc
+ (10 + strlen (keyname) + strlen (fundoc) + strlen (funname));
+
+#if defined (NAMED_FUNCTIONS)
+ sprintf (message, "%s (%s): %s.", keyname, funname, fundoc);
+#else
+ sprintf (message, _("%s is defined to %s."), keyname, fundoc);
+#endif /* !NAMED_FUNCTIONS */
+
+ window_message_in_echo_area ("%s", message, NULL);
+ free (message);
+ break;
+ }
+ }
+}
+
+/* Return the pretty printable name of a single character. */
+char *
+pretty_keyname (unsigned char key)
+{
+ static char rep_buffer[30];
+ char *rep;
+
+ if (Meta_p (key))
+ {
+ char temp[20];
+
+ rep = pretty_keyname (UnMeta (key));
+
+#if defined (INFOKEY)
+ sprintf (temp, "M-%s", rep);
+#else /* !INFOKEY */
+ sprintf (temp, "ESC %s", rep);
+#endif /* !INFOKEY */
+ strcpy (rep_buffer, temp);
+ rep = rep_buffer;
+ }
+ else if (Control_p (key))
+ {
+ switch (key)
+ {
+ case '\n': rep = "LFD"; break;
+ case '\t': rep = "TAB"; break;
+ case '\r': rep = "RET"; break;
+ case ESC: rep = "ESC"; break;
+
+ default:
+ sprintf (rep_buffer, "C-%c", UnControl (key));
+ rep = rep_buffer;
+ }
+ }
+ else
+ {
+ switch (key)
+ {
+ case ' ': rep = "SPC"; break;
+ case DEL: rep = "DEL"; break;
+ default:
+ rep_buffer[0] = key;
+ rep_buffer[1] = '\0';
+ rep = rep_buffer;
+ }
+ }
+ return (rep);
+}
+
+/* Return the pretty printable string which represents KEYSEQ. */
+
+static void pretty_keyseq_internal (char *keyseq, char *rep);
+
+char *
+pretty_keyseq (char *keyseq)
+{
+ static char keyseq_rep[200];
+
+ keyseq_rep[0] = '\0';
+ if (*keyseq)
+ pretty_keyseq_internal (keyseq, keyseq_rep);
+ return (keyseq_rep);
+}
+
+static void
+pretty_keyseq_internal (char *keyseq, char *rep)
+{
+ if (term_kP && strncmp(keyseq, term_kP, strlen(term_kP)) == 0)
+ {
+ strcpy(rep, "PgUp");
+ keyseq += strlen(term_kP);
+ }
+ else if (term_kN && strncmp(keyseq, term_kN, strlen(term_kN)) == 0)
+ {
+ strcpy(rep, "PgDn");
+ keyseq += strlen(term_kN);
+ }
+#if defined(INFOKEY)
+ else if (term_kh && strncmp(keyseq, term_kh, strlen(term_kh)) == 0)
+ {
+ strcpy(rep, "Home");
+ keyseq += strlen(term_kh);
+ }
+ else if (term_ke && strncmp(keyseq, term_ke, strlen(term_ke)) == 0)
+ {
+ strcpy(rep, "End");
+ keyseq += strlen(term_ke);
+ }
+ else if (term_ki && strncmp(keyseq, term_ki, strlen(term_ki)) == 0)
+ {
+ strcpy(rep, "INS");
+ keyseq += strlen(term_ki);
+ }
+ else if (term_kx && strncmp(keyseq, term_kx, strlen(term_kx)) == 0)
+ {
+ strcpy(rep, "DEL");
+ keyseq += strlen(term_kx);
+ }
+#endif /* INFOKEY */
+ else if (term_ku && strncmp(keyseq, term_ku, strlen(term_ku)) == 0)
+ {
+ strcpy(rep, "Up");
+ keyseq += strlen(term_ku);
+ }
+ else if (term_kd && strncmp(keyseq, term_kd, strlen(term_kd)) == 0)
+ {
+ strcpy(rep, "Down");
+ keyseq += strlen(term_kd);
+ }
+ else if (term_kl && strncmp(keyseq, term_kl, strlen(term_kl)) == 0)
+ {
+ strcpy(rep, "Left");
+ keyseq += strlen(term_kl);
+ }
+ else if (term_kr && strncmp(keyseq, term_kr, strlen(term_kr)) == 0)
+ {
+ strcpy(rep, "Right");
+ keyseq += strlen(term_kr);
+ }
+ else
+ {
+ strcpy (rep, pretty_keyname (keyseq[0]));
+ keyseq++;
+ }
+ if (*keyseq)
+ {
+ strcat (rep, " ");
+ pretty_keyseq_internal (keyseq, rep + strlen(rep));
+ }
+}
+
+/* Return a pointer to the last character in s that is found in f. */
+static char *
+strrpbrk (const char *s, const char *f)
+{
+ register const char *e = s + strlen(s);
+ register const char *t;
+
+ while (e-- != s)
+ {
+ for (t = f; *t; t++)
+ if (*e == *t)
+ return (char *)e;
+ }
+ return NULL;
+}
+
+/* Replace the names of functions with the key that invokes them. */
+char *
+replace_in_documentation (char *string, int help_is_only_window_p)
+{
+ unsigned reslen = strlen (string);
+ register int i, start, next;
+ static char *result = (char *)NULL;
+
+ maybe_free (result);
+ result = (char *)xmalloc (1 + reslen);
+
+ i = next = start = 0;
+
+ /* Skip to the beginning of a replaceable function. */
+ for (i = start; string[i]; i++)
+ {
+ int j = i + 1;
+
+ /* Is this the start of a replaceable function name? */
+ if (string[i] == '\\')
+ {
+ char *fmt = NULL;
+ unsigned min = 0;
+ unsigned max = 0;
+
+ if(string[j] == '%')
+ {
+ if (string[++j] == '-')
+ j++;
+ if (isdigit(string[j]))
+ {
+ min = atoi(string + j);
+ while (isdigit(string[j]))
+ j++;
+ if (string[j] == '.' && isdigit(string[j + 1]))
+ {
+ j += 1;
+ max = atoi(string + j);
+ while (isdigit(string[j]))
+ j++;
+ }
+ fmt = (char *)xmalloc (j - i + 2);
+ strncpy (fmt, string + i + 1, j - i);
+ fmt[j - i - 1] = 's';
+ fmt[j - i] = '\0';
+ }
+ else
+ j = i + 1;
+ }
+ if (string[j] == '[')
+ {
+ unsigned arg = 0;
+ char *argstr = NULL;
+ char *rep_name, *fun_name, *rep;
+ InfoCommand *command;
+ char *repstr = NULL;
+ unsigned replen;
+
+ /* Copy in the old text. */
+ strncpy (result + next, string + start, i - start);
+ next += (i - start);
+ start = j + 1;
+
+ /* Look for an optional numeric arg. */
+ i = start;
+ if (isdigit(string[i])
+ || (string[i] == '-' && isdigit(string[i + 1])) )
+ {
+ arg = atoi(string + i);
+ if (string[i] == '-')
+ i++;
+ while (isdigit(string[i]))
+ i++;
+ }
+ start = i;
+
+ /* Move to the end of the function name. */
+ for (i = start; string[i] && (string[i] != ']'); i++);
+
+ rep_name = (char *)xmalloc (1 + i - start);
+ strncpy (rep_name, string + start, i - start);
+ rep_name[i - start] = '\0';
+
+ /* If we have only one window (because the window size was too
+ small to split it), we have to quit help by going back one
+ noew in the history list, not deleting the window. */
+ if (strcmp (rep_name, "quit-help") == 0)
+ fun_name = help_is_only_window_p ? "history-node"
+ : "delete-window";
+ else
+ fun_name = rep_name;
+
+ /* Find a key which invokes this function in the info_keymap. */
+ command = named_function (fun_name);
+
+ free (rep_name);
+
+ /* If the internal documentation string fails, there is a
+ serious problem with the associated command's documentation.
+ We croak so that it can be fixed immediately. */
+ if (!command)
+ abort ();
+
+ if (arg)
+ {
+ char *argrep, *p;
+
+ argrep = where_is (info_keymap, InfoCmd(info_add_digit_to_numeric_arg));
+ p = argrep ? strrpbrk (argrep, "0123456789-") : NULL;
+ if (p)
+ {
+ argstr = (char *)xmalloc (p - argrep + 21);
+ strncpy (argstr, argrep, p - argrep);
+ sprintf (argstr + (p - argrep), "%d", arg);
+ }
+ else
+ command = NULL;
+ }
+ rep = command ? where_is (info_keymap, command) : NULL;
+ if (!rep)
+ rep = "N/A";
+ replen = (argstr ? strlen (argstr) : 0) + strlen (rep) + 1;
+ repstr = (char *)xmalloc (replen);
+ repstr[0] = '\0';
+ if (argstr)
+ {
+ strcat(repstr, argstr);
+ strcat(repstr, " ");
+ free (argstr);
+ }
+ strcat(repstr, rep);
+
+ if (fmt)
+ {
+ if (replen > max)
+ replen = max;
+ if (replen < min)
+ replen = min;
+ }
+ if (next + replen > reslen)
+ {
+ reslen = next + replen + 1;
+ result = (char *)xrealloc (result, reslen + 1);
+ }
+
+ if (fmt)
+ sprintf (result + next, fmt, repstr);
+ else
+ strcpy (result + next, repstr);
+
+ next = strlen (result);
+ free (repstr);
+
+ start = i;
+ if (string[i])
+ start++;
+ }
+
+ maybe_free (fmt);
+ }
+ }
+ strcpy (result + next, string + start);
+ return (result);
+}
+
+/* Return a string of characters which could be typed from the keymap
+ MAP to invoke FUNCTION. */
+static char *where_is_rep = (char *)NULL;
+static int where_is_rep_index = 0;
+static int where_is_rep_size = 0;
+
+char *
+where_is (Keymap map, InfoCommand *cmd)
+{
+ char *rep;
+
+ if (!where_is_rep_size)
+ where_is_rep = (char *)xmalloc (where_is_rep_size = 100);
+ where_is_rep_index = 0;
+
+ rep = where_is_internal (map, cmd);
+
+ /* If it couldn't be found, return "M-x Foo" (or equivalent). */
+ if (!rep)
+ {
+ char *name;
+
+ name = function_name (cmd);
+ if (!name)
+ return NULL; /* no such function */
+
+ rep = where_is_internal (map, InfoCmd(info_execute_command));
+ if (!rep)
+ return ""; /* function exists but can't be got to by user */
+
+ sprintf (where_is_rep, "%s %s", rep, name);
+
+ rep = where_is_rep;
+ }
+ return (rep);
+}
+
+/* Return the printed rep of the keystrokes that invoke FUNCTION,
+ as found in MAP, or NULL. */
+static char *
+where_is_internal (Keymap map, InfoCommand *cmd)
+{
+#if defined(INFOKEY)
+
+ register FUNCTION_KEYSEQ *k;
+
+ for (k = cmd->keys; k; k = k->next)
+ if (k->map == map)
+ return pretty_keyseq (k->keyseq);
+
+ return NULL;
+
+#else /* !INFOKEY */
+ /* There is a bug in that create_internal_info_help_node calls
+ where_is_internal without setting where_is_rep_index to zero. This
+ was found by Mandrake and reported by Thierry Vignaud
+ <tvignaud@mandrakesoft.com> around April 24, 2002.
+
+ I think the best fix is to make where_is_rep_index another
+ parameter to this recursively-called function, instead of a static
+ variable. But this [!INFOKEY] branch of the code is not enabled
+ any more, so let's just skip the whole thing. --karl, 28sep02. */
+ register int i;
+
+ /* If the function is directly invokable in MAP, return the representation
+ of that keystroke. */
+ for (i = 0; i < 256; i++)
+ if ((map[i].type == ISFUNC) && map[i].function == cmd)
+ {
+ sprintf (where_is_rep + where_is_rep_index, "%s", pretty_keyname (i));
+ return (where_is_rep);
+ }
+
+ /* Okay, search subsequent maps for this function. */
+ for (i = 0; i < 256; i++)
+ {
+ if (map[i].type == ISKMAP)
+ {
+ int saved_index = where_is_rep_index;
+ char *rep;
+
+ sprintf (where_is_rep + where_is_rep_index, "%s ",
+ pretty_keyname (i));
+
+ where_is_rep_index = strlen (where_is_rep);
+ rep = where_is_internal ((Keymap)map[i].function, cmd);
+
+ if (rep)
+ return (where_is_rep);
+
+ where_is_rep_index = saved_index;
+ }
+ }
+
+ return NULL;
+
+#endif /* INFOKEY */
+}
+
+DECLARE_INFO_COMMAND (info_where_is,
+ _("Show what to type to execute a given command"))
+{
+ char *command_name;
+
+ command_name = read_function_name ((char *) _("Where is command: "), window);
+
+ if (!command_name)
+ {
+ info_abort_key (active_window, count, key);
+ return;
+ }
+
+ if (*command_name)
+ {
+ InfoCommand *command;
+
+ command = named_function (command_name);
+
+ if (command)
+ {
+ char *location;
+
+ location = where_is (active_window->keymap, command);
+
+ if (!location || !location[0])
+ {
+ info_error ((char *) _("`%s' is not on any keys"),
+ command_name, NULL);
+ }
+ else
+ {
+ if (strstr (location, function_name (command)))
+ window_message_in_echo_area
+ ((char *) _("%s can only be invoked via %s."),
+ command_name, location);
+ else
+ window_message_in_echo_area
+ ((char *) _("%s can be invoked via %s."),
+ command_name, location);
+ }
+ }
+ else
+ info_error ((char *) _("There is no function named `%s'"),
+ command_name, NULL);
+ }
+
+ free (command_name);
+}
diff --git a/Build/source/utils/texinfo/info/infokey.c b/Build/source/utils/texinfo/info/infokey.c
new file mode 100644
index 00000000000..51f23aab0c8
--- /dev/null
+++ b/Build/source/utils/texinfo/info/infokey.c
@@ -0,0 +1,924 @@
+/* infokey.c -- compile ~/.infokey to ~/.info.
+ $Id: infokey.c,v 1.9 2004/12/14 00:15:36 karl Exp $
+
+ Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Andrew Bettison <andrewb@zip.com.au>. */
+
+#include "info.h"
+#include "infomap.h"
+#include "infokey.h"
+#include "key.h"
+#include "getopt.h"
+
+static char *program_name = "infokey";
+
+/* Non-zero means print version info only. */
+static int print_version_p = 0;
+
+/* Non-zero means print a short description of the options. */
+static int print_help_p = 0;
+
+/* String specifying the source file. This is set by the user on the
+ command line, or a default is used. */
+static char *input_filename = (char *) NULL;
+
+/* String specifying the name of the file to output to. This is
+ set by the user on the command line, or a default is used. */
+static char *output_filename = (char *) NULL;
+
+/* Structure describing the options that Infokey accepts. We pass this
+ structure to getopt_long (). If you add or otherwise change this
+ structure, you must also change the string which follows it. */
+static struct option long_options[] =
+{
+ {"output", 1, 0, 'o'},
+ {"help", 0, &print_help_p, 1},
+ {"version", 0, &print_version_p, 1},
+ {NULL, 0, NULL, 0}
+};
+
+/* String describing the shorthand versions of the long options found above. */
+static char *short_options = "o:";
+
+/* Structure for holding the compiled sections. */
+enum sect_e
+ {
+ info = 0,
+ ea = 1,
+ var = 2
+ };
+struct sect
+ {
+ unsigned int cur;
+ unsigned char data[INFOKEY_MAX_SECTIONLEN];
+ };
+
+/* Some "forward" declarations. */
+static char *mkpath (const char *dir, const char *file);
+static int compile (FILE *fp, const char *filename, struct sect *sections);
+static int write_infokey_file (FILE *fp, struct sect *sections);
+static void syntax_error (const char *filename,
+ unsigned int linenum, const char *fmt,
+ const void *a1, const void *a2, const void *a3, const void *a4);
+static void error_message (int error_code, const char *fmt,
+ const void *a1, const void *a2, const void *a3, const void *a4);
+static void suggest_help (void);
+static void short_help (void);
+
+
+/* **************************************************************** */
+/* */
+/* Main Entry Point to the Infokey Program */
+/* */
+/* **************************************************************** */
+
+int
+main (int argc, char **argv)
+{
+ int getopt_long_index; /* Index returned by getopt_long (). */
+
+#ifdef HAVE_SETLOCALE
+ /* Set locale via LC_ALL. */
+ setlocale (LC_ALL, "");
+#endif
+
+#ifdef ENABLE_NLS
+ /* Set the text message domain. */
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+#endif
+
+ while (1)
+ {
+ int option_character;
+
+ option_character = getopt_long
+ (argc, argv, short_options, long_options, &getopt_long_index);
+
+ /* getopt_long () returns EOF when there are no more long options. */
+ if (option_character == EOF)
+ break;
+
+ /* If this is a long option, then get the short version of it. */
+ if (option_character == 0 && long_options[getopt_long_index].flag == 0)
+ option_character = long_options[getopt_long_index].val;
+
+ /* Case on the option that we have received. */
+ switch (option_character)
+ {
+ case 0:
+ break;
+
+ /* User is specifying the name of a file to output to. */
+ case 'o':
+ if (output_filename)
+ free (output_filename);
+ output_filename = xstrdup (optarg);
+ break;
+
+ default:
+ suggest_help ();
+ xexit (1);
+ }
+ }
+
+ /* If the user specified --version, then show the version and exit. */
+ if (print_version_p)
+ {
+ printf ("%s (GNU %s) %s\n", program_name, PACKAGE, VERSION);
+ puts ("");
+ printf (_ ("Copyright (C) %s Free Software Foundation, Inc.\n\
+There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License.\n\
+For more information about these matters, see the files named COPYING.\n"),
+ "2003");
+ xexit (0);
+ }
+
+ /* If the `--help' option was present, show the help and exit. */
+ if (print_help_p)
+ {
+ short_help ();
+ xexit (0);
+ }
+
+ /* If there is one argument remaining, it is the name of the input
+ file. */
+ if (optind == argc - 1)
+ {
+ if (input_filename)
+ free (input_filename);
+ input_filename = xstrdup (argv[optind]);
+ }
+ else if (optind != argc)
+ {
+ error_message (0, _("incorrect number of arguments"),
+ NULL, NULL, NULL, NULL);
+ suggest_help ();
+ xexit (1);
+ }
+
+ /* Use default filenames where none given. */
+ {
+ char *homedir;
+
+ homedir = getenv ("HOME");
+#ifdef __MSDOS__
+ if (!homedir)
+ homedir = ".";
+#endif
+ if (!input_filename)
+ input_filename = mkpath (homedir, INFOKEY_SRCFILE);
+ if (!output_filename)
+ output_filename = mkpath (homedir, INFOKEY_FILE);
+ }
+
+ {
+ FILE *inf;
+ FILE *outf;
+ int write_error;
+ static struct sect sections[3];
+
+ /* Open the input file. */
+ inf = fopen (input_filename, "r");
+ if (!inf)
+ {
+ error_message (errno, _("cannot open input file `%s'"),
+ input_filename, NULL, NULL, NULL);
+ xexit (1);
+ }
+
+ /* Compile the input file to its verious sections, then write the
+ section data to the output file. */
+
+ if (compile (inf, input_filename, sections))
+ {
+ /* Open the output file. */
+ outf = fopen (output_filename, FOPEN_WBIN);
+ if (!outf)
+ {
+ error_message (errno, _("cannot create output file `%s'"),
+ output_filename, NULL, NULL, NULL);
+ xexit (1);
+ }
+
+ /* Write the contents of the output file and close it. If there is
+ an error writing to the file, delete it and exit with a failure
+ status. */
+ write_error = 0;
+ if (!write_infokey_file (outf, sections))
+ {
+ error_message (errno, _("error writing to `%s'"),
+ output_filename, NULL, NULL, NULL);
+ write_error = 1;
+ }
+ if (fclose (outf) == EOF)
+ {
+ error_message (errno, _("error closing output file `%s'"),
+ output_filename, NULL, NULL, NULL);
+ write_error = 1;
+ }
+ if (write_error)
+ {
+ unlink (output_filename);
+ xexit (1);
+ }
+ }
+
+ /* Close the input file. */
+ fclose (inf);
+ }
+
+ return 0;
+}
+
+static char *
+mkpath (const char *dir, const char *file)
+{
+ char *p;
+
+ p = xmalloc (strlen (dir) + 1 + strlen (file) + 2);
+ strcpy (p, dir);
+ strcat (p, "/");
+ strcat (p, file);
+ return p;
+}
+
+
+/* Compilation - the real work.
+
+ Source file syntax
+ ------------------
+ The source file is a line-based text file with the following
+ structure:
+
+ # comments
+ # more comments
+
+ #info
+ u prev-line
+ d next-line
+ ^a invalid # just beep
+ \ku prev-line
+ #stop
+ \kd next-line
+ q quit # of course!
+
+ #echo-area
+ ^a echo-area-beg-of-line
+ ^e echo-area-end-of-line
+ \kr echo-area-forward
+ \kl echo-area-backward
+ \kh echo-area-beg-of-line
+ \ke echo-area-end-of-line
+
+ #var
+ scroll-step=1
+ ISO-Latin=Off
+
+ Lines starting with '#' are comments, and are ignored. Blank
+ lines are ignored. Each section is introduced by one of the
+ following lines:
+
+ #info
+ #echo-area
+ #var
+
+ The sections may occur in any order. Each section may be
+ omitted completely. If the 'info' section is the first in the
+ file, its '#info' line may be omitted.
+
+ The 'info' and 'echo-area' sections
+ -----------------------------------
+ Each line in the 'info' or 'echo-area' sections has the
+ following syntax:
+
+ key-sequence SPACE action-name [ SPACE [ # comment ] ] \n
+
+ Where SPACE is one or more white space characters excluding
+ newline, "action-name" is the name of a GNU Info command,
+ "comment" is any sequence of characters excluding newline, and
+ "key-sequence" is a concatenation of one or more key definitions
+ using the following syntax:
+
+ 1. A carat ^ followed by one character indicates a single
+ control character;
+
+ 2. A backslash \ followed by one, two, or three octal
+ digits indicates a single character having that ASCII
+ code;
+
+ 3. \n indicates a single NEWLINE;
+ \e indicates a single ESC;
+ \r indicates a single CR;
+ \t indicates a single TAB;
+ \b indicates a single BACKSPACE;
+
+ 4. \ku indicates the Up Arrow key;
+ \kd indicates the Down Arrow key;
+ \kl indicates the Left Arrow key;
+ \kr indicates the Right Arrow key;
+ \kP indicates the Page Up (PRIOR) key;
+ \kN indicates the Page Down (NEXT) key;
+ \kh indicates the Home key;
+ \ke indicates the End key;
+ \kx indicates the DEL key;
+ \k followed by any other character indicates a single
+ control-K, and the following character is interpreted
+ as in rules 1, 2, 3, 5 and 6.
+
+ 5. \m followed by any sequence defined in rules 1, 2, 3, 4
+ or 6 indicates the "Meta" modification of that key.
+
+ 6. A backslash \ followed by any character not described
+ above indicates that character itself. In particular:
+ \\ indicates a single backslash \,
+ \ (backslash-space) indicates a single space,
+ \^ indicates a single caret ^,
+
+ If the following line:
+
+ #stop
+
+ occurs anywhere in an 'info' or 'echo-area' section, that
+ indicates to GNU Info to suppress all of its default key
+ bindings in that context.
+
+ The 'var' section
+ -----------------
+ Each line in the 'var' section has the following syntax:
+
+ variable-name = value \n
+
+ Where "variable-name" is the name of a GNU Info variable and
+ "value" is the value that GNU Info will assign to that variable
+ when commencing execution. There must be no white space in the
+ variable name, nor between the variable name and the '='. All
+ characters immediately following the '=', up to but not
+ including the terminating newline, are considered to be the
+ value that will be assigned. In other words, white space
+ following the '=' is not ignored.
+ */
+
+static int add_to_section (struct sect *s, const char *str, unsigned int len);
+static int lookup_action (const char *actname);
+
+/* Compile the input file into its various sections. Return true if no
+ error was encountered.
+ */
+static int
+compile (FILE *fp, const char *filename, struct sect *sections)
+{
+ int error = 0;
+ char rescan = 0;
+ unsigned int lnum = 0;
+ int c = 0;
+
+ /* This parser is a true state machine, with no sneaky fetching
+ of input characters inside the main loop. In other words, all
+ state is fully represented by the following variables:
+ */
+ enum
+ {
+ start_of_line,
+ start_of_comment,
+ in_line_comment,
+ in_trailing_comment,
+ get_keyseq,
+ got_keyseq,
+ get_action,
+ got_action,
+ get_varname,
+ got_varname,
+ get_equals,
+ got_equals,
+ get_value
+ }
+ state = start_of_line;
+ enum sect_e section = info;
+ enum
+ {
+ normal,
+ slosh,
+ control,
+ octal,
+ special_key
+ }
+ seqstate; /* used if state == get_keyseq */
+ char meta = 0;
+ char ocnt = 0; /* used if state == get_keyseq && seqstate == octal */
+
+ /* Data is accumulated in the following variables. The code
+ avoids overflowing these strings, and throws an error
+ where appropriate if a string limit is exceeded. These string
+ lengths are arbitrary (and should be large enough) and their
+ lengths are not hard-coded anywhere else, so increasing them
+ here will not break anything. */
+ char oval = 0;
+ char comment[10];
+ unsigned int clen = 0;
+ char seq[20];
+ unsigned int slen = 0;
+ char act[80];
+ unsigned int alen = 0;
+ char varn[80];
+ unsigned int varlen = 0;
+ char val[80];
+ unsigned int vallen = 0;
+
+#define To_seq(c) \
+ do { \
+ if (slen < sizeof seq) \
+ seq[slen++] = meta ? Meta(c) : (c); \
+ else \
+ { \
+ syntax_error(filename, lnum, _("key sequence too long"), \
+ NULL, NULL, NULL, NULL); \
+ error = 1; \
+ } \
+ meta = 0; \
+ } while (0)
+
+ sections[info].cur = 1;
+ sections[info].data[0] = 0;
+ sections[ea].cur = 1;
+ sections[ea].data[0] = 0;
+ sections[var].cur = 0;
+
+ while (!error && (rescan || (c = fgetc (fp)) != EOF))
+ {
+ rescan = 0;
+ switch (state)
+ {
+ case start_of_line:
+ lnum++;
+ if (c == '#')
+ state = start_of_comment;
+ else if (c != '\n')
+ {
+ switch (section)
+ {
+ case info:
+ case ea:
+ state = get_keyseq;
+ seqstate = normal;
+ slen = 0;
+ break;
+ case var:
+ state = get_varname;
+ varlen = 0;
+ break;
+ }
+ rescan = 1;
+ }
+ break;
+
+ case start_of_comment:
+ clen = 0;
+ state = in_line_comment;
+ /* fall through */
+ case in_line_comment:
+ if (c == '\n')
+ {
+ state = start_of_line;
+ comment[clen] = '\0';
+ if (strcmp (comment, "info") == 0)
+ section = info;
+ else if (strcmp (comment, "echo-area") == 0)
+ section = ea;
+ else if (strcmp (comment, "var") == 0)
+ section = var;
+ else if (strcmp (comment, "stop") == 0
+ && (section == info || section == ea))
+ sections[section].data[0] = 1;
+ }
+ else if (clen < sizeof comment - 1)
+ comment[clen++] = c;
+ break;
+
+ case in_trailing_comment:
+ if (c == '\n')
+ state = start_of_line;
+ break;
+
+ case get_keyseq:
+ switch (seqstate)
+ {
+ case normal:
+ if (c == '\n' || isspace (c))
+ {
+ state = got_keyseq;
+ rescan = 1;
+ if (slen == 0)
+ {
+ syntax_error (filename, lnum, _("missing key sequence"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ }
+ else if (c == '\\')
+ seqstate = slosh;
+ else if (c == '^')
+ seqstate = control;
+ else
+ To_seq (c);
+ break;
+
+ case slosh:
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ seqstate = octal;
+ oval = c - '0';
+ ocnt = 1;
+ break;
+ case 'b':
+ To_seq ('\b');
+ seqstate = normal;
+ break;
+ case 'e':
+ To_seq ('\033');
+ seqstate = normal;
+ break;
+ case 'n':
+ To_seq ('\n');
+ seqstate = normal;
+ break;
+ case 'r':
+ To_seq ('\r');
+ seqstate = normal;
+ break;
+ case 't':
+ To_seq ('\t');
+ seqstate = normal;
+ break;
+ case 'm':
+ meta = 1;
+ seqstate = normal;
+ break;
+ case 'k':
+ seqstate = special_key;
+ break;
+ default:
+ /* Backslash followed by any other char
+ just means that char. */
+ To_seq (c);
+ seqstate = normal;
+ break;
+ }
+ break;
+
+ case octal:
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ if (++ocnt <= 3)
+ oval = oval * 8 + c - '0';
+ if (ocnt == 3)
+ seqstate = normal;
+ break;
+ default:
+ ocnt = 4;
+ seqstate = normal;
+ rescan = 1;
+ break;
+ }
+ if (seqstate != octal)
+ {
+ if (oval)
+ To_seq (oval);
+ else
+ {
+ syntax_error (filename, lnum,
+ _("NUL character (\\000) not permitted"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ }
+ break;
+
+ case special_key:
+ To_seq (SK_ESCAPE);
+ switch (c)
+ {
+ case 'u': To_seq (SK_UP_ARROW); break;
+ case 'd': To_seq (SK_DOWN_ARROW); break;
+ case 'r': To_seq (SK_RIGHT_ARROW); break;
+ case 'l': To_seq (SK_LEFT_ARROW); break;
+ case 'U': To_seq (SK_PAGE_UP); break;
+ case 'D': To_seq (SK_PAGE_DOWN); break;
+ case 'h': To_seq (SK_HOME); break;
+ case 'e': To_seq (SK_END); break;
+ case 'x': To_seq (SK_DELETE); break;
+ default: To_seq (SK_LITERAL); rescan = 1; break;
+ }
+ seqstate = normal;
+ break;
+
+ case control:
+ if (CONTROL (c))
+ To_seq (CONTROL (c));
+ else
+ {
+ syntax_error (filename, lnum,
+ (char *) _("NUL character (^%c) not permitted"),
+ (void *) (long) c, NULL, NULL, NULL);
+ error = 1;
+ }
+ seqstate = normal;
+ break;
+ }
+ break;
+
+ case got_keyseq:
+ if (isspace (c) && c != '\n')
+ break;
+ state = get_action;
+ alen = 0;
+ /* fall through */
+ case get_action:
+ if (c == '\n' || isspace (c))
+ {
+ int a;
+
+ state = got_action;
+ rescan = 1;
+ if (alen == 0)
+ {
+ syntax_error (filename, lnum, (char *) _("missing action name"),
+ (void *) (long) c, NULL, NULL, NULL);
+ error = 1;
+ }
+ else
+ {
+ act[alen] = '\0';
+ a = lookup_action (act);
+ if (a != -1)
+ {
+ char av = a;
+
+ if (!(add_to_section (&sections[section], seq, slen)
+ && add_to_section (&sections[section], "", 1)
+ && add_to_section (&sections[section], &av, 1)))
+ {
+ syntax_error (filename, lnum, _("section too long"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ }
+ else
+ {
+ syntax_error (filename, lnum, _("unknown action `%s'"),
+ act, NULL, NULL, NULL);
+ error = 1;
+ }
+ }
+ }
+ else if (alen < sizeof act - 1)
+ act[alen++] = c;
+ else
+ {
+ syntax_error (filename, lnum, _("action name too long"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ break;
+
+ case got_action:
+ if (c == '#')
+ state = in_trailing_comment;
+ else if (c == '\n')
+ state = start_of_line;
+ else if (!isspace (c))
+ {
+ syntax_error (filename, lnum,
+ _("extra characters following action `%s'"),
+ act, NULL, NULL, NULL);
+ error = 1;
+ }
+ break;
+
+ case get_varname:
+ if (c == '=')
+ {
+ if (varlen == 0)
+ {
+ syntax_error (filename, lnum, _("missing variable name"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ state = get_value;
+ vallen = 0;
+ }
+ else if (c == '\n' || isspace (c))
+ {
+ syntax_error (filename, lnum,
+ _("missing `=' immediately after variable name"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ else if (varlen < sizeof varn)
+ varn[varlen++] = c;
+ else
+ {
+ syntax_error (filename, lnum, _("variable name too long"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ break;
+
+ case get_value:
+ if (c == '\n')
+ {
+ state = start_of_line;
+ if (!(add_to_section (&sections[section], varn, varlen)
+ && add_to_section (&sections[section], "", 1)
+ && add_to_section (&sections[section], val, vallen)
+ && add_to_section (&sections[section], "", 1)))
+ {
+ syntax_error (filename, lnum, _("section too long"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ }
+ else if (vallen < sizeof val)
+ val[vallen++] = c;
+ else
+ {
+ syntax_error (filename, lnum, _("value too long"),
+ NULL, NULL, NULL, NULL);
+ error = 1;
+ }
+ break;
+
+ case get_equals:
+ case got_equals:
+ case got_varname:
+ break;
+ }
+ }
+
+#undef To_seq
+
+ return !error;
+}
+
+/* Add some characters to a section's data. Return true if all the
+ characters fit, or false if the section's size limit was exceeded.
+ */
+static int
+add_to_section (struct sect *s, const char *str, unsigned int len)
+{
+ if (s->cur + len > sizeof s->data)
+ return 0;
+ strncpy ((char *) s->data + s->cur, str, len);
+ s->cur += len;
+ return 1;
+}
+
+/* Translate from an action name to its numeric code. This uses the
+ auto-generated array in key.c.
+ */
+static int
+lookup_action (const char *actname)
+{
+ int i;
+
+ if (strcmp ("invalid", actname) == 0)
+ return A_INVALID;
+ for (i = 0; function_key_array[i].name != NULL; i++)
+ if (strcmp (function_key_array[i].name, actname) == 0)
+ return function_key_array[i].code;
+ return -1;
+}
+
+/* Put an integer to an infokey file.
+ Integers are stored as two bytes, low order first,
+ in radix INFOKEY_RADIX.
+ */
+static int
+putint (int i, FILE *fp)
+{
+ return fputc (i % INFOKEY_RADIX, fp) != EOF
+ && fputc ((i / INFOKEY_RADIX) % INFOKEY_RADIX, fp) != EOF;
+}
+
+/* Write an entire section to an infokey file. If the section is
+ empty, simply omit it.
+ */
+static int
+putsect (struct sect *s, int code, FILE *fp)
+{
+ if (s->cur == 0)
+ return 1;
+ return fputc (code, fp) != EOF
+ && putint (s->cur, fp)
+ && fwrite (s->data, s->cur, 1, fp) == 1;
+}
+
+/* Write an entire infokey file, given an array containing its sections.
+ */
+static int
+write_infokey_file (FILE *fp, struct sect *sections)
+{
+ /* Get rid of sections with no effect. */
+ if (sections[info].cur == 1 && sections[info].data[0] == 0)
+ sections[info].cur = 0;
+ if (sections[ea].cur == 1 && sections[ea].data[0] == 0)
+ sections[ea].cur = 0;
+
+ /* Write all parts of the file out in order (no lseeks),
+ checking for errors all the way. */
+ return fputc (INFOKEY_MAGIC_S0, fp) != EOF
+ && fputc (INFOKEY_MAGIC_S1, fp) != EOF
+ && fputc (INFOKEY_MAGIC_S2, fp) != EOF
+ && fputc (INFOKEY_MAGIC_S3, fp) != EOF
+ && fputs (VERSION, fp) != EOF
+ && fputc ('\0', fp) != EOF
+ && putsect (&sections[info], INFOKEY_SECTION_INFO, fp)
+ && putsect (&sections[ea], INFOKEY_SECTION_EA, fp)
+ && putsect (&sections[var], INFOKEY_SECTION_VAR, fp)
+ && fputc (INFOKEY_MAGIC_E0, fp) != EOF
+ && fputc (INFOKEY_MAGIC_E1, fp) != EOF
+ && fputc (INFOKEY_MAGIC_E2, fp) != EOF
+ && fputc (INFOKEY_MAGIC_E3, fp) != EOF;
+}
+
+
+/* Error handling. */
+
+/* Give the user a "syntax error" message in the form
+ progname: "filename", line N: message
+ */
+static void
+error_message (int error_code, const char *fmt,
+ const void *a1, const void *a2, const void *a3, const void *a4)
+{
+ fprintf (stderr, "%s: ", program_name);
+ fprintf (stderr, fmt, a1, a2, a3, a4);
+ if (error_code)
+ fprintf (stderr, " - %s", strerror (error_code));
+ fprintf (stderr, "\n");
+}
+
+/* Give the user a generic error message in the form
+ progname: message
+ */
+static void
+syntax_error (const char *filename,
+ unsigned int linenum, const char *fmt,
+ const void *a1, const void *a2, const void *a3, const void *a4)
+{
+ fprintf (stderr, "%s: ", program_name);
+ fprintf (stderr, _("\"%s\", line %u: "), filename, linenum);
+ fprintf (stderr, fmt, a1, a2, a3, a4);
+ fprintf (stderr, "\n");
+}
+
+/* Produce a gentle rtfm. */
+static void
+suggest_help (void)
+{
+ fprintf (stderr, _("Try --help for more information.\n"));
+}
+
+/* Produce a scaled down description of the available options to Info. */
+static void
+short_help (void)
+{
+ printf (_("\
+Usage: %s [OPTION]... [INPUT-FILE]\n\
+\n\
+Compile infokey source file to infokey file. Reads INPUT-FILE (default\n\
+$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n\
+\n\
+Options:\n\
+ --output FILE output to FILE instead of $HOME/.info\n\
+ --help display this help and exit.\n\
+ --version display version information and exit.\n\
+"), program_name);
+
+ puts (_("\n\
+Email bug reports to bug-texinfo@gnu.org,\n\
+general questions and discussion to help-texinfo@gnu.org.\n\
+Texinfo home page: http://www.gnu.org/software/texinfo/"));
+
+ xexit (0);
+}
diff --git a/Build/source/utils/texinfo/info/infokey.h b/Build/source/utils/texinfo/info/infokey.h
new file mode 100644
index 00000000000..d51211d0c3a
--- /dev/null
+++ b/Build/source/utils/texinfo/info/infokey.h
@@ -0,0 +1,128 @@
+/* infokey.h -- Custom keystroke definition support.
+ $Id: infokey.h,v 1.2 2004/04/11 17:56:45 karl Exp $
+
+ Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Andrew Bettison <andrewb@zip.com.au>.
+
+ This design was derived from the "lesskey" system in less 3.4.0. by
+ Mark Nudelman.
+
+ The following terminology is confusing:
+ source file = $HOME/.infokey
+ infokey file = $HOME/.info
+ Oh, well.
+ */
+
+
+/* Default source file, where user writes text definitions to be
+ compiled to the infokey file. MS-DOS doesn't allow leading
+ dots in file names. */
+#ifdef __MSDOS__
+#define INFOKEY_SRCFILE "_infokey"
+#else
+#define INFOKEY_SRCFILE ".infokey"
+#endif
+
+/* Default "infokey file", where compiled user defs are kept and
+ read by Info. MS-DOS doesn't allow leading dots in file names. */
+#ifdef __MSDOS__
+#define INFOKEY_FILE "_info"
+#else
+#define INFOKEY_FILE ".info"
+#endif
+
+/*
+Format of entire infokey file:
+
+ 4 bytes magic number S
+ X bytes version string
+ 1 byte '\0' terminator
+
+ any number of sections:
+ 1 byte section id
+ 2 bytes section length (N)
+ N bytes section definitions: format depends on section
+
+ 4 bytes magic number E
+
+Format of INFO and EA sections:
+
+ 1 byte flag: 1 == suppress default key bindings
+ Repeat:
+ X bytes key sequence
+ 1 byte '\0' terminator
+ 1 byte action code (A_xxx)
+
+Format of VAR section:
+
+ Repeat:
+ X bytes variable name
+ 1 byte '\0' terminator
+ Y bytes value
+ 1 byte '\0' terminator
+
+*/
+
+#define INFOKEY_NMAGIC 8
+
+#define INFOKEY_MAGIC_S0 '\001'
+#define INFOKEY_MAGIC_S1 'I'
+#define INFOKEY_MAGIC_S2 'n'
+#define INFOKEY_MAGIC_S3 'f'
+
+#define INFOKEY_SECTION_INFO 'i'
+#define INFOKEY_SECTION_EA 'e'
+#define INFOKEY_SECTION_VAR 'v'
+
+#define INFOKEY_MAGIC_E0 'A'
+#define INFOKEY_MAGIC_E1 'l'
+#define INFOKEY_MAGIC_E2 'f'
+#define INFOKEY_MAGIC_E3 'n'
+
+#define INFOKEY_RADIX 64
+#define INFOKEY_MAX_SECTIONLEN 500
+#define INFOKEY_MAX_DEFLEN 16
+
+#define A_MAX_COMMAND 120
+#define A_INVALID 121
+
+/* Character transformations (independent of info's own) */
+
+#define CONTROL(c) ((c) & 0x1f)
+#define ISCONTROL(c) (((c) & ~0x1f) == 0)
+#define META(c) ((c) | 0x80)
+#define UNMETA(c) ((c) & ~0x80)
+#define ISMETA(c) (((c) & 0x80) != 0)
+
+/* Special keys (keys which output different strings on different terminals) */
+
+#define SK_ESCAPE CONTROL('k')
+#define SK_RIGHT_ARROW 1
+#define SK_LEFT_ARROW 2
+#define SK_UP_ARROW 3
+#define SK_DOWN_ARROW 4
+#define SK_PAGE_UP 5
+#define SK_PAGE_DOWN 6
+#define SK_HOME 7
+#define SK_END 8
+#define SK_DELETE 9
+#define SK_INSERT 10
+#define SK_CTL_LEFT_ARROW 11
+#define SK_CTL_RIGHT_ARROW 12
+#define SK_CTL_DELETE 13
+#define SK_LITERAL 40
diff --git a/Build/source/utils/texinfo/info/infomap.c b/Build/source/utils/texinfo/info/infomap.c
new file mode 100644
index 00000000000..c7dc2f4aea9
--- /dev/null
+++ b/Build/source/utils/texinfo/info/infomap.c
@@ -0,0 +1,1831 @@
+/* infomap.c -- keymaps for Info.
+ $Id: infomap.c,v 1.10 2004/07/30 20:43:40 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "infomap.h"
+#include "funs.h"
+#include "terminal.h"
+
+#if defined(INFOKEY)
+#include "infokey.h"
+#include "variables.h"
+#endif /* INFOKEY */
+
+static int keymap_bind_keyseq (Keymap map, const char *keyseq,
+ KEYMAP_ENTRY *keyentry);
+
+/* Return a new keymap which has all the uppercase letters mapped to run
+ the function info_do_lowercase_version (). */
+Keymap
+keymap_make_keymap (void)
+{
+ int i;
+ Keymap keymap;
+
+ keymap = (Keymap)xmalloc (256 * sizeof (KEYMAP_ENTRY));
+
+ for (i = 0; i < 256; i++)
+ {
+ keymap[i].type = ISFUNC;
+ keymap[i].function = (InfoCommand *)NULL;
+ }
+
+ for (i = 'A'; i < ('Z' + 1); i++)
+ {
+ keymap[i].type = ISFUNC;
+#if defined(INFOKEY)
+ keymap[Meta(i)].type = ISFUNC;
+ keymap[Meta(i)].function =
+#endif /* INFOKEY */
+ keymap[i].function = InfoCmd(info_do_lowercase_version);
+ }
+
+ return (keymap);
+}
+
+#if defined(INFOKEY)
+static FUNCTION_KEYSEQ *
+find_function_keyseq (Keymap map, int c, Keymap rootmap)
+{
+ FUNCTION_KEYSEQ *k;
+
+ if (map[c].type != ISFUNC)
+ abort();
+ if (map[c].function == NULL)
+ return NULL;
+ for (k = map[c].function->keys; k; k = k->next)
+ {
+ const unsigned char *p;
+ Keymap m = rootmap;
+ if (k->map != rootmap)
+ continue;
+ for (p = (unsigned char *) k->keyseq; *p && m[*p].type == ISKMAP; p++)
+ m = (Keymap)m[*p].function;
+ if (*p != c || p[1])
+ continue;
+ if (m[*p].type != ISFUNC)
+ abort ();
+ break;
+ }
+ return k;
+}
+
+static void
+add_function_keyseq (InfoCommand *function,
+ const char *keyseq, Keymap rootmap)
+{
+ FUNCTION_KEYSEQ *ks;
+
+ if (function == NULL ||
+ function == InfoCmd(info_do_lowercase_version) ||
+ function == InfoCmd(ea_insert))
+ return;
+ ks = (FUNCTION_KEYSEQ *)xmalloc (sizeof(FUNCTION_KEYSEQ));
+ ks->next = function->keys;
+ ks->map = rootmap;
+ ks->keyseq = xstrdup(keyseq);
+ function->keys = ks;
+}
+
+static void
+remove_function_keyseq (InfoCommand *function,
+ const char *keyseq, Keymap rootmap)
+{
+
+ FUNCTION_KEYSEQ *k, *kp;
+
+ if (function == NULL ||
+ function == InfoCmd(info_do_lowercase_version) ||
+ function == InfoCmd(ea_insert))
+ return;
+ for (kp = NULL, k = function->keys; k; kp = k, k = k->next)
+ if (k->map == rootmap && strcmp(k->keyseq, keyseq) == 0)
+ break;
+ if (!k)
+ abort ();
+ if (kp)
+ kp->next = k->next;
+ else
+ function->keys = k->next;
+}
+#endif /* INFOKEY */
+
+/* Return a new keymap which is a copy of MAP. */
+Keymap
+keymap_copy_keymap (Keymap map, Keymap rootmap, Keymap newroot)
+{
+ int i;
+ Keymap keymap;
+#if defined(INFOKEY)
+ FUNCTION_KEYSEQ *ks;
+#endif /* INFOKEY */
+
+ keymap = keymap_make_keymap ();
+ if (!newroot)
+ newroot = keymap;
+
+ for (i = 0; i < 256; i++)
+ {
+ keymap[i].type = map[i].type;
+ switch (map[i].type)
+ {
+ case ISFUNC:
+ keymap[i].function = map[i].function;
+#if defined(INFOKEY)
+ ks = find_function_keyseq (map, i, rootmap);
+ if (ks)
+ add_function_keyseq(map[i].function, ks->keyseq, newroot);
+#endif /* INFOKEY */
+ break;
+ case ISKMAP:
+ keymap[i].function = (InfoCommand *)keymap_copy_keymap
+ ((Keymap)map[i].function, rootmap, NULL);
+ break;
+ }
+ }
+ return (keymap);
+}
+
+/* Free the keymap and its descendants. */
+void
+keymap_discard_keymap (Keymap map, Keymap rootmap)
+{
+ int i;
+
+ if (!map)
+ return;
+ if (!rootmap)
+ rootmap = map;
+
+ for (i = 0; i < 256; i++)
+ {
+#if defined(INFOKEY)
+ FUNCTION_KEYSEQ *ks;
+#endif /* INFOKEY */
+ switch (map[i].type)
+ {
+ case ISFUNC:
+#if defined(INFOKEY)
+ ks = find_function_keyseq(map, i, rootmap);
+ if (ks)
+ remove_function_keyseq (map[i].function, ks->keyseq, rootmap);
+#endif /* INFOKEY */
+ break;
+
+ case ISKMAP:
+ keymap_discard_keymap ((Keymap)map[i].function, rootmap);
+ break;
+
+ }
+ }
+ free(map);
+}
+
+/* Conditionally bind key sequence. */
+static int
+keymap_bind_keyseq (Keymap map,
+ const char *keyseq, KEYMAP_ENTRY *keyentry)
+{
+ Keymap m = map;
+ const unsigned char *s = (unsigned char *) keyseq;
+ int c;
+
+ if (s == NULL || *s == '\0') return 0;
+
+ while ((c = *s++) != '\0')
+ {
+#if defined(INFOKEY)
+ FUNCTION_KEYSEQ *ks;
+#endif /* INFOKEY */
+ switch (m[c].type)
+ {
+ case ISFUNC:
+#if defined(INFOKEY)
+ ks = find_function_keyseq(m, c, map);
+ if (ks)
+ remove_function_keyseq (m[c].function, ks->keyseq, map);
+#else /* !INFOKEY */
+ if (!(m[c].function == NULL || (
+ m != map &&
+ m[c].function == InfoCmd(info_do_lowercase_version))
+ ))
+ return 0;
+#endif /* !INFOKEY */
+
+ if (*s != '\0')
+ {
+ m[c].type = ISKMAP;
+ /* Here we are casting the Keymap pointer returned from
+ keymap_make_keymap to an InfoCommand pointer. Ugh.
+ This makes the `function' structure garbage
+ if it's actually interpreted as an InfoCommand.
+ Should really be using a union, and taking steps to
+ avoid the possible error. */
+ m[c].function = (InfoCommand *)keymap_make_keymap ();
+ }
+ break;
+
+ case ISKMAP:
+#if defined(INFOKEY)
+ if (*s == '\0')
+ keymap_discard_keymap ((Keymap)m[c].function, map);
+#else /* !INFOKEY */
+ if (*s == '\0')
+ return 0;
+#endif
+ break;
+ }
+ if (*s != '\0')
+ {
+ m = (Keymap)m[c].function;
+ }
+ else
+ {
+#if defined(INFOKEY)
+ add_function_keyseq (keyentry->function, keyseq, map);
+#endif /* INFOKEY */
+ m[c] = *keyentry;
+ }
+ }
+
+ return 1;
+}
+
+/* Initialize the standard info keymaps. */
+
+Keymap info_keymap = NULL;
+Keymap echo_area_keymap = NULL;
+
+#if !defined(INFOKEY)
+
+static void
+initialize_emacs_like_keymaps ()
+{
+ int i;
+ Keymap map;
+
+ if (!info_keymap)
+ {
+ info_keymap = keymap_make_keymap ();
+ echo_area_keymap = keymap_make_keymap ();
+ }
+
+ info_keymap[ESC].type = ISKMAP;
+ info_keymap[ESC].function = (InfoCommand *)keymap_make_keymap ();
+ info_keymap[Control ('x')].type = ISKMAP;
+ info_keymap[Control ('x')].function = (InfoCommand *)keymap_make_keymap ();
+
+ /* Bind the echo area insert routines. Let's make all characters
+ insertable by default, regardless of which character set we might
+ be using. */
+ for (i = 0; i < 256; i++)
+ echo_area_keymap[i].function = ea_insert;
+
+ echo_area_keymap[ESC].type = ISKMAP;
+ echo_area_keymap[ESC].function = (InfoCommand *) keymap_make_keymap ();
+ echo_area_keymap[Control ('x')].type = ISKMAP;
+ echo_area_keymap[Control ('x')].function
+ = (InfoCommand *) keymap_make_keymap ();
+
+ /* Bind numeric arg functions for both echo area and info window maps. */
+ for (i = '0'; i < '9' + 1; i++)
+ {
+ ((Keymap) info_keymap[ESC].function)[i].function
+ = ((Keymap) echo_area_keymap[ESC].function)[i].function
+ = info_add_digit_to_numeric_arg;
+ }
+ ((Keymap) info_keymap[ESC].function)['-'].function =
+ ((Keymap) echo_area_keymap[ESC].function)['-'].function =
+ info_add_digit_to_numeric_arg;
+
+ info_keymap['-'].function = info_add_digit_to_numeric_arg;
+
+ /* Bind the echo area routines. */
+ map = echo_area_keymap;
+
+ map[Control ('a')].function = ea_beg_of_line;
+ map[Control ('b')].function = ea_backward;
+ map[Control ('d')].function = ea_delete;
+ map[Control ('e')].function = ea_end_of_line;
+ map[Control ('f')].function = ea_forward;
+ map[Control ('g')].function = ea_abort;
+ map[Control ('h')].function = ea_rubout;
+ map[Control ('k')].function = ea_kill_line;
+ map[Control ('l')].function = info_redraw_display;
+ map[Control ('q')].function = ea_quoted_insert;
+ map[Control ('t')].function = ea_transpose_chars;
+ map[Control ('u')].function = info_universal_argument;
+ map[Control ('y')].function = ea_yank;
+
+ map[LFD].function = ea_newline;
+ map[RET].function = ea_newline;
+ map[SPC].function = ea_complete;
+ map[TAB].function = ea_complete;
+ map['?'].function = ea_possible_completions;
+#ifdef __MSDOS__
+ /* PC users will lynch me if I don't give them their usual DEL effect... */
+ map[DEL].function = ea_delete;
+#else
+ map[DEL].function = ea_rubout;
+#endif
+
+ /* Bind the echo area ESC keymap. */
+ map = (Keymap)echo_area_keymap[ESC].function;
+
+ map[Control ('g')].function = ea_abort;
+ map[Control ('v')].function = ea_scroll_completions_window;
+ map['b'].function = ea_backward_word;
+ map['d'].function = ea_kill_word;
+ map['f'].function = ea_forward_word;
+#if defined (NAMED_FUNCTIONS)
+ /* map['x'].function = info_execute_command; */
+#endif /* NAMED_FUNCTIONS */
+ map['y'].function = ea_yank_pop;
+ map['?'].function = ea_possible_completions;
+ map[TAB].function = ea_tab_insert;
+ map[DEL].function = ea_backward_kill_word;
+
+ /* Bind the echo area Control-x keymap. */
+ map = (Keymap)echo_area_keymap[Control ('x')].function;
+
+ map['o'].function = info_next_window;
+ map[DEL].function = ea_backward_kill_line;
+
+ /* Arrow key bindings for echo area keymaps. It seems that some
+ terminals do not match their termcap entries, so it's best to just
+ define everything with both of the usual prefixes. */
+ map = echo_area_keymap;
+ keymap_bind_keyseq (map, term_ku, &map[Control ('p')]); /* up */
+ keymap_bind_keyseq (map, "\033OA", &map[Control ('p')]);
+ keymap_bind_keyseq (map, "\033[A", &map[Control ('p')]);
+ keymap_bind_keyseq (map, term_kd, &map[Control ('n')]); /* down */
+ keymap_bind_keyseq (map, "\033OB", &map[Control ('n')]);
+ keymap_bind_keyseq (map, "\033[B", &map[Control ('n')]);
+ keymap_bind_keyseq (map, term_kr, &map[Control ('f')]); /* right */
+ keymap_bind_keyseq (map, "\033OC", &map[Control ('f')]);
+ keymap_bind_keyseq (map, "\033[C", &map[Control ('f')]);
+ keymap_bind_keyseq (map, term_kl, &map[Control ('b')]); /* left */
+ keymap_bind_keyseq (map, "\033OD", &map[Control ('b')]);
+ keymap_bind_keyseq (map, "\033[D", &map[Control ('b')]);
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+ keymap_bind_keyseq (map, term_kh, &map[Control ('a')]); /* home */
+ keymap_bind_keyseq (map, term_ke, &map[Control ('e')]); /* end */
+
+ map = (Keymap)echo_area_keymap[ESC].function;
+ keymap_bind_keyseq (map, term_kl, &map['b']); /* left */
+ keymap_bind_keyseq (map, "\033OA", &map['b']);
+ keymap_bind_keyseq (map, "\033[A", &map['b']);
+ keymap_bind_keyseq (map, term_kr, &map['f']); /* right */
+ keymap_bind_keyseq (map, "\033OB", &map['f']);
+ keymap_bind_keyseq (map, "\033[B", &map['f']);
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ map = (Keymap)echo_area_keymap[Control ('x')].function;
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ /* Bind commands for Info window keymaps. */
+ map = info_keymap;
+ map[TAB].function = info_move_to_next_xref;
+ map[LFD].function = info_select_reference_this_line;
+ map[RET].function = info_select_reference_this_line;
+ map[SPC].function = info_scroll_forward;
+ map[Control ('a')].function = info_beginning_of_line;
+ map[Control ('b')].function = info_backward_char;
+ map[Control ('e')].function = info_end_of_line;
+ map[Control ('f')].function = info_forward_char;
+ map[Control ('g')].function = info_abort_key;
+ map[Control ('h')].function = info_get_help_window;
+ map[Control ('l')].function = info_redraw_display;
+ map[Control ('n')].function = info_next_line;
+ map[Control ('p')].function = info_prev_line;
+ map[Control ('r')].function = isearch_backward;
+ map[Control ('s')].function = isearch_forward;
+ map[Control ('u')].function = info_universal_argument;
+ map[Control ('v')].function = info_scroll_forward_page_only;
+ map[','].function = info_next_index_match;
+ map['/'].function = info_search;
+
+ for (i = '1'; i < '9' + 1; i++)
+ map[i].function = info_menu_digit;
+ map['0'].function = info_last_menu_item;
+
+ map['<'].function = info_first_node;
+ map['>'].function = info_last_node;
+ map['?'].function = info_get_help_window;
+ map['['].function = info_global_prev_node;
+ map[']'].function = info_global_next_node;
+
+ map['b'].function = info_beginning_of_node;
+ map['d'].function = info_dir_node;
+ map['e'].function = info_end_of_node;
+ map['f'].function = info_xref_item;
+ map['g'].function = info_goto_node;
+ map['G'].function = info_menu_sequence;
+ map['h'].function = info_get_info_help_node;
+ map['i'].function = info_index_search;
+ map['I'].function = info_goto_invocation_node;
+ map['l'].function = info_history_node;
+ map['m'].function = info_menu_item;
+ map['n'].function = info_next_node;
+ map['O'].function = info_goto_invocation_node;
+ map['p'].function = info_prev_node;
+ map['q'].function = info_quit;
+ map['r'].function = info_xref_item;
+ map['s'].function = info_search;
+ map['S'].function = info_search_case_sensitively;
+ map['t'].function = info_top_node;
+ map['u'].function = info_up_node;
+ map[DEL].function = info_scroll_backward;
+
+ /* Bind members in the ESC map for Info windows. */
+ map = (Keymap)info_keymap[ESC].function;
+ map[Control ('f')].function = info_show_footnotes;
+ map[Control ('g')].function = info_abort_key;
+ map[TAB].function = info_move_to_prev_xref;
+ map[Control ('v')].function = info_scroll_other_window;
+ map['<'].function = info_beginning_of_node;
+ map['>'].function = info_end_of_node;
+ map['b'].function = info_backward_word;
+ map['f'].function = info_forward_word;
+ map['r'].function = info_move_to_window_line;
+ map['v'].function = info_scroll_backward_page_only;
+#if defined (NAMED_FUNCTIONS)
+ map['x'].function = info_execute_command;
+#endif /* NAMED_FUNCTIONS */
+ map[DEL].function = info_scroll_other_window_backward;
+
+ /* Bind members in the Control-X map for Info windows. */
+ map = (Keymap)info_keymap[Control ('x')].function;
+
+ map[Control ('b')].function = list_visited_nodes;
+ map[Control ('c')].function = info_quit;
+ map[Control ('f')].function = info_view_file;
+ map[Control ('g')].function = info_abort_key;
+ map[Control ('v')].function = info_view_file;
+ map['0'].function = info_delete_window;
+ map['1'].function = info_keep_one_window;
+ map['2'].function = info_split_window;
+ map['^'].function = info_grow_window;
+ map['b'].function = select_visited_node;
+ map['k'].function = info_kill_node;
+ map['n'].function = info_search_next;
+ map['N'].function = info_search_previous;
+ map['o'].function = info_next_window;
+ map['t'].function = info_tile_windows;
+ map['w'].function = info_toggle_wrap;
+
+ /* Arrow key bindings for Info windows keymap. */
+ map = info_keymap;
+ keymap_bind_keyseq (map, term_kN, &map[Control ('v')]); /* pagedown */
+ keymap_bind_keyseq (map, term_ku, &map[Control ('p')]); /* up */
+ keymap_bind_keyseq (map, "\033OA", &map[Control ('p')]);
+ keymap_bind_keyseq (map, "\033[A", &map[Control ('p')]);
+ keymap_bind_keyseq (map, term_kd, &map[Control ('n')]); /* down */
+ keymap_bind_keyseq (map, "\033OB", &map[Control ('n')]);
+ keymap_bind_keyseq (map, "\033[B", &map[Control ('n')]);
+ keymap_bind_keyseq (map, term_kr, &map[Control ('f')]); /* right */
+ keymap_bind_keyseq (map, "\033OC", &map[Control ('f')]);
+ keymap_bind_keyseq (map, "\033[C", &map[Control ('f')]);
+ keymap_bind_keyseq (map, term_kl, &map[Control ('b')]); /* left */
+ keymap_bind_keyseq (map, "\033OD", &map[Control ('b')]);
+ keymap_bind_keyseq (map, "\033[D", &map[Control ('b')]);
+ keymap_bind_keyseq (map, term_kh, &map['b']); /* home */
+ keymap_bind_keyseq (map, term_ke, &map['e']); /* end */
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ map = (Keymap)info_keymap[ESC].function;
+ keymap_bind_keyseq (map, term_kl, &map['b']); /* left */
+ keymap_bind_keyseq (map, "\033OA", &map['b']);
+ keymap_bind_keyseq (map, "\033[A", &map['b']);
+ keymap_bind_keyseq (map, term_kr, &map['f']); /* right */
+ keymap_bind_keyseq (map, "\033OB", &map['f']);
+ keymap_bind_keyseq (map, "\033[B", &map['f']);
+ keymap_bind_keyseq (map, term_kN, &map[Control ('v')]); /* pagedown */
+ keymap_bind_keyseq (map, term_kP, &map[DEL]); /* pageup */
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ /* The alternative to this definition of a `main map' key in the
+ `ESC map' section, is something like:
+ keymap_bind_keyseq (map, term_kP, &((KeyMap)map[ESC].function).map['v']);
+ */
+ keymap_bind_keyseq (info_keymap/*sic*/, term_kP, &map['v']); /* pageup */
+}
+
+static void
+initialize_vi_like_keymaps ()
+{
+ int i;
+ Keymap map;
+
+ if (!info_keymap)
+ {
+ info_keymap = keymap_make_keymap ();
+ echo_area_keymap = keymap_make_keymap ();
+ }
+
+ info_keymap[ESC].type = ISKMAP;
+ info_keymap[ESC].function = (InfoCommand *)keymap_make_keymap ();
+ info_keymap[Control ('x')].type = ISKMAP;
+ info_keymap[Control ('x')].function = (InfoCommand *)keymap_make_keymap ();
+
+ /* Bind the echo area insert routines. */
+ for (i = 0; i < 256; i++)
+ echo_area_keymap[i].function = ea_insert;
+
+ echo_area_keymap[ESC].type = ISKMAP;
+ echo_area_keymap[ESC].function = (InfoCommand *)keymap_make_keymap ();
+ echo_area_keymap[Control ('x')].type = ISKMAP;
+ echo_area_keymap[Control ('x')].function =
+ (InfoCommand *)keymap_make_keymap ();
+
+ /* Bind numeric arg functions for both echo area and info window maps. */
+ for (i = '0'; i < '9' + 1; i++)
+ {
+ info_keymap[i].function =
+ ((Keymap) echo_area_keymap[ESC].function)[i].function =
+ info_add_digit_to_numeric_arg;
+ }
+ info_keymap['-'].function =
+ ((Keymap) echo_area_keymap[ESC].function)['-'].function =
+ info_add_digit_to_numeric_arg;
+
+ /* Bind the echo area routines. */
+ map = echo_area_keymap;
+
+ map[Control ('a')].function = ea_beg_of_line;
+ map[Control ('b')].function = ea_backward;
+ map[Control ('d')].function = ea_delete;
+ map[Control ('e')].function = ea_end_of_line;
+ map[Control ('f')].function = ea_forward;
+ map[Control ('g')].function = ea_abort;
+ map[Control ('h')].function = ea_rubout;
+ map[Control ('k')].function = ea_kill_line;
+ map[Control ('l')].function = info_redraw_display;
+ map[Control ('q')].function = ea_quoted_insert;
+ map[Control ('t')].function = ea_transpose_chars;
+ map[Control ('u')].function = ea_abort;
+ map[Control ('v')].function = ea_quoted_insert;
+ map[Control ('y')].function = ea_yank;
+
+ map[LFD].function = ea_newline;
+ map[RET].function = ea_newline;
+ map[SPC].function = ea_complete;
+ map[TAB].function = ea_complete;
+ map['?'].function = ea_possible_completions;
+#ifdef __MSDOS__
+ /* PC users will lynch me if I don't give them their usual DEL effect... */
+ map[DEL].function = ea_delete;
+#else
+ map[DEL].function = ea_rubout;
+#endif
+
+ /* Bind the echo area ESC keymap. */
+ map = (Keymap)echo_area_keymap[ESC].function;
+
+ map[Control ('g')].function = ea_abort;
+ map[Control ('h')].function = ea_backward_kill_word;
+ map[Control ('v')].function = ea_scroll_completions_window;
+ map['0'].function = ea_beg_of_line;
+ map['$'].function = ea_end_of_line;
+ map['b'].function = ea_backward_word;
+ map['d'].function = ea_kill_word;
+ map['f'].function = ea_forward_word;
+ map['h'].function = ea_backward;
+ map['l'].function = ea_forward;
+ map['w'].function = ea_forward_word;
+ map['x'].function = ea_delete;
+ map['X'].function = ea_kill_word;
+ map['y'].function = ea_yank_pop;
+ map['?'].function = ea_possible_completions;
+ map[TAB].function = ea_tab_insert;
+ map[DEL].function = ea_kill_word;
+
+ /* Bind the echo area Control-x keymap. */
+ map = (Keymap)echo_area_keymap[Control ('x')].function;
+
+ map['o'].function = info_next_window;
+ map[DEL].function = ea_backward_kill_line;
+
+ /* Arrow key bindings for echo area keymaps. It seems that some
+ terminals do not match their termcap entries, so it's best to just
+ define everything with both of the usual prefixes. */
+ map = echo_area_keymap;
+ keymap_bind_keyseq (map, term_ku, &map[Control ('p')]); /* up */
+ keymap_bind_keyseq (map, "\033OA", &map[Control ('p')]);
+ keymap_bind_keyseq (map, "\033[A", &map[Control ('p')]);
+ keymap_bind_keyseq (map, term_kd, &map[Control ('n')]); /* down */
+ keymap_bind_keyseq (map, "\033OB", &map[Control ('n')]);
+ keymap_bind_keyseq (map, "\033[B", &map[Control ('n')]);
+ keymap_bind_keyseq (map, term_kr, &map[Control ('f')]); /* right */
+ keymap_bind_keyseq (map, "\033OC", &map[Control ('f')]);
+ keymap_bind_keyseq (map, "\033[C", &map[Control ('f')]);
+ keymap_bind_keyseq (map, term_kl, &map[Control ('b')]); /* left */
+ keymap_bind_keyseq (map, "\033OD", &map[Control ('b')]);
+ keymap_bind_keyseq (map, "\033[D", &map[Control ('b')]);
+ keymap_bind_keyseq (map, term_kh, &map[Control ('a')]); /* home */
+ keymap_bind_keyseq (map, term_ke, &map[Control ('e')]); /* end */
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ map = (Keymap)echo_area_keymap[ESC].function;
+ keymap_bind_keyseq (map, term_kl, &map['b']); /* left */
+ keymap_bind_keyseq (map, "\033OA", &map['b']);
+ keymap_bind_keyseq (map, "\033[A", &map['b']);
+ keymap_bind_keyseq (map, term_kr, &map['f']); /* right */
+ keymap_bind_keyseq (map, "\033OB", &map['f']);
+ keymap_bind_keyseq (map, "\033[B", &map['f']);
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ map = (Keymap)echo_area_keymap[Control ('x')].function;
+ keymap_bind_keyseq (map, term_kD, &map[DEL]);
+
+ /* Bind commands for Info window keymaps. */
+ map = info_keymap;
+ map[TAB].function = info_move_to_next_xref;
+ map[LFD].function = info_down_line;
+ map[RET].function = info_down_line;
+ map[SPC].function = info_scroll_forward;
+ map[Control ('a')].function = info_beginning_of_line;
+ map[Control ('b')].function = info_scroll_backward_page_only;
+ map[Control ('d')].function = info_scroll_half_screen_down;
+ map[Control ('e')].function = info_down_line;
+ map[Control ('f')].function = info_scroll_forward_page_only;
+ map[Control ('g')].function = info_abort_key;
+ map[Control ('k')].function = info_up_line;
+ map[Control ('l')].function = info_redraw_display;
+ map[Control ('n')].function = info_down_line;
+ map[Control ('p')].function = info_up_line;
+ map[Control ('r')].function = info_redraw_display;
+ map[Control ('s')].function = isearch_forward;
+ map[Control ('u')].function = info_scroll_half_screen_up;
+ map[Control ('v')].function = info_scroll_forward_page_only;
+ map[Control ('y')].function = info_up_line;
+ map[','].function = info_next_index_match;
+ map['/'].function = info_search;
+
+ for (i = '1'; i < '9' + 1; i++)
+ ((Keymap) info_keymap[ESC].function)[i].function = info_menu_digit;
+ ((Keymap) info_keymap[ESC].function)['0'].function = info_last_menu_item;
+
+ map['<'].function = info_first_node;
+ map['>'].function = info_last_node;
+ map['?'].function = info_search_backward;
+ map['['].function = info_global_prev_node;
+ map[']'].function = info_global_next_node;
+ map['\''].function = info_history_node;
+
+ map['b'].function = info_scroll_backward;
+ map['d'].function = info_scroll_half_screen_down;
+ map['e'].function = info_down_line;
+ map['E'].function = info_view_file;
+ map['f'].function = info_scroll_forward_page_only;
+ map['F'].function = info_scroll_forward_page_only;
+ map['g'].function = info_first_node;
+ map['G'].function = info_last_node;
+ map['h'].function = info_get_help_window;
+ map['H'].function = info_get_help_window;
+ map['i'].function = info_index_search;
+ map['I'].function = info_goto_invocation_node;
+ map['j'].function = info_next_line;
+ map['k'].function = info_prev_line;
+ map['l'].function = info_history_node;
+ map['m'].function = info_menu_item;
+ map['n'].function = info_search_next;
+ map['N'].function = info_search_previous;
+ map['O'].function = info_goto_invocation_node;
+ map['p'].function = info_prev_node;
+ map['q'].function = info_quit;
+ map['Q'].function = info_quit;
+ map['r'].function = info_redraw_display;
+ map['R'].function = info_redraw_display;
+ map['s'].function = info_search;
+ map['S'].function = info_search_case_sensitively;
+ map['t'].function = info_top_node;
+ map['u'].function = info_scroll_half_screen_up;
+ map['w'].function = info_scroll_backward_page_only_set_window;
+ map['y'].function = info_up_line;
+ map['z'].function = info_scroll_forward_page_only_set_window;
+ map['Z'].function = NULL; /* unbind, so it works to bind "ZZ" below */
+ map[DEL].function = info_scroll_backward;
+ keymap_bind_keyseq (map, term_kD, &map[DEL]);
+ keymap_bind_keyseq (map, ":q", &map['q']);
+ keymap_bind_keyseq (map, ":Q", &map['q']);
+ keymap_bind_keyseq (map, "ZZ", &map['q']);
+
+ /* Bind members in the ESC map for Info windows. */
+ map = (Keymap)info_keymap[ESC].function;
+ map[Control ('f')].function = info_show_footnotes;
+ map[Control ('g')].function = info_abort_key;
+ map[TAB].function = info_move_to_prev_xref;
+ map[SPC].function = info_scroll_forward_page_only;
+ map[Control ('v')].function = info_scroll_other_window;
+ map['<'].function = info_beginning_of_node;
+ map['>'].function = info_end_of_node;
+ map['/'].function = info_search;
+ map['?'].function = info_search_backward;
+ map['b'].function = info_beginning_of_node;
+ map['d'].function = info_dir_node;
+ map['e'].function = info_end_of_node;
+ map['f'].function = info_xref_item;
+ map['g'].function = info_select_reference_this_line;
+ map['h'].function = info_get_info_help_node;
+ map['m'].function = info_menu_item;
+ map['n'].function = info_search;
+ map['N'].function = info_search_backward;
+ map['r'].function = isearch_backward;
+ map['s'].function = isearch_forward;
+ map['t'].function = info_top_node;
+ map['v'].function = info_scroll_backward_page_only;
+#if defined (NAMED_FUNCTIONS)
+ map['x'].function = info_execute_command;
+#endif /* NAMED_FUNCTIONS */
+ map[DEL].function = info_scroll_other_window_backward;
+
+ /* Bind members in the Control-X map for Info windows. */
+ map = (Keymap)info_keymap[Control ('x')].function;
+
+ map[Control ('b')].function = list_visited_nodes;
+ map[Control ('c')].function = info_quit;
+ map[Control ('f')].function = info_view_file;
+ map[Control ('g')].function = info_abort_key;
+ map[Control ('v')].function = info_view_file;
+ map[LFD].function = info_select_reference_this_line;
+ map[RET].function = info_select_reference_this_line;
+ map['0'].function = info_delete_window;
+ map['1'].function = info_keep_one_window;
+ map['2'].function = info_split_window;
+ map['^'].function = info_grow_window;
+ map['b'].function = select_visited_node;
+ map['g'].function = info_goto_node;
+ map['i'].function = info_index_search;
+ map['I'].function = info_goto_invocation_node;
+ map['k'].function = info_kill_node;
+ map['n'].function = info_next_node;
+ map['o'].function = info_next_window;
+ map['O'].function = info_goto_invocation_node;
+ map['p'].function = info_prev_node;
+ map['r'].function = info_xref_item;
+ map['t'].function = info_tile_windows;
+ map['u'].function = info_up_node;
+ map['w'].function = info_toggle_wrap;
+ map[','].function = info_next_index_match;
+ keymap_bind_keyseq (info_keymap, ":e", &map[Control ('v')]);
+
+ /* Arrow key bindings for Info windows keymap. */
+ map = info_keymap;
+ keymap_bind_keyseq (map, term_kN, &map[Control ('v')]); /* pagedown */
+ keymap_bind_keyseq (map, term_ku, &map[Control ('p')]); /* up */
+ keymap_bind_keyseq (map, "\033OA", &map[Control ('p')]);
+ keymap_bind_keyseq (map, "\033[A", &map[Control ('p')]);
+ keymap_bind_keyseq (map, term_kd, &map[Control ('n')]); /* down */
+ keymap_bind_keyseq (map, "\033OB", &map[Control ('n')]);
+ keymap_bind_keyseq (map, "\033[B", &map[Control ('n')]);
+ keymap_bind_keyseq (map, term_kr, &map[Control ('f')]); /* right */
+ keymap_bind_keyseq (map, "\033OC", &map[Control ('f')]);
+ keymap_bind_keyseq (map, "\033[C", &map[Control ('f')]);
+ keymap_bind_keyseq (map, term_kl, &map[Control ('b')]); /* left */
+ keymap_bind_keyseq (map, "\033OD", &map[Control ('b')]);
+ keymap_bind_keyseq (map, "\033[D", &map[Control ('b')]);
+ keymap_bind_keyseq (map, term_kh, &map['b']); /* home */
+ keymap_bind_keyseq (map, term_ke, &map['e']); /* end */
+
+ map = (Keymap)info_keymap[ESC].function;
+ keymap_bind_keyseq (map, term_kl, &map['b']); /* left */
+ keymap_bind_keyseq (map, "\033OA", &map['b']);
+ keymap_bind_keyseq (map, "\033[A", &map['b']);
+ keymap_bind_keyseq (map, term_kr, &map['f']); /* right */
+ keymap_bind_keyseq (map, "\033OB", &map['f']);
+ keymap_bind_keyseq (map, "\033[B", &map['f']);
+ keymap_bind_keyseq (map, term_kN, &map[Control ('v')]); /* pagedown */
+ keymap_bind_keyseq (map, term_kP, &map[DEL]); /* pageup */
+ keymap_bind_keyseq (map, term_kD, &map[DEL]); /* delete */
+
+ /* The alternative to this definition of a `main map' key in the
+ `ESC map' section, is something like:
+ keymap_bind_keyseq (map, term_kP, &((KeyMap)map[ESC].function).map['v']);
+ */
+ keymap_bind_keyseq (info_keymap/*sic*/, term_kP, &map['v']); /* pageup */
+}
+
+void
+initialize_info_keymaps ()
+{
+ if (vi_keys_p)
+ initialize_vi_like_keymaps ();
+ else
+ initialize_emacs_like_keymaps ();
+}
+
+#else /* defined(INFOKEY) */
+
+/* Make sure that we don't have too many command codes defined. */
+
+#if A_NCOMMANDS > A_MAX_COMMAND + 1
+#error "too many commands defined"
+#endif
+
+/* Initialize the keymaps from the .info keymap file. */
+
+#define NUL '\0'
+
+static unsigned char default_emacs_like_info_keys[] =
+{
+ 0, /* suppress-default-keybindings flag */
+ TAB, NUL, A_info_move_to_next_xref,
+ LFD, NUL, A_info_select_reference_this_line,
+ RET, NUL, A_info_select_reference_this_line,
+ SPC, NUL, A_info_scroll_forward,
+ CONTROL('a'), NUL, A_info_beginning_of_line,
+ CONTROL('b'), NUL, A_info_backward_char,
+ CONTROL('e'), NUL, A_info_end_of_line,
+ CONTROL('f'), NUL, A_info_forward_char,
+ CONTROL('g'), NUL, A_info_abort_key,
+ CONTROL('h'), NUL, A_info_get_help_window,
+ CONTROL('l'), NUL, A_info_redraw_display,
+ CONTROL('n'), NUL, A_info_next_line,
+ CONTROL('p'), NUL, A_info_prev_line,
+ CONTROL('r'), NUL, A_isearch_backward,
+ CONTROL('s'), NUL, A_isearch_forward,
+ CONTROL('u'), NUL, A_info_universal_argument,
+ CONTROL('v'), NUL, A_info_scroll_forward_page_only,
+ ',', NUL, A_info_next_index_match,
+ '/', NUL, A_info_search,
+ '0', NUL, A_info_last_menu_item,
+ '1', NUL, A_info_menu_digit,
+ '2', NUL, A_info_menu_digit,
+ '3', NUL, A_info_menu_digit,
+ '4', NUL, A_info_menu_digit,
+ '5', NUL, A_info_menu_digit,
+ '6', NUL, A_info_menu_digit,
+ '7', NUL, A_info_menu_digit,
+ '8', NUL, A_info_menu_digit,
+ '9', NUL, A_info_menu_digit,
+ '<', NUL, A_info_first_node,
+ '>', NUL, A_info_last_node,
+ '?', NUL, A_info_get_help_window,
+ '[', NUL, A_info_global_prev_node,
+ ']', NUL, A_info_global_next_node,
+ 'b', NUL, A_info_beginning_of_node,
+ 'd', NUL, A_info_dir_node,
+ 'e', NUL, A_info_end_of_node,
+ 'f', NUL, A_info_xref_item,
+ 'g', NUL, A_info_goto_node,
+ 'G', NUL, A_info_menu_sequence,
+ 'h', NUL, A_info_get_info_help_node,
+ 'i', NUL, A_info_index_search,
+ 'l', NUL, A_info_history_node,
+ 'm', NUL, A_info_menu_item,
+ 'n', NUL, A_info_next_node,
+ 'O', NUL, A_info_goto_invocation_node,
+ 'p', NUL, A_info_prev_node,
+ 'q', NUL, A_info_quit,
+ 'r', NUL, A_info_xref_item,
+ 's', NUL, A_info_search,
+ 'S', NUL, A_info_search_case_sensitively,
+ 't', NUL, A_info_top_node,
+ 'u', NUL, A_info_up_node,
+ DEL, NUL, A_info_scroll_backward,
+ ESC, '0', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '1', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '2', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '3', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '4', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '5', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '6', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '7', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '8', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '9', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '-', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, CONTROL('f'), NUL, A_info_show_footnotes,
+ ESC, CONTROL('g'), NUL, A_info_abort_key,
+ ESC, TAB, NUL, A_info_move_to_prev_xref,
+ ESC, CONTROL('v'), NUL, A_info_scroll_other_window,
+ ESC, '<', NUL, A_info_beginning_of_node,
+ ESC, '>', NUL, A_info_end_of_node,
+ ESC, 'b', NUL, A_info_backward_word,
+ ESC, 'f', NUL, A_info_forward_word,
+ ESC, 'r', NUL, A_info_move_to_window_line,
+ ESC, 'v', NUL, A_info_scroll_backward_page_only,
+ Meta('0'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('1'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('2'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('3'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('4'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('5'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('6'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('7'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('8'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('9'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('-'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta(CONTROL('f')), NUL, A_info_show_footnotes,
+ Meta(CONTROL('g')), NUL, A_info_abort_key,
+ Meta(TAB), NUL, A_info_move_to_prev_xref,
+ Meta(CONTROL('v')), NUL, A_info_scroll_other_window,
+ Meta('<'), NUL, A_info_beginning_of_node,
+ Meta('>'), NUL, A_info_end_of_node,
+ Meta('b'), NUL, A_info_backward_word,
+ Meta('f'), NUL, A_info_forward_word,
+ Meta('r'), NUL, A_info_move_to_window_line,
+ Meta('v'), NUL, A_info_scroll_backward_page_only,
+#if defined (NAMED_FUNCTIONS)
+ ESC, 'x', NUL, A_info_execute_command,
+ Meta('x'), NUL, A_info_execute_command,
+#endif /* NAMED_FUNCTIONS */
+
+ CONTROL('x'), CONTROL('b'), NUL, A_list_visited_nodes,
+ CONTROL('x'), CONTROL('c'), NUL, A_info_quit,
+ CONTROL('x'), CONTROL('f'), NUL, A_info_view_file,
+ CONTROL('x'), CONTROL('g'), NUL, A_info_abort_key,
+ CONTROL('x'), CONTROL('v'), NUL, A_info_view_file,
+ CONTROL('x'), '0', NUL, A_info_delete_window,
+ CONTROL('x'), '1', NUL, A_info_keep_one_window,
+ CONTROL('x'), '2', NUL, A_info_split_window,
+ CONTROL('x'), '^', NUL, A_info_grow_window,
+ CONTROL('x'), 'b', NUL, A_select_visited_node,
+ CONTROL('x'), 'k', NUL, A_info_kill_node,
+ CONTROL('x'), 'n', NUL, A_info_search_next,
+ CONTROL('x'), 'N', NUL, A_info_search_previous,
+ CONTROL('x'), 'o', NUL, A_info_next_window,
+ CONTROL('x'), 't', NUL, A_info_tile_windows,
+ CONTROL('x'), 'w', NUL, A_info_toggle_wrap,
+
+/* Arrow key bindings for info keymaps. It seems that some
+ terminals do not match their termcap entries, so it's best to just
+ define everything with both of the usual prefixes. */
+
+ SK_ESCAPE, SK_PAGE_UP, NUL, A_info_scroll_backward_page_only,
+ SK_ESCAPE, SK_PAGE_DOWN, NUL, A_info_scroll_forward_page_only,
+ SK_ESCAPE, SK_UP_ARROW, NUL, A_info_prev_line,
+ '\033', 'O', 'A', NUL, A_info_prev_line,
+ '\033', '[', 'A', NUL, A_info_prev_line,
+ SK_ESCAPE, SK_DOWN_ARROW, NUL, A_info_next_line,
+ '\033', 'O', 'B', NUL, A_info_next_line,
+ '\033', '[', 'B', NUL, A_info_next_line,
+ SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_info_forward_char,
+ '\033', 'O', 'C', NUL, A_info_forward_char,
+ '\033', '[', 'C', NUL, A_info_forward_char,
+ SK_ESCAPE, SK_LEFT_ARROW, NUL, A_info_backward_char,
+ '\033', 'O', 'D', NUL, A_info_backward_char,
+ '\033', '[', 'D', NUL, A_info_backward_char,
+ SK_ESCAPE, SK_HOME, NUL, A_info_beginning_of_node,
+ SK_ESCAPE, SK_END, NUL, A_info_end_of_node,
+ SK_ESCAPE, SK_DELETE, NUL, A_info_scroll_backward,
+
+ ESC, SK_ESCAPE, SK_PAGE_UP, NUL, A_info_scroll_other_window_backward,
+ ESC, SK_ESCAPE, SK_PAGE_DOWN, NUL, A_info_scroll_other_window,
+ ESC, SK_ESCAPE, SK_UP_ARROW, NUL, A_info_prev_line,
+ ESC, '\033', 'O', 'A', NUL, A_info_prev_line,
+ ESC, '\033', '[', 'A', NUL, A_info_prev_line,
+ ESC, SK_ESCAPE, SK_DOWN_ARROW, NUL, A_info_next_line,
+ ESC, '\033', 'O', 'B', NUL, A_info_next_line,
+ ESC, '\033', '[', 'B', NUL, A_info_next_line,
+ ESC, SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_info_forward_word,
+ ESC, '\033', 'O', 'C', NUL, A_info_forward_word,
+ ESC, '\033', '[', 'C', NUL, A_info_forward_word,
+ ESC, SK_ESCAPE, SK_LEFT_ARROW, NUL, A_info_backward_word,
+ ESC, '\033', 'O', 'D', NUL, A_info_backward_word,
+ ESC, '\033', '[', 'D', NUL, A_info_backward_word,
+};
+
+static unsigned char default_emacs_like_ea_keys[] =
+{
+ 0, /* suppress-default-keybindings flag */
+ ESC, '0', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '1', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '2', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '3', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '4', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '5', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '6', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '7', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '8', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '9', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '-', NUL, A_info_add_digit_to_numeric_arg,
+ Meta('0'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('1'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('2'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('3'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('4'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('5'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('6'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('7'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('8'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('9'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('-'), NUL, A_info_add_digit_to_numeric_arg,
+ ESC, CONTROL('g'), NUL, A_ea_abort,
+ ESC, CONTROL('v'), NUL, A_ea_scroll_completions_window,
+ ESC, 'b', NUL, A_ea_backward_word,
+ ESC, 'd', NUL, A_ea_kill_word,
+ ESC, 'f', NUL, A_ea_forward_word,
+ ESC, 'y', NUL, A_ea_yank_pop,
+ ESC, '?', NUL, A_ea_possible_completions,
+ ESC, TAB, NUL, A_ea_tab_insert,
+ ESC, DEL, NUL, A_ea_backward_kill_word,
+ Meta(CONTROL('g')), NUL, A_ea_abort,
+ Meta(CONTROL('v')), NUL, A_ea_scroll_completions_window,
+ Meta('b'), NUL, A_ea_backward_word,
+ Meta('d'), NUL, A_ea_kill_word,
+ Meta('f'), NUL, A_ea_forward_word,
+ Meta('y'), NUL, A_ea_yank_pop,
+ Meta('?'), NUL, A_ea_possible_completions,
+ Meta(TAB), NUL, A_ea_tab_insert,
+ Meta(DEL), NUL, A_ea_backward_kill_word,
+ CONTROL('a'), NUL, A_ea_beg_of_line,
+ CONTROL('b'), NUL, A_ea_backward,
+ CONTROL('d'), NUL, A_ea_delete,
+ CONTROL('e'), NUL, A_ea_end_of_line,
+ CONTROL('f'), NUL, A_ea_forward,
+ CONTROL('g'), NUL, A_ea_abort,
+ CONTROL('h'), NUL, A_ea_rubout,
+/* CONTROL('k') */
+ SK_ESCAPE, SK_LITERAL, NUL, A_ea_kill_line,
+ CONTROL('l'), NUL, A_info_redraw_display,
+ CONTROL('q'), NUL, A_ea_quoted_insert,
+ CONTROL('t'), NUL, A_ea_transpose_chars,
+ CONTROL('u'), NUL, A_info_universal_argument,
+ CONTROL('y'), NUL, A_ea_yank,
+ LFD, NUL, A_ea_newline,
+ RET, NUL, A_ea_newline,
+ SPC, NUL, A_ea_complete,
+ TAB, NUL, A_ea_complete,
+ '?', NUL, A_ea_possible_completions,
+#ifdef __MSDOS__
+ /* PC users will lynch me if I don't give them their usual DEL
+ effect... */
+ DEL, NUL, A_ea_delete,
+#else
+ DEL, NUL, A_ea_rubout,
+#endif
+#if defined (NAMED_FUNCTIONS)
+ /* ESC, 'x', NUL, A_info_execute_command, */
+ /* Meta('x'), NUL, A_info_execute_command, */
+#endif /* NAMED_FUNCTIONS */
+ CONTROL('x'), 'o', NUL, A_info_next_window,
+ CONTROL('x'), DEL, NUL, A_ea_backward_kill_line,
+
+/* Arrow key bindings for echo area keymaps. It seems that some
+ terminals do not match their termcap entries, so it's best to just
+ define everything with both of the usual prefixes. */
+
+ SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_ea_forward,
+ '\033', 'O', 'C', NUL, A_ea_forward,
+ '\033', '[', 'C', NUL, A_ea_forward,
+ SK_ESCAPE, SK_LEFT_ARROW, NUL, A_ea_backward,
+ '\033', 'O', 'D', NUL, A_ea_backward,
+ '\033', '[', 'D', NUL, A_ea_backward,
+ ESC, SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_ea_forward_word,
+ ESC, '\033', 'O', 'C', NUL, A_ea_forward_word,
+ ESC, '\033', '[', 'C', NUL, A_ea_forward_word,
+ ESC, SK_ESCAPE, SK_LEFT_ARROW, NUL, A_ea_backward_word,
+ ESC, '\033', 'O', 'D', NUL, A_ea_backward_word,
+ ESC, '\033', '[', 'D', NUL, A_ea_backward_word,
+#ifdef __MSDOS__
+ SK_ESCAPE, SK_DELETE, NUL, A_ea_delete,
+#else
+ SK_ESCAPE, SK_DELETE, NUL, A_ea_rubout,
+#endif
+ SK_ESCAPE, SK_HOME, NUL, A_ea_beg_of_line,
+ SK_ESCAPE, SK_END, NUL, A_ea_end_of_line,
+ ESC, SK_ESCAPE, SK_DELETE, NUL, A_ea_backward_kill_word,
+ CONTROL('x'), SK_ESCAPE, SK_DELETE, NUL,A_ea_backward_kill_line,
+};
+
+static unsigned char default_vi_like_info_keys[] =
+{
+ 0, /* suppress-default-keybindings flag */
+ '0', NUL, A_info_add_digit_to_numeric_arg,
+ '1', NUL, A_info_add_digit_to_numeric_arg,
+ '2', NUL, A_info_add_digit_to_numeric_arg,
+ '3', NUL, A_info_add_digit_to_numeric_arg,
+ '4', NUL, A_info_add_digit_to_numeric_arg,
+ '5', NUL, A_info_add_digit_to_numeric_arg,
+ '6', NUL, A_info_add_digit_to_numeric_arg,
+ '7', NUL, A_info_add_digit_to_numeric_arg,
+ '8', NUL, A_info_add_digit_to_numeric_arg,
+ '9', NUL, A_info_add_digit_to_numeric_arg,
+ '-', NUL, A_info_add_digit_to_numeric_arg,
+ TAB, NUL, A_info_move_to_next_xref,
+ LFD, NUL, A_info_down_line,
+ RET, NUL, A_info_down_line,
+ SPC, NUL, A_info_scroll_forward,
+ CONTROL('a'), NUL, A_info_beginning_of_line,
+ CONTROL('b'), NUL, A_info_scroll_backward_page_only,
+ CONTROL('d'), NUL, A_info_scroll_half_screen_down,
+ CONTROL('e'), NUL, A_info_down_line,
+ CONTROL('f'), NUL, A_info_scroll_forward_page_only,
+ CONTROL('g'), NUL, A_info_abort_key,
+ CONTROL('k'), NUL, A_info_up_line,
+ CONTROL('l'), NUL, A_info_redraw_display,
+ CONTROL('n'), NUL, A_info_down_line,
+ CONTROL('p'), NUL, A_info_up_line,
+ CONTROL('r'), NUL, A_info_redraw_display,
+ CONTROL('s'), NUL, A_isearch_forward,
+ CONTROL('u'), NUL, A_info_scroll_half_screen_up,
+ CONTROL('v'), NUL, A_info_scroll_forward_page_only,
+ CONTROL('y'), NUL, A_info_up_line,
+ ',', NUL, A_info_next_index_match,
+ '/', NUL, A_info_search,
+ ESC, '0', NUL, A_info_last_menu_item,
+ ESC, '1', NUL, A_info_menu_digit,
+ ESC, '2', NUL, A_info_menu_digit,
+ ESC, '3', NUL, A_info_menu_digit,
+ ESC, '4', NUL, A_info_menu_digit,
+ ESC, '5', NUL, A_info_menu_digit,
+ ESC, '6', NUL, A_info_menu_digit,
+ ESC, '7', NUL, A_info_menu_digit,
+ ESC, '8', NUL, A_info_menu_digit,
+ ESC, '9', NUL, A_info_menu_digit,
+ Meta('0'), NUL, A_info_last_menu_item,
+ Meta('1'), NUL, A_info_menu_digit,
+ Meta('2'), NUL, A_info_menu_digit,
+ Meta('3'), NUL, A_info_menu_digit,
+ Meta('4'), NUL, A_info_menu_digit,
+ Meta('5'), NUL, A_info_menu_digit,
+ Meta('6'), NUL, A_info_menu_digit,
+ Meta('7'), NUL, A_info_menu_digit,
+ Meta('8'), NUL, A_info_menu_digit,
+ Meta('9'), NUL, A_info_menu_digit,
+ '<', NUL, A_info_first_node,
+ '>', NUL, A_info_last_node,
+ '?', NUL, A_info_search_backward,
+ '[', NUL, A_info_global_prev_node,
+ ']', NUL, A_info_global_next_node,
+ '\'', NUL, A_info_history_node,
+ 'b', NUL, A_info_scroll_backward,
+ 'd', NUL, A_info_scroll_half_screen_down,
+ 'e', NUL, A_info_down_line,
+ 'E', NUL, A_info_view_file,
+ ':', 'e', NUL, A_info_view_file,
+ 'f', NUL, A_info_scroll_forward_page_only,
+ 'F', NUL, A_info_scroll_forward_page_only,
+ 'g', NUL, A_info_first_node,
+ 'G', NUL, A_info_last_node,
+ 'h', NUL, A_info_get_help_window,
+ 'H', NUL, A_info_get_help_window,
+ 'i', NUL, A_info_index_search,
+ 'I', NUL, A_info_goto_invocation_node,
+ 'j', NUL, A_info_next_line,
+ 'k', NUL, A_info_prev_line,
+ 'l', NUL, A_info_history_node,
+ 'm', NUL, A_info_menu_item,
+ 'n', NUL, A_info_search_next,
+ 'N', NUL, A_info_search_previous,
+ 'O', NUL, A_info_goto_invocation_node,
+ 'p', NUL, A_info_prev_node,
+ 'q', NUL, A_info_quit,
+ 'Q', NUL, A_info_quit,
+ ':', 'q', NUL, A_info_quit,
+ ':', 'Q', NUL, A_info_quit,
+ 'Z', 'Z', NUL, A_info_quit,
+ 'r', NUL, A_info_redraw_display,
+ 'R', NUL, A_info_redraw_display,
+ 's', NUL, A_info_search,
+ 'S', NUL, A_info_search_case_sensitively,
+ 't', NUL, A_info_top_node,
+ 'u', NUL, A_info_scroll_half_screen_up,
+ 'w', NUL, A_info_scroll_backward_page_only_set_window,
+ 'y', NUL, A_info_up_line,
+ 'z', NUL, A_info_scroll_forward_page_only_set_window,
+ DEL, NUL, A_info_scroll_backward,
+ ESC, CONTROL('f'), NUL, A_info_show_footnotes,
+ ESC, CONTROL('g'), NUL, A_info_abort_key,
+ ESC, TAB, NUL, A_info_move_to_prev_xref,
+ ESC, SPC, NUL, A_info_scroll_forward_page_only,
+ ESC, CONTROL('v'), NUL, A_info_scroll_other_window,
+ ESC, '<', NUL, A_info_beginning_of_node,
+ ESC, '>', NUL, A_info_end_of_node,
+ ESC, '/', NUL, A_info_search,
+ ESC, '?', NUL, A_info_search_backward,
+ ESC, 'b', NUL, A_info_beginning_of_node,
+ ESC, 'd', NUL, A_info_dir_node,
+ ESC, 'e', NUL, A_info_end_of_node,
+ ESC, 'f', NUL, A_info_xref_item,
+ ESC, 'g', NUL, A_info_select_reference_this_line,
+ ESC, 'h', NUL, A_info_get_info_help_node,
+ ESC, 'm', NUL, A_info_menu_item,
+ ESC, 'n', NUL, A_info_search,
+ ESC, 'N', NUL, A_info_search_backward,
+ ESC, 'r', NUL, A_isearch_backward,
+ ESC, 's', NUL, A_isearch_forward,
+ ESC, 't', NUL, A_info_top_node,
+ ESC, 'v', NUL, A_info_scroll_backward_page_only,
+#if defined (NAMED_FUNCTIONS)
+ ESC, 'x', NUL, A_info_execute_command,
+ Meta('x'), NUL, A_info_execute_command,
+#endif /* NAMED_FUNCTIONS */
+ ESC, DEL, NUL, A_info_scroll_other_window_backward,
+ CONTROL('x'), CONTROL('b'), NUL, A_list_visited_nodes,
+ CONTROL('x'), CONTROL('c'), NUL, A_info_quit,
+ CONTROL('x'), CONTROL('f'), NUL, A_info_view_file,
+ CONTROL('x'), CONTROL('g'), NUL, A_info_abort_key,
+ CONTROL('x'), CONTROL('v'), NUL, A_info_view_file,
+ CONTROL('x'), LFD, NUL, A_info_select_reference_this_line,
+ CONTROL('x'), RET, NUL, A_info_select_reference_this_line,
+ CONTROL('x'), '0', NUL, A_info_delete_window,
+ CONTROL('x'), '1', NUL, A_info_keep_one_window,
+ CONTROL('x'), '2', NUL, A_info_split_window,
+ CONTROL('x'), '^', NUL, A_info_grow_window,
+ CONTROL('x'), 'b', NUL, A_select_visited_node,
+ CONTROL('x'), 'g', NUL, A_info_goto_node,
+ CONTROL('x'), 'i', NUL, A_info_index_search,
+ CONTROL('x'), 'I', NUL, A_info_goto_invocation_node,
+ CONTROL('x'), 'k', NUL, A_info_kill_node,
+ CONTROL('x'), 'n', NUL, A_info_next_node,
+ CONTROL('x'), 'o', NUL, A_info_next_window,
+ CONTROL('x'), 'O', NUL, A_info_goto_invocation_node,
+ CONTROL('x'), 'p', NUL, A_info_prev_node,
+ CONTROL('x'), 'r', NUL, A_info_xref_item,
+ CONTROL('x'), 't', NUL, A_info_tile_windows,
+ CONTROL('x'), 'u', NUL, A_info_up_node,
+ CONTROL('x'), 'w', NUL, A_info_toggle_wrap,
+ CONTROL('x'), ',', NUL, A_info_next_index_match,
+
+/* Arrow key bindings for info keymaps. It seems that some
+ terminals do not match their termcap entries, so it's best to just
+ define everything with both of the usual prefixes. */
+
+ SK_ESCAPE, SK_PAGE_UP, NUL, A_info_scroll_backward_page_only,
+ SK_ESCAPE, SK_PAGE_DOWN, NUL, A_info_scroll_forward_page_only,
+ SK_ESCAPE, SK_UP_ARROW, NUL, A_info_up_line,
+ '\033', 'O', 'A', NUL, A_info_up_line,
+ '\033', '[', 'A', NUL, A_info_up_line,
+ SK_ESCAPE, SK_DOWN_ARROW, NUL, A_info_down_line,
+ '\033', 'O', 'B', NUL, A_info_down_line,
+ '\033', '[', 'B', NUL, A_info_down_line,
+ SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_info_scroll_forward_page_only,
+ '\033', 'O', 'C', NUL, A_info_scroll_forward_page_only,
+ '\033', '[', 'C', NUL, A_info_scroll_forward_page_only,
+ SK_ESCAPE, SK_LEFT_ARROW, NUL, A_info_scroll_backward_page_only,
+ '\033', 'O', 'D', NUL, A_info_scroll_backward_page_only,
+ '\033', '[', 'D', NUL, A_info_scroll_backward_page_only,
+ SK_ESCAPE, SK_HOME, NUL, A_info_beginning_of_node,
+ SK_ESCAPE, SK_END, NUL, A_info_end_of_node,
+ ESC, SK_ESCAPE, SK_PAGE_DOWN, NUL, A_info_scroll_other_window,
+ ESC, SK_ESCAPE, SK_PAGE_UP, NUL, A_info_scroll_other_window_backward,
+ ESC, SK_ESCAPE, SK_DELETE, NUL, A_info_scroll_other_window_backward,
+ ESC, SK_ESCAPE, SK_UP_ARROW, NUL, A_info_prev_node,
+ ESC, '\033', 'O', 'A', NUL, A_info_prev_node,
+ ESC, '\033', '[', 'A', NUL, A_info_prev_node,
+ ESC, SK_ESCAPE, SK_DOWN_ARROW, NUL, A_info_next_node,
+ ESC, '\033', 'O', 'B', NUL, A_info_next_node,
+ ESC, '\033', '[', 'B', NUL, A_info_next_node,
+ ESC, SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_info_xref_item,
+ ESC, '\033', 'O', 'C', NUL, A_info_xref_item,
+ ESC, '\033', '[', 'C', NUL, A_info_xref_item,
+ ESC, SK_ESCAPE, SK_LEFT_ARROW, NUL, A_info_beginning_of_node,
+ ESC, '\033', 'O', 'D', NUL, A_info_beginning_of_node,
+ ESC, '\033', '[', 'D', NUL, A_info_beginning_of_node,
+ CONTROL('x'), SK_ESCAPE, SK_DELETE, NUL,A_ea_backward_kill_line,
+};
+
+static unsigned char default_vi_like_ea_keys[] =
+{
+ 0, /* suppress-default-keybindings flag */
+ ESC, '1', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '2', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '3', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '4', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '5', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '6', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '7', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '8', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '9', NUL, A_info_add_digit_to_numeric_arg,
+ ESC, '-', NUL, A_info_add_digit_to_numeric_arg,
+ Meta('1'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('2'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('3'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('4'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('5'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('6'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('7'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('8'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('9'), NUL, A_info_add_digit_to_numeric_arg,
+ Meta('-'), NUL, A_info_add_digit_to_numeric_arg,
+ ESC, CONTROL('g'), NUL, A_ea_abort,
+ ESC, CONTROL('h'), NUL, A_ea_backward_kill_word,
+ ESC, CONTROL('v'), NUL, A_ea_scroll_completions_window,
+ ESC, '0', NUL, A_ea_beg_of_line,
+ ESC, '$', NUL, A_ea_end_of_line,
+ ESC, 'b', NUL, A_ea_backward_word,
+ ESC, 'd', NUL, A_ea_kill_word,
+ ESC, 'f', NUL, A_ea_forward_word,
+ ESC, 'h', NUL, A_ea_forward,
+ ESC, 'l', NUL, A_ea_backward,
+ ESC, 'w', NUL, A_ea_forward_word,
+ ESC, 'x', NUL, A_ea_delete,
+ ESC, 'X', NUL, A_ea_kill_word,
+ ESC, 'y', NUL, A_ea_yank_pop,
+ ESC, '?', NUL, A_ea_possible_completions,
+ ESC, TAB, NUL, A_ea_tab_insert,
+ ESC, DEL, NUL, A_ea_kill_word,
+ Meta(CONTROL('g')), NUL, A_ea_abort,
+ Meta(CONTROL('h')), NUL, A_ea_backward_kill_word,
+ Meta(CONTROL('v')), NUL, A_ea_scroll_completions_window,
+ Meta('0'), NUL, A_ea_beg_of_line,
+ Meta('$'), NUL, A_ea_end_of_line,
+ Meta('b'), NUL, A_ea_backward_word,
+ Meta('d'), NUL, A_ea_kill_word,
+ Meta('f'), NUL, A_ea_forward_word,
+ Meta('h'), NUL, A_ea_forward,
+ Meta('l'), NUL, A_ea_backward,
+ Meta('w'), NUL, A_ea_forward_word,
+ Meta('x'), NUL, A_ea_delete,
+ Meta('X'), NUL, A_ea_kill_word,
+ Meta('y'), NUL, A_ea_yank_pop,
+ Meta('?'), NUL, A_ea_possible_completions,
+ Meta(TAB), NUL, A_ea_tab_insert,
+ Meta(DEL), NUL, A_ea_kill_word,
+ CONTROL('a'), NUL, A_ea_beg_of_line,
+ CONTROL('b'), NUL, A_ea_backward,
+ CONTROL('d'), NUL, A_ea_delete,
+ CONTROL('e'), NUL, A_ea_end_of_line,
+ CONTROL('f'), NUL, A_ea_forward,
+ CONTROL('g'), NUL, A_ea_abort,
+ CONTROL('h'), NUL, A_ea_rubout,
+/* CONTROL('k') */
+ SK_ESCAPE, SK_LITERAL, NUL, A_ea_kill_line,
+ CONTROL('l'), NUL, A_info_redraw_display,
+ CONTROL('q'), NUL, A_ea_quoted_insert,
+ CONTROL('t'), NUL, A_ea_transpose_chars,
+ CONTROL('u'), NUL, A_ea_abort,
+ CONTROL('v'), NUL, A_ea_quoted_insert,
+ CONTROL('y'), NUL, A_ea_yank,
+ LFD, NUL, A_ea_newline,
+ RET, NUL, A_ea_newline,
+ SPC, NUL, A_ea_complete,
+ TAB, NUL, A_ea_complete,
+ '?', NUL, A_ea_possible_completions,
+#ifdef __MSDOS__
+ /* PC users will lynch me if I don't give them their usual DEL
+ effect... */
+ DEL, NUL, A_ea_delete,
+#else
+ DEL, NUL, A_ea_rubout,
+#endif
+ CONTROL('x'), 'o', NUL, A_info_next_window,
+ CONTROL('x'), DEL, NUL, A_ea_backward_kill_line,
+
+ /* Arrow key bindings for echo area keymaps. It seems that some
+ terminals do not match their termcap entries, so it's best to just
+ define everything with both of the usual prefixes. */
+
+ SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_ea_forward,
+ '\033', 'O', 'C', NUL, A_ea_forward,
+ '\033', '[', 'C', NUL, A_ea_forward,
+ SK_ESCAPE, SK_LEFT_ARROW, NUL, A_ea_backward,
+ '\033', 'O', 'D', NUL, A_ea_backward,
+ '\033', '[', 'D', NUL, A_ea_backward,
+ SK_ESCAPE, SK_HOME, NUL, A_ea_beg_of_line,
+ SK_ESCAPE, SK_END, NUL, A_ea_end_of_line,
+#ifdef __MSDOS__
+ SK_ESCAPE, SK_DELETE, NUL, A_ea_delete,
+#else
+ SK_DELETE, SK_DELETE, NUL, A_ea_rubout,
+#endif
+ ESC, SK_ESCAPE, SK_RIGHT_ARROW, NUL, A_ea_forward_word,
+ ESC, '\033', 'O', 'C', NUL, A_ea_forward_word,
+ ESC, '\033', '[', 'C', NUL, A_ea_forward_word,
+ ESC, SK_ESCAPE, SK_LEFT_ARROW, NUL, A_ea_backward_word,
+ ESC, '\033', 'O', 'D', NUL, A_ea_backward_word,
+ ESC, '\033', '[', 'D', NUL, A_ea_backward_word,
+ ESC, SK_ESCAPE, SK_DELETE, NUL, A_ea_kill_word,
+ CONTROL('x'), SK_ESCAPE, SK_DELETE, NUL,A_ea_backward_kill_line,
+};
+
+static unsigned char *user_info_keys;
+static unsigned int user_info_keys_len;
+static unsigned char *user_ea_keys;
+static unsigned int user_ea_keys_len;
+static unsigned char *user_vars;
+static unsigned int user_vars_len;
+
+/*
+ * Return the size of a file, or 0 if the size can't be determined.
+ */
+static unsigned long
+filesize(int f)
+{
+ long pos = lseek(f, 0L, SEEK_CUR);
+ long sz = -1L;
+ if (pos != -1L)
+ {
+ sz = lseek(f, 0L, SEEK_END);
+ lseek(f, pos, SEEK_SET);
+ }
+ return sz == -1L ? 0L : sz;
+}
+
+/* Get an integer from a infokey file.
+ Integers are stored as two bytes, low order first, in radix INFOKEY_RADIX.
+ */
+static int
+getint(unsigned char **sp)
+{
+ int n;
+
+ if ( !((*sp)[0] < INFOKEY_RADIX && (*sp)[1] < INFOKEY_RADIX) )
+ return -1;
+ n = (*sp)[0] + (*sp)[1] * INFOKEY_RADIX;
+ *sp += 2;
+ return n;
+}
+
+
+/* Fetch the contents of the standard infokey file "$HOME/.info". Return
+ true if ok, false if not. */
+static int
+fetch_user_maps(void)
+{
+ char *filename = NULL;
+ char *homedir;
+ int f;
+ unsigned char *buf;
+ unsigned long len;
+ long nread;
+ unsigned char *p;
+ int n;
+
+ /* Find and open file. */
+ if ((filename = getenv("INFOKEY")) != NULL)
+ filename = xstrdup(filename);
+ else if ((homedir = getenv("HOME")) != NULL)
+ {
+ filename = xmalloc(strlen(homedir) + 2 + strlen(INFOKEY_FILE));
+ strcpy(filename, homedir);
+ strcat(filename, "/");
+ strcat(filename, INFOKEY_FILE);
+ }
+#ifdef __MSDOS__
+ /* Poor baby, she doesn't have a HOME... */
+ else
+ filename = xstrdup(INFOKEY_FILE); /* try current directory */
+#endif
+ if (filename == NULL || (f = open(filename, O_RDONLY)) == (-1))
+ {
+ if (filename && errno != ENOENT)
+ {
+ info_error(filesys_error_string(filename, errno),
+ NULL, NULL);
+ free(filename);
+ }
+ return 0;
+ }
+ SET_BINARY (f);
+
+ /* Ensure that the file is a reasonable size. */
+ len = filesize(f);
+ if (len < INFOKEY_NMAGIC + 2 || len > 100 * 1024)
+ {
+ /* Bad file (a valid file must have at least 9 chars, and
+ more than 100 KB is a problem). */
+ if (len < INFOKEY_NMAGIC + 2)
+ info_error((char *) _("Ignoring invalid infokey file `%s' - too small"),
+ filename, NULL);
+ else
+ info_error((char *) _("Ignoring invalid infokey file `%s' - too big"),
+ filename, NULL);
+ close(f);
+ free(filename);
+ return 0;
+ }
+
+ /* Read the file into a buffer. */
+ buf = (unsigned char *)xmalloc((int)len);
+ nread = read(f, buf, (unsigned int) len);
+ close(f);
+ if ((unsigned int) nread != len)
+ {
+ info_error((char *) _("Error reading infokey file `%s' - short read"),
+ filename, NULL);
+ free(buf);
+ free(filename);
+ return 0;
+ }
+
+ /* Check the header, trailer, and version of the file to increase
+ our confidence that the contents are valid. */
+ if ( buf[0] != INFOKEY_MAGIC_S0
+ || buf[1] != INFOKEY_MAGIC_S1
+ || buf[2] != INFOKEY_MAGIC_S2
+ || buf[3] != INFOKEY_MAGIC_S3
+ || buf[len - 4] != INFOKEY_MAGIC_E0
+ || buf[len - 3] != INFOKEY_MAGIC_E1
+ || buf[len - 2] != INFOKEY_MAGIC_E2
+ || buf[len - 1] != INFOKEY_MAGIC_E3
+ )
+ {
+ info_error((char *) _("Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"),
+ filename, NULL);
+ free(filename);
+ return 0;
+ }
+ if (len < INFOKEY_NMAGIC + strlen(VERSION) + 1
+ || strcmp(VERSION, (char *) (buf + 4)) != 0)
+ {
+ info_error
+ ((char *) _("Your infokey file `%s' is out of date -- run infokey to update it"),
+ filename, NULL);
+ free(filename);
+ return 0;
+ }
+
+ /* Extract the pieces. */
+ for (p = buf + 4 + strlen(VERSION) + 1;
+ (unsigned int) (p - buf) < len - 4;
+ p += n)
+ {
+ int s = *p++;
+
+ n = getint(&p);
+ if (n < 0 || (unsigned int) n > len - 4 - (p - buf))
+ {
+ info_error((char *) _("Invalid infokey file `%s' (bad section length) -- run infokey to update it"),
+ filename, NULL);
+ free(filename);
+ return 0;
+ }
+
+ switch (s)
+ {
+ case INFOKEY_SECTION_INFO:
+ user_info_keys = p;
+ user_info_keys_len = n;
+ break;
+ case INFOKEY_SECTION_EA:
+ user_ea_keys = p;
+ user_ea_keys_len = n;
+ break;
+ case INFOKEY_SECTION_VAR:
+ user_vars = p;
+ user_vars_len = n;
+ break;
+ default:
+ info_error((char *) _("Invalid infokey file `%s' (bad section code) -- run infokey to update it"),
+ filename, NULL);
+ free(filename);
+ return 0;
+ }
+ }
+
+ free(filename);
+ return 1;
+}
+
+/* Decode special key sequences from the infokey file. Return zero
+ if the key sequence includes special keys which the terminal
+ doesn't define.
+ */
+static int
+decode_keys(unsigned char *src, unsigned int slen,
+ unsigned char *dst, unsigned int dlen)
+{
+ unsigned char *s = src;
+ unsigned char *d = dst;
+
+#define To_dst(c) do { \
+ if ((unsigned int) (d - dst) < dlen) *d++ = (c); \
+} while (0)
+
+ while ((unsigned int) (s - src) < slen)
+ {
+ unsigned char c = ISMETA(*s) ? UNMETA(*s) : *s;
+
+ if (c == SK_ESCAPE)
+ {
+ char *t;
+ static char lit[] = { SK_ESCAPE, NUL };
+
+ switch ((unsigned int) (s + 1 - src) < slen ? s[1] : '\0')
+ {
+ case SK_RIGHT_ARROW: t = term_kr; break;
+ case SK_LEFT_ARROW: t = term_kl; break;
+ case SK_UP_ARROW: t = term_ku; break;
+ case SK_DOWN_ARROW: t = term_kd; break;
+ case SK_PAGE_UP: t = term_kP; break;
+ case SK_PAGE_DOWN: t = term_kN; break;
+ case SK_HOME: t = term_kh; break;
+ case SK_END: t = term_ke; break;
+ case SK_DELETE: t = term_kx; break;
+ case SK_INSERT: t = term_ki; break;
+ case SK_LITERAL:
+ default: t = lit; break;
+ }
+ if (t == NULL)
+ return 0;
+ while (*t)
+ To_dst(ISMETA(*s) ? Meta(*t++) : *t++);
+ s += 2;
+ }
+ else
+ {
+ if (ISMETA(*s))
+ To_dst(Meta(*s++));
+ else
+ To_dst(*s++);
+ }
+ }
+
+ To_dst('\0');
+
+ return 1;
+
+#undef To_dst
+
+}
+
+/* Convert an infokey file section to keymap bindings. Return false if
+ the default bindings are to be suppressed. */
+static int
+section_to_keymaps(Keymap map, unsigned char *table, unsigned int len)
+{
+ int stop;
+ unsigned char *p;
+ unsigned char *seq = NULL;
+ unsigned int seqlen = 0;
+ enum { getseq, gotseq, getaction } state = getseq;
+
+ stop = len > 0 ? table[0] : 0;
+
+ for (p = table + 1; (unsigned int) (p - table) < len; p++)
+ {
+ switch (state)
+ {
+ case getseq:
+ if (*p)
+ {
+ seq = p;
+ state = gotseq;
+ }
+ break;
+
+ case gotseq:
+ if (!*p)
+ {
+ seqlen = p - seq;
+ state = getaction;
+ }
+ break;
+
+ case getaction:
+ {
+ unsigned int action = *p;
+ unsigned char keyseq[256];
+ KEYMAP_ENTRY ke;
+
+ state = getseq;
+ /* If decode_keys returns zero, it
+ means that seq includes keys which
+ the terminal doesn't support, like
+ PageDown. In that case, don't bind
+ the key sequence. */
+ if (decode_keys(seq, seqlen, keyseq,
+ sizeof keyseq))
+ {
+ keyseq[sizeof keyseq - 1] = '\0';
+ ke.type = ISFUNC;
+ ke.function =
+ action < A_NCOMMANDS
+ ? &function_doc_array[action]
+ : NULL;
+ keymap_bind_keyseq(map,
+ (const char *) keyseq, &ke);
+ }
+ }
+ break;
+ }
+ }
+ if (state != getseq)
+ info_error((char *) _("Bad data in infokey file -- some key bindings ignored"),
+ NULL, NULL);
+ return !stop;
+}
+
+/* Convert an infokey file section to variable settings.
+ */
+static void
+section_to_vars(unsigned char *table, unsigned int len)
+{
+ enum { getvar, gotvar, getval, gotval } state = getvar;
+ unsigned char *var = NULL;
+ unsigned char *val = NULL;
+ unsigned char *p;
+
+ for (p = table; (unsigned int) (p - table) < len; p++)
+ {
+ switch (state)
+ {
+ case getvar:
+ if (*p)
+ {
+ var = p;
+ state = gotvar;
+ }
+ break;
+
+ case gotvar:
+ if (!*p)
+ state = getval;
+ break;
+
+ case getval:
+ if (*p)
+ {
+ val = p;
+ state = gotval;
+ }
+ break;
+
+ case gotval:
+ if (!*p)
+ {
+ set_variable_to_value((char *) var, (char *) val);
+ state = getvar;
+ }
+ break;
+ }
+ }
+ if (state != getvar)
+ info_error((char *) _("Bad data in infokey file -- some var settings ignored"),
+ NULL, NULL);
+}
+
+void
+initialize_info_keymaps (void)
+{
+ int i;
+ int suppress_info_default_bindings = 0;
+ int suppress_ea_default_bindings = 0;
+
+ if (!info_keymap)
+ {
+ info_keymap = keymap_make_keymap ();
+ echo_area_keymap = keymap_make_keymap ();
+ }
+
+ /* Bind the echo area insert routines. */
+ for (i = 0; i < 256; i++)
+ if (isprint (i))
+ echo_area_keymap[i].function = InfoCmd(ea_insert);
+
+ /* Get user-defined keys and variables. */
+ if (fetch_user_maps())
+ {
+ if (user_info_keys_len && user_info_keys[0])
+ suppress_info_default_bindings = 1;
+ if (user_ea_keys_len && user_ea_keys[0])
+ suppress_ea_default_bindings = 1;
+ }
+
+ /* Apply the default bindings, unless the user says to suppress
+ them. */
+ if (vi_keys_p)
+ {
+ if (!suppress_info_default_bindings)
+ section_to_keymaps(info_keymap, default_vi_like_info_keys,
+ sizeof(default_vi_like_info_keys));
+ if (!suppress_ea_default_bindings)
+ section_to_keymaps(echo_area_keymap, default_vi_like_ea_keys,
+ sizeof(default_vi_like_ea_keys));
+ }
+ else
+ {
+ if (!suppress_info_default_bindings)
+ section_to_keymaps(info_keymap, default_emacs_like_info_keys,
+ sizeof(default_emacs_like_info_keys));
+ if (!suppress_ea_default_bindings)
+ section_to_keymaps(echo_area_keymap, default_emacs_like_ea_keys,
+ sizeof(default_emacs_like_ea_keys));
+ }
+
+ /* If the user specified custom bindings, apply them on top of the
+ default ones. */
+ if (user_info_keys_len)
+ section_to_keymaps(info_keymap, user_info_keys, user_info_keys_len);
+
+ if (user_ea_keys_len)
+ section_to_keymaps(echo_area_keymap, user_ea_keys, user_ea_keys_len);
+
+ if (user_vars_len)
+ section_to_vars(user_vars, user_vars_len);
+}
+
+#endif /* defined(INFOKEY) */
+/* vim: set sw=2 cino={1s>2sn-s^-se-s: */
diff --git a/Build/source/utils/texinfo/info/infomap.h b/Build/source/utils/texinfo/info/infomap.h
new file mode 100644
index 00000000000..31e4d8275f0
--- /dev/null
+++ b/Build/source/utils/texinfo/info/infomap.h
@@ -0,0 +1,82 @@
+/* infomap.h -- description of a keymap in Info and related functions.
+ $Id: infomap.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 2001, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFOMAP_H
+#define INFOMAP_H
+
+#include "info.h"
+
+#define ESC '\033'
+#define DEL '\177'
+#define TAB '\011'
+#define RET '\r'
+#define LFD '\n'
+#define SPC ' '
+
+#define meta_character_threshold (DEL + 1)
+#define control_character_threshold (SPC)
+
+#define meta_character_bit 0x80
+#define control_character_bit 0x40
+
+#define Meta_p(c) (((c) > meta_character_threshold))
+#define Control_p(c) ((c) < control_character_threshold)
+
+#define Meta(c) ((c) | (meta_character_bit))
+#define UnMeta(c) ((c) & (~meta_character_bit))
+#define Control(c) ((toupper (c)) & (~control_character_bit))
+#define UnControl(c) (tolower ((c) | control_character_bit))
+
+/* A keymap contains one entry for each key in the ASCII set.
+ Each entry consists of a type and a pointer.
+ FUNCTION is the address of a function to run, or the
+ address of a keymap to indirect through.
+ TYPE says which kind of thing FUNCTION is. */
+typedef struct keymap_entry
+{
+ char type;
+ InfoCommand *function;
+} KEYMAP_ENTRY;
+
+typedef KEYMAP_ENTRY *Keymap;
+
+/* The values that TYPE can have in a keymap entry. */
+#define ISFUNC 0
+#define ISKMAP 1
+
+extern Keymap info_keymap;
+extern Keymap echo_area_keymap;
+
+/* Return a new keymap which has all the uppercase letters mapped to run
+ the function info_do_lowercase_version (). */
+extern Keymap keymap_make_keymap (void);
+
+/* Return a new keymap which is a copy of MAP. */
+extern Keymap keymap_copy_keymap (Keymap map, Keymap rootmap,
+ Keymap newroot);
+
+/* Free MAP and it's descendents. */
+extern void keymap_discard_keymap (Keymap map, Keymap rootmap);
+
+/* Initialize the info keymaps. */
+extern void initialize_info_keymaps (void);
+
+#endif /* not INFOMAP_H */
diff --git a/Build/source/utils/texinfo/info/key.h b/Build/source/utils/texinfo/info/key.h
new file mode 100644
index 00000000000..35d2762211f
--- /dev/null
+++ b/Build/source/utils/texinfo/info/key.h
@@ -0,0 +1,35 @@
+/* key.h -- Structure associating function names with numeric codes. */
+
+/* This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Andrew Bettison <andrewb@zip.com.au> */
+
+#if !defined (KEY_H)
+#define KEY_H
+
+typedef struct {
+ char *name;
+ unsigned char code;
+}
+ FUNCTION_KEY;
+
+extern FUNCTION_KEY function_key_array[];
+
+#endif /* !KEY_H */
diff --git a/Build/source/utils/texinfo/info/m-x.c b/Build/source/utils/texinfo/info/m-x.c
new file mode 100644
index 00000000000..52365d1843e
--- /dev/null
+++ b/Build/source/utils/texinfo/info/m-x.c
@@ -0,0 +1,214 @@
+/* m-x.c -- Meta-x minibuffer reader.
+ $Id: m-x.c,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2001, 2002, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "funs.h"
+
+/* **************************************************************** */
+/* */
+/* Reading Named Commands */
+/* */
+/* **************************************************************** */
+
+/* Read the name of an Info function in the echo area and return the
+ name. A return value of NULL indicates that no function name could
+ be read. */
+char *
+read_function_name (char *prompt, WINDOW *window)
+{
+ register int i;
+ char *line;
+ REFERENCE **array = (REFERENCE **)NULL;
+ int array_index = 0, array_slots = 0;
+
+ /* Make an array of REFERENCE which actually contains the names of
+ the functions available in Info. */
+ for (i = 0; function_doc_array[i].func; i++)
+ {
+ REFERENCE *entry;
+
+ entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->label = xstrdup (function_doc_array[i].func_name);
+ entry->nodename = (char *)NULL;
+ entry->filename = (char *)NULL;
+
+ add_pointer_to_array
+ (entry, array_index, array, array_slots, 200, REFERENCE *);
+ }
+
+ line = info_read_completing_in_echo_area (window, prompt, array);
+
+ info_free_references (array);
+
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+
+ return (line);
+}
+
+DECLARE_INFO_COMMAND (describe_command,
+ _("Read the name of an Info command and describe it"))
+{
+ char *line;
+
+ line = read_function_name ((char *) _("Describe command: "), window);
+
+ if (!line)
+ {
+ info_abort_key (active_window, count, key);
+ return;
+ }
+
+ /* Describe the function named in "LINE". */
+ if (*line)
+ {
+ InfoCommand *cmd = named_function (line);
+
+ if (!cmd)
+ return;
+
+ window_message_in_echo_area ("%s: %s.",
+ line, function_documentation (cmd));
+ }
+ free (line);
+}
+
+DECLARE_INFO_COMMAND (info_execute_command,
+ _("Read a command name in the echo area and execute it"))
+{
+ char *line;
+ char *keys;
+ char *prompt;
+
+ prompt = (char *)xmalloc (20);
+
+ keys = where_is (info_keymap, InfoCmd(info_execute_command));
+ /* If the where_is () function thinks that this command doesn't exist,
+ there's something very wrong! */
+ if (!keys)
+ abort();
+
+ if (info_explicit_arg || count != 1)
+ sprintf (prompt, "%d %s ", count, keys);
+ else
+ sprintf (prompt, "%s ", keys);
+
+ /* Ask the completer to read a reference for us. */
+ line = read_function_name (prompt, window);
+
+ /* User aborted? */
+ if (!line)
+ {
+ info_abort_key (active_window, count, key);
+ return;
+ }
+
+ /* User accepted "default"? (There is none.) */
+ if (!*line)
+ {
+ free (line);
+ return;
+ }
+
+ /* User wants to execute a named command. Do it. */
+ {
+ InfoCommand *command;
+
+ if ((active_window != the_echo_area) &&
+ (strncmp (line, "echo-area-", 10) == 0))
+ {
+ free (line);
+ info_error ((char *) _("Cannot execute an `echo-area' command here."),
+ NULL, NULL);
+ return;
+ }
+
+ command = named_function (line);
+ free (line);
+
+ if (!command)
+ return;
+
+ if (InfoFunction(command))
+ (*InfoFunction(command)) (active_window, count, 0);
+ else
+ info_error ((char *) _("Undefined command: %s"), line, NULL);
+ }
+}
+
+/* Okay, now that we have M-x, let the user set the screen height. */
+DECLARE_INFO_COMMAND (set_screen_height,
+ _("Set the height of the displayed window"))
+{
+ int new_height, old_height = screenheight;
+
+ if (info_explicit_arg || count != 1)
+ new_height = count;
+ else
+ {
+ char prompt[80];
+ char *line;
+
+ new_height = screenheight;
+
+ sprintf (prompt, _("Set screen height to (%d): "), new_height);
+
+ line = info_read_in_echo_area (window, prompt);
+
+ /* If the user aborted, do that now. */
+ if (!line)
+ {
+ info_abort_key (active_window, count, 0);
+ return;
+ }
+
+ /* Find out what the new height is supposed to be. */
+ if (*line)
+ new_height = atoi (line);
+
+ /* Clear the echo area if it isn't active. */
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+
+ free (line);
+ }
+
+ terminal_clear_screen ();
+ display_clear_display (the_display);
+ screenheight = new_height;
+#ifdef SET_SCREEN_SIZE_HELPER
+ SET_SCREEN_SIZE_HELPER;
+#endif
+ if (screenheight == old_height)
+ {
+ /* Display dimensions didn't actually change, so
+ window_new_screen_size won't do anything, but we've
+ already cleared the display above. Undo the damage. */
+ window_mark_chain (windows, W_UpdateWindow);
+ display_update_display (windows);
+ }
+ else
+ {
+ display_initialize_display (screenwidth, screenheight);
+ window_new_screen_size (screenwidth, screenheight);
+ }
+}
diff --git a/Build/source/utils/texinfo/info/makedoc.c b/Build/source/utils/texinfo/info/makedoc.c
new file mode 100644
index 00000000000..41b1beb9679
--- /dev/null
+++ b/Build/source/utils/texinfo/info/makedoc.c
@@ -0,0 +1,578 @@
+/* makedoc.c -- make doc.c and funs.h from input files.
+ $Id: makedoc.c,v 1.4 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 1999, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+/* This program grovels the contents of the source files passed as arguments
+ and writes out a file of function pointers and documentation strings, and
+ a header file which describes the contents. This only does the functions
+ declared with DECLARE_INFO_COMMAND. */
+
+#include "info.h"
+#include "infokey.h"
+
+static void fatal_file_error (char *filename);
+
+/* Name of the header file which receives the declarations of functions. */
+static char *funs_filename = "funs.h";
+
+/* Name of the documentation to function pointer file. */
+static char *doc_filename = "doc.c";
+static char *key_filename = "key.c";
+
+static char *doc_header[] = {
+ "/* doc.c -- Generated structure containing function names and doc strings.",
+ "",
+ " This file was automatically made from various source files with the",
+ " command `%s'. DO NOT EDIT THIS FILE, only `%s.c'.",
+ (char *)NULL
+};
+
+static char *doc_header_1[] = {
+ " An entry in the array FUNCTION_DOC_ARRAY is made for each command",
+ " found in the above files; each entry consists of a function pointer,",
+#if defined (NAMED_FUNCTIONS)
+ " a string which is the user-visible name of the function,",
+#endif /* NAMED_FUNCTIONS */
+ " and a string which documents its purpose. */",
+ "",
+ "#include \"info.h\"",
+ "#include \"funs.h\"",
+ "",
+ "FUNCTION_DOC function_doc_array[] = {",
+ "",
+ (char *)NULL
+};
+
+static char *key_header[] = {
+ "/* key.c -- Generated array containing function names.",
+ "",
+ " This file was automatically made from various source files with the",
+ " command \"%s\". DO NOT EDIT THIS FILE, only \"%s.c\".",
+ "",
+ (char *)NULL
+};
+
+static char *key_header_1[] = {
+ " An entry in the array FUNCTION_KEY_ARRAY is made for each command",
+ " found in the above files; each entry consists of",
+ " a string which is the user-visible name of the function. */",
+ "",
+ "#include \"key.h\"",
+ "#include \"funs.h\"",
+ "",
+ "FUNCTION_KEY function_key_array[] = {",
+ "",
+ (char *)NULL
+};
+
+/* How to remember the locations of the functions found so that Emacs
+ can use the information in a tag table. */
+typedef struct {
+ char *name; /* Name of the tag. */
+ int line; /* Line number at which it appears. */
+ long char_offset; /* Character offset at which it appears. */
+} EMACS_TAG;
+
+typedef struct {
+ char *filename; /* Name of the file containing entries. */
+ long entrylen; /* Total number of characters in tag block. */
+ EMACS_TAG **entries; /* Entries found in FILENAME. */
+ int entries_index;
+ int entries_slots;
+} EMACS_TAG_BLOCK;
+
+EMACS_TAG_BLOCK **emacs_tags = (EMACS_TAG_BLOCK **)NULL;
+int emacs_tags_index = 0;
+int emacs_tags_slots = 0;
+
+#define DECLARATION_STRING "\nDECLARE_INFO_COMMAND"
+
+static void process_one_file (char *filename, FILE *doc_stream,
+ FILE *key_stream, FILE *funs_stream);
+static void maybe_dump_tags (FILE *stream);
+static FILE *must_fopen (char *filename, char *mode);
+static void init_func_key (unsigned int val);
+static unsigned int next_func_key (void);
+
+int
+main (int argc, char **argv)
+{
+ register int i;
+ int tags_only = 0;
+ FILE *funs_stream, *doc_stream;
+ FILE *key_stream;
+
+#if STRIP_DOT_EXE
+ {
+ char *dot = strrchr (argv[0], '.');
+
+ if (dot && FILENAME_CMP (dot, ".exe") == 0)
+ *dot = 0;
+ }
+#endif
+
+ for (i = 1; i < argc; i++)
+ if (strcmp (argv[i], "-tags") == 0)
+ {
+ tags_only++;
+ break;
+ }
+
+ if (tags_only)
+ {
+ funs_filename = NULL_DEVICE;
+ doc_filename = NULL_DEVICE;
+ key_filename = NULL_DEVICE;
+ }
+
+ funs_stream = must_fopen (funs_filename, "w");
+ doc_stream = must_fopen (doc_filename, "w");
+ key_stream = must_fopen (key_filename, "w");
+
+ fprintf (funs_stream,
+ "/* %s -- Generated declarations for Info commands. */\n\n\
+#include \"info.h\"\n",
+ funs_filename);
+
+ for (i = 0; doc_header[i]; i++)
+ {
+ fprintf (doc_stream, doc_header[i], argv[0], argv[0]);
+ fprintf (doc_stream, "\n");
+ }
+
+ fprintf (doc_stream,
+ _(" Source files groveled to make this file include:\n\n"));
+
+ for (i = 0; key_header[i]; i++)
+ {
+ fprintf (key_stream, key_header[i], argv[0], argv[0]);
+ fprintf (key_stream, "\n");
+ }
+ fprintf (key_stream,
+ _(" Source files groveled to make this file include:\n\n"));
+
+ for (i = 1; i < argc; i++)
+ {
+ fprintf (doc_stream, "\t%s\n", argv[i]);
+ fprintf (key_stream, "\t%s\n", argv[i]);
+ }
+
+ fprintf (doc_stream, "\n");
+ for (i = 0; doc_header_1[i]; i++)
+ fprintf (doc_stream, "%s\n", doc_header_1[i]);
+
+ fprintf (key_stream, "\n");
+ for (i = 0; key_header_1[i]; i++)
+ fprintf (key_stream, "%s\n", key_header_1[i]);
+
+ init_func_key(0);
+
+ for (i = 1; i < argc; i++)
+ {
+ char *curfile;
+ curfile = argv[i];
+
+ if (*curfile == '-')
+ continue;
+
+ fprintf (doc_stream, "/* Commands found in \"%s\". */\n", curfile);
+ fprintf (key_stream, "/* Commands found in \"%s\". */\n", curfile);
+ fprintf (funs_stream, "\n/* Functions declared in \"%s\". */\n",
+ curfile);
+
+ process_one_file (curfile, doc_stream, key_stream, funs_stream);
+ }
+
+#if defined (INFOKEY)
+
+#if defined (NAMED_FUNCTIONS)
+ fprintf (doc_stream,
+ " { (VFunction *)NULL, (char *)NULL, (FUNCTION_KEYSEQ *)NULL, (char *)NULL }\n};\n");
+#else /* !NAMED_FUNCTIONS */
+ fprintf (doc_stream, " { (VFunction *)NULL, (FUNCTION_KEYSEQ *)NULL, (char *)NULL }\n};\n");
+#endif /* !NAMED_FUNCTIONS */
+
+#else /* !INFOKEY */
+
+#if defined (NAMED_FUNCTIONS)
+ fprintf (doc_stream,
+ " { (VFunction *)NULL, (char *)NULL, (char *)NULL }\n};\n");
+#else /* !NAMED_FUNCTIONS */
+ fprintf (doc_stream, " { (VFunction *)NULL, (char *)NULL }\n};\n");
+#endif /* !NAMED_FUNCTIONS */
+
+#endif /* !INFOKEY */
+
+ fprintf (key_stream, " { (char *)NULL, 0 }\n};\n");
+ fprintf (funs_stream, "\n#define A_NCOMMANDS %u\n", next_func_key());
+
+ fclose (funs_stream);
+ fclose (doc_stream);
+ fclose (key_stream);
+
+ if (tags_only)
+ maybe_dump_tags (stdout);
+ return 0;
+}
+
+/* Dumping out the contents of an Emacs tags table. */
+static void
+maybe_dump_tags (FILE *stream)
+{
+ register int i;
+
+ /* Emacs needs its TAGS file to be in Unix text format (i.e., only
+ newline at end of every line, no CR), so when we generate a
+ TAGS table, we must switch the output stream to binary mode.
+ (If the table is written to a terminal, this is obviously not needed.) */
+ SET_BINARY (fileno (stream));
+
+ /* Print out the information for each block. */
+ for (i = 0; i < emacs_tags_index; i++)
+ {
+ register int j;
+ register EMACS_TAG_BLOCK *block;
+ register EMACS_TAG *etag;
+ long block_len;
+
+ block_len = 0;
+ block = emacs_tags[i];
+
+ /* Calculate the length of the dumped block first. */
+ for (j = 0; j < block->entries_index; j++)
+ {
+ char digits[30];
+ etag = block->entries[j];
+ block_len += 3 + strlen (etag->name);
+ sprintf (digits, "%d,%ld", etag->line, etag->char_offset);
+ block_len += strlen (digits);
+ }
+
+ /* Print out the defining line. */
+ fprintf (stream, "\f\n%s,%ld\n", block->filename, block_len);
+
+ /* Print out the individual tags. */
+ for (j = 0; j < block->entries_index; j++)
+ {
+ etag = block->entries[j];
+
+ fprintf (stream, "%s,\177%d,%ld\n",
+ etag->name, etag->line, etag->char_offset);
+ }
+ }
+}
+
+/* Keeping track of names, line numbers and character offsets of functions
+ found in source files. */
+static EMACS_TAG_BLOCK *
+make_emacs_tag_block (char *filename)
+{
+ EMACS_TAG_BLOCK *block;
+
+ block = (EMACS_TAG_BLOCK *)xmalloc (sizeof (EMACS_TAG_BLOCK));
+ block->filename = xstrdup (filename);
+ block->entrylen = 0;
+ block->entries = (EMACS_TAG **)NULL;
+ block->entries_index = 0;
+ block->entries_slots = 0;
+ return (block);
+}
+
+static void
+add_tag_to_block (EMACS_TAG_BLOCK *block,
+ char *name, int line, long int char_offset)
+{
+ EMACS_TAG *tag;
+
+ tag = (EMACS_TAG *)xmalloc (sizeof (EMACS_TAG));
+ tag->name = name;
+ tag->line = line;
+ tag->char_offset = char_offset;
+ add_pointer_to_array (tag, block->entries_index, block->entries,
+ block->entries_slots, 50, EMACS_TAG *);
+}
+
+/* Read the file represented by FILENAME into core, and search it for Info
+ function declarations. Output the declarations in various forms to the
+ DOC_STREAM, KEY_STREAM, and FUNS_STREAM. */
+static void
+process_one_file (char *filename, FILE *doc_stream,
+ FILE *key_stream, FILE *funs_stream)
+{
+ int descriptor, decl_len;
+ char *buffer, *decl_str;
+ struct stat finfo;
+ long offset;
+ long file_size;
+ EMACS_TAG_BLOCK *block;
+
+ if (stat (filename, &finfo) == -1)
+ fatal_file_error (filename);
+
+ descriptor = open (filename, O_RDONLY, 0666);
+
+ if (descriptor == -1)
+ fatal_file_error (filename);
+
+ file_size = (long) finfo.st_size;
+ buffer = (char *)xmalloc (1 + file_size);
+ /* On some systems, the buffer will actually contain
+ less characters than the full file's size, because
+ the CR characters are removed from line endings. */
+ file_size = read (descriptor, buffer, file_size);
+ close (descriptor);
+
+ offset = 0;
+ decl_str = DECLARATION_STRING;
+ decl_len = strlen (decl_str);
+
+ block = make_emacs_tag_block (filename);
+
+ while (1)
+ {
+ long point = 0;
+ long line_start = 0;
+ int line_number = 0;
+
+ char *func, *doc;
+#if defined (INFOKEY) || defined (NAMED_FUNCTIONS)
+ char *func_name;
+#endif /* INFOKEY || NAMED_FUNCTIONS */
+
+ for (; offset < (file_size - decl_len); offset++)
+ {
+ if (buffer[offset] == '\n')
+ {
+ line_number++;
+ line_start = offset + 1;
+ }
+
+ if (strncmp (buffer + offset, decl_str, decl_len) == 0)
+ {
+ offset += decl_len;
+ point = offset;
+ break;
+ }
+ }
+
+ if (!point)
+ break;
+
+ /* Skip forward until we find the open paren. */
+ while (point < file_size)
+ {
+ if (buffer[point] == '\n')
+ {
+ line_number++;
+ line_start = point + 1;
+ }
+ else if (buffer[point] == '(')
+ break;
+
+ point++;
+ }
+
+ while (point++ < file_size)
+ {
+ if (!whitespace_or_newline (buffer[point]))
+ break;
+ else if (buffer[point] == '\n')
+ {
+ line_number++;
+ line_start = point + 1;
+ }
+ }
+
+ if (point >= file_size)
+ break;
+
+ /* Now looking at name of function. Get it. */
+ for (offset = point; buffer[offset] != ','; offset++);
+ func = (char *)xmalloc (1 + (offset - point));
+ strncpy (func, buffer + point, offset - point);
+ func[offset - point] = '\0';
+
+ /* Remember this tag in the current block. */
+ {
+ char *tag_name;
+
+ tag_name = (char *)xmalloc (1 + (offset - line_start));
+ strncpy (tag_name, buffer + line_start, offset - line_start);
+ tag_name[offset - line_start] = '\0';
+ add_tag_to_block (block, tag_name, line_number, point);
+ }
+
+#if defined (INFOKEY) || defined (NAMED_FUNCTIONS)
+ /* Generate the user-visible function name from the function's name. */
+ {
+ register int i;
+ char *name_start;
+
+ name_start = func;
+
+ if (strncmp (name_start, "info_", 5) == 0)
+ name_start += 5;
+
+ func_name = xstrdup (name_start);
+
+ /* Fix up "ea" commands. */
+ if (strncmp (func_name, "ea_", 3) == 0)
+ {
+ char *temp_func_name;
+
+ temp_func_name = (char *)xmalloc (10 + strlen (func_name));
+ strcpy (temp_func_name, "echo_area_");
+ strcat (temp_func_name, func_name + 3);
+ free (func_name);
+ func_name = temp_func_name;
+ }
+
+ for (i = 0; func_name[i]; i++)
+ if (func_name[i] == '_')
+ func_name[i] = '-';
+ }
+#endif /* INFOKEY || NAMED_FUNCTIONS */
+
+ /* Find doc string. */
+ point = offset + 1;
+
+ while (point < file_size)
+ {
+ if (buffer[point] == '\n')
+ {
+ line_number++;
+ line_start = point + 1;
+ }
+
+ if (buffer[point] == '"')
+ break;
+ else
+ point++;
+ }
+
+ offset = point + 1;
+
+ while (offset < file_size)
+ {
+ if (buffer[offset] == '\n')
+ {
+ line_number++;
+ line_start = offset + 1;
+ }
+
+ if (buffer[offset] == '\\')
+ offset += 2;
+ else if (buffer[offset] == '"')
+ break;
+ else
+ offset++;
+ }
+
+ offset++;
+ if (offset >= file_size)
+ break;
+
+ doc = (char *)xmalloc (1 + (offset - point));
+ strncpy (doc, buffer + point, offset - point);
+ doc[offset - point] = '\0';
+
+#if defined (INFOKEY)
+
+#if defined (NAMED_FUNCTIONS)
+ fprintf (doc_stream,
+ " { (VFunction *)%s, \"%s\", (FUNCTION_KEYSEQ *)0, %s },\n",
+ func, func_name, doc);
+#else /* !NAMED_FUNCTIONS */
+ fprintf (doc_stream,
+ " { (VFunction *) %s, (FUNCTION_KEYSEQ *)0, %s },\n", func, doc);
+#endif /* !NAMED_FUNCTIONS */
+
+ fprintf (key_stream, " { \"%s\", A_%s },\n", func_name, func);
+
+#else /* !INFOKEY */
+
+#if defined (NAMED_FUNCTIONS)
+ fprintf (doc_stream, " { %s, \"%s\", %s },\n", func, func_name, doc);
+#else /* !NAMED_FUNCTIONS */
+ fprintf (doc_stream, " { %s, %s },\n", func, doc);
+#endif /* !NAMED_FUNCTIONS */
+
+#endif /* !INFOKEY */
+
+#if defined (INFOKEY) || defined (NAMED_FUNCTIONS)
+ free (func_name);
+#endif /* INFOKEY || NAMED_FUNCTIONS */
+
+#if defined (INFOKEY)
+ fprintf (funs_stream, "#define A_%s %u\n", func, next_func_key());
+#endif /* INFOKEY */
+ fprintf (funs_stream,
+ "extern void %s (WINDOW *window, int count, unsigned char key);\n",
+ func);
+ free (func);
+ free (doc);
+ }
+ free (buffer);
+
+ /* If we created any tags, remember this file on our global list. Otherwise,
+ free the memory already allocated to it. */
+ if (block->entries)
+ add_pointer_to_array (block, emacs_tags_index, emacs_tags,
+ emacs_tags_slots, 10, EMACS_TAG_BLOCK *);
+ else
+ {
+ free (block->filename);
+ free (block);
+ }
+}
+
+static void
+fatal_file_error (char *filename)
+{
+ fprintf (stderr, _("Couldn't manipulate the file %s.\n"), filename);
+ xexit (2);
+}
+
+static FILE *
+must_fopen (char *filename, char *mode)
+{
+ FILE *stream;
+
+ stream = fopen (filename, mode);
+ if (!stream)
+ fatal_file_error (filename);
+
+ return (stream);
+}
+
+static unsigned int func_key;
+
+static void
+init_func_key(unsigned int val)
+{
+ func_key = val;
+}
+
+static unsigned int
+next_func_key(void)
+{
+ return func_key++;
+}
diff --git a/Build/source/utils/texinfo/info/man.c b/Build/source/utils/texinfo/info/man.c
new file mode 100644
index 00000000000..33fd6d4be0b
--- /dev/null
+++ b/Build/source/utils/texinfo/info/man.c
@@ -0,0 +1,734 @@
+/* man.c: How to read and format man files.
+ $Id: man.c,v 1.4 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox Thu May 4 09:17:52 1995 (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include <sys/ioctl.h>
+#include "signals.h"
+#if defined (HAVE_SYS_TIME_H)
+#include <sys/time.h>
+#endif
+#if defined (HAVE_SYS_WAIT_H)
+#include <sys/wait.h>
+#endif
+
+#include "tilde.h"
+#include "man.h"
+
+#if !defined (_POSIX_VERSION)
+#define pid_t int
+#endif
+
+#if defined (FD_SET)
+# if defined (hpux)
+# define fd_set_cast(x) (int *)(x)
+# else
+# define fd_set_cast(x) (fd_set *)(x)
+# endif /* !hpux */
+#endif /* FD_SET */
+
+#if STRIP_DOT_EXE
+static char const * const exec_extensions[] = {
+ ".exe", ".com", ".bat", ".btm", ".sh", ".ksh", ".pl", ".sed", "", NULL
+};
+#else
+static char const * const exec_extensions[] = { "", NULL };
+#endif
+
+static char *read_from_fd (int fd);
+static void clean_manpage (char *manpage);
+static NODE *manpage_node_of_file_buffer (FILE_BUFFER *file_buffer,
+ char *pagename);
+static char *get_manpage_contents (char *pagename);
+
+NODE *
+make_manpage_node (char *pagename)
+{
+ return (info_get_node (MANPAGE_FILE_BUFFER_NAME, pagename));
+}
+
+NODE *
+get_manpage_node (FILE_BUFFER *file_buffer, char *pagename)
+{
+ NODE *node;
+
+ node = manpage_node_of_file_buffer (file_buffer, pagename);
+
+ if (!node)
+ {
+ char *page;
+
+ page = get_manpage_contents (pagename);
+
+ if (page)
+ {
+ char header[1024];
+ long oldsize, newsize;
+ int hlen, plen;
+ char *old_contents = file_buffer->contents;
+
+ sprintf (header, "\n\n%c\n%s %s, %s %s, %s (dir)\n\n",
+ INFO_COOKIE,
+ INFO_FILE_LABEL, file_buffer->filename,
+ INFO_NODE_LABEL, pagename,
+ INFO_UP_LABEL);
+ oldsize = file_buffer->filesize;
+ hlen = strlen (header);
+ plen = strlen (page);
+ newsize = (oldsize + hlen + plen);
+ file_buffer->contents =
+ (char *)xrealloc (file_buffer->contents, 1 + newsize);
+ memcpy (file_buffer->contents + oldsize, header, hlen);
+ memcpy (file_buffer->contents + oldsize + hlen, page, plen);
+ file_buffer->contents[newsize] = '\0';
+ file_buffer->filesize = newsize;
+ file_buffer->finfo.st_size = newsize;
+ build_tags_and_nodes (file_buffer);
+ free (page);
+ /* We have just relocated file_buffer->contents from under
+ the feet of info_windows[] array. Therefore, all the
+ nodes on that list which are showing man pages have their
+ contents member pointing into the blue. Undo that harm. */
+ if (old_contents && oldsize && old_contents != file_buffer->contents)
+ {
+ int iw;
+ INFO_WINDOW *info_win;
+ char *old_contents_end = old_contents + oldsize;
+
+ for (iw = 0; (info_win = info_windows[iw]); iw++)
+ {
+ int in;
+
+ for (in = 0; in < info_win->nodes_index; in++)
+ {
+ NODE *tmp_node = info_win->nodes[in];
+
+ /* It really only suffices to see that node->filename
+ is "*manpages*". But after several hours of
+ debugging this, would you blame me for being a bit
+ paranoid? */
+ if (tmp_node && tmp_node->filename
+ && tmp_node->contents
+ && strcmp (tmp_node->filename,
+ MANPAGE_FILE_BUFFER_NAME) == 0
+ && tmp_node->contents >= old_contents
+ && tmp_node->contents + tmp_node->nodelen
+ <= old_contents_end)
+ {
+ info_win->nodes[in] =
+ manpage_node_of_file_buffer (file_buffer,
+ tmp_node->nodename);
+ free (tmp_node->nodename);
+ free (tmp_node);
+ }
+ }
+ }
+ }
+ }
+
+ node = manpage_node_of_file_buffer (file_buffer, pagename);
+ }
+
+ return (node);
+}
+
+FILE_BUFFER *
+create_manpage_file_buffer (void)
+{
+ FILE_BUFFER *file_buffer = make_file_buffer ();
+ file_buffer->filename = xstrdup (MANPAGE_FILE_BUFFER_NAME);
+ file_buffer->fullpath = xstrdup (MANPAGE_FILE_BUFFER_NAME);
+ file_buffer->finfo.st_size = 0;
+ file_buffer->filesize = 0;
+ file_buffer->contents = (char *)NULL;
+ file_buffer->flags = (N_IsInternal | N_CannotGC | N_IsManPage);
+
+ return (file_buffer);
+}
+
+/* Scan the list of directories in PATH looking for FILENAME. If we find
+ one that is an executable file, return it as a new string. Otherwise,
+ return a NULL pointer. */
+static char *
+executable_file_in_path (char *filename, char *path)
+{
+ struct stat finfo;
+ char *temp_dirname;
+ int statable, dirname_index;
+
+ dirname_index = 0;
+
+ while ((temp_dirname = extract_colon_unit (path, &dirname_index)))
+ {
+ char *temp;
+ char *temp_end;
+ int i;
+
+ /* Expand a leading tilde if one is present. */
+ if (*temp_dirname == '~')
+ {
+ char *expanded_dirname;
+
+ expanded_dirname = tilde_expand_word (temp_dirname);
+ free (temp_dirname);
+ temp_dirname = expanded_dirname;
+ }
+
+ temp = (char *)xmalloc (34 + strlen (temp_dirname) + strlen (filename));
+ strcpy (temp, temp_dirname);
+ if (!IS_SLASH (temp[(strlen (temp)) - 1]))
+ strcat (temp, "/");
+ strcat (temp, filename);
+ temp_end = temp + strlen (temp);
+
+ free (temp_dirname);
+
+ /* Look for FILENAME, possibly with any of the extensions
+ in EXEC_EXTENSIONS[]. */
+ for (i = 0; exec_extensions[i]; i++)
+ {
+ if (exec_extensions[i][0])
+ strcpy (temp_end, exec_extensions[i]);
+ statable = (stat (temp, &finfo) == 0);
+
+ /* If we have found a regular executable file, then use it. */
+ if ((statable) && (S_ISREG (finfo.st_mode)) &&
+ (access (temp, X_OK) == 0))
+ return (temp);
+ }
+
+ free (temp);
+ }
+ return ((char *)NULL);
+}
+
+/* Return the full pathname of the system man page formatter. */
+static char *
+find_man_formatter (void)
+{
+ return (executable_file_in_path ("man", (char *)getenv ("PATH")));
+}
+
+static char *manpage_pagename = (char *)NULL;
+static char *manpage_section = (char *)NULL;
+
+static void
+get_page_and_section (char *pagename)
+{
+ register int i;
+
+ if (manpage_pagename)
+ free (manpage_pagename);
+
+ if (manpage_section)
+ free (manpage_section);
+
+ manpage_pagename = (char *)NULL;
+ manpage_section = (char *)NULL;
+
+ for (i = 0; pagename[i] != '\0' && pagename[i] != '('; i++);
+
+ manpage_pagename = (char *)xmalloc (1 + i);
+ strncpy (manpage_pagename, pagename, i);
+ manpage_pagename[i] = '\0';
+
+ if (pagename[i] == '(')
+ {
+ int start;
+
+ start = i + 1;
+
+ for (i = start; pagename[i] != '\0' && pagename[i] != ')'; i++);
+
+ manpage_section = (char *)xmalloc (1 + (i - start));
+ strncpy (manpage_section, pagename + start, (i - start));
+ manpage_section[i - start] = '\0';
+ }
+}
+
+#if PIPE_USE_FORK
+static void
+reap_children (int sig)
+{
+ wait (NULL);
+}
+#endif
+
+static char *
+get_manpage_contents (char *pagename)
+{
+ static char *formatter_args[4] = { (char *)NULL };
+ int pipes[2];
+ pid_t child;
+ RETSIGTYPE (*sigsave) (int signum);
+ char *formatted_page = NULL;
+ int arg_index = 1;
+
+ if (formatter_args[0] == (char *)NULL)
+ formatter_args[0] = find_man_formatter ();
+
+ if (formatter_args[0] == (char *)NULL)
+ return ((char *)NULL);
+
+ get_page_and_section (pagename);
+
+ if (manpage_section != (char *)NULL)
+ formatter_args[arg_index++] = manpage_section;
+
+ formatter_args[arg_index++] = manpage_pagename;
+ formatter_args[arg_index] = (char *)NULL;
+
+ /* Open a pipe to this program, read the output, and save it away
+ in FORMATTED_PAGE. The reader end of the pipe is pipes[0]; the
+ writer end is pipes[1]. */
+#if PIPE_USE_FORK
+ pipe (pipes);
+
+ sigsave = signal (SIGCHLD, reap_children);
+
+ child = fork ();
+ if (child == -1)
+ return ((char *)NULL);
+
+ if (child != 0)
+ {
+ /* In the parent, close the writing end of the pipe, and read from
+ the exec'd child. */
+ close (pipes[1]);
+ formatted_page = read_from_fd (pipes[0]);
+ close (pipes[0]);
+ signal (SIGCHLD, sigsave);
+ }
+ else
+ { /* In the child, close the read end of the pipe, make the write end
+ of the pipe be stdout, and execute the man page formatter. */
+ close (pipes[0]);
+ freopen (NULL_DEVICE, "w", stderr);
+ freopen (NULL_DEVICE, "r", stdin);
+ dup2 (pipes[1], fileno (stdout));
+
+ execv (formatter_args[0], formatter_args);
+
+ /* If we get here, we couldn't exec, so close out the pipe and
+ exit. */
+ close (pipes[1]);
+ xexit (0);
+ }
+#else /* !PIPE_USE_FORK */
+ /* Cannot fork/exec, but can popen/pclose. */
+ {
+ FILE *fpipe;
+ char *cmdline = xmalloc (strlen (formatter_args[0])
+ + strlen (manpage_pagename)
+ + (arg_index > 2 ? strlen (manpage_section) : 0)
+ + 3);
+ int save_stderr = dup (fileno (stderr));
+ int fd_err = open (NULL_DEVICE, O_WRONLY, 0666);
+
+ if (fd_err > 2)
+ dup2 (fd_err, fileno (stderr)); /* Don't print errors. */
+ sprintf (cmdline, "%s %s %s", formatter_args[0], manpage_pagename,
+ arg_index > 2 ? manpage_section : "");
+ fpipe = popen (cmdline, "r");
+ free (cmdline);
+ if (fd_err > 2)
+ close (fd_err);
+ dup2 (save_stderr, fileno (stderr));
+ if (fpipe == 0)
+ return ((char *)NULL);
+ formatted_page = read_from_fd (fileno (fpipe));
+ if (pclose (fpipe) == -1)
+ {
+ if (formatted_page)
+ free (formatted_page);
+ return ((char *)NULL);
+ }
+ }
+#endif /* !PIPE_USE_FORK */
+
+ /* If we have the page, then clean it up. */
+ if (formatted_page)
+ clean_manpage (formatted_page);
+
+ return (formatted_page);
+}
+
+static void
+clean_manpage (char *manpage)
+{
+ register int i, j;
+ int newline_count = 0;
+ char *newpage;
+
+ newpage = (char *)xmalloc (1 + strlen (manpage));
+
+ for (i = 0, j = 0; (newpage[j] = manpage[i]); i++, j++)
+ {
+ if (manpage[i] == '\n')
+ newline_count++;
+ else
+ newline_count = 0;
+
+ if (newline_count == 3)
+ {
+ j--;
+ newline_count--;
+ }
+
+ /* A malformed man page could have a \b as its first character,
+ in which case decrementing j by 2 will cause us to write into
+ newpage[-1], smashing the hidden info stored there by malloc. */
+ if (manpage[i] == '\b' || (manpage[i] == '\f' && j > 0))
+ j -= 2;
+ else if (!raw_escapes_p)
+ {
+ /* Remove the ANSI escape sequences for color, boldface,
+ underlining, and italics, generated by some versions of
+ Groff. */
+ if (manpage[i] == '\033' && manpage[i + 1] == '['
+ && isdigit (manpage[i + 2]))
+ {
+ if (isdigit (manpage[i + 3]) && manpage[i + 4] == 'm')
+ {
+ i += 4;
+ j--;
+ }
+ else if (manpage[i + 3] == 'm')
+ {
+ i += 3;
+ j--;
+ }
+ /* Else do nothing: it's some unknown escape sequence,
+ so let's leave it alone. */
+ }
+ }
+ }
+
+ newpage[j++] = 0;
+
+ strcpy (manpage, newpage);
+ free (newpage);
+}
+
+static NODE *
+manpage_node_of_file_buffer (FILE_BUFFER *file_buffer, char *pagename)
+{
+ NODE *node = (NODE *)NULL;
+ TAG *tag = (TAG *)NULL;
+
+ if (file_buffer->contents)
+ {
+ register int i;
+
+ for (i = 0; (tag = file_buffer->tags[i]); i++)
+ {
+ if (strcasecmp (pagename, tag->nodename) == 0)
+ break;
+ }
+ }
+
+ if (tag)
+ {
+ node = (NODE *)xmalloc (sizeof (NODE));
+ node->filename = file_buffer->filename;
+ node->nodename = xstrdup (tag->nodename);
+ node->contents = file_buffer->contents + tag->nodestart;
+ node->nodelen = tag->nodelen;
+ node->flags = 0;
+ node->display_pos = 0;
+ node->parent = (char *)NULL;
+ node->flags = (N_HasTagsTable | N_IsManPage);
+ node->contents += skip_node_separator (node->contents);
+ }
+
+ return (node);
+}
+
+static char *
+read_from_fd (int fd)
+{
+ struct timeval timeout;
+ char *buffer = (char *)NULL;
+ int bsize = 0;
+ int bindex = 0;
+ int select_result;
+#if defined (FD_SET)
+ fd_set read_fds;
+
+ timeout.tv_sec = 15;
+ timeout.tv_usec = 0;
+
+ FD_ZERO (&read_fds);
+ FD_SET (fd, &read_fds);
+
+ select_result = select (fd + 1, fd_set_cast (&read_fds), 0, 0, &timeout);
+#else /* !FD_SET */
+ select_result = 1;
+#endif /* !FD_SET */
+
+ switch (select_result)
+ {
+ case 0:
+ case -1:
+ break;
+
+ default:
+ {
+ int amount_read;
+ int done = 0;
+
+ while (!done)
+ {
+ while ((bindex + 1024) > (bsize))
+ buffer = (char *)xrealloc (buffer, (bsize += 1024));
+ buffer[bindex] = '\0';
+
+ amount_read = read (fd, buffer + bindex, 1023);
+
+ if (amount_read < 0)
+ {
+ done = 1;
+ }
+ else
+ {
+ bindex += amount_read;
+ buffer[bindex] = '\0';
+ if (amount_read == 0)
+ done = 1;
+ }
+ }
+ }
+ }
+
+ if ((buffer != (char *)NULL) && (*buffer == '\0'))
+ {
+ free (buffer);
+ buffer = (char *)NULL;
+ }
+
+ return (buffer);
+}
+
+static char *reference_section_starters[] =
+{
+ "\nRELATED INFORMATION",
+ "\nRELATED\tINFORMATION",
+ "RELATED INFORMATION\n",
+ "RELATED\tINFORMATION\n",
+ "\nSEE ALSO",
+ "\nSEE\tALSO",
+ "SEE ALSO\n",
+ "SEE\tALSO\n",
+ (char *)NULL
+};
+
+static SEARCH_BINDING frs_binding;
+
+static SEARCH_BINDING *
+find_reference_section (NODE *node)
+{
+ register int i;
+ long position = -1;
+
+ frs_binding.buffer = node->contents;
+ frs_binding.start = 0;
+ frs_binding.end = node->nodelen;
+ frs_binding.flags = S_SkipDest;
+
+ for (i = 0; reference_section_starters[i] != (char *)NULL; i++)
+ {
+ position = search_forward (reference_section_starters[i], &frs_binding);
+ if (position != -1)
+ break;
+ }
+
+ if (position == -1)
+ return ((SEARCH_BINDING *)NULL);
+
+ /* We found the start of the reference section, and point is right after
+ the string which starts it. The text from here to the next header
+ (or end of buffer) contains the only references in this manpage. */
+ frs_binding.start = position;
+
+ for (i = frs_binding.start; i < frs_binding.end - 2; i++)
+ {
+ if ((frs_binding.buffer[i] == '\n') &&
+ (!whitespace (frs_binding.buffer[i + 1])))
+ {
+ frs_binding.end = i;
+ break;
+ }
+ }
+
+ return (&frs_binding);
+}
+
+REFERENCE **
+xrefs_of_manpage (NODE *node)
+{
+ SEARCH_BINDING *reference_section;
+ REFERENCE **refs = (REFERENCE **)NULL;
+ int refs_index = 0;
+ int refs_slots = 0;
+ long position;
+
+ reference_section = find_reference_section (node);
+
+ if (reference_section == (SEARCH_BINDING *)NULL)
+ return ((REFERENCE **)NULL);
+
+ /* Grovel the reference section building a list of references found there.
+ A reference is alphabetic characters followed by non-whitespace text
+ within parenthesis. */
+ reference_section->flags = 0;
+
+ while ((position = search_forward ("(", reference_section)) != -1)
+ {
+ register int start, end;
+
+ for (start = position; start > reference_section->start; start--)
+ if (whitespace (reference_section->buffer[start]))
+ break;
+
+ start++;
+
+ for (end = position; end < reference_section->end; end++)
+ {
+ if (whitespace (reference_section->buffer[end]))
+ {
+ end = start;
+ break;
+ }
+
+ if (reference_section->buffer[end] == ')')
+ {
+ end++;
+ break;
+ }
+ }
+
+ if (end != start)
+ {
+ REFERENCE *entry;
+ int len = end - start;
+
+ entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->label = (char *)xmalloc (1 + len);
+ strncpy (entry->label, (reference_section->buffer) + start, len);
+ entry->label[len] = '\0';
+ entry->filename = xstrdup (node->filename);
+ entry->nodename = xstrdup (entry->label);
+ entry->start = start;
+ entry->end = end;
+
+ add_pointer_to_array
+ (entry, refs_index, refs, refs_slots, 10, REFERENCE *);
+ }
+
+ reference_section->start = position + 1;
+ }
+
+ return (refs);
+}
+
+long
+locate_manpage_xref (NODE *node, long int start, int dir)
+{
+ REFERENCE **refs;
+ long position = -1;
+
+ refs = xrefs_of_manpage (node);
+
+ if (refs)
+ {
+ register int i, count;
+ REFERENCE *entry;
+
+ for (i = 0; refs[i]; i++);
+ count = i;
+
+ if (dir > 0)
+ {
+ for (i = 0; (entry = refs[i]); i++)
+ if (entry->start > start)
+ {
+ position = entry->start;
+ break;
+ }
+ }
+ else
+ {
+ for (i = count - 1; i > -1; i--)
+ {
+ entry = refs[i];
+
+ if (entry->start < start)
+ {
+ position = entry->start;
+ break;
+ }
+ }
+ }
+
+ info_free_references (refs);
+ }
+ return (position);
+}
+
+/* This one was a little tricky. The binding buffer that is passed in has
+ a START and END value of 0 -- strlen (window-line-containing-point).
+ The BUFFER is a pointer to the start of that line. */
+REFERENCE **
+manpage_xrefs_in_binding (NODE *node, SEARCH_BINDING *binding)
+{
+ register int i;
+ REFERENCE **all_refs = xrefs_of_manpage (node);
+ REFERENCE **brefs = (REFERENCE **)NULL;
+ REFERENCE *entry;
+ int brefs_index = 0;
+ int brefs_slots = 0;
+ int start, end;
+
+ if (!all_refs)
+ return ((REFERENCE **)NULL);
+
+ start = binding->start + (binding->buffer - node->contents);
+ end = binding->end + (binding->buffer - node->contents);
+
+ for (i = 0; (entry = all_refs[i]); i++)
+ {
+ if ((entry->start > start) && (entry->end < end))
+ {
+ add_pointer_to_array
+ (entry, brefs_index, brefs, brefs_slots, 10, REFERENCE *);
+ }
+ else
+ {
+ maybe_free (entry->label);
+ maybe_free (entry->filename);
+ maybe_free (entry->nodename);
+ free (entry);
+ }
+ }
+
+ free (all_refs);
+ return (brefs);
+}
diff --git a/Build/source/utils/texinfo/info/man.h b/Build/source/utils/texinfo/info/man.h
new file mode 100644
index 00000000000..73ef1b6274a
--- /dev/null
+++ b/Build/source/utils/texinfo/info/man.h
@@ -0,0 +1,39 @@
+/* man.h: Defines and external function declarations for man.c.
+ $Id: man.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Author: Brian J. Fox (bfox@ai.mit.edu) Sat May 6 16:19:13 1995. */
+
+#ifndef INFO_MAN_H
+#define INFO_MAN_H
+
+#define MANPAGE_FILE_BUFFER_NAME "*manpages*"
+
+extern NODE *make_manpage_node (char *pagename);
+extern NODE *get_manpage_node (FILE_BUFFER *file_buffer,
+ char *pagename);
+extern FILE_BUFFER *create_manpage_file_buffer (void);
+extern long locate_manpage_xref (NODE *node, long int start, int dir);
+extern REFERENCE **xrefs_of_manpage (NODE *node);
+extern REFERENCE **manpage_xrefs_in_binding (NODE *node,
+ SEARCH_BINDING *binding);
+
+#endif /* INFO_MAN_H */
diff --git a/Build/source/utils/texinfo/info/nodemenu.c b/Build/source/utils/texinfo/info/nodemenu.c
new file mode 100644
index 00000000000..1090d08db02
--- /dev/null
+++ b/Build/source/utils/texinfo/info/nodemenu.c
@@ -0,0 +1,347 @@
+/* nodemenu.c -- produce a menu of all visited nodes.
+ $Id: nodemenu.c,v 1.5 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+NODE * get_visited_nodes (Function *filter_func);
+
+/* Return a line describing the format of a node information line. */
+static const char *
+nodemenu_format_info (void)
+{
+ return (_("\n\
+* Menu:\n\
+ (File)Node Lines Size Containing File\n\
+ ---------- ----- ---- ---------------"));
+}
+
+/* Produce a formatted line of information about NODE. Here is what we want
+ the output listing to look like:
+
+* Menu:
+ (File)Node Lines Size Containing File
+ ---------- ----- ---- ---------------
+* (emacs)Buffers:: 48 2230 /usr/gnu/info/emacs/emacs-1
+* (autoconf)Writing configure.in:: 123 58789 /usr/gnu/info/autoconf/autoconf-1
+* (dir)Top:: 40 589 /usr/gnu/info/dir
+*/
+static char *
+format_node_info (NODE *node)
+{
+ register int i, len;
+ char *parent, *containing_file;
+ static char *line_buffer = (char *)NULL;
+
+ if (!line_buffer)
+ line_buffer = (char *)xmalloc (1000);
+
+ if (node->parent)
+ {
+ parent = filename_non_directory (node->parent);
+ if (!parent)
+ parent = node->parent;
+ }
+ else
+ parent = (char *)NULL;
+
+ containing_file = node->filename;
+
+ if (!parent && !*containing_file)
+ sprintf (line_buffer, "* %s::", node->nodename);
+ else
+ {
+ char *file = (char *)NULL;
+
+ if (parent)
+ file = parent;
+ else
+ file = filename_non_directory (containing_file);
+
+ if (!file)
+ file = containing_file;
+
+ if (!*file)
+ file = "dir";
+
+ sprintf (line_buffer, "* (%s)%s::", file, node->nodename);
+ }
+
+ len = pad_to (36, line_buffer);
+
+ {
+ int lines = 1;
+
+ for (i = 0; i < node->nodelen; i++)
+ if (node->contents[i] == '\n')
+ lines++;
+
+ sprintf (line_buffer + len, "%d", lines);
+ }
+
+ len = pad_to (44, line_buffer);
+ sprintf (line_buffer + len, "%ld", node->nodelen);
+
+ if (node->filename && *(node->filename))
+ {
+ len = pad_to (51, line_buffer);
+ strcpy (line_buffer + len, node->filename);
+ }
+
+ return xstrdup (line_buffer);
+}
+
+/* Little string comparison routine for qsort (). */
+static int
+compare_strings (const void *entry1, const void *entry2)
+{
+ char **e1 = (char **) entry1;
+ char **e2 = (char **) entry2;
+
+ return (strcasecmp (*e1, *e2));
+}
+
+/* The name of the nodemenu node. */
+static char *nodemenu_nodename = "*Node Menu*";
+
+/* Produce an informative listing of all the visited nodes, and return it
+ in a node. If FILTER_FUNC is non-null, it is a function which filters
+ which nodes will appear in the listing. FILTER_FUNC takes an argument
+ of NODE, and returns non-zero if the node should appear in the listing. */
+NODE *
+get_visited_nodes (Function *filter_func)
+{
+ register int i, iw_index;
+ INFO_WINDOW *info_win;
+ NODE *node;
+ char **lines = (char **)NULL;
+ int lines_index = 0, lines_slots = 0;
+
+ if (!info_windows)
+ return ((NODE *)NULL);
+
+ for (iw_index = 0; (info_win = info_windows[iw_index]); iw_index++)
+ {
+ for (i = 0; i < info_win->nodes_index; i++)
+ {
+ node = info_win->nodes[i];
+
+ /* We skip mentioning "*Node Menu*" nodes. */
+ if (internal_info_node_p (node) &&
+ (strcmp (node->nodename, nodemenu_nodename) == 0))
+ continue;
+
+ if (node && (!filter_func || (*filter_func) (node)))
+ {
+ char *line;
+
+ line = format_node_info (node);
+ add_pointer_to_array
+ (line, lines_index, lines, lines_slots, 20, char *);
+ }
+ }
+ }
+
+ /* Sort the array of information lines, if there are any. */
+ if (lines)
+ {
+ register int j, newlen;
+ char **temp;
+
+ qsort (lines, lines_index, sizeof (char *), compare_strings);
+
+ /* Delete duplicates. */
+ for (i = 0, newlen = 1; i < lines_index - 1; i++)
+ {
+ /* Use FILENAME_CMP here, since the most important piece
+ of info in each line is the file name of the node. */
+ if (FILENAME_CMP (lines[i], lines[i + 1]) == 0)
+ {
+ free (lines[i]);
+ lines[i] = (char *)NULL;
+ }
+ else
+ newlen++;
+ }
+
+ /* We have free ()'d and marked all of the duplicate slots.
+ Copy the live slots rather than pruning the dead slots. */
+ temp = (char **)xmalloc ((1 + newlen) * sizeof (char *));
+ for (i = 0, j = 0; i < lines_index; i++)
+ if (lines[i])
+ temp[j++] = lines[i];
+
+ temp[j] = (char *)NULL;
+ free (lines);
+ lines = temp;
+ lines_index = newlen;
+ }
+
+ initialize_message_buffer ();
+
+ printf_to_message_buffer
+ ("%s", replace_in_documentation
+ ((char *) _("Here is the menu of nodes you have recently visited.\n\
+Select one from this menu, or use `\\[history-node]' in another window.\n"), 0),
+ NULL, NULL);
+
+ printf_to_message_buffer ("%s\n", (char *) nodemenu_format_info (),
+ NULL, NULL);
+
+ for (i = 0; (lines != (char **)NULL) && (i < lines_index); i++)
+ {
+ printf_to_message_buffer ("%s\n", lines[i], NULL, NULL);
+ free (lines[i]);
+ }
+
+ if (lines)
+ free (lines);
+
+ node = message_buffer_to_node ();
+ add_gcable_pointer (node->contents);
+ return (node);
+}
+
+DECLARE_INFO_COMMAND (list_visited_nodes,
+ _("Make a window containing a menu of all of the currently visited nodes"))
+{
+ WINDOW *new;
+ NODE *node;
+
+ set_remembered_pagetop_and_point (window);
+
+ /* If a window is visible and showing the buffer list already, re-use it. */
+ for (new = windows; new; new = new->next)
+ {
+ node = new->node;
+
+ if (internal_info_node_p (node) &&
+ (strcmp (node->nodename, nodemenu_nodename) == 0))
+ break;
+ }
+
+ /* If we couldn't find an existing window, try to use the next window
+ in the chain. */
+ if (!new)
+ {
+ if (window->next)
+ new = window->next;
+ /* If there is more than one window, wrap around. */
+ else if (window != windows)
+ new = windows;
+ }
+
+ /* If we still don't have a window, make a new one to contain the list. */
+ if (!new)
+ {
+ WINDOW *old_active;
+
+ old_active = active_window;
+ active_window = window;
+ new = window_make_window ((NODE *)NULL);
+ active_window = old_active;
+ }
+
+ /* If we couldn't make a new window, use this one. */
+ if (!new)
+ new = window;
+
+ /* Lines do not wrap in this window. */
+ new->flags |= W_NoWrap;
+ node = get_visited_nodes ((Function *)NULL);
+ name_internal_node (node, nodemenu_nodename);
+
+#if 0
+ /* Even if this is an internal node, we don't want the window
+ system to treat it specially. So we turn off the internalness
+ of it here. */
+ /* Why? We depend on internal_info_node_p returning true, so we must
+ not remove the flag. Otherwise, the *Node Menu* nodes themselves
+ appear in the node menu. --Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>. */
+ node->flags &= ~N_IsInternal;
+#endif
+
+ /* If this window is already showing a node menu, reuse the existing node
+ slot. */
+ {
+ int remember_me = 1;
+
+#if defined (NOTDEF)
+ if (internal_info_node_p (new->node) &&
+ (strcmp (new->node->nodename, nodemenu_nodename) == 0))
+ remember_me = 0;
+#endif /* NOTDEF */
+
+ window_set_node_of_window (new, node);
+
+ if (remember_me)
+ remember_window_and_node (new, node);
+ }
+
+ active_window = new;
+}
+
+DECLARE_INFO_COMMAND (select_visited_node,
+ _("Select a node which has been previously visited in a visible window"))
+{
+ char *line;
+ NODE *node;
+ REFERENCE **menu;
+
+ node = get_visited_nodes ((Function *)NULL);
+
+ menu = info_menu_of_node (node);
+ free (node);
+
+ line =
+ info_read_completing_in_echo_area (window,
+ (char *) _("Select visited node: "), menu);
+
+ window = active_window;
+
+ /* User aborts, just quit. */
+ if (!line)
+ {
+ info_abort_key (window, 0, 0);
+ info_free_references (menu);
+ return;
+ }
+
+ if (*line)
+ {
+ REFERENCE *entry;
+
+ /* Find the selected label in the references. */
+ entry = info_get_labeled_reference (line, menu);
+
+ if (!entry)
+ info_error ((char *) _("The reference disappeared! (%s)."), line, NULL);
+ else
+ info_select_reference (window, entry);
+ }
+
+ free (line);
+ info_free_references (menu);
+
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
diff --git a/Build/source/utils/texinfo/info/nodes.c b/Build/source/utils/texinfo/info/nodes.c
new file mode 100644
index 00000000000..a3381a83145
--- /dev/null
+++ b/Build/source/utils/texinfo/info/nodes.c
@@ -0,0 +1,1263 @@
+/* nodes.c -- how to get an Info file and node.
+ $Id: nodes.c,v 1.4 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1998, 1999, 2000, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+#include "nodes.h"
+#include "search.h"
+#include "filesys.h"
+#include "info-utils.h"
+
+#if defined (HANDLE_MAN_PAGES)
+# include "man.h"
+#endif /* HANDLE_MAN_PAGES */
+
+static void forget_info_file (char *filename);
+static void remember_info_file (FILE_BUFFER *file_buffer);
+static void free_file_buffer_tags (FILE_BUFFER *file_buffer);
+static void free_info_tag (TAG *tag);
+static void get_nodes_of_tags_table (FILE_BUFFER *file_buffer,
+ SEARCH_BINDING *buffer_binding);
+static void get_nodes_of_info_file (FILE_BUFFER *file_buffer);
+static void get_tags_of_indirect_tags_table (FILE_BUFFER *file_buffer,
+ SEARCH_BINDING *indirect_binding, SEARCH_BINDING *tags_binding);
+static void info_reload_file_buffer_contents (FILE_BUFFER *fb);
+static char *adjust_nodestart (NODE *node, int min, int max);
+static FILE_BUFFER *info_load_file_internal (char *filename, int get_tags);
+static FILE_BUFFER *info_find_file_internal (char *filename, int get_tags);
+static NODE *info_node_of_file_buffer_tags (FILE_BUFFER *file_buffer,
+ char *nodename);
+
+static long get_node_length (SEARCH_BINDING *binding);
+
+/* Magic number that RMS used to decide how much a tags table pointer could
+ be off by. I feel that it should be much smaller, like 4. */
+#define DEFAULT_INFO_FUDGE 1000
+
+/* Passed to *_internal functions. INFO_GET_TAGS says to do what is
+ neccessary to fill in the nodes or tags arrays in FILE_BUFFER. */
+#define INFO_NO_TAGS 0
+#define INFO_GET_TAGS 1
+
+/* Global variables. */
+
+/* When non-zero, this is a string describing the recent file error. */
+char *info_recent_file_error = NULL;
+
+/* The list of already loaded nodes. */
+FILE_BUFFER **info_loaded_files = NULL;
+
+/* The number of slots currently allocated to LOADED_FILES. */
+int info_loaded_files_slots = 0;
+
+/* Public functions for node manipulation. */
+
+/* Used to build `dir' menu from `localdir' files found in INFOPATH. */
+extern void maybe_build_dir_node (char *dirname);
+
+/* Return a pointer to a NODE structure for the Info node (FILENAME)NODENAME.
+ If FILENAME is NULL, `dir' is used.
+ IF NODENAME is NULL, `Top' is used.
+ If the node cannot be found, return NULL. */
+NODE *
+info_get_node (char *filename, char *nodename)
+{
+ NODE *node;
+ FILE_BUFFER *file_buffer = NULL;
+
+ info_recent_file_error = NULL;
+ info_parse_node (nodename, DONT_SKIP_NEWLINES);
+ nodename = NULL;
+
+ if (info_parsed_filename)
+ filename = info_parsed_filename;
+
+ if (info_parsed_nodename)
+ nodename = info_parsed_nodename;
+
+ /* If FILENAME is not specified, it defaults to "dir". */
+ if (!filename)
+ filename = "dir";
+
+ /* If the file to be looked up is "dir", build the contents from all of
+ the "dir"s and "localdir"s found in INFOPATH. */
+ if (is_dir_name (filename))
+ maybe_build_dir_node (filename);
+
+ /* Find the correct info file, or give up. */
+ file_buffer = info_find_file (filename);
+ if (!file_buffer)
+ {
+ if (filesys_error_number)
+ info_recent_file_error =
+ filesys_error_string (filename, filesys_error_number);
+ return NULL;
+ }
+
+ /* Look for the node. */
+ node = info_get_node_of_file_buffer (nodename, file_buffer);
+
+ /* If the node not found was "Top", try again with different case. */
+ if (!node && (nodename == NULL || strcasecmp (nodename, "Top") == 0))
+ {
+ node = info_get_node_of_file_buffer ("Top", file_buffer);
+ if (!node)
+ node = info_get_node_of_file_buffer ("top", file_buffer);
+ if (!node)
+ node = info_get_node_of_file_buffer ("TOP", file_buffer);
+ }
+
+ return node;
+}
+
+/* Return a pointer to a NODE structure for the Info node NODENAME in
+ FILE_BUFFER. NODENAME can be passed as NULL, in which case the
+ nodename of "Top" is used. If the node cannot be found, return a
+ NULL pointer. */
+NODE *
+info_get_node_of_file_buffer (char *nodename, FILE_BUFFER *file_buffer)
+{
+ NODE *node = NULL;
+
+ /* If we are unable to find the file, we have to give up. There isn't
+ anything else we can do. */
+ if (!file_buffer)
+ return NULL;
+
+ /* If the file buffer was gc'ed, reload the contents now. */
+ if (!file_buffer->contents)
+ info_reload_file_buffer_contents (file_buffer);
+
+ /* If NODENAME is not specified, it defaults to "Top". */
+ if (!nodename)
+ nodename = "Top";
+
+ /* If the name of the node that we wish to find is exactly "*", then the
+ node body is the contents of the entire file. Create and return such
+ a node. */
+ if (strcmp (nodename, "*") == 0)
+ {
+ node = (NODE *)xmalloc (sizeof (NODE));
+ node->filename = file_buffer->fullpath;
+ node->parent = NULL;
+ node->nodename = xstrdup ("*");
+ node->contents = file_buffer->contents;
+ node->nodelen = file_buffer->filesize;
+ node->flags = 0;
+ node->display_pos = 0;
+ }
+#if defined (HANDLE_MAN_PAGES)
+ /* If the file buffer is the magic one associated with manpages, call
+ the manpage node finding function instead. */
+ else if (file_buffer->flags & N_IsManPage)
+ {
+ node = get_manpage_node (file_buffer, nodename);
+ }
+#endif /* HANDLE_MAN_PAGES */
+ /* If this is the "main" info file, it might contain a tags table. Search
+ the tags table for an entry which matches the node that we want. If
+ there is a tags table, get the file which contains this node, but don't
+ bother building a node list for it. */
+ else if (file_buffer->tags)
+ {
+ node = info_node_of_file_buffer_tags (file_buffer, nodename);
+ }
+
+ /* Return the results of our node search. */
+ return node;
+}
+
+/* Locate the file named by FILENAME, and return the information structure
+ describing this file. The file may appear in our list of loaded files
+ already, or it may not. If it does not already appear, find the file,
+ and add it to the list of loaded files. If the file cannot be found,
+ return a NULL FILE_BUFFER *. */
+FILE_BUFFER *
+info_find_file (char *filename)
+{
+ return info_find_file_internal (filename, INFO_GET_TAGS);
+}
+
+/* Load the info file FILENAME, remembering information about it in a
+ file buffer. */
+FILE_BUFFER *
+info_load_file (char *filename)
+{
+ return info_load_file_internal (filename, INFO_GET_TAGS);
+}
+
+
+/* Private functions implementation. */
+
+/* The workhorse for info_find_file (). Non-zero 2nd argument says to
+ try to build a tags table (or otherwise glean the nodes) for this
+ file once found. By default, we build the tags table, but when this
+ function is called by info_get_node () when we already have a valid
+ tags table describing the nodes, it is unnecessary. */
+static FILE_BUFFER *
+info_find_file_internal (char *filename, int get_tags)
+{
+ int i;
+ FILE_BUFFER *file_buffer;
+
+ /* First try to find the file in our list of already loaded files. */
+ if (info_loaded_files)
+ {
+ for (i = 0; (file_buffer = info_loaded_files[i]); i++)
+ if ((FILENAME_CMP (filename, file_buffer->filename) == 0)
+ || (FILENAME_CMP (filename, file_buffer->fullpath) == 0)
+ || (!IS_ABSOLUTE (filename)
+ && FILENAME_CMP (filename,
+ filename_non_directory (file_buffer->fullpath))
+ == 0))
+ {
+ struct stat new_info, *old_info;
+
+ /* This file is loaded. If the filename that we want is
+ specifically "dir", then simply return the file buffer. */
+ if (is_dir_name (filename_non_directory (filename)))
+ return file_buffer;
+
+#if defined (HANDLE_MAN_PAGES)
+ /* Do the same for the magic MANPAGE file. */
+ if (file_buffer->flags & N_IsManPage)
+ return file_buffer;
+#endif /* HANDLE_MAN_PAGES */
+
+ /* The file appears to be already loaded, and is not "dir". Check
+ to see if it's changed since the last time it was loaded. */
+ if (stat (file_buffer->fullpath, &new_info) == -1)
+ {
+ filesys_error_number = errno;
+ return NULL;
+ }
+
+ old_info = &file_buffer->finfo;
+
+ if (new_info.st_size != old_info->st_size
+ || new_info.st_mtime != old_info->st_mtime)
+ {
+ /* The file has changed. Forget that we ever had loaded it
+ in the first place. */
+ forget_info_file (filename);
+ break;
+ }
+ else
+ {
+ /* The info file exists, and has not changed since the last
+ time it was loaded. If the caller requested a nodes list
+ for this file, and there isn't one here, build the nodes
+ for this file_buffer. In any case, return the file_buffer
+ object. */
+ if (!file_buffer->contents)
+ {
+ /* The file's contents have been gc'ed. Reload it. */
+ info_reload_file_buffer_contents (file_buffer);
+ if (!file_buffer->contents)
+ return NULL;
+ }
+
+ if (get_tags && !file_buffer->tags)
+ build_tags_and_nodes (file_buffer);
+
+ return file_buffer;
+ }
+ }
+ }
+
+ /* The file wasn't loaded. Try to load it now. */
+#if defined (HANDLE_MAN_PAGES)
+ /* If the name of the file that we want is our special file buffer for
+ Unix manual pages, then create the file buffer, and return it now. */
+ if (strcasecmp (filename, MANPAGE_FILE_BUFFER_NAME) == 0)
+ file_buffer = create_manpage_file_buffer ();
+ else
+#endif /* HANDLE_MAN_PAGES */
+ file_buffer = info_load_file_internal (filename, get_tags);
+
+ /* If the file was loaded, remember the name under which it was found. */
+ if (file_buffer)
+ remember_info_file (file_buffer);
+
+ return file_buffer;
+}
+
+/* The workhorse function for info_load_file (). Non-zero second argument
+ says to build a list of tags (or nodes) for this file. This is the
+ default behaviour when info_load_file () is called, but it is not
+ necessary when loading a subfile for which we already have tags. */
+static FILE_BUFFER *
+info_load_file_internal (char *filename, int get_tags)
+{
+ char *fullpath, *contents;
+ long filesize;
+ struct stat finfo;
+ int retcode, compressed;
+ FILE_BUFFER *file_buffer = NULL;
+
+ /* Get the full pathname of this file, as known by the info system.
+ That is to say, search along INFOPATH and expand tildes, etc. */
+ fullpath = info_find_fullpath (filename);
+
+ /* Did we actually find the file? */
+ retcode = stat (fullpath, &finfo);
+
+ /* If the file referenced by the name returned from info_find_fullpath ()
+ doesn't exist, then try again with the last part of the filename
+ appearing in lowercase. */
+ /* This is probably not needed at all on those systems which define
+ FILENAME_CMP to be strcasecmp. But let's do it anyway, lest some
+ network redirector supports case sensitivity. */
+ if (retcode < 0)
+ {
+ char *lowered_name;
+ char *tmp_basename;
+
+ lowered_name = xstrdup (filename);
+ tmp_basename = filename_non_directory (lowered_name);
+
+ while (*tmp_basename)
+ {
+ if (isupper (*tmp_basename))
+ *tmp_basename = tolower (*tmp_basename);
+
+ tmp_basename++;
+ }
+
+ fullpath = info_find_fullpath (lowered_name);
+
+ retcode = stat (fullpath, &finfo);
+ free (lowered_name);
+ }
+
+ /* If the file wasn't found, give up, returning a NULL pointer. */
+ if (retcode < 0)
+ {
+ filesys_error_number = errno;
+ return NULL;
+ }
+
+ /* Otherwise, try to load the file. */
+ contents = filesys_read_info_file (fullpath, &filesize, &finfo, &compressed);
+
+ if (!contents)
+ return NULL;
+
+ /* The file was found, and can be read. Allocate FILE_BUFFER and fill
+ in the various members. */
+ file_buffer = make_file_buffer ();
+ file_buffer->filename = xstrdup (filename);
+ file_buffer->fullpath = xstrdup (fullpath);
+ file_buffer->finfo = finfo;
+ file_buffer->filesize = filesize;
+ file_buffer->contents = contents;
+ if (compressed)
+ file_buffer->flags |= N_IsCompressed;
+
+ /* If requested, build the tags and nodes for this file buffer. */
+ if (get_tags)
+ build_tags_and_nodes (file_buffer);
+
+ return file_buffer;
+}
+
+/* Grovel FILE_BUFFER->contents finding tags and nodes, and filling in the
+ various slots. This can also be used to rebuild a tag or node table. */
+void
+build_tags_and_nodes (FILE_BUFFER *file_buffer)
+{
+ SEARCH_BINDING binding;
+ long position;
+
+ free_file_buffer_tags (file_buffer);
+ file_buffer->flags &= ~N_HasTagsTable;
+
+ /* See if there is a tags table in this info file. */
+ binding.buffer = file_buffer->contents;
+ binding.start = file_buffer->filesize;
+ binding.end = binding.start - 1000;
+ if (binding.end < 0)
+ binding.end = 0;
+ binding.flags = S_FoldCase;
+
+ position = search_backward (TAGS_TABLE_END_LABEL, &binding);
+
+ /* If there is a tag table, find the start of it, and grovel over it
+ extracting tag information. */
+ if (position != -1)
+ while (1)
+ {
+ long tags_table_begin, tags_table_end;
+
+ binding.end = position;
+ binding.start = binding.end - 5 - strlen (TAGS_TABLE_END_LABEL);
+ if (binding.start < 0)
+ binding.start = 0;
+
+ position = find_node_separator (&binding);
+
+ /* For this test, (and all others here) failure indicates a bogus
+ tags table. Grovel the file. */
+ if (position == -1)
+ break;
+
+ /* Remember the end of the tags table. */
+ binding.start = position;
+ tags_table_end = binding.start;
+ binding.end = 0;
+
+ /* Locate the start of the tags table. */
+ position = search_backward (TAGS_TABLE_BEG_LABEL, &binding);
+
+ if (position == -1)
+ break;
+
+ binding.end = position;
+ binding.start = binding.end - 5 - strlen (TAGS_TABLE_BEG_LABEL);
+ position = find_node_separator (&binding);
+
+ if (position == -1)
+ break;
+
+ /* The file contains a valid tags table. Fill the FILE_BUFFER's
+ tags member. */
+ file_buffer->flags |= N_HasTagsTable;
+ tags_table_begin = position;
+
+ /* If this isn't an indirect tags table, just remember the nodes
+ described locally in this tags table. Note that binding.end
+ is pointing to just after the beginning label. */
+ binding.start = binding.end;
+ binding.end = file_buffer->filesize;
+
+ if (!looking_at (TAGS_TABLE_IS_INDIRECT_LABEL, &binding))
+ {
+ binding.start = tags_table_begin;
+ binding.end = tags_table_end;
+ get_nodes_of_tags_table (file_buffer, &binding);
+ return;
+ }
+ else
+ {
+ /* This is an indirect tags table. Build TAGS member. */
+ SEARCH_BINDING indirect;
+
+ indirect.start = tags_table_begin;
+ indirect.end = 0;
+ indirect.buffer = binding.buffer;
+ indirect.flags = S_FoldCase;
+
+ position = search_backward (INDIRECT_TAGS_TABLE_LABEL, &indirect);
+
+ if (position == -1)
+ {
+ /* This file is malformed. Give up. */
+ return;
+ }
+
+ indirect.start = position;
+ indirect.end = tags_table_begin;
+ binding.start = tags_table_begin;
+ binding.end = tags_table_end;
+ get_tags_of_indirect_tags_table (file_buffer, &indirect, &binding);
+ return;
+ }
+ }
+
+ /* This file doesn't contain any kind of tags table. Grovel the
+ file and build node entries for it. */
+ get_nodes_of_info_file (file_buffer);
+}
+
+/* Search through FILE_BUFFER->contents building an array of TAG *,
+ one entry per each node present in the file. Store the tags in
+ FILE_BUFFER->tags, and the number of allocated slots in
+ FILE_BUFFER->tags_slots. */
+static void
+get_nodes_of_info_file (FILE_BUFFER *file_buffer)
+{
+ long nodestart;
+ int tags_index = 0;
+ SEARCH_BINDING binding;
+
+ binding.buffer = file_buffer->contents;
+ binding.start = 0;
+ binding.end = file_buffer->filesize;
+ binding.flags = S_FoldCase;
+
+ while ((nodestart = find_node_separator (&binding)) != -1)
+ {
+ int start, end;
+ char *nodeline;
+ TAG *entry;
+ int anchor = 0;
+
+ /* Skip past the characters just found. */
+ binding.start = nodestart;
+ binding.start += skip_node_separator (binding.buffer + binding.start);
+
+ /* Move to the start of the line defining the node. */
+ nodeline = binding.buffer + binding.start;
+
+ /* Find "Node:" */
+ start = string_in_line (INFO_NODE_LABEL, nodeline);
+ /* No Node:. Maybe it's a Ref:. */
+ if (start == -1)
+ {
+ start = string_in_line (INFO_REF_LABEL, nodeline);
+ if (start != -1)
+ anchor = 1;
+ }
+
+ /* If not there, this is not the start of a node. */
+ if (start == -1)
+ continue;
+
+ /* Find the start of the nodename. */
+ start += skip_whitespace (nodeline + start);
+
+ /* Find the end of the nodename. */
+ end = start +
+ skip_node_characters (nodeline + start, DONT_SKIP_NEWLINES);
+
+ /* Okay, we have isolated the node name, and we know where the
+ node starts. Remember this information. */
+ entry = xmalloc (sizeof (TAG));
+ entry->nodename = xmalloc (1 + (end - start));
+ strncpy (entry->nodename, nodeline + start, end - start);
+ entry->nodename[end - start] = 0;
+ entry->nodestart = nodestart;
+ if (anchor)
+ entry->nodelen = 0;
+ else
+ {
+ SEARCH_BINDING node_body;
+
+ node_body.buffer = binding.buffer + binding.start;
+ node_body.start = 0;
+ node_body.end = binding.end - binding.start;
+ node_body.flags = S_FoldCase;
+ entry->nodelen = get_node_length (&node_body);
+ }
+
+ entry->filename = file_buffer->fullpath;
+
+ /* Add this tag to the array of tag structures in this FILE_BUFFER. */
+ add_pointer_to_array (entry, tags_index, file_buffer->tags,
+ file_buffer->tags_slots, 100, TAG *);
+ }
+}
+
+/* Return the length of the node which starts at BINDING. */
+static long
+get_node_length (SEARCH_BINDING *binding)
+{
+ int i;
+ char *body;
+
+ /* [A node] ends with either a ^_, a ^L, or end of file. */
+ for (i = binding->start, body = binding->buffer; i < binding->end; i++)
+ {
+ if (body[i] == INFO_FF || body[i] == INFO_COOKIE)
+ break;
+ }
+ return i - binding->start;
+}
+
+/* Build and save the array of nodes in FILE_BUFFER by searching through the
+ contents of BUFFER_BINDING for a tags table, and groveling the contents. */
+static void
+get_nodes_of_tags_table (FILE_BUFFER *file_buffer,
+ SEARCH_BINDING *buffer_binding)
+{
+ int name_offset;
+ SEARCH_BINDING *tmp_search;
+ long position;
+ int tags_index = 0;
+
+ tmp_search = copy_binding (buffer_binding);
+
+ /* Find the start of the tags table. */
+ position = find_tags_table (tmp_search);
+
+ /* If none, we're all done. */
+ if (position == -1)
+ return;
+
+ /* Move to one character before the start of the actual table. */
+ tmp_search->start = position;
+ tmp_search->start += skip_node_separator
+ (tmp_search->buffer + tmp_search->start);
+ tmp_search->start += strlen (TAGS_TABLE_BEG_LABEL);
+ tmp_search->start--;
+
+ /* The tag table consists of lines containing node names and positions.
+ Do each line until we find one that doesn't contain a node name. */
+ while ((position = search_forward ("\n", tmp_search)) != -1)
+ {
+ TAG *entry;
+ char *nodedef;
+ unsigned p;
+ int anchor = 0;
+
+ /* Prepare to skip this line. */
+ tmp_search->start = position;
+ tmp_search->start++;
+
+ /* Skip past informative "(Indirect)" tags table line. */
+ if (!tags_index && looking_at (TAGS_TABLE_IS_INDIRECT_LABEL, tmp_search))
+ continue;
+
+ /* Find the label preceding the node name. */
+ name_offset =
+ string_in_line (INFO_NODE_LABEL, tmp_search->buffer + tmp_search->start);
+
+ /* If no node label, maybe it's an anchor. */
+ if (name_offset == -1)
+ {
+ name_offset = string_in_line (INFO_REF_LABEL,
+ tmp_search->buffer + tmp_search->start);
+ if (name_offset != -1)
+ anchor = 1;
+ }
+
+ /* If not there, not a defining line, so we must be out of the
+ tags table. */
+ if (name_offset == -1)
+ break;
+
+ entry = xmalloc (sizeof (TAG));
+
+ /* Find the beginning of the node definition. */
+ tmp_search->start += name_offset;
+ nodedef = tmp_search->buffer + tmp_search->start;
+ nodedef += skip_whitespace (nodedef);
+
+ /* Move past the node's name in this tag to the TAGSEP character. */
+ for (p = 0; nodedef[p] && nodedef[p] != INFO_TAGSEP; p++)
+ ;
+ if (nodedef[p] != INFO_TAGSEP)
+ continue;
+
+ entry->nodename = xmalloc (p + 1);
+ strncpy (entry->nodename, nodedef, p);
+ entry->nodename[p] = 0;
+ p++;
+ entry->nodestart = atol (nodedef + p);
+
+ /* If a node, we don't know the length yet, but if it's an
+ anchor, the length is 0. */
+ entry->nodelen = anchor ? 0 : -1;
+
+ /* The filename of this node is currently known as the same as the
+ name of this file. */
+ entry->filename = file_buffer->fullpath;
+
+ /* Add this node structure to the array of node structures in this
+ FILE_BUFFER. */
+ add_pointer_to_array (entry, tags_index, file_buffer->tags,
+ file_buffer->tags_slots, 100, TAG *);
+ }
+ free (tmp_search);
+}
+
+/* A structure used only in `get_tags_of_indirect_tags_table' to hold onto
+ an intermediate value. */
+typedef struct {
+ char *filename;
+ long first_byte;
+} SUBFILE;
+
+/* Remember in FILE_BUFFER the nodenames, subfilenames, and offsets within the
+ subfiles of every node which appears in TAGS_BINDING. The 2nd argument is
+ a binding surrounding the indirect files list. */
+static void
+get_tags_of_indirect_tags_table (FILE_BUFFER *file_buffer,
+ SEARCH_BINDING *indirect_binding, SEARCH_BINDING *tags_binding)
+{
+ int i;
+ SUBFILE **subfiles = NULL;
+ int subfiles_index = 0, subfiles_slots = 0;
+ TAG *entry;
+
+ /* First get the list of tags from the tags table. Then lookup the
+ associated file in the indirect list for each tag, and update it. */
+ get_nodes_of_tags_table (file_buffer, tags_binding);
+
+ /* We have the list of tags in file_buffer->tags. Get the list of
+ subfiles from the indirect table. */
+ {
+ char *start, *end, *line;
+ SUBFILE *subfile;
+
+ start = indirect_binding->buffer + indirect_binding->start;
+ end = indirect_binding->buffer + indirect_binding->end;
+ line = start;
+
+ while (line < end)
+ {
+ int colon;
+
+ colon = string_in_line (":", line);
+
+ if (colon == -1)
+ break;
+
+ subfile = (SUBFILE *)xmalloc (sizeof (SUBFILE));
+ subfile->filename = (char *)xmalloc (colon);
+ strncpy (subfile->filename, line, colon - 1);
+ subfile->filename[colon - 1] = 0;
+ subfile->first_byte = (long) atol (line + colon);
+
+ add_pointer_to_array
+ (subfile, subfiles_index, subfiles, subfiles_slots, 10, SUBFILE *);
+
+ while (*line++ != '\n');
+ }
+ }
+
+ /* If we have successfully built the indirect files table, then
+ merge the information in the two tables. */
+ if (!subfiles)
+ {
+ free_file_buffer_tags (file_buffer);
+ return;
+ }
+ else
+ {
+ int tags_index;
+ long header_length;
+ SEARCH_BINDING binding;
+
+ /* Find the length of the header of the file containing the indirect
+ tags table. This header appears at the start of every file. We
+ want the absolute position of each node within each subfile, so
+ we subtract the start of the containing subfile from the logical
+ position of the node, and then add the length of the header in. */
+ binding.buffer = file_buffer->contents;
+ binding.start = 0;
+ binding.end = file_buffer->filesize;
+ binding.flags = S_FoldCase;
+
+ header_length = find_node_separator (&binding);
+ if (header_length == -1)
+ header_length = 0;
+
+ /* Build the file buffer's list of subfiles. */
+ {
+ char *containing_dir = xstrdup (file_buffer->fullpath);
+ char *temp = filename_non_directory (containing_dir);
+ int len_containing_dir;
+
+ if (temp > containing_dir)
+ {
+ if (HAVE_DRIVE (file_buffer->fullpath) &&
+ temp == containing_dir + 2)
+ {
+ /* Avoid converting "d:foo" into "d:/foo" below. */
+ *temp = '.';
+ temp += 2;
+ }
+ temp[-1] = 0;
+ }
+
+ len_containing_dir = strlen (containing_dir);
+
+ for (i = 0; subfiles[i]; i++);
+
+ file_buffer->subfiles = (char **) xmalloc ((1 + i) * sizeof (char *));
+
+ for (i = 0; subfiles[i]; i++)
+ {
+ char *fullpath;
+
+ fullpath = (char *) xmalloc
+ (2 + strlen (subfiles[i]->filename) + len_containing_dir);
+
+ sprintf (fullpath, "%s/%s",
+ containing_dir, subfiles[i]->filename);
+
+ file_buffer->subfiles[i] = fullpath;
+ }
+ file_buffer->subfiles[i] = NULL;
+ free (containing_dir);
+ }
+
+ /* For each node in the file's tags table, remember the starting
+ position. */
+ for (tags_index = 0; (entry = file_buffer->tags[tags_index]);
+ tags_index++)
+ {
+ for (i = 0;
+ subfiles[i] && entry->nodestart >= subfiles[i]->first_byte;
+ i++);
+
+ /* If the Info file containing the indirect tags table is
+ malformed, then give up. */
+ if (!i)
+ {
+ /* The Info file containing the indirect tags table is
+ malformed. Give up. */
+ for (i = 0; subfiles[i]; i++)
+ {
+ free (subfiles[i]->filename);
+ free (subfiles[i]);
+ free (file_buffer->subfiles[i]);
+ }
+ file_buffer->subfiles = NULL;
+ free_file_buffer_tags (file_buffer);
+ return;
+ }
+
+ /* SUBFILES[i] is the index of the first subfile whose logical
+ first byte is greater than the logical offset of this node's
+ starting position. This means that the subfile directly
+ preceding this one is the one containing the node. */
+
+ entry->filename = file_buffer->subfiles[i - 1];
+ entry->nodestart -= subfiles[i - 1]->first_byte;
+ entry->nodestart += header_length;
+ }
+
+ /* We have successfully built the tags table. Remember that it
+ was indirect. */
+ file_buffer->flags |= N_TagsIndirect;
+ }
+
+ /* Free the structures assigned to SUBFILES. Free the names as well
+ as the structures themselves, then finally, the array. */
+ for (i = 0; subfiles[i]; i++)
+ {
+ free (subfiles[i]->filename);
+ free (subfiles[i]);
+ }
+ free (subfiles);
+}
+
+
+/* Return the node that contains TAG in FILE_BUFFER, else
+ (pathologically) NULL. Called from info_node_of_file_buffer_tags. */
+static NODE *
+find_node_of_anchor (FILE_BUFFER *file_buffer, TAG *tag)
+{
+ int anchor_pos, node_pos;
+ TAG *node_tag;
+ NODE *node;
+
+ /* Look through the tag list for the anchor. */
+ for (anchor_pos = 0; file_buffer->tags[anchor_pos]; anchor_pos++)
+ {
+ TAG *t = file_buffer->tags[anchor_pos];
+ if (t->nodestart == tag->nodestart)
+ break;
+ }
+
+ /* Should not happen, because we should always find the anchor. */
+ if (!file_buffer->tags[anchor_pos])
+ return NULL;
+
+ /* We've found the anchor. Look backwards in the tag table for the
+ preceding node (we're assuming the tags are given in order),
+ skipping over any preceding anchors. */
+ for (node_pos = anchor_pos - 1;
+ node_pos >= 0 && file_buffer->tags[node_pos]->nodelen == 0;
+ node_pos--)
+ ;
+
+ /* An info file with an anchor before any nodes is pathological, but
+ it's possible, so don't crash. */
+ if (node_pos < 0)
+ return NULL;
+
+ /* We have the tag for the node that contained the anchor tag. */
+ node_tag = file_buffer->tags[node_pos];
+
+ /* Look up the node name in the tag table to get the actual node.
+ This is a recursive call, but it can't recurse again, because we
+ call it with a real node. */
+ node = info_node_of_file_buffer_tags (file_buffer, node_tag->nodename);
+
+ /* Start displaying the node at the anchor position. */
+ if (node)
+ { /* The nodestart for real nodes is three characters before the `F'
+ in the `File:' line (a newline, the CTRL-_, and another
+ newline). The nodestart for anchors is the actual position.
+ But we offset by only 2, rather than 3, because if an anchor is
+ at the beginning of a paragraph, it's nicer for it to end up on
+ the beginning of the first line of the paragraph rather than
+ the blank line before it. (makeinfo has no way of knowing that
+ a paragraph is going to start, so we can't fix it there.) */
+ node->display_pos = file_buffer->tags[anchor_pos]->nodestart
+ - (node_tag->nodestart + 2);
+
+ /* Otherwise an anchor at the end of a node ends up displaying at
+ the end of the last line of the node (way over on the right of
+ the screen), which looks wrong. */
+ if (node->display_pos >= (unsigned long) node->nodelen)
+ node->display_pos = node->nodelen - 1;
+
+ /* Don't search in the node for the xref text, it's not there. */
+ node->flags |= N_FromAnchor;
+ }
+
+ return node;
+}
+
+
+/* Return the node from FILE_BUFFER which matches NODENAME by searching
+ the tags table in FILE_BUFFER, or NULL. */
+static NODE *
+info_node_of_file_buffer_tags (FILE_BUFFER *file_buffer, char *nodename)
+{
+ TAG *tag;
+ int i;
+
+ /* If no tags at all (possibly a misformatted info file), quit. */
+ if (!file_buffer->tags) {
+ return NULL;
+ }
+
+ for (i = 0; (tag = file_buffer->tags[i]); i++)
+ if (strcmp (nodename, tag->nodename) == 0)
+ {
+ FILE_BUFFER *subfile = info_find_file_internal (tag->filename,
+ INFO_NO_TAGS);
+ if (!subfile)
+ return NULL;
+
+ if (!subfile->contents)
+ {
+ info_reload_file_buffer_contents (subfile);
+ if (!subfile->contents)
+ return NULL;
+ }
+
+ /* If we were able to find this file and load it, then return
+ the node within it. */
+ {
+ NODE *node = xmalloc (sizeof (NODE));
+ node->filename = subfile->fullpath;
+ node->parent = NULL;
+ node->nodename = tag->nodename;
+ node->contents = subfile->contents + tag->nodestart;
+ node->display_pos = 0;
+ node->flags = 0;
+
+ if (file_buffer->flags & N_HasTagsTable)
+ {
+ node->flags |= N_HasTagsTable;
+
+ if (file_buffer->flags & N_TagsIndirect)
+ {
+ node->flags |= N_TagsIndirect;
+ node->parent = file_buffer->fullpath;
+ }
+ }
+
+ if (subfile->flags & N_IsCompressed)
+ node->flags |= N_IsCompressed;
+
+ /* If TAG->nodelen hasn't been calculated yet, then we aren't
+ in a position to trust the entry pointer. Adjust things so
+ that ENTRY->nodestart gets the exact address of the start of
+ the node separator which starts this node, and NODE->contents
+ gets the address of the line defining this node. If we cannot
+ do that, the node isn't really here. */
+ if (tag->nodelen == -1)
+ {
+ int min, max;
+ char *node_sep;
+ SEARCH_BINDING node_body;
+ char *buff_end;
+
+ min = max = DEFAULT_INFO_FUDGE;
+
+ if (tag->nodestart < DEFAULT_INFO_FUDGE)
+ min = tag->nodestart;
+
+ if (DEFAULT_INFO_FUDGE >
+ (subfile->filesize - tag->nodestart))
+ max = subfile->filesize - tag->nodestart;
+
+ /* NODE_SEP gets the address of the separator which defines
+ this node, or NULL if the node wasn't found.
+ NODE->contents is side-effected to point to right after
+ the separator. */
+ node_sep = adjust_nodestart (node, min, max);
+ if (node_sep == NULL)
+ {
+ free (node);
+ return NULL;
+ }
+ /* Readjust tag->nodestart. */
+ tag->nodestart = node_sep - subfile->contents;
+
+ /* Calculate the length of the current node. */
+ buff_end = subfile->contents + subfile->filesize;
+
+ node_body.buffer = node->contents;
+ node_body.start = 0;
+ node_body.end = buff_end - node_body.buffer;
+ node_body.flags = 0;
+ tag->nodelen = get_node_length (&node_body);
+ node->nodelen = tag->nodelen;
+ }
+
+ else if (tag->nodelen == 0) /* anchor, return containing node */
+ {
+ free (node);
+ node = find_node_of_anchor (file_buffer, tag);
+ }
+
+ else
+ {
+ /* Since we know the length of this node, we have already
+ adjusted tag->nodestart to point to the exact start of
+ it. Simply skip the node separator. */
+ node->contents += skip_node_separator (node->contents);
+ node->nodelen = tag->nodelen;
+ }
+
+ return node;
+ }
+ }
+
+ /* There was a tag table for this file, and the node wasn't found.
+ Return NULL, since this file doesn't contain the desired node. */
+ return NULL;
+}
+
+/* Managing file_buffers, nodes, and tags. */
+
+/* Create a new, empty file buffer. */
+FILE_BUFFER *
+make_file_buffer (void)
+{
+ FILE_BUFFER *file_buffer = xmalloc (sizeof (FILE_BUFFER));
+
+ file_buffer->filename = file_buffer->fullpath = NULL;
+ file_buffer->contents = NULL;
+ file_buffer->tags = NULL;
+ file_buffer->subfiles = NULL;
+ file_buffer->tags_slots = 0;
+ file_buffer->flags = 0;
+
+ return file_buffer;
+}
+
+/* Add FILE_BUFFER to our list of already loaded info files. */
+static void
+remember_info_file (FILE_BUFFER *file_buffer)
+{
+ int i;
+
+ for (i = 0; info_loaded_files && info_loaded_files[i]; i++)
+ ;
+
+ add_pointer_to_array (file_buffer, i, info_loaded_files,
+ info_loaded_files_slots, 10, FILE_BUFFER *);
+}
+
+/* Forget the contents, tags table, nodes list, and names of FILENAME. */
+static void
+forget_info_file (char *filename)
+{
+ int i;
+ FILE_BUFFER *file_buffer;
+
+ if (!info_loaded_files)
+ return;
+
+ for (i = 0; (file_buffer = info_loaded_files[i]); i++)
+ if (FILENAME_CMP (filename, file_buffer->filename) == 0
+ || FILENAME_CMP (filename, file_buffer->fullpath) == 0)
+ {
+ free (file_buffer->filename);
+ free (file_buffer->fullpath);
+
+ if (file_buffer->contents)
+ free (file_buffer->contents);
+
+ /* free_file_buffer_tags () also kills the subfiles list, since
+ the subfiles list is only of use in conjunction with tags. */
+ free_file_buffer_tags (file_buffer);
+
+ /* Move rest of list down. */
+ while (info_loaded_files[i + 1])
+ {
+ info_loaded_files[i] = info_loaded_files[i + 1];
+ i++;
+ }
+ info_loaded_files[i] = 0;
+
+ break;
+ }
+}
+
+/* Free the tags (if any) associated with FILE_BUFFER. */
+static void
+free_file_buffer_tags (FILE_BUFFER *file_buffer)
+{
+ int i;
+
+ if (file_buffer->tags)
+ {
+ TAG *tag;
+
+ for (i = 0; (tag = file_buffer->tags[i]); i++)
+ free_info_tag (tag);
+
+ free (file_buffer->tags);
+ file_buffer->tags = NULL;
+ file_buffer->tags_slots = 0;
+ }
+
+ if (file_buffer->subfiles)
+ {
+ for (i = 0; file_buffer->subfiles[i]; i++)
+ free (file_buffer->subfiles[i]);
+
+ free (file_buffer->subfiles);
+ file_buffer->subfiles = NULL;
+ }
+}
+
+/* Free the data associated with TAG, as well as TAG itself. */
+static void
+free_info_tag (TAG *tag)
+{
+ free (tag->nodename);
+
+ /* We don't free tag->filename, because that filename is part of the
+ subfiles list for the containing FILE_BUFFER. free_info_tags ()
+ will free the subfiles when it is appropriate. */
+
+ free (tag);
+}
+
+/* Load the contents of FILE_BUFFER->contents. This function is called
+ when a file buffer was loaded, and then in order to conserve memory, the
+ file buffer's contents were freed and the pointer was zero'ed. Note that
+ the file was already loaded at least once successfully, so the tags and/or
+ nodes members are still correctly filled. */
+static void
+info_reload_file_buffer_contents (FILE_BUFFER *fb)
+{
+ int is_compressed;
+
+#if defined (HANDLE_MAN_PAGES)
+ /* If this is the magic manpage node, don't try to reload, just give up. */
+ if (fb->flags & N_IsManPage)
+ return;
+#endif
+
+ fb->flags &= ~N_IsCompressed;
+
+ /* Let the filesystem do all the work for us. */
+ fb->contents =
+ filesys_read_info_file (fb->fullpath, &(fb->filesize), &(fb->finfo),
+ &is_compressed);
+ if (is_compressed)
+ fb->flags |= N_IsCompressed;
+}
+
+/* Return the actual starting memory location of NODE, side-effecting
+ NODE->contents. MIN and MAX are bounds for a search if one is necessary.
+ Because of the way that tags are implemented, the physical nodestart may
+ not actually be where the tag says it is. If that is the case, but the
+ node was found anyway, set N_UpdateTags in NODE->flags. If the node is
+ found, return non-zero. NODE->contents is returned positioned right after
+ the node separator that precedes this node, while the return value is
+ position directly on the separator that precedes this node. If the node
+ could not be found, return a NULL pointer. */
+static char *
+adjust_nodestart (NODE *node, int min, int max)
+{
+ long position;
+ SEARCH_BINDING node_body;
+
+ /* Define the node body. */
+ node_body.buffer = node->contents;
+ node_body.start = 0;
+ node_body.end = max;
+ node_body.flags = 0;
+
+ /* Try the optimal case first. Who knows? This file may actually be
+ formatted (mostly) correctly. */
+ if (node_body.buffer[0] != INFO_COOKIE && min > 2)
+ node_body.buffer -= 3;
+
+ position = find_node_separator (&node_body);
+
+ /* If we found a node start, then check it out. */
+ if (position != -1)
+ {
+ int sep_len;
+
+ sep_len = skip_node_separator (node->contents);
+
+ /* If we managed to skip a node separator, then check for this node
+ being the right one. */
+ if (sep_len != 0)
+ {
+ char *nodedef, *nodestart;
+ int offset;
+
+ nodestart = node_body.buffer + position + sep_len;
+ nodedef = nodestart;
+ offset = string_in_line (INFO_NODE_LABEL, nodedef);
+
+ if (offset != -1)
+ {
+ nodedef += offset;
+ nodedef += skip_whitespace (nodedef);
+ offset = skip_node_characters (nodedef, DONT_SKIP_NEWLINES);
+ if (((unsigned int) offset == strlen (node->nodename)) &&
+ (strncmp (node->nodename, nodedef, offset) == 0))
+ {
+ node->contents = nodestart;
+ return node_body.buffer + position;
+ }
+ }
+ }
+ }
+
+ /* Oh well, I guess we have to try to find it in a larger area. */
+ node_body.buffer = node->contents - min;
+ node_body.start = 0;
+ node_body.end = min + max;
+ node_body.flags = 0;
+
+ position = find_node_in_binding (node->nodename, &node_body);
+
+ /* If the node couldn't be found, we lose big. */
+ if (position == -1)
+ return NULL;
+
+ /* Otherwise, the node was found, but the tags table could need updating
+ (if we used a tag to get here, that is). Set the flag in NODE->flags. */
+ node->contents = node_body.buffer + position;
+ node->contents += skip_node_separator (node->contents);
+ if (node->flags & N_HasTagsTable)
+ node->flags |= N_UpdateTags;
+ return node_body.buffer + position;
+}
diff --git a/Build/source/utils/texinfo/info/nodes.h b/Build/source/utils/texinfo/info/nodes.h
new file mode 100644
index 00000000000..e2fbabea172
--- /dev/null
+++ b/Build/source/utils/texinfo/info/nodes.h
@@ -0,0 +1,156 @@
+/* nodes.h -- How we represent nodes internally.
+ $Id: nodes.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef NODES_H
+#define NODES_H
+
+#include "info.h"
+
+/* User code interface. */
+
+/* Callers generally only want the node itself. This structure is used
+ to pass node information around. None of the information in this
+ structure should ever be directly freed. The structure itself can
+ be passed to free (). Note that NODE->parent is non-null if this
+ node's file is a subfile. In that case, NODE->parent is the logical
+ name of the file containing this node. Both names are given as full
+ paths, so you might have: node->filename = "/usr/gnu/info/emacs-1",
+ with node->parent = "/usr/gnu/info/emacs". */
+typedef struct {
+ char *filename; /* The physical file containing this node. */
+ char *parent; /* Non-null is the logical file name. */
+ char *nodename; /* The name of this node. */
+ char *contents; /* Characters appearing in this node. */
+ long nodelen; /* The length of the CONTENTS member. */
+ unsigned long display_pos; /* Where to display at, if nonzero. */
+ int flags; /* See immediately below. */
+} NODE;
+
+/* Defines that can appear in NODE->flags. All informative. */
+#define N_HasTagsTable 0x01 /* This node was found through a tags table. */
+#define N_TagsIndirect 0x02 /* The tags table was an indirect one. */
+#define N_UpdateTags 0x04 /* The tags table is out of date. */
+#define N_IsCompressed 0x08 /* The file is compressed on disk. */
+#define N_IsInternal 0x10 /* This node was made by Info. */
+#define N_CannotGC 0x20 /* File buffer cannot be gc'ed. */
+#define N_IsManPage 0x40 /* This node is a manpage. */
+#define N_FromAnchor 0x80 /* Synthesized for an anchor reference. */
+
+/* Internal data structures. */
+
+/* String constants. */
+#define INFO_FILE_LABEL "File:"
+#define INFO_REF_LABEL "Ref:"
+#define INFO_NODE_LABEL "Node:"
+#define INFO_PREV_LABEL "Prev:"
+#define INFO_ALTPREV_LABEL "Previous:"
+#define INFO_NEXT_LABEL "Next:"
+#define INFO_UP_LABEL "Up:"
+#define INFO_MENU_LABEL "\n* Menu:"
+#define INFO_MENU_ENTRY_LABEL "\n* "
+#define INFO_XREF_LABEL "*Note"
+#define TAGS_TABLE_END_LABEL "\nEnd Tag Table"
+#define TAGS_TABLE_BEG_LABEL "Tag Table:\n"
+#define INDIRECT_TAGS_TABLE_LABEL "Indirect:\n"
+#define TAGS_TABLE_IS_INDIRECT_LABEL "(Indirect)"
+
+/* Character constants. */
+#define INFO_COOKIE '\037'
+#define INFO_FF '\014'
+#define INFO_TAGSEP '\177'
+
+/* For each logical file that we have loaded, we keep a list of the names
+ of the nodes that are found in that file. A pointer to a node in an
+ info file is called a "tag". For split files, the tag pointer is
+ "indirect"; that is, the pointer also contains the name of the split
+ file where the node can be found. For non-split files, the filename
+ member in the structure below simply contains the name of the current
+ file. The following structure describes a single node within a file. */
+typedef struct {
+ char *filename; /* The file where this node can be found. */
+ char *nodename; /* The node pointed to by this tag. */
+ long nodestart; /* The offset of the start of this node. */
+ long nodelen; /* The length of this node. */
+} TAG;
+
+/* The following structure is used to remember information about the contents
+ of Info files that we have loaded at least once before. The FINFO member
+ is present so that we can reload the file if it has been modified since
+ last being loaded. All of the arrays appearing within this structure
+ are NULL terminated, and each array which can change size has a
+ corresponding SLOTS member which says how many slots have been allocated
+ (with malloc ()) for this array. */
+typedef struct {
+ char *filename; /* The filename used to find this file. */
+ char *fullpath; /* The full pathname of this info file. */
+ struct stat finfo; /* Information about this file. */
+ char *contents; /* The contents of this particular file. */
+ long filesize; /* The number of bytes this file expands to. */
+ char **subfiles; /* If non-null, the list of subfiles. */
+ TAG **tags; /* If non-null, the indirect tags table. */
+ int tags_slots; /* Number of slots allocated for TAGS. */
+ int flags; /* Various flags. Mimics of N_* flags. */
+} FILE_BUFFER;
+
+/* Externally visible functions. */
+
+/* Array of FILE_BUFFER * which represents the currently loaded info files. */
+extern FILE_BUFFER **info_loaded_files;
+
+/* The number of slots currently allocated to INFO_LOADED_FILES. */
+extern int info_loaded_files_slots;
+
+/* Locate the file named by FILENAME, and return the information structure
+ describing this file. The file may appear in our list of loaded files
+ already, or it may not. If it does not already appear, find the file,
+ and add it to the list of loaded files. If the file cannot be found,
+ return a NULL FILE_BUFFER *. */
+extern FILE_BUFFER *info_find_file (char *filename);
+
+/* Force load the file named FILENAME, and return the information structure
+ describing this file. Even if the file was already loaded, this loads
+ a new buffer, rebuilds tags and nodes, and returns a new FILE_BUFFER *. */
+extern FILE_BUFFER *info_load_file (char *filename);
+
+/* Return a pointer to a NODE structure for the Info node (FILENAME)NODENAME.
+ FILENAME can be passed as NULL, in which case the filename of "dir" is used.
+ NODENAME can be passed as NULL, in which case the nodename of "Top" is used.
+ If the node cannot be found, return a NULL pointer. */
+extern NODE *info_get_node (char *filename, char *nodename);
+
+/* Return a pointer to a NODE structure for the Info node NODENAME in
+ FILE_BUFFER. NODENAME can be passed as NULL, in which case the
+ nodename of "Top" is used. If the node cannot be found, return a
+ NULL pointer. */
+extern NODE *info_get_node_of_file_buffer (char *nodename,
+ FILE_BUFFER *file_buffer);
+
+/* Grovel FILE_BUFFER->contents finding tags and nodes, and filling in the
+ various slots. This can also be used to rebuild a tag or node table. */
+extern void build_tags_and_nodes (FILE_BUFFER *file_buffer);
+
+/* When non-zero, this is a string describing the most recent file error. */
+extern char *info_recent_file_error;
+
+/* Create a new, empty file buffer. */
+extern FILE_BUFFER *make_file_buffer (void);
+
+#endif /* not NODES_H */
diff --git a/Build/source/utils/texinfo/info/pcterm.c b/Build/source/utils/texinfo/info/pcterm.c
new file mode 100644
index 00000000000..ed348dc54d1
--- /dev/null
+++ b/Build/source/utils/texinfo/info/pcterm.c
@@ -0,0 +1,759 @@
+/* pcterm.c -- How to handle the PC terminal for Info under MS-DOS/MS-Windows.
+ $Id: pcterm.c,v 1.4 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1998, 1999, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+
+/* WARNING WARNING WARNING!!!
+ This probably won't work as is with anything but DJGPP! However, Borland
+ should come close, and other PC compilers will need minor modifications. */
+
+/* intl/libintl.h defines a macro `gettext' which
+ conflicts with conio.h header. */
+#ifdef gettext
+# undef gettext
+# define gettext _gettext
+#endif
+
+#include <pc.h>
+#include <keys.h>
+#include <conio.h>
+
+#include "variables.h"
+
+extern int speech_friendly; /* defined in info.c */
+
+/* **************************************************************** */
+/* */
+/* PC Terminal Output Functions */
+/* */
+/* **************************************************************** */
+
+static struct text_info outside_info; /* holds screen params outside Info */
+static unsigned char norm_attr, inv_attr;
+
+static unsigned const char * find_sequence (int);
+
+/* Turn on reverse video. */
+static void
+pc_begin_inverse (void)
+{
+ textattr (inv_attr);
+}
+
+/* Turn off reverse video. */
+static void
+pc_end_inverse (void)
+{
+ textattr (norm_attr);
+}
+
+/* Move the cursor up one line. */
+static void
+pc_up_line (void)
+{
+ int x, y;
+ ScreenGetCursor (&y, &x);
+ ScreenSetCursor (MAX (y-1, 0), x);
+}
+
+/* Move the cursor down one line. */
+static void
+pc_down_line (void)
+{
+ int x, y;
+ ScreenGetCursor (&y, &x);
+ ScreenSetCursor (MIN (screenheight-1, y+1), x);
+}
+
+/* Clear the entire terminal screen. */
+static void
+pc_clear_screen (void)
+{
+ ScreenClear ();
+}
+
+/* Clear from the current position of the cursor to the end of the line. */
+static void
+pc_clear_to_eol (void)
+{
+ clreol (); /* perhaps to be replaced by a loop */
+}
+
+/* Set the global variables SCREENWIDTH and SCREENHEIGHT. */
+static void
+pc_get_screen_size(void)
+{
+ /* Current screen dimensions are the default. */
+ if (!outside_info.screenheight) /* paranoia */
+ gettextinfo (&outside_info);
+ screenwidth = outside_info.screenwidth;
+ screenheight = outside_info.screenheight;
+
+ /* Environment variable "LINES" overrides the default. */
+ if (getenv ("LINES") != NULL)
+ screenheight = atoi (getenv ("LINES"));
+
+ /* Environment variable "INFO_LINES" overrides "LINES". */
+ if (getenv ("INFO_LINES") != NULL)
+ screenheight = atoi (getenv ("INFO_LINES"));
+}
+
+/* Move the cursor to the terminal location of X and Y. */
+static void
+pc_goto_xy (x, y)
+ int x, y;
+{
+ ScreenSetCursor (y, x); /* yes, pc.h says ScreenSetCursor (row, column) !! */
+}
+
+/* Print STRING to the terminal at the current position. */
+static void
+pc_put_text (string)
+ char *string;
+{
+ if (speech_friendly)
+ fputs (string, stdout);
+ else
+ cputs (string);
+}
+
+/* Ring the terminal bell. The bell is rung visibly if the terminal is
+ capable of doing that, and if terminal_use_visible_bell_p is non-zero. */
+static void
+pc_ring_bell(void)
+{
+ if (terminal_has_visible_bell_p && terminal_use_visible_bell_p)
+ ScreenVisualBell ();
+ else
+ {
+ printf ("%c",'\a');
+ fflush (stdout);
+ }
+}
+
+/* Print NCHARS from STRING to the terminal at the current position. */
+static void
+pc_write_chars (string, nchars)
+ char *string;
+ int nchars;
+{
+ if (!nchars)
+ return;
+
+ if (speech_friendly)
+ printf ("%.*s",nchars, string);
+ else
+ cprintf ("%..*s",nchars, string);
+}
+
+/* Scroll an area of the terminal from START to (and excluding) END,
+ AMOUNT lines. If AMOUNT is negative, the lines are scrolled
+ towards the top of the screen, else they are scrolled towards the
+ bottom of the screen. The lines of the old region which do not
+ overlap the new region are cleared, to mimic terminal operation. */
+static void
+pc_scroll_terminal (start, end, amount)
+ int start, end, amount;
+{
+ int line_to_clear = amount > 0 ? start : end + amount;
+
+ /* Move the text. Note that `movetext' expects 1-based coordinates. */
+ movetext (1, start + 1, ScreenCols (), end, 1, start + amount + 1);
+
+ /* Now clear the lines which were left unoccupied. */
+ if (amount < 0)
+ amount = -amount;
+ while (amount--)
+ {
+ ScreenSetCursor (line_to_clear++, 0);
+ clreol ();
+ }
+}
+
+/* Put the screen in the video mode and colors which Info will use.
+ Prepare to start using the terminal to read characters singly. */
+static void
+pc_prep_terminal (void)
+{
+ int tty;
+
+ /* Do not set screen height if we already have it, because
+ doing so erases the screen. */
+ if (screenheight != ScreenRows ())
+ _set_screen_lines (screenheight);
+
+ /* Don't fail if they asked for screen dimensions that their
+ hardware cannot support. */
+ screenheight = ScreenRows ();
+ screenwidth = ScreenCols ();
+
+ /* Try setting the colors user asked for. */
+ textattr (norm_attr);
+ ScreenClear ();
+
+ /* Switch console reads to binary mode. */
+ tty = fileno (stdin);
+#ifdef __DJGPP__
+ setmode (tty, O_BINARY);
+ __djgpp_set_ctrl_c (1); /* re-enable SIGINT generation by Ctrl-C */
+#endif
+}
+
+/* Restore the tty settings back to what they were before we started using
+ this terminal. */
+static void
+pc_unprep_terminal (void)
+{
+ int tty;
+
+ textattr (outside_info.normattr);
+
+ /* Do not set screen height if we already have it, because
+ doing so erases the screen. */
+ if (outside_info.screenheight != ScreenRows ())
+ {
+ _set_screen_lines (outside_info.screenheight);
+ textmode (LASTMODE);
+ }
+ else
+ pc_clear_to_eol (); /* for text attributes to really take effect */
+
+ /* Switch back to text mode on stdin. */
+ tty = fileno (stdin);
+#ifdef __DJGPP__
+ setmode (tty, O_TEXT);
+#endif
+}
+
+/* Initialize the terminal which is known as TERMINAL_NAME. If this
+ terminal doesn't have cursor addressability, `terminal_is_dumb_p'
+ becomes nonzero. The variables SCREENHEIGHT and SCREENWIDTH are set
+ to the dimensions that this terminal actually has. The variable
+ TERMINAL_HAS_META_P becomes nonzero if this terminal supports a Meta
+ key. Finally, the terminal screen is cleared. */
+static void
+pc_initialize_terminal (term_name)
+ char *term_name;
+{
+ char *info_colors;
+
+ if (!term_name)
+ {
+ term_name = getenv ("TERM");
+ if (!term_name)
+ term_name = "pc-dos"; /* ``what's in a name?'' */
+ }
+
+ /* Get current video information, to be restored later. */
+ if (outside_info.screenwidth == 0)
+ gettextinfo (&outside_info);
+
+ /* Current screen colors are the default. */
+ norm_attr = outside_info.normattr;
+ inv_attr = (((outside_info.normattr & 7) << 4) |
+ ((outside_info.normattr & 0x7f) >> 4));
+
+ /* Does the user want non-default colors? */
+ info_colors = getenv ("INFO_COLORS");
+ if ((info_colors != (char *)0) && !speech_friendly)
+ {
+ /* Decode a color from a string descriptor.
+ The descriptor string is a sequence of color specifiers separated
+ by a non-numeric character. Each color specifier should represent
+ a small integer which fits into an unsigned char, and can be given
+ in any base supported by strtoul. Examples of valid descriptors:
+
+ "10 31"
+ "0x13/0x45"
+ "007.077"
+
+ The separator between two color specifiers can be any character which
+ cannot be used in a printed representation of an integer number. */
+ char *endp;
+ unsigned long color_desc = strtoul (info_colors, &endp, 0);
+
+ if (color_desc <= UCHAR_MAX)
+ {
+ norm_attr = (unsigned char)color_desc;
+ color_desc = strtoul (endp + 1, &endp, 0);
+ if (color_desc <= UCHAR_MAX)
+ inv_attr = (unsigned char)color_desc;
+ }
+ }
+
+ /* We can scroll. */
+ terminal_can_scroll = 1;
+
+ /* We know how to produce a visible bell, if somebody's looking... */
+ if (!speech_friendly)
+ terminal_has_visible_bell_p = 1;
+
+ /* We have a Meta key. */
+ terminal_has_meta_p = 1;
+
+ /* We are *certainly* NOT dumb! */
+ terminal_is_dumb_p = 0;
+
+ pc_get_screen_size ();
+
+ /* Store the arrow keys. */
+ term_ku = (char *)find_sequence (K_Up);
+ term_kd = (char *)find_sequence (K_Down);
+ term_kr = (char *)find_sequence (K_Right);
+ term_kl = (char *)find_sequence (K_Left);
+
+ term_kP = (char *)find_sequence (K_PageUp);
+ term_kN = (char *)find_sequence (K_PageDown);
+
+#if defined(INFOKEY)
+ term_kh = (char *)find_sequence (K_Home);
+ term_ke = (char *)find_sequence (K_End);
+ term_ki = (char *)find_sequence (K_Insert);
+ term_kx = (char *)find_sequence (K_Delete);
+#endif
+
+ /* Set all the hooks to our PC-specific functions. */
+ terminal_begin_inverse_hook = pc_begin_inverse;
+ terminal_end_inverse_hook = pc_end_inverse;
+ terminal_prep_terminal_hook = pc_prep_terminal;
+ terminal_unprep_terminal_hook = pc_unprep_terminal;
+ terminal_up_line_hook = pc_up_line;
+ terminal_down_line_hook = pc_down_line;
+ terminal_clear_screen_hook = pc_clear_screen;
+ terminal_clear_to_eol_hook = pc_clear_to_eol;
+ terminal_get_screen_size_hook = pc_get_screen_size;
+ terminal_goto_xy_hook = pc_goto_xy;
+ terminal_put_text_hook = pc_put_text;
+ terminal_ring_bell_hook = pc_ring_bell;
+ terminal_write_chars_hook = pc_write_chars;
+ terminal_scroll_terminal_hook = pc_scroll_terminal;
+}
+
+/* **************************************************************** */
+/* */
+/* How to Read Characters From the PC Terminal */
+/* */
+/* **************************************************************** */
+
+/* This will most certainly work ONLY with DJGPP. */
+#ifdef __DJGPP__
+
+#include <errno.h>
+#include <sys/fsext.h>
+#include <dpmi.h>
+
+/* Translation table for some special keys.
+ Arrow keys which are standard on other keyboards are translated into
+ standard ESC-sequences, in case somebody rebinds the simple keys
+ (like C-f, C-b, C-n, etc.).
+
+ The strange "\033\061" prefix in some keys is a numeric argument of
+ one, which means ``do the next command once''. It is here so that
+ when the according PC key is pressed in the middle of an incremental
+ search, Info doesn't see just an ASCII character like `n' or `B',
+ and doesn't add it to the search string; instead, it will exit the
+ incremental search and then perform the command. */
+static struct
+{
+ int inkey;
+ unsigned char const * const sequence;
+} DJGPP_keytab[] = { /* these are for moving between nodes... */
+ {K_Control_PageDown, "\033\061n"},
+ {K_Control_PageUp, "\033\061p"},
+ {K_Control_Up, "\033\061u"},
+ {K_Control_Down, "\033\061m"},
+ {K_Control_Center, "\033\061l"},
+
+#if defined(INFOKEY)
+ {K_Home, "\033[H"}, /* ...and these are for moving IN a node */
+ {K_End, "\033[F"}, /* they're Numeric-Keypad-Keys, so */
+#else
+ {K_Home, "\001"},
+ {K_End, "\005"},
+#endif
+ {K_Left, "\033[D"}, /* NUMLOCK should be off !! */
+ {K_Right, "\033[C"},
+ {K_Down, "\033[B"},
+ {K_Up, "\033[A"},
+ {K_PageDown, "\033[G"},
+ {K_PageUp, "\033[I"},
+ {K_Control_Left, "\033b"},
+ {K_Control_Right, "\033f"},
+ {K_Control_Home, "\033<"},
+ {K_Control_End, "\033>"},
+
+#if defined(INFOKEY)
+ {K_EHome, "\033[H"}, /* these are also for moving IN a node */
+ {K_EEnd, "\033[F"}, /* they're the "extended" (Grey) keys */
+#else
+ {K_EHome, "\001"},
+ {K_EEnd, "\005"},
+#endif
+ {K_ELeft, "\033[D"},
+ {K_ERight, "\033[C"},
+ {K_EDown, "\033[B"},
+ {K_EUp, "\033[A"},
+ {K_EPageDown, "\033[G"},
+ {K_EPageUp, "\033[I"},
+ {K_Control_ELeft, "\033b"},
+ {K_Control_ERight, "\033f"},
+ {K_Control_EHome, "\033<"},
+ {K_Control_EEnd, "\033>"},
+
+ {K_BackTab, "\033\011"},
+ {K_F1, "\10"}, /* YEAH, gimme that good old F-one-thing */
+ {K_Delete, "\177"}, /* to make Kp-Del be DEL (0x7f) */
+ {K_EDelete, "\177"}, /* to make Delete be DEL (0x7f) */
+#if defined(INFOKEY)
+ {K_Insert, "\033[L"},
+ {K_EInsert, "\033[L"},
+#endif
+
+ /* These are here to map more Alt-X keys to ESC X sequences. */
+ {K_Alt_Q, "\033q"},
+ {K_Alt_W, "\033w"},
+ {K_Alt_E, "\033e"},
+ {K_Alt_R, "\033r"},
+ {K_Alt_T, "\033t"},
+ {K_Alt_Y, "\033y"},
+ {K_Alt_U, "\033u"},
+ {K_Alt_I, "\033i"},
+ {K_Alt_O, "\033o"},
+ {K_Alt_P, "\033p"},
+ {K_Alt_LBracket, "\033["},
+ {K_Alt_RBracket, "\033]"},
+ {K_Alt_Return, "\033\015"},
+ {K_Alt_A, "\033a"},
+ {K_Alt_S, "\033s"},
+ {K_Alt_D, "\033d"},
+ {K_Alt_F, "\033f"},
+ {K_Alt_G, "\033g"},
+ {K_Alt_H, "\033h"},
+ {K_Alt_J, "\033j"},
+ {K_Alt_K, "\033k"},
+ {K_Alt_L, "\033l"},
+ {K_Alt_Semicolon, "\033;"},
+ {K_Alt_Quote, "\033'"},
+ {K_Alt_Backquote, "\033`"},
+ {K_Alt_Backslash, "\033\\"},
+ {K_Alt_Z, "\033z"},
+ {K_Alt_X, "\033x"},
+ {K_Alt_C, "\033c"},
+ {K_Alt_V, "\033v"},
+ {K_Alt_B, "\033b"},
+ {K_Alt_N, "\033n"},
+ {K_Alt_M, "\033m"},
+ {K_Alt_Comma, "\033<"}, /* our reader cannot distinguish between */
+ {K_Alt_Period, "\033>"}, /* Alt-. and Alt->, so we cheat a little */
+ {K_Alt_Slash, "\033?"}, /* ditto, to get Alt-? */
+ {K_Alt_Backspace, "\033\177"}, /* M-DEL, to delete word backwards */
+ {K_Alt_1, "\033\061"},
+ {K_Alt_2, "\033\062"},
+ {K_Alt_3, "\033\063"},
+ {K_Alt_4, "\033\064"},
+ {K_Alt_5, "\033\065"},
+ {K_Alt_6, "\033\066"},
+ {K_Alt_7, "\033\067"},
+ {K_Alt_8, "\033\070"},
+ {K_Alt_9, "\033\071"},
+ {K_Alt_0, "\033\060"},
+ {K_Alt_Dash, "\033\055"},
+ {K_Alt_EPageUp, "\033\033[I"},
+ {K_Alt_EPageDown, "\033\033[G"},
+ {K_Alt_Equals, "\033\075"},
+ {K_Alt_EDelete, "\033\177"},
+ {K_Alt_Tab, "\033\011"},
+ {0, 0}
+};
+
+/* Given a key, return the sequence of characters which
+ our keyboard driver generates. */
+static unsigned const char *
+find_sequence (int key)
+{
+ int i;
+
+ for (i = 0; DJGPP_keytab[i].inkey; i++)
+ if (key == DJGPP_keytab[i].inkey)
+ return DJGPP_keytab[i].sequence;
+
+ return (unsigned const char *)NULL;
+}
+
+/* Return zero if a key is pending in the
+ keyboard buffer, non-zero otherwise. */
+static int
+kbd_buffer_empty (void)
+{
+ __dpmi_regs r;
+ int retval;
+
+ r.h.ah = 0x11; /* Get enhanced keyboard status */
+ __dpmi_int (0x16, &r);
+
+ /* If the keyboard buffer is empty, the Zero Flag will be set. */
+ return (r.x.flags & 0x40) == 0x40;
+}
+
+/* The buffered characters pending to be read.
+ Actually, Info usually reads a single character, but when we
+ translate a key into a sequence of characters, we keep them here. */
+static unsigned char buffered[512];
+
+/* Index of the next buffered character to be returned. */
+static int buf_idx;
+
+/* Return the number of characters waiting to be read. */
+long
+pc_term_chars_avail (void)
+{
+ if (buf_idx >= sizeof (buffered)) /* paranoia */
+ {
+ buf_idx = 0;
+ buffered[buf_idx] = '\0';
+ return 0;
+ }
+ else
+ return (long)strlen (buffered + buf_idx);
+}
+
+/* Our special terminal keyboard reader. It will be called by
+ low-level libc functions when the application calls `read' or
+ the ANSI-standard stream-oriented read functions. If the
+ caller wants to read the terminal, we redirect the call to
+ the BIOS keyboard functions, since that lets us recognize more
+ keys than DOS does. */
+static int
+keyboard_read (__FSEXT_Fnumber func, int *retval, va_list rest_args)
+{
+ /* When we are called, REST_ARGS are: file_descriptor, buf, nbytes. */
+ unsigned char *buf;
+ size_t nbytes, nread = 0;
+ int fd = va_arg (rest_args, int);
+
+ /* Is this call for us? */
+ if (func != __FSEXT_read || !isatty (fd))
+ return 0; /* and the usual DOS call will be issued */
+
+ buf = va_arg (rest_args, unsigned char *);
+ nbytes = va_arg (rest_args, size_t);
+
+ if (!buf)
+ {
+ errno = EINVAL;
+ *retval = -1;
+ return 1;
+ }
+ if (!nbytes)
+ {
+ *retval = 0;
+ return 1;
+ }
+
+ /* Loop here until enough bytes has been read. */
+ do
+ {
+ int key;
+
+ /* If any ``buffered characters'' are left, return as much
+ of them as the caller wanted. */
+ while (buffered[buf_idx] && nbytes)
+ {
+ *buf++ = buffered[buf_idx++];
+ nread++;
+ nbytes--;
+ }
+
+ if (nbytes <= 0)
+ break;
+
+ /* Wait for another key.
+ We do that in a busy-waiting loop so we don't get parked
+ inside a BIOS call, which will effectively disable signals.
+ While we wait for them to type something, we repeatedly
+ release the rest of our time slice, so that other programs
+ in a multitasking environment, such as Windows, get more cycles. */
+ while (kbd_buffer_empty ())
+ __dpmi_yield ();
+
+ key = getxkey ();
+
+ /* Translate the key if necessary.
+ Untranslated non-ASCII keys are silently ignored. */
+ if ((key & 0x300) != 0)
+ {
+ unsigned char const * key_sequence = find_sequence (key);
+
+ if (key_sequence != NULL)
+ {
+ strcpy (buffered, key_sequence);
+ buf_idx = 0;
+ }
+ }
+ else if (key == K_Control_Z)
+ raise (SIGUSR1); /* we don't have SIGTSTP, so simulate it */
+ else if (key <= 0xff)
+ {
+ *buf++ = key;
+ nbytes--;
+ nread++;
+ }
+ }
+ while (nbytes > 0);
+
+ *retval = nread;
+ return 1; /* meaning that we handled the call */
+}
+
+/* Install our keyboard handler.
+ This is called by the startup code before `main'. */
+static void __attribute__((constructor))
+install_keyboard_handler (void)
+{
+ __FSEXT_set_function (fileno (stdin), keyboard_read);
+
+ /* We need to set this single hook here; the rest
+ will be set by pc_initialize_terminal when it is called. */
+ terminal_initialize_terminal_hook = pc_initialize_terminal;
+}
+
+#endif /* __DJGPP__ */
+
+/* **************************************************************** */
+/* */
+/* Emulation of SIGTSTP on Ctrl-Z */
+/* */
+/* **************************************************************** */
+
+#include <limits.h>
+#include "signals.h"
+#include "session.h"
+
+#ifndef PATH_MAX
+# define PATH_MAX 512
+#endif
+
+/* Effectively disable signals which aren't defined
+ (assuming no signal can ever be zero).
+ SIGINT is ANSI, so we expect it to be always defined. */
+#ifndef SIGUSR1
+# define SIGUSR1 0
+#endif
+#ifndef SIGQUIT
+# define SIGQUIT 0
+#endif
+
+int
+kill (pid_t pid, int sig)
+{
+ static char interrupted_msg[] = "Interrupted\r\n";
+ static char stopped_msg[] = "Stopped. Type `exit RET' to return.\r\n";
+ char cwd[PATH_MAX + 1];
+
+ if (pid == getpid ()
+ || pid == 0
+ || pid == -1
+ || pid == -getpid ())
+ {
+ switch (sig)
+ {
+ RETSIGTYPE (*old_INT)(int), (*old_QUIT)(int);
+
+ case SIGINT:
+#ifdef __DJGPP__
+ /* If SIGINT was generated by a readable key, we want to remove
+ it from the PC keyboard buffer, so that DOS and other
+ programs never see it. DJGPP signal-handling mechanism
+ doesn't remove the INT key from the keyboard buffer. */
+ if (!kbd_buffer_empty ())
+ getxkey ();
+#endif
+ pc_write_chars (interrupted_msg, sizeof (interrupted_msg) - 1);
+ xexit (1);
+ case SIGUSR1:
+ /* Simulate SIGTSTP by invoking a subsidiary shell. */
+ pc_goto_xy (0, outside_info.screenheight - 1);
+ pc_clear_to_eol ();
+ pc_write_chars (stopped_msg, sizeof (stopped_msg) - 1);
+
+ /* The child shell can change the working directory, so
+ we need to save and restore it, since it is global. */
+ if (!getcwd (cwd, PATH_MAX)) /* should never happen */
+ cwd[0] = '\0';
+
+ /* We don't want to get fatal signals while the subshell runs. */
+ old_INT = signal (SIGINT, SIG_IGN);
+ old_QUIT = signal (SIGQUIT, SIG_IGN);
+ system ("");
+ if (*cwd)
+ chdir (cwd);
+ signal (SIGINT, old_INT);
+ signal (SIGQUIT, old_QUIT);
+ break;
+ default:
+ if (sig)
+ raise (sig);
+ break;
+ }
+ return 0;
+ }
+ else
+ return -1;
+}
+
+/* These should never be called, but they make the linker happy. */
+
+void tputs (char *a, int b, int (*c)())
+{
+ perror ("tputs");
+}
+
+char* tgoto (char*a, int b, int c)
+{
+ perror ("tgoto"); return 0; /* here and below, added dummy retvals */
+}
+
+int tgetnum (char*a)
+{
+ perror ("tgetnum"); return 0;
+}
+
+int tgetflag (char*a)
+{
+ perror ("tgetflag"); return 0;
+}
+
+char* tgetstr (char *a, char **b)
+{
+ perror ("tgetstr"); return 0;
+}
+
+int tgetent (char*a, char*b)
+{
+ perror ("tgetent"); return 0;
+}
+
+int tcgetattr(int fildes, struct termios *termios_p)
+{
+ perror ("tcgetattr"); return 0;
+}
+
+int tcsetattr(int fd, int opt_actions, const struct termios *termios_p)
+{
+ perror ("tcsetattr"); return 0;
+}
diff --git a/Build/source/utils/texinfo/info/search.c b/Build/source/utils/texinfo/info/search.c
new file mode 100644
index 00000000000..a1d5da6c711
--- /dev/null
+++ b/Build/source/utils/texinfo/info/search.c
@@ -0,0 +1,497 @@
+/* search.c -- searching large bodies of text.
+ $Id: search.c,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+
+#include "search.h"
+#include "nodes.h"
+
+/* The search functions take two arguments:
+
+ 1) a string to search for, and
+
+ 2) a pointer to a SEARCH_BINDING which contains the buffer, start,
+ and end of the search.
+
+ They return a long, which is the offset from the start of the buffer
+ at which the match was found. An offset of -1 indicates failure. */
+
+/* A function which makes a binding with buffer and bounds. */
+SEARCH_BINDING *
+make_binding (char *buffer, long int start, long int end)
+{
+ SEARCH_BINDING *binding;
+
+ binding = (SEARCH_BINDING *)xmalloc (sizeof (SEARCH_BINDING));
+ binding->buffer = buffer;
+ binding->start = start;
+ binding->end = end;
+ binding->flags = 0;
+
+ return (binding);
+}
+
+/* Make a copy of BINDING without duplicating the data. */
+SEARCH_BINDING *
+copy_binding (SEARCH_BINDING *binding)
+{
+ SEARCH_BINDING *copy;
+
+ copy = make_binding (binding->buffer, binding->start, binding->end);
+ copy->flags = binding->flags;
+ return (copy);
+}
+
+
+/* **************************************************************** */
+/* */
+/* The Actual Searching Functions */
+/* */
+/* **************************************************************** */
+
+/* Search forwards or backwards for the text delimited by BINDING.
+ The search is forwards if BINDING->start is greater than BINDING->end. */
+long
+search (char *string, SEARCH_BINDING *binding)
+{
+ long result;
+
+ /* If the search is backwards, then search backwards, otherwise forwards. */
+ if (binding->start > binding->end)
+ result = search_backward (string, binding);
+ else
+ result = search_forward (string, binding);
+
+ return (result);
+}
+
+/* Search forwards for STRING through the text delimited in BINDING. */
+long
+search_forward (char *string, SEARCH_BINDING *binding)
+{
+ register int c, i, len;
+ register char *buff, *end;
+ char *alternate = (char *)NULL;
+
+ len = strlen (string);
+
+ /* We match characters in the search buffer against STRING and ALTERNATE.
+ ALTERNATE is a case reversed version of STRING; this is cheaper than
+ case folding each character before comparison. Alternate is only
+ used if the case folding bit is turned on in the passed BINDING. */
+
+ if (binding->flags & S_FoldCase)
+ {
+ alternate = xstrdup (string);
+
+ for (i = 0; i < len; i++)
+ {
+ if (islower (alternate[i]))
+ alternate[i] = toupper (alternate[i]);
+ else if (isupper (alternate[i]))
+ alternate[i] = tolower (alternate[i]);
+ }
+ }
+
+ buff = binding->buffer + binding->start;
+ end = binding->buffer + binding->end + 1;
+
+ while (buff < (end - len))
+ {
+ for (i = 0; i < len; i++)
+ {
+ c = buff[i];
+
+ if ((c != string[i]) && (!alternate || c != alternate[i]))
+ break;
+ }
+
+ if (!string[i])
+ {
+ if (alternate)
+ free (alternate);
+ if (binding->flags & S_SkipDest)
+ buff += len;
+ return ((long) (buff - binding->buffer));
+ }
+
+ buff++;
+ }
+
+ if (alternate)
+ free (alternate);
+
+ return ((long) -1);
+}
+
+/* Search for STRING backwards through the text delimited in BINDING. */
+long
+search_backward (char *input_string, SEARCH_BINDING *binding)
+{
+ register int c, i, len;
+ register char *buff, *end;
+ char *string;
+ char *alternate = (char *)NULL;
+
+ len = strlen (input_string);
+
+ /* Reverse the characters in the search string. */
+ string = (char *)xmalloc (1 + len);
+ for (c = 0, i = len - 1; input_string[c]; c++, i--)
+ string[i] = input_string[c];
+
+ string[c] = '\0';
+
+ /* We match characters in the search buffer against STRING and ALTERNATE.
+ ALTERNATE is a case reversed version of STRING; this is cheaper than
+ case folding each character before comparison. ALTERNATE is only
+ used if the case folding bit is turned on in the passed BINDING. */
+
+ if (binding->flags & S_FoldCase)
+ {
+ alternate = xstrdup (string);
+
+ for (i = 0; i < len; i++)
+ {
+ if (islower (alternate[i]))
+ alternate[i] = toupper (alternate[i]);
+ else if (isupper (alternate[i]))
+ alternate[i] = tolower (alternate[i]);
+ }
+ }
+
+ buff = binding->buffer + binding->start - 1;
+ end = binding->buffer + binding->end;
+
+ while (buff > (end + len))
+ {
+ for (i = 0; i < len; i++)
+ {
+ c = *(buff - i);
+
+ if (c != string[i] && (!alternate || c != alternate[i]))
+ break;
+ }
+
+ if (!string[i])
+ {
+ free (string);
+ if (alternate)
+ free (alternate);
+
+ if (binding->flags & S_SkipDest)
+ buff -= len;
+ return ((long) (1 + (buff - binding->buffer)));
+ }
+
+ buff--;
+ }
+
+ free (string);
+ if (alternate)
+ free (alternate);
+
+ return ((long) -1);
+}
+
+/* Find STRING in LINE, returning the offset of the end of the string.
+ Return an offset of -1 if STRING does not appear in LINE. The search
+ is bound by the end of the line (i.e., either NEWLINE or 0). */
+int
+string_in_line (char *string, char *line)
+{
+ register int end;
+ SEARCH_BINDING binding;
+
+ /* Find the end of the line. */
+ for (end = 0; line[end] && line[end] != '\n'; end++);
+
+ /* Search for STRING within these confines. */
+ binding.buffer = line;
+ binding.start = 0;
+ binding.end = end;
+ binding.flags = S_FoldCase | S_SkipDest;
+
+ return (search_forward (string, &binding));
+}
+
+/* Return non-zero if STRING is the first text to appear at BINDING. */
+int
+looking_at (char *string, SEARCH_BINDING *binding)
+{
+ long search_end;
+
+ search_end = search (string, binding);
+
+ /* If the string was not found, SEARCH_END is -1. If the string was found,
+ but not right away, SEARCH_END is != binding->start. Otherwise, the
+ string was found at binding->start. */
+ return (search_end == binding->start);
+}
+
+/* **************************************************************** */
+/* */
+/* Small String Searches */
+/* */
+/* **************************************************************** */
+
+/* Function names that start with "skip" are passed a string, and return
+ an offset from the start of that string. Function names that start
+ with "find" are passed a SEARCH_BINDING, and return an absolute position
+ marker of the item being searched for. "Find" functions return a value
+ of -1 if the item being looked for couldn't be found. */
+
+/* Return the index of the first non-whitespace character in STRING. */
+int
+skip_whitespace (char *string)
+{
+ register int i;
+
+ for (i = 0; string && whitespace (string[i]); i++);
+ return (i);
+}
+
+/* Return the index of the first non-whitespace or newline character in
+ STRING. */
+int
+skip_whitespace_and_newlines (char *string)
+{
+ register int i;
+
+ for (i = 0; string && whitespace_or_newline (string[i]); i++);
+ return (i);
+}
+
+/* Return the index of the first whitespace character in STRING. */
+int
+skip_non_whitespace (char *string)
+{
+ register int i;
+
+ for (i = 0; string && string[i] && !whitespace (string[i]); i++);
+ return (i);
+}
+
+/* Return the index of the first non-node character in STRING. Note that
+ this function contains quite a bit of hair to ignore periods in some
+ special cases. This is because we here at GNU ship some info files which
+ contain nodenames that contain periods. No such nodename can start with
+ a period, or continue with whitespace, newline, or ')' immediately following
+ the period. If second argument NEWLINES_OKAY is non-zero, newlines should
+ be skipped while parsing out the nodename specification. */
+int
+skip_node_characters (char *string, int newlines_okay)
+{
+ register int c, i = 0;
+ int paren_seen = 0;
+ int paren = 0;
+
+ /* Handle special case. This is when another function has parsed out the
+ filename component of the node name, and we just want to parse out the
+ nodename proper. In that case, a period at the start of the nodename
+ indicates an empty nodename. */
+ if (string && *string == '.')
+ return (0);
+
+ if (string && *string == '(')
+ {
+ paren++;
+ paren_seen++;
+ i++;
+ }
+
+ for (; string && (c = string[i]); i++)
+ {
+ if (paren)
+ {
+ if (c == '(')
+ paren++;
+ else if (c == ')')
+ paren--;
+
+ continue;
+ }
+
+ /* If the character following the close paren is a space or period,
+ then this node name has no more characters associated with it. */
+ if (c == '\t' ||
+ c == ',' ||
+ c == INFO_TAGSEP ||
+ ((!newlines_okay) && (c == '\n')) ||
+ ((paren_seen && string[i - 1] == ')') &&
+ (c == ' ' || c == '.')) ||
+ (c == '.' &&
+ (
+#if 0
+/* This test causes a node name ending in a period, like `This.', not to
+ be found. The trailing . is stripped. This occurs in the jargon
+ file (`I see no X here.' is a node name). */
+ (!string[i + 1]) ||
+#endif
+ (whitespace_or_newline (string[i + 1])) ||
+ (string[i + 1] == ')'))))
+ break;
+ }
+ return (i);
+}
+
+
+/* **************************************************************** */
+/* */
+/* Searching FILE_BUFFER's */
+/* */
+/* **************************************************************** */
+
+/* Return the absolute position of the first occurence of a node separator in
+ BINDING-buffer. The search starts at BINDING->start. Return -1 if no node
+ separator was found. */
+long
+find_node_separator (SEARCH_BINDING *binding)
+{
+ register long i;
+ char *body;
+
+ body = binding->buffer;
+
+ /* A node is started by [^L]^_[^L]\n. That is to say, the C-l's are
+ optional, but the DELETE and NEWLINE are not. This separator holds
+ true for all separated elements in an Info file, including the tags
+ table (if present) and the indirect tags table (if present). */
+ for (i = binding->start; i < binding->end - 1; i++)
+ if (((body[i] == INFO_FF && body[i + 1] == INFO_COOKIE) &&
+ (body[i + 2] == '\n' ||
+ (body[i + 2] == INFO_FF && body[i + 3] == '\n'))) ||
+ ((body[i] == INFO_COOKIE) &&
+ (body[i + 1] == '\n' ||
+ (body[i + 1] == INFO_FF && body[i + 2] == '\n'))))
+ return (i);
+ return (-1);
+}
+
+/* Return the length of the node separator characters that BODY is
+ currently pointing at. */
+int
+skip_node_separator (char *body)
+{
+ register int i;
+
+ i = 0;
+
+ if (body[i] == INFO_FF)
+ i++;
+
+ if (body[i++] != INFO_COOKIE)
+ return (0);
+
+ if (body[i] == INFO_FF)
+ i++;
+
+ if (body[i++] != '\n')
+ return (0);
+
+ return (i);
+}
+
+/* Return the number of characters from STRING to the start of
+ the next line. */
+int
+skip_line (char *string)
+{
+ register int i;
+
+ for (i = 0; string && string[i] && string[i] != '\n'; i++);
+
+ if (string[i] == '\n')
+ i++;
+
+ return (i);
+}
+
+/* Return the absolute position of the beginning of a tags table in this
+ binding starting the search at binding->start. */
+long
+find_tags_table (SEARCH_BINDING *binding)
+{
+ SEARCH_BINDING tmp_search;
+ long position;
+
+ tmp_search.buffer = binding->buffer;
+ tmp_search.start = binding->start;
+ tmp_search.end = binding->end;
+ tmp_search.flags = S_FoldCase;
+
+ while ((position = find_node_separator (&tmp_search)) != -1 )
+ {
+ tmp_search.start = position;
+ tmp_search.start += skip_node_separator (tmp_search.buffer
+ + tmp_search.start);
+
+ if (looking_at (TAGS_TABLE_BEG_LABEL, &tmp_search))
+ return (position);
+ }
+ return (-1);
+}
+
+/* Return the absolute position of the node named NODENAME in BINDING.
+ This is a brute force search, and we wish to avoid it when possible.
+ This function is called when a tag (indirect or otherwise) doesn't
+ really point to the right node. It returns the absolute position of
+ the separator preceding the node. */
+long
+find_node_in_binding (char *nodename, SEARCH_BINDING *binding)
+{
+ long position;
+ int offset, namelen;
+ SEARCH_BINDING tmp_search;
+
+ namelen = strlen (nodename);
+
+ tmp_search.buffer = binding->buffer;
+ tmp_search.start = binding->start;
+ tmp_search.end = binding->end;
+ tmp_search.flags = 0;
+
+ while ((position = find_node_separator (&tmp_search)) != -1)
+ {
+ tmp_search.start = position;
+ tmp_search.start += skip_node_separator
+ (tmp_search.buffer + tmp_search.start);
+
+ offset = string_in_line
+ (INFO_NODE_LABEL, tmp_search.buffer + tmp_search.start);
+
+ if (offset == -1)
+ continue;
+
+ tmp_search.start += offset;
+ tmp_search.start += skip_whitespace (tmp_search.buffer + tmp_search.start);
+ offset = skip_node_characters
+ (tmp_search.buffer + tmp_search.start, DONT_SKIP_NEWLINES);
+
+ /* Notice that this is an exact match. You cannot grovel through
+ the buffer with this function looking for random nodes. */
+ if ((offset == namelen) &&
+ (tmp_search.buffer[tmp_search.start] == nodename[0]) &&
+ (strncmp (tmp_search.buffer + tmp_search.start, nodename, offset) == 0))
+ return (position);
+ }
+ return (-1);
+}
diff --git a/Build/source/utils/texinfo/info/search.h b/Build/source/utils/texinfo/info/search.h
new file mode 100644
index 00000000000..3e0610799ba
--- /dev/null
+++ b/Build/source/utils/texinfo/info/search.h
@@ -0,0 +1,75 @@
+/* search.h -- Structure used to search large bodies of text, with bounds.
+ $Id: search.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+/* The search functions take two arguments:
+
+ 1) a string to search for, and
+
+ 2) a pointer to a SEARCH_BINDING which contains the buffer, start,
+ and end of the search.
+
+ They return a long, which is the offset from the start of the buffer
+ at which the match was found. An offset of -1 indicates failure. */
+
+#ifndef INFO_SEARCH_H
+#define INFO_SEARCH_H
+
+typedef struct {
+ char *buffer; /* The buffer of text to search. */
+ long start; /* Offset of the start of the search. */
+ long end; /* Offset of the end of the searh. */
+ int flags; /* Flags controlling the type of search. */
+} SEARCH_BINDING;
+
+#define S_FoldCase 0x01 /* Set means fold case in searches. */
+#define S_SkipDest 0x02 /* Set means return pointing after the dest. */
+
+SEARCH_BINDING *make_binding (char *buffer, long int start, long int end);
+SEARCH_BINDING *copy_binding (SEARCH_BINDING *binding);
+extern long search_forward (char *string, SEARCH_BINDING *binding);
+extern long search_backward (char *input_string, SEARCH_BINDING *binding);
+extern long search (char *string, SEARCH_BINDING *binding);
+extern int looking_at (char *string, SEARCH_BINDING *binding);
+
+/* Note that STRING_IN_LINE () always returns the offset of the 1st character
+ after the string. */
+extern int string_in_line (char *string, char *line);
+
+/* Function names that start with "skip" are passed a string, and return
+ an offset from the start of that string. Function names that start
+ with "find" are passed a SEARCH_BINDING, and return an absolute position
+ marker of the item being searched for. "Find" functions return a value
+ of -1 if the item being looked for couldn't be found. */
+extern int skip_whitespace (char *string);
+extern int skip_non_whitespace (char *string);
+extern int skip_whitespace_and_newlines (char *string);
+extern int skip_line (char *string);
+extern int skip_node_characters (char *string, int newlines_okay);
+extern int skip_node_separator (char *body);
+
+#define DONT_SKIP_NEWLINES 0
+#define SKIP_NEWLINES 1
+
+extern long find_node_separator (SEARCH_BINDING *binding);
+extern long find_tags_table (SEARCH_BINDING *binding);
+extern long find_node_in_binding (char *nodename, SEARCH_BINDING *binding);
+
+#endif /* not INFO_SEARCH_H */
diff --git a/Build/source/utils/texinfo/info/session.c b/Build/source/utils/texinfo/info/session.c
new file mode 100644
index 00000000000..7a8996bbe20
--- /dev/null
+++ b/Build/source/utils/texinfo/info/session.c
@@ -0,0 +1,5039 @@
+/* session.c -- user windowing interface to Info.
+ $Id: session.c,v 1.16 2004/12/14 00:15:36 karl Exp $
+
+ Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "search.h"
+#include <sys/ioctl.h>
+
+#if defined (HAVE_SYS_TIME_H)
+# include <sys/time.h>
+# define HAVE_STRUCT_TIMEVAL
+#endif /* HAVE_SYS_TIME_H */
+
+#if defined (HANDLE_MAN_PAGES)
+# include "man.h"
+#endif
+
+static void info_clear_pending_input (void);
+static void info_set_pending_input (unsigned char key);
+static void info_handle_pointer (char *label, WINDOW *window);
+static void display_info_keyseq (int expecting_future_input);
+char *node_printed_rep (NODE *node);
+
+/* **************************************************************** */
+/* */
+/* Running an Info Session */
+/* */
+/* **************************************************************** */
+
+/* The place that we are reading input from. */
+static FILE *info_input_stream = NULL;
+
+/* The last executed command. */
+VFunction *info_last_executed_command = NULL;
+
+/* Becomes non-zero when 'q' is typed to an Info window. */
+int quit_info_immediately = 0;
+
+/* Array of structures describing for each window which nodes have been
+ visited in that window. */
+INFO_WINDOW **info_windows = NULL;
+
+/* Where to add the next window, if we need to add one. */
+static int info_windows_index = 0;
+
+/* Number of slots allocated to `info_windows'. */
+static int info_windows_slots = 0;
+
+void remember_window_and_node (WINDOW *window, NODE *node);
+void forget_window_and_nodes (WINDOW *window);
+void display_startup_message_and_start (void);
+
+/* Begin an info session finding the nodes specified by FILENAME and NODENAMES.
+ For each loaded node, create a new window. Always split the largest of the
+ available windows. */
+void
+begin_multiple_window_info_session (char *filename, char **nodenames)
+{
+ register int i;
+ WINDOW *window = (WINDOW *)NULL;
+
+ for (i = 0; nodenames[i]; i++)
+ {
+ NODE *node;
+
+ node = info_get_node (filename, nodenames[i]);
+
+ if (!node)
+ break;
+
+ /* If this is the first node, initialize the info session. */
+ if (!window)
+ {
+ initialize_info_session (node, 1);
+ window = active_window;
+ }
+ else
+ {
+ /* Find the largest window in WINDOWS, and make that be the active
+ one. Then split it and add our window and node to the list
+ of remembered windows and nodes. Then tile the windows. */
+ WINDOW *win, *largest = NULL;
+ int max_height = 0;
+
+ for (win = windows; win; win = win->next)
+ if (win->height > max_height)
+ {
+ max_height = win->height;
+ largest = win;
+ }
+
+ if (!largest)
+ {
+ display_update_display (windows);
+ info_error ((char *) msg_cant_find_window, NULL, NULL);
+ info_session ();
+ xexit (0);
+ }
+
+ active_window = largest;
+ window = window_make_window (node);
+ if (window)
+ {
+ window_tile_windows (TILE_INTERNALS);
+ remember_window_and_node (window, node);
+ }
+ else
+ {
+ display_update_display (windows);
+ info_error ((char *) msg_win_too_small, NULL, NULL);
+ info_session ();
+ xexit (0);
+ }
+ }
+ }
+ display_startup_message_and_start ();
+}
+
+/* Start an info session with INITIAL_NODE, and an error message in the echo
+ area made from FORMAT and ARG. */
+void
+begin_info_session_with_error (NODE *initial_node, char *format,
+ void *arg1, void *arg2)
+{
+ initialize_info_session (initial_node, 1);
+ info_error (format, arg1, arg2);
+ info_session ();
+}
+
+/* Start an info session with INITIAL_NODE. */
+void
+begin_info_session (NODE *initial_node)
+{
+ initialize_info_session (initial_node, 1);
+ display_startup_message_and_start ();
+}
+
+void
+display_startup_message_and_start (void)
+{
+ char *format;
+
+ format = replace_in_documentation
+ ((char *) _("Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] for menu item."),
+ 0);
+
+ window_message_in_echo_area (format, VERSION, NULL);
+ info_session ();
+}
+
+/* Run an info session with an already initialized window and node. */
+void
+info_session (void)
+{
+ display_update_display (windows);
+ info_last_executed_command = NULL;
+ info_read_and_dispatch ();
+ /* On program exit, leave the cursor at the bottom of the window, and
+ restore the terminal I/O. */
+ terminal_goto_xy (0, screenheight - 1);
+ terminal_clear_to_eol ();
+ fflush (stdout);
+ terminal_unprep_terminal ();
+ close_dribble_file ();
+}
+
+/* Here is a window-location dependent event loop. Called from the
+ functions info_session (), and from read_xxx_in_echo_area (). */
+void
+info_read_and_dispatch (void)
+{
+ unsigned char key;
+ int done;
+ done = 0;
+
+ while (!done && !quit_info_immediately)
+ {
+ int lk = 0;
+
+ /* If we haven't just gone up or down a line, there is no
+ goal column for this window. */
+ if ((info_last_executed_command != (VFunction *) info_next_line) &&
+ (info_last_executed_command != (VFunction *) info_prev_line))
+ active_window->goal_column = -1;
+
+ if (echo_area_is_active)
+ {
+ lk = echo_area_last_command_was_kill;
+ echo_area_prep_read ();
+ }
+
+ if (!info_any_buffered_input_p ())
+ display_update_display (windows);
+
+ display_cursor_at_point (active_window);
+ info_initialize_numeric_arg ();
+
+ initialize_keyseq ();
+ key = info_get_input_char ();
+
+ /* No errors yet. We just read a character, that's all. Only clear
+ the echo_area if it is not currently active. */
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+
+ info_error_was_printed = 0;
+
+ /* Do the selected command. */
+ info_dispatch_on_key (key, active_window->keymap);
+
+ if (echo_area_is_active)
+ {
+ /* Echo area commands that do killing increment the value of
+ ECHO_AREA_LAST_COMMAND_WAS_KILL. Thus, if there is no
+ change in the value of this variable, the last command
+ executed was not a kill command. */
+ if (lk == echo_area_last_command_was_kill)
+ echo_area_last_command_was_kill = 0;
+
+ if (ea_last_executed_command == (VFunction *) ea_newline ||
+ info_aborted_echo_area)
+ {
+ ea_last_executed_command = (VFunction *)NULL;
+ done = 1;
+ }
+
+ if (info_last_executed_command == (VFunction *) info_quit)
+ quit_info_immediately = 1;
+ }
+ else if (info_last_executed_command == (VFunction *) info_quit)
+ done = 1;
+ }
+}
+
+/* Found in signals.c */
+extern void initialize_info_signal_handler (void );
+
+/* Initialize the first info session by starting the terminal, window,
+ and display systems. If CLEAR_SCREEN is 0, don't clear the screen. */
+void
+initialize_info_session (NODE *node, int clear_screen)
+{
+ char *term_name = getenv ("TERM");
+ terminal_initialize_terminal (term_name);
+
+ if (terminal_is_dumb_p)
+ {
+ if (!term_name)
+ term_name = "dumb";
+
+ info_error ((char *) msg_term_too_dumb, term_name, NULL);
+ xexit (1);
+ }
+
+ if (clear_screen)
+ {
+ terminal_prep_terminal ();
+ terminal_clear_screen ();
+ }
+
+ initialize_info_keymaps ();
+ window_initialize_windows (screenwidth, screenheight);
+ initialize_info_signal_handler ();
+ display_initialize_display (screenwidth, screenheight);
+ info_set_node_of_window (0, active_window, node);
+
+ /* Tell the window system how to notify us when a window needs to be
+ asynchronously deleted (e.g., user resizes window very small). */
+ window_deletion_notifier = (VFunction *) forget_window_and_nodes;
+
+ /* If input has not been redirected yet, make it come from unbuffered
+ standard input. */
+ if (!info_input_stream)
+ {
+ setbuf (stdin, NULL);
+ info_input_stream = stdin;
+ }
+
+ info_windows_initialized_p = 1;
+}
+
+/* Tell Info that input is coming from the file FILENAME. */
+void
+info_set_input_from_file (char *filename)
+{
+ FILE *stream;
+
+ /* Input may include binary characters. */
+ stream = fopen (filename, FOPEN_RBIN);
+
+ if (!stream)
+ return;
+
+ if ((info_input_stream != (FILE *)NULL) &&
+ (info_input_stream != stdin))
+ fclose (info_input_stream);
+
+ info_input_stream = stream;
+
+ if (stream != stdin)
+ display_inhibited = 1;
+}
+
+/* Return the INFO_WINDOW containing WINDOW, or NULL if there isn't one. */
+static INFO_WINDOW *
+get_info_window_of_window (WINDOW *window)
+{
+ register int i;
+ INFO_WINDOW *info_win = (INFO_WINDOW *)NULL;
+
+ for (i = 0; info_windows && (info_win = info_windows[i]); i++)
+ if (info_win->window == window)
+ break;
+
+ return (info_win);
+}
+
+/* Reset the remembered pagetop and point of WINDOW to WINDOW's current
+ values if the window and node are the same as the current one being
+ displayed. */
+void
+set_remembered_pagetop_and_point (WINDOW *window)
+{
+ INFO_WINDOW *info_win;
+
+ info_win = get_info_window_of_window (window);
+
+ if (!info_win)
+ return;
+
+ if (info_win->nodes_index &&
+ (info_win->nodes[info_win->current] == window->node))
+ {
+ info_win->pagetops[info_win->current] = window->pagetop;
+ info_win->points[info_win->current] = window->point;
+ }
+}
+
+void
+remember_window_and_node (WINDOW *window, NODE *node)
+{
+ /* See if we already have this window in our list. */
+ INFO_WINDOW *info_win = get_info_window_of_window (window);
+
+ /* If the window wasn't already on our list, then make a new entry. */
+ if (!info_win)
+ {
+ info_win = (INFO_WINDOW *)xmalloc (sizeof (INFO_WINDOW));
+ info_win->window = window;
+ info_win->nodes = (NODE **)NULL;
+ info_win->pagetops = (int *)NULL;
+ info_win->points = (long *)NULL;
+ info_win->current = 0;
+ info_win->nodes_index = 0;
+ info_win->nodes_slots = 0;
+
+ add_pointer_to_array (info_win, info_windows_index, info_windows,
+ info_windows_slots, 10, INFO_WINDOW *);
+ }
+
+ /* If this node, the current pagetop, and the current point are the
+ same as the current saved node and pagetop, don't really add this to
+ the list of history nodes. This may happen only at the very
+ beginning of the program, I'm not sure. --karl */
+ if (info_win->nodes
+ && info_win->current >= 0
+ && info_win->nodes[info_win->current]->contents == node->contents
+ && info_win->pagetops[info_win->current] == window->pagetop
+ && info_win->points[info_win->current] == window->point)
+ return;
+
+ /* Remember this node, the currently displayed pagetop, and the current
+ location of point in this window. Because we are updating pagetops
+ and points as well as nodes, it is more efficient to avoid the
+ add_pointer_to_array macro here. */
+ if (info_win->nodes_index + 2 >= info_win->nodes_slots)
+ {
+ info_win->nodes_slots += 20;
+ info_win->nodes = (NODE **) xrealloc (info_win->nodes,
+ info_win->nodes_slots * sizeof (NODE *));
+ info_win->pagetops = (int *) xrealloc (info_win->pagetops,
+ info_win->nodes_slots * sizeof (int));
+ info_win->points = (long *) xrealloc (info_win->points,
+ info_win->nodes_slots * sizeof (long));
+ }
+
+ info_win->nodes[info_win->nodes_index] = node;
+ info_win->pagetops[info_win->nodes_index] = window->pagetop;
+ info_win->points[info_win->nodes_index] = window->point;
+ info_win->current = info_win->nodes_index++;
+ info_win->nodes[info_win->nodes_index] = NULL;
+ info_win->pagetops[info_win->nodes_index] = 0;
+ info_win->points[info_win->nodes_index] = 0;
+}
+
+#define DEBUG_FORGET_WINDOW_AND_NODES
+#if defined (DEBUG_FORGET_WINDOW_AND_NODES)
+static void
+consistency_check_info_windows (void)
+{
+ register int i;
+
+ for (i = 0; i < info_windows_index; i++)
+ {
+ WINDOW *win;
+
+ for (win = windows; win; win = win->next)
+ if (win == info_windows[i]->window)
+ break;
+
+ if (!win)
+ abort ();
+ }
+}
+#endif /* DEBUG_FORGET_WINDOW_AND_NODES */
+
+/* Remove WINDOW and its associated list of nodes from INFO_WINDOWS. */
+void
+forget_window_and_nodes (WINDOW *window)
+{
+ register int i;
+ INFO_WINDOW *info_win = (INFO_WINDOW *)NULL;
+
+ for (i = 0; info_windows && (info_win = info_windows[i]); i++)
+ if (info_win->window == window)
+ break;
+
+ /* If we found the window to forget, then do so. */
+ if (info_win)
+ {
+ while (i < info_windows_index)
+ {
+ info_windows[i] = info_windows[i + 1];
+ i++;
+ }
+
+ info_windows_index--;
+ info_windows[info_windows_index] = (INFO_WINDOW *)NULL;
+
+ if (info_win->nodes)
+ {
+ /* Free the node structures which held onto internal node contents
+ here. This doesn't free the contents; we have a garbage collector
+ which does that. */
+ for (i = 0; info_win->nodes[i]; i++)
+ if (internal_info_node_p (info_win->nodes[i]))
+ free (info_win->nodes[i]);
+ free (info_win->nodes);
+
+ maybe_free (info_win->pagetops);
+ maybe_free (info_win->points);
+ }
+
+ free (info_win);
+ }
+#if defined (DEBUG_FORGET_WINDOW_AND_NODES)
+ consistency_check_info_windows ();
+#endif /* DEBUG_FORGET_WINDOW_AND_NODES */
+}
+
+/* Set WINDOW to show NODE. Remember the new window in our list of Info
+ windows. If we are doing automatic footnote display, also try to display
+ the footnotes for this window. If REMEMBER is nonzero, first call
+ set_remembered_pagetop_and_point. */
+void
+info_set_node_of_window (int remember, WINDOW *window, NODE *node)
+{
+ if (remember)
+ set_remembered_pagetop_and_point (window);
+
+ /* Put this node into the window. */
+ window_set_node_of_window (window, node);
+
+ /* Remember this node and window in our list of info windows. */
+ remember_window_and_node (window, node);
+
+ /* If doing auto-footnote display/undisplay, show the footnotes belonging
+ to this window's node. */
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (window);
+}
+
+
+/* **************************************************************** */
+/* */
+/* Info Movement Commands */
+/* */
+/* **************************************************************** */
+
+/* Change the pagetop of WINDOW to DESIRED_TOP, perhaps scrolling the screen
+ to do so. */
+void
+set_window_pagetop (WINDOW *window, int desired_top)
+{
+ int point_line, old_pagetop;
+
+ if (desired_top < 0)
+ desired_top = 0;
+ else if (desired_top > window->line_count)
+ desired_top = window->line_count - 1;
+
+ if (window->pagetop == desired_top)
+ return;
+
+ old_pagetop = window->pagetop;
+ window->pagetop = desired_top;
+
+ /* Make sure that point appears in this window. */
+ point_line = window_line_of_point (window);
+ if ((point_line < window->pagetop) ||
+ ((point_line - window->pagetop) > window->height - 1))
+ window->point =
+ window->line_starts[window->pagetop] - window->node->contents;
+
+ window->flags |= W_UpdateWindow;
+
+ /* Find out which direction to scroll, and scroll the window in that
+ direction. Do this only if there would be a savings in redisplay
+ time. This is true if the amount to scroll is less than the height
+ of the window, and if the number of lines scrolled would be greater
+ than 10 % of the window's height. */
+ if (old_pagetop < desired_top)
+ {
+ int start, end, amount;
+
+ amount = desired_top - old_pagetop;
+
+ if ((amount >= window->height) ||
+ (((window->height - amount) * 10) < window->height))
+ return;
+
+ start = amount + window->first_row;
+ end = window->height + window->first_row;
+
+ display_scroll_display (start, end, -amount);
+ }
+ else
+ {
+ int start, end, amount;
+
+ amount = old_pagetop - desired_top;
+
+ if ((amount >= window->height) ||
+ (((window->height - amount) * 10) < window->height))
+ return;
+
+ start = window->first_row;
+ end = (window->first_row + window->height) - amount;
+ display_scroll_display (start, end, amount);
+ }
+}
+
+/* Immediately make WINDOW->point visible on the screen, and move the
+ terminal cursor there. */
+static void
+info_show_point (WINDOW *window)
+{
+ int old_pagetop;
+
+ old_pagetop = window->pagetop;
+ window_adjust_pagetop (window);
+ if (old_pagetop != window->pagetop)
+ {
+ int new_pagetop;
+
+ new_pagetop = window->pagetop;
+ window->pagetop = old_pagetop;
+ set_window_pagetop (window, new_pagetop);
+ }
+
+ if (window->flags & W_UpdateWindow)
+ display_update_one_window (window);
+
+ display_cursor_at_point (window);
+}
+
+/* Move WINDOW->point from OLD line index to NEW line index. */
+static void
+move_to_new_line (int old, int new, WINDOW *window)
+{
+ if (old == -1)
+ {
+ info_error ((char *) msg_cant_find_point, NULL, NULL);
+ }
+ else
+ {
+ int goal;
+
+ if (new >= window->line_count || new < 0)
+ return;
+
+ goal = window_get_goal_column (window);
+ window->goal_column = goal;
+
+ window->point = window->line_starts[new] - window->node->contents;
+ window->point += window_chars_to_goal (window->line_starts[new], goal);
+ info_show_point (window);
+ }
+}
+
+/* Move WINDOW's point down to the next line if possible. */
+DECLARE_INFO_COMMAND (info_next_line, _("Move down to the next line"))
+{
+ int old_line, new_line;
+
+ if (count < 0)
+ info_prev_line (window, -count, key);
+ else
+ {
+ old_line = window_line_of_point (window);
+ new_line = old_line + count;
+ move_to_new_line (old_line, new_line, window);
+ }
+}
+
+/* Move WINDOW's point up to the previous line if possible. */
+DECLARE_INFO_COMMAND (info_prev_line, _("Move up to the previous line"))
+{
+ int old_line, new_line;
+
+ if (count < 0)
+ info_next_line (window, -count, key);
+ else
+ {
+ old_line = window_line_of_point (window);
+ new_line = old_line - count;
+ move_to_new_line (old_line, new_line, window);
+ }
+}
+
+/* Move WINDOW's point to the end of the true line. */
+DECLARE_INFO_COMMAND (info_end_of_line, _("Move to the end of the line"))
+{
+ register int point, len;
+ register char *buffer;
+
+ buffer = window->node->contents;
+ len = window->node->nodelen;
+
+ for (point = window->point;
+ (point < len) && (buffer[point] != '\n');
+ point++);
+
+ if (point != window->point)
+ {
+ window->point = point;
+ info_show_point (window);
+ }
+}
+
+/* Move WINDOW's point to the beginning of the true line. */
+DECLARE_INFO_COMMAND (info_beginning_of_line, _("Move to the start of the line"))
+{
+ register int point;
+ register char *buffer;
+
+ buffer = window->node->contents;
+ point = window->point;
+
+ for (; (point) && (buffer[point - 1] != '\n'); point--);
+
+ /* If at a line start already, do nothing. */
+ if (point != window->point)
+ {
+ window->point = point;
+ info_show_point (window);
+ }
+}
+
+/* Move point forward in the node. */
+DECLARE_INFO_COMMAND (info_forward_char, _("Move forward a character"))
+{
+ if (count < 0)
+ info_backward_char (window, -count, key);
+ else
+ {
+ window->point += count;
+
+ if (window->point >= window->node->nodelen)
+ window->point = window->node->nodelen - 1;
+
+ info_show_point (window);
+ }
+}
+
+/* Move point backward in the node. */
+DECLARE_INFO_COMMAND (info_backward_char, _("Move backward a character"))
+{
+ if (count < 0)
+ info_forward_char (window, -count, key);
+ else
+ {
+ window->point -= count;
+
+ if (window->point < 0)
+ window->point = 0;
+
+ info_show_point (window);
+ }
+}
+
+#define alphabetic(c) (islower (c) || isupper (c) || isdigit (c))
+
+/* Move forward a word in this node. */
+DECLARE_INFO_COMMAND (info_forward_word, _("Move forward a word"))
+{
+ long point;
+ char *buffer;
+ int end, c;
+
+ if (count < 0)
+ {
+ info_backward_word (window, -count, key);
+ return;
+ }
+
+ point = window->point;
+ buffer = window->node->contents;
+ end = window->node->nodelen;
+
+ while (count)
+ {
+ if (point + 1 >= end)
+ return;
+
+ /* If we are not in a word, move forward until we are in one.
+ Then, move forward until we hit a non-alphabetic character. */
+ c = buffer[point];
+
+ if (!alphabetic (c))
+ {
+ while (++point < end)
+ {
+ c = buffer[point];
+ if (alphabetic (c))
+ break;
+ }
+ }
+
+ if (point >= end) return;
+
+ while (++point < end)
+ {
+ c = buffer[point];
+ if (!alphabetic (c))
+ break;
+ }
+ --count;
+ }
+ window->point = point;
+ info_show_point (window);
+}
+
+DECLARE_INFO_COMMAND (info_backward_word, _("Move backward a word"))
+{
+ long point;
+ char *buffer;
+ int c;
+
+ if (count < 0)
+ {
+ info_forward_word (window, -count, key);
+ return;
+ }
+
+ buffer = window->node->contents;
+ point = window->point;
+
+ while (count)
+ {
+ if (point == 0)
+ break;
+
+ /* Like info_forward_word (), except that we look at the
+ characters just before point. */
+
+ c = buffer[point - 1];
+
+ if (!alphabetic (c))
+ {
+ while (--point)
+ {
+ c = buffer[point - 1];
+ if (alphabetic (c))
+ break;
+ }
+ }
+
+ while (point)
+ {
+ c = buffer[point - 1];
+ if (!alphabetic (c))
+ break;
+ else
+ --point;
+ }
+ --count;
+ }
+ window->point = point;
+ info_show_point (window);
+}
+
+/* Variable controlling the behaviour of default scrolling when you are
+ already at the bottom of a node. Possible values are defined in session.h.
+ The meanings are:
+
+ IS_Continuous Try to get first menu item, or failing that, the
+ "Next:" pointer, or failing that, the "Up:" and
+ "Next:" of the up.
+ IS_NextOnly Try to get "Next:" menu item.
+ IS_PageOnly Simply give up at the bottom of a node. */
+
+int info_scroll_behaviour = IS_Continuous;
+
+/* Choices used by the completer when reading a value for the user-visible
+ variable "scroll-behaviour". */
+char *info_scroll_choices[] = {
+ "Continuous", "Next Only", "Page Only", (char *)NULL
+};
+
+/* Default window sizes for scrolling commands. */
+int default_window_size = -1; /* meaning 1 window-full */
+int default_scroll_size = -1; /* meaning half screen size */
+
+#define INFO_LABEL_FOUND() \
+ (info_parsed_nodename || (info_parsed_filename \
+ && !is_dir_name (info_parsed_filename)))
+
+/* Move to 1st menu item, Next, Up/Next, or error in this window. */
+static void
+forward_move_node_structure (WINDOW *window, int behaviour)
+{
+ switch (behaviour)
+ {
+ case IS_PageOnly:
+ info_error ((char *) msg_at_node_bottom, NULL, NULL);
+ break;
+
+ case IS_NextOnly:
+ info_next_label_of_node (window->node);
+ if (!info_parsed_nodename && !info_parsed_filename)
+ info_error ((char *) msg_no_pointer, (char *) _("Next"), NULL);
+ else
+ {
+ window_message_in_echo_area ((char *) _("Following Next node..."),
+ NULL, NULL);
+ info_handle_pointer ("Next", window);
+ }
+ break;
+
+ case IS_Continuous:
+ {
+ /* First things first. If this node contains a menu, move down
+ into the menu. */
+ {
+ REFERENCE **menu;
+
+ menu = info_menu_of_node (window->node);
+
+ if (menu)
+ {
+ info_free_references (menu);
+ window_message_in_echo_area ((char *) _("Selecting first menu item..."),
+ NULL, NULL);
+ info_menu_digit (window, 1, '1');
+ return;
+ }
+ }
+
+ /* Okay, this node does not contain a menu. If it contains a
+ "Next:" pointer, use that. */
+ info_next_label_of_node (window->node);
+ if (INFO_LABEL_FOUND ())
+ {
+ window_message_in_echo_area ((char *) _("Selecting Next node..."),
+ NULL, NULL);
+ info_handle_pointer ("Next", window);
+ return;
+ }
+
+ /* Okay, there wasn't a "Next:" for this node. Move "Up:" until we
+ can move "Next:". If that isn't possible, complain that there
+ are no more nodes. */
+ {
+ int up_counter, old_current;
+ INFO_WINDOW *info_win;
+
+ /* Remember the current node and location. */
+ info_win = get_info_window_of_window (window);
+ old_current = info_win->current;
+
+ /* Back up through the "Up:" pointers until we have found a "Next:"
+ that isn't the same as the first menu item found in that node. */
+ up_counter = 0;
+ while (!info_error_was_printed)
+ {
+ info_up_label_of_node (window->node);
+ if (INFO_LABEL_FOUND ())
+ {
+ info_handle_pointer ("Up", window);
+ if (info_error_was_printed)
+ continue;
+
+ up_counter++;
+
+ info_next_label_of_node (window->node);
+
+ /* If no "Next" pointer, keep backing up. */
+ if (!INFO_LABEL_FOUND ())
+ continue;
+
+ /* If this node's first menu item is the same as this node's
+ Next pointer, keep backing up. */
+ if (!info_parsed_filename)
+ {
+ REFERENCE **menu;
+ char *next_nodename;
+
+ /* Remember the name of the Next node, since reading
+ the menu can overwrite the contents of the
+ info_parsed_xxx strings. */
+ next_nodename = xstrdup (info_parsed_nodename);
+
+ menu = info_menu_of_node (window->node);
+ if (menu &&
+ (strcmp
+ (menu[0]->nodename, next_nodename) == 0))
+ {
+ info_free_references (menu);
+ free (next_nodename);
+ continue;
+ }
+ else
+ {
+ /* Restore the world to where it was before
+ reading the menu contents. */
+ info_free_references (menu);
+ free (next_nodename);
+ info_next_label_of_node (window->node);
+ }
+ }
+
+ /* This node has a "Next" pointer, and it is not the
+ same as the first menu item found in this node. */
+ window_message_in_echo_area
+ ((char *) _("Moving Up %d time(s), then Next."),
+ (void *) (long) up_counter, NULL);
+
+ info_handle_pointer ("Next", window);
+ return;
+ }
+ else
+ {
+ /* No more "Up" pointers. Print an error, and call it
+ quits. */
+ register int i;
+
+ for (i = 0; i < up_counter; i++)
+ {
+ info_win->nodes_index--;
+ free (info_win->nodes[info_win->nodes_index]);
+ info_win->nodes[info_win->nodes_index] = (NODE *)NULL;
+ }
+ info_win->current = old_current;
+ window->node = info_win->nodes[old_current];
+ window->pagetop = info_win->pagetops[old_current];
+ window->point = info_win->points[old_current];
+ recalculate_line_starts (window);
+ window->flags |= W_UpdateWindow;
+ info_error ((char *) _("No more nodes within this document."),
+ NULL, NULL);
+ }
+ }
+ }
+ break;
+ }
+ }
+}
+
+/* Move Prev, Up or error in WINDOW depending on BEHAVIOUR. */
+static void
+backward_move_node_structure (WINDOW *window, int behaviour)
+{
+ switch (behaviour)
+ {
+ case IS_PageOnly:
+ info_error ((char *) msg_at_node_top, NULL, NULL);
+ break;
+
+ case IS_NextOnly:
+ info_prev_label_of_node (window->node);
+ if (!info_parsed_nodename && !info_parsed_filename)
+ info_error ((char *) _("No `Prev' for this node."), NULL, NULL);
+ else
+ {
+ window_message_in_echo_area ((char *) _("Moving Prev in this window."),
+ NULL, NULL);
+ info_handle_pointer ("Prev", window);
+ }
+ break;
+
+ case IS_Continuous:
+ info_prev_label_of_node (window->node);
+
+ if (!info_parsed_nodename && (!info_parsed_filename
+ || is_dir_name (info_parsed_filename)))
+ {
+ info_up_label_of_node (window->node);
+ if (!info_parsed_nodename && (!info_parsed_filename
+ || is_dir_name (info_parsed_filename)))
+ info_error ((char *)
+ _("No `Prev' or `Up' for this node within this document."),
+ NULL, NULL);
+ else
+ {
+ window_message_in_echo_area ((char *) _("Moving Up in this window."),
+ NULL, NULL);
+ info_handle_pointer ("Up", window);
+ }
+ }
+ else
+ {
+ REFERENCE **menu;
+ int inhibit_menu_traversing = 0;
+
+ /* Watch out! If this node's Prev is the same as the Up, then
+ move Up. Otherwise, we could move Prev, and then to the last
+ menu item in the Prev. This would cause the user to loop
+ through a subsection of the info file. */
+ if (!info_parsed_filename && info_parsed_nodename)
+ {
+ char *pnode;
+
+ pnode = xstrdup (info_parsed_nodename);
+ info_up_label_of_node (window->node);
+
+ if (!info_parsed_filename && info_parsed_nodename &&
+ strcmp (info_parsed_nodename, pnode) == 0)
+ {
+ /* The nodes are the same. Inhibit moving to the last
+ menu item. */
+ free (pnode);
+ inhibit_menu_traversing = 1;
+ }
+ else
+ {
+ free (pnode);
+ info_prev_label_of_node (window->node);
+ }
+ }
+
+ /* Move to the previous node. If this node now contains a menu,
+ and we have not inhibited movement to it, move to the node
+ corresponding to the last menu item. */
+ window_message_in_echo_area ((char *) _("Moving Prev in this window."),
+ NULL, NULL);
+ info_handle_pointer ("Prev", window);
+
+ if (!inhibit_menu_traversing)
+ {
+ while (!info_error_was_printed &&
+ (menu = info_menu_of_node (window->node)))
+ {
+ info_free_references (menu);
+ window_message_in_echo_area
+ ((char *) _("Moving to `Prev's last menu item."), NULL, NULL);
+ info_menu_digit (window, 1, '0');
+ }
+ }
+ }
+ break;
+ }
+}
+
+/* Move continuously forward through the node structure of this info file. */
+DECLARE_INFO_COMMAND (info_global_next_node,
+ _("Move forwards or down through node structure"))
+{
+ if (count < 0)
+ info_global_prev_node (window, -count, key);
+ else
+ {
+ while (count && !info_error_was_printed)
+ {
+ forward_move_node_structure (window, IS_Continuous);
+ count--;
+ }
+ }
+}
+
+/* Move continuously backward through the node structure of this info file. */
+DECLARE_INFO_COMMAND (info_global_prev_node,
+ _("Move backwards or up through node structure"))
+{
+ if (count < 0)
+ info_global_next_node (window, -count, key);
+ else
+ {
+ while (count && !info_error_was_printed)
+ {
+ backward_move_node_structure (window, IS_Continuous);
+ count--;
+ }
+ }
+}
+
+static void _scroll_forward(WINDOW *window, int count,
+ unsigned char key, int behaviour);
+static void _scroll_backward(WINDOW *window, int count,
+ unsigned char key, int behaviour);
+
+static void
+_scroll_forward(WINDOW *window, int count, unsigned char key, int behaviour)
+{
+ if (count < 0)
+ _scroll_backward (window, -count, key, behaviour);
+ else
+ {
+ int desired_top;
+
+ /* Without an explicit numeric argument, scroll the bottom two
+ lines to the top of this window, Or, if at bottom of window,
+ and the chosen behaviour is to scroll through nodes get the
+ "Next" node for this window. */
+ if (default_window_size > 0)
+ desired_top = window->pagetop + default_window_size;
+ else if (!info_explicit_arg && count == 1)
+ {
+ desired_top = window->pagetop + (window->height - 2);
+
+ /* If there are no more lines to scroll here, error, or get
+ another node, depending on BEHAVIOUR. */
+ if (desired_top > window->line_count)
+ {
+ forward_move_node_structure (window, behaviour);
+ return;
+ }
+ }
+ else
+ desired_top = window->pagetop + count;
+
+ if (desired_top >= window->line_count)
+ desired_top = window->line_count - 2;
+
+ if (window->pagetop > desired_top)
+ return;
+ else
+ set_window_pagetop (window, desired_top);
+ }
+}
+
+static void
+_scroll_backward(WINDOW *window, int count, unsigned char key, int behaviour)
+{
+ if (count < 0)
+ _scroll_forward (window, -count, key, behaviour);
+ else
+ {
+ int desired_top;
+
+ /* Without an explicit numeric argument, scroll the top two lines
+ to the bottom of this window, or, depending on the selected
+ behaviour, move to the previous, or Up'th node. */
+ if (default_window_size > 0)
+ desired_top = window->pagetop - default_window_size;
+ else if (!info_explicit_arg && count == 1)
+ {
+ desired_top = window->pagetop - (window->height - 2);
+
+ if ((desired_top < 0) && (window->pagetop == 0))
+ {
+ backward_move_node_structure (window, behaviour);
+ return;
+ }
+ }
+ else
+ desired_top = window->pagetop - count;
+
+ if (desired_top < 0)
+ desired_top = 0;
+
+ set_window_pagetop (window, desired_top);
+ }
+}
+
+/* Show the next screen of WINDOW's node. */
+DECLARE_INFO_COMMAND (info_scroll_forward, _("Scroll forward in this window"))
+{
+ _scroll_forward (window, count, key, info_scroll_behaviour);
+}
+
+/* Like info_scroll_forward, but sets default_window_size as a side
+ effect. */
+DECLARE_INFO_COMMAND (info_scroll_forward_set_window,
+ _("Scroll forward in this window and set default window size"))
+{
+ if (info_explicit_arg)
+ default_window_size = count;
+ _scroll_forward (window, count, key, info_scroll_behaviour);
+}
+
+/* Show the next screen of WINDOW's node but never advance to next node. */
+DECLARE_INFO_COMMAND (info_scroll_forward_page_only, _("Scroll forward in this window staying within node"))
+{
+ _scroll_forward (window, count, key, IS_PageOnly);
+}
+
+/* Like info_scroll_forward_page_only, but sets default_window_size as a side
+ effect. */
+DECLARE_INFO_COMMAND (info_scroll_forward_page_only_set_window,
+ _("Scroll forward in this window staying within node and set default window size"))
+{
+ if (info_explicit_arg)
+ default_window_size = count;
+ _scroll_forward (window, count, key, IS_PageOnly);
+}
+
+/* Show the previous screen of WINDOW's node. */
+DECLARE_INFO_COMMAND (info_scroll_backward, _("Scroll backward in this window"))
+{
+ _scroll_backward (window, count, key, info_scroll_behaviour);
+}
+
+/* Like info_scroll_backward, but sets default_window_size as a side
+ effect. */
+DECLARE_INFO_COMMAND (info_scroll_backward_set_window,
+ _("Scroll backward in this window and set default window size"))
+{
+ if (info_explicit_arg)
+ default_window_size = count;
+ _scroll_backward (window, count, key, info_scroll_behaviour);
+}
+
+/* Show the previous screen of WINDOW's node but never move to previous
+ node. */
+DECLARE_INFO_COMMAND (info_scroll_backward_page_only, _("Scroll backward in this window staying within node"))
+{
+ _scroll_backward (window, count, key, IS_PageOnly);
+}
+
+/* Like info_scroll_backward_page_only, but sets default_window_size as a side
+ effect. */
+DECLARE_INFO_COMMAND (info_scroll_backward_page_only_set_window,
+ _("Scroll backward in this window staying within node and set default window size"))
+{
+ if (info_explicit_arg)
+ default_window_size = count;
+ _scroll_backward (window, count, key, IS_PageOnly);
+}
+
+/* Move to the beginning of the node. */
+DECLARE_INFO_COMMAND (info_beginning_of_node, _("Move to the start of this node"))
+{
+ window->pagetop = window->point = 0;
+ window->flags |= W_UpdateWindow;
+}
+
+/* Move to the end of the node. */
+DECLARE_INFO_COMMAND (info_end_of_node, _("Move to the end of this node"))
+{
+ window->point = window->node->nodelen - 1;
+ info_show_point (window);
+}
+
+/* Scroll the window forward by N lines. */
+DECLARE_INFO_COMMAND (info_down_line, _("Scroll down by lines"))
+{
+ if (count < 0)
+ info_up_line (window, -count, key);
+ else
+ {
+ int desired_top = window->pagetop + count;
+
+ if (desired_top >= window->line_count)
+ desired_top = window->line_count - 2;
+
+ if (window->pagetop <= desired_top)
+ set_window_pagetop (window, desired_top);
+ }
+}
+
+/* Scroll the window backward by N lines. */
+DECLARE_INFO_COMMAND (info_up_line, _("Scroll up by lines"))
+{
+ if (count < 0)
+ info_down_line (window, -count, key);
+ else
+ {
+ int desired_top = window->pagetop - count;
+
+ if (desired_top < 0)
+ desired_top = 0;
+
+ set_window_pagetop (window, desired_top);
+ }
+}
+
+/* Scroll the window forward by N lines and remember N as default for
+ subsequent commands. */
+DECLARE_INFO_COMMAND (info_scroll_half_screen_down,
+ _("Scroll down by half screen size"))
+{
+ if (count < 0)
+ info_scroll_half_screen_up (window, -count, key);
+ else
+ {
+ int scroll_size = (the_screen->height + 1) / 2;
+ int desired_top;
+
+ if (info_explicit_arg)
+ default_scroll_size = count;
+ if (default_scroll_size > 0)
+ scroll_size = default_scroll_size;
+
+ desired_top = window->pagetop + scroll_size;
+ if (desired_top >= window->line_count)
+ desired_top = window->line_count - 2;
+
+ if (window->pagetop <= desired_top)
+ set_window_pagetop (window, desired_top);
+ }
+}
+
+/* Scroll the window backward by N lines and remember N as default for
+ subsequent commands. */
+DECLARE_INFO_COMMAND (info_scroll_half_screen_up,
+ _("Scroll up by half screen size"))
+{
+ if (count < 0)
+ info_scroll_half_screen_down (window, -count, key);
+ else
+ {
+ int scroll_size = (the_screen->height + 1) / 2;
+ int desired_top;
+
+ if (info_explicit_arg)
+ default_scroll_size = count;
+ if (default_scroll_size > 0)
+ scroll_size = default_scroll_size;
+
+ desired_top = window->pagetop - scroll_size;
+ if (desired_top < 0)
+ desired_top = 0;
+
+ set_window_pagetop (window, desired_top);
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Commands for Manipulating Windows */
+/* */
+/* **************************************************************** */
+
+/* Make the next window in the chain be the active window. */
+DECLARE_INFO_COMMAND (info_next_window, _("Select the next window"))
+{
+ if (count < 0)
+ {
+ info_prev_window (window, -count, key);
+ return;
+ }
+
+ /* If no other window, error now. */
+ if (!windows->next && !echo_area_is_active)
+ {
+ info_error ((char *) msg_one_window, NULL, NULL);
+ return;
+ }
+
+ while (count--)
+ {
+ if (window->next)
+ window = window->next;
+ else
+ {
+ if (window == the_echo_area || !echo_area_is_active)
+ window = windows;
+ else
+ window = the_echo_area;
+ }
+ }
+
+ if (active_window != window)
+ {
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (window);
+
+ window->flags |= W_UpdateWindow;
+ active_window = window;
+ }
+}
+
+/* Make the previous window in the chain be the active window. */
+DECLARE_INFO_COMMAND (info_prev_window, _("Select the previous window"))
+{
+ if (count < 0)
+ {
+ info_next_window (window, -count, key);
+ return;
+ }
+
+ /* Only one window? */
+
+ if (!windows->next && !echo_area_is_active)
+ {
+ info_error ((char *) msg_one_window, NULL, NULL);
+ return;
+ }
+
+ while (count--)
+ {
+ /* If we are in the echo area, or if the echo area isn't active and we
+ are in the first window, find the last window in the chain. */
+ if (window == the_echo_area ||
+ (window == windows && !echo_area_is_active))
+ {
+ register WINDOW *win, *last = NULL;
+
+ for (win = windows; win; win = win->next)
+ last = win;
+
+ window = last;
+ }
+ else
+ {
+ if (window == windows)
+ window = the_echo_area;
+ else
+ window = window->prev;
+ }
+ }
+
+ if (active_window != window)
+ {
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (window);
+
+ window->flags |= W_UpdateWindow;
+ active_window = window;
+ }
+}
+
+/* Split WINDOW into two windows, both showing the same node. If we
+ are automatically tiling windows, re-tile after the split. */
+DECLARE_INFO_COMMAND (info_split_window, _("Split the current window"))
+{
+ WINDOW *split, *old_active;
+ int pagetop;
+
+ /* Remember the current pagetop of the window being split. If it doesn't
+ change, we can scroll its contents around after the split. */
+ pagetop = window->pagetop;
+
+ /* Make the new window. */
+ old_active = active_window;
+ active_window = window;
+ split = window_make_window (window->node);
+ active_window = old_active;
+
+ if (!split)
+ {
+ info_error ((char *) msg_win_too_small, NULL, NULL);
+ }
+ else
+ {
+#if defined (SPLIT_BEFORE_ACTIVE)
+ /* Try to scroll the old window into its new postion. */
+ if (pagetop == window->pagetop)
+ {
+ int start, end, amount;
+
+ start = split->first_row;
+ end = start + window->height;
+ amount = split->height + 1;
+ display_scroll_display (start, end, amount);
+ }
+#else /* !SPLIT_BEFORE_ACTIVE */
+ /* Make sure point still appears in the active window. */
+ info_show_point (window);
+#endif /* !SPLIT_BEFORE_ACTIVE */
+
+ /* If the window just split was one internal to Info, try to display
+ something else in it. */
+ if (internal_info_node_p (split->node))
+ {
+ register int i, j;
+ INFO_WINDOW *iw;
+ NODE *node = (NODE *)NULL;
+ char *filename;
+
+ for (i = 0; (iw = info_windows[i]); i++)
+ {
+ for (j = 0; j < iw->nodes_index; j++)
+ if (!internal_info_node_p (iw->nodes[j]))
+ {
+ if (iw->nodes[j]->parent)
+ filename = iw->nodes[j]->parent;
+ else
+ filename = iw->nodes[j]->filename;
+
+ node = info_get_node (filename, iw->nodes[j]->nodename);
+ if (node)
+ {
+ window_set_node_of_window (split, node);
+ i = info_windows_index - 1;
+ break;
+ }
+ }
+ }
+ }
+ split->pagetop = window->pagetop;
+
+ if (auto_tiling_p)
+ window_tile_windows (DONT_TILE_INTERNALS);
+ else
+ window_adjust_pagetop (split);
+
+ remember_window_and_node (split, split->node);
+ }
+}
+
+/* Delete WINDOW, forgetting the list of last visited nodes. If we are
+ automatically displaying footnotes, show or remove the footnotes
+ window. If we are automatically tiling windows, re-tile after the
+ deletion. */
+DECLARE_INFO_COMMAND (info_delete_window, _("Delete the current window"))
+{
+ if (!windows->next)
+ {
+ info_error ((char *) msg_cant_kill_last, NULL, NULL);
+ }
+ else if (window->flags & W_WindowIsPerm)
+ {
+ info_error ((char *) _("Cannot delete a permanent window"), NULL, NULL);
+ }
+ else
+ {
+ info_delete_window_internal (window);
+
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (active_window);
+
+ if (auto_tiling_p)
+ window_tile_windows (DONT_TILE_INTERNALS);
+ }
+}
+
+/* Do the physical deletion of WINDOW, and forget this window and
+ associated nodes. */
+void
+info_delete_window_internal (WINDOW *window)
+{
+ if (windows->next && ((window->flags & W_WindowIsPerm) == 0))
+ {
+ /* We not only delete the window from the display, we forget it from
+ our list of remembered windows. */
+ forget_window_and_nodes (window);
+ window_delete_window (window);
+
+ if (echo_area_is_active)
+ echo_area_inform_of_deleted_window (window);
+ }
+}
+
+/* Just keep WINDOW, deleting all others. */
+DECLARE_INFO_COMMAND (info_keep_one_window, _("Delete all other windows"))
+{
+ int num_deleted; /* The number of windows we deleted. */
+ int pagetop, start, end;
+
+ /* Remember a few things about this window. We may be able to speed up
+ redisplay later by scrolling its contents. */
+ pagetop = window->pagetop;
+ start = window->first_row;
+ end = start + window->height;
+
+ num_deleted = 0;
+
+ while (1)
+ {
+ WINDOW *win;
+
+ /* Find an eligible window and delete it. If no eligible windows
+ are found, we are done. A window is eligible for deletion if
+ is it not permanent, and it is not WINDOW. */
+ for (win = windows; win; win = win->next)
+ if (win != window && ((win->flags & W_WindowIsPerm) == 0))
+ break;
+
+ if (!win)
+ break;
+
+ info_delete_window_internal (win);
+ num_deleted++;
+ }
+
+ /* Scroll the contents of this window into the right place so that the
+ user doesn't have to wait any longer than necessary for redisplay. */
+ if (num_deleted)
+ {
+ int amount;
+
+ amount = (window->first_row - start);
+ amount -= (window->pagetop - pagetop);
+ display_scroll_display (start, end, amount);
+ }
+
+ window->flags |= W_UpdateWindow;
+}
+
+/* Scroll the "other" window of WINDOW. */
+DECLARE_INFO_COMMAND (info_scroll_other_window, _("Scroll the other window"))
+{
+ WINDOW *other;
+
+ /* If only one window, give up. */
+ if (!windows->next)
+ {
+ info_error ((char *) msg_one_window, NULL, NULL);
+ return;
+ }
+
+ other = window->next;
+
+ if (!other)
+ other = window->prev;
+
+ info_scroll_forward (other, count, key);
+}
+
+/* Scroll the "other" window of WINDOW. */
+DECLARE_INFO_COMMAND (info_scroll_other_window_backward,
+ _("Scroll the other window backward"))
+{
+ info_scroll_other_window (window, -count, key);
+}
+
+/* Change the size of WINDOW by AMOUNT. */
+DECLARE_INFO_COMMAND (info_grow_window, _("Grow (or shrink) this window"))
+{
+ window_change_window_height (window, count);
+}
+
+/* When non-zero, tiling takes place automatically when info_split_window
+ is called. */
+int auto_tiling_p = 0;
+
+/* Tile all of the visible windows. */
+DECLARE_INFO_COMMAND (info_tile_windows,
+ _("Divide the available screen space among the visible windows"))
+{
+ window_tile_windows (TILE_INTERNALS);
+}
+
+/* Toggle the state of this window's wrapping of lines. */
+DECLARE_INFO_COMMAND (info_toggle_wrap,
+ _("Toggle the state of line wrapping in the current window"))
+{
+ window_toggle_wrap (window);
+}
+
+/* **************************************************************** */
+/* */
+/* Info Node Commands */
+/* */
+/* **************************************************************** */
+
+/* Return (FILENAME)NODENAME for NODE, or just NODENAME if NODE's
+ filename is not set. */
+char *
+node_printed_rep (NODE *node)
+{
+ char *rep;
+
+ if (node->filename)
+ {
+ char *filename
+ = filename_non_directory (node->parent ? node->parent : node->filename);
+ rep = xmalloc (1 + strlen (filename) + 1 + strlen (node->nodename) + 1);
+ sprintf (rep, "(%s)%s", filename, node->nodename);
+ }
+ else
+ rep = node->nodename;
+
+ return rep;
+}
+
+
+/* Using WINDOW for various defaults, select the node referenced by ENTRY
+ in it. If the node is selected, the window and node are remembered. */
+void
+info_select_reference (WINDOW *window, REFERENCE *entry)
+{
+ NODE *node;
+ char *filename, *nodename, *file_system_error;
+
+ file_system_error = (char *)NULL;
+
+ filename = entry->filename;
+ if (!filename)
+ filename = window->node->parent;
+ if (!filename)
+ filename = window->node->filename;
+
+ if (filename)
+ filename = xstrdup (filename);
+
+ if (entry->nodename)
+ nodename = xstrdup (entry->nodename);
+ else
+ nodename = xstrdup ("Top");
+
+ node = info_get_node (filename, nodename);
+
+ /* Try something a little weird. If the node couldn't be found, and the
+ reference was of the form "foo::", see if the entry->label can be found
+ as a file, with a node of "Top". */
+ if (!node)
+ {
+ if (info_recent_file_error)
+ file_system_error = xstrdup (info_recent_file_error);
+
+ if (entry->nodename && (strcmp (entry->nodename, entry->label) == 0))
+ {
+ node = info_get_node (entry->label, "Top");
+ if (!node && info_recent_file_error)
+ {
+ maybe_free (file_system_error);
+ file_system_error = xstrdup (info_recent_file_error);
+ }
+ }
+ }
+
+ if (!node)
+ {
+ if (file_system_error)
+ info_error (file_system_error, NULL, NULL);
+ else
+ info_error ((char *) msg_cant_find_node, nodename, NULL);
+ }
+
+ maybe_free (file_system_error);
+ maybe_free (filename);
+ maybe_free (nodename);
+
+ if (node)
+ info_set_node_of_window (1, window, node);
+}
+
+/* Parse the node specification in LINE using WINDOW to default the filename.
+ Select the parsed node in WINDOW and remember it, or error if the node
+ couldn't be found. */
+static void
+info_parse_and_select (char *line, WINDOW *window)
+{
+ REFERENCE entry;
+
+ info_parse_node (line, DONT_SKIP_NEWLINES);
+
+ entry.nodename = info_parsed_nodename;
+ entry.filename = info_parsed_filename;
+ entry.label = "*info-parse-and-select*";
+
+ info_select_reference (window, &entry);
+}
+
+/* Given that the values of INFO_PARSED_FILENAME and INFO_PARSED_NODENAME
+ are previously filled, try to get the node represented by them into
+ WINDOW. The node should have been pointed to by the LABEL pointer of
+ WINDOW->node. */
+static void
+info_handle_pointer (char *label, WINDOW *window)
+{
+ if (info_parsed_filename || info_parsed_nodename)
+ {
+ char *filename, *nodename;
+ NODE *node;
+
+ filename = nodename = (char *)NULL;
+
+ if (info_parsed_filename)
+ filename = xstrdup (info_parsed_filename);
+ else
+ {
+ if (window->node->parent)
+ filename = xstrdup (window->node->parent);
+ else if (window->node->filename)
+ filename = xstrdup (window->node->filename);
+ }
+
+ if (info_parsed_nodename)
+ nodename = xstrdup (info_parsed_nodename);
+ else
+ nodename = xstrdup ("Top");
+
+ node = info_get_node (filename, nodename);
+
+ if (node)
+ {
+ INFO_WINDOW *info_win;
+
+ info_win = get_info_window_of_window (window);
+ if (info_win)
+ {
+ info_win->pagetops[info_win->current] = window->pagetop;
+ info_win->points[info_win->current] = window->point;
+ }
+ info_set_node_of_window (1, window, node);
+ }
+ else
+ {
+ if (info_recent_file_error)
+ info_error (info_recent_file_error, NULL, NULL);
+ else
+ info_error ((char *) msg_cant_file_node, filename, nodename);
+ }
+
+ free (filename);
+ free (nodename);
+ }
+ else
+ {
+ info_error ((char *) msg_no_pointer, label, NULL);
+ }
+}
+
+/* Make WINDOW display the "Next:" node of the node currently being
+ displayed. */
+DECLARE_INFO_COMMAND (info_next_node, _("Select the Next node"))
+{
+ info_next_label_of_node (window->node);
+ info_handle_pointer ("Next", window);
+}
+
+/* Make WINDOW display the "Prev:" node of the node currently being
+ displayed. */
+DECLARE_INFO_COMMAND (info_prev_node, _("Select the Prev node"))
+{
+ info_prev_label_of_node (window->node);
+ info_handle_pointer ("Prev", window);
+}
+
+/* Make WINDOW display the "Up:" node of the node currently being
+ displayed. */
+DECLARE_INFO_COMMAND (info_up_node, _("Select the Up node"))
+{
+ info_up_label_of_node (window->node);
+ info_handle_pointer ("Up", window);
+}
+
+/* Make WINDOW display the last node of this info file. */
+DECLARE_INFO_COMMAND (info_last_node, _("Select the last node in this file"))
+{
+ register int i;
+ FILE_BUFFER *fb = file_buffer_of_window (window);
+ NODE *node = (NODE *)NULL;
+
+ if (fb && fb->tags)
+ {
+ int last_node_tag_idx = -1;
+
+ /* If no explicit argument, or argument of zero, default to the
+ last node. */
+ if (count == 0 || (count == 1 && !info_explicit_arg))
+ count = -1;
+ for (i = 0; count && fb->tags[i]; i++)
+ if (fb->tags[i]->nodelen != 0) /* don't count anchor tags */
+ {
+ count--;
+ last_node_tag_idx = i;
+ }
+ if (count > 0)
+ i = last_node_tag_idx + 1;
+ if (i > 0)
+ node = info_get_node (fb->filename, fb->tags[i - 1]->nodename);
+ }
+
+ if (!node)
+ info_error ((char *) _("This window has no additional nodes"), NULL, NULL);
+ else
+ info_set_node_of_window (1, window, node);
+}
+
+/* Make WINDOW display the first node of this info file. */
+DECLARE_INFO_COMMAND (info_first_node, _("Select the first node in this file"))
+{
+ FILE_BUFFER *fb = file_buffer_of_window (window);
+ NODE *node = (NODE *)NULL;
+
+ /* If no explicit argument, or argument of zero, default to the
+ first node. */
+ if (count == 0)
+ count = 1;
+ if (fb && fb->tags)
+ {
+ register int i;
+ int last_node_tag_idx = -1;
+
+ for (i = 0; count && fb->tags[i]; i++)
+ if (fb->tags[i]->nodelen != 0) /* don't count anchor tags */
+ {
+ count--;
+ last_node_tag_idx = i;
+ }
+ if (count > 0)
+ i = last_node_tag_idx + 1;
+ if (i > 0)
+ node = info_get_node (fb->filename, fb->tags[i - 1]->nodename);
+ }
+
+ if (!node)
+ info_error ((char *) _("This window has no additional nodes"), NULL, NULL);
+ else
+ info_set_node_of_window (1, window, node);
+}
+
+/* Select the last menu item in WINDOW->node. */
+DECLARE_INFO_COMMAND (info_last_menu_item,
+ _("Select the last item in this node's menu"))
+{
+ info_menu_digit (window, 1, '0');
+}
+
+/* Use KEY (a digit) to select the Nth menu item in WINDOW->node. */
+DECLARE_INFO_COMMAND (info_menu_digit, _("Select this menu item"))
+{
+ register int i, item;
+ register REFERENCE **menu;
+
+ menu = info_menu_of_node (window->node);
+
+ if (!menu)
+ {
+ info_error ((char *) msg_no_menu_node, NULL, NULL);
+ return;
+ }
+
+ /* We have the menu. See if there are this many items in it. */
+ item = key - '0';
+
+ /* Special case. Item "0" is the last item in this menu. */
+ if (item == 0)
+ for (i = 0; menu[i + 1]; i++);
+ else
+ {
+ for (i = 0; menu[i]; i++)
+ if (i == item - 1)
+ break;
+ }
+
+ if (menu[i])
+ {
+ info_select_reference (window, menu[i]);
+ if (menu[i]->line_number > 0)
+ info_next_line (window, menu[i]->line_number - 1, key);
+ }
+ else
+ info_error ((char *) _("There aren't %d items in this menu."),
+ (void *) (long) item, NULL);
+
+ info_free_references (menu);
+ return;
+}
+
+
+
+/* Return a pointer to the xref in XREF_LIST that is nearest to POS, or
+ NULL if XREF_LIST is empty. That is, if POS is within any of the
+ given xrefs, return that one. Otherwise, return the one with the
+ nearest beginning or end. If there are two that are equidistant,
+ prefer the one forward. The return is in newly-allocated memory,
+ since the caller frees it.
+
+ This is called from info_menu_or_ref_item with XREF_LIST being all
+ the xrefs in the node, and POS being point. The ui function that
+ starts it all off is select-reference-this-line.
+
+ This is not the same logic as in info.el. Info-get-token prefers
+ searching backwards to searching forwards, and has a hardwired search
+ limit of 200 chars (in Emacs 21.2). */
+
+static REFERENCE **
+nearest_xref (REFERENCE **xref_list, long int pos)
+{
+ int this_xref;
+ int nearest = -1;
+ long best_delta = -1;
+
+ for (this_xref = 0; xref_list[this_xref]; this_xref++)
+ {
+ long delta;
+ REFERENCE *xref = xref_list[this_xref];
+ if (xref->start <= pos && pos <= xref->end)
+ { /* POS is within this xref, we're done */
+ nearest = this_xref;
+ break;
+ }
+
+ /* See how far POS is from this xref. Take into account the
+ `*Note' that begins the xref, since as far as the user is
+ concerned, that's where it starts. */
+ delta = MIN (labs (pos - (xref->start - strlen (INFO_XREF_LABEL))),
+ labs (pos - xref->end));
+
+ /* It's the <= instead of < that makes us choose the forward xref
+ of POS if two are equidistant. Of course, because of all the
+ punctuation surrounding xrefs, it's not necessarily obvious
+ where one ends. */
+ if (delta <= best_delta || best_delta < 0)
+ {
+ nearest = this_xref;
+ best_delta = delta;
+ }
+ }
+
+ /* Maybe there was no list to search through. */
+ if (nearest < 0)
+ return NULL;
+
+ /* Ok, we have a nearest xref, make a list of it. */
+ {
+ REFERENCE **ret = xmalloc (sizeof (REFERENCE *) * 2);
+ ret[0] = info_copy_reference (xref_list[nearest]);
+ ret[1] = NULL;
+ return ret;
+ }
+}
+
+
+/* Read a menu or followed reference from the user defaulting to the
+ reference found on the current line, and select that node. The
+ reading is done with completion. BUILDER is the function used
+ to build the list of references. ASK_P is non-zero if the user
+ should be prompted, or zero to select the default item. */
+static void
+info_menu_or_ref_item (WINDOW *window, int count,
+ unsigned char key, REFERENCE **(*builder) (NODE *node), int ask_p)
+{
+ char *line;
+ REFERENCE *entry;
+ REFERENCE *defentry = NULL;
+ REFERENCE **menu = (*builder) (window->node);
+
+ if (!menu)
+ {
+ if (builder == info_menu_of_node)
+ info_error ((char *) msg_no_menu_node, NULL, NULL);
+ else
+ info_error ((char *) msg_no_xref_node, NULL, NULL);
+ return;
+ }
+
+ /* Default the selected reference to the one which is on the line that
+ point is in. */
+ {
+ REFERENCE **refs = NULL;
+ int point_line = window_line_of_point (window);
+
+ if (point_line != -1)
+ {
+ SEARCH_BINDING binding;
+
+ binding.buffer = window->node->contents;
+ binding.start = window->line_starts[point_line] - binding.buffer;
+ if (window->line_starts[point_line + 1])
+ binding.end = window->line_starts[point_line + 1] - binding.buffer;
+ else
+ binding.end = window->node->nodelen;
+ binding.flags = 0;
+
+ if (builder == info_menu_of_node)
+ {
+ if (point_line)
+ {
+ binding.start--;
+ refs = info_menu_items (&binding);
+ }
+ }
+ else
+ {
+#if defined (HANDLE_MAN_PAGES)
+ if (window->node->flags & N_IsManPage)
+ refs = manpage_xrefs_in_binding (window->node, &binding);
+ else
+#endif /* HANDLE_MAN_PAGES */
+ refs = nearest_xref (menu, window->point);
+ }
+
+ if (refs && refs[0])
+ {
+ if (strcmp (refs[0]->label, "Menu") != 0
+ || builder == info_xrefs_of_node)
+ {
+ int which = 0;
+
+ /* For xrefs, find the closest reference to point,
+ unless we only have one reference (as we will if
+ we've called nearest_xref above). It would be better
+ to have only one piece of code, but the conditions
+ when we call this are tangled. */
+ if (builder == info_xrefs_of_node && refs[1])
+ {
+ int closest = -1;
+
+ for (; refs[which]; which++)
+ {
+ if (window->point >= refs[which]->start
+ && window->point <= refs[which]->end)
+ {
+ closest = which;
+ break;
+ }
+ else if (window->point < refs[which]->start)
+ break;
+ }
+ if (which > 0)
+ {
+ if (closest == -1)
+ which--;
+ else
+ which = closest;
+ }
+ }
+
+ defentry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ defentry->label = xstrdup (refs[which]->label);
+ defentry->filename = refs[which]->filename;
+ defentry->nodename = refs[which]->nodename;
+ defentry->line_number = refs[which]->line_number;
+
+ if (defentry->filename)
+ defentry->filename = xstrdup (defentry->filename);
+ if (defentry->nodename)
+ defentry->nodename = xstrdup (defentry->nodename);
+ }
+ info_free_references (refs);
+ }
+ }
+ }
+
+ /* If we are going to ask the user a question, do it now. */
+ if (ask_p)
+ {
+ char *prompt;
+
+ /* Build the prompt string. */
+ if (builder == info_menu_of_node)
+ {
+ if (defentry)
+ {
+ prompt = xmalloc (strlen (defentry->label)
+ + strlen (_("Menu item (%s): ")));
+ sprintf (prompt, _("Menu item (%s): "), defentry->label);
+ }
+ else
+ prompt = xstrdup (_("Menu item: "));
+ }
+ else
+ {
+ if (defentry)
+ {
+ prompt = xmalloc (strlen (defentry->label)
+ + strlen (_("Follow xref (%s): ")));
+ sprintf (prompt, _("Follow xref (%s): "), defentry->label);
+ }
+ else
+ prompt = xstrdup (_("Follow xref: "));
+ }
+
+ line = info_read_completing_in_echo_area (window, prompt, menu);
+ free (prompt);
+
+ window = active_window;
+
+ /* User aborts, just quit. */
+ if (!line)
+ {
+ maybe_free (defentry);
+ info_free_references (menu);
+ info_abort_key (window, 0, 0);
+ return;
+ }
+
+ /* If we had a default and the user accepted it, use that. */
+ if (!*line)
+ {
+ free (line);
+ if (defentry)
+ line = xstrdup (defentry->label);
+ else
+ line = (char *)NULL;
+ }
+ }
+ else
+ {
+ /* Not going to ask any questions. If we have a default entry, use
+ that, otherwise return. */
+ if (!defentry)
+ return;
+ else
+ line = xstrdup (defentry->label);
+ }
+
+ if (line)
+ {
+ /* It is possible that the references have more than a single
+ entry with the same label, and also LINE is down-cased, which
+ complicates matters even more. Try to be as accurate as we
+ can: if they've chosen the default, use defentry directly. */
+ if (defentry && strcmp (line, defentry->label) == 0)
+ entry = defentry;
+ else
+ /* Find the selected label in the references. If there are
+ more than one label which matches, find the one that's
+ closest to point. */
+ {
+ register int i;
+ int best = -1, min_dist = window->node->nodelen;
+ REFERENCE *ref;
+
+ for (i = 0; menu && (ref = menu[i]); i++)
+ {
+ /* Need to use strcasecmp because LINE is downcased
+ inside info_read_completing_in_echo_area. */
+ if (strcasecmp (line, ref->label) == 0)
+ {
+ /* ref->end is more accurate estimate of position
+ for menus than ref->start. Go figure. */
+ int dist = abs (window->point - ref->end);
+
+ if (dist < min_dist)
+ {
+ min_dist = dist;
+ best = i;
+ }
+ }
+ }
+ if (best != -1)
+ entry = menu[best];
+ else
+ entry = (REFERENCE *)NULL;
+ }
+
+ if (!entry && defentry)
+ info_error ((char *) _("The reference disappeared! (%s)."), line, NULL);
+ else
+ {
+ NODE *orig = window->node;
+ info_select_reference (window, entry);
+
+ if (builder == info_xrefs_of_node && window->node != orig
+ && !(window->node->flags & N_FromAnchor))
+ { /* Search for this reference in the node. */
+ long offset;
+ long start;
+
+ if (window->line_count > 0)
+ start = window->line_starts[1] - window->node->contents;
+ else
+ start = 0;
+
+ offset =
+ info_target_search_node (window->node, entry->label, start);
+
+ if (offset != -1)
+ {
+ window->point = offset;
+ window_adjust_pagetop (window);
+ }
+ }
+
+ if (entry->line_number > 0)
+ /* next_line starts at line 1? Anyway, the -1 makes it
+ move to the right line. */
+ info_next_line (window, entry->line_number - 1, key);
+ }
+
+ free (line);
+ if (defentry)
+ {
+ free (defentry->label);
+ maybe_free (defentry->filename);
+ maybe_free (defentry->nodename);
+ free (defentry);
+ }
+ }
+
+ info_free_references (menu);
+
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
+
+/* Read a line (with completion) which is the name of a menu item,
+ and select that item. */
+DECLARE_INFO_COMMAND (info_menu_item, _("Read a menu item and select its node"))
+{
+ info_menu_or_ref_item (window, count, key, info_menu_of_node, 1);
+}
+
+/* Read a line (with completion) which is the name of a reference to
+ follow, and select the node. */
+DECLARE_INFO_COMMAND
+ (info_xref_item, _("Read a footnote or cross reference and select its node"))
+{
+ info_menu_or_ref_item (window, count, key, info_xrefs_of_node, 1);
+}
+
+/* Position the cursor at the start of this node's menu. */
+DECLARE_INFO_COMMAND (info_find_menu, _("Move to the start of this node's menu"))
+{
+ SEARCH_BINDING binding;
+ long position;
+
+ binding.buffer = window->node->contents;
+ binding.start = 0;
+ binding.end = window->node->nodelen;
+ binding.flags = S_FoldCase | S_SkipDest;
+
+ position = search (INFO_MENU_LABEL, &binding);
+
+ if (position == -1)
+ info_error ((char *) msg_no_menu_node, NULL, NULL);
+ else
+ {
+ window->point = position;
+ window_adjust_pagetop (window);
+ window->flags |= W_UpdateWindow;
+ }
+}
+
+/* Visit as many menu items as is possible, each in a separate window. */
+DECLARE_INFO_COMMAND (info_visit_menu,
+ _("Visit as many menu items at once as possible"))
+{
+ register int i;
+ REFERENCE *entry, **menu;
+
+ menu = info_menu_of_node (window->node);
+
+ if (!menu)
+ info_error ((char *) msg_no_menu_node, NULL, NULL);
+
+ for (i = 0; (!info_error_was_printed) && (entry = menu[i]); i++)
+ {
+ WINDOW *new;
+
+ new = window_make_window (window->node);
+ window_tile_windows (TILE_INTERNALS);
+
+ if (!new)
+ info_error ((char *) msg_win_too_small, NULL, NULL);
+ else
+ {
+ active_window = new;
+ info_select_reference (new, entry);
+ }
+ }
+}
+
+/* Read a line of input which is a node name, and go to that node. */
+DECLARE_INFO_COMMAND (info_goto_node, _("Read a node name and select it"))
+{
+ char *line;
+
+#define GOTO_COMPLETES
+#if defined (GOTO_COMPLETES)
+ /* Build a completion list of all of the known nodes. */
+ {
+ register int fbi, i;
+ FILE_BUFFER *current;
+ REFERENCE **items = (REFERENCE **)NULL;
+ int items_index = 0;
+ int items_slots = 0;
+
+ current = file_buffer_of_window (window);
+
+ for (fbi = 0; info_loaded_files && info_loaded_files[fbi]; fbi++)
+ {
+ FILE_BUFFER *fb;
+ REFERENCE *entry;
+ int this_is_the_current_fb;
+
+ fb = info_loaded_files[fbi];
+ this_is_the_current_fb = (current == fb);
+
+ entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->filename = entry->nodename = (char *)NULL;
+ entry->label = (char *)xmalloc (4 + strlen (fb->filename));
+ sprintf (entry->label, "(%s)*", fb->filename);
+
+ add_pointer_to_array
+ (entry, items_index, items, items_slots, 10, REFERENCE *);
+
+ if (fb->tags)
+ {
+ for (i = 0; fb->tags[i]; i++)
+ {
+ entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->filename = entry->nodename = (char *)NULL;
+ if (this_is_the_current_fb)
+ entry->label = xstrdup (fb->tags[i]->nodename);
+ else
+ {
+ entry->label = (char *) xmalloc
+ (4 + strlen (fb->filename) +
+ strlen (fb->tags[i]->nodename));
+ sprintf (entry->label, "(%s)%s",
+ fb->filename, fb->tags[i]->nodename);
+ }
+
+ add_pointer_to_array
+ (entry, items_index, items, items_slots, 100, REFERENCE *);
+ }
+ }
+ }
+ line = info_read_maybe_completing (window, (char *) _("Goto node: "),
+ items);
+ info_free_references (items);
+ }
+#else /* !GOTO_COMPLETES */
+ line = info_read_in_echo_area (window, (char *) _("Goto node: "));
+#endif /* !GOTO_COMPLETES */
+
+ /* If the user aborted, quit now. */
+ if (!line)
+ {
+ info_abort_key (window, 0, 0);
+ return;
+ }
+
+ canonicalize_whitespace (line);
+
+ if (*line)
+ info_parse_and_select (line, window);
+
+ free (line);
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
+
+/* Follow the menu list in MENUS (list of strings terminated by a NULL
+ entry) from INITIAL_NODE. If can't continue at any point (no menu or
+ no menu entry for the next item), return the node so far -- that
+ might be INITIAL_NODE itself. If error, *ERRSTR and *ERRARG[12] will
+ be set to the error message and argument for message, otherwise they
+ will be NULL. */
+
+NODE *
+info_follow_menus (NODE *initial_node, char **menus,
+ const char **errstr, char **errarg1, char **errarg2)
+{
+ NODE *node = NULL;
+ *errstr = *errarg1 = *errarg2 = NULL;
+
+ for (; *menus; menus++)
+ {
+ static char *first_arg = NULL;
+ REFERENCE **menu;
+ REFERENCE *entry;
+ char *arg = *menus; /* Remember the name of the menu entry we want. */
+
+ /* A leading space is certainly NOT part of a node name. Most
+ probably, they typed a space after the separating comma. The
+ strings in menus[] have their whitespace canonicalized, so
+ there's at most one space to ignore. */
+ if (*arg == ' ')
+ arg++;
+ if (!first_arg)
+ first_arg = arg;
+
+ /* Build and return a list of the menu items in this node. */
+ menu = info_menu_of_node (initial_node);
+
+ /* If no menu item in this node, stop here, but let the user
+ continue to use Info. Perhaps they wanted this node and didn't
+ realize it. */
+ if (!menu)
+ {
+ if (arg == first_arg)
+ {
+ node = make_manpage_node (first_arg);
+ if (node)
+ goto maybe_got_node;
+ }
+ *errstr = _("No menu in node `%s'.");
+ *errarg1 = node_printed_rep (initial_node);
+ return initial_node;
+ }
+
+ /* Find the specified menu item. */
+ entry = info_get_labeled_reference (arg, menu);
+
+ /* If the item wasn't found, search the list sloppily. Perhaps this
+ user typed "buffer" when they really meant "Buffers". */
+ if (!entry)
+ {
+ int i;
+ int best_guess = -1;
+
+ for (i = 0; (entry = menu[i]); i++)
+ {
+ if (strcasecmp (entry->label, arg) == 0)
+ break;
+ else
+ if ((best_guess == -1)
+ && (strncasecmp (entry->label, arg, strlen (arg)) == 0))
+ best_guess = i;
+ }
+
+ if (!entry && best_guess != -1)
+ entry = menu[best_guess];
+ }
+
+ /* If we still failed to find the reference, start Info with the current
+ node anyway. It is probably a misspelling. */
+ if (!entry)
+ {
+ if (arg == first_arg)
+ {
+ /* Maybe they typed "info foo" instead of "info -f foo". */
+ node = info_get_node (first_arg, 0);
+ if (node)
+ add_file_directory_to_path (first_arg);
+ else
+ node = make_manpage_node (first_arg);
+ if (node)
+ goto maybe_got_node;
+ }
+
+ info_free_references (menu);
+ *errstr = _("No menu item `%s' in node `%s'.");
+ *errarg1 = arg;
+ *errarg2 = node_printed_rep (initial_node);
+ return initial_node;
+ }
+
+ /* We have found the reference that the user specified. If no
+ filename in this reference, define it. */
+ if (!entry->filename)
+ entry->filename = xstrdup (initial_node->parent ? initial_node->parent
+ : initial_node->filename);
+
+ /* Try to find this node. */
+ node = info_get_node (entry->filename, entry->nodename);
+ if (!node && arg == first_arg)
+ {
+ node = make_manpage_node (first_arg);
+ if (node)
+ goto maybe_got_node;
+ }
+
+ /* Since we cannot find it, try using the label of the entry as a
+ file, i.e., "(LABEL)Top". */
+ if (!node && entry->nodename
+ && strcmp (entry->label, entry->nodename) == 0)
+ node = info_get_node (entry->label, "Top");
+
+ maybe_got_node:
+ if (!node)
+ {
+ *errstr = _("Unable to find node referenced by `%s' in `%s'.");
+ *errarg1 = xstrdup (entry->label);
+ *errarg2 = node_printed_rep (initial_node);
+ info_free_references (menu);
+ return initial_node;
+ }
+
+ info_free_references (menu);
+
+ /* Success. Go round the loop again. */
+ free (initial_node);
+ initial_node = node;
+ }
+
+ return initial_node;
+}
+
+/* Split STR into individual node names by writing null bytes in wherever
+ there are commas and constructing a list of the resulting pointers.
+ (We can do this since STR has had canonicalize_whitespace called on it.)
+ Return array terminated with NULL. */
+
+static char **
+split_list_of_nodenames (char *str)
+{
+ unsigned len = 2;
+ char **nodes = xmalloc (len * sizeof (char *));
+
+ nodes[len - 2] = str;
+
+ while (*str++)
+ {
+ if (*str == ',')
+ {
+ *str++ = 0; /* get past the null byte */
+ len++;
+ nodes = xrealloc (nodes, len * sizeof (char *));
+ nodes[len - 2] = str;
+ }
+ }
+
+ nodes[len - 1] = NULL;
+
+ return nodes;
+}
+
+
+/* Read a line of input which is a sequence of menus (starting from
+ dir), and follow them. */
+DECLARE_INFO_COMMAND (info_menu_sequence,
+ _("Read a list of menus starting from dir and follow them"))
+{
+ char *line = info_read_in_echo_area (window, (char *) _("Follow menus: "));
+
+ /* If the user aborted, quit now. */
+ if (!line)
+ {
+ info_abort_key (window, 0, 0);
+ return;
+ }
+
+ canonicalize_whitespace (line);
+
+ if (*line)
+ {
+ const char *errstr;
+ char *errarg1, *errarg2;
+ NODE *dir_node = info_get_node (NULL, NULL);
+ char **nodes = split_list_of_nodenames (line);
+ NODE *node = NULL;
+
+ /* If DIR_NODE is NULL, they might be reading a file directly,
+ like in "info -d . -f ./foo". Try using "Top" instead. */
+ if (!dir_node)
+ {
+ char *file_name = window->node->parent;
+
+ if (!file_name)
+ file_name = window->node->filename;
+ dir_node = info_get_node (file_name, NULL);
+ }
+
+ /* If we still cannot find the starting point, give up.
+ We cannot allow a NULL pointer inside info_follow_menus. */
+ if (!dir_node)
+ info_error ((char *) msg_cant_find_node, "Top", NULL);
+ else
+ node = info_follow_menus (dir_node, nodes, &errstr, &errarg1, &errarg2);
+
+ free (nodes);
+ if (!errstr)
+ info_set_node_of_window (1, window, node);
+ else
+ info_error ((char *) errstr, errarg1, errarg2);
+ }
+
+ free (line);
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
+
+/* Search the menu MENU for a (possibly mis-spelled) entry ARG.
+ Return the menu entry, or the best guess for what they meant by ARG,
+ or NULL if there's nothing in this menu seems to fit the bill.
+ If EXACT is non-zero, allow only exact matches. */
+static REFERENCE *
+entry_in_menu (char *arg, REFERENCE **menu, int exact)
+{
+ REFERENCE *entry;
+
+ /* First, try to find the specified menu item verbatim. */
+ entry = info_get_labeled_reference (arg, menu);
+
+ /* If the item wasn't found, search the list sloppily. Perhaps we
+ have "Option Summary", but ARG is "option". */
+ if (!entry && !exact)
+ {
+ int i;
+ int best_guess = -1;
+
+ for (i = 0; (entry = menu[i]); i++)
+ {
+ if (strcasecmp (entry->label, arg) == 0)
+ break;
+ else
+ if (strncasecmp (entry->label, arg, strlen (arg)) == 0)
+ best_guess = i;
+ }
+
+ if (!entry && best_guess != -1)
+ entry = menu[best_guess];
+ }
+
+ return entry;
+}
+
+/* Find the node that is the best candidate to list the PROGRAM's
+ invocation info and its command-line options, by looking for menu
+ items and chains of menu items with characteristic names. */
+void
+info_intuit_options_node (WINDOW *window, NODE *initial_node, char *program)
+{
+ /* The list of node names typical for GNU manuals where the program
+ usage and specifically the command-line arguments are described.
+ This is pure heuristics. I gathered these node names by looking
+ at all the Info files I could put my hands on. If you are
+ looking for evidence to complain to the GNU project about
+ non-uniform style of documentation, here you have your case! */
+ static const char *invocation_nodes[] = {
+ "%s invocation",
+ "Invoking %s",
+ "Preliminaries", /* m4 has Invoking under Preliminaries! */
+ "Invocation",
+ "Command Arguments",/* Emacs */
+ "Invoking `%s'",
+ "%s options",
+ "Options",
+ "Option ", /* e.g. "Option Summary" */
+ "Invoking",
+ "All options", /* tar, paxutils */
+ "Arguments",
+ "%s cmdline", /* ar */
+ "%s", /* last resort */
+ (const char *)0
+ };
+ NODE *node = NULL;
+ REFERENCE **menu;
+ const char **try_node;
+
+ /* We keep looking deeper and deeper in the menu structure until
+ there are no more menus or no menu items from the above list.
+ Some manuals have the invocation node sitting 3 or 4 levels deep
+ in the menu hierarchy... */
+ for (node = initial_node; node; initial_node = node)
+ {
+ REFERENCE *entry = NULL;
+
+ /* Build and return a list of the menu items in this node. */
+ menu = info_menu_of_node (initial_node);
+
+ /* If no menu item in this node, stop here. Perhaps this node
+ is the one they need. */
+ if (!menu)
+ break;
+
+ /* Look for node names typical for usage nodes in this menu. */
+ for (try_node = invocation_nodes; *try_node; try_node++)
+ {
+ char *nodename;
+
+ nodename = xmalloc (strlen (program) + strlen (*try_node));
+ sprintf (nodename, *try_node, program);
+ /* The last resort "%s" is dangerous, so we restrict it
+ to exact matches here. */
+ entry = entry_in_menu (nodename, menu,
+ strcmp (*try_node, "%s") == 0);
+ free (nodename);
+ if (entry)
+ break;
+ }
+
+ if (!entry)
+ break;
+
+ if (!entry->filename)
+ entry->filename = xstrdup (initial_node->parent ? initial_node->parent
+ : initial_node->filename);
+ /* Try to find this node. */
+ node = info_get_node (entry->filename, entry->nodename);
+ info_free_references (menu);
+ if (!node)
+ break;
+ }
+
+ /* We've got our best shot at the invocation node. Now select it. */
+ if (initial_node)
+ info_set_node_of_window (1, window, initial_node);
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
+
+/* Given a name of an Info file, find the name of the package it
+ describes by removing the leading directories and extensions. */
+char *
+program_name_from_file_name (char *file_name)
+{
+ int i;
+ char *program_name = xstrdup (filename_non_directory (file_name));
+
+ for (i = strlen (program_name) - 1; i > 0; i--)
+ if (program_name[i] == '.'
+ && (FILENAME_CMPN (program_name + i, ".info", 5) == 0
+ || FILENAME_CMPN (program_name + i, ".inf", 4) == 0
+#ifdef __MSDOS__
+ || FILENAME_CMPN (program_name + i, ".i", 2) == 0
+#endif
+ || isdigit (program_name[i + 1]))) /* a man page foo.1 */
+ {
+ program_name[i] = 0;
+ break;
+ }
+ return program_name;
+}
+
+DECLARE_INFO_COMMAND (info_goto_invocation_node,
+ _("Find the node describing program invocation"))
+{
+ const char *invocation_prompt = _("Find Invocation node of [%s]: ");
+ char *program_name, *line;
+ char *default_program_name, *prompt, *file_name;
+ NODE *top_node;
+
+ /* Intuit the name of the program they are likely to want.
+ We use the file name of the current Info file as a hint. */
+ file_name = window->node->parent ? window->node->parent
+ : window->node->filename;
+ default_program_name = program_name_from_file_name (file_name);
+
+ prompt = (char *)xmalloc (strlen (default_program_name) +
+ strlen (invocation_prompt));
+ sprintf (prompt, invocation_prompt, default_program_name);
+ line = info_read_in_echo_area (window, prompt);
+ free (prompt);
+ if (!line)
+ {
+ info_abort_key (window, 0, 0);
+ return;
+ }
+ if (*line)
+ program_name = line;
+ else
+ program_name = default_program_name;
+
+ /* In interactive usage they'd probably expect us to begin looking
+ from the Top node. */
+ top_node = info_get_node (file_name, NULL);
+ if (!top_node)
+ info_error ((char *) msg_cant_find_node, "Top", NULL);
+
+ info_intuit_options_node (window, top_node, program_name);
+ free (line);
+ free (default_program_name);
+}
+
+#if defined (HANDLE_MAN_PAGES)
+DECLARE_INFO_COMMAND (info_man, _("Read a manpage reference and select it"))
+{
+ char *line;
+
+ line = info_read_in_echo_area (window, (char *) _("Get Manpage: "));
+
+ if (!line)
+ {
+ info_abort_key (window, 0, 0);
+ return;
+ }
+
+ canonicalize_whitespace (line);
+
+ if (*line)
+ {
+ char *goto_command;
+
+ goto_command = (char *)xmalloc
+ (4 + strlen (MANPAGE_FILE_BUFFER_NAME) + strlen (line));
+
+ sprintf (goto_command, "(%s)%s", MANPAGE_FILE_BUFFER_NAME, line);
+
+ info_parse_and_select (goto_command, window);
+ free (goto_command);
+ }
+
+ free (line);
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
+#endif /* HANDLE_MAN_PAGES */
+
+/* Move to the "Top" node in this file. */
+DECLARE_INFO_COMMAND (info_top_node, _("Select the node `Top' in this file"))
+{
+ info_parse_and_select ("Top", window);
+}
+
+/* Move to the node "(dir)Top". */
+DECLARE_INFO_COMMAND (info_dir_node, _("Select the node `(dir)'"))
+{
+ info_parse_and_select ("(dir)Top", window);
+}
+
+
+/* Read the name of a node to kill. The list of available nodes comes
+ from the nodes appearing in the current window configuration. */
+static char *
+read_nodename_to_kill (WINDOW *window)
+{
+ int iw;
+ char *nodename;
+ INFO_WINDOW *info_win;
+ REFERENCE **menu = NULL;
+ int menu_index = 0, menu_slots = 0;
+ char *default_nodename = xstrdup (active_window->node->nodename);
+ char *prompt = xmalloc (strlen (_("Kill node (%s): ")) + strlen (default_nodename));
+
+ sprintf (prompt, _("Kill node (%s): "), default_nodename);
+
+ for (iw = 0; (info_win = info_windows[iw]); iw++)
+ {
+ REFERENCE *entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->label = xstrdup (info_win->window->node->nodename);
+ entry->filename = entry->nodename = (char *)NULL;
+
+ add_pointer_to_array (entry, menu_index, menu, menu_slots, 10,
+ REFERENCE *);
+ }
+
+ nodename = info_read_completing_in_echo_area (window, prompt, menu);
+ free (prompt);
+ info_free_references (menu);
+ if (nodename && !*nodename)
+ {
+ free (nodename);
+ nodename = default_nodename;
+ }
+ else
+ free (default_nodename);
+
+ return nodename;
+}
+
+
+/* Delete NODENAME from this window, showing the most
+ recently selected node in this window. */
+static void
+kill_node (WINDOW *window, char *nodename)
+{
+ int iw, i;
+ INFO_WINDOW *info_win;
+ NODE *temp;
+
+ /* If there is no nodename to kill, quit now. */
+ if (!nodename)
+ {
+ info_abort_key (window, 0, 0);
+ return;
+ }
+
+ /* If there is a nodename, find it in our window list. */
+ for (iw = 0; (info_win = info_windows[iw]); iw++)
+ if (strcmp (nodename, info_win->nodes[info_win->current]->nodename) == 0
+ && info_win->window == window)
+ break;
+
+ if (!info_win)
+ {
+ if (*nodename)
+ info_error ((char *) _("Cannot kill node `%s'"), nodename, NULL);
+ else
+ window_clear_echo_area ();
+
+ return;
+ }
+
+ /* If there are no more nodes left anywhere to view, complain and exit. */
+ if (info_windows_index == 1 && info_windows[0]->nodes_index == 1)
+ {
+ info_error ((char *) _("Cannot kill the last node"), NULL, NULL);
+ return;
+ }
+
+ /* INFO_WIN contains the node that the user wants to stop viewing. Delete
+ this node from the list of nodes previously shown in this window. */
+ for (i = info_win->current; i < info_win->nodes_index; i++)
+ info_win->nodes[i] = info_win->nodes[i + 1];
+
+ /* There is one less node in this window's history list. */
+ info_win->nodes_index--;
+
+ /* Make this window show the most recent history node. */
+ info_win->current = info_win->nodes_index - 1;
+
+ /* If there aren't any nodes left in this window, steal one from the
+ next window. */
+ if (info_win->current < 0)
+ {
+ INFO_WINDOW *stealer;
+ int which, pagetop;
+ long point;
+
+ if (info_windows[iw + 1])
+ stealer = info_windows[iw + 1];
+ else
+ stealer = info_windows[0];
+
+ /* If the node being displayed in the next window is not the most
+ recently loaded one, get the most recently loaded one. */
+ if ((stealer->nodes_index - 1) != stealer->current)
+ which = stealer->nodes_index - 1;
+
+ /* Else, if there is another node behind the stealers current node,
+ use that one. */
+ else if (stealer->current > 0)
+ which = stealer->current - 1;
+
+ /* Else, just use the node appearing in STEALER's window. */
+ else
+ which = stealer->current;
+
+ /* Copy this node. */
+ {
+ NODE *copy = xmalloc (sizeof (NODE));
+
+ temp = stealer->nodes[which];
+ point = stealer->points[which];
+ pagetop = stealer->pagetops[which];
+
+ copy->filename = temp->filename;
+ copy->parent = temp->parent;
+ copy->nodename = temp->nodename;
+ copy->contents = temp->contents;
+ copy->nodelen = temp->nodelen;
+ copy->flags = temp->flags;
+ copy->display_pos = temp->display_pos;
+
+ temp = copy;
+ }
+
+ window_set_node_of_window (info_win->window, temp);
+ window->point = point;
+ window->pagetop = pagetop;
+ remember_window_and_node (info_win->window, temp);
+ }
+ else
+ {
+ temp = info_win->nodes[info_win->current];
+ temp->display_pos = info_win->points[info_win->current];
+ window_set_node_of_window (info_win->window, temp);
+ }
+
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (window);
+}
+
+/* Kill current node, thus going back one in the node history. I (karl)
+ do not think this is completely correct yet, because of the
+ window-changing stuff in kill_node, but it's a lot better than the
+ previous implementation, which did not account for nodes being
+ visited twice at all. */
+DECLARE_INFO_COMMAND (info_history_node,
+ _("Select the most recently selected node"))
+{
+ kill_node (window, active_window->node->nodename);
+}
+
+/* Kill named node. */
+DECLARE_INFO_COMMAND (info_kill_node, _("Kill this node"))
+{
+ char *nodename = read_nodename_to_kill (window);
+ kill_node (window, nodename);
+}
+
+
+/* Read the name of a file and select the entire file. */
+DECLARE_INFO_COMMAND (info_view_file, _("Read the name of a file and select it"))
+{
+ char *line;
+
+ line = info_read_in_echo_area (window, (char *) _("Find file: "));
+ if (!line)
+ {
+ info_abort_key (active_window, 1, 0);
+ return;
+ }
+
+ if (*line)
+ {
+ NODE *node;
+
+ node = info_get_node (line, "*");
+ if (!node)
+ {
+ if (info_recent_file_error)
+ info_error (info_recent_file_error, NULL, NULL);
+ else
+ info_error ((char *) _("Cannot find `%s'."), line, NULL);
+ }
+ else
+ info_set_node_of_window (1, window, node);
+
+ free (line);
+ }
+
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+}
+
+/* **************************************************************** */
+/* */
+/* Dumping and Printing Nodes */
+/* */
+/* **************************************************************** */
+
+#define VERBOSE_NODE_DUMPING
+static void write_node_to_stream (NODE *node, FILE *stream);
+static void dump_node_to_stream (char *filename, char *nodename,
+ FILE *stream, int dump_subnodes);
+static void initialize_dumping (void);
+
+/* Dump the nodes specified by FILENAME and NODENAMES to the file named
+ in OUTPUT_FILENAME. If DUMP_SUBNODES is non-zero, recursively dump
+ the nodes which appear in the menu of each node dumped. */
+void
+dump_nodes_to_file (char *filename, char **nodenames,
+ char *output_filename, int dump_subnodes)
+{
+ register int i;
+ FILE *output_stream;
+
+ /* Get the stream to print the nodes to. Special case of an output
+ filename of "-" means to dump the nodes to stdout. */
+ if (strcmp (output_filename, "-") == 0)
+ output_stream = stdout;
+ else
+ output_stream = fopen (output_filename, "w");
+
+ if (!output_stream)
+ {
+ info_error ((char *) _("Could not create output file `%s'."),
+ output_filename, NULL);
+ return;
+ }
+
+ /* Print each node to stream. */
+ initialize_dumping ();
+ for (i = 0; nodenames[i]; i++)
+ dump_node_to_stream (filename, nodenames[i], output_stream, dump_subnodes);
+
+ if (output_stream != stdout)
+ fclose (output_stream);
+
+#if defined (VERBOSE_NODE_DUMPING)
+ info_error ((char *) _("Done."), NULL, NULL);
+#endif /* VERBOSE_NODE_DUMPING */
+}
+
+/* A place to remember already dumped nodes. */
+static char **dumped_already = (char **)NULL;
+static int dumped_already_index = 0;
+static int dumped_already_slots = 0;
+
+static void
+initialize_dumping (void)
+{
+ dumped_already_index = 0;
+}
+
+/* Get and print the node specified by FILENAME and NODENAME to STREAM.
+ If DUMP_SUBNODES is non-zero, recursively dump the nodes which appear
+ in the menu of each node dumped. */
+static void
+dump_node_to_stream (char *filename, char *nodename,
+ FILE *stream, int dump_subnodes)
+{
+ register int i;
+ NODE *node;
+
+ node = info_get_node (filename, nodename);
+
+ if (!node)
+ {
+ if (info_recent_file_error)
+ info_error (info_recent_file_error, NULL, NULL);
+ else
+ {
+ if (filename && *nodename != '(')
+ info_error ((char *) msg_cant_file_node,
+ filename_non_directory (filename),
+ nodename);
+ else
+ info_error ((char *) msg_cant_find_node, nodename, NULL);
+ }
+ return;
+ }
+
+ /* If we have already dumped this node, don't dump it again. */
+ for (i = 0; i < dumped_already_index; i++)
+ if (strcmp (node->nodename, dumped_already[i]) == 0)
+ {
+ free (node);
+ return;
+ }
+ add_pointer_to_array (node->nodename, dumped_already_index, dumped_already,
+ dumped_already_slots, 50, char *);
+
+#if defined (VERBOSE_NODE_DUMPING)
+ /* Maybe we should print some information about the node being output. */
+ info_error ((char *) _("Writing node %s..."), node_printed_rep (node), NULL);
+#endif /* VERBOSE_NODE_DUMPING */
+
+ write_node_to_stream (node, stream);
+
+ /* If we are dumping subnodes, get the list of menu items in this node,
+ and dump each one recursively. */
+ if (dump_subnodes)
+ {
+ REFERENCE **menu = (REFERENCE **)NULL;
+
+ /* If this node is an Index, do not dump the menu references. */
+ if (string_in_line ("Index", node->nodename) == -1)
+ menu = info_menu_of_node (node);
+
+ if (menu)
+ {
+ for (i = 0; menu[i]; i++)
+ {
+ /* We don't dump Info files which are different than the
+ current one. */
+ if (!menu[i]->filename)
+ dump_node_to_stream
+ (filename, menu[i]->nodename, stream, dump_subnodes);
+ }
+ info_free_references (menu);
+ }
+ }
+
+ free (node);
+}
+
+/* Dump NODE to FILENAME. If DUMP_SUBNODES is non-zero, recursively dump
+ the nodes which appear in the menu of each node dumped. */
+void
+dump_node_to_file (NODE *node, char *filename, int dump_subnodes)
+{
+ FILE *output_stream;
+ char *nodes_filename;
+
+ /* Get the stream to print this node to. Special case of an output
+ filename of "-" means to dump the nodes to stdout. */
+ if (strcmp (filename, "-") == 0)
+ output_stream = stdout;
+ else
+ output_stream = fopen (filename, "w");
+
+ if (!output_stream)
+ {
+ info_error ((char *) _("Could not create output file `%s'."), filename,
+ NULL);
+ return;
+ }
+
+ if (node->parent)
+ nodes_filename = node->parent;
+ else
+ nodes_filename = node->filename;
+
+ initialize_dumping ();
+ dump_node_to_stream
+ (nodes_filename, node->nodename, output_stream, dump_subnodes);
+
+ if (output_stream != stdout)
+ fclose (output_stream);
+
+#if defined (VERBOSE_NODE_DUMPING)
+ info_error ((char *) _("Done."), NULL, NULL);
+#endif /* VERBOSE_NODE_DUMPING */
+}
+
+#if !defined (DEFAULT_INFO_PRINT_COMMAND)
+# define DEFAULT_INFO_PRINT_COMMAND "lpr"
+#endif /* !DEFAULT_INFO_PRINT_COMMAND */
+
+DECLARE_INFO_COMMAND (info_print_node,
+ _("Pipe the contents of this node through INFO_PRINT_COMMAND"))
+{
+ print_node (window->node);
+}
+
+/* Print NODE on a printer piping it into INFO_PRINT_COMMAND. */
+void
+print_node (NODE *node)
+{
+ FILE *printer_pipe;
+ char *print_command = getenv ("INFO_PRINT_COMMAND");
+ int piping = 0;
+
+ if (!print_command || !*print_command)
+ print_command = DEFAULT_INFO_PRINT_COMMAND;
+
+ /* Note that on MS-DOS/MS-Windows, this MUST open the pipe in the
+ (default) text mode, since the printer drivers there need to see
+ DOS-style CRLF pairs at the end of each line.
+
+ FIXME: if we are to support Mac-style text files, we might need
+ to convert the text here. */
+
+ /* INFO_PRINT_COMMAND which says ">file" means write to that file.
+ Presumably, the name of the file is the local printer device. */
+ if (*print_command == '>')
+ printer_pipe = fopen (++print_command, "w");
+ else
+ {
+ printer_pipe = popen (print_command, "w");
+ piping = 1;
+ }
+
+ if (!printer_pipe)
+ {
+ info_error ((char *) _("Cannot open pipe to `%s'."), print_command, NULL);
+ return;
+ }
+
+#if defined (VERBOSE_NODE_DUMPING)
+ /* Maybe we should print some information about the node being output. */
+ info_error ((char *) _("Printing node %s..."), node_printed_rep (node), NULL);
+#endif /* VERBOSE_NODE_DUMPING */
+
+ write_node_to_stream (node, printer_pipe);
+ if (piping)
+ pclose (printer_pipe);
+ else
+ fclose (printer_pipe);
+
+#if defined (VERBOSE_NODE_DUMPING)
+ info_error ((char *) _("Done."), NULL, NULL);
+#endif /* VERBOSE_NODE_DUMPING */
+}
+
+static void
+write_node_to_stream (NODE *node, FILE *stream)
+{
+ fwrite (node->contents, 1, node->nodelen, stream);
+}
+
+/* **************************************************************** */
+/* */
+/* Info Searching Commands */
+/* */
+/* **************************************************************** */
+
+/* Variable controlling the garbage collection of files briefly visited
+ during searches. Such files are normally gc'ed, unless they were
+ compressed to begin with. If this variable is non-zero, it says
+ to gc even those file buffer contents which had to be uncompressed. */
+int gc_compressed_files = 0;
+
+static void info_gc_file_buffers (void);
+static void info_search_1 (WINDOW *window, int count,
+ unsigned char key, int case_sensitive, int ask_for_string);
+
+static char *search_string = (char *)NULL;
+static int search_string_size = 0;
+static int isearch_is_active = 0;
+
+static int last_search_direction = 0;
+static int last_search_case_sensitive = 0;
+
+/* Return the file buffer which belongs to WINDOW's node. */
+FILE_BUFFER *
+file_buffer_of_window (WINDOW *window)
+{
+ /* If this window has no node, then it has no file buffer. */
+ if (!window->node)
+ return ((FILE_BUFFER *)NULL);
+
+ if (window->node->parent)
+ return (info_find_file (window->node->parent));
+
+ if (window->node->filename)
+ return (info_find_file (window->node->filename));
+
+ return ((FILE_BUFFER *)NULL);
+}
+
+/* Search for STRING in NODE starting at START. Return -1 if the string
+ was not found, or the location of the string if it was. If WINDOW is
+ passed as non-null, set the window's node to be NODE, its point to be
+ the found string, and readjust the window's pagetop. Final argument
+ DIR says which direction to search in. If it is positive, search
+ forward, else backwards. */
+long
+info_search_in_node (char *string, NODE *node, long int start,
+ WINDOW *window, int dir, int case_sensitive)
+{
+ SEARCH_BINDING binding;
+ long offset;
+
+ binding.buffer = node->contents;
+ binding.start = start;
+ binding.end = node->nodelen;
+ binding.flags = 0;
+ if (!case_sensitive)
+ binding.flags |= S_FoldCase;
+
+ if (dir < 0)
+ {
+ binding.end = 0;
+ binding.flags |= S_SkipDest;
+ }
+
+ if (binding.start < 0)
+ return (-1);
+
+ /* For incremental searches, we always wish to skip past the string. */
+ if (isearch_is_active)
+ binding.flags |= S_SkipDest;
+
+ offset = search (string, &binding);
+
+ if (offset != -1 && window)
+ {
+ set_remembered_pagetop_and_point (window);
+ if (window->node != node)
+ window_set_node_of_window (window, node);
+ window->point = offset;
+ window_adjust_pagetop (window);
+ }
+ return (offset);
+}
+
+/* Search NODE, looking for the largest possible match of STRING. Start the
+ search at START. Return the absolute position of the match, or -1, if
+ no part of the string could be found. */
+long
+info_target_search_node (NODE *node, char *string, long int start)
+{
+ register int i;
+ long offset = 0;
+ char *target;
+
+ target = xstrdup (string);
+ i = strlen (target);
+
+ /* Try repeatedly searching for this string while removing words from
+ the end of it. */
+ while (i)
+ {
+ target[i] = '\0';
+ offset = info_search_in_node (target, node, start, (WINDOW *)NULL, 1, 0);
+
+ if (offset != -1)
+ break;
+
+ /* Delete the last word from TARGET. */
+ for (; i && (!whitespace (target[i]) && (target[i] != ',')); i--);
+ }
+ free (target);
+ return (offset);
+}
+
+/* Search for STRING starting in WINDOW at point. If the string is found
+ in this node, set point to that position. Otherwise, get the file buffer
+ associated with WINDOW's node, and search through each node in that file.
+ If the search fails, return non-zero, else zero. Side-effect window
+ leaving the node and point where the string was found current. */
+static int
+info_search_internal (char *string, WINDOW *window,
+ int dir, int case_sensitive)
+{
+ register int i;
+ FILE_BUFFER *file_buffer;
+ char *initial_nodename;
+ long ret, start = 0;
+
+ file_buffer = file_buffer_of_window (window);
+ initial_nodename = window->node->nodename;
+
+ /* This used to begin from window->point, unless this was a repeated
+ search command. But invoking search with an argument loses with
+ that logic, since info_last_executed_command is then set to
+ info_add_digit_to_numeric_arg. I think there's no sense in
+ ``finding'' a string that is already under the cursor, anyway. */
+ ret = info_search_in_node
+ (string, window->node, window->point + dir, window, dir,
+ case_sensitive);
+
+ if (ret != -1)
+ {
+ /* We won! */
+ if (!echo_area_is_active && !isearch_is_active)
+ window_clear_echo_area ();
+ return (0);
+ }
+
+ /* The string wasn't found in the current node. Search through the
+ window's file buffer, iff the current node is not "*". */
+ if (!file_buffer || (strcmp (initial_nodename, "*") == 0))
+ return (-1);
+
+ /* If this file has tags, search through every subfile, starting at
+ this node's subfile and node. Otherwise, search through the
+ file's node list. */
+ if (file_buffer->tags)
+ {
+ register int current_tag = 0, number_of_tags;
+ char *last_subfile;
+ TAG *tag;
+
+ /* Find number of tags and current tag. */
+ last_subfile = (char *)NULL;
+ for (i = 0; file_buffer->tags[i]; i++)
+ if (strcmp (initial_nodename, file_buffer->tags[i]->nodename) == 0)
+ {
+ current_tag = i;
+ last_subfile = file_buffer->tags[i]->filename;
+ }
+
+ number_of_tags = i;
+
+ /* If there is no last_subfile, our tag wasn't found. */
+ if (!last_subfile)
+ return (-1);
+
+ /* Search through subsequent nodes, wrapping around to the top
+ of the info file until we find the string or return to this
+ window's node and point. */
+ while (1)
+ {
+ NODE *node;
+
+ /* Allow C-g to quit the search, failing it if pressed. */
+ return_if_control_g (-1);
+
+ /* Find the next tag that isn't an anchor. */
+ for (i = current_tag + dir; i != current_tag; i += dir)
+ {
+ if (i < 0)
+ i = number_of_tags - 1;
+ else if (i == number_of_tags)
+ i = 0;
+
+ tag = file_buffer->tags[i];
+ if (tag->nodelen != 0)
+ break;
+ }
+
+ /* If we got past out starting point, bail out. */
+ if (i == current_tag)
+ return (-1);
+ current_tag = i;
+
+ if (!echo_area_is_active && (last_subfile != tag->filename))
+ {
+ window_message_in_echo_area
+ ((char *) _("Searching subfile %s ..."),
+ filename_non_directory (tag->filename), NULL);
+
+ last_subfile = tag->filename;
+ }
+
+ node = info_get_node (file_buffer->filename, tag->nodename);
+
+ if (!node)
+ {
+ /* If not doing i-search... */
+ if (!echo_area_is_active)
+ {
+ if (info_recent_file_error)
+ info_error (info_recent_file_error, NULL, NULL);
+ else
+ info_error ((char *) msg_cant_file_node,
+ filename_non_directory (file_buffer->filename),
+ tag->nodename);
+ }
+ return (-1);
+ }
+
+ if (dir < 0)
+ start = tag->nodelen;
+
+ ret =
+ info_search_in_node (string, node, start, window, dir,
+ case_sensitive);
+
+ /* Did we find the string in this node? */
+ if (ret != -1)
+ {
+ /* Yes! We win. */
+ remember_window_and_node (window, node);
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+ return (0);
+ }
+
+ /* No. Free this node, and make sure that we haven't passed
+ our starting point. */
+ free (node);
+
+ if (strcmp (initial_nodename, tag->nodename) == 0)
+ return (-1);
+ }
+ }
+ return (-1);
+}
+
+DECLARE_INFO_COMMAND (info_search_case_sensitively,
+ _("Read a string and search for it case-sensitively"))
+{
+ last_search_direction = count > 0 ? 1 : -1;
+ last_search_case_sensitive = 1;
+ info_search_1 (window, count, key, 1, 1);
+}
+
+DECLARE_INFO_COMMAND (info_search, _("Read a string and search for it"))
+{
+ last_search_direction = count > 0 ? 1 : -1;
+ last_search_case_sensitive = 0;
+ info_search_1 (window, count, key, 0, 1);
+}
+
+DECLARE_INFO_COMMAND (info_search_backward,
+ _("Read a string and search backward for it"))
+{
+ last_search_direction = count > 0 ? -1 : 1;
+ last_search_case_sensitive = 0;
+ info_search_1 (window, -count, key, 0, 1);
+}
+
+static void
+info_search_1 (WINDOW *window, int count, unsigned char key,
+ int case_sensitive, int ask_for_string)
+{
+ char *line, *prompt;
+ int result, old_pagetop;
+ int direction;
+
+ if (count < 0)
+ {
+ direction = -1;
+ count = -count;
+ }
+ else
+ {
+ direction = 1;
+ if (count == 0)
+ count = 1; /* for backward compatibility */
+ }
+
+ /* Read a string from the user, defaulting the search to SEARCH_STRING. */
+ if (!search_string)
+ {
+ search_string = (char *)xmalloc (search_string_size = 100);
+ search_string[0] = '\0';
+ }
+
+ if (ask_for_string)
+ {
+ prompt = (char *)xmalloc (strlen (_("%s%sfor string [%s]: "))
+ + strlen (_("Search backward"))
+ + strlen (_("Search"))
+ + strlen (_(" case-sensitively "))
+ + strlen (_(" "))
+ + strlen (search_string));
+
+ sprintf (prompt, _("%s%sfor string [%s]: "),
+ direction < 0 ? _("Search backward") : _("Search"),
+ case_sensitive ? _(" case-sensitively ") : _(" "),
+ search_string);
+
+ line = info_read_in_echo_area (window, prompt);
+ free (prompt);
+
+ if (!line)
+ {
+ info_abort_key (window, 0, 0);
+ return;
+ }
+
+ if (*line)
+ {
+ if (strlen (line) + 1 > (unsigned int) search_string_size)
+ search_string = (char *) xrealloc
+ (search_string, (search_string_size += 50 + strlen (line)));
+
+ strcpy (search_string, line);
+ free (line);
+ }
+ }
+
+ /* If the search string includes upper-case letters, make the search
+ case-sensitive. */
+ if (case_sensitive == 0)
+ for (line = search_string; *line; line++)
+ if (isupper (*line))
+ {
+ case_sensitive = 1;
+ break;
+ }
+
+ old_pagetop = active_window->pagetop;
+ for (result = 0; result == 0 && count--; )
+ result = info_search_internal (search_string,
+ active_window, direction, case_sensitive);
+
+ if (result != 0 && !info_error_was_printed)
+ info_error ((char *) _("Search failed."), NULL, NULL);
+ else if (old_pagetop != active_window->pagetop)
+ {
+ int new_pagetop;
+
+ new_pagetop = active_window->pagetop;
+ active_window->pagetop = old_pagetop;
+ set_window_pagetop (active_window, new_pagetop);
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (active_window);
+ }
+
+ /* Perhaps free the unreferenced file buffers that were searched, but
+ not retained. */
+ info_gc_file_buffers ();
+}
+
+DECLARE_INFO_COMMAND (info_search_next,
+ _("Repeat last search in the same direction"))
+{
+ if (!last_search_direction)
+ info_error ((char *) _("No previous search string"), NULL, NULL);
+ else
+ info_search_1 (window, last_search_direction * count,
+ key, last_search_case_sensitive, 0);
+}
+
+DECLARE_INFO_COMMAND (info_search_previous,
+ _("Repeat last search in the reverse direction"))
+{
+ if (!last_search_direction)
+ info_error ((char *) _("No previous search string"), NULL, NULL);
+ else
+ info_search_1 (window, -last_search_direction * count,
+ key, last_search_case_sensitive, 0);
+}
+
+/* **************************************************************** */
+/* */
+/* Incremental Searching */
+/* */
+/* **************************************************************** */
+
+static void incremental_search (WINDOW *window, int count,
+ unsigned char ignore);
+
+DECLARE_INFO_COMMAND (isearch_forward,
+ _("Search interactively for a string as you type it"))
+{
+ incremental_search (window, count, key);
+}
+
+DECLARE_INFO_COMMAND (isearch_backward,
+ _("Search interactively for a string as you type it"))
+{
+ incremental_search (window, -count, key);
+}
+
+/* Incrementally search for a string as it is typed. */
+/* The last accepted incremental search string. */
+static char *last_isearch_accepted = (char *)NULL;
+
+/* The current incremental search string. */
+static char *isearch_string = (char *)NULL;
+static int isearch_string_index = 0;
+static int isearch_string_size = 0;
+static unsigned char isearch_terminate_search_key = ESC;
+
+/* Array of search states. */
+static SEARCH_STATE **isearch_states = (SEARCH_STATE **)NULL;
+static int isearch_states_index = 0;
+static int isearch_states_slots = 0;
+
+/* Push the state of this search. */
+static void
+push_isearch (WINDOW *window, int search_index, int direction, int failing)
+{
+ SEARCH_STATE *state;
+
+ state = (SEARCH_STATE *)xmalloc (sizeof (SEARCH_STATE));
+ window_get_state (window, state);
+ state->search_index = search_index;
+ state->direction = direction;
+ state->failing = failing;
+
+ add_pointer_to_array (state, isearch_states_index, isearch_states,
+ isearch_states_slots, 20, SEARCH_STATE *);
+}
+
+/* Pop the state of this search to WINDOW, SEARCH_INDEX, and DIRECTION. */
+static void
+pop_isearch (WINDOW *window, int *search_index, int *direction, int *failing)
+{
+ SEARCH_STATE *state;
+
+ if (isearch_states_index)
+ {
+ isearch_states_index--;
+ state = isearch_states[isearch_states_index];
+ window_set_state (window, state);
+ *search_index = state->search_index;
+ *direction = state->direction;
+ *failing = state->failing;
+
+ free (state);
+ isearch_states[isearch_states_index] = (SEARCH_STATE *)NULL;
+ }
+}
+
+/* Free the memory used by isearch_states. */
+static void
+free_isearch_states (void)
+{
+ register int i;
+
+ for (i = 0; i < isearch_states_index; i++)
+ {
+ free (isearch_states[i]);
+ isearch_states[i] = (SEARCH_STATE *)NULL;
+ }
+ isearch_states_index = 0;
+}
+
+/* Display the current search in the echo area. */
+static void
+show_isearch_prompt (int dir, unsigned char *string, int failing_p)
+{
+ register int i;
+ const char *prefix;
+ char *prompt, *p_rep;
+ unsigned int prompt_len, p_rep_index, p_rep_size;
+
+ if (dir < 0)
+ prefix = _("I-search backward: ");
+ else
+ prefix = _("I-search: ");
+
+ p_rep_index = p_rep_size = 0;
+ p_rep = (char *)NULL;
+ for (i = 0; string[i]; i++)
+ {
+ char *rep;
+
+ switch (string[i])
+ {
+ case ' ': rep = " "; break;
+ case LFD: rep = "\\n"; break;
+ case TAB: rep = "\\t"; break;
+ default:
+ rep = pretty_keyname (string[i]);
+ }
+ if ((p_rep_index + strlen (rep) + 1) >= p_rep_size)
+ p_rep = (char *)xrealloc (p_rep, p_rep_size += 100);
+
+ strcpy (p_rep + p_rep_index, rep);
+ p_rep_index += strlen (rep);
+ }
+
+ prompt_len = strlen (prefix) + p_rep_index + 1;
+ if (failing_p)
+ prompt_len += strlen (_("Failing "));
+ prompt = xmalloc (prompt_len);
+ sprintf (prompt, "%s%s%s", failing_p ? _("Failing ") : "", prefix,
+ p_rep ? p_rep : "");
+
+ window_message_in_echo_area ("%s", prompt, NULL);
+ maybe_free (p_rep);
+ free (prompt);
+ display_cursor_at_point (active_window);
+}
+
+static void
+incremental_search (WINDOW *window, int count, unsigned char ignore)
+{
+ unsigned char key;
+ int last_search_result, search_result, dir;
+ SEARCH_STATE mystate, orig_state;
+ char *p;
+ int case_sensitive = 0;
+
+ if (count < 0)
+ dir = -1;
+ else
+ dir = 1;
+
+ last_search_result = search_result = 0;
+
+ window_get_state (window, &orig_state);
+
+ isearch_string_index = 0;
+ if (!isearch_string_size)
+ isearch_string = (char *)xmalloc (isearch_string_size = 50);
+
+ /* Show the search string in the echo area. */
+ isearch_string[isearch_string_index] = '\0';
+ show_isearch_prompt (dir, (unsigned char *) isearch_string, search_result);
+
+ isearch_is_active = 1;
+
+ while (isearch_is_active)
+ {
+ VFunction *func = (VFunction *)NULL;
+ int quoted = 0;
+
+ /* If a recent display was interrupted, then do the redisplay now if
+ it is convenient. */
+ if (!info_any_buffered_input_p () && display_was_interrupted_p)
+ {
+ display_update_one_window (window);
+ display_cursor_at_point (active_window);
+ }
+
+ /* Read a character and dispatch on it. */
+ key = info_get_input_char ();
+ window_get_state (window, &mystate);
+
+ if (key == DEL || key == Control ('h'))
+ {
+ /* User wants to delete one level of search? */
+ if (!isearch_states_index)
+ {
+ terminal_ring_bell ();
+ continue;
+ }
+ else
+ {
+ pop_isearch
+ (window, &isearch_string_index, &dir, &search_result);
+ isearch_string[isearch_string_index] = '\0';
+ show_isearch_prompt (dir, (unsigned char *) isearch_string,
+ search_result);
+ goto after_search;
+ }
+ }
+ else if (key == Control ('q'))
+ {
+ key = info_get_input_char ();
+ quoted = 1;
+ }
+
+ /* We are about to search again, or quit. Save the current search. */
+ push_isearch (window, isearch_string_index, dir, search_result);
+
+ if (quoted)
+ goto insert_and_search;
+
+ if (!Meta_p (key) || key > 32)
+ {
+ /* If this key is not a keymap, get its associated function,
+ if any. If it is a keymap, then it's probably ESC from an
+ arrow key, and we handle that case below. */
+ char type = window->keymap[key].type;
+ func = type == ISFUNC
+ ? InfoFunction(window->keymap[key].function)
+ : NULL; /* function member is a Keymap if ISKMAP */
+
+ if (isprint (key) || (type == ISFUNC && func == NULL))
+ {
+ insert_and_search:
+
+ if (isearch_string_index + 2 >= isearch_string_size)
+ isearch_string = (char *)xrealloc
+ (isearch_string, isearch_string_size += 100);
+
+ isearch_string[isearch_string_index++] = key;
+ isearch_string[isearch_string_index] = '\0';
+ goto search_now;
+ }
+ else if (func == (VFunction *) isearch_forward
+ || func == (VFunction *) isearch_backward)
+ {
+ /* If this key invokes an incremental search, then this
+ means that we will either search again in the same
+ direction, search again in the reverse direction, or
+ insert the last search string that was accepted through
+ incremental searching. */
+ if ((func == (VFunction *) isearch_forward && dir > 0) ||
+ (func == (VFunction *) isearch_backward && dir < 0))
+ {
+ /* If the user has typed no characters, then insert the
+ last successful search into the current search string. */
+ if (isearch_string_index == 0)
+ {
+ /* Of course, there must be something to insert. */
+ if (last_isearch_accepted)
+ {
+ if (strlen ((char *) last_isearch_accepted) + 1
+ >= (unsigned int) isearch_string_size)
+ isearch_string = (char *)
+ xrealloc (isearch_string,
+ isearch_string_size += 10 +
+ strlen (last_isearch_accepted));
+ strcpy (isearch_string, last_isearch_accepted);
+ isearch_string_index = strlen (isearch_string);
+ goto search_now;
+ }
+ else
+ continue;
+ }
+ else
+ {
+ /* Search again in the same direction. This means start
+ from a new place if the last search was successful. */
+ if (search_result == 0)
+ window->point += dir;
+ }
+ }
+ else
+ {
+ /* Reverse the direction of the search. */
+ dir = -dir;
+ }
+ }
+ else if (func == (VFunction *) info_abort_key)
+ {
+ /* If C-g pressed, and the search is failing, pop the search
+ stack back to the last unfailed search. */
+ if (isearch_states_index && (search_result != 0))
+ {
+ terminal_ring_bell ();
+ while (isearch_states_index && (search_result != 0))
+ pop_isearch
+ (window, &isearch_string_index, &dir, &search_result);
+ isearch_string[isearch_string_index] = '\0';
+ show_isearch_prompt (dir, (unsigned char *) isearch_string,
+ search_result);
+ continue;
+ }
+ else
+ goto exit_search;
+ }
+ else
+ goto exit_search;
+ }
+ else
+ {
+ exit_search:
+ /* The character is not printable, or it has a function which is
+ non-null. Exit the search, remembering the search string. If
+ the key is not the same as the isearch_terminate_search_key,
+ then push it into pending input. */
+ if (isearch_string_index && func != (VFunction *) info_abort_key)
+ {
+ maybe_free (last_isearch_accepted);
+ last_isearch_accepted = xstrdup (isearch_string);
+ }
+
+ /* If the key is the isearch_terminate_search_key, but some buffered
+ input is pending, it is almost invariably because the ESC key is
+ actually the beginning of an escape sequence, like in case they
+ pressed an arrow key. So don't gobble the ESC key, push it back
+ into pending input. */
+ /* FIXME: this seems like a kludge! We need a more reliable
+ mechanism to know when ESC is a separate key and when it is
+ part of an escape sequence. */
+ if (key != RET /* Emacs addicts want RET to get lost */
+ && (key != isearch_terminate_search_key
+ || info_any_buffered_input_p ()))
+ info_set_pending_input (key);
+
+ if (func == (VFunction *) info_abort_key)
+ {
+ if (isearch_states_index)
+ window_set_state (window, &orig_state);
+ }
+
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+
+ if (auto_footnotes_p)
+ info_get_or_remove_footnotes (active_window);
+
+ isearch_is_active = 0;
+ continue;
+ }
+
+ /* Search for the contents of isearch_string. */
+ search_now:
+ show_isearch_prompt (dir, (unsigned char *) isearch_string, search_result);
+
+ /* If the search string includes upper-case letters, make the
+ search case-sensitive. */
+ for (p = isearch_string; *p; p++)
+ if (isupper (*p))
+ {
+ case_sensitive = 1;
+ break;
+ }
+
+
+ if (search_result == 0)
+ {
+ /* Check to see if the current search string is right here. If
+ we are looking at it, then don't bother calling the search
+ function. */
+ if (((dir < 0) &&
+ ((case_sensitive ? strncmp : strncasecmp)
+ (window->node->contents + window->point,
+ isearch_string, isearch_string_index) == 0)) ||
+ ((dir > 0) &&
+ ((window->point - isearch_string_index) >= 0) &&
+ ((case_sensitive ? strncmp : strncasecmp)
+ (window->node->contents +
+ (window->point - (isearch_string_index - 1)),
+ isearch_string, isearch_string_index) == 0)))
+ {
+ if (dir > 0)
+ window->point++;
+ }
+ else
+ search_result = info_search_internal (isearch_string,
+ window, dir, case_sensitive);
+ }
+
+ /* If this search failed, and we didn't already have a failed search,
+ then ring the terminal bell. */
+ if (search_result != 0 && last_search_result == 0)
+ terminal_ring_bell ();
+
+ after_search:
+ show_isearch_prompt (dir, (unsigned char *) isearch_string, search_result);
+
+ if (search_result == 0)
+ {
+ if ((mystate.node == window->node) &&
+ (mystate.pagetop != window->pagetop))
+ {
+ int newtop = window->pagetop;
+ window->pagetop = mystate.pagetop;
+ set_window_pagetop (window, newtop);
+ }
+ display_update_one_window (window);
+ display_cursor_at_point (window);
+ }
+
+ last_search_result = search_result;
+ }
+
+ /* Free the memory used to remember each search state. */
+ free_isearch_states ();
+
+ /* Perhaps GC some file buffers. */
+ info_gc_file_buffers ();
+
+ /* After searching, leave the window in the correct state. */
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+}
+
+/* GC some file buffers. A file buffer can be gc-ed if there we have
+ no nodes in INFO_WINDOWS that reference this file buffer's contents.
+ Garbage collecting a file buffer means to free the file buffers
+ contents. */
+static void
+info_gc_file_buffers (void)
+{
+ register int fb_index, iw_index, i;
+ register FILE_BUFFER *fb;
+ register INFO_WINDOW *iw;
+
+ if (!info_loaded_files)
+ return;
+
+ for (fb_index = 0; (fb = info_loaded_files[fb_index]); fb_index++)
+ {
+ int fb_referenced_p = 0;
+
+ /* If already gc-ed, do nothing. */
+ if (!fb->contents)
+ continue;
+
+ /* If this file had to be uncompressed, check to see if we should
+ gc it. This means that the user-variable "gc-compressed-files"
+ is non-zero. */
+ if ((fb->flags & N_IsCompressed) && !gc_compressed_files)
+ continue;
+
+ /* If this file's contents are not gc-able, move on. */
+ if (fb->flags & N_CannotGC)
+ continue;
+
+ /* Check each INFO_WINDOW to see if it has any nodes which reference
+ this file. */
+ for (iw_index = 0; (iw = info_windows[iw_index]); iw_index++)
+ {
+ for (i = 0; iw->nodes && iw->nodes[i]; i++)
+ {
+ if ((FILENAME_CMP (fb->fullpath, iw->nodes[i]->filename) == 0) ||
+ (FILENAME_CMP (fb->filename, iw->nodes[i]->filename) == 0))
+ {
+ fb_referenced_p = 1;
+ break;
+ }
+ }
+ }
+
+ /* If this file buffer wasn't referenced, free its contents. */
+ if (!fb_referenced_p)
+ {
+ free (fb->contents);
+ fb->contents = (char *)NULL;
+ }
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Traversing and Selecting References */
+/* */
+/* **************************************************************** */
+
+/* Move to the next or previous cross reference in this node. */
+static void
+info_move_to_xref (WINDOW *window, int count, unsigned char key, int dir)
+{
+ long firstmenu, firstxref;
+ long nextmenu, nextxref;
+ long placement = -1;
+ long start = 0;
+ NODE *node = window->node;
+
+ if (dir < 0)
+ start = node->nodelen;
+
+ /* This search is only allowed to fail if there is no menu or cross
+ reference in the current node. Otherwise, the first menu or xref
+ found is moved to. */
+
+ firstmenu = info_search_in_node
+ (INFO_MENU_ENTRY_LABEL, node, start, (WINDOW *)NULL, dir, 0);
+
+ /* FIRSTMENU may point directly to the line defining the menu. Skip that
+ and go directly to the first item. */
+
+ if (firstmenu != -1)
+ {
+ char *text = node->contents + firstmenu;
+
+ if (strncmp (text, INFO_MENU_LABEL, strlen (INFO_MENU_LABEL)) == 0)
+ firstmenu = info_search_in_node
+ (INFO_MENU_ENTRY_LABEL, node, firstmenu + dir, (WINDOW *)NULL, dir, 0);
+ }
+
+ firstxref =
+ info_search_in_node (INFO_XREF_LABEL, node, start, (WINDOW *)NULL, dir, 0);
+
+#if defined (HANDLE_MAN_PAGES)
+ if ((firstxref == -1) && (node->flags & N_IsManPage))
+ {
+ firstxref = locate_manpage_xref (node, start, dir);
+ }
+#endif /* HANDLE_MAN_PAGES */
+
+ if (firstmenu == -1 && firstxref == -1)
+ {
+ info_error ((char *) msg_no_xref_node, NULL, NULL);
+ return;
+ }
+
+ /* There is at least one cross reference or menu entry in this node.
+ Try hard to find the next available one. */
+
+ nextmenu = info_search_in_node
+ (INFO_MENU_ENTRY_LABEL, node, window->point + dir, (WINDOW *)NULL, dir, 0);
+
+ nextxref = info_search_in_node
+ (INFO_XREF_LABEL, node, window->point + dir, (WINDOW *)NULL, dir, 0);
+
+#if defined (HANDLE_MAN_PAGES)
+ if ((nextxref == -1) && (node->flags & N_IsManPage) && (firstxref != -1))
+ nextxref = locate_manpage_xref (node, window->point + dir, dir);
+#endif /* HANDLE_MAN_PAGES */
+
+ /* Ignore "Menu:" as a menu item. */
+ if (nextmenu != -1)
+ {
+ char *text = node->contents + nextmenu;
+
+ if (strncmp (text, INFO_MENU_LABEL, strlen (INFO_MENU_LABEL)) == 0)
+ nextmenu = info_search_in_node
+ (INFO_MENU_ENTRY_LABEL, node, nextmenu + dir, (WINDOW *)NULL, dir, 0);
+ }
+
+ /* If there is both a next menu entry, and a next xref entry, choose the
+ one which occurs first. Otherwise, select the one which actually
+ appears in this node following point. */
+ if (nextmenu != -1 && nextxref != -1)
+ {
+ if (((dir == 1) && (nextmenu < nextxref)) ||
+ ((dir == -1) && (nextmenu > nextxref)))
+ placement = nextmenu + 1;
+ else
+ placement = nextxref;
+ }
+ else if (nextmenu != -1)
+ placement = nextmenu + 1;
+ else if (nextxref != -1)
+ placement = nextxref;
+
+ /* If there was neither a menu or xref entry appearing in this node after
+ point, choose the first menu or xref entry appearing in this node. */
+ if (placement == -1)
+ {
+ if (firstmenu != -1 && firstxref != -1)
+ {
+ if (((dir == 1) && (firstmenu < firstxref)) ||
+ ((dir == -1) && (firstmenu > firstxref)))
+ placement = firstmenu + 1;
+ else
+ placement = firstxref;
+ }
+ else if (firstmenu != -1)
+ placement = firstmenu + 1;
+ else
+ placement = firstxref;
+ }
+ window->point = placement;
+ window_adjust_pagetop (window);
+ window->flags |= W_UpdateWindow;
+}
+
+DECLARE_INFO_COMMAND (info_move_to_prev_xref,
+ _("Move to the previous cross reference"))
+{
+ if (count < 0)
+ info_move_to_prev_xref (window, -count, key);
+ else
+ info_move_to_xref (window, count, key, -1);
+}
+
+DECLARE_INFO_COMMAND (info_move_to_next_xref,
+ _("Move to the next cross reference"))
+{
+ if (count < 0)
+ info_move_to_next_xref (window, -count, key);
+ else
+ info_move_to_xref (window, count, key, 1);
+}
+
+/* Select the menu item or reference that appears on this line. */
+DECLARE_INFO_COMMAND (info_select_reference_this_line,
+ _("Select reference or menu item appearing on this line"))
+{
+ char *line;
+
+ if (window->line_starts)
+ line = window->line_starts[window_line_of_point (window)];
+ else
+ line = "";
+
+ /* If this line contains a menu item, select that one. */
+ if (strncmp ("* ", line, 2) == 0)
+ info_menu_or_ref_item (window, count, key, info_menu_of_node, 0);
+ else
+ info_menu_or_ref_item (window, count, key, info_xrefs_of_node, 0);
+}
+
+/* **************************************************************** */
+/* */
+/* Miscellaneous Info Commands */
+/* */
+/* **************************************************************** */
+
+/* What to do when C-g is pressed in a window. */
+DECLARE_INFO_COMMAND (info_abort_key, _("Cancel current operation"))
+{
+ /* If error printing doesn't oridinarily ring the bell, do it now,
+ since C-g always rings the bell. Otherwise, let the error printer
+ do it. */
+ if (!info_error_rings_bell_p)
+ terminal_ring_bell ();
+ info_error ((char *) _("Quit"), NULL, NULL);
+
+ info_initialize_numeric_arg ();
+ info_clear_pending_input ();
+ info_last_executed_command = (VFunction *)NULL;
+}
+
+/* Move the cursor to the desired line of the window. */
+DECLARE_INFO_COMMAND (info_move_to_window_line,
+ _("Move the cursor to a specific line of the window"))
+{
+ int line;
+
+ /* With no numeric argument of any kind, default to the center line. */
+ if (!info_explicit_arg && count == 1)
+ line = (window->height / 2) + window->pagetop;
+ else
+ {
+ if (count < 0)
+ line = (window->height + count) + window->pagetop;
+ else
+ line = window->pagetop + count;
+ }
+
+ /* If the line doesn't appear in this window, make it do so. */
+ if ((line - window->pagetop) >= window->height)
+ line = window->pagetop + (window->height - 1);
+
+ /* If the line is too small, make it fit. */
+ if (line < window->pagetop)
+ line = window->pagetop;
+
+ /* If the selected line is past the bottom of the node, force it back. */
+ if (line >= window->line_count)
+ line = window->line_count - 1;
+
+ window->point = (window->line_starts[line] - window->node->contents);
+}
+
+/* Clear the screen and redraw its contents. Given a numeric argument,
+ move the line the cursor is on to the COUNT'th line of the window. */
+DECLARE_INFO_COMMAND (info_redraw_display, _("Redraw the display"))
+{
+ if ((!info_explicit_arg && count == 1) || echo_area_is_active)
+ {
+ terminal_clear_screen ();
+ display_clear_display (the_display);
+ window_mark_chain (windows, W_UpdateWindow);
+ display_update_display (windows);
+ }
+ else
+ {
+ int desired_line, point_line;
+ int new_pagetop;
+
+ point_line = window_line_of_point (window) - window->pagetop;
+
+ if (count < 0)
+ desired_line = window->height + count;
+ else
+ desired_line = count;
+
+ if (desired_line < 0)
+ desired_line = 0;
+
+ if (desired_line >= window->height)
+ desired_line = window->height - 1;
+
+ if (desired_line == point_line)
+ return;
+
+ new_pagetop = window->pagetop + (point_line - desired_line);
+
+ set_window_pagetop (window, new_pagetop);
+ }
+}
+/* This command does nothing. It is the fact that a key is bound to it
+ that has meaning. See the code at the top of info_session (). */
+DECLARE_INFO_COMMAND (info_quit, _("Quit using Info"))
+{}
+
+
+/* **************************************************************** */
+/* */
+/* Reading Keys and Dispatching on Them */
+/* */
+/* **************************************************************** */
+
+/* Declaration only. Special cased in info_dispatch_on_key ().
+ Doc string is to avoid ugly results with describe_key etc. */
+DECLARE_INFO_COMMAND (info_do_lowercase_version,
+ _("Run command bound to this key's lowercase variant"))
+{}
+
+static void
+dispatch_error (char *keyseq)
+{
+ char *rep;
+
+ rep = pretty_keyseq (keyseq);
+
+ if (!echo_area_is_active)
+ info_error ((char *) _("Unknown command (%s)."), rep, NULL);
+ else
+ {
+ char *temp = xmalloc (1 + strlen (rep) + strlen (_("\"%s\" is invalid")));
+ sprintf (temp, _("`%s' is invalid"), rep);
+ terminal_ring_bell ();
+ inform_in_echo_area (temp);
+ free (temp);
+ }
+}
+
+/* Keeping track of key sequences. */
+static char *info_keyseq = (char *)NULL;
+static int info_keyseq_index = 0;
+static int info_keyseq_size = 0;
+static int info_keyseq_displayed_p = 0;
+
+/* Initialize the length of the current key sequence. */
+void
+initialize_keyseq (void)
+{
+ info_keyseq_index = 0;
+ info_keyseq_displayed_p = 0;
+}
+
+/* Add CHARACTER to the current key sequence. */
+void
+add_char_to_keyseq (char character)
+{
+ if (info_keyseq_index + 2 >= info_keyseq_size)
+ info_keyseq = (char *)xrealloc (info_keyseq, info_keyseq_size += 10);
+
+ info_keyseq[info_keyseq_index++] = character;
+ info_keyseq[info_keyseq_index] = '\0';
+}
+
+/* Display the current value of info_keyseq. If argument EXPECTING is
+ non-zero, input is expected to be read after the key sequence is
+ displayed, so add an additional prompting character to the sequence. */
+static void
+display_info_keyseq (int expecting_future_input)
+{
+ char *rep;
+
+ rep = pretty_keyseq (info_keyseq);
+ if (expecting_future_input)
+ strcat (rep, "-");
+
+ if (echo_area_is_active)
+ inform_in_echo_area (rep);
+ else
+ {
+ window_message_in_echo_area (rep, NULL, NULL);
+ display_cursor_at_point (active_window);
+ }
+ info_keyseq_displayed_p = 1;
+}
+
+/* Called by interactive commands to read a keystroke. */
+unsigned char
+info_get_another_input_char (void)
+{
+ int ready = !info_keyseq_displayed_p; /* ready if new and pending key */
+
+ /* If there isn't any input currently available, then wait a
+ moment looking for input. If we don't get it fast enough,
+ prompt a little bit with the current key sequence. */
+ if (!info_keyseq_displayed_p)
+ {
+ ready = 1;
+ if (!info_any_buffered_input_p () &&
+ !info_input_pending_p ())
+ {
+#if defined (FD_SET)
+ struct timeval timer;
+ fd_set readfds;
+
+ FD_ZERO (&readfds);
+ FD_SET (fileno (info_input_stream), &readfds);
+ timer.tv_sec = 1;
+ timer.tv_usec = 750;
+ ready = select (fileno(info_input_stream)+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
+#else
+ ready = 0;
+#endif /* FD_SET */
+ }
+ }
+
+ if (!ready)
+ display_info_keyseq (1);
+
+ return (info_get_input_char ());
+}
+
+/* Do the command associated with KEY in MAP. If the associated command is
+ really a keymap, then read another key, and dispatch into that map. */
+void
+info_dispatch_on_key (unsigned char key, Keymap map)
+{
+#if !defined(INFOKEY)
+ if (Meta_p (key) && (!ISO_Latin_p || map[key].function != ea_insert))
+ {
+ if (map[ESC].type == ISKMAP)
+ {
+ map = (Keymap)map[ESC].function;
+ add_char_to_keyseq (ESC);
+ key = UnMeta (key);
+ info_dispatch_on_key (key, map);
+ }
+ else
+ {
+ dispatch_error (info_keyseq);
+ }
+ return;
+ }
+#endif /* INFOKEY */
+
+ switch (map[key].type)
+ {
+ case ISFUNC:
+ {
+ VFunction *func;
+
+ func = InfoFunction(map[key].function);
+ if (func != (VFunction *)NULL)
+ {
+ /* Special case info_do_lowercase_version (). */
+ if (func == (VFunction *) info_do_lowercase_version)
+ {
+#if defined(INFOKEY)
+ unsigned char lowerkey;
+
+ lowerkey = Meta_p(key) ? Meta (tolower (UnMeta (key))) : tolower (key);
+ if (lowerkey == key)
+ {
+ add_char_to_keyseq (key);
+ dispatch_error (info_keyseq);
+ return;
+ }
+ info_dispatch_on_key (lowerkey, map);
+#else /* !INFOKEY */
+ info_dispatch_on_key (tolower (key), map);
+#endif /* INFOKEY */
+ return;
+ }
+
+ add_char_to_keyseq (key);
+
+ if (info_keyseq_displayed_p)
+ display_info_keyseq (0);
+
+ {
+ WINDOW *where;
+
+ where = active_window;
+ (*InfoFunction(map[key].function))
+ (active_window, info_numeric_arg * info_numeric_arg_sign, key);
+
+ /* If we have input pending, then the last command was a prefix
+ command. Don't change the value of the last function vars.
+ Otherwise, remember the last command executed in the var
+ appropriate to the window in which it was executed. */
+ if (!info_input_pending_p ())
+ {
+ if (where == the_echo_area)
+ ea_last_executed_command = InfoFunction(map[key].function);
+ else
+ info_last_executed_command = InfoFunction(map[key].function);
+ }
+ }
+ }
+ else
+ {
+ add_char_to_keyseq (key);
+ dispatch_error (info_keyseq);
+ return;
+ }
+ }
+ break;
+
+ case ISKMAP:
+ add_char_to_keyseq (key);
+ if (map[key].function != (InfoCommand *)NULL)
+ {
+ unsigned char newkey;
+
+ newkey = info_get_another_input_char ();
+ info_dispatch_on_key (newkey, (Keymap)map[key].function);
+ }
+ else
+ {
+ dispatch_error (info_keyseq);
+ return;
+ }
+ break;
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Numeric Arguments */
+/* */
+/* **************************************************************** */
+
+/* Handle C-u style numeric args, as well as M--, and M-digits. */
+
+/* Non-zero means that an explicit argument has been passed to this
+ command, as in C-u C-v. */
+int info_explicit_arg = 0;
+
+/* The sign of the numeric argument. */
+int info_numeric_arg_sign = 1;
+
+/* The value of the argument itself. */
+int info_numeric_arg = 1;
+
+/* Add the current digit to the argument in progress. */
+DECLARE_INFO_COMMAND (info_add_digit_to_numeric_arg,
+ _("Add this digit to the current numeric argument"))
+{
+ info_numeric_arg_digit_loop (window, 0, key);
+}
+
+/* C-u, universal argument. Multiply the current argument by 4.
+ Read a key. If the key has nothing to do with arguments, then
+ dispatch on it. If the key is the abort character then abort. */
+DECLARE_INFO_COMMAND (info_universal_argument,
+ _("Start (or multiply by 4) the current numeric argument"))
+{
+ info_numeric_arg *= 4;
+ info_numeric_arg_digit_loop (window, 0, 0);
+}
+
+/* Create a default argument. */
+void
+info_initialize_numeric_arg (void)
+{
+ info_numeric_arg = info_numeric_arg_sign = 1;
+ info_explicit_arg = 0;
+}
+
+DECLARE_INFO_COMMAND (info_numeric_arg_digit_loop,
+ _("Internally used by \\[universal-argument]"))
+{
+ unsigned char pure_key;
+ Keymap keymap = window->keymap;
+
+ while (1)
+ {
+ if (key)
+ pure_key = key;
+ else
+ {
+ if (display_was_interrupted_p && !info_any_buffered_input_p ())
+ display_update_display (windows);
+
+ if (active_window != the_echo_area)
+ display_cursor_at_point (active_window);
+
+ pure_key = key = info_get_another_input_char ();
+
+#if !defined(INFOKEY)
+ if (Meta_p (key))
+ add_char_to_keyseq (ESC);
+
+ add_char_to_keyseq (UnMeta (key));
+#else /* defined(INFOKEY) */
+ add_char_to_keyseq (key);
+#endif /* defined(INFOKEY) */
+ }
+
+#if !defined(INFOKEY)
+ if (Meta_p (key))
+ key = UnMeta (key);
+#endif /* !defined(INFOKEY) */
+
+ if (keymap[key].type == ISFUNC
+ && InfoFunction(keymap[key].function)
+ == (VFunction *) info_universal_argument)
+ {
+ info_numeric_arg *= 4;
+ key = 0;
+ continue;
+ }
+
+#if defined(INFOKEY)
+ if (Meta_p (key))
+ key = UnMeta (key);
+#endif /* !defined(INFOKEY) */
+
+
+ if (isdigit (key))
+ {
+ if (info_explicit_arg)
+ info_numeric_arg = (info_numeric_arg * 10) + (key - '0');
+ else
+ info_numeric_arg = (key - '0');
+ info_explicit_arg = 1;
+ }
+ else
+ {
+ if (key == '-' && !info_explicit_arg)
+ {
+ info_numeric_arg_sign = -1;
+ info_numeric_arg = 1;
+ }
+ else
+ {
+ info_keyseq_index--;
+ info_dispatch_on_key (pure_key, keymap);
+ return;
+ }
+ }
+ key = 0;
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* Input Character Buffering */
+/* */
+/* **************************************************************** */
+
+/* Character waiting to be read next. */
+static int pending_input_character = 0;
+
+/* How to make there be no pending input. */
+static void
+info_clear_pending_input (void)
+{
+ pending_input_character = 0;
+}
+
+/* How to set the pending input character. */
+static void
+info_set_pending_input (unsigned char key)
+{
+ pending_input_character = key;
+}
+
+/* How to see if there is any pending input. */
+unsigned char
+info_input_pending_p (void)
+{
+ return (pending_input_character);
+}
+
+/* Largest number of characters that we can read in advance. */
+#define MAX_INFO_INPUT_BUFFERING 512
+
+static int pop_index = 0, push_index = 0;
+static unsigned char info_input_buffer[MAX_INFO_INPUT_BUFFERING];
+
+/* Add KEY to the buffer of characters to be read. */
+static void
+info_push_typeahead (unsigned char key)
+{
+ /* Flush all pending input in the case of C-g pressed. */
+ if (key == Control ('g'))
+ {
+ push_index = pop_index;
+ info_set_pending_input (Control ('g'));
+ }
+ else
+ {
+ info_input_buffer[push_index++] = key;
+ if ((unsigned int) push_index >= sizeof (info_input_buffer))
+ push_index = 0;
+ }
+}
+
+/* Return the amount of space available in INFO_INPUT_BUFFER for new chars. */
+static int
+info_input_buffer_space_available (void)
+{
+ if (pop_index > push_index)
+ return (pop_index - push_index);
+ else
+ return (sizeof (info_input_buffer) - (push_index - pop_index));
+}
+
+/* Get a key from the buffer of characters to be read.
+ Return the key in KEY.
+ Result is non-zero if there was a key, or 0 if there wasn't. */
+static int
+info_get_key_from_typeahead (unsigned char *key)
+{
+ if (push_index == pop_index)
+ return (0);
+
+ *key = info_input_buffer[pop_index++];
+
+ if ((unsigned int) pop_index >= sizeof (info_input_buffer))
+ pop_index = 0;
+
+ return (1);
+}
+
+int
+info_any_buffered_input_p (void)
+{
+ info_gather_typeahead ();
+ return (push_index != pop_index);
+}
+
+/* If characters are available to be read, then read them and stuff them into
+ info_input_buffer. Otherwise, do nothing. */
+void
+info_gather_typeahead (void)
+{
+ register int i = 0;
+ int tty, space_avail;
+ long chars_avail;
+ unsigned char input[MAX_INFO_INPUT_BUFFERING];
+
+ tty = fileno (info_input_stream);
+ chars_avail = 0;
+
+ space_avail = info_input_buffer_space_available ();
+
+ /* If we can just find out how many characters there are to read, do so. */
+#if defined (FIONREAD)
+ {
+ ioctl (tty, FIONREAD, &chars_avail);
+
+ if (chars_avail > space_avail)
+ chars_avail = space_avail;
+
+ if (chars_avail)
+ chars_avail = read (tty, &input[0], chars_avail);
+ }
+#else /* !FIONREAD */
+# if defined (O_NDELAY)
+ {
+ int flags;
+
+ flags = fcntl (tty, F_GETFL, 0);
+
+ fcntl (tty, F_SETFL, (flags | O_NDELAY));
+ chars_avail = read (tty, &input[0], space_avail);
+ fcntl (tty, F_SETFL, flags);
+
+ if (chars_avail == -1)
+ chars_avail = 0;
+ }
+# else /* !O_NDELAY */
+# ifdef __DJGPP__
+ {
+ extern long pc_term_chars_avail (void);
+
+ if (isatty (tty))
+ chars_avail = pc_term_chars_avail ();
+ else
+ {
+ /* We could be more accurate by calling ltell, but we have no idea
+ whether tty is buffered by stdio functions, and if so, how many
+ characters are already waiting in the buffer. So we punt. */
+ struct stat st;
+
+ if (fstat (tty, &st) < 0)
+ chars_avail = 1;
+ else
+ chars_avail = st.st_size;
+ }
+ if (chars_avail > space_avail)
+ chars_avail = space_avail;
+ if (chars_avail)
+ chars_avail = read (tty, &input[0], chars_avail);
+ }
+# endif/* __DJGPP__ */
+# endif /* O_NDELAY */
+#endif /* !FIONREAD */
+
+ while (i < chars_avail)
+ {
+ info_push_typeahead (input[i]);
+ i++;
+ }
+}
+
+/* How to read a single character. */
+unsigned char
+info_get_input_char (void)
+{
+ unsigned char keystroke;
+
+ info_gather_typeahead ();
+
+ if (pending_input_character)
+ {
+ keystroke = pending_input_character;
+ pending_input_character = 0;
+ }
+ else if (info_get_key_from_typeahead (&keystroke) == 0)
+ {
+ int rawkey;
+ unsigned char c;
+ int tty = fileno (info_input_stream);
+
+ /* Using stream I/O causes FIONREAD etc to fail to work
+ so unless someone can find a portable way of finding
+ out how many characters are currently buffered, we
+ should stay with away from stream I/O.
+ --Egil Kvaleberg <egilk@sn.no>, January 1997. */
+#ifdef EINTR
+ /* Keep reading if we got EINTR, so that we don't just exit.
+ --Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>,
+ 22 Dec 1997. */
+ {
+ int n;
+ do
+ n = read (tty, &c, 1);
+ while (n == -1 && errno == EINTR);
+ rawkey = n == 1 ? c : EOF;
+ }
+#else
+ rawkey = (read (tty, &c, 1) == 1) ? c : EOF;
+#endif
+
+ keystroke = rawkey;
+
+ if (rawkey == EOF)
+ {
+ if (info_input_stream != stdin)
+ {
+ fclose (info_input_stream);
+ info_input_stream = stdin;
+ tty = fileno (info_input_stream);
+ display_inhibited = 0;
+ display_update_display (windows);
+ display_cursor_at_point (active_window);
+ rawkey = (read (tty, &c, 1) == 1) ? c : EOF;
+ keystroke = rawkey;
+ }
+
+ if (rawkey == EOF)
+ {
+ terminal_unprep_terminal ();
+ close_dribble_file ();
+ xexit (0);
+ }
+ }
+ }
+
+ if (info_dribble_file)
+ dribble (keystroke);
+
+ return keystroke;
+}
diff --git a/Build/source/utils/texinfo/info/session.h b/Build/source/utils/texinfo/info/session.h
new file mode 100644
index 00000000000..62f8ffe57d2
--- /dev/null
+++ b/Build/source/utils/texinfo/info/session.h
@@ -0,0 +1,237 @@
+/* session.h -- Functions found in session.c.
+ $Id: session.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1998, 1999, 2001, 2002, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef SESSION_H
+#define SESSION_H
+
+#include "info.h"
+#include "dribble.h"
+
+/* All commands that can be invoked from within info_session () receive
+ arguments in the same way. This simple define declares the header
+ of a function named NAME, with associated documentation DOC. The
+ documentation string is groveled out of the source files by the
+ utility program `makedoc', which is also responsible for making
+ the documentation/function-pointer maps. */
+#define DECLARE_INFO_COMMAND(name, doc) \
+void name (WINDOW *window, int count, unsigned char key)
+
+/* Variables found in session.h. */
+extern VFunction *info_last_executed_command;
+
+/* Variable controlling the garbage collection of files briefly visited
+ during searches. Such files are normally gc'ed, unless they were
+ compressed to begin with. If this variable is non-zero, it says
+ to gc even those file buffer contents which had to be uncompressed. */
+extern int gc_compressed_files;
+
+/* When non-zero, tiling takes place automatically when info_split_window
+ is called. */
+extern int auto_tiling_p;
+
+/* Variable controlling the behaviour of default scrolling when you are
+ already at the bottom of a node. */
+extern int info_scroll_behaviour;
+extern char *info_scroll_choices[];
+
+/* Values for info_scroll_behaviour. */
+#define IS_Continuous 0 /* Try to get first menu item, or failing that, the
+ "Next:" pointer, or failing that, the "Up:" and
+ "Next:" of the up. */
+#define IS_NextOnly 1 /* Try to get "Next:" menu item. */
+#define IS_PageOnly 2 /* Simply give up at the bottom of a node. */
+
+/* Utility functions found in session.c */
+extern void info_dispatch_on_key (unsigned char key, Keymap map);
+extern unsigned char info_get_input_char (void);
+extern unsigned char info_get_another_input_char (void);
+extern unsigned char info_input_pending_p (void);
+extern void remember_window_and_node (WINDOW *window, NODE *node);
+extern void set_remembered_pagetop_and_point (WINDOW *window);
+extern void set_window_pagetop (WINDOW *window, int desired_top);
+extern void info_set_node_of_window (int remember, WINDOW *window,
+ NODE *node);
+extern void initialize_keyseq (void);
+extern void add_char_to_keyseq (char character);
+extern void info_gather_typeahead (void);
+extern FILE_BUFFER *file_buffer_of_window (WINDOW *window);
+extern long info_search_in_node (char *string, NODE *node,
+ long int start, WINDOW *window, int dir, int case_sensitive);
+extern long info_target_search_node (NODE *node, char *string,
+ long int start);
+extern void info_select_reference (WINDOW *window, REFERENCE *entry);
+extern int info_any_buffered_input_p (void);
+extern void print_node (NODE *node);
+extern void dump_node_to_file (NODE *node, char *filename,
+ int dump_subnodes);
+extern void dump_nodes_to_file (char *filename, char **nodenames,
+ char *output_filename, int dump_subnodes);
+extern char *program_name_from_file_name (char *file_name);
+
+/* Do the physical deletion of WINDOW, and forget this window and
+ associated nodes. */
+extern void info_delete_window_internal (WINDOW *window);
+
+/* Tell Info that input is coming from the file FILENAME. */
+extern void info_set_input_from_file (char *filename);
+
+#define return_if_control_g(val) \
+ do { \
+ info_gather_typeahead (); \
+ if (info_input_pending_p () == Control ('g')) \
+ return (val); \
+ } while (0)
+
+/* The names of the functions that run an info session. */
+
+/* Starting an info session. */
+extern void begin_multiple_window_info_session (char *filename,
+ char **nodenames);
+extern void begin_info_session (NODE *initial_node);
+extern void begin_info_session_with_error (NODE *initial_node,
+ char *format, void *arg1, void *arg2);
+extern void info_session (void);
+extern void initialize_info_session (NODE *node, int clear_screen);
+extern void info_read_and_dispatch (void);
+extern void info_intuit_options_node (WINDOW *window,
+ NODE *initial_node, char *program);
+
+/* Moving the point within a node. */
+extern void info_next_line (WINDOW *window, int count, unsigned char key);
+extern void info_prev_line (WINDOW *window, int count, unsigned char key);
+extern void info_end_of_line (WINDOW *window, int count, unsigned char key);
+extern void info_beginning_of_line (WINDOW *window, int count, unsigned char key);
+extern void info_forward_char (WINDOW *window, int count, unsigned char key);
+extern void info_backward_char (WINDOW *window, int count, unsigned char key);
+extern void info_forward_word (WINDOW *window, int count, unsigned char key);
+extern void info_backward_word (WINDOW *window, int count, unsigned char key);
+extern void info_beginning_of_node (WINDOW *window, int count, unsigned char key);
+extern void info_end_of_node (WINDOW *window, int count, unsigned char key);
+extern void info_move_to_prev_xref (WINDOW *window, int count, unsigned char key);
+extern void info_move_to_next_xref (WINDOW *window, int count, unsigned char key);
+
+/* Scrolling text within a window. */
+extern void info_scroll_forward (WINDOW *window, int count, unsigned char key);
+extern void info_scroll_backward (WINDOW *window, int count, unsigned char key);
+extern void info_redraw_display (WINDOW *window, int count, unsigned char key);
+extern void info_toggle_wrap (WINDOW *window, int count, unsigned char key);
+extern void info_move_to_window_line (WINDOW *window, int count,
+ unsigned char key);
+extern void info_up_line (WINDOW *window, int count, unsigned char key);
+extern void info_down_line (WINDOW *window, int count, unsigned char key);
+extern void info_scroll_half_screen_down (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_half_screen_up (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_forward_set_window (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_forward_page_only (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_forward_page_only_set_window (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_backward_set_window (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_backward_page_only (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_backward_page_only_set_window (WINDOW *window, int count,
+ unsigned char key);
+extern void info_scroll_other_window_backward (WINDOW *window, int count,
+ unsigned char key);
+
+/* Manipulating multiple windows. */
+extern void info_split_window (WINDOW *window, int count, unsigned char key);
+extern void info_delete_window (WINDOW *window, int count, unsigned char key);
+extern void info_keep_one_window (WINDOW *window, int count, unsigned char key);
+extern void info_grow_window (WINDOW *window, int count, unsigned char key);
+extern void info_scroll_other_window (WINDOW *window, int count,
+ unsigned char key);
+extern void info_tile_windows (WINDOW *window, int count, unsigned char key);
+extern void info_next_window (WINDOW *window, int count, unsigned char key);
+extern void info_prev_window (WINDOW *window, int count, unsigned char key);
+
+/* Selecting nodes. */
+extern void info_next_node (WINDOW *window, int count, unsigned char key);
+extern void info_prev_node (WINDOW *window, int count, unsigned char key);
+extern void info_up_node (WINDOW *window, int count, unsigned char key);
+extern void info_last_node (WINDOW *window, int count, unsigned char key);
+extern void info_first_node (WINDOW *window, int count, unsigned char key);
+extern void info_history_node (WINDOW *window, int count, unsigned char key);
+extern void info_goto_node (WINDOW *window, int count, unsigned char key);
+extern void info_goto_invocation_node (WINDOW *window, int count,
+ unsigned char key);
+extern void info_top_node (WINDOW *window, int count, unsigned char key);
+extern void info_dir_node (WINDOW *window, int count, unsigned char key);
+extern void info_global_next_node (WINDOW *window, int count, unsigned char key);
+extern void info_global_prev_node (WINDOW *window, int count, unsigned char key);
+extern void info_kill_node (WINDOW *window, int count, unsigned char key);
+extern void info_view_file (WINDOW *window, int count, unsigned char key);
+extern void info_menu_sequence (WINDOW *window, int count, unsigned char key);
+extern NODE *info_follow_menus (NODE *initial_node, char **menus,
+ const char **errstr, char **errarg1, char **errarg2);
+extern void info_man (WINDOW *window, int count, unsigned char key);
+extern void list_visited_nodes (WINDOW *window, int count, unsigned char key);
+extern void select_visited_node (WINDOW *window, int count, unsigned char key);
+
+/* Selecting cross references. */
+extern void info_menu_digit (WINDOW *window, int count, unsigned char key);
+extern void info_menu_item (WINDOW *window, int count, unsigned char key);
+extern void info_xref_item (WINDOW *window, int count, unsigned char key);
+extern void info_find_menu (WINDOW *window, int count, unsigned char key);
+extern void info_select_reference_this_line (WINDOW *window, int count,
+ unsigned char key);
+extern void info_last_menu_item (WINDOW *window, int count, unsigned char key);
+extern void info_visit_menu (WINDOW *window, int count, unsigned char key);
+
+/* Hacking numeric arguments. */
+extern int info_explicit_arg, info_numeric_arg, info_numeric_arg_sign;
+
+extern void info_add_digit_to_numeric_arg (WINDOW *window, int count,
+ unsigned char key);
+extern void info_universal_argument (WINDOW *window, int count,
+ unsigned char key);
+extern void info_initialize_numeric_arg (void);
+extern void info_numeric_arg_digit_loop (WINDOW *window, int count,
+ unsigned char key);
+
+/* Searching commands. */
+extern void info_search (WINDOW *window, int count, unsigned char key);
+extern void isearch_forward (WINDOW *window, int count, unsigned char key);
+extern void isearch_backward (WINDOW *window, int count, unsigned char key);
+extern void info_search_case_sensitively (WINDOW *window, int count,
+ unsigned char key);
+extern void info_search_backward (WINDOW *window, int count, unsigned char key);
+extern void info_search_next (WINDOW *window, int count, unsigned char key);
+extern void info_search_previous (WINDOW *window, int count, unsigned char key);
+
+/* Dumping and printing nodes. */
+extern void info_print_node (WINDOW *window, int count, unsigned char key);
+
+/* Footnotes. */
+extern void info_show_footnotes (WINDOW *window, int count, unsigned char key);
+
+/* Miscellaneous commands. */
+extern void info_abort_key (WINDOW *window, int count, unsigned char key);
+extern void info_quit (WINDOW *window, int count, unsigned char key);
+extern void info_do_lowercase_version (WINDOW *window, int count,
+ unsigned char key);
+
+#endif /* not SESSION_H */
diff --git a/Build/source/utils/texinfo/info/signals.c b/Build/source/utils/texinfo/info/signals.c
new file mode 100644
index 00000000000..724768b4ec7
--- /dev/null
+++ b/Build/source/utils/texinfo/info/signals.c
@@ -0,0 +1,295 @@
+/* signals.c -- install and maintain signal handlers.
+ $Id: signals.c,v 1.7 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1994, 1995, 1998, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "signals.h"
+
+void initialize_info_signal_handler (void);
+
+/* **************************************************************** */
+/* */
+/* Pretending That We Have POSIX Signals */
+/* */
+/* **************************************************************** */
+
+#if !defined (HAVE_SIGPROCMASK) && defined (HAVE_SIGSETMASK)
+/* Perform OPERATION on NEWSET, perhaps leaving information in OLDSET. */
+static void
+sigprocmask (int operation, int *newset, int *oldset)
+{
+ switch (operation)
+ {
+ case SIG_UNBLOCK:
+ sigsetmask (sigblock (0) & ~(*newset));
+ break;
+
+ case SIG_BLOCK:
+ *oldset = sigblock (*newset);
+ break;
+
+ case SIG_SETMASK:
+ sigsetmask (*newset);
+ break;
+
+ default:
+ abort ();
+ }
+}
+#endif /* !HAVE_SIGPROCMASK && HAVE_SIGSETMASK */
+
+/* **************************************************************** */
+/* */
+/* Signal Handling for Info */
+/* */
+/* **************************************************************** */
+
+#if defined (HAVE_SIGACTION) || defined (HAVE_SIGPROCMASK) ||\
+ defined (HAVE_SIGSETMASK)
+static void
+mask_termsig (sigset_t *set)
+{
+# if defined (SIGTSTP)
+ sigaddset (set, SIGTSTP);
+ sigaddset (set, SIGTTOU);
+ sigaddset (set, SIGTTIN);
+# endif
+# if defined (SIGWINCH)
+ sigaddset (set, SIGWINCH);
+# endif
+#if defined (SIGQUIT)
+ sigaddset (set, SIGQUIT);
+#endif
+#if defined (SIGINT)
+ sigaddset (set, SIGINT);
+#endif
+# if defined (SIGUSR1)
+ sigaddset (set, SIGUSR1);
+# endif
+}
+#endif /* HAVE_SIGACTION || HAVE_SIGPROCMASK || HAVE_SIGSETMASK */
+
+static RETSIGTYPE info_signal_proc (int sig);
+#if defined (HAVE_SIGACTION)
+typedef struct sigaction signal_info;
+signal_info info_signal_handler;
+
+static void
+set_termsig (int sig, signal_info *old)
+{
+ sigaction (sig, &info_signal_handler, old);
+}
+
+static void
+restore_termsig (int sig, const signal_info *saved)
+{
+ sigaction (sig, saved, NULL);
+}
+#else /* !HAVE_SIGACTION */
+typedef RETSIGTYPE (*signal_info) ();
+#define set_termsig(sig, old) (void)(*(old) = signal (sig, info_signal_proc))
+#define restore_termsig(sig, saved) (void)signal (sig, *(saved))
+#define info_signal_handler info_signal_proc
+static int term_conf_busy = 0;
+#endif /* !HAVE_SIGACTION */
+
+static signal_info old_TSTP, old_TTOU, old_TTIN;
+static signal_info old_WINCH, old_INT, old_USR1;
+static signal_info old_QUIT;
+
+void
+initialize_info_signal_handler (void)
+{
+#ifdef SA_NOCLDSTOP
+ /* (Based on info from Paul Eggert found in coreutils.) Don't use
+ HAVE_SIGACTION to decide whether to use the sa_handler, sa_flags,
+ sa_mask members, as some systems (Solaris 7+) don't define them. Use
+ SA_NOCLDSTOP instead; it's been part of POSIX.1 since day 1 (in 1988). */
+ info_signal_handler.sa_handler = info_signal_proc;
+ info_signal_handler.sa_flags = 0;
+ mask_termsig (&info_signal_handler.sa_mask);
+#endif /* SA_NOCLDSTOP */
+
+#if defined (SIGTSTP)
+ set_termsig (SIGTSTP, &old_TSTP);
+ set_termsig (SIGTTOU, &old_TTOU);
+ set_termsig (SIGTTIN, &old_TTIN);
+#endif /* SIGTSTP */
+
+#if defined (SIGWINCH)
+ set_termsig (SIGWINCH, &old_WINCH);
+#endif
+
+#if defined (SIGQUIT)
+ set_termsig (SIGQUIT, &old_QUIT);
+#endif
+
+#if defined (SIGINT)
+ set_termsig (SIGINT, &old_INT);
+#endif
+
+#if defined (SIGUSR1)
+ /* Used by DJGPP to simulate SIGTSTP on Ctrl-Z. */
+ set_termsig (SIGUSR1, &old_USR1);
+#endif
+}
+
+static void
+redisplay_after_signal (void)
+{
+ terminal_clear_screen ();
+ display_clear_display (the_display);
+ window_mark_chain (windows, W_UpdateWindow);
+ display_update_display (windows);
+ display_cursor_at_point (active_window);
+ fflush (stdout);
+}
+
+static void
+reset_info_window_sizes (void)
+{
+ terminal_goto_xy (0, 0);
+ fflush (stdout);
+ terminal_unprep_terminal ();
+ terminal_get_screen_size ();
+ terminal_prep_terminal ();
+ display_initialize_display (screenwidth, screenheight);
+ window_new_screen_size (screenwidth, screenheight);
+ redisplay_after_signal ();
+}
+
+static RETSIGTYPE
+info_signal_proc (int sig)
+{
+ signal_info *old_signal_handler = NULL;
+
+#if !defined (HAVE_SIGACTION)
+ /* best effort: first increment this counter and later block signals */
+ if (term_conf_busy)
+ return;
+ term_conf_busy++;
+#if defined (HAVE_SIGPROCMASK) || defined (HAVE_SIGSETMASK)
+ {
+ sigset_t nvar, ovar;
+ sigemptyset (&nvar);
+ mask_termsig (&nvar);
+ sigprocmask (SIG_BLOCK, &nvar, &ovar);
+ }
+#endif /* HAVE_SIGPROCMASK || HAVE_SIGSETMASK */
+#endif /* !HAVE_SIGACTION */
+ switch (sig)
+ {
+#if defined (SIGTSTP)
+ case SIGTSTP:
+ case SIGTTOU:
+ case SIGTTIN:
+#endif
+#if defined (SIGQUIT)
+ case SIGQUIT:
+#endif
+#if defined (SIGINT)
+ case SIGINT:
+#endif
+ {
+#if defined (SIGTSTP)
+ if (sig == SIGTSTP)
+ old_signal_handler = &old_TSTP;
+ if (sig == SIGTTOU)
+ old_signal_handler = &old_TTOU;
+ if (sig == SIGTTIN)
+ old_signal_handler = &old_TTIN;
+#endif /* SIGTSTP */
+#if defined (SIGQUIT)
+ if (sig == SIGQUIT)
+ old_signal_handler = &old_QUIT;
+#endif /* SIGQUIT */
+#if defined (SIGINT)
+ if (sig == SIGINT)
+ old_signal_handler = &old_INT;
+#endif /* SIGINT */
+
+ /* For stop signals, restore the terminal IO, leave the cursor
+ at the bottom of the window, and stop us. */
+ terminal_goto_xy (0, screenheight - 1);
+ terminal_clear_to_eol ();
+ fflush (stdout);
+ terminal_unprep_terminal ();
+ restore_termsig (sig, old_signal_handler);
+ UNBLOCK_SIGNAL (sig);
+ kill (getpid (), sig);
+
+ /* The program is returning now. Restore our signal handler,
+ turn on terminal handling, redraw the screen, and place the
+ cursor where it belongs. */
+ terminal_prep_terminal ();
+ set_termsig (sig, old_signal_handler);
+ /* window size might be changed while sleeping */
+ reset_info_window_sizes ();
+ }
+ break;
+
+#if defined (SIGWINCH) || defined (SIGUSR1)
+#ifdef SIGWINCH
+ case SIGWINCH:
+#endif
+#ifdef SIGUSR1
+ case SIGUSR1:
+#endif
+ {
+ /* Turn off terminal IO, tell our parent that the window has changed,
+ then reinitialize the terminal and rebuild our windows. */
+#ifdef SIGWINCH
+ if (sig == SIGWINCH)
+ old_signal_handler = &old_WINCH;
+#endif
+#ifdef SIGUSR1
+ if (sig == SIGUSR1)
+ old_signal_handler = &old_USR1;
+#endif
+ terminal_goto_xy (0, 0);
+ fflush (stdout);
+ terminal_unprep_terminal (); /* needless? */
+ restore_termsig (sig, old_signal_handler);
+ UNBLOCK_SIGNAL (sig);
+ kill (getpid (), sig);
+
+ /* After our old signal handler returns... */
+ set_termsig (sig, old_signal_handler); /* needless? */
+ terminal_prep_terminal ();
+ reset_info_window_sizes ();
+ }
+ break;
+#endif /* SIGWINCH || SIGUSR1 */
+ }
+#if !defined (HAVE_SIGACTION)
+ /* at this time it is safer to perform unblock after decrement */
+ term_conf_busy--;
+#if defined (HAVE_SIGPROCMASK) || defined (HAVE_SIGSETMASK)
+ {
+ sigset_t nvar, ovar;
+ sigemptyset (&nvar);
+ mask_termsig (&nvar);
+ sigprocmask (SIG_UNBLOCK, &nvar, &ovar);
+ }
+#endif /* HAVE_SIGPROCMASK || HAVE_SIGSETMASK */
+#endif /* !HAVE_SIGACTION */
+}
+/* vim: set sw=2 cino={1s>2sn-s^-se-s: */
diff --git a/Build/source/utils/texinfo/info/signals.h b/Build/source/utils/texinfo/info/signals.h
new file mode 100644
index 00000000000..2e3761e37b8
--- /dev/null
+++ b/Build/source/utils/texinfo/info/signals.h
@@ -0,0 +1,96 @@
+/* signals.h -- header to include system dependent signal definitions.
+ $Id: signals.h,v 1.2 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1994, 1995, 1997, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_SIGNALS_H
+#define INFO_SIGNALS_H
+
+#include <sys/types.h>
+#include <signal.h>
+
+/* For sysV68 --phdm@info.ucl.ac.be. */
+#if !defined (SIGCHLD) && defined (SIGCLD)
+#define SIGCHLD SIGCLD
+#endif
+
+#if !defined (HAVE_SIGPROCMASK) && !defined (sigmask)
+# define sigmask(x) (1 << ((x)-1))
+#endif /* !HAVE_SIGPROCMASK && !sigmask */
+
+/* Without SA_NOCLDSTOP, sigset_t might end up being undefined even
+ though we have sigprocmask, on older systems, according to Nelson
+ Beebe. The test is from coreutils/sort.c, via Paul Eggert. */
+#if !defined (HAVE_SIGPROCMASK) || !defined (SA_NOCLDSTOP)
+# if !defined (SIG_BLOCK)
+# define SIG_UNBLOCK 1
+# define SIG_BLOCK 2
+# define SIG_SETMASK 3
+# endif /* SIG_BLOCK */
+
+/* Type of a signal set. */
+# define sigset_t int
+
+/* Make SET have no signals in it. */
+# define sigemptyset(set) (*(set) = (sigset_t)0x0)
+
+/* Make SET have the full range of signal specifications possible. */
+# define sigfillset(set) (*(set) = (sigset_t)0xffffffffff)
+
+/* Add SIG to the contents of SET. */
+# define sigaddset(set, sig) *(set) |= sigmask (sig)
+
+/* Delete SIG from the contents of SET. */
+# define sigdelset(set, sig) *(set) &= ~(sigmask (sig))
+
+/* Tell if SET contains SIG. */
+# define sigismember(set, sig) (*(set) & (sigmask (sig)))
+
+/* Suspend the process until the reception of one of the signals
+ not present in SET. */
+# define sigsuspend(set) sigpause (*(set))
+#endif /* !HAVE_SIGPROCMASK */
+
+#if defined (HAVE_SIGPROCMASK) || defined (HAVE_SIGSETMASK)
+/* These definitions are used both in POSIX and non-POSIX implementations. */
+
+#define BLOCK_SIGNAL(sig) \
+ do { \
+ sigset_t nvar, ovar; \
+ sigemptyset (&nvar); \
+ sigemptyset (&ovar); \
+ sigaddset (&nvar, sig); \
+ sigprocmask (SIG_BLOCK, &nvar, &ovar); \
+ } while (0)
+
+#define UNBLOCK_SIGNAL(sig) \
+ do { \
+ sigset_t nvar, ovar; \
+ sigemptyset (&ovar); \
+ sigemptyset (&nvar); \
+ sigaddset (&nvar, sig); \
+ sigprocmask (SIG_UNBLOCK, &nvar, &ovar); \
+ } while (0)
+
+#else /* !HAVE_SIGPROCMASK && !HAVE_SIGSETMASK */
+# define BLOCK_SIGNAL(sig)
+# define UNBLOCK_SIGNAL(sig)
+#endif /* !HAVE_SIGPROCMASK && !HAVE_SIGSETMASK */
+
+#endif /* not INFO_SIGNALS_H */
diff --git a/Build/source/utils/texinfo/info/termdep.h b/Build/source/utils/texinfo/info/termdep.h
new file mode 100644
index 00000000000..45f38aca5b3
--- /dev/null
+++ b/Build/source/utils/texinfo/info/termdep.h
@@ -0,0 +1,59 @@
+/* termdep.h -- system things that terminal.c depends on.
+ $Id: termdep.h,v 1.2 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1996, 1997, 1998, 2001, 2002 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_TERMDEP_H
+#define INFO_TERMDEP_H
+
+/* NeXT supplies <termios.h> but it is broken. Probably Autoconf should
+ have a separate test, but anyway ... */
+#ifdef NeXT
+#undef HAVE_TERMIOS_H
+#endif
+
+#ifdef HAVE_TERMIOS_H
+# include <termios.h>
+#else
+# if defined (HAVE_TERMIO_H)
+# include <termio.h>
+# if defined (HAVE_SYS_PTEM_H)
+# if defined (M_UNIX) || !defined (M_XENIX)
+# include <sys/stream.h>
+# include <sys/ptem.h>
+# undef TIOCGETC
+# else /* M_XENIX */
+# define tchars tc
+# endif /* M_XENIX */
+# endif /* HAVE_SYS_PTEM_H */
+# else /* !HAVE_TERMIO_H */
+# include <sgtty.h>
+# endif /* !HAVE_TERMIO_H */
+#endif /* !HAVE_TERMIOS_H */
+
+#ifdef GWINSZ_IN_SYS_IOCTL
+# include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_SYS_TTOLD_H
+# include <sys/ttold.h>
+#endif /* HAVE_SYS_TTOLD_H */
+
+#endif /* not INFO_TERMDEP_H */
diff --git a/Build/source/utils/texinfo/info/terminal.c b/Build/source/utils/texinfo/info/terminal.c
new file mode 100644
index 00000000000..9238643d456
--- /dev/null
+++ b/Build/source/utils/texinfo/info/terminal.c
@@ -0,0 +1,873 @@
+/* terminal.c -- how to handle the physical terminal for Info.
+ $Id: terminal.c,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998,
+ 1999, 2001, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "terminal.h"
+#include "termdep.h"
+
+#include <sys/types.h>
+#include <signal.h>
+
+/* The Unix termcap interface code. */
+#ifdef HAVE_NCURSES_TERMCAP_H
+#include <ncurses/termcap.h>
+#else
+#ifdef HAVE_TERMCAP_H
+#include <termcap.h>
+#else
+/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.
+ Unfortunately, PC is a global variable used by the termcap library. */
+#undef PC
+
+/* Termcap requires these variables, whether we access them or not. */
+char *BC, *UP;
+char PC; /* Pad character */
+short ospeed; /* Terminal output baud rate */
+extern int tgetnum (), tgetflag (), tgetent ();
+extern char *tgetstr (), *tgoto ();
+extern void tputs ();
+#endif /* not HAVE_TERMCAP_H */
+#endif /* not HAVE_NCURSES_TERMCAP_H */
+
+/* Function "hooks". If you make one of these point to a function, that
+ function is called when appropriate instead of its namesake. Your
+ function is called with exactly the same arguments that were passed
+ to the namesake function. */
+VFunction *terminal_begin_inverse_hook = (VFunction *)NULL;
+VFunction *terminal_end_inverse_hook = (VFunction *)NULL;
+VFunction *terminal_prep_terminal_hook = (VFunction *)NULL;
+VFunction *terminal_unprep_terminal_hook = (VFunction *)NULL;
+VFunction *terminal_up_line_hook = (VFunction *)NULL;
+VFunction *terminal_down_line_hook = (VFunction *)NULL;
+VFunction *terminal_clear_screen_hook = (VFunction *)NULL;
+VFunction *terminal_clear_to_eol_hook = (VFunction *)NULL;
+VFunction *terminal_get_screen_size_hook = (VFunction *)NULL;
+VFunction *terminal_goto_xy_hook = (VFunction *)NULL;
+VFunction *terminal_initialize_terminal_hook = (VFunction *)NULL;
+VFunction *terminal_new_terminal_hook = (VFunction *)NULL;
+VFunction *terminal_put_text_hook = (VFunction *)NULL;
+VFunction *terminal_ring_bell_hook = (VFunction *)NULL;
+VFunction *terminal_write_chars_hook = (VFunction *)NULL;
+VFunction *terminal_scroll_terminal_hook = (VFunction *)NULL;
+
+/* **************************************************************** */
+/* */
+/* Terminal and Termcap */
+/* */
+/* **************************************************************** */
+
+/* A buffer which holds onto the current terminal description, and a pointer
+ used to float within it. And the name of the terminal. */
+static char *term_buffer = NULL;
+static char *term_string_buffer = NULL;
+static char *term_name;
+
+/* Some strings to control terminal actions. These are output by tputs (). */
+static char *term_goto, *term_clreol, *term_cr, *term_clrpag;
+static char *term_begin_use, *term_end_use;
+static char *term_AL, *term_DL, *term_al, *term_dl;
+
+static char *term_keypad_on, *term_keypad_off;
+
+/* How to go up a line. */
+static char *term_up;
+
+/* How to go down a line. */
+static char *term_dn;
+
+/* An audible bell, if the terminal can be made to make noise. */
+static char *audible_bell;
+
+/* A visible bell, if the terminal can be made to flash the screen. */
+static char *visible_bell;
+
+/* The string to write to turn on the meta key, if this term has one. */
+static char *term_mm;
+
+/* The string to turn on inverse mode, if this term has one. */
+static char *term_invbeg;
+
+/* The string to turn off inverse mode, if this term has one. */
+static char *term_invend;
+
+/* Although I can't find any documentation that says this is supposed to
+ return its argument, all the code I've looked at (termutils, less)
+ does so, so fine. */
+static int
+output_character_function (int c)
+{
+ putc (c, stdout);
+ return c;
+}
+
+/* Macro to send STRING to the terminal. */
+#define send_to_terminal(string) \
+ do { \
+ if (string) \
+ tputs (string, 1, output_character_function); \
+ } while (0)
+
+/* Tell the terminal that we will be doing cursor addressable motion. */
+static void
+terminal_begin_using_terminal (void)
+{
+ RETSIGTYPE (*sigsave) (int signum);
+
+ if (term_keypad_on)
+ send_to_terminal (term_keypad_on);
+
+ if (!term_begin_use || !*term_begin_use)
+ return;
+
+#ifdef SIGWINCH
+ sigsave = signal (SIGWINCH, SIG_IGN);
+#endif
+
+ send_to_terminal (term_begin_use);
+ fflush (stdout);
+ if (STREQ (term_name, "sun-cmd"))
+ /* Without this fflush and sleep, running info in a shelltool or
+ cmdtool (TERM=sun-cmd) with scrollbars loses -- the scrollbars are
+ not restored properly.
+ From: strube@physik3.gwdg.de (Hans Werner Strube). */
+ sleep (1);
+
+#ifdef SIGWINCH
+ signal (SIGWINCH, sigsave);
+#endif
+}
+
+/* Tell the terminal that we will not be doing any more cursor
+ addressable motion. */
+static void
+terminal_end_using_terminal (void)
+{
+ RETSIGTYPE (*sigsave) (int signum);
+
+ if (term_keypad_off)
+ send_to_terminal (term_keypad_off);
+
+ if (!term_end_use || !*term_end_use)
+ return;
+
+#ifdef SIGWINCH
+ sigsave = signal (SIGWINCH, SIG_IGN);
+#endif
+
+ send_to_terminal (term_end_use);
+ fflush (stdout);
+ if (STREQ (term_name, "sun-cmd"))
+ /* See comments at other sleep. */
+ sleep (1);
+
+#ifdef SIGWINCH
+ signal (SIGWINCH, sigsave);
+#endif
+}
+
+/* **************************************************************** */
+/* */
+/* Necessary Terminal Functions */
+/* */
+/* **************************************************************** */
+
+/* The functions and variables on this page implement the user visible
+ portion of the terminal interface. */
+
+/* The width and height of the terminal. */
+int screenwidth, screenheight;
+
+/* Non-zero means this terminal can't really do anything. */
+int terminal_is_dumb_p = 0;
+
+/* Non-zero means that this terminal has a meta key. */
+int terminal_has_meta_p = 0;
+
+/* Non-zero means that this terminal can produce a visible bell. */
+int terminal_has_visible_bell_p = 0;
+
+/* Non-zero means to use that visible bell if at all possible. */
+int terminal_use_visible_bell_p = 0;
+
+/* Non-zero means that the terminal can do scrolling. */
+int terminal_can_scroll = 0;
+
+/* The key sequences output by the arrow keys, if this terminal has any. */
+char *term_ku = NULL;
+char *term_kd = NULL;
+char *term_kr = NULL;
+char *term_kl = NULL;
+char *term_kP = NULL; /* page-up */
+char *term_kN = NULL; /* page-down */
+char *term_kh = NULL; /* home */
+char *term_ke = NULL; /* end */
+char *term_kD = NULL; /* delete */
+char *term_ki = NULL; /* ins */
+char *term_kx = NULL; /* del */
+
+/* Move the cursor to the terminal location of X and Y. */
+void
+terminal_goto_xy (int x, int y)
+{
+ if (terminal_goto_xy_hook)
+ (*terminal_goto_xy_hook) (x, y);
+ else
+ {
+ if (term_goto)
+ tputs (tgoto (term_goto, x, y), 1, output_character_function);
+ }
+}
+
+/* Print STRING to the terminal at the current position. */
+void
+terminal_put_text (char *string)
+{
+ if (terminal_put_text_hook)
+ (*terminal_put_text_hook) (string);
+ else
+ {
+ printf ("%s", string);
+ }
+}
+
+/* Print NCHARS from STRING to the terminal at the current position. */
+void
+terminal_write_chars (char *string, int nchars)
+{
+ if (terminal_write_chars_hook)
+ (*terminal_write_chars_hook) (string, nchars);
+ else
+ {
+ if (nchars)
+ fwrite (string, 1, nchars, stdout);
+ }
+}
+
+/* Clear from the current position of the cursor to the end of the line. */
+void
+terminal_clear_to_eol (void)
+{
+ if (terminal_clear_to_eol_hook)
+ (*terminal_clear_to_eol_hook) ();
+ else
+ {
+ send_to_terminal (term_clreol);
+ }
+}
+
+/* Clear the entire terminal screen. */
+void
+terminal_clear_screen (void)
+{
+ if (terminal_clear_screen_hook)
+ (*terminal_clear_screen_hook) ();
+ else
+ {
+ send_to_terminal (term_clrpag);
+ }
+}
+
+/* Move the cursor up one line. */
+void
+terminal_up_line (void)
+{
+ if (terminal_up_line_hook)
+ (*terminal_up_line_hook) ();
+ else
+ {
+ send_to_terminal (term_up);
+ }
+}
+
+/* Move the cursor down one line. */
+void
+terminal_down_line (void)
+{
+ if (terminal_down_line_hook)
+ (*terminal_down_line_hook) ();
+ else
+ {
+ send_to_terminal (term_dn);
+ }
+}
+
+/* Turn on reverse video if possible. */
+void
+terminal_begin_inverse (void)
+{
+ if (terminal_begin_inverse_hook)
+ (*terminal_begin_inverse_hook) ();
+ else
+ {
+ send_to_terminal (term_invbeg);
+ }
+}
+
+/* Turn off reverse video if possible. */
+void
+terminal_end_inverse (void)
+{
+ if (terminal_end_inverse_hook)
+ (*terminal_end_inverse_hook) ();
+ else
+ {
+ send_to_terminal (term_invend);
+ }
+}
+
+/* Ring the terminal bell. The bell is run visibly if it both has one and
+ terminal_use_visible_bell_p is non-zero. */
+void
+terminal_ring_bell (void)
+{
+ if (terminal_ring_bell_hook)
+ (*terminal_ring_bell_hook) ();
+ else
+ {
+ if (terminal_has_visible_bell_p && terminal_use_visible_bell_p)
+ send_to_terminal (visible_bell);
+ else
+ send_to_terminal (audible_bell);
+ }
+}
+
+/* At the line START, delete COUNT lines from the terminal display. */
+static void
+terminal_delete_lines (int start, int count)
+{
+ int lines;
+
+ /* Normalize arguments. */
+ if (start < 0)
+ start = 0;
+
+ lines = screenheight - start;
+ terminal_goto_xy (0, start);
+ if (term_DL)
+ tputs (tgoto (term_DL, 0, count), lines, output_character_function);
+ else
+ {
+ while (count--)
+ tputs (term_dl, lines, output_character_function);
+ }
+
+ fflush (stdout);
+}
+
+/* At the line START, insert COUNT lines in the terminal display. */
+static void
+terminal_insert_lines (int start, int count)
+{
+ int lines;
+
+ /* Normalize arguments. */
+ if (start < 0)
+ start = 0;
+
+ lines = screenheight - start;
+ terminal_goto_xy (0, start);
+
+ if (term_AL)
+ tputs (tgoto (term_AL, 0, count), lines, output_character_function);
+ else
+ {
+ while (count--)
+ tputs (term_al, lines, output_character_function);
+ }
+
+ fflush (stdout);
+}
+
+/* Scroll an area of the terminal, starting with the region from START
+ to END, AMOUNT lines. If AMOUNT is negative, the lines are scrolled
+ towards the top of the screen, else they are scrolled towards the
+ bottom of the screen. */
+void
+terminal_scroll_terminal (int start, int end, int amount)
+{
+ if (!terminal_can_scroll)
+ return;
+
+ /* Any scrolling at all? */
+ if (amount == 0)
+ return;
+
+ if (terminal_scroll_terminal_hook)
+ (*terminal_scroll_terminal_hook) (start, end, amount);
+ else
+ {
+ /* If we are scrolling down, delete AMOUNT lines at END. Then insert
+ AMOUNT lines at START. */
+ if (amount > 0)
+ {
+ terminal_delete_lines (end, amount);
+ terminal_insert_lines (start, amount);
+ }
+
+ /* If we are scrolling up, delete AMOUNT lines before START. This
+ actually does the upwards scroll. Then, insert AMOUNT lines
+ after the already scrolled region (i.e., END - AMOUNT). */
+ if (amount < 0)
+ {
+ int abs_amount = -amount;
+ terminal_delete_lines (start - abs_amount, abs_amount);
+ terminal_insert_lines (end - abs_amount, abs_amount);
+ }
+ }
+}
+
+/* Re-initialize the terminal considering that the TERM/TERMCAP variable
+ has changed. */
+void
+terminal_new_terminal (char *terminal_name)
+{
+ if (terminal_new_terminal_hook)
+ (*terminal_new_terminal_hook) (terminal_name);
+ else
+ {
+ terminal_initialize_terminal (terminal_name);
+ }
+}
+
+/* Set the global variables SCREENWIDTH and SCREENHEIGHT. */
+void
+terminal_get_screen_size (void)
+{
+ if (terminal_get_screen_size_hook)
+ (*terminal_get_screen_size_hook) ();
+ else
+ {
+ screenwidth = screenheight = 0;
+
+#if defined (TIOCGWINSZ)
+ {
+ struct winsize window_size;
+
+ if (ioctl (fileno (stdout), TIOCGWINSZ, &window_size) == 0)
+ {
+ screenwidth = (int) window_size.ws_col;
+ screenheight = (int) window_size.ws_row;
+ }
+ }
+#endif /* TIOCGWINSZ */
+
+ /* Environment variable COLUMNS overrides setting of "co". */
+ if (screenwidth <= 0)
+ {
+ char *sw = getenv ("COLUMNS");
+
+ if (sw)
+ screenwidth = atoi (sw);
+
+ if (screenwidth <= 0)
+ screenwidth = tgetnum ("co");
+ }
+
+ /* Environment variable LINES overrides setting of "li". */
+ if (screenheight <= 0)
+ {
+ char *sh = getenv ("LINES");
+
+ if (sh)
+ screenheight = atoi (sh);
+
+ if (screenheight <= 0)
+ screenheight = tgetnum ("li");
+ }
+
+ /* If all else fails, default to 80x24 terminal. */
+ if (screenwidth <= 0)
+ screenwidth = 80;
+
+ if (screenheight <= 0)
+ screenheight = 24;
+ }
+}
+
+/* Initialize the terminal which is known as TERMINAL_NAME. If this
+ terminal doesn't have cursor addressability, `terminal_is_dumb_p'
+ becomes nonzero. The variables SCREENHEIGHT and SCREENWIDTH are set
+ to the dimensions that this terminal actually has. The variable
+ TERMINAL_HAS_META_P becomes nonzero if this terminal supports a Meta
+ key. Finally, the terminal screen is cleared. */
+void
+terminal_initialize_terminal (char *terminal_name)
+{
+ char *buffer;
+
+ terminal_is_dumb_p = 0;
+
+ if (terminal_initialize_terminal_hook)
+ {
+ (*terminal_initialize_terminal_hook) (terminal_name);
+ return;
+ }
+
+ term_name = terminal_name ? terminal_name : getenv ("TERM");
+ if (!term_name)
+ term_name = "dumb";
+
+ if (!term_string_buffer)
+ term_string_buffer = xmalloc (2048);
+
+ if (!term_buffer)
+ term_buffer = xmalloc (2048);
+
+ buffer = term_string_buffer;
+
+ term_clrpag = term_cr = term_clreol = NULL;
+
+ /* HP-UX 11.x returns 0 for OK --jeff.hull@state.co.us. */
+ if (tgetent (term_buffer, term_name) < 0)
+ {
+ terminal_is_dumb_p = 1;
+ screenwidth = 80;
+ screenheight = 24;
+ term_cr = "\r";
+ term_up = term_dn = audible_bell = visible_bell = NULL;
+ term_ku = term_kd = term_kl = term_kr = NULL;
+ term_kP = term_kN = NULL;
+ term_kh = term_ke = NULL;
+ term_kD = NULL;
+ return;
+ }
+
+ BC = tgetstr ("pc", &buffer);
+ PC = BC ? *BC : 0;
+
+#if defined (HAVE_TERMIOS_H)
+ {
+ struct termios ti;
+ if (tcgetattr (fileno(stdout), &ti) != -1)
+ ospeed = cfgetospeed (&ti);
+ else
+ ospeed = B9600;
+ }
+#else
+# if defined (TIOCGETP)
+ {
+ struct sgttyb sg;
+
+ if (ioctl (fileno (stdout), TIOCGETP, &sg) != -1)
+ ospeed = sg.sg_ospeed;
+ else
+ ospeed = B9600;
+ }
+# else
+ ospeed = B9600;
+# endif /* !TIOCGETP */
+#endif
+
+ term_cr = tgetstr ("cr", &buffer);
+ term_clreol = tgetstr ("ce", &buffer);
+ term_clrpag = tgetstr ("cl", &buffer);
+ term_goto = tgetstr ("cm", &buffer);
+
+ /* Find out about this terminal's scrolling capability. */
+ term_AL = tgetstr ("AL", &buffer);
+ term_DL = tgetstr ("DL", &buffer);
+ term_al = tgetstr ("al", &buffer);
+ term_dl = tgetstr ("dl", &buffer);
+
+ terminal_can_scroll = ((term_AL || term_al) && (term_DL || term_dl));
+
+ term_invbeg = tgetstr ("mr", &buffer);
+ if (term_invbeg)
+ term_invend = tgetstr ("me", &buffer);
+ else
+ term_invend = NULL;
+
+ if (!term_cr)
+ term_cr = "\r";
+
+ terminal_get_screen_size ();
+
+ term_up = tgetstr ("up", &buffer);
+ term_dn = tgetstr ("dn", &buffer);
+ visible_bell = tgetstr ("vb", &buffer);
+ terminal_has_visible_bell_p = (visible_bell != NULL);
+ audible_bell = tgetstr ("bl", &buffer);
+ if (!audible_bell)
+ audible_bell = "\007";
+ term_begin_use = tgetstr ("ti", &buffer);
+ term_end_use = tgetstr ("te", &buffer);
+
+ term_keypad_on = tgetstr ("ks", &buffer);
+ term_keypad_off = tgetstr ("ke", &buffer);
+
+ /* Check to see if this terminal has a meta key. */
+ terminal_has_meta_p = (tgetflag ("km") || tgetflag ("MT"));
+ if (terminal_has_meta_p)
+ {
+ term_mm = tgetstr ("mm", &buffer);
+ }
+ else
+ {
+ term_mm = NULL;
+ }
+
+ /* Attempt to find the arrow keys. */
+ term_ku = tgetstr ("ku", &buffer);
+ term_kd = tgetstr ("kd", &buffer);
+ term_kr = tgetstr ("kr", &buffer);
+ term_kl = tgetstr ("kl", &buffer);
+
+ term_kP = tgetstr ("kP", &buffer);
+ term_kN = tgetstr ("kN", &buffer);
+
+#if defined(INFOKEY)
+ term_kh = tgetstr ("kh", &buffer);
+ term_ke = tgetstr ("@7", &buffer);
+ term_ki = tgetstr ("kI", &buffer);
+ term_kx = tgetstr ("kD", &buffer);
+#endif /* defined(INFOKEY) */
+
+ /* Home and end keys. */
+ term_kh = tgetstr ("kh", &buffer);
+ term_ke = tgetstr ("@7", &buffer);
+
+ term_kD = tgetstr ("kD", &buffer);
+
+ /* If this terminal is not cursor addressable, then it is really dumb. */
+ if (!term_goto)
+ terminal_is_dumb_p = 1;
+}
+
+/* How to read characters from the terminal. */
+
+#if defined (HAVE_TERMIOS_H)
+struct termios original_termios, ttybuff;
+#else
+# if defined (HAVE_TERMIO_H)
+/* A buffer containing the terminal mode flags upon entry to info. */
+struct termio original_termio, ttybuff;
+# else /* !HAVE_TERMIO_H */
+/* Buffers containing the terminal mode flags upon entry to info. */
+int original_tty_flags = 0;
+int original_lmode;
+struct sgttyb ttybuff;
+
+# if defined(TIOCGETC) && defined(M_XENIX)
+/* SCO 3.2v5.0.2 defines but does not support TIOCGETC. Gak. Maybe
+ better fix would be to use Posix termios in preference. --gildea,
+ 1jul99. */
+# undef TIOCGETC
+# endif
+
+# if defined (TIOCGETC)
+/* A buffer containing the terminal interrupt characters upon entry
+ to Info. */
+struct tchars original_tchars;
+# endif
+
+# if defined (TIOCGLTC)
+/* A buffer containing the local terminal mode characters upon entry
+ to Info. */
+struct ltchars original_ltchars;
+# endif
+# endif /* !HAVE_TERMIO_H */
+#endif /* !HAVE_TERMIOS_H */
+
+/* Prepare to start using the terminal to read characters singly. */
+void
+terminal_prep_terminal (void)
+{
+ int tty;
+
+ if (terminal_prep_terminal_hook)
+ {
+ (*terminal_prep_terminal_hook) ();
+ return;
+ }
+
+ terminal_begin_using_terminal ();
+
+ tty = fileno (stdin);
+
+#if defined (HAVE_TERMIOS_H)
+ tcgetattr (tty, &original_termios);
+ tcgetattr (tty, &ttybuff);
+#else
+# if defined (HAVE_TERMIO_H)
+ ioctl (tty, TCGETA, &original_termio);
+ ioctl (tty, TCGETA, &ttybuff);
+# endif
+#endif
+
+#if defined (HAVE_TERMIOS_H) || defined (HAVE_TERMIO_H)
+ ttybuff.c_iflag &= (~ISTRIP & ~INLCR & ~IGNCR & ~ICRNL & ~IXON);
+/* These output flags are not part of POSIX, so only use them if they
+ are defined. */
+#ifdef ONLCR
+ ttybuff.c_oflag &= ~ONLCR ;
+#endif
+#ifdef OCRNL
+ ttybuff.c_oflag &= ~OCRNL;
+#endif
+ ttybuff.c_lflag &= (~ICANON & ~ECHO);
+
+ ttybuff.c_cc[VMIN] = 1;
+ ttybuff.c_cc[VTIME] = 0;
+
+ if (ttybuff.c_cc[VINTR] == '\177')
+ ttybuff.c_cc[VINTR] = -1;
+
+ if (ttybuff.c_cc[VQUIT] == '\177')
+ ttybuff.c_cc[VQUIT] = -1;
+
+#ifdef VLNEXT
+ if (ttybuff.c_cc[VLNEXT] == '\026')
+ ttybuff.c_cc[VLNEXT] = -1;
+#endif /* VLNEXT */
+#endif /* TERMIOS or TERMIO */
+
+/* cf. emacs/src/sysdep.c for being sure output is on. */
+#if defined (HAVE_TERMIOS_H)
+ /* linux kernel 2.2.x needs a TCOFF followed by a TCOON to turn output
+ back on if the user presses ^S at the very beginning; just a TCOON
+ doesn't work. --Kevin Ryde <user42@zip.com.au>, 16jun2000. */
+ tcsetattr (tty, TCSANOW, &ttybuff);
+# ifdef TCOON
+ tcflow (tty, TCOOFF);
+ tcflow (tty, TCOON);
+# endif
+#else
+# if defined (HAVE_TERMIO_H)
+ ioctl (tty, TCSETA, &ttybuff);
+# ifdef TCXONC
+ ioctl (tty, TCXONC, 1);
+# endif
+# endif
+#endif
+
+#if !defined (HAVE_TERMIOS_H) && !defined (HAVE_TERMIO_H)
+ ioctl (tty, TIOCGETP, &ttybuff);
+
+ if (!original_tty_flags)
+ original_tty_flags = ttybuff.sg_flags;
+
+ /* Make this terminal pass 8 bits around while we are using it. */
+# if defined (PASS8)
+ ttybuff.sg_flags |= PASS8;
+# endif /* PASS8 */
+
+# if defined (TIOCLGET) && defined (LPASS8)
+ {
+ int flags;
+ ioctl (tty, TIOCLGET, &flags);
+ original_lmode = flags;
+ flags |= LPASS8;
+ ioctl (tty, TIOCLSET, &flags);
+ }
+# endif /* TIOCLGET && LPASS8 */
+
+# if defined (TIOCGETC)
+ {
+ struct tchars temp;
+
+ ioctl (tty, TIOCGETC, &original_tchars);
+ temp = original_tchars;
+
+ /* C-s and C-q. */
+ temp.t_startc = temp.t_stopc = -1;
+
+ /* Often set to C-d. */
+ temp.t_eofc = -1;
+
+ /* If the a quit or interrupt character conflicts with one of our
+ commands, then make it go away. */
+ if (temp.t_intrc == '\177')
+ temp.t_intrc = -1;
+
+ if (temp.t_quitc == '\177')
+ temp.t_quitc = -1;
+
+ ioctl (tty, TIOCSETC, &temp);
+ }
+# endif /* TIOCGETC */
+
+# if defined (TIOCGLTC)
+ {
+ struct ltchars temp;
+
+ ioctl (tty, TIOCGLTC, &original_ltchars);
+ temp = original_ltchars;
+
+ /* Make the interrupt keys go away. Just enough to make people happy. */
+ temp.t_lnextc = -1; /* C-v. */
+ temp.t_dsuspc = -1; /* C-y. */
+ temp.t_flushc = -1; /* C-o. */
+ ioctl (tty, TIOCSLTC, &temp);
+ }
+# endif /* TIOCGLTC */
+
+ ttybuff.sg_flags &= ~ECHO;
+ ttybuff.sg_flags |= CBREAK;
+ ioctl (tty, TIOCSETN, &ttybuff);
+#endif /* !HAVE_TERMIOS_H && !HAVE_TERMIO_H */
+}
+
+/* Restore the tty settings back to what they were before we started using
+ this terminal. */
+void
+terminal_unprep_terminal (void)
+{
+ int tty;
+
+ if (terminal_unprep_terminal_hook)
+ {
+ (*terminal_unprep_terminal_hook) ();
+ return;
+ }
+
+ tty = fileno (stdin);
+
+#if defined (HAVE_TERMIOS_H)
+ tcsetattr (tty, TCSANOW, &original_termios);
+#else
+# if defined (HAVE_TERMIO_H)
+ ioctl (tty, TCSETA, &original_termio);
+# else /* !HAVE_TERMIO_H */
+ ioctl (tty, TIOCGETP, &ttybuff);
+ ttybuff.sg_flags = original_tty_flags;
+ ioctl (tty, TIOCSETN, &ttybuff);
+
+# if defined (TIOCGETC)
+ ioctl (tty, TIOCSETC, &original_tchars);
+# endif /* TIOCGETC */
+
+# if defined (TIOCGLTC)
+ ioctl (tty, TIOCSLTC, &original_ltchars);
+# endif /* TIOCGLTC */
+
+# if defined (TIOCLGET) && defined (LPASS8)
+ ioctl (tty, TIOCLSET, &original_lmode);
+# endif /* TIOCLGET && LPASS8 */
+
+# endif /* !HAVE_TERMIO_H */
+#endif /* !HAVE_TERMIOS_H */
+ terminal_end_using_terminal ();
+}
+
+#ifdef __MSDOS__
+# include "pcterm.c"
+#endif
diff --git a/Build/source/utils/texinfo/info/terminal.h b/Build/source/utils/texinfo/info/terminal.h
new file mode 100644
index 00000000000..dbf6b496ff8
--- /dev/null
+++ b/Build/source/utils/texinfo/info/terminal.h
@@ -0,0 +1,130 @@
+/* terminal.h -- The external interface to terminal I/O.
+ $Id: terminal.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1996, 1997, 2001, 2002, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#if !defined (TERMINAL_H)
+#define TERMINAL_H
+
+#include "info.h"
+
+/* For almost every function externally visible from terminal.c, there is
+ a corresponding "hook" function which can be bound in order to replace
+ the functionality of the one found in terminal.c. This is how we go
+ about implemented X window display. */
+
+/* The width and height of the terminal. */
+extern int screenwidth, screenheight;
+
+/* Non-zero means this terminal can't really do anything. */
+extern int terminal_is_dumb_p;
+
+/* Non-zero means that this terminal has a meta key. */
+extern int terminal_has_meta_p;
+
+/* Non-zero means that this terminal can produce a visible bell. */
+extern int terminal_has_visible_bell_p;
+
+/* Non-zero means to use that visible bell if at all possible. */
+extern int terminal_use_visible_bell_p;
+
+/* Non-zero means that this terminal can scroll lines up and down. */
+extern int terminal_can_scroll;
+
+/* Initialize the terminal which is known as TERMINAL_NAME. If this terminal
+ doesn't have cursor addressability, TERMINAL_IS_DUMB_P becomes non-zero.
+ The variables SCREENHEIGHT and SCREENWIDTH are set to the dimensions that
+ this terminal actually has. The variable TERMINAL_HAS_META_P becomes non-
+ zero if this terminal supports a Meta key. */
+extern void terminal_initialize_terminal (char *terminal_name);
+extern VFunction *terminal_initialize_terminal_hook;
+
+/* Return the current screen width and height in the variables
+ SCREENWIDTH and SCREENHEIGHT. */
+extern void terminal_get_screen_size (void);
+extern VFunction *terminal_get_screen_size_hook;
+
+/* Save and restore tty settings. */
+extern void terminal_prep_terminal (void);
+extern void terminal_unprep_terminal (void);
+
+extern VFunction *terminal_prep_terminal_hook;
+extern VFunction *terminal_unprep_terminal_hook;
+
+/* Re-initialize the terminal to TERMINAL_NAME. */
+extern void terminal_new_terminal (char *terminal_name);
+extern VFunction *terminal_new_terminal_hook;
+
+/* Move the cursor to the terminal location of X and Y. */
+extern void terminal_goto_xy (int x, int y);
+extern VFunction *terminal_goto_xy_hook;
+
+/* Print STRING to the terminal at the current position. */
+extern void terminal_put_text (char *string);
+extern VFunction *terminal_put_text_hook;
+
+/* Print NCHARS from STRING to the terminal at the current position. */
+extern void terminal_write_chars (char *string, int nchars);
+extern VFunction *terminal_write_chars_hook;
+
+/* Clear from the current position of the cursor to the end of the line. */
+extern void terminal_clear_to_eol (void);
+extern VFunction *terminal_clear_to_eol_hook;
+
+/* Clear the entire terminal screen. */
+extern void terminal_clear_screen (void);
+extern VFunction *terminal_clear_screen_hook;
+
+/* Move the cursor up one line. */
+extern void terminal_up_line (void);
+extern VFunction *terminal_up_line_hook;
+
+/* Move the cursor down one line. */
+extern void terminal_down_line (void);
+extern VFunction *terminal_down_line_hook;
+
+/* Turn on reverse video if possible. */
+extern void terminal_begin_inverse (void);
+extern VFunction *terminal_begin_inverse_hook;
+
+/* Turn off reverse video if possible. */
+extern void terminal_end_inverse (void);
+extern VFunction *terminal_end_inverse_hook;
+
+/* Scroll an area of the terminal, starting with the region from START
+ to END, AMOUNT lines. If AMOUNT is negative, the lines are scrolled
+ towards the top of the screen, else they are scrolled towards the
+ bottom of the screen. */
+extern void terminal_scroll_terminal (int start, int end, int amount);
+extern VFunction *terminal_scroll_terminal_hook;
+
+/* Ring the terminal bell. The bell is run visibly if it both has one and
+ terminal_use_visible_bell_p is non-zero. */
+extern void terminal_ring_bell (void);
+extern VFunction *terminal_ring_bell_hook;
+
+/* The key sequences output by special keys, if this terminal has any. */
+extern char *term_ku, *term_kd, *term_kr, *term_kl;
+extern char *term_kP, *term_kN;
+extern char *term_ke, *term_kh;
+extern char *term_kx, *term_ki;
+extern char *term_kD;
+
+#endif /* !TERMINAL_H */
diff --git a/Build/source/utils/texinfo/info/tilde.c b/Build/source/utils/texinfo/info/tilde.c
new file mode 100644
index 00000000000..ac32abd040a
--- /dev/null
+++ b/Build/source/utils/texinfo/info/tilde.c
@@ -0,0 +1,342 @@
+/* tilde.c -- tilde expansion code (~/foo := $HOME/foo).
+ $Id: tilde.c,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1996, 1998, 1999,
+ 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+/* Include config.h before doing alloca. */
+#include "info.h"
+#include "tilde.h"
+
+#if defined (TEST) || defined (STATIC_MALLOC)
+static void *xmalloc (), *xrealloc ();
+#endif /* TEST || STATIC_MALLOC */
+
+/* The default value of tilde_additional_prefixes. This is set to
+ whitespace preceding a tilde so that simple programs which do not
+ perform any word separation get desired behaviour. */
+static char *default_prefixes[] =
+ { " ~", "\t~", (char *)NULL };
+
+/* The default value of tilde_additional_suffixes. This is set to
+ whitespace or newline so that simple programs which do not
+ perform any word separation get desired behaviour. */
+static char *default_suffixes[] =
+ { " ", "\n", (char *)NULL };
+
+/* If non-null, this contains the address of a function to call if the
+ standard meaning for expanding a tilde fails. The function is called
+ with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if there is no expansion. */
+CFunction *tilde_expansion_failure_hook = (CFunction *)NULL;
+
+/* When non-null, this is a NULL terminated array of strings which
+ are duplicates for a tilde prefix. Bash uses this to expand
+ `=~' and `:~'. */
+char **tilde_additional_prefixes = default_prefixes;
+
+/* When non-null, this is a NULL terminated array of strings which match
+ the end of a username, instead of just "/". Bash sets this to
+ `:' and `=~'. */
+char **tilde_additional_suffixes = default_suffixes;
+
+/* Find the start of a tilde expansion in STRING, and return the index of
+ the tilde which starts the expansion. Place the length of the text
+ which identified this tilde starter in LEN, excluding the tilde itself. */
+static int
+tilde_find_prefix (char *string, int *len)
+{
+ register int i, j, string_len;
+ register char **prefixes = tilde_additional_prefixes;
+
+ string_len = strlen (string);
+ *len = 0;
+
+ if (!*string || *string == '~')
+ return (0);
+
+ if (prefixes)
+ {
+ for (i = 0; i < string_len; i++)
+ {
+ for (j = 0; prefixes[j]; j++)
+ {
+ if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0)
+ {
+ *len = strlen (prefixes[j]) - 1;
+ return (i + *len);
+ }
+ }
+ }
+ }
+ return (string_len);
+}
+
+/* Find the end of a tilde expansion in STRING, and return the index of
+ the character which ends the tilde definition. */
+static int
+tilde_find_suffix (char *string)
+{
+ register int i, j, string_len;
+ register char **suffixes = tilde_additional_suffixes;
+
+ string_len = strlen (string);
+
+ for (i = 0; i < string_len; i++)
+ {
+ if (IS_SLASH (string[i]) || !string[i])
+ break;
+
+ for (j = 0; suffixes && suffixes[j]; j++)
+ {
+ if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0)
+ return (i);
+ }
+ }
+ return (i);
+}
+
+/* Return a new string which is the result of tilde expanding STRING. */
+char *
+tilde_expand (char *string)
+{
+ char *result;
+ int result_size, result_index;
+
+ result_size = result_index = 0;
+ result = (char *)NULL;
+
+ /* Scan through STRING expanding tildes as we come to them. */
+ while (1)
+ {
+ register int start, end;
+ char *tilde_word, *expansion;
+ int len;
+
+ /* Make START point to the tilde which starts the expansion. */
+ start = tilde_find_prefix (string, &len);
+
+ /* Copy the skipped text into the result. */
+ if ((result_index + start + 1) > result_size)
+ result = (char *)xrealloc (result, 1 + (result_size += (start + 20)));
+
+ strncpy (result + result_index, string, start);
+ result_index += start;
+
+ /* Advance STRING to the starting tilde. */
+ string += start;
+
+ /* Make END be the index of one after the last character of the
+ username. */
+ end = tilde_find_suffix (string);
+
+ /* If both START and END are zero, we are all done. */
+ if (!start && !end)
+ break;
+
+ /* Expand the entire tilde word, and copy it into RESULT. */
+ tilde_word = (char *)xmalloc (1 + end);
+ strncpy (tilde_word, string, end);
+ tilde_word[end] = '\0';
+ string += end;
+
+ expansion = tilde_expand_word (tilde_word);
+ free (tilde_word);
+
+ len = strlen (expansion);
+ if ((result_index + len + 1) > result_size)
+ result = (char *)xrealloc (result, 1 + (result_size += (len + 20)));
+
+ strcpy (result + result_index, expansion);
+ result_index += len;
+ free (expansion);
+ }
+
+ result[result_index] = '\0';
+
+ return (result);
+}
+
+/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
+ tilde. If there is no expansion, call tilde_expansion_failure_hook. */
+char *
+tilde_expand_word (char *filename)
+{
+ char *dirname = filename ? xstrdup (filename) : NULL;
+
+ if (dirname && *dirname == '~')
+ {
+ char *temp_name;
+ if (!dirname[1] || IS_SLASH (dirname[1]))
+ {
+ /* Prepend $HOME to the rest of the string. */
+ char *temp_home = getenv ("HOME");
+
+ /* If there is no HOME variable, look up the directory in
+ the password database. */
+ if (!temp_home)
+ {
+ struct passwd *entry;
+
+ entry = (struct passwd *) getpwuid (getuid ());
+ if (entry)
+ temp_home = entry->pw_dir;
+ }
+
+ temp_name = xmalloc (1 + strlen (&dirname[1])
+ + (temp_home ? strlen (temp_home) : 0));
+ if (temp_home)
+ strcpy (temp_name, temp_home);
+ else
+ temp_name[0] = 0;
+ strcat (temp_name, &dirname[1]);
+ free (dirname);
+ dirname = xstrdup (temp_name);
+ free (temp_name);
+ }
+ else
+ {
+ struct passwd *user_entry;
+ char *username = xmalloc (257);
+ int i, c;
+
+ for (i = 1; (c = dirname[i]); i++)
+ {
+ if (IS_SLASH (c))
+ break;
+ else
+ username[i - 1] = c;
+ }
+ username[i - 1] = 0;
+
+ if (!(user_entry = (struct passwd *) getpwnam (username)))
+ {
+ /* If the calling program has a special syntax for
+ expanding tildes, and we couldn't find a standard
+ expansion, then let them try. */
+ if (tilde_expansion_failure_hook)
+ {
+ char *expansion = (*tilde_expansion_failure_hook) (username);
+
+ if (expansion)
+ {
+ temp_name = xmalloc (1 + strlen (expansion)
+ + strlen (&dirname[i]));
+ strcpy (temp_name, expansion);
+ strcat (temp_name, &dirname[i]);
+ free (expansion);
+ goto return_name;
+ }
+ }
+ /* We shouldn't report errors. */
+ }
+ else
+ {
+ temp_name = xmalloc (1 + strlen (user_entry->pw_dir)
+ + strlen (&dirname[i]));
+ strcpy (temp_name, user_entry->pw_dir);
+ strcat (temp_name, &dirname[i]);
+
+ return_name:
+ free (dirname);
+ dirname = xstrdup (temp_name);
+ free (temp_name);
+ }
+
+ endpwent ();
+ free (username);
+ }
+ }
+ return dirname;
+}
+
+
+#if defined (TEST)
+#undef NULL
+#include <stdio.h>
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *result, line[512];
+ int done = 0;
+
+ while (!done)
+ {
+ printf ("~expand: ");
+ fflush (stdout);
+
+ if (!gets (line))
+ strcpy (line, "done");
+
+ if ((strcmp (line, "done") == 0) ||
+ (strcmp (line, "quit") == 0) ||
+ (strcmp (line, "exit") == 0))
+ {
+ done = 1;
+ break;
+ }
+
+ result = tilde_expand (line);
+ printf (" --> %s\n", result);
+ free (result);
+ }
+ xexit (0);
+}
+
+static void memory_error_and_abort ();
+
+static void *
+xmalloc (bytes)
+ int bytes;
+{
+ void *temp = (void *)malloc (bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+ return (temp);
+}
+
+static void *
+xrealloc (pointer, bytes)
+ void *pointer;
+ int bytes;
+{
+ void *temp;
+
+ if (!pointer)
+ temp = (char *)malloc (bytes);
+ else
+ temp = (char *)realloc (pointer, bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+
+ return (temp);
+}
+
+static void
+memory_error_and_abort ()
+{
+ fprintf (stderr, _("readline: Out of virtual memory!\n"));
+ abort ();
+}
+#endif /* TEST */
+
diff --git a/Build/source/utils/texinfo/info/tilde.h b/Build/source/utils/texinfo/info/tilde.h
new file mode 100644
index 00000000000..b499f3efea2
--- /dev/null
+++ b/Build/source/utils/texinfo/info/tilde.h
@@ -0,0 +1,54 @@
+/* tilde.h: Externally available variables and function in libtilde.a.
+ $Id: tilde.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ This file has appeared in prior works by the Free Software Foundation;
+ thus it carries copyright dates from 1988 through 1993.
+
+ Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef TILDE_H
+#define TILDE_H
+
+#include "info.h"
+
+/* If non-null, this contains the address of a function to call if the
+ standard meaning for expanding a tilde fails. The function is called
+ with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if there is no expansion. */
+extern CFunction *tilde_expansion_failure_hook;
+
+/* When non-null, this is a NULL terminated array of strings which
+ are duplicates for a tilde prefix. Bash uses this to expand
+ `=~' and `:~'. */
+extern char **tilde_additional_prefixes;
+
+/* When non-null, this is a NULL terminated array of strings which match
+ the end of a username, instead of just "/". Bash sets this to
+ `:' and `=~'. */
+extern char **tilde_additional_suffixes;
+
+/* Return a new string which is the result of tilde expanding STRING. */
+extern char *tilde_expand (char *string);
+
+/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
+ tilde. If there is no expansion, call tilde_expansion_failure_hook. */
+extern char *tilde_expand_word (char *filename);
+
+#endif /* not TILDE_H */
diff --git a/Build/source/utils/texinfo/info/variables.c b/Build/source/utils/texinfo/info/variables.c
new file mode 100644
index 00000000000..3636801a49b
--- /dev/null
+++ b/Build/source/utils/texinfo/info/variables.c
@@ -0,0 +1,305 @@
+/* variables.c -- how to manipulate user visible variables in Info.
+ $Id: variables.c,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 2001, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "variables.h"
+
+/* **************************************************************** */
+/* */
+/* User Visible Variables in Info */
+/* */
+/* **************************************************************** */
+
+/* Choices used by the completer when reading a zero/non-zero value for
+ a variable. */
+static char *on_off_choices[] = { "Off", "On", (char *)NULL };
+
+VARIABLE_ALIST info_variables[] = {
+ { "automatic-footnotes",
+ N_("When \"On\", footnotes appear and disappear automatically"),
+ &auto_footnotes_p, (char **)on_off_choices },
+
+ { "automatic-tiling",
+ N_("When \"On\", creating or deleting a window resizes other windows"),
+ &auto_tiling_p, (char **)on_off_choices },
+
+ { "visible-bell",
+ N_("When \"On\", flash the screen instead of ringing the bell"),
+ &terminal_use_visible_bell_p, (char **)on_off_choices },
+
+ { "errors-ring-bell",
+ N_("When \"On\", errors cause the bell to ring"),
+ &info_error_rings_bell_p, (char **)on_off_choices },
+
+ { "gc-compressed-files",
+ N_("When \"On\", Info garbage collects files which had to be uncompressed"),
+ &gc_compressed_files, (char **)on_off_choices },
+ { "show-index-match",
+ N_("When \"On\", the portion of the matched search string is highlighted"),
+ &show_index_match, (char **)on_off_choices },
+
+ { "scroll-behaviour",
+ N_("Controls what happens when scrolling is requested at the end of a node"),
+ &info_scroll_behaviour, (char **)info_scroll_choices },
+
+ { "scroll-step",
+ N_("The number lines to scroll when the cursor moves out of the window"),
+ &window_scroll_step, (char **)NULL },
+
+ { "ISO-Latin",
+ N_("When \"On\", Info accepts and displays ISO Latin characters"),
+ &ISO_Latin_p, (char **)on_off_choices },
+
+ { (char *)NULL, (char *)NULL, (int *)NULL, (char **)NULL }
+};
+
+DECLARE_INFO_COMMAND (describe_variable, _("Explain the use of a variable"))
+{
+ VARIABLE_ALIST *var;
+ char *description;
+
+ /* Get the variable's name. */
+ var = read_variable_name ((char *) _("Describe variable: "), window);
+
+ if (!var)
+ return;
+
+ description = (char *)xmalloc (20 + strlen (var->name)
+ + strlen (_(var->doc)));
+
+ if (var->choices)
+ sprintf (description, "%s (%s): %s.",
+ var->name, var->choices[*(var->value)], _(var->doc));
+ else
+ sprintf (description, "%s (%d): %s.",
+ var->name, *(var->value), _(var->doc));
+
+ window_message_in_echo_area ("%s", description, NULL);
+ free (description);
+}
+
+DECLARE_INFO_COMMAND (set_variable, _("Set the value of an Info variable"))
+{
+ VARIABLE_ALIST *var;
+ char *line;
+
+ /* Get the variable's name and value. */
+ var = read_variable_name ((char *) _("Set variable: "), window);
+
+ if (!var)
+ return;
+
+ /* Read a new value for this variable. */
+ {
+ char prompt[100];
+
+ if (!var->choices)
+ {
+ int potential_value;
+
+ if (info_explicit_arg || count != 1)
+ potential_value = count;
+ else
+ potential_value = *(var->value);
+
+ sprintf (prompt, _("Set %s to value (%d): "),
+ var->name, potential_value);
+ line = info_read_in_echo_area (active_window, prompt);
+
+ /* If no error was printed, clear the echo area. */
+ if (!info_error_was_printed)
+ window_clear_echo_area ();
+
+ /* User aborted? */
+ if (!line)
+ return;
+
+ /* If the user specified a value, get that, otherwise, we are done. */
+ canonicalize_whitespace (line);
+ if (*line)
+ *(var->value) = atoi (line);
+ else
+ *(var->value) = potential_value;
+
+ free (line);
+ }
+ else
+ {
+ register int i;
+ REFERENCE **array = (REFERENCE **)NULL;
+ int array_index = 0;
+ int array_slots = 0;
+
+ for (i = 0; var->choices[i]; i++)
+ {
+ REFERENCE *entry;
+
+ entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
+ entry->label = xstrdup (var->choices[i]);
+ entry->nodename = (char *)NULL;
+ entry->filename = (char *)NULL;
+
+ add_pointer_to_array
+ (entry, array_index, array, array_slots, 10, REFERENCE *);
+ }
+
+ sprintf (prompt, _("Set %s to value (%s): "),
+ var->name, var->choices[*(var->value)]);
+
+ /* Ask the completer to read a variable value for us. */
+ line = info_read_completing_in_echo_area (window, prompt, array);
+
+ info_free_references (array);
+
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+
+ /* User aborted? */
+ if (!line)
+ {
+ info_abort_key (active_window, 0, 0);
+ return;
+ }
+
+ /* User accepted default choice? If so, no change. */
+ if (!*line)
+ {
+ free (line);
+ return;
+ }
+
+ /* Find the choice in our list of choices. */
+ for (i = 0; var->choices[i]; i++)
+ if (strcmp (var->choices[i], line) == 0)
+ break;
+
+ if (var->choices[i])
+ *(var->value) = i;
+ }
+ }
+}
+
+/* Read the name of an Info variable in the echo area and return the
+ address of a VARIABLE_ALIST member. A return value of NULL indicates
+ that no variable could be read. */
+VARIABLE_ALIST *
+read_variable_name (char *prompt, WINDOW *window)
+{
+ register int i;
+ char *line;
+ REFERENCE **variables;
+
+ /* Get the completion array of variable names. */
+ variables = make_variable_completions_array ();
+
+ /* Ask the completer to read a variable for us. */
+ line =
+ info_read_completing_in_echo_area (window, prompt, variables);
+
+ info_free_references (variables);
+
+ if (!echo_area_is_active)
+ window_clear_echo_area ();
+
+ /* User aborted? */
+ if (!line)
+ {
+ info_abort_key (active_window, 0, 0);
+ return ((VARIABLE_ALIST *)NULL);
+ }
+
+ /* User accepted "default"? (There is none.) */
+ if (!*line)
+ {
+ free (line);
+ return ((VARIABLE_ALIST *)NULL);
+ }
+
+ /* Find the variable in our list of variables. */
+ for (i = 0; info_variables[i].name; i++)
+ if (strcmp (info_variables[i].name, line) == 0)
+ break;
+
+ if (!info_variables[i].name)
+ return ((VARIABLE_ALIST *)NULL);
+ else
+ return (&(info_variables[i]));
+}
+
+/* Make an array of REFERENCE which actually contains the names of the
+ variables available in Info. */
+REFERENCE **
+make_variable_completions_array (void)
+{
+ register int i;
+ REFERENCE **array = (REFERENCE **)NULL;
+ int array_index = 0, array_slots = 0;
+
+ for (i = 0; info_variables[i].name; i++)
+ {
+ REFERENCE *entry;
+
+ entry = (REFERENCE *) xmalloc (sizeof (REFERENCE));
+ entry->label = xstrdup (info_variables[i].name);
+ entry->nodename = (char *)NULL;
+ entry->filename = (char *)NULL;
+
+ add_pointer_to_array
+ (entry, array_index, array, array_slots, 200, REFERENCE *);
+ }
+
+ return (array);
+}
+
+#if defined(INFOKEY)
+
+void
+set_variable_to_value(char *name, char *value)
+{
+ register int i;
+
+ /* Find the variable in our list of variables. */
+ for (i = 0; info_variables[i].name; i++)
+ if (strcmp(info_variables[i].name, name) == 0)
+ break;
+
+ if (!info_variables[i].name)
+ return;
+
+ if (info_variables[i].choices)
+ {
+ register int j;
+
+ /* Find the choice in our list of choices. */
+ for (j = 0; info_variables[i].choices[j]; j++)
+ if (strcmp (info_variables[i].choices[j], value) == 0)
+ break;
+
+ if (info_variables[i].choices[j])
+ *info_variables[i].value = j;
+ }
+ else
+ {
+ *info_variables[i].value = atoi(value);
+ }
+}
+
+#endif /* INFOKEY */
diff --git a/Build/source/utils/texinfo/info/variables.h b/Build/source/utils/texinfo/info/variables.h
new file mode 100644
index 00000000000..7e5b08239b0
--- /dev/null
+++ b/Build/source/utils/texinfo/info/variables.h
@@ -0,0 +1,66 @@
+/* variables.h -- Description of user visible variables in Info.
+ $Id: variables.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_VARIABLES_H
+#define INFO_VARIABLES_H
+
+/* A variable (in the Info sense) is an integer value with a user-visible
+ name. You may supply an array of strings to complete over when the
+ variable is set; in that case, the variable is set to the index of the
+ string that the user chose. If you supply a null list, the user can
+ set the variable to a numeric value. */
+
+/* Structure describing a user visible variable. */
+typedef struct {
+ char *name; /* Polite name. */
+ char *doc; /* Documentation string. */
+ int *value; /* Address of value. */
+ char **choices; /* Array of strings or NULL if numeric only. */
+} VARIABLE_ALIST;
+
+/* Read the name of an Info variable in the echo area and return the
+ address of a VARIABLE_ALIST member. A return value of NULL indicates
+ that no variable could be read. */
+extern VARIABLE_ALIST *read_variable_name (char *prompt, WINDOW *window);
+
+/* Make an array of REFERENCE which actually contains the names of the
+ variables available in Info. */
+extern REFERENCE **make_variable_completions_array (void);
+
+/* Set the value of an info variable. */
+extern void set_variable (WINDOW *window, int count, unsigned char key);
+extern void describe_variable (WINDOW *window, int count, unsigned char key);
+
+/* The list of user-visible variables. */
+extern int auto_footnotes_p;
+extern int auto_tiling_p;
+extern int terminal_use_visible_bell_p;
+extern int info_error_rings_bell_p;
+extern int gc_compressed_files;
+extern int show_index_match;
+extern int info_scroll_behaviour;
+extern int window_scroll_step;
+extern int ISO_Latin_p;
+
+#endif /* not INFO_VARIABLES_H */
diff --git a/Build/source/utils/texinfo/info/window.c b/Build/source/utils/texinfo/info/window.c
new file mode 100644
index 00000000000..cf5665b038d
--- /dev/null
+++ b/Build/source/utils/texinfo/info/window.c
@@ -0,0 +1,1554 @@
+/* window.c -- windows in Info.
+ $Id: window.c,v 1.4 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1993, 1997, 1998, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#include "info.h"
+#include "nodes.h"
+#include "window.h"
+#include "display.h"
+#include "info-utils.h"
+#include "infomap.h"
+
+/* The window which describes the screen. */
+WINDOW *the_screen = NULL;
+
+/* The window which describes the echo area. */
+WINDOW *the_echo_area = NULL;
+
+/* The list of windows in Info. */
+WINDOW *windows = NULL;
+
+/* Pointer to the active window in WINDOW_LIST. */
+WINDOW *active_window = NULL;
+
+/* The size of the echo area in Info. It never changes, irregardless of the
+ size of the screen. */
+#define ECHO_AREA_HEIGHT 1
+
+/* Macro returns the amount of space that the echo area truly requires relative
+ to the entire screen. */
+#define echo_area_required (1 + the_echo_area->height)
+
+/* Initalize the window system by creating THE_SCREEN and THE_ECHO_AREA.
+ Create the first window ever.
+ You pass the dimensions of the total screen size. */
+void
+window_initialize_windows (int width, int height)
+{
+ the_screen = xmalloc (sizeof (WINDOW));
+ the_echo_area = xmalloc (sizeof (WINDOW));
+ windows = xmalloc (sizeof (WINDOW));
+ active_window = windows;
+
+ zero_mem (the_screen, sizeof (WINDOW));
+ zero_mem (the_echo_area, sizeof (WINDOW));
+ zero_mem (active_window, sizeof (WINDOW));
+
+ /* None of these windows has a goal column yet. */
+ the_echo_area->goal_column = -1;
+ active_window->goal_column = -1;
+ the_screen->goal_column = -1;
+
+ /* The active and echo_area windows are visible.
+ The echo_area is permanent.
+ The screen is permanent. */
+ active_window->flags = W_WindowVisible;
+ the_echo_area->flags = W_WindowIsPerm | W_InhibitMode | W_WindowVisible;
+ the_screen->flags = W_WindowIsPerm;
+
+ /* The height of the echo area never changes. It is statically set right
+ here, and it must be at least 1 line for display. The size of the
+ initial window cannot be the same size as the screen, since the screen
+ includes the echo area. So, we make the height of the initial window
+ equal to the screen's displayable region minus the height of the echo
+ area. */
+ the_echo_area->height = ECHO_AREA_HEIGHT;
+ active_window->height = the_screen->height - 1 - the_echo_area->height;
+ window_new_screen_size (width, height);
+
+ /* The echo area uses a different keymap than normal info windows. */
+ the_echo_area->keymap = echo_area_keymap;
+ active_window->keymap = info_keymap;
+}
+
+/* Given that the size of the screen has changed to WIDTH and HEIGHT
+ from whatever it was before (found in the_screen->height, ->width),
+ change the size (and possibly location) of each window in the screen.
+ If a window would become too small, call the function DELETER on it,
+ after deleting the window from our chain of windows. If DELETER is NULL,
+ nothing extra is done. The last window can never be deleted, but it can
+ become invisible. */
+
+/* If non-null, a function to call with WINDOW as argument when the function
+ window_new_screen_size () has deleted WINDOW. */
+VFunction *window_deletion_notifier = NULL;
+
+void
+window_new_screen_size (int width, int height)
+{
+ register WINDOW *win;
+ int delta_height, delta_each, delta_leftover;
+ int numwins;
+
+ /* If no change, do nothing. */
+ if (width == the_screen->width && height == the_screen->height)
+ return;
+
+ /* If the new window height is too small, make it be zero. */
+ if (height < (WINDOW_MIN_SIZE + the_echo_area->height))
+ height = 0;
+ if (width < 0)
+ width = 0;
+
+ /* Find out how many windows will change. */
+ for (numwins = 0, win = windows; win; win = win->next, numwins++);
+
+ /* See if some windows will need to be deleted. This is the case if
+ the screen is getting smaller, and the available space divided by
+ the number of windows is less than WINDOW_MIN_SIZE. In that case,
+ delete some windows and try again until there is either enough
+ space to divy up among the windows, or until there is only one
+ window left. */
+ while ((height - echo_area_required) / numwins <= WINDOW_MIN_SIZE)
+ {
+ /* If only one window, make the size of it be zero, and return
+ immediately. */
+ if (!windows->next)
+ {
+ windows->height = 0;
+ maybe_free (windows->line_starts);
+ windows->line_starts = NULL;
+ windows->line_count = 0;
+ break;
+ }
+
+ /* If we have some temporary windows, delete one of them. */
+ for (win = windows; win; win = win->next)
+ if (win->flags & W_TempWindow)
+ break;
+
+ /* Otherwise, delete the first window, and try again. */
+ if (!win)
+ win = windows;
+
+ if (window_deletion_notifier)
+ (*window_deletion_notifier) (win);
+
+ window_delete_window (win);
+ numwins--;
+ }
+
+ /* The screen has changed height and width. */
+ delta_height = height - the_screen->height; /* This is how much. */
+ the_screen->height = height; /* This is the new height. */
+ the_screen->width = width; /* This is the new width. */
+
+ /* Set the start of the echo area. */
+ the_echo_area->first_row = height - the_echo_area->height;
+ the_echo_area->width = width;
+
+ /* Check to see if the screen can really be changed this way. */
+ if ((!windows->next) && ((windows->height == 0) && (delta_height < 0)))
+ return;
+
+ /* Divide the change in height among the available windows. */
+ delta_each = delta_height / numwins;
+ delta_leftover = delta_height - (delta_each * numwins);
+
+ /* Change the height of each window in the chain by delta_each. Change
+ the height of the last window in the chain by delta_each and by the
+ leftover amount of change. Change the width of each window to be
+ WIDTH. */
+ for (win = windows; win; win = win->next)
+ {
+ if ((win->width != width) && ((win->flags & W_InhibitMode) == 0))
+ {
+ win->width = width;
+ maybe_free (win->modeline);
+ win->modeline = xmalloc (1 + width);
+ }
+
+ win->height += delta_each;
+
+ /* If the previous height of this window was zero, it was the only
+ window, and it was not visible. Thus we need to compensate for
+ the echo_area. */
+ if (win->height == delta_each)
+ win->height -= (1 + the_echo_area->height);
+
+ /* If this is not the first window in the chain, then change the
+ first row of it. We cannot just add delta_each to the first row,
+ since this window's first row is the sum of the collective increases
+ that have gone before it. So we just add one to the location of the
+ previous window's modeline. */
+ if (win->prev)
+ win->first_row = (win->prev->first_row + win->prev->height) + 1;
+
+ /* The last window in the chain gets the extra space (or shrinkage). */
+ if (!win->next)
+ win->height += delta_leftover;
+
+ if (win->node)
+ recalculate_line_starts (win);
+
+ win->flags |= W_UpdateWindow;
+ }
+
+ /* If the screen got smaller, check over the windows just shrunk to
+ keep them within bounds. Some of the windows may have gotten smaller
+ than WINDOW_MIN_HEIGHT in which case some of the other windows are
+ larger than the available display space in the screen. Because of our
+ intial test above, we know that there is enough space for all of the
+ windows. */
+ if ((delta_each < 0) && ((windows->height != 0) && windows->next))
+ {
+ int avail;
+
+ avail = the_screen->height - (numwins + the_echo_area->height);
+ win = windows;
+
+ while (win)
+ {
+ if ((win->height < WINDOW_MIN_HEIGHT) ||
+ (win->height > avail))
+ {
+ WINDOW *lastwin = NULL;
+
+ /* Split the space among the available windows. */
+ delta_each = avail / numwins;
+ delta_leftover = avail - (delta_each * numwins);
+
+ for (win = windows; win; win = win->next)
+ {
+ lastwin = win;
+ if (win->prev)
+ win->first_row =
+ (win->prev->first_row + win->prev->height) + 1;
+ win->height = delta_each;
+ }
+
+ /* Give the leftover space (if any) to the last window. */
+ lastwin->height += delta_leftover;
+ break;
+ }
+ else
+ win= win->next;
+ }
+ }
+}
+
+/* Make a new window showing NODE, and return that window structure.
+ If NODE is passed as NULL, then show the node showing in the active
+ window. If the window could not be made return a NULL pointer. The
+ active window is not changed.*/
+WINDOW *
+window_make_window (NODE *node)
+{
+ WINDOW *window;
+
+ if (!node)
+ node = active_window->node;
+
+ /* If there isn't enough room to make another window, return now. */
+ if ((active_window->height / 2) < WINDOW_MIN_SIZE)
+ return (NULL);
+
+ /* Make and initialize the new window.
+ The fudging about with -1 and +1 is because the following window in the
+ chain cannot start at window->height, since that is where the modeline
+ for the previous window is displayed. The inverse adjustment is made
+ in window_delete_window (). */
+ window = xmalloc (sizeof (WINDOW));
+ window->width = the_screen->width;
+ window->height = (active_window->height / 2) - 1;
+#if defined (SPLIT_BEFORE_ACTIVE)
+ window->first_row = active_window->first_row;
+#else
+ window->first_row = active_window->first_row +
+ (active_window->height - window->height);
+#endif
+ window->keymap = info_keymap;
+ window->goal_column = -1;
+ window->modeline = xmalloc (1 + window->width);
+ window->line_starts = NULL;
+ window->flags = W_UpdateWindow | W_WindowVisible;
+ window_set_node_of_window (window, node);
+
+ /* Adjust the height of the old active window. */
+ active_window->height -= (window->height + 1);
+#if defined (SPLIT_BEFORE_ACTIVE)
+ active_window->first_row += (window->height + 1);
+#endif
+ active_window->flags |= W_UpdateWindow;
+
+ /* Readjust the new and old windows so that their modelines and contents
+ will be displayed correctly. */
+#if defined (NOTDEF)
+ /* We don't have to do this for WINDOW since window_set_node_of_window ()
+ already did. */
+ window_adjust_pagetop (window);
+ window_make_modeline (window);
+#endif /* NOTDEF */
+
+ /* We do have to readjust the existing active window. */
+ window_adjust_pagetop (active_window);
+ window_make_modeline (active_window);
+
+#if defined (SPLIT_BEFORE_ACTIVE)
+ /* This window is just before the active one. The active window gets
+ bumped down one. The active window is not changed. */
+ window->next = active_window;
+
+ window->prev = active_window->prev;
+ active_window->prev = window;
+
+ if (window->prev)
+ window->prev->next = window;
+ else
+ windows = window;
+#else
+ /* This window is just after the active one. Which window is active is
+ not changed. */
+ window->prev = active_window;
+ window->next = active_window->next;
+ active_window->next = window;
+ if (window->next)
+ window->next->prev = window;
+#endif /* !SPLIT_BEFORE_ACTIVE */
+ return (window);
+}
+
+/* These useful macros make it possible to read the code in
+ window_change_window_height (). */
+#define grow_me_shrinking_next(me, next, diff) \
+ do { \
+ me->height += diff; \
+ next->height -= diff; \
+ next->first_row += diff; \
+ window_adjust_pagetop (next); \
+ } while (0)
+
+#define grow_me_shrinking_prev(me, prev, diff) \
+ do { \
+ me->height += diff; \
+ prev->height -= diff; \
+ me->first_row -=diff; \
+ window_adjust_pagetop (prev); \
+ } while (0)
+
+#define shrink_me_growing_next(me, next, diff) \
+ do { \
+ me->height -= diff; \
+ next->height += diff; \
+ next->first_row -= diff; \
+ window_adjust_pagetop (next); \
+ } while (0)
+
+#define shrink_me_growing_prev(me, prev, diff) \
+ do { \
+ me->height -= diff; \
+ prev->height += diff; \
+ me->first_row += diff; \
+ window_adjust_pagetop (prev); \
+ } while (0)
+
+/* Change the height of WINDOW by AMOUNT. This also automagically adjusts
+ the previous and next windows in the chain. If there is only one user
+ window, then no change takes place. */
+void
+window_change_window_height (WINDOW *window, int amount)
+{
+ register WINDOW *win, *prev, *next;
+
+ /* If there is only one window, or if the amount of change is zero,
+ return immediately. */
+ if (!windows->next || amount == 0)
+ return;
+
+ /* Find this window in our chain. */
+ for (win = windows; win; win = win->next)
+ if (win == window)
+ break;
+
+ /* If the window is isolated (i.e., doesn't appear in our window list,
+ then quit now. */
+ if (!win)
+ return;
+
+ /* Change the height of this window by AMOUNT, if that is possible.
+ It can be impossible if there isn't enough available room on the
+ screen, or if the resultant window would be too small. */
+
+ prev = window->prev;
+ next = window->next;
+
+ /* WINDOW decreasing in size? */
+ if (amount < 0)
+ {
+ int abs_amount = -amount; /* It is easier to deal with this way. */
+
+ /* If the resultant window would be too small, stop here. */
+ if ((window->height - abs_amount) < WINDOW_MIN_HEIGHT)
+ return;
+
+ /* If we have two neighboring windows, choose the smaller one to get
+ larger. */
+ if (next && prev)
+ {
+ if (prev->height < next->height)
+ shrink_me_growing_prev (window, prev, abs_amount);
+ else
+ shrink_me_growing_next (window, next, abs_amount);
+ }
+ else if (next)
+ shrink_me_growing_next (window, next, abs_amount);
+ else
+ shrink_me_growing_prev (window, prev, abs_amount);
+ }
+
+ /* WINDOW increasing in size? */
+ if (amount > 0)
+ {
+ int total_avail, next_avail = 0, prev_avail = 0;
+
+ if (next)
+ next_avail = next->height - WINDOW_MIN_SIZE;
+
+ if (prev)
+ prev_avail = prev->height - WINDOW_MIN_SIZE;
+
+ total_avail = next_avail + prev_avail;
+
+ /* If there isn't enough space available to grow this window, give up. */
+ if (amount > total_avail)
+ return;
+
+ /* If there aren't two neighboring windows, or if one of the neighbors
+ is larger than the other one by at least AMOUNT, grow that one. */
+ if ((next && !prev) || ((next_avail - amount) >= prev_avail))
+ grow_me_shrinking_next (window, next, amount);
+ else if ((prev && !next) || ((prev_avail - amount) >= next_avail))
+ grow_me_shrinking_prev (window, prev, amount);
+ else
+ {
+ int change;
+
+ /* This window has two neighbors. They both must be shrunk in to
+ make enough space for WINDOW to grow. Make them both the same
+ size. */
+ if (prev_avail > next_avail)
+ {
+ change = prev_avail - next_avail;
+ grow_me_shrinking_prev (window, prev, change);
+ amount -= change;
+ }
+ else
+ {
+ change = next_avail - prev_avail;
+ grow_me_shrinking_next (window, next, change);
+ amount -= change;
+ }
+
+ /* Both neighbors are the same size. Split the difference in
+ AMOUNT between them. */
+ while (amount)
+ {
+ window->height++;
+ amount--;
+
+ /* Odd numbers grow next, even grow prev. */
+ if (amount & 1)
+ {
+ prev->height--;
+ window->first_row--;
+ }
+ else
+ {
+ next->height--;
+ next->first_row++;
+ }
+ }
+ window_adjust_pagetop (prev);
+ window_adjust_pagetop (next);
+ }
+ }
+ if (prev)
+ prev->flags |= W_UpdateWindow;
+
+ if (next)
+ next->flags |= W_UpdateWindow;
+
+ window->flags |= W_UpdateWindow;
+ window_adjust_pagetop (window);
+}
+
+/* Tile all of the windows currently displayed in the global variable
+ WINDOWS. If argument STYLE is TILE_INTERNALS, tile windows displaying
+ internal nodes as well, otherwise do not change the height of such
+ windows. */
+void
+window_tile_windows (int style)
+{
+ WINDOW *win, *last_adjusted;
+ int numwins, avail, per_win_height, leftover;
+ int do_internals;
+
+ numwins = avail = 0;
+ do_internals = (style == TILE_INTERNALS);
+
+ for (win = windows; win; win = win->next)
+ if (do_internals || !win->node ||
+ (win->node->flags & N_IsInternal) == 0)
+ {
+ avail += win->height;
+ numwins++;
+ }
+
+ if (numwins <= 1 || !the_screen->height)
+ return;
+
+ /* Find the size for each window. Divide the size of the usable portion
+ of the screen by the number of windows. */
+ per_win_height = avail / numwins;
+ leftover = avail - (per_win_height * numwins);
+
+ last_adjusted = NULL;
+ for (win = windows; win; win = win->next)
+ {
+ if (do_internals || !win->node ||
+ (win->node->flags & N_IsInternal) == 0)
+ {
+ last_adjusted = win;
+ win->height = per_win_height;
+ }
+ }
+
+ if (last_adjusted)
+ last_adjusted->height += leftover;
+
+ /* Readjust the first_row of every window in the chain. */
+ for (win = windows; win; win = win->next)
+ {
+ if (win->prev)
+ win->first_row = win->prev->first_row + win->prev->height + 1;
+
+ window_adjust_pagetop (win);
+ win->flags |= W_UpdateWindow;
+ }
+}
+
+/* Toggle the state of line wrapping in WINDOW. This can do a bit of fancy
+ redisplay. */
+void
+window_toggle_wrap (WINDOW *window)
+{
+ if (window->flags & W_NoWrap)
+ window->flags &= ~W_NoWrap;
+ else
+ window->flags |= W_NoWrap;
+
+ if (window != the_echo_area)
+ {
+ char **old_starts;
+ int old_lines, old_pagetop;
+
+ old_starts = window->line_starts;
+ old_lines = window->line_count;
+ old_pagetop = window->pagetop;
+
+ calculate_line_starts (window);
+
+ /* Make sure that point appears within this window. */
+ window_adjust_pagetop (window);
+
+ /* If the pagetop hasn't changed maybe we can do some scrolling now
+ to speed up the display. Many of the line starts will be the same,
+ so scrolling here is a very good optimization.*/
+ if (old_pagetop == window->pagetop)
+ display_scroll_line_starts
+ (window, old_pagetop, old_starts, old_lines);
+ maybe_free (old_starts);
+ }
+ window->flags |= W_UpdateWindow;
+}
+
+/* Set WINDOW to display NODE. */
+void
+window_set_node_of_window (WINDOW *window, NODE *node)
+{
+ window->node = node;
+ window->pagetop = 0;
+ window->point = 0;
+ recalculate_line_starts (window);
+ window->flags |= W_UpdateWindow;
+ /* The display_pos member is nonzero if we're displaying an anchor. */
+ window->point = node ? node->display_pos : 0;
+ window_adjust_pagetop (window);
+ window_make_modeline (window);
+}
+
+/* Delete WINDOW from the list of known windows. If this window was the
+ active window, make the next window in the chain be the active window.
+ If the active window is the next or previous window, choose that window
+ as the recipient of the extra space. Otherwise, prefer the next window. */
+void
+window_delete_window (WINDOW *window)
+{
+ WINDOW *next, *prev, *window_to_fix;
+
+ next = window->next;
+ prev = window->prev;
+
+ /* You cannot delete the only window or a permanent window. */
+ if ((!next && !prev) || (window->flags & W_WindowIsPerm))
+ return;
+
+ if (next)
+ next->prev = prev;
+
+ if (!prev)
+ windows = next;
+ else
+ prev->next = next;
+
+ if (window->line_starts)
+ free (window->line_starts);
+
+ if (window->modeline)
+ free (window->modeline);
+
+ if (window == active_window)
+ {
+ /* If there isn't a next window, then there must be a previous one,
+ since we cannot delete the last window. If there is a next window,
+ prefer to use that as the active window. */
+ if (next)
+ active_window = next;
+ else
+ active_window = prev;
+ }
+
+ if (next && active_window == next)
+ window_to_fix = next;
+ else if (prev && active_window == prev)
+ window_to_fix = prev;
+ else if (next)
+ window_to_fix = next;
+ else if (prev)
+ window_to_fix = prev;
+ else
+ window_to_fix = windows;
+
+ if (window_to_fix->first_row > window->first_row)
+ {
+ int diff;
+
+ /* Try to adjust the visible part of the node so that as little
+ text as possible has to move. */
+ diff = window_to_fix->first_row - window->first_row;
+ window_to_fix->first_row = window->first_row;
+
+ window_to_fix->pagetop -= diff;
+ if (window_to_fix->pagetop < 0)
+ window_to_fix->pagetop = 0;
+ }
+
+ /* The `+ 1' is to offset the difference between the first_row locations.
+ See the code in window_make_window (). */
+ window_to_fix->height += window->height + 1;
+ window_to_fix->flags |= W_UpdateWindow;
+
+ free (window);
+}
+
+/* For every window in CHAIN, set the flags member to have FLAG set. */
+void
+window_mark_chain (WINDOW *chain, int flag)
+{
+ register WINDOW *win;
+
+ for (win = chain; win; win = win->next)
+ win->flags |= flag;
+}
+
+/* For every window in CHAIN, clear the flags member of FLAG. */
+void
+window_unmark_chain (WINDOW *chain, int flag)
+{
+ register WINDOW *win;
+
+ for (win = chain; win; win = win->next)
+ win->flags &= ~flag;
+}
+
+/* Return the number of characters it takes to display CHARACTER on the
+ screen at HPOS. */
+int
+character_width (int character, int hpos)
+{
+ int printable_limit = 127;
+ int width = 1;
+
+ if (ISO_Latin_p)
+ printable_limit = 255;
+
+ if (character > printable_limit)
+ width = 3;
+ else if (iscntrl (character))
+ {
+ switch (character)
+ {
+ case '\r':
+ case '\n':
+ width = the_screen->width - hpos;
+ break;
+ case '\t':
+ width = ((hpos + 8) & 0xf8) - hpos;
+ break;
+ default:
+ width = 2;
+ }
+ }
+ else if (character == DEL)
+ width = 2;
+
+ return (width);
+}
+
+/* Return the number of characters it takes to display STRING on the screen
+ at HPOS. */
+int
+string_width (char *string, int hpos)
+{
+ register int i, width, this_char_width;
+
+ for (width = 0, i = 0; string[i]; i++)
+ {
+ /* Support ANSI escape sequences for -R. */
+ if (raw_escapes_p
+ && string[i] == '\033'
+ && string[i+1] == '['
+ && isdigit (string[i+2])
+ && (string[i+3] == 'm'
+ || (isdigit (string[i+3]) && string[i+4] == 'm')))
+ {
+ while (string[i] != 'm')
+ i++;
+ this_char_width = 0;
+ }
+ else
+ this_char_width = character_width (string[i], hpos);
+ width += this_char_width;
+ hpos += this_char_width;
+ }
+ return (width);
+}
+
+/* Quickly guess the approximate number of lines that NODE would
+ take to display. This really only counts carriage returns. */
+int
+window_physical_lines (NODE *node)
+{
+ register int i, lines;
+ char *contents;
+
+ if (!node)
+ return (0);
+
+ contents = node->contents;
+ for (i = 0, lines = 1; i < node->nodelen; i++)
+ if (contents[i] == '\n')
+ lines++;
+
+ return (lines);
+}
+
+/* Calculate a list of line starts for the node belonging to WINDOW. The line
+ starts are pointers to the actual text within WINDOW->NODE. */
+void
+calculate_line_starts (WINDOW *window)
+{
+ register int i, hpos;
+ char **line_starts = NULL;
+ int line_starts_index = 0, line_starts_slots = 0;
+ int bump_index;
+ NODE *node;
+
+ window->line_starts = NULL;
+ window->line_count = 0;
+ node = window->node;
+
+ if (!node)
+ return;
+
+ /* Grovel the node starting at the top, and for each line calculate the
+ width of the characters appearing in that line. Add each line start
+ to our array. */
+ i = 0;
+ hpos = 0;
+ bump_index = 0;
+
+ while (i < node->nodelen)
+ {
+ char *line = node->contents + i;
+ unsigned int cwidth, c;
+
+ add_pointer_to_array (line, line_starts_index, line_starts,
+ line_starts_slots, 100, char *);
+ if (bump_index)
+ {
+ i++;
+ bump_index = 0;
+ }
+
+ while (1)
+ {
+ /* The cast to unsigned char is for 8-bit characters, which
+ could be passed as negative integers to character_width
+ and wreak havoc on some naive implementations of iscntrl. */
+ c = (unsigned char) node->contents[i];
+
+ /* Support ANSI escape sequences for -R. */
+ if (raw_escapes_p
+ && c == '\033'
+ && node->contents[i+1] == '['
+ && isdigit (node->contents[i+2]))
+ {
+ if (node->contents[i+3] == 'm')
+ {
+ i += 3;
+ cwidth = 0;
+ }
+ else if (isdigit (node->contents[i+3])
+ && node->contents[i+4] == 'm')
+ {
+ i += 4;
+ cwidth = 0;
+ }
+ else
+ cwidth = character_width (c, hpos);
+ }
+ else
+ cwidth = character_width (c, hpos);
+
+ /* If this character fits within this line, just do the next one. */
+ if ((hpos + cwidth) < (unsigned int) window->width)
+ {
+ i++;
+ hpos += cwidth;
+ continue;
+ }
+ else
+ {
+ /* If this character would position the cursor at the start of
+ the next printed screen line, then do the next line. */
+ if (c == '\n' || c == '\r' || c == '\t')
+ {
+ i++;
+ hpos = 0;
+ break;
+ }
+ else
+ {
+ /* This character passes the window width border. Postion
+ the cursor after the printed character, but remember this
+ line start as where this character is. A bit tricky. */
+
+ /* If this window doesn't wrap lines, proceed to the next
+ physical line here. */
+ if (window->flags & W_NoWrap)
+ {
+ hpos = 0;
+ while (i < node->nodelen && node->contents[i] != '\n')
+ i++;
+
+ if (node->contents[i] == '\n')
+ i++;
+ }
+ else
+ {
+ hpos = the_screen->width - hpos;
+ bump_index++;
+ }
+ break;
+ }
+ }
+ }
+ }
+ window->line_starts = line_starts;
+ window->line_count = line_starts_index;
+}
+
+/* Given WINDOW, recalculate the line starts for the node it displays. */
+void
+recalculate_line_starts (WINDOW *window)
+{
+ maybe_free (window->line_starts);
+ calculate_line_starts (window);
+}
+
+/* Global variable control redisplay of scrolled windows. If non-zero, it
+ is the desired number of lines to scroll the window in order to make
+ point visible. A user might set this to 1 for smooth scrolling. If
+ set to zero, the line containing point is centered within the window. */
+int window_scroll_step = 0;
+
+/* Adjust the pagetop of WINDOW such that the cursor point will be visible. */
+void
+window_adjust_pagetop (WINDOW *window)
+{
+ register int line = 0;
+ char *contents;
+
+ if (!window->node)
+ return;
+
+ contents = window->node->contents;
+
+ /* Find the first printed line start which is after WINDOW->point. */
+ for (line = 0; line < window->line_count; line++)
+ {
+ char *line_start;
+
+ line_start = window->line_starts[line];
+
+ if ((line_start - contents) > window->point)
+ break;
+ }
+
+ /* The line index preceding the line start which is past point is the
+ one containing point. */
+ line--;
+
+ /* If this line appears in the current displayable page, do nothing.
+ Otherwise, adjust the top of the page to make this line visible. */
+ if ((line < window->pagetop) ||
+ (line - window->pagetop > (window->height - 1)))
+ {
+ /* The user-settable variable "scroll-step" is used to attempt
+ to make point visible, iff it is non-zero. If that variable
+ is zero, then the line containing point is centered within
+ the window. */
+ if (window_scroll_step < window->height)
+ {
+ if ((line < window->pagetop) &&
+ ((window->pagetop - window_scroll_step) <= line))
+ window->pagetop -= window_scroll_step;
+ else if ((line - window->pagetop > (window->height - 1)) &&
+ ((line - (window->pagetop + window_scroll_step)
+ < window->height)))
+ window->pagetop += window_scroll_step;
+ else
+ window->pagetop = line - ((window->height - 1) / 2);
+ }
+ else
+ window->pagetop = line - ((window->height - 1) / 2);
+
+ if (window->pagetop < 0)
+ window->pagetop = 0;
+ window->flags |= W_UpdateWindow;
+ }
+}
+
+/* Return the index of the line containing point. */
+int
+window_line_of_point (WINDOW *window)
+{
+ register int i, start = 0;
+
+ /* Try to optimize. Check to see if point is past the pagetop for
+ this window, and if so, start searching forward from there. */
+ if ((window->pagetop > -1 && window->pagetop < window->line_count) &&
+ (window->line_starts[window->pagetop] - window->node->contents)
+ <= window->point)
+ start = window->pagetop;
+
+ for (i = start; i < window->line_count; i++)
+ {
+ if ((window->line_starts[i] - window->node->contents) > window->point)
+ break;
+ }
+
+ return (i - 1);
+}
+
+/* Get and return the goal column for this window. */
+int
+window_get_goal_column (WINDOW *window)
+{
+ if (!window->node)
+ return (-1);
+
+ if (window->goal_column != -1)
+ return (window->goal_column);
+
+ /* Okay, do the work. Find the printed offset of the cursor
+ in this window. */
+ return (window_get_cursor_column (window));
+}
+
+/* Get and return the printed column offset of the cursor in this window. */
+int
+window_get_cursor_column (WINDOW *window)
+{
+ int i, hpos, end;
+ char *line;
+
+ i = window_line_of_point (window);
+
+ if (i < 0)
+ return (-1);
+
+ line = window->line_starts[i];
+ end = window->point - (line - window->node->contents);
+
+ for (hpos = 0, i = 0; i < end; i++)
+ {
+ /* Support ANSI escape sequences for -R. */
+ if (raw_escapes_p
+ && line[i] == '\033'
+ && line[i+1] == '['
+ && isdigit (line[i+2]))
+ {
+ if (line[i+3] == 'm')
+ i += 3;
+ else if (isdigit (line[i+3]) && line[i+4] == 'm')
+ i += 4;
+ else
+ hpos += character_width (line[i], hpos);
+ }
+ else
+ hpos += character_width (line[i], hpos);
+ }
+
+ return (hpos);
+}
+
+/* Count the number of characters in LINE that precede the printed column
+ offset of GOAL. */
+int
+window_chars_to_goal (char *line, int goal)
+{
+ register int i, check = 0, hpos;
+
+ for (hpos = 0, i = 0; line[i] != '\n'; i++)
+ {
+ /* Support ANSI escape sequences for -R. */
+ if (raw_escapes_p
+ && line[i] == '\033'
+ && line[i+1] == '['
+ && isdigit (line[i+2])
+ && (line[i+3] == 'm'
+ || (isdigit (line[i+3]) && line[i+4] == 'm')))
+ while (line[i] != 'm')
+ i++;
+ else
+ check = hpos + character_width (line[i], hpos);
+
+ if (check > goal)
+ break;
+
+ hpos = check;
+ }
+ return (i);
+}
+
+/* Create a modeline for WINDOW, and store it in window->modeline. */
+void
+window_make_modeline (WINDOW *window)
+{
+ register int i;
+ char *modeline;
+ char location_indicator[4];
+ int lines_remaining;
+
+ /* Only make modelines for those windows which have one. */
+ if (window->flags & W_InhibitMode)
+ return;
+
+ /* Find the number of lines actually displayed in this window. */
+ lines_remaining = window->line_count - window->pagetop;
+
+ if (window->pagetop == 0)
+ {
+ if (lines_remaining <= window->height)
+ strcpy (location_indicator, "All");
+ else
+ strcpy (location_indicator, "Top");
+ }
+ else
+ {
+ if (lines_remaining <= window->height)
+ strcpy (location_indicator, "Bot");
+ else
+ {
+ float pt, lc;
+ int percentage;
+
+ pt = (float)window->pagetop;
+ lc = (float)window->line_count;
+
+ percentage = 100 * (pt / lc);
+
+ sprintf (location_indicator, "%2d%%", percentage);
+ }
+ }
+
+ /* Calculate the maximum size of the information to stick in MODELINE. */
+ {
+ int modeline_len = 0;
+ char *parent = NULL, *filename = "*no file*";
+ char *nodename = "*no node*";
+ const char *update_message = NULL;
+ NODE *node = window->node;
+
+ if (node)
+ {
+ if (node->nodename)
+ nodename = node->nodename;
+
+ if (node->parent)
+ {
+ parent = filename_non_directory (node->parent);
+ modeline_len += strlen ("Subfile: ") + strlen (node->filename);
+ }
+
+ if (node->filename)
+ filename = filename_non_directory (node->filename);
+
+ if (node->flags & N_UpdateTags)
+ update_message = _("--*** Tags out of Date ***");
+ }
+
+ if (update_message)
+ modeline_len += strlen (update_message);
+ modeline_len += strlen (filename);
+ modeline_len += strlen (nodename);
+ modeline_len += 4; /* strlen (location_indicator). */
+
+ /* 10 for the decimal representation of the number of lines in this
+ node, and the remainder of the text that can appear in the line. */
+ modeline_len += 10 + strlen (_("-----Info: (), lines ----, "));
+ modeline_len += window->width;
+
+ modeline = xmalloc (1 + modeline_len);
+
+ /* Special internal windows have no filename. */
+ if (!parent && !*filename)
+ sprintf (modeline, _("-%s---Info: %s, %d lines --%s--"),
+ (window->flags & W_NoWrap) ? "$" : "-",
+ nodename, window->line_count, location_indicator);
+ else
+ sprintf (modeline, _("-%s%s-Info: (%s)%s, %d lines --%s--"),
+ (window->flags & W_NoWrap) ? "$" : "-",
+ (node && (node->flags & N_IsCompressed)) ? "zz" : "--",
+ parent ? parent : filename,
+ nodename, window->line_count, location_indicator);
+
+ if (parent)
+ sprintf (modeline + strlen (modeline), _(" Subfile: %s"), filename);
+
+ if (update_message)
+ sprintf (modeline + strlen (modeline), "%s", update_message);
+
+ i = strlen (modeline);
+
+ if (i >= window->width)
+ modeline[window->width] = '\0';
+ else
+ {
+ while (i < window->width)
+ modeline[i++] = '-';
+ modeline[i] = '\0';
+ }
+
+ strcpy (window->modeline, modeline);
+ free (modeline);
+ }
+}
+
+/* Make WINDOW start displaying at PERCENT percentage of its node. */
+void
+window_goto_percentage (WINDOW *window, int percent)
+{
+ int desired_line;
+
+ if (!percent)
+ desired_line = 0;
+ else
+ desired_line =
+ (int) ((float)window->line_count * ((float)percent / 100.0));
+
+ window->pagetop = desired_line;
+ window->point =
+ window->line_starts[window->pagetop] - window->node->contents;
+ window->flags |= W_UpdateWindow;
+ window_make_modeline (window);
+}
+
+/* Get the state of WINDOW, and save it in STATE. */
+void
+window_get_state (WINDOW *window, SEARCH_STATE *state)
+{
+ state->node = window->node;
+ state->pagetop = window->pagetop;
+ state->point = window->point;
+}
+
+/* Set the node, pagetop, and point of WINDOW. */
+void
+window_set_state (WINDOW *window, SEARCH_STATE *state)
+{
+ if (window->node != state->node)
+ window_set_node_of_window (window, state->node);
+ window->pagetop = state->pagetop;
+ window->point = state->point;
+}
+
+
+/* Manipulating home-made nodes. */
+
+/* A place to buffer echo area messages. */
+static NODE *echo_area_node = NULL;
+
+/* Make the node of the_echo_area be an empty one. */
+static void
+free_echo_area (void)
+{
+ if (echo_area_node)
+ {
+ maybe_free (echo_area_node->contents);
+ free (echo_area_node);
+ }
+
+ echo_area_node = NULL;
+ window_set_node_of_window (the_echo_area, echo_area_node);
+}
+
+/* Clear the echo area, removing any message that is already present.
+ The echo area is cleared immediately. */
+void
+window_clear_echo_area (void)
+{
+ free_echo_area ();
+ display_update_one_window (the_echo_area);
+}
+
+/* Make a message appear in the echo area, built from FORMAT, ARG1 and ARG2.
+ The arguments are treated similar to printf () arguments, but not all of
+ printf () hair is present. The message appears immediately. If there was
+ already a message appearing in the echo area, it is removed. */
+void
+window_message_in_echo_area (char *format, void *arg1, void *arg2)
+{
+ free_echo_area ();
+ echo_area_node = build_message_node (format, arg1, arg2);
+ window_set_node_of_window (the_echo_area, echo_area_node);
+ display_update_one_window (the_echo_area);
+}
+
+/* Place a temporary message in the echo area built from FORMAT, ARG1
+ and ARG2. The message appears immediately, but does not destroy
+ any existing message. A future call to unmessage_in_echo_area ()
+ restores the old contents. */
+static NODE **old_echo_area_nodes = NULL;
+static int old_echo_area_nodes_index = 0;
+static int old_echo_area_nodes_slots = 0;
+
+void
+message_in_echo_area (char *format, void *arg1, void *arg2)
+{
+ if (echo_area_node)
+ {
+ add_pointer_to_array (echo_area_node, old_echo_area_nodes_index,
+ old_echo_area_nodes, old_echo_area_nodes_slots,
+ 4, NODE *);
+ }
+ echo_area_node = NULL;
+ window_message_in_echo_area (format, arg1, arg2);
+}
+
+void
+unmessage_in_echo_area (void)
+{
+ free_echo_area ();
+
+ if (old_echo_area_nodes_index)
+ echo_area_node = old_echo_area_nodes[--old_echo_area_nodes_index];
+
+ window_set_node_of_window (the_echo_area, echo_area_node);
+ display_update_one_window (the_echo_area);
+}
+
+/* A place to build a message. */
+static char *message_buffer = NULL;
+static int message_buffer_index = 0;
+static int message_buffer_size = 0;
+
+/* Ensure that there is enough space to stuff LENGTH characters into
+ MESSAGE_BUFFER. */
+static void
+message_buffer_resize (int length)
+{
+ if (!message_buffer)
+ {
+ message_buffer_size = length + 1;
+ message_buffer = xmalloc (message_buffer_size);
+ message_buffer_index = 0;
+ }
+
+ while (message_buffer_size <= message_buffer_index + length)
+ message_buffer = (char *)
+ xrealloc (message_buffer,
+ message_buffer_size += 100 + (2 * length));
+}
+
+/* Format MESSAGE_BUFFER with the results of printing FORMAT with ARG1 and
+ ARG2. */
+static void
+build_message_buffer (char *format, void *arg1, void *arg2, void *arg3)
+{
+ register int i, len;
+ void *args[3];
+ int arg_index = 0;
+
+ args[0] = arg1;
+ args[1] = arg2;
+ args[2] = arg3;
+
+ len = strlen (format);
+
+ message_buffer_resize (len);
+
+ for (i = 0; format[i]; i++)
+ {
+ if (format[i] != '%')
+ {
+ message_buffer[message_buffer_index++] = format[i];
+ len--;
+ }
+ else
+ {
+ char c;
+ char *fmt_start = format + i;
+ char *fmt;
+ int fmt_len, formatted_len;
+ int paramed = 0;
+
+ format_again:
+ i++;
+ while (format[i] && strchr ("-. +0123456789", format[i]))
+ i++;
+ c = format[i];
+
+ if (c == '\0')
+ abort ();
+
+ if (c == '$') {
+ /* position parameter parameter */
+ /* better to use bprintf from bfox's metahtml? */
+ arg_index = atoi(fmt_start + 1) - 1;
+ if (arg_index < 0)
+ arg_index = 0;
+ if (arg_index >= 2)
+ arg_index = 1;
+ paramed = 1;
+ goto format_again;
+ }
+
+ fmt_len = format + i - fmt_start + 1;
+ fmt = (char *) xmalloc (fmt_len + 1);
+ strncpy (fmt, fmt_start, fmt_len);
+ fmt[fmt_len] = '\0';
+
+ if (paramed) {
+ /* removed positioned parameter */
+ char *p;
+ for (p = fmt + 1; *p && *p != '$'; p++) {
+ ;
+ }
+ strcpy(fmt + 1, p + 1);
+ }
+
+ /* If we have "%-98s", maybe 98 calls for a longer string. */
+ if (fmt_len > 2)
+ {
+ int j;
+
+ for (j = fmt_len - 2; j >= 0; j--)
+ if (isdigit (fmt[j]) || fmt[j] == '$')
+ break;
+
+ formatted_len = atoi (fmt + j);
+ }
+ else
+ formatted_len = c == 's' ? 0 : 1; /* %s can produce empty string */
+
+ switch (c)
+ {
+ case '%': /* Insert a percent sign. */
+ message_buffer_resize (len + formatted_len);
+ sprintf
+ (message_buffer + message_buffer_index, fmt, "%");
+ message_buffer_index += formatted_len;
+ break;
+
+ case 's': /* Insert the current arg as a string. */
+ {
+ char *string;
+ int string_len;
+
+ string = (char *)args[arg_index++];
+ string_len = strlen (string);
+
+ if (formatted_len > string_len)
+ string_len = formatted_len;
+ message_buffer_resize (len + string_len);
+ sprintf
+ (message_buffer + message_buffer_index, fmt, string);
+ message_buffer_index += string_len;
+ }
+ break;
+
+ case 'd': /* Insert the current arg as an integer. */
+ {
+ long long_val;
+ int integer;
+
+ long_val = (long)args[arg_index++];
+ integer = (int)long_val;
+
+ message_buffer_resize (len + formatted_len > 32
+ ? formatted_len : 32);
+ sprintf
+ (message_buffer + message_buffer_index, fmt, integer);
+ message_buffer_index = strlen (message_buffer);
+ }
+ break;
+
+ case 'c': /* Insert the current arg as a character. */
+ {
+ long long_val;
+ int character;
+
+ long_val = (long)args[arg_index++];
+ character = (int)long_val;
+
+ message_buffer_resize (len + formatted_len);
+ sprintf
+ (message_buffer + message_buffer_index, fmt, character);
+ message_buffer_index += formatted_len;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ free (fmt);
+ }
+ }
+ message_buffer[message_buffer_index] = '\0';
+}
+
+/* Build a new node which has FORMAT printed with ARG1 and ARG2 as the
+ contents. */
+NODE *
+build_message_node (char *format, void *arg1, void *arg2)
+{
+ NODE *node;
+
+ message_buffer_index = 0;
+ build_message_buffer (format, arg1, arg2, 0);
+
+ node = message_buffer_to_node ();
+ return (node);
+}
+
+/* Convert the contents of the message buffer to a node. */
+NODE *
+message_buffer_to_node (void)
+{
+ NODE *node;
+
+ node = xmalloc (sizeof (NODE));
+ node->filename = NULL;
+ node->parent = NULL;
+ node->nodename = NULL;
+ node->flags = 0;
+ node->display_pos =0;
+
+ /* Make sure that this buffer ends with a newline. */
+ node->nodelen = 1 + strlen (message_buffer);
+ node->contents = xmalloc (1 + node->nodelen);
+ strcpy (node->contents, message_buffer);
+ node->contents[node->nodelen - 1] = '\n';
+ node->contents[node->nodelen] = '\0';
+ return (node);
+}
+
+/* Useful functions can be called from outside of window.c. */
+void
+initialize_message_buffer (void)
+{
+ message_buffer_index = 0;
+}
+
+/* Print FORMAT with ARG1,2 to the end of the current message buffer. */
+void
+printf_to_message_buffer (char *format, void *arg1, void *arg2, void *arg3)
+{
+ build_message_buffer (format, arg1, arg2, arg3);
+}
+
+/* Return the current horizontal position of the "cursor" on the most
+ recently output message buffer line. */
+int
+message_buffer_length_this_line (void)
+{
+ register int i;
+
+ if (!message_buffer_index)
+ return (0);
+
+ for (i = message_buffer_index; i && message_buffer[i - 1] != '\n'; i--);
+
+ return (string_width (message_buffer + i, 0));
+}
+
+/* Pad STRING to COUNT characters by inserting blanks. */
+int
+pad_to (int count, char *string)
+{
+ register int i;
+
+ i = strlen (string);
+
+ if (i >= count)
+ string[i++] = ' ';
+ else
+ {
+ while (i < count)
+ string[i++] = ' ';
+ }
+ string[i] = '\0';
+
+ return (i);
+}
diff --git a/Build/source/utils/texinfo/info/window.h b/Build/source/utils/texinfo/info/window.h
new file mode 100644
index 00000000000..44f620f0a46
--- /dev/null
+++ b/Build/source/utils/texinfo/info/window.h
@@ -0,0 +1,241 @@
+/* window.h -- Structure and flags used in manipulating Info windows.
+ $Id: window.h,v 1.3 2004/04/11 17:56:46 karl Exp $
+
+ This file is part of GNU Info, a program for reading online documentation
+ stored in Info format.
+
+ Copyright (C) 1993, 1997, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef INFO_WINDOW_H
+#define INFO_WINDOW_H
+
+#include "infomap.h"
+#include "nodes.h"
+
+/* Smallest number of visible lines in a window. The actual height is
+ always one more than this number because each window has a modeline. */
+#define WINDOW_MIN_HEIGHT 2
+
+/* Smallest number of screen lines that can be used to fully present a
+ window. This number includes the modeline of the window. */
+#define WINDOW_MIN_SIZE (WINDOW_MIN_HEIGHT + 1)
+
+/* The exact same elements are used within the WINDOW_STATE structure and a
+ subsection of the WINDOW structure. We could define a structure which
+ contains this elements, and include that structure in each of WINDOW_STATE
+ and WINDOW. But that would lead references in the code such as
+ window->state->node which we would like to avoid. Instead, we #define the
+ elements here, and simply include the define in both data structures. Thus,
+ if you need to change window state information, here is where you would
+ do it. NB> The last element does NOT end with a semi-colon. */
+#define WINDOW_STATE_DECL \
+ NODE *node; /* The node displayed in this window. */ \
+ int pagetop; /* LINE_STARTS[PAGETOP] is first line in WINDOW. */ \
+ long point /* Offset within NODE of the cursor position. */
+
+/* Structure which defines a window. Windows are doubly linked, next
+ and prev. The list of windows is kept on WINDOWS. The structure member
+ window->height is the total height of the window. The position location
+ (0, window->height + window->first_row) is the first character of this
+ windows modeline. The number of lines that can be displayed in a window
+ is equal to window->height - 1. */
+typedef struct window_struct
+{
+ struct window_struct *next; /* Next window in this chain. */
+ struct window_struct *prev; /* Previous window in this chain. */
+ int width; /* Width of this window. */
+ int height; /* Height of this window. */
+ int first_row; /* Offset of the first line in the_screen. */
+ int goal_column; /* The column we would like the cursor to appear in. */
+ Keymap keymap; /* Keymap used to read commands in this window. */
+ WINDOW_STATE_DECL; /* Node, pagetop and point. */
+ char *modeline; /* Calculated text of the modeline for this window. */
+ char **line_starts; /* Array of printed line starts for this node. */
+ int line_count; /* Number of lines appearing in LINE_STARTS. */
+ int flags; /* See below for details. */
+} WINDOW;
+
+typedef struct {
+ WINDOW_STATE_DECL; /* What gets saved. */
+} WINDOW_STATE;
+
+/* Structure defining the current state of an incremental search. */
+typedef struct {
+ WINDOW_STATE_DECL; /* The node, pagetop and point. */
+ int search_index; /* Offset of the last char in the search string. */
+ int direction; /* The direction that this search is heading in. */
+ int failing; /* Whether or not this search failed. */
+} SEARCH_STATE;
+
+#define W_UpdateWindow 0x01 /* WINDOW needs updating. */
+#define W_WindowIsPerm 0x02 /* This WINDOW is a permanent object. */
+#define W_WindowVisible 0x04 /* This WINDOW is currently visible. */
+#define W_InhibitMode 0x08 /* This WINDOW has no modeline. */
+#define W_NoWrap 0x10 /* Lines do not wrap in this window. */
+#define W_InputWindow 0x20 /* Window accepts input. */
+#define W_TempWindow 0x40 /* Window is less important. */
+
+extern WINDOW *windows; /* List of visible Info windows. */
+extern WINDOW *active_window; /* The currently active window. */
+extern WINDOW *the_screen; /* The Info screen is just another window. */
+extern WINDOW *the_echo_area; /* THE_ECHO_AREA is a window in THE_SCREEN. */
+
+/* Global variable control redisplay of scrolled windows. If non-zero, it
+ is the desired number of lines to scroll the window in order to make
+ point visible. A user might set this to 1 for smooth scrolling. If
+ set to zero, the line containing point is centered within the window. */
+extern int window_scroll_step;
+
+ /* Make the modeline member for WINDOW. */
+extern void window_make_modeline (WINDOW *window);
+
+/* Initalize the window system by creating THE_SCREEN and THE_ECHO_AREA.
+ Create the first window ever, and make it permanent.
+ You pass WIDTH and HEIGHT; the dimensions of the total screen size. */
+extern void window_initialize_windows (int width, int height);
+
+/* Make a new window showing NODE, and return that window structure.
+ The new window is made to be the active window. If NODE is passed
+ as NULL, then show the node showing in the active window. If the
+ window could not be made return a NULL pointer. The active window
+ is not changed.*/
+extern WINDOW *window_make_window (NODE *node);
+
+/* Delete WINDOW from the list of known windows. If this window was the
+ active window, make the next window in the chain be the active window,
+ or the previous window in the chain if there is no next window. */
+extern void window_delete_window (WINDOW *window);
+
+/* A function to call when the screen changes size, and some windows have
+ to get deleted. The function is called with the window to be deleted
+ as an argument, and it can't do anything about the window getting deleted;
+ it can only clean up dangling references to that window. */
+extern VFunction *window_deletion_notifier;
+
+/* Set WINDOW to display NODE. */
+extern void window_set_node_of_window (WINDOW *window, NODE *node);
+
+/* Tell the window system that the size of the screen has changed. This
+ causes lots of interesting things to happen. The permanent windows
+ are resized, as well as every visible window. You pass WIDTH and HEIGHT;
+ the dimensions of the total screen size. */
+extern void window_new_screen_size (int width, int height);
+
+/* Change the height of WINDOW by AMOUNT. This also automagically adjusts
+ the previous and next windows in the chain. If there is only one user
+ window, then no change takes place. */
+extern void window_change_window_height (WINDOW *window, int amount);
+
+/* Adjust the pagetop of WINDOW such that the cursor point will be visible. */
+extern void window_adjust_pagetop (WINDOW *window);
+
+/* Tile all of the windows currently displayed in the global variable
+ WINDOWS. If argument DO_INTERNALS is non-zero, tile windows displaying
+ internal nodes as well. */
+#define DONT_TILE_INTERNALS 0
+#define TILE_INTERNALS 1
+extern void window_tile_windows (int style);
+
+/* Toggle the state of line wrapping in WINDOW. This can do a bit of fancy
+ redisplay. */
+extern void window_toggle_wrap (WINDOW *window);
+
+/* For every window in CHAIN, set the flags member to have FLAG set. */
+extern void window_mark_chain (WINDOW *chain, int flag);
+
+/* For every window in CHAIN, clear the flags member of FLAG. */
+extern void window_unmark_chain (WINDOW *chain, int flag);
+
+/* Make WINDOW start displaying at PERCENT percentage of its node. */
+extern void window_goto_percentage (WINDOW *window, int percent);
+
+/* Build a new node which has FORMAT printed with ARG1 and ARG2 as the
+ contents. */
+extern NODE *build_message_node (char *format, void *arg1, void *arg2);
+
+/* Useful functions can be called from outside of window.c. */
+extern void initialize_message_buffer (void);
+
+/* Print FORMAT with ARG1,2 to the end of the current message buffer. */
+extern void printf_to_message_buffer (char *format, void *arg1, void *arg2,
+ void *arg3);
+
+/* Convert the contents of the message buffer to a node. */
+extern NODE *message_buffer_to_node (void);
+
+/* Return the length of the most recently printed line in message buffer. */
+extern int message_buffer_length_this_line (void);
+
+/* Pad STRING to COUNT characters by inserting blanks. */
+extern int pad_to (int count, char *string);
+
+/* Make a message appear in the echo area, built from FORMAT, ARG1 and ARG2.
+ The arguments are treated similar to printf () arguments, but not all of
+ printf () hair is present. The message appears immediately. If there was
+ already a message appearing in the echo area, it is removed. */
+extern void window_message_in_echo_area (char *format, void *arg1, void *arg2);
+
+/* Place a temporary message in the echo area built from FORMAT, ARG1
+ and ARG2. The message appears immediately, but does not destroy
+ any existing message. A future call to unmessage_in_echo_area ()
+ restores the old contents. */
+extern void message_in_echo_area (char *format, void *arg1, void *arg2);
+extern void unmessage_in_echo_area (void);
+
+/* Clear the echo area, removing any message that is already present.
+ The echo area is cleared immediately. */
+extern void window_clear_echo_area (void);
+
+/* Quickly guess the approximate number of lines to that NODE would
+ take to display. This really only counts carriage returns. */
+extern int window_physical_lines (NODE *node);
+
+/* Calculate a list of line starts for the node belonging to WINDOW. The line
+ starts are pointers to the actual text within WINDOW->NODE. */
+extern void calculate_line_starts (WINDOW *window);
+
+/* Given WINDOW, recalculate the line starts for the node it displays. */
+extern void recalculate_line_starts (WINDOW *window);
+
+/* Return the number of characters it takes to display CHARACTER on the
+ screen at HPOS. */
+extern int character_width (int character, int hpos);
+
+/* Return the number of characters it takes to display STRING on the
+ screen at HPOS. */
+extern int string_width (char *string, int hpos);
+
+/* Return the index of the line containing point. */
+extern int window_line_of_point (WINDOW *window);
+
+/* Get and return the goal column for this window. */
+extern int window_get_goal_column (WINDOW *window);
+
+/* Get and return the printed column offset of the cursor in this window. */
+extern int window_get_cursor_column (WINDOW *window);
+
+/* Get and Set the node, pagetop, and point of WINDOW. */
+extern void window_get_state (WINDOW *window, SEARCH_STATE *state);
+extern void window_set_state (WINDOW *window, SEARCH_STATE *state);
+
+/* Count the number of characters in LINE that precede the printed column
+ offset of GOAL. */
+extern int window_chars_to_goal (char *line, int goal);
+
+#endif /* not INFO_WINDOW_H */
diff --git a/Build/source/utils/texinfo/install-sh b/Build/source/utils/texinfo/install-sh
new file mode 100755
index 00000000000..6ebe46de6cf
--- /dev/null
+++ b/Build/source/utils/texinfo/install-sh
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2004-12-17.09
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit 0;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit 0;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ shift
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit 1
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/texinfo/intl/ChangeLog b/Build/source/utils/texinfo/intl/ChangeLog
new file mode 100644
index 00000000000..751291929dc
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/ChangeLog
@@ -0,0 +1,4 @@
+2004-01-29 GNU <bug-gnu-gettext@gnu.org>
+
+ * Version 0.14.1 released.
+
diff --git a/Build/source/utils/texinfo/intl/Makefile.in b/Build/source/utils/texinfo/intl/Makefile.in
new file mode 100644
index 00000000000..05f15329e12
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/Makefile.in
@@ -0,0 +1,493 @@
+# Makefile for directory with message catalog handling library of GNU gettext
+# Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+VPATH = $(srcdir)
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/intl
+aliaspath = $(localedir)
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
+
+l = @INTL_LIBTOOL_SUFFIX_PREFIX@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+YACC = @INTLBISON@ -y -d
+YFLAGS = --name-prefix=__gettext
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
+-DLIBDIR=\"$(libdir)\" -DIN_LIBINTL \
+-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \
+-Dset_relocation_prefix=libintl_set_relocation_prefix \
+-Drelocate=libintl_relocate \
+-DDEPENDS_ON_LIBICONV=1 @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = \
+ gmo.h \
+ gettextP.h \
+ hash-string.h \
+ loadinfo.h \
+ plural-exp.h \
+ eval-plural.h \
+ localcharset.h \
+ relocatable.h \
+ xsize.h \
+ printf-args.h printf-args.c \
+ printf-parse.h wprintf-parse.h printf-parse.c \
+ vasnprintf.h vasnwprintf.h vasnprintf.c \
+ os2compat.h \
+ libgnuintl.h.in
+SOURCES = \
+ bindtextdom.c \
+ dcgettext.c \
+ dgettext.c \
+ gettext.c \
+ finddomain.c \
+ loadmsgcat.c \
+ localealias.c \
+ textdomain.c \
+ l10nflist.c \
+ explodename.c \
+ dcigettext.c \
+ dcngettext.c \
+ dngettext.c \
+ ngettext.c \
+ plural.y \
+ plural-exp.c \
+ localcharset.c \
+ relocatable.c \
+ localename.c \
+ log.c \
+ printf.c \
+ osdep.c \
+ os2compat.c \
+ intl-compat.c
+OBJECTS = \
+ bindtextdom.$lo \
+ dcgettext.$lo \
+ dgettext.$lo \
+ gettext.$lo \
+ finddomain.$lo \
+ loadmsgcat.$lo \
+ localealias.$lo \
+ textdomain.$lo \
+ l10nflist.$lo \
+ explodename.$lo \
+ dcigettext.$lo \
+ dcngettext.$lo \
+ dngettext.$lo \
+ ngettext.$lo \
+ plural.$lo \
+ plural-exp.$lo \
+ localcharset.$lo \
+ relocatable.$lo \
+ localename.$lo \
+ log.$lo \
+ printf.$lo \
+ osdep.$lo \
+ intl-compat.$lo
+DISTFILES.common = Makefile.in \
+config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES)
+DISTFILES.generated = plural.c
+DISTFILES.normal = VERSION
+DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \
+libgnuintl.h_vms Makefile.vms \
+libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc
+DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \
+COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h
+
+all: all-@USE_INCLUDED_LIBINTL@
+all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
+all-no: all-no-@BUILD_INCLUDED_LIBINTL@
+all-no-yes: libgnuintl.$la
+all-no-no:
+
+libintl.a libgnuintl.a: $(OBJECTS)
+ rm -f $@
+ $(AR) cru $@ $(OBJECTS)
+ $(RANLIB) $@
+
+libintl.la libgnuintl.la: $(OBJECTS)
+ $(LIBTOOL) --mode=link \
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
+ $(OBJECTS) @LTLIBICONV@ $(LIBS) -lc \
+ -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
+ -rpath $(libdir) \
+ -no-undefined
+
+# Libtool's library version information for libintl.
+# Before making a gettext release, the gettext maintainer must change this
+# according to the libtool documentation, section "Library interface versions".
+# Maintainers of other packages that include the intl directory must *not*
+# change these values.
+LTV_CURRENT=7
+LTV_REVISION=0
+LTV_AGE=4
+
+.SUFFIXES:
+.SUFFIXES: .c .y .o .lo .sin .sed
+
+.c.o:
+ $(COMPILE) $<
+
+.y.c:
+ $(YACC) $(YFLAGS) --output $@ $<
+ rm -f $*.h
+
+bindtextdom.lo: $(srcdir)/bindtextdom.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c
+dcgettext.lo: $(srcdir)/dcgettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c
+dgettext.lo: $(srcdir)/dgettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c
+gettext.lo: $(srcdir)/gettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c
+finddomain.lo: $(srcdir)/finddomain.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c
+loadmsgcat.lo: $(srcdir)/loadmsgcat.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c
+localealias.lo: $(srcdir)/localealias.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c
+textdomain.lo: $(srcdir)/textdomain.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c
+l10nflist.lo: $(srcdir)/l10nflist.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c
+explodename.lo: $(srcdir)/explodename.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c
+dcigettext.lo: $(srcdir)/dcigettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c
+dcngettext.lo: $(srcdir)/dcngettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c
+dngettext.lo: $(srcdir)/dngettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c
+ngettext.lo: $(srcdir)/ngettext.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c
+plural.lo: $(srcdir)/plural.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c
+plural-exp.lo: $(srcdir)/plural-exp.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c
+localcharset.lo: $(srcdir)/localcharset.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c
+relocatable.lo: $(srcdir)/relocatable.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c
+localename.lo: $(srcdir)/localename.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c
+log.lo: $(srcdir)/log.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c
+printf.lo: $(srcdir)/printf.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c
+osdep.lo: $(srcdir)/osdep.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c
+intl-compat.lo: $(srcdir)/intl-compat.c
+ $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c
+
+ref-add.sed: $(srcdir)/ref-add.sin
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed
+ mv t-ref-add.sed ref-add.sed
+ref-del.sed: $(srcdir)/ref-del.sin
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed
+ mv t-ref-del.sed ref-del.sed
+
+INCLUDES = -I. -I$(srcdir) -I..
+
+libgnuintl.h: $(srcdir)/libgnuintl.h.in
+ sed -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \
+ -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \
+ -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \
+ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \
+ < $(srcdir)/libgnuintl.h.in > libgnuintl.h
+
+libintl.h: libgnuintl.h
+ cp libgnuintl.h libintl.h
+
+charset.alias: $(srcdir)/config.charset
+ $(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+ mv t-$@ $@
+
+check: all
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the GNU gettext() function in its C library or in a
+# separate library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+ && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+ $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
+ $(LIBTOOL) --mode=install \
+ $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
+ if test "@RELOCATABLE@" = yes; then \
+ dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \
+ if test -n "$$dependencies"; then \
+ rm -f $(DESTDIR)$(libdir)/libintl.la; \
+ fi; \
+ fi; \
+ else \
+ : ; \
+ fi
+ if test "$(PACKAGE)" = "gettext-tools" \
+ && test '@USE_INCLUDED_LIBINTL@' = no; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir); \
+ $(LIBTOOL) --mode=install \
+ $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \
+ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+ $(LIBTOOL) --mode=uninstall \
+ rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \
+ else \
+ : ; \
+ fi
+ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \
+ temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+ dest=$(DESTDIR)$(libdir)/charset.alias; \
+ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ orig=$(DESTDIR)$(libdir)/charset.alias; \
+ sed -f ref-add.sed $$orig > $$temp; \
+ $(INSTALL_DATA) $$temp $$dest; \
+ rm -f $$temp; \
+ else \
+ if test @GLIBC21@ = no; then \
+ orig=charset.alias; \
+ sed -f ref-add.sed $$orig > $$temp; \
+ $(INSTALL_DATA) $$temp $$dest; \
+ rm -f $$temp; \
+ fi; \
+ fi; \
+ $(mkinstalldirs) $(DESTDIR)$(localedir); \
+ test -f $(DESTDIR)$(localedir)/locale.alias \
+ && orig=$(DESTDIR)$(localedir)/locale.alias \
+ || orig=$(srcdir)/locale.alias; \
+ temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+ dest=$(DESTDIR)$(localedir)/locale.alias; \
+ sed -f ref-add.sed $$orig > $$temp; \
+ $(INSTALL_DATA) $$temp $$dest; \
+ rm -f $$temp; \
+ else \
+ : ; \
+ fi
+install-data: all
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+ $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
+ $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
+ dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
+ for file in $$dists; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \
+ dists="$(DISTFILES.generated)"; \
+ for file in $$dists; do \
+ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+ $(INSTALL_DATA) $$dir/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ dists="$(DISTFILES.obsolete)"; \
+ for file in $$dists; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+
+install-strip: install
+
+installdirs:
+ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+ && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+ else \
+ : ; \
+ fi
+ if test "$(PACKAGE)" = "gettext-tools" \
+ && test '@USE_INCLUDED_LIBINTL@' = no; then \
+ $(mkinstalldirs) $(DESTDIR)$(libdir); \
+ else \
+ : ; \
+ fi
+ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \
+ $(mkinstalldirs) $(DESTDIR)$(localedir); \
+ else \
+ : ; \
+ fi
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+ && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ rm -f $(DESTDIR)$(includedir)/libintl.h; \
+ $(LIBTOOL) --mode=uninstall \
+ rm -f $(DESTDIR)$(libdir)/libintl.$la; \
+ else \
+ : ; \
+ fi
+ if test "$(PACKAGE)" = "gettext-tools" \
+ && test '@USE_INCLUDED_LIBINTL@' = no; then \
+ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+ else \
+ : ; \
+ fi
+ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+ temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+ dest=$(DESTDIR)$(libdir)/charset.alias; \
+ sed -f ref-del.sed $$dest > $$temp; \
+ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+ rm -f $$dest; \
+ else \
+ $(INSTALL_DATA) $$temp $$dest; \
+ fi; \
+ rm -f $$temp; \
+ fi; \
+ if test -f $(DESTDIR)$(localedir)/locale.alias; then \
+ temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+ dest=$(DESTDIR)$(localedir)/locale.alias; \
+ sed -f ref-del.sed $$dest > $$temp; \
+ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+ rm -f $$dest; \
+ else \
+ $(INSTALL_DATA) $$temp $$dest; \
+ fi; \
+ rm -f $$temp; \
+ fi; \
+ else \
+ : ; \
+ fi
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+
+info dvi ps pdf html:
+
+$(OBJECTS): ../config.h libgnuintl.h
+bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h
+explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h
+dcigettext.$lo: $(srcdir)/eval-plural.h
+localcharset.$lo: $(srcdir)/localcharset.h
+localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h
+printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+ctags: CTAGS
+
+CTAGS: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+ rm -f *.a *.la *.o *.obj *.lo core core.*
+ rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed
+ rm -f -r .libs _libs
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile ID TAGS
+ if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \
+ rm -f ChangeLog.inst $(DISTFILES.normal); \
+ else \
+ : ; \
+ fi
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ : ; \
+ else \
+ if test "$(PACKAGE)" = "gettext-runtime"; then \
+ additional="$(DISTFILES.gettext)"; \
+ else \
+ additional="$(DISTFILES.normal)"; \
+ fi; \
+ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
+ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
+ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+ cp -p $$dir/$$file $(distdir); \
+ done; \
+ fi
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status
+# This would be more efficient, but doesn't work any more with autoconf-2.57,
+# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used.
+# cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/intl/VERSION b/Build/source/utils/texinfo/intl/VERSION
new file mode 100644
index 00000000000..b4b846ca765
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/VERSION
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.14.1
diff --git a/Build/source/utils/texinfo/intl/bindtextdom.c b/Build/source/utils/texinfo/intl/bindtextdom.c
new file mode 100644
index 00000000000..dcdc40085da
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/bindtextdom.c
@@ -0,0 +1,363 @@
+/* Implementation of the bindtextdomain(3) function
+ Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications. */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc. */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+ names than the internal variables in GNU libc, otherwise programs
+ using libintl.a cannot be linked statically. */
+#if !defined _LIBC
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs. */
+extern const char _nl_default_dirname[];
+#ifdef _LIBC
+extern const char _nl_default_dirname_internal[] attribute_hidden;
+#else
+# define INTUSE(name) name
+#endif
+
+/* List with bindings of specific domains. */
+extern struct binding *_nl_domain_bindings;
+
+/* Lock variable to protect the global data in the gettext implementation. */
+__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN libintl_bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
+#endif
+
+/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
+ to be used for the DOMAINNAME message catalog.
+ If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
+ modified, only the current value is returned.
+ If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
+ modified nor returned. */
+static void
+set_binding_values (const char *domainname,
+ const char **dirnamep, const char **codesetp)
+{
+ struct binding *binding;
+ int modified;
+
+ /* Some sanity checks. */
+ if (domainname == NULL || domainname[0] == '\0')
+ {
+ if (dirnamep)
+ *dirnamep = NULL;
+ if (codesetp)
+ *codesetp = NULL;
+ return;
+ }
+
+ __libc_rwlock_wrlock (_nl_state_lock);
+
+ modified = 0;
+
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (binding != NULL)
+ {
+ if (dirnamep)
+ {
+ const char *dirname = *dirnamep;
+
+ if (dirname == NULL)
+ /* The current binding has be to returned. */
+ *dirnamep = binding->dirname;
+ else
+ {
+ /* The domain is already bound. If the new value and the old
+ one are equal we simply do nothing. Otherwise replace the
+ old binding. */
+ char *result = binding->dirname;
+ if (strcmp (dirname, result) != 0)
+ {
+ if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
+ result = (char *) INTUSE(_nl_default_dirname);
+ else
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (dirname);
+#else
+ size_t len = strlen (dirname) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result != NULL, 1))
+ memcpy (result, dirname, len);
+#endif
+ }
+
+ if (__builtin_expect (result != NULL, 1))
+ {
+ if (binding->dirname != INTUSE(_nl_default_dirname))
+ free (binding->dirname);
+
+ binding->dirname = result;
+ modified = 1;
+ }
+ }
+ *dirnamep = result;
+ }
+ }
+
+ if (codesetp)
+ {
+ const char *codeset = *codesetp;
+
+ if (codeset == NULL)
+ /* The current binding has be to returned. */
+ *codesetp = binding->codeset;
+ else
+ {
+ /* The domain is already bound. If the new value and the old
+ one are equal we simply do nothing. Otherwise replace the
+ old binding. */
+ char *result = binding->codeset;
+ if (result == NULL || strcmp (codeset, result) != 0)
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (codeset);
+#else
+ size_t len = strlen (codeset) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result != NULL, 1))
+ memcpy (result, codeset, len);
+#endif
+
+ if (__builtin_expect (result != NULL, 1))
+ {
+ if (binding->codeset != NULL)
+ free (binding->codeset);
+
+ binding->codeset = result;
+ binding->codeset_cntr++;
+ modified = 1;
+ }
+ }
+ *codesetp = result;
+ }
+ }
+ }
+ else if ((dirnamep == NULL || *dirnamep == NULL)
+ && (codesetp == NULL || *codesetp == NULL))
+ {
+ /* Simply return the default values. */
+ if (dirnamep)
+ *dirnamep = INTUSE(_nl_default_dirname);
+ if (codesetp)
+ *codesetp = NULL;
+ }
+ else
+ {
+ /* We have to create a new binding. */
+ size_t len = strlen (domainname) + 1;
+ struct binding *new_binding =
+ (struct binding *) malloc (offsetof (struct binding, domainname) + len);
+
+ if (__builtin_expect (new_binding == NULL, 0))
+ goto failed;
+
+ memcpy (new_binding->domainname, domainname, len);
+
+ if (dirnamep)
+ {
+ const char *dirname = *dirnamep;
+
+ if (dirname == NULL)
+ /* The default value. */
+ dirname = INTUSE(_nl_default_dirname);
+ else
+ {
+ if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
+ dirname = INTUSE(_nl_default_dirname);
+ else
+ {
+ char *result;
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (dirname);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_dirname;
+#else
+ size_t len = strlen (dirname) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_dirname;
+ memcpy (result, dirname, len);
+#endif
+ dirname = result;
+ }
+ }
+ *dirnamep = dirname;
+ new_binding->dirname = (char *) dirname;
+ }
+ else
+ /* The default value. */
+ new_binding->dirname = (char *) INTUSE(_nl_default_dirname);
+
+ new_binding->codeset_cntr = 0;
+
+ if (codesetp)
+ {
+ const char *codeset = *codesetp;
+
+ if (codeset != NULL)
+ {
+ char *result;
+
+#if defined _LIBC || defined HAVE_STRDUP
+ result = strdup (codeset);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_codeset;
+#else
+ size_t len = strlen (codeset) + 1;
+ result = (char *) malloc (len);
+ if (__builtin_expect (result == NULL, 0))
+ goto failed_codeset;
+ memcpy (result, codeset, len);
+#endif
+ codeset = result;
+ new_binding->codeset_cntr++;
+ }
+ *codesetp = codeset;
+ new_binding->codeset = (char *) codeset;
+ }
+ else
+ new_binding->codeset = NULL;
+
+ /* Now enqueue it. */
+ if (_nl_domain_bindings == NULL
+ || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+ {
+ new_binding->next = _nl_domain_bindings;
+ _nl_domain_bindings = new_binding;
+ }
+ else
+ {
+ binding = _nl_domain_bindings;
+ while (binding->next != NULL
+ && strcmp (domainname, binding->next->domainname) > 0)
+ binding = binding->next;
+
+ new_binding->next = binding->next;
+ binding->next = new_binding;
+ }
+
+ modified = 1;
+
+ /* Here we deal with memory allocation failures. */
+ if (0)
+ {
+ failed_codeset:
+ if (new_binding->dirname != INTUSE(_nl_default_dirname))
+ free (new_binding->dirname);
+ failed_dirname:
+ free (new_binding);
+ failed:
+ if (dirnamep)
+ *dirnamep = NULL;
+ if (codesetp)
+ *codesetp = NULL;
+ }
+ }
+
+ /* If we modified any binding, we flush the caches. */
+ if (modified)
+ ++_nl_msg_cat_cntr;
+
+ __libc_rwlock_unlock (_nl_state_lock);
+}
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+char *
+BINDTEXTDOMAIN (const char *domainname, const char *dirname)
+{
+ set_binding_values (domainname, &dirname, NULL);
+ return (char *) dirname;
+}
+
+/* Specify the character encoding in which the messages from the
+ DOMAINNAME message catalog will be returned. */
+char *
+BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset)
+{
+ set_binding_values (domainname, NULL, &codeset);
+ return (char *) codeset;
+}
+
+#ifdef _LIBC
+/* Aliases for function names in GNU C Library. */
+weak_alias (__bindtextdomain, bindtextdomain);
+weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset);
+#endif
diff --git a/Build/source/utils/texinfo/intl/config.charset b/Build/source/utils/texinfo/intl/config.charset
new file mode 100755
index 00000000000..43d45fb75ff
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/config.charset
@@ -0,0 +1,608 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 2000-2004 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name MIME? used by which systems
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd darwin
+# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd darwin
+# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd darwin
+# ISO-8859-3 Y glibc solaris
+# ISO-8859-4 Y osf solaris freebsd darwin
+# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd darwin
+# ISO-8859-6 Y glibc aix hpux solaris
+# ISO-8859-7 Y glibc aix hpux irix osf solaris
+# ISO-8859-8 Y glibc aix hpux osf solaris
+# ISO-8859-9 Y glibc aix hpux irix osf solaris
+# ISO-8859-13 glibc
+# ISO-8859-14 glibc
+# ISO-8859-15 glibc aix osf solaris freebsd
+# KOI8-R Y glibc solaris freebsd darwin
+# KOI8-U Y glibc freebsd darwin
+# KOI8-T glibc
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd darwin dos
+# CP869 dos
+# CP874 woe32 dos
+# CP922 aix
+# CP932 aix woe32 dos
+# CP943 aix
+# CP949 osf woe32 dos
+# CP950 woe32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1125 dos
+# CP1129 aix
+# CP1250 woe32
+# CP1251 glibc solaris darwin woe32
+# CP1252 aix woe32
+# CP1253 woe32
+# CP1254 woe32
+# CP1255 glibc woe32
+# CP1256 woe32
+# CP1257 woe32
+# GB2312 Y glibc aix hpux irix solaris freebsd darwin
+# EUC-JP Y glibc aix hpux irix osf solaris freebsd darwin
+# EUC-KR Y glibc aix hpux irix osf solaris freebsd darwin
+# EUC-TW glibc aix hpux irix osf solaris
+# BIG5 Y glibc aix hpux osf solaris freebsd darwin
+# BIG5-HKSCS glibc solaris
+# GBK glibc aix osf solaris woe32 dos
+# GB18030 glibc solaris
+# SHIFT_JIS Y hpux osf solaris freebsd darwin
+# JOHAB glibc solaris woe32
+# TIS-620 glibc aix hpux osf solaris
+# VISCII Y glibc
+# TCVN5712-1 glibc
+# GEORGIAN-PS glibc
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 Y glibc aix hpux osf solaris
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux-gnulibc1*)
+ # Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ echo "POSIX ASCII"
+ for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+ sv_FI sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.iso-8859-1 ISO-8859-1"
+ echo "$l.iso-8859-15 ISO-8859-15"
+ echo "$l.iso-8859-15@euro ISO-8859-15"
+ echo "$l@euro ISO-8859-15"
+ echo "$l.cp-437 CP437"
+ echo "$l.cp-850 CP850"
+ echo "$l.cp-1252 CP1252"
+ echo "$l.cp-1252@euro CP1252"
+ #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+ sl_SI sr sr_CS sr_YU; do
+ echo "$l ISO-8859-2"
+ echo "$l.iso-8859-2 ISO-8859-2"
+ echo "$l.cp-852 CP852"
+ echo "$l.cp-1250 CP1250"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in mk mk_MK ru ru_RU; do
+ echo "$l ISO-8859-5"
+ echo "$l.iso-8859-5 ISO-8859-5"
+ echo "$l.koi8-r KOI8-R"
+ echo "$l.cp-866 CP866"
+ echo "$l.cp-1251 CP1251"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in ar ar_SA; do
+ echo "$l ISO-8859-6"
+ echo "$l.iso-8859-6 ISO-8859-6"
+ echo "$l.cp-864 CP864"
+ #echo "$l.cp-868 CP868" # not a commonly used encoding
+ echo "$l.cp-1256 CP1256"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in el el_GR gr gr_GR; do
+ echo "$l ISO-8859-7"
+ echo "$l.iso-8859-7 ISO-8859-7"
+ echo "$l.cp-869 CP869"
+ echo "$l.cp-1253 CP1253"
+ echo "$l.cp-1253@euro CP1253"
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in he he_IL iw iw_IL; do
+ echo "$l ISO-8859-8"
+ echo "$l.iso-8859-8 ISO-8859-8"
+ echo "$l.cp-862 CP862"
+ echo "$l.cp-1255 CP1255"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in tr tr_TR; do
+ echo "$l ISO-8859-9"
+ echo "$l.iso-8859-9 ISO-8859-9"
+ echo "$l.cp-857 CP857"
+ echo "$l.cp-1254 CP1254"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in lt lt_LT lv lv_LV; do
+ #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+ echo "$l ISO-8859-13"
+ done
+ for l in ru_UA uk uk_UA; do
+ echo "$l KOI8-U"
+ done
+ for l in zh zh_CN; do
+ #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+ echo "$l GB2312"
+ done
+ for l in ja ja_JP ja_JP.EUC; do
+ echo "$l EUC-JP"
+ done
+ for l in ko ko_KR; do
+ echo "$l EUC-KR"
+ done
+ for l in th th_TH; do
+ echo "$l TIS-620"
+ done
+ for l in fa fa_IR; do
+ #echo "$l ISIRI-3342" # a broken encoding
+ echo "$l.utf-8 UTF-8"
+ done
+ ;;
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-3 ISO-8859-3"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "ansi-1251 CP1251"
+ echo "BIG5 BIG5"
+ echo "Big5-HKSCS BIG5-HKSCS"
+ echo "gb2312 GB2312"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "ko_KR.johap92 JOHAB"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd* | os2*)
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+ # reuse FreeBSD's locale data for OS/2.
+ echo "C ASCII"
+ echo "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ netbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "BIG5 BIG5"
+ echo "SJIS SHIFT_JIS"
+ ;;
+ darwin*)
+ # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ for l in en_AU en_CA en_GB en_US la_LN; do
+ echo "$l.US-ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+ nl_NL no_NO pt_PT sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in la_LN; do
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+ echo "$l.ISO8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO8859-4 ISO-8859-4"
+ done
+ for l in ru_RU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ for l in bg_BG; do
+ echo "$l.CP1251 CP1251"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ beos*)
+ # BeOS has a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
+ echo "# and Bruno Haible <bruno@clisp.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru CP866"
+ echo "ru_RU CP866"
+ echo "uk CP1125"
+ echo "uk_UA CP1125"
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/Build/source/utils/texinfo/intl/dcgettext.c b/Build/source/utils/texinfo/intl/dcgettext.c
new file mode 100644
index 00000000000..850acdee97b
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/dcgettext.c
@@ -0,0 +1,56 @@
+/* Implementation of the dcgettext(3) function.
+ Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCGETTEXT libintl_dcgettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+char *
+DCGETTEXT (const char *domainname, const char *msgid, int category)
+{
+ return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+INTDEF(__dcgettext)
+weak_alias (__dcgettext, dcgettext);
+#endif
diff --git a/Build/source/utils/texinfo/intl/dcigettext.c b/Build/source/utils/texinfo/intl/dcigettext.c
new file mode 100644
index 00000000000..35238e2cbdb
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/dcigettext.c
@@ -0,0 +1,1219 @@
+/* Implementation of the internal dcigettext function.
+ Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <locale.h>
+
+#ifdef _LIBC
+ /* Guess whether integer division by zero raises signal SIGFPE.
+ Set to 1 only if you know for sure. In case of doubt, set to 0. */
+# if defined __alpha__ || defined __arm__ || defined __i386__ \
+ || defined __m68k__ || defined __s390__
+# define INTDIV0_RAISES_SIGFPE 1
+# else
+# define INTDIV0_RAISES_SIGFPE 0
+# endif
+#endif
+#if !INTDIV0_RAISES_SIGFPE
+# include <signal.h>
+#endif
+
+#if defined HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+
+#include "gettextP.h"
+#include "plural-exp.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "hash-string.h"
+
+/* Thread safetyness. */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc. */
+# define __libc_lock_define_initialized(CLASS, NAME)
+# define __libc_lock_lock(NAME)
+# define __libc_lock_unlock(NAME)
+# define __libc_rwlock_define_initialized(CLASS, NAME)
+# define __libc_rwlock_rdlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* Alignment of types. */
+#if defined __GNUC__ && __GNUC__ >= 2
+# define alignof(TYPE) __alignof__ (TYPE)
+#else
+# define alignof(TYPE) \
+ ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+ names than the internal variables in GNU libc, otherwise programs
+ using libintl.a cannot be linked statically. */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define getcwd __getcwd
+# ifndef stpcpy
+# define stpcpy __stpcpy
+# endif
+# define tfind __tfind
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+# define getcwd(buf, max) getwd (buf)
+# else
+# if VMS
+# define getcwd(buf, max) (getcwd) (buf, max, 0)
+# else
+char *getcwd ();
+# endif
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy (char *dest, const char *src);
+# endif
+# ifndef HAVE_MEMPCPY
+static void *mempcpy (void *dest, const void *src, size_t n);
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try. */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h. */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+ PATH_MAX but might cause redefinition warnings when sys/param.h is
+ later included (as on MORE/BSD 4.3). */
+#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined PATH_MAX && defined _PC_PATH_MAX
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been. */
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+ it may be concatenated to a directory pathname.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+#endif
+
+/* This is the type used for the search tree where known translations
+ are stored. */
+struct known_translation_t
+{
+ /* Domain in which to search. */
+ char *domainname;
+
+ /* The category. */
+ int category;
+
+ /* State of the catalog counter at the point the string was found. */
+ int counter;
+
+ /* Catalog where the string was found. */
+ struct loaded_l10nfile *domain;
+
+ /* And finally the translation. */
+ const char *translation;
+ size_t translation_length;
+
+ /* Pointer to the string in question. */
+ char msgid[ZERO];
+};
+
+/* Root of the search tree with known translations. We can use this
+ only if the system provides the `tsearch' function family. */
+#if defined HAVE_TSEARCH || defined _LIBC
+# include <search.h>
+
+static void *root;
+
+# ifdef _LIBC
+# define tsearch __tsearch
+# endif
+
+/* Function to compare two entries in the table of known translations. */
+static int
+transcmp (const void *p1, const void *p2)
+{
+ const struct known_translation_t *s1;
+ const struct known_translation_t *s2;
+ int result;
+
+ s1 = (const struct known_translation_t *) p1;
+ s2 = (const struct known_translation_t *) p2;
+
+ result = strcmp (s1->msgid, s2->msgid);
+ if (result == 0)
+ {
+ result = strcmp (s1->domainname, s2->domainname);
+ if (result == 0)
+ /* We compare the category last (though this is the cheapest
+ operation) since it is hopefully always the same (namely
+ LC_MESSAGES). */
+ result = s1->category - s2->category;
+ }
+
+ return result;
+}
+#endif
+
+#ifndef INTVARDEF
+# define INTVARDEF(name)
+#endif
+#ifndef INTUSE
+# define INTUSE(name) name
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+ textdomain(3). The default value for this is "messages". */
+const char _nl_default_default_domain[] attribute_hidden = "messages";
+
+/* Value used as the default domain for gettext(3). */
+const char *_nl_current_default_domain attribute_hidden
+ = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs. */
+#if defined __EMX__
+extern const char _nl_default_dirname[];
+#else
+const char _nl_default_dirname[] = LOCALEDIR;
+INTVARDEF (_nl_default_dirname)
+#endif
+
+/* List with bindings of specific domains created by bindtextdomain()
+ calls. */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions. */
+static char *plural_lookup (struct loaded_l10nfile *domain,
+ unsigned long int n,
+ const char *translation, size_t translation_len)
+ internal_function;
+static const char *guess_category_value (int category,
+ const char *categoryname)
+ internal_function;
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# define category_to_name(category) _nl_category_names[category]
+#else
+static const char *category_to_name (int category) internal_function;
+#endif
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done. */
+# define freea(p) /* nothing */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+ void *address;
+ struct block_list *next;
+};
+# define ADD_BLOCK(list, addr) \
+ do { \
+ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+ /* If we cannot get a free block we cannot add the new element to \
+ the list. */ \
+ if (newp != NULL) { \
+ newp->address = (addr); \
+ newp->next = (list); \
+ (list) = newp; \
+ } \
+ } while (0)
+# define FREE_BLOCKS(list) \
+ do { \
+ while (list != NULL) { \
+ struct block_list *old = list; \
+ list = list->next; \
+ free (old->address); \
+ free (old); \
+ } \
+ } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+# define freea(p) free (p)
+#endif /* have alloca */
+
+
+#ifdef _LIBC
+/* List of blocks allocated for translations. */
+typedef struct transmem_list
+{
+ struct transmem_list *next;
+ char data[ZERO];
+} transmem_block_t;
+static struct transmem_list *transmem_list;
+#else
+typedef unsigned char transmem_block_t;
+#endif
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCIGETTEXT __dcigettext
+#else
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation. */
+#ifdef _LIBC
+__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden)
+#endif
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+ easier methods therefore we make a difference here. */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+# ifndef HAVE_GETUID
+# define getuid() 0
+# endif
+# ifndef HAVE_GETGID
+# define getgid() 0
+# endif
+# ifndef HAVE_GETEUID
+# define geteuid() getuid()
+# endif
+# ifndef HAVE_GETEGID
+# define getegid() getgid()
+# endif
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+ if (enable_secure == 0) \
+ { \
+ if (getuid () != geteuid () || getgid () != getegid ()) \
+ enable_secure = 1; \
+ else \
+ enable_secure = -1; \
+ }
+#endif
+
+/* Get the function to evaluate the plural expression. */
+#include "eval-plural.h"
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ CATEGORY locale and, if PLURAL is nonzero, search over string
+ depending on the plural form determined by N. */
+char *
+DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
+ int plural, unsigned long int n, int category)
+{
+#ifndef HAVE_ALLOCA
+ struct block_list *block_list = NULL;
+#endif
+ struct loaded_l10nfile *domain;
+ struct binding *binding;
+ const char *categoryname;
+ const char *categoryvalue;
+ char *dirname, *xdomainname;
+ char *single_locale;
+ char *retval;
+ size_t retlen;
+ int saved_errno;
+#if defined HAVE_TSEARCH || defined _LIBC
+ struct known_translation_t *search;
+ struct known_translation_t **foundp = NULL;
+ size_t msgid_len;
+#endif
+ size_t domainname_len;
+
+ /* If no real MSGID is given return NULL. */
+ if (msgid1 == NULL)
+ return NULL;
+
+#ifdef _LIBC
+ if (category < 0 || category >= __LC_LAST || category == LC_ALL)
+ /* Bogus. */
+ return (plural == 0
+ ? (char *) msgid1
+ /* Use the Germanic plural rule. */
+ : n == 1 ? (char *) msgid1 : (char *) msgid2);
+#endif
+
+ __libc_rwlock_rdlock (_nl_state_lock);
+
+ /* If DOMAINNAME is NULL, we are interested in the default domain. If
+ CATEGORY is not LC_MESSAGES this might not make much sense but the
+ definition left this undefined. */
+ if (domainname == NULL)
+ domainname = _nl_current_default_domain;
+
+ /* OS/2 specific: backward compatibility with older libintl versions */
+#ifdef LC_MESSAGES_COMPAT
+ if (category == LC_MESSAGES_COMPAT)
+ category = LC_MESSAGES;
+#endif
+
+#if defined HAVE_TSEARCH || defined _LIBC
+ msgid_len = strlen (msgid1) + 1;
+
+ /* Try to find the translation among those which we found at
+ some time. */
+ search = (struct known_translation_t *)
+ alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
+ memcpy (search->msgid, msgid1, msgid_len);
+ search->domainname = (char *) domainname;
+ search->category = category;
+
+ foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+ freea (search);
+ if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
+ {
+ /* Now deal with plural. */
+ if (plural)
+ retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation,
+ (*foundp)->translation_length);
+ else
+ retval = (char *) (*foundp)->translation;
+
+ __libc_rwlock_unlock (_nl_state_lock);
+ return retval;
+ }
+#endif
+
+ /* Preserve the `errno' value. */
+ saved_errno = errno;
+
+ /* See whether this is a SUID binary or not. */
+ DETERMINE_SECURE;
+
+ /* First find matching binding. */
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (binding == NULL)
+ dirname = (char *) INTUSE(_nl_default_dirname);
+ else if (IS_ABSOLUTE_PATH (binding->dirname))
+ dirname = binding->dirname;
+ else
+ {
+ /* We have a relative path. Make it absolute now. */
+ size_t dirname_len = strlen (binding->dirname) + 1;
+ size_t path_max;
+ char *ret;
+
+ path_max = (unsigned int) PATH_MAX;
+ path_max += 2; /* The getcwd docs say to do this. */
+
+ for (;;)
+ {
+ dirname = (char *) alloca (path_max + dirname_len);
+ ADD_BLOCK (block_list, dirname);
+
+ __set_errno (0);
+ ret = getcwd (dirname, path_max);
+ if (ret != NULL || errno != ERANGE)
+ break;
+
+ path_max += path_max / 2;
+ path_max += PATH_INCR;
+ }
+
+ if (ret == NULL)
+ /* We cannot get the current working directory. Don't signal an
+ error but simply return the default string. */
+ goto return_untranslated;
+
+ stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
+ }
+
+ /* Now determine the symbolic name of CATEGORY and its value. */
+ categoryname = category_to_name (category);
+ categoryvalue = guess_category_value (category, categoryname);
+
+ domainname_len = strlen (domainname);
+ xdomainname = (char *) alloca (strlen (categoryname)
+ + domainname_len + 5);
+ ADD_BLOCK (block_list, xdomainname);
+
+ stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+ domainname, domainname_len),
+ ".mo");
+
+ /* Creating working area. */
+ single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+ ADD_BLOCK (block_list, single_locale);
+
+
+ /* Search for the given string. This is a loop because we perhaps
+ got an ordered list of languages to consider for the translation. */
+ while (1)
+ {
+ /* Make CATEGORYVALUE point to the next element of the list. */
+ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+ ++categoryvalue;
+ if (categoryvalue[0] == '\0')
+ {
+ /* The whole contents of CATEGORYVALUE has been searched but
+ no valid entry has been found. We solve this situation
+ by implicitly appending a "C" entry, i.e. no translation
+ will take place. */
+ single_locale[0] = 'C';
+ single_locale[1] = '\0';
+ }
+ else
+ {
+ char *cp = single_locale;
+ while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+ *cp++ = *categoryvalue++;
+ *cp = '\0';
+
+ /* When this is a SUID binary we must not allow accessing files
+ outside the dedicated directories. */
+ if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale))
+ /* Ingore this entry. */
+ continue;
+ }
+
+ /* If the current locale value is C (or POSIX) we don't load a
+ domain. Return the MSGID. */
+ if (strcmp (single_locale, "C") == 0
+ || strcmp (single_locale, "POSIX") == 0)
+ break;
+
+ /* Find structure describing the message catalog matching the
+ DOMAINNAME and CATEGORY. */
+ domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
+
+ if (domain != NULL)
+ {
+ retval = _nl_find_msg (domain, binding, msgid1, &retlen);
+
+ if (retval == NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+ {
+ retval = _nl_find_msg (domain->successor[cnt], binding,
+ msgid1, &retlen);
+
+ if (retval != NULL)
+ {
+ domain = domain->successor[cnt];
+ break;
+ }
+ }
+ }
+
+ if (retval != NULL)
+ {
+ /* Found the translation of MSGID1 in domain DOMAIN:
+ starting at RETVAL, RETLEN bytes. */
+ FREE_BLOCKS (block_list);
+#if defined HAVE_TSEARCH || defined _LIBC
+ if (foundp == NULL)
+ {
+ /* Create a new entry and add it to the search tree. */
+ struct known_translation_t *newp;
+
+ newp = (struct known_translation_t *)
+ malloc (offsetof (struct known_translation_t, msgid)
+ + msgid_len + domainname_len + 1);
+ if (newp != NULL)
+ {
+ newp->domainname =
+ mempcpy (newp->msgid, msgid1, msgid_len);
+ memcpy (newp->domainname, domainname, domainname_len + 1);
+ newp->category = category;
+ newp->counter = _nl_msg_cat_cntr;
+ newp->domain = domain;
+ newp->translation = retval;
+ newp->translation_length = retlen;
+
+ /* Insert the entry in the search tree. */
+ foundp = (struct known_translation_t **)
+ tsearch (newp, &root, transcmp);
+ if (foundp == NULL
+ || __builtin_expect (*foundp != newp, 0))
+ /* The insert failed. */
+ free (newp);
+ }
+ }
+ else
+ {
+ /* We can update the existing entry. */
+ (*foundp)->counter = _nl_msg_cat_cntr;
+ (*foundp)->domain = domain;
+ (*foundp)->translation = retval;
+ (*foundp)->translation_length = retlen;
+ }
+#endif
+ __set_errno (saved_errno);
+
+ /* Now deal with plural. */
+ if (plural)
+ retval = plural_lookup (domain, n, retval, retlen);
+
+ __libc_rwlock_unlock (_nl_state_lock);
+ return retval;
+ }
+ }
+ }
+
+ return_untranslated:
+ /* Return the untranslated MSGID. */
+ FREE_BLOCKS (block_list);
+ __libc_rwlock_unlock (_nl_state_lock);
+#ifndef _LIBC
+ if (!ENABLE_SECURE)
+ {
+ extern void _nl_log_untranslated (const char *logfilename,
+ const char *domainname,
+ const char *msgid1, const char *msgid2,
+ int plural);
+ const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED");
+
+ if (logfilename != NULL && logfilename[0] != '\0')
+ _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural);
+ }
+#endif
+ __set_errno (saved_errno);
+ return (plural == 0
+ ? (char *) msgid1
+ /* Use the Germanic plural rule. */
+ : n == 1 ? (char *) msgid1 : (char *) msgid2);
+}
+
+
+char *
+internal_function
+_nl_find_msg (struct loaded_l10nfile *domain_file,
+ struct binding *domainbinding, const char *msgid,
+ size_t *lengthp)
+{
+ struct loaded_domain *domain;
+ nls_uint32 nstrings;
+ size_t act;
+ char *result;
+ size_t resultlen;
+
+ if (domain_file->decided == 0)
+ _nl_load_domain (domain_file, domainbinding);
+
+ if (domain_file->data == NULL)
+ return NULL;
+
+ domain = (struct loaded_domain *) domain_file->data;
+
+ nstrings = domain->nstrings;
+
+ /* Locate the MSGID and its translation. */
+ if (domain->hash_tab != NULL)
+ {
+ /* Use the hashing table. */
+ nls_uint32 len = strlen (msgid);
+ nls_uint32 hash_val = hash_string (msgid);
+ nls_uint32 idx = hash_val % domain->hash_size;
+ nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+
+ while (1)
+ {
+ nls_uint32 nstr =
+ W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
+
+ if (nstr == 0)
+ /* Hash table entry is empty. */
+ return NULL;
+
+ nstr--;
+
+ /* Compare msgid with the original string at index nstr.
+ We compare the lengths with >=, not ==, because plural entries
+ are represented by strings with an embedded NUL. */
+ if (nstr < nstrings
+ ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len
+ && (strcmp (msgid,
+ domain->data + W (domain->must_swap,
+ domain->orig_tab[nstr].offset))
+ == 0)
+ : domain->orig_sysdep_tab[nstr - nstrings].length > len
+ && (strcmp (msgid,
+ domain->orig_sysdep_tab[nstr - nstrings].pointer)
+ == 0))
+ {
+ act = nstr;
+ goto found;
+ }
+
+ if (idx >= domain->hash_size - incr)
+ idx -= domain->hash_size - incr;
+ else
+ idx += incr;
+ }
+ /* NOTREACHED */
+ }
+ else
+ {
+ /* Try the default method: binary search in the sorted array of
+ messages. */
+ size_t top, bottom;
+
+ bottom = 0;
+ top = nstrings;
+ while (bottom < top)
+ {
+ int cmp_val;
+
+ act = (bottom + top) / 2;
+ cmp_val = strcmp (msgid, (domain->data
+ + W (domain->must_swap,
+ domain->orig_tab[act].offset)));
+ if (cmp_val < 0)
+ top = act;
+ else if (cmp_val > 0)
+ bottom = act + 1;
+ else
+ goto found;
+ }
+ /* No translation was found. */
+ return NULL;
+ }
+
+ found:
+ /* The translation was found at index ACT. If we have to convert the
+ string to use a different character set, this is the time. */
+ if (act < nstrings)
+ {
+ result = (char *)
+ (domain->data + W (domain->must_swap, domain->trans_tab[act].offset));
+ resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
+ }
+ else
+ {
+ result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer;
+ resultlen = domain->trans_sysdep_tab[act - nstrings].length;
+ }
+
+#if defined _LIBC || HAVE_ICONV
+ if (domain->codeset_cntr
+ != (domainbinding != NULL ? domainbinding->codeset_cntr : 0))
+ {
+ /* The domain's codeset has changed through bind_textdomain_codeset()
+ since the message catalog was initialized or last accessed. We
+ have to reinitialize the converter. */
+ _nl_free_domain_conv (domain);
+ _nl_init_domain_conv (domain_file, domain, domainbinding);
+ }
+
+ if (
+# ifdef _LIBC
+ domain->conv != (__gconv_t) -1
+# else
+# if HAVE_ICONV
+ domain->conv != (iconv_t) -1
+# endif
+# endif
+ )
+ {
+ /* We are supposed to do a conversion. First allocate an
+ appropriate table with the same structure as the table
+ of translations in the file, where we can put the pointers
+ to the converted strings in.
+ There is a slight complication with plural entries. They
+ are represented by consecutive NUL terminated strings. We
+ handle this case by converting RESULTLEN bytes, including
+ NULs. */
+
+ if (domain->conv_tab == NULL
+ && ((domain->conv_tab =
+ (char **) calloc (nstrings + domain->n_sysdep_strings,
+ sizeof (char *)))
+ == NULL))
+ /* Mark that we didn't succeed allocating a table. */
+ domain->conv_tab = (char **) -1;
+
+ if (__builtin_expect (domain->conv_tab == (char **) -1, 0))
+ /* Nothing we can do, no more memory. */
+ goto converted;
+
+ if (domain->conv_tab[act] == NULL)
+ {
+ /* We haven't used this string so far, so it is not
+ translated yet. Do this now. */
+ /* We use a bit more efficient memory handling.
+ We allocate always larger blocks which get used over
+ time. This is faster than many small allocations. */
+ __libc_lock_define_initialized (static, lock)
+# define INITIAL_BLOCK_SIZE 4080
+ static unsigned char *freemem;
+ static size_t freemem_size;
+
+ const unsigned char *inbuf;
+ unsigned char *outbuf;
+ int malloc_count;
+# ifndef _LIBC
+ transmem_block_t *transmem_list = NULL;
+# endif
+
+ __libc_lock_lock (lock);
+
+ inbuf = (const unsigned char *) result;
+ outbuf = freemem + sizeof (size_t);
+
+ malloc_count = 0;
+ while (1)
+ {
+ transmem_block_t *newmem;
+# ifdef _LIBC
+ size_t non_reversible;
+ int res;
+
+ if (freemem_size < sizeof (size_t))
+ goto resize_freemem;
+
+ res = __gconv (domain->conv,
+ &inbuf, inbuf + resultlen,
+ &outbuf,
+ outbuf + freemem_size - sizeof (size_t),
+ &non_reversible);
+
+ if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+ break;
+
+ if (res != __GCONV_FULL_OUTPUT)
+ {
+ __libc_lock_unlock (lock);
+ goto converted;
+ }
+
+ inbuf = result;
+# else
+# if HAVE_ICONV
+ const char *inptr = (const char *) inbuf;
+ size_t inleft = resultlen;
+ char *outptr = (char *) outbuf;
+ size_t outleft;
+
+ if (freemem_size < sizeof (size_t))
+ goto resize_freemem;
+
+ outleft = freemem_size - sizeof (size_t);
+ if (iconv (domain->conv,
+ (ICONV_CONST char **) &inptr, &inleft,
+ &outptr, &outleft)
+ != (size_t) (-1))
+ {
+ outbuf = (unsigned char *) outptr;
+ break;
+ }
+ if (errno != E2BIG)
+ {
+ __libc_lock_unlock (lock);
+ goto converted;
+ }
+# endif
+# endif
+
+ resize_freemem:
+ /* We must allocate a new buffer or resize the old one. */
+ if (malloc_count > 0)
+ {
+ ++malloc_count;
+ freemem_size = malloc_count * INITIAL_BLOCK_SIZE;
+ newmem = (transmem_block_t *) realloc (transmem_list,
+ freemem_size);
+# ifdef _LIBC
+ if (newmem != NULL)
+ transmem_list = transmem_list->next;
+ else
+ {
+ struct transmem_list *old = transmem_list;
+
+ transmem_list = transmem_list->next;
+ free (old);
+ }
+# endif
+ }
+ else
+ {
+ malloc_count = 1;
+ freemem_size = INITIAL_BLOCK_SIZE;
+ newmem = (transmem_block_t *) malloc (freemem_size);
+ }
+ if (__builtin_expect (newmem == NULL, 0))
+ {
+ freemem = NULL;
+ freemem_size = 0;
+ __libc_lock_unlock (lock);
+ goto converted;
+ }
+
+# ifdef _LIBC
+ /* Add the block to the list of blocks we have to free
+ at some point. */
+ newmem->next = transmem_list;
+ transmem_list = newmem;
+
+ freemem = newmem->data;
+ freemem_size -= offsetof (struct transmem_list, data);
+# else
+ transmem_list = newmem;
+ freemem = newmem;
+# endif
+
+ outbuf = freemem + sizeof (size_t);
+ }
+
+ /* We have now in our buffer a converted string. Put this
+ into the table of conversions. */
+ *(size_t *) freemem = outbuf - freemem - sizeof (size_t);
+ domain->conv_tab[act] = (char *) freemem;
+ /* Shrink freemem, but keep it aligned. */
+ freemem_size -= outbuf - freemem;
+ freemem = outbuf;
+ freemem += freemem_size & (alignof (size_t) - 1);
+ freemem_size = freemem_size & ~ (alignof (size_t) - 1);
+
+ __libc_lock_unlock (lock);
+ }
+
+ /* Now domain->conv_tab[act] contains the translation of all
+ the plural variants. */
+ result = domain->conv_tab[act] + sizeof (size_t);
+ resultlen = *(size_t *) domain->conv_tab[act];
+ }
+
+ converted:
+ /* The result string is converted. */
+
+#endif /* _LIBC || HAVE_ICONV */
+
+ *lengthp = resultlen;
+ return result;
+}
+
+
+/* Look up a plural variant. */
+static char *
+internal_function
+plural_lookup (struct loaded_l10nfile *domain, unsigned long int n,
+ const char *translation, size_t translation_len)
+{
+ struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
+ unsigned long int index;
+ const char *p;
+
+ index = plural_eval (domaindata->plural, n);
+ if (index >= domaindata->nplurals)
+ /* This should never happen. It means the plural expression and the
+ given maximum value do not match. */
+ index = 0;
+
+ /* Skip INDEX strings at TRANSLATION. */
+ p = translation;
+ while (index-- > 0)
+ {
+#ifdef _LIBC
+ p = __rawmemchr (p, '\0');
+#else
+ p = strchr (p, '\0');
+#endif
+ /* And skip over the NUL byte. */
+ p++;
+
+ if (p >= translation + translation_len)
+ /* This should never happen. It means the plural expression
+ evaluated to a value larger than the number of variants
+ available for MSGID1. */
+ return (char *) translation;
+ }
+ return (char *) p;
+}
+
+#ifndef _LIBC
+/* Return string representation of locale CATEGORY. */
+static const char *
+internal_function
+category_to_name (int category)
+{
+ const char *retval;
+
+ switch (category)
+ {
+#ifdef LC_COLLATE
+ case LC_COLLATE:
+ retval = "LC_COLLATE";
+ break;
+#endif
+#ifdef LC_CTYPE
+ case LC_CTYPE:
+ retval = "LC_CTYPE";
+ break;
+#endif
+#ifdef LC_MONETARY
+ case LC_MONETARY:
+ retval = "LC_MONETARY";
+ break;
+#endif
+#ifdef LC_NUMERIC
+ case LC_NUMERIC:
+ retval = "LC_NUMERIC";
+ break;
+#endif
+#ifdef LC_TIME
+ case LC_TIME:
+ retval = "LC_TIME";
+ break;
+#endif
+#ifdef LC_MESSAGES
+ case LC_MESSAGES:
+ retval = "LC_MESSAGES";
+ break;
+#endif
+#ifdef LC_RESPONSE
+ case LC_RESPONSE:
+ retval = "LC_RESPONSE";
+ break;
+#endif
+#ifdef LC_ALL
+ case LC_ALL:
+ /* This might not make sense but is perhaps better than any other
+ value. */
+ retval = "LC_ALL";
+ break;
+#endif
+ default:
+ /* If you have a better idea for a default value let me know. */
+ retval = "LC_XXX";
+ }
+
+ return retval;
+}
+#endif
+
+/* Guess value of current locale from value of the environment variables. */
+static const char *
+internal_function
+guess_category_value (int category, const char *categoryname)
+{
+ const char *language;
+ const char *retval;
+
+ /* The highest priority value is the `LANGUAGE' environment
+ variable. But we don't use the value if the currently selected
+ locale is the C locale. This is a GNU extension. */
+ language = getenv ("LANGUAGE");
+ if (language != NULL && language[0] == '\0')
+ language = NULL;
+
+ /* We have to proceed with the POSIX methods of looking to `LC_ALL',
+ `LC_xxx', and `LANG'. On some systems this can be done by the
+ `setlocale' function itself. */
+#ifdef _LIBC
+ retval = __current_locale_name (category);
+#else
+ retval = _nl_locale_name (category, categoryname);
+#endif
+
+ /* Ignore LANGUAGE if the locale is set to "C" because
+ 1. "C" locale usually uses the ASCII encoding, and most international
+ messages use non-ASCII characters. These characters get displayed
+ as question marks (if using glibc's iconv()) or as invalid 8-bit
+ characters (because other iconv()s refuse to convert most non-ASCII
+ characters to ASCII). In any case, the output is ugly.
+ 2. The precise output of some programs in the "C" locale is specified
+ by POSIX and should not depend on environment variables like
+ "LANGUAGE". We allow such programs to use gettext(). */
+ return language != NULL && strcmp (retval, "C") != 0 ? language : retval;
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (char *dest, const char *src)
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
+
+#if !_LIBC && !HAVE_MEMPCPY
+static void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+ return (void *) ((char *) memcpy (dest, src, n) + n);
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+ program's end. */
+libc_freeres_fn (free_mem)
+{
+ void *old;
+
+ while (_nl_domain_bindings != NULL)
+ {
+ struct binding *oldp = _nl_domain_bindings;
+ _nl_domain_bindings = _nl_domain_bindings->next;
+ if (oldp->dirname != INTUSE(_nl_default_dirname))
+ /* Yes, this is a pointer comparison. */
+ free (oldp->dirname);
+ free (oldp->codeset);
+ free (oldp);
+ }
+
+ if (_nl_current_default_domain != _nl_default_default_domain)
+ /* Yes, again a pointer comparison. */
+ free ((char *) _nl_current_default_domain);
+
+ /* Remove the search tree with the known translations. */
+ __tdestroy (root, free);
+ root = NULL;
+
+ while (transmem_list != NULL)
+ {
+ old = transmem_list;
+ transmem_list = transmem_list->next;
+ free (old);
+ }
+}
+#endif
diff --git a/Build/source/utils/texinfo/intl/dcngettext.c b/Build/source/utils/texinfo/intl/dcngettext.c
new file mode 100644
index 00000000000..48a3e09e091
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/dcngettext.c
@@ -0,0 +1,57 @@
+/* Implementation of the dcngettext(3) function.
+ Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCNGETTEXT __dcngettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCNGETTEXT libintl_dcngettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+char *
+DCNGETTEXT (const char *domainname,
+ const char *msgid1, const char *msgid2, unsigned long int n,
+ int category)
+{
+ return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dcngettext, dcngettext);
+#endif
diff --git a/Build/source/utils/texinfo/intl/dgettext.c b/Build/source/utils/texinfo/intl/dgettext.c
new file mode 100644
index 00000000000..b64b0f5d39d
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/dgettext.c
@@ -0,0 +1,58 @@
+/* Implementation of the dgettext(3) function.
+ Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+#include <locale.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define DGETTEXT libintl_dgettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+ LC_MESSAGES locale. */
+char *
+DGETTEXT (const char *domainname, const char *msgid)
+{
+ return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/Build/source/utils/texinfo/intl/dngettext.c b/Build/source/utils/texinfo/intl/dngettext.c
new file mode 100644
index 00000000000..7815637f045
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/dngettext.c
@@ -0,0 +1,59 @@
+/* Implementation of the dngettext(3) function.
+ Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+#include <locale.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DNGETTEXT __dngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define DNGETTEXT libintl_dngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+ LC_MESSAGES locale and skip message according to the plural form. */
+char *
+DNGETTEXT (const char *domainname,
+ const char *msgid1, const char *msgid2, unsigned long int n)
+{
+ return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dngettext, dngettext);
+#endif
diff --git a/Build/source/utils/texinfo/intl/eval-plural.h b/Build/source/utils/texinfo/intl/eval-plural.h
new file mode 100644
index 00000000000..01bd5af5fc4
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/eval-plural.h
@@ -0,0 +1,108 @@
+/* Plural expression evaluation.
+ Copyright (C) 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef STATIC
+#define STATIC static
+#endif
+
+/* Evaluate the plural expression and return an index value. */
+STATIC
+unsigned long int
+internal_function
+plural_eval (struct expression *pexp, unsigned long int n)
+{
+ switch (pexp->nargs)
+ {
+ case 0:
+ switch (pexp->operation)
+ {
+ case var:
+ return n;
+ case num:
+ return pexp->val.num;
+ default:
+ break;
+ }
+ /* NOTREACHED */
+ break;
+ case 1:
+ {
+ /* pexp->operation must be lnot. */
+ unsigned long int arg = plural_eval (pexp->val.args[0], n);
+ return ! arg;
+ }
+ case 2:
+ {
+ unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
+ if (pexp->operation == lor)
+ return leftarg || plural_eval (pexp->val.args[1], n);
+ else if (pexp->operation == land)
+ return leftarg && plural_eval (pexp->val.args[1], n);
+ else
+ {
+ unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
+
+ switch (pexp->operation)
+ {
+ case mult:
+ return leftarg * rightarg;
+ case divide:
+#if !INTDIV0_RAISES_SIGFPE
+ if (rightarg == 0)
+ raise (SIGFPE);
+#endif
+ return leftarg / rightarg;
+ case module:
+#if !INTDIV0_RAISES_SIGFPE
+ if (rightarg == 0)
+ raise (SIGFPE);
+#endif
+ return leftarg % rightarg;
+ case plus:
+ return leftarg + rightarg;
+ case minus:
+ return leftarg - rightarg;
+ case less_than:
+ return leftarg < rightarg;
+ case greater_than:
+ return leftarg > rightarg;
+ case less_or_equal:
+ return leftarg <= rightarg;
+ case greater_or_equal:
+ return leftarg >= rightarg;
+ case equal:
+ return leftarg == rightarg;
+ case not_equal:
+ return leftarg != rightarg;
+ default:
+ break;
+ }
+ }
+ /* NOTREACHED */
+ break;
+ }
+ case 3:
+ {
+ /* pexp->operation must be qmop. */
+ unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
+ return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
+ }
+ }
+ /* NOTREACHED */
+ return 0;
+}
diff --git a/Build/source/utils/texinfo/intl/explodename.c b/Build/source/utils/texinfo/intl/explodename.c
new file mode 100644
index 00000000000..52c25e7276a
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/explodename.c
@@ -0,0 +1,185 @@
+/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+char *
+_nl_find_language (const char *name)
+{
+ while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
+ && name[0] != '+' && name[0] != ',')
+ ++name;
+
+ return (char *) name;
+}
+
+
+int
+_nl_explode_name (char *name,
+ const char **language, const char **modifier,
+ const char **territory, const char **codeset,
+ const char **normalized_codeset, const char **special,
+ const char **sponsor, const char **revision)
+{
+ enum { undecided, xpg, cen } syntax;
+ char *cp;
+ int mask;
+
+ *modifier = NULL;
+ *territory = NULL;
+ *codeset = NULL;
+ *normalized_codeset = NULL;
+ *special = NULL;
+ *sponsor = NULL;
+ *revision = NULL;
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = 0;
+ syntax = undecided;
+ *language = cp = name;
+ cp = _nl_find_language (*language);
+
+ if (*language == cp)
+ /* This does not make sense: language has to be specified. Use
+ this entry as it is without exploding. Perhaps it is an alias. */
+ cp = strchr (*language, '\0');
+ else if (cp[0] == '_')
+ {
+ /* Next is the territory. */
+ cp[0] = '\0';
+ *territory = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+ && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= TERRITORY;
+
+ if (cp[0] == '.')
+ {
+ /* Next is the codeset. */
+ syntax = xpg;
+ cp[0] = '\0';
+ *codeset = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '@')
+ ++cp;
+
+ mask |= XPG_CODESET;
+
+ if (*codeset != cp && (*codeset)[0] != '\0')
+ {
+ *normalized_codeset = _nl_normalize_codeset (*codeset,
+ cp - *codeset);
+ if (strcmp (*codeset, *normalized_codeset) == 0)
+ free ((char *) *normalized_codeset);
+ else
+ mask |= XPG_NORM_CODESET;
+ }
+ }
+ }
+
+ if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+ {
+ /* Next is the modifier. */
+ syntax = cp[0] == '@' ? xpg : cen;
+ cp[0] = '\0';
+ *modifier = ++cp;
+
+ while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+ && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= XPG_MODIFIER | CEN_AUDIENCE;
+ }
+
+ if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+ {
+ syntax = cen;
+
+ if (cp[0] == '+')
+ {
+ /* Next is special application (CEN syntax). */
+ cp[0] = '\0';
+ *special = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPECIAL;
+ }
+
+ if (cp[0] == ',')
+ {
+ /* Next is sponsor (CEN syntax). */
+ cp[0] = '\0';
+ *sponsor = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPONSOR;
+ }
+
+ if (cp[0] == '_')
+ {
+ /* Next is revision (CEN syntax). */
+ cp[0] = '\0';
+ *revision = ++cp;
+
+ mask |= CEN_REVISION;
+ }
+ }
+
+ /* For CEN syntax values it might be important to have the
+ separator character in the file name, not for XPG syntax. */
+ if (syntax == xpg)
+ {
+ if (*territory != NULL && (*territory)[0] == '\0')
+ mask &= ~TERRITORY;
+
+ if (*codeset != NULL && (*codeset)[0] == '\0')
+ mask &= ~XPG_CODESET;
+
+ if (*modifier != NULL && (*modifier)[0] == '\0')
+ mask &= ~XPG_MODIFIER;
+ }
+
+ return mask;
+}
diff --git a/Build/source/utils/texinfo/intl/finddomain.c b/Build/source/utils/texinfo/intl/finddomain.c
new file mode 100644
index 00000000000..4992a8c9e33
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/finddomain.c
@@ -0,0 +1,192 @@
+/* Handle list of needed message catalogs
+ Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@gnu.org>, 1995.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains. */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+ the DOMAINNAME and CATEGORY parameters with respect to the currently
+ established bindings. */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (const char *dirname, char *locale,
+ const char *domainname, struct binding *domainbinding)
+{
+ struct loaded_l10nfile *retval;
+ const char *language;
+ const char *modifier;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *alias_value;
+ int mask;
+
+ /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+ language[_territory[.codeset]][@modifier]
+
+ and six parts for the CEN syntax:
+
+ language[_territory][+audience][+special][,[sponsor][_revision]]
+
+ Beside the first part all of them are allowed to be missing. If
+ the full specified locale is not found, the less specific one are
+ looked for. The various parts will be stripped off according to
+ the following order:
+ (1) revision
+ (2) sponsor
+ (3) special
+ (4) codeset
+ (5) normalized codeset
+ (6) territory
+ (7) audience/modifier
+ */
+
+ /* If we have already tested for this locale entry there has to
+ be one data set in the list of loaded domains. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, 0, locale, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, domainname, 0);
+ if (retval != NULL)
+ {
+ /* We know something about this locale. */
+ int cnt;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval, domainbinding);
+
+ if (retval->data != NULL)
+ return retval;
+
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt], domainbinding);
+
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ return cnt >= 0 ? retval : NULL;
+ /* NOTREACHED */
+ }
+
+ /* See whether the locale value is an alias. If yes its value
+ *overwrites* the alias name. No test for the original value is
+ done. */
+ alias_value = _nl_expand_alias (locale);
+ if (alias_value != NULL)
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ locale = strdup (alias_value);
+ if (locale == NULL)
+ return NULL;
+#else
+ size_t len = strlen (alias_value) + 1;
+ locale = (char *) malloc (len);
+ if (locale == NULL)
+ return NULL;
+
+ memcpy (locale, alias_value, len);
+#endif
+ }
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = _nl_explode_name (locale, &language, &modifier, &territory,
+ &codeset, &normalized_codeset, &special,
+ &sponsor, &revision);
+
+ /* Create all possible locale entries which might be interested in
+ generalization. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, mask, language, territory,
+ codeset, normalized_codeset, modifier, special,
+ sponsor, revision, domainname, 1);
+ if (retval == NULL)
+ /* This means we are out of core. */
+ return NULL;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval, domainbinding);
+ if (retval->data == NULL)
+ {
+ int cnt;
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt], domainbinding);
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ }
+
+ /* The room for an alias was dynamically allocated. Free it now. */
+ if (alias_value != NULL)
+ free (locale);
+
+ /* The space for normalized_codeset is dynamically allocated. Free it. */
+ if (mask & XPG_NORM_CODESET)
+ free ((void *) normalized_codeset);
+
+ return retval;
+}
+
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+ struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+ while (runp != NULL)
+ {
+ struct loaded_l10nfile *here = runp;
+ if (runp->data != NULL)
+ _nl_unload_domain ((struct loaded_domain *) runp->data);
+ runp = runp->next;
+ free ((char *) here->filename);
+ free (here);
+ }
+}
+#endif
diff --git a/Build/source/utils/texinfo/intl/gettext.c b/Build/source/utils/texinfo/intl/gettext.c
new file mode 100644
index 00000000000..92c42faa7c5
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/gettext.c
@@ -0,0 +1,63 @@
+/* Implementation of gettext(3) function.
+ Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h> /* Just for NULL. */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define GETTEXT libintl_gettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+char *
+GETTEXT (const char *msgid)
+{
+ return DCGETTEXT (NULL, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/Build/source/utils/texinfo/intl/gettextP.h b/Build/source/utils/texinfo/intl/gettextP.h
new file mode 100644
index 00000000000..4d66c3de314
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/gettextP.h
@@ -0,0 +1,215 @@
+/* Header describing internals of libintl library.
+ Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include <stddef.h> /* Get size_t. */
+
+#ifdef _LIBC
+# include "../iconv/gconv_int.h"
+#else
+# if HAVE_ICONV
+# include <iconv.h>
+# endif
+#endif
+
+#include "loadinfo.h"
+
+#include "gmo.h" /* Get nls_uint32. */
+
+/* @@ end of prolog @@ */
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+ almost always true or almost always false. */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static inline nls_uint32
+SWAP (i)
+ nls_uint32 i;
+{
+ return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+/* In-memory representation of system dependent string. */
+struct sysdep_string_desc
+{
+ /* Length of addressed string, including the trailing NUL. */
+ size_t length;
+ /* Pointer to addressed string. */
+ const char *pointer;
+};
+
+/* The representation of an opened message catalog. */
+struct loaded_domain
+{
+ /* Pointer to memory containing the .mo file. */
+ const char *data;
+ /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */
+ int use_mmap;
+ /* Size of mmap()ed memory. */
+ size_t mmap_size;
+ /* 1 if the .mo file uses a different endianness than this machine. */
+ int must_swap;
+ /* Pointer to additional malloc()ed memory. */
+ void *malloced;
+
+ /* Number of static strings pairs. */
+ nls_uint32 nstrings;
+ /* Pointer to descriptors of original strings in the file. */
+ const struct string_desc *orig_tab;
+ /* Pointer to descriptors of translated strings in the file. */
+ const struct string_desc *trans_tab;
+
+ /* Number of system dependent strings pairs. */
+ nls_uint32 n_sysdep_strings;
+ /* Pointer to descriptors of original sysdep strings. */
+ const struct sysdep_string_desc *orig_sysdep_tab;
+ /* Pointer to descriptors of translated sysdep strings. */
+ const struct sysdep_string_desc *trans_sysdep_tab;
+
+ /* Size of hash table. */
+ nls_uint32 hash_size;
+ /* Pointer to hash table. */
+ const nls_uint32 *hash_tab;
+ /* 1 if the hash table uses a different endianness than this machine. */
+ int must_swap_hash_tab;
+
+ int codeset_cntr;
+#ifdef _LIBC
+ __gconv_t conv;
+#else
+# if HAVE_ICONV
+ iconv_t conv;
+# endif
+#endif
+ char **conv_tab;
+
+ struct expression *plural;
+ unsigned long int nplurals;
+};
+
+/* We want to allocate a string at the end of the struct. But ISO C
+ doesn't allow zero sized arrays. */
+#ifdef __GNUC__
+# define ZERO 0
+#else
+# define ZERO 1
+#endif
+
+/* A set of settings bound to a message domain. Used to store settings
+ from bindtextdomain() and bind_textdomain_codeset(). */
+struct binding
+{
+ struct binding *next;
+ char *dirname;
+ int codeset_cntr; /* Incremented each time codeset changes. */
+ char *codeset;
+ char domainname[ZERO];
+};
+
+/* A counter which is incremented each time some previous translations
+ become invalid.
+ This variable is part of the external ABI of the GNU libintl. */
+extern int _nl_msg_cat_cntr;
+
+#ifndef _LIBC
+const char *_nl_locale_name (int category, const char *categoryname);
+#endif
+
+struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale,
+ const char *__domainname,
+ struct binding *__domainbinding)
+ internal_function;
+void _nl_load_domain (struct loaded_l10nfile *__domain,
+ struct binding *__domainbinding)
+ internal_function;
+void _nl_unload_domain (struct loaded_domain *__domain)
+ internal_function;
+const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file,
+ struct loaded_domain *__domain,
+ struct binding *__domainbinding)
+ internal_function;
+void _nl_free_domain_conv (struct loaded_domain *__domain)
+ internal_function;
+
+char *_nl_find_msg (struct loaded_l10nfile *domain_file,
+ struct binding *domainbinding, const char *msgid,
+ size_t *lengthp)
+ internal_function;
+
+#ifdef _LIBC
+extern char *__gettext (const char *__msgid);
+extern char *__dgettext (const char *__domainname, const char *__msgid);
+extern char *__dcgettext (const char *__domainname, const char *__msgid,
+ int __category);
+extern char *__ngettext (const char *__msgid1, const char *__msgid2,
+ unsigned long int __n);
+extern char *__dngettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ unsigned long int n);
+extern char *__dcngettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ unsigned long int __n, int __category);
+extern char *__dcigettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ int __plural, unsigned long int __n,
+ int __category);
+extern char *__textdomain (const char *__domainname);
+extern char *__bindtextdomain (const char *__domainname,
+ const char *__dirname);
+extern char *__bind_textdomain_codeset (const char *__domainname,
+ const char *__codeset);
+#else
+/* Declare the exported libintl_* functions, in a way that allows us to
+ call them under their real name. */
+# undef _INTL_REDIRECT_INLINE
+# undef _INTL_REDIRECT_MACROS
+# define _INTL_REDIRECT_MACROS
+# include "libgnuintl.h"
+extern char *libintl_dcigettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ int __plural, unsigned long int __n,
+ int __category);
+#endif
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h */
diff --git a/Build/source/utils/texinfo/intl/gmo.h b/Build/source/utils/texinfo/intl/gmo.h
new file mode 100644
index 00000000000..e7c9cc14b5d
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/gmo.h
@@ -0,0 +1,149 @@
+/* Description of GNU message catalog format: general file layout.
+ Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <limits.h>
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format. */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format. */
+#define MO_REVISION_NUMBER 0
+#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
+ when cross-compiling. */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+# else
+ /* The following line is intended to throw an error. Using #error is
+ not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format. */
+struct mo_file_header
+{
+ /* The magic number. */
+ nls_uint32 magic;
+ /* The revision number of the file format. */
+ nls_uint32 revision;
+
+ /* The following are only used in .mo files with major revision 0 or 1. */
+
+ /* The number of strings pairs. */
+ nls_uint32 nstrings;
+ /* Offset of table with start offsets of original strings. */
+ nls_uint32 orig_tab_offset;
+ /* Offset of table with start offsets of translated strings. */
+ nls_uint32 trans_tab_offset;
+ /* Size of hash table. */
+ nls_uint32 hash_tab_size;
+ /* Offset of first hash table entry. */
+ nls_uint32 hash_tab_offset;
+
+ /* The following are only used in .mo files with minor revision >= 1. */
+
+ /* The number of system dependent segments. */
+ nls_uint32 n_sysdep_segments;
+ /* Offset of table describing system dependent segments. */
+ nls_uint32 sysdep_segments_offset;
+ /* The number of system dependent strings pairs. */
+ nls_uint32 n_sysdep_strings;
+ /* Offset of table with start offsets of original sysdep strings. */
+ nls_uint32 orig_sysdep_tab_offset;
+ /* Offset of table with start offsets of translated sysdep strings. */
+ nls_uint32 trans_sysdep_tab_offset;
+};
+
+/* Descriptor for static string contained in the binary .mo file. */
+struct string_desc
+{
+ /* Length of addressed string, not including the trailing NUL. */
+ nls_uint32 length;
+ /* Offset of string in file. */
+ nls_uint32 offset;
+};
+
+/* The following are only used in .mo files with minor revision >= 1. */
+
+/* Descriptor for system dependent string segment. */
+struct sysdep_segment
+{
+ /* Length of addressed string, including the trailing NUL. */
+ nls_uint32 length;
+ /* Offset of string in file. */
+ nls_uint32 offset;
+};
+
+/* Descriptor for system dependent string. */
+struct sysdep_string
+{
+ /* Offset of static string segments in file. */
+ nls_uint32 offset;
+ /* Alternating sequence of static and system dependent segments.
+ The last segment is a static segment, including the trailing NUL. */
+ struct segment_pair
+ {
+ /* Size of static segment. */
+ nls_uint32 segsize;
+ /* Reference to system dependent string segment, or ~0 at the end. */
+ nls_uint32 sysdepref;
+ } segments[1];
+};
+
+/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF,
+ regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */
+#define SEGMENTS_END ((nls_uint32) ~0)
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettext.h */
diff --git a/Build/source/utils/texinfo/intl/hash-string.h b/Build/source/utils/texinfo/intl/hash-string.h
new file mode 100644
index 00000000000..093e3b1c103
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/hash-string.h
@@ -0,0 +1,48 @@
+/* Description of GNU message catalog format: string hashing function.
+ Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* @@ end of prolog @@ */
+
+/* We assume to have `unsigned long int' value with at least 32 bits. */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+ [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+ 1986, 1987 Bell Telephone Laboratories, Inc.] */
+static inline unsigned long int
+hash_string (const char *str_param)
+{
+ unsigned long int hval, g;
+ const char *str = str_param;
+
+ /* Compute the hash value for the given string. */
+ hval = 0;
+ while (*str != '\0')
+ {
+ hval <<= 4;
+ hval += (unsigned char) *str++;
+ g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+ if (g != 0)
+ {
+ hval ^= g >> (HASHWORDBITS - 8);
+ hval ^= g;
+ }
+ }
+ return hval;
+}
diff --git a/Build/source/utils/texinfo/intl/intl-compat.c b/Build/source/utils/texinfo/intl/intl-compat.c
new file mode 100644
index 00000000000..96f9d955d11
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/intl-compat.c
@@ -0,0 +1,131 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+ Library.
+ Copyright (C) 1995, 2000-2003 Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* This file redirects the gettext functions (without prefix) to those
+ defined in the included GNU libintl library (with "libintl_" prefix).
+ It is compiled into libintl in order to make the AM_GNU_GETTEXT test
+ of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which
+ has the redirections primarily in the <libintl.h> include file.
+ It is also compiled into libgnuintl so that libgnuintl.so can be used
+ as LD_PRELOADable library on glibc systems, to provide the extra
+ features that the functions in the libc don't have (namely, logging). */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef ngettext
+#undef dngettext
+#undef dcngettext
+#undef textdomain
+#undef bindtextdomain
+#undef bind_textdomain_codeset
+
+
+/* When building a DLL, we must export some functions. Note that because
+ the functions are only defined for binary backward compatibility, we
+ don't need to use __declspec(dllimport) in any case. */
+#if defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+
+DLL_EXPORTED
+char *
+gettext (const char *msgid)
+{
+ return libintl_gettext (msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dgettext (const char *domainname, const char *msgid)
+{
+ return libintl_dgettext (domainname, msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dcgettext (const char *domainname, const char *msgid, int category)
+{
+ return libintl_dcgettext (domainname, msgid, category);
+}
+
+
+DLL_EXPORTED
+char *
+ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+ return libintl_ngettext (msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dngettext (const char *domainname,
+ const char *msgid1, const char *msgid2, unsigned long int n)
+{
+ return libintl_dngettext (domainname, msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dcngettext (const char *domainname,
+ const char *msgid1, const char *msgid2, unsigned long int n,
+ int category)
+{
+ return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
+}
+
+
+DLL_EXPORTED
+char *
+textdomain (const char *domainname)
+{
+ return libintl_textdomain (domainname);
+}
+
+
+DLL_EXPORTED
+char *
+bindtextdomain (const char *domainname, const char *dirname)
+{
+ return libintl_bindtextdomain (domainname, dirname);
+}
+
+
+DLL_EXPORTED
+char *
+bind_textdomain_codeset (const char *domainname, const char *codeset)
+{
+ return libintl_bind_textdomain_codeset (domainname, codeset);
+}
diff --git a/Build/source/utils/texinfo/intl/l10nflist.c b/Build/source/utils/texinfo/intl/l10nflist.c
new file mode 100644
index 00000000000..eb995aafad2
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/l10nflist.c
@@ -0,0 +1,421 @@
+/* Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for stpcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# ifndef stpcpy
+# define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy (char *dest, const char *src);
+# endif
+#endif
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+ it may be concatenated to a directory pathname.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+#endif
+
+/* Define function which are usually not available. */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ. */
+static size_t
+argz_count__ (const char *argz, size_t len)
+{
+ size_t count = 0;
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len + 1;
+ len -= part_len + 1;
+ count++;
+ }
+ return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#else
+# ifdef _LIBC
+# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
+# endif
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+static void
+argz_stringify__ (char *argz, size_t len, int sep)
+{
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len;
+ len -= part_len + 1;
+ if (len > 0)
+ *argz++ = sep;
+ }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#else
+# ifdef _LIBC
+# define __argz_stringify(argz, len, sep) \
+ INTUSE(__argz_stringify) (argz, len, sep)
+# endif
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *
+argz_next__ (char *argz, size_t argz_len, const char *entry)
+{
+ if (entry)
+ {
+ if (entry < argz + argz_len)
+ entry = strchr (entry, '\0') + 1;
+
+ return entry >= argz + argz_len ? NULL : (char *) entry;
+ }
+ else
+ if (argz_len > 0)
+ return argz;
+ else
+ return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X. */
+static inline int
+pop (int x)
+{
+ /* We assume that no more than 16 bits are used. */
+ x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+ x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+ x = ((x >> 4) + x) & 0x0f0f;
+ x = ((x >> 8) + x) & 0xff;
+
+ return x;
+}
+
+
+struct loaded_l10nfile *
+_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+ const char *dirlist, size_t dirlist_len,
+ int mask, const char *language, const char *territory,
+ const char *codeset, const char *normalized_codeset,
+ const char *modifier, const char *special,
+ const char *sponsor, const char *revision,
+ const char *filename, int do_allocate)
+{
+ char *abs_filename;
+ struct loaded_l10nfile **lastp;
+ struct loaded_l10nfile *retval;
+ char *cp;
+ size_t dirlist_count;
+ size_t entries;
+ int cnt;
+
+ /* If LANGUAGE contains an absolute directory specification, we ignore
+ DIRLIST. */
+ if (IS_ABSOLUTE_PATH (language))
+ dirlist_len = 0;
+
+ /* Allocate room for the full file name. */
+ abs_filename = (char *) malloc (dirlist_len
+ + strlen (language)
+ + ((mask & TERRITORY) != 0
+ ? strlen (territory) + 1 : 0)
+ + ((mask & XPG_CODESET) != 0
+ ? strlen (codeset) + 1 : 0)
+ + ((mask & XPG_NORM_CODESET) != 0
+ ? strlen (normalized_codeset) + 1 : 0)
+ + (((mask & XPG_MODIFIER) != 0
+ || (mask & CEN_AUDIENCE) != 0)
+ ? strlen (modifier) + 1 : 0)
+ + ((mask & CEN_SPECIAL) != 0
+ ? strlen (special) + 1 : 0)
+ + (((mask & CEN_SPONSOR) != 0
+ || (mask & CEN_REVISION) != 0)
+ ? (1 + ((mask & CEN_SPONSOR) != 0
+ ? strlen (sponsor) : 0)
+ + ((mask & CEN_REVISION) != 0
+ ? strlen (revision) + 1 : 0)) : 0)
+ + 1 + strlen (filename) + 1);
+
+ if (abs_filename == NULL)
+ return NULL;
+
+ /* Construct file name. */
+ cp = abs_filename;
+ if (dirlist_len > 0)
+ {
+ memcpy (cp, dirlist, dirlist_len);
+ __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
+ cp += dirlist_len;
+ cp[-1] = '/';
+ }
+
+ cp = stpcpy (cp, language);
+
+ if ((mask & TERRITORY) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, territory);
+ }
+ if ((mask & XPG_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, codeset);
+ }
+ if ((mask & XPG_NORM_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, normalized_codeset);
+ }
+ if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+ {
+ /* This component can be part of both syntaces but has different
+ leading characters. For CEN we use `+', else `@'. */
+ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+ cp = stpcpy (cp, modifier);
+ }
+ if ((mask & CEN_SPECIAL) != 0)
+ {
+ *cp++ = '+';
+ cp = stpcpy (cp, special);
+ }
+ if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+ {
+ *cp++ = ',';
+ if ((mask & CEN_SPONSOR) != 0)
+ cp = stpcpy (cp, sponsor);
+ if ((mask & CEN_REVISION) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, revision);
+ }
+ }
+
+ *cp++ = '/';
+ stpcpy (cp, filename);
+
+ /* Look in list of already loaded domains whether it is already
+ available. */
+ lastp = l10nfile_list;
+ for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+ if (retval->filename != NULL)
+ {
+ int compare = strcmp (retval->filename, abs_filename);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It's not in the list. */
+ retval = NULL;
+ break;
+ }
+
+ lastp = &retval->next;
+ }
+
+ if (retval != NULL || do_allocate == 0)
+ {
+ free (abs_filename);
+ return retval;
+ }
+
+ dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
+
+ /* Allocate a new loaded_l10nfile. */
+ retval =
+ (struct loaded_l10nfile *)
+ malloc (sizeof (*retval)
+ + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
+ * sizeof (struct loaded_l10nfile *)));
+ if (retval == NULL)
+ return NULL;
+
+ retval->filename = abs_filename;
+
+ /* We set retval->data to NULL here; it is filled in later.
+ Setting retval->decided to 1 here means that retval does not
+ correspond to a real file (dirlist_count > 1) or is not worth
+ looking up (if an unnormalized codeset was specified). */
+ retval->decided = (dirlist_count > 1
+ || ((mask & XPG_CODESET) != 0
+ && (mask & XPG_NORM_CODESET) != 0));
+ retval->data = NULL;
+
+ retval->next = *lastp;
+ *lastp = retval;
+
+ entries = 0;
+ /* Recurse to fill the inheritance list of RETVAL.
+ If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
+ entry does not correspond to a real file; retval->filename contains
+ colons. In this case we loop across all elements of DIRLIST and
+ across all bit patterns dominated by MASK.
+ If the DIRLIST is a single directory or entirely redundant (i.e.
+ DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
+ MASK, excluding MASK itself.
+ In either case, we loop down from MASK to 0. This has the effect
+ that the extra bits in the locale name are dropped in this order:
+ first the modifier, then the territory, then the codeset, then the
+ normalized_codeset. */
+ for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
+ if ((cnt & ~mask) == 0
+ && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+ && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+ {
+ if (dirlist_count > 1)
+ {
+ /* Iterate over all elements of the DIRLIST. */
+ char *dir = NULL;
+
+ while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+ != NULL)
+ retval->successor[entries++]
+ = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
+ cnt, language, territory, codeset,
+ normalized_codeset, modifier, special,
+ sponsor, revision, filename, 1);
+ }
+ else
+ retval->successor[entries++]
+ = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
+ cnt, language, territory, codeset,
+ normalized_codeset, modifier, special,
+ sponsor, revision, filename, 1);
+ }
+ retval->successor[entries] = NULL;
+
+ return retval;
+}
+
+/* Normalize codeset name. There is no standard for the codeset
+ names. Normalization allows the user to use any of the common
+ names. The return value is dynamically allocated and has to be
+ freed by the caller. */
+const char *
+_nl_normalize_codeset (const char *codeset, size_t name_len)
+{
+ int len = 0;
+ int only_digit = 1;
+ char *retval;
+ char *wp;
+ size_t cnt;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalnum ((unsigned char) codeset[cnt]))
+ {
+ ++len;
+
+ if (isalpha ((unsigned char) codeset[cnt]))
+ only_digit = 0;
+ }
+
+ retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+ if (retval != NULL)
+ {
+ if (only_digit)
+ wp = stpcpy (retval, "iso");
+ else
+ wp = retval;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalpha ((unsigned char) codeset[cnt]))
+ *wp++ = tolower ((unsigned char) codeset[cnt]);
+ else if (isdigit ((unsigned char) codeset[cnt]))
+ *wp++ = codeset[cnt];
+
+ *wp = '\0';
+ }
+
+ return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (char *dest, const char *src)
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
diff --git a/Build/source/utils/texinfo/intl/libgnuintl.h.in b/Build/source/utils/texinfo/intl/libgnuintl.h.in
new file mode 100644
index 00000000000..3be7eb990cb
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/libgnuintl.h.in
@@ -0,0 +1,383 @@
+/* Message catalogs for internationalization.
+ Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _LIBINTL_H
+#define _LIBINTL_H 1
+
+#include <locale.h>
+
+/* The LC_MESSAGES locale category is the category used by the functions
+ gettext() and dgettext(). It is specified in POSIX, but not in ANSI C.
+ On systems that don't define it, use an arbitrary value instead.
+ On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
+ then includes <libintl.h> (i.e. this file!) and then only defines
+ LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES
+ in this case. */
+#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
+# define LC_MESSAGES 1729
+#endif
+
+/* We define an additional symbol to signal that we use the GNU
+ implementation of gettext. */
+#define __USE_GNU_GETTEXT 1
+
+/* Provide information about the supported file formats. Returns the
+ maximum minor revision number supported for a given major revision. */
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
+ ((major) == 0 ? 1 : -1)
+
+/* Resolve a platform specific conflict on DJGPP. GNU gettext takes
+ precedence over _conio_gettext. */
+#ifdef __DJGPP__
+# undef gettext
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* We redirect the functions to those prefixed with "libintl_". This is
+ necessary, because some systems define gettext/textdomain/... in the C
+ library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
+ If we used the unprefixed names, there would be cases where the
+ definition in the C library would override the one in the libintl.so
+ shared library. Recall that on ELF systems, the symbols are looked
+ up in the following order:
+ 1. in the executable,
+ 2. in the shared libraries specified on the link command line, in order,
+ 3. in the dependencies of the shared libraries specified on the link
+ command line,
+ 4. in the dlopen()ed shared libraries, in the order in which they were
+ dlopen()ed.
+ The definition in the C library would override the one in libintl.so if
+ either
+ * -lc is given on the link command line and -lintl isn't, or
+ * -lc is given on the link command line before -lintl, or
+ * libintl.so is a dependency of a dlopen()ed shared library but not
+ linked to the executable at link time.
+ Since Solaris gettext() behaves differently than GNU gettext(), this
+ would be unacceptable.
+
+ The redirection happens by default through macros in C, so that &gettext
+ is independent of the compilation unit, but through inline functions in
+ C++, in order not to interfere with the name mangling of class fields or
+ class methods called 'gettext'. */
+
+/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
+ If he doesn't, we choose the method. A third possible method is
+ _INTL_REDIRECT_ASM, supported only by GCC. */
+#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
+# if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus)
+# define _INTL_REDIRECT_ASM
+# else
+# ifdef __cplusplus
+# define _INTL_REDIRECT_INLINE
+# else
+# define _INTL_REDIRECT_MACROS
+# endif
+# endif
+#endif
+/* Auxiliary macros. */
+#ifdef _INTL_REDIRECT_ASM
+# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
+# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
+# define _INTL_STRINGIFY(prefix) #prefix
+#else
+# define _INTL_ASM(cname)
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_gettext (const char *__msgid);
+static inline char *gettext (const char *__msgid)
+{
+ return libintl_gettext (__msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define gettext libintl_gettext
+#endif
+extern char *gettext (const char *__msgid)
+ _INTL_ASM (libintl_gettext);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ LC_MESSAGES locale. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dgettext (const char *__domainname, const char *__msgid);
+static inline char *dgettext (const char *__domainname, const char *__msgid)
+{
+ return libintl_dgettext (__domainname, __msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dgettext libintl_dgettext
+#endif
+extern char *dgettext (const char *__domainname, const char *__msgid)
+ _INTL_ASM (libintl_dgettext);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
+ int __category);
+static inline char *dcgettext (const char *__domainname, const char *__msgid,
+ int __category)
+{
+ return libintl_dcgettext (__domainname, __msgid, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcgettext libintl_dcgettext
+#endif
+extern char *dcgettext (const char *__domainname, const char *__msgid,
+ int __category)
+ _INTL_ASM (libintl_dcgettext);
+#endif
+
+
+/* Similar to `gettext' but select the plural form corresponding to the
+ number N. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
+ unsigned long int __n);
+static inline char *ngettext (const char *__msgid1, const char *__msgid2,
+ unsigned long int __n)
+{
+ return libintl_ngettext (__msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define ngettext libintl_ngettext
+#endif
+extern char *ngettext (const char *__msgid1, const char *__msgid2,
+ unsigned long int __n)
+ _INTL_ASM (libintl_ngettext);
+#endif
+
+/* Similar to `dgettext' but select the plural form corresponding to the
+ number N. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
+ const char *__msgid2, unsigned long int __n);
+static inline char *dngettext (const char *__domainname, const char *__msgid1,
+ const char *__msgid2, unsigned long int __n)
+{
+ return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dngettext libintl_dngettext
+#endif
+extern char *dngettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ unsigned long int __n)
+ _INTL_ASM (libintl_dngettext);
+#endif
+
+/* Similar to `dcgettext' but select the plural form corresponding to the
+ number N. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcngettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ unsigned long int __n, int __category);
+static inline char *dcngettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ unsigned long int __n, int __category)
+{
+ return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcngettext libintl_dcngettext
+#endif
+extern char *dcngettext (const char *__domainname,
+ const char *__msgid1, const char *__msgid2,
+ unsigned long int __n, int __category)
+ _INTL_ASM (libintl_dcngettext);
+#endif
+
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_textdomain (const char *__domainname);
+static inline char *textdomain (const char *__domainname)
+{
+ return libintl_textdomain (__domainname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define textdomain libintl_textdomain
+#endif
+extern char *textdomain (const char *__domainname)
+ _INTL_ASM (libintl_textdomain);
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bindtextdomain (const char *__domainname,
+ const char *__dirname);
+static inline char *bindtextdomain (const char *__domainname,
+ const char *__dirname)
+{
+ return libintl_bindtextdomain (__domainname, __dirname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bindtextdomain libintl_bindtextdomain
+#endif
+extern char *bindtextdomain (const char *__domainname, const char *__dirname)
+ _INTL_ASM (libintl_bindtextdomain);
+#endif
+
+/* Specify the character encoding in which the messages from the
+ DOMAINNAME message catalog will be returned. */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bind_textdomain_codeset (const char *__domainname,
+ const char *__codeset);
+static inline char *bind_textdomain_codeset (const char *__domainname,
+ const char *__codeset)
+{
+ return libintl_bind_textdomain_codeset (__domainname, __codeset);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bind_textdomain_codeset libintl_bind_textdomain_codeset
+#endif
+extern char *bind_textdomain_codeset (const char *__domainname,
+ const char *__codeset)
+ _INTL_ASM (libintl_bind_textdomain_codeset);
+#endif
+
+
+/* Support for format strings with positions in *printf(), following the
+ POSIX/XSI specification.
+ Note: These replacements for the *printf() functions are visible only
+ in source files that #include <libintl.h> or #include "gettext.h".
+ Packages that use *printf() in source files that don't refer to _()
+ or gettext() but for which the format string could be the return value
+ of _() or gettext() need to add this #include. Oh well. */
+
+#if !@HAVE_POSIX_PRINTF@
+
+#include <stdio.h>
+#include <stddef.h>
+
+/* Get va_list. */
+#if __STDC__ || defined __cplusplus || defined _MSC_VER
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
+
+#undef fprintf
+#define fprintf libintl_fprintf
+extern int fprintf (FILE *, const char *, ...);
+#undef vfprintf
+#define vfprintf libintl_vfprintf
+extern int vfprintf (FILE *, const char *, va_list);
+
+#undef printf
+#define printf libintl_printf
+extern int printf (const char *, ...);
+#undef vprintf
+#define vprintf libintl_vprintf
+extern int vprintf (const char *, va_list);
+
+#undef sprintf
+#define sprintf libintl_sprintf
+extern int sprintf (char *, const char *, ...);
+#undef vsprintf
+#define vsprintf libintl_vsprintf
+extern int vsprintf (char *, const char *, va_list);
+
+#if @HAVE_SNPRINTF@
+
+#undef snprintf
+#define snprintf libintl_snprintf
+extern int snprintf (char *, size_t, const char *, ...);
+#undef vsnprintf
+#define vsnprintf libintl_vsnprintf
+extern int vsnprintf (char *, size_t, const char *, va_list);
+
+#endif
+
+#if @HAVE_ASPRINTF@
+
+#undef asprintf
+#define asprintf libintl_asprintf
+extern int asprintf (char **, const char *, ...);
+#undef vasprintf
+#define vasprintf libintl_vasprintf
+extern int vasprintf (char **, const char *, va_list);
+
+#endif
+
+#if @HAVE_WPRINTF@
+
+#undef fwprintf
+#define fwprintf libintl_fwprintf
+extern int fwprintf (FILE *, const wchar_t *, ...);
+#undef vfwprintf
+#define vfwprintf libintl_vfwprintf
+extern int vfwprintf (FILE *, const wchar_t *, va_list);
+
+#undef wprintf
+#define wprintf libintl_wprintf
+extern int wprintf (const wchar_t *, ...);
+#undef vwprintf
+#define vwprintf libintl_vwprintf
+extern int vwprintf (const wchar_t *, va_list);
+
+#undef swprintf
+#define swprintf libintl_swprintf
+extern int swprintf (wchar_t *, size_t, const wchar_t *, ...);
+#undef vswprintf
+#define vswprintf libintl_vswprintf
+extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
+
+#endif
+
+#endif
+
+
+/* Support for relocatable packages. */
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+#define libintl_set_relocation_prefix libintl_set_relocation_prefix
+extern void
+ libintl_set_relocation_prefix (const char *orig_prefix,
+ const char *curr_prefix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* libintl.h */
diff --git a/Build/source/utils/texinfo/intl/loadinfo.h b/Build/source/utils/texinfo/intl/loadinfo.h
new file mode 100644
index 00000000000..65e5ebd1f80
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/loadinfo.h
@@ -0,0 +1,145 @@
+/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _LOADINFO_H
+#define _LOADINFO_H 1
+
+/* Declarations of locale dependent catalog lookup functions.
+ Implemented in
+
+ localealias.c Possibly replace a locale name by another.
+ explodename.c Split a locale name into its various fields.
+ l10nflist.c Generate a list of filenames of possible message catalogs.
+ finddomain.c Find and open the relevant message catalogs.
+
+ The main function _nl_find_domain() in finddomain.c is declared
+ in gettextP.h.
+ */
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+ almost always true or almost always false. */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+/* Separator in PATH like lists of pathnames. */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+ /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Encoding of locale name parts. */
+#define CEN_REVISION 1
+#define CEN_SPONSOR 2
+#define CEN_SPECIAL 4
+#define XPG_NORM_CODESET 8
+#define XPG_CODESET 16
+#define TERRITORY 32
+#define CEN_AUDIENCE 64
+#define XPG_MODIFIER 128
+
+#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+ const char *filename;
+ int decided;
+
+ const void *data;
+
+ struct loaded_l10nfile *next;
+ struct loaded_l10nfile *successor[1];
+};
+
+
+/* Normalize codeset name. There is no standard for the codeset
+ names. Normalization allows the user to use any of the common
+ names. The return value is dynamically allocated and has to be
+ freed by the caller. */
+extern const char *_nl_normalize_codeset (const char *codeset,
+ size_t name_len);
+
+/* Lookup a locale dependent file.
+ *L10NFILE_LIST denotes a pool of lookup results of locale dependent
+ files of the same kind, sorted in decreasing order of ->filename.
+ DIRLIST and DIRLIST_LEN are an argz list of directories in which to
+ look, containing at least one directory (i.e. DIRLIST_LEN > 0).
+ MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER,
+ SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as
+ produced by _nl_explode_name(). FILENAME is the filename suffix.
+ The return value is the lookup result, either found in *L10NFILE_LIST,
+ or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL.
+ If the return value is non-NULL, it is added to *L10NFILE_LIST, and
+ its ->next field denotes the chaining inside *L10NFILE_LIST, and
+ furthermore its ->successor[] field contains a list of other lookup
+ results from which this lookup result inherits. */
+extern struct loaded_l10nfile *
+_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+ const char *dirlist, size_t dirlist_len, int mask,
+ const char *language, const char *territory,
+ const char *codeset, const char *normalized_codeset,
+ const char *modifier, const char *special,
+ const char *sponsor, const char *revision,
+ const char *filename, int do_allocate);
+
+/* Lookup the real locale name for a locale alias NAME, or NULL if
+ NAME is not a locale alias (but possibly a real locale name).
+ The return value is statically allocated and must not be freed. */
+extern const char *_nl_expand_alias (const char *name);
+
+/* Split a locale name NAME into its pieces: language, modifier,
+ territory, codeset, special, sponsor, revision.
+ NAME gets destructively modified: NUL bytes are inserted here and
+ there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY,
+ *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a
+ pointer into the old NAME string, or NULL. *NORMALIZED_CODESET
+ gets assigned the expanded *CODESET, if it is different from *CODESET;
+ this one is dynamically allocated and has to be freed by the caller.
+ The return value is a bitmask, where each bit corresponds to one
+ filled-in value:
+ XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER,
+ TERRITORY for *TERRITORY,
+ XPG_CODESET for *CODESET,
+ XPG_NORM_CODESET for *NORMALIZED_CODESET,
+ CEN_SPECIAL for *SPECIAL,
+ CEN_SPONSOR for *SPONSOR,
+ CEN_REVISION for *REVISION.
+ */
+extern int _nl_explode_name (char *name, const char **language,
+ const char **modifier, const char **territory,
+ const char **codeset,
+ const char **normalized_codeset,
+ const char **special, const char **sponsor,
+ const char **revision);
+
+/* Split a locale name NAME into a leading language part and all the
+ rest. Return a pointer to the first character after the language,
+ i.e. to the first byte of the rest. */
+extern char *_nl_find_language (const char *name);
+
+#endif /* loadinfo.h */
diff --git a/Build/source/utils/texinfo/intl/loadmsgcat.c b/Build/source/utils/texinfo/intl/loadmsgcat.c
new file mode 100644
index 00000000000..99c51b4c5c2
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/loadmsgcat.c
@@ -0,0 +1,1420 @@
+/* Load needed message catalogs.
+ Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __GNUC__
+# undef alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#ifdef _LIBC
+# include <langinfo.h>
+# include <locale.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP 1
+#else
+# undef HAVE_MMAP
+#endif
+
+#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
+# include <stdint.h>
+#endif
+#if defined HAVE_INTTYPES_H || defined _LIBC
+# include <inttypes.h>
+#endif
+
+#include "gmo.h"
+#include "gettextP.h"
+#include "hash-string.h"
+#include "plural-exp.h"
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+/* Provide fallback values for macros that ought to be defined in <inttypes.h>.
+ Note that our fallback values need not be literal strings, because we don't
+ use them with preprocessor string concatenation. */
+#if !defined PRId8 || PRI_MACROS_BROKEN
+# undef PRId8
+# define PRId8 "d"
+#endif
+#if !defined PRIi8 || PRI_MACROS_BROKEN
+# undef PRIi8
+# define PRIi8 "i"
+#endif
+#if !defined PRIo8 || PRI_MACROS_BROKEN
+# undef PRIo8
+# define PRIo8 "o"
+#endif
+#if !defined PRIu8 || PRI_MACROS_BROKEN
+# undef PRIu8
+# define PRIu8 "u"
+#endif
+#if !defined PRIx8 || PRI_MACROS_BROKEN
+# undef PRIx8
+# define PRIx8 "x"
+#endif
+#if !defined PRIX8 || PRI_MACROS_BROKEN
+# undef PRIX8
+# define PRIX8 "X"
+#endif
+#if !defined PRId16 || PRI_MACROS_BROKEN
+# undef PRId16
+# define PRId16 "d"
+#endif
+#if !defined PRIi16 || PRI_MACROS_BROKEN
+# undef PRIi16
+# define PRIi16 "i"
+#endif
+#if !defined PRIo16 || PRI_MACROS_BROKEN
+# undef PRIo16
+# define PRIo16 "o"
+#endif
+#if !defined PRIu16 || PRI_MACROS_BROKEN
+# undef PRIu16
+# define PRIu16 "u"
+#endif
+#if !defined PRIx16 || PRI_MACROS_BROKEN
+# undef PRIx16
+# define PRIx16 "x"
+#endif
+#if !defined PRIX16 || PRI_MACROS_BROKEN
+# undef PRIX16
+# define PRIX16 "X"
+#endif
+#if !defined PRId32 || PRI_MACROS_BROKEN
+# undef PRId32
+# define PRId32 "d"
+#endif
+#if !defined PRIi32 || PRI_MACROS_BROKEN
+# undef PRIi32
+# define PRIi32 "i"
+#endif
+#if !defined PRIo32 || PRI_MACROS_BROKEN
+# undef PRIo32
+# define PRIo32 "o"
+#endif
+#if !defined PRIu32 || PRI_MACROS_BROKEN
+# undef PRIu32
+# define PRIu32 "u"
+#endif
+#if !defined PRIx32 || PRI_MACROS_BROKEN
+# undef PRIx32
+# define PRIx32 "x"
+#endif
+#if !defined PRIX32 || PRI_MACROS_BROKEN
+# undef PRIX32
+# define PRIX32 "X"
+#endif
+#if !defined PRId64 || PRI_MACROS_BROKEN
+# undef PRId64
+# define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
+#endif
+#if !defined PRIi64 || PRI_MACROS_BROKEN
+# undef PRIi64
+# define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
+#endif
+#if !defined PRIo64 || PRI_MACROS_BROKEN
+# undef PRIo64
+# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
+#endif
+#if !defined PRIu64 || PRI_MACROS_BROKEN
+# undef PRIu64
+# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
+#endif
+#if !defined PRIx64 || PRI_MACROS_BROKEN
+# undef PRIx64
+# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
+#endif
+#if !defined PRIX64 || PRI_MACROS_BROKEN
+# undef PRIX64
+# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
+#endif
+#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+#endif
+#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+#endif
+#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+#endif
+#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+#endif
+#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+#endif
+#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+#endif
+#if !defined PRIdFAST8 || PRI_MACROS_BROKEN
+# undef PRIdFAST8
+# define PRIdFAST8 "d"
+#endif
+#if !defined PRIiFAST8 || PRI_MACROS_BROKEN
+# undef PRIiFAST8
+# define PRIiFAST8 "i"
+#endif
+#if !defined PRIoFAST8 || PRI_MACROS_BROKEN
+# undef PRIoFAST8
+# define PRIoFAST8 "o"
+#endif
+#if !defined PRIuFAST8 || PRI_MACROS_BROKEN
+# undef PRIuFAST8
+# define PRIuFAST8 "u"
+#endif
+#if !defined PRIxFAST8 || PRI_MACROS_BROKEN
+# undef PRIxFAST8
+# define PRIxFAST8 "x"
+#endif
+#if !defined PRIXFAST8 || PRI_MACROS_BROKEN
+# undef PRIXFAST8
+# define PRIXFAST8 "X"
+#endif
+#if !defined PRIdFAST16 || PRI_MACROS_BROKEN
+# undef PRIdFAST16
+# define PRIdFAST16 "d"
+#endif
+#if !defined PRIiFAST16 || PRI_MACROS_BROKEN
+# undef PRIiFAST16
+# define PRIiFAST16 "i"
+#endif
+#if !defined PRIoFAST16 || PRI_MACROS_BROKEN
+# undef PRIoFAST16
+# define PRIoFAST16 "o"
+#endif
+#if !defined PRIuFAST16 || PRI_MACROS_BROKEN
+# undef PRIuFAST16
+# define PRIuFAST16 "u"
+#endif
+#if !defined PRIxFAST16 || PRI_MACROS_BROKEN
+# undef PRIxFAST16
+# define PRIxFAST16 "x"
+#endif
+#if !defined PRIXFAST16 || PRI_MACROS_BROKEN
+# undef PRIXFAST16
+# define PRIXFAST16 "X"
+#endif
+#if !defined PRIdFAST32 || PRI_MACROS_BROKEN
+# undef PRIdFAST32
+# define PRIdFAST32 "d"
+#endif
+#if !defined PRIiFAST32 || PRI_MACROS_BROKEN
+# undef PRIiFAST32
+# define PRIiFAST32 "i"
+#endif
+#if !defined PRIoFAST32 || PRI_MACROS_BROKEN
+# undef PRIoFAST32
+# define PRIoFAST32 "o"
+#endif
+#if !defined PRIuFAST32 || PRI_MACROS_BROKEN
+# undef PRIuFAST32
+# define PRIuFAST32 "u"
+#endif
+#if !defined PRIxFAST32 || PRI_MACROS_BROKEN
+# undef PRIxFAST32
+# define PRIxFAST32 "x"
+#endif
+#if !defined PRIXFAST32 || PRI_MACROS_BROKEN
+# undef PRIXFAST32
+# define PRIXFAST32 "X"
+#endif
+#if !defined PRIdFAST64 || PRI_MACROS_BROKEN
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+#endif
+#if !defined PRIiFAST64 || PRI_MACROS_BROKEN
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+#endif
+#if !defined PRIoFAST64 || PRI_MACROS_BROKEN
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+#endif
+#if !defined PRIuFAST64 || PRI_MACROS_BROKEN
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+#endif
+#if !defined PRIxFAST64 || PRI_MACROS_BROKEN
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+#endif
+#if !defined PRIXFAST64 || PRI_MACROS_BROKEN
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+#endif
+#if !defined PRIdMAX || PRI_MACROS_BROKEN
+# undef PRIdMAX
+# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
+#endif
+#if !defined PRIiMAX || PRI_MACROS_BROKEN
+# undef PRIiMAX
+# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
+#endif
+#if !defined PRIoMAX || PRI_MACROS_BROKEN
+# undef PRIoMAX
+# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
+#endif
+#if !defined PRIuMAX || PRI_MACROS_BROKEN
+# undef PRIuMAX
+# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
+#endif
+#if !defined PRIxMAX || PRI_MACROS_BROKEN
+# undef PRIxMAX
+# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
+#endif
+#if !defined PRIXMAX || PRI_MACROS_BROKEN
+# undef PRIXMAX
+# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
+#endif
+#if !defined PRIdPTR || PRI_MACROS_BROKEN
+# undef PRIdPTR
+# define PRIdPTR \
+ (sizeof (void *) == sizeof (long) ? "ld" : \
+ sizeof (void *) == sizeof (int) ? "d" : \
+ "lld")
+#endif
+#if !defined PRIiPTR || PRI_MACROS_BROKEN
+# undef PRIiPTR
+# define PRIiPTR \
+ (sizeof (void *) == sizeof (long) ? "li" : \
+ sizeof (void *) == sizeof (int) ? "i" : \
+ "lli")
+#endif
+#if !defined PRIoPTR || PRI_MACROS_BROKEN
+# undef PRIoPTR
+# define PRIoPTR \
+ (sizeof (void *) == sizeof (long) ? "lo" : \
+ sizeof (void *) == sizeof (int) ? "o" : \
+ "llo")
+#endif
+#if !defined PRIuPTR || PRI_MACROS_BROKEN
+# undef PRIuPTR
+# define PRIuPTR \
+ (sizeof (void *) == sizeof (long) ? "lu" : \
+ sizeof (void *) == sizeof (int) ? "u" : \
+ "llu")
+#endif
+#if !defined PRIxPTR || PRI_MACROS_BROKEN
+# undef PRIxPTR
+# define PRIxPTR \
+ (sizeof (void *) == sizeof (long) ? "lx" : \
+ sizeof (void *) == sizeof (int) ? "x" : \
+ "llx")
+#endif
+#if !defined PRIXPTR || PRI_MACROS_BROKEN
+# undef PRIXPTR
+# define PRIXPTR \
+ (sizeof (void *) == sizeof (long) ? "lX" : \
+ sizeof (void *) == sizeof (int) ? "X" : \
+ "llX")
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions. This is required by the standard
+ because some ISO C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define open __open
+# define close __close
+# define read __read
+# define mmap __mmap
+# define munmap __munmap
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in <fcntl.h>. */
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+#ifdef __BEOS__
+ /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+/* On reasonable systems, binary I/O is the default. */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+ with all translations. This is important if the translations are
+ cached by one of GCC's features. */
+int _nl_msg_cat_cntr;
+
+
+/* Expand a system dependent string segment. Return NULL if unsupported. */
+static const char *
+get_sysdep_segment_value (const char *name)
+{
+ /* Test for an ISO C 99 section 7.8.1 format string directive.
+ Syntax:
+ P R I { d | i | o | u | x | X }
+ { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */
+ /* We don't use a table of 14 times 6 'const char *' strings here, because
+ data relocations cost startup time. */
+ if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
+ {
+ if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
+ || name[3] == 'x' || name[3] == 'X')
+ {
+ if (name[4] == '8' && name[5] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRId8;
+ if (name[3] == 'i')
+ return PRIi8;
+ if (name[3] == 'o')
+ return PRIo8;
+ if (name[3] == 'u')
+ return PRIu8;
+ if (name[3] == 'x')
+ return PRIx8;
+ if (name[3] == 'X')
+ return PRIX8;
+ abort ();
+ }
+ if (name[4] == '1' && name[5] == '6' && name[6] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRId16;
+ if (name[3] == 'i')
+ return PRIi16;
+ if (name[3] == 'o')
+ return PRIo16;
+ if (name[3] == 'u')
+ return PRIu16;
+ if (name[3] == 'x')
+ return PRIx16;
+ if (name[3] == 'X')
+ return PRIX16;
+ abort ();
+ }
+ if (name[4] == '3' && name[5] == '2' && name[6] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRId32;
+ if (name[3] == 'i')
+ return PRIi32;
+ if (name[3] == 'o')
+ return PRIo32;
+ if (name[3] == 'u')
+ return PRIu32;
+ if (name[3] == 'x')
+ return PRIx32;
+ if (name[3] == 'X')
+ return PRIX32;
+ abort ();
+ }
+ if (name[4] == '6' && name[5] == '4' && name[6] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRId64;
+ if (name[3] == 'i')
+ return PRIi64;
+ if (name[3] == 'o')
+ return PRIo64;
+ if (name[3] == 'u')
+ return PRIu64;
+ if (name[3] == 'x')
+ return PRIx64;
+ if (name[3] == 'X')
+ return PRIX64;
+ abort ();
+ }
+ if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
+ && name[7] == 'S' && name[8] == 'T')
+ {
+ if (name[9] == '8' && name[10] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdLEAST8;
+ if (name[3] == 'i')
+ return PRIiLEAST8;
+ if (name[3] == 'o')
+ return PRIoLEAST8;
+ if (name[3] == 'u')
+ return PRIuLEAST8;
+ if (name[3] == 'x')
+ return PRIxLEAST8;
+ if (name[3] == 'X')
+ return PRIXLEAST8;
+ abort ();
+ }
+ if (name[9] == '1' && name[10] == '6' && name[11] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdLEAST16;
+ if (name[3] == 'i')
+ return PRIiLEAST16;
+ if (name[3] == 'o')
+ return PRIoLEAST16;
+ if (name[3] == 'u')
+ return PRIuLEAST16;
+ if (name[3] == 'x')
+ return PRIxLEAST16;
+ if (name[3] == 'X')
+ return PRIXLEAST16;
+ abort ();
+ }
+ if (name[9] == '3' && name[10] == '2' && name[11] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdLEAST32;
+ if (name[3] == 'i')
+ return PRIiLEAST32;
+ if (name[3] == 'o')
+ return PRIoLEAST32;
+ if (name[3] == 'u')
+ return PRIuLEAST32;
+ if (name[3] == 'x')
+ return PRIxLEAST32;
+ if (name[3] == 'X')
+ return PRIXLEAST32;
+ abort ();
+ }
+ if (name[9] == '6' && name[10] == '4' && name[11] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdLEAST64;
+ if (name[3] == 'i')
+ return PRIiLEAST64;
+ if (name[3] == 'o')
+ return PRIoLEAST64;
+ if (name[3] == 'u')
+ return PRIuLEAST64;
+ if (name[3] == 'x')
+ return PRIxLEAST64;
+ if (name[3] == 'X')
+ return PRIXLEAST64;
+ abort ();
+ }
+ }
+ if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
+ && name[7] == 'T')
+ {
+ if (name[8] == '8' && name[9] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdFAST8;
+ if (name[3] == 'i')
+ return PRIiFAST8;
+ if (name[3] == 'o')
+ return PRIoFAST8;
+ if (name[3] == 'u')
+ return PRIuFAST8;
+ if (name[3] == 'x')
+ return PRIxFAST8;
+ if (name[3] == 'X')
+ return PRIXFAST8;
+ abort ();
+ }
+ if (name[8] == '1' && name[9] == '6' && name[10] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdFAST16;
+ if (name[3] == 'i')
+ return PRIiFAST16;
+ if (name[3] == 'o')
+ return PRIoFAST16;
+ if (name[3] == 'u')
+ return PRIuFAST16;
+ if (name[3] == 'x')
+ return PRIxFAST16;
+ if (name[3] == 'X')
+ return PRIXFAST16;
+ abort ();
+ }
+ if (name[8] == '3' && name[9] == '2' && name[10] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdFAST32;
+ if (name[3] == 'i')
+ return PRIiFAST32;
+ if (name[3] == 'o')
+ return PRIoFAST32;
+ if (name[3] == 'u')
+ return PRIuFAST32;
+ if (name[3] == 'x')
+ return PRIxFAST32;
+ if (name[3] == 'X')
+ return PRIXFAST32;
+ abort ();
+ }
+ if (name[8] == '6' && name[9] == '4' && name[10] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdFAST64;
+ if (name[3] == 'i')
+ return PRIiFAST64;
+ if (name[3] == 'o')
+ return PRIoFAST64;
+ if (name[3] == 'u')
+ return PRIuFAST64;
+ if (name[3] == 'x')
+ return PRIxFAST64;
+ if (name[3] == 'X')
+ return PRIXFAST64;
+ abort ();
+ }
+ }
+ if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
+ && name[7] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdMAX;
+ if (name[3] == 'i')
+ return PRIiMAX;
+ if (name[3] == 'o')
+ return PRIoMAX;
+ if (name[3] == 'u')
+ return PRIuMAX;
+ if (name[3] == 'x')
+ return PRIxMAX;
+ if (name[3] == 'X')
+ return PRIXMAX;
+ abort ();
+ }
+ if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
+ && name[7] == '\0')
+ {
+ if (name[3] == 'd')
+ return PRIdPTR;
+ if (name[3] == 'i')
+ return PRIiPTR;
+ if (name[3] == 'o')
+ return PRIoPTR;
+ if (name[3] == 'u')
+ return PRIuPTR;
+ if (name[3] == 'x')
+ return PRIxPTR;
+ if (name[3] == 'X')
+ return PRIXPTR;
+ abort ();
+ }
+ }
+ }
+ /* Test for a glibc specific printf() format directive flag. */
+ if (name[0] == 'I' && name[1] == '\0')
+ {
+#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+ /* The 'I' flag, in numeric format directives, replaces ASCII digits
+ with the 'outdigits' defined in the LC_CTYPE locale facet. This is
+ used for Farsi (Persian) and maybe Arabic. */
+ return "I";
+#else
+ return "";
+#endif
+ }
+ /* Other system dependent strings are not valid. */
+ return NULL;
+}
+
+/* Initialize the codeset dependent parts of an opened message catalog.
+ Return the header entry. */
+const char *
+internal_function
+_nl_init_domain_conv (struct loaded_l10nfile *domain_file,
+ struct loaded_domain *domain,
+ struct binding *domainbinding)
+{
+ /* Find out about the character set the file is encoded with.
+ This can be found (in textual form) in the entry "". If this
+ entry does not exist or if this does not contain the `charset='
+ information, we will assume the charset matches the one the
+ current locale and we don't have to perform any conversion. */
+ char *nullentry;
+ size_t nullentrylen;
+
+ /* Preinitialize fields, to avoid recursion during _nl_find_msg. */
+ domain->codeset_cntr =
+ (domainbinding != NULL ? domainbinding->codeset_cntr : 0);
+#ifdef _LIBC
+ domain->conv = (__gconv_t) -1;
+#else
+# if HAVE_ICONV
+ domain->conv = (iconv_t) -1;
+# endif
+#endif
+ domain->conv_tab = NULL;
+
+ /* Get the header entry. */
+ nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);
+
+ if (nullentry != NULL)
+ {
+#if defined _LIBC || HAVE_ICONV
+ const char *charsetstr;
+
+ charsetstr = strstr (nullentry, "charset=");
+ if (charsetstr != NULL)
+ {
+ size_t len;
+ char *charset;
+ const char *outcharset;
+
+ charsetstr += strlen ("charset=");
+ len = strcspn (charsetstr, " \t\n");
+
+ charset = (char *) alloca (len + 1);
+# if defined _LIBC || HAVE_MEMPCPY
+ *((char *) mempcpy (charset, charsetstr, len)) = '\0';
+# else
+ memcpy (charset, charsetstr, len);
+ charset[len] = '\0';
+# endif
+
+ /* The output charset should normally be determined by the
+ locale. But sometimes the locale is not used or not correctly
+ set up, so we provide a possibility for the user to override
+ this. Moreover, the value specified through
+ bind_textdomain_codeset overrides both. */
+ if (domainbinding != NULL && domainbinding->codeset != NULL)
+ outcharset = domainbinding->codeset;
+ else
+ {
+ outcharset = getenv ("OUTPUT_CHARSET");
+ if (outcharset == NULL || outcharset[0] == '\0')
+ {
+# ifdef _LIBC
+ outcharset = _NL_CURRENT (LC_CTYPE, CODESET);
+# else
+# if HAVE_ICONV
+ extern const char *locale_charset (void);
+ outcharset = locale_charset ();
+# endif
+# endif
+ }
+ }
+
+# ifdef _LIBC
+ /* We always want to use transliteration. */
+ outcharset = norm_add_slashes (outcharset, "TRANSLIT");
+ charset = norm_add_slashes (charset, NULL);
+ if (__gconv_open (outcharset, charset, &domain->conv,
+ GCONV_AVOID_NOCONV)
+ != __GCONV_OK)
+ domain->conv = (__gconv_t) -1;
+# else
+# if HAVE_ICONV
+ /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+ we want to use transliteration. */
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
+ || _LIBICONV_VERSION >= 0x0105
+ if (strchr (outcharset, '/') == NULL)
+ {
+ char *tmp;
+
+ len = strlen (outcharset);
+ tmp = (char *) alloca (len + 10 + 1);
+ memcpy (tmp, outcharset, len);
+ memcpy (tmp + len, "//TRANSLIT", 10 + 1);
+ outcharset = tmp;
+
+ domain->conv = iconv_open (outcharset, charset);
+
+ freea (outcharset);
+ }
+ else
+# endif
+ domain->conv = iconv_open (outcharset, charset);
+# endif
+# endif
+
+ freea (charset);
+ }
+#endif /* _LIBC || HAVE_ICONV */
+ }
+
+ return nullentry;
+}
+
+/* Frees the codeset dependent parts of an opened message catalog. */
+void
+internal_function
+_nl_free_domain_conv (struct loaded_domain *domain)
+{
+ if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
+ free (domain->conv_tab);
+
+#ifdef _LIBC
+ if (domain->conv != (__gconv_t) -1)
+ __gconv_close (domain->conv);
+#else
+# if HAVE_ICONV
+ if (domain->conv != (iconv_t) -1)
+ iconv_close (domain->conv);
+# endif
+#endif
+}
+
+/* Load the message catalogs specified by FILENAME. If it is no valid
+ message catalog do nothing. */
+void
+internal_function
+_nl_load_domain (struct loaded_l10nfile *domain_file,
+ struct binding *domainbinding)
+{
+ int fd;
+ size_t size;
+#ifdef _LIBC
+ struct stat64 st;
+#else
+ struct stat st;
+#endif
+ struct mo_file_header *data = (struct mo_file_header *) -1;
+ int use_mmap = 0;
+ struct loaded_domain *domain;
+ int revision;
+ const char *nullentry;
+
+ domain_file->decided = 1;
+ domain_file->data = NULL;
+
+ /* Note that it would be useless to store domainbinding in domain_file
+ because domainbinding might be == NULL now but != NULL later (after
+ a call to bind_textdomain_codeset). */
+
+ /* If the record does not represent a valid locale the FILENAME
+ might be NULL. This can happen when according to the given
+ specification the locale file name is different for XPG and CEN
+ syntax. */
+ if (domain_file->filename == NULL)
+ return;
+
+ /* Try to open the addressed file. */
+ fd = open (domain_file->filename, O_RDONLY | O_BINARY);
+ if (fd == -1)
+ return;
+
+ /* We must know about the size of the file. */
+ if (
+#ifdef _LIBC
+ __builtin_expect (fstat64 (fd, &st) != 0, 0)
+#else
+ __builtin_expect (fstat (fd, &st) != 0, 0)
+#endif
+ || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+ || __builtin_expect (size < sizeof (struct mo_file_header), 0))
+ {
+ /* Something went wrong. */
+ close (fd);
+ return;
+ }
+
+#ifdef HAVE_MMAP
+ /* Now we are ready to load the file. If mmap() is available we try
+ this first. If not available or it failed we try to load it. */
+ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+ MAP_PRIVATE, fd, 0);
+
+ if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
+ {
+ /* mmap() call was successful. */
+ close (fd);
+ use_mmap = 1;
+ }
+#endif
+
+ /* If the data is not yet available (i.e. mmap'ed) we try to load
+ it manually. */
+ if (data == (struct mo_file_header *) -1)
+ {
+ size_t to_read;
+ char *read_ptr;
+
+ data = (struct mo_file_header *) malloc (size);
+ if (data == NULL)
+ return;
+
+ to_read = size;
+ read_ptr = (char *) data;
+ do
+ {
+ long int nb = (long int) read (fd, read_ptr, to_read);
+ if (nb <= 0)
+ {
+#ifdef EINTR
+ if (nb == -1 && errno == EINTR)
+ continue;
+#endif
+ close (fd);
+ return;
+ }
+ read_ptr += nb;
+ to_read -= nb;
+ }
+ while (to_read > 0);
+
+ close (fd);
+ }
+
+ /* Using the magic number we can test whether it really is a message
+ catalog file. */
+ if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+ 0))
+ {
+ /* The magic number is wrong: not a message catalog file. */
+#ifdef HAVE_MMAP
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ return;
+ }
+
+ domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+ if (domain == NULL)
+ return;
+ domain_file->data = domain;
+
+ domain->data = (char *) data;
+ domain->use_mmap = use_mmap;
+ domain->mmap_size = size;
+ domain->must_swap = data->magic != _MAGIC;
+ domain->malloced = NULL;
+
+ /* Fill in the information about the available tables. */
+ revision = W (domain->must_swap, data->revision);
+ /* We support only the major revisions 0 and 1. */
+ switch (revision >> 16)
+ {
+ case 0:
+ case 1:
+ domain->nstrings = W (domain->must_swap, data->nstrings);
+ domain->orig_tab = (const struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+ domain->trans_tab = (const struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+ domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+ domain->hash_tab =
+ (domain->hash_size > 2
+ ? (const nls_uint32 *)
+ ((char *) data + W (domain->must_swap, data->hash_tab_offset))
+ : NULL);
+ domain->must_swap_hash_tab = domain->must_swap;
+
+ /* Now dispatch on the minor revision. */
+ switch (revision & 0xffff)
+ {
+ case 0:
+ domain->n_sysdep_strings = 0;
+ domain->orig_sysdep_tab = NULL;
+ domain->trans_sysdep_tab = NULL;
+ break;
+ case 1:
+ default:
+ {
+ nls_uint32 n_sysdep_strings;
+
+ if (domain->hash_tab == NULL)
+ /* This is invalid. These minor revisions need a hash table. */
+ goto invalid;
+
+ n_sysdep_strings =
+ W (domain->must_swap, data->n_sysdep_strings);
+ if (n_sysdep_strings > 0)
+ {
+ nls_uint32 n_sysdep_segments;
+ const struct sysdep_segment *sysdep_segments;
+ const char **sysdep_segment_values;
+ const nls_uint32 *orig_sysdep_tab;
+ const nls_uint32 *trans_sysdep_tab;
+ nls_uint32 n_inmem_sysdep_strings;
+ size_t memneed;
+ char *mem;
+ struct sysdep_string_desc *inmem_orig_sysdep_tab;
+ struct sysdep_string_desc *inmem_trans_sysdep_tab;
+ nls_uint32 *inmem_hash_tab;
+ unsigned int i, j;
+
+ /* Get the values of the system dependent segments. */
+ n_sysdep_segments =
+ W (domain->must_swap, data->n_sysdep_segments);
+ sysdep_segments = (const struct sysdep_segment *)
+ ((char *) data
+ + W (domain->must_swap, data->sysdep_segments_offset));
+ sysdep_segment_values =
+ alloca (n_sysdep_segments * sizeof (const char *));
+ for (i = 0; i < n_sysdep_segments; i++)
+ {
+ const char *name =
+ (char *) data
+ + W (domain->must_swap, sysdep_segments[i].offset);
+ nls_uint32 namelen =
+ W (domain->must_swap, sysdep_segments[i].length);
+
+ if (!(namelen > 0 && name[namelen - 1] == '\0'))
+ {
+ freea (sysdep_segment_values);
+ goto invalid;
+ }
+
+ sysdep_segment_values[i] = get_sysdep_segment_value (name);
+ }
+
+ orig_sysdep_tab = (const nls_uint32 *)
+ ((char *) data
+ + W (domain->must_swap, data->orig_sysdep_tab_offset));
+ trans_sysdep_tab = (const nls_uint32 *)
+ ((char *) data
+ + W (domain->must_swap, data->trans_sysdep_tab_offset));
+
+ /* Compute the amount of additional memory needed for the
+ system dependent strings and the augmented hash table.
+ At the same time, also drop string pairs which refer to
+ an undefined system dependent segment. */
+ n_inmem_sysdep_strings = 0;
+ memneed = domain->hash_size * sizeof (nls_uint32);
+ for (i = 0; i < n_sysdep_strings; i++)
+ {
+ int valid = 1;
+ size_t needs[2];
+
+ for (j = 0; j < 2; j++)
+ {
+ const struct sysdep_string *sysdep_string =
+ (const struct sysdep_string *)
+ ((char *) data
+ + W (domain->must_swap,
+ j == 0
+ ? orig_sysdep_tab[i]
+ : trans_sysdep_tab[i]));
+ size_t need = 0;
+ const struct segment_pair *p = sysdep_string->segments;
+
+ if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
+ for (p = sysdep_string->segments;; p++)
+ {
+ nls_uint32 sysdepref;
+
+ need += W (domain->must_swap, p->segsize);
+
+ sysdepref = W (domain->must_swap, p->sysdepref);
+ if (sysdepref == SEGMENTS_END)
+ break;
+
+ if (sysdepref >= n_sysdep_segments)
+ {
+ /* Invalid. */
+ freea (sysdep_segment_values);
+ goto invalid;
+ }
+
+ if (sysdep_segment_values[sysdepref] == NULL)
+ {
+ /* This particular string pair is invalid. */
+ valid = 0;
+ break;
+ }
+
+ need += strlen (sysdep_segment_values[sysdepref]);
+ }
+
+ needs[j] = need;
+ if (!valid)
+ break;
+ }
+
+ if (valid)
+ {
+ n_inmem_sysdep_strings++;
+ memneed += needs[0] + needs[1];
+ }
+ }
+ memneed += 2 * n_inmem_sysdep_strings
+ * sizeof (struct sysdep_string_desc);
+
+ if (n_inmem_sysdep_strings > 0)
+ {
+ unsigned int k;
+
+ /* Allocate additional memory. */
+ mem = (char *) malloc (memneed);
+ if (mem == NULL)
+ goto invalid;
+
+ domain->malloced = mem;
+ inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
+ mem += n_inmem_sysdep_strings
+ * sizeof (struct sysdep_string_desc);
+ inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
+ mem += n_inmem_sysdep_strings
+ * sizeof (struct sysdep_string_desc);
+ inmem_hash_tab = (nls_uint32 *) mem;
+ mem += domain->hash_size * sizeof (nls_uint32);
+
+ /* Compute the system dependent strings. */
+ k = 0;
+ for (i = 0; i < n_sysdep_strings; i++)
+ {
+ int valid = 1;
+
+ for (j = 0; j < 2; j++)
+ {
+ const struct sysdep_string *sysdep_string =
+ (const struct sysdep_string *)
+ ((char *) data
+ + W (domain->must_swap,
+ j == 0
+ ? orig_sysdep_tab[i]
+ : trans_sysdep_tab[i]));
+ const struct segment_pair *p =
+ sysdep_string->segments;
+
+ if (W (domain->must_swap, p->sysdepref)
+ != SEGMENTS_END)
+ for (p = sysdep_string->segments;; p++)
+ {
+ nls_uint32 sysdepref;
+
+ sysdepref =
+ W (domain->must_swap, p->sysdepref);
+ if (sysdepref == SEGMENTS_END)
+ break;
+
+ if (sysdep_segment_values[sysdepref] == NULL)
+ {
+ /* This particular string pair is
+ invalid. */
+ valid = 0;
+ break;
+ }
+ }
+
+ if (!valid)
+ break;
+ }
+
+ if (valid)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ const struct sysdep_string *sysdep_string =
+ (const struct sysdep_string *)
+ ((char *) data
+ + W (domain->must_swap,
+ j == 0
+ ? orig_sysdep_tab[i]
+ : trans_sysdep_tab[i]));
+ const char *static_segments =
+ (char *) data
+ + W (domain->must_swap, sysdep_string->offset);
+ const struct segment_pair *p =
+ sysdep_string->segments;
+
+ /* Concatenate the segments, and fill
+ inmem_orig_sysdep_tab[k] (for j == 0) and
+ inmem_trans_sysdep_tab[k] (for j == 1). */
+
+ struct sysdep_string_desc *inmem_tab_entry =
+ (j == 0
+ ? inmem_orig_sysdep_tab
+ : inmem_trans_sysdep_tab)
+ + k;
+
+ if (W (domain->must_swap, p->sysdepref)
+ == SEGMENTS_END)
+ {
+ /* Only one static segment. */
+ inmem_tab_entry->length =
+ W (domain->must_swap, p->segsize);
+ inmem_tab_entry->pointer = static_segments;
+ }
+ else
+ {
+ inmem_tab_entry->pointer = mem;
+
+ for (p = sysdep_string->segments;; p++)
+ {
+ nls_uint32 segsize =
+ W (domain->must_swap, p->segsize);
+ nls_uint32 sysdepref =
+ W (domain->must_swap, p->sysdepref);
+ size_t n;
+
+ if (segsize > 0)
+ {
+ memcpy (mem, static_segments, segsize);
+ mem += segsize;
+ static_segments += segsize;
+ }
+
+ if (sysdepref == SEGMENTS_END)
+ break;
+
+ n = strlen (sysdep_segment_values[sysdepref]);
+ memcpy (mem, sysdep_segment_values[sysdepref], n);
+ mem += n;
+ }
+
+ inmem_tab_entry->length =
+ mem - inmem_tab_entry->pointer;
+ }
+ }
+
+ k++;
+ }
+ }
+ if (k != n_inmem_sysdep_strings)
+ abort ();
+
+ /* Compute the augmented hash table. */
+ for (i = 0; i < domain->hash_size; i++)
+ inmem_hash_tab[i] =
+ W (domain->must_swap_hash_tab, domain->hash_tab[i]);
+ for (i = 0; i < n_inmem_sysdep_strings; i++)
+ {
+ const char *msgid = inmem_orig_sysdep_tab[i].pointer;
+ nls_uint32 hash_val = hash_string (msgid);
+ nls_uint32 idx = hash_val % domain->hash_size;
+ nls_uint32 incr =
+ 1 + (hash_val % (domain->hash_size - 2));
+
+ for (;;)
+ {
+ if (inmem_hash_tab[idx] == 0)
+ {
+ /* Hash table entry is empty. Use it. */
+ inmem_hash_tab[idx] = 1 + domain->nstrings + i;
+ break;
+ }
+
+ if (idx >= domain->hash_size - incr)
+ idx -= domain->hash_size - incr;
+ else
+ idx += incr;
+ }
+ }
+
+ domain->n_sysdep_strings = n_inmem_sysdep_strings;
+ domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
+ domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
+
+ domain->hash_tab = inmem_hash_tab;
+ domain->must_swap_hash_tab = 0;
+ }
+ else
+ {
+ domain->n_sysdep_strings = 0;
+ domain->orig_sysdep_tab = NULL;
+ domain->trans_sysdep_tab = NULL;
+ }
+
+ freea (sysdep_segment_values);
+ }
+ else
+ {
+ domain->n_sysdep_strings = 0;
+ domain->orig_sysdep_tab = NULL;
+ domain->trans_sysdep_tab = NULL;
+ }
+ }
+ break;
+ }
+ break;
+ default:
+ /* This is an invalid revision. */
+ invalid:
+ /* This is an invalid .mo file. */
+ if (domain->malloced)
+ free (domain->malloced);
+#ifdef HAVE_MMAP
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ free (domain);
+ domain_file->data = NULL;
+ return;
+ }
+
+ /* Now initialize the character set converter from the character set
+ the file is encoded with (found in the header entry) to the domain's
+ specified character set or the locale's character set. */
+ nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding);
+
+ /* Also look for a plural specification. */
+ EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (struct loaded_domain *domain)
+{
+ if (domain->plural != &__gettext_germanic_plural)
+ __gettext_free_exp (domain->plural);
+
+ _nl_free_domain_conv (domain);
+
+ if (domain->malloced)
+ free (domain->malloced);
+
+# ifdef _POSIX_MAPPED_FILES
+ if (domain->use_mmap)
+ munmap ((caddr_t) domain->data, domain->mmap_size);
+ else
+# endif /* _POSIX_MAPPED_FILES */
+ free ((void *) domain->data);
+
+ free (domain);
+}
+#endif
diff --git a/Build/source/utils/texinfo/intl/localcharset.c b/Build/source/utils/texinfo/intl/localcharset.c
new file mode 100644
index 00000000000..4865f1037a0
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/localcharset.c
@@ -0,0 +1,398 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "localcharset.h"
+
+#if HAVE_STDDEF_H
+# include <stddef.h>
+#endif
+
+#include <stdio.h>
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32 /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# define OS2
+#endif
+
+#if !defined WIN32
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if HAVE_SETLOCALE
+# include <locale.h>
+# endif
+# endif
+#elif defined WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+static const char *
+get_charset_aliases ()
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#if !(defined VMS || defined WIN32)
+ FILE *fp;
+ const char *dir = relocate (LIBDIR);
+ const char *base = "charset.alias";
+ char *file_name;
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+ /* Out of memory or file not found, treat it as empty. */
+ cp = "";
+ else
+ {
+ /* Parse the file's contents. */
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+ size_t l1, l2;
+
+ for (;;)
+ {
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = (char *) malloc (res_size + 1);
+ }
+ else
+ {
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = (char *) realloc (res_ptr, res_size + 1);
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+
+ if (file_name != NULL)
+ free (file_name);
+
+#else
+
+# if defined VMS
+ /* To avoid the troubles of an extra file charset.alias_vms in the
+ sources of many GNU packages, simply inline the aliases here. */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-8" "\0" "ISO-8859-8" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ /* Japanese */
+ "eucJP" "\0" "EUC-JP" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "DECKANJI" "\0" "DEC-KANJI" "\0"
+ "SDECKANJI" "\0" "EUC-JP" "\0"
+ /* Chinese */
+ "eucTW" "\0" "EUC-TW" "\0"
+ "DECHANYU" "\0" "DEC-HANYU" "\0"
+ "DECHANZI" "\0" "GB2312" "\0"
+ /* Korean */
+ "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0"
+ "CP20127" "\0" "ASCII" "\0"
+ "CP20866" "\0" "KOI8-R" "\0"
+ "CP21866" "\0" "KOI8-RU" "\0"
+ "CP28591" "\0" "ISO-8859-1" "\0"
+ "CP28592" "\0" "ISO-8859-2" "\0"
+ "CP28593" "\0" "ISO-8859-3" "\0"
+ "CP28594" "\0" "ISO-8859-4" "\0"
+ "CP28595" "\0" "ISO-8859-5" "\0"
+ "CP28596" "\0" "ISO-8859-6" "\0"
+ "CP28597" "\0" "ISO-8859-7" "\0"
+ "CP28598" "\0" "ISO-8859-8" "\0"
+ "CP28599" "\0" "ISO-8859-9" "\0"
+ "CP28605" "\0" "ISO-8859-15" "\0";
+# endif
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset ()
+{
+ const char *codeset;
+ const char *aliases;
+
+#if !(defined WIN32 || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if HAVE_SETLOCALE && 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#elif defined WIN32
+
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+
+#elif defined OS2
+
+ const char *locale;
+ static char buf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+
+ /* Resolve through the charset.alias file. */
+ codeset = locale;
+ }
+ else
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ sprintf (buf, "CP%u", cp[0]);
+ codeset = buf;
+ }
+ }
+
+#endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+
+ return codeset;
+}
diff --git a/Build/source/utils/texinfo/intl/localcharset.h b/Build/source/utils/texinfo/intl/localcharset.h
new file mode 100644
index 00000000000..3b137e73c55
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/localcharset.h
@@ -0,0 +1,42 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2003 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/Build/source/utils/texinfo/intl/locale.alias b/Build/source/utils/texinfo/intl/locale.alias
new file mode 100644
index 00000000000..bd6bb2562f6
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/locale.alias
@@ -0,0 +1,78 @@
+# Locale name alias data base.
+# Copyright (C) 1996-2001,2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+
+# The format of this file is the same as for the corresponding file of
+# the X Window System, which normally can be found in
+# /usr/lib/X11/locale/locale.alias
+# A single line contains two fields: an alias and a substitution value.
+# All entries are case independent.
+
+# Note: This file is far from being complete. If you have a value for
+# your own site which you think might be useful for others too, share
+# it with the rest of us. Send it using the `glibcbug' script to
+# bugs@gnu.org.
+
+# Packages using this file:
+
+bokmal nb_NO.ISO-8859-1
+bokmĺl nb_NO.ISO-8859-1
+catalan ca_ES.ISO-8859-1
+croatian hr_HR.ISO-8859-2
+czech cs_CZ.ISO-8859-2
+danish da_DK.ISO-8859-1
+dansk da_DK.ISO-8859-1
+deutsch de_DE.ISO-8859-1
+dutch nl_NL.ISO-8859-1
+eesti et_EE.ISO-8859-1
+estonian et_EE.ISO-8859-1
+finnish fi_FI.ISO-8859-1
+français fr_FR.ISO-8859-1
+french fr_FR.ISO-8859-1
+galego gl_ES.ISO-8859-1
+galician gl_ES.ISO-8859-1
+german de_DE.ISO-8859-1
+greek el_GR.ISO-8859-7
+hebrew he_IL.ISO-8859-8
+hrvatski hr_HR.ISO-8859-2
+hungarian hu_HU.ISO-8859-2
+icelandic is_IS.ISO-8859-1
+italian it_IT.ISO-8859-1
+japanese ja_JP.eucJP
+japanese.euc ja_JP.eucJP
+ja_JP ja_JP.eucJP
+ja_JP.ujis ja_JP.eucJP
+japanese.sjis ja_JP.SJIS
+korean ko_KR.eucKR
+korean.euc ko_KR.eucKR
+ko_KR ko_KR.eucKR
+lithuanian lt_LT.ISO-8859-13
+no_NO nb_NO.ISO-8859-1
+no_NO.ISO-8859-1 nb_NO.ISO-8859-1
+norwegian nb_NO.ISO-8859-1
+nynorsk nn_NO.ISO-8859-1
+polish pl_PL.ISO-8859-2
+portuguese pt_PT.ISO-8859-1
+romanian ro_RO.ISO-8859-2
+russian ru_RU.ISO-8859-5
+slovak sk_SK.ISO-8859-2
+slovene sl_SI.ISO-8859-2
+slovenian sl_SI.ISO-8859-2
+spanish es_ES.ISO-8859-1
+swedish sv_SE.ISO-8859-1
+thai th_TH.TIS-620
+turkish tr_TR.ISO-8859-9
diff --git a/Build/source/utils/texinfo/intl/localealias.c b/Build/source/utils/texinfo/intl/localealias.c
new file mode 100644
index 00000000000..2eaf8813ed3
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/localealias.c
@@ -0,0 +1,414 @@
+/* Handle aliases for locale names.
+ Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#if defined _LIBC || defined HAVE___FSETLOCKING
+# include <stdio_ext.h>
+#endif
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# undef alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettextP.h"
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+# define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY 1
+# define HAVE___FSETLOCKING 1
+
+/* We need locking here since we can be called from different places. */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Some optimizations for glibc. */
+#ifdef _LIBC
+# define FEOF(fp) feof_unlocked (fp)
+# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp)
+#else
+# define FEOF(fp) feof (fp)
+# define FGETS(buf, n, fp) fgets (buf, n, fp)
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+struct alias_map
+{
+ const char *alias;
+ const char *value;
+};
+
+
+#ifndef _LIBC
+# define libc_freeres_ptr(decl) decl
+#endif
+
+libc_freeres_ptr (static char *string_space);
+static size_t string_space_act;
+static size_t string_space_max;
+libc_freeres_ptr (static struct alias_map *map);
+static size_t nmap;
+static size_t maxmap;
+
+
+/* Prototypes for local functions. */
+static size_t read_alias_file (const char *fname, int fname_len)
+ internal_function;
+static int extend_alias_table (void);
+static int alias_compare (const struct alias_map *map1,
+ const struct alias_map *map2);
+
+
+const char *
+_nl_expand_alias (const char *name)
+{
+ static const char *locale_alias_path;
+ struct alias_map *retval;
+ const char *result = NULL;
+ size_t added;
+
+#ifdef _LIBC
+ __libc_lock_lock (lock);
+#endif
+
+ if (locale_alias_path == NULL)
+ locale_alias_path = LOCALE_ALIAS_PATH;
+
+ do
+ {
+ struct alias_map item;
+
+ item.alias = name;
+
+ if (nmap > 0)
+ retval = (struct alias_map *) bsearch (&item, map, nmap,
+ sizeof (struct alias_map),
+ (int (*) (const void *,
+ const void *)
+ ) alias_compare);
+ else
+ retval = NULL;
+
+ /* We really found an alias. Return the value. */
+ if (retval != NULL)
+ {
+ result = retval->value;
+ break;
+ }
+
+ /* Perhaps we can find another alias file. */
+ added = 0;
+ while (added == 0 && locale_alias_path[0] != '\0')
+ {
+ const char *start;
+
+ while (locale_alias_path[0] == PATH_SEPARATOR)
+ ++locale_alias_path;
+ start = locale_alias_path;
+
+ while (locale_alias_path[0] != '\0'
+ && locale_alias_path[0] != PATH_SEPARATOR)
+ ++locale_alias_path;
+
+ if (start < locale_alias_path)
+ added = read_alias_file (start, locale_alias_path - start);
+ }
+ }
+ while (added != 0);
+
+#ifdef _LIBC
+ __libc_lock_unlock (lock);
+#endif
+
+ return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (const char *fname, int fname_len)
+{
+ FILE *fp;
+ char *full_fname;
+ size_t added;
+ static const char aliasfile[] = "/locale.alias";
+
+ full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+#ifdef HAVE_MEMPCPY
+ mempcpy (mempcpy (full_fname, fname, fname_len),
+ aliasfile, sizeof aliasfile);
+#else
+ memcpy (full_fname, fname, fname_len);
+ memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+ fp = fopen (relocate (full_fname), "r");
+ freea (full_fname);
+ if (fp == NULL)
+ return 0;
+
+#ifdef HAVE___FSETLOCKING
+ /* No threads present. */
+ __fsetlocking (fp, FSETLOCKING_BYCALLER);
+#endif
+
+ added = 0;
+ while (!FEOF (fp))
+ {
+ /* It is a reasonable approach to use a fix buffer here because
+ a) we are only interested in the first two fields
+ b) these fields must be usable as file names and so must not
+ be that long
+ We avoid a multi-kilobyte buffer here since this would use up
+ stack space which we might not have if the program ran out of
+ memory. */
+ char buf[400];
+ char *alias;
+ char *value;
+ char *cp;
+
+ if (FGETS (buf, sizeof buf, fp) == NULL)
+ /* EOF reached. */
+ break;
+
+ cp = buf;
+ /* Ignore leading white space. */
+ while (isspace ((unsigned char) cp[0]))
+ ++cp;
+
+ /* A leading '#' signals a comment line. */
+ if (cp[0] != '\0' && cp[0] != '#')
+ {
+ alias = cp++;
+ while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+ ++cp;
+ /* Terminate alias name. */
+ if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ /* Now look for the beginning of the value. */
+ while (isspace ((unsigned char) cp[0]))
+ ++cp;
+
+ if (cp[0] != '\0')
+ {
+ size_t alias_len;
+ size_t value_len;
+
+ value = cp++;
+ while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+ ++cp;
+ /* Terminate value. */
+ if (cp[0] == '\n')
+ {
+ /* This has to be done to make the following test
+ for the end of line possible. We are looking for
+ the terminating '\n' which do not overwrite here. */
+ *cp++ = '\0';
+ *cp = '\n';
+ }
+ else if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ if (nmap >= maxmap)
+ if (__builtin_expect (extend_alias_table (), 0))
+ return added;
+
+ alias_len = strlen (alias) + 1;
+ value_len = strlen (value) + 1;
+
+ if (string_space_act + alias_len + value_len > string_space_max)
+ {
+ /* Increase size of memory pool. */
+ size_t new_size = (string_space_max
+ + (alias_len + value_len > 1024
+ ? alias_len + value_len : 1024));
+ char *new_pool = (char *) realloc (string_space, new_size);
+ if (new_pool == NULL)
+ return added;
+
+ if (__builtin_expect (string_space != new_pool, 0))
+ {
+ size_t i;
+
+ for (i = 0; i < nmap; i++)
+ {
+ map[i].alias += new_pool - string_space;
+ map[i].value += new_pool - string_space;
+ }
+ }
+
+ string_space = new_pool;
+ string_space_max = new_size;
+ }
+
+ map[nmap].alias = memcpy (&string_space[string_space_act],
+ alias, alias_len);
+ string_space_act += alias_len;
+
+ map[nmap].value = memcpy (&string_space[string_space_act],
+ value, value_len);
+ string_space_act += value_len;
+
+ ++nmap;
+ ++added;
+ }
+ }
+
+ /* Possibly not the whole line fits into the buffer. Ignore
+ the rest of the line. */
+ while (strchr (buf, '\n') == NULL)
+ if (FGETS (buf, sizeof buf, fp) == NULL)
+ /* Make sure the inner loop will be left. The outer loop
+ will exit at the `feof' test. */
+ break;
+ }
+
+ /* Should we test for ferror()? I think we have to silently ignore
+ errors. --drepper */
+ fclose (fp);
+
+ if (added > 0)
+ qsort (map, nmap, sizeof (struct alias_map),
+ (int (*) (const void *, const void *)) alias_compare);
+
+ return added;
+}
+
+
+static int
+extend_alias_table ()
+{
+ size_t new_size;
+ struct alias_map *new_map;
+
+ new_size = maxmap == 0 ? 100 : 2 * maxmap;
+ new_map = (struct alias_map *) realloc (map, (new_size
+ * sizeof (struct alias_map)));
+ if (new_map == NULL)
+ /* Simply don't extend: we don't have any more core. */
+ return -1;
+
+ map = new_map;
+ maxmap = new_size;
+ return 0;
+}
+
+
+static int
+alias_compare (const struct alias_map *map1, const struct alias_map *map2)
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+ return strcasecmp (map1->alias, map2->alias);
+#else
+ const unsigned char *p1 = (const unsigned char *) map1->alias;
+ const unsigned char *p2 = (const unsigned char *) map2->alias;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ /* I know this seems to be odd but the tolower() function in
+ some systems libc cannot handle nonalpha characters. */
+ c1 = isupper (*p1) ? tolower (*p1) : *p1;
+ c2 = isupper (*p2) ? tolower (*p2) : *p2;
+ if (c1 == '\0')
+ break;
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+#endif
+}
diff --git a/Build/source/utils/texinfo/intl/localename.c b/Build/source/utils/texinfo/intl/localename.c
new file mode 100644
index 00000000000..5662e54ffe2
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/localename.c
@@ -0,0 +1,1142 @@
+/* Determine the current selected locale.
+ Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */
+/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <locale.h>
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32 /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* List of language codes, sorted by value:
+ 0x01 LANG_ARABIC
+ 0x02 LANG_BULGARIAN
+ 0x03 LANG_CATALAN
+ 0x04 LANG_CHINESE
+ 0x05 LANG_CZECH
+ 0x06 LANG_DANISH
+ 0x07 LANG_GERMAN
+ 0x08 LANG_GREEK
+ 0x09 LANG_ENGLISH
+ 0x0a LANG_SPANISH
+ 0x0b LANG_FINNISH
+ 0x0c LANG_FRENCH
+ 0x0d LANG_HEBREW
+ 0x0e LANG_HUNGARIAN
+ 0x0f LANG_ICELANDIC
+ 0x10 LANG_ITALIAN
+ 0x11 LANG_JAPANESE
+ 0x12 LANG_KOREAN
+ 0x13 LANG_DUTCH
+ 0x14 LANG_NORWEGIAN
+ 0x15 LANG_POLISH
+ 0x16 LANG_PORTUGUESE
+ 0x17 LANG_RHAETO_ROMANCE
+ 0x18 LANG_ROMANIAN
+ 0x19 LANG_RUSSIAN
+ 0x1a LANG_CROATIAN == LANG_SERBIAN
+ 0x1b LANG_SLOVAK
+ 0x1c LANG_ALBANIAN
+ 0x1d LANG_SWEDISH
+ 0x1e LANG_THAI
+ 0x1f LANG_TURKISH
+ 0x20 LANG_URDU
+ 0x21 LANG_INDONESIAN
+ 0x22 LANG_UKRAINIAN
+ 0x23 LANG_BELARUSIAN
+ 0x24 LANG_SLOVENIAN
+ 0x25 LANG_ESTONIAN
+ 0x26 LANG_LATVIAN
+ 0x27 LANG_LITHUANIAN
+ 0x28 LANG_TAJIK
+ 0x29 LANG_FARSI
+ 0x2a LANG_VIETNAMESE
+ 0x2b LANG_ARMENIAN
+ 0x2c LANG_AZERI
+ 0x2d LANG_BASQUE
+ 0x2e LANG_SORBIAN
+ 0x2f LANG_MACEDONIAN
+ 0x30 LANG_SUTU
+ 0x31 LANG_TSONGA
+ 0x32 LANG_TSWANA
+ 0x33 LANG_VENDA
+ 0x34 LANG_XHOSA
+ 0x35 LANG_ZULU
+ 0x36 LANG_AFRIKAANS
+ 0x37 LANG_GEORGIAN
+ 0x38 LANG_FAEROESE
+ 0x39 LANG_HINDI
+ 0x3a LANG_MALTESE
+ 0x3b LANG_SAAMI
+ 0x3c LANG_GAELIC
+ 0x3d LANG_YIDDISH
+ 0x3e LANG_MALAY
+ 0x3f LANG_KAZAK
+ 0x40 LANG_KYRGYZ
+ 0x41 LANG_SWAHILI
+ 0x42 LANG_TURKMEN
+ 0x43 LANG_UZBEK
+ 0x44 LANG_TATAR
+ 0x45 LANG_BENGALI
+ 0x46 LANG_PUNJABI
+ 0x47 LANG_GUJARATI
+ 0x48 LANG_ORIYA
+ 0x49 LANG_TAMIL
+ 0x4a LANG_TELUGU
+ 0x4b LANG_KANNADA
+ 0x4c LANG_MALAYALAM
+ 0x4d LANG_ASSAMESE
+ 0x4e LANG_MARATHI
+ 0x4f LANG_SANSKRIT
+ 0x50 LANG_MONGOLIAN
+ 0x51 LANG_TIBETAN
+ 0x52 LANG_WELSH
+ 0x53 LANG_CAMBODIAN
+ 0x54 LANG_LAO
+ 0x55 LANG_BURMESE
+ 0x56 LANG_GALICIAN
+ 0x57 LANG_KONKANI
+ 0x58 LANG_MANIPURI
+ 0x59 LANG_SINDHI
+ 0x5a LANG_SYRIAC
+ 0x5b LANG_SINHALESE
+ 0x5c LANG_CHEROKEE
+ 0x5d LANG_INUKTITUT
+ 0x5e LANG_AMHARIC
+ 0x5f LANG_TAMAZIGHT
+ 0x60 LANG_KASHMIRI
+ 0x61 LANG_NEPALI
+ 0x62 LANG_FRISIAN
+ 0x63 LANG_PASHTO
+ 0x64 LANG_TAGALOG
+ 0x65 LANG_DIVEHI
+ 0x66 LANG_EDO
+ 0x67 LANG_FULFULDE
+ 0x68 LANG_HAUSA
+ 0x69 LANG_IBIBIO
+ 0x6a LANG_YORUBA
+ 0x70 LANG_IGBO
+ 0x71 LANG_KANURI
+ 0x72 LANG_OROMO
+ 0x73 LANG_TIGRINYA
+ 0x74 LANG_GUARANI
+ 0x75 LANG_HAWAIIAN
+ 0x76 LANG_LATIN
+ 0x77 LANG_SOMALI
+ 0x78 LANG_YI
+ 0x79 LANG_PAPIAMENTU
+*/
+/* Mingw headers don't have latest language and sublanguage codes. */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_AMHARIC
+# define LANG_AMHARIC 0x5e
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_BURMESE
+# define LANG_BURMESE 0x55
+# endif
+# ifndef LANG_CAMBODIAN
+# define LANG_CAMBODIAN 0x53
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_CHEROKEE
+# define LANG_CHEROKEE 0x5c
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_EDO
+# define LANG_EDO 0x66
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_FRISIAN
+# define LANG_FRISIAN 0x62
+# endif
+# ifndef LANG_FULFULDE
+# define LANG_FULFULDE 0x67
+# endif
+# ifndef LANG_GAELIC
+# define LANG_GAELIC 0x3c
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GUARANI
+# define LANG_GUARANI 0x74
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HAUSA
+# define LANG_HAUSA 0x68
+# endif
+# ifndef LANG_HAWAIIAN
+# define LANG_HAWAIIAN 0x75
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_IBIBIO
+# define LANG_IBIBIO 0x69
+# endif
+# ifndef LANG_IGBO
+# define LANG_IGBO 0x70
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_INUKTITUT
+# define LANG_INUKTITUT 0x5d
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KANURI
+# define LANG_KANURI 0x71
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LAO
+# define LANG_LAO 0x54
+# endif
+# ifndef LANG_LATIN
+# define LANG_LATIN 0x76
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MALTESE
+# define LANG_MALTESE 0x3a
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_OROMO
+# define LANG_OROMO 0x72
+# endif
+# ifndef LANG_PAPIAMENTU
+# define LANG_PAPIAMENTU 0x79
+# endif
+# ifndef LANG_PASHTO
+# define LANG_PASHTO 0x63
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_RHAETO_ROMANCE
+# define LANG_RHAETO_ROMANCE 0x17
+# endif
+# ifndef LANG_SAAMI
+# define LANG_SAAMI 0x3b
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SINHALESE
+# define LANG_SINHALESE 0x5b
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SOMALI
+# define LANG_SOMALI 0x77
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SUTU
+# define LANG_SUTU 0x30
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAGALOG
+# define LANG_TAGALOG 0x64
+# endif
+# ifndef LANG_TAJIK
+# define LANG_TAJIK 0x28
+# endif
+# ifndef LANG_TAMAZIGHT
+# define LANG_TAMAZIGHT 0x5f
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_TIBETAN
+# define LANG_TIBETAN 0x51
+# endif
+# ifndef LANG_TIGRINYA
+# define LANG_TIGRINYA 0x73
+# endif
+# ifndef LANG_TSONGA
+# define LANG_TSONGA 0x31
+# endif
+# ifndef LANG_TSWANA
+# define LANG_TSWANA 0x32
+# endif
+# ifndef LANG_TURKMEN
+# define LANG_TURKMEN 0x42
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VENDA
+# define LANG_VENDA 0x33
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef LANG_WELSH
+# define LANG_WELSH 0x52
+# endif
+# ifndef LANG_XHOSA
+# define LANG_XHOSA 0x34
+# endif
+# ifndef LANG_YI
+# define LANG_YI 0x78
+# endif
+# ifndef LANG_YIDDISH
+# define LANG_YIDDISH 0x3d
+# endif
+# ifndef LANG_YORUBA
+# define LANG_YORUBA 0x6a
+# endif
+# ifndef LANG_ZULU
+# define LANG_ZULU 0x35
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_BENGALI_INDIA
+# define SUBLANG_BENGALI_INDIA 0x00
+# endif
+# ifndef SUBLANG_BENGALI_BANGLADESH
+# define SUBLANG_BENGALI_BANGLADESH 0x01
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_ENGLISH_INDONESIA
+# define SUBLANG_ENGLISH_INDONESIA 0x0e
+# endif
+# ifndef SUBLANG_ENGLISH_HONGKONG
+# define SUBLANG_ENGLISH_HONGKONG 0x0f
+# endif
+# ifndef SUBLANG_ENGLISH_INDIA
+# define SUBLANG_ENGLISH_INDIA 0x10
+# endif
+# ifndef SUBLANG_ENGLISH_MALAYSIA
+# define SUBLANG_ENGLISH_MALAYSIA 0x11
+# endif
+# ifndef SUBLANG_ENGLISH_SINGAPORE
+# define SUBLANG_ENGLISH_SINGAPORE 0x12
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_FRENCH_WESTINDIES
+# define SUBLANG_FRENCH_WESTINDIES 0x07
+# endif
+# ifndef SUBLANG_FRENCH_REUNION
+# define SUBLANG_FRENCH_REUNION 0x08
+# endif
+# ifndef SUBLANG_FRENCH_CONGO
+# define SUBLANG_FRENCH_CONGO 0x09
+# endif
+# ifndef SUBLANG_FRENCH_SENEGAL
+# define SUBLANG_FRENCH_SENEGAL 0x0a
+# endif
+# ifndef SUBLANG_FRENCH_CAMEROON
+# define SUBLANG_FRENCH_CAMEROON 0x0b
+# endif
+# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+# endif
+# ifndef SUBLANG_FRENCH_MALI
+# define SUBLANG_FRENCH_MALI 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_MOROCCO
+# define SUBLANG_FRENCH_MOROCCO 0x0e
+# endif
+# ifndef SUBLANG_FRENCH_HAITI
+# define SUBLANG_FRENCH_HAITI 0x0f
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_PUNJABI_INDIA
+# define SUBLANG_PUNJABI_INDIA 0x00
+# endif
+# ifndef SUBLANG_PUNJABI_PAKISTAN
+# define SUBLANG_PUNJABI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_ROMANIAN_ROMANIA
+# define SUBLANG_ROMANIAN_ROMANIA 0x00
+# endif
+# ifndef SUBLANG_ROMANIAN_MOLDOVA
+# define SUBLANG_ROMANIAN_MOLDOVA 0x01
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SINDHI_INDIA
+# define SUBLANG_SINDHI_INDIA 0x00
+# endif
+# ifndef SUBLANG_SINDHI_PAKISTAN
+# define SUBLANG_SINDHI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ARABIC
+# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_LATIN
+# define SUBLANG_TAMAZIGHT_LATIN 0x02
+# endif
+# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+# define SUBLANG_TIGRINYA_ETHIOPIA 0x00
+# endif
+# ifndef SUBLANG_TIGRINYA_ERITREA
+# define SUBLANG_TIGRINYA_ERITREA 0x01
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+#endif
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+ "Directs 'setlocale()' to query 'category' and return the current
+ setting of 'local'."
+ However it does not specify the exact format. Neither do SUSV2 and
+ ISO C 99. So we can use this feature only on selected systems (e.g.
+ those using GNU C Library). */
+#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+ language[_territory[.codeset]][@modifier]
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+
+const char *
+_nl_locale_name (int category, const char *categoryname)
+{
+ const char *retval;
+
+#ifndef WIN32
+
+ /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+ On some systems this can be done by the 'setlocale' function itself. */
+# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+ retval = setlocale (category, NULL);
+# else
+ /* Setting of LC_ALL overwrites all other. */
+ retval = getenv ("LC_ALL");
+ if (retval == NULL || retval[0] == '\0')
+ {
+ /* Next comes the name of the desired category. */
+ retval = getenv (categoryname);
+ if (retval == NULL || retval[0] == '\0')
+ {
+ /* Last possibility is the LANG environment variable. */
+ retval = getenv ("LANG");
+ if (retval == NULL || retval[0] == '\0')
+ /* We use C as the default domain. POSIX says this is
+ implementation defined. */
+ retval = "C";
+ }
+ }
+# endif
+
+ return retval;
+
+#else /* WIN32 */
+
+ /* Return an XPG style locale name language[_territory][@modifier].
+ Don't even bother determining the codeset; it's not useful in this
+ context, because message catalogs are not specific to a single
+ codeset. */
+
+ LCID lcid;
+ LANGID langid;
+ int primary, sub;
+
+ /* Let the user override the system settings through environment
+ variables, as on POSIX systems. */
+ retval = getenv ("LC_ALL");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+ retval = getenv (categoryname);
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+ retval = getenv ("LANG");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* Use native Win32 API locale ID. */
+ lcid = GetThreadLocale ();
+
+ /* Strip off the sorting rules, keep only the language part. */
+ langid = LANGIDFROMLCID (lcid);
+
+ /* Split into language and territory part. */
+ primary = PRIMARYLANGID (langid);
+ sub = SUBLANGID (langid);
+
+ /* Dispatch on language.
+ See also http://www.unicode.org/unicode/onlinedat/languages.html .
+ For details about languages, see http://www.ethnologue.com/ . */
+ switch (primary)
+ {
+ case LANG_AFRIKAANS: return "af_ZA";
+ case LANG_ALBANIAN: return "sq_AL";
+ case LANG_AMHARIC: return "am_ET";
+ case LANG_ARABIC:
+ switch (sub)
+ {
+ case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+ case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+ case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+ case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+ case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+ case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+ case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+ case SUBLANG_ARABIC_OMAN: return "ar_OM";
+ case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+ case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+ case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+ case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+ case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+ case SUBLANG_ARABIC_UAE: return "ar_AE";
+ case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+ case SUBLANG_ARABIC_QATAR: return "ar_QA";
+ }
+ return "ar";
+ case LANG_ARMENIAN: return "hy_AM";
+ case LANG_ASSAMESE: return "as_IN";
+ case LANG_AZERI:
+ switch (sub)
+ {
+ /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */
+ case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
+ case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
+ }
+ return "az";
+ case LANG_BASQUE:
+ return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */
+ case LANG_BELARUSIAN: return "be_BY";
+ case LANG_BENGALI:
+ switch (sub)
+ {
+ case SUBLANG_BENGALI_INDIA: return "bn_IN";
+ case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+ }
+ return "bn";
+ case LANG_BULGARIAN: return "bg_BG";
+ case LANG_BURMESE: return "my_MM";
+ case LANG_CAMBODIAN: return "km_KH";
+ case LANG_CATALAN: return "ca_ES";
+ case LANG_CHEROKEE: return "chr_US";
+ case LANG_CHINESE:
+ switch (sub)
+ {
+ case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
+ case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
+ case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
+ case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
+ case SUBLANG_CHINESE_MACAU: return "zh_MO";
+ }
+ return "zh";
+ case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN
+ * What used to be called Serbo-Croatian
+ * should really now be two separate
+ * languages because of political reasons.
+ * (Says tml, who knows nothing about Serbian
+ * or Croatian.)
+ * (I can feel those flames coming already.)
+ */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "hr_HR";
+ case SUBLANG_SERBIAN_LATIN: return "sr_CS";
+ case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";
+ }
+ return "hr";
+ case LANG_CZECH: return "cs_CZ";
+ case LANG_DANISH: return "da_DK";
+ case LANG_DIVEHI: return "dv_MV";
+ case LANG_DUTCH:
+ switch (sub)
+ {
+ case SUBLANG_DUTCH: return "nl_NL";
+ case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+ }
+ return "nl";
+ case LANG_EDO: return "bin_NG";
+ case LANG_ENGLISH:
+ switch (sub)
+ {
+ /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+ * English was the language spoken in England.
+ * Oh well.
+ */
+ case SUBLANG_ENGLISH_US: return "en_US";
+ case SUBLANG_ENGLISH_UK: return "en_GB";
+ case SUBLANG_ENGLISH_AUS: return "en_AU";
+ case SUBLANG_ENGLISH_CAN: return "en_CA";
+ case SUBLANG_ENGLISH_NZ: return "en_NZ";
+ case SUBLANG_ENGLISH_EIRE: return "en_IE";
+ case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+ case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+ case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+ case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+ case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+ case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+ case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+ case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+ case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+ case SUBLANG_ENGLISH_INDIA: return "en_IN";
+ case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+ case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+ }
+ return "en";
+ case LANG_ESTONIAN: return "et_EE";
+ case LANG_FAEROESE: return "fo_FO";
+ case LANG_FARSI: return "fa_IR";
+ case LANG_FINNISH: return "fi_FI";
+ case LANG_FRENCH:
+ switch (sub)
+ {
+ case SUBLANG_FRENCH: return "fr_FR";
+ case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+ case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+ case SUBLANG_FRENCH_SWISS: return "fr_CH";
+ case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+ case SUBLANG_FRENCH_MONACO: return "fr_MC";
+ case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+ case SUBLANG_FRENCH_REUNION: return "fr_RE";
+ case SUBLANG_FRENCH_CONGO: return "fr_CG";
+ case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+ case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+ case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+ case SUBLANG_FRENCH_MALI: return "fr_ML";
+ case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+ case SUBLANG_FRENCH_HAITI: return "fr_HT";
+ }
+ return "fr";
+ case LANG_FRISIAN: return "fy_NL";
+ case LANG_FULFULDE:
+ /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */
+ return "ff_NG";
+ case LANG_GAELIC:
+ switch (sub)
+ {
+ case 0x01: /* SCOTTISH */ return "gd_GB";
+ case 0x02: /* IRISH */ return "ga_IE";
+ }
+ return "C";
+ case LANG_GALICIAN: return "gl_ES";
+ case LANG_GEORGIAN: return "ka_GE";
+ case LANG_GERMAN:
+ switch (sub)
+ {
+ case SUBLANG_GERMAN: return "de_DE";
+ case SUBLANG_GERMAN_SWISS: return "de_CH";
+ case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+ case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+ case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+ }
+ return "de";
+ case LANG_GREEK: return "el_GR";
+ case LANG_GUARANI: return "gn_PY";
+ case LANG_GUJARATI: return "gu_IN";
+ case LANG_HAUSA: return "ha_NG";
+ case LANG_HAWAIIAN:
+ /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+ or Hawaii Creole English ("cpe_US", 600000 speakers)? */
+ return "cpe_US";
+ case LANG_HEBREW: return "he_IL";
+ case LANG_HINDI: return "hi_IN";
+ case LANG_HUNGARIAN: return "hu_HU";
+ case LANG_IBIBIO: return "nic_NG";
+ case LANG_ICELANDIC: return "is_IS";
+ case LANG_IGBO: return "ig_NG";
+ case LANG_INDONESIAN: return "id_ID";
+ case LANG_INUKTITUT: return "iu_CA";
+ case LANG_ITALIAN:
+ switch (sub)
+ {
+ case SUBLANG_ITALIAN: return "it_IT";
+ case SUBLANG_ITALIAN_SWISS: return "it_CH";
+ }
+ return "it";
+ case LANG_JAPANESE: return "ja_JP";
+ case LANG_KANNADA: return "kn_IN";
+ case LANG_KANURI: return "kr_NG";
+ case LANG_KASHMIRI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ks_PK";
+ case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+ }
+ return "ks";
+ case LANG_KAZAK: return "kk_KZ";
+ case LANG_KONKANI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ return "kok_IN";
+ case LANG_KOREAN: return "ko_KR";
+ case LANG_KYRGYZ: return "ky_KG";
+ case LANG_LAO: return "lo_LA";
+ case LANG_LATIN: return "la_VA";
+ case LANG_LATVIAN: return "lv_LV";
+ case LANG_LITHUANIAN: return "lt_LT";
+ case LANG_MACEDONIAN: return "mk_MK";
+ case LANG_MALAY:
+ switch (sub)
+ {
+ case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+ case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+ }
+ return "ms";
+ case LANG_MALAYALAM: return "ml_IN";
+ case LANG_MALTESE: return "mt_MT";
+ case LANG_MANIPURI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ return "mni_IN";
+ case LANG_MARATHI: return "mr_IN";
+ case LANG_MONGOLIAN:
+ return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */
+ case LANG_NEPALI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ne_NP";
+ case SUBLANG_NEPALI_INDIA: return "ne_IN";
+ }
+ return "ne";
+ case LANG_NORWEGIAN:
+ switch (sub)
+ {
+ case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO";
+ case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+ }
+ return "no";
+ case LANG_ORIYA: return "or_IN";
+ case LANG_OROMO: return "om_ET";
+ case LANG_PAPIAMENTU: return "pap_AN";
+ case LANG_PASHTO:
+ return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */
+ case LANG_POLISH: return "pl_PL";
+ case LANG_PORTUGUESE:
+ switch (sub)
+ {
+ case SUBLANG_PORTUGUESE: return "pt_PT";
+ /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+ Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+ }
+ return "pt";
+ case LANG_PUNJABI:
+ switch (sub)
+ {
+ case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+ case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+ }
+ return "pa";
+ case LANG_RHAETO_ROMANCE: return "rm_CH";
+ case LANG_ROMANIAN:
+ switch (sub)
+ {
+ case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+ case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+ }
+ return "ro";
+ case LANG_RUSSIAN:
+ return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */
+ case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";
+ case LANG_SANSKRIT: return "sa_IN";
+ case LANG_SINDHI:
+ switch (sub)
+ {
+ case SUBLANG_SINDHI_INDIA: return "sd_IN";
+ case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+ }
+ return "sd";
+ case LANG_SINHALESE: return "si_LK";
+ case LANG_SLOVAK: return "sk_SK";
+ case LANG_SLOVENIAN: return "sl_SI";
+ case LANG_SOMALI: return "so_SO";
+ case LANG_SORBIAN:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ return "wen_DE";
+ case LANG_SPANISH:
+ switch (sub)
+ {
+ case SUBLANG_SPANISH: return "es_ES";
+ case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+ case SUBLANG_SPANISH_MODERN:
+ return "es_ES@modern"; /* not seen on Unix */
+ case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+ case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+ case SUBLANG_SPANISH_PANAMA: return "es_PA";
+ case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+ case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+ case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+ case SUBLANG_SPANISH_PERU: return "es_PE";
+ case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+ case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+ case SUBLANG_SPANISH_CHILE: return "es_CL";
+ case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+ case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+ case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+ case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+ case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+ case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+ case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+ }
+ return "es";
+ case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+ case LANG_SWAHILI: return "sw_KE";
+ case LANG_SWEDISH:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "sv_SE";
+ case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+ }
+ return "sv";
+ case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */
+ case LANG_TAGALOG: return "tl_PH";
+ case LANG_TAJIK: return "tg_TJ";
+ case LANG_TAMAZIGHT:
+ switch (sub)
+ {
+ /* FIXME: Adjust this when Tamazight locales appear on Unix. */
+ case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";
+ case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA@latin";
+ }
+ return "ber_MA";
+ case LANG_TAMIL:
+ return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */
+ case LANG_TATAR: return "tt_RU";
+ case LANG_TELUGU: return "te_IN";
+ case LANG_THAI: return "th_TH";
+ case LANG_TIBETAN: return "bo_CN";
+ case LANG_TIGRINYA:
+ switch (sub)
+ {
+ case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+ case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+ }
+ return "ti";
+ case LANG_TSONGA: return "ts_ZA";
+ case LANG_TSWANA: return "tn_BW";
+ case LANG_TURKISH: return "tr_TR";
+ case LANG_TURKMEN: return "tk_TM";
+ case LANG_UKRAINIAN: return "uk_UA";
+ case LANG_URDU:
+ switch (sub)
+ {
+ case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+ case SUBLANG_URDU_INDIA: return "ur_IN";
+ }
+ return "ur";
+ case LANG_UZBEK:
+ switch (sub)
+ {
+ case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+ case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
+ }
+ return "uz";
+ case LANG_VENDA: return "ve_ZA";
+ case LANG_VIETNAMESE: return "vi_VN";
+ case LANG_WELSH: return "cy_GB";
+ case LANG_XHOSA: return "xh_ZA";
+ case LANG_YI: return "sit_CN";
+ case LANG_YIDDISH: return "yi_IL";
+ case LANG_YORUBA: return "yo_NG";
+ case LANG_ZULU: return "zu_ZA";
+ default: return "C";
+ }
+
+#endif
+}
diff --git a/Build/source/utils/texinfo/intl/log.c b/Build/source/utils/texinfo/intl/log.c
new file mode 100644
index 00000000000..cb6076e80f7
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/log.c
@@ -0,0 +1,98 @@
+/* Log file output.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Print an ASCII string with quotes and escape sequences where needed. */
+static void
+print_escaped (FILE *stream, const char *str)
+{
+ putc ('"', stream);
+ for (; *str != '\0'; str++)
+ if (*str == '\n')
+ {
+ fputs ("\\n\"", stream);
+ if (str[1] == '\0')
+ return;
+ fputs ("\n\"", stream);
+ }
+ else
+ {
+ if (*str == '"' || *str == '\\')
+ putc ('\\', stream);
+ putc (*str, stream);
+ }
+ putc ('"', stream);
+}
+
+/* Add to the log file an entry denoting a failed translation. */
+void
+_nl_log_untranslated (const char *logfilename, const char *domainname,
+ const char *msgid1, const char *msgid2, int plural)
+{
+ static char *last_logfilename = NULL;
+ static FILE *last_logfile = NULL;
+ FILE *logfile;
+
+ /* Can we reuse the last opened logfile? */
+ if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
+ {
+ /* Close the last used logfile. */
+ if (last_logfilename != NULL)
+ {
+ if (last_logfile != NULL)
+ {
+ fclose (last_logfile);
+ last_logfile = NULL;
+ }
+ free (last_logfilename);
+ last_logfilename = NULL;
+ }
+ /* Open the logfile. */
+ last_logfilename = (char *) malloc (strlen (logfilename) + 1);
+ if (last_logfilename == NULL)
+ return;
+ strcpy (last_logfilename, logfilename);
+ last_logfile = fopen (logfilename, "a");
+ if (last_logfile == NULL)
+ return;
+ }
+ logfile = last_logfile;
+
+ fprintf (logfile, "domain ");
+ print_escaped (logfile, domainname);
+ fprintf (logfile, "\nmsgid ");
+ print_escaped (logfile, msgid1);
+ if (plural)
+ {
+ fprintf (logfile, "\nmsgid_plural ");
+ print_escaped (logfile, msgid2);
+ fprintf (logfile, "\nmsgstr[0] \"\"\n");
+ }
+ else
+ fprintf (logfile, "\nmsgstr \"\"\n");
+ putc ('\n', logfile);
+}
diff --git a/Build/source/utils/texinfo/intl/ngettext.c b/Build/source/utils/texinfo/intl/ngettext.c
new file mode 100644
index 00000000000..e73e00c48b2
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/ngettext.c
@@ -0,0 +1,65 @@
+/* Implementation of ngettext(3) function.
+ Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h> /* Just for NULL. */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+#include <locale.h>
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define NGETTEXT __ngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define NGETTEXT libintl_ngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+char *
+NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+ return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__ngettext, ngettext);
+#endif
diff --git a/Build/source/utils/texinfo/intl/os2compat.c b/Build/source/utils/texinfo/intl/os2compat.c
new file mode 100644
index 00000000000..c8dc33e7cf4
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/os2compat.c
@@ -0,0 +1,98 @@
+/* OS/2 compatibility functions.
+ Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#define OS2_AWARE
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+/* A version of getenv() that works from DLLs */
+extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue);
+
+char *
+_nl_getenv (const char *name)
+{
+ unsigned char *value;
+ if (DosScanEnv (name, &value))
+ return NULL;
+ else
+ return value;
+}
+
+/* A fixed size buffer. */
+char libintl_nl_default_dirname[MAXPATHLEN+1];
+
+char *_nlos2_libdir = NULL;
+char *_nlos2_localealiaspath = NULL;
+char *_nlos2_localedir = NULL;
+
+static __attribute__((constructor)) void
+nlos2_initialize ()
+{
+ char *root = getenv ("UNIXROOT");
+ char *gnulocaledir = getenv ("GNULOCALEDIR");
+
+ _nlos2_libdir = gnulocaledir;
+ if (!_nlos2_libdir)
+ {
+ if (root)
+ {
+ size_t sl = strlen (root);
+ _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1);
+ memcpy (_nlos2_libdir, root, sl);
+ memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1);
+ }
+ else
+ _nlos2_libdir = LIBDIR;
+ }
+
+ _nlos2_localealiaspath = gnulocaledir;
+ if (!_nlos2_localealiaspath)
+ {
+ if (root)
+ {
+ size_t sl = strlen (root);
+ _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1);
+ memcpy (_nlos2_localealiaspath, root, sl);
+ memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1);
+ }
+ else
+ _nlos2_localealiaspath = LOCALE_ALIAS_PATH;
+ }
+
+ _nlos2_localedir = gnulocaledir;
+ if (!_nlos2_localedir)
+ {
+ if (root)
+ {
+ size_t sl = strlen (root);
+ _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1);
+ memcpy (_nlos2_localedir, root, sl);
+ memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1);
+ }
+ else
+ _nlos2_localedir = LOCALEDIR;
+ }
+
+ if (strlen (_nlos2_localedir) <= MAXPATHLEN)
+ strcpy (libintl_nl_default_dirname, _nlos2_localedir);
+}
diff --git a/Build/source/utils/texinfo/intl/os2compat.h b/Build/source/utils/texinfo/intl/os2compat.h
new file mode 100644
index 00000000000..4f74e8c0375
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/os2compat.h
@@ -0,0 +1,46 @@
+/* OS/2 compatibility defines.
+ This file is intended to be included from config.h
+ Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* When included from os2compat.h we need all the original definitions */
+#ifndef OS2_AWARE
+
+#undef LIBDIR
+#define LIBDIR _nlos2_libdir
+extern char *_nlos2_libdir;
+
+#undef LOCALEDIR
+#define LOCALEDIR _nlos2_localedir
+extern char *_nlos2_localedir;
+
+#undef LOCALE_ALIAS_PATH
+#define LOCALE_ALIAS_PATH _nlos2_localealiaspath
+extern char *_nlos2_localealiaspath;
+
+#endif
+
+#undef HAVE_STRCASECMP
+#define HAVE_STRCASECMP 1
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+
+/* We have our own getenv() which works even if library is compiled as DLL */
+#define getenv _nl_getenv
+
+/* Older versions of gettext used -1 as the value of LC_MESSAGES */
+#define LC_MESSAGES_COMPAT (-1)
diff --git a/Build/source/utils/texinfo/intl/osdep.c b/Build/source/utils/texinfo/intl/osdep.c
new file mode 100644
index 00000000000..b3725983818
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/osdep.c
@@ -0,0 +1,24 @@
+/* OS dependent parts of libintl.
+ Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#if defined __EMX__
+# include "os2compat.c"
+#else
+/* Avoid AIX compiler warning. */
+typedef int dummy;
+#endif
diff --git a/Build/source/utils/texinfo/intl/plural-exp.c b/Build/source/utils/texinfo/intl/plural-exp.c
new file mode 100644
index 00000000000..8c04e642659
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/plural-exp.c
@@ -0,0 +1,154 @@
+/* Expression parsing for plural form selection.
+ Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plural-exp.h"
+
+#if (defined __GNUC__ && !defined __APPLE_CC__) \
+ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+
+/* These structs are the constant expression for the germanic plural
+ form determination. It represents the expression "n != 1". */
+static const struct expression plvar =
+{
+ .nargs = 0,
+ .operation = var,
+};
+static const struct expression plone =
+{
+ .nargs = 0,
+ .operation = num,
+ .val =
+ {
+ .num = 1
+ }
+};
+struct expression GERMANIC_PLURAL =
+{
+ .nargs = 2,
+ .operation = not_equal,
+ .val =
+ {
+ .args =
+ {
+ [0] = (struct expression *) &plvar,
+ [1] = (struct expression *) &plone
+ }
+ }
+};
+
+# define INIT_GERMANIC_PLURAL()
+
+#else
+
+/* For compilers without support for ISO C 99 struct/union initializers:
+ Initialization at run-time. */
+
+static struct expression plvar;
+static struct expression plone;
+struct expression GERMANIC_PLURAL;
+
+static void
+init_germanic_plural ()
+{
+ if (plone.val.num == 0)
+ {
+ plvar.nargs = 0;
+ plvar.operation = var;
+
+ plone.nargs = 0;
+ plone.operation = num;
+ plone.val.num = 1;
+
+ GERMANIC_PLURAL.nargs = 2;
+ GERMANIC_PLURAL.operation = not_equal;
+ GERMANIC_PLURAL.val.args[0] = &plvar;
+ GERMANIC_PLURAL.val.args[1] = &plone;
+ }
+}
+
+# define INIT_GERMANIC_PLURAL() init_germanic_plural ()
+
+#endif
+
+void
+internal_function
+EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp,
+ unsigned long int *npluralsp)
+{
+ if (nullentry != NULL)
+ {
+ const char *plural;
+ const char *nplurals;
+
+ plural = strstr (nullentry, "plural=");
+ nplurals = strstr (nullentry, "nplurals=");
+ if (plural == NULL || nplurals == NULL)
+ goto no_plural;
+ else
+ {
+ char *endp;
+ unsigned long int n;
+ struct parse_args args;
+
+ /* First get the number. */
+ nplurals += 9;
+ while (*nplurals != '\0' && isspace ((unsigned char) *nplurals))
+ ++nplurals;
+ if (!(*nplurals >= '0' && *nplurals <= '9'))
+ goto no_plural;
+#if defined HAVE_STRTOUL || defined _LIBC
+ n = strtoul (nplurals, &endp, 10);
+#else
+ for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++)
+ n = n * 10 + (*endp - '0');
+#endif
+ if (nplurals == endp)
+ goto no_plural;
+ *npluralsp = n;
+
+ /* Due to the restrictions bison imposes onto the interface of the
+ scanner function we have to put the input string and the result
+ passed up from the parser into the same structure which address
+ is passed down to the parser. */
+ plural += 7;
+ args.cp = plural;
+ if (PLURAL_PARSE (&args) != 0)
+ goto no_plural;
+ *pluralp = args.res;
+ }
+ }
+ else
+ {
+ /* By default we are using the Germanic form: singular form only
+ for `one', the plural form otherwise. Yes, this is also what
+ English is using since English is a Germanic language. */
+ no_plural:
+ INIT_GERMANIC_PLURAL ();
+ *pluralp = &GERMANIC_PLURAL;
+ *npluralsp = 2;
+ }
+}
diff --git a/Build/source/utils/texinfo/intl/plural-exp.h b/Build/source/utils/texinfo/intl/plural-exp.h
new file mode 100644
index 00000000000..49e2c5bfc66
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/plural-exp.h
@@ -0,0 +1,118 @@
+/* Expression parsing and evaluation for plural form selection.
+ Copyright (C) 2000-2003 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _PLURAL_EXP_H
+#define _PLURAL_EXP_H
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+
+/* This is the representation of the expressions to determine the
+ plural form. */
+struct expression
+{
+ int nargs; /* Number of arguments. */
+ enum operator
+ {
+ /* Without arguments: */
+ var, /* The variable "n". */
+ num, /* Decimal number. */
+ /* Unary operators: */
+ lnot, /* Logical NOT. */
+ /* Binary operators: */
+ mult, /* Multiplication. */
+ divide, /* Division. */
+ module, /* Modulo operation. */
+ plus, /* Addition. */
+ minus, /* Subtraction. */
+ less_than, /* Comparison. */
+ greater_than, /* Comparison. */
+ less_or_equal, /* Comparison. */
+ greater_or_equal, /* Comparison. */
+ equal, /* Comparison for equality. */
+ not_equal, /* Comparison for inequality. */
+ land, /* Logical AND. */
+ lor, /* Logical OR. */
+ /* Ternary operators: */
+ qmop /* Question mark operator. */
+ } operation;
+ union
+ {
+ unsigned long int num; /* Number value for `num'. */
+ struct expression *args[3]; /* Up to three arguments. */
+ } val;
+};
+
+/* This is the data structure to pass information to the parser and get
+ the result in a thread-safe way. */
+struct parse_args
+{
+ const char *cp;
+ struct expression *res;
+};
+
+
+/* Names for the libintl functions are a problem. This source code is used
+ 1. in the GNU C Library library,
+ 2. in the GNU libintl library,
+ 3. in the GNU gettext tools.
+ The function names in each situation must be different, to allow for
+ binary incompatible changes in 'struct expression'. Furthermore,
+ 1. in the GNU C Library library, the names have a __ prefix,
+ 2.+3. in the GNU libintl library and in the GNU gettext tools, the names
+ must follow ANSI C and not start with __.
+ So we have to distinguish the three cases. */
+#ifdef _LIBC
+# define FREE_EXPRESSION __gettext_free_exp
+# define PLURAL_PARSE __gettextparse
+# define GERMANIC_PLURAL __gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
+#elif defined (IN_LIBINTL)
+# define FREE_EXPRESSION libintl_gettext_free_exp
+# define PLURAL_PARSE libintl_gettextparse
+# define GERMANIC_PLURAL libintl_gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
+#else
+# define FREE_EXPRESSION free_plural_expression
+# define PLURAL_PARSE parse_plural_expression
+# define GERMANIC_PLURAL germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
+#endif
+
+extern void FREE_EXPRESSION (struct expression *exp)
+ internal_function;
+extern int PLURAL_PARSE (void *arg);
+extern struct expression GERMANIC_PLURAL attribute_hidden;
+extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
+ struct expression **pluralp,
+ unsigned long int *npluralsp)
+ internal_function;
+
+#if !defined (_LIBC) && !defined (IN_LIBINTL)
+extern unsigned long int plural_eval (struct expression *pexp,
+ unsigned long int n);
+#endif
+
+#endif /* _PLURAL_EXP_H */
diff --git a/Build/source/utils/texinfo/intl/plural.c b/Build/source/utils/texinfo/intl/plural.c
new file mode 100644
index 00000000000..72494f9eb92
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/plural.c
@@ -0,0 +1,1490 @@
+/* A Bison parser, made from plural.y
+ by GNU bison 1.35. */
+
+#define YYBISON 1 /* Identify Bison output. */
+
+#define yyparse __gettextparse
+#define yylex __gettextlex
+#define yyerror __gettexterror
+#define yylval __gettextlval
+#define yychar __gettextchar
+#define yydebug __gettextdebug
+#define yynerrs __gettextnerrs
+# define EQUOP2 257
+# define CMPOP2 258
+# define ADDOP2 259
+# define MULOP2 260
+# define NUMBER 261
+
+#line 1 "plural.y"
+
+/* Expression parsing for plural form selection.
+ Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* The bison generated parser uses alloca. AIX 3 forces us to put this
+ declaration at the beginning of the file. The declaration in bison's
+ skeleton file comes too late. This must come before <config.h>
+ because <config.h> may include arbitrary system headers. */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+ but we want it to be called PLURAL_PARSE. */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM arg
+
+#line 49 "plural.y"
+#ifndef YYSTYPE
+typedef union {
+ unsigned long int num;
+ enum operator op;
+ struct expression *exp;
+} yystype;
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+#line 55 "plural.y"
+
+/* Prototypes for local functions. */
+static int yylex (YYSTYPE *lval, const char **pexp);
+static void yyerror (const char *str);
+
+/* Allocation of expressions. */
+
+static struct expression *
+new_exp (int nargs, enum operator op, struct expression * const *args)
+{
+ int i;
+ struct expression *newp;
+
+ /* If any of the argument could not be malloc'ed, just return NULL. */
+ for (i = nargs - 1; i >= 0; i--)
+ if (args[i] == NULL)
+ goto fail;
+
+ /* Allocate a new expression. */
+ newp = (struct expression *) malloc (sizeof (*newp));
+ if (newp != NULL)
+ {
+ newp->nargs = nargs;
+ newp->operation = op;
+ for (i = nargs - 1; i >= 0; i--)
+ newp->val.args[i] = args[i];
+ return newp;
+ }
+
+ fail:
+ for (i = nargs - 1; i >= 0; i--)
+ FREE_EXPRESSION (args[i]);
+
+ return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (enum operator op)
+{
+ return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (enum operator op, struct expression *right)
+{
+ struct expression *args[1];
+
+ args[0] = right;
+ return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (enum operator op, struct expression *left, struct expression *right)
+{
+ struct expression *args[2];
+
+ args[0] = left;
+ args[1] = right;
+ return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (enum operator op, struct expression *bexp,
+ struct expression *tbranch, struct expression *fbranch)
+{
+ struct expression *args[3];
+
+ args[0] = bexp;
+ args[1] = tbranch;
+ args[2] = fbranch;
+ return new_exp (3, op, args);
+}
+
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define YYFINAL 27
+#define YYFLAG -32768
+#define YYNTBASE 16
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 10, 2, 2, 2, 2, 5, 2,
+ 14, 15, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 12, 2,
+ 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 13, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 4, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 6, 7, 8,
+ 9, 11
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+ 0, 0, 2, 8, 12, 16, 20, 24, 28, 32,
+ 35, 37, 39
+};
+static const short yyrhs[] =
+{
+ 17, 0, 17, 3, 17, 12, 17, 0, 17, 4,
+ 17, 0, 17, 5, 17, 0, 17, 6, 17, 0,
+ 17, 7, 17, 0, 17, 8, 17, 0, 17, 9,
+ 17, 0, 10, 17, 0, 13, 0, 11, 0, 14,
+ 17, 15, 0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+ 0, 150, 158, 162, 166, 170, 174, 178, 182, 186,
+ 190, 194, 199
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+ "$", "error", "$undefined.", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2",
+ "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'",
+ "start", "exp", 0
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+ 0, 16, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+ 0, 1, 5, 3, 3, 3, 3, 3, 3, 2,
+ 1, 1, 3
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+ doesn't specify something else to do. Zero means the default is an
+ error. */
+static const short yydefact[] =
+{
+ 0, 0, 11, 10, 0, 1, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12, 0, 3, 4, 5,
+ 6, 7, 8, 0, 2, 0, 0, 0
+};
+
+static const short yydefgoto[] =
+{
+ 25, 5
+};
+
+static const short yypact[] =
+{
+ -9, -9,-32768,-32768, -9, 34,-32768, 11, -9, -9,
+ -9, -9, -9, -9, -9,-32768, 24, 39, 43, 16,
+ 26, -3,-32768, -9, 34, 21, 53,-32768
+};
+
+static const short yypgoto[] =
+{
+ -32768, -1
+};
+
+
+#define YYLAST 53
+
+
+static const short yytable[] =
+{
+ 6, 1, 2, 7, 3, 4, 14, 16, 17, 18,
+ 19, 20, 21, 22, 8, 9, 10, 11, 12, 13,
+ 14, 26, 24, 12, 13, 14, 15, 8, 9, 10,
+ 11, 12, 13, 14, 13, 14, 23, 8, 9, 10,
+ 11, 12, 13, 14, 10, 11, 12, 13, 14, 11,
+ 12, 13, 14, 27
+};
+
+static const short yycheck[] =
+{
+ 1, 10, 11, 4, 13, 14, 9, 8, 9, 10,
+ 11, 12, 13, 14, 3, 4, 5, 6, 7, 8,
+ 9, 0, 23, 7, 8, 9, 15, 3, 4, 5,
+ 6, 7, 8, 9, 8, 9, 12, 3, 4, 5,
+ 6, 7, 8, 9, 5, 6, 7, 8, 9, 6,
+ 7, 8, 9, 0
+};
+#define YYPURE 1
+
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "/usr/local/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* This is the parser code that is written into each bison parser when
+ the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# else
+# ifndef YYSTACK_USE_ALLOCA
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# define YYSTACK_ALLOC malloc
+# define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if (! defined (yyoverflow) \
+ && (! defined (__cplusplus) \
+ || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short yyss;
+ YYSTYPE yyvs;
+# if YYLSP_NEEDED
+ YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# if YYLSP_NEEDED
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+ + 2 * YYSTACK_GAP_MAX)
+# else
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAX)
+# endif
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ register YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up"); \
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run).
+
+ When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+ first token. By default, to implement support for ranges, extend
+ its range to the last symbol. */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ Current.last_line = Rhs[N].last_line; \
+ Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#if YYPURE
+# if YYLSP_NEEDED
+# ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
+# else
+# define YYLEX yylex (&yylval, &yylloc)
+# endif
+# else /* !YYLSP_NEEDED */
+# ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+# else
+# define YYLEX yylex (&yylval)
+# endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+#endif
+
+#line 315 "/usr/local/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+# define YYPARSE_PARAM_DECL
+# else
+# define YYPARSE_PARAM_ARG YYPARSE_PARAM
+# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+ variables are global, or local to YYPARSE. */
+
+#define YY_DECL_NON_LSP_VARIABLES \
+/* The lookahead symbol. */ \
+int yychar; \
+ \
+/* The semantic value of the lookahead symbol. */ \
+YYSTYPE yylval; \
+ \
+/* Number of parse errors so far. */ \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES \
+YY_DECL_NON_LSP_VARIABLES \
+ \
+/* Location data for the lookahead symbol. */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ /* If reentrant, generate the variables here. */
+#if YYPURE
+ YY_DECL_VARIABLES
+#endif /* !YYPURE */
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yychar1 = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short yyssa[YYINITDEPTH];
+ short *yyss = yyssa;
+ register short *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+ /* The location stack. */
+ YYLTYPE yylsa[YYINITDEPTH];
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+#if YYLSP_NEEDED
+ YYLTYPE yyloc;
+#endif
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+#if YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. */
+# if YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yyls1, yysize * sizeof (*yylsp),
+ &yystacksize);
+ yyls = yyls1;
+# else
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+# endif
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyoverflowlab;
+# else
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+# if YYLSP_NEEDED
+ YYSTACK_RELOCATE (yyls);
+# endif
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+ yylsp = yyls + yysize - 1;
+#endif
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+ /* We have to keep this `#if YYDEBUG', since we use variables
+ which are defined only if `YYDEBUG' is set. */
+ if (yydebug)
+ {
+ YYFPRINTF (stderr, "Next token is %d (%s",
+ yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise
+ meaning of a token, for further debugging info. */
+# ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+# endif
+ YYFPRINTF (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+ yychar, yytname[yychar1]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#if YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to the semantic value of
+ the lookahead token. This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+ /* Similarly for the default location. Let the user run additional
+ commands if for instance locations are ranges. */
+ yyloc = yylsp[1-yylen];
+ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+ /* We have to keep this `#if YYDEBUG', since we use variables which
+ are defined only if `YYDEBUG' is set. */
+ if (yydebug)
+ {
+ int yyi;
+
+ YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+ YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+ switch (yyn) {
+
+case 1:
+#line 151 "plural.y"
+{
+ if (yyvsp[0].exp == NULL)
+ YYABORT;
+ ((struct parse_args *) arg)->res = yyvsp[0].exp;
+ }
+ break;
+case 2:
+#line 159 "plural.y"
+{
+ yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 3:
+#line 163 "plural.y"
+{
+ yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 4:
+#line 167 "plural.y"
+{
+ yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 5:
+#line 171 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 6:
+#line 175 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 7:
+#line 179 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 8:
+#line 183 "plural.y"
+{
+ yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+ }
+ break;
+case 9:
+#line 187 "plural.y"
+{
+ yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
+ }
+ break;
+case 10:
+#line 191 "plural.y"
+{
+ yyval.exp = new_exp_0 (var);
+ }
+ break;
+case 11:
+#line 195 "plural.y"
+{
+ if ((yyval.exp = new_exp_0 (num)) != NULL)
+ yyval.exp->val.num = yyvsp[0].num;
+ }
+ break;
+case 12:
+#line 200 "plural.y"
+{
+ yyval.exp = yyvsp[-1].exp;
+ }
+ break;
+}
+
+#line 705 "/usr/local/share/bison/bison.simple"
+
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#if YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+ if (yydebug)
+ {
+ short *yyssp1 = yyss - 1;
+ YYFPRINTF (stderr, "state stack now");
+ while (yyssp1 != yyssp)
+ YYFPRINTF (stderr, " %d", *++yyssp1);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+#if YYLSP_NEEDED
+ *++yylsp = yyloc;
+#endif
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ char *yymsg;
+ int yyx, yycount;
+
+ yycount = 0;
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+ if (yycheck[yyx + yyn] == yyx)
+ yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+ yysize += yystrlen ("parse error, unexpected ") + 1;
+ yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+ if (yycount < 5)
+ {
+ yycount = 0;
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *));
+ yyx++)
+ if (yycheck[yyx + yyn] == yyx)
+ {
+ const char *yyq = ! yycount ? ", expecting " : " or ";
+ yyp = yystpcpy (yyp, yyq);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yycount++;
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exhausted");
+ }
+ else
+#endif /* defined (YYERROR_VERBOSE) */
+ yyerror ("parse error");
+ }
+ goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+ YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+ yychar, yytname[yychar1]));
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token. |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+
+ /* If its default is to accept any token, ok. Otherwise pop it. */
+ yyn = yydefact[yystate];
+ if (yyn)
+ goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token |
+`---------------------------------------------------------------*/
+yyerrpop:
+ if (yyssp == yyss)
+ YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#if YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG
+ if (yydebug)
+ {
+ short *yyssp1 = yyss - 1;
+ YYFPRINTF (stderr, "Error: state stack now");
+ while (yyssp1 != yyssp)
+ YYFPRINTF (stderr, " %d", *++yyssp1);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+/*--------------.
+| yyerrhandle. |
+`--------------*/
+yyerrhandle:
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+#if YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here. |
+`---------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+#line 205 "plural.y"
+
+
+void
+internal_function
+FREE_EXPRESSION (struct expression *exp)
+{
+ if (exp == NULL)
+ return;
+
+ /* Handle the recursive case. */
+ switch (exp->nargs)
+ {
+ case 3:
+ FREE_EXPRESSION (exp->val.args[2]);
+ /* FALLTHROUGH */
+ case 2:
+ FREE_EXPRESSION (exp->val.args[1]);
+ /* FALLTHROUGH */
+ case 1:
+ FREE_EXPRESSION (exp->val.args[0]);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+
+ free (exp);
+}
+
+
+static int
+yylex (YYSTYPE *lval, const char **pexp)
+{
+ const char *exp = *pexp;
+ int result;
+
+ while (1)
+ {
+ if (exp[0] == '\0')
+ {
+ *pexp = exp;
+ return YYEOF;
+ }
+
+ if (exp[0] != ' ' && exp[0] != '\t')
+ break;
+
+ ++exp;
+ }
+
+ result = *exp++;
+ switch (result)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ unsigned long int n = result - '0';
+ while (exp[0] >= '0' && exp[0] <= '9')
+ {
+ n *= 10;
+ n += exp[0] - '0';
+ ++exp;
+ }
+ lval->num = n;
+ result = NUMBER;
+ }
+ break;
+
+ case '=':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = equal;
+ result = EQUOP2;
+ }
+ else
+ result = YYERRCODE;
+ break;
+
+ case '!':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = not_equal;
+ result = EQUOP2;
+ }
+ break;
+
+ case '&':
+ case '|':
+ if (exp[0] == result)
+ ++exp;
+ else
+ result = YYERRCODE;
+ break;
+
+ case '<':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = less_or_equal;
+ }
+ else
+ lval->op = less_than;
+ result = CMPOP2;
+ break;
+
+ case '>':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = greater_or_equal;
+ }
+ else
+ lval->op = greater_than;
+ result = CMPOP2;
+ break;
+
+ case '*':
+ lval->op = mult;
+ result = MULOP2;
+ break;
+
+ case '/':
+ lval->op = divide;
+ result = MULOP2;
+ break;
+
+ case '%':
+ lval->op = module;
+ result = MULOP2;
+ break;
+
+ case '+':
+ lval->op = plus;
+ result = ADDOP2;
+ break;
+
+ case '-':
+ lval->op = minus;
+ result = ADDOP2;
+ break;
+
+ case 'n':
+ case '?':
+ case ':':
+ case '(':
+ case ')':
+ /* Nothing, just return the character. */
+ break;
+
+ case ';':
+ case '\n':
+ case '\0':
+ /* Be safe and let the user call this function again. */
+ --exp;
+ result = YYEOF;
+ break;
+
+ default:
+ result = YYERRCODE;
+#if YYDEBUG != 0
+ --exp;
+#endif
+ break;
+ }
+
+ *pexp = exp;
+
+ return result;
+}
+
+
+static void
+yyerror (const char *str)
+{
+ /* Do nothing. We don't print error messages here. */
+}
diff --git a/Build/source/utils/texinfo/intl/plural.y b/Build/source/utils/texinfo/intl/plural.y
new file mode 100644
index 00000000000..4d33bd7c716
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/plural.y
@@ -0,0 +1,381 @@
+%{
+/* Expression parsing for plural form selection.
+ Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* The bison generated parser uses alloca. AIX 3 forces us to put this
+ declaration at the beginning of the file. The declaration in bison's
+ skeleton file comes too late. This must come before <config.h>
+ because <config.h> may include arbitrary system headers. */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+ but we want it to be called PLURAL_PARSE. */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM arg
+%}
+%pure_parser
+%expect 7
+
+%union {
+ unsigned long int num;
+ enum operator op;
+ struct expression *exp;
+}
+
+%{
+/* Prototypes for local functions. */
+static int yylex (YYSTYPE *lval, const char **pexp);
+static void yyerror (const char *str);
+
+/* Allocation of expressions. */
+
+static struct expression *
+new_exp (int nargs, enum operator op, struct expression * const *args)
+{
+ int i;
+ struct expression *newp;
+
+ /* If any of the argument could not be malloc'ed, just return NULL. */
+ for (i = nargs - 1; i >= 0; i--)
+ if (args[i] == NULL)
+ goto fail;
+
+ /* Allocate a new expression. */
+ newp = (struct expression *) malloc (sizeof (*newp));
+ if (newp != NULL)
+ {
+ newp->nargs = nargs;
+ newp->operation = op;
+ for (i = nargs - 1; i >= 0; i--)
+ newp->val.args[i] = args[i];
+ return newp;
+ }
+
+ fail:
+ for (i = nargs - 1; i >= 0; i--)
+ FREE_EXPRESSION (args[i]);
+
+ return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (enum operator op)
+{
+ return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (enum operator op, struct expression *right)
+{
+ struct expression *args[1];
+
+ args[0] = right;
+ return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (enum operator op, struct expression *left, struct expression *right)
+{
+ struct expression *args[2];
+
+ args[0] = left;
+ args[1] = right;
+ return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (enum operator op, struct expression *bexp,
+ struct expression *tbranch, struct expression *fbranch)
+{
+ struct expression *args[3];
+
+ args[0] = bexp;
+ args[1] = tbranch;
+ args[2] = fbranch;
+ return new_exp (3, op, args);
+}
+
+%}
+
+/* This declares that all operators have the same associativity and the
+ precedence order as in C. See [Harbison, Steele: C, A Reference Manual].
+ There is no unary minus and no bitwise operators.
+ Operators with the same syntactic behaviour have been merged into a single
+ token, to save space in the array generated by bison. */
+%right '?' /* ? */
+%left '|' /* || */
+%left '&' /* && */
+%left EQUOP2 /* == != */
+%left CMPOP2 /* < > <= >= */
+%left ADDOP2 /* + - */
+%left MULOP2 /* * / % */
+%right '!' /* ! */
+
+%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
+%token <num> NUMBER
+%type <exp> exp
+
+%%
+
+start: exp
+ {
+ if ($1 == NULL)
+ YYABORT;
+ ((struct parse_args *) arg)->res = $1;
+ }
+ ;
+
+exp: exp '?' exp ':' exp
+ {
+ $$ = new_exp_3 (qmop, $1, $3, $5);
+ }
+ | exp '|' exp
+ {
+ $$ = new_exp_2 (lor, $1, $3);
+ }
+ | exp '&' exp
+ {
+ $$ = new_exp_2 (land, $1, $3);
+ }
+ | exp EQUOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | exp CMPOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | exp ADDOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | exp MULOP2 exp
+ {
+ $$ = new_exp_2 ($2, $1, $3);
+ }
+ | '!' exp
+ {
+ $$ = new_exp_1 (lnot, $2);
+ }
+ | 'n'
+ {
+ $$ = new_exp_0 (var);
+ }
+ | NUMBER
+ {
+ if (($$ = new_exp_0 (num)) != NULL)
+ $$->val.num = $1;
+ }
+ | '(' exp ')'
+ {
+ $$ = $2;
+ }
+ ;
+
+%%
+
+void
+internal_function
+FREE_EXPRESSION (struct expression *exp)
+{
+ if (exp == NULL)
+ return;
+
+ /* Handle the recursive case. */
+ switch (exp->nargs)
+ {
+ case 3:
+ FREE_EXPRESSION (exp->val.args[2]);
+ /* FALLTHROUGH */
+ case 2:
+ FREE_EXPRESSION (exp->val.args[1]);
+ /* FALLTHROUGH */
+ case 1:
+ FREE_EXPRESSION (exp->val.args[0]);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+
+ free (exp);
+}
+
+
+static int
+yylex (YYSTYPE *lval, const char **pexp)
+{
+ const char *exp = *pexp;
+ int result;
+
+ while (1)
+ {
+ if (exp[0] == '\0')
+ {
+ *pexp = exp;
+ return YYEOF;
+ }
+
+ if (exp[0] != ' ' && exp[0] != '\t')
+ break;
+
+ ++exp;
+ }
+
+ result = *exp++;
+ switch (result)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ unsigned long int n = result - '0';
+ while (exp[0] >= '0' && exp[0] <= '9')
+ {
+ n *= 10;
+ n += exp[0] - '0';
+ ++exp;
+ }
+ lval->num = n;
+ result = NUMBER;
+ }
+ break;
+
+ case '=':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = equal;
+ result = EQUOP2;
+ }
+ else
+ result = YYERRCODE;
+ break;
+
+ case '!':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = not_equal;
+ result = EQUOP2;
+ }
+ break;
+
+ case '&':
+ case '|':
+ if (exp[0] == result)
+ ++exp;
+ else
+ result = YYERRCODE;
+ break;
+
+ case '<':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = less_or_equal;
+ }
+ else
+ lval->op = less_than;
+ result = CMPOP2;
+ break;
+
+ case '>':
+ if (exp[0] == '=')
+ {
+ ++exp;
+ lval->op = greater_or_equal;
+ }
+ else
+ lval->op = greater_than;
+ result = CMPOP2;
+ break;
+
+ case '*':
+ lval->op = mult;
+ result = MULOP2;
+ break;
+
+ case '/':
+ lval->op = divide;
+ result = MULOP2;
+ break;
+
+ case '%':
+ lval->op = module;
+ result = MULOP2;
+ break;
+
+ case '+':
+ lval->op = plus;
+ result = ADDOP2;
+ break;
+
+ case '-':
+ lval->op = minus;
+ result = ADDOP2;
+ break;
+
+ case 'n':
+ case '?':
+ case ':':
+ case '(':
+ case ')':
+ /* Nothing, just return the character. */
+ break;
+
+ case ';':
+ case '\n':
+ case '\0':
+ /* Be safe and let the user call this function again. */
+ --exp;
+ result = YYEOF;
+ break;
+
+ default:
+ result = YYERRCODE;
+#if YYDEBUG != 0
+ --exp;
+#endif
+ break;
+ }
+
+ *pexp = exp;
+
+ return result;
+}
+
+
+static void
+yyerror (const char *str)
+{
+ /* Do nothing. We don't print error messages here. */
+}
diff --git a/Build/source/utils/texinfo/intl/printf-args.c b/Build/source/utils/texinfo/intl/printf-args.c
new file mode 100644
index 00000000000..f6f3219e79e
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/printf-args.c
@@ -0,0 +1,119 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "printf-args.h"
+
+#ifdef STATIC
+STATIC
+#endif
+int
+printf_fetchargs (va_list args, arguments *a)
+{
+ size_t i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+#endif
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+#endif
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ ap->a.a_wide_char = va_arg (args, wint_t);
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ break;
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#endif
+ default:
+ /* Unknown type. */
+ return -1;
+ }
+ return 0;
+}
diff --git a/Build/source/utils/texinfo/intl/printf-args.h b/Build/source/utils/texinfo/intl/printf-args.h
new file mode 100644
index 00000000000..f11e64c0459
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/printf-args.h
@@ -0,0 +1,137 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get wchar_t. */
+#ifdef HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#ifdef HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+#ifdef HAVE_LONG_LONG
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+#endif
+ TYPE_DOUBLE,
+#ifdef HAVE_LONG_DOUBLE
+ TYPE_LONGDOUBLE,
+#endif
+ TYPE_CHAR,
+#ifdef HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#ifdef HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER
+#ifdef HAVE_LONG_LONG
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+#ifdef HAVE_LONG_LONG
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+#endif
+ float a_float;
+ double a_double;
+#ifdef HAVE_LONG_DOUBLE
+ long double a_longdouble;
+#endif
+ int a_char;
+#ifdef HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#ifdef HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+#ifdef HAVE_LONG_LONG
+ long long int * a_count_longlongint_pointer;
+#endif
+ }
+ a;
+}
+argument;
+
+typedef struct
+{
+ size_t count;
+ argument *arg;
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_fetchargs (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/Build/source/utils/texinfo/intl/printf-parse.c b/Build/source/utils/texinfo/intl/printf-parse.c
new file mode 100644
index 00000000000..d19f903d72c
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/printf-parse.c
@@ -0,0 +1,537 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+#else
+# include "printf-parse.h"
+#endif
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#if WIDE_CHAR_VERSION
+# define PRINTF_PARSE wprintf_parse
+# define CHAR_T wchar_t
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+#else
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+ const CHAR_T *cp = format; /* pointer into format */
+ size_t arg_posn = 0; /* number of regular arguments consumed */
+ size_t d_allocated; /* allocated elements of d->dir */
+ size_t a_allocated; /* allocated elements of a->arg */
+ size_t max_width_length = 0;
+ size_t max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = 1;
+ d->dir = malloc (d_allocated * sizeof (DIRECTIVE));
+ if (d->dir == NULL)
+ /* Out of memory. */
+ return -1;
+
+ a->count = 0;
+ a_allocated = 0;
+ a->arg = NULL;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ size_t n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ size_t memory_size; \
+ argument *memory; \
+ \
+ a_allocated = xtimes (a_allocated, 2); \
+ if (a_allocated <= n) \
+ a_allocated = xsum (n, 1); \
+ memory_size = xtimes (a_allocated, sizeof (argument)); \
+ if (size_overflow_p (memory_size)) \
+ /* Overflow, would lead to out of memory. */ \
+ goto error; \
+ memory = (a->arg \
+ ? realloc (a->arg, memory_size) \
+ : malloc (memory_size)); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto error; \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ CHAR_T c = *cp++;
+ if (c == '%')
+ {
+ size_t arg_index = ARG_NONE;
+ DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */
+
+ /* Initialize the next directive. */
+ dp->dir_start = cp - 1;
+ dp->flags = 0;
+ dp->width_start = NULL;
+ dp->width_end = NULL;
+ dp->width_arg_index = ARG_NONE;
+ dp->precision_start = NULL;
+ dp->precision_end = NULL;
+ dp->precision_arg_index = ARG_NONE;
+ dp->arg_index = ARG_NONE;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ dp->width_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->width_arg_index == ARG_NONE)
+ {
+ dp->width_arg_index = arg_posn++;
+ if (dp->width_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+ }
+ else if (*cp >= '0' && *cp <= '9')
+ {
+ size_t width_length;
+
+ dp->width_start = cp;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->width_end = cp;
+ width_length = dp->width_end - dp->width_start;
+ if (max_width_length < width_length)
+ max_width_length = width_length;
+ }
+
+ /* Parse the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ dp->precision_start = cp - 1;
+ cp++;
+ dp->precision_end = cp;
+ if (max_precision_length < 2)
+ max_precision_length = 2;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory
+ later. */
+ goto error;
+ dp->precision_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->precision_arg_index == ARG_NONE)
+ {
+ dp->precision_arg_index = arg_posn++;
+ if (dp->precision_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+ }
+ else
+ {
+ size_t precision_length;
+
+ dp->precision_start = cp - 1;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->precision_end = cp;
+ precision_length = dp->precision_end - dp->precision_start;
+ if (max_precision_length < precision_length)
+ max_precision_length = precision_length;
+ }
+ }
+
+ {
+ arg_type type;
+
+ /* Parse argument type/size specifiers. */
+ {
+ int flags = 0;
+
+ for (;;)
+ {
+ if (*cp == 'h')
+ {
+ flags |= (1 << (flags & 1));
+ cp++;
+ }
+ else if (*cp == 'L')
+ {
+ flags |= 4;
+ cp++;
+ }
+ else if (*cp == 'l')
+ {
+ flags += 8;
+ cp++;
+ }
+#ifdef HAVE_INTMAX_T
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+#ifdef HAVE_LONG_DOUBLE
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+#endif
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#ifdef HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#ifdef HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#ifdef HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#ifdef HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+#ifdef HAVE_LONG_LONG
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+#endif
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index == ARG_NONE)
+ {
+ dp->arg_index = arg_posn++;
+ if (dp->arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->arg_index, type);
+ }
+ dp->conversion = c;
+ dp->dir_end = cp;
+ }
+
+ d->count++;
+ if (d->count >= d_allocated)
+ {
+ size_t memory_size;
+ DIRECTIVE *memory;
+
+ d_allocated = xtimes (d_allocated, 2);
+ memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ goto error;
+ memory = realloc (d->dir, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ goto error;
+ d->dir = memory;
+ }
+ }
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg)
+ free (a->arg);
+ if (d->dir)
+ free (d->dir);
+ return -1;
+}
+
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T
+#undef PRINTF_PARSE
diff --git a/Build/source/utils/texinfo/intl/printf-parse.h b/Build/source/utils/texinfo/intl/printf-parse.h
new file mode 100644
index 00000000000..8aec50e2a3f
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/printf-parse.h
@@ -0,0 +1,75 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ size_t width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ size_t precision_arg_index;
+ char conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+ size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ char_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+char_directives;
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/Build/source/utils/texinfo/intl/printf.c b/Build/source/utils/texinfo/intl/printf.c
new file mode 100644
index 00000000000..878646c2de5
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/printf.c
@@ -0,0 +1,371 @@
+/* Formatted output to strings, using POSIX/XSI format strings with positions.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#include <stdio.h>
+
+#if !HAVE_POSIX_PRINTF
+
+#include <stdlib.h>
+#include <string.h>
+
+/* When building a DLL, we must export some functions. Note that because
+ the functions are only defined for binary backward compatibility, we
+ don't need to use __declspec(dllimport) in any case. */
+#if defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+#define STATIC static
+
+/* Define auxiliary functions declared in "printf-args.h". */
+#include "printf-args.c"
+
+/* Define auxiliary functions declared in "printf-parse.h". */
+#include "printf-parse.c"
+
+/* Define functions declared in "vasnprintf.h". */
+#define vasnprintf libintl_vasnprintf
+#include "vasnprintf.c"
+#if 0 /* not needed */
+#define asnprintf libintl_asnprintf
+#include "asnprintf.c"
+#endif
+
+DLL_EXPORTED
+int
+libintl_vfprintf (FILE *stream, const char *format, va_list args)
+{
+ if (strchr (format, '$') == NULL)
+ return vfprintf (stream, format, args);
+ else
+ {
+ size_t length;
+ char *result = libintl_vasnprintf (NULL, &length, format, args);
+ int retval = -1;
+ if (result != NULL)
+ {
+ if (fwrite (result, 1, length, stream) == length)
+ retval = length;
+ free (result);
+ }
+ return retval;
+ }
+}
+
+DLL_EXPORTED
+int
+libintl_fprintf (FILE *stream, const char *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vfprintf (stream, format, args);
+ va_end (args);
+ return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vprintf (const char *format, va_list args)
+{
+ return libintl_vfprintf (stdout, format, args);
+}
+
+DLL_EXPORTED
+int
+libintl_printf (const char *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vprintf (format, args);
+ va_end (args);
+ return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vsprintf (char *resultbuf, const char *format, va_list args)
+{
+ if (strchr (format, '$') == NULL)
+ return vsprintf (resultbuf, format, args);
+ else
+ {
+ size_t length = (size_t) ~0 / (4 * sizeof (char));
+ char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+ if (result != resultbuf)
+ {
+ free (result);
+ return -1;
+ }
+ else
+ return length;
+ }
+}
+
+DLL_EXPORTED
+int
+libintl_sprintf (char *resultbuf, const char *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vsprintf (resultbuf, format, args);
+ va_end (args);
+ return retval;
+}
+
+#if HAVE_SNPRINTF
+
+# if HAVE_DECL__SNPRINTF
+ /* Windows. */
+# define system_vsnprintf _vsnprintf
+# else
+ /* Unix. */
+# define system_vsnprintf vsnprintf
+# endif
+
+DLL_EXPORTED
+int
+libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args)
+{
+ if (strchr (format, '$') == NULL)
+ return system_vsnprintf (resultbuf, length, format, args);
+ else
+ {
+ size_t maxlength = length;
+ char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+ if (result != resultbuf)
+ {
+ if (maxlength > 0)
+ {
+ if (length < maxlength)
+ abort ();
+ memcpy (resultbuf, result, maxlength - 1);
+ resultbuf[maxlength - 1] = '\0';
+ }
+ free (result);
+ return -1;
+ }
+ else
+ return length;
+ }
+}
+
+DLL_EXPORTED
+int
+libintl_snprintf (char *resultbuf, size_t length, const char *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vsnprintf (resultbuf, length, format, args);
+ va_end (args);
+ return retval;
+}
+
+#endif
+
+#if HAVE_ASPRINTF
+
+DLL_EXPORTED
+int
+libintl_vasprintf (char **resultp, const char *format, va_list args)
+{
+ size_t length;
+ char *result = libintl_vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+ *resultp = result;
+ return length;
+}
+
+DLL_EXPORTED
+int
+libintl_asprintf (char **resultp, const char *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vasprintf (resultp, format, args);
+ va_end (args);
+ return retval;
+}
+
+#endif
+
+#if HAVE_FWPRINTF
+
+#include <wchar.h>
+
+#define WIDE_CHAR_VERSION 1
+
+/* Define auxiliary functions declared in "wprintf-parse.h". */
+#include "printf-parse.c"
+
+/* Define functions declared in "vasnprintf.h". */
+#define vasnwprintf libintl_vasnwprintf
+#include "vasnprintf.c"
+#if 0 /* not needed */
+#define asnwprintf libintl_asnwprintf
+#include "asnprintf.c"
+#endif
+
+# if HAVE_DECL__SNWPRINTF
+ /* Windows. */
+# define system_vswprintf _vsnwprintf
+# else
+ /* Unix. */
+# define system_vswprintf vswprintf
+# endif
+
+DLL_EXPORTED
+int
+libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
+{
+ if (wcschr (format, '$') == NULL)
+ return vfwprintf (stream, format, args);
+ else
+ {
+ size_t length;
+ wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
+ int retval = -1;
+ if (result != NULL)
+ {
+ size_t i;
+ for (i = 0; i < length; i++)
+ if (fputwc (result[i], stream) == WEOF)
+ break;
+ if (i == length)
+ retval = length;
+ free (result);
+ }
+ return retval;
+ }
+}
+
+DLL_EXPORTED
+int
+libintl_fwprintf (FILE *stream, const wchar_t *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vfwprintf (stream, format, args);
+ va_end (args);
+ return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vwprintf (const wchar_t *format, va_list args)
+{
+ return libintl_vfwprintf (stdout, format, args);
+}
+
+DLL_EXPORTED
+int
+libintl_wprintf (const wchar_t *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vwprintf (format, args);
+ va_end (args);
+ return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
+{
+ if (wcschr (format, '$') == NULL)
+ return system_vswprintf (resultbuf, length, format, args);
+ else
+ {
+ size_t maxlength = length;
+ wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
+ if (result != resultbuf)
+ {
+ if (maxlength > 0)
+ {
+ if (length < maxlength)
+ abort ();
+ memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t));
+ resultbuf[maxlength - 1] = 0;
+ }
+ free (result);
+ return -1;
+ }
+ else
+ return length;
+ }
+}
+
+DLL_EXPORTED
+int
+libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...)
+{
+ va_list args;
+ int retval;
+
+ va_start (args, format);
+ retval = libintl_vswprintf (resultbuf, length, format, args);
+ va_end (args);
+ return retval;
+}
+
+#endif
+
+#endif
diff --git a/Build/source/utils/texinfo/intl/ref-add.sin b/Build/source/utils/texinfo/intl/ref-add.sin
new file mode 100644
index 00000000000..167374e3c5e
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/ref-add.sin
@@ -0,0 +1,31 @@
+# Add this package to a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ ta
+ :a
+ s/ @PACKAGE@ / @PACKAGE@ /
+ tb
+ s/ $/ @PACKAGE@ /
+ :b
+ s/^/# Packages using this file:/
+}
diff --git a/Build/source/utils/texinfo/intl/ref-del.sin b/Build/source/utils/texinfo/intl/ref-del.sin
new file mode 100644
index 00000000000..613cf37f3ba
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/ref-del.sin
@@ -0,0 +1,26 @@
+# Remove this package from a list of references stored in a text file.
+#
+# Copyright (C) 2000 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ s/ @PACKAGE@ / /
+ s/^/# Packages using this file:/
+}
diff --git a/Build/source/utils/texinfo/intl/relocatable.c b/Build/source/utils/texinfo/intl/relocatable.c
new file mode 100644
index 00000000000..bf7c7085485
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/relocatable.c
@@ -0,0 +1,449 @@
+/* Provide relocatable packages.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+
+/* Tell glibc's <stdio.h> to provide a prototype for getline().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* Specification. */
+#include "relocatable.h"
+
+#if ENABLE_RELOCATABLE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+#else
+# include "xalloc.h"
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if DEPENDS_ON_LIBCHARSET
+# include <libcharset.h>
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+# include <iconv.h>
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+# include <libintl.h>
+#endif
+
+/* Faked cheap 'bool'. */
+#undef bool
+#undef false
+#undef true
+#define bool int
+#define false 0
+#define true 1
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILESYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* Original installation prefix. */
+static char *orig_prefix;
+static size_t orig_prefix_len;
+/* Current installation prefix. */
+static char *curr_prefix;
+static size_t curr_prefix_len;
+/* These prefixes do not end in a slash. Anything that will be concatenated
+ to them must start with a slash. */
+
+/* Sets the original and the current installation prefix of this module.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+static void
+set_this_relocation_prefix (const char *orig_prefix_arg,
+ const char *curr_prefix_arg)
+{
+ if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+ /* Optimization: if orig_prefix and curr_prefix are equal, the
+ relocation is a nop. */
+ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+ {
+ /* Duplicate the argument strings. */
+ char *memory;
+
+ orig_prefix_len = strlen (orig_prefix_arg);
+ curr_prefix_len = strlen (curr_prefix_arg);
+ memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+ if (memory != NULL)
+#endif
+ {
+ memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+ orig_prefix = memory;
+ memory += orig_prefix_len + 1;
+ memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+ curr_prefix = memory;
+ return;
+ }
+ }
+ orig_prefix = NULL;
+ curr_prefix = NULL;
+ /* Don't worry about wasted memory here - this function is usually only
+ called once. */
+}
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+void
+set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+{
+ set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+
+ /* Now notify all dependent libraries. */
+#if DEPENDS_ON_LIBCHARSET
+ libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+ libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+ libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+}
+
+#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
+
+/* Convenience function:
+ Computes the current installation prefix, based on the original
+ installation prefix, the original installation directory of a particular
+ file, and the current pathname of this file. Returns NULL upon failure. */
+#ifdef IN_LIBRARY
+#define compute_curr_prefix local_compute_curr_prefix
+static
+#endif
+const char *
+compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname)
+{
+ const char *curr_installdir;
+ const char *rel_installdir;
+
+ if (curr_pathname == NULL)
+ return NULL;
+
+ /* Determine the relative installation directory, relative to the prefix.
+ This is simply the difference between orig_installprefix and
+ orig_installdir. */
+ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+ != 0)
+ /* Shouldn't happen - nothing should be installed outside $(prefix). */
+ return NULL;
+ rel_installdir = orig_installdir + strlen (orig_installprefix);
+
+ /* Determine the current installation directory. */
+ {
+ const char *p_base = curr_pathname + FILESYSTEM_PREFIX_LEN (curr_pathname);
+ const char *p = curr_pathname + strlen (curr_pathname);
+ char *q;
+
+ while (p > p_base)
+ {
+ p--;
+ if (ISSLASH (*p))
+ break;
+ }
+
+ q = (char *) xmalloc (p - curr_pathname + 1);
+#ifdef NO_XMALLOC
+ if (q == NULL)
+ return NULL;
+#endif
+ memcpy (q, curr_pathname, p - curr_pathname);
+ q[p - curr_pathname] = '\0';
+ curr_installdir = q;
+ }
+
+ /* Compute the current installation prefix by removing the trailing
+ rel_installdir from it. */
+ {
+ const char *rp = rel_installdir + strlen (rel_installdir);
+ const char *cp = curr_installdir + strlen (curr_installdir);
+ const char *cp_base =
+ curr_installdir + FILESYSTEM_PREFIX_LEN (curr_installdir);
+
+ while (rp > rel_installdir && cp > cp_base)
+ {
+ bool same = false;
+ const char *rpi = rp;
+ const char *cpi = cp;
+
+ while (rpi > rel_installdir && cpi > cp_base)
+ {
+ rpi--;
+ cpi--;
+ if (ISSLASH (*rpi) || ISSLASH (*cpi))
+ {
+ if (ISSLASH (*rpi) && ISSLASH (*cpi))
+ same = true;
+ break;
+ }
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS - case insignificant filesystem */
+ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+ != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+ break;
+#else
+ if (*rpi != *cpi)
+ break;
+#endif
+ }
+ if (!same)
+ break;
+ /* The last pathname component was the same. opi and cpi now point
+ to the slash before it. */
+ rp = rpi;
+ cp = cpi;
+ }
+
+ if (rp > rel_installdir)
+ /* Unexpected: The curr_installdir does not end with rel_installdir. */
+ return NULL;
+
+ {
+ size_t curr_prefix_len = cp - curr_installdir;
+ char *curr_prefix;
+
+ curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+ if (curr_prefix == NULL)
+ return NULL;
+#endif
+ memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+ curr_prefix[curr_prefix_len] = '\0';
+
+ return curr_prefix;
+ }
+ }
+}
+
+#endif /* !IN_LIBRARY || PIC */
+
+#if defined PIC && defined INSTALLDIR
+
+/* Full pathname of shared library, or NULL. */
+static char *shared_library_fullname;
+
+#if defined _WIN32 || defined __WIN32__
+
+/* Determine the full pathname of the shared library when it is loaded. */
+
+BOOL WINAPI
+DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+{
+ (void) reserved;
+
+ if (event == DLL_PROCESS_ATTACH)
+ {
+ /* The DLL is being loaded into an application's address range. */
+ static char location[MAX_PATH];
+
+ if (!GetModuleFileName (module_handle, location, sizeof (location)))
+ /* Shouldn't happen. */
+ return FALSE;
+
+ if (!IS_PATH_WITH_DIR (location))
+ /* Shouldn't happen. */
+ return FALSE;
+
+ shared_library_fullname = strdup (location);
+ }
+
+ return TRUE;
+}
+
+#else /* Unix */
+
+static void
+find_shared_library_fullname ()
+{
+#if defined __linux__ && __GLIBC__ >= 2
+ /* Linux has /proc/self/maps. glibc 2 has the getline() function. */
+ FILE *fp;
+
+ /* Open the current process' maps file. It describes one VMA per line. */
+ fp = fopen ("/proc/self/maps", "r");
+ if (fp)
+ {
+ unsigned long address = (unsigned long) &find_shared_library_fullname;
+ for (;;)
+ {
+ unsigned long start, end;
+ int c;
+
+ if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+ break;
+ if (address >= start && address <= end - 1)
+ {
+ /* Found it. Now see if this line contains a filename. */
+ while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+ continue;
+ if (c == '/')
+ {
+ size_t size;
+ int len;
+
+ ungetc (c, fp);
+ shared_library_fullname = NULL; size = 0;
+ len = getline (&shared_library_fullname, &size, fp);
+ if (len >= 0)
+ {
+ /* Success: filled shared_library_fullname. */
+ if (len > 0 && shared_library_fullname[len - 1] == '\n')
+ shared_library_fullname[len - 1] = '\0';
+ }
+ }
+ break;
+ }
+ while (c = getc (fp), c != EOF && c != '\n')
+ continue;
+ }
+ fclose (fp);
+ }
+#endif
+}
+
+#endif /* WIN32 / Unix */
+
+/* Return the full pathname of the current shared library.
+ Return NULL if unknown.
+ Guaranteed to work only on Linux and Woe32. */
+static char *
+get_shared_library_fullname ()
+{
+#if !(defined _WIN32 || defined __WIN32__)
+ static bool tried_find_shared_library_fullname;
+ if (!tried_find_shared_library_fullname)
+ {
+ find_shared_library_fullname ();
+ tried_find_shared_library_fullname = true;
+ }
+#endif
+ return shared_library_fullname;
+}
+
+#endif /* PIC */
+
+/* Returns the pathname, relocated according to the current installation
+ directory. */
+const char *
+relocate (const char *pathname)
+{
+#if defined PIC && defined INSTALLDIR
+ static int initialized;
+
+ /* Initialization code for a shared library. */
+ if (!initialized)
+ {
+ /* At this point, orig_prefix and curr_prefix likely have already been
+ set through the main program's set_program_name_and_installdir
+ function. This is sufficient in the case that the library has
+ initially been installed in the same orig_prefix. But we can do
+ better, to also cover the cases that 1. it has been installed
+ in a different prefix before being moved to orig_prefix and (later)
+ to curr_prefix, 2. unlike the program, it has not moved away from
+ orig_prefix. */
+ const char *orig_installprefix = INSTALLPREFIX;
+ const char *orig_installdir = INSTALLDIR;
+ const char *curr_prefix_better;
+
+ curr_prefix_better =
+ compute_curr_prefix (orig_installprefix, orig_installdir,
+ get_shared_library_fullname ());
+ if (curr_prefix_better == NULL)
+ curr_prefix_better = curr_prefix;
+
+ set_relocation_prefix (orig_installprefix, curr_prefix_better);
+
+ initialized = 1;
+ }
+#endif
+
+ /* Note: It is not necessary to perform case insensitive comparison here,
+ even for DOS-like filesystems, because the pathname argument was
+ typically created from the same Makefile variable as orig_prefix came
+ from. */
+ if (orig_prefix != NULL && curr_prefix != NULL
+ && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+ {
+ if (pathname[orig_prefix_len] == '\0')
+ /* pathname equals orig_prefix. */
+ return curr_prefix;
+ if (ISSLASH (pathname[orig_prefix_len]))
+ {
+ /* pathname starts with orig_prefix. */
+ const char *pathname_tail = &pathname[orig_prefix_len];
+ char *result =
+ (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+ if (result != NULL)
+#endif
+ {
+ memcpy (result, curr_prefix, curr_prefix_len);
+ strcpy (result + curr_prefix_len, pathname_tail);
+ return result;
+ }
+ }
+ }
+ /* Nothing to relocate. */
+ return pathname;
+}
+
+#endif
diff --git a/Build/source/utils/texinfo/intl/relocatable.h b/Build/source/utils/texinfo/intl/relocatable.h
new file mode 100644
index 00000000000..48c5b71e215
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/relocatable.h
@@ -0,0 +1,77 @@
+/* Provide relocatable packages.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _RELOCATABLE_H
+#define _RELOCATABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This can be enabled through the configure --enable-relocatable option. */
+#if ENABLE_RELOCATABLE
+
+/* When building a DLL, we must export some functions. Note that because
+ this is a private .h file, we don't need to use __declspec(dllimport)
+ in any case. */
+#if defined _MSC_VER && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+#else
+# define RELOCATABLE_DLL_EXPORTED
+#endif
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+extern RELOCATABLE_DLL_EXPORTED void
+ set_relocation_prefix (const char *orig_prefix,
+ const char *curr_prefix);
+
+/* Returns the pathname, relocated according to the current installation
+ directory. */
+extern const char * relocate (const char *pathname);
+
+/* Memory management: relocate() leaks memory, because it has to construct
+ a fresh pathname. If this is a problem because your program calls
+ relocate() frequently, think about caching the result. */
+
+/* Convenience function:
+ Computes the current installation prefix, based on the original
+ installation prefix, the original installation directory of a particular
+ file, and the current pathname of this file. Returns NULL upon failure. */
+extern const char * compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname);
+
+#else
+
+/* By default, we use the hardwired pathnames. */
+#define relocate(pathname) (pathname)
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RELOCATABLE_H */
diff --git a/Build/source/utils/texinfo/intl/textdomain.c b/Build/source/utils/texinfo/intl/textdomain.c
new file mode 100644
index 00000000000..8745a8435e1
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/textdomain.c
@@ -0,0 +1,141 @@
+/* Implementation of the textdomain(3) function.
+ Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications. */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc. */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+ names than the internal variables in GNU libc, otherwise programs
+ using libintl.a cannot be linked statically. */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain. */
+extern const char _nl_default_default_domain[] attribute_hidden;
+
+/* Default text domain in which entries for gettext(3) are to be found. */
+extern const char *_nl_current_default_domain attribute_hidden;
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN libintl_textdomain
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation. */
+__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+char *
+TEXTDOMAIN (const char *domainname)
+{
+ char *new_domain;
+ char *old_domain;
+
+ /* A NULL pointer requests the current setting. */
+ if (domainname == NULL)
+ return (char *) _nl_current_default_domain;
+
+ __libc_rwlock_wrlock (_nl_state_lock);
+
+ old_domain = (char *) _nl_current_default_domain;
+
+ /* If domain name is the null string set to default domain "messages". */
+ if (domainname[0] == '\0'
+ || strcmp (domainname, _nl_default_default_domain) == 0)
+ {
+ _nl_current_default_domain = _nl_default_default_domain;
+ new_domain = (char *) _nl_current_default_domain;
+ }
+ else if (strcmp (domainname, old_domain) == 0)
+ /* This can happen and people will use it to signal that some
+ environment variable changed. */
+ new_domain = old_domain;
+ else
+ {
+ /* If the following malloc fails `_nl_current_default_domain'
+ will be NULL. This value will be returned and so signals we
+ are out of core. */
+#if defined _LIBC || defined HAVE_STRDUP
+ new_domain = strdup (domainname);
+#else
+ size_t len = strlen (domainname) + 1;
+ new_domain = (char *) malloc (len);
+ if (new_domain != NULL)
+ memcpy (new_domain, domainname, len);
+#endif
+
+ if (new_domain != NULL)
+ _nl_current_default_domain = new_domain;
+ }
+
+ /* We use this possibility to signal a change of the loaded catalogs
+ since this is most likely the case and there is no other easy we
+ to do it. Do it only when the call was successful. */
+ if (new_domain != NULL)
+ {
+ ++_nl_msg_cat_cntr;
+
+ if (old_domain != new_domain && old_domain != _nl_default_default_domain)
+ free (old_domain);
+ }
+
+ __libc_rwlock_unlock (_nl_state_lock);
+
+ return new_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__textdomain, textdomain);
+#endif
diff --git a/Build/source/utils/texinfo/intl/vasnprintf.c b/Build/source/utils/texinfo/intl/vasnprintf.c
new file mode 100644
index 00000000000..8a62282d73e
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/vasnprintf.c
@@ -0,0 +1,887 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification. */
+#if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+#else
+# include "vasnprintf.h"
+#endif
+
+#include <stdio.h> /* snprintf(), sprintf() */
+#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+#include <string.h> /* memcpy(), strlen() */
+#include <errno.h> /* errno */
+#include <limits.h> /* CHAR_BIT */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+#else
+# include "printf-parse.h"
+#endif
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#ifdef HAVE_WCHAR_T
+# ifdef HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define CHAR_T wchar_t
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+ /* On Windows, the function swprintf() has a different signature than
+ on Unix; we use the _snwprintf() function instead. */
+# define SNPRINTF _snwprintf
+# else
+ /* Unix. */
+# define SNPRINTF swprintf
+# endif
+#else
+# define VASNPRINTF vasnprintf
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF)
+# if HAVE_DECL__SNPRINTF
+ /* Windows. */
+# define SNPRINTF _snprintf
+# else
+ /* Unix. */
+# define SNPRINTF snprintf
+# endif
+#endif
+
+CHAR_T *
+VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args)
+{
+ DIRECTIVES d;
+ arguments a;
+
+ if (PRINTF_PARSE (format, &d, &a) < 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+#define CLEANUP() \
+ free (d.dir); \
+ if (a.arg) \
+ free (a.arg);
+
+ if (printf_fetchargs (args, &a) < 0)
+ {
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+ {
+ size_t buf_neededlength;
+ CHAR_T *buf;
+ CHAR_T *buf_malloced;
+ const CHAR_T *cp;
+ size_t i;
+ DIRECTIVE *dp;
+ /* Output string accumulator. */
+ CHAR_T *result;
+ size_t allocated;
+ size_t length;
+
+ /* Allocate a small buffer that will hold a directive passed to
+ sprintf or snprintf. */
+ buf_neededlength =
+ xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+ if (buf_neededlength < 4000 / sizeof (CHAR_T))
+ {
+ buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T));
+ buf_malloced = NULL;
+ }
+ else
+#endif
+ {
+ size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T));
+ if (size_overflow_p (buf_memsize))
+ goto out_of_memory_1;
+ buf = (CHAR_T *) malloc (buf_memsize);
+ if (buf == NULL)
+ goto out_of_memory_1;
+ buf_malloced = buf;
+ }
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ /* Ensures that allocated >= needed. Aborts through a jump to
+ out_of_memory if needed is SIZE_MAX or otherwise too big. */
+#define ENSURE_ALLOCATION(needed) \
+ if ((needed) > allocated) \
+ { \
+ size_t memory_size; \
+ CHAR_T *memory; \
+ \
+ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
+ if ((needed) > allocated) \
+ allocated = (needed); \
+ memory_size = xtimes (allocated, sizeof (CHAR_T)); \
+ if (size_overflow_p (memory_size)) \
+ goto out_of_memory; \
+ if (result == resultbuf || result == NULL) \
+ memory = (CHAR_T *) malloc (memory_size); \
+ else \
+ memory = (CHAR_T *) realloc (result, memory_size); \
+ if (memory == NULL) \
+ goto out_of_memory; \
+ if (result == resultbuf && length > 0) \
+ memcpy (memory, result, length * sizeof (CHAR_T)); \
+ result = memory; \
+ }
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+ size_t augmented_length = xsum (length, n);
+
+ ENSURE_ALLOCATION (augmented_length);
+ memcpy (result + length, cp, n * sizeof (CHAR_T));
+ length = augmented_length;
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ size_t augmented_length;
+
+ if (!(dp->arg_index == ARG_NONE))
+ abort ();
+ augmented_length = xsum (length, 1);
+ ENSURE_ALLOCATION (augmented_length);
+ result[length] = '%';
+ length = augmented_length;
+ }
+ else
+ {
+ if (!(dp->arg_index != ARG_NONE))
+ abort ();
+
+ if (dp->conversion == 'n')
+ {
+ switch (a.arg[dp->arg_index].type)
+ {
+ case TYPE_COUNT_SCHAR_POINTER:
+ *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+#endif
+ default:
+ abort ();
+ }
+ }
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ CHAR_T *p;
+ unsigned int prefix_count;
+ int prefixes[2];
+#if !USE_SNPRINTF
+ size_t tmp_length;
+ CHAR_T tmpbuf[700];
+ CHAR_T *tmp;
+
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ {
+ size_t width;
+ size_t precision;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = (arg < 0 ? (unsigned int) (-arg) : arg);
+ }
+ else
+ {
+ const CHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ precision = (arg < 0 ? 0 : arg);
+ }
+ else
+ {
+ const CHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ do
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ while (digitp != dp->precision_end);
+ }
+ }
+
+ switch (dp->conversion)
+ {
+
+ case 'd': case 'i': case 'u':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ break;
+
+ case 'o':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1 /* turn floor into ceil */
+ + 1; /* account for leading sign */
+ break;
+
+ case 'x': case 'X':
+# ifdef HAVE_LONG_LONG
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading sign or alternate form */
+ break;
+
+ case 'f': case 'F':
+# ifdef HAVE_LONG_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ else
+# endif
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ tmp_length =
+ 12; /* sign, decimal point, exponent etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'c':
+# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION
+ if (type == TYPE_WIDE_CHAR)
+ tmp_length = MB_CUR_MAX;
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# ifdef HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ {
+ tmp_length =
+ local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
+
+# if !WIDE_CHAR_VERSION
+ tmp_length = xtimes (tmp_length, MB_CUR_MAX);
+# endif
+ }
+ else
+# endif
+ tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+ }
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (CHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ p = buf;
+ *p++ = '%';
+ if (dp->flags & FLAG_GROUP)
+ *p++ = '\'';
+ if (dp->flags & FLAG_LEFT)
+ *p++ = '-';
+ if (dp->flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ if (dp->flags & FLAG_SPACE)
+ *p++ = ' ';
+ if (dp->flags & FLAG_ALT)
+ *p++ = '#';
+ if (dp->flags & FLAG_ZERO)
+ *p++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ memcpy (p, dp->width_start, n * sizeof (CHAR_T));
+ p += n;
+ }
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ memcpy (p, dp->precision_start, n * sizeof (CHAR_T));
+ p += n;
+ }
+
+ switch (type)
+ {
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+ *p++ = 'l';
+ /*FALLTHROUGH*/
+#endif
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *p++ = 'l';
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ *p++ = 'L';
+ break;
+#endif
+ default:
+ break;
+ }
+ *p = dp->conversion;
+#if USE_SNPRINTF
+ p[1] = '%';
+ p[2] = 'n';
+ p[3] = '\0';
+#else
+ p[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if USE_SNPRINTF
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length] = '\0';
+#endif
+
+ for (;;)
+ {
+ size_t maxlen;
+ int count;
+ int retcount;
+
+ maxlen = allocated - length;
+ count = -1;
+ retcount = 0;
+
+#if USE_SNPRINTF
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = SNPRINTF (result + length, maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = SNPRINTF (result + length, maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = SNPRINTF (result + length, maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_LONG_LONG
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#ifdef HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if USE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if (count < maxlen && result[length + count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (p[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ p[1] = '\0';
+ continue;
+ }
+ else
+ {
+ /* Look at the snprintf() return value. */
+ if (retcount < 0)
+ {
+ /* HP-UX 10.20 snprintf() is doubly deficient:
+ It doesn't understand the '%n' directive,
+ *and* it returns -1 (rather than the length
+ that would have been required) when the
+ buffer is too small. */
+ size_t bigger_need =
+ xsum (xtimes (allocated, 2), 12);
+ ENSURE_ALLOCATION (bigger_need);
+ continue;
+ }
+ else
+ count = retcount;
+ }
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+#if !USE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+ /* Make room for the result. */
+ if (count >= maxlen)
+ {
+ /* Need at least count bytes. But allocate
+ proportionally, to avoid looping eternally if
+ snprintf() reports a too small count. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+#if USE_SNPRINTF
+ continue;
+#endif
+ }
+
+#if USE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count * sizeof (CHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+ length += count;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ CHAR_T *memory;
+
+ memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ *lengthp = length;
+ return result;
+
+ out_of_memory:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ out_of_memory_1:
+ CLEANUP ();
+ errno = ENOMEM;
+ return NULL;
+ }
+}
+
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T
+#undef VASNPRINTF
diff --git a/Build/source/utils/texinfo/intl/vasnprintf.h b/Build/source/utils/texinfo/intl/vasnprintf.h
new file mode 100644
index 00000000000..65f1bc13dd2
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/vasnprintf.h
@@ -0,0 +1,61 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __format__ format
+# define __printf__ printf
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL. */
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+ __attribute__ ((__format__ (__printf__, 3, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/Build/source/utils/texinfo/intl/vasnwprintf.h b/Build/source/utils/texinfo/intl/vasnwprintf.h
new file mode 100644
index 00000000000..d3cef4cbcd2
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/vasnwprintf.h
@@ -0,0 +1,46 @@
+/* vswprintf with automatic memory allocation.
+ Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _VASNWPRINTF_H
+#define _VASNWPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get wchar_t, size_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL. */
+extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...);
+extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNWPRINTF_H */
diff --git a/Build/source/utils/texinfo/intl/wprintf-parse.h b/Build/source/utils/texinfo/intl/wprintf-parse.h
new file mode 100644
index 00000000000..24a2cfc28f3
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/wprintf-parse.h
@@ -0,0 +1,75 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _WPRINTF_PARSE_H
+#define _WPRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* A parsed directive. */
+typedef struct
+{
+ const wchar_t* dir_start;
+ const wchar_t* dir_end;
+ int flags;
+ const wchar_t* width_start;
+ const wchar_t* width_end;
+ size_t width_arg_index;
+ const wchar_t* precision_start;
+ const wchar_t* precision_end;
+ size_t precision_arg_index;
+ wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+ size_t arg_index;
+}
+wchar_t_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ wchar_t_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+}
+wchar_t_directives;
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a);
+
+#endif /* _WPRINTF_PARSE_H */
diff --git a/Build/source/utils/texinfo/intl/xsize.h b/Build/source/utils/texinfo/intl/xsize.h
new file mode 100644
index 00000000000..362e24b7241
--- /dev/null
+++ b/Build/source/utils/texinfo/intl/xsize.h
@@ -0,0 +1,109 @@
+/* xsize.h -- Checked size_t computations.
+
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get SIZE_MAX. */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* The size of memory objects is often computed through expressions of
+ type size_t. Example:
+ void* p = malloc (header_size + n * element_size).
+ These computations can lead to overflow. When this happens, malloc()
+ returns a piece of memory that is way too small, and the program then
+ crashes while attempting to fill the memory.
+ To avoid this, the functions and macros in this file check for overflow.
+ The convention is that SIZE_MAX represents overflow.
+ malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+ implementation that uses mmap --, it's recommended to use size_overflow_p()
+ or size_in_bounds_p() before invoking malloc().
+ The example thus becomes:
+ size_t size = xsum (header_size, xtimes (n, element_size));
+ void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t. */
+#define xcast_size_t(N) \
+ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum (size_t size1, size_t size2)
+{
+ size_t sum = size1 + size2;
+ return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+ return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+ return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xmax (size_t size1, size_t size2)
+{
+ /* No explicit check is needed here, because for any n:
+ max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
+ return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+ The count must be >= 0 and the element size must be > 0.
+ This is a macro, not an inline function, so that it works correctly even
+ when N is of a wider tupe and N > SIZE_MAX. */
+#define xtimes(N, ELSIZE) \
+ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow. */
+#define size_overflow_p(SIZE) \
+ ((SIZE) == SIZE_MAX)
+/* Check against overflow. */
+#define size_in_bounds_p(SIZE) \
+ ((SIZE) != SIZE_MAX)
+
+#endif /* _XSIZE_H */
diff --git a/Build/source/utils/texinfo/lib/Makefile.am b/Build/source/utils/texinfo/lib/Makefile.am
new file mode 100644
index 00000000000..253adfca880
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/Makefile.am
@@ -0,0 +1,26 @@
+# $Id: Makefile.am,v 1.7 2004/11/06 22:05:59 karl Exp $
+# Makefile.am for texinfo/lib.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+noinst_LIBRARIES = libtxi.a
+INCLUDES = -I../intl
+
+# Don't need to list alloca.c, etc., Automake includes them.
+libtxi_a_SOURCES = getopt.c getopt.h getopt1.c getopt_.h getopt_int.h \
+ gettext.h \
+ strcase.h strdup.h substring.c system.h \
+ xalloc.h xexit.c xmalloc.c xstrdup.c
+libtxi_a_LIBADD = $(LIBOBJS) $(ALLOCA)
+libtxi_a_DEPENDENCIES = $(libtxi_a_LIBADD)
+
+## xx configure for bzero?, clib, other common stuff
+
+EXTRA_DIST = README
diff --git a/Build/source/utils/texinfo/lib/Makefile.in b/Build/source/utils/texinfo/lib/Makefile.in
new file mode 100644
index 00000000000..6d22149fe04
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/Makefile.in
@@ -0,0 +1,474 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.7 2004/11/06 22:05:59 karl Exp $
+# Makefile.am for texinfo/lib.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+SOURCES = $(libtxi_a_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = lib
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ alloca.c memcpy.c memmove.c mkstemp.c strcasecmp.c strdup.c \
+ strerror.c strncasecmp.c tempname.c
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libtxi_a_AR = $(AR) $(ARFLAGS)
+am__DEPENDENCIES_1 = @LIBOBJS@
+am__DEPENDENCIES_2 = @ALLOCA@
+am_libtxi_a_OBJECTS = getopt.$(OBJEXT) getopt1.$(OBJEXT) \
+ substring.$(OBJEXT) xexit.$(OBJEXT) xmalloc.$(OBJEXT) \
+ xstrdup.$(OBJEXT)
+libtxi_a_OBJECTS = $(am_libtxi_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libtxi_a_SOURCES)
+DIST_SOURCES = $(libtxi_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LIBRARIES = libtxi.a
+INCLUDES = -I../intl
+
+# Don't need to list alloca.c, etc., Automake includes them.
+libtxi_a_SOURCES = getopt.c getopt.h getopt1.c getopt_.h getopt_int.h \
+ gettext.h \
+ strcase.h strdup.h substring.c system.h \
+ xalloc.h xexit.c xmalloc.c xstrdup.c
+
+libtxi_a_LIBADD = $(LIBOBJS) $(ALLOCA)
+libtxi_a_DEPENDENCIES = $(libtxi_a_LIBADD)
+EXTRA_DIST = README
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu lib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libtxi.a: $(libtxi_a_OBJECTS) $(libtxi_a_DEPENDENCIES)
+ -rm -f libtxi.a
+ $(libtxi_a_AR) libtxi.a $(libtxi_a_OBJECTS) $(libtxi_a_LIBADD)
+ $(RANLIB) libtxi.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memcpy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkstemp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strncasecmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/tempname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/substring.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xexit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrdup.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf $(DEPDIR) ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf $(DEPDIR) ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-noinstLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/lib/README b/Build/source/utils/texinfo/lib/README
new file mode 100644
index 00000000000..643f9c19905
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/README
@@ -0,0 +1,13 @@
+$Id: README,v 1.3 2004/04/11 17:56:46 karl Exp $
+texinfo/lib/README
+
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Common routines for the Texinfo programs.
+
+Many are common to other GNU packages as well.
+See the gnulib project at savannah: http://savannah.gnu.org/projects/gnulib
diff --git a/Build/source/utils/texinfo/lib/alloca.c b/Build/source/utils/texinfo/lib/alloca.c
new file mode 100644
index 00000000000..d1d54475bbb
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/alloca.c
@@ -0,0 +1,491 @@
+/* alloca.c -- allocate automatically reclaimed memory
+ (Mostly) portable public-domain implementation -- D A Gwyn
+
+ This implementation of the PWB library alloca function,
+ which is used to allocate space off the run-time stack so
+ that it is automatically reclaimed upon procedure exit,
+ was inspired by discussions with J. Q. Johnson of Cornell.
+ J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+ There are some preprocessor constants that can
+ be defined when compiling for your specific system, for
+ improved efficiency; however, the defaults should be okay.
+
+ The general concept of this implementation is to keep
+ track of all alloca-allocated blocks, and reclaim any
+ that are found to be deeper in the stack than the current
+ invocation. This heuristic does not reclaim storage as
+ soon as it becomes invalid, but it will do so eventually.
+
+ As a special case, alloca(0) reclaims storage without
+ allocating any. It is a good idea to use alloca(0) in
+ your main control loop, etc. to force garbage collection. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef emacs
+# include "lisp.h"
+# include "blockinput.h"
+# ifdef EMACS_FREE
+# undef free
+# define free EMACS_FREE
+# endif
+#else
+# define memory_full() abort ()
+#endif
+
+/* If compiling with GCC 2, this file's not needed. */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* If someone has defined alloca as a macro,
+ there must be some other way alloca is supposed to work. */
+# ifndef alloca
+
+# ifdef emacs
+# ifdef static
+/* actually, only want this if static is defined as ""
+ -- this is for usg, in which emacs must undefine static
+ in order to make unexec workable
+ */
+# ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+/* Using #error here is not wise since this file should work for
+ old and obscure compilers. */
+# endif /* STACK_DIRECTION undefined */
+# endif /* static */
+# endif /* emacs */
+
+/* If your stack is a linked list of frames, you have to
+ provide an "address metric" ADDRESS_FUNCTION macro. */
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+# else
+# define ADDRESS_FUNCTION(arg) &(arg)
+# endif
+
+/* Define STACK_DIRECTION if you know the direction of stack
+ growth for your system; otherwise it will be automatically
+ deduced at run-time.
+
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+
+# ifndef STACK_DIRECTION
+# define STACK_DIRECTION 0 /* Direction unknown. */
+# endif
+
+# if STACK_DIRECTION != 0
+
+# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
+
+# else /* STACK_DIRECTION == 0; need run-time code. */
+
+static int stack_dir; /* 1 or -1 once known. */
+# define STACK_DIR stack_dir
+
+static void
+find_stack_direction (void)
+{
+ static char *addr = NULL; /* Address of first `dummy', once known. */
+ auto char dummy; /* To get stack address. */
+
+ if (addr == NULL)
+ { /* Initial entry. */
+ addr = ADDRESS_FUNCTION (dummy);
+
+ find_stack_direction (); /* Recurse once. */
+ }
+ else
+ {
+ /* Second entry. */
+ if (ADDRESS_FUNCTION (dummy) > addr)
+ stack_dir = 1; /* Stack grew upward. */
+ else
+ stack_dir = -1; /* Stack grew downward. */
+ }
+}
+
+# endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+ (a) chain together all alloca'ed blocks;
+ (b) keep track of stack depth.
+
+ It is very important that sizeof(header) agree with malloc
+ alignment chunk size. The following default should work okay. */
+
+# ifndef ALIGN_SIZE
+# define ALIGN_SIZE sizeof(double)
+# endif
+
+typedef union hdr
+{
+ char align[ALIGN_SIZE]; /* To force sizeof(header). */
+ struct
+ {
+ union hdr *next; /* For chaining headers. */
+ char *deep; /* For stack depth measure. */
+ } h;
+} header;
+
+static header *last_alloca_header = NULL; /* -> last alloca header. */
+
+/* Return a pointer to at least SIZE bytes of storage,
+ which will be automatically reclaimed upon exit from
+ the procedure that called alloca. Originally, this space
+ was supposed to be taken from the current stack frame of the
+ caller, but that method cannot be made to work for some
+ implementations of C, for example under Gould's UTX/32. */
+
+void *
+alloca (size_t size)
+{
+ auto char probe; /* Probes stack depth: */
+ register char *depth = ADDRESS_FUNCTION (probe);
+
+# if STACK_DIRECTION == 0
+ if (STACK_DIR == 0) /* Unknown growth direction. */
+ find_stack_direction ();
+# endif
+
+ /* Reclaim garbage, defined as all alloca'd storage that
+ was allocated from deeper in the stack than currently. */
+
+ {
+ register header *hp; /* Traverses linked list. */
+
+# ifdef emacs
+ BLOCK_INPUT;
+# endif
+
+ for (hp = last_alloca_header; hp != NULL;)
+ if ((STACK_DIR > 0 && hp->h.deep > depth)
+ || (STACK_DIR < 0 && hp->h.deep < depth))
+ {
+ register header *np = hp->h.next;
+
+ free (hp); /* Collect garbage. */
+
+ hp = np; /* -> next header. */
+ }
+ else
+ break; /* Rest are not deeper. */
+
+ last_alloca_header = hp; /* -> last valid storage. */
+
+# ifdef emacs
+ UNBLOCK_INPUT;
+# endif
+ }
+
+ if (size == 0)
+ return NULL; /* No allocation required. */
+
+ /* Allocate combined header + user data storage. */
+
+ {
+ /* Address of header. */
+ register header *new;
+
+ size_t combined_size = sizeof (header) + size;
+ if (combined_size < sizeof (header))
+ memory_full ();
+
+ new = malloc (combined_size);
+
+ if (! new)
+ memory_full ();
+
+ new->h.next = last_alloca_header;
+ new->h.deep = depth;
+
+ last_alloca_header = new;
+
+ /* User storage begins just after header. */
+
+ return (void *) (new + 1);
+ }
+}
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+# ifdef DEBUG_I00AFUNC
+# include <stdio.h>
+# endif
+
+# ifndef CRAY_STACK
+# define CRAY_STACK
+# ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+ {
+ long shgrow:32; /* Number of times stack has grown. */
+ long shaseg:32; /* Size of increments to stack. */
+ long shhwm:32; /* High water mark of stack. */
+ long shsize:32; /* Current size of stack (all segments). */
+ };
+
+/* The stack segment linkage control information occurs at
+ the high-address end of a stack segment. (The stack
+ grows from low addresses to high addresses.) The initial
+ part of the stack segment linkage control information is
+ 0200 (octal) words. This provides for register storage
+ for the routine which overflows the stack. */
+
+struct stack_segment_linkage
+ {
+ long ss[0200]; /* 0200 overflow words. */
+ long sssize:32; /* Number of words in this segment. */
+ long ssbase:32; /* Offset to stack base. */
+ long:32;
+ long sspseg:32; /* Offset to linkage control of previous
+ segment of stack. */
+ long:32;
+ long sstcpt:32; /* Pointer to task common address block. */
+ long sscsnm; /* Private control structure number for
+ microtasking. */
+ long ssusr1; /* Reserved for user. */
+ long ssusr2; /* Reserved for user. */
+ long sstpid; /* Process ID for pid based multi-tasking. */
+ long ssgvup; /* Pointer to multitasking thread giveup. */
+ long sscray[7]; /* Reserved for Cray Research. */
+ long ssa0;
+ long ssa1;
+ long ssa2;
+ long ssa3;
+ long ssa4;
+ long ssa5;
+ long ssa6;
+ long ssa7;
+ long sss0;
+ long sss1;
+ long sss2;
+ long sss3;
+ long sss4;
+ long sss5;
+ long sss6;
+ long sss7;
+ };
+
+# else /* CRAY2 */
+/* The following structure defines the vector of words
+ returned by the STKSTAT library routine. */
+struct stk_stat
+ {
+ long now; /* Current total stack size. */
+ long maxc; /* Amount of contiguous space which would
+ be required to satisfy the maximum
+ stack demand to date. */
+ long high_water; /* Stack high-water mark. */
+ long overflows; /* Number of stack overflow ($STKOFEN) calls. */
+ long hits; /* Number of internal buffer hits. */
+ long extends; /* Number of block extensions. */
+ long stko_mallocs; /* Block allocations by $STKOFEN. */
+ long underflows; /* Number of stack underflow calls ($STKRETN). */
+ long stko_free; /* Number of deallocations by $STKRETN. */
+ long stkm_free; /* Number of deallocations by $STKMRET. */
+ long segments; /* Current number of stack segments. */
+ long maxs; /* Maximum number of stack segments so far. */
+ long pad_size; /* Stack pad size. */
+ long current_address; /* Current stack segment address. */
+ long current_size; /* Current stack segment size. This
+ number is actually corrupted by STKSTAT to
+ include the fifteen word trailer area. */
+ long initial_address; /* Address of initial segment. */
+ long initial_size; /* Size of initial segment. */
+ };
+
+/* The following structure describes the data structure which trails
+ any stack segment. I think that the description in 'asdef' is
+ out of date. I only describe the parts that I am sure about. */
+
+struct stk_trailer
+ {
+ long this_address; /* Address of this block. */
+ long this_size; /* Size of this block (does not include
+ this trailer). */
+ long unknown2;
+ long unknown3;
+ long link; /* Address of trailer block of previous
+ segment. */
+ long unknown5;
+ long unknown6;
+ long unknown7;
+ long unknown8;
+ long unknown9;
+ long unknown10;
+ long unknown11;
+ long unknown12;
+ long unknown13;
+ long unknown14;
+ };
+
+# endif /* CRAY2 */
+# endif /* not CRAY_STACK */
+
+# ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+ I doubt that "lint" will like this much. */
+
+static long
+i00afunc (long *address)
+{
+ struct stk_stat status;
+ struct stk_trailer *trailer;
+ long *block, size;
+ long result = 0;
+
+ /* We want to iterate through all of the segments. The first
+ step is to get the stack status structure. We could do this
+ more quickly and more directly, perhaps, by referencing the
+ $LM00 common block, but I know that this works. */
+
+ STKSTAT (&status);
+
+ /* Set up the iteration. */
+
+ trailer = (struct stk_trailer *) (status.current_address
+ + status.current_size
+ - 15);
+
+ /* There must be at least one stack segment. Therefore it is
+ a fatal error if "trailer" is null. */
+
+ if (trailer == 0)
+ abort ();
+
+ /* Discard segments that do not contain our argument address. */
+
+ while (trailer != 0)
+ {
+ block = (long *) trailer->this_address;
+ size = trailer->this_size;
+ if (block == 0 || size == 0)
+ abort ();
+ trailer = (struct stk_trailer *) trailer->link;
+ if ((block <= address) && (address < (block + size)))
+ break;
+ }
+
+ /* Set the result to the offset in this segment and add the sizes
+ of all predecessor segments. */
+
+ result = address - block;
+
+ if (trailer == 0)
+ {
+ return result;
+ }
+
+ do
+ {
+ if (trailer->this_size <= 0)
+ abort ();
+ result += trailer->this_size;
+ trailer = (struct stk_trailer *) trailer->link;
+ }
+ while (trailer != 0);
+
+ /* We are done. Note that if you present a bogus address (one
+ not in any segment), you will get a different number back, formed
+ from subtracting the address of the first block. This is probably
+ not what you want. */
+
+ return (result);
+}
+
+# else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+ Determine the number of the cell within the stack,
+ given the address of the cell. The purpose of this
+ routine is to linearize, in some sense, stack addresses
+ for alloca. */
+
+static long
+i00afunc (long address)
+{
+ long stkl = 0;
+
+ long size, pseg, this_segment, stack;
+ long result = 0;
+
+ struct stack_segment_linkage *ssptr;
+
+ /* Register B67 contains the address of the end of the
+ current stack segment. If you (as a subprogram) store
+ your registers on the stack and find that you are past
+ the contents of B67, you have overflowed the segment.
+
+ B67 also points to the stack segment linkage control
+ area, which is what we are really interested in. */
+
+ stkl = CRAY_STACKSEG_END ();
+ ssptr = (struct stack_segment_linkage *) stkl;
+
+ /* If one subtracts 'size' from the end of the segment,
+ one has the address of the first word of the segment.
+
+ If this is not the first segment, 'pseg' will be
+ nonzero. */
+
+ pseg = ssptr->sspseg;
+ size = ssptr->sssize;
+
+ this_segment = stkl - size;
+
+ /* It is possible that calling this routine itself caused
+ a stack overflow. Discard stack segments which do not
+ contain the target address. */
+
+ while (!(this_segment <= address && address <= stkl))
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+# endif
+ if (pseg == 0)
+ break;
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ this_segment = stkl - size;
+ }
+
+ result = address - this_segment;
+
+ /* If you subtract pseg from the current end of the stack,
+ you get the address of the previous stack segment's end.
+ This seems a little convoluted to me, but I'll bet you save
+ a cycle somewhere. */
+
+ while (pseg != 0)
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o\n", pseg, size);
+# endif
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ result += size;
+ }
+ return (result);
+}
+
+# endif /* not CRAY2 */
+# endif /* CRAY */
+
+# endif /* no alloca */
+#endif /* not GCC version 2 */
diff --git a/Build/source/utils/texinfo/lib/depend.mak b/Build/source/utils/texinfo/lib/depend.mak
new file mode 100644
index 00000000000..63d7983b61b
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/depend.mak
@@ -0,0 +1,43 @@
+$(objdir)/substring.obj: \
+ system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ gettext.h
+
+$(objdir)/xexit.obj: \
+ system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ gettext.h
+
+$(objdir)/strdup.obj: \
+ ../config.h
+
+$(objdir)/getopt.obj: \
+ ../config.h \
+ gettext.h \
+ getopt.h
+
+$(objdir)/xstrdup.obj: \
+ xalloc.h
+
+$(objdir)/getopt1.obj: \
+ ../config.h \
+ getopt.h
+
+$(objdir)/strncasecmp.obj: \
+ strcasecmp.c
+
+$(objdir)/tempname.obj: \
+
+
+$(objdir)/alloca.obj: \
+ ../config.h \
+ xalloc.h
+
+$(objdir)/strcasecmp.obj: \
+
+
+$(objdir)/mkstemp.obj: \
+ ../config.h
+
diff --git a/Build/source/utils/texinfo/lib/getopt.c b/Build/source/utils/texinfo/lib/getopt.c
new file mode 100644
index 00000000000..95b3604f892
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/getopt.c
@@ -0,0 +1,1234 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to drepper@gnu.org
+ before changing it!
+ Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+ Ditto for AIX 3.2 and <stdlib.h>. */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+# include <stdlib.h>
+# include <unistd.h>
+#endif /* GNU C library. */
+
+#include <string.h>
+
+#ifdef VMS
+# include <unixlib.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable POSIXLY_CORRECT disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt.h"
+#include "getopt_int.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* 1003.2 says this must be 1 before any call. */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data. */
+
+static struct _getopt_data getopt_data;
+
+
+#ifndef __GNU_LIBRARY__
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+#endif /* not __GNU_LIBRARY__ */
+
+#ifdef _LIBC
+/* Stored original parameters.
+ XXX This is no good solution. We should rather copy the args so
+ that we can compare them later. But we must not use malloc(3). */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+ indicating ARGV elements that should not be considered arguments. */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+# define SWAP_FLAGS(ch1, ch2) \
+ if (d->__nonoption_flags_len > 0) \
+ { \
+ char __tmp = __getopt_nonoption_flags[ch1]; \
+ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
+ __getopt_nonoption_flags[ch2] = __tmp; \
+ }
+# else
+# define SWAP_FLAGS(ch1, ch2)
+# endif
+#else /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (char **argv, struct _getopt_data *d)
+{
+ int bottom = d->__first_nonopt;
+ int middle = d->__last_nonopt;
+ int top = d->optind;
+ char *tem;
+
+ /* Exchange the shorter segment with the far end of the longer segment.
+ That puts the shorter segment into the right place.
+ It leaves the longer segment in the right place overall,
+ but it consists of two parts that need to be swapped next. */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ /* First make sure the handling of the `__getopt_nonoption_flags'
+ string can work normally. Our top argument must be in the range
+ of the string. */
+ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+ {
+ /* We must extend the array. The user plays games with us and
+ presents new arguments. */
+ char *new_str = malloc (top + 1);
+ if (new_str == NULL)
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+ else
+ {
+ memset (__mempcpy (new_str, __getopt_nonoption_flags,
+ d->__nonoption_flags_max_len),
+ '\0', top + 1 - d->__nonoption_flags_max_len);
+ d->__nonoption_flags_max_len = top + 1;
+ __getopt_nonoption_flags = new_str;
+ }
+ }
+#endif
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ register int i;
+
+ /* Swap it with the top part of the top segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[top - (middle - bottom) + i];
+ argv[top - (middle - bottom) + i] = tem;
+ SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ register int i;
+
+ /* Swap it with the bottom part of the bottom segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[middle + i];
+ argv[middle + i] = tem;
+ SWAP_FLAGS (bottom + i, middle + i);
+ }
+ /* Exclude the moved top segment from further swapping. */
+ bottom += len;
+ }
+ }
+
+ /* Update records for the slots the non-options now occupy. */
+
+ d->__first_nonopt += (d->optind - d->__last_nonopt);
+ d->__last_nonopt = d->optind;
+}
+
+/* Initialize the internal data when the first call is made. */
+
+static const char *
+_getopt_initialize (int argc, char *const *argv, const char *optstring,
+ struct _getopt_data *d)
+{
+ /* Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ d->__first_nonopt = d->__last_nonopt = d->optind;
+
+ d->__nextchar = NULL;
+
+ d->__posixly_correct = !!getenv ("POSIXLY_CORRECT");
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ d->__ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ d->__ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (d->__posixly_correct)
+ d->__ordering = REQUIRE_ORDER;
+ else
+ d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ if (!d->__posixly_correct
+ && argc == __libc_argc && argv == __libc_argv)
+ {
+ if (d->__nonoption_flags_max_len == 0)
+ {
+ if (__getopt_nonoption_flags == NULL
+ || __getopt_nonoption_flags[0] == '\0')
+ d->__nonoption_flags_max_len = -1;
+ else
+ {
+ const char *orig_str = __getopt_nonoption_flags;
+ int len = d->__nonoption_flags_max_len = strlen (orig_str);
+ if (d->__nonoption_flags_max_len < argc)
+ d->__nonoption_flags_max_len = argc;
+ __getopt_nonoption_flags =
+ (char *) malloc (d->__nonoption_flags_max_len);
+ if (__getopt_nonoption_flags == NULL)
+ d->__nonoption_flags_max_len = -1;
+ else
+ memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+ '\0', d->__nonoption_flags_max_len - len);
+ }
+ }
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+ }
+ else
+ d->__nonoption_flags_len = 0;
+#endif
+
+ return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns -1.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal_r (int argc, char *const *argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, struct _getopt_data *d)
+{
+ int print_errors = d->opterr;
+ if (optstring[0] == ':')
+ print_errors = 0;
+
+ if (argc < 1)
+ return -1;
+
+ d->optarg = NULL;
+
+ if (d->optind == 0 || !d->__initialized)
+ {
+ if (d->optind == 0)
+ d->optind = 1; /* Don't scan ARGV[0], the program name. */
+ optstring = _getopt_initialize (argc, argv, optstring, d);
+ d->__initialized = 1;
+ }
+
+ /* Test whether ARGV[optind] points to a non-option argument.
+ Either it does not have option syntax, or there is an environment flag
+ from the shell indicating it is not an option. The later information
+ is only used when the used in the GNU libc. */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+ || (d->optind < d->__nonoption_flags_len \
+ && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+ if (d->__nextchar == NULL || *d->__nextchar == '\0')
+ {
+ /* Advance to the next ARGV-element. */
+
+ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+ moved back by the user (who may also have changed the arguments). */
+ if (d->__last_nonopt > d->optind)
+ d->__last_nonopt = d->optind;
+ if (d->__first_nonopt > d->optind)
+ d->__first_nonopt = d->optind;
+
+ if (d->__ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__last_nonopt != d->optind)
+ d->__first_nonopt = d->optind;
+
+ /* Skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (d->optind < argc && NONOPTION_P)
+ d->optind++;
+ d->__last_nonopt = d->optind;
+ }
+
+ /* The special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+ {
+ d->optind++;
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__first_nonopt == d->__last_nonopt)
+ d->__first_nonopt = d->optind;
+ d->__last_nonopt = argc;
+
+ d->optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (d->optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (d->__first_nonopt != d->__last_nonopt)
+ d->optind = d->__first_nonopt;
+ return -1;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if (NONOPTION_P)
+ {
+ if (d->__ordering == REQUIRE_ORDER)
+ return -1;
+ d->optarg = argv[d->optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Skip the initial punctuation. */
+
+ d->__nextchar = (argv[d->optind] + 1
+ + (longopts != NULL && argv[d->optind][1] == '-'));
+ }
+
+ /* Decode the current option-ARGV-element. */
+
+ /* Check whether the ARGV-element is a long option.
+
+ If long_only and the ARGV-element has the form "-f", where f is
+ a valid short option, don't consider it an abbreviated form of
+ a long option that starts with f. Otherwise there would be no
+ way to give the -f short option.
+
+ On the other hand, if there's a long option "fubar" and
+ the ARGV-element is "-fu", do consider that an abbreviation of
+ the long option, just like "--fu", and not "-f" with arg "u".
+
+ This distinction seems to be the most useful approach. */
+
+ if (longopts != NULL
+ && (argv[d->optind][1] == '-'
+ || (long_only && (argv[d->optind][2]
+ || !strchr (optstring, argv[d->optind][1])))))
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = -1;
+ int option_index;
+
+ for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar)
+ == (unsigned int) strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else if (long_only
+ || pfound->has_arg != p->has_arg
+ || pfound->flag != p->flag
+ || pfound->val != p->val)
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ d->optind++;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind - 1][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option `--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option `--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option `%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option `%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+
+ d->optopt = pfound->val;
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optopt = pfound->val;
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[d->optind][1] == '-'
+ || strchr (optstring, *d->__nextchar) == NULL)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"),
+ argv[0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+ argv[0], d->__nextchar);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->__nextchar = (char *) "";
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *d->__nextchar++;
+ char *temp = strchr (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*d->__nextchar == '\0')
+ ++d->optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (d->__posixly_correct)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
+#endif
+ }
+ else
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->optopt = c;
+ return '?';
+ }
+ /* Convenience. Treat POSIX -W foo same as long option --foo */
+ if (temp[0] == 'W' && temp[1] == ';')
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = 0;
+ int option_index;
+
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf,
+ _("%s: option requires an argument -- %c\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ return c;
+ }
+ else
+ /* We already incremented `d->optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+
+ /* optarg is now the argument, see if it's in the
+ table of longopts. */
+
+ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+ nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+ argv[0], argv[d->optind]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ return '?';
+ }
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option `%s' requires an argument\n"),
+ argv[0], argv[d->optind - 1]);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ d->__nextchar = NULL;
+ return 'W'; /* Let the application handle it. */
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ d->optind++;
+ }
+ else
+ d->optarg = NULL;
+ d->__nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+ /* 1003.2 specifies the format of this message. */
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option requires an argument -- %c\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ if (_IO_fwide (stderr, 0) > 0)
+ __fwprintf (stderr, L"%s", buf);
+ else
+ fputs (buf, stderr);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- %c\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+ d->__nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+_getopt_internal (int argc, char *const *argv, const char *optstring,
+ const struct option *longopts, int *longind, int long_only)
+{
+ int result;
+
+ getopt_data.optind = optind;
+ getopt_data.opterr = opterr;
+
+ result = _getopt_internal_r (argc, argv, optstring, longopts,
+ longind, long_only, &getopt_data);
+
+ optind = getopt_data.optind;
+ optarg = getopt_data.optarg;
+ optopt = getopt_data.optopt;
+
+ return result;
+}
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0);
+}
+
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/Build/source/utils/texinfo/lib/getopt.h b/Build/source/utils/texinfo/lib/getopt.h
new file mode 100644
index 00000000000..993946b12c0
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/getopt.h
@@ -0,0 +1,10 @@
+/* getopt.h -- wrapper for gnulib getopt_.h.
+ $Id: getopt.h,v 1.6 2004/09/14 12:36:00 karl Exp $
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+*/
+
+#include "getopt_.h"
diff --git a/Build/source/utils/texinfo/lib/getopt1.c b/Build/source/utils/texinfo/lib/getopt1.c
new file mode 100644
index 00000000000..706f59c0837
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/getopt1.c
@@ -0,0 +1,171 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (int argc, char *const *argv, const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+int
+_getopt_long_r (int argc, char *const *argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 0, d);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (int argc, char *const *argv, const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+int
+_getopt_long_only_r (int argc, char *const *argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 1, d);
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/Build/source/utils/texinfo/lib/getopt_.h b/Build/source/utils/texinfo/lib/getopt_.h
new file mode 100644
index 00000000000..c61768c691b
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/getopt_.h
@@ -0,0 +1,176 @@
+/* Declarations for getopt.
+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+ standalone, or this is the first header included in the source file.
+ If we are being used with glibc, we need to include <features.h>, but
+ that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
+ not defined, include <ctype.h>, which will pull in <features.h> for us
+ if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
+ doesn't flood the namespace with stuff the way some other headers do.) */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+# define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+ const char *name;
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+# define no_argument 0
+# define required_argument 1
+# define optional_argument 2
+#endif /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+ arguments in ARGV (ARGC of them, minus the program name) for
+ options given in OPTS.
+
+ Return the option character from OPTS just read. Return -1 when
+ there are no more options. For unrecognized options, or options
+ missing arguments, `optopt' is set to the option letter, and '?' is
+ returned.
+
+ The OPTS string is a list of characters which are recognized option
+ letters, optionally followed by colons, specifying that that letter
+ takes an argument, to be placed in `optarg'.
+
+ If a letter in OPTS is followed by two colons, its argument is
+ optional. This behavior is specific to the GNU `getopt'.
+
+ The argument `--' causes premature termination of argument
+ scanning, explicitly telling `getopt' that there are no more
+ options.
+
+ If OPTS begins with `--', then non-option arguments are treated as
+ arguments to the option '\0'. This behavior is specific to the GNU
+ `getopt'. */
+
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __THROW;
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+
+#ifndef __need_getopt
+extern int getopt_long (int ___argc, char *const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW;
+extern int getopt_long_only (int ___argc, char *const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW;
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations. */
+#undef __need_getopt
+
+#endif /* getopt.h */
diff --git a/Build/source/utils/texinfo/lib/getopt_int.h b/Build/source/utils/texinfo/lib/getopt_int.h
new file mode 100644
index 00000000000..0c5eddeca96
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/getopt_int.h
@@ -0,0 +1,129 @@
+/* Internal declarations for getopt.
+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H 1
+
+extern int _getopt_internal (int ___argc, char *const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only);
+
+
+/* Reentrant versions which can handle parsing multiple argument
+ vectors at the same time. */
+
+/* Data type for reentrant functions. */
+struct _getopt_data
+{
+ /* These have exactly the same meaning as the corresponding global
+ variables, except that they are used for the reentrant
+ versions of getopt. */
+ int optind;
+ int opterr;
+ int optopt;
+ char *optarg;
+
+ /* Internal members. */
+
+ /* True if the internal members have been initialized. */
+ int __initialized;
+
+ /* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+ char *__nextchar;
+
+ /* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we
+ scan, so that eventually all the non-options are at the end.
+ This allows options to be given in any order, even with programs
+ that were not written to expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were
+ written to expect options and other ARGV-elements in any order
+ and that care about the ordering of the two. We describe each
+ non-option ARGV-element as if it were the argument of an option
+ with character code 1. Using `-' as the first character of the
+ list of option characters selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return -1 with `optind' != ARGC. */
+
+ enum
+ {
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ } __ordering;
+
+ /* If the POSIXLY_CORRECT environment variable is set. */
+ int __posixly_correct;
+
+
+ /* Handle permutation of arguments. */
+
+ /* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first
+ of them; `last_nonopt' is the index after the last of them. */
+
+ int __first_nonopt;
+ int __last_nonopt;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ int __nonoption_flags_max_len;
+ int __nonoption_flags_len;
+# endif
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+ default values and to clear the initialization flag. */
+#define _GETOPT_DATA_INITIALIZER { 1, 1 }
+
+extern int _getopt_internal_r (int ___argc, char *const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, struct _getopt_data *__data);
+
+extern int _getopt_long_r (int ___argc, char *const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ struct _getopt_data *__data);
+
+extern int _getopt_long_only_r (int ___argc, char *const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts,
+ int *__longind,
+ struct _getopt_data *__data);
+
+#endif /* getopt_int.h */
diff --git a/Build/source/utils/texinfo/lib/gettext.h b/Build/source/utils/texinfo/lib/gettext.h
new file mode 100644
index 00000000000..835732e01fe
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/gettext.h
@@ -0,0 +1,68 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option. */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions. */
+# include <libintl.h>
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+ chokes if dcgettext is defined as a macro. So include it now, to make
+ later inclusions of <locale.h> a NOP. We don't include <libintl.h>
+ as well because people using "gettext.h" will not include <libintl.h>,
+ and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+ is OK. */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Disabled NLS.
+ The casts to 'const char *' serve the purpose of producing warnings
+ for invalid uses of the value returned from these functions.
+ On pre-ANSI systems without 'const', the config.h file is supposed to
+ contain "#define const". */
+# define gettext(Msgid) ((const char *) (Msgid))
+# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
+# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
+# define ngettext(Msgid1, Msgid2, N) \
+ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
+
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+ extraction of messages, but does not call gettext(). The run-time
+ translation is done at a different place in the code.
+ The argument, String, should be a literal string. Concatenated strings
+ and other string expressions won't work.
+ The macro's expansion is not parenthesized, so that it is suitable as
+ initializer for static 'char[]' or 'const char[]' variables. */
+#define gettext_noop(String) String
+
+#endif /* _LIBGETTEXT_H */
diff --git a/Build/source/utils/texinfo/lib/memcpy.c b/Build/source/utils/texinfo/lib/memcpy.c
new file mode 100644
index 00000000000..fdca8de2c80
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/memcpy.c
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995, 1997, 2000, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Written by Jim Meyering <meyering@na-net.ornl.gov>. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+
+/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined
+ if the source overlaps with the destination.
+ Return DESTADDR. */
+
+void *
+memcpy (void *destaddr, void const *srcaddr, size_t len)
+{
+ char *dest = destaddr;
+ char const *src = srcaddr;
+
+ while (len-- > 0)
+ *dest++ = *src++;
+ return destaddr;
+}
diff --git a/Build/source/utils/texinfo/lib/memmove.c b/Build/source/utils/texinfo/lib/memmove.c
new file mode 100644
index 00000000000..79cc7827396
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/memmove.c
@@ -0,0 +1,28 @@
+/* memmove.c -- copy memory.
+ Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate.
+ In the public domain.
+ By David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+
+void *
+memmove (void *dest0, void const *source0, size_t length)
+{
+ char *dest = dest0;
+ char const *source = source0;
+ if (source < dest)
+ /* Moving from low mem to hi mem; start at end. */
+ for (source += length, dest += length; length; --length)
+ *--dest = *--source;
+ else if (source != dest)
+ {
+ /* Moving from hi mem to low mem; start at beginning. */
+ for (; length; --length)
+ *dest++ = *source++;
+ }
+ return dest0;
+}
diff --git a/Build/source/utils/texinfo/lib/mkstemp.c b/Build/source/utils/texinfo/lib/mkstemp.c
new file mode 100644
index 00000000000..f6312b64636
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/mkstemp.c
@@ -0,0 +1,42 @@
+/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include <config.h>
+
+/* Disable the definition of mkstemp to rpl_mkstemp (from config.h) in this
+ file. Otherwise, we'd get conflicting prototypes for rpl_mkstemp on
+ most systems. */
+#undef mkstemp
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+int __gen_tempname ();
+
+/* Generate a unique temporary file name from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+ Then open the file and return a fd. */
+int
+rpl_mkstemp (char *template)
+{
+ return __gen_tempname (template, __GT_FILE);
+}
diff --git a/Build/source/utils/texinfo/lib/strcase.h b/Build/source/utils/texinfo/lib/strcase.h
new file mode 100644
index 00000000000..f17e64832ff
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/strcase.h
@@ -0,0 +1,35 @@
+/* Case-insensitive string comparison functions.
+ Copyright (C) 1995-1996, 2001, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _STRCASE_H
+#define _STRCASE_H
+
+#include <stddef.h>
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work correctly in multibyte locales. */
+extern int strcasecmp (const char *s1, const char *s2);
+
+/* Compare no more than N characters of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function can not work correctly in multibyte locales. */
+extern int strncasecmp (const char *s1, const char *s2, size_t n);
+
+#endif /* _STRCASE_H */
diff --git a/Build/source/utils/texinfo/lib/strcasecmp.c b/Build/source/utils/texinfo/lib/strcasecmp.c
new file mode 100644
index 00000000000..cf4ab88dbdf
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/strcasecmp.c
@@ -0,0 +1,66 @@
+/* strcasecmp.c -- case insensitive string comparator
+ Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef LENGTH_LIMIT
+# define STRXCASECMP_FUNCTION strncasecmp
+# define STRXCASECMP_DECLARE_N , size_t n
+# define LENGTH_LIMIT_EXPR(Expr) Expr
+#else
+# define STRXCASECMP_FUNCTION strcasecmp
+# define STRXCASECMP_DECLARE_N /* empty */
+# define LENGTH_LIMIT_EXPR(Expr) 0
+#endif
+
+#include <stddef.h>
+#include <ctype.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare {{no more than N characters of }}strings S1 and S2,
+ ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less
+ than, equal to or greater than S2. */
+
+int
+STRXCASECMP_FUNCTION (const char *s1, const char *s2 STRXCASECMP_DECLARE_N)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || LENGTH_LIMIT_EXPR (n == 0))
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (LENGTH_LIMIT_EXPR (--n == 0) || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+}
diff --git a/Build/source/utils/texinfo/lib/strdup.c b/Build/source/utils/texinfo/lib/strdup.c
new file mode 100644
index 00000000000..8c88e310a5b
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/strdup.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 1991, 1996, 1997, 1998, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef _LIBC
+/* Get specification. */
+# include "strdup.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#undef __strdup
+#undef strdup
+
+#ifndef weak_alias
+# define __strdup strdup
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+char *
+__strdup (const char *s)
+{
+ size_t len = strlen (s) + 1;
+ void *new = malloc (len);
+
+ if (new == NULL)
+ return NULL;
+
+ return (char *) memcpy (new, s, len);
+}
+#ifdef libc_hidden_def
+libc_hidden_def (__strdup)
+#endif
+#ifdef weak_alias
+weak_alias (__strdup, strdup)
+#endif
diff --git a/Build/source/utils/texinfo/lib/strdup.h b/Build/source/utils/texinfo/lib/strdup.h
new file mode 100644
index 00000000000..4dc6a391c8a
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/strdup.h
@@ -0,0 +1,29 @@
+/* strdup.h -- duplicate a string
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef STRDUP_H_
+#define STRDUP_H_
+
+/* Get strdup declaration, if available. */
+#include <string.h>
+
+#if !HAVE_DECL_STRDUP && !defined strdup
+/* Duplicate S, returning an identical malloc'd string. */
+extern char *strdup (const char *s);
+#endif
+
+#endif /* STRDUP_H_ */
diff --git a/Build/source/utils/texinfo/lib/strerror.c b/Build/source/utils/texinfo/lib/strerror.c
new file mode 100644
index 00000000000..7c17f1fbeff
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/strerror.c
@@ -0,0 +1,49 @@
+/* strerror.c --- ANSI C compatible system error routine
+
+ Copyright (C) 1986, 1988, 1989, 1991, 2002, 2003 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <limits.h>
+
+/* Don't include <stdio.h>, since it may or may not declare
+ sys_errlist and its declarations may collide with ours. Just
+ declare the stuff that we need directly. Standard hosted C89
+ implementations define strerror and they don't need this strerror
+ function, so take some liberties with the standard to cater to
+ ancient or limited freestanding implementations. */
+int sprintf (char *, char const *, ...);
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+char *
+strerror (int n)
+{
+ static char const fmt[] = "Unknown error (%d)";
+ static char mesg[sizeof fmt + sizeof n * CHAR_BIT / 3];
+
+ if (n < 0 || n >= sys_nerr)
+ {
+ sprintf (mesg, fmt, n);
+ return mesg;
+ }
+ else
+ return sys_errlist[n];
+}
diff --git a/Build/source/utils/texinfo/lib/strncasecmp.c b/Build/source/utils/texinfo/lib/strncasecmp.c
new file mode 100644
index 00000000000..68d95aacc0f
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/strncasecmp.c
@@ -0,0 +1,2 @@
+#define LENGTH_LIMIT
+#include "strcasecmp.c"
diff --git a/Build/source/utils/texinfo/lib/substring.c b/Build/source/utils/texinfo/lib/substring.c
new file mode 100644
index 00000000000..9e59fceefea
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/substring.c
@@ -0,0 +1,35 @@
+/* substring.c -- extract substring.
+ $Id: substring.c,v 1.2 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1999, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+
+char *
+substring (const char *start, const char *end)
+{
+ char *result = xmalloc (end - start + 1);
+ char *scan_result = result;
+ const char *scan = start;
+
+ while (scan < end)
+ *scan_result++ = *scan++;
+
+ *scan_result = 0;
+ return result;
+}
+
diff --git a/Build/source/utils/texinfo/lib/system.h b/Build/source/utils/texinfo/lib/system.h
new file mode 100644
index 00000000000..946eb3c8103
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/system.h
@@ -0,0 +1,291 @@
+/* system.h: system-dependent declarations; include this first.
+ $Id: system.h,v 1.12 2004/04/26 13:56:57 karl Exp $
+
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef TEXINFO_SYSTEM_H
+#define TEXINFO_SYSTEM_H
+
+#define _GNU_SOURCE
+
+#include <config.h>
+
+#ifdef MIKTEX
+#include <gnu-miktex.h>
+#define S_ISDIR(x) ((x)&_S_IFDIR)
+#else
+/* MiKTeX defines substring() in a separate DLL, where it has its
+ own __declspec declaration. We don't want to try to duplicate
+ this Microsoft-ism here. */
+extern char *substring (const char *, const char *);
+#endif
+
+/* We follow the order of header inclusion from Autoconf's
+ ac_includes_default, more or less. */
+#include <stdio.h>
+#include <sys/types.h>
+#include <ctype.h>
+
+/* All systems nowadays probably have these functions, but ... */
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#ifndef HAVE_SETLOCALE
+#define setlocale(category,locale) /* empty */
+#endif
+
+/* For gettext (NLS). */
+#define const
+#include "gettext.h"
+#undef const
+
+#define _(String) gettext (String)
+#define N_(String) (String)
+
+#ifdef STDC_HEADERS
+#define getopt system_getopt
+#include <stdlib.h>
+#undef getopt
+#else
+extern char *getenv ();
+#endif
+
+/* Don't use bcopy! Use memmove if source and destination may overlap,
+ memcpy otherwise. */
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+
+#if HAVE_STRINGS_H
+/* Always include <strings.h> if we have it. This is because that's
+ what Autoconf's AC_CHECK_DECL does. On IBM AIX 4.2, strncasecmp is
+ only declared in strings.h. */
+# include <strings.h>
+#endif
+
+#if !HAVE_STRNCASECMP || !HAVE_STRCASECMP
+# include "strcase.h"
+#endif
+
+#if !HAVE_DECL_MEMCHR
+char *memchr ();
+#endif
+
+/* <unistd.h> defines _POSIX_VERSION, but Paul Eggert points out that is
+ only supposed to be used in user code, not other system headers. */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifdef VMS
+#include <perror.h>
+#endif
+
+#ifndef HAVE_DECL_STRERROR
+extern char *strerror ();
+#endif
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#ifndef PATH_MAX
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+#define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+#ifndef HAVE_DECL_STRCASECMP
+extern int strcasecmp ();
+#endif
+
+#ifndef HAVE_DECL_STRNCASECMP
+extern int strncasecmp ();
+#endif
+
+#ifndef HAVE_DECL_STRCOLL
+extern int strcoll ();
+#endif
+
+#include <sys/stat.h>
+#if STAT_MACROS_BROKEN
+# undef S_ISDIR
+#endif
+#if !defined(S_ISDIR) && defined(S_IFDIR)
+# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+
+#ifdef HAVE_SYS_FILE_H
+#include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#ifndef O_RDONLY
+/* Since <fcntl.h> is POSIX, prefer that to <sys/fcntl.h>.
+ This also avoids some useless warnings on (at least) Linux. */
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else /* not HAVE_FCNTL_H */
+#ifdef HAVE_SYS_FCNTL_H
+#include <sys/fcntl.h>
+#endif /* not HAVE_SYS_FCNTL_H */
+#endif /* not HAVE_FCNTL_H */
+#endif /* not O_RDONLY */
+
+/* MS-DOS and similar non-Posix systems have some peculiarities:
+ - they distinguish between binary and text files;
+ - they use both `/' and `\\' as directory separator in file names;
+ - they can have a drive letter X: prepended to a file name;
+ - they have a separate root directory on each drive;
+ - their filesystems are case-insensitive;
+ - directories in environment variables (like INFOPATH) are separated
+ by `;' rather than `:';
+ - text files can have their lines ended either with \n or with \r\n pairs;
+ These are all parameterized here except the last, which is
+ handled by the source code as appropriate (mostly, in info/). */
+#ifndef O_BINARY
+# ifdef _O_BINARY
+# define O_BINARY _O_BINARY
+# else
+# define O_BINARY 0
+# endif
+#endif /* O_BINARY */
+
+/* We'd like to take advantage of _doprnt if it's around, a la error.c,
+ but then we'd have no VA_SPRINTF. */
+#if HAVE_VPRINTF
+# if __STDC__
+# include <stdarg.h>
+# define VA_START(args, lastarg) va_start(args, lastarg)
+# else
+# include <varargs.h>
+# define VA_START(args, lastarg) va_start(args)
+# endif
+# define VA_FPRINTF(file, fmt, ap) vfprintf (file, fmt, ap)
+# define VA_SPRINTF(str, fmt, ap) vsprintf (str, fmt, ap)
+#else /* not HAVE_VPRINTF */
+# define VA_START(args, lastarg)
+# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
+# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
+# define va_end(args)
+#endif
+
+#if O_BINARY
+# ifdef HAVE_IO_H
+# include <io.h>
+# endif
+# ifdef __MSDOS__
+# include <limits.h>
+# ifdef __DJGPP__
+# define HAVE_LONG_FILENAMES(dir) (pathconf (dir, _PC_NAME_MAX) > 12)
+# define NULL_DEVICE "/dev/null"
+# define DEFAULT_INFOPATH "c:/djgpp/info;/usr/local/info;/usr/info;."
+ /* DJGPP supports /dev/null, which is okay for Unix aficionados,
+ shell scripts and Makefiles, but interactive DOS die-hards
+ would probably want to have NUL as well. */
+# define ALSO_NULL_DEVICE "NUL"
+# else /* O_BINARY && !__DJGPP__ */
+# define HAVE_LONG_FILENAMES(dir) (0)
+# define NULL_DEVICE "NUL"
+# endif /* O_BINARY && !__DJGPP__ */
+# define SET_SCREEN_SIZE_HELPER terminal_prep_terminal()
+# define DEFAULT_INFO_PRINT_COMMAND ">PRN"
+# else /* O_BINARY && !__MSDOS__ */
+# define setmode(f,m) _setmode(f,m)
+# define HAVE_LONG_FILENAMES(dir) (1)
+# define NULL_DEVICE "NUL"
+# endif /* O_BINARY && !__MSDOS__ */
+# ifdef __CYGWIN__
+# define DEFAULT_TMPDIR "/tmp/"
+# define PATH_SEP ":"
+# else /* O_BINARY && !__CYGWIN__ */
+# define DEFAULT_TMPDIR "c:/"
+# define PATH_SEP ";"
+# endif /* O_BINARY && !__CYGWIN__ */
+ /* Back to any O_BINARY system. */
+# define FILENAME_CMP strcasecmp
+# define FILENAME_CMPN strncasecmp
+# define FOPEN_RBIN "rb"
+# define FOPEN_WBIN "wb"
+# define HAVE_DRIVE(n) ((n)[0] && (n)[1] == ':')
+# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
+# define IS_ABSOLUTE(n) (IS_SLASH((n)[0]) || ((n)[0] && (n)[1] == ':'))
+# define PIPE_USE_FORK 0
+# define SET_BINARY(f) do {if (!isatty(f)) setmode(f,O_BINARY);} while(0)
+# define STRIP_DOT_EXE 1
+
+#else /* not O_BINARY, i.e., Unix */
+# define SET_BINARY(f) (void)0
+# define FOPEN_RBIN "r"
+# define FOPEN_WBIN "w"
+# define IS_SLASH(c) ((c) == '/')
+# define HAVE_DRIVE(n) (0)
+# define IS_ABSOLUTE(n) ((n)[0] == '/')
+# define FILENAME_CMP strcmp
+# define FILENAME_CMPN strncmp
+# define HAVE_LONG_FILENAMES(dir) (1)
+# define PATH_SEP ":"
+# define STRIP_DOT_EXE 0
+# ifdef VMS
+# define DEFAULT_TMPDIR "sys$scratch:"
+# else
+# define DEFAULT_TMPDIR "/tmp/"
+# endif
+# define NULL_DEVICE "/dev/null"
+# define PIPE_USE_FORK 1
+#endif /* not O_BINARY */
+
+/* Everything but DJGPP. */
+#ifndef ALSO_NULL_DEVICE
+# define ALSO_NULL_DEVICE ""
+#endif
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+/* Some systems don't declare this function in pwd.h. */
+struct passwd *getpwnam (const char *name);
+
+/* Our library routines not included in any system library. */
+extern void *xmalloc (size_t), *xrealloc (void *, size_t);
+extern char *xstrdup (const char *);
+extern void xexit (int);
+
+/* For convenience. */
+#define STREQ(s1,s2) (strcmp (s1, s2) == 0)
+#define STRCASEEQ(s1,s2) (strcasecmp (s1, s2) == 0)
+#define STRNCASEEQ(s1,s2,n) (strncasecmp (s1, s2, n) == 0)
+
+/* We don't need anything fancy. If we did need something fancy, gnulib
+ has it. */
+#ifdef MIN
+#undef MIN
+#endif
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#ifdef MAX
+#undef MAX
+#endif
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+
+#endif /* TEXINFO_SYSTEM_H */
diff --git a/Build/source/utils/texinfo/lib/tempname.c b/Build/source/utils/texinfo/lib/tempname.c
new file mode 100644
index 00000000000..b3d0874ce99
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/tempname.c
@@ -0,0 +1,344 @@
+/* tempname.c - generate the name of a temporary file.
+
+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <assert.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# define P_tmpdir "/tmp"
+#endif
+#ifndef TMP_MAX
+# define TMP_MAX 238328
+#endif
+#ifndef __GT_FILE
+# define __GT_FILE 0
+# define __GT_BIGFILE 1
+# define __GT_DIR 2
+# define __GT_NOCREATE 3
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_FCNTL_H || _LIBC
+# include <fcntl.h>
+#endif
+
+#if HAVE_SYS_TIME_H || _LIBC
+# include <sys/time.h>
+#endif
+
+#if HAVE_STDINT_H || _LIBC
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#if HAVE_UNISTD_H || _LIBC
+# include <unistd.h>
+#endif
+
+#include <sys/stat.h>
+#if STAT_MACROS_BROKEN
+# undef S_ISDIR
+#endif
+#if !defined S_ISDIR && defined S_IFDIR
+# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+#if !S_IRUSR && S_IREAD
+# define S_IRUSR S_IREAD
+#endif
+#if !S_IRUSR
+# define S_IRUSR 00400
+#endif
+#if !S_IWUSR && S_IWRITE
+# define S_IWUSR S_IWRITE
+#endif
+#if !S_IWUSR
+# define S_IWUSR 00200
+#endif
+#if !S_IXUSR && S_IEXEC
+# define S_IXUSR S_IEXEC
+#endif
+#if !S_IXUSR
+# define S_IXUSR 00100
+#endif
+
+#if _LIBC
+# define struct_stat64 struct stat64
+#else
+# define struct_stat64 struct stat
+# define __getpid getpid
+# define __gettimeofday gettimeofday
+# define __mkdir mkdir
+# define __open open
+# define __open64 open
+# define __lxstat64(version, path, buf) lstat (path, buf)
+# define __xstat64(version, path, buf) stat (path, buf)
+#endif
+
+#if ! (HAVE___SECURE_GETENV || _LIBC)
+# define __secure_getenv getenv
+#endif
+
+#ifdef _LIBC
+# include <hp-timing.h>
+# if HP_TIMING_AVAIL
+# define RANDOM_BITS(Var) \
+ if (__builtin_expect (value == UINT64_C (0), 0)) \
+ { \
+ /* If this is the first time this function is used initialize \
+ the variable we accumulate the value in to some somewhat \
+ random value. If we'd not do this programs at startup time \
+ might have a reduced set of possible names, at least on slow \
+ machines. */ \
+ struct timeval tv; \
+ __gettimeofday (&tv, NULL); \
+ value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \
+ } \
+ HP_TIMING_NOW (Var)
+# endif
+#endif
+
+/* Use the widest available unsigned type if uint64_t is not
+ available. The algorithm below extracts a number less than 62**6
+ (approximately 2**35.725) from uint64_t, so ancient hosts where
+ uintmax_t is only 32 bits lose about 3.725 bits of randomness,
+ which is better than not having mkstemp at all. */
+#if !defined UINT64_MAX && !defined uint64_t
+# define uint64_t uintmax_t
+#endif
+
+/* Return nonzero if DIR is an existent directory. */
+static int
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ int try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+ while (dlen > 1 && dir[dlen - 1] == '/')
+ dlen--; /* remove trailing slashes */
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + 1 + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
+ return 0;
+}
+
+/* These are the characters used in temporary filenames. */
+static const char letters[] =
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
+ does not exist at the time of the call to __gen_tempname. TMPL is
+ overwritten with the result.
+
+ KIND may be one of:
+ __GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ __GT_FILE: create the file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ __GT_BIGFILE: same as __GT_FILE but use open64().
+ __GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+int
+__gen_tempname (char *tmpl, int kind)
+{
+ int len;
+ char *XXXXXX;
+ static uint64_t value;
+ uint64_t random_time_bits;
+ unsigned int count;
+ int fd = -1;
+ int save_errno = errno;
+ struct_stat64 st;
+
+ /* A lower bound on the number of temporary files to attempt to
+ generate. The maximum total number of temporary file names that
+ can exist for a given template is 62**6. It should never be
+ necessary to try all these combinations. Instead if a reasonable
+ number of names is tried (we define reasonable as 62**3) fail to
+ give the system administrator the chance to remove the problems. */
+ unsigned int attempts_min = 62 * 62 * 62;
+
+ /* The number of times to attempt to generate a temporary file. To
+ conform to POSIX, this must be no smaller than TMP_MAX. */
+ unsigned int attempts = attempts_min < TMP_MAX ? TMP_MAX : attempts_min;
+
+ len = strlen (tmpl);
+ if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ /* This is where the Xs start. */
+ XXXXXX = &tmpl[len - 6];
+
+ /* Get some more or less random data. */
+#ifdef RANDOM_BITS
+ RANDOM_BITS (random_time_bits);
+#else
+# if HAVE_GETTIMEOFDAY || _LIBC
+ {
+ struct timeval tv;
+ __gettimeofday (&tv, NULL);
+ random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
+ }
+# else
+ random_time_bits = time (NULL);
+# endif
+#endif
+ value += random_time_bits ^ __getpid ();
+
+ for (count = 0; count < attempts; value += 7777, ++count)
+ {
+ uint64_t v = value;
+
+ /* Fill in the random bits. */
+ XXXXXX[0] = letters[v % 62];
+ v /= 62;
+ XXXXXX[1] = letters[v % 62];
+ v /= 62;
+ XXXXXX[2] = letters[v % 62];
+ v /= 62;
+ XXXXXX[3] = letters[v % 62];
+ v /= 62;
+ XXXXXX[4] = letters[v % 62];
+ v /= 62;
+ XXXXXX[5] = letters[v % 62];
+
+ switch (kind)
+ {
+ case __GT_FILE:
+ fd = __open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ break;
+
+ case __GT_BIGFILE:
+ fd = __open64 (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ break;
+
+ case __GT_DIR:
+ fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
+ break;
+
+ case __GT_NOCREATE:
+ /* This case is backward from the other three. __gen_tempname
+ succeeds if __xstat fails because the name does not exist.
+ Note the continue to bypass the common logic at the bottom
+ of the loop. */
+ if (__lxstat64 (_STAT_VER, tmpl, &st) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ __set_errno (save_errno);
+ return 0;
+ }
+ else
+ /* Give up now. */
+ return -1;
+ }
+ continue;
+
+ default:
+ assert (! "invalid KIND in __gen_tempname");
+ }
+
+ if (fd >= 0)
+ {
+ __set_errno (save_errno);
+ return fd;
+ }
+ else if (errno != EEXIST)
+ return -1;
+ }
+
+ /* We got out of the loop because we ran out of combinations to try. */
+ __set_errno (EEXIST);
+ return -1;
+}
diff --git a/Build/source/utils/texinfo/lib/win32.mak b/Build/source/utils/texinfo/lib/win32.mak
new file mode 100644
index 00000000000..61f6a755252
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/win32.mak
@@ -0,0 +1,46 @@
+################################################################################
+#
+# Makefile : TeXInfo/libtxi
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <02/01/20 18:19:01 popineau>
+#
+################################################################################
+root_srcdir = ..\..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+DEFS = -I.. -DHAVE_CONFIG_H $(DEFS)
+objects = $(objdir)\substring.obj $(objdir)\xexit.obj
+
+default: all
+
+all: $(objdir) $(objdir)\libtxi.lib
+
+$(objdir)\libtxi.lib: $(objdir) $(objects)
+ $(archive) $(objects)
+
+..\config.h: ..\config.in
+ pushd .. & $(make) config.h & popd
+
+!include <msvc/install.mak>
+
+!include <msvc/clean.mak>
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/texinfo/lib/xalloc.h b/Build/source/utils/texinfo/lib/xalloc.h
new file mode 100644
index 00000000000..d81f2a67648
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/xalloc.h
@@ -0,0 +1,90 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef XALLOC_H_
+# define XALLOC_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+# ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
+# define __attribute__(x)
+# endif
+# endif
+
+# ifndef ATTRIBUTE_NORETURN
+# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+# endif
+
+/* This function is always triggered when memory is exhausted.
+ It must be defined by the application, either explicitly
+ or by using gnulib's xalloc-die module. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+extern void xalloc_die (void) ATTRIBUTE_NORETURN;
+
+void *xmalloc (size_t s);
+void *xnmalloc (size_t n, size_t s);
+void *xzalloc (size_t s);
+void *xcalloc (size_t n, size_t s);
+void *xrealloc (void *p, size_t s);
+void *xnrealloc (void *p, size_t n, size_t s);
+void *x2realloc (void *p, size_t *pn);
+void *x2nrealloc (void *p, size_t *pn, size_t s);
+void *xclone (void const *p, size_t s);
+char *xstrdup (const char *str);
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N.
+
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative dividend to use here is
+ SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+ However, malloc (SIZE_MAX) fails on all known hosts where
+ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+ exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+ branch when S is known to be 1. */
+# define xalloc_oversized(n, s) \
+ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+/* These macros are deprecated; they will go away soon, and are retained
+ temporarily only to ease conversion to the functions described above. */
+# define CCLONE(p, n) xclone (p, (n) * sizeof *(p))
+# define CLONE(p) xclone (p, sizeof *(p))
+# define NEW(type, var) type *var = xmalloc (sizeof (type))
+# define XCALLOC(type, n) xcalloc (n, sizeof (type))
+# define XMALLOC(type, n) xnmalloc (n, sizeof (type))
+# define XREALLOC(p, type, n) xnrealloc (p, n, sizeof (type))
+# define XFREE(p) free (p)
+
+
+# ifdef __cplusplus
+}
+# endif
+
+
+#endif /* !XALLOC_H_ */
diff --git a/Build/source/utils/texinfo/lib/xexit.c b/Build/source/utils/texinfo/lib/xexit.c
new file mode 100644
index 00000000000..53eb0fc1d66
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/xexit.c
@@ -0,0 +1,87 @@
+/* xexit.c -- exit with attention to return values and closing stdout.
+ $Id: xexit.c,v 1.5 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1999, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+
+/* SunOS 4.1.1 gets STDC_HEADERS defined, but it doesn't provide
+ EXIT_FAILURE. So far no system has defined one of EXIT_FAILURE and
+ EXIT_SUCCESS without the other. */
+#ifdef EXIT_SUCCESS
+ /* The following test is to work around the gross typo in
+ systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
+ is defined to 0, not 1. */
+# if !EXIT_FAILURE
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+# endif
+#else /* not EXIT_SUCCESS */
+# ifdef VMS /* these values suppress some messages; from gnuplot */
+# define EXIT_SUCCESS 1
+# define EXIT_FAILURE 0x10000002
+# else /* not VMS */
+# define EXIT_SUCCESS 0
+# define EXIT_FAILURE 1
+# endif /* not VMS */
+#endif /* not EXIT_SUCCESS */
+
+
+/* Flush stdout first, exit if failure (therefore, xexit should be
+ called to exit every program, not just `return' from main).
+ Otherwise, if EXIT_STATUS is zero, exit successfully, else
+ unsuccessfully. */
+
+void
+xexit (int exit_status)
+{
+ if (ferror (stdout))
+ {
+ fputs (_("ferror on stdout\n"), stderr);
+ exit_status = 1;
+ }
+ else if (fflush (stdout) != 0)
+ {
+ fputs (_("fflush error on stdout\n"), stderr);
+ exit_status = 1;
+ }
+
+ exit_status = exit_status == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+
+ exit (exit_status);
+}
+
+
+/* Why do we care about stdout you may ask? Here's why, from Jim
+ Meyering in the lib/closeout.c file. */
+
+/* If a program writes *anything* to stdout, that program should close
+ stdout and make sure that the close succeeds. Otherwise, suppose that
+ you go to the extreme of checking the return status of every function
+ that does an explicit write to stdout. The last printf can succeed in
+ writing to the internal stream buffer, and yet the fclose(stdout) could
+ still fail (due e.g., to a disk full error) when it tries to write
+ out that buffered data. Thus, you would be left with an incomplete
+ output file and the offending program would exit successfully.
+
+ Besides, it's wasteful to check the return value from every call
+ that writes to stdout -- just let the internal stream state record
+ the failure. That's what the ferror test is checking below.
+
+ It's important to detect such failures and exit nonzero because many
+ tools (most notably `make' and other build-management systems) depend
+ on being able to detect failure in other tools via their exit status. */
diff --git a/Build/source/utils/texinfo/lib/xmalloc.c b/Build/source/utils/texinfo/lib/xmalloc.c
new file mode 100644
index 00000000000..b91e4fce633
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/xmalloc.c
@@ -0,0 +1,61 @@
+/* xmalloc.c -- safe versions of malloc and realloc.
+
+ Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#if !defined (ALREADY_HAVE_XMALLOC)
+#include "system.h"
+
+static void
+memory_error_and_abort (const char *fname)
+{
+ fprintf (stderr, "%s: Out of virtual memory!\n", fname);
+ abort ();
+}
+
+/* Return a pointer to free()able block of memory large enough
+ to hold BYTES number of bytes. If the memory cannot be allocated,
+ print an error message and abort. */
+void *
+xmalloc (size_t bytes)
+{
+ void *temp = malloc (bytes);
+
+ if (!temp)
+ memory_error_and_abort ("xmalloc");
+ return (temp);
+}
+
+void *
+xrealloc (void *pointer, size_t bytes)
+{
+ void *temp;
+
+ if (!pointer)
+ temp = malloc (bytes);
+ else
+ temp = realloc (pointer, bytes);
+
+ if (!temp)
+ memory_error_and_abort ("xrealloc");
+
+ return (temp);
+}
+
+#endif /* !ALREADY_HAVE_XMALLOC */
diff --git a/Build/source/utils/texinfo/lib/xstrdup.c b/Build/source/utils/texinfo/lib/xstrdup.c
new file mode 100644
index 00000000000..1182c592ac5
--- /dev/null
+++ b/Build/source/utils/texinfo/lib/xstrdup.c
@@ -0,0 +1,33 @@
+/* xstrdup.c -- copy a string with out of memory checking
+ Copyright (C) 1990, 1996, 1998, 2001, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "xalloc.h"
+
+#include <string.h>
+
+/* Return a newly allocated copy of STRING. */
+
+char *
+xstrdup (const char *string)
+{
+ return strcpy (xmalloc (strlen (string) + 1), string);
+}
diff --git a/Build/source/utils/texinfo/m4/ChangeLog b/Build/source/utils/texinfo/m4/ChangeLog
new file mode 100644
index 00000000000..c0397848413
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/ChangeLog
@@ -0,0 +1,51 @@
+2004-02-05 gettextize <bug-gnu-gettext@gnu.org>
+
+ * po.m4: Upgrade to gettext-0.14.1.
+
+2003-12-20 gettextize <bug-gnu-gettext@gnu.org>
+
+ * printf-posix.m4: Upgrade to gettext-0.13.1.
+
+2003-12-13 gettextize <bug-gnu-gettext@gnu.org>
+
+ * intmax.m4: New file, from gettext-0.13.
+ * longdouble.m4: New file, from gettext-0.13.
+ * longlong.m4: New file, from gettext-0.13.
+ * printf-posix.m4: New file, from gettext-0.13.
+ * signed.m4: New file, from gettext-0.13.
+ * size_max.m4: New file, from gettext-0.13.
+ * wchar_t.m4: New file, from gettext-0.13.
+ * wint_t.m4: New file, from gettext-0.13.
+ * xsize.m4: New file, from gettext-0.13.
+ * Makefile.am (EXTRA_DIST): Add the new files.
+
+2003-05-29 gettextize <bug-gnu-gettext@gnu.org>
+
+ * gettext.m4: Upgrade to gettext-0.12.1.
+ * inttypes_h.m4: Upgrade to gettext-0.12.1.
+ * lib-ld.m4: Upgrade to gettext-0.12.1.
+ * lib-link.m4: Upgrade to gettext-0.12.1.
+ * lib-prefix.m4: Upgrade to gettext-0.12.1.
+ * nls.m4: New file, from gettext-0.12.1.
+ * po.m4: New file, from gettext-0.12.1.
+ * progtest.m4: Upgrade to gettext-0.12.1.
+ * stdint_h.m4: Upgrade to gettext-0.12.1.
+ * uintmax_t.m4: Upgrade to gettext-0.12.1.
+ * ulonglong.m4: Upgrade to gettext-0.12.1.
+ * Makefile.am (EXTRA_DIST): Add the new files.
+
+2002-09-20 gettextize <bug-gnu-gettext@gnu.org>
+
+ * gettext.m4: Upgrade to gettext-0.11.5.
+ * iconv.m4: Upgrade to gettext-0.11.5.
+ * intdiv0.m4: New file, from gettext-0.11.5.
+ * inttypes.m4: New file, from gettext-0.11.5.
+ * inttypes_h.m4: New file, from gettext-0.11.5.
+ * inttypes-pri.m4: New file, from gettext-0.11.5.
+ * isc-posix.m4: Upgrade to gettext-0.11.5.
+ * lcmessage.m4: Upgrade to gettext-0.11.5.
+ * lib-link.m4: Upgrade to gettext-0.11.5.
+ * stdint_h.m4: New file, from gettext-0.11.5.
+ * uintmax_t.m4: New file, from gettext-0.11.5.
+ * ulonglong.m4: New file, from gettext-0.11.5.
+ * Makefile.am (EXTRA_DIST): Add the new files.
diff --git a/Build/source/utils/texinfo/m4/Makefile.am b/Build/source/utils/texinfo/m4/Makefile.am
new file mode 100644
index 00000000000..0ace7ea70bf
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/Makefile.am
@@ -0,0 +1,24 @@
+EXTRA_DIST = intmax.m4 longdouble.m4 longlong.m4 printf-posix.m4 signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 nls.m4 po.m4 \
+ check-decl.m4 \
+ codeset.m4 \
+ gettext.m4 \
+ glibc21.m4 \
+ iconv.m4 \
+ intdiv0.m4 \
+ inttypes-pri.m4 \
+ inttypes.m4 \
+ inttypes_h.m4 \
+ isc-posix.m4 \
+ lcmessage.m4 \
+ lib-ld.m4 \
+ lib-link.m4 \
+ lib-prefix.m4 \
+ mkstemp.m4 \
+ onceonly.m4 \
+ onceonly_2_57.m4 \
+ prereq.m4 \
+ progtest.m4 \
+ stdint_h.m4 \
+ strcase.m4 \
+ uintmax_t.m4 \
+ ulonglong.m4
diff --git a/Build/source/utils/texinfo/m4/Makefile.in b/Build/source/utils/texinfo/m4/Makefile.in
new file mode 100644
index 00000000000..ac7e83ddd54
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/Makefile.in
@@ -0,0 +1,360 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = intmax.m4 longdouble.m4 longlong.m4 printf-posix.m4 signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 nls.m4 po.m4 \
+ check-decl.m4 \
+ codeset.m4 \
+ gettext.m4 \
+ glibc21.m4 \
+ iconv.m4 \
+ intdiv0.m4 \
+ inttypes-pri.m4 \
+ inttypes.m4 \
+ inttypes_h.m4 \
+ isc-posix.m4 \
+ lcmessage.m4 \
+ lib-ld.m4 \
+ lib-link.m4 \
+ lib-prefix.m4 \
+ mkstemp.m4 \
+ onceonly.m4 \
+ onceonly_2_57.m4 \
+ prereq.m4 \
+ progtest.m4 \
+ stdint_h.m4 \
+ strcase.m4 \
+ uintmax_t.m4 \
+ ulonglong.m4
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/m4/check-decl.m4 b/Build/source/utils/texinfo/m4/check-decl.m4
new file mode 100644
index 00000000000..d70e1c90f8d
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/check-decl.m4
@@ -0,0 +1,75 @@
+#serial 20
+
+dnl This is just a wrapper function to encapsulate this kludge.
+dnl Putting it in a separate file like this helps share it between
+dnl different packages.
+AC_DEFUN([gl_CHECK_DECLS],
+[
+ AC_REQUIRE([_gl_DECL_HEADERS])
+ AC_REQUIRE([AC_HEADER_TIME])
+ headers='
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#if HAVE_UTMP_H
+# include <utmp.h>
+#endif
+
+#if HAVE_GRP_H
+# include <grp.h>
+#endif
+
+#if HAVE_PWD_H
+# include <pwd.h>
+#endif
+'
+
+ AC_CHECK_DECLS([
+ free,
+ getenv,
+ geteuid,
+ getgrgid,
+ getlogin,
+ getpwuid,
+ getuid,
+ getutent,
+ lseek,
+ malloc,
+ memchr,
+ memrchr,
+ nanosleep,
+ realloc,
+ stpcpy,
+ strndup,
+ strnlen,
+ strstr,
+ strtoul,
+ strtoull,
+ ttyname], , , $headers)
+])
+
+dnl FIXME: when autoconf has support for it.
+dnl This is a little helper so we can require these header checks.
+AC_DEFUN([_gl_DECL_HEADERS],
+[
+ AC_REQUIRE([AC_HEADER_STDC])
+ AC_CHECK_HEADERS(grp.h memory.h pwd.h string.h strings.h stdlib.h \
+ unistd.h sys/time.h utmp.h utmpx.h)
+])
diff --git a/Build/source/utils/texinfo/m4/codeset.m4 b/Build/source/utils/texinfo/m4/codeset.m4
new file mode 100644
index 00000000000..59535ebcff5
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/codeset.m4
@@ -0,0 +1,23 @@
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET);],
+ am_cv_langinfo_codeset=yes,
+ am_cv_langinfo_codeset=no)
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/gettext.m4 b/Build/source/utils/texinfo/m4/gettext.m4
new file mode 100644
index 00000000000..a9225d3771d
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/gettext.m4
@@ -0,0 +1,487 @@
+# gettext.m4 serial 29
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl default (if it is not specified or empty) is 'no-libtool'.
+dnl INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored. If NEEDSYMBOL is specified and is
+dnl 'need-formatstring-macros', then GNU gettext implementations that don't
+dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries. If empty,
+dnl the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+ [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+ ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+ [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+ define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+ define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+ ifelse(gt_included_intl, yes, [
+ AC_REQUIRE([AM_INTL_SUBDIR])dnl
+ ])
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ dnl Ideally we would do this search only after the
+ dnl if test "$USE_NLS" = "yes"; then
+ dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+ dnl the configure script would need to contain the same shell code
+ dnl again, outside any 'if'. There are two solutions:
+ dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+ dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+ dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+ dnl documented, we avoid it.
+ ifelse(gt_included_intl, yes, , [
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+ ])
+
+ dnl Set USE_NLS.
+ AM_NLS
+
+ ifelse(gt_included_intl, yes, [
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ ifelse(gt_included_intl, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH(included-gettext,
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+
+ dnl Add a version number to the cache macros.
+ define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1)))
+ define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+ define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+ [AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+ gt_cv_func_gnugettext_libc=yes,
+ gt_cv_func_gnugettext_libc=no)])
+
+ if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ ifelse(gt_included_intl, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ gt_cv_func_gnugettext_libintl,
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+ gt_cv_func_gnugettext_libintl=yes,
+ gt_cv_func_gnugettext_libintl=no)
+ dnl Now see whether libintl exists and depends on libiconv.
+ if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+ [LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ gt_cv_func_gnugettext_libintl=yes
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if test "$gt_cv_func_gnugettext_libc" = "yes" \
+ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+ LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ AC_MSG_CHECKING([whether to use NLS])
+ AC_MSG_RESULT([$USE_NLS])
+ if test "$USE_NLS" = "yes"; then
+ AC_MSG_CHECKING([where the gettext function comes from])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ AC_MSG_RESULT([$gt_source])
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
+
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE(HAVE_GETTEXT, 1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE(HAVE_DCGETTEXT, 1,
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(BUILD_INCLUDED_LIBINTL)
+ AC_SUBST(USE_INCLUDED_LIBINTL)
+ AC_SUBST(CATOBJEXT)
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST(DATADIRNAME)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST(INSTOBJEXT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST(GENCAT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ if test "$USE_INCLUDED_LIBINTL" = yes; then
+ INTLOBJS="\$(GETTOBJS)"
+ fi
+ AC_SUBST(INTLOBJS)
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+ AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+ ])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST(INTLLIBS)
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST(LIBINTL)
+ AC_SUBST(LTLIBINTL)
+ AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_ISC_POSIX])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_C_CONST])dnl
+ AC_REQUIRE([bh_C_SIGNED])dnl
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([gl_AC_TYPE_LONG_LONG])dnl
+ AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl
+ AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+ AC_REQUIRE([gt_TYPE_WINT_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([gt_TYPE_INTMAX_T])
+ AC_REQUIRE([gt_PRINTF_POSIX])
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([gl_GLIBC21])dnl
+ AC_REQUIRE([gt_INTDIV0])dnl
+ AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl
+ AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl
+ AC_REQUIRE([gt_INTTYPES_PRI])dnl
+ AC_REQUIRE([gl_XSIZE])dnl
+
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \
+mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \
+strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \
+__fsetlocking])
+
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ gt_CHECK_DECL(_snprintf, [#include <stdio.h>])
+ gt_CHECK_DECL(_snwprintf, [#include <stdio.h>])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>])
+
+ case $gt_cv_func_printf_posix in
+ *yes) HAVE_POSIX_PRINTF=1 ;;
+ *) HAVE_POSIX_PRINTF=0 ;;
+ esac
+ AC_SUBST([HAVE_POSIX_PRINTF])
+ if test "$ac_cv_func_asprintf" = yes; then
+ HAVE_ASPRINTF=1
+ else
+ HAVE_ASPRINTF=0
+ fi
+ AC_SUBST([HAVE_ASPRINTF])
+ if test "$ac_cv_func_snprintf" = yes; then
+ HAVE_SNPRINTF=1
+ else
+ HAVE_SNPRINTF=0
+ fi
+ AC_SUBST([HAVE_SNPRINTF])
+ if test "$ac_cv_func_wprintf" = yes; then
+ HAVE_WPRINTF=1
+ else
+ HAVE_WPRINTF=0
+ fi
+ AC_SUBST([HAVE_WPRINTF])
+
+ AM_ICONV
+ AM_LANGINFO_CODESET
+ if test $ac_cv_header_locale_h = yes; then
+ AM_LC_MESSAGES
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+])
+
+
+dnl gt_CHECK_DECL(FUNC, INCLUDES)
+dnl Check whether a function is declared.
+AC_DEFUN([gt_CHECK_DECL],
+[
+ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
+ [AC_TRY_COMPILE([$2], [
+#ifndef $1
+ char *p = (char *) $1;
+#endif
+], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
+ if test $ac_cv_have_decl_$1 = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
+ [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/Build/source/utils/texinfo/m4/glibc21.m4 b/Build/source/utils/texinfo/m4/glibc21.m4
new file mode 100644
index 00000000000..32ca2242e04
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/glibc21.m4
@@ -0,0 +1,32 @@
+# glibc21.m4 serial 3
+dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/Build/source/utils/texinfo/m4/iconv.m4 b/Build/source/utils/texinfo/m4/iconv.m4
new file mode 100644
index 00000000000..c5f3579827e
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/iconv.m4
@@ -0,0 +1,103 @@
+# iconv.m4 serial AM4 (gettext-0.11.3)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_func_iconv=yes)
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes)
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST(LIBICONV)
+ AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL(am_cv_proto_iconv, [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([$]{ac_t:-
+ }[$]am_cv_proto_iconv)
+ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/intdiv0.m4 b/Build/source/utils/texinfo/m4/intdiv0.m4
new file mode 100644
index 00000000000..55dddcf1c24
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/intdiv0.m4
@@ -0,0 +1,72 @@
+# intdiv0.m4 serial 1 (gettext-0.11.3)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+ AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+ gt_cv_int_divbyzero_sigfpe,
+ [
+ AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+ /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
+ exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+ signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+ signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL. */
+#if defined (__sparc__) && defined (__linux__)
+ signal (SIGILL, sigfpe_handler);
+#endif
+
+ z = x / y;
+ nan = y / y;
+ exit (1);
+}
+], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
+ [
+ # Guess based on the CPU.
+ case "$host_cpu" in
+ alpha* | i[34567]86 | m68k | s390*)
+ gt_cv_int_divbyzero_sigfpe="guessing yes";;
+ *)
+ gt_cv_int_divbyzero_sigfpe="guessing no";;
+ esac
+ ])
+ ])
+ case "$gt_cv_int_divbyzero_sigfpe" in
+ *yes) value=1;;
+ *) value=0;;
+ esac
+ AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
+ [Define if integer division by zero raises signal SIGFPE.])
+])
diff --git a/Build/source/utils/texinfo/m4/intmax.m4 b/Build/source/utils/texinfo/m4/intmax.m4
new file mode 100644
index 00000000000..80f6526c6d4
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/intmax.m4
@@ -0,0 +1,32 @@
+# intmax.m4 serial 2
+dnl Copyright (C) 2002-2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE(HAVE_INTMAX_T, 1,
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/inttypes-pri.m4 b/Build/source/utils/texinfo/m4/inttypes-pri.m4
new file mode 100644
index 00000000000..fd007c31289
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/inttypes-pri.m4
@@ -0,0 +1,32 @@
+# inttypes-pri.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values. This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+ AC_REQUIRE([gt_HEADER_INTTYPES_H])
+ if test $gt_cv_header_inttypes_h = yes; then
+ AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+ gt_cv_inttypes_pri_broken,
+ [
+ AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+ ])
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+ AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+ [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/inttypes.m4 b/Build/source/utils/texinfo/m4/inttypes.m4
new file mode 100644
index 00000000000..ab370ffe005
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/inttypes.m4
@@ -0,0 +1,27 @@
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+ [
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+ ])
+ if test $gt_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+ [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/inttypes_h.m4 b/Build/source/utils/texinfo/m4/inttypes_h.m4
new file mode 100644
index 00000000000..79bba8763e1
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/inttypes_h.m4
@@ -0,0 +1,28 @@
+# inttypes_h.m4 serial 6
+dnl Copyright (C) 1997-2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [uintmax_t i = (uintmax_t) -1;],
+ gl_cv_header_inttypes_h=yes,
+ gl_cv_header_inttypes_h=no)])
+ if test $gl_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/isc-posix.m4 b/Build/source/utils/texinfo/m4/isc-posix.m4
new file mode 100644
index 00000000000..1319dd1c70a
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/isc-posix.m4
@@ -0,0 +1,26 @@
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This file is not needed with autoconf-2.53 and newer. Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it. Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+ [
+ dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+ AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+ ]
+)
diff --git a/Build/source/utils/texinfo/m4/lcmessage.m4 b/Build/source/utils/texinfo/m4/lcmessage.m4
new file mode 100644
index 00000000000..ffd4008b825
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/lcmessage.m4
@@ -0,0 +1,32 @@
+# lcmessage.m4 serial 3 (gettext-0.11.3)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+[
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/lib-ld.m4 b/Build/source/utils/texinfo/m4/lib-ld.m4
new file mode 100644
index 00000000000..38aeaec19f2
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/lib-ld.m4
@@ -0,0 +1,112 @@
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break ;;
+ *)
+ test "$with_gnu_ld" != yes && break ;;
+ esac
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/Build/source/utils/texinfo/m4/lib-link.m4 b/Build/source/utils/texinfo/m4/lib-link.m4
new file mode 100644
index 00000000000..eeb200d266d
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/lib-link.m4
@@ -0,0 +1,551 @@
+# lib-link.m4 serial 4 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE(rpath,
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib$1-prefix],
+[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
+ --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
diff --git a/Build/source/utils/texinfo/m4/lib-prefix.m4 b/Build/source/utils/texinfo/m4/lib-prefix.m4
new file mode 100644
index 00000000000..8aff5a9d206
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/lib-prefix.m4
@@ -0,0 +1,155 @@
+# lib-prefix.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
diff --git a/Build/source/utils/texinfo/m4/longdouble.m4 b/Build/source/utils/texinfo/m4/longdouble.m4
new file mode 100644
index 00000000000..1333d2f5707
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/longdouble.m4
@@ -0,0 +1,30 @@
+# longdouble.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the compiler supports the 'long double' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_LONGDOUBLE],
+[
+ AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
+ [if test "$GCC" = yes; then
+ gt_cv_c_long_double=yes
+ else
+ AC_TRY_COMPILE([
+ /* The Stardent Vistra knows sizeof(long double), but does not support it. */
+ long double foo = 0.0;
+ /* On Ultrix 4.3 cc, long double is 4 and double is 8. */
+ int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+ ], ,
+ gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
+ fi])
+ if test $gt_cv_c_long_double = yes; then
+ AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/longlong.m4 b/Build/source/utils/texinfo/m4/longlong.m4
new file mode 100644
index 00000000000..028422b6121
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/longlong.m4
@@ -0,0 +1,25 @@
+# longlong.m4 serial 5
+dnl Copyright (C) 1999-2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG if 'long long' works.
+
+AC_DEFUN([gl_AC_TYPE_LONG_LONG],
+[
+ AC_CACHE_CHECK([for long long], ac_cv_type_long_long,
+ [AC_TRY_LINK([long long ll = 1LL; int i = 63;],
+ [long long llmax = (long long) -1;
+ return ll << i | ll >> i | llmax / ll | llmax % ll;],
+ ac_cv_type_long_long=yes,
+ ac_cv_type_long_long=no)])
+ if test $ac_cv_type_long_long = yes; then
+ AC_DEFINE(HAVE_LONG_LONG, 1,
+ [Define if you have the 'long long' type.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/mkstemp.m4 b/Build/source/utils/texinfo/m4/mkstemp.m4
new file mode 100644
index 00000000000..82e1ce5853b
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/mkstemp.m4
@@ -0,0 +1,66 @@
+#serial 6
+
+# On some hosts (e.g., HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a
+# silly limit that it can create no more than 26 files from a given template.
+# Other systems lack mkstemp altogether.
+# On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create
+# only 32 files per process.
+# On systems like the above, arrange to use the replacement function.
+AC_DEFUN([gl_FUNC_MKSTEMP],
+[dnl
+ AC_REPLACE_FUNCS(mkstemp)
+ if test $ac_cv_func_mkstemp = no; then
+ gl_cv_func_mkstemp_limitations=yes
+ else
+ AC_CACHE_CHECK([for mkstemp limitations],
+ gl_cv_func_mkstemp_limitations,
+ [
+ AC_TRY_RUN([
+# include <stdlib.h>
+ int main ()
+ {
+ int i;
+ for (i = 0; i < 70; i++)
+ {
+ char template[] = "conftestXXXXXX";
+ int fd = mkstemp (template);
+ if (fd == -1)
+ exit (1);
+ close (fd);
+ }
+ exit (0);
+ }
+ ],
+ gl_cv_func_mkstemp_limitations=no,
+ gl_cv_func_mkstemp_limitations=yes,
+ gl_cv_func_mkstemp_limitations=yes
+ )
+ ]
+ )
+ fi
+
+ if test $gl_cv_func_mkstemp_limitations = yes; then
+ AC_LIBOBJ(mkstemp)
+ AC_LIBOBJ(tempname)
+ AC_DEFINE(mkstemp, rpl_mkstemp,
+ [Define to rpl_mkstemp if the replacement function should be used.])
+ gl_PREREQ_MKSTEMP
+ gl_PREREQ_TEMPNAME
+ fi
+])
+
+# Prerequisites of lib/mkstemp.c.
+AC_DEFUN([gl_PREREQ_MKSTEMP],
+[
+])
+
+# Prerequisites of lib/tempname.c.
+AC_DEFUN([gl_PREREQ_TEMPNAME],
+[
+ AC_REQUIRE([AC_HEADER_STAT])
+ AC_CHECK_HEADERS_ONCE(fcntl.h sys/time.h unistd.h)
+ AC_CHECK_HEADERS(stdint.h)
+ AC_CHECK_FUNCS(__secure_getenv gettimeofday)
+ AC_CHECK_DECLS_ONCE(getenv)
+ AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])
+])
diff --git a/Build/source/utils/texinfo/m4/nls.m4 b/Build/source/utils/texinfo/m4/nls.m4
new file mode 100644
index 00000000000..36bc49317c1
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/nls.m4
@@ -0,0 +1,49 @@
+# nls.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_DEFUN([AM_NLS],
+[
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE(nls,
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT($USE_NLS)
+ AC_SUBST(USE_NLS)
+])
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+ dnl Try to locate it.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ case "$ac_aux_dir" in
+ /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+ *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+ esac
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+])
diff --git a/Build/source/utils/texinfo/m4/onceonly.m4 b/Build/source/utils/texinfo/m4/onceonly.m4
new file mode 100644
index 00000000000..f6fec37cbf2
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/onceonly.m4
@@ -0,0 +1,63 @@
+# onceonly.m4 serial 3
+dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl This file defines some "once only" variants of standard autoconf macros.
+dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS
+dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS
+dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS
+dnl AC_REQUIRE([AC_HEADER_STDC]) like AC_HEADER_STDC
+dnl The advantage is that the check for each of the headers/functions/decls
+dnl will be put only once into the 'configure' file. It keeps the size of
+dnl the 'configure' file down, and avoids redundant output when 'configure'
+dnl is run.
+dnl The drawback is that the checks cannot be conditionalized. If you write
+dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi
+dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to
+dnl empty, and the check will be inserted before the body of the AC_DEFUNed
+dnl function.
+
+dnl Autoconf version 2.57 or newer is recommended.
+AC_PREREQ(2.54)
+
+# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of
+# AC_CHECK_HEADERS(HEADER1 HEADER2 ...).
+AC_DEFUN([AC_CHECK_HEADERS_ONCE], [
+ :
+ AC_FOREACH([gl_HEADER_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(defn([gl_HEADER_NAME]),
+ [-./], [___])), [
+ AC_CHECK_HEADERS(gl_HEADER_NAME)
+ ])
+ AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
+ [-./], [___])))
+ ])
+])
+
+# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of
+# AC_CHECK_FUNCS(FUNC1 FUNC2 ...).
+AC_DEFUN([AC_CHECK_FUNCS_ONCE], [
+ :
+ AC_FOREACH([gl_FUNC_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_FUNC_]defn([gl_FUNC_NAME]), [
+ AC_CHECK_FUNCS(defn([gl_FUNC_NAME]))
+ ])
+ AC_REQUIRE([gl_CHECK_FUNC_]defn([gl_FUNC_NAME]))
+ ])
+])
+
+# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of
+# AC_CHECK_DECLS(DECL1, DECL2, ...).
+AC_DEFUN([AC_CHECK_DECLS_ONCE], [
+ :
+ AC_FOREACH([gl_DECL_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_DECL_]defn([gl_DECL_NAME]), [
+ AC_CHECK_DECLS(defn([gl_DECL_NAME]))
+ ])
+ AC_REQUIRE([gl_CHECK_DECL_]defn([gl_DECL_NAME]))
+ ])
+])
diff --git a/Build/source/utils/texinfo/m4/onceonly_2_57.m4 b/Build/source/utils/texinfo/m4/onceonly_2_57.m4
new file mode 100644
index 00000000000..9fc510e06ee
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/onceonly_2_57.m4
@@ -0,0 +1,86 @@
+# onceonly_2_57.m4 serial 3
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl This file defines some "once only" variants of standard autoconf macros.
+dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS
+dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS
+dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS
+dnl AC_REQUIRE([AC_HEADER_STDC]) like AC_HEADER_STDC
+dnl The advantage is that the check for each of the headers/functions/decls
+dnl will be put only once into the 'configure' file. It keeps the size of
+dnl the 'configure' file down, and avoids redundant output when 'configure'
+dnl is run.
+dnl The drawback is that the checks cannot be conditionalized. If you write
+dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi
+dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to
+dnl empty, and the check will be inserted before the body of the AC_DEFUNed
+dnl function.
+
+dnl This is like onceonly.m4, except that it uses diversions to named sections
+dnl DEFAULTS and INIT_PREPARE in order to check all requested headers at once,
+dnl thus reducing the size of 'configure'. Works with autoconf-2.57. The
+dnl size reduction is ca. 9%.
+
+dnl Autoconf version 2.57 or newer is recommended.
+AC_PREREQ(2.54)
+
+# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of
+# AC_CHECK_HEADERS(HEADER1 HEADER2 ...).
+AC_DEFUN([AC_CHECK_HEADERS_ONCE], [
+ :
+ AC_FOREACH([gl_HEADER_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
+ [./-], [___])), [
+ m4_divert_text([INIT_PREPARE],
+ [gl_header_list="$gl_header_list gl_HEADER_NAME"])
+ gl_HEADERS_EXPANSION
+ AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])),
+ [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.])
+ ])
+ AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
+ [./-], [___])))
+ ])
+])
+m4_define([gl_HEADERS_EXPANSION], [
+ m4_divert_text([DEFAULTS], [gl_header_list=])
+ AC_CHECK_HEADERS([$gl_header_list])
+ m4_define([gl_HEADERS_EXPANSION], [])
+])
+
+# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of
+# AC_CHECK_FUNCS(FUNC1 FUNC2 ...).
+AC_DEFUN([AC_CHECK_FUNCS_ONCE], [
+ :
+ AC_FOREACH([gl_FUNC_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [
+ m4_divert_text([INIT_PREPARE],
+ [gl_func_list="$gl_func_list gl_FUNC_NAME"])
+ gl_FUNCS_EXPANSION
+ AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])),
+ [Define to 1 if you have the `]m4_defn([gl_FUNC_NAME])[' function.])
+ ])
+ AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]))
+ ])
+])
+m4_define([gl_FUNCS_EXPANSION], [
+ m4_divert_text([DEFAULTS], [gl_func_list=])
+ AC_CHECK_FUNCS([$gl_func_list])
+ m4_define([gl_FUNCS_EXPANSION], [])
+])
+
+# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of
+# AC_CHECK_DECLS(DECL1, DECL2, ...).
+AC_DEFUN([AC_CHECK_DECLS_ONCE], [
+ :
+ AC_FOREACH([gl_DECL_NAME], [$1], [
+ AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [
+ AC_CHECK_DECLS(m4_defn([gl_DECL_NAME]))
+ ])
+ AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]))
+ ])
+])
diff --git a/Build/source/utils/texinfo/m4/po.m4 b/Build/source/utils/texinfo/m4/po.m4
new file mode 100644
index 00000000000..e1619988187
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/po.m4
@@ -0,0 +1,426 @@
+# po.m4 serial 3 (gettext-0.14)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+ AC_REQUIRE([AM_NLS])dnl
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+ dnl Search for GNU xgettext 0.12 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+ dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+ dnl Test whether we really found GNU msgfmt.
+ if test "$GMSGFMT" != ":"; then
+ dnl If it is no GNU msgfmt we define it as : so that the
+ dnl Makefiles still can work.
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+ (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+ AC_MSG_RESULT(
+ [found $GMSGFMT program is not GNU msgfmt; ignore it])
+ GMSGFMT=":"
+ fi
+ fi
+
+ dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is no GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+ (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+ fi
+
+ AC_OUTPUT_COMMANDS([
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done],
+ [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+ # When this code is run, in config.status, two variables have already been
+ # set:
+ # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+ # - LINGUAS is the value of the environment variable LINGUAS at configure
+ # time.
+
+changequote(,)dnl
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ # Find a way to echo strings without interpreting backslash.
+ if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='echo'
+ else
+ if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='printf %s\n'
+ else
+ echo_func () {
+ cat <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ fi
+
+ # A sed script that extracts the value of VARIABLE from a Makefile.
+ sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^[ ]*VARIABLE[ ]*=/{
+ # Seen the first line of the variable definition.
+ s/^[ ]*VARIABLE[ ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`"
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ sed_x_LINGUAS="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`"
+ ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+ fi
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ fi
+
+ sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+ if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+ @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+ \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+ @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+ \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
diff --git a/Build/source/utils/texinfo/m4/prereq.m4 b/Build/source/utils/texinfo/m4/prereq.m4
new file mode 100644
index 00000000000..e2588a29ed6
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/prereq.m4
@@ -0,0 +1,129 @@
+#serial 40
+
+dnl We use gl_ for non Autoconf macros.
+m4_pattern_forbid([^gl_[ABCDEFGHIJKLMNOPQRSTUVXYZ]])dnl
+
+# These are the prerequisite macros for files in the lib/
+# directory of the coreutils package.
+
+AC_DEFUN([gl_PREREQ],
+[
+ # We don't yet use c-stack.c.
+ # AC_REQUIRE([gl_C_STACK])
+
+ AC_REQUIRE([AM_FUNC_GETLINE])
+ AC_REQUIRE([AM_STDBOOL_H])
+ AC_REQUIRE([gl_FUNC_MKDIR_TRAILING_SLASH])
+ AC_REQUIRE([gl_FUNC_MKSTEMP])
+ AC_REQUIRE([gl_ALLOCSA])
+ AC_REQUIRE([gl_BACKUPFILE])
+ AC_REQUIRE([gl_CANON_HOST])
+ AC_REQUIRE([gl_CLOEXEC])
+ AC_REQUIRE([gl_CLOSEOUT])
+ AC_REQUIRE([gl_DIRNAME])
+ AC_REQUIRE([gl_ERROR])
+ AC_REQUIRE([gl_EXCLUDE])
+ AC_REQUIRE([gl_EXITFAIL])
+ AC_REQUIRE([gl_FILEBLOCKS])
+ AC_REQUIRE([gl_FILEMODE])
+ AC_REQUIRE([gl_FILE_TYPE])
+ AC_REQUIRE([gl_FSUSAGE])
+ AC_REQUIRE([gl_FUNC_ALLOCA])
+ AC_REQUIRE([gl_FUNC_ATEXIT])
+ AC_REQUIRE([gl_FUNC_DUP2])
+ AC_REQUIRE([gl_FUNC_EUIDACCESS])
+ AC_REQUIRE([gl_FUNC_FNMATCH_GNU])
+ AC_REQUIRE([gl_FUNC_GETHOSTNAME])
+ AC_REQUIRE([AC_FUNC_GETLOADAVG])
+ AC_REQUIRE([gl_FUNC_GETPASS])
+ AC_REQUIRE([gl_FUNC_GETUSERSHELL])
+ AC_REQUIRE([gl_FUNC_MEMCHR])
+ AC_REQUIRE([gl_FUNC_MEMCPY])
+ AC_REQUIRE([gl_FUNC_MEMMOVE])
+ AC_REQUIRE([gl_FUNC_MEMRCHR])
+ AC_REQUIRE([gl_FUNC_MEMSET])
+ AC_REQUIRE([gl_FUNC_MKTIME])
+ AC_REQUIRE([gl_FUNC_READLINK])
+ AC_REQUIRE([gl_FUNC_RMDIR])
+ AC_REQUIRE([gl_FUNC_RPMATCH])
+ AC_REQUIRE([gl_FUNC_SIG2STR])
+ AC_REQUIRE([gl_FUNC_STPCPY])
+ AC_REQUIRE([gl_FUNC_STRCSPN])
+ AC_REQUIRE([gl_FUNC_STRDUP])
+ AC_REQUIRE([gl_FUNC_STRNDUP])
+ AC_REQUIRE([gl_FUNC_STRNLEN])
+ AC_REQUIRE([gl_FUNC_STRPBRK])
+ AC_REQUIRE([gl_FUNC_STRSTR])
+ AC_REQUIRE([gl_FUNC_STRTOD])
+ AC_REQUIRE([gl_FUNC_STRTOIMAX])
+ AC_REQUIRE([gl_FUNC_STRTOLL])
+ AC_REQUIRE([gl_FUNC_STRTOL])
+ AC_REQUIRE([gl_FUNC_STRTOULL])
+ AC_REQUIRE([gl_FUNC_STRTOUL])
+ AC_REQUIRE([gl_FUNC_STRTOUMAX])
+ AC_REQUIRE([gl_FUNC_STRVERSCMP])
+ AC_REQUIRE([gl_FUNC_VASNPRINTF])
+ AC_REQUIRE([gl_FUNC_VASPRINTF])
+ AC_REQUIRE([gl_GETDATE])
+ AC_REQUIRE([gl_GETNDELIM2])
+ AC_REQUIRE([gl_GETOPT])
+ AC_REQUIRE([gl_GETPAGESIZE])
+ AC_REQUIRE([gl_GETUGROUPS])
+ AC_REQUIRE([gl_HARD_LOCALE])
+ AC_REQUIRE([gl_HASH])
+ AC_REQUIRE([gl_HUMAN])
+ AC_REQUIRE([gl_IDCACHE])
+ AC_REQUIRE([gl_INTTOSTR])
+ AC_REQUIRE([gl_LONG_OPTIONS])
+ AC_REQUIRE([gl_MAKEPATH])
+ AC_REQUIRE([gl_MBSWIDTH])
+ AC_REQUIRE([gl_MD5])
+ AC_REQUIRE([gl_MEMCOLL])
+ AC_REQUIRE([gl_MODECHANGE])
+ AC_REQUIRE([gl_MOUNTLIST])
+ AC_REQUIRE([gl_OBSTACK])
+ AC_REQUIRE([gl_PATHMAX])
+ AC_REQUIRE([gl_PATH_CONCAT])
+ AC_REQUIRE([gl_PHYSMEM])
+ AC_REQUIRE([gl_POSIXTM])
+ AC_REQUIRE([gl_POSIXVER])
+ AC_REQUIRE([gl_QUOTEARG])
+ AC_REQUIRE([gl_QUOTE])
+ AC_REQUIRE([gl_READTOKENS])
+ AC_REQUIRE([gl_READUTMP])
+ AC_REQUIRE([gl_REGEX])
+ AC_REQUIRE([gl_SAFE_READ])
+ AC_REQUIRE([gl_SAFE_WRITE])
+ AC_REQUIRE([gl_SAME])
+ AC_REQUIRE([gl_SAVEDIR])
+ AC_REQUIRE([gl_SAVE_CWD])
+ AC_REQUIRE([gl_SETTIME])
+ AC_REQUIRE([gl_SHA])
+ AC_REQUIRE([gl_STDIO_SAFER])
+ AC_REQUIRE([gl_STRCASE])
+ AC_REQUIRE([gl_TIMESPEC])
+ AC_REQUIRE([gl_UNICODEIO])
+ AC_REQUIRE([gl_UNISTD_SAFER])
+ AC_REQUIRE([gl_USERSPEC])
+ AC_REQUIRE([gl_UTIMECMP])
+ AC_REQUIRE([gl_UTIMENS])
+ AC_REQUIRE([gl_XALLOC])
+ AC_REQUIRE([gl_XGETCWD])
+ AC_REQUIRE([gl_XREADLINK])
+ AC_REQUIRE([gl_XSTRTOD])
+ AC_REQUIRE([gl_XSTRTOL])
+ AC_REQUIRE([gl_YESNO])
+ AC_REQUIRE([gl_FUNC_GLIBC_UNLOCKED_IO])
+ AC_REQUIRE([gl_FUNC_GNU_STRFTIME])
+ AC_REQUIRE([gl_FUNC_LSTAT])
+ AC_REQUIRE([AC_FUNC_MALLOC])
+ AC_REQUIRE([gl_FUNC_MEMCMP])
+ AC_REQUIRE([gl_FUNC_NANOSLEEP])
+ AC_REQUIRE([gl_FUNC_PUTENV])
+ AC_REQUIRE([AC_FUNC_REALLOC])
+ AC_REQUIRE([gl_FUNC_STAT])
+ AC_REQUIRE([gl_FUNC_UTIME])
+ AC_REQUIRE([gl_XSTRTOIMAX])
+ AC_REQUIRE([gl_XSTRTOUMAX])
+ AC_REQUIRE([vb_FUNC_RENAME])
+])
diff --git a/Build/source/utils/texinfo/m4/printf-posix.m4 b/Build/source/utils/texinfo/m4/printf-posix.m4
new file mode 100644
index 00000000000..186ba6a6d16
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/printf-posix.m4
@@ -0,0 +1,46 @@
+# printf-posix.m4 serial 2 (gettext-0.13.1)
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+ gt_cv_func_printf_posix,
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
+ [
+ AC_EGREP_CPP(notposix, [
+#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+ notposix
+#endif
+ ], gt_cv_func_printf_posix="guessing no",
+ gt_cv_func_printf_posix="guessing yes")
+ ])
+ ])
+ case $gt_cv_func_printf_posix in
+ *yes)
+ AC_DEFINE(HAVE_POSIX_PRINTF, 1,
+ [Define if your printf() function supports format strings with positions.])
+ ;;
+ esac
+])
diff --git a/Build/source/utils/texinfo/m4/progtest.m4 b/Build/source/utils/texinfo/m4/progtest.m4
new file mode 100644
index 00000000000..8fe527ceceb
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/progtest.m4
@@ -0,0 +1,91 @@
+# progtest.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ [[\\/]]* | ?:[[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
diff --git a/Build/source/utils/texinfo/m4/signed.m4 b/Build/source/utils/texinfo/m4/signed.m4
new file mode 100644
index 00000000000..dc1f54f1069
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/signed.m4
@@ -0,0 +1,19 @@
+# signed.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([bh_C_SIGNED],
+[
+ AC_CACHE_CHECK([for signed], bh_cv_c_signed,
+ [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)])
+ if test $bh_cv_c_signed = no; then
+ AC_DEFINE(signed, ,
+ [Define to empty if the C compiler doesn't support this keyword.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/size_max.m4 b/Build/source/utils/texinfo/m4/size_max.m4
new file mode 100644
index 00000000000..5762fc333c5
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/size_max.m4
@@ -0,0 +1,61 @@
+# size_max.m4 serial 2
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS(stdint.h)
+ dnl First test whether the system already has SIZE_MAX.
+ AC_MSG_CHECKING([for SIZE_MAX])
+ result=
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], result=yes)
+ if test -z "$result"; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'.
+ dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
+ dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
+ _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi,
+ [#include <stddef.h>], result=?)
+ _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo,
+ [#include <stddef.h>], result=?)
+ _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
+ [#include <stddef.h>], result=?)
+ if test "$fits_in_uint" = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_TRY_COMPILE([#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ], [], fits_in_uint=0)
+ fi
+ if test -z "$result"; then
+ if test "$fits_in_uint" = 1; then
+ result="$res_hi$res_lo"U
+ else
+ result="$res_hi$res_lo"UL
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ result='~(size_t)0'
+ fi
+ fi
+ AC_MSG_RESULT([$result])
+ if test "$result" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$result],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/stdint_h.m4 b/Build/source/utils/texinfo/m4/stdint_h.m4
new file mode 100644
index 00000000000..063c4344e3c
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/stdint_h.m4
@@ -0,0 +1,28 @@
+# stdint_h.m4 serial 5
+dnl Copyright (C) 1997-2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <stdint.h>],
+ [uintmax_t i = (uintmax_t) -1;],
+ gl_cv_header_stdint_h=yes,
+ gl_cv_header_stdint_h=no)])
+ if test $gl_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/strcase.m4 b/Build/source/utils/texinfo/m4/strcase.m4
new file mode 100644
index 00000000000..3fd25d0ce97
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/strcase.m4
@@ -0,0 +1,39 @@
+# strcase.m4 serial 1
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([gl_STRCASE],
+[
+ gl_FUNC_STRCASECMP
+ gl_FUNC_STRNCASECMP
+])
+
+AC_DEFUN([gl_FUNC_STRCASECMP],
+[
+ AC_REPLACE_FUNCS(strcasecmp)
+ if test $ac_cv_func_strcasecmp = no; then
+ gl_PREREQ_STRCASECMP
+ fi
+])
+
+AC_DEFUN([gl_FUNC_STRNCASECMP],
+[
+ AC_REPLACE_FUNCS(strncasecmp)
+ if test $ac_cv_func_strncasecmp = no; then
+ gl_PREREQ_STRNCASECMP
+ fi
+])
+
+# Prerequisites of lib/strcasecmp.c.
+AC_DEFUN([gl_PREREQ_STRCASECMP], [
+ :
+])
+
+# Prerequisites of lib/strncasecmp.c.
+AC_DEFUN([gl_PREREQ_STRNCASECMP], [
+ :
+])
diff --git a/Build/source/utils/texinfo/m4/uintmax_t.m4 b/Build/source/utils/texinfo/m4/uintmax_t.m4
new file mode 100644
index 00000000000..a2bc218ce79
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/uintmax_t.m4
@@ -0,0 +1,32 @@
+# uintmax_t.m4 serial 9
+dnl Copyright (C) 1997-2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+ AC_REQUIRE([gl_AC_TYPE_UNSIGNED_LONG_LONG])
+ test $ac_cv_type_unsigned_long_long = yes \
+ && ac_type='unsigned long long' \
+ || ac_type='unsigned long'
+ AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+ [Define to unsigned long or unsigned long long
+ if <stdint.h> and <inttypes.h> don't define.])
+ else
+ AC_DEFINE(HAVE_UINTMAX_T, 1,
+ [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/ulonglong.m4 b/Build/source/utils/texinfo/m4/ulonglong.m4
new file mode 100644
index 00000000000..1123ccb8372
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/ulonglong.m4
@@ -0,0 +1,25 @@
+# ulonglong.m4 serial 4
+dnl Copyright (C) 1999-2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works.
+
+AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+ AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
+ [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;],
+ [unsigned long long ullmax = (unsigned long long) -1;
+ return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
+ ac_cv_type_unsigned_long_long=yes,
+ ac_cv_type_unsigned_long_long=no)])
+ if test $ac_cv_type_unsigned_long_long = yes; then
+ AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+ [Define if you have the 'unsigned long long' type.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/wchar_t.m4 b/Build/source/utils/texinfo/m4/wchar_t.m4
new file mode 100644
index 00000000000..d8fd1ec5c3b
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/wchar_t.m4
@@ -0,0 +1,22 @@
+# wchar_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
+ [AC_TRY_COMPILE([#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/wint_t.m4 b/Build/source/utils/texinfo/m4/wint_t.m4
new file mode 100644
index 00000000000..3d8d21594c0
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/wint_t.m4
@@ -0,0 +1,22 @@
+# wint_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+ [AC_TRY_COMPILE([#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
+ fi
+])
diff --git a/Build/source/utils/texinfo/m4/xsize.m4 b/Build/source/utils/texinfo/m4/xsize.m4
new file mode 100644
index 00000000000..9b7cf9b4930
--- /dev/null
+++ b/Build/source/utils/texinfo/m4/xsize.m4
@@ -0,0 +1,14 @@
+# xsize.m4 serial 2
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_CHECK_HEADERS(stdint.h)
+])
diff --git a/Build/source/utils/texinfo/makeinfo/Makefile.am b/Build/source/utils/texinfo/makeinfo/Makefile.am
new file mode 100644
index 00000000000..5f9f82dfd43
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/Makefile.am
@@ -0,0 +1,28 @@
+# $Id: Makefile.am,v 1.5 2004/04/11 17:56:46 karl Exp $
+# Makefile.am for texinfo/makeinfo.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+bin_PROGRAMS = makeinfo
+
+localedir = $(datadir)/locale
+INCLUDES = -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\"
+LDADD = ../lib/libtxi.a $(LIBINTL)
+
+makeinfo_SOURCES = \
+ cmds.c cmds.h defun.c defun.h \
+ files.c files.h float.c float.h footnote.c footnote.h \
+ html.c html.h index.c index.h insertion.c insertion.h lang.c lang.h \
+ macro.c macro.h makeinfo.c makeinfo.h multi.c multi.h node.c node.h \
+ sectioning.c sectioning.h toc.c toc.h xml.c xml.h xref.c xref.h
+
+EXTRA_DIST = README
+
+SUBDIRS = tests
diff --git a/Build/source/utils/texinfo/makeinfo/Makefile.in b/Build/source/utils/texinfo/makeinfo/Makefile.in
new file mode 100644
index 00000000000..fe059dd4fb6
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/Makefile.in
@@ -0,0 +1,600 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.5 2004/04/11 17:56:46 karl Exp $
+# Makefile.am for texinfo/makeinfo.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+SOURCES = $(makeinfo_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = makeinfo$(EXEEXT)
+subdir = makeinfo
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_makeinfo_OBJECTS = cmds.$(OBJEXT) defun.$(OBJEXT) files.$(OBJEXT) \
+ float.$(OBJEXT) footnote.$(OBJEXT) html.$(OBJEXT) \
+ index.$(OBJEXT) insertion.$(OBJEXT) lang.$(OBJEXT) \
+ macro.$(OBJEXT) makeinfo.$(OBJEXT) multi.$(OBJEXT) \
+ node.$(OBJEXT) sectioning.$(OBJEXT) toc.$(OBJEXT) \
+ xml.$(OBJEXT) xref.$(OBJEXT)
+makeinfo_OBJECTS = $(am_makeinfo_OBJECTS)
+makeinfo_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+makeinfo_DEPENDENCIES = ../lib/libtxi.a $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(makeinfo_SOURCES)
+DIST_SOURCES = $(makeinfo_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+localedir = $(datadir)/locale
+INCLUDES = -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\"
+LDADD = ../lib/libtxi.a $(LIBINTL)
+makeinfo_SOURCES = \
+ cmds.c cmds.h defun.c defun.h \
+ files.c files.h float.c float.h footnote.c footnote.h \
+ html.c html.h index.c index.h insertion.c insertion.h lang.c lang.h \
+ macro.c macro.h makeinfo.c makeinfo.h multi.c multi.h node.c node.h \
+ sectioning.c sectioning.h toc.c toc.h xml.c xml.h xref.c xref.h
+
+EXTRA_DIST = README
+SUBDIRS = tests
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu makeinfo/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu makeinfo/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+makeinfo$(EXEEXT): $(makeinfo_OBJECTS) $(makeinfo_DEPENDENCIES)
+ @rm -f makeinfo$(EXEEXT)
+ $(LINK) $(makeinfo_LDFLAGS) $(makeinfo_OBJECTS) $(makeinfo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmds.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defun.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/files.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/footnote.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/html.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/index.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insertion.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lang.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macro.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makeinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sectioning.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xref.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ clean clean-binPROGRAMS clean-generic clean-recursive ctags \
+ ctags-recursive distclean distclean-compile distclean-generic \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/makeinfo/README b/Build/source/utils/texinfo/makeinfo/README
new file mode 100644
index 00000000000..17c437170b6
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/README
@@ -0,0 +1,17 @@
+$Id: README,v 1.3 2004/04/11 17:56:46 karl Exp $
+texinfo/makeinfo/README
+
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+makeinfo is a standalone program to convert Texinfo source into Info
+files readable with standalone info or M-x info in Emacs.
+
+makeinfo can also output other formats: plain ASCII (with --no-headers)
+or HTML (with --html) or XML (with --xml).
+
+The Emacs function M-x texinfo-format-buffer does more or less the same
+job, but makeinfo is faster and gives better error messages.
diff --git a/Build/source/utils/texinfo/makeinfo/cmds.c b/Build/source/utils/texinfo/makeinfo/cmds.c
new file mode 100644
index 00000000000..87ac7bb80de
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/cmds.c
@@ -0,0 +1,1883 @@
+/* cmds.c -- Texinfo commands.
+ $Id: cmds.c,v 1.55 2004/12/14 00:15:36 karl Exp $
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "cmds.h"
+#include "defun.h"
+#include "files.h"
+#include "footnote.h"
+#include "html.h"
+#include "insertion.h"
+#include "lang.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "node.h"
+#include "sectioning.h"
+#include "toc.h"
+#include "xml.h"
+
+#ifdef TM_IN_SYS_TIME
+#include <sys/time.h>
+#else
+#include <time.h>
+#endif
+
+/* Options. */
+static void cm_exampleindent (void),
+ cm_firstparagraphindent (void),
+ cm_paragraphindent (void),
+ cm_novalidate (void);
+
+/* Internals. */
+static void cm_obsolete (int arg, int start, int end),
+ not_fixed_width (int arg);
+
+/* The dispatch table. */
+COMMAND command_table[] = {
+ { "\t", insert_space, NO_BRACE_ARGS },
+ { "\n", insert_space, NO_BRACE_ARGS },
+ { " ", insert_space, NO_BRACE_ARGS },
+ { "!", cm_punct, NO_BRACE_ARGS },
+ { "\"", cm_accent_umlaut, MAYBE_BRACE_ARGS },
+ { "'", cm_accent_acute, MAYBE_BRACE_ARGS },
+ { "*", cm_asterisk, NO_BRACE_ARGS },
+ { ",", cm_accent_cedilla, MAYBE_BRACE_ARGS },
+ { "-", cm_no_op, NO_BRACE_ARGS },
+ { ".", cm_punct, NO_BRACE_ARGS },
+ { "/", cm_no_op, NO_BRACE_ARGS },
+ { ":", cm_colon, NO_BRACE_ARGS },
+ { "=", cm_accent, MAYBE_BRACE_ARGS },
+ { "?", cm_punct, NO_BRACE_ARGS },
+ { "@", insert_self, NO_BRACE_ARGS },
+ { "\\", insert_self, NO_BRACE_ARGS },
+ { "^", cm_accent_hat, MAYBE_BRACE_ARGS },
+ { "`", cm_accent_grave, MAYBE_BRACE_ARGS },
+ { "{", insert_self, NO_BRACE_ARGS },
+ { "|", cm_no_op, NO_BRACE_ARGS },
+ { "}", insert_self, NO_BRACE_ARGS },
+ { "~", cm_accent_tilde, MAYBE_BRACE_ARGS },
+ { "AA", cm_special_char, BRACE_ARGS },
+ { "AE", cm_special_char, BRACE_ARGS },
+ { "H", cm_accent, MAYBE_BRACE_ARGS },
+ { "L", cm_special_char, BRACE_ARGS },
+ { "LaTeX", cm_LaTeX, BRACE_ARGS },
+ { "O", cm_special_char, BRACE_ARGS },
+ { "OE", cm_special_char, BRACE_ARGS },
+ { "TeX", cm_TeX, BRACE_ARGS },
+ { "aa", cm_special_char, BRACE_ARGS },
+ { "abbr", cm_abbr, BRACE_ARGS },
+ { "acronym", cm_acronym, BRACE_ARGS },
+ { "ae", cm_special_char, BRACE_ARGS },
+ { "afivepaper", cm_ignore_line, NO_BRACE_ARGS },
+ { "afourlatex", cm_ignore_line, NO_BRACE_ARGS },
+ { "afourpaper", cm_ignore_line, NO_BRACE_ARGS },
+ { "afourwide", cm_ignore_line, NO_BRACE_ARGS },
+ { "alias", cm_alias, NO_BRACE_ARGS },
+ { "anchor", cm_anchor, BRACE_ARGS },
+ { "appendix", cm_appendix, NO_BRACE_ARGS },
+ { "appendixsection", cm_appendixsec, NO_BRACE_ARGS },
+ { "appendixsec", cm_appendixsec, NO_BRACE_ARGS },
+ { "appendixsubsec", cm_appendixsubsec, NO_BRACE_ARGS },
+ { "appendixsubsubsec", cm_appendixsubsubsec, NO_BRACE_ARGS },
+ { "asis", cm_no_op, BRACE_ARGS },
+ { "author", cm_author, NO_BRACE_ARGS },
+ { "b", cm_b, BRACE_ARGS },
+ { "bullet", cm_bullet, BRACE_ARGS },
+ { "bye", cm_bye, NO_BRACE_ARGS },
+ { "c", cm_comment, NO_BRACE_ARGS },
+ { "caption", cm_caption, BRACE_ARGS },
+ { "cartouche", cm_cartouche, NO_BRACE_ARGS },
+ { "center", cm_center, NO_BRACE_ARGS },
+ { "centerchap", cm_unnumbered, NO_BRACE_ARGS },
+ { "chapheading", cm_chapheading, NO_BRACE_ARGS },
+ { "chapter", cm_chapter, NO_BRACE_ARGS },
+ { "cindex", cm_cindex, NO_BRACE_ARGS },
+ { "cite", cm_cite, BRACE_ARGS },
+ { "clear", cm_clear, NO_BRACE_ARGS },
+ { "code", cm_code, BRACE_ARGS },
+ { "comma", cm_comma, BRACE_ARGS },
+ { "command", cm_code, BRACE_ARGS },
+ { "comment", cm_comment, NO_BRACE_ARGS },
+ { "contents", cm_contents, NO_BRACE_ARGS },
+ { "copying", cm_copying, NO_BRACE_ARGS },
+ { "copyright", cm_copyright, BRACE_ARGS },
+ { "ctrl", cm_obsolete, BRACE_ARGS },
+ { "defcodeindex", cm_defcodeindex, NO_BRACE_ARGS },
+ { "defcv", cm_defun, NO_BRACE_ARGS },
+ { "defcvx", cm_defun, NO_BRACE_ARGS },
+ { "deffn", cm_defun, NO_BRACE_ARGS },
+ { "deffnx", cm_defun, NO_BRACE_ARGS },
+ { "defindex", cm_defindex, NO_BRACE_ARGS },
+ { "definfoenclose", cm_definfoenclose, NO_BRACE_ARGS },
+ { "defivar", cm_defun, NO_BRACE_ARGS },
+ { "defivarx", cm_defun, NO_BRACE_ARGS },
+ { "defmac", cm_defun, NO_BRACE_ARGS },
+ { "defmacx", cm_defun, NO_BRACE_ARGS },
+ { "defmethod", cm_defun, NO_BRACE_ARGS },
+ { "defmethodx", cm_defun, NO_BRACE_ARGS },
+ { "defop", cm_defun, NO_BRACE_ARGS },
+ { "defopt", cm_defun, NO_BRACE_ARGS },
+ { "defoptx", cm_defun, NO_BRACE_ARGS },
+ { "defopx", cm_defun, NO_BRACE_ARGS },
+ { "defspec", cm_defun, NO_BRACE_ARGS },
+ { "defspecx", cm_defun, NO_BRACE_ARGS },
+ { "deftp", cm_defun, NO_BRACE_ARGS },
+ { "deftpx", cm_defun, NO_BRACE_ARGS },
+ { "deftypecv", cm_defun, NO_BRACE_ARGS },
+ { "deftypecvx", cm_defun, NO_BRACE_ARGS },
+ { "deftypefn", cm_defun, NO_BRACE_ARGS },
+ { "deftypefnx", cm_defun, NO_BRACE_ARGS },
+ { "deftypefun", cm_defun, NO_BRACE_ARGS },
+ { "deftypefunx", cm_defun, NO_BRACE_ARGS },
+ { "deftypeivar", cm_defun, NO_BRACE_ARGS },
+ { "deftypeivarx", cm_defun, NO_BRACE_ARGS },
+ { "deftypemethod", cm_defun, NO_BRACE_ARGS },
+ { "deftypemethodx", cm_defun, NO_BRACE_ARGS },
+ { "deftypeop", cm_defun, NO_BRACE_ARGS },
+ { "deftypeopx", cm_defun, NO_BRACE_ARGS },
+ { "deftypevar", cm_defun, NO_BRACE_ARGS },
+ { "deftypevarx", cm_defun, NO_BRACE_ARGS },
+ { "deftypevr", cm_defun, NO_BRACE_ARGS },
+ { "deftypevrx", cm_defun, NO_BRACE_ARGS },
+ { "defun", cm_defun, NO_BRACE_ARGS },
+ { "defunx", cm_defun, NO_BRACE_ARGS },
+ { "defvar", cm_defun, NO_BRACE_ARGS },
+ { "defvarx", cm_defun, NO_BRACE_ARGS },
+ { "defvr", cm_defun, NO_BRACE_ARGS },
+ { "defvrx", cm_defun, NO_BRACE_ARGS },
+ { "detailmenu", cm_detailmenu, NO_BRACE_ARGS },
+ { "dfn", cm_dfn, BRACE_ARGS },
+ { "dircategory", cm_dircategory, NO_BRACE_ARGS },
+ { "direntry", cm_direntry, NO_BRACE_ARGS },
+ { "display", cm_display, NO_BRACE_ARGS },
+ { "dmn", cm_dmn, BRACE_ARGS },
+ { "docbook", cm_docbook, NO_BRACE_ARGS },
+ { "documentdescription", cm_documentdescription, NO_BRACE_ARGS },
+ { "documentencoding", cm_documentencoding, NO_BRACE_ARGS },
+ { "documentlanguage", cm_documentlanguage, NO_BRACE_ARGS },
+ { "dotaccent", cm_accent, MAYBE_BRACE_ARGS },
+ { "dotless", cm_dotless, BRACE_ARGS },
+ { "dots", cm_dots, BRACE_ARGS },
+ { "email", cm_email, BRACE_ARGS },
+ { "emph", cm_emph, BRACE_ARGS },
+ { "end", cm_end, NO_BRACE_ARGS },
+ { "enddots", cm_enddots, BRACE_ARGS },
+ { "enumerate", cm_enumerate, NO_BRACE_ARGS },
+ { "env", cm_code, BRACE_ARGS },
+ { "equiv", cm_equiv, BRACE_ARGS },
+ { "error", cm_error, BRACE_ARGS },
+ { "euro", cm_special_char, BRACE_ARGS },
+ { "evenfooting", cm_ignore_line, NO_BRACE_ARGS },
+ { "evenheading", cm_ignore_line, NO_BRACE_ARGS },
+ { "everyfooting", cm_ignore_line, NO_BRACE_ARGS },
+ { "everyheading", cm_ignore_line, NO_BRACE_ARGS },
+ { "example", cm_example, NO_BRACE_ARGS },
+ { "exampleindent", cm_exampleindent, NO_BRACE_ARGS },
+ { "exclamdown", cm_special_char, BRACE_ARGS },
+ { "exdent", cm_exdent, NO_BRACE_ARGS },
+ { "expansion", cm_expansion, BRACE_ARGS },
+ { "file", cm_code, BRACE_ARGS },
+ { "finalout", cm_no_op, NO_BRACE_ARGS },
+ { "findex", cm_findex, NO_BRACE_ARGS },
+ { "firstparagraphindent", cm_firstparagraphindent, NO_BRACE_ARGS },
+ { "float", cm_float, NO_BRACE_ARGS },
+ { "flushleft", cm_flushleft, NO_BRACE_ARGS },
+ { "flushright", cm_flushright, NO_BRACE_ARGS },
+ { "footnote", cm_footnote, NO_BRACE_ARGS}, /* self-arg eater */
+ { "footnotestyle", cm_footnotestyle, NO_BRACE_ARGS },
+ { "format", cm_format, NO_BRACE_ARGS },
+ { "ftable", cm_ftable, NO_BRACE_ARGS },
+ { "group", cm_group, NO_BRACE_ARGS },
+ { "heading", cm_heading, NO_BRACE_ARGS },
+ { "headings", cm_ignore_line, NO_BRACE_ARGS },
+ { "headitem", cm_headitem, NO_BRACE_ARGS },
+ { "html", cm_html, NO_BRACE_ARGS },
+ { "hyphenation", cm_ignore_arg, BRACE_ARGS },
+ { "i", cm_i, BRACE_ARGS },
+ { "ifclear", cm_ifclear, NO_BRACE_ARGS },
+ { "ifeq", cm_ifeq, NO_BRACE_ARGS },
+ { "ifdocbook", cm_ifdocbook, NO_BRACE_ARGS },
+ { "ifhtml", cm_ifhtml, NO_BRACE_ARGS },
+ { "ifinfo", cm_ifinfo, NO_BRACE_ARGS },
+ { "ifnotdocbook", cm_ifnotdocbook, NO_BRACE_ARGS },
+ { "ifnothtml", cm_ifnothtml, NO_BRACE_ARGS },
+ { "ifnotinfo", cm_ifnotinfo, NO_BRACE_ARGS },
+ { "ifnotplaintext", cm_ifnotplaintext, NO_BRACE_ARGS },
+ { "ifnottex", cm_ifnottex, NO_BRACE_ARGS },
+ { "ifnotxml", cm_ifnotxml, NO_BRACE_ARGS },
+ { "ifplaintext", cm_ifplaintext, NO_BRACE_ARGS },
+ { "ifset", cm_ifset, NO_BRACE_ARGS },
+ { "iftex", cm_iftex, NO_BRACE_ARGS },
+ { "ifxml", cm_ifxml, NO_BRACE_ARGS },
+ { "ignore", command_name_condition, NO_BRACE_ARGS },
+ { "image", cm_image, BRACE_ARGS },
+ { "include", cm_include, NO_BRACE_ARGS },
+ { "indent", cm_indent, NO_BRACE_ARGS },
+ { "indicateurl", cm_indicate_url, BRACE_ARGS },
+ { "inforef", cm_inforef, BRACE_ARGS },
+ { "insertcopying", cm_insert_copying, NO_BRACE_ARGS },
+ { "item", cm_item, NO_BRACE_ARGS },
+ { "itemize", cm_itemize, NO_BRACE_ARGS },
+ { "itemx", cm_itemx, NO_BRACE_ARGS },
+ { "kbd", cm_kbd, BRACE_ARGS },
+ { "kbdinputstyle", cm_ignore_line, NO_BRACE_ARGS },
+ { "key", cm_key, BRACE_ARGS },
+ { "kindex", cm_kindex, NO_BRACE_ARGS },
+ { "l", cm_special_char, BRACE_ARGS },
+ { "lisp", cm_lisp, NO_BRACE_ARGS },
+ { "listoffloats", cm_listoffloats, NO_BRACE_ARGS },
+ { "lowersections", cm_lowersections, NO_BRACE_ARGS },
+ { "macro", cm_macro, NO_BRACE_ARGS },
+ { "majorheading", cm_majorheading, NO_BRACE_ARGS },
+ { "math", cm_math, BRACE_ARGS },
+ { "menu", cm_menu, NO_BRACE_ARGS },
+ { "minus", cm_minus, BRACE_ARGS },
+ { "multitable", cm_multitable, NO_BRACE_ARGS },
+ { "need", cm_ignore_line, NO_BRACE_ARGS },
+ { "node", cm_node, NO_BRACE_ARGS },
+ { "noindent", cm_noindent_cmd, NO_BRACE_ARGS },
+ { "novalidate", cm_novalidate, NO_BRACE_ARGS },
+ { "nwnode", cm_node, NO_BRACE_ARGS },
+ { "o", cm_special_char, BRACE_ARGS },
+ { "oddfooting", cm_ignore_line, NO_BRACE_ARGS },
+ { "oddheading", cm_ignore_line, NO_BRACE_ARGS },
+ { "oe", cm_special_char, BRACE_ARGS },
+ { "option", cm_code, BRACE_ARGS },
+ { "ordf", cm_special_char, BRACE_ARGS },
+ { "ordm", cm_special_char, BRACE_ARGS },
+ { "page", cm_no_op, NO_BRACE_ARGS },
+ { "pagesizes", cm_ignore_line, NO_BRACE_ARGS },
+ { "paragraphindent", cm_paragraphindent, NO_BRACE_ARGS },
+ { "pindex", cm_pindex, NO_BRACE_ARGS },
+ { "point", cm_point, BRACE_ARGS },
+ { "pounds", cm_special_char, BRACE_ARGS },
+ { "print", cm_print, BRACE_ARGS },
+ { "printindex", cm_printindex, NO_BRACE_ARGS },
+ { "pxref", cm_pxref, BRACE_ARGS },
+ { "questiondown", cm_special_char, BRACE_ARGS },
+ { "quotation", cm_quotation, NO_BRACE_ARGS },
+ { "r", cm_r, BRACE_ARGS },
+ { "raisesections", cm_raisesections, NO_BRACE_ARGS },
+ { "ref", cm_ref, BRACE_ARGS },
+ { "refill", cm_no_op, NO_BRACE_ARGS },
+ { "registeredsymbol", cm_registeredsymbol, BRACE_ARGS },
+ { "result", cm_result, BRACE_ARGS },
+ { "ringaccent", cm_accent, MAYBE_BRACE_ARGS },
+ { "rmacro", cm_rmacro, NO_BRACE_ARGS },
+ { "samp", cm_code, BRACE_ARGS },
+ { "sansserif", cm_sansserif, BRACE_ARGS },
+ { "sc", cm_sc, BRACE_ARGS },
+ { "section", cm_section, NO_BRACE_ARGS },
+ { "set", cm_set, NO_BRACE_ARGS },
+ { "setchapternewpage", cm_ignore_line, NO_BRACE_ARGS },
+ { "setchapterstyle", cm_obsolete, NO_BRACE_ARGS },
+ { "setcontentsaftertitlepage", cm_no_op, NO_BRACE_ARGS },
+ { "setfilename", cm_setfilename, NO_BRACE_ARGS },
+ { "setshortcontentsaftertitlepage", cm_no_op, NO_BRACE_ARGS },
+ { "settitle", cm_settitle, NO_BRACE_ARGS },
+ { "shortcaption", cm_caption, BRACE_ARGS },
+ { "shortcontents", cm_contents, NO_BRACE_ARGS },
+ { "shorttitlepage", cm_ignore_line, NO_BRACE_ARGS },
+ { "slanted", cm_slanted, BRACE_ARGS },
+ { "smallbook", cm_ignore_line, NO_BRACE_ARGS },
+ { "smalldisplay", cm_smalldisplay, NO_BRACE_ARGS },
+ { "smallexample", cm_smallexample, NO_BRACE_ARGS },
+ { "smallformat", cm_smallformat, NO_BRACE_ARGS },
+ { "smalllisp", cm_smalllisp, NO_BRACE_ARGS },
+ { "sp", cm_sp, NO_BRACE_ARGS },
+ { "ss", cm_special_char, BRACE_ARGS },
+ { "strong", cm_strong, BRACE_ARGS },
+ { "subheading", cm_subheading, NO_BRACE_ARGS },
+ { "subsection", cm_subsection, NO_BRACE_ARGS },
+ { "subsubheading", cm_subsubheading, NO_BRACE_ARGS },
+ { "subsubsection", cm_subsubsection, NO_BRACE_ARGS },
+ { "subtitle", cm_titlepage_cmds, NO_BRACE_ARGS },
+ { "summarycontents", cm_contents, NO_BRACE_ARGS },
+ { "syncodeindex", cm_synindex, NO_BRACE_ARGS },
+ { "synindex", cm_synindex, NO_BRACE_ARGS },
+ { "t", cm_tt, BRACE_ARGS },
+ { "tab", cm_tab, NO_BRACE_ARGS },
+ { "table", cm_table, NO_BRACE_ARGS },
+ { "tex", cm_tex, NO_BRACE_ARGS },
+ { "tie", cm_tie, BRACE_ARGS },
+ { "tieaccent", cm_accent, MAYBE_BRACE_ARGS },
+ { "tindex", cm_tindex, NO_BRACE_ARGS },
+ { "title", cm_titlepage_cmds, NO_BRACE_ARGS },
+ { "titlefont", cm_titlefont, BRACE_ARGS },
+ { "titlepage", cm_titlepage, NO_BRACE_ARGS },
+ { "today", cm_today, BRACE_ARGS },
+ { "top", cm_top, NO_BRACE_ARGS },
+ { "u", cm_accent, MAYBE_BRACE_ARGS },
+ { "ubaraccent", cm_accent, MAYBE_BRACE_ARGS },
+ { "udotaccent", cm_accent, MAYBE_BRACE_ARGS },
+ { "unmacro", cm_unmacro, NO_BRACE_ARGS },
+ { "unnumbered", cm_unnumbered, NO_BRACE_ARGS },
+ { "unnumberedsec", cm_unnumberedsec, NO_BRACE_ARGS },
+ { "unnumberedsubsec", cm_unnumberedsubsec, NO_BRACE_ARGS },
+ { "unnumberedsubsubsec", cm_unnumberedsubsubsec, NO_BRACE_ARGS },
+ { "uref", cm_uref, BRACE_ARGS },
+ { "url", cm_uref, BRACE_ARGS },
+ { "v", cm_accent, MAYBE_BRACE_ARGS },
+ { "value", cm_value, BRACE_ARGS },
+ { "var", cm_var, BRACE_ARGS },
+ { "verb", cm_verb, NO_BRACE_ARGS },
+ { "verbatim", cm_verbatim, NO_BRACE_ARGS },
+ { "verbatiminclude", cm_verbatiminclude, NO_BRACE_ARGS },
+ { "vindex", cm_vindex, NO_BRACE_ARGS },
+ { "vtable", cm_vtable, NO_BRACE_ARGS },
+ { "vskip", cm_ignore_line, NO_BRACE_ARGS },
+ { "w", cm_w, BRACE_ARGS },
+ { "xml", cm_xml, NO_BRACE_ARGS },
+ { "xref", cm_xref, BRACE_ARGS },
+
+ /* Deprecated commands. These used to be for italics. */
+ { "iappendix", cm_ideprecated, NO_BRACE_ARGS },
+ { "iappendixsec", cm_ideprecated, NO_BRACE_ARGS },
+ { "iappendixsection", cm_ideprecated, NO_BRACE_ARGS },
+ { "iappendixsubsec", cm_ideprecated, NO_BRACE_ARGS },
+ { "iappendixsubsubsec", cm_ideprecated, NO_BRACE_ARGS },
+ { "ichapter", cm_ideprecated, NO_BRACE_ARGS },
+ { "isection", cm_ideprecated, NO_BRACE_ARGS },
+ { "isubsection", cm_ideprecated, NO_BRACE_ARGS },
+ { "isubsubsection", cm_ideprecated, NO_BRACE_ARGS },
+ { "iunnumbered", cm_ideprecated, NO_BRACE_ARGS },
+ { "iunnumberedsec", cm_ideprecated, NO_BRACE_ARGS },
+ { "iunnumberedsubsec", cm_ideprecated, NO_BRACE_ARGS },
+ { "iunnumberedsubsubsec", cm_ideprecated, NO_BRACE_ARGS },
+
+ /* Now @include does what this was used to. */
+ { "infoinclude", cm_obsolete, NO_BRACE_ARGS },
+ { "titlespec", cm_obsolete, NO_BRACE_ARGS },
+
+ { NULL, NULL, NO_BRACE_ARGS }
+};
+
+/* The bulk of the Texinfo commands. */
+
+/* Commands which insert their own names. */
+void
+insert_self (int arg)
+{
+ if (arg == START)
+ add_word (command);
+}
+
+void
+insert_space (int arg)
+{
+ if (arg == START)
+ {
+ if (xml && !docbook)
+ xml_insert_entity ("space");
+ else
+ add_char (' ');
+ }
+}
+
+/* Insert a comma. Useful when a literal , would break our parsing of
+ multiple arguments. */
+void
+cm_comma (int arg)
+{
+ if (arg == START)
+ add_char (',');
+}
+
+
+/* Force a line break in the output. */
+void
+cm_asterisk (void)
+{
+ if (html)
+ add_word ("<br>");
+ else if (xml && !docbook)
+ xml_insert_entity ("linebreak");
+ else if (docbook)
+ xml_asterisk ();
+ else
+ {
+ close_single_paragraph ();
+ cm_noindent ();
+ }
+}
+
+/* Insert ellipsis. */
+void
+cm_dots (int arg)
+{
+ if (arg == START)
+ {
+ if (xml && !docbook)
+ xml_insert_entity ("dots");
+ else if (docbook)
+ xml_insert_entity ("hellip");
+ else
+ if (html && !in_fixed_width_font)
+ insert_string ("<small class=\"dots\">...</small>");
+ else
+ add_word ("...");
+ }
+}
+
+/* Insert ellipsis for sentence end. */
+void
+cm_enddots (int arg)
+{
+ if (arg == START)
+ {
+ if (xml && !docbook)
+ xml_insert_entity ("enddots");
+ else if (docbook)
+ {
+ xml_insert_entity ("hellip");
+ add_char ('.');
+ }
+ else
+ if (html && !in_fixed_width_font)
+ insert_string ("<small class=\"enddots\">....</small>");
+ else
+ add_word ("....");
+ }
+}
+
+void
+cm_bullet (int arg)
+{
+ if (arg == START)
+ {
+ if (html)
+ add_word ("&bull;");
+ else if (xml && !docbook)
+ xml_insert_entity ("bullet");
+ else if (docbook)
+ xml_insert_entity ("bull");
+ else
+ add_char ('*');
+ }
+}
+
+void
+cm_minus (int arg)
+{
+ if (arg == START)
+ {
+ if (xml)
+ xml_insert_entity ("minus");
+ else if (html)
+ add_word ("&minus;");
+ else
+ add_char ('-');
+ }
+}
+
+/* Formatting a dimension unit. */
+void
+cm_dmn (int arg)
+{
+ if (html)
+ insert_html_tag_with_attribute (arg, "span", "class=\"dmn\"");
+ else if (docbook)
+ /* No units in docbook yet. */
+ ;
+ else if (xml)
+ xml_insert_element (DIMENSION, arg);
+}
+
+/* Insert "TeX". */
+void
+cm_TeX (int arg)
+{
+ static int last_position;
+
+ if (arg == START)
+ {
+ if (xml)
+ xml_insert_entity ("tex");
+ else
+ add_word ("TeX");
+
+ last_position = output_paragraph_offset;
+ }
+ else if (last_position != output_paragraph_offset)
+ {
+ warning (_("arguments to @%s ignored"), command);
+ output_paragraph_offset = last_position;
+ }
+}
+
+/* Insert "LaTeX". */
+void
+cm_LaTeX (int arg)
+{
+ static int last_position;
+
+ if (arg == START)
+ {
+ if (xml)
+ xml_insert_entity ("latex");
+ else
+ add_word ("LaTeX");
+
+ last_position = output_paragraph_offset;
+ }
+ else if (last_position != output_paragraph_offset)
+ {
+ warning (_("arguments to @%s ignored"), command);
+ output_paragraph_offset = last_position;
+ }
+}
+
+/* Copyright symbol. */
+void
+cm_copyright (int arg)
+{
+ if (arg == START)
+ {
+ if (html)
+ add_word ("&copy;");
+ else if (xml && !docbook)
+ xml_insert_entity ("copyright");
+ else if (docbook)
+ xml_insert_entity ("copy");
+ else
+ add_word ("(C)");
+ }
+}
+
+/* Registered symbol. */
+void
+cm_registeredsymbol (int arg)
+{
+ if (arg == START)
+ {
+ if (html)
+ add_word ("&reg;");
+ else if (docbook)
+ xml_insert_entity ("reg");
+ else if (xml && !docbook)
+ xml_insert_entity ("registered");
+ else
+ add_word ("(R)");
+ }
+}
+
+void
+cm_today (int arg)
+{
+ static char *months[12] =
+ { N_("January"), N_("February"), N_("March"), N_("April"), N_("May"),
+ N_("June"), N_("July"), N_("August"), N_("September"), N_("October"),
+ N_("November"), N_("December") };
+ if (arg == START)
+ {
+ time_t timer = time (0);
+ struct tm *ts = localtime (&timer);
+ add_word_args ("%d %s %d", ts->tm_mday, _(months[ts->tm_mon]),
+ ts->tm_year + 1900);
+ }
+}
+
+void
+cm_comment (void)
+{
+ /* For HTML, do not output comments before HTML header is written,
+ otherwise comments before @settitle cause an empty <title> in the
+ header. */
+ if ((html && html_output_head_p) || xml)
+ {
+ char *line;
+ get_rest_of_line (0, &line);
+
+ if (strlen (line) > 0)
+ {
+ int save_inhibit_indentation = inhibit_paragraph_indentation;
+ int save_paragraph_is_open = paragraph_is_open;
+ int save_escape_html = escape_html;
+ int save_xml_no_para = xml_no_para;
+ int i;
+
+ inhibit_paragraph_indentation = 1;
+ escape_html = 0;
+ xml_no_para = 1;
+
+ /* @c and @comment can appear between @item and @itemx,
+ @deffn and @deffnx. */
+ xml_dont_touch_items_defs++;
+
+ /* Use insert for HTML, and XML when indentation is enabled.
+ For Docbook, use add_char. */
+ if (xml && xml_indentation_increment > 0
+ && output_paragraph[output_paragraph_offset-1] != '\n')
+ insert ('\n');
+
+ /* Crunch double hyphens in comments. */
+ add_html_block_elt ("<!-- ");
+ for (i = 0; i < strlen (line); i++)
+ if (line[i] != '-' || (i && line[i-1] != '-'))
+ add_char (line[i]);
+ add_word (" -->");
+
+ if (html)
+ add_char ('\n');
+
+ inhibit_paragraph_indentation = save_inhibit_indentation;
+ paragraph_is_open = save_paragraph_is_open;
+ escape_html = save_escape_html;
+ xml_no_para = save_xml_no_para;
+ xml_dont_touch_items_defs--;
+ }
+
+ free (line);
+ }
+ else
+ cm_ignore_line ();
+}
+
+
+
+/* We keep acronyms with two arguments around, to be able to refer to them
+ later with only one argument. */
+static ACRONYM_DESC *acronyms_stack = NULL;
+
+static void
+cm_acronym_or_abbr (int arg, int is_abbr)
+{
+ char *aa, *description;
+ unsigned len;
+
+ /* We do everything at START. */
+ if (arg == END)
+ return;
+
+ get_until_in_braces (",", &aa);
+ if (input_text[input_text_offset] == ',')
+ input_text_offset++;
+ get_until_in_braces ("}", &description);
+
+ canon_white (aa);
+ canon_white (description);
+
+ /* If not enclosed in braces, strip after comma to be compatible
+ with texinfo.tex. */
+ if (description[0] != '{' && strchr (description, ',') != NULL)
+ {
+ int i = 0;
+ while (description[i] != ',')
+ i++;
+ /* For now, just terminate the string at comma. */
+ description[i] = 0;
+ }
+
+ /* Get description out of braces. */
+ if (description[0] == '{')
+ description++;
+
+ len = strlen (description);
+ if (len && description[len-1] == '}')
+ description[len-1] = 0;
+
+ /* Save new description. */
+ if (strlen (description) > 0)
+ {
+ ACRONYM_DESC *new = xmalloc (sizeof (ACRONYM_DESC));
+
+ new->acronym = xstrdup (aa);
+ new->description = xstrdup (description);
+ new->next = acronyms_stack;
+ acronyms_stack = new;
+ }
+
+ if (html)
+ {
+ add_word (is_abbr ? "<abbr" : "<acronym");
+
+ if (strlen (description) > 0)
+ add_word_args (" title=\"%s\"", text_expansion (description));
+ else if (acronyms_stack)
+ {
+ /* No second argument, get from previous. Search order is from
+ last to first defined, so we get the most recent version of
+ the description. */
+ ACRONYM_DESC *temp = acronyms_stack;
+
+ while (temp)
+ {
+ if (STREQ (aa, temp->acronym)
+ && strlen (temp->description) > 0)
+ {
+ add_word_args (" title=\"%s\"",
+ text_expansion (temp->description));
+ break;
+ }
+ temp = temp->next;
+ }
+ }
+
+ add_char ('>');
+ execute_string ("%s", aa);
+ add_word (is_abbr ? "</abbr>" : "</acronym>");
+ }
+ else if (docbook)
+ {
+ xml_insert_element (is_abbr ? ABBREV : ACRONYM, START);
+ execute_string ("%s", aa);
+ xml_insert_element (is_abbr ? ABBREV : ACRONYM, END);
+ }
+ else if (xml)
+ {
+ xml_insert_element (is_abbr ? ABBREV : ACRONYM, START);
+
+ xml_insert_element (is_abbr ? ABBREVWORD : ACRONYMWORD, START);
+ execute_string ("%s", aa);
+ xml_insert_element (is_abbr ? ABBREVWORD : ACRONYMWORD, END);
+
+ if (strlen (description) > 0)
+ {
+ xml_insert_element (is_abbr ? ABBREVDESC : ACRONYMDESC, START);
+ execute_string ("%s", description);
+ xml_insert_element (is_abbr ? ABBREVDESC : ACRONYMDESC, END);
+ }
+
+ xml_insert_element (is_abbr ? ABBREV : ACRONYM, END);
+ }
+ else
+ execute_string ("%s", aa);
+
+ /* Put description into parenthesis after the acronym for all outputs
+ except XML. */
+ if (strlen (description) > 0 && (!xml || docbook))
+ add_word_args (" (%s)", description);
+}
+
+void
+cm_acronym (int arg)
+{
+ cm_acronym_or_abbr (arg, 0);
+}
+
+void
+cm_abbr (int arg)
+{
+ cm_acronym_or_abbr (arg, 1);
+}
+
+void
+cm_tt (int arg)
+{
+ /* @t{} is a no-op in Info. */
+ if (html)
+ insert_html_tag (arg, "tt");
+ else if (xml)
+ xml_insert_element (TT, arg);
+}
+
+void
+cm_code (int arg)
+{
+ if (arg == START)
+ in_fixed_width_font++;
+
+ if (xml)
+ {
+ if (STREQ (command, "command"))
+ xml_insert_element (COMMAND_TAG, arg);
+ else if (STREQ (command, "env"))
+ xml_insert_element (ENV, arg);
+ else if (STREQ (command, "file"))
+ xml_insert_element (FILE_TAG, arg);
+ else if (STREQ (command, "option"))
+ xml_insert_element (OPTION, arg);
+ else if (STREQ (command, "samp"))
+ {
+ if (docbook && arg == START)
+ {
+ /* Even though @samp is in_fixed_width_font, it
+ should always start a paragraph. Unfortunately,
+ in_fixed_width_font inhibits that. */
+ xml_start_para ();
+ xml_insert_entity ("lsquo");
+ }
+ xml_insert_element (SAMP, arg);
+ if (docbook && arg == END)
+ xml_insert_entity ("rsquo");
+ }
+ else
+ xml_insert_element (CODE, arg);
+ }
+ else if (html)
+ {
+ if (STREQ (command, "code"))
+ insert_html_tag (arg, "code");
+ else
+ { /* Use <samp> tag in general to get typewriter. */
+ if (arg == START)
+ { /* If @samp specifically, add quotes a la TeX output. */
+ if (STREQ (command, "samp")) add_char ('`');
+ add_word ("<samp>");
+ }
+ insert_html_tag_with_attribute (arg, "span", "class=\"%s\"",command);
+ if (arg == END)
+ {
+ add_word ("</samp>");
+ if (STREQ (command, "samp")) add_char ('\'');
+ }
+ }
+ }
+ else
+ {
+ extern int printing_index;
+
+ if (!printing_index)
+ {
+ if (arg == START)
+ add_char ('`');
+ else
+ add_meta_char ('\'');
+ }
+ }
+}
+
+void
+cm_kbd (int arg)
+{
+ if (xml)
+ xml_insert_element (KBD, arg);
+ else if (html)
+ { /* Seems like we should increment in_fixed_width_font for Info
+ format too, but then the quote-omitting special case gets
+ confused. Punt. */
+ if (arg == START)
+ in_fixed_width_font++;
+ insert_html_tag (arg, "kbd");
+ }
+ else
+ { /* People use @kbd in an example to get the "user input" font.
+ We don't want quotes in that case. */
+ if (!in_fixed_width_font)
+ cm_code (arg);
+ }
+}
+
+/* Just show a url (http://example.org/..., for example), don't link to it. */
+void
+cm_indicate_url (int arg, int start, int end)
+{
+ if (xml)
+ xml_insert_element (URL, arg);
+ else if (html)
+ {
+ if (arg == START)
+ add_word ("&lt;");
+ insert_html_tag (arg, "code");
+ if (arg != START)
+ add_word ("&gt;");
+ }
+ else
+ if (arg == START)
+ add_word ("<");
+ else
+ add_word (">");
+}
+
+void
+cm_key (int arg)
+{
+ if (xml)
+ xml_insert_element (KEY, arg);
+ else if (html)
+ add_word (arg == START ? "&lt;" : "&gt;");
+ else
+ add_char (arg == START ? '<' : '>');
+}
+
+/* Handle a command that switches to a non-fixed-width font. */
+void
+not_fixed_width (int arg)
+{
+ if (arg == START)
+ in_fixed_width_font = 0;
+}
+
+/* @var in makeinfo just uppercases the text. */
+void
+cm_var (int arg, int start_pos, int end_pos)
+{
+ if (xml)
+ xml_insert_element (VAR, arg);
+ else
+ {
+ not_fixed_width (arg);
+
+ if (html)
+ insert_html_tag (arg, "var");
+ else if (arg == END)
+ {
+ while (start_pos < end_pos)
+ {
+ unsigned char c = output_paragraph[start_pos];
+ if (strchr ("[](),", c))
+ warning (_("unlikely character %c in @var"), c);
+ output_paragraph[start_pos] = coerce_to_upper (c);
+ start_pos++;
+ }
+ }
+ }
+}
+
+void
+cm_sc (int arg, int start_pos, int end_pos)
+{
+ if (xml)
+ xml_insert_element (SC, arg);
+ else
+ {
+ not_fixed_width (arg);
+
+ if (arg == START)
+ {
+ if (html)
+ insert_html_tag_with_attribute (arg, "span", "class=\"sc\"");
+ }
+ else
+ {
+ int all_upper;
+
+ if (html)
+ start_pos += sizeof ("<span class=\"sc\">") - 1; /* skip <span> */
+
+ /* Avoid the warning below if there's no text inside @sc{}, or
+ when processing menus under --no-headers. */
+ all_upper = start_pos < end_pos;
+
+ while (start_pos < end_pos)
+ {
+ unsigned char c = output_paragraph[start_pos];
+ if (!isupper (c))
+ all_upper = 0;
+ if (!html)
+ output_paragraph[start_pos] = coerce_to_upper (c);
+ start_pos++;
+ }
+ if (all_upper)
+ warning (_("@sc argument all uppercase, thus no effect"));
+
+ if (html)
+ insert_html_tag (arg, "span");
+ }
+ }
+}
+
+void
+cm_dfn (int arg, int position)
+{
+ if (xml)
+ xml_insert_element (DFN, arg);
+ else
+ {
+ if (html)
+ insert_html_tag (arg, "dfn");
+ else if (arg == START)
+ add_char ('"');
+ else
+ add_meta_char ('"');
+ }
+}
+
+void
+cm_emph (int arg)
+{
+ if (xml)
+ xml_insert_element (EMPH, arg);
+ else if (html)
+ insert_html_tag (arg, "em");
+ else
+ add_char ('_');
+}
+
+void
+cm_verb (int arg)
+{
+ int character;
+ int delimiter = 0; /* avoid warning */
+ int seen_end = 0;
+
+ in_fixed_width_font++;
+ /* are these necessary ? */
+ last_char_was_newline = 0;
+
+ if (html)
+ add_word ("<tt>");
+
+ if (input_text_offset < input_text_length)
+ {
+ character = curchar ();
+ if (character == '{')
+ input_text_offset++;
+ else
+ line_error (_("`{' expected, but saw `%c'"), character);
+ }
+
+ if (input_text_offset < input_text_length)
+ {
+ delimiter = curchar ();
+ input_text_offset++;
+ }
+
+ while (input_text_offset < input_text_length)
+ {
+ character = curchar ();
+
+ if (character == '\n')
+ {
+ line_number++;
+ if (html)
+ add_word ("<br>\n");
+ }
+
+ else if (html && character == '<')
+ add_word ("&lt;");
+
+ else if (html && character == '&')
+ add_word ("&amp;");
+
+ else if (character == delimiter && input_text[input_text_offset+1] == '}')
+ { /* Assume no newlines in END_VERBATIM. */
+ seen_end = 1;
+ input_text_offset++;
+ break;
+ }
+
+ else
+ add_char (character);
+
+ input_text_offset++;
+ }
+
+ if (!seen_end)
+ warning (_("end of file inside verb block"));
+
+ if (input_text_offset < input_text_length)
+ {
+ character = curchar ();
+ if (character == '}')
+ input_text_offset++;
+ else
+ line_error (_("`}' expected, but saw `%c'"), character);
+ }
+
+ if (html)
+ add_word ("</tt>");
+
+ in_fixed_width_font--;
+}
+
+
+void
+cm_strong (int arg, int start_pos, int end_pos)
+{
+ if (docbook && arg == START)
+ xml_insert_element_with_attribute (B, arg, "role=\"bold\"");
+ else if (xml)
+ xml_insert_element (STRONG, arg);
+ else if (html)
+ insert_html_tag (arg, "strong");
+ else
+ add_char ('*');
+
+ if (!xml && !html && !docbook && !no_headers
+ && arg == END
+ && end_pos - start_pos >= 6
+ && (STRNCASEEQ ((char *) output_paragraph + start_pos, "*Note:", 6)
+ || STRNCASEEQ ((char *) output_paragraph + start_pos, "*Note ", 6)))
+ {
+ /* Translators: "Note:" is literal here and should not be
+ translated. @strong{Nota}, say, does not cause the problem. */
+ warning (_("@strong{Note...} produces a spurious cross-reference in Info; reword to avoid that"));
+ /* Adjust the output to avoid writing the bad xref. */
+ output_paragraph[start_pos + 5] = '_';
+ }
+}
+
+void
+cm_cite (int arg, int position)
+{
+ if (xml)
+ xml_insert_element (CITE, arg);
+ else if (html)
+ insert_html_tag (arg, "cite");
+ else
+ {
+ if (arg == START)
+ add_char ('`');
+ else
+ add_char ('\'');
+ }
+}
+
+/* No highlighting, but argument switches fonts. */
+void
+cm_not_fixed_width (int arg, int start, int end)
+{
+ if (xml)
+ xml_insert_element (NOTFIXEDWIDTH, arg);
+ not_fixed_width (arg);
+}
+
+void
+cm_i (int arg)
+{
+ /* Make use of <lineannotation> of Docbook, if we are
+ inside an @example or similar. */
+ extern int printing_index;
+ if (docbook && !filling_enabled && !printing_index)
+ xml_insert_element (LINEANNOTATION, arg);
+ else if (xml)
+ xml_insert_element (I, arg);
+ else if (html)
+ insert_html_tag (arg, "i");
+ else
+ not_fixed_width (arg);
+}
+
+void
+cm_slanted (int arg)
+{
+ /* Make use of <lineannotation> of Docbook, if we are
+ inside an @example or similar. */
+ extern int printing_index;
+ if (docbook && !filling_enabled && !printing_index)
+ xml_insert_element (LINEANNOTATION, arg);
+ else if (xml)
+ xml_insert_element (SLANTED, arg);
+ else if (html)
+ insert_html_tag (arg, "i");
+ else
+ not_fixed_width (arg);
+}
+
+void
+cm_b (int arg)
+{
+ /* See cm_i comments. */
+ extern int printing_index;
+ if (docbook && !filling_enabled && !printing_index)
+ xml_insert_element (LINEANNOTATION, arg);
+ else if (docbook && arg == START)
+ xml_insert_element_with_attribute (B, arg, "role=\"bold\"");
+ else if (xml)
+ xml_insert_element (B, arg);
+ else if (html)
+ insert_html_tag (arg, "b");
+ else
+ not_fixed_width (arg);
+}
+
+void
+cm_r (int arg)
+{
+ /* See cm_i comments. */
+ extern int printing_index;
+ if (docbook && !filling_enabled && !printing_index)
+ xml_insert_element (LINEANNOTATION, arg);
+ else if (xml)
+ xml_insert_element (R, arg);
+ else if (html)
+ insert_html_tag_with_attribute (arg, "span", "class=\"roman\"");
+ else
+ not_fixed_width (arg);
+}
+
+void
+cm_sansserif (int arg)
+{
+ /* See cm_i comments. */
+ extern int printing_index;
+ if (docbook && !filling_enabled && !printing_index)
+ xml_insert_element (LINEANNOTATION, arg);
+ else if (xml)
+ xml_insert_element (SANSSERIF, arg);
+ else if (html)
+ insert_html_tag_with_attribute (arg, "span", "class=\"sansserif\"");
+ else
+ not_fixed_width (arg);
+}
+
+void
+cm_titlefont (int arg)
+{
+ if (xml)
+ xml_insert_element (TITLEFONT, arg);
+ else
+ {
+ not_fixed_width (arg);
+ if (html)
+ {
+ html_title_written = 1; /* suppress title from @settitle */
+ if (arg == START)
+ add_word ("<h1 class=\"titlefont\">");
+ else
+ add_word ("</h1>\n");
+ }
+ }
+}
+
+
+/* Unfortunately, we cannot interpret @math{} contents like TeX does. We just
+ pass them through. */
+void
+cm_math (int arg)
+{
+ if (xml && !docbook)
+ xml_insert_element (MATH, arg);
+}
+
+/* Various commands are no-op's. */
+void
+cm_no_op (void)
+{
+}
+
+
+/* For proofing single chapters, etc. */
+void
+cm_novalidate (void)
+{
+ validating = 0;
+}
+
+
+/* Prevent the argument from being split across two lines. */
+void
+cm_w (int arg)
+{
+ if (arg == START)
+ non_splitting_words++;
+ else
+ {
+ if (docbook || html || xml)
+ /* This is so @w{$}Log$ doesn't end up as <dollar>Log<dollar>
+ in the output. */
+ insert_string ("<!-- /@w -->");
+
+ non_splitting_words--;
+ }
+}
+
+
+/* An unbreakable word space. Same as @w{ } for makeinfo, but different
+ for TeX (the space stretches and stretches, and does not inhibit
+ hyphenation). */
+void
+cm_tie (int arg)
+{
+ if (arg == START)
+ {
+ cm_w (START);
+ add_char (' ');
+ }
+ else
+ cm_w (END);
+}
+
+/* Explain that this command is obsolete, thus the user shouldn't
+ do anything with it. */
+static void
+cm_obsolete (int arg, int start, int end)
+{
+ if (arg == START)
+ warning (_("%c%s is obsolete"), COMMAND_PREFIX, command);
+}
+
+
+/* Inhibit the indentation of the next paragraph, but not of following
+ paragraphs. */
+void
+cm_noindent (void)
+{
+ if (!inhibit_paragraph_indentation)
+ inhibit_paragraph_indentation = -1;
+}
+
+void
+cm_noindent_cmd (void)
+{
+ cm_noindent ();
+ xml_no_indent = 1;
+ skip_whitespace_and_newlines();
+
+ if (xml)
+ xml_start_para ();
+ else if (html && !paragraph_is_open)
+ add_html_block_elt ("<p class=\"noindent\">");
+ else
+ {
+ paragraph_is_open = 0;
+ start_paragraph ();
+ }
+}
+
+/* Force indentation of the next paragraph. */
+void
+cm_indent (void)
+{
+ inhibit_paragraph_indentation = 0;
+ xml_no_indent = 0;
+ skip_whitespace_and_newlines();
+
+ if (xml)
+ xml_start_para ();
+ else if (html && !paragraph_is_open)
+ add_html_block_elt ("<p class=\"indent\">");
+ else
+ start_paragraph ();
+}
+
+/* I don't know exactly what to do with this. Should I allow
+ someone to switch filenames in the middle of output? Since the
+ file could be partially written, this doesn't seem to make sense.
+ Another option: ignore it, since they don't really want to
+ switch files. Finally, complain, or at least warn. It doesn't
+ really matter, anyway, since this doesn't get executed. */
+void
+cm_setfilename (void)
+{
+ char *filename;
+ get_rest_of_line (1, &filename);
+ /* warning ("`@%s %s' encountered and ignored", command, filename); */
+ if (xml)
+ add_word_args ("<setfilename>%s</setfilename>", filename);
+ free (filename);
+}
+
+void
+cm_settitle (void)
+{
+ if (xml)
+ {
+ xml_begin_document (current_output_filename);
+ xml_insert_element (SETTITLE, START);
+ xml_in_book_title = 1;
+ get_rest_of_line (0, &title);
+ execute_string ("%s", title);
+ xml_in_book_title = 0;
+ xml_insert_element (SETTITLE, END);
+ }
+ else
+ get_rest_of_line (0, &title);
+}
+
+
+/* Ignore argument in braces. */
+void
+cm_ignore_arg (int arg, int start_pos, int end_pos)
+{
+ if (arg == END)
+ output_paragraph_offset = start_pos;
+}
+
+/* Ignore argument on rest of line. */
+void
+cm_ignore_line (void)
+{
+ discard_until ("\n");
+}
+
+/* Insert the number of blank lines passed as argument. */
+void
+cm_sp (void)
+{
+ int lines;
+ char *line;
+
+ /* Due to tricky stuff in execute_string(), @value{} can't be expanded.
+ So there is really no reason to enable expansion for @sp parameters. */
+ get_rest_of_line (0, &line);
+
+ if (sscanf (line, "%d", &lines) != 1 || lines <= 0)
+ line_error (_("@sp requires a positive numeric argument, not `%s'"), line);
+ else
+ {
+ if (xml)
+ {
+ /* @sp can appear between @item and @itemx, @deffn and @deffnx. */
+ xml_dont_touch_items_defs++;
+ xml_insert_element_with_attribute (SP, START, "lines=\"%s\"", line);
+ /* insert_string (line);*/
+ xml_insert_element (SP, END);
+ xml_dont_touch_items_defs--;
+ }
+ else
+ {
+ /* Must disable filling since otherwise multiple newlines is like
+ multiple spaces. Must close paragraph since that's what the
+ manual says and that's what TeX does. */
+ int save_filling_enabled = filling_enabled;
+ filling_enabled = 0;
+
+ /* close_paragraph generates an extra blank line. */
+ close_single_paragraph ();
+
+ if (lines && html && !executing_string)
+ html_output_head ();
+
+ if (html)
+ add_html_block_elt ("<pre class=\"sp\">\n");
+
+ while (lines--)
+ add_char ('\n');
+
+ if (html)
+ add_html_block_elt ("</pre>\n");
+
+ filling_enabled = save_filling_enabled;
+ }
+ }
+ free (line);
+}
+
+/* @dircategory LINE outputs INFO-DIR-SECTION LINE, unless --no-headers. */
+void
+cm_dircategory (void)
+{
+ char *line;
+
+ if (html || docbook)
+ cm_ignore_line ();
+ else if (xml)
+ {
+ xml_insert_element (DIRCATEGORY, START);
+ get_rest_of_line (1, &line);
+ insert_string (line);
+ free (line);
+ xml_insert_element (DIRCATEGORY, END);
+ }
+ else
+ {
+ get_rest_of_line (1, &line);
+
+ if (!no_headers && !html)
+ {
+ kill_self_indent (-1); /* make sure there's no indentation */
+ insert_string ("INFO-DIR-SECTION ");
+ insert_string (line);
+ insert ('\n');
+ }
+
+ free (line);
+ }
+}
+
+/* Start a new line with just this text on it.
+ Then center the line of text.
+ */
+void
+cm_center (void)
+{
+ if (xml)
+ {
+ char *line;
+ xml_insert_element (CENTER, START);
+ get_rest_of_line (0, &line);
+ execute_string ("%s", line);
+ free (line);
+ xml_insert_element (CENTER, END);
+ }
+ else
+ {
+ int i, start, length;
+ char *line;
+ int save_indented_fill = indented_fill;
+ int save_filling_enabled = filling_enabled;
+ int fudge_factor = 1;
+
+ filling_enabled = indented_fill = 0;
+ cm_noindent ();
+ start = output_paragraph_offset;
+
+ if (html)
+ add_html_block_elt ("<div align=\"center\">");
+
+ inhibit_output_flushing ();
+ get_rest_of_line (0, &line);
+ execute_string ("%s", line);
+ free (line);
+ uninhibit_output_flushing ();
+ if (html)
+ add_html_block_elt ("</div>");
+
+ else
+ {
+ i = output_paragraph_offset - 1;
+ while (i > (start - 1) && output_paragraph[i] == '\n')
+ i--;
+
+ output_paragraph_offset = ++i;
+ length = output_paragraph_offset - start;
+
+ if (length < (fill_column - fudge_factor))
+ {
+ line = xmalloc (1 + length);
+ memcpy (line, (char *)(output_paragraph + start), length);
+
+ i = (fill_column - fudge_factor - length) / 2;
+ output_paragraph_offset = start;
+
+ while (i--)
+ insert (' ');
+
+ for (i = 0; i < length; i++)
+ insert (line[i]);
+
+ free (line);
+ }
+ }
+
+ insert ('\n');
+ filling_enabled = save_filling_enabled;
+ indented_fill = save_indented_fill;
+ close_single_paragraph ();
+ if (looking_at("\n"))
+ insert ('\n');
+ }
+}
+
+/* Show what an expression returns. */
+void
+cm_result (int arg)
+{
+ if (arg == END)
+ add_word (html ? "=&gt;" : "=>");
+}
+
+/* What an expression expands to. */
+void
+cm_expansion (int arg)
+{
+ if (arg == END)
+ add_word (html ? "==&gt;" : "==>");
+}
+
+/* Indicates two expressions are equivalent. */
+void
+cm_equiv (int arg)
+{
+ if (arg == END)
+ add_word ("==");
+}
+
+/* What an expression may print. */
+void
+cm_print (int arg)
+{
+ if (arg == END)
+ add_word ("-|");
+}
+
+/* An error signaled. */
+void
+cm_error (int arg)
+{
+ if (arg == END)
+ add_word (html ? "error--&gt;" : "error-->");
+}
+
+/* The location of point in an example of a buffer. */
+void
+cm_point (int arg)
+{
+ if (arg == END)
+ add_word ("-!-");
+}
+
+/* @exdent: Start a new line with just this text on it.
+ The text is outdented one level if possible. */
+void
+cm_exdent (void)
+{
+ char *line;
+ int save_indent = current_indent;
+ int save_in_fixed_width_font = in_fixed_width_font;
+
+ /* Read argument. */
+ get_rest_of_line (0, &line);
+
+ /* Exdent the output. Actually this may be a no-op. */
+ if (current_indent)
+ current_indent -= default_indentation_increment;
+
+ /* @exdent arg is supposed to be in roman. */
+ in_fixed_width_font = 0;
+
+ /* The preceding newline already inserted the `current_indent'.
+ Remove one level's worth. */
+ kill_self_indent (default_indentation_increment);
+
+ if (html)
+ add_word ("<br>");
+ else if (docbook)
+ xml_insert_element (LINEANNOTATION, START);
+ else if (xml)
+ xml_insert_element (EXDENT, START);
+
+ /* Can't close_single_paragraph, then we lose preceding blank lines. */
+ flush_output ();
+ execute_string ("%s", line);
+ free (line);
+
+ if (html)
+ add_word ("<br>");
+ else if (xml)
+ {
+ xml_insert_element (docbook ? LINEANNOTATION : EXDENT, END);
+ insert ('\n');
+ }
+
+ close_single_paragraph ();
+
+ current_indent = save_indent;
+ in_fixed_width_font = save_in_fixed_width_font;
+ if (!xml)
+ start_paragraph ();
+}
+
+/*
+ Read include-filename, process the include-file:
+ verbatim_include == 0: process through reader_loop
+ verbatim_include != 0: process through handle_verbatim_environment
+ */
+static void
+handle_include (int verbatim_include)
+{
+ char *arg, *filename;
+
+ if (macro_expansion_output_stream && !executing_string)
+ me_append_before_this_command ();
+
+ if (!insertion_stack)
+ close_paragraph (); /* No blank lines etc. if not at outer level. */
+
+ get_rest_of_line (0, &arg);
+ /* We really only want to expand @value, but it's easier to just do
+ everything. TeX will only work with @value. */
+ filename = text_expansion (arg);
+ free (arg);
+
+ if (macro_expansion_output_stream && !executing_string)
+ remember_itext (input_text, input_text_offset);
+
+ pushfile ();
+
+ /* In verbose mode we print info about including another file. */
+ if (verbose_mode)
+ {
+ int i = 0;
+ FSTACK *stack = filestack;
+
+ for (i = 0, stack = filestack; stack; stack = stack->next, i++);
+
+ i *= 2;
+
+ printf ("%*s", i, "");
+ printf ("%c%s `%s'\n", COMMAND_PREFIX, command, filename);
+ fflush (stdout);
+ }
+
+ if (!find_and_load (filename, 1))
+ {
+ popfile ();
+ line_number--;
+
+ /* /wh/bar:5: @include/@verbatiminclude `foo': No such file or dir */
+ line_error ("%c%s `%s': %s", COMMAND_PREFIX, command, filename,
+ strerror (errno));
+
+ free (filename);
+ return;
+ }
+ else
+ {
+ if (macro_expansion_output_stream && !executing_string)
+ remember_itext (input_text, input_text_offset);
+
+ if (!verbatim_include)
+ reader_loop ();
+ else
+ handle_verbatim_environment (0);
+ }
+ free (filename);
+ popfile ();
+}
+
+
+/* Include file as if put in @verbatim environment */
+void
+cm_verbatiminclude (void)
+{
+ handle_include (1);
+}
+
+
+/* Remember this file, and move onto the next. */
+void
+cm_include (void)
+{
+ handle_include (0);
+}
+
+
+/* @bye: Signals end of processing. Easy to make this happen. */
+
+void
+cm_bye (void)
+{
+ discard_braces (); /* should not have any unclosed braces left */
+ input_text_offset = input_text_length;
+}
+
+/* @paragraphindent */
+
+static void
+cm_paragraphindent (void)
+{
+ char *arg;
+
+ get_rest_of_line (1, &arg);
+ if (set_paragraph_indent (arg) != 0)
+ line_error (_("Bad argument to %c%s"), COMMAND_PREFIX, command);
+
+ free (arg);
+}
+
+
+/* @exampleindent: change indentation of example-like environments. */
+static int
+set_example_indentation_increment (char *string)
+{
+ if (strcmp (string, "asis") == 0 || strcmp (string, _("asis")) == 0)
+ ;
+ else if (strcmp (string, "none") == 0 || strcmp (string, _("none")) == 0)
+ example_indentation_increment = 0;
+ else if (sscanf (string, "%d", &example_indentation_increment) != 1)
+ return -1;
+ return 0;
+}
+
+static void
+cm_exampleindent (void)
+{
+ char *arg;
+
+ get_rest_of_line (1, &arg);
+ if (set_example_indentation_increment (arg) != 0)
+ line_error (_("Bad argument to @%s"), command);
+
+ if (input_text[input_text_offset] == '\n')
+ close_single_paragraph ();
+
+ free (arg);
+}
+
+
+/* @firstparagraphindent: suppress indentation in first paragraphs after
+ headings. */
+static int
+set_firstparagraphindent (char *string)
+{
+ if (STREQ (string, "insert") || STREQ (string, _("insert")))
+ do_first_par_indent = 1;
+ else if (STREQ (string, "none") || STREQ (string, _("none")))
+ do_first_par_indent = 0;
+ else
+ return -1;
+ return 0;
+}
+
+static void
+cm_firstparagraphindent (void)
+{
+ char *arg;
+
+ get_rest_of_line (1, &arg);
+ if (set_firstparagraphindent (arg) != 0)
+ line_error (_("Bad argument to %c%s"), COMMAND_PREFIX, command);
+
+ free (arg);
+}
+
+/* For DocBook and XML, produce &period; for `.@:'. This gives the processing
+ software a fighting chance to treat it specially by not adding extra space.
+
+ Do this also for ?, !, and :. */
+void
+cm_colon (void)
+{
+ if (xml)
+ {
+ if (strchr (".?!:", input_text[input_text_offset-3]) != NULL)
+ {
+ /* Erase literal character that's there, except `>', which is
+ part of the XML tag. */
+ if (output_paragraph[output_paragraph_offset-1] != '>')
+ output_paragraph_offset--;
+
+ switch (input_text[input_text_offset-3])
+ {
+ case '.':
+ xml_insert_entity ("period");
+ break;
+ case '?':
+ xml_insert_entity ("quest");
+ break;
+ case '!':
+ xml_insert_entity ("excl");
+ break;
+ case ':':
+ xml_insert_entity ("colon");
+ break;
+ }
+ }
+ }
+}
+
+/* Ending sentences explicitly. Currently, only outputs entities for XML
+ output, for other formats it calls insert_self. */
+void
+cm_punct (int arg)
+{
+ if (xml && !docbook)
+ {
+ switch (input_text[input_text_offset-1])
+ {
+ case '.':
+ xml_insert_entity ("eosperiod");
+ break;
+ case '?':
+ xml_insert_entity ("eosquest");
+ break;
+ case '!':
+ xml_insert_entity ("eosexcl");
+ break;
+ }
+ }
+ else
+ {
+ insert_self (arg);
+ }
+}
diff --git a/Build/source/utils/texinfo/makeinfo/cmds.h b/Build/source/utils/texinfo/makeinfo/cmds.h
new file mode 100644
index 00000000000..68245505b51
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/cmds.h
@@ -0,0 +1,213 @@
+/* cmds.h -- declarations for cmds.c.
+ $Id: cmds.h,v 1.9 2004/11/26 00:48:35 karl Exp $
+
+ Copyright (C) 1998, 1999, 2002, 2003, 2004 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef CMDS_H
+#define CMDS_H
+
+/* The three arguments a command can get are a flag saying whether it is
+ before argument parsing (START) or after (END), the starting position
+ of the arguments, and the ending position. */
+typedef void COMMAND_FUNCTION (); /* So we can say COMMAND_FUNCTION *foo; */
+
+/* Each command has an associated function. When the command is
+ encountered in the text, the associated function is called with START
+ as the argument. If the function expects arguments in braces, it
+ remembers itself on the stack. When the corresponding close brace is
+ encountered, the function is called with END as the argument. */
+#define START 0
+#define END 1
+
+/* Does the command expect braces? */
+#define NO_BRACE_ARGS 0
+#define BRACE_ARGS 1
+#define MAYBE_BRACE_ARGS 2
+
+typedef struct
+{
+ char *name;
+ COMMAND_FUNCTION *proc;
+ int argument_in_braces;
+} COMMAND;
+
+extern COMMAND command_table[];
+
+typedef struct acronym_desc
+{
+ struct acronym_desc *next;
+ char *acronym;
+ char *description;
+} ACRONYM_DESC;
+
+/* Texinfo commands. */
+extern void insert_self (int arg),
+ insert_space (int arg),
+ cm_ignore_line (void),
+ cm_ignore_arg (int arg, int start_pos, int end_pos),
+ cm_comment (void),
+ cm_no_op (void);
+
+/* Document structure and meta information. */
+extern void cm_setfilename (void),
+ cm_settitle (void),
+ cm_documentdescription (void),
+ cm_node (void),
+ cm_menu (void),
+ cm_detailmenu (void),
+ cm_dircategory (void),
+ cm_direntry (void),
+ cm_bye (void);
+
+/* File inclusion. */
+extern void cm_include (void),
+ cm_verbatiminclude (void);
+
+/* Cross referencing commands. */
+extern void cm_anchor (int arg),
+ cm_xref (int arg),
+ cm_pxref (int arg),
+ cm_ref (int arg),
+ cm_inforef (int arg),
+ cm_uref (int arg);
+
+/* Special insertions. */
+extern void cm_LaTeX (int arg),
+ cm_TeX (int arg),
+ cm_bullet (int arg),
+ cm_colon (void),
+ cm_comma (int arg),
+ cm_copyright (int arg),
+ cm_dots (int arg),
+ cm_enddots (int arg),
+ cm_equiv (int arg),
+ cm_error (int arg),
+ cm_expansion (int arg),
+ cm_image (int arg),
+ cm_insert_copying (void),
+ cm_minus (int arg),
+ cm_point (int arg),
+ cm_print (int arg),
+ cm_punct (int arg),
+ cm_registeredsymbol (int arg),
+ cm_result (int arg);
+
+/* Emphasis and markup. */
+extern void cm_acronym (int arg),
+ cm_abbr (int arg),
+ cm_b (int arg),
+ cm_cite (int arg, int position),
+ cm_code (int arg),
+ cm_dfn (int arg, int position),
+ cm_dmn (int arg),
+ cm_email (int arg),
+ cm_emph (int arg),
+ cm_i (int arg),
+ cm_kbd (int arg),
+ cm_key (int arg),
+ cm_math (int arg),
+ cm_not_fixed_width (int arg, int start, int end),
+ cm_r (int arg),
+ cm_sansserif (int arg),
+ cm_sc (int arg, int start_pos, int end_pos),
+ cm_slanted (int arg),
+ cm_strong (int arg, int start_pos, int end_pos),
+ cm_tt (int arg),
+ cm_indicate_url (int arg, int start, int end),
+ cm_var (int arg, int start_pos, int end_pos),
+ cm_verb (int arg);
+
+/* Block environments. */
+extern void cm_cartouche (void),
+ cm_group (void),
+ cm_display (void),
+ cm_smalldisplay (void),
+ cm_example (void),
+ cm_smallexample (void),
+ cm_smalllisp (void),
+ cm_lisp (void),
+ cm_format (void),
+ cm_smallformat (void),
+ cm_quotation (void),
+ cm_copying (void),
+ cm_flushleft (void),
+ cm_flushright (void),
+ cm_verbatim (void),
+ cm_end (void);
+
+/* Tables, lists, enumerations. */
+extern void cm_table (void),
+ cm_ftable (void),
+ cm_vtable (void),
+ cm_itemize (void),
+ cm_enumerate (void),
+ cm_multitable (void),
+ cm_headitem (void),
+ cm_item (void),
+ cm_itemx (void),
+ cm_tab (void);
+
+extern void cm_center (void),
+ cm_exdent (void),
+ cm_indent (void),
+ cm_noindent (void),
+ cm_noindent_cmd (void);
+
+/* Line and page breaks. */
+extern void cm_asterisk (void),
+ cm_sp (void),
+ cm_page (void);
+
+/* Non breaking words. */
+extern void cm_tie (int arg),
+ cm_w (int arg);
+
+/* Title page creation. */
+extern void cm_titlepage (void),
+ cm_author (void),
+ cm_titlepage_cmds (void),
+ cm_titlefont (int arg),
+ cm_today (int arg);
+
+/* Floats. */
+extern void cm_float (void),
+ cm_caption (int arg),
+ cm_shortcaption (void),
+ cm_listoffloats (void);
+
+/* Indices. */
+extern void cm_kindex (void),
+ cm_cindex (void),
+ cm_findex (void),
+ cm_pindex (void),
+ cm_vindex (void),
+ cm_tindex (void),
+ cm_defindex (void),
+ cm_defcodeindex (void),
+ cm_synindex (void),
+ cm_printindex (void);
+
+/* Conditionals. */
+extern void cm_set (void),
+ cm_clear (void),
+ cm_ifset (void),
+ cm_ifclear (void),
+ cm_ifeq (void),
+ cm_value (int arg, int start_pos, int end_pos);
+
+#endif /* !CMDS_H */
diff --git a/Build/source/utils/texinfo/makeinfo/defun.c b/Build/source/utils/texinfo/makeinfo/defun.c
new file mode 100644
index 00000000000..0323353edf5
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/defun.c
@@ -0,0 +1,720 @@
+/* defun.c -- @defun and friends.
+ $Id: defun.c,v 1.11 2004/04/11 17:56:46 karl Exp $
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "defun.h"
+#include "xml.h"
+#include "insertion.h"
+#include "makeinfo.h"
+#include "cmds.h"
+#include "html.h"
+
+
+#define DEFUN_SELF_DELIMITING(c) \
+ ((c) == '(' || (c) == ')' || (c) == '[' || (c) == ']')
+
+struct token_accumulator
+{
+ unsigned int length;
+ unsigned int index;
+ char **tokens;
+};
+
+static void
+initialize_token_accumulator (struct token_accumulator *accumulator)
+{
+ accumulator->length = 0;
+ accumulator->index = 0;
+ accumulator->tokens = NULL;
+}
+
+static void
+accumulate_token (struct token_accumulator *accumulator, char *token)
+{
+ if (accumulator->index >= accumulator->length)
+ {
+ accumulator->length += 10;
+ accumulator->tokens = xrealloc (accumulator->tokens,
+ (accumulator->length * sizeof (char *)));
+ }
+ accumulator->tokens[accumulator->index] = token;
+ accumulator->index += 1;
+}
+
+/* Given STRING_POINTER pointing at an open brace, skip forward and return a
+ pointer to just past the matching close brace. */
+static int
+scan_group_in_string (char **string_pointer)
+{
+ char *scan_string = (*string_pointer) + 1;
+ unsigned int level = 1;
+ int started_command = 0;
+
+ for (;;)
+ {
+ int c;
+ if (level == 0)
+ {
+ *string_pointer = scan_string;
+ return 1;
+ }
+ c = *scan_string++;
+ if (c == 0)
+ {
+ /* Tweak line_number to compensate for fact that
+ we gobbled the whole line before coming here. */
+ line_number--;
+ line_error (_("Missing `}' in @def arg"));
+ line_number++;
+ *string_pointer = scan_string - 1;
+ return 0;
+ }
+
+ if (c == '{' && !started_command)
+ level++;
+ if (c == '}' && !started_command)
+ level--;
+
+ /* remember if at @. */
+ started_command = (c == '@' && !started_command);
+ }
+}
+
+/* Return a list of tokens from the contents of STRING.
+ Commands and brace-delimited groups count as single tokens.
+ Contiguous whitespace characters are converted to a token
+ consisting of a single space. */
+static char **
+args_from_string (char *string)
+{
+ struct token_accumulator accumulator;
+ char *token_start, *token_end;
+ char *scan_string = string;
+
+ initialize_token_accumulator (&accumulator);
+
+ while (*scan_string)
+ { /* Replace arbitrary whitespace by a single space. */
+ if (whitespace (*scan_string))
+ {
+ scan_string += 1;
+ while (whitespace (*scan_string))
+ scan_string += 1;
+ accumulate_token ((&accumulator), (xstrdup (" ")));
+ continue;
+ }
+
+ /* Commands count as single tokens. */
+ if (*scan_string == COMMAND_PREFIX)
+ {
+ token_start = scan_string;
+ scan_string += 1;
+ if (self_delimiting (*scan_string))
+ scan_string += 1;
+ else
+ {
+ int c;
+ while (1)
+ {
+ c = *scan_string++;
+
+ if ((c == 0) || (c == '{') || (whitespace (c)))
+ {
+ scan_string -= 1;
+ break;
+ }
+ }
+
+ if (*scan_string == '{')
+ {
+ char *s = scan_string;
+ (void) scan_group_in_string (&s);
+ scan_string = s;
+ }
+ }
+ token_end = scan_string;
+ }
+
+ /* Parentheses and brackets are self-delimiting. */
+ else if (DEFUN_SELF_DELIMITING (*scan_string))
+ {
+ token_start = scan_string;
+ scan_string += 1;
+ token_end = scan_string;
+ }
+
+ /* Open brace introduces a group that is a single token. */
+ else if (*scan_string == '{')
+ {
+ char *s = scan_string;
+ int balanced = scan_group_in_string (&s);
+
+ token_start = scan_string + 1;
+ scan_string = s;
+ token_end = balanced ? (scan_string - 1) : scan_string;
+ }
+
+ /* Make commas separate tokens so to differentiate them from
+ parameter types in XML output. */
+ else if (*scan_string == ',')
+ {
+ token_start = scan_string;
+ scan_string += 1;
+ token_end = scan_string;
+ }
+
+ /* Otherwise a token is delimited by whitespace, parentheses,
+ brackets, or braces. A token is also ended by a command. */
+ else
+ {
+ token_start = scan_string;
+
+ for (;;)
+ {
+ int c;
+
+ c = *scan_string++;
+
+ /* Do not back up if we're looking at a }; since the only
+ valid }'s are those matched with {'s, we want to give
+ an error. If we back up, we go into an infinite loop. */
+ if (!c || whitespace (c) || DEFUN_SELF_DELIMITING (c)
+ || c == '{')
+ {
+ scan_string--;
+ break;
+ }
+
+ /* End token if we are looking at a comma, as commas are
+ delimiters too. */
+ if (c == ',')
+ {
+ scan_string--;
+ break;
+ }
+
+ /* If we encounter a command embedded within a token,
+ then end the token. */
+ if (c == COMMAND_PREFIX)
+ {
+ scan_string--;
+ break;
+ }
+ }
+ token_end = scan_string;
+ }
+
+ accumulate_token (&accumulator, substring (token_start, token_end));
+ }
+ accumulate_token (&accumulator, NULL);
+ return accumulator.tokens;
+}
+
+static void
+process_defun_args (char **defun_args, int auto_var_p)
+{
+ int pending_space = 0;
+
+ if (xml)
+ {
+ xml_process_defun_args (defun_args, auto_var_p);
+ return;
+ }
+
+ for (;;)
+ {
+ char *defun_arg = *defun_args++;
+
+ if (defun_arg == NULL)
+ break;
+
+ if (defun_arg[0] == ' ')
+ {
+ pending_space = 1;
+ continue;
+ }
+
+ if (pending_space)
+ {
+ add_char (' ');
+ pending_space = 0;
+ }
+
+ if (DEFUN_SELF_DELIMITING (defun_arg[0]))
+ {
+ /* Within @deffn and friends, texinfo.tex makes parentheses
+ sans serif and brackets bold. We use roman instead. */
+ if (html)
+ insert_html_tag (START, "");
+
+ add_char (defun_arg[0]);
+
+ if (html)
+ insert_html_tag (END, "");
+ }
+ /* else if (defun_arg[0] == '&' || defun_arg[0] == COMMAND_PREFIX) */
+ /* execute_string ("%s", defun_arg); */
+ /* else if (auto_var_p) */
+ /* execute_string ("%s", defun_arg); */
+ else
+ execute_string ("%s", defun_arg);
+ }
+}
+
+static char *
+next_nonwhite_defun_arg (char ***arg_pointer)
+{
+ char **scan = (*arg_pointer);
+ char *arg = (*scan++);
+
+ if ((arg != 0) && (*arg == ' '))
+ arg = *scan++;
+
+ if (arg == 0)
+ scan -= 1;
+
+ *arg_pointer = scan;
+
+ return (arg == 0) ? "" : arg;
+}
+
+
+/* This is needed also in insertion.c. */
+
+enum insertion_type
+get_base_type (int type)
+{
+ int base_type;
+ switch (type)
+ {
+ case defivar: base_type = defcv; break;
+ case defmac: base_type = deffn; break;
+ case defmethod: base_type = defop; break;
+ case defopt: base_type = defvr; break;
+ case defspec: base_type = deffn; break;
+ case deftypecv: base_type = deftypecv; break;
+ case deftypefun: base_type = deftypefn; break;
+ case deftypeivar: base_type = deftypeivar; break;
+ case deftypemethod: base_type = deftypemethod; break;
+ case deftypeop: base_type = deftypeop; break;
+ case deftypevar: base_type = deftypevr; break;
+ case defun: base_type = deffn; break;
+ case defvar: base_type = defvr; break;
+ default:
+ base_type = type;
+ break;
+ }
+
+ return base_type;
+}
+
+/* Make the defun type insertion.
+ TYPE says which insertion this is.
+ X_P, if nonzero, says not to start a new insertion. */
+static void
+defun_internal (int type, int x_p)
+{
+ int base_type;
+ char **defun_args, **scan_args;
+ const char *category;
+ char *defined_name;
+ char *type_name = NULL;
+ char *type_name2 = NULL;
+
+ {
+ char *line;
+
+ /* The @def.. line is the only place in Texinfo where you are
+ allowed to use unquoted braces that don't delimit arguments of
+ a command or a macro; in any other place it will trigger an
+ error message from the reader loop. The special handling of
+ this case inside `args_from_string' is an extra special hack
+ which allows this. The side effect is that if we try to expand
+ the rest of the line below, the recursive reader loop will
+ signal an error if there are brace-delimited arguments on that line.
+
+ The best solution to this would be to change the syntax of
+ @def.. commands so that it doesn't violate Texinfo's own rules.
+ But it's probably too late for this now, as it will break a lot
+ of existing manuals.
+
+ Unfortunately, this means that you can't call macros, use @value, etc.
+ inside @def.. commands, sigh. */
+ get_rest_of_line (0, &line);
+
+ /* Basic line continuation. If a line ends with \s*@\s* concatanate
+ the next line. */
+ {
+ char *next_line, *new_line;
+ int i;
+
+ line_continuation:
+ i = strlen (line) - 1;
+
+ if (line[i] == '@' && line[i-1] != '@')
+ {
+ get_rest_of_line (0, &next_line);
+ new_line = (char *) xmalloc (i + strlen (next_line) + 2);
+ strncpy (new_line, line, i);
+ new_line[i] = '\0';
+ free (line);
+ strcat (new_line, " ");
+ strcat (new_line, next_line);
+ line = xstrdup (new_line);
+ free (next_line);
+ free (new_line);
+
+ goto line_continuation;
+ }
+ }
+
+ defun_args = (args_from_string (line));
+ free (line);
+ }
+
+ scan_args = defun_args;
+
+ /* Get base type and category string. */
+ base_type = get_base_type (type);
+
+ /* xx all these const strings should be determined upon
+ documentlanguage argument and NOT via gettext (kama). */
+ switch (type)
+ {
+ case defun:
+ case deftypefun:
+ category = _("Function");
+ break;
+ case defmac:
+ category = _("Macro");
+ break;
+ case defspec:
+ category = _("Special Form");
+ break;
+ case defvar:
+ case deftypevar:
+ category = _("Variable");
+ break;
+ case defopt:
+ category = _("User Option");
+ break;
+ case defivar:
+ case deftypeivar:
+ category = _("Instance Variable");
+ break;
+ case defmethod:
+ case deftypemethod:
+ category = _("Method");
+ break;
+ default:
+ category = next_nonwhite_defun_arg (&scan_args);
+ break;
+ }
+
+ /* The class name. */
+ if ((base_type == deftypecv)
+ || (base_type == deftypefn)
+ || (base_type == deftypevr)
+ || (base_type == defcv)
+ || (base_type == defop)
+ || (base_type == deftypeivar)
+ || (base_type == deftypemethod)
+ || (base_type == deftypeop)
+ )
+ type_name = next_nonwhite_defun_arg (&scan_args);
+
+ /* The type name for typed languages. */
+ if ((base_type == deftypecv)
+ || (base_type == deftypeivar)
+ || (base_type == deftypemethod)
+ || (base_type == deftypeop)
+ )
+ type_name2 = next_nonwhite_defun_arg (&scan_args);
+
+ /* The function or whatever that's actually being defined. */
+ defined_name = next_nonwhite_defun_arg (&scan_args);
+
+ /* This hack exists solely for the purposes of formatting the Texinfo
+ manual. I couldn't think of a better way. The token might be a
+ simple @@ followed immediately by more text. If this is the case,
+ then the next defun arg is part of this one, and we should
+ concatenate them. */
+ if (*scan_args && **scan_args && !whitespace (**scan_args)
+ && STREQ (defined_name, "@@"))
+ {
+ char *tem = xmalloc (3 + strlen (scan_args[0]));
+
+ sprintf (tem, "@@%s", scan_args[0]);
+
+ free (scan_args[0]);
+ scan_args[0] = tem;
+ scan_args++;
+ defined_name = tem;
+ }
+
+ /* It's easy to write @defun foo(arg1 arg2), but a following ( is
+ misparsed by texinfo.tex and this is next to impossible to fix.
+ Warn about it. */
+ if (*scan_args && **scan_args && **scan_args == '(')
+ warning ("`%c' follows defined name `%s' instead of whitespace",
+ **scan_args, defined_name);
+
+ if (!x_p)
+ begin_insertion (type);
+
+ /* Write the definition header line.
+ This should start at the normal indentation. */
+ current_indent -= default_indentation_increment;
+ start_paragraph ();
+
+ if (!html && !xml)
+ switch (base_type)
+ {
+ case deffn:
+ case defvr:
+ case deftp:
+ execute_string (" --- %s: %s", category, defined_name);
+ break;
+ case deftypefn:
+ case deftypevr:
+ execute_string (" --- %s: %s %s", category, type_name, defined_name);
+ break;
+ case defcv:
+ execute_string (" --- %s %s %s: %s", category, _("of"), type_name,
+ defined_name);
+ break;
+ case deftypecv:
+ case deftypeivar:
+ execute_string (" --- %s %s %s: %s %s", category, _("of"), type_name,
+ type_name2, defined_name);
+ break;
+ case defop:
+ execute_string (" --- %s %s %s: %s", category, _("on"), type_name,
+ defined_name);
+ break;
+ case deftypeop:
+ execute_string (" --- %s %s %s: %s %s", category, _("on"), type_name,
+ type_name2, defined_name);
+ break;
+ case deftypemethod:
+ execute_string (" --- %s %s %s: %s %s", category, _("on"), type_name,
+ type_name2, defined_name);
+ break;
+ }
+ else if (html)
+ {
+ /* If this is not a @def...x version, it could only
+ be a normal version @def.... So start the table here. */
+ if (!x_p)
+ insert_string ("<div class=\"defun\">\n");
+ else
+ rollback_empty_tag ("blockquote");
+
+ /* xx The single words (on, off) used here, should depend on
+ documentlanguage and NOT on gettext --kama. */
+ switch (base_type)
+ {
+ case deffn:
+ case defvr:
+ case deftp:
+ case deftypefn:
+ case deftypevr:
+ execute_string ("--- %s: ", category);
+ break;
+
+ case defcv:
+ case deftypecv:
+ case deftypeivar:
+ execute_string ("--- %s %s %s: ", category, _("of"), type_name);
+ break;
+
+ case defop:
+ case deftypemethod:
+ case deftypeop:
+ execute_string ("--- %s %s %s: ", category, _("on"), type_name);
+ break;
+ } /* switch (base_type)... */
+
+ switch (base_type)
+ {
+ case deffn:
+ case defvr:
+ case deftp:
+ /* <var> is for the following function arguments. */
+ insert_html_tag (START, "b");
+ execute_string ("%s", defined_name);
+ insert_html_tag (END, "b");
+ insert_html_tag (START, "var");
+ break;
+ case deftypefn:
+ case deftypevr:
+ execute_string ("%s ", type_name);
+ insert_html_tag (START, "b");
+ execute_string ("%s", defined_name);
+ insert_html_tag (END, "b");
+ insert_html_tag (START, "var");
+ break;
+ case defcv:
+ case defop:
+ insert_html_tag (START, "b");
+ execute_string ("%s", defined_name);
+ insert_html_tag (END, "b");
+ insert_html_tag (START, "var");
+ break;
+ case deftypecv:
+ case deftypeivar:
+ case deftypemethod:
+ case deftypeop:
+ execute_string ("%s ", type_name2);
+ insert_html_tag (START, "b");
+ execute_string ("%s", defined_name);
+ insert_html_tag (END, "b");
+ insert_html_tag (START, "var");
+ break;
+ }
+ }
+ else if (xml)
+ xml_begin_def_term (base_type, category, defined_name, type_name,
+ type_name2);
+
+ current_indent += default_indentation_increment;
+
+ /* Now process the function arguments, if any. If these carry onto
+ the next line, they should be indented by two increments to
+ distinguish them from the body of the definition, which is indented
+ by one increment. */
+ current_indent += default_indentation_increment;
+
+ switch (base_type)
+ {
+ case deffn:
+ case defop:
+ process_defun_args (scan_args, 1);
+ break;
+
+ /* Through Makeinfo 1.67 we processed remaining args only for deftp,
+ deftypefn, and deftypemethod. But the libc manual, for example,
+ needs to say:
+ @deftypevar {char *} tzname[2]
+ And simply allowing the extra text seems far simpler than trying
+ to invent yet more defn commands. In any case, we should either
+ output it or give an error, not silently ignore it. */
+ default:
+ process_defun_args (scan_args, 0);
+ break;
+ }
+
+ current_indent -= default_indentation_increment;
+ if (!html)
+ close_single_paragraph ();
+
+ /* Make an entry in the appropriate index. (XML and
+ Docbook already got their entries, so skip them.) */
+ if (!xml)
+ switch (base_type)
+ {
+ case deffn:
+ case deftypefn:
+ execute_string ("@findex %s\n", defined_name);
+ break;
+ case defcv:
+ case deftypecv:
+ case deftypevr:
+ case defvr:
+ execute_string ("@vindex %s\n", defined_name);
+ break;
+ case deftypeivar:
+ execute_string ("@vindex %s %s %s\n", defined_name, _("of"),
+ type_name);
+ break;
+ case defop:
+ case deftypeop:
+ case deftypemethod:
+ execute_string ("@findex %s %s %s\n", defined_name, _("on"),
+ type_name);
+ break;
+ case deftp:
+ execute_string ("@tindex %s\n", defined_name);
+ break;
+ }
+
+ if (xml)
+ xml_end_def_term ();
+ else if (html)
+ {
+ inhibit_paragraph_indentation = 1;
+ no_indent = 1;
+ insert_html_tag (END, "var");
+ insert_string ("<br>\n");
+ /* Indent the definition a bit. */
+ add_html_block_elt ("<blockquote>");
+ no_indent = 0;
+ inhibit_paragraph_indentation = 0;
+ paragraph_is_open = 0;
+ }
+
+ /* Deallocate the token list. */
+ scan_args = defun_args;
+ while (1)
+ {
+ char * arg = (*scan_args++);
+ if (arg == NULL)
+ break;
+ free (arg);
+ }
+ free (defun_args);
+}
+
+/* Add an entry for a function, macro, special form, variable, or option.
+ If the name of the calling command ends in `x', then this is an extra
+ entry included in the body of an insertion of the same type. */
+void
+cm_defun (void)
+{
+ int type;
+ char *base_command = xstrdup (command); /* command with any `x' removed */
+ int x_p = (command[strlen (command) - 1] == 'x');
+
+ if (x_p)
+ base_command[strlen (base_command) - 1] = 0;
+
+ type = find_type_from_name (base_command);
+
+ /* If we are adding to an already existing insertion, then make sure
+ that we are already in an insertion of type TYPE. */
+ if (x_p)
+ {
+ INSERTION_ELT *i = insertion_stack;
+ /* Skip over ifclear and ifset conditionals. */
+ while (i && (i->insertion == ifset || i->insertion == ifclear))
+ i = i->next;
+
+ if (!i || i->insertion != type)
+ {
+ line_error (_("Must be in `@%s' environment to use `@%s'"),
+ base_command, command);
+ discard_until ("\n");
+ return;
+ }
+ }
+
+ defun_internal (type, x_p);
+ free (base_command);
+}
diff --git a/Build/source/utils/texinfo/makeinfo/defun.h b/Build/source/utils/texinfo/makeinfo/defun.h
new file mode 100644
index 00000000000..9af73ec4a57
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/defun.h
@@ -0,0 +1,31 @@
+/* defun.h -- declaration for defuns.
+ $Id: defun.h,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1999 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#ifndef DEFUN_H
+#define DEFUN_H
+
+#include "insertion.h"
+
+extern enum insertion_type get_base_type (int type);
+extern void cm_defun (void);
+
+#endif /* !DEFUN_H */
+
diff --git a/Build/source/utils/texinfo/makeinfo/depend.mak b/Build/source/utils/texinfo/makeinfo/depend.mak
new file mode 100644
index 00000000000..6e69c6a2a85
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/depend.mak
@@ -0,0 +1,203 @@
+$(objdir)/macro.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ macro.h \
+ makeinfo.h \
+ insertion.h \
+ files.h \
+ cmds.h
+
+$(objdir)/toc.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ makeinfo.h \
+ insertion.h \
+ cmds.h \
+ files.h \
+ macro.h \
+ node.h \
+ html.h \
+ lang.h \
+ sectioning.h \
+ toc.h
+
+$(objdir)/files.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ files.h \
+ macro.h \
+ makeinfo.h
+
+$(objdir)/lang.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ cmds.h \
+ lang.h \
+ makeinfo.h \
+ sectioning.h \
+ insertion.h \
+ xml.h
+
+$(objdir)/insertion.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ cmds.h \
+ defun.h \
+ insertion.h \
+ macro.h \
+ makeinfo.h \
+ multi.h \
+ xml.h
+
+$(objdir)/index.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ index.h \
+ makeinfo.h \
+ insertion.h \
+ cmds.h \
+ lang.h \
+ macro.h \
+ toc.h \
+ html.h \
+ xml.h
+
+$(objdir)/node.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ cmds.h \
+ files.h \
+ footnote.h \
+ macro.h \
+ makeinfo.h \
+ node.h \
+ html.h \
+ sectioning.h \
+ insertion.h \
+ xml.h
+
+$(objdir)/makeinfo.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ $(kpathseadir)/getopt.h \
+ makeinfo.h \
+ cmds.h \
+ files.h \
+ footnote.h \
+ html.h \
+ index.h \
+ insertion.h \
+ macro.h \
+ node.h \
+ toc.h \
+ xml.h
+
+$(objdir)/sectioning.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ macro.h \
+ makeinfo.h \
+ node.h \
+ toc.h \
+ sectioning.h \
+ insertion.h \
+ cmds.h \
+ html.h \
+ xml.h
+
+$(objdir)/cmds.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ cmds.h \
+ defun.h \
+ insertion.h \
+ files.h \
+ footnote.h \
+ index.h \
+ makeinfo.h \
+ lang.h \
+ macro.h \
+ node.h \
+ sectioning.h \
+ toc.h \
+ multi.h \
+ html.h \
+ xml.h
+
+$(objdir)/xml.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ makeinfo.h \
+ insertion.h \
+ macro.h \
+ cmds.h \
+ lang.h \
+ xml.h
+
+$(objdir)/defun.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ defun.h \
+ insertion.h \
+ xml.h \
+ makeinfo.h \
+ cmds.h \
+ html.h
+
+$(objdir)/multi.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ multi.h \
+ insertion.h \
+ makeinfo.h \
+ cmds.h \
+ xml.h
+
+$(objdir)/html.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ cmds.h \
+ html.h \
+ lang.h \
+ makeinfo.h \
+ sectioning.h
+
+$(objdir)/footnote.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ footnote.h \
+ macro.h \
+ makeinfo.h \
+ node.h \
+ xml.h
+
diff --git a/Build/source/utils/texinfo/makeinfo/files.c b/Build/source/utils/texinfo/makeinfo/files.c
new file mode 100644
index 00000000000..db112262ee2
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/files.c
@@ -0,0 +1,784 @@
+/* files.c -- file-related functions for makeinfo.
+ $Id: files.c,v 1.5 2004/07/27 00:06:31 karl Exp $
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "files.h"
+#include "html.h"
+#include "index.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "node.h"
+
+FSTACK *filestack = NULL;
+
+static int node_filename_stack_index = 0;
+static int node_filename_stack_size = 0;
+static char **node_filename_stack = NULL;
+
+/* Looking for include files. */
+
+/* Given a string containing units of information separated by colons,
+ return the next one pointed to by INDEX, or NULL if there are no more.
+ Advance INDEX to the character after the colon. */
+static char *
+extract_colon_unit (char *string, int *index)
+{
+ int start;
+ int path_sep_char = PATH_SEP[0];
+ int i = *index;
+
+ if (!string || (i >= strlen (string)))
+ return NULL;
+
+ /* Each call to this routine leaves the index pointing at a colon if
+ there is more to the path. If i > 0, then increment past the
+ `:'. If i == 0, then the path has a leading colon. Trailing colons
+ are handled OK by the `else' part of the if statement; an empty
+ string is returned in that case. */
+ if (i && string[i] == path_sep_char)
+ i++;
+
+ start = i;
+ while (string[i] && string[i] != path_sep_char) i++;
+ *index = i;
+
+ if (i == start)
+ {
+ if (string[i])
+ (*index)++;
+
+ /* Return "" in the case of a trailing `:'. */
+ return xstrdup ("");
+ }
+ else
+ {
+ char *value;
+
+ value = xmalloc (1 + (i - start));
+ memcpy (value, &string[start], (i - start));
+ value [i - start] = 0;
+
+ return value;
+ }
+}
+
+/* Return the full pathname for FILENAME by searching along PATH.
+ When found, return the stat () info for FILENAME in FINFO.
+ If PATH is NULL, only the current directory is searched.
+ If the file could not be found, return a NULL pointer. */
+char *
+get_file_info_in_path (char *filename, char *path, struct stat *finfo)
+{
+ char *dir;
+ int result, index = 0;
+
+ if (path == NULL)
+ path = ".";
+
+ /* Handle absolute pathnames. */
+ if (IS_ABSOLUTE (filename)
+ || (*filename == '.'
+ && (IS_SLASH (filename[1])
+ || (filename[1] == '.' && IS_SLASH (filename[2])))))
+ {
+ if (stat (filename, finfo) == 0)
+ return xstrdup (filename);
+ else
+ return NULL;
+ }
+
+ while ((dir = extract_colon_unit (path, &index)))
+ {
+ char *fullpath;
+
+ if (!*dir)
+ {
+ free (dir);
+ dir = xstrdup (".");
+ }
+
+ fullpath = xmalloc (2 + strlen (dir) + strlen (filename));
+ sprintf (fullpath, "%s/%s", dir, filename);
+ free (dir);
+
+ result = stat (fullpath, finfo);
+
+ if (result == 0)
+ return fullpath;
+ else
+ free (fullpath);
+ }
+ return NULL;
+}
+
+/* Prepend and append new paths to include_files_path. */
+void
+prepend_to_include_path (char *path)
+{
+ if (!include_files_path)
+ {
+ include_files_path = xstrdup (path);
+ include_files_path = xrealloc (include_files_path,
+ strlen (include_files_path) + 3); /* 3 for ":.\0" */
+ strcat (strcat (include_files_path, PATH_SEP), ".");
+ }
+ else
+ {
+ char *tmp = xstrdup (include_files_path);
+ include_files_path = xrealloc (include_files_path,
+ strlen (include_files_path) + strlen (path) + 2); /* 2 for ":\0" */
+ strcpy (include_files_path, path);
+ strcat (include_files_path, PATH_SEP);
+ strcat (include_files_path, tmp);
+ free (tmp);
+ }
+}
+
+void
+append_to_include_path (char *path)
+{
+ if (!include_files_path)
+ include_files_path = xstrdup (".");
+
+ include_files_path = (char *) xrealloc (include_files_path,
+ 2 + strlen (include_files_path) + strlen (path));
+ strcat (include_files_path, PATH_SEP);
+ strcat (include_files_path, path);
+}
+
+/* Remove the first path from the include_files_path. */
+void
+pop_path_from_include_path (void)
+{
+ int i = 0;
+ char *tmp;
+
+ if (include_files_path)
+ for (i = 0; i < strlen (include_files_path)
+ && include_files_path[i] != ':'; i++);
+
+ /* Advance include_files_path to the next char from ':' */
+ tmp = (char *) xmalloc (strlen (include_files_path) - i);
+ strcpy (tmp, (char *) include_files_path + i + 1);
+
+ free (include_files_path);
+ include_files_path = tmp;
+}
+
+/* Find and load the file named FILENAME. Return a pointer to
+ the loaded file, or NULL if it can't be loaded. If USE_PATH is zero,
+ just look for the given file (this is used in handle_delayed_writes),
+ else search along include_files_path. */
+
+char *
+find_and_load (char *filename, int use_path)
+{
+ struct stat fileinfo;
+ long file_size;
+ int file = -1, count = 0;
+ char *fullpath, *result;
+ int n, bytes_to_read;
+
+ result = fullpath = NULL;
+
+ fullpath
+ = get_file_info_in_path (filename, use_path ? include_files_path : NULL,
+ &fileinfo);
+
+ if (!fullpath)
+ goto error_exit;
+
+ filename = fullpath;
+ file_size = (long) fileinfo.st_size;
+
+ file = open (filename, O_RDONLY);
+ if (file < 0)
+ goto error_exit;
+
+ /* Load the file, with enough room for a newline and a null. */
+ result = xmalloc (file_size + 2);
+
+ /* VMS stat lies about the st_size value. The actual number of
+ readable bytes is always less than this value. The arcane
+ mysteries of VMS/RMS are too much to probe, so this hack
+ suffices to make things work. It's also needed on Cygwin. And so
+ we might as well use it everywhere. */
+ bytes_to_read = file_size;
+ while ((n = read (file, result + count, bytes_to_read)) > 0)
+ {
+ count += n;
+ bytes_to_read -= n;
+ }
+ if (0 < count && count < file_size)
+ result = xrealloc (result, count + 2); /* why waste the slack? */
+ else if (n == -1)
+error_exit:
+ {
+ if (result)
+ free (result);
+
+ if (fullpath)
+ free (fullpath);
+
+ if (file != -1)
+ close (file);
+
+ return NULL;
+ }
+ close (file);
+
+ /* Set the globals to the new file. */
+ input_text = result;
+ input_text_length = count;
+ input_filename = fullpath;
+ node_filename = xstrdup (fullpath);
+ input_text_offset = 0;
+ line_number = 1;
+ /* Not strictly necessary. This magic prevents read_token () from doing
+ extra unnecessary work each time it is called (that is a lot of times).
+ INPUT_TEXT_LENGTH is one past the actual end of the text. */
+ input_text[input_text_length] = '\n';
+ /* This, on the other hand, is always necessary. */
+ input_text[input_text_length+1] = 0;
+ return result;
+}
+
+/* Pushing and popping files. */
+static void
+push_node_filename (void)
+{
+ if (node_filename_stack_index + 1 > node_filename_stack_size)
+ node_filename_stack = xrealloc
+ (node_filename_stack, (node_filename_stack_size += 10) * sizeof (char *));
+
+ node_filename_stack[node_filename_stack_index] = node_filename;
+ node_filename_stack_index++;
+}
+
+static void
+pop_node_filename (void)
+{
+ node_filename = node_filename_stack[--node_filename_stack_index];
+}
+
+/* Save the state of the current input file. */
+void
+pushfile (void)
+{
+ FSTACK *newstack = xmalloc (sizeof (FSTACK));
+ newstack->filename = input_filename;
+ newstack->text = input_text;
+ newstack->size = input_text_length;
+ newstack->offset = input_text_offset;
+ newstack->line_number = line_number;
+ newstack->next = filestack;
+
+ filestack = newstack;
+ push_node_filename ();
+}
+
+/* Make the current file globals be what is on top of the file stack. */
+void
+popfile (void)
+{
+ FSTACK *tos = filestack;
+
+ if (!tos)
+ abort (); /* My fault. I wonder what I did? */
+
+ if (macro_expansion_output_stream)
+ {
+ maybe_write_itext (input_text, input_text_offset);
+ forget_itext (input_text);
+ }
+
+ /* Pop the stack. */
+ filestack = filestack->next;
+
+ /* Make sure that commands with braces have been satisfied. */
+ if (!executing_string && !me_executing_string)
+ discard_braces ();
+
+ /* Get the top of the stack into the globals. */
+ input_filename = tos->filename;
+ input_text = tos->text;
+ input_text_length = tos->size;
+ input_text_offset = tos->offset;
+ line_number = tos->line_number;
+ free (tos);
+
+ /* Go back to the (now) current node. */
+ pop_node_filename ();
+}
+
+/* Flush all open files on the file stack. */
+void
+flush_file_stack (void)
+{
+ while (filestack)
+ {
+ char *fname = input_filename;
+ char *text = input_text;
+ popfile ();
+ free (fname);
+ free (text);
+ }
+}
+
+/* Return the index of the first character in the filename
+ which is past all the leading directory characters. */
+static int
+skip_directory_part (char *filename)
+{
+ int i = strlen (filename) - 1;
+
+ while (i && !IS_SLASH (filename[i]))
+ i--;
+ if (IS_SLASH (filename[i]))
+ i++;
+ else if (filename[i] && HAVE_DRIVE (filename))
+ i = 2;
+
+ return i;
+}
+
+static char *
+filename_non_directory (char *name)
+{
+ return xstrdup (name + skip_directory_part (name));
+}
+
+/* Return just the simple part of the filename; i.e. the
+ filename without the path information, or extensions.
+ This conses up a new string. */
+char *
+filename_part (char *filename)
+{
+ char *basename = filename_non_directory (filename);
+
+#ifdef REMOVE_OUTPUT_EXTENSIONS
+ /* See if there is an extension to remove. If so, remove it. */
+ {
+ char *temp = strrchr (basename, '.');
+ if (temp)
+ *temp = 0;
+ }
+#endif /* REMOVE_OUTPUT_EXTENSIONS */
+ return basename;
+}
+
+/* Return the pathname part of filename. This can be NULL. */
+char *
+pathname_part (char *filename)
+{
+ char *result = NULL;
+ int i;
+
+ filename = expand_filename (filename, "");
+
+ i = skip_directory_part (filename);
+ if (i)
+ {
+ result = xmalloc (1 + i);
+ strncpy (result, filename, i);
+ result[i] = 0;
+ }
+ free (filename);
+ return result;
+}
+
+/* Return the full path to FILENAME. */
+static char *
+full_pathname (char *filename)
+{
+ int initial_character;
+ char *result;
+
+ /* No filename given? */
+ if (!filename || !*filename)
+ return xstrdup ("");
+
+ /* Already absolute? */
+ if (IS_ABSOLUTE (filename) ||
+ (*filename == '.' &&
+ (IS_SLASH (filename[1]) ||
+ (filename[1] == '.' && IS_SLASH (filename[2])))))
+ return xstrdup (filename);
+
+ initial_character = *filename;
+ if (initial_character != '~')
+ {
+ char *localdir = xmalloc (1025);
+#ifdef HAVE_GETCWD
+ if (!getcwd (localdir, 1024))
+#else
+ if (!getwd (localdir))
+#endif
+ {
+ fprintf (stderr, _("%s: getwd: %s, %s\n"),
+ progname, filename, localdir);
+ xexit (1);
+ }
+
+ strcat (localdir, "/");
+ strcat (localdir, filename);
+ result = xstrdup (localdir);
+ free (localdir);
+ }
+ else
+ { /* Does anybody know why WIN32 doesn't want to support $HOME?
+ If the reason is they don't have getpwnam, they should
+ only disable the else clause below. */
+#ifndef WIN32
+ if (IS_SLASH (filename[1]))
+ {
+ /* Return the concatenation of the environment variable HOME
+ and the rest of the string. */
+ char *temp_home;
+
+ temp_home = (char *) getenv ("HOME");
+ result = xmalloc (strlen (&filename[1])
+ + 1
+ + temp_home ? strlen (temp_home)
+ : 0);
+ *result = 0;
+
+ if (temp_home)
+ strcpy (result, temp_home);
+
+ strcat (result, &filename[1]);
+ }
+ else
+ {
+ struct passwd *user_entry;
+ int i, c;
+ char *username = xmalloc (257);
+
+ for (i = 1; (c = filename[i]); i++)
+ {
+ if (IS_SLASH (c))
+ break;
+ else
+ username[i - 1] = c;
+ }
+ if (c)
+ username[i - 1] = 0;
+
+ user_entry = getpwnam (username);
+
+ if (!user_entry)
+ return xstrdup (filename);
+
+ result = xmalloc (1 + strlen (user_entry->pw_dir)
+ + strlen (&filename[i]));
+ strcpy (result, user_entry->pw_dir);
+ strcat (result, &filename[i]);
+ }
+#endif /* not WIN32 */
+ }
+ return result;
+}
+
+/* Return the expansion of FILENAME. */
+char *
+expand_filename (char *filename, char *input_name)
+{
+ int i;
+
+ if (filename)
+ {
+ filename = full_pathname (filename);
+ if (IS_ABSOLUTE (filename)
+ || (*filename == '.' &&
+ (IS_SLASH (filename[1]) ||
+ (filename[1] == '.' && IS_SLASH (filename[2])))))
+ return filename;
+ }
+ else
+ {
+ filename = filename_non_directory (input_name);
+
+ if (!*filename)
+ {
+ free (filename);
+ filename = xstrdup ("noname.texi");
+ }
+
+ for (i = strlen (filename) - 1; i; i--)
+ if (filename[i] == '.')
+ break;
+
+ if (!i)
+ i = strlen (filename);
+
+ if (i + 6 > (strlen (filename)))
+ filename = xrealloc (filename, i + 6);
+ strcpy (filename + i, html ? ".html" : ".info");
+ return filename;
+ }
+
+ if (IS_ABSOLUTE (input_name))
+ {
+ /* Make it so that relative names work. */
+ char *result;
+
+ i = strlen (input_name) - 1;
+
+ result = xmalloc (1 + strlen (input_name) + strlen (filename));
+ strcpy (result, input_name);
+
+ while (!IS_SLASH (result[i]) && i)
+ i--;
+ if (IS_SLASH (result[i]))
+ i++;
+
+ strcpy (&result[i], filename);
+ free (filename);
+ return result;
+ }
+ return filename;
+}
+
+char *
+output_name_from_input_name (char *name)
+{
+ return expand_filename (NULL, name);
+}
+
+
+/* Modify the file name FNAME so that it fits the limitations of the
+ underlying filesystem. In particular, truncate the file name as it
+ would be truncated by the filesystem. We assume the result can
+ never be longer than the original, otherwise we couldn't be sure we
+ have enough space in the original string to modify it in place. */
+char *
+normalize_filename (char *fname)
+{
+ int maxlen;
+ char orig[PATH_MAX + 1];
+ int i;
+ char *lastdot, *p;
+
+#ifdef _PC_NAME_MAX
+ maxlen = pathconf (fname, _PC_NAME_MAX);
+ if (maxlen < 1)
+#endif
+ maxlen = PATH_MAX;
+
+ i = skip_directory_part (fname);
+ if (fname[i] == '\0')
+ return fname; /* only a directory name -- don't modify */
+ strcpy (orig, fname + i);
+
+ switch (maxlen)
+ {
+ case 12: /* MS-DOS 8+3 filesystem */
+ if (orig[0] == '.') /* leading dots are not allowed */
+ orig[0] = '_';
+ lastdot = strrchr (orig, '.');
+ if (!lastdot)
+ lastdot = orig + strlen (orig);
+ strncpy (fname + i, orig, lastdot - orig);
+ for (p = fname + i;
+ p < fname + i + (lastdot - orig) && p < fname + i + 8;
+ p++)
+ if (*p == '.')
+ *p = '_';
+ *p = '\0';
+ if (*lastdot == '.')
+ strncat (fname + i, lastdot, 4);
+ break;
+ case 14: /* old Unix systems with 14-char limitation */
+ strcpy (fname + i, orig);
+ if (strlen (fname + i) > 14)
+ fname[i + 14] = '\0';
+ break;
+ default:
+ strcpy (fname + i, orig);
+ if (strlen (fname) > maxlen - 1)
+ fname[maxlen - 1] = '\0';
+ break;
+ }
+
+ return fname;
+}
+
+/* Delayed writing functions. A few of the commands
+ needs to be handled at the end, namely @contents,
+ @shortcontents, @printindex and @listoffloats.
+ These functions take care of that. */
+static DELAYED_WRITE *delayed_writes = NULL;
+int handling_delayed_writes = 0;
+
+void
+register_delayed_write (char *delayed_command)
+{
+ DELAYED_WRITE *new;
+
+ if (!current_output_filename || !*current_output_filename)
+ {
+ /* Cannot register if we don't know what the output file is. */
+ warning (_("`%s' omitted before output filename"), delayed_command);
+ return;
+ }
+
+ if (STREQ (current_output_filename, "-"))
+ {
+ /* Do not register a new write if the output file is not seekable.
+ Let the user know about it first, though. */
+ warning (_("`%s' omitted since writing to stdout"), delayed_command);
+ return;
+ }
+
+ /* Don't complain if the user is writing /dev/null, since surely they
+ don't care, but don't register the delayed write, either. */
+ if (FILENAME_CMP (current_output_filename, NULL_DEVICE) == 0
+ || FILENAME_CMP (current_output_filename, ALSO_NULL_DEVICE) == 0)
+ return;
+
+ /* We need the HTML header in the output,
+ to get a proper output_position. */
+ if (!executing_string && html)
+ html_output_head ();
+ /* Get output_position updated. */
+ flush_output ();
+
+ new = xmalloc (sizeof (DELAYED_WRITE));
+ new->command = xstrdup (delayed_command);
+ new->filename = xstrdup (current_output_filename);
+ new->input_filename = xstrdup (input_filename);
+ new->position = output_position;
+ new->calling_line = line_number;
+ new->node = current_node ? xstrdup (current_node): "";
+
+ new->node_order = node_order;
+ new->index_order = index_counter;
+
+ new->next = delayed_writes;
+ delayed_writes = new;
+}
+
+void
+handle_delayed_writes (void)
+{
+ DELAYED_WRITE *temp = (DELAYED_WRITE *) reverse_list
+ ((GENERIC_LIST *) delayed_writes);
+ int position_shift_amount, line_number_shift_amount;
+ char *delayed_buf;
+
+ handling_delayed_writes = 1;
+
+ while (temp)
+ {
+ delayed_buf = find_and_load (temp->filename, 0);
+
+ if (output_paragraph_offset > 0)
+ {
+ error (_("Output buffer not empty."));
+ return;
+ }
+
+ if (!delayed_buf)
+ {
+ fs_error (temp->filename);
+ return;
+ }
+
+ output_stream = fopen (temp->filename, "w");
+ if (!output_stream)
+ {
+ fs_error (temp->filename);
+ return;
+ }
+
+ if (fwrite (delayed_buf, 1, temp->position, output_stream) != temp->position)
+ {
+ fs_error (temp->filename);
+ return;
+ }
+
+ {
+ int output_position_at_start = output_position;
+ int line_number_at_start = output_line_number;
+
+ /* In order to make warnings and errors
+ refer to the correct line number. */
+ input_filename = temp->input_filename;
+ line_number = temp->calling_line;
+
+ execute_string ("%s", temp->command);
+ flush_output ();
+
+ /* Since the output file is modified, following delayed writes
+ need to be updated by this amount. */
+ position_shift_amount = output_position - output_position_at_start;
+ line_number_shift_amount = output_line_number - line_number_at_start;
+ }
+
+ if (fwrite (delayed_buf + temp->position, 1,
+ input_text_length - temp->position, output_stream)
+ != input_text_length - temp->position
+ || fclose (output_stream) != 0)
+ fs_error (temp->filename);
+
+ /* Done with the buffer. */
+ free (delayed_buf);
+
+ /* Update positions in tag table for nodes that are defined after
+ the line this delayed write is registered. */
+ if (!html && !xml)
+ {
+ TAG_ENTRY *node;
+ for (node = tag_table; node; node = node->next_ent)
+ if (node->order > temp->node_order)
+ node->position += position_shift_amount;
+ }
+
+ /* Something similar for the line numbers in all of the defined
+ indices. */
+ {
+ int i;
+ for (i = 0; i < defined_indices; i++)
+ if (name_index_alist[i])
+ {
+ char *name = ((INDEX_ALIST *) name_index_alist[i])->name;
+ INDEX_ELT *index;
+ for (index = index_list (name); index; index = index->next)
+ if ((no_headers || STREQ (index->node, temp->node))
+ && index->entry_number > temp->index_order)
+ index->output_line += line_number_shift_amount;
+ }
+ }
+
+ /* Shift remaining delayed positions
+ by the length of this write. */
+ {
+ DELAYED_WRITE *future_write = temp->next;
+ while (future_write)
+ {
+ if (STREQ (temp->filename, future_write->filename))
+ future_write->position += position_shift_amount;
+ future_write = future_write->next;
+ }
+ }
+
+ temp = temp->next;
+ }
+}
diff --git a/Build/source/utils/texinfo/makeinfo/files.h b/Build/source/utils/texinfo/makeinfo/files.h
new file mode 100644
index 00000000000..0943663467f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/files.h
@@ -0,0 +1,70 @@
+/* files.h -- declarations for files.c.
+ $Id: files.h,v 1.4 2004/07/27 00:06:31 karl Exp $
+
+ Copyright (C) 1998, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef FILES_H
+#define FILES_H
+
+/* A stack of file information records. If a new file is read in with
+ "@input", we remember the old input file state on this stack. */
+typedef struct fstack
+{
+ struct fstack *next;
+ char *filename;
+ char *text;
+ int size;
+ int offset;
+ int line_number;
+} FSTACK;
+extern FSTACK *filestack;
+
+extern void pushfile (void);
+extern void popfile (void);
+extern void flush_file_stack (void);
+extern char *get_file_info_in_path (char *filename, char *path,
+ struct stat *finfo);
+extern char *find_and_load (char *filename, int use_path);
+extern char *output_name_from_input_name (char *name);
+extern char *expand_filename (char *filename, char *input_name);
+extern char *filename_part (char *filename);
+extern char *pathname_part (char *filename);
+extern char *normalize_filename (char *fname);
+extern void append_to_include_path (char *path);
+extern void prepend_to_include_path (char *path);
+extern void pop_path_from_include_path (void);
+extern void register_delayed_write (char *delayed_command);
+extern void handle_delayed_writes (void);
+
+typedef struct delayed_write
+{
+ struct delayed_write *next;
+ char *command;
+ char *filename;
+ char *input_filename;
+ char *node;
+ int position;
+ int calling_line;
+
+ int node_order;
+ int index_order;
+} DELAYED_WRITE;
+
+extern int handling_delayed_writes;
+
+#endif /* !FILES_H */
diff --git a/Build/source/utils/texinfo/makeinfo/float.c b/Build/source/utils/texinfo/makeinfo/float.c
new file mode 100644
index 00000000000..b2c9a3367c1
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/float.c
@@ -0,0 +1,430 @@
+/* float.c -- float environment functions.
+ $Id: float.c,v 1.8 2004/07/05 22:23:22 karl Exp $
+
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Alper Ersoy <dirt@gtk.org>. */
+
+#include "system.h"
+#include "makeinfo.h"
+#include "cmds.h"
+#include "files.h"
+#include "float.h"
+#include "html.h"
+#include "sectioning.h"
+#include "xml.h"
+
+static FLOAT_ELT *float_stack = NULL;
+
+void
+add_new_float (char *id, char *title, char *shorttitle,
+ char *type, char *position)
+{
+ FLOAT_ELT *new = xmalloc (sizeof (FLOAT_ELT));
+ unsigned long num_len;
+
+ new->id = id;
+ new->type = type;
+ new->title = title;
+ new->shorttitle = shorttitle;
+ new->position = position;
+ new->title_used = 0;
+ new->defining_line = line_number - 1;
+
+ new->number = current_chapter_number ();
+ /* Append dot if not @unnumbered. */
+ num_len = strlen (new->number);
+ if (num_len > 0)
+ {
+ new->number = xrealloc (new->number, num_len + 1 + 1);
+ new->number[num_len] = '.';
+ new->number[num_len+1] = '\0';
+ }
+
+ { /* Append the current float number. */
+ unsigned len = strlen (new->number) + 21; /* that's 64 bits */
+ char *s = xmalloc (len + 1);
+
+ sprintf (s, "%s%d", new->number,
+ count_floats_of_type_in_chapter (text_expansion (type),
+ new->number) + 1);
+ free (new->number);
+ new->number = xstrdup (s);
+ }
+
+ /* Plain text output needs sectioning number and its title,
+ when listing floats. */
+ if (!html && !xml && no_headers)
+ {
+ new->section = current_sectioning_number ();
+ if (strlen (new->section) == 0)
+ new->section_name = current_sectioning_name ();
+ else
+ new->section_name = "";
+ }
+
+ new->next = float_stack;
+ float_stack = new;
+}
+
+int
+count_floats_of_type_in_chapter (char *type, char *chapter)
+{
+ int i = 0;
+ int l = strlen (chapter);
+ FLOAT_ELT *temp = float_stack;
+
+ while (temp && strncmp (temp->number, chapter, l) == 0)
+ {
+ if (strlen (temp->id) > 0 && STREQ (text_expansion (temp->type), type))
+ i++;
+ temp = temp->next;
+ }
+
+ return i;
+}
+
+char *
+current_float_title (void)
+{
+ return float_stack->title;
+}
+
+char *
+current_float_shorttitle (void)
+{
+ return float_stack->shorttitle;
+}
+
+char *
+current_float_type (void)
+{
+ return float_stack->type;
+}
+
+char *
+current_float_position (void)
+{
+ return float_stack->position;
+}
+
+char *
+current_float_number (void)
+{
+ return float_stack->number;
+}
+
+char *
+current_float_id (void)
+{
+ return float_stack->id;
+}
+
+char *
+get_float_ref (char *id)
+{
+ FLOAT_ELT *temp = float_stack;
+
+ while (temp)
+ {
+ if (STREQ (id, temp->id))
+ {
+ char *s = xmalloc (strlen (temp->type) + strlen (temp->number) + 2);
+ sprintf (s, "%s %s", temp->type, temp->number);
+ return s;
+ }
+ temp = temp->next;
+ }
+
+ return NULL;
+}
+
+static int
+float_type_exists (char *check_type)
+{
+ /* Check if the requested float_type exists in the floats stack. */
+ FLOAT_ELT *temp;
+
+ for (temp = float_stack; temp; temp = temp->next)
+ if (STREQ (temp->type, check_type) && temp->id && *temp->id)
+ return 1;
+
+ return 0;
+}
+
+void
+cm_listoffloats (void)
+{
+ char *float_type;
+ get_rest_of_line (1, &float_type);
+
+ /* get_rest_of_line increments the line number by one,
+ so to make warnings/errors point to the correct line,
+ we decrement the line_number again. */
+ if (!handling_delayed_writes)
+ line_number--;
+
+ if (handling_delayed_writes && !float_type_exists (float_type))
+ warning (_("Requested float type `%s' not previously used"), float_type);
+
+ if (xml)
+ {
+ xml_insert_element_with_attribute (LISTOFFLOATS, START,
+ "type=\"%s\"", text_expansion (float_type));
+ xml_insert_element (LISTOFFLOATS, END);
+ }
+ else if (!handling_delayed_writes)
+ {
+ int command_len = sizeof ("@ ") + strlen (command) + strlen (float_type);
+ char *list_command = xmalloc (command_len + 1);
+
+ /* These are for the text following @listoffloats command.
+ Handling them with delayed writes is too late. */
+ close_paragraph ();
+ cm_noindent ();
+
+ sprintf (list_command, "@%s %s", command, float_type);
+ register_delayed_write (list_command);
+ free (list_command);
+ }
+ else if (float_type_exists (float_type))
+ {
+ FLOAT_ELT *temp = (FLOAT_ELT *) reverse_list
+ ((GENERIC_LIST *) float_stack);
+ FLOAT_ELT *new_start = temp;
+
+ if (html)
+ insert_string ("<ul class=\"listoffloats\">\n");
+ else
+ {
+ if (!no_headers)
+ insert_string ("* Menu:\n\n");
+ }
+
+ while (temp)
+ {
+ if (strlen (temp->id) > 0 && STREQ (float_type, temp->type))
+ {
+ if (html)
+ {
+ /* A bit of space for HTML reabality. */
+ insert_string (" ");
+ add_html_block_elt ("<li>");
+
+ /* Simply relying on @ref command doesn't work here, because
+ commas in the caption may confuse the argument parsing. */
+ add_word ("<a href=\"");
+ add_anchor_name (temp->id, 1);
+ add_word ("\">");
+
+ if (strlen (float_type) > 0)
+ execute_string ("%s", float_type);
+
+ if (strlen (temp->id) > 0)
+ {
+ if (strlen (float_type) > 0)
+ add_char (' ');
+
+ add_word (temp->number);
+ }
+
+ if (strlen (temp->title) > 0)
+ {
+ if (strlen (float_type) > 0
+ || strlen (temp->id) > 0)
+ insert_string (": ");
+
+ execute_string ("%s", temp->title);
+ }
+
+ add_word ("</a>");
+
+ add_html_block_elt ("</li>\n");
+ }
+ else
+ {
+ char *entry;
+ char *raw_entry;
+ char *title = expansion (temp->title, 0);
+
+ int len;
+ int aux_chars_len; /* these are asterisk, colon, etc. */
+ int column_width; /* width of the first column in menus. */
+ int number_len; /* length of Figure X.Y: etc. */
+ int i = 0;
+
+ /* Chosen widths are to match what @printindex produces. */
+ if (no_headers)
+ {
+ column_width = 43;
+ /* We have only one auxiliary character, NULL. */
+ aux_chars_len = sizeof ("");
+ }
+ else
+ {
+ column_width = 37;
+ /* We'll be adding an asterisk, followed by a space
+ and then a colon after the title, to construct a
+ proper menu item. */
+ aux_chars_len = sizeof ("* :");
+ }
+
+ /* Allocate enough space for possible expansion later. */
+ raw_entry = (char *) xmalloc (strlen (float_type)
+ + strlen (temp->number) + strlen (title)
+ + sizeof (": "));
+
+ sprintf (raw_entry, "%s %s", float_type, temp->number);
+
+ if (strlen (title) > 0)
+ strcat (raw_entry, ": ");
+
+ number_len = strlen (raw_entry);
+
+ len = strlen (title) + strlen (raw_entry);
+
+ /* If we have a @shortcaption, try it if @caption is
+ too long to fit on a line. */
+ if (len + aux_chars_len > column_width
+ && strlen (temp->shorttitle) > 0)
+ title = expansion (temp->shorttitle, 0);
+
+ strcat (raw_entry, title);
+ len = strlen (raw_entry);
+
+ if (len + aux_chars_len > column_width)
+ { /* Shorten long titles by looking for a space before
+ column_width - strlen (" ..."). */
+ /* -1 is for NULL, which is already in aux_chars_len. */
+ aux_chars_len += sizeof ("...") - 1;
+ len = column_width - aux_chars_len;
+ while (raw_entry[len] != ' ' && len >= 0)
+ len--;
+
+ /* Advance to the whitespace. */
+ len++;
+
+ /* If we are at the end of, say, Figure X.Y:, but
+ we have a title, then this means title does not
+ contain any whitespaces. Or it may be that we
+ went as far as the beginning. Just print as much
+ as possible of the title. */
+ if (len == 0
+ || (len == number_len && strlen (title) > 0))
+ len = column_width - sizeof ("...");
+
+ /* Break here. */
+ raw_entry[len] = 0;
+
+ entry = xmalloc (len + aux_chars_len);
+
+ if (!no_headers)
+ strcpy (entry, "* ");
+ else
+ entry[0] = 0;
+
+ strcat (entry, raw_entry);
+ strcat (entry, "...");
+
+ if (!no_headers)
+ strcat (entry, ":");
+ }
+ else
+ {
+ entry = xmalloc (len + aux_chars_len);
+
+ if (!no_headers)
+ strcpy (entry, "* ");
+ else
+ entry[0] = 0;
+
+ strcat (entry, raw_entry);
+
+ if (!no_headers)
+ strcat (entry, ":");
+ }
+
+ insert_string (entry);
+
+ i = strlen (entry);
+ /* We insert space chars until ``column_width + four spaces''
+ is reached, to make the layout the same with what we produce
+ for @printindex. This is of course not obligatory, though
+ easier on the eye. -1 is for NULL. */
+ while (i < column_width + sizeof (" ") - 1)
+ {
+ insert (' ');
+ i++;
+ }
+
+ if (no_headers)
+ {
+ if (strlen (temp->section) > 0)
+ { /* We got your number. */
+ insert_string ((char *) _("See "));
+ insert_string (temp->section);
+ }
+ else
+ { /* Sigh, @float in an @unnumbered. :-\ */
+ insert_string ("\n ");
+ insert_string ((char *) _("See "));
+ insert_string ("``");
+ insert_string (expansion (temp->section_name, 0));
+ insert_string ("''");
+ }
+ }
+ else
+ insert_string (temp->id);
+
+ insert_string (".\n");
+
+ free (entry);
+ free (title);
+ }
+ }
+ temp = temp->next;
+ }
+
+ if (html)
+ {
+ inhibit_paragraph_indentation = 1;
+ insert_string ("</ul>\n\n");
+ }
+ else
+ insert ('\n');
+
+ /* Retain the original order of float stack. */
+ temp = new_start;
+ float_stack = (FLOAT_ELT *) reverse_list ((GENERIC_LIST *) temp);
+ }
+
+ free (float_type);
+ /* Re-increment the line number, because get_rest_of_line
+ left us looking at the next line after the command. */
+ line_number++;
+}
+
+int
+current_float_used_title (void)
+{
+ return float_stack->title_used;
+}
+
+void current_float_set_title_used (void)
+{
+ float_stack->title_used = 1;
+}
diff --git a/Build/source/utils/texinfo/makeinfo/float.h b/Build/source/utils/texinfo/makeinfo/float.h
new file mode 100644
index 00000000000..be9deb58096
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/float.h
@@ -0,0 +1,56 @@
+/* float.h -- declarations for the float environment.
+ $Id: float.h,v 1.5 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Alper Ersoy <dirt@gtk.org>. */
+
+#ifndef FLOAT_H
+#define FLOAT_H
+
+typedef struct float_elt
+{
+ struct float_elt *next;
+ char *id;
+ char *type;
+ char *title;
+ char *shorttitle;
+ char *position;
+ char *number;
+ char *section;
+ char *section_name;
+ short title_used;
+ int defining_line;
+} FLOAT_ELT;
+
+extern void add_new_float (char *id, char *title, char *shorttitle,
+ char *type, char *position);
+extern void current_float_set_title_used (void);
+
+/* Information retrieval about the current float env. */
+extern char *current_float_id (void);
+extern char *current_float_title (void);
+extern char *current_float_shorttitle (void);
+extern char *current_float_type (void);
+extern char *current_float_position (void);
+extern char *current_float_number (void);
+extern char *get_float_ref (char *id);
+
+extern int count_floats_of_type_in_chapter (char *type, char *chapter);
+extern int current_float_used_title (void);
+
+#endif /* not FLOAT_H */
diff --git a/Build/source/utils/texinfo/makeinfo/footnote.c b/Build/source/utils/texinfo/makeinfo/footnote.c
new file mode 100644
index 00000000000..e5a7f4c08f5
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/footnote.c
@@ -0,0 +1,391 @@
+/* footnote.c -- footnotes for Texinfo.
+ $Id: footnote.c,v 1.7 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "footnote.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "node.h"
+#include "xml.h"
+#include "xref.h"
+
+/* Nonzero means that the footnote style for this document was set on
+ the command line, which overrides any other settings. */
+int footnote_style_preset = 0;
+
+/* The current footnote number in this node. Each time a new node is
+ started this is reset to 1. */
+int current_footnote_number = 1;
+
+/* Nonzero means we automatically number footnotes with no specified marker. */
+int number_footnotes = 1;
+
+/* Nonzero means we are currently outputting footnotes. */
+int already_outputting_pending_notes = 0;
+
+
+/* Footnotes can be handled in one of two ways:
+
+ separate_node:
+ Make them look like followed references, with the reference
+ destinations in a makeinfo manufactured node or,
+ end_node:
+ Make them appear at the bottom of the node that they originally
+ appeared in. */
+
+#define separate_node 0
+#define end_node 1
+
+int footnote_style = end_node;
+int first_footnote_this_node = 1;
+int footnote_count = 0;
+
+/* Set the footnote style based on the style identifier in STRING. */
+int
+set_footnote_style (char *string)
+{
+ if (strcasecmp (string, "separate") == 0)
+ footnote_style = separate_node;
+ else if (strcasecmp (string, "end") == 0)
+ footnote_style = end_node;
+ else
+ return -1;
+
+ return 0;
+}
+
+void
+cm_footnotestyle (void)
+{
+ char *arg;
+
+ get_rest_of_line (1, &arg);
+
+ /* If set on command line, do not change the footnote style. */
+ if (!footnote_style_preset && set_footnote_style (arg) != 0)
+ line_error (_("Bad argument to %c%s"), COMMAND_PREFIX, command);
+
+ free (arg);
+}
+
+typedef struct fn
+{
+ struct fn *next;
+ char *marker;
+ char *note;
+ int number;
+} FN;
+
+FN *pending_notes = NULL;
+
+/* A method for remembering footnotes. Note that this list gets output
+ at the end of the current node. */
+static void
+remember_note (char *marker, char *note)
+{
+ FN *temp = xmalloc (sizeof (FN));
+
+ temp->marker = xstrdup (marker);
+ temp->note = xstrdup (note);
+ temp->next = pending_notes;
+ temp->number = current_footnote_number;
+ pending_notes = temp;
+ footnote_count++;
+}
+
+/* How to get rid of existing footnotes. */
+static void
+free_pending_notes (void)
+{
+ FN *temp;
+
+ while ((temp = pending_notes))
+ {
+ free (temp->marker);
+ free (temp->note);
+ pending_notes = pending_notes->next;
+ free (temp);
+ }
+ first_footnote_this_node = 1;
+ footnote_count = 0;
+ current_footnote_number = 1; /* for html */
+}
+
+/* What to do when you see a @footnote construct. */
+
+ /* Handle a "footnote".
+ footnote *{this is a footnote}
+ where "*" is the (optional) marker character for this note. */
+void
+cm_footnote (void)
+{
+ char *marker;
+ char *note;
+
+ get_until ("{", &marker);
+ canon_white (marker);
+
+ if (macro_expansion_output_stream && !executing_string)
+ append_to_expansion_output (input_text_offset + 1); /* include the { */
+
+ /* Read the argument in braces. */
+ if (curchar () != '{')
+ {
+ line_error (_("`%c%s' needs an argument `{...}', not just `%s'"),
+ COMMAND_PREFIX, command, marker);
+ free (marker);
+ return;
+ }
+ else
+ {
+ int len;
+ int braces = 1;
+ int loc = ++input_text_offset;
+
+ while (braces)
+ {
+ if (loc == input_text_length)
+ {
+ line_error (_("No closing brace for footnote `%s'"), marker);
+ return;
+ }
+
+ if (input_text[loc] == '{')
+ braces++;
+ else if (input_text[loc] == '}')
+ braces--;
+ else if (input_text[loc] == '\n')
+ line_number++;
+
+ loc++;
+ }
+
+ len = (loc - input_text_offset) - 1;
+ note = xmalloc (len + 1);
+ memcpy (note, &input_text[input_text_offset], len);
+ note[len] = 0;
+ input_text_offset = loc;
+ }
+
+ /* Must write the macro-expanded argument to the macro expansion
+ output stream. This is like the case in index_add_arg. */
+ if (macro_expansion_output_stream && !executing_string)
+ {
+ /* Calling me_execute_string on a lone } provokes an error, since
+ as far as the reader knows there is no matching {. We wrote
+ the { above in the call to append_to_expansion_output. */
+ me_execute_string_keep_state (note, "}");
+ }
+
+ if (!current_node || !*current_node)
+ {
+ line_error (_("Footnote defined without parent node"));
+ free (marker);
+ free (note);
+ return;
+ }
+
+ /* output_pending_notes is non-reentrant (it uses a global data
+ structure pending_notes, which it frees before it returns), and
+ TeX doesn't grok footnotes inside footnotes anyway. Disallow
+ that. */
+ if (already_outputting_pending_notes)
+ {
+ line_error (_("Footnotes inside footnotes are not allowed"));
+ free (marker);
+ free (note);
+ return;
+ }
+
+ if (!*marker)
+ {
+ free (marker);
+
+ if (number_footnotes)
+ {
+ marker = xmalloc (10);
+ sprintf (marker, "%d", current_footnote_number);
+ }
+ else
+ marker = xstrdup ("*");
+ }
+
+ if (xml)
+ xml_insert_footnote (note);
+ else
+ {
+ remember_note (marker, note);
+
+ /* fixme: html: footnote processing needs work; we currently ignore
+ the style requested; we could clash with a node name of the form
+ `fn-<n>', though that's unlikely. */
+ if (html)
+ {
+ /* Hyperlink also serves as an anchor (mnemonic: fnd is footnote
+ definition.) */
+ add_html_elt ("<a rel=\"footnote\" href=");
+ add_word_args ("\"#fn-%d\" name=\"fnd-%d\"><sup>%s</sup></a>",
+ current_footnote_number, current_footnote_number,
+ marker);
+ }
+ else
+ /* Your method should at least insert MARKER. */
+ switch (footnote_style)
+ {
+ case separate_node:
+ add_word_args ("(%s)", marker);
+ execute_string (" (*note %s-Footnote-%d::)",
+ current_node, current_footnote_number);
+ if (first_footnote_this_node)
+ {
+ char *temp_string, *expanded_ref;
+
+ temp_string = xmalloc (strlen (current_node)
+ + strlen ("-Footnotes") + 1);
+
+ strcpy (temp_string, current_node);
+ strcat (temp_string, "-Footnotes");
+ expanded_ref = expansion (temp_string, 0);
+ remember_node_reference (expanded_ref, line_number,
+ followed_reference);
+ free (temp_string);
+ free (expanded_ref);
+ first_footnote_this_node = 0;
+ }
+ break;
+
+ case end_node:
+ add_word_args ("(%s)", marker);
+ break;
+
+ default:
+ break;
+ }
+ current_footnote_number++;
+ }
+ free (marker);
+ free (note);
+}
+
+/* Output the footnotes. We are at the end of the current node. */
+void
+output_pending_notes (void)
+{
+ FN *footnote = pending_notes;
+
+ if (!pending_notes)
+ return;
+
+ if (html)
+ {
+ add_html_block_elt ("<div class=\"footnote\">\n<hr>\n");
+ /* We add an anchor here so @printindex can refer to this point
+ (as the node name) for entries defined in footnotes. */
+ if (!splitting)
+ add_word ("<a name=\"texinfo-footnotes-in-document\"></a>");
+ add_word_args ("<h4>%s</h4>", (char *) _("Footnotes"));
+ }
+ else
+ switch (footnote_style)
+ {
+ case separate_node:
+ {
+ char *old_current_node = current_node;
+ char *old_command = xstrdup (command);
+
+ already_outputting_pending_notes++;
+ execute_string ("%cnode %s-Footnotes,,,%s\n",
+ COMMAND_PREFIX, current_node, current_node);
+ already_outputting_pending_notes--;
+ current_node = old_current_node;
+ free (command);
+ command = old_command;
+ }
+ break;
+
+ case end_node:
+ close_paragraph ();
+ in_fixed_width_font++;
+ /* This string should be translated according to the
+ @documentlanguage, not the current LANG. We can't do that
+ yet, so leave it in English. */
+ execute_string ("---------- Footnotes ----------\n\n");
+ in_fixed_width_font--;
+ break;
+ }
+
+ /* Handle the footnotes in reverse order. */
+ {
+ int save_in_fixed_width_font = in_fixed_width_font;
+ FN **array = xmalloc ((footnote_count + 1) * sizeof (FN *));
+ array[footnote_count] = NULL;
+
+ while (--footnote_count > -1)
+ {
+ array[footnote_count] = footnote;
+ footnote = footnote->next;
+ }
+
+ filling_enabled = 1;
+ indented_fill = 1;
+ in_fixed_width_font = 0;
+
+ while ((footnote = array[++footnote_count]))
+ {
+ if (html)
+ {
+ /* Make the text of every footnote begin a separate paragraph. */
+ add_html_block_elt ("<p class=\"footnote\"><small>");
+ /* Make footnote number a link to its definition. */
+ add_word_args ("[<a name=\"fn-%d\" href=\"#fnd-%d\">%d</a>]",
+ footnote->number, footnote->number, footnote->number);
+ add_word ("</small> ");
+ already_outputting_pending_notes++;
+ execute_string ("%s", footnote->note);
+ already_outputting_pending_notes--;
+ add_word ("</p>\n");
+ }
+ else
+ {
+ char *old_current_node = current_node;
+ char *old_command = xstrdup (command);
+
+ already_outputting_pending_notes++;
+ execute_string ("%canchor{%s-Footnote-%d}(%s) %s",
+ COMMAND_PREFIX, current_node, footnote->number,
+ footnote->marker, footnote->note);
+ already_outputting_pending_notes--;
+ current_node = old_current_node;
+ free (command);
+ command = old_command;
+ }
+
+ close_paragraph ();
+ }
+
+ if (html)
+ add_word ("<hr></div>");
+ close_paragraph ();
+ free (array);
+
+ in_fixed_width_font = save_in_fixed_width_font;
+ }
+
+ free_pending_notes ();
+}
diff --git a/Build/source/utils/texinfo/makeinfo/footnote.h b/Build/source/utils/texinfo/makeinfo/footnote.h
new file mode 100644
index 00000000000..e4f95102c5f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/footnote.h
@@ -0,0 +1,38 @@
+/* footnote.h -- declarations for footnote.c.
+ $Id: footnote.h,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef FOOTNOTE_H
+#define FOOTNOTE_H
+
+extern int footnote_style_preset;
+extern int current_footnote_number;
+extern int number_footnotes;
+extern int already_outputting_pending_notes;
+
+/* The Texinfo @commands. */
+extern void cm_footnote (void);
+extern void cm_footnotestyle (void);
+
+extern int set_footnote_style (char *string); /* called for -s option */
+
+extern void output_pending_notes (void); /* called for output */
+
+#endif /* !FOOTNOTE_H */
diff --git a/Build/source/utils/texinfo/makeinfo/html.c b/Build/source/utils/texinfo/makeinfo/html.c
new file mode 100644
index 00000000000..be2c136d41f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/html.c
@@ -0,0 +1,822 @@
+/* html.c -- html-related utilities.
+ $Id: html.c,v 1.28 2004/12/06 01:13:06 karl Exp $
+
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "cmds.h"
+#include "files.h"
+#include "html.h"
+#include "lang.h"
+#include "makeinfo.h"
+#include "node.h"
+#include "sectioning.h"
+
+
+/* Append CHAR to BUFFER, (re)allocating as necessary. We don't handle
+ null characters. */
+
+typedef struct
+{
+ unsigned size; /* allocated */
+ unsigned length; /* used */
+ char *buffer;
+} buffer_type;
+
+static buffer_type *
+init_buffer (void)
+{
+ buffer_type *buf = xmalloc (sizeof (buffer_type));
+ buf->length = 0;
+ buf->size = 0;
+ buf->buffer = NULL;
+
+ return buf;
+}
+
+static void
+append_char (buffer_type *buf, int c)
+{
+ buf->length++;
+ if (buf->length >= buf->size)
+ {
+ buf->size += 100;
+ buf->buffer = xrealloc (buf->buffer, buf->size);
+ }
+ buf->buffer[buf->length - 1] = c;
+ buf->buffer[buf->length] = 0;
+}
+
+/* Read the cascading style-sheet file FILENAME. Write out any @import
+ commands, which must come first, by the definition of css. If the
+ file contains any actual css code following the @imports, return it;
+ else return NULL. */
+static char *
+process_css_file (char *filename)
+{
+ int c;
+ int lastchar = 0;
+ FILE *f;
+ buffer_type *import_text = init_buffer ();
+ buffer_type *inline_text = init_buffer ();
+ unsigned lineno = 1;
+ enum { null_state, comment_state, import_state, inline_state } state
+ = null_state, prev_state;
+
+ prev_state = null_state;
+
+ /* read from stdin if `-' is the filename. */
+ f = STREQ (filename, "-") ? stdin : fopen (filename, "r");
+ if (!f)
+ {
+ error (_("%s: could not open --css-file: %s"), progname, filename);
+ return NULL;
+ }
+
+ /* Read the file. The @import statements must come at the beginning,
+ with only whitespace and comments allowed before any inline css code. */
+ while ((c = getc (f)) >= 0)
+ {
+ if (c == '\n')
+ lineno++;
+
+ switch (state)
+ {
+ case null_state: /* between things */
+ if (c == '@')
+ { /* Only @import and @charset should switch into
+ import_state, other @-commands, such as @media, should
+ put us into inline_state. I don't think any other css
+ @-commands start with `i' or `c', although of course
+ this will break when such a command is defined. */
+ int nextchar = getc (f);
+ if (nextchar == 'i' || nextchar == 'c')
+ {
+ append_char (import_text, c);
+ state = import_state;
+ }
+ else
+ {
+ ungetc (nextchar, f); /* wasn't an @import */
+ state = inline_state;
+ }
+ }
+ else if (c == '/')
+ { /* possible start of a comment */
+ int nextchar = getc (f);
+ if (nextchar == '*')
+ state = comment_state;
+ else
+ {
+ ungetc (nextchar, f); /* wasn't a comment */
+ state = inline_state;
+ }
+ }
+ else if (isspace (c))
+ ; /* skip whitespace; maybe should use c_isspace? */
+
+ else
+ /* not an @import, not a comment, not whitespace: we must
+ have started the inline text. */
+ state = inline_state;
+
+ if (state == inline_state)
+ append_char (inline_text, c);
+
+ if (state != null_state)
+ prev_state = null_state;
+ break;
+
+ case comment_state:
+ if (c == '/' && lastchar == '*')
+ state = prev_state; /* end of comment */
+ break; /* else ignore this comment char */
+
+ case import_state:
+ append_char (import_text, c); /* include this import char */
+ if (c == ';')
+ { /* done with @import */
+ append_char (import_text, '\n'); /* make the output nice */
+ state = null_state;
+ prev_state = import_state;
+ }
+ break;
+
+ case inline_state:
+ /* No harm in writing out comments, so don't bother parsing
+ them out, just append everything. */
+ append_char (inline_text, c);
+ break;
+ }
+
+ lastchar = c;
+ }
+
+ /* Reached the end of the file. We should not be still in a comment. */
+ if (state == comment_state)
+ warning (_("%s:%d: --css-file ended in comment"), filename, lineno);
+
+ /* Write the @import text, if any. */
+ if (import_text->buffer)
+ {
+ add_word (import_text->buffer);
+ free (import_text->buffer);
+ free (import_text);
+ }
+
+ /* We're wasting the buffer struct memory, but so what. */
+ return inline_text->buffer;
+}
+
+HSTACK *htmlstack = NULL;
+
+/* See html.h. */
+int html_output_head_p = 0;
+int html_title_written = 0;
+
+void
+html_output_head (void)
+{
+ static const char *html_title = NULL;
+ char *encoding;
+
+ if (html_output_head_p)
+ return;
+ html_output_head_p = 1;
+
+ encoding = current_document_encoding ();
+
+ /* The <title> should not have markup, so use text_expansion. */
+ if (!html_title)
+ html_title = escape_string (title ?
+ text_expansion (title) : (char *) _("Untitled"));
+
+ /* Make sure this is the very first string of the output document. */
+ output_paragraph_offset = 0;
+
+ add_html_block_elt_args ("<html lang=\"%s\">\n<head>\n",
+ language_table[language_code].abbrev);
+
+ /* When splitting, add current node's name to title if it's available and not
+ Top. */
+ if (splitting && current_node && !STREQ (current_node, "Top"))
+ add_word_args ("<title>%s - %s</title>\n",
+ escape_string (xstrdup (current_node)), html_title);
+ else
+ add_word_args ("<title>%s</title>\n", html_title);
+
+ add_word ("<meta http-equiv=\"Content-Type\" content=\"text/html");
+ if (encoding && *encoding)
+ add_word_args ("; charset=%s", encoding);
+
+ add_word ("\">\n");
+
+ if (!document_description)
+ document_description = html_title;
+
+ add_word_args ("<meta name=\"description\" content=\"%s\">\n",
+ document_description);
+ add_word_args ("<meta name=\"generator\" content=\"makeinfo %s\">\n",
+ VERSION);
+
+ /* Navigation bar links. */
+ if (!splitting)
+ add_word ("<link title=\"Top\" rel=\"top\" href=\"#Top\">\n");
+ else if (tag_table)
+ {
+ /* Always put a top link. */
+ add_word ("<link title=\"Top\" rel=\"start\" href=\"index.html#Top\">\n");
+
+ /* We already have a top link, avoid duplication. */
+ if (tag_table->up && !STREQ (tag_table->up, "Top"))
+ add_link (tag_table->up, "rel=\"up\"");
+
+ if (tag_table->prev)
+ add_link (tag_table->prev, "rel=\"prev\"");
+
+ if (tag_table->next)
+ add_link (tag_table->next, "rel=\"next\"");
+
+ /* fixxme: Look for a way to put links to various indices in the
+ document. Also possible candidates to be added here are First and
+ Last links. */
+ }
+ else
+ {
+ /* We are splitting, but we neither have a tag_table. So this must be
+ index.html. So put a link to Top. */
+ add_word ("<link title=\"Top\" rel=\"start\" href=\"#Top\">\n");
+ }
+
+ add_word ("<link href=\"http://www.gnu.org/software/texinfo/\" \
+rel=\"generator-home\" title=\"Texinfo Homepage\">\n");
+
+ if (copying_text)
+ { /* It is not ideal that we include the html markup here within
+ <head>, so we use text_expansion. */
+ insert_string ("<!--\n");
+ insert_string (text_expansion (copying_text));
+ insert_string ("-->\n");
+ }
+
+ /* Put the style definitions in a comment for the sake of browsers
+ that don't support <style>. */
+ add_word ("<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\n");
+ add_word ("<style type=\"text/css\"><!--\n");
+
+ {
+ char *css_inline = NULL;
+
+ if (css_include)
+ /* This writes out any @import commands from the --css-file,
+ and returns any actual css code following the imports. */
+ css_inline = process_css_file (css_include);
+
+ /* This seems cleaner than adding <br>'s at the end of each line for
+ these "roman" displays. It's hardly the end of the world if the
+ browser doesn't do <style>s, in any case; they'll just come out in
+ typewriter. */
+#define CSS_FONT_INHERIT "font-family:inherit"
+ add_word_args (" pre.display { %s }\n", CSS_FONT_INHERIT);
+ add_word_args (" pre.format { %s }\n", CSS_FONT_INHERIT);
+
+ /* Alternatively, we could do <font size=-1> in insertion.c, but this
+ way makes it easier to override. */
+#define CSS_FONT_SMALLER "font-size:smaller"
+ add_word_args (" pre.smalldisplay { %s; %s }\n", CSS_FONT_INHERIT,
+ CSS_FONT_SMALLER);
+ add_word_args (" pre.smallformat { %s; %s }\n", CSS_FONT_INHERIT,
+ CSS_FONT_SMALLER);
+ add_word_args (" pre.smallexample { %s }\n", CSS_FONT_SMALLER);
+ add_word_args (" pre.smalllisp { %s }\n", CSS_FONT_SMALLER);
+
+ /* Since HTML doesn't have a sc element, we use span with a bit of
+ CSS spice instead. */
+#define CSS_FONT_SMALL_CAPS "font-variant:small-caps"
+ add_word_args (" span.sc { %s }\n", CSS_FONT_SMALL_CAPS);
+
+ /* Roman (default) font class, closest we can come. */
+#define CSS_FONT_ROMAN "font-family:serif; font-weight:normal;"
+ add_word_args (" span.roman { %s } \n", CSS_FONT_ROMAN);
+
+ /* Sans serif font class. */
+#define CSS_FONT_SANSSERIF "font-family:sans-serif; font-weight:normal;"
+ add_word_args (" span.sansserif { %s } \n", CSS_FONT_SANSSERIF);
+
+ /* Write out any css code from the user's --css-file. */
+ if (css_inline)
+ insert_string (css_inline);
+
+ add_word ("--></style>\n");
+ }
+
+ add_word ("</head>\n<body>\n");
+
+ if (title && !html_title_written && titlepage_cmd_present)
+ {
+ add_word_args ("<h1 class=\"settitle\">%s</h1>\n", html_title);
+ html_title_written = 1;
+ }
+
+ free (encoding);
+}
+
+/* Escape HTML special characters in the string if necessary,
+ returning a pointer to a possibly newly-allocated one. */
+char *
+escape_string (char *string)
+{
+ char *newstring;
+ int i = 0, newlen = 0;
+
+ do
+ {
+ /* Find how much to allocate. */
+ switch (string[i])
+ {
+ case '"':
+ newlen += 6; /* `&quot;' */
+ break;
+ case '&':
+ newlen += 5; /* `&amp;' */
+ break;
+ case '<':
+ case '>':
+ newlen += 4; /* `&lt;', `&gt;' */
+ break;
+ default:
+ newlen++;
+ }
+ }
+ while (string[i++]);
+
+ if (newlen == i) return string; /* Already OK. */
+
+ newstring = xmalloc (newlen);
+ i = 0;
+ do
+ {
+ switch (string[i])
+ {
+ case '"':
+ strcpy (newstring, "&quot;");
+ newstring += 6;
+ break;
+ case '&':
+ strcpy (newstring, "&amp;");
+ newstring += 5;
+ break;
+ case '<':
+ strcpy (newstring, "&lt;");
+ newstring += 4;
+ break;
+ case '>':
+ strcpy (newstring, "&gt;");
+ newstring += 4;
+ break;
+ default:
+ newstring[0] = string[i];
+ newstring++;
+ }
+ }
+ while (string[i++]);
+ free (string);
+ return newstring - newlen;
+}
+
+/* Save current tag. */
+static void
+push_tag (char *tag, char *attribs)
+{
+ HSTACK *newstack = xmalloc (sizeof (HSTACK));
+
+ newstack->tag = tag;
+ newstack->attribs = xstrdup (attribs);
+ newstack->next = htmlstack;
+ htmlstack = newstack;
+}
+
+/* Get last tag. */
+static void
+pop_tag (void)
+{
+ HSTACK *tos = htmlstack;
+
+ if (!tos)
+ {
+ line_error (_("[unexpected] no html tag to pop"));
+ return;
+ }
+
+ free (htmlstack->attribs);
+
+ htmlstack = htmlstack->next;
+ free (tos);
+}
+
+/* Check if tag is an empty or a whitespace only element.
+ If so, remove it, keeping whitespace intact. */
+int
+rollback_empty_tag (char *tag)
+{
+ int check_position = output_paragraph_offset;
+ int taglen = strlen (tag);
+ int rollback_happened = 0;
+ char *contents = "";
+ char *contents_canon_white = "";
+
+ /* If output_paragraph is empty, we cannot rollback :-\ */
+ if (output_paragraph_offset <= 0)
+ return 0;
+
+ /* Find the end of the previous tag. */
+ while (output_paragraph[check_position-1] != '>' && check_position > 0)
+ check_position--;
+
+ /* Save stuff between tag's end to output_paragraph's end. */
+ if (check_position != output_paragraph_offset)
+ {
+ contents = xmalloc (output_paragraph_offset - check_position + 1);
+ memcpy (contents, output_paragraph + check_position,
+ output_paragraph_offset - check_position);
+
+ contents[output_paragraph_offset - check_position] = '\0';
+
+ contents_canon_white = xstrdup (contents);
+ canon_white (contents_canon_white);
+ }
+
+ /* Find the start of the previous tag. */
+ while (output_paragraph[check_position-1] != '<' && check_position > 0)
+ check_position--;
+
+ /* Check to see if this is the tag. */
+ if (strncmp ((char *) output_paragraph + check_position, tag, taglen) == 0
+ && (whitespace (output_paragraph[check_position + taglen])
+ || output_paragraph[check_position + taglen] == '>'))
+ {
+ if (!contents_canon_white || !*contents_canon_white)
+ {
+ /* Empty content after whitespace removal, so roll it back. */
+ output_paragraph_offset = check_position - 1;
+ rollback_happened = 1;
+
+ /* Original contents may not be empty (whitespace.) */
+ if (contents && *contents)
+ {
+ insert_string (contents);
+ free (contents);
+ }
+ }
+ }
+
+ return rollback_happened;
+}
+
+/* Open or close TAG according to START_OR_END. */
+void
+#if defined (VA_FPRINTF) && __STDC__
+insert_html_tag_with_attribute (int start_or_end, char *tag, char *format, ...)
+#else
+insert_html_tag_with_attribute (start_or_end, tag, format, va_alist)
+ int start_or_end;
+ char *tag;
+ char *format;
+ va_dcl
+#endif
+{
+ char *old_tag = NULL;
+ char *old_attribs = NULL;
+ char formatted_attribs[2000]; /* xx no fixed limits */
+ int do_return = 0;
+ extern int in_html_elt;
+
+ if (start_or_end != START)
+ pop_tag ();
+
+ if (htmlstack)
+ {
+ old_tag = htmlstack->tag;
+ old_attribs = htmlstack->attribs;
+ }
+
+ if (format)
+ {
+#ifdef VA_SPRINTF
+ va_list ap;
+#endif
+
+ VA_START (ap, format);
+#ifdef VA_SPRINTF
+ VA_SPRINTF (formatted_attribs, format, ap);
+#else
+ sprintf (formatted_attribs, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif
+ va_end (ap);
+ }
+ else
+ formatted_attribs[0] = '\0';
+
+ /* Exception: can nest multiple spans. */
+ if (htmlstack
+ && STREQ (htmlstack->tag, tag)
+ && !(STREQ (tag, "span") && STREQ (old_attribs, formatted_attribs)))
+ do_return = 1;
+
+ if (start_or_end == START)
+ push_tag (tag, formatted_attribs);
+
+ if (do_return)
+ return;
+
+ in_html_elt++;
+
+ /* texinfo.tex doesn't support more than one font attribute
+ at the same time. */
+ if ((start_or_end == START) && old_tag && *old_tag
+ && !rollback_empty_tag (old_tag))
+ add_word_args ("</%s>", old_tag);
+
+ if (*tag)
+ {
+ if (start_or_end == START)
+ add_word_args (format ? "<%s %s>" : "<%s>", tag, formatted_attribs);
+ else if (!rollback_empty_tag (tag))
+ /* Insert close tag only if we didn't rollback,
+ in which case the opening tag is removed. */
+ add_word_args ("</%s>", tag);
+ }
+
+ if ((start_or_end != START) && old_tag && *old_tag)
+ add_word_args (strlen (old_attribs) > 0 ? "<%s %s>" : "<%s>",
+ old_tag, old_attribs);
+
+ in_html_elt--;
+}
+
+void
+insert_html_tag (int start_or_end, char *tag)
+{
+ insert_html_tag_with_attribute (start_or_end, tag, NULL);
+}
+
+/* Output an HTML <link> to the filename for NODE, including the
+ other string as extra attributes. */
+void
+add_link (char *nodename, char *attributes)
+{
+ if (nodename)
+ {
+ add_html_elt ("<link ");
+ add_word_args ("%s", attributes);
+ add_word_args (" href=\"");
+ add_anchor_name (nodename, 1);
+ add_word_args ("\" title=\"%s\">\n", nodename);
+ }
+}
+
+/* Output NAME with characters escaped as appropriate for an anchor
+ name, i.e., escape URL special characters with our _00hh convention
+ if OLD is zero. (See the manual for details on the new scheme.)
+
+ If OLD is nonzero, generate the node name with the 4.6-and-earlier
+ convention of %hh (and more special characters output as-is, notably
+ - and *). This is only so that external references to old names can
+ still work with HTML generated by the new makeinfo; the gcc folks
+ needed this. Our own HTML does not refer to these names. */
+
+void
+add_escaped_anchor_name (char *name, int old)
+{
+ canon_white (name);
+
+ if (!old && !strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ *name))
+ { /* XHTML does not allow anything but an ASCII letter to start an
+ identifier. Therefore kludge in this constant string if we
+ have a nonletter. */
+ add_word ("g_t");
+ }
+
+ for (; *name; name++)
+ {
+ if (cr_or_whitespace (*name))
+ add_char ('-');
+
+ else if (!old && !URL_SAFE_CHAR (*name))
+ /* Cast so characters with the high bit set are treated as >128,
+ for example o-umlaut should be 246, not -10. */
+ add_word_args ("_00%x", (unsigned char) *name);
+
+ else if (old && !URL_SAFE_CHAR (*name) && !OLD_URL_SAFE_CHAR (*name))
+ /* Different output convention, but still cast as above. */
+ add_word_args ("%%%x", (unsigned char) *name);
+
+ else
+ add_char (*name);
+ }
+}
+
+/* Insert the text for the name of a reference in an HTML anchor
+ appropriate for NODENAME.
+
+ If HREF is zero, generate text for name= in the new node name
+ conversion convention.
+ If HREF is negative, generate text for name= in the old convention.
+ If HREF is positive, generate the name for an href= attribute, i.e.,
+ including the `#' if it's an internal reference. */
+void
+add_anchor_name (char *nodename, int href)
+{
+ if (href > 0)
+ {
+ if (splitting)
+ add_url_name (nodename, href);
+ add_char ('#');
+ }
+ /* Always add NODENAME, so that the reference would pinpoint the
+ exact node on its file. This is so several nodes could share the
+ same file, in case of file-name clashes, but also for more
+ accurate browser positioning. */
+ if (strcasecmp (nodename, "(dir)") == 0)
+ /* Strip the parens, but keep the original letter-case. */
+ add_word_args ("%.3s", nodename + 1);
+ else if (strcasecmp (nodename, "top") == 0)
+ add_word ("Top");
+ else
+ add_escaped_anchor_name (nodename, href < 0);
+}
+
+/* Insert the text for the name of a reference in an HTML url, aprropriate
+ for NODENAME */
+void
+add_url_name (char *nodename, int href)
+{
+ add_nodename_to_filename (nodename, href);
+}
+
+/* Convert non [A-Za-z0-9] to _00xx, where xx means the hexadecimal
+ representation of the ASCII character. Also convert spaces and
+ newlines to dashes. */
+static void
+fix_filename (char *filename)
+{
+ int i;
+ int len = strlen (filename);
+ char *oldname = xstrdup (filename);
+
+ *filename = '\0';
+
+ for (i = 0; i < len; i++)
+ {
+ if (cr_or_whitespace (oldname[i]))
+ strcat (filename, "-");
+ else if (URL_SAFE_CHAR (oldname[i]))
+ strncat (filename, (char *) oldname + i, 1);
+ else
+ {
+ char *hexchar = xmalloc (6 * sizeof (char));
+ sprintf (hexchar, "_00%x", (unsigned char) oldname[i]);
+ strcat (filename, hexchar);
+ free (hexchar);
+ }
+
+ /* Check if we are nearing boundaries. */
+ if (strlen (filename) >= PATH_MAX - 20)
+ break;
+ }
+
+ free (oldname);
+}
+
+/* As we can't look-up a (forward-referenced) nodes' html filename
+ from the tentry, we take the easy way out. We assume that
+ nodenames are unique, and generate the html filename from the
+ nodename, that's always known. */
+static char *
+nodename_to_filename_1 (char *nodename, int href)
+{
+ char *p;
+ char *filename;
+ char dirname[PATH_MAX];
+
+ if (strcasecmp (nodename, "Top") == 0)
+ {
+ /* We want to convert references to the Top node into
+ "index.html#Top". */
+ if (href)
+ filename = xstrdup ("index.html"); /* "#Top" is added by our callers */
+ else
+ filename = xstrdup ("Top");
+ }
+ else if (strcasecmp (nodename, "(dir)") == 0)
+ /* We want to convert references to the (dir) node into
+ "../index.html". */
+ filename = xstrdup ("../index.html");
+ else
+ {
+ filename = xmalloc (PATH_MAX);
+ dirname[0] = '\0';
+ *filename = '\0';
+
+ /* Check for external reference: ``(info-document)node-name''
+ Assume this node lives at: ``../info-document/node-name.html''
+
+ We need to handle the special case (sigh): ``(info-document)'',
+ ie, an external top-node, which should translate to:
+ ``../info-document/info-document.html'' */
+
+ p = nodename;
+ if (*nodename == '(')
+ {
+ int length;
+
+ p = strchr (nodename, ')');
+ if (p == NULL)
+ {
+ line_error (_("[unexpected] invalid node name: `%s'"), nodename);
+ xexit (1);
+ }
+
+ length = p - nodename - 1;
+ if (length > 5 &&
+ FILENAME_CMPN (p - 5, ".info", 5) == 0)
+ length -= 5;
+ /* This is for DOS, and also for Windows and GNU/Linux
+ systems that might have Info files copied from a DOS 8+3
+ filesystem. */
+ if (length > 4 &&
+ FILENAME_CMPN (p - 4, ".inf", 4) == 0)
+ length -= 4;
+ strcpy (filename, "../");
+ strncpy (dirname, nodename + 1, length);
+ *(dirname + length) = '\0';
+ fix_filename (dirname);
+ strcat (filename, dirname);
+ strcat (filename, "/");
+ p++;
+ }
+
+ /* In the case of just (info-document), there will be nothing
+ remaining, and we will refer to ../info-document/, which will
+ work fine. */
+ strcat (filename, p);
+ if (*p)
+ {
+ /* Hmm */
+ fix_filename (filename + strlen (filename) - strlen (p));
+ strcat (filename, ".html");
+ }
+ }
+
+ /* Produce a file name suitable for the underlying filesystem. */
+ normalize_filename (filename);
+
+#if 0
+ /* We add ``#Nodified-filename'' anchor to external references to be
+ prepared for non-split HTML support. Maybe drop this. */
+ if (href && *dirname)
+ {
+ strcat (filename, "#");
+ strcat (filename, p);
+ /* Hmm, again */
+ fix_filename (filename + strlen (filename) - strlen (p));
+ }
+#endif
+
+ return filename;
+}
+
+/* If necessary, ie, if current filename != filename of node, output
+ the node name. */
+void
+add_nodename_to_filename (char *nodename, int href)
+{
+ /* for now, don't check: always output filename */
+ char *filename = nodename_to_filename_1 (nodename, href);
+ add_word (filename);
+ free (filename);
+}
+
+char *
+nodename_to_filename (char *nodename)
+{
+ /* The callers of nodename_to_filename use the result to produce
+ <a href=, so call nodename_to_filename_1 with last arg non-zero. */
+ return nodename_to_filename_1 (nodename, 1);
+}
diff --git a/Build/source/utils/texinfo/makeinfo/html.h b/Build/source/utils/texinfo/makeinfo/html.h
new file mode 100644
index 00000000000..d2b5411282f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/html.h
@@ -0,0 +1,65 @@
+/* html.h -- declarations for html-related utilities.
+ $Id: html.h,v 1.6 2004/11/30 02:03:23 karl Exp $
+
+ Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef HTML_H
+#define HTML_H
+
+/* A stack of font tags. */
+typedef struct hstack
+{
+ struct hstack *next;
+ char *tag;
+ char *attribs;
+} HSTACK;
+
+/* Nonzero if we have output the <head>. */
+extern int html_output_head_p;
+
+/* Nonzero if we have output a title, from @titlefont or @settitle. */
+extern int html_title_written;
+
+/* Perform the <head> output. */
+extern void html_output_head (void);
+
+/* Escape &<>. */
+extern char *escape_string (char *);
+
+/* Open or close TAG according to START_OR_END. */
+extern void insert_html_tag (int start_or_end, char *tag);
+
+/* Output HTML <link> to NODE, plus extra ATTRIBUTES. */
+extern void add_link (char *nodename, char *attributes);
+
+/* Escape URL-special characters. */
+extern void add_escaped_anchor_name (char *name, int old);
+
+/* See html.c. */
+extern void add_anchor_name (char *nodename, int href);
+extern void add_url_name (char *nodename, int href);
+extern void add_nodename_to_filename (char *nodename, int href);
+extern char *nodename_to_filename (char *nodename);
+extern int rollback_empty_tag (char *tag);
+
+#if defined (VA_FPRINTF) && __STDC__
+extern void insert_html_tag_with_attribute (int start_or_end, char *tag, char *format, ...);
+#else
+extern void insert_html_tag_with_attribute ();
+#endif
+
+#endif /* !HTML_H */
diff --git a/Build/source/utils/texinfo/makeinfo/index.c b/Build/source/utils/texinfo/makeinfo/index.c
new file mode 100644
index 00000000000..710e8b6855b
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/index.c
@@ -0,0 +1,964 @@
+/* index.c -- indexing for Texinfo.
+ $Id: index.c,v 1.17 2004/11/30 02:03:23 karl Exp $
+
+ Copyright (C) 1998, 1999, 2002, 2003, 2004 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "files.h"
+#include "footnote.h"
+#include "html.h"
+#include "index.h"
+#include "lang.h"
+#include "macro.h"
+#include "sectioning.h"
+#include "toc.h"
+#include "xml.h"
+
+INDEX_ALIST **name_index_alist = NULL;
+
+/* An array of pointers. Each one is for a different index. The
+ "synindex" command changes which array slot is pointed to by a
+ given "index". */
+INDEX_ELT **the_indices = NULL;
+
+/* The number of defined indices. */
+int defined_indices = 0;
+
+/* This is the order of the index. */
+int index_counter = 0;
+
+/* Stuff for defining commands on the fly. */
+COMMAND **user_command_array = NULL;
+int user_command_array_len = 0;
+
+/* How to compare index entries for sorting. May be set to strcoll. */
+int (*index_compare_fn) (const char *a, const char *b) = strcasecmp;
+
+/* Function to compare index entries for sorting. (Calls
+ `index_compare_fn' above.) */
+int index_element_compare (const void *element1, const void *element2);
+
+/* Find which element in the known list of indices has this name.
+ Returns -1 if NAME isn't found. */
+static int
+find_index_offset (char *name)
+{
+ int i;
+ for (i = 0; i < defined_indices; i++)
+ if (name_index_alist[i] && STREQ (name, name_index_alist[i]->name))
+ return i;
+ return -1;
+}
+
+/* Return a pointer to the entry of (name . index) for this name.
+ Return NULL if the index doesn't exist. */
+static INDEX_ALIST *
+find_index (char *name)
+{
+ int offset = find_index_offset (name);
+ if (offset > -1)
+ return name_index_alist[offset];
+ else
+ return NULL;
+}
+
+/* User-defined commands, which happens only from user-defined indexes.
+ Used to initialize the builtin indices, too. */
+static void
+define_user_command (char *name, COMMAND_FUNCTION (*proc), int needs_braces_p)
+{
+ int slot = user_command_array_len;
+ user_command_array_len++;
+
+ if (!user_command_array)
+ user_command_array = xmalloc (1 * sizeof (COMMAND *));
+
+ user_command_array = xrealloc (user_command_array,
+ (1 + user_command_array_len) * sizeof (COMMAND *));
+
+ user_command_array[slot] = xmalloc (sizeof (COMMAND));
+ user_command_array[slot]->name = xstrdup (name);
+ user_command_array[slot]->proc = proc;
+ user_command_array[slot]->argument_in_braces = needs_braces_p;
+}
+
+/* Please release me, let me go... */
+static void
+free_index (INDEX_ELT *index)
+{
+ INDEX_ELT *temp;
+
+ while ((temp = index))
+ {
+ free (temp->entry);
+ free (temp->entry_text);
+ /* Do not free the node, because we already freed the tag table,
+ which freed all the node names. */
+ /* free (temp->node); */
+ index = index->next;
+ free (temp);
+ }
+}
+
+/* Flush an index by name. This will delete the list of entries that
+ would be written by a @printindex command for this index. */
+static void
+undefindex (char *name)
+{
+ int i;
+ int which = find_index_offset (name);
+
+ /* The index might have already been freed if this was the target of
+ an @synindex. */
+ if (which < 0 || !name_index_alist[which])
+ return;
+
+ i = name_index_alist[which]->read_index;
+
+ free_index (the_indices[i]);
+ the_indices[i] = NULL;
+
+ free (name_index_alist[which]->name);
+ free (name_index_alist[which]);
+ name_index_alist[which] = NULL;
+}
+
+/* Add the arguments to the current index command to the index NAME. */
+static void
+index_add_arg (char *name)
+{
+ int which;
+ char *index_entry;
+ INDEX_ALIST *tem;
+
+ tem = find_index (name);
+
+ which = tem ? tem->write_index : -1;
+
+ if (macro_expansion_output_stream && !executing_string)
+ append_to_expansion_output (input_text_offset + 1);
+
+ get_rest_of_line (0, &index_entry);
+ ignore_blank_line ();
+
+ if (macro_expansion_output_stream && !executing_string)
+ {
+ char *index_line = xmalloc (strlen (index_entry) + 2);
+ sprintf (index_line, "%s\n", index_entry);
+ me_execute_string_keep_state (index_line, NULL);
+ free (index_line);
+ }
+
+ if (which < 0)
+ {
+ line_error (_("Unknown index `%s'"), name);
+ free (index_entry);
+ }
+ else
+ {
+ INDEX_ELT *new = xmalloc (sizeof (INDEX_ELT));
+
+ index_counter++;
+
+ /* Get output line number updated before doing anything. */
+ if (!html && !xml)
+ flush_output ();
+
+ new->next = the_indices[which];
+ new->entry = NULL;
+ new->entry_text = index_entry;
+ /* Since footnotes are handled at the very end of the document,
+ node name in the non-split HTML outputs always show the last
+ node. We artificially make it ``Footnotes''. */
+ if (html && !splitting && already_outputting_pending_notes)
+ new->node = xstrdup (_("Footnotes"));
+ else
+ new->node = current_node ? current_node : xstrdup ("");
+ if (!html && !xml && no_headers)
+ {
+ new->section = current_sectioning_number ();
+ if (strlen (new->section) == 0)
+ new->section_name = current_sectioning_name ();
+ else
+ new->section_name = "";
+ }
+ else
+ {
+ new->section = NULL;
+ new->section_name = NULL;
+ }
+ new->code = tem->code;
+ new->defining_line = line_number - 1;
+ new->output_line = no_headers ? output_line_number : node_line_number;
+ /* We need to make a copy since input_filename may point to
+ something that goes away, for example, inside a macro.
+ (see the findexerr test). */
+ new->defining_file = xstrdup (input_filename);
+
+ if (html && splitting)
+ {
+ if (current_output_filename && *current_output_filename)
+ new->output_file = filename_part (current_output_filename);
+ else
+ new->output_file = xstrdup ("");
+ }
+ else
+ new->output_file = NULL;
+
+ new->entry_number = index_counter;
+ the_indices[which] = new;
+
+#if 0
+ /* The index breaks if there are colons in the entry.
+ -- This is true, but it's too painful to force changing index
+ entries to use `colon', and too confusing for users. The real
+ fix is to change Info support to support arbitrary characters
+ in node names, and we're not ready to do that. --karl,
+ 19mar02. */
+ if (strchr (new->entry_text, ':'))
+ warning (_("Info cannot handle `:' in index entry `%s'"),
+ new->entry_text);
+#endif
+
+ if (html)
+ {
+ /* Anchor. */
+ int removed_empty_elt = 0;
+
+ /* We must put the anchor outside the <dl> and <ul> blocks. */
+ if (rollback_empty_tag ("dl"))
+ removed_empty_elt = 1;
+ else if (rollback_empty_tag ("ul"))
+ removed_empty_elt = 2;
+
+ add_word ("<a name=\"index-");
+ add_escaped_anchor_name (index_entry, 0);
+ add_word_args ("-%d\"></a>", index_counter);
+
+ if (removed_empty_elt == 1)
+ add_html_block_elt_args ("\n<dl>");
+ else if (removed_empty_elt == 2)
+ add_html_block_elt_args ("\n<ul>");
+ }
+ }
+
+ if (xml)
+ xml_insert_indexterm (index_entry, name);
+}
+
+/* The function which user defined index commands call. */
+static void
+gen_index (void)
+{
+ char *name = xstrdup (command);
+ if (strlen (name) >= strlen ("index"))
+ name[strlen (name) - strlen ("index")] = 0;
+ index_add_arg (name);
+ free (name);
+}
+
+/* Define an index known as NAME. We assign the slot number.
+ If CODE is nonzero, make this a code index. */
+static void
+defindex (char *name, int code)
+{
+ int i, slot;
+
+ /* If it already exists, flush it. */
+ undefindex (name);
+
+ /* Try to find an empty slot. */
+ slot = -1;
+ for (i = 0; i < defined_indices; i++)
+ if (!name_index_alist[i])
+ {
+ slot = i;
+ break;
+ }
+
+ if (slot < 0)
+ { /* No such luck. Make space for another index. */
+ slot = defined_indices;
+ defined_indices++;
+
+ name_index_alist = (INDEX_ALIST **)
+ xrealloc (name_index_alist, (1 + defined_indices)
+ * sizeof (INDEX_ALIST *));
+ the_indices = (INDEX_ELT **)
+ xrealloc (the_indices, (1 + defined_indices) * sizeof (INDEX_ELT *));
+ }
+
+ /* We have a slot. Start assigning. */
+ name_index_alist[slot] = xmalloc (sizeof (INDEX_ALIST));
+ name_index_alist[slot]->name = xstrdup (name);
+ name_index_alist[slot]->read_index = slot;
+ name_index_alist[slot]->write_index = slot;
+ name_index_alist[slot]->code = code;
+
+ the_indices[slot] = NULL;
+}
+
+/* Define an index NAME, implicitly @code if CODE is nonzero. */
+static void
+top_defindex (char *name, int code)
+{
+ char *temp;
+
+ temp = xmalloc (1 + strlen (name) + strlen ("index"));
+ sprintf (temp, "%sindex", name);
+ define_user_command (temp, gen_index, 0);
+ defindex (name, code);
+ free (temp);
+}
+
+/* Set up predefined indices. */
+void
+init_indices (void)
+{
+ int i;
+
+ /* Create the default data structures. */
+
+ /* Initialize data space. */
+ if (!the_indices)
+ {
+ the_indices = xmalloc ((1 + defined_indices) * sizeof (INDEX_ELT *));
+ the_indices[defined_indices] = NULL;
+
+ name_index_alist = xmalloc ((1 + defined_indices)
+ * sizeof (INDEX_ALIST *));
+ name_index_alist[defined_indices] = NULL;
+ }
+
+ /* If there were existing indices, get rid of them now. */
+ for (i = 0; i < defined_indices; i++)
+ {
+ if (name_index_alist[i])
+ { /* Suppose we're called with two input files, and the first
+ does a @synindex pg cp. Then, when we get here to start
+ the second file, the "pg" element won't get freed by
+ undefindex (because it's pointing to "cp"). So free it
+ here; otherwise, when we try to define the pg index again
+ just below, it will still point to cp. */
+ undefindex (name_index_alist[i]->name);
+
+ /* undefindex sets all this to null in some cases. */
+ if (name_index_alist[i])
+ {
+ free (name_index_alist[i]->name);
+ free (name_index_alist[i]);
+ name_index_alist[i] = NULL;
+ }
+ }
+ }
+
+ /* Add the default indices. */
+ top_defindex ("cp", 0); /* cp is the only non-code index. */
+ top_defindex ("fn", 1);
+ top_defindex ("ky", 1);
+ top_defindex ("pg", 1);
+ top_defindex ("tp", 1);
+ top_defindex ("vr", 1);
+}
+
+/* Given an index name, return the offset in the_indices of this index,
+ or -1 if there is no such index. */
+static int
+translate_index (char *name)
+{
+ INDEX_ALIST *which = find_index (name);
+
+ if (which)
+ return which->read_index;
+ else
+ return -1;
+}
+
+/* Return the index list which belongs to NAME. */
+INDEX_ELT *
+index_list (char *name)
+{
+ int which = translate_index (name);
+ if (which < 0)
+ return (INDEX_ELT *) -1;
+ else
+ return the_indices[which];
+}
+
+/* Define a new index command. Arg is name of index. */
+static void
+gen_defindex (int code)
+{
+ char *name;
+ get_rest_of_line (0, &name);
+
+ if (find_index (name))
+ {
+ line_error (_("Index `%s' already exists"), name);
+ }
+ else
+ {
+ char *temp = xmalloc (strlen (name) + sizeof ("index"));
+ sprintf (temp, "%sindex", name);
+ define_user_command (temp, gen_index, 0);
+ defindex (name, code);
+ free (temp);
+ }
+
+ free (name);
+}
+
+void
+cm_defindex (void)
+{
+ gen_defindex (0);
+}
+
+void
+cm_defcodeindex (void)
+{
+ gen_defindex (1);
+}
+
+/* Expects 2 args, on the same line. Both are index abbreviations.
+ Make the first one be a synonym for the second one, i.e. make the
+ first one have the same index as the second one. */
+void
+cm_synindex (void)
+{
+ int source, target;
+ char *abbrev1, *abbrev2;
+
+ skip_whitespace ();
+ get_until_in_line (0, " ", &abbrev1);
+ target = find_index_offset (abbrev1);
+ skip_whitespace ();
+ get_until_in_line (0, " ", &abbrev2);
+ source = find_index_offset (abbrev2);
+ if (source < 0 || target < 0)
+ {
+ line_error (_("Unknown index `%s' and/or `%s' in @synindex"),
+ abbrev1, abbrev2);
+ }
+ else
+ {
+ if (xml && !docbook)
+ xml_synindex (abbrev1, abbrev2);
+ else
+ name_index_alist[target]->write_index
+ = name_index_alist[source]->write_index;
+ }
+
+ free (abbrev1);
+ free (abbrev2);
+}
+
+void
+cm_pindex (void) /* Pinhead index. */
+{
+ index_add_arg ("pg");
+}
+
+void
+cm_vindex (void) /* Variable index. */
+{
+ index_add_arg ("vr");
+}
+
+void
+cm_kindex (void) /* Key index. */
+{
+ index_add_arg ("ky");
+}
+
+void
+cm_cindex (void) /* Concept index. */
+{
+ index_add_arg ("cp");
+}
+
+void
+cm_findex (void) /* Function index. */
+{
+ index_add_arg ("fn");
+}
+
+void
+cm_tindex (void) /* Data Type index. */
+{
+ index_add_arg ("tp");
+}
+
+int
+index_element_compare (const void *element1, const void *element2)
+{
+ INDEX_ELT **elt1 = (INDEX_ELT **) element1;
+ INDEX_ELT **elt2 = (INDEX_ELT **) element2;
+
+ return index_compare_fn ((*elt1)->entry, (*elt2)->entry);
+}
+
+/* Force all index entries to be unique. */
+static void
+make_index_entries_unique (INDEX_ELT **array, int count)
+{
+ int i, j;
+ INDEX_ELT **copy;
+ int counter = 1;
+
+ copy = xmalloc ((1 + count) * sizeof (INDEX_ELT *));
+
+ for (i = 0, j = 0; i < count; i++)
+ {
+ if (i == (count - 1)
+ || array[i]->node != array[i + 1]->node
+ || !STREQ (array[i]->entry, array[i + 1]->entry))
+ copy[j++] = array[i];
+ else
+ {
+ free (array[i]->entry);
+ free (array[i]->entry_text);
+ free (array[i]);
+ }
+ }
+ copy[j] = NULL;
+
+ /* Now COPY contains only unique entries. Duplicated entries in the
+ original array have been freed. Replace the current array with
+ the copy, fixing the NEXT pointers. */
+ for (i = 0; copy[i]; i++)
+ {
+ copy[i]->next = copy[i + 1];
+
+ /* Fix entry names which are the same. They point to different nodes,
+ so we make the entry name unique. */
+ if (copy[i+1]
+ && STREQ (copy[i]->entry, copy[i + 1]->entry)
+ && !html)
+ {
+ char *new_entry_name;
+
+ new_entry_name = xmalloc (10 + strlen (copy[i]->entry));
+ sprintf (new_entry_name, "%s <%d>", copy[i]->entry, counter);
+ free (copy[i]->entry);
+ copy[i]->entry = new_entry_name;
+ counter++;
+ }
+ else
+ counter = 1;
+
+ array[i] = copy[i];
+ }
+ array[i] = NULL;
+
+ /* Free the storage used only by COPY. */
+ free (copy);
+}
+
+
+/* Sort the index passed in INDEX, returning an array of pointers to
+ elements. The array is terminated with a NULL pointer. */
+
+static INDEX_ELT **
+sort_index (INDEX_ELT *index)
+{
+ INDEX_ELT **array;
+ INDEX_ELT *temp;
+ int count = 0;
+ int save_line_number = line_number;
+ char *save_input_filename = input_filename;
+ int save_html = html;
+
+ /* Pretend we are in non-HTML mode, for the purpose of getting the
+ expanded index entry that lacks any markup and other HTML escape
+ characters which could produce a wrong sort order. */
+ /* fixme: html: this still causes some markup, such as non-ASCII
+ characters @AE{} etc., to sort incorrectly. */
+ html = 0;
+
+ for (temp = index, count = 0; temp; temp = temp->next, count++)
+ ;
+ /* We have the length, now we can allocate an array. */
+ array = xmalloc ((count + 1) * sizeof (INDEX_ELT *));
+
+ for (temp = index, count = 0; temp; temp = temp->next, count++)
+ {
+ /* Allocate new memory for the return array, since parts of the
+ original INDEX get freed. Otherwise, if the document calls
+ @printindex twice on the same index, with duplicate entries,
+ we'll have garbage the second time. There are cleaner ways to
+ deal, but this will suffice for now. */
+ array[count] = xmalloc (sizeof (INDEX_ELT));
+ *(array[count]) = *(temp); /* struct assignment, hope it's ok */
+
+ /* Adjust next pointers to use the new memory. */
+ if (count > 0)
+ array[count-1]->next = array[count];
+
+ /* Set line number and input filename to the source line for this
+ index entry, as this expansion finds any errors. */
+ line_number = array[count]->defining_line;
+ input_filename = array[count]->defining_file;
+
+ /* If this particular entry should be printed as a "code" index,
+ then expand it as @code{entry}, i.e., as in fixed-width font. */
+ array[count]->entry = expansion (temp->entry_text, array[count]->code);
+ }
+ array[count] = NULL; /* terminate the array. */
+
+ line_number = save_line_number;
+ input_filename = save_input_filename;
+ html = save_html;
+
+#ifdef HAVE_STRCOLL
+ /* This is not perfect. We should set (then restore) the locale to the
+ documentlanguage, so strcoll operates according to the document's
+ locale, not the user's. For now, I'm just going to assume that
+ those few new documents which use @documentlanguage will be
+ processed in the appropriate locale. In any case, don't use
+ strcoll in the C (aka POSIX) locale, that is the ASCII ordering. */
+ if (language_code != en)
+ {
+ char *lang_env = getenv ("LANG");
+ if (lang_env && !STREQ (lang_env, "C") && !STREQ (lang_env, "POSIX"))
+ index_compare_fn = strcoll;
+ }
+#endif /* HAVE_STRCOLL */
+
+ /* Sort the array. */
+ qsort (array, count, sizeof (INDEX_ELT *), index_element_compare);
+
+ /* Remove duplicate entries. */
+ make_index_entries_unique (array, count);
+
+ /* Replace the original index with the sorted one, in case the
+ document wants to print it again. If the index wasn't empty. */
+ if (index)
+ *index = **array;
+
+ return array;
+}
+
+static void
+insert_index_output_line_no (int line_number, int output_line_number_len)
+{
+ int last_column;
+ int str_size = output_line_number_len + strlen (_("(line )"))
+ + sizeof (NULL);
+ char *out_line_no_str = (char *) xmalloc (str_size + 1);
+
+ /* Do not translate ``(line NNN)'' below for !no_headers case (Info output),
+ because it's something like the ``* Menu'' strings. For plaintext output
+ it should be translated though. */
+ sprintf (out_line_no_str,
+ no_headers ? _("(line %*d)") : "(line %*d)",
+ output_line_number_len, line_number);
+
+ {
+ int i = output_paragraph_offset;
+ while (0 < i && output_paragraph[i-1] != '\n')
+ i--;
+ last_column = output_paragraph_offset - i;
+ }
+
+ if (last_column + strlen (out_line_no_str) > fill_column)
+ {
+ insert ('\n');
+ last_column = 0;
+ }
+
+ while (last_column + strlen (out_line_no_str) < fill_column)
+ {
+ insert (' ');
+ last_column++;
+ }
+
+ insert_string (out_line_no_str);
+ insert ('\n');
+
+ free (out_line_no_str);
+}
+
+/* Nonzero means that we are in the middle of printing an index. */
+int printing_index = 0;
+
+/* Takes one arg, a short name of an index to print.
+ Outputs a menu of the sorted elements of the index. */
+void
+cm_printindex (void)
+{
+ char *index_name;
+ get_rest_of_line (0, &index_name);
+
+ /* get_rest_of_line increments the line number by one,
+ so to make warnings/errors point to the correct line,
+ we decrement the line_number again. */
+ if (!handling_delayed_writes)
+ line_number--;
+
+ if (xml && !docbook)
+ {
+ xml_insert_element (PRINTINDEX, START);
+ insert_string (index_name);
+ xml_insert_element (PRINTINDEX, END);
+ }
+ else if (!handling_delayed_writes)
+ {
+ int command_len = sizeof ("@ ") + strlen (command) + strlen (index_name);
+ char *index_command = xmalloc (command_len + 1);
+
+ close_paragraph ();
+ if (docbook)
+ xml_begin_index ();
+
+ sprintf (index_command, "@%s %s", command, index_name);
+ register_delayed_write (index_command);
+ free (index_command);
+ }
+ else
+ {
+ int item;
+ INDEX_ELT *index;
+ INDEX_ELT *last_index = 0;
+ INDEX_ELT **array;
+ unsigned line_length;
+ char *line;
+ int saved_inhibit_paragraph_indentation = inhibit_paragraph_indentation;
+ int saved_filling_enabled = filling_enabled;
+ int saved_line_number = line_number;
+ char *saved_input_filename = input_filename;
+ unsigned output_line_number_len;
+
+ index = index_list (index_name);
+ if (index == (INDEX_ELT *)-1)
+ {
+ line_error (_("Unknown index `%s' in @printindex"), index_name);
+ free (index_name);
+ return;
+ }
+
+ /* Do this before sorting, so execute_string is in the good environment */
+ if (xml && docbook)
+ xml_begin_index ();
+
+ /* Do this before sorting, so execute_string in index_element_compare
+ will give the same results as when we actually print. */
+ printing_index = 1;
+ filling_enabled = 0;
+ inhibit_paragraph_indentation = 1;
+ xml_sort_index = 1;
+ array = sort_index (index);
+ xml_sort_index = 0;
+ close_paragraph ();
+ if (html)
+ add_html_block_elt_args ("<ul class=\"index-%s\" compact>",
+ index_name);
+ else if (!no_headers && !docbook)
+ { /* Info. Add magic cookie for info readers (to treat this
+ menu differently), and the usual start-of-menu. */
+ add_char ('\0');
+ add_word ("\010[index");
+ add_char ('\0');
+ add_word ("\010]\n");
+ add_word ("* Menu:\n\n");
+ }
+
+ me_inhibit_expansion++;
+
+ /* This will probably be enough. */
+ line_length = 100;
+ line = xmalloc (line_length);
+
+ {
+ char *max_output_line_number = (char *) xmalloc (25 * sizeof (char));
+
+ if (no_headers)
+ sprintf (max_output_line_number, "%d", output_line_number);
+ else
+ {
+ INDEX_ELT *tmp_entry = index;
+ unsigned tmp = 0;
+ for (tmp_entry = index; tmp_entry; tmp_entry = tmp_entry->next)
+ tmp = tmp_entry->output_line > tmp ? tmp_entry->output_line : tmp;
+ sprintf (max_output_line_number, "%d", tmp);
+ }
+
+ output_line_number_len = strlen (max_output_line_number);
+ free (max_output_line_number);
+ }
+
+ for (item = 0; (index = array[item]); item++)
+ {
+ /* A pathological document might have an index entry outside of any
+ node. Don't crash; try using the section name instead. */
+ char *index_node = index->node;
+
+ line_number = index->defining_line;
+ input_filename = index->defining_file;
+
+ if ((!index_node || !*index_node) && html)
+ index_node = toc_find_section_of_node (index_node);
+
+ if (!index_node || !*index_node)
+ {
+ line_error (_("Entry for index `%s' outside of any node"),
+ index_name);
+ if (html || !no_headers)
+ index_node = (char *) _("(outside of any node)");
+ }
+
+ if (html)
+ {
+ /* For HTML, we need to expand and HTML-escape the
+ original entry text, at the same time. Consider
+ @cindex J@"urgen. We want J&uuml;urgen. We can't
+ expand and then escape since we'll end up with
+ J&amp;uuml;rgen. We can't escape and then expand
+ because then `expansion' will see J@&quot;urgen, and
+ @&quot;urgen is not a command. */
+ char *html_entry =
+ maybe_escaped_expansion (index->entry_text, index->code, 1);
+
+ add_html_block_elt_args ("\n<li><a href=\"%s#index-",
+ (splitting && index->output_file) ? index->output_file : "");
+ add_escaped_anchor_name (index->entry_text, 0);
+ add_word_args ("-%d\">%s</a>: ", index->entry_number,
+ html_entry);
+ free (html_entry);
+
+ add_word ("<a href=\"");
+ if (index->node && *index->node)
+ {
+ /* Ensure any non-macros in the node name are expanded. */
+ char *expanded_index;
+
+ in_fixed_width_font++;
+ expanded_index = expansion (index_node, 0);
+ in_fixed_width_font--;
+ add_anchor_name (expanded_index, 1);
+ expanded_index = escape_string (expanded_index);
+ add_word_args ("\">%s</a>", expanded_index);
+ free (expanded_index);
+ }
+ else if (STREQ (index_node, _("(outside of any node)")))
+ {
+ add_anchor_name (index_node, 1);
+ add_word_args ("\">%s</a>", index_node);
+ }
+ else
+ /* If we use the section instead of the (missing) node, then
+ index_node already includes all we need except the #. */
+ add_word_args ("#%s</a>", index_node);
+
+ add_html_block_elt ("</li>");
+ }
+ else if (xml && docbook)
+ {
+ /* In the DocBook case, the expanded index entry is not
+ good for us, since it was expanded for non-DocBook mode
+ inside sort_index. So we send the original entry text
+ to be used with execute_string. */
+ xml_insert_indexentry (index->entry_text, index_node);
+ }
+ else
+ {
+ unsigned new_length = strlen (index->entry);
+
+ if (new_length < 50) /* minimum length used below */
+ new_length = 50;
+ new_length += strlen (index_node) + 7; /* * : .\n\0 */
+
+ if (new_length > line_length)
+ {
+ line_length = new_length;
+ line = xrealloc (line, line_length);
+ }
+ /* Print the entry, nicely formatted. We've already
+ expanded any commands in index->entry, including any
+ implicit @code. Thus, can't call execute_string, since
+ @@ has turned into @. */
+ if (!no_headers)
+ {
+ sprintf (line, "* %-37s ", index->entry);
+ line[2 + strlen (index->entry)] = ':';
+ insert_string (line);
+ /* Make sure any non-macros in the node name are expanded. */
+ in_fixed_width_font++;
+ execute_string ("%s. ", index_node);
+ insert_index_output_line_no (index->output_line,
+ output_line_number_len);
+ in_fixed_width_font--;
+ }
+ else
+ {
+ /* With --no-headers, the @node lines are gone, so
+ there's little sense in referring to them in the
+ index. Instead, output the number or name of the
+ section that corresponds to that node. */
+ sprintf (line, "%-*s ", number_sections ? 46 : 1, index->entry);
+ line[strlen (index->entry)] = ':';
+ insert_string (line);
+
+ if (strlen (index->section) > 0)
+ { /* We got your number. */
+ insert_string ((char *) _("See "));
+ insert_string (index->section);
+ }
+ else
+ { /* Sigh, index in an @unnumbered. :-\ */
+ insert_string ("\n ");
+ insert_string ((char *) _("See "));
+ insert_string ("``");
+ insert_string (expansion (index->section_name, 0));
+ insert_string ("''");
+ }
+
+ insert_string (". ");
+ insert_index_output_line_no (index->output_line,
+ output_line_number_len);
+ }
+ }
+
+ /* Prevent `output_paragraph' from growing to the size of the
+ whole index. */
+ flush_output ();
+ last_index = index;
+ }
+
+ free (line);
+
+ me_inhibit_expansion--;
+ printing_index = 0;
+
+ close_single_paragraph ();
+ filling_enabled = saved_filling_enabled;
+ inhibit_paragraph_indentation = saved_inhibit_paragraph_indentation;
+ input_filename = saved_input_filename;
+ line_number = saved_line_number;
+
+ if (html)
+ add_html_block_elt ("</ul>");
+ else if (xml && docbook)
+ xml_end_index ();
+ }
+
+ free (index_name);
+ /* Re-increment the line number, because get_rest_of_line
+ left us looking at the next line after the command. */
+ line_number++;
+}
diff --git a/Build/source/utils/texinfo/makeinfo/index.h b/Build/source/utils/texinfo/makeinfo/index.h
new file mode 100644
index 00000000000..3ff723daa18
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/index.h
@@ -0,0 +1,93 @@
+/* index.h -- declarations for index.c.
+ $Id: index.h,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1998, 99 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef INDEX_H
+#define INDEX_H
+
+#include "makeinfo.h"
+#include "cmds.h"
+
+/* User commands are only new indices. (Macros are handled separately.) */
+extern COMMAND **user_command_array;
+extern int user_command_array_len;
+
+/* An index element... */
+typedef struct index_elt
+{
+ struct index_elt *next;
+ char *entry; /* The index entry itself, after expansion. */
+ char *entry_text; /* The original, non-expanded entry text. */
+ char *node; /* The node from whence it came. */
+ char *section; /* Current section number we are in, */
+ char *section_name; /* ... and its title. */
+ int code; /* Nonzero means add `@code{...}' when
+ printing this element. */
+ int defining_line; /* Line number where this entry was written. */
+ int output_line; /* And line number where it is in the output. */
+ char *defining_file; /* Source file for defining_line. */
+ char *output_file; /* Output file for output_line. */
+ int entry_number; /* Entry number. */
+} INDEX_ELT;
+
+
+/* A list of short-names for each index.
+ There are two indices into the the_indices array.
+ * read_index is the index that points to the list of index
+ entries that we will find if we ask for the list of entries for
+ this name.
+ * write_index is the index that points to the list of index entries
+ that we will add new entries to.
+
+ Initially, read_index and write_index are the same, but the
+ @syncodeindex and @synindex commands can change the list we add
+ entries to.
+
+ For example, after the commands
+ @cindex foo
+ @defindex ii
+ @synindex cp ii
+ @cindex bar
+
+ the cp index will contain the entry `foo', and the new ii
+ index will contain the entry `bar'. This is consistent with the
+ way texinfo.tex handles the same situation.
+
+ In addition, for each index, it is remembered whether that index is
+ a code index or not. Code indices have @code{} inserted around the
+ first word when they are printed with printindex. */
+typedef struct
+{
+ char *name;
+ int read_index; /* index entries for `name' */
+ int write_index; /* store index entries here, @synindex can change it */
+ int code;
+} INDEX_ALIST;
+
+extern INDEX_ALIST **name_index_alist;
+
+/* Initialize all indices. */
+extern void init_indices (void);
+
+extern int defined_indices;
+extern int printing_index;
+extern int index_counter;
+
+INDEX_ELT *index_list (char *name);
+
+#endif /* !INDEX_H */
diff --git a/Build/source/utils/texinfo/makeinfo/insertion.c b/Build/source/utils/texinfo/makeinfo/insertion.c
new file mode 100644
index 00000000000..05a20440eba
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/insertion.c
@@ -0,0 +1,2376 @@
+/* insertion.c -- insertions for Texinfo.
+ $Id: insertion.c,v 1.55 2004/11/11 18:34:28 karl Exp $
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "cmds.h"
+#include "defun.h"
+#include "float.h"
+#include "html.h"
+#include "insertion.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "multi.h"
+#include "xml.h"
+
+/* Must match list in insertion.h. */
+static char *insertion_type_names[] =
+{
+ "cartouche", "copying", "defcv", "deffn", "defivar", "defmac",
+ "defmethod", "defop", "defopt", "defspec", "deftp", "deftypecv",
+ "deftypefn", "deftypefun", "deftypeivar", "deftypemethod",
+ "deftypeop", "deftypevar", "deftypevr", "defun", "defvar", "defvr",
+ "detailmenu", "direntry", "display", "documentdescription",
+ "enumerate", "example", "float", "flushleft", "flushright", "format",
+ "ftable", "group", "ifclear", "ifdocbook", "ifhtml", "ifinfo",
+ "ifnotdocbook", "ifnothtml", "ifnotinfo", "ifnotplaintext", "ifnottex",
+ "ifnotxml", "ifplaintext", "ifset", "iftex", "ifxml", "itemize", "lisp",
+ "menu", "multitable", "quotation", "rawdocbook", "rawhtml", "rawtex",
+ "rawxml", "smalldisplay", "smallexample", "smallformat", "smalllisp",
+ "verbatim", "table", "tex", "vtable", "titlepage", "bad_type"
+};
+
+/* All nested environments. */
+INSERTION_ELT *insertion_stack = NULL;
+
+/* How deeply we're nested. */
+int insertion_level = 0;
+
+/* Set to 1 if we've processed (commentary) text in a @menu that
+ wasn't part of a menu item. */
+int had_menu_commentary;
+
+/* How to examine menu lines. */
+int in_detailmenu = 0;
+
+/* Whether to examine menu lines. */
+int in_menu = 0;
+
+/* Set to 1 if <p> is written in normal context.
+ Used for menu and itemize. */
+int in_paragraph = 0;
+
+/* Since an insertion is already in the stack before we reach the switch
+ statement, we cannot use is_in_insertion_of_type (always returns true.) Also
+ making it return the level found, and comparing it with the current level is
+ no use, due to the order of stack. */
+static int float_active = 0;
+
+/* Unsetting escape_html blindly causes text inside @html/etc. to be escaped if
+ used within a rmacro. */
+static int raw_output_block = 0;
+
+/* Non-zero if a <dl> element has a <dt> element in it. We use this when
+ deciding whether to insert a <br> or not. */
+static int html_deflist_has_term = 0;
+
+void
+init_insertion_stack (void)
+{
+ insertion_stack = NULL;
+}
+
+/* Return the type of the current insertion. */
+static enum insertion_type
+current_insertion_type (void)
+{
+ return insertion_level ? insertion_stack->insertion : bad_type;
+}
+
+/* Return the string which is the function to wrap around items, or NULL
+ if we're not in an environment where @item is ok. */
+static char *
+current_item_function (void)
+{
+ int done = 0;
+ INSERTION_ELT *elt = insertion_stack;
+
+ /* Skip down through the stack until we find an insertion with an
+ itemize function defined, i.e., skip conditionals, @cartouche, etc. */
+ while (!done && elt)
+ {
+ switch (elt->insertion)
+ {
+ /* This list should match the one in cm_item. */
+ case ifclear:
+ case ifhtml:
+ case ifinfo:
+ case ifnothtml:
+ case ifnotinfo:
+ case ifnotplaintext:
+ case ifnottex:
+ case ifnotxml:
+ case ifplaintext:
+ case ifset:
+ case iftex:
+ case ifxml:
+ case rawdocbook:
+ case rawhtml:
+ case rawxml:
+ case rawtex:
+ case tex:
+ case cartouche:
+ elt = elt->next;
+ break;
+
+ default:
+ done = 1;
+ }
+ }
+
+ /* item_function usually gets assigned the empty string. */
+ return done && (*elt->item_function) ? elt->item_function : NULL;
+}
+
+/* Parse the item marker function off the input. If result is just "@",
+ change it to "@ ", since "@" by itself is not a command. This makes
+ "@ ", "@\t", and "@\n" all the same, but their default meanings are
+ the same anyway, and let's not worry about supporting redefining them. */
+static char *
+get_item_function (void)
+{
+ char *item_function;
+ char *item_loc;
+
+ get_rest_of_line (0, &item_function);
+
+ /* If the document erroneously says
+ @itemize @bullet @item foobar
+ it's nicer to give an error up front than repeat `@bullet expected
+ braces' until we get a segmentation fault. */
+ item_loc = strstr (item_function, "@item");
+ if (item_loc)
+ {
+ line_error (_("@item not allowed in argument to @itemize"));
+ *item_loc = 0;
+ }
+
+ /* If we hit the end of text in get_rest_of_line, backing up
+ input pointer will cause the last character of the last line
+ be pushed back onto the input, which is wrong. */
+ if (input_text_offset < input_text_length)
+ backup_input_pointer ();
+
+ if (STREQ (item_function, "@"))
+ {
+ free (item_function);
+ item_function = xstrdup ("@ ");
+ }
+
+ return item_function;
+}
+
+ /* Push the state of the current insertion on the stack. */
+static void
+push_insertion (enum insertion_type type, char *item_function)
+{
+ INSERTION_ELT *new = xmalloc (sizeof (INSERTION_ELT));
+
+ new->item_function = item_function;
+ new->filling_enabled = filling_enabled;
+ new->indented_fill = indented_fill;
+ new->insertion = type;
+ new->line_number = line_number;
+ new->filename = xstrdup (input_filename);
+ new->inhibited = inhibit_paragraph_indentation;
+ new->in_fixed_width_font = in_fixed_width_font;
+ new->next = insertion_stack;
+ insertion_stack = new;
+ insertion_level++;
+}
+
+ /* Pop the value on top of the insertion stack into the
+ global variables. */
+void
+pop_insertion (void)
+{
+ INSERTION_ELT *temp = insertion_stack;
+
+ if (temp == NULL)
+ return;
+
+ in_fixed_width_font = temp->in_fixed_width_font;
+ inhibit_paragraph_indentation = temp->inhibited;
+ filling_enabled = temp->filling_enabled;
+ indented_fill = temp->indented_fill;
+ free_and_clear (&(temp->item_function));
+ free_and_clear (&(temp->filename));
+ insertion_stack = insertion_stack->next;
+ free (temp);
+ insertion_level--;
+}
+
+ /* Return a pointer to the print name of this
+ enumerated type. */
+static const char *
+insertion_type_pname (enum insertion_type type)
+{
+ if ((int) type < (int) bad_type)
+ {
+ if (type == rawdocbook)
+ return "docbook";
+ else if (type == rawhtml)
+ return "html";
+ else if (type == rawxml)
+ return "xml";
+ else if (type == rawtex)
+ return "tex";
+ else
+ return insertion_type_names[(int) type];
+ }
+ else
+ return _("Broken-Type in insertion_type_pname");
+}
+
+/* Return the insertion_type associated with NAME.
+ If the type is not one of the known ones, return BAD_TYPE. */
+enum insertion_type
+find_type_from_name (char *name)
+{
+ int index = 0;
+ while (index < (int) bad_type)
+ {
+ if (STREQ (name, insertion_type_names[index]))
+ return (enum insertion_type) index;
+ if (index == rawdocbook && STREQ (name, "docbook"))
+ return rawdocbook;
+ if (index == rawhtml && STREQ (name, "html"))
+ return rawhtml;
+ if (index == rawxml && STREQ (name, "xml"))
+ return rawxml;
+ if (index == rawtex && STREQ (name, "tex"))
+ return rawtex;
+ index++;
+ }
+ return bad_type;
+}
+
+/* Simple function to query insertion_stack to see if we are inside a given
+ insertion type. */
+int
+is_in_insertion_of_type (int type)
+{
+ INSERTION_ELT *temp = insertion_stack;
+
+ if (!insertion_level)
+ return 0;
+
+ while (temp)
+ {
+ if (temp->insertion == type)
+ return 1;
+ temp = temp->next;
+ }
+
+ return 0;
+}
+
+
+static int
+defun_insertion (enum insertion_type type)
+{
+ return 0
+ || (type == defcv)
+ || (type == deffn)
+ || (type == defivar)
+ || (type == defmac)
+ || (type == defmethod)
+ || (type == defop)
+ || (type == defopt)
+ || (type == defspec)
+ || (type == deftp)
+ || (type == deftypecv)
+ || (type == deftypefn)
+ || (type == deftypefun)
+ || (type == deftypeivar)
+ || (type == deftypemethod)
+ || (type == deftypeop)
+ || (type == deftypevar)
+ || (type == deftypevr)
+ || (type == defun)
+ || (type == defvar)
+ || (type == defvr)
+ ;
+}
+
+/* MAX_NS is the maximum nesting level for enumerations. I picked 100
+ which seemed reasonable. This doesn't control the number of items,
+ just the number of nested lists. */
+#define max_stack_depth 100
+#define ENUM_DIGITS 1
+#define ENUM_ALPHA 2
+typedef struct {
+ int enumtype;
+ int enumval;
+} DIGIT_ALPHA;
+
+DIGIT_ALPHA enumstack[max_stack_depth];
+int enumstack_offset = 0;
+int current_enumval = 1;
+int current_enumtype = ENUM_DIGITS;
+char *enumeration_arg = NULL;
+
+static void
+start_enumerating (int at, int type)
+{
+ if ((enumstack_offset + 1) == max_stack_depth)
+ {
+ line_error (_("Enumeration stack overflow"));
+ return;
+ }
+ enumstack[enumstack_offset].enumtype = current_enumtype;
+ enumstack[enumstack_offset].enumval = current_enumval;
+ enumstack_offset++;
+ current_enumval = at;
+ current_enumtype = type;
+}
+
+static void
+stop_enumerating (void)
+{
+ --enumstack_offset;
+ if (enumstack_offset < 0)
+ enumstack_offset = 0;
+
+ current_enumval = enumstack[enumstack_offset].enumval;
+ current_enumtype = enumstack[enumstack_offset].enumtype;
+}
+
+/* Place a letter or digits into the output stream. */
+static void
+enumerate_item (void)
+{
+ char temp[10];
+
+ if (current_enumtype == ENUM_ALPHA)
+ {
+ if (current_enumval == ('z' + 1) || current_enumval == ('Z' + 1))
+ {
+ current_enumval = ((current_enumval - 1) == 'z' ? 'a' : 'A');
+ warning (_("lettering overflow, restarting at %c"), current_enumval);
+ }
+ sprintf (temp, "%c. ", current_enumval);
+ }
+ else
+ sprintf (temp, "%d. ", current_enumval);
+
+ indent (output_column += (current_indent - strlen (temp)));
+ add_word (temp);
+ current_enumval++;
+}
+
+static void
+enum_html (void)
+{
+ char type;
+ int start;
+
+ if (isdigit (*enumeration_arg))
+ {
+ type = '1';
+ start = atoi (enumeration_arg);
+ }
+ else if (isupper (*enumeration_arg))
+ {
+ type = 'A';
+ start = *enumeration_arg - 'A' + 1;
+ }
+ else
+ {
+ type = 'a';
+ start = *enumeration_arg - 'a' + 1;
+ }
+
+ add_html_block_elt_args ("<ol type=%c start=%d>\n", type, start);
+}
+
+/* Conditionally parse based on the current command name. */
+void
+command_name_condition (void)
+{
+ char *discarder = xmalloc (8 + strlen (command));
+
+ sprintf (discarder, "\n%cend %s", COMMAND_PREFIX, command);
+ discard_until (discarder);
+ discard_until ("\n");
+
+ free (discarder);
+}
+
+/* This is where the work for all the "insertion" style
+ commands is done. A huge switch statement handles the
+ various setups, and generic code is on both sides. */
+void
+begin_insertion (enum insertion_type type)
+{
+ int no_discard = 0;
+
+ if (defun_insertion (type))
+ {
+ push_insertion (type, xstrdup (""));
+ no_discard++;
+ }
+ else
+ {
+ push_insertion (type, get_item_function ());
+ }
+
+ switch (type)
+ {
+ case menu:
+ if (!no_headers)
+ close_paragraph ();
+
+ filling_enabled = no_indent = 0;
+ inhibit_paragraph_indentation = 1;
+
+ if (html)
+ {
+ had_menu_commentary = 1;
+ }
+ else if (!no_headers && !xml)
+ add_word ("* Menu:\n");
+
+ if (xml)
+ xml_insert_element (MENU, START);
+ else
+ in_fixed_width_font++;
+
+ next_menu_item_number = 1;
+ in_menu++;
+ no_discard++;
+ break;
+
+ case detailmenu:
+ if (!in_menu)
+ {
+ if (!no_headers)
+ close_paragraph ();
+
+ filling_enabled = no_indent = 0;
+ inhibit_paragraph_indentation = 1;
+
+ no_discard++;
+ }
+
+ if (xml)
+ {
+ xml_insert_element (DETAILMENU, START);
+ skip_whitespace_and_newlines();
+ }
+ else
+ in_fixed_width_font++;
+
+ in_detailmenu++;
+ break;
+
+ case direntry:
+ close_single_paragraph ();
+ filling_enabled = no_indent = 0;
+ inhibit_paragraph_indentation = 1;
+ insert_string ("START-INFO-DIR-ENTRY\n");
+ break;
+
+ case documentdescription:
+ {
+ char *desc;
+ int start_of_end;
+ int save_fixed_width;
+
+ discard_until ("\n"); /* ignore the @documentdescription line */
+ start_of_end = get_until ("\n@end documentdescription", &desc);
+ save_fixed_width = in_fixed_width_font;
+
+ in_fixed_width_font = 0;
+ document_description = expansion (desc, 0);
+ free (desc);
+
+ in_fixed_width_font = save_fixed_width;
+ input_text_offset = start_of_end; /* go back to the @end to match */
+ }
+ break;
+
+ case copying:
+ /* Save the copying text away for @insertcopying,
+ typically used on the back of the @titlepage (for TeX) and
+ the Top node (for info/html). */
+ if (input_text[input_text_offset] != '\n')
+ discard_until ("\n"); /* ignore remainder of @copying line */
+
+ input_text_offset = get_until ("\n@end copying", &copying_text);
+ canon_white (copying_text);
+
+ /* For info, output the copying text right away, so it will end up
+ in the header of the Info file, before the first node, and thus
+ get copied automatically to all the split files. For xml, also
+ output it right away since xml output is never split.
+ For html, we output it specifically in html_output_head.
+ For plain text, there's no way to hide it, so the author must
+ use @insertcopying in the desired location. */
+ if (docbook)
+ {
+ if (!xml_in_bookinfo)
+ {
+ xml_insert_element (BOOKINFO, START);
+ xml_in_bookinfo = 1;
+ }
+ xml_insert_element (LEGALNOTICE, START);
+ }
+
+ if (!html && !no_headers)
+ cm_insert_copying ();
+
+ if (docbook)
+ xml_insert_element (LEGALNOTICE, END);
+
+ break;
+
+ case quotation:
+ /* @quotation does filling (@display doesn't). */
+ if (html)
+ add_html_block_elt ("<blockquote>\n");
+ else
+ {
+ /* with close_single_paragraph, we get no blank line above
+ within @copying. */
+ close_paragraph ();
+ last_char_was_newline = no_indent = 0;
+ indented_fill = filling_enabled = 1;
+ inhibit_paragraph_indentation = 1;
+ }
+ current_indent += default_indentation_increment;
+ if (xml)
+ xml_insert_quotation (insertion_stack->item_function, START);
+ else if (strlen(insertion_stack->item_function))
+ execute_string ("@b{%s:} ", insertion_stack->item_function);
+ break;
+
+ case example:
+ case smallexample:
+ case lisp:
+ case smalllisp:
+ in_fixed_width_font++;
+ /* fall through */
+
+ /* Like @example but no fixed width font. */
+ case display:
+ case smalldisplay:
+ /* Like @display but without indentation. */
+ case smallformat:
+ case format:
+ close_single_paragraph ();
+ inhibit_paragraph_indentation = 1;
+ filling_enabled = 0;
+ last_char_was_newline = 0;
+
+ if (html)
+ /* Kludge alert: if <pre> is followed by a newline, IE3,
+ mozilla, maybe others render an extra blank line before the
+ pre-formatted block. So don't output a newline. */
+ add_html_block_elt_args ("<pre class=\"%s\">", command);
+
+ if (type != format && type != smallformat)
+ {
+ current_indent += example_indentation_increment;
+ if (html)
+ {
+ /* Since we didn't put \n after <pre>, we need to insert
+ the indentation by hand. */
+ int i;
+ for (i = current_indent; i > 0; i--)
+ add_char (' ');
+ }
+ }
+ break;
+
+ case multitable:
+ do_multitable ();
+ break;
+
+ case table:
+ case ftable:
+ case vtable:
+ case itemize:
+ close_single_paragraph ();
+ current_indent += default_indentation_increment;
+ filling_enabled = indented_fill = 1;
+#if defined (INDENT_PARAGRAPHS_IN_TABLE)
+ inhibit_paragraph_indentation = 0;
+#else
+ inhibit_paragraph_indentation = 1;
+#endif /* !INDENT_PARAGRAPHS_IN_TABLE */
+
+ /* Make things work for losers who forget the itemize syntax. */
+ if (type == itemize)
+ {
+ if (!(*insertion_stack->item_function))
+ {
+ free (insertion_stack->item_function);
+ insertion_stack->item_function = xstrdup ("@bullet");
+ }
+ }
+
+ if (!*insertion_stack->item_function)
+ {
+ line_error (_("%s requires an argument: the formatter for %citem"),
+ insertion_type_pname (type), COMMAND_PREFIX);
+ }
+
+ if (html)
+ {
+ if (type == itemize)
+ {
+ add_html_block_elt ("<ul>\n");
+ in_paragraph = 0;
+ }
+ else
+ { /* We are just starting, so this <dl>
+ has no <dt> children yet. */
+ html_deflist_has_term = 0;
+ add_html_block_elt ("<dl>\n");
+ }
+ }
+ if (xml)
+ xml_begin_table (type, insertion_stack->item_function);
+
+ while (input_text[input_text_offset] == '\n'
+ && input_text[input_text_offset+1] == '\n')
+ {
+ line_number++;
+ input_text_offset++;
+ }
+
+ break;
+
+ case enumerate:
+ close_single_paragraph ();
+ no_indent = 0;
+#if defined (INDENT_PARAGRAPHS_IN_TABLE)
+ inhibit_paragraph_indentation = 0;
+#else
+ inhibit_paragraph_indentation = 1;
+#endif /* !INDENT_PARAGRAPHS_IN_TABLE */
+
+ current_indent += default_indentation_increment;
+ filling_enabled = indented_fill = 1;
+
+ if (html)
+ {
+ enum_html ();
+ in_paragraph = 0;
+ }
+
+ if (xml)
+ xml_begin_enumerate (enumeration_arg);
+
+ if (isdigit (*enumeration_arg))
+ start_enumerating (atoi (enumeration_arg), ENUM_DIGITS);
+ else
+ start_enumerating (*enumeration_arg, ENUM_ALPHA);
+ break;
+
+ /* @group produces no output in info. */
+ case group:
+ /* Only close the paragraph if we are not inside of an
+ @example-like environment. */
+ if (xml)
+ xml_insert_element (GROUP, START);
+ else if (!insertion_stack->next
+ || (insertion_stack->next->insertion != display
+ && insertion_stack->next->insertion != smalldisplay
+ && insertion_stack->next->insertion != example
+ && insertion_stack->next->insertion != smallexample
+ && insertion_stack->next->insertion != lisp
+ && insertion_stack->next->insertion != smalllisp
+ && insertion_stack->next->insertion != format
+ && insertion_stack->next->insertion != smallformat
+ && insertion_stack->next->insertion != flushleft
+ && insertion_stack->next->insertion != flushright))
+ close_single_paragraph ();
+ break;
+
+ case cartouche:
+ if (html)
+ add_html_block_elt ("<p><table class=\"cartouche\" summary=\"cartouche\" border=\"1\"><tr><td>\n");
+ if (in_menu)
+ no_discard++;
+ break;
+
+ case floatenv:
+ /* Cannot nest floats, so complain. */
+ if (float_active)
+ {
+ line_error (_("%cfloat environments cannot be nested"), COMMAND_PREFIX);
+ pop_insertion ();
+ break;
+ }
+
+ float_active++;
+
+ { /* Collect data about this float. */
+ /* Example: @float [FLOATTYPE][,XREFLABEL][,POSITION] */
+ char floattype[200] = "";
+ char xreflabel[200] = "";
+ char position[200] = "";
+ char *text;
+ char *caption;
+ char *shortcaption;
+ int start_of_end;
+ int save_line_number = line_number;
+ int save_input_text_offset = input_text_offset;
+ int i;
+
+ if (strlen (insertion_stack->item_function) > 0)
+ {
+ int i = 0, t = 0, c = 0;
+ while (insertion_stack->item_function[i])
+ {
+ if (insertion_stack->item_function[i] == ',')
+ {
+ switch (t)
+ {
+ case 0:
+ floattype[c] = '\0';
+ break;
+ case 1:
+ xreflabel[c] = '\0';
+ break;
+ case 2:
+ position[c] = '\0';
+ break;
+ }
+ c = 0;
+ t++;
+ i++;
+ continue;
+ }
+
+ switch (t)
+ {
+ case 0:
+ floattype[c] = insertion_stack->item_function[i];
+ break;
+ case 1:
+ xreflabel[c] = insertion_stack->item_function[i];
+ break;
+ case 2:
+ position[c] = insertion_stack->item_function[i];
+ break;
+ }
+ c++;
+ i++;
+ }
+ }
+
+ skip_whitespace_and_newlines ();
+
+ start_of_end = get_until ("\n@end float", &text);
+
+ /* Get also the @caption. */
+ i = search_forward_until_pos ("\n@caption{",
+ save_input_text_offset, start_of_end);
+ if (i > -1)
+ {
+ input_text_offset = i + sizeof ("\n@caption{") - 1;
+ get_until_in_braces ("\n@end float", &caption);
+ input_text_offset = save_input_text_offset;
+ }
+ else
+ caption = "";
+
+ /* ... and the @shortcaption. */
+ i = search_forward_until_pos ("\n@shortcaption{",
+ save_input_text_offset, start_of_end);
+ if (i > -1)
+ {
+ input_text_offset = i + sizeof ("\n@shortcaption{") - 1;
+ get_until_in_braces ("\n@end float", &shortcaption);
+ input_text_offset = save_input_text_offset;
+ }
+ else
+ shortcaption = "";
+
+ canon_white (xreflabel);
+ canon_white (floattype);
+ canon_white (position);
+ canon_white (caption);
+ canon_white (shortcaption);
+
+ add_new_float (xstrdup (xreflabel),
+ xstrdup (caption), xstrdup (shortcaption),
+ xstrdup (floattype), xstrdup (position));
+
+ /* Move to the start of the @float so the contents get processed as
+ usual. */
+ input_text_offset = save_input_text_offset;
+ line_number = save_line_number;
+ }
+
+ if (html)
+ add_html_block_elt ("<div class=\"float\">\n");
+ else if (docbook)
+ xml_insert_element (FLOAT, START);
+ else if (xml)
+ {
+ xml_insert_element_with_attribute (FLOAT, START,
+ "name=\"%s\"", current_float_id ());
+
+ xml_insert_element (FLOATTYPE, START);
+ execute_string ("%s", current_float_type ());
+ xml_insert_element (FLOATTYPE, END);
+
+ xml_insert_element (FLOATPOS, START);
+ execute_string ("%s", current_float_position ());
+ xml_insert_element (FLOATPOS, END);
+ }
+ else
+ { /* Info */
+ close_single_paragraph ();
+ inhibit_paragraph_indentation = 1;
+ }
+
+ /* Anchor now. Note that XML documents get their
+ anchors with <float name="anchor"> tag. */
+ if ((!xml || docbook) && strlen (current_float_id ()) > 0)
+ execute_string ("@anchor{%s}", current_float_id ());
+
+ break;
+
+ /* Insertions that are no-ops in info, but do something in TeX. */
+ case ifclear:
+ case ifdocbook:
+ case ifhtml:
+ case ifinfo:
+ case ifnotdocbook:
+ case ifnothtml:
+ case ifnotinfo:
+ case ifnotplaintext:
+ case ifnottex:
+ case ifnotxml:
+ case ifplaintext:
+ case ifset:
+ case iftex:
+ case ifxml:
+ case rawtex:
+ if (in_menu)
+ no_discard++;
+ break;
+
+ case rawdocbook:
+ case rawhtml:
+ case rawxml:
+ raw_output_block++;
+
+ if (raw_output_block > 0)
+ {
+ xml_no_para = 1;
+ escape_html = 0;
+ xml_keep_space++;
+ }
+
+ {
+ /* Some deuglification for improved readability. */
+ extern int xml_in_para;
+ if (xml && !xml_in_para && xml_indentation_increment > 0)
+ add_char ('\n');
+ }
+
+ break;
+
+ case defcv:
+ case deffn:
+ case defivar:
+ case defmac:
+ case defmethod:
+ case defop:
+ case defopt:
+ case defspec:
+ case deftp:
+ case deftypecv:
+ case deftypefn:
+ case deftypefun:
+ case deftypeivar:
+ case deftypemethod:
+ case deftypeop:
+ case deftypevar:
+ case deftypevr:
+ case defun:
+ case defvar:
+ case defvr:
+ inhibit_paragraph_indentation = 1;
+ filling_enabled = indented_fill = 1;
+ current_indent += default_indentation_increment;
+ no_indent = 0;
+ if (xml)
+ xml_begin_definition ();
+ break;
+
+ case flushleft:
+ close_single_paragraph ();
+ inhibit_paragraph_indentation = 1;
+ filling_enabled = indented_fill = no_indent = 0;
+ if (html)
+ add_html_block_elt ("<div align=\"left\">");
+ break;
+
+ case flushright:
+ close_single_paragraph ();
+ filling_enabled = indented_fill = no_indent = 0;
+ inhibit_paragraph_indentation = 1;
+ force_flush_right++;
+ if (html)
+ add_html_block_elt ("<div align=\"right\">");
+ break;
+
+ case titlepage:
+ xml_insert_element (TITLEPAGE, START);
+ break;
+
+ default:
+ line_error ("begin_insertion internal error: type=%d", type);
+ }
+
+ if (!no_discard)
+ discard_until ("\n");
+}
+
+/* Try to end the insertion with the specified TYPE. With a value of
+ `bad_type', TYPE gets translated to match the value currently on top
+ of the stack. Otherwise, if TYPE doesn't match the top of the
+ insertion stack, give error. */
+static void
+end_insertion (int type)
+{
+ int temp_type;
+
+ if (!insertion_level)
+ return;
+
+ temp_type = current_insertion_type ();
+
+ if (type == bad_type)
+ type = temp_type;
+
+ if (type != temp_type)
+ {
+ line_error
+ (_("`@end' expected `%s', but saw `%s'"),
+ insertion_type_pname (temp_type), insertion_type_pname (type));
+ return;
+ }
+
+ pop_insertion ();
+
+ if (xml)
+ {
+ switch (type)
+ {
+ case ifinfo:
+ case documentdescription:
+ break;
+ case quotation:
+ xml_insert_quotation ("", END);
+ break;
+ case example:
+ xml_insert_element (EXAMPLE, END);
+ if (docbook && current_insertion_type () == floatenv)
+ xml_insert_element (FLOATEXAMPLE, END);
+ break;
+ case smallexample:
+ xml_insert_element (SMALLEXAMPLE, END);
+ if (docbook && current_insertion_type () == floatenv)
+ xml_insert_element (FLOATEXAMPLE, END);
+ break;
+ case lisp:
+ xml_insert_element (LISP, END);
+ if (docbook && current_insertion_type () == floatenv)
+ xml_insert_element (FLOATEXAMPLE, END);
+ break;
+ case smalllisp:
+ xml_insert_element (SMALLLISP, END);
+ if (docbook && current_insertion_type () == floatenv)
+ xml_insert_element (FLOATEXAMPLE, END);
+ break;
+ case cartouche:
+ xml_insert_element (CARTOUCHE, END);
+ break;
+ case format:
+ if (docbook && xml_in_bookinfo && xml_in_abstract)
+ {
+ xml_insert_element (ABSTRACT, END);
+ xml_in_abstract = 0;
+ }
+ else
+ xml_insert_element (FORMAT, END);
+ break;
+ case smallformat:
+ xml_insert_element (SMALLFORMAT, END);
+ break;
+ case display:
+ xml_insert_element (DISPLAY, END);
+ break;
+ case smalldisplay:
+ xml_insert_element (SMALLDISPLAY, END);
+ break;
+ case table:
+ case ftable:
+ case vtable:
+ case itemize:
+ xml_end_table (type);
+ break;
+ case enumerate:
+ xml_end_enumerate ();
+ break;
+ case group:
+ xml_insert_element (GROUP, END);
+ break;
+ case titlepage:
+ xml_insert_element (TITLEPAGE, END);
+ break;
+ }
+ }
+ switch (type)
+ {
+ /* Insertions which have no effect on paragraph formatting. */
+ case copying:
+ line_number--;
+ break;
+
+ case ifclear:
+ case ifdocbook:
+ case ifinfo:
+ case ifhtml:
+ case ifnotdocbook:
+ case ifnothtml:
+ case ifnotinfo:
+ case ifnotplaintext:
+ case ifnottex:
+ case ifnotxml:
+ case ifplaintext:
+ case ifset:
+ case iftex:
+ case ifxml:
+ case rawtex:
+ case titlepage:
+ break;
+
+ case rawdocbook:
+ case rawhtml:
+ case rawxml:
+ raw_output_block--;
+
+ if (raw_output_block <= 0)
+ {
+ xml_no_para = 0;
+ escape_html = 1;
+ xml_keep_space--;
+ }
+
+ if ((xml || html) && output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ break;
+
+ case detailmenu:
+ if (xml)
+ xml_insert_element (DETAILMENU, END);
+
+ in_detailmenu--; /* No longer hacking menus. */
+ if (!in_menu)
+ {
+ if (!no_headers)
+ close_insertion_paragraph ();
+ }
+ break;
+
+ case direntry: /* Eaten if html. */
+ insert_string ("END-INFO-DIR-ENTRY\n\n");
+ close_insertion_paragraph ();
+ break;
+
+ case documentdescription:
+ if (xml)
+ insert_string (document_description);
+ xml_insert_element (DOCUMENTDESCRIPTION, END);
+ break;
+
+ case menu:
+ in_menu--; /* No longer hacking menus. */
+ if (html && !no_headers)
+ add_html_block_elt ("</ul>\n");
+ else if (!no_headers && !xml)
+ close_insertion_paragraph ();
+ break;
+
+ case multitable:
+ end_multitable ();
+ break;
+
+ case enumerate:
+ stop_enumerating ();
+ close_insertion_paragraph ();
+ current_indent -= default_indentation_increment;
+ if (html)
+ add_html_block_elt ("</ol>\n");
+ break;
+
+ case flushleft:
+ if (html)
+ add_html_block_elt ("</div>\n");
+ close_insertion_paragraph ();
+ break;
+
+ case cartouche:
+ if (html)
+ add_html_block_elt ("</td></tr></table>\n");
+ close_insertion_paragraph ();
+ break;
+
+ case group:
+ if (!xml || docbook)
+ close_insertion_paragraph ();
+ break;
+
+ case floatenv:
+ if (xml)
+ xml_insert_element (FLOAT, END);
+ else
+ {
+ if (html)
+ add_html_block_elt ("<p><strong class=\"float-caption\">");
+ else
+ close_paragraph ();
+
+ no_indent = 1;
+
+ /* Legend:
+ 1) @float Foo,lbl & no caption: Foo 1.1
+ 2) @float Foo & no caption: Foo
+ 3) @float ,lbl & no caption: 1.1
+ 4) @float & no caption: */
+
+ if (!xml && !html)
+ indent (current_indent);
+
+ if (strlen (current_float_type ()))
+ execute_string ("%s", current_float_type ());
+
+ if (strlen (current_float_id ()) > 0)
+ {
+ if (strlen (current_float_type ()) > 0)
+ add_char (' ');
+
+ add_word (current_float_number ());
+ }
+
+ if (strlen (current_float_title ()) > 0)
+ {
+ if (strlen (current_float_type ()) > 0
+ || strlen (current_float_id ()) > 0)
+ insert_string (": ");
+
+ execute_string ("%s", current_float_title ());
+ }
+
+ /* Indent the following paragraph. */
+ inhibit_paragraph_indentation = 0;
+
+ if (html)
+ add_word ("</strong></p></div>\n");
+ else
+ close_paragraph ();
+ }
+ float_active--;
+ break;
+
+ case format:
+ case smallformat:
+ case display:
+ case smalldisplay:
+ case example:
+ case smallexample:
+ case lisp:
+ case smalllisp:
+ case quotation:
+ /* @format and @smallformat are the only fixed_width insertion
+ without a change in indentation. */
+ if (type != format && type != smallformat && type != quotation)
+ current_indent -= example_indentation_increment;
+ else if (type == quotation)
+ current_indent -= default_indentation_increment;
+
+ if (html)
+ { /* The complex code in close_paragraph that kills whitespace
+ does not function here, since we've inserted non-whitespace
+ (the </whatever>) before it. The indentation already got
+ inserted at the end of the last example line, so we have to
+ delete it, or browsers wind up showing an extra blank line. */
+ kill_self_indent (default_indentation_increment);
+ add_html_block_elt (type == quotation
+ ? "</blockquote>\n" : "</pre>\n");
+ }
+
+ /* The ending of one of these insertions always marks the
+ start of a new paragraph, except for the XML output. */
+ if (!xml || docbook)
+ close_insertion_paragraph ();
+
+ /* </pre> closes paragraph without messing with </p>. */
+ if (html && type != quotation)
+ paragraph_is_open = 0;
+ break;
+
+ case table:
+ case ftable:
+ case vtable:
+ current_indent -= default_indentation_increment;
+ if (html)
+ add_html_block_elt ("</dl>\n");
+ close_insertion_paragraph ();
+ break;
+
+ case itemize:
+ current_indent -= default_indentation_increment;
+ if (html)
+ add_html_block_elt ("</ul>\n");
+ close_insertion_paragraph ();
+ break;
+
+ case flushright:
+ force_flush_right--;
+ if (html)
+ add_html_block_elt ("</div>\n");
+ close_insertion_paragraph ();
+ break;
+
+ /* Handle the @defun insertions with this default clause. */
+ default:
+ {
+ int base_type;
+
+ if (type < defcv || type > defvr)
+ line_error ("end_insertion internal error: type=%d", type);
+
+ base_type = get_base_type (type);
+ switch (base_type)
+ {
+ case deffn:
+ case defvr:
+ case deftp:
+ case deftypecv:
+ case deftypefn:
+ case deftypevr:
+ case defcv:
+ case defop:
+ case deftypemethod:
+ case deftypeop:
+ case deftypeivar:
+ if (html)
+ {
+ if (paragraph_is_open)
+ add_html_block_elt ("</p>");
+ /* close the div and blockquote which has been opened in defun.c */
+ if (!rollback_empty_tag ("blockquote"))
+ add_html_block_elt ("</blockquote>");
+ add_html_block_elt ("</div>\n");
+ }
+ if (xml)
+ xml_end_definition ();
+ break;
+ } /* switch (base_type)... */
+
+ current_indent -= default_indentation_increment;
+ close_insertion_paragraph ();
+ }
+ break;
+
+ }
+
+ if (current_indent < 0)
+ line_error ("end_insertion internal error: current indent=%d",
+ current_indent);
+}
+
+/* Insertions cannot cross certain boundaries, such as node beginnings. In
+ code that creates such boundaries, you should call `discard_insertions'
+ before doing anything else. It prints the errors for you, and cleans up
+ the insertion stack.
+
+ With nonzero SPECIALS_OK argument, allows unmatched
+ @if... conditionals, otherwise not. This is because conditionals can
+ cross node boundaries. Always happens with the @top node, for example. */
+void
+discard_insertions (int specials_ok)
+{
+ int real_line_number = line_number;
+ while (insertion_stack)
+ {
+ if (specials_ok
+ && ((ifclear <= insertion_stack->insertion
+ && insertion_stack->insertion <= iftex)
+ || insertion_stack->insertion == rawdocbook
+ || insertion_stack->insertion == rawhtml
+ || insertion_stack->insertion == rawxml
+ || insertion_stack->insertion == rawtex))
+ break;
+ else
+ {
+ const char *offender = insertion_type_pname (insertion_stack->insertion);
+
+ file_line_error (insertion_stack->filename,
+ insertion_stack->line_number,
+ _("No matching `%cend %s'"), COMMAND_PREFIX,
+ offender);
+ pop_insertion ();
+ }
+ }
+ line_number = real_line_number;
+}
+
+/* Insertion (environment) commands. */
+
+void
+cm_quotation (void)
+{
+ /* We start the blockquote element in the insertion. */
+ begin_insertion (quotation);
+}
+
+void
+cm_example (void)
+{
+ if (docbook && current_insertion_type () == floatenv)
+ xml_begin_docbook_float (FLOATEXAMPLE);
+
+ if (xml)
+ {
+ /* Rollback previous newlines. These occur between
+ </para> and <example>. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+
+ xml_insert_element (EXAMPLE, START);
+
+ /* Make sure example text is starting on a new line
+ for improved readability. */
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (example);
+}
+
+void
+cm_smallexample (void)
+{
+ if (docbook && current_insertion_type () == floatenv)
+ xml_begin_docbook_float (FLOATEXAMPLE);
+
+ if (xml)
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (SMALLEXAMPLE, START);
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (smallexample);
+}
+
+void
+cm_lisp (void)
+{
+ if (docbook && current_insertion_type () == floatenv)
+ xml_begin_docbook_float (FLOATEXAMPLE);
+
+ if (xml)
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (LISP, START);
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (lisp);
+}
+
+void
+cm_smalllisp (void)
+{
+ if (docbook && current_insertion_type () == floatenv)
+ xml_begin_docbook_float (FLOATEXAMPLE);
+
+ if (xml)
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (SMALLLISP, START);
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (smalllisp);
+}
+
+void
+cm_cartouche (void)
+{
+ if (docbook && current_insertion_type () == floatenv)
+ xml_begin_docbook_float (CARTOUCHE);
+
+ if (xml)
+ xml_insert_element (CARTOUCHE, START);
+ begin_insertion (cartouche);
+}
+
+void
+cm_copying (void)
+{
+ begin_insertion (copying);
+}
+
+/* Not an insertion, despite the name, but it goes with cm_copying. */
+void
+cm_insert_copying (void)
+{
+ if (!copying_text)
+ {
+ warning ("@copying not used before %s", command);
+ return;
+ }
+
+ execute_string ("%s", copying_text);
+
+ if (!xml && !html)
+ {
+ add_word ("\n\n");
+ /* Update output_position so that the node positions in the tag
+ tables will take account of the copying text. */
+ flush_output ();
+ }
+}
+
+void
+cm_format (void)
+{
+ if (xml)
+ {
+ if (docbook && xml_in_bookinfo)
+ {
+ xml_insert_element (ABSTRACT, START);
+ xml_in_abstract = 1;
+ }
+ else
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (FORMAT, START);
+ if (docbook)
+ add_char ('\n');
+ }
+ }
+ begin_insertion (format);
+}
+
+void
+cm_smallformat (void)
+{
+ if (xml)
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (SMALLFORMAT, START);
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (smallformat);
+}
+
+void
+cm_display (void)
+{
+ if (xml)
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (DISPLAY, START);
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (display);
+}
+
+void
+cm_smalldisplay (void)
+{
+ if (xml)
+ {
+ /* See cm_example comments about newlines. */
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_insert_element (SMALLDISPLAY, START);
+ if (docbook)
+ add_char ('\n');
+ }
+
+ begin_insertion (smalldisplay);
+}
+
+void
+cm_direntry (void)
+{
+ if (html || xml || no_headers)
+ command_name_condition ();
+ else
+ begin_insertion (direntry);
+}
+
+void
+cm_documentdescription (void)
+{
+ if (html)
+ begin_insertion (documentdescription);
+
+ else if (xml)
+ {
+ xml_insert_element (DOCUMENTDESCRIPTION, START);
+ begin_insertion (documentdescription);
+ }
+
+ else
+ command_name_condition ();
+}
+
+
+void
+cm_itemize (void)
+{
+ begin_insertion (itemize);
+}
+
+/* Start an enumeration insertion of type TYPE. If the user supplied
+ no argument on the line, then use DEFAULT_STRING as the initial string. */
+static void
+do_enumeration (int type, char *default_string)
+{
+ get_until_in_line (0, ".", &enumeration_arg);
+ canon_white (enumeration_arg);
+
+ if (!*enumeration_arg)
+ {
+ free (enumeration_arg);
+ enumeration_arg = xstrdup (default_string);
+ }
+
+ if (!isdigit (*enumeration_arg) && !isletter (*enumeration_arg))
+ {
+ warning (_("%s requires letter or digit"), insertion_type_pname (type));
+
+ switch (type)
+ {
+ case enumerate:
+ default_string = "1";
+ break;
+ }
+ enumeration_arg = xstrdup (default_string);
+ }
+ begin_insertion (type);
+}
+
+void
+cm_enumerate (void)
+{
+ do_enumeration (enumerate, "1");
+}
+
+/* Handle verbatim environment:
+ find_end_verbatim == 0: process until end of file
+ find_end_verbatim != 0: process until 'COMMAND_PREFIXend verbatim'
+ or end of file
+
+ We cannot simply copy input stream onto output stream; as the
+ verbatim environment may be encapsulated in an @example environment,
+ for example. */
+void
+handle_verbatim_environment (int find_end_verbatim)
+{
+ int character;
+ int seen_end = 0;
+ int save_filling_enabled = filling_enabled;
+ int save_inhibit_paragraph_indentation = inhibit_paragraph_indentation;
+ int save_escape_html = escape_html;
+
+ if (!insertion_stack)
+ close_single_paragraph (); /* no blank lines if not at outer level */
+ inhibit_paragraph_indentation = 1;
+ filling_enabled = 0;
+ in_fixed_width_font++;
+ last_char_was_newline = 0;
+
+ /* No indentation: this is verbatim after all
+ If you want indent, enclose @verbatim in @example
+ current_indent += default_indentation_increment;
+ */
+
+ if (html)
+ { /* If inside @example, we'll be preceded by the indentation
+ already. Browsers will ignore those spaces because we're about
+ to start another <pre> (don't ask me). So, wipe them out for
+ cleanliness, and re-insert. */
+ int i;
+ kill_self_indent (default_indentation_increment);
+ add_html_block_elt ("<pre class=\"verbatim\">");
+ for (i = current_indent; i > 0; i--)
+ add_char (' ');
+ }
+ else if (xml)
+ {
+ xml_insert_element (VERBATIM, START);
+ escape_html = 0;
+ add_word ("<![CDATA[");
+ }
+
+ while (input_text_offset < input_text_length)
+ {
+ character = curchar ();
+
+ if (character == '\n')
+ line_number++;
+
+ /* Assume no newlines in END_VERBATIM. */
+ else if (find_end_verbatim && (character == COMMAND_PREFIX) /* @ */
+ && (input_text_length - input_text_offset > sizeof (END_VERBATIM))
+ && !strncmp (&input_text[input_text_offset+1], END_VERBATIM,
+ sizeof (END_VERBATIM)-1))
+ {
+ input_text_offset += sizeof (END_VERBATIM);
+ seen_end = 1;
+ break;
+ }
+
+ if (html && character == '&' && escape_html)
+ add_word ("&amp;");
+ else if (html && character == '<' && escape_html)
+ add_word ("&lt;");
+ else
+ add_char (character);
+
+ input_text_offset++;
+ }
+
+ if (find_end_verbatim && !seen_end)
+ warning (_("end of file inside verbatim block"));
+
+ if (html)
+ { /* See comments in example case above. */
+ kill_self_indent (default_indentation_increment);
+ add_word ("</pre>");
+ }
+ else if (xml)
+ {
+ add_word ("]]>");
+ xml_insert_element (VERBATIM, END);
+ escape_html = save_escape_html;
+ }
+
+ in_fixed_width_font--;
+ filling_enabled = save_filling_enabled;
+ inhibit_paragraph_indentation = save_inhibit_paragraph_indentation;
+}
+
+void
+cm_verbatim (void)
+{
+ handle_verbatim_environment (1);
+}
+
+void
+cm_table (void)
+{
+ begin_insertion (table);
+}
+
+void
+cm_multitable (void)
+{
+ begin_insertion (multitable); /* @@ */
+}
+
+void
+cm_ftable (void)
+{
+ begin_insertion (ftable);
+}
+
+void
+cm_vtable (void)
+{
+ begin_insertion (vtable);
+}
+
+void
+cm_group (void)
+{
+ begin_insertion (group);
+}
+
+/* Insert raw HTML (no escaping of `<' etc.). */
+void
+cm_html (int arg)
+{
+ if (process_html)
+ begin_insertion (rawhtml);
+ else
+ command_name_condition ();
+}
+
+void
+cm_xml (int arg)
+{
+ if (process_xml)
+ begin_insertion (rawxml);
+ else
+ command_name_condition ();
+}
+
+void
+cm_docbook (int arg)
+{
+ if (process_docbook)
+ begin_insertion (rawdocbook);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifdocbook (void)
+{
+ if (process_docbook)
+ begin_insertion (ifdocbook);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifnotdocbook (void)
+{
+ if (!process_docbook)
+ begin_insertion (ifnotdocbook);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifhtml (void)
+{
+ if (process_html)
+ begin_insertion (ifhtml);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifnothtml (void)
+{
+ if (!process_html)
+ begin_insertion (ifnothtml);
+ else
+ command_name_condition ();
+}
+
+
+void
+cm_ifinfo (void)
+{
+ if (process_info)
+ begin_insertion (ifinfo);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifnotinfo (void)
+{
+ if (!process_info)
+ begin_insertion (ifnotinfo);
+ else
+ command_name_condition ();
+}
+
+
+void
+cm_ifplaintext (void)
+{
+ if (process_plaintext)
+ begin_insertion (ifplaintext);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifnotplaintext (void)
+{
+ if (!process_plaintext)
+ begin_insertion (ifnotplaintext);
+ else
+ command_name_condition ();
+}
+
+
+void
+cm_tex (void)
+{
+ if (process_tex)
+ begin_insertion (rawtex);
+ else
+ command_name_condition ();
+}
+
+void
+cm_iftex (void)
+{
+ if (process_tex)
+ begin_insertion (iftex);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifnottex (void)
+{
+ if (!process_tex)
+ begin_insertion (ifnottex);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifxml (void)
+{
+ if (process_xml)
+ begin_insertion (ifxml);
+ else
+ command_name_condition ();
+}
+
+void
+cm_ifnotxml (void)
+{
+ if (!process_xml)
+ begin_insertion (ifnotxml);
+ else
+ command_name_condition ();
+}
+
+
+/* Generic xrefable block with a caption. */
+void
+cm_float (void)
+{
+ begin_insertion (floatenv);
+}
+
+void
+cm_caption (int arg)
+{
+ char *temp;
+
+ /* This is a no_op command for most formats, as we handle it during @float
+ insertion. For XML though, we handle it here to keep document structure
+ as close as possible, to the Texinfo source. */
+
+ /* Everything is already handled at START. */
+ if (arg == END)
+ return;
+
+ /* Check if it's mislocated. */
+ if (current_insertion_type () != floatenv)
+ line_error (_("@%s not meaningful outside `@float' environment"), command);
+
+ get_until_in_braces ("\n@end float", &temp);
+
+ if (xml)
+ {
+ int elt = STREQ (command, "shortcaption") ? SHORTCAPTION : CAPTION;
+ xml_insert_element (elt, START);
+ if (!docbook)
+ execute_string ("%s", temp);
+ xml_insert_element (elt, END);
+ }
+
+ free (temp);
+}
+
+/* Begin an insertion where the lines are not filled or indented. */
+void
+cm_flushleft (void)
+{
+ begin_insertion (flushleft);
+}
+
+/* Begin an insertion where the lines are not filled, and each line is
+ forced to the right-hand side of the page. */
+void
+cm_flushright (void)
+{
+ begin_insertion (flushright);
+}
+
+void
+cm_menu (void)
+{
+ if (current_node == NULL && !macro_expansion_output_stream)
+ {
+ warning (_("@menu seen before first @node, creating `Top' node"));
+ warning (_("perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"));
+ /* Include @top command so we can construct the implicit node tree. */
+ execute_string ("@node top\n@top Top\n");
+ }
+ begin_insertion (menu);
+}
+
+void
+cm_detailmenu (void)
+{
+ if (current_node == NULL && !macro_expansion_output_stream)
+ { /* Problems anyway, @detailmenu should always be inside @menu. */
+ warning (_("@detailmenu seen before first node, creating `Top' node"));
+ execute_string ("@node top\n@top Top\n");
+ }
+ begin_insertion (detailmenu);
+}
+
+/* Title page commands. */
+
+void
+cm_titlepage (void)
+{
+ titlepage_cmd_present = 1;
+ if (xml && !docbook)
+ begin_insertion (titlepage);
+ else
+ command_name_condition ();
+}
+
+void
+cm_author (void)
+{
+ char *rest;
+ get_rest_of_line (1, &rest);
+
+ if (is_in_insertion_of_type (quotation))
+ {
+ if (html)
+ add_word_args ("&mdash; %s", rest);
+ else if (docbook)
+ {
+ /* FIXME Ideally, we should use an attribution element,
+ but they are supposed to be at the start of quotation
+ blocks. So to avoid looking ahead mess, let's just
+ use mdash like HTML for now. */
+ xml_insert_entity ("mdash");
+ add_word (rest);
+ }
+ else if (xml)
+ {
+ xml_insert_element (AUTHOR, START);
+ add_word (rest);
+ xml_insert_element (AUTHOR, END);
+ }
+ else
+ add_word_args ("-- %s", rest);
+ }
+ else if (is_in_insertion_of_type (titlepage))
+ {
+ if (xml && !docbook)
+ {
+ xml_insert_element (AUTHOR, START);
+ add_word (rest);
+ xml_insert_element (AUTHOR, END);
+ }
+ }
+ else
+ line_error (_("@%s not meaningful outside `@titlepage' and `@quotation' environments"),
+ command);
+
+ free (rest);
+}
+
+void
+cm_titlepage_cmds (void)
+{
+ char *rest;
+
+ get_rest_of_line (1, &rest);
+
+ if (!is_in_insertion_of_type (titlepage))
+ line_error (_("@%s not meaningful outside `@titlepage' environment"),
+ command);
+
+ if (xml && !docbook)
+ {
+ int elt = 0;
+
+ if (STREQ (command, "title"))
+ elt = BOOKTITLE;
+ else if (STREQ (command, "subtitle"))
+ elt = BOOKSUBTITLE;
+
+ xml_insert_element (elt, START);
+ add_word (rest);
+ xml_insert_element (elt, END);
+ }
+
+ free (rest);
+}
+
+/* End existing insertion block. */
+void
+cm_end (void)
+{
+ char *temp;
+ int type;
+
+ get_rest_of_line (0, &temp);
+
+ if (!insertion_level)
+ {
+ line_error (_("Unmatched `%c%s'"), COMMAND_PREFIX, command);
+ return;
+ }
+
+ if (temp[0] == 0)
+ line_error (_("`%c%s' needs something after it"), COMMAND_PREFIX, command);
+
+ type = find_type_from_name (temp);
+
+ if (type == bad_type)
+ {
+ line_error (_("Bad argument `%s' to `@%s', using `%s'"),
+ temp, command, insertion_type_pname (current_insertion_type ()));
+ }
+ if (xml && type == menu) /* fixme */
+ {
+ xml_end_menu ();
+ }
+ end_insertion (type);
+ free (temp);
+}
+
+/* @itemx, @item. */
+
+static int itemx_flag = 0;
+
+/* Return whether CMD takes a brace-delimited {arg}. */
+int
+command_needs_braces (char *cmd)
+{
+ int i;
+ for (i = 0; command_table[i].name; i++)
+ {
+ if (STREQ (command_table[i].name, cmd))
+ return command_table[i].argument_in_braces == BRACE_ARGS;
+ }
+
+ return 0; /* macro or alias */
+}
+
+
+void
+cm_item (void)
+{
+ char *rest_of_line, *item_func;
+
+ /* Can only hack "@item" while inside of an insertion. */
+ if (insertion_level)
+ {
+ INSERTION_ELT *stack = insertion_stack;
+ int original_input_text_offset;
+
+ skip_whitespace ();
+ original_input_text_offset = input_text_offset;
+
+ get_rest_of_line (0, &rest_of_line);
+ item_func = current_item_function ();
+
+ /* Do the right thing depending on which insertion function is active. */
+ switch_top:
+ switch (stack->insertion)
+ {
+ case multitable:
+ multitable_item ();
+ /* Support text directly after the @item. */
+ if (*rest_of_line)
+ {
+ line_number--;
+ input_text_offset = original_input_text_offset;
+ }
+ break;
+
+ case ifclear:
+ case ifhtml:
+ case ifinfo:
+ case ifnothtml:
+ case ifnotinfo:
+ case ifnotplaintext:
+ case ifnottex:
+ case ifnotxml:
+ case ifplaintext:
+ case ifset:
+ case iftex:
+ case ifxml:
+ case rawdocbook:
+ case rawhtml:
+ case rawxml:
+ case rawtex:
+ case tex:
+ case cartouche:
+ stack = stack->next;
+ if (!stack)
+ goto no_insertion;
+ else
+ goto switch_top;
+ break;
+
+ case menu:
+ case quotation:
+ case example:
+ case smallexample:
+ case lisp:
+ case smalllisp:
+ case format:
+ case smallformat:
+ case display:
+ case smalldisplay:
+ case group:
+ line_error (_("@%s not meaningful inside `@%s' block"),
+ command,
+ insertion_type_pname (current_insertion_type ()));
+ break;
+
+ case itemize:
+ case enumerate:
+ if (itemx_flag)
+ {
+ line_error (_("@itemx not meaningful inside `%s' block"),
+ insertion_type_pname (current_insertion_type ()));
+ }
+ else
+ {
+ if (html)
+ add_html_block_elt ("<li>");
+ else if (xml)
+ xml_begin_item ();
+ else
+ {
+ start_paragraph ();
+ kill_self_indent (-1);
+ filling_enabled = indented_fill = 1;
+
+ if (current_item_function ())
+ {
+ output_column = current_indent - 2;
+ indent (output_column);
+
+ /* The item marker can be given with or without
+ braces -- @bullet and @bullet{} are both ok.
+ Or it might be something that doesn't take
+ braces at all, such as "o" or "#" or "@ ".
+ Thus, only supply braces if the item marker is
+ a command, they haven't supplied braces
+ themselves, and we know it needs them. */
+ if (item_func && *item_func)
+ {
+ if (*item_func == COMMAND_PREFIX
+ && item_func[strlen (item_func) - 1] != '}'
+ && command_needs_braces (item_func + 1))
+ execute_string ("%s{}", item_func);
+ else
+ execute_string ("%s", item_func);
+ }
+ insert (' ');
+ output_column++;
+ }
+ else
+ enumerate_item ();
+
+ /* Special hack. This makes `close_paragraph' a no-op until
+ `start_paragraph' has been called. */
+ must_start_paragraph = 1;
+ }
+
+ /* Handle text directly after the @item. */
+ if (*rest_of_line)
+ {
+ line_number--;
+ input_text_offset = original_input_text_offset;
+ }
+ }
+ break;
+
+ case table:
+ case ftable:
+ case vtable:
+ if (html)
+ { /* If nothing has been output since the last <dd>,
+ remove the empty <dd> element. Some browsers render
+ an extra empty line for <dd><dt>, which makes @itemx
+ conversion look ugly. */
+ rollback_empty_tag ("dd");
+
+ /* Force the browser to render one blank line before
+ each new @item in a table. But don't do that if
+ this is the first <dt> after the <dl>, or if we are
+ converting @itemx.
+
+ Note that there are some browsers which ignore <br>
+ in this context, but I cannot find any way to force
+ them all render exactly one blank line. */
+ if (!itemx_flag && html_deflist_has_term)
+ add_html_block_elt ("<br>");
+
+ /* We are about to insert a <dt>, so this <dl> has a term.
+ Feel free to insert a <br> next time. :) */
+ html_deflist_has_term = 1;
+
+ add_html_block_elt ("<dt>");
+ if (item_func && *item_func)
+ execute_string ("%s{%s}", item_func, rest_of_line);
+ else
+ execute_string ("%s", rest_of_line);
+
+ if (current_insertion_type () == ftable)
+ execute_string ("%cfindex %s\n", COMMAND_PREFIX, rest_of_line);
+
+ if (current_insertion_type () == vtable)
+ execute_string ("%cvindex %s\n", COMMAND_PREFIX, rest_of_line);
+
+ add_html_block_elt ("<dd>");
+ }
+ else if (xml) /* && docbook)*/ /* 05-08 */
+ {
+ xml_begin_table_item ();
+
+ if (!docbook && current_insertion_type () == ftable)
+ execute_string ("%cfindex %s\n", COMMAND_PREFIX, rest_of_line);
+
+ if (!docbook && current_insertion_type () == vtable)
+ execute_string ("%cvindex %s\n", COMMAND_PREFIX, rest_of_line);
+
+ if (item_func && *item_func)
+ execute_string ("%s{%s}", item_func, rest_of_line);
+ else
+ execute_string ("%s", rest_of_line);
+ xml_continue_table_item ();
+ }
+ else
+ {
+ /* We need this to determine if we have two @item's in a row
+ (see test just below). */
+ static int last_item_output_position = 0;
+
+ /* Get rid of extra characters. */
+ kill_self_indent (-1);
+
+ /* If we have one @item followed directly by another @item,
+ we need to insert a blank line. This is not true for
+ @itemx, though. */
+ if (!itemx_flag && last_item_output_position == output_position)
+ insert ('\n');
+
+ /* `close_paragraph' almost does what we want. The problem
+ is when paragraph_is_open, and last_char_was_newline, and
+ the last newline has been turned into a space, because
+ filling_enabled. I handle it here. */
+ if (last_char_was_newline && filling_enabled &&
+ paragraph_is_open)
+ insert ('\n');
+ close_paragraph ();
+
+#if defined (INDENT_PARAGRAPHS_IN_TABLE)
+ /* Indent on a new line, but back up one indentation level. */
+ {
+ int save = inhibit_paragraph_indentation;
+ inhibit_paragraph_indentation = 1;
+ /* At this point, inserting any non-whitespace character will
+ force the existing indentation to be output. */
+ add_char ('i');
+ inhibit_paragraph_indentation = save;
+ }
+#else /* !INDENT_PARAGRAPHS_IN_TABLE */
+ add_char ('i');
+#endif /* !INDENT_PARAGRAPHS_IN_TABLE */
+
+ output_paragraph_offset--;
+ kill_self_indent (default_indentation_increment + 1);
+
+ /* Add item's argument to the line. */
+ filling_enabled = 0;
+ if (item_func && *item_func)
+ execute_string ("%s{%s}", item_func, rest_of_line);
+ else
+ execute_string ("%s", rest_of_line);
+
+ if (current_insertion_type () == ftable)
+ execute_string ("%cfindex %s\n", COMMAND_PREFIX, rest_of_line);
+ else if (current_insertion_type () == vtable)
+ execute_string ("%cvindex %s\n", COMMAND_PREFIX, rest_of_line);
+
+ /* Start a new line, and let start_paragraph ()
+ do the indenting of it for you. */
+ close_single_paragraph ();
+ indented_fill = filling_enabled = 1;
+ last_item_output_position = output_position;
+ }
+ }
+ free (rest_of_line);
+ }
+ else
+ {
+ no_insertion:
+ line_error (_("%c%s found outside of an insertion block"),
+ COMMAND_PREFIX, command);
+ }
+}
+
+void
+cm_itemx (void)
+{
+ itemx_flag++;
+ cm_item ();
+ itemx_flag--;
+}
+
+int headitem_flag = 0;
+
+void
+cm_headitem (void)
+{
+ headitem_flag = 1;
+ cm_item ();
+}
diff --git a/Build/source/utils/texinfo/makeinfo/insertion.h b/Build/source/utils/texinfo/makeinfo/insertion.h
new file mode 100644
index 00000000000..ace55716f2a
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/insertion.h
@@ -0,0 +1,78 @@
+/* insertion.h -- declarations for insertion.c.
+ $Id: insertion.h,v 1.10 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1998, 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef INSERTION_H
+#define INSERTION_H
+
+/* Must match list in insertion.c. */
+enum insertion_type
+{
+ cartouche, copying, defcv, deffn, defivar, defmac, defmethod, defop,
+ defopt, defspec, deftp, deftypecv, deftypefn, deftypefun, deftypeivar,
+ deftypemethod, deftypeop, deftypevar, deftypevr, defun, defvar, defvr,
+ detailmenu, direntry, display, documentdescription, enumerate,
+ example, floatenv, flushleft, flushright, format, ftable, group,
+ ifclear, ifdocbook, ifhtml, ifinfo, ifnotdocbook, ifnothtml, ifnotinfo,
+ ifnotplaintext, ifnottex, ifnotxml, ifplaintext, ifset, iftex, ifxml,
+ itemize, lisp, menu, multitable, quotation, rawdocbook, rawhtml, rawtex,
+ rawxml, smalldisplay, smallexample, smallformat, smalllisp, verbatim,
+ table, tex, vtable, titlepage, bad_type
+};
+
+typedef struct istack_elt
+{
+ struct istack_elt *next;
+ char *item_function;
+ char *filename;
+ int line_number;
+ int filling_enabled;
+ int indented_fill;
+ int insertion;
+ int inhibited;
+ int in_fixed_width_font;
+} INSERTION_ELT;
+
+extern int insertion_level;
+extern INSERTION_ELT *insertion_stack;
+extern int in_menu;
+extern int in_detailmenu;
+extern int had_menu_commentary;
+extern int in_paragraph;
+
+extern int headitem_flag;
+extern int after_headitem;
+
+extern void init_insertion_stack (void);
+extern void command_name_condition (void);
+extern void cm_ifdocbook (void), cm_ifnotdocbook(void), cm_docbook (int arg);
+extern void cm_ifhtml (void), cm_ifnothtml(void), cm_html (int arg);
+extern void cm_ifinfo (void), cm_ifnotinfo (void);
+extern void cm_ifplaintext (void), cm_ifnotplaintext(void);
+extern void cm_iftex (void), cm_ifnottex (void), cm_tex (void);
+extern void cm_ifxml (void), cm_ifnotxml (void), cm_xml (int arg);
+extern void handle_verbatim_environment (int find_end_verbatim);
+extern void begin_insertion (enum insertion_type type);
+extern void pop_insertion (void);
+extern void discard_insertions (int specials_ok);
+
+extern int is_in_insertion_of_type (int type);
+extern int command_needs_braces (char *cmd);
+
+extern enum insertion_type find_type_from_name (char *name);
+#endif /* !INSERTION_H */
diff --git a/Build/source/utils/texinfo/makeinfo/lang.c b/Build/source/utils/texinfo/makeinfo/lang.c
new file mode 100644
index 00000000000..c72e8dbc631
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/lang.c
@@ -0,0 +1,1020 @@
+/* lang.c -- language-dependent support.
+ $Id: lang.c,v 1.14 2004/11/22 23:57:33 karl Exp $
+
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#include "system.h"
+#include "cmds.h"
+#include "files.h"
+#include "lang.h"
+#include "makeinfo.h"
+#include "xml.h"
+
+/* Current document encoding. */
+encoding_code_type document_encoding_code = no_encoding;
+
+/* Current language code; default is English. */
+language_code_type language_code = en;
+
+/* By default, unsupported encoding is an empty string. */
+char *unknown_encoding = NULL;
+
+static iso_map_type us_ascii_map [] = {{NULL, 0, 0}}; /* ASCII map is trivial */
+
+/* Translation table between HTML and ISO Codes. The last item is
+ hopefully the Unicode. It might be possible that those Unicodes are
+ not correct, cause I didn't check them. kama */
+static iso_map_type iso8859_1_map [] = {
+ { "nbsp", 0xA0, 0x00A0 },
+ { "iexcl", 0xA1, 0x00A1 },
+ { "cent", 0xA2, 0x00A2 },
+ { "pound", 0xA3, 0x00A3 },
+ { "curren", 0xA4, 0x00A4 },
+ { "yen", 0xA5, 0x00A5 },
+ { "brkbar", 0xA6, 0x00A6 },
+ { "sect", 0xA7, 0x00A7 },
+ { "uml", 0xA8, 0x00A8 },
+ { "copy", 0xA9, 0x00A9 },
+ { "ordf", 0xAA, 0x00AA },
+ { "laquo", 0xAB, 0x00AB },
+ { "not", 0xAC, 0x00AC },
+ { "shy", 0xAD, 0x00AD },
+ { "reg", 0xAE, 0x00AE },
+ { "hibar", 0xAF, 0x00AF },
+ { "deg", 0xB0, 0x00B0 },
+ { "plusmn", 0xB1, 0x00B1 },
+ { "sup2", 0xB2, 0x00B2 },
+ { "sup3", 0xB3, 0x00B3 },
+ { "acute", 0xB4, 0x00B4 },
+ { "micro", 0xB5, 0x00B5 },
+ { "para", 0xB6, 0x00B6 },
+ { "middot", 0xB7, 0x00B7 },
+ { "cedil", 0xB8, 0x00B8 },
+ { "sup1", 0xB9, 0x00B9 },
+ { "ordm", 0xBA, 0x00BA },
+ { "raquo", 0xBB, 0x00BB },
+ { "frac14", 0xBC, 0x00BC },
+ { "frac12", 0xBD, 0x00BD },
+ { "frac34", 0xBE, 0x00BE },
+ { "iquest", 0xBF, 0x00BF },
+ { "Agrave", 0xC0, 0x00C0 },
+ { "Aacute", 0xC1, 0x00C1 },
+ { "Acirc", 0xC2, 0x00C2 },
+ { "Atilde", 0xC3, 0x00C3 },
+ { "Auml", 0xC4, 0x00C4 },
+ { "Aring", 0xC5, 0x00C5 },
+ { "AElig", 0xC6, 0x00C6 },
+ { "Ccedil", 0xC7, 0x00C7 },
+ { "Ccedil", 0xC7, 0x00C7 },
+ { "Egrave", 0xC8, 0x00C8 },
+ { "Eacute", 0xC9, 0x00C9 },
+ { "Ecirc", 0xCA, 0x00CA },
+ { "Euml", 0xCB, 0x00CB },
+ { "Igrave", 0xCC, 0x00CC },
+ { "Iacute", 0xCD, 0x00CD },
+ { "Icirc", 0xCE, 0x00CE },
+ { "Iuml", 0xCF, 0x00CF },
+ { "ETH", 0xD0, 0x00D0 },
+ { "Ntilde", 0xD1, 0x00D1 },
+ { "Ograve", 0xD2, 0x00D2 },
+ { "Oacute", 0xD3, 0x00D3 },
+ { "Ocirc", 0xD4, 0x00D4 },
+ { "Otilde", 0xD5, 0x00D5 },
+ { "Ouml", 0xD6, 0x00D6 },
+ { "times", 0xD7, 0x00D7 },
+ { "Oslash", 0xD8, 0x00D8 },
+ { "Ugrave", 0xD9, 0x00D9 },
+ { "Uacute", 0xDA, 0x00DA },
+ { "Ucirc", 0xDB, 0x00DB },
+ { "Uuml", 0xDC, 0x00DC },
+ { "Yacute", 0xDD, 0x00DD },
+ { "THORN", 0xDE, 0x00DE },
+ { "szlig", 0xDF, 0x00DF },
+ { "agrave", 0xE0, 0x00E0 },
+ { "aacute", 0xE1, 0x00E1 },
+ { "acirc", 0xE2, 0x00E2 },
+ { "atilde", 0xE3, 0x00E3 },
+ { "auml", 0xE4, 0x00E4 },
+ { "aring", 0xE5, 0x00E5 },
+ { "aelig", 0xE6, 0x00E6 },
+ { "ccedil", 0xE7, 0x00E7 },
+ { "egrave", 0xE8, 0x00E8 },
+ { "eacute", 0xE9, 0x00E9 },
+ { "ecirc", 0xEA, 0x00EA },
+ { "euml", 0xEB, 0x00EB },
+ { "igrave", 0xEC, 0x00EC },
+ { "iacute", 0xED, 0x00ED },
+ { "icirc", 0xEE, 0x00EE },
+ { "iuml", 0xEF, 0x00EF },
+ { "eth", 0xF0, 0x00F0 },
+ { "ntilde", 0xF1, 0x00F1 },
+ { "ograve", 0xF2, 0x00F2 },
+ { "oacute", 0xF3, 0x00F3 },
+ { "ocirc", 0xF4, 0x00F4 },
+ { "otilde", 0xF5, 0x00F5 },
+ { "ouml", 0xF6, 0x00F6 },
+ { "divide", 0xF7, 0x00F7 },
+ { "oslash", 0xF8, 0x00F8 },
+ { "ugrave", 0xF9, 0x00F9 },
+ { "uacute", 0xFA, 0x00FA },
+ { "ucirc", 0xFB, 0x00FB },
+ { "uuml", 0xFC, 0x00FC },
+ { "yacute", 0xFD, 0x00FD },
+ { "thorn", 0xFE, 0x00FE },
+ { "yuml", 0xFF, 0x00FF },
+ { NULL, 0, 0 }
+};
+
+
+/* ISO 8859-15, also known as Latin 9, differs from Latin 1 in only a
+ few positions. http://www.cs.tut.fi/~jkorpela/latin9.html has a good
+ explanation and listing, summarized here. The names are abbreviated
+ from the official Unicode names, to fit in a decent line length.
+
+ code position
+ dec oct hex latin1 latin1 name latin9 latin9 name
+
+ 164 0244 0xA4 U+00A4 currency symbol U+20AC euro sign
+ 166 0246 0xA6 U+00A6 broken bar U+0160 S with caron
+ 168 0250 0xA8 U+00A8 diaeresis U+0161 s with caron
+ 180 0264 0xB4 U+00B4 acute accent U+017D Z with caron
+ 184 0270 0xB8 U+00B8 cedilla U+017E z with caron
+ 188 0274 0xBC U+00BC fraction 1/4 U+0152 ligature OE
+ 189 0275 0xBD U+00BD fraction 1/2 U+0153 ligature oe
+ 190 0276 0xBE U+00BE fraction 3/4 U+0178 Y with diaeresis
+*/
+
+static iso_map_type iso8859_15_map [] = {
+ { "nbsp", 0xA0, 0x00A0 },
+ { "iexcl", 0xA1, 0x00A1 },
+ { "cent", 0xA2, 0x00A2 },
+ { "pound", 0xA3, 0x00A3 },
+ { "euro", 0xA4, 0x20AC },
+ { "yen", 0xA5, 0x00A5 },
+ { "Scaron", 0xA6, 0x0160 },
+ { "sect", 0xA7, 0x00A7 },
+ { "scaron", 0xA8, 0x0161 },
+ { "copy", 0xA9, 0x00A9 },
+ { "ordf", 0xAA, 0x00AA },
+ { "laquo", 0xAB, 0x00AB },
+ { "not", 0xAC, 0x00AC },
+ { "shy", 0xAD, 0x00AD },
+ { "reg", 0xAE, 0x00AE },
+ { "hibar", 0xAF, 0x00AF },
+ { "deg", 0xB0, 0x00B0 },
+ { "plusmn", 0xB1, 0x00B1 },
+ { "sup2", 0xB2, 0x00B2 },
+ { "sup3", 0xB3, 0x00B3 },
+ { "Zcaron", 0xB4, 0x017D },
+ { "micro", 0xB5, 0x00B5 },
+ { "para", 0xB6, 0x00B6 },
+ { "middot", 0xB7, 0x00B7 },
+ { "zcaron", 0xB8, 0x017E },
+ { "sup1", 0xB9, 0x00B9 },
+ { "ordm", 0xBA, 0x00BA },
+ { "raquo", 0xBB, 0x00BB },
+ { "OElig", 0xBC, 0x0152 },
+ { "oelig", 0xBD, 0x0153 },
+ { "Yuml", 0xBE, 0x0178 },
+ { "iquest", 0xBF, 0x00BF },
+ { "Agrave", 0xC0, 0x00C0 },
+ { "Aacute", 0xC1, 0x00C1 },
+ { "Acirc", 0xC2, 0x00C2 },
+ { "Atilde", 0xC3, 0x00C3 },
+ { "Auml", 0xC4, 0x00C4 },
+ { "Aring", 0xC5, 0x00C5 },
+ { "AElig", 0xC6, 0x00C6 },
+ { "Ccedil", 0xC7, 0x00C7 },
+ { "Ccedil", 0xC7, 0x00C7 },
+ { "Egrave", 0xC8, 0x00C8 },
+ { "Eacute", 0xC9, 0x00C9 },
+ { "Ecirc", 0xCA, 0x00CA },
+ { "Euml", 0xCB, 0x00CB },
+ { "Igrave", 0xCC, 0x00CC },
+ { "Iacute", 0xCD, 0x00CD },
+ { "Icirc", 0xCE, 0x00CE },
+ { "Iuml", 0xCF, 0x00CF },
+ { "ETH", 0xD0, 0x00D0 },
+ { "Ntilde", 0xD1, 0x00D1 },
+ { "Ograve", 0xD2, 0x00D2 },
+ { "Oacute", 0xD3, 0x00D3 },
+ { "Ocirc", 0xD4, 0x00D4 },
+ { "Otilde", 0xD5, 0x00D5 },
+ { "Ouml", 0xD6, 0x00D6 },
+ { "times", 0xD7, 0x00D7 },
+ { "Oslash", 0xD8, 0x00D8 },
+ { "Ugrave", 0xD9, 0x00D9 },
+ { "Uacute", 0xDA, 0x00DA },
+ { "Ucirc", 0xDB, 0x00DB },
+ { "Uuml", 0xDC, 0x00DC },
+ { "Yacute", 0xDD, 0x00DD },
+ { "THORN", 0xDE, 0x00DE },
+ { "szlig", 0xDF, 0x00DF },
+ { "agrave", 0xE0, 0x00E0 },
+ { "aacute", 0xE1, 0x00E1 },
+ { "acirc", 0xE2, 0x00E2 },
+ { "atilde", 0xE3, 0x00E3 },
+ { "auml", 0xE4, 0x00E4 },
+ { "aring", 0xE5, 0x00E5 },
+ { "aelig", 0xE6, 0x00E6 },
+ { "ccedil", 0xE7, 0x00E7 },
+ { "egrave", 0xE8, 0x00E8 },
+ { "eacute", 0xE9, 0x00E9 },
+ { "ecirc", 0xEA, 0x00EA },
+ { "euml", 0xEB, 0x00EB },
+ { "igrave", 0xEC, 0x00EC },
+ { "iacute", 0xED, 0x00ED },
+ { "icirc", 0xEE, 0x00EE },
+ { "iuml", 0xEF, 0x00EF },
+ { "eth", 0xF0, 0x00F0 },
+ { "ntilde", 0xF1, 0x00F1 },
+ { "ograve", 0xF2, 0x00F2 },
+ { "oacute", 0xF3, 0x00F3 },
+ { "ocirc", 0xF4, 0x00F4 },
+ { "otilde", 0xF5, 0x00F5 },
+ { "ouml", 0xF6, 0x00F6 },
+ { "divide", 0xF7, 0x00F7 },
+ { "oslash", 0xF8, 0x00F8 },
+ { "ugrave", 0xF9, 0x00F9 },
+ { "uacute", 0xFA, 0x00FA },
+ { "ucirc", 0xFB, 0x00FB },
+ { "uuml", 0xFC, 0x00FC },
+ { "yacute", 0xFD, 0x00FD },
+ { "thorn", 0xFE, 0x00FE },
+ { "yuml", 0xFF, 0x00FF },
+ { NULL, 0, 0 }
+};
+
+
+
+/* Date: Mon, 31 Mar 2003 00:19:28 +0200
+ From: Wojciech Polak <polak@gnu.org>
+...
+ * Primary Polish site for ogonki is http://www.agh.edu.pl/ogonki/,
+ but it's only in Polish language (it has some interesting links).
+
+ * A general site about ISO 8859-2 at http://nl.ijs.si/gnusl/cee/iso8859-2.html
+
+ * ISO 8859-2 Character Set at http://nl.ijs.si/gnusl/cee/charset.html
+ This site provides almost all information about iso-8859-2,
+ including the character table!!! (must see!)
+
+ * ISO 8859-2 and even HTML entities !!! (must see!)
+ http://people.ssh.fi/mtr/genscript/88592.txt
+
+ * (minor) http://www.agh.edu.pl/ogonki/plchars.html
+ One more table, this time it includes even information about Polish
+ characters in Unicode.
+*/
+
+static iso_map_type iso8859_2_map [] = {
+ { "nbsp", 0xA0, 0x00A0 }, /* NO-BREAK SPACE */
+ { "", 0xA1, 0x0104 }, /* LATIN CAPITAL LETTER A WITH OGONEK */
+ { "", 0xA2, 0x02D8 }, /* BREVE */
+ { "", 0xA3, 0x0141 }, /* LATIN CAPITAL LETTER L WITH STROKE */
+ { "curren", 0xA4, 0x00A4 }, /* CURRENCY SIGN */
+ { "", 0xA5, 0x013D }, /* LATIN CAPITAL LETTER L WITH CARON */
+ { "", 0xA6, 0x015A }, /* LATIN CAPITAL LETTER S WITH ACUTE */
+ { "sect", 0xA7, 0x00A7 }, /* SECTION SIGN */
+ { "uml", 0xA8, 0x00A8 }, /* DIAERESIS */
+ { "", 0xA9, 0x0160 }, /* LATIN CAPITAL LETTER S WITH CARON */
+ { "", 0xAA, 0x015E }, /* LATIN CAPITAL LETTER S WITH CEDILLA */
+ { "", 0xAB, 0x0164 }, /* LATIN CAPITAL LETTER T WITH CARON */
+ { "", 0xAC, 0x0179 }, /* LATIN CAPITAL LETTER Z WITH ACUTE */
+ { "shy", 0xAD, 0x00AD }, /* SOFT HYPHEN */
+ { "", 0xAE, 0x017D }, /* LATIN CAPITAL LETTER Z WITH CARON */
+ { "", 0xAF, 0x017B }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+ { "deg", 0xB0, 0x00B0 }, /* DEGREE SIGN */
+ { "", 0xB1, 0x0105 }, /* LATIN SMALL LETTER A WITH OGONEK */
+ { "", 0xB2, 0x02DB }, /* OGONEK */
+ { "", 0xB3, 0x0142 }, /* LATIN SMALL LETTER L WITH STROKE */
+ { "acute", 0xB4, 0x00B4 }, /* ACUTE ACCENT */
+ { "", 0xB5, 0x013E }, /* LATIN SMALL LETTER L WITH CARON */
+ { "", 0xB6, 0x015B }, /* LATIN SMALL LETTER S WITH ACUTE */
+ { "", 0xB7, 0x02C7 }, /* CARON (Mandarin Chinese third tone) */
+ { "cedil", 0xB8, 0x00B8 }, /* CEDILLA */
+ { "", 0xB9, 0x0161 }, /* LATIN SMALL LETTER S WITH CARON */
+ { "", 0xBA, 0x015F }, /* LATIN SMALL LETTER S WITH CEDILLA */
+ { "", 0xBB, 0x0165 }, /* LATIN SMALL LETTER T WITH CARON */
+ { "", 0xBC, 0x017A }, /* LATIN SMALL LETTER Z WITH ACUTE */
+ { "", 0xBD, 0x02DD }, /* DOUBLE ACUTE ACCENT */
+ { "", 0xBE, 0x017E }, /* LATIN SMALL LETTER Z WITH CARON */
+ { "", 0xBF, 0x017C }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */
+ { "", 0xC0, 0x0154 }, /* LATIN CAPITAL LETTER R WITH ACUTE */
+ { "", 0xC1, 0x00C1 }, /* LATIN CAPITAL LETTER A WITH ACUTE */
+ { "", 0xC2, 0x00C2 }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+ { "", 0xC3, 0x0102 }, /* LATIN CAPITAL LETTER A WITH BREVE */
+ { "", 0xC4, 0x00C4 }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ { "", 0xC5, 0x0139 }, /* LATIN CAPITAL LETTER L WITH ACUTE */
+ { "", 0xC6, 0x0106 }, /* LATIN CAPITAL LETTER C WITH ACUTE */
+ { "", 0xC7, 0x00C7 }, /* LATIN CAPITAL LETTER C WITH CEDILLA */
+ { "", 0xC8, 0x010C }, /* LATIN CAPITAL LETTER C WITH CARON */
+ { "", 0xC9, 0x00C9 }, /* LATIN CAPITAL LETTER E WITH ACUTE */
+ { "", 0xCA, 0x0118 }, /* LATIN CAPITAL LETTER E WITH OGONEK */
+ { "", 0xCB, 0x00CB }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+ { "", 0xCC, 0x011A }, /* LATIN CAPITAL LETTER E WITH CARON */
+ { "", 0xCD, 0x00CD }, /* LATIN CAPITAL LETTER I WITH ACUTE */
+ { "", 0xCE, 0x00CE }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+ { "", 0xCF, 0x010E }, /* LATIN CAPITAL LETTER D WITH CARON */
+ { "", 0xD0, 0x0110 }, /* LATIN CAPITAL LETTER D WITH STROKE */
+ { "", 0xD1, 0x0143 }, /* LATIN CAPITAL LETTER N WITH ACUTE */
+ { "", 0xD2, 0x0147 }, /* LATIN CAPITAL LETTER N WITH CARON */
+ { "", 0xD3, 0x00D3 }, /* LATIN CAPITAL LETTER O WITH ACUTE */
+ { "", 0xD4, 0x00D4 }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+ { "", 0xD5, 0x0150 }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+ { "", 0xD6, 0x00D6 }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+ { "times", 0xD7, 0x00D7 }, /* MULTIPLICATION SIGN */
+ { "", 0xD8, 0x0158 }, /* LATIN CAPITAL LETTER R WITH CARON */
+ { "", 0xD9, 0x016E }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
+ { "", 0xDA, 0x00DA }, /* LATIN CAPITAL LETTER U WITH ACUTE */
+ { "", 0xDB, 0x0170 }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+ { "", 0xDC, 0x00DC }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+ { "", 0xDD, 0x00DD }, /* LATIN CAPITAL LETTER Y WITH ACUTE */
+ { "", 0xDE, 0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA */
+ { "", 0xDF, 0x00DF }, /* LATIN SMALL LETTER SHARP S (German) */
+ { "", 0xE0, 0x0155 }, /* LATIN SMALL LETTER R WITH ACUTE */
+ { "", 0xE1, 0x00E1 }, /* LATIN SMALL LETTER A WITH ACUTE */
+ { "", 0xE2, 0x00E2 }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
+ { "", 0xE3, 0x0103 }, /* LATIN SMALL LETTER A WITH BREVE */
+ { "", 0xE4, 0x00E4 }, /* LATIN SMALL LETTER A WITH DIAERESIS */
+ { "", 0xE5, 0x013A }, /* LATIN SMALL LETTER L WITH ACUTE */
+ { "", 0xE6, 0x0107 }, /* LATIN SMALL LETTER C WITH ACUTE */
+ { "", 0xE7, 0x00E7 }, /* LATIN SMALL LETTER C WITH CEDILLA */
+ { "", 0xE8, 0x010D }, /* LATIN SMALL LETTER C WITH CARON */
+ { "", 0xE9, 0x00E9 }, /* LATIN SMALL LETTER E WITH ACUTE */
+ { "", 0xEA, 0x0119 }, /* LATIN SMALL LETTER E WITH OGONEK */
+ { "", 0xEB, 0x00EB }, /* LATIN SMALL LETTER E WITH DIAERESIS */
+ { "", 0xEC, 0x011B }, /* LATIN SMALL LETTER E WITH CARON */
+ { "", 0xED, 0x00ED }, /* LATIN SMALL LETTER I WITH ACUTE */
+ { "", 0xEE, 0x00EE }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
+ { "", 0xEF, 0x010F }, /* LATIN SMALL LETTER D WITH CARON */
+ { "", 0xF0, 0x0111 }, /* LATIN SMALL LETTER D WITH STROKE */
+ { "", 0xF1, 0x0144 }, /* LATIN SMALL LETTER N WITH ACUTE */
+ { "", 0xF2, 0x0148 }, /* LATIN SMALL LETTER N WITH CARON */
+ { "", 0xF3, 0x00F3 }, /* LATIN SMALL LETTER O WITH ACUTE */
+ { "", 0xF4, 0x00F4 }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
+ { "", 0xF5, 0x0151 }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+ { "", 0xF6, 0x00F6 }, /* LATIN SMALL LETTER O WITH DIAERESIS */
+ { "divide", 0xF7, 0x00F7 }, /* DIVISION SIGN */
+ { "", 0xF8, 0x0159 }, /* LATIN SMALL LETTER R WITH CARON */
+ { "", 0xF9, 0x016F }, /* LATIN SMALL LETTER U WITH RING ABOVE */
+ { "", 0xFA, 0x00FA }, /* LATIN SMALL LETTER U WITH ACUTE */
+ { "", 0xFB, 0x0171 }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+ { "", 0xFC, 0x00FC }, /* LATIN SMALL LETTER U WITH DIAERESIS */
+ { "", 0xFD, 0x00FD }, /* LATIN SMALL LETTER Y WITH ACUTE */
+ { "", 0xFE, 0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA */
+ { "", 0xFF, 0x02D9 }, /* DOT ABOVE (Mandarin Chinese light tone) */
+ { NULL, 0, 0 }
+};
+
+encoding_type encoding_table[] = {
+ { no_encoding, "(no encoding)", NULL },
+ { US_ASCII, "US-ASCII", us_ascii_map },
+ { ISO_8859_1, "iso-8859-1", (iso_map_type *) iso8859_1_map },
+ { ISO_8859_2, "iso-8859-2", (iso_map_type *) iso8859_2_map },
+ { ISO_8859_3, "iso-8859-3", NULL },
+ { ISO_8859_4, "iso-8859-4", NULL },
+ { ISO_8859_5, "iso-8859-5", NULL },
+ { ISO_8859_6, "iso-8859-6", NULL },
+ { ISO_8859_7, "iso-8859-7", NULL },
+ { ISO_8859_8, "iso-8859-8", NULL },
+ { ISO_8859_9, "iso-8859-9", NULL },
+ { ISO_8859_10, "iso-8859-10", NULL },
+ { ISO_8859_11, "iso-8859-11", NULL },
+ { ISO_8859_12, "iso-8859-12", NULL },
+ { ISO_8859_13, "iso-8859-13", NULL },
+ { ISO_8859_14, "iso-8859-14", NULL },
+ { ISO_8859_15, "iso-8859-15", (iso_map_type *) iso8859_15_map },
+ { last_encoding_code, NULL, NULL }
+};
+
+
+language_type language_table[] = {
+ { aa, "aa", "Afar" },
+ { ab, "ab", "Abkhazian" },
+ { af, "af", "Afrikaans" },
+ { am, "am", "Amharic" },
+ { ar, "ar", "Arabic" },
+ { as, "as", "Assamese" },
+ { ay, "ay", "Aymara" },
+ { az, "az", "Azerbaijani" },
+ { ba, "ba", "Bashkir" },
+ { be, "be", "Byelorussian" },
+ { bg, "bg", "Bulgarian" },
+ { bh, "bh", "Bihari" },
+ { bi, "bi", "Bislama" },
+ { bn, "bn", "Bengali; Bangla" },
+ { bo, "bo", "Tibetan" },
+ { br, "br", "Breton" },
+ { ca, "ca", "Catalan" },
+ { co, "co", "Corsican" },
+ { cs, "cs", "Czech" },
+ { cy, "cy", "Welsh" },
+ { da, "da", "Danish" },
+ { de, "de", "German" },
+ { dz, "dz", "Bhutani" },
+ { el, "el", "Greek" },
+ { en, "en", "English" },
+ { eo, "eo", "Esperanto" },
+ { es, "es", "Spanish" },
+ { et, "et", "Estonian" },
+ { eu, "eu", "Basque" },
+ { fa, "fa", "Persian" },
+ { fi, "fi", "Finnish" },
+ { fj, "fj", "Fiji" },
+ { fo, "fo", "Faroese" },
+ { fr, "fr", "French" },
+ { fy, "fy", "Frisian" },
+ { ga, "ga", "Irish" },
+ { gd, "gd", "Scots Gaelic" },
+ { gl, "gl", "Galician" },
+ { gn, "gn", "Guarani" },
+ { gu, "gu", "Gujarati" },
+ { ha, "ha", "Hausa" },
+ { he, "he", "Hebrew" } /* (formerly iw) */,
+ { hi, "hi", "Hindi" },
+ { hr, "hr", "Croatian" },
+ { hu, "hu", "Hungarian" },
+ { hy, "hy", "Armenian" },
+ { ia, "ia", "Interlingua" },
+ { id, "id", "Indonesian" } /* (formerly in) */,
+ { ie, "ie", "Interlingue" },
+ { ik, "ik", "Inupiak" },
+ { is, "is", "Icelandic" },
+ { it, "it", "Italian" },
+ { iu, "iu", "Inuktitut" },
+ { ja, "ja", "Japanese" },
+ { jw, "jw", "Javanese" },
+ { ka, "ka", "Georgian" },
+ { kk, "kk", "Kazakh" },
+ { kl, "kl", "Greenlandic" },
+ { km, "km", "Cambodian" },
+ { kn, "kn", "Kannada" },
+ { ko, "ko", "Korean" },
+ { ks, "ks", "Kashmiri" },
+ { ku, "ku", "Kurdish" },
+ { ky, "ky", "Kirghiz" },
+ { la, "la", "Latin" },
+ { ln, "ln", "Lingala" },
+ { lo, "lo", "Laothian" },
+ { lt, "lt", "Lithuanian" },
+ { lv, "lv", "Latvian, Lettish" },
+ { mg, "mg", "Malagasy" },
+ { mi, "mi", "Maori" },
+ { mk, "mk", "Macedonian" },
+ { ml, "ml", "Malayalam" },
+ { mn, "mn", "Mongolian" },
+ { mo, "mo", "Moldavian" },
+ { mr, "mr", "Marathi" },
+ { ms, "ms", "Malay" },
+ { mt, "mt", "Maltese" },
+ { my, "my", "Burmese" },
+ { na, "na", "Nauru" },
+ { ne, "ne", "Nepali" },
+ { nl, "nl", "Dutch" },
+ { no, "no", "Norwegian" },
+ { oc, "oc", "Occitan" },
+ { om, "om", "(Afan) Oromo" },
+ { or, "or", "Oriya" },
+ { pa, "pa", "Punjabi" },
+ { pl, "pl", "Polish" },
+ { ps, "ps", "Pashto, Pushto" },
+ { pt, "pt", "Portuguese" },
+ { qu, "qu", "Quechua" },
+ { rm, "rm", "Rhaeto-Romance" },
+ { rn, "rn", "Kirundi" },
+ { ro, "ro", "Romanian" },
+ { ru, "ru", "Russian" },
+ { rw, "rw", "Kinyarwanda" },
+ { sa, "sa", "Sanskrit" },
+ { sd, "sd", "Sindhi" },
+ { sg, "sg", "Sangro" },
+ { sh, "sh", "Serbo-Croatian" },
+ { si, "si", "Sinhalese" },
+ { sk, "sk", "Slovak" },
+ { sl, "sl", "Slovenian" },
+ { sm, "sm", "Samoan" },
+ { sn, "sn", "Shona" },
+ { so, "so", "Somali" },
+ { sq, "sq", "Albanian" },
+ { sr, "sr", "Serbian" },
+ { ss, "ss", "Siswati" },
+ { st, "st", "Sesotho" },
+ { su, "su", "Sundanese" },
+ { sv, "sv", "Swedish" },
+ { sw, "sw", "Swahili" },
+ { ta, "ta", "Tamil" },
+ { te, "te", "Telugu" },
+ { tg, "tg", "Tajik" },
+ { th, "th", "Thai" },
+ { ti, "ti", "Tigrinya" },
+ { tk, "tk", "Turkmen" },
+ { tl, "tl", "Tagalog" },
+ { tn, "tn", "Setswana" },
+ { to, "to", "Tonga" },
+ { tr, "tr", "Turkish" },
+ { ts, "ts", "Tsonga" },
+ { tt, "tt", "Tatar" },
+ { tw, "tw", "Twi" },
+ { ug, "ug", "Uighur" },
+ { uk, "uk", "Ukrainian" },
+ { ur, "ur", "Urdu" },
+ { uz, "uz", "Uzbek" },
+ { vi, "vi", "Vietnamese" },
+ { vo, "vo", "Volapuk" },
+ { wo, "wo", "Wolof" },
+ { xh, "xh", "Xhosa" },
+ { yi, "yi", "Yiddish" } /* (formerly ji) */,
+ { yo, "yo", "Yoruba" },
+ { za, "za", "Zhuang" },
+ { zh, "zh", "Chinese" },
+ { zu, "zu", "Zulu" },
+ { last_language_code, NULL, NULL }
+};
+
+/* @documentlanguage. Maybe we'll do something useful with this in the
+ future. For now, we just recognize it. */
+
+/* XML documents can make use of this data. Unfortunately, it clashes with
+ the structure currently used. So instead of enclosing content into
+ a language block, we just output an empty element. Anyways, a stream based
+ parser can make good use of it. */
+void
+cm_documentlanguage (void)
+{
+ language_code_type c;
+ char *lang_arg;
+
+ /* Read the line with the language code on it. */
+ get_rest_of_line (0, &lang_arg);
+
+ /* Linear search is fine these days. */
+ for (c = aa; c != last_language_code; c++)
+ {
+ if (strcmp (lang_arg, language_table[c].abbrev) == 0)
+ { /* Set current language code. */
+ language_code = c;
+ break;
+ }
+ }
+
+ /* If we didn't find this code, complain. */
+ if (c == last_language_code)
+ warning (_("%s is not a valid ISO 639 language code"), lang_arg);
+
+ if (xml && !docbook)
+ {
+ xml_insert_element_with_attribute (DOCUMENTLANGUAGE, START, "xml:lang=\"%s\"", lang_arg);
+ xml_insert_element (DOCUMENTLANGUAGE, END);
+ }
+
+ free (lang_arg);
+}
+
+
+
+/* Search through the encoding table for the given character, returning
+ its equivalent. */
+
+static int
+cm_search_iso_map (char *html)
+{
+ int i;
+ iso_map_type *iso = encoding_table[document_encoding_code].isotab;
+
+ /* If no conversion table for this encoding, quit. */
+ if (!iso)
+ return -1;
+
+ for (i = 0; iso[i].html; i++)
+ {
+ if (strcmp (html, iso[i].html) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+
+/* @documentencoding. Set the translation table. */
+
+void
+cm_documentencoding (void)
+{
+ if (!handling_delayed_writes)
+ {
+ encoding_code_type enc;
+ char *enc_arg;
+
+ /* This is ugly and probably needs to apply to other commands'
+ argument parsing as well. When we're doing @documentencoding,
+ we're generally in the frontmatter of the document, and so the.
+ expansion in html/xml/docbook would generally be the empty string.
+ (Because those modes wait until the first normal text of the
+ document to start outputting.) The result would thus be a warning
+ "unrecognized encoding name `'". Sigh. */
+ int save_html = html;
+ int save_xml = xml;
+
+ html = 0;
+ xml = 0;
+ get_rest_of_line (1, &enc_arg);
+ html = save_html;
+ xml = save_xml;
+
+ /* See if we have this encoding. */
+ for (enc = no_encoding+1; enc != last_encoding_code; enc++)
+ {
+ if (strcasecmp (enc_arg, encoding_table[enc].encname) == 0)
+ {
+ document_encoding_code = enc;
+ break;
+ }
+ }
+
+ /* If we didn't find this code, complain. */
+ if (enc == last_encoding_code)
+ {
+ warning (_("unrecognized encoding name `%s'"), enc_arg);
+ /* Let the previous one go. */
+ if (unknown_encoding && *unknown_encoding)
+ free (unknown_encoding);
+ unknown_encoding = xstrdup (enc_arg);
+ }
+
+ else if (encoding_table[document_encoding_code].isotab == NULL)
+ warning (_("sorry, encoding `%s' not supported"), enc_arg);
+
+ free (enc_arg);
+ }
+ else if (xml)
+ {
+ char *encoding = current_document_encoding ();
+
+ if (encoding && *encoding)
+ {
+ insert_string (" encoding=\"");
+ insert_string (encoding);
+ insert_string ("\"");
+ }
+
+ free (encoding);
+ }
+}
+
+char *
+current_document_encoding (void)
+{
+ if (document_encoding_code != no_encoding)
+ return xstrdup (encoding_table[document_encoding_code].encname);
+ else if (unknown_encoding && *unknown_encoding)
+ return xstrdup (unknown_encoding);
+ else
+ return xstrdup ("");
+}
+
+
+/* If html or xml output, add &HTML_STR; to the output. If not html and
+ the user requested encoded output, add the real 8-bit character
+ corresponding to HTML_STR from the translation tables. Otherwise,
+ add INFO_STR. */
+
+static void
+add_encoded_char (char *html_str, char *info_str)
+{
+ if (html)
+ add_word_args ("&%s;", html_str);
+ else if (xml)
+ xml_insert_entity (html_str);
+ else if (enable_encoding)
+ {
+ /* Look for HTML_STR in the current translation table. */
+ int rc = cm_search_iso_map (html_str);
+ if (rc >= 0)
+ /* We found it, add the real character. */
+ add_char (encoding_table[document_encoding_code].isotab[rc].bytecode);
+ else
+ { /* We didn't find it, that seems bad. */
+ warning (_("invalid encoded character `%s'"), html_str);
+ add_word (info_str);
+ }
+ }
+ else
+ add_word (info_str);
+}
+
+
+
+/* Output an accent for HTML or XML. */
+
+static void
+cm_accent_generic_html (int arg, int start, int end, char *html_supported,
+ int single, int html_solo_standalone, char *html_solo)
+{
+ static int valid_html_accent; /* yikes */
+
+ if (arg == START)
+ { /* If HTML has good support for this character, use it. */
+ if (strchr (html_supported, curchar ()))
+ { /* Yes; start with an ampersand. The character itself
+ will be added later in read_command (makeinfo.c). */
+ int saved_escape_html = escape_html;
+ escape_html = 0;
+ valid_html_accent = 1;
+ add_char ('&');
+ escape_html = saved_escape_html;
+ }
+ else
+ { /* @dotless{i} is not listed in html_supported but HTML entities
+ starting with `i' can be used, such as &icirc;. */
+ int save_input_text_offset = input_text_offset;
+ char *accent_contents;
+
+ get_until_in_braces ("\n", &accent_contents);
+ canon_white (accent_contents);
+
+ if (strstr (accent_contents, "@dotless{i"))
+ {
+ add_word_args ("&%c", accent_contents[9]);
+ valid_html_accent = 1;
+ }
+ else
+ {
+ /* Search for @dotless{} wasn't successful, so rewind. */
+ input_text_offset = save_input_text_offset;
+ valid_html_accent = 0;
+ if (html_solo_standalone)
+ { /* No special HTML support, so produce standalone char. */
+ if (xml)
+ xml_insert_entity (html_solo);
+ else
+ add_word_args ("&%s;", html_solo);
+ }
+ else
+ /* If the html_solo does not exist as standalone character
+ (namely &circ; &grave; &tilde;), then we use
+ the single character version instead. */
+ add_char (single);
+ }
+
+ free (accent_contents);
+ }
+ }
+ else if (arg == END)
+ { /* Only if we saw a valid_html_accent can we use the full
+ HTML accent (umlaut, grave ...). */
+ if (valid_html_accent)
+ {
+ add_word (html_solo);
+ add_char (';');
+ }
+ }
+}
+
+
+static void
+cm_accent_generic_no_headers (int arg, int start, int end, int single,
+ char *html_solo)
+{
+ if (arg == END)
+ {
+ if (no_encoding)
+ add_char (single);
+ else
+ {
+ int rc;
+ char *buffer = xmalloc (1 + strlen (html_solo) + 1);
+ buffer[0] = output_paragraph[end - 1];
+ buffer[1] = 0;
+ strcat (buffer, html_solo);
+
+ rc = cm_search_iso_map (buffer);
+ if (rc >= 0)
+ /* A little bit tricky ;-)
+ Here we replace the character which has
+ been inserted in read_command with
+ the value we have found in converting table
+ Does there exist a better way to do this? kama. */
+ output_paragraph[end - 1]
+ = encoding_table[document_encoding_code].isotab[rc].bytecode;
+ else
+ { /* If we didn't find a translation for this character,
+ put the single instead. E.g., &Xuml; does not exist so X&uml;
+ should be produced. */
+ /* When the below warning is issued, an author has nothing
+ wrong in their document, let alone anything ``fixable''
+ on their side. So it is commented out for now. */
+ /* warning (_("%s is an invalid ISO code, using %c"),
+ buffer, single); */
+ add_char (single);
+ }
+
+ free (buffer);
+ }
+ }
+}
+
+
+
+/* Accent commands that take explicit arguments and don't have any
+ special HTML support. */
+
+void
+cm_accent (int arg)
+{
+ int old_escape_html = escape_html;
+ escape_html = 0;
+ if (arg == START)
+ {
+ /* Must come first to avoid ambiguity with overdot. */
+ if (strcmp (command, "udotaccent") == 0) /* underdot */
+ add_char ('.');
+ }
+ else if (arg == END)
+ {
+ if (strcmp (command, "=") == 0) /* macron */
+ add_word ((html || xml) ? "&macr;" : "=");
+ else if (strcmp (command, "H") == 0) /* Hungarian umlaut */
+ add_word ("''");
+ else if (strcmp (command, "dotaccent") == 0) /* overdot */
+ add_meta_char ('.');
+ else if (strcmp (command, "ringaccent") == 0) /* ring */
+ add_char ('*');
+ else if (strcmp (command, "tieaccent") == 0) /* long tie */
+ add_char ('[');
+ else if (strcmp (command, "u") == 0) /* breve */
+ add_char ('(');
+ else if (strcmp (command, "ubaraccent") == 0) /* underbar */
+ add_char ('_');
+ else if (strcmp (command, "v") == 0) /* hacek/check */
+ add_word ((html || xml) ? "&lt;" : "<");
+ }
+ escape_html = old_escape_html;
+}
+
+/* Common routine for the accent characters that have support in HTML.
+ If the character being accented is in the HTML_SUPPORTED set, then
+ produce &CHTML_SOLO;, for example, &Auml; for an A-umlaut. If not in
+ HTML_SUPPORTED, just produce &HTML_SOLO;X for the best we can do with
+ at an X-umlaut. If not producing HTML, just use SINGLE, a
+ character such as " which is the best plain text representation we
+ can manage. If HTML_SOLO_STANDALONE is nonzero the given HTML_SOLO
+ exists as valid standalone character in HTML, e.g., &uml;. */
+
+static void
+cm_accent_generic (int arg, int start, int end, char *html_supported,
+ int single, int html_solo_standalone, char *html_solo)
+{
+ /* Accentuating space characters makes no sense, so issue a warning. */
+ if (arg == START && isspace (input_text[input_text_offset]))
+ warning ("Accent command `@%s' must not be followed by whitespace",
+ command);
+
+ if (html || xml)
+ cm_accent_generic_html (arg, start, end, html_supported,
+ single, html_solo_standalone, html_solo);
+ else if (no_headers)
+ cm_accent_generic_no_headers (arg, start, end, single, html_solo);
+ else if (arg == END)
+ {
+ if (enable_encoding)
+ /* use 8-bit if available */
+ cm_accent_generic_no_headers (arg, start, end, single, html_solo);
+ else
+ /* use regular character */
+ add_char (single);
+ }
+}
+
+void
+cm_accent_umlaut (int arg, int start, int end)
+{
+ cm_accent_generic (arg, start, end, "aouAOUEeIiy", '"', 1, "uml");
+}
+
+void
+cm_accent_acute (int arg, int start, int end)
+{
+ cm_accent_generic (arg, start, end, "AEIOUYaeiouy", '\'', 1, "acute");
+}
+
+void
+cm_accent_cedilla (int arg, int start, int end)
+{
+ cm_accent_generic (arg, start, end, "Cc", ',', 1, "cedil");
+}
+
+void
+cm_accent_hat (int arg, int start, int end)
+{
+ cm_accent_generic (arg, start, end, "AEIOUaeiou", '^', 0, "circ");
+}
+
+void
+cm_accent_grave (int arg, int start, int end)
+{
+ cm_accent_generic (arg, start, end, "AEIOUaeiou", '`', 0, "grave");
+}
+
+void
+cm_accent_tilde (int arg, int start, int end)
+{
+ cm_accent_generic (arg, start, end, "ANOano", '~', 0, "tilde");
+}
+
+
+
+/* Non-English letters/characters that don't insert themselves. */
+void
+cm_special_char (int arg)
+{
+ int old_escape_html = escape_html;
+ escape_html = 0;
+
+ if (arg == START)
+ {
+ if ((*command == 'L' || *command == 'l'
+ || *command == 'O' || *command == 'o')
+ && command[1] == 0)
+ { /* Lslash lslash Oslash oslash.
+ Lslash and lslash aren't supported in HTML. */
+ if (command[0] == 'O')
+ add_encoded_char ("Oslash", "/O");
+ else if (command[0] == 'o')
+ add_encoded_char ("oslash", "/o");
+ else
+ add_word_args ("/%c", command[0]);
+ }
+ else if (strcmp (command, "exclamdown") == 0)
+ add_encoded_char ("iexcl", "!");
+ else if (strcmp (command, "questiondown") == 0)
+ add_encoded_char ("iquest", "?");
+ else if (strcmp (command, "euro") == 0)
+ /* http://www.cs.tut.fi/~jkorpela/html/euro.html suggests that
+ &euro; degrades best in old browsers. */
+ add_encoded_char ("euro", "Euro ");
+ else if (strcmp (command, "pounds") == 0)
+ add_encoded_char ("pound" , "#");
+ else if (strcmp (command, "ordf") == 0)
+ add_encoded_char ("ordf" , "a");
+ else if (strcmp (command, "ordm") == 0)
+ add_encoded_char ("ordm" , "o");
+ else if (strcmp (command, "AE") == 0)
+ add_encoded_char ("AElig", command);
+ else if (strcmp (command, "ae") == 0)
+ add_encoded_char ("aelig", command);
+ else if (strcmp (command, "OE") == 0)
+ add_encoded_char ("OElig", command);
+ else if (strcmp (command, "oe") == 0)
+ add_encoded_char ("oelig", command);
+ else if (strcmp (command, "AA") == 0)
+ add_encoded_char ("Aring", command);
+ else if (strcmp (command, "aa") == 0)
+ add_encoded_char ("aring", command);
+ else if (strcmp (command, "ss") == 0)
+ add_encoded_char ("szlig", command);
+ else
+ line_error ("cm_special_char internal error: command=@%s", command);
+ }
+ escape_html = old_escape_html;
+}
+
+/* Dotless i or j. */
+void
+cm_dotless (int arg, int start, int end)
+{
+ if (arg == END)
+ {
+ xml_no_para --;
+ if (output_paragraph[start] != 'i' && output_paragraph[start] != 'j')
+ /* This error message isn't perfect if the argument is multiple
+ characters, but it doesn't seem worth getting right. */
+ line_error (_("%c%s expects `i' or `j' as argument, not `%c'"),
+ COMMAND_PREFIX, command, output_paragraph[start]);
+
+ else if (end - start != 1)
+ line_error (_("%c%s expects a single character `i' or `j' as argument"),
+ COMMAND_PREFIX, command);
+
+ /* We've already inserted the `i' or `j', so nothing to do. */
+ }
+ else
+ xml_no_para ++;
+}
diff --git a/Build/source/utils/texinfo/makeinfo/lang.h b/Build/source/utils/texinfo/makeinfo/lang.h
new file mode 100644
index 00000000000..b231455a6e9
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/lang.h
@@ -0,0 +1,148 @@
+/* lang.h -- declarations for language codes etc.
+ $Id: lang.h,v 1.6 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#ifndef LANG_H
+#define LANG_H
+
+/* The language code which can be changed through @documentlanguage
+ * Actually we don't currently support this (may be in the future) ;-)
+ * These code are the ISO-639 two letter codes.
+ */
+typedef enum
+{
+ aa, ab, af, am, ar, as, ay, az,
+ ba, be, bg, bh, bi, bn, bo, br,
+ ca, co, cs, cy,
+ da, de, dz,
+ el, en, eo, es, et, eu,
+ fa, fi, fj, fo, fr, fy,
+ ga, gd, gl, gn, gu,
+ ha, he, hi, hr, hu, hy,
+ ia, id, ie, ik, is, it, iu,
+ ja, jw,
+ ka, kk, kl, km, kn, ko, ks, ku, ky,
+ la, ln, lo, lt, lv,
+ mg, mi, mk, ml, mn, mo, mr, ms, mt, my,
+ na, ne, nl, no,
+ oc, om, or,
+ pa, pl, ps, pt,
+ qu,
+ rm, rn, ro, ru, rw,
+ sa, sd, sg, sh, si, sk, sl, sm, sn, so, sq, sr, ss, st, su, sv, sw,
+ ta, te, tg, th, ti, tk, tl, tn, to, tr, ts, tt, tw,
+ ug, uk, ur, uz,
+ vi, vo,
+ wo,
+ xh,
+ yi, yo,
+ za, zh, zu,
+ last_language_code
+} language_code_type;
+
+/* The current language code. */
+extern language_code_type language_code;
+
+
+/* Information for each language. */
+typedef struct
+{
+ language_code_type lc; /* language code as enum type */
+ char *abbrev; /* two letter language code */
+ char *desc; /* full name for language code */
+} language_type;
+
+extern language_type language_table[];
+
+
+
+/* The document encoding. This is useful to produce true 8-bit
+ characters according to the @documentencoding. */
+
+typedef enum {
+ no_encoding,
+ US_ASCII,
+ ISO_8859_1,
+ ISO_8859_2,
+ ISO_8859_3, /* this and none of the rest are supported. */
+ ISO_8859_4,
+ ISO_8859_5,
+ ISO_8859_6,
+ ISO_8859_7,
+ ISO_8859_8,
+ ISO_8859_9,
+ ISO_8859_10,
+ ISO_8859_11,
+ ISO_8859_12,
+ ISO_8859_13,
+ ISO_8859_14,
+ ISO_8859_15,
+ last_encoding_code
+} encoding_code_type;
+
+/* The current document encoding, or null if not set. */
+extern encoding_code_type document_encoding_code;
+
+/* If an encoding is not supported, just keep it as a string. */
+extern char *unknown_encoding;
+
+/* Maps an HTML abbreviation to ISO and Unicode codes for a given code. */
+
+typedef unsigned short int unicode_t; /* should be 16 bits */
+typedef unsigned char byte_t;
+
+typedef struct
+{
+ char *html; /* HTML equivalent like umlaut auml => &auml; */
+ byte_t bytecode; /* 8-Bit Code (ISO 8859-1,...) */
+ unicode_t unicode; /* Unicode in U+ convention */
+} iso_map_type;
+
+/* Information about the document encoding. */
+typedef struct
+{
+ encoding_code_type ec; /* document encoding type (see above enum) */
+ char *encname; /* encoding name like "iso-8859-1", valid in
+ HTML and Emacs */
+ iso_map_type *isotab; /* address of ISO translation table */
+} encoding_type;
+
+/* Table with all the encoding codes that we recognize. */
+extern encoding_type encoding_table[];
+
+
+/* The commands. */
+extern void cm_documentlanguage (void),
+ cm_documentencoding (void);
+
+/* Accents, other non-English characters. */
+void cm_accent (int arg), cm_special_char (int arg),
+ cm_dotless (int arg, int start, int end);
+
+extern void cm_accent_umlaut (int arg, int start, int end),
+ cm_accent_acute (int arg, int start, int end),
+ cm_accent_cedilla (int arg, int start, int end),
+ cm_accent_hat (int arg, int start, int end),
+ cm_accent_grave (int arg, int start, int end),
+ cm_accent_tilde (int arg, int start, int end);
+
+extern char *current_document_encoding (void);
+
+#endif /* not LANG_H */
diff --git a/Build/source/utils/texinfo/makeinfo/macro.c b/Build/source/utils/texinfo/makeinfo/macro.c
new file mode 100644
index 00000000000..65ac0dac8f8
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/macro.c
@@ -0,0 +1,1108 @@
+/* macro.c -- user-defined macros for Texinfo.
+ $Id: macro.c,v 1.6 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "cmds.h"
+#include "files.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "insertion.h"
+
+/* If non-NULL, this is an output stream to write the full macro expansion
+ of the input text to. The result is another texinfo file, but
+ missing @include, @infoinclude, @macro, and macro invocations. Instead,
+ all of the text is placed within the file. */
+FILE *macro_expansion_output_stream = NULL;
+
+/* Output file for -E. */
+char *macro_expansion_filename;
+
+/* Nonzero means a macro string is in execution, as opposed to a file. */
+int me_executing_string = 0;
+
+/* Nonzero means we want only to expand macros and
+ leave everything else intact. */
+int only_macro_expansion = 0;
+
+static ITEXT **itext_info = NULL;
+static int itext_size = 0;
+
+/* Return the arglist on the current line. This can behave in two different
+ ways, depending on the variable BRACES_REQUIRED_FOR_MACRO_ARGS. */
+int braces_required_for_macro_args = 0;
+
+/* Array of macros and definitions. */
+MACRO_DEF **macro_list = NULL;
+
+int macro_list_len = 0; /* Number of elements. */
+int macro_list_size = 0; /* Number of slots in total. */
+
+/* Return the length of the array in ARRAY. */
+int
+array_len (char **array)
+{
+ int i = 0;
+
+ if (array)
+ for (i = 0; array[i]; i++);
+
+ return i;
+}
+
+void
+free_array (char **array)
+{
+ if (array)
+ {
+ int i;
+ for (i = 0; array[i]; i++)
+ free (array[i]);
+
+ free (array);
+ }
+}
+
+/* Return the macro definition of NAME or NULL if NAME is not defined. */
+MACRO_DEF *
+find_macro (char *name)
+{
+ int i;
+ MACRO_DEF *def;
+
+ def = NULL;
+ for (i = 0; macro_list && (def = macro_list[i]); i++)
+ {
+ if ((!def->inhibited) && (strcmp (def->name, name) == 0))
+ break;
+ }
+ return def;
+}
+
+/* Add the macro NAME with ARGLIST and BODY to the list of defined macros.
+ SOURCE_FILE is the name of the file where this definition can be found,
+ and SOURCE_LINENO is the line number within that file. If a macro already
+ exists with NAME, then a warning is produced, and that previous
+ definition is overwritten. */
+static void
+add_macro (char *name, char **arglist, char *body, char *source_file,
+ int source_lineno, int flags)
+{
+ MACRO_DEF *def;
+
+ def = find_macro (name);
+
+ if (!def)
+ {
+ if (macro_list_len + 2 >= macro_list_size)
+ macro_list = xrealloc
+ (macro_list, ((macro_list_size += 10) * sizeof (MACRO_DEF *)));
+
+ macro_list[macro_list_len] = xmalloc (sizeof (MACRO_DEF));
+ macro_list[macro_list_len + 1] = NULL;
+
+ def = macro_list[macro_list_len];
+ macro_list_len += 1;
+ def->name = name;
+ }
+ else
+ {
+ char *temp_filename = input_filename;
+ int temp_line = line_number;
+
+ warning (_("macro `%s' previously defined"), name);
+
+ input_filename = def->source_file;
+ line_number = def->source_lineno;
+ warning (_("here is the previous definition of `%s'"), name);
+
+ input_filename = temp_filename;
+ line_number = temp_line;
+
+ if (def->arglist)
+ {
+ int i;
+
+ for (i = 0; def->arglist[i]; i++)
+ free (def->arglist[i]);
+
+ free (def->arglist);
+ }
+ free (def->source_file);
+ free (def->body);
+ }
+
+ def->source_file = xstrdup (source_file);
+ def->source_lineno = source_lineno;
+ def->body = body;
+ def->arglist = arglist;
+ def->inhibited = 0;
+ def->flags = flags;
+}
+
+
+char **
+get_brace_args (int quote_single)
+{
+ char **arglist, *word;
+ int arglist_index, arglist_size;
+ int character, escape_seen, start;
+ int depth = 1;
+
+ /* There is an arglist in braces here, so gather the args inside of it. */
+ skip_whitespace_and_newlines ();
+ input_text_offset++;
+ arglist = NULL;
+ arglist_index = arglist_size = 0;
+
+ get_arg:
+ skip_whitespace_and_newlines ();
+ start = input_text_offset;
+ escape_seen = 0;
+
+ while ((character = curchar ()))
+ {
+ if (character == '\\')
+ {
+ input_text_offset += 2;
+ escape_seen = 1;
+ }
+ else if (character == '{')
+ {
+ depth++;
+ input_text_offset++;
+ }
+ else if ((character == ',' && !quote_single) ||
+ ((character == '}') && depth == 1))
+ {
+ int len = input_text_offset - start;
+
+ if (len || (character != '}'))
+ {
+ word = xmalloc (1 + len);
+ memcpy (word, input_text + start, len);
+ word[len] = 0;
+
+ /* Clean up escaped characters. */
+ if (escape_seen)
+ {
+ int i;
+ for (i = 0; word[i]; i++)
+ if (word[i] == '\\')
+ memmove (word + i, word + i + 1,
+ 1 + strlen (word + i + 1));
+ }
+
+ if (arglist_index + 2 >= arglist_size)
+ arglist = xrealloc
+ (arglist, (arglist_size += 10) * sizeof (char *));
+
+ arglist[arglist_index++] = word;
+ arglist[arglist_index] = NULL;
+ }
+
+ input_text_offset++;
+ if (character == '}')
+ break;
+ else
+ goto get_arg;
+ }
+ else if (character == '}')
+ {
+ depth--;
+ input_text_offset++;
+ }
+ else
+ {
+ input_text_offset++;
+ if (character == '\n') line_number++;
+ }
+ }
+ return arglist;
+}
+
+static char **
+get_macro_args (MACRO_DEF *def)
+{
+ int i;
+ char *word;
+
+ /* Quickly check to see if this macro has been invoked with any arguments.
+ If not, then don't skip any of the following whitespace. */
+ for (i = input_text_offset; i < input_text_length; i++)
+ if (!cr_or_whitespace (input_text[i]))
+ break;
+
+ if (input_text[i] != '{')
+ {
+ if (braces_required_for_macro_args)
+ {
+ return NULL;
+ }
+ else
+ {
+ /* Braces are not required to fill out the macro arguments. If
+ this macro takes one argument, it is considered to be the
+ remainder of the line, sans whitespace. */
+ if (def->arglist && def->arglist[0] && !def->arglist[1])
+ {
+ char **arglist;
+
+ get_rest_of_line (0, &word);
+ if (input_text[input_text_offset - 1] == '\n')
+ {
+ input_text_offset--;
+ line_number--;
+ }
+ /* canon_white (word); */
+ arglist = xmalloc (2 * sizeof (char *));
+ arglist[0] = word;
+ arglist[1] = NULL;
+ return arglist;
+ }
+ else
+ {
+ /* The macro either took no arguments, or took more than
+ one argument. In that case, it must be invoked with
+ arguments surrounded by braces. */
+ return NULL;
+ }
+ }
+ }
+ return get_brace_args (def->flags & ME_QUOTE_ARG);
+}
+
+/* Substitute actual parameters for named parameters in body.
+ The named parameters which appear in BODY must by surrounded
+ reverse slashes, as in \foo\. */
+static char *
+apply (char **named, char **actuals, char *body)
+{
+ int i;
+ int new_body_index, new_body_size;
+ char *new_body, *text;
+ int length_of_actuals;
+
+ length_of_actuals = array_len (actuals);
+ new_body_size = strlen (body);
+ new_body = xmalloc (1 + new_body_size);
+
+ /* Copy chars from BODY into NEW_BODY. */
+ i = 0;
+ new_body_index = 0;
+
+ while (body[i])
+ { /* Anything but a \ is easy. */
+ if (body[i] != '\\')
+ new_body[new_body_index++] = body[i++];
+ else
+ { /* Snarf parameter name, check against named parameters. */
+ char *param;
+ int param_start, len;
+
+ param_start = ++i;
+ while (body[i] && body[i] != '\\')
+ i++;
+
+ len = i - param_start;
+ param = xmalloc (1 + len);
+ memcpy (param, body + param_start, len);
+ param[len] = 0;
+
+ if (body[i]) /* move past \ */
+ i++;
+
+ if (len == 0)
+ { /* \\ always means \, even if macro has no args. */
+ len++;
+ text = xmalloc (1 + len);
+ sprintf (text, "\\%s", param);
+ }
+ else
+ {
+ int which;
+
+ /* Check against named parameters. */
+ for (which = 0; named && named[which]; which++)
+ if (STREQ (named[which], param))
+ break;
+
+ if (named && named[which])
+ {
+ text = which < length_of_actuals ? actuals[which] : NULL;
+ if (!text)
+ text = "";
+ len = strlen (text);
+ text = xstrdup (text); /* so we can free it */
+ }
+ else
+ { /* not a parameter, so it's an error. */
+ warning (_("\\ in macro expansion followed by `%s' instead of parameter name"),
+ param);
+ len++;
+ text = xmalloc (1 + len);
+ sprintf (text, "\\%s", param);
+ }
+ }
+
+ if (strlen (param) + 2 < len)
+ {
+ new_body_size += len + 1;
+ new_body = xrealloc (new_body, new_body_size);
+ }
+
+ free (param);
+
+ strcpy (new_body + new_body_index, text);
+ new_body_index += len;
+
+ free (text);
+ }
+ }
+
+ new_body[new_body_index] = 0;
+ return new_body;
+}
+
+/* Expand macro passed in DEF, a pointer to a MACRO_DEF, and
+ return its expansion as a string. */
+char *
+expand_macro (MACRO_DEF *def)
+{
+ char **arglist;
+ int num_args;
+ char *execution_string = NULL;
+ int start_line = line_number;
+
+ /* Find out how many arguments this macro definition takes. */
+ num_args = array_len (def->arglist);
+
+ /* Gather the arguments present on the line if there are any. */
+ arglist = get_macro_args (def);
+
+ if (num_args < array_len (arglist))
+ {
+ free_array (arglist);
+ line_error (_("Macro `%s' called on line %d with too many args"),
+ def->name, start_line);
+ return execution_string;
+ }
+
+ if (def->body)
+ execution_string = apply (def->arglist, arglist, def->body);
+
+ free_array (arglist);
+ return execution_string;
+}
+
+/* Execute the macro passed in DEF, a pointer to a MACRO_DEF. */
+void
+execute_macro (MACRO_DEF *def)
+{
+ char *execution_string;
+ int start_line = line_number, end_line;
+
+ if (macro_expansion_output_stream && !executing_string && !me_inhibit_expansion)
+ me_append_before_this_command ();
+
+ execution_string = expand_macro (def);
+ if (!execution_string)
+ return;
+
+ if (def->body)
+ {
+ /* Reset the line number to where the macro arguments began.
+ This makes line numbers reported in error messages correct in
+ case the macro arguments span several lines and the expanded
+ arguments invoke other commands. */
+ end_line = line_number;
+ line_number = start_line;
+
+ if (macro_expansion_output_stream
+ && !executing_string && !me_inhibit_expansion)
+ {
+ remember_itext (input_text, input_text_offset);
+ me_execute_string (execution_string);
+ }
+ else
+ execute_string ("%s", execution_string);
+
+ free (execution_string);
+ line_number = end_line;
+ }
+}
+
+
+/* Read and remember the definition of a macro. If RECURSIVE is set,
+ set the ME_RECURSE flag. MACTYPE is either "macro" or "rmacro", and
+ tells us what the matching @end should be. */
+static void
+define_macro (char *mactype, int recursive)
+{
+ int i, start;
+ char *name, *line;
+ char *last_end = NULL;
+ char *body = NULL;
+ char **arglist = NULL;
+ int body_size = 0, body_index = 0;
+ int depth = 1;
+ int flags = 0;
+ int defining_line = line_number;
+
+ if (macro_expansion_output_stream && !executing_string)
+ me_append_before_this_command ();
+
+ skip_whitespace ();
+
+ /* Get the name of the macro. This is the set of characters which are
+ not whitespace and are not `{' immediately following the @macro. */
+ start = input_text_offset;
+ {
+ int len;
+
+ for (i = start; i < input_text_length && input_text[i] != '{'
+ && !cr_or_whitespace (input_text[i]);
+ i++) ;
+
+ len = i - start;
+ name = xmalloc (1 + len);
+ memcpy (name, input_text + start, len);
+ name[len] = 0;
+ input_text_offset = i;
+ }
+
+ skip_whitespace ();
+
+ /* It is not required that the definition of a macro includes an arglist.
+ If not, don't try to get the named parameters, just use a null list. */
+ if (curchar () == '{')
+ {
+ int character;
+ int arglist_index = 0, arglist_size = 0;
+ int gathering_words = 1;
+ char *word = NULL;
+
+ /* Read the words inside of the braces which determine the arglist.
+ These words will be replaced within the body of the macro at
+ execution time. */
+
+ input_text_offset++;
+ skip_whitespace_and_newlines ();
+
+ while (gathering_words)
+ {
+ int len;
+
+ for (i = input_text_offset;
+ (character = input_text[i]);
+ i++)
+ {
+ switch (character)
+ {
+ case '\n':
+ line_number++;
+ case ' ':
+ case '\t':
+ case ',':
+ case '}':
+ /* Found the end of the current arglist word. Save it. */
+ len = i - input_text_offset;
+ word = xmalloc (1 + len);
+ memcpy (word, input_text + input_text_offset, len);
+ word[len] = 0;
+ input_text_offset = i;
+
+ /* Advance to the comma or close-brace that signified
+ the end of the argument. */
+ while ((character = curchar ())
+ && character != ','
+ && character != '}')
+ {
+ input_text_offset++;
+ if (character == '\n')
+ line_number++;
+ }
+
+ /* Add the word to our list of words. */
+ if (arglist_index + 2 >= arglist_size)
+ {
+ arglist_size += 10;
+ arglist = xrealloc (arglist,
+ arglist_size * sizeof (char *));
+ }
+
+ arglist[arglist_index++] = word;
+ arglist[arglist_index] = NULL;
+ break;
+ }
+
+ if (character == '}')
+ {
+ input_text_offset++;
+ gathering_words = 0;
+ break;
+ }
+
+ if (character == ',')
+ {
+ input_text_offset++;
+ skip_whitespace_and_newlines ();
+ i = input_text_offset - 1;
+ }
+ }
+ }
+
+ /* If we have exactly one argument, do @quote-arg implicitly. Not
+ only does this match TeX's behavior (which can't feasibly be
+ changed), but it's a good idea. */
+ if (arglist_index == 1)
+ flags |= ME_QUOTE_ARG;
+ }
+
+ /* Read the text carefully until we find an "@end macro" which
+ matches this one. The text in between is the body of the macro. */
+ skip_whitespace_and_newlines ();
+
+ while (depth)
+ {
+ if ((input_text_offset + 9) > input_text_length)
+ {
+ file_line_error (input_filename, defining_line,
+ _("%cend macro not found"), COMMAND_PREFIX);
+ return;
+ }
+
+ get_rest_of_line (0, &line);
+
+ /* Handle commands only meaningful within a macro. */
+ if ((*line == COMMAND_PREFIX) && (depth == 1) &&
+ (strncmp (line + 1, "allow-recursion", 15) == 0) &&
+ (line[16] == 0 || whitespace (line[16])))
+ {
+ for (i = 16; whitespace (line[i]); i++);
+ strcpy (line, line + i);
+ flags |= ME_RECURSE;
+ if (!*line)
+ {
+ free (line);
+ continue;
+ }
+ }
+
+ if ((*line == COMMAND_PREFIX) && (depth == 1) &&
+ (strncmp (line + 1, "quote-arg", 9) == 0) &&
+ (line[10] == 0 || whitespace (line[10])))
+ {
+ for (i = 10; whitespace (line[i]); i++);
+ strcpy (line, line + i);
+
+ if (arglist && arglist[0] && !arglist[1])
+ {
+ flags |= ME_QUOTE_ARG;
+ if (!*line)
+ {
+ free (line);
+ continue;
+ }
+ }
+ else
+ line_error (_("@quote-arg only useful for single-argument macros"));
+ }
+
+ if (*line == COMMAND_PREFIX
+ && (strncmp (line + 1, "macro ", 6) == 0
+ || strncmp (line + 1, "rmacro ", 7) == 0))
+ depth++;
+
+ /* Incorrect implementation of nesting -- just check that the last
+ @end matches what we started with. Since nested macros don't
+ work in TeX anyway, this isn't worth the trouble to get right. */
+ if (*line == COMMAND_PREFIX && strncmp (line + 1, "end macro", 9) == 0)
+ {
+ depth--;
+ last_end = "macro";
+ }
+ if (*line == COMMAND_PREFIX && strncmp (line + 1, "end rmacro", 10) == 0)
+ {
+ depth--;
+ last_end = "rmacro";
+ }
+
+ if (depth)
+ {
+ if ((body_index + strlen (line) + 3) >= body_size)
+ body = xrealloc (body, body_size += 3 + strlen (line));
+ strcpy (body + body_index, line);
+ body_index += strlen (line);
+ body[body_index++] = '\n';
+ body[body_index] = 0;
+ }
+ free (line);
+ }
+
+ /* Check that @end matched the macro command. */
+ if (!STREQ (last_end, mactype))
+ warning (_("mismatched @end %s with @%s"), last_end, mactype);
+
+ /* If it was an empty macro like
+ @macro foo
+ @end macro
+ create an empty body. (Otherwise, the macro is not expanded.) */
+ if (!body)
+ {
+ body = (char *)malloc(1);
+ *body = 0;
+ }
+
+ /* We now have the name, the arglist, and the body. However, BODY
+ includes the final newline which preceded the `@end macro' text.
+ Delete it. */
+ if (body && strlen (body))
+ body[strlen (body) - 1] = 0;
+
+ if (recursive)
+ flags |= ME_RECURSE;
+
+ add_macro (name, arglist, body, input_filename, defining_line, flags);
+
+ if (macro_expansion_output_stream && !executing_string)
+ {
+ /* Remember text for future expansions. */
+ remember_itext (input_text, input_text_offset);
+
+ /* Bizarrely, output the @macro itself. This is so texinfo.tex
+ will have a chance to read it when texi2dvi calls makeinfo -E.
+ The problem is that we don't really expand macros in all
+ contexts; a @table's @item is one. And a fix is not obvious to
+ me, since it appears virtually identical to any other internal
+ expansion. Just setting a variable in cm_item caused other
+ strange expansion problems. */
+ write_region_to_macro_output ("@", 0, 1);
+ write_region_to_macro_output (mactype, 0, strlen (mactype));
+ write_region_to_macro_output (" ", 0, 1);
+ write_region_to_macro_output (input_text, start, input_text_offset);
+ }
+}
+
+void
+cm_macro (void)
+{
+ define_macro ("macro", 0);
+}
+
+void
+cm_rmacro (void)
+{
+ define_macro ("rmacro", 1);
+}
+
+/* Delete the macro with name NAME. The macro is deleted from the list,
+ but it is also returned. If there was no macro defined, NULL is
+ returned. */
+
+static MACRO_DEF *
+delete_macro (char *name)
+{
+ int i;
+ MACRO_DEF *def;
+
+ def = NULL;
+
+ for (i = 0; macro_list && (def = macro_list[i]); i++)
+ if (strcmp (def->name, name) == 0)
+ {
+ memmove (macro_list + i, macro_list + i + 1,
+ ((macro_list_len + 1) - i) * sizeof (MACRO_DEF *));
+ macro_list_len--;
+ break;
+ }
+ return def;
+}
+
+void
+cm_unmacro (void)
+{
+ int i;
+ char *line, *name;
+ MACRO_DEF *def;
+
+ if (macro_expansion_output_stream && !executing_string)
+ me_append_before_this_command ();
+
+ get_rest_of_line (0, &line);
+
+ for (i = 0; line[i] && !whitespace (line[i]); i++);
+ name = xmalloc (i + 1);
+ memcpy (name, line, i);
+ name[i] = 0;
+
+ def = delete_macro (name);
+
+ if (def)
+ {
+ free (def->source_file);
+ free (def->name);
+ free (def->body);
+
+ if (def->arglist)
+ {
+ int i;
+
+ for (i = 0; def->arglist[i]; i++)
+ free (def->arglist[i]);
+
+ free (def->arglist);
+ }
+
+ free (def);
+ }
+
+ free (line);
+ free (name);
+
+ if (macro_expansion_output_stream && !executing_string)
+ remember_itext (input_text, input_text_offset);
+}
+
+/* How to output sections of the input file verbatim. */
+
+/* Set the value of POINTER's offset to OFFSET. */
+ITEXT *
+remember_itext (char *pointer, int offset)
+{
+ int i;
+ ITEXT *itext = NULL;
+
+ /* If we have no info, initialize a blank list. */
+ if (!itext_info)
+ {
+ itext_info = xmalloc ((itext_size = 10) * sizeof (ITEXT *));
+ for (i = 0; i < itext_size; i++)
+ itext_info[i] = NULL;
+ }
+
+ /* If the pointer is already present in the list, then set the offset. */
+ for (i = 0; i < itext_size; i++)
+ if ((itext_info[i]) &&
+ (itext_info[i]->pointer == pointer))
+ {
+ itext = itext_info[i];
+ itext_info[i]->offset = offset;
+ break;
+ }
+
+ if (i == itext_size)
+ {
+ /* Find a blank slot (or create a new one), and remember the
+ pointer and offset. */
+ for (i = 0; i < itext_size; i++)
+ if (itext_info[i] == NULL)
+ break;
+
+ /* If not found, then add some slots. */
+ if (i == itext_size)
+ {
+ int j;
+
+ itext_info = xrealloc
+ (itext_info, (itext_size += 10) * sizeof (ITEXT *));
+
+ for (j = i; j < itext_size; j++)
+ itext_info[j] = NULL;
+ }
+
+ /* Now add the pointer and the offset. */
+ itext_info[i] = xmalloc (sizeof (ITEXT));
+ itext_info[i]->pointer = pointer;
+ itext_info[i]->offset = offset;
+ itext = itext_info[i];
+ }
+ return itext;
+}
+
+/* Forget the input text associated with POINTER. */
+void
+forget_itext (char *pointer)
+{
+ int i;
+
+ for (i = 0; i < itext_size; i++)
+ if (itext_info[i] && (itext_info[i]->pointer == pointer))
+ {
+ free (itext_info[i]);
+ itext_info[i] = NULL;
+ break;
+ }
+}
+
+/* Append the text which appeared in input_text from the last offset to
+ the character just before the command that we are currently executing. */
+void
+me_append_before_this_command (void)
+{
+ int i;
+
+ for (i = input_text_offset; i && (input_text[i] != COMMAND_PREFIX); i--)
+ ;
+ maybe_write_itext (input_text, i);
+}
+
+/* Similar to execute_string, but only takes a single string argument,
+ and remembers the input text location, etc. */
+void
+me_execute_string (char *execution_string)
+{
+ int saved_escape_html = escape_html;
+ int saved_in_paragraph = in_paragraph;
+ escape_html = me_executing_string == 0;
+ in_paragraph = 0;
+
+ pushfile ();
+ input_text_offset = 0;
+ /* The following xstrdup is so we can relocate input_text at will. */
+ input_text = xstrdup (execution_string);
+ input_filename = xstrdup (input_filename);
+ input_text_length = strlen (execution_string);
+
+ remember_itext (input_text, 0);
+
+ me_executing_string++;
+ reader_loop ();
+ free (input_text);
+ free (input_filename);
+ popfile ();
+ me_executing_string--;
+
+ in_paragraph = saved_in_paragraph;
+ escape_html = saved_escape_html;
+}
+
+/* A wrapper around me_execute_string which saves and restores
+ variables important for output generation. This is called
+ when we need to produce macro-expanded output for input which
+ leaves no traces in the Info output. */
+void
+me_execute_string_keep_state (char *execution_string, char *append_string)
+{
+ int op_orig, opcol_orig, popen_orig;
+ int fill_orig, newline_orig, indent_orig, meta_pos_orig;
+
+ remember_itext (input_text, input_text_offset);
+ op_orig = output_paragraph_offset;
+ meta_pos_orig = meta_char_pos;
+ opcol_orig = output_column;
+ popen_orig = paragraph_is_open;
+ fill_orig = filling_enabled;
+ newline_orig = last_char_was_newline;
+ filling_enabled = 0;
+ indent_orig = no_indent;
+ no_indent = 1;
+ me_execute_string (execution_string);
+ if (append_string)
+ write_region_to_macro_output (append_string, 0, strlen (append_string));
+ output_paragraph_offset = op_orig;
+ meta_char_pos = meta_pos_orig;
+ output_column = opcol_orig;
+ paragraph_is_open = popen_orig;
+ filling_enabled = fill_orig;
+ last_char_was_newline = newline_orig;
+ no_indent = indent_orig;
+}
+
+/* Append the text which appears in input_text from the last offset to
+ the current OFFSET. */
+void
+append_to_expansion_output (int offset)
+{
+ int i;
+ ITEXT *itext = NULL;
+
+ for (i = 0; i < itext_size; i++)
+ if (itext_info[i] && itext_info[i]->pointer == input_text)
+ {
+ itext = itext_info[i];
+ break;
+ }
+
+ if (!itext)
+ return;
+
+ if (offset > itext->offset)
+ {
+ write_region_to_macro_output (input_text, itext->offset, offset);
+ remember_itext (input_text, offset);
+ }
+}
+
+/* Only write this input text iff it appears in our itext list. */
+void
+maybe_write_itext (char *pointer, int offset)
+{
+ int i;
+ ITEXT *itext = NULL;
+
+ for (i = 0; i < itext_size; i++)
+ if (itext_info[i] && (itext_info[i]->pointer == pointer))
+ {
+ itext = itext_info[i];
+ break;
+ }
+
+ if (itext && (itext->offset < offset))
+ {
+ write_region_to_macro_output (itext->pointer, itext->offset, offset);
+ remember_itext (pointer, offset);
+ }
+}
+
+void
+write_region_to_macro_output (char *string, int start, int end)
+{
+ if (macro_expansion_output_stream)
+ fwrite (string + start, 1, end - start, macro_expansion_output_stream);
+}
+
+/* Aliases. */
+
+typedef struct alias_struct
+{
+ char *alias;
+ char *mapto;
+ struct alias_struct *next;
+} alias_type;
+
+static alias_type *aliases;
+
+/* @alias aname = cmdname */
+
+void
+cm_alias (void)
+{
+ alias_type *a = xmalloc (sizeof (alias_type));
+
+ skip_whitespace ();
+ get_until_in_line (0, "=", &(a->alias));
+ canon_white (a->alias);
+
+ discard_until ("=");
+ skip_whitespace ();
+ get_until_in_line (0, " ", &(a->mapto));
+
+ a->next = aliases;
+ aliases = a;
+}
+
+/* Perform an alias expansion. Called from read_command. */
+char *
+alias_expand (char *tok)
+{
+ alias_type *findit = aliases;
+
+ while (findit)
+ if (strcmp (findit->alias, tok) == 0)
+ {
+ free (tok);
+ return alias_expand (xstrdup (findit->mapto));
+ }
+ else
+ findit = findit->next;
+
+ return tok;
+}
+
+/* definfoenclose implementation. */
+
+/* This structure is used to track enclosure macros. When an enclosure
+ macro is recognized, a pointer to the enclosure block corresponding
+ to its name is saved in the brace element for its argument. */
+typedef struct enclose_struct
+{
+ char *enclose;
+ char *before;
+ char *after;
+ struct enclose_struct *next;
+} enclosure_type;
+
+static enclosure_type *enclosures;
+
+typedef struct enclosure_stack_struct
+{
+ enclosure_type *current;
+ struct enclosure_stack_struct *next;
+} enclosure_stack_type;
+
+static enclosure_stack_type *enclosure_stack;
+
+/* @definfoenclose */
+void
+cm_definfoenclose (void)
+{
+ enclosure_type *e = xmalloc (sizeof (enclosure_type));
+
+ skip_whitespace ();
+ get_until_in_line (1, ",", &(e->enclose));
+ discard_until (",");
+ get_until_in_line (0, ",", &(e->before));
+ discard_until (",");
+ get_until_in_line (0, "\n", &(e->after));
+
+ e->next = enclosures;
+ enclosures = e;
+}
+
+/* If TOK is an enclosure command, push it on the enclosure stack and
+ return 1. Else return 0. */
+
+int
+enclosure_command (char *tok)
+{
+ enclosure_type *findit = enclosures;
+
+ while (findit)
+ if (strcmp (findit->enclose, tok) == 0)
+ {
+ enclosure_stack_type *new = xmalloc (sizeof (enclosure_stack_type));
+ new->current = findit;
+ new->next = enclosure_stack;
+ enclosure_stack = new;
+
+ return 1;
+ }
+ else
+ findit = findit->next;
+
+ return 0;
+}
+
+/* actually perform the enclosure expansion */
+void
+enclosure_expand (int arg, int start, int end)
+{
+ if (arg == START)
+ add_word (enclosure_stack->current->before);
+ else
+ {
+ enclosure_stack_type *temp;
+
+ add_word (enclosure_stack->current->after);
+
+ temp = enclosure_stack;
+ enclosure_stack = enclosure_stack->next;
+ free (temp);
+ }
+}
diff --git a/Build/source/utils/texinfo/makeinfo/macro.h b/Build/source/utils/texinfo/makeinfo/macro.h
new file mode 100644
index 00000000000..fbc0e59e651
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/macro.h
@@ -0,0 +1,77 @@
+/* macro.h -- declarations for macro.c.
+ $Id: macro.h,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1998, 99 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef MACRO_H
+#define MACRO_H
+
+extern FILE *macro_expansion_output_stream;
+extern char *macro_expansion_filename;
+extern int me_executing_string;
+extern int only_macro_expansion;
+
+/* Here is a structure used to remember input text strings and offsets
+ within them. */
+typedef struct {
+ char *pointer; /* Pointer to the input text. */
+ int offset; /* Offset of the last character output. */
+} ITEXT;
+
+/* Macro definitions for user-defined commands. */
+typedef struct {
+ char *name; /* Name of the macro. */
+ char **arglist; /* Args to replace when executing. */
+ char *body; /* Macro body. */
+ char *source_file; /* File where this macro is defined. */
+ int source_lineno; /* Line number within FILENAME. */
+ int inhibited; /* Nonzero means make find_macro () fail. */
+ int flags; /* ME_RECURSE, ME_QUOTE_ARG, etc. */
+} MACRO_DEF;
+
+/* flags for MACRO_DEF */
+#define ME_RECURSE 0x01
+#define ME_QUOTE_ARG 0x02
+
+extern void execute_macro (MACRO_DEF *def);
+extern MACRO_DEF *find_macro (char *name);
+extern char *expand_macro (MACRO_DEF *def);
+
+extern ITEXT *remember_itext (char *pointer, int offset);
+extern void forget_itext (char *pointer);
+extern void maybe_write_itext (char *pointer, int offset);
+extern void write_region_to_macro_output (char *string, int start, int end);
+extern void append_to_expansion_output (int offset);
+extern void me_append_before_this_command (void);
+extern void me_execute_string (char *execution_string);
+extern void me_execute_string_keep_state (char *execution_string,
+ char *append_string);
+
+extern char *alias_expand (char *tok);
+extern int enclosure_command (char *tok);
+extern void enclosure_expand (int arg, int start, int end);
+
+/* The @commands. */
+extern void cm_macro (void), cm_rmacro (void), cm_unmacro (void);
+extern void cm_alias (void), cm_definfoenclose (void);
+
+extern int array_len (char **array);
+extern void free_array (char **array);
+extern char **get_brace_args (int quote_single);
+
+#endif /* not MACRO_H */
diff --git a/Build/source/utils/texinfo/makeinfo/makeinfo.c b/Build/source/utils/texinfo/makeinfo/makeinfo.c
new file mode 100644
index 00000000000..22ed4c4fd99
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/makeinfo.c
@@ -0,0 +1,4157 @@
+/* makeinfo -- convert Texinfo source into other formats.
+ $Id: makeinfo.c,v 1.74 2004/12/19 17:15:42 karl Exp $
+
+ Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Original author of makeinfo: Brian Fox (bfox@ai.mit.edu). */
+
+#include "system.h"
+#include "getopt.h"
+
+#define COMPILING_MAKEINFO
+#include "makeinfo.h"
+#include "cmds.h"
+#include "files.h"
+#include "float.h"
+#include "footnote.h"
+#include "html.h"
+#include "index.h"
+#include "insertion.h"
+#include "lang.h"
+#include "macro.h"
+#include "node.h"
+#include "sectioning.h"
+#include "toc.h"
+#include "xml.h"
+
+/* You can change some of the behavior of Makeinfo by changing the
+ following defines: */
+
+/* Define INDENT_PARAGRAPHS_IN_TABLE if you want the paragraphs which
+ appear within an @table, @ftable, or @itemize environment to have
+ standard paragraph indentation. Without this, such paragraphs have
+ no starting indentation. */
+/* #define INDENT_PARAGRAPHS_IN_TABLE */
+
+/* Define PARAGRAPH_START_INDENT to be the amount of indentation that
+ the first lines of paragraphs receive by default, where no other
+ value has been specified. Users can change this value on the command
+ line, with the --paragraph-indent option, or within the texinfo file,
+ with the @paragraphindent command. */
+#define PARAGRAPH_START_INDENT 3
+
+/* Define DEFAULT_PARAGRAPH_SPACING as the number of blank lines that you
+ wish to appear between paragraphs. A value of 1 creates a single blank
+ line between paragraphs. Paragraphs are defined by 2 or more consecutive
+ newlines in the input file (i.e., one or more blank lines). */
+#define DEFAULT_PARAGRAPH_SPACING 1
+
+/* Global variables. */
+
+/* The output file name. */
+char *output_filename = NULL;
+
+/* Name of the output file that the user elected to pass on the command line.
+ Such a name overrides any name found with the @setfilename command. */
+char *command_output_filename = NULL;
+static char *save_command_output_filename = NULL;
+
+#define INITIAL_PARAGRAPH_SPACE 5000
+int paragraph_buffer_len = INITIAL_PARAGRAPH_SPACE;
+
+/* The amount of indentation to add at the starts of paragraphs.
+ 0 means don't change existing indentation at paragraph starts.
+ > 0 is amount to indent new paragraphs by.
+ < 0 means indent to column zero by removing indentation if necessary.
+
+ This is normally zero, but some people prefer paragraph starts to be
+ somewhat more indented than paragraph bodies. A pretty value for
+ this is 3. */
+int paragraph_start_indent = PARAGRAPH_START_INDENT;
+
+/* Indentation that is pending insertion. We have this for hacking lines
+ which look blank, but contain whitespace. We want to treat those as
+ blank lines. */
+int pending_indent = 0;
+
+/* The index in our internal command table of the currently
+ executing command. */
+int command_index;
+
+/* A search string which is used to find the first @setfilename. */
+char setfilename_search[] =
+ { COMMAND_PREFIX,
+ 's', 'e', 't', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', 0 };
+
+/* Values for calling handle_variable_internal (). */
+#define SET 1
+#define CLEAR 2
+#define IFSET 3
+#define IFCLEAR 4
+
+/* Flags controlling the operation of the program. */
+
+/* Default is to remove output if there were errors. */
+int force = 0;
+
+/* Default is to notify users of bad choices. */
+int print_warnings = 1;
+
+/* Number of errors that we tolerate on a given fileset. */
+int max_error_level = 100;
+
+/* The actual last inserted character. Note that this may be something
+ other than NEWLINE even if last_char_was_newline is 1. */
+int last_inserted_character = 0;
+
+/* Nonzero means that a newline character has already been
+ inserted, so close_paragraph () should insert one less. */
+int line_already_broken = 0;
+
+/* When nonzero we have finished an insertion (see end_insertion ()) and we
+ want to ignore false continued paragraph closings. */
+int insertion_paragraph_closed = 0;
+
+/* Nonzero means attempt to make all of the lines have fill_column width. */
+int do_justification = 0;
+
+/* Nonzero means don't replace whitespace with &nbsp; in HTML mode. */
+int in_html_elt = 0;
+
+/* Nonzero means we are inserting a block level HTML element that must not be
+ enclosed in a <p>, such as <ul>, <ol> and <h?>. */
+int in_html_block_level_elt = 0;
+
+/* True when expanding a macro definition. */
+static int executing_macro = 0;
+
+/* True when we are inside a <li> block of a menu. */
+static int in_menu_item = 0;
+
+typedef struct brace_element
+{
+ struct brace_element *next;
+ COMMAND_FUNCTION *proc;
+ char *command;
+ int pos, line;
+ int in_fixed_width_font;
+} BRACE_ELEMENT;
+
+BRACE_ELEMENT *brace_stack = NULL;
+
+static void convert_from_file (char *name);
+static void convert_from_loaded_file (char *name);
+static void convert_from_stream (FILE *stream, char *name);
+static void do_flush_right_indentation (void);
+static void handle_variable (int action);
+static void handle_variable_internal (int action, char *name);
+static void init_brace_stack (void);
+static void init_internals (void);
+static void pop_and_call_brace (void);
+static void remember_brace (COMMAND_FUNCTION (*proc));
+static int end_of_sentence_p (void);
+
+void maybe_update_execution_strings (char **text, unsigned int new_len);
+
+/* Error handling. */
+
+/* Number of errors encountered. */
+int errors_printed = 0;
+
+/* Remember that an error has been printed. If more than
+ max_error_level have been printed, then exit the program. */
+static void
+remember_error (void)
+{
+ errors_printed++;
+ if (max_error_level && (errors_printed > max_error_level))
+ {
+ fprintf (stderr, _("Too many errors! Gave up.\n"));
+ flush_file_stack ();
+ if (errors_printed - max_error_level < 2)
+ cm_bye ();
+ xexit (1);
+ }
+}
+
+/* Print the last error gotten from the file system. */
+int
+fs_error (char *filename)
+{
+ remember_error ();
+ perror (filename);
+ return 0;
+}
+
+/* Print an error message, and return false. */
+void
+#if defined (VA_FPRINTF) && __STDC__
+error (const char *format, ...)
+#else
+error (format, va_alist)
+ const char *format;
+ va_dcl
+#endif
+{
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+
+ remember_error ();
+
+ VA_START (ap, format);
+#ifdef VA_FPRINTF
+ VA_FPRINTF (stderr, format, ap);
+#else
+ fprintf (stderr, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_FPRINTF */
+ va_end (ap);
+
+ putc ('\n', stderr);
+}
+
+/* Just like error (), but print the input file and line number as well. */
+void
+#if defined (VA_FPRINTF) && __STDC__
+file_line_error (char *infile, int lno, const char *format, ...)
+#else
+file_line_error (infile, lno, format, va_alist)
+ char *infile;
+ int lno;
+ const char *format;
+ va_dcl
+#endif
+{
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+
+ remember_error ();
+ fprintf (stderr, "%s:%d: ", infile, lno);
+
+ VA_START (ap, format);
+#ifdef VA_FPRINTF
+ VA_FPRINTF (stderr, format, ap);
+#else
+ fprintf (stderr, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_FPRINTF */
+ va_end (ap);
+
+ fprintf (stderr, ".\n");
+}
+
+/* Just like file_line_error (), but take the input file and the line
+ number from global variables. */
+void
+#if defined (VA_FPRINTF) && __STDC__
+line_error (const char *format, ...)
+#else
+line_error (format, va_alist)
+ const char *format;
+ va_dcl
+#endif
+{
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+
+ remember_error ();
+ fprintf (stderr, "%s:%d: ", input_filename, line_number);
+
+ VA_START (ap, format);
+#ifdef VA_FPRINTF
+ VA_FPRINTF (stderr, format, ap);
+#else
+ fprintf (stderr, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_FPRINTF */
+ va_end (ap);
+
+ fprintf (stderr, ".\n");
+}
+
+void
+#if defined (VA_FPRINTF) && __STDC__
+warning (const char *format, ...)
+#else
+warning (format, va_alist)
+ const char *format;
+ va_dcl
+#endif
+{
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+
+ if (print_warnings)
+ {
+ fprintf (stderr, _("%s:%d: warning: "), input_filename, line_number);
+
+ VA_START (ap, format);
+#ifdef VA_FPRINTF
+ VA_FPRINTF (stderr, format, ap);
+#else
+ fprintf (stderr, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_FPRINTF */
+ va_end (ap);
+
+ fprintf (stderr, ".\n");
+ }
+}
+
+
+/* The other side of a malformed expression. */
+static void
+misplaced_brace (void)
+{
+ line_error (_("Misplaced %c"), '}');
+}
+
+/* Main. */
+
+/* Display the version info of this invocation of Makeinfo. */
+static void
+print_version_info (void)
+{
+ printf ("makeinfo (GNU %s) %s\n", PACKAGE, VERSION);
+}
+
+/* If EXIT_VALUE is zero, print the full usage message to stdout.
+ Otherwise, just say to use --help for more info.
+ Then exit with EXIT_VALUE. */
+static void
+usage (int exit_value)
+{
+ if (exit_value != 0)
+ fprintf (stderr, _("Try `%s --help' for more information.\n"), progname);
+ else
+ {
+ printf (_("Usage: %s [OPTION]... TEXINFO-FILE...\n"), progname);
+ puts ("");
+
+ puts (_("\
+Translate Texinfo source documentation to various other formats, by default\n\
+Info files suitable for reading online with Emacs or standalone GNU Info.\n"));
+
+ printf (_("\
+General options:\n\
+ --error-limit=NUM quit after NUM errors (default %d).\n\
+ --force preserve output even if errors.\n\
+ --help display this help and exit.\n\
+ --no-validate suppress node cross-reference validation.\n\
+ --no-warn suppress warnings (but not errors).\n\
+ --reference-limit=NUM warn about at most NUM references (default %d).\n\
+ -v, --verbose explain what is being done.\n\
+ --version display version information and exit.\n"),
+ max_error_level, reference_warning_limit);
+ puts ("");
+
+ /* xgettext: no-wrap */
+ puts (_("\
+Output format selection (default is to produce Info):\n\
+ --docbook output Docbook XML rather than Info.\n\
+ --html output HTML rather than Info.\n\
+ --xml output Texinfo XML rather than Info.\n\
+ --plaintext output plain text rather than Info.\n\
+"));
+
+ puts (_("\
+General output options:\n\
+ -E, --macro-expand FILE output macro-expanded source to FILE.\n\
+ ignoring any @setfilename.\n\
+ --no-headers suppress node separators, Node: lines, and menus\n\
+ from Info output (thus producing plain text)\n\
+ or from HTML (thus producing shorter output);\n\
+ also, write to standard output by default.\n\
+ --no-split suppress splitting of Info or HTML output,\n\
+ generate only one output file.\n\
+ --number-sections output chapter and sectioning numbers.\n\
+ -o, --output=FILE output to FILE (directory if split HTML),\n\
+"));
+
+ printf (_("\
+Options for Info and plain text:\n\
+ --enable-encoding output accented and special characters in\n\
+ Info output based on @documentencoding.\n\
+ --fill-column=NUM break Info lines at NUM characters (default %d).\n\
+ --footnote-style=STYLE output footnotes in Info according to STYLE:\n\
+ `separate' to put them in their own node;\n\
+ `end' to put them at the end of the node\n\
+ in which they are defined (default).\n\
+ --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %d).\n\
+ If VAL is `none', do not indent; if VAL is\n\
+ `asis', preserve existing indentation.\n\
+ --split-size=NUM split Info files at size NUM (default %d).\n"),
+ fill_column, paragraph_start_indent,
+ DEFAULT_SPLIT_SIZE);
+ puts ("");
+
+ puts (_("\
+Options for HTML:\n\
+ --css-include=FILE include FILE in HTML <style> output;\n\
+ read stdin if FILE is -.\n\
+"));
+
+ printf (_("\
+Options for XML and Docbook:\n\
+ --output-indent=VAL indent XML elements by VAL spaces (default %d).\n\
+ If VAL is 0, ignorable whitespace is dropped.\n\
+"), xml_indentation_increment);
+ puts ("");
+
+ puts (_("\
+Input file options:\n\
+ --commands-in-node-names allow @ commands in node names.\n\
+ -D VAR define the variable VAR, as with @set.\n\
+ -I DIR append DIR to the @include search path.\n\
+ -P DIR prepend DIR to the @include search path.\n\
+ -U VAR undefine the variable VAR, as with @clear.\n\
+"));
+
+ puts (_("\
+Conditional processing in input:\n\
+ --ifdocbook process @ifdocbook and @docbook even if\n\
+ not generating Docbook.\n\
+ --ifhtml process @ifhtml and @html even if not generating HTML.\n\
+ --ifinfo process @ifinfo even if not generating Info.\n\
+ --ifplaintext process @ifplaintext even if not generating plain text.\n\
+ --iftex process @iftex and @tex; implies --no-split.\n\
+ --ifxml process @ifxml and @xml.\n\
+ --no-ifdocbook do not process @ifdocbook and @docbook text.\n\
+ --no-ifhtml do not process @ifhtml and @html text.\n\
+ --no-ifinfo do not process @ifinfo text.\n\
+ --no-ifplaintext do not process @ifplaintext text.\n\
+ --no-iftex do not process @iftex and @tex text.\n\
+ --no-ifxml do not process @ifxml and @xml text.\n\
+\n\
+ Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n\
+"));
+
+ puts (_("\
+ The defaults for the @if... conditionals depend on the output format:\n\
+ if generating HTML, --ifhtml is on and the others are off;\n\
+ if generating Info, --ifinfo is on and the others are off;\n\
+ if generating plain text, --ifplaintext is on and the others are off;\n\
+ if generating XML, --ifxml is on and the others are off.\n\
+"));
+
+ fputs (_("\
+Examples:\n\
+ makeinfo foo.texi write Info to foo's @setfilename\n\
+ makeinfo --html foo.texi write HTML to @setfilename\n\
+ makeinfo --xml foo.texi write Texinfo XML to @setfilename\n\
+ makeinfo --docbook foo.texi write DocBook XML to @setfilename\n\
+ makeinfo --no-headers foo.texi write plain text to standard output\n\
+\n\
+ makeinfo --html --no-headers foo.texi write html without node lines, menus\n\
+ makeinfo --number-sections foo.texi write Info with numbered sections\n\
+ makeinfo --no-split foo.texi write one Info file however big\n\
+"), stdout);
+
+ puts (_("\n\
+Email bug reports to bug-texinfo@gnu.org,\n\
+general questions and discussion to help-texinfo@gnu.org.\n\
+Texinfo home page: http://www.gnu.org/software/texinfo/"));
+
+ } /* end of full help */
+
+ xexit (exit_value);
+}
+
+struct option long_options[] =
+{
+ { "commands-in-node-names", 0, &expensive_validation, 1 },
+ { "css-include", 1, 0, 'C' },
+ { "docbook", 0, 0, 'd' },
+ { "enable-encoding", 0, &enable_encoding, 1 },
+ { "error-limit", 1, 0, 'e' },
+ { "fill-column", 1, 0, 'f' },
+ { "footnote-style", 1, 0, 's' },
+ { "force", 0, &force, 1 },
+ { "help", 0, 0, 'h' },
+ { "html", 0, 0, 'w' },
+ { "ifdocbook", 0, &process_docbook, 1 },
+ { "ifhtml", 0, &process_html, 1 },
+ { "ifinfo", 0, &process_info, 1 },
+ { "ifplaintext", 0, &process_plaintext, 1 },
+ { "iftex", 0, &process_tex, 1 },
+ { "ifxml", 0, &process_xml, 1 },
+ { "macro-expand", 1, 0, 'E' },
+ { "no-headers", 0, &no_headers, 1 },
+ { "no-ifdocbook", 0, &process_docbook, 0 },
+ { "no-ifhtml", 0, &process_html, 0 },
+ { "no-ifinfo", 0, &process_info, 0 },
+ { "no-ifplaintext", 0, &process_plaintext, 0 },
+ { "no-iftex", 0, &process_tex, 0 },
+ { "no-ifxml", 0, &process_xml, 0 },
+ { "no-number-footnotes", 0, &number_footnotes, 0 },
+ { "no-number-sections", 0, &number_sections, 0 },
+ { "no-pointer-validate", 0, &validating, 0 },
+ { "no-split", 0, &splitting, 0 },
+ { "no-validate", 0, &validating, 0 },
+ { "no-warn", 0, &print_warnings, 0 },
+ { "number-footnotes", 0, &number_footnotes, 1 },
+ { "number-sections", 0, &number_sections, 1 },
+ { "output", 1, 0, 'o' },
+ { "output-indent", 1, 0, 'i' },
+ { "paragraph-indent", 1, 0, 'p' },
+ { "plaintext", 0, 0, 't' },
+ { "reference-limit", 1, 0, 'r' },
+ { "split-size", 1, 0, 'S'},
+ { "verbose", 0, &verbose_mode, 1 },
+ { "version", 0, 0, 'V' },
+ { "xml", 0, 0, 'x' },
+ {NULL, 0, NULL, 0}
+};
+
+/* We use handle_variable_internal for -D and -U, and it depends on
+ execute_string, which depends on input_filename, which is not defined
+ while we are handling options. :-\ So we save these defines in this
+ struct, and handle them later. */
+typedef struct command_line_define
+{
+ struct command_line_define *next;
+ int action;
+ char *define;
+} COMMAND_LINE_DEFINE;
+
+static COMMAND_LINE_DEFINE *command_line_defines = NULL;
+
+/* For each file mentioned in the command line, process it, turning
+ Texinfo commands into wonderfully formatted output text. */
+int
+main (int argc, char **argv)
+{
+ int c, ind;
+ int reading_from_stdin = 0;
+
+#ifdef HAVE_SETLOCALE
+ /* Do not use LC_ALL, because LC_NUMERIC screws up the scanf parsing
+ of the argument to @multicolumn. */
+ setlocale (LC_TIME, "");
+#ifdef LC_MESSAGES /* ultrix */
+ setlocale (LC_MESSAGES, "");
+#endif
+ setlocale (LC_CTYPE, "");
+ setlocale (LC_COLLATE, "");
+#endif
+
+#ifdef ENABLE_NLS
+ /* Set the text message domain. */
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+#endif
+
+ /* If TEXINFO_OUTPUT_FORMAT envvar is set, use it to set default output.
+ Can be overridden with one of the output options. */
+ if (getenv ("TEXINFO_OUTPUT_FORMAT") != NULL)
+ {
+ if (STREQ (getenv ("TEXINFO_OUTPUT_FORMAT"), "docbook"))
+ {
+ splitting = 0;
+ html = 0;
+ docbook = 1;
+ xml = 1;
+ process_docbook = 1;
+ }
+ else if (STREQ (getenv ("TEXINFO_OUTPUT_FORMAT"), "html"))
+ {
+ html = 1;
+ docbook = 0;
+ xml = 0;
+ process_html = 1;
+ }
+ else if (STREQ (getenv ("TEXINFO_OUTPUT_FORMAT"), "info"))
+ {
+ html = 0;
+ docbook = 0;
+ xml = 0;
+ }
+ else if (STREQ (getenv ("TEXINFO_OUTPUT_FORMAT"), "plaintext"))
+ {
+ splitting = 0;
+ no_headers = 1;
+ html = 0;
+ docbook = 0;
+ xml = 0;
+ process_plaintext = 1;
+ }
+ else if (STREQ (getenv ("TEXINFO_OUTPUT_FORMAT"), "xml"))
+ {
+ splitting = 0;
+ html = 0;
+ docbook = 0;
+ xml = 1;
+ process_xml = 1;
+ }
+ else
+ fprintf (stderr,
+ _("%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"),
+ progname, getenv ("TEXINFO_OUTPUT_FORMAT"));
+ }
+
+ /* Parse argument flags from the input line. */
+ while ((c = getopt_long (argc, argv, "D:de:E:f:hI:i:o:p:P:r:s:t:U:vV:wx",
+ long_options, &ind)) != EOF)
+ {
+ if (c == 0 && long_options[ind].flag == 0)
+ c = long_options[ind].val;
+
+ switch (c)
+ {
+ case 'C': /* --css-include */
+ css_include = xstrdup (optarg);
+ break;
+
+ case 'D':
+ case 'U':
+ /* User specified variable to set or clear. */
+ if (xml && !docbook)
+ {
+ COMMAND_LINE_DEFINE *new = xmalloc (sizeof (COMMAND_LINE_DEFINE));
+ new->action = (c == 'D') ? SET : CLEAR;
+ new->define = xstrdup (optarg);
+ new->next = command_line_defines;
+ command_line_defines = new;
+ }
+ else
+ handle_variable_internal ((c == 'D' ? SET : CLEAR), optarg);
+ break;
+
+ case 'd': /* --docbook */
+ splitting = 0;
+ xml = 1;
+ docbook = 1;
+ html = 0;
+ process_docbook = 1;
+ break;
+
+ case 'e': /* --error-limit */
+ if (sscanf (optarg, "%d", &max_error_level) != 1)
+ {
+ fprintf (stderr,
+ _("%s: %s arg must be numeric, not `%s'.\n"),
+ progname, "--error-limit", optarg);
+ usage (1);
+ }
+ break;
+
+ case 'E': /* --macro-expand */
+ if (!macro_expansion_output_stream)
+ {
+ macro_expansion_filename = optarg;
+ macro_expansion_output_stream
+ = strcmp (optarg, "-") == 0 ? stdout : fopen (optarg, "w");
+ if (!macro_expansion_output_stream)
+ error (_("%s: could not open macro expansion output `%s'"),
+ progname, optarg);
+ }
+ else
+ fprintf (stderr,
+ _("%s: ignoring second macro expansion output `%s'.\n"),
+ progname, optarg);
+ break;
+
+ case 'f': /* --fill-column */
+ if (sscanf (optarg, "%d", &fill_column) != 1)
+ {
+ fprintf (stderr,
+ _("%s: %s arg must be numeric, not `%s'.\n"),
+ progname, "--fill-column", optarg);
+ usage (1);
+ }
+ break;
+
+ case 'h': /* --help */
+ usage (0);
+ break;
+
+ case 'I':
+ /* Append user-specified dir to include file path. */
+ append_to_include_path (optarg);
+ break;
+
+ case 'i':
+ if (sscanf (optarg, "%d", &xml_indentation_increment) != 1)
+ {
+ fprintf (stderr,
+ _("%s: %s arg must be numeric, not `%s'.\n"),
+ progname, "--output-indent", optarg);
+ usage (1);
+ }
+ break;
+
+ case 'o': /* --output */
+ command_output_filename = xstrdup (optarg);
+ save_command_output_filename = command_output_filename;
+ break;
+
+ case 'p': /* --paragraph-indent */
+ if (set_paragraph_indent (optarg) < 0)
+ {
+ fprintf (stderr,
+ _("%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"),
+ progname, optarg);
+ usage (1);
+ }
+ break;
+
+ case 'P':
+ /* Prepend user-specified include dir to include path. */
+ prepend_to_include_path (optarg);
+ break;
+
+ case 'r': /* --reference-limit */
+ if (sscanf (optarg, "%d", &reference_warning_limit) != 1)
+ {
+ fprintf (stderr,
+ _("%s: %s arg must be numeric, not `%s'.\n"),
+ progname, "--reference-limit", optarg);
+ usage (1);
+ }
+ break;
+
+ case 's': /* --footnote-style */
+ if (set_footnote_style (optarg) < 0)
+ {
+ fprintf (stderr,
+ _("%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"),
+ progname, optarg);
+ usage (1);
+ }
+ footnote_style_preset = 1;
+ break;
+
+ case 'S': /* --split-size */
+ if (sscanf (optarg, "%d", &split_size) != 1)
+ {
+ fprintf (stderr,
+ _("%s: %s arg must be numeric, not `%s'.\n"),
+ progname, "--split-size", optarg);
+ usage (1);
+ }
+ break;
+
+ case 't': /* --plaintext */
+ splitting = 0;
+ no_headers = 1;
+ html = 0;
+ docbook = 0;
+ xml = 0;
+ process_plaintext = 1;
+ break;
+
+ case 'v':
+ verbose_mode++;
+ break;
+
+ case 'V': /* --version */
+ print_version_info ();
+ puts ("");
+ puts ("Copyright (C) 2004 Free Software Foundation, Inc.");
+ printf (_("There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License.\n\
+For more information about these matters, see the files named COPYING.\n"));
+ xexit (0);
+ break;
+
+ case 'w': /* --html */
+ xml = 0;
+ docbook = 0;
+ html = 1;
+ process_html = 1;
+ break;
+
+ case 'x': /* --xml */
+ splitting = 0;
+ html = 0;
+ docbook = 0;
+ xml = 1;
+ process_xml = 1;
+ break;
+
+ case '?':
+ usage (1);
+ break;
+ }
+ }
+
+ if (macro_expansion_output_stream)
+ validating = 0;
+
+ if (!validating)
+ expensive_validation = 0;
+
+ if (optind == argc)
+ {
+ /* Check to see if input is a file. If so, process that. */
+ if (!isatty (fileno (stdin)))
+ reading_from_stdin = 1;
+ else
+ {
+ fprintf (stderr, _("%s: missing file argument.\n"), progname);
+ usage (1);
+ }
+ }
+
+ if (no_headers)
+ {
+ /* If the user did not specify an output file, use stdout. */
+ if (!command_output_filename)
+ command_output_filename = xstrdup ("-");
+
+ if (html && splitting && !STREQ (command_output_filename, "-"))
+ { /* --no-headers --no-split --html indicates confusion. */
+ fprintf (stderr,
+ "%s: can't split --html output to `%s' with --no-headers.\n",
+ progname, command_output_filename);
+ usage (1);
+ }
+
+ /* --no-headers implies --no-split. */
+ splitting = 0;
+ }
+
+ if (process_info == -1)
+ { /* no explicit --[no-]ifinfo option, so we'll do @ifinfo
+ if we're generating info or (for compatibility) plain text. */
+ process_info = !html && !xml;
+ }
+
+ if (process_plaintext == -1)
+ { /* no explicit --[no-]ifplaintext option, so we'll do @ifplaintext
+ if we're generating plain text. */
+ process_plaintext = no_headers && !html && !xml;
+ }
+
+ if (verbose_mode)
+ print_version_info ();
+
+ /* Remaining arguments are file names of texinfo files.
+ Convert them, one by one. */
+ if (!reading_from_stdin)
+ {
+ while (optind != argc)
+ convert_from_file (argv[optind++]);
+ }
+ else
+ convert_from_stream (stdin, "stdin");
+
+ xexit (errors_printed ? 2 : 0);
+ return 0; /* Avoid bogus warnings. */
+}
+
+/* Hacking tokens and strings. */
+
+/* Return the next token as a string pointer. We cons the string. This
+ `token' means simply a command name. */
+
+/* = is so @alias works. ^ and _ are so macros can be used in math mode
+ without a space following. Possibly we should simply allow alpha, to
+ be compatible with TeX. */
+#define COMMAND_CHAR(c) (!cr_or_whitespace(c) \
+ && (c) != '{' \
+ && (c) != '}' \
+ && (c) != '=' \
+ && (c) != '_' \
+ && (c) != '^' \
+ )
+
+static char *
+read_token (void)
+{
+ int i, character;
+ char *result;
+
+ /* If the first character to be read is self-delimiting, then that
+ is the command itself. */
+ character = curchar ();
+ if (self_delimiting (character))
+ {
+ input_text_offset++;
+
+ if (character == '\n')
+ line_number++;
+
+ result = xstrdup (" ");
+ *result = character;
+ return result;
+ }
+
+ for (i = 0; ((input_text_offset != input_text_length)
+ && (character = curchar ())
+ && COMMAND_CHAR (character));
+ i++, input_text_offset++);
+ result = xmalloc (i + 1);
+ memcpy (result, &input_text[input_text_offset - i], i);
+ result[i] = 0;
+ return result;
+}
+
+/* Return nonzero if CHARACTER is self-delimiting. */
+int
+self_delimiting (int character)
+{
+ /* @; and @\ are not Texinfo commands, but they are listed here
+ anyway. I don't know why. --karl, 10aug96. */
+ return strchr ("~{|}`^\\@?=;:./-,*\'\" !\n\t", character) != NULL;
+}
+
+/* Clear whitespace from the front and end of string. */
+void
+canon_white (char *string)
+{
+ char *p = string;
+ unsigned len;
+
+ if (!*p)
+ return;
+
+ do
+ {
+ if (!cr_or_whitespace (*p))
+ break;
+ ++p;
+ }
+ while (*p);
+
+ len = strlen (p);
+ while (len && cr_or_whitespace (p[len-1]))
+ --len;
+
+ if (p != string)
+ memmove (string, p, len);
+
+ string[len] = 0;
+}
+
+/* Bash STRING, replacing all whitespace with just one space. */
+void
+fix_whitespace (char *string)
+{
+ char *temp = xmalloc (strlen (string) + 1);
+ int string_index = 0;
+ int temp_index = 0;
+ int c;
+
+ canon_white (string);
+
+ while (string[string_index])
+ {
+ c = temp[temp_index++] = string[string_index++];
+
+ if (c == ' ' || c == '\n' || c == '\t')
+ {
+ temp[temp_index - 1] = ' ';
+ while ((c = string[string_index]) && (c == ' ' ||
+ c == '\t' ||
+ c == '\n'))
+ string_index++;
+ }
+ }
+ temp[temp_index] = 0;
+ strcpy (string, temp);
+ free (temp);
+}
+
+/* Discard text until the desired string is found. The string is
+ included in the discarded text. */
+void
+discard_until (char *string)
+{
+ int temp = search_forward (string, input_text_offset);
+
+ int tt = (temp < 0) ? input_text_length : temp + strlen (string);
+ int from = input_text_offset;
+
+ /* Find out what line we are on. */
+ while (from != tt)
+ if (input_text[from++] == '\n')
+ line_number++;
+
+ if (temp < 0)
+ {
+ /* not found, move current position to end of string */
+ input_text_offset = input_text_length;
+ if (strcmp (string, "\n") != 0)
+ { /* Give a more descriptive feedback, if we are looking for ``@end ''
+ during macro execution. That means someone used a multiline
+ command as an argument to, say, @section ... style commands. */
+ char *end_block = xmalloc (8);
+ sprintf (end_block, "\n%cend ", COMMAND_PREFIX);
+ if (executing_string && strstr (string, end_block))
+ line_error (_("Multiline command %c%s used improperly"),
+ COMMAND_PREFIX, command);
+ else
+ line_error (_("Expected `%s'"), string);
+ free (end_block);
+ return;
+ }
+ }
+ else
+ /* found, move current position to after the found string */
+ input_text_offset = temp + strlen (string);
+}
+
+/* Read characters from the file until we are at MATCH.
+ Place the characters read into STRING.
+ On exit input_text_offset is after the match string.
+ Return the offset where the string starts. */
+int
+get_until (char *match, char **string)
+{
+ int len, current_point, x, new_point, tem;
+
+ current_point = x = input_text_offset;
+ new_point = search_forward (match, input_text_offset);
+
+ if (new_point < 0)
+ new_point = input_text_length;
+ len = new_point - current_point;
+
+ /* Keep track of which line number we are at. */
+ tem = new_point + (strlen (match) - 1);
+ while (x != tem)
+ if (input_text[x++] == '\n')
+ line_number++;
+
+ *string = xmalloc (len + 1);
+
+ memcpy (*string, &input_text[current_point], len);
+ (*string)[len] = 0;
+
+ /* Now leave input_text_offset in a consistent state. */
+ input_text_offset = tem;
+
+ if (input_text_offset > input_text_length)
+ input_text_offset = input_text_length;
+
+ return new_point;
+}
+
+/* Replace input_text[FROM .. TO] with its expansion. */
+void
+replace_with_expansion (int from, int *to)
+{
+ char *xp;
+ unsigned xp_len, new_len;
+ char *old_input = input_text;
+ unsigned raw_len = *to - from;
+ char *str;
+
+ /* The rest of the code here moves large buffers, so let's
+ not waste time if the input cannot possibly expand
+ into anything. Unfortunately, we cannot avoid expansion
+ when we see things like @code etc., even if they only
+ asked for expansion of macros, since any Texinfo command
+ can be potentially redefined with a macro. */
+ if (only_macro_expansion &&
+ memchr (input_text + from, COMMAND_PREFIX, raw_len) == 0)
+ return;
+
+ /* Get original string from input. */
+ str = xmalloc (raw_len + 1);
+ memcpy (str, input_text + from, raw_len);
+ str[raw_len] = 0;
+
+ /* We are going to relocate input_text, so we had better output
+ pending portion of input_text now, before the pointer changes. */
+ if (macro_expansion_output_stream && !executing_string
+ && !me_inhibit_expansion)
+ append_to_expansion_output (from);
+
+ /* Expand it. */
+ xp = expansion (str, 0);
+ xp_len = strlen (xp);
+ free (str);
+
+ /* Plunk the expansion into the middle of `input_text' --
+ which is terminated by a newline, not a null. Avoid
+ expensive move of the rest of the input if the expansion
+ has the same length as the original string. */
+ if (xp_len != raw_len)
+ {
+ new_len = from + xp_len + input_text_length - *to + 1;
+ if (executing_string)
+ { /* If we are in execute_string, we might need to update
+ the relevant element in the execution_strings[] array,
+ since it could have to be relocated from under our
+ feet. (input_text is reallocated here as well, if needed.) */
+ maybe_update_execution_strings (&input_text, new_len);
+ }
+ else if (new_len > input_text_length + 1)
+ /* Don't bother to realloc if we have enough space. */
+ input_text = xrealloc (input_text, new_len);
+
+ memmove (input_text + from + xp_len,
+ input_text + *to, input_text_length - *to + 1);
+
+ *to += xp_len - raw_len;
+ /* Since we change input_text_length here, the comparison above
+ isn't really valid, but it seems the worst that might happen is
+ an extra xrealloc or two, so let's not worry. */
+ input_text_length += xp_len - raw_len;
+ }
+ memcpy (input_text + from, xp, xp_len);
+ free (xp);
+
+ /* Synchronize the macro-expansion pointers with our new input_text. */
+ if (input_text != old_input)
+ forget_itext (old_input);
+ if (macro_expansion_output_stream && !executing_string)
+ remember_itext (input_text, from);
+}
+
+/* Read characters from the file until we are at MATCH or end of line.
+ Place the characters read into STRING. If EXPAND is nonzero,
+ expand the text before looking for MATCH for those cases where
+ MATCH might be produced by some macro. */
+void
+get_until_in_line (int expand, char *match, char **string)
+{
+ int real_bottom = input_text_length;
+ int limit = search_forward ("\n", input_text_offset);
+ if (limit < 0)
+ limit = input_text_length;
+
+ /* Replace input_text[input_text_offset .. limit-1] with its expansion.
+ This allows the node names and menu entries themselves to be
+ constructed via a macro, as in:
+ @macro foo{p, q}
+ Together: \p\ & \q\.
+ @end macro
+
+ @node @foo{A,B}, next, prev, top
+
+ Otherwise, the `,' separating the macro args A and B is taken as
+ the node argument separator, so the node name is `@foo{A'. This
+ expansion is only necessary on the first call, since we expand the
+ whole line then. */
+ if (expand)
+ {
+ replace_with_expansion (input_text_offset, &limit);
+ }
+
+ real_bottom = input_text_length;
+ input_text_length = limit;
+ get_until (match, string);
+ input_text_length = real_bottom;
+}
+
+void
+get_rest_of_line (int expand, char **string)
+{
+ xml_no_para ++;
+ if (expand)
+ {
+ char *tem;
+
+ /* Don't expand non-macros in input, since we want them
+ intact in the macro-expanded output. */
+ only_macro_expansion++;
+ get_until_in_line (1, "\n", &tem);
+ only_macro_expansion--;
+ *string = expansion (tem, 0);
+ free (tem);
+ }
+ else
+ get_until_in_line (0, "\n", string);
+
+ canon_white (*string);
+
+ if (curchar () == '\n') /* as opposed to the end of the file... */
+ {
+ line_number++;
+ input_text_offset++;
+ }
+ xml_no_para --;
+}
+
+/* Backup the input pointer to the previous character, keeping track
+ of the current line number. */
+void
+backup_input_pointer (void)
+{
+ if (input_text_offset)
+ {
+ input_text_offset--;
+ if (curchar () == '\n')
+ line_number--;
+ }
+}
+
+/* Read characters from the file until we are at MATCH or closing brace.
+ Place the characters read into STRING. */
+void
+get_until_in_braces (char *match, char **string)
+{
+ char *temp;
+ int i, brace = 0;
+ int match_len = strlen (match);
+
+ for (i = input_text_offset; i < input_text_length; i++)
+ {
+ if (i < input_text_length - 1 && input_text[i] == '@')
+ {
+ i++; /* skip commands like @, and @{ */
+ continue;
+ }
+ else if (input_text[i] == '{')
+ brace++;
+ else if (input_text[i] == '}')
+ {
+ brace--;
+ /* If looking for a brace, don't stop at the interior brace,
+ like after "baz" in "@foo{something @bar{baz} more}". */
+ if (brace == 0)
+ continue;
+ }
+ else if (input_text[i] == '\n')
+ line_number++;
+
+ if (brace < 0 ||
+ (brace == 0 && strncmp (input_text + i, match, match_len) == 0))
+ break;
+ }
+
+ match_len = i - input_text_offset;
+ temp = xmalloc (2 + match_len);
+ memcpy (temp, input_text + input_text_offset, match_len);
+ temp[match_len] = 0;
+ input_text_offset = i;
+ *string = temp;
+}
+
+
+
+/* Converting a file. */
+
+/* Convert the file named by NAME. The output is saved on the file
+ named as the argument to the @setfilename command. */
+static char *suffixes[] = {
+ /* ".txi" is checked first so that on 8+3 DOS filesystems, if they
+ have "texinfo.txi" and "texinfo.tex" in the same directory, the
+ former is used rather than the latter, due to file name truncation. */
+ ".txi",
+ ".texinfo",
+ ".texi",
+ ".txinfo",
+ "",
+ NULL
+};
+
+static void
+initialize_conversion (void)
+{
+ init_tag_table ();
+ init_indices ();
+ init_internals ();
+ init_paragraph ();
+
+ /* This is used for splitting the output file and for doing section
+ headings. It was previously initialized in `init_paragraph', but its
+ use there loses with the `init_paragraph' calls done by the
+ multitable code; the tag indices get reset to zero. */
+ output_position = 0;
+}
+
+/* Reverse the chain of structures in LIST. Output the new head
+ of the chain. You should always assign the output value of this
+ function to something, or you will lose the chain. */
+GENERIC_LIST *
+reverse_list (GENERIC_LIST *list)
+{
+ GENERIC_LIST *next;
+ GENERIC_LIST *prev = NULL;
+
+ while (list)
+ {
+ next = list->next;
+ list->next = prev;
+ prev = list;
+ list = next;
+ }
+ return prev;
+}
+
+/* We read in multiples of 4k, simply because it is a typical pipe size
+ on unix systems. */
+#define READ_BUFFER_GROWTH (4 * 4096)
+
+/* Convert the Texinfo file coming from the open stream STREAM. Assume the
+ source of the stream is named NAME. */
+static void
+convert_from_stream (FILE *stream, char *name)
+{
+ char *buffer = NULL;
+ int buffer_offset = 0, buffer_size = 0;
+
+ initialize_conversion ();
+
+ /* Read until the end of the stream. This isn't strictly correct, since
+ the texinfo input may end before the stream ends, but it is a quick
+ working hueristic. */
+ while (!feof (stream))
+ {
+ int count;
+
+ if (buffer_offset + (READ_BUFFER_GROWTH + 1) >= buffer_size)
+ buffer = (char *)
+ xrealloc (buffer, (buffer_size += READ_BUFFER_GROWTH));
+
+ count = fread (buffer + buffer_offset, 1, READ_BUFFER_GROWTH, stream);
+
+ if (count < 0)
+ {
+ perror (name);
+ xexit (1);
+ }
+
+ buffer_offset += count;
+ if (count == 0)
+ break;
+ }
+
+ /* Set the globals to the new file. */
+ input_text = buffer;
+ input_text_length = buffer_offset;
+ input_filename = xstrdup (name);
+ node_filename = xstrdup (name);
+ input_text_offset = 0;
+ line_number = 1;
+
+ /* Not strictly necessary. This magic prevents read_token () from doing
+ extra unnecessary work each time it is called (that is a lot of times).
+ The INPUT_TEXT_LENGTH is one past the actual end of the text. */
+ input_text[input_text_length] = '\n';
+
+ convert_from_loaded_file (name);
+}
+
+static void
+convert_from_file (char *name)
+{
+ int i;
+ char *filename = xmalloc (strlen (name) + 50);
+
+ /* Prepend file directory to the search path, so relative links work. */
+ prepend_to_include_path (pathname_part (name));
+
+ initialize_conversion ();
+
+ /* Try to load the file specified by NAME, concatenated with our
+ various suffixes. Prefer files like `makeinfo.texi' to
+ `makeinfo'. */
+ for (i = 0; suffixes[i]; i++)
+ {
+ strcpy (filename, name);
+ strcat (filename, suffixes[i]);
+
+ if (find_and_load (filename, 1))
+ break;
+
+ if (!suffixes[i][0] && strrchr (filename, '.'))
+ {
+ fs_error (filename);
+ free (filename);
+ return;
+ }
+ }
+
+ if (!suffixes[i])
+ {
+ fs_error (name);
+ free (filename);
+ return;
+ }
+
+ input_filename = filename;
+
+ convert_from_loaded_file (name);
+
+ /* Pop the prepended path, so multiple filenames in the
+ command line do not screw each others include paths. */
+ pop_path_from_include_path ();
+}
+
+static int
+create_html_directory (char *dir, int can_remove_file)
+{
+ struct stat st;
+
+ /* Already exists. */
+ if (stat (dir, &st) == 0)
+ {
+ /* And it's a directory, so silently reuse it. */
+ if (S_ISDIR (st.st_mode))
+ return 1;
+ /* Not a directory, so move it out of the way if we are allowed. */
+ else if (can_remove_file)
+ {
+ if (unlink (dir) != 0)
+ return 0;
+ }
+ else
+ return 0;
+ }
+
+ if (mkdir (dir, 0777) == 0)
+ /* Success! */
+ return 1;
+ else
+ return 0;
+}
+
+/* Given OUTPUT_FILENAME == ``/foo/bar/baz.html'', return
+ "/foo/bar/baz/baz.html". This routine is called only if html && splitting.
+
+ Split html output goes into the subdirectory of the toplevel
+ filename, without extension. For example:
+ @setfilename foo.info
+ produces output in files foo/index.html, foo/second-node.html, ...
+
+ But if the user said -o foo.whatever on the cmd line, then use
+ foo.whatever unchanged. */
+
+static char *
+insert_toplevel_subdirectory (char *output_filename)
+{
+ static const char index_name[] = "index.html";
+ char *dir, *subdir, *base, *basename, *p;
+ char buf[PATH_MAX];
+ const int index_len = sizeof (index_name) - 1;
+
+ strcpy (buf, output_filename);
+ dir = pathname_part (buf); /* directory of output_filename */
+ base = filename_part (buf); /* strips suffix, too */
+ basename = xstrdup (base); /* remember real @setfilename name */
+ p = dir + strlen (dir) - 1;
+ if (p > dir && IS_SLASH (*p))
+ *p = 0;
+ p = strrchr (base, '.');
+ if (p)
+ *p = 0;
+
+ /* Split html output goes into subdirectory of toplevel name. */
+ if (save_command_output_filename
+ && STREQ (output_filename, save_command_output_filename))
+ subdir = basename; /* from user, use unchanged */
+ else
+ subdir = base; /* implicit, omit suffix */
+
+ free (output_filename);
+ output_filename = xmalloc (strlen (dir) + 1
+ + strlen (basename) + 1
+ + index_len
+ + 1);
+ strcpy (output_filename, dir);
+ if (strlen (dir))
+ strcat (output_filename, "/");
+ strcat (output_filename, subdir);
+
+ /* First try, do not remove existing file. */
+ if (!create_html_directory (output_filename, 0))
+ {
+ /* That failed, try subdir name with .html.
+ Remove it if it exists. */
+ strcpy (output_filename, dir);
+ if (strlen (dir))
+ strcat (output_filename, "/");
+ strcat (output_filename, basename);
+
+ if (!create_html_directory (output_filename, 1))
+ {
+ /* Last try failed too :-\ */
+ line_error (_("Can't create directory `%s': %s"),
+ output_filename, strerror (errno));
+ xexit (1);
+ }
+ }
+
+ strcat (output_filename, "/");
+ strcat (output_filename, index_name);
+ return output_filename;
+}
+
+/* FIXME: this is way too hairy */
+static void
+convert_from_loaded_file (char *name)
+{
+ char *real_output_filename = NULL;
+
+ remember_itext (input_text, 0);
+
+ input_text_offset = 0;
+
+ /* Avoid the `\input texinfo' line in HTML output (assuming it starts
+ the file). */
+ if (looking_at ("\\input"))
+ discard_until ("\n");
+
+ /* Search this file looking for the special string which starts conversion.
+ Once found, we may truly begin. */
+ while (input_text_offset >= 0)
+ {
+ input_text_offset =
+ search_forward (setfilename_search, input_text_offset);
+
+ if (input_text_offset == 0
+ || (input_text_offset > 0
+ && input_text[input_text_offset -1] == '\n'))
+ break;
+ else if (input_text_offset > 0)
+ input_text_offset++;
+ }
+
+ if (input_text_offset < 0)
+ {
+ if (!command_output_filename)
+ {
+#if defined (REQUIRE_SETFILENAME)
+ error (_("No `%s' found in `%s'"), setfilename_search, name);
+ goto finished;
+#else
+ command_output_filename = output_name_from_input_name (name);
+#endif /* !REQUIRE_SETFILENAME */
+ }
+
+ {
+ int i, end_of_first_line;
+
+ /* Find the end of the first line in the file. */
+ for (i = 0; i < input_text_length - 1; i++)
+ if (input_text[i] == '\n')
+ break;
+
+ end_of_first_line = i + 1;
+
+ for (i = 0; i < end_of_first_line; i++)
+ {
+ if ((input_text[i] == '\\') &&
+ (strncmp (input_text + i + 1, "input", 5) == 0))
+ {
+ input_text_offset = i;
+ break;
+ }
+ }
+ }
+ }
+ else
+ input_text_offset += strlen (setfilename_search);
+
+ if (!command_output_filename)
+ {
+ get_until ("\n", &output_filename); /* read rest of line */
+ if (html || xml)
+ { /* Change any extension to .html or .xml. */
+ char *html_name, *directory_part, *basename_part, *temp;
+
+ canon_white (output_filename);
+ directory_part = pathname_part (output_filename);
+
+ basename_part = filename_part (output_filename);
+
+ /* Zap any existing extension. */
+ temp = strrchr (basename_part, '.');
+ if (temp)
+ *temp = 0;
+
+ /* Construct new filename. */
+ html_name = xmalloc (strlen (directory_part)
+ + strlen (basename_part) + 6);
+ strcpy (html_name, directory_part);
+ strcat (html_name, basename_part);
+ strcat (html_name, html ? ".html" : ".xml");
+
+ /* Replace name from @setfilename with the html name. */
+ free (output_filename);
+ output_filename = html_name;
+ }
+ }
+ else
+ {
+ if (input_text_offset != -1)
+ discard_until ("\n");
+ else
+ input_text_offset = 0;
+
+ real_output_filename = output_filename = command_output_filename;
+ command_output_filename = NULL; /* for included files or whatever */
+ }
+
+ canon_white (output_filename);
+ toplevel_output_filename = xstrdup (output_filename);
+
+ if (real_output_filename && strcmp (real_output_filename, "-") == 0)
+ {
+ if (macro_expansion_filename
+ && strcmp (macro_expansion_filename, "-") == 0)
+ {
+ fprintf (stderr,
+ _("%s: Skipping macro expansion to stdout as Info output is going there.\n"),
+ progname);
+ macro_expansion_output_stream = NULL;
+ }
+ real_output_filename = xstrdup (real_output_filename);
+ output_stream = stdout;
+ splitting = 0; /* Cannot split when writing to stdout. */
+ }
+ else
+ {
+ if (html && splitting)
+ {
+ if (FILENAME_CMP (output_filename, NULL_DEVICE) == 0
+ || FILENAME_CMP (output_filename, ALSO_NULL_DEVICE) == 0)
+ splitting = 0;
+ else
+ output_filename = insert_toplevel_subdirectory (output_filename);
+ real_output_filename = xstrdup (output_filename);
+ }
+ else if (!real_output_filename)
+ real_output_filename = expand_filename (output_filename, name);
+ else
+ real_output_filename = xstrdup (real_output_filename);
+
+ output_stream = fopen (real_output_filename, "w");
+ }
+
+ set_current_output_filename (real_output_filename);
+
+ if (xml && !docbook)
+ xml_begin_document (filename_part (output_filename));
+
+ if (verbose_mode)
+ printf (_("Making %s file `%s' from `%s'.\n"),
+ no_headers ? "text"
+ : html ? "HTML"
+ : xml ? "XML"
+ : "info",
+ output_filename, input_filename);
+
+ if (output_stream == NULL)
+ {
+ fs_error (real_output_filename);
+ goto finished;
+ }
+
+ /* Make the displayable filename from output_filename. Only the base
+ portion of the filename need be displayed. */
+ flush_output (); /* in case there was no @bye */
+ if (output_stream != stdout)
+ pretty_output_filename = filename_part (output_filename);
+ else
+ pretty_output_filename = xstrdup ("stdout");
+
+ /* For this file only, count the number of newlines from the top of
+ the file to here. This way, we keep track of line numbers for
+ error reporting. Line_number starts at 1, since the user isn't
+ zero-based. */
+ {
+ int temp = 0;
+ line_number = 1;
+ while (temp != input_text_offset)
+ if (input_text[temp++] == '\n')
+ line_number++;
+ }
+
+ /* html fixxme: should output this as trailer on first page. */
+ if (!no_headers && !html && !xml)
+ add_word_args (_("This is %s, produced by makeinfo version %s from %s.\n"),
+ output_filename, VERSION, input_filename);
+
+ close_paragraph ();
+
+ if (xml && !docbook)
+ {
+ /* Just before the real main loop, let's handle the defines. */
+ COMMAND_LINE_DEFINE *temp;
+
+ for (temp = command_line_defines; temp; temp = temp->next)
+ {
+ handle_variable_internal (temp->action, temp->define);
+ free(temp->define);
+ }
+ }
+
+ reader_loop ();
+ if (xml)
+ xml_end_document ();
+
+
+finished:
+ discard_insertions (0);
+ close_paragraph ();
+ flush_file_stack ();
+
+ if (macro_expansion_output_stream)
+ {
+ fclose (macro_expansion_output_stream);
+ if (errors_printed && !force
+ && strcmp (macro_expansion_filename, "-") != 0
+ && FILENAME_CMP (macro_expansion_filename, NULL_DEVICE) != 0
+ && FILENAME_CMP (macro_expansion_filename, ALSO_NULL_DEVICE) != 0)
+ {
+ fprintf (stderr,
+_("%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"),
+ progname, macro_expansion_filename);
+ if (unlink (macro_expansion_filename) < 0)
+ perror (macro_expansion_filename);
+ }
+ }
+
+ if (output_stream)
+ {
+ output_pending_notes ();
+
+ if (html)
+ {
+ no_indent = 1;
+ start_paragraph ();
+ add_word ("</body></html>\n");
+ close_paragraph ();
+ }
+
+ /* maybe we want local variables in info output. */
+ {
+ char *trailer = info_trailer ();
+ if (!xml && !docbook && trailer)
+ {
+ if (html)
+ insert_string ("<!--");
+ insert_string (trailer);
+ free (trailer);
+ if (html)
+ insert_string ("\n-->\n");
+ }
+ }
+
+ /* Write stuff makeinfo generates after @bye, ie. info_trailer. */
+ flush_output ();
+
+ if (output_stream != stdout)
+ fclose (output_stream);
+
+ /* If validating, then validate the entire file right now. */
+ if (validating)
+ validate_file (tag_table);
+
+ handle_delayed_writes ();
+
+ if (tag_table)
+ {
+ tag_table = (TAG_ENTRY *) reverse_list ((GENERIC_LIST *) tag_table);
+ if (!no_headers && !html && !STREQ (current_output_filename, "-"))
+ write_tag_table (real_output_filename);
+ }
+
+ if (splitting && !html && (!errors_printed || force))
+ {
+ clean_old_split_files (real_output_filename);
+ split_file (real_output_filename, split_size);
+ }
+ else if (errors_printed
+ && !force
+ && strcmp (real_output_filename, "-") != 0
+ && FILENAME_CMP (real_output_filename, NULL_DEVICE) != 0
+ && FILENAME_CMP (real_output_filename, ALSO_NULL_DEVICE) != 0)
+ { /* If there were errors, and no --force, remove the output. */
+ fprintf (stderr,
+ _("%s: Removing output file `%s' due to errors; use --force to preserve.\n"),
+ progname, real_output_filename);
+ if (unlink (real_output_filename) < 0)
+ perror (real_output_filename);
+ }
+ }
+ free (real_output_filename);
+}
+
+/* If enable_encoding is set and @documentencoding is used, return a
+ Local Variables section (as a malloc-ed string) so that Emacs'
+ locale features can work. Else return NULL. */
+char *
+info_trailer (void)
+{
+ char *encoding;
+
+ if (!enable_encoding)
+ return NULL;
+
+ encoding = current_document_encoding ();
+
+ if (encoding && *encoding)
+ {
+#define LV_FMT "\n\037\nLocal Variables:\ncoding: %s\nEnd:\n"
+ char *lv = xmalloc (sizeof (LV_FMT) + strlen (encoding));
+ sprintf (lv, LV_FMT, encoding);
+ free (encoding);
+ return lv;
+ }
+
+ free (encoding);
+ return NULL;
+}
+
+void
+free_and_clear (char **pointer)
+{
+ if (*pointer)
+ {
+ free (*pointer);
+ *pointer = NULL;
+ }
+}
+
+ /* Initialize some state. */
+static void
+init_internals (void)
+{
+ free_and_clear (&output_filename);
+ free_and_clear (&command);
+ free_and_clear (&input_filename);
+ free_node_references ();
+ free_node_node_references ();
+ toc_free ();
+ init_insertion_stack ();
+ init_brace_stack ();
+ current_node = NULL; /* sometimes already freed */
+ command_index = 0;
+ in_menu = 0;
+ in_detailmenu = 0;
+ top_node_seen = 0;
+ non_top_node_seen = 0;
+ node_number = -1;
+}
+
+void
+init_paragraph (void)
+{
+ free (output_paragraph);
+ output_paragraph = xmalloc (paragraph_buffer_len);
+ output_paragraph[0] = 0;
+ output_paragraph_offset = 0;
+ output_column = 0;
+ paragraph_is_open = 0;
+ current_indent = 0;
+ meta_char_pos = 0;
+}
+
+/* This is called from `reader_loop' when we are at the * beginning a
+ menu line. */
+
+static void
+handle_menu_entry (void)
+{
+ char *tem;
+
+ /* Ugh, glean_node_from_menu wants to read the * itself. */
+ input_text_offset--;
+
+ /* Find node name in menu entry and save it in references list for
+ later validation. Use followed_reference type for detailmenu
+ references since we don't want to use them for default node pointers. */
+ tem = glean_node_from_menu (1, in_detailmenu
+ ? followed_reference : menu_reference);
+
+ if (html && tem)
+ { /* Start a menu item with the cleaned-up line. Put an anchor
+ around the start text (before `:' or the node name). */
+ char *string;
+
+ discard_until ("* ");
+
+ /* The line number was already incremented in reader_loop when we
+ saw the newline, and discard_until has now incremented again. */
+ line_number--;
+
+ if (had_menu_commentary)
+ {
+ add_html_block_elt ("<ul class=\"menu\">\n");
+ had_menu_commentary = 0;
+ in_paragraph = 0;
+ }
+
+ if (in_paragraph)
+ {
+ add_html_block_elt ("</p>\n");
+ add_html_block_elt ("<ul class=\"menu\">\n");
+ in_paragraph = 0;
+ }
+
+ in_menu_item = 1;
+
+ add_html_block_elt ("<li><a");
+ if (next_menu_item_number <= 9)
+ {
+ add_word(" accesskey=");
+ add_word_args("\"%d\"", next_menu_item_number);
+ next_menu_item_number++;
+ }
+ add_word (" href=\"");
+ string = expansion (tem, 0);
+ add_anchor_name (string, 1);
+ add_word ("\">");
+ free (string);
+
+ /* The menu item may use macros, so expand them now. */
+ only_macro_expansion++;
+ get_until_in_line (1, ":", &string);
+ only_macro_expansion--;
+ execute_string ("%s", string); /* get escaping done */
+ free (string);
+
+ add_word ("</a>");
+
+ if (looking_at ("::"))
+ discard_until (":");
+ else
+ { /* discard the node name */
+ get_until_in_line (0, ".", &string);
+ free (string);
+ }
+ input_text_offset++; /* discard the second colon or the period */
+
+ /* Insert a colon only if there is a description of this menu item. */
+ {
+ int save_input_text_offset = input_text_offset;
+ int save_line_number = line_number;
+ char *test_string;
+ get_rest_of_line (0, &test_string);
+ if (strlen (test_string) > 0)
+ add_word (": ");
+ input_text_offset = save_input_text_offset;
+ line_number = save_line_number;
+ }
+ }
+ else if (xml && tem)
+ {
+ xml_start_menu_entry (tem);
+ }
+ else if (tem)
+ { /* For Info output, we can just use the input and the main case in
+ reader_loop where we output what comes in. Just move off the *
+ so the next time through reader_loop we don't end up back here. */
+ add_char ('*');
+ input_text_offset += 2; /* undo the pointer back-up above. */
+ }
+
+ if (tem)
+ free (tem);
+}
+
+/* Find the command corresponding to STRING. If the command is found,
+ return a pointer to the data structure. Otherwise return -1. */
+static COMMAND *
+get_command_entry (char *string)
+{
+ int i;
+
+ for (i = 0; command_table[i].name; i++)
+ if (strcmp (command_table[i].name, string) == 0)
+ return &command_table[i];
+
+ /* This command is not in our predefined command table. Perhaps
+ it is a user defined command. */
+ for (i = 0; i < user_command_array_len; i++)
+ if (user_command_array[i] &&
+ (strcmp (user_command_array[i]->name, string) == 0))
+ return user_command_array[i];
+
+ /* We never heard of this command. */
+ return (COMMAND *) -1;
+}
+
+/* input_text_offset is right at the command prefix character.
+ Read the next token to determine what to do. Return zero
+ if there's no known command or macro after the prefix character. */
+static int
+read_command (void)
+{
+ COMMAND *entry;
+ int old_text_offset = input_text_offset++;
+
+ free_and_clear (&command);
+ command = read_token ();
+
+ /* Check to see if this command is a macro. If so, execute it here. */
+ {
+ MACRO_DEF *def;
+
+ def = find_macro (command);
+
+ if (def)
+ {
+ /* We disallow recursive use of a macro call. Inhibit the expansion
+ of this macro during the life of its execution. */
+ if (!(def->flags & ME_RECURSE))
+ def->inhibited = 1;
+
+ executing_macro++;
+ execute_macro (def);
+ executing_macro--;
+
+ if (!(def->flags & ME_RECURSE))
+ def->inhibited = 0;
+
+ return 1;
+ }
+ }
+
+ if (only_macro_expansion)
+ {
+ /* Back up to the place where we were called, so the
+ caller will have a chance to process this non-macro. */
+ input_text_offset = old_text_offset;
+ return 0;
+ }
+
+ /* Perform alias expansion */
+ command = alias_expand (command);
+
+ if (enclosure_command (command))
+ {
+ remember_brace (enclosure_expand);
+ enclosure_expand (START, output_paragraph_offset, 0);
+ return 0;
+ }
+
+ entry = get_command_entry (command);
+ if (entry == (COMMAND *)-1)
+ {
+ line_error (_("Unknown command `%s'"), command);
+ return 0;
+ }
+
+ if (entry->argument_in_braces == BRACE_ARGS)
+ remember_brace (entry->proc);
+ else if (entry->argument_in_braces == MAYBE_BRACE_ARGS)
+ {
+ if (curchar () == '{')
+ remember_brace (entry->proc);
+ else
+ { /* No braces, so arg is next char. */
+ int ch;
+ int saved_offset = output_paragraph_offset;
+ (*(entry->proc)) (START, output_paragraph_offset, 0);
+
+ /* Possibilities left for the next character: @ (error), }
+ (error), whitespace (skip) anything else (normal char). */
+ skip_whitespace ();
+ ch = curchar ();
+ if (ch == '@')
+ {
+ line_error (_("Use braces to give a command as an argument to @%s"),
+ entry->name);
+ return 0;
+ }
+ else if (ch == '}')
+ {
+ /* Our caller will give the error message, because this }
+ won't match anything. */
+ return 0;
+ }
+
+ add_char (ch);
+ input_text_offset++;
+ (*(entry->proc)) (END, saved_offset, output_paragraph_offset);
+ return 1;
+ }
+ }
+
+ /* Get here if we have BRACE_ARGS, NO_BRACE_ARGS, or MAYBE_BRACE_ARGS
+ with braces. */
+ (*(entry->proc)) (START, output_paragraph_offset, 0);
+ return 1;
+}
+
+/* Okay, we are ready to start the conversion. Call the reader on
+ some text, and fill the text as it is output. Handle commands by
+ remembering things like open braces and the current file position on a
+ stack, and when the corresponding close brace is found, you can call
+ the function with the proper arguments. Although the filling isn't
+ necessary for HTML, it should do no harm. */
+void
+reader_loop (void)
+{
+ int character;
+ int done = 0;
+
+ while (!done)
+ {
+ if (input_text_offset >= input_text_length)
+ break;
+
+ character = curchar ();
+
+ /* If only_macro_expansion, only handle macros and leave
+ everything else intact. */
+ if (!only_macro_expansion && !in_fixed_width_font
+ && ((!html && !xml) || escape_html)
+ && (character == '\'' || character == '`')
+ && input_text[input_text_offset + 1] == character)
+ {
+ if (html)
+ {
+ input_text_offset += 2;
+ add_word (character == '`' ? "&ldquo;" : "&rdquo;");
+ continue;
+ }
+ else if (xml)
+ {
+ input_text_offset += 2;
+ xml_insert_entity (character == '`' ? "ldquo" : "rdquo");
+ continue;
+ }
+ else
+ {
+ input_text_offset++;
+ character = '"';
+ }
+ }
+
+ /* Convert --- to --. */
+ if (!only_macro_expansion && character == '-' && !in_fixed_width_font
+ && ((!html && !xml) || escape_html))
+ {
+ int dash_count = 0;
+
+ /* Get the number of consequtive dashes. */
+ while (input_text[input_text_offset] == '-')
+ {
+ dash_count++;
+ input_text_offset++;
+ }
+
+ /* Eat one dash. */
+ dash_count--;
+
+ if (html || xml)
+ {
+ if (dash_count == 0)
+ add_char ('-');
+ else
+ while (dash_count > 0)
+ {
+ if (dash_count >= 2)
+ {
+ if (html)
+ add_word ("&mdash;");
+ else
+ xml_insert_entity ("mdash");
+ dash_count -= 2;
+ }
+ else if (dash_count >= 1)
+ {
+ if (html)
+ add_word ("&ndash;");
+ else
+ xml_insert_entity ("ndash");
+ dash_count--;
+ }
+ }
+ }
+ else
+ {
+ add_char ('-');
+ while (--dash_count > 0)
+ add_char ('-');
+ }
+
+ continue;
+ }
+
+ /* If this is a whitespace character, then check to see if the line
+ is blank. If so, advance to the carriage return. */
+ if (!only_macro_expansion && whitespace (character))
+ {
+ int i = input_text_offset + 1;
+
+ while (i < input_text_length && whitespace (input_text[i]))
+ i++;
+
+ if (i == input_text_length || input_text[i] == '\n')
+ {
+ if (i == input_text_length)
+ i--;
+
+ input_text_offset = i;
+ character = curchar ();
+ }
+ }
+
+ if (character == '\n')
+ line_number++;
+
+ switch (character)
+ {
+ case '*': /* perhaps we are at a menu */
+ /* We used to check for this in the \n case but an @c in a
+ menu swallows its newline, so check here instead. */
+ if (!only_macro_expansion && in_menu
+ && input_text_offset + 1 < input_text_length
+ && input_text[input_text_offset-1] == '\n')
+ handle_menu_entry ();
+ else
+ { /* Duplicate code from below, but not worth twisting the
+ fallthroughs to get down there. */
+ add_char (character);
+ input_text_offset++;
+ }
+ break;
+
+ /* Escapes for HTML unless we're outputting raw HTML. Do
+ this always, even if SGML rules don't require it since
+ that's easier and safer for non-conforming browsers. */
+ case '&':
+ if (html && escape_html)
+ add_word ("&amp;");
+ else
+ add_char (character);
+ input_text_offset++;
+ break;
+
+ case '<':
+ if (html && escape_html)
+ add_word ("&lt;");
+ else if (xml && escape_html)
+ xml_insert_entity ("lt");
+ else
+ add_char (character);
+ input_text_offset++;
+ break;
+
+ case '>':
+ if (html && escape_html)
+ add_word ("&gt;");
+ else if (xml && escape_html)
+ xml_insert_entity ("gt");
+ else
+ add_char (character);
+ input_text_offset++;
+ break;
+
+ case COMMAND_PREFIX: /* @ */
+ if (read_command () || !only_macro_expansion)
+ break;
+
+ /* FALLTHROUGH (usually) */
+ case '{':
+ /* Special case. We're not supposed to see this character by itself.
+ If we do, it means there is a syntax error in the input text.
+ Report the error here, but remember this brace on the stack so
+ we can ignore its partner. */
+ if (!only_macro_expansion)
+ {
+ if (command && !STREQ (command, "math"))
+ {
+ line_error (_("Misplaced %c"), '{');
+ remember_brace (misplaced_brace);
+ }
+ else
+ /* We don't mind `extra' braces inside @math. */
+ remember_brace (cm_no_op);
+ /* remember_brace advances input_text_offset. */
+ break;
+ }
+
+ /* FALLTHROUGH (usually) */
+ case '}':
+ if (!only_macro_expansion)
+ {
+ pop_and_call_brace ();
+ input_text_offset++;
+ break;
+ }
+
+ /* FALLTHROUGH (usually) */
+ default:
+ add_char (character);
+ input_text_offset++;
+ }
+ }
+ if (macro_expansion_output_stream && !only_macro_expansion)
+ maybe_write_itext (input_text, input_text_offset);
+}
+
+static void
+init_brace_stack (void)
+{
+ brace_stack = NULL;
+}
+
+/* Remember the current output position here. Save PROC
+ along with it so you can call it later. */
+static void
+remember_brace_1 (COMMAND_FUNCTION (*proc), int position)
+{
+ BRACE_ELEMENT *new = xmalloc (sizeof (BRACE_ELEMENT));
+ new->next = brace_stack;
+ new->proc = proc;
+ new->command = command ? xstrdup (command) : "";
+ new->pos = position;
+ new->line = line_number;
+ new->in_fixed_width_font = in_fixed_width_font;
+ brace_stack = new;
+}
+
+static void
+remember_brace (COMMAND_FUNCTION (*proc))
+{
+ if (curchar () != '{')
+ line_error (_("%c%s expected braces"), COMMAND_PREFIX, command);
+ else
+ input_text_offset++;
+ remember_brace_1 (proc, output_paragraph_offset);
+}
+
+/* Pop the top of the brace stack, and call the associated function
+ with the args END and POS. */
+static void
+pop_and_call_brace (void)
+{
+ if (brace_stack == NULL)
+ {
+ line_error (_("Unmatched }"));
+ return;
+ }
+
+ {
+ BRACE_ELEMENT *temp;
+
+ int pos = brace_stack->pos;
+ COMMAND_FUNCTION *proc = brace_stack->proc;
+ in_fixed_width_font = brace_stack->in_fixed_width_font;
+
+ /* Reset current command, so the proc can know who it is. This is
+ used in cm_accent. */
+ command = brace_stack->command;
+
+ temp = brace_stack->next;
+ free (brace_stack);
+ brace_stack = temp;
+
+ (*proc) (END, pos, output_paragraph_offset);
+ }
+}
+
+/* Shift all of the markers in `brace_stack' by AMOUNT. */
+static void
+adjust_braces_following (int here, int amount)
+{
+ BRACE_ELEMENT *stack = brace_stack;
+
+ while (stack)
+ {
+ if (stack->pos >= here)
+ stack->pos += amount;
+ stack = stack->next;
+ }
+}
+
+/* Return the string which invokes PROC; a pointer to a function.
+ Always returns the first function in the command table if more than
+ one matches PROC. */
+static const char *
+find_proc_name (COMMAND_FUNCTION (*proc))
+{
+ int i;
+
+ for (i = 0; command_table[i].name; i++)
+ if (proc == command_table[i].proc)
+ return command_table[i].name;
+ return _("NO_NAME!");
+}
+
+/* You call discard_braces () when you shouldn't have any braces on the stack.
+ I used to think that this happens for commands that don't take arguments
+ in braces, but that was wrong because of things like @code{foo @@}. So now
+ I only detect it at the beginning of nodes. */
+void
+discard_braces (void)
+{
+ if (!brace_stack)
+ return;
+
+ while (brace_stack)
+ {
+ if (brace_stack->proc != misplaced_brace)
+ {
+ const char *proc_name;
+
+ proc_name = find_proc_name (brace_stack->proc);
+ file_line_error (input_filename, brace_stack->line,
+ _("%c%s missing close brace"), COMMAND_PREFIX,
+ proc_name);
+ pop_and_call_brace ();
+ }
+ else
+ {
+ BRACE_ELEMENT *temp;
+ temp = brace_stack->next;
+ free (brace_stack);
+ brace_stack = temp;
+ }
+ }
+}
+
+static int
+get_char_len (int character)
+{
+ /* Return the printed length of the character. */
+ int len;
+
+ switch (character)
+ {
+ case '\t':
+ len = (output_column + 8) & 0xf7;
+ if (len > fill_column)
+ len = fill_column - output_column;
+ else
+ len = len - output_column;
+ break;
+
+ case '\n':
+ len = fill_column - output_column;
+ break;
+
+ default:
+ /* ASCII control characters appear as two characters in the output
+ (e.g., ^A). But characters with the high bit set are just one
+ on suitable terminals, so don't count them as two for line
+ breaking purposes. */
+ if (0 <= character && character < ' ')
+ len = 2;
+ else
+ len = 1;
+ }
+ return len;
+}
+
+void
+#if defined (VA_FPRINTF) && __STDC__
+add_word_args (const char *format, ...)
+#else
+add_word_args (format, va_alist)
+ const char *format;
+ va_dcl
+#endif
+{
+ char buffer[2000]; /* xx no fixed limits */
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+
+ VA_START (ap, format);
+#ifdef VA_SPRINTF
+ VA_SPRINTF (buffer, format, ap);
+#else
+ sprintf (buffer, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_SPRINTF */
+ va_end (ap);
+ add_word (buffer);
+}
+
+/* Add STRING to output_paragraph. */
+void
+add_word (char *string)
+{
+ while (*string)
+ add_char (*string++);
+}
+
+/* Like add_word, but inhibits conversion of whitespace into &nbsp;.
+ Use this to output HTML directives with embedded blanks, to make
+ them @w-safe. */
+void
+add_html_elt (char *string)
+{
+ in_html_elt++;
+ add_word (string);
+ in_html_elt--;
+}
+
+/* These two functions below, add_html_block_elt and add_html_block_elt_args,
+ are mixtures of add_html_elt and add_word_args. They inform makeinfo that
+ the current HTML element being inserted should not be enclosed in a <p>
+ element. */
+void
+add_html_block_elt (char *string)
+{
+ in_html_block_level_elt++;
+ add_word (string);
+ in_html_block_level_elt--;
+}
+
+void
+#if defined (VA_FPRINTF) && __STDC__
+add_html_block_elt_args (const char *format, ...)
+#else
+add_html_block_elt_args (format, va_alist)
+ const char *format;
+ va_dcl
+#endif
+{
+ char buffer[2000]; /* xx no fixed limits */
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+
+ VA_START (ap, format);
+#ifdef VA_SPRINTF
+ VA_SPRINTF (buffer, format, ap);
+#else
+ sprintf (buffer, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_SPRINTF */
+ va_end (ap);
+ add_html_block_elt (buffer);
+}
+
+/* Here is another awful kludge, used in add_char. Ordinarily, macro
+ expansions take place in the body of the document, and therefore we
+ should html_output_head when we see one. But there's an exception: a
+ macro call might take place within @copying, and that does not start
+ the real output, even though we fully expand the copying text.
+
+ So we need to be able to check if we are defining the @copying text.
+ We do this by looking back through the insertion stack. */
+static int
+defining_copying (void)
+{
+ INSERTION_ELT *i;
+ for (i = insertion_stack; i; i = i->next)
+ {
+ if (i->insertion == copying)
+ return 1;
+ }
+ return 0;
+}
+
+
+/* Add the character to the current paragraph. If filling_enabled is
+ nonzero, then do filling as well. */
+void
+add_char (int character)
+{
+ if (xml)
+ {
+ xml_add_char (character);
+ return;
+ }
+
+ /* If we are avoiding outputting headers, and we are currently
+ in a menu, then simply return. But if we're only expanding macros,
+ then we're being called from glean_node_from_menu to try to
+ remember a menu reference, and we need that so we can do defaulting. */
+ if (no_headers && !only_macro_expansion && (in_menu || in_detailmenu))
+ return;
+
+ /* If we are adding a character now, then we don't have to
+ ignore close_paragraph () calls any more. */
+ if (must_start_paragraph && character != '\n')
+ {
+ must_start_paragraph = 0;
+ line_already_broken = 0; /* The line is no longer broken. */
+ if (current_indent > output_column)
+ {
+ indent (current_indent - output_column);
+ output_column = current_indent;
+ }
+ }
+
+ if (non_splitting_words
+ && !(html && in_html_elt)
+ && strchr (" \t\n", character))
+ {
+ if (html || docbook)
+ { /* Seems cleaner to use &nbsp; than an 8-bit char. */
+ int saved_escape_html = escape_html;
+ escape_html = 0;
+ add_word ("&nbsp");
+ escape_html = saved_escape_html;
+ character = ';';
+ }
+ else
+ character = META (' '); /* unmeta-d in flush_output */
+ }
+
+ insertion_paragraph_closed = 0;
+
+ switch (character)
+ {
+ case '\n':
+ if (!filling_enabled && !(html && (in_menu || in_detailmenu)))
+ {
+ insert ('\n');
+
+ if (force_flush_right)
+ {
+ close_paragraph ();
+ /* Hack to force single blank lines out in this mode. */
+ flush_output ();
+ }
+
+ output_column = 0;
+
+ if (!no_indent && paragraph_is_open)
+ indent (output_column = current_indent);
+ break;
+ }
+ else if (end_of_sentence_p ())
+ /* CHARACTER is newline, and filling is enabled. */
+ {
+ insert (' ');
+ output_column++;
+ last_inserted_character = character;
+ }
+
+ if (last_char_was_newline)
+ {
+ if (html)
+ last_char_was_newline++;
+ close_paragraph ();
+ pending_indent = 0;
+ }
+ else
+ {
+ last_char_was_newline = 1;
+ if (html)
+ insert ('\n');
+ else
+ insert (' ');
+ output_column++;
+ }
+ break;
+
+ default: /* not at newline */
+ {
+ int len = get_char_len (character);
+ int suppress_insert = 0;
+
+ if ((character == ' ') && (last_char_was_newline))
+ {
+ if (!paragraph_is_open)
+ {
+ pending_indent++;
+ return;
+ }
+ }
+
+ /* This is sad, but it seems desirable to not force any
+ particular order on the front matter commands. This way,
+ the document can do @settitle, @documentlanguage, etc, in
+ any order and with any omissions, and we'll still output
+ the html <head> `just in time'. */
+ if ((executing_macro || !executing_string)
+ && !only_macro_expansion
+ && html && !html_output_head_p && !defining_copying ())
+ html_output_head ();
+
+ if (!paragraph_is_open)
+ {
+ start_paragraph ();
+ /* If the paragraph is supposed to be indented a certain
+ way, then discard all of the pending whitespace.
+ Otherwise, we let the whitespace stay. */
+ if (!paragraph_start_indent)
+ indent (pending_indent);
+ pending_indent = 0;
+
+ /* This check for in_html_block_level_elt prevents <p> from being
+ inserted when we already have html markup starting a paragraph,
+ as with <ul> and <h1> and the like. */
+ if (html && !in_html_block_level_elt)
+ {
+ if ((in_menu || in_detailmenu) && in_menu_item)
+ {
+ insert_string ("</li></ul>\n");
+ in_menu_item = 0;
+ }
+ insert_string ("<p>");
+ in_paragraph = 1;
+ adjust_braces_following (0, 3); /* adjust for <p> */
+ }
+ }
+
+ output_column += len;
+ if (output_column > fill_column)
+ {
+ if (filling_enabled && !html)
+ {
+ int temp = output_paragraph_offset;
+ while (--temp > 0 && output_paragraph[temp] != '\n')
+ {
+ /* If we have found a space, we have the place to break
+ the line. */
+ if (output_paragraph[temp] == ' ')
+ {
+ /* Remove trailing whitespace from output. */
+ while (temp && whitespace (output_paragraph[temp - 1]))
+ temp--;
+
+ /* If we went back all the way to the newline of the
+ preceding line, it probably means that the word we
+ are adding is itself wider than the space that the
+ indentation and the fill_column let us use. In
+ that case, do NOT insert another newline, since it
+ won't help. Just indent to current_indent and
+ leave it alone, since that's the most we can do. */
+ if (temp && output_paragraph[temp - 1] != '\n')
+ output_paragraph[temp++] = '\n';
+
+ /* We have correctly broken the line where we want
+ to. What we don't want is spaces following where
+ we have decided to break the line. We get rid of
+ them. */
+ {
+ int t1 = temp;
+
+ for (;; t1++)
+ {
+ if (t1 == output_paragraph_offset)
+ {
+ if (whitespace (character))
+ suppress_insert = 1;
+ break;
+ }
+ if (!whitespace (output_paragraph[t1]))
+ break;
+ }
+
+ if (t1 != temp)
+ {
+ adjust_braces_following (temp, (- (t1 - temp)));
+ memmove (&output_paragraph[temp],
+ &output_paragraph[t1],
+ output_paragraph_offset - t1);
+ output_paragraph_offset -= (t1 - temp);
+ }
+ }
+
+ /* Filled, but now indent if that is right. */
+ if (indented_fill && current_indent > 0)
+ {
+ int buffer_len = ((output_paragraph_offset - temp)
+ + current_indent);
+ char *temp_buffer = xmalloc (buffer_len);
+ int indentation = 0;
+
+ /* We have to shift any markers that are in
+ front of the wrap point. */
+ adjust_braces_following (temp, current_indent);
+
+ while (current_indent > 0 &&
+ indentation != current_indent)
+ temp_buffer[indentation++] = ' ';
+
+ memcpy ((char *) &temp_buffer[current_indent],
+ (char *) &output_paragraph[temp],
+ buffer_len - current_indent);
+
+ if (output_paragraph_offset + buffer_len
+ >= paragraph_buffer_len)
+ {
+ unsigned char *tt = xrealloc
+ (output_paragraph,
+ (paragraph_buffer_len += buffer_len));
+ output_paragraph = tt;
+ }
+ memcpy ((char *) &output_paragraph[temp],
+ temp_buffer, buffer_len);
+ output_paragraph_offset += current_indent;
+ free (temp_buffer);
+ }
+ output_column = 0;
+ while (temp < output_paragraph_offset)
+ output_column +=
+ get_char_len (output_paragraph[temp++]);
+ output_column += len;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!suppress_insert)
+ {
+ insert (character);
+ last_inserted_character = character;
+ }
+ last_char_was_newline = 0;
+ line_already_broken = 0;
+ }
+ }
+}
+
+/* Add a character and store its position in meta_char_pos. */
+void
+add_meta_char (int character)
+{
+ meta_char_pos = output_paragraph_offset;
+ add_char (character);
+}
+
+/* Insert CHARACTER into `output_paragraph'. */
+void
+insert (int character)
+{
+ /* We don't want to strip trailing whitespace in multitables. Otherwise
+ horizontal separators confuse the font locking in Info mode in Emacs,
+ because it looks like a @subsection. Adding a trailing space to those
+ lines fixes it. */
+ if (character == '\n' && !html && !xml && !multitable_active)
+ {
+ while (output_paragraph_offset
+ && whitespace (output_paragraph[output_paragraph_offset-1]))
+ output_paragraph_offset--;
+ }
+
+ output_paragraph[output_paragraph_offset++] = character;
+ if (output_paragraph_offset == paragraph_buffer_len)
+ {
+ output_paragraph =
+ xrealloc (output_paragraph, (paragraph_buffer_len += 100));
+ }
+}
+
+/* Insert the null-terminated string STRING into `output_paragraph'. */
+void
+insert_string (const char *string)
+{
+ while (*string)
+ insert (*string++);
+}
+
+
+/* Sentences might have these characters after the period (or whatever). */
+#define POST_SENTENCE(c) ((c) == ')' || (c) == '\'' || (c) == '"' \
+ || (c) == ']')
+
+/* Return true if at an end-of-sentence character, possibly followed by
+ post-sentence punctuation to ignore. */
+static int
+end_of_sentence_p (void)
+{
+ int loc = output_paragraph_offset - 1;
+
+ /* If nothing has been output, don't check output_paragraph[-1]. */
+ if (loc < 0)
+ return 0;
+
+ /* A post-sentence character that is at meta_char_pos is not really
+ a post-sentence character; it was produced by a markup such as
+ @samp. We don't want the period inside @samp to be treated as a
+ sentence ender. */
+ while (loc > 0
+ && loc != meta_char_pos && POST_SENTENCE (output_paragraph[loc]))
+ loc--;
+ return loc != meta_char_pos && sentence_ender (output_paragraph[loc]);
+}
+
+
+/* Remove upto COUNT characters of whitespace from the
+ the current output line. If COUNT is less than zero,
+ then remove until none left. */
+void
+kill_self_indent (int count)
+{
+ /* Handle infinite case first. */
+ if (count < 0)
+ {
+ output_column = 0;
+ while (output_paragraph_offset)
+ {
+ if (whitespace (output_paragraph[output_paragraph_offset - 1]))
+ output_paragraph_offset--;
+ else
+ break;
+ }
+ }
+ else
+ {
+ while (output_paragraph_offset && count--)
+ if (whitespace (output_paragraph[output_paragraph_offset - 1]))
+ output_paragraph_offset--;
+ else
+ break;
+ }
+}
+
+/* Nonzero means do not honor calls to flush_output (). */
+static int flushing_ignored = 0;
+
+/* Prevent calls to flush_output () from having any effect. */
+void
+inhibit_output_flushing (void)
+{
+ flushing_ignored++;
+}
+
+/* Allow calls to flush_output () to write the paragraph data. */
+void
+uninhibit_output_flushing (void)
+{
+ flushing_ignored--;
+}
+
+void
+flush_output (void)
+{
+ int i;
+
+ if (!output_paragraph_offset || flushing_ignored)
+ return;
+
+ for (i = 0; i < output_paragraph_offset; i++)
+ {
+ if (output_paragraph[i] == '\n')
+ {
+ output_line_number++;
+ node_line_number++;
+ }
+
+ /* If we turned on the 8th bit for a space inside @w, turn it
+ back off for output. This might be problematic, since the
+ 0x80 character may be used in 8-bit character sets. Sigh.
+ In any case, don't do this for HTML, since the nbsp character
+ is valid input and must be passed along to the browser. */
+ if (!html && (output_paragraph[i] & meta_character_bit))
+ {
+ int temp = UNMETA (output_paragraph[i]);
+ if (temp == ' ')
+ output_paragraph[i] &= 0x7f;
+ }
+ }
+
+ fwrite (output_paragraph, 1, output_paragraph_offset, output_stream);
+
+ output_position += output_paragraph_offset;
+ output_paragraph_offset = 0;
+ meta_char_pos = 0;
+}
+
+/* How to close a paragraph controlling the number of lines between
+ this one and the last one. */
+
+/* Paragraph spacing is controlled by this variable. It is the number of
+ blank lines that you wish to appear between paragraphs. A value of
+ 1 creates a single blank line between paragraphs. */
+int paragraph_spacing = DEFAULT_PARAGRAPH_SPACING;
+
+static void
+close_paragraph_with_lines (int lines)
+{
+ int old_spacing = paragraph_spacing;
+ paragraph_spacing = lines;
+ close_paragraph ();
+ paragraph_spacing = old_spacing;
+}
+
+/* Close the current paragraph, leaving no blank lines between them. */
+void
+close_single_paragraph (void)
+{
+ close_paragraph_with_lines (0);
+}
+
+/* Close a paragraph after an insertion has ended. */
+void
+close_insertion_paragraph (void)
+{
+ if (!insertion_paragraph_closed)
+ {
+ /* Close the current paragraph, breaking the line. */
+ close_single_paragraph ();
+
+ /* Start a new paragraph, with the correct indentation for the now
+ current insertion level (one above the one that we are ending). */
+ start_paragraph ();
+
+ /* Tell `close_paragraph' that the previous line has already been
+ broken, so it should insert one less newline. */
+ line_already_broken = 1;
+
+ /* Tell functions such as `add_char' we've already found a newline. */
+ ignore_blank_line ();
+ }
+ else
+ {
+ /* If the insertion paragraph is closed already, then we are seeing
+ two `@end' commands in a row. Note that the first one we saw was
+ handled in the first part of this if-then-else clause, and at that
+ time `start_paragraph' was called, partially to handle the proper
+ indentation of the current line. However, the indentation level
+ may have just changed again, so we may have to outdent the current
+ line to the new indentation level. */
+ if (current_indent < output_column)
+ kill_self_indent (output_column - current_indent);
+ }
+
+ insertion_paragraph_closed = 1;
+}
+
+/* Close the currently open paragraph. */
+void
+close_paragraph (void)
+{
+ int i;
+
+ /* We don't need these newlines in XML and Docbook outputs for
+ paragraph seperation. We have <para> element for that. */
+ if (xml)
+ return;
+
+ /* The insertion paragraph is no longer closed. */
+ insertion_paragraph_closed = 0;
+
+ if (paragraph_is_open && !must_start_paragraph)
+ {
+ int tindex = output_paragraph_offset;
+
+ /* Back up to last non-newline/space character, forcing all such
+ subsequent characters to be newlines. This isn't strictly
+ necessary, but a couple of functions use the presence of a newline
+ to make decisions. */
+ for (tindex = output_paragraph_offset - 1; tindex >= 0; --tindex)
+ {
+ int c = output_paragraph[tindex];
+
+ if (c == ' '|| c == '\n')
+ output_paragraph[tindex] = '\n';
+ else
+ break;
+ }
+
+ /* All trailing whitespace is ignored. */
+ output_paragraph_offset = ++tindex;
+
+ /* Break the line if that is appropriate. */
+ if (paragraph_spacing >= 0)
+ insert ('\n');
+
+ /* Add as many blank lines as is specified in `paragraph_spacing'. */
+ if (!force_flush_right)
+ {
+ for (i = 0; i < (paragraph_spacing - line_already_broken); i++)
+ {
+ insert ('\n');
+ /* Don't need anything extra for HTML in usual case of no
+ extra paragraph spacing. */
+ if (html && i > 0)
+ insert_string ("<br>");
+ }
+ }
+
+ /* If we are doing flush right indentation, then do it now
+ on the paragraph (really a single line). */
+ if (force_flush_right)
+ do_flush_right_indentation ();
+
+ flush_output ();
+ paragraph_is_open = 0;
+ no_indent = 0;
+ output_column = 0;
+ }
+
+ ignore_blank_line ();
+}
+
+/* Make the last line just read look as if it were only a newline. */
+void
+ignore_blank_line (void)
+{
+ last_inserted_character = '\n';
+ last_char_was_newline = 1;
+}
+
+/* Align the end of the text in output_paragraph with fill_column. */
+static void
+do_flush_right_indentation (void)
+{
+ char *temp;
+ int temp_len;
+
+ kill_self_indent (-1);
+
+ if (output_paragraph[0] != '\n')
+ {
+ output_paragraph[output_paragraph_offset] = 0;
+
+ if (output_paragraph_offset < fill_column)
+ {
+ int i;
+
+ if (fill_column >= paragraph_buffer_len)
+ output_paragraph =
+ xrealloc (output_paragraph,
+ (paragraph_buffer_len += fill_column));
+
+ temp_len = strlen ((char *)output_paragraph);
+ temp = xmalloc (temp_len + 1);
+ memcpy (temp, (char *)output_paragraph, temp_len);
+
+ for (i = 0; i < fill_column - output_paragraph_offset; i++)
+ output_paragraph[i] = ' ';
+
+ memcpy ((char *)output_paragraph + i, temp, temp_len);
+ free (temp);
+ output_paragraph_offset = fill_column;
+ adjust_braces_following (0, i);
+ }
+ }
+}
+
+/* Begin a new paragraph. */
+void
+start_paragraph (void)
+{
+ /* First close existing one. */
+ if (paragraph_is_open)
+ close_paragraph ();
+
+ /* In either case, the insertion paragraph is no longer closed. */
+ insertion_paragraph_closed = 0;
+
+ /* However, the paragraph is open! */
+ paragraph_is_open = 1;
+
+ /* If we MUST_START_PARAGRAPH, that simply means that start_paragraph ()
+ had to be called before we would allow any other paragraph operations
+ to have an effect. */
+ if (!must_start_paragraph)
+ {
+ int amount_to_indent = 0;
+
+ /* If doing indentation, then insert the appropriate amount. */
+ if (!no_indent)
+ {
+ if (inhibit_paragraph_indentation)
+ {
+ amount_to_indent = current_indent;
+ if (inhibit_paragraph_indentation < 0)
+ inhibit_paragraph_indentation++;
+ }
+ else if (paragraph_start_indent < 0)
+ amount_to_indent = current_indent;
+ else
+ amount_to_indent = current_indent + paragraph_start_indent;
+
+ if (amount_to_indent >= output_column)
+ {
+ amount_to_indent -= output_column;
+ indent (amount_to_indent);
+ output_column += amount_to_indent;
+ }
+ }
+ }
+ else
+ must_start_paragraph = 0;
+}
+
+/* Insert the indentation specified by AMOUNT. */
+void
+indent (int amount)
+{
+ /* For every START_POS saved within the brace stack which will be affected
+ by this indentation, bump that start pos forward. */
+ adjust_braces_following (output_paragraph_offset, amount);
+
+ while (--amount >= 0)
+ insert (' ');
+}
+
+/* Search forward for STRING in input_text.
+ FROM says where where to start. */
+int
+search_forward (char *string, int from)
+{
+ int len = strlen (string);
+
+ while (from < input_text_length)
+ {
+ if (strncmp (input_text + from, string, len) == 0)
+ return from;
+ from++;
+ }
+ return -1;
+}
+
+/* search_forward until n characters. */
+int
+search_forward_until_pos (char *string, int from, int end_pos)
+{
+ int save_input_text_length = input_text_length;
+ input_text_length = end_pos;
+
+ from = search_forward (string, from);
+
+ input_text_length = save_input_text_length;
+
+ return from;
+}
+
+/* Return next non-whitespace and non-cr character. */
+int
+next_nonwhitespace_character (void)
+{
+ /* First check the current input_text. Start from the next char because
+ we already have input_text[input_text_offset] in ``current''. */
+ int pos = input_text_offset + 1;
+
+ while (pos < input_text_length)
+ {
+ if (!cr_or_whitespace(input_text[pos]))
+ return input_text[pos];
+ pos++;
+ }
+
+ { /* Can't find a valid character, so go through filestack
+ in case we are doing @include or expanding a macro. */
+ FSTACK *tos = filestack;
+
+ while (tos)
+ {
+ int tmp_input_text_length = filestack->size;
+ int tmp_input_text_offset = filestack->offset;
+ char *tmp_input_text = filestack->text;
+
+ while (tmp_input_text_offset < tmp_input_text_length)
+ {
+ if (!cr_or_whitespace(tmp_input_text[tmp_input_text_offset]))
+ return tmp_input_text[tmp_input_text_offset];
+ tmp_input_text_offset++;
+ }
+
+ tos = tos->next;
+ }
+ }
+
+ return -1;
+}
+
+/* An external image is a reference, kind of. The parsing is (not
+ coincidentally) similar, anyway. */
+void
+cm_image (int arg)
+{
+ char *name_arg, *w_arg, *h_arg, *alt_arg, *ext_arg;
+
+ if (arg == END)
+ return;
+
+ name_arg = get_xref_token (1); /* expands all macros in image */
+ w_arg = get_xref_token (0);
+ h_arg = get_xref_token (0);
+ alt_arg = get_xref_token (1); /* expands all macros in alt text */
+ ext_arg = get_xref_token (0);
+
+ if (*name_arg)
+ {
+ struct stat file_info;
+ char *pathname = NULL;
+ char *fullname = xmalloc (strlen (name_arg)
+ + (ext_arg && *ext_arg ? strlen (ext_arg) + 1: 4) + 1);
+
+ if (ext_arg && *ext_arg)
+ {
+ sprintf (fullname, "%s%s", name_arg, ext_arg);
+ if (access (fullname, R_OK) != 0)
+ pathname = get_file_info_in_path (fullname, include_files_path,
+ &file_info);
+
+ if (pathname == NULL)
+ {
+ /* Backwards compatibility (4.6 <= version < 4.7):
+ try prefixing @image's EXTENSION parameter with a period. */
+ sprintf (fullname, "%s.%s", name_arg, ext_arg);
+ if (access (fullname, R_OK) != 0)
+ pathname = get_file_info_in_path (fullname, include_files_path,
+ &file_info);
+ }
+ }
+ else
+ {
+ sprintf (fullname, "%s.png", name_arg);
+ if (access (fullname, R_OK) != 0) {
+ pathname = get_file_info_in_path (fullname,
+ include_files_path, &file_info);
+ if (pathname == NULL) {
+ sprintf (fullname, "%s.jpg", name_arg);
+ if (access (fullname, R_OK) != 0) {
+ sprintf (fullname, "%s.gif", name_arg);
+ if (access (fullname, R_OK) != 0) {
+ pathname = get_file_info_in_path (fullname,
+ include_files_path, &file_info);
+ }
+ }
+ }
+ }
+ }
+
+ if (html)
+ {
+ int image_in_div = 0;
+
+ if (pathname == NULL && access (fullname, R_OK) != 0)
+ {
+ line_error(_("@image file `%s' (for HTML) not readable: %s"),
+ fullname, strerror (errno));
+ return;
+ }
+ if (pathname != NULL && access (pathname, R_OK) != 0)
+ {
+ line_error (_("No such file `%s'"),
+ fullname);
+ return;
+ }
+
+ if (!paragraph_is_open)
+ {
+ add_html_block_elt ("<div class=\"block-image\">");
+ image_in_div = 1;
+ }
+
+ add_html_elt ("<img src=");
+ add_word_args ("\"%s\"", fullname);
+ add_html_elt (" alt=");
+ add_word_args ("\"%s\">",
+ escape_string (*alt_arg ? text_expansion (alt_arg) : fullname));
+
+ if (image_in_div)
+ add_html_block_elt ("</div>");
+ }
+ else if (xml && docbook)
+ xml_insert_docbook_image (name_arg);
+ else if (xml)
+ {
+ extern int xml_in_para;
+ extern int xml_no_para;
+ int elt = xml_in_para ? INLINEIMAGE : IMAGE;
+
+ if (!xml_in_para)
+ xml_no_para++;
+
+ xml_insert_element_with_attribute (elt,
+ START, "width=\"%s\" height=\"%s\" name=\"%s\" extension=\"%s\"",
+ w_arg, h_arg, name_arg, ext_arg);
+ xml_insert_element (IMAGEALTTEXT, START);
+ execute_string ("%s", alt_arg);
+ xml_insert_element (IMAGEALTTEXT, END);
+ xml_insert_element (elt, END);
+
+ if (!xml_in_para)
+ xml_no_para--;
+ }
+ else
+ { /* Try to open foo.EXT or foo.txt. */
+ FILE *image_file;
+ char *txtpath = NULL;
+ char *txtname = xmalloc (strlen (name_arg)
+ + (ext_arg && *ext_arg
+ ? strlen (ext_arg) : 4) + 1);
+ strcpy (txtname, name_arg);
+ strcat (txtname, ".txt");
+ image_file = fopen (txtname, "r");
+ if (image_file == NULL)
+ {
+ txtpath = get_file_info_in_path (txtname,
+ include_files_path, &file_info);
+ if (txtpath != NULL)
+ image_file = fopen (txtpath, "r");
+ }
+
+ if (image_file != NULL
+ || access (fullname, R_OK) == 0
+ || (pathname != NULL && access (pathname, R_OK) == 0))
+ {
+ int ch;
+ int save_inhibit_indentation = inhibit_paragraph_indentation;
+ int save_filling_enabled = filling_enabled;
+ int image_in_brackets = paragraph_is_open;
+
+ /* Write magic ^@^H[image ...^@^H] cookie in the info file, if
+ there's an accompanying bitmap. Otherwise just include the
+ text image. In the plaintext output, always include the text
+ image without the magic cookie. */
+ int use_magic_cookie = !no_headers
+ && access (fullname, R_OK) == 0 && !STREQ (fullname, txtname);
+
+ inhibit_paragraph_indentation = 1;
+ filling_enabled = 0;
+ last_char_was_newline = 0;
+
+ if (use_magic_cookie)
+ {
+ add_char ('\0');
+ add_word ("\010[image");
+
+ if (access (fullname, R_OK) == 0
+ || (pathname != NULL && access (pathname, R_OK) == 0))
+ add_word_args (" src=\"%s\"", fullname);
+
+ if (*alt_arg)
+ add_word_args (" alt=\"%s\"", alt_arg);
+ }
+
+ if (image_file != NULL)
+ {
+ if (use_magic_cookie)
+ add_word (" text=\"");
+
+ if (image_in_brackets)
+ add_char ('[');
+
+ /* Maybe we need to remove the final newline if the image
+ file is only one line to allow in-line images. On the
+ other hand, they could just make the file without a
+ final newline. */
+ while ((ch = getc (image_file)) != EOF)
+ {
+ if (use_magic_cookie && (ch == '"' || ch == '\\'))
+ add_char ('\\');
+ add_char (ch);
+ }
+
+ if (image_in_brackets)
+ add_char (']');
+
+ if (use_magic_cookie)
+ add_char ('"');
+
+ if (fclose (image_file) != 0)
+ perror (txtname);
+ }
+
+ if (use_magic_cookie)
+ {
+ add_char ('\0');
+ add_word ("\010]");
+ }
+
+ inhibit_paragraph_indentation = save_inhibit_indentation;
+ filling_enabled = save_filling_enabled;
+ }
+ else
+ warning (_("@image file `%s' (for text) unreadable: %s"),
+ txtname, strerror (errno));
+ }
+
+ free (fullname);
+ if (pathname)
+ free (pathname);
+ }
+ else
+ line_error (_("@image missing filename argument"));
+
+ if (name_arg)
+ free (name_arg);
+ if (w_arg)
+ free (w_arg);
+ if (h_arg)
+ free (h_arg);
+ if (alt_arg)
+ free (alt_arg);
+ if (ext_arg)
+ free (ext_arg);
+}
+
+/* Conditionals. */
+
+/* A structure which contains `defined' variables. */
+typedef struct defines {
+ struct defines *next;
+ char *name;
+ char *value;
+} DEFINE;
+
+/* The linked list of `set' defines. */
+DEFINE *defines = NULL;
+
+/* Add NAME to the list of `set' defines. */
+static void
+set (char *name, char *value)
+{
+ DEFINE *temp;
+
+ for (temp = defines; temp; temp = temp->next)
+ if (strcmp (name, temp->name) == 0)
+ {
+ free (temp->value);
+ temp->value = xstrdup (value);
+ return;
+ }
+
+ temp = xmalloc (sizeof (DEFINE));
+ temp->next = defines;
+ temp->name = xstrdup (name);
+ temp->value = xstrdup (value);
+ defines = temp;
+
+ if (xml && !docbook)
+ {
+ xml_insert_element_with_attribute (SETVALUE, START, "name=\"%s\"", name);
+ execute_string ("%s", value);
+ xml_insert_element (SETVALUE, END);
+ }
+}
+
+/* Remove NAME from the list of `set' defines. */
+static void
+clear (char *name)
+{
+ DEFINE *temp, *last;
+
+ last = NULL;
+ temp = defines;
+
+ while (temp)
+ {
+ if (strcmp (temp->name, name) == 0)
+ {
+ if (last)
+ last->next = temp->next;
+ else
+ defines = temp->next;
+
+ free (temp->name);
+ free (temp->value);
+ free (temp);
+ break;
+ }
+ last = temp;
+ temp = temp->next;
+ }
+
+ if (xml && !docbook)
+ {
+ xml_insert_element_with_attribute (CLEARVALUE, START, "name=\"%s\"", name);
+ xml_insert_element (CLEARVALUE, END);
+ }
+}
+
+/* Return the value of NAME. The return value is NULL if NAME is unset. */
+static char *
+set_p (char *name)
+{
+ DEFINE *temp;
+
+ for (temp = defines; temp; temp = temp->next)
+ if (strcmp (temp->name, name) == 0)
+ return temp->value;
+
+ return NULL;
+}
+
+/* Create a variable whose name appears as the first word on this line. */
+void
+cm_set (void)
+{
+ handle_variable (SET);
+}
+
+/* Remove a variable whose name appears as the first word on this line. */
+void
+cm_clear (void)
+{
+ handle_variable (CLEAR);
+}
+
+void
+cm_ifset (void)
+{
+ handle_variable (IFSET);
+}
+
+void
+cm_ifclear (void)
+{
+ handle_variable (IFCLEAR);
+}
+
+/* This command takes braces, but we parse the contents specially, so we
+ don't use the standard brace popping code.
+
+ The syntax @ifeq{arg1, arg2, texinfo-commands} performs texinfo-commands
+ if ARG1 and ARG2 caselessly string compare to the same string, otherwise,
+ it produces no output. */
+void
+cm_ifeq (void)
+{
+ char **arglist;
+
+ arglist = get_brace_args (0);
+
+ if (arglist)
+ {
+ if (array_len (arglist) > 1)
+ {
+ if ((strcasecmp (arglist[0], arglist[1]) == 0) &&
+ (arglist[2]))
+ execute_string ("%s\n", arglist[2]);
+ }
+
+ free_array (arglist);
+ }
+}
+
+void
+cm_value (int arg, int start_pos, int end_pos)
+{
+ static int value_level = 0, saved_meta_pos = -1;
+
+ /* xml_add_char() skips any content inside menus when output format is
+ Docbook, so @value{} is no use there. Also start_pos and end_pos does not
+ get updated, causing name to be empty string. So just return. */
+ if (docbook && in_menu)
+ return;
+
+ /* All the text after @value{ upto the matching } will eventually
+ disappear from output_paragraph, when this function is called
+ with ARG == END. If the text produced until then sets
+ meta_char_pos, we will need to restore it to the value it had
+ before @value was seen. So we need to save the previous value
+ of meta_char_pos here. */
+ if (arg == START)
+ {
+ /* If we are already inside some outer @value, don't overwrite
+ the value saved in saved_meta_pos. */
+ if (!value_level)
+ saved_meta_pos = meta_char_pos;
+ value_level++;
+ /* While the argument of @value is processed, we need to inhibit
+ textual transformations like "--" into "-", since @set didn't
+ do that when it grabbed the name of the variable. */
+ in_fixed_width_font++;
+ }
+ else
+ {
+ char *name = (char *) &output_paragraph[start_pos];
+ char *value;
+ output_paragraph[end_pos] = 0;
+ name = xstrdup (name);
+ value = set_p (name);
+ output_column -= end_pos - start_pos;
+ output_paragraph_offset = start_pos;
+
+ /* Restore the previous value of meta_char_pos if the stuff
+ inside this @value{} moved it. */
+ if (saved_meta_pos == -1) /* can't happen inside @value{} */
+ abort ();
+ if (value_level == 1
+ && meta_char_pos >= start_pos && meta_char_pos < end_pos)
+ {
+ meta_char_pos = saved_meta_pos;
+ saved_meta_pos = -1;
+ }
+ value_level--;
+ /* No need to decrement in_fixed_width_font, since before
+ we are called with arg == END, the reader loop already
+ popped the brace stack, which restored in_fixed_width_font,
+ among other things. */
+
+ if (value)
+ {
+ /* We need to get past the closing brace since the value may
+ expand to a context-sensitive macro (e.g. @xref) and produce
+ spurious warnings */
+ input_text_offset++;
+ execute_string ("%s", value);
+ input_text_offset--;
+ }
+ else
+ {
+ warning (_("undefined flag: %s"), name);
+ add_word_args (_("{No value for `%s'}"), name);
+ }
+
+ free (name);
+ }
+}
+
+/* Set, clear, or conditionalize based on ACTION. */
+static void
+handle_variable (int action)
+{
+ char *name;
+
+ get_rest_of_line (0, &name);
+ /* If we hit the end of text in get_rest_of_line, backing up
+ input pointer will cause the last character of the last line
+ be pushed back onto the input, which is wrong. */
+ if (input_text_offset < input_text_length)
+ backup_input_pointer ();
+ handle_variable_internal (action, name);
+ free (name);
+}
+
+static void
+handle_variable_internal (int action, char *name)
+{
+ char *temp;
+ int delimiter, additional_text_present = 0;
+
+ /* Only the first word of NAME is a valid tag. */
+ temp = name;
+ delimiter = 0;
+ while (*temp && (delimiter || !whitespace (*temp)))
+ {
+/* #if defined (SET_WITH_EQUAL) */
+ if (*temp == '"' || *temp == '\'')
+ {
+ if (*temp == delimiter)
+ delimiter = 0;
+ else
+ delimiter = *temp;
+ }
+/* #endif SET_WITH_EQUAL */
+ temp++;
+ }
+
+ if (*temp)
+ additional_text_present++;
+
+ *temp = 0;
+
+ if (!*name)
+ line_error (_("%c%s requires a name"), COMMAND_PREFIX, command);
+ else
+ {
+ switch (action)
+ {
+ case SET:
+ {
+ char *value;
+
+#if defined (SET_WITH_EQUAL)
+ /* Allow a value to be saved along with a variable. The value is
+ the text following an `=' sign in NAME, if any is present. */
+
+ for (value = name; *value && *value != '='; value++);
+
+ if (*value)
+ *value++ = 0;
+
+ if (*value == '"' || *value == '\'')
+ {
+ value++;
+ value[strlen (value) - 1] = 0;
+ }
+
+#else /* !SET_WITH_EQUAL */
+ /* The VALUE of NAME is the remainder of the line sans
+ whitespace. */
+ if (additional_text_present)
+ {
+ value = temp + 1;
+ canon_white (value);
+ }
+ else
+ value = "";
+#endif /* !SET_WITH_VALUE */
+
+ set (name, value);
+ }
+ break;
+
+ case CLEAR:
+ clear (name);
+ break;
+
+ case IFSET:
+ case IFCLEAR:
+ /* If IFSET and NAME is not set, or if IFCLEAR and NAME is set,
+ read lines from the the file until we reach a matching
+ "@end CONDITION". This means that we only take note of
+ "@ifset/clear" and "@end" commands. */
+ {
+ char condition[8];
+ int condition_len;
+ int orig_line_number = line_number;
+
+ if (action == IFSET)
+ strcpy (condition, "ifset");
+ else
+ strcpy (condition, "ifclear");
+
+ condition_len = strlen (condition);
+
+ if ((action == IFSET && !set_p (name))
+ || (action == IFCLEAR && set_p (name)))
+ {
+ int level = 0, done = 0;
+
+ while (!done && input_text_offset < input_text_length)
+ {
+ char *freeable_line, *line;
+
+ get_rest_of_line (0, &freeable_line);
+
+ for (line = freeable_line; whitespace (*line); line++);
+
+ if (*line == COMMAND_PREFIX &&
+ (strncmp (line + 1, condition, condition_len) == 0))
+ level++;
+ else if (strncmp (line, "@end", 4) == 0)
+ {
+ char *cname = line + 4;
+ char *temp;
+
+ while (*cname && whitespace (*cname))
+ cname++;
+ temp = cname;
+
+ while (*temp && !whitespace (*temp))
+ temp++;
+ *temp = 0;
+
+ if (strcmp (cname, condition) == 0)
+ {
+ if (!level)
+ {
+ done = 1;
+ }
+ else
+ level--;
+ }
+ }
+ free (freeable_line);
+ }
+
+ if (!done)
+ file_line_error (input_filename, orig_line_number,
+ _("Reached eof before matching @end %s"),
+ condition);
+
+ /* We found the end of a false @ifset/ifclear. If we are
+ in a menu, back up over the newline that ends the ifset,
+ since that newline may also begin the next menu entry. */
+ break;
+ }
+ else
+ {
+ if (action == IFSET)
+ begin_insertion (ifset);
+ else
+ begin_insertion (ifclear);
+ }
+ }
+ break;
+ }
+ }
+}
+
+/* Execution of random text not in file. */
+typedef struct {
+ char *string; /* The string buffer. */
+ int size; /* The size of the buffer. */
+ int in_use; /* Nonzero means string currently in use. */
+} EXECUTION_STRING;
+
+static EXECUTION_STRING **execution_strings = NULL;
+static int execution_strings_index = 0;
+static int execution_strings_slots = 0;
+
+static EXECUTION_STRING *
+get_execution_string (int initial_size)
+{
+ int i = 0;
+ EXECUTION_STRING *es = NULL;
+
+ if (execution_strings)
+ {
+ for (i = 0; i < execution_strings_index; i++)
+ if (execution_strings[i] && (execution_strings[i]->in_use == 0))
+ {
+ es = execution_strings[i];
+ break;
+ }
+ }
+
+ if (!es)
+ {
+ if (execution_strings_index + 1 >= execution_strings_slots)
+ {
+ execution_strings = xrealloc
+ (execution_strings,
+ (execution_strings_slots += 3) * sizeof (EXECUTION_STRING *));
+ for (; i < execution_strings_slots; i++)
+ execution_strings[i] = NULL;
+ }
+
+ execution_strings[execution_strings_index] =
+ xmalloc (sizeof (EXECUTION_STRING));
+ es = execution_strings[execution_strings_index];
+ execution_strings_index++;
+
+ es->size = 0;
+ es->string = NULL;
+ es->in_use = 0;
+ }
+
+ if (initial_size > es->size)
+ {
+ es->string = xrealloc (es->string, initial_size);
+ es->size = initial_size;
+ }
+ return es;
+}
+
+/* Given a pointer to TEXT and its desired length NEW_LEN, find TEXT's
+ entry in the execution_strings[] array and change the .STRING and
+ .SIZE members of that entry as appropriate. */
+void
+maybe_update_execution_strings (char **text, unsigned int new_len)
+{
+ int i = 0;
+
+ if (execution_strings)
+ {
+ for (i = 0; i < execution_strings_index; i++)
+ if (execution_strings[i] && (execution_strings[i]->in_use == 1) &&
+ execution_strings[i]->string == *text)
+ {
+ /* Don't ever shrink the string storage in execution_strings[]!
+ execute_string assumes that it is always big enough to store
+ every possible execution_string, and will break if that's
+ not true. So we only enlarge the string storage if the
+ current size isn't big enough. */
+ if (execution_strings[i]->size < new_len)
+ {
+ execution_strings[i]->string =
+ *text = xrealloc (*text, new_len + 1);
+ execution_strings[i]->size = new_len + 1;
+ }
+ return;
+ }
+ }
+ /* We should *never* end up here, since if we are inside
+ execute_string, TEXT is always in execution_strings[]. */
+ abort ();
+}
+
+/* FIXME: this is an arbitrary limit. */
+#define EXECUTE_STRING_MAX 16*1024
+
+/* Execute the string produced by formatting the ARGs with FORMAT. This
+ is like submitting a new file with @include. */
+void
+#if defined (VA_FPRINTF) && __STDC__
+execute_string (char *format, ...)
+#else
+execute_string (format, va_alist)
+ char *format;
+ va_dcl
+#endif
+{
+ EXECUTION_STRING *es;
+ char *temp_string, *temp_input_filename;
+#ifdef VA_FPRINTF
+ va_list ap;
+#endif
+ int insertion_level_at_start = insertion_level;
+
+ es = get_execution_string (EXECUTE_STRING_MAX);
+ temp_string = es->string;
+ es->in_use = 1;
+
+ VA_START (ap, format);
+#ifdef VA_SPRINTF
+ VA_SPRINTF (temp_string, format, ap);
+#else
+ sprintf (temp_string, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif /* not VA_SPRINTF */
+ va_end (ap);
+
+ pushfile ();
+ input_text_offset = 0;
+ input_text = temp_string;
+ input_text_length = strlen (temp_string);
+ input_filename = xstrdup (input_filename);
+ temp_input_filename = input_filename;
+
+ executing_string++;
+ reader_loop ();
+
+ /* If insertion stack level changes during execution, that means a multiline
+ command is used inside braces or @section ... kind of commands. */
+ if (insertion_level_at_start != insertion_level && !executing_macro)
+ {
+ line_error (_("Multiline command %c%s used improperly"),
+ COMMAND_PREFIX,
+ command);
+ /* We also need to keep insertion_level intact to make sure warnings are
+ issued for @end ... command. */
+ while (insertion_level > insertion_level_at_start)
+ pop_insertion ();
+ }
+
+ popfile ();
+ executing_string--;
+ es->in_use = 0;
+ free (temp_input_filename);
+}
+
+
+/* Return what would be output for STR (in newly-malloced memory), i.e.,
+ expand Texinfo commands according to the current output format. If
+ IMPLICIT_CODE is set, expand @code{STR}. This is generally used for
+ short texts; filling, indentation, and html escapes are disabled. */
+
+char *
+expansion (char *str, int implicit_code)
+{
+ return maybe_escaped_expansion (str, implicit_code, 0);
+}
+
+
+/* Do HTML escapes according to DO_HTML_ESCAPE. Needed in
+ cm_printindex, q.v. */
+
+char *
+maybe_escaped_expansion (char *str, int implicit_code, int do_html_escape)
+{
+ char *result;
+
+ /* Inhibit indentation and filling, so that extra newlines
+ are not added to the expansion. (This is undesirable if
+ we write the expanded text to macro_expansion_output_stream.) */
+ int saved_filling_enabled = filling_enabled;
+ int saved_indented_fill = indented_fill;
+ int saved_no_indent = no_indent;
+ int saved_escape_html = escape_html;
+
+ filling_enabled = 0;
+ indented_fill = 0;
+ no_indent = 1;
+ escape_html = do_html_escape;
+
+ result = full_expansion (str, implicit_code);
+
+ filling_enabled = saved_filling_enabled;
+ indented_fill = saved_indented_fill;
+ no_indent = saved_no_indent;
+ escape_html = saved_escape_html;
+
+ return result;
+}
+
+
+/* Expand STR (or @code{STR} if IMPLICIT_CODE is nonzero). No change to
+ any formatting parameters -- filling, indentation, html escapes,
+ etc., are not reset. Always returned in new memory. */
+
+char *
+full_expansion (char *str, int implicit_code)
+{
+ int length;
+ char *result;
+
+ /* Inhibit any real output. */
+ int start = output_paragraph_offset;
+ int saved_paragraph_is_open = paragraph_is_open;
+ int saved_output_column = output_column;
+
+ /* More output state to save. */
+ int saved_meta_pos = meta_char_pos;
+ int saved_last_char = last_inserted_character;
+ int saved_last_nl = last_char_was_newline;
+
+ /* If we are called in the middle of processing a command, we need
+ to dup and save the global variable `command' (which holds the
+ name of this command), since the recursive reader loop will free
+ it from under our feet if it finds any macros in STR. */
+ char *saved_command = command ? xstrdup (command) : NULL;
+
+ inhibit_output_flushing ();
+ paragraph_is_open = 1;
+ if (strlen (str) > (implicit_code
+ ? EXECUTE_STRING_MAX - 1 - sizeof("@code{}")
+ : EXECUTE_STRING_MAX - 1))
+ line_error (_("`%.40s...' is too long for expansion; not expanded"), str);
+ else
+ execute_string (implicit_code ? "@code{%s}" : "%s", str);
+ uninhibit_output_flushing ();
+
+ /* Copy the expansion from the buffer. */
+ length = output_paragraph_offset - start;
+ result = xmalloc (1 + length);
+ memcpy (result, (char *) (output_paragraph + start), length);
+ result[length] = 0;
+
+ /* Pretend it never happened. */
+ free_and_clear (&command);
+ command = saved_command;
+
+ output_paragraph_offset = start;
+ paragraph_is_open = saved_paragraph_is_open;
+ output_column = saved_output_column;
+
+ meta_char_pos = saved_meta_pos;
+ last_inserted_character = saved_last_char;
+ last_char_was_newline = saved_last_nl;
+
+ return result;
+}
+
+
+/* Return text (info) expansion of STR no matter what the current output
+ format is. */
+
+char *
+text_expansion (char *str)
+{
+ char *ret;
+ int save_html = html;
+ int save_xml = xml;
+ int save_docbook = docbook;
+
+ html = 0;
+ xml = 0;
+ docbook = 0;
+ ret = expansion (str, 0);
+ html = save_html;
+ xml = save_xml;
+ docbook = save_docbook;
+
+ return ret;
+}
+
+
+/* Set the paragraph indentation variable to the value specified in STRING.
+ Values can be:
+ `asis': Don't change existing indentation.
+ `none': Remove existing indentation.
+ NUM: Indent NUM spaces at the starts of paragraphs.
+ If NUM is zero, we assume `none'.
+ Returns 0 if successful, or nonzero if STRING isn't one of the above. */
+int
+set_paragraph_indent (char *string)
+{
+ if (strcmp (string, "asis") == 0 || strcmp (string, _("asis")) == 0)
+ paragraph_start_indent = 0;
+ else if (strcmp (string, "none") == 0 || strcmp (string, _("none")) == 0)
+ paragraph_start_indent = -1;
+ else
+ {
+ if (sscanf (string, "%d", &paragraph_start_indent) != 1)
+ return -1;
+ else
+ {
+ if (paragraph_start_indent == 0)
+ paragraph_start_indent = -1;
+ }
+ }
+ return 0;
+}
diff --git a/Build/source/utils/texinfo/makeinfo/makeinfo.h b/Build/source/utils/texinfo/makeinfo/makeinfo.h
new file mode 100644
index 00000000000..de4d423708b
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/makeinfo.h
@@ -0,0 +1,386 @@
+/* makeinfo.h -- declarations for Makeinfo.
+ $Id: makeinfo.h,v 1.17 2004/11/30 02:03:23 karl Exp $
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
+ Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef MAKEINFO_H
+#define MAKEINFO_H
+
+#ifdef COMPILING_MAKEINFO
+# define DECLARE(type,var,init) type var = init
+#else
+# define DECLARE(type,var,init) extern type var
+#endif
+
+/* Hardcoded per GNU standards, not dependent on argv[0]. */
+DECLARE (char *, progname, "makeinfo");
+
+/* Nonzero means a string is in execution, as opposed to a file. */
+DECLARE (int, executing_string, 0);
+
+/* Nonzero means to inhibit writing macro expansions to the output
+ stream, because it has already been written. */
+DECLARE (int, me_inhibit_expansion, 0);
+
+/* Current output stream. */
+DECLARE (FILE *, output_stream, NULL);
+
+DECLARE (char *, pretty_output_filename, NULL);
+
+/* Current output file name. */
+DECLARE (char *, current_output_filename, NULL);
+
+/* Output paragraph buffer. */
+DECLARE (unsigned char *, output_paragraph, NULL);
+
+/* Offset into OUTPUT_PARAGRAPH. */
+DECLARE (int, output_paragraph_offset, 0);
+
+/* The output paragraph "cursor" horizontal position. */
+DECLARE (int, output_column, 0);
+
+/* Position in the output file. */
+DECLARE (int, output_position, 0);
+
+/* Number of lines in the output. */
+DECLARE (int, output_line_number, 1);
+DECLARE (int, node_line_number, 0);
+
+/* The offset into OUTPUT_PARAGRAPH where we have a meta character
+ produced by a markup such as @code or @dfn. */
+DECLARE (int, meta_char_pos, -1);
+
+/* Nonzero means output_paragraph contains text. */
+DECLARE (int, paragraph_is_open, 0);
+
+/* Nonzero means that `start_paragraph' MUST be called before we pay
+ any attention to `close_paragraph' calls. */
+DECLARE (int, must_start_paragraph, 0);
+
+/* Nonzero means that we have seen "@top" once already. */
+DECLARE (int, top_node_seen, 0);
+
+/* Nonzero means that we have seen a non-"@top" node already. */
+DECLARE (int, non_top_node_seen, 0);
+
+/* Nonzero indicates that indentation is temporarily turned off. */
+DECLARE (int, no_indent, 1);
+
+/* The amount of indentation to apply at the start of each line. */
+DECLARE (int, current_indent, 0);
+
+/* Nonzero means that we suppress the indentation of the first paragraph
+ following any section heading. */
+DECLARE (int, do_first_par_indent, 0);
+
+/* Amount by which @example indentation increases/decreases. */
+DECLARE (int, example_indentation_increment, 5);
+
+/* Amount by which @table, @defun, etc. indentation increases/decreases. */
+DECLARE (int, default_indentation_increment, 5);
+
+/* Amount by which xml indentation increases/decreases.
+ Zero means unnecessary whitespace is compressed. */
+DECLARE (int, xml_indentation_increment, 2);
+
+/* Nonzero indicates that filling a line also indents the new line. */
+DECLARE (int, indented_fill, 0);
+
+/* Nonzero means forcing output text to be flushright. */
+DECLARE (int, force_flush_right, 0);
+
+/* The column at which long lines are broken. */
+DECLARE (int, fill_column, 72);
+
+/* Nonzero means that words are not to be split, even in long lines. This
+ gets changed for cm_w (). */
+DECLARE (int, non_splitting_words, 0);
+
+/* Nonzero means that we are currently hacking the insides of an
+ insertion which would use a fixed width font. */
+DECLARE (int, in_fixed_width_font, 0);
+
+/* Nonzero if we are currently processing a multitable command */
+DECLARE (int, multitable_active, 0);
+
+/* Nonzero means that we're generating HTML. (--html) */
+DECLARE (int, html, 0);
+
+/* Nonzero means that we're generating XML. (--xml) */
+DECLARE (int, xml, 0);
+
+/* Nonzero means that we're generating DocBook. (--docbook) */
+DECLARE (int, docbook, 0);
+
+/* Nonzero means true 8-bit output for Info and plain text.
+ (--enable-encoding) */
+DECLARE (int, enable_encoding, 0);
+
+/* Nonzero means escape characters in HTML output. */
+DECLARE (int, escape_html, 1);
+
+/* Access key number for next menu entry to be generated (1 to 9, or 10 to
+ mean no access key) */
+DECLARE (int, next_menu_item_number, 1);
+
+/* Nonzero means that the use of paragraph_start_indent is inhibited.
+ @example uses this to line up the left columns of the example text.
+ A negative value for this variable is incremented each time it is used.
+ @noindent uses this to inhibit indentation for a single paragraph. */
+DECLARE (int, inhibit_paragraph_indentation, 0);
+
+/* Nonzero indicates that filling will take place on long lines. */
+DECLARE (int, filling_enabled, 1);
+
+/* The current node's node name. */
+DECLARE (char *, current_node, NULL);
+
+/* Command name in the process of being hacked. */
+DECLARE (char *, command, NULL);
+
+/* Nonzero if we have seen an @titlepage command. */
+DECLARE (int, titlepage_cmd_present, 0);
+
+/* @copying ... @end copying. */
+DECLARE (char *, copying_text, NULL);
+
+/* @documentdescription ... @end documentdescription. */
+DECLARE (const char *, document_description, NULL);
+
+/* Nonzero if the last character inserted has the syntax class of NEWLINE. */
+DECLARE (int, last_char_was_newline, 1);
+
+/* The current input file state. */
+DECLARE (char *, input_filename, (char *)NULL);
+DECLARE (char *, input_text, (char *)NULL);
+DECLARE (int, input_text_length, 0);
+DECLARE (int, input_text_offset, 0);
+DECLARE (int, line_number, 0);
+DECLARE (char *, toplevel_output_filename, NULL);
+#define curchar() input_text[input_text_offset]
+
+/* A colon separated list of directories to search for files included
+ with @include. This can be controlled with the `-I' option to makeinfo. */
+DECLARE (char *, include_files_path, NULL);
+
+/* The filename of the current input file. This is never freed. */
+DECLARE (char *, node_filename, NULL);
+
+/* Name of CSS file to include, if any. (--css-include). */
+DECLARE (char *, css_include, NULL);
+
+/* Nonzero means do not output "Node: Foo" for node separations, that
+ is, generate plain text. (--no-headers) */
+DECLARE (int, no_headers, 0);
+
+/* Nonzero means that we process @docbook and @ifdocbook. (--ifdocbook) */
+DECLARE (int, process_docbook, 0);
+
+/* Nonzero means that we process @html and @rawhtml even when not
+ generating HTML. (--ifhtml) */
+DECLARE (int, process_html, 0);
+
+/* Positive means process @ifinfo (even if not generating Info);
+ zero means don't process @ifinfo (even if we are);
+ -1 means we don't know yet. (--ifinfo) */
+DECLARE (int, process_info, -1);
+
+/* Positive means process @ifplaintext (even if not generating plain text);
+ zero means we don't process @ifplaintext (even if we are);
+ -1 means we don't know yet. (--ifplaintext) */
+DECLARE (int, process_plaintext, -1);
+
+/* Nonzero means that we process @tex and @iftex. (--iftex) */
+DECLARE (int, process_tex, 0);
+
+/* Nonzero means that we process @xml and @ifxml. (--ifxml) */
+DECLARE (int, process_xml, 0);
+
+/* Maximum number of references to a single node before complaining.
+ (--reference-limit) */
+DECLARE (int, reference_warning_limit, 1000);
+
+/* Default is to check node references. (--no-validate) */
+DECLARE (int, validating, 1);
+
+/* Nonzero means print information about what is going on. (--verbose) */
+DECLARE (int, verbose_mode, 0);
+
+/* Nonzero means prefix each @chapter, ... with a number like
+ 1, 1.1, etc. (--number-sections) */
+DECLARE (int, number_sections, 1);
+
+/* Nonzero means split size. When zero, DEFAULT_SPLIT_SIZE is used. */
+DECLARE (int, split_size, 0);
+
+/* Nonzero means expand node names and references while validating.
+ This will avoid errors when the Texinfo document uses features
+ like @@ and @value inconsistently in node names, but will slow
+ the program by about 80%. You HAVE been warned. */
+DECLARE (int, expensive_validation, 0);
+
+/* C's standard macros don't check to make sure that the characters being
+ changed are within range. So I have to check explicitly. */
+
+#define coerce_to_upper(c) ((islower(c) ? toupper(c) : (c)))
+#define coerce_to_lower(c) ((isupper(c) ? tolower(c) : (c)))
+
+#define control_character_bit 0x40 /* %01000000, must be off. */
+#define meta_character_bit 0x080/* %10000000, must be on. */
+#define CTL(c) ((c) & (~control_character_bit))
+#define UNCTL(c) coerce_to_upper(((c)|control_character_bit))
+#define META(c) ((c) | (meta_character_bit))
+#define UNMETA(c) ((c) & (~meta_character_bit))
+
+#define whitespace(c) ((c) == '\t' || (c) == ' ')
+#define sentence_ender(c) ((c) == '.' || (c) == '?' || (c) == '!')
+#define cr_or_whitespace(c) (whitespace(c) || (c) == '\r' || (c) == '\n')
+
+#ifndef isletter
+#define isletter(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
+#endif
+
+#ifndef isupper
+#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#endif
+
+#ifndef isdigit
+#define isdigit(c) ((c) >= '0' && (c) <= '9')
+#endif
+
+#ifndef digit_value
+#define digit_value(c) ((c) - '0')
+#endif
+
+/* These characters are not really HTML-safe (with strict XHTML),
+ and also there are possible collisions. That's the whole reason we
+ designed a new conversion scheme in the first place. But we
+ nevertheless need to generate the old names. See
+ `add_escaped_anchor_name' in html.c. */
+#define OLD_HTML_SAFE "$-_.+!*'()"
+#define OLD_URL_SAFE_CHAR(ch) (strchr (OLD_HTML_SAFE, ch))
+
+/* For the current/stable scheme. */
+#define URL_SAFE_CHAR(ch) (isalnum (ch))
+
+#define COMMAND_PREFIX '@'
+
+#define END_VERBATIM "end verbatim"
+
+/* Stuff for splitting large files. The numbers for Emacs
+ texinfo-format-buffer are much smaller, but memory capacities have
+ increased so much, 50k info files seem a bit tiny these days. */
+#define DEFAULT_SPLIT_SIZE 300000
+DECLARE (int, splitting, 1); /* Defaults to true for now. */
+
+#define skip_whitespace() \
+ while ((input_text_offset != input_text_length) && \
+ whitespace (curchar())) \
+ input_text_offset++
+
+#define skip_whitespace_and_newlines() \
+ do { \
+ while (input_text_offset != input_text_length \
+ && cr_or_whitespace (curchar ())) \
+ { \
+ if (curchar () == '\n') \
+ line_number++; \
+ input_text_offset++; \
+ } \
+ } while (0)
+
+/* Return nonzero if STRING is the text at input_text + input_text_offset,
+ else zero. */
+#define looking_at(string) \
+ (strncmp (input_text + input_text_offset, string, strlen (string)) == 0)
+
+/* Any list with a member named `next'. */
+typedef struct generic_list {
+ struct generic_list *next;
+} GENERIC_LIST;
+
+/* Reverse the order of a list. */
+extern GENERIC_LIST * reverse_list (GENERIC_LIST *list);
+
+/* Possibly return Local Variables trailer for Info output. */
+extern char *info_trailer (void),
+ *expansion (char *str, int implicit_code),
+ *text_expansion (char *str),
+ *maybe_escaped_expansion (char *str, int implicit_code, int do_escape_html),
+ *full_expansion (char *str, int implicit_code);
+
+extern void free_and_clear (char **pointer),
+ add_word (char *string),
+ add_char (int character),
+ add_meta_char (int character),
+ close_single_paragraph (void),
+ insert_string (const char *),
+ insert (int character),
+ get_rest_of_line (int expand, char **string),
+ add_html_block_elt (char *string),
+ get_until_in_braces (char *match, char **string),
+ get_until_in_line (int expand, char *match, char **string),
+ canon_white (char *string),
+ discard_until (char *string),
+ indent (int amount),
+ kill_self_indent (int count),
+ backup_input_pointer (void),
+ inhibit_output_flushing (void),
+ uninhibit_output_flushing (void),
+ flush_output (void),
+ start_paragraph (void),
+ close_paragraph (void),
+ close_insertion_paragraph (void),
+ init_paragraph (void),
+ ignore_blank_line (void),
+ reader_loop (void),
+ discard_braces (void),
+ replace_with_expansion (int from, int *to),
+ fix_whitespace (char *string),
+ add_html_elt (char *string);
+
+extern int get_until (char *match, char **string),
+ set_paragraph_indent (char *string),
+ self_delimiting (int character),
+ search_forward (char *string, int from),
+ search_forward_until_pos (char *string, int from, int end_pos),
+ next_nonwhitespace_character (void),
+ fs_error (char *filename);
+
+#if defined (VA_FPRINTF) && __STDC__
+/* Unfortunately we must use prototypes if we are to use <stdarg.h>. */
+extern void add_word_args (const char *, ...),
+ add_html_block_elt_args (const char *, ...),
+ execute_string (char *, ...),
+ warning (const char *format, ...),
+ error (const char *format, ...),
+ line_error (const char *format, ...),
+ file_line_error (char *infile, int lno, const char *format, ...);
+#else
+extern void add_word_args (),
+ add_html_block_elt_args (),
+ execute_string (),
+ warning (),
+ error (),
+ line_error (),
+ file_line_error ();
+#endif /* no prototypes */
+
+#endif /* not MAKEINFO_H */
diff --git a/Build/source/utils/texinfo/makeinfo/makeinfo.rc b/Build/source/utils/texinfo/makeinfo/makeinfo.rc
new file mode 100644
index 00000000000..1c4052c2161
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/makeinfo.rc
@@ -0,0 +1,36 @@
+/* makeinfo.rc: version number -*- C++ -*-
+
+ Copyright (C) 1996-2003 Fabrice Popineau <fabrice.popineau@supelec.fr>
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ This file is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this file; if not, write to the Free Software
+ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#include <texlive-version.h>
+
+#define VER_FILEVERSION TEXLIVE_MAJOR_VERSION,TEXLIVE_MINOR_VERSION,TEXLIVE_BETA_NUMBER,TEXLIVE_ALPHA_NUMBER
+#define VER_FILEVERSION_STR TEXLIVE_PRODUCTVERSION_STR " makeinfo 4.3a"
+
+#define VER_INTERNALNAME_STR "makeinfo"
+#define VER_ORIGINALFILENAME_STR "makeinfo.exe"
+
+#define VER_LEGALCOPYRIGHT_STR "Copyright (C) 1987, 1992-2003 Free Software Foundation, Inc."
+
+#define VER_FILEDESCRIPTION_STR "Texinfo Converter"
+
+#define VER_COMPANYNAME_STR "Free Software Foundation, Inc."
+
+#include <texlive.version>
+
+/* makeinfo.rc ends here */
diff --git a/Build/source/utils/texinfo/makeinfo/multi.c b/Build/source/utils/texinfo/makeinfo/multi.c
new file mode 100644
index 00000000000..06c548fb5e9
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/multi.c
@@ -0,0 +1,638 @@
+/* multi.c -- multiple-column tables (@multitable) for makeinfo.
+ $Id: multi.c,v 1.8 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by phr@gnu.org (Paul Rubin). */
+
+#include "system.h"
+#include "cmds.h"
+#include "insertion.h"
+#include "makeinfo.h"
+#include "multi.h"
+#include "xml.h"
+
+#define MAXCOLS 100 /* remove this limit later @@ */
+
+
+/*
+ * Output environments. This is a hack grafted onto existing
+ * structure. The "output environment" used to consist of the
+ * global variables `output_paragraph', `fill_column', etc.
+ * Routines like add_char would manipulate these variables.
+ *
+ * Now, when formatting a multitable, we maintain separate environments
+ * for each column. That way we can build up the columns separately
+ * and write them all out at once. The "current" output environment"
+ * is still kept in those global variables, so that the old output
+ * routines don't have to change. But we provide routines to save
+ * and restore these variables in an "environment table". The
+ * `select_output_environment' function switches from one output
+ * environment to another.
+ *
+ * Environment #0 (i.e., element #0 of the table) is the regular
+ * environment that is used when we're not formatting a multitable.
+ *
+ * Environment #N (where N = 1,2,3,...) is the env. for column #N of
+ * the table, when a multitable is active.
+ */
+
+/* contents of an output environment */
+/* some more vars may end up being needed here later @@ */
+struct env
+{
+ unsigned char *output_paragraph;
+ int output_paragraph_offset;
+ int meta_char_pos;
+ int output_column;
+ int paragraph_is_open;
+ int current_indent;
+ int fill_column;
+} envs[MAXCOLS]; /* the environment table */
+
+/* index in environment table of currently selected environment */
+static int current_env_no;
+
+/* current column number */
+static int current_column_no;
+
+/* We need to make a difference between template based widths and
+ @columnfractions for HTML tables' sake. Sigh. */
+static int seen_column_fractions;
+
+/* column number of last column in current multitable */
+static int last_column;
+
+/* flags indicating whether horizontal and vertical separators need
+ to be drawn, separating rows and columns in the current multitable. */
+static int hsep, vsep;
+
+/* whether this is the first row. */
+static int first_row;
+
+/* Called to handle a {...} template on the @multitable line.
+ We're at the { and our first job is to find the matching }; as a side
+ effect, we change *PARAMS to point to after it. Our other job is to
+ expand the template text and return the width of that string. */
+static unsigned
+find_template_width (char **params)
+{
+ char *template, *xtemplate;
+ unsigned len;
+ char *start = *params;
+ int brace_level = 0;
+
+ /* The first character should be a {. */
+ if (!params || !*params || **params != '{')
+ {
+ line_error ("find_template width internal error: passed %s",
+ params ? *params : "null");
+ return 0;
+ }
+
+ do
+ {
+ if (**params == '{' && (*params == start || (*params)[-1] != '@'))
+ brace_level++;
+ else if (**params == '}' && (*params)[-1] != '@')
+ brace_level--;
+ else if (**params == 0)
+ {
+ line_error (_("Missing } in @multitable template"));
+ return 0;
+ }
+ (*params)++;
+ }
+ while (brace_level > 0);
+
+ template = substring (start + 1, *params - 1); /* omit braces */
+ xtemplate = expansion (template, 0);
+ len = strlen (xtemplate);
+
+ free (template);
+ free (xtemplate);
+
+ return len;
+}
+
+/* Direct current output to environment number N. Used when
+ switching work from one column of a multitable to the next.
+ Returns previous environment number. */
+static int
+select_output_environment (int n)
+{
+ struct env *e = &envs[current_env_no];
+ int old_env_no = current_env_no;
+
+ /* stash current env info from global vars into the old environment */
+ e->output_paragraph = output_paragraph;
+ e->output_paragraph_offset = output_paragraph_offset;
+ e->meta_char_pos = meta_char_pos;
+ e->output_column = output_column;
+ e->paragraph_is_open = paragraph_is_open;
+ e->current_indent = current_indent;
+ e->fill_column = fill_column;
+
+ /* now copy new environment into global vars */
+ current_env_no = n;
+ e = &envs[current_env_no];
+ output_paragraph = e->output_paragraph;
+ output_paragraph_offset = e->output_paragraph_offset;
+ meta_char_pos = e->meta_char_pos;
+ output_column = e->output_column;
+ paragraph_is_open = e->paragraph_is_open;
+ current_indent = e->current_indent;
+ fill_column = e->fill_column;
+ return old_env_no;
+}
+
+/* Initialize environment number ENV_NO, of width WIDTH.
+ The idea is that we're going to use one environment for each column of
+ a multitable, so we can build them up separately and print them
+ all out at the end. */
+static int
+setup_output_environment (int env_no, int width)
+{
+ int old_env = select_output_environment (env_no);
+
+ /* clobber old environment and set width of new one */
+ init_paragraph ();
+
+ /* make our change */
+ fill_column = width;
+
+ /* Save new environment and restore previous one. */
+ select_output_environment (old_env);
+
+ return env_no;
+}
+
+/* Read the parameters for a multitable from the current command
+ line, save the parameters away, and return the
+ number of columns. */
+static int
+setup_multitable_parameters (void)
+{
+ char *params = insertion_stack->item_function;
+ int nchars;
+ float columnfrac;
+ char command[200]; /* xx no fixed limits */
+ int i = 1;
+
+ /* We implement @hsep and @vsep even though TeX doesn't.
+ We don't get mixing of @columnfractions and templates right,
+ but TeX doesn't either. */
+ hsep = vsep = 0;
+
+ /* Assume no @columnfractions per default. */
+ seen_column_fractions = 0;
+
+ while (*params) {
+ while (whitespace (*params))
+ params++;
+
+ if (*params == '@') {
+ sscanf (params, "%200s", command);
+ nchars = strlen (command);
+ params += nchars;
+ if (strcmp (command, "@hsep") == 0)
+ hsep++;
+ else if (strcmp (command, "@vsep") == 0)
+ vsep++;
+ else if (strcmp (command, "@columnfractions") == 0) {
+ seen_column_fractions = 1;
+ /* Clobber old environments and create new ones, starting at #1.
+ Environment #0 is the normal output, so don't mess with it. */
+ for ( ; i <= MAXCOLS; i++) {
+ if (sscanf (params, "%f", &columnfrac) < 1)
+ goto done;
+ /* Unfortunately, can't use %n since m68k-hp-bsd libc (at least)
+ doesn't support it. So skip whitespace (preceding the
+ number) and then non-whitespace (the number). */
+ while (*params && (*params == ' ' || *params == '\t'))
+ params++;
+ /* Hmm, but what about @columnfractions 3foo. Oh well,
+ it's invalid input anyway. */
+ while (*params && *params != ' ' && *params != '\t'
+ && *params != '\n' && *params != '@')
+ params++;
+
+ {
+ /* For html/xml/docbook, translate fractions into integer
+ percentages, adding .005 to avoid rounding problems. For
+ info, we want the character width. */
+ int width = xml || html ? (columnfrac + .005) * 100
+ : (columnfrac * (fill_column - current_indent) + .5);
+ setup_output_environment (i, width);
+ }
+ }
+ }
+
+ } else if (*params == '{') {
+ unsigned template_width = find_template_width (&params);
+
+ /* This gives us two spaces between columns. Seems reasonable.
+ How to take into account current_indent here? */
+ setup_output_environment (i++, template_width + 2);
+
+ } else {
+ warning (_("ignoring stray text `%s' after @multitable"), params);
+ break;
+ }
+ }
+
+done:
+ flush_output ();
+ inhibit_output_flushing ();
+
+ last_column = i - 1;
+ return last_column;
+}
+
+/* Output a row. Calls insert, but also flushes the buffered output
+ when we see a newline, since in multitable every line is a separate
+ paragraph. */
+static void
+out_char (int ch)
+{
+ if (html || xml)
+ add_char (ch);
+ else
+ {
+ int env = select_output_environment (0);
+ insert (ch);
+ if (ch == '\n')
+ {
+ uninhibit_output_flushing ();
+ flush_output ();
+ inhibit_output_flushing ();
+ }
+ select_output_environment (env);
+ }
+}
+
+
+static void
+draw_horizontal_separator (void)
+{
+ int i, j, s;
+
+ if (html)
+ {
+ add_word ("<hr>");
+ return;
+ }
+ if (xml)
+ return;
+
+ for (s = 0; s < envs[0].current_indent; s++)
+ out_char (' ');
+ if (vsep)
+ out_char ('+');
+ for (i = 1; i <= last_column; i++) {
+ for (j = 0; j <= envs[i].fill_column; j++)
+ out_char ('-');
+ if (vsep)
+ out_char ('+');
+ }
+ out_char (' ');
+ out_char ('\n');
+}
+
+
+/* multitable strategy:
+ for each item {
+ for each column in an item {
+ initialize a new paragraph
+ do ordinary formatting into the new paragraph
+ save the paragraph away
+ repeat if there are more paragraphs in the column
+ }
+ dump out the saved paragraphs and free the storage
+ }
+
+ For HTML we construct a simple HTML 3.2 table with <br>s inserted
+ to help non-tables browsers. `@item' inserts a <tr> and `@tab'
+ inserts <td>; we also try to close <tr>. The only real
+ alternative is to rely on the info formatting engine and present
+ preformatted text. */
+
+void
+do_multitable (void)
+{
+ int ncolumns;
+
+ if (multitable_active)
+ {
+ line_error ("Multitables cannot be nested");
+ return;
+ }
+
+ close_single_paragraph ();
+
+ if (xml)
+ {
+ xml_no_para = 1;
+ if (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ }
+
+ /* scan the current item function to get the field widths
+ and number of columns, and set up the output environment list
+ accordingly. */
+ ncolumns = setup_multitable_parameters ();
+ first_row = 1;
+
+ /* <p> for non-tables browsers. @multitable implicitly ends the
+ current paragraph, so this is ok. */
+ if (html)
+ add_html_block_elt ("<p><table summary=\"\">");
+ /* else if (docbook)*/ /* 05-08 */
+ else if (xml)
+ {
+ int *widths = xmalloc (ncolumns * sizeof (int));
+ int i;
+ for (i=0; i<ncolumns; i++)
+ widths[i] = envs[i+1].fill_column;
+ xml_begin_multitable (ncolumns, widths);
+ free (widths);
+ }
+
+ if (hsep)
+ draw_horizontal_separator ();
+
+ /* The next @item command will direct stdout into the first column
+ and start processing. @tab will then switch to the next column,
+ and @item will flush out the saved output and return to the first
+ column. Environment #1 is the first column. (Environment #0 is
+ the normal output) */
+
+ ++multitable_active;
+}
+
+/* advance to the next environment number */
+static void
+nselect_next_environment (void)
+{
+ if (current_env_no >= last_column) {
+ line_error (_("Too many columns in multitable item (max %d)"), last_column);
+ return;
+ }
+ select_output_environment (current_env_no + 1);
+}
+
+
+/* do anything needed at the beginning of processing a
+ multitable column. */
+static void
+init_column (void)
+{
+ /* don't indent 1st paragraph in the item */
+ cm_noindent ();
+
+ /* throw away possible whitespace after @item or @tab command */
+ skip_whitespace ();
+}
+
+static void
+output_multitable_row (void)
+{
+ /* offset in the output paragraph of the next char needing
+ to be output for that column. */
+ int offset[MAXCOLS];
+ int i, j, s, remaining;
+ int had_newline = 0;
+
+ for (i = 0; i <= last_column; i++)
+ offset[i] = 0;
+
+ /* select the current environment, to make sure the env variables
+ get updated */
+ select_output_environment (current_env_no);
+
+#define CHAR_ADDR(n) (offset[i] + (n))
+#define CHAR_AT(n) (envs[i].output_paragraph[CHAR_ADDR(n)])
+
+ /* remove trailing whitespace from each column */
+ for (i = 1; i <= last_column; i++) {
+ if (envs[i].output_paragraph_offset)
+ while (cr_or_whitespace (CHAR_AT (envs[i].output_paragraph_offset - 1)))
+ envs[i].output_paragraph_offset--;
+
+ if (i == current_env_no)
+ output_paragraph_offset = envs[i].output_paragraph_offset;
+ }
+
+ /* read the current line from each column, outputting them all
+ pasted together. Do this til all lines are output from all
+ columns. */
+ for (;;) {
+ remaining = 0;
+ /* first, see if there is any work to do */
+ for (i = 1; i <= last_column; i++) {
+ if (CHAR_ADDR (0) < envs[i].output_paragraph_offset) {
+ remaining = 1;
+ break;
+ }
+ }
+ if (!remaining)
+ break;
+
+ for (s = 0; s < envs[0].current_indent; s++)
+ out_char (' ');
+
+ if (vsep)
+ out_char ('|');
+
+ for (i = 1; i <= last_column; i++) {
+ for (s = 0; s < envs[i].current_indent; s++)
+ out_char (' ');
+ for (j = 0; CHAR_ADDR (j) < envs[i].output_paragraph_offset; j++) {
+ if (CHAR_AT (j) == '\n')
+ break;
+ out_char (CHAR_AT (j));
+ }
+ offset[i] += j + 1; /* skip last text plus skip the newline */
+
+ /* Do not output trailing blanks if we're in the last column and
+ there will be no trailing |. */
+ if (i < last_column && !vsep)
+ for (; j <= envs[i].fill_column; j++)
+ out_char (' ');
+ if (vsep)
+ out_char ('|'); /* draw column separator */
+ }
+ out_char ('\n'); /* end of line */
+ had_newline = 1;
+ }
+
+ /* If completely blank item, get blank line despite no other output. */
+ if (!had_newline)
+ out_char ('\n'); /* end of line */
+
+ if (hsep)
+ draw_horizontal_separator ();
+
+ /* Now dispose of the buffered output. */
+ for (i = 1; i <= last_column; i++) {
+ select_output_environment (i);
+ init_paragraph ();
+ }
+}
+
+int after_headitem = 0;
+int headitem_row = 0;
+
+/* start a new item (row) of a multitable */
+int
+multitable_item (void)
+{
+ if (!multitable_active) {
+ line_error ("multitable_item internal error: no active multitable");
+ xexit (1);
+ }
+
+ current_column_no = 1;
+
+ if (html)
+ {
+ if (!first_row)
+ /* <br> for non-tables browsers. */
+ add_word_args ("<br></%s></tr>", after_headitem ? "th" : "td");
+
+ if (seen_column_fractions)
+ add_word_args ("<tr align=\"left\"><%s valign=\"top\" width=\"%d%%\">",
+ headitem_flag ? "th" : "td",
+ envs[current_column_no].fill_column);
+ else
+ add_word_args ("<tr align=\"left\"><%s valign=\"top\">",
+ headitem_flag ? "th" : "td");
+
+ if (headitem_flag)
+ after_headitem = 1;
+ else
+ after_headitem = 0;
+ first_row = 0;
+ headitem_row = headitem_flag;
+ headitem_flag = 0;
+ return 0;
+ }
+ /* else if (docbook)*/ /* 05-08 */
+ else if (xml)
+ {
+ xml_end_multitable_row (first_row);
+ if (headitem_flag)
+ after_headitem = 1;
+ else
+ after_headitem = 0;
+ first_row = 0;
+ headitem_flag = 0;
+ return 0;
+ }
+ first_row = 0;
+
+ if (current_env_no > 0) {
+ output_multitable_row ();
+ }
+ /* start at column 1 */
+ select_output_environment (1);
+ if (!output_paragraph) {
+ line_error (_("[unexpected] cannot select column #%d in multitable"),
+ current_env_no);
+ xexit (1);
+ }
+
+ init_column ();
+
+ if (headitem_flag)
+ hsep = 1;
+ else
+ hsep = 0;
+
+ if (headitem_flag)
+ after_headitem = 1;
+ else
+ after_headitem = 0;
+ headitem_flag = 0;
+
+ return 0;
+}
+
+#undef CHAR_AT
+#undef CHAR_ADDR
+
+/* select a new column in current row of multitable */
+void
+cm_tab (void)
+{
+ if (!multitable_active)
+ error (_("ignoring @tab outside of multitable"));
+
+ current_column_no++;
+
+ if (html)
+ {
+ if (seen_column_fractions)
+ add_word_args ("</%s><%s valign=\"top\" width=\"%d%%\">",
+ headitem_row ? "th" : "td",
+ headitem_row ? "th" : "td",
+ envs[current_column_no].fill_column);
+ else
+ add_word_args ("</%s><%s valign=\"top\">",
+ headitem_row ? "th" : "td",
+ headitem_row ? "th" : "td");
+ }
+ /* else if (docbook)*/ /* 05-08 */
+ else if (xml)
+ xml_end_multitable_column ();
+ else
+ nselect_next_environment ();
+
+ init_column ();
+}
+
+/* close a multitable, flushing its output and resetting
+ whatever needs resetting */
+void
+end_multitable (void)
+{
+ if (!html && !docbook)
+ output_multitable_row ();
+
+ /* Multitables cannot be nested. Otherwise, we'd have to save the
+ previous output environment number on a stack somewhere, and then
+ restore to that environment. */
+ select_output_environment (0);
+ multitable_active = 0;
+ uninhibit_output_flushing ();
+ close_insertion_paragraph ();
+
+ if (html)
+ add_word_args ("<br></%s></tr></table>\n", headitem_row ? "th" : "td");
+ /* else if (docbook)*/ /* 05-08 */
+ else if (xml)
+ xml_end_multitable ();
+
+#if 0
+ printf (_("** Multicolumn output from last row:\n"));
+ for (i = 1; i <= last_column; i++) {
+ select_output_environment (i);
+ printf (_("* column #%d: output = %s\n"), i, output_paragraph);
+ }
+#endif
+}
diff --git a/Build/source/utils/texinfo/makeinfo/multi.h b/Build/source/utils/texinfo/makeinfo/multi.h
new file mode 100644
index 00000000000..64311e0f2be
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/multi.h
@@ -0,0 +1,28 @@
+/* multi.h -- declarations for multi.c.
+ $Id: multi.h,v 1.1 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef MULTI_H
+#define MULTI_H
+
+extern void do_multitable (void);
+extern void end_multitable (void);
+extern int multitable_item (void);
+
+#endif /* !MULTI_H */
diff --git a/Build/source/utils/texinfo/makeinfo/node.c b/Build/source/utils/texinfo/makeinfo/node.c
new file mode 100644
index 00000000000..07a37fede2f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/node.c
@@ -0,0 +1,1943 @@
+/* node.c -- nodes for Texinfo.
+ $Id: node.c,v 1.27 2004/12/20 23:56:07 karl Exp $
+
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "cmds.h"
+#include "files.h"
+#include "float.h"
+#include "footnote.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "node.h"
+#include "html.h"
+#include "sectioning.h"
+#include "insertion.h"
+#include "xml.h"
+
+/* See comments in node.h. */
+NODE_REF *node_references = NULL;
+NODE_REF *node_node_references = NULL;
+TAG_ENTRY *tag_table = NULL;
+int node_number = -1;
+int node_order = 0;
+int current_section = 0;
+int outstanding_node = 0;
+
+/* Adding nodes, and making tags. */
+
+/* Start a new tag table. */
+void
+init_tag_table (void)
+{
+ while (tag_table)
+ {
+ TAG_ENTRY *temp = tag_table;
+ free (temp->node);
+ free (temp->prev);
+ free (temp->next);
+ free (temp->up);
+ tag_table = tag_table->next_ent;
+ free (temp);
+ }
+}
+
+/* Write out the contents of the existing tag table.
+ INDIRECT_P says how to format the output (it depends on whether the
+ table is direct or indirect). */
+static void
+write_tag_table_internal (int indirect_p)
+{
+ TAG_ENTRY *node;
+ int old_indent = no_indent;
+
+ if (xml)
+ {
+ flush_output ();
+ return;
+ }
+
+ no_indent = 1;
+ filling_enabled = 0;
+ must_start_paragraph = 0;
+ close_paragraph ();
+
+ if (!indirect_p)
+ {
+ no_indent = 1;
+ insert ('\n');
+ }
+
+ add_word_args ("\037\nTag Table:\n%s", indirect_p ? "(Indirect)\n" : "");
+
+ /* Do not collapse -- to -, etc., in node names. */
+ in_fixed_width_font++;
+
+ for (node = tag_table; node; node = node->next_ent)
+ {
+ if (node->flags & TAG_FLAG_ANCHOR)
+ { /* This reference is to an anchor. */
+ execute_string ("Ref: %s", node->node);
+ }
+ else
+ { /* This reference is to a node. */
+ execute_string ("Node: %s", node->node);
+ }
+ add_word_args ("\177%d\n", node->position);
+ }
+
+ add_word ("\037\nEnd Tag Table\n");
+
+ /* Do not collapse -- to -, etc., in node names. */
+ in_fixed_width_font--;
+
+ flush_output ();
+ no_indent = old_indent;
+}
+
+void
+write_tag_table (char *filename)
+{
+ output_stream = fopen (filename, "a");
+ if (!output_stream)
+ {
+ fs_error (filename);
+ return;
+ }
+
+ write_tag_table_internal (0); /* Not indirect. */
+
+ if (fclose (output_stream) != 0)
+ fs_error (filename);
+}
+
+static void
+write_tag_table_indirect (void)
+{
+ write_tag_table_internal (1);
+}
+
+/* Convert "top" and friends into "Top". */
+static void
+normalize_node_name (char *string)
+{
+ if (strcasecmp (string, "Top") == 0)
+ strcpy (string, "Top");
+}
+
+static char *
+get_node_token (int expand)
+{
+ char *string;
+
+ get_until_in_line (expand, ",", &string);
+
+ if (curchar () == ',')
+ input_text_offset++;
+
+ fix_whitespace (string);
+
+ /* Force all versions of "top" to be "Top". */
+ normalize_node_name (string);
+
+ return string;
+}
+
+/* Expand any macros and other directives in a node name, and
+ return the expanded name as an malloc'ed string. */
+char *
+expand_node_name (char *node)
+{
+ char *result = node;
+
+ if (node)
+ {
+ /* Don't expand --, `` etc., in case somebody will want
+ to print the result. */
+ in_fixed_width_font++;
+ result = expansion (node, 0);
+ in_fixed_width_font--;
+ fix_whitespace (result);
+ normalize_node_name (result);
+ }
+ return result;
+}
+
+/* Look up NAME in the tag table, and return the associated
+ tag_entry. If the node is not in the table return NULL. */
+TAG_ENTRY *
+find_node (char *name)
+{
+ TAG_ENTRY *tag = tag_table;
+ char *expanded_name;
+ char n1 = name[0];
+
+ while (tag)
+ {
+ if (tag->node[0] == n1 && strcmp (tag->node, name) == 0)
+ return tag;
+ tag = tag->next_ent;
+ }
+
+ if (!expensive_validation)
+ return NULL;
+
+ /* Try harder. Maybe TAG_TABLE has the expanded NAME, or maybe NAME
+ is expanded while TAG_TABLE has its unexpanded form. This may
+ slow down the search, but if they want this feature, let them
+ pay! If they want it fast, they should write every node name
+ consistently (either always expanded or always unexpaned). */
+ expanded_name = expand_node_name (name);
+ for (tag = tag_table; tag; tag = tag->next_ent)
+ {
+ if (STREQ (tag->node, expanded_name))
+ break;
+ /* If the tag name doesn't have the command prefix, there's no
+ chance it could expand into anything but itself. */
+ if (strchr (tag->node, COMMAND_PREFIX))
+ {
+ char *expanded_node = expand_node_name (tag->node);
+
+ if (STREQ (expanded_node, expanded_name))
+ {
+ free (expanded_node);
+ break;
+ }
+ free (expanded_node);
+ }
+ }
+ free (expanded_name);
+ return tag;
+}
+
+/* Look in the tag table for a node whose file name is FNAME, and
+ return the associated tag_entry. If there's no such node in the
+ table, return NULL. */
+static TAG_ENTRY *
+find_node_by_fname (char *fname)
+{
+ TAG_ENTRY *tag = tag_table;
+ while (tag)
+ {
+ if (tag->html_fname && FILENAME_CMP (tag->html_fname, fname) == 0)
+ return tag;
+ tag = tag->next_ent;
+ }
+
+ return tag;
+}
+
+/* Remember next, prev, etc. references in a @node command, where we
+ don't care about most of the entries. */
+static void
+remember_node_node_reference (char *node)
+{
+ NODE_REF *temp = xmalloc (sizeof (NODE_REF));
+ int number;
+
+ if (!node) return;
+ temp->next = node_node_references;
+ temp->node = xstrdup (node);
+ temp->type = followed_reference;
+ number = number_of_node (node);
+ if (number)
+ temp->number = number; /* Already assigned. */
+ else
+ {
+ node_number++;
+ temp->number = node_number;
+ }
+ node_node_references = temp;
+}
+
+/* Remember NODE and associates. */
+static void
+remember_node (char *node, char *prev, char *next, char *up,
+ int position, int line_no, char *fname, int flags)
+{
+ /* Check for existence of this tag already. */
+ if (validating)
+ {
+ TAG_ENTRY *tag = find_node (node);
+ if (tag)
+ {
+ line_error (_("Node `%s' previously defined at line %d"),
+ node, tag->line_no);
+ return;
+ }
+ }
+
+ if (!(flags & TAG_FLAG_ANCHOR))
+ {
+ /* Make this the current node. */
+ current_node = node;
+ }
+
+ /* Add it to the list. */
+ {
+ int number = number_of_node (node);
+
+ TAG_ENTRY *new = xmalloc (sizeof (TAG_ENTRY));
+ new->node = node;
+ new->prev = prev;
+ new->next = next;
+ new->up = up;
+ new->position = position;
+ new->line_no = line_no;
+ new->filename = node_filename;
+ new->touched = 0;
+ new->flags = flags;
+ if (number)
+ new->number = number; /* Already assigned. */
+ else
+ {
+ node_number++;
+ new->number = node_number;
+ }
+ if (fname)
+ new->html_fname = fname;
+ else
+ /* This happens for Top node under split-HTML, for example. */
+ new->html_fname
+ = normalize_filename (filename_part (current_output_filename));
+ new->next_ent = tag_table;
+
+ /* Increment the order counter, and save it. */
+ node_order++;
+ new->order = node_order;
+
+ tag_table = new;
+ }
+
+ if (html)
+ { /* Note the references to the next etc. nodes too. */
+ remember_node_node_reference (next);
+ remember_node_node_reference (prev);
+ remember_node_node_reference (up);
+ }
+}
+
+/* Remember this node name for later validation use. This is used to
+ remember menu references while reading the input file. After the
+ output file has been written, if validation is on, then we use the
+ contents of `node_references' as a list of nodes to validate. */
+void
+remember_node_reference (char *node, int line, enum reftype type)
+{
+ NODE_REF *temp = xmalloc (sizeof (NODE_REF));
+ int number = number_of_node (node);
+
+ temp->next = node_references;
+ temp->node = xstrdup (node);
+ temp->line_no = line;
+ temp->section = current_section;
+ temp->type = type;
+ temp->containing_node = xstrdup (current_node ? current_node : "");
+ temp->filename = node_filename;
+ if (number)
+ temp->number = number; /* Already assigned. */
+ else
+ {
+ node_number++;
+ temp->number = node_number;
+ }
+
+ node_references = temp;
+}
+
+static void
+isolate_nodename (char *nodename)
+{
+ int i, c;
+ int paren_seen, paren;
+
+ if (!nodename)
+ return;
+
+ canon_white (nodename);
+ paren_seen = paren = i = 0;
+
+ if (*nodename == '.' || !*nodename)
+ {
+ *nodename = 0;
+ return;
+ }
+
+ if (*nodename == '(')
+ {
+ paren++;
+ paren_seen++;
+ i++;
+ }
+
+ for (; (c = nodename[i]); i++)
+ {
+ if (paren)
+ {
+ if (c == '(')
+ paren++;
+ else if (c == ')')
+ paren--;
+
+ continue;
+ }
+
+ /* If the character following the close paren is a space, then this
+ node has no more characters associated with it. */
+ if (c == '\t' ||
+ c == '\n' ||
+ c == ',' ||
+ ((paren_seen && nodename[i - 1] == ')') &&
+ (c == ' ' || c == '.')) ||
+ (c == '.' &&
+ ((!nodename[i + 1] ||
+ (cr_or_whitespace (nodename[i + 1])) ||
+ (nodename[i + 1] == ')')))))
+ break;
+ }
+ nodename[i] = 0;
+}
+
+/* This function gets called at the start of every line while inside a
+ menu. It checks to see if the line starts with "* ", and if so and
+ REMEMBER_REF is nonzero, remembers the node reference as type
+ REF_TYPE that this menu refers to. input_text_offset is at the \n
+ just before the menu line. If REMEMBER_REF is zero, REF_TYPE is unused. */
+#define MENU_STARTER "* "
+char *
+glean_node_from_menu (int remember_ref, enum reftype ref_type)
+{
+ int i, orig_offset = input_text_offset;
+ char *nodename;
+ char *line, *expanded_line;
+ char *old_input = input_text;
+ int old_size = input_text_length;
+
+ if (strncmp (&input_text[input_text_offset + 1],
+ MENU_STARTER,
+ strlen (MENU_STARTER)) != 0)
+ return NULL;
+ else
+ input_text_offset += strlen (MENU_STARTER) + 1;
+
+ /* The menu entry might include macro calls, so we need to expand them. */
+ get_until ("\n", &line);
+ only_macro_expansion++; /* only expand macros in menu entries */
+ expanded_line = expansion (line, 0);
+ only_macro_expansion--;
+ free (line);
+ input_text = expanded_line;
+ input_text_offset = 0;
+ input_text_length = strlen (expanded_line);
+
+ get_until_in_line (0, ":", &nodename);
+ if (curchar () == ':')
+ input_text_offset++;
+
+ if (curchar () != ':')
+ {
+ free (nodename);
+ get_until_in_line (0, "\n", &nodename);
+ isolate_nodename (nodename);
+ }
+
+ input_text = old_input;
+ input_text_offset = orig_offset;
+ input_text_length = old_size;
+ free (expanded_line);
+ fix_whitespace (nodename);
+ normalize_node_name (nodename);
+ i = strlen (nodename);
+ if (i && nodename[i - 1] == ':')
+ nodename[i - 1] = 0;
+
+ if (remember_ref)
+ remember_node_reference (nodename, line_number, ref_type);
+
+ return nodename;
+}
+
+/* Set the name of the current output file. */
+void
+set_current_output_filename (const char *fname)
+{
+ if (current_output_filename)
+ free (current_output_filename);
+ current_output_filename = xstrdup (fname);
+}
+
+
+/* Output the <a name="..."></a> constructs for NODE. We output both
+ the new-style conversion and the old-style, if they are different.
+ See comments at `add_escaped_anchor_name' in html.c. */
+
+static void
+add_html_names (char *node)
+{
+ char *tem = expand_node_name (node);
+ char *otem = xstrdup (tem);
+
+ /* Determine if the old and new schemes come up with different names;
+ only output the old scheme if that is so. We don't want to output
+ the same name twice. */
+ canon_white (otem);
+ {
+ char *optr = otem;
+ int need_old = 0;
+
+ for (; *optr; optr++)
+ {
+ if (!cr_or_whitespace (*optr) && !URL_SAFE_CHAR (*optr))
+ {
+ need_old = 1;
+ break;
+ }
+ }
+
+ if (need_old)
+ {
+ add_word ("<a name=\"");
+ add_anchor_name (otem, -1); /* old anchor name conversion */
+ add_word ("\"></a>\n");
+ }
+ free (otem);
+ }
+
+ /* Always output the new scheme. */
+ canon_white (tem);
+ add_word ("<a name=\"");
+ add_anchor_name (tem, 0);
+ add_word ("\"></a>\n");
+
+ free (tem);
+}
+
+
+/* The order is: nodename, nextnode, prevnode, upnode.
+ If all of the NEXT, PREV, and UP fields are empty, they are defaulted.
+ You must follow a node command which has those fields defaulted
+ with a sectioning command (e.g., @chapter) giving the "level" of that node.
+ It is an error not to do so.
+ The defaults come from the menu in this node's parent. */
+void
+cm_node (void)
+{
+ static long epilogue_len = 0L;
+ char *node, *prev, *next, *up;
+ int new_node_pos, defaulting, this_section;
+ int no_warn = 0;
+ char *fname_for_this_node = NULL;
+ char *tem;
+ TAG_ENTRY *tag = NULL;
+
+ if (strcmp (command, "nwnode") == 0)
+ no_warn = TAG_FLAG_NO_WARN;
+
+ /* Get rid of unmatched brace arguments from previous commands. */
+ discard_braces ();
+
+ /* There also might be insertions left lying around that haven't been
+ ended yet. Do that also. */
+ discard_insertions (1);
+
+ if (!html && !already_outputting_pending_notes)
+ {
+ close_paragraph ();
+ output_pending_notes ();
+ }
+
+ new_node_pos = output_position;
+
+ if (macro_expansion_output_stream && !executing_string)
+ append_to_expansion_output (input_text_offset + 1);
+
+ /* Do not collapse -- to -, etc., in node names. */
+ in_fixed_width_font++;
+
+ /* While expanding the @node line, leave any non-macros
+ intact, so that the macro-expanded output includes them. */
+ only_macro_expansion++;
+ node = get_node_token (1);
+ only_macro_expansion--;
+ next = get_node_token (0);
+ prev = get_node_token (0);
+ up = get_node_token (0);
+
+ if (html && splitting
+ /* If there is a Top node, it always goes into index.html. So
+ don't start a new HTML file for Top. */
+ && (top_node_seen || strcasecmp (node, "Top") != 0))
+ {
+ /* We test *node here so that @node without a valid name won't
+ start a new file name with a bogus name such as ".html".
+ This could happen if we run under "--force", where we cannot
+ simply bail out. Continuing to use the same file sounds like
+ the best we can do in such cases. */
+ if (current_output_filename && output_stream && *node)
+ {
+ char *fname_for_prev_node;
+
+ if (current_node)
+ {
+ /* NOTE: current_node at this point still holds the name
+ of the previous node. */
+ tem = expand_node_name (current_node);
+ fname_for_prev_node = nodename_to_filename (tem);
+ free (tem);
+ }
+ else /* could happen if their top node isn't named "Top" */
+ fname_for_prev_node = filename_part (current_output_filename);
+ tem = expand_node_name (node);
+ fname_for_this_node = nodename_to_filename (tem);
+ free (tem);
+ /* Don't close current output file, if next output file is
+ to have the same name. This may happen at top level, or
+ if two nodes produce the same file name under --split. */
+ if (FILENAME_CMP (fname_for_this_node, fname_for_prev_node) != 0)
+ {
+ long pos1 = 0;
+
+ /* End the current split output file. */
+ close_paragraph ();
+ output_pending_notes ();
+ start_paragraph ();
+ /* Compute the length of the HTML file's epilogue. We
+ cannot know the value until run time, due to the
+ text/binary nuisance on DOS/Windows platforms, where
+ 2 `\r' characters could be added to the epilogue when
+ it is written in text mode. */
+ if (epilogue_len == 0)
+ {
+ flush_output ();
+ pos1 = ftell (output_stream);
+ }
+ add_word ("</body></html>\n");
+ close_paragraph ();
+ if (epilogue_len == 0)
+ epilogue_len = ftell (output_stream) - pos1;
+ fclose (output_stream);
+ output_stream = NULL;
+ output_position = 0;
+ tag = find_node_by_fname (fname_for_this_node);
+ }
+ free (fname_for_prev_node);
+ }
+ }
+
+ filling_enabled = indented_fill = 0;
+ if (!html || (html && splitting))
+ current_footnote_number = 1;
+
+ if (verbose_mode)
+ printf (_("Formatting node %s...\n"), node);
+
+ if (macro_expansion_output_stream && !executing_string)
+ remember_itext (input_text, input_text_offset);
+
+ /* Reset the line number in each node for Info output, so that
+ index entries will save the line numbers of parent node. */
+ node_line_number = 0;
+
+ no_indent = 1;
+ if (xml)
+ {
+ xml_begin_document (current_output_filename);
+ xml_begin_node ();
+ if (!docbook)
+ {
+ xml_insert_element (NODENAME, START);
+ if (macro_expansion_output_stream && !executing_string)
+ me_execute_string (node);
+ else
+ execute_string ("%s", node);
+ xml_insert_element (NODENAME, END);
+ }
+ else
+ xml_node_id = xml_id (node);
+ }
+ else if (!no_headers && !html)
+ {
+ /* Emacs Info reader cannot grok indented escape sequence. */
+ kill_self_indent (-1);
+
+ add_word_args ("\037\nFile: %s, Node: ", pretty_output_filename);
+
+ if (macro_expansion_output_stream && !executing_string)
+ me_execute_string (node);
+ else
+ execute_string ("%s", node);
+ filling_enabled = indented_fill = 0;
+ }
+
+ /* Check for defaulting of this node's next, prev, and up fields. */
+ defaulting = (*next == 0 && *prev == 0 && *up == 0);
+
+ this_section = what_section (input_text + input_text_offset, NULL);
+
+ /* If we are defaulting, then look at the immediately following
+ sectioning command (error if none) to determine the node's
+ level. Find the node that contains the menu mentioning this node
+ that is one level up (error if not found). That node is the "Up"
+ of this node. Default the "Next" and "Prev" from the menu. */
+ if (defaulting)
+ {
+ NODE_REF *last_ref = NULL;
+ NODE_REF *ref = node_references;
+
+ if (this_section < 0 && !STREQ (node, "Top"))
+ {
+ char *polite_section_name = "top";
+ int i;
+
+ for (i = 0; section_alist[i].name; i++)
+ if (section_alist[i].level == current_section + 1)
+ {
+ polite_section_name = section_alist[i].name;
+ break;
+ }
+
+ line_error
+ (_("Node `%s' requires a sectioning command (e.g., %c%s)"),
+ node, COMMAND_PREFIX, polite_section_name);
+ }
+ else
+ {
+ if (strcmp (node, "Top") == 0)
+ {
+ /* Default the NEXT pointer to be the first menu item in
+ this node, if there is a menu in this node. We have to
+ try very hard to find the menu, as it may be obscured
+ by execution_strings which are on the filestack. For
+ every member of the filestack which has a FILENAME
+ member which is identical to the current INPUT_FILENAME,
+ search forward from that offset. */
+ int saved_input_text_offset = input_text_offset;
+ int saved_input_text_length = input_text_length;
+ char *saved_input_text = input_text;
+ FSTACK *next_file = filestack;
+
+ int orig_offset, orig_size;
+
+ int bye_offset = search_forward ("\n@bye", input_text_offset);
+
+ /* No matter what, make this file point back at `(dir)'. */
+ free (up);
+ up = xstrdup ("(dir)"); /* html fixxme */
+
+ while (1)
+ {
+ orig_offset = input_text_offset;
+ orig_size =
+ search_forward (node_search_string, orig_offset);
+
+ if (orig_size < 0)
+ orig_size = input_text_length;
+
+ input_text_offset = search_forward ("\n@menu", orig_offset);
+ if (input_text_offset > -1
+ && (bye_offset > -1 && input_text_offset < bye_offset)
+ && cr_or_whitespace (input_text[input_text_offset + 6]))
+ {
+ char *nodename_from_menu = NULL;
+
+ input_text_offset =
+ search_forward ("\n* ", input_text_offset);
+
+ if (input_text_offset != -1)
+ nodename_from_menu = glean_node_from_menu (0, 0);
+
+ if (nodename_from_menu)
+ {
+ free (next);
+ next = nodename_from_menu;
+ break;
+ }
+ }
+
+ /* We got here, so it hasn't been found yet. Try
+ the next file on the filestack if there is one. */
+ if (next_file
+ && FILENAME_CMP (next_file->filename, input_filename)
+ == 0)
+ {
+ input_text = next_file->text;
+ input_text_offset = next_file->offset;
+ input_text_length = next_file->size;
+ next_file = next_file->next;
+ }
+ else
+ { /* No more input files to check. */
+ break;
+ }
+ }
+
+ input_text = saved_input_text;
+ input_text_offset = saved_input_text_offset;
+ input_text_length = saved_input_text_length;
+ }
+ }
+
+ /* Fix the level of the menu references in the Top node, iff it
+ was declared with @top, and no subsequent reference was found. */
+ if (top_node_seen && !non_top_node_seen)
+ {
+ /* Then this is the first non-@top node seen. */
+ int level;
+
+ level = set_top_section_level (this_section - 1);
+ non_top_node_seen = 1;
+
+ while (ref)
+ {
+ if (ref->section == level)
+ ref->section = this_section - 1;
+ ref = ref->next;
+ }
+
+ ref = node_references;
+ }
+
+ while (ref)
+ {
+ if (ref->section == (this_section - 1)
+ && ref->type == menu_reference
+ && strcmp (ref->node, node) == 0)
+ {
+ char *containing_node = ref->containing_node;
+
+ free (up);
+ up = xstrdup (containing_node);
+
+ if (last_ref
+ && last_ref->type == menu_reference
+ && strcmp (last_ref->containing_node, containing_node) == 0)
+ {
+ free (next);
+ next = xstrdup (last_ref->node);
+ }
+
+ while (ref->section == this_section - 1
+ && ref->next
+ && ref->next->type != menu_reference)
+ ref = ref->next;
+
+ if (ref->next && ref->type == menu_reference
+ && strcmp (ref->next->containing_node, containing_node) == 0)
+ {
+ free (prev);
+ prev = xstrdup (ref->next->node);
+ }
+ else if (!ref->next
+ && strcasecmp (ref->containing_node, "Top") == 0)
+ {
+ free (prev);
+ prev = xstrdup (ref->containing_node);
+ }
+ break;
+ }
+ last_ref = ref;
+ ref = ref->next;
+ }
+ }
+
+ /* Insert the correct args if we are expanding macros, and the node's
+ pointers weren't defaulted. */
+ if (macro_expansion_output_stream && !executing_string && !defaulting)
+ {
+ char *temp;
+ int op_orig = output_paragraph_offset;
+ int meta_pos_orig = meta_char_pos;
+ int extra = html ? strlen (node) : 0;
+
+ temp = xmalloc (7 + extra + strlen (next) + strlen (prev) + strlen (up));
+ sprintf (temp, "%s, %s, %s, %s", html ? node : "", next, prev, up);
+ me_execute_string (temp);
+ free (temp);
+
+ output_paragraph_offset = op_orig;
+ meta_char_pos = meta_pos_orig;
+ }
+
+ if (!*node)
+ {
+ line_error (_("No node name specified for `%c%s' command"),
+ COMMAND_PREFIX, command);
+ free (node);
+ free (next); next = NULL;
+ free (prev); prev= NULL;
+ free (up); up = NULL;
+ node_number++; /* else it doesn't get bumped */
+ }
+ else
+ {
+ if (!*next) { free (next); next = NULL; }
+ if (!*prev) { free (prev); prev = NULL; }
+ if (!*up) { free (up); up = NULL; }
+ remember_node (node, prev, next, up, new_node_pos, line_number,
+ fname_for_this_node, no_warn);
+ outstanding_node = 1;
+ }
+
+ if (html)
+ {
+ if (splitting && *node && output_stream == NULL)
+ {
+ char *dirname;
+ char filename[PATH_MAX];
+
+ dirname = pathname_part (current_output_filename);
+ strcpy (filename, dirname);
+ strcat (filename, fname_for_this_node);
+ free (dirname);
+
+ /* See if the node name converted to a file name clashes
+ with other nodes or anchors. If it clashes with an
+ anchor, we complain and nuke that anchor's file. */
+ if (!tag)
+ {
+ output_stream = fopen (filename, "w");
+ html_output_head_p = 0; /* so that we generate HTML preamble */
+ html_output_head ();
+ }
+ else if ((tag->flags & TAG_FLAG_ANCHOR) != 0)
+ {
+ line_error (_("Anchor `%s' and node `%s' map to the same file name"),
+ tag->node, node);
+ file_line_error (tag->filename, tag->line_no,
+ _("This @anchor command ignored; references to it will not work"));
+ file_line_error (tag->filename, tag->line_no,
+ _("Rename this anchor or use the `--no-split' option"));
+ /* Nuke the file name recorded in anchor's tag.
+ Since we are about to nuke the file itself, we
+ don't want find_node_by_fname to consider this
+ anchor anymore. */
+ free (tag->html_fname);
+ tag->html_fname = NULL;
+ output_stream = fopen (filename, "w");
+ html_output_head_p = 0; /* so that we generate HTML preamble */
+ html_output_head ();
+ }
+ else
+ {
+ /* This node's file name clashes with another node.
+ We put them both on the same file. */
+ output_stream = fopen (filename, "r+");
+ if (output_stream)
+ {
+ static char html_end[] = "</body></html>\n";
+ char end_line[sizeof(html_end)];
+ int fpos = fseek (output_stream, -epilogue_len,
+ SEEK_END);
+
+ if (fpos < 0
+ || fgets (end_line, sizeof (html_end),
+ output_stream) == NULL
+ /* Paranoia: did someone change the way HTML
+ files are finished up? */
+ || strcasecmp (end_line, html_end) != 0)
+ {
+ line_error (_("Unexpected string at end of split-HTML file `%s'"),
+ fname_for_this_node);
+ fclose (output_stream);
+ xexit (1);
+ }
+ fseek (output_stream, -epilogue_len, SEEK_END);
+ }
+ }
+ if (output_stream == NULL)
+ {
+ fs_error (filename);
+ xexit (1);
+ }
+ set_current_output_filename (filename);
+ }
+
+ if (!splitting && no_headers)
+ { /* cross refs need a name="#anchor" even if not writing headers */
+ add_html_names (node);
+ }
+
+ if (splitting || !no_headers)
+ { /* Navigation bar. */
+ add_html_block_elt ("<div class=\"node\">\n");
+ /* The <p> avoids the links area running on with old Lynxen. */
+ add_word_args ("<p>%s\n", splitting ? "" : "<hr>");
+
+ /* In the split HTML case, the filename is wrong for the
+ old-style converted names, but we'll add them anyway, for
+ consistency. (And we need them in the normal (not
+ no_headers) nonsplit case.) */
+ add_html_names (node);
+
+ if (next)
+ {
+ tem = expansion (next, 0);
+ add_word ((char *) _("Next:"));
+ add_word ("&nbsp;");
+
+ add_word ("<a rel=\"next\" accesskey=\"n\" href=\"");
+ add_anchor_name (tem, 1);
+ tem = escape_string (tem);
+ add_word_args ("\">%s</a>", tem);
+
+ free (tem);
+
+ if (prev || up)
+ add_word (",\n");
+ }
+ if (prev)
+ {
+ tem = expansion (prev, 0);
+ add_word ((char *) _("Previous:"));
+ add_word ("&nbsp;");
+ add_word ("<a rel=\"previous\" accesskey=\"p\" href=\"");
+ add_anchor_name (tem, 1);
+ tem = escape_string (tem);
+ add_word_args ("\">%s</a>", tem);
+ free (tem);
+
+ if (up)
+ add_word (",\n");
+ }
+ if (up)
+ {
+ tem = expansion (up, 0);
+ add_word ((char *) _("Up:"));
+ add_word ("&nbsp;");
+ add_word ("<a rel=\"up\" accesskey=\"u\" href=\"");
+ add_anchor_name (tem, 1);
+ tem = escape_string (tem);
+ add_word_args ("\">%s</a>", tem);
+ free (tem);
+ }
+ /* html fixxme: we want a `top' or `contents' link here. */
+
+ add_word_args ("\n%s\n", splitting ? "<hr>" : "");
+ add_word ("</div>\n");
+ }
+ }
+ else if (docbook)
+ ;
+ else if (xml)
+ {
+ if (next)
+ {
+ xml_insert_element (NODENEXT, START);
+ execute_string ("%s", next);
+ xml_insert_element (NODENEXT, END);
+ }
+ if (prev)
+ {
+ xml_insert_element (NODEPREV, START);
+ execute_string ("%s", prev);
+ xml_insert_element (NODEPREV, END);
+ }
+ if (up)
+ {
+ xml_insert_element (NODEUP, START);
+ execute_string ("%s", up);
+ xml_insert_element (NODEUP, END);
+ }
+ }
+ else if (!no_headers)
+ {
+ if (macro_expansion_output_stream)
+ me_inhibit_expansion++;
+
+ /* These strings are not translatable. */
+ if (next)
+ {
+ execute_string (", Next: %s", next);
+ filling_enabled = indented_fill = 0;
+ }
+ if (prev)
+ {
+ execute_string (", Prev: %s", prev);
+ filling_enabled = indented_fill = 0;
+ }
+ if (up)
+ {
+ execute_string (", Up: %s", up);
+ filling_enabled = indented_fill = 0;
+ }
+ if (macro_expansion_output_stream)
+ me_inhibit_expansion--;
+ }
+
+ close_paragraph ();
+ no_indent = 0;
+
+ /* Change the section only if there was a sectioning command. */
+ if (this_section >= 0)
+ current_section = this_section;
+
+ if (current_node && STREQ (current_node, "Top"))
+ top_node_seen = 1;
+
+ filling_enabled = 1;
+ in_fixed_width_font--;
+}
+
+/* Cross-reference target at an arbitrary spot. */
+void
+cm_anchor (int arg)
+{
+ char *anchor;
+ char *fname_for_anchor = NULL;
+
+ if (arg == END)
+ return;
+
+ /* Parse the anchor text. */
+ anchor = get_xref_token (1);
+
+ /* Force all versions of "top" to be "Top". */
+ normalize_node_name (anchor);
+
+ /* In HTML mode, need to actually produce some output. */
+ if (html)
+ {
+ /* If this anchor is at the beginning of a new paragraph, make
+ sure a new paragraph is indeed started. */
+ if (!paragraph_is_open)
+ {
+ if (!executing_string && html)
+ html_output_head ();
+ start_paragraph ();
+ if (!in_fixed_width_font || in_menu || in_detailmenu)
+ {
+ insert_string ("<p>");
+ in_paragraph = 1;
+ }
+ }
+ add_word ("<a name=\"");
+ add_anchor_name (anchor, 0);
+ add_word ("\"></a>");
+ if (splitting)
+ {
+ /* If we are splitting, cm_xref will produce a reference to
+ a file whose name is derived from the anchor name. So we
+ must create a file when we see an @anchor, otherwise
+ xref's to anchors won't work. The file we create simply
+ redirects to the file of this anchor's node. */
+ TAG_ENTRY *tag;
+
+ fname_for_anchor = nodename_to_filename (anchor);
+ /* See if the anchor name converted to a file name clashes
+ with other anchors or nodes. */
+ tag = find_node_by_fname (fname_for_anchor);
+ if (tag)
+ {
+ if ((tag->flags & TAG_FLAG_ANCHOR) != 0)
+ line_error (_("Anchors `%s' and `%s' map to the same file name"),
+ anchor, tag->node);
+ else
+ line_error (_("Anchor `%s' and node `%s' map to the same file name"),
+ anchor, tag->node);
+ line_error (_("@anchor command ignored; references to it will not work"));
+ line_error (_("Rename this anchor or use the `--no-split' option"));
+ free (fname_for_anchor);
+ /* We will not be creating a file for this anchor, so
+ set its name to NULL, so that remember_node stores a
+ NULL and find_node_by_fname won't consider this
+ anchor for clashes. */
+ fname_for_anchor = NULL;
+ }
+ else
+ {
+ char *dirname, *p;
+ char filename[PATH_MAX];
+ FILE *anchor_stream;
+
+ dirname = pathname_part (current_output_filename);
+ strcpy (filename, dirname);
+ strcat (filename, fname_for_anchor);
+ free (dirname);
+
+ anchor_stream = fopen (filename, "w");
+ if (anchor_stream == NULL)
+ {
+ fs_error (filename);
+ xexit (1);
+ }
+ /* The HTML magic below will cause the browser to
+ immediately go to the anchor's node's file. Lynx
+ seems not to support this redirection, but it looks
+ like a bug in Lynx, and they can work around it by
+ clicking on the link once more. */
+ fputs ("<meta http-equiv=\"refresh\" content=\"0; url=",
+ anchor_stream);
+ /* Make the indirect link point to the current node's
+ file and anchor's "<a name" label. If we don't have
+ a valid node name, refer to the current output file
+ instead. */
+ if (current_node && *current_node)
+ {
+ char *fn, *tem;
+
+ tem = expand_node_name (current_node);
+ fn = nodename_to_filename (tem);
+ free (tem);
+ fputs (fn, anchor_stream);
+ free (fn);
+ }
+ else
+ {
+ char *base = filename_part (current_output_filename);
+
+ fputs (base, anchor_stream);
+ free (base);
+ }
+ fputs ("#", anchor_stream);
+ for (p = anchor; *p; p++)
+ {
+ if (*p == '&')
+ fputs ("&amp;", anchor_stream);
+ else if (!URL_SAFE_CHAR (*p))
+ fprintf (anchor_stream, "%%%x", (unsigned char) *p);
+ else
+ fputc (*p, anchor_stream);
+ }
+ fputs ("\">\n", anchor_stream);
+ fclose (anchor_stream);
+ }
+ }
+ }
+ else if (xml)
+ {
+ xml_insert_element_with_attribute (ANCHOR, START, "name=\"%s\"", anchor);
+ xml_insert_element (ANCHOR, END);
+ }
+ /* Save it in the tag table. */
+ remember_node (anchor, NULL, NULL, NULL,
+ output_position + output_paragraph_offset,
+ line_number, fname_for_anchor, TAG_FLAG_ANCHOR);
+}
+
+/* Find NODE in REF_LIST. */
+static NODE_REF *
+find_node_reference (char *node, NODE_REF *ref_list)
+{
+ NODE_REF *orig_ref_list = ref_list;
+ char *expanded_node;
+
+ while (ref_list)
+ {
+ if (strcmp (node, ref_list->node) == 0)
+ break;
+ ref_list = ref_list->next;
+ }
+
+ if (ref_list || !expensive_validation)
+ return ref_list;
+
+ /* Maybe NODE is not expanded yet. This may be SLOW. */
+ expanded_node = expand_node_name (node);
+ for (ref_list = orig_ref_list; ref_list; ref_list = ref_list->next)
+ {
+ if (STREQ (expanded_node, ref_list->node))
+ break;
+ if (strchr (ref_list->node, COMMAND_PREFIX))
+ {
+ char *expanded_ref = expand_node_name (ref_list->node);
+
+ if (STREQ (expanded_node, expanded_ref))
+ {
+ free (expanded_ref);
+ break;
+ }
+ free (expanded_ref);
+ }
+ }
+ free (expanded_node);
+ return ref_list;
+}
+
+void
+free_node_references (void)
+{
+ NODE_REF *list, *temp;
+
+ list = node_references;
+
+ while (list)
+ {
+ temp = list;
+ free (list->node);
+ free (list->containing_node);
+ list = list->next;
+ free (temp);
+ }
+ node_references = NULL;
+}
+
+void
+free_node_node_references (void)
+{
+ NODE_REF *list, *temp;
+
+ list = node_references;
+
+ while (list)
+ {
+ temp = list;
+ free (list->node);
+ list = list->next;
+ free (temp);
+ }
+ node_node_references = NULL;
+}
+
+/* Return the number assigned to a named node in either the tag_table
+ or node_references list or zero if no number has been assigned. */
+int
+number_of_node (char *node)
+{
+ NODE_REF *temp_ref;
+ TAG_ENTRY *temp_node = find_node (node);
+
+ if (temp_node)
+ return temp_node->number;
+ else if ((temp_ref = find_node_reference (node, node_references)))
+ return temp_ref->number;
+ else if ((temp_ref = find_node_reference (node, node_node_references)))
+ return temp_ref->number;
+ else
+ return 0;
+}
+
+/* validation */
+
+/* Return 1 if TAG (at LINE) correctly validated, or 0 if not.
+ LABEL is the (translated) description of the type of reference --
+ Menu, Cross, Next, etc. */
+
+static int
+validate (char *tag, int line, const char *label)
+{
+ TAG_ENTRY *result;
+
+ /* If there isn't a tag to verify, or if the tag is in another file,
+ then it must be okay. */
+ if (!tag || !*tag || *tag == '(')
+ return 1;
+
+ /* Otherwise, the tag must exist. */
+ result = find_node (tag);
+
+ if (!result)
+ {
+ line_number = line;
+ line_error (_("%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"), label, tag);
+ return 0;
+ }
+ result->touched++;
+ return 1;
+}
+
+/* The strings here are followed in the message by `reference to...' in
+ the `validate' routine. They are only used in messages, thus are
+ translated. */
+static const char *
+reftype_type_string (enum reftype type)
+{
+ switch (type)
+ {
+ case menu_reference:
+ return _("Menu");
+ case followed_reference:
+ return _("Cross");
+ default:
+ return "Internal-bad-reference-type";
+ }
+}
+
+static void
+validate_other_references (NODE_REF *ref_list)
+{
+ char *old_input_filename = input_filename;
+
+ while (ref_list)
+ {
+ input_filename = ref_list->filename;
+ validate (ref_list->node, ref_list->line_no,
+ reftype_type_string (ref_list->type));
+ ref_list = ref_list->next;
+ }
+ input_filename = old_input_filename;
+}
+
+/* Validation of an info file.
+ Scan through the list of tag entries touching the Prev, Next, and Up
+ elements of each. It is an error not to be able to touch one of them,
+ except in the case of external node references, such as "(DIR)".
+
+ If the Prev is different from the Up,
+ then the Prev node must have a Next pointing at this node.
+
+ Every node except Top must have an Up.
+ The Up node must contain some sort of reference, other than a Next,
+ to this node.
+
+ If the Next is different from the Next of the Up,
+ then the Next node must have a Prev pointing at this node. */
+void
+validate_file (TAG_ENTRY *tag_table)
+{
+ char *old_input_filename = input_filename;
+ TAG_ENTRY *tags = tag_table;
+
+ while (tags)
+ {
+ TAG_ENTRY *temp_tag;
+ char *tem1, *tem2;
+
+ input_filename = tags->filename;
+ line_number = tags->line_no;
+
+ /* If this is a "no warn" node, don't validate it in any way. */
+ if (tags->flags & TAG_FLAG_NO_WARN)
+ {
+ tags = tags->next_ent;
+ continue;
+ }
+
+ /* If this node has a Next, then make sure that the Next exists. */
+ if (tags->next)
+ {
+ validate (tags->next, tags->line_no, _("Next"));
+
+ /* If the Next node exists, and there is no Up, then make sure
+ that the Prev of the Next points back. But do nothing if
+ we aren't supposed to issue warnings about this node. */
+ temp_tag = find_node (tags->next);
+ if (temp_tag && !(temp_tag->flags & TAG_FLAG_NO_WARN))
+ {
+ char *prev = temp_tag->prev;
+ int you_lose = !prev || !STREQ (prev, tags->node);
+
+ if (you_lose && expensive_validation)
+ {
+ tem1 = expand_node_name (prev);
+ tem2 = expand_node_name (tags->node);
+
+ if (tem1 && tem2 && STREQ (tem1, tem2))
+ you_lose = 0;
+ free (tem1);
+ free (tem2);
+ }
+ if (you_lose)
+ {
+ line_error (_("Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"),
+ tags->node);
+ file_line_error (temp_tag->filename, temp_tag->line_no,
+ _("This node (%s) has the bad Prev"),
+ temp_tag->node);
+ temp_tag->flags |= TAG_FLAG_PREV_ERROR;
+ }
+ }
+ }
+
+ /* Validate the Prev field if there is one, and we haven't already
+ complained about it in some way. You don't have to have a Prev
+ field at this stage. */
+ if (!(tags->flags & TAG_FLAG_PREV_ERROR) && tags->prev)
+ {
+ int valid_p = validate (tags->prev, tags->line_no, _("Prev"));
+
+ if (!valid_p)
+ tags->flags |= TAG_FLAG_PREV_ERROR;
+ else
+ { /* If the Prev field is not the same as the Up field,
+ then the node pointed to by the Prev field must have
+ a Next field which points to this node. */
+ int prev_equals_up = !tags->up || STREQ (tags->prev, tags->up);
+
+ if (!prev_equals_up && expensive_validation)
+ {
+ tem1 = expand_node_name (tags->prev);
+ tem2 = expand_node_name (tags->up);
+ prev_equals_up = STREQ (tem1, tem2);
+ free (tem1);
+ free (tem2);
+ }
+ if (!prev_equals_up)
+ {
+ temp_tag = find_node (tags->prev);
+
+ /* If we aren't supposed to issue warnings about the
+ target node, do nothing. */
+ if (!temp_tag || (temp_tag->flags & TAG_FLAG_NO_WARN))
+ /* Do nothing. */ ;
+ else
+ {
+ int you_lose = !temp_tag->next
+ || !STREQ (temp_tag->next, tags->node);
+
+ if (temp_tag->next && you_lose && expensive_validation)
+ {
+ tem1 = expand_node_name (temp_tag->next);
+ tem2 = expand_node_name (tags->node);
+ if (STREQ (tem1, tem2))
+ you_lose = 0;
+ free (tem1);
+ free (tem2);
+ }
+ if (you_lose)
+ {
+ line_error
+ (_("Prev field of node `%s' not pointed to"),
+ tags->node);
+ file_line_error (temp_tag->filename,
+ temp_tag->line_no,
+ _("This node (%s) has the bad Next"),
+ temp_tag->node);
+ temp_tag->flags |= TAG_FLAG_NEXT_ERROR;
+ }
+ }
+ }
+ }
+ }
+
+ if (!tags->up
+ && !(tags->flags & TAG_FLAG_ANCHOR)
+ && strcasecmp (tags->node, "Top") != 0)
+ line_error (_("`%s' has no Up field (perhaps incorrect sectioning?)"), tags->node);
+ else if (tags->up)
+ {
+ int valid_p = validate (tags->up, tags->line_no, _("Up"));
+
+ /* If node X has Up: Y, then warn if Y fails to have a menu item
+ or note pointing at X, if Y isn't of the form "(Y)". */
+ if (valid_p && *tags->up != '(')
+ {
+ NODE_REF *nref;
+ NODE_REF *tref = NULL;
+ NODE_REF *list = node_references;
+
+ for (;;)
+ {
+ nref = find_node_reference (tags->node, list);
+ if (!nref)
+ break;
+
+ if (strcmp (nref->containing_node, tags->up) == 0)
+ {
+ if (nref->type != menu_reference)
+ {
+ tref = nref;
+ list = nref->next;
+ }
+ else
+ break;
+ }
+ list = nref->next;
+ }
+
+ if (!nref)
+ {
+ if (!tref && expensive_validation)
+ {
+ /* Sigh... This might be AWFULLY slow, but if
+ they want this feature, they'll have to pay!
+ We do all the loop again expanding each
+ containing_node reference as we go. */
+ char *tags_up = expand_node_name (tags->up);
+ char *tem;
+
+ list = node_references;
+
+ for (;;)
+ {
+ nref = find_node_reference (tags->node, list);
+ if (!nref)
+ break;
+ tem = expand_node_name (nref->containing_node);
+ if (STREQ (tem, tags_up))
+ {
+ if (nref->type != menu_reference)
+ tref = nref;
+ else
+ {
+ free (tem);
+ break;
+ }
+ }
+ free (tem);
+ list = nref->next;
+ }
+ }
+ if (!nref && !tref)
+ {
+ temp_tag = find_node (tags->up);
+ file_line_error (temp_tag->filename, temp_tag->line_no,
+ _("Node `%s' lacks menu item for `%s' despite being its Up target"),
+ tags->up, tags->node);
+ }
+ }
+ }
+ }
+ tags = tags->next_ent;
+ }
+
+ validate_other_references (node_references);
+ /* We have told the user about the references which didn't exist.
+ Now tell him about the nodes which aren't referenced. */
+
+ for (tags = tag_table; tags; tags = tags->next_ent)
+ {
+ /* If this node is a "no warn" node, do nothing. */
+ if (tags->flags & TAG_FLAG_NO_WARN)
+ {
+ tags = tags->next_ent;
+ continue;
+ }
+
+ /* Special hack. If the node in question appears to have
+ been referenced more than REFERENCE_WARNING_LIMIT times,
+ give a warning. */
+ if (tags->touched > reference_warning_limit)
+ {
+ input_filename = tags->filename;
+ line_number = tags->line_no;
+ warning (_("node `%s' has been referenced %d times"),
+ tags->node, tags->touched);
+ }
+
+ if (tags->touched == 0)
+ {
+ input_filename = tags->filename;
+ line_number = tags->line_no;
+
+ /* Notice that the node "Top" is special, and doesn't have to
+ be referenced. Anchors don't have to be referenced
+ either, you might define them for another document. */
+ if (strcasecmp (tags->node, "Top") != 0
+ && !(tags->flags & TAG_FLAG_ANCHOR))
+ warning (_("unreferenced node `%s'"), tags->node);
+ }
+ }
+ input_filename = old_input_filename;
+}
+
+
+/* Splitting */
+
+/* Return true if the tag entry pointed to by TAGS is the last node.
+ This means only anchors follow. */
+
+static int
+last_node_p (TAG_ENTRY *tags)
+{
+ int last = 1;
+ while (tags->next_ent) {
+ tags = tags->next_ent;
+ if (tags->flags & TAG_FLAG_ANCHOR)
+ ;
+ else
+ {
+ last = 0;
+ break;
+ }
+ }
+
+ return last;
+}
+
+
+static char *
+enumerate_filename (char *pathname, char *basename, int number)
+{
+ /* Do we need to generate names of subfiles which don't exceed 8+3 limits? */
+ const int dos_file_names = !HAVE_LONG_FILENAMES (pathname ? pathname : ".");
+ unsigned name_len = strlen (basename);
+ char *filename = xmalloc (10 + strlen (pathname) + name_len);
+ char *base_filename = xmalloc (10 + name_len);
+
+ sprintf (base_filename, "%s-%d", basename, number);
+
+ if (dos_file_names)
+ {
+ char *dot = strchr (base_filename, '.');
+ unsigned base_len = strlen (base_filename);
+
+ if (dot)
+ { /* Make foobar.i1, .., foobar.i99, foobar.100, ... */
+ dot[1] = 'i';
+ memmove (number <= 99 ? dot + 2 : dot + 1,
+ base_filename + name_len + 1,
+ strlen (base_filename + name_len + 1) + 1);
+ }
+ else if (base_len > 8)
+ {
+ /* Make foobar-1, .., fooba-10, .., foob-100, ... */
+ unsigned numlen = base_len - name_len;
+
+ memmove (base_filename + 8 - numlen, base_filename + name_len, numlen + 1);
+ }
+ }
+
+ sprintf (filename, "%s%s", pathname, base_filename);
+
+ return filename;
+}
+
+/* Remove previously split files, to avoid
+ lingering parts of shrinked documents. */
+void
+clean_old_split_files (char *filename)
+{
+ char *root_filename = filename_part (filename);
+ char *root_pathname = pathname_part (filename);
+ int i;
+
+ /* We break as soon as we hit an inexistent file,
+ so looping until large numbers is harmless. */
+ for (i = 1; i < 1000; i++)
+ {
+ struct stat st;
+ char *check_file = enumerate_filename (root_pathname, root_filename, i);
+
+ if (stat (check_file, &st) != 0)
+ break;
+ else if (!S_ISDIR (st.st_mode))
+ {
+ /* Give feedback if requested, removing a file is important. */
+ if (verbose_mode)
+ printf (_("Removing %s\n"), check_file);
+
+ /* Warn user that we cannot remove the file. */
+ if (unlink (check_file) != 0)
+ warning (_("Can't remove file `%s': %s"), check_file, strerror (errno));
+ }
+
+ free (check_file);
+ }
+}
+
+
+/* Split large output files into a series of smaller files. Each file
+ is pointed to in the tag table, which then gets written out as the
+ original file. The new files have the same name as the original file
+ with a "-num" attached. SIZE is the largest number of bytes to allow
+ in any single split file. */
+void
+split_file (char *filename, int size)
+{
+ char *root_filename, *root_pathname;
+ char *the_file;
+ struct stat fileinfo;
+ long file_size;
+ char *the_header;
+ int header_size;
+
+ /* Can only do this to files with tag tables. */
+ if (!tag_table)
+ return;
+
+ if (size == 0)
+ size = DEFAULT_SPLIT_SIZE;
+
+ if ((stat (filename, &fileinfo) != 0)
+ || (((long) fileinfo.st_size) < size))
+ return;
+ file_size = (long) fileinfo.st_size;
+
+ the_file = find_and_load (filename, 0);
+ if (!the_file)
+ return;
+
+ root_filename = filename_part (filename);
+ root_pathname = pathname_part (filename);
+
+ if (!root_pathname)
+ root_pathname = xstrdup ("");
+
+ /* Start splitting the file. Walk along the tag table
+ outputting sections of the file. When we have written
+ all of the nodes in the tag table, make the top-level
+ pointer file, which contains indirect pointers and
+ tags for the nodes. */
+ {
+ int which_file = 1;
+ TAG_ENTRY *tags = tag_table;
+ char *indirect_info = NULL;
+
+ /* Maybe we want a Local Variables section. */
+ char *trailer = info_trailer ();
+ int trailer_len = trailer ? strlen (trailer) : 0;
+
+ /* Remember the `header' of this file. The first tag in the file is
+ the bottom of the header; the top of the file is the start. */
+ the_header = xmalloc (1 + (header_size = tags->position));
+ memcpy (the_header, the_file, header_size);
+
+ while (tags)
+ {
+ int file_top, file_bot, limit;
+
+ /* Have to include the Control-_. */
+ file_top = file_bot = tags->position;
+ limit = file_top + size;
+
+ /* If the rest of this file is only one node, then
+ that is the entire subfile. */
+ if (last_node_p (tags))
+ {
+ int i = tags->position + 1;
+ char last_char = the_file[i];
+
+ while (i < file_size)
+ {
+ if ((the_file[i] == '\037') &&
+ ((last_char == '\n') ||
+ (last_char == '\014')))
+ break;
+ else
+ last_char = the_file[i];
+ i++;
+ }
+ file_bot = i;
+ tags = tags->next_ent;
+ goto write_region;
+ }
+
+ /* Otherwise, find the largest number of nodes that can fit in
+ this subfile. */
+ for (; tags; tags = tags->next_ent)
+ {
+ if (last_node_p (tags))
+ {
+ /* This entry is the last node. Search forward for the end
+ of this node, and that is the end of this file. */
+ int i = tags->position + 1;
+ char last_char = the_file[i];
+
+ while (i < file_size)
+ {
+ if ((the_file[i] == '\037') &&
+ ((last_char == '\n') ||
+ (last_char == '\014')))
+ break;
+ else
+ last_char = the_file[i];
+ i++;
+ }
+ file_bot = i;
+
+ if (file_bot < limit)
+ {
+ tags = tags->next_ent;
+ goto write_region;
+ }
+ else
+ {
+ /* Here we want to write out everything before the last
+ node, and then write the last node out in a file
+ by itself. */
+ file_bot = tags->position;
+ goto write_region;
+ }
+ }
+
+ /* Write region only if this was a node, not an anchor. */
+ if (tags->next_ent->position > limit
+ && !(tags->flags & TAG_FLAG_ANCHOR))
+ {
+ if (tags->position == file_top)
+ tags = tags->next_ent;
+
+ file_bot = tags->position;
+
+ write_region:
+ {
+ int fd;
+ char *split_filename = enumerate_filename (root_pathname,
+ root_filename, which_file);
+ char *split_basename = filename_part (split_filename);
+
+ fd = open (split_filename, O_WRONLY|O_TRUNC|O_CREAT, 0666);
+ if (fd < 0
+ || write (fd, the_header, header_size) != header_size
+ || write (fd, the_file + file_top, file_bot - file_top)
+ != (file_bot - file_top)
+ || (trailer_len
+ && write (fd, trailer, trailer_len) != trailer_len)
+ || close (fd) < 0)
+ {
+ perror (split_filename);
+ if (fd != -1)
+ close (fd);
+ xexit (1);
+ }
+
+ if (!indirect_info)
+ {
+ indirect_info = the_file + file_top;
+ sprintf (indirect_info, "\037\nIndirect:\n");
+ indirect_info += strlen (indirect_info);
+ }
+
+ sprintf (indirect_info, "%s: %d\n",
+ split_basename, file_top);
+
+ free (split_basename);
+ free (split_filename);
+ indirect_info += strlen (indirect_info);
+ which_file++;
+ break;
+ }
+ }
+ }
+ }
+
+ /* We have sucessfully created the subfiles. Now write out the
+ original again. We must use `output_stream', or
+ write_tag_table_indirect () won't know where to place the output. */
+ output_stream = fopen (filename, "w");
+ if (!output_stream)
+ {
+ perror (filename);
+ xexit (1);
+ }
+
+ {
+ int distance = indirect_info - the_file;
+ fwrite (the_file, 1, distance, output_stream);
+
+ /* Inhibit newlines. */
+ paragraph_is_open = 0;
+
+ /* Write the indirect tag table. */
+ write_tag_table_indirect ();
+
+ /* preserve local variables in info output. */
+ if (trailer)
+ {
+ fwrite (trailer, 1, trailer_len, output_stream);
+ free (trailer);
+ }
+
+ fclose (output_stream);
+ free (the_header);
+ free (the_file);
+ return;
+ }
+ }
+}
diff --git a/Build/source/utils/texinfo/makeinfo/node.h b/Build/source/utils/texinfo/makeinfo/node.h
new file mode 100644
index 00000000000..766c503456e
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/node.h
@@ -0,0 +1,129 @@
+/* node.h -- declarations for Node.
+ $Id: node.h,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Brian Fox (bfox@ai.mit.edu). */
+
+#ifndef NODE_H
+#define NODE_H
+
+#include "xref.h"
+
+/* The various references that we know about. */
+/* What we remember for each node. */
+typedef struct tentry
+{
+ struct tentry *next_ent;
+ char *node; /* Name of this node. */
+ char *prev; /* Name of "Prev:" for this node. */
+ char *next; /* Name of "Next:" for this node. */
+ char *up; /* Name of "Up:" for this node. */
+ int position; /* Output file position of this node. */
+ int line_no; /* Defining line in source file. */
+ char *filename; /* The file that this node was found in. */
+ int touched; /* Nonzero means this node has been referenced. */
+ int flags;
+ int number; /* Number for this node, relevant for HTML
+ splitting -- from use+define order, not just
+ define. */
+ int order; /* The order of the tag, starting from zero. */
+ char *html_fname; /* The HTML file to which this node is written
+ (non-NULL only for HTML splitting). */
+} TAG_ENTRY;
+
+/* If node-a has a "Next" for node-b, but node-b has no "Prev" for node-a,
+ we turn on this flag bit in node-b's tag entry. This means that when
+ it is time to validate node-b, we don't report an additional error
+ if there was no "Prev" field. */
+#define TAG_FLAG_PREV_ERROR 1
+#define TAG_FLAG_NEXT_ERROR 2
+#define TAG_FLAG_UP_ERROR 4
+#define TAG_FLAG_NO_WARN 8
+#define TAG_FLAG_IS_TOP 16
+#define TAG_FLAG_ANCHOR 32
+
+/* Menu reference, *note reference, and validation hacking. */
+
+/* A structure to remember references with. A reference to a node is
+ either an entry in a menu, or a cross-reference made with [px]ref. */
+typedef struct node_ref
+{
+ struct node_ref *next;
+ char *node; /* Name of node referred to. */
+ char *containing_node; /* Name of node containing this reference. */
+ int line_no; /* Line number where the reference occurs. */
+ int section; /* Section level where the reference occurs. */
+ char *filename; /* Name of file where the reference occurs. */
+ enum reftype type; /* Type of reference, either menu or note. */
+ int number; /* Number for this node, relevant for
+ HTML splitting -- from use+define
+ order, not just define. */
+} NODE_REF;
+
+/* The linked list of such structures. */
+extern NODE_REF *node_references;
+
+/* A similar list for references occuring in @node next
+ and similar references, needed for HTML. */
+extern NODE_REF *node_node_references;
+
+/* List of all nodes. */
+extern TAG_ENTRY *tag_table;
+
+/* Counter for setting node_ref.number; zero is Top. */
+extern int node_number;
+
+/* Node order counter. */
+extern int node_order;
+
+/* The current node's section level. */
+extern int current_section;
+
+/* Nonzero when the next sectioning command should generate an anchor
+ corresponding to the current node in HTML mode. */
+extern int outstanding_node;
+
+extern TAG_ENTRY *find_node (char *name);
+
+/* A search string which is used to find a line defining a node. */
+DECLARE (char *, node_search_string, "\n@node ");
+
+/* Extract node name from a menu item. */
+extern char *glean_node_from_menu (int remember_ref, enum reftype ref_type);
+
+/* Remember a node for later validation. */
+extern void remember_node_reference (char *node, int line, enum reftype type);
+
+/* Remember the name of the current output file. */
+extern void set_current_output_filename (const char *fname);
+
+/* Expand macros and commands in the node name and canonicalize
+ whitespace in the resulting expansion. */
+extern char *expand_node_name (char *node);
+
+extern int number_of_node (char *node);
+
+extern void init_tag_table (void);
+extern void write_tag_table (char *filename);
+extern void free_node_references (void);
+extern void free_node_node_references (void);
+extern void validate_file (TAG_ENTRY *tag_table);
+extern void split_file (char *filename, int size);
+extern void clean_old_split_files (char *filename);
+
+#endif /* NODE_H */
diff --git a/Build/source/utils/texinfo/makeinfo/sectioning.c b/Build/source/utils/texinfo/makeinfo/sectioning.c
new file mode 100644
index 00000000000..ce32aeb3a7e
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/sectioning.c
@@ -0,0 +1,831 @@
+/* sectioning.c -- for @chapter, @section, ..., @contents ...
+ $Id: sectioning.c,v 1.25 2004/07/05 22:23:23 karl Exp $
+
+ Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#include "system.h"
+#include "cmds.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "node.h"
+#include "toc.h"
+#include "sectioning.h"
+#include "xml.h"
+
+/* See comment in sectioning.h. */
+section_alist_type section_alist[] = {
+ { "unnumberedsubsubsec", 5, ENUM_SECT_NO, TOC_YES },
+ { "unnumberedsubsec", 4, ENUM_SECT_NO, TOC_YES },
+ { "unnumberedsec", 3, ENUM_SECT_NO, TOC_YES },
+ { "unnumbered", 2, ENUM_SECT_NO, TOC_YES },
+ { "centerchap", 2, ENUM_SECT_NO, TOC_YES },
+
+ { "appendixsubsubsec", 5, ENUM_SECT_APP, TOC_YES }, /* numbered like A.X.X.X */
+ { "appendixsubsec", 4, ENUM_SECT_APP, TOC_YES },
+ { "appendixsec", 3, ENUM_SECT_APP, TOC_YES },
+ { "appendixsection", 3, ENUM_SECT_APP, TOC_YES },
+ { "appendix", 2, ENUM_SECT_APP, TOC_YES },
+
+ { "subsubsec", 5, ENUM_SECT_YES, TOC_YES },
+ { "subsubsection", 5, ENUM_SECT_YES, TOC_YES },
+ { "subsection", 4, ENUM_SECT_YES, TOC_YES },
+ { "section", 3, ENUM_SECT_YES, TOC_YES },
+ { "chapter", 2, ENUM_SECT_YES, TOC_YES },
+
+ { "subsubheading", 5, ENUM_SECT_NO, TOC_NO },
+ { "subheading", 4, ENUM_SECT_NO, TOC_NO },
+ { "heading", 3, ENUM_SECT_NO, TOC_NO },
+ { "chapheading", 2, ENUM_SECT_NO, TOC_NO },
+ { "majorheading", 2, ENUM_SECT_NO, TOC_NO },
+
+ { "top", 1, ENUM_SECT_NO, TOC_YES },
+ { NULL, 0, 0, 0 }
+};
+
+/* The argument of @settitle, used for HTML. */
+char *title = NULL;
+
+
+#define APPENDIX_MAGIC 1024
+#define UNNUMBERED_MAGIC 2048
+
+/* Number memory for every level @chapter, @section,
+ @subsection, @subsubsection. */
+static int numbers [] = { 0, 0, 0, 0 };
+
+/* enum_marker == APPENDIX_MAGIC then we are counting appendencies
+ enum_marker == UNNUMBERED_MAGIC then we are within unnumbered area.
+ Handling situations like this:
+ @unnumbered ..
+ @section ... */
+static int enum_marker = 0;
+
+/* Organized by level commands. That is, "*" == chapter, "=" == section. */
+static char *scoring_characters = "*=-.";
+
+/* Amount to offset the name of sectioning commands to levels by. */
+static int section_alist_offset = 0;
+
+/* These two variables are for @float, @cindex like commands that need to know
+ in which section they are used. */
+/* Last value returned by get_sectioning_number. */
+static char *last_sectioning_number = "";
+/* Last title used by sectioning_underscore, etc. */
+static char *last_sectioning_title = "";
+
+/* num == ENUM_SECT_NO means unnumbered (should never call this)
+ num == ENUM_SECT_YES means numbered
+ num == ENUM_SECT_APP means numbered like A.1 and so on */
+static char *
+get_sectioning_number (int level, int num)
+{
+ static char s[100]; /* should ever be enough for 99.99.99.99
+ Appendix A.1 */
+
+ char *p;
+ int i;
+
+ s[0] = 0;
+
+ /* create enumeration in front of chapter, section, subsection and so on. */
+ for (i = 0; i < level; i++)
+ {
+ p = s + strlen (s);
+ if ((i == 0) && (enum_marker == APPENDIX_MAGIC))
+ sprintf (p, "%c.", numbers[i] + 64); /* Should be changed to
+ be more portable */
+ else
+ sprintf (p, "%d.", numbers[i]);
+ }
+
+ /* the last number is never followed by a dot */
+ p = s + strlen (s);
+ if ((num == ENUM_SECT_APP)
+ && (i == 0)
+ && (enum_marker == APPENDIX_MAGIC))
+ sprintf (p, _("Appendix %c"), numbers[i] + 64);
+ else
+ sprintf (p, "%d", numbers[i]);
+
+ /* Poor man's cache :-) */
+ if (strlen (last_sectioning_number))
+ free (last_sectioning_number);
+ last_sectioning_number = xstrdup (s);
+
+ return s;
+}
+
+
+/* Set the level of @top to LEVEL. Return the old level of @top. */
+int
+set_top_section_level (int level)
+{
+ int i, result = -1;
+
+ for (i = 0; section_alist[i].name; i++)
+ if (strcmp (section_alist[i].name, "top") == 0)
+ {
+ result = section_alist[i].level;
+ section_alist[i].level = level;
+ break;
+ }
+ return result;
+}
+
+
+/* return the index of the given sectioning command in section_alist */
+static int
+search_sectioning (char *text)
+{
+ int i;
+ char *t;
+
+ /* ignore the optional command prefix */
+ if (text[0] == COMMAND_PREFIX)
+ text++;
+
+ for (i = 0; (t = section_alist[i].name); i++)
+ {
+ if (strcmp (t, text) == 0)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/* Return an integer which identifies the type of section present in
+ TEXT -- 1 for @top, 2 for chapters, ..., 5 for subsubsections (as
+ specified in section_alist). We take into account any @lowersections
+ and @raisesections. If SECNAME is non-NULL, also return the
+ corresponding section name. */
+int
+what_section (char *text, char **secname)
+{
+ int index, j;
+ char *temp;
+ int return_val;
+
+ find_section_command:
+ for (j = 0; text[j] && cr_or_whitespace (text[j]); j++);
+ if (text[j] != COMMAND_PREFIX)
+ return -1;
+
+ text = text + j + 1;
+
+ /* We skip @c, @comment, and @?index commands. */
+ if ((strncmp (text, "comment", strlen ("comment")) == 0) ||
+ (text[0] == 'c' && cr_or_whitespace (text[1])) ||
+ (strcmp (text + 1, "index") == 0))
+ {
+ while (*text++ != '\n');
+ goto find_section_command;
+ }
+
+ /* Handle italicized sectioning commands. */
+ if (*text == 'i')
+ text++;
+
+ for (j = 0; text[j] && !cr_or_whitespace (text[j]); j++);
+
+ temp = xmalloc (1 + j);
+ strncpy (temp, text, j);
+ temp[j] = 0;
+
+ index = search_sectioning (temp);
+ free (temp);
+ if (index >= 0)
+ {
+ return_val = section_alist[index].level + section_alist_offset;
+ if (return_val < 0)
+ return_val = 0;
+ else if (return_val > 5)
+ return_val = 5;
+
+ if (secname)
+ {
+ int i;
+ int alist_size = sizeof (section_alist) / sizeof(section_alist_type);
+ /* Find location of offset sectioning entry, but don't go off
+ either end of the array. */
+ int index_offset = MAX (index - section_alist_offset, 0);
+ index_offset = MIN (index_offset, alist_size - 1);
+
+ /* Also make sure we don't go into the next "group" of
+ sectioning changes, e.g., change from an @appendix to an
+ @heading or some such. */
+#define SIGN(expr) ((expr) < 0 ? -1 : 1)
+ for (i = index; i != index_offset; i -= SIGN (section_alist_offset))
+ {
+ /* As it happens, each group has unique .num/.toc values. */
+ if (section_alist[i].num != section_alist[index_offset].num
+ || section_alist[i].toc != section_alist[index_offset].toc)
+ break;
+ }
+ *secname = section_alist[i].name;
+ }
+ return return_val;
+ }
+ return -1;
+}
+
+/* Returns current top level division (ie. chapter, unnumbered) number.
+ - For chapters, returns the number.
+ - For unnumbered sections, returns empty string.
+ - For appendices, returns A, B, etc. */
+char *
+current_chapter_number (void)
+{
+ if (enum_marker == UNNUMBERED_MAGIC)
+ return xstrdup ("");
+ else if (enum_marker == APPENDIX_MAGIC)
+ {
+ char s[1];
+ sprintf (s, "%c", numbers[0] + 64);
+ return xstrdup (s);
+ }
+ else
+ {
+ char s[5];
+ sprintf (s, "%d", numbers[0]);
+ return xstrdup (s);
+ }
+}
+
+/* Returns number of the last sectioning command used. */
+char *
+current_sectioning_number (void)
+{
+ if (enum_marker == UNNUMBERED_MAGIC || !number_sections)
+ return xstrdup ("");
+ else
+ return xstrdup (last_sectioning_number);
+}
+
+/* Returns arguments of the last sectioning command used. */
+char *
+current_sectioning_name (void)
+{
+ return xstrdup (last_sectioning_title);
+}
+
+/* insert_and_underscore, sectioning_underscore and sectioning_html call this. */
+
+static char *
+handle_enum_increment (int level, int index)
+{
+ /* Here is how TeX handles enumeration:
+ - Anything starting with @unnumbered is not enumerated.
+ - @majorheading and the like are not enumberated. */
+ int i;
+
+ /* First constraint above. */
+ if (enum_marker == UNNUMBERED_MAGIC && level == 0)
+ return xstrdup ("");
+
+ /* Second constraint. */
+ if (section_alist[index].num == ENUM_SECT_NO)
+ return xstrdup ("");
+
+ /* reset all counters which are one level deeper */
+ for (i = level; i < 3; i++)
+ numbers [i + 1] = 0;
+
+ numbers[level]++;
+ if (section_alist[index].num == ENUM_SECT_NO || enum_marker == UNNUMBERED_MAGIC
+ || !number_sections)
+ return xstrdup ("");
+ else
+ return xstrdup (get_sectioning_number (level, section_alist[index].num));
+}
+
+
+void
+sectioning_underscore (char *cmd)
+{
+ char *temp, *secname;
+ int level;
+
+ /* If we're not indenting the first paragraph, we shall make it behave
+ like @noindent is called directly after the section heading. */
+ if (! do_first_par_indent)
+ cm_noindent ();
+
+ temp = xmalloc (2 + strlen (cmd));
+ temp[0] = COMMAND_PREFIX;
+ strcpy (&temp[1], cmd);
+ level = what_section (temp, &secname);
+ level -= 2;
+ if (level < 0)
+ level = 0;
+ free (temp);
+
+ /* If the argument to @top is empty, we try using the one from @settitle.
+ Warn if both are unusable. */
+ if (STREQ (command, "top"))
+ {
+ int save_input_text_offset = input_text_offset;
+
+ get_rest_of_line (0, &temp);
+
+ /* Due to get_rest_of_line ... */
+ line_number--;
+
+ if (strlen (temp) == 0 && (!title || strlen (title) == 0))
+ warning ("Must specify a title with least one of @settitle or @top");
+
+ input_text_offset = save_input_text_offset;
+ }
+
+ if (xml)
+ {
+ /* If the section appears in the toc, it means it's a real section
+ unlike majorheading, chapheading etc. */
+ if (section_alist[search_sectioning (cmd)].toc == TOC_YES)
+ {
+ xml_close_sections (level);
+ /* Mark the beginning of the section
+ If the next command is printindex, we will remove
+ the section and put an Index instead */
+ flush_output ();
+ xml_last_section_output_position = output_paragraph_offset;
+
+ get_rest_of_line (0, &temp);
+
+ /* Use @settitle value if @top parameter is empty. */
+ if (STREQ (command, "top") && strlen(temp) == 0)
+ temp = xstrdup (title ? title : "");
+
+ /* Docbook does not support @unnumbered at all. So we provide numbers
+ that other formats use. @appendix seems to be fine though, so we let
+ Docbook handle that as usual. */
+ if (docbook && enum_marker != APPENDIX_MAGIC)
+ {
+ if (section_alist[search_sectioning (cmd)].num == ENUM_SECT_NO
+ && section_alist[search_sectioning (cmd)].toc == TOC_YES)
+ xml_insert_element_with_attribute (xml_element (secname),
+ START, "label=\"%s\" xreflabel=\"%s\"",
+ handle_enum_increment (level, search_sectioning (cmd)),
+ text_expansion (temp));
+ else
+ xml_insert_element_with_attribute (xml_element (secname),
+ START, "label=\"%s\"",
+ handle_enum_increment (level, search_sectioning (cmd)));
+ }
+ else
+ xml_insert_element (xml_element (secname), START);
+
+ xml_insert_element (TITLE, START);
+ xml_open_section (level, secname);
+ execute_string ("%s", temp);
+ xml_insert_element (TITLE, END);
+
+ free (temp);
+ }
+ else
+ {
+ if (docbook)
+ {
+ if (level > 0)
+ xml_insert_element_with_attribute (xml_element (secname), START,
+ "renderas=\"sect%d\"", level);
+ else
+ xml_insert_element_with_attribute (xml_element (secname), START,
+ "renderas=\"other\"");
+ }
+ else
+ xml_insert_element (xml_element (secname), START);
+
+ get_rest_of_line (0, &temp);
+ execute_string ("%s", temp);
+ free (temp);
+
+ xml_insert_element (xml_element (secname), END);
+ }
+ }
+ else if (html)
+ sectioning_html (level, secname);
+ else
+ insert_and_underscore (level, secname);
+}
+
+
+/* Insert the text following input_text_offset up to the end of the line
+ in a new, separate paragraph. Directly underneath it, insert a
+ line of WITH_CHAR, the same length of the inserted text. */
+void
+insert_and_underscore (int level, char *cmd)
+{
+ int i, len;
+ int index;
+ int old_no_indent;
+ unsigned char *starting_pos, *ending_pos;
+ char *temp;
+ char with_char = scoring_characters[level];
+
+ close_paragraph ();
+ filling_enabled = indented_fill = 0;
+ old_no_indent = no_indent;
+ no_indent = 1;
+
+ if (macro_expansion_output_stream && !executing_string)
+ append_to_expansion_output (input_text_offset + 1);
+
+ get_rest_of_line (0, &temp);
+
+ /* Use @settitle value if @top parameter is empty. */
+ if (STREQ (command, "top") && strlen(temp) == 0)
+ temp = xstrdup (title ? title : "");
+
+ starting_pos = output_paragraph + output_paragraph_offset;
+
+ /* Poor man's cache for section title. */
+ if (strlen (last_sectioning_title))
+ free (last_sectioning_title);
+ last_sectioning_title = xstrdup (temp);
+
+ index = search_sectioning (cmd);
+ if (index < 0)
+ {
+ /* should never happen, but a poor guy, named Murphy ... */
+ warning (_("Internal error (search_sectioning) `%s'!"), cmd);
+ return;
+ }
+
+ /* This is a bit tricky: we must produce "X.Y SECTION-NAME" in the
+ Info output and in TOC, but only SECTION-NAME in the macro-expanded
+ output. */
+
+ /* Step 1: produce "X.Y" and add it to Info output. */
+ add_word_args ("%s ", handle_enum_increment (level, index));
+
+ /* Step 2: add "SECTION-NAME" to both Info and macro-expanded output. */
+ if (macro_expansion_output_stream && !executing_string)
+ {
+ char *temp1 = xmalloc (2 + strlen (temp));
+ sprintf (temp1, "%s\n", temp);
+ remember_itext (input_text, input_text_offset);
+ me_execute_string (temp1);
+ free (temp1);
+ }
+ else
+ execute_string ("%s\n", temp);
+
+ /* Step 3: pluck "X.Y SECTION-NAME" from the output buffer and
+ insert it into the TOC. */
+ ending_pos = output_paragraph + output_paragraph_offset;
+ if (section_alist[index].toc == TOC_YES)
+ toc_add_entry (substring (starting_pos, ending_pos - 1),
+ level, current_node, NULL);
+
+ free (temp);
+
+ len = (ending_pos - starting_pos) - 1;
+ for (i = 0; i < len; i++)
+ add_char (with_char);
+ insert ('\n');
+ close_paragraph ();
+ filling_enabled = 1;
+ no_indent = old_no_indent;
+}
+
+/* Insert the text following input_text_offset up to the end of the
+ line as an HTML heading element of the appropriate `level' and
+ tagged as an anchor for the current node.. */
+
+void
+sectioning_html (int level, char *cmd)
+{
+ static int toc_ref_count = 0;
+ int index;
+ int old_no_indent;
+ unsigned char *starting_pos, *ending_pos;
+ char *temp, *toc_anchor = NULL;
+
+ close_paragraph ();
+ filling_enabled = indented_fill = 0;
+ old_no_indent = no_indent;
+ no_indent = 1;
+
+ /* level 0 (chapter) is <h2>, and we go down from there. */
+ add_html_block_elt_args ("<h%d class=\"%s\">", level + 2, cmd);
+
+ /* If we are outside of any node, produce an anchor that
+ the TOC could refer to. */
+ if (!current_node || !*current_node)
+ {
+ static const char a_name[] = "<a name=\"";
+
+ starting_pos = output_paragraph + output_paragraph_offset;
+ add_word_args ("%sTOC%d\">", a_name, toc_ref_count++);
+ toc_anchor = substring (starting_pos + sizeof (a_name) - 1,
+ output_paragraph + output_paragraph_offset);
+ /* This must be added after toc_anchor is extracted, since
+ toc_anchor cannot include the closing </a>. For details,
+ see toc.c:toc_add_entry and toc.c:contents_update_html.
+
+ Also, the anchor close must be output before the section name
+ in case the name itself contains an anchor. */
+ add_word ("</a>");
+ }
+ starting_pos = output_paragraph + output_paragraph_offset;
+
+ if (macro_expansion_output_stream && !executing_string)
+ append_to_expansion_output (input_text_offset + 1);
+
+ get_rest_of_line (0, &temp);
+
+ /* Use @settitle value if @top parameter is empty. */
+ if (STREQ (command, "top") && strlen(temp) == 0)
+ temp = xstrdup (title ? title : "");
+
+ index = search_sectioning (cmd);
+ if (index < 0)
+ {
+ /* should never happen, but a poor guy, named Murphy ... */
+ warning (_("Internal error (search_sectioning) \"%s\"!"), cmd);
+ return;
+ }
+
+ /* Produce "X.Y" and add it to HTML output. */
+ {
+ char *title_number = handle_enum_increment (level, index);
+ if (strlen (title_number) > 0)
+ add_word_args ("%s ", title_number);
+ }
+
+ /* add the section name to both HTML and macro-expanded output. */
+ if (macro_expansion_output_stream && !executing_string)
+ {
+ remember_itext (input_text, input_text_offset);
+ me_execute_string (temp);
+ write_region_to_macro_output ("\n", 0, 1);
+ }
+ else
+ execute_string ("%s", temp);
+
+ ending_pos = output_paragraph + output_paragraph_offset;
+
+ /* Pluck ``X.Y SECTION-NAME'' from the output buffer and insert it
+ into the TOC. */
+ if (section_alist[index].toc == TOC_YES)
+ toc_add_entry (substring (starting_pos, ending_pos),
+ level, current_node, toc_anchor);
+
+ free (temp);
+
+ if (outstanding_node)
+ outstanding_node = 0;
+
+ add_word_args ("</h%d>", level + 2);
+ close_paragraph();
+ filling_enabled = 1;
+ no_indent = old_no_indent;
+}
+
+
+/* Shift the meaning of @section to @chapter. */
+void
+cm_raisesections (void)
+{
+ discard_until ("\n");
+ section_alist_offset--;
+}
+
+/* Shift the meaning of @chapter to @section. */
+void
+cm_lowersections (void)
+{
+ discard_until ("\n");
+ section_alist_offset++;
+}
+
+/* The command still works, but prints a warning message in addition. */
+void
+cm_ideprecated (int arg, int start, int end)
+{
+ warning (_("%c%s is obsolete; use %c%s instead"),
+ COMMAND_PREFIX, command, COMMAND_PREFIX, command + 1);
+ sectioning_underscore (command + 1);
+}
+
+
+/* Treat this just like @unnumbered. The only difference is
+ in node defaulting. */
+void
+cm_top (void)
+{
+ /* It is an error to have more than one @top. */
+ if (top_node_seen && strcmp (current_node, "Top") != 0)
+ {
+ TAG_ENTRY *tag = tag_table;
+
+ line_error (_("Node with %ctop as a section already exists"),
+ COMMAND_PREFIX);
+
+ while (tag)
+ {
+ if (tag->flags & TAG_FLAG_IS_TOP)
+ {
+ file_line_error (tag->filename, tag->line_no,
+ _("Here is the %ctop node"), COMMAND_PREFIX);
+ return;
+ }
+ tag = tag->next_ent;
+ }
+ }
+ else
+ {
+ top_node_seen = 1;
+
+ /* It is an error to use @top before using @node. */
+ if (!tag_table)
+ {
+ char *top_name;
+
+ get_rest_of_line (0, &top_name);
+ line_error (_("%ctop used before %cnode, defaulting to %s"),
+ COMMAND_PREFIX, COMMAND_PREFIX, top_name);
+ execute_string ("@node Top, , (dir), (dir)\n@top %s\n", top_name);
+ free (top_name);
+ return;
+ }
+
+ cm_unnumbered ();
+
+ /* The most recently defined node is the top node. */
+ tag_table->flags |= TAG_FLAG_IS_TOP;
+
+ /* Now set the logical hierarchical level of the Top node. */
+ {
+ int orig_offset = input_text_offset;
+
+ input_text_offset = search_forward (node_search_string, orig_offset);
+
+ if (input_text_offset > 0)
+ {
+ int this_section;
+
+ /* We have encountered a non-top node, so mark that one exists. */
+ non_top_node_seen = 1;
+
+ /* Move to the end of this line, and find out what the
+ sectioning command is here. */
+ while (input_text[input_text_offset] != '\n')
+ input_text_offset++;
+
+ if (input_text_offset < input_text_length)
+ input_text_offset++;
+
+ this_section = what_section (input_text + input_text_offset,
+ NULL);
+
+ /* If we found a sectioning command, then give the top section
+ a level of this section - 1. */
+ if (this_section != -1)
+ set_top_section_level (this_section - 1);
+ }
+ input_text_offset = orig_offset;
+ }
+ }
+}
+
+/* The remainder of the text on this line is a chapter heading. */
+void
+cm_chapter (void)
+{
+ enum_marker = 0;
+ sectioning_underscore ("chapter");
+}
+
+/* The remainder of the text on this line is a section heading. */
+void
+cm_section (void)
+{
+ sectioning_underscore ("section");
+}
+
+/* The remainder of the text on this line is a subsection heading. */
+void
+cm_subsection (void)
+{
+ sectioning_underscore ("subsection");
+}
+
+/* The remainder of the text on this line is a subsubsection heading. */
+void
+cm_subsubsection (void)
+{
+ sectioning_underscore ("subsubsection");
+}
+
+/* The remainder of the text on this line is an unnumbered heading. */
+void
+cm_unnumbered (void)
+{
+ enum_marker = UNNUMBERED_MAGIC;
+ sectioning_underscore ("unnumbered");
+}
+
+/* The remainder of the text on this line is an unnumbered section heading. */
+void
+cm_unnumberedsec (void)
+{
+ sectioning_underscore ("unnumberedsec");
+}
+
+/* The remainder of the text on this line is an unnumbered
+ subsection heading. */
+void
+cm_unnumberedsubsec (void)
+{
+ sectioning_underscore ("unnumberedsubsec");
+}
+
+/* The remainder of the text on this line is an unnumbered
+ subsubsection heading. */
+void
+cm_unnumberedsubsubsec (void)
+{
+ sectioning_underscore ("unnumberedsubsubsec");
+}
+
+/* The remainder of the text on this line is an appendix heading. */
+void
+cm_appendix (void)
+{
+ /* Reset top level number so we start from Appendix A */
+ if (enum_marker != APPENDIX_MAGIC)
+ numbers [0] = 0;
+ enum_marker = APPENDIX_MAGIC;
+ sectioning_underscore ("appendix");
+}
+
+/* The remainder of the text on this line is an appendix section heading. */
+void
+cm_appendixsec (void)
+{
+ sectioning_underscore ("appendixsec");
+}
+
+/* The remainder of the text on this line is an appendix subsection heading. */
+void
+cm_appendixsubsec (void)
+{
+ sectioning_underscore ("appendixsubsec");
+}
+
+/* The remainder of the text on this line is an appendix
+ subsubsection heading. */
+void
+cm_appendixsubsubsec (void)
+{
+ sectioning_underscore ("appendixsubsubsec");
+}
+
+/* Compatibility functions substitute for chapter, section, etc. */
+void
+cm_majorheading (void)
+{
+ sectioning_underscore ("majorheading");
+}
+
+void
+cm_chapheading (void)
+{
+ sectioning_underscore ("chapheading");
+}
+
+void
+cm_heading (void)
+{
+ sectioning_underscore ("heading");
+}
+
+void
+cm_subheading (void)
+{
+ sectioning_underscore ("subheading");
+}
+
+void
+cm_subsubheading (void)
+{
+ sectioning_underscore ("subsubheading");
+}
diff --git a/Build/source/utils/texinfo/makeinfo/sectioning.h b/Build/source/utils/texinfo/makeinfo/sectioning.h
new file mode 100644
index 00000000000..8c3f2201654
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/sectioning.h
@@ -0,0 +1,103 @@
+/* sectioning.h -- all related stuff @chapter, @section... @contents
+ $Id: sectioning.h,v 1.5 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1999, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#ifndef SECTIONING_H
+#define SECTIONING_H
+
+/* Sectioning. */
+
+/* Level 4. */
+extern void cm_chapter (void),
+ cm_unnumbered (void),
+ cm_appendix (void),
+ cm_top (void);
+
+/* Level 3. */
+extern void cm_section (void),
+ cm_unnumberedsec (void),
+ cm_appendixsec (void);
+
+/* Level 2. */
+extern void cm_subsection (void),
+ cm_unnumberedsubsec (void),
+ cm_appendixsubsec (void);
+
+/* Level 1. */
+extern void cm_subsubsection (void),
+ cm_unnumberedsubsubsec (void),
+ cm_appendixsubsubsec (void);
+
+/* Headings. */
+extern void cm_heading (void),
+ cm_chapheading (void),
+ cm_subheading (void),
+ cm_subsubheading (void),
+ cm_majorheading (void);
+
+extern void cm_raisesections (void),
+ cm_lowersections (void),
+ cm_ideprecated (int arg, int start, int end);
+
+extern void
+ sectioning_underscore (char *cmd),
+ insert_and_underscore (int level, char *cmd);
+
+/* needed in node.c */
+extern int set_top_section_level (int level);
+
+extern void sectioning_html (int level, char *cmd);
+extern int what_section (char *text, char **secname);
+extern char *current_chapter_number (void),
+ *current_sectioning_number (void),
+ *current_sectioning_name (void);
+
+/* The argument of @settitle, used for HTML. */
+extern char *title;
+
+
+/* Here is a structure which associates sectioning commands with
+ an integer that reflects the depth of the current section. */
+typedef struct
+{
+ char *name;
+ int level; /* I can't replace the levels with defines
+ because it is changed during run */
+ int num; /* ENUM_SECT_NO means no enumeration...
+ ENUM_SECT_YES means enumerated version
+ ENUM_SECT_APP appendix (Character enumerated
+ at first position */
+ int toc; /* TOC_NO means do not enter in toc;
+ TOC_YES means enter it in toc */
+} section_alist_type;
+
+extern section_alist_type section_alist[];
+
+/* enumerate sections */
+#define ENUM_SECT_NO 0
+#define ENUM_SECT_YES 1
+#define ENUM_SECT_APP 2
+
+/* make entries into toc no/yes */
+#define TOC_NO 0
+#define TOC_YES 1
+
+
+#endif /* not SECTIONING_H */
diff --git a/Build/source/utils/texinfo/makeinfo/tests/Makefile.am b/Build/source/utils/texinfo/makeinfo/tests/Makefile.am
new file mode 100644
index 00000000000..6e58451b060
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/Makefile.am
@@ -0,0 +1,36 @@
+# $Id: Makefile.am,v 1.5 2004/04/11 17:56:47 karl Exp $
+# Makefile.am for texinfo/tests/makeinfo.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+TESTS = accent accentenc \
+ cond \
+ copying \
+ defxcond \
+ html-docdesc html-extrali html-min html-manuals html-para html-title \
+ html-top \
+ include-value \
+ macro-at menu-whitespace \
+ no-headers \
+ node-expand node-value node-whitespace \
+ top \
+ twofiles
+
+noinst_SCRIPTS = $(TESTS)
+
+EXTRA_DIST = $(noinst_SCRIPTS) \
+ accent.txi accentenc.txi accent-text.txi \
+ cond.txi copying.txi \
+ defxcond.txi \
+ html-docdesc.txi html-extrali.txi html-min.txi html-para.txi html-title.txi \
+ html-top.txi \
+ include-value.txi incl-incl.txi \
+ macro-at.txi menu-whitespace.txi \
+ node-expand.txi node-value.txi node-whitespace.txi \
+ top.txi # top2.txi
diff --git a/Build/source/utils/texinfo/makeinfo/tests/Makefile.in b/Build/source/utils/texinfo/makeinfo/tests/Makefile.in
new file mode 100644
index 00000000000..35a0d9f9a33
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/Makefile.in
@@ -0,0 +1,447 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.5 2004/04/11 17:56:47 karl Exp $
+# Makefile.am for texinfo/tests/makeinfo.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = makeinfo/tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SCRIPTS = $(noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+TESTS = accent accentenc \
+ cond \
+ copying \
+ defxcond \
+ html-docdesc html-extrali html-min html-manuals html-para html-title \
+ html-top \
+ include-value \
+ macro-at menu-whitespace \
+ no-headers \
+ node-expand node-value node-whitespace \
+ top \
+ twofiles
+
+noinst_SCRIPTS = $(TESTS)
+EXTRA_DIST = $(noinst_SCRIPTS) \
+ accent.txi accentenc.txi accent-text.txi \
+ cond.txi copying.txi \
+ defxcond.txi \
+ html-docdesc.txi html-extrali.txi html-min.txi html-para.txi html-title.txi \
+ html-top.txi \
+ include-value.txi incl-incl.txi \
+ macro-at.txi menu-whitespace.txi \
+ node-expand.txi node-value.txi node-whitespace.txi \
+ top.txi # top2.txi
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu makeinfo/tests/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu makeinfo/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(SCRIPTS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+ distclean distclean-generic distdir dvi dvi-am html html-am \
+ info info-am install install-am install-data install-data-am \
+ install-exec install-exec-am install-info install-info-am \
+ install-man install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+ uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/makeinfo/tests/accent b/Build/source/utils/texinfo/makeinfo/tests/accent
new file mode 100755
index 00000000000..16c69e8e0d3
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/accent
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Test accent output.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+input=`basename $0`.txi
+
+# html.
+houtput=`basename $0`.html
+../makeinfo --html --no-split -I$srcdir $srcdir/$input
+hexit_status=$?
+if test $hexit_status = 0; then
+ grep '&igrave;' $houtput >/dev/null \
+ && grep '&acute;j' $houtput >/dev/null \
+ && grep '&Oslash;' $houtput >/dev/null \
+ && grep '/L' $houtput >/dev/null
+ hexit_status=$?
+fi
+
+# info
+ioutput=`basename $0`.info
+../makeinfo --no-split -I$srcdir $srcdir/$input
+iexit_status=$?
+if test $iexit_status = 0; then
+ grep 'i`' $ioutput >/dev/null \
+ && grep 'i"' $ioutput >/dev/null \
+ && grep '/L' $ioutput >/dev/null
+ iexit_status=$?
+fi
+
+rm -f $houtput $ioutput
+
+exit_status=`expr $hexit_status + $iexit_status`
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/accent-text.txi b/Build/source/utils/texinfo/makeinfo/tests/accent-text.txi
new file mode 100644
index 00000000000..4d9ef3ca587
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/accent-text.txi
@@ -0,0 +1,73 @@
+@c args with braces, without braces/following whitespace
+
+should be e`: @`{e} @`e
+
+should be e': @'{e} @'e
+
+should be e^: @^{e} @^e
+
+should be u": @"{u} @"u
+
+should be i`: @`{i} @`i
+
+should be i': @'{i} @'i
+
+should be i^: @^{i} @^i
+
+should be u": @"{u} @"u
+
+should be c,: @,{c} @,c
+
+should be n~: @~{n} @~n
+
+should be e=: @={e} @=e
+
+should be e@w{'}': @H{e} @H e
+
+should be e.: @dotaccent{e} @dotaccent e
+
+should be e*: @ringaccent{e} @ringaccent e
+
+should be ee[: @tieaccent{ee}
+
+should be e(: @u{e} @u e
+
+should be e_: @ubaraccent{e} @ubaraccent e
+
+should be .e: @udotaccent{e} @udotaccent e
+
+should be e<: @v{e} @v e
+
+upside down: @questiondown{} @exclamdown{}
+
+A-with-circle: @aa{},@AA{}
+
+AE, OE ligatures: @ae{} @AE{} @oe{} @OE{}
+
+dotless i, j: @dotless{i} @dotless{j}
+
+Polish suppressed-L: @l{} @L{}
+
+O-with-slash: @o{} @O{}
+
+es-zet or sharp S: @ss{}
+
+pounds sterling: @pounds{}
+
+@c arg is command -- @dotless{i} is special-cased for HTML
+should be dotless i`: @`{@dotless{i}}
+
+should be dotless i': @'{@dotless{i}}
+
+should be dotless i^: @^{@dotless{i}}
+
+should be dotless i": @"{@dotless{i}}
+
+@c arg is command -- @dotless{j}
+should be dotless j`: @`{@dotless{j}}
+
+should be dotless j': @'{@dotless{j}}
+
+should be dotless j^: @^{@dotless{j}}
+
+should be dotless j": @"{@dotless{j}}
diff --git a/Build/source/utils/texinfo/makeinfo/tests/accent.txi b/Build/source/utils/texinfo/makeinfo/tests/accent.txi
new file mode 100644
index 00000000000..3c52a90bde4
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/accent.txi
@@ -0,0 +1,10 @@
+\input texinfo
+@setfilename accent.info
+@settitle Accent test
+
+@node Top
+@top Accent test top
+
+@include accent-text.txi
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/accentenc b/Build/source/utils/texinfo/makeinfo/tests/accentenc
new file mode 100755
index 00000000000..be842c368b8
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/accentenc
@@ -0,0 +1,24 @@
+#!/bin/sh
+# Test encoded accent info output.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+input=`basename $0`.txi
+output=`basename $0`.info
+
+# we expect two invalid encoded characters:
+# accent-text.txi:45: warning: invalid encoded character `#156'.
+# accent-text.txi:45: warning: invalid encoded character `#140'.
+# These are oe and OE, and they are not supported in Latin 1.
+../makeinfo --enable-encoding --no-split -I$srcdir $srcdir/$input 2>/dev/null
+exit_status=$?
+if test $exit_status = 0; then
+ grep 'ě' $output >/dev/null \
+ && grep 'ď' $output >/dev/null \
+ && grep '/L' $output >/dev/null
+ exit_status=$?
+fi
+
+rm -f $output
+
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/accentenc.txi b/Build/source/utils/texinfo/makeinfo/tests/accentenc.txi
new file mode 100644
index 00000000000..b6e209c64fa
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/accentenc.txi
@@ -0,0 +1,11 @@
+\input texinfo
+@setfilename accentenc.info
+@settitle Accent encoding test
+@documentencoding ISO-8859-1
+
+@node Top
+@top Accent encoding test top
+
+@include accent-text.txi
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/cond b/Build/source/utils/texinfo/makeinfo/tests/cond
new file mode 100755
index 00000000000..24a1cd4cb3a
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/cond
@@ -0,0 +1,33 @@
+#!/bin/sh
+# Test conditional text.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+# Default Info output.
+../makeinfo -o cond.out $srcdir/cond.txi || exit 1
+egrep 'This is (ifnothtml|ifinfo|ifnottex) text' cond.out >/dev/null \
+ || exit 2
+test `fgrep ' text.' cond.out | wc -l` -eq 3 || exit 3
+
+# Default HTML output.
+../makeinfo --no-split --html -o cond.out $srcdir/cond.txi || exit 1
+egrep 'This is (html|ifhtml|ifnotinfo|ifnottex) text' cond.out >/dev/null \
+ || exit 2
+test `fgrep ' text.' cond.out | wc -l` -eq 4 || exit 3
+
+# --ifhtml off, --ifinfo off, --iftex off.
+../makeinfo --no-ifhtml --no-ifinfo --no-iftex -o cond.out $srcdir/cond.txi || exit 1
+egrep 'This is ifnot(html|info|tex) text' cond.out >/dev/null \
+ || exit 2
+test `fgrep ' text.' cond.out | wc -l` -eq 3 || exit 3
+
+# Do we really need to test all the other permutations?
+
+# --ifhtml on, --ifinfo on, --iftex on.
+../makeinfo --ifhtml --ifinfo --iftex -o cond.out $srcdir/cond.txi || exit 1
+egrep 'This is (html|ifhtml|ifinfo|tex|iftex) text' cond.out >/dev/null \
+ || exit 2
+test `fgrep ' text.' cond.out | wc -l` -eq 5 || exit 3
+
+rm -f cond.out cond.info
diff --git a/Build/source/utils/texinfo/makeinfo/tests/cond.txi b/Build/source/utils/texinfo/makeinfo/tests/cond.txi
new file mode 100644
index 00000000000..b60242322dc
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/cond.txi
@@ -0,0 +1,40 @@
+\input texinfo
+@setfilename cond.info
+
+@node Top
+
+@html
+This is html text.
+@end html
+
+@ifhtml
+This is ifhtml text.
+@end ifhtml
+
+@ifnothtml
+This is ifnothtml text.
+@end ifnothtml
+
+
+@ifinfo
+This is ifinfo text.
+@end ifinfo
+
+@ifnotinfo
+This is ifnotinfo text.
+@end ifnotinfo
+
+
+@tex
+This is tex text.
+@end tex
+
+@iftex
+This is iftex text.
+@end iftex
+
+@ifnottex
+This is ifnottex text.
+@end ifnottex
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/copying b/Build/source/utils/texinfo/makeinfo/tests/copying
new file mode 100755
index 00000000000..4fa77d607de
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/copying
@@ -0,0 +1,13 @@
+#!/bin/sh
+# $Id: copying,v 1.2 2004/04/20 13:26:00 karl Exp $
+# Test @copying. The configure script for tramp uses this to make sure
+# the makeinfo that is present supports @copying.
+
+unset TEXINFO_OUTPUT LANG LANGUAGE
+LC_ALL=POSIX; export LC_ALL
+: ${srcdir=.}
+
+../makeinfo -o copying.out $srcdir/copying.txi || exit 1
+fgrep 'produced by' copying.out >/dev/null || exit 2
+
+rm -f copying.out
diff --git a/Build/source/utils/texinfo/makeinfo/tests/copying.txi b/Build/source/utils/texinfo/makeinfo/tests/copying.txi
new file mode 100644
index 00000000000..3b836795050
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/copying.txi
@@ -0,0 +1,4 @@
+\input texinfo @c -*-texinfo-*-
+@copying
+@end copying
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/defxcond b/Build/source/utils/texinfo/makeinfo/tests/defxcond
new file mode 100755
index 00000000000..e48986785d7
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/defxcond
@@ -0,0 +1,16 @@
+#!/bin/sh
+# Test conditionalized @deffnx.
+# Report from: Akim Demaille <akim@epita.fr>, 14 Aug 2003 12:10:37 +0200.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+test=defxcond
+
+../makeinfo -Dbar -o $test.out $srcdir/$test.txi || exit 1
+grep ' -- bar:' $test.out >/dev/null || exit 2
+
+../makeinfo -Ubar -o $test.out $srcdir/$test.txi || exit 3
+grep ' -- bar:' $test.out >/dev/null && exit 4
+
+rm -f $test.out
diff --git a/Build/source/utils/texinfo/makeinfo/tests/defxcond.txi b/Build/source/utils/texinfo/makeinfo/tests/defxcond.txi
new file mode 100644
index 00000000000..a7af9e21e75
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/defxcond.txi
@@ -0,0 +1,18 @@
+\input texinfo
+@setfilename defxcond.info
+
+@c set this from the command line.
+@c set bar
+
+@c deffnx inside conditional.
+@deffn foo
+
+@ifset bar
+@deffnx bar
+@end ifset
+
+Documentation.
+
+@end deffn
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-docdesc b/Build/source/utils/texinfo/makeinfo/tests/html-docdesc
new file mode 100755
index 00000000000..59df74e411b
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-docdesc
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Test that @documentdescription works.
+
+if ../makeinfo --html --no-split ${srcdir-.}/html-docdesc.txi; then
+ grep 'explicit document description' html-docdesc.html >/dev/null
+ exit_status=$?
+else
+ exit_status=1
+fi
+
+rm -f html-docdesc.html
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-docdesc.txi b/Build/source/utils/texinfo/makeinfo/tests/html-docdesc.txi
new file mode 100644
index 00000000000..0b328dacd2a
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-docdesc.txi
@@ -0,0 +1,14 @@
+\input texinfo
+@setfilename html-docdesc.info
+@settitle HTML docdesc test
+
+@documentdescription
+This is the explicit document description.
+@end documentdescription
+
+@node Top
+@top Top of HTML docdesc test
+
+This is the top.
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-extrali b/Build/source/utils/texinfo/makeinfo/tests/html-extrali
new file mode 100755
index 00000000000..c3ec9ca08d5
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-extrali
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Test no extra <li> from @menu.
+
+: ${srcdir=.}
+
+li_count=`../makeinfo --no-split --html -o - $srcdir/html-extrali.txi 2>/dev/null \
+| grep '<li>' \
+| wc -l`
+
+if test "$li_count" -ne 1; then
+ echo "$li_count <li>s instead of one." >&2
+ exit 1
+else
+ exit 0
+fi
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-extrali.txi b/Build/source/utils/texinfo/makeinfo/tests/html-extrali.txi
new file mode 100644
index 00000000000..d0c17e98785
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-extrali.txi
@@ -0,0 +1,11 @@
+\input texinfo
+@setfilename menuli.info
+
+@c extra li generated after <menu>
+@c From: Marius Groeger <mag@sysgo.de>, 13nov98.
+
+@menu
+* entry1::
+@end menu
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-manuals b/Build/source/utils/texinfo/makeinfo/tests/html-manuals
new file mode 100755
index 00000000000..2ba24f34a44
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-manuals
@@ -0,0 +1,13 @@
+#!/bin/sh
+# $Id: html-manuals,v 1.3 2004/04/11 17:56:47 karl Exp $
+# Test that all the distribution manuals can be converted to HTML.
+
+: ${srcdir=.}
+
+for manual in info.texi info-stnd.texi texinfo.txi; do
+ base=`echo $manual | sed 's/\.te*xi$//'`
+ ../makeinfo --html -I$srcdir/../../doc -I../../doc --no-split \
+ $srcdir/../../doc/$manual -o $base.html \
+ || exit 1
+ rm -f $base.html
+done
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-min b/Build/source/utils/texinfo/makeinfo/tests/html-min
new file mode 100755
index 00000000000..948071a9917
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-min
@@ -0,0 +1,8 @@
+#!/bin/sh
+# Test that a minimal Texinfo file can be converted to HTML.
+
+../makeinfo --html --no-split ${srcdir-.}/html-min.txi
+exit_status=$?
+
+rm -f html-min.html
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-min.txi b/Build/source/utils/texinfo/makeinfo/tests/html-min.txi
new file mode 100644
index 00000000000..116519e0611
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-min.txi
@@ -0,0 +1,12 @@
+\input texinfo
+@setfilename html-min.info
+@settitle HTML min test
+
+@node Top
+@top Top of HTML min test
+
+Top.
+
+Second paragraph.
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-para b/Build/source/utils/texinfo/makeinfo/tests/html-para
new file mode 100755
index 00000000000..a9ea2b5a9bd
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-para
@@ -0,0 +1,8 @@
+#!/bin/sh
+# Test that paragraph beginnings in HTML work ok.
+
+../makeinfo --no-split --html ${srcdir-.}/html-para.txi
+exit_status=$?
+
+rm -f html-para.html
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-para.txi b/Build/source/utils/texinfo/makeinfo/tests/html-para.txi
new file mode 100644
index 00000000000..c6e34fd2513
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-para.txi
@@ -0,0 +1,24 @@
+\input texinfo
+@setfilename html-para.info
+@settitle HTML paragraph beginning test
+
+@c <p> is emitted at paragraph beginning, which makes the text
+@c between START and END not exactly what some cm_xxx functions
+@c expect, when they are called by pop_and_call_brace.
+
+@set val @@value@{@}
+@definfoenclose foo,\\,//
+
+@node Top
+@top Top of HTML paragraph test
+
+@value{val} should work at the beginning of a new paragraph.
+
+@dotless{i} dotless should not trigger error messages at the beginning
+of a new paragraph.
+
+@sc{small-caps} should work at the beginning of a new paragraph.
+
+@foo{@@definfoenclose} should work at the beginning of a new paragraph.
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-title b/Build/source/utils/texinfo/makeinfo/tests/html-title
new file mode 100755
index 00000000000..54badd51fad
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-title
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Test that titles with @ commands don't produce markup in the <title>.
+# (And that the @ commands get expanded.)
+
+if ../makeinfo --no-split --html ${srcdir-.}/html-title.txi; then
+ grep '^<title>@[^<>]*</title>$' html-title.html >/dev/null
+ exit_status=$?
+else
+ exit_status=1
+fi
+
+rm -f html-title.html
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-title.txi b/Build/source/utils/texinfo/makeinfo/tests/html-title.txi
new file mode 100644
index 00000000000..2e2f25c579f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-title.txi
@@ -0,0 +1,12 @@
+\input texinfo
+@setfilename html-title.info
+@settitle @@title @sc{html} @code{test}
+
+@node Top
+@top Top of @@title @sc{html} @code{test}
+
+Top.
+
+Second paragraph.
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-top b/Build/source/utils/texinfo/makeinfo/tests/html-top
new file mode 100755
index 00000000000..038404a49d1
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-top
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Test that a bare top node does not crash with --html.
+
+: ${srcdir=.}
+
+# But this input file is erroneous, so throw away errors.
+../makeinfo --no-split --force -o html-top.html --html $srcdir/html-top.txi \
+2>/dev/null
+test -s html-top.html
+exit_status=$?
+
+rm -f html-top.html
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/html-top.txi b/Build/source/utils/texinfo/makeinfo/tests/html-top.txi
new file mode 100644
index 00000000000..ade7214b0c2
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/html-top.txi
@@ -0,0 +1,7 @@
+\input texinfo
+@setfilename top.info
+
+@node start
+@top
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/incl-incl.txi b/Build/source/utils/texinfo/makeinfo/tests/incl-incl.txi
new file mode 100644
index 00000000000..4efea484317
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/incl-incl.txi
@@ -0,0 +1 @@
+This is the @emph{included} file (include-value2.txi).
diff --git a/Build/source/utils/texinfo/makeinfo/tests/include-value b/Build/source/utils/texinfo/makeinfo/tests/include-value
new file mode 100755
index 00000000000..2c4ca60eff5
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/include-value
@@ -0,0 +1,22 @@
+#!/bin/sh
+# $Id: include-value,v 1.3 2004/04/11 17:56:47 karl Exp $
+# Test @value expansion in @include and @verbatiminclude names.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+../makeinfo -I $srcdir $srcdir/include-value.txi
+exit_status=$?
+
+if test $exit_status = 0; then
+ # should have three instances of _included_,
+ # and three of {included}.
+ count=`grep _included_ include-value.info | wc -l`
+ test $count = 3 || exit_status=`expr $exit_status + 1`
+
+ count=`grep '{included}' include-value.info | wc -l`
+ test $count = 3 || exit_status=`expr $exit_status + 1`
+fi
+
+rm -f include-value.info
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/include-value.txi b/Build/source/utils/texinfo/makeinfo/tests/include-value.txi
new file mode 100644
index 00000000000..1c7f9b93d16
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/include-value.txi
@@ -0,0 +1,32 @@
+\input texinfo
+@setfilename include-value.info
+@c $Id: include-value.txi,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+@set testvar incl-incl.txi
+
+@c test - in the variable name, and concatenation of text after.
+@set test-var incl-incl.tx
+
+@c test - in the variable name, and concatenation of text before and after.
+@set test_var ncl-incl.tx
+
+
+@node Top
+
+testvar include: @include @value{testvar}
+
+testvar verbatiminclude: @verbatiminclude @value{testvar}
+
+
+test-var include: @include @value{test-var}i
+
+test-var verbatiminclude: @verbatiminclude @value{test-var}i
+
+
+test_var include: @include i@value{test_var}i
+
+test_var verbatiminclude: @verbatiminclude i@value{test_var}i
+
+
+@bye
+
diff --git a/Build/source/utils/texinfo/makeinfo/tests/macro-at b/Build/source/utils/texinfo/makeinfo/tests/macro-at
new file mode 100755
index 00000000000..a9dfdab3be9
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/macro-at
@@ -0,0 +1,8 @@
+#!/bin/sh
+# Test @@ in macro expansions, etc. --eliz, 14nov99.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+../makeinfo $srcdir/macro-at.txi || exit 1
+
+rm -f macro-at.info
diff --git a/Build/source/utils/texinfo/makeinfo/tests/macro-at.txi b/Build/source/utils/texinfo/makeinfo/tests/macro-at.txi
new file mode 100644
index 00000000000..24b91013456
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/macro-at.txi
@@ -0,0 +1,38 @@
+\input texinfo @c -*- texinfo -*-
+@setfilename macro-at.info
+@settitle AUTHORS -- who did what on GNU LilyPond
+
+@macro foo
+foo-expansion
+@end macro
+
+@macro bar
+bar-expansion
+@end macro
+
+@node Top, , AUTHORS -- who did what on GNU LilyPond, (dir)
+@top
+@menu
+* AUTHORS -- who did what on GNU LilyPond:: AUTHORS -- who did what.
+@end menu
+
+@node AUTHORS -- who did what on GNU LilyPond, Top, , Top
+@chapter AUTHORS -- who did what on GNU LilyPond?
+
+This file lists authors of GNU LilyPond, and what they wrote.
+It also uses foobar@{.
+
+@itemize @bullet
+@item @email{pinard@@iro.montreal.ca, Fran@,{c}ois Pinard},
+ parts of Documentation.
+@item @email{foobar@@baz@@, The Foobar},
+ the usual foobarical thing.
+@item @email{another@@foobar@{, Buzzer},
+ buzzed all the way.
+@item @email{@foo{}@@@bar{}},
+ also helped.
+@item @email{tomcato@@xoommail.com, Tom Cato Amundsen},
+ cembalo-partita in mundela.
+@end itemize
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/menu-whitespace b/Build/source/utils/texinfo/makeinfo/tests/menu-whitespace
new file mode 100755
index 00000000000..a01a38d5c04
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/menu-whitespace
@@ -0,0 +1,72 @@
+#!/bin/sh
+# Bug where whitespace after @menu caused confusion.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+input=`basename $0`.txi
+
+../makeinfo -o /dev/null $srcdir/$input
+exit $?
+
+Date: 07 Dec 1998 11:23:44 +0100
+From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+To: bug-texinfo@gnu.org
+Subject: Makeinfo mishandles defaulted node links
+
+The following example demonstrates a bug in makeinfo:
+
+$ cat top.texi
+@setfilename top.info
+
+@node Top
+@top Top
+
+@menu
+* first::
+@end menu
+
+@node first
+@chapter first
+
+@menu @c
+* second::
+@end menu
+
+@node second
+@section second
+$ makeinfo top.texi
+Making info file `top.info' from `top.texi'.
+./top.texi:3: Next field of node `Top' not pointed to.
+./top.texi:17: This node (second) has the bad Prev.
+makeinfo: Removing output file `/home/as/test/top.info' due to errors; use --force to preserve.
+
+Makeinfo is being confused by the whitespace after @menu, or rather by its
+absence.
+
+
+1998-12-06 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
+
+ * makeinfo/node.c (cm_node): When searching for @menu don't
+ require a space after it.
+
+--- texinfo-3.12b/makeinfo/node.c.~1~ Mon Oct 26 23:14:59 1998
++++ texinfo-3.12b/makeinfo/node.c Sun Dec 6 00:23:59 1998
+@@ -523,9 +523,10 @@
+ orig_size = size_of_input_text;
+
+ input_text_offset =
+- search_forward ("\n@menu ", orig_offset);
++ search_forward ("\n@menu", orig_offset);
+
+- if (input_text_offset > -1)
++ if (input_text_offset > -1
++ && cr_or_whitespace (input_text[input_text_offset + 6]))
+ {
+ char *nodename_from_menu = NULL;
+
+
+--
+Andreas Schwab "And now for something
+schwab@issan.cs.uni-dortmund.de completely different"
+schwab@gnu.org
+
diff --git a/Build/source/utils/texinfo/makeinfo/tests/menu-whitespace.txi b/Build/source/utils/texinfo/makeinfo/tests/menu-whitespace.txi
new file mode 100644
index 00000000000..fd1c39f7ebf
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/menu-whitespace.txi
@@ -0,0 +1,18 @@
+@setfilename top.info
+
+@node Top
+@top Top
+
+@menu
+* first::
+@end menu
+
+@node first
+@chapter first
+
+@menu @c
+* second::
+@end menu
+
+@node second
+@section second
diff --git a/Build/source/utils/texinfo/makeinfo/tests/no-headers b/Build/source/utils/texinfo/makeinfo/tests/no-headers
new file mode 100755
index 00000000000..e0718713f32
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/no-headers
@@ -0,0 +1,9 @@
+#!/bin/sh
+# Test that info.texi works with --no-headers (this includes node
+# pointer defaulting).
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+docdir=$srcdir/../../doc
+
+../makeinfo --no-headers -o /dev/null -I$docdir info.texi
diff --git a/Build/source/utils/texinfo/makeinfo/tests/node-expand b/Build/source/utils/texinfo/makeinfo/tests/node-expand
new file mode 100755
index 00000000000..26dee246478
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/node-expand
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Test command expansion in node names.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+../makeinfo --commands-in-node-names $srcdir/node-expand.txi
+test -s node-expand.info
+exit_status=$?
+
+rm -f node-expand.info
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/node-expand.txi b/Build/source/utils/texinfo/makeinfo/tests/node-expand.txi
new file mode 100644
index 00000000000..c31be5a4ebc
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/node-expand.txi
@@ -0,0 +1,64 @@
+\input texinfo.tex @c -*-texinfo-*-
+
+@setfilename node-expand.info
+
+@c Makeinfo should expand non-macros such as @@ and @value
+@c in node names and node references, including menus.
+@c This file deliberately references "Node 1" both via
+@c @value and directly; this should not trigger any errors,
+@c as long as --commands-in-node-names is used.
+@c Index entries should all be expanded as well.
+
+@set node1 Node 1
+
+@ifnottex
+
+@node Top, (dir), (dir), (dir)
+@top Expansion in Node Names
+
+@end ifnottex
+
+@menu
+* @value{node1} ::
+* @@node `2'::
+* ``node'' with---tricks::
+@end menu
+
+@xref{@@node `2'}.
+
+@node @value{node1}, @@node `2', Top, Top
+@chapter Chapter 1
+
+@cindex entry for chapter 1
+This is chapter 1.
+@xref{@@node `2'}.
+
+@set sec1 Section 1.1
+
+@menu
+* @value{sec1}::
+@end menu
+
+@node Section 1.1, , Node 1, Node 1
+@comment node-name, next, previous, up
+
+@cindex entry for section 1.1
+This is section 1.1.
+
+@node @@node `2', ``node'' with---tricks, @value{node1}, Top
+@comment node-name, next, previous, up
+@chapter Node 2
+
+@cindex entry for chapter 2
+This is chapter 2.
+@xref{@value{node1}}. @xref{Node 1}.
+@xref{``node'' with---tricks, Node with some tricks}.
+
+@node ``node'' with---tricks, , @@node `2', Top
+
+@cindex tricks
+Another node.
+
+@printindex cp
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/node-value b/Build/source/utils/texinfo/makeinfo/tests/node-value
new file mode 100755
index 00000000000..aff0be22dea
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/node-value
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Test @value expansion in node names.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+../makeinfo $srcdir/node-value.txi
+grep -v "No Value" node-value.info >/dev/null
+exit_status=$?
+
+rm -f node-value.info
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/node-value.txi b/Build/source/utils/texinfo/makeinfo/tests/node-value.txi
new file mode 100644
index 00000000000..ba1173f9a89
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/node-value.txi
@@ -0,0 +1,15 @@
+\input texinfo
+@setfilename node-value.info
+@set a--foo bar
+
+@node Top, @value{a--foo}, (dir), (dir)
+@top Var @value{a--foo}
+@value{a--foo}
+
+@node @value{a--foo}, BarFoo, Top, (dir)
+@chapter BarFoo
+
+@node BarFoo, , @value{a--foo}, (dir)
+@chapter bar
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/node-whitespace b/Build/source/utils/texinfo/makeinfo/tests/node-whitespace
new file mode 100755
index 00000000000..e4801089884
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/node-whitespace
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Test whitespace collapse in node names.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+../makeinfo $srcdir/node-whitespace.txi
+test -s node-whitespace.info
+exit_status=$?
+
+rm -f node-whitespace.info
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/node-whitespace.txi b/Build/source/utils/texinfo/makeinfo/tests/node-whitespace.txi
new file mode 100644
index 00000000000..04f0339a8c8
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/node-whitespace.txi
@@ -0,0 +1,30 @@
+\input texinfo.tex @c -*-texinfo-*-
+
+@setfilename node-whitespace.info
+
+@c Makeinfo should collapse whitespace in node names.
+
+@ifnottex
+
+@node Top
+@top Whitespace in Node Names
+
+@end ifnottex
+
+@menu
+* Chap 1.3 ::
+* Chap 1.4 :Chap 1.4.
+@end menu
+
+@node Chap 1.3
+@chapter Chap 1.3
+
+Can I reach here?
+
+@node Chap 1.4
+@chapter Another space test
+
+How about here?
+@xref{Chap 1.3}.
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/top b/Build/source/utils/texinfo/makeinfo/tests/top
new file mode 100755
index 00000000000..c1288f39fed
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/top
@@ -0,0 +1,11 @@
+#!/bin/sh
+# Test that a top node can be ignored.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+../makeinfo $srcdir/top.txi || exit 1
+
+# Expected warnings due to use of @ifinfo instead of @ifnottex.
+../makeinfo --no-split --no-warn --html $srcdir/top.txi -o top.html || exit 1
+
+rm -f top*.html top.info
diff --git a/Build/source/utils/texinfo/makeinfo/tests/top.txi b/Build/source/utils/texinfo/makeinfo/tests/top.txi
new file mode 100644
index 00000000000..e8c3cbbc078
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/top.txi
@@ -0,0 +1,25 @@
+\input texinfo
+@setfilename top.info
+@settitle top test
+
+@c This traditional top node uses @ifinfo for testing.
+@c Therefore there will be warnings when processing with --html.
+@c The solution is to use @ifnottex instead.
+
+@ifinfo
+@node Top
+@top Top test
+
+Typical top node.
+@end ifinfo
+
+@menu
+* Subnode::
+@end menu
+
+@node Subnode
+@chapter Subnode
+
+Subnode.
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/top2 b/Build/source/utils/texinfo/makeinfo/tests/top2
new file mode 100755
index 00000000000..7bc27c14c4a
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/top2
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Test that a bare top node does not crash with --html.
+
+: ${srcdir=.}
+
+# But this input file is erroneous, so throw away errors.
+../makeinfo --no-split --force -o top2.html --html $srcdir/top2.txi 2>/dev/null
+test -s top2.html
+exit_status=$?
+
+rm -f top2.html
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/tests/top2.txi b/Build/source/utils/texinfo/makeinfo/tests/top2.txi
new file mode 100644
index 00000000000..ade7214b0c2
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/top2.txi
@@ -0,0 +1,7 @@
+\input texinfo
+@setfilename top.info
+
+@node start
+@top
+
+@bye
diff --git a/Build/source/utils/texinfo/makeinfo/tests/twofiles b/Build/source/utils/texinfo/makeinfo/tests/twofiles
new file mode 100755
index 00000000000..22c477c9d57
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/tests/twofiles
@@ -0,0 +1,23 @@
+#!/bin/sh
+# $Id: twofiles,v 1.3 2004/04/11 17:56:47 karl Exp $
+# Test that an existing and nonexisting file doesn't cause a
+# segmentation fault.
+# From: Arkadiusz Miskiewicz <misiek@pld.ORG.PL>, 15 Feb 2003 13:22:49 +0100.
+
+unset TEXINFO_OUTPUT
+: ${srcdir=.}
+
+outfile=outfile
+errfile=errfile
+trap 'status=$?; rm -f $outfile $errfile && exit $status' 0
+
+../makeinfo -o /dev/null $srcdir/html-min.txi /nonexistent.texinfo \
+>$outfile 2>$errfile
+exit_status=$?
+
+# we expect one error message about /nonexistent.texinfo and bad exit status.
+test $exit_status -ne 0 \
+&& grep /nonexistent $errfile >/dev/null \
+&& exit_status=0
+
+exit $exit_status
diff --git a/Build/source/utils/texinfo/makeinfo/texinfo.dtd b/Build/source/utils/texinfo/makeinfo/texinfo.dtd
new file mode 100644
index 00000000000..bdd34c95f54
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/texinfo.dtd
@@ -0,0 +1,337 @@
+<!-- $Id: texinfo.dtd,v 1.2 2002/12/17 16:34:22 karl Exp $
+ Document Type Definition for Texinfo.
+
+ Author: Philippe Martin (feloy@free.fr)
+ Contributors:
+ Karl Eichwalder (keichwa@gmx.net)
+
+ Copyright (C) 2001, 02 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+-->
+
+<!-- ENTITIES -->
+
+<!-- Meta-information -->
+<!ENTITY % metainformation "setfilename | settitle | titlefont | dircategory">
+
+<!-- block -->
+<!-- ***** -->
+<!ENTITY % block "menu | para | quotation | example | smallexample | lisp
+ | smalllisp | cartouche | copying
+ | format | smallformat | display
+ | smalldisplay | itemize | enumerate | sp | center | group
+ | table | multitable">
+
+<!-- Sectioning -->
+<!-- ********** -->
+<!ENTITY % section.level1 "top | chapter | unnumbered | appendix
+ | majorheading | chapheading">
+
+<!ENTITY % section.level2 "section | unnumberedsec | appendixsec | heading">
+
+<!ENTITY % section.level3 "subsection | unnumberedsubsec | appendixsubsec
+ | subheading">
+
+<!ENTITY % section.level4 "subsubsection | unnumberedsubsubsec
+ | appendixsubsubsec | subsubheading">
+
+<!ENTITY % section.all "%section.level1; | %section.level2; | %section.level3;
+ | %section.level4;">
+
+
+<!ENTITY % section.level1.content "(%block;
+ | %section.level2;
+ | %section.level3;
+ | %section.level4;
+ | printindex)*">
+
+<!ENTITY % section.level2.content "(%block;
+ | %section.level3;
+ | %section.level4;)*">
+
+<!ENTITY % section.level3.content "(%block;
+ | %section.level4;)*">
+
+<!ENTITY % section.level4.content "(%block;)*">
+
+
+<!-- Inline -->
+<!-- ****** -->
+<!ENTITY % Inline.emphasize "strong | emph">
+<!ENTITY % Inline.smallcaps "sc">
+<!ENTITY % Inline.fonts "i | b | tt | r">
+<!ENTITY % Inline.markup "code | dfn | cite | key | kbd | var | acronym | url">
+<!ENTITY % Inline.reference "xref | inforef | indexterm | email | uref">
+
+<!ENTITY % Inline.phrase
+ "%Inline.emphasize; | %Inline.smallcaps; | %Inline.fonts;
+ | %Inline.markup; | %Inline.reference; ">
+
+
+<!-- ************ -->
+<!-- * ELEMENTS * -->
+<!-- ************ -->
+
+<!-- TOP Level Element -->
+<!-- ***************** -->
+<!ELEMENT texinfo ((%metainformation; | node | %block;)* )>
+
+<!-- meta-information -->
+<!ELEMENT setfilename (#PCDATA)>
+<!ELEMENT settitle (#PCDATA)>
+<!ELEMENT titlefont (#PCDATA)>
+<!ELEMENT dircategory (#PCDATA)>
+
+<!-- NODES -->
+<!-- ***** -->
+<!ELEMENT node (nodename, nodenext?, nodeprev?, nodeup?,
+ (%section.all; | %block;)*) >
+
+<!ELEMENT nodename (#PCDATA)>
+<!ELEMENT nodenext (#PCDATA)>
+<!ELEMENT nodeprev (#PCDATA)>
+<!ELEMENT nodeup (#PCDATA)>
+
+<!-- SECTIONING -->
+<!-- ********** -->
+
+<!ELEMENT top (title?, %section.level1.content;)>
+
+<!ELEMENT chapter (title?, %section.level1.content;)>
+<!ELEMENT section (title?, %section.level2.content;)>
+<!ELEMENT subsection (title?, %section.level3.content;)>
+<!ELEMENT subsubsection (title?, %section.level4.content;)>
+
+<!ELEMENT unnumbered (title?, %section.level1.content;)>
+<!ELEMENT unnumberedsec (title?, %section.level2.content;)>
+<!ELEMENT unnumberedsubsec (title?, %section.level3.content;)>
+<!ELEMENT unnumberedsubsubsec (title?, %section.level4.content;)>
+
+<!ELEMENT appendix (title?, %section.level1.content;)>
+<!ELEMENT appendixsec (title?, %section.level2.content;)>
+<!ELEMENT appendixsubsec (title?, %section.level3.content;)>
+<!ELEMENT appendixsubsubsec (title?, %section.level4.content;)>
+
+<!ELEMENT majorheading (title?, %section.level1.content;)>
+<!ELEMENT chapheading (title?, %section.level1.content;)>
+<!ELEMENT heading (title?, %section.level2.content;)>
+<!ELEMENT subheading (title?, %section.level3.content;)>
+<!ELEMENT subsubheading (title?, %section.level4.content;)>
+
+<!ELEMENT title (#PCDATA | %Inline.phrase; | footnote)*>
+
+<!-- BLOCK Elements -->
+<!-- ************** -->
+
+<!ELEMENT quotation (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT example (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT smallexample (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT lisp (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT smalllisp (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT cartouche (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT copying (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT format (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT smallformat (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT display (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT smalldisplay (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT center (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT group (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT image (#PCDATA)>
+
+<!ELEMENT para (#PCDATA | %Inline.phrase; | footnote)*>
+
+<!ELEMENT menu ((menuentry | para)*)>
+<!ELEMENT menuentry (menunode?, menutitle?, menucomment?)>
+<!ELEMENT menunode (#PCDATA)>
+<!ELEMENT menutitle (#PCDATA)>
+<!ELEMENT menucomment (#PCDATA | para)*>
+
+<!-- Lists -->
+<!ELEMENT itemize (itemfunction, (item | itemize | enumerate | indexterm)*)>
+<!ELEMENT enumerate (enumarg?, (item | itemize | enumerate)*)>
+<!ATTLIST enumerate
+ first CDATA #IMPLIED>
+
+<!ELEMENT item (%block;)*>
+<!ELEMENT enumarg (#PCDATA)>
+
+<!ELEMENT itemfunction (#PCDATA | %Inline.phrase;)*>
+
+<!-- Tables -->
+<!ELEMENT table (tableitem | indexterm)+>
+<!ELEMENT tableitem (tableterm+, item)>
+<!ELEMENT tableterm (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT multitable (columnfraction*, row*)>
+<!ELEMENT columnfraction (#PCDATA)>
+<!ELEMENT row (entry*)>
+<!ELEMENT entry (#PCDATA | %Inline.phrase;)*>
+
+<!-- INLINE Elements -->
+<!-- *************** -->
+
+<!-- Emphasize -->
+<!ELEMENT strong (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT emph (#PCDATA | %Inline.phrase;)*>
+
+<!-- small caps -->
+<!ELEMENT sc (#PCDATA | %Inline.phrase;)*>
+
+<!-- fonts -->
+<!ELEMENT i (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT b (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT tt (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT r (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT notfixedwidth (#PCDATA | %Inline.phrase;)*>
+
+<!-- markup -->
+<!ELEMENT code (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT dfn (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT cite (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT key (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT kbd (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT var (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT acronym (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT url (#PCDATA | %Inline.phrase;)*>
+
+<!-- reference -->
+<!ELEMENT anchor EMPTY>
+<!ATTLIST anchor
+ name CDATA #IMPLIED>
+
+<!ELEMENT xref (xrefnodename | xrefinfoname | xrefinfofile
+ | xrefprintedname | xrefprinteddesc)*>
+<!ELEMENT xrefnodename (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefinfoname (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefinfofile (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefprintedname (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefprinteddesc (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT inforef (inforefnodename | inforefrefname | inforefinfoname)*>
+<!ELEMENT inforefnodename (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT inforefrefname (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT inforefinfoname (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT indexterm (#PCDATA | %Inline.phrase;)*>
+<!ATTLIST indexterm
+ index CDATA #IMPLIED>
+
+<!ELEMENT email (emailaddress, emailname?)>
+<!ELEMENT emailaddress (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT emailname (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT uref (urefurl, urefdesc?, urefreplacement?)>
+<!ELEMENT urefurl (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT urefdesc (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT urefreplacement (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT footnote (para)>
+
+
+
+<!ENTITY tex "TeX">
+<!ENTITY ellipsis "">
+<!ENTITY lt "">
+<!ENTITY gt "">
+<!ENTITY bullet "">
+<!ENTITY copyright "">
+<!ENTITY minus "">
+<!ENTITY linebreak "">
+<!ENTITY space "">
+<!ENTITY dots "">
+<!ENTITY enddots "">
+<!ENTITY amp "">
+
+<!ENTITY auml "">
+<!ENTITY ouml "">
+<!ENTITY uuml "">
+<!ENTITY Auml "">
+<!ENTITY Ouml "">
+<!ENTITY Uuml "">
+<!ENTITY Euml "">
+<!ENTITY euml "">
+<!ENTITY Iuml "">
+<!ENTITY iuml "">
+<!ENTITY yuml "">
+<!ENTITY uml "">
+
+<!ENTITY Aacute "">
+<!ENTITY Eacute "">
+<!ENTITY Iacute "">
+<!ENTITY Oacute "">
+<!ENTITY Uacute "">
+<!ENTITY Yacute "">
+<!ENTITY aacute "">
+<!ENTITY eacute "">
+<!ENTITY iacute "">
+<!ENTITY oacute "">
+<!ENTITY uacute "">
+<!ENTITY yacute "">
+
+<!ENTITY ccedil "">
+<!ENTITY Ccedil "">
+
+<!ENTITY Acirc "">
+<!ENTITY Ecirc "">
+<!ENTITY Icirc "">
+<!ENTITY Ocirc "">
+<!ENTITY Ucirc "">
+<!ENTITY acirc "">
+<!ENTITY ecirc "">
+<!ENTITY icirc "">
+<!ENTITY ocirc "">
+<!ENTITY ucirc "">
+
+<!ENTITY Agrave "">
+<!ENTITY Egrave "">
+<!ENTITY Igrave "">
+<!ENTITY Ograve "">
+<!ENTITY Ugrave "">
+<!ENTITY agrave "">
+<!ENTITY egrave "">
+<!ENTITY igrave "">
+<!ENTITY ograve "">
+<!ENTITY ugrave "">
+
+<!ENTITY Atilde "">
+<!ENTITY Ntilde "">
+<!ENTITY Otilde "">
+<!ENTITY atilde "">
+<!ENTITY ntilde "">
+<!ENTITY otilde "">
+
+<!ENTITY oslash "">
+<!ENTITY Oslash "">
+
+<!ENTITY iexcl "">
+<!ENTITY pound "">
+<!ENTITY iquest "">
+<!ENTITY AElig "">
+<!ENTITY aelig "">
+<!ENTITY Aring "">
+<!ENTITY aring "">
+<!ENTITY szlig "">
+
+<!ENTITY macr "">
+
+
+<!-- fixxme: not yet classified -->
+
+<!ELEMENT sp (#PCDATA)>
+<!ATTLIST sp
+ lines CDATA #IMPLIED>
+<!ELEMENT printindex (#PCDATA)>
+
diff --git a/Build/source/utils/texinfo/makeinfo/texinfo.xsl b/Build/source/utils/texinfo/makeinfo/texinfo.xsl
new file mode 100644
index 00000000000..efe36e94824
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/texinfo.xsl
@@ -0,0 +1,242 @@
+<?xml version='1.0'?>
+<!-- $Id: texinfo.xsl,v 1.1 2002/08/25 23:38:39 karl Exp $ -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="html" indent="yes"/>
+
+<!-- root rule -->
+<xsl:template match="/">
+ <html>
+ <head><title>
+ <xsl:apply-templates select="TEXINFO/SETTITLE" mode="head"/>
+ </title></head>
+ <body bgcolor="#FFFFFF"><xsl:apply-templates/>
+</body></html>
+</xsl:template>
+
+
+<xsl:template match="TEXINFO">
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<xsl:template match="TEXINFO/SETFILENAME">
+</xsl:template>
+
+<xsl:template match="TEXINFO/SETTITLE" mode="head">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="TEXINFO/SETTITLE">
+ <h1><xsl:apply-templates/></h1>
+</xsl:template>
+
+
+<xsl:template match="TEXINFO/DIRCATEGORY">
+</xsl:template>
+
+<xsl:template match="//PARA">
+ <p><xsl:apply-templates/></p>
+</xsl:template>
+
+<xsl:template match="//EMPH">
+ <i><xsl:apply-templates/></i>
+</xsl:template>
+
+<!-- The node -->
+<xsl:template match="TEXINFO/NODE">
+ <hr/>
+ <p>
+ <xsl:apply-templates select="NODENAME" mode="select"/>
+ <xsl:apply-templates select="NODEPREV" mode="select"/>
+ <xsl:apply-templates select="NODEUP" mode="select"/>
+ <xsl:apply-templates select="NODENEXT" mode="select"/>
+ <xsl:apply-templates/>
+ <h2>Footnotes</h2>
+ <ol>
+ <xsl:apply-templates select=".//FOOTNOTE" mode="footnote"/>
+ </ol>
+ </p>
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODENAME" mode="select">
+<h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</h2>
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODENAME"/>
+
+
+<xsl:template match="TEXINFO/NODE/NODEPREV" mode="select">
+ [ <b>Previous: </b>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a> ]
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODEPREV"/>
+
+<xsl:template match="TEXINFO/NODE/NODEUP" mode="select">
+ [ <b>Up: </b>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a> ]
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODEUP"/>
+
+<xsl:template match="TEXINFO/NODE/NODENEXT" mode="select">
+ [ <b>Next: </b>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a> ]
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODENEXT"/>
+
+<!-- Menu -->
+<xsl:template match="//MENU">
+ <h3>Menu</h3>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates select="MENUNODE"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="MENUTITLE"/>
+ </a>:
+ <xsl:apply-templates select="MENUCOMMENT"/>
+ <br/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY/MENUNODE">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY/MENUTITLE">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY/MENUCOMMENT">
+ <xsl:apply-templates mode="menucomment"/>
+</xsl:template>
+
+<xsl:template match="PARA" mode="menucomment">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//PARA">
+ <p><xsl:apply-templates/></p>
+</xsl:template>
+
+<!-- LISTS -->
+<xsl:template match="//ITEMIZE">
+ <ul>
+ <xsl:apply-templates/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="//ITEMIZE/ITEM">
+ <li>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<xsl:template match="//ENUMERATE">
+ <ol>
+ <xsl:apply-templates/>
+ </ol>
+</xsl:template>
+
+<xsl:template match="//ENUMERATE/ITEM">
+ <li>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<!-- INLINE -->
+<xsl:template match="//CODE">
+ <tt>
+ <xsl:apply-templates/>
+ </tt>
+</xsl:template>
+
+<xsl:template match="//DFN">
+ <i><b>
+ <xsl:apply-templates/>
+ </b></i>
+</xsl:template>
+
+<xsl:template match="//STRONG">
+ <b>
+ <xsl:apply-templates/>
+ </b>
+</xsl:template>
+
+<xsl:template match="//CENTER">
+ <center>
+ <xsl:apply-templates/>
+ </center>
+</xsl:template>
+
+<xsl:template match="//VAR">
+ <i>
+ <xsl:apply-templates/>
+ </i>
+</xsl:template>
+
+<xsl:template match="//KBD">
+ <tt>
+ <xsl:apply-templates/>
+ </tt>
+</xsl:template>
+
+<xsl:template match="//KEY">
+ <b>
+ <xsl:apply-templates/>
+ </b>
+</xsl:template>
+
+<!-- BLOCKS -->
+<xsl:template match="//DISPLAY">
+ <pre>
+ <xsl:apply-templates/>
+ </pre>
+</xsl:template>
+
+
+<!-- INDEX -->
+<xsl:template match="//INDEXTERM">
+</xsl:template>
+
+<!-- FOOTNOTE -->
+<xsl:template match="//FOOTNOTE">
+</xsl:template>
+
+<xsl:template match="//FOOTNOTE" mode="footnote">
+ <li><xsl:apply-templates/></li>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/Build/source/utils/texinfo/makeinfo/toc.c b/Build/source/utils/texinfo/makeinfo/toc.c
new file mode 100644
index 00000000000..fa3d8e07382
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/toc.c
@@ -0,0 +1,388 @@
+/* toc.c -- table of contents handling.
+ $Id: toc.c,v 1.6 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#include "system.h"
+#include "makeinfo.h"
+#include "cmds.h"
+#include "files.h"
+#include "macro.h"
+#include "node.h"
+#include "html.h"
+#include "lang.h"
+#include "makeinfo.h"
+#include "sectioning.h"
+#include "toc.h"
+#include "xml.h"
+
+/* array of toc entries */
+static TOC_ENTRY_ELT **toc_entry_alist = NULL;
+
+/* toc_counter start from 0 ... n for every @chapter, @section ... */
+static int toc_counter = 0;
+
+/* Routine to add an entry to the table of contents */
+int
+toc_add_entry (char *tocname, int level, char *node_name, char *anchor)
+{
+ char *tocname_and_node, *expanded_node, *d;
+ char *s = NULL;
+ char *filename = NULL;
+
+ if (!node_name)
+ node_name = "";
+
+ /* I assume that xrealloc behaves like xmalloc if toc_entry_alist is
+ NULL */
+ toc_entry_alist = xrealloc (toc_entry_alist,
+ (toc_counter + 1) * sizeof (TOC_ENTRY_ELT *));
+
+ toc_entry_alist[toc_counter] = xmalloc (sizeof (TOC_ENTRY_ELT));
+
+ if (html)
+ {
+ /* We need to insert the expanded node name into the toc, so
+ that when we eventually output the toc, its <a ref= link will
+ point to the <a name= tag created by cm_node in the navigation
+ bar. We cannot expand the containing_node member, for the
+ reasons explained in the WARNING below. We also cannot wait
+ with the node name expansion until the toc is actually output,
+ since by that time the macro definitions may have been changed.
+ So instead we store in the tocname member the expanded node
+ name and the toc name concatenated together (with the necessary
+ html markup), since that's how they are output. */
+ if (!anchor)
+ s = expanded_node = expand_node_name (node_name);
+ else
+ expanded_node = anchor;
+ if (splitting)
+ {
+ if (!anchor)
+ filename = nodename_to_filename (expanded_node);
+ else
+ filename = filename_part (current_output_filename);
+ }
+ /* Sigh... Need to HTML-escape the expanded node name like
+ add_anchor_name does, except that we are not writing this to
+ the output, so can't use add_anchor_name... */
+ /* The factor 5 in the next allocation is because the maximum
+ expansion of HTML-escaping is for the & character, which is
+ output as "&amp;". 2 is for "> that separates node from tocname. */
+ d = tocname_and_node = (char *)xmalloc (2 + 5 * strlen (expanded_node)
+ + strlen (tocname) + 1);
+ if (!anchor)
+ {
+ for (; *s; s++)
+ {
+ if (cr_or_whitespace (*s))
+ *d++ = '-';
+ else if (! URL_SAFE_CHAR (*s))
+ {
+ sprintf (d, "_00%x", (unsigned char) *s);
+ /* do this manually since sprintf returns char * on
+ SunOS 4 and other old systems. */
+ while (*d)
+ d++;
+ }
+ else
+ *d++ = *s;
+ }
+ strcpy (d, "\">");
+ }
+ else
+ /* Section outside any node, they provided explicit anchor. */
+ strcpy (d, anchor);
+ strcat (d, tocname);
+ free (tocname); /* it was malloc'ed by substring() */
+ free (expanded_node);
+ toc_entry_alist[toc_counter]->name = tocname_and_node;
+ }
+ else
+ toc_entry_alist[toc_counter]->name = tocname;
+ /* WARNING! The node name saved in containing_node member must
+ be the node name with _only_ macros expanded (the macros in
+ the node name are expanded by cm_node when it grabs the name
+ from the @node directive). Non-macros, like @value, @@ and
+ other @-commands must NOT be expanded in containing_node,
+ because toc_find_section_of_node looks up the node name where
+ they are also unexpanded. You *have* been warned! */
+ toc_entry_alist[toc_counter]->containing_node = xstrdup (node_name);
+ toc_entry_alist[toc_counter]->level = level;
+ toc_entry_alist[toc_counter]->number = toc_counter;
+ toc_entry_alist[toc_counter]->html_file = filename;
+
+ /* have to be done at least */
+ return toc_counter++;
+}
+
+/* Return the name of a chapter/section/subsection etc. that
+ corresponds to the node NODE. If the node isn't found,
+ return NULL.
+
+ WARNING! This function relies on NODE being unexpanded
+ except for macros (i.e., @value, @@, and other non-macros
+ should NOT be expanded), because the containing_node member
+ stores unexpanded node names.
+
+ Note that this function returns the first section whose
+ containing node is NODE. Thus, they will lose if they use
+ more than a single chapter structioning command in a node,
+ or if they have a node without any structuring commands. */
+char *
+toc_find_section_of_node (char *node)
+{
+ int i;
+
+ if (!node)
+ node = "";
+ for (i = 0; i < toc_counter; i++)
+ if (STREQ (node, toc_entry_alist[i]->containing_node))
+ return toc_entry_alist[i]->name;
+
+ return NULL;
+}
+
+/* free up memory used by toc entries */
+void
+toc_free (void)
+{
+ int i;
+
+ if (toc_counter)
+ {
+ for (i = 0; i < toc_counter; i++)
+ {
+ free (toc_entry_alist[i]->name);
+ free (toc_entry_alist[i]->containing_node);
+ free (toc_entry_alist[i]);
+ }
+
+ free (toc_entry_alist);
+ toc_entry_alist = NULL; /* to be sure ;-) */
+ toc_counter = 0; /* to be absolutley sure ;-) */
+ }
+}
+
+/* Print table of contents in HTML. */
+
+static void
+contents_update_html (void)
+{
+ int i;
+ int k;
+ int last_level;
+
+ /* does exist any toc? */
+ if (!toc_counter)
+ /* no, so return to sender ;-) */
+ return;
+
+ add_html_block_elt_args ("\n<div class=\"contents\">\n<h2>%s</h2>\n<ul>\n", _("Table of Contents"));
+
+ last_level = toc_entry_alist[0]->level;
+
+ for (i = 0; i < toc_counter; i++)
+ {
+ if (toc_entry_alist[i]->level > last_level)
+ {
+ /* unusual, but it is possible
+ @chapter ...
+ @subsubsection ... ? */
+ for (k = 0; k < (toc_entry_alist[i]->level-last_level); k++)
+ add_html_block_elt ("<ul>\n");
+ }
+ else if (toc_entry_alist[i]->level < last_level)
+ {
+ /* @subsubsection ...
+ @chapter ... this IS usual.*/
+ for (k = 0; k < (last_level-toc_entry_alist[i]->level); k++)
+ add_word ("</li></ul>\n");
+ }
+
+ /* No double entries in TOC. */
+ if (!(i && strcmp (toc_entry_alist[i]->name,
+ toc_entry_alist[i-1]->name) == 0))
+ {
+ /* each toc entry is a list item. */
+ add_word ("<li>");
+
+ /* Insert link -- to an external file if splitting, or
+ within the current document if not splitting. */
+ add_word ("<a ");
+ /* For chapters (only), insert an anchor that the short contents
+ will link to. */
+ if (toc_entry_alist[i]->level == 0)
+ {
+ char *p = toc_entry_alist[i]->name;
+
+ /* toc_entry_alist[i]->name has the form `foo">bar',
+ that is, it includes both the node name and anchor
+ text. We need to find where `foo', the node name,
+ ends, and use that in toc_FOO. */
+ while (*p && *p != '"')
+ p++;
+ add_word_args ("name=\"toc_%.*s\" ",
+ p - toc_entry_alist[i]->name, toc_entry_alist[i]->name);
+ }
+ add_word_args ("href=\"%s#%s</a>\n",
+ splitting ? toc_entry_alist[i]->html_file : "",
+ toc_entry_alist[i]->name);
+ }
+
+ last_level = toc_entry_alist[i]->level;
+ }
+
+ /* Go back to start level. */
+ if (toc_entry_alist[0]->level < last_level)
+ for (k = 0; k < (last_level-toc_entry_alist[0]->level); k++)
+ add_word ("</li></ul>\n");
+
+ add_word ("</li></ul>\n</div>\n\n");
+}
+
+/* print table of contents in ASCII (--no-headers)
+ May be we should create a new command line switch --ascii ? */
+static void
+contents_update_info (void)
+{
+ int i;
+ int k;
+
+ if (!toc_counter)
+ return;
+
+ insert_string ((char *) _("Table of Contents"));
+ insert ('\n');
+ for (i = 0; i < strlen (_("Table of Contents")); i++)
+ insert ('*');
+ insert_string ("\n\n");
+
+ for (i = 0; i < toc_counter; i++)
+ {
+ if (toc_entry_alist[i]->level == 0)
+ add_char ('\n');
+
+ /* indention with two spaces per level, should this
+ changed? */
+ for (k = 0; k < toc_entry_alist[i]->level; k++)
+ insert_string (" ");
+
+ insert_string (toc_entry_alist[i]->name);
+ insert ('\n');
+ }
+ insert_string ("\n\n");
+}
+
+/* shortcontents in HTML; Should this produce a standalone file? */
+static void
+shortcontents_update_html (char *contents_filename)
+{
+ int i;
+ char *toc_file = NULL;
+
+ /* does exist any toc? */
+ if (!toc_counter)
+ return;
+
+ add_html_block_elt_args ("\n<div class=\"shortcontents\">\n<h2>%s</h2>\n<ul>\n", _("Short Contents"));
+
+ if (contents_filename)
+ toc_file = filename_part (contents_filename);
+
+ for (i = 0; i < toc_counter; i++)
+ {
+ char *name = toc_entry_alist[i]->name;
+
+ if (toc_entry_alist[i]->level == 0)
+ {
+ if (contents_filename)
+ add_word_args ("<li><a href=\"%s#toc_%s</a></li>\n",
+ splitting ? toc_file : "", name);
+ else
+ add_word_args ("<a href=\"%s#%s</a>\n",
+ splitting ? toc_entry_alist[i]->html_file : "", name);
+ }
+ }
+ add_word ("</ul>\n</div>\n\n");
+ if (contents_filename)
+ free (toc_file);
+}
+
+/* short contents in ASCII (--no-headers). */
+static void
+shortcontents_update_info (void)
+{
+ int i;
+
+ if (!toc_counter)
+ return;
+
+ insert_string ((char *) _("Short Contents"));
+ insert ('\n');
+ for (i = 0; i < strlen (_("Short Contents")); i++)
+ insert ('*');
+ insert_string ("\n\n");
+
+ for (i = 0; i < toc_counter; i++)
+ {
+ if (toc_entry_alist[i]->level == 0)
+ {
+ insert_string (toc_entry_alist[i]->name);
+ insert ('\n');
+ }
+ }
+ insert_string ("\n\n");
+}
+
+void
+cm_contents (int arg)
+{
+ /* the file where we found the @contents directive */
+ static char *contents_filename;
+
+ /* No need to mess with delayed stuff for XML and Docbook. */
+ if (xml)
+ {
+ if (arg == START)
+ {
+ int elt = STREQ (command, "contents") ? CONTENTS : SHORTCONTENTS;
+ xml_insert_element (elt, START);
+ xml_insert_element (elt, END);
+ }
+ }
+ else if (!handling_delayed_writes)
+ {
+ register_delayed_write (STREQ (command, "contents")
+ ? "@contents" : "@shortcontents");
+
+ if (html && STREQ (command, "contents"))
+ {
+ if (contents_filename)
+ free (contents_filename);
+ contents_filename = xstrdup (current_output_filename);
+ }
+ }
+ else if (html)
+ STREQ (command, "contents")
+ ? contents_update_html () : shortcontents_update_html (contents_filename);
+ else if (no_headers)
+ STREQ (command, "contents")
+ ? contents_update_info () : shortcontents_update_info ();
+}
diff --git a/Build/source/utils/texinfo/makeinfo/toc.h b/Build/source/utils/texinfo/makeinfo/toc.h
new file mode 100644
index 00000000000..854f6fc7ddc
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/toc.h
@@ -0,0 +1,45 @@
+/* toc.h -- table of contents handling.
+ $Id: toc.h,v 1.2 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1999 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Written by Karl Heinz Marbaise <kama@hippo.fido.de>. */
+
+#ifndef TOC_H
+#define TOC_H
+
+/* Structure to hold one entry for the toc. */
+typedef struct toc_entry_elt {
+ char *name;
+ char *containing_node; /* Name of node containing this section. */
+ char *html_file; /* Name of HTML node-file in split-HTML mode */
+ int number; /* counting number from 0...n independent from
+ chapter/section can be used for anchors or
+ references to it. */
+ int level; /* level: chapter, section, subsection... */
+} TOC_ENTRY_ELT;
+
+/* all routines which have relationship with TOC should start with
+ toc_ (this is a kind of name-space) */
+extern int toc_add_entry (char *tocname, int level,
+ char *node_name, char *anchor); /* return the number for the toc-entry */
+extern void toc_free (void);
+extern char *toc_find_section_of_node (char *node);
+
+extern void cm_contents (int arg);
+
+#endif /* not TOC_H */
diff --git a/Build/source/utils/texinfo/makeinfo/win32.mak b/Build/source/utils/texinfo/makeinfo/win32.mak
new file mode 100644
index 00000000000..d5b3cdabd4f
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/win32.mak
@@ -0,0 +1,66 @@
+################################################################################
+#
+# Makefile : TeXInfo/makeinfo
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <02/11/14 20:21:20 popineau>
+#
+################################################################################
+root_srcdir = ..\..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+GNU = 1
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+programs = $(objdir)\makeinfo.exe
+objects = \
+ $(objdir)\cmds.obj \
+ $(objdir)\defun.obj \
+ $(objdir)\files.obj \
+ $(objdir)\footnote.obj \
+ $(objdir)\html.obj \
+ $(objdir)\index.obj \
+ $(objdir)\insertion.obj \
+ $(objdir)\lang.obj \
+ $(objdir)\macro.obj \
+ $(objdir)\makeinfo.obj \
+ $(objdir)\multi.obj \
+ $(objdir)\node.obj \
+ $(objdir)\sectioning.obj \
+ $(objdir)\toc.obj \
+ $(objdir)\xml.obj
+
+libtxi = ..\lib\$(objdir)\libtxi.lib
+
+DEFS = -I.. -DHAVE_CONFIG_H $(DEFS) -I..\lib
+
+default: all
+
+all: $(objdir) $(programs)
+
+$(objdir)\makeinfo.exe: $(objects) $(libtxi) $(gnuw32lib)
+ $(link) $(**) $(conlibs)
+
+$(libtxi):
+ pushd ..\lib & $(make) $(makeflags) all & popd
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+install:: install-exec
+
+!include <msvc/clean.mak>
+!include <msvc/version.mak>
+
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/texinfo/makeinfo/xml.c b/Build/source/utils/texinfo/makeinfo/xml.c
new file mode 100644
index 00000000000..cdbec1fc525
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/xml.c
@@ -0,0 +1,2328 @@
+/* xml.c -- xml output.
+ $Id: xml.c,v 1.52 2004/12/19 17:02:23 karl Exp $
+
+ Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Philippe Martin <feloy@free.fr>. */
+
+#include "system.h"
+#include "makeinfo.h"
+#include "insertion.h"
+#include "files.h"
+#include "float.h"
+#include "macro.h"
+#include "cmds.h"
+#include "lang.h"
+
+#include "xml.h"
+
+/* Options */
+int xml_index_divisions = 1;
+
+typedef struct _element
+{
+ char name[32];
+ int contains_para;
+ int contained_in_para;
+ int keep_space;
+} element;
+
+element texinfoml_element_list [] = {
+ { "texinfo", 1, 0, 0 },
+ { "setfilename", 0, 0, 0 },
+ { "titlefont", 0, 0, 0 },
+ { "settitle", 0, 0, 0 },
+ { "documentdescription", 1, 0, 0 },
+
+ { "node", 1, 0, 0 },
+ { "nodenext", 0, 0, 0 },
+ { "nodeprev", 0, 0, 0 },
+ { "nodeup", 0, 0, 0 },
+
+ { "chapter", 1, 0, 0 },
+ { "section", 1, 0, 0 },
+ { "subsection", 1, 0, 0 },
+ { "subsubsection", 1, 0, 0 },
+
+ { "top", 1, 0, 0 },
+ { "unnumbered", 1, 0, 0 },
+ { "unnumberedsec", 1, 0, 0 },
+ { "unnumberedsubsec", 1, 0, 0 },
+ { "unnumberedsubsubsec", 1, 0, 0 },
+
+ { "appendix", 1, 0, 0 },
+ { "appendixsec", 1, 0, 0 },
+ { "appendixsubsec", 1, 0, 0 },
+ { "appendixsubsubsec", 1, 0, 0 },
+
+ { "majorheading", 0, 0, 0 },
+ { "chapheading", 0, 0, 0 },
+ { "heading", 0, 0, 0 },
+ { "subheading", 0, 0, 0 },
+ { "subsubheading", 0, 0, 0 },
+
+ { "titlepage", 1, 0, 0 },
+ { "author", 0, 0, 0 },
+ { "booktitle", 0, 0, 0 },
+ { "booksubtitle", 0, 0, 0 },
+
+ { "menu", 1, 0, 0 },
+ { "detailmenu", 1, 0, 0 },
+ { "menuentry", 0, 0, 0 },
+ { "menutitle", 0, 0, 0 },
+ { "menucomment", 0, 0, 0 },
+ { "menunode", 0, 0, 0 },
+ { "nodename", 0, 0, 0 },
+
+ { "acronym", 0, 1, 0 },
+ { "acronymword", 0, 1, 0 },
+ { "acronymdesc", 0, 1, 0 },
+
+ { "abbrev", 0, 1, 0 },
+ { "abbrevword", 0, 1, 0 },
+ { "abbrevdesc", 0, 1, 0 },
+
+ { "tt", 0, 1, 0 },
+ { "code", 0, 1, 0 },
+ { "command", 0, 1, 0 },
+ { "env", 0, 1, 0 },
+ { "file", 0, 1, 0 },
+ { "option", 0, 1, 0 },
+ { "samp", 0, 1, 0 },
+ { "kbd", 0, 1, 0 },
+ { "url", 0, 1, 0 },
+ { "key", 0, 1, 0 },
+ { "var", 0, 1, 0 },
+ { "sc", 0, 1, 0 },
+ { "dfn", 0, 1, 0 },
+ { "emph", 0, 1, 0 },
+ { "strong", 0, 1, 0 },
+ { "cite", 0, 1, 0 },
+ { "notfixedwidth", 0, 1, 0 },
+ { "i", 0, 1, 0 },
+ { "b", 0, 1, 0 },
+ { "r", 0, 1, 0 },
+ { "slanted", 0, 1, 0 },
+ { "sansserif", 0, 1, 0 },
+
+ { "exdent", 0, 0, 0 },
+
+ { "title", 0, 0, 0 },
+ { "ifinfo", 1, 0, 0 },
+ { "sp", 0, 0, 0 },
+ { "center", 1, 0, 0 },
+ { "dircategory", 0, 0, 0 },
+ { "quotation", 1, 0, 0 },
+ { "example", 0, 0, 1 },
+ { "smallexample", 0, 0, 1 },
+ { "lisp", 0, 0, 1 },
+ { "smalllisp", 0, 0, 1 },
+ { "cartouche", 1, 0, 0 },
+ { "copying", 1, 0, 0 },
+ { "format", 0, 0, 1 },
+ { "smallformat", 0, 0, 1 },
+ { "display", 0, 0, 1 },
+ { "smalldisplay", 0, 0, 1 },
+ { "verbatim", 0, 0, 1 },
+ { "footnote", 0, 1, 0 },
+ { "", 0, 1, 0 }, /* LINEANNOTATION (docbook) */
+
+ { "", 1, 0, 0 }, /* TIP (docbook) */
+ { "", 1, 0, 0 }, /* NOTE (docbook) */
+ { "", 1, 0, 0 }, /* IMPORTANT (docbook) */
+ { "", 1, 0, 0 }, /* WARNING (docbook) */
+ { "", 1, 0, 0 }, /* CAUTION (docbook) */
+
+ { "itemize", 0, 0, 0 },
+ { "itemfunction", 0, 0, 0 },
+ { "item", 1, 0, 0 },
+ { "enumerate", 0, 0, 0 },
+ { "table", 0, 0, 0 },
+ { "tableitem", 0, 0, 0 },
+ { "tableterm", 0, 0, 0 },
+
+ { "indexterm", 0, 1, 0 },
+
+ { "math", 0, 1, 0 },
+
+ { "dmn", 0, 1, 0 },
+
+ { "xref", 0, 1, 0 },
+ { "xrefnodename", 0, 1, 0 },
+ { "xrefinfoname", 0, 1, 0 },
+ { "xrefprinteddesc", 0, 1, 0 },
+ { "xrefinfofile", 0, 1, 0 },
+ { "xrefprintedname", 0, 1, 0 },
+
+ { "inforef", 0, 1, 0 },
+ { "inforefnodename", 0, 1, 0 },
+ { "inforefrefname", 0, 1, 0 },
+ { "inforefinfoname", 0, 1, 0 },
+
+ { "uref", 0, 1, 0 },
+ { "urefurl", 0, 1, 0 },
+ { "urefdesc", 0, 1, 0 },
+ { "urefreplacement", 0, 1, 0 },
+
+ { "email", 0, 1, 0 },
+ { "emailaddress", 0, 1, 0 },
+ { "emailname", 0, 1, 0 },
+
+ { "group", 0, 0, 0 },
+ { "float", 1, 0, 0 },
+ { "floattype", 0, 0, 0 },
+ { "floatpos", 0, 0, 0 },
+ { "caption", 0, 0, 0 },
+ { "shortcaption", 0, 0, 0 },
+
+ { "", 0, 0, 0 }, /* TABLE (docbook) */
+ { "", 0, 0, 0 }, /* FIGURE (docbook) */
+ { "", 0, 0, 0 }, /* EXAMPLE (docbook) */
+ { "", 1, 0, 0 }, /* SIDEBAR (docbook) */
+
+ { "printindex", 0, 0, 0 },
+ { "listoffloats", 0, 0, 0 },
+ { "anchor", 0, 1, 0 },
+
+ { "image", 0, 0, 0 },
+ { "inlineimage", 0, 1, 0 },
+ { "alttext", 0, 1, 0 },
+
+ { "", 0, 1, 0 }, /* PRIMARY (docbook) */
+ { "", 0, 1, 0 }, /* SECONDARY (docbook) */
+ { "", 0, 0, 0 }, /* INFORMALFIGURE (docbook) */
+ { "", 0, 0, 0 }, /* MEDIAOBJECT (docbook) */
+ { "", 0, 0, 0 }, /* IMAGEOBJECT (docbook) */
+ { "", 0, 0, 0 }, /* IMAGEDATA (docbook) */
+ { "", 0, 0, 0 }, /* TEXTOBJECT (docbook) */
+ { "", 0, 0, 0 }, /* INDEXENTRY (docbook) */
+ { "", 0, 0, 0 }, /* PRIMARYIE (docbook) */
+ { "", 0, 0, 0 }, /* SECONDARYIE (docbook) */
+ { "", 0, 0, 0 }, /* INDEXDIV (docbook) */
+ { "multitable", 0, 0, 0 },
+ { "", 0, 0, 0 }, /* TGROUP (docbook) */
+ { "columnfraction", 0, 0, 0 },
+ { "thead", 0, 0, 0 },
+ { "tbody", 0, 0, 0 },
+ { "entry", 0, 0, 0 },
+ { "row", 0, 0, 0 },
+ { "", 0, 0, 0 }, /* BOOKINFO (docbook) */
+ { "", 0, 0, 0 }, /* ABSTRACT (docbook) */
+ { "", 0, 0, 0 }, /* REPLACEABLE (docbook) */
+ { "", 0, 0, 0 }, /* ENVAR (docbook) */
+ { "", 0, 0, 0 }, /* COMMENT (docbook) */
+ { "", 0, 0, 0 }, /* FUNCTION (docbook) */
+ { "", 0, 0, 0 }, /* LEGALNOTICE (docbook) */
+
+ { "contents", 0, 0, 0 },
+ { "shortcontents", 0, 0, 0 },
+ { "documentlanguage", 0, 0, 0 },
+
+ { "setvalue", 0, 0, 0 },
+ { "clearvalue", 0, 0, 0 },
+
+ { "definition", 0, 0, 0 },
+ { "definitionterm", 0, 0, 0 },
+ { "definitionitem", 1, 0, 0 },
+ { "defcategory", 0, 0, 0 },
+ { "deffunction", 0, 0, 0 },
+ { "defvariable", 0, 0, 0 },
+ { "defparam", 0, 0, 0 },
+ { "defdelimiter", 0, 0, 0 },
+ { "deftype", 0, 0, 0 },
+ { "defparamtype", 0, 0, 0 },
+ { "defdatatype", 0, 0, 0 },
+ { "defclass", 0, 0, 0 },
+ { "defclassvar", 0, 0, 0 },
+ { "defoperation", 0, 0, 0 },
+
+ { "para", 0, 0, 0 } /* Must be last */
+ /* name / contains para / contained in para / preserve space */
+};
+
+element docbook_element_list [] = {
+ { "book", 0, 0, 0 }, /* TEXINFO */
+ { "", 0, 0, 0 }, /* SETFILENAME */
+ { "", 0, 0, 0 }, /* TITLEINFO */
+ { "title", 0, 0, 0 }, /* SETTITLE */
+ { "", 1, 0, 0 }, /* DOCUMENTDESCRIPTION (?) */
+
+ { "", 1, 0, 0 }, /* NODE */
+ { "", 0, 0, 0 }, /* NODENEXT */
+ { "", 0, 0, 0 }, /* NODEPREV */
+ { "", 0, 0, 0 }, /* NODEUP */
+
+ { "chapter", 1, 0, 0 },
+ { "sect1", 1, 0, 0 }, /* SECTION */
+ { "sect2", 1, 0, 0 }, /* SUBSECTION */
+ { "sect3", 1, 0, 0 }, /* SUBSUBSECTION */
+
+ { "chapter", 1, 0, 0 }, /* TOP */
+ { "chapter", 1, 0, 0 }, /* UNNUMBERED */
+ { "sect1", 1, 0, 0 }, /* UNNUMBEREDSEC */
+ { "sect2", 1, 0, 0 }, /* UNNUMBEREDSUBSEC */
+ { "sect3", 1, 0, 0 }, /* UNNUMBEREDSUBSUBSEC */
+
+ { "appendix", 1, 0, 0 },
+ { "sect1", 1, 0, 0 }, /* APPENDIXSEC */
+ { "sect2", 1, 0, 0 }, /* APPENDIXSUBSEC */
+ { "sect3", 1, 0, 0 }, /* APPENDIXSUBSUBSEC */
+
+ { "bridgehead", 0, 0, 0 }, /* MAJORHEADING */
+ { "bridgehead", 0, 0, 0 }, /* CHAPHEADING */
+ { "bridgehead", 0, 0, 0 }, /* HEADING */
+ { "bridgehead", 0, 0, 0 }, /* SUBHEADING */
+ { "bridgehead", 0, 0, 0 }, /* SUBSUBHEADING */
+
+ { "", 0, 0, 0 }, /* TITLEPAGE */
+ { "", 0, 0, 0 }, /* AUTHOR */
+ { "", 0, 0, 0 }, /* BOOKTITLE */
+ { "", 0, 0, 0 }, /* BOOKSUBTITLE */
+
+ { "", 1, 0, 0 }, /* MENU */
+ { "", 1, 0, 0 }, /* DETAILMENU */
+ { "", 1, 0, 0 }, /* MENUENTRY */
+ { "", 0, 0, 0 }, /* MENUTITLE */
+ { "", 1, 0, 0 }, /* MENUCOMMENT */
+ { "", 0, 0, 0 }, /* MENUNODE */
+ { "anchor", 0, 0, 0 }, /* NODENAME */
+
+ { "acronym", 0, 1, 0 },
+ { "", 0, 1, 0 }, /* ACRONYMWORD */
+ { "", 0, 1, 0 }, /* ACRONYMDESC */
+
+ { "abbrev", 0, 1, 0 },
+ { "", 0, 1, 0 }, /* ABBREVWORD */
+ { "", 0, 1, 0 }, /* ABBREVDESC */
+
+ { "literal", 0, 1, 0 }, /* TT */
+ { "literal", 0, 1, 0 }, /* CODE */
+ { "command", 0, 1, 0 }, /* COMMAND */
+ { "envar", 0, 1, 0 }, /* ENV */
+ { "filename", 0, 1, 0 }, /* FILE */
+ { "option", 0, 1, 0 }, /* OPTION */
+ { "literal", 0, 1, 0 }, /* SAMP */
+ { "userinput", 0, 1, 0 }, /* KBD */
+ { "wordasword", 0, 1, 0 }, /* URL */
+ { "keycap", 0, 1, 0 }, /* KEY */
+ { "replaceable", 0, 1, 0 }, /* VAR */
+ { "", 0, 1, 0 }, /* SC */
+ { "firstterm", 0, 1, 0 }, /* DFN */
+ { "emphasis", 0, 1, 0 }, /* EMPH */
+ { "emphasis", 0, 1, 0 }, /* STRONG */
+ { "citetitle", 0, 1, 0 }, /* CITE */
+ { "", 0, 1, 0 }, /* NOTFIXEDWIDTH */
+ { "wordasword", 0, 1, 0 }, /* I */
+ { "emphasis", 0, 1, 0 }, /* B */
+ { "", 0, 1, 0 }, /* R */
+
+ { "", 0, 0, 0 }, /* EXDENT */
+
+ { "title", 0, 0, 0 },
+ { "", 1, 0, 0 }, /* IFINFO */
+ { "", 0, 0, 0 }, /* SP */
+ { "", 1, 0, 0 }, /* CENTER */
+ { "", 0, 0, 0 }, /* DIRCATEGORY */
+ { "blockquote", 1, 0, 0 }, /* QUOTATION */
+ { "screen", 0, 0, 1 }, /* EXAMPLE */
+ { "screen", 0, 0, 1 }, /* SMALLEXAMPLE */
+ { "programlisting", 0, 0, 1 }, /* LISP */
+ { "programlisting", 0, 0, 1 }, /* SMALLLISP */
+ { "", 1, 0, 0 }, /* CARTOUCHE */
+ { "", 1, 0, 0 }, /* COPYING */
+ { "screen", 0, 1, 1 }, /* FORMAT */
+ { "screen", 0, 1, 1 }, /* SMALLFORMAT */
+ { "literallayout", 0, 1, 1 }, /* DISPLAY */
+ { "literallayout", 0, 1, 1 }, /* SMALLDISPLAY */
+ { "screen", 0, 0, 1 }, /* VERBATIM */
+ { "footnote", 0, 1, 0 },
+ { "lineannotation", 0, 1, 0 },
+
+ { "tip", 1, 0, 0 },
+ { "note", 1, 0, 0 },
+ { "important", 1, 0, 0 },
+ { "warning", 1, 0, 0 },
+ { "caution", 1, 0, 0 },
+
+ { "itemizedlist", 0, 0, 0 }, /* ITEMIZE */
+ { "", 0, 0, 0 }, /* ITEMFUNCTION */
+ { "listitem", 1, 0, 0 }, /* ITEM */
+ { "orderedlist", 0, 0, 0 }, /* ENUMERATE */
+ { "variablelist", 0, 0, 0 }, /* TABLE */
+ { "varlistentry", 0, 0, 0 }, /* TABLEITEM */
+ { "term", 0, 0, 0 }, /* TABLETERM */
+
+ { "indexterm", 0, 1, 0 }, /* INDEXTERM */
+
+ { "", 0, 1, 0 }, /* MATH */
+
+ { "", 0, 1, 0 }, /* DIMENSION */
+
+ { "xref", 0, 1, 0 }, /* XREF */
+ { "link", 0, 1, 0 }, /* XREFNODENAME */
+ { "", 0, 1, 0 }, /* XREFINFONAME */
+ { "", 0, 1, 0 }, /* XREFPRINTEDDESC */
+ { "", 0, 1, 0 }, /* XREFINFOFILE */
+ { "", 0, 1, 0 }, /* XREFPRINTEDNAME */
+
+ { "", 0, 1, 0 }, /* INFOREF */
+ { "", 0, 1, 0 }, /* INFOREFNODENAME */
+ { "", 0, 1, 0 }, /* INFOREFREFNAME */
+ { "", 0, 1, 0 }, /* INFOREFINFONAME */
+
+ { "ulink", 0, 1, 0 }, /* UREF */
+ { "", 0, 1, 0 }, /* UREFURL */
+ { "", 0, 1, 0 }, /* UREFDESC */
+ { "", 0, 1, 0 }, /* UREFREPLACEMENT */
+
+ { "ulink", 0, 1, 0 }, /* EMAIL */
+ { "", 0, 1, 0 }, /* EMAILADDRESS */
+ { "", 0, 1, 0 }, /* EMAILNAME */
+
+ { "", 0, 0, 0 }, /* GROUP */
+ { "", 1, 0, 0 }, /* FLOAT */
+ { "", 0, 0, 0 }, /* FLOATTYPE */
+ { "", 0, 0, 0 }, /* FLOATPOS */
+ { "", 0, 0, 0 }, /* CAPTION */
+ { "", 0, 0, 0 }, /* SHORTCAPTION */
+
+ { "table", 0, 1, 0 },
+ { "figure", 0, 1, 0 },
+ { "example", 1, 1, 0 },
+ { "sidebar", 1, 0, 0 },
+
+ { "index", 0, 1, 0 }, /* PRINTINDEX */
+ { "", 0, 1, 0 }, /* LISTOFFLOATS */
+ { "", 0, 1, 0 }, /* ANCHOR */
+
+ { "", 0, 0, 0 }, /* IMAGE */
+ { "inlinemediaobject", 0, 1, 0 }, /* INLINEIMAGE */
+ { "", 0, 0, 0 }, /* IMAGEALTTEXT */
+
+ { "primary", 0, 1, 0 }, /* PRIMARY */
+ { "secondary", 0, 1, 0 },
+ { "informalfigure", 0, 0, 0 },
+ { "mediaobject", 0, 0, 0 },
+ { "imageobject", 0, 1, 0 },
+ { "imagedata", 0, 1, 0 },
+ { "textobject", 0, 1, 0 },
+ { "indexentry", 0, 0, 0 },
+ { "primaryie", 0, 0, 0 },
+ { "secondaryie", 0, 0, 0 },
+ { "indexdiv", 0, 0, 0 },
+ { "informaltable", 0, 0, 0 },
+ { "tgroup", 0, 0, 0 },
+ { "colspec", 0, 0, 0 },
+ { "thead", 0, 0, 0 },
+ { "tbody", 0, 0, 0 },
+ { "entry", 0, 0, 0 },
+ { "row", 0, 0, 0 },
+ { "bookinfo", 0, 0, 0 },
+ { "abstract", 1, 0, 0 },
+ { "replaceable", 0, 0, 0 },
+ { "envar", 0, 1, 0 },
+ { "comment", 0, 0, 0 },
+ { "function", 0, 1, 0 },
+ { "legalnotice", 1, 0, 0 },
+
+ { "", 0, 0, 0 }, /* CONTENTS (xml) */
+ { "", 0, 0, 0 }, /* SHORTCONTENTS (xml) */
+ { "", 0, 0, 0 }, /* DOCUMENT LANGUAGE (xml) */
+
+ { "", 0, 0, 0 }, /* SETVALUE (xml) */
+ { "", 0, 0, 0 }, /* CLEARVALUE (xml) */
+
+ { "blockquote", 1, 0, 0 }, /* DEFINITION */
+ { "screen", 0, 0, 1 }, /* DEFINITIONTERM */
+ { "", 0, 0, 0 }, /* DEFINITIONITEM (xml) */
+ { "", 0, 0, 0 }, /* DEFCATEGORY (xml) */
+ { "function", 0, 0, 0 }, /* DEFFUNCTION */
+ { "varname", 0, 0, 0 }, /* DEFVARIABLE */
+ { "varname", 0, 0, 0 }, /* DEFPARAM */
+ { "", 0, 0, 0 }, /* DEFDELIMITER (xml) */
+ { "returnvalue", 0, 0, 0 }, /* DEFTYPE */
+ { "type", 0, 0, 0 }, /* DEFPARAMTYPE */
+ { "structname", 0, 0, 0 }, /* DEFDATATYPE */
+ { "classname", 0, 0, 0 }, /* DEFCLASS */
+ { "property", 0, 0, 0 }, /* DEFCLASSVAR */
+ { "methodname", 0, 0, 0 }, /* DEFOPERATION */
+
+ { "para", 0, 0, 0 } /* Must be last */
+ /* name / contains para / contained in para / preserve space */
+};
+
+element *xml_element_list = NULL;
+
+
+typedef struct _replace_element
+{
+ int element_to_replace;
+ int element_containing;
+ int element_replacing;
+} replace_element;
+
+/* Elements to replace - Docbook only
+ -------------------
+ if `element_to_replace' have to be inserted
+ as a child of `element_containing,'
+ use `element_replacing' instead.
+
+ A value of `-1' for element_replacing means `do not use any element.'
+*/
+
+replace_element replace_elements [] = {
+ { I, TABLETERM, EMPH },
+ { B, TABLETERM, EMPH },
+ { TT, CODE, -1 },
+ { EXAMPLE, DISPLAY, -1 },
+ { CODE, DFN, -1 },
+ { CODE, VAR, -1 },
+ { EMPH, CODE, REPLACEABLE },
+ { VAR, VAR, -1},
+ { VAR, B, EMPH},
+ { B, CODE, ENVAR},
+ { CODE, I, EMPH},
+ { SAMP, VAR, -1 },
+ { FORMAT, BOOKINFO, ABSTRACT },
+ { QUOTATION, ABSTRACT, -1},
+ { LINEANNOTATION, LINEANNOTATION, -1 },
+ { LEGALNOTICE, ABSTRACT, -1 },
+ { QUOTATION, QUOTATION, -1 },
+ /* Formal versions of table and image elements. */
+ { MULTITABLE, FLOAT, FLOATTABLE },
+ { INFORMALFIGURE, FLOAT, FLOATFIGURE },
+ { CARTOUCHE, FLOAT, FLOATCARTOUCHE },
+ /* Unnecessary markup in @defun blocks. */
+ { VAR, DEFPARAM, -1 },
+ { CODE, DEFTYPE, -1 },
+ /* Add your elements to replace here */
+ {-1, 0, 0}
+};
+
+int xml_in_menu_entry = 0;
+int xml_in_menu_entry_comment = 0;
+int xml_node_open = 0;
+int xml_node_level = -1;
+int xml_in_para = 0;
+int xml_just_after_element = 0;
+int xml_keep_space = 0;
+
+int xml_no_indent = 0;
+
+int xml_no_para = 0;
+char *xml_node_id = NULL;
+int xml_sort_index = 0;
+
+int xml_in_xref_token = 0;
+int xml_in_bookinfo = 0;
+int xml_in_book_title = 0;
+int xml_in_abstract = 0;
+
+/* Non-zero if we are handling an element that can appear between
+ @item and @itemx, @deffn and @deffnx. */
+int xml_dont_touch_items_defs = 0;
+
+/* We need to keep footnote state, because elements inside footnote may try
+ to close the previous parent para. */
+static int xml_in_footnote = 0;
+
+static int xml_after_table_term = 0;
+static int book_started = 0;
+static int first_section_opened = 0;
+
+static int xml_in_tableitem[256];
+static int xml_in_item[256];
+static int xml_table_level = 0;
+
+static int xml_in_def_item[256];
+static int xml_definition_level = 0;
+int xml_after_def_term = 0;
+
+static int in_table_title = 0;
+
+static int in_indexentry = 0;
+static int in_secondary = 0;
+static int in_indexterm = 0;
+
+char *
+xml_id (char *id)
+{
+ char *tem = xmalloc (strlen (id) + 1);
+ char *p = tem;
+ strcpy (tem, id);
+ while (*p)
+ { /* Check if a character is allowed in ID attributes. This list differs
+ slightly from XML specs that it doesn't contain underscores.
+ See http://xml.coverpages.org/sgmlsyn/sgmlsyn.htm, ``9.3 Name'' */
+ if (!strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.", *p))
+ *p = '-';
+ p++;
+ }
+ p = tem;
+ /* First character can only be a letter. */
+ if (!strchr ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", *p))
+ *p = 'i';
+ return tem;
+}
+
+int
+xml_element (char *name)
+{
+ int i;
+ for (i=0; i<=PARA; i++)
+ {
+ if (strcasecmp (name, texinfoml_element_list[i].name) == 0)
+ return i;
+ }
+ printf ("Error xml_element\n");
+ return -1;
+}
+
+void
+xml_begin_document (char *output_filename)
+{
+ if (book_started)
+ return;
+
+ book_started = 1;
+
+ /* Make sure this is the very first string of the output document. */
+ output_paragraph_offset = 0;
+
+ insert_string ("<?xml version=\"1.0\"");
+
+ /* At this point, we register a delayed writing for document encoding,
+ so in the end, proper encoding attribute will be inserted here.
+ Since the user is unaware that we are implicitly executing this
+ command, we should disable warnings temporarily, in order to avoid
+ possible confusion. (ie. if the output is not seekable,
+ register_delayed_write issues a warning.) */
+ {
+ extern int print_warnings;
+ int save_print_warnings = print_warnings;
+ print_warnings = 0;
+ register_delayed_write ("@documentencoding");
+ print_warnings = save_print_warnings;
+ }
+
+ insert_string ("?>\n");
+
+ if (docbook)
+ {
+ insert_string ("<!DOCTYPE book PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\" [\n <!ENTITY tex \"TeX\">\n <!ENTITY latex \"LaTeX\">\n]>");
+ xml_element_list = docbook_element_list;
+ }
+ else
+ {
+ insert_string ("<!DOCTYPE texinfo PUBLIC \"-//GNU//DTD TexinfoML V");
+ insert_string (VERSION);
+ insert_string ("//EN\" \"http://www.gnu.org/software/texinfo/dtd/");
+ insert_string (VERSION);
+ insert_string ("/texinfo.dtd\">");
+ xml_element_list = texinfoml_element_list;
+ }
+ if (language_code != last_language_code)
+ {
+ if (docbook)
+ xml_insert_element_with_attribute (TEXINFO, START, "lang=\"%s\"", language_table[language_code].abbrev);
+ else
+ xml_insert_element_with_attribute (TEXINFO, START, "xml:lang=\"%s\"", language_table[language_code].abbrev);
+ }
+ if (!docbook)
+ {
+ xml_insert_element (SETFILENAME, START);
+ insert_string (output_filename);
+ xml_insert_element (SETFILENAME, END);
+ }
+}
+
+/* */
+static int element_stack[256];
+static int element_stack_index = 0;
+
+static int
+xml_current_element (void)
+{
+ return element_stack[element_stack_index-1];
+}
+
+static void
+xml_push_current_element (int elt)
+{
+ element_stack[element_stack_index++] = elt;
+ if (element_stack_index > 200)
+ printf ("*** stack overflow (%d - %s) ***\n",
+ element_stack_index,
+ xml_element_list[elt].name);
+}
+
+static void
+xml_pop_current_element (void)
+{
+ element_stack_index--;
+ if (element_stack_index < 0)
+ printf ("*** stack underflow (%d - %d) ***\n",
+ element_stack_index,
+ xml_current_element());
+}
+
+int
+xml_current_stack_index (void)
+{
+ return element_stack_index;
+}
+
+void
+xml_end_current_element (void)
+{
+ xml_insert_element (xml_current_element (), END);
+}
+
+static void
+xml_indent (void)
+{
+ if (xml_indentation_increment > 0)
+ {
+ int i;
+ if (output_paragraph[output_paragraph_offset-1] != '\n')
+ insert ('\n');
+ for (i = 0; i < element_stack_index * xml_indentation_increment; i++)
+ insert (' ');
+ }
+}
+
+void
+xml_start_para (void)
+{
+ if (xml_in_para || xml_in_footnote
+ || !xml_element_list[xml_current_element()].contains_para)
+ return;
+
+ while (output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+ xml_indent ();
+
+ insert_string ("<para");
+ if (xml_no_indent)
+ insert_string (" role=\"continues\"");
+ insert_string (">");
+ xml_no_indent = 0;
+ xml_in_para = 1;
+}
+
+void
+xml_end_para (void)
+{
+ if (!xml_in_para || xml_in_footnote)
+ return;
+
+ while (cr_or_whitespace(output_paragraph[output_paragraph_offset-1]))
+ output_paragraph_offset--;
+
+ insert_string ("</para>");
+ if (xml_indentation_increment > 0)
+ insert ('\n');
+ xml_in_para = 0;
+}
+
+void
+xml_end_document (void)
+{
+ if (xml_node_open)
+ {
+ if (xml_node_level != -1)
+ {
+ xml_close_sections (xml_node_level);
+ xml_node_level = -1;
+ }
+ xml_insert_element (NODE, END);
+ }
+ else
+ xml_close_sections (xml_node_level);
+
+ xml_insert_element (TEXINFO, END);
+ if (xml_indentation_increment == 0)
+ insert ('\n');
+ insert_string ("<!-- Keep this comment at the end of the file\n\
+Local variables:\n\
+mode: sgml\n\
+sgml-indent-step:1\n\
+sgml-indent-data:nil\n\
+End:\n\
+-->\n");
+ if (element_stack_index != 0)
+ error ("Element stack index : %d\n", element_stack_index);
+}
+
+/* MUST be 0 or 1, not true or false values */
+static int start_element_inserted = 1;
+
+/* NOTE: We use `elt' rather than `element' in the argument list of
+ the next function, since otherwise the Solaris SUNWspro compiler
+ barfs because `element' is a typedef declared near the beginning of
+ this file. */
+void
+#if defined (VA_FPRINTF) && __STDC__
+xml_insert_element_with_attribute (int elt, int arg, char *format, ...)
+#else
+xml_insert_element_with_attribute (elt, arg, format, va_alist)
+ int elt;
+ int arg;
+ char *format;
+ va_dcl
+#endif
+{
+ /* Look at the replace_elements table to see if we have to change the element */
+ if (xml_sort_index)
+ return;
+ if (docbook)
+ {
+ replace_element *element_list = replace_elements;
+ while (element_list->element_to_replace >= 0)
+ {
+ if ( ( (arg == START) &&
+ (element_list->element_containing == xml_current_element ()) &&
+ (element_list->element_to_replace == elt) ) ||
+ ( (arg == END) &&
+ (element_list->element_containing == element_stack[element_stack_index-1-start_element_inserted]) &&
+ (element_list->element_to_replace == elt) ) )
+ {
+ elt = element_list->element_replacing;
+ break;
+ }
+ element_list ++;
+ }
+
+ /* Forget the element */
+ if (elt < 0)
+ {
+ if (arg == START)
+ start_element_inserted = 0;
+ else
+ /* Replace the default value, for the next time */
+ start_element_inserted = 1;
+ return;
+ }
+ }
+
+ if (!book_started)
+ return;
+
+ if (!xml_dont_touch_items_defs && arg == START)
+ {
+ if (xml_after_table_term && elt != TABLETERM && xml_table_level
+ && !xml_in_item[xml_table_level])
+ {
+ xml_after_table_term = 0;
+ xml_insert_element (ITEM, START);
+ xml_in_item[xml_table_level] = 1;
+ }
+ else if (xml_after_def_term && elt != DEFINITIONTERM)
+ {
+ xml_after_def_term = 0;
+ xml_insert_element (DEFINITIONITEM, START);
+ xml_in_def_item[xml_definition_level] = 1;
+ }
+ }
+
+ if (docbook && !only_macro_expansion && (in_menu || in_detailmenu))
+ return;
+
+ if (executing_string && arg == END)
+ switch (elt)
+ {
+ case TABLEITEM:
+ xml_in_tableitem[xml_table_level] = 0;
+ break;
+ case ITEM:
+ xml_in_item[xml_table_level] = 0;
+ break;
+ case DEFINITIONTERM:
+ xml_in_def_item[xml_definition_level] = 0;
+ break;
+ }
+
+ /* We are special-casing FIGURE element for docbook. It does appear in
+ the tag stack, but not in the output. This is to make element replacement
+ work beautifully. */
+ if (docbook && elt == FLOAT)
+ {
+ if (arg == START)
+ xml_push_current_element (elt);
+ else
+ xml_pop_current_element ();
+ return;
+ }
+
+ if (!xml_element_list[elt].name || !strlen (xml_element_list[elt].name))
+ {
+ /*printf ("Warning: Inserting empty element %d\n", elt);*/
+ return;
+ }
+
+ if (arg == START && !xml_in_para && !xml_no_para
+ && xml_element_list[elt].contained_in_para)
+ xml_start_para ();
+
+ if (arg == START && xml_in_para && !xml_element_list[elt].contained_in_para)
+ xml_end_para ();
+
+ if (arg == END && xml_in_para && !xml_element_list[elt].contained_in_para)
+ xml_end_para ();
+
+ if (docbook && xml_table_level && !in_table_title
+ && !xml_in_tableitem[xml_table_level] && !xml_in_item[xml_table_level]
+ && arg == START && elt != TABLEITEM && elt != TABLETERM
+ && !in_indexterm && xml_current_element() == TABLE)
+ {
+ in_table_title = 1;
+ xml_insert_element (TITLE, START);
+ }
+
+ if (arg == START && !xml_in_para && !xml_keep_space
+ && !xml_element_list[elt].contained_in_para)
+ xml_indent ();
+
+ if (arg == START)
+ xml_push_current_element (elt);
+ else
+ xml_pop_current_element ();
+
+ /* Eat one newline before </example> and the like. */
+ if (!docbook && arg == END
+ && (xml_element_list[elt].keep_space || elt == GROUP)
+ && output_paragraph[output_paragraph_offset-1] == '\n')
+ output_paragraph_offset--;
+
+ /* And eat whitespace before </entry> in @multitables. */
+ if (arg == END && elt == ENTRY)
+ while (cr_or_whitespace(output_paragraph[output_paragraph_offset-1]))
+ output_paragraph_offset--;
+
+ /* Indent elements that can contain <para>. */
+ if (arg == END && !xml_in_para && !xml_keep_space
+ && xml_element_list[elt].contains_para)
+ xml_indent ();
+
+ /* Here are the elements we want indented. These do not contain <para>
+ directly. */
+ if (arg == END && (elt == MENUENTRY || elt == ITEMIZE || elt == ENUMERATE
+ || elt == TABLEITEM || elt == TABLE
+ || elt == MULTITABLE || elt == TGROUP || elt == THEAD || elt == TBODY
+ || elt == ROW || elt == INFORMALFIGURE
+ || (!docbook && (elt == DEFINITION || elt == DEFINITIONTERM))))
+ xml_indent ();
+
+ insert ('<');
+ if (arg == END)
+ insert ('/');
+ insert_string (xml_element_list[elt].name);
+
+ /* printf ("%s ", xml_element_list[elt].name);*/
+
+ if (format)
+ {
+ char temp_string[2000]; /* xx no fixed limits */
+#ifdef VA_SPRINTF
+ va_list ap;
+#endif
+
+ VA_START (ap, format);
+#ifdef VA_SPRINTF
+ VA_SPRINTF (temp_string, format, ap);
+#else
+ sprintf (temp_string, format, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif
+ insert (' ');
+ insert_string (temp_string);
+ va_end (ap);
+ }
+
+ if (arg == START && xml_node_id && elt != NODENAME)
+ {
+ insert_string (" id=\"");
+ insert_string (xml_node_id);
+ insert ('"');
+ free (xml_node_id);
+ xml_node_id = NULL;
+ }
+
+ if (xml_element_list[elt].keep_space)
+ {
+ if (arg == START)
+ {
+ if (!docbook)
+ insert_string (" xml:space=\"preserve\"");
+ xml_keep_space++;
+ }
+ else
+ xml_keep_space--;
+ }
+
+ insert ('>');
+
+ if (!xml_in_para && !xml_element_list[elt].contained_in_para
+ && xml_element_list[elt].contains_para && xml_indentation_increment > 0)
+ insert ('\n');
+
+ xml_just_after_element = 1;
+}
+
+/* See the NOTE before xml_insert_element_with_attribute, for why we
+ use `elt' rather than `element' here. */
+void
+xml_insert_element (int elt, int arg)
+{
+ xml_insert_element_with_attribute (elt, arg, NULL);
+}
+
+void
+xml_insert_entity (char *entity_name)
+{
+ int saved_escape_html = escape_html;
+
+ if (!book_started)
+ return;
+ if (docbook && !only_macro_expansion && (in_menu || in_detailmenu))
+ return;
+
+ if (!xml_in_para && !xml_no_para && !only_macro_expansion
+ && xml_element_list[xml_current_element ()].contains_para
+ && !in_fixed_width_font)
+ xml_start_para ();
+
+ escape_html = 0;
+ add_char ('&');
+ escape_html = saved_escape_html;
+ insert_string (entity_name);
+ add_char (';');
+}
+
+typedef struct _xml_section xml_section;
+struct _xml_section {
+ int level;
+ char *name;
+ xml_section *prev;
+};
+
+xml_section *last_section = NULL;
+
+void
+xml_begin_node (void)
+{
+ first_section_opened = 1;
+ if (xml_in_abstract)
+ {
+ xml_insert_element (ABSTRACT, END);
+ xml_in_abstract = 0;
+ }
+ if (xml_in_bookinfo)
+ {
+ xml_insert_element (BOOKINFO, END);
+ xml_in_bookinfo = 0;
+ }
+ if (xml_node_open && ! docbook)
+ {
+ if (xml_node_level != -1)
+ {
+ xml_close_sections (xml_node_level);
+ xml_node_level = -1;
+ }
+ xml_insert_element (NODE, END);
+ }
+ xml_insert_element (NODE, START);
+ xml_node_open = 1;
+}
+
+void
+xml_close_sections (int level)
+{
+ if (!first_section_opened)
+ {
+ if (xml_in_abstract)
+ {
+ xml_insert_element (ABSTRACT, END);
+ xml_in_abstract = 0;
+ }
+ if (xml_in_bookinfo)
+ {
+ xml_insert_element (BOOKINFO, END);
+ xml_in_bookinfo = 0;
+ }
+ first_section_opened = 1;
+ }
+
+ while (last_section && last_section->level >= level)
+ {
+ xml_section *temp = last_section;
+ xml_insert_element (xml_element(last_section->name), END);
+ temp = last_section;
+ last_section = last_section->prev;
+ free (temp->name);
+ free (temp);
+ }
+}
+
+void
+xml_open_section (int level, char *name)
+{
+ xml_section *sect = (xml_section *) xmalloc (sizeof (xml_section));
+
+ sect->level = level;
+ sect->name = xmalloc (1 + strlen (name));
+ strcpy (sect->name, name);
+ sect->prev = last_section;
+ last_section = sect;
+
+ if (xml_node_open && xml_node_level == -1)
+ xml_node_level = level;
+}
+
+void
+xml_start_menu_entry (char *tem)
+{
+ char *string;
+ discard_until ("* ");
+
+ /* The line number was already incremented in reader_loop when we
+ saw the newline, and discard_until has now incremented again. */
+ line_number--;
+
+ if (xml_in_menu_entry)
+ {
+ if (xml_in_menu_entry_comment)
+ {
+ xml_insert_element (MENUCOMMENT, END);
+ xml_in_menu_entry_comment=0;
+ }
+ xml_insert_element (MENUENTRY, END);
+ xml_in_menu_entry=0;
+ }
+ xml_insert_element (MENUENTRY, START);
+ xml_in_menu_entry=1;
+
+ xml_insert_element (MENUNODE, START);
+ string = expansion (tem, 0);
+ add_word (string);
+ xml_insert_element (MENUNODE, END);
+ free (string);
+
+ /* The menu item may use macros, so expand them now. */
+ xml_insert_element (MENUTITLE, START);
+ only_macro_expansion++;
+ get_until_in_line (1, ":", &string);
+ only_macro_expansion--;
+ execute_string ("%s", string); /* get escaping done */
+ xml_insert_element (MENUTITLE, END);
+ free (string);
+
+ if (looking_at ("::"))
+ discard_until (":");
+ else
+ { /* discard the node name */
+ get_until_in_line (0, ".", &string);
+ free (string);
+ }
+ input_text_offset++; /* discard the second colon or the period */
+ skip_whitespace_and_newlines();
+ xml_insert_element (MENUCOMMENT, START);
+ xml_in_menu_entry_comment ++;
+}
+
+void
+xml_end_menu (void)
+{
+ if (xml_in_menu_entry)
+ {
+ if (xml_in_menu_entry_comment)
+ {
+ xml_insert_element (MENUCOMMENT, END);
+ xml_in_menu_entry_comment --;
+ }
+ xml_insert_element (MENUENTRY, END);
+ xml_in_menu_entry--;
+ }
+ xml_insert_element (MENU, END);
+}
+
+static int xml_last_character;
+
+void
+xml_add_char (int character)
+{
+ if (!book_started)
+ return;
+ if (docbook && !only_macro_expansion && (in_menu || in_detailmenu))
+ return;
+
+ if (docbook && xml_table_level && !in_table_title
+ && !xml_in_item[xml_table_level] && !xml_in_tableitem[xml_table_level]
+ && !cr_or_whitespace (character) && !in_indexterm)
+ {
+ in_table_title = 1;
+ xml_insert_element (TITLE, START);
+ }
+
+ if (!first_section_opened && !xml_in_abstract && !xml_in_book_title
+ && !xml_no_para && character != '\r' && character != '\n'
+ && character != ' ' && !is_in_insertion_of_type (copying))
+ {
+ if (!xml_in_bookinfo)
+ {
+ xml_insert_element (BOOKINFO, START);
+ xml_in_bookinfo = 1;
+ }
+ xml_insert_element (ABSTRACT, START);
+ xml_in_abstract = 1;
+ }
+
+ if (!xml_sort_index && !xml_in_xref_token && !xml_dont_touch_items_defs)
+ {
+ if (xml_after_table_term && xml_table_level
+ && !xml_in_item[xml_table_level])
+ {
+ xml_after_table_term = 0;
+ xml_insert_element (ITEM, START);
+ xml_in_item[xml_table_level] = 1;
+ }
+ else if (xml_after_def_term)
+ {
+ xml_after_def_term = 0;
+ xml_insert_element (DEFINITIONITEM, START);
+ xml_in_def_item[xml_definition_level] = 1;
+ }
+ }
+
+ if (xml_just_after_element && !xml_in_para && !inhibit_paragraph_indentation)
+ {
+ if (character == '\r' || character == '\n' || character == '\t' || character == ' ')
+ return;
+ xml_just_after_element = 0;
+ }
+
+ if (xml_element_list[xml_current_element()].contains_para
+ && !xml_in_para && !only_macro_expansion && !xml_no_para
+ && !cr_or_whitespace (character) && !in_fixed_width_font)
+ xml_start_para ();
+
+ if (xml_in_para && character == '\n' && xml_last_character == '\n'
+ && !only_macro_expansion && !xml_no_para
+ && xml_element_list[xml_current_element()].contains_para )
+ {
+ xml_end_para ();
+ xml_just_after_element = 1;
+ return;
+ }
+
+ if (xml_in_menu_entry_comment && character == '\n' && xml_last_character == '\n')
+ {
+ xml_insert_element (MENUCOMMENT, END);
+ xml_in_menu_entry_comment = 0;
+ xml_insert_element (MENUENTRY, END);
+ xml_in_menu_entry = 0;
+ }
+
+ if (xml_in_menu_entry_comment && whitespace(character)
+ && cr_or_whitespace(xml_last_character))
+ return;
+
+ if (character == '\n' && !xml_in_para && !inhibit_paragraph_indentation)
+ return;
+
+ xml_last_character = character;
+
+ if (character == '&' && escape_html)
+ insert_string ("&amp;");
+ else if (character == '<' && escape_html)
+ insert_string ("&lt;");
+ else if (character == '\n' && !xml_keep_space)
+ {
+ if (!xml_in_para && xml_just_after_element && !multitable_active)
+ return;
+ else
+ insert (docbook ? '\n' : ' ');
+ }
+ else
+ insert (character);
+
+ return;
+}
+
+void
+xml_insert_footnote (char *note)
+{
+ if (!xml_in_para)
+ xml_start_para ();
+
+ xml_in_footnote = 1;
+ xml_insert_element (FOOTNOTE, START);
+ insert_string ("<para>");
+ execute_string ("%s", note);
+ insert_string ("</para>");
+ xml_insert_element (FOOTNOTE, END);
+ xml_in_footnote = 0;
+}
+
+/* We need to keep the quotation stack ourself, because insertion_stack
+ loses item_function when we are closing the block, so we don't know
+ what to close then. */
+typedef struct quotation_elt
+{
+ struct quotation_elt *next;
+ char *type;
+} QUOTATION_ELT;
+
+static QUOTATION_ELT *quotation_stack = NULL;
+
+void
+xml_insert_quotation (char *type, int arg)
+{
+ int quotation_started = 0;
+
+ if (arg == START)
+ {
+ QUOTATION_ELT *new = xmalloc (sizeof (QUOTATION_ELT));
+ new->type = xstrdup (type);
+ new->next = quotation_stack;
+ quotation_stack = new;
+ }
+ else
+ type = quotation_stack->type;
+
+ /* Make use of special quotation styles of Docbook if we can. */
+ if (docbook && strlen(type))
+ {
+ /* Let's assume it started. */
+ quotation_started = 1;
+
+ if (strcasecmp (type, "tip") == 0)
+ xml_insert_element (TIP, arg);
+ else if (strcasecmp (type, "note") == 0)
+ xml_insert_element (NOTE, arg);
+ else if (strcasecmp (type, "important") == 0)
+ xml_insert_element (IMPORTANT, arg);
+ else if (strcasecmp (type, "warning") == 0)
+ xml_insert_element (WARNING, arg);
+ else if (strcasecmp (type, "caution") == 0)
+ xml_insert_element (CAUTION, arg);
+ else
+ /* Didn't find a known quotation type :\ */
+ quotation_started = 0;
+ }
+
+ if (!quotation_started)
+ {
+ xml_insert_element (QUOTATION, arg);
+ if (strlen(type) && arg == START)
+ execute_string ("@b{%s:} ", type);
+ }
+
+ if (arg == END)
+ {
+ QUOTATION_ELT *temp = quotation_stack;
+ if (temp == NULL)
+ return;
+ quotation_stack = quotation_stack->next;
+ free(temp->type);
+ free(temp);
+ }
+}
+
+/* Starting generic docbook floats. Just starts elt with correct label
+ and id attributes, and inserts title. */
+void
+xml_begin_docbook_float (int elt)
+{
+ if (current_float_used_title ()) /* in a nested float */
+ {
+ xml_insert_element (elt, START); /* just insert the tag */
+ return;
+ }
+
+
+ /* OK, need the title, tag, etc. */
+ if (elt == CARTOUCHE) /* no labels on <sidebar> */
+ {
+ if (strlen (current_float_id ()) == 0)
+ xml_insert_element (elt, START);
+ else
+ xml_insert_element_with_attribute (elt, START,
+ "id=\"%s\"", xml_id (current_float_id ()));
+ }
+ else if (strlen (current_float_id ()) == 0)
+ xml_insert_element_with_attribute (elt, START, "label=\"\"");
+ else
+ xml_insert_element_with_attribute (elt, START,
+ "id=\"%s\" label=\"%s\"", xml_id (current_float_id ()),
+ current_float_number ());
+
+ xml_insert_element (TITLE, START);
+ execute_string ("%s", current_float_title ());
+ xml_insert_element (TITLE, END);
+
+ current_float_set_title_used (); /* mark this title, tag, etc used */
+}
+
+/*
+ * Lists and Tables
+ */
+void
+xml_begin_table (int type, char *item_function)
+{
+ switch (type)
+ {
+ case ftable:
+ case vtable:
+ case table:
+ /*if (docbook)*/ /* 05-08 */
+ {
+ xml_insert_element (TABLE, START);
+ xml_table_level ++;
+ xml_in_tableitem[xml_table_level] = 0;
+ xml_in_item[xml_table_level] = 0;
+ xml_after_table_term = 0;
+ }
+ break;
+ case itemize:
+ if (!docbook)
+ {
+ xml_insert_element (ITEMIZE, START);
+ xml_table_level ++;
+ xml_in_item[xml_table_level] = 0;
+ xml_insert_element (ITEMFUNCTION, START);
+ if (*item_function == COMMAND_PREFIX
+ && item_function[strlen (item_function) - 1] != '}'
+ && command_needs_braces (item_function + 1))
+ execute_string ("%s{}", item_function);
+ else
+ execute_string ("%s", item_function);
+ xml_insert_element (ITEMFUNCTION, END);
+ }
+ else
+ {
+ xml_insert_element_with_attribute (ITEMIZE, START,
+ "mark=\"%s\"",
+ (*item_function == COMMAND_PREFIX) ?
+ &item_function[1] : item_function);
+ xml_table_level ++;
+ xml_in_item[xml_table_level] = 0;
+ }
+ break;
+ }
+}
+
+void
+xml_end_table (int type)
+{
+ switch (type)
+ {
+ case ftable:
+ case vtable:
+ case table:
+ if (xml_in_item[xml_table_level])
+ {
+ xml_insert_element (ITEM, END);
+ xml_in_item[xml_table_level] = 0;
+ }
+ if (xml_in_tableitem[xml_table_level])
+ {
+ xml_insert_element (TABLEITEM, END);
+ xml_in_tableitem[xml_table_level] = 0;
+ }
+ xml_insert_element (TABLE, END);
+ xml_after_table_term = 0;
+ xml_table_level --;
+
+ break;
+ case itemize:
+ if (xml_in_item[xml_table_level])
+ {
+ xml_insert_element (ITEM, END);
+ xml_in_item[xml_table_level] = 0;
+ }
+ /* gnat-style manual contains an itemized list without items! */
+ if (in_table_title)
+ {
+ xml_insert_element (TITLE, END);
+ in_table_title = 0;
+ }
+ xml_insert_element (ITEMIZE, END);
+ xml_table_level --;
+ break;
+ }
+}
+
+void
+xml_begin_item (void)
+{
+ if (xml_in_item[xml_table_level])
+ xml_insert_element (ITEM, END);
+
+ xml_insert_element (ITEM, START);
+ xml_in_item[xml_table_level] = 1;
+}
+
+void
+xml_begin_table_item (void)
+{
+ if (!xml_after_table_term)
+ {
+ if (xml_in_item[xml_table_level])
+ xml_insert_element (ITEM, END);
+ if (xml_in_tableitem[xml_table_level])
+ xml_insert_element (TABLEITEM, END);
+
+ if (in_table_title)
+ {
+ in_table_title = 0;
+ xml_insert_element (TITLE, END);
+ }
+ xml_insert_element (TABLEITEM, START);
+ }
+ xml_insert_element (TABLETERM, START);
+ xml_in_tableitem[xml_table_level] = 1;
+ xml_in_item[xml_table_level] = 0;
+ xml_after_table_term = 0;
+}
+
+void
+xml_continue_table_item (void)
+{
+ xml_insert_element (TABLETERM, END);
+ xml_after_table_term = 1;
+ xml_in_item[xml_table_level] = 0;
+}
+
+void
+xml_begin_enumerate (char *enum_arg)
+{
+ if (!docbook)
+ xml_insert_element_with_attribute (ENUMERATE, START, "first=\"%s\"", enum_arg);
+ else
+ {
+ if (isdigit (*enum_arg))
+ {
+ int enum_val = atoi (enum_arg);
+
+ /* Have to check the value, not just the first digit. */
+ if (enum_val == 0)
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "numeration=\"arabic\" role=\"0\"", NULL);
+ else if (enum_val == 1)
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "numeration=\"arabic\"", NULL);
+ else
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "continuation=\"continues\" numeration=\"arabic\"", NULL);
+ }
+ else if (isupper (*enum_arg))
+ {
+ if (enum_arg[0] == 'A')
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "numeration=\"upperalpha\"", NULL);
+ else
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "continuation=\"continues\" numeration=\"upperalpha\"", NULL);
+ }
+ else
+ {
+ if (enum_arg[0] == 'a')
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "numeration=\"loweralpha\"", NULL);
+ else
+ xml_insert_element_with_attribute (ENUMERATE, START,
+ "continuation=\"continues\" numeration=\"loweralpha\"", NULL);
+ }
+ }
+ xml_table_level ++;
+ xml_in_item[xml_table_level] = 0;
+}
+
+void
+xml_end_enumerate (void)
+{
+ if (xml_in_item[xml_table_level])
+ {
+ xml_insert_element (ITEM, END);
+ xml_in_item[xml_table_level] = 0;
+ }
+ xml_insert_element (ENUMERATE, END);
+ xml_table_level --;
+}
+
+static void
+xml_insert_text_file (char *name_arg)
+{
+ char *fullname = xmalloc (strlen (name_arg) + 4 + 1);
+ FILE *image_file;
+ strcpy (fullname, name_arg);
+ strcat (fullname, ".txt");
+ image_file = fopen (fullname, "r");
+ if (image_file)
+ {
+ int ch;
+ int save_inhibit_indentation = inhibit_paragraph_indentation;
+ int save_filling_enabled = filling_enabled;
+
+ xml_insert_element (TEXTOBJECT, START);
+ xml_insert_element (DISPLAY, START);
+
+ inhibit_paragraph_indentation = 1;
+ filling_enabled = 0;
+ last_char_was_newline = 0;
+
+ /* Maybe we need to remove the final newline if the image
+ file is only one line to allow in-line images. On the
+ other hand, they could just make the file without a
+ final newline. */
+ while ((ch = getc (image_file)) != EOF)
+ add_char (ch);
+
+ inhibit_paragraph_indentation = save_inhibit_indentation;
+ filling_enabled = save_filling_enabled;
+
+ xml_insert_element (DISPLAY, END);
+ xml_insert_element (TEXTOBJECT, END);
+
+ if (fclose (image_file) != 0)
+ perror (fullname);
+ }
+ else
+ warning (_("@image file `%s' unreadable: %s"), fullname,
+ strerror (errno));
+
+ free (fullname);
+}
+
+/* If NAME.EXT is accessible or FORCE is nonzero, insert a docbook
+ imagedata element for FMT. Return 1 if inserted something, 0 else. */
+
+static int
+try_docbook_image (const char *name, const char *ext, const char *fmt,
+ int force)
+{
+ int used = 0;
+ char *fullname = xmalloc (strlen (name) + 1 + strlen (ext) + 1);
+ sprintf (fullname, "%s.%s", name, ext);
+
+ if (force || access (fullname, R_OK) == 0)
+ {
+ xml_insert_element (IMAGEOBJECT, START);
+ xml_insert_element_with_attribute (IMAGEDATA, START,
+ "fileref=\"%s\" format=\"%s\"", fullname, fmt);
+ xml_insert_element (IMAGEDATA, END);
+ xml_insert_element (IMAGEOBJECT, END);
+ used = 1;
+ }
+
+ free (fullname);
+ return used;
+}
+
+
+void
+xml_insert_docbook_image (char *name_arg)
+{
+ int found = 0;
+ int elt = xml_in_para ? INLINEIMAGE : MEDIAOBJECT;
+
+ if (is_in_insertion_of_type (floatenv))
+ xml_begin_docbook_float (INFORMALFIGURE);
+ else if (!xml_in_para)
+ xml_insert_element (INFORMALFIGURE, START);
+
+ xml_no_para++;
+
+ xml_insert_element (elt, START);
+
+ /* A selected few from http://docbook.org/tdg/en/html/imagedata.html. */
+ if (try_docbook_image (name_arg, "eps", "EPS", 0))
+ found++;
+ if (try_docbook_image (name_arg, "gif", "GIF", 0))
+ found++;
+ if (try_docbook_image (name_arg, "jpg", "JPG", 0))
+ found++;
+ if (try_docbook_image (name_arg, "jpeg", "JPEG", 0))
+ found++;
+ if (try_docbook_image (name_arg, "pdf", "PDF", 0))
+ found++;
+ if (try_docbook_image (name_arg, "png", "PNG", 0))
+ found++;
+ if (try_docbook_image (name_arg, "svg", "SVG", 0))
+ found++;
+
+ /* If no luck so far, just assume we'll eventually have a jpg. */
+ if (!found)
+ try_docbook_image (name_arg, "jpg", "JPG", 1);
+
+ xml_insert_text_file (name_arg);
+ xml_insert_element (elt, END);
+
+ xml_no_para--;
+
+ if (elt == MEDIAOBJECT)
+ xml_insert_element (INFORMALFIGURE, END);
+}
+
+void
+xml_asterisk (void)
+{
+}
+
+
+/*
+ * INDEX
+ */
+/* Used to separate primary and secondary entries in an index -- we need
+ to have real multilivel indexing support, not just string analysis. */
+#define INDEX_SEP "@this string will never appear@" /* was , */
+
+typedef struct
+{
+ char *from;
+ char *to;
+} XML_SYNONYM;
+
+static XML_SYNONYM **xml_synonyms = NULL;
+static int xml_synonyms_count = 0;
+
+void
+xml_insert_indexterm (char *indexterm, char *index)
+{
+ /* @index commands can appear between @item and @itemx, @deffn and @deffnx. */
+ if (!docbook)
+ {
+ /* Check to see if we need to do index redirection per @synindex. */
+ int i;
+ for (i = 0; i < xml_synonyms_count; i++)
+ {
+ if (STREQ (xml_synonyms[i]->from, index))
+ index = xstrdup (xml_synonyms[i]->to);
+ }
+
+ xml_dont_touch_items_defs++;
+ xml_insert_element_with_attribute (INDEXTERM, START, "index=\"%s\"", index);
+ in_indexterm = 1;
+ execute_string ("%s", indexterm);
+ xml_insert_element (INDEXTERM, END);
+ in_indexterm = 0;
+ xml_dont_touch_items_defs--;
+ }
+ else
+ {
+ char *primary = NULL, *secondary = NULL;
+ if (strstr (indexterm+1, INDEX_SEP))
+ {
+ primary = xmalloc (strlen (indexterm) + 1);
+ strcpy (primary, indexterm);
+ secondary = strstr (primary+1, INDEX_SEP);
+ *secondary = '\0';
+ secondary += strlen (INDEX_SEP);
+ }
+ xml_insert_element_with_attribute (INDEXTERM, START, "role=\"%s\"", index);
+ in_indexterm = 1;
+ xml_insert_element (PRIMARY, START);
+ if (primary)
+ execute_string ("%s", primary);
+ else
+ execute_string ("%s", indexterm);
+ xml_insert_element (PRIMARY, END);
+ if (primary)
+ {
+ xml_insert_element (SECONDARY, START);
+ execute_string ("%s", secondary);
+ xml_insert_element (SECONDARY, END);
+ }
+ xml_insert_element (INDEXTERM, END);
+ in_indexterm = 0;
+ }
+}
+
+
+int xml_last_section_output_position = 0;
+static char last_division_letter = ' ';
+static char index_primary[2000]; /** xx no fixed limit */
+static int indexdivempty = 0;
+
+static void
+xml_close_indexentry (void)
+{
+ if (!in_indexentry)
+ return;
+ if (in_secondary)
+ xml_insert_element (SECONDARYIE, END);
+ xml_insert_element (INDEXENTRY, END);
+ in_secondary = 0;
+ in_indexentry = 0;
+}
+
+void
+xml_begin_index (void)
+{
+ typedef struct xml_index_title {
+ struct xml_index_title *next;
+ char *title;
+ } XML_INDEX_TITLE;
+
+ static XML_INDEX_TITLE *xml_index_titles = NULL;
+
+ if (!handling_delayed_writes)
+ { /* We assume that we just opened a section, and so that the last output is
+ <SECTION ID="node-name"><TITLE>Title</TITLE>
+ where SECTION can be CHAPTER, ... */
+
+ XML_INDEX_TITLE *new = xmalloc (sizeof (XML_INDEX_TITLE));
+ xml_section *temp = last_section;
+
+ int l = output_paragraph_offset-xml_last_section_output_position;
+ char *tmp = xmalloc (l+1);
+ char *p = tmp;
+ strncpy (tmp, (char *) output_paragraph, l);
+
+ /* We remove <SECTION */
+ tmp[l] = '\0';
+ while (*p != '<')
+ p++;
+ while (*p != ' ')
+ p++;
+ /* ... and its label attribute. */
+ if (strncmp (p, " label=", 7) == 0)
+ {
+ p++;
+ while (*p != ' ')
+ p++;
+ }
+
+ output_paragraph_offset = xml_last_section_output_position;
+ xml_last_section_output_position = 0;
+
+ xml_pop_current_element (); /* remove section element from elements stack */
+
+ if (last_section)
+ last_section = last_section->prev; /* remove section from sections stack */
+ if (temp)
+ {
+ free (temp->name);
+ free (temp);
+ }
+
+ new->title = xstrdup (p);
+ new->next = xml_index_titles;
+ xml_index_titles = new;
+ }
+ else
+ {
+ static int xml_index_titles_reversed = 0;
+
+ if (!xml_index_titles_reversed)
+ {
+ xml_index_titles = (XML_INDEX_TITLE *) reverse_list
+ ((GENERIC_LIST *) xml_index_titles);
+ xml_index_titles_reversed = 1;
+ }
+
+ /* We put <INDEX> */
+ xml_insert_element (PRINTINDEX, START);
+ if (xml_index_titles)
+ {
+ /* Remove the final > */
+ output_paragraph_offset--;
+ /* and put ID="node-name"><TITLE>Title</TITLE> */
+ insert_string (xml_index_titles->title);
+ free (xml_index_titles->title);
+ xml_index_titles = xml_index_titles->next;
+ }
+
+ if (xml_index_divisions)
+ {
+ xml_insert_element (INDEXDIV, START);
+ indexdivempty = 1;
+ }
+ }
+}
+
+void
+xml_end_index (void)
+{
+ xml_close_indexentry ();
+ if (xml_index_divisions)
+ xml_insert_element (INDEXDIV, END);
+ xml_insert_element (PRINTINDEX, END);
+}
+
+static void
+xml_index_divide (char *entry)
+{
+ char c;
+ if (strlen (entry) > (strlen (xml_element_list[CODE].name) + 2) &&
+ strncmp (entry+1, xml_element_list[CODE].name, strlen (xml_element_list[CODE].name)) == 0)
+ c = entry[strlen (xml_element_list[CODE].name)+2];
+ else
+ c = entry[0];
+ if (tolower (c) != last_division_letter && isalpha (c))
+ {
+ last_division_letter = tolower (c);
+ xml_close_indexentry ();
+ if (!indexdivempty)
+ {
+ xml_insert_element (INDEXDIV, END);
+ xml_insert_element (INDEXDIV, START);
+ }
+ xml_insert_element (TITLE, START);
+ insert (toupper (c));
+ xml_insert_element (TITLE, END);
+ }
+}
+
+void
+xml_insert_indexentry (char *entry, char *node)
+{
+ char *primary = NULL, *secondary;
+ if (xml_index_divisions)
+ xml_index_divide (entry);
+
+ indexdivempty = 0;
+ if (strstr (entry+1, INDEX_SEP))
+ {
+ primary = xmalloc (strlen (entry) + 1);
+ strcpy (primary, entry);
+ secondary = strstr (primary+1, INDEX_SEP);
+ *secondary = '\0';
+ secondary += strlen (INDEX_SEP);
+
+ if (in_secondary && strcmp (primary, index_primary) == 0)
+ {
+ xml_insert_element (SECONDARYIE, END);
+ xml_insert_element (SECONDARYIE, START);
+ execute_string ("%s", secondary);
+ }
+ else
+ {
+ xml_close_indexentry ();
+ xml_insert_element (INDEXENTRY, START);
+ in_indexentry = 1;
+ xml_insert_element (PRIMARYIE, START);
+ execute_string ("%s", primary);
+ xml_insert_element (PRIMARYIE, END);
+ xml_insert_element (SECONDARYIE, START);
+ execute_string ("%s", secondary);
+ in_secondary = 1;
+ }
+ }
+ else
+ {
+ xml_close_indexentry ();
+ xml_insert_element (INDEXENTRY, START);
+ in_indexentry = 1;
+ xml_insert_element (PRIMARYIE, START);
+ execute_string ("%s", entry);
+ }
+ add_word (", ");
+
+ /* Don't link to @unnumbered sections directly.
+ We are disabling warnings temporarily, otherwise these xrefs
+ will cause bogus warnings about missing punctuation. */
+ {
+ extern int print_warnings;
+ int save_print_warnings = print_warnings;
+ print_warnings = 0;
+ execute_string ("%cxref{%s}", COMMAND_PREFIX, xstrdup (node));
+ print_warnings = save_print_warnings;
+ }
+
+ if (primary)
+ {
+ strcpy (index_primary, primary);
+ /* xml_insert_element (SECONDARYIE, END);*/
+ /* *(secondary-1) = ',';*/ /* necessary ? */
+ free (primary);
+ }
+ else
+ xml_insert_element (PRIMARYIE, END);
+
+ /* xml_insert_element (INDEXENTRY, END); */
+}
+
+void
+xml_synindex (char *from, char *to)
+{
+ int i, slot;
+
+ slot = -1;
+ for (i = 0; i < xml_synonyms_count; i++)
+ if (!xml_synonyms[i])
+ {
+ slot = i;
+ break;
+ }
+
+ if (slot < 0)
+ {
+ slot = xml_synonyms_count;
+ xml_synonyms_count++;
+
+ xml_synonyms = (XML_SYNONYM **) xrealloc (xml_synonyms,
+ (xml_synonyms_count + 1) * sizeof (XML_SYNONYM *));
+ }
+
+ xml_synonyms[slot] = xmalloc (sizeof (XML_SYNONYM));
+ xml_synonyms[slot]->from = xstrdup (from);
+ xml_synonyms[slot]->to = xstrdup (to);
+}
+
+/*
+ * MULTITABLE
+ */
+
+static int multitable_columns_count;
+static int *multitable_column_widths;
+
+void
+xml_begin_multitable (int ncolumns, int *column_widths)
+{
+ int i;
+ if (docbook)
+ {
+ if (is_in_insertion_of_type (floatenv))
+ xml_begin_docbook_float (MULTITABLE);
+ else
+ xml_insert_element (MULTITABLE, START);
+
+ multitable_columns_count = ncolumns;
+ multitable_column_widths = xmalloc (sizeof (int) * ncolumns);
+ memcpy (multitable_column_widths, column_widths,
+ sizeof (int) * ncolumns);
+
+ xml_no_para = 1;
+ }
+ else
+ {
+ xml_insert_element (MULTITABLE, START);
+ for (i=0; i<ncolumns; i++)
+ {
+ xml_insert_element (COLSPEC, START);
+ add_word_args ("%d", column_widths[i]);
+ xml_insert_element (COLSPEC, END);
+ }
+ xml_no_para = 1;
+ }
+}
+
+static void
+xml_begin_multitable_group (void)
+{
+ int i;
+
+ xml_insert_element_with_attribute (TGROUP, START, "cols=\"%d\"",
+ multitable_columns_count);
+
+ for (i=0; i < multitable_columns_count; i++)
+ {
+ xml_insert_element_with_attribute (COLSPEC, START,
+ "colwidth=\"%d*\"", multitable_column_widths[i]);
+ xml_insert_element (COLSPEC, END);
+ }
+}
+
+void
+xml_end_multitable_row (int first_row)
+{
+ if (!first_row)
+ {
+ xml_insert_element (ENTRY, END);
+ xml_insert_element (ROW, END);
+ }
+
+ if (headitem_flag)
+ {
+ if (!first_row)
+ {
+ if (after_headitem)
+ xml_insert_element (THEAD, END);
+ else
+ xml_insert_element (TBODY, END);
+ xml_insert_element (TGROUP, END);
+ }
+
+ xml_begin_multitable_group ();
+ xml_insert_element (THEAD, START);
+ }
+ else if (first_row)
+ {
+ xml_begin_multitable_group ();
+ xml_insert_element (TBODY, START);
+ }
+ else if (after_headitem)
+ {
+ xml_insert_element (THEAD, END);
+ xml_insert_element (TBODY, START);
+ }
+ else if (first_row)
+ xml_insert_element (TBODY, START);
+
+ xml_insert_element (ROW, START);
+ xml_insert_element (ENTRY, START);
+}
+
+void
+xml_end_multitable_column (void)
+{
+ xml_insert_element (ENTRY, END);
+ xml_insert_element (ENTRY, START);
+}
+
+void
+xml_end_multitable (void)
+{
+ xml_insert_element (ENTRY, END);
+ xml_insert_element (ROW, END);
+
+ if (after_headitem)
+ {
+ if (docbook)
+ warning (_("@headitem as the last item of @multitable produces invalid Docbook documents"));
+ xml_insert_element (THEAD, END);
+ }
+ else
+ xml_insert_element (TBODY, END);
+
+ if (docbook)
+ xml_insert_element (TGROUP, END);
+
+ xml_insert_element (MULTITABLE, END);
+ xml_no_para = 0;
+}
+
+/*
+ * Parameters in @def definitions
+ */
+
+#define DEFUN_SELF_DELIMITING(c) \
+ ((c) == '(' || (c) == ')' || (c) == '[' || (c) == ']')
+
+void
+xml_process_defun_args (char **defun_args, int auto_var_p)
+{
+ int pending_space = 0;
+ int just_after_paramtype = 0;
+
+ for (;;)
+ {
+ char *defun_arg = *defun_args++;
+
+ if (defun_arg == NULL)
+ break;
+
+ if (defun_arg[0] == ' ')
+ {
+ pending_space = 1;
+ continue;
+ }
+
+ if (pending_space)
+ {
+ add_char (' ');
+ pending_space = 0;
+ }
+
+ if (DEFUN_SELF_DELIMITING (defun_arg[0]))
+ {
+ xml_insert_element (DEFDELIMITER, START);
+ add_char (defun_arg[0]);
+ xml_insert_element (DEFDELIMITER, END);
+ just_after_paramtype = 0;
+ }
+ else if (defun_arg[0] == '&')
+ {
+ xml_insert_element (DEFPARAM, START);
+ add_word (defun_arg);
+ xml_insert_element (DEFPARAM, END);
+ just_after_paramtype = 0;
+ }
+ else if (defun_arg[0] == COMMAND_PREFIX || just_after_paramtype)
+ {
+ xml_insert_element (DEFPARAM, START);
+ execute_string ("%s", defun_arg);
+ xml_insert_element (DEFPARAM, END);
+ just_after_paramtype = 0;
+ }
+ else if (defun_arg[0] == ',' || defun_arg[0] == ';')
+ {
+ xml_insert_element (DEFDELIMITER, START);
+ add_word (defun_arg);
+ xml_insert_element (DEFDELIMITER, END);
+ just_after_paramtype = 0;
+ }
+ else if (auto_var_p)
+ {
+ xml_insert_element (DEFPARAM, START);
+ add_word (defun_arg);
+ xml_insert_element (DEFPARAM, END);
+ just_after_paramtype = 0;
+ }
+ else
+ {
+ xml_insert_element (DEFPARAMTYPE, START);
+ add_word (defun_arg);
+ xml_insert_element (DEFPARAMTYPE, END);
+ just_after_paramtype = 1;
+ }
+ }
+}
+
+void
+xml_begin_definition (void)
+{
+ xml_insert_element (DEFINITION, START);
+ xml_definition_level ++;
+ xml_in_def_item[xml_definition_level] = 0;
+}
+
+void
+xml_end_definition (void)
+{
+ if (xml_in_def_item[xml_definition_level])
+ {
+ xml_insert_element (DEFINITIONITEM, END);
+ xml_in_def_item[xml_definition_level] = 0;
+ }
+ xml_after_def_term = 0;
+ xml_insert_element (DEFINITION, END);
+ xml_definition_level --;
+}
+
+void
+xml_begin_def_term (int base_type, const char *category,
+ char *defined_name, char *type_name, char *type_name2)
+{
+ xml_after_def_term = 0;
+ xml_insert_element (DEFINITIONTERM, START);
+
+ /* Index entry */
+ switch (base_type)
+ {
+ case deffn:
+ case deftypefn:
+ execute_string ("@findex %s\n", defined_name);
+ break;
+ case defvr:
+ case deftypevr:
+ case defcv:
+ execute_string ("@vindex %s\n", defined_name);
+ break;
+ case deftypecv:
+ case deftypeivar:
+ execute_string ("@vindex %s %s %s\n", defined_name, _("of"), type_name);
+ break;
+ case deftypemethod:
+ case defop:
+ case deftypeop:
+ execute_string ("@findex %s %s %s\n", defined_name, _("on"), type_name);
+ break;
+ case deftp:
+ execute_string ("@tindex %s\n", defined_name);
+ break;
+ }
+
+ /* Start with category. */
+ xml_insert_element (DEFCATEGORY, START);
+ execute_string (docbook ? "--- %s:" : "%s", category);
+ xml_insert_element (DEFCATEGORY, END);
+ add_char(' ');
+
+ /* Output type name first for typed definitions. */
+ switch (base_type)
+ {
+ case deffn:
+ case defvr:
+ case deftp:
+ break;
+
+ case deftypefn:
+ case deftypevr:
+ xml_insert_element (DEFTYPE, START);
+ execute_string ("%s", type_name);
+ xml_insert_element (DEFTYPE, END);
+ add_char (' ');
+ break;
+
+ case deftypecv:
+ case deftypeivar:
+ case deftypemethod:
+ case deftypeop:
+ xml_insert_element (DEFTYPE, START);
+ execute_string ("%s", type_name2);
+ xml_insert_element (DEFTYPE, END);
+ add_char (' ');
+ break;
+
+ default:
+ xml_insert_element (DEFCLASS, START);
+ execute_string ("%s", type_name);
+ xml_insert_element (DEFCLASS, END);
+ add_char (' ');
+ break;
+ }
+
+ /* Categorize rest of the definitions. */
+ switch (base_type)
+ {
+ case deffn:
+ case deftypefn:
+ xml_insert_element (DEFFUNCTION, START);
+ execute_string ("%s", defined_name);
+ xml_insert_element (DEFFUNCTION, END);
+ break;
+
+ case defvr:
+ case deftypevr:
+ xml_insert_element (DEFVARIABLE, START);
+ execute_string ("%s", defined_name);
+ xml_insert_element (DEFVARIABLE, END);
+ break;
+
+ case deftp:
+ xml_insert_element (DEFDATATYPE, START);
+ execute_string ("%s", defined_name);
+ xml_insert_element (DEFDATATYPE, END);
+ break;
+
+ case defcv:
+ case deftypecv:
+ case deftypeivar:
+ xml_insert_element (DEFCLASSVAR, START);
+ execute_string ("%s", defined_name);
+ xml_insert_element (DEFCLASSVAR, END);
+ break;
+
+ case defop:
+ case deftypeop:
+ case deftypemethod:
+ /* Operation / Method */
+ xml_insert_element (DEFOPERATION, START);
+ execute_string ("%s", defined_name);
+ xml_insert_element (DEFOPERATION, END);
+ break;
+ }
+}
+
+void
+xml_end_def_term (void)
+{
+ xml_insert_element (DEFINITIONTERM, END);
+ xml_after_def_term = 1;
+}
diff --git a/Build/source/utils/texinfo/makeinfo/xml.h b/Build/source/utils/texinfo/makeinfo/xml.h
new file mode 100644
index 00000000000..f82b483e381
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/xml.h
@@ -0,0 +1,159 @@
+/* xml.h -- xml output declarations.
+ $Id: xml.h,v 1.24 2004/11/26 00:48:35 karl Exp $
+
+ Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Originally written by Philippe Martin <feloy@free.fr>. */
+
+#ifndef XML_H
+#define XML_H
+
+/* Options. */
+
+/* Separate index entries into divisions for each letters. */
+extern int xml_index_divisions;
+extern int xml_sort_index;
+
+extern int xml_no_indent;
+
+extern int xml_node_open;
+extern int xml_no_para;
+extern char *xml_node_id;
+extern int xml_last_section_output_position;
+
+extern int xml_in_xref_token;
+extern int xml_in_bookinfo;
+extern int xml_in_book_title;
+extern int xml_in_abstract;
+
+/* Non-zero if we are handling an element that can appear between
+ @item and @itemx, @deffn and @deffnx. */
+extern int xml_dont_touch_items_defs;
+
+/* Non-zero if whitespace in the source document should be kept as-is. */
+extern int xml_keep_space;
+
+enum xml_element
+{
+ TEXINFO=0, SETFILENAME, TITLEFONT, SETTITLE, DOCUMENTDESCRIPTION,
+ /* Node */
+ NODE, NODENEXT, NODEPREV, NODEUP,
+ /* Structuring */
+ CHAPTER, SECTION, SUBSECTION, SUBSUBSECTION,
+ TOP, UNNUMBERED, UNNUMBEREDSEC, UNNUMBEREDSUBSEC,
+ UNNUMBEREDSUBSUBSEC,
+ APPENDIX, APPENDIXSEC, APPENDIXSUBSEC, APPENDIXSUBSUBSEC,
+ MAJORHEADING, CHAPHEADING, HEADING, SUBHEADING, SUBSUBHEADING,
+ /* Titlepage */
+ TITLEPAGE, AUTHOR, BOOKTITLE, BOOKSUBTITLE,
+ /* Menu */
+ MENU, DETAILMENU, MENUENTRY, MENUTITLE, MENUCOMMENT, MENUNODE,
+ NODENAME,
+ /* -- */
+ ACRONYM, ACRONYMWORD, ACRONYMDESC,
+ ABBREV, ABBREVWORD, ABBREVDESC,
+ TT, CODE, COMMAND_TAG, ENV, FILE_TAG, OPTION, SAMP, KBD, URL, KEY,
+ VAR, SC, DFN, EMPH, STRONG, CITE, NOTFIXEDWIDTH, I, B, R, SLANTED, SANSSERIF,
+ EXDENT,
+ TITLE,
+ IFINFO,
+ SP, CENTER,
+ DIRCATEGORY,
+ QUOTATION, EXAMPLE, SMALLEXAMPLE, LISP, SMALLLISP, CARTOUCHE,
+ COPYING, FORMAT, SMALLFORMAT, DISPLAY, SMALLDISPLAY, VERBATIM,
+ FOOTNOTE, LINEANNOTATION,
+ TIP, NOTE, IMPORTANT, WARNING, CAUTION,
+ ITEMIZE, ITEMFUNCTION, ITEM, ENUMERATE, TABLE, TABLEITEM, TABLETERM,
+ INDEXTERM,
+ MATH, DIMENSION,
+ XREF, XREFNODENAME, XREFINFONAME, XREFPRINTEDDESC, XREFINFOFILE,
+ XREFPRINTEDNAME,
+ INFOREF, INFOREFNODENAME, INFOREFREFNAME, INFOREFINFONAME,
+ UREF, UREFURL, UREFDESC, UREFREPLACEMENT,
+ EMAIL, EMAILADDRESS, EMAILNAME,
+ GROUP, FLOAT, FLOATTYPE, FLOATPOS, CAPTION, SHORTCAPTION,
+ FLOATTABLE, FLOATFIGURE, FLOATEXAMPLE, FLOATCARTOUCHE,
+ PRINTINDEX, LISTOFFLOATS,
+ ANCHOR,
+ IMAGE, INLINEIMAGE, IMAGEALTTEXT,
+ PRIMARY, SECONDARY, INFORMALFIGURE, MEDIAOBJECT, IMAGEOBJECT,
+ IMAGEDATA, TEXTOBJECT,
+ INDEXENTRY, PRIMARYIE, SECONDARYIE, INDEXDIV,
+ MULTITABLE, TGROUP, COLSPEC, THEAD, TBODY, ENTRY, ROW,
+ BOOKINFO, ABSTRACT, REPLACEABLE, ENVAR, COMMENT, FUNCTION, LEGALNOTICE,
+ CONTENTS, SHORTCONTENTS, DOCUMENTLANGUAGE,
+ SETVALUE, CLEARVALUE,
+ DEFINITION, DEFINITIONTERM, DEFINITIONITEM,
+ DEFCATEGORY, DEFFUNCTION, DEFVARIABLE, DEFPARAM, DEFDELIMITER, DEFTYPE,
+ DEFPARAMTYPE, DEFDATATYPE, DEFCLASS, DEFCLASSVAR, DEFOPERATION,
+ PARA
+};
+
+extern void xml_add_char (int character),
+ xml_asterisk (void),
+ xml_insert_element (int elt, int arg),
+ xml_insert_entity (char *entity_name),
+ xml_insert_footnote (char *note),
+ xml_insert_quotation (char *type, int arg),
+ xml_insert_indexentry (char *entry, char *node),
+ xml_insert_indexterm (char *indexterm, char *index),
+ xml_insert_docbook_image (char *name_arg),
+ xml_synindex (char *from, char *to),
+ xml_start_para (void),
+ xml_end_para (void),
+ xml_begin_document (char *output_filename),
+ xml_end_document (void),
+ xml_start_menu_entry (char *tem),
+ xml_end_menu (void),
+ xml_end_current_element (void),
+ xml_open_section (int level, char *name),
+ xml_close_sections (int level),
+ xml_begin_node (void),
+ xml_begin_index (void),
+ xml_end_index (void),
+ xml_begin_multitable (int ncolumns, int *column_widths),
+ xml_end_multitable (void),
+ xml_end_multitable_row (int first_row),
+ xml_end_multitable_column (void),
+ xml_begin_table (int type, char *item_function),
+ xml_end_table (int type),
+ xml_begin_item (void),
+ xml_begin_table_item (void),
+ xml_continue_table_item (void),
+ xml_begin_enumerate (char *enum_arg),
+ xml_end_enumerate (void),
+ xml_begin_docbook_float (int elt);
+
+extern char *xml_id (char *id);
+
+extern void xml_begin_definition (void),
+ xml_end_definition (void),
+ xml_process_defun_args (char **defun_args, int auto_var_p),
+ xml_begin_def_term (int base_type, const char *category,
+ char *defined_name, char *type_name, char *type_name2),
+ xml_end_def_term (void);
+
+extern int xml_current_stack_index (void),
+ xml_element (char *name);
+
+#if defined (VA_FPRINTF) && __STDC__
+void xml_insert_element_with_attribute (int elt, int arg, char *format, ...);
+#else
+void xml_insert_element_with_attribute ();
+#endif
+
+#endif /* XML_H */
diff --git a/Build/source/utils/texinfo/makeinfo/xref.c b/Build/source/utils/texinfo/makeinfo/xref.c
new file mode 100644
index 00000000000..314d4a0fb64
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/xref.c
@@ -0,0 +1,620 @@
+/* xref.c -- cross references for Texinfo.
+ $Id: xref.c,v 1.4 2004/12/21 17:28:35 karl Exp $
+
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "system.h"
+#include "cmds.h"
+#include "float.h"
+#include "html.h"
+#include "index.h"
+#include "macro.h"
+#include "makeinfo.h"
+#include "node.h"
+#include "xml.h"
+#include "xref.h"
+
+/* Flags which control initial output string for xrefs. */
+int px_ref_flag = 0;
+int ref_flag = 0;
+
+/* Called in the multiple-argument case to make sure we generate a valid
+ Info reference. In the single-argument case, the :: we output
+ suffices for the Info readers to find the end of the reference. */
+static void
+add_xref_punctuation (void)
+{
+ if (px_ref_flag || ref_flag) /* user inserts punct after @xref */
+ {
+ /* Check if there's already punctuation. */
+ int next_char = next_nonwhitespace_character ();
+
+ if (next_char == -1)
+ /* EOF while looking for punctuation, let's
+ insert a period instead of crying. */
+ add_char ('.');
+ else if (next_char != ',' && next_char != '.')
+ /* period and comma terminate xrefs, and nothing else. Instead
+ of generating an Info reference that can't be followed,
+ though, just insert a period. Not pretty, but functional. */
+ add_char ('.');
+ }
+}
+
+/* Return next comma-delimited argument, but do not cross a close-brace
+ boundary. Clean up whitespace, too. If EXPAND is nonzero, replace
+ the entire brace-delimited argument list with its expansion before
+ looking for the next comma. */
+char *
+get_xref_token (int expand)
+{
+ char *string = 0;
+
+ if (docbook)
+ xml_in_xref_token = 1;
+
+ if (expand)
+ {
+ int old_offset = input_text_offset;
+ int old_lineno = line_number;
+
+ get_until_in_braces ("}", &string);
+ if (curchar () == '}') /* as opposed to end of text */
+ input_text_offset++;
+ if (input_text_offset > old_offset)
+ {
+ int limit = input_text_offset;
+
+ input_text_offset = old_offset;
+ line_number = old_lineno;
+ only_macro_expansion++;
+ replace_with_expansion (input_text_offset, &limit);
+ only_macro_expansion--;
+ }
+ free (string);
+ }
+
+ get_until_in_braces (",", &string);
+ if (curchar () == ',')
+ input_text_offset++;
+ fix_whitespace (string);
+
+ if (docbook)
+ xml_in_xref_token = 0;
+
+ return string;
+}
+
+
+/* NOTE: If you wonder why the HTML output is produced with such a
+ peculiar mix of calls to add_word and execute_string, here's the
+ reason. get_xref_token (1) expands all macros in a reference, but
+ any other commands, like @value, @@, etc., are left intact. To
+ expand them, we need to run the arguments through execute_string.
+ However, characters like <, &, > and others cannot be let into
+ execute_string, because they will be escaped. See the mess? */
+
+/* Make a cross reference. */
+void
+cm_xref (int arg)
+{
+ if (arg == START)
+ {
+ char *arg1 = get_xref_token (1); /* expands all macros in xref */
+ char *arg2 = get_xref_token (0);
+ char *arg3 = get_xref_token (0);
+ char *arg4 = get_xref_token (0);
+ char *arg5 = get_xref_token (0);
+ char *tem;
+
+ /* "@xref{,Foo,, Bar, Baz} is not valid usage of @xref. The
+ first argument must never be blank." --rms.
+ We hereby comply by disallowing such constructs. */
+ if (!*arg1)
+ line_error (_("First argument to cross-reference may not be empty"));
+
+ if (docbook)
+ {
+ if (!ref_flag)
+ add_word (px_ref_flag || printing_index
+ ? (char *) _("see ") : (char *) _("See "));
+
+ if (!*arg4 && !*arg5)
+ {
+ char *arg1_id = xml_id (arg1);
+
+ if (*arg2 || *arg3)
+ {
+ xml_insert_element_with_attribute (XREFNODENAME, START,
+ "linkend=\"%s\"", arg1_id);
+ free (arg1_id);
+ execute_string ("%s", *arg3 ? arg3 : arg2);
+ xml_insert_element (XREFNODENAME, END);
+ }
+ else
+ {
+ xml_insert_element_with_attribute (XREF, START,
+ "linkend=\"%s\"", arg1_id);
+ xml_insert_element (XREF, END);
+ free (arg1_id);
+ }
+ }
+ else if (*arg5)
+ {
+ add_word_args (_("See section ``%s'' in "), *arg3 ? arg3 : arg1);
+ xml_insert_element (CITE, START);
+ add_word (arg5);
+ xml_insert_element (CITE, END);
+ }
+ else if (*arg4)
+ {
+ /* Very sad, we are losing xrefs made to ``info only'' books. */
+ }
+ }
+ else if (xml)
+ {
+ if (!ref_flag)
+ add_word_args ("%s", px_ref_flag ? _("see ") : _("See "));
+
+ xml_insert_element (XREF, START);
+ xml_insert_element (XREFNODENAME, START);
+ execute_string ("%s", arg1);
+ xml_insert_element (XREFNODENAME, END);
+ if (*arg2)
+ {
+ xml_insert_element (XREFINFONAME, START);
+ execute_string ("%s", arg2);
+ xml_insert_element (XREFINFONAME, END);
+ }
+ if (*arg3)
+ {
+ xml_insert_element (XREFPRINTEDDESC, START);
+ execute_string ("%s", arg3);
+ xml_insert_element (XREFPRINTEDDESC, END);
+ }
+ if (*arg4)
+ {
+ xml_insert_element (XREFINFOFILE, START);
+ execute_string ("%s", arg4);
+ xml_insert_element (XREFINFOFILE, END);
+ }
+ if (*arg5)
+ {
+ xml_insert_element (XREFPRINTEDNAME, START);
+ execute_string ("%s", arg5);
+ xml_insert_element (XREFPRINTEDNAME, END);
+ }
+ xml_insert_element (XREF, END);
+ }
+ else if (html)
+ {
+ if (!ref_flag)
+ add_word_args ("%s", px_ref_flag ? _("see ") : _("See "));
+ }
+ else
+ add_word_args ("%s", px_ref_flag ? "*note " : "*Note ");
+
+ if (!xml)
+ {
+ if (*arg5 || *arg4)
+ {
+ /* arg1 - node name
+ arg2 - reference name
+ arg3 - title or topic (and reference name if arg2 is NULL)
+ arg4 - info file name
+ arg5 - printed manual title */
+ char *ref_name;
+
+ if (!*arg2)
+ {
+ if (*arg3)
+ ref_name = arg3;
+ else
+ ref_name = arg1;
+ }
+ else
+ ref_name = arg2;
+
+ if (html)
+ { /* More to do eventually, down to Unicode
+ Normalization Form C. See the HTML Xref nodes in
+ the manual. */
+ char *file_arg = arg4;
+ add_html_elt ("<a href=");
+
+ {
+ /* If there's a directory part, ignore it. */
+ char *p = strrchr (file_arg, '/');
+ if (p)
+ file_arg = p + 1;
+
+ /* If there's a dot, make it a NULL terminator, so the
+ extension does not get into the way. */
+ p = strrchr (file_arg , '.');
+ if (p != NULL)
+ *p = 0;
+ }
+
+ if (! *file_arg)
+ warning (_("Empty file name for HTML cross reference in `%s'"),
+ arg4);
+
+ /* Note that if we are splitting, and the referenced
+ tag is an anchor rather than a node, we will
+ produce a reference to a file whose name is
+ derived from the anchor name. However, only
+ nodes create files, so we are referencing a
+ non-existent file. cm_anchor, which see, deals
+ with that problem. */
+ if (splitting)
+ execute_string ("\"../%s/", file_arg);
+ else
+ execute_string ("\"%s.html", file_arg);
+ /* Do not collapse -- to -, etc., in references. */
+ in_fixed_width_font++;
+ tem = expansion (arg1, 0); /* expand @-commands in node */
+ in_fixed_width_font--;
+ add_anchor_name (tem, 1);
+ free (tem);
+ add_word ("\">");
+ execute_string ("%s",ref_name);
+ add_word ("</a>");
+ }
+ else
+ {
+ execute_string ("%s:", ref_name);
+ in_fixed_width_font++;
+ execute_string (" (%s)%s", arg4, arg1);
+ add_xref_punctuation ();
+ in_fixed_width_font--;
+ }
+
+ /* Free all of the arguments found. */
+ if (arg1) free (arg1);
+ if (arg2) free (arg2);
+ if (arg3) free (arg3);
+ if (arg4) free (arg4);
+ if (arg5) free (arg5);
+ return;
+ }
+ else
+ remember_node_reference (arg1, line_number, followed_reference);
+
+ if (*arg3)
+ {
+ if (html)
+ {
+ add_html_elt ("<a href=\"");
+ in_fixed_width_font++;
+ tem = expansion (arg1, 0);
+ in_fixed_width_font--;
+ add_anchor_name (tem, 1);
+ free (tem);
+ add_word ("\">");
+ execute_string ("%s", *arg2 ? arg2 : arg3);
+ add_word ("</a>");
+ }
+ else
+ {
+ execute_string ("%s:", *arg2 ? arg2 : arg3);
+ in_fixed_width_font++;
+ execute_string (" %s", arg1);
+ add_xref_punctuation ();
+ in_fixed_width_font--;
+ }
+ }
+ else
+ {
+ if (html)
+ {
+ add_html_elt ("<a href=\"");
+ in_fixed_width_font++;
+ tem = expansion (arg1, 0);
+ in_fixed_width_font--;
+ add_anchor_name (tem, 1);
+ free (tem);
+ add_word ("\">");
+ if (*arg2)
+ execute_string ("%s", arg2);
+ else
+ {
+ char *fref = get_float_ref (arg1);
+ execute_string ("%s", fref ? fref : arg1);
+ free (fref);
+ }
+ add_word ("</a>");
+ }
+ else
+ {
+ if (*arg2)
+ {
+ execute_string ("%s:", arg2);
+ in_fixed_width_font++;
+ execute_string (" %s", arg1);
+ add_xref_punctuation ();
+ in_fixed_width_font--;
+ }
+ else
+ {
+ char *fref = get_float_ref (arg1);
+ if (fref)
+ { /* Reference is being made to a float. */
+ execute_string ("%s:", fref);
+ in_fixed_width_font++;
+ execute_string (" %s", arg1);
+ add_xref_punctuation ();
+ in_fixed_width_font--;
+ }
+ else
+ {
+ in_fixed_width_font++;
+ execute_string ("%s::", arg1);
+ in_fixed_width_font--;
+ }
+ }
+ }
+ }
+ }
+ /* Free all of the arguments found. */
+ if (arg1) free (arg1);
+ if (arg2) free (arg2);
+ if (arg3) free (arg3);
+ if (arg4) free (arg4);
+ if (arg5) free (arg5);
+ }
+ else
+ { /* Check that the next non-whitespace character is valid to follow
+ an xref (so Info readers can find the node names).
+ `input_text_offset' is pointing at the "}" which ended the xref
+ command. This is not used for @pxref or @ref, since we insert
+ the necessary punctuation above, if needed. */
+ int temp = next_nonwhitespace_character ();
+
+ if (temp == -1)
+ warning (_("End of file reached while looking for `.' or `,'"));
+ else if (temp != '.' && temp != ',')
+ warning (_("`.' or `,' must follow @%s, not `%c'"), command, temp);
+ }
+}
+
+void
+cm_pxref (int arg)
+{
+ if (arg == START)
+ {
+ px_ref_flag++;
+ cm_xref (arg);
+ px_ref_flag--;
+ }
+ /* cm_xref isn't called with arg == END, which disables the code near
+ the end of cm_xref that checks for `.' or `,' after the
+ cross-reference. This is because cm_xref generates the required
+ character itself (when needed) if px_ref_flag is set. */
+}
+
+void
+cm_ref (int arg)
+{
+ /* See the comments in cm_pxref about the checks for punctuation. */
+ if (arg == START)
+ {
+ ref_flag++;
+ cm_xref (arg);
+ ref_flag--;
+ }
+}
+
+void
+cm_inforef (int arg)
+{
+ if (arg == START)
+ {
+ char *node = get_xref_token (1); /* expands all macros in inforef */
+ char *pname = get_xref_token (0);
+ char *file = get_xref_token (0);
+
+ /* (see comments at cm_xref). */
+ if (!*node)
+ line_error (_("First argument to @inforef may not be empty"));
+
+ if (xml && !docbook)
+ {
+ xml_insert_element (INFOREF, START);
+ xml_insert_element (INFOREFNODENAME, START);
+ execute_string ("%s", node);
+ xml_insert_element (INFOREFNODENAME, END);
+ if (*pname)
+ {
+ xml_insert_element (INFOREFREFNAME, START);
+ execute_string ("%s", pname);
+ xml_insert_element (INFOREFREFNAME, END);
+ }
+ xml_insert_element (INFOREFINFONAME, START);
+ execute_string ("%s", file);
+ xml_insert_element (INFOREFINFONAME, END);
+
+ xml_insert_element (INFOREF, END);
+ }
+ else if (html)
+ {
+ char *tem;
+
+ add_word ((char *) _("see "));
+ /* html fixxme: revisit this */
+ add_html_elt ("<a href=");
+ if (splitting)
+ execute_string ("\"../%s/", file);
+ else
+ execute_string ("\"%s.html", file);
+ tem = expansion (node, 0);
+ add_anchor_name (tem, 1);
+ add_word ("\">");
+ execute_string ("%s", *pname ? pname : tem);
+ add_word ("</a>");
+ free (tem);
+ }
+ else
+ {
+ if (*pname)
+ execute_string ("*note %s: (%s)%s", pname, file, node);
+ else
+ execute_string ("*note (%s)%s::", file, node);
+ }
+
+ free (node);
+ free (pname);
+ free (file);
+ }
+}
+
+/* A URL reference. */
+void
+cm_uref (int arg)
+{
+ if (arg == START)
+ {
+ extern int printing_index;
+ char *url = get_xref_token (1); /* expands all macros in uref */
+ char *desc = get_xref_token (0);
+ char *replacement = get_xref_token (0);
+
+ if (docbook)
+ {
+ xml_insert_element_with_attribute (UREF, START, "url=\"%s\"",
+ text_expansion (url));
+ if (*replacement)
+ execute_string ("%s", replacement);
+ else if (*desc)
+ execute_string ("%s", desc);
+ else
+ execute_string ("%s", url);
+ xml_insert_element (UREF, END);
+ }
+ else if (xml)
+ {
+ xml_insert_element (UREF, START);
+ xml_insert_element (UREFURL, START);
+ execute_string ("%s", url);
+ xml_insert_element (UREFURL, END);
+ if (*desc)
+ {
+ xml_insert_element (UREFDESC, START);
+ execute_string ("%s", desc);
+ xml_insert_element (UREFDESC, END);
+ }
+ if (*replacement)
+ {
+ xml_insert_element (UREFREPLACEMENT, START);
+ execute_string ("%s", replacement);
+ xml_insert_element (UREFREPLACEMENT, END);
+ }
+ xml_insert_element (UREF, END);
+ }
+ else if (html)
+ { /* never need to show the url */
+ add_html_elt ("<a href=");
+ /* don't collapse `--' etc. in the url */
+ in_fixed_width_font++;
+ execute_string ("\"%s\"", url);
+ in_fixed_width_font--;
+ add_word (">");
+ execute_string ("%s", *replacement ? replacement
+ : (*desc ? desc : url));
+ add_word ("</a>");
+ }
+ else if (*replacement) /* do not show the url */
+ execute_string ("%s", replacement);
+ else if (*desc) /* show both text and url */
+ {
+ execute_string ("%s ", desc);
+ in_fixed_width_font++;
+ execute_string ("(%s)", url);
+ in_fixed_width_font--;
+ }
+ else /* no text at all, so have the url to show */
+ {
+ in_fixed_width_font++;
+ execute_string ("%s%s%s",
+ printing_index ? "" : "`",
+ url,
+ printing_index ? "" : "'");
+ in_fixed_width_font--;
+ }
+ if (url)
+ free (url);
+ if (desc)
+ free (desc);
+ if (replacement)
+ free (replacement);
+ }
+}
+
+/* An email reference. */
+void
+cm_email (int arg)
+{
+ if (arg == START)
+ {
+ char *addr = get_xref_token (1); /* expands all macros in email */
+ char *name = get_xref_token (0);
+
+ if (xml && docbook)
+ {
+ xml_insert_element_with_attribute (EMAIL, START, "url=\"mailto:%s\"", addr);
+ if (*name)
+ execute_string ("%s", name);
+ xml_insert_element (EMAIL, END);
+ }
+ else if (xml)
+ {
+ xml_insert_element (EMAIL, START);
+ xml_insert_element (EMAILADDRESS, START);
+ execute_string ("%s", addr);
+ xml_insert_element (EMAILADDRESS, END);
+ if (*name)
+ {
+ xml_insert_element (EMAILNAME, START);
+ execute_string ("%s", name);
+ xml_insert_element (EMAILNAME, END);
+ }
+ xml_insert_element (EMAIL, END);
+ }
+ else if (html)
+ {
+ add_html_elt ("<a href=");
+ /* don't collapse `--' etc. in the address */
+ in_fixed_width_font++;
+ execute_string ("\"mailto:%s\"", addr);
+ in_fixed_width_font--;
+ add_word (">");
+ execute_string ("%s", *name ? name : addr);
+ add_word ("</a>");
+ }
+ else
+ {
+ execute_string ("%s%s", name, *name ? " " : "");
+ in_fixed_width_font++;
+ execute_string ("<%s>", addr);
+ in_fixed_width_font--;
+ }
+
+ if (addr)
+ free (addr);
+ if (name)
+ free (name);
+ }
+}
diff --git a/Build/source/utils/texinfo/makeinfo/xref.h b/Build/source/utils/texinfo/makeinfo/xref.h
new file mode 100644
index 00000000000..8f2711b63af
--- /dev/null
+++ b/Build/source/utils/texinfo/makeinfo/xref.h
@@ -0,0 +1,30 @@
+/* xref.h -- declarations for the cross references.
+ $Id: xref.h,v 1.1 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef XREF_H
+#define XREF_H
+
+enum reftype
+{
+ menu_reference, followed_reference
+};
+
+extern char *get_xref_token (int expand);
+
+#endif /* not XREF_H */
diff --git a/Build/source/utils/texinfo/missing b/Build/source/utils/texinfo/missing
new file mode 100755
index 00000000000..64b5f901dd5
--- /dev/null
+++ b/Build/source/utils/texinfo/missing
@@ -0,0 +1,353 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2004-09-07.08
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit 0
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit 0
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/texinfo/mkinstalldirs b/Build/source/utils/texinfo/mkinstalldirs
new file mode 100755
index 00000000000..6fbe5e11762
--- /dev/null
+++ b/Build/source/utils/texinfo/mkinstalldirs
@@ -0,0 +1,150 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2004-02-15.20
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit 0
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit 0
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/utils/texinfo/po/ChangeLog b/Build/source/utils/texinfo/po/ChangeLog
new file mode 100644
index 00000000000..b965d4e334d
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ChangeLog
@@ -0,0 +1,14 @@
+2004-02-05 gettextize <bug-gnu-gettext@gnu.org>
+
+ * Makefile.in.in: Upgrade to gettext-0.14.1.
+ * ORIG: New file, from gettext-0.14.1.
+ * Rules-quot: Upgrade to gettext-0.14.1.
+
+2003-12-20 gettextize <bug-gnu-gettext@gnu.org>
+
+ * ORIG: New file, from gettext-0.13.1.
+
+2003-12-13 gettextize <bug-gnu-gettext@gnu.org>
+
+ * ORIG: New file, from gettext-0.13.
+
diff --git a/Build/source/utils/texinfo/po/LINGUAS b/Build/source/utils/texinfo/po/LINGUAS
new file mode 100644
index 00000000000..295325dee2e
--- /dev/null
+++ b/Build/source/utils/texinfo/po/LINGUAS
@@ -0,0 +1,19 @@
+cs
+da
+de
+de_AT
+eo
+fr
+he
+hr
+ja
+nl
+nb
+no
+pl
+ro
+ru
+sv
+tr
+zh_CN
+zh_TW
diff --git a/Build/source/utils/texinfo/po/Makefile.in.in b/Build/source/utils/texinfo/po/Makefile.in.in
new file mode 100644
index 00000000000..53efc5e16e6
--- /dev/null
+++ b/Build/source/utils/texinfo/po/Makefile.in.in
@@ -0,0 +1,366 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+#
+# Origin: gettext-0.14
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
+
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+ @echo "$(MSGFMT) -c -o $@ $<"; \
+ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+ @lang=`echo $* | sed -e 's,.*/,,'`; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
+ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+ sed -e '/^#/d' $< > t-$@
+ mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+ @echo "touch stamp-po"
+ @echo timestamp > stamp-poT
+ @mv stamp-poT stamp-po
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)'
+ test ! -f $(DOMAIN).po || { \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+ else \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ else \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+ $(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(srcdir)/$(DOMAIN).pot
+ @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+ if test -f "$(srcdir)/$${lang}.po"; then \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+ else \
+ $(MAKE) $${lang}.po-create; \
+ fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ for file in Makevars; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+install-data-no: all
+install-data-yes: all
+ $(mkinstalldirs) $(DESTDIR)$(datadir)
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkinstalldirs) $(DESTDIR)$$dir; \
+ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+ fi; \
+ done; \
+ done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ : ; \
+ fi
+installdirs-data-no:
+installdirs-data-yes:
+ $(mkinstalldirs) $(DESTDIR)$(datadir)
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkinstalldirs) $(DESTDIR)$$dir; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ fi; \
+ done; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+uninstall-data-no:
+uninstall-data-yes:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ done; \
+ done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+ rm -f remove-potcdate.sed
+ rm -f stamp-poT
+ rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+ $(MAKE) update-po
+ @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ dists="$$dists Makevars.template"; \
+ fi; \
+ if test -f $(srcdir)/ChangeLog; then \
+ dists="$$dists ChangeLog"; \
+ fi; \
+ for i in 0 1 2 3 4 5 6 7 8 9; do \
+ if test -f $(srcdir)/ChangeLog.$$i; then \
+ dists="$$dists ChangeLog.$$i"; \
+ fi; \
+ done; \
+ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+ for file in $$dists; do \
+ if test -f $$file; then \
+ cp -p $$file $(distdir); \
+ else \
+ cp -p $(srcdir)/$$file $(distdir); \
+ fi; \
+ done
+
+update-po: Makefile
+ $(MAKE) $(DOMAIN).pot-update
+ test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+ $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+ @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+ exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+ @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ cd $(srcdir); \
+ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+ @:
+
+Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/po/Makevars b/Build/source/utils/texinfo/po/Makevars
new file mode 100644
index 00000000000..cf1c228c12f
--- /dev/null
+++ b/Build/source/utils/texinfo/po/Makevars
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
+# package. (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.) Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright. The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+# in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+# understood.
+# - Strings which make invalid assumptions about notation of date, time or
+# money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-texinfo@gnu.org
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used. It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/Build/source/utils/texinfo/po/POTFILES.in b/Build/source/utils/texinfo/po/POTFILES.in
new file mode 100644
index 00000000000..e19e34e7f71
--- /dev/null
+++ b/Build/source/utils/texinfo/po/POTFILES.in
@@ -0,0 +1,47 @@
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# List of source files containing translatable strings.
+# The last line must not be a comment.
+
+info/echo-area.c
+info/footnotes.c
+info/footnotes.h
+info/indices.c
+info/info.c
+info/info.h
+info/infodoc.c
+info/infokey.c
+info/infomap.c
+info/m-x.c
+info/makedoc.c
+info/nodemenu.c
+info/pcterm.c
+info/session.c
+info/tilde.c
+info/variables.c
+info/window.c
+lib/getopt.c
+lib/system.h
+makeinfo/cmds.c
+makeinfo/defun.c
+makeinfo/files.c
+makeinfo/footnote.c
+makeinfo/html.c
+makeinfo/index.c
+makeinfo/insertion.c
+makeinfo/lang.c
+makeinfo/macro.c
+makeinfo/makeinfo.c
+makeinfo/multi.c
+makeinfo/node.c
+makeinfo/sectioning.c
+makeinfo/toc.c
+makeinfo/xml.c
+util/install-info.c
+util/texindex.c
diff --git a/Build/source/utils/texinfo/po/Rules-quot b/Build/source/utils/texinfo/po/Rules-quot
new file mode 100644
index 00000000000..9c2a995e300
--- /dev/null
+++ b/Build/source/utils/texinfo/po/Rules-quot
@@ -0,0 +1,47 @@
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+ $(MAKE) en@quot.po-update
+en@boldquot.po-create:
+ $(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+ @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ ll=`echo $$lang | sed -e 's/@.*//'`; \
+ LC_ALL=C; export LC_ALL; \
+ cd $(srcdir); \
+ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "creation of $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+en@quot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+ rm -f *.insert-header
diff --git a/Build/source/utils/texinfo/po/boldquot.sed b/Build/source/utils/texinfo/po/boldquot.sed
new file mode 100644
index 00000000000..4b937aa517b
--- /dev/null
+++ b/Build/source/utils/texinfo/po/boldquot.sed
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“/g
+s/”/”/g
+s/‘/‘/g
+s/’/’/g
diff --git a/Build/source/utils/texinfo/po/cs.gmo b/Build/source/utils/texinfo/po/cs.gmo
new file mode 100644
index 00000000000..03297906b1c
--- /dev/null
+++ b/Build/source/utils/texinfo/po/cs.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/cs.po b/Build/source/utils/texinfo/po/cs.po
new file mode 100644
index 00000000000..14c7d5ef5b3
--- /dev/null
+++ b/Build/source/utils/texinfo/po/cs.po
@@ -0,0 +1,3206 @@
+# Czech translations for GNU texinfo
+# Copyright (C) 1997 Free Software Foundation, Inc.
+# Vladimir Michl <Vladimir.Michl@seznam.cz>, 1997.
+#
+# Note: 2 messages untranslated, it's ok.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.0\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2000-10-31 15:17+01:00\n"
+"Last-Translator: Vladimir Michl <Vladimir.Michl@seznam.cz>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Posun na následující znak"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Posun na předcházející znak"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Přesun na začátek tohoto řádku"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Přesun na konec tohoto řádku"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Posun na následující slovo"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Posun na předcházející slovo"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Smazání znaku pod kurzorem"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Smazání prvního znaku vlevo od kurzoru"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Zrušení nebo přerušení operace"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Akceptování (nebo vnucené dokončení) tohoto řádku"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Vložení dalšího znaku bez interpretace jeho funkce"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Vložení tohoto znaku"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Vložení tabelátoru"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Přemístění znaku na pozici"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Vložení toho co bylo naposled smazáno"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Kruhový buffer smazaných oblastí je prázdný"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Vložení naposledy smazaného úseku"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Smazání všeho od kurzoru až do konce řádku"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Smazání všeho od začátku řádku do kurzoru"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Smazání slova, od kurzoru do konce slova"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Smazání slova, od začátku slova do kurzoru"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Doplnění neexistují"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Nekompletní"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Seznam možných doplnění"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Jedinné doplnění"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Jedno doplnění:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d doplnění:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Vložení doplnění"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Hledám doplnění..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Odrolování obsahu okna s doplněními"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Poznámky pod čarou nelze zobrazit"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr ""
+"Zobrazení poznámek pod čarou, vztahujících se k tomuto uzlu, v jiném okně"
+
+#: info/footnotes.h:26
+#, fuzzy
+msgid "---------- Footnotes ----------"
+msgstr "---------------------\n"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Vyhledání řetězce v rejstříku tohoto souboru"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Jsou hledány položky rejstříku..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Žádný rejstřík nebyl nalezen."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Položka rejstříku: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Posun na další položku rejstříku, odpovídající řetězci z minulého příkazu `"
+"\\[index-search]'"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Není zadán řetězec, který se má vyhledávat v rejstříku(cích)."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Nejsou položky rejstříku."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Již není %spoložka rejstříku, která obsahuje \"%s\"."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "další "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "TOTO NELZE VIDĚT"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "Nalezeno \"%s\" v %s. (`\\[next-index-match]' - hledání další.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Prohledávám tyto rejstříky \"%s\"..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr ""
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Vyhledání řetězce ve všech známých rejstřících info souborů a vytvoření menu"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Hledat v rejstříku odkaz na:"
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Uzly jejichž rejstříky obsahují \"%s\":\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Více informací můžete získat pomocí přepínače --help.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+" Copyright (C) %s 1996 Free Software Foundation, Inc.\n"
+" Toto je volné programové vybavení, které je zcela BEZ ZÁRUKY. Podmínky "
+"pro\n"
+"kopírování a rozšiřování naleznete v Obecné veřejné licenci GNU (GNU "
+"General\n"
+"Public Licence). Více informací získáte ve zdrojových textech v souboru\n"
+"COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "odpovídající položky rejstříku nebyly pro `%s' nalezeny\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Použití: %s [PŘEPÍNAČ]... [POLOŽKA-MENU...]\n"
+"\n"
+" Umožňuje číst dokumentaci v Info formátu.\n"
+"\n"
+"Přepínače:\n"
+"--apropos=SUBJEKT hledá SUBJEKT ve všech odkazech všech manuálů\n"
+"--directory=ADRESÁŘ kromě proměnné INFOPATH prohledává i tento\n"
+" ADRESÁŘ\n"
+"--dribble=SOUBOR uloží klávesy, které stiskl uživatel do SOUBORu\n"
+"--file=SOUBOR zadání info souboru, který se má prohlížet\n"
+"--help vypíše tuto nápovědu a skončí\n"
+"--index-search=ŘETĚZEC skok na uzel určený v rejstříku ŘETĚZCEM\n"
+"--node=JMÉNO_UZLU zadání uzlů, v prvním navštíveném info souboru\n"
+"--output=SOUBOR vypíše navštívené uzly do SOUBORu\n"
+"--restore=SOUBOR klávesy, které mají být automaticky po\n"
+" spuštení infa stisknuty, čte ze SOUBORu\n"
+"--show-options, --usage zobrazuje přepínače příkazové řádky\n"
+"--subnodes rekurzivně vypíše položky menu\n"
+"%s --vi=keys použije ovládání klávesami jako ve vi a less\n"
+"--version vypíše označení verze a skončí\n"
+"\n"
+" První nepřepínačový argument, jestliže je zadán, je položka menu, která\n"
+"má být po spuštění navštívena; tato položka je vyhledávána ve všech `dir'\n"
+"souborech podle INFOPATH.\n"
+" Jestliže tato položka není zadána, info spojí všechny `dir' soubory a "
+"ukáže\n"
+"výsledek. Všechny zbývající argumenty jsou brány jako názvy položek menu,\n"
+"relativně k prvnímu navštívenému uzlu.\n"
+"\n"
+"Příklady:\n"
+" info zobrazí seznam dokumentace\n"
+" info emacs zobrazí uzel emacs ze seznamu dokumentace\n"
+" info emacs buffers zobrazí uzel buffers z emacsového manuálu\n"
+" info --show-options emacs zobrazí uzel s přepínači příkazového řádku\n"
+" pro emacs\n"
+" info -f ./foo.info zobrazí soubor ./foo.info, nehledá v `dir' "
+"soub.\n"
+"\n"
+" Chyby v programu oznamujte na adrese <bug-texinfo@gnu.org> (pouze "
+"anglicky),\n"
+"obecné otázky směřujte na <help-texinfo@gnu.org>. Připomínky k překladu\n"
+"zasílejte na adresu <cs@li.org> (česky).\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+#, fuzzy
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+" Chyby v programu oznamujte na adrese <bug-texinfo@gnu.org> (pouze "
+"anglicky),\n"
+"obecné otázky směřujte na <help-texinfo@gnu.org>. Připomínky k překladu\n"
+"zasílejte na <cs@li.org> (česky).\n"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Uzel `%s' nelze nalézt."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Uzel `(%s)%s' nelze nalézt."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Nelze nalézt okno!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Bod se nevyskutuje v okně tohoto uzlu!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Poslední okno nelze smazat."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "V tomto uzlu není menu."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "V tomto nejsou poznámky pod čarou."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "V tomto uzlu není křížový odkaz."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Pro tento uzel není `%s' ukazatel."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Neznámý Info příkaz `%c'; zkuste `?' pro nápovědu."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Typ terminálu `%s' není dostatečně inteligentní pro provoz Infa."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Již jste na poslední stránce tohoto uzlu."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Již jste na první stránce tohoto uzlu."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Pouze jedno okno."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Výsledné okno by bylo příliš malé."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Není volné místo pro okno nápovědy, prosím smažte některé okno."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+#, fuzzy
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr "Základní příkazy v Info oknech\n"
+
+#: info/infodoc.c:49
+#, fuzzy
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr " %-10s Ukončení prohlížení nápovědy.\n"
+
+#: info/infodoc.c:50
+#, fuzzy
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr " %-10s Celkové ukončení Infa.\n"
+
+#: info/infodoc.c:51
+#, fuzzy
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr " %-10s Vyvolání průvodce Infem.\n"
+
+# Udělat patch na podtržení
+#: info/infodoc.c:53 info/infodoc.c:102
+#, fuzzy
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr "Výběr dalších uzlů:\n"
+
+#: info/infodoc.c:55
+#, fuzzy
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr " %-10s Přesun na \"další\" uzel tohoto uzlu.\n"
+
+#: info/infodoc.c:56
+#, fuzzy
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr " %-10s Přesun na \"předchozí\" uzel tohoto uzlu.\n"
+
+#: info/infodoc.c:57
+#, fuzzy
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr " %-10s Přesun \"nahoru\" z aktuálního uzlu.\n"
+
+#: info/infodoc.c:58
+#, fuzzy
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr " Vybírání položky menu způsobí zobrazení tohoto uzlu.\n"
+
+#: info/infodoc.c:60
+#, fuzzy
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Následování křížového odkazu. Čte název odkazu.\n"
+
+#: info/infodoc.c:61
+#, fuzzy
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr " %-10s Přesun na poslední uzel zobrazený v tomto okně.\n"
+
+#: info/infodoc.c:62
+#, fuzzy
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr " %-10s Skok na následující hypertextový odkaz v tomto uzlu.\n"
+
+#: info/infodoc.c:63
+#, fuzzy
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr " %-10s Skok na následující hypertextový odkaz v tomto uzlu.\n"
+
+#: info/infodoc.c:64
+#, fuzzy
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr " %-10s Následování hypertextového odkazu pod kurzorem.\n"
+
+#: info/infodoc.c:65
+#, fuzzy
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr " %-10s Přesun do `adresářového' uzlu. Rovnocenné s `g (DIR)'.\n"
+
+#: info/infodoc.c:66
+#, fuzzy
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr " %-10s Přesun do nejvyššího (Top) uzlu. Rovnocenné s `g Top'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+#, fuzzy
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr "Přesun uvnitř uzlu:\n"
+
+#: info/infodoc.c:70
+#, fuzzy
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr " %-10s Přesun na začátek aktuálního uzlu.\n"
+
+#: info/infodoc.c:71
+#, fuzzy
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr " %-10s Přesun na konec tohoto uzlu.\n"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr " %-10s Posun o jeden řádek dopředu.\n"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr " %-10s Posun o jeden řádek dozadu.\n"
+
+#: info/infodoc.c:74
+#, fuzzy
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr " %-10s Následující stránka.\n"
+
+#: info/infodoc.c:75
+#, fuzzy
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr " %-10s Předchozí stránka.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+#, fuzzy
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr "Další příkazy:\n"
+
+#: info/infodoc.c:79
+#, fuzzy
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Výběr první ... deváté položky menu uzlu.\n"
+
+#: info/infodoc.c:80
+#, fuzzy
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr " %-10s Zobrazení poslední položky menu uzlu.\n"
+
+#: info/infodoc.c:81
+#, fuzzy
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " uzlu, na který ukazuje první nalezená položka.\n"
+
+#: info/infodoc.c:83
+#, fuzzy
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " Také můžete zadat jméno souboru ve tvaru (SOUBOR)UZEL.\n"
+
+#: info/infodoc.c:85
+#, fuzzy
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" a zobrazení uzlu, ve kterém je nalezen další výskyt tohoto řetězce.\n"
+
+#: info/infodoc.c:87
+#, fuzzy
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+" a zobrazení uzlu, ve kterém je nalezen další výskyt tohoto řetězce.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Ukončení prohlížení nápovědy.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Celkové ukončení Infa.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Vyvolání průvodce Infem.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Přesun na \"další\" uzel tohoto uzlu.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Přesun na \"předchozí\" uzel tohoto uzlu.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Přesun \"nahoru\" z aktuálního uzlu.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Vybrání položky menu zadané pomocí názvu.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " Vybírání položky menu způsobí zobrazení tohoto uzlu.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Následování křížového odkazu. Čte název odkazu.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Přesun na poslední uzel zobrazený v tomto okně.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Skok na následující hypertextový odkaz v tomto uzlu.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Následování hypertextového odkazu pod kurzorem.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Přesun do `adresářového' uzlu. Rovnocenné s `g (DIR)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Přesun do nejvyššího (Top) uzlu. Rovnocenné s `g Top'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Následující stránka.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Předchozí stránka.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Přesun na začátek aktuálního uzlu.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Přesun na konec tohoto uzlu.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Posun o jeden řádek dopředu.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Posun o jeden řádek dozadu.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Výběr první ... deváté položky menu uzlu.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Zobrazení poslední položky menu uzlu.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Hledání zadaného řetězce v rejstříku tohoto Info souboru a výběr\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " uzlu, na který ukazuje první nalezená položka.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Přesun na uzel zadaný pomocí jména.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " Také můžete zadat jméno souboru ve tvaru (SOUBOR)UZEL.\n"
+
+#: info/infodoc.c:133
+#, fuzzy, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Hledání zadaného řetězce v tomto Info souboru.\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" a zobrazení uzlu, ve kterém je nalezen další výskyt tohoto řetězce.\n"
+
+#: info/infodoc.c:135
+#, fuzzy, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Hledání zadaného řetězce v tomto Info souboru.\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Aktuální hledací cesta je:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr "Příkazy dostupné v Info oknech:\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr "Příkazy dostupné v zobrazovacím poli:\n"
+
+#: info/infodoc.c:347
+#, fuzzy, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Následující příkazy mohou být vykonány pouze pomocí M-x:\n"
+"\n"
+
+#: info/infodoc.c:351
+#, fuzzy
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Následující příkazy mohou být vykonány pouze pomocí M-x:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Použijte `\\[history-node]' nebo `\\[kill-node]' pro ukončení ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Zobrazení nápovědy"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Zobrazení Info uzlu `(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Zobrazení dokumentace ke KLÁVESE"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Popis klávesy: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s je nedefinováno."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s je nedefinováno."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "Klávesa %s je definována pro příkaz %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Ukázání co napsat pro spuštění daného příkazu"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Kde je příkaz: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "Příkaz `%s' není na žádné klávese"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "Příkaz %s může být vyvolán pouze pomocí %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "Příkaz %s může být vyvolán pomocí %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Funkce `%s' není známa"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+" Copyright (C) %s 1996 Free Software Foundation, Inc.\n"
+" Toto je volné programové vybavení, které je zcela BEZ ZÁRUKY. Podmínky "
+"pro\n"
+"kopírování a rozšiřování naleznete v Obecné veřejné licenci GNU (GNU "
+"General\n"
+"Public Licence). Více informací získáte ve zdrojových textech v souboru\n"
+"COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr ""
+
+#: info/infokey.c:201
+#, fuzzy, c-format
+msgid "cannot open input file `%s'"
+msgstr "Rouru do `%s' nelze otevřít."
+
+#: info/infokey.c:215
+#, fuzzy, c-format
+msgid "cannot create output file `%s'"
+msgstr "Výstupní soubor `%s' nelze vytvořit."
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr ""
+
+#: info/infokey.c:232
+#, fuzzy, c-format
+msgid "error closing output file `%s'"
+msgstr "Výstupní soubor `%s' nelze vytvořit."
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr ""
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr ""
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr ""
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr ""
+
+#: info/infokey.c:665
+#, fuzzy
+msgid "missing action name"
+msgstr "%c%s chybějící uzavírací závorka"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr ""
+
+#: info/infokey.c:688
+#, fuzzy, c-format
+msgid "unknown action `%s'"
+msgstr "Neznámý příkaz `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr ""
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr ""
+
+#: info/infokey.c:723
+#, fuzzy
+msgid "missing variable name"
+msgstr "%s: chybí argument jména souboru.\n"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr ""
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr ""
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr ""
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr ""
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr ""
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr ""
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr ""
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Zadání jména příkazu a následné zobrazení jeho popisu"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Popis příkazu: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Zadání jména příkazu v zobrazovacím poli a jeho vykonání"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Příkaz zobrazovacího pole nelze vykonat zde."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "Neznámý příkaz `%s'"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Nastavení výšky obrazovky"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Výška obrazovky (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+"Při zpracování zdrojového souboru jsou vkládány tyto soubory:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Se souborem %s nelze pracovat.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Soubor)Uzel Řádků Velikost Soubor\n"
+" ------------ ----- -------- ------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+" Zde je seznam uzlů, které jste poslední dobou navštívil. Vyberte jeden\n"
+"z tohoto menu, nebo užijte `\\[history-node]' v tomto okně.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Vytvoření okna obsahujícího menu všech aktuálně navštívených uzlů"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Zobrazení uzlu, který byl zobrazen před tímto"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Vyberte navštívený uzel: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Odkaz se ztratil! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Vítejte v programu Info verze %s. Stiskněte \\[get-help-window] pro "
+"nápovědu, \\[menu-item] pro položku menu."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Posun dolů na další řádek"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Posun nahoru na předchozí řádek"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Přesun na konec řádku"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Přesun na začátek řádku"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Další"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Přechod na další uzel..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Zobrazování první položky menu..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Zobrazování dalšího uzlu..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Přesouvání %d krát nahoru, potom na další."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "V tomto dokumentu již nejsou další uzly."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Pro tento uzel není předchozí uzel."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Přesun na předchozí uzel v tomto okně."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "V tomto dokumentu není pro tento uzel předchozí nebo vyšší uzel."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Přesun nahoru v tomto okně."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Přesun na poslední položku menu předchozího uzlu."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Přesun na následující uzel nebo na první nižší v uzlové struktuře"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Přesun na předchozí uzel nebo na první vyšší v uzlové struktuře"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Posun o stránku dolů v tomto okně"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "Posun dopředu v tomto okně a nastavení implicitní velikosti okna"
+
+#: info/session.c:1221
+#, fuzzy
+msgid "Scroll forward in this window staying within node"
+msgstr "Posun o stránku dolů v tomto okně"
+
+#: info/session.c:1229
+#, fuzzy
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr "Posun dopředu v tomto okně a nastavení implicitní velikosti okna"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Posun o stránku nahoru v tomto okně"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "Posun dozadu v tomto okně a nastavení implicitní velikosti okna"
+
+#: info/session.c:1254
+#, fuzzy
+msgid "Scroll backward in this window staying within node"
+msgstr "Posun o stránku nahoru v tomto okně"
+
+#: info/session.c:1262
+#, fuzzy
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr "Posun dozadu v tomto okně a nastavení implicitní velikosti okna"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Posun na začátek tohoto uzlu"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Posun na konec tohoto uzlu"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Posun dolů po řádcích"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Posun nahoru po řádcích"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Posun dolů o polovinu velikosti obrazovky"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Posun nahoru o polovinu velikosti obrazovky"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Výběr následujícího okna"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Výběr předchozího okna"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Rozdělení aktuálního okna"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Smazání aktuálního okna"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Permanentní okno nelze smazat"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Smazání všech ostatních oknen"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Posun druhého okna o stránku dolů"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Posun druhého okna o stránku zpět"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Změna velikosti okna"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Zvětšení nebo zmenšení oken na obrazovce tak, aby byla stejně velká"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr ""
+"Změna stavu zalamování v aktuálním okně (zapnuto->vypni, vypnuto->zapni)"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Zobrazení následujícího uzlu"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Zobrazení předchozího uzlu"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Zobrazení vyššího uzlu"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Zobrazení posledního uzlu v tomto souboru"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Toto okno nemá více dalších uzlů"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Zobrazení prvního uzlu v tomto souboru"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Zobrazení poslední položky menu tohoto uzlu"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Zobrazení této položky menu"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "V tomto menu není %d. položka"
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Položka menu (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Položka menu: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Následování křížového odkazu (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Následování křížového odkazu: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Zadání jména položky menu a následné zobrazení"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr ""
+"Zadání jména poznámky pod čarou nebo křížového odkazu a následné zobrazení"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Přesun na začátek menu tohoto uzlu"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr ""
+"Navštívení tolika položek menu, kolik je možno. Každá položka v jiném okně."
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Zadání jména uzlu a jeho následné zobrazení"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Přesun na uzel: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "V uzlu `%s' není menu."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Položka menu `%s' v uzlu `%s' není."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Uzel, na který se odkazuje `%s' v `%s', nelze najít."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Čtení seznamu menu začínajíce v adresáři a pokračujíce dále"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Následování menu: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Nalezení uzlu popisujícího přepínače programu"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Nalezení uzlu s přepínači programu [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Zadání jména manuálové stránky a následné zobrazení"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Manuálová stránka: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Zobrazení nejvyššího uzlu v tomto souboru"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Zobrazení uzlu `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Zrušení uzlu (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Uzel `%s' nelze zrušit"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Poslední uzel nelze zrušit"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Zobrazení poslední dobou nejvíce navštěvovaných uzlů"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Zrušení tohoto uzlu"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Zadání jména souboru a jeho následné zobrazení"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Nalezení souboru: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Nelze najít `%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Výstupní soubor `%s' nelze vytvořit."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Dokončeno."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Zapisování uzlu %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Poslání obsahu tohoto uzlu příkazu INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Rouru do `%s' nelze otevřít."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Probíhá tisk uzlu %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Probíhá hledání podsouboru %s..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Přečtení řetězce a jeho vyhledání (záleží na velikosti písmen)"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Přečtení řetězce a jeho vyhledání"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Přečtení řetězce a jeho vyhledání (zpětné)"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%sřetězce [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Zpětné hledání"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Hledání"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " (velikost rozhoduje)"
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Nebylo nalezeno."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Opakování posledního hledání tím samým směrem"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Není předchozí hledaný řetězec"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Opakování posledního hledání opačným směrem"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Vyhledávání zadávaného řetězce hned při zadávání"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "zpětné interaktivní hledání: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "interaktivní hledání: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Bezvýsledné "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Přesun na předcházející křížový odkaz"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Přesun na následující křížový odkaz"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Zobrazení odkazu nebo položky menu, která je na tomto řádku"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Zrušení aktuální operace"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Ukončení operace"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Přesun kurzoru na zadaný řádek okna"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Překreslení obrazovky"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Ukončení Infa"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr ""
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Neznámý příkaz (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "Sekvence kláves \"%s\" je neplatná"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "Sekvence kláves \"%s\" je neplatná"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Přidání této číslice do aktuálního číselného argumentu"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Začátek (nebo dělení čtyřmi) aktuálního číselného argumentu"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Vnitřně užíváno funkcí \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Nedostatek virtuální paměti!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Je-li zapnuto, pak se poznámky pod čarou objevují a mizí automaticky"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr "Je-li zapnuto, vytvoření a smazání okna, mění velikost ostatních oken"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Je-li zapnuto, pak místo varovného pípnutí blikne obrazovka"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Je-li zapnuto, pak chyby způsobí varovné pípnutí"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Je-li zapnuto, pak Info zapomíná odkomprimovanou část komprimovaných souborů"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Je-li zapnuto, pak je hledaný řetězec v nalezeném výrazu zvýrazněn"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Řídí co se stane, když je požadován posun o stranu na konci uzlu"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr ""
+"Počet řádků, o které posunout okno, když se kurzor dostane mimo viditelnou "
+"část"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Je-li zapnuto, pak Info akceptuje a zobrazuje znaky z normy ISO Latin"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Zobrazení popisu proměnné"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Popis proměnné: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Nastavení hodnoty Info proměnné"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Nastavení proměnné: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Nastavení proměnné %s na hodnotu (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Nastavení proměnné %s na hodnotu (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Značky jsou zastatalé ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), řádků ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, řádků: %d --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, řádků: %d --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Podsoubor: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: přepínač `%s' není jednoznačný\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: přepínač `--%s' musí být zadán bez argumentu\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: přepínač `%c%s' musí být zadán bez argumentu\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: přepínač `%s' vyžaduje argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: neznámý přepínač `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: neznámý přepínač `%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: neznámý přepínač -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: neznámý přepínač -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: přepínač vyžaduje argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: přepínač `-W %s' není jednoznačný\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: přepínač `-W %s' musí být zadán bez argumentu\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "Špatný argument pro %c%s"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "Leden"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "Únor"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "Březen"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "Duben"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "Květen"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "Červen"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "Červenec"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "Srpen"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "Září"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "Říjen"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "Listopad"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "Prosinec"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "nepravděpodobný znak %c ve @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc argument je celý velkými písmeny, zbytečně"
+
+#: makeinfo/cmds.c:1034
+#, fuzzy, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "`@end' vyžaduje `%s', ale vidí `%s'"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr ""
+
+#: makeinfo/cmds.c:1082
+#, fuzzy, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "`@end' vyžaduje `%s', ale vidí `%s'"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "Příkaz %c%s je zastaralý"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp vyžaduje kladný číselný argument a ne `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Špatný argument pro %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "Špatný argument pro %c%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Chybějící `}' v argumentu @def"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funkce"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Speciální forma"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Proměnná"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Uživatelská volba"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instance proměnné"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metoda"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "z"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr ""
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr ""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' potřebuje argument `{...}' a ne pouze `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Chybí uzavírací závorka pro poznámku pod čarou `%s'"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Poznámka pod čarou definována bez rodičovského uzlu"
+
+#: makeinfo/footnote.c:210
+#, fuzzy
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Poznámka pod čarou definována bez rodičovského uzlu"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Poznámky pod čarou"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Neoznačeno"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, fuzzy, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "%s: neznámý přepínač `--%s'\n"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Neznámý rejstřík `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Rejstřík `%s' již existuje"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Neznámý rejstřík `%s' a/nebo `%s' v @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Neznámý rejstřík `%s' v @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Položka pro rejstřík `%s' je mimo všechny uzly"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(mimo všechny uzly)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Viz"
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Chybný typ v insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Výpočetní zásobník přetekl"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "písmenkování přeteklo, znovu začínám na %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s vyžaduje argument : formátovač pro %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' vyžaduje `%s', ale vidí `%s'"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Chybí odpovídající `%cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s vyžaduje písmeno nebo číslici"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr ""
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s není myslitelné uvnitř `@%s' bloku"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu spatřeno před prvním @node, vytvořen uzel `Top'"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"protože váš uzel @top by měl být uzavřen v @ifnottex spíše než v @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu spatřeno před prvním uzlem, vytvořen uzel `Top'"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s není myslitelné uvnitř `@%s' bloku"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Nepárový `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "`%c%s' potřebuje nějaký argument"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Chybný argument pro `%s', `%s', používám `%s'"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s není myslitelné uvnitř `@%s' bloku"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx není myslitelný uvnitř `%s' bloku"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s nalezen mimo vkládaný blok"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s není platný kód jazyka (podle ISO 639)"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "%s: neznámý přepínač `--%s'\n"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr ""
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s vyžaduje `i' nebo `j' jako argument, ne `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s vyžaduje jeden znak `i' nebo `j' jako argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makro `%s' již bylo definováno"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "zde je předchozí definice `%s'"
+
+#: makeinfo/macro.c:355
+#, fuzzy, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "\\ při expanzi makra následováno `%s' místo \\ nebo jména parametru"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makro `%s' volané na řádku %d s příliš mnoha argumenty"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend makro nebylo nalezeno"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg je užitečné pouze pro jedno-argumentová makra"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "pomíchané @end %s s @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Příliš mnoho chyb! Konec.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: varování: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Špatně umístěný znak %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Více informací získáte příkazem `%s --help'.\n"
+
+#: makeinfo/makeinfo.c:343
+#, fuzzy, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Použití: %s [PŘEPÍNAČ]... SOUBOR...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:452
+#, fuzzy
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"\n"
+" Implicitní nastavení pro podmínky @if... záleží na výstupním formátu:\n"
+"při generování HTML je zapnut přepínač --ifhtml a ostatní jsou vypnuty;\n"
+"při generování Info souboru nebo čistého textu je zapnut přepínač --ifinfo\n"
+"a ostatní jsou vypnuty.\n"
+"\n"
+"Příklady:\n"
+" makeinfo foo.texi zapíše Info do souboru určeného\n"
+" pomocí @setfilename ve foo.texi\n"
+" makeinfo --html foo.texi zapíše HTML do souboru určeného\n"
+" pomocí @setfilename ve foo.texi\n"
+" makeinfo --no-headers -o - foo.texi vypíše čistý text na standardní "
+"výstup\n"
+" makeinfo --number-sections foo.texi zapíše Info s číslovanými sekcemi\n"
+" makeinfo --no-split foo.texi zapíše jeden Info soubor jakkoliv "
+"velký\n"
+"\n"
+" Chyby v programu oznamujte na adrese <bug-texinfo@gnu.org> (pouze "
+"anglicky),\n"
+"obecné otázky směřujte na <help-texinfo@gnu.org>. Připomínky k překladu\n"
+"zasílejte na <cs@li.org> (česky)."
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s argument musí být číslo ne `%s'.\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Výstup %s pro expanzi makra nelze otevřít"
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "Výstup %s pro expanzi makra nelze otevřít"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: argument pro --paragraph-indent musí být číslo|`none'|`asis', ale ne `%"
+"s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: argument k --footnote-style musí být `separate'|`end', ale ne `%s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: chybí argument jména souboru.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Očekáváno `%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Soubor `%s' nenalezen v `%s'"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Vynechávám expanzi makra na stdout a expanze jde jako Info výstup.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Vytvářím %s soubor `%s' ze souboru `%s'.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr ""
+"Toto je Info soubor %s, produkován programem makeinfo verze %s ze souboru %"
+"s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Výstupní soubor maker `%s' byl odstraněn, protože byly nalezeny chyby;\n"
+"užijte přepínač --force k ponechání souboru.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Výstupní soubor `%s' byl odstraněn, protože byly nalezeny chyby;\n"
+"užijte přepínač --force k ponechání souboru.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Neznámý příkaz `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Použijte závorky k zadání příkazu jako argumentu @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s očekáváno `{...}'"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Nepárová }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "Funkce neexistuje!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s chybějící uzavírací závorka"
+
+#: makeinfo/makeinfo.c:3309
+#, fuzzy, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "soubor `%s' v příkazu @image je nečitelný: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "Soubor `%s' nenalezen v `%s'"
+
+#: makeinfo/makeinfo.c:3447
+#, fuzzy, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "soubor `%s' v příkazu @image je nečitelný: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "příkaz @image postrádá jméno souboru"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Pro `%s' není hodnota}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s požaduje jméno"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Vstupní soubor skončil a příkaz `@end %s' nebyl nalezen"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Chybějící } v @multitable vzoru"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ignoruji zbloudilý text `%s' po příkazu @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Příliš mnoho sloupců v multitabulkové položce (max %d)"
+
+#: makeinfo/multi.c:555
+#, fuzzy, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "sloupec #%d v multitabulce nelze vybrat"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "příkaz `@tab' ignorován, je mimo multitabulku"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Vícesloupcový výstup z posledního řádku:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* sloupec #%d: výstup = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Uzel `%s' již byl definován na řádku %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Formátování uzlu %s...\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Uzel `%s' vyžaduje příkaz na vytváření sekcí (třeba %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Příkazu `%c%s' nebyl zadán název uzlu"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr ""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr ""
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Další:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Předchozí:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Nahoru:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s se odkazuje na neexistující uzel `%s'"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Menu"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Odkaz"
+
+#: makeinfo/node.c:1447
+#, fuzzy, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr "Následující uzel uzlu `%s' neukazuje na tento"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Tento uzel (%s) má chybný odkaz na předchozí uzel"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Předchozí"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Předchozí uzel uzlu `%s' neukazuje na tento"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Tento uzel (%s) má chybný odkaz na následující uzel"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Nahoru"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"Uzel `%s' postrádá položku menu pro `%s' navzdory tomu, že je jeho vyšším "
+"uzlem"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "na uzel `%s' se bylo odkazováno %d krát"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "uzel `%s' - nesměřuje na něj žádný odkaz"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Výstupní soubor `%s' nelze vytvořit."
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "Dodatek %c "
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Interní chyba (hledání sekcí) \"%s\"!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Interní chyba (hledání sekcí) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s je zastaralý; použijte %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Uzel s %ctop jako sekcí již existuje"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Již zde je nejvyšší (%ctop) uzel"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop je použit před %cnode, přesměrováno na %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Obsah"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Krátký obsah"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "soubor `%s' v příkazu @image je nečitelný: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: varování: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " pro %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "Více informací získáte příkazem `%s --help'.\n"
+
+#: util/install-info.c:434
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Použití: %s [PŘEPÍNAČ]... [INFO-SOUBOR [DIR-SOUBOR]]\n"
+"\n"
+"Instaluje nebo maže položky ze souboru INFO-SOUBOR v Info adresáři DIR-"
+"SOUBOR.\n"
+"\n"
+"Přepínače:\n"
+"--delete smaže existující položky INFO-SOUBORu z DIR-SOUBORU;\n"
+" nevkládá žádné nové.\n"
+"--dir-file=JMÉNO zadání jména adresářového souboru Infa. Rovnocenné\n"
+" s použitím argumentu DIR-SOUBOR.\n"
+"--entry=TEXT vloží text jako položku Info adresáře. TEXT musí mít "
+"formát\n"
+" jako řádek položky Info menu, plus nula nebo více extra\n"
+" řádků začínajících mezerou. Jestliže zadáte více než "
+"jednu\n"
+" položku, budou přidány všechny. Jestliže nezadáte žádnou\n"
+" položku, budou získány z informací v Info souboru.\n"
+"--help vypíše tuto nápovědu a skončí\n"
+"--info-file=SOUBOR zadání Info souboru pro instalaci do Info adresáře.\n"
+" Rovnocenné s argumentem INFO-SOUBOR.\n"
+"--info-dir=ADRESÁŘ stejné jako --dir-file=ADRESÁŘ/dir.\n"
+"--item=TEXT stejné jako --entry=TEXT.\n"
+" Položka Info adresáře je aktuální položka menu.\n"
+"--quiet potlačí varování.\n"
+"--remove stejné jako --delete.\n"
+"--section=SEKCE vloží položky adresáře do sekce SEKCE Info adresáře.\n"
+" Jestliže je zadáno více sekcí, jsou všechny položky\n"
+" přidány do všech zadaných sekcí. Jestliže nejsou zadány\n"
+" žádné sekce, pak jsou sekce získány z Info souboru.\n"
+"--version vypíše označení verze a skončí.\n"
+"\n"
+" Chyby v programu oznamujte na adrese <bug-texinfo@gnu.org> (pouze "
+"anglicky),\n"
+"obecné otázky směřujte na <help-texinfo@gnu.org>. Připomínky\n"
+"k překladu zasílejte na <cs@li.org> (česky).\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+" Toto je soubor .../info/dir, který obsahuje nejvyšší uzly hierarchie\n"
+"Info dokumentů a je nazýván (dir)Top. Když poprvé spustíte Info dostanete\n"
+"se do tohoto uzlu.\n"
+"\n"
+"%s Toto je vrchol INFO stromu\n"
+"\n"
+" Tento (Adresářový uzel) obsahuje menu hlavních témat.\n"
+" Stiskem \"q\" Info ukončíte, stiskem \"?\" získáte seznam všech Info "
+"příkazů,\n"
+" stiskem \"d\" se vrátíte sem, stiskem \"h\" získáte nápovědu pro "
+"začátečníky,\n"
+" napsáním \"mEmacs\" si zobrazíte manuál k Emacsu, atd.\n"
+"\n"
+" Pokud chcete v Emacsu zobrazit obsah položky menu nebo následovat "
+"křížový\n"
+" odkaz, můžete to provést kliknutím prostředním tlačítkem myši.\n"
+"\n"
+"* Menu:\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: %s nelze číst a %s nelze vytvořit\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: prázdný soubor"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY bez odpovídajícího END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY bez předchozího START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Info soubor zadejte pouze jednou.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "nadbytečný argument `%s' v příkazovém řádku"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+"Vstupní soubor nezadán; použitím přepínače --help získáte bližší informace."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+"Adresář nebyl zadán; použitím přepínače `--help' získáte bližší informace"
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "v Info adresáři `%s' není žádná položka"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "položka menu `%s' již pro soubor `%s' existuje"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "pro `%s' nebyly nalezeny žádné položky"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "vypíše tuto nápovědu a skončí"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "zanechá dočasné soubory po ukončení"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "nezanechá dočasné soubory po ukončení"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "zapíše výstup do SOUBORu"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "vypíše označení verze a skončí"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Použití: %s [PŘEPÍNAČ]... SOUBOR...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Generuje seřazený rejstřík pro každý TeXovský výstupní SOUBOR.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "SOUBOR... je obvykle `foo.%c%c' pro dokument `foo.texi'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Přepínače:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: není texinfovský rejstřík"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "soubor %s nepovedlo se znovu otevřít"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Na %s není číslo stránky"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "položka %s následuje za položkou se sekundárním jménem"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Info adresář zadejte pouze jednou.\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "Sekvence kláves \"\" je neplatná"
+
+#, fuzzy
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s není platný kód jazyka (podle ISO 639)"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Pro expanzi makra nelze zadat více než jeden výstup"
+
+#~ msgid "see "
+#~ msgstr "viz"
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "`.' nebo `,' musí následovat za křížovým odkazem, ale ne za %c"
+
+#~ msgid "Node:"
+#~ msgstr "Uzel:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: Obsah běl být zde, ale nebyl nalezen"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "virtuální paměť vyčerpána"
+
+#, fuzzy
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "Žádný .png nebo .jpg soubor pro `%s'"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s; pro soubor `%s'.\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "`%s' nemá zadán vyšší uzel"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr " %-10s Posun o jeden řádek dopředu.\n"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr " %-10s Posun o jeden řádek dozadu.\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Email bug reports to bug-texinfo@gnu.org,\n"
+#~ "general questions and discussion to help-texinfo@gnu.org."
+#~ msgstr ""
+#~ "\n"
+#~ " Chyby v programu oznamujte na adrese <bug-texinfo@gnu.org> (pouze "
+#~ "anglicky),\n"
+#~ "obecné otázky směřujte na <help-texinfo@gnu.org>. Připomínky k překladu\n"
+#~ "zasílejte na <cs@li.org> (česky).\n"
+
+#~ msgid "******************************\n"
+#~ msgstr "******************************\n"
+
+#~ msgid "---------------------\n"
+#~ msgstr "---------------------\n"
+
+#~ msgid "----------------------\n"
+#~ msgstr "----------------------\n"
+
+#~ msgid "---------------\n"
+#~ msgstr "---------------\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "Translate Texinfo source documentation to various other formats:\n"
+#~ "Info files suitable for reading online with Emacs or standalone GNU Info\n"
+#~ "(by default); plain text (with --no-headers); or HTML (with --html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names allow @ commands in node names.\n"
+#~ " -D VAR define a variable, as with @set.\n"
+#~ "--docbook output DocBook rather than Info format.\n"
+#~ " -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+#~ " --error-limit=NUM quit after NUM errors (default %d).\n"
+#~ " --fill-column=NUM break Info lines at NUM characters (default %"
+#~ "d).\n"
+#~ " --footnote-style=STYLE output footnotes according to STYLE:\n"
+#~ " `separate' to place footnotes in their own "
+#~ "node,\n"
+#~ " `end' to place the footnotes at the end of "
+#~ "the\n"
+#~ " node in which they are defined (the "
+#~ "default).\n"
+#~ " --force preserve output even if errors.\n"
+#~ " --help display this help and exit.\n"
+#~ " --html output HTML rather than Info format.\n"
+#~ " -I DIR append DIR to the @include search path.\n"
+#~ " --ifhtml process @ifhtml and @html text even when not\n"
+#~ " generating HTML.\n"
+#~ " --ifinfo process @ifinfo text even when generating "
+#~ "HTML.\n"
+#~ " --iftex process @iftex and @tex text.\n"
+#~ " implies --no-split.\n"
+#~ msgstr ""
+#~ "Použití: %s [PŘEPÍNAČ]... TEXINFO-SOUBOR...\n"
+#~ "\n"
+#~ " Překládá Texinfový zdrojový soubor to mnoha různých formátů:\n"
+#~ "Info soubory vhodné pro on-line čtení Emacsem nebo samostatným GNU Info\n"
+#~ "prohlížečem (implicitní); čistý text (přepínačem --no-headers); nebo "
+#~ "HTML\n"
+#~ "(přepínačem --html).\n"
+#~ "\n"
+#~ "Přepínače:\n"
+#~ "--commands-in-node-names dovoluje @ příkazy v názvech uzlů\n"
+#~ "-D PROMĚNNÁ definuje proměnnou, jako příkaz @set\n"
+#~ "-E, --macro-expand SOUBOR výstup zdrojových textů s expandovanými makry\n"
+#~ " do SOUBORu\n"
+#~ "--error-limit=ČÍSLO ukonči se po ČÍSLO chybách (implicitně %d)\n"
+#~ "--fill-column=ČÍSLO zalamování na ČÍSLO znaků (implicitně %d)\n"
+#~ "--footnote-style=STYL umístění poznámek pod čarou podle STYLu:\n"
+#~ " `separate' umístění poznámek pod čarou do\n"
+#~ " samostatného uzlu;\n"
+#~ " `end' umístění poznámek pod čarou na konec "
+#~ "uzlu,\n"
+#~ " ve kterém jsou definovány (implicitní);\n"
+#~ "--force zanechá výstup dokonce i při chybách\n"
+#~ "--help vypíše tuto nápovědu a skončí\n"
+#~ "--html výstup v HTML formátu\n"
+#~ "-I ADRESÁŘ přidá ADRESÁŘ na konec seznamu adresářů, ve "
+#~ "kterých\n"
+#~ " jsou hledány soubory pro @include\n"
+#~ "--ifhtml způsobí zpracování @ifhtml a @html, i když není\n"
+#~ " výstupem formát HTML\n"
+#~ "--ifinfo způsobí zpracování @ifinfo, i když je výstupem "
+#~ "HTML\n"
+#~ "--iftex způsobí zpracování @iftex a @tex textu\n"
+#~ " zahrnuje --no-split.\n"
+
+#, fuzzy
+#~ msgid ""
+#~ " --no-headers suppress Info node separators and Node: "
+#~ "lines;\n"
+#~ " write to standard output without --output.\n"
+#~ " --no-ifhtml do not process @ifhtml and @html text.\n"
+#~ " --no-ifinfo do not process @ifinfo text.\n"
+#~ " --no-iftex do not process @iftex and @tex text.\n"
+#~ " --no-split suppress splitting of Info or HTML output,\n"
+#~ " generate only one output file.\n"
+#~ " --no-validate suppress node cross-reference validation.\n"
+#~ " --no-warn suppress warnings (but not errors).\n"
+#~ " --number-sections include chapter, section, etc. numbers in "
+#~ "output.\n"
+#~ " -o, --output=FILE output to FILE (directory if split HTML),\n"
+#~ " ignoring any @setfilename.\n"
+#~ " -P DIR prepend DIR to the @include search path.\n"
+#~ " --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+#~ "d).\n"
+#~ " if VAL is `none', do not indent;\n"
+#~ " if VAL is `asis', preserve existing "
+#~ "indentation.\n"
+#~ " --reference-limit=NUM warn about at most NUM references (default %"
+#~ "d).\n"
+#~ " --split-size=NUM split into files at NUM size. (default %d).\n"
+#~ " -U VAR undefine a variable, as with @clear.\n"
+#~ " -v, --verbose explain what is being done.\n"
+#~ " --version display version information and exit.\n"
+#~ " --xml output XML (TexinfoML) rather than Info "
+#~ "format.\n"
+#~ msgstr ""
+#~ "--no-headers potlačí oddělovače uzlů a jejich hlavičky a "
+#~ "zapíše \n"
+#~ " výstup na standardní výstup (není-li zadáno --"
+#~ "output)\n"
+#~ "--no-ifhtml způsobí nezpracování @ifhtml a @html textu\n"
+#~ "--no-ifinfo způsobí nezpracování @ifinfo textu\n"
+#~ "--no-iftex způsobí nezpracování @iftex a @tex textu\n"
+#~ "--no-split potlačí rozdělování velkých výstupních info "
+#~ "souborů\n"
+#~ " nebo generování jednoho HTML souboru na uzel\n"
+#~ "--no-validate potlačí kontrolu křížových odkazů\n"
+#~ "--no-warn potlačí výpis varování (ne však chyb)\n"
+#~ "-o, --output=SOUB výstup do SOUBoru, ignoruje příkaz @setfilename\n"
+#~ "-P ADRESÁŘ přidá ADRESÁŘ na začátek seznamu adresářů, ve "
+#~ "kterých\n"
+#~ " jsou hledány soubory pro @include\n"
+#~ "--paragraph-indent=HODN odsadí odstavce HODN mezerami (implicitně %d).\n"
+#~ " jestliže je HODN `none' neodsazuje;\n"
+#~ " jestliže je HODN `asis' zanechá existující "
+#~ "odsazení.\n"
+#~ "--reference-limit=ČÍSLO oznámí, bude-li křížových odkazů více než ČÍSLO\n"
+#~ " (implicitně %d).\n"
+#~ "-U PROMĚNNÁ oddefinuje proměnnou, jako příkazem @clear\n"
+#~ "-v, --verbose vypisuje bližší informace o zpracovávání\n"
+#~ "--version vypíše označení verze a skončí\n"
diff --git a/Build/source/utils/texinfo/po/da.gmo b/Build/source/utils/texinfo/po/da.gmo
new file mode 100644
index 00000000000..55e147567a4
--- /dev/null
+++ b/Build/source/utils/texinfo/po/da.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/da.po b/Build/source/utils/texinfo/po/da.po
new file mode 100644
index 00000000000..1b5524a8bc1
--- /dev/null
+++ b/Build/source/utils/texinfo/po/da.po
@@ -0,0 +1,3101 @@
+# Danish texinfo translation po-file.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Claus Hindsgaul <claus_h@image.dk>, 2000-2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.2e\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2002-11-08 09:13GMT\n"
+"Last-Translator: Claus Hindsgaul <claus_h@image.dk>\n"
+"Language-Team: Danish <dansk@klid.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.6\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Gĺ et tegn frem"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Gĺ et tegn tilbage"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Gĺ til starten af linjen"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Gĺ til slutning af linjen"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Ryk et ord frem"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Ryk et ord tilbage"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Slet tegnet under markřren"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Slet tegnet efter markřren"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Afbryd eller afslut aktivitet"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Acceptér (eller gennemtving afslutning af) linjen"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Indsćt nćste tegn rĺt"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Indsćt dette tegn"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Indsćt et tabulatortegn"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transponér tegn ved markřr"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Gendan indholdet fra sidste sletning"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Skraldespand er tom"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Gendan en tidligere sletning"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Slet resten af linjen"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Slet bagud til linjestart"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Slet resten af ordet"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Slet ordet fřr markřren"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Ingen afslutninger"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Ikke afsluttet"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Vis mulige afslutninger"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Eneste afslutning"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Én afslutning:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d afslutninger:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Indsćt afslutning"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Opbygger afslutninger..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Rul afslutningsvinduet"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Fodnoter kunne ikke vises"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Vis fodnoter, det hřrer til dette emne i et andet vindue"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Fodnoter -----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Slĺ en tekst op i denne fils indeks."
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Finder indeksindgange..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Fandt intet indeks."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Indeksindgang:"
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr "Gĺ til nćste fundne indekspunkt fra sidste '\\[index-search]'-kommando"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Ingen tidligere indeks sřgetekst"
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Ingen indeksindgange."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Ingen %sindeksindgange indeholder \"%s\"."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "mere "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "KAN IKKE SE DETTE"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "Fandt \"%s\" i %s. ('\\[next-index-match]' sřger efter den nćste.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Skimmer \"%s\"'s indekser..."
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Ingen tilgćngelige info-filer har \"%s\" i sit index."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Gennemtrćvl alle kendte Info-filers indekser for en tekst og opbyg en menu"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Indeks apropos:"
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Emner, hvis indeks indeholder \"%s\":\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Prřv --help for mere information.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Der er INGEN garanti. Du mĺ redistribuere denne software\n"
+"under GNU General Public License's betingelser.\n"
+"For mere information om dette, se filerne 'COPYING'.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "ingen indeksindgange blev fundet for '%s'\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr " -b, --speech-friendly vćr talesyntese-venlig.\n"
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Brug: %s [TILVALG]... [MENUPUNKT...]\n"
+"\n"
+"Lćs dokumentationen i Info format.\n"
+"\n"
+"Tilvalg:\n"
+" --apropos=STRENG slĺ STRENG op i alle indekser og manualer.\n"
+" -d, --directory=KATALOG tilfřj KATALOG til INFOPATH.\n"
+" --dribble=FILNAVN gem brugerens tastetryk i FILNAVN.\n"
+" -f, --file=FILNAVN angiv Info fil, der skal besřges.\n"
+" -h, --help vis denne hjćlp og afslut.\n"
+" --index-search=TEKST gĺ til det punkt, indeks-indgang TEKST "
+"angiver.\n"
+" -n, --node=EMNENAVN angiv emner i fřrst besřgte Info-fil.\n"
+" -o, --output=FILNAVN udlćs de valgte emner til FILNAVN.\n"
+" -R, --raw-escapes fjern ikke ANSI-escapekoder fra manualsider\n"
+" --restore=FILNAVN indlćs de fřrste tastetryk fra FILNAVN.\n"
+" -O, --show-options, --usage gĺ til emnet kommandolinje-tilvalg.\n"
+"%s --subnodes udlćs menupunkter rekursivt.\n"
+" --vi-keys benyt 'vi'- og 'less'-agtige tastebindinger.\n"
+" --version vis versionsinformation og afslut.\n"
+"\n"
+"Det fřrste ikke-tilvalgs-parameter er menuindgangen der startes fra;\n"
+"den sřges i alle 'katalog'-filer angivet i miljřvariablen INFOPATH.\n"
+"Hvis ikke dette parameter er angivet, samler info alle 'katalog'-filer\n"
+" og viser resultatet.\n"
+"Resterende parametre angiver navne pĺ menupunkter i forhold til "
+"startpunktet.\n"
+"\n"
+"Eksempler:\n"
+" info viser top-niveau katalog menu\n"
+" info emacs start ved emnet emacs i topniveau kataloget\n"
+" info emacs buffers start ved emnet 'buffers' i emacs-manualen\n"
+" info --show-options emacs start ved emnet med emacs' kommandolinje "
+"tilvalg\n"
+" info -f ./xxx.info vis filen ./xxx.info uden at sřge i katalog\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Rapportér fejl i programmet pĺ engelsk til bug-texinfo@gnu.org,\n"
+"generelle spřrgsmĺl og diskussion til help-texinfo@gnu.org,\n"
+"oversćttelsesfejl til claus_h@image.dk\n"
+"Texinfos hjemmeside: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Kan ikke finde emnet '%s'."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Kan ikke finde emnet '(%s)%s'."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Kan ikke finde et vindue!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Punktet optrćder ikke i dette vindues emne!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Kan ikke slette det sidste vindue."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Ingen menu i dette emne."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Ingen fodnoter i dette emne."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Ingen krydsreferencer i dette emne."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Ingen '%s'-peger mod dette emne."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Ukendt Info kommando '%c'; prřv '?' for hjćlp."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Info kan ikke křre pĺ terminal type '%s'."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Du er i forvejen ved emnets sidste side."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Du er i forvejen ved emnets fřrste side."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Kun ét vindue."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Det resulterende vindue ville vćre for lille."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Ikke nok plads til et hjćlpevindue. Fjern venligst et vindue."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Grundlćggende kommandoer i Info-vinduer\n"
+"***************************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Afslut denne hjćlp.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Afslut hele Info-programmet.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Křr info introduktionen.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Valg af ander emnder:\n"
+"---------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Flyt til emnet 'nćste' i dette emne.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Flyt til emnet 'Forrige' i dette emne.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Flyt til emnet 'Op' i dette emne.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Vćlg menupunkt angivet ved navn.\n"
+" Valg af menupunkt vćlger et andet emne.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Fřlg en krydshenvisning. Indlćser referencens navn.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "\\%-10[history-node] Flyt til vinduets sidste synlige emne-felt.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Hop til nćste hypertekst-henvisning i dette "
+"emne.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Hop til nćste hypertekst-henvisning i dette "
+"emne.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Fřlg hypertekst-henvisningen under "
+"markřren.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Flyt til emnet 'katalog'. Svarer til 'g (KATALOG)'.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr "\\%-10[top-node] Gĺ til emnet Top. Svarer til '\\[goto-node] Top'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Bevćgelser indenfor et emne:\n"
+"----------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Gĺ til starten af emnet.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Gĺ til enden af emnet.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[nćste linje] Rul 1 linje frem.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[forrige linje] Rul en linje tilbage.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Rul en side frem.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Rul en side tilbage.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Andre kommandoer:\n"
+"-----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] Vćlg fřrste til niende punkt i emnets menu.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Vćlg sidste punkt i emnets menu.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Sřg efter den angivne streng i denne Infos "
+"indeksindgange\n"
+" og vćlg det emne, der refereres til af den fřrst fundne "
+"indgang.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Gĺ til emne angivet ved navn.\n"
+" Du kan ogsĺ medtage filnavn, som (FILNAVN)EMNENAVN.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Sřg fremad efter en given streng\n"
+" og vćlg emnet med den nćste forekomst.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Sćg baglćns efter en given streng\n"
+" og vćlg emnet med den forrige forekomst.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Afslut hjćlp.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Afslut hele Info-programmet.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Křr info introduktionen.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Flyt til emnet 'nćste' i dette emne.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Flyt til emnet 'Forrige' i dette emne.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Gĺ et niveau op.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Vćlg menupunkt angivet ved navn.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " Valg af menupunkt vćlger et andet emne.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Fřlg en krydshenvisning. Indlćser referencens navn.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Flyt til vinduets sidste synlige emne-felt.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Hop til nćste hypertekst-lćnke i dette emne.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Fřlg hypertekst-lćnken under markřren.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Flyt til emnet 'katalog'. Svarer til 'g (KATALOG)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Gĺ til emnet Top. Svarer til 'g Top'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Rul en side frem.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Rul en side tilbage.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Gĺ til starten af emnet.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Gĺ til enden af emnet.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Rul 1 linje frem.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Rul en linje tilbage.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Vćlg fřrste ... niende punkt i emnets menu.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Vćlg sidste punkt i emnets menu.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Sřg efter en angivet tekst i denne Info-fils indeksindgange,\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" og vćlg det emne, der refereres til af den fřrst fundne "
+"indgang.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Gĺ til emne angivet ved navn.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " Du kan ogsĺ medtage filnavn, som (FILNAVN)EMNENAVN.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Sřg fremad efter en given streng,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " og vćlg emne med den nćste forekomst.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Sřg baglćns efter en given streng\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Den nuvćrende sřgesti er:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Tilgćngelige kommandoer i infovinduer:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Tilgćngelige kommandoer i ekko-omrĺde:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Fřlgende kommandoer kan kun křres via %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Fřlgende kommandoer kan slet ikke křres:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Benyt '\\[history-node]' eller '\\[kill-node]' for at afslutte ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Vis hjćlp"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Besřg infoemnet '(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Vis dokumentation for TAST"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Beskriv tast: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s er ikke defineret."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s er ikke defineret."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s er defineret til %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Vis hvad der skal tastes, for at udfřre en given kommando"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Hvor er kommando: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "'%s' er ikke pĺ nogen taster"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s kan kun udfřres via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s kan udfřres via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Der er ingen funktion kaldet '%s'"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Der er INGEN garanti. Du mĺ redistribuere denne software\n"
+"under GNU General Public License's betingelser.\n"
+"For mere information om dette, se filerne 'COPYING'.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "ugyldigt antal parametre"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "can ikke ĺbne inddata-filen '%s'."
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "kan ikke oprette uddatafil '%s'"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "fejl under skrivning til '%s'"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "fejl under lukning af uddatafilen '%s'"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "nřglesekvens for lang"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "manglende nřglesekvens"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL-tegn (\\000) ikke tilladt"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL-tegn (^%c) ikke tilladt"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "mangler handlingsnavn"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "for langt afsnit"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "ukendt handling '%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "for langt handlingsnavn"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "ekstra tegn fřlger handlingen '%s'"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "manglende variabelnavn"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "mangler '=' umiddelbart efter variabelnavn"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "for langt variabelnavn"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "for lang vćrdi"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", linje %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Brug: %s [TILVALG]... [INDDATA-FIL]\n"
+"\n"
+"Oversćt en infokey-kildefil til en infokey-fil. Lćser INDDATA-FIL (som "
+"standard\n"
+"$HOME/.infokey) og skriver oversat fil til (som standard) $HOME/.info.\n"
+"\n"
+"Tilvalg:\n"
+" --output FILNAVN uddata til FILNAVN i stedet for $HOME/.info\n"
+" --help vis denne hjćlp og afslut.\n"
+" --version vis versionsoplysninger og afslut.\n"
+"\n"
+"Oversćt infokey-kildefil til infokey-fil. Lćser INDDATA-FIL (standard\n"
+"$HOME/.infokey) og skriver oversat key-fil til $HOME/.info.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ignorerer ugyldig infokey-fil '%s' - for lille"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ignorerer ugyldig infokey-fil '%s' - for stor"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Fejl under lćsning af infokey-fil '%s' - \"short read\""
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokey-fil '%s' (ugyldige magiske tal) -- křr infokey for at "
+"opdatere den"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "Din infokey-fil '%s' er for gammel -- křr infokey for at opdatere den"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokey-fil '%s' (ugyldig afsnitslćngde) -- křr infokey for at "
+"opdatere den"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokey-fil '%s' (ugyldig afsnitskode) -- křr infokey for at "
+"opdatere den"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Ugyldige data i infokey-fil -- visse tastebindinger blev ignoreret"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"Ugyldige data i infokey-fil -- visse variabelindstillinger blev ignoreret"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Indlćs navnet pĺ en info-kommando og beskriv den"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Beskriv kommando: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Indlćs et kommandonavn i ekko-omrĺdet og udfřr den"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Kan ikke udfřre en 'ekko-omrĺde'-kommando her."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "Ukendt kommando '%s'"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Sćt hřjden pĺ det viste vindue"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Sćt skćrmhřjden til (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Kildetekster gennemtrćvlet for at inkludere filen;\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Kunne ikke bearbejde filen %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Fil)Emne linjer Střrr. Indeholder fil\n"
+" ---------- ----- ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Her er menuen med emner, du har besřgt for nylig.\n"
+"Vćlg et fra denne menu eller brug '\\[history-node]' i et andet vindue,\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Opret et vindue med en menu, der indeholder alle nyligt besřgte emner"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Vćlg et emne, som tidligere har vćret besřgt i et synligt vindue"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Vćlg besřgt emne: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referencen forsvandt! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Velkommen til Info version %s. Skriv \\[get-help-window] for hjćlp. \\[menu-"
+"item] for menupunkt."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Gĺ ned til nćste linje"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Gĺ op til forrige linje"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Gĺ til linjeslutning"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Gĺ til linjestart"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Nćste"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Fřlger emnet Nćste..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Vćlger fřrste menupunkt..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Vćlger emnet 'Nćste'..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Gĺr 'Op' %d gang(e), derefter 'Nćste'."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Ikke flere emner i dette dokument."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Ingen 'Forrige' i dette emne."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Gĺr til 'Forrige' i dette vindue."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Ingen 'Forrige' eller 'Op' for dette emne i dette dokument."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Gĺr 'Op' i dette vindue."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Gĺr til 'Forrige's sidste menupunkt."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Gĺ frem eller ned gennem emne-strukturen"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Gĺ tilbage eller op gennem emne-strukturen"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Rul tilbage i vinduet"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "Rul frem i vinduet og sćt standard vinduesstřrrelse"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Rul frem i vinduet i samme emne"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr "Rul frem i vinduet i samme emne og sćt standard vinduesstřrrelse"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Rul tilbage i vinduet"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "Rul tilbage i vinduet og sćt standard vinduesstřrrelse"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Rul tilbage i vinduet indenfor samme emne"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Rul tilbage i vinduet indenfor samme emne og sćt standard vinduesstřrrelse"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Gĺ til starten af dette emne"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Gĺ til slutningen af dette emne"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Rul N linjer ned"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Rul N linjer op"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Rul en halv skćrmstřrrelse ned"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Rul en halv skćrmstřrrelse op"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Vćlg det nćste vindue"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Vćlg det forrige vindue"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Opdel nuvćrende vindue"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Slet nuvćrende vindue"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Kan ikke slette et permanent vindue"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Slet alle andre vinduer"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Rul det andet vindue"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Rul det andet vindue baglćns"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Forstřr (eller formindsk) dette vindue"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Fordel det tilgćngelige skćrmomrĺde mellem de synlige vinduer"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Vćlg/fravćlg linjeombrydning i nuvćrende vindue"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Vćlg emnet Nćste"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Vćlg emnet Forrige"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Vćlg emnet 'Op'"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Vćlg det sidste emne i filen"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Dette vindue har ingen yderligere emner"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Vćlg det fřrste emne i filen"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Vćlg det sidste punkt i emnets menu"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Vćlg dette menupunkt"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Der er ikke %d punkter i denne menu."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menupunkt (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menupunkt: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Fřlg krydsreference (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Fřlg krydsreference: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Indlćs et menupunkt og vćlg dets emne"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Indlćs en fodnote eller krydsreference og vćlg dets emne"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Flyt til starten af dette emnes menu"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Besřg sĺ mange menupunkter pĺ en gang, som det er muligt"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Indlćs et emnenavn og vćlg det"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Gĺ til emne: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Ingen menu i emne '%s'."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Intet menupunkt '%s' i emne '%s'."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Kunne ikke finde emnet, der refereres til af '%s' i '%s'."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Indlćs en liste med menuer, der starter i katalog, og fřlg dem"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Fřlg menuer: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Find emnet, der beskriver hvordan programmet startes"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Find programstart emne for [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Indlćs en man-side reference og vćlg den"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Hent man-side: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Vćlg emnet 'Top' i filen"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Vćlg emnet '(katalog)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Fjern emne (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Kan ikke fjerne emnet '%s'"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Kan ikke fjerne det sidste emne"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Vćlg det sidst valgt emne"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Fjern dette emne"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Indlćs et filnavn og vćlg det"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Find fil: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Kan ikke finde '%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Kunne ikke oprette uddatafil '%s'."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Fćrdig."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Skriver emnet %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr ""
+"Udskriv indholdet af dette emne (ved viderefřrsel gennem INFO_PRINT_COMMAND)"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Kan ikke ĺbne viderefřrsel til '%s'."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Udskriver emnet %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Leder efter underfilen %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Indlćs en tekst og sřg efter den uden versalfřlsomhed"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Indlćs en tekst og sřg for den"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Indlćs en tekst og sřg baglćns efter den"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%sefter tekst [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Sřg baglćns"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Sřg"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " versalfřlsomt"
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Sřgning mislykkedes."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Gentag sidste sřgning i samme retning"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Ingen tidligere sřgetekst"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Gentag sidste sřgning i modsat retning"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Sřg interaktivt efter en tekst, mens du skriver den"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-sřgning baglćns: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-sřgning: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Fejler "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Gĺ til foregĺende krydsreference"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Gĺ til nćste krydsreference"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Vćlg reference eller menupunkt, der optrćder pĺ denne linje"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Afbryd nuvćrende aktivitet"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Afslut"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Flyt markřr til bestemt linje i vinduet"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Gentegn skćrmen"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Afslut info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Křr kommandoen, der er bundet til denne tasts smĺbogstavs-variant"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Ukendt kommando (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" er ugyldig"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" er ugyldig"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Tilfřj dette tegn til det nuvćrende numeriske parameter"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Start (eller gang med 4) det nuvćrende numeriske parameter"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Bruges internt af \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Virtuel hukommelse opbrugt!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Nĺr \"On\", vises og skjules fodnoter automatisk"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Nĺr \"On\", ćndres střrrelsen pĺ andre vinduer, nĺr det vindues oprettes "
+"eller fjernes"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Nĺr \"On\", blinker skćrmen i stedet for at ringe med systemklokken"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Nĺr \"On\", vil fejl aktivere systemklokken"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Nĺr \"On\", vil info fjerne eventuelle afkomprimerede filer, den laver."
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Nĺr \"On\", vil trufne sřgestrenge blive markeret"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Bestemmer, hvad der sker, nĺr rulning forsřges ved slutning af et emne"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Antallet af linjer, der rulles, nĺr markřren flytter ud af vinduet"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Nĺr \"On\", vil Info benytte og vise ISO Latin tegn"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Forklar brugen af en variabel"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Beskriv variabel: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Sćt vćrdien af en Info-variabel"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Sćt variabel: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Sćt %s til vćrdien (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Sćt %s til vćrdien (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Mćrker (tags) er forćldede ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), linjer ---, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d linjer -%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d linjer -%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Underfil: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: tilvalg '%s' er flertydig\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: tilvalg '--%s' tillader ikke en parameter\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: tilvalg '%c%s' tillader ikke en parameter\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: tilvalg '%s' krćver en parameter\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ukendt tilvalg '--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ukendt tilvalg '%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ugyldigt tilvalg -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ugyldigt tilvalg -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: tilvalg krćver en parameter -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: tilvalg '-W %s' er flertydigt\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: tilvalg '-W %s' tillader ikke en parameter\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "Ugyldigt argument til %c%s"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "januar"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "februar"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "marts"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "april"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "maj"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "juni"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "juli"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "august"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "september"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "oktober"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "november"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "december"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "usandsynligt tegn %c i @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc parameter er kun versaler, derfor ingen virkning"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "'{' forventedes, men fandt '%c'"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "filslutning inden i en verb-blok"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "'}' forventedes, men fandt '%c'"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s er forćldet"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp krćver et positivt tal, ikke '%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Ugyldigt argument til %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "Ugyldigt argument til %c%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Manglende '}' i @def parameter"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funktion"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Specialform"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variabel"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Brugerfunktion"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instansvariabel"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metode"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "for"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "pĺ"
+
+#: makeinfo/defun.c:711
+#, fuzzy, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Skal vćre i '%s' indsćtning for at bruge '%sx'"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "'%c%s' krćver en parameter i '{...}', ikke blot '%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Ingen slutparentes for fodnote '%s'"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Fodnote defineret uden forćldre-emne"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Fodnoter indeni fodnoter er ikke tilladt"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Fodnoter"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Uden titel"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[uventet] ingen html-mćrker at \"pop\"'e"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[uventet] ugyldigt emnenavn: '%s'"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Ukendt indeks '%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info kan ikke hĺndtere ':' i indeksindgangen '%s'"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Indeks '%s' eksisterer allerede"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Ukendt indeks '%s' og/eller '%s' i @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Ukendt indeks '%s' i @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Indgang til indeks '%s' udenfor et emne"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(udenfor et emne)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Se "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Broken-Type i insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Overlřb i optćllingsstak (enumeration stack)"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "bogstavsoverlřb, genstarter ved %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s krćver en parameter: formatteringen for %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "'@end' forventede '%s', men fandt '%s'"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Mangler en tilsvarende '%cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s krćver et bogstav eller ciffer"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "filslutning indeni en verbatim-blok"
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s giver ingen mening i en '@%s'-blok"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu fundet fřr fřrste @node, opretter 'Top' emne"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "mĺske skulle dit @top emne indsćttes i @ifnottex i stedet for @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu fundet fřr fřrste emne, opretter emnet 'Top'"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s giver ingen mening i en '@%s'-blok"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Uparret '%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "'%c%s' krćver noget efterfřlgende"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Ugyldigt parameter '%s', '%s', benytter '%s'"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s giver ingen mening i en '@%s'-blok"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx giver ingen mening i en '%s'-blok"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s fundet udenfor en indsćtningsblok"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s er ikke en gyldig ISO 639 sprogkode"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "ukendt indkodningsnavn '%s'"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "beklager, indkodningen '%s' understřttes ikke"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "ugyldig indkodet tegn '%s'"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s krćver 'i' eller 'j' som parameter, ikke '%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s krćver et enkelt tegn 'i' eller 'j' som parameter"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makro '%s' er allerede defineret"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "her er den forrige definition af '%s'"
+
+#: makeinfo/macro.c:355
+#, fuzzy, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "\\ i makroudfoldelse fulgt af '%s' i stedet for \\ eller parameternavn"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makro '%s' kaldt pĺ linje %d med for mange parametre"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend makro ikke fundet"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg kan kun bruges til makroer med et enkelt parameter"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "uparret @end %s med @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "For mange fejl! Gav op.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: advarsel: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Fejlplaceret %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Prřv '%s --help' for mere information.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Brug: %s [TILVALG]... TEXINFO-FIL...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Oversćt Texinfo kildedokumentation til flere andre formater, som standard "
+"til\n"
+"Info-filer, der er lavet til at blive lćst pĺ skćrmen med Emacs eller GNU "
+"Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Generelle tilvalg:\n"
+" --error-limit=ANTAL afbryd efter ANTAL fejl (standard %d).\n"
+" --force bevar uddata selvom der opstĺr fejl.\n"
+" --help vis denne hjćlp og afslut.\n"
+" --no-validate undertryk validering af emne-krydsreferencer.\n"
+" --no-warn undertryk advarsler (men ikke fejl).\n"
+" --reference-limit=ANTAL advar hřjst om ANTAL referencer (standard %"
+"d).\n"
+" -v, --verbose forklar, hvad der sker.\n"
+" --version vis versionsoplysninger og afslut.\n"
+
+#: makeinfo/makeinfo.c:364
+#, fuzzy, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Valg af format pĺ uddata (ellers laves Info):\n"
+" --docbook lav DocBook XML i stedet for Info.\n"
+" --html lav HTML i stedet for Info.\n"
+" --xml lav Texinfo XML i stedet for Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Generelle uddatatilvalg:\n"
+" -E, --macro-expand FIL send makroekspanderet kildetekst til FIL.\n"
+" ignorér eventuelle @setfilename.\n"
+" --no-headers undertryk emneadskillere, Node:­linjer og menuer\n"
+" fra Infos uddata (og lav dermed simpel tekst)\n"
+" og skriv som udgangspunkt til standard-ud."
+"n --no-split undertryk opdeling af Info eller HTML-uddata,\n"
+" lav kun én uddatafil.\n"
+" --number-sections lav afsnits- og sektionsnumre.\n"
+" -o, --output=FILE send til FIL (katalog i tilfćldet opdelt HTML),\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Tilvalg for Info og ren tekst:\n"
+" --enable-encoding konstruér specialtegn i Infouddata i henhold "
+"til\n"
+" @documentencoding.\n"
+" --fill-column=ANTAL opdel Info-linjer ved ANTAL tegn (standard %"
+"d).\n"
+" --footnote-style=STIL vis fodnoter i Info med valgt STIL:\n"
+" `separate' for at placere dem i deres eget "
+"emne;\n"
+" `end' for at placere dem i slutningen af det "
+"emne,\n"
+" de er defineret(standard).\n"
+" --paragraph-indent=ANTAL indryk Info-afsnit med ANTAL mellemrum "
+"(standard %d).\n"
+" Hvis ANTAL er 'none' indrykkes ikke. Hvis "
+"ANTAL er\n"
+" `asis', bevares eksisterende indrykning.\n"
+" --split-size=ANTAL opdel Info-filer ved střrrelsen ANTAL "
+"(standard %d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+#, fuzzy
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Inddata-tilvalg:\n"
+" --commands-in-node-names tillad @-kommandoer i emnenavne.\n"
+" -D VAR definér variablen VAR som med @set.\n"
+" -I KATALOG tilfřj KATALOG til @include-sřgestien.\n"
+" -P KATALOG indsćt KATALOG forrest i @include-"
+"sřgestien.\n"
+" -U VAR afdefinér variablen VAR som med @clear.\n"
+
+#: makeinfo/makeinfo.c:425
+#, fuzzy
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Betinget behandling i inddata:\n"
+" --ifhtml behandl @ifhtml og @html selvom der ikke laves HTML.\n"
+" --ifinfo behandl @ifinfo-tekst selvom der laves HTML.\n"
+" --ifplaintext behandl @ifplaintext selvom der ikke laves ren tekst.\n"
+" --iftex behandl @iftex og @tex; underforstĺr --no-split.\n"
+" --ifxml behandl @ifxml og @xml.\n"
+" --no-ifhtml behandl ikke @ifhtml og @html-tekst.\n"
+" --no-ifinfo behandl ikke @ifinfo-tekst.\n"
+" --no-ifplaintext behandl ikke @ifplaintext-tekst.\n"
+" --no-iftex behandl ikke @iftex og @tex-tekst.\n"
+" --no-ifxml behandl ikke @ifxml og @xml-tekst.\n"
+
+#: makeinfo/makeinfo.c:444
+#, fuzzy
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Standarden for @if... betingelser afhćnger af uddataformatet:\n"
+" hvis der laves HTML, er --ifhtml aktiveret, mens de andre er "
+"deaktiverede;\n"
+" hvis der laves Info er --ifinfo aktiveret og de andre er deaktiverede;\n"
+" hvis der laves ren tekst er --ifplaintext aktiveret og de andre "
+"deaktiverede.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Eksempler:\n"
+" makeinfo xxx.texi skriv Info til xxx's @setfilename\n"
+" makeinfo --html xxx.texi skriv HTML til @setfilename\n"
+" makeinfo --xml xxx.texi skriv Texinfo XML til @setfilename\n"
+" makeinfo --no-headers -o - xxx.texi skriv simpel tekst til standard-ud\n"
+"\n"
+" makeinfo --html --noheaders xxx.texi skriv html uden emnelinjer og menuer\n"
+" makeinfo --number-sections xxx.texi skriv Info med nummererede afsnit\n"
+" makeinfo --no-split xxx.texi skriv én Info-fil, uanset střrrelsen\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s parameter skal vćre et tal, ikke '%s'.\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Kunne ikke ĺbne makroudfoldelses-uddata '%s'"
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "Kunne ikke ĺbne makroudfoldelses-uddata '%s'"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: --paragraph-indent parameter skal vćre tal/'none'/'asis', ikke '%s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: --footnote-style parameter skal vćre 'separate' eller 'end', ikke '%s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: mangler filparameter.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Forventede '%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Kan ikke oprette kataloget '%s': %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Ingen '%s' fundet i '%s'"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Undlader makroudfoldelse til standard-ud, da Info-uddata sendes der.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Producerer %s file '%s' ud fra '%s'.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Dette er %s, produceret med makeinfo version %s ud fra %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Fjerner makro uddatafil '%s' grundet fejl; brug --force for at beholde.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Fjerner uddatafil '%s' grundet fejl; brug --force for at beholde.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Ukendt kommando '%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Benyt parenteser for at angive en kommando som parameter til @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s forventede '{...}'"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Uparret }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "INTET_NAVN!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s mangler hřjre parentes"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image-fil '%s' (for HTML) er ulćselig: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "Ingen '%s' fundet i '%s'"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image-fil '%s' (for tekst) er ulćselig: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image mangler filnavnsparameter"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Ingen vćrdi for '%s'}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s krćver et navn"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Nĺede filslutning fřr samhřrende @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' er for langt til ekspansion; blev ikke ekspanderet"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Manglende } i @multitable skabelon"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ignorerer vildfaren tekst '%s' efter @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "For mange sřjler i 'multitable' element (maks %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[uventet] Kan ikke vćlge kolonne %d i 'multitable'"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "ignorerer @tab udenfor 'multitable'"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Flerkolonne uddata fra sidste rćkke:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolonne %d: uddata = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Emne '%s' er tidligere defineret pĺ linje %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Formatterer emne %s...\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Emne '%s' krćver en sektionsopdelende kommando (f.eks. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Intet emnenavn angivet for '%c%s'-kommandoen"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Mĺl '%s' og emne '%s' ender med at have samme filnavn"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "Denne @anchor-kommando er ignoreret; referencer til den vil ikke virke"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Omdřb dette mĺl eller brug tilvalget '--no-split'"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Uventet streng i slutningen af opdelt HTML-fil '%s'"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Nćste:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Forrige:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Op:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Mĺlene '%s' og '%s' ender med at have samme filnavn"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "@anchor-kommandoen ignoreres. Referencer til den vil ikke fungere"
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s reference til ikke-eksisterende emne '%s'"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Menu"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Kryds"
+
+#: makeinfo/node.c:1447
+#, fuzzy, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr "'Nćste'-felt i emne '%s' blive ikke peget pĺ"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Dette emne (%s) har den ugyldige 'Forrige'"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Forrige"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Feltet 'Forrige' i emne '%s' bliver ikke peget pĺ"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Dette emne (%s) har den ugyldige 'Nćste'-felt"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Op"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"Emnet '%s' mangler menupunkt for '%s' pĺ trods af at det er dens 'Op'-mĺl"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "emne '%s' blev refereret %d gange"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "ikke-refereret emne '%s'"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Kan ikke oprette kataloget '%s': %s"
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "Appendiks %c "
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Intern fejl (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Intern fejl (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s er forćldet; benyt i stedet %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Emne med %ctop som sektion eksisterer allerede"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Her er %ctop-emnet"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop benyttet fřr %cnode, benytter forvalget %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Indhold"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Kort indhold"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image-fil '%s' er ulćselig: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: advarsel: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " for %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tPrřv '%s --help' for en komplet tilvalgsliste.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Brug: %s [TILVALG]... [INFOFIL [KATALOGFIL]]\n"
+"\n"
+"Installér eller slet katalogindgange fra INFOFIL i Info katalogfilen\n"
+"KATALOGFIL.\n"
+"\n"
+"Tilvalg:\n"
+" --delete slet eksisterende indgange til INFOFIL fra KATALOGFIL;\n"
+" tilfřj ikke nye indgange.\n"
+" --dir-file=NAVN angiv navn pĺ Info katalogfil.\n"
+" Dette svarer til at bruge KATALOGFIL parameteren.\n"
+" --entry=TEKST tilfřj TEKST som en Info katalogindgang.\n"
+" TEKST skal vćre formateret som en Info menupunkts-\n"
+" linje plus nul eller flere ekstra linjer, der starter\n"
+" med mellemrum.\n"
+" Hvis du angiver flere indgange, tilfřjes de alle.\n"
+" Hvis du ingen indgange angiver, bestemmes de ud fra\n"
+" informationerne i selve Info-filen.\n"
+" --help vis denne hjćlp og afslut.\n"
+" --info-file=FIL angiv Info-fil, der skal indsćttes i kataloget.\n"
+" Dette svarer til at bruge INFOFIL parameteren.\n"
+" --info-dir=KATALOG svarer til --dir-file=KATALOG/katalog.\n"
+" --item=TEKST svarer til --entry TEKST.\n"
+" Et Info-katalog er i virkeligheden et menupunkt.\n"
+" --quiet undlad advarsler.\n"
+" --remove svarer til --delete.\n"
+" --section=SEK put denne fil's indgange i katalogets sektion SEK.\n"
+" Hvis du angiver flere sektioner, tilfřjes samtlige\n"
+" indgangene til alle sektionerne.\n"
+" Hvis du ingen sektioner angiver, bestemmes de ud fra\n"
+" informationerne i selve Info-filen.\n"
+" --version vis denne versions-information og afslut.\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Dette er filen .../info/dir, som indeholde det řverste\n"
+"emne i Info-hierakiet, kaldet (katalog)Top.\n"
+"Fřrste gang, du křrer Info, vil du indledningsvist se dette emne.\n"
+"\n"
+"%s\tDette er toppen af INFO-trćet\n"
+"\n"
+" Dette (katalog emnet) indeholder en menu med hovedemner.\n"
+" Afslut med \"q\", \"?\" viser alle Info-kommandoer, \"d\" returnerer "
+"hertil,\n"
+" \"h\" introducerer nybegyndere for Info,\n"
+" \"mEmacs<Return>\" besřger Emacs-manualen, osv.\n"
+"\n"
+" I Emacs kan du klikke med museknap 2 pĺ et menupunkt eller krydsreference\n"
+" for at vćlge den.\n"
+"\n"
+"* Menu:\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: kunne ikke lćse (%s) og kunne ikke oprette (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: tom fil"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY uden tilhřrende END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY uden tilhřrende START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Angiv kun Info-filen én gang.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "overskydende kommandolinjeparameter '%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Ingen inddatafil angivet; prřv --help for mere information."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Intet katalog angivet; prřv --help for mere information."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "ingen infokatalog-indgang i '%s'"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "menupunkt '%s' eksisterer allerede i filen '%s'"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "ingen indgange fundet for '%s'; intet slettet"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "viser denne hjćlp og afslutter"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "efterlad midlertidige filer"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "efterlad ikke midlertidige filer (standard)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "send uddata til FIL"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "vis versions-information og afslut"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Brug: %s [TILVALG]... FIL...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Opret et ordnet indeks for hver TeX uddata-FIL.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "Normalt angives FIL... som 'xxx.%c%c' for dokumentet 'xxx.texi'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Tilvalg:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: ikke en texinfo indeksfil"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "kunne ikke ĺbne %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Intet sidenummer i %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "indgang %s fřlger en indgang med et sekundćrt navn"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Angiv kun Info-kataloget én gang.\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" er ugyldig"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s er en ugyldig ISO-kode, bruger %c"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Kan ikke angive mere end én makroudfoldelses-uddata"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "Filen eksisterer, men er ikke et katalog"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Fřrste parameter i krydsreferencen mĺ ikke vćre tom"
+
+#~ msgid "see "
+#~ msgstr "se "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "en krydsreference mĺ efterfřlges af '.' eller ',', ikke %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "Fřrste parameter i @inforef mĺ ikke vćre tom"
+
+#~ msgid "Node:"
+#~ msgstr "Emne:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: 'Indhold' burde vćre her, men blev ikke fundet"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "virtuel hukommelse opbrugt"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "Ingen `%s.png' eller `.jpg', og ingen filendelse angivet"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s; for filen '%s'.\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "'%s' har intet 'Op'-felt"
+
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr "\\%-10[scroll-forward] Rul 1 linje frem.\n"
+
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "\\%-10[scroll-backward] Rul en linje tilbage.\n"
diff --git a/Build/source/utils/texinfo/po/de.gmo b/Build/source/utils/texinfo/po/de.gmo
new file mode 100644
index 00000000000..af525d76fe9
--- /dev/null
+++ b/Build/source/utils/texinfo/po/de.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/de.po b/Build/source/utils/texinfo/po/de.po
new file mode 100644
index 00000000000..9049e5066b2
--- /dev/null
+++ b/Build/source/utils/texinfo/po/de.po
@@ -0,0 +1,3267 @@
+# German messages for GNU Texinfo
+# Copyright Š 2004 Free Software Foundation, Inc.
+# Michael Piefel <piefel@informatik.hu-berlin.de>, 2001, 2002, 2003, 2004.
+# Karl Eichwalder <ke@gnu.franken.de>, 1999, 2000.
+# Karl Eichwalder <ke@suse.de>, 1997, 1998, 1999.
+# Karl Eichwalder <ke@ke.Central.DE>, 1996.
+#
+# 2004-03-31
+# Along with this new update, I changed the quotes to
+# „German“ as opposed to »French« quotes.
+# MPi
+#
+# 2003-06-01
+# All translations revised for current CVS.
+# wl
+#
+# 2001-05-14
+# Update: version 4.0b
+# MPi
+#
+# 2000-02-28 08:25:03 CET
+# In HTML output, change 8bit characters to SGML entities (ß -> &szlig;, etc.)
+# Reported by Thomas Esken, 1999-09-13.
+# -ke-
+#
+# 1999-10-07 20:56:42 CEST
+# Update: version 4.0
+# -ke-
+#
+# 1999-08-18 07:48:14 CEST
+# Update: version 3.12q.
+# -ke-
+#
+# 1999-07-28 08:56:22 CEST
+# Update: version 3.12n.
+# -ke-
+#
+# 1999-04-20 21:51:54 CEST
+# Update: version 3.12h.
+# reuse getopt translations from wget.
+# -ke-
+#
+# 1999-02-06 20:24:24 MET
+# Update: version 3.12c.
+# -ke-
+#
+# 1998-05-03 12:25:13 MEST
+# Cosmetic changes.
+# -ke-
+#
+# 1998-04-05 18:25:42 MEST
+# Hints by "Carl Friedrich Spilcke-Liss" <carl-friedriech.spilcke-liss@ensae.fr>.
+# -ke-
+#
+# 1998-02-28 14:29:49 MET
+# Revised for 3.11b
+# I refuse to translate getopt.c strings.
+# -ke-
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.91\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-13 11:53 +0100\n"
+"Last-Translator: Michael Piefel <piefel@informatik.hu-berlin.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Ein Zeichen vorgehen"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Ein Zeichen zurĂźckgehen"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Zum Anfang dieser Zeile bewegen"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Zum Ende dieser Zeile bewegen"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Ein Wort vorgehen"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Ein Wort zurĂźckgehen"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Das Zeichen unter dem Cursor lĂśschen"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Das Zeichen links vom Cursor lĂśschen"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Operation abbrechen oder beenden"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Akzeptiere diese Zeile (oder erzwinge ihre Vervollständigung)"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Das nächste Zeichen wÜrtlich eingeben"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Dieses Zeichen eingeben"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Ein Tabulator-Zeichen eingeben"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Zeichen an momentaner Position umstellen"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "FĂźge den Inhalt des letzten LĂśschvorgangs ein"
+
+# IMO muss "kill" auch im Folgenden wĂśrtlich Ăźs werden -ke-
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Der LĂśsch-Ring ist leer"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "FĂźge Inhalt eines vorangegangenen LĂśschvorgangs ein"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Bis zum Ende der Zeile lĂśschen"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Bis zum Anfang der Zeile lĂśschen"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Das dem Cursor folgende Wort lĂśschen"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Das dem Cursor vorangehende Wort lĂśschen"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Keine Vervollständigungen"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Nicht vollständig"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "MÜgliche Vervollständigungen auflisten"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Einzige Vervollständigung"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Eine Vervollständigung:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d Vervollständigungen:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Vervollständigung einfßgen"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Vervollständigungen werden erstellt..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Im Vervollständigungs-Fenster blättern"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Fußnoten können nicht angezeigt werden"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr ""
+"Zeige die zu diesem Knoten gehörenden Fußnoten in einem anderen Fenster"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Fußnoten ----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Eine Zeichenkette im Index dieser Datei suchen"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Index-Einträge werden gesucht..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Keine Indizes gefunden."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Index-Eintrag: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Zum nächsten übereinstimmenden Index-Eintrag vom letzten „\\[index-search]“-"
+"Befehl gehen"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Keine vorherige zu suchende Index-Zeichenkette."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Keine Index-Einträge."
+
+# checkit
+# kann im Deutschen nachgebildet werden, aber... -ke-
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Keine %sindex-Einträge enthalten „%s“."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "weiteren "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "DIES IST NICHT ZU SEHEN"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "„%s“ in %s gefunden. (Nächster Eintrag mit „\\[next-index-match]“.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Indizes von „%s“ werden durchsucht..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Keine der verfügbaren Info-Dateien hat „%s“ in ihren Indizes."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Alle bekannten Info-Datei-Indizes nach einer Zeichenkette durchsuchen\n"
+" und ein MenĂź erstellen"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Index-Apropos: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menü: Knoten, deren Indizes „%s“ enthalten:\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "„--help“ gibt weitere Informationen.\n"
+
+# Hier de-Standard-Formulierung einsetzen!
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Es gibt KEINERLEI Garantie. Sie kĂśnnen diese Software unter den\n"
+"Bedingungen der GNU General Public License weiterverteilen.\n"
+"FĂźr weiterfĂźhrende Informationen zu diesen Fragen\n"
+"konsultieren Sie bitte die Datei namens COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "Keine Indexeinträge für „%s“ gefunden\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr " -b, --speech-friendly zu Sprachsynthesizern freundlich sein.\n"
+
+# Die "." am Zeilenende habe ich entfernt. -ke-
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Aufruf: %s [OPTION]... [INFO-DATEI [MENU-EINTRAG...]]\n"
+"\n"
+"Zum Lesen von Dokumentation, die im Info-Format vorliegt.\n"
+"\n"
+"Optionen:\n"
+" --apropos=ZKETTE ZKETTE in allen Indizes sämtlicher Info-Dateien\n"
+" suchen\n"
+" -d, --directory=VERZ VERZ dem INFOPATH hinzufĂźgen\n"
+" --dribble=DATEI Tasteneingaben des Nutzers in DATEI merken\n"
+" -f, --file=DATEI zu besuchende Info-DATEI angeben\n"
+" -h, --help diese Hilfe anzeigen\n"
+" --index-search=KETTE zu einem Knoten gehen, auf den der Indexeintrag\n"
+" KETTE zeigt\n"
+" -n, --node=KNOTEN Knoten in der ersten zu besuchenden Info-Datei\n"
+" angeben\n"
+" -o, --output=DATEI ausgewählte Knoten nach DATEI ausgeben\n"
+" -R, --raw-escapes „rohe“ ANSI-Escapes ausgeben (Voreinstellung)\n"
+" --no-raw-escapes Escapes als wĂśrtlichen Text ausgeben\n"
+" --restore=DATEI die beginnenden Tasteneingaben von DATEI lesen\n"
+" -O, --show-options, --usage\n"
+" zum Knoten mit den Optionen fĂźr den "
+"Befehlsaufruf\n"
+" gehen\n"
+"%s --subnodes Menßeinträge rekursiv ausgeben\n"
+" -w, --where, --location physischen Ort des Info-Datei anzeigen\n"
+" --vi-keys Tastenbindungen ähnlich zu vi und less benutzen\n"
+" --version Programmversion anzeigen\n"
+"\n"
+"Der erste Parameter, der keine Option ist, ist der MenĂźeintrag, von dem aus\n"
+"gestartet werden soll; nach diesem Menüeintrag wird in allen „dir“-Datei\n"
+"gemäß dem INFOPATH gesucht.\n"
+"Wird kein Menüeintrag angegeben, packt info alle „dir“-Dateien zusammen\n"
+"und zeigt das Ergebnis an.\n"
+"Verbleibende Parameter werden als Namen von Menßeinträgen des ersten zu\n"
+"besuchenden Knotens angesehen.\n"
+"\n"
+"Beispiele:\n"
+" info das oberste „dir“-Menü anzeigen\n"
+" info emacs beim emacs-Knoten im obersten „dir“-Menü "
+"beginnen\n"
+" info emacs buffers beim buffers-Knoten im emacs-Manual beginnen\n"
+" info --show-options emacs beim Knoten mit den emacs-Kommandozeilen-"
+"Optionen\n"
+" beginnen\n"
+" info -f ./foo.info datei ./foo.info anzeigen\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Fehlerberichte (auf Englisch, mit LC_ALL=C) per E-Mail an bug-texinfo@gnu."
+"org\n"
+"schicken, allgemeine Fragen und Gedankenaustausch an help-texinfo@gnu.org.\n"
+"Texinfos Homepage: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Knoten „%s“ nicht gefunden."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Knoten „(%s)%s“ nicht gefunden."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Kein Fenster gefunden!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Momentane Position erscheint nicht in dem Knoten dieses Fensters!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Kann das letzte Fenster nicht lĂśschen!"
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Kein MenĂź in diesem Knoten."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Keine Fußnoten in diesem Knoten."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Keine Querverweise in diesem Knoten."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Kein „%s“-Verweis für diesem Knoten."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Unbekannter Info-Befehl „%c“. „?“ eingeben, um Hilfe zu bekommen."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Der Terminaltyp „%s“ ist nicht fähig genug, um Info auszuführen."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Sie sind bereits auf der letzten Seite dieses Knotens."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Sie sind bereits auf der ersten Seite dieses Knotens."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Nur ein Fenster."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Das entstehende Fenster wäre zu klein."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Nicht genĂźgend Platz fĂźr ein Hilfefenster. Bitte ein Fenster lĂśschen."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Grundbefehle in Info-Fenstern\n"
+"*****************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Diese Hilfe verlassen. \n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Info gänzlich beenden.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Das Info-Tutorial aufrufen.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Andere Knoten wählen:\n"
+"---------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr ""
+"\\%-10[next-node] Zum nächsten Knoten („next“) dieses Knotens gehen.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr ""
+"\\%-10[prev-node] Zum vorherigen Knoten („prev“) dieses Knotens gehen.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Von diesem Knoten aus aufwärts („up“) gehen.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Einen Menßeintrag nach dem Namen auswählen.\n"
+" Auswahl eines MenĂźeintrags fĂźhrt zu Auswahl eines anderen\n"
+" Knotens.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Einem Querverweis folgen. Liest den Namen des Verweises.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Zum letzten in diesem Fenster schon besuchten Knoten "
+"gehen.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Zur nächsten Verknßpfung auf dieser Seite "
+"springen.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Zur vorigen VerknĂźpfung auf dieser Seite "
+"springen.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Der VerknĂźpfung unter dem Cursor "
+"folgen.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Zum „directory“-Knoten springen. Das gleiche wie „\\[goto-"
+"node] (DIR)“.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Zum obersten Knoten springen. Das gleiche wie „\\[goto-"
+"node] Top“.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Bewegung innerhalb eines Knotens:\n"
+"---------------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Zum Anfang dieses Knotens gehen.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Zum Ende dieses Knotens gehen.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Eine Zeile vorblättern.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Eine Zeile zurßckblättern.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Eine Seite vorblättern.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Eine Seite zurßckblättern.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Weitere Befehle:\n"
+"----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] Ersten ... neunten Eintrag aus dem MenĂź des Knotens "
+"wählen.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr ""
+"\\%-10[last-menu-item] Letzten Eintrag aus dem Menß des Knotens wählen.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Eine Zeichenkette in den Indexeintägen dieser Info-"
+"Datei\n"
+" suchen und zu dem Knoten springen, auf den der erste\n"
+" gefundene Eintrag verweist.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Knoten nach Namen auswählen und dorthin springen. Ein\n"
+" Dateiname kann mit angegeben werden, also (DATEI)KNOTENNAME.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Angegebene Zeichenkette in Vorwärtsrichtung suchen und den\n"
+" Knoten wählen, in dem der nächste Eintrag gefunden wurde.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Angegebene Zeichenkette in Rßckwärtsrichtung "
+"suchen\n"
+" und den Knoten wählen, in dem der nächste Eintrag gefunden\n"
+" wurde.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Diese Hilfe verlassen.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Info gänzlich beenden.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Das Info-Tutorial aufrufen.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Zum nächsten Knoten („next“) dieses Knotens gehen.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Zum vorherigen Knoten („prev“) dieses Knotens gehen.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Von diesem Knoten aus aufwärts („up“) gehen.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Einen Menßeintrag nach dem Namen auswählen.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" Auswahl eines MenĂźeintrags fĂźhrt zu Auswahl eines anderen\n"
+" Knotens.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Einem Querverweis folgen. Liest den Namen des Verweises.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Zum letzten in diesem Fenster gezeigten Knoten gehen.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Zur nächsten Verknßpfung auf dieser Seite springen.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Der VerknĂźpfung unter dem Cursor folgen.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Zum „directory“-Knoten springen. Das gleiche wie „g (DIR)“.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Zum „Top“-Knoten springen. Das gleiche wie „g Top“.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Eine Seite vorblättern.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Eine Seite zurßckblättern.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Zum Anfang dieses Knotens gehen.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Zum Ende dieses Knotens gehen.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Eine Zeile vorblättern.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Eine Zeile zurßckblättern.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Ersten ... neunten Eintrag aus dem Menß des Knotens wählen.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Letzten Eintrag aus dem Menß des Knotens wählen.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Eine Zeichenkette in den Indexeinträgen dieser Info-Datei suchen\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" und zu dem Knoten springen, auf den der erste gefundene\n"
+" Eintrag verweist.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Knoten nach Namen auswählen und dorthin springen. Ein\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Dateiname kann mit angegeben werden, also (DATEI)KNOTENNAME.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr ""
+" %-10s Angegebene Zeichenkette in Vorwärtsrichtung suchen und den Knoten\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " wählen, in dem der nächste Eintrag gefunden wurde.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Angegebene Zeichenkette in Rßckwärtsrichtung suchen\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Der momentane Suchpfad ist:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Befehle, die in Info-Fenstern verfĂźgbar sind:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Befehle, die im Echo-Bereich verfĂźgbar sind:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Die folgenden Befehle kĂśnnen nur durch %s aufgerufen werden:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Die folgenden Befehle kĂśnnen Ăźberhaupt nicht aufgerufen werden:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- „\\[history-node]“ oder „\\[kill-node]“ benutzen, um zu beenden ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Diesen Hilfe-Text anzeigen"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Info-Knoten „(info)Help“ besuchen"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Dokumentation fĂźr KEY ausgeben"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Beschreibe Taste: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s ist nicht definiert."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s ist nicht definiert."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s ist definiert als %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Anzeigen, was einzugeben ist, um einen gegebenen Befehl auszufĂźhren"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Wo ist der Befehl: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "Keine Taste mit „%s“ belegt"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s kann nur durch %s aufgerufen werden."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s kann durch %s aufgerufen werden."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Es gibt keine Funktion mit Namen „%s“"
+
+# Hier de-Standard-Formulierung einsetzen!
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright Š %s Free Software Foundation, Inc.\n"
+"Es gibt KEINERLEI Garantie. Sie kĂśnnen diese Software unter den\n"
+"Bedingungen der GNU General Public License weiterverteilen.\n"
+"FĂźr weiterfĂźhrende Informationen zu diesen Fragen\n"
+"konsultieren Sie bitte die Datei namens COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "falsche Anzahl von Argumenten"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "Eingabedatei „%s“ kann nicht geöffnet werden."
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "Ausgabedatei „%s“ kann nicht angelegt werden."
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "Fehler beim Schreiben von „%s“."
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "Fehler beim Schließen der Ausgabedatei „%s“."
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "Tastenkombination zu lang."
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "Fehlende Tastenkombination."
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL-Zeichen (\\000) nicht erlaubt."
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL-Zeichen (^%c) nicht erlaubt."
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "Fehlender Befehlsname."
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "Abschnitt zu lang."
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "Unbekannter Befehl „%s“."
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "Befehlsname zu lang."
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "Extrazeichen folgen Befehl „%s“."
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "Dateiname fehlt."
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "Fehlendes „=“ direkt hinter Variablenname."
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "Variablenname zu lang"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "Wert zu lang"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "„%s“, Zeile %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Aufruf: %s [OPTION]... [EINGABE-DATEI]\n"
+"\n"
+"Infokey-Quelldatei in Infokey-Datei kompilieren. Liest EINGABE-DATEI\n"
+"(Voreinstellung $HOME/.infokey) und schreibt kompilierte Tastaturdatei\n"
+"(per Voreinstellung) nach $HOME/.info.\n"
+"\n"
+"Optionen:\n"
+" --output DATEINAME in DATEINAME statt in $HOME/.info ausgeben\n"
+" --help diese Hilfe anzeigen und beenden\n"
+" --version Versionsnummer anzeigen und beenden\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ungültige Info-Schlüssel-Datei „%s“ wird ignoriert - zu klein"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ungültige Info-Schlüssel-Datei „%s“ wird ignoriert - zu groß"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Fehler beim Lesen der Infokey-Datei „%s“ - zu kurzes Lesen"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Ungültige Infokey-Datei „%s“ (fehlerhafte Signatur) -- bitte mit infokey "
+"erneuern"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "Ihre Infokey-Datei „%s“ ist veraltet -- bitte mit infokey erneuern"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Ungültige Infokey-Datei „%s“ (fehlerhafte Abschnittslänge) -- bitte mit "
+"infokey erneuern"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Ungültige Infokey-Datei „%s“ (fehlerhafter Abschnittscode) -- bitte mit "
+"infokey erneuern"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+"Fehlerhafte Daten in Infokey-Datei -- einige Tastaturbindungen ignoriert"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"Fehlerhafte Daten in Infokey-Datei -- einige Variableneinstellungen ignoriert"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Namen eines Info-Befehls lesen und beschreiben"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Beschreibe den Befehl: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Einen Befehlsnamen im Echo-Bereich lesen und ausfĂźhren"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Befehl fĂźr Echo-Bereich hier nicht ausfĂźhrbar."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "Undefinierter Befehl: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "HĂśhe des angezeigten Fensters setzen"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Setze Bildschirm-HĂśhe auf (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Quelldateien durchsucht, damit diese Datei enthält:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Datei „%s“ ist nicht veränderbar.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* MenĂź:\n"
+" (Datei)Knoten Zeilen Größe Beinhaltet Datei\n"
+" ------------- ------ ----- ----------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Hier ist das MenĂź der Knoten, die zuletzt besucht wurden.\n"
+"Einen Eintrag auswählen oder „\\[history-node]“ in einem anderen Fenster\n"
+"benĂźtzen.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Ein Fenster mit einem MenĂź aller aktuell besuchten Knoten erzeugen"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr ""
+"Einen Knoten auswählen, der zuvor in einem sichtbaren Fenster\n"
+" besucht wurde"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Wähle besuchten Knoten aus: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Der Verweis ist verschwunden! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Willkommen bei Info (Version %s). „\\[get-help-window]“ eingeben für Hilfe, "
+"„\\[menu-item]“ für Menüeintrag."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Eine Zeile nach unten bewegen"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Eine Zeile nach oben bewegen"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Zum Ende dieser Zeile bewegen"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Zum Anfang der Zeile bewegen"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "nächstes"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Folge „nächsten“ (Next) Knoten..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Wähle ersten Menßeintrag aus..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Wähle „nächsten“ (Next) Knoten aus..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Bewege %d mal „aufwärts“ (Up), dann „nächstes“ (Next)."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Keine weiteren Knoten in diesem Dokument."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Kein „voriges“ (Prev) für diesem Knoten."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Adjustiere „vorigen“ Knoten (Prev) in diesem Fenster."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr ""
+"Kein „voriges“ (Prev) oder „aufwärts“ (Up) für diesen Knoten innerhalb "
+"dieses Dokuments."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Adjustiere „aufwärts“ (Up) in diesem Fenster."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Bewege zum letzten Menüeintrag von „voriges“ (Prev)."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Vorwärts oder abwärts durch die Knotenstruktur bewegen"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Zurßck oder aufwärts durch die Knotenstruktur bewegen"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "In diesem Fenster vorwärts blättern"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"In diesem Fenster vorwärts blättern und die Standard-Fenstergröße setzen"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "In diesem Fenster vorwärts blättern ohne den Knoten zu verlassen"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"In diesem Fenster vorwärts blättern (ohne den Knoten zu verlassen)\n"
+" und Standard-Fenstergröße setzen"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "In diesem Fenster zurßckblättern"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "In diesem Fenster zurückblättern und die Standard-Fenstergröße setzen"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "In diesem Fenster zurßckblättern ohne den Knoten zu verlassen"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"In diesem Fenster zurßck blättern (ohne den Knoten zu verlassen)\n"
+" und Standard-Fenstergröße setzen"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Zum Anfang dieses Knotens bewegen"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Zum Ende dieses Knotens bewegen"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Zeilenweise vorblättern"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Zeilenweise zurßck blättern"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Einen halben Bildschirm vorblättern"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Einen halben Bildschirm zurßckblättern"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Das nächste Fenster auswählen"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Das vorige Fenster auswählen"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Aktuelles Fenster unterteilen"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Aktuelles Fenster lĂśschen"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Ein permanentes Fenster kann nicht gelĂśscht werden"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Alle anderen Fenster lĂśschen"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Im anderen Fenster vorblättern"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Im anderen Fenster zurßck blättern"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Aktuelles Fenster vergrößern (oder verkleinern)"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr ""
+"Den vorhandenen Bildschirmplatz unter allen sichtbaren Fenstern aufteilen"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Den Status des Zeilenumbruchs im aktuellen Fenster umschalten"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Den „nächsten“ Knoten (Next) auswählen"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Den „vorigen“ Knoten (Prev) auswählen"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Den übergeordneten Knoten auswählen („aufwärts“, Up)"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Den letzten Knoten dieser Datei auswählen"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Dieses Fenster hat keine weiteren Knoten"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Den ersten Knoten dieser Datei auswählen"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Den letzten Menßeintrag dieses Knotens auswählen"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Diesen Menßeintrag auswählen"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Es sind keine %d Einträge in diesem Menß."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "MenĂźeintrag (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "MenĂźeintrag: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Folge xref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Folge xref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Einen Menßeintrag lesen und seinen Knoten auswählen"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Fußnote oder Querverweis lesen und den Knoten auswählen"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Zum Anfang des MenĂźs dieses Knotens bewegen"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "So viele Menßeinträge wie mÜglich auf einmal besuchen"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Den Namen eines Knotens lesen und diesen auswählen"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Gehe zu Knoten: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Kein Menü im Knoten „%s“."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Kein Menüeintrag „%s“ im Knoten „%s“."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Kann keinen Knoten finden, der von „%s“ in „%s“ referenziert wird."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Menüliste lesen; bei „dir“ beginnen und ihnen folgen"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Folge MenĂźs: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Den Knoten finden, der den Programmaufruf beschreibt"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Finde den Programmaufruf-Knoten von [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Einen Verweis auf eine Manpage lesen und diese auswählen"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Hole Manpage: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Den Knoten „Top“ dieser Datei auswählen"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Den Knoten „(dir)“ auswählen"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "LĂśsche Information Ăźber Knoten (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Kann Information über Knoten „%s“ nicht löschen"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Information Ăźber den letzten Knoten kann nicht gelĂśscht werden"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Den zuletzt gewählten Knoten auswählen"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Information Ăźber diesen Knoten lĂśschen"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Den Namen einer Datei lesen und diese auswählen"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Finde Datei: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Kann „%s“ nicht finden."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Ausgabe-Datei „%s“ kann nicht angelegt werden."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Fertig."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Knoten „%s“ wird geschrieben..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr ""
+"Den Inhalt dieses Knotens an INFO_PRINT_COMMAND weiterreichen\n"
+" (mittels einer Pipe)"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Kann Daten nicht nach „%s“ weiterreichen (mittels einer Pipe)."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Knoten „%s“ wird gedruckt..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Unterdatei „%s“ wird durchsucht..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr ""
+"Eine Zeichenkette einlesen und danach gemäß Groß-/Kleinschreibung suchen"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Eine Zeichenkette einlesen und danach suchen"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Eine Zeichenkette einlesen und danach in Rßckwärtsrichtung suchen"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%snach Zeichenkette [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Suche in Rßckwärtsrichtung "
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Suche"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " gemäß Groß-/Kleinschreibung "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Suche fehlgeschlagen."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Letzte Suche in der gleichen Richtung wiederholen"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Keine vorherige Such-Zeichenkette."
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Letzte Suche in der entgegengesetzten Richtung wiederholen"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Interaktiv eine Zeichenkette während der Eingabe suchen"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "Interactive Suche in Rßckwärtsrichtung: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "Interaktive Suche: "
+
+# checkit
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Fehlgeschlagen "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Zum vorigen Querverweis bewegen"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Zum nächsten Querverweis bewegen"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Verweis oder Menßeintrag auswählen, der auf dieser Zeile erscheint"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Momentane Operation abbrechen"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Beenden"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Den Cursor zu einer bestimmten Zeile des Fensters bewegen"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Anzeige erneut darstellen"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Info beenden"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr ""
+"Befehl ausfĂźhren, der an die kleingeschriebene Variante dieser\n"
+" Taste gebunden ist"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Unbekannter Befehl (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "„%s“ ist ungültig"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "„%s“ ist ungültig"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Diese Zahl dem aktuellen numerischen Argument hinzufĂźgen"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Beginne (oder multipliziere mit 4) das aktuelle numerische Argument"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Intern verwendet von \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Kein Speicher mehr!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Wenn „On“, dann erscheinen und verschwinden Fußnoten automatisch"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Wenn „On“, dann werden beim Anlegen oder Löschen eines Fensters die anderen "
+"Fenster angepasst"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Wenn „On“, dann den Bildschirm blinken lassen, kein akustisches Signal"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Wenn „On“, dann erzeugen Fehler ein akustisches Signal"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Wenn „On“, dann behält Info keine Dateien im Speicher, die ausgepackt werden "
+"mussten"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr ""
+"Wenn „On“, dann wird die übereinstimmende gefundene Zeichenkette markiert"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Kontrolliert, was passiert, wenn am Ende eines Knotens geblättert wird"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr ""
+"Anzahl der Zeilen zu blättern, wenn der Cursor aus dem Fenster bewegt wird"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Wenn „On“, dann akzeptiert Info ISO-Latin-Zeichen und zeigt diese an"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Den Zweck einer Variablen erklären"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Beschreibe Variable: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Den Wert einer Info-Variablen setzen"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Setze Variable: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Setze %s auf den Wert (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Setze %s auf den Wert (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Tags veraltet ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), Zeilen ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d Zeilen --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d Zeilen --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Unterdatei: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: Option „%s“ ist nicht eindeutig\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: Option „--%s“ erlaubt kein Argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: Option „%c%s“ erlaubt kein Argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: Option „%s“ benötigt ein Argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: nicht erkannte Option „--%s“\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: nicht erkannte Option „%c%s“\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ungĂźltige Option -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ungĂźltige Option -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: Option benĂśtigt ein Argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: Option „-W %s“ ist nicht eindeutig\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: Option „-W %s“ erlaubt kein Argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "Argumente zu @%s ignoriert"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "Januar"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "Februar"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "März"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "April"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "Mai"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "Juni"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "Juli"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "August"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "September"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "Oktober"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "November"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "Dezember"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "wahrscheinlich falsches Zeichen „%c“ in @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "Argument von @sc besteht nur aus Großbuchstaben, somit keine Wirkung"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "„{“ erwartet, jedoch „%c“ bekommen"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "Dateiende innerhalb eines @verb-Blocks"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "„}“ erwartet, jedoch „%c“ bekommen"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Bemerkung...} erzeugt einen Pseudo-Querverweis in Info; "
+"umformulieren, um das zu vermeiden"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s ist obsolet"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp erfordert ein positives numerisches Argument, nicht „%s“"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Fehlerhaftes Argument zu %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "genau"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "kein"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "Fehlerhafte Argumente zu @%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "EinfĂźgen"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Fehlende „}“ bei @def Argument"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funktion"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+# checkit
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Spezielle Form"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variable"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Nutzeroption"
+
+# checkit
+# What does this mean? -ke-
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instance Variable"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Methode"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "aus"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "ein"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Muss in einer „@%s“-Umgebung sein, um „@%s“ zu benutzen"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "„%s“ weggelassen vor Ausgabedateiname"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "„%s“ weggelassen, da in Standardausgabe geschrieben wird"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Ausgabepuffer nicht leer."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "„%c%s“ benötigt ein Argument „{...}“, nicht nur „%s“"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Keine schließende Klammer für Fußnote „%s“"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Fußnote außerhalb eines Elternknotens definiert"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Fußnoten innerhalb von Fußnoten sind nicht erlaubt"
+
+# HTML
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Fu&szlig;noten"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: Konnte CSS-Datei nicht Ăśffnen: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: CSS-Datei endete inmitten eines Kommentars"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Ohne Titel"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[unerwartet] kein HTML-Tag fĂźr Pop-Operation"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[unerwartet] ungültiger Knotenname: „%s“"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Unbekannter Index „%s“"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info kann nicht mit „:“ im Indexeintrag „%s“ umgehen"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Index „%s“ existiert bereits"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Unbekannter Index „%s“ und/oder „%s“ in @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(Zeile )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(Zeile %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Unbekannter Index „%s“ in @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Eintrag für Index „%s“ außerhalb jeglichen Knotens"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(außerhalb jeglichen Knotens)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Siehe "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item nicht im Argument fĂźr @itemize erlaubt"
+
+# checkit
+# What does this mean? -ke-
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "„Broken-Type“ bei „insertion_type_pname“"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Überlauf bei den Zahlen der Aufzählung"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "Überlauf bei den Buchstaben der Aufzählung. Beginne wieder bei %c"
+
+# %citem ist ein Texinfo-Befehl
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s benĂśtigt ein Argument: den Formatierer fĂźr %citem"
+
+# %cfloat ist ein Texinfo-Befehl
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "%cfloat-Umgebungen kĂśnnen nicht verschachtelt sein"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "„@end“ erwartete „%s“, bekam jedoch „%s“"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Kein übereinstimmendes „%cend %s“"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s benĂśtigt einen Buchstaben oder eine Zahl"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "Dateiende innerhalb eines „Verbatim“-Blocks"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s nicht sinnvoll außerhalb einer „@float“-Umgebung"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu vor ersten @node gefunden. „Top“-Knoten wird angelegt"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"vielleicht sollte der @top-Knoten eher von @ifnottex als von @ifinfo "
+"umschlossen werden?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu vor ersten @node gefunden. „Top“-Knoten wird angelegt"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+"@%s nicht sinnvoll außerhalb von „@titlepage“- und „@quotation“-Umgebungen"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s nicht sinnvoll außerhalb einer „@titlepage“-Umgebung"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Nicht übereinstimmendes „%c%s“"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "„%c%s“ benötigt etwas nachfolgendes"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Fehlerhaftes Argument „%s“ zu „@%s“, benutze „%s“"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s nicht sinnvoll innerhalb eines „@%s“-Blocks"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx nicht sinnvoll innerhalb eines „%s“-Blocks"
+
+# checkit
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s außerhalb eines Einfügungsblocks gefunden"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s ist kein gĂźltiges ISO-639-SprachkĂźrzel"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "nicht erkannter Kodierungsname „%s“"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "Kodierung „%s“ wird leider nicht unterstützt."
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "Ungültiges kodiertes Zeichen: „%s“"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s erwartet „i“ oder „j“ als Argument, nicht „%c“"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s erwartet einen einzelnen Buchstaben „i“ oder „j“ als Argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "Makro „%s“ früher definiert"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "hier ist die frühere Definition von „%s“"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+"Dem \\ in der Makro-Erweiterung folgt „%s“ anstelle eines Parameternamens"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makro „%s“ in Zeile %d mit zuvielen Argumenten aufgerufen"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend Makro nicht gefunden"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-Argument nur sinnvoll, wenn das Makro nur ein Argument hat"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@end %s stimmt nicht mit @%s Ăźberein"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Zu viele Fehler! Abbruch.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: Warnung: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Fehlplazierte %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "„%s --help“ gibt weitere Informationen.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Aufruf: %s [OPTION]... TEXINFO-DATEI...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Übersetzt Texinfo-Quelldatei-Dokumentation in verschiedene andere Formate,\n"
+"standardmäßig in Info-Dateien, die online mit einem Info-Leser wie\n"
+"GNU Info (oder auch Emacs, TkInfo, etc.) gelesen werden kĂśnnen.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Allgemeine Optionen:\n"
+" --error-limit=ZAHL nach ZAHL Fehlern beenden (Standard %d)\n"
+" --force Ausgabedatei auch bei Fehlern nicht lĂśschen\n"
+" --help diese Hilfe zeigen und beenden\n"
+" --no-validate Überprüfen der Knoten-Querverweise "
+"unterdrĂźcken\n"
+" --no-warn Warnungen (aber keine Fehler) unterdrĂźcken\n"
+" --reference-limit=ZAHL warne bei hĂśchstens ZAHL Verweisen (Standard %"
+"d)\n"
+" -v, --verbose ausfĂźhrlich die Bearbeitungschritte anzeigen\n"
+" --version Programmversion anzeigen und beenden\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Optionen zur Wahl des Ausgabeformats (Voreinstellung ist Info):\n"
+" --docbook DocBook XML anstelle von Info ausgeben\n"
+" --html HTML anstelle von Info ausgeben\n"
+" --xml Texinfo XML anstelle von Info ausgeben\n"
+" --plaintext einfachen Text anstelle von Info ausgeben\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Allgemeine Ausgabe-Optionen:\n"
+" -E, --macro-expand DATEI originalen Quelltext mit expandierten Makros "
+"nach\n"
+" DATEI ausgeben, dabei @setfilename ignorieren\n"
+" --no-headers Knoten-Unterteiler, „Knoten:“-Kopfzeilen und "
+"MenĂźs\n"
+" unterdrĂźcken in Info-Ausgabe (also nur Text\n"
+" erstellen) oder HTML (also kĂźrzere Ausgabe);\n"
+" außerdem in die Standardausgabe schreiben\n"
+" --no-split Aufteilen langer Info-Dateien oder das Erzeugen\n"
+" einer HTML-Datei je Knoten unterdrĂźcken\n"
+" --number-sections Kapitel-, Abschnitt- und Anhangzählungen "
+"ausgeben\n"
+" -o, --output=DATEI Ausgabe nach DATEI (bzw. Verzeichnis wenn\n"
+" aufgeteiltes HTML)\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Optionen fĂźr Info und Nur-Text:\n"
+" --enable-encoding akzentuierte und spezielle Zeichen in die "
+"Info-\n"
+" Ausgabe gemäß @documentencoding ausgeben\n"
+" --fill-column=ZAHL Zeilen nach ZAHL Zeichen umbrechen (Standard %"
+"d)\n"
+" --footnote-style=STIL Fußnoten in Info gemäß STIL ausgeben:\n"
+" „separate“: Fußnoten in eigenen Knoten\n"
+" platzieren;\n"
+" „end“: Fußnoten an das Ende des Knotens "
+"setzen,\n"
+" in dem sie definiert sind (Standard)\n"
+" --paragraph-indent=WERT Info-Absätze mit WERT Leerzeichen einziehen\n"
+" (Standard %d);\n"
+" WERT ist „none“: nicht einziehen;\n"
+" WERT ist „asis“: existierende Einzüge "
+"behalten\n"
+" --split-size=GRÖSSE in GRÖSSE große Dateien splitten (Standard %"
+"d)\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"Optionen fĂźr HTML:\n"
+" --css-include=DATEI DATEI in HTML-<style>-Ausgabe einfĂźgen;\n"
+" aus Standardeingabe, wenn DATEI „-“ ist\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"Optionen fĂźr XML und Docbook:\n"
+" --output-indent=WERT XML-Elemente mit WERT Leerzeichen einrĂźcken\n"
+" (Voreinstellung: %d). Wenn WERT 0 ist, "
+"wird\n"
+" ignorierbarer Leerraum weggelassen.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Eingabedatei-Optionen:\n"
+" --commands-in-node-names @-Befehle in Knotennamen zulassen\n"
+" -D VAR eine Variable definieren (wie mit @set)\n"
+" -I VERZ VERZ an den Suchpfad fßr @include anhängen\n"
+" -P VERZ VERZ dem Suchpfad fĂźr @include "
+"voranstellen\n"
+" -U VAR eine Variable aufheben (wie mit @clear)\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Bedingte Verarbeitung in Eingabe:\n"
+" --ifdocbook @ifdocbook und @docbook bearbeiten, selbst wenn kein "
+"Docbook\n"
+" erzeugt wird\n"
+" --ifhtml @ifhtml und @html bearbeiten, selbst wenn kein HTML\n"
+" erzeugt wird\n"
+" --ifinfo @ifinfo bearbeiten, selbst wenn kein Info erzeugt wird\n"
+" --ifplaintext @ifplaintext bearbeiten, selbst wenn kein Text erzeugt "
+"wird\n"
+" --iftex @iftex und @tex bearbeiten; impliziert --no-split\n"
+" --ifxml @ifxml und @xml bearbeiten\n"
+" --no-idocbook @ifdocbook- und @docbook-Text nicht bearbeiten\n"
+" --no-ifhtml @ifhtml- und @html-Text nicht bearbeiten\n"
+" --no-ifinfo @ifinfo-Text nicht bearbeiten\n"
+" --no-ifplaintext @ifplaintext-Text nicht bearbeiten\n"
+" --no-iftex @iftex- und @tex-Text nicht bearbeiten\n"
+" --no-ifxml @ifxml und @xml nicht bearbeiten\n"
+"\n"
+" Außerdem werden bei den --no-ifFORMAT-Optionen auch die entsprechenden\n"
+" @ifnoFORMAT-Abschnitte bearbeitet.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Die Voreinstellungen fßr die @if...-Bedingungen hängen vom Ausgabeformat "
+"ab:\n"
+" wird HTML erzeugt, ist --ifhtml an und die anderen sind aus;\n"
+" wird Info erzeugt, ist --ifinfo an und die anderen sind aus;\n"
+" wird reiner Text erzeugt, ist --ifplaintext an und die anderen sind aus;\n"
+" wird XML erzeugt, ist --ifxml an und die anderen sind aus.\n"
+
+# Die "." am Zeilenende habe ich entfernt. -ke-
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Beispiele:\n"
+" makeinfo foo.texi Info gemäß @setfilename von foo\n"
+" schreiben\n"
+" makeinfo --html foo.texi HTML gemäß @setfilename schreiben\n"
+" makeinfo --xml foo.texi Texinfo XML gemäß @setfilename "
+"schreiben\n"
+" makeinfo --docbook foo.texi DocBook XML gemäß @setfilename "
+"schreiben\n"
+" makeinfo --no-headers foo.texi reinen Text in Standardausgabe\n"
+" schreiben\n"
+"\n"
+" makeinfo --html --no-headers foo.texi HTML ohne Menüs oder „Knoten“-"
+"Zeilen\n"
+" makeinfo --number-sections foo.texi Info mit nummerierten Abschnitten\n"
+" makeinfo --no-split foo.texi nur eine Info-Datei (kann groß "
+"sein)\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: Ignoriere nicht erkannten Wert „%s“ für TEXINFO_OUTPUT_FORMAT.\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s Argument muss numerisch sein, nicht „%s“.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: Makro-Expansions-Ausgabedatei „%s“ kann nicht geöffnet werden"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: ignoriere zweite Makro-Expansions-Ausgabedatei „%s“.\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: Argument für --paragraph-indent muss numerisch, „none“ oder „asis“ sein, "
+"nicht „%s“.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: Argument für --footnote-style muss „separate“ oder „end“ sein, nicht „%"
+"s“.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: Datei-Angabe fehlt.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Mehrzeilen-Befehl %c%s inkorrekt verwendet"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Habe „%s“ erwartet"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Kann Verzeichnis „%s“ nicht anlegen: %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Kein „%s“ in „%s“ gefunden"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Keine Makro-AuflĂśsung nach der Standard-Ausgabe, da auch die Info-"
+"Ausgabe dorthin geht.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "%s-Datei „%s“ von „%s“ wird erzeugt.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Dies ist %s, hergestellt von Makeinfo Version %s aus %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Entferne Makro-Ausgabe-Datei „%s“ wegen Fehler; --force benutzen, um "
+"Datei beizubehalten.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Entferne Ausgabe-Datei „%s“ wegen Fehler; --force benutzen, um diese "
+"beizubehalten.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Unbekannter Befehl „%s“"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+"Geschweifte Klammern verwenden, um einen Befehl als Argument an „@%s“ zu "
+"geben"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s erwartete geschweifte Klammern"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Nicht Ăźbereinstimmende }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "Kein_NAME!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s fehlende schließende Klammer"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image-Datei „%s“ (für HTML) nicht lesbar: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Kein Datei namens „%s“"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image-Datei „%s“ (für Text) nicht lesbar: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image fehlt als Argument ein Dateiname"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "undefiniertes Flag: %s"
+
+# checkit
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Kein Wert für „%s“}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s erfordert einen Namen"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Dateiende vor erforderlichem „@end %s“ erreicht"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "„%.40s...“ ist zum Expandieren zu lang; nicht expandiert"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Fehlende „}“ bei @multitable-Template"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "nicht interpretierbarer Text „%s“ nach @multitable wird ignoriert"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Zu viele Spalten im „@multitable“-Eintrag (maximal %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[unerwartet] Spalte %d kann in „multitable“ nicht ausgewählt werden"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "@tab außerhalb einer „multitable“ wird ignoriert"
+
+# checkit
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Mehrspalten-Ausgabe von der letzten Zeile:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* Spalte %d: Ausgabe = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Knoten „%s“ bereits in Zeile %d definiert"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Knoten „%s“ wird formatiert...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Knoten „%s“ benötigt einen Abschnittsbefehl (z.B. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Kein Knotenname für den Befehl „%c%s“ angegeben"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Anker „%s“ und Knoten „%s“ zeigen auf gleichen Dateinamen."
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Dieser @anchor-Befehl wird ignoriert, da Verweise auf ihn nicht funktionieren"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Entweder diesen Anker umbenennen oder Option „--no-split“ verwenden"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Unerwartete Zeichenkette am Ende der gesplitteten HTML-Datei „%s“"
+
+# HTML
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "n&auml;chstes:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "voriges:"
+
+# HTML
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "aufw&auml;rts:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Anker „%s“ und „%s“ zeigen auf gleichen Dateinamen."
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+"@anchor-Befehl wird ignoriert, da Referenzen auf ihn nicht funktionieren"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%sverweis auf nicht existierenden Knoten „%s“ (vielleicht @section statt "
+"@subsection o.ä.?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "MenĂź"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Quer"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Auf das Feld „nächstes“ (Next) des Knotens „%s“ wird nicht verwiesen "
+"(vielleicht @section statt @subsection o.ä.?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr ""
+"Dieser Knoten (%s) hat den fehlerhaften Eintrag im Feld „voriges“ (Prev)"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "voriges"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Auf das Feld „voriges“ (Prev) des Knotens „%s“ wird nicht verwiesen"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr ""
+"Dieser Knoten (%s) hat den fehlerhaften Eintrag im Feld „nächstes“ (Next)"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+"„%s“ hat kein Feld „aufwärts“ (Up) (vielleicht @section statt @subsection o."
+"ä.?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "aufwärts"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"Dem Knoten „%s“ fehlt ein Menüeintrag für „%s“, obwohl er dessen Ziel für "
+"„aufwärts“ (Up) ist"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "Knoten „%s“ wurde %d mal referenziert"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "Nicht referenzierter Knoten „%s“"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "Entferne %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Kann Datei „%s“ nicht entfernen: %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Anhang %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Interner Fehler (search_sectioning) „%s“!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Interner Fehler (search_sectioning) „%s“!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s ist obsolet; %c%s stattdessen benutzen"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Knoten mit %ctop als Abschnitt existiert bereits"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Hier ist der %ctop-Knoten"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop vor %cnode benutzt, Voreinstellung %s wird genommen"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Inhaltsverzeichnis"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Inhalt in Kurzform"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image-Datei „%s“ nicht lesbar: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"@headitem als letztes Element von @multitable erzeugt ungĂźltige Docbook-"
+"Dokumente"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: Warnung: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " fĂźr %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\t„%s --help“ gibt weitere Informationen.\n"
+
+# Die "." am Zeilenende habe ich entfernt. -ke-
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Aufruf: %s [OPTION]... [INFO-DATEI [VERZ-DATEI]]\n"
+"\n"
+"„dir“-Einträge von der INFO-DATEI in der Info-Verzeichnis-Datei VERZ-DATEI\n"
+"installieren oder lĂśschen.\n"
+"\n"
+"Optionen:\n"
+" --delete vorhandene Einträge fßr INFO-DATEI aus VERZ-DATEI "
+"lĂśschen;\n"
+" keine neuen Einträge einfßgen\n"
+" --dir-file=NAME Name der Info-Verzeichnis-Datei angeben. Gleichbedeutend\n"
+" mit dem VERZ-DATEI-Argument\n"
+" --entry=TEXT TEXT als einen Info-Verzeichnis-Eintrag einfĂźgen. TEXT\n"
+" soll die Form einer Zeile eines Info-MenĂźeintrags "
+"haben,\n"
+" zuzĂźglich mehrerer Extra-Zeilen (oder keiner), die mit\n"
+" Leerraum („whitespace“) beginnen. Wenn mehr als ein\n"
+" Eintrag angegeben wird, werden alle hinzugefĂźgt. Wenn\n"
+" kein Eintrag angegeben wird, wird der Eintragstext der\n"
+" Info-Datei selbst entnommen.\n"
+" --help diese Hilfe zeigen\n"
+" --info-file=DATEI Info-Datei angeben, die im Verzeichnis zu installieren "
+"ist.\n"
+" Gleichbedeutend mit dem INFO-DATEI-Argument\n"
+" --info-dir=VERZ wie --dir-file=VERZ/dir\n"
+" --item=TEXT wie --entry TEXT\n"
+" Ein Info-Verzeichnis-Eintrag ist nämlich ein "
+"MenĂźeintrag.\n"
+" --quiet Warnungen unterdrĂźcken\n"
+" --remove wie --delete\n"
+" --section=ABSCHN die Einträge dieser Datei in den Abschnitt ABSCHN des\n"
+" Verzeichnisses stellen. Wird mehr als ein Abschnitt\n"
+" angegeben, werden alle Einträge in jedem der\n"
+" Abschnitte hinzugefĂźgt. Wird gar kein Abschnitt\n"
+" angegeben, wird der Eintragstext der Info-Datei selbst\n"
+" entnommen.\n"
+" --version Programmversion anzeigen\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Dies ist die Datei .../info/dir, die den obersten Knoten der\n"
+"Info-Hierarchie enthält, genannt (dir)Top.\n"
+"Beim ersten Aufruf von Info geht es bei diesem Knoten los.\n"
+"\n"
+"%s\tDies ist der Beginn des INFO-Baums\n"
+"\n"
+" Dieser Verzeichnis-Knoten zeigt ein MenĂź aller Hauptpunkte an.\n"
+" „q“ beendet Info, „?“ listet alle Info-Befehle auf, „d“ kehrt hierher\n"
+" zurück, „h“ gibt eine Einsteiger-Hilfe, „mEmacs<Return>“ besucht das\n"
+" Emacs-Manual, etc.\n"
+"\n"
+" Im Emacs kann man mit dem zweiten Mausknopf auf einen MenĂźeintrag oder\n"
+" einen Querverweis klicken, um einen solchen auswählen.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: kann nicht gelesen (%s) und nicht angelegt werden (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: leere Datei"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY ohne END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY ohne START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: Verzeichnisdatei schon vorhanden: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Info-Datei nur einmal angeben.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "überflüssiges Kommandozeilen-Argument „%s“ wird übergangen"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Keine Eingabe-Datei angegeben; „--help“ gibt weitere Informationen."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Keine dir-Datei angegeben; „--help“ gibt weitere Informationen."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "Kein Info-Verzeichnis-Eintrag in „%s“"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "Menüeintrag „%s“ bereits vorhanden, und zwar für Datei „%s“"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "keine Einträge für „%s“ gefunden; nichts entfernt"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "diese Hilfe anzeigen"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "temporäre Dateien nach Programmende nicht entfernen"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "temporäre Dateien nach Programmende entfernen (Standard)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "Ausgabe nach DATEI schicken"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "Programmversion anzeigen"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Aufruf: %s [OPTION]... DATEI...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Erzeuge einen sortierten Index fĂźr jede TeX-Ausgabedatei.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "DATEI... ist normalerweise „foo.%c%c“ für ein Dokument „foo.texi“.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: keine Texinfo-Indexdatei"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "Fehler beim Wiederöffnen von „%s“"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Keine Seitenzahl in %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "Eintrag „%s“ direkt nach einem Untereintrag"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "„“ ist ungültig"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "Datei existiert, ist aber kein Verzeichnis"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Erstes Argument fĂźr Querverweis darf nicht leer sein."
+
+#~ msgid "see "
+#~ msgstr "siehe "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "„.“ or „,“ muss einem Querverweis folgen, nicht %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "Erstes Argument fĂźr @inforef darf nicht leer sein."
+
+#~ msgid "Node:"
+#~ msgstr "Knoten:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: Inhaltsverzeichnis sollte hier sein, jedoch nicht gefunden"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Info-Verzeichnis nur einmal angeben.\n"
+
+# checkit
+#~ msgid "virtual memory exhausted"
+#~ msgstr "kein Speicher mehr"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "Kein .png oder .jpg für „%s“ und keine Erweiterung angegeben."
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "„%s“ hat kein „Up“-Feld"
diff --git a/Build/source/utils/texinfo/po/de_AT.gmo b/Build/source/utils/texinfo/po/de_AT.gmo
new file mode 100644
index 00000000000..2e74709de3b
--- /dev/null
+++ b/Build/source/utils/texinfo/po/de_AT.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/de_AT.po b/Build/source/utils/texinfo/po/de_AT.po
new file mode 100644
index 00000000000..51e8201c4cc
--- /dev/null
+++ b/Build/source/utils/texinfo/po/de_AT.po
@@ -0,0 +1,2788 @@
+# German/autrian messages for GNU Texinfo
+# Copyright Š 1999 Free Software Foundation, Inc.
+# Karl Eichwalder <ke@suse.de>, 1999.
+#
+# 1999-02-16 21:11:38 MET
+# Vorgeschlagen von Guido Flohr <gufl0000@stud.uni-sb.de>.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 3.12d\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 1999-02-16 21:14+01:00\n"
+"Last-Translator: Karl Eichwalder <ke@suse.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr ""
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr ""
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr ""
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr ""
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr ""
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr ""
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr ""
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr ""
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr ""
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr ""
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr ""
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr ""
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr ""
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr ""
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr ""
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr ""
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr ""
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr ""
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr ""
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr ""
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr ""
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr ""
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr ""
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr ""
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr ""
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr ""
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr ""
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr ""
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr ""
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr ""
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr ""
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr ""
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr ""
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr ""
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr ""
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr ""
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr ""
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr ""
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr ""
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr ""
+
+#: info/indices.c:376
+msgid "more "
+msgstr ""
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr ""
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr ""
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr ""
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr ""
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr ""
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr ""
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr ""
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr ""
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr ""
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr ""
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr ""
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr ""
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr ""
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr ""
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr ""
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr ""
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr ""
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr ""
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr ""
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr ""
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr ""
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ""
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr ""
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr ""
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr ""
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr ""
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr ""
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr ""
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr ""
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr ""
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr ""
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr ""
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr ""
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr ""
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr ""
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr ""
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr ""
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr ""
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr ""
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr ""
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr ""
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr ""
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr ""
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr ""
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr ""
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr ""
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr ""
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr ""
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr ""
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr ""
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr ""
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr ""
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr ""
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr ""
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr ""
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr ""
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr ""
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr ""
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr ""
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr ""
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr ""
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr ""
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr ""
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr ""
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr ""
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr ""
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr ""
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr ""
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr ""
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr ""
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr ""
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr ""
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr ""
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr ""
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr ""
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr ""
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr ""
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr ""
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr ""
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr ""
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr ""
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr ""
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr ""
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr ""
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr ""
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr ""
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr ""
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr ""
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr ""
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr ""
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr ""
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr ""
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr ""
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr ""
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr ""
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr ""
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr ""
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr ""
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr ""
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr ""
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr ""
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr ""
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr ""
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr ""
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr ""
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr ""
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr ""
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr ""
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr ""
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr ""
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr ""
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr ""
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr ""
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr ""
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr ""
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr ""
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr ""
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr ""
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr ""
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr ""
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr ""
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr ""
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr ""
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr ""
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr ""
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr ""
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr ""
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr ""
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr ""
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr ""
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr ""
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr ""
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr ""
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr ""
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr ""
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr ""
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr ""
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr ""
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr ""
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr ""
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr ""
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr ""
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr ""
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr ""
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr ""
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr ""
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr ""
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr ""
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr ""
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr ""
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr ""
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr ""
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr ""
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr ""
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr ""
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr ""
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr ""
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr ""
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr ""
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr ""
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr ""
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr ""
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr ""
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr ""
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr ""
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr ""
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr ""
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr ""
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr ""
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr ""
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr ""
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr ""
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr ""
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr ""
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr ""
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr ""
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr ""
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr ""
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr ""
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr ""
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr ""
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr ""
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr ""
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr ""
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr ""
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr ""
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr ""
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr ""
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr ""
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr ""
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr ""
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr ""
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr ""
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr ""
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr ""
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr ""
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr ""
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr ""
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr ""
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr ""
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr ""
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr ""
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr ""
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr ""
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr ""
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr ""
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr ""
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr ""
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr ""
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr ""
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr ""
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr ""
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr ""
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr ""
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr ""
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr ""
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr ""
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr ""
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr ""
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr ""
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "Jänner"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr ""
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr ""
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr ""
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr ""
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr ""
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr ""
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr ""
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr ""
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr ""
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr ""
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr ""
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr ""
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr ""
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr ""
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr ""
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr ""
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr ""
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr ""
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr ""
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr ""
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr ""
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr ""
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr ""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr ""
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr ""
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr ""
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr ""
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr ""
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr ""
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr ""
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr ""
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr ""
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr ""
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr ""
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr ""
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr ""
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr ""
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr ""
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr ""
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr ""
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr ""
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr ""
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr ""
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr ""
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr ""
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr ""
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr ""
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr ""
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr ""
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr ""
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr ""
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr ""
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr ""
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr ""
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr ""
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr ""
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr ""
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr ""
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr ""
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr ""
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr ""
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr ""
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr ""
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr ""
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr ""
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr ""
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr ""
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr ""
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr ""
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr ""
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr ""
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr ""
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr ""
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr ""
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr ""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr ""
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr ""
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr ""
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr ""
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr ""
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr ""
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr ""
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr ""
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr ""
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr ""
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr ""
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr ""
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr ""
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr ""
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr ""
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr ""
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr ""
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr ""
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr ""
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr ""
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr ""
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr ""
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr ""
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr ""
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr ""
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr ""
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr ""
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr ""
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr ""
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr ""
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr ""
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr ""
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr ""
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr ""
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr ""
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr ""
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr ""
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr ""
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr ""
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr ""
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr ""
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr ""
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr ""
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr ""
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr ""
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr ""
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr ""
diff --git a/Build/source/utils/texinfo/po/eo.gmo b/Build/source/utils/texinfo/po/eo.gmo
new file mode 100644
index 00000000000..483829a6a6d
--- /dev/null
+++ b/Build/source/utils/texinfo/po/eo.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/eo.po b/Build/source/utils/texinfo/po/eo.po
new file mode 100644
index 00000000000..9fef8519299
--- /dev/null
+++ b/Build/source/utils/texinfo/po/eo.po
@@ -0,0 +1,3115 @@
+# Esperanto translations for GNU Texinfo-4.0.
+# Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+# Sergio Pokrovskij <pok@iis.nsk.su>, 1999-2003
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.3c\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2003-01-25 11:47+06:00\n"
+"Last-Translator: Sergio Pokrovskij <pok@iis.nsk.su>\n"
+"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=us-ascii\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Unu signon antauxen"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Unu signon malantauxen"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Al la komenco de cxi tiu linio"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Al la fino de cxi tiu linio"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Unu vorton antauxen"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Unu vorton malantauxen"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Forigu la signon subkursoran"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Forigu la signon jxus antaux la kursoro"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Rezigno aux eliro"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Akceptu (aux kompletigu) cxi tiun linion"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Ensxovu la tujan signon sensxangxe"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Ensxovu tiun signon"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Ensxovu TAB-signon"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Permutu la signojn cxe la kursoro"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Engluu la enhavon de la lasta forvisxo"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Visxringo malplenas"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Regluu antauxan forvisxajxon"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Forvisxu ekde la kursoro gxis la fino de la linio"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Forvisxu ekde la kursoro gxis la komenco de la linio"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Forvisxu la vorton tuj post la kursoro"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Forvisxu la vorton jxus antaux la kursoro"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Kompletigo malestas"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Nekompleta"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Eligu la eblajn kompletigojn"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Sola kompletigo"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Unu kompletigo:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d kompletigoj:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Ensxovu la kompletigon"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Kompletigoj estas sercxataj ..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Rulumu la fenestron de kompletigoj"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "La piednotoj ne eligeblas"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Montru la piednotojn el cxi tiu nodo en alia fenestro"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Piednotoj ----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Sercxu cxenon en la indekso por cxi tiu dosiero"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Estas sercxataj indeksaj artikoloj ..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Nenia indekso trovita."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Indeksa artikolo: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Pasu al la sekva indeksa ero kongrua al la lasta komando \"\\[index-search]\""
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Malestas antauxa cxeno por sercxo en indekso."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Neniu indeksa artikolo."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "En la indekso ne estas %sartikoloj kun \"%s\"."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "pli da "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "MALEBLAS VIDI CxI TION"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "Trovita \"%s\" en %s. (\"\\[next-index-match]\" sercxos la sekvan.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Sercxo en la indeksoj de \"%s\"..."
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "\"%s\" malestas en la indeksoj de la disponeblaj Info-dosieroj"
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "Sercxu cxenon en cxiuj konataj indeksoj Info-dosieraj kaj faru menuon"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Sercxu en indekso informon pri: "
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Nodoj kies indices entenas \"%s\":\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Por ricevi pli da informoj uzu la opcion \"--help\".\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (c) %s Free Software Foundation, Inc.\n"
+"NENIA garantio estas donita. Vi rajtas pludoni ekzemplerojn de cxi tiu\n"
+"programo laux la kondicxoj de la GNUa Gxenerala Publika Permesilo. Pluaj\n"
+"informoj troveblas en la dosieroj COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "por \"%s\" ne trovigxis indeksa artikolo\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr " -b, --speech-friendly estu afabla al la parolsinteziloj.\n"
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Sintakso: %s [OPCIO]... [MENUERO...]\n"
+"\n"
+"Ebligas legi dokumentaron prezentitan en Info.\n"
+"\n"
+"Opcioj:\n"
+" --apropos=TEMO Sercxu TEMOn en cxiuj indeksoj de cxiuj "
+"dokumentoj.\n"
+"-d, --directory=UJO Aldonu la dosierUJOn al INFOPATH.\n"
+" --dribble=DOSIERO Notu la klavofrapojn de la uzanto en DOSIERO.\n"
+"-f, --file=DOSIERO Vizitu la Info-DOSIEROn.\n"
+"-h, --help Eligu cxi tiun helpeton kaj finu.\n"
+" --index-search=CxENO Vizitu nodon referencatan per indeksartikolo "
+"CxENO.\n"
+"-n, --node=NODO Komencu per NODO.\n"
+"-o, --output=DOSIERO Eligu la elektitajn nodojn en DOSIEROn.\n"
+"-R, --raw-escapes Ne forigu ANSI-eskapilojn el man-pagxoj\n"
+" --restore=DOSIERO Legu la klavofrapojn el DOSIERO.\n"
+"-O, --show-options, --usage Montru la nodon pri komandliniaj opcioj.\n"
+"%s --subnodes Rekursie eligu la menuerojn.\n"
+" --vi-keys Uzu vi-eskan kaj less-eskan klavararangxon\n"
+" --version Eligu la version de la programo kaj finu.\n"
+"\n"
+"La unua neopcia argumento, se donita, estas la nomo de unue vizitenda\n"
+"menuero, sercxota en cxiuj \"dir\"-dosieroj troveblaj per INFOPATH.\n"
+"Se gxi mankas, Info kunfandas cxiujn \"dir\"-dosierojn kaj eligas la "
+"rezulton.\n"
+"La ceteraj argumentoj estas la nomoj de menueroj relative al la unue\n"
+"vizitenda nodo.\n"
+"\n"
+"Ekzemploj:\n"
+" info eligu la menuon de la kataloga nodo\n"
+" info emacs komencu per la nodo \"emacs\" el la kataloga "
+"nodo\n"
+" info emacs buffers komencu per la nodo \"buffers\" el Emaksa "
+"manlibro\n"
+" info --show-options emacs komencu per la Emaksaj komandliniaj opcioj\n"
+" info -f ./um.info eligu la dosieron ./um.info sen atenti \"dir\"\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Erarraportojn sendu al <bug-texinfo@nu.org>; gxeneralajn\n"
+"demandojn kaj opiniojn al <help-texinfo@gnu.org>.\n"
+"La hejmpagxo de Texinfo: <http://www.gnu.org/software/texinfo/>.\n"
+"Por la diskutoj pri Esperanto-traduko uzu la dissendoliston\n"
+"<translation-team-eo@lists.sourceforge.net>."
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "La nodo \"%s\" ne troveblas."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "La nodo \"(%s)%s\" ne troveblas."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Maleblas trovi fenestron!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "La muskursoro ne estas en cxi-fenestra nodo!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Maleblas forigi la lastan fenestron"
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "En cxi tiu nodo malestas menuo."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Ne estas piednotoj en cxi tiu nodo."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Neniu referenco en cxi tiu nodo."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Mankas ligilo \"%s\" por cxi tiu nodo."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Nekonata Info-komando \"%c\"; tajpu \"?\" por helpo."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "La terminaloj de tipo \"%s\" ne estas suficxe inteligentaj por Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Tiu pagxo jam estas la lasta en cxi tiu nodo"
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Tio jam estas la unua pagxo de cxi tiu nodo"
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Nur unu fenestro."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "La fenestro rezultos tro malgranda."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Mankas spaco por helpa fenestro, bv forigi iun fenestron."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"La cxefaj komandoj info-fenestraj\n"
+"*********************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Forlasu cxi tiun helpon.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit-help] Forlasu la tutan Info.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Voku la lernilon pri Info.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Por elekti aliajn nodojn:\n"
+"-------------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr ""
+"\\%-10[next-node] Iru al la tujsekva (\"Next\") nodo de cxi tiu nodo.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr ""
+"\\%-10[prev-node] Iru al la jxusantauxa (\"Previous\") nodo de cxi tiu "
+"nodo.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Iru al la tujsupra (\"Up\") nodo de cxi tiu nodo.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Elektu menueron indikitan per nomo.\n"
+" Elekto de menuero kauxzas transiron en alian nodon.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Sekvu referencon (legante la nomon de la referenco).\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Revenu al la Lasta nodo vizitita en cxi tiu fenestro.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Saltu sur la sekvan hipertekstan ligilon en cxi "
+"tiu nodo.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Saltu sur la sekvan hipertekstan ligilon en cxi "
+"tiu nodo.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Iru laux la subkursora hiperteksta "
+"ligo.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Iru al la cxefkataloga nodo. Ekvivalentas al \"g (DIR)"
+"\".\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr "\\%-10[top-node] Iru al la radika nodo. Ekvivalentas al \"g Top\".\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Por movigxi ene de nodo:\n"
+"------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Iru al la komenco de cxi tiu nodo.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Iru al la fino de cxi tiu nodo.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Unu pagxon antauxen.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[next-line] Unu pagxon malantauxen.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Unu pagxon antauxen.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Unu pagxon malantauxen.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Ceteraj komandoj:\n"
+"-----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] Elektu resp. la unuan ... la nauxan eron el cxi-noda "
+"menuo.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Elektu la lastan eron de cxi-noda menuo.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Sercxu aperon de donita signocxeno en la "
+"indeksartikoloj de cxi\n"
+" tiu info-dosiero kaj elektu la nodon referencatan de la unua trovita "
+"artikolo.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Iru al nodo indikita per nomo.\n"
+" Ankaux la dosiernomon vi povas inkludi, kiel en (DOSIERO)NODO.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Sercxu sube aperon de donita signocxeno kaj\n"
+" vizitu la nodon en kiu trovigxos la sekva apero.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Sercxu supre aperon de donita signocxeno kaj\n"
+" vizitu la nodon en kiu trovigxos la jxusantauxa apero.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Forlasu cxi tiun helpon.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Forlasu la tutan Info.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Voku la lernilon pri Info.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Iru al la tujsekva (\"Next\") nodo de cxi tiu nodo.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Iru al la jxusantauxa (\"Previous\") nodo de cxi tiu nodo.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Iru al la tujsupra (\"Up\") nodo de cxi tiu nodo.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Iru al la tajpota menuero.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " Elekto de menuero kauxzas transiron en alian nodon.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Sekvu reFerencon (legante la nomon de la referenco).\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Revenu al la Lasta nodo vizitita en cxi tiu fenestro.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Saltu sur la sekvan hipertekstan ligilon en cxi tiu nodo.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Iru laux la subkursora hiperteksta ligo.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Iru al la cxefkataloga nodo. Ekvivalentas al \"g (DIR)\".\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Iru al la radika nodo. Ekvivalentas al \"g Top\".\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Unu pagxon antauxen.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Unu pagxon malantauxen.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Iru al la komenco de cxi tiu nodo.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Iru al la fino de cxi tiu nodo.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Unu pagxon antauxen.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Unu pagxon malantauxen.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Elektu resp. la unuan ... la nauxan eron de cxi-noda menuo.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Elektu la lastan eron de cxi-noda menuo.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Sercxu indikotan signocxenon en la indeksaj artikoloj de cxi tiu "
+"Info-\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" dosiero kaj elektu la nodon referencatan de la unua trovita artikolo.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Vizitu nodon indikotan per la nomo.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " Ankaux la dosiernomon vi povas inkludi, kiel en (DOSIERO)NODO.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Sercxu sube indikotan signocxenon,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " kaj vizitu la nodon en kiu trovigxos la sekva apero.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Sercxu indikotan signocxenon supre en la dosiero,\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "La kuranta sercxvojo estas:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Komandoj disponeblaj en Info-fenestroj:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Komandoj disponeblaj en la ehxozono:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"La sekvaj komandoj vokeblas nur per %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"La sekvaj komandoj neniel vokeblas:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- Uzu \"\\[history-node]\" aux \"\\[kill-node]\" por eliri ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Eligu helpomesagxon"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Vizitu la Info-nodon \"(info)Help\""
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Eligu la informon pri KLAVO"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Priskribu klavon: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s estas nedifinita."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s estas nedifinita."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s estas ligita al %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Montru, kion tajpi por plenumi koncernan komandon"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Kie estas la komando: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "neniu klavo trovita por la komando \"%s\""
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s vokeblas nur per %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s vokeblas per %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Malestas funkcio nomata \"%s\""
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (c) %s Free Software Foundation, Inc.\n"
+"NENIA garantio estas donita. Vi rajtas pludoni ekzemplerojn de cxi tiu\n"
+"programo laux la kondicxoj de la GNUa Gxenerala Publika Permesilo. Pluaj\n"
+"informoj troveblas en la dosieroj COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "Malgxusta nombro da argumentoj"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "ne malfermigxis eniga dosiero \"%s\""
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "maleblas krei eligan dosieron \"%s\""
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "eraro dum skribo en \"%s\""
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "eraro dum fermo de eliga dosiero \"%s\""
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "tro longa klavosekvenco"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "mankanta klavosekvenco"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL-signo (\\000) malpermesitas"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL-signo (^%c) malpermesitas"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "mankas agonomo"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "tro longa sekcio"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "nekonata ago \"%s\"."
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "tro longa agonomo"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "kromaj signoj post la ago \"%s\""
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "mankas nomo de variablo"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "mankas \"=\" tuj post variablonomo"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "tro longa variablonomo"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "tro longa valoro"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", linio %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Sintakso: %s [OPCIO]... [ENIG-DOSIERO]\n"
+"\n"
+"Opcioj:\n"
+" --output=DOSIERO Eligu en DOSIEROn (anatataux $HOME/.info).\n"
+" --help Eligu cxi tiun helpeton kaj finu.\n"
+" --version Eligu la version de la programo kaj finu.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "La misa infoklava dosiero \"%s\" ignorita (tro mallonga)"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "La misa infoklava dosiero \"%s\" ignorita (tro longa)"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Eraro dum lego de infoklava dosiero \"%s\" (tro frue elcxerpita)"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Misa infoklava dosiero \"%s\" (magiaj nombroj); aktualigu gxin per infokey"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "Via infoklava dosiero \"%s\" malaktualas; aktualigu gxin per infokey"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Misa infoklava dosiero \"%s\" (misa sekcilongo) -- aktualigu gxin per infokey"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Misa infoklava dosiero \"%s\" (misa sekcikodo); aktualigu gxin per infokey"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Misaj datumoj en infoklava dosiero -- iuj klavasociajxoj ne validos"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"Misaj datumoj en infoklava dosiero -- iuj valorizoj de variabloj ne validos"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Legu la nomon de Info-komando kaj priskribu gxin"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Priskribu komandon: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Legu en la ehxozono nomon de komando kaj gxin plenumu"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Maleblas plenumi ehxozonan (\"echo-area-\") komandon cxi tie."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "Nekonata komando \"%s\"."
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Fiksu la alton de la prezentata fenestro"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Alto de la ekrano estu (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" La fontodosieroj tralaboritaj por fari cxi tiun dosieron:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Maleblas prilabori la dosieron %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Dosiero)Nodo Linioj Longo Entenanta Dosiero\n"
+" -------------- ------ ----- -----------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Jen la menuo de nodoj kiujn vi lastatempe vizitis.\n"
+"Elektu iun el la menuo, aux uzu \"\\[history-node]\" en alia fenestro.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Faru fenestron entenantan menuon de cxiuj nune vizititaj nodoj"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Elektu nodon jam vizititan en videbla fenestro"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Elektu vizititan nodon: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "La referenco malaperis! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Bonvenon al Info, versio %s. Tajpu \\[get-help-window] por helpo, \\[menu-"
+"item] por menuero."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Mallevigxu al la sekva linio"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Levigxu al la antauxa linio"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Iru al la fino de la linio"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Iru al la komenco de la linio"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Sekva"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Estas legata la nodo \"Next\" ..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "La unua menuero estas elektata ..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "La nodo \"Next\" estas elektata ..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "%d-foje supren, poste al la sekva (\"Next\")."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Malestas pluaj referencoj en la dokumento."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Mankas ligilo \"Prev\" por cxi tiu nodo."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Iro al la antauxa nodo \"Prev\" en cxi tiu fenestro."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "En la dokumento mankas ligilo(j) \"Prev\" aux \"Up\" por tiu nodo."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Levigxo al la nodo \"Up\" en cxi tiu fenestro."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Iro al la lasta menuero de la nodo \"Prev\"."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Movu antauxen aux malsupren en la strukturo de nodoj"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Movu malantauxen aux supren en la strukturo de nodoj"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Rulumu antauxen en cxi tiu fenestro"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"Rulumu antauxen en cxi tiu fenestro kaj fiksu defauxltan fenestrograndon"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Rulumu antauxen en cxi tiu fenestro sed restu en la nodo"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Rulumu antauxen en cxi tiu fenestro restante en la nodo kaj\n"
+"fiksu defauxltan fenestrograndon"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Rulumu malantauxen en cxi tiu fenestro"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+"Rulumu malantauxen en cxi tiu fenestro kaj fiksu defauxltan fenestrograndon"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Rulumu malantauxen en cxi tiu fenestro sed restu en la nodo"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Rulumu malantauxen en cxi tiu fenestro restante en la nodo kaj\n"
+" fiksu defauxltan fenestrograndon"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Iru al la komenco de cxi tiu nodo"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Iru al la fino de cxi tiu nodo"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Linie rulumu suben"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Linie rulumu supren"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Duonekrane rulumu suben"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Duonekrane rulumu supren"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Elektu la sekvan fenestron"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Elektu la antauxan fenestron"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Disfendu la kurantan fenestron"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Forigu la kurantan fenestron"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Maleblas forigi fenestron permanentan"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Forigu cxiujn ceterajn fenestrojn"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Rulumu la alian fenestron"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Rulumu la alian fenestron malantauxen"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "(Mal)pligrandigu cxi tiun fenestron"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Dispartigu la disponeblan ekranspacon inter la videblaj fenestroj"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Baskulsxaltu la regximon de linifaldo en la kuranta fenestro"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Elektu la nodon sekvan (\"Next\")"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Elektu la nodon antauxan (\"Prev\")"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Elektu la nodon supran (\"Up\")"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Elektu la lastan nodon en cxi tiu dosiero"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Cxi tiu fenestro ne havas pluajn nodojn"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Elektu la unuan nodon en cxi tiu dosiero"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Elektu la lastan eron en la menuo de cxi tiu nodo"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Elektu cxi tiun menueron"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Cxi tiu menuo ne havas %d erojn."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menuero (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menuero: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Sekvu referencon (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Sekvu referencon: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Legu menueron kaj elektu gxian nodon"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Legu piednoton aux referencon kaj elektu gxian nodon"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Iru al la komenco de la menuo de cxi tiu nodo"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr ""
+"Vizitu samtempe kiom eble plej multe da menueroj (cxiun en aparta fenestro)"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Legu nodnomon kaj elektu la nodon"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Iru al la nodo: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "En la nodo \"%s\" malestas menuo."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Menuero \"%s\" malestas en la nodo \"%s\"."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Maleblas trovi nodon referencatan per \"%s\" en \"%s\"."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Legu liston da menuoj, komencante per dir kaj sekvante ilin"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Sekvu menuojn: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Trovu la nodon priskribantan programvokon"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Trovu la voknodon de [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Legu referencon al manlibra pagxo kaj gxin elektu"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Manlibran pagxon: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Elektu la nodon \"Top\" en cxi tiu dosiero"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Elektu la nodon \"(dir)\""
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Forvisxu la nodon (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Maleblas forigi la nodon \"%s\""
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Maleblas forigi la lastan nodon"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Elektu nodon plej jxuse elektitan"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Forvisxu cxi tiun nodon"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Legu la dosiernomon kaj gxin elektu"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Trovu la dosieron: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Maleblas trovi \"%s\"."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Maleblas krei eligan dosieron \"%s\"."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Prete."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Estas skribata la nodo \"%s\" ..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "La enhavon de cxi tiu nodo metu en la dukton per INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Ne malfermigxis dukto al \"%s\"."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Estas printata la nodo \"%s\" ..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Estas sercxata la subdosiero \"%s\" ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Legu cxenon kaj sercxu gxin usklecodistinge"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Legu cxenon kaj gxin sercxu"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Legu cxenon kaj gxin sercxu malantauxen"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%spor signocxeno [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Sercxu malantauxen"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Sercxu"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " usklecodistinge"
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Sercxo fiaskis."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Ripetu la jxusan sercxon samdirekte"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Malestas pli frua sercxocxeno."
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Ripetu la jxusan sercxon alidirekte"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Interaktive sercxu cxenon tajpatan"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "Interaktiva sercxo malantauxen: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "Interaktiva sercxo: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Fiasko "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Iru al la antauxa referenco"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Iru al la sekva referenco"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Elektu la referencon aux la menueron de cxi tiu linio"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Cxesigu la kurantan operacion"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Finu"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Movu la kursoron sur indikitan linion de la fenestro"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Refresxigi la ekranon"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Eliru el Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Plenumi komandon asociitan kun cxi tiu klavo minuskligita"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Komando nekonata (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" ne validas"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" ne validas"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Aldonu tiun ciferon al la kuranta argumento nombra"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Komencu (aux 4-obligu) la kurantan argumenton nombran"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Uzata interne de \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Virtuala memoro elcxerpita!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Cxe \"On\", la piednotoj aperas kaj malaperas auxtomate"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Cxe \"On\", kreo aux forigo de fenestro kauxzas rearangxon de la ceteraj"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Cxe \"On\", anstataux bleki fulmetu la ekranon"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Cxe \"On\", signalu pri eraro per bleko"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Cxe \"On\", Info traktas makulaturon post malpako de kunpremitaj dosieroj"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Cxe \"On\", la peco kongrua al la sercxocxeno emfazigxas"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Determinas la konduton de rulumo fine de nodo"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr ""
+"La nombro de linioj rulumataj kiam la kursoro movigxas ekster la fenestron"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Cxe \"On\", Info akceptas kaj surekranigas la okbitajn signojn"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Klarigu la uzon de variablo"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Priskribu variablon: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Valorizu Info-variablon"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Valorizu variablon: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Variablo %s ricevu la valoron (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "%s ricevu la valoron (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Etikedoj malaktualigxis ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), linioj ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d linioj --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d linioj --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Subdosiero: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opcio \"%s\" estas ambigua\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opcio \"--%s\" ne toleras argumenton\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opcio \"%c%s\" ne toleras argumenton\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opcio \"%s\" bezonas argumenton\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: nekonata opcio \"--%s\"\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: nekonata opcio \"%c%s\"\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: misa opcio -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: nevalida opcio -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opcio bezonas argumenton -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opcio \"-W %s\" estas ambigua\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opcio \"-W %s\" ne toleras argumenton\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "Misa argumento por %c%s"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "januaro"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "februaro"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "marto"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "aprilo"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "majo"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "junio"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "julio"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "auxgusto"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "septembro"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "oktobro"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "novembro"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "decembro"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "dubinda signo \"%c\" en @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "argumento de @sc tuta majuskla, do neniel sxangxita"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "\"{\" atendata, sed \"%c\" ricevita"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "dosierfino ene de pretarangxita bloko (verb block)"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "\"}\" atendata, sed \"%c\" ricevita"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s arkaikigxis"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp bezonas ne \"%s\" sed pozitivan argumenton nombran"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Misa argumento por %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "Misa argumento por %c%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Mankas \"}\" en la argumento de @def"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funkcio"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makroo"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Speciala Formo"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variablo"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Uzula opcio"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Ekzemplera variablo"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metodo"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "de"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "sur"
+
+#: makeinfo/defun.c:711
+#, fuzzy, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Nur en \"%s\"-ensxovo uzeblas \"%sx\"."
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "\"%c%s\" bezonas argumenton \"{...}\", ne nuran \"%s\""
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Mankas \"}\" por la piednoto \"%s\""
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Piednoto difinita sen patra nodo"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Maleblas fari piednoton al piednoto"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Piednotoj"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Sen titolo"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[neatendite] mankas HTML-etikedo por elstakigo"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[neatendite] misa nodnomo: \"%s\""
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Nekonata indekso \"%s\""
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info ne povas trakti \":\" en indeksa artikolo \"%s\""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Jam estas indekso \"%s\""
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Nekonata indekso \"%s\" kajaux \"%s\" en @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Nekonata indekso \"%s\" en @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Artikolo por indekso \"%s\" estas ekster iu ajn nodo"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(ekster iu ajn nodo)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Vidu "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Misa tipo en la funkcio insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Troo en la stako de enumeracioj"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "mankas sekva enumeracia litero, rekomencite ekde %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s bezonas argumenton: la arangxilon por %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "\"@end\" atendis \"%s\", sed renkontis \"%s\""
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Mankas para \"%cend %s\""
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s bezonas literon aux ciferon"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "dosierfino ene de pretarangxita bloko"
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s estas sensenca ene de bloko \"@%s\""
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu jam antaux la unua @nodo; nodo \"Top\" kreitas"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "eble via @top-nodo staru sub @ifnottex anstataux sub @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu renkontita jam antaux la unua nodo; nodo \"Top\" kreitas"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s estas sensenca ene de bloko \"@%s\""
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Mankas para \"%c%s\""
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "\"%c%s\" bezonas post si ion"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Misa argumento por \"%s\", \"%s\", uzanta \"%s\""
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s estas sensenca ene de bloko \"@%s\""
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx estas sensenca ene de bloko \"%s\""
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s renkontita ekster \"insertion block\""
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s ne estas valida lingvokodo laux ISO 639"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "nekonata nomo de kodosistemo: %s\""
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "Pardonon, la kodo \"%s\" ne estas disponebla"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "misa kodoprezento: \"%s\""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s atendas argumenton \"i\" aux \"j\", ne \"%c\""
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s akceptas nur solsignan argumenton \"i\" aux \"j\""
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makroo \"%s\" jam difinita antauxe"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "cxi tie estas la antauxa difino de \"%s\""
+
+#: makeinfo/macro.c:355
+#, fuzzy, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+"en makroo, \\ sekvata de \"%s\" (anstataux de \\ aux nomo de parametro)"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makroo \"%s\" en la linio %d havas troan argumenton"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "makroo %cend ne trovigxis"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg utilas nur en sol-argumentaj makrooj"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "misa @end %s por @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Tro multe da eraroj! Halt'.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: averto: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Misloka %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Por pluaj detaloj tajpu \"%s --help\".\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Uzmaniero: %s [OPCIO]... TEXINFO-DOSIERO...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Tradukas fontan Texinfo-dokumenton en diversajn aliajn formojn, defauxlte "
+"en\n"
+"Info-dosierojn tauxgajn por dialoga legado per Emakso aux per auxtonoma GNU-"
+"Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Gxeneralaj opcioj:\n"
+" --error-limit=NOM Cxesu post NOM eraroj (defauxlte %d).\n"
+" --force Retenu eligajxon ecx post eraroj.\n"
+" --help Eligu cxi tiun helpon kaj finu.\n"
+" --no-validate Ne kontrolu la internodajn referencojn.\n"
+" --no-warn Ne eligu avertojn (ne koncernas "
+"erarmesagxojn).\n"
+" --reference-limit=NUM Avertu pri ne pli ol N referencoj (defauxlte "
+"%d).\n"
+" -v, --verbose Rakontu kio estas farata.\n"
+" --version Eligu la nomon, la version de la programo kaj "
+"eliru.\n"
+
+#: makeinfo/makeinfo.c:364
+#, fuzzy, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Por elekti celformon (defauxlte, Info):\n"
+" --docbook Generu en DocBook anstataux en Info.\n"
+" --html Generu en HTML anstataux en Info.\n"
+" --xml Generu en XML (TexinfoML) anstataux en Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Gxeneralaj opcioj generadaj:\n"
+" -E, --macro-expand DOSIER Konservu makrotraktitan fontajxon en DOSIERo,\n"
+" sen atenti cxiajn @setfilename.\n"
+" --no-headers Generu platan tekston, sen dispartigi en "
+"nodojn,\n"
+" sen fari la \"Node:\"liniojn kaj menuojn; "
+"krome,\n"
+" eligu en la cxefeligujon manke de --output.\n"
+" --no-split Ne disfendu grandan Info- aux HTML-dosieron,\n"
+" faru unu solan rezultan dosieron.\n"
+" --number-sections Generu kun la numeroj de cxapitroj, sekcioj "
+"ktp.\n"
+" -o, --output=DOSIER Skribu en DOSIERon (DOSIERujon, por fenda "
+"HTML).\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Opcioj por Info kaj plata teksto:\n"
+" --enable-encoding Eligu diakritajxojn kaj specialajn signojn\n"
+" laux @documentencoding.\n"
+" --fill-column=N Rompu Info-liniojn post N signoj (defauxlte %"
+"d)\n"
+" --footnote-style=STILO Arangxu la piednotojn laux STILO:\n"
+" \"separate\" -- loku piednotojn en apartan "
+"nodon;\n"
+" \"end\" -- loku ilin fine de la nodo en "
+"kiu\n"
+" ili estas difinitaj (la defauxlto).\n"
+" --paragraph-indent=VAL Alinea ensxovo estu VAL spacetoj (defauxlte %"
+"d);\n"
+" se VAL estas \"none\", ne ensxovu;\n"
+" se VAL estas \"asis\", obeu la fontan "
+"ensxovon.\n"
+" --split-size=N Fendu en dosierojn po N (defauxlte %d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+#, fuzzy
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Opcioj pri la fontodosieroj:\n"
+" --commands-in-node-names Permesu @-komandojn en nodnomoj.\n"
+" -D VAR Difinu la variablon VAR, kiel per @set.\n"
+" -I UJO Alkrocxu dosierUJOn al la sercxvojo de "
+"@include.\n"
+" -P UJO Antauxmetu dosierUJOn al la sercxvojo de "
+"@include.\n"
+" -U VAR Maldifinu la variablon VAR, kiel per "
+"@clear.\n"
+
+#: makeinfo/makeinfo.c:425
+#, fuzzy
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Kondicxa traktado cxe enigo:\n"
+" --ifhtml Traktu la pecojn sub @ifhtml kaj @html ecx se ne\n"
+" HTML estas generata\n"
+" --ifinfo Traktu la pecojn sub @ifinfo ecx se ne Info generatas\n"
+" --ifplaintext Traktu la pecojn sub @ifplaintext ecx se alia formo ol\n"
+" plata teksto estas generata\n"
+" --iftex Traktu la pecojn sub @iftex kaj @tex; implicas --no-"
+"split\n"
+" --ifxml Traktu la pecojn sub @ifxml kaj @xml\n"
+" --no-ifhtml Ne traktu la pecojn sub @ifhtml kaj @html\n"
+" --no-ifinfo Ne traktu la pecojn sub @ifinfo.\n"
+" --no-ifplaintext Ne traktu la pecojn sub @ifplaintext\n"
+" --no-iftex Ne traktu la pecojn sub @iftex kaj @tex\n"
+" --no-ifxml Ne traktu la pecojn sub @ifxml kaj @xml\n"
+
+#: makeinfo/makeinfo.c:444
+#, fuzzy
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+"La defauxlta konduto de la @if...-frazoj dependas je la celata formo:\n"
+"se HTML estas generata, --ifhtml sxaltigxas kaj la ceteraj, malsxaltigxas;\n"
+"cxe Info-generado, --ifinfo sxaltigxas kaj la ceteraj, malsxaltigxas; \n"
+"se plata teksto estas generata, --ifplaintext sxaltigxas kaj la ceteraj,\n"
+"malsxaltigxas.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Ekzemploj:\n"
+" makeinfo UM.texi konservu Info laux @setfilename\n"
+" makeinfo --html UM.texi konservu HTML laux @setfilename\n"
+" makeinfo --xml UM.texi konservu Texinfo-XML laux "
+"@setfilename\n"
+" makeinfo --docbook UM.texi konservu DocBook-XML laux "
+"@setfilename\n"
+" makeinfo --no-headers -o - UM.texi sendu platan tekston en cxefeligujon\n"
+"\n"
+" makeinfo --html --no-headers UM.texi konservu HTML sen \"Node:\"-linioj, "
+"menuoj\n"
+" makeinfo --number-sections UM.texi konservu Info kun la sekcinumeroj\n"
+" makeinfo --no-split UM.texi faru unu Info-dosieron, kiom ajn "
+"grandan\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: la argumento %s devas esti nombra, ne \"%s\".\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Fiaskis malfermo de makrotraktada eligdosiero \"%s\""
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "Fiaskis malfermo de makrotraktada eligdosiero \"%s\""
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: argumento de la opcio --paragraph-indent estu nombra, \"none\" aux\n"
+"\"asis\", ne \"%s\".\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: argumento de la opcio --footnote-style estu \"separate\" aux\n"
+"\"end\", ne \"%s\".\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: mankas dosiera argumento.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "\"%s\" atendatas"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Provo krei dosierujon \"%s\" malsukcesis: %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Neniu \"%s\" trovita en \"%s\""
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Makrotraktitajxo ne trafos en la cxefeligujon cxar Info iras tien.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "%s-dosiero \"%s\" estas generata el \"%s\".\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Cxi tiun dosieron %s generis Makeinfo-%s el %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: La eligdosiero \"%s\" por makrotraktitajxo forigitas cxar estis eraroj;\n"
+"uzu la opcion --force por gxin reteni.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: La eligdosiero \"%s\" forigitas cxar estis eraroj;\n"
+"uzu la opcion --force por gxin reteni.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Nekonata komando \"%s\"."
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Uzu vinkulojn por pasigi al \"@%s\" komandan argumenton"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s postulas vinkulojn \"{...}\""
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Senpara \"}\""
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "SEN_NOMO!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s sen \"}\""
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "por HTML, la dosiero \"%s\" en la komando @image estas nelegebla: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "Neniu \"%s\" trovita en \"%s\""
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "bilddosiero \"%s\" (por teksto) estas nelegebla: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "mankas dosiera argumento en la komando @image"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Mankas Valoro Por \"%s\"}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s bezonas nomon"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Pli frue ol la para @end %s renkontigxis dosierfino"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "\"%.40s...\" tro longas por malvolvo; malvolvo ne okazos"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Mankas \"}\" en la sxablono de @multitable"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "la misa teksto \"%s\" post @multitable estas ignorita"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Tro da kolumnoj en elemento de \"multitable\" (%d maksimume)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[neatendite] maleblas elekti %d-an kolumnon en \"multitable\"."
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "komando @tab ekster \"multitable\"; ignorita"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Multekolumna eligo el la lasta linio:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolumno %d-a: eligajxo = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Nodo \"%s\" jam difinita en la linio %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Estas arangxata la nodo \"%s\" ...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Nodo \"%s\" bezonas subdividan komandon (ekz-e %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Mankas nodnomo por la komando \"%c%s\""
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Dosiernoma kolizio por la ankro \"%s\" kaj la nodo \"%s\""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Cxi tiu @anchor-komando estas ignorita; la referencoj al gxi ne funkcios"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Alinomu la ankron aux uzu la opcion \"--no-split\""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Nekonvena signocxeno fine de disfendita HTML-dosiero \"%s\""
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Sekva:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Antauxa:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Supre:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Dosiernoma kolizio por la ankroj \"%s\" kaj \"%s\""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "Ignorita @anchor-komando; la referencoj al gxi ne funkcios"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s referencas neekzistantan nodon \"%s\" (cxu eraro en sekciarangxo?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Menuo"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Referenco"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"La kampo \"Next\" de la nodo \"%s\" ne estas reciprokita (cxu misa "
+"sekciarangxo?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Cxi tiu nodo (\"%s\") havas eraran kampon \"Prev\""
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Antauxa"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "La kampo \"Prev\" de la nodo \"%s\" ne estas reciprokita"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Cxi tiu nodo (\"%s\") havas eraran kampon \"Next\""
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "\"%s\" malhavas kampon \"Up\" (cxu eraro en sekciarangxo?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Supre"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "En \"%s\" mankas menuero por \"%s\", malgraux ties ligilo \"Up\"\""
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "la nodo \"%s\" estis referencita %d fojojn"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "la nodo \"%s\" ne estas referencita"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Provo krei dosierujon \"%s\" malsukcesis: %s"
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "Aldono %c"
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Interna eraro (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Interna eraro (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s arkaikigxis; uzu %c%s anstatauxe"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Jam estas nodo kun sekcio %ctop"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Jen estas la nodo %ctop"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop aperis pli frue ol %cnode; la defauxlto uzota estas %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Enhavtabelo"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Maldetala enhavtabelo"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "dosiero \"%s\" en la komando @image estas nelegebla: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: averto: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " por %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tPor ricevi kompletan liston da opcioj tajpu \"%s --help\".\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Sintakso: %s [OPCIO]... [INFO-DOSIERO [DIR-DOSIERO]]\n"
+"\n"
+"Instalu aux forigu \"dir\"-ajxojn el INFO-DOSIERO en la Info-katalogo\n"
+" DIR-DOSIERO.\n"
+"\n"
+"Opcioj:\n"
+"--delete Forigu la ekzistantajn \"dir\"-ajxojn pri INFO-DOSIERO;\n"
+" ne ensxovu iun ajn novan \"dir\"-ajxon.\n"
+"--dir-file=NOMO Indiku la dosieran NOMOn de Info-katalogo.\n"
+" Samkiel uzi la argumenton DIR-DOSIERO.\n"
+"--entry=TEKSTO Ensxovu TEKSTOn kiel \"dir\"-ajxojn por Info-katalogo.\n"
+" TEKSTO havu la formon de menuera linio plus nul aux\n"
+" pluraj linioj kromaj, komencantaj per blanka spaco.\n"
+" Se estas pli ol unu \"dir\"-ajxo, ili cxiuj aldonigxos.\n"
+" Se estas nenia \"dir\"-ajxo, aldonigxos \"dir\"-ajxoj\n"
+" determinitaj el la informoj de la Info-dosiero.\n"
+"--help Eligu la helpon.\n"
+"--info-file=DOSIERO Indiku Info-DOSIEROn instalendan en la Info-katalogo.\n"
+" Samkiel uzi la argumenton INFO-DOSIERO.\n"
+"--info-dir=UJO Sinonimo por --dir-file=UJO/dir.\n"
+"--item=TEKSTO Sinonimo por --entry=TEKSTO\n"
+" Cxiu \"dir\"-ajxo fakte estas menuero.\n"
+"--quiet Ne eligu avertojn.\n"
+"--remove Sinonimo por --delete.\n"
+"--section=SEKC Metu la \"dir\"-ajxojn en sekcion SEKC de la Info-"
+"katalogo.\n"
+" Se pli ol unu sekcio estas indikitaj, cxiuj \"dir\"-"
+"ajxoj\n"
+" aldonigxas en ilin cxiujn. Se neniu sekcio estas "
+"indikita,\n"
+" ili determinigxos el la informoj de la Info-dosiero.\n"
+"--version Eligu la nomon, la version de la programo kaj eliru.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Cxi tio estas la dosiero .../info/dir, entenanta la pinton de la \n"
+"la hierarkio Info -- la cxefkatalogan nodon nomatan (dir)Top.\n"
+"Unuafoje lancxinte la programon Info, vi trafas en tiun nodon.\n"
+"\n"
+"%s\\tLa pinto de la INFO-hierarkio\n"
+"\n"
+" Cxi tie (en la Info-katalogo) estas menuo de la cxefaj temoj.\n"
+" Tajpu \"q\" por eliri; \"?\" por eligi cxiujn komandojn de Info;\n"
+" \"d\" por reveni cxi tien; \"h\" vokas lernilon por komencantoj;\n"
+" \"mEmacs<Return>\" disponigas la manlibron pri Emakso; ktp.\n"
+"\n"
+" Se vi legas per Emakso, alklaku menueron aux referencon per la 2-a\n"
+" musbutono por elekti la temon.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: ne povas legi (%s) kaj ne povas krei (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: malplena dosiero"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY sen para END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY sen para START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Indiku la Info-dosieron solfoje.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "troa argumento komandlinia: \"%s\""
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Mankas enigdosiero; provu --help por pluaj informoj."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Mankas dosiero Info-katalogo (dir); provu --help por pluaj informoj."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "Nenia informo por Info-katalogo trovigxis en \"%s\""
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "menuero \"%s\" jam ekzistas (por la dosiero \"%s\")"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "Trovigxis nenia informo Info-kataloga pri \"%s\"; nenio igxis forigita"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "eligu cxi tiun helpon kaj eliru"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "konservu la labordosierojn post la traktado"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "ne konservu la labordosierojn post la traktado (defauxlto)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "sendu la eligajxon en DOSIEROn"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "eligu la uzatan version kaj eliru"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Uzmaniero: %s [OPCIO]... DOSIERO...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Generu ordigitan indekson por cxiu TeX-a elig-DOSIERO.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "Kutime DOSIERO... estas \"umo.%c%c\" por dokumento \"umo.texi\".\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcioj:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: ne indeksa dosiero laux Texinfo"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "fiasko cxe remalfermo de %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Mankas pagxnumero en %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "la artikolo %s sekvas artikolon kun kromnomo"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Indiku la Info-katalogon solfoje.\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" ne validas"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "\"%s\" ne estas valida ISO-kodo; estos \"%c\" anstatauxe"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Ne povas esti pli ol unu makrotraktada eligdosiero"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "La dosiero ekzistas, sed gxi ne estas dosierujo"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "La unua argumento de internoda referenco ne vaku"
+
+#~ msgid "see "
+#~ msgstr "vidu "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "Referencon devas sekvi punkto aux komo, ne %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "La unua argumento de @inforef ne vaku"
+
+#~ msgid "Node:"
+#~ msgstr "Nodo:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: cxi tie mankas enhavtabelo"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "virtuala memoro elcxerpitas"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "Troveblas nek \"%s.png\" nek \".jpg\", kaj sufikso mankas"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s; por la dosiero \"%s\".\n"
diff --git a/Build/source/utils/texinfo/po/fr.gmo b/Build/source/utils/texinfo/po/fr.gmo
new file mode 100644
index 00000000000..daa9765f606
--- /dev/null
+++ b/Build/source/utils/texinfo/po/fr.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/fr.po b/Build/source/utils/texinfo/po/fr.po
new file mode 100644
index 00000000000..59e25de8c9c
--- /dev/null
+++ b/Build/source/utils/texinfo/po/fr.po
@@ -0,0 +1,3524 @@
+# Version française du progiciel texinfo
+# Copyright Š 2004 Free Software Foundation, Inc.
+# Michel Robitaille <robitail@iro.umontreal.ca>, traducteur depuis/since 1996.
+#
+# Laurent Bourbeau est le traducteur officiel mais depuis plus d'un
+# an, Michel assume la traduction avec l'accord de Laurent.
+#
+# Laurent Bourbeau <bourbeau@progiciels-bpi.ca>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.90\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-06 08:00-05:00\n"
+"Last-Translator: Laurent Bourbeau <bourbeau@progiciels-bpi.ca>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Avancer d'un caractčre"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Reculer d'un caractčre"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Se déplacer au début de cette ligne"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Se déplacer ŕ la fin de cette ligne"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Avancer d'un mot"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Reculer d'un mot"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Éliminer le caractčre sous le curseur"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Éliminer le caractčre précédent le curseur"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Annuler ou opération de quitter"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Accepter cette ligne (ou en forcer la complétion)"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Insérer le prochain caractčre textuellement"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Insérer ce caractčre"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Insérer un caractčre TAB (tabulation)"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transposer les caractčres en position du point courant"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Recoller le contenu du dernier effacement"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "L'anneau des effacements temporaires est vide"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Recoller un effacement antérieur"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Effacer du point courant jusqu'ŕ la fin de la ligne"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Effacer du point courant jusqu'au début de la ligne"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Effacer le mot suivant le curseur"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Effacer le mot précédent le curseur"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Aucune complétion"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Non complet"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Énumérer les complétions possibles"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Une seule complétion"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Une complétion:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d complétions:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Insérer la complétion"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Construction des complétions..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Dérouler la fenętre des complétions"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Les notes en bas de page ne peuvent pas ętre affichées"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr ""
+"Montrer les notes en bas de page associées ŕ ce noeud dans une autre fenętre"
+
+# Est-ce vraiment un message ŕ traduire? NON.
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "----- Notes de bas de page ----"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Rechercher une chaîne dans l'index pour ce fichier"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Recherche des entrées d'index..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Aucun indice retrouvé."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Entrée d'index: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Aller ŕ prochaine référence d'index ŕ partir de la derničre commande Ť "
+"\\[index-search] ť "
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Aucune autre chaîne de fouille d'index."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Aucune entrée d'index."
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Aucune entrée %sindex contenant Ť %s ť."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "plus "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "NE PEUT PAS VOIR CECI"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"Ť %s ť repéré dans %s. (Ť \\[next-index-match] ť cherchera le prochain.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Fouille des indices de Ť %s ť..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Aucun fichier info disponible n'a Ť %s ť dans leurs indices."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Aplatir tous les indices de fichier Info connus pour une chaîne et "
+"construire un menu"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Index ŕ-propos: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Noeuds dont les indices contiennent \"%s\":\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Utiliser --help pour plus d'informations.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"AUCUNE garantie n'est donnée. Vous pouvez redistribuer des copies\n"
+"de ce logiciel selon les termes de la licence GNU General Public License.\n"
+"Pour plus d'informations, consultez le fichier COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "aucune entrée d'index retrouvée pour Ť %s ť\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly Ętre compatible au synthétiseur de voix.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Usage: %s [OPTION]... [ITEM-MENU...]\n"
+"\n"
+"Lire la documentation en format Info.\n"
+"\n"
+"Options:\n"
+" --apropos=SUJET Consulter SUJET dans tout indice de tout "
+"manuel.\n"
+" -d, --directory=RÉP Ajouter le RÉPertoire dans INFOPATH.\n"
+" --dribble=FICHIER Accumuler les clés-clavier de l'usager dans "
+"FICHIER.\n"
+" -f, --file=FICHIER Spécifier le fichier Info ŕ visiter.\n"
+" -h, --help Afficher ce menu d'aide et quitter.\n"
+" --index-search=CHAÎNE Aller au noeud pointé par CHAÎNE d'entrée "
+"d'index.\n"
+" -n, --node=NOEUD Spécifier les NOEUDS dans le fichier Info "
+"visité en premier.\n"
+" -o, --output=FICHIER Écrire dans FICHIER les noeuds sélectionnés.\n"
+" -R, --raw-escapes Ne pas enlever les séquences d'échappements "
+"ANSI des man pages.\n"
+" --no-raw-escapes Fournir les séquences d'échappements comme du "
+"texte.\n"
+" --restore=FICHIER Lire du FICHIER les clés-clavier initiales.\n"
+" -O, --show-options, --usage Aller au noeud des options de ligne-de-"
+"commande.\n"
+"%s --subnodes Écrire récursivement les items-menu.\n"
+" --vi-keys Utiliser les raccourcis-clavier comme vi et "
+"less.\n"
+" --version Afficher la version du logiciel et quitter.\n"
+"\n"
+"Le premier argument, n'étant pas une option et si présent, est l'entrée "
+"menu\n"
+"de départ; il est recherché dans tous les fichiers Ť dir ť le long de "
+"INFOPATH.\n"
+"S'il est absent, Info fusionne tous les fichiers Ť dir ť et montre le "
+"résultat.\n"
+"Tous les arguments subséquents sont traités comme des noms d'items de menu\n"
+"relatifs au noeud initial visité.\n"
+"\n"
+"Exemples:\n"
+" info Montrer le menu dir de niveau-supérieur\n"
+" info emacs Partir du noeud emacs dans dir niveau-"
+"supérieur\n"
+" info emacs buffers Partir du noeud buffers dans le niveau emacs\n"
+" info --show-options emacs Partir du noeud --show-options dans niveau "
+"emacs\n"
+" info -f ./foo.info Montrer le fichier ./foo.info, sans chercher "
+"dir\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Rapporter toute anomalie ŕ bug-texinfo@gnu.org et poster\n"
+"vos questions et autre discussion ŕ help-texinfo@gnu.org.\n"
+"Site de Texinfo: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Ne peut pas trouver le noeud Ť %s ť."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Ne peut pas trouver le noeud Ť (%s)%s ť."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Ne peut pas trouver une fenętre permanente!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Le point courant n'apparaît pas dans ce noeud de fenętre!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Ne peut pas éliminer la derničre fenętre."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Aucun menu dans ce noeud."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Aucune note de bas de page dans ce noeud."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Aucune référence croisée dans ce noeud."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Aucun pointeur Ť %s ť pour ce noeud."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Commande Info Ť %c> ť inconnue; essayer Ť ? ť pour de l'aide."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Le type de terminal Ť %s ť n'est pas en mesure de rouler Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Vous ętes déjŕ au point terminal de ce noeud."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Vous ętes déjŕ au point initial de ce noeud."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Une seule fenętre."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "La fenętre résultante sera trop petite."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Pas assez de place pour une fenętre d'aide, fermer svp une fenętre."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Commandes de base en Info Windows\n"
+"---------------------------------\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Quitter ce menu d'aide.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Quitter complčtement le mode Info.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Faire appel au tutoriel Info.\n"
+
+# Est-ce vraiment un message ŕ traduire? NON.
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Sélection d'autres modes:\n"
+"------------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Aller au noeud Ť next ť de ce noeud.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Aller au noeud Ť previous ť de ce noeud.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Aller au noeud Ť up ť ŕ partir de ce noeud.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Choisir un item menu ŕ partir de son nom.\n"
+" Choisir un item menu provoque la sélection d'un autre noeud.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Suivre une référence croisée. Lire le nom de la "
+"référence.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Aller au dernier noeud observé dans cette fenętre.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Sauter au prochain hyperlien ŕ l'intérieur de ce "
+"noeud.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Sauter au prochain hyperlien ŕ l'intérieur de ce "
+"noeud.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Suivre l'hyperlien sous le curseur.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Aller au noeud Ť directory ť. Équivalent ŕ Ť g (DIR) ť.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Aller au noeud supérieur Top. Équivalent ŕ Ť g Top ť.\n"
+
+# Est-ce vraiment un message ŕ traduire? NON.
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Se déplacer ŕ l'intérieur d'un noeud:\n"
+"------------------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Aller au point initial de ce noeud.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Aller au point terminal de ce noeud.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Avancer de 1 ligne.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Reculer de 1 ligne.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Avancer d'une page.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Reculer d'une page.\n"
+
+# Est-ce vraiment un message ŕ traduire? NON.
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Autres commandes:\n"
+"----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] Choisir d'abord ... le neuvičme item dans le menu de "
+"noeuds.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr ""
+"\\%-10[last-menu-item] Choisir le dernier item dans le menu de noeuds.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Choisir la chaîne spécifiée dans les entrées d'index "
+"de ce Info\n"
+" et sélectionner le noeud référencé par la premičre entrée "
+"trouvée.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Aller au noeud spécifié par le nom.\n"
+" Vous pouvez aussi bien inclure un nom de fichier, comme dans "
+"(FILENAME)NODENAME.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Fouiller ŕ reculons pour une chaîne spécifiée\n"
+" et sélectionner le noeud dans lequel se trouve la prochaine "
+"occurrence.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Fouiller ŕ reculons pour une chaîne spécifiée\n"
+" et sélectionner le noeud dans lequel se trouve la prochaine "
+"occurrence.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Quitter ce menu d'aide.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Quitter complčtement le mode Info.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Faire appel au guide Info.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Aller au noeud Ť next ť de ce noeud.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Aller au noeud Ť previous ť de ce noeud.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Aller au noeud Ť up ť ŕ partir de ce noeud.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Choisir l'item menu indiqué par le nom.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" Choisir un item menu provoque la sélection d'un autre noeud.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Suivre une référence croisée. Lire le nom de la référence.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Aller au dernier noeud observé dans cette fenętre.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Sauter au prochain hyperlien ŕ l'intérieur de ce noeud.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Suivre l'hyperlien sous le curseur.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Aller au noeud Ť directory ť. Équivalent ŕ Ť g (DIR) ť.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Aller au noeud supérieur Top. Équivalent ŕ Ť g Top ť.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Avancer d'une page.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Reculer d'une page.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Aller au point initial de ce noeud.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Aller au point terminal de ce noeud.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Avancer de 1 ligne.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Reculer de 1 ligne.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr ""
+" %-10s Choisir d'abord ... le neuvičme item dans le menu de noeuds.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Choisir le dernier item dans le menu de noeuds.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Fouiller pour une chaîne spécifiée dans les entrées d'index de ce "
+"fichier Info,\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" et sélectionner le noeud référencé par la premičre entrée "
+"trouvée.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Aller au noeud indiqué par le nom.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Vous pouvez aussi bien inclure un nom de fichier, comme dans "
+"(FILENAME)NODENAME.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Fouiller vers l'avant pour une chaîne spécifiée,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" et sélectionner le noeud dans lequel se trouve la prochaine "
+"occurrence.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Fouiller ŕ reculons pour une chaîne spécifiée\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Le chemin de fouille courant est:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Commandes disponibles en Info Windows:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Commandes disponibles dans la zone Ť echo area ť:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Les commandes suivantes peuvent ętre invoquées uniquement via %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Les commandes suivantes ne peuvent pas ętre invoquées:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Utiliser Ť \\[history-node] ť ou Ť \\[kill-node] ť pour sortir ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Afficher le message d'aide"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Visiter le noeud Info Ť (info)Help ť"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Imprimer la documentation relative ŕ KEY"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Décrire la clé: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s est non défini."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s est non défini."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s est défini ŕ %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Montrer quoi écrire afin d'exécuter une commande donnée"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Oů se trouve la commande: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "Ť %s ť ne se trouve pas sur une clé quelconque"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s peut ętre invoqué uniquement via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s peut ętre invoqué via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Il n'y a pas de fonction nommée Ť %s ť"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright Š %s Free Software Foundation, Inc.\n"
+"AUCUNE garantie n'est donnée. Vous pouvez redistribuer des copies\n"
+"de ce logiciel selon les termes de la licence GNU General Public License.\n"
+"Pour plus d'informations, consultez le fichier COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "nombre incorrect d'arguments"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "Ne peut ouvrir le fichier d'entrée Ť %s ť."
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "Ne peut pas créer le fichier de sortie Ť %s ť."
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "erreur d'écriture dans Ť %s ť"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "erreur de fermeture du fichier de sortie Ť %s ť."
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "séquence de clé trop longue"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "séquence de clé manquante"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "Caractčre NUL (\\000) n'est pas permis"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "Caractčre NUL (^%c) n'est pas permis"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "nom de l'action manquant"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "section trop longue"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "action inconnue Ť %s ť."
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "nom de l'action trop long"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "caractčres superflues détectés aprčs l'action Ť %s ť."
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "nom de variable manquant"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "Ť = ť manquant immédiatement aprčs le nom de la variable"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "nom de variable trop long"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "valeur trop longue"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "Ť %s ť, ligne %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Usage: %s [OPTION]... [FICHIER-ENTRÉE]\n"
+"\n"
+"Compiler le fichier source infokey en un fichier infokey. Lire le FICHIER-"
+"ENTRÉE\n"
+"(par défaut $HOME/.infokey) et écrire le fichier de clé compilé ŕ $HOME/."
+"info. (par défaut)\n"
+"\n"
+"Options:\n"
+" --output FICHIER Produire la sortie dans le FICHIER au lieu de $HOME/."
+"info\n"
+" --help Afficher le menu d'aide et quitter.\n"
+" --version Afficher le version du logiciel et quitter.\n"
+"\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Fichier infokey invalide ignoré Ť %s ť - trop petit"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Fichier infokey invalide ignoré Ť %s ť - trop gros"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Erreur de lecture du fichier infokey Ť %s ť - lecture écourtée"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Fichier infokey invalide Ť %s ť (nombre magique erroné) -- exécuter infokey "
+"pour le mettre ŕ jour"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+"Votre fichier infokey Ť %s ť est désuet -- exécuter inforkey pour le mettre "
+"ŕ jour"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Fichier infokey invalide Ť %s ť (longueur de section erronée) -- exécuter "
+"infokey pour la mettre ŕ jour"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Fichier infokey invalide Ť %s ť (code de section erroné) -- exécuter infokey "
+"pour le mettre ŕ jour"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+"Données erronées dans le fichier infokey -- quelques jumelages de clés "
+"ignorés"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"Données erronées dans le fichier infokey -- quelques initialisations de "
+"variables ignorées"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Lire le nom d'une commande Info et la décrire"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Décrire la commande: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Lire le nom d'une commande dans la zone Ť echo area ť et l'exécuter"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Ne peut pas exécuter une commande Ť echo-area ť en cet endroit."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "commandes indéfinie: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Ajuster la hauteur de la fenętre affichée"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Ajuster la hauteur de l'écran ŕ (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Les fichiers sources aplatis pour faire ce fichier incluent:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Ne peut pas manipuler le fichier %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Fichier)Noeud Lignes Taille Contenant Fichier(s)\n"
+" -------------- ------ ------ --------------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Voici le menu de noeuds que vous avez visité récemment.\n"
+"Sélectionner en un de ce menu, ou utiliser Ť \\[history-node] ť dans une "
+"autre fenętre.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+"Faire une fenętre contenant un menu de tous les noeuds actuellement visités"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Sélectionner un noeud qui a déjŕ été visité dans une fenętre visible"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Sélectionner un noeud visité: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "La référence est disparue! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Bienvenue au mode Info version %s.\n"
+"Taper Ť \\[get-help-window] ť pour obtenir de l'aide.\n"
+"Taper Ť \\[menu-item] ť pour obtenir un item menu."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Descendre ŕ la ligne suivante"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Monter ŕ la ligne précédente"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Aller ŕ la fin de la ligne"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Aller au début de la ligne"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Noeud Ť Next ť"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Suivre le noeud Ť Next ť..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Sélectionner le premier item menu..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Sélectionner le noeud Ť Next ť..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Monter via Ť Up ť %d fois, puis passer au noeud Ť Next ť."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Aucun autre noeud dans ce document."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Aucun noeud Ť Prev ť pour ce noeud."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Monter au noeud Ť Prev ť dans cette fenętre."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Aucun noeud Ť Prev ť ou Ť Up ť pour ce noeud dans ce document."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Monter au noeud Ť Up ť dans cette fenętre."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Aller au dernier item menu du noeud Ť Prev ť."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Avancer ou descendre ŕ travers la structure de noeuds"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Reculer ou monter ŕ travers la structure de noeuds"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Défiler vers l'avant dans cette fenętre"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"Défiler vers l'avant dans cette fenętre et en fixer la dimension par défaut"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr ""
+"Défiler vers l'avant dans cette fenętre en demeurant ŕ l'intérieur du noeud"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Défiler vers l'avant dans cette fenętre en demeurant ŕ l'intérieur du noeud "
+"et en fixer la dimension par défaut"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Défiler ŕ reculons dans cette fenętre"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+"Défiler ŕ reculons dans cette fenętre et en fixer la dimension par défaut"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr ""
+"Défiler ŕ reculons dans cette fenętre en demeurant ŕ l'intérieur de ce noeud"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Défiler ŕ reculons dans cette fenętre en demeurant ŕ l'intérieur du noeud et "
+"en fixer la dimension par défaut"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Aller au point initial de ce noeud"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Aller au point terminal de ce noeud"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Défiler vers le bas par pas de N lignes"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Défiler vers le haut par pas de N lignes"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Défiler vers le bas par pas d'un demi écran"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Défiler vers le haut par pas d'un demi écran"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Sélectionner la fenętre suivante"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Sélectionner la fenętre précédente"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Diviser en deux la fenętre courante"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Éliminer la fenętre courante"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Ne peut pas éliminer une fenętre permanente"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Éliminer toutes les autres fenętres"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Défiler l'autre fenętre"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Défiler l'autre fenętre ŕ reculons"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Agrandir (ou réduire) cette fenętre"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Répartir l'espace écran disponible parmi les fenętres visibles"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Basculer l'état du remplissage de ligne dans la fenętre courante"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Sélectionner le noeud Ť Next ť"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Sélectionner le noeud Ť Prev ť"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Sélectionner le noeud Ť Up ť"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Sélectionner le dernier noeud dans ce fichier"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Cette fenętre a aucun noeud additionnel"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Sélectionner le premier noeud dans ce fichier"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Sélectionner le dernier item dans ce menu de noeuds"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Sélectionner cet item menu"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Il n'y a pas %d items dans ce menu."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Item menu (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Item menu: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Suivre xref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Suivre xref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Lire un item menu et sélectionner son noeud"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr ""
+"Lire une note de bas de page ou une référence croisée et sélectionner son "
+"noeud"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Aller au point initial de ce menu de noeuds"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Visiter d'un seul coup autant d'items menu que possible"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Lire un nom de noeud et sélectionner ce noeud"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Aller au noeud: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Aucun menu dans le noeud Ť %s ť."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Aucun item menu Ť %s ť dans le noeud Ť %s ť."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Incapable de trouver le noeud référencé par Ť %s ť dans Ť %s ť."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Lire une liste de menus en partant de Ť dir ť et les suivre"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Suivre les menus: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Trouver le noeud décrivant l'invocation au programme"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Trouver le noeud Invocation de [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Lire une référence de page-manuel et la sélectionner"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Obtenir la Page-manuel: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Sélectionner le noeud Ť Top ť dans ce fichier"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Sélectionner le noeud Ť (dir) ť"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Effacer le noeud (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Ne peut pas effacer le noeud Ť %s ť"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Ne peut pas effacer le dernier noeud"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Choisir le noeud qui a été le plus récemment sélectionné"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Effacer ce noeud"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Lire le nom d'un fichier et le sélectionner"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Trouver le fichier: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Ne peut pas trouver Ť %s ť."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Ne peut pas créer le fichier de sortie Ť %s ť."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Terminé."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Écriture du noeud Ť %s ť..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Acheminer les contenus de ce noeud ŕ travers INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Ne peut ouvrir un tube de communication ŕ Ť %s ť."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Impression du noeud Ť %s ť..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Fouille du sous-fichier Ť %s ť..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr ""
+"Lire une chaîne et en faire la fouille en distinguant les majuscules et "
+"minuscules"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Lire une chaîne et en faire la fouille"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Lire une chaîne et en faire la fouille ŕ reculons"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%s pour la chaîne [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Fouiller ŕ reculons"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Fouiller"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " en distinguant les casses majuscules et minuscules "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Fouille infructueuse."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Répéter la derničre fouille dans la męme direction"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Aucune chaîne de fouille antérieure"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Répéter la derničre fouille dans la direction inverse"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Fouiller interactivement pour une chaîne telle que vous la tapez"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "Fouille I-search ŕ reculons: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "Fouille I-search: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Échec "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Aller ŕ la référence croisée précédente"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Aller ŕ la prochaine référence croisée"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Sélectionner la référence ou l'item menu apparaissant sur cette ligne"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Annuler l'opération courante"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Quitter"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Déplacer le curseur sur une ligne spécifique de la fenętre"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Redessiner l'affichage écran"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Quitter en utilisant Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Exécuter la commande liée ŕ cette variante de touche en minuscule"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Commande inconnue (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "Ť %s ť est invalide"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "Ť %s ť est invalide"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Ajouter ce chiffre ŕ l'argument numérique courant"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Enclencher (ou multiplier par 4) l'argument numérique courant"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Utilisé internement par \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "lecture: Mémoire virtuelle épuisée!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr ""
+"En position Ť On ť, les notes en bas de page apparaissent et disparaissent "
+"automatiquement"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"En position Ť On ť, créer ou effacer une fenętre réajuste la dimension des "
+"autres fenętres"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr ""
+"En position Ť On ť, un clignotement d'écran est utilisé plutôt qu'un bruit "
+"de cloche"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "En position Ť On ť, les erreurs sont signalées par un bruit de cloche"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"En position Ť On ť, le ramasse-miette Info récolte les fichiers qui devaient "
+"ętre décomprimés"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr ""
+"En position Ť On ť, la portion de la chaîne de fouille appariée est mise en "
+"surbrillance"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+"Contrôler ce qui arrive lorsqu'un défilement est requis ŕ la fin d'un noeud"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Le nombre de lignes ŕ défiler quand le curseur va hors de la fenętre"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "En position Ť On ť, Info accepte et affiche les caractčres ISO Latin"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Expliquer l'usage d'une variable"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Décrire la variable: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Fixer la valeur d'une variable Info"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Fixer la variable: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Fixer %s ŕ la valeur (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Fixer %s ŕ la valeur (%s): "
+
+# Est-ce vraiment un message ŕ traduire?
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Étiquettes passées Date ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), lignes ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d lignes --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d lignes --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Sous-fichier: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: l'option Ť %s ť est ambiguë\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: l'option Ť --%s ť ne permet pas un argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: l'option Ť %c%s ť ne permet pas un argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: l'option Ť %s ť exige un argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: option non reconnue Ť --%s ť\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: option non reconnue Ť %c%s ť\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: option illégale -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: option invalide -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: l'option exige un argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: l'option Ť -W %s ť est ambiguë\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: l'option Ť -W %s ť ne permet pas un argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "arguments ŕ @%s ignorés"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "janvier"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "février"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "mars"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "avril"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "mai"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "juin"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "juillet"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "aoűt"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "septembre"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "octobre"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "novembre"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "décembre"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "caractčre %c improbable dans la macro @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "argument de la macro @sc tout en majuscules, alors aucun effet"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "Ť { ť attendu, mais a vu Ť %c ť"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "fin de fichier ŕ l'intérieur du bloc verbe"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "Ť } ť attendu, mais a vu Ť %c ť"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Note...} produit une table douteuse de références croisées dans "
+"Info; réécrire pour éviter cela"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s est périmé"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "La macro @sp exige un argument numérique positif, pas Ť %s ť"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Mauvais argument ŕ %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "Ť asis ť"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "Ť none ť"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "Mauvais argument ŕ @%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "insérer"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Accolade Ť } ť manquante dans @def arg"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Fonction"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Macro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Forme Spéciale"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variable"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Option de l'Usager"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Variable d'Instance"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Méthode"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "de"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "sur"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Doit ętre dans une insertion Ť @%s ť afin d'utiliser Ť @%s ť."
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "Ť %s ť omis avant le nom de fichier de sortie"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "Ť %s ť omis avant l'écriture sur la sortie standard"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Tampon de sortie n'est pas vide."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "Ť %c%s ť nécessite un argument Ť {...} ť, non pas Ť %s ť uniquement"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Accolade fermante Ť } ť manquante pour la note de bas de page Ť %s ť"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "La note de bas de page est définie sans noeud parent"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Les notes de bas de page récursives ne sont pas permises"
+
+# Est-ce vraiement un message ŕ traduire?
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Notes de bas de page"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: ne peut ouvrir --css-file: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s%d: --css-file terminé dans le commentaire"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Sans titre"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[inattendu] pas d'étiquette html ŕ dépiler"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[inattendu] nom de noeud invalide: Ť %s ť"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Nom d'index inconnu Ť %s ť"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info ne peut traiter Ť : ť dans l'entrée d'index Ť %s ť"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "L'index Ť %s ť existe toujours"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Nom d'index Ť %s ť inconnu et/ou Ť %s ť dans @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(ligne )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(ligne %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Nom d'index Ť %s ť inconnu dans @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Entrée pour l'index Ť %s ť ŕ l'extérieure de tout noeud"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(ŕ l'extérieur de tout noeud)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Voir "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item n'est pas permis dans l'agument @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Type impossible dans la fonction insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Débordement de la pile d'énumérations"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "débordement du lettrage, reprise ŕ partir de %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s exige un argument: le formateur pour %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "%cenvironnements float ne peuvent ętre imbriqués"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "Ť @end ť s'attendait ŕ Ť %s ť, mais a vu Ť %s ť"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Ť %cend %s ť non apparié"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s exige une lettre ou un chiffre"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "fin de fichier ŕ l'intérieur du bloc verbatim"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s n'a aucun sens ŕ l'extérieur de l'environnement Ť @float ť"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu vu avant le premier @node, création du noeud Ť Top ť"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"votre noeud @top devrait se retrouver peut-ętre dans @ifnottex plutôt que "
+"dans @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu vu avant le premier noeud, création du noeud Ť Top ť"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+"@%s n'a aucun sens ŕ l'extérieur des environnements Ť @titlepage ť et Ť "
+"@quotation ť"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s n'a aucun sens ŕ l'extérieur de l'environnement Ť @titlepage ť"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Ť %c%s ť non apparié"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "Ť %c%s ť a besoin de quelque chose aprčs lui"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Mauvais argument Ť %s ť ŕ Ť @%s ť utilisant Ť %s ť"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "macro @%s inactive ŕ l'intérieur d'un bloc Ť %s ť"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "macro @itemx inactive ŕ l'intérieur d'un bloc Ť %s ť"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s est trouvé ŕ l'extérieur d'un bloc d'insertion"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s n'est pas un code ISO 639 valide pour l'identification de langue"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "nom d'encodage non reconnu Ť %s ť"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "désolé, l'encodage Ť %s ť n'est pas supporté"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "caractčre encodé invalide Ť %s ť"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s s'attend ŕ argument Ť i ť ou Ť j ť, non pas Ť %c ť"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s attend un argument d'un seul caractčre Ť i ť ou Ť j ť"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "macro Ť %s ť déjŕ définie précédemment"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "ici se trouve la définition précédente de Ť %s ť"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+"\\ dans l'expansion de macro suivie par Ť %s ť au lieu du nom de paramčtre"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Macro Ť %s ť appelée ŕ la ligne %d avec trop d'arguments"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "macro %cend non trouvée"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "macro @quote-arg utile seulement pour des macros ŕ un seul argument"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "macro @end %s non balancée avec @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Beaucoup trop d'erreurs! Abandon.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: avertissement: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "%c égarée ou mal placée"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Utiliser Ť %s --help ť pour plus d'informations.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Usage: %s [OPTION]... FICHIER-TEXINFO...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Traduire une documentation Texinfo source en divers autres formats:\n"
+"Fichiers Info adéquats pour lire en ligne avec Emacs ou GNU Info autonome\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Options générales:\n"
+" --error-limit=NUM Quitter aprčs NUM erreurs (par défaut %d).\n"
+" --force Conserver la sortie męme s'il y a des erreurs.\n"
+" --help Afficher ce menu d'aide et quitter.\n"
+" --no-validate Supprimer la validation de la table de "
+"références.\n"
+" --no-warn Supprimer les avertissements (mais pas les "
+"erreurs).\n"
+" --reference-limit=NUM Avertir aprčs plus de NUM références (défaut %"
+"d).\n"
+" -v, --verbose En mode bavard, expliquer ce qui a été fait.\n"
+" --version Afficher la version du logiciel et quitter.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Options de sélection de format de sortie (par défaut produire Info):\n"
+" --docbook Écrire en format DocBook XML plutôt qu'en format Info.\n"
+" --html Écrire en format HTML plutôt qu'en format Info;\n"
+" --xml Produire en Texinfo XML plutôt qu'en format Info.\n"
+" --plaintext Produire en formast plein texte plutôt qu'en format Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Options générales de sortie:\n"
+" -E, --macro-expand FICHIER produire dans le FICHIER l'expension source de "
+"macro.\n"
+" ignorer tout @setfilename.\n"
+" --no-headers Supprimer les séparateurs de noeud Info et "
+"Node:\n"
+" lignes et écrire une sortie standard sans --"
+"output.\n"
+" --no-split suprimer les divisions de sortie Info ou HTML,\n"
+" générer seulement un seul fichier de sortie.\n"
+" --number-sections produire les numéros de chapitres et de "
+"sections.\n"
+" -o, --output=FICHIER produire la sortie dans le FICHIER (répertoire "
+"si division en HTML),\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Options pour Info et texte:\n"
+" --enable-encoding produire les caractčres accentués et spéciaux\n"
+" dans une sortie Info basée sur @documentencoding.\n"
+" --fill-column=NUM briser les lignes Info ŕ chaque NUM caractčres (par "
+"défaut %d).\n"
+" --footnote-style=STYLE produire les notes des bas de page en Info selon le "
+"STYLE:\n"
+" Ť separate ť pour les placer dans leur propre "
+"noeud;\n"
+" Ť end ť pour les placer ŕ la fin de leur noeud\n"
+" oů ils sont définis (par défaut).\n"
+" --paragraph-indent=NUM indenter les paragraphes Info par NUM espaces (par "
+"défaut %d).\n"
+" Si NUM est Ť none ť, ne pas indenter; si NUM est\n"
+" Ť asis ť, préserver l'indentation existente.\n"
+" --split-size=NUM séparer les fichiers Info selon la taille NUM (par "
+"défaut %d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+" --css-include=FICHIER inclure le FICHIER dans le <style> de "
+"sortie HTML;\n"
+" lire de stdin si le FICHIER est -.\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+" --output-indent=VAL indenter les éléments XML ŕ l'aide dee VAL "
+"espaces (par défaut %d).\n"
+" Si VAL vaut 0, les espaces pouvant ętre "
+"ignorés sont éliminés.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Options portant sur les fichier d'entrée:\n"
+" --commands-in-node-names permet les commandes @ dans les noms de "
+"noeuds.\n"
+" -D VAR Définir une variable, comme avec @set.\n"
+" -I DIR Ajouter ŕ la fin DIR au chemin de fouille "
+"@include.\n"
+" -P DIR Ajouter au début DIR au chemin de fouille "
+"@include.\n"
+" -U VAR Rendre indéfinie une variable, comme avec "
+"@clear.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Traitement conditionel de l'entrée:\n"
+" --ifdocbook Traiter @ifdocbook et @docbook męme s'il\n"
+" n'y a pas de génération Docbook.\n"
+" --ifhtml Traiter le textuel sous @ifhtml et @html męme\n"
+" s'il n'y a pas de génération HTML.\n"
+" --ifinfo Traiter le textuel sous @ifinfo męme\n"
+" s'il n'y a pas de génération Info.\n"
+" --ifplaintext Traiter le textuel sous @ifplaintext męme\n"
+" s'il n'y a pas de génération plein texte\n"
+" --iftex Traiter le textuel sous @iftex et @tex.\n"
+" implique l'option --no-split.\n"
+" --ifxml Traiter le textuel sous @ifxml et sous @xml.\n"
+" --no-ifhtml Ne pas traiter le textuel sous @ifhtml et @html.\n"
+" --no-ifinfo Ne pas traiter le textuel sous @ifinfo.\n"
+" --no-ifplaintext Ne pas traiter le textuel sous @ifplaintext.\n"
+" --no-iftex Ne pas traiter le textuel sous @iftex et @tex.\n"
+" --no-ifxml Ne pas traiter le textuel sous @ifxml et @xml.\n"
+"\n"
+" Aussi pour l'options --no-ifFORMAT, ne pas traiter le textuel "
+"@ifnotFORMAT.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+"Les valeurs par défaut pour le @if... conditionnels dépend du format de "
+"sortie:\n"
+"en géneration HTML, --ifhtml est Ť on ť et les autres sont Ť off ť ;\n"
+"en génération Info, --ifinfo est Ť on ť et les autres sont Ť off ť ;\n"
+"en génération plein texte, --ifplaintext est Ť on ť et les autres sont Ť off "
+"ť ;\n"
+"en génération XML, --ifxml est Ť on ť et les autres sont Ť off ť.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Examples:\n"
+" makeinfo foo.texi Écrire en Info dans @setfilename de "
+"foo\n"
+" makeinfo --html foo.texi Écrire en HTML dans @setfilename de "
+"foo\n"
+" makeinfo --xml foo.texi Écrire en XML dans @setfilename de "
+"foo\n"
+" makeinfo --docbook foo.texi Écrire le DocBook en XML dans "
+"@setfilename\n"
+" makeinfo --no-headers foo.texi Écrire en plein texte en sortie "
+"standard\n"
+"\n"
+" makeinfo --html --no-headers foo.texi Écrire en HTML sans les lignes de "
+"noeuds et de menus\n"
+" makeinfo --number-sections foo.texi Écrire en Info avec sections "
+"numérotées\n"
+" makeinfo --no-split foo.texi Écrire un fichier Info męme "
+"volumineux\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: valeur TEXINFO_OUTPUT_FORMAT non reconnue est ignoré Ť %s ť\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: l'argument %s doit ętre numérique, non pas Ť %s ť.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: ne peut ouvrir la sortie d'expansion de macro Ť %s ť"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: ignorer la sortie de l'expansion de la seconde macro Ť %s ť\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: l'argument de l'option --paragraph-indent doit ętre numérique, Ť none ť "
+"ou\n"
+"Ť asis ť, non pas Ť %s ť.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: l'argument de l'option --footnote-style doit ętre Ť separate ť ou\n"
+"Ť end ť, non pas Ť %s ť.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: absence d'un argument fichier.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Commande multilignes %c%s utilisé de maničre incorrecte"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Ť %s ť attendue"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Ne peut créer le répertoire Ť %s ť: %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Aucun Ť %s ť trouvé dans Ť %s ť"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Sauter l'expansion de macro qui irait sur stdout comme la sortie Info.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Fabrication du fichier %s Ť %s ť ŕ partir de Ť %s ť.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr ""
+"Ceci est le fichier Info %s, produit par Makeinfo version %s ŕ partir %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Enlčvement du fichier de sortie de macro Ť %s ť ŕ cause d'erreurs;\n"
+"utiliser l'option --force pour préserver.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Enlčvement du fichier de sortie Ť %s ť ŕ cause d'erreurs;\n"
+"utiliser l'option --force pour préserver.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Commande inconnue Ť %s ť."
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+"Utiliser des accolades pour donner une commande comme argument ŕ Ť @%s ť"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s accolades attendues"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Accolade Ť } ť non appariée"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "NOM_INCONNU!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s accolade fermante manquante"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "commande @image dans un fichier (pour HTML) Ť %s ť illisible: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Aucun fichier Ť %s ť"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "commande @image avec un fichier (texte) Ť %s ť illisible: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "commande @image ayant un argument fichier absent"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "fanion indéfini: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Aucune valeur pour Ť %s ť}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s exige un nom"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Fin de fichier rencontré avant l'appariement de @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+"Ť %.40s... ť est trop long pour l'expansion; n'a pas fait d'expansion"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Accolade Ť } ť manquante dans un patron @multitable"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "abandon du texte orphelin Ť %s ť aprčs la commande @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Trop de colonnes dans un item de multitable (%d max)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr ""
+"[inattendu] ne peut pas sélectionner la colonne #%d dans une multitable."
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "inhibition d'une commande @tab ŕ l'extérieur d'une multitable"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Sortie en multicolonnes ŕ partir de la derničre rangée:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* colonne #%d: sortie = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Le noeud Ť %s ť défini antérieurement ŕ la ligne %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Écriture du noeud Ť %s ť...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Le noeud Ť %s ť exige une commande de subdivision (i.e. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Aucun nom de noeud spécifié pour la commande Ť %c%s ť"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Ancre Ť %s ť et mode Ť %s ť pointe vers le męme nom de fichier"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Commande @anchor ignorée; les références vers celle-ci ne fonctionneront pas"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Renommer cette ancre ou utiliser l'option Ť --no-split ť"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Chaîne inattendue ŕ la fin du fichier morcelé HTML Ť %s ť"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Noeud Ť Next ť:"
+
+# Est-ce vraiment un message ŕ traduire?
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Noeud Ť Previous ť:"
+
+# Est-ce vraiment un message ŕ traduire?
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Noeud Ť Up ť:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Ancre Ť %s ť et mode Ť %s ť pointe vers le męme nom de fichier"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+"Commande @anchor ignorée; les références vers celle-ci ne fonctionneront pas"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%s réfčre ŕ un noeud Ť %s ť inexistant (ŕ mois d'un sectionnement incorrect?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Menu"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Référence"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Le champ Next du noeud Ť %s ť n'a pas de pointeur de retour en amont (ŕ "
+"moins d'un sectionnement incorrect?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Ce noeud (%s) a un noeud Ť Prev ť erroné"
+
+# Est-ce vraiment un message ŕ traduire?
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Noeud Ť Previous ť"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Le champ Prev du noeud Ť %s ť n'a pas de pointeur de retour en amont"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Ce noeud (%s) a un noeud Ť Next ť erroné"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "Ť %s ť n'a pas de champ Up (ŕ moins d'un sectionnement incorrect?)"
+
+# Est-ce vraiment un message ŕ traduire?
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Noeud Ť Up ť"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"Le noeud Ť %s ť manque d'un item menu pour Ť %s ť en dépit d'ętre son noeud "
+"Ť Up ť cible"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "Le noeud Ť %s ť a été référencé %d fois"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "noeud Ť %s ť non référencé"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "Retrait de %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Ne peut enlever le fichier Ť %s ť: %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Annexe %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Erreur interne (search_sectioning) Ť %s ť!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Erreur interne (search_sectioning) Ť %s ť!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s est périmé; utiliser plutôt %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Le noeud avec %ctop en tant que section existe déjŕ"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Le noeud %ctop se trouve ici"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "noeud %ctop utilisé avant %cnode, %s implicitement"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Table des matičres"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Sommaire"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "commande @image avec un fichier Ť %s ť illisible: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"@headitem comme dernier item de @multitable produit des documents Docbook "
+"invalides"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: avertissement: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " pour %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\\tUtiliser Ť %s --help ť pour une liste complčte des options.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Usage: %s [OPTION]... [INFO-FICHIER [DIR-FICHIER]]\n"
+"\n"
+"Installer ou éliminer des entrées dir ŕ partir de INFO-FICHIER dans le "
+"fichier\n"
+"répertoire Info DIR-FICHIER.\n"
+"\n"
+"Options:\n"
+" --delete Éliminer les entrées existantes pour INFO-FICHIER ŕ "
+"partir\n"
+" de DIR-FICHIER; ne pas insérer aucunes nouvelles "
+"entrées.\n"
+" --dir-file=NOM Spécifier le NOM du répertoire de fichiers Info.\n"
+" Ceci équivaut ŕ utiliser l'argument DIR-FICHIER.\n"
+" --entry=TEXTE Insérer TEXTE comme une entrée du répertoire Info.\n"
+" TEXTE doit avoir la forme d'une ligne d'item menu Info\n"
+" avec zéro ou plusieurs lignes en extra commençant avec\n"
+" un blanc. Si plus d'une entrée est spécifiée, elles\n"
+" seront toutes ajoutées. Si aucune n'est indiquée,\n"
+" elles seront déterminées ŕ partir de l'information\n"
+" se trouvant dans le fichier Info lui-męme.\n"
+" --help Afficher ce menu d'aide et quitter.\n"
+" --info-file=FICHIER Spécifier le FICHIER Info ŕ installer dans le "
+"répertoire\n"
+" de fichiers Info. Ceci équivaut ŕ utiliser l'argument\n"
+" INFO-FICHIER.\n"
+" --info-dir=RÉP Identique ŕ l'option --dir-file=RÉP/dir.\n"
+" --item=TEXTE Identique ŕ l'option --entry=TEXTE\n"
+" Une entrée de répertoire Info est en fait un item menu.\n"
+" --quiet Supprimer les avertissements.\n"
+" --remove Identique ŕ l'option --delete.\n"
+" --section=SEC Mettre cette entrée de fichier dans la section SEC du\n"
+" répertoire. Si plus d'une section est spécifiée, toutes\n"
+" les entrées sont ajoutées dans chacune des sections.\n"
+" Si aucune section n'est spécifiée, elles seront "
+"déterminées\n"
+" ŕ partir de l'information dans le fichier Info lui-męme.\n"
+" --version Afficher le nom et la version du logiciel et quitter.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Ceci est le fichier .../info/dir, lequel contient le noeud \n"
+"le plus haut dans la hiérarchie Info, noeud appelé (dir)Top.\n"
+"La premičre fois que Info est invoqué, vous démarrez la recherche \n"
+"ŕ partir de ce noeud.\n"
+"\n"
+"%s\tCeci est le haut de l'arborescence INFO\n"
+"\n"
+" Ceci (le noeud Répertoire) fournit un menu des sujets majeurs.\n"
+" Taper Ť q ť pour quitter, Ť ? ť pour lister toutes les commandes Info,\n"
+" Ť d ť pour revenir ŕ cet endroit,\n"
+" Ť h ť fournit un guide d'initiation pour les nouveaux venus,\n"
+" Ť mEmacs<Return> ť démarre une consultation du manuel Emacs, etc.\n"
+"\n"
+" En Emacs, vous pouvez cliquer avec le bouton-2 de la souris sur un item "
+"menu \n"
+" ou sur une référence croisée pour le sélectionner.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: ne peut pas lire (%s) et ne peut pas créer (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: fichier vide"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY non apparié avec END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY non apparié avec START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: a déjŕ un fichier répertoire: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Spécifier le fichier Info seulement une fois.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "excédent d'argument de ligne de commande Ť %s ť"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+"Aucun fichier d'entrée spécifié; utiliser --help pour plus d'informations."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Aucun fichier dir spécifié; utiliser --help pour plus d'informations."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "aucune entrée répertoire Info dans Ť %s ť"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "item menu Ť %s ť déjŕ existant, pour le fichier Ť %s ť"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "aucune entrée trouvée pour Ť %s ť; rien n'a été éliminé"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "afficher cet aide-mémoire et quitter"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "conserver les fichiers temporaires aprčs le traitement"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "ne pas conserver les fichiers temporaires aprčs le traitement (défaut)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "envoyer la sortie dans FICHIER"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "afficher la version du logiciel et quitter"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Usage: %s [OPTION]... FICHIER...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Générer un index trié pour chaque FICHIER de sortie TeX.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Habituellement FICHIER... est indiqué comme Ť foo.%c%c ť pour un document Ť "
+"foo.texi ť.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: pas un fichier index en format Texinfo"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "échec lors de la réouverture de %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Aucun numéro de page dans %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "l'entrée %s suit une entrée ayant un nom secondaire"
+
+# Est-ce que c'est " " ou Ť ť comme caractčres?
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" est invalide"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Spécifier le répertoire Info seulement une fois.\n"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s n'est pas un code ISO valide, utilisé %c"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Ne peut spécifier plus d'une sortie d'expansion de macro"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "Le fichier existe mais n'est pas un répertoire"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Premier argument de références croisée peut ne pas ętre vide"
+
+#~ msgid "see "
+#~ msgstr "voir "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "Ť . ť ou Ť , ť doit suivre une référence croisée, non pas %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "Premier argument de @inforef peut ne pas ętre vide"
+
+#~ msgid "Node:"
+#~ msgstr "Noeud:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: Table des matičres devrait ętre lŕ, elle ne s'y trouve pas"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "mémoire virtuelle épuisée"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "Aucun Ť %s.png ť ou Ť .jpg ť et aucune extension fournie"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s; pour le fichier Ť %s ť.\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "Le noeud %s a un champ Ť Up ť manquant"
+
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr "\\%-10[scroll-forward] Avancer de 1 ligne.\n"
+
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "\\%-10[scroll-backward] Reculer de 1 ligne.\n"
+
+#~ msgid ""
+#~ "Email bug reports to bug-texinfo@gnu.org,\n"
+#~ "general questions and discussion to help-texinfo@gnu.org."
+#~ msgstr ""
+#~ "Rapporter toute anomalie ŕ bug-texinfo@gnu.org et poster\n"
+#~ "vos questions et autre discussion ŕ help-texinfo@gnu.org"
+
+#~ msgid ""
+#~ "Basic Commands in Info Windows\n"
+#~ "******************************\n"
+#~ "\n"
+#~ " \\%-10[quit-help] Quit this help.\n"
+#~ " \\%-10[quit] Quit Info altogether.\n"
+#~ " \\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+#~ "\n"
+#~ "Selecting other nodes:\n"
+#~ "----------------------\n"
+#~ " \\%-10[next-node] Move to the \"next\" node of this node.\n"
+#~ " \\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+#~ " \\%-10[up-node] Move \"up\" from this node.\n"
+#~ " \\%-10[menu-item] Pick menu item specified by name.\n"
+#~ " Picking a menu item causes another node to be selected.\n"
+#~ " \\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+#~ " \\%-10[history-node] Move to the last node seen in this window.\n"
+#~ " \\%-10[move-to-next-xref] Skip to next hypertext link within this "
+#~ "node.\n"
+#~ " \\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+#~ "node.\n"
+#~ " \\%-10[select-reference-this-line] Follow the hypertext link under "
+#~ "cursor.\n"
+#~ " \\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+#~ "node] (DIR)'.\n"
+#~ " \\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] "
+#~ "Top'.\n"
+#~ "\n"
+#~ "Moving within a node:\n"
+#~ "---------------------\n"
+#~ " \\%-10[scroll-forward] Scroll forward a page.\n"
+#~ " \\%-10[scroll-backward] Scroll backward a page.\n"
+#~ " \\%-10[beginning-of-node] Go to the beginning of this node.\n"
+#~ " \\%-10[end-of-node] Go to the end of this node.\n"
+#~ " \\%-10[1scroll-forward] Scroll forward 1 line.\n"
+#~ " \\%-10[1scroll-backward] Scroll backward 1 line.\n"
+#~ "\n"
+#~ "Other commands:\n"
+#~ "---------------\n"
+#~ " \\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+#~ " \\%-10[last-menu-item] Pick last item in node's menu.\n"
+#~ " \\%-10[index-search] Search for a specified string in the index "
+#~ "entries of this Info\n"
+#~ " file, and select the node referenced by the first entry "
+#~ "found.\n"
+#~ " \\%-10[goto-node] Move to node specified by name.\n"
+#~ " You may include a filename as well, as in (FILENAME)"
+#~ "NODENAME.\n"
+#~ " \\%-10[search] Search forward through this Info file for a specified "
+#~ "string,\n"
+#~ " and select the node in which the next occurrence is found.\n"
+#~ " \\%-10[search-backward] Search backward in this Info file for a "
+#~ "specified string,\n"
+#~ " and select the node in which the next occurrence is found.\n"
+#~ msgstr ""
+#~ "Commandes de base dans une fenętre Info\n"
+#~ "---------------------------------------\n"
+#~ "\n"
+#~ " \\%-10[quit-help] Quitter ce menu d'aide.\n"
+#~ " \\%-10[quit] Quitter le mode Info aussi.\n"
+#~ " \\%-10[get-info-help-node] Invoquer le tutoriel de Info.\n"
+#~ "\n"
+#~ "Sélection d'autres noeuds:\n"
+#~ "-------------------------\n"
+#~ " \\%-10[next-node] Aller au prochain \"next\" noeud de ce "
+#~ "noeud.\n"
+#~ " \\%-10[prev-node] Aller au noeud précédent \"previous\" de ce "
+#~ "noeud.\n"
+#~ " \\%-10[up-node] Aller vers le haut \"up\" depuis ce noeud.\n"
+#~ " \\%-10[menu-item] Prendre l'item menu spécifié par le nom.\n"
+#~ " sélectionner un item menu provoque la "
+#~ "sélection d'un\n"
+#~ " autre noeud\n"
+#~ " \\%-10[xref-item] Suivre une référence croisée. Lire le nom "
+#~ "de référence.\n"
+#~ " \\%-10[history-node] Aller au dernier noeud vu dans cette "
+#~ "fenętre.\n"
+#~ " \\%-10[move-to-next-xref] Escamoter le prochain lien hypertexte ŕ "
+#~ "l'intérieur de ce noeud.\n"
+#~ " \\%-10[move-to-prev-xref] Escamoter le lien hypertextre précédent ŕ "
+#~ "l'intérieur de ce noeud.\n"
+#~ " \\%-10[select-reference-this-line]\n"
+#~ " Suivre le lien hypertexte pointé par le "
+#~ "curseur.\n"
+#~ " \\%-10[dir-node] Se déplacer au noeud répertoire "
+#~ "`directory'. \n"
+#~ " équivalent ŕ `\\[goto-node] (DIR)'.\n"
+#~ " \\%-10[top-node] Aller au noeud supérieur, équivalent ŕ `"
+#~ "\\[goto-node] Top'.\n"
+#~ "\n"
+#~ "Déplacement ŕ l'intérieur d'un noeud:\n"
+#~ "------------------------------------\n"
+#~ " \\%-10[scroll-forward] Avancer d'une page.\n"
+#~ " \\%-10[scroll-backward] Reculer d'une page.\n"
+#~ " \\%-10[beginning-of-node] Aller au début de ce noeud.\n"
+#~ " \\%-10[end-of-node] Aller ŕ la fin de ce noeud.\n"
+#~ " \\%-10[1scroll-forward] Avancer d'une ligne.\n"
+#~ " \\%-10[1scroll-backward] Reculer d'une ligne.\n"
+#~ "\n"
+#~ "Autres commandes:\n"
+#~ "----------------\n"
+#~ " \\%-10[menu-digit] Prendre les item du 1er...9e dans le menu "
+#~ "des noeuds.\n"
+#~ " \\%-10[last-menu-item] Prendre le dernier item dans le menu des "
+#~ "noeuds.\n"
+#~ " \\%-10[index-search] Rechercher une chaîne spécifique dans "
+#~ "l'index#n du fichier Info et sélectionner le "
+#~ "noeud\n"
+#~ " référencé par la premičre entrée trouvée.\n"
+#~ " \\%-10[goto-node] Aller au noeud spécifié par le nom.\n"
+#~ " Vous pouvez inclure une nom du fichier "
+#~ "aussi\n"
+#~ " comme dans (NOM_DE_FICHIER)NOM_DE_NOEUD.\n"
+#~ " \\%-10[search] Rechercher par en avant ŕ l'aide du fichier "
+#~ "Info\n"
+#~ " pour une chaîne spécifique et sélectionner "
+#~ "le noeud\n"
+#~ " de la prochaine occurenre trouvée.\n"
+#~ " \\%-10[search-backward] Rechercher par en arričre ŕ l'aide du "
+#~ "fichier Info\n"
+#~ " pour une chaîne spécifique et sélectionner "
+#~ "le noeud\n"
+#~ " de la prochaine occurence trouvée.\n"
+
+#~ msgid "Basic Commands in Info Windows\n"
+#~ msgstr "Commandes de base de fenętres Info\n"
+
+#~ msgid "Moving within a node:\n"
+#~ msgstr "Déplacement dans un noeud:\n"
+
+#~ msgid "Selecting other nodes:\n"
+#~ msgstr "Sélection des autres noeuds:\n"
+
+#~ msgid "Other commands:\n"
+#~ msgstr "Autres commandes:\n"
+
+#~ msgid "%s' argument to @image command not found"
+#~ msgstr "Ť %s ť arguement de la commande @image n'a pas été retrouvé"
+
+#~ msgid ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "Translate Texinfo source documentation to various other formats:\n"
+#~ "Info files suitable for reading online with Emacs or standalone GNU Info\n"
+#~ "(by default); plain text (with --no-headers); or HTML (with --html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names allow @ commands in node names.\n"
+#~ " -D VAR define a variable, as with @set.\n"
+#~ "--docbook output DocBook rather than Info format.\n"
+#~ " -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+#~ " --error-limit=NUM quit after NUM errors (default %d).\n"
+#~ " --fill-column=NUM break Info lines at NUM characters (default %"
+#~ "d).\n"
+#~ " --footnote-style=STYLE output footnotes according to STYLE:\n"
+#~ " `separate' to place footnotes in their own "
+#~ "node,\n"
+#~ " `end' to place the footnotes at the end of "
+#~ "the\n"
+#~ " node in which they are defined (the "
+#~ "default).\n"
+#~ " --force preserve output even if errors.\n"
+#~ " --help display this help and exit.\n"
+#~ " --html output HTML rather than Info format.\n"
+#~ " -I DIR append DIR to the @include search path.\n"
+#~ " --ifhtml process @ifhtml and @html text even when not\n"
+#~ " generating HTML.\n"
+#~ " --ifinfo process @ifinfo text even when generating "
+#~ "HTML.\n"
+#~ " --iftex process @iftex and @tex text.\n"
+#~ " implies --no-split.\n"
+#~ msgstr ""
+#~ "Usage: %s [OPTION]... TEXINFO-FICHIER...\n"
+#~ "\n"
+#~ "Traduire une documentation Texinfo source en divers autres formats:\n"
+#~ "Fichiers Info adéquats pour lire en ligne avec Emacs ou GNU Info "
+#~ "autonome\n"
+#~ "(par défaut); format plein texte (avec --no-headers); ou HTML (avec --"
+#~ "html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names Permettre des commandes @ dans les noms de "
+#~ "noeud.\n"
+#~ " -D VAR Définir une variable, comme avec @set.\n"
+#~ " -E, --macro-expand FILE Sortir un source Texinfo avec macros dans "
+#~ "FILE.\n"
+#~ " --error-limit=NUM Quitter aprčs NUM erreurs (par défaut %d).\n"
+#~ " --fill-column=NUM Tronquer les lignes Info ŕ NUM caractčres "
+#~ "(défaut %d).\n"
+#~ " --footnote-style=STYLE Sortir les notes de bas de page selon option "
+#~ "STYLE:\n"
+#~ " Ť separate ť pour placer les notes dans leur "
+#~ "noeud;\n"
+#~ " Ť end ť pour les placer ŕ la fin du noeud "
+#~ "dans \n"
+#~ " lequel elles ont été définies (par défaut).\n"
+#~ " --force Conserver la sortie męme s'il y a des "
+#~ "erreurs.\n"
+#~ " --help Afficher ce menu d'aide et quitter.\n"
+#~ " --html Écrire en format HTML plutôt qu'en format "
+#~ "Info;\n"
+#~ " -I DIR Ajouter ŕ la fin DIR au chemin de fouille "
+#~ "@include.\n"
+#~ " --ifhtml Traiter le textuel sous @ifhtml et @html męme\n"
+#~ " lorsqu'on ne génčre pas du HTML.\n"
+#~ " --ifinfo Traiter le textuel sous @ifinfo męme "
+#~ "lorsqu'on\n"
+#~ " génčre du HTML.\n"
+#~ " --iftex Traiter le textuel sous @iftex et sous @tex.\n"
+#~ " implique l'option --no-split.\n"
+
+#~ msgid ""
+#~ " --no-headers suppress Info node separators and Node: "
+#~ "lines;\n"
+#~ " write to standard output without --output.\n"
+#~ " --no-ifhtml do not process @ifhtml and @html text.\n"
+#~ " --no-ifinfo do not process @ifinfo text.\n"
+#~ " --no-iftex do not process @iftex and @tex text.\n"
+#~ " --no-split suppress splitting of Info or HTML output,\n"
+#~ " generate only one output file.\n"
+#~ " --no-validate suppress node cross-reference validation.\n"
+#~ " --no-warn suppress warnings (but not errors).\n"
+#~ " --number-sections include chapter, section, etc. numbers in "
+#~ "output.\n"
+#~ " -o, --output=FILE output to FILE (directory if split HTML),\n"
+#~ " ignoring any @setfilename.\n"
+#~ " -P DIR prepend DIR to the @include search path.\n"
+#~ " --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+#~ "d).\n"
+#~ " if VAL is `none', do not indent;\n"
+#~ " if VAL is `asis', preserve existing "
+#~ "indentation.\n"
+#~ " --reference-limit=NUM warn about at most NUM references (default %"
+#~ "d).\n"
+#~ " --split-size=NUM split into files at NUM size. (default %d).\n"
+#~ " -U VAR undefine a variable, as with @clear.\n"
+#~ " -v, --verbose explain what is being done.\n"
+#~ " --version display version information and exit.\n"
+#~ " --xml output XML (TexinfoML) rather than Info "
+#~ "format.\n"
+#~ msgstr ""
+#~ " --no-headers Supprimer les séparateurs de noeud Info et "
+#~ "Node:\n"
+#~ " lignes et écrire une sortie standard sans --"
+#~ "output.\n"
+#~ " --no-ifhtml Ne pas traiter le textuel sous @ifhtml et "
+#~ "@html.\n"
+#~ " --no-ifinfo Ne pas traiter le textuel sous @ifinfo.\n"
+#~ " --no-iftex Ne pas traiter le textuel sous @iftex et "
+#~ "@tex.\n"
+#~ " --no-split Supprimer la troncation de fichiers Info "
+#~ "volumineux\n"
+#~ " ou la génération d'un fichier HTML par noeud.\n"
+#~ " --no-validate Supprimer la validation de la table de "
+#~ "références.\n"
+#~ " --no-warn Supprimer les avertissements (mais pas les "
+#~ "erreurs).\n"
+#~ " --number-sections Inclure les numéros de chapitre, section, etc. "
+#~ "en sortie.\n"
+#~ " -o, --output=FICHIER Écrire dans FICHIER, ignorer tout "
+#~ "@setfilename.\n"
+#~ " -P DIR Ajouter au début DIR au chemin de fouille "
+#~ "@include.\n"
+#~ " --paragraph-indent=VAL Indenter les paragraphes de VAL espaces "
+#~ "(défaut %d).\n"
+#~ " si VAL est Ť none ť, ne pas indenter;\n"
+#~ " si VAL est Ť asis ť, garder l'indentation "
+#~ "existante.\n"
+#~ " --reference-limit=NUM Avertir aprčs plus de NUM références (défaut %"
+#~ "d).\n"
+#~ " --split-size=NUM Morceler en fichiers de taille NUM. (défaut %"
+#~ "d).\n"
+#~ " -U VAR Rendre indéfinie une variable, comme avec "
+#~ "@clear.\n"
+#~ " -v, --verbose En mode bavard, expliquer ce qui a été fait.\n"
+#~ " --version Afficher la version du logiciel et quitter.\n"
+#~ " --xml Produire en XML (TexinfoML) plutôt qu'en "
+#~ "format Info.\n"
diff --git a/Build/source/utils/texinfo/po/he.gmo b/Build/source/utils/texinfo/po/he.gmo
new file mode 100644
index 00000000000..37652ea6973
--- /dev/null
+++ b/Build/source/utils/texinfo/po/he.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/he.po b/Build/source/utils/texinfo/po/he.po
new file mode 100644
index 00000000000..9f4f519bfac
--- /dev/null
+++ b/Build/source/utils/texinfo/po/he.po
@@ -0,0 +1,3074 @@
+# Hebrew messages for GNU Texinfo -*- coding: hebrew-iso-8bit -*-
+# Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+# Eli Zaretskii <eliz@is.elta.co.il>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.2\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2002-04-03 12:31+0300\n"
+"Last-Translator: Eli Zaretskii <eliz@gnu.org>\n"
+"Language-Team: Hebrew <eliz@gnu.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "äîéă÷ ăçŕ ĺú ďîń ććä"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "äřĺçŕ ăçŕ ĺú ďîń ććä"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "äřĺůä úěéçúě ďîń ććä"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "äřĺůä óĺńě ďîń ććä"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "äîéă÷ úçŕ äěéî ďîń ććä"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "äřĺçŕ úçŕ äěéî ďîń ććä"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "ĺéěň ďîńäů ĺúä ÷çî"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "ďîńä éđôěů ĺúä ÷çî"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "äđĺřçŕ äěĺňô ÷ńôä ĺŕ ěčá"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "(ęřĺö ůé íŕ äúĺŕ íěůä) ňĺöéáě ĺć äřĺů ěá÷"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "éěĺěéî ďôĺŕá ŕáä ĺúä óńĺä"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "äć ĺú óńĺä"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "TAB óńĺä"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "ďîńä ăéěů íéĺú éđů ěů řăń äđů"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "äđĺřçŕ ä÷éçî ěů ďëĺú řćçä"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "ä÷éř úĺ÷éçîä úřéâŕ úňáč"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "úîăĺ÷ ä÷éçî ďëĺú řćçä"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "äřĺůä óĺń ăň ÷çî"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "äřĺů úěéçú ăň ÷çî"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "ďîńä éřçŕů äěéîä ÷çî"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "ďîńä éđôěů äěéîä ÷çî"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "äîěůä óŕ ďéŕ"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "íěů ŕě"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "úĺéřůôŕ úĺîěůä âöä"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "äăéçé äîěůä"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr " :úçŕ äîěůä\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr " :úĺîěůä %d\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "äîěůä óńĺä"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "...úĺîěůä úîéůř áéëřî"
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "úĺîěůää ďĺěç úŕ ěĺěâ"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "íééěĺů úĺřňä âéöäě ďúéđ ŕě"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "ĺć ä÷ńéôě íééěĺů úĺřňä âöä"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Footnotes ----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "äć őáĺ÷ ěů ń÷ăđéŕá úćĺřçî ůôç"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "...íéń÷ăđéŕä ěë úŕ ÷řĺń"
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr ".ń÷ăđéŕ óŕ ŕöîđ ŕě"
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Index entry: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr "äđĺřçŕ `\\[index-search]' úăĺ÷ôî úćĺřçî íŕĺúä óńĺđ ń÷ăđéŕ čéřô ůôç"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr ".ń÷ăđéŕá ůĺôéçě úîăĺ÷ úćĺřçî ďéŕ"
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr ".ń÷ăđéŕ éčéřô ĺŕöîđ ŕě"
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr ".\"%s\" úćĺřçî íéěéëîä ń÷ăđéŕ éčéřô%s ďéŕ"
+
+#: info/indices.c:376
+msgid "more "
+msgstr " řúĺé"
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "!úĺŕřéäě ęéřö ĺđéŕů čń÷č"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "(.ăĺň ŕĺöîě äńđé `\\[next-index-match]') .\"%s\" čéřô %s-á éúŕöî"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "...\"%s\" ěů íéń÷ăđéŕä ěë úŕ ÷řĺń"
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr ".ĺěů ń÷ăđéŕá \"%s\" ěéëî ďŕë íéđ÷úĺîäî Info őáĺ÷ óŕ"
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"úŕöîů äîî čéřôú äđáĺ úćĺřçî íäá ůôç ,íéňĺăé Info éöá÷ ěů íéń÷ăđéŕä ěëá ččç"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Index apropos: "
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: (úĺîéŕúîä úĺŕ÷ńôäĺ \"%s\" íéěéëîä ń÷ăđéŕ éčéřô)\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr ".řúĺé ář ňăéî úâöäě --help äńđ\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+" Copyright (C) %s Free Software Foundation, Inc.\n"
+"ĺć äđëĺú őéôäě íëúĺëć .úĺéřçŕ áúëá äĺĺěî äđéŕ ĺć úéđëĺú\n"
+" .GNU General Public License ďĺéůřä éŕđúě íŕúäá\n"
+" .COPYING őáĺ÷á ĺđééň ,ĺěŕ íéđéđňá čĺřéô řúéě\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "`%s' úćĺřçî íéěéëîä ń÷ăđéŕ éčéřô ďéŕ\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" .řĺáéă ćúđńîě ĺîéŕúäě éăë ęńîě äáéúë ďôĺŕ äđů -b, --speech-friendly\n"
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+" %s [íéđééôŕî]... [...čéřôúî íéôéňń] :ůĺîéů ďôĺŕ\n"
+"\n"
+" .Info čîřĺôá íéëĺřňä ăĺňéú éöá÷á ďééň\n"
+"\n"
+" :íéđééôŕî\n"
+" .ůîúůîě ęéřăî ěë ěů íéń÷ăđéŕä ěëá SUBJECT ůôç --apropos=SUBJECT\n"
+" .INFOPATH-á äîéůřě DIR äé÷éú óńĺä -d, --directory=DIR\n"
+" .FILENAME őáĺ÷á íéů÷îä úĺöéçě ěë úŕ íĺůř --dribble=FILENAME\n"
+" .FILENAME őáĺ÷á řůŕ ůîúůî ęéřăî âöä -f, --file=FILENAME\n"
+" .úéđëúäî ŕöĺ äć äřćň ęńî âöä -h, --help\n"
+".äéěŕ ěéáĺî ń÷ăđéŕäů ä÷ńéô âöäĺ ń÷ăđéŕá úćĺřçî ůôç --index-"
+"search=STRING\n"
+" .ďĺůŕř Info őáĺ÷ ęĺúî NODENAME ä÷ńéô âöä -n, --node=NODENAME\n"
+" .FILENAME őáĺ÷ ęĺúě ĺřçáđů úĺŕ÷ńéô áĺúë -o, --output=FILENAME\n"
+" .man éôăî ANSI ěů äř÷áä éĺĺú ÷ěńú ěŕ -R, --raw-escapes\n"
+" .FILENAME őáĺ÷î íéů÷î úĺöéçě řćçů --restore=FILENAME\n"
+" .äăĺ÷ôä úřĺů ěů íéđééôŕî účřôîä ä÷ńéô âöä -O, --show-options, --"
+"usage\n"
+"%s .čěôě ďěĺë áĺúëĺ éáéńřĺ÷ř řăńá úĺŕ÷ńéô ďéá řĺáň --subnodes\n"
+" .Less ĺŕ vi-ě äîĺăá úĺăĺ÷ôě íéů÷î řĺů÷ --vi-keys\n"
+" .ŕöĺ úéđëĺúä úńřéâ ěň ňăéî âöä --version\n"
+"\n"
+";ěéçúäě ůé ĺđîîů čéřôúî óéňń ďééöî ,íéé÷ ŕĺä íŕ ,ďééôŕî ĺđéŕů ďĺůŕř čđîĺâřŕ\n"
+" .INFOPATH úîéůř ęřĺŕě `dir' éöá÷ ěëá äć óéňń ůôçú úéđëĺúä\n"
+" .`dir' éöá÷ ěëî áëřĺîä čéřôú âéöú info ,ďééôŕî ĺđéŕů čđîĺâřŕ óŕ ďéŕ íŕ\n"
+" čéřôúäî ěçä ,čéřôú éôéňń úĺîůë ĺůřĺôé ďĺůŕřě řáňî íéčđîĺâřŕ\n"
+" .äâöĺäů äđĺůŕřä ä÷ńéôá\n"
+"\n"
+" :úĺŕîâĺă\n"
+" dir őáĺ÷î áŕ-čéřôú âöä info\n"
+" emacs čéřô ňéáöî äéěŕ ä÷ńéôě ęě áŕ-čéřôúî info emacs\n"
+"buffers čéřôě ęůîä íůîĺ emacs óéňńě ęě áŕ-čéřôúî info emacs buffers\n"
+" emacs ěů äăĺ÷ôä úřĺů éđééôŕî úřŕúîä ä÷ńéô âöä info --show-options emacs\n"
+" dir čéřôú ęřă řĺáňě éěáî ./foo.info őáĺ÷ âöä info -f ./foo.info\n"
+"\n"
+" ,bug-texinfo@gnu.org-ě äě÷ú éçĺĺéă çĺěůě ŕđ\n"
+" .help-texinfo@gnu.org-ě ďĺéăě íéŕůĺđĺ úĺéěěë úĺěŕůĺ\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+" ,bug-texinfo@gnu.org-ě äě÷ú éçĺĺéă çĺěůě ŕđ\n"
+" .help-texinfo@gnu.org-ě ďĺéăě íéŕůĺđĺ úĺéěěë úĺěŕůĺ\n"
+" .http://www.gnu.org/software/texinfo/ :Texinfo ěů úéáä óă"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr ".äŕöîđ ŕě `%s' ä÷ńéô"
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr ".äŕöîđ ŕě `%s' őáĺ÷á `%s' ä÷ńéô"
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "!ďĺěç óŕ ŕöîđ ŕě"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "!äć ďĺěçá úâöĺîä ä÷ńéôá ŕöîđ ĺđéŕ ďîńä"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr ".ăéçé ďĺěç ÷ĺçîě ďúéđ ŕě"
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr ".íéčéřôú ďéŕ ĺć ä÷ńéôá"
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr ".íééěĺů úĺřňä ďéŕ ĺć ä÷ńéôá"
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr ".íéřĺůé÷ ďéŕ ĺć ä÷ńéôá"
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr ".%sě äééđôä ďéŕ ĺć ä÷ńéôá"
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr ".äřćň úěá÷ě `?' äńđ ;Info-ě úřëĺî äđéŕ `%c' äăĺ÷ô"
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr ".Info őéřäě éăë ĺéă ěěëĺůî ĺđéŕ `%s' âĺńî âö"
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr ".ĺć ä÷ńéô ěů ďĺřçŕä ăĺîňá řáë ä/úŕ"
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr ".ĺć ä÷ńéô ěů ďĺůŕřä ăĺîňá řáë ä/úŕ"
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr ".ăçŕ ďĺěç ÷ř íéé÷"
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr ".éăî řúĺé ďč÷ äéä ďĺěçä"
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ".ĺäůěë ďĺěç ÷ĺçîě ŕđ ;äřćň ďĺěç âéöäě íĺ÷î ÷éôńî ďéŕ"
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+" Info úĺđĺěçá úĺéńéńá úĺăĺ÷ô\n"
+" ***************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] äć äřćň ďĺěç řĺâń\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Info úéđëúî éřîâě ŕö\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Info ůîúůîě ęéřăî âöä\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+" :úĺřçŕ úĺŕ÷ńéôá äřéçá\n"
+" ---------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] úéçëĺđ ä÷ńéô éřçŕ äŕáä ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] úéçëĺđ ä÷ńéô éđôěů ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] úéçëĺđ ä÷ńéô ěů áŕ-ú÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] ĺîů é\"ôň čéřôúî óéňń řçá\n"
+" .úřçŕ ä÷ńéôě řáňîě úîřĺâ čéřôúî äřéçá\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr "\\%-10[xref-item] řĺůé÷ä íů ŕřĺ÷ ;řĺůé÷ řçŕ áĺ÷ň\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "\\%-10[history-node] äć ďĺěçá äâöĺäů äđĺřçŕä ä÷ńéôě řĺćç\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr "\\%-10[move-to-next-xref] úéçëĺđ ä÷ńéôá ŕáä řĺůé÷ě ďîń ććä\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr "\\%-10[move-to-prev-xref] úéçëĺđ ä÷ńéôá íăĺ÷ä řĺůé÷ě ďîń ććä\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr "\\%-10[select-reference-this-line] ĺéěň ŕöîđ ďîńäů řĺůé÷ éřçŕ áĺ÷ň\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr "\\%-10[dir-node] `\\[goto-node] (DIR)'-ě ęřň-äĺĺů ;DIR ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr "\\%-10[top-node] `\\[goto-node] Top'-ě ęřň-äĺĺů ;Top ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+" :ä÷ńéô ęĺúá ďîń úňĺđú\n"
+" ---------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] úéçëĺđ ä÷ńéô úěéçúě ďîń ććä\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] úéçëĺđ ä÷ńéô óĺńě ďîń ććä\n"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr " %-10s äîéă÷ úçŕ äřĺů ďîń ććä\n"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr " %-10s äřĺçŕ úçŕ äřĺů ďîń ććä\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] äîéă÷ ăçŕ óă ěĺěâ\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] äřĺçŕ ăçŕ óă ěĺěâ\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+" :úĺřçŕ úĺăĺ÷ô\n"
+" -------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] úéçëĺđä ä÷ńéôä čéřôúá éňéůú ăň ďĺůŕř óéňń řçá\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] úéçëĺđä ä÷ńéôä čéřôúá ďĺřçŕ óéňń řçá\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] řĺáňĺ äć Info őáĺ÷ ěů íéń÷ăđéŕá úćĺřçî ůôç\n"
+" íŕĺú ŕöîđů ďĺůŕř ń÷ăđéŕ čéřô äňéáöî äéěŕ ä÷ńéôě\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] äîů é\"ôň ä÷ńéôě řĺáň\n"
+" .(FILENAME)NODENAME-á ĺîë ä÷ńéôä íůî ÷ěçë őáĺ÷ íů ďééöě ďúéđ\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] äć Info őĺ÷á ęěéŕĺ ďŕëî úćĺřçî ůôç\n"
+" .úćĺřçîä äŕöîđ äá ä÷ńéôě řĺáňĺ\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] äć Info őĺ÷á äřĺçŕĺ ďŕëî úćĺřçî ůôç\n"
+" .úćĺřçîä äŕöîđ äá ä÷ńéôě řĺáňĺ\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s äć äřćň ďĺěç řĺâń\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Info úéđëúî éřîâě ŕö\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Info ůîúůîě ęéřăî âöä\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s úéçëĺđ ä÷ńéô éřçŕ äŕáä ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s úéçëĺđ ä÷ńéô éđôěů ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s úéçëĺđ ä÷ńéô ěů áŕ-ú÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s ĺîů é\"ôň čéřôúî óéňń řçá\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " .úřçŕ ä÷ńéôě řáňîě úîřĺâ čéřôúî äřéçá\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s řĺůé÷ä íů ŕřĺ÷ ;řĺůé÷ řçŕ áĺ÷ň\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s äć ďĺěçá äâöĺäů äđĺřçŕä ä÷ńéôě řĺćç\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s úéçëĺđ ä÷ńéôá ŕáä řĺůé÷ě ďîń ććä\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s ĺéěň ŕöîđ ďîńäů řĺůé÷ éřçŕ áĺ÷ň\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s `g (DIR)'-ě ęřň-äĺĺů ;DIR ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s `g Top'-ě ęřň-äĺĺů ;Top ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s äîéă÷ ăçŕ óă ěĺěâ\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s äřĺçŕ ăçŕ óă ěĺěâ\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s úéçëĺđ ä÷ńéô úěéçúě ďîń ććä\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s úéçëĺđ ä÷ńéô óĺńě ďîń ććä\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s äîéă÷ úçŕ äřĺů ďîń ććä\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s äřĺçŕ úçŕ äřĺů ďîń ććä\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s úéçëĺđä ä÷ńéôä čéřôúá éňéůú ăň ďĺůŕř óéňń řçá\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s úéçëĺđä ä÷ńéôä čéřôúá ďĺřçŕ óéňń řçá\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s řĺáňĺ äć Info őáĺ÷ ěů íéń÷ăđéŕá úćĺřçî ůôç\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " íŕĺú ŕöîđů ďĺůŕř ń÷ăđéŕ čéřô äňéáöî äéěŕ ä÷ńéôě\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s äîů é\"ôň ä÷ńéôě řĺáň\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" .(FILENAME)NODENAME-á ĺîë ä÷ńéôä íůî ÷ěçë őáĺ÷ íů ďééöě ďúéđ\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s äć Info őáĺ÷á ęěéŕĺ ďŕëî úćĺřçî ůôç\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " .úćĺřçîä äŕöîđ äá ä÷ńéôě řĺáňĺ\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s äć Info őáĺ÷á äřĺçŕĺ ďŕëî úćĺřçî ůôç\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr " :ŕéä úéçëĺđ ůĺôéç úîéůř\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+" :Info úĺđĺěçá úĺéřůôŕ úĺăĺ÷ô\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+" :úĺăĺ÷ôä úřĺůá úĺéřůôŕ úĺăĺ÷ô\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+" :ăáěá %s úĺňöîŕá ěéňôäě ďúéđ úĺŕáä úĺăĺ÷ôä úŕ\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+" :ěěë äěňôäě úĺđúéđ ďđéŕ úĺŕáä úĺăĺ÷ôä\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- `\\[kill-node]' ĺŕ `\\[history-node]' ů÷ä äŕéöéě ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "äřćň ęńî âöä"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Info úëřňîá ůĺîéůě ęéřăî âöä"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "íéĺńî ů÷î řĺáň ăĺňéú âöä"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Describe key: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr ".řăâĺî ĺđéŕ \"ESC %s\""
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr ".řăâĺî ĺđéŕ \"%s\""
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s is defined to %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "úîéĺńî äăĺ÷ô úěňôäě ăéě÷äě äî âöä"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Where is command: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "ĺäůěë ů÷îě äřĺů÷ äđéŕ `%s' äăĺ÷ôä"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr ".`%s' úěňôäě äăéçéä ęřăä ŕĺä `%s'"
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr ".%s äăĺ÷ôä úŕ ěéňôé %s"
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr ".úîéé÷ äđéŕ `%s' íůá äéö÷đĺô"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+" Copyright (C) %s Free Software Foundation, Inc.\n"
+"ĺć äđëĺú őéôäě íëúĺëć .úĺéřçŕ áúëá äĺĺěî äđéŕ ĺć úéđëĺú\n"
+" .GNU General Public License ďĺéůřä éŕđúě íŕúäá\n"
+" .COPYING őáĺ÷á ĺđééň ,ĺěŕ íéđéđňá čĺřéô řúéě\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "éĺâů äăĺ÷ôě íéčđîĺâřŕä řôńî"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "`%s' čě÷ őáĺ÷ úçéúôá äě÷ú"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "`%s' čěô őáĺ÷ úřéöéá äě÷ú"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "`%s'-ě äáéúëá äě÷ú"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "`%s' čěô őáĺ÷ úřéâńá äě÷ú"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "éăî äëĺřŕ íéů÷î úřăń"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "äřńç íéů÷î úřăń"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "řĺńŕ (\\000) ÷éř ĺúá ůĺîéůä"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "řĺńŕ (^%c) ÷éř ĺúá ůĺîéůä"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "äăĺ÷ô íů řńç"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "éăî ęĺřŕ ÷ěç"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "äňĺăé äđđéŕ `%s' äăĺ÷ô"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "éăî ęĺřŕ äăĺ÷ô íů"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "`%s' äăĺ÷ôě ęůîäá íéřúĺéî íéĺú"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "äđúůîä íů řńç"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "äđúůîä íů éřçŕ ăéî `=' řńç"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "éăî ęĺřŕ äđúůîä íů"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "éăî ęĺřŕ ęřň"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\" őáĺ÷á %u äřĺůá "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+" %s [ďééôŕî]... [čě÷-őáĺ÷] :ůĺîéůä ďôĺŕ\n"
+"\n"
+":ěăçîä úřéřá) čě÷-őáĺ÷ ŕřĺ÷ .infokey őáĺ÷ě íéů÷î úĺřăâä ěů řĺ÷î őáĺ÷ ěôî÷\n"
+" .(úřçŕ úđééö ŕě íŕ) $HOME/.info-ě ěôîĺ÷î őáĺ÷ áúĺëĺ ($HOME/.infokey\n"
+"\n"
+" :íéđééôŕî\n"
+" .$HOME/.info-á íĺ÷îá FILE őáĺ÷á čěô íĺůř --output FILE\n"
+" .úéđëúäî ŕöĺ äć äřćň ęńî âöä --help\n"
+" .ŕöĺ úéđëúä úńřéâ ěň ňăéî âöä --version\n"
+"\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "ďé÷ú infokey őáĺ÷ úĺéäě éăëá éăî ďč÷ -- `%s' őáĺ÷î íěňúî"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "ďé÷ú infokey őáĺ÷ úĺéäě éăëá éăî ěĺăâ -- `%s' őáĺ÷î íěňúî"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "ŕř÷đ őáĺ÷ä ěë ŕě - `%s' infokey őáĺ÷ úŕéř÷á äě÷ú"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"ĺđĺëăň ęřĺöě infokey őřä -- (éĺâů íń÷ řôńî) ďé÷ú ĺđéŕ `%s' infokey őáĺ÷"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "ĺđĺëăň ęřĺöě infokey őřä -- ďëăĺňî ĺđéŕ `%s' infokey őáĺ÷"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"ĺđĺëăň ęřĺöě infokey őřä -- (éĺâů ÷ěç ęřĺŕ) ďé÷ú ĺđéŕ `%s' infokey őáĺ÷"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr "ĺđĺëăň ęřĺöě infokey őřä -- (éĺâů ÷ěç ăĺ÷) ďé÷ú ĺđéŕ `%s' infokey őáĺ÷"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "äđěňôú ŕě úĺăçŕ íéů÷î úĺřăâä -- infokey őáĺ÷á íééĺâů íéđĺúđ"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "ó÷ĺúá ŕě úĺăçŕ íéđúůî úĺřăâä -- infokey őáĺ÷á íééĺâů íéđĺúđ"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "äúĺŕ řŕúĺ Info úăĺ÷ô ěů íů ŕř÷"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Describe command: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "äúĺŕ ňöáĺ úĺăĺ÷ôä úřĺůî äăĺ÷ô ěů íů ŕř÷"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr ".äć áöîá `echo-area' úăĺ÷ô ňöáě ďúéđ ŕě"
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "`%s' úřëĺî-éúěá äŕřĺä"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "âöĺîä ďĺěçä äáĺâ úŕ äđů"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Set screen height to (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" :íéěěĺë äć őáĺ÷ě ĺăáĺňů řĺ÷î éöá÷\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr ".%s őáĺ÷ ăáňě ďúéđ ŕě\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (őáĺ÷)ä÷ńéô úĺřĺů 'ńî ěăĺâ áŕ-őáĺ÷\n"
+" ----------- --------- ---- -------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+" .äđĺřçŕě úř÷éá ďäá úĺŕ÷ńéôä úîéůřî ďëĺäů čéřôú ďěäě\n"
+" .řçŕ ďĺěçá `\\[history-node]' ěňôä ĺŕ čéřôúäî ä÷ńéô řçá\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "äđĺřçŕě úř÷éá ďäá úĺŕ÷ńéôä ěë ěů čéřôú íň ďĺěç âöä"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "úĺđĺěçä ăçŕá íăĺ÷ úâöä äúĺŕ ä÷ńéô řçá"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Select visited node: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "!íěňđ (%s) řĺůé÷ä ěů ăňéä"
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+".âöĺîä čéřôúäî äřéçáě \\[menu-item] ,ŕřćň úěá÷ě \\[get-help-window] ů÷ä .%s "
+"ŕńřéâ Info úéđëúě íéŕáä íéëĺřá"
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "äŕáä äřĺůě ďîń ććä"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "úîăĺ÷ä äřĺůě ďîń ććä"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "äřĺůä óĺńě ďîń ććä"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "äćć ńîď ěúçéěú äůĺřä"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Next äăů"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "...äŕáä ä÷ńéôě řáĺň"
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "...čéřôúäî ďĺůŕř óéňń řçĺá"
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "...äŕáä ä÷ńéôá řçĺá"
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr ".äŕáä ä÷ńéôä řçĺá ćŕĺ ,úĺŕ÷ńéôä őňá úĺ/äîř %d äěĺň"
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr ".äć ęîńîá úĺŕ÷ńéô řúĺé ďéŕ"
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr ".ĺć ä÷ńéôá `Prev' řĺůé÷ ďéŕ"
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr ".äć ďĺěçá úîăĺ÷ ä÷ńéôě řáĺň"
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr ".ĺć ä÷ńéô řĺáň `Up'-ĺ `Prev' ěěĺë ĺđéŕ äć ęîńî"
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr ".äć ďĺěçá íŕä ú÷ńôě řáĺň"
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr ".úîăĺ÷ ä÷ńéô ěů čéřôúá ďĺřçŕ óéňńě řáĺň"
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr ".úĺŕ÷ńéôä äđáîá řúĺé ÷ĺîň ĺŕ äîéă÷ ňĺđ"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr ".úĺŕ÷ńéôä äđáîá äěňî éôěë ĺŕ äřĺçŕ ňĺđ"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr ".äć ďĺěçá äîéă÷ ěĺěâ"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "ďĺěç ěăĺâ ěů ç\"îřá ęřň äđůĺ äć ďĺěçá äîéă÷ ěĺěâ"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "úéçëĺđä ä÷ńéôäî úŕöě éěáî äć ďĺěçá äîéă÷ ěĺěâ"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"ďĺěç ěăĺâ ěů ç\"îřá ęřň äđůĺ úéçëĺđä ä÷ńéôäî úŕöě éěáî äć ďĺěçá äîéă÷ ěĺěâ"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "äć ďĺěçá äřĺçŕ ěĺěâ"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "ďĺěç ěăĺâ ěů ç\"îřá ęřň äđůĺ äć ďĺěçá äřĺçŕ ěĺěâ"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "úéçëĺđä ä÷ńéôäî úŕöě éěáî äć ďĺěçá äřĺçŕ ěĺěâ"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"ďĺěç ěăĺâ ěů ç\"îřá ęřň äđůĺ úéçëĺđä ä÷ńéôäî úŕöě éěáî äć ďĺěçá äřĺçŕ ěĺěâ"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "ĺć ä÷ńéô úěéçúě ďîń ććä"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "ĺć ä÷ńéô óĺńě ďîń ććä"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "äčî éôěë úĺřĺů N ěĺěâ"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "äěňî éôěë úĺřĺů N ěĺěâ"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "äčî éôěë äâĺöú éöç ěĺěâ"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "äěňî éôěë äâĺöú éöç ěĺěâ"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "ŕáä ďĺěçá řçá"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "íăĺ÷ä ďĺěçá řçá"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "íééđůě éçëĺđä ďĺěçä ÷ěç"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "éçëĺđä ďĺěçä úŕ řńä"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "ňĺá÷ ďĺěç řéńäě ďúéđ ŕě"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "éçëĺđä ăáěî úĺđĺěçä ěë úŕ řńä"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "ŕáä ďĺěçá ěĺěâ"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "ŕáä ďĺěçá äřĺçŕ ěĺěâ"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "äć ďĺěç (ďč÷ä ĺŕ) ěăâä"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "íéâöĺîä úĺđĺěçä ěë ďéá äâĺöúä çčů ÷ěç"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "éçëĺđä ďĺěçá ĺůěâů úĺřĺů úâöä áöî äđů"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "äŕáä ä÷ńéôá řĺáň"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "úîăĺ÷ä ä÷ńéôě řĺáň"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "ěňîů ä÷ńéôě řĺáň"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "äć ęîńîá äđĺřçŕä ä÷ńéôě řĺáň"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "äć ďĺěçá úĺŕ÷ńéô řúĺé ďéŕ"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "äć ęîńîá äđĺůŕřä ä÷ńéôě řĺáň"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "ĺćä ä÷ńéôä čéřôúî ďĺřçŕä óéňńá řçá"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "čéřôúäî äć óéňńá řçá"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr ".íéôéňń %d ďéŕ äć čéřôúá"
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menu item (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menu item: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Follow xref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Follow xref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "äîéŕúîä ä÷ńéôě řĺáňĺ čéřôúî óéňń íů ŕř÷"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "äîéŕúîä ä÷ńéôě řĺáňĺ řĺůé÷ ĺŕ äřňä ěů íů ŕř÷"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "ĺć ä÷ńéôá čéřôúä úěéçúě ďîń ććä"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "äć čéřôúî íéôéňń ěů řůôŕä ěëë ář řôńî âöä"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "äéěŕ řĺáňĺ ä÷ńéô ěů íů ŕř÷"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Goto node: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr ".íéčéřôú `%s' ďéŕ ä÷ńéôá"
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr ".`%s' óéňń ďéŕ `%s' ä÷ńéô ěů čéřôúá"
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr ".`%s' óéňńá äéěŕ řů÷î `%s'-á čéřôúä řůŕ ä÷ńéô éúŕöî ŕě"
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "íäéřçŕ áĺ÷ňĺ dir-î äěéçúîä čéřôú éôéňń úřăéń ŕř÷"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Follow menus: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "úéđëúä őéřäě ăöéë úřŕúîä ä÷ńéôä úŕ ŕöî"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Find Invocation node of [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "ĺúĺŕ âöäĺ manpage-ě äééđôä ŕř÷"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Get Manpage: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "äć ęîńîá (`Top') úéůŕřä ä÷ńéôě řĺáň"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "`(dir)' ä÷ńéôě řĺáň"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Kill node (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "`%s' ä÷ńéô ÷ěńě úĺřůôŕ ďéŕ"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "äăéçé ä÷ńéô ÷ěńě úĺřůôŕ ďéŕ"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "äâöĺäů äđĺřçŕä ä÷ńéôě řĺćç"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "ĺć ä÷ńéô ÷ěń"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "ĺúĺŕ âöäĺ őáĺ÷ ěů íů ŕř÷"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Find file: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr ".ŕöîđ ŕě `%s' őáĺ÷"
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr ".`%s' čěô őáĺ÷ úřéöéá äě÷ú"
+
+# Note that this needs to make sense when displayed to the _right_ of
+# the translated "Writing node foo..." and "Printing node foo...",
+# no matter whether the following word is masculine or feminine!
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "á äçěöä"
+
+# No ellipsis because that would look awkward when the translation of
+# "Done." is appended.
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "`%s' ä÷ńéô čěô"
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "INFO_PRINT_COMMAND ęřă ĺć ä÷ńéô ďëĺú ńôăä"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr ".`%s'-ě ÷éôŕ úçéúôá äě÷ú"
+
+# No ellipsis because that would look awkward when the translation of
+# "Done." is appended.
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "%s ä÷ńéô úńôăä"
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "... %s őáĺ÷-úú ÷řĺń"
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "úĺéůéřá úĺáůçúä ęĺú äúĺŕ ůôçĺ úćĺřçî ŕř÷"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "äúĺŕ ůôçĺ úćĺřçî ŕř÷"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "äřĺçŕ äúĺŕ ůôçĺ úćĺřçî ŕř÷"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%sfor string [%s]: "
+
+# The following 4 are untranslated because they are used with the
+# format string above in a prompt, and we don't translate prompts.
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Search backward"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Search"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " case-sensitively "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr ".äŕöîđ ŕě úćĺřçîä"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "ďĺĺéë ĺúĺŕá ďĺřçŕ ůĺôéç ěň řĺćç"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "ďĺřçŕ ůĺôéçî úćĺřçî ďéŕ"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "ęĺôä ďĺĺéëá ďĺřçŕ ůĺôéç ěň řĺćç"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "äúĺŕ ä/ăéě÷î ä/úŕů éăë ęĺú úćĺřçî ůôç"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-search backward: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-search: "
+
+# Untranslated because is used with the I-search: prompt.
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Failing "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "íăĺ÷ä řĺůé÷ě ďîń ććä"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "ŕáä řĺůé÷ě ďîń ććä"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "úéçëĺđä äřĺůá ňéôĺîä čéřôúî óéňń ĺŕ řĺůé÷ řçŕ áĺ÷ň"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "úéçëĺđ äěĺňô ěčá"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "ěčĺá"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "äć ďĺěçá úîéĺńî äřĺůě ďîń ććä"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "äâĺöú ůăç"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Info úéđëĺúî ŕö"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "äć ů÷î ěů úĺđč÷ úĺéúĺŕ úńřéâě äřĺů÷ä äăĺ÷ô ěňôä"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr ".(%s) úřëĺî-éúěá äăĺ÷ô"
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" äéĺâů äăĺ÷ô"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" äéĺâů äăĺ÷ô"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "éçëĺđ éřîĺđ čđîĺâřŕě ĺć äřôń óńĺä"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "4-á íéé÷ ęřň ěĺôë ĺŕ ,éřîĺđ čđîĺâřŕ ěů äăě÷ä ěçúä"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "ĺć äăĺ÷ôá ůîúůî \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "!éĺđô ďĺřëć řúĺé ďéŕ :readline\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "úéčîĺčĺŕ úĺîěňđĺ úĺňéôĺî íééěĺů úĺřňä ,\"On\" áöîá íŕ"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr "íéřçŕ úĺđĺěç éăîéî äđůî ďĺěç ěů ÷ĺěéń ĺŕ äřéöé ,\"On\" áöîá íŕ"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "ěéěö úňîůä íĺ÷îá ęńîä éňáöá ÷ćáä ,\"On\" áöîá íŕ"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "äňřúŕ ěéěö úňîůäě úîřĺâ äŕéâů ěë ,\"On\" áöîá íŕ"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"äôůŕ óĺńéŕ ęéěäú é\"ň íéńĺçă íéöá÷ě äö÷ĺäů ďĺřëć řćçîî Info ,\"On\" áöîá íŕ"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "ůĺôéç úćĺřçîě íéŕúäů ń÷ăđéŕ éčéřô ěů ÷ěçä ůâăĺé ,\"On\" áöîá íŕ"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "ä÷ńéô óĺńá äěéěâä úĺâäđúä ěň čěĺů"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "ďĺěçä úĺěĺáâî ŕöĺé ďîńäůë äâĺöú ěĺěâě úĺřĺů řôńî"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "úĺéáéń 8 éěňá ISO éĺú âéöîĺ čěĺ÷ Info ,\"On\" áöîá íŕ"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "íéđúůî ěů ăé÷ôú řŕú"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Describe variable: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Info äđúůî ěů ęřň äđů"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Set variable: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Set %s to value (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Set %s to value (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** úđëăĺňî äđéŕ Tags úěáč ***-- "
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), lines ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d lines --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d lines --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Subfile: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s úéđëú řĺáň éňîůî-ăç ĺđéŕ `%s' ďééôŕî\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s úéđëú řĺáň čđîĺâřŕ ěá÷î ĺđéŕ `--%s' ďééôŕî\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s úéđëú řĺáň čđîĺâřŕ ěá÷î ĺđéŕ `%c%s' ďééôŕî\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s úéđëú řĺáň čđîĺâřŕ áééçî `%s' ďééôŕî\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s úéđëú řĺáň `--%s' ääĺćî-éúěá ďééôŕî\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s úéđëú řĺáň `%c%s' ääĺćî-éúěá ďééôŕî\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: é÷ĺç-éúěá ďééôŕî -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s úéđëú řĺáň éĺâů ďééôŕî -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: čđîĺâřŕ áééçî ďééôŕî -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s úéđëú řĺáň éňîůî-ăç ĺđéŕ `-W %s' ďééôŕî\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s úéđëú řĺáň čđîĺâřŕ ěá÷î ĺđéŕ `-W %s' ďééôŕî\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "%c%s-ě éĺâů čđîĺâřŕ"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "řŕĺđé"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "řŕĺřáô"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "őřî"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "ěéřôŕ"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "éŕî"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "éđĺé"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "éěĺé"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "čńĺâĺŕ"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "řáîčôń"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "řáĺč÷ĺŕ"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "řáîáĺđ"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "řáîöă"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "@var ęĺúá %c řéáń-éúěá ĺú"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "č÷ôŕ ěë @sc-ě ďéŕ ďëě ,úĺěĺăâ úĺéúĺŕá ĺěĺë @sc ěů čđîĺâřŕ"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "%c ŕöîđ ęŕ ,`{' ě\"ö"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "verb ęĺúá őáĺ÷ óĺń"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "%c ŕöîđ ęŕ ,`}' ě\"ö"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "ďůĺéî ĺđéä %c%s"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "`%s' ŕě ,éáĺéç řôńî ŕĺäů čđîĺâřŕ ůřĺă @sp"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "%c%s-ě éĺâů čđîĺâřŕ"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "ŕĺäů ĺîë"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "ďéŕ"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "%c%s-ě éĺâů čđîĺâřŕ"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "@def ěů čđîĺâřŕá `}' řńç"
+
+# It would be hilarious to translate those...
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Function"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Macro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Special Form"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variable"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "User Option"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instance Variable"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Method"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "of"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "on"
+
+#: makeinfo/defun.c:711
+#, fuzzy, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "`%s' ęĺúá ÷řĺ ęŕ ůĺîéůá řúĺî `%sx'"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s úéđëúá %s-ĺ %s řĺáň äŕéâů ěň çĺĺéă getwd/getcwd\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`{...}' ęĺúá úĺéäě áééçů ,%c%s ěů čđîĺâřŕ úĺéäě íéŕúî ĺđéŕ `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "`}'-á úîééúńî äđéŕ `%s' íééěĺů úřňä"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "ä÷ńéôě őĺçî íééěĺů úřňä"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "íééěĺů úĺřňä ęĺúá íééěĺů úĺřňäá äëéîú ďéŕ"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "íééěĺů úĺřňä"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "úřúĺë ŕěě"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, fuzzy, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "`%s' :éĺâů (node) ä÷ńéô íů"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "`%s' řëĺî-éúěá ń÷ăđéŕ"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "`%s' ń÷ăđéŕ čéřôá `:' ěěâá ěůëéé Info"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "řăâĺî řáë `%s' ń÷ăđéŕ"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "řëĺî-éúěá ń÷ăđéŕ ĺđéä @synindex-á `%s' ĺŕ `%s'"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "@printindex-á `%s' řëĺî-éúěá ń÷ăđéŕ"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "ä÷ńéô ěëě őĺçî řăâĺî `%s' ń÷ăđéŕ čéřô"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(ä÷ńéô ěëě őĺçî)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "See "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "insertion_type_pname-á éĺâů type"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "@enumerate-á úéđńçî úůéěâ"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "%c-á ůăçî ěéçúî ,ĺěöĺđ úĺéúĺŕä ěë"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s úŕřĺäá %citem řĺáň áĺöéň účéů :čđîĺâřŕ ůřăđ"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`%s' ŕöîđ íěĺŕ ,`%s' ě\"ö `@end' éřçŕ"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "íŕĺú `%cend %s' řńç"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "äřôń ĺŕ úĺŕ ůřĺă %s"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "verbatim ęĺúá őáĺ÷ óĺń"
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "`@%s' ęĺúá @%s-ě úĺňîůî ďéŕ"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "`Top' ú÷ńéô řöĺé ,äđĺůŕřä ä÷ńéôä éđôě ŕöîđ @menu"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "?@ifinfo íĺ÷îá @ifnottex-á úô÷ĺî úĺéäě äúéä äëéřö @top ú÷ńéô éë ďëúééä"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "`Top' ú÷ńéô řöĺé ,äđĺůŕřä ä÷ńéôä éđôě ŕöîđ @detailmenu"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "`@%s' ęĺúá @%s-ě úĺňîůî ďéŕ"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "âĺć-ďá ĺě ďéŕů `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "ĺéřçŕ ŕĺáéů ĺäůî ęéřö `%c%s'"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "`%s'-ě čđîĺâřŕë íéŕúî ĺđéŕ `%s'-ů íĺůî `%s'-á éúůîúůä"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "`@%s' ęĺúá @%s-ě úĺňîůî ďéŕ"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "`%s' ęĺúá @itemx-ě úĺňîůî ďéŕ"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "äńđëä ÷ĺěá ěëě őĺçî %c%s ŕöîđ"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "ISO 639 é\"ň íéřëĺîä ďĺůěä éđîéńî ăçŕ ĺđéŕ %s"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "`%s' řëĺî-éúěá ăĺăé÷ íů"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "ęîúđ ĺđéŕ `%s' ăĺăé÷ ,íéřňčöî"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "`%s' éĺâů ăăĺ÷î ĺú"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "`j' ĺŕ `i' úĺéäě áééç řůŕ ,%c%s ěů čđîĺâřŕ úĺéäě íéŕúî ĺđéŕ `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "čđîĺâřŕë `j' ĺŕ `i' ăéçé ĺú ěá÷î %c%s"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "íăď÷ řăâĺä řáë `%s' ĺř÷ŕî"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "äđĺůŕřě řăâĺä `%s' ďŕë"
+
+#: makeinfo/macro.c:355
+#, fuzzy, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "řčîřô íů ĺŕ \\ íĺ÷îá ,ĺř÷ŕî úáçřäá \\ úĺá÷ňá `%s'"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "éăî íéář íéčđîĺâřŕ úěěĺë `%s' ĺř÷ŕîě %d äřĺůá äúěéçúů äŕéř÷"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "ŕöîđ ŕě %cend macro"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "ăéçé čđîĺâřŕ ěňá ĺř÷ŕî ęĺúá ÷ř éůĺîéů @quote-arg"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@end %s úŕ íŕĺú ĺđéŕ @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr ".íééăé éúîřä !úŕéâů éăî řúĺé\n"
+
+# Not translated because Emacs recognizes warningsby this template.
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: warning: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "ĺîĺ÷îá ĺđéŕů %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr ".`%s --help' äńđ řúé čĺřôě\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "%s [íéđééôŕî]... TEXINFO-őáĺ÷... :ůĺîéůä ďôĺŕ\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+" ěăçî úřéřáë ,íéřçŕ íéđĺů íéčîřĺôě Texinfo řĺ÷î úôůá ăĺňéú íâřú\n"
+".GNU Info úéđëú ĺŕ Emacs úřćňá äŕéř÷ě íéîéŕúîä Info éöá÷ řöééî \n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+" :íééěěë íéđééôŕî\n"
+" .(%d ç\"îřá) úĺŕéâů NUM éřçŕ řĺöň --error-limit=NUM\n"
+" .úĺŕéâů ĺéä íŕ íâ čěô őáĺ÷ ÷çîú ěŕ --force\n"
+" .úéđëúäî ŕöĺ äć äřćň ęńî âöä --help\n"
+" .úĺŕ÷ńéô ďéá úĺéđôää úĺđé÷ú ÷ĺăáú ěŕ --no-validate\n"
+" .(äđâöĺú úĺŕéâů úĺňăĺä) äřäćŕ úĺňăĺä âéöú ěŕ --no-warn\n"
+" .(%d ç\"îřá) úĺéđôä éáâě úĺřäćŕ NUM-î řúĺé ŕě --reference-limit=NUM\n"
+" .úéđëúä úěĺňô ěň čĺřô âöä -v, --verbose\n"
+" .ŕöĺ äđëúä úńřéâ éáâě ňăéî âöä --version\n"
+
+#: makeinfo/makeinfo.c:364
+#, fuzzy, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+" :čěôä čîřĺô úřéçá\n"
+" .Info íĺ÷îá DocBook čîřĺôá čěô ďëä --docbook\n"
+" .Info íĺ÷îá HTML čîřĺôá čěô ďëä --html\n"
+" .Info íĺ÷îá XML čîřĺôá čěô ďëä --xml\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+" :íééěěë čěô éđééôŕî\n"
+" ,FILE őáĺ÷ě ĺř÷ŕî úáçřä řçŕě řĺ÷î áĺúë -E, --macro-expand FILE\n"
+" .@setfilename-î úĺîěňúä ęĺú\n"
+"úĺŕ÷ńéô éăéřôîĺ íéčéřôú ,Node: úĺřúĺë ŕěě čěô --no-headers\n"
+" čńëč őáĺ÷ ďéëî Info čîřĺôá\n"
+" .řúĺé řö÷ čěô - HTML čîřĺôáĺ\n"
+".éđ÷ú čěô őĺřňě áĺúë ,--output řăňéäá ,ďë-ĺîë\n"
+" .ăáěá ăçŕ čěô őáĺ÷ áĺúë --no-split\n"
+" .čěô őáĺ÷á úĺŕ÷ńéôĺ íé÷řô řřôń --number-sections\n"
+" .(HTML čěô íŕ äé÷éú) FILE őáĺ÷ě čěô áĺúë -o, --output=FILE\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+" :čńëč ĺŕ Info čîřĺôá čěô éđééôŕî\n"
+" řăâĺîä é\"ôň čěôá úĺřć úĺôůá úĺéúĺŕ áĺúë --enable-encoding\n"
+" .@documentencoding úŕřĺäá\n"
+" .(%d ç\"îřá) íéĺĺú NUM-ě Info úřĺů ęřĺŕ ěáâä --fill-column=NUM\n"
+" :STYLE ďĺđâńá Info čîřĺôá íééěĺů úĺřňä ęĺřň --footnote-style=STYLE\n"
+" ;úĺăřôđ úĺŕ÷ńéôá úĺřňä ćëřě - `separate'\n"
+" ä÷ńéôä íĺéńá ďúĺŕ íéůě - `end'\n"
+" .(ç\"îřá) úĺřăâĺî ďä äá\n"
+".(%d ç\"îřá) íéçĺĺř VAL äîéđô Info úĺŕ÷ńéô ććä --paragraph-indent=VAL\n"
+"ŕĺä VAL íŕ ;ěěë ńéđëú ěŕ ,`none' ŕĺä VAL íŕ\n"
+" .řĺ÷îá äúéäů éôë äććä ěň řĺîů ,`asis'\n"
+" .(%d ç\"îřá) NUM ěăĺâá íéöá÷-úúě Info ÷ěç --split-size=NUM\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+#, fuzzy
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+" :čě÷ éöá÷ ěů íéđééôŕî\n"
+" .úĺŕ÷ńéôä úĺîůá @ úăĺ÷ôá ůĺîéů äůřä --commands-in-node-names\n"
+" .@set äăĺ÷ôá ĺîë VAR äđôůî řăâä -D VAR\n"
+" .@include ěů ůĺôéç úîéůř óĺńá DIR óńĺä -I DIR\n"
+" .@include ěů ůĺôéç úîéůř ůŕřá DIR óńĺä -P DIR\n"
+" .@clear úăĺ÷ôá ĺîë ,VAR äđúůî úřăâä ěčá -U VAR\n"
+
+#: makeinfo/makeinfo.c:425
+#, fuzzy
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+" :čě÷á äđúĺî ăĺáéň\n"
+" .HTML ĺđéŕ čěôä íŕ ĺěéôŕ @html-ĺ @ifhtml ăáň --ifhtml\n"
+" .Info ĺđéŕ čěôä íŕ ĺěéôŕ @ifinfo-á čńëč ăáň --ifinfo\n"
+".é÷đ čńëč ĺđéŕ čěôä íŕ ĺěéôŕ @ifplaintext ăáň --ifplaintext\n"
+" .--no-split ňîúůîá ;@tex-ĺ @iftex-á čńëč ăáň --iftex\n"
+" .@html-ĺ @ifhtml-á čńëč ăáňú ěŕ --no-ifhtml\n"
+" .@ifinfo-á čńëč ăáňú ěŕ --no-ifinfo\n"
+" .@ifplaintext-á čńëč ăáňú ěŕ --no-ifplaintext\n"
+" .@tex-ĺ @iftex-á čńëč ăáňú ěŕ --no-iftex\n"
+
+#: makeinfo/makeinfo.c:444
+#, fuzzy
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" :čěôä čîřĺôá äéĺěú @if... úĺéđúä řĺáň ěăçîä úřéřá\n"
+" ;íéěňôĺî íđéŕ řúéä ěëĺ ěňôĺî --ifhtml ,HTML ŕĺä čěôä íŕ\n"
+" .íéěňôĺî íđéŕ řúéä ěëĺ ěňôĺî --ifinfo ,čńëč ĺŕ Info ŕĺä čěôä íŕ\n"
+" .íéěňôĺî íđéŕ řúéä ěëĺ ěňôĺî --ifplaintext ,čńëč ŕĺä čěôä íŕ\n"
+
+#: makeinfo/makeinfo.c:452
+#, fuzzy
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+" :úĺŕîâĺă\n"
+"@setfilename é\"ň ďĺúđä őáĺ÷ě Info čěô makeinfo foo.texi\n"
+"@setfilename é\"ň ďĺúđä őáĺ÷ě HTML čěô makeinfo --html foo.texi\n"
+" @setfilename é\"ň ďĺúđä őáĺ÷ě XML čěô makeinfo --xml foo.texi\n"
+" @setfilename-ě DocBook XML čěô makeinfo --docbook foo.texi\n"
+" éđ÷ú čěô őĺřňě čńëč čěô makeinfo --no-headers foo.texi\n"
+" íéčéřôú ŕěěĺ úĺřúĺë ŕěě HTML čěô makeinfo --html --no-headers foo."
+"texi\n"
+" úĺŕ÷ńéô řĺřôń íň Info čěô makeinfo --number-sections foo.texi\n"
+" äéäéů ěëë ěĺăâ ,ăéçé őáĺ÷á Info čěô makeinfo --no-split foo.texi\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr ".%s ďééôŕî řĺáň %s é\"ň ůřăđë ,éřîĺđ čđîĺâřŕ ĺđéŕ `%s'\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "`%s' ĺř÷ŕî úĺáçřä čěô úçéúôá äě÷ú"
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "`%s' ĺř÷ŕî úĺáçřä čěô úçéúôá äě÷ú"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: `%s' ŕě ,`asis'/`none'/éřîĺđ úĺéäě --paragraph-indent ěů čđîĺâřŕ ěň\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: `%s' ŕě ,`end' ĺŕ `separate' úĺéäě --footnote-style ěů čđîĺâřŕ ěň\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr ".őáĺ÷ íů řńç %s úéđëúě\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "`%s' éĺôö äéä ďŕë"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "`%s' äé÷éú úřéöéá (%s) äě÷ú"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "`%s' ŕöîđ ŕě `%s' őáĺ÷á"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr "%s: .íůě ďĺĺëî čěôů íĺůî ĺčîůĺé éđ÷ú čěô őĺřňě ĺř÷ŕî úĺáçřä\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr ".%s čîřĺôá `%s'-ě `%s' őáĺ÷ ăáňî\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "This is %s, produced by makeinfo version %s from %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr "%s: .ĺřîůě --force-á ůîúůä ;úĺě÷ú á÷ň ÷çîéé `%s' ĺř÷ŕî úĺáçřä őáĺ÷\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr "%s: .ĺřîůě --force-á ůîúůä ;úĺě÷ú á÷ň ÷çîéé `%s' čěô őáĺ÷\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "`%s' úřëĺî-éúěá äŕřĺä"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "íéěńěĺńî íééřâĺńá ęřĺö ůé ,@%s-ě čđîĺâřŕ äéäú äŕřĺäů éăë"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "`{...}'-ě äôéö %c%s"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "âĺć-ďá ĺě ďéŕů }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "NO_NAME!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s-ě řńç éđîé řâĺń"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "(HTML řĺáň ůřăđ) @image řĺáň `%s' őáĺ÷ úŕéř÷á (%s) äě÷ú"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "`%s' ŕöîđ ŕě `%s' őáĺ÷á"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "(čńëč řĺáň ůřăđ) @image řĺáň `%s' őáĺ÷ úŕéř÷á (%s) äě÷ú"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image úŕřĺäá řńç őáĺ÷ íů"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{No value for `%s'}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "íů ůřĺă %c%s"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "íŕĺú @end %s éđôě řîâđ čě÷ őáĺ÷"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "áçřĺé ŕě ;ĺáéçřäě éăëî ęĺřŕ `%.40s...'"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "} řńç @multitable ěů úéđáúá"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "@multiline éřçŕ `%s' řúĺéî čńëčî éúîěňúä"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "(%d ăň řúĺî) multitable ěů @item-á úĺăĺîň éăî řúĺé"
+
+#: makeinfo/multi.c:555
+#, fuzzy, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "multitable-á %d 'ńî äăĺîň úřéçáá äě÷ú"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "multitable-ě őĺçî @tab-î éúîěňúä"
+
+# The following two look like debugging output, and aren't compiled.
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Multicolumn output from last row:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* column #%d: output = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "`%s' ä÷ńéô úřăâä řáë %d äřĺůá"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "...%s ä÷ńéô ăáňî úňë\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "`%s' ä÷ńéôá (%c%s ďĺâë) ÷ĺńéô úŕřĺäá ęřĺö ůé"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "ä÷ńéô íů ŕěě `%c%s' äŕřĺä"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "őáĺ÷ íů ĺúĺŕě úĺîâřĺúî `%s' řĺůé÷ úéĺúĺ `%s' ä÷ńéô"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "ĺěňôé ŕě ĺć úéĺú ěŕ íéřĺůé÷ ;ňöĺáú ŕě ĺć @anchor úŕřĺä"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "`--no-split' ďééôŕîá ůîúůä ĺŕ úéĺúä íů äđů"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "`%s' ÷ěĺçî HTML őáĺ÷ íĺéńá äéĺôö-éúěá úćĺřçî"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Next:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Previous:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Up:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "őáĺ÷ íů ĺúĺŕě úĺîâřĺúî `%s-ĺ `%s' řĺůé÷ úĺéĺú"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "ĺěňôé ŕě ĺć úéĺú ěŕ íéřĺůé÷ ;ňöĺáú ŕě @anchor úŕřĺä"
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%sá `%s' úîéé÷ äđđéŕů ä÷ńéôě äééđôä"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "čéřôú"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "řĺůé÷"
+
+#: makeinfo/node.c:1447
+#, fuzzy, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr "äřćç äňéáöî äđéŕ `%s' ä÷ńéô ěů Next äăůá ä÷ńéôä"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "éĺâů Prev äăů úěňá ŕéä (%s) ĺć ä÷ńéô"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Prev äăů"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "äřćç äňéáöî äđéŕ `%s' ä÷ńéô ěů Prev äăůá ä÷ńéôä"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "éĺâů Next äăů úěňá ŕéä (%s) ĺć ä÷ńéô"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Up äăů"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "äřćçá ňéáöîů čéřôú óéňń ďéŕ ěáŕ ,`%s' ěň ňéáöî `%s' ä÷ńéô ěů Up äăů"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "`%s' ä÷ńéôě íéřĺůé÷ %d éúřôń"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "řĺůé÷ óŕ ďéŕ `%s' ä÷ńéôě"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "`%s' äé÷éú úřéöéá (%s) äě÷ú"
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "Appendix %c "
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "!\"%s\" (search_sectioning) úéîéđô äđëĺú úě÷ú"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "!\"%s\" (search_sectioning) úéîéđô äđëĺú úě÷ú"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s-á ůîúůäě óéăň ;úđůĺéî äđéä %c%s äŕřĺä"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "íăĺ÷ äřăâĺä řáë %ctop íň ä÷ńéô"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "%ctop ú÷ńéô ěů íĺ÷îä ĺäć"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "éîöňá @node éúôńĺä ,%cnode éđôě %ctop-á äůîúůä %s ä÷ńéô"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Table of Contents"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Short Contents"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image řĺáň `%s' őáĺ÷ úŕéř÷á (%s) äě÷ú"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: warning: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " for %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr ".íéđééôŕî ěů äŕěî äîéůř úěá÷ě `%s --help' äńđ\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+" %s [OPTION]... [INFO-FILE [DIR-FILE]] :ůĺîéůä ďôĺŕ\n"
+"\n"
+" :íéđééôŕî\n"
+" ;INFO-FILE řĺáň íéîéé÷ čéřôú éôéňń DIR-FILE-î ÷çî --delete\n"
+" .íéůăç čéřôú éôéňń óéńĺú ěŕ\n"
+" .éůŕř Info čéřôú ěů őáĺ÷ íů ďééö --dir-file=NAME\n"
+" .DIR-FILE čđîĺâřŕá ůĺîéůě ęřň-äĺĺů äć\n"
+" .Info ěů čéřôú óéňńë TEXT-á ůîúůä --entry=TEXT\n"
+" Info čéřôú óéňń úřĺů ěů äřĺöá úĺéäě ęéřö TEXT\n"
+" .íéçĺĺřá úĺěéçúîä úĺřĺů äîë úôńĺúě úĺřůôŕ íň\n"
+" íéôéňńä ěë ,úçŕ íňôî řúĺé --entry-á ůîúůú íŕ\n"
+" .ĺôńĺúé ĺěěä\n"
+" ęĺúî ĺáůĺçé čéřôú éôéňń ,--entry-á ůĺîéů ďéŕá\n"
+" .ĺîöň Info őáĺ÷ ěů ďëĺúä\n"
+" .úéđëúäî ŕöĺ ŕć äřćň ęńî âöä --help\n"
+" .éůŕřä čéřôúá äđ÷úäě őáĺ÷ íů ďééö --info-file=FILE\n"
+" .INFO-FILE čđîĺâřŕá ůĺîéůě ęřň-äĺĺů äć\n"
+" .\"--dir-file=DIR/dir\"-ě ęřň-äĺĺů --info-dir=DIR\n"
+" .\"--entry=TEXT\"-ě ęřň-äĺĺů --item=TEXT\n"
+" .čéřôú ěů óéňń äůňîě ŕĺä Info ęéřăîá óéňń\n"
+" .äřäćŕ úĺŕăĺä âéöú ěŕ --quiet\n"
+" .\"--delete\"-ě ęřň-äĺĺů --remove\n"
+" .éůŕřä čéřôúä ěů SEC ÷ěçá äć őáĺ÷ ęĺúî íéôéňń í÷î --section=SEC\n"
+" čéřôúä éôéňń ,úçŕ íňôî řúĺé --section-á ůîúůú íŕ\n"
+" .úđééöů éůŕřä čéřôúä é÷ěçî ăçŕ ěëě ĺôńĺúé\n"
+" ňá÷éé čéřôúá ÷ěçä ,--section-á ůĺîéů ďéŕá\n"
+" .ĺîöň Info őáĺ÷ ěů ďëĺúä ęĺúî\n"
+" .ŕöĺ úéđëúä úńřéâ ěň ňăéî âöä --version\n"
+"\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"* Menu:\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s őáĺ÷ ěů (%s) äŕéř÷á ďäĺ (%s) äřéöéá ďä äě÷ú\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "÷éř ĺđéä %s őáĺ÷"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "íŕĺú END-INFO-DIR-ENTRY ŕěě START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "íŕĺú START-INFO-DIR-ENTRY ŕěě END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr ".ăáěá úçŕ íňô %s-ě Info őáĺ÷ ďééöě ďúéđ\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "`%s' řúĺéî čđîĺâřŕ"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ".äřćň úěá÷ě --help äńđ ;čě÷ őáĺ÷ ďĺéö ďéŕ"
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ".äřćň úěá÷ě --help äńđ ;dir őáĺ÷ ďĺéö ďéŕ"
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "`%s'-á éůŕř čéřôú éôéňń ďéŕ"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "`%s' óéňń éůŕřä čéřôúá íéé÷ řáë `%s' őáĺ÷ě"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "÷çîđ ŕě íĺěë ;`%s' řĺáň čéřôú éôéňń ĺŕöîđ ŕě"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "úéđëúäî ŕöĺ äć äřćň ęńî âöä"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "ăĺáéňä ęěäîá íéřöĺđä íééđîć íéöá÷ ÷çîú ěŕ"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "(ç\"îřá) ăĺáéňä ęěäîá íéřöĺđä íééđîć íéöá÷ ÷çî"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "FILE őáĺ÷ě čěô äđôä"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "ŕöĺ úéđëúä úńřéâ ěň ňăéî âöä"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "%s [OPTION]... FILE... :ůĺîéůä ďôĺŕ\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr ".TeX é\"ň áúëđů FILE őáĺ÷ ěëě ďééĺîî ń÷ăđéŕ ďëä\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ".`foo.%c%c' íůá íéŕř÷đ `foo.texi' ęîńî řĺáň FILE éöá÷ ěěë ęřăá\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+" :íéđééôŕî\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "texinfo ěů ń÷ăđéŕ őáĺ÷ ĺđéŕ `%s'"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "%s ěů úůăĺçî äçéúôá äě÷ú"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "ăĺîň řôńî ďéŕ %s-á"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "éđůî íů ěňá čéřô úĺá÷ňá ŕá %s čéřô"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr ".ăáěá úçŕ íňô %s-ě Info úéé÷éú ďééöě ďúéđ\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" äéĺâů äăĺ÷ô"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "éĺâů ISO ăĺ÷ ĺđéä %s éë %c-á ůîúůî"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "ĺř÷ŕîä úĺáçřä čěôě ăçŕ őáĺ÷ ÷ř ďééöě ďúéđ"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "äöéçî ĺđđéŕů íéé÷ őáĺ÷ ŕöîđ"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "÷éř úĺéäě ěĺëé ĺđéŕ řĺůé÷ ěů ďĺůŕř čđîĺâřŕ"
+
+#~ msgid "see "
+#~ msgstr "see "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "%c ŕěĺ `,' ĺŕ `.' ŕĺáě ęéřö řĺůé÷ éřçŕ"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "÷éř úĺéäě ěĺëé ĺđéŕ @inforef ěů ďĺůŕř čđîĺâřŕ"
+
+#~ msgid "Node:"
+#~ msgstr "Node:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "ŕöîđ ŕě ęŕ ,%s őáĺ÷á úĺéäě äéä řĺîŕ íéđééđň ďëĺú"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "éěŕčřéĺä ďĺřëćä řîâđ"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "úřçŕ úîĺéń äđéĺö ŕěĺ ĺŕöîđ ŕě .jpg-ĺ `%s.png'"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr ".%s äě÷ú äúř÷ `%s' őáĺ÷á\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "Up äăů ďéŕ `%s'-ě"
+
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr "\\%-10[scroll-forward] äîéă÷ úçŕ äřĺů ďîń ććä\n"
+
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "\\%-10[scroll-backward] äřĺçŕ ăçŕ óă ěĺěâ\n"
diff --git a/Build/source/utils/texinfo/po/hr.gmo b/Build/source/utils/texinfo/po/hr.gmo
new file mode 100644
index 00000000000..35e246213b3
--- /dev/null
+++ b/Build/source/utils/texinfo/po/hr.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/hr.po b/Build/source/utils/texinfo/po/hr.po
new file mode 100644
index 00000000000..abde350e683
--- /dev/null
+++ b/Build/source/utils/texinfo/po/hr.po
@@ -0,0 +1,3092 @@
+# Texinfo project .po file for hr_HR localization
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Mirsad Todorovac <mtodorov_69@yahoo.com>, 2002.
+# ... wishes to thank to everybody who helped in good faith.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.2\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2002-04-26 13:49-MET+DST (UTC+2)\n"
+"Last-Translator: Mirsad Todorovac <mtodorov_69@yahoo.com>\n"
+"Language-Team: Croatian <lokalizacija@linux.hr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Pomakni se znak unaprijed"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Pomakni se znak unazad"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Pomakni se na početak tekuće linije"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Pomakni se na kraj tekuće linije"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Pomakni se riječ unaprijed"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Pomakni se riječ unazad"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Obriši znak ispod kursora"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Obriši znak iza kursora"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Poništi ili prekini operaciju"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Prihvaćanje (ili traženje kompletiranja) linije"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Umetni slijedeći znak doslovno"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Umetni tekući znak"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Umetni znak TAB"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Zamijeni mjesta znakovima pod kurzorom"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Povrati zadnji obrisani sadržaj"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Spremnik za obrisani sadržaj je prazan"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Povrati prije obrisani sadržaj"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Obriši tekst do kraja retka"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Obriši tekst do početka retka"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Obriši riječ iza kurzora"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Obriši riječ ispred kurzora"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Ne mogu kompletirati"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Nije dovršeno"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Izlistaj moguće varijante kompletiranja"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Jedino moguće kompletiranje"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Jedno kompletiranje:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d kompletiranja:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Umetni kompletiranje"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Izgrađujem varijante kompletiranja..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "'Skrolaj' prozor za varijante kompletiranja"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Ne mogu prikazati fusnote"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Prikaži fusnote povezane s ovim čvorom u drugom prozoru"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "----------- Fusnote -----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Potraži niz u indeksu ove datoteke"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Tražim stavke indeksa..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Nije pronađen indeks."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Stavka indeksa: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Idi na slijedeću podudarajuću stavki indeksa zadnje `\\[index-search]' "
+"naredbe"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Nema prethodnog zadanog niza za pretraživanje indeksa."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Nema stavaka indeksa."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Nema stavaka %sindeksa koje sadrže \"%s\"."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "još "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "NE MOGU VIDJETI OVO"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"Pronašao \"%s\" u %s. (`\\[next-index-match]' pokušava naći slijedeći.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Skeniram indekse od \"%s\"..."
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Niti jedna raspoloživa info datoteka ne sadrži \"%s\" u svom indeksu."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "Propuži kroz sve poznate indekse u potrazi za nizom i složi meni"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Indeks apropos: "
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Meni: Čvorovi čiji indeksi sadrže \"%s\":\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Pokušajte --help za više informacija.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"S ovim programom NE DOLAZE GARANCIJE. Možete redistribuirati ovaj software\n"
+"pod uvjetima GNU General Public License.\n"
+"Za više informacija o ovim stvarima, pogledajte datoteke imena COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "nijedna stavka indeksa nije nađena za `%s'\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly budi više prijateljski prema sintetizatorima "
+"govora.\n"
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Korištenje: %s [OPCIJA]... [STAVKA-MENIJA...]\n"
+"\n"
+"Čitanje dokumentacije u Info formatu.\n"
+"\n"
+"Opcije:\n"
+" --apropos=SUBJEKT potraži SUBJEKT u svim indeksima svih "
+"priručnika.\n"
+" -d, --directory=DIR dodaj DIR u INFOPATH.\n"
+" --dribble=IMEDAT zapamti korisnikovo tipkanje u IMEDAT.\n"
+" -f, --file=IMEDATOTEKE zadaje ime Info datoteke koju se posjećuje.\n"
+" -h, --help ispiši ovu pomoć i završi s radom.\n"
+" --index-search=NIZ idi na čvor na koji pokazuje stavka indeksa "
+"NIZ.\n"
+" -n, --node=IMEČVORA zadaje čvorove u prvoj posjećenoj info "
+"datoteci.\n"
+" -o, --output=IMEDATOTEKE ispiši izabrane čvorove u IMEDATOTEKE.\n"
+" -R, --raw-escapes ne uklanjaj ANSI escape sekvence iz man "
+"stranica.\n"
+" --restore=IMEDATOTEKE čitaj inicijalne tipke iz IMEDATOTEKE.\n"
+" -O, --show-options, --usage idi na čvor sa opcijama komandne linije.\n"
+"%s --subnodes rekurzivno ispiši stavke menija.\n"
+" --vi-keys koristi tipke kao što su u vi-u i less-u.\n"
+" --version ispiši informaciju o verziji i završi s "
+"radom.\n"
+"\n"
+"Prvi argument koji nije opcija, ako je prisutan, je stavka menija od koje\n"
+"se počinje; nju se traži u svim `dir' datotekama kroz INFOPATH.\n"
+"Ako nije prisutan, info spaja (merge) sve `dir' datoteke i prikazuje\n"
+"rezultat. Eventualni preostali argumenti se tretiraju kao imena stavki\n"
+"menija relativno od inicijalno posjećenog čvora.\n"
+"\n"
+"Primjeri:\n"
+" info prikaži vršni dir meni\n"
+" info emacs započni od emacs čvora iz vršnog dir-a\n"
+" info emacs buffers započni u buffers čvoru unutar emacs "
+"priručnika\n"
+" info --show-options emacs započni u čvoru s emacsovim komandnim opcijama\n"
+" info -f ./foo.info prikaži datoteku ./foo.info, zaobilazeći dir\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Izvještaje o bugovima molimo slati emailom na bug-texinfo@gnu.org\n"
+"(na engleskom), generalna pitanja i diskusije na help-texinfo@gnu.org.\n"
+"Texinfo matična stranica: http://www.gnu.org/software/texinfo/\n"
+"Pitanja i kritike glede translacije slati na adresu lokalizacija@linux.hr."
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Ne mogu naći čvor `%s'."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Ne mogu naći čvor `(%s)%s'."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Ne mogu naći prozor!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Točka se ne nalazi unutar čvora ovog prozora!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Ne mogu dokinuti zadnji prozor."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Nema menija u ovom čvoru."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Nema fusnota u ovom čvoru."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Nema unakrsnih referenci u ovom čvoru."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Nema `%s' pokazivača za ovaj čvor."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Nepoznata Info naredba `%c'; pokušajte `?' za pomoć."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Terminal tipa `%s' nema dovoljno sposobnosti da izvodi Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Već se nalazite na zadnjoj stranici ovog čvora."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Već se nalazite na prvoj stranici ovog čvora."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Samo jedan prozor."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Nastali prozor bi bio premalen."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Nema dovoljno mjesta za prozor za pomoć, molimo dokinite jedan prozor."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Osnovne naredbe u Info prozorima\n"
+"********************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Napusti ovu pomoć.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Potpuno završi s radom (Quit).\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Pozovi Info priručnik.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Izabir drugih čvorova:\n"
+"----------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Idi na slijedeći (`next') čvor u odnosu na ovaj.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr ""
+"\\%-10[prev-node] Idi na prethodni (`previous') čvor u odnosu na ovaj.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Idi naviše (`up') od ovog čvora.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Izaberi stavku menija zadanu imenom.\n"
+" Izabiranje stavke menija selektira drugi čvor.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr "\\%-10[xref-item] Slijedi unakrsnu referencu. Čita ime reference.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Pomakni se do posljednjeg vidljivog čvora u ovom "
+"prozoru.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Preskoči do slijedećeg hipertekst linka unutar "
+"ovog čvora.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Preskoči do slijedećeg hipertekst linka unutar "
+"ovog čvora.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Slijedi hipertekst link ispod kursora.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Pomakni se na `directory' čvor. Ekvivalentno `\\[goto-"
+"node] (DIR)'.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Idi na Top (vršni) čvor. Ekvivalentno `\\[goto-node] "
+"Top'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Pomicanje unutar čvora:\n"
+"-----------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Idi na početak ovog čvora.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Idi na kraj ovog čvora.\n"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr " %-10s 'Skrolaj' naprijed 1 redak.\n"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr " %-10s 'Skrolaj' unazad 1 redak.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] 'Skrolaj stranicu naprijed.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] 'Skrolaj' stranicu unazad.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Druge naredbe:\n"
+"--------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] Odaberi prvu ... devetu stavku u čvorovom meniju.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Odaberi zadnju stavku u meniju čvora.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Traži zadani niz u indeksnim stavkama ove Info "
+"datoteke\n"
+" i selektiraj čvor referenciran prvom nađenom stavkom.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Pomakni se na čvor zadan imenom.\n"
+" Možete također uključiti ime datoteke, kao u (DATOTEKA)"
+"IME_ČVORA.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Traži unaprijed za zadanim nizom\n"
+" i selektiraj čvor u kojem je slijedeća pojava niza nađena.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Traži unazad zadani niz\n"
+" i selektiraj čvor u kojem je slijedeća pojava niza nađena.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Napusti ovu pomoć.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Potpuno završi s radom (Quit).\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Pozovi Info priručnik.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Idi na slijedeći (`next') čvor u odnosu na ovaj.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Idi na prethodni (`previous') čvor u odnosu na ovaj.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Idi naviše (`up') od ovog čvora.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Odaberi stavku menija specificirane imenom.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " Odabiranje stavke menija selektira drugi čvor.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Slijedi unakrsnu referencu. Čita ime reference.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Pomakni se do posljednjeg vidljivog čvora u ovom prozoru.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Preskoči do slijedećeg hipertekst linka unutar ovog čvora.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Slijedi hipertekst link ispod kursora.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Pomakni se na `directory' čvor. Ekvivalentno `g (DIR)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Idi na Top (vršni) čvor. Ekvivalentno s `g Top'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s 'Skrolaj' stranicu naprijed.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s 'Skrolaj' stranicu unazad.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Idi na početak ovog čvora.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Idi na kraj ovog čvora.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s 'Skrolaj' naprijed 1 redak.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s 'Skrolaj' unazad 1 redak.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Odaberi prvu ... devetu stavku u čvorovom meniju.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Odaberi zadnju stavku u čvorovom meniju.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s Traži zadani niz u indeks stavkama ove Info\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" datoteke, i selektiraj čvor referenciran prvom nađenom "
+"stavkom.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Idi na čvor zadan imenom.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Možete također uključiti ime datoteke, kao u (DATOTEKA)"
+"IME_ČVORA.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Traži prema naprijed zadani niz,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" i selektiraj čvor u kojem je slijedeća pojava niza nađena.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Traži unazad zadani niz,\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Trenutni put pretraživanja je:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Naredbe raspoložive u Info prozorima:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Naredbe raspoložive u echo području:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Slijedeće naredbe mogu biti pozvane pomoću %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Slijedeće naredbe ne mogu uopće biti pozvane:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- Upotrijebi `\\[history-node]' ili `\\[kill-node]' za izlaz ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Ispiši poruku za pomoć"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Posjeti Info čvor `(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Ispiši dokumentaciju za TIPKU"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Opiši tipku: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s nije definiran."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s nije definiran."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s je definiran kao %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Pokaži što otipkati da se izvrši data naredba"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Gdje je naredba: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' nije niti na jednoj tipki"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s može biti pozvan samo putem %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s može biti pozvan putem %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Ne postoji funkcija `%s'"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"S ovim programom NE DOLAZE GARANCIJE. Možete redistribuirati ovaj software\n"
+"pod uvjetima GNU General Public License.\n"
+"Za više informacija o ovim stvarima, pogledajte datoteke imena COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "pogrešan broj argumenata"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "ne mogu otvoriti ulaznu datoteku `%s'"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "ne mogu kreirati izlaznu datoteku `%s'"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "greška pri pisanju u `%s'"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "greška pri zatvaranju izlazne datoteke `%s'"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "niz tipaka predugačak"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "nedostaje niz tipaka"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL znak (\\000) nije dozvoljen"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL znak (^%c) nije dozvoljen"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "nedostaje ime akcije"
+
+# this needs to be clarified and verified against info program, since
+# I'm not sure what kind of section they're talking about
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "predugački odlomak"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "nepoznata akcija `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "predugačko ime akcije"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "suvišni znaci slijede akciju `%s'"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "nedostaje ime varijable"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "nedostaje `=' odmah iza imena varijable"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "ime varijable predugačko"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "predugačka vrijednost"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", redak %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Korištenje: %s [OPCIJA]... [ULAZNA-DATOTEKA]\n"
+"\n"
+"Kompiliraj infokey izvornu datoteku u infokey datoteku. Čita ULAZNA-"
+"DATOTEKA\n"
+"(default $HOME/.infokey) i piše kompiliranu key datoteku u (default)\n"
+"$HOME/.info.\n"
+"\n"
+"Opcije:\n"
+" --output DATOTEKA izlaz u DATOTEKA umjesto u $HOME/.info\n"
+" --help ispiši ovu pomoć i završi s radom.\n"
+" --version ispiši ovu informaciju o verziji i završi s radom.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ignoriram neispravnu infokey datoteku `%s' - premalena"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ignoriram neispravnu infokey datoteku `%s' - prevelika"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Pogreška pri čitanju infokey datoteke `%s' - prekratki read"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Neispravna infokey datoteka `%s' (pogrešni magic number) -- pokreni infokey "
+"da se obnovi"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+"Vaša infokey datoteka `%s' je istekla -- pokrenite infokey da se obnovi"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Neispravna infokey datoteka `%s' (bad section length) -- pokrenite infokey "
+"da se obnovi"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Neispravna infokey datoteka `%s' (bad section code) -- pokrenite infokey da "
+"se obnovi"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+"Pogrešni podaci u infokey datoteci -- neka povezivanja tipki zanemarena"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "Pogrešni podaci u infokey datoteci -- neke var postavke ignorirane"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Pročitaj ime Info naredbe i opiši je"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Opiši naredbu: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Pročitaj ime naredbe u echo području i izvrši je"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Ne mogu izvršiti komandu za echo područje ovdje."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "Nepoznata naredba (%s)."
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Postavi visinu prikazanog prozora"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Postavi veličinu screena na (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Izvorne datoteke prepuzane da se uključi ova datoteka:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Neuspjelo rukovanje datotekom %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Meni:\n"
+" (Datoteka)Čvor Redaka Vel. Sadrži datoteku\n"
+" -------------- ------ ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Ovdje je popis čvorova koje ste nedavno posjetili.\n"
+"Odaberite jedan s menija, ili koristite `\\[history-node]' u drugom prozoru\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Načini prozor sadržavajući meni svih dosad posjećenih čvorova"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Izaberi čvor koji je prethodno bio posjećen u vidljivi prozor"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Izaberi posjećeni čvor: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referenca je nestala! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Dobrodošli u Info verzija %s. Otipkajte \\[get-help-window] za pomoć, "
+"\\[menu-item] za stavku menija."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Pomakni se dolje to slijedećeg retka"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Pomakni se gore do prethodnog retka"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Pomakni se do kraja retka"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Pomakni se na početak retka"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Next"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Slijedim Next (slijedeći) čvor..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Izabirem prvu stavku menija..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Selektiram Next (slijedeći) čvor..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Pomičem se gore (Up) %d put(a), onda Next."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Nema više čvorova u ovom dokumentu."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Nema `Prev' (prethodni) za ovaj čvor."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Idemo na Prev (prethodni) u ovom prozoru."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Nema `Prev' ni `Up' za ovaj čvor unutar dokumenta."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Idem gore (Up) u ovom prozoru."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Idem na zadnju stavku `Prev'-ovog menija."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Idi naprijed ili naniže kruz strukturu čvorova"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Idi unatrag ili gore kroz strukturu čvorova"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "'Skrolaj' prema gore u ovom prozoru"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"'Skrolaj' prema dolje u ovom prozoru i postavi inicijalnu veličinu prozora"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "'Skrolaj' prema dolje u ovom prozoru ostajući unutar čvora"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"'Skrolaj' prema dolje u ovom prozoru ostajući unutar čvora i postavi "
+"inicijalnu veličinu prozora"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "'Skrolaj' prema gore u ovom prozoru"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+"'Skrolaj' prema gore u ovom prozoru i postavi inicijalnu veličinu prozora"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "'Skrolaj' prema gore u ovom prozoru ostajući unutar čvora"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"'Skrolaj' prema gore u ovom prozoru ostajući unutar čvora i postavi "
+"inicijalnu veličinu prozora"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Pomakni se na početak trenutnog čvora"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Pomakni se na kraj trenutnog čvora"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "'Skrolaj' dolje za redaka"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "'Skrolaj' gore za redaka"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "'Skrolaj' dolje za polovinu veličine ekrana"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "'Skrolaj' gore za polovinu veličine ekrana"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Selektiraj slijedeći prozor"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Selektiraj prethodni prozor"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Raspolovi trenutni prozor"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Obriši trenutni prozor"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Ne mogu obrisati permanentni prozor"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Obriši sve ostale prozore"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "'Skrolaj' drugi prozor"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "'Skrolaj' drugi prozor unazad"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Povećaj (ili smanji) ovaj prozor"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Podijeli vidljivu površinu ekrana između vidljivih prozora"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Promijeni stanje prelamanja linija u trenutnom prozoru"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Prikaži Next (slijedeći) čvor"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Prikaži Prev (prethodni) čvor"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Prikaži Up (gornji) čvor"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Prikaži posljednji čvor u ovoj datoteci"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Ovaj prozor nema dodatnih čvorova"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Prikaži prvi čvor u ovoj datoteci"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Prikaži zadnji čvor u ovoj datoteci"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Selektiraj ovu stavku menija"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Nema %d stavaka u ovom meniju."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Stavka menija (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Stavka menija: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Slijedi xref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Slijedi xref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Čitaj stavku menija i selektiraj njen čvor"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Čitaj fusnotu ili referencu i selektiraj njezin čvor"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Idi na početak menija ovog čvora"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Posjeti što je više moguće stavki odjednom"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Čitaj ime čvora i selektiraj ga"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Idi na čvor: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Nema menija u čvoru `%s'."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Nema stavke menija `%s' u čvoru `%s'."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Ne mogu naći čvor referenciran od `%s' u `%s'."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Čitaj listu menija počevši od dir i slijedi ih"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Slijedi menije: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Pronađi čvor koji opisuje pozivanje programa"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Nađi čvor pozivanja (Invocation) od [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Pročitaj referentnu man stranicu i selektiraj je"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Dobavi man stranicu: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Selektiraj čvor `Top' u ovoj datoteci"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Selektiraj čvor `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Poništi čvor (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Ne mogu poništiti čvor `%s'"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Ne mogu poništiti zadnji čvor"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Selektiraj najzadnji odabrani čvor"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Poništi ovaj čvor"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Pročitaj ime datoteke i selektiraj ga"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Nađi datoteku: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Ne mogu naći `%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Ne mogu kreirati izlaznu datoteku `%s'."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Gotovo."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Ispisujem čvor %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr ""
+"Propusti sadržaj ovog čvora kroz cjevovod (pipe) prema INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Ne mogu otvoriti cjevovod (pipe) prema `%s'."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Ispisujem čvor %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Tražim poddatoteku %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Čitaj niz znakova i kreni u potragu za njim (case-sensitive)"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Čitaj niz znakova i potraži ga"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Čitaj niz znakova i potraži ga unatrag"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%sza niz znakova [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Traži unazad"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Traži"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " (case-sensitive) "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Pretraživanje neuspjelo."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Ponovi zadnje pretraživanje u istom pravcu"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Nema prethodnog traženog niza"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Ponovi zadnje pretraživanje u suprotnom pravcu"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Traži niz interaktivno kako ga tipkate"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-pretraga unazad: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-pretraga: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Neuspjela "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Idi na prethodnu referencu"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Idi na slijedeću referencu"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Selektiraj referencu ili stavku menija koja se pojavljuje u retku"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Poništi trenutnu operaciju"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Završi (Quit)"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Pomakni kurzor na specificirani redak prozora"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Osvježi prikaz"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Završi korištenje Info-a"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Izvrši naredbu povezanu s malim slovom varijantom ove tipke"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Nepoznata naredba (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" je neispravno"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" je neispravno"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Dodaj ovu znamenku trenutnom numeričkom argumentu"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Započni (ili pomnoži s 4) trenutni numerički argument"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Interno korišten od \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Premalo virtualne memorije!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Kada je \"On\", fusnote se pojavljuju i nestaju automatski"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Kada je \"On\", kreiranje ili zatvaranje prozora mijenja veličinu drugih "
+"prozora"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Kada je \"On\", bljesni ekranom umjesto zvonjenja zvona"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Kada je \"On\", greške pruzročuju zvon zvona"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Kada je \"On\", Info radi 'garbage collection' s datotekama koje je trebalo "
+"odkompresirati"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Kada je \"On\", dio znakovnog niza koji se podudara je osvijetljen"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Kontrolira što se događa kad se skrolanje traži na kraju čvora"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Broj redaka koliko treba skrolati kad se kurzor pomakne izvan prozora"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Kada je \"On\", Info prihvaća i prikazuje ISO Latin znakove"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Objašnjava korištenje varijable"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Opiši varijablu: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Postavi vrijednost info varijable"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Postavi varijablu: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Postavi %s na vrijednost (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Postavi %s na vrijednost (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Tagovima istekao rok trajanja ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), redaka ----,"
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d redaka --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d redaka --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Poddatoteka: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opcija `%s' nije jednoznačna\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opcija `--%s' ne dopušta argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opcija `%c%s' ne dopušta argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opcija `%s' traži neophodan argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: nepoznata opcija `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: nepoznata opcija `%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: nedozvoljena opcija -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: pogrešna opcija -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opcija zahtijeva argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opcija `-W %s' nije jednoznačna\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opcija `-W %s' ne dopušta argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr ""
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr ""
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr ""
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr ""
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr ""
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr ""
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr ""
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr ""
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr ""
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr ""
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr ""
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr ""
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr ""
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr ""
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr ""
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr ""
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr ""
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr ""
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr ""
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr ""
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr ""
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr ""
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr ""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr ""
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr ""
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr ""
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr ""
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr ""
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr ""
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr ""
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr ""
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr ""
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr ""
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr ""
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr ""
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr ""
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr ""
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr ""
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr ""
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr ""
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr ""
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr ""
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr ""
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr ""
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr ""
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr ""
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr ""
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr ""
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr ""
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr ""
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr ""
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr ""
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr ""
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "%s: nepoznata opcija `%c%s'\n"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr ""
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr ""
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr ""
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr ""
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr ""
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr ""
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr ""
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr ""
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr ""
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr ""
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Ne mogu kreirati izlaznu datoteku `%s'."
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "Nema menija u čvoru `%s'."
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr ""
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr ""
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr ""
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr ""
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr ""
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr ""
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr ""
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr ""
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr ""
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr ""
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr ""
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr ""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr ""
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr ""
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr ""
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr ""
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr ""
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr ""
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr ""
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr ""
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr ""
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr ""
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr ""
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr ""
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr ""
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "ne mogu kreirati izlaznu datoteku `%s'"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr ""
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr ""
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr ""
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr ""
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr ""
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr ""
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr ""
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr ""
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr ""
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr ""
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr ""
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr ""
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr ""
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr ""
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr ""
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr ""
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr ""
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr ""
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr ""
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr ""
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr ""
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr ""
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr ""
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr ""
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr ""
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr ""
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr ""
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr ""
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr ""
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr ""
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr ""
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr ""
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr ""
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" je neispravno"
+
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr "\\%-10[scroll-forward] 'Skrolaj' naprijed 1 redak.\n"
+
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "\\%-10[scroll-backward] 'Skrolaj' unazad 1 redak.\n"
+
+#~ msgid ""
+#~ "Basic Commands in Info Windows\n"
+#~ "******************************\n"
+#~ "\n"
+#~ " \\%-10[quit-help] Quit this help.\n"
+#~ " \\%-10[quit] Quit Info altogether.\n"
+#~ " \\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+#~ "\n"
+#~ "Selecting other nodes:\n"
+#~ "----------------------\n"
+#~ " \\%-10[next-node] Move to the \"next\" node of this node.\n"
+#~ " \\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+#~ " \\%-10[up-node] Move \"up\" from this node.\n"
+#~ " \\%-10[menu-item] Pick menu item specified by name.\n"
+#~ " Picking a menu item causes another node to be selected.\n"
+#~ " \\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+#~ " \\%-10[history-node] Move to the last node seen in this window.\n"
+#~ " \\%-10[move-to-next-xref] Skip to next hypertext link within this "
+#~ "node.\n"
+#~ " \\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+#~ "node.\n"
+#~ " \\%-10[select-reference-this-line] Follow the hypertext link under "
+#~ "cursor.\n"
+#~ " \\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+#~ "node] (DIR)'.\n"
+#~ " \\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] "
+#~ "Top'.\n"
+#~ "\n"
+#~ "Moving within a node:\n"
+#~ "---------------------\n"
+#~ " \\%-10[scroll-forward] Scroll forward a page.\n"
+#~ " \\%-10[scroll-backward] Scroll backward a page.\n"
+#~ " \\%-10[beginning-of-node] Go to the beginning of this node.\n"
+#~ " \\%-10[end-of-node] Go to the end of this node.\n"
+#~ " \\%-10[1scroll-forward] Scroll forward 1 line.\n"
+#~ " \\%-10[1scroll-backward] Scroll backward 1 line.\n"
+#~ "\n"
+#~ "Other commands:\n"
+#~ "---------------\n"
+#~ " \\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+#~ " \\%-10[last-menu-item] Pick last item in node's menu.\n"
+#~ " \\%-10[index-search] Search for a specified string in the index "
+#~ "entries of this Info\n"
+#~ " file, and select the node referenced by the first entry "
+#~ "found.\n"
+#~ " \\%-10[goto-node] Move to node specified by name.\n"
+#~ " You may include a filename as well, as in (FILENAME)"
+#~ "NODENAME.\n"
+#~ " \\%-10[search] Search forward through this Info file for a specified "
+#~ "string,\n"
+#~ " and select the node in which the next occurrence is found.\n"
+#~ " \\%-10[search-backward] Search backward in this Info file for a "
+#~ "specified string,\n"
+#~ " and select the node in which the next occurrence is found.\n"
+#~ msgstr ""
+#~ "Osnovne naredbe u Info Prozorima\n"
+#~ "********************************\n"
+#~ "\n"
+#~ " \\%-10[quit-help] Završi ovu pomoć.\n"
+#~ " \\%-10[quit] Iziđi iz Info programa.\n"
+#~ " \\%-10[get-info-help-node] Pozovi Info priručnik.\n"
+#~ "\n"
+#~ "Selektiranje drugih čvorova:\n"
+#~ "----------------------------\n"
+#~ " \\%-10[next-node] Idi na slijedeći (\"next\") čvor od ovog čvora.\n"
+#~ " \\%-10[prev-node] Idi na prethodni (\"previous\") čvor od ovog čvora.\n"
+#~ " \\%-10[up-node] Idi gore (\"up\") od ovog čvora.\n"
+#~ " \\%-10[menu-item] Izaberi stavku menija zadanu imenom.\n"
+#~ " Odabiranjeim stavke menija se selektira drugi čvor.\n"
+#~ " \\%-10[xref-item] Slijedi unakrsnu referencu. Čita ime reference.\n"
+#~ " \\%-10[history-node] Idi na zadnji vidljiv čvor u ovom prozoru.\n"
+#~ " \\%-10[move-to-next-xref] Idi na slijedeći hipertekst link u ovom "
+#~ "čvoru.\n"
+#~ " \\%-10[move-to-prev-xref] Idi na prethodni hipertekst link u ovom "
+#~ "čvoru.\n"
+#~ " \\%-10[select-reference-this-line] Slijedi hipertekst link pod "
+#~ "kursorom.\n"
+#~ " \\%-10[dir-node] Idi na čvor `directory'. Ekvivalentno `\\[goto-node] "
+#~ "(DIR)'.\n"
+#~ " \\%-10[top-node] Idi na vršni (Top) čvor. Ekvivaletno `\\[goto-node] "
+#~ "Top'.\n"
+#~ "\n"
+#~ "Pomicanje unutar čvora:\n"
+#~ "-----------------------\n"
+#~ " \\%-10[scroll-forward] Skrolaj stranicu naprijed.\n"
+#~ " \\%-10[scroll-backward] Skrolaj stranicu unazad.\n"
+#~ " \\%-10[beginning-of-node] Idi na početak ovog čvora.\n"
+#~ " \\%-10[end-of-node] Idi na kraj ovog čvora.\n"
+#~ " \\%-10[1scroll-forward] Skrolaj naprijed 1 redak.\n"
+#~ " \\%-10[1scroll-backward] Skrolaj unazad 1 redak.\n"
+#~ "\n"
+#~ "Druge naredbe:\n"
+#~ "--------------\n"
+#~ " \\%-10[menu-digit] Odaberi prvu ... devetu stavku u čvorovom meniju.\n"
+#~ " \\%-10[last-menu-item] Odaberi zadnju stavku u čvorovom meniju.\n"
+#~ " \\%-10[index-search] Traži zadani niz u indeks stavkama ove Info\n"
+#~ " datoteke, i selektiraj čvor referenciran prvom nađenom "
+#~ "stavkom.\n"
+#~ " \\%-10[goto-node] Idi na čvor zadan imenom.\n"
+#~ " Možete također uključiti ime datoteke, kao u (DATOTEKA)"
+#~ "IME_ČVORA.\n"
+#~ " \\%-10[search] Traži zadani niz prema naprijed kroz ovu Info "
+#~ "datoteku,\n"
+#~ " i selektiraj čvor u kojem je slijedeća pojava niza nađena.\n"
+#~ " \\%-10[search-backward] Traži zadani niz prema nazad kroz ovu Info "
+#~ "datoteku,\n"
+#~ " i selektiraj čvor u kojem je slijedeća pojava niza nađena.\n"
+
+#~ msgid "Basic Commands in Info Windows\n"
+#~ msgstr "Osnovne naredbe u Info Prozorima\n"
+
+#~ msgid "Moving within a node:\n"
+#~ msgstr "Pomicanje unutar čvora:\n"
+
+#~ msgid "Selecting other nodes:\n"
+#~ msgstr "Selektiranje drugih čvorova:\n"
+
+#~ msgid "Other commands:\n"
+#~ msgstr "Druge naredbe:\n"
+
+#~ msgid ""
+#~ "Usage: %s [OPTION]... [INPUT-FILE]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --output FILENAME output to FILENAME instead of $HOME/.info\n"
+#~ " --help display this help and exit.\n"
+#~ " --version display version information and exit.\n"
+#~ "\n"
+#~ "Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+#~ "$HOME/.infokey) and writes compiled key file to $HOME/.info.\n"
+#~ "\n"
+#~ "Email bug reports to bug-texinfo@gnu.org,\n"
+#~ "general questions and discussion to help-texinfo@gnu.org.\n"
+#~ msgstr ""
+#~ "Korištenje: %s [OPCIJA]... [ULAZNA-DATOTEKA]\n"
+#~ "\n"
+#~ "Opcije:\n"
+#~ " --output DATOTEKA izlaz u DATOTEKA umjesto u $HOME/.info\n"
+#~ " --help ispiši ovu pomoć i završi.\n"
+#~ " --version ispiši informaciju o verziji i završi.\n"
+#~ "\n"
+#~ "Prevedi infokey izvornu datoteku u infokey datoteku. Čita ULAZNA-"
+#~ "DATOTEKA\n"
+#~ "(podrazumno $HOME/.infokey) i ispisuje prevedenu key datoteku u $HOME/."
+#~ "info.\n"
+#~ "\n"
+#~ "Šaljite izvješzaje u bugovima na email bug-texinfo@gnu.org,\n"
+#~ "opća pitanja i diskusije na help-texinfo@gnu.org.\n"
diff --git a/Build/source/utils/texinfo/po/insert-header.sin b/Build/source/utils/texinfo/po/insert-header.sin
new file mode 100644
index 00000000000..b26de01f6c8
--- /dev/null
+++ b/Build/source/utils/texinfo/po/insert-header.sin
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/Build/source/utils/texinfo/po/ja.gmo b/Build/source/utils/texinfo/po/ja.gmo
new file mode 100644
index 00000000000..ff3f98bcc5e
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ja.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/ja.po b/Build/source/utils/texinfo/po/ja.po
new file mode 100644
index 00000000000..c94fc3ad937
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ja.po
@@ -0,0 +1,3355 @@
+# Japanese message for texinfo 4.0f
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Daisuke Yamashita <yamad@mb.infoweb.ne.jp>, 1999-2002
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU texinfo 4.0f\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2002-01-23 20:46+0900\n"
+"Last-Translator: Daisuke Yamashita <yamad@mb.infoweb.ne.jp>\n"
+"Language-Team: Japanese <ja@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=EUC-JP\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "°ěʸťúĘŹżĘ¤á¤ë"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "°ěʸťúĘŹĚᤚ"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "šÔĆŹ¤Ë°ÜĆ°"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "šÔËö¤Ë°ÜĆ°"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Ăą¸ě°ě¤ÄĘŹżĘ¤á¤ë"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Ăą¸ě°ě¤ÄĘŹĚᤚ"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "ĽŤĄźĽ˝Ľë°ĚĂÖ¤Îʸťú¤ňşď˝ü"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "ĽŤĄźĽ˝Ľë¤Î¸ĺ¤í¤Îʸťú¤ňşď˝ü"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Ľ­ĽăĽóĽťĽëĄ˘Áŕşî¤Îźč¤ęťß¤á"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "¤ł¤ÎšÔ¤ňźő¤ąĆţ¤ě¤ë(Ëô¤ĎĘä´°¤ľ¤ť¤ë)"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "źĄ¤Îʸťú¤ň¤˝¤Î¤Ţ¤ŢÁŢĆţ¤š¤ë"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "¤ł¤Îʸťú¤ňÁŢĆţ¤š¤ë"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "ĽżĽÖʸťú¤ňÁŢĆţ¤š¤ë"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "ʸťú¤Î¸ň´š"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Ľ­ĽëĽęĽóĽ°¤ÎĆâÍƤňĹ˝¤ę¤Ä¤ą¤ë"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Ľ­ĽëĽęĽóĽ°¤Źśő¤Ç¤š"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "°ĘÁ°¤ÎĽ­ĽëĽęĽóĽ°ĆâÍƤňÁŢĆţ¤š¤ë"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "šÔËö¤Ţ¤Ç¤ňŔÚ¤ęźč¤ë"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "šÔĆŹ¤Ţ¤Ç¤ňŔÚ¤ęźč¤ë"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Ăą¸ě¤ÎĽŤĄźĽ˝Ľë¤č¤ę¤â¸ĺ¤ňŔÚ¤ęźč¤ë"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Ăą¸ě¤ÎĽŤĄźĽ˝Ľë¤č¤ęÁ°¤ňŔÚ¤ęźč¤ë"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Ęä´°¸őĘ䤏¤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Ęä´°¤Ç¤­¤Ţ¤ť¤ó"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Ęä´°ĽęĽšĽČ"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Ęä´°¤ňšĘ¤ęšţ¤ß¤Ţ¤ˇ¤ż"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "1 ¤Ä¤ÎĘä´°:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d ¸Ä¤ÎĘä´°\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Ęä´°¤ňÁŢĆţ"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Ęä´°ĽęĽšĽČ¤ňşîŔŽĂć..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Ęä´°ĽŚĽŁĽóĽÉĽŚ¤ňĽšĽŻĽíĄźĽë"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "ľÓĂí¤ňÉ˝ź¨¤Ç¤­¤Ţ¤ť¤ó"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "ž¤ÎĽŚĽŁĽóĽÉĽŚĆâ¤Ë¤ł¤ÎĽÎĄźĽÉ¤Č´ŘϢ¤ˇ¤żľÓĂí¤ňÉ˝ź¨"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "------------ ľÓĂí ------------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "¤ł¤ÎĽŐĽĄĽ¤Ľë¤Î¸Ť˝Đ¤ˇ¤Ť¤éʸťúÎó¤ň¸Ąş÷¤š¤ë"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "¸Ť˝Đ¤ˇšŕĚܤň¸Ť¤Ä¤ą¤Ć¤¤¤Ţ¤š"
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "šŕĚܤŹ¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "¸Ť˝Đ¤ˇšŕĚÜ: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr "ÄžÁ°¤Î `\\[index-search]' ĽłĽŢĽóĽÉ¤Č°ěĂפˇ¤ż¸Ť˝Đ¤ˇĽ˘Ľ¤ĽĆĽŕ¤ňĂŠ¤ë"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Á°¤Î¸Ť˝Đ¤ˇ¸Ąş÷ʸťúÎ󤏤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "¸Ť˝Đ¤ˇšŕĚܤŹ¤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "\"%2$s\" ¤ň´Ţ¤ŕ%1$s¸Ť˝Đ¤ˇšŕĚܤŹ¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/indices.c:376
+msgid "more "
+msgstr "¤ł¤ě°Ęžĺ¤Î"
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "*¤ł¤ě¤ň¸Ť¤é¤ě¤Ţ¤ť¤ó*"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"%1$s ¤Ť¤é \"%2$s\" ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ˇ¤żĄŁ(`\\[next-index-match]' ¤ÇźĄ¤ňĂľ¤ˇ¤Ţ¤š)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "\"%s\" ¤Î¸Ť˝Đ¤ˇ¤ňÄ´¤Ů¤Ć¤¤¤Ţ¤š..."
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Ľ¤ĽóĽÇĽĂĽŻĽš¤Ë \"%s\" ¤ňťý¤Ă¤Ć¤¤¤ë info ĽŐĽĄĽ¤Ľë¤ŹÍŃ°Ő¤ľ¤ě¤Ć¤¤¤Ţ¤ť¤óĄŁ"
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "Á´¤Ć¤Î info ĽŐĽĄĽ¤ĽëʸťúÎ󤍤鸍˝Đ¤ˇ¤ňÁöşş¤ˇĄ˘ĽáĽËĽĺĄź¤ňşîŔŽ"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "¸ěśç¤ň´Ţ¤ŕšŕĚܤň¸Ąş÷: "
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* ĽáĽËĽĺĄź: \"%s\" ¤ň´Ţ¤ŕ¸Ť˝Đ¤ˇšŕĚÜ\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "žÜ¤ˇ¤Ż¤Ď --help ĽŞĽ×ĽˇĽçĽó¤ňťî¤ˇ¤Ć¤ß¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+"\n"
+"ĚőĂí: Čóžď¤Ë˝ĹÍפĘʸžĎ¤Î¤ż¤áĄ˘¸śĘ¸¤ňťÄ¤ˇ¤Ć¤¤¤Ţ¤šĄŁ\n"
+" -- ť˛šÍĚő\n"
+"°ěŔÚ¤ÎĘݞڤϤ˘¤ę¤Ţ¤ť¤óĄŁ¤˘¤Ę¤ż¤ĎĄ˘GNU General Public Licence ¤Îʸ¸Ŕ¤Î˛ź¤ÇĄ˘\n"
+"¤ł¤ÎĽ˝ĽŐĽČĽŚĽ§Ľ˘¤ňşĆÇŰÉۤǤ­¤Ţ¤šĄŁ¤ł¤ě¤é¤Ë¤Ä¤¤¤Ć¤Î¤č¤ęžÜ¤ˇ¤¤ŔâĚŔ¤ĎĄ˘COPYING\n"
+"¤Č¤¤¤ŚĽŐĽĄĽ¤Ľë¤ň¸Ť¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "`%s' ¤ËÂФš¤ëšŕĚܤŹ¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó\n"
+
+#: info/info.c:590
+#, fuzzy
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr " --speech-friendly ˛ťŔźšçŔŽ´ď¤ËÂФš¤ëżĆĎÂŔ­¤ňšâ¤á¤ë\n"
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"ťČ¤¤Ęý: %s [ĽŞĽ×ĽˇĽçĽó]... [ĽáĽËĽĺĄźšŕĚÜ...]\n"
+"\n"
+"Info ĽŐĽŠĄźĽŢĽĂĽČ¤ÎĽÉĽ­ĽĺĽáĽóĽČ¤ňĆɤॣ\n"
+"\n"
+"ĽŞĽ×ĽˇĽçĽó:\n"
+" --apropos=SUBJECT Á´ĽŢĽËĽĺĽ˘Ľë¤ÎšŕĚܤŤ¤éźçÂę¤ň¸Ť¤Ä¤ą¤ë\n"
+" --directory=DIR DIR ¤ň INFOPATH ¤ËÄɲ䚤ë\n"
+" --dribble=FILENAME FILENAME ¤ËĽćĄźĽś¤ÎĽ­ĄźĽšĽČĽíĄźĽŻ¤ňłĐ¤¨¤Ć¤Ş¤Ż\n"
+" --file=FILENAME ËŹĚäŔčĽŐĽĄĽ¤Ľë¤ň FIENAME ¤ČťŘÄꤚ¤ë\n"
+" --help ¤ł¤ÎĽŘĽëĽ×¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ë\n"
+" --index-search=STRING šŕĚÜĽ¨ĽóĽČĽę STRING ¤ÇťŘź¨¤ľ¤ě¤żĽÎĄźĽÉ¤ËšÔ¤Ż\n"
+" --node=NODENAME şÇ˝é¤ËËŹ¤ě¤ë Info ĽŐĽĄĽ¤Ľë¤ÎĽÎĄźĽÉťŘÄꤚ¤ë\n"
+" --output=FILENAME ÁŞÂň¤ľ¤ě¤żĽÎĄźĽÉ¤ň FILENAME ¤Ë˝ĐÎϤš¤ë\n"
+" --restore=FILENAME şÇ˝é¤ÎĽ­ĄźĽšĽČĽíĄźĽŻ¤ň FILENAME ¤Ť¤éĆÉšţ¤ŕ\n"
+" --show-options, --usage ĽłĽŢĽóĽÉĽéĽ¤ĽóĽŞĽ×ĽˇĽçĽóĽÎĄźĽÉ¤ËšÔ¤Ż\n"
+" --subnodes ˝ĐÎĎĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ňşĆľ˘ĹŞ¤Ë˝ĐÎϤš¤ë\n"
+"%s --subnodes ĽáĽËĽĺĄźšŕĚܤňşĆľ˘ĹŞ¤Ë˝ĐÎϤš¤ë\n"
+" --vi-keys vi ¤ä less ¤Î¤č¤Ś¤ĘĽ­ĄźĽĐĽ¤ĽóĽÉ¤ňťČ¤Ś\n"
+" --version ĽĐĄźĽ¸ĽçĽóžđĘó¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ë\n"
+"\n"
+"şÇ˝é¤ËĽŞĽ×ĽˇĽçĽó°Ęł°¤Î°úżô¤Ź¤˘¤Ă¤żžěšçĄ˘¤˝¤ě¤ĎľŻĹŔĽáĽËĽĺĄźĽ¨ĽóĽČĽę¤Č¤Ę¤ę¤Ţ"
+"¤š\n"
+" -- INFOPATH ¤Ëąč¤Ă¤żÁ´¤Ć¤Î `dir' ĽŐĽĄĽ¤Ľë¤Ť¤é¤Ż¤Ţ¤Ę¤ŻĂľ¤ˇ¤Ţ¤š\n"
+"¤ł¤ě¤ŹťŘÄꤾ¤ě¤Ę¤¤žěšçĄ˘¤š¤Ů¤Ć¤Î `dir' ĽŐĽĄĽ¤Ľë¤ňˇŇ¤Žšç¤ď¤ť¤ĆÉ˝ź¨¤ˇ¤Ţ¤šĄŁ\n"
+"ťÄ¤ę¤Î°úżô¤ĎşÇ˝é¤ËËŹĚ䤾¤ě¤ëĽÎĄźĽÉ¤Ë´ŘϢ¤š¤ëĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ÎĚžÁ°¤Č¤ˇ¤Ć\n"
+"°ˇ¤ď¤ě¤Ţ¤šĄŁ\n"
+"\n"
+"Îă:\n"
+" info şÇžĺ°Ě¤Î dir ĽáĽËĽĺĄź¤ňÉ˝ź¨\n"
+" info emacs şÇžĺ°Ě dir ¤Î emacs ĽÎĄźĽÉ¤Ť¤éłŤťĎ\n"
+" info emacs buffers emacs ĽŢĽËĽĺĽ˘ĽëĆâ¤Î buffers ĽÎĄźĽÉ¤Ť¤éłŤťĎ\n"
+" info --show-options emacs emacs ¤ÎĽłĽŢĽóĽÉĽéĽ¤ĽóĽŞĽ×ĽˇĽçĽóĽÎĄźĽÉ¤Ť¤éłŤťĎ\n"
+" info -f ./foo.info ./foo.info ¤ňÉ˝ź¨¤ˇĄ˘dir ¤ĎĂľş÷¤ˇ¤Ę¤¤\n"
+"\n"
+"Email ¤Ë¤č¤ëĽĐĽ°ĽěĽÝĄźĽČ¤Ď bug-texinfo@gnu.orgĄ˘\n"
+"°ěČĚĹŞ¤ĘźÁĚä¤äľÄĎŔ¤Ď help-texinfo@gnu.org ¤Ţ¤ÇĄŁ\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+#, fuzzy
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Email ¤Ë¤č¤ëĽĐĽ°ĽěĽÝĄźĽČ¤Ď bug-texinfo@gnu.orgĄ˘\n"
+"°ěČĚĹŞ¤ĘźÁĚä¤äľÄĎŔ¤Ď help-texinfo@gnu.org ¤Ţ¤ÇĄŁ\n"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "`%s' ĽÎĄźĽÉ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "`(%s)%s' ĽÎĄźĽÉ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "ĽŚĽŁĽóĽÉĽŚ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚĽÎĄźĽÉĆâ¤ËĽÝĽ¤ĽóĽČ¤Ź¸˝¤ě¤Ţ¤ť¤óĄŞ"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "şÇ¸ĺ¤ÎĽŚĽŁĽóĽÉĽŚ¤Ďşď˝ü¤Ç¤­¤Ţ¤ť¤ó"
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ËĽáĽËĽĺĄź¤Ď¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ËľÓĂí¤Ď¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ËÁę¸ßť˛žČ¤Ď¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤Î `%s' ĽÝĽ¤ĽóĽż¤Ź¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "̤ĂΤΠInfo ĽłĽŢĽóĽÉ `%c' -- `?' ¤ÇĽŘĽëĽ×¤ň¸Ť¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ"
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "ĂźËöĽżĽ¤Ľ× `%s' ¤Ď Info ¤ňĆ°¤Ť¤ť¤ë¤Ű¤ÉÍř¸ý¤Ç¤Ď¤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "¤ł¤ł¤Ď¤â¤ŚĄ˘¤ł¤ÎĽÎĄźĽÉ¤ÎşÇ˝ŞĽÚĄźĽ¸¤Ç¤šĄŁ"
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "¤ł¤ł¤Ď¤â¤ŚĄ˘¤ł¤ÎĽÎĄźĽÉ¤ÎşÇ˝é¤ÎĽÚĄźĽ¸¤Ç¤šĄŁ"
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "ÍŁ°ě¤ÎĽŚĽŁĽóĽÉĽŚĄŁ"
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "ˇë˛ĚĽŚĽŁĽóĽÉĽŚ¤ŹžŽ¤ľ¤š¤Ž¤ëÍͤǤš"
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ""
+"ĽŘĽëĽ×ĽŚĽŁĽóĽÉĽŚÍѤΞě˝ę¤ŹÂ­¤ę¤Ţ¤ť¤óĄ˘ĽŚĽŁĽóĽÉĽŚ¤ň°ě¤Äşď˝ü¤ˇ¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ"
+
+#: info/infodoc.c:46 info/infodoc.c:95
+#, fuzzy
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr "Info ĽŚĽŁĽóĽÉĽŚĆâ¤Î´đËÜĽłĽŢĽóĽÉ\n"
+
+#: info/infodoc.c:49
+#, fuzzy
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr " %-10s ¤ł¤ÎĽŘĽëĽ×¤ň˝ŞÎť¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:50
+#, fuzzy
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr " %-10s Info ¤â°ě˝ď¤Ë˝ŞÎť¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:51
+#, fuzzy
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr " %-10s Info ĽÁĽĺĄźĽČĽęĽ˘Ľë¤ňľŻĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+#, fuzzy
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr "ž¤ÎĽÎĄźĽÉ¤ňÁŞÂň¤š¤ë:\n"
+
+#: info/infodoc.c:55
+#, fuzzy
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉ¤Î `źĄ' ¤ÎĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:56
+#, fuzzy
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉ¤Î `Á°' ¤ÎĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:57
+#, fuzzy
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉ¤Ť¤é `žĺ' ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:58
+#, fuzzy
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" ĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ÎÁŞÂň¤ÇĄ˘Âž¤ÎĽÎĄźĽÉ¤ŹÁŞÂň¤ľ¤ě¤ëťö¤Ë¤Ę¤ëĄŁ\n"
+
+#: info/infodoc.c:60
+#, fuzzy
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Áę¸ßť˛žČ¤ňĂŠ¤ëĄŁť˛žČĚž¤ňĆɤߟč¤ëĄŁ\n"
+
+#: info/infodoc.c:61
+#, fuzzy
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr " %-10s ¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ÇşÇ¸ĺ¤Ë¸Ť¤żĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:62
+#, fuzzy
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉĆâ¤ÎźĄ¤ÎĽĎĽ¤ĽŃĄźĽęĽóĽŻ¤ŘĽšĽ­ĽĂĽ×¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:63
+#, fuzzy
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉĆâ¤ÎźĄ¤ÎĽĎĽ¤ĽŃĄźĽęĽóĽŻ¤ŘĽšĽ­ĽĂĽ×¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:64
+#, fuzzy
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr " %-10s ĽŤĄźĽ˝Ľë°ĚĂ֤μϼ¤ĽŃĄźĽęĽóĽŻ¤ňĂŠ¤ëĄŁ\n"
+
+#: info/infodoc.c:65
+#, fuzzy
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr " %-10s `ĽÇĽŁĽěĽŻĽČĽę' ĽÎĄźĽÉ¤Ř°ÜĆ°ĄŁ`g (DIR)' ¤ČĆą¤¸ĄŁ\n"
+
+#: info/infodoc.c:66
+#, fuzzy
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr " %-10s Top ĽÎĄźĽÉ¤Ř°ÜĆ°ĄŁ`g Top' ¤ČĆą¤¸ĄŁ\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+#, fuzzy
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr "ĽÎĄźĽÉĆâ¤Ç¤Î°ÜĆ°:\n"
+
+#: info/infodoc.c:70
+#, fuzzy
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr " %-10s ¸˝şß¤ÎĽÎĄźĽÉ¤ÎŔčĆŹ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:71
+#, fuzzy
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr " %-10s ¸˝şß¤ÎĽÎĄźĽÉ¤ÎŔčĆŹ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr " %-10s 1 šÔĘŹÁ°Ęý¤Ř¤š¤š¤á¤ëĄŁ\n"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr " %-10s 1 šÔĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+
+#: info/infodoc.c:74
+#, fuzzy
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr " %-10s 1 ĽÚĄźĽ¸ĘŹÁ°Ęý¤ŘżĘ¤á¤ëĄŁ\n"
+
+#: info/infodoc.c:75
+#, fuzzy
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr " %-10s 1 ĽÚĄźĽ¸ĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+#, fuzzy
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr "¤˝¤Îž¤ÎĽłĽŢĽóĽÉ:\n"
+
+#: info/infodoc.c:79
+#, fuzzy
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s ĽÎĄźĽÉĽáĽËĽĺĄź¤ÎşÇ˝é¤Ť¤é 9 ČÖĚÜËř¤ÎĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:80
+#, fuzzy
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr " %-10s ĽÎĄźĽÉĽáĽËĽĺĄź¤ÎşÇ¸ĺ¤ÎĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:81
+#, fuzzy
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " şÇ˝é¤Ë¸Ť¤Ä¤Ť¤Ă¤żšŕĚܤŹť˛žČ¤ˇ¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:83
+#, fuzzy
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" (ĽŐĽĄĽ¤ĽëĚž)ĽÎĄźĽÉĚž ¤ÎÍͤ˥˘ĽŐĽĄĽ¤ĽëĚž¤ň´Ţ¤á¤ë¤ł¤Č¤Ź¤Ç¤­¤Ţ"
+"¤šĄŁ\n"
+
+#: info/infodoc.c:85
+#, fuzzy
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr " ¸Ť¤Ä¤Ť¤Ă¤ż¤â¤Î¤Ź´Ţ¤Ţ¤ě¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:87
+#, fuzzy
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr " ¸Ť¤Ä¤Ť¤Ă¤ż¤â¤Î¤Ź´Ţ¤Ţ¤ě¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s ¤ł¤ÎĽŘĽëĽ×¤ň˝ŞÎť¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Info ¤â°ě˝ď¤Ë˝ŞÎť¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Info ĽÁĽĺĄźĽČĽęĽ˘Ľë¤ňľŻĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉ¤Î `źĄ' ¤ÎĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉ¤Î `Á°' ¤ÎĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉ¤Ť¤é `žĺ' ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s ĚžÁ°¤ÇťŘÄꤡ¤żĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" ĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ÎÁŞÂň¤ÇĄ˘Âž¤ÎĽÎĄźĽÉ¤ŹÁŞÂň¤ľ¤ě¤ëťö¤Ë¤Ę¤ëĄŁ\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Áę¸ßť˛žČ¤ňĂŠ¤ëĄŁť˛žČĚž¤ňĆɤߟč¤ëĄŁ\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s ¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ÇşÇ¸ĺ¤Ë¸Ť¤żĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s ¤ł¤ÎĽÎĄźĽÉĆâ¤ÎźĄ¤ÎĽĎĽ¤ĽŃĄźĽęĽóĽŻ¤ŘĽšĽ­ĽĂĽ×¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s ĽŤĄźĽ˝Ľë°ĚĂ֤μϼ¤ĽŃĄźĽęĽóĽŻ¤ňĂŠ¤ëĄŁ\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s `ĽÇĽŁĽěĽŻĽČĽę' ĽÎĄźĽÉ¤Ř°ÜĆ°ĄŁ`g (DIR)' ¤ČĆą¤¸ĄŁ\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Top ĽÎĄźĽÉ¤Ř°ÜĆ°ĄŁ`g Top' ¤ČĆą¤¸ĄŁ\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s 1 ĽÚĄźĽ¸ĘŹÁ°Ęý¤ŘżĘ¤á¤ëĄŁ\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s 1 ĽÚĄźĽ¸ĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s ¸˝şß¤ÎĽÎĄźĽÉ¤ÎŔčĆŹ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s ¸˝şß¤ÎĽÎĄźĽÉ¤ÎŔčĆŹ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s 1 šÔĘŹÁ°Ęý¤Ř¤š¤š¤á¤ëĄŁ\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s 1 šÔĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s ĽÎĄźĽÉĽáĽËĽĺĄź¤ÎşÇ˝é¤Ť¤é 9 ČÖĚÜËř¤ÎĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s ĽÎĄźĽÉĽáĽËĽĺĄź¤ÎşÇ¸ĺ¤ÎĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s ¸˝şß¤Î Info ĽŐĽĄĽ¤Ľë¤ÎĽ¤ĽóĽÇĽĂĽŻĽššŕĚܤǥ˘Ę¸ťúÎó¤ňťŘÄꤡ¤Ć¸Ąş÷¤ˇĄ˘\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " şÇ˝é¤Ë¸Ť¤Ä¤Ť¤Ă¤żšŕĚܤŹť˛žČ¤ˇ¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s ĚžÁ°¤ÇťŘÄꤾ¤ě¤żĽÎĄźĽÉ¤Ë°ÜĆ°¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" (ĽŐĽĄĽ¤ĽëĚž)ĽÎĄźĽÉĚž ¤ÎÍͤ˥˘ĽŐĽĄĽ¤ĽëĚž¤ň´Ţ¤á¤ë¤ł¤Č¤Ź¤Ç¤­¤Ţ"
+"¤šĄŁ\n"
+
+#: info/infodoc.c:133
+#, fuzzy, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s ¸˝şß¤Î Info ĽŐĽĄĽ¤ĽëÁ´ÂΤňĄ˘ťŘÄꤾ¤ě¤żĘ¸ťúÎó¤ÇÁ°Ęý¸Ąş÷¤ˇĄ˘\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " ¸Ť¤Ä¤Ť¤Ă¤ż¤â¤Î¤Ź´Ţ¤Ţ¤ě¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#: info/infodoc.c:135
+#, fuzzy, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr "\\\\ %-10s ¸˝şß¤Î Info ĽŐĽĄĽ¤Ľë¤ňĄ˘ťŘÄꤾ¤ě¤żĘ¸ťúÎó¤Ç¸ĺĘý¸Ąş÷¤ˇĄ˘\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "¸˝şß¤Î¸Ąş÷ĽŃĽš:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr "Info ĽŚĽŁĽóĽÉĽŚ¤ÇÍřÍѲÄÇ˝¤ĘĽłĽŢĽóĽÉ:\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr "Ľ¨ĽłĄźÎΰč¤ÇÍřÍѲÄÇ˝¤ĘĽłĽŢĽóĽÉ:\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"°Ę˛ź¤ÎĽłĽŢĽóĽÉ¤ĎĄ˘%s ¤ňÄ̤¸¤Ć¤Î¤ßľŻĆ°¤Ç¤­¤Ţ¤š:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"°Ę˛ź¤ÎĽłĽŢĽóĽÉ¤ĎĄ˘Á´¤ŻľŻĆ°¤š¤ëťö¤Ź¤Ç¤­¤Ţ¤ť¤ó:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- ˝ŞÎť¤š¤ë¤Ë¤Ď `\\[history-node]' ¤Ť `\\[kill-node]' ¤ňťČ¤Ă¤Ć¤Ż¤Ŕ¤ľ¤¤ ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "ťČ¤¤Ęý¤ňÉ˝ź¨¤š¤ë"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "`(info)Help' ĽÎĄźĽÉ¤Ë°ÜĆ°¤š¤ë"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Ľ­ĄźÁŕşî¤ňÉ˝ź¨¤š¤ë"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Ľ­Ąź¤ÎŔâĚŔ: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s ¤ĎÄęľÁ¤ľ¤ě¤Ć¤¤¤Ţ¤ť¤óĄŁ"
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s ¤ĎÄęľÁ¤ľ¤ě¤Ć¤¤¤Ţ¤ť¤ó"
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s ¤Ď %s ¤ËÄęľÁ¤ľ¤ě¤Ć¤¤¤Ţ¤šĄŁ"
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Íż¤¨¤é¤ě¤żĽłĽŢĽóĽÉ¤ňźÂšÔ¤š¤ë¤Î¤ËĄ˘˛ż¤ňĽżĽ¤Ľ×¤š¤ë¤Ť¤ňÉ˝ź¨¤š¤ë"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "¤É¤ÎĽłĽŢĽóĽÉ: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' ¤ĎĽ­Ąźłä¤ęĹö¤Ć¤ľ¤ě¤Ć¤¤¤Ţ¤ť¤ó"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s ¤Ď %s ¤ňÄ̤¸¤Ć¤Î¤ß¸Ć¤Ó˝Đ¤ť¤Ţ¤šĄŁ"
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s ¤Ď %s ¤ňÄ̤¸¤Ć¸Ć¤Ó˝Đ¤ť¤Ţ¤š"
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "`%s' ¤Č¤¤¤ŚľĄÇ˝¤Ď¤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+"\n"
+"ĚőĂí: Čóžď¤Ë˝ĹÍפĘʸžĎ¤Î¤ż¤áĄ˘¸śĘ¸¤ňťÄ¤ˇ¤Ć¤¤¤Ţ¤šĄŁ\n"
+" -- ť˛šÍĚő\n"
+"°ěŔÚ¤ÎĘݞڤϤ˘¤ę¤Ţ¤ť¤óĄŁ¤˘¤Ę¤ż¤ĎĄ˘GNU General Public Licence ¤Îʸ¸Ŕ¤Î˛ź¤ÇĄ˘\n"
+"¤ł¤ÎĽ˝ĽŐĽČĽŚĽ§Ľ˘¤ňşĆÇŰÉۤǤ­¤Ţ¤šĄŁ¤ł¤ě¤é¤Ë¤Ä¤¤¤Ć¤Î¤č¤ęžÜ¤ˇ¤¤ŔâĚŔ¤ĎĄ˘COPYING\n"
+"¤Č¤¤¤ŚĽŐĽĄĽ¤Ľë¤ň¸Ť¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "°úżô¤Îżôťú¤Ź´Ö°ă¤Ă¤Ć¤¤¤Ţ¤š"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "ĆţÎĎĽŐĽĄĽ¤Ľë `%s' ¤ňłŤ¤ą¤Ţ¤ť¤ó"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "˝ĐÎĎĽŐĽĄĽ¤Ľë `%s' ¤ňşîŔŽ¤Ç¤­¤Ţ¤ť¤ó"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "`%s' ¤Ř¤Î˝ń¤­šţ¤ßĂć¤ÎĽ¨ĽéĄź"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "˝ĐÎĎĽŐĽĄĽ¤Ľë `%s' ¤ňĘĤ¸¤ëşÝ¤ÎĽ¨ĽéĄź"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "Ľ­ĄźĆţÎĎÎó¤ŹÄš¤š¤Ž¤Ţ¤š"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "Ľ­ĄźĆţÎĎÎó¤ňˇç¤¤¤Ć¤¤¤Ţ¤š"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL ʸťú (\\000) ¤ĎťČ¤¨¤Ţ¤ť¤ó"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL ʸťú (^%c) ¤ĎťČ¤¨¤Ţ¤ť¤ó"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "Ľ˘ĽŻĽˇĽçĽóĚž¤ňˇç¤¤¤Ć¤¤¤Ţ¤š"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "ĽťĽŻĽˇĽçĽó¤ŹÄš¤š¤Ž¤Ţ¤š"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "ÉÔĚŔ¤ĘĽ˘ĽŻĽˇĽçĽó `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "Ľ˘ĽŻĽˇĽçĽóĚž¤ŹÄš¤š¤Ž¤Ţ¤š"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "Ľ˘ĽŻĽˇĽçĽó `%s' ¤Ë͞ʏ¤Ęʸťú¤ŹÂł¤¤¤Ć¤¤¤Ţ¤š"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "ĘŃżôĚž¤ňˇç¤¤¤Ć¤¤¤Ţ¤š"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "ĘŃżôĚž¤ÎÄž¸ĺ¤Î `=' ¤ňˇç¤¤¤Ć¤¤¤Ţ¤š"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "ĘŃżôĚž¤ŹÄš¤š¤Ž¤Ţ¤š"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "ĂͤŹÄš¤š¤Ž¤Ţ¤š"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", %u šÔĚÜ: "
+
+#: info/infokey.c:906
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"ťČ¤¤Ęý: %s [ĽŞĽ×ĽˇĽçĽó]... [ĆţÎĎĽŐĽĄĽ¤Ľë]\n"
+"\n"
+"ĽŞĽ×ĽˇĽçĽó:\n"
+" --output FILENAME ˝ĐÎĎŔč¤ň $HOME/.info ¤ÎÂĺ¤ę¤Ë FILENAME ¤Č¤š"
+"¤ë\n"
+" --help ¤ł¤ÎĽŘĽëĽ×¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ë\n"
+" --version ĽĐĄźĽ¸ĽçĽóžđĘó¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ë\n"
+"\n"
+"infokey Ľ˝ĄźĽšĽŐĽĄĽ¤Ľë¤ňĽłĽóĽŃĽ¤Ľë¤ˇ¤Ć infokey ĽŐĽĄĽ¤Ľë¤ň˝ĐÎϤš¤ëĄŁ\n"
+"ĆţÎĎĽŐĽĄĽ¤Ľë(ĽÇĽŐĽŠĽëĽČ: $HOME/.infokey) ¤ňĆɤߟč¤Ă¤ĆĄ˘\n"
+"ĽłĽóĽŃĽ¤ĽëşŃĽ­ĄźĽŐĽĄĽ¤Ľë $HOME/.info ¤Ë˝ń¤­šţ¤ŕĄŁ\n"
+"\n"
+"ĽĐĽ°ĽěĽÝĄźĽČ¤Ď bug-texinfo@gnu.org ¤ŘĄ˘\n"
+"°ěČĚĹŞ¤ĘźÁĚä¤äľÄĎŔ¤Ď help-texinfo@gnu.org ¤ŘĄŁ\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "ÉÔĹŹŔÚ¤Ę infokey ĽŐĽĄĽ¤Ľë `%s' ¤ňĚľťë¤ˇ¤Ţ¤š - žŽ¤ľ¤š¤Ž¤Ţ¤š"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "ÉÔĹŹŔÚ¤Ę infokey ĽŐĽĄĽ¤Ľë `%s' ¤ňĚľťë¤ˇ¤Ţ¤š - Â礭¤š¤Ž¤Ţ¤š"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "infokey ĽŐĽĄĽ¤Ľë `%s' ĆÉšţ¤ßĂć¤ÎĽ¨ĽéĄź -- Á´¤ĆĆÉšţ¤á¤Ţ¤ť¤ó¤Ç¤ˇ¤ż"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"infokey ĽŐĽĄĽ¤Ľë `%s' ¤ŹÉÔĹŹŔÚ (ĽŢĽ¸ĽĂĽŻČ֚椏°ă¤Ś) ¤Ç¤š -- infokey ¤ňźÂšÔ¤ˇ"
+"¤Ćššżˇ¤ˇ¤Ţ¤ˇ¤ç¤Ś"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+"¤˘¤Ę¤ż¤Î infokey ĽŐĽĄĽ¤Ľë `%s' ¤Ď¸Ĺ¤¤¤Ç¤š -- infokey ¤ňźÂšÔ¤ˇ¤Ćššżˇ¤ˇ¤Ţ¤ˇ¤ç¤Ś"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"infokey ĽŐĽĄĽ¤Ľë `%s' ¤ŹÉÔĹŹŔڤǤš (ĽťĽŻĽˇĽçĽóÄš¤ŹÉÔŔľ¤Ç¤š) -- infokey ¤ňźÂšÔ"
+"¤ˇ¤Ćššżˇ¤ˇ¤Ţ¤ˇ¤ç¤Ś"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"infokey ĽŐĽĄĽ¤Ľë `%s' ¤ŹÉÔĹŹŔڤǤš (ĽťĽŻĽˇĽçĽóĽłĄźĽÉ¤ŹÉÔŔľ¤Ç¤š) -- infokey ¤ň"
+"źÂšÔ¤ˇ¤Ćššżˇ¤ˇ¤Ţ¤ˇ¤ç¤Ś"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+"infokey ĽŐĽĄĽ¤Ľë¤ËÉÔŔľ¤ĘĽÇĄźĽż¤Ź¤˘¤ę¤Ţ¤š -- ´ö¤Ä¤Ť¤ÎĽ­ĄźĽĐĽ¤ĽóĽÉ¤ŹĚľťë¤ľ¤ě¤Ţ"
+"¤ˇ¤ż"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"infokey ĽŐĽĄĽ¤Ľë¤ËÉÔŔľ¤ĘĽÇĄźĽż¤Ź¤˘¤ę¤Ţ¤š -- ´ö¤Ä¤Ť¤ÎĘŃżôŔßÄꤏ̾ťë¤ľ¤ě¤Ţ¤ˇ¤ż"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Info ĽłĽŢĽóĽÉĚž¤Č¤˝¤ÎŔâĚŔ¤ňĆɤŕ"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "ŔâĚŔ¤š¤ëĽłĽŢĽóĽÉ: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Ľ¨ĽłĄźÎΰč¤ÇĽłĽŢĽóĽÉĚž¤ňĆɤߥ˘źÂšÔ¤š¤ë"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "¤ł¤ł¤Ç¤Ď `echo-area' ĽłĽŢĽóĽÉ¤ňźÂšÔ¤Ç¤­¤Ţ¤ť¤óĄŁ"
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "ĂΤé¤Ę¤¤ĽłĽŢĽóĽÉ `%s'"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "É˝ź¨¤ľ¤ě¤ëĽŚĽŁĽóĽÉĽŚ¤Îšâ¤ľ¤ňŔßÄę"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "ĽšĽŻĽęĄźĽó¤Îšâ¤ľ¤ňĽťĽĂĽČ (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" ¤ł¤ÎĽŐĽĄĽ¤Ľë¤ňşî¤ë¸ľ¤Ë¤Ę¤Ă¤żĽŐĽĄĽ¤Ľë:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "ĽŐĽĄĽ¤Ľë %s ¤ňžĺźę¤Ż˝čÍý¤Ç¤­¤Ţ¤ť¤óĄŁ\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* ĽáĽËĽĺĄź:\n"
+" (ĽŐĽĄĽ¤Ľë)ĽÎĄźĽÉ šÔżô ĽľĽ¤Ľş ´Ţ¤Ţ¤ě¤ëĽŐĽĄĽ¤Ľë\n"
+" ---------------- ----- ---- ----------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"¤ł¤ł¤ĎĄ˘¤˘¤Ę¤ż¤ŹşÇśáËŹ¤ě¤żĽÎĄźĽÉ¤ÎĽáĽËĽĺĄź¤Ç¤šĄŁ\n"
+"ĽáĽËĽĺĄź¤Ť¤é°ě¤ÄÁޤ֤ŤĄ˘Âž¤ÎĽŚĽŁĽóĽÉĽŚ¤Ç `\\[history-node]' ¤ňťČ¤Ă¤Ć¤Ż¤Ŕ¤ľ"
+"¤¤ĄŁ\n"
+"\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "şÇśáËŹ¤ě¤żĽÎĄźĽÉÁ´¤Ć¤ÎĽáĽËĽĺĄź¤ň´Ţ¤ó¤Ç¤¤¤ëĽŚĽŁĽóĽÉĽŚ¤ňşîŔŽ"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "É˝ź¨¤ľ¤ě¤Ć¤¤¤ëĽŚĽŁĽóĽÉĽŚĆâ¤ÎĄ˘°ĘÁ°ËŹ¤ě¤żťö¤Î¤˘¤ëĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "ËŹ¤ě¤żĽÎĄźĽÉ¤ňÁŞÂň: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "¤˝¤Îť˛žČ¤ĎžĂ¤¨¤Ţ¤ˇ¤ż! (%s)ĄŁ"
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Info ĽĐĄźĽ¸ĽçĽó %s ¤Ë¤č¤Ś¤ł¤˝ĄŁ\\[get-help-window] ¤ÇťČ¤¤ĘýĄ˘\\[menu-item] ¤Ç"
+"ĽáĽËĽĺĄźšŕĚܤň¸Ć¤Ó˝Đ¤ť¤Ţ¤šĄŁ"
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "źĄ¤ÎšÔ¤Ë°ÜĆ°"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Á°¤ÎšÔ¤Ë°ÜĆ°"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "šÔËö¤Ë°ÜĆ°"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "šÔĆŹ¤Ë°ÜĆ°"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "źĄ"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "źĄ ¤ÎĽÎĄźĽÉ¤ňĂŠ¤Ă¤Ć¤¤¤Ţ¤š..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "şÇ˝é¤ÎĽáĽËĽĺĄźšŕĚܤňÁŞÂň..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "źĄ ¤ÎĽÎĄźĽÉ¤ňÁŞÂň..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "%d ˛ó žĺ ¤Ë°ÜĆ°¤ˇĄ˘¤˝¤ł¤Ç źĄ ¤ŘĄŁ"
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "¤ł¤ÎĽÉĽ­ĽĺĽáĽóĽČ¤Ë¤ĎĄ˘¤ł¤ě°Ęžĺ¤ÎĽÎĄźĽÉ¤Ď¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤Î `Á°' ¤Ď¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤Î Á° ¤Ë°ÜĆ°¤ˇ¤Ţ¤šĄŁ"
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "¤ł¤ÎĽÉĽ­ĽĺĽáĽóĽČ¤Ç¤ĎĄ˘¤ł¤ÎĽÎĄźĽÉ¤Î `Á°' ¤ä `žĺ' ¤Ď¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤Î žĺ ¤Ë°ÜĆ°¤ˇ¤Ţ¤šĄŁ"
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "`Á°' ¤ÎşÇ¸ĺ¤ÎĽáĽËĽĺĄźšŕĚܤ˰ÜĆ°¤ˇ¤Ţ¤šĄŁ"
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "ĽÎĄźĽÉš˝Â¤¤ňÄ̤¸¤ĆżĘ¤á¤ż¤ę˛ź¤Ź¤Ă¤ż¤ę¤š¤ë"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "ĽÎĄźĽÉš˝Â¤¤ňÄ̤¸¤ĆĚá¤Ă¤ż¤ęžĺ¤Ź¤Ă¤ż¤ę¤š¤ë"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽšĽŻĽíĄźĽëĽŔĽŚĽó"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽšĽŻĽíĄźĽë¤ˇĄ˘ĽÇĽŐĽŠĽëĽČĽŚĽŁĽóĽÉĽŚĽľĽ¤Ľş¤ňŔßÄę"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽÎĄźĽÉČĎ°ĎĆâ¤ÇÁ°ĘýĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽÎĄźĽÉČĎ°ĎĆâ¤ÇÁ°ĘýĽšĽŻĽíĄźĽë¤ˇĄ˘ĽÇĽŐĽŠĽëĽČĽŚĽŁĽóĽÉĽŚĽľĽ¤Ľş¤ň"
+"ŔßÄę"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňľŐĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňľŐĽšĽŻĽíĄźĽë¤ˇĄ˘ĽÇĽŐĽŠĽëĽČĽŚĽŁĽóĽÉĽŚĽľĽ¤Ľş¤ňŔßÄę"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽÎĄźĽÉČĎ°ĎĆâ¤Ç¸ĺĘýĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽÎĄźĽÉČĎ°ĎĆâ¤Ç¸ĺĘýĽšĽŻĽíĄźĽë¤ˇĄ˘ĽÇĽŐĽŠĽëĽČĽŚĽŁĽóĽÉĽŚĽľĽ¤Ľş¤ň"
+"ŔßÄę"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ÎşÇ˝é¤Ë°ÜĆ°"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ÎşÇ¸ĺ¤Ë°ÜĆ°"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "šÔżô¤Ë¤č¤ëĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "šÔżô¤Ë¤č¤ëľŐĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "˛čĚĚĽľĽ¤Ľş¤ÎȞʏĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "˛čĚĚĽľĽ¤Ľş¤ÎȞʏľŐĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "źĄ¤ÎĽŚĽŁĽóĽÉĽŚ¤ňÁŞÂň"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Á°¤ÎĽŚĽŁĽóĽÉĽŚ¤ňÁŞÂň"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "¸˝şß¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĘŹłä"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "¸˝şß¤ÎĽŚĽŁĽóĽÉĽŚ¤ňşď˝ü"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "ąĘľ×ĽŚĽŁĽóĽÉĽŚ¤Ďşď˝ü¤Ç¤­¤Ţ¤ť¤ó"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "ž¤ÎĽŚĽŁĽóĽÉĽŚ¤ňşď˝ü"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "ž¤ÎĽŚĽŁĽóĽÉĽŚ¤ňĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "ž¤ÎĽŚĽŁĽóĽÉĽŚ¤ňľŐĽšĽŻĽíĄźĽë"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ňÂ礭¤Ż¤š¤ë(¤Ţ¤ż¤ĎžŽ¤ľ¤Ż¤š¤ë)"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "˛ÄťëĽŚĽŁĽóĽÉĽŚ¤ÎÍřÍѲÄÇ˝ĽšĽŻĽęĄźĽóśő´Ö¤ňĘŹłä¤š¤ë"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "¸˝şß¤ÎĽŚĽŁĽóĽÉĽŚ¤ËśŘ§˝čÍý¤ňťÜ¤š"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "źĄ ĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Á° ĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "žĺ ĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "¤ł¤ÎĽŐĽĄĽ¤Ľë¤ÎşÇ¸ĺ¤ÎĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤Ë¤ĎĽÎĄźĽÉ¤ŹÉŐ¤¤¤Ć¤¤¤Ţ¤ť¤ó"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "¤ł¤ÎĽŐĽĄĽ¤Ľë¤ÎşÇ˝é¤ÎĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ÎĽáĽËĽĺĄźĆâ¤Ç¤ÎşÇ¸ĺ¤ÎšŕĚܤňÁŞÂň"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "¤ł¤ÎĽáĽËĽĺĄźšŕĚܤňÁŞÂň"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "¤ł¤ÎĽáĽËĽĺĄź¤Ë %d ¸Ä¤ÎšŕĚܤŹ¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "ĽáĽËĽĺĄźšŕĚÜ (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "ĽáĽËĽĺĄźšŕĚÜ: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "ť˛žČŔč (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "ť˛žČŔč: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "ĽáĽËĽĺĄź¤ňĆɤó¤ÇĄ˘¤˝¤ÎĽÎĄźĽÉ¤ňÁŞÂň¤š¤ë"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "ľÓĂí¤äÁę¸ßť˛žČ¤ňĆɤó¤ÇĄ˘¤˝¤ÎĽÎĄźĽÉ¤ňÁŞÂň¤š¤ë"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "¤ł¤ÎĽÎĄźĽÉĽáĽËĽĺĄź¤ÎŔčĆŹ¤Ë°ÜĆ°¤š¤ë"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "˛ÄÇ˝¤Ę¸Â¤ęÂż¤Ż¤ÎĽáĽËĽĺĄźšŕĚܤذěĹ٤ËËŹ¤ě¤ë"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "ĽÎĄźĽÉĚž¤ňĆɤó¤ÇĄ˘ÁŞÂň¤š¤ë"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "ĽÎĄźĽÉ¤Ř°ÜĆ°: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "ĽÎĄźĽÉ `%s' ¤ËĽáĽËĽĺĄź¤Ź¤˘¤ę¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "ĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ `%s' ¤ĎĽÎĄźĽÉ `%s' Ăć¤Ë¤Ď¤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "`%s' ¤Ť¤éť˛žČ¤ľ¤ě¤Ć¤¤¤ëĽÎĄźĽÉ¤ň¸Ť¤Ä¤ą¤é¤ě¤Ţ¤ť¤ó(`%s' Ăć)"
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "dir ¤Ť¤éĽáĽËĽĺĄźłŤťĎĽęĽšĽČ¤ňĆɤߥ˘¤˝¤ě¤ňĂŠ¤ë"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "ĽáĽËĽĺĄź¤ËÂł¤Ż: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Ľ×ĽíĽ°ĽéĽŕľŻĆ°¤Ë´Ř¤š¤ëŔâĚŔ¤ÎĽÎĄźĽÉ¤ň¸Ť¤Ä¤ą¤ë"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "[%s] ¤ÎľŻĆ°ĽÎĄźĽÉ¤ň¸Ť¤Ä¤ą¤ë: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "man ĽÚĄźĽ¸¤Ř¤Îť˛žČ¤ňĆɤó¤ÇĄ˘ÁŞÂň¤š¤ë"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Man ĽÚĄźĽ¸¤ňÉ˝ź¨: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "¤ł¤ÎĽŐĽĄĽ¤Ľë¤Î `ŔčĆŹ' ĽÎĄźĽÉ¤ňÁŞÂň"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "`(dir)'ĽÎĄźĽÉ¤ňÁŞÂň¤š¤ë"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "ĽÎĄźĽÉ¤ÎŔÚ¤ęźč¤ę (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "`%s' ĽÎĄźĽÉ¤ňŔÚ¤ęźč¤ě¤Ţ¤ť¤ó"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "şÇ¸ĺ¤ÎĽÎĄźĽÉ¤ĎŔÚ¤ęźč¤ě¤Ţ¤ť¤ó"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "şÇ¸ĺ¤ËÁŞÂň¤ľ¤ě¤żĽÎĄźĽÉ¤ňÁŞÂň¤š¤ë"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "¤ł¤ÎĽÎĄźĽÉ¤ňŔÚ¤ęźč¤ë"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "ĽŐĽĄĽ¤ĽëĚž¤ňĆɤó¤ÇÁŞÂň¤š¤ë"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "ĽŐĽĄĽ¤Ľë¤ň¸Ť¤Ä¤ą¤ë: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "`%s' ¤ň¸Ť¤Ä¤ą¤é¤ě¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "˝ĐÎĎĽŐĽĄĽ¤Ľë `%s' ¤ňşîŔŽ¤Ç¤­¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "´°ÎťĄŁ"
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "ĽÎĄźĽÉ %s ¤Î˝ń¤­šţ¤ß..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "INFO_PRINT_COMMAND ¤Ë¤č¤Ă¤Ć¤ł¤ÎĽÎĄźĽÉ¤ÎĆâÍƤňĽŃĽ¤Ľ×¤š¤ë"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "`%s' ¤Ř¤ÎĽŃĽ¤Ľ×¤ňłŤ¤ą¤Ţ¤ť¤óĄŁ"
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "ĽÎĄźĽÉ `%s' ¤ň°őşţ..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "ÉűĽŐĽĄĽ¤Ľë %s ¤ňĂľ¤ˇ¤Ć¤¤¤Ţ¤š ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "ʸťúÎó¤ňĆɤߥ˘ÂçʸťúžŽĘ¸ťú¤ÎśčĘ̤ň¤Ä¤ą¤Ć¸Ąş÷¤š¤ë"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "ʸťúÎó¤ňĆɤó¤Ç¸Ąş÷¤š¤ë"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "ʸťúÎó¤ňĆɤó¤Ç¸ĺĘý¸Ąş÷¤š¤ë"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "ʸťúÎó¤Ř¤Î%s%s [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "¸ĺĘý¸Ąş÷"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "¸Ąş÷"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr "(ÂçʸťúžŽĘ¸ťú¤ÎśčĘ̤ň¤Ä¤ą¤Ć) "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "¸Ąş÷¤ËźşÇÔĄŁ"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Ćą°ěĘý¸ţ¤ÇşÇ¸ĺ¤Î¸Ąş÷¤ňˇŤ¤ęĘÖ¤š"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Á°¤Î¸Ąş÷ʸťúÎ󤏤˘¤ę¤Ţ¤ť¤ó"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "ľŐĘý¸ţ¤ÇşÇ¸ĺ¤Î¸Ąş÷¤ňˇŤ¤ęĘÖ¤š"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "ĆţÎϤˇ¤żĘ¸ťúÎó¤ÎÂĐĎĂĹŞ¤Ę¸Ąş÷"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "Ă༡¸ĺĘý¸Ąş÷: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "Ă༡¸Ąş÷: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "źşÇÔ "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Á°¤ÎÁę¸ßť˛žČ¤Ë°ÜĆ°"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "źĄ¤ÎÁę¸ßť˛žČ¤Ë°ÜĆ°"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "ť˛žČ¤Ţ¤ż¤ĎĄ˘¤ł¤ÎšÔ¤Ë¸˝¤ě¤żĽáĽËĽĺĄźšŕĚܤňÁŞÂň"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "¸˝şß¤ÎÁŕşî¤ňĂćťß"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "ťß¤á¤Ţ¤ˇ¤ż"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "ĽŚĽŁĽóĽÉĽŚ¤ÎťŘÄęšÔ¤ËĽŤĄźĽ˝Ľë¤ň°ÜĆ°"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "˛čĚ̤κĆÉÁ˛č"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Info ¤ÎťČÍѤň˝ŞÎť"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "¤ł¤ÎĽ­Ąź¤ÎžŽĘ¸ťú¤ËĽĐĽ¤ĽóĽÉ¤ľ¤ě¤żĽłĽŢĽóĽÉ¤ňźÂšÔ"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "ÉÔĚŔ¤ĘĽłĽŢĽóĽÉ (%s) ¤Ç¤šĄŁ"
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" ¤ĎĚľ¸ú¤Ç¤š"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" ¤ĎĚľ¸ú¤Ç¤š"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "¸˝şß¤ÎżôĂÍ°úżô¤Ë¤ł¤ÎżôĂͤň˛Ă¤¨¤ë"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "¸˝şß¤ÎżôĂÍ°úżô¤ňłŤťĎ(Ëô¤Ď 4 Çܤš¤ë)"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "ĆâÉôĹŞ¤Ë \\[universal-argument] ¤Ë¤č¤Ă¤ĆÍřÍѤľ¤ě¤Ţ¤š"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: ˛žÁŰĽáĽâĽę¤ňťČ¤¤˛Ě¤ż¤ˇ¤Ţ¤ˇ¤ż!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "\"On\" ¤ÎťţĄ˘ľÓĂí¤ňźŤĆ°ĹޤËÉ˝ź¨¤ˇĄ˘žĂľî¤š¤ë"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr "\"On\" ¤ÎťţĄ˘ĽŚĽŁĽóĽÉĽŚ¤ÎşîŔŽĄŚşď˝ü¤ÇĄ˘Âž¤ÎĽŚĽŁĽóĽÉĽŚ¤ÎĽľĽ¤Ľş¤ňĘŃšš"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "\"On\" ¤ÎťţĄ˘ĽŮĽë¤ň¤Ę¤é¤šÂĺ¤ď¤ę¤ËĄ˘˛čĚ̤ňĽŐĽéĽĂĽˇĽĺ¤ľ¤ť¤ë"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "\"On\" ¤Î¤Č¤­Ą˘Ľ¨ĽéĄź¤ŹČŻŔ¸¤ˇ¤ż¤éĽŮĽë¤ňĚĤ餚"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "\"On\" ¤Î¤Č¤­Ą˘Č󰾽̼ռĄĽ¤Ľë¤ňĽŹĄźĽŮĽ¸ĽłĽěĽŻĽČ¤š¤ë"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "\"On\" ¤ÎťţĄ˘¸Ąş÷ʸťúÎó¤Č°ěĂפˇ¤żžě˝ę¤ňȿŞɽź¨¤ľ¤ť¤ë"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "şÇ¸ĺ¤ÎĽÎĄźĽÉ¤Ë¤Ş¤¤¤ĆĄ˘ĽšĽŻĽíĄźĽë¤ňšÔ¤Ę¤Ă¤ż¤Č¤­¤ËĆ°şî¤ňÄ´Ŕá"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "ĽŤĄźĽ˝Ľë¤ňĽŚĽŁĽóĽÉĽŚ¤Îł°¤ËĆ°¤Ť¤˝¤Ś¤Č¤ˇ¤żťţ¤ÎĽšĽŻĽíĄźĽëšÔżô"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "\"On\" ¤ÎťţĄ˘Info ¤Ď ISO Latin ʸťú¤ÎÉ˝ź¨¤Ź˛ÄÇ˝¤Ë¤Ę¤ë"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "ĘŃżô¤ÎťČ¤¤Ęý¤ň˛ňŔ⤚¤ë"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "ĘŃżô¤ÎŔâĚŔ: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Info ĘŃżô¤ÎĂͤňŔßÄę"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "ĘŃżô¤ňŔßÄę: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "%s ¤ËĂͤňŔßÄę (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "%s ¤ËĂͤňŔßÄę (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** ľěź°¤ÎĽżĽ° ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), šÔżô ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d šÔ --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d šÔ --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " ÉűĽŐĽĄĽ¤Ľë: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: ĽŞĽ×ĽˇĽçĽó `%s' ¤ĎŰŁËć¤Ç¤š\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: ĽŞĽ×ĽˇĽçĽó `--%s' ¤Ď°úżô¤ŹÉÔÍפǤš\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: ĽŞĽ×ĽˇĽçĽó `%c%s' ¤Ď°úżô¤ŹÉÔÍפǤš\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: ĽŞĽ×ĽˇĽçĽó `%s' ¤Ë¤ĎĄ˘°úżô¤ŹÉŹÍפǤš\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: `--%s' ¤Ďǧźą¤Ç¤­¤Ę¤¤ĽŞĽ×ĽˇĽçĽó¤Ç¤š\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: `%c%s' ¤Ďǧźą¤Ç¤­¤Ę¤¤ĽŞĽ×ĽˇĽçĽó¤Ç¤š\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ÉÔŔľ¤ĘĽŞĽ×ĽˇĽçĽó -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: Ěľ¸ú¤ĘĽŞĽ×ĽˇĽçĽó -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: ĽŞĽ×ĽˇĽçĽó¤Ď°úżô¤ňÍ׾ᤡ¤Ţ¤š -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: `-W %s' ĽŞĽ×ĽˇĽçĽó¤ŹŰŁËć¤Ç¤š\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: `-W %s' ĽŞĽ×ĽˇĽçĽó¤Ë¤Ď°úżô¤ŹÉÔÍפǤš\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "%c%s ¤ËÂФš¤ëÉÔŔľ¤Ę°úżô"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "°ěˇî"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "Ćóˇî"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "ť°ˇî"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "ťÍˇî"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "¸Ţˇî"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "Ďťˇî"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "źˇˇî"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "ČŹˇî"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "śĺˇî"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "˝˝ˇî"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "˝˝°ěˇî"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "˝˝Ćóˇî"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "@var ¤ÇťČ¤¨¤˝¤Ś¤Ë¤Ę¤¤Ę¸ťú %c"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "Á´¤ĆÂçʸťú¤Î @sc °úżôĄ˘˝ž¤Ă¤Ć¸ú˛Ě¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "`{' ¤Ź¤˘¤ë¤Ď¤ş¤Ç¤š¤ŹĄ˘`%c' ¤Ç¤ˇ¤ż"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "verb ĽÖĽíĽĂĽŻĆâ¤ÇĽŐĽĄĽ¤ĽëËöČř¤Č¤Ę¤ę¤Ţ¤ˇ¤ż"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "`}' ¤Ź¤˘¤ë¤Ď¤ş¤Ç¤š¤ŹĄ˘`%c' ¤Ç¤ˇ¤ż"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s ¤ĎÇѤ줿̿Îá¤Ç¤š"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp ¤Ë¤Ď `%s' ¤Ç¤Ď¤Ę¤ŻĄ˘Ŕľ¤ÎżôĂͤňÍż¤¨¤Ę¤ą¤ě¤Đ¤Ę¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "%c%s ¤ËÂФš¤ëÉÔŔľ¤Ę°úżô"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "¤˝¤Î¤Ţ¤Ţ"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "¤Ę¤ˇ"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "%c%s ¤ËÂФš¤ëÉÔŔľ¤Ę°úżô"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "@def °úżô¤Ë `}' ¤ňËş¤ě¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "ľĄÇ˝"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "ĽŢĽŻĽí"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Ćß졿"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "ĘŃżô"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "ĽćĄźĽśĽŞĽ×ĽˇĽçĽó"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Ľ¤ĽóĽšĽżĽóĽšĘŃżô"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "ĽáĽ˝ĽĂĽÉ"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "of"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "on"
+
+#: makeinfo/defun.c:711
+#, fuzzy, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "`%2$sx' ¤ňťČ¤Ś¤ż¤á¤Ë¤Ď `%1$s' ÁŢĆţ¤Ç¤Ę¤ą¤ě¤Đ¤Ę¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' ¤Ë¤Ď `%s' ¤Ŕ¤ą¤Ç¤Ę¤ŻĄ˘`{...}' ˇÁź°¤Î°úżô¤ŹÉŹÍפǤš"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "ľÓĂí `%s' ¤ÎĘĤ¸ĽÖĽěĄźĽš¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "ľÓĂí¤ËżĆĽÎĄźĽÉ¤ÎÄęľÁ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/footnote.c:210
+#, fuzzy
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "ľÓĂí¤ËżĆĽÎĄźĽÉ¤ÎÄęľÁ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "ľÓĂí"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "ĚľÂę"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, fuzzy, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "ÉÔĹŹŔڤʼΥźĽÉĚž¤Ç¤š: `%s'"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "ÉÔĚŔ¤ĘĽ¤ĽóĽÇĽĂĽŻĽš `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "¸Ť˝Đ¤ˇ `%s' ¤Ď´ű¤Ë¸şß¤ˇ¤Ţ¤š"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "@synindex ¤ËĄ˘ĂΤé¤Ę¤¤¸Ť˝Đ¤ˇ `%s' ¤ä `%s' ¤Ź¤˘¤ę¤Ţ¤š"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "@printindex ¤ËĄ˘ĂΤé¤Ę¤¤¸Ť˝Đ¤ˇ `%s' ¤Ź¤˘¤ę¤Ţ¤š"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "¸Ť˝Đ¤ˇ `%s' ¤ÎĽ¨ĽóĽČĽę¤Ď¤˘¤é¤ć¤ëĽÎĄźĽÉ¤Îł°ÂŚ¤Ç¤š"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(¤˘¤é¤ć¤ëĽÎĄźĽÉ¤Îł°ÂŚ)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "See "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "insertion_type_pname Ăć¤Ë˛ő¤ě¤żˇż¤Ź¤˘¤ę¤Ţ¤š"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "ÎóľóÍŃĽšĽżĽĂĽŻ¤ŹĽŞĄźĽĐĽŐĽíĄź¤ˇ¤Ţ¤ˇ¤ż"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "ĽéĽŮĽëʸťú¤ŹĽŞĄźĽĐĄźĽŐĽíĄźĄ˘%c ¤ËĚᤡ¤Ţ¤š"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s ¤Ë¤Ď°úżô¤ŹÉŹÍפǤš: %citem ¤ňŔ°ˇÁ¤š¤ë¤ż¤á"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' ¤Ë¤Ď `%s' ¤ŹÉŹÍפǤš¤ŹĄ˘`%s' ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ˇ¤ż"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "`%cend %s' ¤Č¤ÎÂĐąţ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s ¤Ë¤ĎąŃżôʸťú¤ŹÉŹÍפǤš"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "verbatim ĽÖĽíĽĂĽŻĂć¤ÇĽŐĽĄĽ¤Ľë¤ÎËöČř¤Č¤Ę¤ę¤Ţ¤ˇ¤ż"
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "`@%2$s' ĽÖĽíĽĂĽŻĆâÂŚ¤Ç¤Î @%1$s ¤ĎĄ˘¤˘¤Ţ¤ę°ŐĚŁ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu ¤ŹşÇ˝é¤Î @node °ĘÁ°¤Ë¸˝¤ě¤Ţ¤ˇ¤żĄŁ`Top' ĽÎĄźĽÉ¤ň¤Ä¤Ż¤ę¤Ţ¤š"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "¿ʏ @top ĽÎĄźĽÉ¤Ď @ifinfo ¤č¤ę¤Ď @ifnottex ¤Ëʤ¤ď¤ě¤ë¤Ů¤­¤Ç¤ĎĄŠ"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu ¤ŹşÇ˝é¤ÎĽÎĄźĽÉ°ĘÁ°¤Ë¸˝¤ě¤Ţ¤ˇ¤żĄŁ`ÄşĹŔ' ĽÎĄźĽÉ¤ňşî¤ę¤Ţ¤š"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "`@%2$s' ĽÖĽíĽĂĽŻĆâÂŚ¤Ç¤Î @%1$s ¤ĎĄ˘¤˘¤Ţ¤ę°ŐĚŁ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "`%c%s' ¤Č¤ÎÂĐąţ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "`%c%s' ¤Î¸ĺ¤í¤Ë¤Ď˛ż¤Ť¤ŹÉŹÍפǤš"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "`%s' ¤ËÂФš¤ëÉÔŔľ¤Ę°úżô `%s'ĄŁ`%s' ¤ňťČ¤¤¤Ţ¤š"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "`@%2$s' ĽÖĽíĽĂĽŻĆâÂŚ¤Ç¤Î @%1$s ¤ĎĄ˘¤˘¤Ţ¤ę°ŐĚŁ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "`%s' ĽÖĽíĽĂĽŻĆâÂŚ¤Ç¤Î @itemx ¤ĎĄ˘¤˘¤Ţ¤ę°ŐĚŁ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "ÁŢĆţĽÖĽíĽĂĽŻł°¤ÇĄ˘%c%s ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ˇ¤ż"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s ¤ĎÍ­¸ú¤Ę ISO 639 ¸Ŕ¸ěĽłĄźĽÉ¤Ç¤Ď¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "Ľ¨ĽóĽłĄźĽÇĽŁĽóĽ°Ěž `%s' ¤ňǧźą¤Ç¤­¤Ţ¤ť¤ó"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "ťÄÇ°¤Ę¤Ź¤éĄ˘Ľ¨ĽóĽłĄźĽÉ `%s' ¤Ďźő¤ąÉŐ¤ą¤é¤ě¤Ţ¤ť¤ó"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "Ľ¨ĽóĽłĄźĽÉʸťú `%s' ¤ŹĚľ¸ú¤Ç¤š"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s ¤Ď `%c' ¤Ç¤Ď¤Ę¤ŻĄ˘`i' ¤Ť `j' ¤ň°úżô¤Č¤ˇ¤ĆÉŹÍפȤˇ¤Ţ¤š"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s ¤Ď°úżô¤Č¤ˇ¤Ć `i' ¤Ť `j' ¤Î¤¤¤ş¤ě¤Ť°ěʸťú¤ŹÉŹÍפǤš"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "ĽŢĽŻĽí `%s' ¤Ď°ĘÁ°¤ËÄęľÁ¤ľ¤ě¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "¤ł¤ł¤ĎĄ˘`%s' ¤ÎÁ°¤ÎÄęľÁ¤Ç¤š"
+
+#: makeinfo/macro.c:355
+#, fuzzy, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "ĽŢĽŻĽíŸłŤĆâ¤Î \\ ¤Î¸ĺ¤í¤Ë \\ ¤äĽŃĽéĽáĽżĚž¤Ç¤Ď¤Ę¤Ż `%s' ¤ŹÂł¤¤¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "ĽŢĽŻĽí `%s' ¸Ć¤Ó˝Đ¤ˇ(%dšÔĚÜ)¤Î°úżô¤ŹÂż¤š¤Ž¤Ţ¤š"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend ĽŢĽŻĽí¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg ¤ĎĄ˘°úżô¤ň°ě¤ÄÍż¤¨¤ż¤Č¤­¤Î¤ßÍ­¸ú¤Ç¤š"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@%2$s ¤Č°ěĂפˇ¤Ę¤¤ @end %1$s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Ľ¨ĽéĄź¤ŹÂż¤š¤Ž¤Ţ¤š! Äü¤á¤Ţ¤ˇ¤żĄŁ\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: ˇŮšđ: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "´Ö°ă¤Ă¤ż°ĚĂÖ¤Ë %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "žÜ¤ˇ¤Ż¤Ď `%s --help' ¤ňźÂšÔ¤ˇ¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "ťČ¤¤Ęý: %s [ĽŞĽ×ĽˇĽçĽó]... TEXINFOĽŐĽĄĽ¤Ľë...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Texinfo Ľ˝ĄźĽšĘ¸˝ń¤ňÍÍĄš¤ĘˇÁź°¤ÇĆɤá¤ë¤č¤Ś¤ËĘŃ´š¤ˇ¤Ţ¤šĄŁĽÇĽŐĽŠĽëĽČ¤Ç¤Ď\n"
+"ĽŞĽóĽéĽ¤Ľó¤Ç Emacs ¤äĂąĆȤΠGNU Info ¤ÇĆɤŕ¤Î¤ËĹŹ¤ˇ¤ż Info ĽŐĽĄĽ¤Ľë¤Ç¤šĄŁ\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"°ěČĚĹŞ¤ĘĽŞĽ×ĽˇĽçĽó:\n"
+" --error-limit=NUM Ľ¨ĽéĄź¤Ź NUM ¸ÄČŻŔ¸¤ˇ¤ż¤éĂćťß¤š¤ë (default %"
+"d)ĄŁ\n"
+" --force Ľ¨ĽéĄź¤ŹČŻŔ¸¤ˇ¤Ć¤â˝ĐÎϤňĘݸ¤š¤ëĄŁ\n"
+" --help ¤ł¤ÎťČ¤¤Ęý¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ëĄŁ\n"
+" --no-validate ĽÎĄźĽÉ´ÖÁę¸ßť˛žČ¤Î¸ĄžÚ¤ňÍŢŔŠ¤š¤ëĄŁ\n"
+" --no-warn ˇŮšđ¤ňÍŢŔŠ¤š¤ë (¤ŹĄ˘Ľ¨ĽéĄź¤ĎÉ˝ź¨¤š¤ë)ĄŁ\n"
+" --reference-limit=NUM şÇÂ睲žČżô NUM ¤Ëťę¤ě¤ĐˇŮšđ¤š¤ë (default %"
+"d)ĄŁ\n"
+" -v, --verbose šÔ¤Ę¤ď¤ě¤ëťö¤ňŔâĚŔ¤š¤ëĄŁ\n"
+" --version ĽĐĄźĽ¸ĽçĽóžđĘó¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ëĄŁ\n"
+
+#: makeinfo/makeinfo.c:364
+#, fuzzy, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"˝ĐÎϡÁź°ĽťĽŻĽˇĽçĽó (ĽÇĽŐĽŠĽëĽČ¤Ç¤Ď Info ¤ňŔ¸ŔŽ¤ˇ¤Ţ¤š):\n"
+" --docbook Info ¤Ç¤Ď¤Ę¤Ż DocBook ¤ň˝ĐÎϤš¤ëĄŁ\n"
+" --html Info ¤Ç¤Ď¤ó¤Ż HTML ¤ň˝ĐÎϤš¤ëĄŁ\n"
+" --no-headers Ľ×ĽěĽ¤ĽóĽĆĽŻĽšĽČ¤ň˝ĐÎϤš¤ëĄŁInfo ĽÎĄźĽÉśčŔÚ¤ęťŇ\n"
+" ¤ä Node: šÔ¤ňÍŢŔŠĄŁ--output ĽŞĽ×ĽˇĽçĽó¤ň\n"
+" ¤Ä¤ą¤Ę¤¤¤Čɸ˝ŕ˝ĐÎϤ˽ń¤­šţ¤ŕ\n"
+" --xml Info ¤Ç¤Ď¤Ę¤Ż XML (TexinfoML) ˇÁź°¤Ç˝ĐÎϤš¤ëĄŁ\n"
+
+#: makeinfo/makeinfo.c:372
+#, fuzzy
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"°ěČĚ˝ĐÎĎĽŞĽ×ĽˇĽçĽó:\n"
+" -E, --macro-expand FILE ĽŢĽŻĽíŸłŤ¤ľ¤ě¤żĽ˝ĄźĽš¤ň FILE ¤Ë˝ĐÎϤš¤ëĄŁ\n"
+" @setfilename ¤ĎĚľťë¤ľ¤ě¤ëĄŁ\n"
+" --no-split Info ¤ä HTML ¤ÎĘŹłä˝ĐÎϤňÍŢŔŠ¤š¤ëĄŁ\n"
+" ¤ż¤Ŕ°ě¤Ä¤Î˝ĐÎĎĽŐĽĄĽ¤Ľë¤ňŔ¸ŔŽ¤š¤ëĄŁ\n"
+" --number-sections žĎ¤äŔá¤ÎČÖšć¤ň˝ĐÎϤš¤ëĄŁ\n"
+" -o, --output=FILE FILE ¤Ř˝ĐÎϤš¤ë (ĘŹłä HTML ¤ÎžěšçĽÇĽŁĽěĽŻĽČ"
+"Ľę)ĄŁ\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Info ¤äĽ×ĽěĽ¤ĽóĽĆĽŻĽšĽČÍŃĽŞĽ×ĽˇĽçĽó:\n"
+" --enable-encoding @documentencoding ¤Ë´đ¤­Ą˘Info ˝ĐÎϤË\n"
+" Ľ˘ĽŻĽťĽóĽČ¤äĆĂźěʸťú¤ň˝ĐÎϤš¤ëĄŁ\n"
+" --fill-column=NUM NUM ʸťú¤Ç Info šÔ¤ň˛ţšÔ¤š¤ë (default %d)ĄŁ\n"
+" --footnote-style=STYLE STYLE ¤Ë´đ¤Ĺ¤¤¤Ć Info ¤ÎľÓĂí¤ň˝ĐÎϤš¤ëĄŁ\n"
+" `separate' ¤˝¤ÎĽÎĄźĽÉĂć¤ËľÓĂí¤ňĂÖ¤Ż\n"
+" `end' ÄęľÁ¤ľ¤ě¤żĽÎĄźĽÉ¤ÎËöČř¤ËĂÖ¤Ż "
+"(default)\n"
+" --paragraph-indent=VAL Info ĂĘÍî¤ň VAL ¸Ä¤ÎśőÇň¤Çťú˛ź¤˛ (default %"
+"d)ĄŁ\n"
+" VAL ¤Ź `none' ¤Ŕ¤Čťú˛ź¤˛¤ť¤şĄ˘VAL ¤Ź `asis'\n"
+" ¤Ŕ¤ČĄ˘´ű¸¤Îťú˛ź¤˛¤ň¤˝¤Î¤Ţ¤ŢťČ¤ŚĄŁ\n"
+" --split-size=NUM Info ĽŐĽĄĽ¤ĽëĽľĽ¤Ľş¤ň NUM ¤ÇĘŹłä (default %d)\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+#, fuzzy
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"ĆţÎĎĽŐĽĄĽ¤ĽëĽŞĽ×ĽˇĽçĽó:\n"
+" --commands-in-node-names ĽÎĄźĽÉĚžĂć¤Î @ ĽłĽŢĽóĽÉ¤ňľö˛Ä¤š¤ëĄŁ\n"
+" -D VAR ĘŃżô VAR ¤ňÄęľÁ¤š¤ëĄŁ@set ¤ČĆą¤¸ĄŁ\n"
+" -I DIR @include Ăľş÷ĽŃĽš¤Ë DIR ¤ňÄɲ䚤륣\n"
+" -P DIR @include Ăľş÷ĽŃĽš¤ÎŔčĆŹ¤Ë DIR ¤ňÁŢĆţ¤š¤ëĄŁ\n"
+" -U VAR ĘŃżô VAR ¤ň̤ÄęľÁ¤Ë¤š¤ëĄŁ@clear ¤ČĆą¤¸ĄŁ\n"
+
+#: makeinfo/makeinfo.c:425
+#, fuzzy
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"ĆţÎϤΞňˇďĹŞ˝čÍý:\n"
+" --ifhtml HTML Ŕ¸ŔŽ¤Ç¤Ę¤Ż¤Ć¤âĄ˘@ifhtml ¤ä @html ¤ň˝čÍý¤š¤ëĄŁ\n"
+" --ifinfo HTML Ŕ¸ŔŽ¤š¤ë¤Č¤­¤Ç¤âĄ˘@ifinfo ĽĆĽŻĽšĽČ¤ň˝čÍý¤š¤ëĄŁ\n"
+" --iftex @iftex ¤ä @tex ĽĆĽŻĽšĽČ¤ň˝čÍý¤š¤ë -- °ĹĚŰ¤Ë --no-splitĄŁ\n"
+" --no-ifhtml @ifhtml ¤ä @html ĽĆĽŻĽšĽČ¤ň˝čÍý¤ˇ¤Ę¤¤ĄŁ\n"
+" --no-ifinfo @ifinfo ĽĆĽŻĽšĽČ¤ň˝čÍý¤ˇ¤Ę¤¤ĄŁ\n"
+" --no-iftex @iftex ¤ä @tex ĽĆĽŻĽšĽČ¤ň˝čÍý¤ˇ¤Ę¤¤ĄŁ\n"
+
+#: makeinfo/makeinfo.c:444
+#, fuzzy
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Ćä˝ŘÄꤏ¤Ę¤ą¤ě¤ĐĄ˘@if... žňˇď¤Ď˝ĐÎϡÁź°źĄÂč¤Č¤Ę¤ę¤Ţ¤š:\n"
+" HTML ¤ňŔ¸ŔŽ¤š¤ë¤Ę¤é --ifhtml ¤ŹÍ­¸ú¤Çž¤ĎĚľ¸ú¤Ç¤šĄŁ\n"
+" Info ¤äĽ×ĽěĽ¤ĽóĽĆĽŻĽšĽČ¤ňŔ¸ŔŽ¤š¤ë¤Ę¤é --ifinfo ¤ŹÍ­¸ú¤Çž¤ĎĚľ¸ú¤Ç¤šĄŁ\n"
+
+#: makeinfo/makeinfo.c:452
+#, fuzzy
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Îă:\n"
+" makeinfo foo.texi foo ¤Î @setfilename ¤Ë Info ¤ň˝ńšţ¤ŕ\n"
+" makeinfo --html foo.texi foo ¤Î @setfilename ¤Ë HTML ¤ň˝ńšţ¤ŕ\n"
+" makeinfo --no-headers -o - foo.texi ɸ˝ŕ˝ĐÎϤ˼׼켤ĽóĽĆĽŻĽšĽČ¤ň˝ńšţ¤ŕ\n"
+" makeinfo --number-sections foo.texi Ŕá¤ËČÖšć¤ňÉŐ¤ą¤ż Info ¤ň˝ĐÎĎ\n"
+" makeinfo --no-split foo.texi Â礭¤ľ¤Ë´Ř¤ď¤é¤ş°ě¤Ä¤Î Info ¤ň˝ĐÎĎ\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s °úżô¤Ď `%s' ¤Ç¤Ď¤Ę¤Ż¤ĆĄ˘żôĂͤǤʤą¤ě¤Đ¤Ę¤ę¤Ţ¤ť¤óĄŁ\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "ĽŢĽŻĽíłČÄĽ˝ĐÎĎ `%s' ¤ňłŤ¤ą¤Ţ¤ť¤ó"
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "ĽŢĽŻĽíłČÄĽ˝ĐÎĎ `%s' ¤ňłŤ¤ą¤Ţ¤ť¤ó"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: --paragraph-indent °úżô¤Ď `%s' ¤Ç¤Ď¤Ę¤ŻĄ˘żôĂÍ/`none'/`asis' ¤Ç¤Ę¤ą¤ě¤Đ\n"
+" ¤Ę¤ę¤Ţ¤ť¤óĄŁ\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: --footnote-style °úżô¤Ď `%s' ¤Ç¤Ď¤Ę¤ŻĄ˘`separate' Ëô¤Ď `end' ¤Ç¤Ę¤ą¤ě¤Đ\n"
+" ¤Ę¤ę¤Ţ¤ť¤óĄŁ\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: ĽŐĽĄĽ¤Ľë°úżô¤ňËş¤ě¤Ć¤¤¤Ţ¤š¤č\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "¤ł¤ł¤Ç¤Ď `%s' ¤ŹÍ׾᤾¤ě¤Ţ¤š"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "ĽÇĽŁĽěĽŻĽČĽę `%s' ¤ňşîŔŽ¤Ç¤­¤Ţ¤ť¤ó: %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "`%2$s' ¤Ë `%1$s' ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr "%s: Info ¤Î˝ĐÎϤňšÔ¤Ę¤Ś¤Î¤ÇĄ˘ĽŢĽŻĽíłČÄĽ¤ňɸ˝ŕ˝ĐÎϤ˽ĐÎϤˇ¤Ţ¤ť¤óĄŁ\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "`%3$s' ¤Ť¤é %1$s ĽŐĽĄĽ¤Ľë `%2$s' ¤ňşîŔŽ¤ˇ¤Ţ¤šĄŁ\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr ""
+"¤ł¤ě¤Ď %1$sĄ˘%3$s ¤č¤ę makeinfo ĽĐĄźĽ¸ĽçĽó %2$s ¤Ë¤č¤Ă¤ĆşîŔŽ¤ľ¤ě¤Ţ¤ˇ¤żĄŁ\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Ľ¨ĽéĄź¤Ë¤č¤ęĄ˘ĽŢĽŻĽí˝ĐÎĎĽŐĽĄĽ¤Ľë `%s' ¤ňşď˝ü¤ˇ¤Ţ¤šĄŁ\n"
+" -- ťÄ¤ˇ¤ż¤¤žěšç¤Ë¤Ď `--force' ĽŞĽ×ĽˇĽçĽó¤ňťČ¤Ă¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Ľ¨ĽéĄź¤Ë¤č¤ęĄ˘˝ĐÎĎĽŐĽĄĽ¤Ľë `%s' ¤ňşď˝ü¤ˇ¤Ţ¤šĄŁ\n"
+" -- ťÄ¤ˇ¤ż¤¤žěšç¤Ë¤Ď `--force' ĽŞĽ×ĽˇĽçĽó¤ňťČ¤Ă¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "ĂΤé¤Ę¤¤ĽłĽŢĽóĽÉ `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "@%s ¤Ř¤Î°úżô¤Č¤ˇ¤ĆĽłĽŢĽóĽÉ¤ňÍż¤¨¤ë¤Ë¤ĎĄ˘ĽÖĽěĄźĽš¤ňťČ¤¤¤Ţ¤ˇ¤ç¤Ś"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s ¤Ë¤Ď `{...}' ¤ŹÉŹÍפǤš"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "ÂĐąţ¤Î¤Ę¤¤ }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "ĚžÁ°¤ŹĚľ¤¤ĄŞ"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "ĘĤ¸¤ëĽÖĽěĄźĽš¤Î¤Ę¤¤ %c%s"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image ĽŐĽĄĽ¤Ľë `%s' (HTML ÍŃ) ¤ŹĆɤá¤Ţ¤ť¤ó: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "`%2$s' ¤Ë `%1$s' ¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image ĽŐĽĄĽ¤Ľë `%s' (text ÍŃ) ¤ŹĆɤá¤Ţ¤ť¤ó: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image ¤ËĽŐĽĄĽ¤ĽëĚž¤ŹÍż¤¨¤é¤ě¤Ć¤¤¤Ţ¤ť¤ó"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{`%s' ¤ÎĂͤŹ¤Ę¤¤}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s ¤Ë¤ĎĚžÁ°¤ŹÉŹÍפǤš"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "@end %s ¤ÎÂĐąţ¤ÎÁ°¤ËĽŐĽĄĽ¤Ľë¤Î˝Ş¤ę¤Ë˝Đ¤Ż¤ď¤ˇ¤Ţ¤ˇ¤ż"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "@multitable ĽĆĽóĽ×ĽěĄźĽČ¤Ë } ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "@multitable ¤Î¸ĺ¤í¤ÎĽĆĽŻĽšĽČ `%s' ¤ňĚľťë¤ˇ¤Ţ¤š"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "ĽŢĽëĽÁĽĆĄźĽÖĽëšŕĚÜĆâ¤ÎĽŤĽéĽŕżô¤ŹÂż¤š¤Ž¤Ţ¤š(şÇÂç %d)"
+
+#: makeinfo/multi.c:555
+#, fuzzy, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "ĽŢĽëĽÁĽĆĄźĽÖĽëĆâ¤Ç¤ĎĄ˘Âč %d šÔ¤ňÁŞÂň¤Ç¤­¤Ţ¤ť¤ó"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "ĽŢĽëĽÁĽĆĄźĽÖĽë¤Îł°ÂŚ¤Î @tab ¤ňĚľťë¤ˇ¤Ţ¤š"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** ĽŢĽëĽÁĽŤĽéĽŕ¤ÎşÇ¸ĺ¤ÎÎ󤍤é˝ĐÎĎ\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* Âč %d ĽŤĽéĽŕ: ˝ĐÎĎ = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "ĽÎĄźĽÉ `%s' Á°(%d šÔĚÜ)¤ËÄęľÁ¤ľ¤ě¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "ĽÎĄźĽÉ %s ¤ňŔ°ˇÁĂć...\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "ĽÎĄźĽÉ `%s' ¤Ë¤ĎĽťĽŻĽˇĽçĽóÍŃĽłĽŢĽóĽÉ¤ŹÉŹÍפǤš(Îă: %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "`%c%s' ĽłĽŢĽóĽÉ¤ËťŘÄꤾ¤ě¤żĽÎĄźĽÉĚž¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Ľ˘ĽóĽŤĄź `%s' ¤ČĽÎĄźĽÉ `%s' ¤ŹĆą¤¸ĽŐĽĄĽ¤Ľë¤ňĽŢĽĂĽ×¤ˇ¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "¤ł¤Î @anchor ĽłĽŢĽóĽÉ¤ĎĚľťë¤ľ¤ě¤Ţ¤š -- ¤˝¤ł¤Ř¤Îť˛žČ¤ĎĆ°şî¤ˇ¤Ţ¤ť¤ó"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "¤ł¤ÎĽ˘ĽóĽŤĄźĚž¤ňĘŃšš¤š¤ë¤Ť `--no-split' ĽŞĽ×ĽˇĽçĽó¤ňťČ¤¤¤Ţ¤ˇ¤ç¤Ś"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "split-HTML ĽŐĽĄĽ¤Ľë `%s' ¤Î˝Ş¤ę¤ËĄ˘¤˘¤ë¤Ď¤ş¤Î¤Ę¤¤Ę¸ťúÎ󤏤˘¤ę¤Ţ¤š"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "źĄ:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Á°:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "žĺ:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Ľ˘ĽóĽŤĄź `%s' ¤Č `%s' ¤ŹĆą¤¸ĽŐĽĄĽ¤ĽëĚž¤ËĽŢĽĂĽ×¤ˇ¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "@anchor ĽłĽŢĽóĽÉ¤ĎĚľťë¤ľ¤ě¤Ţ¤š -- ¤˝¤ł¤Ř¤Îť˛žČ¤ĎĆ°şî¤ˇ¤Ţ¤ť¤ó"
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s ¤Ď¸şß¤ˇ¤Ę¤¤ĽÎĄźĽÉ `%s' ¤ňť˛žČ¤ˇ¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "ĽáĽËĽĺĄź"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Áę¸ß"
+
+#: makeinfo/node.c:1447
+#, fuzzy, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr "ĽÎĄźĽÉ `%s' ¤ÎźĄ¤ÎĽŐĽŁĄźĽëĽÉ¤ŹĽÎĄźĽÉ¤ňťŘ¤ˇ¤Ć¤¤¤Ţ¤ť¤ó -- "
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "¤ł¤ÎĽÎĄźĽÉ (%s) ¤Ď¤­¤Á¤ó¤Č Á° ¤ňťý¤Ă¤Ć¤¤¤Ţ¤ť¤ó"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Á°"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "ĽÎĄźĽÉ `%s' ¤ÎÁ°¤ÎĽŐĽŁĄźĽëĽÉ¤ŹĽÎĄźĽÉ¤ňťŘ¤ˇ¤Ć¤¤¤Ţ¤ť¤ó -- "
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "¤ł¤ÎĽÎĄźĽÉ (%s) ¤Ď¤­¤Á¤ó¤Č źĄ ¤ňťý¤Ă¤Ć¤¤¤Ţ¤ť¤ó"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "žĺ"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"ĽÎĄźĽÉ `%s' ¤Ë¤Ď žĺ°ĚšŕĚܤŹ¤˘¤ë¤Î¤ËĄ˘`%s' ¤Ř¤ÎĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ňˇç¤¤¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "ĽÎĄźĽÉ `%s' ¤Ď´ű¤Ë %d ˛óť˛žČ¤ľ¤ě¤Ć¤¤¤Ţ¤š"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "ť˛žČ¤ľ¤ě¤Ć¤¤¤Ę¤¤ĽÎĄźĽÉ `%s'"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "ĽÇĽŁĽěĽŻĽČĽę `%s' ¤ňşîŔŽ¤Ç¤­¤Ţ¤ť¤ó: %s"
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "ÉŐĎż %c "
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "ĆâÉôĽ¨ĽéĄź (ŔáĂľş÷Ăć) \"%s\"!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "ĆâÉôĽ¨ĽéĄź (ŔáĂľş÷Ăć) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s ¤ĎÇѝߤˇ¤Ţ¤ˇ¤żĄŁ -- Âĺ¤ď¤ę¤Ë %c%s ¤ňťČ¤Ă¤Ć¤Ż¤Ŕ¤ľ¤¤"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "%ctop ¤ÎĽÎĄźĽÉ¤ĎĄ˘ĽťĽŻĽˇĽçĽó¤Č¤ˇ¤Ć´ű¤Ë¸şß¤ˇ¤Ţ¤š"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "¤ł¤ł¤Ď %ctop ĽÎĄźĽÉ¤Ç¤š"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop ¤Ź %cnode ¤ÎÁ°¤ËťČ¤ď¤ě¤Ţ¤ˇ¤żĄ˘%s ¤Ëˇč¤á¤Ś¤Á¤ˇ¤Ţ¤š"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "ĚÜźĄ"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "´Ę°×ĚÜźĄ"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image ĽŐĽĄĽ¤Ľë `%s' ¤ŹĆɤá¤Ţ¤ť¤ó: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: ˇŮšđ: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\t´°Á´¤Ę ĽŞĽ×ĽˇĽçĽóĽęĽšĽČ¤ňĆŔ¤ë¤Ë¤Ď `%s --help' ¤ňźÂšÔ¤ˇ¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: util/install-info.c:434
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"ťČ¤¤Ęý: %s [ĽŞĽ×ĽˇĽçĽó]... [INFOĽŐĽĄĽ¤Ľë [DIRĽŐĽĄĽ¤Ľë]]\n"
+"\n"
+"Info ĽÇĽŁĽěĽŻĽČĽęĽŐĽĄĽ¤Ľë `DIRĽŐĽĄĽ¤Ľë' Ćâ¤Î `INFOĽŐĽĄĽ¤Ľë' ¤Ť¤é\n"
+"dir Ľ¨ĽóĽČĽę¤ňĽ¤ĽóĽšĽČĄźĽë¤Ţ¤ż¤Ďşď˝ü¤ˇ¤Ţ¤šĄŁ\n"
+"\n"
+"ĽŞĽ×ĽˇĽçĽó:\n"
+" --delete ¸˝Â¸¤š¤ë INFOĽŐĽĄĽ¤Ľë ¤ÎšŕĚܤň DIRĽŐĽĄĽ¤Ľë ¤Ť¤éşď˝ü¤š¤ë\n"
+" -- żˇ¤ż¤ĘšŕĚܤňÁŢĆţ¤ˇ¤Ę¤¤\n"
+" --dir-file=NAME Info ĽÇĽŁĽěĽŻĽČĽęĽŐĽĄĽ¤Ľë¤ÎĽŐĽĄĽ¤ĽëĚž¤ňťŘÄꤚ¤ë\n"
+" DIR-FILE °úżô¤ňÍřÍѤš¤ë¤Î¤ČĆą¤¸\n"
+" --entry=TEXT Info ĽÇĽŁĽěĽŻĽČĽęšŕĚܤȤˇ¤Ć TEXT ¤ňÁŢĆţ¤š¤ë\n"
+" TEXT ¤ĎĄ˘Info ¤ÎĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ÎšÔ¤ÎˇÁź°¤Ç¤Ę¤ą¤ě¤Đ¤Ę¤é"
+"¤ş\n"
+" ¤ł¤ě¤ËĄ˘śőÇň¤ÇťĎ¤Ţ¤ë¤¤¤Ż¤Ä¤Ť¤ÎšÔ¤ňÄɲäǤ­¤ë\n"
+" ĘŁżôšÔ¤ÎšŕĚܤňťŘÄꤡ¤żžěšçĄ˘Á´¤Ć¤Ź˛Ă¤¨¤é¤ě¤ë\n"
+" šŕĚܤňťŘÄꤡ¤Ę¤ą¤ě¤ĐĄ˘Info ĽŐĽĄĽ¤ĽëźŤżČ¤ÎžđĘó¤Ë¤č¤Ă¤Ć\n"
+" ˇčÄꤚ¤ë\n"
+" --help ťČ¤¤Ęý¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ëĄŁ\n"
+" --info-file=FILE ĽÇĽŁĽěĽŻĽČĽę¤ËĽ¤ĽóĽšĽČĄźĽë¤š¤ë Info ĽŐĽĄĽ¤Ľë¤ňťŘÄꤚ¤ë\n"
+" INFO-FILE °úżô¤ňÍřÍѤš¤ë¤Î¤ČĆą¤¸\n"
+" --info-dir=DIR --dir-file=DIR/dir ĽŞĽ×ĽˇĽçĽó¤ČĆą¤¸\n"
+" --item=TEXT --entry TEXT ĽŞĽ×ĽˇĽçĽó¤ČĆą¤¸\n"
+" Info ĽÇĽŁĽěĽŻĽČĽęšŕĚܤϟºݤ˼áĽËĽĺĄźšŕĚܤˤʤë\n"
+" --quiet ˇŮšđĽáĽĂĽťĄźĽ¸¤ňÍŢŔŠ¤š¤ë\n"
+" --remove --delete ĽŞĽ×ĽˇĽçĽó¤ČĆą¤¸\n"
+" --section=SEC ĽÇĽŁĽěĽŻĽČĽę¤Î SEC ĽťĽŻĽˇĽçĽó¤Ë¤ł¤ÎĽŐĽĄĽ¤Ľë¤ÎšŕĚܤňĂÖ¤Ż\n"
+" ĘŁżô¤ÎĽťĽŻĽˇĽçĽó¤ňťŘÄꤡ¤żžěšçĄ˘ĽťĽŻĽˇĽçĽóËč¤ËÁ´¤Ć¤Îšŕ"
+"ĚÜ\n"
+" ¤ŹÄɲ侤ě¤ë\n"
+" ĽťĽŻĽˇĽçĽó¤ňťŘÄꤡ¤Ę¤ą¤ě¤ĐĄ˘Info ĽŐĽĄĽ¤ĽëźŤżČ¤ÎžđĘó¤Ë\n"
+" ¤č¤Ă¤ĆˇčÄꤚ¤ë\n"
+" --version ĽĐĄźĽ¸ĽçĽóžđĘó¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ëĄŁ\n"
+"\n"
+"Email ¤Ë¤č¤ëĽĐĽ°ĽěĽÝĄźĽČ¤Ď bug-texinfo@gnu.orgĄ˘\n"
+"°ěČĚĹŞ¤ĘźÁĚä¤äľÄĎŔ¤Ď help-texinfo@gnu.org ¤Ţ¤ÇĄŁ\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"¤ł¤ě¤ŹĄ˘(dir)Top ¤Č¸Ć¤Đ¤ě¤ë Info łŹÁؤκǞĺ°ĚĽÎĄźĽÉ¤Î´Ţ¤á¤é¤ě¤Ć¤¤¤ë\n"
+".../info/dir ĽŐĽĄĽ¤Ľë¤Ç¤šĄŁ\n"
+"¤˘¤Ę¤ż¤ŹĄ˘ťĎ¤á¤Ć Info ¤ňľŻĆ°¤ˇ¤ż¤Î¤Ę¤éĄ˘¤Ţ¤ş¤ł¤ÎĽÎĄźĽÉ¤ň¸Ť¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+"\n"
+"%s\t¤ł¤ě¤ŹĄ˘INFO ĽÄĽęĄź¤ÎÄşĹŔ¤Ç¤š\n"
+"\n"
+" ¤ł¤ł(the Directory ĽÎĄźĽÉ)¤Ç¤ĎĄ˘źç¤Ŕ¤Ă¤żźçÂę¤ň°ˇ¤Ă¤Ć¤¤¤Ţ¤šĄŁ\n"
+" Ľ­Ąź \"q\" ¤Ç˝ŞÎť¤ˇĄ˘\"?\" ¤Ç Info ¤ÎĽłĽŢĽóĽÉ¤ňĽęĽšĽČĽ˘ĽĂĽ×¤ˇĄ˘\"d\" ¤Ç¤ł¤ł"
+"¤Ë\n"
+" Ěá¤ę¤Ţ¤šĄŁ\n"
+" \"h\" ¤ÇĆłĆţʸťú¤ňĆţÎϤˇ¤Ţ¤šĄŁ¤ż¤Č¤¨¤ĐĄ˘\n"
+" \"mEmacs<Return>\" ¤Ç Emacs ĽŢĽËĽĺĽ˘Ľë¤ňËŹ¤ě¤ëĄ˘¤Ę¤É¤Ç¤šĄŁ\n"
+"\n"
+" Emacs ¤ÎĆâ¤Ę¤é¤ĐĄ˘ĽáĽËĽĺĄźšŕĚܤäÁę¸ßť˛žČ¤ňĄ˘ĽŢĽŚĽš¤ÎĽÜĽżĽó 2 ¤ňĽŻĽęĽĂĽŻ¤ˇ"
+"¤Ć\n"
+" ÁŞÂň¤Ç¤­¤Ţ¤šĄŁ\n"
+"\n"
+"* ĽáĽËĽĺĄź:\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: (%s) ¤ňĆɤ᤺Ą˘(%s) ¤ňşîŔŽ¤Ç¤­¤Ţ¤ť¤ó¤Ç¤ˇ¤ż\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: śő¤ÎĽŐĽĄĽ¤Ľë"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY ¤ËÂĐąţ¤š¤ë END-INFO-DIR-ENTRY ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY ¤ËÂĐąţ¤š¤ë START-INFO-DIR-ENTRY ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Info ĽŐĽĄĽ¤Ľë¤Ď°ěĹ٤Ŕ¤ąťŘÄꤡ¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "ĽłĽŢĽóĽÉĽéĽ¤Ľó°úżô¤ŹÂż¤š¤Ž¤Ţ¤š `%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+"ĆţÎĎĽŐĽĄĽ¤Ľë¤ŹťŘÄꤾ¤ě¤Ć¤¤¤Ţ¤ť¤ó -- žÜ¤ˇ¤Ż¤Ď --help ÉդǟšԤˇ¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ"
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+"dir ĽŐĽĄĽ¤Ľë¤ŹťŘÄꤾ¤ě¤Ć¤¤¤Ţ¤ť¤ó -- žÜ¤ˇ¤Ż¤Ď --help ÉդǟšԤˇ¤Ć˛ź¤ľ¤¤ĄŁ"
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "`%s' ¤Ë Info dir ÍѤΚŕĚܤŹ¤˘¤ę¤Ţ¤ť¤ó"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "ĽáĽËĽĺĄźšŕĚÜ `%s' ¤ĎĄ˘`%s' ¤Ë´ű¤Ë¸şß¤ˇ¤Ţ¤š"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "`%s' šŕĚܤŹ¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó -- ˛ż¤âşď˝ü¤ˇ¤Ţ¤ť¤ó¤Ç¤ˇ¤ż"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "ťČ¤¤Ęý¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤ˇ¤Ţ¤š"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "˝čÍý¤Î¸ĺ¤ËĽĆĽóĽÝĽéĽęĽŐĽĄĽ¤Ľë¤ňťÄ¤ˇ¤Ć¤Ş¤­¤Ţ¤š"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "˝čÍý¤Î¤˘¤Č¤ËĽĆĽóĽÝĽéĽęĽŐĽĄĽ¤Ľë¤ňşď˝ü¤ˇ¤Ţ¤š (default)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "˝ĐÎϤň FILE ¤ËÁ÷¤ę¤Ţ¤š"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "ĽĐĄźĽ¸ĽçĽóžđĘó¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤ˇ¤Ţ¤š"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "ťČ¤¤Ęý: %s [ĽŞĽ×ĽˇĽçĽó]... ĽŐĽĄĽ¤Ľë...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "TeX ¤Î°Ů¤ÎĽ˝ĄźĽČşŃĽ¤ĽóĽÇĽĂĽŻĽšĽŐĽĄĽ¤Ľë¤ňŔ¸ŔŽ¤ˇ¤Ţ¤š\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"`foo.texi' ʸ˝ń¤ËÂФˇ¤Ć¤ĎĄ˘ÄĚžď¤ĎĽŐĽĄĽ¤Ľë¤Č¤ˇ¤Ć `foo.%c%c' ¤ňťŘÄꤡ¤Ţ¤šĄŁ\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"ĽŞĽ×ĽˇĽçĽó:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: texinfo ¤ÎĽ¤ĽóĽÇĽĂĽŻĽšĽŐĽĄĽ¤Ľë¤Ç¤Ď¤˘¤ę¤Ţ¤ť¤ó"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "%s ¤ÎşĆĽŞĄźĽ×Ľó¤ËźşÇÔ"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "%s ¤ËĽÚĄźĽ¸Č֚椏¤˘¤ę¤Ţ¤ť¤ó"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "%s šŕĚܤËĆó¤ÄĚܤΚŕĚÜĚž¤ŹÂł¤¤¤Ć¤¤¤Ţ¤š"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Info ĽÇĽŁĽěĽŻĽČĽę¤Ď°ěĹ٤Ŕ¤ąťŘÄꤡ¤Ć¤Ż¤Ŕ¤ľ¤¤ĄŁ\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" ¤ĎĚľ¸ú¤Ç¤š"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s ¤ĎÉÔĹŹŔÚ¤Ę ISO ĽłĄźĽÉ¤Ç¤šĄŁ%c ¤ňťČ¤¤¤Ţ¤š"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "ĘŁżô¤ÎĽŢĽŻĽíłČÄĽ˝ĐÎϤňťŘÄę¤Ç¤­¤Ţ¤ť¤ó"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Áę¸ßť˛žČ¤Ř¤ÎÂč°ě°úżô¤Źśő¤Ç¤˘¤Ă¤Ć¤Ď¤Ę¤ę¤Ţ¤ť¤ó"
+
+#~ msgid "see "
+#~ msgstr "see "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "`.' ¤ä ',' ¤Ď %c ¤Ç¤Ď¤Ę¤ŻĄ˘Áę¸ßť˛žČ¤ËÂł¤ą¤é¤ě¤Ę¤ą¤ě¤Đ¤Ę¤ę¤Ţ¤ť¤ó"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "@inforef ¤Ř¤ÎÂč°ě°úżô¤Ďśő¤Ç¤˘¤Ă¤Ć¤Ď¤Ę¤ę¤Ţ¤ť¤ó"
+
+#~ msgid "Node:"
+#~ msgstr "ĽÎĄźĽÉ:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: TOC ¤Ź¤ł¤ł¤Ë¤˘¤ë¤Ď¤ş¤Ę¤Î¤ËĄ˘¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "˛žÁŰĽáĽâĽę¤ňťČ¤¤˛Ě¤ż¤ˇ¤Ţ¤ˇ¤ż"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "`%s.png' ¤ä `.jpg' ¤Ź¤Ę¤ŻĄ˘łČÄĽťŇ¤Ź¤Ä¤ą¤é¤ě¤Ć¤¤¤Ţ¤ť¤ó"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s -- ĽŐĽĄĽ¤Ľë `%s'ĄŁ\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "`%s' ¤Ë žĺ ĽŐĽŁĄźĽëĽÉ¤Ź¤˘¤ę¤Ţ¤ť¤ó"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr " %-10s 1 šÔĘŹÁ°Ęý¤Ř¤š¤š¤á¤ëĄŁ\n"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr " %-10s 1 šÔĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+
+#~ msgid ""
+#~ "Email bug reports to bug-texinfo@gnu.org,\n"
+#~ "general questions and discussion to help-texinfo@gnu.org."
+#~ msgstr ""
+#~ "Email ¤Ë¤č¤ëĽĐĽ°ĽěĽÝĄźĽČ¤Ď bug-texinfo@gnu.orgĄ˘\n"
+#~ "°ěČĚĹŞ¤ĘźÁĚä¤äľÄĎŔ¤Ď help-texinfo@gnu.org ¤Ţ¤ÇĄŁ"
+
+#~ msgid ""
+#~ "Basic Commands in Info Windows\n"
+#~ "******************************\n"
+#~ "\n"
+#~ " \\%-10[quit-help] Quit this help.\n"
+#~ " \\%-10[quit] Quit Info altogether.\n"
+#~ " \\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+#~ "\n"
+#~ "Selecting other nodes:\n"
+#~ "----------------------\n"
+#~ " \\%-10[next-node] Move to the \"next\" node of this node.\n"
+#~ " \\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+#~ " \\%-10[up-node] Move \"up\" from this node.\n"
+#~ " \\%-10[menu-item] Pick menu item specified by name.\n"
+#~ " Picking a menu item causes another node to be selected.\n"
+#~ " \\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+#~ " \\%-10[history-node] Move to the last node seen in this window.\n"
+#~ " \\%-10[move-to-next-xref] Skip to next hypertext link within this "
+#~ "node.\n"
+#~ " \\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+#~ "node.\n"
+#~ " \\%-10[select-reference-this-line] Follow the hypertext link under "
+#~ "cursor.\n"
+#~ " \\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+#~ "node] (DIR)'.\n"
+#~ " \\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] "
+#~ "Top'.\n"
+#~ "\n"
+#~ "Moving within a node:\n"
+#~ "---------------------\n"
+#~ " \\%-10[scroll-forward] Scroll forward a page.\n"
+#~ " \\%-10[scroll-backward] Scroll backward a page.\n"
+#~ " \\%-10[beginning-of-node] Go to the beginning of this node.\n"
+#~ " \\%-10[end-of-node] Go to the end of this node.\n"
+#~ " \\%-10[1scroll-forward] Scroll forward 1 line.\n"
+#~ " \\%-10[1scroll-backward] Scroll backward 1 line.\n"
+#~ "\n"
+#~ "Other commands:\n"
+#~ "---------------\n"
+#~ " \\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+#~ " \\%-10[last-menu-item] Pick last item in node's menu.\n"
+#~ " \\%-10[index-search] Search for a specified string in the index "
+#~ "entries of this Info\n"
+#~ " file, and select the node referenced by the first entry "
+#~ "found.\n"
+#~ " \\%-10[goto-node] Move to node specified by name.\n"
+#~ " You may include a filename as well, as in (FILENAME)"
+#~ "NODENAME.\n"
+#~ " \\%-10[search] Search forward through this Info file for a specified "
+#~ "string,\n"
+#~ " and select the node in which the next occurrence is found.\n"
+#~ " \\%-10[search-backward] Search backward in this Info file for a "
+#~ "specified string,\n"
+#~ " and select the node in which the next occurrence is found.\n"
+#~ msgstr ""
+#~ "Info ĽŚĽŁĽóĽÉĽŚĆâ¤Î´đËÜĽłĽŢĽóĽÉ\n"
+#~ "*******************************\n"
+#~ "\n"
+#~ " \\%-10[quit-help] ¤ł¤ÎĽŘĽëĽ×¤ň˝ŞÎť¤š¤ëĄŁ\n"
+#~ " \\%-10[quit] Info ¤â°ě˝ď¤Ë˝ŞÎť¤š¤ëĄŁ\n"
+#~ " \\%-10[get-info-help-node] Info ĽÁĽĺĄźĽČĽęĽ˘Ľë¤ňľŻĆ°¤š¤ëĄŁ\n"
+#~ "\n"
+#~ "ž¤ÎĽÎĄźĽÉ¤ňÁŞÂň¤š¤ë:\n"
+#~ "---------------------\n"
+#~ " \\%-10[next-node] ¤ł¤ÎĽÎĄźĽÉ¤Î \"źĄ\" ¤ÎĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " \\%-10[prev-node] ¤ł¤ÎĽÎĄźĽÉ¤Î \"Á°\" ¤ÎĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " \\%-10[up-node] ¤ł¤ÎĽÎĄźĽÉ¤Ť¤é \"žĺ\" ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " \\%-10[menu-item] ĚžÁ°¤ÇťŘÄꤡ¤żĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+#~ " ĽáĽËĽĺĄźĽ˘Ľ¤ĽĆĽŕ¤ÎÁŞÂň¤Çž¤ÎĽÎĄźĽÉ¤ŹÁŞÂň¤ľ¤ě¤ëťö¤Ë¤Ę¤ëĄŁ\n"
+#~ " \\%-10[xref-item] Áę¸ßť˛žČ¤ňĂŠ¤ëĄŁť˛žČĚž¤ňĆɤߟč¤ëĄŁ\n"
+#~ " \\%-10[history-node] ¤ł¤ÎĽŚĽŁĽóĽÉĽŚ¤ÇşÇ¸ĺ¤Ë¸Ť¤żĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " \\%-10[move-to-next-xref] ¤ł¤ÎĽÎĄźĽÉĆâ¤ÎźĄ¤ÎĽęĽóĽŻ¤ŘĽšĽ­ĽĂĽ×¤š¤ëĄŁ\n"
+#~ " \\%-10[move-to-prev-xref] ¤ł¤ÎĽÎĄźĽÉĆâ¤ÎÁ°¤ÎĽęĽóĽŻ¤ŘĽšĽ­ĽĂĽ×¤š¤ëĄŁ\n"
+#~ " \\%-10[select-reference-this-line] ĽŤĄźĽ˝Ľë°ĚĂ֤μęĽóĽŻ¤ňĂŠ¤ë\n"
+#~ " \\%-10[dir-node] `ĽÇĽŁĽěĽŻĽČĽę' ĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ`\\[goto-node] "
+#~ "(DIR)' ¤ČĆą¤¸ĄŁ\n"
+#~ " \\%-10[top-node] Top ĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ`\\[goto-node] Top' ¤ČĆą¤¸ĄŁ\n"
+#~ "\n"
+#~ "ĽÎĄźĽÉĆâ¤Ç¤Î°ÜĆ°:\n"
+#~ "-----------------\n"
+#~ " \\%-10[scroll-forward] 1 ĽÚĄźĽ¸ĘŹÁ°Ęý¤Ř¤š¤š¤á¤ëĄŁ\n"
+#~ " \\%-10[scroll-backward] 1 ĽÚĄźĽ¸ĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+#~ " \\%-10[beginning-of-node] ¸˝şß¤ÎĽÎĄźĽÉ¤ÎŔčĆŹ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " \\%-10[end-of-node] ¸˝şß¤ÎĽÎĄźĽÉ¤ÎËöČř¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " \\%-10[1scroll-forward] 1 šÔĘŹÁ°Ęý¤Ř¤š¤š¤á¤ëĄŁ\n"
+#~ " \\%-10[1scroll-backward] 1 šÔĘŹ¸ĺĘý¤ŘĚᤚĄŁ\n"
+#~ "\n"
+#~ "¤˝¤Îž¤ÎĽłĽŢĽóĽÉ:\n"
+#~ "-----------------\n"
+#~ " \\%-10[menu-digit] ĽÎĄźĽÉĽáĽËĽĺĄź¤ÎşÇ˝é¤Ť¤é 9 ČÖĚÜËř¤ÎĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š"
+#~ "¤ëĄŁ\n"
+#~ " \\%-10[last-menu-item] ĽÎĄźĽÉĽáĽËĽĺĄź¤ÎşÇ¸ĺ¤ÎĽ˘Ľ¤ĽĆĽŕ¤ňÁŞÂň¤š¤ëĄŁ\n"
+#~ " \\%-10[index-search] ¸˝şß¤Î Info ĽŐĽĄĽ¤Ľë¤ÎĽ¤ĽóĽÇĽĂĽŻĽššŕĚܤÇʸťúÎó¤ňťŘ"
+#~ "Äꤡ¤Ć¸Ąş÷¤ˇĄ˘\n"
+#~ " şÇ˝é¤Ë¸Ť¤Ä¤Ť¤Ă¤żšŕĚܤŹť˛žČ¤ˇ¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+#~ " \\%-10[goto-node] ĚžÁ°¤ÇťŘÄꤾ¤ě¤żĽÎĄźĽÉ¤Ř°ÜĆ°¤š¤ëĄŁ\n"
+#~ " (ĽŐĽĄĽ¤ĽëĚž)ĽÎĄźĽÉĚž¤ÎÍͤ˥˘ĽŐĽĄĽ¤ĽëĚž¤ň´Ţ¤á¤ë¤ł¤Č¤Ź¤Ç¤­"
+#~ "¤ëĄŁ\n"
+#~ " \\%-10[search] ¸˝şß¤Î Info ĽŐĽĄĽ¤ĽëÁ´ÂΤňĄ˘ťŘÄꤾ¤ě¤żĘ¸ťúÎó¤ÇÁ°Ęý¸Ąş÷"
+#~ "¤ˇĄ˘\n"
+#~ " ¸Ť¤Ä¤Ť¤Ă¤ż¤â¤Î¤Ź´Ţ¤Ţ¤ě¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+#~ " \\%-10[search-backward] ¸˝şß¤Î Info ĽŐĽĄĽ¤Ľë¤ňĄ˘ťŘÄꤾ¤ě¤żĘ¸ťúÎó¤Ç¸ĺĘý"
+#~ "¸Ąş÷¤ˇĄ˘\n"
+#~ " ¸Ť¤Ä¤Ť¤Ă¤ż¤â¤Î¤Ź´Ţ¤Ţ¤ě¤Ć¤¤¤ëĽÎĄźĽÉ¤ňÁŞÂň¤š¤ëĄŁ\n"
+
+#~ msgid "******************************\n"
+#~ msgstr "*******************************\n"
+
+#~ msgid "---------------------\n"
+#~ msgstr "-----------------\n"
+
+#~ msgid "----------------------\n"
+#~ msgstr "---------------------\n"
+
+#~ msgid "---------------\n"
+#~ msgstr "-----------------\n"
+
+#~ msgid "%s' argument to @image command not found"
+#~ msgstr "@image ĽłĽŢĽóĽÉ¤Ř¤Î %s ¤Î°úżô¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó"
+
+#~ msgid ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "Translate Texinfo source documentation to various other formats:\n"
+#~ "Info files suitable for reading online with Emacs or standalone GNU Info\n"
+#~ "(by default); plain text (with --no-headers); or HTML (with --html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names allow @ commands in node names.\n"
+#~ " -D VAR define a variable, as with @set.\n"
+#~ " -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+#~ " --error-limit=NUM quit after NUM errors (default %d).\n"
+#~ " --fill-column=NUM break Info lines at NUM characters (default %"
+#~ "d).\n"
+#~ " --footnote-style=STYLE output footnotes according to STYLE:\n"
+#~ " `separate' to place footnotes in their own "
+#~ "node,\n"
+#~ " `end' to place the footnotes at the end of "
+#~ "the\n"
+#~ " node in which they are defined (the "
+#~ "default).\n"
+#~ " --force preserve output even if errors.\n"
+#~ " --help display this help and exit.\n"
+#~ " --html output HTML rather than Info format;\n"
+#~ " -I DIR append DIR to the @include search path.\n"
+#~ " --ifhtml process @ifhtml and @html text even when not\n"
+#~ " generating HTML.\n"
+#~ " --ifinfo process @ifinfo text even when generating "
+#~ "HTML.\n"
+#~ " --iftex process @iftex and @tex text.\n"
+#~ " implies --no-split.\n"
+#~ msgstr ""
+#~ "ťČ¤¤Ęý: %s [ĽŞĽ×ĽˇĽçĽó]... TEXINFOĽŐĽĄĽ¤Ľë...\n"
+#~ "\n"
+#~ "Texinfo ʸ˝ń¤ÎĽ˝ĄźĽš¤ň¤¤¤í¤¤¤í¤ĘˇÁź°¤ÇĆɤá¤ë¤č¤Ś¤ËĘŃ´š¤š¤ëĄŁ\n"
+#~ "Info ĽŐĽĄĽ¤Ľë¤Ď Emacs ¤ä GNU Info ¤ÇĽŞĽóĽéĽ¤Ľóžĺ¤ÇĆɤŕ¤Î¤ËĹŹ¤ˇ¤Ţ¤š\n"
+#~ "(ĽÇĽŐĽŠĽëĽČ)ĄŁĽ×ĽěĽ¤ĽóĽĆĽ­ĽšĽČ¤Ď(--no-headers)Ą˘HTML ¤Ď(--html)ĄŁ\n"
+#~ "\n"
+#~ "ĽŞĽ×ĽˇĽçĽó:\n"
+#~ " --commands-in-node-names ĽÎĄźĽÉĚž¤Ë @ ĽłĽŢĽóĽÉ¤ňĂÖ¤ą¤ë¤č¤Ś¤Ë¤š¤ë\n"
+#~ " -D VAR ĘŃżô¤ňŔßÄꤚ¤ëĄŁ@set ¤ČĆą¤¸\n"
+#~ " -E, --macro-expand FILE ĽŢĽŻĽíłČÄĽ¤ľ¤ě¤żĽ˝ĄźĽš¤ň FILE ¤Ë˝ĐÎĎ\n"
+#~ " --error-limit=NUM Ľ¨ĽéĄź¤Ź NUM ¸ÄČŻŔ¸¤ˇ¤ż¤é˝čÍý¤ňĂćťß¤š¤ë "
+#~ "(default %d)\n"
+#~ " --fill-column=NUM NUM ¤ł¤Îʸťúżô¤Ç˛ţšÔ¤ňĆţ¤ě¤ë (default %d)\n"
+#~ " --footnote-style STYLE ľÓĂí¤ň °Ę˛ź¤Î¤č¤Ś¤Ę STYLE ¤Ç˝ĐÎϤš¤ë:\n"
+#~ " `separate' ¤˝¤ÎĽÎĄźĽÉ¤ËľÓĂí¤ňĂÖ¤Ż\n"
+#~ " `end' ľÓĂí¤ŹÄęľÁ¤ľ¤ě¤żĽÎĄźĽÉ¤ÎşÇ¸ĺ¤ËĂÖ¤Ż"
+#~ "(default)\n"
+#~ " --force Ľ¨ĽéĄź¤Ź¤¤¤Ż¤ÄČŻŔ¸¤ˇ¤Ć¤âĄ˘˝ĐÎϤňĘݸ¤š¤ëĄŁ\n"
+#~ " --help ťČ¤¤Ęý¤ňÉ˝ź¨¤š¤ëĄŁ\n"
+#~ " --ifhtml HTML ¤ňŔ¸ŔŽ¤ˇ¤Ę¤¤¤Č¤­¤Ë¤âĄ˘@ifhtml ¤Č @html ¤Î\n"
+#~ " ĽĆĽ­ĽšĽČ¤ň˝čÍý¤š¤ë\n"
+#~ " --ifinfo HTML ¤ňŔ¸ŔŽ¤š¤ë¤Č¤­¤Ë¤â @ifinfo ¤ÎĽĆĽ­ĽšĽČ¤ň˝čÍý"
+#~ "¤š¤ë\n"
+#~ " --iftex @iftex ¤Č @tex ¤ÎĽĆĽ­ĽšĽČ¤ň˝čÍý¤š¤ë\n"
+#~ " --no-split ¤ňťŘÄꤡ¤ż¤ł¤Č¤Ë¤Ę¤ë\n"
+
+#~ msgid ""
+#~ " --no-headers suppress Info node separators and Node: lines "
+#~ "and\n"
+#~ " write to standard output without --output.\n"
+#~ " --no-ifhtml do not process @ifhtml and @html text.\n"
+#~ " --no-ifinfo do not process @ifinfo text.\n"
+#~ " --no-iftex do not process @iftex and @tex text.\n"
+#~ " --no-split suppress splitting of large Info output files "
+#~ "or\n"
+#~ " generation of one HTML file per node.\n"
+#~ " --no-validate suppress node cross-reference validation.\n"
+#~ " --no-warn suppress warnings (but not errors).\n"
+#~ " --number-sections include chapter, section, etc. numbers in "
+#~ "output.\n"
+#~ " -o, --output=FILE output to FILE, ignoring any @setfilename.\n"
+#~ " -P DIR prepend DIR to the @include search path.\n"
+#~ " --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+#~ "d).\n"
+#~ " if VAL is `none', do not indent;\n"
+#~ " if VAL is `asis', preserve existing "
+#~ "indentation.\n"
+#~ " --reference-limit=NUM warn about at most NUM references (default %"
+#~ "d).\n"
+#~ " -U VAR undefine a variable, as with @clear.\n"
+#~ " -v, --verbose explain what is being done.\n"
+#~ " --version display version information and exit.\n"
+#~ msgstr ""
+#~ " --no-headers ĽÎĄźĽÉĘŹłäľ­šć¤Č Node: šÔ¤ňÍŢŔŠ¤ˇ¤ĆĄ˘\n"
+#~ " --output ¤Ę¤ˇ¤Ç¤âɸ˝ŕ˝ĐÎϤ˽ńšţ¤ŕ\n"
+#~ " --no-ifhtml @ifhtml ¤ä @html ¤ÎĽĆĽ­ĽšĽČ¤ň˝čÍý¤ˇ¤Ę¤¤\n"
+#~ " --no-ifinfo @ifinfo ¤ÎĽĆĽ­ĽšĽČ¤ň˝čÍý¤ˇ¤Ę¤¤\n"
+#~ " --no-iftex @iftex ¤ä @tex ¤ÎĽĆĽ­ĽšĽČ¤ň˝čÍý¤ˇ¤Ę¤¤\n"
+#~ " --no-split Â礭¤Ę Info ˝ĐÎĎĽŐĽĄĽ¤Ľë¤ÎĘŹłä¤äĽÎĄźĽÉËč¤Î "
+#~ "HTML\n"
+#~ " ĽŐĽĄĽ¤ĽëŔ¸ŔŽ¤ňÍŢŔŠ¤š¤ë\n"
+#~ " --no-validate ĽÎĄźĽÉÁę¸ßť˛žČ¤ÎłÎǧ¤ňÍŢŔŠ¤š¤ë\n"
+#~ " --no-warn ˇŮšđ¤ňÍŢŔŠ¤š¤ë (Ľ¨ĽéĄź¤ĎÉ˝ź¨¤ľ¤ě¤ë)\n"
+#~ " --number-sections žĎ¤äŔá¤ËÄ̤ˇČÖšć¤ňÉŐ¤ą¤Ć˝ĐÎϤš¤ë\n"
+#~ " -o, --output=FILE @setfilename ¤ňĚľťë¤ˇ¤ĆĄ˘FILE ¤Ř˝ĐÎϤš¤ë\n"
+#~ " -P DIR @include ¸Ąş÷ĽŃĽš¤Ë DIR ¤ňÄɲ䚤ë\n"
+#~ " --paragraph-indent=VAL ĂĘÍî¤ň VAL ¸Ä¤ÎśőÇň¤ÇĽ¤ĽóĽÇĽóĽČ¤š¤ë (default %"
+#~ "d)\n"
+#~ " VAL ¤Ź `none' ¤Ę¤éĽ¤ĽóĽÇĽóĽČ¤ˇ¤Ę¤¤\n"
+#~ " VAL ¤Ź `asis' ¤Ę¤éĽ¤ĽóĽÇĽóĽČÎ̤ň¤˘¤ë¤Ţ¤Ţ¤ËĘÝ"
+#~ "¤Ä\n"
+#~ " --reference-limit=NUM şÇÂç NUM ¸Ä¤Îť˛žČ¤Ë¤Ä¤¤¤ĆˇŮšđ¤š¤ë (default %"
+#~ "d)\n"
+#~ " -U VAR @clear ¤ÎÍͤËĘŃżô VAR ¤ň̤ÄęľÁ¤Ë¤š¤ë\n"
+#~ " -v, --verbose ˛ż¤ŹšÔ¤Ę¤ď¤ě¤Ć¤¤¤ë¤Ť¤ňĘóšđ¤š¤ë\n"
+#~ " --version ĽĐĄźĽ¸ĽçĽóžđĘó¤ňÉ˝ź¨¤ˇ¤Ć˝ŞÎť¤š¤ë\n"
diff --git a/Build/source/utils/texinfo/po/nb.gmo b/Build/source/utils/texinfo/po/nb.gmo
new file mode 100644
index 00000000000..d29bd4223a4
--- /dev/null
+++ b/Build/source/utils/texinfo/po/nb.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/nb.po b/Build/source/utils/texinfo/po/nb.po
new file mode 100644
index 00000000000..316de2e825d
--- /dev/null
+++ b/Build/source/utils/texinfo/po/nb.po
@@ -0,0 +1,3108 @@
+# Norwegian translation of messages for GNU Texinfo 4.6 (bokmĺl dialect).
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Trond Endrestřl <Trond.Endrestol@gtf.ol.no>, 1998.
+#
+# Send this file as an gzipped attachment to:
+# translation@iro.umontreal.ca
+# with the subject:
+# TP-Robot PACKAGE-VERSION.TEAM.po
+#
+# The subject for the Norwegian bokmĺl translation of GNU Texinfo 4.7.90
+# would then be:
+# TP-Robot texinfo-4.7.90.nb.po
+#
+# Here's the URL for the Norwegian translation team:
+# http://www2.iro.umontreal.ca/~pinard/po/registry.cgi?team=no
+#
+# Here's the URL for the current translations of GNU Texinfo:
+# http://www2.iro.umontreal.ca/~pinard/po/registry.cgi?domain=texinfo
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.90\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-05 15:37+0100\n"
+"Last-Translator: Trond Endrestřl <Trond.Endrestol@gtf.ol.no>\n"
+"Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Flytte forover et tegn"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Flytte bakover et tegn"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Flytte til starten av denne linjen"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Flytte til slutten av denne linjen"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Flytte forover et ord"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Flytte tilbake et ord"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Slette tegnet under markřren"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Slette tegnet bak markřren"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Avbryte eller avslutte operasjon"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Godta (eller tvinge fullfřring av) denne linjen"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Sette inn neste tegn ordrett"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Sette inn dette tegnet"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Sette inn en tabulator"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transponere tegnet ved punktet"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Rykke tilbake innholdet fra forrige felling"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Fellingsringen er tom"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Rykke tilbake en tidligere felling"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Slette til slutten av linjen"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Slette til begynnelsen av linjen"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Slette ordet etter markřren"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Slette ordet fřr markřren"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Ingen fullfřringer"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Ikke fullstendig"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Liste mulige fullfřringer"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Eneste fullfřring"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "En fullfřring:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d fullfřringer:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Sett inn fullfřring"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Bygger fullfřringer..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Rulle fullfřringsvinduet"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Fotnoter kunne ikke vises"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Vise fotnotene assosiert med denne noden i et annet vindu"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Fotnoter -----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Lete opp en streng i indeksen til denne filen"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Finner indeksinnslag..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Ingen indekser funnet."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Indeksinnslag: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Gĺ til det neste passende indeksinnslaget fra forrige '\\[index-search]'-"
+"kommando"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Ingen tidligere indekssřkestrenger."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Ingen indeksinnslag."
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Ingen %sindeksinnslag inneholdende Ť%sť."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "mer "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "KAN IKKE SE DETTE"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "Fant Ť%sť i %s. (Ť\\[next-index-match]ť prřver ĺ finne den neste.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Sjekker indekser i Ť%sť..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Ingen av de tilgjengelig infofilene har Ť%sť i deres indekser."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Kravle gjennom alle kjente infofilers indekser etter en streng\n"
+" og bygge opp en meny"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Indeksapropos: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Noder med indekser som inneholder Ť%sť:\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Prřv --help for mer informasjon.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Det finnes INGEN garanti. Du kan redistribuere denne programvaren\n"
+"etter betingelsene i GNU General Public License. For mer informasjon\n"
+"om dette, se filen COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "ingen innslag funnet for Ť%sť\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly vćr vennlig ovenfor talesyntetisatorer.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Bruksmĺte: %s [VALG]... [MENYPUNKT...]\n"
+"\n"
+"Lese dokumentasjon i Infoformat.\n"
+"\n"
+"Valg:\n"
+" --apropos=EMNE sřke etter EMNE i alle indeksene til alle "
+"Infofilene.\n"
+" -d, --directory=KAT legge til KAT til INFOPATH.\n"
+" --dribble=FILNAVN huske brukerens tastetrykk i FILNAVN.\n"
+" -f, --file=FILNAVN angi Infofilen som skal besřkes.\n"
+" -h, --help vise denne hjelpen og avslutte.\n"
+" --index-search=STRENG gĺ til noden pekt pĺ av indeksoppslaget "
+"STRENG.\n"
+" -n, --node=NODENAVN angi noder i fřrste besřkte Infofil.\n"
+" -o, --output=FILNAVN skrive ut utvalgte noder til FILNAVN.\n"
+" -R, --raw-escapes ikke fjern ANSI-escapes fra mansider.\n"
+" --restore=FILNAVN lese innledende tastetrykk fra FILNAVN.\n"
+" -O, --show-options, --usage gĺ til kommandolinje-valg-noden.\n"
+"%s --subnodes rekursivt skrive ut menypunkter.\n"
+" --vi-keys bruke vi-aktige og less-aktige "
+"tastebindinger.\n"
+" --version vise programversjon og avslutte.\n"
+"\n"
+"Det fřrste ikke-valg-argumentet, dersom tilstede, er menypunktet som du\n"
+"starter fra; det blir sřkt etter i alle Ťdirť-filer langs med INFOPATH.\n"
+"Dersom menypunktet ikke er tilstede, vil info flette sammen alle\n"
+"Ťdirť-filene og vise resultatet. Řvrige gjenvćrende argumenter blir\n"
+"behandlet som navnene til menypunktene relativ til den fřrste besřkte\n"
+"noden.\n"
+"\n"
+"Eksempler:\n"
+" info vise toppnivĺ dirmeny\n"
+" info emacs starte ved emacs-noden fra toppnivĺ dir\n"
+" info emacs buffers starte ved buffers-noden i emacs-manualen\n"
+" info --show-options emacs starte ved emacs kommandolinjevalg\n"
+" info -f ./foo.info vise filen ./foo.info, ikke sřke gjennom dir\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Send bugrapporter til bug-texinfo@gnu.org,\n"
+"generelle spřrsmĺl og diskusjoner til help-texinfo@gnu.org.\n"
+"Websida for Texinfo: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Kan ikke finne noden Ť%sť."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Kan ikke finne noden Ť(%s)%sť."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Kan ikke finne et vindu!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Markřren vises ikke innen dette vinduets node!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Kan ikke slette det siste vinduet."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Ingen meny i denne noden."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Ingen fotnoter i denne noden."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Ingen kryssreferanser i denne noden."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Ingen Ť%sť-peker for denne noden."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Ukjent Info-kommando Ť%cť; prřv Ť?ť for hjelp."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Terminaltypen Ť%sť er ikke smart nok for ĺ kjřre Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Du er allerede pĺ den siste siden av denne noden."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Du er allerede pĺ den fřrste siden til denne noden."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Bare et vindu."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Resulterende vindu ville blitt for lite."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Ikke nok plass for et hjelpevindu, vennligst slett et vindu."
+
+# The next translation should match the length of this one
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Grunnleggende kommandoer i infovinduer\n"
+"**************************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Avslutte denne hjelpen.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Avslutte Info fullstendig.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Starte Infoopplćring.\n"
+
+# The next translation should match the length of this one
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Velger andre noder:\n"
+"-------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Flytte til neste node etter denne noden.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Flytte til forrige node fřr denne noden.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Flytte Ťoppť fra denne noden.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Velge et menypunkt angitt ved navn.\n"
+" Valg av et menypunkt fřrer til at en annen node blir valgt.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[history-node] Fřlge en kryssreferanse. Leser navnet til "
+"referansen.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Flytte til den siste noden sett i dette vinduet.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Flytte til neste hypertekstlenke innen denne "
+"noden.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Flytte til neste hypertekstlenke innen denne "
+"noden.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr "\\%-10[dir-node] Fřlge hypertekstlenken under markřren.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Flytte til Ťkatalogť-noden. Det samme som Ť\\[goto-node] "
+"(DIR)ť.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Flytte til ŤTopť-noden. Det samme som Ť\\[goto-node] "
+"Topť.\n"
+
+# The next translation should match the length of this one
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Flytte innen en node:\n"
+"---------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Gĺ til begynnelsen av denne noden.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Gĺ til slutten av denne noden.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Rulle forover 1 linje.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Rulle bakover 1 linje.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Rulle forover en side.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Rulle bakover en side.\n"
+
+# The next translation should match the length of this one
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Andre kommandoer:\n"
+"-----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] Velge fřrste ... niende punkt i nodens meny.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Velge det siste punktet i nodens meny.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Sřke etter en angitt streng blant indeksinnslagene i "
+"denne\n"
+" infofilen og velge noden til det fřrste innslaget som blir "
+"funnet.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Flytte til en node angitt ved navn.\n"
+" Du kan like godt inkludere et filnavn, som i (FILNAVN)"
+"NODENAVN.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Sřke forover etter en angitt streng\n"
+" og velge den noden som den neste forekomsten blir funnet i.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Sřke baklengs etter en angitt streng\n"
+" og velge den noden som den neste forekomsten blir funnet i.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Avslutte denne hjelpen.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Avslutte Info fullstendig.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Starte Infoopplćring.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Flytte til Ťnesteť-noden etter denne noden.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Flytte til Ťforrigeť-noden fřr denne noden.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Flytte Ťoppť fra denne noden.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Velge menypunkt spesifisert ved navn.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" Valg av menypunkt fřrer til at en annen node blir valgt.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Fřlge en kryssreferanse. Leser navnet til referansen.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Flytte til den siste noden sett i dette vinduet.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Flytte til neste hypertekstlenke innen denne noden.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Fřlge hypertekstlenken under markřren.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Flytte til Ťkatalogť-noden. Det samme som Ťg (DIR)ť.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Flytte til ŤTopť-noden. Det samme som Ťg Topť.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Rulle forover en side.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Rulle bakover en side.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Gĺ til begynnelsen av denne noden.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Gĺ til slutten av denne noden.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Rulle forover 1 linje.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Rulle bakover 1 linje.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Velge fřrste ... niende punkt i nodens meny.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Velge det siste punktet i nodens meny.\n"
+
+# This translation is connected to the next one
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s Sřke etter en spesifikk streng i indeksinnslagene i denne\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" infofil, og velge noden referert av det fřrste oppslaget "
+"funnet.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Flytte til noden spesifisert av navn.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Du kan like godt inkludere et filnavn, som i (FILNAVN)"
+"NODENAVN.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr ""
+" %-10s Sřke forlengs gjennom denne Infofilen for en spesifikk streng,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" og velge den noden som i det neste tilfellet blir funnet.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr ""
+" %-10s Sřke baklengs gjennom denne Infofilen for en spesifikk streng,\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Gjeldende sřkesti er:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Kommandoer tilgjengelig i Infovinduer:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Kommandoer tilgjengelig i ekkoomrĺdet:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Fřlgende kommandoer kan bare bli pĺkallet via %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Fřlgende kommandoer kan ikke bli pĺkallet i det hele tatt:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- Bruk Ť\\[history-node]ť eller Ť\\[kill-node]ť for ĺ avslutte ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Vise hjelpemelding"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Vise infonoden Ť(info)Helpť"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Skrive ut dokumentasjonen for KEY"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Beskriv tast: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s er udefinert."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s er udefinert."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s er definert som %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Vise hva som mĺ tastes for ĺ utfřre en gitt kommando"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Hvor er kommandoen: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "Ť%sť er ikke pĺ noen taster"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s kan bare bli pĺkallet via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s kan bli pĺkallet via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Det finnes ingen funksjon ved navn Ť%sť"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Det finnes INGEN garanti. Du kan redistribuere denne programvaren\n"
+"etter betingelsene i GNU General Public License. For mer informasjon\n"
+"om dette, se filen COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "unřyaktig antall argumenter"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "Kan ikke ĺpne inputfilen Ť%sť"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "Kunne ikke opprette outputfila Ť%sť"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "feil ved skriving til Ť%sť"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "Feil ved lukking av outputfila Ť%sť"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "tastesekvensen er for lang"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "manglende tastesekvens"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NULL-tegn (\\000) er ikke tillatt"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NULL-tegn (^%c) er ikke tillatt"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "manglende handlingsnavn"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "avdeling for lang"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "Ukjent handling Ť%sť"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "handlingsnavn for langt"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "ekstra tegn fřlger handlingen Ť%sť"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "manglende variabelnavn"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "manglende Ť=ť umiddelbart etter variabelnavn"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "variabelnavn for langt"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "verdi for lang"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "Ť%sť, linje %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Bruksmĺte: %s [VALG]... [INPUTFIL]\n"
+"\n"
+"Kompilere infokey-kildefil til infokeyfil. Leser INPUTFIL (standard\n"
+"$HOME/.infokey) og skriver kompilert keyfil til $HOME/.info.\n"
+"\n"
+"Valg:\n"
+" --output FIL skrive ut til FIL istedet for $HOME/.info.\n"
+" --help vise denne hjelpen og avslutte.\n"
+" --version vise programversjon og avslutte.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ignorerer ugyldig infokeyfil Ť%sť - for liten"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ignorerer ugyldig infokeyfil Ť%sť - for stor"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Feil ved lesing av infokeyfil Ť%sť - for kort"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokeyfil Ť%sť (feil magiske tall) -- kjřr infokey for ĺ oppdatere "
+"den"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "Din infokeyfil Ť%sť er utdatert -- kjřr infokey for ĺ oppdatere den"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokeyfil Ť%sť (feil avdelingslengde) -- kjřr infokey for ĺ "
+"oppdatere den"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokeyfil Ť%sť (feil avdelingskode) -- kjřr infokey for ĺ oppdatere "
+"den"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Feil data i infokeyfil -- noen tastebindinger ble ignorert"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "Feil data i infokeyfil -- noen variabelinnstillinger ble ignorert"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Lese inn navnet pĺ en infokommando og beskrive den"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Beskriv kommandoen: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Lese et kommandonavn i ekkoomrĺdet og utfřre den"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Kan ikke utfřre en Ťecho-areať-kommando her."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "udefinert kommando: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Sette hřyden pĺ det viste vinduet"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Sette skjermhřyde til (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Kildefiler sřkt gjennom for ĺ lage denne filen inkluderer:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Kunne ikke manipulere filen %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Fil)Node Linjer Str. Inneholdene fil\n"
+" --------- ------ ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Her er menyen over nodene du har nylig besřkt.\n"
+"Velg en fra denne menyen, eller bruk Ť\\[history-node]ť i et annet vindu.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Lag et vindu inneholdene en meny over alle de nylig besřkte nodene"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Velge en node som har blitt tidligere besřkt i et synlig vindu"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Velg besřkt node: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referansen forsvant! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Velkommen til Info versjon %s. Trykk Ť\\[get-help-window]ť for hjelp,\n"
+"Ť\\[menu-item]ť for menypunkt."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Flytte ned til neste linje"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Flytte opp til den forrige linjen"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Flytte til slutten av linjen"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Flytte til starten av linjen"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "neste"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Fřlger nestenoden..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Velger fřrste menypunkt..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Velger nestenoden..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Flytter opp %d gang(er), deretter neste."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Ingen flere noder i dette dokumentet."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Ingen Ťforrigeť for denne noden."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Flytter til forrige i dette vinduet."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Ingen Ťforrigeť eller Ťoppť for denne noden i dette dokumentet."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Flytter opp i dette vinduet."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Flytter til Ťforrigeťs siste menypunkt."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Flytte forover eller ned gjennom nodestrukturen"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Flytte tilbake eller opp gjennom nodestrukturen"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Rulle forover i dette vinduet"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "Rulle forover i dette vinduet og sette standard vindustřrrelse"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Rulle forover i dette vinduet, men forbli innenfor noden"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Rulle forover i dette vinduet, forbli innenfor noden og sette standard "
+"vindustřrrelse"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Rulle bakover i dette vinduet"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "Rulle bakover i dette vinduet og sette standard vindustřrrelse"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Rulle bakover i dette vinduet, men forbli innenfor noden"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Rulle bakover i dette vinduet, forbli innenfor noden og sette standard "
+"vindustřrrelse"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Flytte til starten av denne noden"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Flytte til slutten av denne noden"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Rulle ned pr. antall linjer"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Rulle opp pr. antall linjer"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Rulle ned en halv side"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Rulle opp en halv side"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Velge neste vindu"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Velge forrige vindu"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Dele gjeldende vindu"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Slette den gjeldende vindu"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Kan ikke slette et permanent vindu"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Slette alle andre vinduer"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Rulle det andre vinduet"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Rulle det andre vinduet bakover"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Řke (eller minke) dette vinduet"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Dele den tilgjengelige skjermplassen mellom de synlige vinduene"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Veksle tilstanden til linjebryting i gjeldende vindu"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Velge neste node"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Velge forrige node"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Velge oppnoden"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Velge den siste noden i denne filen"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Dette vinduet har ingen andre noder"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Velge fřrste node i denne filen"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Velge det siste punktet i nodens meny"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Velge dette menypunktet"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Det er ikke %d punkter i denne menyen."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menypunkt (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menypunkt: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Fřlge kryssreferanse (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Fřlge kryssreferanse: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Lese et menyvalg og velge dens node"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Lese en fotnote eller kryssreferanse og velge dens node"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Flytte til starten av denne nodens meny"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Besřke sĺ mange menypunkter som mulig samtidig"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Lese et nodenavn og velge det"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Gĺ til node: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Ingen meny i noden Ť%sť."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Ingen menypunkt Ť%sť i noden Ť%sť."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Klarte ikke ĺ finne noden referert av Ť%sť i Ť%sť."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Lese en liste over menyer fra dir og fřlge dem"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Fřlge menyer: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Finne noden som beskriver bruksmĺten for programmet"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Finne Invocation-noden til [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Lese en manualside-referanse og velge den"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Hent manualsiden: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Velge ŤTopť-noden i denne filen"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Velge noden Ť(dir)ť"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Slette noden (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Kan ikke slette noden Ť%sť"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Kan ikke slette den forrige noden"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Velge den sist valgte noden"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Slette denne noden"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Lese inn navnet pĺ en fil og velge den"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Finne fil: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Kan ikke finne Ť%sť."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Kunne ikke opprette utskriftsfil Ť%sť."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Ferdig."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Skriver noden Ť%sť..."
+
+# I need a better substitute for the verb Ťto pipeť.
+# ŤĹ pipeť sounds no good to me.
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "ŤPipeť innholdet av denne noden gjennom INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Kan ikke ĺpne Ťpipeť til Ť%sť."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Skriver ut noden Ť%sť..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Sřker i delfil Ť%sť..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr ""
+"Lese inn en streng og sřke etter den med skille pĺ store og smĺ bokstaver"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Lese inn en streng og sřke etter den"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Lese inn en streng og sřke bakover etter den"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%setter streng [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Sřke bakover"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Sřke"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " med skille pĺ store og smĺ bokstaver "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Sřk mislyktes"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Gjenta forrige sřk i samme retning"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Ingen tidligere sřkestreng"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Gjenta forrige sřk i motsatt retning"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Sřke interaktivt for en streng mens du skriver"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-sřk bakover: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-sřk: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Mislyktes "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Flytte til forrige kryssreferanse"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Flytte til neste kryssreferanse"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Velge referanse eller menypunkt pĺ denne linjen"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Avbryte gjeldende operasjon"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Avbrutt"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Flytte markřren til en angitt linje i vinduet"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Tegne skjermen pĺ nytt"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Avslutte Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Kjřr kommandoen knyttet til denne tastens Ťliten-bokstav-variantť"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Ukjent kommando (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "Ť%sť er ugyldig"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "Ť%sť er ugyldig"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Legge til dette siffret til det gjeldende numeriske argumentet"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Starte (eller multiplisere med 4) den gjeldende numeriske argumentet"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Brukt internt av \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Tomt for virtuelt minne!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Nĺr ŤOnť, oppstĺr og forsvinner fotnoter automatisk"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Nĺr ŤOnť, laging eller fjerning av vinduer endrer střrrelsen pĺ andre vinduer"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Nĺr ŤOnť, blink skjermen istedet for ĺ ringe i bjellen."
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Nĺr ŤOnť, feil fĺr bjellen til ĺ ringe"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "Nĺr ŤOnť, Info sřppelhenter filer som mĺtte dekomprimeres"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Nĺr ŤOnť, den delen av en matchende sřkestreng blir uthevet"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+"Kontrollerer hva som skjer nĺr rulling er řnsket ved slutten av en node"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Antall linjer som skal rulles nĺr markřren flyttes utenfor vinduet"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Nĺr ŤOnť, aksepterer og viser Info ISO-Latin-tegn"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Forklar bruken av en variabel"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Beskriv variabel: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Sette verdien til en Infovariabel"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Sett variabel: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Sette %s til verdien (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Sette %s til verdien (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Tagger er ute av synk ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), linjer ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d linjer --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d linjer --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Delfil: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: valget Ť%sť er flertydig\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: valget Ť--%sť tillater ikke et argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: valget Ť%c%sť tillater ikke et argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: valget Ť%sť krever et argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ukjent valg Ť--%sť\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ukjent valg Ť%c%sť\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ulovlig valg -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ugyldig valg -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: valget krever et argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: valget Ť-W %sť er flertydig\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: valget Ť-W %sť tillater ikke et argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "argumentene til @%s ble ignorert"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "januar"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "februar"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "mars"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "april"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "mai"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "juni"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "juli"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "august"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "september"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "oktober"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "november"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "desember"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "usannsynlig tegn %c i @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc-argument med store bokstaver, dermed ingen effekt"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "Ť{ť forventet, men sĺ Ť%cť"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "slutt-pĺ-fila inne i verb-blokk"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "Ť{ť forventet, men sĺ Ť%cť"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Note...} lager en overflřdig kryssreferanse i Info; skriv om for ĺ "
+"unngĺ dette"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s er utgĺtt"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp krever et positivt numerisk argument, ikke `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Ugyldig argument til %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "Ugyldig argument til @%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "insert"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Manglende Ť}ť i @def-arg"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funksjon"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Spesiell form"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variabel"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Brukervalg"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Forekomst"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metode"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "av"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "pĺ"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Mĺ vćre i et Ť@%sť-miljř for ĺ bruke Ť@%sť"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "`%s' utelatt fřr outputfilnavn"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "`%s' utelatt pga skriving til stdout"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Outputbuffer er ikke tomt."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "Ť%c%sť trenger et argument Ť{...}ť, ikke bare Ť%sť"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Ingen avsluttende krřllparentes for fotnoten Ť%sť"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Fotnote definert uten foreldrenode"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Fotnoter i fotnoter er ikke tillatt"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Fotnoter"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: kunne ikke ĺpne --css-file: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: --css-file endte i en kommentar"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Uten navn"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[uforventet] kunne ikke poppe neste htmltagg"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[uforventet] ugyldig nodenavn: Ť%sť"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Ukjent indeks Ť%sť"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info kan ikke hĺndtere `:' i indeksinnslaget `%s'"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Indeksen Ť%sť eksisterer allerede"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Ukjent indeks Ť%sť og/eller Ť%sť i @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(linje )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(linje %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Ukjent indeks Ť%sť i @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Innslag for indeksen Ť%sť utenfor node"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(utenfor noder)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Se "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item er ikke tillatt som argument til @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Broken-Type i insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Stakkoverflyt ved oppramsing"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "bokstavoverflyt, starter pĺ nytt ved %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s krever et argument: formattereren for %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "%cfloat-miljřer kan ikke nřstes"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' forventet Ť%sť, men sĺ Ť%sť"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Ingen tilsvarende Ť%cend %sť"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s krever en bokstav eller et siffer"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "slutt-pĺ-filen inne i verbatimblokk"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s er meningslřs utenfor et Ť@floatť-miljř"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu sett fřr fřrste @node, oppretter ŤTopť-noden"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"kanskje burde din @top-node bli pakket inn i @ifnottex istedet for @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu sett fřr fřrste node, oppretter ŤTopť-noden"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr "@%s gir ikke mening utenfor Ť@titlepageť- og Ť@quotationť-miljřer"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s er meningslřs utenfor et Ť@titlepageť-miljř"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Umatchet Ť%c%sť"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "Ť%c%sť trenger noe etter den"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Ugyldig argument Ť%sť til Ť%sť, bruker Ť%sť"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s er meningslřs innenfor en Ť@%sť-blokk"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx er meningslřs innenfor en Ť@%sť-blokk"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s funnet utenfor en innsettingsblokk"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s er ikke en gyldig ISO 639-sprĺkkode"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "ugjenkjennelig kodingsnavn Ť%sť"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "beklager, kodingen Ť%sť er ikke střttet"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "Ugyldig kodet tegn Ť%sť"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s forventer Ťiť eller Ťjť som argument, ikke Ť%cť"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s forventer et enkelt tegn, Ťiť eller Ťjť som argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makroen Ť%sť er tidligere definert"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "her er den tidligere definisjonen av Ť%sť"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "\\ i makroekspansjon fulgt av Ť%sť istedet for parameternavn"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makroen Ť%sť kalt pĺ linje %d med for mange argumenter"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend macro ikke funnet"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg bare brukbart nĺr makroen bare tar et argument"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "umatchet @end %s med @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "For mange feil! Ga opp.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: advarsel: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Feilplassert %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Prřv Ť%s --helpť for mer informasjon.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Bruksmĺte: %s [VALG]... TEXINFOFIL...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Oversette Texinfodokumentasjon til forskjellige andre formater:\n"
+"Infofiler for lesing online med Emacs eller den frittstĺende GNU Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Generelle valg:\n"
+" --error-limit=ANT avbryte etter ANT feil (standard %d).\n"
+" --force bevare output selv med feil.\n"
+" --help vise denne hjelpen og avslutte.\n"
+" --no-validate undertrykke sjekking av kryssreferanser.\n"
+" --no-warn undertrykke advarsler (men ikke feil).\n"
+" --reference-limit=ANT advare om pĺ det meste ANT referanser "
+"(standard %d).\n"
+" -v, --verbose forklare hva som blir gjort.\n"
+" --version vise programversjon og avslutte.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Valg av outputformat (standard er ĺ produsere Info):\n"
+" --docbook generere DocBook XML i stedet for Info.\n"
+" --html generere HTML i stedet for Info.\n"
+" --xml generere Texinfo XML i stedet for Info.\n"
+" --plaintext generere ren tekst i stedet for Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Generelle outputvalg:\n"
+" -E, --macro-expand FIL sende makroekspandert kilde til FIL,\n"
+" ignorerer enhver @setfilename.\n"
+" --no-headers undertrykke nodeseparatorer, Node:-linjer og "
+"menyer\n"
+" fra Info-output (og dermed produsere ren "
+"tekst)\n"
+" eller fra HTML (og dermed produsere kortere "
+"output);\n"
+" standard er ĺ skrive til standard ut.\n"
+" --no-split undertrykke splitting av Info- eller HTML-"
+"output,\n"
+" generere bare en outputfil.\n"
+" --number-sections nummerere kapitler og avdelinger (section).\n"
+" -o, --output=FIL sende output til FIL (eller katalog dersom "
+"splittet HTML),\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Valg for Infooutput og ren tekst:\n"
+" --enable-encoding skrive ut spesialtegn og tegn med aksenter i\n"
+" Infooutput basert pĺ @documentencoding.\n"
+" --fill-column=ANT bryte Infolinjer ved ANT tegn (standard %d).\n"
+" --footnote-style=STIL generere fotnoter i Info i henhold til STIL:\n"
+" Ťseparateť for ĺ legge fotnotene i egne "
+"noder;\n"
+" Ťendť for ĺ legge fotnotene i slutten av "
+"hver node\n"
+" der fotnotene er definert (standard).\n"
+" --paragraph-indent=ANT rykke inn Infoavsnitt med ANT mellomrom "
+"(standard %d).\n"
+" Dersom ANT er Ťnoneť rykkes ikke avsnittene "
+"inn;\n"
+" Dersom ANT er Ťasisť bevares eksisterende "
+"innrykk.\n"
+" --split-size=ANT splitte Infofilene ved lengde ANT (standard %"
+"d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"Valg for HTML:\n"
+" --css-include=FIL inkluder FIL i HTML <style>-taggen;\n"
+" les stdin dersom FIL er -.\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"Valg for XML og DocBook:\n"
+" --output-index=ANT innrykk XML-elementer med ANT mellomrom "
+"(standard %d).\n"
+" Dersom ANT er 0, blir ignorerbart tomrom "
+"ikke brukt.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Valg for inputfil:\n"
+" --commands-in-node-names tillate @-kommandoer i nodenavn.\n"
+" -D VAR definer variabelen VAR, som om @set "
+"brukes.\n"
+" -I KAT legg til KAT pĺ slutten av @include-"
+"sřkestien.\n"
+" -P KAT legg til KAT pĺ starten av @include-"
+"sřkestien.\n"
+" -U VAR udefiner variabelen VAR, som om @clear "
+"brukes.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Betinget behandling av input:\n"
+" --ifdocbook behandle @ifdocbook og @docbook selv om\n"
+" DocBook ikke skal genereres.\n"
+" --ifhtml behandle @ifhtml og @html selv om HTML ikke skal "
+"genereres.\n"
+" --ifinfo behandle @ifinfo selv nĺr info ikke skal genereres.\n"
+" --ifplaintext behandle @ifplaintext selv om ren tekst ikke skal "
+"genereres.\n"
+" --iftex behandle @iftex og @tex; innebćrer --no-split.\n"
+" --ifxml behandle @ifxml og @xml.\n"
+" --no-ifdocbook ikke behandle @ifdocbook og @docbook.\n"
+" --no-ifhtml ikke behandle @ifhtml og @html.\n"
+" --no-ifinfo ikke behandle @ifinfo.\n"
+" --no-ifplaintext ikke behandle @ifplaintext.\n"
+" --no-iftex ikke behandle @iftex og @tex.\n"
+" --no-ifxml ikke behandle @ifxml og @xml.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Standardverdiene for @if...-betingelsene avhenger av outputformatet:\n"
+" dersom HTML genereres er --ifhtml pĺslĺtt og de andre av;\n"
+" dersom Info genereres er --ifinfo pĺslĺtt og de andre av;\n"
+" dersom ren tekst genereres er --ifplaintext pĺslĺtt og de andre av;\n"
+" dersom XML genereres er --ifxml pĺslĺtt og de andre av.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Eksempler:\n"
+" makeinfo foo.texi skrive Info til foos @setfilename\n"
+" makeinfo --html foo.texi skrive HTML til @setfilename\n"
+" makeinfo --xml foo.texi skrive Texinfo XML til @setfilename\n"
+" makeinfo --docbook foo.texi skrive Docbook XML til @setfilename\n"
+" makeinfo --no-headers foo.texi skrive ren tekst til standard ut\n"
+"\n"
+" makeinfo --html --no-headers foo.texi skrive HTML uten nodelinjer\n"
+" makeinfo --number-sections foo.texi skrive Info med nummererte avsnitt\n"
+" makeinfo --no-split foo.texi skrive en Infofil uansett střrrelse\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: Ignorerer ugjenkjennelig TEXINFO_OUTPUT_FORMAT-verdi Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s arg mĺ vćre numerisk, ikke Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: kunne ikke ĺpne makroekspansjonoutput Ť%sť"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: ignorerer sekundćr makroekspansjonoutpur Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: --paragraph-indent arg mĺ vćre numerisk/Ťnoneť/Ťasisť, ikke Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr "%s: --footnote-style arg mĺ vćre Ťseparateť eller Ťendť, ikke Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: mangler filargument.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Flerlinjekommandoen %c%s brukes ikke riktig"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Forventet Ť%sť"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Kan ikke opprette katalogen Ť%sť: %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Ingen Ť%sť funnet i Ť%sť"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Hopper over makroekspansjon til stdout siden Info-output ogsĺ sendes "
+"dit.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Lager %s-filen Ť%sť fra Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Dette er %s, produsert av makeinfo versjon %s fra %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Fjerner makroutskriftsfilen Ť%sť pĺ grunn av feil; bruk --force for ĺ "
+"bevare.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Fjerner utskriftsfilen Ť%sť pĺ grunn av feil; bruk --force for ĺ "
+"bevare.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Ukjent kommando Ť%sť"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Bruk krřllparenteser for ĺ gi en kommando som et argument til @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s forventet krřllparanteser"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Umatchet }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "INTET_NAVN!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s mangler avsluttende krřllparentes"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image-fil Ť%sť (for HTML) er uleselig: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Ť%sť er ingen fil"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image-fil Ť%sť (for tekstformat) er uleselig: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image mangler filnavn"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "udefinert flagg: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Ingen verdi for Ť%sť}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s krever et navn"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Traff slutt-pĺ-filen fřr matchende @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' er for lang for ekspansjon; ikke ekspandert"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Manglende Ť}ť i @multitable-mal"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ignorerer lřs tekst Ť%sť etter @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "For mange kolonner i multitabellrad (maks %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[uforventet] kan ikke velge kolonne #%d i multitabell"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "ignorerer @tab utenfor multitabell"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Multikolonne-output fra siste rad:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolonne #%d output = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Noden Ť%sť er tidligere definert ved linje %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Skriver noden %s...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Noden Ť%sť krever en inndelingskommando (f.eks. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Ingen nodenavn spesifisert for Ť%c%sť-kommandoen"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Ankeret Ť%sť og noden Ť%sť blir knyttet til det samme filnavnet"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Denne @anchor-kommandoen ble ignorert, referanser til den vil ikke virke"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Omdřpe dette ankeret eller bruk Ť--no-splitť-valget"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Uforventet streng ved slutten av splitt-HTML-fila Ť%sť"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Neste:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Forrige:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Opp:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Ankrene Ť%sť og Ť%sť peker til det samme filnavnet"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "@anchor-kommando ignorert; referanser til den vil ikke virke"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%s referanse til ikke-eksisterende node Ť%sť (kanskje ugyldig inndeling?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Meny"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Kryss"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Nestefeltet til noden Ť%sť er ikke pekt pĺ (kanskje ugyldig inndeling?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Denne noden (%s) har den dĺrlige forrigepekeren"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "forrige"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Forrigefeltet til noden Ť%sť er ikke pekt pĺ"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Denne noden (%s) har den dĺrlige nestepekeren"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "`%s' har ingen Up-felt (kanskje feil inndeling?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "opp"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "Noden Ť%sť mangler et menypunkt for Ť%sť selv om den er dens oppmĺl"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "noden Ť%sť har blitt referert %d ganger"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "ureferert node Ť%sť"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "Fjerner %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Kan ikke slette filen Ť%sť: %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Vedlegg %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Intern feil (search_sectioning) Ť%sť!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Intern feil (search_sectioning) Ť%sť!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s er avlegs; bruk %c%s i stedet"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Node med %ctop som en seksjon eksisterer allerede"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Her er %ctop-noden"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop brukt fřr %cnode, benytter %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Innholdsfortegnelse"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Kort innholdsfortegnelse"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image-fil Ť%sť er uleselig: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"@headitem som siste punkt i en @multitable fřrer til uyldige DocBook-"
+"dokumenter"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: advarsel: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " for %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tPrřv Ť%s --helpť for en komplett liste over valg.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Bruksmĺte: %s [VALG]... [INFOFIL [DIRFIL]]\n"
+"\n"
+"Installere eller slette dir-innslag fra INFOFIL i Info-katalogfilen\n"
+"DIRFIL.\n"
+"\n"
+"Valg:\n"
+" --delete slette eksisterende innslag for INFOFIL fra DIRFIL;\n"
+" ikke sett inn noe nye innslag.\n"
+" --dir-file=NAVN angi filnavnet til Info-katalogfilen.\n"
+" Dette er det samme som ĺ bruke DIRFIL-argumentet.\n"
+" --entry=TEKST sette inn TEKST som en Info-kataloginnslag.\n"
+" TEKST břr ha form som et Info-menypunkt\n"
+" pluss null eller flere linjer som starter med "
+"whitespace.\n"
+" Dersom du angir mer enn et innslag, blir alle lagt "
+"til.\n"
+" Dersom du ikke angir noen innslag, blir de bestemt\n"
+" fra informasjon i selve Infofilen.\n"
+" --help vise denne hjelpen og avslutte.\n"
+" --info-file=FIL angi Infofilen som skal installeres i katalogen.\n"
+" Dette er det samme som ĺ bruke INFOFIL-argumentet.\n"
+" --info-dir=DIR det samme som --dir-file=DIR/dir.\n"
+" --item=TEKST det samme som --entry TEKST.\n"
+" Et Info-kataloginnslag er egentlig et menypunkt.\n"
+" --quiet undertrykke advarsler.\n"
+" --remove det samme som --delete.\n"
+" --section=AVS putte denne filens innslag i avsnittet AVS i katalogen.\n"
+" Dersom du angir mer enn et avsnitt, blir alle "
+"innslagene\n"
+" lagt til i hver av avsnittene.\n"
+" Dersom du ikke angir noen avsnitt, blir de bestemt\n"
+" fra informasjon i selve Infofilen.\n"
+" --version vise programversjon og avslutte.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Dette er filen .../info/dir, som inneholder den řverste\n"
+"noden i Info-hierarkiet, kalt (dir)Top.\n"
+"Fřrste gangen du starter Info begynner du i denne noden.\n"
+"\n"
+"%s\tDette er toppen av INFO-treet\n"
+"\n"
+" Denne katalognoden gir en meny over alle hovedemner.\n"
+" Inntasting av Ťqť avslutter, Ť?ť lister alle Info-kommandoene, Ťdť "
+"returner hit,\n"
+" Ťhť gir en innfřring for nybegynnere,\n"
+" ŤmEmacs<Return>ť besřker Emacs-manualen, osv.\n"
+"\n"
+" I Emacs kan du klikke med musknapp 2 pĺ et menypunkt eller kryssreferanse\n"
+" for ĺ velge den.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: kunne ikke lese (%s) og kunne ikke opprette (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: tom fil"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY uten tilhřrende END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY uten tilhřrende START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: har allerede en dirfil: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Spesifiser infofilen bare en gang.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "overflřdig argument pĺ kommandolinjen Ť%sť"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Ingen innfil angitt; prřv --help for mer informasjon."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Ingen dir-fil angitt; prřv --help for mer informasjon."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "ingen info-dir-oppfřring i Ť%sť"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "menypunktet Ť%sť eksisterer allerede for filen Ť%sť"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "fant ingen oppfřringer for Ť%sť; ingenting slettet"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "vise denne hjelpen og avslutte"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "bevar midlertidige filer etter behandling"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "ikke bevar midlertidige filer etter behandling (standard)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "sende utdata til FILE"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "vise programversjon og avslutte"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Bruksmĺte: %s [VALG]... FIL...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Generere en sortert indeks for hver TeX-outputfil.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Vanligvis er FIL... angitt som Ťfoo.%c%cť for et dokument Ťfoo.texiť.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Valg:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: ikke en texinfo-indeksfil"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "feil ved gjenĺpning av %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Ingen sidenummer i %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "oppfřring %s fřlger en oppfřring med et annet navn"
diff --git a/Build/source/utils/texinfo/po/nl.gmo b/Build/source/utils/texinfo/po/nl.gmo
new file mode 100644
index 00000000000..81ecd32f915
--- /dev/null
+++ b/Build/source/utils/texinfo/po/nl.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/nl.po b/Build/source/utils/texinfo/po/nl.po
new file mode 100644
index 00000000000..20ae5111ce1
--- /dev/null
+++ b/Build/source/utils/texinfo/po/nl.po
@@ -0,0 +1,3273 @@
+# Dutch messages for GNU texinfo
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# Ivo Timmermans <zarq@iname.com>, 1998.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 3.12\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 1998-04-16 22:35+02:00\n"
+"Last-Translator: Ivo Timmermans <zarq@iname.com>\n"
+"Language-Team: Dutch <nl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Beweeg een teken naar voren"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Beweeg een teken naar achteren"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Ga naar het begin van deze regel"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Ga naar het einde van deze regel"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Beweeg een woord naar voren"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Beweeg een woord naar achteren"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Verwijder het teken onder de cursor"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Verwijder het teken achter de cursor"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Annuleer of beëindig operatie"
+
+# completion?
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Accepteer (of forceer voltooiďng van) deze regel"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Voeg volgend teken letterlijk in"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Voeg dit teken in"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Voeg een TAB code in"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transponeer karakters op een punt"
+
+# kill?
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Zet de inhoud van de laatste kill terug"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Kill ring is leeg"
+
+# kill?
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Zet een eerdere kill terug"
+
+# kill?
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Verwijder tot aan het einde van de regel"
+
+# kill?
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Verwijder tot aan het begin van de regel"
+
+# kill?
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Verwijder het woord na de cursor"
+
+# kill?
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Verwijder het woord voor de cursor"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Geen voltooiďngen"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Niet compleet"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Geef een lijst van mogelijke voltooiďngen"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Enige voltooiďng"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Een voltooiďng:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d voltooiďngen:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Voeg voltooiďng in"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Voltooiďngen aan het bouwen..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Verschuif het voltooiďngsvenster"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "De voetnoten konden niet weergegeven worden"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr ""
+"Laat de voetnoten zien die met deze pagina verbonden zijn in een ander "
+"venster"
+
+#: info/footnotes.h:26
+#, fuzzy
+msgid "---------- Footnotes ----------"
+msgstr ""
+"---------- Voetnoten ----------\n"
+"\n"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Zoek een string op in de index voor dit bestand"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Zoeken naar index ingangen..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Geen indices gevonden."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Index ingang: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Ga naar de volgende overeenkomende index-ingang van het laatste `\\[index-"
+"search]' commando"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Geen eerdere index zoek string."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Geen index ingangen."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Geen index ingangen %sdie \"%s\" bevatten."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "meer "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "KAN DIT NIET ZIEN"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"\"%s\" gevonden in %s. (`\\[next-index-match]' probeert de volgende te "
+"vinden.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Zoeken in indices van \"%s\"..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr ""
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Doorzoek alle bekende indices van info-bestanden voor een string en maak een "
+"menu"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Index apropos: "
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Pagina's waarvan de indices \"%s\" bevatten:\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, fuzzy, c-format
+msgid "Try --help for more information.\n"
+msgstr "Probeer --help voor meer informatie."
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Er is GEEN garantie. Je mag deze programmatuur herdistribueren\n"
+"onder de voorwaarden van de GNU General Public License.\n"
+"Voor meer informatie hierover, zie de bestanden met de naam COPYING.\n"
+
+#: info/info.c:498
+#, fuzzy, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "geen ingangen gevonden\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Aanroep: %s [OPTIE]... [INFO-BESTAND [MENU-ITEM...]]]\n"
+"\n"
+"Lees documentatie in Info-formaat\n"
+"Voor een meer complete omschrijving van het gebruik van Info, type `info "
+"info options'.\n"
+"\n"
+"Opties:\n"
+"--directory DIR Voeg DIR toe aan INFOPAD.\n"
+"--dribble BESTAND Onthoud toetsaanslagen in BESTAND.\n"
+"--file BESTAND Specificeer te bekijken Info bestand.\n"
+"--node PAGINANAAM Specificeer pagina's in het eerste Info "
+"bestand.\n"
+"--output BESTAND Schrijf de geselecteerde pagina's naar "
+"BESTAND.\n"
+"--restore BESTAND Lees de eerste toetsaanslagen uit BESTAND.\n"
+"--subnodes Geef recursief alle menu-items.\n"
+"--help Laat deze helptekst zien en beëindig.\n"
+"--version Geef de versie-informatie van Info en "
+"beëindig.\n"
+"\n"
+"Het eerste argument, indien aanwezig, is de naam van het Info-bestand\n"
+"dat ingelezen dient te worden. Alle overige argumenten worden\n"
+"beschouwd als de namen van menu items in de eerste bezochte pagina. Bij\n"
+"voorbeeld, `info emacs buffers' gaat naar de pagina `buffers' in het\n"
+"bestand `emacs'.\n"
+"\n"
+"Meld fouten in het programma aan bug-texinfo@gnu.org;\n"
+"meld onjuistheden in de vertaling aan nl@li.org."
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+
+#: info/info.c:669
+#, fuzzy, c-format
+msgid "Cannot find node `%s'."
+msgstr "Kan pagina `%s' niet verwijderen"
+
+#: info/info.c:670
+#, fuzzy, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Kan pagina `%s' niet verwijderen"
+
+#: info/info.c:671
+#, fuzzy
+msgid "Cannot find a window!"
+msgstr "Kan een permanent venster niet verwijderen"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr ""
+
+#: info/info.c:673
+#, fuzzy
+msgid "Cannot delete the last window."
+msgstr "Kan een permanent venster niet verwijderen"
+
+#: info/info.c:674
+#, fuzzy
+msgid "No menu in this node."
+msgstr "Er is geen menu op deze pagina."
+
+#: info/info.c:675
+#, fuzzy
+msgid "No footnotes in this node."
+msgstr "Geen verwijzingen in deze pagina."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Geen verwijzingen in deze pagina."
+
+#: info/info.c:677
+#, fuzzy, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Geen \"Volgende\" wijzer voor deze pagina."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr ""
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr ""
+
+#: info/info.c:680
+#, fuzzy
+msgid "You are already at the last page of this node."
+msgstr "Ga naar het begin van deze pagina"
+
+#: info/info.c:681
+#, fuzzy
+msgid "You are already at the first page of this node."
+msgstr "Ga naar het begin van deze pagina"
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr ""
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr ""
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ""
+
+#: info/infodoc.c:46 info/infodoc.c:95
+#, fuzzy
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr "Basiscommando's in Info Vensters"
+
+#: info/infodoc.c:49
+#, fuzzy
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "Geen \"Vorige\" voor deze pagina."
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr ""
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr ""
+
+#: info/infodoc.c:53 info/infodoc.c:102
+#, fuzzy
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr "Selecteer de `Vorige' pagina"
+
+#: info/infodoc.c:55
+#, fuzzy
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/infodoc.c:56
+#, fuzzy
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/infodoc.c:57
+#, fuzzy
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "Geen \"Vorige\" voor deze pagina."
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+
+#: info/infodoc.c:61
+#, fuzzy
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "Selecteer de laatste pagina in dit bestand"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+
+#: info/infodoc.c:68 info/infodoc.c:116
+#, fuzzy
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"---------- Voetnoten ----------\n"
+"\n"
+
+# kill?
+#: info/infodoc.c:70
+#, fuzzy
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "Verwijder tot aan het begin van de regel"
+
+#: info/infodoc.c:71
+#, fuzzy
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "Schuif terug in dit venster"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "Schuif terug in dit venster"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:75
+#, fuzzy
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "Schuif terug in dit venster"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+#, fuzzy
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr "Waar is het commando: "
+
+#: info/infodoc.c:79
+#, fuzzy
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "Selecteer de laatste keuze in het menu van deze pagina"
+
+#: info/infodoc.c:80
+#, fuzzy
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "Selecteer de laatste keuze in het menu van deze pagina"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:98
+#, fuzzy, c-format
+msgid " %-10s Quit this help.\n"
+msgstr "Geen \"Vorige\" voor deze pagina."
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr ""
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr ""
+
+#: info/infodoc.c:104
+#, fuzzy, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/infodoc.c:105
+#, fuzzy, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/infodoc.c:106
+#, fuzzy, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr "Geen \"Vorige\" voor deze pagina."
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr ""
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+
+#: info/infodoc.c:110
+#, fuzzy, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr "Selecteer de laatste pagina in dit bestand"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr ""
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr ""
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr ""
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr ""
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr ""
+
+# kill?
+#: info/infodoc.c:120
+#, fuzzy, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr "Verwijder tot aan het begin van de regel"
+
+#: info/infodoc.c:121
+#, fuzzy, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:123
+#, fuzzy, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr "Schuif terug in dit venster"
+
+#: info/infodoc.c:127
+#, fuzzy, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr "Selecteer de laatste keuze in het menu van deze pagina"
+
+#: info/infodoc.c:128
+#, fuzzy, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr "Selecteer de laatste keuze in het menu van deze pagina"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr ""
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr ""
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+
+#: info/infodoc.c:135
+#, fuzzy, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr "Schuif terug in dit venster"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr ""
+
+#: info/infodoc.c:320
+#, fuzzy
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr "Basiscommando's in Info Vensters"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:347
+#, fuzzy, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"De volgende commando's kunnen alleen aangeroepen worden via M-x:\n"
+"\n"
+
+#: info/infodoc.c:351
+#, fuzzy
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"De volgende commando's kunnen alleen aangeroepen worden via M-x:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Gebruik `\\[history-node]' of `\\[kill-node]' om te beëindigen ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Geef een help boodschap"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Ga naar Info pagina `(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Geef uitleg over KEY"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Omschrijf toets: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s is niet gedefinieerd."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s is niet gedefinieerd."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s is gedefinieerd als %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr ""
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Waar is het commando: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' is niet toegekend aan een toets"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s kan alleen aangeroepen worden via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s kan aangeroepen worden via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Er is geen functie met de naam `%s'"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Er is GEEN garantie. Je mag deze programmatuur herdistribueren\n"
+"onder de voorwaarden van de GNU General Public License.\n"
+"Voor meer informatie hierover, zie de bestanden met de naam COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr ""
+
+#: info/infokey.c:201
+#, fuzzy, c-format
+msgid "cannot open input file `%s'"
+msgstr "Kan pijp naar \"%s\" niet openen."
+
+#: info/infokey.c:215
+#, fuzzy, c-format
+msgid "cannot create output file `%s'"
+msgstr "Kan uitvoerbestand \"%s\" niet vinden."
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr ""
+
+#: info/infokey.c:232
+#, fuzzy, c-format
+msgid "error closing output file `%s'"
+msgstr "Kan uitvoerbestand \"%s\" niet vinden."
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr ""
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr ""
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr ""
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr ""
+
+#: info/infokey.c:665
+#, fuzzy
+msgid "missing action name"
+msgstr "%c%s ontbrekende afsluitende accolade"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr ""
+
+#: info/infokey.c:688
+#, fuzzy, c-format
+msgid "unknown action `%s'"
+msgstr "Onbekend commando `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr ""
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr ""
+
+#: info/infokey.c:723
+#, fuzzy
+msgid "missing variable name"
+msgstr "%s: ontbrekend bestandsargument\n"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr ""
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr ""
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr ""
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr ""
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr ""
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr ""
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr ""
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Lees de naam van een Info commando en geef een omschrijving"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Omschrijf commando: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Lees de naam van een commando in de weergeefruimte en voer dat uit"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Kan hier geen `echo-area' commando uitvoeren."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "Onbekend commando `%s'"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Zet de hoogte van het weergegeven venster"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Zet schermhoogte op (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Bronbestanden veranderd om dit bestand in te voegen:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Kon het bestand %s niet manipuleren.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Bestand)Pagina Regels Grootte Bevat Bestand\n"
+" --------------- ----- ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Hier is het menu van pagina's die je recentelijk bekeken hebt.\n"
+"Selecteer er een uit dit menu, of gebruik `\\[history-node]' in een ander "
+"venster.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Maak een venster met een menu van alle bekeken pagina's"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Selecteer een pagina die voorheen bekeken is in een zichtbaar venster"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Selecteer een bezochte pagina: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "De verwijzing is verdwenen! (%s)."
+
+#: info/session.c:162
+#, fuzzy, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Welkom bij Info versie %s. \"\\[get-help-window]\" voor hulp, \"\\[menu-item]"
+"\" voor een menukeuze."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Ga naar de volgende regel"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Ga naar de vorige regel"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Ga naar het einde van de regel"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Ga naar het begin van de regel"
+
+#: info/session.c:860 makeinfo/node.c:1424
+#, fuzzy
+msgid "Next"
+msgstr "Volgende"
+
+#: info/session.c:863
+#, fuzzy
+msgid "Following Next node..."
+msgstr "\"Volgende\" pagina aan het volgen..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Ik selecteer de eerste keuze uit het menu..."
+
+#: info/session.c:893
+#, fuzzy
+msgid "Selecting Next node..."
+msgstr "Ik selecteer de \"Volgende\" pagina..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr ""
+
+#: info/session.c:988
+#, fuzzy
+msgid "No more nodes within this document."
+msgstr "Geen verwijzingen in deze pagina."
+
+#: info/session.c:1011
+#, fuzzy
+msgid "No `Prev' for this node."
+msgstr "Geen \"Vorige\" voor deze pagina."
+
+#: info/session.c:1014 info/session.c:1073
+#, fuzzy
+msgid "Moving Prev in this window."
+msgstr "Ik beweeg \"Vorige\" naar dit venster."
+
+#: info/session.c:1030
+#, fuzzy
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Geen \"Vorige\" of \"Omhoog\" voor deze pagina."
+
+#: info/session.c:1034
+#, fuzzy
+msgid "Moving Up in this window."
+msgstr "Ik ga \"Omhoog\" in dit venster."
+
+#: info/session.c:1084
+#, fuzzy
+msgid "Moving to `Prev's last menu item."
+msgstr "Ik ga naar de laatste keuze van het menu van \"Vorige\"."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Beweeg naar voren of beneden door de paginastructuur"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Beweeg naar achteren of boven door de paginastructuur"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Schuif verder in dit venster"
+
+#: info/session.c:1213
+#, fuzzy
+msgid "Scroll forward in this window and set default window size"
+msgstr "Schuif verder in dit venster"
+
+#: info/session.c:1221
+#, fuzzy
+msgid "Scroll forward in this window staying within node"
+msgstr "Schuif verder in dit venster"
+
+#: info/session.c:1229
+#, fuzzy
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr "Schuif verder in dit venster"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Schuif terug in dit venster"
+
+#: info/session.c:1245
+#, fuzzy
+msgid "Scroll backward in this window and set default window size"
+msgstr "Schuif terug in dit venster"
+
+#: info/session.c:1254
+#, fuzzy
+msgid "Scroll backward in this window staying within node"
+msgstr "Schuif terug in dit venster"
+
+#: info/session.c:1262
+#, fuzzy
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr "Schuif terug in dit venster"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Ga naar het begin van deze pagina"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Ga naar het einde van deze pagina"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr ""
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr ""
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr ""
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr ""
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Selecteer het volgende venster"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Selecteer het vorige venster"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Splits het huidige venster"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Verwijder het huidige venster"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Kan een permanent venster niet verwijderen"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Verwijder alle andere vensters"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Verschuif het andere venster"
+
+#: info/session.c:1652
+#, fuzzy
+msgid "Scroll the other window backward"
+msgstr "Verschuif het andere venster"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Vergroot (of verklein) dit venster"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Verdeel de beschikbare schermruimte tussen de zichtbare vensters"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Verander de status van regeldoorlopen in het huidige venster"
+
+#: info/session.c:1848
+#, fuzzy
+msgid "Select the Next node"
+msgstr "Selecteer de `Volgende' pagina"
+
+#: info/session.c:1856
+#, fuzzy
+msgid "Select the Prev node"
+msgstr "Selecteer de `Vorige' pagina"
+
+#: info/session.c:1864
+#, fuzzy
+msgid "Select the Up node"
+msgstr "Selecteer de `Omhoog' pagina"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Selecteer de laatste pagina in dit bestand"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Dit venster heeft geen extra pagina's"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Selecteer de eerste pagina in dit bestand"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Selecteer de laatste keuze in het menu van deze pagina"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Selecteer deze menukeuze"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Er zijn geen %d keuzes in dit menu."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menukeuze (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menukeuze: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Volg verwijzing (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Volg verwijzing: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Lees een menukeuze en selecteer zijn pagina"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Lees een voetnoot of verwijzing en selecteer zijn pagina"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Ga naar het begin van het menu van deze pagina"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Ga naar zo veel mogelijk menukeuzes tegelijk"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Lees de naam van een pagina en selecteer die"
+
+#: info/session.c:2436 info/session.c:2441
+#, fuzzy
+msgid "Goto node: "
+msgstr "Ga naar Pagina: "
+
+#: info/session.c:2505
+#, fuzzy, c-format
+msgid "No menu in node `%s'."
+msgstr "Geen pagina's meer."
+
+#: info/session.c:2551
+#, fuzzy, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Er is geen menukeuze \"%s\" op deze pagina."
+
+#: info/session.c:2581
+#, fuzzy, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Kon de pagina, waarnaar verwezen werd door \"%s\", niet vinden."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr ""
+
+#: info/session.c:2633
+#, fuzzy
+msgid "Follow menus: "
+msgstr "Volg verwijzing: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr ""
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr ""
+
+# manpage?
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Lees een manpagina verwijzing en selecteer die"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Ga naar manpagina: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Selecteer de `Top' pagina in dit bestand"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Selecteer de pagina `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Verwijder pagina (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Kan pagina `%s' niet verwijderen"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Kan de laatste pagina niet verwijderen"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Selecteer de laatst geselecteerde pagina"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Sluit deze pagina"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Lees de naam van een bestand en selecteer die"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Vind bestand: "
+
+#: info/session.c:3108
+#, fuzzy, c-format
+msgid "Cannot find `%s'."
+msgstr "Kan \"%s\" niet vinden."
+
+#: info/session.c:3151 info/session.c:3269
+#, fuzzy, c-format
+msgid "Could not create output file `%s'."
+msgstr "Kan uitvoerbestand \"%s\" niet vinden."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Klaar."
+
+#: info/session.c:3220
+#, fuzzy, c-format
+msgid "Writing node %s..."
+msgstr "Bezig met schrijven van pagina \"%s\"..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Sluis de inhoud van deze pagina door INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, fuzzy, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Kan pijp naar \"%s\" niet openen."
+
+#: info/session.c:3337
+#, fuzzy, c-format
+msgid "Printing node %s..."
+msgstr "Bezig met afdrukken van pagina \"%s\"..."
+
+#: info/session.c:3567
+#, fuzzy, c-format
+msgid "Searching subfile %s ..."
+msgstr "Bezig met zoeken naar sub-bestand \"%s\"..."
+
+#: info/session.c:3619
+#, fuzzy
+msgid "Read a string and search for it case-sensitively"
+msgstr "Lees een tekenreeks en zoek daar naar"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Lees een tekenreeks en zoek daar naar"
+
+#: info/session.c:3634
+#, fuzzy
+msgid "Read a string and search backward for it"
+msgstr "Lees een tekenreeks en zoek daar naar"
+
+#: info/session.c:3670 info/session.c:3677
+#, fuzzy, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s voor tekenreeks [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Achteruit zoeken"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Zoek"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr ""
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr ""
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Niet gevonden."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr ""
+
+#: info/session.c:3739 info/session.c:3749
+#, fuzzy
+msgid "No previous search string"
+msgstr "Geen eerdere index zoek string."
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr ""
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Zoek interactief naar een string als je het intypt"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "Achteruit I-zoeken: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-zoeken: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Niet gelukt: "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Ga naar de vorige verwijzing"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Ga naar de volgende verwijzing"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Selecteer verwijzing of menukeuze van deze regel"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Annuleer huidige operatie"
+
+# Zie Cancel current action
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Afgebroken"
+
+#: info/session.c:4398
+#, fuzzy
+msgid "Move the cursor to a specific line of the window"
+msgstr "Beweeg de cursor naar een bepaalde regel van het venster"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Herschrijf het venster"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Stop met Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr ""
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Onbekend commando (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" is ongeldig"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" is ongeldig"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Voeg dit cijfer toe aan het huidige numerieke argument"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Begin een nieuw numeriek argument of vermenigvuldig het huidige met 4"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Intern gebruikt door \\[universeel-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Geen virtueel geheugen meer!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Indien \"Aan\", verschijnen en verdwijnen voetnoten automatisch"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Indien \"Aan\", verandert het aanmaken of verwijderen van een venster de "
+"grootte van andere vensters"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr ""
+"Indien \"Aan\", laat het scherm flikkeren in plaats van het laten horen van "
+"een piep"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Indien \"Aan\", zorgen fouten voor een belsignaal"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Indien \"Aan\", haalt Info rommel weg voor bestanden die gedecomprimeerd "
+"moesten worden"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr ""
+"Indien \"Aan\", wordt het overeenkomende deel van de zoek-tekenreeks "
+"opgelicht"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+"Stelt in wat er gebeurt als er aan het eind van een node verschoven wordt"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Het aantal regels dat verschuift als de cursor uit het venster gaat"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Indien \"Aan\", accepteert Info ISO Latin tekens en laat ze zien"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Leg het gebruik van een variabele uit"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Omschrijf variabele: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Zet de waarde van een Info variabele"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Stel variabele in: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Geef een waarde voor %s (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Geef een waarde voor %s (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Tags zijn verouderd ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), regels ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d regels --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d regels --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr "Sub-bestand: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: optie `%s' is dubbelzinnig\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: optie `--%s' staat geen argumenten toe\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: optie `%c%s' staat geen argumenten toe\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: optie `%s' vereist een argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: onbekende optie `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: onbekende optie `%c%s'\n"
+
+# Dit is de POSIX versie van de volgende melding
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ongeldige optie -- %c\n"
+
+# Dezelfde tekst als hiervoor
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ongeldige optie -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: optie vereist een argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: optie `-W %s' is dubbelzinnig\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: optie `-W %s' staat geen argumenten toe\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "Verkeerd argument voor %c%s"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "Januari"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "Februari"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "Maart"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "April"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "Mei"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "Juni"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "Juli"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "Augustus"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "September"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "Oktober"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "November"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "December"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr ""
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr ""
+
+#: makeinfo/cmds.c:1034
+#, fuzzy, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "`%cend' verwachtte `%s', maar heb `%s' gezien"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr ""
+
+#: makeinfo/cmds.c:1082
+#, fuzzy, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "`%cend' verwachtte `%s', maar heb `%s' gezien"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s is verouderd"
+
+#: makeinfo/cmds.c:1414
+#, fuzzy, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "%csp vereist een postief numeriek argument"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Verkeerd argument voor %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "geen"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "Verkeerd argument voor %c%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+#, fuzzy
+msgid "Missing `}' in @def arg"
+msgstr "Ontbrekende `}' in het argument voor %cdef"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Functie"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Speciaal Formulier"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variabele"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Gebruikersoptie"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instantievariabele"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Methode"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr ""
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+#, fuzzy
+msgid "on"
+msgstr "geen"
+
+# Is die x een foutje?
+#: makeinfo/defun.c:711
+#, fuzzy, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Moet in een `%s' `insertion' zitten om `%s'x te gebruiken"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' heeft een argument `{...}' nodig, niet slechts `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Geen afsluitende accolade voor voetnoot `%s'"
+
+# mooi vertaald he?
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Voetnoot gedefinieerd zonder referentie pagina"
+
+# mooi vertaald he?
+#: makeinfo/footnote.c:210
+#, fuzzy
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Voetnoot gedefinieerd zonder referentie pagina"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+#, fuzzy
+msgid "Footnotes"
+msgstr "-Voetnoten"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr ""
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, fuzzy, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "%s: onbekende optie `--%s'\n"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Onbekende index `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Index `%s' bestaat al"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Onbekende index `%s' en/of `%s' in @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Onbekende index `%s' in @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr ""
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr ""
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr ""
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Verkeerd-Type in insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Enumeratiestapel overloop"
+
+# FIXME: hoe vertaal je `lettering'? tegenover enumerating
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "lettering overloop, start opnieuw bij %c"
+
+# FIXME: formatter?
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s vereist een argument: de formatteerder voor %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, fuzzy, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`%cend' verwachtte `%s', maar heb `%s' gezien"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Geen overeenkomende `%cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s vereist een letter of cijfer"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr ""
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "%citemx is zinloos in een `%s' blok"
+
+#: makeinfo/insertion.c:1949
+#, fuzzy
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "%cmenu gezien voor de eerste pagina"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+
+#: makeinfo/insertion.c:1962
+#, fuzzy
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "%cmenu gezien voor de eerste pagina"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "%citemx is zinloos in een `%s' blok"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Niet overeenkomende `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "`%c%s' verwacht er iets na"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Verkeerd argument voor `%s', `%s', gebruik `%s'"
+
+#: makeinfo/insertion.c:2171
+#, fuzzy, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "%citemx is zinloos in een `%s' blok"
+
+#: makeinfo/insertion.c:2180
+#, fuzzy, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "%citemx is zinloos in een `%s' blok"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s buiten een invoeg-blok gevonden"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr ""
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "%s: onbekende optie `--%s'\n"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr ""
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s verwacht `i' of `j' als argument, niet `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s verwacht één enkele `i' of `j' als argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makro `%s' al eerder gedefinieerd"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "hier is de vorige definitie van `%s'"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+
+#: makeinfo/macro.c:401
+#, fuzzy, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makro `%s' aangeroepen met te veel argumenten"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend makro niet gevonden"
+
+#: makeinfo/macro.c:624
+#, fuzzy
+msgid "@quote-arg only useful for single-argument macros"
+msgstr ""
+"%cquote-arg is allen nuttig indien de makro slechts een argument verwacht"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Te veel fouten! Ik heb het maar opgegeven.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: waarschuwing: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Verkeerd geplaatste %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Probeer `%s --help' voor meer informatie.\n"
+
+#: makeinfo/makeinfo.c:343
+#, fuzzy, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Aanroep: %s [OPTIE]... BESTAND...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s argument moet numeriek zijn, niet `%s'.\n"
+
+# Vanaf hier
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Kon uitvoer `%s' voor makro-uitbreiding niet openen"
+
+# Vanaf hier
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "Kon uitvoer `%s' voor makro-uitbreiding niet openen"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: argument voor --paragraph-indent moet numeriek, `none' of `asis' zijn, "
+"niet `%s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: argument voor --footnote-style moet `separate' of `end' zijn, niet `%"
+"s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: ontbrekend bestandsargument\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Verwachtte `%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Geen `%s' gevonden in `%s'"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Makro uitbreiding naar de standaard uitvoer overgeslagen, want de "
+"uitvoer\n"
+"van Info gaat daar al heen.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Bezig met het maken van een %s-bestand `%s' van `%s'.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, fuzzy, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Dit is Info bestand %s, gemaakt door Makeinfo versie %d.%d"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: makro uitvoer bestand `%s' weggehaald wegens fouten; gebruik --force om "
+"te bewaren.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: uitvoer bestand `%s' weggehaald wegens fouten; gebruik --force om te "
+"bewaren.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Onbekend commando `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, fuzzy, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "commandoregel-argument `%s' te veel"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s verwachtte `{...}'"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Niet-overeenkomende }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "GEEN_NAAM!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s ontbrekende afsluitende accolade"
+
+#: makeinfo/makeinfo.c:3309
+#, fuzzy, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image bestand `%s' onleesbaar: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "Geen `%s' gevonden in `%s'"
+
+#: makeinfo/makeinfo.c:3447
+#, fuzzy, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image bestand `%s' onleesbaar: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "ontbrekend bestandsnaam argument voor @image"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, fuzzy, c-format
+msgid "{No value for `%s'}"
+msgstr "{Geen waarde voor \"%s\"}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s vereist een naam"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Kwam bestandseinde tegen voor een overeenkomende @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+#, fuzzy
+msgid "Missing } in @multitable template"
+msgstr "Ontbrekende `}' in het argument voor %cdef"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "onbeheerde tekst `%s' na @multitable genegeerd"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Te veel kolommen in `multitable' item (maximaal %d)"
+
+#: makeinfo/multi.c:555
+#, fuzzy, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "Kan kolom #%d niet selecteren in `multitabel'"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "@tab buiten een `multitable' genegeerd"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Multikolom uitvoer van laatste regel:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolom #%d: uitvoer = %s\n"
+
+#: makeinfo/node.c:280
+#, fuzzy, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "makro `%s' al eerder gedefinieerd"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Pagina %s wordt geformatteerd...\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Pagina `%s' vereist een sectiecommando (bijv. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr ""
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr ""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr ""
+
+#: makeinfo/node.c:991
+#, fuzzy
+msgid "Next:"
+msgstr "Volgende"
+
+#: makeinfo/node.c:1007
+#, fuzzy
+msgid "Previous:"
+msgstr "Vorige"
+
+#: makeinfo/node.c:1021
+#, fuzzy
+msgid "Up:"
+msgstr "Omhoog"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s verwijst naar niet-bestaande pagina `%s'"
+
+#: makeinfo/node.c:1363
+#, fuzzy
+msgid "Menu"
+msgstr "* Menu:\n"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr ""
+
+# Deze zes meldingen:
+# next, prev en up niet vertalen, dit is wat er in de broncode staat.
+# Het is duidelijker indien onvertaald.
+#: makeinfo/node.c:1447
+#, fuzzy, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr "Het `next'-veld van pagina `%s' wijst niet terug op"
+
+#: makeinfo/node.c:1450
+#, fuzzy, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Deze node (`%s') is degene met het foute `next'-veld"
+
+#: makeinfo/node.c:1462
+#, fuzzy
+msgid "Prev"
+msgstr "Vorige"
+
+#: makeinfo/node.c:1505
+#, fuzzy, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Het `prev'-veld van node (`%s') wijst niet terug op"
+
+#: makeinfo/node.c:1509
+#, fuzzy, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Deze node (`%s') is degene met het foute `next'-veld"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+#, fuzzy
+msgid "Up"
+msgstr "Omhoog"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+
+# Eigenlijk zouden hier de %s en de %d omgedraaid moeten worden:
+# `Er wordt %d keer naar %s verwezen'
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "er wordt naar pagina `%s' %d keer verwezen"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "naar pagina `%s' wordt niet verwezen"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Kan uitvoerbestand \"%s\" niet vinden."
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr ""
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr ""
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr ""
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s is verouderd; gebruik in plaats daarvan %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Pagina met %ctop als sectie bestaat al"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Hier is de %ctop pagina"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop wordt voor %cnode gebruikt, neem standaard %s aan"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr ""
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr ""
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image bestand `%s' onleesbaar: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: waarschuwing: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " voor %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tProbeer `%s --help' voor een volledige lijst van opties.\n"
+
+#: util/install-info.c:434
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"%s [OPTIE]... [INFO-BESTAND [INHOUD-BESTAND]]\n"
+"\n"
+"Installeer INFO-BESTAND in het Info inhoudbestand INHOUD-BESTAND.\n"
+"\n"
+"Opties:\n"
+"--delete Verwijder bestaande ingangen in INFO-BESTAND;\n"
+" voeg geen nieuwe ingangen toe.\n"
+"--dir-file=NAAM Geef bestandsnaam van het Info inhoudbestand.\n"
+" Dit is equivalent aan het argument INDEX-BESTAND.\n"
+"--entry=TEKST Voeg TEKST in als een Info inhoudsingang.\n"
+" TEKST moet het uiterlijk hebben van een Info menukeuze\n"
+" regel met nul of meer extra regels beginnend met een\n"
+" leeg teken. Als je meer dan een ingang geeft, worden ze\n"
+" allemaal toegevoegd. Als je geen ingangen geeft, worden\n"
+" ze uit de informatie uit het Info bestand zelf "
+"opgemaakt.\n"
+"--help Geef deze hulp en beëindig.\n"
+"--info-file=BEST Geef een Info bestand om in de inhoud in op te nemen.\n"
+" Dit is gelijkwaardig aan het argument INFO-BESTAND.\n"
+"--info-dir=MAP Zelfde als --dir-file=MAP/dir.\n"
+"--item=TEKST Zelfde als --entry TEKST.\n"
+" Een Info inhoudsingang is eigenlijk een menukeuze.\n"
+"--quiet Onderdruk waarschuwingen.\n"
+"--remove Zelfde als --delete.\n"
+"--section=SEC Zet deze ingangen in sectie SEC van de index.\n"
+" Als je meer dan een sectie geeft, worden alle ingangen\n"
+" aan alle secties toegevoegd.\n"
+" Als je geen ingangen geeft, worden ze uit de informatie\n"
+" uit het Info bestand zelf opgemaakt.\n"
+"--version Geef versie-informatie en beëindig.\n"
+"\n"
+"Meld fouten in het programma aan bug-texinfo@gno.org;\n"
+"meld onjuistheden in de vertaling aan nl@li.org.\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Dit is het bestand .../info/dir, dat de bovenste pagina van de Info\n"
+"structuur bevat, genaamd (dir)Top. De eerste keer dat je Info start,\n"
+"begin je deze pagina te lezen.\n"
+"\n"
+"Bestand: dir Pagina: Top Dit is de bovenste pagina van de INFO "
+"structuur\n"
+"\n"
+" Deze (Inhoud) pagina geeft een menu van hoofdonderwerpen.\n"
+" \"q\" beëindigt, \"?\" geeft een lijst met allen Info commando's, \"d\"\n"
+" brengt je hier terug, \"h\" geeft een inleiding voor de eerste keer,\n"
+" \"mEmacs<Return>\" gaat naar de Emacs pagina's, etc.\n"
+"\n"
+" Binnen Emacs kun je met muisknop 2 op een item of verwijzing klikken\n"
+" om er heen te gaan.\n"
+"\n"
+"* Menu:\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: niet leesbaar (%s) en het kon ook niet aanmaken (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr ""
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY zonder overeenkomende END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY zonder overeenkomende START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Geef het Info bestand slechts een keer.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "commandoregel-argument `%s' te veel"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Geen invoerbestand gegeven; probeer --help voor meer informatie."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Geen inhoudbestand gegeven; probeer --help voor meer informatie."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "geen info inhoudsingang in `%s'"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "menukeuze `%s' bestaat al, voor bestand `%s'"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "geen ingangen voor `%s' gevonden; niets verwijderd"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "geef deze hulp en beëindig"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "behoud tijdelijke bestanden na verwerking"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "behoud de tijdelijke bestanden na verwerking niet (standaard)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "stuur uitvoor naar BESTAND"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "geef versie informatie en beëindig"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Aanroep: %s [OPTIE]... BESTAND...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Maak een gesorteerde index voor elk TeX uitvoer BESTAND.\n"
+
+#: util/texindex.c:274
+#, fuzzy, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Normaal gesproken is BESTAND... `foo.??' voor een dokument `foo.texi'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opties:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: geen texinfo inhoudbestand"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "fout bij het heropenen van %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr ""
+
+# FIXME: secondary
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "ingang %s volgt op een ingang met een alternatieve naam"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Geef de Info inhoud slechts een keer.\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" is ongeldig"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Je kunt niet meer dan een uitvoer voor makro-uitbreiding geven"
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "`.' of `,' moeten op een verwijzing volgen, niet %c"
+
+#, fuzzy
+#~ msgid "Node:"
+#~ msgstr "Volgende"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "virtuele geheugen vol"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s; voor bestand `%s'.\n"
+
+#, fuzzy
+#~ msgid "`%s' has no Up field"
+#~ msgstr "Node `%s' heeft geen `up'-veld"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "Schuif terug in dit venster"
+
+#, fuzzy
+#~ msgid "----------------------\n"
+#~ msgstr ""
+#~ "---------- Voetnoten ----------\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "---------------\n"
+#~ msgstr ""
+#~ "---------- Voetnoten ----------\n"
+#~ "\n"
+
+# tot hier (half af)
+#, fuzzy
+#~ msgid ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "Translate Texinfo source documentation to various other formats:\n"
+#~ "Info files suitable for reading online with Emacs or standalone GNU Info\n"
+#~ "(by default); plain text (with --no-headers); or HTML (with --html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names allow @ commands in node names.\n"
+#~ " -D VAR define a variable, as with @set.\n"
+#~ "--docbook output DocBook rather than Info format.\n"
+#~ " -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+#~ " --error-limit=NUM quit after NUM errors (default %d).\n"
+#~ " --fill-column=NUM break Info lines at NUM characters (default %"
+#~ "d).\n"
+#~ " --footnote-style=STYLE output footnotes according to STYLE:\n"
+#~ " `separate' to place footnotes in their own "
+#~ "node,\n"
+#~ " `end' to place the footnotes at the end of "
+#~ "the\n"
+#~ " node in which they are defined (the "
+#~ "default).\n"
+#~ " --force preserve output even if errors.\n"
+#~ " --help display this help and exit.\n"
+#~ " --html output HTML rather than Info format.\n"
+#~ " -I DIR append DIR to the @include search path.\n"
+#~ " --ifhtml process @ifhtml and @html text even when not\n"
+#~ " generating HTML.\n"
+#~ " --ifinfo process @ifinfo text even when generating "
+#~ "HTML.\n"
+#~ " --iftex process @iftex and @tex text.\n"
+#~ " implies --no-split.\n"
+#~ msgstr ""
+#~ "Aanroep: %s [OPTIE]... TEXINFO-BESTAND...\n"
+#~ "\n"
+#~ "Vertaal Texinfo brondocumentatie naar een formaat dat geschikt is om "
+#~ "gelezen\n"
+#~ "te worden met GNU Info.\n"
+#~ "\n"
+#~ "Opties:\n"
+#~ "-D VAR definieer een variabele, zoals met @set.\n"
+#~ "-E MACRO-OFILE behandel alleen makro's, schrijf texinfo "
+#~ "broncode.\n"
+#~ "-I MAP voeg MAP toe achter het @include mappenzoekpad.\n"
+#~ "-P MAP voeg MAP toe voor het @include mappenzoekpad.\n"
+#~ "-U VAR ondefinieer een variabele, zoals met @clear.\n"
+#~ "--error-limit NUM beëindig na een NUM aantal fouten (standaard %d).\n"
+#~ "--fill-column POS breek regels af op positie POS (standaard %d).\n"
+#~ "--footnote-style STIJL schrijf voetnoten volgens STIJL:\n"
+#~ " `separate' om voetnoten in een eigen pagina te "
+#~ "plaatsen,\n"
+#~ " `end' om voetnoten aan het einde van de pagina "
+#~ "te plaatsen\n"
+#~ " waarin ze gedefinieerd zijn (standaard).\n"
+#~ "--force bewaar de uitvoer ook bij fouten.\n"
+#~ "--help laat deze hulp zien en beëindig.\n"
+#~ "--no-validate onderdruk validatie van referenties.\n"
+#~ "--no-warn onderdruk waarschuwingen (maar fouten niet).\n"
+#~ "--no-split onderdruk het splitsen van grote bestanden.\n"
+#~ "--no-headers onderdruk paginascheidingen en Pagina: Foo "
+#~ "koppen.\n"
+#~ "--output BEST, -o BEST schrijf naar BEST, en negeer een @setfilename.\n"
+#~ "--paragraph-indent VAL spring alinea's in met VAL spaties (standaard %"
+#~ "d).\n"
+#~ " spring niet in indien VAL `none' is; behoud "
+#~ "bestaande\n"
+#~ " inspringing indien VAL `asis' is.\n"
+#~ "--reference-limit NUM klaag over hoogstens NUM verwijzingen (standaard %"
+#~ "d).\n"
+#~ "--verbose meld wat gedaan wordt.\n"
+#~ "--version geef versie-informatie en beëindig.\n"
+#~ "\n"
+#~ "Meld fouten in het programma aan bug-texinfo@gnu.org;\n"
+#~ "meld onjuistheden in de vertaling aan nl@li.org.\n"
+
+# tot hier (half af)
+#, fuzzy
+#~ msgid ""
+#~ " --no-headers suppress Info node separators and Node: "
+#~ "lines;\n"
+#~ " write to standard output without --output.\n"
+#~ " --no-ifhtml do not process @ifhtml and @html text.\n"
+#~ " --no-ifinfo do not process @ifinfo text.\n"
+#~ " --no-iftex do not process @iftex and @tex text.\n"
+#~ " --no-split suppress splitting of Info or HTML output,\n"
+#~ " generate only one output file.\n"
+#~ " --no-validate suppress node cross-reference validation.\n"
+#~ " --no-warn suppress warnings (but not errors).\n"
+#~ " --number-sections include chapter, section, etc. numbers in "
+#~ "output.\n"
+#~ " -o, --output=FILE output to FILE (directory if split HTML),\n"
+#~ " ignoring any @setfilename.\n"
+#~ " -P DIR prepend DIR to the @include search path.\n"
+#~ " --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+#~ "d).\n"
+#~ " if VAL is `none', do not indent;\n"
+#~ " if VAL is `asis', preserve existing "
+#~ "indentation.\n"
+#~ " --reference-limit=NUM warn about at most NUM references (default %"
+#~ "d).\n"
+#~ " --split-size=NUM split into files at NUM size. (default %d).\n"
+#~ " -U VAR undefine a variable, as with @clear.\n"
+#~ " -v, --verbose explain what is being done.\n"
+#~ " --version display version information and exit.\n"
+#~ " --xml output XML (TexinfoML) rather than Info "
+#~ "format.\n"
+#~ msgstr ""
+#~ "Aanroep: %s [OPTIE]... TEXINFO-BESTAND...\n"
+#~ "\n"
+#~ "Vertaal Texinfo brondocumentatie naar een formaat dat geschikt is om "
+#~ "gelezen\n"
+#~ "te worden met GNU Info.\n"
+#~ "\n"
+#~ "Opties:\n"
+#~ "-D VAR definieer een variabele, zoals met @set.\n"
+#~ "-E MACRO-OFILE behandel alleen makro's, schrijf texinfo "
+#~ "broncode.\n"
+#~ "-I MAP voeg MAP toe achter het @include mappenzoekpad.\n"
+#~ "-P MAP voeg MAP toe voor het @include mappenzoekpad.\n"
+#~ "-U VAR ondefinieer een variabele, zoals met @clear.\n"
+#~ "--error-limit NUM beëindig na een NUM aantal fouten (standaard %d).\n"
+#~ "--fill-column POS breek regels af op positie POS (standaard %d).\n"
+#~ "--footnote-style STIJL schrijf voetnoten volgens STIJL:\n"
+#~ " `separate' om voetnoten in een eigen pagina te "
+#~ "plaatsen,\n"
+#~ " `end' om voetnoten aan het einde van de pagina "
+#~ "te plaatsen\n"
+#~ " waarin ze gedefinieerd zijn (standaard).\n"
+#~ "--force bewaar de uitvoer ook bij fouten.\n"
+#~ "--help laat deze hulp zien en beëindig.\n"
+#~ "--no-validate onderdruk validatie van referenties.\n"
+#~ "--no-warn onderdruk waarschuwingen (maar fouten niet).\n"
+#~ "--no-split onderdruk het splitsen van grote bestanden.\n"
+#~ "--no-headers onderdruk paginascheidingen en Pagina: Foo "
+#~ "koppen.\n"
+#~ "--output BEST, -o BEST schrijf naar BEST, en negeer een @setfilename.\n"
+#~ "--paragraph-indent VAL spring alinea's in met VAL spaties (standaard %"
+#~ "d).\n"
+#~ " spring niet in indien VAL `none' is; behoud "
+#~ "bestaande\n"
+#~ " inspringing indien VAL `asis' is.\n"
+#~ "--reference-limit NUM klaag over hoogstens NUM verwijzingen (standaard %"
+#~ "d).\n"
+#~ "--verbose meld wat gedaan wordt.\n"
+#~ "--version geef versie-informatie en beëindig.\n"
+#~ "\n"
+#~ "Meld fouten in het programma aan bug-texinfo@gnu.org;\n"
+#~ "meld onjuistheden in de vertaling aan nl@li.org.\n"
+
+#~ msgid "The `%c%s' command is meaningless within a `@%s' block"
+#~ msgstr "Het `%c%s' commando is zinloos in een `@%s' blok"
+
+#~ msgid "Virtual memory exhausted in %s ()! Needed %d bytes."
+#~ msgstr "Virtueel geheugen vol in %s ()! Had %d bytes nodig."
+
+#~ msgid "How did @%s end up in cm_special_char?\n"
+#~ msgstr "Hoe kwam @%s in cm_special_char terecht?\n"
+
+#~ msgid "multitable item not in active multitable"
+#~ msgstr "`multitable' item niet in een aktieve `multitable'"
+
+#, fuzzy
+#~ msgid "Up field for `%s' is `%s', but `%s' lacks menu item for `%s'"
+#~ msgstr ""
+#~ "`%s' heeft `%s' als `up'-veld, maar `%s' heeft geen menukeuze voor `%s'"
+
+#~ msgid " times"
+#~ msgstr " keer"
+
+#~ msgid "%d times"
+#~ msgstr "%d keer"
+
+#~ msgid "Top"
+#~ msgstr "Top"
+
+#~ msgid "Writing node \"(%s)%s\"..."
+#~ msgstr "Bezig met schrijven van pagina \"(%s)%s\"..."
+
+#~ msgid "Printing node \"(%s)%s\"..."
+#~ msgstr "Bezig met afdrukken van pagina \"(%s)%s\"..."
+
+#~ msgid " from the input file %s.\n"
+#~ msgstr " uit het invoerbestand %s.\n"
+
+#~ msgid "%c%s expects a single character as an argument"
+#~ msgstr "%c%s verwacht één enkel teken als argument"
+
+#~ msgid "Node `%s' multiply defined (line %d is first definition at)"
+#~ msgstr ""
+#~ "Pagina `%s' meerdere keren gedefinieerd (de eerste definitie is op regel %"
+#~ "d)"
+
+#~ msgid "This node (`%s') is the one with the bad `Prev'"
+#~ msgstr "Deze node (`%s') is degene met het foute `prev'-veld"
+
+#~ msgid "creating `Top' node"
+#~ msgstr "`Top' pagina wordt aangemaakt"
+
+#~ msgid ""
+#~ "* Menu:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "* Menu:\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Email bug reports to bug-texinfo@gnu.org."
+#~ msgstr ""
+#~ "\n"
+#~ "Meld fouten in het programma aan bug-texinfo@gnu.org;\n"
+#~ "meld onjuistheden in de vertaling aan nl@li.org."
diff --git a/Build/source/utils/texinfo/po/no.gmo b/Build/source/utils/texinfo/po/no.gmo
new file mode 100644
index 00000000000..af281d5266d
--- /dev/null
+++ b/Build/source/utils/texinfo/po/no.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/no.po b/Build/source/utils/texinfo/po/no.po
new file mode 100644
index 00000000000..c117a14ea93
--- /dev/null
+++ b/Build/source/utils/texinfo/po/no.po
@@ -0,0 +1,3123 @@
+# Norwegian translation of messages for Texinfo 4.6 (bokmĺl dialect).
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Trond Endrestřl <trond@ramstind.gtf.ol.no>, 1998.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Texinfo 4.6\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2003-07-14 13:13+02:00\n"
+"Last-Translator: Trond Endrestřl <trond@ramstind.gtf.ol.no>\n"
+"Language-Team: Norwegian-bokmĺl <no@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Flytte forover et tegn"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Flytte bakover et tegn"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Flytte til starten av denne linjen"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Flytte til slutten av denne linjen"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Flytte forover et ord"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Flytte tilbake et ord"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Slette tegnet under markřren"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Slette tegnet bak markřren"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Avbryte eller avslutte operasjon"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Godta (eller tvinge fullfřring av) denne linjen"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Sette inn neste tegn ordrett"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Sette inn dette tegnet"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Sette inn en tabulator"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transponere tegnet ved punktet"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Rykke tilbake innholdet fra forrige felling"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Fellingsringen er tom"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Rykke tilbake en tidligere felling"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Slette til slutten av linjen"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Slette til begynnelsen av linjen"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Slette ordet etter markřren"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Slette ordet fřr markřren"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Ingen fullfřringer"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Ikke fullstendig"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Liste mulige fullfřringer"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Eneste fullfřring"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "En fullfřring:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d fullfřringer:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Sett inn fullfřring"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Bygger fullfřringer..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Rulle fullfřringsvinduet"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Fotnoter kunne ikke vises"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Vise fotnotene assosiert med denne noden i et annet vindu"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Fotnoter -----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Lete opp en streng i indeksen til denne filen"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Finner indeksinnslag..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Ingen indekser funnet."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Indeksinnslag: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Gĺ til det neste passende indeksinnslaget fra forrige '\\[index-search]'-"
+"kommando"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Ingen tidligere indekssřkestrenger."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Ingen indeksinnslag."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Ingen %sindeksinnslag inneholdende Ť%sť."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "mer "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "KAN IKKE SE DETTE"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "Fant Ť%sť i %s. (Ť\\[next-index-match]ť prřver ĺ finne den neste.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Sjekker indekser i Ť%sť..."
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Ingen av de tilgjengelig infofilene har Ť%sť i deres indekser."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Kravle gjennom alle kjente infofilers indekser etter en streng\n"
+" og bygge opp en meny"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Indeksapropos: "
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Noder med indekser som inneholder Ť%sť:\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Prřv --help for mer informasjon.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Det finnes INGEN garanti. Du kan redistribuere denne programvaren\n"
+"etter betingelsene i GNU General Public License. For mer informasjon\n"
+"om dette, se filen COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "ingen innslag funnet for Ť%sť\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly vćr vennlig ovenfor talesyntetisatorer.\n"
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Bruksmĺte: %s [VALG]... [MENYPUNKT...]\n"
+"\n"
+"Lese dokumentasjon i Infoformat.\n"
+"\n"
+"Valg:\n"
+" --apropos=EMNE sřke etter EMNE i alle indeksene til alle "
+"Infofilene.\n"
+" -d, --directory=KAT legge til KAT til INFOPATH.\n"
+" --dribble=FILNAVN huske brukerens tastetrykk i FILNAVN.\n"
+" -f, --file=FILNAVN angi Infofilen som skal besřkes.\n"
+" -h, --help vise denne hjelpen og avslutte.\n"
+" --index-search=STRENG gĺ til noden pekt pĺ av indeksoppslaget "
+"STRENG.\n"
+" -n, --node=NODENAVN angi noder i fřrste besřkte Infofil.\n"
+" -o, --output=FILNAVN skrive ut utvalgte noder til FILNAVN.\n"
+" -R, --raw-escapes ikke fjern ANSI-escapes fra mansider.\n"
+" --restore=FILNAVN lese innledende tastetrykk fra FILNAVN.\n"
+" -O, --show-options, --usage gĺ til kommandolinje-valg-noden.\n"
+"%s --subnodes rekursivt skrive ut menypunkter.\n"
+" --vi-keys bruke vi-aktige og less-aktige "
+"tastebindinger.\n"
+" --version vise programversjon og avslutte.\n"
+"\n"
+"Det fřrste ikke-valg-argumentet, dersom tilstede, er menypunktet som du\n"
+"starter fra; det blir sřkt etter i alle Ťdirť-filer langs med INFOPATH.\n"
+"Dersom menypunktet ikke er tilstede, vil info flette sammen alle\n"
+"Ťdirť-filene og vise resultatet. Řvrige gjenvćrende argumenter blir\n"
+"behandlet som navnene til menypunktene relativ til den fřrste besřkte\n"
+"noden.\n"
+"\n"
+"Eksempler:\n"
+" info vise toppnivĺ dirmeny\n"
+" info emacs starte ved emacs-noden fra toppnivĺ dir\n"
+" info emacs buffers starte ved buffers-noden i emacs-manualen\n"
+" info --show-options emacs starte ved emacs kommandolinjevalg\n"
+" info -f ./foo.info vise filen ./foo.info, ikke sřke gjennom dir\n"
+"\n"
+"Send bugrapport til bug-texinfo@gnu.org,\n"
+"generelle spřrsmĺl og diskusjoner til help-texinfo@gnu.org.\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Send bugrapporter til bug-texinfo@gnu.org,\n"
+"generelle spřrsmĺl og diskusjoner til help-texinfo@gnu.org.\n"
+"Websida for Texinfo: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Kan ikke finne noden Ť%sť."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Kan ikke finne noden Ť(%s)%sť."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Kan ikke finne et vindu!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Markřren vises ikke innen dette vinduets node!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Kan ikke slette det siste vinduet."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Ingen meny i denne noden."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Ingen fotnoter i denne noden."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Ingen kryssreferanser i denne noden."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Ingen Ť%sť-peker for denne noden."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Ukjent Info-kommando Ť%cť; prřv Ť?ť for hjelp."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Terminaltypen Ť%sť er ikke smart nok for ĺ kjřre Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Du er allerede pĺ den siste siden av denne noden."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Du er allerede pĺ den fřrste siden til denne noden."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Bare et vindu."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Resulterende vindu ville blitt for lite."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Ikke nok plass for et hjelpevindu, vennligst slett et vindu."
+
+# The next translation should match the length of this one
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Grunnleggende kommandoer i infovinduer\n"
+"**************************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Avslutte denne hjelpen.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Avslutte Info fullstendig.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Starte Infoopplćring.\n"
+
+# The next translation should match the length of this one
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Velger andre noder:\n"
+"-------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Flytte til neste node etter denne noden.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Flytte til forrige node fřr denne noden.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Flytte Ťoppť fra denne noden.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Velge et menypunkt angitt ved navn.\n"
+" Valg av et menypunkt fřrer til at en annen node blir valgt.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[history-node] Fřlge en kryssreferanse. Leser navnet til "
+"referansen.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Flytte til den siste noden sett i dette vinduet.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Flytte til neste hypertekstlenke innen denne "
+"noden.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Flytte til neste hypertekstlenke innen denne "
+"noden.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr "\\%-10[dir-node] Fřlge hypertekstlenken under markřren.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Flytte til Ťkatalogť-noden. Det samme som Ť\\[goto-node] "
+"(DIR)ť.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Flytte til ŤTopť-noden. Det samme som Ť\\[goto-node] "
+"Topť.\n"
+
+# The next translation should match the length of this one
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Flytte innen en node:\n"
+"---------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Gĺ til begynnelsen av denne noden.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Gĺ til slutten av denne noden.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Rulle forover 1 linje.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Rulle bakover 1 linje.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Rulle forover en side.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Rulle bakover en side.\n"
+
+# The next translation should match the length of this one
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Andre kommandoer:\n"
+"-----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] Velge fřrste ... niende punkt i nodens meny.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Velge det siste punktet i nodens meny.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Sřke etter en angitt streng blant indeksinnslagene i "
+"denne\n"
+" infofilen og velge noden til det fřrste innslaget som blir "
+"funnet.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Flytte til en node angitt ved navn.\n"
+" Du kan like godt inkludere et filnavn, som i (FILNAVN)"
+"NODENAVN.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Sřke forover etter en angitt streng\n"
+" og velge den noden som den neste forekomsten blir funnet i.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Sřke baklengs etter en angitt streng\n"
+" og velge den noden som den neste forekomsten blir funnet i.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Avslutte denne hjelpen.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Avslutte Info fullstendig.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Starte Infoopplćring.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Flytte til Ťnesteť-noden etter denne noden.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Flytte til Ťforrigeť-noden fřr denne noden.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Flytte Ťoppť fra denne noden.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Velge menypunkt spesifisert ved navn.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" Valg av menypunkt fřrer til at en annen node blir valgt.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Fřlge en kryssreferanse. Leser navnet til referansen.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Flytte til den siste noden sett i dette vinduet.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Flytte til neste hypertekstlenke innen denne noden.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Fřlge hypertekstlenken under markřren.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Flytte til Ťkatalogť-noden. Det samme som Ťg (DIR)ť.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Flytte til ŤTopť-noden. Det samme som Ťg Topť.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Rulle forover en side.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Rulle bakover en side.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Gĺ til begynnelsen av denne noden.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Gĺ til slutten av denne noden.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Rulle forover 1 linje.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Rulle bakover 1 linje.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Velge fřrste ... niende punkt i nodens meny.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Velge det siste punktet i nodens meny.\n"
+
+# This translation is connected to the next one
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s Sřke etter en spesifikk streng i indeksinnslagene i denne\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" infofil, og velge noden referert av det fřrste oppslaget "
+"funnet.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Flytte til noden spesifisert av navn.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Du kan like godt inkludere et filnavn, som i (FILNAVN)"
+"NODENAVN.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr ""
+" %-10s Sřke forlengs gjennom denne Infofilen for en spesifikk streng,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" og velge den noden som i det neste tilfellet blir funnet.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr ""
+" %-10s Sřke baklengs gjennom denne Infofilen for en spesifikk streng,\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Gjeldende sřkesti er:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Kommandoer tilgjengelig i Infovinduer:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Kommandoer tilgjengelig i ekkoomrĺdet:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Fřlgende kommandoer kan bare bli pĺkallet via %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Fřlgende kommandoer kan ikke bli pĺkallet i det hele tatt:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- Bruk Ť\\[history-node]ť eller Ť\\[kill-node]ť for ĺ avslutte ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Vise hjelpemelding"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Vise infonoden Ť(info)Helpť"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Skrive ut dokumentasjonen for KEY"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Beskriv tast: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s er udefinert."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s er udefinert."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s er definert som %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Vise hva som mĺ tastes for ĺ utfřre en gitt kommando"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Hvor er kommandoen: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "Ť%sť er ikke pĺ noen taster"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s kan bare bli pĺkallet via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s kan bli pĺkallet via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Det finnes ingen funksjon ved navn Ť%sť"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Det finnes INGEN garanti. Du kan redistribuere denne programvaren\n"
+"etter betingelsene i GNU General Public License. For mer informasjon\n"
+"om dette, se filen COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "unřyaktig antall argumenter"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "Kan ikke ĺpne inputfilen Ť%sť"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "Kunne ikke opprette outputfila Ť%sť"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "feil ved skriving til Ť%sť"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "Feil ved lukking av outputfila Ť%sť"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "tastesekvensen er for lang"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "manglende tastesekvens"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NULL-tegn (\\000) er ikke tillatt"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NULL-tegn (^%c) er ikke tillatt"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "manglende handlingsnavn"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "avdeling for lang"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "Ukjent handling Ť%sť"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "handlingsnavn for langt"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "ekstra tegn fřlger handlingen Ť%sť"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "manglende variabelnavn"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "manglende Ť=ť umiddelbart etter variabelnavn"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "variabelnavn for langt"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "verdi for lang"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "Ť%sť, linje %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Bruksmĺte: %s [VALG]... [INPUTFIL]\n"
+"\n"
+"Kompilere infokey-kildefil til infokeyfil. Leser INPUTFIL (standard\n"
+"$HOME/.infokey) og skriver kompilert keyfil til $HOME/.info.\n"
+"\n"
+"Valg:\n"
+" --output FIL skrive ut til FIL istedet for $HOME/.info.\n"
+" --help vise denne hjelpen og avslutte.\n"
+" --version vise programversjon og avslutte.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ignorerer ugyldig infokeyfil Ť%sť - for liten"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ignorerer ugyldig infokeyfil Ť%sť - for stor"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Feil ved lesing av infokeyfil Ť%sť - for kort"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokeyfil Ť%sť (feil magiske tall) -- kjřr infokey for ĺ oppdatere "
+"den"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "Din infokeyfil Ť%sť er utdatert -- kjřr infokey for ĺ oppdatere den"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokeyfil Ť%sť (feil avdelingslengde) -- kjřr infokey for ĺ "
+"oppdatere den"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Ugyldig infokeyfil Ť%sť (feil avdelingskode) -- kjřr infokey for ĺ oppdatere "
+"den"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Feil data i infokeyfil -- noen tastebindinger ble ignorert"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "Feil data i infokeyfil -- noen variabelinnstillinger ble ignorert"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Lese inn navnet pĺ en infokommando og beskrive den"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Beskriv kommandoen: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Lese et kommandonavn i ekkoomrĺdet og utfřre den"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Kan ikke utfřre en Ťecho-areať-kommando her."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "udefinert flagg: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Sette hřyden pĺ det viste vinduet"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Sette skjermhřyde til (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Kildefiler sřkt gjennom for ĺ lage denne filen inkluderer:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Kunne ikke manipulere filen %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Fil)Node Linjer Str. Inneholdene fil\n"
+" --------- ------ ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Her er menyen over nodene du har nylig besřkt.\n"
+"Velg en fra denne menyen, eller bruk Ť\\[history-node]ť i et annet vindu.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "Lag et vindu inneholdene en meny over alle de nylig besřkte nodene"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Velge en node som har blitt tidligere besřkt i et synlig vindu"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Velg besřkt node: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referansen forsvant! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Velkommen til Info versjon %s. Trykk Ť\\[get-help-window]ť for hjelp,\n"
+"Ť\\[menu-item]ť for menypunkt."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Flytte ned til neste linje"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Flytte opp til den forrige linjen"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Flytte til slutten av linjen"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Flytte til starten av linjen"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "neste"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Fřlger nestenoden..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Velger fřrste menypunkt..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Velger nestenoden..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Flytter opp %d gang(er), deretter neste."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Ingen flere noder i dette dokumentet."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Ingen Ťforrigeť for denne noden."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Flytter til forrige i dette vinduet."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Ingen Ťforrigeť eller Ťoppť for denne noden i dette dokumentet."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Flytter opp i dette vinduet."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Flytter til Ťforrigeťs siste menypunkt."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Flytte forover eller ned gjennom nodestrukturen"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Flytte tilbake eller opp gjennom nodestrukturen"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Rulle forover i dette vinduet"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "Rulle forover i dette vinduet og sette standard vindustřrrelse"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Rulle forover i dette vinduet, men forbli innenfor noden"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Rulle forover i dette vinduet, forbli innenfor noden og sette standard "
+"vindustřrrelse"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Rulle bakover i dette vinduet"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "Rulle bakover i dette vinduet og sette standard vindustřrrelse"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Rulle bakover i dette vinduet, men forbli innenfor noden"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Rulle bakover i dette vinduet, forbli innenfor noden og sette standard "
+"vindustřrrelse"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Flytte til starten av denne noden"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Flytte til slutten av denne noden"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Rulle ned pr. antall linjer"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Rulle opp pr. antall linjer"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Rulle ned en halv side"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Rulle opp en halv side"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Velge neste vindu"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Velge forrige vindu"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Dele gjeldende vindu"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Slette den gjeldende vindu"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Kan ikke slette et permanent vindu"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Slette alle andre vinduer"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Rulle det andre vinduet"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Rulle det andre vinduet bakover"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Řke (eller minke) dette vinduet"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Dele den tilgjengelige skjermplassen mellom de synlige vinduene"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Veksle tilstanden til linjebryting i gjeldende vindu"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Velge neste node"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Velge forrige node"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Velge oppnoden"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Velge den siste noden i denne filen"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Dette vinduet har ingen andre noder"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Velge fřrste node i denne filen"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Velge det siste punktet i nodens meny"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Velge dette menypunktet"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Det er ikke %d punkter i denne menyen."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menypunkt (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menypunkt: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Fřlge kryssreferanse (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Fřlge kryssreferanse: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Lese et menyvalg og velge dens node"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Lese en fotnote eller kryssreferanse og velge dens node"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Flytte til starten av denne nodens meny"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Besřke sĺ mange menypunkter som mulig samtidig"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Lese et nodenavn og velge det"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Gĺ til node: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Ingen meny i noden Ť%sť."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Ingen menypunkt Ť%sť i noden Ť%sť."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Klarte ikke ĺ finne noden referert av Ť%sť i Ť%sť."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Lese en liste over menyer fra dir og fřlge dem"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Fřlge menyer: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Finne noden som beskriver bruksmĺten for programmet"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Finne Invocation-noden til [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Lese en manualside-referanse og velge den"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Hent manualsiden: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Velge ŤTopť-noden i denne filen"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Velge noden Ť(dir)ť"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Slette noden (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Kan ikke slette noden Ť%sť"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Kan ikke slette den forrige noden"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Velge den sist valgte noden"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Slette denne noden"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Lese inn navnet pĺ en fil og velge den"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Finne fil: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Kan ikke finne Ť%sť."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Kunne ikke opprette utskriftsfil Ť%sť."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Ferdig."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Skriver noden Ť%sť..."
+
+# I need a better substitute for the verb Ťto pipeť.
+# ŤĹ pipeť sounds no good to me.
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "ŤPipeť innholdet av denne noden gjennom INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Kan ikke ĺpne Ťpipeť til Ť%sť."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Skriver ut noden Ť%sť..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Sřker i delfil Ť%sť..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr ""
+"Lese inn en streng og sřke etter den med skille pĺ store og smĺ bokstaver"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Lese inn en streng og sřke etter den"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Lese inn en streng og sřke bakover etter den"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%setter streng [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Sřke bakover"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Sřke"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " med skille pĺ store og smĺ bokstaver "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Sřk mislyktes"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Gjenta forrige sřk i samme retning"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Ingen tidligere sřkestreng"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Gjenta forrige sřk i motsatt retning"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Sřke interaktivt for en streng mens du skriver"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-sřk bakover: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-sřk: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Mislyktes "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Flytte til forrige kryssreferanse"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Flytte til neste kryssreferanse"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Velge referanse eller menypunkt pĺ denne linjen"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Avbryte gjeldende operasjon"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Avbrutt"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Flytte markřren til en angitt linje i vinduet"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Tegne skjermen pĺ nytt"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Avslutte Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Kjřr kommandoen knyttet til denne tastens Ťliten-bokstav-variantť"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Ukjent kommando (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "Ť%sť er ugyldig"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "Ť%sť er ugyldig"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Legge til dette siffret til det gjeldende numeriske argumentet"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Starte (eller multiplisere med 4) den gjeldende numeriske argumentet"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Brukt internt av \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Tomt for virtuelt minne!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Nĺr ŤOnť, oppstĺr og forsvinner fotnoter automatisk"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Nĺr ŤOnť, laging eller fjerning av vinduer endrer střrrelsen pĺ andre vinduer"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Nĺr ŤOnť, blink skjermen istedet for ĺ ringe i bjellen."
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Nĺr ŤOnť, feil fĺr bjellen til ĺ ringe"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "Nĺr ŤOnť, Info sřppelhenter filer som mĺtte dekomprimeres"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Nĺr ŤOnť, den delen av en matchende sřkestreng blir uthevet"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+"Kontrollerer hva som skjer nĺr rulling er řnsket ved slutten av en node"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Antall linjer som skal rulles nĺr markřren flyttes utenfor vinduet"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Nĺr ŤOnť, aksepterer og viser Info ISO-Latin-tegn"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Forklar bruken av en variabel"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Beskriv variabel: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Sette verdien til en Infovariabel"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Sett variabel: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Sette %s til verdien (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Sette %s til verdien (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Tagger er ute av synk ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), linjer ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d linjer --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d linjer --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Delfil: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: valget Ť%sť er flertydig\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: valget Ť--%sť tillater ikke et argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: valget Ť%c%sť tillater ikke et argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: valget Ť%sť krever et argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ukjent valg Ť--%sť\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ukjent valg Ť%c%sť\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ulovlig valg -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ugyldig valg -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: valget krever et argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: valget Ť-W %sť er flertydig\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: valget Ť-W %sť tillater ikke et argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "Ugyldig argument til %c%s"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "januar"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "februar"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "mars"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "april"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "mai"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "juni"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "juli"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "august"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "september"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "oktober"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "november"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "desember"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "usannsynlig tegn %c i @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc-argument med store bokstaver, dermed ingen effekt"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "Ť{ť forventet, men sĺ Ť%cť"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "slutt-pĺ-fila inne i verb-blokk"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "Ť{ť forventet, men sĺ Ť%cť"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s er utgĺtt"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp krever et positivt numerisk argument, ikke `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Ugyldig argument til %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "Ugyldig argument til %c%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "insert"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Manglende Ť}ť i @def-arg"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funksjon"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Spesiell form"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variabel"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Brukervalg"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Forekomst"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metode"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "av"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "pĺ"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Mĺ vćre i et Ť@%sť-miljř for ĺ bruke Ť@%sť"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "Ť%c%sť trenger et argument Ť{...}ť, ikke bare Ť%sť"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Ingen avsluttende krřllparentes for fotnoten Ť%sť"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Fotnote definert uten foreldrenode"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Fotnoter i fotnoter er ikke tillatt"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Fotnoter"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: kunne ikke ĺpne --css-file: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: --css-file endte i en kommentar"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Uten navn"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[uforventet] kunne ikke poppe neste htmltagg"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[uforventet] ugyldig nodenavn: Ť%sť"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Ukjent indeks Ť%sť"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info kan ikke hĺndtere `:' i indeksinnslaget `%s'"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Indeksen Ť%sť eksisterer allerede"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Ukjent indeks Ť%sť og/eller Ť%sť i @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Ukjent indeks Ť%sť i @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Innslag for indeksen Ť%sť utenfor node"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(utenfor noder)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Se "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item er ikke tillatt som argument til @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Broken-Type i insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Stakkoverflyt ved oppramsing"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "bokstavoverflyt, starter pĺ nytt ved %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s krever et argument: formattereren for %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' forventet Ť%sť, men sĺ Ť%sť"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Ingen tilsvarende Ť%cend %sť"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s krever en bokstav eller et siffer"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "slutt-pĺ-filen inne i verbatimblokk"
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s er meningslřs innenfor en Ť%sť-blokk"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu sett fřr fřrste @node, oppretter ŤTopť-noden"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"kanskje burde din @top-node bli pakket inn i @ifnottex istedet for @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu sett fřr fřrste node, oppretter ŤTopť-noden"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s er meningslřs innenfor en Ť%sť-blokk"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Umatchet Ť%c%sť"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "Ť%c%sť trenger noe etter den"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Ugyldig argument til Ť%sť, Ť%sť, bruker Ť%sť"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s er meningslřs innenfor en Ť%sť-blokk"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx er meningslřs innenfor en Ť%sť-blokk"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s funnet utenfor en innsettingsblokk"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s er ikke en gyldig ISO 639-sprĺkkode"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "ugjenkjennelig kodingsnavn Ť%sť"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "beklager, kodingen Ť%sť er ikke střttet"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "Ugyldig kodet tegn Ť%sť"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s forventer Ťiť eller Ťjť som argument, ikke Ť%cť"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s forventer et enkelt tegn, Ťiť eller Ťjť som argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makroen Ť%sť er tidligere definert"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "her er den tidligere definisjonen av Ť%sť"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "\\ i makroekspansjon fulgt av Ť%sť istedet for parameternavn"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makroen Ť%sť kalt pĺ linje %d med for mange argumenter"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend macro ikke funnet"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg bare brukbart nĺr makroen bare tar et argument"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "umatchet @end %s med @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "For mange feil! Ga opp.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: advarsel: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Feilplassert %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Prřv Ť%s --helpť for mer informasjon.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Bruksmĺte: %s [VALG]... TEXINFOFIL...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Oversette Texinfodokumentasjon til forskjellige andre formater:\n"
+"Infofiler for lesing online med Emacs eller den frittstĺende GNU Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Generelle valg:\n"
+" --error-limit=ANT avbryte etter ANT feil (standard %d).\n"
+" --force bevare output selv med feil.\n"
+" --help vise denne hjelpen og avslutte.\n"
+" --no-validate undertrykke sjekking av kryssreferanser.\n"
+" --no-warn undertrykke advarsler (men ikke feil).\n"
+" --reference-limit=ANT advare om pĺ det meste ANT referanser "
+"(standard %d).\n"
+" -v, --verbose forklare hva som blir gjort.\n"
+" --version vise programversjon og avslutte.\n"
+
+#: makeinfo/makeinfo.c:364
+#, fuzzy, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Valg av outputformat (standard er ĺ produsere Info):\n"
+" --docbook generere DocBook XML i stedet for Info.\n"
+" --html generere HTML i stedet for Info.\n"
+" --xml generere Texinfo XML i stedet for Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Generelle outputvalg:\n"
+" -E, --macro-expand FIL sende makroekspandert kilde til FIL,\n"
+" ignorerer enhver @setfilename.\n"
+" --no-headers undertrykke nodeseparatorer, Node:-linjer og "
+"menyer\n"
+" fra Info-output (og dermed produsere ren "
+"tekst)\n"
+" eller fra HTML (og dermed produsere kortere "
+"output);\n"
+" standard er ĺ skrive til standard ut.\n"
+" --no-split undertrykke splitting av Info- eller HTML-"
+"output,\n"
+" generere bare en outputfil.\n"
+" --number-sections nummerere kapitler og avdelinger (section).\n"
+" -o, --output=FIL sende output til FIL (eller katalog dersom "
+"splittet HTML),\n"
+
+# Denne mangler oversettelse, mĺ rettes snarest.
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Valg for Infooutput og ren tekst:\n"
+" --enable-encoding skrive ut spesialtegn og tegn med aksenter i"
+"\\n\n"
+" Infooutput basert pĺ @documentencoding.\\n\n"
+" --fill-column=ANT bryte Infolinjer ved ANT tegn (standard %d).\n"
+" --footnote-style=STIL generere fotnoter i Info i henhold til STIL:\n"
+" Ťseparateť for ĺ legge fotnotene i egne "
+"noder;\n"
+" Ťendť for ĺ legge fotnotene i slutten av "
+"hver node\n"
+" der fotnotene er definert (standard).\n"
+" --paragraph-indent=ANT rykke inn Infoavsnitt med ANT mellomrom "
+"(standard %d).\n"
+" Dersom ANT er Ťnoneť rykkes ikke avsnittene "
+"inn;\n"
+" Dersom ANT er Ťasisť bevares eksisterende "
+"innrykk.\n"
+" --split-size=ANT splitte Infofilene ved lengde ANT (standard %"
+"d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"Valg for HTML:\n"
+" --css-include=FIL inkluder FIL i HTML <style>-taggen;\n"
+" les stdin dersom FIL er -.\n"
+
+#: makeinfo/makeinfo.c:409
+#, fuzzy, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"Valg for HTML:\n"
+" --css-include=FIL inkluder FIL i HTML <style>-taggen;\n"
+" les stdin dersom FIL er -.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Valg for inputfil:\n"
+" --commands-in-node-names tillate @-kommandoer i nodenavn.\n"
+" -D VAR definer variabelen VAR, som om @set "
+"brukes.\n"
+" -I KAT legg til KAT pĺ slutten av @include-"
+"sřkestien.\n"
+" -P KAT legg til KAT pĺ starten av @include-"
+"sřkestien.\n"
+" -U VAR udefiner variabelen VAR, som om @clear "
+"brukes.\n"
+
+#: makeinfo/makeinfo.c:425
+#, fuzzy
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Betinget behandling av input:\n"
+" --ifhtml behandle @ifhtml og @html selv om HTML ikke skal "
+"genereres.\n"
+" --ifinfo behandle @ifinfo selv nĺr HTML skal genereres.\n"
+" --ifplaintext behandle @ifplaintext selv om ren tekst ikke skal "
+"genereres.\n"
+" --iftex behandle @iftex og @tex; innebćrer --no-split.\n"
+" --ifxml behandle @ifxml og @xml.\n"
+" --no-ifhtml ikke behandle @ifhtml og @html.\n"
+" --no-ifinfo ikke behandle @ifinfo.\n"
+" --no-ifplaintext ikke behandle @ifplaintext.\n"
+" --no-iftex ikke behandle @iftex og @tex.\n"
+" --no-ifxml ikke behandle @ifxml og @xml.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Standardverdiene for @if...-betingelsene avhenger av outputformatet:\n"
+" dersom HTML genereres er --ifhtml pĺslĺtt og de andre av;\n"
+" dersom Info genereres er --ifinfo pĺslĺtt og de andre av;\n"
+" dersom ren tekst genereres er --ifplaintext pĺslĺtt og de andre av;\n"
+" dersom XML genereres er --ifxml pĺslĺtt og de andre av.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Eksempler:\n"
+" makeinfo foo.texi skrive Info til foos @setfilename\n"
+" makeinfo --html foo.texi skrive HTML til @setfilename\n"
+" makeinfo --xml foo.texi skrive Texinfo XML til @setfilename\n"
+" makeinfo --docbook foo.texi skrive Docbook XML til @setfilename\n"
+" makeinfo --no-headers foo.texi skrive ren tekst til standard ut\n"
+"\n"
+" makeinfo --html --no-headers foo.texi skrive HTML uten nodelinjer\n"
+" makeinfo --number-sections foo.texi skrive Info med nummererte avsnitt\n"
+" makeinfo --no-split foo.texi skrive en Infofil uansett střrrelse\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s arg mĺ vćre numerisk, ikke Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Kunne ikke ĺpne filen Ť%sť for utskrift av makroekspansjon"
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "Kunne ikke ĺpne filen Ť%sť for utskrift av makroekspansjon"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: --paragraph-indent arg mĺ vćre numerisk/Ťnoneť/Ťasisť, ikke Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr "%s: --footnote-style arg mĺ vćre Ťseparateť eller Ťendť, ikke Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: mangler filargument.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Forventet Ť%sť"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Kan ikke opprette katalogen Ť%sť: %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Ingen Ť%sť funnet i Ť%sť"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Hopper over makroekspansjon til stdout siden Info-output ogsĺ sendes "
+"dit.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Lager %s-filen Ť%sť fra Ť%sť.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Dette er %s, produsert av makeinfo versjon %s fra %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Fjerner makroutskriftsfilen Ť%sť pĺ grunn av feil; bruk --force for ĺ "
+"bevare.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Fjerner utskriftsfilen Ť%sť pĺ grunn av feil; bruk --force for ĺ "
+"bevare.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Ukjent kommando Ť%sť"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Bruk krřllparenteser for ĺ gi en kommando som et argument til @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s forventet krřllparanteser"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Umatchet }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "INTET_NAVN!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s mangler avsluttende krřllparentes"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image-fil Ť%sť (for HTML) er uleselig: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Ť%sť er ingen fil"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image-fil Ť%sť (for tekstformat) er uleselig: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image mangler filnavn"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "udefinert flagg: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Ingen verdi for Ť%sť}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s krever et navn"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Traff slutt-pĺ-filen fřr matchende @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' er for lang for ekspansjon; ikke ekspandert"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Manglende Ť}ť i @multitable-mal"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ignorerer lřs tekst Ť%sť etter @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "For mange kolonner i multitabellrad (maks %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[uforventet] kan ikke velge kolonne #%d i multitabell"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "ignorerer @tab utenfor multitabell"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Multikolonne-output fra siste rad:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolonne #%d output = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Noden Ť%sť er tidligere definert ved linje %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Skriver noden %s...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Noden Ť%sť krever en inndelingskommando (f.eks. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Ingen nodenavn spesifisert for Ť%c%sť-kommandoen"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Ankeret Ť%sť og noden Ť%sť blir knyttet til det samme filnavnet"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Denne @anchor-kommandoen ble ignorert, referanser til den vil ikke virke"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Omdřpe dette ankeret eller bruk Ť--no-splitť-valget"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Uforventet streng ved slutten av splitt-HTML-fila Ť%sť"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Neste:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Forrige:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Opp:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Ankrene Ť%sť og Ť%sť peker til det samme filnavnet"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "@anchor-kommando ignorert; referanser til den vil ikke virke"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%s referanse til ikke-eksisterende node Ť%sť (kanskje ugyldig inndeling?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Meny"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Kryss"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Nestefeltet til noden Ť%sť er ikke pekt pĺ (kanskje ugyldig inndeling?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Denne noden (%s) har den dĺrlige forrigepekeren"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "forrige"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Forrigefeltet til noden Ť%sť er ikke pekt pĺ"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Denne noden (%s) har den dĺrlige nestepekeren"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "`%s' har ingen Up-felt (kanskje feil inndeling?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "opp"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "Noden Ť%sť mangler et menypunkt for Ť%sť selv om den er dens oppmĺl"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "noden Ť%sť har blitt referert %d ganger"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "ureferert node Ť%sť"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Kan ikke opprette katalogen Ť%sť: %s"
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "Vedlegg %c "
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Intern feil (search_sectioning) Ť%sť!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Intern feil (search_sectioning) Ť%sť!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s er avlegs; bruk %c%s i stedet"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Node med %ctop som en seksjon eksisterer allerede"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Her er %ctop-noden"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop brukt fřr %cnode, benytter %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Innholdsfortegnelse"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Kort innholdsfortegnelse"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image-fil Ť%sť er uleselig: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: advarsel: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " for %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tPrřv Ť%s --helpť for en komplett liste over valg.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Bruksmĺte: %s [VALG]... [INFOFIL [DIRFIL]]\n"
+"\n"
+"Installere eller slette dir-innslag fra INFOFIL i Info-katalogfilen\n"
+"DIRFIL.\n"
+"\n"
+"Valg:\n"
+" --delete slette eksisterende innslag for INFOFIL fra DIRFIL;\n"
+" ikke sett inn noe nye innslag.\n"
+" --dir-file=NAVN angi filnavnet til Info-katalogfilen.\n"
+" Dette er det samme som ĺ bruke DIRFIL-argumentet.\n"
+" --entry=TEKST sette inn TEKST som en Info-kataloginnslag.\n"
+" TEKST břr ha form som et Info-menypunkt\n"
+" pluss null eller flere linjer som starter med "
+"whitespace.\n"
+" Dersom du angir mer enn et innslag, blir alle lagt "
+"til.\n"
+" Dersom du ikke angir noen innslag, blir de bestemt\n"
+" fra informasjon i selve Infofilen.\n"
+" --help vise denne hjelpen og avslutte.\n"
+" --info-file=FIL angi Infofilen som skal installeres i katalogen.\n"
+" Dette er det samme som ĺ bruke INFOFIL-argumentet.\n"
+" --info-dir=DIR det samme som --dir-file=DIR/dir.\n"
+" --item=TEKST det samme som --entry TEKST.\n"
+" Et Info-kataloginnslag er egentlig et menypunkt.\n"
+" --quiet undertrykke advarsler.\n"
+" --remove det samme som --delete.\n"
+" --section=AVS putte denne filens innslag i avsnittet AVS i katalogen.\n"
+" Dersom du angir mer enn et avsnitt, blir alle "
+"innslagene\n"
+" lagt til i hver av avsnittene.\n"
+" Dersom du ikke angir noen avsnitt, blir de bestemt\n"
+" fra informasjon i selve Infofilen.\n"
+" --version vise programversjon og avslutte.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Dette er filen .../info/dir, som inneholder den řverste\n"
+"noden i Info-hierarkiet, kalt (dir)Top.\n"
+"Fřrste gangen du starter Info begynner du i denne noden.\n"
+"\n"
+"%s\tDette er toppen av INFO-treet\n"
+"\n"
+" Denne katalognoden gir en meny over alle hovedemner.\n"
+" Inntasting av Ťqť avslutter, Ť?ť lister alle Info-kommandoene, Ťdť "
+"returner hit,\n"
+" Ťhť gir en innfřring for nybegynnere,\n"
+" ŤmEmacs<Return>ť besřker Emacs-manualen, osv.\n"
+"\n"
+" I Emacs kan du klikke med musknapp 2 pĺ et menypunkt eller kryssreferanse\n"
+" for ĺ velge den.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: kunne ikke lese (%s) og kunne ikke opprette (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: tom fil"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY uten tilhřrende END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY uten tilhřrende START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Spesifiser infofilen bare en gang.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "overflřdig argument pĺ kommandolinjen Ť%sť"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Ingen innfil angitt; prřv --help for mer informasjon."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Ingen dir-fil angitt; prřv --help for mer informasjon."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "ingen info-dir-oppfřring i Ť%sť"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "menypunktet Ť%sť eksisterer allerede for filen Ť%sť"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "fant ingen oppfřringer for Ť%sť; ingenting slettet"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "vise denne hjelpen og avslutte"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "bevar midlertidige filer etter behandling"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "ikke bevar midlertidige filer etter behandling (standard)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "sende utdata til FILE"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "vise programversjon og avslutte"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Bruksmĺte: %s [VALG]... FIL...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Generere en sortert indeks for hver TeX-outputfil.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Vanligvis er FIL... angitt som Ťfoo.%c%cť for et dokument Ťfoo.texiť.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Valg:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: ikke en texinfo-indeksfil"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "feil ved gjenĺpning av %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Ingen sidenummer i %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "oppfřring %s fřlger en oppfřring med et annet navn"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Spesifiser infokatalogen bare en gang.\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "Ťť er ugyldig"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s er en ugyldig ISO-kode, bruker %c"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Kan ikke angi mer enn en fil for utskrift av makroekspansjon"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "Fila eksisterer, men er ikke en katalog"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Det fřrste argumentet til kryssreferanser kan ikke vćre tomt"
+
+#~ msgid "see "
+#~ msgstr "se "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "Ť.ť eller Ť,ť mĺ fřlge kryssreferanser, ikke %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "Det fřrste argumentet til @inforef kan ikke vćre tomt"
+
+#~ msgid "Node:"
+#~ msgstr "Node:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: TOC burde vćre her, men ble ikke funnet"
diff --git a/Build/source/utils/texinfo/po/pl.gmo b/Build/source/utils/texinfo/po/pl.gmo
new file mode 100644
index 00000000000..a09723256aa
--- /dev/null
+++ b/Build/source/utils/texinfo/po/pl.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/pl.po b/Build/source/utils/texinfo/po/pl.po
new file mode 100644
index 00000000000..60f787a0f62
--- /dev/null
+++ b/Build/source/utils/texinfo/po/pl.po
@@ -0,0 +1,3111 @@
+# Polish translation for texinfo.
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the texinfo package.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2003-2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.90\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-05 12:24+0100\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Przesunięcie do przodu o znak"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Przesunięcie do tyłu o znak"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Przejście na początek tej linii"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Przejście na koniec tej linii"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Przesunięcie do przodu o słowo"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Przesunięcie do tyłu o słowo"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Usunięcie znaku pod kursorem"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Usunięcie znaku za kursorem"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Anulowanie lub rezygnacja z operacji"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Przyjęcie (lub wymuszenie dokończenia) tej linii"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Wstawienie następnego znaku dosłownie"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Wstawienie tego znaku"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Wstawienie znaku TAB"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Przestawienie znaków w miejscu"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Wstawienie zawartości ostatniego wycięcia"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Zakres wycięcia jest pusty"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Wstawienie poprzedniego wycięcia"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Wycięcie na koniec linii"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Wycięcie na początek linii"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Wycięcie słowa za kursorem"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Wycięcie słowa przed kursorem"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Brak uzupełnień"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Nie dokończono"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Wypisanie możliwych uzupełnień"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Jedyne uzupełnienie"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Jedno uzupełnienie:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d uzupełnień:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Wstawienie uzupełnienia"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Tworzenie uzupełnień..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Przewijanie okna uzupełnień"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Przypisy nie mogą być wyświetlone"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Pokazanie przypisów związanych z tym węzłem w innym oknie"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Przypisy -----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Szukanie łańcucha w indeksie tego pliku"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Szukanie wpisów w indeksie..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Nie znaleziono indeksów."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Wpis indeksu: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Przejście do następnego pasującego elementu z ostatniego `\\[index-search]'"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Brak poprzedniego łańcucha szukanego w indeksie."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Brak wpisów w indeksie."
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Nie ma %swpisów w indeksie zawierających `%s'."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "więcej "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "NIE MOŻNA TEGO ZOBACZYĆ"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"Znaleziono `%s' w %s. (`\\[next-index-match]' próbuje znaleźć następne.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Przeszukiwanie indeksów `%s'..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Żaden z dostępnych plików info nie zawiera `%s' w swoich indeksach."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "Szukanie łańcucha w znanych indeksach plików info i zbudowanie menu"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Indeks dla łańcucha: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: Węzły, których indeksy zawierają `%s':\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Więcej informacji można uzyskać przez --help.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Autorzy nie dają ŻADNYCH gwarancji. Ten program można rozprowadzać\n"
+"zachowując warunki Powszechnej Licencji Publicznej GNU (General Public\n"
+"License).\n"
+"Więcej informacji na ten temat można znaleźć w plikach o nazwie COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "nie znaleziono wpisów w indeksie dla `%s'\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr " -b, --speech-friendly tryb przyjazny dla syntezatorów mowy.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Składnia: %s [OPCJA]... [ELEMENT-MENU...]\n"
+"\n"
+"Przeglądanie dokumentacji w formacie Info.\n"
+"\n"
+"Opcje:\n"
+" --apropos=ŁAŃCUCH szukanie ŁAŃCUCHA we wszystkich indeksach\n"
+" wszystkich podręczników.\n"
+" -d, --directory=KATALOG dodanie katalogu do INFOPATH.\n"
+" --dribble=PLIK zapamiętanie sekwencji klawiszy w PLIKU.\n"
+" -f, --file=PLIK podanie pliku Info do odwiedzenia.\n"
+" -h, --help wyświetlenie tego opisu i zakończenie pracy.\n"
+" --index-search=ŁAŃCUCH przejście do węzła za ŁAŃCUCHEM w indeksie.\n"
+" -n, --node=WĘZEŁ podanie węzła w pierwszym odwiedzanym pliku.\n"
+" -o, --output=PLIK zapis wybranych węzłów do PLIKU.\n"
+" -R, --raw-escapes wypisywanie sekwencji ANSI (domyślne).\n"
+" --no-raw-escapes wypisywanie sekwencji jako dosłownego "
+"tekstu.\n"
+" --restore=PLIK czytanie początkowej sekwencji klawiszy z "
+"PLIKU.\n"
+" -O, --show-options, --usage przejście do węzła z opcjami linii poleceń.\n"
+"%s --subnodes rekurencyjne wypisanie elementów menu.\n"
+" -w, --where, --location wyświetlenie fizycznego położenia pliku "
+"Info.\n"
+" --vi-keys używanie klawiszy w stylu programów vi i "
+"less.\n"
+" --version wyświetlenie informacji o wersji i "
+"zakończenie.\n"
+"\n"
+"Pierwszy argument nie będący opcją, jeśli jest obecny, jest wpisem menu, od\n"
+"którego program ma zacząć pracę;\n"
+"jest poszukiwany we wszystkich plikach `dir' leżących w INFOPATH.\n"
+"Jeśli nie jest obecny, info łączy wszystkie pliki `dir' i pokazuje wynik.\n"
+"Wszystkie pozostałe argumenty są traktowane jako nazwy elementów menu "
+"względem\n"
+"początkowo odwiedzonego węzła.\n"
+"\n"
+"Przykłady:\n"
+" info pokazanie menu katalogów głównego poziomu\n"
+" info emacs rozpoczęcie od węzła emacs z głównego katalogu\n"
+" info emacs buffers rozpoczęcie od węzła buffers w podręczniku "
+"emacsa\n"
+" info --show-options emacs rozpoczęcie od węzła z opisem linii poleceń "
+"emacsa\n"
+" info -f ./foo.info pokazanie pliku ./foo.info, z pominięciem "
+"katalogu\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Raporty o błędach prosimy wysyłać pocztą elektroniczną na adres\n"
+"bug-texinfo@gnu.org, ogólne pytania i dyskusję na help-texinfo@gnu.org.\n"
+"Strona domowa texinfo: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Nie można znaleźć węzła `%s'."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Nie można znaleźć węzła `(%s)%s'."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Nie można znaleźć okna!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Kropka nie występuje w węźle z tego okna!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Nie można usunąć ostatniego okna."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Brak menu w tym węźle."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Brak przypisów w tym węźle."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Brak odsyłaczy w tym węźle."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Brak wskaźnika `%s' dla tego węzła."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Nieznane polecenie Info `%c'; `?' przywołuje pomoc."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Typ terminala `%s' nie jest wystarczający do uruchomienia Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "To już jest ostatnia strona tego węzła."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "To już jest pierwsza strona tego węzła."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Tylko jedno okno."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Wynikowe okno byłoby zbyt małe."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Za mało miejsca na okno pomocy, proszę usunąć okno."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Podstawowe polecenia w oknach Info\n"
+"**********************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Opuszczenie tej pomocy.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Opuszczenie całego Info.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Uruchomienie tutoriala Info.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Wybór innych węzłów:\n"
+"--------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Przejście do węzła \"następny\" tego węzła.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Przejście do węzła \"poprzedni\" tego węzła.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Przejście do węzła \"w górę\" tego węzła.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Wybranie elementu menu zadanego nazwą.\n"
+" Wybranie elementu menu powoduje wybranie innego węzła.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Przejście za odsyłaczem. Odczytuje nazwę odsyłacza.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Przejście do ostatniego węzła widocznego w tym oknie.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Przejście do następnego odnośnika hipertekstowego "
+"w tym węźle.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Przejście do poprzedniego odnośnika "
+"hipertekstowego w tym węźle.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Przejście za odnośnikiem hipertekstowym "
+"pod kursorem.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Przejście do węzła `directory' (katalog). Równoznaczne `"
+"\\[goto-node] (DIR)'.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Przejście do węzła Szczytowy. Równoznaczne `\\[goto-node] "
+"Top'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Poruszanie się w ramach węzła:\n"
+"------------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Przejście na początek tego węzła.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Przejście na koniec tego węzła.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Przewinięcie do przodu o 1 linię.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Przewinięcie do tyłu o 1 linię.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Przewinięcie do przodu o stronę.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Przewinięcie do tyłu o stronę.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Inne polecenia:\n"
+"---------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] Wybranie pierwszego ... dziewiątego elementu z menu "
+"węzła.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Wybranie ostatniego elementu z menu węzła.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Szukanie podanego łańcucha we wpisach indeksu tego "
+"pliku Info\n"
+" i wybranie węzła wskazywanego przez pierwszy znaleziony wpis.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Przejście do węzła zadanego nazwą.\n"
+" Można dołączyć także nazwę pliku w postaci (PLIK)WĘZEŁ.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Szukanie podanego łańcucha w przód\n"
+" i wybranie węzła, w którym znaleziono następne wystąpienie.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Szukanie podanego łańcucha w tył\n"
+" i wybranie węzła, w którym znaleziono poprzednie wystąpienie.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Opuszczenie tej pomocy.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Opuszczenie całego Info.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Uruchomienie tutoriala Info.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Przejście do węzła `następny' tego węzła.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Przejście do węzła `poprzedni' tego węzła.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Przejście do węzła `w górę' tego węzła.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Wybranie elementu menu zadanego nazwą.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " Wybranie elementu menu powoduje wybranie innego węzła.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Przejście za odsyłaczem. Odczytuje nazwę odsyłacza.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Przejście do ostatniego węzła widocznego w tym oknie.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr ""
+" %-10s Przejście do następnego odnośnika hipertekstowego w tym węźle.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Przejście za odnośnikiem hipertekstowym pod kursorem.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr ""
+" %-10s Przejście do węzła `directory' (katalog). Równoznaczne `g (DIR)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Przejście do węzła Szczytowy. Równoznaczne `g Top'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Przewinięcie do przodu o stronę.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Przewinięcie do tyłu o stronę.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Przejście na początek tego węzła.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Przejście na koniec tego węzła.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Przewinięcie do przodu o 1 linię.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Przewinięcie do tyłu o 1 linię.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Wybranie pierwszego ... dziewiątego elementu z menu węzła.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Wybranie ostatniego elementu z menu węzła.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Szukanie podanego łańcucha we wpisach indeksu tego pliku Info\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" i wybranie węzła wskazywanego przez pierwszy znaleziony wpis.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Przejście do węzła zadanego nazwą.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Można dołączyć także nazwę pliku w postaci (PLIK)WĘZEŁ.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Szukanie podanego łańcucha w przód\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+" i wybranie węzła, w którym znaleziono następne wystąpienie.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Szukanie podanego łańcucha w tył\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Aktualna ścieżka poszukiwania to:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Polecenia dostępne w oknach Info:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Polecenia dostępne w obszarze echo:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Następujące polecenia można wywołać tylko przez %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Następujących poleceń nie można w ogóle wywołać:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- Wyjść można używając `\\[history-node]' lub `\\[kill-node]' ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Wyświetlenie pomocy"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Odwiedzenie węzła Info `(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Wyświetlenie dokumentacji dla KLAWISZA"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Opis klawisza: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s jest niezdefiniowany."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s jest niezdefiniowany."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s jest zdefiniowany na %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Pokazanie co nacisnąć, aby wykonać zadane polecenie"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Polecenie do znalezienia: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' nie ma pod żadnym klawiszem"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s można wywołać tylko przez %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s można wywołać przez %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Nie ma funkcji o nazwie `%s'"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Autorzy nie dają ŻADNYCH gwarancji. Ten program można rozprowadzać\n"
+"zachowując warunki Powszechnej Licencji Publicznej GNU (General Public\n"
+"License).\n"
+"Więcej informacji na ten temat można znaleźć w plikach o nazwie COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "błędna liczba argumentów"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "nie można otworzyć pliku wejściowego `%s'"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "nie można utworzyć pliku wyjściowego `%s'"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "błąd podczas zapisu do `%s'"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "błąd podczas zamykania pliku wyjściowego `%s'"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "sekwencja klawiszy zbyt długa"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "brak sekwencji klawiszy"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "znak NUL (\\000) nie jest dozwolony"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "znak NUL (^%c) nie jest dozwolony"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "brakująca nazwa akcji"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "sekcja zbyt długa"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "nieznana akcja `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "nazwa akcji zbyt długa"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "nadmiarowe znaki po akcji `%s'"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "brakująca nazwa zmiennej"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "brakujący `=' bezpośrednio po nazwie zmiennej"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "nazwa zmiennej zbyt długa"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "wartość zbyt długa"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", linia %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Składnia: %s [OPCJA]... [PLIK-WEJŚCIOWY]\n"
+"\n"
+"Kompilowanie pliku źródłowego infokey do pliku infokey. Odczytywany jest\n"
+"PLIK-WEJŚCIOWY (domyślnie $HOME/.infokey), a skompilowany plik klawiszy\n"
+"zapisywany jest (domyślnie) do $HOME/.info.\n"
+"\n"
+"Opcje:\n"
+" --output PLIK zapis do PLIKU zamiast do $HOME/.info\n"
+" --help wyświetlenie tej pomocy i zakończenie.\n"
+" --version wyświetlenie informacji o wersji i zakończenie.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Zignorowany błędny plik infokey `%s' - zbyt mały"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Zignorowany błędny plik infokey `%s' - zbyt duży"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Błąd podczas czytania pliku infokey `%s' - skrócony odczyt"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Błędny plik infokey `%s' (złe liczby magiczne) - można go uaktualnić infokey"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+"Plik infokey `%s' jest przestarzały - można go uaktualnić poleceniem infokey"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Błędny plik infokey `%s' (zła długość sekcji) - można go uaktualnić infokey"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Błędny plik infokey `%s' (zły kod sekcji) - można go uaktualnić przez infokey"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Błędne dane w pliku infokey - część przypisań klawiszy zignorowana"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "Błędne dane w pliku infokey - część ustawień zmiennych zignorowana"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Odczytanie nazwy polecenia Info i opisanie go"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Opis polecenia: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Odczytanie nazwy polecenia w obszarze echo i wykonanie go"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Nie można tutaj wykonać polecenia `echo-area'."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "Niezdefiniowane polecenie: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Ustawienie wysokości wyświetlanego okna"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Ustawienie wysokości ekranu na (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Pliki źródłowe przeszukane, aby ten plik zawierał:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Nie można obrabiać pliku %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (Plik)Węzeł Linie Rozmiar Zawiera plik\n"
+" ----------- ----- ------- ------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Oto jest menu ostatnio odwiedzonych węzłów.\n"
+"Można wybrać jeden z tego menu lub użyć `\\[history-node]' w innym oknie.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+"Utworzenie okna zawierającego menu wszystkich aktualnie odwiedzanych węzłów"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Wybranie węzła, który był poprzednio odwiedzony w widocznym oknie"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Wybranie widocznego węzła: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Odsyłacz zniknął! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Witamy w Info w wersji %s. \\[get-help-window] pokazuje pomoc, \\[menu-item] "
+"wybiera element menu."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Przejście w dół do następnej linii"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Przejście w górę do poprzedniej linii"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Przejście na koniec linii"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Przejście na początek linii"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Następny"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Przejście do węzła Następny..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Wybranie pierwszego elementu menu..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Wybranie węzła Następny..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Przejście W górę %d raz(y), potem Następny."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Nie ma więcej węzłów w tym dokumencie."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Nie ma węzła `Poprzedni' dla tego węzła."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Przejście do węzła Poprzedni w tym oknie."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr ""
+"Nie ma węzłów `Poprzedni' ani `W górę' dla tego węzła w tym dokumencie."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Przejście do węzła W górę w tym oknie."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Przejście do ostatniego elementu menu węzła Poprzedni."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Przejście do przodu lub w dół struktury węzła"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Przejście do tyłu lub w górę struktury węzła"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Przewijanie do przodu w tym oknie"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"Przewijanie do przodu w tym oknie i ustawienie domyślnego rozmiaru okna"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Przewijanie do przodu w tym oknie pozostając wewnątrz węzła"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Przewijanie do przodu w tym oknie wewn. węzła i ust. domyślnego rozmiaru okna"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Przewijanie do tyłu w tym oknie"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "Przewijanie do tyłu w tym oknie i ustawienie domyślnego rozmiaru okna"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Przewijanie do tyłu w tym oknie pozostając wewnątrz węzła"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Przewijanie do tyłu w tym oknie wewn. węzła i ust. domyślnego rozmiaru okna"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Przejście na początek tego węzła"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Przejście na koniec tego węzła"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Przewijanie w dół po linii"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Przewijanie w górę po linii"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Przewijanie w dół po połowie rozmiaru ekranu"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Przewijanie w górę po połowie rozmiaru ekranu"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Wybranie następnego okna"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Wybranie poprzedniego okna"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Podzielenie aktualnego okna"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Usunięcie aktualnego okna"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Nie można usunąć stałego okna"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Usunięcie wszystkich innych okien"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Przewijanie innego okna"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Przewijanie innego okna do tyłu"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Powiększenie (lub zmniejszenie) tego okna"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Podzielenie dostępnego miejsca na ekranie między widoczne okna"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Zmiana stanu zawijania linii w aktualnym oknie"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Wybranie węzła Następny"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Wybranie węzła Poprzedni"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Wybranie węzła W górę"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Wybranie ostatniego węzła w tym pliku"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "To okno nie ma dodatkowych węzłów"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Wybranie pierwszego węzła w tym pliku"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Wybranie ostatniego elementu w menu tego węzła"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Wybranie tego elementu menu"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Nie ma %d elementów w tym menu."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Element menu (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Element menu: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Przejście za odnośnikiem (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Przejście za odnośnikiem: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Odczytanie elementu menu i wybranie jego węzła"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Odczytanie przypisu lub odsyłacza i wybranie jego węzła"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Przejście na początek menu tego węzła"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Odwiedzenie jednocześnie jak największej liczby elementów menu"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Odczytanie nazwy węzła i wybranie go"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Przejście do węzła: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Brak menu w węźle `%s'."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Brak elementu menu `%s' w węźle `%s'."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Nie można znaleźć węzła wskazywanego przez `%s' w `%s'."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Odczytanie listy menu począwszy od katalogu i podążanie za nią"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Podążanie za menu: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Szukanie węzła opisującego wywołanie programu"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Szukanie węzła Invocation dla [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Odczytanie odnośnika do strony podręcznika i wybranie go"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Pobranie strony podręcznika: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Wybranie węzła `Szczytowy' w tym pliku"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Wybranie węzła `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Zabicie węzła (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Nie można zabić węzła `%s'"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Nie można zabić ostatniego węzła"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Wybranie ostatnio wybranego węzła"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Zabicie tego węzła"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Odczytanie nazwy pliku i wybranie go"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Szukanie pliku: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Nie można znaleźć `%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Nie można utworzyć pliku wyjściowego `%s'."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Gotowe."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Zapisywanie węzła %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Przepuszczenie zawartości tego pliku przez INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Nie można otworzyć potoku do `%s'."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Drukowanie węzła %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Szukanie podpliku %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Odczytanie łańcucha i poszukiwanie go uwzględniając wielkość liter"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Odczytanie łańcucha i poszukiwanie go"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Odczytanie łańcucha i poszukiwanie go w tył"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%słańcucha [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Poszukiwanie w tył"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Poszukiwanie"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " uwzględniając wielkość liter "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Poszukiwanie nie powiodło się."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Powtórzenie ostatniego poszukiwania w tym samym kierunku"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Brak poprzedniego szukanego łańcucha"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Powtórzenie ostatniego poszukiwania w odwrotnym kierunku"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Interaktywne poszukiwanie łańcucha w trakcie wpisywania go"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "Interaktywne poszukiwanie wstecz: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "Interaktywne poszukiwanie: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Bez powodzenia "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Przejście do poprzedniego odsyłacza"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Przejście do następnego odsyłacza"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Wybranie odsyłacza lub elementu menu występującego w tej linii"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Anulowanie bieżącej operacji"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Wyjście"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Przesunięcie kursora do podanej linii w oknie"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Odrysowanie ekranu"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Wyjście z Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Uruchomienie polecenia przypisanego do wariantu klawisza z małą literą"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Nieznane polecenie (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" jest niepoprawne"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "`%s' jest niepoprawne"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Dodanie tej cyfry do aktualnego argumentu liczbowego"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Rozpoczęcie (lub pomnożenie przez 4) aktualnego argumentu liczbowego"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Wewnętrznie używane przez \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Zabrakło pamięci wirtualnej!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Jeśli \"On\", przypisy pojawiają się i znikają automatycznie"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr "Jeśli \"On\", tworzenie lub usuwanie okna zmienia rozmiar innych okien"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Jeśli \"On\", mignięcie ekranu zamiast dźwiękowego dzwonka"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Jeśli \"On\", błędy wywołują sygnał ostrzegawczy"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "Jeśli \"On\", Info sprząta pliki, które musiały zostać rozpakowane"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Jeśli \"On\", dopasowana część szukanego łańcucha jest podświetlana"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Kontrola, co dzieje się przy próbie przewijania na końcu węzła"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Liczba linii do przewinięcia kiedy kursor wychodzi za okno"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Jeśli \"On\", Info przyjmuje i wyświetla znaki ISO Latin"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Wyjaśnienie użycia zmiennej"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Opisanie zmiennej: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Ustawienie wartości zmiennej Info"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Ustawienie zmiennej: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Ustawienie %s na wartość (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Ustawienie %s na wartość (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Znaczniki są nieaktualne ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), linii ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d linii --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d linii --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Podplik: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opcja `%s' jest niejednoznaczna\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opcja `--%s' nie przyjmuje argumentów\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opcja `%c%s' nie przyjmuje argumentów\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opcja `%s' wymaga argumentu\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: nierozpoznana opcja `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: nierozpoznana opcja `%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: nieprawidłowa opcja -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: błędna opcja -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opcja wymaga argumentu -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opcja `-W %s' jest niejednoznaczna\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opcja `-W %s' nie przyjmuje argumentu\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "zignorowano argumenty dla @%s"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "stycznia"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "lutego"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "marca"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "kwietnia"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "maja"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "czerwca"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "lipca"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "sierpnia"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "września"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "października"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "listopada"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "grudnia"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "niechciany znak %c w @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "argument @sc zawiera same wielkie litery, więc brak efektu"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "oczekiwano `{', ale napotkano `%c'"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "koniec pliku wewnątrz bloku verb"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "oczekiwano `}', ale napotkano `%c'"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@string{Note...} tworzy nieprawdziwe odniesienia w Info; należy "
+"przeredagować aby zapobiec temu"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s jest przestarzałe"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp wymaga argumentu będącego liczbą dodatnią, a nie `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Zły argument dla %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "zachowaj"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "brak"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "Zły argument dla @%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "wstaw"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Brakuje `}' w argumencie @def"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funkcja"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Forma specjalna"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Zmienna"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Opcja użytkownika"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instancja zmiennej"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metoda"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "typu"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "na"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Trzeba być w środowisku `@%s', aby użyć `@%s'"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "Pominięto `%s' przed nazwą pliku wyjściowego"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "Pominięto `%s' przy zapisie na standardowe wyjście"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Bufor wyjściowy niepusty."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' wymaga argumentu `{...}', a nie tylko `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Nie zamknięty nawias dla przypisu `%s'"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Zdefiniowano przypis bez węzła nadrzędnego"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Przypisy wewnątrz przypisów nie są dozwolone"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Przypisy"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: nie można otworzyć pliku css: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: plik css zakończył się wewnątrz komentarza"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Bez tytułu"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[nieoczekiwane] brak znacznika html do zdjęcia"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[nieoczekiwane] błędna nazwa węzła: `%s'"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Nieznany indeks `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info nie może obsłużyć `:' we wpisie indeksu `%s'"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Indeks `%s' już istnieje"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Nieznany indeks `%s' i/lub `%s' w @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(linia )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(linia %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Nieznany indeks `%s' w @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Wpis dla indeksu `%s' poza jakimkolwiek węzłem"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(poza jakimkolwiek węzłem)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Patrz "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item nie jest dozwolone w argumencie @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Broken-Type w insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Przepełnienie stosu numerowania"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "przepełnienie, restart od %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s wymaga argumentu: formatowania dla %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "Środowiska %cfloat nie mogą być zagnieżdżone"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' oczekiwało `%s', ale napotkano `%s'"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Brak pasującego `%cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s wymaga litery lub cyfry"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "koniec pliku wewnątrz bloku dosłownego"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s nic nie znaczy poza środowiskiem `@float'"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "napotkano @menu przed pierwszym @node, tworzenie węzła `Top'"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "może węzeł @top powinien być otoczony @ifnottex, a nie @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "napotkano @detailmenu przed pierwszym węzłem, tworzenie węzła `Top'"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr "@%s nic nie znaczy poza środowiskami `@titlepage' i `@quotation'"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s nic nie znaczy poza środowiskiem `@titlepage'"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Niedopasowane `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "`%c%s' wymaga czegoś po sobie"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Zły argument `%s' dla `@%s', użycie `%s'"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s nic nie znaczy wewnątrz bloku `@%s'"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx nic nie znaczy wewnątrz bloku `%s'"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "znaleziono %c%s na zewnątrz bloku wstawki"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s nie jest poprawnym kodem języka zgodnym z ISO 639"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "nierozpoznana nazwa kodowania `%s'"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "niestety kodowanie `%s' nie jest obsługiwane"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "błędnie zakodowany znak `%s'"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s oczekuje `i' lub `j' jako argumentu, a nie `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s oczekuje pojedynczego znaku `i' lub `j' jako argumentu"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makro `%s' już zostało zdefiniowane"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "oto poprzednia definicja `%s'"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "po \\ w rozwinięciu makra występuje `%s' zamiast nazwy parametru"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makro `%s' wywołane w linii %d ze zbyt dużą liczbą argumentów"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "nie znaleziono makra %cend"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg jest użyteczne tylko do makr jednoargumentowych"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "niedopasowane @end %s do @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Zbyt dużo błędów! Poddaję się.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: uwaga: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Źle umieszczone %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Polecenie `%s --help' poda więcej informacji.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Składnia: %s [OPCJA]... PLIK-TEXINFO...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Tłumaczenie źródłowej dokumentacji Texinfo do różnych innych formatów,\n"
+"domyślnie plików Info nadających się do czytania pod Emacsem lub "
+"samodzielnym\n"
+"GNU Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Opcje ogólne:\n"
+" --error-limit=ILE zakończenie po ILU błędach (domyślnie %d).\n"
+" --force zachowanie wyjścia nawet w przypadku błędów.\n"
+" --help wyświetlenie tego opisu i zakończenie.\n"
+" --no-validate pominięcie kontroli odsyłaczy między węzłami.\n"
+" --no-warn pominięcie ostrzeżeń (ale nie błędów).\n"
+" --reference-limit=ILE ostrzeżenie o najwyżej ILU odsyłaczach\n"
+" (domyślnie %d).\n"
+" -v, --verbose wyjaśnianie co się dzieje.\n"
+" --version wyświetlenie informacji o wersji i "
+"zakończenie.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Wybór formatu wyjściowego (domyślnym jest info):\n"
+" --docbook wyprodukowanie DocBook XML zamiast Info.\n"
+" --html wyprodukowanie HTML zamiast Info.\n"
+" --xml wyprodukowanie Texinfo XML zamiast Info.\n"
+" --plaintext wyprodukowanie czystego tekstu zamiast Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Ogólne opcje dotyczące wyjścia:\n"
+" -E, --macro-expand PLIK zapis źródeł z rozwiniętymi makrami do PLIKU.\n"
+" --no-headers pominięcie separatorów węzłów, linii Node, oraz\n"
+" menu z wyjścia Info (zapisanie czystego "
+"tekstu)\n"
+" lub z HTML (zapisanie krótszego pliku);\n"
+" także pisanie domyślnie na standardowe "
+"wyjście.\n"
+" --no-split pominięcie dzielenia Info lub HTML, generowanie\n"
+" tylko jednego pliku wyjściowego.\n"
+" --number-sections zapisywanie numerów rozdziałów i sekcji.\n"
+" -o, --output=PLIK zapisanie do PLIKU (katalogu w przypadku "
+"dzielonego\n"
+" HTML), ignorując wszelkie @setfilename.\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Opcje dla Info i czystego tekstu:\n"
+" --enable-encoding zapis znaków z akcentami i specjalnych w "
+"pliku\n"
+" Info w zależności od @documentencoding.\n"
+" --fill-column=ILE łamanie linii Info po ILU znakach (domyślnie %"
+"d).\n"
+" --footnote-style=STYL zapis stopek w Info zgodnie ze STYLEM:\n"
+" `separate' - umieszczenie ich we własnym "
+"węźle;\n"
+" `end' - umieszczenie na końcu węzła, w "
+"którym\n"
+" zostały zdefiniowane (domyślne).\n"
+" --paragraph-indent=ILE wcięcia akapitów Info o ILE spacji (domyślnie %"
+"d).\n"
+" Jeśli ILE to `none' lub `brak', bez wcięć;\n"
+" jeśli ILE to `asis' lub `zachowaj', "
+"zachowanie\n"
+" istniejących wcięć.\n"
+" --split-size=ROZMIAR podział Info na pliki o ROZMIARZE (domyślnie %"
+"d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"Opcje dla HTML:\n"
+" --css-include=PLIK dołączenie PLIKU w wyjściu HTML <style>;\n"
+" jeśli PLIK to -, czytane jest standardowe\n"
+" wejście\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"Opcje dla XML i Docbooka:\n"
+" --output-indent=ILE wcięcia elementów XML o ILE spacji "
+"(domyślnie\n"
+" %d). Jeśli ILE jest 0, pomijalne spacje "
+"są\n"
+" usuwane.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Opcje dla pliku wejściowego:\n"
+" --commands-in-node-names dopuszczenie poleceń @ w nazwach węzłów.\n"
+" -D ZMIENNA zdefiniowanie ZMIENNEJ, tak jak przez @set.\n"
+" -I KATALOG dołączenie KATALOGU na początku ścieżki\n"
+" poszukiwań dla @include.\n"
+" -P KATALOG dołączenie KATALOGU na końcu ścieżki\n"
+" poszukiwań dla @include.\n"
+" -U ZMIENNA usunięcie definicji ZMIENNEJ, tak jak "
+"@clear.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Warunkowe przetwarzanie wejścia:\n"
+" --ifdocbook przetwarzanie @ifdocbook i @docbook nawet jeśli nie "
+"jest\n"
+" generowany Docbook.\n"
+" --ifhtml przetwarzanie @ifhtml i @html nawet jeśli nie jest\n"
+" generowany HTML.\n"
+" --ifinfo przetwarzanie @ifinfo nawet jeśli nie jest generowane "
+"Info.\n"
+" --ifplaintext przetwarzanie @ifplaintext nawet jeśli nie jest "
+"generowany\n"
+" czysty tekst.\n"
+" --iftex przetwarzanie @iftex i @tex; wymusza --no-split.\n"
+" --ifxml przetwarzanie @ifxml i @xml.\n"
+" --no-ifdocbook nie przetwarzanie tekstu @ifdocbook i @docbook.\n"
+" --no-ifhtml nie przetwarzanie tekstu @ifhtml i @html.\n"
+" --no-ifinfo nie przetwarzanie tekstu @ifinfo.\n"
+" --no-ifplaintext nie przetwarzanie tekstu @ifplaintext.\n"
+" --no-iftex nie przetwarzanie tekstu @iftex i @tex.\n"
+" --no-ifxml nie przetwarzanie tekstu @ifxml i @xml.\n"
+"\n"
+" Ponadto opcje --no-ifFORMAT powodują przetwarzanie tekstu @ifnotFORMAT.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Domyślne opcje dla warunków @if... zależą od formatu wyjściowego:\n"
+" jeśli generowany jest HTML, --ifhtml jest włączone, a reszta wyłączona;\n"
+" jeśli generowane jest Info, --ifinfo jest włączone, a reszta wyłączona;\n"
+" jeśli generowany jest tekst, --ifplaintext jest włączony, a inne "
+"wyłączone;\n"
+" jeśli generowany jest XML, --ifxml jest włączone, a reszta wyłączona.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Przykłady:\n"
+" makeinfo foo.texi zapisanie Info do @setfilename z "
+"foo\n"
+" makeinfo --html foo.texi zapisanie HTML do @setfilename\n"
+" makeinfo --xml foo.texi zapisanie Texinfo XML do "
+"@setfilename\n"
+" makeinfo --docbook foo.texi zapisanie DocBook XML do "
+"@setfilename\n"
+" makeinfo --no-headers foo.texi zapisanie czystego tekstu na\n"
+" standardowe wyjście\n"
+"\n"
+" makeinfo --html --no-headers foo.texi zapisanie HTML bez linii węzłów i "
+"menu\n"
+" makeinfo --number-sections foo.texi zapisanie Info z numerowanymi "
+"sekcjami\n"
+" makeinfo --no-split foo.texi zapisanie jednego wielkiego pliku "
+"Info\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: Zignorowano nierozpoznaną wartość TEXINFO_OUTPUT_FORMAT `%s'.\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: argument %s musi być liczbą, a nie `%s'.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: nie można otworzyć wyjścia `%s' do zapisu rozwinięć makr"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: zignorowano drugie wyjście `%s' do zapisu rozwinięć makr.\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: argument --paragraph-indent musi być liczbą/`none'/`asis', a nie `%s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: argumentem --footnote-style musi być `separate' lub `end', a nie `%s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: brakujący argument plikowy.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Niewłaściwie użyte wieloliniowe polecenie %c%s"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Oczekiwano `%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Nie można utworzyć katalogu `%s': %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Nie znaleziono `%s' w `%s'"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: nie zapisywanie rozwinięć makr na stdout, bo tam zapisywane jest Info.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Tworzenie pliku %s `%s' z `%s'.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "To jest %s, wyprodukowany przez makeinfo w wersji %s z %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Usuwanie pliku wyjścia makr `%s' z powodu błędów; --force pozwoli "
+"zachować.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Usuwanie pliku wyjściowego `%s' z powodu błędów; --force pozwoli "
+"zachować.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Nieznane polecenie `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+"Należy użyć nawiasów klamrowych, aby podać polecenie jako argument dla @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s oczekiwało nawiasów klamrowych"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Niedopasowany }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "BEZ_NAZWY!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "w %c%s brakuje klamry zamykającej"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "Plik @image `%s' (dla HTML) nieczytelny: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Nie ma pliku `%s'"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "Plik @image `%s' (dla tekstu) nieczytelny: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "Po @image brakuje argumentu plikowego"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "niezdefiniowana flaga: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Brak wartości dla `%s'}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s wymaga nazwy"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Osiągnięto koniec pliku przed znalezieniem @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' jest zbyt długie do rozwinięcia; nie rozwinięto"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Brakujący } we wzorcu @multitable"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "zignorowano zabłąkany tekst `%s' po @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Zbyt dużo kolumn w elemencie multitable (maksymalnie %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[nieoczekiwane] nie można wybrać kolumny #%d w multitable"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "zignorowano @tab poza multitable"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Wielokolumnowe wyjście z ostatniego wiersza:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolumna #%d: wyjście = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Węzeł `%s' poprzednio zdefiniowany w linii %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Formatowanie węzła %s...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Węzeł `%s' wymaga polecenia wybierającego (np. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Nie podano nazwy węzła dla polecenia `%c%s'"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Znacznik `%s' i węzeł `%s' odwzorowują się na tą samą nazwę pliku"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "Zignorowano to polecenie @anchor; wskazania na nie nie będą działały"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Należy zmienić ten znacznik lub użyć opcji `--no-split'"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Nieoczekiwany łańcuch na końcu pliku dzielonego HTML `%s'"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Następny:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Poprzedni:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "W górę:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Znaczniki `%s' i `%s' odwzorowują się na tą samą nazwę pliku"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "zignorowano polecenie @anchor; wskazania na nie nie będą działały"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%s wskazuje na nieistniejący węzeł `%s' (może błędny podział na sekcje?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Menu"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Odsyłacz"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Pole Następny węzła `%s' nie wskazywane (może błędny podział na sekcje?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Ten węzeł (%s) ma złe pole Poprzedni"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Poprzedni"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Pole Poprzedni węzła `%s' nie wskazywane"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Ten węzeł (%s) ma złe pole Następny"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "`%s' nie ma pola W górę (może błędny podział na sekcje?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "W górę"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"Węzeł `%s' nie ma elementu menu dla `%s' pomimo bycia jego celem W górę"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "węzeł `%s' był wskazywany %d razy"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "nie wskazywany węzeł `%s'"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "Usuwanie %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Nie można usunąć pliku `%s': %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Załącznik %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Błąd wewnętrzny (search_sectioning) `%s'!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Błąd wewnętrzny (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s jest przestarzałe; należy użyć %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Węzeł z %ctop jako sekcją już istnieje"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Tutaj jest węzeł %ctop"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop użyty przed %cnode, użycie domyślnego %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Spis treści"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Skrót treści"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "Plik @image `%s' nieczytelny: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"@headitem jako ostatni element @multitable tworzy niepoprawne dokumenty "
+"Docbook"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: uwaga: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " dla %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\t`%s --help' poda pełną listę opcji.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Składnia: %s [OPCJA]... [PLIK-INFO [PLIK-KATALOGU]]\n"
+"\n"
+"Instalacja lub usunięcie wpisów katalogu dla PLIKU-INFO w pliku katalogu\n"
+"Info PLIK-KATALOGU.\n"
+"\n"
+"Opcje:\n"
+" --delete usunięcie istniejących wpisów dla PLIKU-INFO\n"
+" z PLIKU-KATALOGU; nie wstawianie nowych wpisów.\n"
+" --dir-file=NAZWA podanie nazwy pliku z katalogiem Info.\n"
+" Jest to odpowiednik użycia argumentu PLIK-KATALOGU.\n"
+" --entry=TEKST wstawienie TEKSTU jako wpisu katalogu Info.\n"
+" TEKST powinien mieć formę linii elementu menu Info\n"
+" z zerem lub więcej linii zaczynającymi się od spacji.\n"
+" Jeśli podano więcej niż jeden wpis, wszystkie są "
+"dodawane.\n"
+" Jeśli nie podano żadnego wpisu, są określane na "
+"podstawie\n"
+" informacji w samym pliku Info.\n"
+" --help wyświetlenie tego opisu i zakończenie.\n"
+" --info-file=PLIK podanie pliku Info do zainstalowania w katalogu.\n"
+" Jest to odpowiednik użycia argumentu PLIK-INFO.\n"
+" --info-dir=KAT to samo co --dir-file=KAT/dir.\n"
+" --item=TEKST to samo co --entry TEKST.\n"
+" Wpis w katalogu Info jest elementem menu.\n"
+" --quiet pominięcie ostrzeżeń.\n"
+" --remove to samo co --delete.\n"
+" --section=SEKCJA umieszczenie wpisów dla tego pliku w danej SEKCJI "
+"katalogu.\n"
+" Jeśli podano więcej niż jedną sekcję, wszystkie wpisy "
+"są\n"
+" dodawane do każdej z sekcji.\n"
+" Jeśli nie podano żadnej sekcji, są określane na "
+"podstawie\n"
+" informacji w samym pliku Info.\n"
+" --version wyświetlenie informacji o wersji i zakończenie.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"To jest plik .../info/dir, zawierający najwyższy\n"
+"węzeł hierarchii Info, o nazwie (dir)Top.\n"
+"Przy pierwszym uruchomieniu Info zaczyna się od tego węzła.\n"
+"\n"
+"%s\tOto wierzchołek drzewa INFO\n"
+"\n"
+" To (węzeł Katalog) zawiera menu dla głównych tematów.\n"
+" Naciśnięcie \"q\" kończy przeglądanie, \"?\" wyświetla wszystkie "
+"polecenia\n"
+" Info, \"d\" wraca tutaj, \"h\" pokazuje wprowadzenie dla nowicjuszy,\n"
+" \"mEmacs<Return>\" odwiedza podręcznik Emacsa itd.\n"
+"\n"
+" W Emacsie można kliknąć drugim przyciskiem myszy na elemencie menu lub\n"
+" odsyłaczu, aby go wybrać.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: nie można odczytać (%s) ani utworzyć (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: pusty plik"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY bez odpowiadającego END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY bez odpowiadającego START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: plik katalogu już istnieje: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Należy podać plik Info tylko raz.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "nadmiarowy argument linii poleceń `%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Nie podano pliku wejściowego; --help może podać więcej informacji."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Nie podano pliku katalogu; --help może podać więcej informacji."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "brak wpisu do katalogu info w `%s'"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "element menu `%s' już istnieje, dla pliku `%s'"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "nie znaleziono wpisów dla `%s'; nic nie usunięto"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "wyświetlenie tego opisu i zakończenie"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "zachowanie plików tymczasowych po przetwarzaniu"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "nie zachowywanie plików tymczasowych po przetwarzaniu (domyślne)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "zapisanie wyjścia do PLIKU"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "wyświetlenie informacji o wersji i zakończenie"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Składnia: %s [OPCJA]... PLIK...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr ""
+"Generowanie posortowanego indeksu dla każdego PLIKU wyjściowego w TeXu.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Zazwyczaj PLIK... podaje się jako `foo.%c%c' dla dokumentu `foo.texi'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcje:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: nie jest plikiem indeksu texinfo"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "błąd podczas ponownego otwierania %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Brak numeru strony w %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "wpis %s wystąpił po wpisie z dodatkową nazwą"
diff --git a/Build/source/utils/texinfo/po/quot.sed b/Build/source/utils/texinfo/po/quot.sed
new file mode 100644
index 00000000000..0122c46318d
--- /dev/null
+++ b/Build/source/utils/texinfo/po/quot.sed
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
diff --git a/Build/source/utils/texinfo/po/remove-potcdate.sin b/Build/source/utils/texinfo/po/remove-potcdate.sin
new file mode 100644
index 00000000000..2436c49e786
--- /dev/null
+++ b/Build/source/utils/texinfo/po/remove-potcdate.sin
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/Build/source/utils/texinfo/po/ro.gmo b/Build/source/utils/texinfo/po/ro.gmo
new file mode 100644
index 00000000000..3a4129a8a99
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ro.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/ro.po b/Build/source/utils/texinfo/po/ro.po
new file mode 100644
index 00000000000..7979e8f3ff2
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ro.po
@@ -0,0 +1,3125 @@
+# Mesajele în limba română pentru texinfo.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Acest fişier este distribuit sub aceeaşi licenţă ca şi pachetul texinfo.
+# Laurentiu Buzdugan <lbuz@rolix.org>, 2003, 2004.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.90\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-04 12:00+05\n"
+"Last-Translator: Laurentiu Buzdugan <lbuz@rolix.org>\n"
+"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Mergi înainte un caracter"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Mergi înapoi un caracter"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Mergi la începutul acestei linii"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Mergi la sfârşitul acestei linii"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Mergi înainte un cuvânt"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Mergi înapoi un cuvânt"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Şterge caracterul de sub cursor"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Şterge caracterul din stânga cursorului"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Renunţă sau termină operaţiunea"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Acceptă (sau forţează completarea) acestei linii"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Inserează următorul caracter identic (verbatim)"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Inserează acest caracter"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Inserează un caracter TAB"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transpune caracterele la acest punct"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Extrage înapoi conţinutul ultimei ştergeri (kill)"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Inelul de ştergeri (kill) e gol"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Extrage înapoi o ştergere (kill) anterioară"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Şterge (kill) până la sfârşitul liniei"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Şterge (kill) până la începutul liniei"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Şterge (kill) cuvântul din dreapta cursorului"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Şterge (kill) cuvăntul din stânga cursorului"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Nici o completare"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Nu e completat"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Enumeră completările posibile"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "O singură completare"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "O completare:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d completări:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Inserează completarea"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Construim completările..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Scroll fereastra de completări"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Notele de subsol nu pot fi afişate"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Arată notele de subsol asociate cu acest nod în această fereastră"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "------- Note de subsol -------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Caută un şir în indexul acestui fişier"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Căutăm intrări în index..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Nici am găsit nici un index."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Intrare în index: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Mergi la următorul articol de index ce se potriveşte ultimei comenzi `"
+"\\[index-search]'"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Nu există nici un şir căutat anterior."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Nici o intrare în index."
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Nici o intrare în %sindex conţinând `%s'."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "mai mult"
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "NU POT VEDEA ACEASTA"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"Am găsit `%s' în %s. (`\\[next-index-match]' încearcă să găsească următorul.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Scanăm indexurile pentru `%s'..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Nici un fişier info nu are `%s' în indexurile lor."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Caută în toţi indexurile fişierului pentru un şir şi contruieşte un meniu"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Index apropos: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Meniu: Noduri a căror indexurile conţin `%s':\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Încercaţi --help pentru informaţii suplimentare.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Nu există NICI o garanţie. Puteţi redistribui acest software conform\n"
+"termenilor Licenţei Publice Generale GNU (GNU GPL). Pentru informaţii\n"
+"suplimentare despre aceste chestiuni, vedeţi fişierul numit COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "nici o intrare de index a fost găsită pentru `%s'\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly fii prietenos cu sintetizatoarele de "
+"vorbire.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Folosire: %s [OPŢIUNE]... [ARTICOL-MENIU...]\n"
+"\n"
+"Citeşte documentaţie în formatul Info.\n"
+"\n"
+"Opţiuni:\n"
+" --apropos=ŞIR caută ŞIR în toţi indexurile tuturor "
+"manualelor.\n"
+" -d, --directory=DIR adaugă DIR la INFOPATH.\n"
+" --dribble=NUMEFIŞIER aminteşte ce tastează utilizatorul în "
+"NUMEFIŞIER.\n"
+" -f, --file=NUMEFIŞIER specifică fişierul Info de vizitat.\n"
+" -h, --help afişează acest mesaj şi termină.\n"
+" --index-search=STRING mergi la nodul referit de intrarea indexului "
+"ŞIR.\n"
+" -n, --node=NUMENOD specifică nodurile în primul fişier Info "
+"vizitat.\n"
+" -o, --output=NUMEFIŞIER scrie nodurile selectate în NUMEFIŞIER.\n"
+" -R, --raw-escapes scrie \"raw\" escape-uri ANSI (implicit).\n"
+" --no-raw-escapes scrie escape-urile ca text normal.\n"
+" --restore=NUMEFIŞIER citeşte apăsările de teste iniţiale din "
+"NUMEFIŞIER.\n"
+" -O, --show-options, --usage mergi la nodul cu opţiunile liniei de "
+"comandă.\n"
+"%s --subnodes afişează recursiv articolele de meniu.\n"
+" -w, --where, --location afişează locaţia fizică a fişierului Info.\n"
+" --vi-keys foloseşte key bindings similare cu cele din "
+"vi şi less.\n"
+" --version afişează informaţii versiune şi termină.\n"
+"\n"
+"Primul argument ce nu e o opţiune, dacă e prezent, este articolul de meniu\n"
+"de la care se începe; acesta este căutat în toate fişierele `dir' din\n"
+"INFOPATH. Dacă acesta nu este prezent, info combină toate fişierele `dir'\n"
+"şi arată rezultatul. Restul argumentelor sunt tratate ca nume de articole\n"
+"de meniu relative la nodul vizitat iniţial.\n"
+"\n"
+"Exemple:\n"
+" info arată conţinutul dir-ectorului din meniul\n"
+" nivelului de vârf\n"
+" info emacs începe la nodul emacs din dir-ectorul nivelului\n"
+" de vârf\n"
+" info emacs buffers începe la nodul buffere din manualul emacs\n"
+" info --show-options emacs începe la nodul cu opţiunile liniei de\n"
+" comandă pentru emacs\n"
+" info -f ./foo.info arată fişierul ./foo.info, nu căuta dir\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Trimiteţi emailuri raportând bug-uri la bug-texinfo@gnu.org,\n"
+"întrebări generale şi discuţii la help-texinfo@gnu.org.\n"
+"Texinfo homepage: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Nu pot găsi nodul `%s'."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Nu pot găsi nodul `(%s)%s'."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Nu pot găsi o fereastră!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Punctul nu apare în interiorul nodului acestei ferestre!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Nu pot şterge ultima fereastră."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Nici un meniu în acest nod"
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Nici o notă de subsol în acest nod."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Nici o referinţă la acelaşi pasaj în acest nod."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Nici un pointer `%s' pentru acest nod."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Comandă Info necunoscută `%c';încercaţi `?' pentru ajutor."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Terminalul de tip `%s' nu e destul de deştept să ruleze Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Sunteţi deja la ultima pagină a acestui nod."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Sunteţi deja la prima pagină a acestui nod."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "O singură fereastră."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Fereastra rezultantă ar fi prea mică."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Nu e destul spaţiu pentru o fereastră de ajutor, ştergeţi o fereastră."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Comenzi de bază în Fereastra Info\n"
+"*********************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Termină acest ajutor.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Termină Info complet.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Invocaţi tutorialul Info.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Selectaţi alte noduri:\n"
+"----------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Mergi la \"următorul\" nod al acestui nod.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Mergi la nodul \"precedent\" al acestui nod.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Mergi în \"sus\" de la acest nod.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Alege articol meniu specificat prin nume.\n"
+" Alegând un articol de meniu face ca alt nod să fie selectat.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Urmează o referinţă încrucişată. Citeşte numele "
+"referinţei.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+"\\%-10[history-node] Mergi la ultimul nod văzut în această fereastră.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Sări la următoarea legătură hypertext din acest "
+"nod.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Sări la legătura hypertext precedentă din acest "
+"nod.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Urmează legătura hypertext de sub "
+"cursor.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Mergi la nodul `director'. Echivalent cu `\\[goto-node] "
+"(DIR)'.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Mergi la nodul Vârf. Echivalent cu `\\[goto-node] Top'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Mergi în interiorul nodului:\n"
+"----------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Mergi la începutul acestui nod.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Mergi la sfârşitul acestui nod.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Scroll înainte 1 linie.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Scroll înapoi 1 linie.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Scroll înainte o pagină.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Scroll înapoi o pagină.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Alte comenzi:\n"
+"-------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] Alege primul ... al nouălea articol în meniul nodului.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Alege ultimul articol în meniul nodului.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Caută şirul specificat în intrările indexului acestui\n"
+" fişier Info şi selectează nodul referit de prima intrare "
+"găsită.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Mergi la nodul specificat prin nume.\n"
+" Puteţi include şi un nume de fişier, ca în (NUMEFIŞIER)"
+"NUMENOD.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Caută înainte un şir specificat\n"
+" şi selectează nodul în care acesta este găsit.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Caută înapoi un şir specificat\n"
+" şi selectează nodul în care acesta este găsit.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Termină acest ajutor.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Termină Info complet.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Invocă tuturialul Info.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Mergi la nodul `următor' acestui nod.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Mergi la nodul `precedent' acestui nod.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Mergi în `sus' de la acest nod.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Alege articolul de meniu specificat prin nume.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" Alegând un articol de meniu face ca alt nod să fie selectat.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+" %-10s Urmează referinţă la acelaşi pasaj. Citeşte numele referinţei.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Mergi la ultimul nod văzut în această fereastră.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Sări la următoarea legătură hypertext din acest nod.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Sări la legătura hypertext de sub cursor.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Mergi la nodul `director'. Echivalent cu `g (DIR)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Mergi la nodul Vârf. Echivalent cu `g Top'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Scroll înainte o pagină.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Scroll înapoi o pagină.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Mergi la începutul acestui nod.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Mergi la sfârşitul acestui nod.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Scroll înainte 1 linie.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Scroll înapoi 1 linie.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Alege primul ... al nouălea articol în meniul nodului.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Alege ultimul articol în meniul nodului.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s Caută şirul specificat în intrările indexului acestui fişier Info\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " şi selectează nodul referit de prima intrare găsită.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Mergi la nodul specificat prin nume.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Puteţi include şi un nume de fişier, ca în (NUMEFIŞIER)"
+"NUMENOD.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Caută înainte un şir specificat,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " şi selectează nodul în care acesta este găsit.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Caută înapoi un şir specificat\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Calea curentă de căutare este:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Comenzile disponibile în fereastra Info:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Comenzile disponibile în zona de ecou:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Următoarele comenzi pot fi invocate via %s\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Următoarele comenzi nu pot fi deloc invocate:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Folosiţi `\\[history-node]' sau `\\[kill-node]' pentru a termina ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Afişează mesaj de ajutor"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Vizitează nodul Info `(info)Ajutor'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Tipăreşte documentaţie pentru tastă (KEY)"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Descrie tastă (key): %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s nu este definit(ă)."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s nu este definit(ă)."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s este definit(ă) ca %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Arată ce trebuie tasta pentru a executa o anumită comandă"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Unde este comanda: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' nu este pe nici o tastă"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s poate fi invocat doar via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s poate fi invocat via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Nu există nii o funcţie numită `%s'"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Nu există NICI o garanţie. Puteţi redistribui acest software conform\n"
+"termenilor Licenţei Publice Generale GNU (GNU GPL). Pentru informaţii\n"
+"suplimentare despre aceste chestiuni, vedeţi fişierul numit COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "număr incorect de argumente"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "nu pot deschide fişierul de intrare `%s'"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "nu pot crea fişierul de ieşire `%s'"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "eroare la scrierea în `%s'"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "eroare la închiderea fişierului de ieşire `%s'"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "secvenţă de taste prea lungă"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "secvenţă de taste inexistentă"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "caracterul NUL (\\000) nu este permis"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "caracterul NUL (^%c) nu este permis"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "nume de acţiune inexistent"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "secţiune prea lungă"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "acţiune necunoscută `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "nume de acţiune prea lung"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "extra caractere după acţiunea `%s'"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "nume de variabilă inexistent"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "caracterul `=' lipseşte imediat după numele de variabilă"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "nume de variabilă prea lung"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "valoare prea lungă"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", linia %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Folosire: %s [OPŢIUNE]... [FIŞIER-INTRAre]\n"
+"\n"
+"Compilează fişierul sursă infokey în fişier infokey. Citeşte FIŞIER-INTRARE\n"
+"(implicit $HOME/.infokey) şi scrie fişierul cod compilat în (implicit)\n"
+"$HOME/.info.\n"
+"\n"
+"Opţiuni:\n"
+" --output FIŞIER\tieşire în FIŞIER în loc de $HOME/.info\n"
+" --help\t\tafişează acest ajutor şi termină.\n"
+" --version\t\tafişează informaţii versiune şi termină.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ignorăm fişier infokey incorect `%s' - prea mic"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ignorăm fişier infokey incorect `%s' - prea mare"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Eroare la citirea fişierului infokey `%s' - citit scurt"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Fişier infokey incorect `%s' (bad magic numbers) -- rulaţi infokey pentru a-"
+"l actualiza"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+"Fişierul d-voastră infokey `%s' este vechi - rulaţi infokey pentru a-l "
+"actualiza"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Fişier infokey incorect `%s' (bad section length) -- rulaţi infokey pentru a-"
+"l actualiza"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Fişier infokey incorect `%s' (bad section code) -- rulaţi infokey pentru a-l "
+"actualiza"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Date incorecte în fişierul infokey -- unele legături de taste ignorate"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"Date incorecte în fişierul infokey -- unele setări de variabile ignorate"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "citeşte numele unei comenzi Info şi descrie-o"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Descrie comanda: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Citeşte un nume de comandă în zona ecou şi execută-o"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Nu pot executa o comandă `zonă ecou' aici."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "Comandă nedefinită: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Setează înălţimea ferestrei de afişare"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Setează înălţimea ecranului ls (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Fişierele sursă (groveled) pentru a include acest fişier:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Nu ap putut manipula fişierul %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Meniu:\n"
+" (Fişier)Nod Linii Mărime Conţine fişier\n"
+" ----------- ----- ------ --------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Aici este meniul cu nodurile pe care le-aţi vizitat recent.\n"
+"Selectaţi un nod din acest meniu, sau folosiţi `\\[history-node]' în altă "
+"fereastră\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+"Crează o fereastră care conţine un meniu cu toate nodurile vizitate recent"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr ""
+"Selectează un nod care a fost vizitat anterior într-o fereastră vizibilă"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Selectează nodul vizitat: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referinţa a dispărut! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Bine aţi venit la Info versiunea %s. Tastaţi \\[get-help-window] pentru "
+"ajutor, \\[menu-item] pentru un articol din meniu."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Mergi la linia următoare"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Mergi la linia precedentă"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Mergi la sfârşitul liniei"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Mergi la începutul liniei"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Următor"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Urmează nodul Următor..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Selectare primul articol din meniu..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Selectare nod Următor..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Merg în Sus %d ori, apoi Următor."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Nu mai sunt alte noduri în acest document."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Nici un `Prec' pentru acest nod."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Mut Prec în aceată fereastă"
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Nici un `Prec' sau `Sus' pentru acest nod în acest document."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Merg în Sus în această fe"
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Merg la ultimul articol din meniul `Prec'"
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Mergi înainte sau jos prin structura de noduri"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Mergi înapoi sau sus prin structura de noduri"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Scroll înainte în această fereastră"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"Scroll înainte în această fereastră şi setează dimensiunea implicită a "
+"ferestrei"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Scroll înainte în această fereastră, rămâi în nod"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Scroll înainte în această fereastră, rămâi în nod şi setează dimensiunea "
+"implicită a ferestrei"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Scroll înapoi în acestă fereastră"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+"Scroll înapoi în acestă fereastră şi setează dimensiunea implicită a "
+"ferestrei"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Scroll înapoi în această fereastră, rămâi în nod"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Scroll înapoi în această fereastră, rămâi în nod şi setează dimensiunea "
+"implicită a ferestrei"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Mergi la începutul acestui nod"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Mergi la sfârşitul acestui nod"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Scroll jos pe linii"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Scroll sus pe linii"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Scroll jos jumătate de ecran"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Scroll sus jumătate de ecran"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Selectează fereastra următoare"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Selectează fereastra precedentă"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Împarte fereastra curentă"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Şterge fereastra curentă"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Nu pot şterge o fereastră permanentă"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Şterge toate celelalte ferestre"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Scroll-ează cealaltă fereastră"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Scroll-ează cealaltă fereastră înapoi"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Creşte sau micşorează această fereastră"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Împarte spaţiul de ecran disponibil între ferestrele vizibile"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Comută starea reformatării de linie (wrapping) în fereastra curentă"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Selectează nodul Următor"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Selecteză nodul Prec"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Selectează nodul Sus"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Selectează ultimul nod din acest fişier"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Acestă fereastră nu mai are nici un nod"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Selectează primul nod din acest fişier"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Selectează ultimul articol din meniul acestui nod"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Selectează acest articol de meniu"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Nu există %d articole în acest meniu"
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Articol meniu (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Articol meniu: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Urmează ref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Urmează ref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Citeşte un articol de meniu şi selectează nodul său"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Citeşte o notă de subsol sau referinţă şi selectează nodul său"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Mergi la începutul meniului acestui nod"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Vizitează cât mai multe articole de meniu posibile deodată"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Citeşte numele unui nod şi selectează-l"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Du-te la nod: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Nici un meniu în nod `%s'."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Nici un articol de meniu `%s' în nod `%s'."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Nu pot găsi nodul referit de `%s' în `%s'."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Citeşte o listă de meniuri pornind din dir şi urmăreşte-le"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Urmează meniurile: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Găseşte nodul ce descrie invocarea programului"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Găseşte nodul Invocare pentru [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Citeşte o referinţă de pagină de manul şi selectează-o"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Obţine pagină manual (manpage): "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Selectează nodul `Vârf' în acest fişier"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Selectează nodul `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Distruge nodul (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Nu pot distruge nodul `%s'"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Nu pot distruge ultimul nod"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Selectează cel mai recent nod selectat"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Distruge acest nod"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Citeşte numele unui fişier şi selectează-l"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Găseşte fişier: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Nu pot găsi `%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Nu am putut crea fişier ieşire `%s'."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Terminat."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Scriu nod %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Conectez (pipe) conţinutul acestui nod prin INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Nu pot deschide conexiune (pipe) către `%s'."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Tipăresc nod %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Caut subfişier %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Citeşte un şir şi caută-l ţinând cont de litere mari/mici"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Citeşte un şir şi caută-l"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Citeşte un şir şi caută-l înapoi"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%s pentru şir [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Caută înapoi"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Caută"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " ţinând cont de litere mari/mici"
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Căutare eşuată."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Repetă ultima căutare în aceeaşi direcţie"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Nici un şir căutat anterior"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Repetă ultima căutare în direcţie opusă"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Caută interactiv pentru un şir pe măsură ce este introdus"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-caută înapoi: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-caută: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Eşuez "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Mergi la referinţa precedentă"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Mergi la referinţa următoare"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Selectează referinţa sau articolul de meniu ce apare pe acestă linie"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Renunţă la operaţia curentă"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Ieşi"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Mută cursorul la o anumită linie din fereastră"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Redesenează ecranul"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Ieşi din Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Rulează comanda legată de litera mică de pe tastă"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Comandă necunoscută (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" este invalid"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "`%s' este invalid"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Adaugă această cifră la argumentul numeric curent"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Începe (sau înmulţeşte cu 4) argumentul numeric curent"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Folosit intern de \\[argument-universal]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Nu mai am memorie virtuală!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "Când \"Activ\", notele de subsol apar şi dispar automatic"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"Când \"Activ\", crearea şi ştergere unei ferestre redimensionează alte "
+"ferestre"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "Când \"Activ\", scânteiază ecreanul în loc să suni clopoţelul"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "Când \"Activ\", erorile face să sune clopoţelul"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"Când \"Activ\", Info colectează la gunoi fişierele care au trebuit "
+"decompresate"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "Când \"Activ\", porţiunea din şir care s-a potrivit este evidenţiată"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+"Controlează ce se întâmplă când este cerut scroll la sfârşitul unui nod"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr ""
+"Numărul de linii pentru scroll când cursorul se mută în afara ferestrei"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "Când \"Activ\", Info acceptă şi afişează caractere ISO Latin"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Explică folosirea unei variabile"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Descrie variabila: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Setează valoarea unei variabile Info"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Setează variabilă: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Setează %s cu valoarea (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Setează %s cu valoarea (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** Tag-uri Vechi ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), linii ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d linii --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d linii --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Subfişier: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: opţiunea `%s' este ambiguă\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: opţiunea `--%s' nu permite un argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: opţiunea `%c%s' nu permite un argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: opţiunea `%s' necesită un argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: opţiune nerecunoscută `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: opţiune nerecunoscută `%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opţiune ilegală -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opţiune invalidă -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opţiunea necesită un argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: opţiunea `-W %s' este ambiguă\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: opţiunea `-W %s' nu permite un argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "argumentele pentru @%s ignorate"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "Ianuarie"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "Februarie"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "Martie"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "Aprilie"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "Mai"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "Iunie"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "Iulie"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "August"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "Septembrie"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "Octombrie"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "Noiembrie"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "Decembrie"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "caracter neverosimil %c în @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "argumentul @sc în litere mari, prin urmare fără efect"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "`{' aşteptat, dar am văzut `%c'"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "sfârşit de fişier în interiorul blocului de verb"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "`}' aşteptat, dar am văzut `%c'"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Notă...] produce o referinţă încrucişată falsă în Info; reformulaţi "
+"pentru a o evita"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s este depăsit"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp necesită un argument numeric pozitiv, nu `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Argument nepotrivit pentru %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "aşacume"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "nimic"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "Argument nepotrivit pentru @%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "inserează"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "Lipseşte `}' în @def arg"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funcţie"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Macro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Formă Specialş"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variabilă"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Opţiune Utilizator"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instanţiere Variabilă"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metodă"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "din"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "pe"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Trebuie să fiţi în mediul `@%s' pentru a folosi `@%s'"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "`%s' omis înainte de numele fişierului de ieşire"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "`%s' omis întrucât scriu la ieşirea standard (stdout)"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Buffer-ul de ieşire nu este gol."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' necesită un argument `{...}', nu numai `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Nici o paranteză de închidere pentru nota de subsol `%s'"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Nota de subsol definită fără nod părinte"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Nu sun permise note de subsol în note de subsol"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Note de subsol"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: nu am putut deschide --css-file: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: --css-file s-a terminat cu un comentariu"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Fără titlu"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[neaşteptat] nici un tag html de ridicat"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[neaşteptat] nume de nod invalid: `%s'"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Index necunoscut `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info nu poate folosi `:' în intrarea de index `%s'"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Indez-ul `%s' există deja"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Index-ul necunoscut `%s' şi/sau `%s' în @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(linie )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(linia %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Index necunoscut `%s' în @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Intrarea pentru index-ul `%s' în afara oricărui nod"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(în afara oricărui nod)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Vezi "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item nu este permis în argument la @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Tip-Greşit în insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Stivă de enumerare inundată (overflow)"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "inundate (overflow) la tipărire, reîncep la %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s necesită un argument: formatatorul pentru %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "mediile %cfloat nu pot fi încuibărite"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' a aşteptat `%s', dar a văzut `%s'"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Nici o potrivire %cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s necesită litere sau cifre"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "sfârşit de fişier în interiorul blocului neformatat (verbatim)"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s nu are sens în exteriorul mediului `@float'"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu văzut înainte de primul @node, creez nodul `Vârf'"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"probabil că nodul d-voastră @top ar trebui împachetat în @ifnottex în loc de "
+"@ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu văzut înainte de primul nod, creez nodul `Vârf'"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr "@%s nu are sens în exteriorul mediilor `@titlepage' şi `@quotation'"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s nu are sens în exteriorul mediului `@titlepage'"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "`%c%s' fără pereche"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "`%c%s' necesită ceva după el"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Argument greşit `%s' pentru `@%s', folosesc `%s'"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s nu are sens în interiorul blocului `@%s'"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx nu are sens în interiorul blocului `%s'"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s găsit în afara unui bloc de inserare"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s nu este un cod de limbă valid conform ISO 639"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "nume de codare nerecunoscut `%s'"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "ne pare rău, codarea `%s' nu este suportată"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "caracter codat invalid `%s'"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s aşteaptă `i' sau `j' ca argument, nu `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s aşteaptă un singur caracter `i' sau `j' ca argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "macro-ul `%s' definit anterior"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "aici este definiţia anterioară a lui `%s'"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "\\ in expansiunea macro urmată de `%s' în loc de nume parametru"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Macro `%s' chemat pe linia %d cu prea multe argumente"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cend macro nu a fost găsit"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg folositor numai pentru macro-uri cu un singur argument"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "nepotrivire @end %s cu @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Prea multe erori! Am renunţat.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: avertisment: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "%c nelalocul lui"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Încercaţi `%s --help' pentru informaţii suplimentare.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Folosire: %s [OPŢIUNE]... FIŞIER-TEXINFO...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Translatează documentaţia sursă Texinfo în diferite alte formate, implicit\n"
+"fişiere Info potrivite pentru citit online cu Emacs sau GNU Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"General options:\n"
+" --error-limit=NUM termină după NUM erori (implicit %d).\n"
+" --force păstrează ieşire echiar şi dacă sunt erori.\n"
+" --help afişează acest mesaj şi termină.\n"
+" --no-validate elimină validarea referinţelor.\n"
+" --no-warn elimină avertismentele (dar nu erorile).\n"
+" --reference-limit=NUM avertizează despre cel mult NUM referinţe "
+"(implicit %d).\n"
+" -v, --verbose explică ce se execută.\n"
+" --version afişează informaţii despre versiune şi "
+"termină.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Selecţia formatului de ieşire (implicit este să creeze Info):\n"
+" --docbook ieşire DocBook XML în loc de Info.\n"
+" --html ieşire HTML în loc de Info.\n"
+" --xml ieşire Texinfo XML în loc de Info.\n"
+" --plaintext ieşire text simplu în loc de Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Opţiuni de ieşire generale:\n"
+" -E, --macro-expand FIŞIER ieşire macro-expandată în FIŞIER.\n"
+" ignorînd orice @setfilename.\n"
+" --no-headers elimină noduri separatoare, Nod: linii şi "
+"meniuri\n"
+" din ieşire Info (producând text simplu)\n"
+" sau din HTML (producând ieşire mai scurtă);\n"
+" de asemenea, scrie implicit la ieşirea "
+"standard.\n"
+" --no-split elimină împărţirea ieşirii Info sau HTML,\n"
+" generează un singur fişier de ieşire.\n"
+" --number-sections scrie numere de capitole şi secţiuni.\n"
+" -o, --output=FIŞIER scrie în FIŞIER (director dacă multiple HTML),\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Options for Info and plain text:\n"
+" --enable-encoding generează caractere accentuate şi speciale în\n"
+" ieşire Info bazat pe @documentencoding.\n"
+" --fill-column=NUM sparge liniile Info la NUM caractere (implicit %"
+"d).\n"
+" --footnote-style=STIL generează note de subsol în Info conform cu "
+"STIL:\n"
+" `separate' pentru a le pune in propriul lor "
+"nod;\n"
+" `end' pentru a le pune la sfârşitul nodului\n"
+" în care sunt definite (implicit).\n"
+" --paragraph-indent=VAL precede paragrafele Info cu VAL spaţii "
+"(implicit %d).\n"
+" dacă VAL este `none', nu pune spaţii; dacă "
+"VAL\n"
+" este `asis', păstreză spaţiile existente.\n"
+" --split-size=NUM împarte fişierele Info de dimens. NUM "
+"(implicit %d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"Opţiuni pentru HTML:\n"
+" --css-include=FIŞIER include FIŞIER în HTML <stil> ieşire;\n"
+" citeşte stdin dacă FIŞIER este -.\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"Opţiuni pentru HTML:\n"
+" --css-include=FIŞIER aliniază elemente XML cu VAL spaţii "
+"(implicit %d)\n"
+" dacă VAL e 0, spaţiile goale ce pot fi "
+"ignorate nu sunt afişate.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Opţiuni fişier de intrare:\n"
+" --commands-in-node-names permite comenzi @ în numele nodurilor.\n"
+" -D VAR defineşte variabila VAR, ca şi @set.\n"
+" -I DIR adaugă DIR la calea de căutare @include.\n"
+" -P DIR prepend DIR la calea de căutare @include.\n"
+" -U VAR nedefineşte variabila VAR, ca şi @clear.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Procesare condiţională în intrare:\n"
+" --ifdocbook procesează @ifdocbook ş @docbook chiar dacă\n"
+" nu generezi Docbook.\n"
+" --ifhtml procesează @ifhtml şi @html chiar dacă nu generezi "
+"HTML.\n"
+" --ifinfo procesează @ifinfo chiar dacă nu generezi Info.\n"
+" --ifplaintext procesează @ifplaintext chiar dacă nu generezi text "
+"simplu.\n"
+" --iftex procesează @iftex şi @tex; implică --no-split.\n"
+" --ifxml procesează @ifxml şi @xml.\n"
+" --no-ifdocbook nu procesa text @ifdocbook şi @docbook.\n"
+" --no-ifhtml nu procesa text @ifhtml şi @html.\n"
+" --no-ifinfo nu procesa text @ifinfo.\n"
+" --no-ifplaintext nu procesa text @ifplaintext.\n"
+" --no-iftex nu procesa text @iftex şi @tex.\n"
+" --no-ifxml nu procesa text @ifxml şi @xml.\n"
+"\n"
+" De asemenea, pentru opţiunile --no-ifFORMAT, procesează text "
+"@ifnotFORMAT.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Valori implicite pentru condiţionalele @if... depind de formatul de "
+"ieşire:\n"
+" dacă generaţi HTML, --ifhtml este selectat iar restul sunt deselectate;\n"
+" dacă generaţi, --ifinfo este selectat iar restul sunt deselectate;\n"
+" dacă generaţi text simplu, --ifplaintext este selectat iar restul sunt "
+"deselectate;\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Exemple:\n"
+" makeinfo foo.texi scrie Info în @setfilename-ul lui "
+"foo\n"
+" makeinfo --html foo.texi scrie HTML în @setfilename\n"
+" makeinfo --xml foo.texi scrie Texinfo XML în @setfilename\n"
+" makeinfo --docbook foo.texi scrie DocBook XML în @setfilename\n"
+" makeinfo --no-headers foo.texi scrie text simplu la ieşirea "
+"standard\n"
+"\n"
+" makeinfo --html --no-headers foo.texi scrie html fără linii de noduri, "
+"meniuri\n"
+" makeinfo --number-sections foo.texi scrie Info fără secţiuni numerotate\n"
+" makeinfo --no-split foo.texi scrie un singur fişier Info "
+"indiferent cât de mare\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: Ignor valoare nerecunoscută TEXINFO_OUTPUT_FORMAT `%s'.\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s arg trebuie să fie numeric, nu `%s'.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: nu am putut deschide ieşirea expansiunii macro-ului `%s'"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: nu am putut deschide ieşirea expansiunii macro-ului `%s'.\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: --paragraph-indent arg trebuie să fie numeric/`none'/`asis', nu `%s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: --footnote-style arg trebuie să fie `separate' sau `end', nu `%s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: lipseşte fişierul argument.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Comandă pe multiple linii %c%s folosită incorect"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Am aşteptat `%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Nu pot crea directorul `%s': %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Nici un `%s' nu a fost găsit în `%s'"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Omite expasiunea macro la ieşire întrucât ieşirea Info merge acolo.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Creez fişierul %s `%s' din `%s'.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Acesta este %s, produs de makeinfo versiunea %s din %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Şterg fişierul de ieşire macro `%s' din cauza erorilor; folosiţi --force "
+"pentru a-l păstra.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: fişierul de ieşire `%s' din cauza erorilor; folosiţi --force pentru a-l "
+"păstra.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Comandă necunoscută `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Folosiţi paranteze pentru a da o comandă ca argument lui @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s am aşteptat paranteze"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "} fără pereche"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "NICI_UN_NUME!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s lipseşte paranteza de închidere"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "Fişierul @image `%s' (pentru HTML) nu poate fi citit: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Nici un fişier `%s'"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "Fişierul @image `%s' (pentru text) nu poate fi citit: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image lipseşte fişierul argument."
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "marcaj nedefinit: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Nici o valoare pentru `%s'}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s necesită un nume"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Am ajuns la eof înainte de a potrivi @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' este prea lung pentru expansiune; nu a fost expandat"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "} lipsă în şablonul @multitable"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ignor text aiurea `%s' după @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Prea multe coloane în articol multitabel (max %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[neaşteptat] nu pot selecta coloana #%d în multitabel"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "ignor @tab în afara multitabelului"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Ieşirea multitabel din ultimul rând:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* coloana #%d: ieşire = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Nodul `%s' definit anterior la linia %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Formatez nodul %s...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Nodul `%s' cere o comandă de secţionare (ex., %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Nici un nume specificat pentru comanda `%c%s'"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Ancoraj `%s' şi nodul `%s' arată către acelaşi nume de fişier"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Această comandă @anchor ignorată; referinţele către acesta nu vor merge"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Redenumeşte acest ancoraj sau foloseşte opţiunea `--no-split'"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Şir neaşteptat la sfârşitul fişierului HTML spart `%s'"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Următor:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Precedent:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Sus:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Ancoraj `%s' şi `%s' arată către acelaşi nume de fişier"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "Comandă @anchor ignorată; referinţele către acesta nu vor merge"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"referinţa %s către nodul inexistent `%s' (probabil secţionare incorectă?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Meniu"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Traversează"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Următorul câmp de nod `%s' nu este referit (probabil secţionare incorectă?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Acest nod (%s) are un Prec incorect"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Prec"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Câmpul Prec al nodului `%s' nu este referit"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Acest nod (%s) are referinţa Următor incorectă"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "`%s' nu are nici un câmp Sus (probabil secţionare incorectă?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Sus"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "Nodului `%s' îi lipseşte articolul pentru `%s' deşi îi este ţinta Sus"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "nodul `%s' a fost referit de %d ori"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "nod nereferit `%s'"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "Şterg %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Nu pot şterge fisierul `%s': %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Anexă %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Eroare internă (search_sectioning) `%s'!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Eroare internă (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s este depăşită; foloseşte %c%s în schimb"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "Nodul cu %ctop ca şi secţiune există deja"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Aici este nodul %ctop"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop folosit înaintea lui %cnode, implicit către %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Cuprins"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Rezumate"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "Fişierul @image `%s' nu poate fi citit: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"@headitem ca ultimul articol din @multitable produce documenteDocbook "
+"invalide"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: avertisment: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " pentru %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tÎncercaţi `%s --help' pentru o lipsă completă de opţiuni.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Usage: %s [OPŢIUNE]... [FIŞIER-INFO [FIŞIER-DIR]]\n"
+"\n"
+"Instalează sau şterge intrări dir din FIŞIER-INFO în fişier director Info \n"
+"FIŞIER-DIR.\n"
+"\n"
+"Opţiuni:\n"
+" --delete şterge intrări existente pentru FIŞIER-INFO din FIŞIER-"
+"DIR;\n"
+" nu insera nici o nouă intrare.\n"
+" --dir-file=NUME specifică nume fişier pentru fişierul director Info.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT inserează TEXT ca o intrare de director Info.\n"
+" TEXT ar trebui să aibă forma unei linii articol meniu "
+"Info \n"
+" plus zero sau mai multe extra linii începând cu "
+"spaţiu.\n"
+" Dacă precizaţi mai mult de o intrare, toate sunt "
+"adăugate.\n"
+" Dacă nu precizaţi nici o intrare, ele sunt determinate\n"
+" din informaţiile din fişierul Info.\n"
+" --help afişează acest mesaj şi termină.\n"
+" --info-file=FIŞIER specifică fişierul Info de instalat în director.\n"
+" Acesta este echivalent cu folosirea argumentului FIŞIER-"
+"INFO.\n"
+" --info-dir=DIR acelaşi efect ca --dir-file=DIR/dir.\n"
+" --item=TEXT acelaşi efect ca --entry TEXT.\n"
+" O intrare director Info este de fapt un articol de "
+"meniu.\n"
+" --quiet suprimă avertismentele.\n"
+" --remove acelaşi efect ca --delete.\n"
+" --section=SEC pune intrările acestui fişier în secţiunea SEC, toate\n"
+" intrările sunt adăugate în fiecare dintre secţiuni.\n"
+" Dacă nu specificaţi nici o secţiune, acestea sunt\n"
+" determinate din informaţiile din fişierul Info.\n"
+" --version afişează informaţii depre versiune şi termină.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Acesta este fişierul .../info/dir, care conţine nodul\n"
+"cel mai de sus din ierarhia Info, numit (dir)Top.\n"
+"Prima dată când porniţi Info veţi vedea acest nod.\n"
+"\n"
+"%s\tAcesta este vârful arborelui INFO\n"
+"\n"
+" Acesta (nodul Director) furnizează un meniu cu subiecte majore.\n"
+" Apăsând \"q\" termină, \"?\" enumeră toate comenzile Info, \"d\" vă aduce "
+"aici,\n"
+" \"h\" furnizează un tutorial pentru începători,\n"
+" \"mEmacs<Return>\" vizitează manualul Emacs, etc.\n"
+"\n"
+" În Emacs, puteţi face clic cu butonul 2 al mausului pe un articol de "
+"meniu\n"
+" sau o referinţă pentru a o selecta.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: nu am putut citi (%s) şi nu am putut crea (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: fişier gol"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY fără un END-INFO-DIR-ENTRY corespunzător"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY fără un START-INFO-DIR-ENTRY corespunzător"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: are deja fişier dir: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Specifică fişierul Info o singură dată.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "argument suplimentar în linia de comandă `%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+"Nici un fişier de intrare specificat; încercaţi --help pentru informaţii "
+"suplimentare."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+"Nici un fişier dir specificat; încercaţi --help pentru informaţii "
+"suplimentare."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "nici o intrare dir info în `%s'"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "articol meniu `%s' există deja, pentru fişier `%s'"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "nici o intrare găsită pentru `%s'; n-am şters nimic"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "afişează acest mesaj şi termină"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "păstrează fişierele temporare după procesare"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "nu păstra fişierele temporare după procesare (implicit)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "trimite ieşire în FIŞIER"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "afişează informaţii despre versiune şi termină"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Folosire: %s [OPŢIUNI]... FIŞIER...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Generează un index sortat pentru fiecare FIŞIER de ieşire TeX.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"De obicei FIŞIER... este specificat ca `foo.%c%c' pentru un document 'foo."
+"texi'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opţiuni:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: nu este un fişier index texinfo"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "am eşuat să redeschid %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Nici un număr de pagină în %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "intrarea %s urmează o intrare cu nume secundar"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Specifică directorul Info o singură dată.\n"
diff --git a/Build/source/utils/texinfo/po/ru.gmo b/Build/source/utils/texinfo/po/ru.gmo
new file mode 100644
index 00000000000..04eba1eaeea
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ru.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/ru.po b/Build/source/utils/texinfo/po/ru.po
new file mode 100644
index 00000000000..b245a565d08
--- /dev/null
+++ b/Build/source/utils/texinfo/po/ru.po
@@ -0,0 +1,3115 @@
+# đĹŇĹ×ĎÄŮ ÓĎĎÂÝĹÎÉĘ ÄĚŃ GNU Texinfo.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Oleg S. Tihonov <ost@tatnipi.ru>, 1999, 2001, 2002, 2003, 2004
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.92\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-16 08:19+0300\n"
+"Last-Translator: Oleg S. Tihonov <ost@tatnipi.ru>\n"
+"Language-Team: Russian <ru@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=koi8-r\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "óÍĹÓÔÉÔŘÓŃ ÎÁ ÓÉÍ×ĎĚ ×ĐĹŇĹÄ"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "óÍĹÓÔÉÔŘÓŃ ÎÁ ÓÉÍ×ĎĚ ÎÁÚÁÄ"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "óÍĹÓÔÉÔŘÓŃ × ÎÁŢÁĚĎ ÓÔŇĎËÉ"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "óÍĹÓÔÉÔŘÓŃ × ËĎÎĹĂ ÓÔŇĎËÉ"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "óÍĹÓÔÉÔŘÓŃ ÎÁ ÓĚĎ×Ď ×ĐĹŇĹÄ"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "óÍĹÓÔÉÔŘÓŃ ÎÁ ÓĚĎ×Ď ÎÁÚÁÄ"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "őÄÁĚÉÔŘ ÓĚĹÄŐŔÝÉĘ ÓÉÍ×ĎĚ"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "őÄÁĚÉÔŘ ĐŇĹÄŮÄŐÝÉĘ ÓÉÍ×ĎĚ"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "ďÔÍĹÎÉÔŘ ÉĚÉ ĐŇĹŇ×ÁÔŘ ÄĹĘÓÔ×ÉĹ"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "đŇÉÎŃÔŘ (ÉĚÉ ÚÁ×ĹŇŰÉÔŘ) ÔĹËŐÝŐŔ ÓÔŇĎËŐ"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "÷ÓÔÁ×ÉÔŘ ÓĚĹÄŐŔÝÉĘ ÓÉÍ×ĎĚ \"ËÁË ĹÓÔŘ\""
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "÷ÓÔÁ×ÉÔŘ ÜÔĎÔ ÓÉÍ×ĎĚ"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "÷ÓÔÁ×ÉÔŘ ÓÉÍ×ĎĚ ÔÁÂŐĚŃĂÉÉ"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "đĹŇĹÓÔÁ×ÉÔŘ ÓÉÍ×ĎĚŮ ×ĎËŇŐÇ ÔĎŢËÉ"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "÷ĎÓÓÔÁÎĎ×ÉÔŘ ĐĎÓĚĹÄÎÉĘ ŐÎÉŢÔĎÖĹÎÎŮĘ ÔĹËÓÔ"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "ëĎĚŘĂĎ ŐÎÉŢÔĎÖĹÎÉĘ ĐŐÓÔĎ"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "÷ĎÓÓÔÁÎĎ×ÉÔŘ ĐŇĹÄŰĹÓÔ×ŐŔÝÉĘ ŐÎÉŢÔĎÖĹÎÎŮĘ ÔĹËÓÔ"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "őÎÉŢÔĎÖÉÔŘ ÔĹËÓÔ ÄĎ ËĎÎĂÁ ÓÔŇĎËÉ"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "őÎÉŢÔĎÖÉÔŘ ÔĹËÓÔ ÄĎ ÎÁŢÁĚÁ ÓÔŇĎËÉ"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "őÎÉŢÔĎÖÉÔŘ ÓĚĹÄŐŔÝĹĹ ÓĚĎ×Ď"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "őÎÉŢÔĎÖÉÔŘ ĐŇĹÄŮÄŐÝĹĹ ÓĚĎ×Ď"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "úÁ×ĹŇŰĹÎÉĘ ÎĹÔ"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "îĹ ÚÁ×ĹŇŰĹÎĎ"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "đĎËÁÚÁÔŘ ×ĎÚÍĎÖÎŮĹ ÚÁ×ĹŇŰĹÎÉŃ"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "ĺÄÉÎÓÔ×ĹÎÎĎĹ ÚÁ×ĹŇŰĹÎÉĹ"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "ĺÄÉÎÓÔ×ĹÎÎĎĹ ÚÁ×ĹŇŰĹÎÉĹ:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "úÁ×ĹŇŰĹÎÉĘ: %d :\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "÷ÓÔÁ×ÉÔŘ ÚÁ×ĹŇŰĹÎÉĹ"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "óĎÓÔÁ×ĚĹÎÉĹ ÚÁ×ĹŇŰĹÎÉĘ..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "đŇĎËŇŐÔÉÔŘ ĎËÎĎ ÚÁ×ĹŇŰĹÎÉĘ"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "óÎĎÓËÉ ÎĹ ÍĎÇŐÔ ÂŮÔŘ ĐĎËÁÚÁÎŮ"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "đĎËÁÚÁÔŘ ÓÎĎÓËÉ, Ó×ŃÚÁÎÎŮĹ Ó ÜÔĎĘ ÎĎÄĎĘ, × ÄŇŐÇĎÍ ĎËÎĹ"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- óÎĎÓËÉ ----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "îÁĘÔÉ ÓÔŇĎËŐ × ÁĚĆÁ×ÉÔÎĎÍ ŐËÁÚÁÔĹĚĹ ÄĚŃ ÄÁÎÎĎÇĎ ĆÁĘĚÁ"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "đĎÉÓË × ÁĚĆÁ×ÉÔÎĎÍ ŐËÁÚÁÔĹĚĹ..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "îĹ ÎÁĘÄĹÎ ÁĚĆÁ×ÉÔÎŮĘ ŐËÁÚÁÔĹĚŘ."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "đŐÎËÔ × ÁĚĆÁ×ÉÔÎĎÍ ŐËÁÚÁÔĹĚĹ: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"đĹŇĹĘÔÉ Ë ÓĚĹÄŐŔÝĹÍŐ ĐŐÎËÔŐ ÁĚĆÁ×ÉÔÎĎÇĎ ŐËÁÚÁÔĹĚŃ, ÓĎĎÔ×ĹÔÓÔ×ŐŔÝĹÍŐ\n"
+"ĐĎÓĚĹÄÎĹĘ ËĎÍÁÎÄĹ `\\[index-search]'"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "óÔŇĎËÁ ĐĎÉÓËÁ × ÁĚĆÁ×ÉÔÎĎÍ ŐËÁÚÁÔĹĚĹ ÎĹ ÂŮĚÁ ŇÁÎŘŰĹ ÚÁÄÁÎÁ."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "îĹ ÎÁĘÄĹÎ ÁĚĆÁ×ÉÔÎŮĘ ŐËÁÚÁÔĹĚŘ."
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "÷ ÁĚĆÁ×ÉÔÎĎÍ ŐËÁÚÁÔĹĚĹ %s ÎĹ ÎÁĘÄĹÎĎ ĐŐÎËÔĎ×, ÓĎÄĹŇÖÁÝÉČ `%s'."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "ÂĎĚŘŰĹ "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "üÔĎ ÎĹ×ÉÄÉÍŮĘ ÔĹËÓÔ!"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"îÁĘÄĹÎÁ `%s' × %s. (`\\[next-index-match]' ÎÁČĎÄÉÔ ÓĚĹÄŐŔÝĹĹ ÓĎ×ĐÁÄĹÎÉĹ.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "đĎÉÓË × ÁĚĆÁ×ÉÔÎĎÍ ŐËÁÚÁÔĹĚĹ ĆÁĘĚÁ `%s'..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "îÉ ĎÄÉÎ ÉÚ info-ĆÁĘĚĎ× ÎĹ ÓĎÄĹŇÖÉÔ `%s' × ÁĚĆÁ×ÉÔÎŮČ ŐËÁÚÁÔĹĚŃČ."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"úÁĐŐÓËÁĹÔ ĐĎÉÓË ÓÔŇĎËÉ × ÁĚĆÁ×ÉÔÎŮČ ŐËÁÚÁÔĹĚŃČ ×ÓĹČ Info-ĆÁĘĚĎ× É ÓĎÚÄÁĹÔ "
+"ÍĹÎŔ"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "ëĚŔŢĹ×ĎĹ ÓĚĎ×Ď ÄĚŃ ĐĎÉÓËÁ: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: îĎÄŮ, ŢŘÉ ÁĚĆÁ×ÉÔÎŮĹ ŐËÁÚÁÔĹĚÉ ÓĎÄĹŇÖÁÔ `%s':\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "đĎĐŇĎÂŐĘÔĹ --help ÄĚŃ ĐĎĚŐŢĹÎÉŃ ÂĎĚĹĹ ĐĎÄŇĎÂÎĎÇĎ ĎĐÉÓÁÎÉŃ.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"íŮ îĺ ĐŇĹÄĎÓÔÁ×ĚŃĹÍ ÇÁŇÁÎÔÉĘ. ÷Ů ÍĎÖĹÔĹ ŇÁÓĐŇĎÓÔŇÁÎŃÔŘ ÜÔÉ ĐŇĎÇŇÁÍÍŮ, ĐŇÉ\n"
+"ÓĎÂĚŔÄĹÎÉÉ ŐÓĚĎ×ÉĘ őÎÉ×ĹŇÓÁĚŘÎĎĘ ďÂÝĹÓÔ×ĹÎÎĎĘ ěÉĂĹÎÚÉÉ GNU.\n"
+"äĚŃ ĐĎĚŐŢĹÎÉŃ ĐĎÄŇĎÂÎĎĘ ÉÎĆĎŇÍÁĂÉÉ Ď ×ĎÚÍĎÖÎĎÓÔÉ ŇÁÓĐŇĎÓÔŇÁÎĹÎÉŃ ÓÍĎÔŇÉÔĹ\n"
+"ĆÁĘĚ COPYING.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "ÄĚŃ `%s' ÎĹ ÎÁĘÄĹÎĎ ×ČĎÖÄĹÎÉĘ × ÉÍĹÎÎĎÍ ŐËÁÚÁÔĹĚĹ\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly ×Ů×ĎÄÉÔŘ × ĆĎŇÍÁÔĹ, ŐÄĎÂÎĎÍ ÄĚŃ ÓÉÎÔĹÚÁÔĎŇĎ× "
+"ŇĹŢÉ.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"éÓĐĎĚŘÚĎ×ÁÎÉĹ: %s [ëěŕţ]... [đőîëô-íĺîŕ...]\n"
+"\n"
+"đĎÚ×ĎĚŃĹÔ ĐŇĎÓÍÁÔŇÉ×ÁÔŘ ÄĎËŐÍĹÎÔÁĂÉŔ × ĆĎŇÍÁÔĹ Info.\n"
+"\n"
+"ëĚŔŢÉ:\n"
+" --apropos=ôĺíá ÉÓËÁÔŘ ôĺíő ×Ď ×ÓĹČ ÁĚĆÁ×ÉÔÎŮČ ŐËÁÚÁÔĹĚŃČ\n"
+" ×ÓĹČ ŇŐËĎ×ĎÄÓÔ×.\n"
+" -d, --directory=ëáôáěďç ÄĎÂÁ×ÉÔŘ ëáôáěďç Ë INFOPATH.\n"
+" --dribble=ćáęě ÚÁĐÉÓÁÔŘ ××ĎÄÉÍŮĹ ĐĎĚŘÚĎ×ÁÔĹĚĹÍ ÚÎÁËÉ × ćáęě.\n"
+" -f, --file=ćáęě ĐĎËÁÚÁÔŘ ÚÁÄÁÎÎŮĘ ćáęě.\n"
+" -h, --help ĐĎËÁÚÁÔŘ ÜÔŐ ÓĐŇÁ×ËŐ É ×ŮĘÔÉ.\n"
+" --index-search=óôňďëá ĐĹŇĹĘÔÉ Ë ÎĎÄĹ, ÎÁ ËĎÔĎŇŐŔ ÓÓŮĚÁĹÔÓŃ "
+"ÚÁÄÁÎÎĎĹ\n"
+" óôňďëďę ×ČĎÖÄĹÎÉĹ ÉÍĹÎÎĎÇĎ ŐËÁÚÁÔĹĚŃ.\n"
+" -n, --node=îďäá ÎÁŢÁÔŘ ĐŇĎÓÍĎÔŇ Ó ÚÁÄÁÎÎĎĘ îďäů.\n"
+" -o, --output=ćáęě ÚÁĐÉÓÁÔŘ ×ŮÂŇÁÎÎŮĹ ÎĎÄŮ × ćáęě.\n"
+" -R, --raw-escapes ×Ů×ĎÄÉÔŘ escape-ĐĎÓĚĹÄĎ×ÁÔĹĚŘÎĎÓÔÉ ANSI (ĐĎ "
+"ŐÍĎĚŢÁÎÉŔ).\n"
+" --no-raw-escapes ×Ů×ĎÄÉÔŘ escape-ĐĎÓĚĹÄĎ×ÁÔĹĚŘÎĎÓÔÉ ËÁË ÂŐË×ÁĚŘÎŮĘ "
+"ÔĹËÓÔ.\n"
+" --restore=ćáęě ĐŇĎŢÉÔÁÔŘ ĐĎÓĚĹÄĎ×ÁÔĹĚŘÎĎÓÔŘ ÎÁÖÁÔŮČ ËĚÁ×ÉŰ ÉÚ "
+"ćáęěá.\n"
+" -O, --show-options, --usage ĐĹŇĹĘÔÉ Ë ÎĎÄĹ, ĎĐÉÓŮ×ÁŔÝĹĘ ËĚŔŢÉ ËĎÍÁÎÄÎĎĘ "
+"ÓÔŇĎËÉ.\n"
+"%s --subnodes ŇĹËŐŇÓÉ×ÎĎ ×Ů×ĎÄÉÔŘ ĐŐÎËÔŮ ÍĹÎŔ.\n"
+" --vi-keys ÉÓĐĎĚŘÚĎ×ÁÔŘ ĐŇÉ×ŃÚËÉ ËĚÁ×ÉŰ ËÁË × vi É less.\n"
+" --version ĐĎËÁÚÁÔŘ ÉÎĆĎŇÍÁĂÉŔ Ď ×ĹŇÓÉÉ É ×ŮĘÔÉ.\n"
+"\n"
+"đĹŇ×ŮĘ ÎĹ Ń×ĚŃŔÝÉĘÓŃ ËĚŔŢĎÍ ÁŇÇŐÍĹÎÔ, ĹÓĚÉ ĎÎ ĹÓÔŘ, ÚÁÄÁĹÔ ÉÍŃ\n"
+"ÎÁŢÁĚŘÎĎÇĎ ĐŐÎËÔÁ ÍĹÎŔ; ĎÎ ÉÝĹÔÓŃ ×Ď ×ÓĹČ ĆÁĘĚÁČ `dir' × INFOPATH.\n"
+"ĺÓĚÉ ĎÎ ÎĹ ÎÁĘÄĹÎ, info ĎÂßĹÄÉÎŃĹÔ ×ÓĹ ĆÁĘĚŮ `dir' É ĐĎËÁÚŮ×ÁĹÔ\n"
+"ŇĹÚŐĚŘÔÁÔ. ÷ÓĹ ĎÓÔÁĚŘÎŮĹ ÁŇÇŐÍĹÎÔŮ ŇÁÓÓÍÁÔŇÉ×ÁŔÔÓŃ ËÁË ÉÍĹÎÁ ĐŐÎËÔĎ×\n"
+"ÍĹÎŔ ĎÔÎĎÓÉÔĹĚŘÎĎ ĐĹŇ×ĎĘ ĐĎÓĹÝĹÎÎĎĘ ÎĎÄŮ.\n"
+"\n"
+"đŇÉÍĹŇŮ:\n"
+" info ĐĎËÁÚÁÔŘ ÍĹÎŔ ËÁÔÁĚĎÇÁ ×ĹŇČÎĹÇĎ ŐŇĎ×ÎŃ\n"
+" info emacs ÎÁŢÁÔŘ Ó ÎĎÄŮ emacs ÉÚ ËÁÔÁĚĎÇÁ ×ĹŇČÎĹÇĎ "
+"ŐŇĎ×ÎŃ\n"
+" info emacs buffers ÎÁŢÁÔŘ Ó ÎĎÄŮ buffers × ŇŐËĎ×ĎÄÓÔ×Ĺ emacs\n"
+" info --show-options emacs ÎÁŢÁÔŘ Ó ÎĎÄŮ, ĎĐÉÓŮ×ÁŔÝĹĘ ËĚŔŢÉ emacs\n"
+" info -f ./foo.info ĐĎËÁÚÁÔŘ ĆÁĘĚ ./foo.info, ÎĹ ÉÓËÁÔŘ dir\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"ď ĎŰÉÂËÁČ ÓĎĎÂÝÁĘÔĹ ĐĎ ÁÄŇĹÓŐ bug-texinfo@gnu.org,\n"
+"ĎÂÝĹĹ ĎÂÓŐÖÄĹÎÉĹ É ×ĎĐŇĎÓŮ ÎÁĐŇÁ×ĚŃĘÔĹ ĐĎ ÁÄŇĹÓŐ help-texinfo@gnu.org.\n"
+"äĎÍÁŰÎÁŃ ÓÔŇÁÎÉĂÁ Texinfo: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÎÁĘÔÉ ÎĎÄŐ `%s'."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÎÁĘÔÉ ÎĎÄŐ `(%s)%s'."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÎÁĘÔÉ ĎËÎĎ!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "ôĎŢËÁ ÎÁČĎÄÉÔÓŃ ×ÎĹ ÎĎÄŮ ÜÔĎÇĎ ĎËÎÁ!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ĐĎÓĚĹÄÎĹĹ ĎËÎĎ."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "÷ ÜÔĎĘ ÎĎÄĹ ÎĹÔ ÍĹÎŔ."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "îÁ ÜÔĎĘ ÎĎÄĹ ÎĹÔ ÓÓŮĚĎË."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "îÁ ÜÔĎĘ ÎĎÄĹ ÎĹÔ ÓÓŮĚĎË."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "äĚŃ ÜÔĎĘ ÎĎÄŮ ÎĹÔ ÓÓŮĚËÉ `%s'."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "ëĎÍÁÎÄÁ Info `%c' ÎĹÉÚ×ĹÓÔÎÁ; ĐĎĐŇĎÂŐĘÔĹ `?' ÄĚŃ ĐĎĚŐŢĹÎÉŃ ÓĐŇÁ×ËÉ."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr ""
+"ôĹŇÍÉÎÁĚ ÔÉĐÁ `%s' ÎĹ ĎÂĚÁÄÁĹÔ ÄĎÓÔÁÔĎŢÎŮÍÉ ×ĎÚÍĎÖÎĎÓÔŃÍÉ ÄĚŃ ÚÁĐŐÓËÁ Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "÷Ů ŐÖĹ ÎÁČĎÄÉÔĹÓŘ ÎÁ ĐĎÓĚĹÄÎĹĘ ÓÔŇÁÎÉĂĹ ÜÔĎĘ ÎĎÄŮ."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "÷Ů ŐÖĹ ÎÁČĎÄÉÔĹÓŘ ÎÁ ĐĹŇ×ĎĘ ÓÔŇÁÎÉĂĹ ÜÔĎĘ ÎĎÄŮ."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "ôĎĚŘËĎ ĎÄÎĎ ĎËÎĎ."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "đĎĚŐŢÉ×ŰĹĹÓŃ ĎËÎĎ ÂŮĚĎ ÂŮ ÓĚÉŰËĎÍ ÍÁĚĹÎŘËÉÍ."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ""
+"îĹ Č×ÁÔÁĹÔ ÍĹÓÔÁ ÄĚŃ ÓĐŇÁ×ĎŢÎĎÇĎ ĎËÎÁ, ĐĎÖÁĚŐĘÓÔÁ, ŐÄÁĚÉÔĹ ËÁËĎĹ-ÎÉÂŐÄŘ ĎËÎĎ."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"ďÓÎĎ×ÎŮĹ ËĎÍÁÎÄŮ × ĎËÎÁČ Info\n"
+"******************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] đĎËÉÎŐÔŘ ÜÔŐ ÓĐŇÁ×ËŐ.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] đĎËÉÎŐÔŘ ÔÁËÖĹ Info.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] ÷ŮÚ×ÁÔŘ ĎÂŐŢÁŔÝĹĹ ŇŐËĎ×ĎÄÓÔ×Ď.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"÷ŮÂĎŇ ÄŇŐÇĎĘ ÎĎÄŮ:\n"
+"------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] đĹŇĹĘÔÉ Ë \"ÓĚĹÄŐŔÝĹĘ\" ÎĎÄĹ.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] đĹŇĹĘÔÉ Ë \"ĐŇĹÄŮÄŐÝĹĘ\" ÎĎÄĹ.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] đĹŇĹĘÔÉ Ë ÎĎÄĹ \"××ĹŇČ\".\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] đĹŇĹĘÔÉ Ë ĐŐÎËÔŐ ÍĹÎŔ, ÚÁÄÁ×ÁĹÍĎÍŐ ĐĎ ÉÍĹÎÉ.\n"
+" đŇÉ ĐĹŇĹČĎÄĹ Ë ÚÁÄÁÎÎĎÍŐ ĐŐÎËÔŐ ÍĹÎŔ ×ŮÂÉŇÁĹÔÓŃ ÄŇŐÇÁŃ ÎĎÄÁ.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr "\\%-10[xref-item] đĹŇĹĘÔÉ ĐĎ ÓÓŮĚËĹ. óŢÉÔŮ×ÁĹÔ ÉÍŃ ÓÓŮĚËÉ.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "\\%-10[history-node] đĹŇĹĘÔÉ ÎÁ ĐĎÓĚĹÄÎŔŔ ÎĎÄŐ × ÜÔĎÍ ĎËÎĹ.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] đĹŇĹÍĹÓÔÉÔŘÓŃ Ë ÓĚĹÄŐŔÝĹĘ ÇÉĐĹŇÓÓŮĚËĹ × ÜÔĎĘ "
+"ÎĎÄĹ.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] đĹŇĹÍĹÓÔÉÔŘÓŃ Ë ÓĚĹÄŐŔÝĹĘ ÇÉĐĹŇÓÓŮĚËĹ × ÜÔĎĘ "
+"ÎĎÄĹ.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] đĹŇĹĘÔÉ ĐĎ ÇÉĐĹŇÓÓŮĚËĹ ĐĎÄ ËŐŇÓĎŇĎÍ.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr "\\%-10[dir-node] đĹŇĹĘÔÉ Ë ËĎŇÎĹ×ĎĘ ÎĎÄĹ. üË×É×ÁĚĹÎÔÎĎ `g (DIR)'.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr "\\%-10[top-node] đĹŇĹĘÔÉ Ë ÎĎÄĹ Top. üË×É×ÁĚĹÎÔÎĎ `g Top'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"đĹŇĹÍĹÝĹÎÉĹ ×ÎŐÔŇÉ ÎĎÄŮ:\n"
+"------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] đĹŇĹÍĹÓÔÉÔŘÓŃ × ÎÁŢÁĚĎ ÜÔĎĘ ÎĎÄŮ.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] đĹŇĹÍĹÓÔÉÔŘÓŃ × ËĎÎĹĂ ÜÔĎĘ ÎĎÄŮ.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ×ĐĹŇĹÄ.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ÎÁÚÁÄ.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ×ĐĹŇĹÄ.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ÎÁÚÁÄ.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"äŇŐÇÉĹ ËĎÍÁÎÄŮ:\n"
+"---------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+"\\%-10[menu-digit] ÷ŮÂŇÁÔŘ ĐĹŇ×ŮĘ ... ÄĹ×ŃÔŮĘ ĐŐÎËÔ ÍĹÎŔ × ÔĹËŐÝĹĘ ÎĎÄĹ.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] ÷ŮÂŇÁÔŘ ĐĎÓĚĹÄÎÉĘ ĐŐÎËÔ ÍĹÎŔ × ÔĹËŐÝĹĘ ÎĎÄĹ\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] éÓËÁÔŘ ÚÁÄÁÎÎŐŔ ÓÔŇĎËŐ × ÁĚĆÁ×ÉÔÎŮČ ŐËÁÚÁÔĹĚŃČ\n"
+" Info-ĆÁĘĚÁ É ×ŮÂŇÁÔŘ ÎĎÄŐ ĐĎ ĐĹŇ×ĎĘ ÎÁĘÄĹÎÎĎĘ ÓÓŮĚËĹ.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] đĹŇĹĘÔÉ Ë ÎĎÄĹ, ÚÁÄÁÎÎĎĘ ĐĎ ÉÍĹÎÉ.\n"
+" ÷Ů ÍĎÖĹÔĹ ÚÁÄÁÔŘ ÔÁËÖĹ ÉÍŃ ĆÁĘĚÁ, ÎÁĐŇÉÍĹŇ (ćáęě)îďäá.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] éÓËÁÔŘ ŐËÁÚÁÎÎŐŔ ÓÔŇĎËŐ × ÔĹËŐÝĹÍ Info-ĆÁĘĚĹ É ĎÓÔÁÎĎ×ÉÔŘÓŃ "
+"×\n"
+" ÎĎÄĹ, × ËĎÔĎŇĎĘ ÎÁĘÄĹÎĎ ÓĚĹÄŐŔÝĹĹ ×ČĎÖÄĹÎÉĹ.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] éÓËÁÔŘ ŐËÁÚÁÎÎŐŔ ÓÔŇĎËŐ × ÔĹËŐÝĹÍ Info-ĆÁĘĚĹ ×\n"
+" ÎĎÄĹ, × ËĎÔĎŇĎĘ ÎÁĘÄĹÎĎ ÓĚĹÄŐŔÝĹĹ ×ČĎÖÄĹÎÉĹ.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s đĎËÉÎŐÔŘ ÜÔŐ ÓĐŇÁ×ËŐ.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s đĎËÉÎŐÔŘ ÔÁËÖĹ Info.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s ÷ŮÚ×ÁÔŘ ĎÂŐŢÁŔÝĹĹ ŇŐËĎ×ĎÄÓÔ×Ď.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë `ÓĚĹÄŐŔÝĹĘ' ÎĎÄĹ.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë `ĐŇĹÄŮÄŐÝĹĘ' ÎĎÄĹ.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë ÎĎÄĹ `××ĹŇČ'.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë ÚÁÄÁÎÎĎÍŐ ĐŐÎËÔŐ ÍĹÎŔ.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" đŇÉ ĐĹŇĹČĎÄĹ Ë ÚÁÄÁÎÎĎÍŐ ĐŐÎËÔŐ ÍĹÎŔ ×ŮÂÉŇÁĹÔÓŃ ÄŇŐÇÁŃ ÎĎÄÁ.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s đĹŇĹĘÔÉ ĐĎ ÓÓŮĚËĹ. óŢÉÔŮ×ÁĹÔ ÉÍŃ ÓÓŮĚËÉ.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s đĹŇĹĘÔÉ ÎÁ ĐĎÓĚĹÄÎŔŔ ÎĎÄŐ × ÜÔĎÍ ĎËÎĹ.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s đĹŇĹÍĹÓÔÉÔŘÓŃ Ë ÓĚĹÄŐŔÝĹĘ ÇÉĐĹŇÓÓŮĚËĹ × ÜÔĎĘ ÎĎÄĹ.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s đĹŇĹĘÔÉ ĐĎ ÇÉĐĹŇÓÓŮĚËĹ ĐĎÄ ËŐŇÓĎŇĎÍ.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë ËĎŇÎĹ×ĎĘ ÎĎÄĹ. üË×É×ÁĚĹÎÔÎĎ `g (DIR)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë ÎĎÄĹ Top. üË×É×ÁĚĹÎÔÎĎ `g Top'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ×ĐĹŇĹÄ.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ÎÁÚÁÄ.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s đĹŇĹÍĹÓÔÉÔŘÓŃ × ÎÁŢÁĚĎ ÜÔĎĘ ÎĎÄŮ.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s đĹŇĹÍĹÓÔÉÔŘÓŃ × ËĎÎĹĂ ÜÔĎĘ ÎĎÄŮ.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ×ĐĹŇĹÄ.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s đŇĎËŇŐÔÉÔŘ ÎÁ ÓÔŇÁÎÉĂŐ ÎÁÚÁÄ.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s ÷ŮÂŇÁÔŘ ĐĹŇ×ŮĘ ... ÄĹ×ŃÔŮĘ ĐŐÎËÔ ÍĹÎŔ × ÔĹËŐÝĹĘ ÎĎÄĹ.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s ÷ŮÂŇÁÔŘ ĐĎÓĚĹÄÎÉĘ ĐŐÎËÔ ÍĹÎŔ × ÔĹËŐÝĹĘ ÎĎÄĹ\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+" %-10s đŇĎÉÚ×ĹÓÔÉ ĐĎÉÓË ÚÁÄÁÎÎĎĘ ÓÔŇĎËÉ ÓŇĹÄÉ ×ČĎÖÄĹÎÉĘ ÉÍĹÎÎŮČ ŐËÁÚÁÔĹĚĹĘ "
+"ÜÔĎÇĎ\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " Info-ĆÁĘĚÁ É ×ŮÂŇÁÔŘ ÎĎÄŐ ĐĎ ĐĹŇ×ĎĘ ÎÁĘÄĹÎÎĎĘ ÓÓŮĚËĹ.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s đĹŇĹĘÔÉ Ë ÚÁÄÁÎÎĎĘ ÎĎÄĹ.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " ÷Ů ÍĎÖĹÔĹ ÚÁÄÁÔŘ ÔÁËÖĹ ÉÍŃ ĆÁĘĚÁ, ÎÁĐŇÉÍĹŇ (ćáęě)îďäá.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s îÁĘÔÉ ÚÁÄÁÎÎŐŔ ÓÔŇĎËŐ, É ĐĹŇĹĘÔÉ Ë\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " ÎĎÄĹ, × ËĎÔĎŇĎĘ ÎÁĘÄĹÎĎ ÓĚĹÄŐŔÝĹĹ ×ČĎÖÄĹÎÉĹ.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s îÁĘÔÉ ÚÁÄÁÎÎŐŔ ÓÔŇĎËŐ × ĎÂŇÁÔÎĎÍ ÎÁĐŇÁ×ĚĹÎÉÉ, É ĐĹŇĹĘÔÉ Ë\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "ôĹËŐÝÉĘ ĐŐÔŘ ĐĎÉÓËÁ:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"ëĎÍÁÎÄŮ, ÄĎÓÔŐĐÎŮĹ × ĎËÎÁČ Info:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"ëĎÍÁÎÄŮ, ÄĎÓÔŐĐÎŮĹ × ÜČĎ-ĎÂĚÁÓÔÉ:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"óĚĹÄŐŔÝÉĹ ËĎÍÁÎÄŮ ÍĎÇŐÔ ÂŮÔŘ ×ŮÚ×ÁÎŮ ÔĎĚŘËĎ Ó ĐĎÍĎÝŘŔ %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"óĚĹÄŐŔÝÉĹ ËĎÍÁÎÄŮ ×ĎĎÂÝĹ ÎĹ ÍĎÇŐÔ ÂŮÔŘ ×ŮÚ×ÁÎŮ:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- éÓĐĎĚŘÚŐĘÔĹ `\\[history-node]' ÉĚÉ `\\[kill-node]' ÄĚŃ ×ŮČĎÄÁ ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "đĎËÁÚÁÔŘ ÓĐŇÁ×ËŐ"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "ďÂŇÁÔÉÔŘÓŃ Ë Info-ÎĎÄĹ `(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "đĎËÁÚÁÔŘ ÉÎĆĎŇÍÁĂÉŔ Ď ëěá÷éűĺ"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "ďĐÉÓÁÔŘ ËĚÁ×ÉŰŐ: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s ÎĹĎĐŇĹÄĹĚĹÎĎ."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s ÎĹĎĐŇĹÄĹĚĹÎĎ."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s ĐŇÉ×ŃÚÁÎĎ Ë %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "đĎËÁÚŮ×ÁĹÔ, ŢÔĎ ÎŐÖÎĎ ÎÁĐĹŢÁÔÁÔŘ, ŢÔĎÂŮ ×ŮĐĎĚÎÉÔŘ ÄÁÎÎŐŔ ËĎÍÁÎÄŐ"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "ëĎÍÁÎÄÁ: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' ÎĹ ĐŇÉ×ŃÚÁÎÁ ÎÉ Ë ËÁËÉÍ ËĚÁ×ÉŰÁÍ"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s ÍĎÖĹÔ ÂŮÔŘ ×ŮÚ×ÁÎÁ ÔĎĚŘËĎ Ó ĐĎÍĎÝŘŔ %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s ÍĎÖĹÔ ÂŮÔŘ ×ŮÚ×ÁÎÁ Ó ĐĎÍĎÝŘŔ %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "ćŐÎËĂÉÉ Ó ÉÍĹÎĹÍ `%s' ÎĹÔ"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"íŮ îĺ ĐŇĹÄĎÓÔÁ×ĚŃĹÍ ÇÁŇÁÎÔÉĘ. ÷Ů ÍĎÖĹÔĹ ŇÁÓĐŇĎÓÔŇÁÎŃÔŘ ÜÔÉ ĐŇĎÇŇÁÍÍŮ, ĐŇÉ\n"
+"ÓĎÂĚŔÄĹÎÉÉ ŐÓĚĎ×ÉĘ őÎÉ×ĹŇÓÁĚŘÎĎĘ ďÂÝĹÓÔ×ĹÎÎĎĘ ěÉĂĹÎÚÉÉ GNU.\n"
+"äĚŃ ĐĎĚŐŢĹÎÉŃ ĐĎÄŇĎÂÎĎĘ ÉÎĆĎŇÍÁĂÉÉ Ď ×ĎÚÍĎÖÎĎÓÔÉ ŇÁÓĐŇĎÓÔŇÁÎĹÎÉŃ ÓÍĎÔŇÉÔĹ\n"
+"ĆÁĘĚ COPYING.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "ÎĹĐŇÁ×ÉĚŘÎĎĹ ŢÉÓĚĎ ÁŇÇŐÍĹÎÔĎ×"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "ÎĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ ×ŮČĎÄÎĎĘ ĆÁĘĚ `%s'"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "ÎĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ×ŮČĎÄÎĎĘ ĆÁĘĚ `%s'"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "ĎŰÉÂËÁ ÚÁĐÉÓÉ × `%s'"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "ÎĹ×ĎÚÍĎÖÎĎ ÚÁËŇŮÔŘ ×ŮČĎÄÎĎĘ ĆÁĘĚ `%s'"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "ĐĎÓĚĹÄĎ×ÁÔĹĚŘÎĎÓÔŘ ËĚŔŢĹĘ ÓĚÉŰËĎÍ ÄĚÉÎÎÁŃ"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "ĐŇĎĐŐÝĹÎÁ ĐĎÓĚĹÄĎ×ÁÔĹĚŘÎĎÓÔŘ ËĚŔŢĹĘ"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "ÚÎÁË NUL (\\000) ÎĹÄĎĐŐÓÔÉÍ"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "ÚÎÁË NUL (^%c) ÎĹÄĎĐŐÓÔÉÍ"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "ĐŇĎĐŐÝĹÎĎ ÉÍŃ ÄĹĘÓÔ×ÉŃ"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "ŇÁÚÄĹĚ ÓĚÉŰËĎÍ ×ĹĚÉË"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "îĹÉÚ×ĹÓÔÎĎĹ ÄĹĘÓÔ×ÉĹ `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "ÉÍŃ ÄĹĘÓÔ×ÉŃ ÓĚÉŰËĎÍ ÄĚÉÎÎĎĹ"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "ĚÉŰÎÉĹ ÚÎÁËÉ ĐĎÓĚĹ ÄĹĘÓÔ×ÉŃ `%s'"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "ĐŇĎĐŐÝĹÎĎ ÉÍŃ ĐĹŇĹÍĹÎÎĎĘ"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "ĐŇĎĐŐÝĹÎ ÚÎÁË `=' ÓŇÁÚŐ ĐĎÓĚĹ ÉÍĹÎÉ ĐĹŇĹÍĹÎÎĎĘ"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "ÉÍŃ ĐĹŇĹÍĹÎÎĎĘ ÓĚÉŰËĎÍ ÄĚÉÎÎĎĹ"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "ÚÎÁŢĹÎÉĹ ÓĚÉŰËĎÍ ÄĚÉÎÎĎĹ"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", ÓÔŇĎËÁ %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"éÓĐĎĚŘÚĎ×ÁÎÉĹ: %s [ëěŕţ]... [÷čďäîďę-ćáęě]\n"
+"\n"
+"ëĎÍĐÉĚÉŇŐĹÔ ÉÓČĎÄÎŮĘ ĆÁĘĚ infokey × ĆÁĘĚ infokey. óŢÉÔŮ×ÁĹÔÓŃ\n"
+"÷čďäîďę-ćáęě (ĐĎ ŐÍĎĚŢÁÎÉŔ $HOME/.infokey) É ÚÁĐÉÓŮ×ÁĹÔ\n"
+"ÓËĎÍĐÉĚÉŇĎ×ÁÎÎŮĘ ĆÁĘĚ Ó ĐŇÉ×ŃÚËÁÍÉ ËĚÁ×ÉŰ × $HOME/.info.\n"
+"\n"
+"ëĚŔŢÉ:\n"
+" --output éíń-ćáęěá ×Ů×ĎÄÉÔŘ × ŐËÁÚÁÎÎŮĘ ĆÁĘĚ, Á ÎĹ × $HOME/."
+"info\n"
+" --help ĐĎËÁÚÁÔŘ ÜÔŐ ÓĐŇÁ×ËŐ É ×ŮĘÔÉ\n"
+" --version ĐĎËÁÚÁÔŘ ÉÎĆĎŇÍÁĂÉŔ Ď ×ĹŇÓÉÉ É ×ŮĘÔÉ\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "îĹĐŇÁ×ÉĚŘÎŮĘ ĆÁĘĚ infokey `%s' ÉÇÎĎŇÉŇŐĹÔÓŃ - ÓĚÉŰËĎÍ ÍÁĚĹÎŘËÉĘ"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "îĹĐŇÁ×ÉĚŘÎŮĘ ĆÁĘĚ infokey `%s' ÉÇÎĎŇÉŇŐĹÔÓŃ - ÓĚÉŰËĎÍ ÂĎĚŘŰĎĘ"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "ďŰÉÂËÁ ŢÔĹÎÉŃ ĆÁĘĚÁ infokey `%s' - ŢÔĹÎÉĹ ĐŇĹŇ×ÁÎĎ"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"ćÁĘĚ infokey `%s' ÎĹĐŇÉĹÍĚĹÍ (ÎĹ×ĹŇÎÁŃ ÓÉÇÎÁÔŐŇÁ) -- ÚÁĐŐÓÔÉÔĹ infokey, "
+"ŢÔĎÂŮ ĎÂÎĎ×ÉÔŘ ĹÇĎ"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "ćÁĘĚ infokey `%s' ŐÓÔÁŇĹĚ -- ÚÁĐŐÓÔÉÔĹ infokey, ŢÔĎÂŮ ĎÂÎĎ×ÉÔŘ ĹÇĎ"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"ćÁĘĚ infokey `%s' ÎĹĐŇÉĹÍĚĹÍ (ÎĹ×ĹŇÎŮĘ ËĎÄ ŇÁÚÄĹĚÁ) -- ÚÁĐŐÓÔÉÔĹ infokey, "
+"ŢÔĎÂŮ ĎÂÎĎ×ÉÔŘ ĹÇĎ"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+"đĎ×ŇĹÖÄĹÎÎŮĹ ÄÁÎÎŮĹ × ĆÁĘĚĹ infokey -- ÎĹËĎÔĎŇŮĹ ĐŇÉ×ŃÚËÉ ĐŇĎÉÇÎĎŇÉŇĎ×ÁÎŮ"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+"đĎ×ŇĹÖÄĹÎÎŮĹ ÄÁÎÎŮĹ × ĆÁĘĚĹ infokey -- ÎĹËĎÔĎŇŮĹ ŐÓÔÁÎĎ×ËÉ ĐĹŇĹÍĹÎÎŮČ "
+"ĐŇĎÉÇÎĎŇÉŇĎ×ÁÎŮ"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ ËĎÍÁÎÄŮ Info É ĐĎËÁÚÁÔŘ ĹĹ ĎĐÉÓÁÎÉĹ"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "ďĐÉÓÁÔŘ ËĎÍÁÎÄŐ: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ ËĎÍÁÎÄŮ × ÜČĎ-ĎÂĚÁÓÔÉ É ÉÓĐĎĚÎÉÔŘ ĹĹ"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "úÄĹÓŘ ÎĹĚŘÚŃ ×ŮĐĎĚÎÉÔŘ ËĎÍÁÎÄŐ ÜČĎ-ĎÂĚÁÓÔÉ."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "îĹĎĐŇĹÄĹĚĹÎÎÁŃ ËĎÍÁÎÄÁ: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "őÓÔÁÎĎ×ÉÔŘ ×ŮÓĎÔŐ ĎÔĎÂŇÁÖÁĹÍĎÇĎ ĎËÎÁ"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "őÓÔÁÎĎ×ÉÔŘ ×ŮÓĎÔŐ ÜËŇÁÎÁ ŇÁ×ÎĎĘ (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" üÔĎÔ ĆÁĘĚ ×ËĚŔŢÁĹÔ:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ĎÂŇÁÂĎÔÁÔŘ ĆÁĘĚ %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menu:\n"
+" (ćÁĘĚ)îĎÄÁ óÔŇĎË ňÁÚÍĹŇ ćÁĘĚ\n"
+" ---------- ----- ------ ----"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"üÔĎ ÍĹÎŔ ŇÁÎĹĹ ĐĎÓĹÝĹÎÎŮČ ×ÁÍÉ ÎĎÄ.\n"
+"÷ŮÂĹŇÉÔĹ ĎÄÎŐ ÉÚ ÍĹÎŔ ÉĚÉ ÉÓĐĎĚŘÚŐĘÔĹ `\\[history-node]' × ÄŇŐÇĎÍ ĎËÎĹ.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "óĎÚÄÁÔŘ ĎËÎĎ, ÓĎÄĹŇÖÁÝĹĹ ÍĹÎŔ ĐĎÓĹÝĹÎÎŮČ ŇÁÎĹĹ ÎĎÄ"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "÷ŮÂŇÁÔŘ ŇÁÎĹĹ ĐĎÓĹÝĹÎÎŐŔ ÎĎÄŐ × ×ÉÄÉÍĎÍ ĎËÎĹ"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "÷ŮÂŇÁÔŘ ĐĎÓĹÝĹÎÎŐŔ ŇÁÎĹĹ ÎĎÄŐ: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "óÓŮĚËÁ ÉÓŢĹÚĚÁ! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"äĎÂŇĎ ĐĎÖÁĚĎ×ÁÔŘ × Info ×ĹŇÓÉÉ %s. \\[get-help-window] -- ÓĐŇÁ×ËÁ, \\[menu-"
+"item] ×ŮÂÉŇÁĹÔ ĐŐÎËÔ ÍĹÎŔ."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "óÍĹÓÔÉÔŘÓŃ ÎÁ ÓÔŇĎËŐ ÎÉÖĹ"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "óÍĹÓÔÉÔŘÓŃ ÎÁ ÓÔŇĎËŐ ×ŮŰĹ"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "óÍĹÓÔÉÔŘÓŃ × ËĎÎĹĂ ÓÔŇĎËÉ"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "óÍĹÓÔÉÔŘÓŃ × ÎÁŢÁĚĎ ÓÔŇĎËÉ"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "óĚĹÄŐŔÝÁŃ"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "đĹŇĹČĎÄ ÎÁ ÎĎÄŐ \"óĚĹÄŐŔÝÁŃ\"..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "÷ŮÂÉŇÁĹÔÓŃ ĐĹŇ×ŮĘ ĐŐÎËÔ ÍĹÎŔ..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "÷ŮÂÉŇÁĹÔÓŃ ÎĎÄÁ \"óĚĹÄŐŔÝÁŃ\"..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "đĹŇĹÍĹÝĹÎÉĹ \"÷×ĹŇČ\" %d ŇÁÚ(Á), ÚÁÔĹÍ \"óĚĹÄŐŔÝÁŃ\"."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "÷ ÜÔĎÍ ÄĎËŐÍĹÎÔĹ ÂĎĚŘŰĹ ÎĹÔ ÎĎÄ."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "äĚŃ ÜÔĎĘ ÎĎÄŮ ÎĹÔ ÓÓŮĚËÉ `đŇĹÄŮÄŐÝÁŃ'."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "đĹŇĹČĎÄ ÎÁ ÎĎÄŐ \"đŇĹÄŮÄŐÝÁŃ\" × ÜÔĎÍ ĎËÎĹ."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "÷ ÜÔĎÍ ÄĎËŐÍĹÎÔĹ ÎĹÔ ÓÓŮĚËÉ `đŇĹÄŮÄŐÝÁŃ' ÉĚÉ `÷×ĹŇČ' ÄĚŃ ÜÔĎĘ ÎĎÄŮ."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "đĹŇĹČĎÄ ÎÁ ÎĎÄŐ \"÷×ĹŇČ\" × ÜÔĎÍ ĎËÎĹ."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "đĹŇĹČĎÄ ÎÁ ĐĎÓĚĹÄÎÉĘ ĐŐÎËÔ ÍĹÎŔ ÎĎÄŮ `đŇĹÄŮÄŐÝÁŃ'."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "đŇĎÄ×ÉÇÁÔŘÓŃ ×ĐĹŇĹÄ ÉĚÉ ×ÎÉÚ ĐĎ ÓÔŇŐËÔŐŇĹ ÎĎÄ"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "đŇĎÄ×ÉÇÁÔŘÓŃ ÎÁÚÁÄ ÉĚÉ ××ĹŇČ ĐĎ ÓÔŇŐËÔŐŇĹ ÎĎÄ"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "đŇĎËŇŐÔÉÔŘ ×ĐĹŇĹÄ ÔĹËŐÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "đŇĎËŇŐÔÉÔŘ ÔĹËŐÝĹĹ ĎËÎĎ ×ĐĹŇĹÄ É ŐÓÔÁÎĎ×ÉÔŘ ŇÁÚÍĹŇ ĎËÎÁ ĐĎ ŐÍĎĚŢÁÎÉŔ"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "đŇĎËŇŐÔÉÔŘ ×ĐĹŇĹÄ ÔĹËŐÝĹĹ ĎËÎĎ, ĎÓÔÁ×ÁŃÓŘ × ÔĹËŐÝĹĘ ÎĎÄĹ"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"đŇĎËŇŐÔÉÔŘ ÔĹËŐÝĹĹ ĎËÎĎ ×ĐĹŇĹÄ, ĎÓÔÁ×ÁŃÓŘ × ÔĹËŐÝĹĘ ÎĎÄĹ, É ŐÓÔÁÎĎ×ÉÔŘ "
+"ŇÁÚÍĹŇ ĎËÎÁ ĐĎ ŐÍĎĚŢÁÎÉŔ"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "đŇĎËŇŐÔÉÔŘ ÎÁÚÁÄ ÔĹËŐÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "đŇĎËŇŐÔÉÔŘ ÔĹËŐÝĹĹ ĎËÎĎ ÎÁÚÁÄ É ŐÓÔÁÎĎ×ÉÔŘ ŇÁÚÍĹŇ ĎËÎÁ ĐĎ ŐÍĎĚŢÁÎÉŔ"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "đŇĎËŇŐÔÉÔŘ ÎÁÚÁÄ ÔĹËŐÝĹĹ ĎËÎĎ, ĎÓÔÁ×ÁŃÓŘ × ÔĹËŐÝĹĘ ÎĎÄĹ"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"đŇĎËŇŐÔÉÔŘ ÔĹËŐÝĹĹ ĎËÎĎ ÎÁÚÁÄ, ĎÓÔÁ×ÁŃÓŘ × ÔĹËŐÝĹĘ ÎĎÄĹ, É ŐÓÔÁÎĎ×ÉÔŘ ŇÁÚÍĹŇ "
+"ĎËÎÁ ĐĎ ŐÍĎĚŢÁÎÉŔ"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "đĹŇĹÍĹÓÔÉÔŘÓŃ × ÎÁŢÁĚĎ ÎĎÄŮ"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "đĹŇĹÍĹÓÔÉÔŘÓŃ × ËĎÎĹĂ ÎĎÄŮ"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "đŇĎËŇŐÔÉÔŘ ÎÁ ÎĹÓËĎĚŘËĎ ÓÔŇĎË ×ÎÉÚ"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "đŇĎËŇŐÔÉÔŘ ÎÁ ÎĹÓËĎĚŘËĎ ÓÔŇĎË ××ĹŇČ"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "đŇĎËŇŐÔÉÔŘ ÎÁ ĐĎĚÜËŇÁÎÁ ×ÎÉÚ"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "đŇĎËŇŐÔÉÔŘ ÎÁ ĐĎĚÜËŇÁÎÁ ××ĹŇČ"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "÷ŮÂŇÁÔŘ ÓĚĹÄŐŔÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "÷ŮÂŇÁÔŘ ĐŇĹÄŮÄŐÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "ňÁÚÂÉÔŘ ÔĹËŐÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "őÄÁĚÉÔŘ ÔĹËŐÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ĐĎÓÔĎŃÎÎĎĹ ĎËÎĎ"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "őÄÁĚÉÔŘ ×ÓĹ ĎÓÔÁĚŘÎŮĹ ĎËÎÁ"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "đŇĎËŇŐÔÉÔŘ ÄŇŐÇĎĹ ĎËÎĎ"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "đŇĎËŇŐÔÉÔŘ ÄŇŐÇĎĹ ĎËÎĎ ÎÁÚÁÄ"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "ő×ĹĚÉŢÉÔŘ (ÉĚÉ ŐÍĹÎŘŰÉÔŘ) ÔĹËŐÝĹĹ ĎËÎĎ"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "ňÁÚÄĹĚÉÔŘ ÄĎÓÔŐĐÎĎĹ ÍĹÓÔĎ ÎÁ ÜËŇÁÎĹ ÍĹÖÄŐ ×ÉÄÉÍŮÍÉ ĎËÎÁÍÉ"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "đĹŇĹËĚŔŢÉÔŘ ŇĹÖÉÍ ŇÁÚÂÉ×ÁÎÉŃ ÓÔŇĎË × ÔĹËŐÝĹÍ ĎËÎĹ"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "đĹŇĹĘÔÉ ÎÁ `óĚĹÄŐŔÝŐŔ' ÎĎÄŐ"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "đĹŇĹĘÔÉ ÎÁ `đŇĹÄŮÄŐÝŐŔ' ÎĎÄŐ"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "đĹŇĹĘÔÉ ÎÁ `÷ĹŇČÎŔŔ' ÎĎÄŐ"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "đĹŇĹĘÔÉ ÎÁ ĐĎÓĚĹÄÎŔŔ ÎĎÄŐ × ĆÁĘĚĹ"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "üÔĎ ĎËÎĎ ÎĹ ÉÍĹĹÔ ÄĎĐĎĚÎÉÔĹĚŘÎŮČ ÎĎÄ"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "đĹŇĹĘÔÉ ÎÁ ĐĹŇ×ŐŔ ÎĎÄŐ × ĆÁĘĚĹ"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "÷ŮÂŇÁÔŘ ĐĎÓĚĹÄÎÉĘ ĐŐÎËÔ ÍĹÎŔ × ÔĹËŐÝĹĘ ÎĎÄĹ"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "÷ŮÂŇÁÔŘ ÚÁÄÁÎÎŮĘ ĐŐÎËÔ ÍĹÎŔ"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "÷ ÜÔĎÍ ÍĹÎŔ ÎĹÔ %d ĐŐÎËÔĎ×."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "đŐÎËÔ ÍĹÎŔ (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "đŐÎËÔ ÍĹÎŔ: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "đĹŇĹĘÔÉ ĐĎ ÓÓŮĚËĹ (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "đĹŇĹĘÔÉ ĐĎ ÓÓŮĚËĹ: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ ĐŐÎËÔÁ ÍĹÎŔ É ĐĹŇĹĘÔÉ Ë ÓĎĎÔ×ĹÔÓÔ×ŐŔÝĹĘ ÎĎÄĹ"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ ÓÓŮĚËÉ ÉĚÉ ÓÎĎÓËÉ É ĐĹŇĹĘÔÉ Ë ÓĎĎÔ×ĹÔÓÔ×ŐŔÝĹĘ ÎĎÄĹ"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "óÍĹÓÔÉÔŘÓŃ Ë ÎÁŢÁĚŐ ÍĹÎŔ ÔĹËŐÝĹĘ ÎĎÄŮ"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "đŇĎÓÍĎÔŇĹÔŘ ĎÄÎĎ×ŇĹÍĹÎÎĎ ËÁË ÍĎÖÎĎ ÂĎĚŘŰĹ ÎĎÄ"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ ÎĎÄŮ É ĐĹŇĹĘÔÉ Ë ÎĹĘ"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "đĹŇĹĘÔÉ Ë ÎĎÄĹ: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "÷ ÎĎÄĹ `%s' ÎĹÔ ÍĹÎŔ."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "đŐÎËÔ ÍĹÎŔ `%s' ĎÔÓŐÔÓÔ×ŐĹÔ × ÎĎÄĹ `%s'."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÎÁĘÔÉ ÎĎÄŐ ĐĎ ÓÓŮĚËĹ `%s' × `%s'."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "óŢÉÔÁÔŘ ÓĐÉÓĎË ÍĹÎŔ, ÎÁŢÉÎÁŔÝÉĘÓŃ Ó dir É ĐŇĎÓĚĹÄĎ×ÁÔŘ ĐĎ ÎÉÍ"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "đŇĎÓĚĹÄĎ×ÁÔŘ ĐĎ ÍĹÎŔ: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "îÁČĎÄÉÔ ÎĎÄŐ, ŇÁÓÓËÁÚŮ×ÁŔÝŐŔ, ËÁË ×ŮÚŮ×ÁÔŘ ĐŇĎÇŇÁÍÍŐ"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "îÁĘÔÉ ÎĎÄŐ Invocation ÄĚŃ [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ manpage É ĐĹŇĹĘÔÉ Ë ÎĹĘ"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "đŇĎÓÍĎÔŇĹÔŘ manpage: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "đĹŇĹĘÔÉ ÎÁ `đĹŇ×ŐŔ' ÎĎÄŐ"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "đĹŇĹĘÔÉ ÎÁ ÎĎÄŐ `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "őÄÁĚÉÔŘ ÎĎÄŐ (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ÎĎÄŐ `%s'"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ĐĎÓĚĹÄÎŔŔ ÎĎÄŐ"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "đĹŇĹĘÔÉ Ë ĐĎÓĚĹÄÎĹĘ ×ŮÂŇÁÎÎĎĘ ÎĎÄĹ"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "őÄÁĚÉÔŘ ÔĹËŐÝŐŔ ÎĎÄŐ"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "óŢÉÔÁÔŘ ÉÍŃ ĆÁĘĚÁ É ĐĹŇĹĘÔÉ Ë ÎĹÍŐ"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "ďÂŇÁÔÉÔŘÓŃ Ë ĆÁĘĚŐ: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÎÁĘÔÉ `%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ×ŮČĎÄÎĎĘ ĆÁĘĚ `%s'."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "úÁ×ĹŇŰĹÎĎ."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "úÁĐÉÓŘ ÎĎÄŮ %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "îÁĐŇÁ×ÉÔŘ ÓĎÄĹŇÖÉÍĎĹ ÜÔĎĘ ÎĎÄŮ ÎÁ ×ČĎÄ ËĎÍÁÎÄŮ INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "îĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ ËÁÎÁĚ Ë `%s'."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "đĹŢÁÔŘ ÎĎÄŮ %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "đĎÉÓË ĆÁĘĚÁ %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "óŢÉÔÁÔŘ ÓÔŇĎËŐ É ÚÁĐŐÓÔÉÔŘ ŇĹÇÉÓÔŇĎÚÁ×ÉÓÉÍŮĘ ĐĎÉÓË"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "óŢÉÔÁÔŘ ÓÔŇĎËŐ É ÚÁĐŐÓÔÉÔŘ ĐĎÉÓË"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "óŢÉÔÁÔŘ ÓÔŇĎËŐ É ÚÁĐŐÓÔÉÔŘ ĐĎÉÓË × ĎÂŇÁÔÎĎÍ ÎÁĐŇÁ×ĚĹÎÉÉ"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%s ÓÔŇĎËÉ [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "ďÂŇÁÔÎŮĘ ĐĎÉÓË"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "đĎÉÓË"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " c ŐŢĹÔĎÍ ŇĹÇÉÓÔŇÁ "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "îĹ ÎÁĘÄĹÎĎ"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "đĎ×ÔĎŇÉÔŘ ĐĎÓĚĹÄÎÉĘ ĐĎÉÓË × ÔĎÍ ÖĹ ÎÁĐŇÁ×ĚĹÎÉÉ"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "îĹÔ ÓÔŇĎËÉ ĐŇĹÄŮÄŐÝĹÇĎ ĐĎÉÓËÁ"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "đĎ×ÔĎŇÉÔŘ ĐĎÓĚĹÄÎÉĘ ĐĎÉÓË × ĎÂŇÁÔÎĎÍ ÎÁĐŇÁ×ĚĹÎÉÉ"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "úÁĐŐÓÔÉÔŘ ÉÎÔĹŇÁËÔÉ×ÎŮĘ ÎÁŇÁÝÉ×ÁĹÍŮĘ ĐĎÉÓË"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "îÁŇÁÝÉ×ÁĹÍŮĘ ĎÂŇÁÔÎŮĘ ĐĎÉÓË: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "îÁŇÁÝÉ×ÁĹÍŮĘ ĐĎÉÓË: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "îĹ ÎÁĘÄĹÎĎ "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "óÍĹÓÔÉÔŘÓŃ Ë ĐŇĹÄŮÄŐÝĹĘ ÓÓŮĚËĹ"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "óÍĹÓÔÉÔŘÓŃ Ë ÓĚĹÄŐŔÝĹĘ ÓÓŮĚËĹ"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "÷ŮÂŇÁÔŘ ÓÓŮĚËŐ ÉĚÉ ĐŐÎËÔ ÍĹÎŔ, ÎÁČĎÄŃÝÉĘÓŃ ÎÁ ÄÁÎÎĎĘ ÓÔŇĎËĹ"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "ďÔÍĹÎÉÔŘ ×ŮĐĎĚÎĹÎÉĹ ÔĹËŐÝĹĘ ËĎÍÁÎÄŮ"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "÷ŮČĎÄ"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "đĹŇĹÍĹÓÔÉÔŘ ËŐŇÓĎŇ Ë ÚÁÄÁÎÎĎĘ ÓÔŇĎËĹ ĎËÎÁ"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "đĹŇĹŇÉÓĎ×ÁÔŘ ÜËŇÁÎ"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "÷ŮĘÔÉ ÉÚ Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "úÁĐŐÓÔÉÔŘ ËĎÍÁÎÄŐ, ĐŇÉ×ŃÚÁÎÎŐŔ Ë ÜÔĎĘ ËĚÁ×ÉŰĹ × ÎÉÖÎĹÍ ŇĹÇÉÓÔŇĹ"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "îĹÉÚ×ĹÓÔÎÁŃ ËĎÍÁÎÄÁ (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" ÎĹ×ĹŇÎÁŃ ËĎÍÁÎÄÁ"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "`%s' ÎĹ×ĹŇÎĎ"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "äĎÂÁ×ĚŃĹÔ ĂÉĆŇŐ Ë ÔĹËŐÝĹÍŐ ŢÉÓĚĎ×ĎÍŐ ÁŇÇŐÍĹÎÔŐ"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "îÁŢÁÔŘ (ÉĚÉ ŐÍÎĎÖÉÔŘ ÎÁ 4) ÔĹËŐÝÉĘ ŢÉÓĚĎ×ĎĘ ÁŇÇŐÍĹÎÔ"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "éÓĐĎĚŘÚŐĹÔÓŃ ĆŐÎËĂÉĹĘ \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: ÷ÉŇÔŐÁĚŘÎÁŃ ĐÁÍŃÔŘ ÉÓŢĹŇĐÁÎÁ!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), ÓÎĎÓËÉ ĐĎŃ×ĚŃŔÔÓŃ É ÉÓŢĹÚÁŔÔ Á×ÔĎÍÁÔÉŢĹÓËÉ"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), ÓĎÚÄÁÎÉĹ ÉĚÉ ŐÄÁĚĹÎÉĹ ĎËÎÁ ÉÚÍĹÎŃĹÔ ŇÁÚÍĹŇ ÄŇŐÇÉČ "
+"ĎËĎÎ"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), ×ÍĹÓÔĎ Ú×ŐËĎ×ĎÇĎ ÓÉÇÎÁĚÁ ÍÉÇÁĹÔ ÜËŇÁÎ"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), ĎŰÉÂËÉ ×ŮÚŮ×ÁŔÔ Ú×ŐËĎ×ĎĘ ÓÉÇÎÁĚ"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), ĐŇĎÉÚ×ĎÄÉÔŘ ÓÂĎŇËŐ ÍŐÓĎŇÁ ÄĚŃ ÓÖÁÔŮČ ĆÁĘĚĎ×"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), ×ŮÄĹĚŃÔŘ ĐŇÉ ĐĎÉÓËĹ ÓĎ×ĐÁ×ŰŐŔ ÓÔŇĎËŐ"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "ďĐŇĹÄĹĚŃĹÔ ĐĎ×ĹÄĹÎÉĹ ĐŇĎËŇŐÔËÉ × ËĎÎĂĹ ÎĎÄŮ"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "ţÉÓĚĎ ĐŇĎËŇŐŢÉ×ÁĹÍŮČ ÓÔŇĎË, ËĎÇÄÁ ËŐŇÓĎŇ ĐĹŇĹÍĹÝÁĹÔÓŃ ÚÁ ĐŇĹÄĹĚŮ ĎËÎÁ"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "ĺÓĚÉ ŐÓÔÁÎĎ×ĚĹÎĎ (\"On\"), Info ĎÔĎÂŇÁÖÁĹÔ ÓÉÍ×ĎĚŮ ISO Latin"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "ďĐÉÓÁÔŘ ÉÓĐĎĚŘÚĎ×ÁÎÉĹ ĐĹŇĹÍĹÎÎĎĘ"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "ďĐÉÓÁÔŘ ĐĹŇĹÍĹÎÎŐŔ: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "őÓÔÁÎĎ×ÉÔŘ ÚÎÁŢĹÎÉĹ ĐĹŇĹÍĹÎÎĎĘ"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "őÓÔÁÎĎ×ÉÔŘ ĐĹŇĹÍĹÎÎŐŔ: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "őÓÔÁÎĎ×ÉÔŘ ÚÎÁŢĹÎÉĹ %s ŇÁ×ÎŮÍ (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "őÓÔÁÎĎ×ÉÔŘ ÚÎÁŢĹÎÉĹ %s ŇÁ×ÎŮÍ (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** ôĹÇÉ ŐÓÔÁŇĹĚÉ ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), ÓÔŇĎË ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, ÓÔŇĎË: %d --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, ÓÔŇĎË: %d --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " ćÁĘĚ: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: ÎĹĎÄÎĎÚÎÁŢÎŮĘ ËĚŔŢ `%s'\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: ËĚŔŢ `--%s' ÄĎĚÖĹÎ ÉÓĐĎĚŘÚĎ×ÁÔŘÓŃ ÂĹÚ ÁŇÇŐÍĹÎÔÁ\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: ËĚŔŢ `%c%s' ÄĎĚÖĹÎ ÉÓĐĎĚŘÚĎ×ÁÔŘÓŃ ÂĹÚ ÁŇÇŐÍĹÎÔÁ\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: ËĚŔŢ `%s' ÄĎĚÖĹÎ ÉÓĐĎĚŘÚĎ×ÁÔŘÓŃ c ÁŇÇŐÍĹÎÔĎÍ\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ÎĹÉÚ×ĹÓÔÎŮĘ ËĚŔŢ `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ÎĹÉÚ×ĹÓÔÎŮĘ ËĚŔŢ `%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ÎĹÄĎĐŐÓÔÉÍŮĘ ËĚŔŢ -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ÎĹ×ĹŇÎŮĘ ËĚŔŢ -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: ËĚŔŢ %c ÄĎĚÖĹÎ ÂŮ ÉÓĐĎĚŘÚĎ×ÁÔŘÓŃ c ÁŇÇŐÍĹÎÔĎÍ\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: ÎĹĎÄÎĎÚÎÁŢÎŮĘ ËĚŔŢ `-W %s'\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: ËĚŔŢ `-W %s' ÄĎĚÖĹÎ ÉÓĐĎĚŘÚĎ×ÁÔŘÓŃ ÂĹÚ ÁŇÇŐÍĹÎÔÁ\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "ÁŇÇŐÍĹÎÔŮ ÄĚŃ @%s ÉÇÎĎŇÉŇĎ×ÁÎŮ"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "ŃÎ×ÁŇŃ"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "ĆĹ×ŇÁĚŃ"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "ÍÁŇÔÁ"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "ÁĐŇĹĚŃ"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "ÍÁŃ"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "ÉŔÎŃ"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "ÉŔĚŃ"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "Á×ÇŐÓÔÁ"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "ÓĹÎÔŃÂŇŃ"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "ĎËÔŃÂŇŃ"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "ÎĎŃÂŇŃ"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "ÄĹËÁÂŇŃ"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "ÍÁĚĎ×ĹŇĎŃÔÎŮĘ ÚÎÁË %c × @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "×ĹÓŘ ÁŇÇŐÍĹÎÔ @sc ÎÁÂŇÁÎ ÚÁÇĚÁ×ÎŮÍÉ ÂŐË×ÁÍÉ, ŇĹÚŐĚŘÔÁÔÁ ÎĹ ÂŐÄĹÔ"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "ĎÖÉÄÁĚĎÓŘ `{', ×ÓÔŇĹŢĹÎĎ `%c'"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "ËĎÎĹĂ ĆÁĘĚÁ ×ÓÔŇĹŢĹÎ ×ÎŐÔŇÉ ÎĹĎËĎÎŢĹÎÎĎÇĎ ÂĚĎËÁ"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "ĎÖÉÄÁĚĎÓŘ `}', ×ÓÔŇĹŢĹÎĎ `%c'"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Note...} ÓĎÚÄÁĹÔ × Info ĚĎÖÎŐŔ ĐĹŇĹËŇĹÓÔÎŐŔ ÓÓŮĚËŐ; ĐĹŇĹĆŇÁÚÉŇŐĘÔĹ "
+"ÔĹËÓÔ, ŢÔĎÂŮ ÉÚÂĹÖÁÔŘ ÜÔĎÇĎ"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "ëĎÍÁÎÄÁ %c%s ŐÓÔÁŇĹĚÁ É ÎĹ ÉÓĐĎĚŘÚŐĹÔÓŃ"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "ËĎÍÁÎÄĹ @sp ÎŐÖÎĎ ŐËÁÚÁÔŘ ĐĎĚĎÖÉÔĹĚŘÎŮĘ ŢÉÓĚĎ×ĎĘ ÁŇÇŐÍĹÎÔ, Á ÎĹ `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "đĚĎČĎĘ ÁŇÇŐÍĹÎÔ ÄĚŃ %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "đĚĎČĎĘ ÁŇÇŐÍĹÎÔ ÄĚŃ @%s"
+
+# ???
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "insert"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "÷ ÁŇÇŐÍĹÎÔĹ @def ĐŇĎĐŐÝĹÎÁ `}'"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "ćŐÎËĂÉŃ"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "íÁËŇĎ"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "óĐĹĂÉÁĚŘÎÁŃ ĆĎŇÍÁ"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "đĹŇĹÍĹÎÎÁŃ"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "đĎĚŘÚĎ×ÁÔĹĚŘÓËÉĘ ĐÁŇÁÍĹÔŇ"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "đĹŇĹÍĹÎÎÁŃ ÜËÚĹÍĐĚŃŇÁ"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "íĹÔĎÄ"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "ÉÚ"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "ÎÁÄ"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "îŐÖÎĎ ÂŮÔŘ × ÂĚĎËĹ `@%s', ŢÔĎÂŮ ÉÓĐĎĚŘÚĎ×ÁÔŘ `@%s'"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "ĐĹŇĹÄ ÉÍĹÎĹÍ ×ŮČĎÄÎĎÇĎ ĆÁĘĚÁ ĎĐŐÝĹÎĎ `%s'"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "`%s' ĎĐŐÝĹÎĎ, ĐĎÓËĎĚŘËŐ ĐĹŢÁÔŘ ÉÄĹÔ ÎÁ ÓÔÁÎÄÁŇÔÎŮĘ ×Ů×ĎÄ"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "÷ŮČĎÄÎĎĘ ÂŐĆĹŇ ÎĹ ĐŐÓÔ."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' ÔŇĹÂŐĹÔ ÁŇÇŐÍĹÎÔ `{...}', Á ÎĹ ĐŇĎÓÔĎ `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "äĚŃ ÓÎĎÓËÉ `%s' ÎĹÔ ÚÁËŇŮ×ÁŔÝĹĘ ĆÉÇŐŇÎĎĘ ÓËĎÂËÉ"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "óÎĎÓËÁ ĎĐŇĹÄĹĚĹÎÁ ÂĹÚ ŇĎÄÉÔĹĚŘÓËĎĘ ÎĎÄŮ"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "óÎĎÓËÉ ÉÚ ÓÎĎÓĎË ÚÁĐŇĹÝĹÎŮ"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "óÎĎÓËÉ"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: ÎĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ css-ĆÁĘĚ: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: css-ĆÁĘĚ ĎÂŇŮ×ÁĹÔÓŃ × ËĎÍÍĹÎÔÁŇÉÉ"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "âĹÚ ÚÁÇĎĚĎ×ËÁ"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+"[ÎĹĐŇĹÄ×ÉÄĹÎÎÁŃ ÓÉÔŐÁĂÉŃ] × ÓÔĹËĹ html-ÔĹÇĎ× ÎĹÔ ÜĚĹÍĹÎÔÁ ÄĚŃ ×ŮÔÁĚËÉ×ÁÎÉŃ"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[ÎĹĐŇĹÄ×ÉÄĹÎÎÁŃ ÓÉÔŐÁĂÉŃ] ÎĹ×ĹŇÎĎĹ ÉÍŃ ÎĎÄŮ: `%s'"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "éÍĹÎÎĎĘ ŐËÁÚÁÔĹĚŘ `%s' ÎĹÉÚ×ĹÓÔĹÎ"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+"Info ÎĹ ÍĎÖĹÔ ĎÂŇÁÂĎÔÁÔŘ ÚÎÁË `:' ×Ď ×ČĎÖÄĹÎÉÉ ÁĚĆÁ×ÉÔÎĎÇĎ ŐËÁÚÁÔĹĚŃ `%s'"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "éÍĹÎÎĎĘ ŐËÁÚÁÔĹĚŘ `%s' ŐÖĹ ÓŐÝĹÓÔ×ŐĹÔ"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "îĹÉÚ×ĹÓÔĹÎ ÉÍĹÎÎĎĘ ŐËÁÚÁÔĹĚŘ `%s' É/ÉĚÉ `%s' × @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(ÓÔŇĎËÁ )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(ÓÔŇĎËÁ %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "îĹÉÚ×ĹÓÔĹÎ ÉÍĹÎÎĎĘ ŐËÁÚÁÔĹĚŘ `%s' × @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "÷ČĎÖÄĹÎÉĹ ÄĚŃ ÉÍĹÎÎĎÇĎ ŐËÁÚÁÔĹĚŃ `%s' ×ÎĹ ÎĎÄŮ"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(×ÎĹ ËÁËĎĘ-ĚÉÂĎ ÎĎÄŮ)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "óÍĎÔŇÉÔĹ "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "ÎĹĚŘÚŃ ÚÁÄÁ×ÁÔŘ @item × ÁŇÇŐÍĹÎÔĹ ÄĚŃ @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Broken-Type × insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "đĹŇĹĐĎĚÎĹÎÉĹ ÓÔĹËÁ ĐĹŇĹŢÉÓĚĹÎÉŃ"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "ÚÁËĎÎŢÉĚÓŃ ÁĚĆÁ×ÉÔ, ×ĎÚ×ŇÁÔ ÎÁ %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s ÄĎĚÖÎÁ ÉÓĐĎĚŘÚĎ×ÁÔŘÓŃ c ÁŇÇŐÍĹÎÔĎÍ: ĆĎŇÍÁÔĎÍ ÄĚŃ %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "ÂĚĎËÉ %cfloat ÎĹĚŘÚŃ ×ËĚÁÄŮ×ÁÔŘ ÄŇŐÇ × ÄŇŐÇÁ"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "ĎÖÉÄÁĚĎÓŘ `@end' Ó `%s', ×ÓÔŇĹŢĹÎĎ `%s'"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "îĹÔ ĐÁŇÎĎĘ `%cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s ÔŇĹÂŐĹÔ ÂŐË×Ů ÉĚÉ ĂÉĆŇŮ"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "ËĎÎĹĂ ĆÁĘĚÁ ×ÓÔŇĹŢĹÎ ×ÎŐÔŇÉ ÎĹĎËĎÎŢĹÎÎĎÇĎ ÂĚĎËÁ"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s ÎĹ ÉÍĹĹÔ ÓÍŮÓĚÁ ×ÎĹ ÂĚĎËÁ `@float'"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu ×ÓÔŇĹŢĹÎĎ ĐĹŇĹÄ ĐĹŇ×ĎĘ @node, ÂŐÄĹÔ ÓĎÚÄÁÎÁ ÎĎÄÁ `Top'"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"×ĹŇĎŃÔÎĎ, ×ÁŰÁ ÎĎÄÁ @top ÄĎĚÖÎÁ ÂŮÔŘ × ÂĚĎËĹ @ifnottex, Á ÎĹ × @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu ×ÓÔŇĹŢĹÎĎ ĐĹŇĹÄ ĐĹŇ×ĎĘ @node, ÂŐÄĹÔ ÓĎÚÄÁÎÁ ÎĎÄÁ `Top'"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr "@%s ÎĹ ÉÍĹĹÔ ÓÍŮÓĚÁ ×ÎĹ ÂĚĎËÁ `@titlepage' ÉĚÉ `@quotation'"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s ÎĹ ÉÍĹĹÔ ÓÍŮÓĚÁ ×ÎĹ ÂĚĎËÁ `@titlepage'"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "îĹĐÁŇÎÁŃ `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "đĎÓĚĹ `%c%s' ÄĎĚÖÎĎ ŢÔĎ-ÔĎ ÉÄÔÉ"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "đĚĎČĎĘ ÁŇÇŐÍĹÎÔ `%s' ÄĚŃ `@%s', ÂŐÄĹÔ ÉÓĐĎĚŘÚĎ×ÁÎ `%s'"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s ÎĹ ÉÍĹĹÔ ÓÍŮÓĚÁ ×ÎŐÔŇÉ ÂĚĎËÁ `@%s'"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx ÎĹ ÉÍĹĹÔ ÓÍŮÓĚÁ ×ÎŐÔŇÉ ÂĚĎËÁ `%s'"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s ×ÓÔŇĹŢĹÎÁ ×ÎĹ ÂĚĎËÁ ×ÓÔÁ×ËÉ"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s ÎĹ Ń×ĚŃĹÔÓŃ ×ĹŇÎŮÍ ËĎÄĎÍ ŃÚŮËÁ ÉÚ ISO 639"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "ÉÍŃ ËĎÄÉŇĎ×ËÉ `%s' ÎĹ ŇÁÓĐĎÚÎÁÎĎ"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "ÉÚ×ÉÎÉÔĹ, ËĎÄÉŇĎ×ËÁ `%s' ÎĹ ĐĎÄÄĹŇÖÉ×ÁĹÔÓŃ"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "ÎĹĐŇÁ×ÉĚŘÎĎ ÚÁËĎÄÉŇĎ×ÁÎÎŮĘ ÚÎÁË `%s'"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s ĎÖÉÄÁĹÔ × ËÁŢĹÓÔ×Ĺ ÁŇÇŐÍĹÎÔÁ `i' ÉĚÉ `j', Á ÎĹ `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s ĎÖÉÄÁĹÔ × ËÁŢĹÓÔ×Ĺ ÁŇÇŐÍĹÎÔÁ ĎÄÉÎ ÓÉÍ×ĎĚ `i' ÉĚÉ `j'"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "ÍÁËŇĎ `%s' ÂŮĚĎ ĎĐŇĹÄĹĚĹÎĎ ŇÁÎŘŰĹ"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "ÍĹÓÔĎ ĐŇĹÄŮÄŐÝĹÇĎ ĎĐŇĹÄĹĚĹÎÉŃ `%s'"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "ĐĎÓĚĹ \\ × ŇÁÓËŇŮÔÉÉ ÍÁËŇĎ ÓÔĎÉÔ `%s', Á ÎĹ ÉÍŃ ĐÁŇÁÍĹÔŇÁ"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "íÁËŇĎ `%s' ×ŮÚ×ÁÎĎ ÎÁ ÓÔŇĎËĹ %d Ó ÉÚĚÉŰÎÉÍÉ ÁŇÇŐÍĹÎÔÁÍÉ"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "ÎĹ ×ÓÔŇĹŢĹÎĎ %cend macro"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg ĐĎĚĹÚÎÁ, ÔĎĚŘËĎ ĹÓĚÉ ÍÁËŇĎ ĐŇÉÎÉÍÁĹÔ ĎÄÉÎ ÁŇÇŐÍĹÎÔ"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "ÎĹĐÁŇÎŮĹ @end %s É @%s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "óĚÉŰËĎÍ ÍÎĎÇĎ ĎŰÉÂĎË! ďÓÔÁÎĎ×ËÁ.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: ĐŇĹÄŐĐŇĹÖÄĹÎÉĹ: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "úÄĹÓŘ ÎĹ ÄĎĚÖÎĎ ÂŮÔŘ %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "đĎĐŇĎÂŐĘÔĹ `%s --help' ÄĚŃ ĐĎĚŐŢĹÎÉŃ ÂĎĚĹĹ ĐĎÄŇĎÂÎĎÇĎ ĎĐÉÓÁÎÉŃ.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "éÓĐĎĚŘÚĎ×ÁÎÉĹ: %s [ëěŕţ]... TEXINFO-ćáęě...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"đŇĹĎÂŇÁÚŐĹÔ ÄĎËŐÍĹÎÔÁĂÉŔ × ĆĎŇÍÁÔĹ Texinfo × ÄŇŐÇÉĹ ĆĎŇÍÁÔŮ, ĐĎ\n"
+"ŐÍĎĚŢÁÎÉŔ × Info-ĆÁĘĚŮ, ËĎÔĎŇŮĹ ÍĎÖÎĎ ŢÉÔÁÔŘ Ó ĐĎÍĎÝŘŔ Emacs ÉĚÉ\n"
+"ĎÔÄĹĚŘÎĎĘ ĐŇĎÇŇÁÍÍŮ GNU Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"ďÂÝÉĹ ËĚŔŢÉ:\n"
+" --error-limit=ţéóěď ĎÓÔÁÎĎ×ÉÔŘÓŃ ĐĎÓĚĹ ţéóěá ĎŰÉÂĎË (ĐĎ "
+"ŐÍĎĚŢÁÎÉŔ %d).\n"
+" --force ÓĎČŇÁÎŃÔŘ ×Ů×ĎÄ, ÄÁÖĹ ĹÓĚÉ ÂŮĚÉ ĎŰÉÂËÉ.\n"
+" --help ĐĎËÁÚÁÔŘ ÜÔŐ ÓĐŇÁ×ËŐ É ×ŮĘÔÉ.\n"
+" --no-validate ÎĹ ĐŇĎÉÚ×ĎÄÉÔŘ ĐŇĎ×ĹŇËŐ ĐĹŇĹËŇĹÓÔÎŮČ "
+"ÓÓŮĚĎË.\n"
+" --no-warn ÎĹ ĐĎËÁÚŮ×ÁÔŘ ĐŇĹÄŐĐŇĹÖÄĹÎÉŃ (ÎĎ ÎĹ "
+"ĎŰÉÂËÉ).\n"
+" --reference-limit=î ÍÁËÓÉÍÁĚŘÎĎĹ ŢÉÓĚĎ ÓÓŮĚĎË, ÎĹ ×ŮÚŮ×ÁŔÝĹĹ\n"
+" ×Ů×ĎÄ ĐŇĹÄŐĐŇĹÖÄĹÎÉŃ (ĐĎ ŐÍĎĚŢÁÎÉŔ %d).\n"
+" -v, --verbose ĐĎŃÓÎŃÔŘ ÄĹĘÓÔ×ÉŃ.\n"
+" --version ĐĎËÁÚÁÔŘ ÉÎĆĎŇÍÁĂÉŔ Ď ×ĹŇÓÉÉ É ×ŮĘÔÉ.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"÷ŮÂĎŇ ×ŮČĎÄÎĎÇĎ ĆĎŇÍÁÔÁ (ĐĎ ŐÍĎĚŢÁÎÉŔ ×Ů×ĎÄÉÔÓŃ Info):\n"
+" --docbook ×Ů×ĎÄÉÔŘ × ĆĎŇÍÁÔĹ DocBook XML, Á ÎĹ Info.\n"
+" --html ×Ů×ĎÄÉÔŘ × ĆĎŇÍÁÔĹ HTML, Á ÎĹ Info.\n"
+" --xml ×Ů×ĎÄÉÔŘ × ĆĎŇÍÁÔĹ Texinfo XML, Á ÎĹ × Info.\n"
+" --plaintext ×Ů×ĎÄÉÔŘ ĐŇĎÓÔĎĘ ÔĹËÓÔ, Á ÎĹ Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"ďÂÝÉĹ ËĚŔŢÉ, ŐĐŇÁ×ĚŃŔÝÉĹ ×Ů×ĎÄĎÍ:\n"
+" -E, --macro-expand ćáęě ×Ů×ĹÓÔÉ × ćáęě ĐĹŇ×ĎÎÁŢÁĚŘÎŮĘ Texinfo-ĆÁĘĚ Ó\n"
+" ŇÁÓËŇŮÔŮÍÉ ÍÁËŇĎÓÁÍÉ.\n"
+" --no-headers ×Ů×ĎÄÉÔŘ ĐŇĎÓÔĎĘ ÔĹËÓÔ, ĐŇĎĐŐÓËÁŃ ŇÁÚÄĹĚÉÔĹĚÉ "
+"ÎĎÄ\n"
+" Info É ÓÔŇĎËÉ Node:; ĐÉÓÁÔŘ ÎÁ ÓÔÁÎÄÁŇÔÎŮĘ "
+"×Ů×ĎÄ,\n"
+" ĹÓĚÉ ÎĹ ÚÁÄÁÎ ËĚŔŢ --output.\n"
+" --no-split ĐĎÄÁ×ÉÔŘ ŇÁÚÂÉĹÎÉĹ ÂĎĚŘŰÉČ Info- ÉĚÉ HTML-"
+"ĆÁĘĚĎ×,\n"
+" ÓĎÚÄÁ×ÁÔŘ ÔĎĚŘËĎ ĎÄÉÎ ×ŮČĎÄÎĎĘ ĆÁĘĚ.\n"
+" --number-sections ×ËĚŔŢÁÔŘ × ×Ů×ĎÄ ÎĎÍĹŇÁ ÇĚÁ×, ŇÁÚÄĹĚĎ× É "
+"ĐŇÉĚĎÖĹÎÉĘ.\n"
+" -o, --output=ćáęě ×Ů×ĎÄÉÔŘ × ŐËÁÚÁÎÎŮĘ ćáęě (ËÁÔÁĚĎÇ ÄĚŃ HTML Ó \n"
+" ŇÁÚÂÉĹÎÉĹÍ).\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"ëĚŔŢÉ ÄĚŃ Info É ĐŇĎÓÔĎÇĎ ÔĹËÓÔÁ:\n"
+" --enable-encoding ×Ů×ĎÄÉÔŘ ÚÎÁËÉ Ó ÁËĂĹÎÔÁÍÉ É ÓĐĹĂÉÁĚŘÎŮĹ "
+"ÚÎÁËÉ,\n"
+" ĎÓÎĎ×Ů×ÁŃÓŘ ÎÁ @documentencoding.\n"
+" --fill-column=ţéóěď ŇÁÚÂÉ×ÁÔŘ ÓÔŇĎËÉ ÄĚÉÎÎĹĹ ţéóěá ÚÎÁËĎ× (ĐĎ\n"
+" ŐÍĎĚŢÁÎÉŔ %d).\n"
+" --footnote-style=óôéěř ×Ů×ĎÄÉÔŘ ÓÎĎÓËÉ ĎÄÎÉÍ ÉÚ óôéěĺę:\n"
+" `separate' -- ĐĎÍĹÝÁÔŘ ÓÎĎÓËÉ × ĎÔÄĹĚŘÎŐŔ "
+"ÎĎÄŐ,\n"
+" `end' -- ĐĎÍĹÝÁÔŘ ÓÎĎÓËÉ × ËĎÎĹĂ ÎĎÄŮ, ÇÄĹ "
+"ĎÎÉ ÂŮĚÉ\n"
+" ĎĐŇĹÄĹĚĹÎŮ (ĐĎ ŐÍĎĚŢÁÎÉŔ)\n"
+" --paragraph-indent=î ÄĹĚÁÔŘ ĎÔÓÔŐĐŮ ŰÉŇÉÎĎĘ î ĐŇĎÂĹĚĎ× (ĐĎ "
+"ŐÍĎĚŢÁÎÉŔ %d).\n"
+" ĺÓĚÉ î ŇÁ×ÎĎ `none', ÎĹ ÄĹĚÁÔŘ ĎÔÓÔŐĐŮ, "
+"ĹÓĚÉ\n"
+" `asis', ÓĎČŇÁÎŃÔŘ ÓŐÝĹÓÔ×ŐŔÝÉĹ ĎÔÓÔŐĐŮ.\n"
+" --split-size=ňáúíĺň ŇÁÚÂÉ×ÁÔŘ ÎÁ ĆÁĘĚŮ ÚÁÄÁÎÎĎÇĎ ňáúíĺňá (ĐĎ\n"
+" ŐÍĎĚŢÁÎÉŔ %d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"ëĚŔŢÉ ÄĚŃ HTML:\n"
+" --css-include=ćáęě ×ËĚŔŢÉÔŘ ćáęě × ÔĹÇ <style> × ×Ů×ĎÄĹ HTML;\n"
+" ŢÉÔÁÔŘ ÓÔÁÎÄÁŇÔÎŮĘ ××ĎÄ, ĹÓĚÉ ćáęě ÚÁÄÁÎ ËÁË "
+"-.\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"ëĚŔŢÉ ÄĚŃ XML É Docbook:\n"
+" --output-indent=ţéóěď ÄĹĚÁÔŘ ÄĚŃ XML-ÜĚĹÍĹÎÔĎ× ĎÔÓÔŐĐŮ ÎÁ "
+"ÚÁÄÁÎÎĎĹ \n"
+" ţéóěď ĐŇĎÂĹĚĎ× (ĐĎ ŐÍĎĚŢÁÎÉŔ %d).\n"
+" ĺÓĚÉ ţéóěď ŇÁ×ÎĎ ÎŐĚŔ, ÎĹÚÎÁŢÁÝÉĹ ĐŇĎÂĹĚŮ "
+"ĎĐŐÓËÁŔÔÓŃ.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"ëĚŔŢÉ, ŐĐŇÁ×ĚŃŔÝÉĹ ×ČĎÄÎŮÍÉ ĆÁĘĚÁÍÉ:\n"
+" --commands-in-node-names ĐĎÚ×ĎĚÉÔŘ ÉÓĐĎĚŘÚĎ×ÁÎÉĹ @-ËĎÍÁÎÄ × ÉÍĹÎÁČ "
+"ÎĎÄ.\n"
+" -D đĺňĺíĺîîáń ĎĐŇĹÄĹĚÉÔŘ đĺňĺíĺîîőŕ, ÁÎÁĚĎÇÉŢÎĎ ÉÓĐĎĚŘÚĎ×ÁÎÉŔ "
+"@set.\n"
+" -I ëáôáěďç ÄĎÂÁ×ÉÔŘ ëáôáěďç × ËĎÎĹĂ ÓĐÉÓËÁ ĐĎÉÓËÁ ×ËĚŔŢÁĹÍŮČ\n"
+" ĆÁĘĚĎ× @include.\n"
+" -P ëáôáěďç ÄĎÂÁ×ÉÔŘ ëáôáěďç × ÎÁŢÁĚĎ ÓĐÉÓËÁ ĐĎÉÓËÁ ×ËĚŔŢÁĹÍŮČ\n"
+" ĆÁĘĚĎ× @include.\n"
+" -U đĺňĺíĺîîáń ÓÄĹĚÁÔŘ đĺňĺíĺîîőŕ ÎĹĎĐŇĹÄĹĚĹÎÎĎĘ, ÁÎÁĚĎÇÉŢÎĎ\n"
+" ÉÓĐĎĚŘÚĎ×ÁÎÉŔ @clear.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"őÓĚĎ×ÎÁŃ ĎÂŇÁÂĎÔËÁ ÉÓČĎÄÎĎÇĎ ÔĹËÓÔÁ:\n"
+" --ifhtml ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifhtml É @html,\n"
+" ÄÁÖĹ ĐŇÉ ×Ů×ĎÄĹ ÎĹ × ĆĎŇÍÁÔĹ HTML.\n"
+" --ifinfo ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifinfo, ÄÁÖĹ ĐŇÉ\n"
+" ×Ů×ĎÄĹ ÎĹ × ĆĎŇÍÁÔĹ Info.\n"
+" --ifplaintext ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifplaintext, ÄÁÖĹ ĐŇÉ\n"
+" ×Ů×ĎÄĹ ÎĹ × ĆĎŇÍÁÔĹ ĐŇĎÓÔĎÇĎ ÔĹËÓÔÁ.\n"
+" --iftex ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @iftex É @tex;\n"
+" ĐĎÄŇÁÚŐÍĹ×ÁĹÔ --no-split.\n"
+" --ifxml ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifxml É @xml.\n"
+" --no-ifhtml ÎĹ ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifhtml É @html.\n"
+" --no-ifinfo ÎĹ ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifinfo.\n"
+" --no-ifplaintext ÎĹ ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifplaintext.\n"
+" --no-iftex ÎĹ ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @iftex É @tex.\n"
+" --no-ifxml ÎĹ ĎÂŇÁÂÁÔŮ×ÁÔŘ ÔĹËÓÔ ×ÎŐÔŇÉ ÂĚĎËĎ× @ifxml É @xml.\n"
+"\n"
+" ëŇĎÍĹ ÔĎÇĎ, ÄĚŃ ËĚŔŢĹĘ --no-ifćďňíáô, ĎÂŇÁÂÁÔŮ×ÁÔŘ ÂĚĎËÉ @ifnotćďňíáô.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+"đĎ ŐÍĎĚŢÁÎÉŔ ĎÂŇÁÂĎÔËÁ ŐÓĚĎ×ÎŮČ ËĎÍÁÎÄ @if... ÚÁ×ÉÓÉÔ ĎÔ ×ŮČĎÄÎĎÇĎ ĆĎŇÍÁÔÁ:\n"
+" ĐŇÉ ×Ů×ĎÄĹ HTML ×ËĚŔŢĹÎ --ifhtml, Á ĎÓÔÁĚŘÎŮĹ ×ŮËĚŔŢĹÎŮ;\n"
+" ĐŇÉ ×Ů×ĎÄĹ Info ×ËĚŔŢĹÎ --ifinfo, Á ĎÓÔÁĚŘÎŮĹ ×ŮËĚŔŢĹÎŮ;\n"
+" ĐŇÉ ×Ů×ĎÄĹ ĐŇĎÓÔĎÇĎ ÔĹËÓÔÁ ×ËĚŔŢĹÎ --ifplaintext, ĎÓÔÁĚŘÎŮĹ ×ŮËĚŔŢĹÎŮ;\n"
+" ĐŇÉ ×Ů×ĎÄĹ XML ×ËĚŔŢĹÎ --ifxml, ĎÓÔÁĚŘÎŮĹ ×ŮËĚŔŢĹÎŮ.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"đŇÉÍĹŇŮ:\n"
+" makeinfo foo.texi ÚÁĐÉÓÁÔŘ Info × @setfilename ÉÚ foo\n"
+" makeinfo --html foo.texi ÚÁĐÉÓÁÔŘ HTML × @setfilename\n"
+" makeinfo --xml foo.texi ÚÁĐÉÓÁÔŘ Texinfo XML × @setfilename\n"
+" makeinfo --docbook foo.texi ÚÁĐÉÓÁÔŘ DocBook XML × @setfilename\n"
+" makeinfo --no-headers -o - foo.texi ÚÁĐÉÓÁÔŘ ĐŇĎÓÔĎĘ ÔĹËÓÔ ÎÁ "
+"ÓÔÁÎÄÁŇÔÎŮĘ\n"
+" ×Ů×ĎÄ\n"
+"\n"
+" makeinfo --html --no-headers foo.texi ÚÁĐÉÓÁÔŘ HTML ÂĹÚ ÍĹÎŔ É ÓÔŇĎË ÎĎÄŮ\n"
+" makeinfo --number-sections foo.texi ÚÁĐÉÓÁÔŘ Info Ó ÎŐÍĹŇĎ×ÁÎÎŮÍÉ "
+"ŇÁÚÄĹĚÁÍÉ\n"
+" makeinfo --no-split foo.texi ÚÁĐÉÓÁÔŘ ĎÄÉÎ ÂĎĚŘŰĎĘ Info-ĆÁĘĚ\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: ÎĹÉÚ×ĹÓÔÎĎĹ ÚÎÁŢĹÎÉĹ TEXINFO_OUTPUT_FORMAT `%s' ÉÇÎĎŇÉŇĎ×ÁÎĎ.\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s ÁŇÇŐÍĹÎÔ ÄĎĚÖĹÎ ÂŮÔŘ ŢÉÓĚĎ×ŮÍ, ÎĹ `%s'.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: ÎĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ ×ŮČĎÄÎĎĘ ĆÁĘĚ ÍÁËŇĎŇÁÓŰÉŇĹÎÉŃ `%s'"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: ×ÔĎŇĎĘ ×ŮČĎÄÎĎĘ ĆÁĘĚ ÍÁËŇĎŇÁÓŰÉŇĹÎÉŃ `%s' ÉÇÎĎŇÉŇĎ×ÁÎ.\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: ÁŇÇŐÍĹÎÔ --paragraph-indent ÄĎĚÖĹÎ ÂŮÔŘ ŢÉÓĚĎ×ŮÍ, ÉĚÉ\n"
+"`none', ÉĚÉ `asis'; ÎĹ `%s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: ÁŇÇŐÍĹÎÔ --footnote-style ÄĎĚÖĹÎ ÂŮÔŘ `separate' ÉĚÉ `end'; Á ÎĹ `%s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: ĐŇĎĐŐÝĹÎ ÁŇÇŐÍĹÎÔ, ÚÁÄÁŔÝÉĘ ĆÁĘĚ.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "îĹĐŇÁ×ÉĚŘÎĎ ÉÓĐĎĚŘÚĎ×ÁÎÁ ÍÎĎÇĎÓÔŇĎŢÎÁŃ ËĎÍÁÎÄÁ %c%s"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "ďÖÉÄÁĹÔÓŃ `%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ËÁÔÁĚĎÇ `%s': %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "`%s' ÎĹ ÎÁĘÄĹÎ × `%s'"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: ňÁÓËŇŮÔÉĹ ÍÁËŇĎÓĎ× × ÓÔÁÎÄÁŇÔÎŮĘ ×Ů×ĎÄ ÎĹ ĐŇĎÉÚ×ĎÄÉÔÓŃ,\n"
+"ÔÁË ËÁË ÔŐÄÁ ÎÁĐŇÁ×ĚĹÎ ×Ů×ĎÄ × ĆĎŇÍÁÔĹ Info.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "óĎÚÄÁÎÉĹ %s-ĆÁĘĚÁ `%s' ÉÚ `%s'.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "üÔĎ %s, ÓĎÚÄÁÎÎŮĘ makeinfo ×ĹŇÓÉÉ %s ÉÚ %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: őÄÁĚĹÎÉĹ ×ŮČĎÄÎĎÇĎ ĆÁĘĚÁ ÍÁËŇĎŇÁÓŰÉŇĹÎÉĘ `%s' -- ÂŮĚÉ ĎŰÉÂËÉ;\n"
+"ÉÓĐĎĚŘÚŐĘÔĹ --force, ŢÔĎÂŮ ĐŇÉÎŐÄÉÔĹĚŘÎĎ ÓĎČŇÁÎÉÔŘ ŇĹÚŐĚŘÔÁÔŮ.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: őÄÁĚĹÎÉĹ ×ŮČĎÄÎĎÇĎ ĆÁĘĚÁ `%s' -- ÂŮĚÉ ĎŰÉÂËÉ;\n"
+"ÉÓĐĎĚŘÚŐĘÔĹ --force, ŢÔĎÂŮ ĐŇÉÎŐÄÉÔĹĚŘÎĎ ÓĎČŇÁÎÉÔŘ ŇĹÚŐĚŘÔÁÔŮ.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "îĹÉÚ×ĹÓÔÎÁŃ ËĎÍÁÎÄÁ `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+"éÓĐĎĚŘÚŐĘÔĹ ĆÉÇŐŇÎŮĹ ÓËĎÂËÉ, ŢÔĎÂŮ ĐĹŇĹÄÁÔŘ @%s ËĎÍÁÎÄŐ × ËÁŢĹÓÔ×Ĺ ÁŇÇŐÍĹÎÔÁ"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s ĐĎÄŇÁÚŐÍĹ×ÁĹÔ ĆÉÇŐŇÎŮĹ ÓËĎÂËÉ"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "îĹĐÁŇÎÁŃ }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "âĺú_éíĺîé!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s ĐŇĎĐŐÝĹÎÁ ÚÁËŇŮ×ÁŔÝÁŃ ÓËĎÂËÁ"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ĐŇĎŢÉÔÁÔŘ ĆÁĘĚ `%s' × ËĎÍÁÎÄĹ @image (ÄĚŃ HTML): %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "ćÁĘĚ `%s' ÎĹ ÓŐÝĹÓÔ×ŐĹÔ"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ĐŇĎŢÉÔÁÔŘ ĆÁĘĚ `%s' × ËĎÍÁÎÄĹ @image (ÄĚŃ ÔĹËÓÔÁ): %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "ĐĎÓĚĹ @image ĐŇĎĐŐÝĹÎ ÁŇÇŐÍĹÎÔ ÚÁÄÁŔÝÉĘ ĆÁĘĚ "
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "ÎĹĎĐŇĹÄĹĚĹÎÎŮĘ ĆĚÁÇ: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{úÎÁŢĹÎÉĹ `%s' ÎĹ ÚÁÄÁÎĎ}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "ËĎÍÁÎÄĹ %c%s ÎŐÖÎĎ ŐËÁÚÁÔŘ ÉÍŃ"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "ëĎÎĹĂ ĆÁĘĚÁ ŇÁÎŘŰĹ ÓĎĎÔ×ĹÔÓÔ×ŐŔÝĹĘ ËĎÍÁÎÄŮ @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' ÓĚÉŰËĎÍ ×ĹĚÉËĎ; ÎĹ×ĎÚÍĎÖÎĎ ŇÁÓËŇŮÔŘ"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "÷ ŰÁÂĚĎÎĹ @multitable ĐŇĎĐŐÝĹÎÁ `}'"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ÔĹËÓÔ `%s' ĐĎÓĚĹ @multitable ÉÇÎĎŇÉŇĎ×ÁÎ"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "óĚÉŰËĎÍ ÍÎĎÇĎ ËĎĚĎÎĎË × ÜĚĹÍĹÎÔĹ ÔÁÂĚÉĂŮ (ÍÁËÓÉÍŐÍ %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[ÎĹĐŇĹÄ×ÉÄĹÎÎÁŃ ÓÉÔŐÁĂÉŃ] ÎĹ×ĎÚÍĎÖÎĎ ×ŮÂŇÁÔŘ ËĎĚĎÎËŐ #%d × ÔÁÂĚÉĂĹ"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "@tab ×ÎĹ ÔÁÂĚÉĂŮ ÉÇÎĎŇÉŇĎ×ÁÎ"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** íÎĎÇĎËĎĚĎÎĎŢÎŮĘ ×Ů×ĎÄ ÉÚ ĐĎÓĚĹÄÎĹĘ ÓÔŇĎËÉ:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* ËĎĚĎÎËÁ %d: ×Ů×ĎÄ = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "îĎÄÁ `%s' ÂŮĚÁ ŇÁÎĹĹ ĎĐŇĹÄĹĚĹÎÁ × ÓÔŇĎËĹ %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "ćĎŇÍÁÔÉŇĎ×ÁÎÉĹ ÎĎÄŮ %s...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "äĚŃ ÎĎÄŮ `%s' ÔŇĹÂŐĹÔÓŃ ËĎÍÁÎÄÁ ĎĐÉÓÁÎÉŃ ÓÔŇŐËÔŐŇŮ ÇĚÁ× (ÎÁĐŇ. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "äĚŃ ËĎÍÁÎÄŮ `%c%s' ÎĹ ÚÁÄÁÎĎ ÉÍŃ ÎĎÄŮ"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "íÁŇËĹŇ `%s' É ÎĎÄÁ `%s' ÓÓŮĚÁŔÔÓŃ ÎÁ ĎÄÎĎ É ÔĎ ÖĹ ÉÍŃ ĆÁĘĚÁ"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "äÁÎÎÁŃ ËĎÍÁÎÄÁ @anchor ÉÇÎĎŇÉŇŐĹÔÓŃ; ÓÓŮĚËÉ ÎÁ ÎĹĹ ÎĹ ÂŐÄŐÔ ŇÁÂĎÔÁÔŘ"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "đĹŇĹÉÍĹÎŐĘÔĹ ÜÔĎÔ ÍÁŇËĹŇ ÉĚÉ ÉÓĐĎĚŘÚŐĘÔĹ ËĚŔŢ `--no-split'"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "îĹĎÖÉÄÁÎÎÁŃ ÓÔŇĎËÁ × ËĎÎĂĹ ŇÁÚÂÉÔĎÇĎ HTML-ĆÁĘĚÁ `%s'"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "óĚĹÄŐŔÝÁŃ:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "đŇĹÄŮÄŐÝÁŃ:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "÷×ĹŇČ:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "íÁŇËĹŇŮ `%s' É `%s' ÓÓŮĚÁŔÔÓŃ ÎÁ ĎÄÎĎ É ÔĎ ÖĹ ÉÍŃ ĆÁĘĚÁ"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "ëĎÍÁÎÄÁ @anchor ÉÇÎĎŇÉŇŐĹÔÓŃ; ÓÓŮĚËÉ ÎÁ ÎĹĹ ÎĹ ÂŐÄŐÔ ŇÁÂĎÔÁÔŘ"
+
+# ÚÄĹÓŘ %s ÍĎÖĹÔ ÂŮÔŘ `cross' ÉĚÉ `menu'
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%s ÎÁ ÎĹÓŐÝĹÓÔ×ŐŔÝŐŔ ÎĎÄŐ `%s' (×ĎÚÍĎÖÎĎ, ÎĹĐŇÁ×ÉĚŘÎĎ ĎĐÉÓÁÎÁ ÓÔŇŐËÔŐŇÁ "
+"ÇĚÁ×?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "óÓŮĚËÁ ÉÚ ÍĹÎŔ"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "đĹŇĹËŇĹÓÔÎÁŃ ÓÓŮĚËÁ"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"îÁ ĐĎĚĹ Next ÎĎÄŮ `%s' ÎĹÔ ÓÓŮĚĎË (×ĎÚÍĎÖÎĎ, ÎĹĐŇÁ×ÉĚŘÎĎ ĎĐÉÓÁÎÁ ÓÔŇŐËÔŐŇÁ "
+"ÇĚÁ×?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "÷ ÜÔĎĘ ÎĎÄĹ (%s) ÎĹĐŇÁ×ÉĚŘÎŮĘ ŐËÁÚÁÔĹĚŘ Prev"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "đŇĹÄŮÄŐÝÁŃ"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "îÁ ĐĎĚĹ Prev ÎĎÄŮ `%s' ÎĹÔ ÓÓŮĚĎË"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "÷ ÜÔĎĘ ÎĎÄĹ (%s) ÎĹĐŇÁ×ÉĚŘÎŮĘ ŐËÁÚÁÔĹĚŘ Next"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+"÷ ÎĎÄĹ `%s' ÎĹÔ ĐĎĚŃ Up (×ĎÚÍĎÖÎĎ, ÎĹĐŇÁ×ÉĚŘÎĎ ĎĐÉÓÁÎÁ ÓÔŇŐËÔŐŇÁ ÇĚÁ×?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "÷×ĹŇČ"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "îĎÄÁ `%s' ÎĹ ÉÍĹĹÔ ĐŐÎËÔÁ ÍĹÎŔ ÄĚŃ `%s', ČĎÔŃ ÎÁ ÎĹĹ ÓÓŮĚÁĹÔÓŃ ĐĎĚĹ Up"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "ÎÁ ÎĎÄŐ `%s' ĐĎŃ×ÉĚĎÓŘ %d ÓÓŮĚĎË"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "ÎÁ ÎĎÄŐ `%s' ÎĹÔ ÓÓŮĚĎË"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "őÄÁĚĹÎÉĹ %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ĆÁĘĚ `%s': %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "đŇÉĚĎÖĹÎÉĹ %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "÷ÎŐÔŇĹÎÎŃŃ ĎŰÉÂËÁ (search_sectioning) `%s'!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "÷ÎŐÔŇĹÎÎŃŃ ĎŰÉÂËÁ (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "ëĎÍÁÎÄÁ %c%s ŐÓÔÁŇĹĚÁ; ÉÓĐĎĚŘÚŐĘÔĹ ×ÍĹÓÔĎ ÎĹĹ %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "îĎÄÁ Ó %ctop × ËÁŢĹÓÔ×Ĺ ŇÁÚÄĹĚÁ ŐÖĹ ÓŐÝĹÓÔ×ŐĹÔ"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "úÄĹÓŘ ÎÁČĎÄÉÔÓŃ ÎĎÄÁ %ctop"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop ×ÓÔŇĹŢĹÎÁ ĐĹŇĹÄ %cnode, ĐĎ ŐÍĎĚŢÁÎÉŔ ÉÓĐĎĚŘÚŐĹÔÓŃ %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "óĎÄĹŇÖÁÎÉĹ"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "ëŇÁÔËĎĹ ÓĎÄĹŇÖÁÎÉĹ"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "ÎĹ×ĎÚÍĎÖÎĎ ĐŇĎŢÉÔÁÔŘ @image ĆÁĘĚ `%s': %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"ÉÓĐĎĚŘÚĎ×ÁÎÉĹ @headitem × ËÁŢĹÓÔ×Ĺ ĐĎÓĚĹÄÎĹÇĎ ÜĚĹÍĹÎÔÁ @multitable ×ŮÄÁĹÔ "
+"ÎĹËĎŇŇĹËÔÎŮĹ ÄĎËŐÍĹÎÔŮ Docbook"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: ĐŇĹÄŐĐŇĹÖÄĹÎÉĹ: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " ÄĚŃ %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\túÁĐŐÓÔÉÔĹ `%s --help' ÄĚŃ ĐĎĚŐŢĹÎÉŃ ĐĎĚÎĎÇĎ ÓĐÉÓËÁ ËĚŔŢĹĘ.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"éÓĐĎĚŘÚĎ×ÁÎÉĹ: %s [ëěŕţ]... [INFO-ćáęě [DIR-ćáęě]]\n"
+"\n"
+"őÓÔÁÎÁ×ĚÉ×ÁĹÔ ÉĚÉ ŐÄÁĚŃĹÔ ×ČĎÖÄĹÎÉŃ ËÁÔÁĚĎÇÁ ÄĚŃ INFO-ćáęěá ÉÚ\n"
+"ĆÁĘĚÁ-ËÁÔÁĚĎÇÁ Info DIR-ćáęě.\n"
+"\n"
+"ëĚŔŢÉ:\n"
+" --delete ŐÄÁĚÉÔŘ ÓŐÝĹÓÔ×ŐŔÝÉĹ ×ČĎÖÄĹÎÉŃ ÄĚŃ INFO-ćáęěá ÉÚ DIR-"
+"ćáęěá;\n"
+" ÎĹ ×ÓÔÁ×ĚŃÔŘ ÎĎ×ŮĹ ×ČĎÖÄĹÎÉŃ.\n"
+" --dir-file=éíń ÚÁÄÁĹÔ ÉÍŃ ËÁÔÁĚĎÇĹ Info,\n"
+" ÜË×É×ÁĚĹÎÔÎĎ ÉÓĐĎĚŘÚĎ×ÁÎÉŔ ÁŇÇŐÍĹÎÔÁ DIR-ćáęě.\n"
+" --entry=ôĺëóô ×ÓÔÁ×ÉÔŘ ôĺëóô × ËÁŢĹÓÔ×Ĺ ×ČĎÖÄĹÎÉŃ ËÁÔÁĚĎÇÁ Info.\n"
+" ôĹËÓÔ ÄĎĚÖĹÎ ÉÍĹÔŘ ĆĎŇÍŐ ĐŐÎËÔÁ ÍĹÎŔ ĐĚŔÓ (×ĎÚÍĎÖÎĎ)\n"
+" ÎĹÓËĎĚŘËĎ ÓÔŇĎË, ÎÁŢÉÎÁŔÝÉČÓŃ ĐŇĎÂĹĚŘÎŮÍÉ ÓÉÍ×ĎĚÁÍÉ. "
+"ĺÓĚÉ ×Ů\n"
+" ÚÁÄÁÄÉÔĹ ÎĹÓËĎĚŘËĎ ×ČĎÖÄĹÎÉĘ, ×ÓĹ ĎÎÉ ÂŐÄŐÔ ×ÓÔÁ×ĚĹÎŮ. "
+"ĺÓĚÉ\n"
+" ×Ů ÎĹ ÚÁÄÁÄÉÔĹ ×ČĎÖÄĹÎÉĘ, ÂŐÄĹÔ ×ÓÔÁ×ĚĹÎ ÔĹËÓÔ ÉÚ Info-"
+"ĆÁĘĚÁ.\n"
+" --help ĐĎËÁÚÁÔŘ ÜÔŐ ÓĐŇÁ×ËŐ É ×ŮĘÔÉ.\n"
+" --info-file=ćáęě ÚÁÄÁĹÔ ÉÍŃ ŐÓÔÁÎÁ×ĚÉ×ÁĹÍĎÇĎ Info-ĆÁĘĚÁ,\n"
+" ÜË×É×ÁĚĹÎÔÎĎ ÉÓĐĎĚŘÚĎ×ÁÎÉŔ ÁŇÇŐÍĹÎÔÁ INFO-ćáęě.\n"
+" --info-dir=éíń ÓÉÎĎÎÉÍ --dir-file=éíń/dir.\n"
+" --item=ôĺëóô ÓÉÎĎÎÉÍ --entry ôĺëóô.\n"
+" ÷ČĎÖÄĹÎÉĹ ËÁÔÁĚĎÇÁ Info ÎÁ ÓÁÍĎÍ ÄĹĚĹ Ń×ĚŃĹÔÓŃ ĐŐÎËÔĎÍ "
+"ÍĹÎŔ.\n"
+" --quiet ÎĹ ×Ů×ĎÄÉÔŘ ĐŇĹÄŐĐŇĹÖÄĹÎÉŃ.\n"
+" --remove ÓÉÎĎÎÉÍ --delete.\n"
+" --section=óĺë ĐĎÍĹÓÔÉÔŘ ×ČĎÖÄĹÎÉŃ × ÚÁÄÁÎÎŐŔ ÓĹËĂÉŔ ËÁÔÁĚĎÇÁ.\n"
+" ĺÓĚÉ ×Ů ÚÁÄÁÄÉÔĹ ÎĹÓËĎĚŘËĎ ÓĹËĂÉĘ, ×ČĎÖÄĹÎÉŃ ÂŐÄŐÔ "
+"×ÓÔÁ×ĚĹÎŮ ×\n"
+" ËÁÖÄŐŔ. ĺÓĚÉ ×Ů ÎĹ ÚÁÄÁÄÉÔĹ ÓĹËĂÉĘ, ×ČĎÖÄĹÎÉŃ ÂŐÄŐÔ "
+"×ÓÔÁ×ĚĹÎŮ\n"
+" × ÓĹËĂÉÉ, ÚÁÄÁÎÎŮĹ × Info-ĆÁĘĚĹ.\n"
+" --version ĐĎËÁÚÁÔŘ ÉÎĆĎŇÍÁĂÉŔ Ď ×ĹŇÓÉÉ É ×ŮĘÔÉ.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"üÔĎ ĆÁĘĚ .../info/dir, ÓĎÄĹŇÖÁÝÉĘ ËĎŇÎĹ×ŐŔ ÎĎÄŐ ÉĹŇÁŇČÉÉ Info,\n"
+"ÎÁÚŮ×ÁĹÍŐŔ (dir)Top. đŇÉ ×ŮÚĎ×Ĺ Info ×Ů ×ÉÄÉÔĹ ÜÔŐ ÎĎÄŐ.\n"
+"\n"
+"%s\tüÔĎ ËĎŇÎĹ×ÁŃ ÎĎÄÁ ÉĹŇÁŇČÉÉ Info\n"
+"\n"
+" úÄĹÓŘ (× ËÁÔÁĚĎÇĹ Info) ĐŇĹÄÓÔÁ×ĚĹÎĎ ÍĹÎŔ ĐĎ ĎÓÎĎ×ÎŮÍ ÔĹÍÁÍ.\n"
+" îÁÖÍÉÔĹ \"q\" ŢÔĎÂŮ ×ŮĘÔÉ, \"?\" ŢÔĎÂŮ ĐĎÓÍĎÔŇĹÔŘ ×ÓĹ ËĎÍÁÎÄŮ Info,\n"
+" \"d\" ŢÔĎÂŮ ×ĹŇÎŐÔŘÓŃ ÓŔÄÁ, \"h\" ŢÔĎÂŮ ĐŇĎŢÉÔÁÔŘ ŇŐËĎ×ĎÄÓÔ×Ď ÄĚŃ "
+"ÎĎ×ÉŢËĎ×,\n"
+" \"mEmacs<Return>\" ŢÔĎÂŮ ĐŇĎŢÉÔÁÔŘ ŇŐËĎ×ĎÄÓÔ×Ď ĐĎ Emacs.\n"
+"\n"
+" ÷ Emacs ×Ů ÍĎÖĹÔĹ ÎÁÖÁÔŘ ×ÔĎŇŐŔ ËÎĎĐËŐ ÍŮŰÉ ÎÁ ĐŐÎËÔĹ ÍĹÎŔ ÉĚÉ ÓÓŮĚËĹ,\n"
+" ŢÔĎÂŮ ĐĹŇĹĘÔÉ Ë ÎĹÍŐ.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: ÎĹ×ĎÚÍĎÖÎĎ ĐŇĎŢÉÔÁÔŘ (%s) É ÓĎÚÄÁÔŘ (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: ĐŐÓÔĎĘ ĆÁĘĚ"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY ÂĹÚ ÓĎĎÔ×ĹÔÓÔ×ŐŔÝĹÇĎ END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY ÂĹÚ ÓĎĎÔ×ĹÔÓÔ×ŐŔÝĹÇĎ START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: ŐÖĹ ÓŐÝĹÓÔ×ŐĹÔ ĆÁĘĚ dir: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: íĎÖÎĎ ÚÁÄÁÔŘ ÔĎĚŘËĎ ĎÄÉÎ Info-ĆÁĘĚ.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "ÉÚĚÉŰÎÉĘ ÁŇÇŐÍĹÎÔ `%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+"îĹ ÚÁÄÁÎ ×ČĎÄÎĎĘ ĆÁĘĚ.\n"
+"đĎĐŇĎÂŐĘÔĹ `%s --help' ÄĚŃ ĐĎĚŐŢĹÎÉŃ ÂĎĚĹĹ ĐĎÄŇĎÂÎĎÇĎ ĎĐÉÓÁÎÉŃ."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+"îĹ ÚÁÄÁÎ ĆÁĘĚ ËÁÔÁĚĎÇÁ.\n"
+"đĎĐŇĎÂŐĘÔĹ `%s --help' ÄĚŃ ĐĎĚŐŢĹÎÉŃ ÂĎĚĹĹ ĐĎÄŇĎÂÎĎÇĎ ĎĐÉÓÁÎÉŃ."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "× `%s' ÎĹÔ ×ČĎÖÄĹÎÉŃ ÄĚŃ ËÁÔÁĚĎÇÁ Info"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "ĐŐÎËÔ ÍĹÎŔ `%s' ŐÖĹ ÓŐÝĹÓÔ×ŐĹÔ, ÄĚŃ ĆÁĘĚÁ `%s'"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "ÎĹ ÎÁĘÄĹÎĎ ×ČĎÖÄĹÎÉĘ ÄĚŃ `%s'; ÎÉŢĹÇĎ ÎĹ ŐÄÁĚĹÎĎ"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "ĐĎËÁÚÁÔŘ ÜÔŐ ÓĐŇÁ×ËŐ É ×ŮĘÔÉ"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "ÓĎČŇÁÎŃÔŘ ×ŇĹÍĹÎÎŮĹ ĆÁĘĚŮ ĐĎÓĚĹ ŇÁÂĎÔŮ"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "ÎĹ ÓĎČŇÁÎŃÔŘ ×ŇĹÍĹÎÎŮĹ ĆÁĘĚŮ (ĐĎ ŐÍĎĚŢÁÎÉŔ)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "ÚÁĐÉÓÁÔŘ ×Ů×ĎÄ × ćáęě"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "ĐĎËÁÚÁÔŘ ÉÎĆĎŇÍÁĂÉŔ Ď ×ĹŇÓÉÉ É ×ŮĘÔÉ"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "éÓĐĎĚŘÚĎ×ÁÎÉĹ: %s [ëěŕţ]... ćáęě...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr ""
+"óĎÚÄÁĹÔ ÓĎŇÔÉŇĎ×ÁÎÎŮĘ ÁĚĆÁ×ÉÔÎŮĘ ŐËÁÚÁÔĹĚŘ ÄĚŃ\n"
+"ËÁÖÄĎÇĎ ×ŮČĎÄÎĎÇĎ TeX-ĆÁĘĚÁ.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "ćáęě... ÄĚŃ ÄĎËŐÍĹÎÔÁ `foo.texi' ĎÂŮŢÎĎ ÚÁÄÁĹÔÓŃ ËÁË `foo.%c%c'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"ëĚŔŢÉ:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: ÎĹ texinfo-ĆÁĘĚ Ó ÁĚĆÁ×ÉÔÎŮÍ ŐËÁÚÁÔĹĚĹÍ"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "ĎŰÉÂËÁ ĐĎ×ÔĎŇÎĎÇĎ ĎÔËŇŮÔÉŃ %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "÷ %s ÎĹÔ ÎĎÍĹŇÁ ÓÔŇÁÎÉĂŮ"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "ÚÁ ×ČĎÖÄĹÎÉĹÍ %s ÓĚĹÄŐĹÔ ×ČĎÖÄĹÎÉĹ Ó ×ÔĎŇÉŢÎŮÍ ÉÍĹÎĹÍ"
diff --git a/Build/source/utils/texinfo/po/stamp-po b/Build/source/utils/texinfo/po/stamp-po
new file mode 100644
index 00000000000..9788f70238c
--- /dev/null
+++ b/Build/source/utils/texinfo/po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/Build/source/utils/texinfo/po/sv.gmo b/Build/source/utils/texinfo/po/sv.gmo
new file mode 100644
index 00000000000..ab3833a478c
--- /dev/null
+++ b/Build/source/utils/texinfo/po/sv.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/sv.po b/Build/source/utils/texinfo/po/sv.po
new file mode 100644
index 00000000000..ad89cd65aca
--- /dev/null
+++ b/Build/source/utils/texinfo/po/sv.po
@@ -0,0 +1,3369 @@
+# Swedish messages for texinfo.
+# Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+# Christian Rose <menthos@menthos.com>, 2001, 2002, 2003, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.7.91\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-12 22:41+0100\n"
+"Last-Translator: Christian Rose <menthos@menthos.com>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Gĺ ett tecken framĺt"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Gĺ ett tecken bakĺt"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Gĺ till början pĺ raden"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Gĺ till slutet pĺ raden"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Gĺ ett ord framĺt"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Gĺ ett ord bakĺt"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Ta bort tecknet under markören"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Ta bort tecknet bakom markören"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Avbryt eller avsluta operation"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Acceptera (eller tvinga komplettering av) denna rad"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Infoga nästa tecken ordagrant"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Infoga detta tecken"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Infoga ett TABULATOR-tecken"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Transponera tecken vid punkt"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Ryck tillbaka innehĺllet i det senaste dödandet"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Dödsringen är tom"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Ryck tillbaka ett tidigare dödande"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Döda till slutet pĺ raden"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Döda till början pĺ raden"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Döda ordet efter markören"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Döda ordet före markören"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Inga kompletteringar"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Inte fullständig"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Visa möjliga kompletteringar"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Enda komplettering"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "En komplettering:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d kompletteringar:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Infoga komplettering"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Bygger kompletteringar..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Rulla kompletteringsfönstret"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Fotnoter kunde inte visas"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Visa fotnoterna som är associerade med denna nod i ett annat fönster"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- Fotnoter -----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Slĺ upp en sträng i indexet för denna fil"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "Söker indexposter..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Inga index hittades."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Indexpost: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Gĺ till nästa matchande indexpost frĺn det senaste \"\\[index-search]\"-"
+"kommandot"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Det finns ingen tidigare indexsöksträng."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Inga indexposter."
+
+# This is broken
+#
+# info_error (_("No %sindex entries containing \"%s\"."),
+# index_offset > 0 ? _("more ") : "", index_search);
+#
+# Please don't use this type of construct, use two complete sentences
+# instead and an outer if statement.
+#
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "Inga %sindexposter som innehĺller \"%s\"."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "fler "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "KAN INTE SE DETTA"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "Hittade \"%s\" i %s. (\"\\[next-index-match]\" försöker hitta nästa)."
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "Genomsöker index av \"%s\"..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Inga tillgängliga infofiler har \"%s\" i deras index."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "Gräv i alla kända infofilers index efter en sträng och bygg en meny"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Index-apropos: "
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Meny: Noder vars index innehĺller \"%s\":\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Prova --help för mer information.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Det finns INGEN garanti. Du kan vidaredistribuera denna programvara\n"
+"under villkoren i GNU General Public License.\n"
+"Se filen COPYING för mer information om detta.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "inga indexposter för \"%s\" hittades\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr " -b, --speech-friendly var vänlig mot talsyntesprogram.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Användning: %s [FLAGGA]... [MENYPOST...]\n"
+"\n"
+"Läs dokumentation i Info-format.\n"
+"\n"
+"Flaggor:\n"
+" --apropos=STRÄNG slĺ upp STRÄNG i alla index i alla manualer.\n"
+" -d, --directory=KATALOG lägg till KATALOG till INFOPATH.\n"
+" --dribble=FILNAMN kom ihĺg användarens tangentnedtryckningar i\n"
+" FILNAMN.\n"
+" -f, --file=FILNAMN ange den Info-fil som ska besökas.\n"
+" -h, --help visa denna hjälptext och avsluta.\n"
+" --index-search=STRÄNG gĺ till noden som utpekas av indexpost\n"
+" STRÄNG.\n"
+" -n, --node=NODNAMN ange noder i den först besökta Info-filen.\n"
+" -o, --output=FILNAMN skriv ut valda noder till FILNAMN.\n"
+" -R, --raw-escapes skriv ut \"rĺa\" ANSI-styrkoder (standard).\n"
+" --no-raw-escapes skriv ut styrkoder som text.\n"
+" --restore=FILNAMN läs initiala tangentnedtryckningar frĺn\n"
+" FILNAMN.\n"
+" -O, --show-options, --usage gĺ till noden för kommandoradsflaggor.\n"
+"%s --subnodes skriv ut menyposter rekursivt.\n"
+" -w, --where, --location skriv ut den fysiska platsen för Info-filen.\n"
+" --vi-keys använd vi- och less-liknande\n"
+" snabbtangenter.\n"
+" --version visa versionsinformation och avsluta.\n"
+"\n"
+"Det första argumentet som inte är en flagga är, om det finns, menyposten\n"
+"att börja frĺn. Det söks efter i alla \"dir\"-filer i INFOPATH.\n"
+"Om den inte finns slĺr info samman alla \"dir\"-filer och visar resultatet.\n"
+"Alla ĺterstĺende argument betraktas som namnen pĺ menyposter relativa till\n"
+"den först besökta noden.\n"
+"\n"
+"Exampel:\n"
+" info visa översta katalogmenyn\n"
+" info emacs börja pĺ emacs-noden frĺn översta katalogen\n"
+" info emacs buffers börja pĺ buffertnoden inom emacs-manualen\n"
+" info --show-options emacs börja pĺ noden med emacs kommandoradsflaggor\n"
+" info -f ./foo.info visa filen ./foo.info, sök inte i katalogen\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Skicka felrapporter till bug-texinfo@gnu.org,\n"
+"allmänna frĺgor och diskussion till help-texinfo@gnu.org\n"
+"och synpunkter pĺ översättningen till sv@li.org.\n"
+"Hemsida för texinfo: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Kan inte hitta noden \"%s\"."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Kan inte hitta noden \"(%s)%s\"."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Kan inte hitta ett fönster!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Punkten finns inte inom detta fönsters nod!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Kan inte ta bort det sista fönstret."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Ingen meny i denna nod."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Inga fotnoter i denna nod."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Inga korsreferenser i denna nod."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Ingen \"%s\"-pekare för denna nod."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Okänt Info-kommando \"%c\". Prova \"?\" för hjälp."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "Terminaltypen \"%s\" är inte tillräckligt smart för att köra Info."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Du är redan pĺ sista sidan för denna nod."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Du är redan pĺ första sidan för denna nod."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Endast ett fönster."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Resulterande fönstret skulle bli för litet."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ""
+"Inte tillräckligt med utrymme för ett hjälpfönster, ta bort ett fönster."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Grundläggande kommandon i Info-fönster\n"
+"**************************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] Avsluta denna hjälp.\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Avsluta Info helt.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Starta Info-handboken.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Välja andra noder:\n"
+"------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Gĺ till nästa nod frĺn denna nod.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Gĺ till föregĺende nod frĺn denna nod.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Gĺ upp frĺn denna nod.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Välj den menypost som anges med namn.\n"
+" Att välja en menypost gör att en annan nod väljs.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Följ en korsreferens. Läser namnet pĺ en referens.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "\\%-10[history-node] Gĺ till den sista noden i detta fönster.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Hoppa till nästa hypertextlänk i denna nod.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+"\\%-10[move-to-prev-xref] Hoppa till nästa hypertextlänk i denna nod.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Följ hypertextlänken under markören.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] Gĺ till \"directory\"-noden. Likvärdigt med \"g (DIR)\".\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] Gĺ till den översta noden. Likvärdigt med \"g Top\".\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Förflyttning inom en nod:\n"
+"-------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Gĺ till början pĺ denna nod.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Gĺ till slutet pĺ denna nod.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Rulla en rad framĺt.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Rulla en rad bakĺt.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Rulla en sida framĺt.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Rulla en sida bakĺt.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Andra kommandon:\n"
+"----------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] Välj första ... nionde objektet i nodens meny.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Välj det sista objektet i nodens meny.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Sök efter en angiven sträng i indexposterna i denna\n"
+" Info-fil, och välj noden som refereras av den första posten\n"
+" som hittas.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Gĺ till den nod som anges.\n"
+" Du kan även inkludera ett filnamn, som exempelvis\n"
+" (FILNAMN)NODNAMN.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Sök framĺt efter en angiven sträng\n"
+" och välj den nod i vilken nästa förekomst hittas.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Sök bakĺt efter en angiven sträng\n"
+" och välj den nod i vilken nästa förekomst hittas.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Avsluta denna hjälp.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Avsluta Info helt.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Starta Info-handboken.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Gĺ till nästa nod frĺn denna nod.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Gĺ till föregĺende nod frĺn denna nod.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Gĺ upp frĺn denna nod.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Välj angiven menypost.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " Att välja en menypost gör att en annan nod väljs.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Följ en korsreferens. Läser namnet pĺ en referens.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Gĺ till den sista noden i detta fönster.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Hoppa till nästa hypertextlänk i denna nod.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Följ hypertextlänken under markören.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s Gĺ till \"directory\"-noden. Likvärdigt med \"g (DIR)\".\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Gĺ till den översta noden. Likvärdigt med \"g Top\".\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Rulla en sida framĺt.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Rulla en sida bakĺt.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Gĺ till början pĺ denna nod.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Gĺ till slutet pĺ denna nod.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Rulla en rad framĺt.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Rulla en rad bakĺt.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Välj första ... nionde objektet i nodens meny.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Välj det sista objektet i nodens meny.\n"
+
+# This is broken
+#
+# N_(" %-10s Search for a specified string in the index entries of this Info\n"),
+# N_(" file, and select the node referenced by the first entry found.\n"),
+#
+# Please don't split a single sentence like this in multiple messages,
+# use one single message instead. Sentences have to be kept together when
+# translating, you can't split a sentence into parts and mark them for
+# separate translation and expect it to work with word ordering,
+# grammar, and everything else in other languages. Splitting sentences
+# just makes it harder for translators when having not just to translate,
+# but also puzzle the pieces of the sentence together again so that it
+# makes some sense, in order to be able to translate in the first place.
+#
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s Sök efter en angiven sträng i indexposterna i denna\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" Info-fil, och välj noden som refereras av den första posten\n"
+" som hittas.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s Gĺ till den nod som anges.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" Du kan även inkludera ett filnamn, som exempelvis\n"
+" (FILNAMN)NODNAMN.\n"
+
+# This is broken
+#
+# N_(" %-10s Search forward through this Info file for a specified string,\n"),
+# N_(" and select the node in which the next occurrence is found.\n"),
+#
+# Please don't split a single sentence like this in multiple messages,
+# use one single message instead. Sentences have to be kept together when
+# translating, you can't split a sentence into parts and mark them for
+# separate translation and expect it to work with word ordering,
+# grammar, and everything else in other languages. Splitting sentences
+# just makes it harder for translators when having not just to translate,
+# but also puzzle the pieces of the sentence together again so that it
+# makes some sense, in order to be able to translate in the first place.
+#
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Sök framĺt efter en angiven sträng,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " och välj den nod i vilken nästa förekomst hittas.\n"
+
+# This is broken
+#
+# N_(" %-10s Search backward in this Info file for a specified string,\n"),
+# N_(" and select the node in which the next occurrence is found.\n"),
+#
+# Please don't split a single sentence like this in multiple messages,
+# use one single message instead. Sentences have to be kept together when
+# translating, you can't split a sentence into parts and mark them for
+# separate translation and expect it to work with word ordering,
+# grammar, and everything else in other languages. Splitting sentences
+# just makes it harder for translators when having not just to translate,
+# but also puzzle the pieces of the sentence together again so that it
+# makes some sense, in order to be able to translate in the first place.
+#
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Sök bakĺt efter en angiven sträng,\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Den aktuella sökvägen är:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Kommandon som är tillgängliga i Info-fönster:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Kommandon som är tillgängliga i echo-omrĺdet:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Följande kommandon kan endast startas via %s:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"Följande kommandon kan inte startas alls:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Använd \"\\[history-node]\" eller \"\\[kill-node]\" för att avsluta ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Visa hjälpmeddelande"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Besök Info-noden \"(info)Help\""
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "Visa dokumentationen för NYCKEL"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Beskriv nyckel: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s är odefinierad."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s är odefinierad."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s är definierad till %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Visa vad som ska anges för att köra ett angivet kommando"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Var är kommando: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "\"%s\" finns inte pĺ nĺgra tangenter"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s kan endast startas via %s."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s kan startas via %s."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "Det finns ingen funktion med namnet \"%s\""
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright Š %s Free Software Foundation, Inc.\n"
+"Det finns INGEN garanti. Du kan vidaredistribuera denna programvara\n"
+"under villkoren i GNU General Public License.\n"
+"Se filen COPYING för mer information om detta.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "felaktigt antal argument"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "kan inte öppna indatafilen \"%s\""
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "kan inte skapa utdatafilen \"%s\""
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "fel vid skrivning till \"%s\""
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "fel vid stängning av utdatafilen \"%s\""
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "nyckelsekvensen är för lĺng"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "nyckelsekvens saknas"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL-tecknet (\\000) är inte tillĺtet"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL-tecknet (^%c) är inte tillĺtet"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "ĺtgärdsnamn saknas"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "avsnittet är för lĺngt"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "okänd ĺtgärd \"%s\""
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "ĺtgärdsnamnet är för lĺngt"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "extra tecken följer pĺ ĺtgärden \"%s\""
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "variabelnamn saknas"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "\"=\" saknas direkt efter variabelnamnet"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "variabelnamnet är för lĺngt"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "värdet är för lĺngt"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", rad %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Användning: %s [FLAGGA]... [INDATAFIL]\n"
+"\n"
+"Kompilera infonyckelkällfil till infonyckelfil. Läser INDATAFIL (som\n"
+"standard $HOME/.infokey) och skriver (som standard) den kompilerade\n"
+"nyckelfilen till $HOME/.info.\n"
+"\n"
+"Flaggor:\n"
+" --output FIL generera till FIL istället för $HOME/.info\n"
+" --help visa denna hjälptext och avsluta.\n"
+" --version visa versionsinformation och avsluta.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Ignorerar ogiltig infonyckelfil \"%s\" - för liten"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Ignorerar ogiltig infonyckelfil \"%s\" - för stor"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "Fel vid läsning av infonyckelfilen \"%s\" - kort läsning"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Ogiltig infonyckelfil \"%s\" (felaktiga magiska nummer) -- kör infokey för\n"
+"att uppdatera den"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+"Din infonyckelfil \"%s\" är för gammal -- kör infokey för att uppdatera den"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Ogiltig infonyckelfil \"%s\" (felaktig asvnittslängd) -- kör infokey för\n"
+"att uppdatera den"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"ogiltig infonyckelfil \"%s\" (felaktig avsnittskod) -- kör infokey för att\n"
+"uppdatera den"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Felaktig data i infonyckelfil -- en del bindningar ignorerades"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "Felaktig data i infonyckelfil -- en del inställningar ignorerades"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Läs namnet pĺ ett Info-kommando och beskriv det"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Beskriv kommando: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Läs ett kommandonamn i echo-omrĺdet och kör det"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Kan inte köra ett \"echo-area\"-kommando här."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "Odefinierat kommando: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Ställ in höjden pĺ det visade fönstret"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Ställ in skärmhöjden till (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Källkodsfiler som grävdes igenom för att göra att denna fil inkluderar:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Kunde inte manipulera filen %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Meny:\n"
+" (Fil)Nod Rader Storl. Innehĺllande fil\n"
+" -------- ----- ------ ----------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Här är menyn med de noder som du har besökt nyligen.\n"
+"Välj en frĺn denna meny eller använd\"\\[history-node]\" i ett annat "
+"fönster.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+"Skapa ett fönster som innehĺller en meny med alla nyligen besökta noder"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Välj en nod som har besökts nyligen i ett synligt fönster"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Välj besökt nod: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referensen försvann! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Välkommen till Info version %s. Skriv in \\[get-help-window] för hjälp, "
+"\\[menu-item] för menypost."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Gĺ ned till nästa rad"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Gĺ upp till föregĺende rad"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Gĺ till slutet pĺ raden"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Gĺ till början pĺ raden"
+
+# src/menus.c:332
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Nästa"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Följer nästa-nod..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Väljer första menyposten..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Väljer nästa nod..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Gĺr upp %d gĺng(er), sedan Nästa."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Inga fler noder i detta dokument."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Ingen \"Föreg\" för denna nod."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Gĺ till föregĺende i detta fönster."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Inget \"Prev\" eller \"Up\" för denna nod inom detta dokument."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Gĺr upp i detta fönster."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "Gĺ till \"Föreg\"s senaste menypost."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Gĺ framĺt eller nedĺt i nodstrukturen"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Gĺ bakĺt eller upp i nodstrukturen"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Rulla framĺt i detta fönster"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "Rulla framĺt i detta fönster och ställ in standardfönsterstorleken"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Rulla framĺt i detta fönster och stanna inom noden"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Rulla framĺt i detta fönster och stanna inom noden och ställ in "
+"standardfönsterstorleken"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Rulla bakĺt i detta fönster"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "Rulla bakĺt i detta fönster och ställ in standardfönsterstorleken"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Rulla bakĺt i detta fönster och stanna inom noden"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+"Rulla bakĺt i detta fönster och stanna inom noden och ställ in "
+"standardfönsterstorleken"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Gĺ till början pĺ denna nod"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Gĺ till slutet pĺ denna nod"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Rulla nedĺt radvis"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Rulla uppĺt radvis"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Rulla nedĺt med halva skärmstorleken"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Rulla uppĺt med halva skärmstorleken"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Välj nästa fönster"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Välj föregĺende fönster"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Dela aktuellt fönster"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Ta bort aktuellt fönster"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Kan inte ta bort ett permanent fönster"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Ta bort alla andra fönster"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Rulla det andra fönstret"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Rulla det andra fönstret bakĺt"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Väx (eller krymp) detta fönster"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Dela det tillgängliga skärmutrymmet mellan de synliga fönstren"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Växla tillstĺndet för radbrytning i det aktuella fönstret"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Välj nästa nod"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Välj föregĺende nod"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Välj uppnoden"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Välj den sista noden i denna fil"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Detta fönster har inga ytterligare noder"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Välj den första noden i denna fil"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Välj det sista objektet i denna nods meny"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Välj denna menypost"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Det finns inte %d poster i denna meny."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menypost (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menypost: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Följ xref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Följ xref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Läs en menypost och välj dess nod"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Läs en fotnot eller korsreferens och välj dess nod"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Gĺ till början pĺ denna nods meny"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Besök sĺ mĺnga menyposter som möjligt samtidigt"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Läs ett nodnamn och välj det"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Gĺ till nod: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Ingen meny i noden \"%s\"."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "Ingen menypost \"%s\" i noden \"%s\"."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Kan inte hitta noden som refereras av \"%s\" i \"%s\"."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Läs en lista med menyer som börjar med katalog, och följ dem"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Följ menyer: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Hitta den nod som beskriver start av programmet"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Hitta programstartnod för [%s]: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Läs en referens till manualsida och välj den"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Hämta manualsida: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Välj noden \"Top\" i denna fil"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "Välj noden \"(dir)\""
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Döda noden (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Kan inte döda noden \"%s\""
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Kan inte döda den sista noden"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "Välj den senast valda noden"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Döda denna nod"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Läs namnet pĺ en fil och välj den"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Sök fil: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Kan inte hitta \"%s\"."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Kunde inte skapa utdatafilen \"%s\"."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Färdig."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "Skriver noden %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Skicka innehĺllet i denna nod i rör till INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Kan inte öppna rör till \"%s\"."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "Skriver ut noden %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "Söker i underfilen %s..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Läs en sträng och sök efter den skiftlägeskänsligt"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Läs en sträng och sök efter den"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Läs en sträng och sök baklänges efter den"
+
+# This is broken
+#
+# sprintf (prompt, _("%s%sfor string [%s]: "),
+# direction < 0 ? _("Search backward") : _("Search"),
+# case_sensitive ? _(" case-sensitively ") : _(" "),
+# search_string);
+#
+# Never split a sentence like this, use multiple complete messages instead.
+# If you split a sentence like this, you actually mark them for seperate
+# translation, but they shouldn't be translated seperately, since they
+# belong to the same sentence! All grammar/wording/sentence rules affect
+# how the words interact in the sentence, and you cannot take them out of
+# their sentence context and expect the same grammar to be valid. If you do,
+# you assume things about languages that are hardly true for any language
+# but the original one.
+# Make this several, complete messages, and move the logic out of the
+# messages themselves. Yes, this will result in many more messages, but
+# those will be translatable, while the current design isn't.
+#
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%sefter stängen [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Sök baklänges"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Sök"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " skiljandes pĺ VERSALER/gemener "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Sökningen misslyckades."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Upprepa den senaste sökningen i samma riktning"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Ingen tidigare söksträng"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Upprepa den senaste sökningen i omvänd riktning"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Sök interaktivt efter en sträng allteftersom du skriver den"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-sök baklänges: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-sök: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Misslyckas "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Gĺ till föregĺende korsreferens"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Gĺ till nästa korsreferens"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Välj referens eller menypost som finns pĺ denna rad"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Avbryt aktuell ĺtgärd"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Avsluta"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Flytta markören till en specifik rad i fönstret"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Rita om displayen"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Avsluta användandet av Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Kör kommando som är knutet till denna tangents gemena variant"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Okänt kommando (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" är ogiltigt"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" är ogiltigt"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Lägg till denna siffra till det aktuella numeriska argumentet"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Börja (eller multiplicera med 4) det numeriska argumentet"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Används internt av \\[universal-argument]"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: Slut pĺ virtuellt minne!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "När detta är \"On\" visas och försvinner fotnoter automatiskt"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"När detta är \"On\" ändrar skapande eller borttagande av ett fönster\n"
+"storleken pĺ andra fönster"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr ""
+"När detta är \"On\" blinkar skärmen till istället för att klockan ringer"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "När detta är \"On\" gör fel att klockan ringer"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "När detta är \"On\" skräpsamlar Info filer som behövde packas upp"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "När detta är \"On\" markeras delen av den matchade söksträngen"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Styr vad som händer dĺ rullning begärs i slutet pĺ en nod"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Antalet rader att rulla dĺ markören flyttas utanför fönstret"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "När detta är \"On\" accepterar och visar Info ISO Latin-tecken"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Förklara användandet av en variabel"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Beskriv variabel: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Ställ in värdet pĺ en Info-variabel"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Ställ in variabel: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "Ställ in %s till värdet (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "Ställ in %s till värdet (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** För gamla taggar ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), rader ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d rader --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d rader --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Underfil: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: flaggan \"%s\" är flertydig\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: flaggan \"--%s\" tillĺter inget argument\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: flaggan \"%c%s\" tillĺter inget argument\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: flaggan \"%s\" kräver ett argument\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: okänd flagga \"--%s\"\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: okänd flagga \"%c%s\"\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: otillĺten flagga -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ogiltig flagga -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: flaggan kräver ett argument -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: flaggan \"-W %s\" är flertydig\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: flaggan \"-W %s\" tillĺter inget argument\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "argument till @%s ignorerades"
+
+# This is broken
+#
+# The translator should not need to translate this - it is all present
+# in libc and can be used with nl_langinfo(), strftime() and friends.
+#
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "januari"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "februari"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "mars"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "april"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "maj"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "juni"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "juli"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "augusti"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "september"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "oktober"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "november"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "december"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "osannolikt tecken %c i @var"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr ""
+"@sc-argumentet är enbart med stora bokstäver, därför har det ingen effekt"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "\"{\" förväntades, men sĺg \"%c\""
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "filslut inuti verb-block"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "\"}\" förväntades, men sĺg \"%c\""
+
+# Är det kombinationen "@strong{Note:.." eller bara @strong{} rent allmänt som
+# orsakar problem?
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Obs...} skapar en falsk korsreferens i Info; formulera om för att "
+"undvika detta"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s är förĺldrat"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp kräver ett positivt numeriskt argument, inte \"%s\""
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "Felaktigt argument till %c%s"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "oförändrad"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "ingen"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "Felaktigt argument till @%s"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "infoga"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "\"}\" saknas i @def-argumentet"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Funktion"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Specialform"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Variabel"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Användarflagga"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Instansvariabel"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Metod"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "av"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "pĺ"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "Mĺste vara i \"@%s\"-omgivning för att använda \"@%s\""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "\"%s\" utelämnades innan utdatafilnamnet"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "\"%s\" utelämnades efter skrivning till standard ut"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Utdatabufferten är inte tom."
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "\"%c%s\" behöver ett argument \"{...}\", inte bara \"%s\""
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Ingen avslutande klammer för fotnoten \"%s\""
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Fotnoten definierad utan föräldernod"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Fotnoter inuti fotnoter är inte tillĺtet"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Fotnoter"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: kunde inte öppna --css-fil: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: --css-fil slutade med kommentar"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Namnlös"
+
+# to pop?
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "[oväntat] ingen html-tagg att poppa"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[oväntat] ogiltigt nodnamn: \"%s\""
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Okänt index \"%s\""
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info kan inte hantera \":\" i indexposten \"%s\""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Indexet \"%s\" finns redan"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Okänt index \"%s\" och/eller \"%s\" i @synindex"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(rad )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(rad %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "Okänt index \"%s\" i @printindex"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "Posten för index \"%s\" är utanför alla noder"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(utanför alla noder)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Se "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item är inte tillĺtet i argument till @itemize"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "Felaktig typ i insertion_type_pname"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Uppräkningsstacken har flödat över"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "bokstaveringen har flödat över, startar om vid %c"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s kräver ett argument: formateraren för %citem"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "%cfloat-omgivningar kan inte nästlas"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "\"@end\" förväntade \"%s\", men sĺg \"%s\""
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Inget matchande \"%cend %s\""
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s kräver bokstav eller siffra"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "filslut inuti bokstavligt block"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s är inte meningsfullt utanför \"@float\"-omgivning"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu sĺgs innan första @node, skapar \"Top\"-nod"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "din @top-nod ska kanske packas i @ifnottex istället för @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu sĺgs innan första noden, skapar \"Top\"-nod"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+"@%s är inte meningsfullt utanför \"@titlepage\"- och \"@quotation\"-omgivning"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s är inte meningsfullt utanför \"@titlepage\"-omgivning"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Ensamt \"%c%s\""
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "\"%c%s\" kräver nĺgonting efter sig"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Felaktigt argument \"%s\" till \"@%s\", använder \"%s\""
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s är inte meningsfullt inuti \"@%s\"-block"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "@itemx är inte meningsfullt inuti \"%s\"-block"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s hittades utanför ett insättningsblock"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s är inte en giltig landskod enligt ISO 639"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "okänt kodningsnamn \"%s\""
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "tyvärr, kodningen \"%s\" stöds inte"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "ogiltigt kodat tecken \"%s\""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s förväntar \"i\" eller \"j\" som argument, inte \"%c\""
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s förväntar ett ensamt tecken \"i\" eller \"j\" som argument"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makrot \"%s\" är redan definierat"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "här är den tidigare definitionen av \"%s\""
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "\\ i makroutökning följdes av \"%s\" istället för parameternamn"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makrot \"%s\" anropades pĺ rad %d med för mĺnga argument"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "Makrot %cend hittades inte"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg är endast användbart för makron med ett argument"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@end %s och @%s passar inte"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "För mĺnga fel! Gav upp.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: varning: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Felplacerat %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Prova \"%s --help\" för mer information.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Användning: %s [FLAGGA]... TEXINFO-FIL...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Översätt Texinfo-källdokumentation till diverse andra format, som standard\n"
+"infofiler som är lämpliga för läsning med Emacs eller GNU Info.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Allmänna flaggor:\n"
+" --error-limit=ANTAL avsluta efter ANTAL fel (standardvärde %d).\n"
+" --force bevara utdata även om fel.\n"
+" --help visa denna hjälptext och avsluta.\n"
+" --no-validate undertryck korsreferensvalidering av noder.\n"
+" --no-warn undertryck varningar (men inte fel).\n"
+" --reference-limit=ANTAL varna vid som mest ANTAL referenser\n"
+" (standardvärde %d).\n"
+" -v, --verbose förklara vad som görs.\n"
+" --version visa versionsinformation och avsluta.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Val av utdataformat (standard är att producera Info):\n"
+" --docbook generera Docbook XML istället för Info.\n"
+" --html generera HTML istället för Info.\n"
+" --xml generera Texinfo XML istället för Info.\n"
+" --plaintext generera vanlig text istället för Info.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Allmänna utdataflaggor:\n"
+" -E, --macro-expand FIL generera makroexpanderad källkod till FIL,\n"
+" ignorera alla @setfilename.\n"
+" --no-headers undertryck nodseparatorer, Node:-rader och\n"
+" menyer frĺn Info-utdata (och skapa därigenom\n"
+" vanlig text) eller frĺn HTML (och producera\n"
+" därigenom kortare utdata). Skriv även till\n"
+" standard ut som standard.\n"
+" --no-split undertryck delning av Info eller HTML-utdata,\n"
+" generera endast en utdatafil.\n"
+" --number-sections generera kapitel- och avsnittsnummer.\n"
+" -o, --output=FIL generera till FIL (katalog om delad HTML),\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Flaggor för Info och vanlig text:\n"
+" --enable-encoding generera tecken med accent och specialtecken\n"
+" i Info-utdata baserat pĺ @documentencoding.\n"
+" --fill-column=ANTAL radbryt Info-rader vid ANTAL tecken\n"
+" (standardvärde %d).\n"
+" --footnote-style=STIL generera fotnoter i Info som följer STIL:\n"
+" \"separate\" för att placera fotnoter i sin\n"
+" egen nod,\n"
+" \"end\" för att placera fotnoter i slutet\n"
+" av den nod där de är definierade\n"
+" (standardalternativ).\n"
+" --paragraph-indent=VÄRDE gör indrag i Info-stycken med VÄRDE\n"
+" blanksteg (standardvärde %d).\n"
+" Om VÄRDE är \"none\" görs inga indrag; om\n"
+" VÄRDE är \"asis\" bevaras befintliga\n"
+" indrag.\n"
+" --split-size=ANTAL dela upp Info-filer vid storleken ANTAL\n"
+" (standardvärde %d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"Flaggor för HTML:\n"
+" --css-include=FIL inkludera FIL i HTML <style>-utdata;\n"
+" läs standard in om FIL är -.\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"Flaggor för XML och Docbook:\n"
+" --output-indent=VÄRDE dra in XML-element med VÄRDE blanksteg\n"
+" (standard %d). Om VÄRDE är 0 kastas\n"
+" mellanrum som kan ignoreras.\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Flaggor för indatafil:\n"
+" --commands-in-node-names tillĺt @-kommandon i nodnamn.\n"
+" -D VARIABEL definiera variabeln VARIABEL, som med "
+"@set.\n"
+" -I KATALOG lägg till KATALOG till @include-sökvägen.\n"
+" -P KATALOG lägg till KATALOG först i @include-"
+"sökvägen.\n"
+" -U VARIABEL odefiniera variabeln VARIABEL, som med "
+"@clear.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Villkorlig behandling i indata:\n"
+" --ifdocbook behandla @ifdocbook och @docbook även om inte\n"
+" Docbook genereras.\n"
+" --ifhtml behandla @ifhtml och @html även om inte HTML genereras.\n"
+" --ifinfo behandla @ifinfo-text även om inte Info genereras.\n"
+" --ifplaintext behandla @ifplaintext även om inte vanlig text\n"
+" genereras.\n"
+" --iftex behandla @iftex och @tex-text; medför --no-split.\n"
+" --ifxml behandla @ifxml och @xml.\n"
+" --no-ifdocbook behandla inte @ifdocbook- och @docbook-text.\n"
+" --no-ifhtml behandla inte @ifhtml- och @html-text.\n"
+" --no-ifinfo behandla inte @ifinfo-text.\n"
+" --no-ifplaintext behandla inte @ifplaintext-text.\n"
+" --no-iftex behandla inte @iftex- och @tex-text.\n"
+" --no-ifxml behandla inte @ifxml- och @xml-text.\n"
+"\n"
+" Dessutom, för flaggorna --no-ifFORMAT, behandla @ifnotFORMAT-text.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" Standardvärdena för @if...-villkoren beror pĺ utdataformatet:\n"
+" om HTML genereras är --ifhtml pĺ och de andra av;\n"
+" om Info genereras är --ifinfo pĺ och de andra av;\n"
+" om vanlig text genereras är --ifplaintext pĺ och de andra av;\n"
+" om XML genereras är --ifxml pĺ och de andra av.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Exempel:\n"
+" makeinfo apa.texi skriv Info till apas @setfilename\n"
+" makeinfo --html apa.texi skriv HTML till @setfilename\n"
+" makeinfo --xml apa.texi skriv Texinfo XML till @setfilename\n"
+" makeinfo --docbook apa.texi skriv DocBook XML till @setfilename\n"
+" makeinfo --no-headers apa.texi skriv vanlig text till standard ut\n"
+" makeinfo --html --no-headers apa.texi skriv html utan nodrader och menyer\n"
+" makeinfo --number-sections apa.texi skriv Info med numrerade avsnitt\n"
+" makeinfo --no-split apa.texi skriv en Info-fil hur stor den än "
+"är\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: Ignorerar okänt TEXINFO_OUTPUT_FORMAT-värde \"%s\".\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: argumentet %s mĺste vara numeriskt, inte \"%s\".\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s: kunde inte öppna makroexpansionsutdata \"%s\""
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: ignorerar andra makroexpansionsutdata \"%s\".\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%s: argumentet --paragraph-indent mĺste vara numeriskt/\"none\"/\"asis\", "
+"inte \"%s\".\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%s: argumentet --footnote-style mĺste vara \"separate\" eller \"end\", inte "
+"\"%s\".\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: filargument saknas.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Flerradskommandot %c%s används felaktigt"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "\"%s\" förväntades"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Kan inte skapa katalogen \"%s\": %s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "Inget \"%s\" hittades i \"%s\""
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Hoppar över makroexpansionen till standard ut eftersom Info-utdatan gĺr "
+"dit.\n"
+
+# printf (_("Making %s file `%s' from `%s'.\n"),
+# no_headers ? "text" : (html ? "HTML" : "info"),
+# output_filename, input_filename);
+#
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "Skapar %s-fil \"%s\" frĺn \"%s\".\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Detta är %s, skapad av makeinfo version %s frĺn %s.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Tar bort makroutdatafilen \"%s\" pĺ grund av fel; använd --force för att "
+"bevara.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%s: Tar bort utdatafilen \"%s\" pĺ grund av fel; använd --force för att "
+"bevara.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Okänt kommando \"%s\""
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "Använd klamrar för att ge ett komamndo som ett argument till @%s"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s förväntade klamrar"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Ensam }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "INGET_NAMN!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s saknar avslutande klammer"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image-filen \"%s\" (för HTML) är oläslig: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "Det finns ingen sĺdan fil \"%s\""
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image-filen \"%s\" (för text) är oläslig: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image saknar filnamnsargument"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "odefinierad flagga: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{Inget värde för \"%s\"}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s kräver ett namn"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Nĺdde filslut innan matchande @end %s"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "\"%.40s...\" är för lĺng för expansion; inte expanderad"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Ett } saknas i @multitable-mall"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "ignorerar lös text \"%s\" efter @multitable"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "För mĺnga kolumner i multitabellsobjekt (max %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[oväntat] kan inte välja kolumn %d i multitabell"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "ignorerar @tab utanför multitabell"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** Utdata pĺ flera kolumner frĺn senaste raden:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* kolumn %d: utdata = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Noden \"%s\" är tidigare definierad pĺ rad %d"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Formaterar noden %s...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Noden \"%s\" kräver ett kommando för avsnittsindelning (t.ex. %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "Inget nodnamn angivet för kommandot \"%c%s\""
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Ankaret \"%s\" och noden \"%s\" mappas till samma filnamn"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+"Detta @anchor-kommando ignoreras; referenser till det kommer inte att fungera"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Byt namn pĺ detta ankare eller använd flaggan \"--no-split\""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Oväntad sträng vid slutet pĺ den delade HTML-filen \"%s\""
+
+# src/menus.c:332
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Nästa:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Föregĺende:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Upp:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "Ankarna \"%s\" och \"%s\" mappas till samma filnamn"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+"@anchor-kommandot ignoreras; referenser till det kommer inte att fungera"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+"%s-referens till ickeexisterande noden \"%s\" (kanske felaktig "
+"avsnittsindelning?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Meny"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Kors"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Nästa fält i noden \"%s\" pekas inte till (kanske felaktig "
+"avsnittsindelning?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Denna nod (%s) har den felaktiga föregĺende-noden"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Föreg"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Föregĺende-fältet i noden \"%s\" pekas inte till"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Denna nod (%s) har den felaktiga nästa-noden"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "\"%s\" har inget upp-fält (kanske felaktig avsnittsindelning?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Upp"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "Noden \"%s\" saknar menypost för \"%s\" trots att den är dess Upp-mĺl"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "noden \"%s\" har refererats %d gĺnger"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "orefererad nod \"%s\""
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "Tar bort %s\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Kan inte ta bort filen \"%s\": %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Appendix %c"
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Internt fel (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Internt fel (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s är förĺldrat; använd %c%s istället"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "En nod med %ctop som en sektion finns redan"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Här är %ctop-noden"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop användes innan %cnode, använder %s som standard"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Innehĺllsförteckning"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Kort innehĺllsförteckning"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image-filen \"%s\" är oläslig: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+"@headitem som det sista objektet i @multitable genererar ogiltiga Docbook-"
+"dokument"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: varning: "
+
+# char *s = concat ("", strerror (errno), _(" for %s"));
+#
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " för %s"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tProva \"%s --help\" för en fullständig lista med flaggor.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Användning: %s [FLAGGA]... [INFO-FIL [KATALOGFIL]]\n"
+"\n"
+"Installera eller ta bort katalogposter frĺn INFO-FIL i Info-katalogfilen\n"
+"KATALOGFIL.\n"
+"\n"
+"Flaggor:\n"
+" --delete ta bort existerande poster för INFO-FIL frĺn KATALOGFIL;\n"
+" infoga inte nĺgra nya poster.\n"
+" --dir-file=NAMN ange filnamnet pĺ Info-katalogfilen.\n"
+" Detta motsvarar användning av argumentet KATALOGFIL.\n"
+" --entry=TEXT infoga TEXT som en Info-katalogpost.\n"
+" TEXT bör vara i formen av en Info-menypostsrad plus\n"
+" noll eller fler extra rader som börjar med tomrum.\n"
+" Om du anger mer än en post kommer alla att läggas\n"
+" till. Om du inte anger nĺgra poster kommer de att\n"
+" avgöras frĺn information i själva Info-filen.\n"
+" --help visa denna hjälptext och avsluta.\n"
+" --info-file=FIL ange Info-fil att installera i katalogen.\n"
+" Detta motsvarar användning av argumentet INFO-FIL.\n"
+" --info-dir=KAT samma som --dir-file=KAT/kat.\n"
+" --item=TEXT samma som --entry TEXT.\n"
+" En Info-katalogpost är egentligen en menypost.\n"
+" --quiet undertryck varningar.\n"
+" --remove samma som --delete.\n"
+" --section=AVSNITT placera denna fils poster i avsnittet AVSNITT i\n"
+" katalogen. Om du anger mer än ett avsnitt kommer alla\n"
+" poster att läggas till i varje sektion. Om du inte\n"
+" anger nĺgra avsnitt kommer de att bestämmas frĺn\n"
+" information i själva Info-filen.\n"
+" --version visa versionsinformation och avsluta.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Detta är filen .../info/dir som innehĺller den översta noden i\n"
+"Info-hierarkin som kallas (kat)Top.\n"
+"Första gĺngen du använder Info börjar du med denna nod.\n"
+"\n"
+"%s\tDetta är översta noden i INFO-trädet\n"
+"\n"
+" Denna nod (katalognoden) erbjuder en meny med huvudrubriker.\n"
+" Att skriva \"q\" avslutar, \"?\" visar alla Info-kommandon, \"d\"\n"
+" ĺtervänder hit, \"h\" visar en hjälp för förstagĺngsanvändare,\n"
+" \"mEmacs<Retur>\" besöker Emacs-manualen, osv.\n"
+"\n"
+" I Emacs kan du klicka med musknapp 2 pĺ en menypost eller korsreferens\n"
+" för att välja den.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: kunde inte läsa (%s) och kunde inte skapa (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: tom fil"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY utan matchande END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY utan matchande START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: har redan katalogfilen: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Ange Info-filen endast en gĺng.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "för mĺnga kommandoradsargument \"%s\""
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Ingen indatafil angiven; prova --help för mer information."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "Ingen katalogfil angiven; prova --help för mer information."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "ingen info-katalogpost i \"%s\""
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "menyposten \"%s\" finns redan, för filen \"%s\""
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "inga poster hittades för \"%s\"; ingenting togs bort"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "visa denna hjälptext och avsluta"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "behĺll temporära filer efter behandling"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "behĺll inte temporära filer efter behandling (standardalternativ)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "skicka utdata till FIL"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "visa versionsinformation och avsluta"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Användning: %s [FLAGGA]... FIL...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Generera ett sorterat index för varje TeX-utdataFIL.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Vanligtvis anges FIL... som \"apa.%c%c\" för ett dokument \"apa.texi\".\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: inte en texinfo-indexfil"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "misslyckande vid ĺteröppnande av %s"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Inget sidnummer i %s"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "posten %s följer pĺ en post med ett sekundärt namn"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Ange Info-katalogen endast en gĺng.\n"
+
+#~ msgid "(line)"
+#~ msgstr "(rad)"
+
+#~ msgid "line"
+#~ msgstr "rad"
+
+#~ msgid "line %*d"
+#~ msgstr "rad %*d"
+
+#~ msgid "(line %d)"
+#~ msgstr "(rad %d)"
+
+#~ msgid "line %d"
+#~ msgstr "rad %d"
+
+#~ msgid "Appendix %c "
+#~ msgstr "Appendix %c "
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" är ogiltigt"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s är en ogiltig ISO-kod, använder %c"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Kan inte ange mer än en makroexpansionsutdata"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "Filen finns men är ingen katalog"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Första argumentet till korsreferens kan inte vara tomt"
+
+#~ msgid "see "
+#~ msgstr "se "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "\".\" eller \",\" mĺste följa pĺ korsreferens, inte %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "Första argumentet till @inforef kan inte vara tomt"
+
+#~ msgid "Node:"
+#~ msgstr "Nod:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: Innehĺllsförteckningen skulle vara här, men hittades inte"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "virtuellt minne slut"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "Ingen \"%s.png\" eller \".jpg\" och ingen filändelse angiven"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%s; för filen \"%s\".\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "\"%s\" har inget upp-fält"
+
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr "\\%-10[scroll-forward] Rulla en rad framĺt.\n"
+
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "\\%-10[scroll-backward] Rulla en rad bakĺt.\n"
+
+#~ msgid ""
+#~ "Email bug reports to bug-texinfo@gnu.org,\n"
+#~ "general questions and discussion to help-texinfo@gnu.org."
+#~ msgstr ""
+#~ "Skicka felrapporter till bug-texinfo@gnu.org,\n"
+#~ "allmänna frĺgor och diskussion till help-texinfo@gnu.org\n"
+#~ "och synpunkter pĺ översättningen till sv@li.org."
+
+#~ msgid "%s' argument to @image command not found"
+#~ msgstr "%s argument till @image-kommandot hittades inte"
+
+#~ msgid ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "Translate Texinfo source documentation to various other formats:\n"
+#~ "Info files suitable for reading online with Emacs or standalone GNU Info\n"
+#~ "(by default); plain text (with --no-headers); or HTML (with --html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names allow @ commands in node names.\n"
+#~ " -D VAR define a variable, as with @set.\n"
+#~ "--docbook output DocBook rather than Info format.\n"
+#~ " -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+#~ " --error-limit=NUM quit after NUM errors (default %d).\n"
+#~ " --fill-column=NUM break Info lines at NUM characters (default %"
+#~ "d).\n"
+#~ " --footnote-style=STYLE output footnotes according to STYLE:\n"
+#~ " `separate' to place footnotes in their own "
+#~ "node,\n"
+#~ " `end' to place the footnotes at the end of "
+#~ "the\n"
+#~ " node in which they are defined (the "
+#~ "default).\n"
+#~ " --force preserve output even if errors.\n"
+#~ " --help display this help and exit.\n"
+#~ " --html output HTML rather than Info format.\n"
+#~ " -I DIR append DIR to the @include search path.\n"
+#~ " --ifhtml process @ifhtml and @html text even when not\n"
+#~ " generating HTML.\n"
+#~ " --ifinfo process @ifinfo text even when generating "
+#~ "HTML.\n"
+#~ " --iftex process @iftex and @tex text.\n"
+#~ " implies --no-split.\n"
+#~ msgstr ""
+#~ "Användning: %s [FLAGGA]... TEXINFO-FIL...\n"
+#~ "\n"
+#~ "Översätt Texinfo-källdokumentation till diverse andra format:\n"
+#~ "Info-filer som är lämpliga för läsning pĺ skärm med Emacs eller separat\n"
+#~ "GNU Info (standardalternativ), vanlig text (med --no-headers), eller\n"
+#~ "HTML (med --html).\n"
+#~ "\n"
+#~ "Flaggor:\n"
+#~ " --commands-in-node-names tillĺt @-kommandon i nodnamn.\n"
+#~ " -D VARIABEL definiera en variabel, som med @set.\n"
+#~ "--docbook generera DocBook istället för Info-format.\n"
+#~ " -E, --macro-expand FIL generera makroexpanderad källkod till FIL.\n"
+#~ " --error-limit=ANTAL avsluta efter ANTAL fel (standard %d).\n"
+#~ " --fill-column=ANTAL radbryt Info-rader vid ANTAL tecken (standard %"
+#~ "d).\n"
+#~ " --footnote-style=STIL generera fotnoter enligt STIL:\n"
+#~ " \"separate\" för att placera fotnoter i sin\n"
+#~ " egen nod,\n"
+#~ " \"end\" för att placera fotnoter i slutet pĺ\n"
+#~ " den nod där de är definierade (standard).\n"
+#~ " --force bevara utdata även om fel pĺträffas.\n"
+#~ " --help visa denna hjälptext och avsluta.\n"
+#~ " --html generera HTML istället för Info-format.\n"
+#~ " -I KATALOG lägg till KATALOG till @include-sökvägen.\n"
+#~ " --ifhtml behandla @ifhtml- och @html-text även om inte\n"
+#~ " HTML genereras.\n"
+#~ " --ifinfo behandla @ifinfo-text även dĺ HTML genereras.\n"
+#~ " --iftex behandla @iftex- och @tex-text.\n"
+#~ " medför --no-split.\n"
+
+#~ msgid ""
+#~ " --no-headers suppress Info node separators and Node: "
+#~ "lines;\n"
+#~ " write to standard output without --output.\n"
+#~ " --no-ifhtml do not process @ifhtml and @html text.\n"
+#~ " --no-ifinfo do not process @ifinfo text.\n"
+#~ " --no-iftex do not process @iftex and @tex text.\n"
+#~ " --no-split suppress splitting of Info or HTML output,\n"
+#~ " generate only one output file.\n"
+#~ " --no-validate suppress node cross-reference validation.\n"
+#~ " --no-warn suppress warnings (but not errors).\n"
+#~ " --number-sections include chapter, section, etc. numbers in "
+#~ "output.\n"
+#~ " -o, --output=FILE output to FILE (directory if split HTML),\n"
+#~ " ignoring any @setfilename.\n"
+#~ " -P DIR prepend DIR to the @include search path.\n"
+#~ " --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+#~ "d).\n"
+#~ " if VAL is `none', do not indent;\n"
+#~ " if VAL is `asis', preserve existing "
+#~ "indentation.\n"
+#~ " --reference-limit=NUM warn about at most NUM references (default %"
+#~ "d).\n"
+#~ " --split-size=NUM split into files at NUM size. (default %d).\n"
+#~ " -U VAR undefine a variable, as with @clear.\n"
+#~ " -v, --verbose explain what is being done.\n"
+#~ " --version display version information and exit.\n"
+#~ " --xml output XML (TexinfoML) rather than Info "
+#~ "format.\n"
+#~ msgstr ""
+#~ " --no-headers undertryck Info-nodavskiljare och \"Node:\"-"
+#~ "rader,\n"
+#~ " skriv till standard ut utan --output.\n"
+#~ " --no-ifhtml behandla inte @ifhtml- och @html-text.\n"
+#~ " --no-ifinfo behandla inte @ifinfo-text.\n"
+#~ " --no-iftex behandla inte @iftex- och @tex-text.\n"
+#~ " --no-split undertryck delning av Info- eller HTML-"
+#~ "utdata,\n"
+#~ " skapa endast en utdatafil.\n"
+#~ " --no-validate undertryck nod-korsreferensvalidering.\n"
+#~ " --no-warn undertryck varningar (men inte fel).\n"
+#~ " --number-sections inkludera kapitel-, sektionsnummer osv i "
+#~ "utdata.\n"
+#~ " -o, --output=FIL skriv till FIL (katalog om delad HTML),\n"
+#~ " ignorerar alla @setfilename.\n"
+#~ " -P KATALOG lägg till KATALOG till @include-sökvägen.\n"
+#~ " --paragraph-indent=VÄRDE gör indrag i Info-stycken med VÄRDE blanksteg\n"
+#~ " (standardvärde %d).\n"
+#~ " om VÄRDE är \"none\" görs inget indrag;\n"
+#~ " om VÄRDE är \"asis\" bevaras befintlig "
+#~ "indragning.\n"
+#~ " --reference-limit=ANTAL varna om högst ANTAL referenser\n"
+#~ " (standardvärde %d).\n"
+#~ " --split-size=ANTAL dela i filer vid storleken ANTAL\n"
+#~ " (standardvärde %d).\n"
+#~ " -U VARIABEL odefiniera en variabel, som med @clear.\n"
+#~ " -v, --verbose förklara vad som görs.\n"
+#~ " --version visa versionsinformation och avsluta.\n"
+#~ " --xml generera XML (TexinfoML) istället för Info-"
+#~ "format.\n"
diff --git a/Build/source/utils/texinfo/po/texinfo.pot b/Build/source/utils/texinfo/po/texinfo.pot
new file mode 100644
index 00000000000..90756421544
--- /dev/null
+++ b/Build/source/utils/texinfo/po/texinfo.pot
@@ -0,0 +1,2787 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr ""
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr ""
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr ""
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr ""
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr ""
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr ""
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr ""
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr ""
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr ""
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr ""
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr ""
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr ""
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr ""
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr ""
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr ""
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr ""
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr ""
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr ""
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr ""
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr ""
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr ""
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr ""
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr ""
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr ""
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr ""
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr ""
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr ""
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr ""
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr ""
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr ""
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr ""
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr ""
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr ""
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr ""
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr ""
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr ""
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr ""
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr ""
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr ""
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr ""
+
+#: info/indices.c:376
+msgid "more "
+msgstr ""
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr ""
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr ""
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr ""
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr ""
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr ""
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr ""
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr ""
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr ""
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr ""
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr ""
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr ""
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr ""
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr ""
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr ""
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr ""
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr ""
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr ""
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr ""
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr ""
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr ""
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr ""
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr ""
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr ""
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr ""
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr ""
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr ""
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr ""
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr ""
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr ""
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr ""
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr ""
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr ""
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr ""
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr ""
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr ""
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr ""
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr ""
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr ""
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr ""
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr ""
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr ""
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr ""
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr ""
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr ""
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr ""
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr ""
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr ""
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr ""
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr ""
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr ""
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr ""
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr ""
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr ""
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr ""
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr ""
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr ""
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr ""
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr ""
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr ""
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr ""
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr ""
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr ""
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr ""
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr ""
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr ""
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr ""
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr ""
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr ""
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr ""
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr ""
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr ""
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr ""
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr ""
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr ""
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr ""
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr ""
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr ""
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr ""
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr ""
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr ""
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr ""
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr ""
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr ""
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr ""
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr ""
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr ""
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr ""
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr ""
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr ""
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr ""
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr ""
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr ""
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr ""
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr ""
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr ""
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr ""
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr ""
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr ""
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr ""
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr ""
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr ""
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr ""
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr ""
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr ""
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr ""
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr ""
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr ""
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr ""
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr ""
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr ""
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr ""
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr ""
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr ""
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr ""
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr ""
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr ""
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr ""
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr ""
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr ""
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr ""
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr ""
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr ""
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr ""
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr ""
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr ""
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr ""
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr ""
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr ""
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr ""
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr ""
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr ""
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr ""
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr ""
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr ""
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr ""
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr ""
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr ""
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr ""
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr ""
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr ""
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr ""
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr ""
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr ""
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr ""
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr ""
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr ""
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr ""
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr ""
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr ""
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr ""
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr ""
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr ""
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr ""
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr ""
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr ""
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr ""
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr ""
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr ""
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr ""
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr ""
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr ""
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr ""
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr ""
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr ""
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr ""
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr ""
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr ""
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr ""
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr ""
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr ""
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr ""
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr ""
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr ""
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr ""
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr ""
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr ""
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr ""
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr ""
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr ""
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr ""
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr ""
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr ""
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr ""
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr ""
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr ""
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr ""
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr ""
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr ""
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr ""
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr ""
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr ""
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr ""
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr ""
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr ""
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr ""
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr ""
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr ""
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr ""
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr ""
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr ""
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr ""
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr ""
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr ""
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr ""
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr ""
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr ""
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr ""
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr ""
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr ""
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr ""
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr ""
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr ""
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr ""
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr ""
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr ""
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr ""
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr ""
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr ""
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr ""
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr ""
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr ""
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr ""
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr ""
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr ""
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr ""
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr ""
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr ""
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr ""
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr ""
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr ""
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr ""
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr ""
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr ""
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr ""
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr ""
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr ""
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr ""
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr ""
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr ""
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr ""
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr ""
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr ""
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr ""
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr ""
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr ""
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr ""
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr ""
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr ""
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr ""
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr ""
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr ""
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr ""
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr ""
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr ""
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr ""
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr ""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr ""
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr ""
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr ""
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr ""
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr ""
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr ""
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr ""
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr ""
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr ""
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr ""
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr ""
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr ""
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr ""
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr ""
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr ""
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr ""
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr ""
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr ""
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr ""
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr ""
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr ""
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr ""
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr ""
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr ""
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr ""
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr ""
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr ""
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr ""
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr ""
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr ""
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr ""
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr ""
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr ""
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr ""
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr ""
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr ""
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr ""
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr ""
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr ""
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr ""
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr ""
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr ""
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr ""
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr ""
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr ""
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr ""
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr ""
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr ""
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr ""
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr ""
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr ""
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr ""
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr ""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr ""
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr ""
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr ""
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr ""
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr ""
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr ""
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr ""
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr ""
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr ""
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr ""
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr ""
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr ""
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr ""
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr ""
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr ""
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr ""
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr ""
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr ""
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr ""
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr ""
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr ""
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr ""
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr ""
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr ""
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr ""
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr ""
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr ""
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr ""
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr ""
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr ""
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr ""
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr ""
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr ""
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr ""
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr ""
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr ""
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr ""
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr ""
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr ""
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr ""
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr ""
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr ""
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr ""
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr ""
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr ""
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr ""
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr ""
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr ""
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr ""
diff --git a/Build/source/utils/texinfo/po/tr.gmo b/Build/source/utils/texinfo/po/tr.gmo
new file mode 100644
index 00000000000..09fa6558c68
--- /dev/null
+++ b/Build/source/utils/texinfo/po/tr.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/tr.po b/Build/source/utils/texinfo/po/tr.po
new file mode 100644
index 00000000000..6745a02f04f
--- /dev/null
+++ b/Build/source/utils/texinfo/po/tr.po
@@ -0,0 +1,3123 @@
+# translation of texinfo-4.7.92.po to Turkish
+# texinfo-4.7.92 Türkçe Çevirisi
+# Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the texinfo package.
+# Eyüp Hakan Duran <hakan_duran@hotmail.com>, 2002, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo-4.7.92\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2004-12-21 21:22+0200\n"
+"Last-Translator: Eyüp Hakan Duran <hakan_duran@hotmail.com>\n"
+"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-9\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "Bir karakter ileri gider"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "Bir karakter geri gider"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "Satýrýn baţlangýcýna gider"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "Satýrýn sonuna gider"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "Bir kelime ileri gider"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "Bir kelime geri gider"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "Ýmlecin altýndaki karakteri siler"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "Ýmleçden önceki karakteri siler"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "Ýţlemi keser ya da çýkar"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "Bu satýrý kabul eder (ya da tamamlanmasý için zorlar)"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Sonraki karakteri aynen yerleţtirir"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "Bu karakteri yerleţtirir"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "Bir TAB karakteri yerleţtirir"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "Verilen yerde karakterleri yer deđiţtirir"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "Son silinenin içeriđi kadar geri çeker"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "Silinen zincir boţ"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "Bir önceki silinen kadar geri çeker"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "Satýrýn sonuna kadar siler"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "Satýrýn baţýna kadar siler"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "Ýmleçten sonraki kelimeyi siler"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "Ýmleçten önceki kelimeyi siler"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "Tamamlama yok"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Bitmedi"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "Olasý tamamlamalarý listeler"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "Tek tamamlama"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Bir tamamlama:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d tamamlama:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "Tamamlamayý yerleţtir"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "Tamamlamalarý oluţturuyor..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "Tamamlama penceresini kaydýrýr"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Dipnotlar gösterilemedi"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "Diđer penceredeki bu düđümle iliţkili dipnotlarý gösterir"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "----------- Dipnotlar ---------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "Bu dosyada indeks içinde bir dizgeyi arar"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "indeks girdilerini buluyor..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "Hiç indis yok."
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "indeks giriţi: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr ""
+"Son `\\[index-search]'komutundan bir sonraki eţleţen indeks öđesine gider"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "Daha önce bir indeks arama dizgesi yok."
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "Hiç indeks girdisi yok."
+
+#: info/indices.c:375
+#, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "`%s' içeren %sindex girdisi yok."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "daha"
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "BU GÖRÜLMEZ"
+
+#: info/indices.c:422
+#, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"`%s' bulundu - %s içinde. (`\\[next-index-match]' sonrakini bulmayý dener.)"
+
+#: info/indices.c:541
+#, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "`%s' indislerini tarýyor..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "Mevcut bilgi dosyalarýndan hiçbirisinin indisinde `%s' yok."
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr ""
+"Bir dizge için tüm bilinen bilgi dosyalarýnýn indislerinide ekleyerek bir "
+"menu oluţturur"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Ýndeks hakkýnda:"
+
+#: info/indices.c:654
+#, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menü: `%s' indislerini içeren düđümler:\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "Daha fazla bilgi için --help seçeneđini kullanýn.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Garanti yoktur. Bu yazýlýmý GNU Genel Kamu Lisansý koţullarý\n"
+"altýnda dađýtabilirsiniz. Bu konuda daha fazla bilgi için\n"
+"COPYING isimli dosyaya bakýn.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "`%s' için indeks girdisi yok.\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+" -b, --speech-friendly konuţma sentezcilerine dostça davranýr.\n"
+
+#: info/info.c:597
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Kullaným: %s [SEÇENEK]... [MENÜ-ÖĐESÝ...]\n"
+"\n"
+"Info biçeminde belge okur\n"
+"\n"
+"Seçenekler:\n"
+" --apropos=DÝZGE DÝZGE'yi tüm elkitaplarýnýn tüm indislerinde "
+"ara.\n"
+" -d, --directory=DIR DIR'ý INFOPATH'a ekle.\n"
+" --dribble=DOSYAADI DOSYAADI'ndaki kullanýcý tuţbasýmlarýný "
+"anýmsa.\n"
+" -f, --file=DOSYAADI uđranacak Info dosyasýný belirle.\n"
+" -h, --help bu yardýmý görüntüle ve çýk.\n"
+" --index-search=DÝZGE DÝZGE indeks giriţince iţaret edilen düđüme "
+"git.\n"
+" -n, --node=DÜĐÜMADI ilk uđranan Info dosyasýndaki düđümleri "
+"belirle.\n"
+" -o, --output=DOSYAADI seçili düđümleri DOSYAADI'na çýkar.\n"
+" -R, --raw-escapes klavuz sayfalarýndan ANSI kaçýţlarýný (esc) "
+"silme.\n"
+" --restore=DOSYAADI ilk tuţ vuruţlarýný DOSYAADI'ndan oku.\n"
+" -O, --show-options, --usage komut-satýrý seçenekler düđümüne git.\n"
+"%s --subnodes menü öđelerini özyinelemeli çýkar.\n"
+" --vi-keys vi ve less benzeri tuţ bađlayýcýlarý kullan.\n"
+" --version sürüm bilgisini göster ve çýk.\n"
+"\n"
+"Eđer mevcutsa, ilk seçenek-olmayan argüman, baţlanacak menü giriţidir;\n"
+"INFOPATH boyunca tüm `dir' dosyalarýnda aranýr.\n"
+"Mevcut deđilse, bilgi tüm `dir' dosyalarýný birleţtirip sonucu gösterir.\n"
+"Kalan tüm argümanlar, ilk uđranan düđüme göreceli olarak\n"
+"menü öđesi adlarý muamelesi görür.\n"
+"\n"
+"Örnekler:\n"
+" info üst-düzey dir menüsünü göster\n"
+" info emacs üst-düzey dir'den emacs düđümünde baţla\n"
+" info emacs buffers emacs klavuzu içindeki tampon düđümden baţla\n"
+" info --show-options emacs emacs'ýn komut satýrý seçenekleri olan düđümden "
+"baţla\n"
+" info -f ./foo.info dir'i aramadan ./foo.info dosyasýný göster\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Yazýlým hatalarýný bug-texinfo@gnu.org'a,\n"
+"genel soru ve tartýţmalarý help-texinfo@gnu.org'a gönderiniz.\n"
+"Texinfo anasayfasý: http://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "`%s' düđümü bulunamadý."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "`(%s)%s' düđümü bulunamadý."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Bir pencere bulunamadý!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "Orasý bu pencerenin düđümü gibi görünmüyor!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Son pencere silinemez."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Bu düđümde menü yok."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Bu düđümde dipnot yok."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Bu düđümde çapraz baţvuru yok."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Bu düđüm için `%s' yer gösterici yok."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "Info komutu `%c' bilinmiyor; yardým almak için `?' deneyin."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "`%s' terminal türü Info çalýţtýrmak için yeterince akýllý deđil."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "Zaten bu düđümün son sayfasýndasýnýz."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "Zaten bu düđümün ilk sayfasýndasýnýz."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "Sadece bir pencere."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "Pencere çok küçük olacaktý."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "Bir yardým penceresi için yer yok, lütfen bir pencere silin."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Info Pencerelerindeki Temel Komutlar\n"
+"************************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit help] Bu yardýmdan çýkar \n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Info'dan büsbütün çýkar.\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] Info öđreticiyi çađýrýr.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"Diđer düđümleri seçme:\n"
+"----------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] Bu düđümün \"next\" düđümüne gider.\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] Bu düđümün \"previous\" düđümüne gider.\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] Bu düđümden \"up\" gider.\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] Ýsmini belirterek menü öđesi seçin.\n"
+" Menü öđesi seçmek, bir baţka düđümün seçilmesine yolaçar.\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr ""
+"\\%-10[xref-item] Bir çapraz baţvuruyu izler. Baţvurunun adýný okur.\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "\\%-10[history-node] Bu pencerede görünen en son düđüme gider.\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr ""
+"\\%-10[move-to-next-xref] Bu düđüm içinde sonraki URL linkine atlar.\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr "\\%-10[move-to-prev-xref] Bu düđüm içinde önceki URL linkine atlar.\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr ""
+"\\%-10[select-reference-this-line] Ýmleç altýndaki URL linkini izler.\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] `dizin' düđümüne gider. `\\[goto-node] (DIR)'a eţdeđer.\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr ""
+"\\%-10[top-node] En üst düđüme gider. `\\[goto-node] Top'a eţdeđer.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"Bir düđüm içinde dolaţým:\n"
+"-------------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] Bu düđümün baţlangýcýna gider.\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] Bu düđümün sonuna gider.\n"
+
+#: info/infodoc.c:72
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr "\\%-10[next-line] Bir satýr ileri kaydýrýr.\n"
+
+#: info/infodoc.c:73
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr "\\%-10[prev-line] Bir satýr geri kaydýrýr.\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] Ýleriye dođru bir sayfa kaydýrýr.\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] Geriye dođru bir sayfa kaydýrýr.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"Diđer komutlar:\n"
+"---------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] Düđümün menüsündeki ilk ...inci öđeyi seçer.\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] Düđümün menüsündeki son öđeyi seçer.\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] Bu Info dosyasýndaki indeks girdileri içinde belirli "
+"bir dizgeyi arar\n"
+" ve bulunan ilk girdi tarafýndan gönderme yapýlan düđümü "
+"seçer.\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] Ýsmiyle belirtilen düđüme gider.\n"
+" (DOSYAADI)DÜĐÜMADI ţeklinde bir dosya adý da "
+"ekleyebilirsiniz.\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] Belirli bir dizgeyi ileriye dođru arar\n"
+" ve sonraki bulunanýn içinde olduđu düđümü seçer.\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] Belirli bir dizgeyi geriye dođru arar\n"
+" ve önceki bulunanýn içinde olduđu düđümü seçer.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s Bu yardým penceresinden çýkar.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Info büsbütün çýkar.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s Info öđreticiyi yardýma çađýrýr.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s Bu düđümün `sonraki' düđümüne gider.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s Bu düđümün `önceki' düđümüne gider.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s Bu düđümden `yukarý' gider.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s Ýsmi ile belirtilen menü öđesini seçer.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr ""
+" Diđer düđümün seçilmesine sebep olan bir menü öđesini "
+"seçiyor.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s Bir çapraz baţvuruyu izler. Baţvuru ismini okur.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s Bu pencerede görünen son düđüme gider.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Bu düđümün içinden sonraki URL bađýna atlar.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s Ýmleç altýndaki URL bađýný izler.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s `dizin' düđümüne gider. `g (DÝZÝN)' ile eţdeđer.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s Üst düđüme gider. `g Top' ile eţdeđer.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s Bir sayfa ileri kaydýrýr.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s Bir sayfa geri kaydýrýr.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s Bu düđümün baţlangýcýna gider.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s Bu düđümün sonuna gider.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s Bir satýr ileri kaydýrýr.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s Bir satýr geri kaydýrýr.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s Önce seçer ... düđüm menüsündeki dokuzuncu öđe.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s Düđüm menüsündeki son öđeyi seçer.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s Bu Info'nun indeks girdilerinde belirtilen bir dizgeyi arar\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+" dosyasý ve bulunan ilk girdi tarafýndan bađýntýlanan düđümü "
+"seçer.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s ismiyle belirtilen düđüme gider.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+" (DOSYAÝSMÝ)DÜĐÜMÝSMÝ ţeklinde bir dosyayý dahil "
+"edebilirsiniz.\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s Belirli bir dizgeyi ileriye dođru arar,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " ve bulunan sonraki oluţumdaki düđümü seçer.\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s Belirli bir dizgeyi geriye dođru arar\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "Ţu anki arama yolu:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Info pencerelerinde kullanýlabilecek komutlar:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Eko alanýnda kullanýlabilecek komutlar:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"Aţađýdaki komutlar yalnýzca %s aracýlýđýyla çađrýlabilirler:\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr " tümü\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr ""
+"--- Çýkmak için `\\[geçmiţ-düđüm]' ya da `\\[kaldýrýlan-düđüm]' kullanýn "
+"---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "Bu yardým iletisini gösterir"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "Info düđümünü `(info)Help' ziyaret eder"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "KEY ile ilgili belgeleri basar"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "Tuţ açýklamasý: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s atanmamýţ."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s atanmamýţ."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s %s olarak atanmýţ."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "Verilen komutu çalýţtýracak türü gösterir"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr "Komutun yeri: "
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' bir tuţ üzerinde deđil"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s sadece %s üzerinden çađrýlabilir."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s, %s üzerinden çađrýlabilir."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "`%s' isimli bir iţlev yok"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Kopyahakký (C) %s Free Software Foundation, Inc.\n"
+"Garanti yoktur. Bu yazýlýmý GNU Genel Kamu Lisansý koţullarý\n"
+"altýnda dađýtabilirsiniz. Bu konuda daha fazla bilgi için\n"
+"COPYING isimli dosyaya bakýn.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "argüman sayýsý yanlýţ"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "`%s' girdi dosyasý açýlamýyor"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "`%s' çýktý dosyasý oluţturulamýyor"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "`%s''e yazma hatasý"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "`%s' çýktý dosyasýný kapatmada hata"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "anahtar sýralamasý çok uzun"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "anahtar sýralamasý kayýp"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "NUL karakterine (\\000) izin verilmiyor"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "NUL karakterine (^%c) izin verilmiyor"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "kayýp eylem adý"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "bölüm çok uzun"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "bilinmeyen eylem `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "eylem adý çok uzun"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "`%s' eylemini izleyen fazladan karakterler"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "kayýp deđiţken adý"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "deđiţken adýndan hemen sonra kayýp `=' "
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "deđiţken adý çok uzun"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "deđer çok uzun"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "\"%s\", satýr %u: "
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Kullaným: %s [SEÇENEK]... [GÝRDÝ-DOSYASI]\n"
+"\n"
+"infokey kaynak dosyasýný infokey dosyasýna derler. GÝRDÝ-DOSYASI'ný\n"
+"okur (öntanýmlý $HOME/.infokey) ve derlenmiţ dosyayý $HOME/.info \n"
+"dosyasýna (öntanýmlý) yazar\n"
+"\n"
+"Seçenekler:\n"
+" --output DOSYA çýktý, $HOME/.info yerine DOSYA'ya\n"
+" --help bu yardýmý gösterir ve çýkar\n"
+" --version sürüm bilgisini gösterir ve çýkar.\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "Geçersiz infokey dosyasý `%s' yoksayýlýyor - çok küçük"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "Geçersiz infokey dosyasý `%s' yoksayýlýyor - çok büyük"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "infokey dosyasý `%s' okumada hata - çok kýsa"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+"Geçersiz infokey dosyasý `%s' (hatalý sihirli numaralar) -- güncellemek için "
+"infokey yürütün"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "infokey dosyanýz `%s' eskimiţ -- güncellemek için infokey yürütün"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+"Geçersiz infokey dosyasý `%s' (hatalý bölüm uzunluđu) -- güncellemek için "
+"infokey yürütün"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+"Geçersiz infokey dosyasý `%s' (hatalý bölüm kodu) -- güncellemek için "
+"infokey yürütün"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "Infokey dosyasýnda hatalý veri -- bazý tuţ bađlantýlarý yoksayýldý"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "Infokey dosyasýnda hatalý veri -- bazý deđiţken ayarlarý yoksayýldý"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "Bir Info komut ismini okur ve onu açýklar"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "Komut açýklamasý: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "Eko alanýndan komut ismini okur ve onu çalýţtýrýr"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Bir `eko-alaný' komutu burada çalýţtýrýlamaz."
+
+#: info/m-x.c:154
+#, c-format
+msgid "Undefined command: %s"
+msgstr "tanýmlanmamýţ komut: %s"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "Gösterilen pencerenin yüksekliđi belirtilir"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "Ekran yüksekliđini (%d) ye ayarlar: "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" Bu dosyanýn içermesini sađlamak için peţi sýra sürüklenen kaynak "
+"dosyalar:\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "%s dosyasý manipüle edilemedi.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* Menü:\n"
+" (Dosya)Düđüm Satýr Boyut Ýçerdiđi Dosya\n"
+" ------------ ----- ----- --------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"Son zamanlarda uđradýđýnýz düđüm menüsünü görmektesiniz.\n"
+"Ya bu menüden seçin, ya da baţka bir pencerede `\\[history-node]' kullanýn.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr ""
+"Son zamanlarda uđradýđýnýz tüm düđümlerin menüsünü içeren bir pencere "
+"oluţturur"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "Daha önce, görünür bir pencereden uđradýđýnýz bir düđüm seçiniz"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "Uđramýţ olduđunuz düđümü seçiniz: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Referans yokoldu! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"Info sürüm %s'e hoţgeldiniz. Yardým için \\[get-help-window], menü öđesi "
+"için \\[menu-item] yazýnýz."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "Sonraki satýra (aţađý) gider"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "Önceki satýra (yukarý) gider"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "Satýr sonuna gider"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "Satýr baţýna gider"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "Sonraki"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "Sonraki düđümü izliyor..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "Ýlk menü öđesi seçiliyor..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "Sonraki düđüm seçiliyor..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "%d kez Yukarý gidip, Sonrakine geçiliyor."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Bu belge içinde baţka düđüm yok."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Bu düđüm için baţka `Önceki' yok."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "Bu pencerede Öncekine gidiliyor."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "Bu belge içinde, bu düđüm için `Önceki' ya da `Yukarý' yok."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "Bu pencere içinde Yukarýya gidiliyor."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "`Önceki'nin son menü öđesine gidiliyor."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Düđüm yapýsý içinde ileriye ya da aţađýya gider"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Düđüm yapýsý içinde geriye ya da yukarýya gider"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "Bu pencerede ileriye dođru kaydýrýr"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr ""
+"Bu pencerede ileriye dođru kaydýrýr ve öntanýmlý pencere boyutuna ayarlar"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "Bu pencerede, düđüm içinde kalarak ileriye dođru kaydýrýr"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr ""
+"Bu pencerede, düđüm içinde kalarak ileriye dođru kaydýrýr ve öntanýmlý "
+"pencere boyutunu ayarlar"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "Bu pencerede geriye dođru kaydýrýr"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr ""
+"Bu pencerede geriye dođru kaydýrýr ve öntanýmlý pencere boyutunu ayarlar"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "Bu pencerede, düđüm içinde kalarak geriye dođru kaydýrýr"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr "geri ve set öntanýmlý"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "Bu düđümün baţlangýcýna gider"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "Bu düđümün sonuna gider"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "Aţađýya dođru satýr kaydýrýr"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "Yukarýya dođru satýr kaydýrýr"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "Aţađýya dođru yarým ekran boyutu kaydýrýr"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "Yukarýya dođru yarým ekran boyutu kaydýrýr"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "Sonraki pencereyi seçer"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "Önceki pencereyi seçer"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "Mevcut pencereyi böler"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "Mevcut pencereyi siler"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Kalýcý bir pencere silinemez"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "Diđer tüm pencereleri siler"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "Diđer pencereyi kaydýrýr"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "Diđer pencereyi geriye dođru kaydýrýr"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "Bu pencereyi büyütür (ya da küçültür)"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "Mevcut ekran boţluđunu görünür pencereler arasýnda bölüţtürür"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "Mevcut penceredeki satýr sarma durumunu deđiţtirir"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "Sonraki düđümü seçer"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "Önceki düđümü seçer"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "Üstteki düđümü seçer"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "Bu dosyadaki son düđümü seçer"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Bu pencerenin baţka düđümü yok"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "Bu dosyadaki ilk düđümü seçer"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "Bu düđümün menüsündeki son öđeyi seçer"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "Bu menü öđesini seçer"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Bu menüde %d adet öđe yok."
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "Menü öđesi (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "Menü öđesi: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "Ýzlenecek xref (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "Ýzlenecek xref: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "Bir menü öđesini okur ve düđümünü seçer"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "Oku yada ve select"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "Bu düđüm menüsünün baţlangýcýna gider"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Tek seferde mümkün olan en fazla sayýda menü öđesine uđrar"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "Bir düđüm adý okur ve seçer"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "Düđüme gider: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "Menüsü olmayan düđüm `%s'."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "`%2$s' düđümünde `%1$s' menü öđesi yok."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "`%2$s''de `%1$s' tarafýndan baţvurulan düđüm bulunamadý."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "Dizinden baţlayarak bir menü listesini oku ve izle"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "Menüleri izle: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Program çađýrmayý açýklayan düđümü bulur"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "[%s]'in çađýrma düđümünü bulur: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "Bir klavuz sayfasý baţvurusunu okur ve seçer"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "Alýnacak klavuz sayfasý: "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "Bu dosyadaki `En Üst' düđümü seç"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "`(dizin)' düđümünü seç"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Düđümü öldür (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Öldürülemeyen düđüm `%s' "
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Son düđüm öldürülemiyor"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "En son seçilen düđümü seçer"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Bu düđümü öldürür"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "Bir dosyanýn adýný okur ve seçer"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Dosyayý bul: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "`%s' bulunamýyor."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Çýktý dosyasý `%s' oluţturulamýyor."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "Bitti."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "%s düđümü yazýlýyor..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "Bu düđümün içeriđini INFO_PRINT_COMMAND üzerinden veri yolla"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Veri yolu `%s''e açýlamýyor."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "%s düđümü yazdýrýlýyor..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "%s altdosyasý aranýyor ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "Bir dizge okur ve onu büyük/küçük harf duyarlý ţekilde arar"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "Bir dizge okur ve (onu) arar"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "Bir dizge okur ve (onu) geriye dođru arar"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%s için dizge [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "Geriye dođru ara"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "Ara"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr " büyük/küçük harf duyarlý ţekilde "
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "Arama baţarýsýz"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "Son aramayý ayný yönde yineler"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "Daha önceden arama dizgesi yok"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "Son aramayý ters yönde yineler"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "Bir dizgeyi siz yazarken etkileţimli ţekilde arar"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "I-arama, geriye dođru: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "I-arama: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Baţarýlamýyor "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "Önceki çapraz baţvuruya gider"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "Sonraki çapraz baţvuruya gider"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "Bu satýrdaki referans ya da menü öđesini seçer"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "Mevcut iţlemi iptal eder"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "Çýk"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "Ýmleci pencerenin belirli bir satýrýna taţýr"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "Görüntüyü yeniden çizer"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "Info'dan çýkar"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "Bu tuţun küçük harfine atanmýţ komutu yürütür"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "Bilinmeyen komut (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" geçersiz"
+
+#: info/session.c:4495
+#, c-format
+msgid "`%s' is invalid"
+msgstr "`%s' geçersiz"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "Mevcut sayýsal argümana bu sayýyý ekle"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "Mevcut sayýsal argümaný baţlat (ya da 4'le çarp)"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Dahili olarak \\[universal argument] tarafýndan kullanýlýyor"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "okuma-satýrý: Sanal bellek tükendi!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "\"Açýk\" olduđunda, dipnotlar otomatik olarak görünür ve kaybolur"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr ""
+"\"Açýk\" olduđunda, bir pencereyi oluţturma ya da silme, diđerlerini yeniden "
+"boyutlandýrýr"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "\"Açýk\" olduđunda, zil çalýnacađýna ekran yanýp söner"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "\"Açýk\" olduđunda, hatalar zilin çalmasýna neden olur"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr ""
+"\"Açýk\" olduđunda Info çöpü, sýkýţtýrmasý açýlmak zorunda olan dosyalarý "
+"biriktirir"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "\"Açýk\" olduđunda, arama dizgesinin eţleţen kýsmý ýţýklandýrýlýr"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "Bir düđüm sonunda kaydýrma istendiđinde ne olacađýný kontrol eder"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "Ýmleç penceere dýţýna taţýndýđýnda kaydýrýlacak satýr sayýsý"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr ""
+"\"Açýk\" olduđunda Info, ISO Latin karakterleri kabul eder ve görüntüler"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "Bir deđiţkenin kullanýmýný açýklar"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "Açýklanacak deđiţken: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "Bir Info deđiţkeninin deđerini belirler"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "Deđiţkeni ata: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "%s'e atanacak deđer (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "%s'e atanacak deđer (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "..*** Eskimiţ Etiketler ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), satýr ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, %d satýr --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, %d satýr --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " Altdosya: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: `%s' seçeneđi belirsiz\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: `--%s' seçeneđi argümansýz kullanýlýr\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: `%c%s' seçeneđi argümansýz kullanýlýr\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: `%s' seçeneđi bir argümanla kullanýlýr\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: `--%s' seçeneđi bilinmiyor\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: `%c%s' seçeneđi bilinmiyor\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: kuraldýţý seçenek -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: geçersiz seçenek -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: seçenek bir argümanla kullanýlýr -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: `-W %s' seçeneđi belirsiz\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: `-W %s' seçeneđi argümansýz kullanýlýr\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, c-format
+msgid "arguments to @%s ignored"
+msgstr "@%s'ye argümanlar yok sayýldý"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "Ocak"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "Ţubat"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "Mart"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "Nisan"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "Mayýs"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "Haziran"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "Temmuz"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "Ađustos"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "Eylül"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "Ekim"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "Kasým"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "Aralýk"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "@var içinde düţük olasýlýklý karakter %c"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc argümaný tamamen büyükharf(le yazýlmýţ), etkisiz"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "`{' beklenirdi, `%c' görüldü"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "fiil blođu içinde dosya sonu"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "`}' beklenirdi, `%c' görüldü"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+"@strong{Not...} Info'da sahte bir çapraz-baţvuru oluţturur; bundan kaçýnmak "
+"için yazýmý deđiţtirin"
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s kullanýmdan kalkmýţ"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp pozitif bir sayýsal argüman gerektirir, `%s' deđil"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "%c%s'ye hatalý argüman"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "yok"
+
+#: makeinfo/cmds.c:1789
+#, c-format
+msgid "Bad argument to @%s"
+msgstr "@%s'ye hatalý argüman"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr "ekle"
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "@def arg'da kayýp `}'"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "Ýţlev"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "Makro"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "Özel Form"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "Deđiţken"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "Kullanýcý Seçeneđi"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "Durum Deđiţkeni"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "Yöntem"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr "kapalý"
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr "açýk"
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr "`@%s' kullanmak için `@%s' ortamý içinde ol(un)malýdýr"
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr "`%s' çýktý dosya adýndan önce yok sayýldý"
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr "stdout'a yazýlýyor olduđundan `%s' yok sayýldý"
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr "Çýktý tamponu boţ deđil"
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' bir argüman gereksinir `{ }', yalnýzca `%s' deđil"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "Dipnot `%s' için kapama } yok"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Dipnot, ebeveyn düđümsüz tanýmlanmýţ"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Dipnot içi dipnotlara izin verilmez"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "Dipnotlar"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr "%s: açýlamayan --css-dosyasý: %s"
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr "%s:%d: --css-dosyasý yorum içinde sonlandý"
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "Adsýz"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr "hayýr :"
+
+#: makeinfo/html.c:752
+#, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "[beklenmeyen] geçersiz düđüm ismi: `%s'"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "Bilinmeyen indeks `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info, `%s' indeks girdisindeki `:''yi kullanamýyor"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Ýndeks `%s' zaten mevcut"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "Bilinmeyen indeks `%1$s' ve/veya @synindex içinde `%2$s'"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr "(satýr )"
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr "(satýr %*d)"
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "@printindex içinde bilinmeyen indeks `%s'"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "`%s' indeks girdisi tüm düđümlerin dýţýnda"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(tüm düđümlerin dýţýnda)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "Bkz "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr "@item, @itemize'a argüman olarak kullanýlamaz"
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "insertion_type_pname içinde Kýrýk-Tip"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "Numaralandýrma yýđýn taţmasý"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "harflendirme taţmasý, %c'den yeniden baţlanýyor"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr "%s bir argüman gerektirir: %c öđesi için biçimlendirici"
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr "%cfloat çevreler içiçelendirilemez"
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "`@end' `%1$s' beklerdi, `%2$s' gördü"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "Eţleţen `%cend %s' yok"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s harf ya da rakam gerektirir"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "verbatim blođu içinde dosya sonu"
+
+#: makeinfo/insertion.c:1913
+#, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "`@float' çevresi dýţýnda @%s anlamlý deđil"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "önce Üst"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr ""
+"belki de sizin @top düđümünüz, @ifinfo'dan ziyade @ifnottex içine "
+"sarýlmalýdýr?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "@detailmenu ilk düđümden önce görüldü, `En Üst' düđüm oluţturuluyor"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr "`@titlepage' ve `@quotation' çevreleri dýţýnda @%s anlamlý deđil"
+
+#: makeinfo/insertion.c:2032
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "`@titlepage' çevresi dýţýnda @%s anlamlý deđil"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Eţleţmeyen `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "`%c%s' sonrasýnda birţeyler gereklidir"
+
+#: makeinfo/insertion.c:2074
+#, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "`%2$s''e hatalý argüman, `%1$s', `%3$s' kullanýlýyor"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "`@%s' blođu içinde @%s anlamlý deđil"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "`%s' blođunun içinde @itemx anlamlý deđil"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "%c%s, bir ekleme blođunun dýţýnda bulundu"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s geçerli bir ISO 639 dil kodu deđildir"
+
+#: makeinfo/lang.c:655
+#, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "tanýnmayan kodlama adý `%s'"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "üzgünüm, `%s' kodlamasý desteklenmiyor"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "geçersiz kodlanmýţ karakter `%s'"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s argüman olarak `i' ya da `j' gerektirir, %c deđil"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s argüman olarak tek karakter, `i' ya da `j' gerektirir"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "makro `%s' daha önce tanýmlanmýţ"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "iţte `%s''nin önceki tanýmý"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr "makro geniţlemesindeki \\'i, parametre adý yerine `%s' izliyor"
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Makro `%s', %d satýrýnda çok sayýda arg.la çađrýldý"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "%cson makrosu bulunamadý"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote arg.ý yalnýzca tek argümanlý makrolarda yararlý"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@%s ile eţleţmeyen @end %s"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "Çok sayýda hata! Vazgeçildi.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: uyarý: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "Yanlýţ yerleţtirilmiţ %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Daha fazla bilgi için `%s --help' yazýn.\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Kullaným: %s [SEÇENEK]... TEXINFO-DOSYASI...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"Öntanýmlý olarak Texinfo kaynak belgelerini diđer çeţitli biçemlere çevirir\n"
+"Info dosyalarý çevrimiçi Emacs ya da tek baţýna GNU Info'yla okunmak için "
+"uygundur.\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Genel seçenekler:\n"
+" --error-limit=ADET ADET hatadan sonra çýkar (öntanýmlý %d).\n"
+" --force hatalarda dahi çýktýyý korur.\n"
+" --help bu yardýmý görüntüler ve çýkar.\n"
+" --no-validate düđüm çapraz-baţvuru onaylamasýný baskýlar.\n"
+" --no-warn uyarýlarý baskýlar (fakat hatalarý deđil).\n"
+" --reference-limit=ADET en fazla ADET referansta uyar (öntanýmlý %d).\n"
+" -v, --verbose ne yapýlýyor olduđunu açýklar.\n"
+" --version sürüm bilgisini görüntüler ve çýkar.\n"
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Çýktý biçem seçimi (öntanýmlýsý Info üretmektir):\n"
+" --docbook Info yerine DocBook çýktýsý üretir.\n"
+" --html Info yerine HTML çýktýsý üretir.\n"
+" --xml Info yerine XML (TexinfoML) çýktýsý üretir.\n"
+" --plaintext Info yerine salt metin çýktýsý üretir.\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"Genel çýktý seçenekleri:\n"
+" -E, --macro-expand DOSYA makro-geniţletilmiţ kaynak çýktýsýný herhangi "
+"bir\n"
+" @setfilename'i yoksayarak DOSYA'ya yazar.\n"
+" --no-headers Info çýktýsýnda düđüm ayraçlarýný, Node:\n"
+" satýrlarýný ve menüleri baskýlar (daha kýsa "
+"çýktý\n"
+" üretmek üzere); ayrýca, öntanýmlý olarak\n"
+" standart çýktýya yazar.\n"
+" --no-split Info ya da HTML çýktýsýnýn bölünmesini "
+"baskýlar,\n"
+" yalnýzca bir çýktý dosyasý oluţturur.\n"
+" --number-sections bölüm ve kýsým numaralarýnýn çýktýsýný alýr.\n"
+" -o, --output=DOSYA çýktýyý DOSYA'ya yazar (bölünmüţ HTML ise "
+"dizine).\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Info ve salt metin için seçenekler:\n"
+" --enable-encoding aksanlý ve özel karakterlerin çýktýsýný "
+"@documentencoding'e\n"
+" dayalý olarak Info çýktýsýna yazar.\n"
+" --fill-column=ADET Info satýrlarýný ADET karakterde bitir "
+"(öntanýmlý %d)\n"
+" --footnote-style=STÝL Info'da dipnotlarýn çýktýsýný STÝL'e göre "
+"yazar:\n"
+" kendi düđümlerine koymak için `separate';\n"
+" tanýmlandýklarý düđümün sonuna koymak için\n"
+" `end' (öntanýmlý).\n"
+" --paragraph-indet=DEG Info paragraflarýný DEG boţluk girintiler "
+"(öntanýmlý %d).\n"
+" Eđer DEG `none' ise girintilemez; eđer DEG\n"
+" `asis' ise mevcut girintiyi korur.\n"
+" --spilt-size=NUM Info dosyalarýný NUM boyutuna böler (öntanýmlý "
+"%d).\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+"HTML seçenekleri:\n"
+" --css-include=DOSYA DOSYA'yý HTML <style> çýktýsýnda içer;\n"
+" eđer DOSYA - ise stdin'i oku.\n"
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+"XML ve Docbook için seçenekler:\n"
+" --output-indent=DEĐER XML elementlerini DEĐER kadar boţluk "
+"girintilendir (öntanýmlý %d).\n"
+" eđer DEĐER 0 ise yok sayýlabilen beyaz "
+"boţluk silinir..\n"
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"Girdi dosyasý seçenekleri:\n"
+" --commands-in-node-names düđüm adlarýnda @ komutlarýna izin verir.\n"
+" -D VAR VAR deđiţkenini, @set ile olduđu gibi "
+"tanýmlar.\n"
+" -I DIR DIR'ý @include arama yolu sonuna ekler.\n"
+" -P DIR DIR'ý @include arama yolu baţýna ekler.\n"
+" -U VAR VAR deđiţkeninin tanýmýný, @clear ile "
+"olduđu gibi geri alýr.\n"
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"Girdide koţullu iţlem:\n"
+" --ifdocbook Docbook oluţturulmuyorsa bile @ifdocbook\n"
+" ve @docbook'u iţler.\n"
+" --ifhtml HTML oluţturulmuyorsa bile @ifhtml ve @html'yi iţler.\n"
+" --ifinfo Info oluţturulmuyorsa bile @ifinfo'yu iţler.\n"
+" --ifplaintext Salt metin oluţturulmuyorsa bile @ifplaintext'i iţler.\n"
+" --iftex @iftex ve @tex iţler; --no-split anlamýna gelir.\n"
+" --ifxml @ifxml ve @xml'i iţler\n"
+" --no-ifdocbook @ifdocbook ve @docbook metnini iţlemez.\n"
+" --no-ifhtml @ifhtml ve @html metin iţlemez.\n"
+" --no-ifinfo @ifinfo metin iţlemez.\n"
+" --no-ifplaintext @ifplintext metin iţlemez.\n"
+" --no-iftex @iftex ve @tex metin iţlemez.\n"
+" --no-ifxml @ifxml ve @xml metin iţlemez.\n"
+"\n"
+" Ayrýca --no-ifFORMAT seçenekleri için ifnotFORMAT metnini iţler.\n"
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" @if... koţullularýnýn öntanýmlýlarý çýktý formatýna bađlýdýr:\n"
+" eđer HTML oluţturuluyorsa, --ifhtml açýk, diđerleri kapalýdýr;\n"
+" eđer Info oluţturuluyorsa, --ifinfo açýk, diđerleri kapalýdýr;\n"
+" eđer salt metin oluţturuluyorsa, --ifplaintext açýk, diđerleri kapalýdýr;\n"
+" eđer XML oluţturuluyorsa, --ifxml açýk, deiđerleri kapalýdýr.\n"
+
+#: makeinfo/makeinfo.c:452
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"Örnekler:\n"
+" makeinfo foo.texi foo'nun @setfilename'ine Info yazar\n"
+" makeinfo --html foo.texi @setfilename'e HTML yazar\n"
+" makeinfo --xml foo.texi @setfilename'e XML yazar\n"
+" makeinfo --docbook foo.texi @setfilename'e DocBook XML yazar\n"
+" makeinfo --no-headers foo.texi standart çýktýya salt metin yazar\n"
+"\n"
+" makeinfo --html --no-headres foo.texi düđüm çizgisiz, menüsüz html yazar\n"
+" makeinfe --number-sections foo.texi numaralanmýţ kýsýmlarý olan Info "
+"yazar\n"
+" makeinfo --no-split foo.texi ne büyüklükte olursa olsun tek Info "
+"dosyasý yazar\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr "%s: Tanýnamayan TEXINFO_OUTPUT_FORMAT deđeri `%s' yok sayýlýyor.\n"
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%1$s: %2$s arg sayýsal olmalýdýr, `%3$s' deđil.\n"
+
+#: makeinfo/makeinfo.c:660
+#, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "%s:makro geniţleme çýktýsý `%s' açýlamadý"
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "%s: ikinci makro geniţleme çýktýsý yok sayýlýyor `%s'.\n"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%1$s: --paragraph-indent arg. sayýsal/`none'/`asis' olmalýdýr, `%2$s' "
+"deđil.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%1$s: --footnote-style arg. `separate' ya da `end' olmalýdýr, `%2$s' deđil.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: dosya argümaný eksik.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr "Çok satýrlý komut %c%s uygunsuz kullanýldý"
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "`%s' gerekir"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "`%1$s' dizini oluţturulamýyor: %2$s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "`%2$s' içinde `%1$s' yok"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+"%s: Makro geniţlemesini, Info çýktýsý da oraya gittiđinden, stdout'a "
+"atlatýyor.\n"
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "`%3$s''den %1$s dosya `%2$s' yapýlýyor.\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "Bu %1$s, makeinfo sürümü %2$s tarafýndan, %3$s'den üretilmiţtir.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%1$s: Makro çýktý dosyasý `%2$s' hatalardan dolayý siliniyor; korumak için --"
+"force kullanýnýz.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr ""
+"%1$s: Çýktý dosyasý `%2$s' hatalardan dolayý siliniyor; korumak için --force "
+"kullanýnýz.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "Bilinmeyen komut `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "@%s'e argüman olarak bir komut vermek için {} kullanýn"
+
+#: makeinfo/makeinfo.c:2314
+#, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s küme parantezi bekledi"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Eţleţmemiţ }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "ÝSÝMSÝZ!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s eksik kapama }"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image dosyasý `%1$s' (HTML için) okunamýyor: %2$s"
+
+#: makeinfo/makeinfo.c:3315
+#, c-format
+msgid "No such file `%s'"
+msgstr "`%s' adýnda dosya yok"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image dosyasý `%1$s' (metin için) okunamýyor: %2$s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image eksik dosyaadý argümaný"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr "tanýmlanmamýţ bayrak: %s"
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "(`%s' için deđer yok)"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s bir isim gerektirir"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Eţleţen @end %s'den önce dosya sonuna ulaţýldý"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "`%.40s...' geniţleme için çok uzun; geniţletilmedi"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "@multitable ţablonunda eksik }"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "@multitable'dan sonraki baţýboţ metin `%s' yoksayýlýyor"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "Çok-tablolu öđede, çok fazla sütun (maks %d)"
+
+#: makeinfo/multi.c:555
+#, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "[beklenmeyen] çok-tabloluda sütun #%d seçilemiyor"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "çok-tablolunun dýţýndaki @tab yoksayýlýyor"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "**Son satýrdan çok-sütunlu çýktý:\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* sütun #%d: çýktý = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "Düđüm `%s' daha önce satýr %d'de tanýmlandý"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "Düđüm %s biçimleniyor...\n"
+
+#: makeinfo/node.c:716
+#, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "Düđüm `%s' bir bölümleme komutu gerektirir (ör: %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "`%c%s' komutu için bir düđüm adý belirtilmedi"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "Çýpa `%1$s' ve düđüm `%2$s' ayný dosya adýna yönlendiriyor"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "Bu @anchor komutu yoksayýldý; buraya yönelik baţvurular çalýţmayacak"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "Bu çýpayý yeniden adlandýrýn ya da `--no-split' seçeneđini kullanýn"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "Bölünmüţ-HTML dosyasýnýn sonunda beklenmeyen dizge `%s'"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "Sonraki:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "Önceki:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Yukarý:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "`%1$s' ve `%2$s' çýpalarý ayný dosya adýna yönlendiriyor"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "@anchor komutu yoksayýldý; buraya yönelik baţvurular çalýţmayacak"
+
+#: makeinfo/node.c:1347
+#, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s baţvuru mevcut olmayan düđüme `%s' (yanlýţ bölümleme nedeniyle?)"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "Menü"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "Çapraz"
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+"Düđüm `%s''in sonraki alaný ţuraya iţaret etmiyor (yanlýţ bölümleme "
+"nedeniyle?)"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Bu düđüm (%s) hatalý Önceki'ne sahip"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Önceki"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "Düđüm `%s''in önceki alaný ţuraya iţaret etmiyor"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Bu düđüm (%s) hatalý Sonraki'ne sahip"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr "`%s''in Yukarý alaný yok (yanlýţ bölümleme nedeniyle?)"
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Yukarý"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+"Düđüm `%s', Yukarý hedefi olmasýna karţýn, `%s' için eksik menü öđesi "
+"içeriyor"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "düđüm `%s''e %d kez baţvuruldu"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "baţvurulmamýţ düđüm `%s'"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr "%s siliniyor\n"
+
+#: makeinfo/node.c:1727
+#, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "`%s' dosyasý silinemiyor: %s"
+
+#: makeinfo/sectioning.c:122
+#, c-format
+msgid "Appendix %c"
+msgstr "Ek %c "
+
+#: makeinfo/sectioning.c:467
+#, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "Dahili hata (search_sectioning) `%s'!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "Dahili hata (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s kullanýmdan kalkmýţ; yerine %c%s kullanýn"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "%cüst'lü düđüm bir bölüm olarak zaten var"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "Ýţte %cüst düđüm"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%cüst, %cdüđümden önce kullanýldý, %s'e öntanýmlanýyor"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "Ýçindekiler Tablosu"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "Kýsa Ýçerik"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image dosyasý `%1$s' okunamýyor: %2$s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr "@multitable'ýn son öđesi @headitem geçersiz Docbook belgeleri üretiyor"
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: uyarý: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr " %s için"
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tSeçeneklerin tam bir listesi için `%s --help''i deneyiniz.\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Kullaným: %s [SEÇENEK]... [INFO-DOSYASI [DIR-DOSYASI]]\n"
+"\n"
+"Info dizin dosyasý DIR-DOSYASI içindeki INFO-DOSYASI'ndan dizin girdilerini\n"
+"kurar ya da siler.\n"
+"\n"
+"Seçenekler:\n"
+" --delete INFO-DOSYASI için mevcut girdileri DIR-DOSYASI'ndan "
+"siler;\n"
+" yeni girdi eklemez.\n"
+" --dir-file=ÝSÝM Info dizin dosyasýnýn adýný belirler.\n"
+" Bu, DIR-DOSYASI argümanýný kullanmaya eţdeđerdir.\n"
+" --entry=METÝN METÝN'i bir Info dizin girdisi olarak ekler.\n"
+" METÝN, bir Info öđe satýrý ţeklinde olmalý\n"
+" artý, boţlukla baţlayan sýfýr ya da daha çok fazladan "
+"satýrý bulunmalýdýr.\n"
+" Birden fazla girdi belirtirseniz hepsi eklenir.\n"
+" Hiç girdi belirtmezseniz, (girdiler) Info dosyasýndaki "
+"bilgiden\n"
+" belirlenir.\n"
+" --help bu yardýmý görüntüler ve çýkar.\n"
+" --info-file=DOSYA dizine kurulacak Info dosyasýný belirler.\n"
+" Bu, INFO-DOSYASI argümanýný kullanmaya eţdeđerdir.\n"
+" --info-dir=DIR --dir-file=DIR/dir ile ayný.\n"
+" --item=METÝN --entry METÝN ile ayný.\n"
+" Bir Info dizin girdisi, gerçekte bir menü öđesidir.\n"
+" --quiet uyarýlarý baskýlar.\n"
+" --remove --delete ile ayný.\n"
+" --section=KIS bu dosyanýn girdilerini dizinin KIS bölümüne koyar.\n"
+" Bir bölümden fazlasýný belirtirseniz, tüm girdiler\n"
+" herbir bölüme eklenir.\n"
+" Hiçbir bölüm belirtmezseniz, (bölümler) Info "
+"dosyasýndaki bilgiden\n"
+" belirlenir.\n"
+" --version sürüm bilgisini görüntüler ve çýkar.\n"
+
+#: util/install-info.c:488
+#, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"Bu, .../info/dir dosyasý olup, (dir)Üst adý verilen, Info\n"
+"hiyerarţisinin en üst düđümünü içerir.\n"
+"Info'yu ilk çalýţtýrdýđýnýzda bu düđüme bakarak baţlýyor olursunuz.\n"
+"\n"
+"%s\tBu, INFO ađacýnýn tepesidir\n"
+"\n"
+" Bu (Dizin düđümü), temel konularýn bir menüsünü verir.\n"
+" \"q\" tuţuyla çýkar, \"?\" ile tüm Info komutlarýný listeler, \"d\" ile "
+"buraya döner,\n"
+" \"h\" ile yeni baţlayanlar için bir klavuz alabilir,\n"
+" \"mEmacs<Return>\" ile Emacs klavuzunu ziyaret edebilirsiniz, vs.\n"
+"\n"
+" Emacs'ta, bir menü öđesi ya da çapraz baţvuru üzerinde sađ fare tuţunu\n"
+" týklayarak seçim yapabilirsiniz.\n"
+"\n"
+"%s\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%1$s: (%2$s) okunamýyor ve (%3$s) oluţturulamýyor\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: boţ dosya"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "Eţleţen END-INFO-DIR-ENTRY'siz START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "Eţleţen START-INFO-DIR-ENTRY'siz END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr "%s: zaten dir dosyasý var: %s\n"
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: Info dosyasýný yalnýzca bir kez belirtin.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "fazladan komut satýrý argümaný `%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "Girdi dosyasý belirtilmemiţ; daha fazla bilgi için --help deneyin."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "dizin dosyasý belirtilmemiţ; daha fazla bilgi için --help deneyin."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "`%s' içinde info dizin girdisi yok"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "`%2$s' dosyasý için menü öđesi `%1$s' zaten mevcut"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "`%s' için girdi bulunamadý; hiçbir ţey silinmedi"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "bu yardýmý görüntüler ve çýkar"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "iţlemden sonra geçici dosyalarý etrafta bulundurur"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "iţlemden sonra geçici dosyalarý etrafta bulundurmaz (öntanýmlý)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "çýktýyý DOSYA'ya gönderir"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "sürüm bilgisini görüntüler ve çýkar"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Kullaným: %s [SEÇENEK]... DOSYA...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Her TeX çýktý DOSYAsý için sýralanmýţ bir indeks oluţturur.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr ""
+"Genellikle DOSYA... bir `foo.texi' belgesi için `foo.%c%c' olarak "
+"belirtilir.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: bir texinfo indeks dosyasý deđil"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "%s'i yeniden açmada hata"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "%s'de sayfa numarasý yok"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "%s girdisi, ikincil isimli bir girdiyi takip ediyor"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" geçersiz"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s geçersiz bir ISO kodu, %c kullanýlýyor"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Birden fazla makro geniţleme çýktýsý belirtilemez"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "Dosya mevcut, ancak bir dizin deđil"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "Çapraz baţvuru kurulacak ilk argüman boţ olmayabilir"
+
+#~ msgid "see "
+#~ msgstr "bkz "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "`.' ya da `,' çapraz baţvuruyu izlemelidir, %c'yi deđil"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "@inforef'e ilk argüman boţ olmayabilir"
+
+#~ msgid "Node:"
+#~ msgstr "Düđüm:"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%s: Ýçindekiler burada olmalýydý, ama bulunamadý"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: Info dizinini yalnýzca bir kez belirtin.\n"
diff --git a/Build/source/utils/texinfo/po/zh_CN.gmo b/Build/source/utils/texinfo/po/zh_CN.gmo
new file mode 100644
index 00000000000..2c5fc242354
--- /dev/null
+++ b/Build/source/utils/texinfo/po/zh_CN.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/zh_CN.po b/Build/source/utils/texinfo/po/zh_CN.po
new file mode 100644
index 00000000000..3ac45341101
--- /dev/null
+++ b/Build/source/utils/texinfo/po/zh_CN.po
@@ -0,0 +1,3050 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the texinfo package.
+# Wang Li <charles@linux.net.cn>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.2\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2002-05-06 16:10+0800\n"
+"Last-Translator: Wang Li <charles@linux.net.cn>\n"
+"Language-Team: Chinese (simplified) <i18n-translation@lists.linux.net.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=gb2312\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "ĎňÇ°ŇĆśŻŇť¸ö×Öˇű"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "ĎňşóŇĆśŻŇť¸ö×Öˇű"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "ŇĆśŻľ˝ąžĐоĿŞÍˇ"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "ŇĆśŻľ˝ąžĐĐľÄĊβ"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "ĎňÇ°ŇĆśŻŇť¸öľĽ´Ę"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "ĎňşóŇĆśŻŇť¸öľĽ´Ę"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "ÉžłýšâąęÎťÖĂľÄ×Öˇű"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "ÉžłýšâąęÖŽşóľÄ×Öˇű"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "ČĄĎűťňÍËłö˛Ů×÷"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "˝ÓĘÜ(ťňÇżÖĆÍęłÉ)ąžĐĐ"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "Ô­Ńů˛ĺČëĎÂŇť¸ö×Öˇű"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "˛ĺČë¸Ă×Öˇű"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "˛ĺČëŇť¸ö tab ×Öˇű"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "ąäťťšâąę´Ś×ÖˇűľÄ´ÎĐň"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "ŐłĚů×îşóŇť´ÎźôÇĐľÄÄÚČÝ"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "źôĚů˛žÎŞżŐ"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "ŐłĚůÉĎ´ÎźôÇĐ"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "źôÇĐÖÁąžĐĐĊβ"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "źôÇĐÖÁąžĐĐżŞÍˇ"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "źôÇĐšâąęÖŽşóľÄľĽ´Ę"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "źôÇĐšâąęÖŽÇ°ľÄľĽ´Ę"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "ĂťÓвšĆë"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "δ˛šĆë"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "ÁОٿÉÄܾIJšĆë"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "ΨҝľÄ˛šĆë"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "Ňť¸ö˛šĆ룺\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d ¸ö˛šĆ룺\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "˛ĺČ벚Ćë"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "ŐýÔÚ´´˝¨˛šĆë..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "šöśŻ˛šĆë´°żÚ"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "Îޡ¨ĎÔĘž˝Ĺע"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "ÔÚÁíŇť¸ö´°żÚÖĐĎÔĘžÓڸýھăĎŕšŘľÄ˝Ĺע"
+
+#: info/footnotes.h:26
+msgid "---------- Footnotes ----------"
+msgstr "---------- ˝Ĺע ----------"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "ÔÚąžÎÄźţľÄË÷ŇýÖĐËŃË÷×Öˇű´Ž"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "ŐýÔÚËŃË÷Ë÷ŇýĚőÄż..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "δŐŇľ˝Ë÷ŇýĄŁ"
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "Ë÷ŇýĚőÄżŁş"
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr "´Ó×îşóŇť¸öĄ°\\[index-search]ĄąĂüÁîתŇĆľ˝ĎÂŇť¸öĆĽĹäľÄË÷ŇýĎîÄż"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "ĂťÓĐÉĎŇť¸öË÷ŇýËŃË÷×Öˇű´ŽĄŁ"
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "ĂťÓĐË÷ŇýĚőÄżĄŁ"
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "ĂťÓĐ %sË÷ŇýĚőÄżşŹÓĐĄ°%sĄąĄŁ"
+
+#: info/indices.c:376
+msgid "more "
+msgstr "¸üśŕ "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr "ż´˛ťľ˝Őâ¸ö"
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr ""
+"ÔÚ %2$s ÖĐŐŇľ˝Ą°%1$sĄąĄŁ(Ą°\\[next-index-match]Ąą˝ŤĘÔ͟ѰŐŇĎÂŇť¸öĆĽĹ䥣)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "ŐýÔÚËŃË÷Ą°%sĄąľÄË÷Ňý..."
+
+#: info/indices.c:596
+#, fuzzy, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr "ÔÚżÉÓĂľÄ info ÎÄźţľÄË÷ŇýÖĐžů˛ťşŹÓĐĄ°%sĄąĄŁ"
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "ŐűŔíËůÓĐŇŃÖŞ info ÎÄźţşŹÓĐąť˛éŃŻ×Öˇű´ŽľÄË÷Ňý˛˘˝¨Á˘Ňť¸ö˛ËľĽ"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr "Ë÷ŇýşŹÓĐŁş"
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* ˛ËľĽŁşĆäË÷ŇýşŹÓĐĄ°%sĄąľÄ˝ÚľăŁş\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "ł˘ĘÔ --¸üśŕľÄÇóÖúĐĹϢĄŁ\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"°ćȨËůÓĐ (C) %s ×ÔÓÉČíźţťů˝đťáĄŁ\n"
+"ąžČíźţĂťÓĐČκξŁąŁĄŁÄúżÉŇÔ°´ŐŐͨÓĂ\n"
+"šŤš˛ĐíżÉÖ¤(GPL)ľÄĚőżîˇ˘ĐĐąžČíźţĄŁ\n"
+"Ő⡽ĂćľÄĎęÇ飏ÇëÔÄśÁĂűÎŞ COPYING ľÄÎÄźţĄŁ\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "ŐҲťľ˝şŹÓĐĄ°%sĄąľÄË÷Ňý\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"Óᨣş%s [ŃĄĎî]... [˛ËľĽĎî...]\n"
+"\n"
+"ÔÄśÁ Info ¸ńĘ˝ľÄÎÄľľĄŁ\n"
+"\n"
+"ŃĄĎ\n"
+" --apropos=STRING ÔÚËůÓĐĘÖ˛áľÄËůÓĐË÷ŇýÖĐËŃË÷ STRINGĄŁ\n"
+" -d, --directory=DIR ˝ŤÄżÂź DIR ĚíźÓľ˝ INFOPATH ÖĐĄŁ\n"
+" --dribble=FILENAME ˝ŤÓĂť§ľÄ°´źüźÇÂźÔÚÎÄźţ FILENAME ÖĐĄŁ\n"
+" -f, --file=FILENAME Ö¸ś¨ŇŞÔÄśÁľÄ Info ÎÄźţĄŁ\n"
+" -h, --help ĎÔĘž¸ĂÇóÖúĐĹϢ˛˘ÍËłöĄŁ\n"
+" --index-search=STRING תŇĆľ˝Ë÷ŇýĚőÄż STRING ËůÖ¸ĎňľÄ˝ÚľăĄŁ\n"
+" -n, --node=NODENAME Ö¸ś¨Ę×ĎČÔÄśÁľÄ Info ÎÄźţÖоĽھ㥣\n"
+" -o, --output=FILENAME ˝ŤŃĄÖоĽھăĘäłöľ˝ÎÄźţ FILENAME ÖĐĄŁ\n"
+" -R, --raw-escapes ˛ťŇŞÉžłýŔ´×Ô man ŇłĂćľÄ ANSI תŇĺˇűĄŁ\n"
+" --restore=FILENAME ´ÓÎÄźţ FILENAME ÖĐśÁČĄłőĘź°´źüĄŁ\n"
+" -O, --show-options, --usage תŇĆľ˝ĂüÁîĐĐŃĄĎî˝ÚľăĄŁ\n"
+"%s --subnodes ľÝšéĘäłö˛ËľĽĚőÄżĄŁ\n"
+" --vi-keys ĘšÓĂŔŕ vi şÍŔŕ less ľÄ°´źü°óś¨ĄŁ\n"
+" --version ĎÔĘž°ćąžĐĹϢ˛˘ÍËłöĄŁ\n"
+"\n"
+"Čçšű´ćÔÚˇÇŃĄĎî˛ÎĘýŁŹÔňľÚŇť¸öˇÇŃĄĎî˛ÎĘýžÍĘÇĆđľă˛ËľĽĚőÄżŁť\n"
+"ËüĘÇ´Ó INFOPATH Öоĥ°dirĄąÎÄźţÖĐËŃË÷śřľĂľÄĄŁ\n"
+"ČçšűËŃË÷˛ťľ˝ŁŹinfo žÍşĎ˛˘ËůÓоĥ°dirĄąÎÄźţ˛˘ĎÔĘžşĎ˛˘˝ášűĄŁ\n"
+"ËůÓĐĘŁÓŕľÄ˛ÎĘýžů×÷ÎŞĎŕśÔÓÚÔÄśÁľÄłőĘź˝ÚľăľÄ˛ËľĽĎîÄżĂűłĆĄŁ\n"
+"\n"
+"ĘžŔýŁş\n"
+" info ĎÔĘžśĽ˛ăĿŸ˛ËľĽ\n"
+" info emacs ´ÓśĽ˛ăĿŸÖĐľÄ emacs ˝ÚľăżŞĘź\n"
+" info emacs buffers ´Ó emacs ĘÖ˛áľÄ buffers ˝ÚľăżŞĘź\n"
+" info --show-options emacs ´Ó emacs ľÄĂüÁîĐĐŃĄĎî˝ÚľăżŞĘź\n"
+" info -f ./foo.info ĎÔĘžÎÄźţ ./foo.infoŁŹśř˛ťĘÇËŃË÷ĿŸ\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"Ç뽍´íÎ󹨸桢ËÍľ˝ bug-texinfo@gnu.orgŁŹ\n"
+"Ňť°ăľÄÎĘĚâşÍĚÖÂŰÇ롢ËÍľ˝ help-texinfo@gnu.orgĄŁ\n"
+"Texinfo Ö÷ŇłŁşhttp://www.gnu.org/software/texinfo/"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "Îޡ¨ŐŇľ˝˝ÚľăĄ°%sĄąĄŁ"
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "Îޡ¨ŐŇľ˝˝ÚľăĄ°(%s)%sĄąĄŁ"
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "Îޡ¨ŐŇľ˝Ňť¸ö´°żÚŁĄ"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "šâąęĂťÓĐłöĎÖÔڸô°żÚľÄ˝ÚľăÖŽÖĐŁĄ"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "Îޡ¨Éžłý×îşóľÄ´°żÚĄŁ"
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "¸Ă˝ÚľăÖĐĂťÓв˾ĽĄŁ"
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "¸Ă˝ÚľăÖĐĂťÓĐ˝ĹעĄŁ"
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "¸Ă˝ÚľăÖĐĂťÓĐ˝ť˛ćŇýÓĂĄŁ"
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "¸Ă˝ÚľăÖĐĂťÓĐĄ°%sĄąÖ¸Őë"
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "δ֪ľÄ Info ĂüÁ%cĄąŁťÇëŇÔĄ°?ĄąťńľĂ°ďÖúĄŁ"
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "ÖŐśËŔŕĐÍĄ°%sĄąľÄÄÜÁŚ˛ť×ăŇÔÖ§łÖ Info ľÄÔËĐĐĄŁ"
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "ÄúŇŃž­ÔڸýھăľÄ×îşóŇť¸öŇłĂćÖĐÁËĄŁ"
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "ÄúŇŃž­ÔڸýھăľÄľÚҝҳÖĐÁËĄŁ"
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "ÖťÓĐŇť¸ö´°żÚĄŁ"
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "˝ášű´°żÚ˝ŤťáĚŤĐĄĄŁ"
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "ĂťÓĐ×ăšťľÄżŐźäÓĂÓÚÇóÖú´°żÚŁŹÇëÉžłýŇť¸ö´°żÚĄŁ"
+
+#: info/infodoc.c:46 info/infodoc.c:95
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr ""
+"Info ´°żÚÖоĝůąžĂüÁî\n"
+"******************************\n"
+
+#: info/infodoc.c:49
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr "\\%-10[quit-help] ÍËłö¸ĂÇóÖúĄŁ\n"
+
+#: info/infodoc.c:50
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr "\\%-10[quit] Ňť˛˘ÍËłö InfoĄŁ\n"
+
+#: info/infodoc.c:51
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr "\\%-10[get-info-help-node] ľ÷ÓĂ Info ˝ĚłĚĄŁ\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr ""
+"ŃĄÔńĆäËü˝ÚľăŁş\n"
+"----------------------\n"
+
+#: info/infodoc.c:55
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr "\\%-10[next-node] ŇĆśŻľ˝ąž˝ÚľăľÄĄ°ĎÂŇť¸öĄą˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:56
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr "\\%-10[prev-node] ŇĆśŻľ˝ąž˝ÚľăľÄĄ°ÉĎŇť¸öĄą˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:57
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr "\\%-10[up-node] ŇĆśŻľ˝ąž˝ÚľăľÄĄ°Éϲ㥹˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:58
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr ""
+"\\%-10[menu-item] ŃĄČĄÓÉĂűłĆÖ¸ś¨ľÄ˛ËľĽĎîÄżĄŁ\n"
+" ŃĄČĄŇť¸ö˛ËľĽĎîÄżľźÖÂŃĄÖĐÁíŇť¸ö˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:60
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr "\\%-10[xref-item] ¸úË潝˛ćŇýÓĂĄŁśÁČĄŇýÓĂľÄĂűłĆĄŁ\n"
+
+#: info/infodoc.c:61
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr "\\%-10[history-node] ŇĆśŻľ˝ąž´°żÚľÄ×îşóŇť¸öżÉźűľÄ˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:62
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr "\\%-10[move-to-next-xref] Ěřתľ˝ąž˝ÚľăÖĐľÄĎÂŇť¸öłŹÎÄąžÁŹ˝ÓĄŁ\n"
+
+#: info/infodoc.c:63
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr "\\%-10[move-to-prev-xref] Ěřתľ˝ąž˝ÚľăÖĐľÄÉĎŇť¸öłŹÎÄąžÁŹ˝ÓĄŁ\n"
+
+#: info/infodoc.c:64
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr "\\%-10[select-reference-this-line] ¸úËćšâąęĎ¾ijŹÎÄąžÁŹ˝ÓĄŁ\n"
+
+#: info/infodoc.c:65
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr ""
+"\\%-10[dir-node] ŇĆśŻľ˝Ą°directoryĄą˝ÚľăĄŁľČźŰÓÚĄ°\\[goto-node] (DIR)ĄąĄŁ\n"
+
+#: info/infodoc.c:66
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr "\\%-10[top-node] ŇĆśŻľ˝śĽ˛ă˝ÚľăĄŁľČźŰÓÚĄ°\\[goto-node] TopĄąĄŁ\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr ""
+"ÔÚŇť¸ö˝ÚľăÖĐŇĆśŻŁş\n"
+"---------------------\n"
+
+#: info/infodoc.c:70
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr "\\%-10[beginning-of-node] ŇĆśŻľ˝ąž˝ÚľăľÄżŞÍˇĄŁ\n"
+
+#: info/infodoc.c:71
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr "\\%-10[end-of-node] ŇĆśŻľ˝ąž˝ÚľăľÄĊβĄŁ\n"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr " %-10s ĎňÇ°šöśŻŇťĐĐĄŁ\n"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr " %-10s ĎňşóšöśŻŇťĐĐĄŁ\n"
+
+#: info/infodoc.c:74
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr "\\%-10[scroll-forward] ĎňÇ°šöśŻŇťŇłĄŁ\n"
+
+#: info/infodoc.c:75
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr "\\%-10[scroll-backward] ĎňşóšöśŻŇťŇłĄŁ\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr ""
+"ĆäËüĂüÁ\n"
+"---------------\n"
+
+#: info/infodoc.c:79
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr "\\%-10[menu-digit] ŃĄČĄ˝Úľă˛ËľĽÖоľÚŇťÖÁľÚžĹ¸öĎîÄżĄŁ\n"
+
+#: info/infodoc.c:80
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr "\\%-10[last-menu-item] ŃĄČĄ˝Úľă˛ËľĽľÄ×îşóŇť¸öĎîÄżĄŁ\n"
+
+#: info/infodoc.c:81
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr ""
+"\\%-10[index-search] ÔÚąž Info ÎÄźţľÄË÷ŇýĚőÄżÖĐËŃË÷Ö¸ś¨ľÄ×Öˇű´ŽŁŹ\n"
+" ˛˘ŃĄÔńľÚŇť¸öŐŇľ˝ľÄĚőÄżËůŇýÓþĽھ㥣\n"
+
+#: info/infodoc.c:83
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr ""
+"\\%-10[goto-node] ŇĆśŻľ˝ÓÉĂű×ÖÖ¸ś¨ľÄ˝ÚľăĄŁ\n"
+" ÄúťšżÉŇÔŇÔ (ÎÄźţĂű)˝ÚľăĂű ľÄĐÎĘ˝¸řłöÎÄźţĂűĄŁ\n"
+
+#: info/infodoc.c:85
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr ""
+"\\%-10[search] ĎňÇ°ËŃË÷Ö¸ś¨ľÄ×Öˇű´Ž\n"
+" ˛˘ŃĄÔńËůŐŇľ˝ľÄĎÂŇť¸öĘľŔýËůÔھĽھ㥣\n"
+
+#: info/infodoc.c:87
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr ""
+"\\%-10[search-backward] ĎňşóËŃË÷Ö¸ś¨ľÄ×Öˇű´Ž\n"
+" ˛˘ŃĄÔńËůŐŇľ˝ľÄÉĎŇť¸öĘľŔýËůÔھĽھ㥣\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s ÍËłöąžÇóÖúĄŁ\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s Ňť˛˘ÍËłö InfoĄŁ\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s ľ÷ÓĂ Info ˝ĚłĚĄŁ\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s ŇĆśŻľ˝ąž˝ÚľăľÄĄ°ĎÂŇť¸öĄą˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s ŇĆśŻľ˝ąž˝ÚľăľÄĄ°ÉĎŇť¸öĄą˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s ŇĆśŻľ˝ąž˝ÚľăľÄĄ°Éϲ㥹˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s ŃĄČĄÓÉĂűłĆÖ¸ś¨ľÄ˛ËľĽĎîÄżĄŁ\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " ŃĄČĄŇť¸ö˛ËľĽĎîÄż˝ŤŃĄÖĐÁíŇť¸ö˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s ¸úË潝˛ćŇýÓĂĄŁśÁČĄŇýÓĂľÄĂűłĆĄŁ\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s ŇĆśŻľ˝ąž´°żÚÖĐľÄ×îşóŇť¸öżÉźűľÄ˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s Ěřתľ˝ąž˝ÚľăÖĐľÄĎÂŇť¸öłŹÎÄąžÁŹ˝ÓĄŁ\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s ¸úËćšâąęÎťÖþijŹÎÄąžÁŹ˝ÓĄŁ\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s ŇĆśŻľ˝Ą°directoryĄą˝ÚľăĄŁľČźŰÓÚĄ°g (DIR)ĄąĄŁ\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s ŇĆśŻľ˝śĽ˛ă˝ÚľăĄŁľČźŰÓÚĄ°g TopĄąĄŁ\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s ĎňÇ°šöśŻŇťŇłĄŁ\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s ĎňşóšöśŻŇťŇłĄŁ\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s תŇĆľ˝ąž˝ÚľăľÄżŞÍˇĄŁ\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s תŇĆľ˝ąž˝ÚľăľÄĊβĄŁ\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s ĎňÇ°šöśŻŇťĐĐĄŁ\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s ĎňşóšöśŻŇťĐĐĄŁ\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s ŃĄČĄ˝Úľă˛ËľĽÖоľÚŇťÖÁľÚžĹ¸öĎîÄżĄŁ\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s ŃĄČĄ˝Úľă˛ËľĽÖĐľÄ×îşóŇť¸öĎîÄżĄŁ\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s ÔÚąž Info ÎÄźţÖĐľÄË÷ŇýĚőÄżÖĐËŃË÷Ö¸ś¨ľÄ×Öˇű´ŽŁŹ\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " ˛˘ŃĄÔńľÚŇť¸öŐŇľ˝ľÄĚőÄżËůŇýÓþĽھ㥣\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s ŇĆśŻľ˝ÓÉĂű×ÖÖ¸ś¨ľÄ˝ÚľăĄŁ\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " ÄúťšżÉŇÔÍŹĘą¸řłöÎÄźţĂűŁŹĐÎʽΪ (ÎÄźţĂű)˝ÚľăĂűĄŁ\n"
+
+#: info/infodoc.c:133
+#, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s ĎňÇ°ËŃË÷Ö¸ś¨ľÄ×Öˇű´ŽŁŹ\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " ˛˘ŃĄÔńŐŇľ˝ľÄĎÂŇť¸öĘľŔýËůÔھĽھ㥣\n"
+
+#: info/infodoc.c:135
+#, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s ĎňşóËŃË÷Ö¸ś¨ľÄ×Öˇű´Ž\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "ľąÇ°ËŃË÷¡žśÎŞŁş\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Info ´°żÚÖĐżÉÓĂľÄĂüÁ\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"ťŘĎÔÇřÖĐżÉÓĂľÄĂüÁ\n"
+"\n"
+
+#: info/infodoc.c:347
+#, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"ŇÔĎÂĂüÁîÖťÄÜͨšý %s ľ÷ÓĂŁş\n"
+"\n"
+
+#: info/infodoc.c:351
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"ŇÔĎÂĂüÁî¸ůąžÎޡ¨ľ÷ÓĂŁş\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- ÓĂĄ°\\[history-node]ĄąťňĄ°\\[kill-node]ĄąÍËłö ---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "ĎÔĘžÇóÖúĎűϢ"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "ˇĂÎĘ Info ˝ÚľăĄ°(info)HelpĄą"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "´ňÓĄšŘÓÚ KEY ľÄÎÄľľ"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "ËľĂ÷°´źüŁş%s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s δś¨Ň奣"
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s δś¨Ň奣"
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s ąťś¨ŇĺÎŞ %sĄŁ"
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "ĎÔĘžÖ´Đиřś¨ĂüÁîËůĐčľÄ°´źü"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr ""
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "Ą°%sĄąÎ´°óś¨ľ˝Čκΰ´źü"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s ˛ťÄÜͨšý %s ľ÷ÓĂĄŁ"
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s żÉŇÔͨšý %s ľ÷ÓĂĄŁ"
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "ĂťÓĐĂűÎŞĄ°%sĄąľÄşŻĘý"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"°ćȨËůÓĐ (C) %s ×ÔÓÉČíźţťů˝đťáĄŁ\n"
+"ąžČíźţĂťÓĐČκξŁąŁĄŁÄúżÉŇÔ°´ŐŐͨÓĂ\n"
+"šŤš˛ĐíżÉÖ¤(GPL)ľÄĚőżîˇ˘ĐĐąžČíźţĄŁ\n"
+"Ő⡽ĂćľÄĎęÇ飏ÇëÔÄśÁĂűÎŞ COPYING ľÄÎÄźţĄŁ\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr "´íÎóľÄ˛ÎĘýĘý"
+
+#: info/infokey.c:201
+#, c-format
+msgid "cannot open input file `%s'"
+msgstr "Îޡ¨´ňżŞĘäČëÎÄźţĄ°%sĄą"
+
+#: info/infokey.c:215
+#, c-format
+msgid "cannot create output file `%s'"
+msgstr "Îޡ¨´´˝¨ĘäłöÎÄźţĄ°%sĄą"
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr "Đ´Č륰%sĄąĘąłö´í"
+
+#: info/infokey.c:232
+#, c-format
+msgid "error closing output file `%s'"
+msgstr "šŘąŐĘäłöÎÄźţĄ°%sĄąĘąłö´í"
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr "°´źüĐňÁĐšýł¤"
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr "ŇĹŠ°´źüĐňÁĐ"
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr "˛ťÔĘĐíľÄżŐ×Öˇű (\\\\000)"
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr "˛ťÔĘĐíľÄżŐ×Öˇű (^%c)"
+
+#: info/infokey.c:665
+msgid "missing action name"
+msgstr "ŇĹŠśŻ×÷ĂűłĆ"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr "˝ÚĚŤł¤"
+
+#: info/infokey.c:688
+#, c-format
+msgid "unknown action `%s'"
+msgstr "δ֪ľÄśŻ×÷Ą°%sĄą"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr "śŻ×÷Ăűšýł¤"
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr "śŻ×÷Ą°%sĄąÖŽşółöĎÖśîÍâľÄ×Öˇű"
+
+#: info/infokey.c:723
+msgid "missing variable name"
+msgstr "ŇĹŠąäÁżĂű"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr "ąäÁżĂűÖŽşóŇĹŠÁËĄ°=Ąą"
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr "ąäÁżĂűšýł¤"
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr "Öľšýł¤"
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr "Ą°%sĄąŁŹĐĐ %uŁş"
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Óᨣş%s [ŃĄĎî]... [ĘäČëÎÄźţ]\n"
+"\n"
+"˝Ť infokey Ô´ÎÄźţąŕŇëÎŞ infokey ÎÄźţĄŁśÁČĄĘäČëÎÄźţ(ÄŹČĎÎŞ\n"
+"$HOME/.infokey) ˛˘˝ŤąŕŇëÍęłÉľÄźüÎÄźţĐ´Čëľ˝ (ÄŹČĎÎŞ) $HOME/.infoĄŁ\n"
+"\n"
+"ŃĄĎ\n"
+" --output FILE Ęäłöľ˝ÎÄźţ FILE śř˛ťĘÇ $HOME/.info ÖĐĄŁ\n"
+" --help ĎÔĘž¸ĂÇóÖúĐĹϢ˛˘ÍËłöĄŁ\n"
+" --version ĎÔĘž°ćąžĐĹϢ˛˘ÍËłöĄŁ\n"
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr "şöÂԡǡ¨ľÄ infokey ÎÄźţĄ°%sĄą - ĚŤĐĄ"
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr "şöÂԡǡ¨ľÄ infokey ÎÄźţĄ°%sĄą - ĚŤ´ó"
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr "śÁČë infokey ÎÄźţĄ°%sĄąĘąłö´í - śÁČëÖĐśĎ"
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr "ˇÇˇ¨ľÄ infokey ÎÄźţĄ°%sĄą (´íÎóľÄ magic ąŕşĹ) -- ÔËĐĐ infokey ŇÔąă¸üĐÂ"
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr "ÄúľÄ infokey ÎÄźţĄ°%sĄą šýĘąÁË -- ÔËĐĐ infokey ŇÔąă¸üĐÂ"
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr "ˇÇˇ¨ľÄ infokey ÎÄźţĄ°%sĄą (´íÎóľÄ˝Úł¤śČ) -- ÔËĐĐ infokey ŇÔąă¸üĐÂ"
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr "ˇÇˇ¨ľÄ infokey ÎÄźţĄ°%sĄą (´íÎóľÄ˝ÚąŕÂë) -- ÔËĐĐ infokey ŇÔąă¸üĐÂ"
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr "infokey ÎÄźţÖоĴíÎóĘýžÝ -- şöÂÔijЊ°´źü°óś¨"
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr "infokey ÎÄźţÖоĴíÎóĘýžÝ -- şöÂÔijЊąäÁżÉčÖĂ"
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "śÁČĄ Info ĂüÁîĂűłĆ˛˘ËľĂ÷Ëü"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "ËľĂ÷ĂüÁ"
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "ÔÚťŘĎÔÇřśÁČëĂüÁîĂű˛˘Ö´ĐĐËü"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "Îޡ¨ÔÚŐâŔďÔËĐĐĄ°ťŘĎÔÇřĄąĂüÁ"
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "δ֪ľÄĂüÁ%sĄą"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "É蜨ĎÔĘž´°żÚľÄ¸ßśČ"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "˝ŤĆÁÄť¸ßśČÉčÖĂÎŞ (%d)Łş"
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+" ŐűŔíÔ´ÎÄźţŇÔĘšąžÎÄźţ°üŔ¨Łş\n"
+"\n"
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "Îޡ¨˛Ů×÷ÎÄźţ %sĄŁ\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* ˛ËľĽŁş\n"
+" (ÎÄźţ)˝Úľă ĐĐ ´óĐĄ şŹÓĐÎÄźţ\n"
+" ---------- ----- ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"ŐâŔďĘÇÄú×î˝üˇĂÎʽھăľÄ˛ËľĽĄŁ\n"
+"´Ó˛ËľĽÖĐŃĄÔńŇť¸öŁŹťňÔÚĆäËü´°żÚÖĐĘšÓĂĄ°\\[history-node]ĄąĄŁ\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "ʚҝ¸ö´°żÚşŹÓĐŇť¸ö°üŔ¨ËůÓĐľąÇ°ˇĂÎʽھăľÄ˛ËľĽ"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "ŃĄÔńŇť¸öŇŃž­ÔڿɟűľÄ´°żÚÖСĂÎʾĽھă"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "ŃĄÔńŇѡĂÎʾĽھ㣺"
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "ŇýÓĂĎűʧÁËŁĄ(%s)ĄŁ"
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"ťśÓ­ĘšÓĂ Info %s °ćĄŁĘäČë \\[get-help-window] ŇÔťńľĂ°ďÖúŁŹ\\[menu-item] ˝ŤľĂ"
+"ľ˝˛ËľĽĄŁ"
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "ĎňĎÂŇĆśŻľ˝ĎÂŇťĐĐ"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "ĎňÉĎŇĆśŻľ˝ÉĎŇťĐĐ"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "ŇĆśŻľ˝ĐĐľÄĊβ"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "ŇĆśŻľ˝ĐоĿŞÍˇ"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "ĎÂŇť¸ö"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "¸úËćĎÂŇť¸ö˝Úľă..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "ŃĄÔńľÚŇť¸ö˛ËľĽĎî..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "ŃĄÔńĎÂŇť¸ö˝Úľă..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "ĎňÉĎŇĆśŻ %d ´ÎŁŹśřşóşóŇĆĄŁ"
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "ąžÎÄľľÖĐĂťÓиüśŕľÄ˝ÚľăĄŁ"
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "ąž˝ÚľăĂťÓĐĄ°ÉĎŇť¸öĄąĄŁ"
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "ÔÚąž´°żÚÖĐĎňÉĎŇĆśŻĄŁ"
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "ÔÚąžÎÄľľÖĐĂťÓĐąž˝ÚľăľÄĄ°ÉĎŇť¸öĄąťňĄ°Éϲ㥹˝ÚľăĄŁ"
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "ÔÚąž´°żÚÖĐĎňÉϲăŇĆśŻ"
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "ŇĆśŻľ˝Ç°Ňť¸öľÄ×îşóŇť¸ö˛ËľĽĎîÄżĄŁ"
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "ÔÚ˝Úľă˝áššÖĐĎňÇ°ťňĎňĎ²ăŇĆśŻ"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "ÔÚ˝Úľă˝áššÖĐĎňşóťňĎňÉϲăŇĆśŻ"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "ÔÚąž´°żÚÖĐĎňÇ°šöśŻ"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "ÔÚąž´°żÚÖĐĎňÇ°šöśŻ˛˘ÉčÖĂÎŞÄŹČĎ´°żÚ´óĐĄ"
+
+#: info/session.c:1221
+msgid "Scroll forward in this window staying within node"
+msgstr "ÔÚąž´°żÚÖĐĎňÇ°šöśŻ(˛ť´ŠÔ˝˝Úľă)"
+
+#: info/session.c:1229
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr "ÔÚąž´°żÚÖĐĎňÇ°šöśŻ(˛ť´ŠÔ˝˝Úľă)˛˘ÉčÖĂÄŹČĎ´°żÚ´óĐĄ"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "ÔÚąž´°żÚÖĐĎňşóšöśŻ"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "ÔÚąž´°żÚÖĐĎňşóšöśŻ˛˘ÉčÖĂÎŞÄŹČĎ´°żÚ´óĐĄ"
+
+#: info/session.c:1254
+msgid "Scroll backward in this window staying within node"
+msgstr "ÔÚąž´°żÚÖĐĎňşóšöśŻ(˛ť´ŠÔ˝˝Úľă)"
+
+#: info/session.c:1262
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr "ÔÚąž´°żÚÖĐĎňşóšöśŻ(˛ť´ŠÔ˝˝Úľă)˛˘ÉčÖĂÎŞÄŹČĎ´°żÚ´óĐĄ"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "ŇĆśŻľ˝ąž˝ÚľăľÄżŞÍˇ"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "ŇĆśŻľ˝ąž˝ÚľăľÄĊβ"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "°´ĐĐĎňĎšöśŻ"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "°´ĐĐĎňÉĎšöśŻ"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "ĎňĎšöśŻ°ë¸öĆÁÄť"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "ĎňÉĎšöśŻ°ë¸öĆÁÄť"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "ŃĄÔńĎÂŇť¸ö´°żÚ"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "ŃĄÔńÉĎŇť¸ö´°żÚ"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "˛đˇÖľąÇ°´°żÚ"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "ÉžłýľąÇ°´°żÚ"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "Îޡ¨ÉžłýÓŔžĂ´°żÚ"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "ÉžłýËůÓĐĆäËü´°żÚ"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "šöśŻĆäËü´°żÚ"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "ĎňşóšöśŻĆäËü´°żÚ"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "ŔŠ´ó(ťňËőĐĄ)ąž´°żÚ"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "ÔڿɟűľÄ´°żÚźäˇÖĹäżÉÓĂľÄĆÁÄťżŐźä"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "ÔÚľąÇ°´°żÚÖĐÇĐťťĐĐžíČĆ×´ĚŹ"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "ŃĄÔńĎÂŇť¸ö˝Úľă"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "ŃĄÔńÉĎŇť¸ö˝Úľă"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "ŃĄÔńÉϲă˝Úľă"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "ŃĄÔńąžÎÄźţľÄ×îşóŇť¸ö˝Úľă"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "¸Ă´°żÚĂťÓи˝źÓ˝Úľă"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "ŃĄÔńąžÎÄźţľÄľÚŇť¸ö˝Úľă"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "ŃĄÔńąž˝Úľă˛ËľĽÖĐľÄ×îşóŇťĎî"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "ŃĄÔńąž˛ËľĽĎîÄż"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "ąž˛ËľĽÖĐĂťÓĐľÚ %d ¸öĎîÄżĄŁ"
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "˛ËľĽĎî (%s)Łş"
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "˛ËľĽĎ"
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "¸úË潝˛ćŇýÓĂ (%s)Łş"
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "¸úË潝˛ćŇýÓĂŁş"
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "śÁČĄ˛ËľĽĎѥÔńËüľÄ˝Úľă"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "śÁČĄ˝Ĺעťň˝ť˛ćŇýÓò˘ŃĄÔńËüľÄ˝Úľă"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "ŇĆśŻľ˝ąž˝Úľă˛ËľĽľÄżŞÍˇ"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "Á˘żĚˇĂÎĘžĄżÉÄÜśŕľÄ˛ËľĽĎî"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "śÁČĄ˝ÚľăĂű˛˘ŃĄÔńËü"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "תľ˝˝ÚľăŁş"
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "˝ÚľăĄ°%sĄąÖĐĂťÓв˾ĽĄŁ"
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "˝ÚľăĄ°%2$sĄąÖĐĂťÓв˾ĽĎ%1$sĄąĄŁ"
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "Îޡ¨ÔÚĄ°%2$sĄąÖĐŐŇľ˝ÓÉĄ°%1$sĄąŇýÓþĽھ㥣"
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "śÁČĄ×Ô dir żŞĘźľÄ˛ËľĽľÄÁĐąí˛˘¸úËćËüĂÇ"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "¸úËć˛ËľĽŁş"
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "Ń°ŐŇËľĂ÷łĚĐňľ÷ÓþĽھă"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "Ń°ŐŇ [%s] ľÄľ÷Óýھ㣺"
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "śÁČĄŇť¸ö man ĘÖ˛áľÄŇýÓò˘ŃĄÔńËü"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "ťńČĄ man Ęֲ᣺"
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "ŃĄÔńąžÎÄźţÖоĥ°śĽĄą˝Úľă"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "ŃĄÔń˝ÚľăĄ°(dir)Ąą"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "Éžłý˝Úľă (%s)Łş"
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "Îޡ¨Éžłý˝ÚľăĄ°%sĄą"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "Îޡ¨Éžłý×îşóľÄ˝Úľă"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "ŃĄÔń×î˝üŃĄÔńľÄ˝Úľă"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "Éžłýąž˝Úľă"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "śÁČĄÎÄźţĂű˛˘ŃĄÔńËü"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "Ń°ŐŇÎÄźţŁş"
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "Îޡ¨Ń°ŐŇĄ°%sĄąĄŁ"
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "Îޡ¨´´˝¨ĘäłöÎÄźţĄ°%sĄąĄŁ"
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "ÍęłÉĄŁ"
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "ŐýÔÚĐ´Čë˝Úľă %s..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "ͨšýšÜľŔ˝Ťąž˝ÚľăľÄÄÚČÝĘäłöľ˝ INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "Îޡ¨´ňżŞľ˝Ą°%sĄąľÄšÜľŔĄŁ"
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "ŐýÔÚ´ňÓĄ˝Úľă %s..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "ŐýÔÚËŃË÷×ÓÎÄźţ %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "śÁČĄŇť¸ö×Öˇű´Ž˛˘ŇÔ´óĐĄĐ´Ăô¸ĐľÄˇ˝Ę˝ËŃË÷Ëü"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "śÁČĄŇť¸ö×Öˇű´Ž˛˘ËŃË÷Ëü"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "śÁČĄŇť¸ö×Öˇű´Ž˛˘ĎňşóËŃË÷Ëü"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%2$s%1$s×Öˇű´Ž [%3$s]Łş"
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "ĎňşóËŃË÷"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "ËŃË÷"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr "´óĐĄĐ´Ăô¸ĐľŘ"
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "ËŃË÷ʧ°ÜĄŁ"
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "ŇÔĎŕÍŹľÄˇ˝ĎňÖظ´×îşóľÄËŃË÷"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "ĂťÓĐÉĎ´ÎËŃË÷×Öˇű´Ž"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "ŇÔĎࡴľÄˇ˝ĎňÖظ´×îşóľÄËŃË÷"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "ÔÚÄăĘäČëľÄÍŹĘą˝ťťĽĘ˝ľŘËŃË÷×Öˇű´Ž"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "ĎňşóľÝÔöËŃË÷Łş"
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "ľÝÔöËŃË÷Łş"
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "ʧ°Ü "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "ŇĆśŻľ˝ÉĎŇť¸ö˝ť˛ćŇýÓĂ"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "ŇĆśŻľ˝ĎÂŇť¸ö˝ť˛ćŇýÓĂ"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "ŃĄÔńłöĎÖÔÚąžĐĐÖĐľÄŇýÓĂťň˛ËľĽĎî"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "ČĄĎűľąÇ°˛Ů×÷"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "ÍËłö"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "˝ŤšâąęŇĆśŻľ˝´°żÚľÄÖ¸ś¨ĐĐ"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "ÖŘť­ĎÔĘž"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "ÍËłö Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr "ÔËĐĐľ˝°óś¨ľ˝ąž°´źüľÄĐĄĐ´°ćąžľÄĂüÁî"
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "δ֪ľÄĂüÁî (%s)ĄŁ"
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "Ą°%sĄąÎŞˇÇˇ¨"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "Ą°%sĄąÎŞˇÇˇ¨"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "˝ŤąžĘý×ÖĚíźÓľ˝ľąÇ°ĘýÖľ˛ÎĘýÖĐ"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "żŞĆô(ťňłËŇÔ 4)ľąÇ°ĘýÖľ˛ÎĘý"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "ÓÉ \\[universal-argument] ÄÚ˛żĘšÓĂ"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readlineŁşĐéÄâÄÚ´ćşÄžĄŁĄ\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹ˝Ĺע˝Ť×ÔśŻłöĎÖťňĎűʧ"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹ´´˝¨ťňÉžłý´°żÚĘą¸ÄąäĆäËü´°żÚľÄ´óĐĄ"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹ˝ŤË˘ĐÂĆÁÄťśř˛ťĘÇĂůľŃ"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹłö´íĘą˝ŤĂůľŃ"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹInfo ŔŹťřĘŐźŻÄÇĐŠąŘĐë˝âŃšËőľÄÎÄźţ"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹËŃË÷×Öˇű´ŽľÄĆĽĹ䲿ˇÖ˝ŤąťÍťłöĎÔĘž"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "żŘÖĆÔÚ˝ÚľăĊβʹłöĎÖšöśŻÇëÇ󽍡˘Éúʲô"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "ľąšâąęŇĆłö´°żÚĘÇËůšöśŻľÄĐĐĘý"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "ÔÚĄ°żŞĄąĘąŁŹInfo ˝ÓĘܲ˘ĎÔĘž ISO Ŕ­śĄ×Öˇű"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "˝âĘÍąäÁżľÄÓá¨"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "ËľĂ÷ąäÁżŁş"
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "É蜨 Info ąäÁżľÄÖľ"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "É蜨ąäÁżŁş"
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "˝Ť %s É蜨Ϊ־ (%d)Łş"
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "˝Ť %s É蜨Ϊ־ (%s)Łş"
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr "--*** ąęźÇšýĆÚ ***"
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----InfoŁş()ŁŹĐĐ ----ŁŹ"
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---InfoŁş%sŁŹ%d ĐĐ --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-InfoŁş(%s)%sŁŹ%d ĐĐ --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " ×ÓÎÄźţŁş%s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%sŁşŃĄĎ%sĄąşŹŇ岝Ă÷ȡ\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%sŁşŃĄĎ--%sĄą˛ť˝ÓĘܲÎĘý\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%sŁşŃĄĎ%c%sĄą˛ť˝ÓĘܲÎĘý\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%sŁşŃĄĎ%sĄąĐčŇŞŇť¸ö˛ÎĘý\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%sŁş˛ťÄÜĘśąđľÄŃĄĎ--%sĄą\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%sŁş˛ťÄÜĘśąđľÄŃĄĎ%c%sĄą\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%sŁşˇÇˇ¨ŃĄĎî -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%sŁşÎŢЧѥĎî -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%sŁşŃĄĎîĐčŇŞŇť¸ö˛ÎĘý -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%sŁşŃĄĎ-W %sĄąľÄşŹŇ岝Çĺ\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%sŁşŃĄĎ-W %sĄą˛ť˝ÓĘܲÎĘý\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "%c%s ľÄ´íÎó˛ÎĘý"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "ŇťÔÂ"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "śţÔÂ"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "ČýÔÂ"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "ËÄÔÂ"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "ÎĺÔÂ"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "ÁůÔÂ"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "ĆßÔÂ"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "°ËÔÂ"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "žĹÔÂ"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "ĘŽÔÂ"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "ĘŽŇťÔÂ"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "ĘŽśţÔÂ"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr "@var ÖвťżÉżżľÄ×Öˇű %c"
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc ľÄ˛ÎĘýČŤ˛żÎŞ´óĐ´ŁŹŇň´ËÎŢЧ"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr "ÓŚÎŞĄ°{ĄąŁŹľŤż´ľ˝ÁËĄ°%cĄą"
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr "ÎÄźţÔÚÔ­ÎÄżéÖĐ˝áĘř"
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr "ÓŚÎŞĄ°}ĄąŁŹľŤż´ľ˝ÁËĄ°%cĄą"
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s ŇŃšýĘą"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp ĐčŇŞŐýĘý˛ÎĘýŁŹśř˛ťĘÇĄ°%sĄą"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "%c%s ľÄ´íÎó˛ÎĘý"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr "asis"
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr "none"
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "%c%s ľÄ´íÎó˛ÎĘý"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "@def ľÄ˛ÎĘýŇĹŠÁËĄ°}Ąą"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr "şŻĘý"
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr "şę"
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr "ĚŘĘâĐÎĘ˝"
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr "ąäÁż"
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr "ÓĂť§ŃĄĎî"
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr "ĘľŔýąäÁż"
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr "ˇ˝ˇ¨"
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr ""
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr ""
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr ""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%sŁşgetwdŁş%sŁŹ%s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "Ą°%c%sĄąĐčŇŞ˛ÎĘýĄ°{...}ĄąŁŹśř˛ť˝ö˝öĘÇĄ°%sĄą"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "˝ĹעĄ°%sĄąĂťÓйպϝ¨Ŕ¨şĹ"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "ś¨ŇĺľÄ˝ĹעÝÓи¸˝Úľă"
+
+#: makeinfo/footnote.c:210
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "˝ĹעÄھĽĹעĘDzťÔĘĐíľÄ"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "˝Ĺע"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr "ÎŢąęĚâ"
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, fuzzy, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "ÎŢЧľÄ˝ĹעĂűŁşĄ°%sĄą"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "δ֪ľÄË÷ŇýĄ°%sĄą"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr "Info Îޡ¨´ŚŔíË÷ŇýĚőÄżĄ°%sĄąÖоĥ°:Ąą"
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "Ë÷ŇýĄ°%sĄąŇŃž­´ćÔÚ"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "@synindex ÖĐľÄδ֪Ë÷ŇýĄ°%sĄąşÍ/ťňĄ°%sĄą"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "@printindex ÖĐľÄδ֪Ë÷ŇýĄ°%sĄą"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "šŘÓÚË÷ŇýĄ°%sĄąľÄĚőÄżłŹłöÁËËůÓнھă"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(łŹłöČκνھă)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr "˛ÎÔÄ "
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr "insertion_type_pname ÖоĴíÎóŔŕĐÍ"
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr "ĂśžŮŐťŇçłö"
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr "×ÖˇűąŕşĹŇçłöŁŹ´Ó %c ÖŘĐÂżŞĘź"
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr ""
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr "Ą°@endĄąĐčŇŞĄ°%sĄąŁŹľŤż´ľ˝Ą°%sĄą"
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "ĂťÓĐĆĽĹäľÄĄ°%cend %sĄą"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s ĐčŇŞ×ÖĸťňĘý×Ö"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr "ÎÄźţÔÚÔ­ÎÄżéÖĐ˝áĘř"
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "ÔÚĄ°@%2$sĄążéÖĐĄ°@%1$sĄąĘÇĂťÓĐŇâŇĺľÄ"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "ÔÚľÚŇť¸ö˝ÚľăÖŽÇ°Óöľ˝ @menuŁŹŐýÔÚ´´˝¨Ą°śĽĄą˝Úľă"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "ÄúľÄ @top ˝ÚľăżÉÄÜÓŚ¸Ă°üşŹÔÚ @ifnottex śř˛ťĘÇ @ifinfo ÖĐŁż"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "ÔÚľÚŇť¸ö˝ÚľăÖŽÇ°Óöľ˝ @detailmenuŁŹŐýÔÚ´´˝¨Ą°śĽĄą˝Úľă"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "ÔÚĄ°@%2$sĄążéÖĐĄ°@%1$sĄąĘÇĂťÓĐŇâŇĺľÄ"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "δƼĹäľÄĄ°%c%sĄą"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "Ą°%c%sĄąÖŽşóĐčŇŞÓĐЊʲô"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "Ą°%sĄąľÄ´íÎó˛ÎĘýŁŹĄ°%sĄąŁŹĘšÓĂĄ°%sĄą"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "ÔÚĄ°@%2$sĄążéÖĐĄ°@%1$sĄąĘÇĂťÓĐŇâŇĺľÄ"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "ÔÚĄ°%sĄążéÖĐ @itemx ĘÇĂťÓĐŇâŇĺľÄ"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr "ÔÚ˛ĺČëżéÖŽÍ⡢ĎÖÁË %c%s"
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s ÔÚ ISO 639 ÓďŃÔąŕÂëÖĐĘÇÎŢЧľÄ"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "˛ťÄÜĘśąđľÄąŕÂëĂűłĆĄ°%sĄą"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr "ą§Ç¸ŁŹ˛ťÖ§łÖąŕÂ륰%sĄą"
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr "ÎŢЧľÄąŕÂë×ÖˇűĄ°%sĄą"
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s ľÄ˛ÎĘýÓŚÎŞĄ°iĄąťňĄ°jĄąŁŹśř˛ťĘÇĄ°%cĄą"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s ĐčŇŞŇÔľĽ¸ö×ÖˇűĄ°iĄąťňĄ°jĄąÎŞ˛ÎĘý"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "şęĄ°%sĄąŇŃÔÚÇ°Ă木Ňĺ"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "ŐâŔďĘÇĄ°%sĄąÇ°ĂćľÄś¨Ňĺ"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "ÔÚľÚ %2$d ĐĐÖĐŇÔšýśŕľÄ˛ÎĘýľ÷Óúꥰ%1$sĄą"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr "ŐҲťľ˝şę %cend"
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg ÖťśÔľĽ˛ÎĘýşęÓĐÓĂ"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@end %s şÍ @%s ˛ťĆĽĹä"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "šýśŕľÄ´íÎ󣥡ĹĆúĄŁ\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%sŁş%dŁşžŻ¸ćŁş"
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "´íÎóˇĹÖĂľÄ %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "ĘÔÓĂĄ°%s --helpĄąŇÔťńČĄ¸üśŕĐĹϢĄŁ\n"
+
+#: makeinfo/makeinfo.c:343
+#, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "Óᨣş%s [ŃĄĎî]... TEXINFO-ÎÄźţ...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+"˝Ť Texinfo Ô´ÎÄźţתťťÎŞĆäËü¸÷ÖÖ¸ńĘ˝ŁŹÄŹČĎתťťÎŞĘĘÓÚ\n"
+"ÓÉ Emacs ťňśŔÁ˘ GNU Info ÔÚĎßäŻŔŔľÄ Info ÎÄźţĄŁ\n"
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"ͨÓĂŃĄĎ\n"
+" --error-limit=NUM ÔÚ NUM ¸ö´íÎóşóÍËłö (ÄŹČĎÎŞ %d).\n"
+" --force ź´ĘąłöĎÖ´íÎóҲąŁÁôĘäłöÎÄźţĄŁ\n"
+" --help ĎÔĘž¸ĂÇóÖúĐĹϢ˛˘ÍËłöĄŁ\n"
+" --no-validate ˛ť˝řĐĐ˝ť˛ćŇýÓĂźě˛éĄŁ\n"
+" --no-warn ˛ťĘäłöžŻ¸ć (˛ťÉćź°´íÎó)ĄŁ\n"
+" --reference-limit=NUM śÔÖÁśŕ NUM ¸öŇýÓĂ˝řĐĐžŻ¸ć (ÄŹČĎÎŞ %d)ĄŁ\n"
+" -v, --verbose ˝âĘÍśź×öÁËЊʲôĄŁ\n"
+" --version ĎÔĘž°ćąžĐĹϢ˛˘ÍËłöĄŁ\n"
+
+#: makeinfo/makeinfo.c:364
+#, fuzzy, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+"Ęäłö¸ńʽѥÔń (ÄŹČĎÉúłÉ Info ÎÄźţ)Łş\n"
+" --docbook Ęäłö DocBook śř˛ťĘÇ InfoĄŁ\n"
+" --html Ęäłö HTML śř˛ťĘÇ InfoĄŁ\n"
+" --xml Ęäłö XML (TexinfoML) śř˛ťĘÇ InfoĄŁ\n"
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+"ͨÓĂĘäłöŃĄĎ\n"
+" -E, --macro-expand FILE ˝ŤşęŔŠŐšÔ´Ęäłöľ˝ÎÄźţ FILEĄŁ\n"
+" şöÂÔËůÓĐ @setfilenameĄŁ\n"
+" --no-headers ˛ťÔÚ Info Ęäłöťň HTML ĘäłöÖĐÉúłÉ˝ÚľăˇÖ¸ôˇűŁŹ\n"
+" ˝ÚľăŁşĐĐŁŹşÍ˛ËľĽĄŁ´ÓśřÉúłÉĆŐͨÎÄąž(Info\n"
+" Ęäłö)ťň˝ĎśĚľÄĘäłö(HTML Ęäłö)Łť\n"
+" ´ËÍâ, ÄŹČĎĘäłöľ˝ąęןĘäłöĄŁ\n"
+" --no-split ˛ťĘÇÉúłÉˇÖ¸îľÄ Info ťň HTML ĘäłöŁŹ\n"
+" śřĘÇÉúłÉľĽ¸öĘäłöÎÄźţĄŁ\n"
+" --number-sections ĘäłöŐ½ڹŕşĹĄŁ\n"
+" -o, --output=FILE Ęäłöľ˝ÎÄźţ FILE (ČçšűĘǡָîľÄ HTML ÔňΪĿŸ)ŁŹ\n"
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+"Info şÍĆŐͨÎÄąžŃĄĎ\n"
+" --enable-encoding ¸ůžÝ @documentencoding Ęäłö Info ĘäłöÖĐľÄ\n"
+" ÖŘŇôşÍĚŘĘâ×ÖˇűĄŁ\n"
+" --fill-column=NUM ÔÚľÚ NUM ¸ö×Öˇű´ŚÇĐˇÖ Info ĐĐ (ÄŹČĎÎŞ %d)ĄŁ\n"
+" --footnote-style=STYLE ¸ůžÝ STYLE Ęäłö Info ÖоĽĹעŁş\n"
+" Ą°separateĄą˝Ť˝ĹעÖĂÓÚśŔÁ˘ľÄ˝ÚľăŁť\n"
+" Ą°endĄą˝Ť˝ĹעÖĂÓÚś¨ŇĺËüľÄ˝ÚľăľÄĊβ(ÄŹČĎ)ĄŁ\n"
+" --paragraph-indent=VAL ˝Ť Info śÎśÔĆëľ˝ VAL ¸öżŐ¸ń (ÄŹČĎÎŞ %d).\n"
+" Čçšű VAL ÎŞĄ°noneĄąŁŹÔň˛ťśÔĆ룝Čçšű VAL ÎŞ\n"
+" Ą°asisĄąŁŹąŁÁôĎÖÓоĜÔĆ륣\n"
+" --split-size=NUM ÔÚ´óĐĄ NUM ľÄĘąşň˛đˇÖ Info ÎÄźţ (ÄŹČĎÎŞ %d)ĄŁ\n"
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+#, fuzzy
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+"ĘäČëÎÄźţŃĄĎ\n"
+" --commands-in-node-names ÔĘĐíÔÚ˝ÚľăĂűÖĐĘšÓĂ @ ĂüÁ\n"
+" -D VAR ś¨ŇĺąäÁż VARŁŹžÍĎó @setĄŁ\n"
+" -I DIR ˝Ť DIR ¸˝źÓľ˝ @include ËŃË÷¡žśÖŽşóĄŁ\n"
+" -P DIR ˝Ť DIR סźÓľ˝ @include ËŃË÷¡žśÖŽÇ°ĄŁ\n"
+" -U VAR ČĄĎűąäÁż VAR ľÄś¨Ň壏žÍĎó @clearĄŁ\n"
+
+#: makeinfo/makeinfo.c:425
+#, fuzzy
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+"ĘäČëÖĐľÄĚőźţ´ŚŔíŁş\n"
+" --ifhtml ź´Ęš˛ťĘÇÉúłÉ HTML Ҳ´ŚŔí @ifhtml şÍ @htmlĄŁ\n"
+" --ifinfo ź´Ęš˛ťĘÇÉúłÉ Info Ҳ´ŚŔí @ifinfoĄŁ\n"
+" --ifplaintext ź´Ęš˛ťĘÇÉúłÉĆŐͨÎÄąžŇ˛´ŚŔí @ifplaintextĄŁ\n"
+" --iftex ´ŚŔí @iftex şÍ @texŁťŇţşŹ --no-splitĄŁ\n"
+" --no-ifhtml ˛ťŇŞ´ŚŔí @ifhtml şÍ @html ÎÄąžĄŁ\n"
+" --no-ifinfo ˛ťŇŞ´ŚŔí @ifinfo ÎÄąžĄŁ\n"
+" --no-ifplaintext ˛ťŇŞ´ŚŔí @ifplaintext ÎÄąžĄŁ\n"
+" --no-iftex ˛ťŇŞ´ŚŔí @iftex şÍ @tex ÎÄąžĄŁ\n"
+
+#: makeinfo/makeinfo.c:444
+#, fuzzy
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+" @if... ĚőźţľÄÄŹČĎÖľŇĐŔľÓÚĘäłö¸ńĘ˝Łş\n"
+" ČçšűÉúłÉ HTMLŁŹÔň --ifhtml ÄŹČĎżŞĆôśřĆäËüľÄÄŹČϚعգť\n"
+" ČçšűÉúłÉ InfoŁŹÔň --ifinfo ÄŹČĎżŞĆôśřĆäËüľÄÄŹČϚعգť\n"
+" ČçšűÉúłÉĆŐͨÎÄąžŁŹÔň --ifplaintext ÄŹČĎżŞĆôśřĆäËüÄŹČϚعգť\n"
+
+#: makeinfo/makeinfo.c:452
+#, fuzzy
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"ĘžŔýŁş\n"
+" makeinfo foo.texi ˝Ť Info Đ´Čëľ˝ foo ľÄ @setfilename\n"
+" makeinfo --html foo.texi ˝Ť HTML Đ´Čëľ˝ @setfilename\n"
+" makeinfo --xml foo.texi ˝Ť XML Đ´Čëľ˝ @setfilename\n"
+" makeinfo --docbook foo.texi ˝Ť DocBook XML Đ´Čëľ˝ @setfilename\n"
+" makeinfo --no-headers foo.texi ˝ŤĆŐͨÎÄąžĐ´Čëľ˝ąęןĘäłö\n"
+"\n"
+" makeinfo --html --no-headers foo.texi Ęäłö html śř˛ťĘäłö˝ÚľăĐкͲ˾Ľ\n"
+" makeinfo --number-sections foo.texi Ęäłö´řÓĐąŕşĹľÄ˝ÚľÄ Info\n"
+" makeinfo --no-split foo.texi ĘäłöľĽ¸ö Info ÎÄźţśř˛ťÂŰ´óĐĄ\n"
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%sŁş%s ˛ÎĘýąŘĐëÎŞĘýÖľŁŹśř˛ťĘÇĄ°%sĄąĄŁ\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "Îޡ¨´ňżŞşęŔŠŐšĘäłöĄ°%sĄą"
+
+#: makeinfo/makeinfo.c:665
+#, fuzzy, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr "Îޡ¨´ňżŞşęŔŠŐšĘäłöĄ°%sĄą"
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr ""
+"%sŁş--paragraph-indent ľÄ˛ÎĘýąŘĐëÎŞĘýÖľ/Ą°noneĄą/Ą°asisĄąŁŹśř˛ťĘÇĄ°%sĄąĄŁ\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr ""
+"%sŁş--footnote-style ľÄ˛ÎĘýąŘĐëÎŞĄ°separateĄąťňĄ°endĄąŁŹśř˛ťĘÇĄ°%sĄąĄŁ\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%sŁşŇĹŠÎÄźţ˛ÎĘýĄŁ\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "ÓŚÎŞĄ°%sĄą"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr "Îޡ¨´´˝¨ÄżÂźĄ°%sĄąŁş%s"
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "ÔÚĄ°%2$sĄąÖĐŐҲťľ˝Ą°%1$sĄą"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr "´ÓĄ°%3$sĄą´´˝¨ %1$s ÎÄźţĄ°%2$sĄąĄŁ\n"
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "ŐâĘÇ %sŁŹÓÉ makeinfo °ćąž %s ´Ó %s ÉúłÉĄŁ\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr "%sŁşÓÉÓÚ´íÎóÉžłýşęĘäłöÎÄźţĄ°%sĄąŁťÓĂ --force ąŁÁôşęĘäłöĄŁ\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr "%sŁşÓÉÓÚ´íÎóÉžłýşęĘäłöÎÄźţĄ°%sĄąŁťÓĂ --force ąŁÁôşęĘäłöĄŁ\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "δ֪ľÄĂüÁ%sĄą"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "ĘšÓĂť¨Ŕ¨şĹ˝ŤŇť¸öĂüÁîÓĂ×÷ @%s ľÄ˛ÎĘý"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s ĐčŇŞĄ°{...}Ąą"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "˛ťĆĽĹäľÄ }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "ÎŢĂű×ÖŁĄ"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s ŇĹŠąŐşĎť¨Ŕ¨şĹ"
+
+#: makeinfo/makeinfo.c:3309
+#, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image ÎÄźţĄ°%sĄą(śÔ HTML)˛ťżÉśÁŁş%s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "ÔÚĄ°%2$sĄąÖĐŐҲťľ˝Ą°%1$sĄą"
+
+#: makeinfo/makeinfo.c:3447
+#, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image ÎÄźţĄ°%sĄą(śÔÎÄąž)˛ťżÉśÁŁş%s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image ŇĹŠÎÄźţĂű˛ÎĘý"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr "{ĂťÓĐĄ°%sĄąľÄÖľ}"
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s ĐčŇŞŇť¸öĂű×Ö"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "ÎÄźţÔÚÓöľ˝ĆĽĹäľÄ @end %s Ç°žÍ˝áĘřÁË"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr "Ą°%.40s...ĄąŔŠŐšĆđŔ´ĚŤł¤ŁťÎ´ŔŠŐš"
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "@multitable ÄŁ°ĺÖĐŇĹŠÁË }"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr "şöÂÔ @multitable ÖŽşóľÄšýĘŁÎÄąžĄ°%sĄą"
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "ÔÚśŕÁĐąí¸ńĎîÄżÖĐşŹÓĐĚŤśŕľÄÁĐ (×î´óÎŞ %d)"
+
+#: makeinfo/multi.c:555
+#, fuzzy, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "Îޡ¨ÔÚśŕÁĐąí¸ńÖĐŃĄÔńľÚ %d ÁĐ"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "şöÂÔśŕÁĐąí¸ńÍâľÄ @tab"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr "** ×îşóŇťĐоĜŕÁĐĘäłöŁş\n"
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* ÁĐ #%dŁşĘäłö = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "˝ÚľăĄ°%sĄąÔÚÇ°ĂćľÄ(ľÚ %d ĐĐ)ś¨Ňĺ"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "ŐýÔÚ¸ńĘ˝ťŻ˝Úľă %s...\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "˝ÚľăĄ°%sĄąĐčŇŞŇť¸ö˝ÚĂüÁî (ŔýČ磺%c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "ĂťÓĐÎŞĄ°%c%sĄąĂüÁîÖ¸ś¨˝ÚĂűłĆ"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr "AnchorĄ°%sĄąşÍ˝ÚľăĄ°%sĄąÓłÉ侽͏ҝ¸öÎÄźţĂű"
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr "şöÂԸà @anchor ĂüÁśÔËüľÄŇýÓĂ˝ŤÎޡ¨š¤×÷"
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr "ÖŘĂüĂű anchor ťňĘšÓĂĄ°--no-splitĄąŃĄĎî"
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr "ÔÚˇÖÁ˘ HTML ÎÄźţĄ°%sĄąľÄĊβľÄŇâÍâ×Öˇű´Ž"
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "ĎÂŇť¸öŁş"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "ÉĎŇť¸öŁş"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "Éϲ㣺"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr "AnchorĄ°%sĄąşÍĄ°%sĄąÓłÉ侽͏ҝ¸öÎÄźţĂű"
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr "şöÂÔ @anchor ĂüÁśÔËüľÄŇýÓĂ˝Ť˛ťÄÜš¤×÷"
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%sŇýÓĂľ˝˛ť´ćÔھĽھ㥰%sĄą"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "˛ËľĽ"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr "˝ť˛ćŇýÓĂ"
+
+#: makeinfo/node.c:1447
+#, fuzzy, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr "˝ÚľăĄ°%sĄąľÄĎÂŇť¸öÓňĂťÓĐÖ¸Ďň"
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "¸Ă˝Úľă (%s) şŹÓĐ´íÎóľÄÉĎŇť¸ö"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "ÉĎŇť¸ö"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr "˝ÚľăĄ°%sĄąľÄÉĎŇť¸öÓňĂťÓĐÖ¸Ďň"
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "¸Ă˝Úľă (%s) şŹÓĐ´íÎóľÄĎÂŇť¸ö"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "Éϲă"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr "žĄšÜ˝ÚľăĄ°%sĄąĘÇĄ°%sĄąľÄÉϲă˝ÚľăŁŹľŤČąÉŮĎŕšŘľÄ˛ËľĽĎî"
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "˝ÚľăĄ°%sĄąŇŃąťŇýÓĂÁË %d ´Î"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "δŇýÓþĽھ㥰%sĄą"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "Îޡ¨´´˝¨ÄżÂźĄ°%sĄąŁş%s"
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "¸˝Âź %c "
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "ÄÚ˛ż´íÎó (search_sectioning) Ą°%sĄąŁĄ"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "ÄÚ˛ż´íÎó (search_sectioning) Ą°%sĄąŁĄ"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s ŇŃšýĘąŁťÓĂ %c%s ´úĚć"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr "´řÓĐ %ctop ľÄ˝Úľă×÷ÎŞŇť¸ö˝ÚŇŃž­´ćÔÚ"
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr "ŐâŔďĘÇ %ctop ˝Úľă"
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr "%ctop ÔÚ %cnode ÖŽÇ°ĘšÓĂŁŹÄŹČĎÎŞ %s"
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr "ĿŸ"
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr "źňśĚĿŸ"
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image ÎÄźţĄ°%sĄą˛ťżÉśÁŁş%s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%sŁşžŻ¸ćŁş"
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr ""
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\tĘÔÓĂĄ°%s --helpĄąŇÔťńľĂŃĄĎîľÄÍęŐűÁĐąíĄŁ\n"
+
+#: util/install-info.c:434
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"Óᨣş%s [ŃĄĎî]... [INFO-ÎÄźţ [DIR-ÎÄźţ]]\n"
+"\n"
+"˝Ť INFO-ÎÄźţÖĐľÄĿŸĚőÄż°˛×°ľ˝ Info ĿŸÎÄźţ DIR-ÎÄźţÖĐŁŹťň´ÓÖĐ\n"
+"ÉžłýĄŁ\n"
+"\n"
+"ŃĄĎ\n"
+" --delete ´Ó DIR-ÎÄźţÖĐÉžłýšŘÓÚ INFO-ÎÄźţľÄĎÖÓĐĚőÄżŁť\n"
+" ˛ťÉžłýČÎşÎĐÂĚőÄżĄŁ\n"
+" --dir-file=NAME Ö¸ś¨ Info ĿŸÎÄźţľÄÎÄźţĂűĄŁ\n"
+" ŐâľČźŰÓÚĘšÓĂ DIR-ÎÄźţ˛ÎĘýĄŁ\n"
+" --entry=TEXT ˝Ť TEXT ×÷ÎŞ Info ĿŸĚőÄż˛ĺČ륣\n"
+" TEXT ľÄĐÎʽӌ¸ĂĘÇ Info ˛ËľĽĎîÄż\n"
+" ĐĐŇÔź°Áă¸öťňśŕ¸öŇԿհ׿ŞÍˇľÄĐĐĄŁ\n"
+" ČçšűÄúÖ¸Ă÷śŕ¸öĚőÄżŁŹ˝ŤČŤ˛żĚíźÓĄŁ\n"
+" ČçšűÄúδָĂ÷ČÎşÎĚőÄżŁŹËüĂÇ˝Ť´Ó\n"
+" Info ÎÄźţ×ÔÉíľÄĐĹϢŔ´ĹМϥŁ\n"
+" --help ĎÔĘžąžÇóÖúĐĹϢ˛˘ÍËłöĄŁ\n"
+" --info-file=FILE Ö¸ś¨ŇŞ°˛×°ľ˝ÄżÂźÖĐľÄ Info ÎÄźţĄŁ\n"
+" ŐâľČźŰÓÚĘšÓĂ INFO-ÎÄźţ˛ÎĘýĄŁ\n"
+" --info-dir=DIR ľČÍŹÓÚ --dir-file=DIR/dirĄŁ\n"
+" --item=TEXT ľČÍŹÓÚ --entry ÎÄąžĄŁ\n"
+" Info ĿŸĚőĿʾźĘÉĎĘDz˾ĽĎîÄżĄŁ\n"
+" --quiet ˛ťŇŞĘäłöžŻ¸ćĄŁ\n"
+" --remove ľČÍŹÓÚ --deleteĄŁ\n"
+" --section=SEC ˝Ť¸ĂÎÄźţľÄĚőÄż´ć´˘ľ˝ÄżÂźľÄ˝Ú SEC ÖĐĄŁ\n"
+" ČçšűÄúÖ¸Ă÷śŕÓÚŇť¸ö˝ÚŁŹ˝ŤźÓČë¸÷¸ö\n"
+" ˝ÚÖĐľÄËůÓĐĚőÄżĄŁ\n"
+" ČçšűÄúδָĂ÷ČκνڣŹ˝Ť¸ůžÝ Info\n"
+" ÎÄźţ×ÔÉíľÄĐĹϢŔ´ĹĐśĎËüĂÇĄŁ\n"
+" --version ĎÔĘž°ćąžĐĹϢ˛˘ÍËłöĄŁ\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"ŐâĘÇÎÄźţ .../info/dirŁŹËüşŹÓĐ Info ˛ă´Î\n"
+"˝áššľÄ×˛ă˝ÚľăŁŹłĆÎŞ (dir)TopĄŁ\n"
+"ÄúľÚŇť´Îľ÷ÓĂ Info Äú˝Ť´Ó¸Ă˝ÚľăżŞĘźĄŁ\n"
+"\n"
+"%s\tŐâĘÇ INFO Ę÷ľÄśĽ\n"
+"\n"
+" ŐâŔď (the Directory node) ¸řłöÁËÖ÷ŇŞÖ÷ĚâľÄ˛ËľĽĄŁ\n"
+" ĘäČ륰qĄą˝ŤÍËłöŁŹĘäČ륰?Ąą˝ŤÁĐžŮËůÓĐ Info ĂüÁĘäČë\n"
+" Ą°dĄą˝ŤˇľťŘŐâŔ北ĘäČ륰hĄą˝Ť¸řłő´ÎĘšÓĂľÄÓĂť§Ňť¸öŐŞŇŞŁŹ\n"
+" ĘäČ륰mEmacs<Return>Ąą˝ŤˇĂÎĘ Emacs ĘֲᣏľČľČĄŁ\n"
+"\n"
+" ÔÚ EmacsÖĐŁŹÄúżÉŇÔÔڲ˾ĽĎîÄżťň˝ť˛ćŇýÓĂÉĎľăť÷ĘóąęÓŇźüŇÔ\n"
+" ŃĄÔńËüĄŁ\n"
+"\n"
+"* ˛ËľĽŁş\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%sŁşź´Îޡ¨śÁČë (%s) ҲÎޡ¨´´˝¨ (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%sŁşżŐÎÄźţ"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "START-INFO-DIR-ENTRY ĂťÓĐĆĽĹäľÄ END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "END-INFO-DIR-ENTRY ĂťÓĐĆĽĹäľÄ START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%sŁşInfo ÎÄźţÖťÓŚ¸ĂÖ¸ś¨Ňť´ÎĄŁ\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "śŕÓŕľÄĂüÁîĐвÎĘýĄ°%sĄą"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "ĂťÓĐÖ¸ś¨ĘäłöÎÄźţŁťĘÔÓĂ --help ŇÔťńľĂ¸üśŕĐĹϢĄŁ"
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "ĂťÓĐÖ¸ś¨ÄżÂźÎÄźţŁťĘÔÓĂ --help ŇÔťńľĂ¸üśŕĐĹϢĄŁ"
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "Ą°%sĄąÖĐĂťÓĐ info ĿŸĚőÄż"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "ÔÚÎÄźţĄ°%2$sĄąÖв˾ĽĎ%1$sĄąŇŃ´ćÔÚ"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "ŐҲťľ˝šŘÓÚĄ°%sĄąľÄĚőÄżŁťÎ´Éžłý"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "ĎÔĘž¸ĂÇóÖúĐĹϢ˛˘ÍËłö"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "ÔÚ´ŚŔíÖŽşóąŁÁôÁŮĘąÎÄźţ"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "ÔÚ´ŚŔíÖŽşóÉžłýÁŮĘąÎÄźţ (ÄŹČĎ)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "˝ŤĘäłöËÍČë FILE"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "ĎÔĘž°ćąžĐĹϢ˛˘ÍËłö"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "Óᨣş%s [ŃĄĎî]... ÎÄźţ...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "ÎŞĂż¸ö TeX ĘäłöÎÄźţÉúłÉĹĹĐňľÄË÷ŇýĄŁ\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "śÔÓÚÎÄľľĄ°foo.texiĄąŁŹFILE... ͨłŁÎŞĄ°foo.%c%cĄąľÄĐÎĘ˝ĄŁ\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"ŃĄĎ\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%sŁş˛ťĘÇ texinfo Ë÷ŇýÎÄźţ"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "ÖŘĐ´ňżŞ %s ʧ°Ü"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "%s ÖĐĂťÓĐŇłÂë"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr "ĚőÄż %s łöĎÖÔÚžßÓĐ´ÎŇŞĂűłĆľÄĚőÄżÖŽşó"
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%sŁşInfo ĿŸ֝ӌ¸ĂÖ¸ś¨Ňť´ÎĄŁ\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "Ą°ĄąÎŞˇÇˇ¨"
+
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s Ęǡǡ¨ľÄ ISO Â룏ʚÓĂ %c"
+
+#~ msgid "Cannot specify more than one macro expansion output"
+#~ msgstr "Îޡ¨Ö¸ś¨śŕ¸öşęŔŠŐšĘäłö"
+
+#~ msgid "File exists, but is not a directory"
+#~ msgstr "ÎÄźţ´ćÔÚŁŹľŤ˛ťĘÇĿŸ"
+
+#~ msgid "First argument to cross-reference may not be empty"
+#~ msgstr "˝ť˛ćŇýÓþľÚŇť¸ö˛ÎĘý˛ťÄÜÎŞżŐ"
+
+#~ msgid "see "
+#~ msgstr "˛ÎÔÄ "
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "Ą°.ĄąťňĄ°,ĄąÖŽşóąŘĐëÎŞ˝ť˛ćŇýÓĂŁŹśř˛ťĘÇ %c"
+
+#~ msgid "First argument to @inforef may not be empty"
+#~ msgstr "@inforef ľÄľÚŇť¸ö˛ÎĘý˛ťÄÜÎŞżŐ"
+
+#~ msgid "Node:"
+#~ msgstr "˝ÚľăŁş"
+
+#~ msgid "%s: TOC should be here, but it was not found"
+#~ msgstr "%sŁşÄżÂźÓŚ¸ĂÔÚŐâŔľŤËü˛˘Î´łöĎÖ"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "ĐéÄâÄÚ´ćşÄžĄ"
+
+#~ msgid "No `%s.png' or `.jpg', and no extension supplied"
+#~ msgstr "˛ťĘÇĄ°%s.pngĄąťňĄ°.jpgĄąŁŹśřÇŇĂťÓиřłöŔŠŐšĂű"
+
+#~ msgid "%s; for file `%s'.\n"
+#~ msgstr "%sŁťÎÄźţĄ°%sĄąĄŁ\n"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "Ą°%sĄąĂťÓĐÉϲăÓň"
+
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr "\\%-10[scroll-forward] ĎňÇ°šöśŻŇťĐĐĄŁ\n"
+
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr "\\%-10[scroll-backward] ĎňşóšöśŻŇťĐĐĄŁ\n"
diff --git a/Build/source/utils/texinfo/po/zh_TW.gmo b/Build/source/utils/texinfo/po/zh_TW.gmo
new file mode 100644
index 00000000000..0b973198cdd
--- /dev/null
+++ b/Build/source/utils/texinfo/po/zh_TW.gmo
Binary files differ
diff --git a/Build/source/utils/texinfo/po/zh_TW.po b/Build/source/utils/texinfo/po/zh_TW.po
new file mode 100644
index 00000000000..404a08953a3
--- /dev/null
+++ b/Build/source/utils/texinfo/po/zh_TW.po
@@ -0,0 +1,3111 @@
+# traditional Chinese translation for texinfo
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# plasma <plasmaball@pchome.com.tw>, 2000.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: texinfo 4.1\n"
+"Report-Msgid-Bugs-To: bug-texinfo@gnu.org\n"
+"POT-Creation-Date: 2004-12-21 16:20-0800\n"
+"PO-Revision-Date: 2002-03-08 04:56+0800\n"
+"Last-Translator: Abel Cheung <maddog@linux.org.hk>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=Big5\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: info/echo-area.c:284 info/session.c:689
+msgid "Move forward a character"
+msgstr "ŚVŤe˛ž°Ę¤@­ÓŚr¤¸"
+
+#: info/echo-area.c:296 info/session.c:705
+msgid "Move backward a character"
+msgstr "ŚVŤá˛ž°Ę¤@­ÓŚr¤¸"
+
+#: info/echo-area.c:308
+msgid "Move to the start of this line"
+msgstr "˛žŚÜĽťŚćś}ŔY"
+
+#: info/echo-area.c:313
+msgid "Move to the end of this line"
+msgstr "˛žŚÜĽťŚćľ˛§Ŕ"
+
+#: info/echo-area.c:321 info/session.c:723
+msgid "Move forward a word"
+msgstr "ŚVŤe˛ž°Ę¤@­ÓŚr"
+
+#: info/echo-area.c:361 info/session.c:772
+msgid "Move backward a word"
+msgstr "ŚVŤá˛ž°Ę¤@­ÓŚr"
+
+#: info/echo-area.c:401
+msgid "Delete the character under the cursor"
+msgstr "§R°Ł´ĺźĐŚě¸mŞşŚr¤¸"
+
+#: info/echo-area.c:431
+msgid "Delete the character behind the cursor"
+msgstr "§R°Ł´ĺźĐŚě¸mŤáŞşŚr¤¸"
+
+#: info/echo-area.c:452
+msgid "Cancel or quit operation"
+msgstr "¨úŽřŠÎľ˛§ôĽŘŤeŞş°Ę§@"
+
+#: info/echo-area.c:467
+msgid "Accept (or force completion of) this line"
+msgstr "ąľ¨ü (ŠÎąj­˘§šŚ¨) ĽťŚć"
+
+#: info/echo-area.c:472
+msgid "Insert next character verbatim"
+msgstr "¤Ł§@Âŕ´Ť, ´Ą¤J¤U¤@­ÓŚr¤¸"
+
+#: info/echo-area.c:480
+msgid "Insert this character"
+msgstr "´Ą¤JĽťŚr¤¸"
+
+#: info/echo-area.c:498
+msgid "Insert a TAB character"
+msgstr "´Ą¤J¤@­Ó TAB Śr¤¸"
+
+#: info/echo-area.c:505
+msgid "Transpose characters at point"
+msgstr "ĹÜ´Ť´ĺźĐŚě¸mŞşŚr¤¸Şşśś§Ç"
+
+#: info/echo-area.c:556
+msgid "Yank back the contents of the last kill"
+msgstr "śK¤J¤W¤@Ś¸°Ĺ¤UŞş¤şŽe"
+
+#: info/echo-area.c:563
+msgid "Kill ring is empty"
+msgstr "°ĹśKĂŻ¨SŚł¤şŽe"
+
+#: info/echo-area.c:576
+msgid "Yank back a previous kill"
+msgstr "śK¤WŤeŚ¸Şş°Ĺ¤U¤şŽe"
+
+#: info/echo-area.c:609
+msgid "Kill to the end of the line"
+msgstr "§R°ŁŚÜĽťŚćľ˛§Ŕ, ¨Ă¸m¤J°ĹśKĂŻ"
+
+#: info/echo-area.c:622
+msgid "Kill to the beginning of the line"
+msgstr "§R°ŁŚÜĽťŚćś}ŔY, ¨Ă¸m¤J°ĹśKĂŻ"
+
+#: info/echo-area.c:634
+msgid "Kill the word following the cursor"
+msgstr "§R°Ł´ĺźĐŤáŞşłćŚr, ¨Ă¸m¤J°ĹśKĂŻ"
+
+#: info/echo-area.c:653
+msgid "Kill the word preceding the cursor"
+msgstr "§R°Ł´ĺźĐŤeŞşłćŚr, ¨Ă¸m¤J°ĹśKĂŻ"
+
+#: info/echo-area.c:868 info/echo-area.c:924
+msgid "No completions"
+msgstr "¨SŚłĽiŻŕŞş§šŚ¨Ľy"
+
+#: info/echo-area.c:870
+msgid "Not complete"
+msgstr "Ľź§šŚ¨"
+
+#: info/echo-area.c:911
+msgid "List possible completions"
+msgstr "ŚCĽXĽiŻŕŞş§šŚ¨Ľy"
+
+#: info/echo-area.c:928
+msgid "Sole completion"
+msgstr "łć¤@Şş§šŚ¨Ľy"
+
+#: info/echo-area.c:937
+msgid "One completion:\n"
+msgstr "¤@­Ó§šŚ¨Ľy:\n"
+
+#: info/echo-area.c:938
+#, c-format
+msgid "%d completions:\n"
+msgstr "%d ­Ó§šŚ¨Ľy:\n"
+
+#: info/echo-area.c:1085
+msgid "Insert completion"
+msgstr "´Ą¤J§šŚ¨Ľy"
+
+#: info/echo-area.c:1220
+msgid "Building completions..."
+msgstr "ŤŘĽß§šŚ¨Ľy¤¤..."
+
+#: info/echo-area.c:1340
+msgid "Scroll the completions window"
+msgstr "ą˛°Ę§šŚ¨Ľy¤ŔšjľřľĄ"
+
+#: info/footnotes.c:213
+msgid "Footnotes could not be displayed"
+msgstr "ľLŞkĹăĽÜľů¸}"
+
+#: info/footnotes.c:239
+msgid "Show the footnotes associated with this node in another window"
+msgstr "ąNĽť¸`ÂIŞşľů¸}ĹăĽÜŚbĽt¤@­Ó¤ŔšjľřľĄ¤ş"
+
+#: info/footnotes.h:26
+#, fuzzy
+msgid "---------- Footnotes ----------"
+msgstr "---------------------\n"
+
+#: info/indices.c:172
+msgid "Look up a string in the index for this file"
+msgstr "ŚbĽťŔɎתşŻÁ¤Ţ¤şŹd¸ßŚrŚę"
+
+#: info/indices.c:199
+msgid "Finding index entries..."
+msgstr "§ä´MŻÁ¤ŢśľĽŘ..."
+
+#: info/indices.c:207
+msgid "No indices found."
+msgstr "§ä¤Ł¨ěŻÁ¤Ţ"
+
+#: info/indices.c:217
+msgid "Index entry: "
+msgstr "ŻÁ¤ŢśľĽŘ: "
+
+#: info/indices.c:325
+msgid ""
+"Go to the next matching index item from the last `\\[index-search]' command"
+msgstr "˛ž°ĘŚÜ¤U¤@­Ó˛ĹŚX¤W¤@Ś¸Şş `\\[index-search] ŠRĽOŞşˇj´MśľĽŘ"
+
+#: info/indices.c:335
+msgid "No previous index search string."
+msgstr "¨SŚłŤe¤@­ÓŻÁ¤Ţˇj´MŚrŚę"
+
+#: info/indices.c:342
+msgid "No index entries."
+msgstr "¨SŚłŻÁ¤ŢśľĽŘ."
+
+#: info/indices.c:375
+#, fuzzy, c-format
+msgid "No %sindex entries containing `%s'."
+msgstr "¨SŚł %sŻÁ¤ŢśľĽŘĽ]§t \"%s\"."
+
+#: info/indices.c:376
+msgid "more "
+msgstr "§óŚhŞş "
+
+#: info/indices.c:386
+msgid "CAN'T SEE THIS"
+msgstr ""
+
+#: info/indices.c:422
+#, fuzzy, c-format
+msgid "Found `%s' in %s. (`\\[next-index-match]' tries to find next.)"
+msgstr "§ä¨ě \"%s\" Śb %s ¤§¤¤. (`\\[next-index-match]' šÁ¸Ő­n§ä¨ě¤U¤@­ÓŚrŚę.)"
+
+#: info/indices.c:541
+#, fuzzy, c-format
+msgid "Scanning indices of `%s'..."
+msgstr "ą˝şË \"%s\" ŞşŻÁ¤Ţ¤¤..."
+
+#: info/indices.c:596
+#, c-format
+msgid "No available info files have `%s' in their indices."
+msgstr ""
+
+#: info/indices.c:622
+msgid "Grovel all known info file's indices for a string and build a menu"
+msgstr "žă˛zŠŇŚł¤wŞž info Ŕɤ¤Ľ]§tŹd¸ßŚrŚęŞşŻÁ¤Ţ, ¨ĂŤŘĽß¤@­Óżďłć"
+
+#: info/indices.c:626
+msgid "Index apropos: "
+msgstr ""
+
+#: info/indices.c:654
+#, fuzzy, c-format
+msgid ""
+"\n"
+"* Menu: Nodes whose indices contain `%s':\n"
+msgstr ""
+"\n"
+"* Menu: ¨äŻÁ¤Ţ¤¤Ľ]§t \"%s\" Şş¸`ÂI:\n"
+
+#: info/info.c:275 info/infokey.c:899
+#, c-format
+msgid "Try --help for more information.\n"
+msgstr "¸Ő¸Ő --help ĽH¨úąo§óŚhŞş¸ę°T.\n"
+
+#: info/info.c:295 makeinfo/makeinfo.c:766 util/install-info.c:1266
+#: util/texindex.c:343
+#, fuzzy, c-format
+msgid ""
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s ŚŰĽŃłnĹé°ňŞ÷ˇ| Free Software Foundation, Inc.\n"
+"ĽťłnĹé*¤Ł§@ĽôŚóŤOĂŇ*. ązĽiŚb GNU ¤˝Ś@ąÂĹv \n"
+"(GNU General Public License) Şşąř´Ú¤U´˛§GĽťłnĹé.\n"
+"ąýŞž§óŚhŞş¸ÔąĄ, ˝ĐŹÝŔÉŚWŹ° COPYING ŞşŔÉŽ×.\n"
+
+#: info/info.c:498
+#, c-format
+msgid "no index entries found for `%s'\n"
+msgstr "§ä¤Ł¨ěĽ]§t `%s' ŞşŻÁ¤ŢśľĽŘ\n"
+
+#: info/info.c:590
+msgid " -b, --speech-friendly be friendly to speech synthesizers.\n"
+msgstr ""
+
+#: info/info.c:597
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"Read documentation in Info format.\n"
+"\n"
+"Options:\n"
+" --apropos=STRING look up STRING in all indices of all "
+"manuals.\n"
+" -d, --directory=DIR add DIR to INFOPATH.\n"
+" --dribble=FILENAME remember user keystrokes in FILENAME.\n"
+" -f, --file=FILENAME specify Info file to visit.\n"
+" -h, --help display this help and exit.\n"
+" --index-search=STRING go to node pointed by index entry STRING.\n"
+" -n, --node=NODENAME specify nodes in first visited Info file.\n"
+" -o, --output=FILENAME output selected nodes to FILENAME.\n"
+" -R, --raw-escapes output \"raw\" ANSI escapes (default).\n"
+" --no-raw-escapes output escapes as literal text.\n"
+" --restore=FILENAME read initial keystrokes from FILENAME.\n"
+" -O, --show-options, --usage go to command-line options node.\n"
+"%s --subnodes recursively output menu items.\n"
+" -w, --where, --location print physical location of Info file.\n"
+" --vi-keys use vi-like and less-like key bindings.\n"
+" --version display version information and exit.\n"
+"\n"
+"The first non-option argument, if present, is the menu entry to start from;\n"
+"it is searched for in all `dir' files along INFOPATH.\n"
+"If it is not present, info merges all `dir' files and shows the result.\n"
+"Any remaining arguments are treated as the names of menu\n"
+"items relative to the initial node visited.\n"
+"\n"
+"Examples:\n"
+" info show top-level dir menu\n"
+" info emacs start at emacs node from top-level dir\n"
+" info emacs buffers start at buffers node within emacs manual\n"
+" info --show-options emacs start at node with emacs' command line options\n"
+" info -f ./foo.info show file ./foo.info, not searching dir\n"
+msgstr ""
+"ĽÎŞk: %s [OPTION]... [MENU-ITEM...]\n"
+"\n"
+"ž\ĹŞ Info ŽćŚĄŞş¤ĺĽó.\n"
+"\n"
+"Options:\n"
+" --apropos=SUBJECT ŚbŠŇŚłŞş¤âĽUŞşŻÁ¤Ţ¤¤´M§ä SUBJECT.\n"
+" --directory=DIR ąN DIR Ľ[ŚÜ INFOPATH ¤¤.\n"
+" --dribble=FILENAME ąN¨ĎĽÎŞĚŞşŤöÁä°OżýŚb FILENAME ¤¤.\n"
+" --file=FILENAME ŤüŠwŤôłXŞş Info ŔÉŽ×.\n"
+" --help ĹăĽÜĽť¨D§U¸ę°T, ľMŤáÂ÷ś}.\n"
+" --index-search=STRING ¸őŚÜŻÁ¤ŢśľĽŘ STRING ŠŇŤüŚVŞş¸`ÂI.\n"
+" --node=NODENAME ŤüŠw˛Ä¤@­ÓŤôłXŞş Info ŔɎפ¤Şş¸`ÂI.\n"
+" --output=FILENAME ąNżďžÜŞş¸`ÂIżéĽXŚÜŔÉŽ× FILENAME.\n"
+" --restore=FILENAME ŚŰŔÉŽ× FILENAME ĹŞ¨úŞěŠlŞşŤöÁä.\n"
+" --show-options, --usage ¸őŚÜŠRĽOŚCżďśľŞş¸`ÂI.\n"
+" --subnodes ĽHťź°j¤čŚĄżéĽXżďłćśľĽŘ.\n"
+"%s --vi-keys ¨ĎĽÎĂţŚü vi ťP less ŞşŤöÁä¤čŚĄ.\n"
+" --version ĹăĽÜŞŠĽť¸ę°T, ľMŤáľ˛§ô.\n"
+"\n"
+"ŚpŞGŚłŤDżďśľŞş¤ŢźĆ, ˛Ä¤@­ÓŤDżďśľŞş¤ŢźĆŹOś}ŠlŞşżďłćśľĽŘ;\n"
+"ĽŚˇ|łQĽÎ¨Óˇí§@Śb INFOPATH ¤şŞşŠŇŚł dir ŔɎתşˇj´MźĐŞş.\n"
+"ŚpŞG¨SŚłŞş¸Ü, info ˇ|˛ÎŚXŠŇŚłŞş dir ŔÉŽ×, ľMŤáĹăĽÜľ˛ŞG.\n"
+"łŃ¤UŞş¤ŢźĆˇ|łQˇí§@ŹŰšďŠółĚŞěŤôłX¸`ÂIŞşżďłćśľĽŘŞşŚWşŮ.\n"
+"\n"
+"˝d¨Ň:\n"
+" info ĹăĽÜłĚ¤WźhŞşżďłć\n"
+" info emacs ĽHłĚ¤Wźh¤¤Şş emacs ¸`ÂI§@Ź°°_ÂI\n"
+" info emacs buffers ĽH emacs ¤âĽU¤¤Şş buffers ¸`ÂI§@Ź°°_ÂI\n"
+" info --show-options emacs ĽH¤ś˛Đ emacs Şş°őŚćżďśľŞş¸`ÂI§@Ź°°_ÂI\n"
+" info -f ./foo.info ĹăĽÜŔÉŽ× ./foo.info, ¤Łˇj´MĽŘżý\n"
+"\n"
+"ľ{ŚĄŻäÂÎ, ˝ĐĽHšq¤lślĽó (­^¤ĺ) Ś^łřŚÜ bug-texinfo@gnu.org,\n"
+"¤@Żë°ÝĂDťP°Q˝×, ˝ĐĽHšq¤lślĽó (­^¤ĺ) ąH¨ě help-texinfo@gnu.org.\n"
+
+#: info/info.c:635 info/infokey.c:918 makeinfo/makeinfo.c:465
+#: util/install-info.c:466 util/texindex.c:292
+#, fuzzy
+msgid ""
+"\n"
+"Email bug reports to bug-texinfo@gnu.org,\n"
+"general questions and discussion to help-texinfo@gnu.org.\n"
+"Texinfo home page: http://www.gnu.org/software/texinfo/"
+msgstr ""
+"\n"
+"ľ{ŚĄŻäÂÎ, ˝ĐĽHšq¤lślĽó (­^¤ĺ) Ś^łřŚÜ bug-texinfo@gnu.org,\n"
+"¤@Żë°ÝĂDťP°Q˝×, ˝ĐĽHšq¤lślĽó (­^¤ĺ) ąH¨ě help-texinfo@gnu.org.\n"
+
+#: info/info.c:669
+#, c-format
+msgid "Cannot find node `%s'."
+msgstr "§ä¤Ł¨ě `%s' ¸`ÂI."
+
+#: info/info.c:670
+#, c-format
+msgid "Cannot find node `(%s)%s'."
+msgstr "§ä¤Ł¨ě `(%s)%s' ¸`ÂI."
+
+#: info/info.c:671
+msgid "Cannot find a window!"
+msgstr "§ä¤Ł¨ě¤ŔšjľřľĄ!"
+
+#: info/info.c:672
+msgid "Point doesn't appear within this window's node!"
+msgstr "´ĺźĐŚě¸m¤ŁŚbĽť¤ŔšjľřľĄŞş¸`ÂI¤ş!"
+
+#: info/info.c:673
+msgid "Cannot delete the last window."
+msgstr "ľLŞk§R°Ł¤W¤@­Ó¤ŔšjľřľĄ."
+
+#: info/info.c:674
+msgid "No menu in this node."
+msgstr "Ľť¸`ÂI¨SŚłżďłć."
+
+#: info/info.c:675
+msgid "No footnotes in this node."
+msgstr "Ľť¸`ÂI¨SŚłľů¸}."
+
+#: info/info.c:676
+msgid "No cross references in this node."
+msgstr "Ľť¸`ÂI¨SŚłĽć¤Ź°ŃˇÓ."
+
+#: info/info.c:677
+#, c-format
+msgid "No `%s' pointer for this node."
+msgstr "Ľť¸`ÂI¨SŚł `%s' pointer."
+
+#: info/info.c:678
+#, c-format
+msgid "Unknown Info command `%c'; try `?' for help."
+msgstr "ĽźŞžŞş Info ŠRĽO `%c'; ¸Ő¸Ő `?' ĽH¨úąo¨D§U¸ę°T."
+
+#: info/info.c:679
+#, c-format
+msgid "Terminal type `%s' is not smart enough to run Info."
+msgstr "˛×şÝž÷ĂţŤŹ `%s' ľLŞk¤ä´Š°őŚć Info ŠŇťÝŞşťÝ¨D."
+
+#: info/info.c:680
+msgid "You are already at the last page of this node."
+msgstr "ąz¤wŚbĽť¸`ÂIŞşłĚŤá¤@­ś."
+
+#: info/info.c:681
+msgid "You are already at the first page of this node."
+msgstr "ąz¤wŚbĽť¸`ÂIŞş˛Ä¤@­ś."
+
+#: info/info.c:682
+msgid "Only one window."
+msgstr "ĽuŚł¤@­Ó¤ŔšjľřľĄ."
+
+#: info/info.c:683
+msgid "Resulting window would be too small."
+msgstr "˛ŁĽÍŞş¤ŔšjľřľĄˇ|¤Ó¤p."
+
+#: info/info.c:684
+msgid "Not enough room for a help window, please delete a window."
+msgstr "łŃ¤UŞşŞĹśĄ¤Ó¤p, ľLŞkŽeŻÇ¨D§U¤ŔšjľřľĄ, ˝Đ§R°Ł¤@­Ó¤ŔšjľřľĄ."
+
+#: info/infodoc.c:46 info/infodoc.c:95
+#, fuzzy
+msgid ""
+"Basic Commands in Info Windows\n"
+"******************************\n"
+msgstr "******************************\n"
+
+#: info/infodoc.c:49
+#, fuzzy
+msgid "\\%-10[quit-help] Quit this help.\n"
+msgstr " %-10s ľ˛§ôĽť¨D§U.\n"
+
+#: info/infodoc.c:50
+#, fuzzy
+msgid "\\%-10[quit] Quit Info altogether.\n"
+msgstr " %-10s ¤@¨Öľ˛§ô Info ľ{ŚĄ.\n"
+
+#: info/infodoc.c:51
+#, fuzzy
+msgid "\\%-10[get-info-help-node] Invoke the Info tutorial.\n"
+msgstr " %-10s °őŚć Info ŤüžÉ˝Ňľ{.\n"
+
+#: info/infodoc.c:53 info/infodoc.c:102
+#, fuzzy
+msgid ""
+"Selecting other nodes:\n"
+"----------------------\n"
+msgstr "----------------------\n"
+
+#: info/infodoc.c:55
+#, fuzzy
+msgid "\\%-10[next-node] Move to the \"next\" node of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞş '¤U¤@­Ó (next)' ¸`ÂI.\n"
+
+#: info/infodoc.c:56
+#, fuzzy
+msgid "\\%-10[prev-node] Move to the \"previous\" node of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞş '¤W¤@­Ó (previous)' ¸`ÂI.\n"
+
+#: info/infodoc.c:57
+#, fuzzy
+msgid "\\%-10[up-node] Move \"up\" from this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞş '¤W¤@źh (up)' ¸`ÂI.\n"
+
+#: info/infodoc.c:58
+#, fuzzy
+msgid ""
+"\\%-10[menu-item] Pick menu item specified by name.\n"
+" Picking a menu item causes another node to be selected.\n"
+msgstr " żď¨úżďłćśľĽŘĽHżďžÜĽt¤@­Ó¸`ÂI.\n"
+
+#: info/infodoc.c:60
+#, fuzzy
+msgid ""
+"\\%-10[xref-item] Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s ¸ňŔHĽć¤Ź°ŃˇÓ. ĹŞ¨ú°ŃˇÓŞşŚWşŮ.\n"
+
+#: info/infodoc.c:61
+#, fuzzy
+msgid "\\%-10[history-node] Move to the last node seen in this window.\n"
+msgstr " %-10s ˛ž°ĘŚÜĽť¤ŔšjľřľĄ¤¤, ¤W¤@­ÓĆ[ŹÝŞş¸`ÂI.\n"
+
+#: info/infodoc.c:62
+#, fuzzy
+msgid ""
+"\\%-10[move-to-next-xref] Skip to next hypertext link within this node.\n"
+msgstr " %-10s ¸ő¨ěĽť¸`ÂI¤¤Şş¤U¤@­ÓśWĽť¤ĺłsľ˛.\n"
+
+#: info/infodoc.c:63
+#, fuzzy
+msgid ""
+"\\%-10[move-to-prev-xref] Skip to previous hypertext link within this "
+"node.\n"
+msgstr " %-10s ¸ő¨ěĽť¸`ÂI¤¤Şş¤U¤@­ÓśWĽť¤ĺłsľ˛.\n"
+
+#: info/infodoc.c:64
+#, fuzzy
+msgid ""
+"\\%-10[select-reference-this-line] Follow the hypertext link under cursor.\n"
+msgstr " %-10s ¸ňŔH´ĺźĐ¤UŞşśWĽť¤ĺłsľ˛.\n"
+
+#: info/infodoc.c:65
+#, fuzzy
+msgid ""
+"\\%-10[dir-node] Move to the `directory' node. Equivalent to `\\[goto-"
+"node] (DIR)'.\n"
+msgstr " %-10s ˛žŚÜ `directory' ¸`ÂI. ŚP `g (DIR)'.\n"
+
+#: info/infodoc.c:66
+#, fuzzy
+msgid ""
+"\\%-10[top-node] Move to the Top node. Equivalent to `\\[goto-node] Top'.\n"
+msgstr " %-10s ˛žŚÜ Top ¸`ÂI. ŚP `g TOP'.\n"
+
+#: info/infodoc.c:68 info/infodoc.c:116
+#, fuzzy
+msgid ""
+"Moving within a node:\n"
+"---------------------\n"
+msgstr "---------------------\n"
+
+#: info/infodoc.c:70
+#, fuzzy
+msgid "\\%-10[beginning-of-node] Go to the beginning of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞşś}ŔY.\n"
+
+#: info/infodoc.c:71
+#, fuzzy
+msgid "\\%-10[end-of-node] Go to the end of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞşľ˛§Ŕ.\n"
+
+#: info/infodoc.c:72
+#, fuzzy
+msgid "\\%-10[next-line] Scroll forward 1 line.\n"
+msgstr " %-10s ŠšŤeą˛°Ę¤@Ść.\n"
+
+#: info/infodoc.c:73
+#, fuzzy
+msgid "\\%-10[prev-line] Scroll backward 1 line.\n"
+msgstr " %-10s ŠšŤáą˛°Ę¤@Ść.\n"
+
+#: info/infodoc.c:74
+#, fuzzy
+msgid "\\%-10[scroll-forward] Scroll forward a page.\n"
+msgstr " %-10s ŚVŤeą˛°Ę¤@­ś.\n"
+
+#: info/infodoc.c:75
+#, fuzzy
+msgid "\\%-10[scroll-backward] Scroll backward a page.\n"
+msgstr " %-10s ŚVŤáą˛°Ę¤@­ś.\n"
+
+#: info/infodoc.c:77 info/infodoc.c:125
+#, fuzzy
+msgid ""
+"Other commands:\n"
+"---------------\n"
+msgstr "---------------\n"
+
+#: info/infodoc.c:79
+#, fuzzy
+msgid "\\%-10[menu-digit] Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s ŹDżď¸`ÂIĽŘżý¤¤Şş˛Ä¤@­Ó...˛Ä¤E­ÓśľĽŘ.\n"
+
+#: info/infodoc.c:80
+#, fuzzy
+msgid "\\%-10[last-menu-item] Pick last item in node's menu.\n"
+msgstr " %-10s ŹDżď¸`ÂIĽŘżýŞşłĚŤá¤@­ÓśľĽŘ.\n"
+
+#: info/infodoc.c:81
+#, fuzzy
+msgid ""
+"\\%-10[index-search] Search for a specified string in the index entries of "
+"this Info\n"
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " ¨ĂĽBżďžÜ˛Ä¤@­Óˇj´M¨ěŞşśľĽŘŠŇ°ŃˇÓŞş¸`ÂI.\n"
+
+#: info/infodoc.c:83
+#, fuzzy
+msgid ""
+"\\%-10[goto-node] Move to node specified by name.\n"
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " ąz¤]ĽiĽHĽ]§tŔÉŚW, Śp: (ŔÉŚW)¸`ÂIŚW.\n"
+
+#: info/infodoc.c:85
+#, fuzzy
+msgid ""
+"\\%-10[search] Search forward for a specified string\n"
+" and select the node in which the next occurrence is found.\n"
+msgstr " ¨ĂĽBżďžÜ¤U¤@­Óˇj´M¨ěŞşŚrŚęŠŇŚbŞş¸`ÂI.\n"
+
+#: info/infodoc.c:87
+#, fuzzy
+msgid ""
+"\\%-10[search-backward] Search backward for a specified string\n"
+" and select the node in which the previous occurrence is "
+"found.\n"
+msgstr " ¨ĂĽBżďžÜ¤U¤@­Óˇj´M¨ěŞşŚrŚęŠŇŚbŞş¸`ÂI.\n"
+
+#: info/infodoc.c:98
+#, c-format
+msgid " %-10s Quit this help.\n"
+msgstr " %-10s ľ˛§ôĽť¨D§U.\n"
+
+#: info/infodoc.c:99
+#, c-format
+msgid " %-10s Quit Info altogether.\n"
+msgstr " %-10s ¤@¨Öľ˛§ô Info ľ{ŚĄ.\n"
+
+#: info/infodoc.c:100
+#, c-format
+msgid " %-10s Invoke the Info tutorial.\n"
+msgstr " %-10s °őŚć Info ŤüžÉ˝Ňľ{.\n"
+
+#: info/infodoc.c:104
+#, c-format
+msgid " %-10s Move to the `next' node of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞş '¤U¤@­Ó (next)' ¸`ÂI.\n"
+
+#: info/infodoc.c:105
+#, c-format
+msgid " %-10s Move to the `previous' node of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞş '¤W¤@­Ó (previous)' ¸`ÂI.\n"
+
+#: info/infodoc.c:106
+#, c-format
+msgid " %-10s Move `up' from this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞş '¤W¤@źh (up)' ¸`ÂI.\n"
+
+#: info/infodoc.c:107
+#, c-format
+msgid " %-10s Pick menu item specified by name.\n"
+msgstr " %-10s ĽHŚWşŮżď¨úżďłćśľĽŘ.\n"
+
+#: info/infodoc.c:108
+msgid " Picking a menu item causes another node to be selected.\n"
+msgstr " żď¨úżďłćśľĽŘĽHżďžÜĽt¤@­Ó¸`ÂI.\n"
+
+#: info/infodoc.c:109
+#, c-format
+msgid " %-10s Follow a cross reference. Reads name of reference.\n"
+msgstr " %-10s ¸ňŔHĽć¤Ź°ŃˇÓ. ĹŞ¨ú°ŃˇÓŞşŚWşŮ.\n"
+
+#: info/infodoc.c:110
+#, c-format
+msgid " %-10s Move to the last node seen in this window.\n"
+msgstr " %-10s ˛ž°ĘŚÜĽť¤ŔšjľřľĄ¤¤, ¤W¤@­ÓĆ[ŹÝŞş¸`ÂI.\n"
+
+#: info/infodoc.c:111
+#, c-format
+msgid " %-10s Skip to next hypertext link within this node.\n"
+msgstr " %-10s ¸ő¨ěĽť¸`ÂI¤¤Şş¤U¤@­ÓśWĽť¤ĺłsľ˛.\n"
+
+#: info/infodoc.c:112
+#, c-format
+msgid " %-10s Follow the hypertext link under cursor.\n"
+msgstr " %-10s ¸ňŔH´ĺźĐ¤UŞşśWĽť¤ĺłsľ˛.\n"
+
+#: info/infodoc.c:113
+#, c-format
+msgid " %-10s Move to the `directory' node. Equivalent to `g (DIR)'.\n"
+msgstr " %-10s ˛žŚÜ `directory' ¸`ÂI. ŚP `g (DIR)'.\n"
+
+#: info/infodoc.c:114
+#, c-format
+msgid " %-10s Move to the Top node. Equivalent to `g Top'.\n"
+msgstr " %-10s ˛žŚÜ Top ¸`ÂI. ŚP `g TOP'.\n"
+
+#: info/infodoc.c:118
+#, c-format
+msgid " %-10s Scroll forward a page.\n"
+msgstr " %-10s ŚVŤeą˛°Ę¤@­ś.\n"
+
+#: info/infodoc.c:119
+#, c-format
+msgid " %-10s Scroll backward a page.\n"
+msgstr " %-10s ŚVŤáą˛°Ę¤@­ś.\n"
+
+#: info/infodoc.c:120
+#, c-format
+msgid " %-10s Go to the beginning of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞşś}ŔY.\n"
+
+#: info/infodoc.c:121
+#, c-format
+msgid " %-10s Go to the end of this node.\n"
+msgstr " %-10s ˛žŚÜĽť¸`ÂIŞşľ˛§Ŕ.\n"
+
+#: info/infodoc.c:122
+#, c-format
+msgid " %-10s Scroll forward 1 line.\n"
+msgstr " %-10s ŠšŤeą˛°Ę¤@Ść.\n"
+
+#: info/infodoc.c:123
+#, c-format
+msgid " %-10s Scroll backward 1 line.\n"
+msgstr " %-10s ŠšŤáą˛°Ę¤@Ść.\n"
+
+#: info/infodoc.c:127
+#, c-format
+msgid " %-10s Pick first ... ninth item in node's menu.\n"
+msgstr " %-10s ŹDżď¸`ÂIĽŘżý¤¤Şş˛Ä¤@­Ó...˛Ä¤E­ÓśľĽŘ.\n"
+
+#: info/infodoc.c:128
+#, c-format
+msgid " %-10s Pick last item in node's menu.\n"
+msgstr " %-10s ŹDżď¸`ÂIĽŘżýŞşłĚŤá¤@­ÓśľĽŘ.\n"
+
+#: info/infodoc.c:129
+#, c-format
+msgid ""
+" %-10s Search for a specified string in the index entries of this Info\n"
+msgstr " %-10s ŚbĽť Info ŔÉŞşŻÁ¤ŢśľĽŘ¤¤, ˇj´M¤@­ÓŤüŠwŞşŚrŚę,\n"
+
+#: info/infodoc.c:130
+msgid ""
+" file, and select the node referenced by the first entry "
+"found.\n"
+msgstr " ¨ĂĽBżďžÜ˛Ä¤@­Óˇj´M¨ěŞşśľĽŘŠŇ°ŃˇÓŞş¸`ÂI.\n"
+
+#: info/infodoc.c:131
+#, c-format
+msgid " %-10s Move to node specified by name.\n"
+msgstr " %-10s ˛ž°Ę¨ěŤüŠwŚWşŮŞş¸`ÂI.\n"
+
+#: info/infodoc.c:132
+msgid ""
+" You may include a filename as well, as in (FILENAME)NODENAME.\n"
+msgstr " ąz¤]ĽiĽHĽ]§tŔÉŚW, Śp: (ŔÉŚW)¸`ÂIŚW.\n"
+
+#: info/infodoc.c:133
+#, fuzzy, c-format
+msgid " %-10s Search forward for a specified string,\n"
+msgstr " %-10s ŚbĽť Info Ŕɤ¤, ŚVŤeˇj´M¤@­ÓŤüŠwŞşŚrŚę,\n"
+
+#: info/infodoc.c:134 info/infodoc.c:136
+msgid ""
+" and select the node in which the next occurrence is found.\n"
+msgstr " ¨ĂĽBżďžÜ¤U¤@­Óˇj´M¨ěŞşŚrŚęŠŇŚbŞş¸`ÂI.\n"
+
+#: info/infodoc.c:135
+#, fuzzy, c-format
+msgid " %-10s Search backward for a specified string\n"
+msgstr " %-10s ŚbĽť Info Ŕɤ¤, ŚVŤáˇj´M¤@­ÓŤüŠwŞşŚrŚę,\n"
+
+#: info/infodoc.c:316
+msgid "The current search path is:\n"
+msgstr "ĽŘŤeŞşˇj´M¸ôŽ|Ź°:\n"
+
+#: info/infodoc.c:320
+msgid ""
+"Commands available in Info windows:\n"
+"\n"
+msgstr ""
+"Śb Info ¤ŔšjľřľĄ¤¤ĽiĽÎŞşŤüĽO:\n"
+"\n"
+
+#: info/infodoc.c:324
+msgid ""
+"Commands available in the echo area:\n"
+"\n"
+msgstr ""
+"Ś^Ŕł°Ď¤¤ĽiĽÎŞşŤüĽO:\n"
+"\n"
+
+#: info/infodoc.c:347
+#, fuzzy, c-format
+msgid ""
+"The following commands can only be invoked via %s:\n"
+"\n"
+msgstr ""
+"ĽH¤UŞşŤüĽO, ĽuĽi¸gĽŃ M-x °őŚć:\n"
+"\n"
+
+#: info/infodoc.c:351
+#, fuzzy
+msgid ""
+"The following commands cannot be invoked at all:\n"
+"\n"
+msgstr ""
+"ĽH¤UŞşŤüĽO, ĽuĽi¸gĽŃ M-x °őŚć:\n"
+"\n"
+
+#: info/infodoc.c:375
+msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n"
+msgstr "--- ¨ĎĽÎ `\\[history-node]' ŠÎ `\\[kill-node]' Â÷ś}---\n"
+
+#: info/infodoc.c:485
+msgid "Display help message"
+msgstr "ĹăĽÜ¨D§U°TŽ§"
+
+#: info/infodoc.c:503
+msgid "Visit Info node `(info)Help'"
+msgstr "ŤôłX Info ¸`ÂI `(info)Help'"
+
+#: info/infodoc.c:641
+msgid "Print documentation for KEY"
+msgstr "ŚCĽX KEY Şş¤ĺĽó"
+
+#: info/infodoc.c:653
+#, c-format
+msgid "Describe key: %s"
+msgstr "´y­zŤöÁäŤüĽO: %s"
+
+#: info/infodoc.c:664
+#, c-format
+msgid "ESC %s is undefined."
+msgstr "ESC %s ĽźŠw¸q."
+
+#: info/infodoc.c:680 info/infodoc.c:709
+#, c-format
+msgid "%s is undefined."
+msgstr "%s ĽźŠw¸q."
+
+#: info/infodoc.c:730
+#, c-format
+msgid "%s is defined to %s."
+msgstr "%s Šw¸qŚ¨ %s."
+
+#: info/infodoc.c:1153
+msgid "Show what to type to execute a given command"
+msgstr "ĹăĽÜ°őŚćŹYŠRĽOŠŇťÝÁä¤JŞşŤöÁä"
+
+#: info/infodoc.c:1157
+msgid "Where is command: "
+msgstr ""
+
+#: info/infodoc.c:1179
+#, c-format
+msgid "`%s' is not on any keys"
+msgstr "`%s' ĽźĂ쾲¨ěĽôŚóŤöÁä"
+
+#: info/infodoc.c:1186
+#, c-format
+msgid "%s can only be invoked via %s."
+msgstr "%s ĽuŻŕ¸gĽŃ %s °őŚć."
+
+#: info/infodoc.c:1190
+#, c-format
+msgid "%s can be invoked via %s."
+msgstr "%s Ľi¸gĽŃ %s °őŚć."
+
+#: info/infodoc.c:1195
+#, c-format
+msgid "There is no function named `%s'"
+msgstr "¨SŚłŚWŹ° `%s' Şş¨çŚĄ"
+
+#: info/infokey.c:145
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"There is NO warranty. You may redistribute this software\n"
+"under the terms of the GNU General Public License.\n"
+"For more information about these matters, see the files named COPYING.\n"
+msgstr ""
+"Copyright (C) %s ŚŰĽŃłnĹé°ňŞ÷ˇ| Free Software Foundation, Inc.\n"
+"ĽťłnĹé*¤Ł§@ĽôŚóŤOĂŇ*. ązĽiŚb GNU ¤˝Ś@ąÂĹv \n"
+"(GNU General Public License) Şşąř´Ú¤U´˛§GĽťłnĹé.\n"
+"ąýŞž§óŚhŞş¸ÔąĄ, ˝ĐŹÝŔÉŚWŹ° COPYING ŞşŔÉŽ×.\n"
+
+#: info/infokey.c:170
+msgid "incorrect number of arguments"
+msgstr ""
+
+#: info/infokey.c:201
+#, fuzzy, c-format
+msgid "cannot open input file `%s'"
+msgstr "ľLŞkś}ąŇŚÜ `%s' ŞşşŢšD."
+
+#: info/infokey.c:215
+#, fuzzy, c-format
+msgid "cannot create output file `%s'"
+msgstr "ľLŞkŤŘĽßżéĽXŔÉŽ× `%s'."
+
+#: info/infokey.c:226
+#, c-format
+msgid "error writing to `%s'"
+msgstr ""
+
+#: info/infokey.c:232
+#, fuzzy, c-format
+msgid "error closing output file `%s'"
+msgstr "ľLŞkŤŘĽßżéĽXŔÉŽ× `%s'."
+
+#: info/infokey.c:450
+msgid "key sequence too long"
+msgstr ""
+
+#: info/infokey.c:529
+msgid "missing key sequence"
+msgstr ""
+
+#: info/infokey.c:610
+msgid "NUL character (\\000) not permitted"
+msgstr ""
+
+#: info/infokey.c:641
+#, c-format
+msgid "NUL character (^%c) not permitted"
+msgstr ""
+
+#: info/infokey.c:665
+#, fuzzy
+msgid "missing action name"
+msgstr "%c%s żňş|Ľk¤jŹA¸š"
+
+#: info/infokey.c:681 info/infokey.c:756
+msgid "section too long"
+msgstr ""
+
+#: info/infokey.c:688
+#, fuzzy, c-format
+msgid "unknown action `%s'"
+msgstr "ĽźŞžŞşŠRĽO `%s'"
+
+#: info/infokey.c:698
+msgid "action name too long"
+msgstr ""
+
+#: info/infokey.c:712
+#, c-format
+msgid "extra characters following action `%s'"
+msgstr ""
+
+#: info/infokey.c:723
+#, fuzzy
+msgid "missing variable name"
+msgstr "%s: żňş|ŔɎפޟĆ.\n"
+
+#: info/infokey.c:733
+msgid "missing `=' immediately after variable name"
+msgstr ""
+
+#: info/infokey.c:741
+msgid "variable name too long"
+msgstr ""
+
+#: info/infokey.c:765
+msgid "value too long"
+msgstr ""
+
+#: info/infokey.c:890
+#, c-format
+msgid "\"%s\", line %u: "
+msgstr ""
+
+#: info/infokey.c:906
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [INPUT-FILE]\n"
+"\n"
+"Compile infokey source file to infokey file. Reads INPUT-FILE (default\n"
+"$HOME/.infokey) and writes compiled key file to (by default) $HOME/.info.\n"
+"\n"
+"Options:\n"
+" --output FILE output to FILE instead of $HOME/.info\n"
+" --help display this help and exit.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: info/infomap.c:1500
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too small"
+msgstr ""
+
+#: info/infomap.c:1503
+#, c-format
+msgid "Ignoring invalid infokey file `%s' - too big"
+msgstr ""
+
+#: info/infomap.c:1516
+#, c-format
+msgid "Error reading infokey file `%s' - short read"
+msgstr ""
+
+#: info/infomap.c:1535
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad magic numbers) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1544
+#, c-format
+msgid "Your infokey file `%s' is out of date -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1560
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section length) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1581
+#, c-format
+msgid ""
+"Invalid infokey file `%s' (bad section code) -- run infokey to update it"
+msgstr ""
+
+#: info/infomap.c:1716
+msgid "Bad data in infokey file -- some key bindings ignored"
+msgstr ""
+
+#: info/infomap.c:1766
+msgid "Bad data in infokey file -- some var settings ignored"
+msgstr ""
+
+#: info/m-x.c:69
+msgid "Read the name of an Info command and describe it"
+msgstr "ĹŞ¨ú Info ŠRĽOŞşŚWşŮ, ¨ĂĽB´y­zĽŚ"
+
+#: info/m-x.c:73
+msgid "Describe command: "
+msgstr "´y­zŠRĽO: "
+
+#: info/m-x.c:96
+msgid "Read a command name in the echo area and execute it"
+msgstr "ŚbŚ^Ŕł°Ď¤¤ĹިúŠRĽOŚWşŮ, ¨ĂĽB°őŚćĽŚ"
+
+#: info/m-x.c:140
+msgid "Cannot execute an `echo-area' command here."
+msgstr "ľLŞkŚbło¸Ě°őŚć `echo-area' ŠRĽO."
+
+#: info/m-x.c:154
+#, fuzzy, c-format
+msgid "Undefined command: %s"
+msgstr "ĽźŞžŞşŠRĽO `%s'"
+
+#: info/m-x.c:160
+msgid "Set the height of the displayed window"
+msgstr "ł]ŠwĹăĽÜľřľĄŞş°ŞŤ×"
+
+#: info/m-x.c:173
+#, c-format
+msgid "Set screen height to (%d): "
+msgstr "ł]ŠwżĂšő°ŞŤ×Ź° (%d): "
+
+#: info/makedoc.c:162 info/makedoc.c:170
+#, c-format
+msgid ""
+" Source files groveled to make this file include:\n"
+"\n"
+msgstr ""
+
+#: info/makedoc.c:550
+#, c-format
+msgid "Couldn't manipulate the file %s.\n"
+msgstr "ľLŞkłB˛zŔÉŽ× %s.\n"
+
+#: info/nodemenu.c:31
+msgid ""
+"\n"
+"* Menu:\n"
+" (File)Node Lines Size Containing File\n"
+" ---------- ----- ---- ---------------"
+msgstr ""
+"\n"
+"* żďłć:\n"
+" (ŔÉŽ×)¸`ÂI Ść źĆ ¤j¤p Ľ] §t ŔÉ Ž×\n"
+" ---------- ----- ---- ---------------"
+
+#: info/nodemenu.c:202
+msgid ""
+"Here is the menu of nodes you have recently visited.\n"
+"Select one from this menu, or use `\\[history-node]' in another window.\n"
+msgstr ""
+"łoŹOązłĚŞńŤôłXšLŞş¸`ÂIżďłć.\n"
+"ŚŰĽťżďłćżď¨ú¤@śľ, ŠÎŹOŚbĽt¤@­Ó¤ŔšjľřľĄ¨ĎĽÎ `\\[history-node]' ŠRĽO.\n"
+
+#: info/nodemenu.c:224
+msgid "Make a window containing a menu of all of the currently visited nodes"
+msgstr "˛ŁĽÍ¤@­Ó¤ŔšjľřľĄ, Ľ]§tŠŇŚłłĚŞńŤôłXšLŞş¸`ÂIżďłć"
+
+#: info/nodemenu.c:304
+msgid "Select a node which has been previously visited in a visible window"
+msgstr "żď¨ú¤§ŤeŚbĽi¨Ł¤ŔšjľřľĄŤôłXšLŞş¸`ÂI"
+
+#: info/nodemenu.c:317
+msgid "Select visited node: "
+msgstr "żď¨úŤôłXšLŞş¸`ÂI: "
+
+#: info/nodemenu.c:337 info/session.c:2264
+#, c-format
+msgid "The reference disappeared! (%s)."
+msgstr "Ľć¤Ź°ŃˇÓ¤Ł¨Ł¤F! (%s)."
+
+#: info/session.c:162
+#, c-format
+msgid ""
+"Welcome to Info version %s. Type \\[get-help-window] for help, \\[menu-item] "
+"for menu item."
+msgstr ""
+"ĹwŞď¨ĎĽÎ Info ŞŠĽť %s. Áä¤J \\[get-help-window] ĽH¨úąo¨D§U¸ę°T, \\[menu-"
+"item] ĽH¨úąożďłćśľĽŘ."
+
+#: info/session.c:620
+msgid "Move down to the next line"
+msgstr "˛žŚÜ¤U¤@Ść"
+
+#: info/session.c:635
+msgid "Move up to the previous line"
+msgstr "˛žŚÜ¤W¤@Ść"
+
+#: info/session.c:650
+msgid "Move to the end of the line"
+msgstr "˛žŚÜĽťŚćľ˛§Ŕ"
+
+#: info/session.c:670
+msgid "Move to the start of the line"
+msgstr "˛žŚÜĽťŚćś}ŔY"
+
+#: info/session.c:860 makeinfo/node.c:1424
+msgid "Next"
+msgstr "¤U¤@­Ó"
+
+#: info/session.c:863
+msgid "Following Next node..."
+msgstr "¸ňŔH¤U¤@­Ó¸`ÂI..."
+
+#: info/session.c:881
+msgid "Selecting first menu item..."
+msgstr "żď¨ú˛Ä¤@­ÓżďłćśľĽŘ..."
+
+#: info/session.c:893
+msgid "Selecting Next node..."
+msgstr "żď¨ú¤U¤@­Ó¸`ÂI..."
+
+#: info/session.c:964
+#, c-format
+msgid "Moving Up %d time(s), then Next."
+msgstr "Šš¤W¤@źh˛ž°Ę %d Ś¸, ľMŤáŠš¤U¤@­Ó¤čŚV˛ž°Ę."
+
+#: info/session.c:988
+msgid "No more nodes within this document."
+msgstr "Ľť¤ĺĽó¤¤¨SŚł§óŚhŞş¸`ÂI¤F."
+
+#: info/session.c:1011
+msgid "No `Prev' for this node."
+msgstr "Ľť¸`ÂI¨SŚł `¤W¤@­Ó (Prev)' ¸`ÂI."
+
+#: info/session.c:1014 info/session.c:1073
+msgid "Moving Prev in this window."
+msgstr "ŚVĽť¤ŔšjľřľĄŞş ¤W¤@­Ó (Prev) ¸`ÂI˛ž°Ę."
+
+#: info/session.c:1030
+msgid "No `Prev' or `Up' for this node within this document."
+msgstr "ŚbĽť¤ĺĽó¤¤, Ľť¸`ÂI¨SŚł `¤W¤@­Ó (Prev)' ¸`ÂIŠÎ `¤W¤@źh (Up)' ¸`ÂI."
+
+#: info/session.c:1034
+msgid "Moving Up in this window."
+msgstr "ŚVĽť¤ŔšjľřľĄŞş¤W¤@źh¸`ÂI˛ž°Ę."
+
+#: info/session.c:1084
+msgid "Moving to `Prev's last menu item."
+msgstr "˛žŚÜŤe¤@­Ó¸`ÂIŞşłĚŤá¤@­ÓĽŘżýśľĽŘ."
+
+#: info/session.c:1095
+msgid "Move forwards or down through node structure"
+msgstr "Śb¸`ÂIľ˛şc¤¤, ŠšŤeŠÎŠš¤U˛ž°Ę"
+
+#: info/session.c:1111
+msgid "Move backwards or up through node structure"
+msgstr "Śb¸`ÂIľ˛şc¤¤, ŠšŤáŠÎŠš¤U˛ž°Ę"
+
+#: info/session.c:1205
+msgid "Scroll forward in this window"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤeą˛°Ę"
+
+#: info/session.c:1213
+msgid "Scroll forward in this window and set default window size"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤeą˛°Ę, ¨ĂĽBł]ŠwŚ¨šwł]Şş¤ŔšjľřľĄ¤Ř¤o"
+
+#: info/session.c:1221
+#, fuzzy
+msgid "Scroll forward in this window staying within node"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤeą˛°Ę"
+
+#: info/session.c:1229
+#, fuzzy
+msgid ""
+"Scroll forward in this window staying within node and set default window size"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤeą˛°Ę, ¨ĂĽBł]ŠwŚ¨šwł]Şş¤ŔšjľřľĄ¤Ř¤o"
+
+#: info/session.c:1237
+msgid "Scroll backward in this window"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤáą˛°Ę"
+
+#: info/session.c:1245
+msgid "Scroll backward in this window and set default window size"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤáą˛°Ę, ¨ĂĽBł]ŠwŚ¨šwł]Şş¤ŔšjľřľĄ¤Ř¤o"
+
+#: info/session.c:1254
+#, fuzzy
+msgid "Scroll backward in this window staying within node"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤáą˛°Ę"
+
+#: info/session.c:1262
+#, fuzzy
+msgid ""
+"Scroll backward in this window staying within node and set default window "
+"size"
+msgstr "ŚbĽť¤ŔšjľřľĄ¤¤ŚVŤáą˛°Ę, ¨ĂĽBł]ŠwŚ¨šwł]Şş¤ŔšjľřľĄ¤Ř¤o"
+
+#: info/session.c:1270
+msgid "Move to the start of this node"
+msgstr "˛žŚÜĽť¸`ÂIŞş°_ÂI"
+
+#: info/session.c:1277
+msgid "Move to the end of this node"
+msgstr "˛žŚÜĽť¸`ÂIŞşľ˛§Ŕ"
+
+#: info/session.c:1284
+msgid "Scroll down by lines"
+msgstr "¤@ŚćŚćŚV¤Uą˛°Ę"
+
+#: info/session.c:1301
+msgid "Scroll up by lines"
+msgstr "¤@ŚćŚćŚV¤Wą˛°Ę"
+
+#: info/session.c:1319
+msgid "Scroll down by half screen size"
+msgstr "ŚV¤Uą˛°ĘĽb­ÓżĂšőŞş¤j¤p"
+
+#: info/session.c:1345
+msgid "Scroll up by half screen size"
+msgstr "ŚV¤Wą˛°ĘĽb­ÓżĂšőŞş¤j¤p"
+
+#: info/session.c:1374
+msgid "Select the next window"
+msgstr "żďžÜ¤U¤@­Ó¤ŔšjľřľĄ"
+
+#: info/session.c:1413
+msgid "Select the previous window"
+msgstr "żďžÜŤe¤@­Ó¤ŔšjľřľĄ"
+
+#: info/session.c:1464
+msgid "Split the current window"
+msgstr "¤ŔšjĽŘŤeŞş¤ŔšjľřľĄ"
+
+#: info/session.c:1545
+msgid "Delete the current window"
+msgstr "§R°ŁĽŘŤeŞş¤ŔšjľřľĄ"
+
+#: info/session.c:1553
+msgid "Cannot delete a permanent window"
+msgstr "ľLŞk§R°ŁŠTŠwŞş¤ŔšjľřľĄ"
+
+#: info/session.c:1585
+msgid "Delete all other windows"
+msgstr "§R°ŁŠŇŚł¨äĽŚŞş¤ŔšjľřľĄ"
+
+#: info/session.c:1631
+msgid "Scroll the other window"
+msgstr "ą˛°ĘĽt¤@­Ó¤ŔšjľřľĄ"
+
+#: info/session.c:1652
+msgid "Scroll the other window backward"
+msgstr "ŚVŤáą˛°ĘĽt¤@­Ó¤ŔšjľřľĄ"
+
+#: info/session.c:1658
+msgid "Grow (or shrink) this window"
+msgstr "ÂX¤j (ŠÎÁY¤p) ło­Ó¤ŔšjľřľĄ"
+
+#: info/session.c:1669
+msgid "Divide the available screen space among the visible windows"
+msgstr "ŚbĽiĽÎŞşżĂšőŞĹśĄ¤¤, Ľ­§Ą¤ŔłÎŠŇŚłŞşĽi¨Ł¤ŔšjľřľĄ"
+
+#: info/session.c:1676
+msgid "Toggle the state of line wrapping in the current window"
+msgstr "¤Á´ŤĽŘŤe¤ŔšjľřľĄŞşŚŰ°Ę´ŤŚćŞŹşA"
+
+#: info/session.c:1848
+msgid "Select the Next node"
+msgstr "żď¨ú ¤U¤@­Ó ¸`ÂI"
+
+#: info/session.c:1856
+msgid "Select the Prev node"
+msgstr "żď¨ú Ťe¤@­Ó ¸`ÂI"
+
+#: info/session.c:1864
+msgid "Select the Up node"
+msgstr "żď¨ú ¤W¤@źh ¸`ÂI"
+
+#: info/session.c:1871
+msgid "Select the last node in this file"
+msgstr "żď¨úĽťŔɎתşłĚŤá¤@­Ó¸`ÂI"
+
+#: info/session.c:1898 info/session.c:1931
+msgid "This window has no additional nodes"
+msgstr "Ľť¤ŔšjľřľĄ¨SŚłĂBĽ~Şş¸`ÂI"
+
+#: info/session.c:1904
+msgid "Select the first node in this file"
+msgstr "żď¨úĽťŔɎתş˛Ä¤@­Ó¸`ÂI"
+
+#: info/session.c:1938
+msgid "Select the last item in this node's menu"
+msgstr "żď¨úĽť¸`ÂIżďłć¤¤, łĚŤá¤@­ÓśľĽŘ"
+
+#: info/session.c:1944
+msgid "Select this menu item"
+msgstr "żďžÜło¤@­ÓżďłćśľĽŘ"
+
+#: info/session.c:1977
+#, c-format
+msgid "There aren't %d items in this menu."
+msgstr "Ľťżďłć¤¤¨SŚł %d ­ÓśľĽŘ"
+
+#: info/session.c:2171 info/session.c:2172
+#, c-format
+msgid "Menu item (%s): "
+msgstr "żďłćśľĽŘ (%s): "
+
+#: info/session.c:2175
+msgid "Menu item: "
+msgstr "żďłćśľĽŘ: "
+
+#: info/session.c:2182 info/session.c:2183
+#, c-format
+msgid "Follow xref (%s): "
+msgstr "¸ňŔHĽć¤Ź°ŃˇÓ (%s): "
+
+#: info/session.c:2186
+msgid "Follow xref: "
+msgstr "¸ňŔHĽć¤Ź°ŃˇÓ: "
+
+#: info/session.c:2315
+msgid "Read a menu item and select its node"
+msgstr "ĹŞ¨ú¤@­ÓżďłćśľĽŘ, ¨ĂĽBżďžÜĽŚŞş¸`ÂI"
+
+#: info/session.c:2323
+msgid "Read a footnote or cross reference and select its node"
+msgstr "ĹŞ¨ú¤@­Óľů¸}ŠÎĽć¤Ź°ŃˇÓ, ¨ĂĽBżďžÜĽŚŞş¸`ÂI"
+
+#: info/session.c:2329
+msgid "Move to the start of this node's menu"
+msgstr "˛žŚÜĽť¸`ÂIŞşżďłćś}ŔY"
+
+#: info/session.c:2353
+msgid "Visit as many menu items at once as possible"
+msgstr "ž¨ĽiŻŕ¤@Ś¸ŤôłXłĚŚh­ÓżďłćśľĽŘ"
+
+#: info/session.c:2381
+msgid "Read a node name and select it"
+msgstr "ĹŞ¨ú¸`ÂIŚWşŮ, ¨ĂĽBżďžÜĽŚ"
+
+#: info/session.c:2436 info/session.c:2441
+msgid "Goto node: "
+msgstr "¸őŚÜ¸`ÂI: "
+
+#: info/session.c:2505
+#, c-format
+msgid "No menu in node `%s'."
+msgstr "¸`ÂI `%s' ¤¤¨SŚłżďłć."
+
+#: info/session.c:2551
+#, c-format
+msgid "No menu item `%s' in node `%s'."
+msgstr "żďłćśľĽŘ `%s' ¤ŁŚb¸`ÂI `%s' ¤¤."
+
+#: info/session.c:2581
+#, c-format
+msgid "Unable to find node referenced by `%s' in `%s'."
+msgstr "łQ°ŃˇÓŞş¸`ÂI `%s' Śb `%s' ¤¤§ä¤Ł¨ě."
+
+#: info/session.c:2631
+msgid "Read a list of menus starting from dir and follow them"
+msgstr "ĹŞ¨úŚŰ dir ś}ŠlŞş¸`ÂIąřŚC, ¨ĂĽB¸ňŔHĽŚ­Ě"
+
+#: info/session.c:2633
+msgid "Follow menus: "
+msgstr "¸ňŔHżďłć: "
+
+#: info/session.c:2826
+msgid "Find the node describing program invocation"
+msgstr "§ä´M´y­zľ{ŚĄ°őŚć¤čŞkŞş¸`ÂI"
+
+#: info/session.c:2828
+#, c-format
+msgid "Find Invocation node of [%s]: "
+msgstr "§ä´M [%s] Şş°őŚć¤čŞk¸`ÂI: "
+
+#: info/session.c:2866
+msgid "Read a manpage reference and select it"
+msgstr "ĹŞ¨ú˝u¤W¤âĽU (manpage) Şş°ŃˇÓ, ¨ĂĽBżďžÜĽŚ"
+
+#: info/session.c:2870
+msgid "Get Manpage: "
+msgstr "¨úąo˝u¤W¤âĽU (Manpage): "
+
+#: info/session.c:2900
+msgid "Select the node `Top' in this file"
+msgstr "żď¨úĽťŔɎפ¤Şş `Top' ¸`ÂI"
+
+#: info/session.c:2906
+msgid "Select the node `(dir)'"
+msgstr "żď¨ú¸`ÂI `(dir)'"
+
+#: info/session.c:2923 info/session.c:2925
+#, c-format
+msgid "Kill node (%s): "
+msgstr "§R°Ł¸`ÂI (%s): "
+
+#: info/session.c:2977
+#, c-format
+msgid "Cannot kill node `%s'"
+msgstr "ľLŞk§R°Ł¸`ÂI `%s'"
+
+#: info/session.c:2987
+msgid "Cannot kill the last node"
+msgstr "ľLŞk§R°Ł¤W¤@­Ó¸`ÂI"
+
+#: info/session.c:3073
+msgid "Select the most recently selected node"
+msgstr "żďžÜłĚŞń¤@Ś¸łQżďžÜŞş¸`ÂI"
+
+#: info/session.c:3079
+msgid "Kill this node"
+msgstr "§R°ŁĽť¸`ÂI"
+
+#: info/session.c:3087
+msgid "Read the name of a file and select it"
+msgstr "ĹŞ¨úŔɎ׌WşŮ, ľMŤáżď¨úĽŚ"
+
+#: info/session.c:3091
+msgid "Find file: "
+msgstr "§ä´MŔÉŽ×: "
+
+#: info/session.c:3108
+#, c-format
+msgid "Cannot find `%s'."
+msgstr "ľLŞk§ä¨ě `%s'."
+
+#: info/session.c:3151 info/session.c:3269
+#, c-format
+msgid "Could not create output file `%s'."
+msgstr "ľLŞkŤŘĽßżéĽXŔÉŽ× `%s'."
+
+#: info/session.c:3165 info/session.c:3287 info/session.c:3347
+msgid "Done."
+msgstr "§šŚ¨."
+
+#: info/session.c:3220
+#, c-format
+msgid "Writing node %s..."
+msgstr "źg¤J¸`ÂI %s ¤¤..."
+
+#: info/session.c:3296
+msgid "Pipe the contents of this node through INFO_PRINT_COMMAND"
+msgstr "ąNĽť¸`ÂIŞş¤şŽe, ¸gĽŃşŢšD (pipe) °eŚÜ INFO_PRINT_COMMAND"
+
+#: info/session.c:3331
+#, c-format
+msgid "Cannot open pipe to `%s'."
+msgstr "ľLŞkś}ąŇŚÜ `%s' ŞşşŢšD."
+
+#: info/session.c:3337
+#, c-format
+msgid "Printing node %s..."
+msgstr "ŚCŚL¸`ÂI %s ¤¤..."
+
+#: info/session.c:3567
+#, c-format
+msgid "Searching subfile %s ..."
+msgstr "ˇj´M¤lŔÉŽ× %s ..."
+
+#: info/session.c:3619
+msgid "Read a string and search for it case-sensitively"
+msgstr "ĹŞ¨ú¤@­ÓŚrŚę, ľMŤáĽH°Ď¤Ŕ¤j¤pźg¤čŚĄˇj´M"
+
+#: info/session.c:3626
+msgid "Read a string and search for it"
+msgstr "ĹŞ¨ú¤@­ÓŚrŚę, ľMŤáˇj´M"
+
+#: info/session.c:3634
+msgid "Read a string and search backward for it"
+msgstr "ĹŞ¨ú¤@­ÓŚrŚę, ľMŤáŚVŤáˇj´M"
+
+#: info/session.c:3670 info/session.c:3677
+#, c-format
+msgid "%s%sfor string [%s]: "
+msgstr "%s%s [%s]: "
+
+#: info/session.c:3671 info/session.c:3678
+msgid "Search backward"
+msgstr "ŚVŤáˇj´MŚrŚę"
+
+#: info/session.c:3672 info/session.c:3678
+msgid "Search"
+msgstr "ˇj´MŚrŚę"
+
+#: info/session.c:3673 info/session.c:3679
+msgid " case-sensitively "
+msgstr ", ĽH°Ď¤Ŕ¤j¤pźgŞş¤čŚĄ"
+
+#: info/session.c:3674 info/session.c:3679
+msgid " "
+msgstr " "
+
+#: info/session.c:3718
+msgid "Search failed."
+msgstr "ˇj´MĽ˘ąŃ."
+
+#: info/session.c:3736
+msgid "Repeat last search in the same direction"
+msgstr "ĽHŚPźËŞşˇj´M¤čŚV­ŤÂФWŚ¸Şşˇj´M"
+
+#: info/session.c:3739 info/session.c:3749
+msgid "No previous search string"
+msgstr "¨SŚłŤe¤@Ś¸Şşˇj´MŚrŚę"
+
+#: info/session.c:3746
+msgid "Repeat last search in the reverse direction"
+msgstr "ĽHŹŰ¤ĎŞşˇj´M¤čŚV­ŤÂФWŚ¸Şşˇj´M"
+
+#: info/session.c:3765 info/session.c:3771
+msgid "Search interactively for a string as you type it"
+msgstr "ĽH¤Ź°Ę¤čŚĄ, Ăäżé¤JŚrŚęĂäˇj´M"
+
+#: info/session.c:3851
+msgid "I-search backward: "
+msgstr "¤ĎŚV¤Ź°Ęˇj´M: "
+
+#: info/session.c:3853
+msgid "I-search: "
+msgstr "¤Ź°Ęˇj´M: "
+
+#: info/session.c:3878 info/session.c:3880
+msgid "Failing "
+msgstr "Ľ˘ąŃ "
+
+#: info/session.c:4340
+msgid "Move to the previous cross reference"
+msgstr "˛ž°ĘŚÜŤe¤@­ÓĽć¤Ź°ŃˇÓ"
+
+#: info/session.c:4349
+msgid "Move to the next cross reference"
+msgstr "˛ž°ĘŚÜ¤U¤@­ÓĽć¤Ź°ŃˇÓ"
+
+#: info/session.c:4359
+msgid "Select reference or menu item appearing on this line"
+msgstr "żďžÜĽX˛{ŚbĽťŚćŞş°ŃˇÓŠÎżďłćśľĽŘ"
+
+#: info/session.c:4382
+msgid "Cancel current operation"
+msgstr "¨úŽřĽŘŤeŞş§@ˇ~"
+
+#: info/session.c:4389
+msgid "Quit"
+msgstr "ľ˛§ô"
+
+#: info/session.c:4398
+msgid "Move the cursor to a specific line of the window"
+msgstr "˛ž°Ę´ĺźĐŚÜ¤ŔšjľřľĄ¤¤ŞşŤüŠwŚě¸m"
+
+#: info/session.c:4430
+msgid "Redraw the display"
+msgstr "­ŤĂ¸ľe­ą"
+
+#: info/session.c:4467
+msgid "Quit using Info"
+msgstr "ľ˛§ô¨ĎĽÎ Info"
+
+#: info/session.c:4480
+msgid "Run command bound to this key's lowercase variant"
+msgstr ""
+
+#: info/session.c:4491
+#, c-format
+msgid "Unknown command (%s)."
+msgstr "ĽźŞžŞşŠRĽO (%s)."
+
+#: info/session.c:4494
+#, c-format
+msgid "\"%s\" is invalid"
+msgstr "\"%s\" ¤ŁŚXŞk"
+
+#: info/session.c:4495
+#, fuzzy, c-format
+msgid "`%s' is invalid"
+msgstr "\"%s\" ¤ŁŚXŞk"
+
+#: info/session.c:4709
+msgid "Add this digit to the current numeric argument"
+msgstr "ąNĽťźĆŚrĽ[ŚÜĽŘŤeŞşźĆ­Č¤ŢźĆ"
+
+#: info/session.c:4718
+msgid "Start (or multiply by 4) the current numeric argument"
+msgstr "ś}ŠlĽŘŤeŞşźĆ­Č¤ŢźĆ (ŠÎŹO­źĽH 4)"
+
+#: info/session.c:4733
+msgid "Internally used by \\[universal-argument]"
+msgstr "Śb¤şłĄłQ \\[universal-argument] ¨ĎĽÎ"
+
+#: info/tilde.c:338
+#, c-format
+msgid "readline: Out of virtual memory!\n"
+msgstr "readline: ŻÓşÉľęŔŔ°OžĐĹé!\n"
+
+#: info/variables.c:37
+msgid "When \"On\", footnotes appear and disappear automatically"
+msgstr "ˇíł]ŠwŚb \"On\" ŽÉ, ľů¸}ˇ|ŚŰ°ĘĽX˛{ťPŽřĽ˘"
+
+#: info/variables.c:41
+msgid "When \"On\", creating or deleting a window resizes other windows"
+msgstr "ł]ŠwŚb \"On\" ŽÉ, ŤŘĽßŠÎ§R°Ł¤@­Ó¤ŔšjľřľĄˇ|Ĺܧó¨äĽŚŞş¤ŔšjľřľĄŞş¤j¤p"
+
+#: info/variables.c:45
+msgid "When \"On\", flash the screen instead of ringing the bell"
+msgstr "ł]ŠwŚb \"On\" ŽÉ, ĽHľe­ą°{°ĘĽN´ŔĹTša"
+
+#: info/variables.c:49
+msgid "When \"On\", errors cause the bell to ring"
+msgstr "ł]ŠwŚb \"On\" ŽÉ, ľoĽÍżůť~ˇ|ĹTša"
+
+#: info/variables.c:53
+msgid "When \"On\", Info garbage collects files which had to be uncompressed"
+msgstr "When \"On\", Info garbage collects files which had to be uncompressed"
+
+#: info/variables.c:56
+msgid "When \"On\", the portion of the matched search string is highlighted"
+msgstr "ł]ŠwŚb \"On\" ŽÉ, ˛ĹŚXˇj´MŚrŚęŞşłĄĽ÷ˇ|łQźĐĽÜ°_¨Ó"
+
+#: info/variables.c:60
+msgid "Controls what happens when scrolling is requested at the end of a node"
+msgstr "ąą¨îŚb¸`ÂIŞşľ˛§ŔŽÉ, ą˛°Ęˇ|Śł¤°ťň¤ĎŔł"
+
+#: info/variables.c:64
+msgid "The number lines to scroll when the cursor moves out of the window"
+msgstr "ąą¨îˇí´ĺźĐ˛ž°ĘŚÜ¤ŔšjľřľĄĽ~ŽÉ, ą˛°ĘŞşŚćźĆ"
+
+#: info/variables.c:68
+msgid "When \"On\", Info accepts and displays ISO Latin characters"
+msgstr "ˇíł]ŠwŚb \"On\" ŽÉ, Info Ľiąľ¨ü¨ĂĹăĽÜ ISO Latin Śr¤¸"
+
+#: info/variables.c:74
+msgid "Explain the use of a variable"
+msgstr "¸ŃÄŔĹܟƪşĽÎŞk"
+
+#: info/variables.c:80
+msgid "Describe variable: "
+msgstr "´y­zĹÜźĆ: "
+
+#: info/variables.c:99
+msgid "Set the value of an Info variable"
+msgstr "ł]Šw Info ĹܟƪşźĆ­Č"
+
+#: info/variables.c:105
+msgid "Set variable: "
+msgstr "ł]ŠwĹÜźĆ: "
+
+#: info/variables.c:123
+#, c-format
+msgid "Set %s to value (%d): "
+msgstr "ł]Šw %s ŞşźĆ­Č (%d): "
+
+#: info/variables.c:164
+#, c-format
+msgid "Set %s to value (%s): "
+msgstr "ł]Šw %s ŞşźĆ­Č (%s): "
+
+#: info/window.c:1138
+msgid "--*** Tags out of Date ***"
+msgstr ""
+
+#: info/window.c:1149
+msgid "-----Info: (), lines ----, "
+msgstr "-----Info: (), ŚćźĆ ----, "
+
+#: info/window.c:1156
+#, c-format
+msgid "-%s---Info: %s, %d lines --%s--"
+msgstr "-%s---Info: %s, Ś@ %d Ść --%s--"
+
+#: info/window.c:1160
+#, c-format
+msgid "-%s%s-Info: (%s)%s, %d lines --%s--"
+msgstr "-%s%s-Info: (%s)%s, Ś@ %d Ść --%s--"
+
+#: info/window.c:1167
+#, c-format
+msgid " Subfile: %s"
+msgstr " ¤lŔÉŽ×: %s"
+
+#: lib/getopt.c:551 lib/getopt.c:570
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: żďśľ `%s' ¤ŁŠú\n"
+
+#: lib/getopt.c:603 lib/getopt.c:607
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: żďśľ `--%s' ¤ŁĽi§tŚł¤ŢźĆ\n"
+
+#: lib/getopt.c:616 lib/getopt.c:621
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: żďśľ `%c%s' ¤ŁĽi§tŚł¤ŢźĆ\n"
+
+#: lib/getopt.c:667 lib/getopt.c:689 lib/getopt.c:1020 lib/getopt.c:1042
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: żďśľ `%s' Ľ˛śˇ§tŚł¤ŢźĆ\n"
+
+#: lib/getopt.c:727 lib/getopt.c:730
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: ĽźŞžŞşżďśľ `--%s'\n"
+
+#: lib/getopt.c:738 lib/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: ĽźŞžŞşżďśľ `%c%s'\n"
+
+#: lib/getopt.c:796 lib/getopt.c:799
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: ¤ŁŚXŞkŞşżďśľ -- %c\n"
+
+#: lib/getopt.c:805 lib/getopt.c:808
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ľLŽÄŞşżďśľ -- %c\n"
+
+#: lib/getopt.c:863 lib/getopt.c:882 lib/getopt.c:1095 lib/getopt.c:1116
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: żďśľĽ˛śˇ§tŚł¤ŢźĆ -- %c\n"
+
+#: lib/getopt.c:935 lib/getopt.c:954
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: żďśľ `-W %s' ¤ŁŠú˝T\n"
+
+#: lib/getopt.c:978 lib/getopt.c:999
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: żďśľ `-W %s' ¤ŁĽi§tŚł¤ŢźĆ\n"
+
+#: makeinfo/cmds.c:520 makeinfo/cmds.c:542
+#, fuzzy, c-format
+msgid "arguments to @%s ignored"
+msgstr "šď %c%s ľLĽÎŞş¤ŢźĆ"
+
+#: makeinfo/cmds.c:585
+msgid "January"
+msgstr "¤@¤ë"
+
+#: makeinfo/cmds.c:585
+msgid "February"
+msgstr "¤G¤ë"
+
+#: makeinfo/cmds.c:585
+msgid "March"
+msgstr "¤T¤ë"
+
+#: makeinfo/cmds.c:585
+msgid "April"
+msgstr "Ľ|¤ë"
+
+#: makeinfo/cmds.c:585
+msgid "May"
+msgstr "¤­¤ë"
+
+#: makeinfo/cmds.c:586
+msgid "June"
+msgstr "¤ť¤ë"
+
+#: makeinfo/cmds.c:586
+msgid "July"
+msgstr "¤C¤ë"
+
+#: makeinfo/cmds.c:586
+msgid "August"
+msgstr "¤K¤ë"
+
+#: makeinfo/cmds.c:586
+msgid "September"
+msgstr "¤E¤ë"
+
+#: makeinfo/cmds.c:586
+msgid "October"
+msgstr "¤Q¤ë"
+
+#: makeinfo/cmds.c:587
+msgid "November"
+msgstr "¤Q¤@¤ë"
+
+#: makeinfo/cmds.c:587
+msgid "December"
+msgstr "¤Q¤G¤ë"
+
+#: makeinfo/cmds.c:936
+#, c-format
+msgid "unlikely character %c in @var"
+msgstr ""
+
+#: makeinfo/cmds.c:979
+msgid "@sc argument all uppercase, thus no effect"
+msgstr "@sc Şş¤ŢźĆĽţŹO¤jźg, ŠŇĽH¨SŚł§@ĽÎ"
+
+#: makeinfo/cmds.c:1034
+#, c-format
+msgid "`{' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1074
+msgid "end of file inside verb block"
+msgstr ""
+
+#: makeinfo/cmds.c:1082
+#, c-format
+msgid "`}' expected, but saw `%c'"
+msgstr ""
+
+#: makeinfo/cmds.c:1112
+msgid ""
+"@strong{Note...} produces a spurious cross-reference in Info; reword to "
+"avoid that"
+msgstr ""
+
+#: makeinfo/cmds.c:1305
+#, c-format
+msgid "%c%s is obsolete"
+msgstr "%c%s ¤wźo¤î¤ŁĽÎ"
+
+#: makeinfo/cmds.c:1414
+#, c-format
+msgid "@sp requires a positive numeric argument, not `%s'"
+msgstr "@sp Ľ˛śˇŚł¤@­ÓĽżžăźĆŞş¤ŢźĆ, ŚÓ¤ŁŹO `%s'"
+
+#: makeinfo/cmds.c:1763 makeinfo/cmds.c:1819 makeinfo/footnote.c:82
+#, c-format
+msgid "Bad argument to %c%s"
+msgstr "šď %c%s ľLĽÎŞş¤ŢźĆ"
+
+#: makeinfo/cmds.c:1773 makeinfo/makeinfo.c:4142
+msgid "asis"
+msgstr ""
+
+#: makeinfo/cmds.c:1775 makeinfo/cmds.c:1805 makeinfo/makeinfo.c:4144
+msgid "none"
+msgstr ""
+
+#: makeinfo/cmds.c:1789
+#, fuzzy, c-format
+msgid "Bad argument to @%s"
+msgstr "šď %c%s ľLĽÎŞş¤ŢźĆ"
+
+#: makeinfo/cmds.c:1803
+msgid "insert"
+msgstr ""
+
+#: makeinfo/defun.c:84
+msgid "Missing `}' in @def arg"
+msgstr "@def °ŃźĆ¤¤żňş| `}'"
+
+#: makeinfo/defun.c:403
+msgid "Function"
+msgstr ""
+
+#: makeinfo/defun.c:406
+msgid "Macro"
+msgstr ""
+
+#: makeinfo/defun.c:409
+msgid "Special Form"
+msgstr ""
+
+#: makeinfo/defun.c:413
+msgid "Variable"
+msgstr ""
+
+#: makeinfo/defun.c:416
+msgid "User Option"
+msgstr ""
+
+#: makeinfo/defun.c:420
+msgid "Instance Variable"
+msgstr ""
+
+#: makeinfo/defun.c:424
+msgid "Method"
+msgstr ""
+
+#: makeinfo/defun.c:500 makeinfo/defun.c:505 makeinfo/defun.c:545
+#: makeinfo/defun.c:644 makeinfo/xml.c:2229
+msgid "of"
+msgstr ""
+
+#: makeinfo/defun.c:509 makeinfo/defun.c:513 makeinfo/defun.c:517
+#: makeinfo/defun.c:551 makeinfo/defun.c:650 makeinfo/xml.c:2234
+msgid "on"
+msgstr ""
+
+#: makeinfo/defun.c:711
+#, c-format
+msgid "Must be in `@%s' environment to use `@%s'"
+msgstr ""
+
+#: makeinfo/files.c:435
+#, c-format
+msgid "%s: getwd: %s, %s\n"
+msgstr "%s: getwd: %s, %s\n"
+
+#: makeinfo/files.c:638
+#, c-format
+msgid "`%s' omitted before output filename"
+msgstr ""
+
+#: makeinfo/files.c:646
+#, c-format
+msgid "`%s' omitted since writing to stdout"
+msgstr ""
+
+#: makeinfo/files.c:694
+msgid "Output buffer not empty."
+msgstr ""
+
+#: makeinfo/footnote.c:150
+#, c-format
+msgid "`%c%s' needs an argument `{...}', not just `%s'"
+msgstr "`%c%s' Ľ˛śˇĽ]§t¤ŢźĆ `{...}', ŚÓ¤ŁŹOĽuŚł `%s'"
+
+#: makeinfo/footnote.c:165
+#, c-format
+msgid "No closing brace for footnote `%s'"
+msgstr "ľů¸} `%s' ¨SŚłĽk¤jŹA¸š"
+
+#: makeinfo/footnote.c:198
+msgid "Footnote defined without parent node"
+msgstr "Šw¸qľů¸}, ŚýŹO¨SŚł¤÷¸`ÂI"
+
+#: makeinfo/footnote.c:210
+#, fuzzy
+msgid "Footnotes inside footnotes are not allowed"
+msgstr "Šw¸qľů¸}, ŚýŹO¨SŚł¤÷¸`ÂI"
+
+#: makeinfo/footnote.c:302 makeinfo/index.c:189
+msgid "Footnotes"
+msgstr "ľů¸}"
+
+#: makeinfo/html.c:87
+#, c-format
+msgid "%s: could not open --css-file: %s"
+msgstr ""
+
+#: makeinfo/html.c:172
+#, c-format
+msgid "%s:%d: --css-file ended in comment"
+msgstr ""
+
+#: makeinfo/html.c:207
+msgid "Untitled"
+msgstr ""
+
+#: makeinfo/html.c:422
+msgid "[unexpected] no html tag to pop"
+msgstr ""
+
+#: makeinfo/html.c:752
+#, fuzzy, c-format
+msgid "[unexpected] invalid node name: `%s'"
+msgstr "%s: ĽźŞžŞşżďśľ `%c%s'\n"
+
+#: makeinfo/index.c:169
+#, c-format
+msgid "Unknown index `%s'"
+msgstr "ĽźŞžŞşŻÁ¤Ţ `%s'"
+
+#: makeinfo/index.c:234
+#, c-format
+msgid "Info cannot handle `:' in index entry `%s'"
+msgstr ""
+
+#: makeinfo/index.c:412
+#, c-format
+msgid "Index `%s' already exists"
+msgstr "ŻÁ¤Ţ `%s' ¤wŚsŚb"
+
+#: makeinfo/index.c:455
+#, c-format
+msgid "Unknown index `%s' and/or `%s' in @synindex"
+msgstr "@synindex ¤¤ŚłĽźŞžŞşŻÁ¤Ţ `%s' ťP/ŠÎ `%s'"
+
+#: makeinfo/index.c:661
+msgid "(line )"
+msgstr ""
+
+#: makeinfo/index.c:669
+#, c-format
+msgid "(line %*d)"
+msgstr ""
+
+#: makeinfo/index.c:750
+#, c-format
+msgid "Unknown index `%s' in @printindex"
+msgstr "@printindex ¤¤ŚłĽźŞžŞşŻÁ¤Ţ `%s'"
+
+#: makeinfo/index.c:819
+#, c-format
+msgid "Entry for index `%s' outside of any node"
+msgstr "ŻÁ¤Ţ `%s' ŞşśľĽŘ¤ŁŚbĽôŚóŞş¸`ÂI¤ş"
+
+#: makeinfo/index.c:822 makeinfo/index.c:858
+msgid "(outside of any node)"
+msgstr "(¤ŁŚbĽôŚóŞş¸`ÂI¤ş)"
+
+#: makeinfo/index.c:919 makeinfo/index.c:925
+msgid "See "
+msgstr ""
+
+#: makeinfo/insertion.c:160
+msgid "@item not allowed in argument to @itemize"
+msgstr ""
+
+#: makeinfo/insertion.c:238
+msgid "Broken-Type in insertion_type_pname"
+msgstr ""
+
+#: makeinfo/insertion.c:334
+msgid "Enumeration stack overflow"
+msgstr ""
+
+#: makeinfo/insertion.c:366
+#, c-format
+msgid "lettering overflow, restarting at %c"
+msgstr ""
+
+#: makeinfo/insertion.c:631
+#, c-format
+msgid "%s requires an argument: the formatter for %citem"
+msgstr ""
+
+#: makeinfo/insertion.c:719
+#, c-format
+msgid "%cfloat environments cannot be nested"
+msgstr ""
+
+#: makeinfo/insertion.c:973
+#, c-format
+msgid "`@end' expected `%s', but saw `%s'"
+msgstr ""
+
+#: makeinfo/insertion.c:1337
+#, c-format
+msgid "No matching `%cend %s'"
+msgstr "No matching `%cend %s'"
+
+#: makeinfo/insertion.c:1592
+#, c-format
+msgid "%s requires letter or digit"
+msgstr "%s Ľ˛śˇ­nŚłŚr¤¸ŠÎŹOźĆŚr"
+
+#: makeinfo/insertion.c:1687
+msgid "end of file inside verbatim block"
+msgstr ""
+
+#: makeinfo/insertion.c:1913
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@float' environment"
+msgstr "@%s Śb `@%s' °Ďśô¤§¤ş, ¨Ă¤Ł¨ăŚłˇN¸q"
+
+#: makeinfo/insertion.c:1949
+msgid "@menu seen before first @node, creating `Top' node"
+msgstr "@menu Śb˛Ä¤@­Ó @node ¤§ŤeĽX˛{, ąNŤŘĽß `Top' ¸`ÂI"
+
+#: makeinfo/insertion.c:1950
+msgid ""
+"perhaps your @top node should be wrapped in @ifnottex rather than @ifinfo?"
+msgstr "¤]ł\ązŔł¸Ó§â @top ¸`ÂIĽ]§tŚb @ifnottex, ŚÓ¤ŁŹO @ifinfo?"
+
+#: makeinfo/insertion.c:1962
+msgid "@detailmenu seen before first node, creating `Top' node"
+msgstr "Śb˛Ä¤@­Ó¸`ÂI¤§ŤeĽX˛{ @detailmenu, ąNŤŘĽß `Top' ¸`ÂI"
+
+#: makeinfo/insertion.c:2018
+#, c-format
+msgid "@%s not meaningful outside `@titlepage' and `@quotation' environments"
+msgstr ""
+
+#: makeinfo/insertion.c:2032
+#, fuzzy, c-format
+msgid "@%s not meaningful outside `@titlepage' environment"
+msgstr "@%s Śb `@%s' °Ďśô¤§¤ş, ¨Ă¤Ł¨ăŚłˇN¸q"
+
+#: makeinfo/insertion.c:2063
+#, c-format
+msgid "Unmatched `%c%s'"
+msgstr "Ľź°tšďŞş `%c%s'"
+
+#: makeinfo/insertion.c:2068
+#, c-format
+msgid "`%c%s' needs something after it"
+msgstr "Śb `%c%s' ¤§ŤáĽ˛śˇ­nŚłŞFŚč"
+
+#: makeinfo/insertion.c:2074
+#, fuzzy, c-format
+msgid "Bad argument `%s' to `@%s', using `%s'"
+msgstr "šď %c%s ľLĽÎŞş¤ŢźĆ"
+
+#: makeinfo/insertion.c:2171
+#, c-format
+msgid "@%s not meaningful inside `@%s' block"
+msgstr "@%s Śb `@%s' °Ďśô¤§¤ş, ¨Ă¤Ł¨ăŚłˇN¸q"
+
+#: makeinfo/insertion.c:2180
+#, c-format
+msgid "@itemx not meaningful inside `%s' block"
+msgstr "`%s' °Ďśô¤§¤ş, @itemx ¨ĂľLˇN¸q"
+
+#: makeinfo/insertion.c:2356
+#, c-format
+msgid "%c%s found outside of an insertion block"
+msgstr ""
+
+#: makeinfo/lang.c:580
+#, c-format
+msgid "%s is not a valid ISO 639 language code"
+msgstr "%s ¤ŁŹO¤@­ÓŚXŞkŞş ISO 639 ťy¨Ľ˝X"
+
+#: makeinfo/lang.c:655
+#, fuzzy, c-format
+msgid "unrecognized encoding name `%s'"
+msgstr "%s: ĽźŞžŞşżďśľ `%c%s'\n"
+
+#: makeinfo/lang.c:663
+#, c-format
+msgid "sorry, encoding `%s' not supported"
+msgstr ""
+
+#: makeinfo/lang.c:715
+#, c-format
+msgid "invalid encoded character `%s'"
+msgstr ""
+
+#: makeinfo/lang.c:1009
+#, c-format
+msgid "%c%s expects `i' or `j' as argument, not `%c'"
+msgstr "%c%s ´Áąć¨ĎĽÎ `i' ŠÎ `j' §@Ź°¤ŢźĆ, ŚÓ¤ŁŹO `%c'"
+
+#: makeinfo/lang.c:1013
+#, c-format
+msgid "%c%s expects a single character `i' or `j' as argument"
+msgstr "%c%s ´Áąć¨ĎĽÎ¤@­ÓŚrĽŔ `i' ŠÎ `j' §@Ź°¤ŢźĆ"
+
+#: makeinfo/macro.c:128
+#, c-format
+msgid "macro `%s' previously defined"
+msgstr "Ľ¨ś° `%s' ¤wŠw¸qšL"
+
+#: makeinfo/macro.c:132
+#, c-format
+msgid "here is the previous definition of `%s'"
+msgstr "ło¸ĚŹO `%s' ¤§ŤeŞşŠw¸q"
+
+#: makeinfo/macro.c:355
+#, c-format
+msgid "\\ in macro expansion followed by `%s' instead of parameter name"
+msgstr ""
+
+#: makeinfo/macro.c:401
+#, c-format
+msgid "Macro `%s' called on line %d with too many args"
+msgstr "Ľ¨ś° `%s' Śb˛Ä %d ŚćłQŠIĽs, ŚýŹO¤ŢźĆšLŚh"
+
+#: makeinfo/macro.c:586
+#, c-format
+msgid "%cend macro not found"
+msgstr ""
+
+#: makeinfo/macro.c:624
+msgid "@quote-arg only useful for single-argument macros"
+msgstr "@quote-arg ĽuŚbłć¤@¤ŢźĆŞşĽ¨ś°ŚłĽÎ"
+
+#: makeinfo/macro.c:660
+#, c-format
+msgid "mismatched @end %s with @%s"
+msgstr "@end %s ťP @%s ¤Ł˛ĹŚX"
+
+#: makeinfo/makeinfo.c:184
+#, c-format
+msgid "Too many errors! Gave up.\n"
+msgstr "żůť~šLŚh! Šńąó.\n"
+
+#: makeinfo/makeinfo.c:302
+#, c-format
+msgid "%s:%d: warning: "
+msgstr "%s:%d: Äľ§i: "
+
+#: makeinfo/makeinfo.c:321 makeinfo/makeinfo.c:2260
+#, c-format
+msgid "Misplaced %c"
+msgstr "ť~¸mŞş %c"
+
+#: makeinfo/makeinfo.c:340
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "¸Ő¸Ő `%s --help' ĽH¨úąo§óŚhŞş¸ę°T.\n"
+
+#: makeinfo/makeinfo.c:343
+#, fuzzy, c-format
+msgid "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+msgstr "ĽÎŞk: %s [OPTION]... FILE...\n"
+
+#: makeinfo/makeinfo.c:346
+msgid ""
+"Translate Texinfo source documentation to various other formats, by default\n"
+"Info files suitable for reading online with Emacs or standalone GNU Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:350
+#, c-format
+msgid ""
+"General options:\n"
+" --error-limit=NUM quit after NUM errors (default %d).\n"
+" --force preserve output even if errors.\n"
+" --help display this help and exit.\n"
+" --no-validate suppress node cross-reference validation.\n"
+" --no-warn suppress warnings (but not errors).\n"
+" --reference-limit=NUM warn about at most NUM references (default %"
+"d).\n"
+" -v, --verbose explain what is being done.\n"
+" --version display version information and exit.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:364
+#, no-wrap
+msgid ""
+"Output format selection (default is to produce Info):\n"
+" --docbook output Docbook XML rather than Info.\n"
+" --html output HTML rather than Info.\n"
+" --xml output Texinfo XML rather than Info.\n"
+" --plaintext output plain text rather than Info.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:372
+msgid ""
+"General output options:\n"
+" -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+" ignoring any @setfilename.\n"
+" --no-headers suppress node separators, Node: lines, and "
+"menus\n"
+" from Info output (thus producing plain text)\n"
+" or from HTML (thus producing shorter output);\n"
+" also, write to standard output by default.\n"
+" --no-split suppress splitting of Info or HTML output,\n"
+" generate only one output file.\n"
+" --number-sections output chapter and sectioning numbers.\n"
+" -o, --output=FILE output to FILE (directory if split HTML),\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:386
+#, c-format
+msgid ""
+"Options for Info and plain text:\n"
+" --enable-encoding output accented and special characters in\n"
+" Info output based on @documentencoding.\n"
+" --fill-column=NUM break Info lines at NUM characters (default %"
+"d).\n"
+" --footnote-style=STYLE output footnotes in Info according to STYLE:\n"
+" `separate' to put them in their own node;\n"
+" `end' to put them at the end of the node\n"
+" in which they are defined (default).\n"
+" --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+"d).\n"
+" If VAL is `none', do not indent; if VAL is\n"
+" `asis', preserve existing indentation.\n"
+" --split-size=NUM split Info files at size NUM (default %d).\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:403
+msgid ""
+"Options for HTML:\n"
+" --css-include=FILE include FILE in HTML <style> output;\n"
+" read stdin if FILE is -.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:409
+#, c-format
+msgid ""
+"Options for XML and Docbook:\n"
+" --output-indent=VAL indent XML elements by VAL spaces (default %"
+"d).\n"
+" If VAL is 0, ignorable whitespace is "
+"dropped.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:416
+msgid ""
+"Input file options:\n"
+" --commands-in-node-names allow @ commands in node names.\n"
+" -D VAR define the variable VAR, as with @set.\n"
+" -I DIR append DIR to the @include search path.\n"
+" -P DIR prepend DIR to the @include search path.\n"
+" -U VAR undefine the variable VAR, as with @clear.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:425
+msgid ""
+"Conditional processing in input:\n"
+" --ifdocbook process @ifdocbook and @docbook even if\n"
+" not generating Docbook.\n"
+" --ifhtml process @ifhtml and @html even if not generating HTML.\n"
+" --ifinfo process @ifinfo even if not generating Info.\n"
+" --ifplaintext process @ifplaintext even if not generating plain text.\n"
+" --iftex process @iftex and @tex; implies --no-split.\n"
+" --ifxml process @ifxml and @xml.\n"
+" --no-ifdocbook do not process @ifdocbook and @docbook text.\n"
+" --no-ifhtml do not process @ifhtml and @html text.\n"
+" --no-ifinfo do not process @ifinfo text.\n"
+" --no-ifplaintext do not process @ifplaintext text.\n"
+" --no-iftex do not process @iftex and @tex text.\n"
+" --no-ifxml do not process @ifxml and @xml text.\n"
+"\n"
+" Also, for the --no-ifFORMAT options, do process @ifnotFORMAT text.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:444
+msgid ""
+" The defaults for the @if... conditionals depend on the output format:\n"
+" if generating HTML, --ifhtml is on and the others are off;\n"
+" if generating Info, --ifinfo is on and the others are off;\n"
+" if generating plain text, --ifplaintext is on and the others are off;\n"
+" if generating XML, --ifxml is on and the others are off.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:452
+#, fuzzy
+msgid ""
+"Examples:\n"
+" makeinfo foo.texi write Info to foo's @setfilename\n"
+" makeinfo --html foo.texi write HTML to @setfilename\n"
+" makeinfo --xml foo.texi write Texinfo XML to @setfilename\n"
+" makeinfo --docbook foo.texi write DocBook XML to @setfilename\n"
+" makeinfo --no-headers foo.texi write plain text to standard output\n"
+"\n"
+" makeinfo --html --no-headers foo.texi write html without node lines, "
+"menus\n"
+" makeinfo --number-sections foo.texi write Info with numbered sections\n"
+" makeinfo --no-split foo.texi write one Info file however big\n"
+msgstr ""
+"\n"
+"@if... ľĽ§PÂ_ŤüĽOŞşšwł]­Č, ˇ|¨ĚżéĽXŽćŚĄ¤ŁŚPŚÓ¤ŁŚP:\n"
+"ŚpŞG˛ŁĽÍ HTML, --ifhtml ˇ|ś}ąŇ, ¨äĽŚŤhĂöłŹ;\n"
+"ŚpŞG˛ŁĽÍ Info ŠÎ´śłqŞş¤ĺŚrŔÉ, --ifinfo ˇ|ś}ąŇ, ¨äĽŚŤhĂöłŹ.\n"
+"\n"
+"˝d¨Ň:\n"
+" makeinfo foo.texi żéĽX Info ŚÜ foo Şş @setfilename\n"
+" makeinfo --html foo.texi żéĽX HTML ŚÜ foo Şş @setfilename\n"
+" makeinfo --no-headers -o - foo.texi żéĽX´śłq¤ĺŚrŽćŚĄŚÜźĐˇÇżéĽX\n"
+" makeinfo --number-sections foo.texi ĽHŚł˝s¸šŞş¸`¨ÓżéĽX Info\n"
+" makeinfo --no-split foo.texi ¤ŁşŢŔɎ׌łŚh¤j, żéĽXŚ¨¤@­Ó Info ŔÉ\n"
+"\n"
+"ľ{ŚĄŻäÂÎ, ˝ĐĽHšq¤lślĽó (­^¤ĺ) Ś^łřŚÜ bug-texinfo@gnu.org,\n"
+"¤@Żë°ÝĂDťP°Q˝×, ˝ĐĽHšq¤lślĽó (­^¤ĺ) ąH¨ě help-texinfo@gnu.org."
+
+#: makeinfo/makeinfo.c:603
+#, c-format
+msgid "%s: Ignoring unrecognized TEXINFO_OUTPUT_FORMAT value `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:647 makeinfo/makeinfo.c:673 makeinfo/makeinfo.c:692
+#: makeinfo/makeinfo.c:722 makeinfo/makeinfo.c:743
+#, c-format
+msgid "%s: %s arg must be numeric, not `%s'.\n"
+msgstr "%s: %s ¤ŢźĆĽ˛śˇŹ°źĆ­Č, ŚÓ¤ŁŹO `%s'.\n"
+
+#: makeinfo/makeinfo.c:660
+#, fuzzy, c-format
+msgid "%s: could not open macro expansion output `%s'"
+msgstr "ľLŞkŤŘĽßżéĽXŔÉŽ× `%s'."
+
+#: makeinfo/makeinfo.c:665
+#, c-format
+msgid "%s: ignoring second macro expansion output `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:707
+#, c-format
+msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n"
+msgstr "%s: --paragraph-indent Şş¤ŢźĆĽ˛śˇŹ° źĆ­Č/`none'/`asis', ŚÓ¤ŁŹO `%s'.\n"
+
+#: makeinfo/makeinfo.c:732
+#, c-format
+msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n"
+msgstr "%s: --footnote-style Şş¤ŢźĆĽ˛śˇŹ° `separate' ŠÎ `end', ŚÓ¤ŁŹO `%s'.\n"
+
+#: makeinfo/makeinfo.c:806
+#, c-format
+msgid "%s: missing file argument.\n"
+msgstr "%s: żňş|ŔɎפޟĆ.\n"
+
+#: makeinfo/makeinfo.c:997 makeinfo/makeinfo.c:3991
+#, c-format
+msgid "Multiline command %c%s used improperly"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1000
+#, c-format
+msgid "Expected `%s'"
+msgstr "Expected `%s'"
+
+#: makeinfo/makeinfo.c:1479
+#, c-format
+msgid "Can't create directory `%s': %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1525
+#, c-format
+msgid "No `%s' found in `%s'"
+msgstr "`%s' ĽźĽX˛{Śb `%s' ¤ş"
+
+#: makeinfo/makeinfo.c:1605
+#, c-format
+msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1638
+#, c-format
+msgid "Making %s file `%s' from `%s'.\n"
+msgstr ""
+
+#: makeinfo/makeinfo.c:1673
+#, c-format
+msgid "This is %s, produced by makeinfo version %s from %s.\n"
+msgstr "łoŹO %s, ĽŃ makeinfo ŞŠĽť %s ŚŰ %s ˛ŁĽÍŞş.\n"
+
+#: makeinfo/makeinfo.c:1709
+#, c-format
+msgid ""
+"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n"
+msgstr "%s: Ś]Ź°żůť~, ˛ž°ŁĽ¨ś°żéĽXŔÉ `%s'; ­Y­nŤOŚsĽŚ, ˝Đ¨ĎĽÎ --force żďśľ.\n"
+
+#: makeinfo/makeinfo.c:1773
+#, c-format
+msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n"
+msgstr "%s: Ś]Ź°żůť~, ˛ž°ŁżéĽXŔÉ `%s'; ­Y­nŤOŚsĽŚ, ˝Đ¨ĎĽÎ --force żďśľ.\n"
+
+#: makeinfo/makeinfo.c:2034
+#, c-format
+msgid "Unknown command `%s'"
+msgstr "ĽźŞžŞşŠRĽO `%s'"
+
+#: makeinfo/makeinfo.c:2056
+#, c-format
+msgid "Use braces to give a command as an argument to @%s"
+msgstr "¨ĎĽÎ¤jŹA¸šąNŠRĽOĽ]°_¨Ó, ĽH§@Ź° @%s Şş¤ŢźĆ"
+
+#: makeinfo/makeinfo.c:2314
+#, fuzzy, c-format
+msgid "%c%s expected braces"
+msgstr "%c%s šw­p­nŚł `{...}'"
+
+#: makeinfo/makeinfo.c:2327
+msgid "Unmatched }"
+msgstr "Ľź°tšďŞş }"
+
+#: makeinfo/makeinfo.c:2375
+msgid "NO_NAME!"
+msgstr "NO_NAME!"
+
+#: makeinfo/makeinfo.c:2396
+#, c-format
+msgid "%c%s missing close brace"
+msgstr "%c%s żňş|Ľk¤jŹA¸š"
+
+#: makeinfo/makeinfo.c:3309
+#, fuzzy, c-format
+msgid "@image file `%s' (for HTML) not readable: %s"
+msgstr "@image ŔÉŽ× `%s' ľLŞkĹŞ¨ú: %s"
+
+#: makeinfo/makeinfo.c:3315
+#, fuzzy, c-format
+msgid "No such file `%s'"
+msgstr "`%s' ĽźĽX˛{Śb `%s' ¤ş"
+
+#: makeinfo/makeinfo.c:3447
+#, fuzzy, c-format
+msgid "@image file `%s' (for text) unreadable: %s"
+msgstr "@image ŔÉŽ× `%s' ľLŞkĹŞ¨ú: %s"
+
+#: makeinfo/makeinfo.c:3456
+msgid "@image missing filename argument"
+msgstr "@image ¨SŚłŔÉŚW¤ŢźĆ"
+
+#: makeinfo/makeinfo.c:3675
+#, c-format
+msgid "undefined flag: %s"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3676
+#, c-format
+msgid "{No value for `%s'}"
+msgstr ""
+
+#: makeinfo/makeinfo.c:3728
+#, c-format
+msgid "%c%s requires a name"
+msgstr "%c%s Ľ˛śˇ­nŚłŚWşŮ"
+
+#: makeinfo/makeinfo.c:3834
+#, c-format
+msgid "Reached eof before matching @end %s"
+msgstr "Śb°tšďŞş @end %s ¤§Ťe, Ľý¨ěšFŔɎ׾˛§Ŕ"
+
+#: makeinfo/makeinfo.c:4082
+#, c-format
+msgid "`%.40s...' is too long for expansion; not expanded"
+msgstr ""
+
+#: makeinfo/multi.c:116
+msgid "Missing } in @multitable template"
+msgstr "Śb @multitable źËŞŠ¤¤, ¨SŚł }"
+
+#: makeinfo/multi.c:254
+#, c-format
+msgid "ignoring stray text `%s' after @multitable"
+msgstr ""
+
+#: makeinfo/multi.c:393
+#, c-format
+msgid "Too many columns in multitable item (max %d)"
+msgstr "multitable śľĽŘ¤¤Śł¤ÓŚhŞşÄćŚě (łĚ¤j­ČŹ° %d)"
+
+#: makeinfo/multi.c:555
+#, fuzzy, c-format
+msgid "[unexpected] cannot select column #%d in multitable"
+msgstr "ľLŞkżď¨ú multitable ¤¤ŞşÄćŚě #%d"
+
+#: makeinfo/multi.c:584
+msgid "ignoring @tab outside of multitable"
+msgstr "Šż˛¤ multitable Ľ~Şş @tab"
+
+#: makeinfo/multi.c:632
+#, c-format
+msgid "** Multicolumn output from last row:\n"
+msgstr ""
+
+#: makeinfo/multi.c:635
+#, c-format
+msgid "* column #%d: output = %s\n"
+msgstr "* ÄćŚě #%d: żéĽX = %s\n"
+
+#: makeinfo/node.c:280
+#, c-format
+msgid "Node `%s' previously defined at line %d"
+msgstr "¸`ÂI `%s' ¤wŚb˛Ä %d ŚćŠw¸qšL¤F"
+
+#: makeinfo/node.c:648
+#, c-format
+msgid "Formatting node %s...\n"
+msgstr "˝sąĆ¸`ÂI %s ŞşŽćŚĄ¤¤...\n"
+
+#: makeinfo/node.c:716
+#, fuzzy, c-format
+msgid "Node `%s' requires a sectioning command (e.g., %c%s)"
+msgstr "¸`ÂI `%s' Ľ˛śˇ¨ĎĽÎ¤ŔŹqŠRĽO (sectioning command) (¨ŇŚp: %c%s)"
+
+#: makeinfo/node.c:879
+#, c-format
+msgid "No node name specified for `%c%s' command"
+msgstr "`%c%s' ŠRĽO¤¤ĽźŤüŠw¸`ÂIŚWşŮ"
+
+#: makeinfo/node.c:920 makeinfo/node.c:1151
+#, c-format
+msgid "Anchor `%s' and node `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:923
+msgid "This @anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:925 makeinfo/node.c:1154
+msgid "Rename this anchor or use the `--no-split' option"
+msgstr ""
+
+#: makeinfo/node.c:955
+#, c-format
+msgid "Unexpected string at end of split-HTML file `%s'"
+msgstr ""
+
+#: makeinfo/node.c:991
+msgid "Next:"
+msgstr "¤U¤@­Ó:"
+
+#: makeinfo/node.c:1007
+msgid "Previous:"
+msgstr "¤W¤@­Ó:"
+
+#: makeinfo/node.c:1021
+msgid "Up:"
+msgstr "¤W¤@źh:"
+
+#: makeinfo/node.c:1148
+#, c-format
+msgid "Anchors `%s' and `%s' map to the same file name"
+msgstr ""
+
+#: makeinfo/node.c:1153
+msgid "@anchor command ignored; references to it will not work"
+msgstr ""
+
+#: makeinfo/node.c:1347
+#, fuzzy, c-format
+msgid "%s reference to nonexistent node `%s' (perhaps incorrect sectioning?)"
+msgstr "%s °ŃˇÓ¨ě¤ŁŚsŚbŞş¸`ÂI: `%s'"
+
+#: makeinfo/node.c:1363
+msgid "Menu"
+msgstr "ĽŘżý"
+
+#: makeinfo/node.c:1365
+msgid "Cross"
+msgstr ""
+
+#: makeinfo/node.c:1447
+#, c-format
+msgid "Next field of node `%s' not pointed to (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1450
+#, c-format
+msgid "This node (%s) has the bad Prev"
+msgstr "Ľť¸`ÂI (%s) Şş Ťe¤@­Ó (Prev) ¸`ÂIŚł°ÝĂD"
+
+#: makeinfo/node.c:1462
+msgid "Prev"
+msgstr "Ťe¤@­Ó"
+
+#: makeinfo/node.c:1505
+#, c-format
+msgid "Prev field of node `%s' not pointed to"
+msgstr ""
+
+#: makeinfo/node.c:1509
+#, c-format
+msgid "This node (%s) has the bad Next"
+msgstr "Ľť¸`ÂI (%s) Şş ¤U¤@­Ó (Next) ¸`ÂIŚł°ÝĂD"
+
+#: makeinfo/node.c:1521
+#, c-format
+msgid "`%s' has no Up field (perhaps incorrect sectioning?)"
+msgstr ""
+
+#: makeinfo/node.c:1524
+msgid "Up"
+msgstr "¤W¤@źh"
+
+#: makeinfo/node.c:1590
+#, c-format
+msgid "Node `%s' lacks menu item for `%s' despite being its Up target"
+msgstr ""
+
+#: makeinfo/node.c:1619
+#, c-format
+msgid "node `%s' has been referenced %d times"
+msgstr "¸`ÂI `%s' ¤włQ°ŃˇÓ %d Ś¸"
+
+#: makeinfo/node.c:1633
+#, c-format
+msgid "unreferenced node `%s'"
+msgstr "ĽźłQ°ŃˇÓŞş¸`ÂI `%s'"
+
+#: makeinfo/node.c:1723
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: makeinfo/node.c:1727
+#, fuzzy, c-format
+msgid "Can't remove file `%s': %s"
+msgstr "ľLŞkŤŘĽßżéĽXŔÉŽ× `%s'."
+
+#: makeinfo/sectioning.c:122
+#, fuzzy, c-format
+msgid "Appendix %c"
+msgstr "Şţżý %c"
+
+#: makeinfo/sectioning.c:467
+#, fuzzy, c-format
+msgid "Internal error (search_sectioning) `%s'!"
+msgstr "¤şłĄżůť~ (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:562
+#, c-format
+msgid "Internal error (search_sectioning) \"%s\"!"
+msgstr "¤şłĄżůť~ (search_sectioning) \"%s\"!"
+
+#: makeinfo/sectioning.c:623
+#, c-format
+msgid "%c%s is obsolete; use %c%s instead"
+msgstr "%c%s ¤wźoąó¤ŁĽÎ; ˝Đ§ďĽÎ %c%s"
+
+#: makeinfo/sectioning.c:639
+#, c-format
+msgid "Node with %ctop as a section already exists"
+msgstr ""
+
+#: makeinfo/sectioning.c:647
+#, c-format
+msgid "Here is the %ctop node"
+msgstr ""
+
+#: makeinfo/sectioning.c:663
+#, c-format
+msgid "%ctop used before %cnode, defaulting to %s"
+msgstr ""
+
+#: makeinfo/toc.c:197 makeinfo/toc.c:271 makeinfo/toc.c:273
+msgid "Table of Contents"
+msgstr ""
+
+#: makeinfo/toc.c:304 makeinfo/toc.c:337 makeinfo/toc.c:339
+msgid "Short Contents"
+msgstr ""
+
+#: makeinfo/xml.c:1605
+#, c-format
+msgid "@image file `%s' unreadable: %s"
+msgstr "@image ŔÉŽ× `%s' ľLŞkĹŞ¨ú: %s"
+
+#: makeinfo/xml.c:2097
+msgid ""
+"@headitem as the last item of @multitable produces invalid Docbook documents"
+msgstr ""
+
+#: util/install-info.c:154
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: Äľ§i: "
+
+#: util/install-info.c:203
+#, c-format
+msgid " for %s"
+msgstr ""
+
+#: util/install-info.c:426
+#, c-format
+msgid "\tTry `%s --help' for a complete list of options.\n"
+msgstr "\t¸Ő¸Ő Try `%s --help' ĽH¨úąo§šžăŞş°ŃźĆŚCŞí.\n"
+
+#: util/install-info.c:434
+#, fuzzy, c-format
+msgid ""
+"Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"Install or delete dir entries from INFO-FILE in the Info directory file\n"
+"DIR-FILE.\n"
+"\n"
+"Options:\n"
+" --delete delete existing entries for INFO-FILE from DIR-FILE;\n"
+" don't insert any new entries.\n"
+" --dir-file=NAME specify file name of Info directory file.\n"
+" This is equivalent to using the DIR-FILE argument.\n"
+" --entry=TEXT insert TEXT as an Info directory entry.\n"
+" TEXT should have the form of an Info menu item line\n"
+" plus zero or more extra lines starting with "
+"whitespace.\n"
+" If you specify more than one entry, they are all "
+"added.\n"
+" If you don't specify any entries, they are determined\n"
+" from information in the Info file itself.\n"
+" --help display this help and exit.\n"
+" --info-file=FILE specify Info file to install in the directory.\n"
+" This is equivalent to using the INFO-FILE argument.\n"
+" --info-dir=DIR same as --dir-file=DIR/dir.\n"
+" --item=TEXT same as --entry TEXT.\n"
+" An Info directory entry is actually a menu item.\n"
+" --quiet suppress warnings.\n"
+" --remove same as --delete.\n"
+" --section=SEC put this file's entries in section SEC of the directory.\n"
+" If you specify more than one section, all the entries\n"
+" are added in each of the sections.\n"
+" If you don't specify any sections, they are determined\n"
+" from information in the Info file itself.\n"
+" --version display version information and exit.\n"
+msgstr ""
+"ĽÎŞk: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n"
+"\n"
+"ŚŰ Info ĽŘżýŔÉŽ× DIR-FILE Şş INFO-FILE ¤¤, Św¸ËŠÎ˛ž°Ł dir śľĽŘ.\n"
+"\n"
+"Options:\n"
+" --delete ŚŰ DIR-FILE ¤¤, §R°Ł˛{ŚłŞş INFO-FILE śľĽŘ;\n"
+" ¤ŁˇsźWĽôŚóˇsŞşśľĽŘ.\n"
+" --dir-file=NAME ŤüŠw Info ĽŘżýŔɎתşŔɎ׌WşŮ.\n"
+" ĽťżďśľťP¨ĎĽÎ DIR-FILE ¤ŢźĆŹŰŚP.\n"
+" --entry=TEXT ĽH TEXT §@Ź° Info directory śľĽŘ.\n"
+" TEXT Ŕł¸ÓťP Info ĽŘżýśľĽŘŞşźgŞkŚłŹŰŚPŽćŚĄ\n"
+" ŚAĽ[¤Wšs­ÓĽH¤WŞşĽHŞĹĽŐŚr¤¸ś}ŠlŞş¸ęŽĆŚć.\n"
+" ŚpŞGązŤüŠwśWšL¤@­ÓĽH¤WŞşśľĽŘ, ĽŚ­ĚĽţłŁˇ|łQĽ[śiĽh.\n"
+" ŚpŞGąz¨SŚłŤüŠwĽôŚóŞşśľĽŘ, ĽŚ­Ěˇ|ĽH Info ŔɎפ¤Şş\n"
+"\t\t ¸ę°T¨Ó¨MŠw.\n"
+" --help ĹăĽÜ¨D§U¸ę°T, ľMŤáÂ÷ś}.\n"
+" --info-file=FILE ŤüŠw­nŚw¸ËŚbĽŘżý¤¤Şş Info ŔÉŽ×.\n"
+" ĽťżďśľťP¨ĎĽÎ INFO-FILE ¤ŢźĆŹŰŚP.\n"
+" --info-dir=DIR ťP --dir-file=DIR/dir ŹŰŚP.\n"
+" --item=TEXT ťP --entry TEXT ŹŰŚP.\n"
+" ¤@­Ó Info directory śľĽŘ¨äšę´NŹO¤@­ÓżďłćśľĽŘ.\n"
+" --quiet ¤ŁĹăĽÜÄľ§i°TŽ§.\n"
+" --remove ťP --delete ŹŰŚP.\n"
+" --section=SEC ąNĽťŔɎתşśľĽŘŠńŚbĽŘżý¤¤Şş SEC ¸`.\n"
+" ŚpŞGązŤüŠwśWšL¤@­ÓĽH¤WŞş¸`, ŠŇŚłŞşśľĽŘłŁˇ|\n"
+"\t\t ˇsźWŚb¨C¤@­Ó¸`¤ş.\n"
+" ŚpŞGąz¨SŚłŤüŠwĽôŚóŞş¸`, ĽŚ­Ěˇ|ĽH Info ŔɎפ¤Şş\n"
+" ¸ę°T¨Ó¨MŠw.\n"
+" --version ĹăĽÜŞŠĽť¸ę°T, ľMŤáÂ÷ś}.\n"
+"\n"
+"ľ{ŚĄŻäÂÎ, ˝ĐĽHšq¤lślĽó (­^¤ĺ) Ś^łřŚÜ bug-texinfo@gnu.org,\n"
+"¤@Żë°ÝĂDťP°Q˝×, ˝ĐĽHšq¤lślĽó (­^¤ĺ) ąH¨ě help-texinfo@gnu.org.\n"
+
+#: util/install-info.c:488
+#, fuzzy, c-format
+msgid ""
+"This is the file .../info/dir, which contains the\n"
+"topmost node of the Info hierarchy, called (dir)Top.\n"
+"The first time you invoke Info you start off looking at this node.\n"
+"\n"
+"%s\tThis is the top of the INFO tree\n"
+"\n"
+" This (the Directory node) gives a menu of major topics.\n"
+" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n"
+" \"h\" gives a primer for first-timers,\n"
+" \"mEmacs<Return>\" visits the Emacs manual, etc.\n"
+"\n"
+" In Emacs, you can click mouse button 2 on a menu item or cross reference\n"
+" to select it.\n"
+"\n"
+"%s\n"
+msgstr ""
+"łoŹOŔÉŽ× .../info/dir, ¸Ě­ąĽ]§tŚł Info żďłćŹ[şc¤¤łĚ¤WźhŞş¸`ÂI,\n"
+"şŮŹ° (dir) TOP.\n"
+"ąz˛Ä¤@Ś¸°őŚć Info ŽÉ, ązˇ|ąqło¸Ěś}Šlˇj´MŠŇśˇŞş¸`ÂI.\n"
+"\n"
+"%s\tłoŹO INFO żďłćžđŞşłĚ¤Wźh\n"
+"\n"
+" ło¸Ě (Directory ¸`ÂI) ´Ł¨ŃĽD­nśľĽŘŞşżďłć.\n"
+" Áä¤J \"q\" Â÷ś}, \"?\" ŚCĽXŠŇŚłŞş Info ŤüĽO, \"d\" Ś^¨ěło¸Ě,\n"
+" \"h\" Ć[ŹÝľšŞěŚ¸¨ĎĽÎŞĚŞş¤JŞůŤü¤Ţ,\n"
+" \"mEmacs<Return>\" ĽiĆ[ŹÝ Emacs ¤âĽU, ľĽľĽ.\n"
+"\n"
+" Śb Emacs ¤¤, ązĽiĽHŚbżďłćśľĽŘŠÎĽć¤Ź°ŃˇÓ¤W, łćŔťˇĆšŤŞş˛Ä 2 Áä\n"
+" ĽHżďžÜĽŚ­Ě.\n"
+"\n"
+"* Menu:\n"
+
+#: util/install-info.c:513
+#, c-format
+msgid "%s: could not read (%s) and could not create (%s)\n"
+msgstr "%s: ľLŞkĹŞ¨ú (%s), ŚÓĽBľLŞkŤŘĽß (%s)\n"
+
+#: util/install-info.c:600
+#, c-format
+msgid "%s: empty file"
+msgstr "%s: ŞĹŔÉŽ×"
+
+#: util/install-info.c:913 util/install-info.c:953
+msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"
+msgstr "Śł START-INFO-DIR-ENTRY, ŚýŹO¨SŚłŹŰšďŔłŞş END-INFO-DIR-ENTRY"
+
+#: util/install-info.c:948
+msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"
+msgstr "Śł END-INFO-DIR-ENTRY, ŚýŹO¨SŚłŹŰšďŔłŞş START-INFO-DIR-ENTRY"
+
+#: util/install-info.c:1191 util/install-info.c:1201
+#, c-format
+msgid "%s: already have dir file: %s\n"
+msgstr ""
+
+#: util/install-info.c:1236
+#, c-format
+msgid "%s: Specify the Info file only once.\n"
+msgstr "%s: ĽuŚłŤüŠw Info ŔɎפ@Ś¸.\n"
+
+#: util/install-info.c:1284
+#, c-format
+msgid "excess command line argument `%s'"
+msgstr "ŚhžlŞşŠRĽOŚC¤ŢźĆ `%s'"
+
+#: util/install-info.c:1288
+msgid "No input file specified; try --help for more information."
+msgstr "ĽźŤüŠwżé¤JŔÉŽ×; ¸Ő¸Ő --help ĽH¨úąo§óŚhŞş¸ę°T."
+
+#: util/install-info.c:1291
+msgid "No dir file specified; try --help for more information."
+msgstr "ĽźŤüŠw dir ŔÉŽ×; ¸Ő¸Ő --help ĽH¨úąo¨úŚhŞş¸ę°T."
+
+#: util/install-info.c:1313
+#, c-format
+msgid "no info dir entry in `%s'"
+msgstr "`%s' ¤ş¨SŚł info dir śľĽŘ"
+
+#: util/install-info.c:1426
+#, c-format
+msgid "menu item `%s' already exists, for file `%s'"
+msgstr "ĽŘżýśľĽŘ `%s' ¤wŚsŚb, ŹOľšŔÉŽ× `%s' Şş"
+
+#: util/install-info.c:1449
+#, c-format
+msgid "no entries found for `%s'; nothing deleted"
+msgstr "§ä¤Ł¨ě `%s' ŞşśľĽŘ; Ľź§R°ŁĽôŚóśľĽŘ"
+
+#: util/texindex.c:252
+msgid "display this help and exit"
+msgstr "ĹăĽÜ¨D§U¸ę°T, ľMŤáÂ÷ś}"
+
+#: util/texindex.c:254
+msgid "keep temporary files around after processing"
+msgstr "łB˛z§š˛ŚŤá, ¤Ł˛ž°ŁźČŚsŔÉ"
+
+#: util/texindex.c:256
+msgid "do not keep temporary files around after processing (default)"
+msgstr "łB˛z§š˛ŚŤá, ˛ž°ŁźČŚsŔÉ (šwł]­Č)"
+
+#: util/texindex.c:258
+msgid "send output to FILE"
+msgstr "ąNżéĽX°eŚÜ FILE"
+
+#: util/texindex.c:260
+msgid "display version information and exit"
+msgstr "ĹăĽÜŞŠĽť¸ę°T, ľMŤáÂ÷ś}"
+
+#: util/texindex.c:270
+#, c-format
+msgid "Usage: %s [OPTION]... FILE...\n"
+msgstr "ĽÎŞk: %s [OPTION]... FILE...\n"
+
+#: util/texindex.c:271
+#, c-format
+msgid "Generate a sorted index for each TeX output FILE.\n"
+msgstr "Ź°¨C­Ó TeX żéĽX FILE ˛ŁĽÍ¤@­ÓąĆ§ÇŞşŻÁ¤Ţ.\n"
+
+#: util/texindex.c:274
+#, c-format
+msgid "Usually FILE... is specified as `foo.%c%c' for a document `foo.texi'.\n"
+msgstr "łqą`¤ĺĽó `foo.texi' Şş FILE... ¤ŢźĆˇ|ŤüŠwŹ° `foo.%c%c'.\n"
+
+#: util/texindex.c:276
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"żďśľ:\n"
+
+#: util/texindex.c:876 util/texindex.c:910 util/texindex.c:983
+#: util/texindex.c:1011
+#, c-format
+msgid "%s: not a texinfo index file"
+msgstr "%s: ¤ŁŹO¤@­Ó texinfo ŻÁ¤ŢŔÉ"
+
+#: util/texindex.c:968
+#, c-format
+msgid "failure reopening %s"
+msgstr "­Ťˇsś}ąŇ %s ŽÉľoĽÍżůť~"
+
+#: util/texindex.c:1218
+#, c-format
+msgid "No page number in %s"
+msgstr "Śb %s ¤¤¨SŚł­ś˝X"
+
+#: util/texindex.c:1291
+#, c-format
+msgid "entry %s follows an entry with a secondary name"
+msgstr ""
+
+#~ msgid "%s: Specify the Info directory only once.\n"
+#~ msgstr "%s: ĽuŚłŤüŠw Info ĽŘżý¤@Ś¸.\n"
+
+#~ msgid "\"\" is invalid"
+#~ msgstr "\"\" ¤ŁŚXŞk"
+
+#, fuzzy
+#~ msgid "%s is an invalid ISO code, using %c"
+#~ msgstr "%s ¤ŁŹO¤@­ÓŚXŞkŞş ISO 639 ťy¨Ľ˝X"
+
+#~ msgid "`.' or `,' must follow cross reference, not %c"
+#~ msgstr "`.' ŠÎ `,' Ľ˛śˇ¸ňľŰĽć¤Ź°ŃˇÓ, ŚÓ¤ŁŹO %c"
+
+#~ msgid "Node:"
+#~ msgstr "¸`ÂI:"
+
+#~ msgid "virtual memory exhausted"
+#~ msgstr "ľęŔŔ°OžĐĹéŻÓşÉ"
+
+#~ msgid "`%s' has no Up field"
+#~ msgstr "`%s' ¨SŚł ¤W¤@źh (Up) ÄćŚě"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-forward] Scroll forward 1 line.\n"
+#~ msgstr " %-10s ŠšŤeą˛°Ę¤@Ść.\n"
+
+#, fuzzy
+#~ msgid "\\%-10[scroll-backward] Scroll backward 1 line.\n"
+#~ msgstr " %-10s ŠšŤáą˛°Ę¤@Ść.\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Email bug reports to bug-texinfo@gnu.org,\n"
+#~ "general questions and discussion to help-texinfo@gnu.org."
+#~ msgstr ""
+#~ "\n"
+#~ "ľ{ŚĄŻäÂÎ, ˝ĐĽHšq¤lślĽó (­^¤ĺ) Ś^łřŚÜ bug-texinfo@gnu.org,\n"
+#~ "¤@Żë°ÝĂDťP°Q˝×, ˝ĐĽHšq¤lślĽó (­^¤ĺ) ąH¨ě help-texinfo@gnu.org.\n"
+
+#~ msgid "Basic Commands in Info Windows\n"
+#~ msgstr "Info ¤ŔšjľřľĄ¤şŞş°ňĽťŤüĽO\n"
+
+#~ msgid "Moving within a node:\n"
+#~ msgstr "Śb¸`ÂI¤ş˛ž°Ę:\n"
+
+#~ msgid "Selecting other nodes:\n"
+#~ msgstr "żďžÜ¨äĽŚŞş¸`ÂI:\n"
+
+#~ msgid "Other commands:\n"
+#~ msgstr "¨äĽŚŤüĽO:\n"
+
+#~ msgid ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "Translate Texinfo source documentation to various other formats:\n"
+#~ "Info files suitable for reading online with Emacs or standalone GNU Info\n"
+#~ "(by default); plain text (with --no-headers); or HTML (with --html).\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --commands-in-node-names allow @ commands in node names.\n"
+#~ " -D VAR define a variable, as with @set.\n"
+#~ " -E, --macro-expand FILE output macro-expanded source to FILE.\n"
+#~ " --error-limit=NUM quit after NUM errors (default %d).\n"
+#~ " --fill-column=NUM break Info lines at NUM characters (default %"
+#~ "d).\n"
+#~ " --footnote-style=STYLE output footnotes according to STYLE:\n"
+#~ " `separate' to place footnotes in their own "
+#~ "node,\n"
+#~ " `end' to place the footnotes at the end of "
+#~ "the\n"
+#~ " node in which they are defined (the "
+#~ "default).\n"
+#~ " --force preserve output even if errors.\n"
+#~ " --help display this help and exit.\n"
+#~ " --html output HTML rather than Info format;\n"
+#~ " -I DIR append DIR to the @include search path.\n"
+#~ " --ifhtml process @ifhtml and @html text even when not\n"
+#~ " generating HTML.\n"
+#~ " --ifinfo process @ifinfo text even when generating "
+#~ "HTML.\n"
+#~ " --iftex process @iftex and @tex text.\n"
+#~ " implies --no-split.\n"
+#~ msgstr ""
+#~ "Usage: %s [OPTION]... TEXINFO-FILE...\n"
+#~ "\n"
+#~ "ąN Texinfo Şş­ěŠl˝X¤ĺĽóÂŕ´ŤŚÜ¨äĽŚŞşŽćŚĄ:\n"
+#~ "Info ŔÉžAŚXĽH Emacs ŠÎŹOżWĽßŞş GNU Info ľ{ŚĄ§@˝u¤WĹŞ¨ú (šwł]);\n"
+#~ "ŻÂ¤ĺŚr (¨ĎĽÎ --no-headers żďśľ); ŠÎ HTML (¨ĎĽÎ --html żďśľ).\n"
+#~ "\n"
+#~ "żďśľ:\n"
+#~ " --commands-in-node-names ¤šł\¸`ÂIŚWşŮ¤¤¨ĎĽÎ @ ŠRĽO.\n"
+#~ " -D VAR ŚpŚP @set ¤@ŻëŠw¸q¤@­ÓĹÜźĆ.\n"
+#~ " -E, --macro-expand FILE ąN¤wŽiś}Ľ¨ś°Şş­ěŠl˝XżéĽXŚÜŔÉŽ× FILE.\n"
+#~ " --error-limit=NUM Śb NUM ­Óżůť~Ťáľ˛§ô (šwł]­ČŹ° %d).\n"
+#~ " --fill-column=NUM ¨CŚćŚb NUM ­ÓŚr¤¸łBÂ_Ść (šwł]­ČŹ° %d).\n"
+#~ " --footnote-style=STYLE ĽH STYLE ¤čŚĄżéĽXľů¸}:\n"
+#~ " `separate' ŹOąNľů¸}Šń¸mŚbĽŚ­ĚŚŰ¤vŞş¸`ÂI,\n"
+#~ " `end' ŹOąNľů¸}Šń¸mŚbĽŚ­ĚłQŠw¸qŞş¸`ÂI\n"
+#~ " Şş§ŔşÝ (šwł]­Č).\n"
+#~ " --force §Y¨ĎŚłżůť~˛ŁĽÍ, ¤]şűŤůżéĽX.\n"
+#~ " --help ĹăĽÜ¨D§U¸ę°T, ľMŤáÂ÷ś}.\n"
+#~ " --html żéĽX HTML ŽćŚĄ, ŚÓŤD Info;\n"
+#~ " -I DIR ąN DIR Ľ[Śb @include ˇj´M¸ôŽ|¤§Ťá.\n"
+#~ " --ifhtml §Y¨Ď¤ŁżéĽX HTML ŽćŚĄ, ¤]¤@¨ÖłB˛z @ifhtml\n"
+#~ " ťP @html ¤ĺŚr.\n"
+#~ " --ifinfo §Y¨ĎżéĽX HTML, ¤]¤@¨ÖłB˛z @ifinfo ¤ĺŚr\n"
+#~ " --iftex łB˛z @iftex ťP @tex ¤ĺŚr.\n"
+#~ " Áô§t --no-split żďśľ.\n"
+
+#~ msgid ""
+#~ " --no-headers suppress Info node separators and Node: lines "
+#~ "and\n"
+#~ " write to standard output without --output.\n"
+#~ " --no-ifhtml do not process @ifhtml and @html text.\n"
+#~ " --no-ifinfo do not process @ifinfo text.\n"
+#~ " --no-iftex do not process @iftex and @tex text.\n"
+#~ " --no-split suppress splitting of large Info output files "
+#~ "or\n"
+#~ " generation of one HTML file per node.\n"
+#~ " --no-validate suppress node cross-reference validation.\n"
+#~ " --no-warn suppress warnings (but not errors).\n"
+#~ " --number-sections include chapter, section, etc. numbers in "
+#~ "output.\n"
+#~ " -o, --output=FILE output to FILE, ignoring any @setfilename.\n"
+#~ " -P DIR prepend DIR to the @include search path.\n"
+#~ " --paragraph-indent=VAL indent Info paragraphs by VAL spaces (default %"
+#~ "d).\n"
+#~ " if VAL is `none', do not indent;\n"
+#~ " if VAL is `asis', preserve existing "
+#~ "indentation.\n"
+#~ " --reference-limit=NUM warn about at most NUM references (default %"
+#~ "d).\n"
+#~ " -U VAR undefine a variable, as with @clear.\n"
+#~ " -v, --verbose explain what is being done.\n"
+#~ " --version display version information and exit.\n"
+#~ msgstr ""
+#~ " --no-headers ¤Ł˛ŁĽÍ Info ¸`ÂI¤Ŕšj˝uťP ¸`ÂI: Ść, ĽH¤Î\n"
+#~ " ĽźŤüŠw --output ŽÉ, żéĽXŚÜźĐˇÇżéĽXł]łĆ.\n"
+#~ " --no-ifhtml ¤ŁłB˛z @ifhtml ťP @html ¤ĺŚr.\n"
+#~ " --no-ifinfo ¤ŁłB˛z @ifinfo ¤ĺŚr.\n"
+#~ " --no-iftex ¤ŁłB˛z @iftex ťP @tex ¤ĺŚr.\n"
+#~ " --no-split ¤Ł¤ŔłÎ¤jŞş Info żéĽXŔÉŽ×, ¤]¤Ł¤@­Ó¸`ÂI\n"
+#~ " ´N˛ŁĽÍ¤@­Ó HTML ŔÉŽ×\n"
+#~ " --no-validate ¤Łšď¸`ÂIŞşĽć¤Ź°ŃˇÓ§@ŚłŽÄŔËŹd.\n"
+#~ " --no-warn ¤ŁĹăĽÜÄľ§i (ŚýŹO¤ŁĽ]ŹAżůť~).\n"
+#~ " --number-sections ŚbżéĽXŽÉĹăĽÜłš¸`ľĽŞş˝s¸š.\n"
+#~ " -o, --output=FILE żéĽXŚÜŔÉŽ× FILE, Šż˛¤ĽôŚóŞş @setfilename ł]"
+#~ "Šw.\n"
+#~ " -P DIR ąN DIR Ľ[Śb @include ˇj´M¸ôŽ|¤§Ťe.\n"
+#~ " --paragraph-indent=VAL ąN Info Źq¸¨ÁYąĆ VAL ­ÓŞĹĽŐ (šwł]­ČŹ° %d).\n"
+#~ " ŚpŞG VAL Ź° `none', ¤Ł§@ÁYąĆ;\n"
+#~ " ŚpŞG VAL Ź° `asis', ŤOŻdĽŘŤeŞş ÁYąĆ.\n"
+#~ " --reference-limit=NUM łĚŚhÄľ§i NUM ­Ó°ŃˇÓ (šwł]­ČŹ° %d).\n"
+#~ " -U VAR ¨úŽřĹܟƪşŠw¸q, ŚpŚP @clear.\n"
+#~ " -v, --verbose ¸ŃÄŔĽŘŤeĽżŚb§@Şş¨Ć.\n"
+#~ " --version ĹăĽÜŞŠĽť¸ę°T, ľMŤáľ˛§ô.\n"
+
+#~ msgid "No .png or .jpg for `%s'"
+#~ msgstr "¨SŚłľš `%s' Şş .png ŠÎ .jpg"
diff --git a/Build/source/utils/texinfo/util/Makefile.am b/Build/source/utils/texinfo/util/Makefile.am
new file mode 100644
index 00000000000..6451fa9b653
--- /dev/null
+++ b/Build/source/utils/texinfo/util/Makefile.am
@@ -0,0 +1,45 @@
+# $Id: Makefile.am,v 1.14 2004/08/26 11:43:18 karl Exp $
+# Makefile.am for texinfo/util.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+bin_PROGRAMS = ginstall-info texindex
+bin_SCRIPTS = texi2dvi texi2pdf
+
+# Use `ginstall-info' in the definition of PROGRAMS and in dependencies
+# because automake generates an install-info target in every Makefile (a
+# bug, IMHO, but this is easier than patching Automake.)
+ginstall_info_SOURCES = install-info.c
+
+# Transform `ginstall-info' to `install-info' before applying any
+# user-specified name transformations.
+transform = s/ginstall-info/install-info/; $(program_transform_name)
+
+localedir = $(datadir)/locale
+INCLUDES = -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\"
+LDADD = ../lib/libtxi.a $(LIBINTL)
+
+dist_pkgdata_DATA = texinfo.dtd texinfo.xsl
+pkgdata_DATA = texinfo.cat
+
+# we don't actually use version.texi in the rule, but it's one way of
+# noticing when the version changes.
+texinfo.cat: texinfo-cat.in $(top_srcdir)/doc/version.texi
+ sed 's/__VERSION__/@VERSION@/g' $(srcdir)/texinfo-cat.in >$@
+
+# Most of these are for fun. The only official/installed ones are the
+# texi2* scripts.
+#
+EXTRA_DIST = README deref.c dir-example fix-info-dir fixfonts \
+ fixref.gawk gdoc gen-dir-node gendocs.sh gendocs_template infosrch \
+ install-info-html outline.gawk \
+ prepinfo.awk tex3patch texi-docstring-magic.el texi2dvi texi2pdf txitextest \
+ $(dist_pkgdata_DATA) texinfo-cat.in
+CLEANFILES = $(pkgdata_DATA)
diff --git a/Build/source/utils/texinfo/util/Makefile.in b/Build/source/utils/texinfo/util/Makefile.in
new file mode 100644
index 00000000000..ca2ff2b942f
--- /dev/null
+++ b/Build/source/utils/texinfo/util/Makefile.in
@@ -0,0 +1,579 @@
+# Makefile.in generated by automake 1.9.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am,v 1.14 2004/08/26 11:43:18 karl Exp $
+# Makefile.am for texinfo/util.
+# Run automake in .. to produce Makefile.in from this.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+SOURCES = $(ginstall_info_SOURCES) texindex.c
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ginstall-info$(EXEEXT) texindex$(EXEEXT)
+subdir = util
+DIST_COMMON = README $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/mkstemp.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \
+ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgdatadir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ginstall_info_OBJECTS = install-info.$(OBJEXT)
+ginstall_info_OBJECTS = $(am_ginstall_info_OBJECTS)
+ginstall_info_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+ginstall_info_DEPENDENCIES = ../lib/libtxi.a $(am__DEPENDENCIES_1)
+texindex_SOURCES = texindex.c
+texindex_OBJECTS = texindex.$(OBJEXT)
+texindex_LDADD = $(LDADD)
+texindex_DEPENDENCIES = ../lib/libtxi.a $(am__DEPENDENCIES_1)
+binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(bin_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ginstall_info_SOURCES) texindex.c
+DIST_SOURCES = $(ginstall_info_SOURCES) texindex.c
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+dist_pkgdataDATA_INSTALL = $(INSTALL_DATA)
+pkgdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(dist_pkgdata_DATA) $(pkgdata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+# Transform `ginstall-info' to `install-info' before applying any
+# user-specified name transformations.
+transform = s/ginstall-info/install-info/; $(program_transform_name)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+HELP2MAN = @HELP2MAN@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_WARNINGS_FALSE = @INSTALL_WARNINGS_FALSE@
+INSTALL_WARNINGS_TRUE = @INSTALL_WARNINGS_TRUE@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TERMLIBS = @TERMLIBS@
+TOOLS_ONLY_FALSE = @TOOLS_ONLY_FALSE@
+TOOLS_ONLY_TRUE = @TOOLS_ONLY_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+native_tools = @native_tools@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+bin_SCRIPTS = texi2dvi texi2pdf
+
+# Use `ginstall-info' in the definition of PROGRAMS and in dependencies
+# because automake generates an install-info target in every Makefile (a
+# bug, IMHO, but this is easier than patching Automake.)
+ginstall_info_SOURCES = install-info.c
+localedir = $(datadir)/locale
+INCLUDES = -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\"
+LDADD = ../lib/libtxi.a $(LIBINTL)
+dist_pkgdata_DATA = texinfo.dtd texinfo.xsl
+pkgdata_DATA = texinfo.cat
+
+# Most of these are for fun. The only official/installed ones are the
+# texi2* scripts.
+#
+EXTRA_DIST = README deref.c dir-example fix-info-dir fixfonts \
+ fixref.gawk gdoc gen-dir-node gendocs.sh gendocs_template infosrch \
+ install-info-html outline.gawk \
+ prepinfo.awk tex3patch texi-docstring-magic.el texi2dvi texi2pdf txitextest \
+ $(dist_pkgdata_DATA) texinfo-cat.in
+
+CLEANFILES = $(pkgdata_DATA)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu util/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu util/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+ginstall-info$(EXEEXT): $(ginstall_info_OBJECTS) $(ginstall_info_DEPENDENCIES)
+ @rm -f ginstall-info$(EXEEXT)
+ $(LINK) $(ginstall_info_LDFLAGS) $(ginstall_info_OBJECTS) $(ginstall_info_LDADD) $(LIBS)
+texindex$(EXEEXT): $(texindex_OBJECTS) $(texindex_DEPENDENCIES)
+ @rm -f texindex$(EXEEXT)
+ $(LINK) $(texindex_LDFLAGS) $(texindex_OBJECTS) $(texindex_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/install-info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texindex.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
+ @list='$(dist_pkgdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+uninstall-dist_pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
+ @list='$(pkgdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ $(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-dist_pkgdataDATA install-pkgdataDATA
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ uninstall-dist_pkgdataDATA uninstall-info-am \
+ uninstall-pkgdataDATA
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-binSCRIPTS install-data install-data-am \
+ install-dist_pkgdataDATA install-exec install-exec-am \
+ install-info install-info-am install-man install-pkgdataDATA \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-binSCRIPTS uninstall-dist_pkgdataDATA \
+ uninstall-info-am uninstall-pkgdataDATA
+
+
+# we don't actually use version.texi in the rule, but it's one way of
+# noticing when the version changes.
+texinfo.cat: texinfo-cat.in $(top_srcdir)/doc/version.texi
+ sed 's/__VERSION__/@VERSION@/g' $(srcdir)/texinfo-cat.in >$@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/utils/texinfo/util/README b/Build/source/utils/texinfo/util/README
new file mode 100644
index 00000000000..5354c3520b2
--- /dev/null
+++ b/Build/source/utils/texinfo/util/README
@@ -0,0 +1,14 @@
+$Id: README,v 1.5 2004/04/11 17:56:47 karl Exp $
+texinfo/util/README
+
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+Assorted Texinfo-related programs and scripts.
+
+texindex, texi2dvi, and install-info get installed.
+The other items here are for your amusement and/or hacking pleasure.
+
diff --git a/Build/source/utils/texinfo/util/depend.mak b/Build/source/utils/texinfo/util/depend.mak
new file mode 100644
index 00000000000..6168ecd62e4
--- /dev/null
+++ b/Build/source/utils/texinfo/util/depend.mak
@@ -0,0 +1,17 @@
+$(objdir)/deref.obj: \
+
+
+$(objdir)/texindex.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ $(kpathseadir)/getopt.h
+
+$(objdir)/install-info.obj: \
+ ../lib/system.h \
+ ../config.h \
+ $(gnuw32dir)/win32lib.h \
+ ../lib/gettext.h \
+ $(kpathseadir)/getopt.h
+
diff --git a/Build/source/utils/texinfo/util/deref.c b/Build/source/utils/texinfo/util/deref.c
new file mode 100644
index 00000000000..e08be48105f
--- /dev/null
+++ b/Build/source/utils/texinfo/util/deref.c
@@ -0,0 +1,209 @@
+/*
+ * deref.c
+ *
+ * Make all texinfo references into the one argument form.
+ *
+ * Arnold Robbins
+ * arnold@gnu.org
+ * Written: December, 1991
+ * Released: November, 1998
+ *
+ * Copyright, 1991, 1998 Arnold David Robbins
+ *
+ * DEREF is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * DEREF is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+/*
+ * LIMITATIONS:
+ * One texinfo cross reference per line.
+ * Cross references may not cross newlines.
+ * Use of fgets for input (to be fixed).
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+
+/* for gcc on the 3B1, delete if this gives you grief */
+extern int fclose(FILE *fp);
+extern int fprintf(FILE *fp, const char *str, ...);
+/* extern int sprintf(char *str, const char *fmt, ...); */
+extern int fputs(char *buf, FILE *fp);
+
+extern char *strerror(int errno);
+extern char *strchr(char *cp, int ch);
+extern int strncmp(const char *s1, const char *s2, int count);
+
+extern int errno;
+
+void process(FILE *fp);
+void repair(char *line, char *ref, int toffset);
+
+int Errs = 0;
+char *Name = "stdin";
+int Line = 0;
+char *Me;
+
+/* main --- handle arguments, global vars for errors */
+
+int
+main(int argc, char **argv)
+{
+ FILE *fp;
+
+ Me = argv[0];
+
+ if (argc == 1)
+ process(stdin);
+ else
+ for (argc--, argv++; *argv != NULL; argc--, argv++) {
+ if (argv[0][0] == '-' && argv[0][1] == '\0') {
+ Name = "stdin";
+ Line = 0;
+ process(stdin);
+ } else if ((fp = fopen(*argv, "r")) != NULL) {
+ Name = *argv;
+ Line = 0;
+ process(fp);
+ fclose(fp);
+ } else {
+ fprintf(stderr, "%s: can not open: %s\n",
+ *argv, strerror(errno));
+ Errs++;
+ }
+ }
+ return Errs != 0;
+}
+
+/* isref --- decide if we've seen a texinfo cross reference */
+
+int
+isref(char *cp)
+{
+ if (strncmp(cp, "@ref{", 5) == 0)
+ return 5;
+ if (strncmp(cp, "@xref{", 6) == 0)
+ return 6;
+ if (strncmp(cp, "@pxref{", 7) == 0)
+ return 7;
+ return 0;
+}
+
+/* process --- read files, look for references, fix them up */
+
+void
+process(FILE *fp)
+{
+ char buf[BUFSIZ];
+ char *cp;
+ int count;
+
+ while (fgets(buf, sizeof buf, fp) != NULL) {
+ Line++;
+ cp = strchr(buf, '@');
+ if (cp == NULL) {
+ fputs(buf, stdout);
+ continue;
+ }
+ do {
+ count = isref(cp);
+ if (count == 0) {
+ cp++;
+ cp = strchr(cp, '@');
+ if (cp == NULL) {
+ fputs(buf, stdout);
+ goto next;
+ }
+ continue;
+ }
+ /* got one */
+ repair(buf, cp, count);
+ break;
+ } while (cp != NULL);
+ next: ;
+ }
+}
+
+/* repair --- turn all texinfo cross references into the one argument form */
+
+void
+repair(char *line, char *ref, int toffset)
+{
+ int braces = 1; /* have seen first left brace */
+ char *cp;
+
+ ref += toffset;
+
+ /* output line up to and including left brace in reference */
+ for (cp = line; cp <= ref; cp++)
+ putchar(*cp);
+
+ /* output node name */
+ for (; *cp && *cp != '}' && *cp != ',' && *cp != '\n'; cp++)
+ putchar(*cp);
+
+ if (*cp != '}') { /* could have been one arg xref */
+ /* skip to matching right brace */
+ for (; braces > 0; cp++) {
+ switch (*cp) {
+ case '@':
+ cp++; /* blindly skip next character */
+ break;
+ case '{':
+ braces++;
+ break;
+ case '}':
+ braces--;
+ break;
+ case '\n':
+ case '\0':
+ Errs++;
+ fprintf(stderr,
+ "%s: %s: %d: mismatched braces\n",
+ Me, Name, Line);
+ goto out;
+ default:
+ break;
+ }
+ }
+ out:
+ ;
+ }
+
+ putchar('}');
+ if (*cp == '}')
+ cp++;
+
+ /* now the rest of the line */
+ for (; *cp; cp++)
+ putchar(*cp);
+ return;
+}
+
+/* strerror --- return error string, delete if in your library */
+
+char *
+strerror(int errno)
+{
+ static char buf[100];
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+
+ if (errno < sys_nerr && errno >= 0)
+ return sys_errlist[errno];
+
+ sprintf(buf, "unknown error %d", errno);
+ return buf;
+}
diff --git a/Build/source/utils/texinfo/util/dir-example b/Build/source/utils/texinfo/util/dir-example
new file mode 100644
index 00000000000..2b88f5f9217
--- /dev/null
+++ b/Build/source/utils/texinfo/util/dir-example
@@ -0,0 +1,482 @@
+This is the directory file `dir' a.k.a. `DIR', which contains the
+ topmost node of the Info hierarchy.
+This particular dir file is merely made available for your hacking
+ pleasure, not official or standard in any way. If it doesn't make sense
+ to you, or you don't like it, ignore it.
+rms suggested that we follow the categories of the Free Software
+ Directory (http://www.gnu.org/directory/) where possible. Since
+ capitalization in the directory is random, I've chosen to use
+ `minimum' capitals, just the first word and proper nouns.
+If you have dir entries for Texinfo manuals you'd like to be added here,
+ please send them to karl@gnu.org.
+
+$Id: dir-example,v 1.51 2004/12/18 02:11:43 karl Exp $
+
+File: dir, Node: Top, This is the top of the INFO tree.
+
+This is the Info main menu (aka directory node).
+A few useful Info commands:
+
+ `q' quits;
+ `?' lists all Info commands;
+ `h' starts the Info tutorial;
+ `mTexinfo RET' visits the Texinfo manual, etc.
+
+Not all of the topics shown below may be available on this system.
+
+* Menu:
+
+Basics
+* Bash: (bash). The GNU Bourne-Again SHell.
+* BC: (bc). Arbitrary precision calculator language.
+* Common options: (coreutils)Common options. Common options.
+* Coreutils: (coreutils). Core GNU (file, text, shell) utilities.
+* DC: (dc). Postfix desk calculator.
+* Date input formats: (coreutils)Date input formats.
+* File permissions: (coreutils)File permissions. Access modes.
+* Finding files: (find). Operating on files matching certain criteria.
+* Gcal: (gcal). GNU calendar program.
+* Time: (time). Measuring program resource usage.
+
+Text creation and manipulation
+* Diffutils: (diff). Comparing and merging files.
+* Ed: (ed). Line editor.
+* Gawk: (gawk). A text scanning and processing language.
+* grep: (grep). Print lines matching a pattern.
+* m4: (m4). General-purpose text macro processor.
+* sed: (sed). Stream EDitor.
+* Wdiff: (wdiff). Word difference finder and related tools.
+
+Texinfo documentation system
+* Info: (info). Documentation browsing system.
+* Texi2HTML: (texi2html). Texinfo to HTML Converter.
+* Texinfo: (texinfo). The GNU documentation format.
+* info standalone: (info-stnd). Standalone Info reader.
+* infokey: (info-stnd)Invoking infokey. Compile Info customizations.
+* install-info: (texinfo)Invoking install-info. Updating info/dir entries.
+* makeinfo: (texinfo)Creating an Info File. Translate Texinfo source.
+* texi2dvi: (texinfo)Format with texi2dvi. Printing Texinfo documentation.
+* texindex: (texinfo)Format with tex/texindex. Sorting Texinfo index files.
+
+Archiving
+* Cpio: (cpio). Copy-in-copy-out archiver to tape or disk.
+* Shar utilities: (sharutils). Shell archiver, uuencode/uudecode.
+* Tar: (tar). Making tape (or disk) archives.
+
+Compression
+* bzip2: (bzip2). General (de)compression of files (blocksort).
+* Gzip: (gzip). General (de)compression of files (lzw).
+
+Email
+* Anubis: (anubis). The GNU outgoing mail processor.
+* Mailutils: (mailutils). Utilities & library for mailboxes, protocols.
+
+Network applications
+* Gawkinet: (gawkinet). TCP/IP Internetworking With `gawk'.
+* Wget: (wget). Non-interactive network downloader.
+
+Printing Tools
+* a2ps: (a2ps). PostScript Generating Utility
+* PreScript: (a2ps) PreScript. Input language for a2ps
+* card: (a2ps) card. Print Reference Cards
+* fixps: (a2ps) fixps. Fixing Some Ill Designed PostScript Files
+* fixnt: (a2ps) fixnt. Fixing Microsoft NT PostScript Files
+* pdiff: (a2ps) pdiff. Produce Pretty Comparison of Files
+* psmandup: (a2ps) psmandup. Printing Duplex on Simplex Printers
+* psset: (a2ps) psset. Inserting calls to setpagedevice
+
+Software development
+* As: (as). Assembler.
+* Autoconf: (autoconf). Create source code configuration scripts.
+* Binutils: (binutils). ar/copy/objdump/nm/size/strip/ranlib.
+* automake: (automake). Making Makefile.in's.
+* bison: (bison). GNU parser generator (Yacc replacement).
+* Cpp: (cpp). The GNU C preprocessor.
+* Cpplib: (cppinternals). Cpplib internals.
+* CVS: (cvs). Concurrent versions system for source control.
+* DejaGnu: (dejagnu). Testing framework.
+* Gdb: (gdb). The GNU debugger.
+* egcs: (egcs). Experimental GNU C compiler.
+* Flex: (flex). A fast scanner generator.
+* g77: (g77). GNU Fortran 77 compiler.
+* Gasp: (gasp). GNU Assembler preprocessor.
+* gcc: (gcc). The GNU Compiler Collection.
+* gccinstall: (gccinstall). Installing the GNU Compiler Collection.
+* gccint: (gccint). Internals of the GNU Compiler Collection.
+* Gnats: (gnats). Cygnus bug tracking system.
+* Gnulib: (gnulib). Source files to share among distributions.
+* Gperf: (gperf). Perfect hash function generator.
+* Gprof: (gprof). Profiler.
+* Guile Reference: (guile). The Guile reference manual.
+* Guile Tutorial: (guile-tut). The Guile Tutorial.
+* Identifier DB: (id-utils). Identifier database utilities.
+* Indent: (indent). Prettyprinter for programs.
+* Ld: (ld). Linker.
+* Libtool: (libtool). Generic library support script.
+* Make: (make). Remake files automatically.
+* Remsync: (remsync). Remote synchronization of directory trees.
+* Send PR: (send-pr). Cygnus bug reporting for Gnats.
+* Source config: (cfg-paper). Some theory on configuring source packages.
+* help2man: (help2man). Automatic manual page generation from -help.
+
+Emacs
+* Ada mode: (ada-mode). The GNU Emacs mode for editing Ada.
+* Autotype: (autotype). Convenient features for text that you enter frequently
+ in Emacs.
+* CC Mode: (ccmode). Emacs mode for editing C, C++, Objective-C,
+ Java, Pike, and IDL code.
+* CL: (cl). Partial Common Lisp support for Emacs Lisp.
+* Dired-X: (dired-x). Dired Extra Features.
+* EUDC: (eudc). A client for directory servers (LDAP, PH)
+* Ebrowse: (ebrowse). A C++ class browser for Emacs.
+* Ediff: (ediff). A visual interface for comparing and merging programs.
+* Emacs: (emacs). The extensible self-documenting text editor.
+* Elisp: (elisp). GNU Emacs Lisp reference manual.
+* Emacs FAQ: (efaq). Frequently Asked Questions about Emacs.
+* Emacs MIME: (emacs-mime). The MIME de/composition library.
+* Eshell: (eshell). A command shell implemented in Emacs Lisp.
+* Forms: (forms). Emacs package for editing data bases
+ by filling in forms.
+* Gnus: (gnus). The newsreader Gnus.
+* IDLWAVE: (idlwave). Major mode and shell for IDL and WAVE/CL files.
+* Intro Elisp: (emacs-lisp-intro). Introduction to Elisp programming.
+
+* AUC TeX: (auctex). Editing (La)TeX files.
+* MH-E: (mh-e). Emacs interface to the MH mail system.
+* Message: (message). Mail and news composition mode that goes with Gnus.
+* PCL-CVS: (pcl-cvs). Emacs front-end to CVS.
+* RefTeX: (reftex). Emacs support for LaTeX cross-references and citations.
+* SC: (sc). Supercite lets you cite parts of messages you're
+ replying to, in flexible ways.
+* Speedbar: (speedbar). File/Tag summarizing utility.
+* TRAMP: (tramp). Transparent Remote Access, Multiple Protocol
+ Emacs remote file access via rsh and rcp.
+* VIP: (vip). An older VI-emulation for Emacs.
+* VIPER: (viper). The newest Emacs VI-emulation mode.
+ (also, A VI Plan for Emacs Rescue or the VI PERil.)
+* VM: (vm). View Mail for Emacs.
+* Widget: (widget). Documenting the "widget" package used by the
+ Emacs Custom facility.
+* WoMan: (woman). Browse UN*X Manual Pages `Wo (without) Man'.
+
+Typesetting
+* Font utilities: (fontu). Programs for font manipulation.
+* Groff: (groff). The GNU troff document formatting system.
+* GV: (gv). The GNU PostScript and PDF viewer.
+
+GNU Gettext Utilities
+* ISO3166: (gettext)Country Codes. ISO 3166 country codes.
+* ISO639: (gettext)Language Codes. ISO 639 language codes.
+* xgettext: (gettext)xgettext Invocation. Extract strings into a PO file.
+* autopoint: (gettext)autopoint Invocation. Copy gettext infrastructure.
+* envsubst: (gettext)envsubst Invocation. Expand environment variables.
+* gettext: (gettext). GNU gettext utilities.
+* gettextize: (gettext)gettextize Invocation. Prepare a package for gettext.
+* msgattrib: (gettext)msgattrib Invocation. Select part of a PO file.
+* msgcat: (gettext)msgcat Invocation. Combine several PO files.
+* msgcmp: (gettext)msgcmp Invocation. Compare a PO file and template.
+* msgcomm: (gettext)msgcomm Invocation. Match two PO files.
+* msgconv: (gettext)msgconv Invocation. Convert PO file to encoding.
+* msgen: (gettext)msgen Invocation. Create an English PO file.
+* msgexec: (gettext)msgexec Invocation. Process a PO file.
+* msgfilter: (gettext)msgfilter Invocation. Pipe a PO file through a filter.
+* msgfmt: (gettext)msgfmt Invocation. Make MO files out of PO files.
+* msggrep: (gettext)msggrep Invocation. Select part of a PO file.
+* msginit: (gettext)msginit Invocation. Create a fresh PO file.
+* msgmerge: (gettext)msgmerge Invocation. Update a PO file from template.
+* msgunfmt: (gettext)msgunfmt Invocation. Uncompile MO file into PO file.
+* msguniq: (gettext)msguniq Invocation. Unify duplicates for PO file.
+* ngettext: (gettext)ngettext Invocation. Translate a message with plural.
+
+Software libraries
+* Annotate: (annotate). High-level GDB to GUI's.
+* Bfd: (bfd). The Binary File Descriptor library.
+* CVS protocol: (cvsclient). CVS client/server protocol specification.
+* Gdb-Internals: (gdbint). The GNU debugger's internals.
+* GDB library: (libgdb). Application programming interface to GDB.
+* GDBM: (gdbm). Hashed databases.
+* GDK: (gdk). General drawing kit.
+* GTK: (gtk). GIMP toolkit.
+* History: (history). Recall previous lines of input.
+* Ld internals: (ldint). GNU linker internals.
+* Libc: (libc). C library.
+* Mmalloc: (mmalloc). The GNU mapped-malloc package.
+* Stabs: (stabs). The "stabs" debugging information format.
+* Readline: (readline). General command-line interface.
+* Regex: (regex). Regular expressions.
+* Termcap: (termcap). All about /etc/termcap.
+
+C++ libraries
+* Iostream: (iostream). C++ input/output.
+* Libg++: (libg++). C++ classes.
+* autosprintf: (autosprintf). Support for printf format strings in C++.
+
+GNU organization
+* Maintain: (maintain). GNU maintainer guidelines.
+* Standards: (standards). GNU coding standards.
+* Tasks: (tasks). GNU task list.
+
+GNU music project
+* LilyPond: (lilypond). The GNU music typesetter.
+* LilyPond internals: (lilypond-internals). LilyPond internals.
+* ly2dvi: (lilypond)Invoking ly2dvi:: Titling LilyPond scores.
+* convert-ly: (lilypond)Invoking convert-ly:: Older LilyPond versions.
+* midi2ly: (lilypond)Invoking midi2ly:: Importing MIDI.
+* etf2ly: (lilypond)Invoking etf2ly:: Importing Finale.
+* abc2ly: (lilypond)Invoking abc2ly:: Importing ABC.
+* pmx2ly: (lilypond)Invoking pmx2ly:: Importing PMX.
+* musedata2ly: (lilypond)Invoking musedata2ly::Importing Musedata.
+* mup2ly: (lilypond)Invoking mup2ly:: Importing MUP.
+
+TeX
+* Afm2tfm: (dvips)Invoking afm2tfm. Making Type 1 fonts available to TeX.
+* Dvips: (dvips). DVI-to-PostScript translator.
+* DVI-to-PNG: (dvipng). DVI to Portable Network Graphics (PNG).
+* Eplain: (eplain). Expanding on plain TeX.
+* Kpathsearch: (kpathsea). File lookup along search paths.
+* LaTeX: (latex). LaTeX.
+* MakeIndex: (makeindex). Index creation for TeX.
+* Naming TeX fonts: (fontname). Filenames for TeX fonts.
+* TDS: (tds). Standard TeX directory structure.
+* TeXDraw: (texdraw). Drawing PostScript diagrams within TeX.
+* Web2c: (web2c). TeX, Metafont, and their companion programs.
+
+DOS
+* GNUish: (gnuish). GNU utilities for DOS.
+* Mtools: (mtools). Access DOS disks from Unix.
+
+Science
+* R FAQ: (R-FAQ). The R statistical language FAQ.
+
+Other things
+* Amd: (am-utils). Filesystem automounter.
+* CMUCL: (cmu-user). CMU Common Lisp.
+* File headers: (filehdr). Bibliographic information for computer files.
+* GCP: (gcp). Game club protocol.
+* GIMP: (pdb). The GIMP procedural database.
+* HTML: (snafu). Hypertext Markup Language 2.0 specification.
+* Jargon: (jargon). The jargon file.
+* Netpbm: (netpbm). Images/graphics manipulation programs.
+* JED: (jed). JED editor documentation.
+* octave: (octave). Octave - A language for numerical computation.
+* Perl: (perl). Practical extraction and report language.
+* PRCS: (prcs). Project revision control system.
+* Screen: (screen). Terminal multiplexer.
+
+Individual utilities
+* aclocal: (automake)Invoking aclocal. Generating aclocal.m4.
+* aid: (id-utils)aid invocation. Matching strings.
+* ar: (binutils)ar. Create/modify/extract archives.
+* at-pr: (gnats)at-pr. Bug report timely reminders.
+* autoconf: (autoconf)autoconf Invocation.
+ How to create configuration scripts
+* autoheader: (autoconf)autoheader Invocation.
+ How to create configuration templates
+* autom4te: (autoconf)autom4te Invocation.
+ The Autoconf executables backbone
+* autoreconf: (autoconf)autoreconf Invocation.
+ Remaking multiple `configure' scripts
+* autoscan: (autoconf)autoscan Invocation.
+ Semi-automatic `configure.ac' writing
+* autoupdate: (autoconf)autoupdate Invocation.
+ Automatic update of `configure.ac'
+* awk: (gawk)Invoking gawk. Text scanning and processing.
+* basename: (coreutils)basename invocation. Strip directory and suffix.
+* bibtex: (web2c)BibTeX invocation. Maintaining bibliographies.
+* c++filt: (binutils)c++filt. Demangle C++ symbols.
+* cat: (coreutils)cat invocation. Concatenate and write files.
+* chgrp: (coreutils)chgrp invocation. Change file groups.
+* chmod: (coreutils)chmod invocation. Change file permissions.
+* chown: (coreutils)chown invocation. Change file owners/groups.
+* chroot: (coreutils)chroot invocation. Specify the root directory.
+* cksum: (coreutils)cksum invocation. Print POSIX CRC checksum.
+* cmp: (diff)Invoking cmp. Compare 2 files byte by byte.
+* comm: (coreutils)comm invocation. Compare sorted files by line.
+* comsatd: (mailutils)comsatd. Comsat daemon.
+* config.status: (autoconf)config.status Invocation. Recreating configurations.
+* configure: (autoconf)configure Invocation. Configuring a package.
+* cp: (coreutils)cp invocation. Copy files.
+* csplit: (coreutils)csplit invocation. Split by context.
+* cut: (coreutils)cut invocation. Print selected parts of lines.
+* date: (coreutils)date invocation. Print/set system date and time.
+* dd: (coreutils)dd invocation. Copy and convert a file.
+* df: (coreutils)df invocation. Report filesystem disk usage.
+* diff: (diff)Invoking diff. Compare 2 files line by line.
+* diff3: (diff)Invoking diff3. Compare 3 files line by line.
+* dir: (coreutils)dir invocation. List directories briefly.
+* dircolors: (coreutils)dircolors invocation. Color setup for ls.
+* dirname: (coreutils)dirname invocation. Strip non-directory suffix.
+* dmp: (web2c)Dmp invocation. Troff->MPX (MetaPost pictures).
+* du: (coreutils)du invocation. Report on disk usage.
+* dvicopy: (web2c)DVIcopy invocation. Virtual font expansion
+* dvipng: (dvipng)Invoking dvipng. A DVI-to-PNG translator.
+* dvitomp: (web2c)DVItoMP invocation. DVI to MPX (MetaPost pictures).
+* dvitype: (web2c)DVItype invocation. DVI to human-readable text.
+* echo: (coreutils)echo invocation. Print a line of text.
+* edit-pr: (gnats)Invoking edit-pr. Changing bugs.
+* egrep: (grep)Invoking. grep -E.
+* eid: (id-utils)eid invocation. Invoking an editor on matches.
+* env: (coreutils)env invocation. Modify the environment.
+* expand: (coreutils)expand invocation. Convert tabs to spaces.
+* expr: (coreutils)expr invocation. Evaluate expressions.
+* factor: (coreutils)factor invocation. Print prime factors
+* false: (coreutils)false invocation. Do nothing, unsuccessfully.
+* fgrep: (fgrep)Invoking. grep -F.
+* fid: (id-utils)fid invocation. Listing a file's identifiers.
+* file-pr: (gnats)file-pr. Processing incoming traffic.
+* find: (find)Invoking find. Finding and acting on files.
+* fmt: (coreutils)fmt invocation. Reformat paragraph text.
+* fold: (coreutils)fold invocation. Wrap long input lines.
+* frm: (mailutils)frm. List headers from a mailbox.
+* gcal2txt: (gcal)Invoking gcal2txt. Calendar resource to text file.
+* gftodvi: (web2c)GFtoDVI invocation. Generic font proofsheets.
+* gftopk: (web2c)GFtoPK invocation. Generic to packed fonts.
+* gftype: (web2c)GFtype invocation. GF to human-readable text.
+* gid: (id-utils)gid invocation. Listing all matching lines.
+* git: (git). GNU interactive tools.
+* groups: (coreutils)groups invocation. Print group names a user is in.
+* guimb: (mailutils)guimb. Mailbox processing language.
+* gunzip: (gzip)Overview. Decompression.
+* gzexe: (gzip)Overview. Compress executables.
+* head: (coreutils)head invocation. Output the first part of files.
+* hostid: (coreutils)hostid invocation. Print numeric host identifier.
+* hostname: (coreutils)hostname invocation. Print or set system name.
+* id: (coreutils)id invocation. Print real/effective uid/gid.
+* idx: (id-utils)idx invocation. Testing mkid scanners.
+* ifnames: (autoconf)ifnames Invocation. Listing conditionals in source.
+* iid: (id-utils)iid invocation. Interactive complex queries.
+* imap4d: (mailutils)imap4d. IMAP4 daemon.
+* inimf: (web2c)inimf invocation. Initial Metafont.
+* inimp: (web2c)inimp invocation. Initial MetaPost.
+* initex: (web2c)initex invocation. Initial TeX.
+* install: (coreutils)install invocation. Copy and change attributes.
+* join: (coreutils)join invocation. Join lines on a common field.
+* kill: (coreutils)kill invocation. Send a signal to processes.
+* kpsewhich: (kpathsea)Invoking kpsewhich. TeX file searching.
+* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
+* lid: (id-utils)lid invocation. Matching identifier patterns.
+* link: (coreutils)link invocation. Make hard links between files.
+* ln: (coreutils)ln invocation. Make links between files.
+* locate: (find)Invoking locate. Finding files in a database.
+* logname: (coreutils)logname invocation. Print current login name.
+* ls: (coreutils)ls invocation. List directory contents.
+* mail-files: (sharutils)mail-files invocation. Send files to remote site.
+* mail.local: (mailutils)mail.local. Deliver mail to local mailbox.
+* mail: (mailutils)mail. Send and receive mail.
+* mailshar: (sharutils)mailshar invocation. Make and send a shell archive.
+* makempx: (web2c)MakeMPX invocation. MetaPost label typesetting.
+* maketexmf: (kpathsea)MakeTeX scripts. MF source generation.
+* maketexpk: (kpathsea)MakeTeX scripts. PK bitmap generation.
+* maketextex: (kpathsea)MakeTeX scripts. TeX source generation.
+* maketextfm: (kpathsea)MakeTeX scripts. TeX font metric generation.
+* md5sum: (coreutils)md5sum invocation. Print or check message-digests.
+* mdiff: (wdiff)mdiff invocation. Line cluster finder.
+* messages: (mailutils)messages. Count messages in mailbox.
+* mf: (web2c)mf invocation. Creating typeface families.
+* mft: (web2c)MFT invocation. Prettyprinting Metafont source.
+* mgetty: (mgetty). Faxes, voicemail and more.
+* mkdir: (coreutils)mkdir invocation. Create directories.
+* mkfifo: (coreutils)mkfifo invocation. Create FIFOs (named pipes).
+* mkid: (id-utils)mkid invocation. Creating an ID database.
+* mknod: (coreutils)mknod invocation. Create special files.
+* mp: (web2c)mp invocation. Creating technical diagrams.
+* mpto: (web2c)MPto invocation. MetaPost label extraction.
+* mv: (coreutils)mv invocation. Rename files.
+* newer: (web2c)Newer invocation. Compare modification times.
+* nice: (coreutils)nice invocation. Modify scheduling priority.
+* nl: (coreutils)nl invocation. Number lines and write files.
+* nlmconv: (binutils)nlmconv. Convert object to NetWare LM.
+* nm: (binutils)nm. List symbols in object files.
+* nohup: (coreutils)nohup invocation. Immunize to hangups.
+* objcopy: (binutils)objcopy. Copy/translate object files.
+* objdump: (binutils)objdump. Display info from object files.
+* od: (coreutils)od invocation. Dump files in octal, etc.
+* paste: (coreutils)paste invocation. Merge lines of files.
+* patch: (diff)Invoking patch. Apply a patch to a file.
+* patgen: (web2c)Patgen invocation. Creating hyphenation patterns.
+* pathchk: (coreutils)pathchk invocation. Check file name portability.
+* pid: (id-utils)pid invocation. Looking up filenames.
+* pktogf: (web2c)PKtoGF invocation. Packed to generic fonts.
+* pktype: (web2c)PKtype invocation. PK to human-readable text.
+* pltotf: (web2c)PLtoTF invocation. Property list to TFM.
+* pooltype: (web2c)Pooltype invocation. Display WEB pool files.
+* pop3d: (mailutils)pop3d. POP3 daemon.
+* pr: (coreutils)pr invocation. Paginate or columnate files.
+* pr-addr: (gnats)pr-addr. Bug report address retrieval.
+* pr-edit: (gnats)pr-edit. The edit-pr driver.
+* printenv: (coreutils)printenv invocation. Print environment variables.
+* printf: (coreutils)printf invocation. Format and print data.
+* protoize: (gcc)Running Protoize. Add prototypes to sources.
+* ptx: (coreutils)ptx invocation. Produce permuted indexes.
+* pwd: (coreutils)pwd invocation. Print working directory.
+* query-pr: (gnats)Invoking query-pr. Bug searching/reporting.
+* queue-pr: (gnats)queue-pr. Handling incoming traffic.
+* ranlib: (binutils)ranlib. Index archive file contents.
+* readlink: (coreutils)readlink invocation. Print referent of a symlink.
+* readmsg: (mailutils)readmsg. Extract messages from a folder.
+* rm: (coreutils)rm invocation. Remove files.
+* rmdir: (coreutils)rmdir invocation. Remove empty directories.
+* sdiff: (diff)Invoking sdiff. Merge 2 files side-by-side.
+* send-pr: (gnats)Invoking send-pr. Submitting bugs.
+* seq: (coreutils)seq invocation. Print numeric sequences
+* shar: (sharutils)shar invocation. Create shell archive.
+* shred: (coreutils)shred invocation. Remove files more securely.
+* sieve: (mailutils)sieve. Mail filtering utility.
+* size: (binutils)size. List object file section sizes.
+* sleep: (coreutils)sleep invocation. Delay for a specified time.
+* sort: (coreutils)sort invocation. Sort text files.
+* split: (coreutils)split invocation. Split into fixed-size pieces.
+* stat: (coreutils)stat invocation. Report file(system) status.
+* strings: (binutils)strings. List printable strings.
+* strip: (binutils)strip. Discard symbols.
+* stty: (coreutils)stty invocation. Print/change terminal settings.
+* su: (coreutils)su invocation. Modify user and group id.
+* sum: (coreutils)sum invocation. Print traditional checksum.
+* sync: (coreutils)sync invocation. Synchronize memory and disk.
+* tabs: (tput)Invoking tabs. Tab settings.
+* tac: (coreutils)tac invocation. Reverse files.
+* tail: (coreutils)tail invocation. Output the last part of files.
+* tangle: (web2c)Tangle invocation. WEB to Pascal.
+* tar: (tar)tar invocation. Invoking GNU `tar'.
+* tcal: (gcal)Invoking tcal. Run Gcal with tomorrow's date.
+* tee: (coreutils)tee invocation. Redirect to multiple files.
+* test: (coreutils)test invocation. File/string tests.
+* testsuite: (autoconf)testsuite Invocation. Running an Autotest test suite.
+* tex: (web2c)tex invocation. Typesetting.
+* tftopl: (web2c)TFtoPL invocation. TFM -> property list.
+* touch: (coreutils)touch invocation. Change file timestamps.
+* tput: (tput)Invoking tput. Termcap in shell scripts.
+* tr: (coreutils)tr invocation. Translate characters.
+* true: (coreutils)true invocation. Do nothing, successfully.
+* tsort: (coreutils)tsort invocation. Topological sort.
+* tty: (coreutils)tty invocation. Print terminal name.
+* txt2gcal: (gcal)Invoking txt2gcal. Calendar text to resource file.
+* umb-scheme: (umb-scheme). UMB Scheme Interpreter.
+* uname: (coreutils)uname invocation. Print system information.
+* unexpand: (coreutils)unexpand invocation. Convert spaces to tabs.
+* unify: (wdiff)unify invocation. Diff format converter.
+* uniq: (coreutils)uniq invocation. Uniquify files.
+* unlink: (coreutils)unlink invocation. Removal via unlink(2).
+* unprotoize: (gcc)Running Protoize. Remove prototypes from sources.
+* unshar: (sharutils)unshar invocation. Extract from shell archive.
+* updatedb: (find)Invoking updatedb. Building the locate database.
+* users: (coreutils)users invocation. Print current user names.
+* vdir: (coreutils)vdir invocation. List directories verbosely.
+* vftovp: (web2c)VFtoVP invocation. Virtual font -> virtual pl.
+* view-pr: (gnats)Invoking view-pr. Showing bug reports.
+* virmf: (web2c)virmf invocation. Virgin Metafont.
+* virmp: (web2c)virmp invocation. Virgin MetaPost.
+* virtex: (web2c)virtex invocation. Virgin TeX.
+* vptovf: (web2c)VPtoVF invocation. Virtual pl -> virtual font.
+* wc: (coreutils)wc invocation. Line, word, and byte counts.
+* weave: (web2c)Weave invocation. WEB to TeX.
+* who: (coreutils)who invocation. Print who is logged in.
+* whoami: (coreutils)whoami invocation. Print effective user id.
+* xargs: (find)Invoking xargs. Operating on many files.
+* yes: (coreutils)yes invocation. Print a string indefinitely.
+* zcat: (gzip)Overview. Decompression to stdout.
+* zdiff: (gzip)Overview. Compare compressed files.
+* zforce: (gzip)Overview. Force .gz extension on files.
+* zgrep: (gzip)Overview. Search compressed files.
+* zmore: (gzip)Overview. Decompression output by pages.
+* zsh: (zsh). An enhanced Bourne shell.
diff --git a/Build/source/utils/texinfo/util/fix-info-dir b/Build/source/utils/texinfo/util/fix-info-dir
new file mode 100755
index 00000000000..b1144ed6a4e
--- /dev/null
+++ b/Build/source/utils/texinfo/util/fix-info-dir
@@ -0,0 +1,317 @@
+#!/bin/sh
+#fix-info-dir (GNU texinfo)
+VERSION=1.1
+#Copyright (C) 1998, 2003 Free Software Foundation, Inc.
+#fix-info-dir comes with NO WARRANTY, to the extent permitted by law.
+#You may redistribute copies of fix-info-dir
+#under the terms of the GNU General Public License.
+#For more information about these matters, see the files named COPYING."
+#fix-info-dir was derived from update-info and gen-dir-node
+# The skeleton file contains info topic names in the
+# order they should appear in the output. There are three special
+# lines that alter the behavior: a line consisting of just "--" causes
+# the next line to be echoed verbatim to the output. A line
+# containing just "%%" causes all the remaining filenames (wildcards
+# allowed) in the rest of the file to be ignored. A line containing
+# just "!!" exits the script when reached (unless preceded by a line
+# containing just "--").
+#Author: Richard L. Hawes, rhawes@dmapub.dma.org.
+
+# ###SECTION 1### Constants
+set -h 2>/dev/null
+# ENVIRONMENT
+if test -z "$TMPDIR"; then
+ TMPDIR="/usr/tmp"
+fi
+if test -z "$LINENO"; then
+ LINENO="0"
+fi
+
+MENU_BEGIN='^\*\([ ]\)\{1,\}Menu:'
+MENU_ITEM='^\* ([^ ]).*:([ ])+\('
+MENU_FILTER1='s/^\*\([ ]\)\{1,\}/* /'
+MENU_FILTER2='s/\([ ]\)\{1,\}$//g'
+
+TMP_FILE1="${TMPDIR}/fx${$}.info"
+TMP_FILE2="${TMPDIR}/fy${$}.info"
+TMP_FILE_LIST="$TMP_FILE1 $TMP_FILE2"
+
+TRY_HELP_MSG="Try --help for more information"
+
+# ###SECTION 100### main program
+#variables set by options
+CREATE_NODE=""
+DEBUG=":"
+MODE=""
+#
+Total="0"
+Changed=""
+
+while test "$*"; do
+ case "$1" in
+ -c|--create) CREATE_NODE="y";;
+ --debug) set -eux; DEBUG="set>&2";;
+ -d|--delete) MODE="Detect_Invalid";;
+ +d);;
+ --version)
+cat<<VersionEOF
+fix-info-dir (GNU Texinfo) $VERSION
+Copyright (C) 1998 Free Software Foundation, Inc.
+fix-info-dir comes with NO WARRANTY, to the extent permitted by law.
+You may redistribute copies of fix-info-dir
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING.
+Author: Richard L. Hawes
+VersionEOF
+ exit;;
+
+ --help)
+cat<<HelpEndOfFile
+Usage: fix-info-dir [OPTION]... [INFO_DIR/[DIR_FILE]] [SKELETON]
+
+It detects and inserts missing menu items into the info dir file.
+The info dir must be the current directory.
+
+Options:
+-c, --create create a new info node
+-d, --delete delete invalid menu items (ignore missing menu items)
+ --debug print debug information to standard error path
+ --help print this help message and exit
+ --version print current version and exit
+Backup of the info node has a '.old' suffix added. This is a shell script.
+Environment Variables: TMPDIR
+Email bug reports to bug-texinfo@gnu.org.
+HelpEndOfFile
+ exit;;
+
+ [-+]*) echo "$0:$LINENO: \"$1\" is not a valid option">&2
+ echo "$TRY_HELP_MSG">&2
+ exit 2;;
+ *) break;;
+ esac
+ shift
+done
+
+ORIGINAL_DIR=`pwd`
+
+if test "$#" -gt "0"; then
+ INFO_DIR="$1"
+ shift
+else
+ INFO_DIR=$DEFAULT_INFO_DIR
+fi
+
+if test ! -d "${INFO_DIR}"; then
+ DIR_FILE=`basename ${INFO_DIR}`;
+ INFO_DIR=`dirname ${INFO_DIR}`;
+else
+ DIR_FILE="dir"
+fi
+
+cd "$INFO_DIR"||exit
+
+
+if test "$CREATE_NODE"; then
+ if test "$#" -gt "0"; then
+ if test `expr $1 : /` = '1'; then
+ SKELETON="$1"
+ else
+ SKELETON="$ORIGINAL_DIR/$1"
+ fi
+ if test ! -r "$SKELETON" && test -f "$SKELETON"; then
+ echo "$0:$LINENO: $SKELETON is not readable">&2
+ exit 2
+ fi
+ shift
+ else
+ SKELETON=/dev/null
+
+ fi
+else
+ if test ! -f "$DIR_FILE"; then
+ echo "$0:$LINENO: $DIR_FILE is irregular or nonexistant">&2
+ exit 2
+ elif test ! -r "$DIR_FILE"; then
+ echo "$0:$LINENO: $DIR_FILE is not readable">&2
+ exit 2
+ elif test ! -w "$DIR_FILE"; then
+ echo "$0:$LINENO: $DIR_FILE is not writeable">&2
+ exit 2
+ fi
+fi
+
+if test "$#" -gt "0"; then
+ echo "$0:$LINENO: Too many parameters">&2
+ echo "$TRY_HELP_MSG">&2
+ exit 2
+fi
+
+if test -f "$DIR_FILE"; then
+ cp "$DIR_FILE" "$DIR_FILE.old"
+ echo "Backed up $DIR_FILE to $DIR_FILE.old."
+fi
+
+if test "$CREATE_NODE"; then
+ if test "$MODE"; then
+ echo "$0:$LINENO: ERROR: Illogical option combination: -d -c">&2
+ echo "$TRY_HELP_MSG">&2
+ exit 2
+ fi
+ echo "Creating new Info Node: `pwd`/$DIR_FILE"
+ Changed="y"
+
+{
+
+ ### output the dir header
+ echo "-*- Text -*-"
+ echo "This file was generated automatically by $0."
+ echo "This version was generated on `date`"
+ echo "by `whoami`@`hostname` for `pwd`"
+
+ cat<<DIR_FILE_END_OF_FILE
+This is the file .../info/$DIR_FILE, which contains the topmost node of the
+Info hierarchy. The first time you invoke Info you start off
+looking at that node, which is ($DIR_FILE)Top.
+
+
+File: $DIR_FILE Node: Top This is the top of the INFO tree
+
+ This (the Directory node) gives a menu of major topics.
+ Typing "q" exits, "?" lists all Info commands, "d" returns here,
+ "h" gives a primer for first-timers,
+ "mEmacs<Return>" visits the Emacs topic, etc.
+
+ In Emacs, you can click mouse button 2 on a menu item or cross reference
+ to select it.
+
+* Menu: The list of major topics begins on the next line.
+
+DIR_FILE_END_OF_FILE
+
+### go through the list of files in the skeleton. If an info file
+### exists, grab the ENTRY information from it. If an entry exists
+### use it, otherwise create a minimal $DIR_FILE entry.
+
+ # Read one line from the file. This is so that we can echo lines with
+ # whitespace and quoted characters in them.
+ while read fileline; do
+ # flag fancy features
+ if test ! -z "$echoline"; then # echo line
+ echo "$fileline"
+ echoline=""
+ continue
+ elif test "${fileline}" = "--"; then
+ # echo the next line
+ echoline="1"
+ continue
+ elif test "${fileline}" = "%%"; then
+ # skip remaining files listed in skeleton file
+ skip="1"
+ continue
+ elif test "${fileline}" = "!!"; then
+ # quit now
+ break
+ fi
+
+ # handle files if they exist
+ for file in $fileline""; do
+ fname=
+ if test -z "$file"; then
+ break
+ fi
+ # Find the file to operate upon.
+ if test -r "$file"; then
+ fname="$file"
+ elif test -r "${file}.info"; then
+ fname="${file}.info"
+ elif test -r "${file}.gz"; then
+ fname="${file}.gz"
+ elif test -r "${file}.info.gz"; then
+ fname="${file}.info.gz"
+ else
+ echo "$0:$LINENO: can't find info file for ${file}?">&2
+ continue
+ fi
+
+ # if we found something and aren't skipping, do the entry
+ if test "$skip"; then
+ continue
+ fi
+
+ infoname=`echo $file|sed -e 's/.info$//'`
+ entry=`zcat -f $fname|\
+ sed -e '1,/START-INFO-DIR-ENTRY/d'\
+ -e '/END-INFO-DIR-ENTRY/,$d'`
+ if [ ! -z "${entry}" ]; then
+ echo "${entry}"
+ else
+ echo "* ${infoname}: (${infoname})."
+ fi
+ Total=`expr "$Total" + "1"`
+ done
+ done
+}>$DIR_FILE<$SKELETON
+fi
+
+trap ' eval "$DEBUG"; rm -f $TMP_FILE_LIST; exit ' 0
+trap ' rm -f $TMP_FILE_LIST
+ exit ' 1
+trap ' rm -f $TMP_FILE_LIST
+ echo "$0:$LINENO: received INT signal.">&2
+ exit ' 2
+trap ' rm -f $TMP_FILE_LIST
+ echo "$0:$LINENO: received QUIT signal.">&2
+ exit ' 3
+
+sed -e "1,/$MENU_BEGIN/d" -e "$MENU_FILTER1" -e "$MENU_FILTER2"<$DIR_FILE\
+|sed -n -e '/\* /{
+s/).*$//g
+s/\.gz$//
+s/\.info$//
+s/^.*(//p
+}'|sort -u>$TMP_FILE1
+ls -F|sed -e '/\/$/d' -e '/[-.][0-9]/d'\
+ -e "/^$DIR_FILE\$/d" -e "/^$DIR_FILE.old\$/d"\
+ -e 's/[*@]$//' -e 's/\.gz$//' -e 's/\.info$//'|sort>$TMP_FILE2
+
+if test -z "$MODE"; then
+ #Detect Missing
+ DONE_MSG="total menu item(s) were inserted into `pwd`/$DIR_FILE"
+ for Info_Name in `comm -13 $TMP_FILE1 $TMP_FILE2`; do
+ if test -r "$Info_Name"; then
+ Info_File="$Info_Name"
+ elif test -r "${Info_Name}.info"; then
+ Info_File="${Info_Name}.info"
+ elif test -r "${Info_Name}.gz"; then
+ Info_File="${Info_Name}.gz"
+ elif test -r "${Info_Name}.info.gz"; then
+ Info_File="${Info_Name}.info.gz"
+ else
+ echo "$0:$LINENO: can't find info file for ${Info_Name}?">&2
+ continue
+ fi
+ Changed="y"
+ if install-info $Info_File $DIR_FILE; then
+ Total=`expr "$Total" + "1"`
+ fi
+ done
+else
+ # Detect Invalid
+ DONE_MSG="total invalid menu item(s) were removed from `pwd`/$DIR_FILE"
+ for Info_Name in `comm -23 $TMP_FILE1 $TMP_FILE2`; do
+ Changed="y"
+ if install-info --remove $Info_Name $DIR_FILE; then
+ Total=`expr "$Total" + "1"`
+ fi
+ done
+fi
+
+# print summary
+if test "$Changed"; then
+ echo "$Total $DONE_MSG"
+else
+ echo "Nothing to do"
+fi
+rm -f $TMP_FILE_LIST
+eval "$DEBUG"
+exit 0
diff --git a/Build/source/utils/texinfo/util/fixfonts b/Build/source/utils/texinfo/util/fixfonts
new file mode 100755
index 00000000000..ee2ea719219
--- /dev/null
+++ b/Build/source/utils/texinfo/util/fixfonts
@@ -0,0 +1,84 @@
+#!/bin/sh
+# Make links named `lcircle10' for all TFM and GF/PK files, if no
+# lcircle10 files already exist.
+
+# Don't override definition of prefix and/or libdir if they are
+# already defined in the environment.
+if test "z${prefix}" = "z" ; then
+ prefix=/usr/local
+else
+ # prefix may contain references to other variables, thanks to make.
+ eval prefix=\""${prefix}"\"
+fi
+
+if test "z${libdir}" = "z" ; then
+ libdir="${prefix}/lib/tex"
+else
+ # libdir may contain references to other variables, thanks to make.
+ eval libdir=\""${libdir}"\"
+fi
+
+texlibdir="${libdir}"
+texfontdir="${texlibdir}/fonts"
+
+# Directories for the different font formats, in case they're not all
+# stored in one place.
+textfmdir="${textfmdir-${texfontdir}}"
+texpkdir="${texpkdir-${texfontdir}}"
+texgfdir="${texgfdir-${texfontdir}}"
+
+test "z${TMPDIR}" = "z" && TMPDIR="/tmp"
+
+tempfile="${TMPDIR}/circ$$"
+tempfile2="${TMPDIR}/circ2$$"
+
+# EXIT SIGHUP SIGINT SIGQUIT SIGTERM
+#trap 'rm -f "${tempfile}" "${tempfile2}"' 0 1 2 3 15
+
+# Find all the fonts with names that include `circle'.
+(cd "${texfontdir}"; find . -name '*circle*' -print > "${tempfile}")
+
+# If they have lcircle10.tfm, assume everything is there, and quit.
+if grep 'lcircle10\.tfm' "${tempfile}" > /dev/null 2>&1 ; then
+ echo "Found lcircle10.tfm."
+ exit 0
+fi
+
+# No TFM file for lcircle. Make a link to circle10.tfm if it exists,
+# and then make a link to the bitmap files.
+grep 'circle10\.tfm' "${tempfile}" > "${tempfile2}" \
+ || {
+ echo "I can't find any circle fonts in ${texfontdir}.
+If it isn't installed somewhere else, you need to get the Metafont sources
+from somewhere, e.g., labrea.stanford.edu:pub/tex/latex/circle10.mf, and
+run Metafont on them."
+ exit 1
+ }
+
+# We have circle10.tfm. (If we have it more than once, take the first
+# one.) Make the link.
+tempfile2_line1="`sed -ne '1p;q' \"${tempfile2}\"`"
+ln "${tempfile2_line1}" "${textfmdir}/lcircle10.tfm"
+echo "Linked to ${tempfile2_line1}."
+
+# Now make a link for the PK files, if any.
+(cd "${texpkdir}"
+ for f in `grep 'circle10.*pk' "${tempfile}"` ; do
+ set - `echo "$f" \
+ | sed -ne '/\//!s/^/.\//;s/\(.*\)\/\([^\/][^\/]*\)$/\1 \2/;p'`
+ ln "$f" "${1}/l${2}"
+ echo "Linked to $f."
+ done
+)
+
+# And finally for the GF files.
+(cd "${texgfdir}"
+ for f in `grep 'circle10.*gf' "${tempfile}"` ; do
+ set - `echo "$f" \
+ | sed -ne '/\//!s/^/.\//;s/\(.*\)\/\([^\/][^\/]*\)$/\1 \2/;p'`
+ ln "$f" "${1}/l${2}"
+ echo "Linked to $f."
+ done
+)
+
+# eof
diff --git a/Build/source/utils/texinfo/util/fixref.gawk b/Build/source/utils/texinfo/util/fixref.gawk
new file mode 100644
index 00000000000..f0e3cf6d606
--- /dev/null
+++ b/Build/source/utils/texinfo/util/fixref.gawk
@@ -0,0 +1,145 @@
+#! /usr/local/bin/gawk -f
+
+# fixref.awk --- fix xrefs in texinfo documents
+# Copyright, 1991, Arnold David Robbins, arnold@skeeve.atl.ga.us
+# Copyright, 1998, Arnold David Robbins, arnold@gnu.org
+
+# FIXREF is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# FIXREF is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+# Updated: Jul 21 1992 --- change unknown
+# Updated: Jul 18 1997 --- bug fix
+
+# usage: gawk -f fixref.awk input-file > output-file
+# or if you have #!: fixref.awk input-file > output-file
+
+# Limitations:
+# 1. no more than one cross reference on a line
+# 2. cross references may not cross a newline
+
+BEGIN \
+{
+ # we make two passes over the file. To do that we artificially
+ # tweak the argument vector to do a variable assignment
+
+ if (ARGC != 2) {
+ printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr"
+ exit 1
+ }
+ ARGV[2] = "pass=2"
+ ARGV[3] = ARGV[1]
+ ARGC = 4
+
+ # examine paragraphs
+ RS = ""
+
+ heading = "@(chapter|appendix|unnumbered|(appendix(sec|subsec|subsubsec))|section|subsection|subsubsection|unnumberedsec|heading|top)"
+
+ pass = 1
+
+ # put space between paragraphs on output
+ ORS = "\n\n"
+}
+
+pass == 1 && NF == 0 { next }
+
+# pass == 1 && /@node/ \
+# bug fix 7/18/96
+pass == 1 && /^@node/ \
+{
+ lname = name = ""
+ n = split($0, lines, "\n")
+ for (i = 1; i <= n; i++) {
+ if (lines[i] ~ ("^" heading)) {
+ sub(heading, "", lines[i])
+ sub(/^[ \t]*/, "", lines[i])
+ lname = lines[i]
+# printf "long name is '%s'\n", lines[i]
+ } else if (lines[i] ~ /@node/) {
+ sub(/@node[ \t]*/, "", lines[i])
+ sub(/[ \t]*,.*$/, "", lines[i])
+ name = lines[i]
+# printf "node name is '%s'\n", lines[i]
+ }
+ }
+ if (name && lname)
+ names[name] = lname
+ else if (lname)
+ printf("node name for %s missing!\n", lname) > "/dev/stderr"
+ else
+ printf("long name for %s missing!\n", name) > "/dev/stderr"
+
+ if (name ~ /:/)
+ printf("node `%s' contains a `:'\n", name) > "/dev/stderr"
+
+ if (lname) {
+ if (lname ~ /:/)
+ printf("name `%s' contains a `:'\n", lname) > "/dev/stderr"
+ else if (lname ~ /,/) {
+ printf("name `%s' contains a `,'\n", lname) > "/dev/stderr"
+ gsub(/,/, " ", lname)
+ names[name] = lname # added 7/18/97
+ }
+ }
+}
+
+pass == 2 && /@(x|px)?ref{/ \
+{
+ # split the paragraph into lines
+ # write them out one by one after fixing them
+ n = split($0, lines, "\n")
+ for (i = 1; i <= n; i++)
+ if (lines[i] ~ /@(x|px)?ref{/) {
+ res = updateref(lines[i])
+ printf "%s\n", res
+ } else
+ printf "%s\n", lines[i]
+
+ printf "\n" # avoid ORS
+ next
+}
+
+function updateref(orig, refkind, line)
+{
+ line = orig # work on a copy
+
+ # find the beginning of the reference
+ match(line, "@(x|px)?ref{")
+ refkind = substr(line, RSTART, RLENGTH)
+
+ # pull out just the node name
+ sub(/.*ref{/, "", line)
+ sub(/}.*$/, "", line)
+ sub(/,.*/, "", line)
+
+# debugging
+# printf("found ref to node '%s'\n", line) > "/dev/stderr"
+
+ # If the node name and the section name are the same
+ # we don't want to bother doing this.
+
+ if (! (line in names)) # sanity checking
+ printf("no long name for %s\n", line) > "/dev/stderr"
+ else if (names[line] != line && names[line] !~ /[:,]/) {
+ # build up new ref
+ newref = refkind line ", ," names[line] "}"
+ pat = refkind line "[^}]*}"
+
+ sub(pat, newref, orig)
+ }
+
+ return orig
+}
+
+pass == 2 { print }
diff --git a/Build/source/utils/texinfo/util/gdoc b/Build/source/utils/texinfo/util/gdoc
new file mode 100644
index 00000000000..3c52fb04593
--- /dev/null
+++ b/Build/source/utils/texinfo/util/gdoc
@@ -0,0 +1,914 @@
+#!/usr/bin/perl
+
+## Copyright (c) 2002, 2003 Simon Josefsson ##
+## added -texinfo, -listfunc ##
+## man page revamp ##
+## various improvements ##
+## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ##
+## hacked to allow -tex option --nmav ##
+## ##
+## This software falls under the GNU Public License. Please read ##
+## the COPYING file for more information ##
+
+#
+# This will read a 'c' file and scan for embedded comments in the
+# style of gnome comments (+minor extensions - see below).
+#
+# This program is modified by Nikos Mavroyanopoulos, for the gnutls
+# project.
+
+# Note: This only supports 'c'.
+
+# usage:
+# gdoc [ -docbook | -html | -text | -man | -tex | -texinfo | -listfunc ]
+# [ -sourceversion verno ] [ -includefuncprefix ] [ -bugsto address ]
+# [ -seeinfo infonode ] [ -copyright notice ] [ -verbatimcopying ]
+# [ -function funcname [ -function funcname ...] ] c file(s)s > outputfil
+e
+#
+# Set output format using one of -docbook, -html, -text, -man, -tex,
+# -texinfo, or -listfunc. Default is man.
+#
+# -sourceversion
+# Version number for source code, e.g. '1.0.4'. Used in 'man' headers.
+# Defaults to using current date.
+#
+# -includefuncprefix
+# For man pages, generate a #include <FILE.h> based on the function
+# prefix. For example, a function gss_init_sec_context will generate
+# an include statement of #include <gss.h>.
+#
+# -bugsto address
+# For man pages, include a section about reporting bugs and mention
+# the given e-mail address, e.g 'bug-libidn@gnu.org'.
+#
+# -seeinfo infonode
+# For man pages, include a section that point to an info manual
+# for more information.
+#
+# -copyright notice
+# For man pages, include a copyright section with the given
+# notice after a preamble. Use, e.g., '2002, 2003 Simon Josefsson'.
+#
+# -verbatimcopying
+# For man pages, and when the -copyright parameter is used,
+# add a licensing statement that say verbatim copying is permitted.
+#
+# -function funcname
+# If set, then only generate documentation for the given function(s). A
+ll
+# other functions are ignored.
+#
+# c files - list of 'c' files to process
+#
+# All output goes to stdout, with errors to stderr.
+
+#
+# format of comments.
+# In the following table, (...)? signifies optional structure.
+# (...)* signifies 0 or more structure elements
+# /**
+# * function_name(:)? (- short description)?
+# (* @parameterx: (description of parameter x)?)*
+# (* a blank line)?
+# * (Description:)? (Description of function)?
+# * (Section header: (section description)? )*
+# (*)?*/
+#
+# So .. the trivial example would be:
+#
+# /**
+# * my_function
+# **/
+#
+# If the Description: header tag is ommitted, then there must be a blank line
+# after the last parameter specification.
+# e.g.
+# /**
+# * my_function - does my stuff
+# * @my_arg: its mine damnit
+# *
+# * Does my stuff explained.
+# */
+#
+# or, could also use:
+# /**
+# * my_function - does my stuff
+# * @my_arg: its mine damnit
+# * Description: Does my stuff explained.
+# */
+# etc.
+#
+# All descriptions can be multiline, apart from the short function description
+.
+#
+# All descriptive text is further processed, scanning for the following specia
+l
+# patterns, which are highlighted appropriately.
+#
+# 'funcname()' - function
+# '$ENVVAR' - environmental variable
+# '&struct_name' - name of a structure
+# '@parameter' - name of a parameter
+# '%CONST' - name of a constant.
+
+#
+# Extensions for LaTeX:
+#
+# 1. the symbol '->' will be replaced with a rightarrow
+# 2. x^y with ${x}^{y}$.
+# 3. xxx\: with xxx:
+
+use POSIX qw(strftime);
+
+# match expressions used to find embedded type information
+$type_constant = "\\\%(\\w+)";
+$type_func = "(\\w+\\(\\))";
+$type_param = "\\\@(\\w+)";
+$type_struct = "\\\&(\\w+)";
+$type_env = "(\\\$\\w+)";
+
+
+# Output conversion substitutions.
+# One for each output format
+
+# these work fairly well
+%highlights_html = ( $type_constant, "<i>\$1</i>",
+ $type_func, "<b>\$1</b>",
+ $type_struct, "<i>\$1</i>",
+ $type_param, "<tt><b>\$1</b></tt>" );
+$blankline_html = "<p>";
+
+%highlights_texinfo = ( $type_constant, "\\\@var{\$1}",
+ $type_func, "\\\@code{\$1}",
+ $type_struct, "\\\@code{\$1}",
+ $type_param, "\\\@code{\$1}" );
+$blankline_texinfo = "";
+
+%highlights_tex = ( $type_constant, "{\\\\it \$1}",
+ $type_func, "{\\\\bf \$1}",
+ $type_struct, "{\\\\it \$1}",
+ $type_param, "{\\\\bf \$1}" );
+$blankline_tex = "\\\\";
+
+# sgml, docbook format
+%highlights_sgml = ( $type_constant, "<replaceable class=\"option\">\$1</repla
+ceable>",
+ $type_func, "<function>\$1</function>",
+ $type_struct, "<structname>\$1</structname>",
+ $type_env, "<envar>\$1</envar>",
+ $type_param, "<parameter>\$1</parameter>" );
+$blankline_sgml = "</para><para>\n";
+
+# these are pretty rough
+%highlights_man = ( $type_constant, "\\n.I \\\"\$1\\\"\\n",
+ $type_func, "\\n.B \\\"\$1\\\"\\n",
+ $type_struct, "\\n.I \\\"\$1\\\"\\n",
+ $type_param."([\.\, ]*)\n?", "\\n.I \\\"\$1\$2\\\"\\n" );
+$blankline_man = "";
+
+# text-mode
+%highlights_text = ( $type_constant, "\$1",
+ $type_func, "\$1",
+ $type_struct, "\$1",
+ $type_param, "\$1" );
+$blankline_text = "";
+
+
+sub usage {
+ print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -tex | -texinf
+o -listfunc ]\n";
+ print " [ -sourceversion verno ] [ -includefuncprefix ]\n";
+ print " [ -bugsto address ] [ -seeinfo infonode ] [ -copyright not
+ice]\n";
+ print " [ -verbatimcopying ]\n";
+ print " [ -function funcname [ -function funcname ...] ]\n";
+ print " c source file(s) > outputfile\n";
+ exit 1;
+}
+
+# read arguments
+if ($#ARGV==-1) {
+ usage();
+}
+
+$verbose = 0;
+$output_mode = "man";
+%highlights = %highlights_man;
+$blankline = $blankline_man;
+$modulename = "API Documentation";
+$sourceversion = strftime "%Y-%m-%d", localtime;
+$function_only = 0;
+while ($ARGV[0] =~ m/^-(.*)/) {
+ $cmd = shift @ARGV;
+ if ($cmd eq "-html") {
+ $output_mode = "html";
+ %highlights = %highlights_html;
+ $blankline = $blankline_html;
+ } elsif ($cmd eq "-man") {
+ $output_mode = "man";
+ %highlights = %highlights_man;
+ $blankline = $blankline_man;
+ } elsif ($cmd eq "-tex") {
+ $output_mode = "tex";
+ %highlights = %highlights_tex;
+ $blankline = $blankline_tex;
+ } elsif ($cmd eq "-texinfo") {
+ $output_mode = "texinfo";
+ %highlights = %highlights_texinfo;
+ $blankline = $blankline_texinfo;
+ } elsif ($cmd eq "-text") {
+ $output_mode = "text";
+ %highlights = %highlights_text;
+ $blankline = $blankline_text;
+ } elsif ($cmd eq "-docbook") {
+ $output_mode = "sgml";
+ %highlights = %highlights_sgml;
+ $blankline = $blankline_sgml;
+ } elsif ($cmd eq "-listfunc") {
+ $output_mode = "listfunc";
+ } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling
+ document
+ $modulename = shift @ARGV;
+ } elsif ($cmd eq "-sourceversion") {
+ $sourceversion = shift @ARGV;
+ } elsif ($cmd eq "-includefuncprefix") {
+ $includefuncprefix = 1;
+ } elsif ($cmd eq "-bugsto") {
+ $bugsto = shift @ARGV;
+ } elsif ($cmd eq "-copyright") {
+ $copyright = shift @ARGV;
+ } elsif ($cmd eq "-verbatimcopying") {
+ $verbatimcopying = 1;
+ } elsif ($cmd eq "-seeinfo") {
+ $seeinfo = shift @ARGV;
+ } elsif ($cmd eq "-function") { # to only output specific functions
+ $function_only = 1;
+ $function = shift @ARGV;
+ $function_table{$function} = 1;
+ } elsif ($cmd eq "-v") {
+ $verbose = 1;
+ } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
+ usage();
+ }
+}
+
+##
+# dumps section contents to arrays/hashes intended for that purpose.
+#
+sub dump_section {
+ my $name = shift @_;
+ my $contents = join "\n", @_;
+
+ if ($name =~ m/$type_constant/) {
+ $name = $1;
+# print STDERR "constant section '$1' = '$contents'\n";
+ $constants{$name} = $contents;
+ } elsif ($name =~ m/$type_param/) {
+# print STDERR "parameter def '$1' = '$contents'\n";
+ $name = $1;
+ $parameters{$name} = $contents;
+ } else {
+# print STDERR "other section '$name' = '$contents'\n";
+ $sections{$name} = $contents;
+ push @sectionlist, $name;
+ }
+}
+
+##
+# output function
+#
+# parameters, a hash.
+# function => "function name"
+# parameterlist => @list of parameters
+# parameters => %parameter descriptions
+# sectionlist => @list of sections
+# sections => %descriont descriptions
+#
+
+sub repstr {
+ $pattern = shift;
+ $repl = shift;
+ $match1 = shift;
+ $match2 = shift;
+ $match3 = shift;
+ $match4 = shift;
+
+ $output = $repl;
+ $output =~ s,\$1,$match1,g;
+ $output =~ s,\$2,$match2,g;
+ $output =~ s,\$3,$match3,g;
+ $output =~ s,\$4,$match4,g;
+
+ eval "\$return = qq/$output/";
+
+# print "pattern $pattern matched 1=$match1 2=$match2 3=$match3 4=$match4 r
+eplace $repl yielded $output interpolated $return\n";
+
+ $return;
+}
+
+sub output_highlight {
+ my $contents = join "\n", @_;
+ my $line;
+
+ foreach $pattern (keys %highlights) {
+# print "scanning pattern $pattern ($highlights{$pattern})\n";
+ $contents =~ s:$pattern:repstr($pattern, $highlights{$pattern}, $1, $2
+, $3, $4):gse;
+ }
+ foreach $line (split "\n", $contents) {
+ if ($line eq ""){
+ print $lineprefix, $blankline;
+ } else {
+ print $lineprefix, $line;
+ }
+ print "\n";
+ }
+}
+
+sub just_highlight {
+ my $contents = join "\n", @_;
+ my $line;
+ my $ret = "";
+
+ foreach $pattern (keys %highlights) {
+# print "scanning pattern $pattern ($highlights{$pattern})\n";
+ $contents =~ s:$pattern:repstr($pattern, $highlights{$pattern}, $1, $2
+, $3, $4):gse;
+ }
+ foreach $line (split "\n", $contents) {
+ if ($line eq ""){
+ $ret = $ret . $lineprefix . $blankline;
+ } else {
+ $ret = $ret . $lineprefix . $line;
+ }
+ $ret = $ret . "\n";
+ }
+
+ return $ret;
+}
+
+# output in texinfo
+sub output_texinfo {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+
+ print "\@deftypefun {" . $args{'functiontype'} . "} ";
+ print "{".$args{'function'}."} ";
+ print "(";
+ $count = 0;
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print $args{'parametertypes'}{$parameter}." \@var{".$parameter."}";
+ if ($count != $#{$args{'parameterlist'}}) {
+ $count++;
+ print ", ";
+ }
+ }
+ print ")\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ if ($args{'parameters'}{$parameter}) {
+ print "\@var{".$parameter."}: ";
+ output_highlight($args{'parameters'}{$parameter});
+ print "\n";
+ }
+ }
+ foreach $section (@{$args{'sectionlist'}}) {
+ print "\n\@strong{$section:} " if $section ne $section_default;
+ $args{'sections'}{$section} =~ s:([{}]):\@\1:gs;
+ output_highlight($args{'sections'}{$section});
+ }
+ print "\@end deftypefun\n\n";
+}
+
+# output in html
+sub output_html {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+ print "\n\n<a name=\"". $args{'function'} . "\">&nbsp</a><h2>Function</h2>
+\n";
+
+ print "<i>".$args{'functiontype'}."</i>\n";
+ print "<b>".$args{'function'}."</b>\n";
+ print "(";
+ $count = 0;
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print "<i>".$args{'parametertypes'}{$parameter}."</i> <b>".$parameter.
+"</b>\n";
+ if ($count != $#{$args{'parameterlist'}}) {
+ $count++;
+ print ", ";
+ }
+ }
+ print ")\n";
+
+ print "<h3>Arguments</h3>\n";
+ print "<dl>\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print "<dt><i>".$args{'parametertypes'}{$parameter}."</i> <b>".$parame
+ter."</b>\n";
+ print "<dd>";
+ output_highlight($args{'parameters'}{$parameter});
+ }
+ print "</dl>\n";
+ foreach $section (@{$args{'sectionlist'}}) {
+ print "<h3>$section</h3>\n";
+ print "<ul>\n";
+ output_highlight($args{'sections'}{$section});
+ print "</ul>\n";
+ }
+ print "<hr>\n";
+}
+
+# output in tex
+sub output_tex {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+ my $func = $args{'function'};
+ my $param;
+ my $param2;
+ my $sec;
+ my $check;
+ my $type;
+
+ $func =~ s/_/\\_/g;
+
+ print "\n\n\\subsection{". $func . "}\n\\label{" . $args{'function'} . "}\
+n";
+
+ $type = $args{'functiontype'};
+ $type =~ s/_/\\_/g;
+
+ print "{\\it ".$type."}\n";
+ print "{\\bf ".$func."}\n";
+ print "(";
+ $count = 0;
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ $param = $args{'parametertypes'}{$parameter};
+ $param2 = $parameter;
+ $param =~ s/_/\\_/g;
+ $param2 =~ s/_/\\_/g;
+
+ print "{\\it ".$param."} {\\bf ".$param2."}";
+ if ($count != $#{$args{'parameterlist'}}) {
+ $count++;
+ print ", ";
+ }
+ }
+ print ")\n";
+
+ print "\n{\\large{Arguments}}\n";
+
+ print "\\begin{itemize}\n";
+ $check=0;
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ $param1 = $args{'parametertypes'}{$parameter};
+ $param1 =~ s/_/\\_/g;
+ $param2 = $parameter;
+ $param2 =~ s/_/\\_/g;
+
+ $check = 1;
+ print "\\item {\\it ".$param1."} {\\bf ".$param2."}: \n";
+# print "\n";
+
+ $param3 = $args{'parameters'}{$parameter};
+ $param3 =~ s/&([a-zA-Z\_]+)/{\\it \1}/g;
+
+ $out = just_highlight($param3);
+ $out =~ s/_/\\_/g;
+ print $out;
+ }
+ if ($check==0) {
+ print "\\item void\n";
+ }
+ print "\\end{itemize}\n";
+
+ foreach $section (@{$args{'sectionlist'}}) {
+ $sec = $section;
+ $sec =~ s/_/\\_/g;
+ $sec =~ s/&([a-zA-Z\_]+)/{\\it \1}/g;
+
+ print "\n{\\large{$sec}}\\\\\n";
+ print "\\begin{rmfamily}\n";
+
+ $sec = $args{'sections'}{$section};
+ $sec =~ s/\\:/:/g;
+ $sec =~ s/&([a-zA-Z\_]+)/{\\it \1}/g;
+ $sec =~ s/->/\$\\rightarrow\$/g;
+ $sec =~ s/([0-9]+)\^([0-9]+)/\$\{\1\}\^\{\2\}\$/g;
+
+ $out = just_highlight($sec);
+ $out =~ s/_/\\_/g;
+
+ print $out;
+ print "\\end{rmfamily}\n";
+ }
+ print "\n";
+}
+
+
+# output in sgml DocBook
+sub output_sgml {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+ my $id;
+
+ $id = $args{'module'}."-".$args{'function'};
+ $id =~ s/[^A-Za-z0-9]/-/g;
+
+ print "<refentry>\n";
+ print "<refmeta>\n";
+ print "<refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></r
+efentrytitle>\n";
+ print "</refmeta>\n";
+ print "<refnamediv>\n";
+ print " <refname>".$args{'function'}."</refname>\n";
+ print " <refpurpose>\n";
+ print " ".$args{'purpose'}."\n";
+ print " </refpurpose>\n";
+ print "</refnamediv>\n";
+
+ print "<refsynopsisdiv>\n";
+ print " <title>Synopsis</title>\n";
+ print " <funcsynopsis>\n";
+ print " <funcdef>".$args{'functiontype'}." ";
+ print "<function>".$args{'function'}." ";
+ print "</function></funcdef>\n";
+
+# print "<refsect1>\n";
+# print " <title>Synopsis</title>\n";
+# print " <funcsynopsis>\n";
+# print " <funcdef>".$args{'functiontype'}." ";
+# print "<function>".$args{'function'}." ";
+# print "</function></funcdef>\n";
+
+ $count = 0;
+ if ($#{$args{'parameterlist'}} >= 0) {
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print " <paramdef>".$args{'parametertypes'}{$parameter};
+ print " <parameter>$parameter</parameter></paramdef>\n";
+ }
+ } else {
+ print " <void>\n";
+ }
+ print " </funcsynopsis>\n";
+ print "</refsynopsisdiv>\n";
+# print "</refsect1>\n";
+
+ # print parameters
+ print "<refsect1>\n <title>Arguments</title>\n";
+# print "<para>\nArguments\n";
+ if ($#{$args{'parameterlist'}} >= 0) {
+ print " <variablelist>\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print " <varlistentry>\n <term><parameter>$parameter</parameter
+></term>\n";
+ print " <listitem>\n <para>\n";
+ $lineprefix=" ";
+ output_highlight($args{'parameters'}{$parameter});
+ print " </para>\n </listitem>\n </varlistentry>\n";
+ }
+ print " </variablelist>\n";
+ } else {
+ print " <para>\n None\n </para>\n";
+ }
+ print "</refsect1>\n";
+
+ # print out each section
+ $lineprefix=" ";
+ foreach $section (@{$args{'sectionlist'}}) {
+ print "<refsect1>\n <title>$section</title>\n <para>\n";
+# print "<para>\n$section\n";
+ if ($section =~ m/EXAMPLE/i) {
+ print "<example><para>\n";
+ }
+ output_highlight($args{'sections'}{$section});
+# print "</para>";
+ if ($section =~ m/EXAMPLE/i) {
+ print "</para></example>\n";
+ }
+ print " </para>\n</refsect1>\n";
+ }
+
+ print "\n\n";
+}
+
+##
+# output in man
+sub output_man {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+ my $count;
+
+ print ".TH \"$args{'function'}\" 3 \"$args{'sourceversion'}\" \"". $args{'
+module'} . "\" \"". $args{'module'} . "\"\n";
+
+ print ".SH NAME\n";
+
+ print $args{'function'}."\n";
+
+ print ".SH SYNOPSIS\n";
+ print ".B #include <". lc((split /_/, $args{'function'})[0]) . ".h>\n"
+ if $args{'includefuncprefix'};
+ print ".sp\n";
+ print ".BI \"".$args{'functiontype'}." ".$args{'function'}."(";
+ $count = 0;
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print $args{'parametertypes'}{$parameter}." \" ".$parameter." \"";
+ if ($count != $#{$args{'parameterlist'}}) {
+ $count++;
+ print ", ";
+ }
+ }
+ print ");\"\n";
+
+ print ".SH ARGUMENTS\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print ".IP \"".$args{'parametertypes'}{$parameter}." ".$parameter."\"
+12\n";
+ output_highlight($args{'parameters'}{$parameter});
+ }
+ foreach $section (@{$args{'sectionlist'}}) {
+ print ".SH \"" . uc($section) . "\"\n";
+ output_highlight($args{'sections'}{$section});
+ }
+
+ if ($args{'bugsto'}) {
+ print ".SH \"REPORTING BUGS\"\n";
+ print "Report bugs to <". $args{'bugsto'} . ">.\n";
+ }
+
+ if ($args{'copyright'}) {
+ print ".SH COPYRIGHT\n";
+ print "Copyright \\(co ". $args{'copyright'} . ".\n";
+ if ($args{'verbatimcopying'}) {
+ print ".br\n";
+ print "Permission is granted to make and distribute verbatim copie
+s of this\n";
+ print "manual provided the copyright notice and this permission no
+tice are\n";
+ print "preserved on all copies.\n";
+ }
+ }
+
+ if ($args{'seeinfo'}) {
+ print ".SH \"SEE ALSO\"\n";
+ print "The full documentation for\n";
+ print ".B " . $args{'module'} . "\n";
+ print "is maintained as a Texinfo manual. If the\n";
+ print ".B info\n";
+ print "and\n";
+ print ".B " . $args{'module'} . "\n";
+ print "programs are properly installed at your site, the command\n";
+ print ".IP\n";
+ print ".B info " . $args{'seeinfo'} . "\n";
+ print ".PP\n";
+ print "should give you access to the complete manual.\n";
+ }
+}
+
+sub output_listfunc {
+ my %args = %{$_[0]};
+ print $args{'function'} . "\n";
+}
+
+##
+# output in text
+sub output_text {
+ my %args = %{$_[0]};
+ my ($parameter, $section);
+
+ print "Function = ".$args{'function'}."\n";
+ print " return type: ".$args{'functiontype'}."\n\n";
+ foreach $parameter (@{$args{'parameterlist'}}) {
+ print " ".$args{'parametertypes'}{$parameter}." ".$parameter."\n";
+ print " -> ".$args{'parameters'}{$parameter}."\n";
+ }
+ foreach $section (@{$args{'sectionlist'}}) {
+ print " $section:\n";
+ print " -> ";
+ output_highlight($args{'sections'}{$section});
+ }
+}
+
+##
+# generic output function - calls the right one based
+# on current output mode.
+sub output_function {
+# output_html(@_);
+ eval "output_".$output_mode."(\@_);";
+}
+
+
+##
+# takes a function prototype and spits out all the details
+# stored in the global arrays/hsahes.
+sub dump_function {
+ my $prototype = shift @_;
+
+ if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
+ $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
+ $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
+ $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
+ $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/)
+ {
+ $return_type = $1;
+ $function_name = $2;
+ $args = $3;
+
+# print STDERR "ARGS = '$args'\n";
+
+ foreach $arg (split ',', $args) {
+ # strip leading/trailing spaces
+ $arg =~ s/^\s*//;
+ $arg =~ s/\s*$//;
+# print STDERR "SCAN ARG: '$arg'\n";
+ @args = split('\s', $arg);
+
+# print STDERR " -> @args\n";
+ $param = pop @args;
+# print STDERR " -> @args\n";
+ if ($param =~ m/^(\*+)(.*)/) {
+ $param = $2;
+ push @args, $1;
+ }
+ if ($param =~ m/^(.*)(\[\])$/) {
+ $param = $1;
+ push @args, $2;
+ }
+# print STDERR " :> @args\n";
+ $type = join " ", @args;
+
+ if ($parameters{$param} eq "" && $param != "void") {
+ $parameters{$param} = "-- undescribed --";
+ print STDERR "Warning($lineno): Function parameter '$param' no
+t described in '$function_name'\n";
+ }
+
+ push @parameterlist, $param;
+ $parametertypes{$param} = $type;
+
+# print STDERR "param = '$param', type = '$type'\n";
+ }
+ } else {
+ print STDERR "Error($lineno): cannot understand prototype: '$prototype
+'\n";
+ return;
+ }
+
+ if ($function_only==0 || defined($function_table{$function_name})) {
+ output_function({'function' => $function_name,
+ 'module' => $modulename,
+ 'sourceversion' => $sourceversion,
+ 'includefuncprefix' => $includefuncprefix,
+ 'bugsto' => $bugsto,
+ 'copyright' => $copyright,
+ 'verbatimcopying' => $verbatimcopying,
+ 'seeinfo' => $seeinfo,
+ 'functiontype' => $return_type,
+ 'parameterlist' => \@parameterlist,
+ 'parameters' => \%parameters,
+ 'parametertypes' => \%parametertypes,
+ 'sectionlist' => \@sectionlist,
+ 'sections' => \%sections,
+ 'purpose' => $function_purpose
+ });
+ }
+}
+
+######################################################################
+# main
+# states
+# 0 - normal code
+# 1 - looking for function name
+# 2 - scanning field start.
+# 3 - scanning prototype.
+$state = 0;
+$section = "";
+
+$doc_special = "\@\%\$\&";
+
+$doc_start = "^/\\*\\*\$";
+$doc_end = "\\*/";
+$doc_com = "\\s*\\*\\s*";
+$doc_func = $doc_com."(\\w+):?";
+$doc_sect = $doc_com."([".$doc_special."[:upper:]][\\w ]+):(.*)";
+$doc_content = $doc_com."(.*)";
+
+%constants = ();
+%parameters = ();
+@parameterlist = ();
+%sections = ();
+@sectionlist = ();
+
+$contents = "";
+$section_default = "Description"; # default section
+$section = $section_default;
+
+$lineno = 0;
+foreach $file (@ARGV) {
+ if (!open(IN,"<$file")) {
+ print STDERR "Error: Cannot open file $file\n";
+ next;
+ }
+ while (<IN>) {
+ $lineno++;
+
+ if ($state == 0) {
+ if (/$doc_start/o) {
+ $state = 1; # next line is always the function nam
+e
+ }
+ } elsif ($state == 1) { # this line is the function name (always)
+ if (/$doc_func/o) {
+ $function = $1;
+ $state = 2;
+ if (/-(.*)/) {
+ $function_purpose = $1;
+ } else {
+ $function_purpose = "";
+ }
+ if ($verbose) {
+ print STDERR "Info($lineno): Scanning doc for $function\n"
+;
+ }
+ } else {
+ print STDERR "WARN($lineno): Cannot understand $_ on line $lin
+eno",
+ " - I thought it was a doc line\n";
+ $state = 0;
+ }
+ } elsif ($state == 2) { # look for head: lines, and include content
+ if (/$doc_sect/o) {
+ $newsection = $1;
+ $newcontents = $2;
+
+ if ($contents ne "") {
+ dump_section($section, $contents);
+ $section = $section_default;
+ }
+
+ $contents = $newcontents;
+ if ($contents ne "") {
+ $contents .= "\n";
+ }
+ $section = $newsection;
+ } elsif (/$doc_end/) {
+
+ if ($contents ne "") {
+ dump_section($section, $contents);
+ $section = $section_default;
+ $contents = "";
+ }
+
+# print STDERR "end of doc comment, looking for prototype\n";
+ $prototype = "";
+ $state = 3;
+ } elsif (/$doc_content/) {
+ # miguel-style comment kludge, look for blank lines after
+ # @parameter line to signify start of description
+ if ($1 eq "" && $section =~ m/^@/) {
+ dump_section($section, $contents);
+ $section = $section_default;
+ $contents = "";
+ } else {
+ $contents .= $1."\n";
+ }
+ } else {
+ # i dont know - bad line? ignore.
+ print STDERR "WARNING($lineno): bad line: $_";
+ }
+ } elsif ($state == 3) { # scanning for function { (end of prototype)
+ if (m#\s*/\*\s+MACDOC\s*#io) {
+ # do nothing
+ }
+ elsif (/([^\{]*)/) {
+ $prototype .= $1;
+ }
+ if (/\{/) {
+ $prototype =~ s@/\*.*?\*/@@gos; # strip comments.
+ $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+ $prototype =~ s@^ +@@gos; # strip leading spaces
+ dump_function($prototype);
+
+ $function = "";
+ %constants = ();
+ %parameters = ();
+ %parametertypes = ();
+ @parameterlist = ();
+ %sections = ();
+ @sectionlist = ();
+ $prototype = "";
+
+ $state = 0;
+ }
+ }
+ }
+}
+
+
+
diff --git a/Build/source/utils/texinfo/util/gen-dir-node b/Build/source/utils/texinfo/util/gen-dir-node
new file mode 100755
index 00000000000..262bdd77a9b
--- /dev/null
+++ b/Build/source/utils/texinfo/util/gen-dir-node
@@ -0,0 +1,212 @@
+#!/bin/sh
+# $Id: gen-dir-node,v 1.3 2004/04/11 17:56:47 karl Exp $
+# Generate the top-level Info node, given a directory of Info files
+# and (optionally) a skeleton file. The output will be suitable for a
+# top-level dir file. The skeleton file contains info topic names in the
+# order they should appear in the output. There are three special
+# lines that alter the behavior: a line consisting of just "--" causes
+# the next line to be echoed verbatim to the output. A line
+# containing just "%%" causes all the remaining filenames (wildcards
+# allowed) in the rest of the file to be ignored. A line containing
+# just "!!" exits the script when reached (unless preceded by a line
+# containing just "--"). Once the script reaches the end of the
+# skeleton file, it goes through the remaining files in the directory
+# in order, putting their entries at the end. The script will use the
+# ENTRY information in each info file if it exists. Otherwise it will
+# make a minimal entry.
+
+# sent by Jeffrey Osier <jeffrey@cygnus.com>, who thinks it came from
+# zoo@winternet.com (david d `zoo' zuhn)
+
+# modified 7 April 1995 by Joe Harrington <jh@tecate.gsfc.nasa.gov> to
+# take special flags
+
+INFODIR=$1
+if [ $# = 2 ] ; then
+ SKELETON=$2
+else
+ SKELETON=/dev/null
+fi
+
+skip=
+
+if [ $# -gt 2 ] ; then
+ echo usage: $0 info-directory [ skeleton-file ] 1>&2
+ exit 1
+elif [ -z "${INFODIR}" ] ; then
+ INFODIR="%%DEFAULT_INFO_DIR%%"
+else
+ true
+fi
+
+if [ ! -d ${INFODIR} ] ; then
+ echo "$0: first argument must specify a directory"
+ exit 1
+fi
+
+### output the dir header
+echo "-*- Text -*-"
+echo "This file was generated automatically by $0."
+echo "This version was generated on `date`"
+echo "by `whoami`@`hostname` for `(cd ${INFODIR}; pwd)`"
+
+cat << moobler
+\$Id: gen-dir-node,v 1.3 2004/04/11 17:56:47 karl Exp $
+This is the file .../info/dir, which contains the topmost node of the
+Info hierarchy. The first time you invoke Info you start off
+looking at that node, which is (dir)Top.
+
+File: dir Node: Top This is the top of the INFO tree
+
+ This (the Directory node) gives a menu of major topics.
+ Typing "q" exits, "?" lists all Info commands, "d" returns here,
+ "h" gives a primer for first-timers,
+ "mEmacs<Return>" visits the Emacs topic, etc.
+
+ In Emacs, you can click mouse button 2 on a menu item or cross reference
+ to select it.
+
+* Menu: The list of major topics begins on the next line.
+
+moobler
+
+### go through the list of files in the skeleton. If an info file
+### exists, grab the ENTRY information from it. If an entry exists
+### use it, otherwise create a minimal dir entry.
+###
+### Then remove that file from the list of existing files. If any
+### additional files remain (ones that don't have a skeleton entry),
+### then generate entries for those in the same way, putting the info for
+### those at the end....
+
+infofiles=`(cd ${INFODIR}; /bin/ls | grep -v '\-[0-9]*$' | egrep -v '^dir$|^dir\.info$|^dir\.orig$')`
+
+# echoing gets clobbered by backquotes; we do it the hard way...
+lines=`wc $SKELETON | awk '{print $1}'`
+line=1
+while [ $lines -ge $line ] ; do
+ # Read one line from the file. This is so that we can echo lines with
+ # whitespace and quoted characters in them.
+ fileline=`awk NR==$line $SKELETON`
+
+ # flag fancy features
+ if [ ! -z "$echoline" ] ; then # echo line
+ echo "$fileline"
+ fileline=
+ echoline=
+ elif [ "${fileline}" = "--" ] ; then # should we echo the next line?
+ echoline=1
+ elif [ "${fileline}" = "%%" ] ; then # eliminate remaining files from dir?
+ skip=1
+ elif [ "${fileline}" = "!!" ] ; then # quit now
+ exit 0
+ fi
+
+ # handle files if they exist
+ for file in $fileline"" ; do # expand wildcards ("" handles blank lines)
+
+ fname=
+
+ if [ -z "$echoline" ] && [ ! -z "$file" ] ; then
+ # Find the file to operate upon. Check both possible names.
+ infoname=`echo $file | sed 's/\.info$//'`
+ noext=
+ ext=
+ if [ -f ${INFODIR}/$infoname ] ; then
+ noext=$infoname
+ fi
+ if [ -f ${INFODIR}/${infoname}.info ] ; then
+ ext=${infoname}.info
+ fi
+
+ # If it exists with both names take what was said in the file.
+ if [ ! -z "$ext" ] && [ ! -z "$noext" ]; then
+ fname=$file
+ warn="### Warning: $ext and $noext both exist! Using ${file}. ###"
+ elif [ ! -z "${noext}${ext}" ]; then
+ # just take the name if it exists only once
+ fname=${noext}${ext}
+ fi
+
+ # if we found something and aren't skipping, do the entry
+ if [ ! -z "$fname" ] ; then
+ if [ -z "$skip" ] ; then
+
+ if [ ! -z "$warn" ] ; then # issue any warning
+ echo $warn
+ warn=
+ fi
+
+ entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \
+ -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$fname`
+ if [ ! -z "${entry}" ] ; then
+ echo "${entry}"
+ else
+ echo "* ${infoname}: (${infoname})."
+ fi
+ fi
+
+ # remove the name from the directory listing
+ infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${fname} / /" -e "s/ / /g"`
+
+ fi
+
+ fi
+
+ done
+
+ line=`expr $line + 1`
+done
+
+if [ -z "${infofiles}" ] ; then
+ exit 0
+elif [ $lines -gt 0 ]; then
+ echo
+fi
+
+# Sort remaining files by INFO-DIR-SECTION.
+prevsect=
+filesectdata=`(cd ${INFODIR}; fgrep INFO-DIR-SECTION /dev/null ${infofiles} | \
+ fgrep -v 'INFO-DIR-SECTION Miscellaneous' | \
+ sort -t: -k2 -k1 | tr ' ' '_')`
+for sectdata in ${filesectdata}; do
+ file=`echo ${sectdata} | cut -d: -f1`
+ section=`sed -n -e 's/^INFO-DIR-SECTION //p' ${INFODIR}/${file}`
+ infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${file} / /" -e "s/ / /g"`
+
+ if [ "${prevsect}" != "${section}" ] ; then
+ if [ ! -z "${prevsect}" ] ; then
+ echo ""
+ fi
+ echo "${section}"
+ prevsect="${section}"
+ fi
+
+ infoname=`echo $file | sed 's/\.info$//'`
+ entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \
+ -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/${file}`
+ if [ ! -z "${entry}" ] ; then
+ echo "${entry}"
+ elif [ ! -d "${INFODIR}/${file}" ] ; then
+ echo "* ${infoname}: (${infoname})."
+ fi
+done
+
+# Process miscellaneous files.
+for file in ${infofiles}; do
+ if [ ! -z "${prevsect}" ] ; then
+ echo ""
+ echo "Miscellaneous"
+ prevsect=""
+ fi
+
+ infoname=`echo $file | sed 's/\.info$//'`
+ entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \
+ -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/${file}`
+
+ if [ ! -z "${entry}" ] ; then
+ echo "${entry}"
+ elif [ ! -d "${INFODIR}/${file}" ] ; then
+ echo "* ${infoname}: (${infoname})."
+ fi
+done
diff --git a/Build/source/utils/texinfo/util/gendocs.sh b/Build/source/utils/texinfo/util/gendocs.sh
new file mode 100755
index 00000000000..27d4f52d653
--- /dev/null
+++ b/Build/source/utils/texinfo/util/gendocs.sh
@@ -0,0 +1,285 @@
+#!/bin/sh
+# gendocs.sh -- generate a GNU manual in many formats. This script is
+# mentioned in maintain.texi. See the help message below for usage details.
+# $Id: gendocs.sh,v 1.13 2004/09/01 11:40:20 karl Exp $
+#
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+#
+# Original author: Mohit Agarwal.
+# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
+
+prog="`basename \"$0\"`"
+srcdir=`pwd`
+
+scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh"
+templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template"
+
+: ${MAKEINFO="makeinfo"}
+: ${TEXI2DVI="texi2dvi -t @finalout"}
+: ${DVIPS="dvips"}
+: ${DOCBOOK2TXT="docbook2txt"}
+: ${DOCBOOK2HTML="docbook2html"}
+: ${DOCBOOK2PDF="docbook2pdf"}
+: ${DOCBOOK2PS="docbook2ps"}
+: ${GENDOCS_TEMPLATE_DIR="."}
+unset CDPATH
+
+rcs_revision='$Revision: 1.13 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="gendocs.sh $rcs_version
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
+
+Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
+See the GNU Maintainers document for a more extensive discussion:
+ http://www.gnu.org/prep/maintain_toc.html
+
+Options:
+ -o OUTDIR write files into OUTDIR, instead of manual/.
+ --docbook convert to DocBook too (xml, txt, html, pdf and ps).
+ --html ARG pass indicated ARG to makeinfo for HTML targets.
+ --help display this help and exit successfully.
+ --version display version information and exit successfully.
+
+Simple example: $prog emacs \"GNU Emacs Manual\"
+
+Typical sequence:
+ cd YOURPACKAGESOURCE/doc
+ wget \"$scripturl\"
+ wget \"$templateurl\"
+ $prog YOURMANUAL \"GNU YOURMANUAL - One-line description\"
+
+Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
+to override). Move all the new files into your web CVS tree, as
+explained in the Web Pages node of maintain.texi.
+
+MANUAL-TITLE is included as part of the HTML <title> of the overall
+manual/index.html file. It should include the name of the package being
+documented. manual/index.html is created by substitution from the file
+$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
+generic template for your own purposes.)
+
+If you have several manuals, you'll need to run this script several
+times with different YOURMANUAL values, specifying a different output
+directory with -o each time. Then write (by hand) an overall index.html
+with links to them all.
+
+You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to
+control the programs that get executed, and GENDOCS_TEMPLATE_DIR to
+control where the gendocs_template file is looked for.
+
+Email bug reports or enhancement requests to bug-texinfo@gnu.org.
+"
+
+calcsize()
+{
+ size="`ls -ksl $1 | awk '{print $1}'`"
+ echo $size
+}
+
+outdir=manual
+html=
+PACKAGE=
+MANUAL_TITLE=
+
+while test $# -gt 0; do
+ case $1 in
+ --help) echo "$usage"; exit 0;;
+ --version) echo "$version"; exit 0;;
+ -o) shift; outdir=$1;;
+ --docbook) docbook=yes;;
+ --html) shift; html=$1;;
+ -*)
+ echo "$0: Unknown or ambiguous option \`$1'." >&2
+ echo "$0: Try \`--help' for more information." >&2
+ exit 1;;
+ *)
+ if test -z "$PACKAGE"; then
+ PACKAGE=$1
+ elif test -z "$MANUAL_TITLE"; then
+ MANUAL_TITLE=$1
+ else
+ echo "$0: extra non-option argument \`$1'." >&2
+ exit 1
+ fi;;
+ esac
+ shift
+done
+
+if test -s $srcdir/$PACKAGE.texinfo; then
+ srcfile=$srcdir/$PACKAGE.texinfo
+elif test -s $srcdir/$PACKAGE.texi; then
+ srcfile=$srcdir/$PACKAGE.texi
+elif test -s $srcdir/$PACKAGE.txi; then
+ srcfile=$srcdir/$PACKAGE.txi
+else
+ echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
+ exit 1
+fi
+
+if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
+ echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
+ echo "$0: it is available from $templateurl." >&2
+ exit 1
+fi
+
+echo Generating output formats for $srcfile
+
+cmd="${MAKEINFO} -o $PACKAGE.info $srcfile"
+echo "Generating info files... ($cmd)"
+$cmd
+mkdir -p $outdir/
+tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info*
+info_tgz_size="`calcsize $outdir/$PACKAGE.info.tar.gz`"
+# do not mv the info files, there's no point in having them available
+# separately on the web.
+
+cmd="${TEXI2DVI} $srcfile"
+echo "Generating dvi ... ($cmd)"
+$cmd
+
+# now, before we compress dvi:
+echo Generating postscript...
+${DVIPS} $PACKAGE -o
+gzip -f -9 $PACKAGE.ps
+ps_gz_size="`calcsize $PACKAGE.ps.gz`"
+mv $PACKAGE.ps.gz $outdir/
+
+# compress/finish dvi:
+gzip -f -9 $PACKAGE.dvi
+dvi_gz_size="`calcsize $PACKAGE.dvi.gz`"
+mv $PACKAGE.dvi.gz $outdir/
+
+cmd="${TEXI2DVI} --pdf $srcfile"
+echo "Generating pdf ... ($cmd)"
+$cmd
+pdf_size="`calcsize $PACKAGE.pdf`"
+mv $PACKAGE.pdf $outdir/
+
+cmd="${MAKEINFO} -o $PACKAGE.txt --no-split --no-headers $srcfile"
+echo "Generating ASCII... ($cmd)"
+$cmd
+ascii_size="`calcsize $PACKAGE.txt`"
+gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz
+ascii_gz_size="`calcsize $outdir/$PACKAGE.txt.gz`"
+mv $PACKAGE.txt $outdir/
+
+cmd="${MAKEINFO} --no-split --html -o $PACKAGE.html $html $srcfile"
+echo "Generating monolithic html... ($cmd)"
+rm -rf $PACKAGE.html # in case a directory is left over
+$cmd
+html_mono_size="`calcsize $PACKAGE.html`"
+gzip -f -9 -c $PACKAGE.html >$outdir/$PACKAGE.html.gz
+html_mono_gz_size="`calcsize $outdir/$PACKAGE.html.gz`"
+mv $PACKAGE.html $outdir/
+
+cmd="${MAKEINFO} --html -o $PACKAGE.html $html $srcfile"
+echo "Generating html by node... ($cmd)"
+$cmd
+split_html_dir=$PACKAGE.html
+(
+ cd ${split_html_dir} || exit 1
+ tar -czf ../$outdir/${PACKAGE}.html_node.tar.gz -- *.html
+)
+html_node_tgz_size="`calcsize $outdir/${PACKAGE}.html_node.tar.gz`"
+rm -f $outdir/html_node/*.html
+mkdir -p $outdir/html_node/
+mv ${split_html_dir}/*.html $outdir/html_node/
+rmdir ${split_html_dir}
+
+echo Making .tar.gz for sources...
+srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null`
+tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles
+texi_tgz_size="`calcsize $outdir/$PACKAGE.texi.tar.gz`"
+
+if test -n "$docbook"; then
+ cmd="${MAKEINFO} -o - --docbook $srcfile > ${srcdir}/$PACKAGE-db.xml"
+ echo "Generating docbook XML... $(cmd)"
+ eval $cmd
+ docbook_xml_size="`calcsize $PACKAGE-db.xml`"
+ gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz
+ docbook_xml_gz_size="`calcsize $outdir/$PACKAGE-db.xml.gz`"
+ mv $PACKAGE-db.xml $outdir/
+
+ cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook HTML... ($cmd)"
+ $cmd
+ split_html_db_dir=html_node_db
+ (
+ cd ${split_html_db_dir} || exit 1
+ tar -czf ../$outdir/${PACKAGE}.html_node_db.tar.gz -- *.html
+ )
+ html_node_db_tgz_size="`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz`"
+ rm -f $outdir/html_node_db/*.html
+ mkdir -p $outdir/html_node_db
+ mv ${split_html_db_dir}/*.html $outdir/html_node_db/
+ rmdir ${split_html_db_dir}
+
+ cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook ASCII... ($cmd)"
+ $cmd
+ docbook_ascii_size="`calcsize $PACKAGE-db.txt`"
+ mv $PACKAGE-db.txt $outdir/
+
+ cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook PS... $(cmd)"
+ $cmd
+ gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz
+ docbook_ps_gz_size="`calcsize $outdir/$PACKAGE-db.ps.gz`"
+ mv $PACKAGE-db.ps $outdir/
+
+ cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml"
+ echo "Generating docbook PDF... ($cmd)"
+ $cmd
+ docbook_pdf_size="`calcsize $PACKAGE-db.pdf`"
+ mv $PACKAGE-db.pdf $outdir/
+fi
+
+echo Writing index file...
+curdate="`date '+%B %d, %Y'`"
+sed \
+ -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
+ -e "s!%%DATE%%!$curdate!g" \
+ -e "s!%%PACKAGE%%!$PACKAGE!g" \
+ -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
+ -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
+ -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
+ -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
+ -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
+ -e "s!%%PDF_SIZE%%!$pdf_size!g" \
+ -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
+ -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
+ -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
+ -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
+ -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
+ -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
+ -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
+ -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
+ -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
+ -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
+ -e "s,%%SCRIPTURL%%,$scripturl,g" \
+ -e "s!%%SCRIPTNAME%%!$prog!g" \
+$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html
+
+echo "Done! See $outdir/ subdirectory for new files."
diff --git a/Build/source/utils/texinfo/util/gendocs_template b/Build/source/utils/texinfo/util/gendocs_template
new file mode 100755
index 00000000000..6fb2cf950ba
--- /dev/null
+++ b/Build/source/utils/texinfo/util/gendocs_template
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- $Id: gendocs_template,v 1.6 2004/09/23 13:16:19 karl Exp $ -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
+<meta http-equiv="content-type" content='text/html; charset=utf-8' />
+<link rel="stylesheet" type="text/css" href="/gnu.css" />
+<link rev="made" href="webmasters@gnu.org" />
+</head>
+
+<!-- This document is in XML, and xhtml 1.0 -->
+<!-- Please make sure to properly nest your tags -->
+<!-- and ensure that your final document validates -->
+<!-- consistent with W3C xhtml 1.0 and CSS standards -->
+<!-- See validator.w3.org -->
+
+<body>
+
+<h3>%%TITLE%%</h3>
+
+<address>Free Software Foundation</address>
+<address>last updated %%DATE%%</address>
+<p>
+<a href="/graphics/gnu-head.jpg">
+ <img src="/graphics/gnu-head-sm.jpg"
+ alt=" [image of the head of a GNU] "
+ width="129" height="122" />
+</a>
+<a href="/philosophy/gif.html">(no gifs due to patent problems)</a>
+</p>
+<hr />
+
+<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
+
+<ul>
+ <li><a href="%%PACKAGE%%.html">HTML
+ (%%HTML_MONO_SIZE%%K characters)</a> - entirely on one web page.</li>
+ <li><a href="html_node/index.html">HTML</a> - with one web page per
+ node.</li>
+ <li><a href="%%PACKAGE%%.html.gz">HTML compressed
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
+ <li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
+ (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per node.</li>
+ <li><a href="%%PACKAGE%%.info.tar.gz">Info document
+ (%%INFO_TGZ_SIZE%%K characters gzipped tar file)</a>.</li>
+ <li><a href="%%PACKAGE%%.txt">ASCII text
+ (%%ASCII_SIZE%%K characters)</a>.</li>
+ <li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
+ (%%ASCII_GZ_SIZE%%K gzipped characters)</a>.</li>
+ <li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
+ (%%DVI_GZ_SIZE%%K characters gzipped)</a>.</li>
+ <li><a href="%%PACKAGE%%.ps.gz">PostScript file
+ (%%PS_GZ_SIZE%%K characters gzipped)</a>.</li>
+ <li><a href="%%PACKAGE%%.pdf">PDF file
+ (%%PDF_SIZE%%K characters)</a>.</li>
+ <li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
+ (%%TEXI_TGZ_SIZE%%K characters gzipped tar file)</a></li>
+</ul>
+
+<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
+script</a>.)</p>
+
+<div class="copyright">
+<p>
+Return to the <a href="/home.html">GNU Project home page</a>.
+</p>
+
+<p>
+Please send FSF &amp; GNU inquiries to
+<a href="mailto:gnu@gnu.org"><em>gnu@gnu.org</em></a>.
+There are also <a href="/home.html#ContactInfo">other ways to contact</a>
+the FSF.
+<br />
+Please send broken links and other corrections (or suggestions) to
+<a href="mailto:webmasters@gnu.org"><em>webmasters@gnu.org</em></a>.
+</p>
+
+<p>
+Copyright (C) 2004 Free Software Foundation, Inc.,
+59 Temple Place - Suite 330, Boston, MA 02111, USA
+<br />
+Verbatim copying and distribution of this entire article is
+permitted in any medium, provided this notice is preserved.
+</p>
+
+<p>
+Updated:
+<!-- timestamp start -->
+$Date: 2004/09/23 13:16:19 $ $Author: karl $
+<!-- timestamp end -->
+</p>
+</div>
+
+</body>
+</html>
diff --git a/Build/source/utils/texinfo/util/infosrch b/Build/source/utils/texinfo/util/infosrch
new file mode 100755
index 00000000000..af4a9a6290d
--- /dev/null
+++ b/Build/source/utils/texinfo/util/infosrch
@@ -0,0 +1,104 @@
+#!/usr/local/bin/perl -w
+# $Id: infosrch,v 1.2 2004/04/11 17:56:47 karl Exp $
+# infosrch does a regex search on an info manual.
+# By Harry Putnam <reader@newsguy.com>.
+
+($myscript = $0) =~ s:^.*/::;
+$six = '';
+
+if($ARGV[0] eq "help"){
+ &usage;
+ exit;
+}
+if($ARGV[0] eq "-e"){
+ shift;
+ $six = "true";
+}
+if(!$ARGV[1]){
+ &usage;
+ exit;
+}
+
+$target = shift;
+$regex = shift;
+
+$shell_proc = "info --output - --subnodes 2>/dev/null $target";
+
+open(SHELL_PROC," $shell_proc|");
+while(<SHELL_PROC>){
+ chomp;
+ push @lines,$_;
+}
+close(SHELL_PROC);
+$cnt = 0;
+for(@lines){
+ if(/$regex/ && !$six){
+ print "$target\n $lines[($cnt-1)]\n<$cnt> $lines[$cnt]\n $lines[($cnt+1)]\n";
+ print "-- \n";
+ }elsif(/$regex/ && $six){
+ print "$target\n";
+ if($lines[($cnt-6)]){
+ print " $lines[($cnt-6)]\n";
+ }
+ if($lines[($cnt-5)]){
+ print " $lines[($cnt-5)]\n";
+ }
+ if($lines[($cnt-4)]){
+ print " $lines[($cnt-4)]\n";
+ }
+ if($lines[($cnt-3)]){
+ print " $lines[($cnt-3)]\n";
+ }
+ if($lines[($cnt-2)]){
+ print " $lines[($cnt-2)]\n";
+ }
+ if($lines[($cnt-1)]){
+ print " $lines[($cnt-1)]\n";
+ }
+ if($lines[$cnt]){
+ print "$cnt $lines[$cnt]\n";
+ }
+ if($lines[($cnt+1)]){
+ print " $lines[($cnt+1)]\n";
+ }
+ if($lines[($cnt+2)]){
+ print " $lines[($cnt+2)]\n";
+ }
+ if($lines[($cnt+3)]){
+ print " $lines[($cnt+3)]\n";
+ }
+ if($lines[($cnt+4)]){
+ print " $lines[($cnt+4)]\n";
+ }
+ if($lines[($cnt+5)]){
+ print " $lines[($cnt+5)]\n";
+ }
+ if($lines[($cnt+6)]){
+ print " $lines[($cnt+6)]\n";
+ }
+ print "-- \n";
+ }
+ $cnt++;
+}
+
+sub usage {
+ print <<EOM;
+
+Purpose: Extract full text from info node and search it by regex
+Usage: $myscript [-e] TARGET REGEX
+
+Where TARGET is an info node such as `emacs', `bash' etc, and
+REGEX is what you want to find in it.
+
+The -e flag is not required but if used then 6 lines preceding and six
+lines following any hits will be printed. The default (with no -e flag)
+is to print one line before and after.
+
+The output has the line number prepended to the line containing the
+actual regex.
+
+Info command used:
+ info --output - --subnodes 2>/dev/null TARGET
+
+EOM
+}
diff --git a/Build/source/utils/texinfo/util/install-info-html b/Build/source/utils/texinfo/util/install-info-html
new file mode 100644
index 00000000000..4d102959d4c
--- /dev/null
+++ b/Build/source/utils/texinfo/util/install-info-html
@@ -0,0 +1,157 @@
+#!@BASH@
+# $Id: install-info-html,v 1.3 2004/04/11 17:56:47 karl Exp $
+
+name=install-info-html
+version=1.0
+
+all=
+index_dir=.
+
+#
+# debugging
+#
+debug_echo=:
+
+
+#
+# print usage
+#
+function help ()
+{
+ cat << EOF
+$name $version
+Install HTML info document.
+
+Usage: $name [OPTION]... [DOCUMENT-DIR]...
+
+Options:
+ -a,--all assume all subdirectories of index to be DOCUMENT-DIRs
+ -d,--dir=DIR set index directory to DIR (default=.)
+ -D,--debug print debugging info
+ -h,--help this help text
+ -v,--version show version
+EOF
+}
+
+
+function cleanup ()
+{
+ $debug_echo "cleaning ($?)..."
+}
+
+trap cleanup 0 9 15
+
+#
+# Find command line options and switches
+#
+
+# "x:" x takes argument
+#
+options="adhvW:"
+#
+# ugh, "\-" is a hack to support long options
+# must be in double quotes for bash-2.0
+
+while getopts "\-:$options" O
+do
+ $debug_echo "O: \`$O'"
+ $debug_echo "arg: \`$OPTARG'"
+ case $O in
+ a)
+ all=yes
+ ;;
+ D)
+ [ "$debug_echo" = "echo" ] && set -x
+ debug_echo=echo
+ ;;
+ h)
+ help;
+ exit 0
+ ;;
+ v)
+ echo $name $version
+ exit 0
+ ;;
+ d)
+ index_dir=$OPTARG
+ ;;
+ # a long option!
+ -)
+ case "$OPTARG" in
+ a*|-a*)
+ all=yes
+ ;;
+ de*|-de*)
+ [ "$debug_echo" = "echo" ] && set -x
+ debug_echo=echo
+ ;;
+ h*|-h*)
+ help;
+ exit 0
+ ;;
+ di*|-di*)
+ index_dir="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+ ;;
+ version|-version)
+ echo $name $version
+ exit 0
+ ;;
+ *|-*)
+ echo "$0: invalid option -- \"$OPTARG\""
+ help;
+ exit -1
+ ;;
+ esac
+ esac
+done
+shift `expr $OPTIND - 1`
+
+#
+# Input file name
+#
+if [ -z "$all" ] && [ -z "$1" ]; then
+ help
+ echo "$name: No HTML documents given"
+ exit 2
+fi
+
+if [ -n "$all" ] && [ -n "$1" ]; then
+ echo "$name: --all specified, ignoring DIRECTORY-DIRs"
+fi
+
+if [ -n "$all" ]; then
+ document_dirs=`/bin/ls -d1 $index_dir`
+else
+ document_dirs=$*
+fi
+
+index_file=$index_dir/index.html
+rm -f $index_file
+echo -n "$name: Writing index: $index_file..."
+
+# head
+cat >> $index_file <<EOF
+<html>
+<head><title>Info documentation index</title></head>
+<body>
+<h1>Info documentation index</h1>
+This is the directory file \`index.html' a.k.a. \`DIR', which contains the
+topmost node of the HTML Info hierarchy.
+<p>
+This is all very much Work in Progress (WiP).
+<p>
+<ul>
+EOF
+
+#list
+for i in $document_dirs; do
+ echo "<li> <a href=\"$i/$i.html\">$i</a></li>"
+done >> $index_file
+
+# foot
+cat >> $index_file <<EOF
+</ul>
+</body>
+</html>
+EOF
+echo
diff --git a/Build/source/utils/texinfo/util/install-info.c b/Build/source/utils/texinfo/util/install-info.c
new file mode 100644
index 00000000000..bbc7a8c25a5
--- /dev/null
+++ b/Build/source/utils/texinfo/util/install-info.c
@@ -0,0 +1,1590 @@
+/* install-info -- create Info directory entry(ies) for an Info file.
+ $Id: install-info.c,v 1.12 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/
+
+#include "system.h"
+#include <getopt.h>
+
+static char *progname = "install-info";
+
+struct spec_entry;
+struct spec_section;
+
+struct line_data *findlines (char *data, int size, int *nlinesp);
+void insert_entry_here (struct spec_entry *entry, int line_number,
+ struct line_data *dir_lines, int n_entries);
+int compare_section_names (const void *s1, const void *s2);
+int compare_entries_text (const void *e1, const void *e2);
+
+/* Data structures. */
+
+
+/* Record info about a single line from a file as read into core. */
+struct line_data
+{
+ /* The start of the line. */
+ char *start;
+ /* The number of characters in the line,
+ excluding the terminating newline. */
+ int size;
+ /* Vector containing pointers to the entries to add before this line.
+ The vector is null-terminated. */
+ struct spec_entry **add_entries_before;
+ /* 1 means output any needed new sections before this line. */
+ int add_sections_before;
+ /* 1 means don't output this line. */
+ int delete;
+};
+
+
+/* This is used for a list of the specified menu section names
+ in which entries should be added. */
+struct spec_section
+{
+ struct spec_section *next;
+ char *name;
+ /* 1 means we have not yet found an existing section with this name
+ in the dir file--so we will need to add a new section. */
+ int missing;
+};
+
+
+/* This is used for a list of the entries specified to be added. */
+struct spec_entry
+{
+ struct spec_entry *next;
+ char *text;
+ int text_len;
+ /* A pointer to the list of sections to which this entry should be
+ added. */
+ struct spec_section *entry_sections;
+ /* A pointer to a section that is beyond the end of the chain whose
+ head is pointed to by entry_sections. */
+ struct spec_section *entry_sections_tail;
+};
+
+
+/* This is used for a list of nodes found by parsing the dir file. */
+struct node
+{
+ struct node *next;
+ /* The node name. */
+ char *name;
+ /* The line number of the line where the node starts.
+ This is the line that contains control-underscore. */
+ int start_line;
+ /* The line number of the line where the node ends,
+ which is the end of the file or where the next line starts. */
+ int end_line;
+ /* Start of first line in this node's menu
+ (the line after the * Menu: line). */
+ char *menu_start;
+ /* The start of the chain of sections in this node's menu. */
+ struct menu_section *sections;
+ /* The last menu section in the chain. */
+ struct menu_section *last_section;
+};
+
+
+/* This is used for a list of sections found in a node's menu.
+ Each struct node has such a list in the sections field. */
+struct menu_section
+{
+ struct menu_section *next;
+ char *name;
+ /* Line number of start of section. */
+ int start_line;
+ /* Line number of end of section. */
+ int end_line;
+};
+
+/* This table defines all the long-named options, says whether they
+ use an argument, and maps them into equivalent single-letter options. */
+
+struct option longopts[] =
+{
+ { "delete", no_argument, NULL, 'r' },
+ { "dir-file", required_argument, NULL, 'd' },
+ { "entry", required_argument, NULL, 'e' },
+ { "help", no_argument, NULL, 'h' },
+ { "infodir", required_argument, NULL, 'D' },
+ { "info-dir", required_argument, NULL, 'D' },
+ { "info-file", required_argument, NULL, 'i' },
+ { "item", required_argument, NULL, 'e' },
+ { "quiet", no_argument, NULL, 'q' },
+ { "remove", no_argument, NULL, 'r' },
+ { "section", required_argument, NULL, 's' },
+ { "version", no_argument, NULL, 'V' },
+ { 0 }
+};
+
+/* Error message functions. */
+
+/* Print error message. S1 is printf control string, S2 and S3 args for it. */
+
+/* VARARGS1 */
+void
+error (const char *s1, const char *s2, const char *s3)
+{
+ fprintf (stderr, "%s: ", progname);
+ fprintf (stderr, s1, s2, s3);
+ putc ('\n', stderr);
+}
+
+/* VARARGS1 */
+void
+warning (const char *s1, const char *s2, const char *s3)
+{
+ fprintf (stderr, _("%s: warning: "), progname);
+ fprintf (stderr, s1, s2, s3);
+ putc ('\n', stderr);
+}
+
+/* Print error message and exit. */
+
+void
+fatal (const char *s1, const char *s2, const char *s3)
+{
+ error (s1, s2, s3);
+ xexit (1);
+}
+
+/* Return a newly-allocated string
+ whose contents concatenate those of S1, S2, S3. */
+char *
+concat (const char *s1, const char *s2, const char *s3)
+{
+ int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+ char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
+
+ strcpy (result, s1);
+ strcpy (result + len1, s2);
+ strcpy (result + len1 + len2, s3);
+ *(result + len1 + len2 + len3) = 0;
+
+ return result;
+}
+
+/* Return a string containing SIZE characters
+ copied from starting at STRING. */
+
+char *
+copy_string (const char *string, int size)
+{
+ int i;
+ char *copy = (char *) xmalloc (size + 1);
+ for (i = 0; i < size; i++)
+ copy[i] = string[i];
+ copy[size] = 0;
+ return copy;
+}
+
+/* Print fatal error message based on errno, with file name NAME. */
+
+void
+pfatal_with_name (const char *name)
+{
+ char *s = concat ("", strerror (errno), _(" for %s"));
+ fatal (s, name, 0);
+}
+
+/* Compare the menu item names in LINE1 (line length LEN1)
+ and LINE2 (line length LEN2). Return 1 if the item name
+ in LINE1 is less, 0 otherwise. */
+
+static int
+menu_line_lessp (char *line1, int len1, char *line2, int len2)
+{
+ int minlen = (len1 < len2 ? len1 : len2);
+ int i;
+
+ for (i = 0; i < minlen; i++)
+ {
+ /* If one item name is a prefix of the other,
+ the former one is less. */
+ if (line1[i] == ':' && line2[i] != ':')
+ return 1;
+ if (line2[i] == ':' && line1[i] != ':')
+ return 0;
+ /* If they both continue and differ, one is less. */
+ if (line1[i] < line2[i])
+ return 1;
+ if (line1[i] > line2[i])
+ return 0;
+ }
+ /* With a properly formatted dir file,
+ we can only get here if the item names are equal. */
+ return 0;
+}
+
+/* Compare the menu item names in LINE1 (line length LEN1)
+ and LINE2 (line length LEN2). Return 1 if the item names are equal,
+ 0 otherwise. */
+
+static int
+menu_line_equal (char *line1, int len1, char *line2, int len2)
+{
+ int minlen = (len1 < len2 ? len1 : len2);
+ int i;
+
+ for (i = 0; i < minlen; i++)
+ {
+ /* If both item names end here, they are equal. */
+ if (line1[i] == ':' && line2[i] == ':')
+ return 1;
+ /* If they both continue and differ, one is less. */
+ if (line1[i] != line2[i])
+ return 0;
+ }
+ /* With a properly formatted dir file,
+ we can only get here if the item names are equal. */
+ return 1;
+}
+
+
+/* Given the full text of a menu entry, null terminated,
+ return just the menu item name (copied). */
+
+char *
+extract_menu_item_name (char *item_text)
+{
+ char *p;
+
+ if (*item_text == '*')
+ item_text++;
+ while (*item_text == ' ')
+ item_text++;
+
+ p = item_text;
+ while (*p && *p != ':') p++;
+ return copy_string (item_text, p - item_text);
+}
+
+/* Given the full text of a menu entry, terminated by null or newline,
+ return just the menu item file (copied). */
+
+char *
+extract_menu_file_name (char *item_text)
+{
+ char *p = item_text;
+
+ /* If we have text that looks like * ITEM: (FILE)NODE...,
+ extract just FILE. Otherwise return "(none)". */
+
+ if (*p == '*')
+ p++;
+ while (*p == ' ')
+ p++;
+
+ /* Skip to and past the colon. */
+ while (*p && *p != '\n' && *p != ':') p++;
+ if (*p == ':') p++;
+
+ /* Skip past the open-paren. */
+ while (1)
+ {
+ if (*p == '(')
+ break;
+ else if (*p == ' ' || *p == '\t')
+ p++;
+ else
+ return "(none)";
+ }
+ p++;
+
+ item_text = p;
+
+ /* File name ends just before the close-paren. */
+ while (*p && *p != '\n' && *p != ')') p++;
+ if (*p != ')')
+ return "(none)";
+
+ return copy_string (item_text, p - item_text);
+}
+
+
+
+/* Return FNAME with any [.info][.gz] suffix removed. */
+
+static char *
+strip_info_suffix (char *fname)
+{
+ char *ret = xstrdup (fname);
+ unsigned len = strlen (ret);
+
+ if (len > 3 && FILENAME_CMP (ret + len - 3, ".gz") == 0)
+ {
+ len -= 3;
+ ret[len] = 0;
+ }
+ else if (len > 4 && FILENAME_CMP (ret + len - 4, ".bz2") == 0)
+ {
+ len -= 4;
+ ret[len] = 0;
+ }
+
+ if (len > 5 && FILENAME_CMP (ret + len - 5, ".info") == 0)
+ {
+ len -= 5;
+ ret[len] = 0;
+ }
+ else if (len > 4 && FILENAME_CMP (ret + len - 4, ".inf") == 0)
+ {
+ len -= 4;
+ ret[len] = 0;
+ }
+#ifdef __MSDOS__
+ else if (len > 4 && (FILENAME_CMP (ret + len - 4, ".inz") == 0
+ || FILENAME_CMP (ret + len - 4, ".igz") == 0))
+ {
+ len -= 4;
+ ret[len] = 0;
+ }
+#endif /* __MSDOS__ */
+
+ return ret;
+}
+
+
+/* Return true if ITEM matches NAME and is followed by TERM_CHAR. ITEM
+ can also be followed by `.gz', `.info.gz', or `.info' (and then
+ TERM_CHAR) and still match. */
+
+static int
+menu_item_equal (const char *item, char term_char, const char *name)
+{
+ int ret;
+ const char *item_basename = item;
+ unsigned name_len = strlen (name);
+
+ /* We must compare the basename in ITEM, since we are passed the
+ basename of the original info file. Otherwise, a new entry like
+ "lilypond/lilypond" won't match "lilypond".
+
+ Actually, it seems to me that we should really compare the whole
+ name, and not just the basename. Couldn't there be dir1/foo.info
+ and dir2/foo.info? Also, it seems like we should be using the
+ filename from the new dir entries, not the filename on the command
+ line. Not worrying about those things right now, though. --karl,
+ 26mar04. */
+ while (*item_basename && !IS_SLASH (*item_basename)
+ && *item_basename != term_char)
+ item_basename++;
+ if (! *item_basename || *item_basename == term_char)
+ item_basename = item; /* no /, use original */
+ else
+ item_basename++; /* have /, move past it */
+
+ /* First, ITEM must actually match NAME (usually it won't). */
+ ret = strncasecmp (item_basename, name, name_len) == 0;
+ if (ret)
+ {
+ /* Then, `foobar' doesn't match `foo', so be sure we've got all of
+ ITEM. The various suffixes should never actually appear in the
+ dir file, but sometimes people put them in. */
+ static char *suffixes[]
+ = { "", ".info.gz", ".info", ".inf", ".gz",
+#ifdef __MSDOS__
+ ".inz", ".igz",
+#endif
+ NULL };
+ unsigned i;
+ ret = 0;
+ for (i = 0; !ret && suffixes[i]; i++)
+ {
+ char *suffix = suffixes[i];
+ unsigned suffix_len = strlen (suffix);
+ ret = strncasecmp (item_basename + name_len, suffix, suffix_len) == 0
+ && item_basename[name_len + suffix_len] == term_char;
+ }
+ }
+
+ return ret;
+}
+
+
+
+void
+suggest_asking_for_help (void)
+{
+ fprintf (stderr, _("\tTry `%s --help' for a complete list of options.\n"),
+ progname);
+ xexit (1);
+}
+
+void
+print_help (void)
+{
+ printf (_("Usage: %s [OPTION]... [INFO-FILE [DIR-FILE]]\n\
+\n\
+Install or delete dir entries from INFO-FILE in the Info directory file\n\
+DIR-FILE.\n\
+\n\
+Options:\n\
+ --delete delete existing entries for INFO-FILE from DIR-FILE;\n\
+ don't insert any new entries.\n\
+ --dir-file=NAME specify file name of Info directory file.\n\
+ This is equivalent to using the DIR-FILE argument.\n\
+ --entry=TEXT insert TEXT as an Info directory entry.\n\
+ TEXT should have the form of an Info menu item line\n\
+ plus zero or more extra lines starting with whitespace.\n\
+ If you specify more than one entry, they are all added.\n\
+ If you don't specify any entries, they are determined\n\
+ from information in the Info file itself.\n\
+ --help display this help and exit.\n\
+ --info-file=FILE specify Info file to install in the directory.\n\
+ This is equivalent to using the INFO-FILE argument.\n\
+ --info-dir=DIR same as --dir-file=DIR/dir.\n\
+ --item=TEXT same as --entry TEXT.\n\
+ An Info directory entry is actually a menu item.\n\
+ --quiet suppress warnings.\n\
+ --remove same as --delete.\n\
+ --section=SEC put this file's entries in section SEC of the directory.\n\
+ If you specify more than one section, all the entries\n\
+ are added in each of the sections.\n\
+ If you don't specify any sections, they are determined\n\
+ from information in the Info file itself.\n\
+ --version display version information and exit.\n\
+"), progname);
+
+ puts (_("\n\
+Email bug reports to bug-texinfo@gnu.org,\n\
+general questions and discussion to help-texinfo@gnu.org.\n\
+Texinfo home page: http://www.gnu.org/software/texinfo/"));
+}
+
+
+/* If DIRFILE does not exist, create a minimal one (or abort). If it
+ already exists, do nothing. */
+
+void
+ensure_dirfile_exists (char *dirfile)
+{
+ int desc = open (dirfile, O_RDONLY);
+ if (desc < 0 && errno == ENOENT)
+ {
+ FILE *f;
+ char *readerr = strerror (errno);
+ close (desc);
+ f = fopen (dirfile, "w");
+ if (f)
+ {
+ fprintf (f, _("This is the file .../info/dir, which contains the\n\
+topmost node of the Info hierarchy, called (dir)Top.\n\
+The first time you invoke Info you start off looking at this node.\n\
+\x1f\n\
+%s\tThis is the top of the INFO tree\n\
+\n\
+ This (the Directory node) gives a menu of major topics.\n\
+ Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n\
+ \"h\" gives a primer for first-timers,\n\
+ \"mEmacs<Return>\" visits the Emacs manual, etc.\n\
+\n\
+ In Emacs, you can click mouse button 2 on a menu item or cross reference\n\
+ to select it.\n\
+\n\
+%s\n\
+"), "File: dir,\tNode: Top", /* These keywords must not be translated. */
+ "* Menu:"
+);
+ if (fclose (f) < 0)
+ pfatal_with_name (dirfile);
+ }
+ else
+ {
+ /* Didn't exist, but couldn't open for writing. */
+ fprintf (stderr,
+ _("%s: could not read (%s) and could not create (%s)\n"),
+ dirfile, readerr, strerror (errno));
+ xexit (1);
+ }
+ }
+ else
+ close (desc); /* It already existed, so fine. */
+}
+
+/* Open FILENAME and return the resulting stream pointer. If it doesn't
+ exist, try FILENAME.gz. If that doesn't exist either, call
+ CREATE_CALLBACK (with FILENAME as arg) to create it, if that is
+ non-NULL. If still no luck, fatal error.
+
+ If we do open it, return the actual name of the file opened in
+ OPENED_FILENAME and the compress program to use to (de)compress it in
+ COMPRESSION_PROGRAM. The compression program is determined by the
+ magic number, not the filename. */
+
+FILE *
+open_possibly_compressed_file (char *filename,
+ void (*create_callback) (char *),
+ char **opened_filename, char **compression_program, int *is_pipe)
+{
+ char *local_opened_filename, *local_compression_program;
+ int nread;
+ char data[4];
+ FILE *f;
+
+ /* We let them pass NULL if they don't want this info, but it's easier
+ to always determine it. */
+ if (!opened_filename)
+ opened_filename = &local_opened_filename;
+
+ *opened_filename = filename;
+ f = fopen (*opened_filename, FOPEN_RBIN);
+ if (!f)
+ {
+ *opened_filename = concat (filename, ".gz", "");
+ f = fopen (*opened_filename, FOPEN_RBIN);
+ if (!f)
+ {
+ free (*opened_filename);
+ *opened_filename = concat (filename, ".bz2", "");
+ f = fopen (*opened_filename, FOPEN_RBIN);
+ }
+
+#ifdef __MSDOS__
+ if (!f)
+ {
+ free (*opened_filename);
+ *opened_filename = concat (filename, ".igz", "");
+ f = fopen (*opened_filename, FOPEN_RBIN);
+ }
+ if (!f)
+ {
+ free (*opened_filename);
+ *opened_filename = concat (filename, ".inz", "");
+ f = fopen (*opened_filename, FOPEN_RBIN);
+ }
+#endif
+ if (!f)
+ {
+ if (create_callback)
+ { /* That didn't work either. Create the file if we can. */
+ (*create_callback) (filename);
+
+ /* And try opening it again. */
+ free (*opened_filename);
+ *opened_filename = filename;
+ f = fopen (*opened_filename, FOPEN_RBIN);
+ if (!f)
+ pfatal_with_name (filename);
+ }
+ else
+ pfatal_with_name (filename);
+ }
+ }
+
+ /* Read first few bytes of file rather than relying on the filename.
+ If the file is shorter than this it can't be usable anyway. */
+ nread = fread (data, sizeof (data), 1, f);
+ if (nread != 1)
+ {
+ /* Empty files don't set errno, so we get something like
+ "install-info: No error for foo", which is confusing. */
+ if (nread == 0)
+ fatal (_("%s: empty file"), *opened_filename, 0);
+ pfatal_with_name (*opened_filename);
+ }
+
+ if (!compression_program)
+ compression_program = &local_compression_program;
+
+ if (data[0] == '\x1f' && data[1] == '\x8b')
+#if STRIP_DOT_EXE
+ /* An explicit .exe yields a better diagnostics from popen below
+ if they don't have gzip installed. */
+ *compression_program = "gzip.exe";
+#else
+ *compression_program = "gzip";
+#endif
+ else if(data[0] == 'B' && data[1] == 'Z' && data[2] == 'h')
+#ifndef STRIP_DOT_EXE
+ *compression_program = "bzip2.exe";
+#else
+ *compression_program = "bzip2";
+#endif
+ else if(data[0] == 'B' && data[1] == 'Z' && data[2] == '0')
+#ifndef STRIP_DOT_EXE
+ *compression_program = "bzip.exe";
+#else
+ *compression_program = "bzip";
+#endif
+ else
+ *compression_program = NULL;
+
+ if (*compression_program)
+ { /* It's compressed, so fclose the file and then open a pipe. */
+ char *command = concat (*compression_program," -cd <", *opened_filename);
+ if (fclose (f) < 0)
+ pfatal_with_name (*opened_filename);
+ f = popen (command, "r");
+ if (f)
+ *is_pipe = 1;
+ else
+ pfatal_with_name (command);
+ }
+ else
+ { /* It's a plain file, seek back over the magic bytes. */
+ if (fseek (f, 0, 0) < 0)
+ pfatal_with_name (*opened_filename);
+#if O_BINARY
+ /* Since this is a text file, and we opened it in binary mode,
+ switch back to text mode. */
+ f = freopen (*opened_filename, "r", f);
+#endif
+ *is_pipe = 0;
+ }
+
+ return f;
+}
+
+/* Read all of file FILENAME into memory and return the address of the
+ data. Store the size of the data into SIZEP. If need be, uncompress
+ (i.e., try FILENAME.gz et al. if FILENAME does not exist) and store
+ the actual file name that was opened into OPENED_FILENAME (if it is
+ non-NULL), and the companion compression program (if any, else NULL)
+ into COMPRESSION_PROGRAM (if that is non-NULL). If trouble, do
+ a fatal error. */
+
+char *
+readfile (char *filename, int *sizep,
+ void (*create_callback) (char *), char **opened_filename,
+ char **compression_program)
+{
+ char *real_name;
+ FILE *f;
+ int pipe_p;
+ int filled = 0;
+ int data_size = 8192;
+ char *data = xmalloc (data_size);
+
+ /* If they passed the space for the file name to return, use it. */
+ f = open_possibly_compressed_file (filename, create_callback,
+ opened_filename ? opened_filename
+ : &real_name,
+ compression_program, &pipe_p);
+
+ for (;;)
+ {
+ int nread = fread (data + filled, 1, data_size - filled, f);
+ if (nread < 0)
+ pfatal_with_name (real_name);
+ if (nread == 0)
+ break;
+
+ filled += nread;
+ if (filled == data_size)
+ {
+ data_size += 65536;
+ data = xrealloc (data, data_size);
+ }
+ }
+
+ /* We'll end up wasting space if we're not passing the filename back
+ and it is not just FILENAME, but so what. */
+ /* We need to close the stream, since on some systems the pipe created
+ by popen is simulated by a temporary file which only gets removed
+ inside pclose. */
+ if (pipe_p)
+ pclose (f);
+ else
+ fclose (f);
+
+ *sizep = filled;
+ return data;
+}
+
+/* Output the old dir file, interpolating the new sections
+ and/or new entries where appropriate. If COMPRESSION_PROGRAM is not
+ null, pipe to it to create DIRFILE. Thus if we read dir.gz on input,
+ we'll write dir.gz on output. */
+
+static void
+output_dirfile (char *dirfile, int dir_nlines, struct line_data *dir_lines,
+ int n_entries_to_add, struct spec_entry *entries_to_add,
+ struct spec_section *input_sections, char *compression_program)
+{
+ int i;
+ FILE *output;
+
+ if (compression_program)
+ {
+ char *command = concat (compression_program, ">", dirfile);
+ output = popen (command, "w");
+ }
+ else
+ output = fopen (dirfile, "w");
+
+ if (!output)
+ {
+ perror (dirfile);
+ xexit (1);
+ }
+
+ for (i = 0; i <= dir_nlines; i++)
+ {
+ int j;
+
+ /* If we decided to output some new entries before this line,
+ output them now. */
+ if (dir_lines[i].add_entries_before)
+ for (j = 0; j < n_entries_to_add; j++)
+ {
+ struct spec_entry *this = dir_lines[i].add_entries_before[j];
+ if (this == 0)
+ break;
+ fputs (this->text, output);
+ }
+ /* If we decided to add some sections here
+ because there are no such sections in the file,
+ output them now. */
+ if (dir_lines[i].add_sections_before)
+ {
+ struct spec_section *spec;
+ struct spec_section **sections;
+ int n_sections = 0;
+ struct spec_entry *entry;
+ struct spec_entry **entries;
+ int n_entries = 0;
+
+ /* Count the sections and allocate a vector for all of them. */
+ for (spec = input_sections; spec; spec = spec->next)
+ n_sections++;
+ sections = ((struct spec_section **)
+ xmalloc (n_sections * sizeof (struct spec_section *)));
+
+ /* Fill the vector SECTIONS with pointers to all the sections,
+ and sort them. */
+ j = 0;
+ for (spec = input_sections; spec; spec = spec->next)
+ sections[j++] = spec;
+ qsort (sections, n_sections, sizeof (struct spec_section *),
+ compare_section_names);
+
+ /* Count the entries and allocate a vector for all of them. */
+ for (entry = entries_to_add; entry; entry = entry->next)
+ n_entries++;
+ entries = ((struct spec_entry **)
+ xmalloc (n_entries * sizeof (struct spec_entry *)));
+
+ /* Fill the vector ENTRIES with pointers to all the sections,
+ and sort them. */
+ j = 0;
+ for (entry = entries_to_add; entry; entry = entry->next)
+ entries[j++] = entry;
+ qsort (entries, n_entries, sizeof (struct spec_entry *),
+ compare_entries_text);
+
+ /* Generate the new sections in alphabetical order. In each
+ new section, output all of the entries that belong to that
+ section, in alphabetical order. */
+ for (j = 0; j < n_sections; j++)
+ {
+ spec = sections[j];
+ if (spec->missing)
+ {
+ int k;
+
+ putc ('\n', output);
+ fputs (spec->name, output);
+ putc ('\n', output);
+ for (k = 0; k < n_entries; k++)
+ {
+ struct spec_section *spec1;
+ /* Did they at all want this entry to be put into
+ this section? */
+ entry = entries[k];
+ for (spec1 = entry->entry_sections;
+ spec1 && spec1 != entry->entry_sections_tail;
+ spec1 = spec1->next)
+ {
+ if (!strcmp (spec1->name, spec->name))
+ break;
+ }
+ if (spec1 && spec1 != entry->entry_sections_tail)
+ fputs (entry->text, output);
+ }
+ }
+ }
+
+ free (entries);
+ free (sections);
+ }
+
+ /* Output the original dir lines unless marked for deletion. */
+ if (i < dir_nlines && !dir_lines[i].delete)
+ {
+ fwrite (dir_lines[i].start, 1, dir_lines[i].size, output);
+ putc ('\n', output);
+ }
+ }
+
+ /* Some systems, such as MS-DOS, simulate pipes with temporary files.
+ On those systems, the compressor actually gets run inside pclose,
+ so we must call pclose. */
+ if (compression_program)
+ pclose (output);
+ else
+ fclose (output);
+}
+
+/* Parse the input to find the section names and the entry names it
+ specifies. Return the number of entries to add from this file. */
+int
+parse_input (const struct line_data *lines, int nlines,
+ struct spec_section **sections, struct spec_entry **entries)
+{
+ int n_entries = 0;
+ int prefix_length = strlen ("INFO-DIR-SECTION ");
+ struct spec_section *head = *sections, *tail = NULL;
+ int reset_tail = 0;
+ char *start_of_this_entry = 0;
+ int ignore_sections = *sections != 0;
+ int ignore_entries = *entries != 0;
+
+ int i;
+
+ if (ignore_sections && ignore_entries)
+ return 0;
+
+ /* Loop here processing lines from the input file. Each
+ INFO-DIR-SECTION entry is added to the SECTIONS linked list.
+ Each START-INFO-DIR-ENTRY block is added to the ENTRIES linked
+ list, and all its entries inherit the chain of SECTION entries
+ defined by the last group of INFO-DIR-SECTION entries we have
+ seen until that point. */
+ for (i = 0; i < nlines; i++)
+ {
+ if (!ignore_sections
+ && !strncmp ("INFO-DIR-SECTION ", lines[i].start, prefix_length))
+ {
+ struct spec_section *next
+ = (struct spec_section *) xmalloc (sizeof (struct spec_section));
+ next->name = copy_string (lines[i].start + prefix_length,
+ lines[i].size - prefix_length);
+ next->next = *sections;
+ next->missing = 1;
+ if (reset_tail)
+ {
+ tail = *sections;
+ reset_tail = 0;
+ }
+ *sections = next;
+ head = *sections;
+ }
+ /* If entries were specified explicitly with command options,
+ ignore the entries in the input file. */
+ else if (!ignore_entries)
+ {
+ if (!strncmp ("START-INFO-DIR-ENTRY", lines[i].start, lines[i].size)
+ && sizeof ("START-INFO-DIR-ENTRY") - 1 == lines[i].size)
+ {
+ if (!*sections)
+ {
+ /* We found an entry, but didn't yet see any sections
+ specified. Default to section "Miscellaneous". */
+ *sections = (struct spec_section *)
+ xmalloc (sizeof (struct spec_section));
+ (*sections)->name = "Miscellaneous";
+ (*sections)->next = 0;
+ (*sections)->missing = 1;
+ head = *sections;
+ }
+ /* Next time we see INFO-DIR-SECTION, we will reset the
+ tail pointer. */
+ reset_tail = 1;
+
+ if (start_of_this_entry != 0)
+ fatal (_("START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"), 0, 0);
+ start_of_this_entry = lines[i + 1].start;
+ }
+ else if (start_of_this_entry)
+ {
+ if ((!strncmp ("* ", lines[i].start, 2)
+ && lines[i].start > start_of_this_entry)
+ || (!strncmp ("END-INFO-DIR-ENTRY",
+ lines[i].start, lines[i].size)
+ && sizeof ("END-INFO-DIR-ENTRY") - 1 == lines[i].size))
+ {
+ /* We found an end of this entry. Allocate another
+ entry, fill its data, and add it to the linked
+ list. */
+ struct spec_entry *next
+ = (struct spec_entry *) xmalloc (sizeof (struct spec_entry));
+ next->text
+ = copy_string (start_of_this_entry,
+ lines[i].start - start_of_this_entry);
+ next->text_len = lines[i].start - start_of_this_entry;
+ next->entry_sections = head;
+ next->entry_sections_tail = tail;
+ next->next = *entries;
+ *entries = next;
+ n_entries++;
+ if (!strncmp ("END-INFO-DIR-ENTRY",
+ lines[i].start, lines[i].size)
+ && sizeof ("END-INFO-DIR-ENTRY") - 1 == lines[i].size)
+ start_of_this_entry = 0;
+ else
+ start_of_this_entry = lines[i].start;
+ }
+ else if (!strncmp ("END-INFO-DIR-ENTRY",
+ lines[i].start, lines[i].size)
+ && sizeof ("END-INFO-DIR-ENTRY") - 1 == lines[i].size)
+ fatal (_("END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY"), 0, 0);
+ }
+ }
+ }
+ if (start_of_this_entry != 0)
+ fatal (_("START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY"),
+ 0, 0);
+
+ /* If we ignored the INFO-DIR-ENTRY directives, we need now go back
+ and plug the names of all the sections we found into every
+ element of the ENTRIES list. */
+ if (ignore_entries && *entries)
+ {
+ struct spec_entry *entry;
+
+ for (entry = *entries; entry; entry = entry->next)
+ {
+ entry->entry_sections = head;
+ entry->entry_sections_tail = tail;
+ }
+ }
+
+ return n_entries;
+}
+
+/* Parse the dir file whose basename is BASE_NAME. Find all the
+ nodes, and their menus, and the sections of their menus. */
+int
+parse_dir_file (struct line_data *lines, int nlines, struct node **nodes,
+ const char *base_name)
+{
+ int node_header_flag = 0;
+ int something_deleted = 0;
+ int i;
+
+ *nodes = 0;
+ for (i = 0; i < nlines; i++)
+ {
+ /* Parse node header lines. */
+ if (node_header_flag)
+ {
+ int j, end;
+ for (j = 0; j < lines[i].size; j++)
+ /* Find the node name and store it in the `struct node'. */
+ if (!strncmp ("Node:", lines[i].start + j, 5))
+ {
+ char *line = lines[i].start;
+ /* Find the start of the node name. */
+ j += 5;
+ while (line[j] == ' ' || line[j] == '\t')
+ j++;
+ /* Find the end of the node name. */
+ end = j;
+ while (line[end] != 0 && line[end] != ',' && line[end] != '\n'
+ && line[end] != '\t')
+ end++;
+ (*nodes)->name = copy_string (line + j, end - j);
+ }
+ node_header_flag = 0;
+ }
+
+ /* Notice the start of a node. */
+ if (*lines[i].start == 037)
+ {
+ struct node *next = (struct node *) xmalloc (sizeof (struct node));
+
+ next->next = *nodes;
+ next->name = NULL;
+ next->start_line = i;
+ next->end_line = 0;
+ next->menu_start = NULL;
+ next->sections = NULL;
+ next->last_section = NULL;
+
+ if (*nodes != 0)
+ (*nodes)->end_line = i;
+ /* Fill in the end of the last menu section
+ of the previous node. */
+ if (*nodes != 0 && (*nodes)->last_section != 0)
+ (*nodes)->last_section->end_line = i;
+
+ *nodes = next;
+
+ /* The following line is the header of this node;
+ parse it. */
+ node_header_flag = 1;
+ }
+
+ /* Notice the lines that start menus. */
+ if (*nodes != 0 && !strncmp ("* Menu:", lines[i].start, 7))
+ (*nodes)->menu_start = lines[i + 1].start;
+
+ /* Notice sections in menus. */
+ if (*nodes != 0
+ && (*nodes)->menu_start != 0
+ && *lines[i].start != '\n'
+ && *lines[i].start != '*'
+ && *lines[i].start != ' '
+ && *lines[i].start != '\t')
+ {
+ /* Add this menu section to the node's list.
+ This list grows in forward order. */
+ struct menu_section *next
+ = (struct menu_section *) xmalloc (sizeof (struct menu_section));
+
+ next->start_line = i + 1;
+ next->next = 0;
+ next->end_line = 0;
+ next->name = copy_string (lines[i].start, lines[i].size);
+ if ((*nodes)->sections)
+ {
+ (*nodes)->last_section->next = next;
+ (*nodes)->last_section->end_line = i;
+ }
+ else
+ (*nodes)->sections = next;
+ (*nodes)->last_section = next;
+ }
+
+ /* Check for an existing entry that should be deleted.
+ Delete all entries which specify this file name. */
+ if (*lines[i].start == '*')
+ {
+ char *q;
+ char *p = lines[i].start;
+
+ p++; /* skip * */
+ while (*p == ' ') p++; /* ignore following spaces */
+ q = p; /* remember this, it's the beginning of the menu item. */
+
+ /* Read menu item. */
+ while (*p != 0 && *p != ':')
+ p++;
+ p++; /* skip : */
+
+ if (*p == ':')
+ { /* XEmacs-style entry, as in * Mew::Messaging. */
+ if (menu_item_equal (q, ':', base_name))
+ {
+ lines[i].delete = 1;
+ something_deleted = 1;
+ }
+ }
+ else
+ { /* Emacs-style entry, as in * Emacs: (emacs). */
+ while (*p == ' ') p++; /* skip spaces after : */
+ if (*p == '(') /* if at parenthesized (FILENAME) */
+ {
+ p++;
+ if (menu_item_equal (p, ')', base_name))
+ {
+ lines[i].delete = 1;
+ something_deleted = 1;
+ }
+ }
+ }
+ }
+
+ /* Treat lines that start with whitespace
+ as continuations; if we are deleting an entry,
+ delete all its continuations as well. */
+ else if (i > 0 && (*lines[i].start == ' ' || *lines[i].start == '\t'))
+ {
+ lines[i].delete = lines[i - 1].delete;
+ }
+ }
+
+ /* Finish the info about the end of the last node. */
+ if (*nodes != 0)
+ {
+ (*nodes)->end_line = nlines;
+ if ((*nodes)->last_section != 0)
+ (*nodes)->last_section->end_line = nlines;
+ }
+
+ return something_deleted;
+}
+
+int
+main (int argc, char **argv)
+{
+ char *opened_dirfilename;
+ char *compression_program;
+ char *infile_sans_info;
+ char *infile = 0, *dirfile = 0;
+
+ /* Record the text of the Info file, as a sequence of characters
+ and as a sequence of lines. */
+ char *input_data = NULL;
+ int input_size = 0;
+ struct line_data *input_lines = NULL;
+ int input_nlines = 0;
+
+ /* Record here the specified section names and directory entries. */
+ struct spec_section *input_sections = NULL;
+ struct spec_entry *entries_to_add = NULL;
+ int n_entries_to_add = 0;
+
+ /* Record the old text of the dir file, as plain characters,
+ as lines, and as nodes. */
+ char *dir_data;
+ int dir_size;
+ int dir_nlines;
+ struct line_data *dir_lines;
+ struct node *dir_nodes;
+
+ /* Nonzero means --delete was specified (just delete existing entries). */
+ int delete_flag = 0;
+ int something_deleted = 0;
+ /* Nonzero means -q was specified. */
+ int quiet_flag = 0;
+
+ int i;
+
+#ifdef HAVE_SETLOCALE
+ /* Set locale via LC_ALL. */
+ setlocale (LC_ALL, "");
+#endif
+
+ /* Set the text message domain. */
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ while (1)
+ {
+ int opt = getopt_long (argc, argv, "i:d:e:s:hHr", longopts, 0);
+
+ if (opt == EOF)
+ break;
+
+ switch (opt)
+ {
+ case 0:
+ /* If getopt returns 0, then it has already processed a
+ long-named option. We should do nothing. */
+ break;
+
+ case 1:
+ abort ();
+
+ case 'd':
+ if (dirfile)
+ {
+ fprintf (stderr, _("%s: already have dir file: %s\n"),
+ progname, dirfile);
+ suggest_asking_for_help ();
+ }
+ dirfile = optarg;
+ break;
+
+ case 'D':
+ if (dirfile)
+ {
+ fprintf (stderr, _("%s: already have dir file: %s\n"),
+ progname, dirfile);
+ suggest_asking_for_help ();
+ }
+ dirfile = concat (optarg, "", "/dir");
+ break;
+
+ case 'e':
+ {
+ struct spec_entry *next
+ = (struct spec_entry *) xmalloc (sizeof (struct spec_entry));
+ int olen = strlen (optarg);
+ if (! (*optarg != 0 && optarg[olen - 1] == '\n'))
+ {
+ optarg = concat (optarg, "\n", "");
+ olen++;
+ }
+ next->text = optarg;
+ next->text_len = olen;
+ next->entry_sections = NULL;
+ next->entry_sections_tail = NULL;
+ next->next = entries_to_add;
+ entries_to_add = next;
+ n_entries_to_add++;
+ }
+ break;
+
+ case 'h':
+ case 'H':
+ print_help ();
+ xexit (0);
+
+ case 'i':
+ if (infile)
+ {
+ fprintf (stderr, _("%s: Specify the Info file only once.\n"),
+ progname);
+ suggest_asking_for_help ();
+ }
+ infile = optarg;
+ break;
+
+ case 'q':
+ quiet_flag = 1;
+ break;
+
+ case 'r':
+ delete_flag = 1;
+ break;
+
+ case 's':
+ {
+ struct spec_section *next
+ = (struct spec_section *) xmalloc (sizeof (struct spec_section));
+ next->name = optarg;
+ next->next = input_sections;
+ next->missing = 1;
+ input_sections = next;
+ }
+ break;
+
+ case 'V':
+ printf ("install-info (GNU %s) %s\n", PACKAGE, VERSION);
+ puts ("");
+ puts ("Copyright (C) 2004 Free Software Foundation, Inc.");
+ printf (_("There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License.\n\
+For more information about these matters, see the files named COPYING.\n"));
+ xexit (0);
+
+ default:
+ suggest_asking_for_help ();
+ }
+ }
+
+ /* Interpret the non-option arguments as file names. */
+ for (; optind < argc; ++optind)
+ {
+ if (infile == 0)
+ infile = argv[optind];
+ else if (dirfile == 0)
+ dirfile = argv[optind];
+ else
+ error (_("excess command line argument `%s'"), argv[optind], 0);
+ }
+
+ if (!infile)
+ fatal (_("No input file specified; try --help for more information."),
+ 0, 0);
+ if (!dirfile)
+ fatal (_("No dir file specified; try --help for more information."), 0, 0);
+
+ /* Read the Info file and parse it into lines, unless we're deleting. */
+ if (!delete_flag)
+ {
+ input_data = readfile (infile, &input_size, NULL, NULL, NULL);
+ input_lines = findlines (input_data, input_size, &input_nlines);
+ }
+
+ i = parse_input (input_lines, input_nlines,
+ &input_sections, &entries_to_add);
+ if (i > n_entries_to_add)
+ n_entries_to_add = i;
+
+ if (!delete_flag)
+ {
+ if (entries_to_add == 0)
+ { /* No need to abort here, the original info file may not
+ have the requisite Texinfo commands. This is not
+ something an installer should have to correct (it's a
+ problem for the maintainer), and there's no need to cause
+ subsequent parts of `make install' to fail. */
+ warning (_("no info dir entry in `%s'"), infile, 0);
+ xexit (0);
+ }
+
+ /* If the entries came from the command-line arguments, their
+ entry_sections pointers are not yet set. Walk the chain of
+ the entries and for each entry update entry_sections to point
+ to the head of the list of sections where this entry should
+ be put. Note that all the entries specified on the command
+ line get put into ALL the sections we've got, either from the
+ Info file, or (under --section) from the command line,
+ because in the loop below every entry inherits the entire
+ chain of sections. */
+ if (n_entries_to_add > 0 && entries_to_add->entry_sections == NULL)
+ {
+ struct spec_entry *ep;
+
+ /* If we got no sections, default to "Miscellaneous". */
+ if (input_sections == NULL)
+ {
+ input_sections = (struct spec_section *)
+ xmalloc (sizeof (struct spec_section));
+ input_sections->name = "Miscellaneous";
+ input_sections->next = NULL;
+ input_sections->missing = 1;
+ }
+ for (ep = entries_to_add; ep; ep = ep->next)
+ ep->entry_sections = input_sections;
+ }
+ }
+
+ /* Now read in the Info dir file. */
+ dir_data = readfile (dirfile, &dir_size, ensure_dirfile_exists,
+ &opened_dirfilename, &compression_program);
+ dir_lines = findlines (dir_data, dir_size, &dir_nlines);
+
+ /* We will be comparing the entries in the dir file against the
+ current filename, so need to strip off any directory prefix and/or
+ [.info][.gz] suffix. */
+ {
+ char *infile_basename = infile + strlen (infile);
+
+ if (HAVE_DRIVE (infile))
+ infile += 2; /* get past the drive spec X: */
+
+ while (infile_basename > infile && !IS_SLASH (infile_basename[-1]))
+ infile_basename--;
+
+ infile_sans_info = strip_info_suffix (infile_basename);
+ }
+
+ something_deleted
+ = parse_dir_file (dir_lines, dir_nlines, &dir_nodes, infile_sans_info);
+
+ /* Decide where to add the new entries (unless --delete was used).
+ Find the menu sections to add them in.
+ In each section, find the proper alphabetical place to add
+ each of the entries. */
+ if (!delete_flag)
+ {
+ struct node *node;
+ struct menu_section *section;
+ struct spec_section *spec;
+
+ for (node = dir_nodes; node; node = node->next)
+ for (section = node->sections; section; section = section->next)
+ {
+ for (i = section->end_line; i > section->start_line; i--)
+ if (dir_lines[i - 1].size != 0)
+ break;
+ section->end_line = i;
+
+ for (spec = input_sections; spec; spec = spec->next)
+ if (!strcmp (spec->name, section->name))
+ break;
+ if (spec)
+ {
+ int add_at_line = section->end_line;
+ struct spec_entry *entry;
+ /* Say we have found at least one section with this name,
+ so we need not add such a section. */
+ spec->missing = 0;
+ /* For each entry, find the right place in this section
+ to add it. */
+ for (entry = entries_to_add; entry; entry = entry->next)
+ {
+ /* Did they at all want this entry to be put into
+ this section? */
+ for (spec = entry->entry_sections;
+ spec && spec != entry->entry_sections_tail;
+ spec = spec->next)
+ {
+ if (!strcmp (spec->name, section->name))
+ break;
+ }
+ if (!spec || spec == entry->entry_sections_tail)
+ continue;
+
+ /* Subtract one because dir_lines is zero-based,
+ but the `end_line' and `start_line' members are
+ one-based. */
+ for (i = section->end_line - 1;
+ i >= section->start_line - 1; i--)
+ {
+ /* If an entry exists with the same name,
+ and was not marked for deletion
+ (which means it is for some other file),
+ we are in trouble. */
+ if (dir_lines[i].start[0] == '*'
+ && menu_line_equal (entry->text, entry->text_len,
+ dir_lines[i].start,
+ dir_lines[i].size)
+ && !dir_lines[i].delete)
+ fatal (_("menu item `%s' already exists, for file `%s'"),
+ extract_menu_item_name (entry->text),
+ extract_menu_file_name (dir_lines[i].start));
+ if (dir_lines[i].start[0] == '*'
+ && menu_line_lessp (entry->text, entry->text_len,
+ dir_lines[i].start,
+ dir_lines[i].size))
+ add_at_line = i;
+ }
+ insert_entry_here (entry, add_at_line,
+ dir_lines, n_entries_to_add);
+ }
+ }
+ }
+
+ /* Mark the end of the Top node as the place to add any
+ new sections that are needed. */
+ for (node = dir_nodes; node; node = node->next)
+ if (node->name && strcmp (node->name, "Top") == 0)
+ dir_lines[node->end_line].add_sections_before = 1;
+ }
+
+ if (delete_flag && !something_deleted && !quiet_flag)
+ warning (_("no entries found for `%s'; nothing deleted"), infile, 0);
+
+ output_dirfile (opened_dirfilename, dir_nlines, dir_lines, n_entries_to_add,
+ entries_to_add, input_sections, compression_program);
+
+ xexit (0);
+ return 0; /* Avoid bogus warnings. */
+}
+
+/* Divide the text at DATA (of SIZE bytes) into lines.
+ Return a vector of struct line_data describing the lines.
+ Store the length of that vector into *NLINESP. */
+
+struct line_data *
+findlines (char *data, int size, int *nlinesp)
+{
+ int i;
+ int lineflag = 1;
+ int lines_allocated = 511;
+ int filled = 0;
+ struct line_data *lines
+ = xmalloc ((lines_allocated + 1) * sizeof (struct line_data));
+
+ for (i = 0; i < size; i++)
+ {
+ if (lineflag)
+ {
+ if (filled == lines_allocated)
+ {
+ /* try to keep things somewhat page-aligned */
+ lines_allocated = ((lines_allocated + 1) * 2) - 1;
+ lines = xrealloc (lines, (lines_allocated + 1)
+ * sizeof (struct line_data));
+ }
+ lines[filled].start = &data[i];
+ lines[filled].add_entries_before = 0;
+ lines[filled].add_sections_before = 0;
+ lines[filled].delete = 0;
+ if (filled > 0)
+ lines[filled - 1].size
+ = lines[filled].start - lines[filled - 1].start - 1;
+ filled++;
+ }
+ lineflag = (data[i] == '\n');
+ }
+ if (filled > 0)
+ lines[filled - 1].size = &data[i] - lines[filled - 1].start - lineflag;
+
+ /* Do not leave garbage in the last element. */
+ lines[filled].start = NULL;
+ lines[filled].add_entries_before = NULL;
+ lines[filled].add_sections_before = 0;
+ lines[filled].delete = 0;
+ lines[filled].size = 0;
+
+ *nlinesp = filled;
+ return lines;
+}
+
+/* This is the comparison function for qsort for a vector of pointers to
+ struct spec_section. (Have to use const void * as the parameter type
+ to avoid incompatible-with-qsort warnings.)
+ Compare the section names. */
+
+int
+compare_section_names (const void *p1, const void *p2)
+{
+ struct spec_section **sec1 = (struct spec_section **) p1;
+ struct spec_section **sec2 = (struct spec_section **) p2;
+ char *name1 = (*sec1)->name;
+ char *name2 = (*sec2)->name;
+ return strcmp (name1, name2);
+}
+
+/* This is the comparison function for qsort
+ for a vector of pointers to struct spec_entry.
+ Compare the entries' text. */
+
+int
+compare_entries_text (const void *p1, const void *p2)
+{
+ struct spec_entry **entry1 = (struct spec_entry **) p1;
+ struct spec_entry **entry2 = (struct spec_entry **) p2;
+ char *text1 = (*entry1)->text;
+ char *text2 = (*entry2)->text;
+ char *colon1 = strchr (text1, ':');
+ char *colon2 = strchr (text2, ':');
+ int len1, len2;
+
+ if (!colon1)
+ len1 = strlen (text1);
+ else
+ len1 = colon1 - text1;
+ if (!colon2)
+ len2 = strlen (text2);
+ else
+ len2 = colon2 - text2;
+ return strncmp (text1, text2, len1 <= len2 ? len1 : len2);
+}
+
+/* Insert ENTRY into the add_entries_before vector
+ for line number LINE_NUMBER of the dir file.
+ DIR_LINES and N_ENTRIES carry information from like-named variables
+ in main. */
+
+void
+insert_entry_here (struct spec_entry *entry, int line_number,
+ struct line_data *dir_lines, int n_entries)
+{
+ int i, j;
+
+ if (dir_lines[line_number].add_entries_before == 0)
+ {
+ dir_lines[line_number].add_entries_before
+ = (struct spec_entry **) xmalloc (n_entries * sizeof (struct spec_entry *));
+ for (i = 0; i < n_entries; i++)
+ dir_lines[line_number].add_entries_before[i] = 0;
+ }
+
+ /* Find the place where this entry belongs. If there are already
+ several entries to add before LINE_NUMBER, make sure they are in
+ alphabetical order. */
+ for (i = 0; i < n_entries; i++)
+ if (dir_lines[line_number].add_entries_before[i] == 0
+ || menu_line_lessp (entry->text, strlen (entry->text),
+ dir_lines[line_number].add_entries_before[i]->text,
+ strlen (dir_lines[line_number].add_entries_before[i]->text)))
+ break;
+
+ if (i == n_entries)
+ abort ();
+
+ /* If we need to plug ENTRY into the middle of the
+ ADD_ENTRIES_BEFORE array, move the entries which should be output
+ after this one down one notch, before adding a new one. */
+ if (dir_lines[line_number].add_entries_before[i] != 0)
+ for (j = n_entries - 1; j > i; j--)
+ dir_lines[line_number].add_entries_before[j]
+ = dir_lines[line_number].add_entries_before[j - 1];
+
+ dir_lines[line_number].add_entries_before[i] = entry;
+}
diff --git a/Build/source/utils/texinfo/util/outline.gawk b/Build/source/utils/texinfo/util/outline.gawk
new file mode 100644
index 00000000000..329bb17529a
--- /dev/null
+++ b/Build/source/utils/texinfo/util/outline.gawk
@@ -0,0 +1,145 @@
+#! /usr/local/bin/gawk -f
+
+# texi.outline --- produce an outline from a texinfo source file
+#
+# Copyright (C) 1998 Arnold David Robbins (arnold@gnu.org)
+#
+# TEXI.OUTLINE is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# TEXI.OUTLINE is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+# NOTE:
+# This program uses gensub(), which is specific to gawk.
+# With some work (split, substr, etc), it could be made to work
+# on other awks, but it's not worth the trouble for me.
+
+BEGIN \
+{
+ # Levels at which different nodes can be
+ Level["@top"] = 0
+ Level["@appendix"] = 1
+ Level["@chapter"] = 1
+ Level["@majorheading"] = 1
+ Level["@unnumbered"] = 1
+ Level["@appendixsec"] = 2
+ Level["@heading"] = 2
+ Level["@section"] = 2
+ Level["@unnumberedsec"] = 2
+ Level["@unnumberedsubsec"] = 3
+ Level["@appendixsubsec"] = 3
+ Level["@subheading"] = 3
+ Level["@subsection"] = 3
+ Level["@appendixsubsubsec"] = 4
+ Level["@subsubheading"] = 4
+ Level["@subsubsection"] = 4
+ Level["@unnumberedsubsubsec"] = 4
+
+ # insure that we were called correctly
+ if (ARGC != 2) {
+ printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr"
+ exit 1
+ }
+
+ # init header counters
+ app_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ app_h = 0
+ l1_h = l2_h = l3_h = l4_h = 0
+}
+
+# skip lines we're not interested in
+/^[^@]/ || ! ($1 in Level) { next }
+
+Level[$1] == 1 {
+ if ($1 !~ /^@unnumbered/ || $1 !~ /heading/)
+ l1_h++
+ l2_h = l3_h = l4_h = 0
+ Ntabs = 0
+ Number = makenumber($1)
+ Title = maketitle($0)
+ print_title()
+}
+
+Level[$1] == 2 {
+ l2_h++
+ l3_h = l4_h = 0
+ Ntabs = 1
+ Number = makenumber($1)
+ Title = maketitle($0)
+ print_title()
+}
+
+Level[$1] == 3 {
+ l3_h++
+ l4_h = 0
+ Ntabs = 2
+ Number = makenumber($1)
+ Title = maketitle($0)
+ print_title()
+}
+
+Level[$1] == 4 {
+ l4_h++
+ Ntabs = 3
+ Number = makenumber($1)
+ Title = maketitle($0)
+ print_title()
+}
+
+# maketitle --- extract title
+
+function maketitle(str, text)
+{
+ $1 = "" # clobber section keyword
+ text = $0
+ gsub(/^[ \t]*/, "", text)
+ text = gensub(/@[a-z]+{/, "", "g", text)
+ text = gensub(/([^@])}/, "\\1", "g", text)
+ return text
+}
+
+# print_title --- print the title
+
+function print_title( i)
+{
+ for (i = 1; i <= Ntabs; i++)
+ printf "\t"
+ printf("%s %s\n", Number, Title)
+}
+
+# makenumber --- construct a heading number from levels and section command
+
+function makenumber(command, result, lev1)
+{
+ result = ""
+ if (command ~ /^@appendix/) {
+ if (Level[command] == 1)
+ app_h++
+
+ lev1 = substr(app_letters, app_h, 1)
+ } else if (command ~ /^@unnumbered/ || command ~ /heading/) {
+ lev1 = "(unnumbered)"
+ } else
+ lev1 = l1_h ""
+
+ result = lev1 "."
+ if (l2_h > 0) {
+ result = result l2_h "."
+ if (l3_h > 0) {
+ result = result l3_h "."
+ if (l4_h > 0) {
+ result = result l4_h "."
+ }
+ }
+ }
+ return result
+}
diff --git a/Build/source/utils/texinfo/util/prepinfo.awk b/Build/source/utils/texinfo/util/prepinfo.awk
new file mode 100644
index 00000000000..273c97f8460
--- /dev/null
+++ b/Build/source/utils/texinfo/util/prepinfo.awk
@@ -0,0 +1,356 @@
+#! /usr/local/bin/gawk -f
+
+# prepinfo.awk --- fix node lines and menus
+#
+# Copyright, 1998, Arnold Robbins, arnold@gnu.org
+#
+# PREPINFO is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# PREPINFO is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+BEGIN \
+{
+ # manifest constants
+ TRUE = 1
+ FALSE = 0
+
+ # Levels at which different nodes can be
+ Level["@top"] = 0
+ Level["@appendix"] = 1
+ Level["@chapter"] = 1
+ Level["@majorheading"] = 1
+ Level["@unnumbered"] = 1
+ Level["@appendixsec"] = 2
+ Level["@heading"] = 2
+ Level["@section"] = 2
+ Level["@unnumberedsec"] = 2
+ Level["@unnumberedsubsec"] = 3
+ Level["@appendixsubsec"] = 3
+ Level["@subheading"] = 3
+ Level["@subsection"] = 3
+ Level["@appendixsubsubsec"] = 4
+ Level["@subsubheading"] = 4
+ Level["@subsubsection"] = 4
+ Level["@unnumberedsubsubsec"] = 4
+
+ # Length of menus
+ Menumargin = 78
+
+ # Length of menu item
+ Min_menitem_length = 29
+
+ # insure that we were called correctly
+ if (ARGC != 2) {
+ printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr"
+ exit 1
+ }
+
+ # Arrange for two passes over input file
+ Pass = 1
+ ARGV[2] = "Pass=2"
+ ARGV[3] = ARGV[1]
+ ARGC = 4
+ Lastlevel = -1
+
+ # Initialize stacks
+ Up[-1] = "(dir)"
+ Prev[0] = "(dir)"
+
+ if (Debug == "args") {
+ for (i = 0; i < ARGC; i++)
+ printf("ARGV[%d] = %s\n", i, ARGV[i]) > "/dev/stderr"
+ }
+}
+
+$1 == "@node" \
+{
+ Name = getnodename($0)
+ Nodeseen = TRUE
+
+ if ((l = length(Name)) > Maxlen)
+ Maxlen = l
+
+ if (Debug == "nodenames")
+ printf("Name = %s\n", Name) > "/dev/stderr"
+
+ if (Pass == 1)
+ next
+}
+
+Pass == 1 && /^@c(omment)?[ \t]+fakenode/ \
+{
+ if (Debug == "fakenodes")
+ printf("fakenode at %d\n", FNR) > "/dev/stderr"
+ Fakenode = TRUE
+ next
+}
+
+Pass == 1 && ($1 in Level) \
+{
+ # skip fake nodes --- titles without associated @node lines
+ if (Fakenode) {
+ if (Debug == "fakenodes")
+ printf("%s at %d is a fakenode\n", $1, FNR) > "/dev/stderr"
+ Fakenode = FALSE
+ next
+ }
+
+ if (Debug == "titles")
+ printf("Processing %s: Name = %s\n", $1, Name) > "/dev/stderr"
+
+ # save type
+ type = $1
+
+ if (! Nodeseen) {
+ err_prefix()
+ printf("%s line with no @node or fakenode line\n",
+ type) > "/dev/stderr"
+ Badheading[FNR] = 1
+ # ??? used ???
+ next
+ } else
+ Nodeseen = FALSE # reset it
+
+ # Squirrel away the info
+ levelnum = Level[type]
+ Node[Name ".level"] = levelnum
+ Node[Name ".name"] = Name
+ if (Debug == "titles") {
+ printf("Node[%s\".level\"] = %s\n", Name, Node[Name ".level"]) > "/dev/stderr"
+ printf("Node[%s\".name\"] = %s\n", Name, Node[Name ".name"]) > "/dev/stderr"
+ }
+
+ if (levelnum == Lastlevel) { # e.g., two sections in a row
+ Node[Name ".up"] = Up[levelnum - 1]
+ if (levelnum in Prev) {
+ Node[Prev[levelnum] ".next"] = Name
+ Node[Name ".prev"] = Prev[levelnum]
+ }
+ Prev[levelnum] = Name
+ Up[levelnum] = Name # ???
+ } else if (levelnum < Lastlevel) { # section, now chapter
+ Lastlevel = levelnum
+ Node[Name ".up"] = Up[levelnum - 1]
+ if (levelnum in Prev) {
+ Node[Name ".prev"] = Prev[levelnum]
+ Node[Prev[levelnum] ".next"] = Name
+ }
+ Prev[levelnum] = Name
+ Up[levelnum] = Name
+ } else { # chapter, now section, levelnum > Lastlevel
+ Node[Name ".up"] = Up[levelnum - 1]
+ Node[Up[Lastlevel] ".child"] = Name
+ Up[levelnum] = Name
+ Prev[levelnum] = Name
+ Lastlevel = levelnum
+ }
+
+ # For master menu
+ if (Level[$1] >= 2)
+ List[++Sequence] = Name
+
+ if (Debug == "titles") {
+ printf("Node[%s\".prev\"] = %s\n", Name, Node[Name ".prev"]) > "/dev/stderr"
+ printf("Node[%s\".up\"] = %s\n", Name, Node[Name ".up"]) > "/dev/stderr"
+ printf("Node[%s\".child\"] = %s\n", Name, Node[Name ".child"]) > "/dev/stderr"
+ }
+}
+
+Pass == 2 && Debug == "dumptitles" && FNR <= 1 \
+{
+ for (i in Node)
+ printf("Node[%s] = %s\n", i, Node[i]) | "sort 1>&2"
+ close("sort 1>&2")
+}
+
+/^@menu/ && Pass == 1, /^@end[ \t]+menu/ && Pass == 1 \
+{
+ if (/^@menu/ || /^@end[ \t]+menu/)
+ next
+
+# if (Debug == "menu")
+# printf("processing: %s\n", $0) > "/dev/stderr"
+
+ if (/^\*/) {
+ if (In_menitem) { # file away info from previousline
+ Node[node ".mendesc"] = desc
+ Node[node ".longdesc"] = longdesc
+ if (Debug == "mendesc") {
+ printf("Node[%s.mendesc] = %s\n",
+ node, Node[node ".mendesc"]) > "/dev/stderr"
+ printf("Node[%s.longdesc] = %s\n",
+ node, Node[node ".longdesc"]) > "/dev/stderr"
+ }
+ }
+ In_menitem = TRUE
+
+ # pull apart menu item
+ $1 = "" # nuke ``*''
+ $0 = $0 # reparse line
+ i1 = index($0, ":")
+ if (i1 <= 0) {
+ err_prefix()
+ printf("badly formed menu item") > "/dev/stderr"
+ next
+ }
+ if (substr($0, i1+1, 1) != ":") { # desc: node. long desc
+ i2 = index($0, ".")
+ if (i2 <= 0) {
+ err_prefix()
+ printf("badly formed menu item") > "/dev/stderr"
+ next
+ }
+ desc = substr($0, 1, i1 - 1)
+ sub(/^[ \t]+/, "", node)
+ sub(/[ \t]+$/, "", node)
+ longdesc = substr($0, i2 + 1)
+ } else { # nodname:: long desc
+ desc = ""
+ node = substr($0, 1, i1 - 1)
+ sub(/^[ \t]+/, "", node)
+ sub(/[ \t]+$/, "", node)
+ longdesc = substr($0, i1 + 2)
+ }
+ } else if (In_menitem) { # continuation line
+ longdesc = longdesc " " $0
+ } else
+ In_menitem = FALSE
+
+ Node[node ".mendesc"] = desc
+ Node[node ".longdesc"] = longdesc
+ if (Debug == "mendesc") {
+ printf("Node[%s.mendesc] = %s\n",
+ node, Node[node ".mendesc"]) > "/dev/stderr"
+ printf("Node[%s.longdesc] = %s\n",
+ node, Node[node ".longdesc"]) > "/dev/stderr"
+ }
+
+ if (Debug == "menu")
+ printf("Menu:: Name %s: desc %s: longdesc %s\n",
+ node, desc, longdesc) > "/dev/stderr"
+}
+
+function err_prefix()
+{
+ printf("%s: %s: %d: ", ARGV[0], FILENAME, FNR) > "/dev/stderr"
+}
+
+function getnodename(str)
+{
+ sub(/@node[ \t]+/, "", str)
+ sub(/,.*/, "", str)
+ if (Debug == "nodenames")
+ printf("getnodename: return %s\n", str) > "/dev/stderr"
+ return str
+}
+
+Pass == 2 && /^@node/ \
+{
+ Name = getnodename($0)
+
+ # Top node is special. It's next is the first child
+ n = Node[Name ".next"]
+ if (Node[Name ".level"] == 0 && n == "")
+ n = Node[Name ".child"]
+
+ printf("@node %s, %s, %s, %s\n", Name, n,
+ Node[Name ".prev"] ? Node[Name ".prev"] : Node[Name ".up"],
+ Node[Name ".up"])
+ next
+}
+
+Pass == 2 && /^@menu/ \
+{
+ # First, nuke current contents of menu
+ do {
+ if ((getline) <= 0) {
+ err_prefix()
+ printf("unexpected EOF inside menu\n") > "/dev/stderr"
+ exit 1
+ }
+ } while (! /^@end[ \t]+menu/)
+
+ # next, compute maximum length of a node name
+ max = 0
+ for (n = Node[Name ".child"]; (n ".next") in Node; n = Node[n ".next"]) {
+ if ((n ".desc") in Node)
+ s = Node[n ".desc"] ": " n "."
+ else
+ s = n "::"
+ l = length(s)
+ if (l > max)
+ max = l
+ }
+ if (max < Min_menitem_length)
+ max = Min_menitem_length
+
+ # now dump the menu
+ print "@menu"
+
+ for (n = Node[Name ".child"]; (n ".next") in Node; n = Node[n ".next"]) {
+ print_menuitem(n, max)
+ }
+ print_menuitem(n, max)
+
+ if (Name == "Top") { # Master Menu
+ if (Maxlen < Min_menitem_length)
+ Maxlen = Min_menitem_length
+ print ""
+ for (i = 1; i <= Sequence; i++)
+ print_menuitem(List[i], Maxlen)
+ print ""
+ }
+ print "@end menu"
+ next
+}
+
+Pass == 2 # print
+
+
+function print_menuitem(n, max, nodesc, i, dwords, count, p)
+{
+ nodesc = FALSE
+ if (! ((n ".longdesc") in Node)) {
+ err_prefix()
+ printf("warning: %s: no long description\n", n) > "/dev/stderr"
+ nodesc = TRUE
+ } else {
+ for (i in dwords)
+ delete dwords[i]
+ count = split(Node[n ".longdesc"], dwords, "[ \t\n]+")
+ }
+ if ((n ".desc") in Node)
+ s = Node[n ".desc"] ": " n "."
+ else
+ s = n "::"
+ printf("* %-*s", max, s)
+
+ if (Debug == "mendescitem")
+ printf("<* %-*s>\n", max, s) > "/dev/stderr"
+
+ p = max + 2
+ if (! nodesc) {
+ for (i = 1; i <= count; i++) {
+ l = length(dwords[i])
+ if (l == 0)
+ continue
+ if (p + l + 1 > Menumargin) {
+ printf("\n%*s", max + 2, " ")
+ p = max + 2
+ }
+ printf(" %s", dwords[i])
+ p += l + 1
+ }
+ }
+ print ""
+}
diff --git a/Build/source/utils/texinfo/util/tex3patch b/Build/source/utils/texinfo/util/tex3patch
new file mode 100755
index 00000000000..046c7946459
--- /dev/null
+++ b/Build/source/utils/texinfo/util/tex3patch
@@ -0,0 +1,70 @@
+#!/bin/sh
+# Auxiliary script to work around TeX 3.0 bug. ---- tex3patch ----
+# patches texinfo.tex in current directory, or in directory given as arg.
+
+ANYVERSION=no
+
+for arg in $1 $2
+do
+ case $arg in
+ --dammit | -d ) ANYVERSION=yes ;;
+
+ * ) dir=$arg
+ esac
+done
+
+if [ -z "$dir" ]; then
+ dir='.'
+fi
+
+if [ 2 -lt $# ] || [ ! -f "$dir/texinfo.tex" ]; then
+ echo "To patch texinfo.tex for peaceful coexistence with Unix TeX 3.0,"
+ echo "run $0"
+ echo "with no arguments in the same directory as texinfo.tex; or run"
+ echo " $0 DIRECTORY"
+ echo "(where DIRECTORY is a path leading to texinfo.tex)."
+ exit
+fi
+
+if [ -z "$TMPDIR" ]; then
+ TMPDIR=/tmp
+fi
+
+echo "Checking for \`dummy.tfm'"
+
+( cd $TMPDIR; tex '\relax \batchmode \font\foo=dummy \bye' )
+
+grep -s '3.0' $TMPDIR/texput.log
+if [ 1 = "$?" ] && [ "$ANYVERSION" != "yes" ]; then
+ echo "You probably do not need this patch,"
+ echo "since your TeX does not seem to be version 3.0."
+ echo "If you insist on applying the patch, run $0"
+ echo "again with the option \`--dammit'"
+ exit
+fi
+
+grep -s 'file not found' $TMPDIR/texput.log
+if [ 0 = $? ]; then
+ echo "This patch requires the dummy font metric file \`dummy.tfm',"
+ echo "which does not seem to be part of your TeX installation."
+ echo "Please get your TeX maintainer to install \`dummy.tfm',"
+ echo "then run this script again."
+ exit
+fi
+rm $TMPDIR/texput.log
+
+echo "Patching $dir/texinfo.tex"
+
+sed -e 's/%%*\\font\\nullfont/\\font\\nullfont/' \
+ $dir/texinfo.tex >$TMPDIR/texinfo.tex
+mv $dir/texinfo.tex $dir/texinfo.tex-distrib; mv $TMPDIR/texinfo.tex $dir
+
+if [ 0 = $? ]; then
+ echo "Patched $dir/texinfo.tex to avoid TeX 3.0 bug."
+ echo "The original version is saved as $dir/texinfo.tex-distrib."
+else
+ echo "Patch failed. Sorry."
+fi
+----------------------------------------tex3patch ends
+
+
diff --git a/Build/source/utils/texinfo/util/texi-docstring-magic.el b/Build/source/utils/texinfo/util/texi-docstring-magic.el
new file mode 100644
index 00000000000..9cbca2b7591
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texi-docstring-magic.el
@@ -0,0 +1,347 @@
+;; texi-docstring-magic.el -- munge internal docstrings into texi
+;;
+;; Keywords: lisp, docs, tex
+;; Author: David Aspinall <da@dcs.ed.ac.uk>
+;; Copyright (C) 1998 David Aspinall
+;; Maintainer: David Aspinall <da@dcs.ed.ac.uk>
+;;
+;; $Id: texi-docstring-magic.el,v 1.2 2004/04/11 17:56:47 karl Exp $
+;;
+;; This package is distributed under the terms of the
+;; GNU General Public License, Version 2.
+;; You should have a copy of the GPL with your version of
+;; GNU Emacs or the Texinfo distribution.
+;;
+;;
+;; This package generates Texinfo source fragments from Emacs
+;; docstrings. This avoids documenting functions and variables
+;; in more than one place, and automatically adds Texinfo markup
+;; to docstrings.
+;;
+;; It relies heavily on you following the Elisp documentation
+;; conventions to produce sensible output, check the Elisp manual
+;; for details. In brief:
+;;
+;; * The first line of a docstring should be a complete sentence.
+;; * Arguments to functions should be written in upper case: ARG1..ARGN
+;; * User options (variables users may want to set) should have docstrings
+;; beginning with an asterisk.
+;;
+;; Usage:
+;;
+;; Write comments of the form:
+;;
+;; @c TEXI DOCSTRING MAGIC: my-package-function-or-variable-name
+;;
+;; In your texi source, mypackage.texi. From within an Emacs session
+;; where my-package is loaded, visit mypackage.texi and run
+;; M-x texi-docstring-magic to update all of the documentation strings.
+;;
+;; This will insert @defopt, @deffn and the like underneath the
+;; magic comment strings.
+;;
+;; The default value for user options will be printed.
+;;
+;; Symbols are recognized if they are defined for faces, functions,
+;; or variables (in that order).
+;;
+;; Automatic markup rules:
+;;
+;; 1. Indented lines are gathered into @lisp environment.
+;; 2. Pieces of text `stuff' or surrounded in quotes marked up with @samp.
+;; 3. Words *emphasized* are made @strong{emphasized}
+;; 4. Words sym-bol which are symbols become @code{sym-bol}.
+;; 5. Upper cased words ARG corresponding to arguments become @var{arg}.
+;; In fact, you can any word longer than three letters, so that
+;; metavariables can be used easily.
+;; FIXME: to escape this, use `ARG'
+;; 6. Words 'sym which are lisp-quoted are marked with @code{'sym}.
+;;
+;; -----
+;;
+;; Useful key binding when writing Texinfo:
+;;
+;; (define-key TeXinfo-mode-map "C-cC-d" 'texi-docstring-magic-insert-magic)
+;;
+;; -----
+;;
+;; Useful enhancements to do:
+;;
+;; * Use customize properties (e.g. group, simple types)
+;; * Look for a "texi-docstring" property for symbols
+;; so TeXInfo can be defined directly in case automatic markup
+;; goes badly wrong.
+;; * Add tags to special comments so that user can specify face,
+;; function, or variable binding for a symbol in case more than
+;; one binding exists.
+;;
+;; ------
+
+(defun texi-docstring-magic-splice-sep (strings sep)
+ "Return concatenation of STRINGS spliced together with separator SEP."
+ (let (str)
+ (while strings
+ (setq str (concat str (car strings)))
+ (if (cdr strings)
+ (setq str (concat str sep)))
+ (setq strings (cdr strings)))
+ str))
+
+(defconst texi-docstring-magic-munge-table
+ '(;; 1. Indented lines are gathered into @lisp environment.
+ ("\\(^.*\\S-.*$\\)"
+ t
+ (let
+ ((line (match-string 0 docstring)))
+ (if (eq (char-syntax (string-to-char line)) ?\ )
+ ;; whitespace
+ (if in-quoted-region
+ line
+ (setq in-quoted-region t)
+ (concat "@lisp\n" line))
+ ;; non-white space
+ (if in-quoted-region
+ (progn
+ (setq in-quoted-region nil)
+ (concat "@end lisp\n" line))
+ line))))
+ ;; 2. Pieces of text `stuff' or surrounded in quotes
+ ;; are marked up with @samp. NB: Must be backquote
+ ;; followed by forward quote for this to work.
+ ;; Can't use two forward quotes else problems with
+ ;; symbols.
+ ;; Odd hack: because ' is a word constituent in text/texinfo
+ ;; mode, putting this first enables the recognition of args
+ ;; and symbols put inside quotes.
+ ("\\(`\\([^']+\\)'\\)"
+ t
+ (concat "@samp{" (match-string 2 docstring) "}"))
+ ;; 3. Words *emphasized* are made @strong{emphasized}
+ ("\\(\\*\\(\\w+\\)\\*\\)"
+ t
+ (concat "@strong{" (match-string 2 docstring) "}"))
+ ;; 4. Words sym-bol which are symbols become @code{sym-bol}.
+ ;; Must have at least one hyphen to be recognized,
+ ;; terminated in whitespace, end of line, or punctuation.
+ ;; (Only consider symbols made from word constituents
+ ;; and hyphen.
+ ("\\(\\(\\w+\\-\\(\\w\\|\\-\\)+\\)\\)\\(\\s\)\\|\\s-\\|\\s.\\|$\\)"
+ (or (boundp (intern (match-string 2 docstring)))
+ (fboundp (intern (match-string 2 docstring))))
+ (concat "@code{" (match-string 2 docstring) "}"
+ (match-string 4 docstring)))
+ ;; 5. Upper cased words ARG corresponding to arguments become
+ ;; @var{arg}
+ ;; In fact, include any word so long as it is more than 3 characters
+ ;; long. (Comes after symbols to avoid recognizing the
+ ;; lowercased form of an argument as a symbol)
+ ;; FIXME: maybe we don't want to downcase stuff already
+ ;; inside @samp
+ ;; FIXME: should - terminate? should _ be included?
+ ("\\([A-Z0-9\\-]+\\)\\(/\\|\)\\|}\\|\\s-\\|\\s.\\|$\\)"
+ (or (> (length (match-string 1 docstring)) 3)
+ (member (downcase (match-string 1 docstring)) args))
+ (concat "@var{" (downcase (match-string 1 docstring)) "}"
+ (match-string 2 docstring)))
+
+ ;; 6. Words 'sym which are lisp quoted are
+ ;; marked with @code.
+ ("\\(\\(\\s-\\|^\\)'\\(\\(\\w\\|\\-\\)+\\)\\)\\(\\s\)\\|\\s-\\|\\s.\\|$\\)"
+ t
+ (concat (match-string 2 docstring)
+ "@code{'" (match-string 3 docstring) "}"
+ (match-string 5 docstring)))
+ ;; 7,8. Clean up for @lisp environments left with spurious newlines
+ ;; after 1.
+ ("\\(\\(^\\s-*$\\)\n@lisp\\)" t "@lisp")
+ ("\\(\\(^\\s-*$\\)\n@end lisp\\)" t "@end lisp"))
+ "Table of regexp matches and replacements used to markup docstrings.
+Format of table is a list of elements of the form
+ (regexp predicate replacement-form)
+If regexp matches and predicate holds, then replacement-form is
+evaluated to get the replacement for the match.
+predicate and replacement-form can use variables arg,
+and forms such as (match-string 1 docstring)
+Match string 1 is assumed to determine the
+length of the matched item, hence where parsing restarts from.
+The replacement must cover the whole match (match string 0),
+including any whitespace included to delimit matches.")
+
+
+(defun texi-docstring-magic-munge-docstring (docstring args)
+ "Markup DOCSTRING for texi according to regexp matches."
+ (let ((case-fold-search nil))
+ (dolist (test texi-docstring-magic-munge-table docstring)
+ (let ((regexp (nth 0 test))
+ (predicate (nth 1 test))
+ (replace (nth 2 test))
+ (i 0)
+ in-quoted-region)
+
+ (while (and
+ (< i (length docstring))
+ (string-match regexp docstring i))
+ (setq i (match-end 1))
+ (if (eval predicate)
+ (let* ((origlength (- (match-end 0) (match-beginning 0)))
+ (replacement (eval replace))
+ (newlength (length replacement)))
+ (setq docstring
+ (replace-match replacement t t docstring))
+ (setq i (+ i (- newlength origlength))))))
+ (if in-quoted-region
+ (setq docstring (concat docstring "\n@end lisp"))))))
+ ;; Force a new line after (what should be) the first sentence,
+ ;; if not already a new paragraph.
+ (let*
+ ((pos (string-match "\n" docstring))
+ (needscr (and pos
+ (not (string= "\n"
+ (substring docstring
+ (1+ pos)
+ (+ pos 2)))))))
+ (if (and pos needscr)
+ (concat (substring docstring 0 pos)
+ "@*\n"
+ (substring docstring (1+ pos)))
+ docstring)))
+
+(defun texi-docstring-magic-texi (env grp name docstring args &optional endtext)
+ "Make a texi def environment ENV for entity NAME with DOCSTRING."
+ (concat "@def" env (if grp (concat " " grp) "") " " name
+ " "
+ (texi-docstring-magic-splice-sep args " ")
+ ;; " "
+ ;; (texi-docstring-magic-splice-sep extras " ")
+ "\n"
+ (texi-docstring-magic-munge-docstring docstring args)
+ "\n"
+ (or endtext "")
+ "@end def" env "\n"))
+
+(defun texi-docstring-magic-format-default (default)
+ "Make a default value string for the value DEFAULT.
+Markup as @code{stuff} or @lisp stuff @end lisp."
+ (let ((text (format "%S" default)))
+ (concat
+ "\nThe default value is "
+ (if (string-match "\n" text)
+ ;; Carriage return will break @code, use @lisp
+ (if (stringp default)
+ (concat "the string: \n@lisp\n" default "\n@end lisp\n")
+ (concat "the value: \n@lisp\n" text "\n@end lisp\n"))
+ (concat "@code{" text "}.\n")))))
+
+
+(defun texi-docstring-magic-texi-for (symbol)
+ (cond
+ ;; Faces
+ ((find-face symbol)
+ (let*
+ ((face symbol)
+ (name (symbol-name face))
+ (docstring (or (face-doc-string face)
+ "Not documented."))
+ (useropt (eq ?* (string-to-char docstring))))
+ ;; Chop off user option setting
+ (if useropt
+ (setq docstring (substring docstring 1)))
+ (texi-docstring-magic-texi "fn" "Face" name docstring nil)))
+ ((fboundp symbol)
+ ;; Functions.
+ ;; We don't handle macros, aliases, or compiled fns properly.
+ (let*
+ ((function symbol)
+ (name (symbol-name function))
+ (docstring (or (documentation function)
+ "Not documented."))
+ (def (symbol-function function))
+ (argsyms (cond ((eq (car-safe def) 'lambda)
+ (nth 1 def))))
+ (args (mapcar 'symbol-name argsyms)))
+ (if (commandp function)
+ (texi-docstring-magic-texi "fn" "Command" name docstring args)
+ (texi-docstring-magic-texi "un" nil name docstring args))))
+ ((boundp symbol)
+ ;; Variables.
+ (let*
+ ((variable symbol)
+ (name (symbol-name variable))
+ (docstring (or (documentation-property variable
+ 'variable-documentation)
+ "Not documented."))
+ (useropt (eq ?* (string-to-char docstring)))
+ (default (if useropt
+ (texi-docstring-magic-format-default
+ (default-value symbol)))))
+ ;; Chop off user option setting
+ (if useropt
+ (setq docstring (substring docstring 1)))
+ (texi-docstring-magic-texi
+ (if useropt "opt" "var") nil name docstring nil default)))
+ (t
+ (error "Don't know anything about symbol %s" (symbol-name symbol)))))
+
+(defconst texi-docstring-magic-comment
+ "@c TEXI DOCSTRING MAGIC:"
+ "Magic string in a texi buffer expanded into @defopt, or @deffn.")
+
+(defun texi-docstring-magic ()
+ "Update all texi docstring magic annotations in buffer."
+ (interactive)
+ (save-excursion
+ (goto-char (point-min))
+ (let ((magic (concat "^"
+ (regexp-quote texi-docstring-magic-comment)
+ "\\s-*\\(\\(\\w\\|\\-\\)+\\)$"))
+ p
+ symbol)
+ (while (re-search-forward magic nil t)
+ (setq symbol (intern (match-string 1)))
+ (forward-line)
+ (setq p (point))
+ ;; If comment already followed by an environment, delete it.
+ (if (and
+ (looking-at "@def\\(\\w+\\)\\s-")
+ (search-forward (concat "@end def" (match-string 1)) nil t))
+ (progn
+ (forward-line)
+ (delete-region p (point))))
+ (insert
+ (texi-docstring-magic-texi-for symbol))))))
+
+(defun texi-docstring-magic-face-at-point ()
+ (ignore-errors
+ (let ((stab (syntax-table)))
+ (unwind-protect
+ (save-excursion
+ (set-syntax-table emacs-lisp-mode-syntax-table)
+ (or (not (zerop (skip-syntax-backward "_w")))
+ (eq (char-syntax (char-after (point))) ?w)
+ (eq (char-syntax (char-after (point))) ?_)
+ (forward-sexp -1))
+ (skip-chars-forward "'")
+ (let ((obj (read (current-buffer))))
+ (and (symbolp obj) (find-face obj) obj)))
+ (set-syntax-table stab)))))
+
+(defun texi-docstring-magic-insert-magic (symbol)
+ (interactive
+ (let* ((v (or (variable-at-point)
+ (function-at-point)
+ (texi-docstring-magic-face-at-point)))
+ (val (let ((enable-recursive-minibuffers t))
+ (completing-read
+ (if v
+ (format "Magic docstring for symbol (default %s): " v)
+ "Magic docstring for symbol: ")
+ obarray '(lambda (sym)
+ (or (boundp sym)
+ (fboundp sym)
+ (find-face sym)))
+ t nil 'variable-history))))
+ (list (if (equal val "") v (intern val)))))
+ (insert "\n" texi-docstring-magic-comment " " (symbol-name symbol)))
+
+
+(provide 'texi-docstring-magic)
diff --git a/Build/source/utils/texinfo/util/texi2dvi b/Build/source/utils/texinfo/util/texi2dvi
new file mode 100755
index 00000000000..18f6f59322b
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texi2dvi
@@ -0,0 +1,836 @@
+#! /bin/sh
+# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
+# $Id: texi2dvi,v 1.42 2005/02/11 13:35:14 karl Exp $
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
+# 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+#
+# Original author: Noah Friedman.
+#
+# Please send bug reports, etc. to bug-texinfo@gnu.org.
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+test -f /bin/ksh && test -z "$RUNNING_KSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; }
+unset RUNNING_KSH
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 1.42 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="texi2dvi (GNU Texinfo 4.8) $rcs_version
+
+Copyright (C) 2005 Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $program [OPTION]... FILE...
+
+Run each Texinfo or LaTeX FILE through TeX in turn until all
+cross-references are resolved, building all indices. The directory
+containing each FILE is searched for included files. The suffix of FILE
+is used to determine its language (LaTeX or Texinfo).
+
+Makeinfo is used to perform Texinfo macro expansion before running TeX
+when needed.
+
+Operation modes:
+ -b, --batch no interaction
+ -c, --clean remove all auxiliary files
+ -D, --debug turn on shell debugging (set -x)
+ -h, --help display this help and exit successfully
+ -o, --output=OFILE leave output in OFILE (implies --clean);
+ Only one input FILE may be specified in this case
+ -q, --quiet no output unless errors (implies --batch)
+ -s, --silent same as --quiet
+ -v, --version display version information and exit successfully
+ -V, --verbose report on what is done
+
+TeX tuning:
+ -@ use @input instead of \input; for preloaded Texinfo
+ -e, -E, --expand force macro expansion using makeinfo
+ -I DIR search DIR for Texinfo files
+ -l, --language=LANG specify the LANG of FILE (LaTeX or Texinfo)
+ -p, --pdf use pdftex or pdflatex for processing
+ -r, --recode call recode before TeX to translate input characters
+ -t, --command=CMD insert CMD in copy of input file
+ or --texinfo=CMD multiple values accumulate
+
+The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
+TEX (or PDFTEX), TEXINDEX, and THUMBPDF environment variables are used
+to run those commands, if they are set. Any CMD strings are added
+after @setfilename for Texinfo input, in the first line for LaTeX input.
+
+Email bug reports to <bug-texinfo@gnu.org>,
+general questions and discussion to <help-texinfo@gnu.org>.
+Texinfo home page: http://www.gnu.org/software/texinfo/"
+
+# Initialize variables for option overriding and otherwise.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+batch=false # eval for batch mode
+clean=
+debug=
+escape='\'
+expand= # t for expansion via makeinfo
+miincludes= # makeinfo include path
+oformat=dvi
+oname= # --output
+quiet= # by default let the tools' message be displayed
+recode=false
+set_language=
+textra= # Extra TeX commands to insert in the input file.
+textra_cmd= # sed command to insert TEXTRA where appropriate
+tmpdir=${TMPDIR:-/tmp}/t2d$$ # avoid collisions on 8.3 filesystems.
+txincludes= # TEXINPUTS extensions, with trailing colon
+txiprereq=19990129 # minimum texinfo.tex version with macro expansion
+verb=false # echo for verbose mode
+
+orig_pwd=`pwd`
+
+# Systems which define $COMSPEC or $ComSpec use semicolons to separate
+# directories in TEXINPUTS -- except for Cygwin, where COMSPEC might be
+# inherited, but : is used.
+if test -n "$COMSPEC$ComSpec" && uname | grep -iv cygwin >/dev/null; then
+ path_sep=";"
+else
+ path_sep=":"
+fi
+
+# Pacify verbose cds.
+CDPATH=${ZSH_VERSION+.}$path_sep
+
+# In case someone crazy insists on using grep -E.
+: ${EGREP=egrep}
+
+# return true if program $1 is somewhere in PATH, else false.
+#
+findprog ()
+{
+ foundprog=false
+
+ saveIFS=$IFS
+ IFS=$path_sep # break path components at the path separator
+ for dir in $PATH; do
+ # use test -x rather than test -f for DJGPP, where test -x checks
+ # for .exe. But test -x will also return true for directories, so
+ # explicitly ignore those.
+ if test -x "$dir/$1" && test ! -d "$dir/$1"; then
+ foundprog=true
+ break
+
+ # But on cygwin, test -x foo will not find foo.exe. So also check
+ # for that.
+ elif test -x "$dir/$1.exe"; then
+ foundprog=true
+ break
+ fi
+ done
+ IFS=$saveIFS
+ $foundprog
+}
+
+# Report some information.
+report ()
+{
+ for i in "$@"
+ do
+ echo >&2 "$0: $i"
+ done
+}
+
+# Report some verbose information.
+verbose ()
+{
+ $verb >&2 "$0: $@"
+}
+
+# Report an error and exit with failure.
+fatal ()
+{
+ s=$1
+ shift
+ report "$@"
+ exit $s
+}
+
+# Save TEXINPUTS so we can construct a new TEXINPUTS path for each file.
+# Likewise for bibtex and makeindex.
+tex_envvars="BIBINPUTS BSTINPUTS INDEXSTYLE TEXINPUTS"
+for var in $tex_envvars; do
+ eval ${var}_orig=\$$var
+ export $var
+done
+
+
+# Push a token among the arguments that will be used to notice when we
+# ended options/arguments parsing.
+# Use "set dummy ...; shift" rather than 'set - ..." because on
+# Solaris set - turns off set -x (but keeps set -e).
+# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
+# still expand "$@" to a single argument (the empty string) rather
+# than nothing at all.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"; shift
+
+#
+# Parse command line arguments.
+while test x"$1" != x"$arg_sep"; do
+
+ # Handle --option=value by splitting apart and putting back on argv.
+ case "$1" in
+ --*=*)
+ opt=`echo "$1" | sed -e 's/=.*//'`
+ val=`echo "$1" | sed -e 's/[^=]*=//'`
+ shift
+ set dummy "$opt" "$val" ${1+"$@"}; shift
+ ;;
+ esac
+
+ # This recognizes --quark as --quiet. So what.
+ case "$1" in
+ -@ ) escape=@;;
+ # Silently and without documentation accept -b and --b[atch] as synonyms.
+ -b | --b*) batch=true;;
+ -c | --c*) clean=t;;
+ -D | --d*) debug=t;;
+ -e | -E | --e*) expand=t;;
+ -h | --h*) echo "$usage"; exit 0;;
+ -I | --I*)
+ shift
+ miincludes="$miincludes -I $1"
+ txincludes="$txincludes$1$path_sep"
+ ;;
+ -l | --l*) shift; set_language=$1;;
+ -o | --o*)
+ shift
+ clean=t
+ case "$1" in
+ /* | ?:/*) oname=$1;;
+ *) oname="$orig_pwd/$1";;
+ esac;;
+ -p | --p*) oformat=pdf;;
+ -q | -s | --q* | --s*) quiet=t; batch=true;;
+ -r | --r*) recode=true;;
+ -t | --tex* | --com* ) shift; textra="$textra\\
+"`echo "$1" | sed 's/\\\\/\\\\\\\\/g'`;;
+ -v | --vers*) echo "$version"; exit 0;;
+ -V | --verb*) verb=echo;;
+ --) # What remains are not options.
+ shift
+ while test x"$1" != x"$arg_sep"; do
+ set dummy ${1+"$@"} "$1"; shift
+ shift
+ done
+ break;;
+ -*)
+ fatal 1 "Unknown or ambiguous option \`$1'." \
+ "Try \`--help' for more information."
+ ;;
+ *) set dummy ${1+"$@"} "$1"; shift;;
+ esac
+ shift
+done
+# Pop the token
+shift
+
+# Interpret remaining command line args as filenames.
+case $# in
+ 0)
+ fatal 2 "Missing file arguments." "Try \`--help' for more information."
+ ;;
+ 1) ;;
+ *)
+ if test -n "$oname"; then
+ fatal 2 "Can't use option \`--output' with more than one argument."
+ fi
+ ;;
+esac
+
+
+# We can't do much without tex.
+#
+if findprog ${TEX:-tex}; then :; else cat <<EOM
+You don't have a working TeX binary (${TEX:-tex}) installed anywhere in
+your PATH, and texi2dvi cannot proceed without one. If you want to use
+this script, you'll need to install TeX (if you don't have it) or change
+your PATH or TEX environment variable (if you do). See the --help
+output for more details.
+
+For information about obtaining TeX, please see http://www.tug.org. If
+you happen to be using Debian, you can get it with this command:
+ apt-get install tetex-bin
+EOM
+ exit 1
+fi
+
+
+# We want to use etex (or pdftex) if they are available, and the user
+# didn't explicitly specify. We don't check for elatex and pdfelatex
+# because (as of 2003), the LaTeX team has asked that new distributions
+# use etex by default anyway.
+#
+# End up with the TEX and PDFTEX variables set to what we are going to use.
+if test -z "$TEX"; then
+ if findprog etex; then TEX=etex; else TEX=tex; fi
+fi
+#
+if test -z "$PDFTEX"; then
+ if findprog pdfetex; then PDFTEX=pdfetex; else PDFTEX=pdftex; fi
+fi
+
+
+# Prepare the temporary directory. Remove it at exit, unless debugging.
+if test -z "$debug"; then
+ trap "cd / && rm -rf $tmpdir" 0 1 2 15
+fi
+
+# Create the temporary directory with strict rights
+(umask 077 && mkdir $tmpdir) || exit 1
+
+# Prepare the tools we might need. This may be extra work in some
+# cases, but improves the readability of the script.
+utildir=$tmpdir/utils
+mkdir $utildir || exit 1
+
+# A sed script that preprocesses Texinfo sources in order to keep the
+# iftex sections only. We want to remove non TeX sections, and comment
+# (with `@c texi2dvi') TeX sections so that makeinfo does not try to
+# parse them. Nevertheless, while commenting TeX sections, don't
+# comment @macro/@end macro so that makeinfo does propagate them.
+# Unfortunately makeinfo --iftex --no-ifinfo doesn't work well enough
+# (yet), makeinfo can't parse the TeX commands, so work around with sed.
+#
+comment_iftex_sed=$utildir/comment.sed
+cat <<EOF >$comment_iftex_sed
+/^@tex/,/^@end tex/{
+ s/^/@c texi2dvi/
+}
+/^@iftex/,/^@end iftex/{
+ s/^/@c texi2dvi/
+ /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
+ s/^@c texi2dvi//
+ }
+}
+/^@ifnottex/,/^@end ifnottex/{
+ s/^/@c (texi2dvi)/
+}
+/^@ifinfo/,/^@end ifinfo/{
+ /^@node/p
+ /^@menu/,/^@end menu/p
+ t
+ s/^/@c (texi2dvi)/
+}
+s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
+s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
+EOF
+# Uncommenting is simple: Remove any leading `@c texi2dvi'.
+uncomment_iftex_sed=$utildir/uncomment.sed
+cat <<EOF >$uncomment_iftex_sed
+s/^@c texi2dvi//
+EOF
+
+# Compute the list of xref files.
+# Takes the filename (without extension) of which we look for xref
+# files as argument. The index files must be reported last.
+get_xref_files ()
+{
+ # Get list of xref files (indexes, tables and lists).
+ # Find all files having root filename with a two-letter extension,
+ # saves the ones that are really Texinfo-related files. .?o? catches
+ # many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more.
+ for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
+ # If file is empty, skip it.
+ test -s "$this_file" || continue
+ # If the file is not suitable to be an index or xref file, don't
+ # process it. It's suitable if the first character is a
+ # backslash or right quote or at, as long as the first line isn't
+ # \input texinfo.
+ first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
+ if (test "x$first_character" = "x\\" \
+ && sed 1q $this_file | grep -v '^\\input *texinfo' >/dev/null) \
+ || test "x$first_character" = "x'" \
+ || test "x$first_character" = "x@"; then
+ xref_files="$xref_files ./$this_file"
+ fi
+ done
+ echo "$xref_files"
+}
+
+# Convert relative paths to absolute paths, so we can run in another
+# directory (e.g., in --clean mode, or during the macro-support detection.)
+#
+# Empty path components are meaningful to tex. We rewrite them
+# as `EMPTY' so they don't get lost when we split on $path_sep.
+# Hopefully no one will have an actual directory named EMPTY.
+absolute_filenames ()
+{
+ replace_empty="-e 's/^$path_sep/EMPTY$path_sep/g' \
+ -e 's/$path_sep\$/${path_sep}EMPTY/g' \
+ -e 's/$path_sep$path_sep/${path_sep}EMPTY:/g'"
+ _res=`echo "$1" | eval sed $replace_empty`
+ save_IFS=$IFS
+ IFS=$path_sep
+ set x $_res; shift
+ _res=.
+ for dir
+ do
+ case $dir in
+ EMPTY)
+ _res=$_res$path_sep
+ ;;
+ [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expanded.
+ _res=$_res$path_sep$dir
+ ;;
+ *)
+ abs=`cd "$dir" && pwd` && _res=$_res$path_sep$abs
+ ;;
+ esac
+ done
+ echo "$_res"
+}
+
+
+# run_tex ()
+# ----------
+# Run TeX as "$tex $tex_args $filename_input", taking care of errors
+# and logs.
+run_tex ()
+{
+ # Note that this will be used via an eval: quote properly.
+ cmd=$tex
+
+ # If possible, make TeX report error locations in GNU format.
+ tex_args=
+ case $tex_help in
+ *file-line-error*) cmd="$cmd --file-line-error";;
+ esac
+
+ # Tell TeX to be batch if requested.
+ if $batch; then
+ # \batchmode does not show terminal output at all, so we don't
+ # want that. And even in batch mode, TeX insists on having input
+ # from the user. Close its stdin to make it impossible.
+ cmd="$cmd </dev/null '${escape}nonstopmode' '${escape}input'"
+ fi
+
+ cmd="$cmd '$filename_input'"
+
+ verbose "Running $cmd ..."
+ if eval "$cmd" >&5; then :; else
+ test "$clean" = t \
+ && cp "$filename_noext.log" "$orig_pwd"
+ fatal 1 "$tex exited with bad status, quitting." \
+ "see $filename_noext.log for errors."
+ fi
+}
+
+# File descriptor usage:
+# 0 standard input
+# 1 standard output (--verbose messages)
+# 2 standard error
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 tools output (turned off by --quiet)
+# 6 tracing/debugging (set -x output, etc.)
+
+# Tools' output. If quiet, discard, else redirect to the message flow.
+if test "$quiet" = t; then
+ exec 5>/dev/null
+else
+ exec 5>&1
+fi
+
+# Enable tracing
+if test "$debug" = t; then
+ exec 6>&1
+ set -x
+else
+ exec 6>/dev/null
+fi
+
+#
+# TeXify files.
+
+for command_line_filename in ${1+"$@"}; do
+ verbose "Processing $command_line_filename ..."
+
+ # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
+ # prepend `./' in order to avoid that the tools take it as an option.
+ echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >&6 \
+ || command_line_filename="./$command_line_filename"
+
+ # See if the file exists. If it doesn't we're in trouble since, even
+ # though the user may be able to reenter a valid filename at the tex
+ # prompt (assuming they're attending the terminal), this script won't
+ # be able to find the right xref files and so forth.
+ if test ! -r "$command_line_filename"; then
+ report "Could not read $command_line_filename, skipping."
+ continue
+ fi
+
+ # Get the name of the current directory. We want the full path
+ # because in clean mode we are in tmp, in which case a relative
+ # path has no meaning.
+ filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
+ filename_dir=`cd "$filename_dir" >/dev/null && pwd`
+
+ # Strip directory part but leave extension.
+ filename_ext=`basename "$command_line_filename"`
+ # Strip extension.
+ filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
+ ext=`echo "$filename_ext" | sed 's/^.*\.//'`
+
+ # _src. Use same basename since we want to generate aux files with
+ # the same basename as the manual. If --expand, then output the
+ # macro-expanded file to here, else copy the original file.
+ tmpdir_src=$tmpdir/src
+ filename_src=$tmpdir_src/$filename_noext.$ext
+
+ # _xtr. The file with the user's extra commands.
+ tmpdir_xtr=$tmpdir/xtr
+ filename_xtr=$tmpdir_xtr/$filename_noext.$ext
+
+ # _rcd. The Texinfo file recoded in 7bit.
+ tmpdir_rcd=$tmpdir/rcd
+ filename_rcd=$tmpdir_rcd/$filename_noext.$ext
+
+ # _bak. Copies of the previous xref files (another round is run if
+ # they differ from the new one).
+ tmpdir_bak=$tmpdir/bak
+
+ # Make all those directories and give up if we can't succeed.
+ mkdir $tmpdir_src $tmpdir_xtr $tmpdir_rcd $tmpdir_bak || exit 1
+
+ # Source file might include additional sources.
+ # We want `.:$orig_pwd' before anything else. (We'll add `.:' later
+ # after all other directories have been turned into absolute paths.)
+ # `.' goes first to ensure that any old .aux, .cps,
+ # etc. files in ${directory} don't get used in preference to fresher
+ # files in `.'. Include orig_pwd in case we are in clean mode, where
+ # we've cd'd to a temp directory.
+ common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes"
+ for var in $tex_envvars; do
+ eval ${var}="\$common\$${var}_orig"
+ export $var
+ done
+
+ # Convert relative paths to absolute paths, so we can run in another
+ # directory (e.g., in --clean mode, or during the macro-support detection.)
+ TEXINPUTS=`absolute_filenames "$TEXINPUTS"`
+ verbose "TEXINPUTS: $TEXINPUTS"
+ BIBINPUTS=`absolute_filenames "$BIBINPUTS"`
+ verbose "BIBINPUTS: $BIBINPUTS"
+ BSTINPUTS=`absolute_filenames "$BSTINPUTS"`
+ verbose "BSTINPUTS: $BSTINPUTS"
+ INDEXSTYLE=`absolute_filenames "$INDEXSTYLE"`
+ verbose "INDEXSTYLE: $INDEXSTYLE"
+
+ # If the user explicitly specified the language, use that.
+ # Otherwise, if the first line is \input texinfo, assume it's texinfo.
+ # Otherwise, guess from the file extension.
+ if test -n "$set_language"; then
+ language=$set_language
+ elif sed 1q "$command_line_filename" | grep 'input texinfo' >&6; then
+ language=texinfo
+ else
+ language=
+ fi
+
+ # Get the type of the file (latex or texinfo) from the given language
+ # we just guessed, or from the file extension if not set yet.
+ case ${language:-$filename_ext} in
+ [lL]a[tT]e[xX] | *.ltx | *.tex)
+ # Assume a LaTeX file. LaTeX needs bibtex and uses latex for
+ # compilation. No makeinfo.
+ language=latex
+ bibtex=${BIBTEX:-bibtex}
+ makeinfo= # no point in running makeinfo on latex source.
+ texindex=${MAKEINDEX:-makeindex}
+ textra_cmd=1i
+ if test $oformat = dvi; then
+ tex=${LATEX:-latex}
+ else
+ tex=${PDFLATEX:-pdflatex}
+ fi
+ thumbpdf=${THUMBPDF:-thumbpdf}
+ ;;
+
+ *)
+ # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex.
+ language=texinfo
+ bibtex=
+ texindex=${TEXINDEX:-texindex}
+ textra_cmd='/^@setfilename/a'
+ if test $oformat = dvi; then
+ # MetaPost also uses the TEX environment variable. If the user
+ # has set TEX=latex for that reason, don't bomb out.
+ if echo $TEX | grep 'latex$' >/dev/null; then
+ tex=tex # don't bother trying to find etex
+ else
+ tex=$TEX
+ fi
+ else
+ tex=$PDFTEX
+ fi
+ # Unless required by the user, makeinfo expansion is wanted only
+ # if texinfo.tex is too old.
+ if test "$expand" = t; then
+ makeinfo=${MAKEINFO:-makeinfo}
+ else
+ # Check if texinfo.tex performs macro expansion by looking for
+ # its version. The version is a date of the form YEAR-MO-DA.
+ # We don't need to use [0-9] to match the digits since anyway
+ # the comparison with $txiprereq, a number, will fail with non
+ # digits.
+ # Run in the tmpdir to avoid leaving files.
+ (
+ cd $tmpdir
+ echo '\input texinfo.tex @bye' >txiversion.tex
+ # Be sure that if tex wants to fail, it is not interactive:
+ # close stdin.
+ $tex txiversion.tex </dev/null
+ ) >$tmpdir/txiversion.out 2>$tmpdir/txiversion.err
+ if test $? != 0; then
+ cat $tmpdir/txiversion.out
+ cat $tmpdir/txiversion.err >&2
+ fatal 1 "texinfo.tex appears to be broken, quitting."
+ fi
+ eval `sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p' $tmpdir/txiversion.out`
+ verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
+ if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
+ makeinfo=
+ else
+ makeinfo=${MAKEINFO:-makeinfo}
+ fi
+ # As long as we had to run TeX, offer the user this convenience:
+ test "$txiformat" = Texinfo && escape=@
+ fi
+ thumbpdf=${THUMBPDF:-thumbpdf}
+ ;;
+ esac
+
+ # Go to $tmpdir to try --help, since old versions that don't accept
+ # --help will generate a texput.log.
+ tex_help=`cd $tmpdir >/dev/null && $tex --help </dev/null 2>&1`
+
+ # Expand macro commands in the original source file using Makeinfo.
+ # Always use `end' footnote style, since the `separate' style
+ # generates different output (arguably this is a bug in -E).
+ # Discard main info output, the user asked to run TeX, not makeinfo.
+ if test -n "$makeinfo"; then
+ verbose "Macro-expanding $command_line_filename to $filename_src ..."
+ sed -f $comment_iftex_sed "$command_line_filename" \
+ | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
+ -o /dev/null --macro-expand=- \
+ | sed -f $uncomment_iftex_sed >"$filename_src"
+ filename_input=$filename_src
+ fi
+
+ # If makeinfo failed (or was not even run), use the original file as input.
+ if test $? -ne 0 \
+ || test ! -r "$filename_src"; then
+ verbose "Reverting to $command_line_filename ..."
+ filename_input=$filename_dir/$filename_ext
+ fi
+
+ # Used most commonly for @finalout, @smallbook, etc.
+ if test -n "$textra"; then
+ verbose "Inserting extra commands: $textra"
+ sed "$textra_cmd\\
+$textra" "$filename_input" >"$filename_xtr"
+ filename_input=$filename_xtr
+ fi
+
+ # If this is a Texinfo file with a specified input encoding, and
+ # recode is available, then recode to plain 7 bit Texinfo.
+ if test $language = texinfo; then
+ pgm='s/^ *@documentencoding *\([^ ][^ ]*\) *$/\1/
+ t found
+ d
+ :found
+ q'
+ encoding=`sed -e "$pgm" "$filename_input"`
+ if $recode && test -n "$encoding" && findprog recode; then
+ verbose "Recoding from $encoding to Texinfo."
+ if recode "$encoding"..texinfo <"$filename_input" >"$filename_rcd" \
+ && test -s "$filename_rcd"; then
+ filename_input=$filename_rcd
+ else
+ verbose "Recoding failed, using original input."
+ fi
+ fi
+ fi
+
+ # If clean mode was specified, then move to the temporary directory.
+ if test "$clean" = t; then
+ verbose "cd $tmpdir_src"
+ cd "$tmpdir_src" || exit 1
+ fi
+
+ while :; do # will break out of loop below
+ orig_xref_files=`get_xref_files "$filename_noext"`
+
+ # Save copies of originals for later comparison.
+ if test -n "$orig_xref_files"; then
+ verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
+ cp $orig_xref_files $tmpdir_bak
+ fi
+
+ # Run bibtex on current file.
+ # - If its input (AUX) exists.
+ # - If AUX contains both `\bibdata' and `\bibstyle'.
+ # - If some citations are missing (LOG contains `Citation').
+ # or the LOG complains of a missing .bbl
+ #
+ # We run bibtex first, because I can see reasons for the indexes
+ # to change after bibtex is run, but I see no reason for the
+ # converse.
+ #
+ # Don't try to be too smart. Running bibtex only if the bbl file
+ # exists and is older than the LaTeX file is wrong, since the
+ # document might include files that have changed. Because there
+ # can be several AUX (if there are \include's), but a single LOG,
+ # looking for missing citations in LOG is easier, though we take
+ # the risk to match false messages.
+ if test -n "$bibtex" \
+ && test -r "$filename_noext.aux" \
+ && test -r "$filename_noext.log" \
+ && (grep '^\\bibdata[{]' "$filename_noext.aux" \
+ && grep '^\\bibstyle[{]' "$filename_noext.aux" \
+ && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
+ || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
+ >&6 2>&1; \
+ then
+ verbose "Running $bibtex $filename_noext ..."
+ $bibtex "$filename_noext" >&5 ||
+ fatal 1 "$bibtex exited with bad status, quitting."
+ fi
+
+ # What we'll run texindex on -- exclude non-index files.
+ # Since we know index files are last, it is correct to remove everything
+ # before .aux and .?o?. But don't really do <anything>o<anything>
+ # -- don't match whitespace as <anything>.
+ # Otherwise, if orig_xref_files contains something like
+ # foo.xo foo.whatever
+ # the space after the o will get matched.
+ index_files=`echo "$orig_xref_files" \
+ | sed "s!.*\.aux!!g;
+ s!./$filename_noext\.[^ ]o[^ ]!!g;
+ s/^[ ]*//;s/[ ]*$//"`
+ # Run texindex (or makeindex) on current index files. If they
+ # already exist, and after running TeX a first time the index
+ # files don't change, then there's no reason to run TeX again.
+ # But we won't know that if the index files are out of date or
+ # nonexistent.
+ if test -n "$texindex" && test -n "$index_files"; then
+ verbose "Running $texindex $index_files ..."
+ $texindex $index_files 2>&5 1>&2 ||
+ fatal 1 "$texindex exited with bad status, quitting."
+ fi
+
+ # Finally, run TeX.
+ run_tex
+
+ # Decide if looping again is needed.
+ finished=t
+
+ # LaTeX (and the package changebar) report in the LOG file if it
+ # should be rerun. This is needed for files included from
+ # subdirs, since texi2dvi does not try to compare xref files in
+ # subdirs. Performing xref files test is still good since LaTeX
+ # does not report changes in xref files.
+ if grep "Rerun to get" "$filename_noext.log" >&6 2>&1; then
+ finished=
+ fi
+
+ # Check if xref files changed.
+ new_xref_files=`get_xref_files "$filename_noext"`
+ verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
+ verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`"
+
+ # If old and new lists don't at least have the same file list,
+ # then one file or another has definitely changed.
+ test "x$orig_xref_files" != "x$new_xref_files" && finished=
+
+ # File list is the same. We must compare each file until we find
+ # a difference.
+ if test -n "$finished"; then
+ for this_file in $new_xref_files; do
+ verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
+ # cmp -s returns nonzero exit status if files differ.
+ if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
+ # We only need to keep comparing until we find one that
+ # differs, because we'll have to run texindex & tex again no
+ # matter how many more there might be.
+ finished=
+ verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
+ test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
+ break
+ fi
+ done
+ fi
+
+ # If finished, exit the loop, else rerun the loop.
+ test -n "$finished" && break
+ done # while :;
+
+ # If we were using thumbpdf and producing PDF, then run thumbpdf
+ # and TeX one last time.
+ if test $oformat = pdf \
+ && test -r "$filename_noext.log" \
+ && grep 'thumbpdf\.sty' "$filename_noext.log" >&6 2>&1; \
+ then
+ verbose "Running $thumbpdf $filename_noext ..."
+ $thumbpdf "$filename_noext" >&5 ||
+ fatal 1 "$thumbpdf exited with bad status, quitting."
+ run_tex
+ fi
+
+
+ # If we were in clean mode, compilation was in a tmp directory.
+ # Copy the DVI (or PDF) file into the directory where the compilation
+ # has been done. (The temp dir is about to get removed anyway.)
+ # We also return to the original directory so that
+ # - the next file is processed in correct conditions
+ # - the temporary file can be removed
+ if test -n "$clean"; then
+ if test -n "$oname"; then
+ dest=$oname
+ else
+ dest=$orig_pwd
+ fi
+ verbose "Copying $oformat file from `pwd` to $dest"
+ cp -p "./$filename_noext.$oformat" "$dest"
+ cd / # in case $orig_pwd is on a different drive (for DOS)
+ cd $orig_pwd || exit 1
+ fi
+
+ # Remove temporary files.
+ if test "x$debug" = "x"; then
+ verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
+ cd /
+ rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
+ fi
+done
+
+verbose "done."
+exit 0 # exit successfully, not however we ended the loop.
diff --git a/Build/source/utils/texinfo/util/texi2pdf b/Build/source/utils/texinfo/util/texi2pdf
new file mode 100755
index 00000000000..492128325db
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texi2pdf
@@ -0,0 +1,19 @@
+#!/bin/sh
+# $Id: texi2pdf,v 1.1 2004/07/11 01:02:35 karl Exp $
+# Written by Thomas Esser. Public domain.
+# Execute texi2dvi --pdf.
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+unset RUNNING_SH5
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+# hack around a bug in zsh:
+test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"'
+
+texi2dvi --pdf ${1+"$@"}
diff --git a/Build/source/utils/texinfo/util/texindex.c b/Build/source/utils/texinfo/util/texindex.c
new file mode 100644
index 00000000000..569f877be0d
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texindex.c
@@ -0,0 +1,1628 @@
+/* texindex -- sort TeX index dribble output into an actual index.
+ $Id: texindex.c,v 1.11 2004/04/11 17:56:47 karl Exp $
+
+ Copyright (C) 1987, 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2001,
+ 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307. */
+
+#include "system.h"
+#include <getopt.h>
+
+static char *program_name = "texindex";
+
+#if defined (emacs)
+# include "../src/config.h"
+/* Some s/os.h files redefine these. */
+# undef read
+# undef close
+# undef write
+# undef open
+#endif
+
+#if !defined (HAVE_MEMSET)
+#undef memset
+#define memset(ptr, ignore, count) bzero (ptr, count)
+#endif
+
+char *mktemp (char *);
+
+#if !defined (SEEK_SET)
+# define SEEK_SET 0
+# define SEEK_CUR 1
+# define SEEK_END 2
+#endif /* !SEEK_SET */
+
+struct linebuffer;
+
+/* When sorting in core, this structure describes one line
+ and the position and length of its first keyfield. */
+struct lineinfo
+{
+ char *text; /* The actual text of the line. */
+ union {
+ char *text; /* The start of the key (for textual comparison). */
+ long number; /* The numeric value (for numeric comparison). */
+ } key;
+ long keylen; /* Length of KEY field. */
+};
+
+/* This structure describes a field to use as a sort key. */
+struct keyfield
+{
+ int startwords; /* Number of words to skip. */
+ int startchars; /* Number of additional chars to skip. */
+ int endwords; /* Number of words to ignore at end. */
+ int endchars; /* Ditto for characters of last word. */
+ char ignore_blanks; /* Non-zero means ignore spaces and tabs. */
+ char fold_case; /* Non-zero means case doesn't matter. */
+ char reverse; /* Non-zero means compare in reverse order. */
+ char numeric; /* Non-zeros means field is ASCII numeric. */
+ char positional; /* Sort according to file position. */
+ char braced; /* Count balanced-braced groupings as fields. */
+};
+
+/* Vector of keyfields to use. */
+struct keyfield keyfields[3];
+
+/* Number of keyfields stored in that vector. */
+int num_keyfields = 3;
+
+/* Vector of input file names, terminated with a null pointer. */
+char **infiles;
+
+/* Vector of corresponding output file names, or NULL, meaning default it
+ (add an `s' to the end). */
+char **outfiles;
+
+/* Length of `infiles'. */
+int num_infiles;
+
+/* Pointer to the array of pointers to lines being sorted. */
+char **linearray;
+
+/* The allocated length of `linearray'. */
+long nlines;
+
+/* Directory to use for temporary files. On Unix, it ends with a slash. */
+char *tempdir;
+
+/* Number of last temporary file. */
+int tempcount;
+
+/* Number of last temporary file already deleted.
+ Temporary files are deleted by `flush_tempfiles' in order of creation. */
+int last_deleted_tempcount;
+
+/* During in-core sort, this points to the base of the data block
+ which contains all the lines of data. */
+char *text_base;
+
+/* Initially 0; changed to 1 if we want initials in this index. */
+int need_initials;
+
+/* Remembers the first initial letter seen in this index, so we can
+ determine whether we need initials in the sorted form. */
+char first_initial;
+
+/* Additional command switches .*/
+
+/* Nonzero means do not delete tempfiles -- for debugging. */
+int keep_tempfiles;
+
+/* Forward declarations of functions in this file. */
+void decode_command (int argc, char **argv);
+void sort_in_core (char *infile, int total, char *outfile);
+void sort_offline (char *infile, off_t total, char *outfile);
+char **parsefile (char *filename, char **nextline, char *data, long int size);
+char *find_field (struct keyfield *keyfield, char *str, long int *lengthptr);
+char *find_pos (char *str, int words, int chars, int ignore_blanks);
+long find_value (char *start, long int length);
+char *find_braced_pos (char *str, int words, int chars, int ignore_blanks);
+char *find_braced_end (char *str);
+void writelines (char **linearray, int nlines, FILE *ostream);
+int compare_field (struct keyfield *keyfield, char *start1,
+ long int length1, long int pos1, char *start2,
+ long int length2, long int pos2);
+int compare_full (const void *, const void *);
+long readline (struct linebuffer *linebuffer, FILE *stream);
+int merge_files (char **infiles, int nfiles, char *outfile);
+int merge_direct (char **infiles, int nfiles, char *outfile);
+void pfatal_with_name (const char *name);
+void fatal (const char *format, const char *arg);
+void error (const char *format, const char *arg);
+void *xmalloc (), *xrealloc ();
+char *concat (char *s1, char *s2);
+void flush_tempfiles (int to_count);
+
+#define MAX_IN_CORE_SORT 500000
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ tempcount = 0;
+ last_deleted_tempcount = 0;
+
+#ifdef HAVE_SETLOCALE
+ /* Set locale via LC_ALL. */
+ setlocale (LC_ALL, "");
+#endif
+
+ /* Set the text message domain. */
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ /* In case we write to a redirected stdout that fails. */
+ /* not ready atexit (close_stdout); */
+
+ /* Describe the kind of sorting to do. */
+ /* The first keyfield uses the first braced field and folds case. */
+ keyfields[0].braced = 1;
+ keyfields[0].fold_case = 1;
+ keyfields[0].endwords = -1;
+ keyfields[0].endchars = -1;
+
+ /* The second keyfield uses the second braced field, numerically. */
+ keyfields[1].braced = 1;
+ keyfields[1].numeric = 1;
+ keyfields[1].startwords = 1;
+ keyfields[1].endwords = -1;
+ keyfields[1].endchars = -1;
+
+ /* The third keyfield (which is ignored while discarding duplicates)
+ compares the whole line. */
+ keyfields[2].endwords = -1;
+ keyfields[2].endchars = -1;
+
+ decode_command (argc, argv);
+
+ /* Process input files completely, one by one. */
+
+ for (i = 0; i < num_infiles; i++)
+ {
+ int desc;
+ off_t ptr;
+ char *outfile;
+ struct stat instat;
+
+ desc = open (infiles[i], O_RDONLY, 0);
+ if (desc < 0)
+ pfatal_with_name (infiles[i]);
+
+ if (stat (infiles[i], &instat))
+ pfatal_with_name (infiles[i]);
+ if (S_ISDIR (instat.st_mode))
+ {
+#ifdef EISDIR
+ errno = EISDIR;
+#endif
+ pfatal_with_name (infiles[i]);
+ }
+
+ lseek (desc, (off_t) 0, SEEK_END);
+ ptr = (off_t) lseek (desc, (off_t) 0, SEEK_CUR);
+
+ close (desc);
+
+ outfile = outfiles[i];
+ if (!outfile)
+ outfile = concat (infiles[i], "s");
+
+ need_initials = 0;
+ first_initial = '\0';
+
+ if (ptr < MAX_IN_CORE_SORT)
+ /* Sort a small amount of data. */
+ sort_in_core (infiles[i], (int)ptr, outfile);
+ else
+ sort_offline (infiles[i], ptr, outfile);
+ }
+
+ flush_tempfiles (tempcount);
+ xexit (0);
+ return 0; /* Avoid bogus warnings. */
+}
+
+typedef struct
+{
+ char *long_name;
+ char *short_name;
+ int *variable_ref;
+ int variable_value;
+ char *arg_name;
+ char *doc_string;
+} TEXINDEX_OPTION;
+
+TEXINDEX_OPTION texindex_options[] = {
+ { "--help", "-h", (int *)NULL, 0, (char *)NULL,
+ N_("display this help and exit") },
+ { "--keep", "-k", &keep_tempfiles, 1, (char *)NULL,
+ N_("keep temporary files around after processing") },
+ { "--no-keep", 0, &keep_tempfiles, 0, (char *)NULL,
+ N_("do not keep temporary files around after processing (default)") },
+ { "--output", "-o", (int *)NULL, 0, "FILE",
+ N_("send output to FILE") },
+ { "--version", (char *)NULL, (int *)NULL, 0, (char *)NULL,
+ N_("display version information and exit") },
+ { (char *)NULL, (char *)NULL, (int *)NULL, 0, (char *)NULL }
+};
+
+void
+usage (int result_value)
+{
+ register int i;
+ FILE *f = result_value ? stderr : stdout;
+
+ fprintf (f, _("Usage: %s [OPTION]... FILE...\n"), program_name);
+ fprintf (f, _("Generate a sorted index for each TeX output FILE.\n"));
+ /* Avoid trigraph nonsense. */
+ fprintf (f,
+_("Usually FILE... is specified as `foo.%c%c\' for a document `foo.texi'.\n"),
+ '?', '?'); /* avoid trigraph in cat-id-tbl.c */
+ fprintf (f, _("\nOptions:\n"));
+
+ for (i = 0; texindex_options[i].long_name; i++)
+ {
+ putc (' ', f);
+
+ if (texindex_options[i].short_name)
+ fprintf (f, "%s, ", texindex_options[i].short_name);
+
+ fprintf (f, "%s %s",
+ texindex_options[i].long_name,
+ texindex_options[i].arg_name
+ ? texindex_options[i].arg_name : "");
+
+ fprintf (f, "\t%s\n", _(texindex_options[i].doc_string));
+ }
+ fputs (_("\n\
+Email bug reports to bug-texinfo@gnu.org,\n\
+general questions and discussion to help-texinfo@gnu.org.\n\
+Texinfo home page: http://www.gnu.org/software/texinfo/"), f);
+ fputs ("\n", f);
+
+ xexit (result_value);
+}
+
+/* Decode the command line arguments to set the parameter variables
+ and set up the vector of keyfields and the vector of input files. */
+
+void
+decode_command (int argc, char **argv)
+{
+ int arg_index = 1;
+ char **ip;
+ char **op;
+
+ /* Store default values into parameter variables. */
+
+ tempdir = getenv ("TMPDIR");
+ if (tempdir == NULL)
+ tempdir = getenv ("TEMP");
+ if (tempdir == NULL)
+ tempdir = getenv ("TMP");
+ if (tempdir == NULL)
+ tempdir = DEFAULT_TMPDIR;
+ else
+ tempdir = concat (tempdir, "/");
+
+ keep_tempfiles = 0;
+
+ /* Allocate ARGC input files, which must be enough. */
+
+ infiles = (char **) xmalloc (argc * sizeof (char *));
+ outfiles = (char **) xmalloc (argc * sizeof (char *));
+ ip = infiles;
+ op = outfiles;
+
+ while (arg_index < argc)
+ {
+ char *arg = argv[arg_index++];
+
+ if (*arg == '-')
+ {
+ if (strcmp (arg, "--version") == 0)
+ {
+ printf ("texindex (GNU %s) %s\n", PACKAGE, VERSION);
+ puts ("");
+ puts ("Copyright (C) 2004 Free Software Foundation, Inc.");
+ printf (_("There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License.\n\
+For more information about these matters, see the files named COPYING.\n"));
+ xexit (0);
+ }
+ else if ((strcmp (arg, "--keep") == 0) ||
+ (strcmp (arg, "-k") == 0))
+ {
+ keep_tempfiles = 1;
+ }
+ else if ((strcmp (arg, "--help") == 0) ||
+ (strcmp (arg, "-h") == 0))
+ {
+ usage (0);
+ }
+ else if ((strcmp (arg, "--output") == 0) ||
+ (strcmp (arg, "-o") == 0))
+ {
+ if (argv[arg_index] != (char *)NULL)
+ {
+ arg_index++;
+ if (op > outfiles)
+ *(op - 1) = argv[arg_index];
+ }
+ else
+ usage (1);
+ }
+ else
+ usage (1);
+ }
+ else
+ {
+ *ip++ = arg;
+ *op++ = (char *)NULL;
+ }
+ }
+
+ /* Record number of keyfields and terminate list of filenames. */
+ num_infiles = ip - infiles;
+ *ip = (char *)NULL;
+ if (num_infiles == 0)
+ usage (1);
+}
+
+/* Return a name for temporary file COUNT. */
+
+static char *
+maketempname (int count)
+{
+ static char *tempbase = NULL;
+ char tempsuffix[10];
+
+ if (!tempbase)
+ {
+ int fd;
+ tempbase = concat (tempdir, "txidxXXXXXX");
+
+ fd = mkstemp (tempbase);
+ if (fd == -1)
+ pfatal_with_name (tempbase);
+ }
+
+ sprintf (tempsuffix, ".%d", count);
+ return concat (tempbase, tempsuffix);
+}
+
+
+/* Delete all temporary files up to TO_COUNT. */
+
+void
+flush_tempfiles (int to_count)
+{
+ if (keep_tempfiles)
+ return;
+ while (last_deleted_tempcount < to_count)
+ unlink (maketempname (++last_deleted_tempcount));
+}
+
+
+/* Compare LINE1 and LINE2 according to the specified set of keyfields. */
+
+int
+compare_full (const void *p1, const void *p2)
+{
+ char **line1 = (char **) p1;
+ char **line2 = (char **) p2;
+ int i;
+
+ /* Compare using the first keyfield;
+ if that does not distinguish the lines, try the second keyfield;
+ and so on. */
+
+ for (i = 0; i < num_keyfields; i++)
+ {
+ long length1, length2;
+ char *start1 = find_field (&keyfields[i], *line1, &length1);
+ char *start2 = find_field (&keyfields[i], *line2, &length2);
+ int tem = compare_field (&keyfields[i], start1, length1,
+ *line1 - text_base,
+ start2, length2, *line2 - text_base);
+ if (tem)
+ {
+ if (keyfields[i].reverse)
+ return -tem;
+ return tem;
+ }
+ }
+
+ return 0; /* Lines match exactly. */
+}
+
+/* Compare LINE1 and LINE2, described by structures
+ in which the first keyfield is identified in advance.
+ For positional sorting, assumes that the order of the lines in core
+ reflects their nominal order. */
+int
+compare_prepared (const void *p1, const void *p2)
+{
+ struct lineinfo *line1 = (struct lineinfo *) p1;
+ struct lineinfo *line2 = (struct lineinfo *) p2;
+ int i;
+ int tem;
+ char *text1, *text2;
+
+ /* Compare using the first keyfield, which has been found for us already. */
+ if (keyfields->positional)
+ {
+ if (line1->text - text_base > line2->text - text_base)
+ tem = 1;
+ else
+ tem = -1;
+ }
+ else if (keyfields->numeric)
+ tem = line1->key.number - line2->key.number;
+ else
+ tem = compare_field (keyfields, line1->key.text, line1->keylen, 0,
+ line2->key.text, line2->keylen, 0);
+ if (tem)
+ {
+ if (keyfields->reverse)
+ return -tem;
+ return tem;
+ }
+
+ text1 = line1->text;
+ text2 = line2->text;
+
+ /* Compare using the second keyfield;
+ if that does not distinguish the lines, try the third keyfield;
+ and so on. */
+
+ for (i = 1; i < num_keyfields; i++)
+ {
+ long length1, length2;
+ char *start1 = find_field (&keyfields[i], text1, &length1);
+ char *start2 = find_field (&keyfields[i], text2, &length2);
+ int tem = compare_field (&keyfields[i], start1, length1,
+ text1 - text_base,
+ start2, length2, text2 - text_base);
+ if (tem)
+ {
+ if (keyfields[i].reverse)
+ return -tem;
+ return tem;
+ }
+ }
+
+ return 0; /* Lines match exactly. */
+}
+
+/* Like compare_full but more general.
+ You can pass any strings, and you can say how many keyfields to use.
+ POS1 and POS2 should indicate the nominal positional ordering of
+ the two lines in the input. */
+
+int
+compare_general (char *str1, char *str2, long int pos1, long int pos2, int use_keyfields)
+{
+ int i;
+
+ /* Compare using the first keyfield;
+ if that does not distinguish the lines, try the second keyfield;
+ and so on. */
+
+ for (i = 0; i < use_keyfields; i++)
+ {
+ long length1, length2;
+ char *start1 = find_field (&keyfields[i], str1, &length1);
+ char *start2 = find_field (&keyfields[i], str2, &length2);
+ int tem = compare_field (&keyfields[i], start1, length1, pos1,
+ start2, length2, pos2);
+ if (tem)
+ {
+ if (keyfields[i].reverse)
+ return -tem;
+ return tem;
+ }
+ }
+
+ return 0; /* Lines match exactly. */
+}
+
+/* Find the start and length of a field in STR according to KEYFIELD.
+ A pointer to the starting character is returned, and the length
+ is stored into the int that LENGTHPTR points to. */
+
+char *
+find_field (struct keyfield *keyfield, char *str, long int *lengthptr)
+{
+ char *start;
+ char *end;
+ char *(*fun) ();
+
+ if (keyfield->braced)
+ fun = find_braced_pos;
+ else
+ fun = find_pos;
+
+ start = (*fun) (str, keyfield->startwords, keyfield->startchars,
+ keyfield->ignore_blanks);
+ if (keyfield->endwords < 0)
+ {
+ if (keyfield->braced)
+ end = find_braced_end (start);
+ else
+ {
+ end = start;
+ while (*end && *end != '\n')
+ end++;
+ }
+ }
+ else
+ {
+ end = (*fun) (str, keyfield->endwords, keyfield->endchars, 0);
+ if (end - str < start - str)
+ end = start;
+ }
+ *lengthptr = end - start;
+ return start;
+}
+
+/* Return a pointer to a specified place within STR,
+ skipping (from the beginning) WORDS words and then CHARS chars.
+ If IGNORE_BLANKS is nonzero, we skip all blanks
+ after finding the specified word. */
+
+char *
+find_pos (char *str, int words, int chars, int ignore_blanks)
+{
+ int i;
+ char *p = str;
+
+ for (i = 0; i < words; i++)
+ {
+ char c;
+ /* Find next bunch of nonblanks and skip them. */
+ while ((c = *p) == ' ' || c == '\t')
+ p++;
+ while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t'))
+ p++;
+ if (!*p || *p == '\n')
+ return p;
+ }
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ for (i = 0; i < chars; i++)
+ {
+ if (!*p || *p == '\n')
+ break;
+ p++;
+ }
+ return p;
+}
+
+/* Like find_pos but assumes that each field is surrounded by braces
+ and that braces within fields are balanced. */
+
+char *
+find_braced_pos (char *str, int words, int chars, int ignore_blanks)
+{
+ int i;
+ int bracelevel;
+ char *p = str;
+ char c;
+
+ for (i = 0; i < words; i++)
+ {
+ bracelevel = 1;
+ while ((c = *p++) != '{' && c != '\n' && c)
+ /* Do nothing. */ ;
+ if (c != '{')
+ return p - 1;
+ while (bracelevel)
+ {
+ c = *p++;
+ if (c == '{')
+ bracelevel++;
+ if (c == '}')
+ bracelevel--;
+ if (c == 0 || c == '\n')
+ return p - 1;
+ }
+ }
+
+ while ((c = *p++) != '{' && c != '\n' && c)
+ /* Do nothing. */ ;
+
+ if (c != '{')
+ return p - 1;
+
+ if (ignore_blanks)
+ while ((c = *p) == ' ' || c == '\t')
+ p++;
+
+ for (i = 0; i < chars; i++)
+ {
+ if (!*p || *p == '\n')
+ break;
+ p++;
+ }
+ return p;
+}
+
+/* Find the end of the balanced-brace field which starts at STR.
+ The position returned is just before the closing brace. */
+
+char *
+find_braced_end (char *str)
+{
+ int bracelevel;
+ char *p = str;
+ char c;
+
+ bracelevel = 1;
+ while (bracelevel)
+ {
+ c = *p++;
+ if (c == '{')
+ bracelevel++;
+ if (c == '}')
+ bracelevel--;
+ if (c == 0 || c == '\n')
+ return p - 1;
+ }
+ return p - 1;
+}
+
+long
+find_value (char *start, long int length)
+{
+ while (length != 0L)
+ {
+ if (isdigit (*start))
+ return atol (start);
+ length--;
+ start++;
+ }
+ return 0l;
+}
+
+/* Vector used to translate characters for comparison.
+ This is how we make all alphanumerics follow all else,
+ and ignore case in the first sorting. */
+int char_order[256];
+
+void
+init_char_order (void)
+{
+ int i;
+ for (i = 1; i < 256; i++)
+ char_order[i] = i;
+
+ for (i = '0'; i <= '9'; i++)
+ char_order[i] += 512;
+
+ for (i = 'a'; i <= 'z'; i++)
+ {
+ char_order[i] = 512 + i;
+ char_order[i + 'A' - 'a'] = 512 + i;
+ }
+}
+
+/* Compare two fields (each specified as a start pointer and a character count)
+ according to KEYFIELD.
+ The sign of the value reports the relation between the fields. */
+
+int
+compare_field (struct keyfield *keyfield, char *start1, long int length1,
+ long int pos1, char *start2, long int length2, long int pos2)
+{
+ if (keyfields->positional)
+ {
+ if (pos1 > pos2)
+ return 1;
+ else
+ return -1;
+ }
+ if (keyfield->numeric)
+ {
+ long value = find_value (start1, length1) - find_value (start2, length2);
+ if (value > 0)
+ return 1;
+ if (value < 0)
+ return -1;
+ return 0;
+ }
+ else
+ {
+ char *p1 = start1;
+ char *p2 = start2;
+ char *e1 = start1 + length1;
+ char *e2 = start2 + length2;
+
+ while (1)
+ {
+ int c1, c2;
+
+ if (p1 == e1)
+ c1 = 0;
+ else
+ c1 = *p1++;
+ if (p2 == e2)
+ c2 = 0;
+ else
+ c2 = *p2++;
+
+ if (char_order[c1] != char_order[c2])
+ return char_order[c1] - char_order[c2];
+ if (!c1)
+ break;
+ }
+
+ /* Strings are equal except possibly for case. */
+ p1 = start1;
+ p2 = start2;
+ while (1)
+ {
+ int c1, c2;
+
+ if (p1 == e1)
+ c1 = 0;
+ else
+ c1 = *p1++;
+ if (p2 == e2)
+ c2 = 0;
+ else
+ c2 = *p2++;
+
+ if (c1 != c2)
+ /* Reverse sign here so upper case comes out last. */
+ return c2 - c1;
+ if (!c1)
+ break;
+ }
+
+ return 0;
+ }
+}
+
+/* A `struct linebuffer' is a structure which holds a line of text.
+ `readline' reads a line from a stream into a linebuffer
+ and works regardless of the length of the line. */
+
+struct linebuffer
+{
+ long size;
+ char *buffer;
+};
+
+/* Initialize LINEBUFFER for use. */
+
+void
+initbuffer (struct linebuffer *linebuffer)
+{
+ linebuffer->size = 200;
+ linebuffer->buffer = (char *) xmalloc (200);
+}
+
+/* Read a line of text from STREAM into LINEBUFFER.
+ Return the length of the line. */
+
+long
+readline (struct linebuffer *linebuffer, FILE *stream)
+{
+ char *buffer = linebuffer->buffer;
+ char *p = linebuffer->buffer;
+ char *end = p + linebuffer->size;
+
+ while (1)
+ {
+ int c = getc (stream);
+ if (p == end)
+ {
+ buffer = (char *) xrealloc (buffer, linebuffer->size *= 2);
+ p += buffer - linebuffer->buffer;
+ end += buffer - linebuffer->buffer;
+ linebuffer->buffer = buffer;
+ }
+ if (c < 0 || c == '\n')
+ {
+ *p = 0;
+ break;
+ }
+ *p++ = c;
+ }
+
+ return p - buffer;
+}
+
+/* Sort an input file too big to sort in core. */
+
+void
+sort_offline (char *infile, off_t total, char *outfile)
+{
+ /* More than enough. */
+ int ntemps = 2 * (total + MAX_IN_CORE_SORT - 1) / MAX_IN_CORE_SORT;
+ char **tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+ FILE *istream = fopen (infile, "r");
+ int i;
+ struct linebuffer lb;
+ long linelength;
+ int failure = 0;
+
+ initbuffer (&lb);
+
+ /* Read in one line of input data. */
+
+ linelength = readline (&lb, istream);
+
+ if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+ {
+ error (_("%s: not a texinfo index file"), infile);
+ return;
+ }
+
+ /* Split up the input into `ntemps' temporary files, or maybe fewer,
+ and put the new files' names into `tempfiles' */
+
+ for (i = 0; i < ntemps; i++)
+ {
+ char *outname = maketempname (++tempcount);
+ FILE *ostream = fopen (outname, "w");
+ long tempsize = 0;
+
+ if (!ostream)
+ pfatal_with_name (outname);
+ tempfiles[i] = outname;
+
+ /* Copy lines into this temp file as long as it does not make file
+ "too big" or until there are no more lines. */
+
+ while (tempsize + linelength + 1 <= MAX_IN_CORE_SORT)
+ {
+ tempsize += linelength + 1;
+ fputs (lb.buffer, ostream);
+ putc ('\n', ostream);
+
+ /* Read another line of input data. */
+
+ linelength = readline (&lb, istream);
+ if (!linelength && feof (istream))
+ break;
+
+ if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+ {
+ error (_("%s: not a texinfo index file"), infile);
+ failure = 1;
+ goto fail;
+ }
+ }
+ fclose (ostream);
+ if (feof (istream))
+ break;
+ }
+
+ free (lb.buffer);
+
+fail:
+ /* Record number of temp files we actually needed. */
+
+ ntemps = i;
+
+ /* Sort each tempfile into another tempfile.
+ Delete the first set of tempfiles and put the names of the second
+ into `tempfiles'. */
+
+ for (i = 0; i < ntemps; i++)
+ {
+ char *newtemp = maketempname (++tempcount);
+ sort_in_core (tempfiles[i], MAX_IN_CORE_SORT, newtemp);
+ if (!keep_tempfiles)
+ unlink (tempfiles[i]);
+ tempfiles[i] = newtemp;
+ }
+
+ if (failure)
+ return;
+
+ /* Merge the tempfiles together and indexify. */
+
+ merge_files (tempfiles, ntemps, outfile);
+}
+
+/* Sort INFILE, whose size is TOTAL,
+ assuming that is small enough to be done in-core,
+ then indexify it and send the output to OUTFILE (or to stdout). */
+
+void
+sort_in_core (char *infile, int total, char *outfile)
+{
+ char **nextline;
+ char *data = (char *) xmalloc (total + 1);
+ char *file_data;
+ long file_size;
+ int i;
+ FILE *ostream = stdout;
+ struct lineinfo *lineinfo;
+
+ /* Read the contents of the file into the moby array `data'. */
+
+ int desc = open (infile, O_RDONLY, 0);
+
+ if (desc < 0)
+ fatal (_("failure reopening %s"), infile);
+ for (file_size = 0;;)
+ {
+ i = read (desc, data + file_size, total - file_size);
+ if (i <= 0)
+ break;
+ file_size += i;
+ }
+ file_data = data;
+ data[file_size] = 0;
+
+ close (desc);
+
+ if (file_size > 0 && data[0] != '\\' && data[0] != '@')
+ {
+ error (_("%s: not a texinfo index file"), infile);
+ return;
+ }
+
+ init_char_order ();
+
+ /* Sort routines want to know this address. */
+
+ text_base = data;
+
+ /* Create the array of pointers to lines, with a default size
+ frequently enough. */
+
+ nlines = total / 50;
+ if (!nlines)
+ nlines = 2;
+ linearray = (char **) xmalloc (nlines * sizeof (char *));
+
+ /* `nextline' points to the next free slot in this array.
+ `nlines' is the allocated size. */
+
+ nextline = linearray;
+
+ /* Parse the input file's data, and make entries for the lines. */
+
+ nextline = parsefile (infile, nextline, file_data, file_size);
+ if (nextline == 0)
+ {
+ error (_("%s: not a texinfo index file"), infile);
+ return;
+ }
+
+ /* Sort the lines. */
+
+ /* If we have enough space, find the first keyfield of each line in advance.
+ Make a `struct lineinfo' for each line, which records the keyfield
+ as well as the line, and sort them. */
+
+ lineinfo = malloc ((nextline - linearray) * sizeof (struct lineinfo));
+
+ if (lineinfo)
+ {
+ struct lineinfo *lp;
+ char **p;
+
+ for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+ {
+ lp->text = *p;
+ lp->key.text = find_field (keyfields, *p, &lp->keylen);
+ if (keyfields->numeric)
+ lp->key.number = find_value (lp->key.text, lp->keylen);
+ }
+
+ qsort (lineinfo, nextline - linearray, sizeof (struct lineinfo),
+ compare_prepared);
+
+ for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+ *p = lp->text;
+
+ free (lineinfo);
+ }
+ else
+ qsort (linearray, nextline - linearray, sizeof (char *), compare_full);
+
+ /* Open the output file. */
+
+ if (outfile)
+ {
+ ostream = fopen (outfile, "w");
+ if (!ostream)
+ pfatal_with_name (outfile);
+ }
+
+ writelines (linearray, nextline - linearray, ostream);
+ if (outfile)
+ fclose (ostream);
+
+ free (linearray);
+ free (data);
+}
+
+/* Parse an input string in core into lines.
+ DATA is the input string, and SIZE is its length.
+ Data goes in LINEARRAY starting at NEXTLINE.
+ The value returned is the first entry in LINEARRAY still unused.
+ Value 0 means input file contents are invalid. */
+
+char **
+parsefile (char *filename, char **nextline, char *data, long int size)
+{
+ char *p, *end;
+ char **line = nextline;
+
+ p = data;
+ end = p + size;
+ *end = 0;
+
+ while (p != end)
+ {
+ if (p[0] != '\\' && p[0] != '@')
+ return 0;
+
+ *line = p;
+
+ /* Find the first letter of the first field of this line. If it
+ is different from the first letter of the first field of the
+ first line, we need initial headers in the output index. */
+ while (*p && *p != '{')
+ p++;
+ if (p == end)
+ return 0;
+ p++;
+ if (first_initial)
+ {
+ if (first_initial != toupper (*p))
+ need_initials = 1;
+ }
+ else
+ first_initial = toupper (*p);
+
+ while (*p && *p != '\n')
+ p++;
+ if (p != end)
+ p++;
+
+ line++;
+ if (line == linearray + nlines)
+ {
+ char **old = linearray;
+ linearray = xrealloc (linearray, sizeof (char *) * (nlines *= 4));
+ line += linearray - old;
+ }
+ }
+
+ return line;
+}
+
+/* Indexification is a filter applied to the sorted lines
+ as they are being written to the output file.
+ Multiple entries for the same name, with different page numbers,
+ get combined into a single entry with multiple page numbers.
+ The first braced field, which is used for sorting, is discarded.
+ However, its first character is examined, folded to lower case,
+ and if it is different from that in the previous line fed to us
+ a \initial line is written with one argument, the new initial.
+
+ If an entry has four braced fields, then the second and third
+ constitute primary and secondary names.
+ In this case, each change of primary name
+ generates a \primary line which contains only the primary name,
+ and in between these are \secondary lines which contain
+ just a secondary name and page numbers. */
+
+/* The last primary name we wrote a \primary entry for.
+ If only one level of indexing is being done, this is the last name seen. */
+char *lastprimary;
+/* Length of storage allocated for lastprimary. */
+int lastprimarylength;
+
+/* Similar, for the secondary name. */
+char *lastsecondary;
+int lastsecondarylength;
+
+/* Zero if we are not in the middle of writing an entry.
+ One if we have written the beginning of an entry but have not
+ yet written any page numbers into it.
+ Greater than one if we have written the beginning of an entry
+ plus at least one page number. */
+int pending;
+
+/* The initial (for sorting purposes) of the last primary entry written.
+ When this changes, a \initial {c} line is written */
+
+char *lastinitial;
+
+int lastinitiallength;
+
+/* When we need a string of length 1 for the value of lastinitial,
+ store it here. */
+
+char lastinitial1[2];
+
+/* Initialize static storage for writing an index. */
+
+void
+init_index (void)
+{
+ pending = 0;
+ lastinitial = lastinitial1;
+ lastinitial1[0] = 0;
+ lastinitial1[1] = 0;
+ lastinitiallength = 0;
+ lastprimarylength = 100;
+ lastprimary = (char *) xmalloc (lastprimarylength + 1);
+ memset (lastprimary, '\0', lastprimarylength + 1);
+ lastsecondarylength = 100;
+ lastsecondary = (char *) xmalloc (lastsecondarylength + 1);
+ memset (lastsecondary, '\0', lastsecondarylength + 1);
+}
+
+/* Indexify. Merge entries for the same name,
+ insert headers for each initial character, etc. */
+
+void
+indexify (char *line, FILE *ostream)
+{
+ char *primary, *secondary, *pagenumber;
+ int primarylength, secondarylength = 0, pagelength;
+ int nosecondary;
+ int initiallength;
+ char *initial;
+ char initial1[2];
+ register char *p;
+
+ /* First, analyze the parts of the entry fed to us this time. */
+
+ p = find_braced_pos (line, 0, 0, 0);
+ if (*p == '{')
+ {
+ initial = p;
+ /* Get length of inner pair of braces starting at `p',
+ including that inner pair of braces. */
+ initiallength = find_braced_end (p + 1) + 1 - p;
+ }
+ else
+ {
+ initial = initial1;
+ initial1[0] = toupper (*p);
+ initial1[1] = 0;
+ initiallength = 1;
+ }
+
+ pagenumber = find_braced_pos (line, 1, 0, 0);
+ pagelength = find_braced_end (pagenumber) - pagenumber;
+ if (pagelength == 0)
+ fatal (_("No page number in %s"), line);
+
+ primary = find_braced_pos (line, 2, 0, 0);
+ primarylength = find_braced_end (primary) - primary;
+
+ secondary = find_braced_pos (line, 3, 0, 0);
+ nosecondary = !*secondary;
+ if (!nosecondary)
+ secondarylength = find_braced_end (secondary) - secondary;
+
+ /* If the primary is different from before, make a new primary entry. */
+ if (strncmp (primary, lastprimary, primarylength))
+ {
+ /* Close off current secondary entry first, if one is open. */
+ if (pending)
+ {
+ fputs ("}\n", ostream);
+ pending = 0;
+ }
+
+ /* If this primary has a different initial, include an entry for
+ the initial. */
+ if (need_initials &&
+ (initiallength != lastinitiallength ||
+ strncmp (initial, lastinitial, initiallength)))
+ {
+ fprintf (ostream, "\\initial {");
+ fwrite (initial, 1, initiallength, ostream);
+ fputs ("}\n", ostream);
+ if (initial == initial1)
+ {
+ lastinitial = lastinitial1;
+ *lastinitial1 = *initial1;
+ }
+ else
+ {
+ lastinitial = initial;
+ }
+ lastinitiallength = initiallength;
+ }
+
+ /* Make the entry for the primary. */
+ if (nosecondary)
+ fputs ("\\entry {", ostream);
+ else
+ fputs ("\\primary {", ostream);
+ fwrite (primary, primarylength, 1, ostream);
+ if (nosecondary)
+ {
+ fputs ("}{", ostream);
+ pending = 1;
+ }
+ else
+ fputs ("}\n", ostream);
+
+ /* Record name of most recent primary. */
+ if (lastprimarylength < primarylength)
+ {
+ lastprimarylength = primarylength + 100;
+ lastprimary = (char *) xrealloc (lastprimary,
+ 1 + lastprimarylength);
+ }
+ strncpy (lastprimary, primary, primarylength);
+ lastprimary[primarylength] = 0;
+
+ /* There is no current secondary within this primary, now. */
+ lastsecondary[0] = 0;
+ }
+
+ /* Should not have an entry with no subtopic following one with a
+ subtopic. */
+
+ if (nosecondary && *lastsecondary)
+ error (_("entry %s follows an entry with a secondary name"), line);
+
+ /* Start a new secondary entry if necessary. */
+ if (!nosecondary && strncmp (secondary, lastsecondary, secondarylength))
+ {
+ if (pending)
+ {
+ fputs ("}\n", ostream);
+ pending = 0;
+ }
+
+ /* Write the entry for the secondary. */
+ fputs ("\\secondary {", ostream);
+ fwrite (secondary, secondarylength, 1, ostream);
+ fputs ("}{", ostream);
+ pending = 1;
+
+ /* Record name of most recent secondary. */
+ if (lastsecondarylength < secondarylength)
+ {
+ lastsecondarylength = secondarylength + 100;
+ lastsecondary = (char *) xrealloc (lastsecondary,
+ 1 + lastsecondarylength);
+ }
+ strncpy (lastsecondary, secondary, secondarylength);
+ lastsecondary[secondarylength] = 0;
+ }
+
+ /* Here to add one more page number to the current entry. */
+ if (pending++ != 1)
+ fputs (", ", ostream); /* Punctuate first, if this is not the first. */
+ fwrite (pagenumber, pagelength, 1, ostream);
+}
+
+/* Close out any unfinished output entry. */
+
+void
+finish_index (FILE *ostream)
+{
+ if (pending)
+ fputs ("}\n", ostream);
+ free (lastprimary);
+ free (lastsecondary);
+}
+
+/* Copy the lines in the sorted order.
+ Each line is copied out of the input file it was found in. */
+
+void
+writelines (char **linearray, int nlines, FILE *ostream)
+{
+ char **stop_line = linearray + nlines;
+ char **next_line;
+
+ init_index ();
+
+ /* Output the text of the lines, and free the buffer space. */
+
+ for (next_line = linearray; next_line != stop_line; next_line++)
+ {
+ /* If -u was specified, output the line only if distinct from
+ previous one. */
+ if (next_line == linearray
+ /* Compare previous line with this one, using only the
+ explicitly specd keyfields. */
+ || compare_general (*(next_line - 1), *next_line, 0L, 0L,
+ num_keyfields - 1))
+ {
+ char *p = *next_line;
+ char c;
+
+ while ((c = *p++) && c != '\n')
+ /* Do nothing. */ ;
+ *(p - 1) = 0;
+ indexify (*next_line, ostream);
+ }
+ }
+
+ finish_index (ostream);
+}
+
+/* Assume (and optionally verify) that each input file is sorted;
+ merge them and output the result.
+ Returns nonzero if any input file fails to be sorted.
+
+ This is the high-level interface that can handle an unlimited
+ number of files. */
+
+#define MAX_DIRECT_MERGE 10
+
+int
+merge_files (char **infiles, int nfiles, char *outfile)
+{
+ char **tempfiles;
+ int ntemps;
+ int i;
+ int value = 0;
+ int start_tempcount = tempcount;
+
+ if (nfiles <= MAX_DIRECT_MERGE)
+ return merge_direct (infiles, nfiles, outfile);
+
+ /* Merge groups of MAX_DIRECT_MERGE input files at a time,
+ making a temporary file to hold each group's result. */
+
+ ntemps = (nfiles + MAX_DIRECT_MERGE - 1) / MAX_DIRECT_MERGE;
+ tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+ for (i = 0; i < ntemps; i++)
+ {
+ int nf = MAX_DIRECT_MERGE;
+ if (i + 1 == ntemps)
+ nf = nfiles - i * MAX_DIRECT_MERGE;
+ tempfiles[i] = maketempname (++tempcount);
+ value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
+ }
+
+ /* All temporary files that existed before are no longer needed
+ since their contents have been merged into our new tempfiles.
+ So delete them. */
+ flush_tempfiles (start_tempcount);
+
+ /* Now merge the temporary files we created. */
+
+ merge_files (tempfiles, ntemps, outfile);
+
+ free (tempfiles);
+
+ return value;
+}
+
+/* Assume (and optionally verify) that each input file is sorted;
+ merge them and output the result.
+ Returns nonzero if any input file fails to be sorted.
+
+ This version of merging will not work if the number of
+ input files gets too high. Higher level functions
+ use it only with a bounded number of input files. */
+
+int
+merge_direct (char **infiles, int nfiles, char *outfile)
+{
+ struct linebuffer *lb1, *lb2;
+ struct linebuffer **thisline, **prevline;
+ FILE **streams;
+ int i;
+ int nleft;
+ int lossage = 0;
+ int *file_lossage;
+ struct linebuffer *prev_out = 0;
+ FILE *ostream = stdout;
+
+ if (outfile)
+ {
+ ostream = fopen (outfile, "w");
+ }
+ if (!ostream)
+ pfatal_with_name (outfile);
+
+ init_index ();
+
+ if (nfiles == 0)
+ {
+ if (outfile)
+ fclose (ostream);
+ return 0;
+ }
+
+ /* For each file, make two line buffers. Also, for each file, there
+ is an element of `thisline' which points at any time to one of the
+ file's two buffers, and an element of `prevline' which points to
+ the other buffer. `thisline' is supposed to point to the next
+ available line from the file, while `prevline' holds the last file
+ line used, which is remembered so that we can verify that the file
+ is properly sorted. */
+
+ /* lb1 and lb2 contain one buffer each per file. */
+ lb1 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+ lb2 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+
+ /* thisline[i] points to the linebuffer holding the next available
+ line in file i, or is zero if there are no lines left in that file. */
+ thisline = (struct linebuffer **)
+ xmalloc (nfiles * sizeof (struct linebuffer *));
+ /* prevline[i] points to the linebuffer holding the last used line
+ from file i. This is just for verifying that file i is properly
+ sorted. */
+ prevline = (struct linebuffer **)
+ xmalloc (nfiles * sizeof (struct linebuffer *));
+ /* streams[i] holds the input stream for file i. */
+ streams = (FILE **) xmalloc (nfiles * sizeof (FILE *));
+ /* file_lossage[i] is nonzero if we already know file i is not
+ properly sorted. */
+ file_lossage = (int *) xmalloc (nfiles * sizeof (int));
+
+ /* Allocate and initialize all that storage. */
+
+ for (i = 0; i < nfiles; i++)
+ {
+ initbuffer (&lb1[i]);
+ initbuffer (&lb2[i]);
+ thisline[i] = &lb1[i];
+ prevline[i] = &lb2[i];
+ file_lossage[i] = 0;
+ streams[i] = fopen (infiles[i], "r");
+ if (!streams[i])
+ pfatal_with_name (infiles[i]);
+
+ readline (thisline[i], streams[i]);
+ }
+
+ /* Keep count of number of files not at eof. */
+ nleft = nfiles;
+
+ while (nleft)
+ {
+ struct linebuffer *best = 0;
+ struct linebuffer *exch;
+ int bestfile = -1;
+ int i;
+
+ /* Look at the next avail line of each file; choose the least one. */
+
+ for (i = 0; i < nfiles; i++)
+ {
+ if (thisline[i] &&
+ (!best ||
+ 0 < compare_general (best->buffer, thisline[i]->buffer,
+ (long) bestfile, (long) i, num_keyfields)))
+ {
+ best = thisline[i];
+ bestfile = i;
+ }
+ }
+
+ /* Output that line, unless it matches the previous one and we
+ don't want duplicates. */
+
+ if (!(prev_out &&
+ !compare_general (prev_out->buffer,
+ best->buffer, 0L, 1L, num_keyfields - 1)))
+ indexify (best->buffer, ostream);
+ prev_out = best;
+
+ /* Now make the line the previous of its file, and fetch a new
+ line from that file. */
+
+ exch = prevline[bestfile];
+ prevline[bestfile] = thisline[bestfile];
+ thisline[bestfile] = exch;
+
+ while (1)
+ {
+ /* If the file has no more, mark it empty. */
+
+ if (feof (streams[bestfile]))
+ {
+ thisline[bestfile] = 0;
+ /* Update the number of files still not empty. */
+ nleft--;
+ break;
+ }
+ readline (thisline[bestfile], streams[bestfile]);
+ if (thisline[bestfile]->buffer[0] || !feof (streams[bestfile]))
+ break;
+ }
+ }
+
+ finish_index (ostream);
+
+ /* Free all storage and close all input streams. */
+
+ for (i = 0; i < nfiles; i++)
+ {
+ fclose (streams[i]);
+ free (lb1[i].buffer);
+ free (lb2[i].buffer);
+ }
+ free (file_lossage);
+ free (lb1);
+ free (lb2);
+ free (thisline);
+ free (prevline);
+ free (streams);
+
+ if (outfile)
+ fclose (ostream);
+
+ return lossage;
+}
+
+/* Print error message and exit. */
+
+void
+fatal (const char *format, const char *arg)
+{
+ error (format, arg);
+ xexit (1);
+}
+
+/* Print error message. FORMAT is printf control string, ARG is arg for it. */
+void
+error (const char *format, const char *arg)
+{
+ printf ("%s: ", program_name);
+ printf (format, arg);
+ if (format[strlen (format) -1] != '\n')
+ printf ("\n");
+}
+
+void
+perror_with_name (const char *name)
+{
+ fprintf (stderr, "%s: ", program_name);
+ perror (name);
+}
+
+void
+pfatal_with_name (const char *name)
+{
+ perror_with_name (name);
+ xexit (1);
+}
+
+
+/* Return a newly-allocated string concatenating S1 and S2. */
+
+char *
+concat (char *s1, char *s2)
+{
+ int len1 = strlen (s1), len2 = strlen (s2);
+ char *result = (char *) xmalloc (len1 + len2 + 1);
+
+ strcpy (result, s1);
+ strcpy (result + len1, s2);
+ *(result + len1 + len2) = 0;
+
+ return result;
+}
diff --git a/Build/source/utils/texinfo/util/texindex.rc b/Build/source/utils/texinfo/util/texindex.rc
new file mode 100644
index 00000000000..0cee04d15bf
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texindex.rc
@@ -0,0 +1,36 @@
+/* texindex.rc: texindex resources -*- C++ -*-
+
+ Copyright (C) 1996-2003 Fabrice Popineau <fabrice.popineau@supelec.fr>
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ This file is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this file; if not, write to the Free Software
+ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#include <texlive-version.h>
+
+#define VER_FILEVERSION TEXLIVE_MAJOR_VERSION,TEXLIVE_MINOR_VERSION,TEXLIVE_BETA_NUMBER,TEXLIVE_ALPHA_NUMBER
+#define VER_FILEVERSION_STR TEXLIVE_PRODUCTVERSION_STR " texindex 4.3a"
+
+#define VER_INTERNALNAME_STR "texindex"
+#define VER_ORIGINALFILENAME_STR "texindex.exe"
+
+#define VER_LEGALCOPYRIGHT_STR "Copyright (C) 1987, 91-92, 1996-2002 Free Software Foundation, Inc."
+
+#define VER_FILEDESCRIPTION_STR "TeX index generator"
+
+#define VER_COMPANYNAME_STR "Free Software Foundation, Inc."
+
+#include "texlive.version"
+
+/* texlive.rc ends here */
diff --git a/Build/source/utils/texinfo/util/texinfo-cat.in b/Build/source/utils/texinfo/util/texinfo-cat.in
new file mode 100644
index 00000000000..f0f0674ec8b
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texinfo-cat.in
@@ -0,0 +1,3 @@
+OVERRIDE YES
+
+PUBLIC "-//GNU//DTD TexinfoML V__VERSION__//EN" "texinfo.dtd"
diff --git a/Build/source/utils/texinfo/util/texinfo.dtd b/Build/source/utils/texinfo/util/texinfo.dtd
new file mode 100644
index 00000000000..617992a59f6
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texinfo.dtd
@@ -0,0 +1,484 @@
+<!-- $Id: texinfo.dtd,v 1.4 2004/12/19 15:08:55 karl Exp $
+ Document Type Definition for Texinfo.
+
+ Author: Philippe Martin (feloy@free.fr)
+ Contributors:
+ Karl Eichwalder (keichwa@gmx.net)
+ Alper Ersoy (dirt@gtk.org)
+
+ Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved.
+
+-->
+
+<!-- ENTITIES -->
+
+<!-- Meta-information -->
+<!ENTITY % metainformation "setfilename | settitle | dircategory
+ | documentdescription">
+<!ENTITY % variables "setvalue | clearvalue">
+
+<!-- Document language -->
+<!ENTITY % lang "documentlanguage">
+
+<!-- Language codes -->
+<!ENTITY % languagecodes "aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br|ca|co|cs|cy|da|de|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|ha|he|hi|hr|hu|hy|ia|id|ie|ik|is|it|iu|ja|jw|ka|kk|kl|km|kn|ko|ks|ku|ky|la|ln|lo|lt|lv|mg|mi|mk|ml|mn|mo|mr|ms|mt|my|na|ne|nl|no|oc|om|or|pa|pl|ps|pt|qu|rm|rn|ro|ru|rw|sa|sd|sg|sh|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ug|uk|ur|uz|vi|vo|wo|xh|yi|yo|za|zh|zu">
+
+<!-- ToC -->
+<!ENTITY % toc "contents | shortcontents">
+
+<!-- Title page -->
+<!ENTITY % titlepage_cmds "author | booktitle | booksubtitle">
+
+<!-- block -->
+<!-- ***** -->
+<!ENTITY % block "menu | para | quotation | example | smallexample | lisp
+ | smalllisp | cartouche | copying
+ | format | smallformat | display
+ | smalldisplay | itemize | enumerate | sp | center | group
+ | table | multitable | definition">
+
+<!-- API definitions -->
+<!-- *************** -->
+<!ENTITY % definition.cmds "defcategory | deffunction | defvariable | defparam
+ | defdelimiter | deftype | defparamtype | defdatatype
+ | defclass | defclassvar | defoperation">
+
+<!-- Headings -->
+<!-- ******** -->
+<!ENTITY % headings "majorheading | chapheading | heading | subheading
+ | subsubheading">
+
+
+<!-- Sectioning -->
+<!-- ********** -->
+<!ENTITY % section.level1 "top | chapter | unnumbered | appendix">
+
+<!ENTITY % section.level2 "section | unnumberedsec | appendixsec">
+
+<!ENTITY % section.level3 "subsection | unnumberedsubsec | appendixsubsec">
+
+<!ENTITY % section.level4 "subsubsection | unnumberedsubsubsec
+ | appendixsubsubsec">
+
+<!ENTITY % section.all "%section.level1; | %section.level2; | %section.level3;
+ | %section.level4;">
+
+
+<!ENTITY % section.level1.content "(%block;
+ | %section.level2;
+ | %section.level3;
+ | %section.level4;
+ | verbatim | titlepage | %toc;
+ | %lang; | %variables;
+ | %headings;
+ | printindex)*">
+
+<!ENTITY % section.level2.content "(%block;
+ | %section.level3;
+ | %section.level4;
+ | verbatim | titlepage | %toc;
+ | %lang; | %variables;
+ | %headings;)*">
+
+<!ENTITY % section.level3.content "(%block;
+ | %section.level4;
+ | verbatim | titlepage | %toc;
+ | %lang; | %variables;
+ | %headings;)*">
+
+<!ENTITY % section.level4.content "(%block;
+ | verbatim | titlepage | %toc;
+ | %lang; | %variables;
+ | %headings;)*">
+
+
+<!-- Inline -->
+<!-- ****** -->
+<!ENTITY % Inline.emphasize "strong | emph">
+<!ENTITY % Inline.fonts "b | i | r | sansserif | slanted | titlefont | tt">
+<!ENTITY % Inline.footnote "footnote">
+<!ENTITY % Inline.markup "code | command | env | file | option | samp
+ | dfn | cite | key | kbd | var | acronym | url">
+<!ENTITY % Inline.math "math">
+<!ENTITY % Inline.reference "xref | inforef | indexterm | email | uref">
+<!ENTITY % Inline.smallcaps "sc">
+
+<!ENTITY % Inline.phrase
+ "%Inline.emphasize; | %Inline.smallcaps; | %Inline.fonts;
+ | %Inline.markup; | %Inline.math; | %Inline.reference;
+ | %Inline.footnote; ">
+
+
+<!-- ************ -->
+<!-- * ELEMENTS * -->
+<!-- ************ -->
+
+<!-- TOP Level Element -->
+<!-- ***************** -->
+<!ELEMENT texinfo ((%metainformation; | titlepage | node | %block; | %toc;
+ | %variables; | %lang;)* )>
+<!ATTLIST texinfo xml:lang (%languagecodes;) 'en'>
+
+<!-- meta-information -->
+<!ELEMENT setfilename (#PCDATA)>
+<!ELEMENT settitle (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT dircategory (#PCDATA)>
+
+<!ELEMENT setvalue (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT clearvalue EMPTY>
+<!ATTLIST setvalue
+ name CDATA #REQUIRED>
+<!ATTLIST clearvalue
+ name CDATA #REQUIRED>
+
+<!-- ToC -->
+<!ELEMENT contents EMPTY>
+<!ELEMENT shortcontents EMPTY>
+
+<!-- Document language -->
+<!ELEMENT documentlanguage EMPTY>
+<!ATTLIST documentlanguage xml:lang (%languagecodes;) 'en'>
+
+<!-- Titlepage -->
+<!ELEMENT titlepage (%titlepage_cmds; | %block;)*>
+<!ELEMENT author (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT booktitle (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT booksubtitle (#PCDATA | %Inline.phrase;)*>
+
+<!-- NODES -->
+<!-- ***** -->
+<!ELEMENT node (nodename, nodenext?, nodeprev?, nodeup?,
+ (%section.all; | %block; | %toc; | %lang; | image)*) >
+
+<!ELEMENT nodename (#PCDATA)>
+<!ELEMENT nodenext (#PCDATA)>
+<!ELEMENT nodeprev (#PCDATA)>
+<!ELEMENT nodeup (#PCDATA)>
+
+<!-- SECTIONING -->
+<!-- ********** -->
+
+<!ELEMENT top (title?, (%section.level1.content;))>
+
+<!ELEMENT chapter (title?, (%section.level1.content;))>
+<!ELEMENT section (title?, (%section.level2.content;))>
+<!ELEMENT subsection (title?, (%section.level3.content;))>
+<!ELEMENT subsubsection (title?, (%section.level4.content;))>
+
+<!ELEMENT unnumbered (title?, (%section.level1.content;))>
+<!ELEMENT unnumberedsec (title?, (%section.level2.content;))>
+<!ELEMENT unnumberedsubsec (title?, (%section.level3.content;))>
+<!ELEMENT unnumberedsubsubsec (title?, (%section.level4.content;))>
+
+<!ELEMENT appendix (title?, (%section.level1.content;))>
+<!ELEMENT appendixsec (title?, (%section.level2.content;))>
+<!ELEMENT appendixsubsec (title?, (%section.level3.content;))>
+<!ELEMENT appendixsubsubsec (title?, (%section.level4.content;))>
+
+<!-- Headings and titles -->
+<!ELEMENT majorheading (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT chapheading (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT heading (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT subheading (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT subsubheading (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT title (#PCDATA | %Inline.phrase; | footnote)*>
+
+<!-- Negative Indentation in Blocks -->
+<!ELEMENT exdent (#PCDATA | %Inline.phrase;)*>
+
+<!-- BLOCK Elements -->
+<!-- ************** -->
+
+<!ELEMENT quotation (%block; | %Inline.phrase; | exdent)*>
+<!ELEMENT documentdescription (#PCDATA | %block; | %Inline.phrase;)*>
+<!ELEMENT example (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT smallexample (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT lisp (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT smalllisp (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT cartouche (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT copying (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT format (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT smallformat (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT display (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT smalldisplay (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT center (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+<!ELEMENT group (#PCDATA | %block; | %Inline.phrase; | exdent)*>
+
+<!ELEMENT image (alttext)>
+<!ELEMENT alttext (#PCDATA)>
+<!ATTLIST image
+ name CDATA #REQUIRED
+ extension CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED>
+
+<!-- Whitespace in these elements are always preserved -->
+<!ATTLIST example xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST smallexample xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST lisp xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST smalllisp xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST display xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST smalldisplay xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST format xml:space (preserve) #FIXED 'preserve'>
+<!ATTLIST smallformat xml:space (preserve) #FIXED 'preserve'>
+
+<!ELEMENT verbatim (#PCDATA)>
+<!ATTLIST verbatim xml:space (preserve) #FIXED 'preserve'>
+
+<!ELEMENT para (#PCDATA | %Inline.phrase; | footnote | %lang;)*>
+<!ATTLIST para
+ role CDATA #IMPLIED>
+
+<!ELEMENT menu (menuentry | detailmenu | para)*>
+<!ELEMENT detailmenu (menuentry | para)*>
+<!ELEMENT menuentry (menunode?, menutitle?, menucomment?)>
+<!ELEMENT menunode (#PCDATA)>
+<!ELEMENT menutitle (#PCDATA)>
+<!ELEMENT menucomment (#PCDATA | para)*>
+
+<!-- Floating displays -->
+<!ELEMENT float (floattype, floatpos, (%block;)*, caption?)>
+<!ATTLIST float
+ name CDATA #IMPLIED>
+<!ELEMENT floattype (#PCDATA)>
+<!ELEMENT floatpos (#PCDATA)>
+<!ELEMENT caption (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT listoffloats EMPTY>
+<!ATTLIST listoffloats
+ type CDATA #IMPLIED>
+
+<!-- Lists -->
+<!ELEMENT itemize (itemfunction, (item | itemize | enumerate | indexterm)*)>
+<!ELEMENT enumerate (enumarg?, (item | itemize | enumerate)*)>
+<!ATTLIST enumerate
+ first CDATA #IMPLIED>
+
+<!ELEMENT item (%block;)*>
+<!ELEMENT enumarg (#PCDATA)>
+
+<!ELEMENT itemfunction (#PCDATA | %Inline.phrase;)*>
+
+<!-- Tables -->
+<!ELEMENT table (tableitem | indexterm)+>
+<!ELEMENT tableitem ((tableterm, indexterm*)+, item?)>
+<!ELEMENT tableterm (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT multitable (columnfraction*, thead?, tbody)>
+<!ELEMENT columnfraction (#PCDATA)>
+<!ELEMENT thead (row+)>
+<!ELEMENT tbody (row+)>
+<!ELEMENT row (entry*)>
+<!ELEMENT entry (#PCDATA | %Inline.phrase;)*>
+
+<!-- API definitions -->
+<!ELEMENT definition (definitionterm | definitionitem)+>
+<!ELEMENT definitionterm (%definition.cmds; | indexterm)+>
+<!ELEMENT definitionitem (%block;)*>
+
+<!ELEMENT defcategory (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT deffunction (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defvariable (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defparam (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defdelimiter (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT deftype (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defparamtype (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defdatatype (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defclass (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defclassvar (#PCDATA | %Inline.phrase; | footnote)*>
+<!ELEMENT defoperation (#PCDATA | %Inline.phrase; | footnote)*>
+
+<!-- INLINE Elements -->
+<!-- *************** -->
+
+<!-- Emphasize -->
+<!ELEMENT strong (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT emph (#PCDATA | %Inline.phrase;)*>
+
+<!-- small caps -->
+<!ELEMENT sc (#PCDATA | %Inline.phrase;)*>
+
+<!-- fonts -->
+<!ELEMENT i (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT b (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT tt (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT r (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT notfixedwidth (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT titlefont (#PCDATA | %Inline.phrase;)*>
+
+<!-- markup -->
+<!ELEMENT code (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT command (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT env (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT file (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT option (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT samp (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT dfn (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT cite (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT key (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT kbd (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT var (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT url (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT acronym (acronymword, acronymdesc?)>
+<!ELEMENT acronymword (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT acronymdesc (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT abbrev (abbrevword, abbrevdesc?)>
+<!ELEMENT abbrevword (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT abbrevdesc (#PCDATA | %Inline.phrase;)*>
+
+<!-- math -->
+<!ELEMENT math (#PCDATA | %Inline.phrase;)*>
+
+<!-- reference -->
+<!ELEMENT anchor EMPTY>
+<!ATTLIST anchor
+ name CDATA #IMPLIED>
+
+<!ELEMENT xref (xrefnodename | xrefinfoname | xrefinfofile
+ | xrefprintedname | xrefprinteddesc)*>
+<!ELEMENT xrefnodename (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefinfoname (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefinfofile (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefprintedname (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT xrefprinteddesc (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT inforef (inforefnodename | inforefrefname | inforefinfoname)*>
+<!ELEMENT inforefnodename (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT inforefrefname (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT inforefinfoname (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT indexterm (#PCDATA | %Inline.phrase;)*>
+<!ATTLIST indexterm
+ index CDATA #IMPLIED>
+
+<!ELEMENT email (emailaddress, emailname?)>
+<!ELEMENT emailaddress (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT emailname (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT uref (urefurl, urefdesc?, urefreplacement?)>
+<!ELEMENT urefurl (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT urefdesc (#PCDATA | %Inline.phrase;)*>
+<!ELEMENT urefreplacement (#PCDATA | %Inline.phrase;)*>
+
+<!ELEMENT footnote (para)>
+
+
+<!ELEMENT neos EMPTY>
+
+<!ENTITY tex "TeX"> <!-- Should become an element. -->
+<!ENTITY latex "LaTeX"> <!-- Should become an element. -->
+<!ENTITY ellipsis "&#x2026;">
+<!ENTITY lt "&#x3c;">
+<!ENTITY gt "&#x3e;">
+<!ENTITY bullet "&#x2022;">
+<!ENTITY copyright "&#xa9;">
+<!ENTITY registered "&#xae;">
+<!ENTITY euro "&#x20ac;">
+<!ENTITY pounds "&#xa3;">
+<!ENTITY minus "&#x2212;">
+<!ENTITY linebreak "&#xa;"> <!-- Should become an element. -->
+<!ENTITY space " "> <!-- Should become an element. -->
+<!ENTITY dots "&#x2026;<neos/>">
+<!ENTITY enddots "&#x2026;">
+<!ENTITY amp "&#x26;">
+<!ENTITY ldquo "&#x201c;">
+<!ENTITY rdquo "&#x201d;">
+<!ENTITY mdash "&#x2014;">
+<!ENTITY ndash "&#x2013;">
+<!ENTITY period ".<neos/>">
+<!ENTITY eosperiod ".">
+<!ENTITY quest "?<neos/>">
+<!ENTITY eosquest "?">
+<!ENTITY excl "!<neos/>">
+<!ENTITY eosexcl "!">
+
+<!ENTITY auml "&#xe4;">
+<!ENTITY ouml "&#xf6;">
+<!ENTITY uuml "&#xfc;">
+<!ENTITY Auml "&#xc4;">
+<!ENTITY Ouml "&#xd6;">
+<!ENTITY Uuml "&#xdc;">
+<!ENTITY Euml "&#xcb;">
+<!ENTITY euml "&#xeb;">
+<!ENTITY Iuml "&#xcf;">
+<!ENTITY iuml "&#xef;">
+<!ENTITY yuml "&#xff;">
+<!ENTITY uml "&#xa8;">
+
+<!ENTITY Aacute "&#xc1;">
+<!ENTITY Eacute "&#xc9;">
+<!ENTITY Iacute "&#xcd;">
+<!ENTITY Oacute "&#xd3;">
+<!ENTITY Uacute "&#xda;">
+<!ENTITY Yacute "&#xdd;">
+<!ENTITY aacute "&#xe1;">
+<!ENTITY eacute "&#xe9;">
+<!ENTITY iacute "&#xed;">
+<!ENTITY oacute "&#xf3;">
+<!ENTITY uacute "&#xfa;">
+<!ENTITY yacute "&#xfd;">
+
+<!ENTITY ccedil "&#xe7;">
+<!ENTITY Ccedil "&#xc7;">
+
+<!ENTITY Acirc "&#xc2;">
+<!ENTITY Ecirc "&#xca;">
+<!ENTITY Icirc "&#xc3;">
+<!ENTITY Ocirc "&#xd4;">
+<!ENTITY Ucirc "&#xdb;">
+<!ENTITY acirc "&#xe2;">
+<!ENTITY ecirc "&#xea;">
+<!ENTITY icirc "&#xee;">
+<!ENTITY ocirc "&#xf4;">
+<!ENTITY ucirc "&#xfb;">
+
+<!ENTITY Agrave "&#xc0;">
+<!ENTITY Egrave "&#xc8;">
+<!ENTITY Igrave "&#xcc;">
+<!ENTITY Ograve "&#xd2;">
+<!ENTITY Ugrave "&#xd9;">
+<!ENTITY agrave "&#xe0;">
+<!ENTITY egrave "&#xe8;">
+<!ENTITY igrave "&#xec;">
+<!ENTITY ograve "&#xf2;">
+<!ENTITY ugrave "&#xf9;">
+
+<!ENTITY Atilde "&#xc3;">
+<!ENTITY Ntilde "&#xd1;">
+<!ENTITY Otilde "&#xd5;">
+<!ENTITY atilde "&#xe3;">
+<!ENTITY ntilde "&#xf1;">
+<!ENTITY otilde "&#xf5;">
+
+<!ENTITY oslash "&#xf8;">
+<!ENTITY Oslash "&#xd8;">
+
+<!ENTITY ordm "&#xba;">
+<!ENTITY ordf "&#xaa;">
+
+<!ENTITY iexcl "&#xa1;">
+<!ENTITY pound "&#xa3;">
+<!ENTITY iquest "&#xbf;">
+<!ENTITY AElig "&#xc6;">
+<!ENTITY aelig "&#xe6;">
+<!ENTITY OElig "&#x152;">
+<!ENTITY oelig "&#x153;">
+<!ENTITY Aring "&#xc5;">
+<!ENTITY aring "&#xe5;">
+<!ENTITY szlig "&#xdf;">
+
+<!ENTITY macr "&#xaf;">
+
+
+<!-- fixxme: not yet classified -->
+
+<!ELEMENT sp (#PCDATA)>
+<!ATTLIST sp
+ lines CDATA #IMPLIED>
+<!ELEMENT printindex (#PCDATA)>
+
diff --git a/Build/source/utils/texinfo/util/texinfo.xsl b/Build/source/utils/texinfo/util/texinfo.xsl
new file mode 100644
index 00000000000..5225517ec7b
--- /dev/null
+++ b/Build/source/utils/texinfo/util/texinfo.xsl
@@ -0,0 +1,242 @@
+<?xml version='1.0'?>
+<!-- $Id: texinfo.xsl,v 1.1 2004/04/11 17:56:47 karl Exp $ -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="html" indent="yes"/>
+
+<!-- root rule -->
+<xsl:template match="/">
+ <html>
+ <head><title>
+ <xsl:apply-templates select="TEXINFO/SETTITLE" mode="head"/>
+ </title></head>
+ <body bgcolor="#FFFFFF"><xsl:apply-templates/>
+</body></html>
+</xsl:template>
+
+
+<xsl:template match="TEXINFO">
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<xsl:template match="TEXINFO/SETFILENAME">
+</xsl:template>
+
+<xsl:template match="TEXINFO/SETTITLE" mode="head">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="TEXINFO/SETTITLE">
+ <h1><xsl:apply-templates/></h1>
+</xsl:template>
+
+
+<xsl:template match="TEXINFO/DIRCATEGORY">
+</xsl:template>
+
+<xsl:template match="//PARA">
+ <p><xsl:apply-templates/></p>
+</xsl:template>
+
+<xsl:template match="//EMPH">
+ <i><xsl:apply-templates/></i>
+</xsl:template>
+
+<!-- The node -->
+<xsl:template match="TEXINFO/NODE">
+ <hr/>
+ <p>
+ <xsl:apply-templates select="NODENAME" mode="select"/>
+ <xsl:apply-templates select="NODEPREV" mode="select"/>
+ <xsl:apply-templates select="NODEUP" mode="select"/>
+ <xsl:apply-templates select="NODENEXT" mode="select"/>
+ <xsl:apply-templates/>
+ <h2>Footnotes</h2>
+ <ol>
+ <xsl:apply-templates select=".//FOOTNOTE" mode="footnote"/>
+ </ol>
+ </p>
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODENAME" mode="select">
+<h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</h2>
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODENAME"/>
+
+
+<xsl:template match="TEXINFO/NODE/NODEPREV" mode="select">
+ [ <b>Previous: </b>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a> ]
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODEPREV"/>
+
+<xsl:template match="TEXINFO/NODE/NODEUP" mode="select">
+ [ <b>Up: </b>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a> ]
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODEUP"/>
+
+<xsl:template match="TEXINFO/NODE/NODENEXT" mode="select">
+ [ <b>Next: </b>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a> ]
+</xsl:template>
+
+<xsl:template match="TEXINFO/NODE/NODENEXT"/>
+
+<!-- Menu -->
+<xsl:template match="//MENU">
+ <h3>Menu</h3>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:apply-templates select="MENUNODE"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="MENUTITLE"/>
+ </a>:
+ <xsl:apply-templates select="MENUCOMMENT"/>
+ <br/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY/MENUNODE">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY/MENUTITLE">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//MENU/MENUENTRY/MENUCOMMENT">
+ <xsl:apply-templates mode="menucomment"/>
+</xsl:template>
+
+<xsl:template match="PARA" mode="menucomment">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="//PARA">
+ <p><xsl:apply-templates/></p>
+</xsl:template>
+
+<!-- LISTS -->
+<xsl:template match="//ITEMIZE">
+ <ul>
+ <xsl:apply-templates/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="//ITEMIZE/ITEM">
+ <li>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<xsl:template match="//ENUMERATE">
+ <ol>
+ <xsl:apply-templates/>
+ </ol>
+</xsl:template>
+
+<xsl:template match="//ENUMERATE/ITEM">
+ <li>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<!-- INLINE -->
+<xsl:template match="//CODE">
+ <tt>
+ <xsl:apply-templates/>
+ </tt>
+</xsl:template>
+
+<xsl:template match="//DFN">
+ <i><b>
+ <xsl:apply-templates/>
+ </b></i>
+</xsl:template>
+
+<xsl:template match="//STRONG">
+ <b>
+ <xsl:apply-templates/>
+ </b>
+</xsl:template>
+
+<xsl:template match="//CENTER">
+ <center>
+ <xsl:apply-templates/>
+ </center>
+</xsl:template>
+
+<xsl:template match="//VAR">
+ <i>
+ <xsl:apply-templates/>
+ </i>
+</xsl:template>
+
+<xsl:template match="//KBD">
+ <tt>
+ <xsl:apply-templates/>
+ </tt>
+</xsl:template>
+
+<xsl:template match="//KEY">
+ <b>
+ <xsl:apply-templates/>
+ </b>
+</xsl:template>
+
+<!-- BLOCKS -->
+<xsl:template match="//DISPLAY">
+ <pre>
+ <xsl:apply-templates/>
+ </pre>
+</xsl:template>
+
+
+<!-- INDEX -->
+<xsl:template match="//INDEXTERM">
+</xsl:template>
+
+<!-- FOOTNOTE -->
+<xsl:template match="//FOOTNOTE">
+</xsl:template>
+
+<xsl:template match="//FOOTNOTE" mode="footnote">
+ <li><xsl:apply-templates/></li>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/Build/source/utils/texinfo/util/txitextest b/Build/source/utils/texinfo/util/txitextest
new file mode 100755
index 00000000000..4542bc23641
--- /dev/null
+++ b/Build/source/utils/texinfo/util/txitextest
@@ -0,0 +1,77 @@
+#!/bin/sh
+# $Id: txitextest,v 1.5 2004/04/11 17:56:47 karl Exp $
+# Test texinfo.tex changes by running various manuals through with an
+# old version, saving the .ps result from dvips, doing the same with a
+# new version, and comparing. Idea from Stepan Kasal.
+#
+# Another option is to run the manuals all the way through using
+# texi2dvi, which tests in another way.
+
+tsrc=/u/texinfo/src
+PATH=$tsrc/util:$PATH
+
+tdoc=$tsrc/doc
+default_manuals="$tdoc/texinfo.txi $tdoc/info.texi $tdoc/info-stnd.texi"
+
+olddir=$HOME/gnu/src/gnulib/config
+newdir=$tdoc
+tempdir=/u/texinfo/@tests/testdir
+full=false
+manuals=
+
+while test $# -gt 0; do
+ case $1 in
+ --f*) full=true;;
+ --o*) shift; olddir="$1";;
+ --n*) shift; newdir="$1";;
+ --t*) shift; tempdir="$1";;
+ -*) echo "$0: unknown option \`$1'." >&2; exit 1;;
+ *) manuals="$manuals $1";;
+ esac
+ shift
+done
+
+test -z "$manuals" && manuals=$default_manuals
+initial_dir=`pwd`
+
+cd $tempdir || exit 1
+rm -f *
+
+run_tex() \
+{
+ TEXINPUTS=.:$mandir: tex $manual \
+ || { echo "tex $manual failed." >&2; exit 1; }
+}
+
+for manual in $manuals; do
+ mandir=`dirname $manual`
+ test $mandir = . && mandir=$initial_dir
+ manual_base=`basename "$manual" | sed 's/\.[^.]*$//'`
+
+ rm -f $manual_base.* texinfo.tex
+ ln -s $newdir/texinfo.tex texinfo.tex
+
+ if $full; then
+ # instead of comparing, do full test of just the new texinfo.tex.
+ echo "$0: testing $manual_base... (tex)"
+ texi2dvi $manual || { echo "texi2dvi $manual failed." >&2; exit 1; }
+ echo "$0: testing $manual_base... (pdf)"
+ texi2dvi --pdf $manual \
+ || { echo "texi2dvi --pdf $manual failed." >&2; exit 1; }
+
+ else
+ echo "$0: testing $manual_base... (new)"
+ run_tex
+ dvips $manual_base -o || exit 1
+ mv $manual_base.ps new.$manual_base.ps
+
+ echo "$0: testing $manual_base... (old)"
+ rm -f $manual_base.* texinfo.tex
+ ln -s $olddir/texinfo.tex texinfo.tex
+ run_tex
+ dvips $manual_base -o || exit 1
+ mv $manual_base.ps old.$manual_base.ps
+
+ diff -U0 old.$manual_base.ps new.$manual_base.ps
+ fi
+done
diff --git a/Build/source/utils/texinfo/util/win32.mak b/Build/source/utils/texinfo/util/win32.mak
new file mode 100644
index 00000000000..ce49b96764d
--- /dev/null
+++ b/Build/source/utils/texinfo/util/win32.mak
@@ -0,0 +1,60 @@
+################################################################################
+#
+# Makefile : TeXInfo / Utils
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <02/02/01 11:16:42 popineau>
+#
+################################################################################
+root_srcdir = ..\..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+USE_ZLIB=1
+USE_GNUW32=1
+
+!include <msvc/common.mak>
+
+DEFS = -I.. -DHAVE_CONFIG_H -DKPATHSEA=1 $(DEFS) -I../lib
+
+libtxi = ..\lib\$(objdir)\libtxi.lib
+
+install_info_objects=$(objdir)\install-info.obj
+texindex_objects = $(objdir)\texindex.obj
+
+programs = $(objdir)\install-info.exe $(objdir)\texindex.exe
+
+default all: $(objdir) $(programs)
+
+$(objdir)\install-info.exe: $(install_info_objects) $(libtxi) $(gnuw32lib)
+ $(link) $(**) $(conlibs)
+
+$(objdir)\texindex.exe: $(texindex_objects) $(libtxi) $(gnuw32lib)
+ $(link) $(**) $(setargvobj) $(conlibs)
+
+$(libtxi): ../lib/*.c ../lib/*.h
+ pushd ..\lib & $(make) all & popd
+
+..\config.h: ..\config.in
+ pushd .. & $(make) configure & popd
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+install:: install-exec
+
+!include <msvc/clean.mak>
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/texinfo/win32.mak b/Build/source/utils/texinfo/win32.mak
new file mode 100644
index 00000000000..efc49bc2f28
--- /dev/null
+++ b/Build/source/utils/texinfo/win32.mak
@@ -0,0 +1,33 @@
+################################################################################
+#
+# Makefile : TeXInfo
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <02/12/25 22:27:38 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+!include <msvc/common.mak>
+
+# Package subdirectories, the library, and all subdirectories.
+subdirs = lib makeinfo util doc
+
+all:: config.h
+
+!include <msvc/subdirs.mak>
+!include <msvc/config.mak>
+!include <msvc/clean.mak>
+
+distclean::
+ -@$(del) config.h
+
+# Local Variables:
+# mode: Makefile
+# End:
+
diff --git a/Build/source/utils/vlna/Makefile b/Build/source/utils/vlna/Makefile
new file mode 100644
index 00000000000..4b6c40e0c4a
--- /dev/null
+++ b/Build/source/utils/vlna/Makefile
@@ -0,0 +1,53 @@
+
+DESTDIR=/usr/local
+MANEXT=1
+BINDIR=$(DESTDIR)/bin
+MANDIR=$(DESTDIR)/man/man$(MANEXT)
+
+CC=cc
+INSTALL=install
+MKDIR=mkdir -p
+INSTPROGFLAGS=-s -m755
+INSTDATAFLAGS=-m644
+
+CFLAGS=-O
+LFLAGS=
+
+CTANGLE=ctangle
+CWEAVE=cweave
+TEX=csplain
+
+all: vlna
+
+vlna: vlna.c
+ $(CC) $(CFLAGS) $(LFLAGS) $? -o $@
+
+install: all install.man
+ @if [ -d $(BINDIR) ]; then \
+ set +x; else (set -x; $(MKDIR) $(BINDIR)); fi
+ $(INSTALL) $(INSTPROGFLAGS) vlna $(BINDIR)/vlna
+
+install.man:
+ sed -e "s|@BINDIR@|$(BINDIR)|;\
+ s|@MANDIR@|$(MANDIR)|;\
+ s|@MANEXT@|$(MANEXT)|" vlna.man > vlna.$(MANEXT)
+ @if [ -d $(MANDIR) ]; then \
+ set +x; else (set -x; $(MKDIR) $(MANDIR)); fi
+ $(INSTALL) $(INSTDATAFLAGS) vlna.$(MANEXT) $(MANDIR)/vlna.$(MANEXT)
+
+vlna.c: vlna.w
+ $(CTANGLE) $? - $@
+
+vlna.tex: vlna.w
+ $(CWEAVE) $? - $@
+
+vlna.dvi: vlna.tex
+ $(TEX) $?
+
+clean:
+ rm -f *.o *~ *.bak core a.out vlna vlna.$(MANEXT)
+ rm -f vlna.idx vlna.scn vlna.toc vlna.log vlna.tex
+
+cleanall: clean
+ rm -f vlna.c vlna.dvi
+
diff --git a/Build/source/utils/vlna/README b/Build/source/utils/vlna/README
new file mode 100644
index 00000000000..d8770c53099
--- /dev/null
+++ b/Build/source/utils/vlna/README
@@ -0,0 +1,68 @@
+
+VLNA v1.2
+=========
+
+Program vlna přidává vlnky (místo původních mezer) za neslabičné předložky
+ve vstupních souborech pro TeX. To zabrání zlomu řádku v nežádoucím místě.
+
+Obsah distribuce:
+-----------------
+
+README ... tento soubor (formát UNIX, ISO 8859-2),
+vlna.txt ... manuál k programu (formát UNIX, ISO 8859-2),
+Makefile ... soubor pro program make
+vlna.w ... zdrojový text programu v jazyce CWEB (formát UNIX, ISO 8859-2),
+vlna.c ... výstup z ctangle vlna (program v jazyce C),
+vlna.dvi ... listing programu (vyžaduje csfonty),
+ listing je vytvořen takto:
+ cweave vlna
+ csplain vlna
+vlna.man ... kostra manuálové stránky
+csmac.tex ... makra potřebná při zpracování dokumentace (formát ISO 8859-2).
+vlna.exe ... už zkompilovaný program pro DOS
+
+Instalace v DOSu:
+-----------------
+
+1) Převedení textových souborů z ISO 8859-2 do použitého kódování
+ (například programem cstocs).
+2) Je možné přímo použít připravený program vlna.exe.
+3) S vhodným překladačem a při troše štěstí lze též kompilovat program
+ jako ze zdrojových textů (například s gcc a několika UNIXovými
+ utilitami).
+
+Instalace v UNIXu:
+------------------
+
+1) Případná úprava Makefile pro přizpůsobení překladu a instalace
+ na cílovému systému.
+2) Překlad a instalace:
+ make
+ su
+ make install
+
+Šíření programu:
+----------------
+
+Program poskytuji k veřejnému použití. Pokud někdo udělá užitečné
+změny ve zdrojovém textu CWEB, chtěl bych být o tom informován. Bez
+souhlasu autora nemůže být změněný program šířen pod stejným názvem.
+Program ani jeho modifikace se nesmí prodávat.
+
+Nedávám žádnou záruku, že program nepoškodí mnohahodinovou práci,
+kterou uživatelé editovali. Program sice vytváří zálohové soubory, ale
+ty se při dalším použití programu mažou.
+
+Poděkování:
+-----------
+
+Děkuji panu Rudolfu Čejkovi za vytvoření Makefile a manuálové stranky
+k programu. Rovněž mu děkuji za odstranění drobných chyb programu, které
+se vyskytly ve verzi 1.0.
+
+28. 2. 1995 Petr Olšák
+
+verze 1.2 (20. 5. 2002):
+ oprava chyby "v<space><cr>lese" -> "v~~lese"
+ a přidání patternu pro "\uv{v lese}" -> "\uv{v~lese}".
+
diff --git a/Build/source/utils/vlna/csmac.tex b/Build/source/utils/vlna/csmac.tex
new file mode 100644
index 00000000000..0860a70f4f0
--- /dev/null
+++ b/Build/source/utils/vlna/csmac.tex
@@ -0,0 +1,63 @@
+\chyph
+\font\ninerm=csr9
+\font\eightrm=csr8
+\let\sc=\eightrm % small caps (NOT a caps-and-small-caps font)
+\font\titlefont=csr7 scaled\magstep4 % title on the contents page
+\font\ttitlefont=cstt10 scaled\magstep2 % typewriter type in title
+\def\postATL#1 #2 {\bf písmeno \\{\uppercase{\char"#1}}
+ v~.c kódu jako \tentex "#2"\egroup\par}
+\def\ATH{\X\kern-.5em:Definice pro preprocesor\X}
+\def\A{\note{Viz také sekci}} % xref for doubly defined section name
+\def\As{\note{Viz také sekce}} % xref for multiply defined section name
+\def\ET{ a~} % conjunction between two section numbers
+\def\ETs{ a~} % conjunction between the last two of several section numbers
+\def\Q{\note{Tento kód je citován v~sekci}} % xref for mention of a section
+\def\Qs{\note{Tento kód je citován v~sekcích}} % xref for mentions of a section
+\def\U{\note{Tento kód je použit v~sekci}} % xref for use of a section
+\def\Us{\note{Tento kód je použit v~sekcích}} % xref for uses of a section
+\def\ch{\note{Následující sekce byly změněny prostřednictvím změnového
+ souboru:} \let\*=\relax}
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \parfillskip 0pt plus 1fil
+ \def\grouptitle{NÁZVY SEKCÍ}
+ \let\topsecno=\nullsec
+ \message{Section names:}
+ \output={\normaloutput\page\lheader\rheader}
+ \setpage
+ \def\note##1##2.{\quad{\eightrm##1~##2.}}
+ \def\Q{\note{Citováno v~sekci}} % crossref for mention of a section
+ \def\Qs{\note{Citováno v~sekcích}} % crossref for mentions of a section
+ \def\U{\note{Použito v~sekci}} % crossref for use of a section
+ \def\Us{\note{Použito v~sekcích}} % crossref for uses of a section
+ \def\I{\par\hangindent 2em}\let\*=*
+ \readsections}
+\def\contentsline#1#2#3#4{\ifnum#2=0 \smallbreak\fi
+ \line{\consetup{#2}#1
+ \rm\leaders\hbox to .5em{.\hfil}\hfil\ #3\hbox to4em{\hss#4}}}
+\def\con{\par\vfill\eject % finish the section names
+% \ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+ \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ \setpage \output={\normaloutput\page\lheader\rheader}
+ \titletrue % prepare to output the table of contents
+ \pageno=\contentspagenumber
+ \def\grouptitle{OBSAH}
+ \message{Table of contents:}
+ \topofcontents
+ \line{\hfil Sekce\hbox to4em{\hss Strana}}
+ \let\ZZ=\contentsline
+ \readcontents\relax % read the contents info
+ \botofcontents \end} % print the contents page(s) and terminate
+\def\today{\number\day.~\ifcase\month\or ledna\or února\or března\or
+ dubna\or května\or června\or července\or srpna\or září\or října\or
+ listopadu\or prosince\fi \space\number\year}
+\def\datethis{\def\startsection{\leftline{\sc\today\ v~\hours}\bigskip
+ \let\startsection=\stsec\stsec}}
+\def\datecontentspage{%
+ \def\topofcontents{\leftline{\sc\today\ v~\hours}\bigskip
+ \centerline{\titlefont\title}\vfill}} % timestamps the contents page
+
+\def\allowhyphens{\nobreak\hskip0pt\relax}
+\def \uv#1{\char254 \allowhyphens#1\allowhyphens\char255 }
+
diff --git a/Build/source/utils/vlna/depend.mak b/Build/source/utils/vlna/depend.mak
new file mode 100644
index 00000000000..1a3ea97100b
--- /dev/null
+++ b/Build/source/utils/vlna/depend.mak
@@ -0,0 +1,3 @@
+$(objdir)/vlna.obj: \
+
+
diff --git a/Build/source/utils/vlna/vlna.c b/Build/source/utils/vlna/vlna.c
new file mode 100644
index 00000000000..6e4ae12493c
--- /dev/null
+++ b/Build/source/utils/vlna/vlna.c
@@ -0,0 +1,827 @@
+#define BANNER "This is program vlna, version 1.2, (c) 1995, 2002 Petr Olsak\n" \
+
+#define OK 0
+#define WARNING 1
+#define IO_ERR 2
+#define BAD_OPTIONS 3
+#define BAD_PROGRAM 4
+#define MAXLEN 120
+#define ONE 1
+#define ANY 2
+#define ONE_NOT -1
+#define ANY_NOT -2 \
+
+#define MAXPATT 200
+#define MAXBUFF 500
+#define BUFI 300
+#define FOUND -1
+#define NOFOUND -2
+#define TEXTMODE 0
+#define MATHMODE 1
+#define DISPLAYMODE 2
+#define VERBMODE 3
+/*1:*/
+#line 19 "vlna.w"
+
+/*3:*/
+#line 39 "vlna.w"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/*:3*/
+#line 20 "vlna.w"
+
+/*4:*/
+#line 56 "vlna.w"
+
+char*prog_name;
+int status;
+
+/*:4*//*7:*/
+#line 133 "vlna.w"
+
+int isfilter= 0,silent= 0,rmbackup= 0,nomath= 0,noverb= 0,web= 0,latex= 0;
+char charsetdefault[]= "KkSsVvZzOoUuAI";
+char*charset= charsetdefault;
+
+/*:7*//*15:*/
+#line 291 "vlna.w"
+
+typedef struct PATITEM{
+char*str;
+int flag;
+struct PATITEM*next;
+}PATITEM;
+typedef struct PATTERN{
+PATITEM*patt;
+void(*proc)();
+struct PATTERN*next;
+}PATTERN;
+
+/*:15*//*16:*/
+#line 343 "vlna.w"
+
+PATITEM*lapi[MAXPATT];
+PATTERN*lapt[MAXPATT];
+PATTERN*listpatt,*normallist,*commentlist,*pt,*lastpt= NULL;
+PATITEM*pi,*lastpi= NULL;
+char c;
+char buff[MAXBUFF];
+int ind;
+
+/*:16*//*20:*/
+#line 417 "vlna.w"
+
+char strings[512];
+int i;
+
+/*:20*//*25:*/
+#line 505 "vlna.w"
+
+char*filename;
+long int numline,numchanges;
+int mode;
+
+/*:25*//*33:*/
+#line 636 "vlna.w"
+
+char tblanks[]= " ~\t";
+char blanks[]= " \t";
+char blankscr[]= " \t\n";
+char tblankscr[]= " ~\t\n";
+char nochar[]= "%~\n";
+char cr[]= "\n";
+char prefixes[]= "[({~";
+char dolar[]= "$";
+char backslash[]= "\\";
+char openbrace[]= "{";
+char letters[]= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+PATTERN*vlnkalist,*mathlist,*parcheck,*verblist;
+
+/*:33*/
+#line 21 "vlna.w"
+
+/*6:*/
+#line 110 "vlna.w"
+
+void printusage()
+{
+fprintf(stderr,
+"usage: vlna [opt] [filenames]\n"
+" opt -f : filter mode: file1 file2 ... file1->file2\n"
+" file1 ... file1->stdout\n"
+" ... stdin->stdout\n"
+" nofilter: file1 [file2 file3 ...] all are in/out\n"
+" -s : silent: no messages to stderr\n"
+" -r : rmbackup: if nofilter, removes temporary files\n"
+" -v charset : set of lettres to add tie, default: KkSsVvZzOoUuAI\n"
+" -m : nomath: ignores math modes\n"
+" -n : noverb: ignores verbatim modes\n"
+" -l : LaTeX mode\n"
+" -w : web mode\n");
+}
+
+/*:6*//*10:*/
+#line 167 "vlna.w"
+
+void ioerr(f)
+char*f;
+{
+fprintf(stderr,"%s: cannot open file %s\n",prog_name,f);
+}
+
+/*:10*//*17:*/
+#line 356 "vlna.w"
+
+void*myalloc(size)
+int size;
+{
+void*p;
+p= malloc(size);
+if(p==NULL)
+{
+fprintf(stderr,"%s, no memory, malloc failed\n",prog_name);
+exit(BAD_PROGRAM);
+}
+return p;
+}
+
+/*:17*//*18:*/
+#line 374 "vlna.w"
+
+PATTERN*setpattern(proc)
+void(*proc)();
+{
+PATTERN*pp;
+pp= myalloc(sizeof(PATTERN));
+pp->proc= proc;
+pp->next= NULL;
+pp->patt= NULL;
+if(lastpt!=NULL)lastpt->next= pp;
+lastpt= pp;
+lastpi= NULL;
+return pp;
+}
+
+/*:18*//*19:*/
+#line 393 "vlna.w"
+
+void setpi(str,flag)
+char*str;
+int flag;
+{
+PATITEM*p;
+p= myalloc(sizeof(PATITEM));
+p->str= str;p->flag= flag;
+p->next= NULL;
+if(lastpi==NULL)lastpt->patt= p;
+else lastpi->next= p;
+lastpi= p;
+}
+
+/*:19*//*22:*/
+#line 428 "vlna.w"
+
+PATTERN*normalpattern(proc,str)
+void(*proc)();
+char*str;
+{
+PATTERN*pp;
+int j= 0;
+pp= setpattern(proc);
+while(str[j]){
+if(str[j]=='.'){
+j++;
+if(str[j]!='.'){
+setpi(blankscr,ANY);
+continue;
+}
+}
+setpi(&strings[(unsigned char)str[j]*2],ONE);
+j++;
+}
+return pp;
+}
+
+/*:22*//*23:*/
+#line 466 "vlna.w"
+
+int match(p)
+PATITEM*p;
+{
+int m;
+if(strchr(p->str,c)!=NULL)m= 1;
+else m= -1;
+switch(m*p->flag){
+case ANY:return 0;
+case ONE:if(p->next==NULL)return FOUND;
+return 1;
+case ONE_NOT:return NOFOUND;
+case ANY_NOT:/*24:*/
+#line 485 "vlna.w"
+
+switch(m= match(p->next)){
+case NOFOUND:return NOFOUND;
+case FOUND:return FOUND;
+default:return 1+m;
+}
+
+/*:24*/
+#line 478 "vlna.w"
+;
+}
+return 0;
+}
+
+/*:23*//*36:*/
+#line 669 "vlna.w"
+
+void vlnkain()
+{
+char p;
+ind--;
+p= buff[ind--];
+while(strchr(blanks,buff[ind])!=NULL)ind--;
+ind++;
+buff[ind++]= '~';
+buff[ind++]= p;
+numchanges++;
+}
+
+/*:36*//*38:*/
+#line 708 "vlna.w"
+
+void vlnkacr()
+{
+char p;
+int i,j;
+ind--;
+p= buff[ind--];
+while(strchr(blankscr,buff[ind])!=NULL)ind--;
+i= ind;
+while(i>=0&&(strchr(blankscr,buff[i])==NULL))i--;
+j= i;
+while(i>=0&&(strchr(blanks,buff[i])!=NULL))i--;
+if(i>=0&&buff[i]=='\n')j= -1;
+if(j>=0)buff[j]= '\n';
+else numline--;
+ind++;
+buff[ind++]= '~';
+buff[ind++]= p;
+numchanges++;
+}
+
+/*:38*//*41:*/
+#line 774 "vlna.w"
+
+void tielock()
+{
+c= 1;
+}
+
+/*:41*//*42:*/
+#line 783 "vlna.w"
+
+void printwarning()
+{
+if(!silent)
+fprintf(stderr,
+"~!~ warning: text/math/verb mode mismatch, file: %s, line: %ld\n",
+filename,numline-(c=='\n'?1:0));
+status= WARNING;
+}
+
+/*:42*//*44:*/
+#line 808 "vlna.w"
+
+void mathin()
+{
+if(mode!=TEXTMODE)printwarning();
+mode= MATHMODE;
+normallist= listpatt= mathlist;
+}
+void mathout()
+{
+if(mode!=MATHMODE)printwarning();
+mode= TEXTMODE;
+normallist= listpatt= vlnkalist;
+}
+
+/*:44*//*45:*/
+#line 826 "vlna.w"
+
+void onedollar()
+{
+if(buff[ind-3]=='\\'||(buff[ind-3]=='$'&&buff[ind-4]!='\\'))return;
+if(mode==DISPLAYMODE)printwarning();
+else{
+if(mode==TEXTMODE)mathin();
+else mathout();
+}
+}
+
+/*:45*//*47:*/
+#line 845 "vlna.w"
+
+void checkmode()
+{
+if(mode!=TEXTMODE){
+printwarning();
+mode= TEXTMODE;
+normallist= listpatt= vlnkalist;
+}
+}
+
+/*:47*//*49:*/
+#line 871 "vlna.w"
+
+void displayin()
+{
+if(mode!=TEXTMODE)printwarning();
+mode= DISPLAYMODE;normallist= listpatt= parcheck;
+}
+void displayout()
+{
+if(mode!=DISPLAYMODE)printwarning();
+mode= TEXTMODE;normallist= listpatt= vlnkalist;
+}
+void twodollars()
+{
+if(buff[ind-3]=='\\')return;
+if(mode==DISPLAYMODE)displayout();
+else displayin();
+}
+
+/*:49*//*51:*/
+#line 920 "vlna.w"
+
+int prevmode;
+PATTERN*prevlist,*verboutlist[4];
+char verbchar[2];
+void verbinchar()
+{
+prevmode= mode;
+verbchar[0]= c;
+c= 1;
+listpatt= normallist= verboutlist[0];
+prevlist= listpatt->next;
+listpatt->next= NULL;
+mode= VERBMODE;
+}
+
+/*:51*//*52:*/
+#line 941 "vlna.w"
+
+void verbin()
+{
+int i;
+i= 0;
+prevmode= mode;
+switch(c){
+case't':i= 1;break;
+case'm':i= 2;break;
+case'<':;
+case'd':i= 3;
+if(buff[ind-3]=='@')return;
+break;
+}
+listpatt= normallist= verboutlist[i];
+prevlist= listpatt->next;
+if(c!='<'&&c!='d')listpatt->next= NULL;
+mode= VERBMODE;
+}
+
+/*:52*//*53:*/
+#line 961 "vlna.w"
+
+void verbout()
+{
+if(mode!=VERBMODE)return;
+if(web&&buff[ind-2]=='@'&&buff[ind-3]=='@')return;
+mode= prevmode;
+normallist->next= prevlist;
+switch(mode){
+case DISPLAYMODE:normallist= listpatt= parcheck;break;
+case MATHMODE:normallist= listpatt= mathlist;break;
+case TEXTMODE:normallist= listpatt= vlnkalist;break;
+}
+}
+
+/*:53*//*55:*/
+#line 983 "vlna.w"
+
+void tieoff()
+{
+normallist= NULL;
+}
+void tieon()
+{
+normallist= vlnkalist;
+}
+
+/*:55*/
+#line 22 "vlna.w"
+
+/*26:*/
+#line 514 "vlna.w"
+
+void tie(input,output)
+FILE*input,*output;
+{
+int ap;
+register int k,m,n;
+int ic;
+PATTERN*pp;
+PATITEM*pi;
+
+/*27:*/
+#line 545 "vlna.w"
+
+for(k= 0;k<MAXPATT;k++)lapi[k]= NULL;
+c= '\n';
+buff[0]= mode= ap= 0;ind= 1;
+numline= 1;numchanges= 0;
+mode= TEXTMODE;
+
+/*:27*//*35:*/
+#line 666 "vlna.w"
+
+listpatt= normallist= vlnkalist;
+
+/*:35*/
+#line 524 "vlna.w"
+;
+
+while(!feof(input)){
+/*30:*/
+#line 590 "vlna.w"
+
+pp= listpatt;
+while(pp!=NULL){
+switch(m= match(pp->patt)){
+case FOUND:(*pp->proc)();
+case NOFOUND:break;
+default:/*31:*/
+#line 605 "vlna.w"
+
+pi= pp->patt;
+while(m--)pi= pi->next;
+n= ap;k= 0;
+while(n){
+if(lapi[k]==pi)break;
+if(lapi[k++]!=NULL)n--;
+}
+if(!n){
+k= 0;
+while(lapi[k]!=NULL)k++;
+if(k>=MAXPATT){
+fprintf(stderr,"I cannot allocate pp, is anything wrong?\n");
+exit(BAD_PROGRAM);
+}
+lapt[k]= pp;lapi[k]= pi;ap++;
+}
+
+/*:31*/
+#line 596 "vlna.w"
+;
+}
+pp= pp->next;
+}
+
+/*:30*/
+#line 527 "vlna.w"
+;
+if(ap==0&&ind> BUFI&&c!='\\')/*28:*/
+#line 560 "vlna.w"
+
+{
+buff[ind]= 0;
+fputs(&buff[1],output);
+ind= 1;
+}
+
+/*:28*/
+#line 528 "vlna.w"
+;
+if(ind>=MAXBUFF){
+fprintf(stderr,"Operating buffer overflow, is anything wrong?\n");
+exit(BAD_PROGRAM);
+}
+if((ic= getc(input))==EOF)
+break;
+buff[ind++]= c= ic;
+if(c=='\n')numline++,listpatt= normallist;
+if(c=='%'&&mode!=VERBMODE&&buff[ind-2]!='\\')listpatt= commentlist;
+/*29:*/
+#line 573 "vlna.w"
+
+n= ap;k= 0;
+while(n){
+while(lapi[k]==NULL)k++;
+switch(m= match(lapi[k])){
+case FOUND:(*lapt[k]->proc)();
+case NOFOUND:lapi[k]= NULL;
+ap--;break;
+default:while(m--)lapi[k]= lapi[k]->next;
+}
+k++;n--;
+}
+
+/*:29*/
+#line 538 "vlna.w"
+;
+}
+/*28:*/
+#line 560 "vlna.w"
+
+{
+buff[ind]= 0;
+fputs(&buff[1],output);
+ind= 1;
+}
+
+/*:28*/
+#line 540 "vlna.w"
+;
+if(!web)checkmode();
+if(!silent)/*32:*/
+#line 624 "vlna.w"
+
+fprintf(stderr,"~~~ file: %s\t lines: %ld, changes: %ld\n",
+filename,numline,numchanges);
+
+/*:32*/
+#line 542 "vlna.w"
+;
+}
+
+/*:26*/
+#line 23 "vlna.w"
+
+/*5:*/
+#line 61 "vlna.w"
+
+int main(argc,argv)
+int argc;
+char**argv;
+{
+/*9:*/
+#line 160 "vlna.w"
+
+FILE*infile,*outfile;
+char backup[MAXLEN];
+int j;
+
+/*:9*/
+#line 66 "vlna.w"
+;
+prog_name= argv[0];status= OK;
+/*8:*/
+#line 138 "vlna.w"
+
+while(argc> 1&&argv[1][0]=='-'){
+if(argv[1][2]!=0)printusage(),exit(BAD_OPTIONS);
+switch(argv[1][1]){
+case'f':isfilter= 1;break;
+case's':silent= 1;break;
+case'r':rmbackup= 1;break;
+case'v':argv++;argc--;charset= argv[1];break;
+case'm':nomath= 1;break;
+case'n':noverb= 1;break;
+case'l':latex= 1;break;
+case'w':web= 1;break;
+default:printusage(),exit(BAD_OPTIONS);
+
+}
+argc--;argv++;
+}
+
+/*:8*/
+#line 68 "vlna.w"
+;
+if(!silent)fprintf(stderr,BANNER);
+/*21:*/
+#line 422 "vlna.w"
+
+for(i= 0;i<256;i++){
+strings[2*i]= (char)i;strings[2*i+1]= 0;
+}
+
+/*:21*//*34:*/
+#line 656 "vlna.w"
+
+vlnkalist= setpattern(vlnkain);
+setpi(tblankscr,ONE);
+setpi(tblanks,ANY);
+setpi(prefixes,ANY);
+setpi(charset,ONE);
+setpi(blanks,ONE);
+setpi(blanks,ANY);
+setpi(nochar,ONE_NOT);
+
+/*:34*//*37:*/
+#line 684 "vlna.w"
+
+setpattern(vlnkacr);
+setpi(tblankscr,ONE);
+setpi(tblanks,ANY);
+setpi(prefixes,ANY);
+setpi(charset,ONE);
+setpi(blanks,ANY);
+setpi(cr,ONE);
+setpi(blanks,ANY);
+setpi(nochar,ONE_NOT);
+
+/*:37*//*39:*/
+#line 730 "vlna.w"
+
+setpattern(vlnkain);
+setpi(tblankscr,ONE);
+setpi(backslash,ONE);
+setpi(letters,ONE);
+setpi(letters,ANY);
+setpi(openbrace,ONE);
+setpi(prefixes,ANY);
+setpi(charset,ONE);
+setpi(blanks,ONE);
+setpi(blanks,ANY);
+setpi(nochar,ONE_NOT);
+
+setpattern(vlnkacr);
+setpi(tblankscr,ONE);
+setpi(backslash,ONE);
+setpi(letters,ONE);
+setpi(letters,ANY);
+setpi(openbrace,ONE);
+setpi(prefixes,ANY);
+setpi(charset,ONE);
+setpi(blanks,ANY);
+setpi(cr,ONE);
+setpi(blanks,ANY);
+setpi(nochar,ONE_NOT);
+
+
+
+/*:39*//*40:*/
+#line 763 "vlna.w"
+
+normalpattern(tielock,"\\TeX");
+setpi(blankscr,ONE);
+normalpattern(tielock,"\\LaTeX");
+setpi(blankscr,ONE);
+
+/*:40*//*43:*/
+#line 797 "vlna.w"
+
+if(!nomath){
+mathlist= setpattern(onedollar);
+setpi(dolar,ONE);
+setpi(dolar,ONE_NOT);
+if(latex){
+normalpattern(mathin,"\\begin.{math}");
+normalpattern(mathout,"\\end.{math}");
+}
+}
+
+/*:43*//*46:*/
+#line 839 "vlna.w"
+
+parcheck= setpattern(checkmode);
+setpi(cr,ONE);
+setpi(blanks,ANY);
+setpi(cr,ONE);
+
+/*:46*//*48:*/
+#line 860 "vlna.w"
+
+if(!nomath){
+normalpattern(twodollars,"$$");
+if(latex){
+normalpattern(displayin,"\\begin.{displaymath");
+normalpattern(displayin,"\\begin.{equation");
+normalpattern(displayout,"\\end.{displaymath");
+normalpattern(displayout,"\\end.{equation");
+}
+}
+
+/*:48*//*50:*/
+#line 892 "vlna.w"
+
+if(!noverb){
+verblist= normalpattern(verbinchar,"\\verb");
+setpi(blankscr,ANY);
+setpi(blankscr,ONE_NOT);
+normalpattern(verbin,"\\begtt");
+if(latex)normalpattern(verbin,"\\begin.{verbatim");
+}
+if(web){
+normalpattern(verbin,"@<");
+normalpattern(verbin,"@d");
+}
+if(!noverb){
+verboutlist[0]= setpattern(verbout);
+setpi(verbchar,ONE);
+verboutlist[1]= normalpattern(verbout,"\\endtt");
+if(latex)verboutlist[2]= normalpattern(verbout,"\\end{verbatim");
+}
+if(web){
+verboutlist[3]= normalpattern(verbout,"@ ");
+normalpattern(verbout,"@*");
+normalpattern(verbout,"@>|");
+}
+
+
+/*:50*//*54:*/
+#line 978 "vlna.w"
+
+lastpt= 0;
+commentlist= normalpattern(tieoff,"%.~.-");
+normalpattern(tieon,"%.~.+");
+
+/*:54*/
+#line 70 "vlna.w"
+;
+/*11:*/
+#line 175 "vlna.w"
+
+if(isfilter)/*12:*/
+#line 187 "vlna.w"
+
+{
+if(argc> 3)printusage(),exit(BAD_OPTIONS);
+infile= stdin;outfile= stdout;
+if(argc>=2)infile= fopen(argv[1],"r");
+if(infile==NULL)ioerr(argv[1]),exit(IO_ERR);
+if(argc==3)outfile= fopen(argv[2],"w");
+if(outfile==NULL)ioerr(argv[2]),exit(IO_ERR);
+if(argc>=2)filename= argv[1];
+else filename= NULL;
+tie(infile,outfile);
+if(outfile!=stdout)fclose(outfile);
+if(infile!=stdin)fclose(infile);
+}
+
+/*:12*/
+#line 176 "vlna.w"
+
+else/*13:*/
+#line 210 "vlna.w"
+
+{
+if(argc==1)printusage(),exit(BAD_OPTIONS);
+while(argc> 1){
+argc--;argv++;
+/*14:*/
+#line 241 "vlna.w"
+
+infile= NULL;
+j= strlen(argv[0])-1;
+if(j>=MAXLEN||argv[0][j]=='~'){
+if(!silent)fprintf(stderr,"%s: the conflict of file name %s\n",
+prog_name,argv[0]);
+}
+else{
+strcpy(backup,argv[0]);
+backup[j]= '~';
+remove(backup);
+j= rename(argv[0],backup);
+if(j==0)infile= fopen(backup,"r");
+}
+
+/*:14*/
+#line 215 "vlna.w"
+;
+if(infile==NULL){
+ioerr(argv[0]);continue;
+}
+outfile= fopen(argv[0],"w");
+if(outfile==NULL){
+ioerr(argv[0]);
+rename(backup,argv[0]);
+status= WARNING;
+continue;
+}
+filename= argv[0];
+tie(infile,outfile);
+fclose(outfile),fclose(infile);
+if(rmbackup)remove(backup);
+}
+}
+
+/*:13*/
+#line 177 "vlna.w"
+
+
+/*:11*/
+#line 71 "vlna.w"
+;
+return status;
+}
+
+/*:5*/
+#line 24 "vlna.w"
+
+
+/*:1*/
diff --git a/Build/source/utils/vlna/vlna.dvi b/Build/source/utils/vlna/vlna.dvi
new file mode 100644
index 00000000000..0bf8718cd48
--- /dev/null
+++ b/Build/source/utils/vlna/vlna.dvi
Binary files differ
diff --git a/Build/source/utils/vlna/vlna.exe b/Build/source/utils/vlna/vlna.exe
new file mode 100755
index 00000000000..b096673d835
--- /dev/null
+++ b/Build/source/utils/vlna/vlna.exe
Binary files differ
diff --git a/Build/source/utils/vlna/vlna.man b/Build/source/utils/vlna/vlna.man
new file mode 100644
index 00000000000..0470461370a
--- /dev/null
+++ b/Build/source/utils/vlna/vlna.man
@@ -0,0 +1,130 @@
+.\" $Id$
+.TH VLNA 1 "4. unora 1998"
+.nh
+.SH NAZEV
+vlna \- pridani vlnek za neslabicne predlozky v TeXu
+.SH POUZITI
+.B vlna
+[\fIvolby\fP]
+[\fIsoubory\fP]
+.SH POPIS
+Program
+.B vlna
+pridava vlnky (misto puvodnich mezer) za neslabicne predlozky
+ve vstupnich souborech pro TeX, coz zabrani zlomu radku v nezadoucich mistech.
+.PP
+Veskere aktivity programu je mozne vypnout sekvenci \fB%~-\fP a zapnout
+sekvenci \fB%~+\fP (mezi uvedenymi znaky muze byt libovolne mnozstvi mezer).
+.PP
+Pred predlozkou se muze nachazet libovolne mnozstvi oteviracich zavorek,
+pred kterymi se musi nachazet mezera nebo zacatek radku. Pred
+oteviraci svorkou muze byt take misto mezery TeXova
+\(lq\\sekvence\(rq (od verze 1.2).
+Napr. za \(lq([{(V\(rq na pocatku radku bude vlnka pridana.
+Stejne tak se text \(lq\\uv{V lese}\(rq promeni na
+\(lq\\uv{V~lese}\(rq.
+.PP
+Program kontroluje konzistenci matematickych prostredi (neni-li uveden
+parametr \fB\-m\fP).
+Vstup do \fIdisplay\fP rezimu (\fB$$\fP) uvnitr \fItext\fP rezimu (\fB$\fP)
+(napr. \fB$\fP...\fB$$\fP...\fB$\fP) znamena varovani a prechod do
+\fIdisplay\fP.
+Podobne prazdny radek uvnitr \fItext\fP nebo \fIdisplay\fP rezimu znamena
+vypis varovani a prechod do nematematickeho (standardniho) rezimu.
+Uvnitr rezimu \fIdisplay\fP se ignoruji vyskyty samostatneho znaku \fB$\fP,
+jelikoz byva vetsinou soucasti konstrukce \fB\\hbox\fP.
+.PP
+Program kontroluje konzistenci verbatim rezimu na konci souboru.
+Nebyl-li ukoncen, vypise se varovani.
+Kontrola se neprovadi, pokud je pouzita volba \fB\-n\fP nebo \fB\-w\fP.
+.PP
+Program nedoplnuje vlnky za samostatna pismena, ktera jako predlozky vypadaji,
+ale nasleduji bezprostredne za sekvencemi \fB\\TeX\fP nebo \fB\\LaTeX\fP.
+Napr. do textu \(lq\fBVlastnosti \\TeX u jsou\fP\(rq nebude zadna vlnka
+doplnena.
+.SH VOLBY
+Volby jsou nepovinne a mohou byt uvedeny v libovolnem poradi, ale nemohou
+byt spojovany.
+.TP
+.B \-f
+Filtr. Jmena souboru jsou interpretovana takto:
+.RS
+.TP 4
+.B vlna \-f \fIsoubor1 soubor2\fP
+Vstup je \fIsoubor1\fP, vystup \fIsoubor2\fP.
+.TP 4
+.B vlna \-f \fIsoubor1\fP
+Vstup je \fIsoubor1\fP, vystup \fIstdout\fP.
+.TP 4
+.B vlna \-f
+Vstup je \fIstdin\fP, vystup \fIstdout\fP.
+.TP 4
+\fBvlna\fP \fIsoubor1\fP [\fIsoubor2\fP [\fIsoubor3\fP ...]]
+Neni-li uveden parametr \fB\-f\fP, kazdy soubor je zpracovavan samostatne.
+.RE
+.TP
+.B \-s
+Tichy rezim. Program potlaci vypis uvodni zpravy, varovnych zprav a
+statistik o zmenach v souborech
+(bez uvedeni parametru jsou zpravy vypisovany na \fIstderr\fP).
+V tichem rezimu se vypise jen chyba, ktera predcasne ukonci
+cinnost programu.
+.TP
+.B \-r
+Nevytvaret (mazat) zalohy.
+Parametr \fB\-r\fP nema vliv, pokud je uveden spolu s \fB\-f\fP.
+V opacnem pripade se ke kazdemu souboru vytvari zaloha s vlnkou na konci jmena
+a parametr \fB\-r\fP zpusobi, ze na konci zpracovani jsou tyto zalohy mazany.
+.TP
+.B \-v \fIznaky\fP
+Znaky povazovane za neslabicne predlozky, za ktere ma byt pridavana
+vlnka. Implicitni hodnota je \fB\-v\ KkSsVvZzOoUuAI\fP. (Mezi
+\fB\-v\fP a skupinou znaku musi byt mezera.)
+.TP
+.B \-m
+Ignorovani prechodu do matematickych prostredi
+(\fB$\fP...\fB$\fP a \fB$$\fP...\fB$$\fP).
+Parametr \fB\-m\fP zpusobi vlnkovani i v matematickych prostredich, ktera
+se implicitne vynechavaji.
+.TP
+.B \-n
+Ignorovani verbatim rezimu (\fB\\verb\fP\fI<znak>\fP...\fI<znak>\fP,
+\fB\\begtt\fP...\fB\\endtt\fP).
+Parametr \fB\-n\fP zpusobi vlnkovani i ve verbatim rezimu, ktery se
+implicitne vynechava.
+.TP
+.B \-l
+LaTeX. Pro rozpoznani matematickeho rezimu jsou pridana prostredi
+\fB\\begin{display}\fP...\fB\\end{display}\fP a
+\fB\\begin{equation}\fP...\fB\\end{equation}\fP.
+Pro rozpoznani verbatim rezimu je pridano LaTeXove prostredi
+\fB\\begin{verbatim}\fP...\fB\\end{verbatim}\fP.
+.TP
+.B \-w
+Web. Pro rozpoznani verbatim rezimu jsou pridany sekvence
+\fB@<\fP, \fB@d\fP...\fB@*\fP, \fB@\fP\fImezera\fP nebo \fB@>|\fP.
+Ve zdrojovem kodu se tedy nevlnkuje program, ale jen komentare.
+.SH PRIKLADY
+.TP
+.B vlna \-m \-n \-s \-r \fIsoubor\fP
+Volani priblizne odpovida volani puvodniho programu \fBvlna\fP.
+(Navic se neprovadi vlnkovani za sekvencemi \fB\\TeX\fP a \fB\\LaTeX\fP.)
+.TP
+.B vlna *.tex
+Vlnkovani vsech souboru s priponou \fBtex\fP.
+(Pouze na UNIXu.)
+.TP
+.B vlna \-f soubor > /dev/null
+Test konzistence matematickeho a verbatim rezimu bez provedeni zmen.
+(Pouze na UNIXu.)
+.SH SOUBORY
+.PD 0
+.TP
+.I @BINDIR@/vlna
+spustitelny program
+.TP
+.I @MANDIR@/vlna.@MANEXT@
+manualova stranka
+.PD
+.SH AUTOR
+Petr Olsak <olsak@math.feld.cvut.cz>. Manualovou stranku a Makefile vytvoril Rulolf Cejka
diff --git a/Build/source/utils/vlna/vlna.txt b/Build/source/utils/vlna/vlna.txt
new file mode 100644
index 00000000000..2e50fab9e73
--- /dev/null
+++ b/Build/source/utils/vlna/vlna.txt
@@ -0,0 +1,121 @@
+
+ Program VLNA
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ verze 1.2 Petr Olšák
+
+Program vlna přidává vlnky (místo původních mezer) za neslabičné předložky
+ve vstupních souborech pro TeX. To zabrání zlomu řádku v nežádoucím místě.
+
+Není použit název "vlnka", abychom odlišili původní program vlnka
+(autoři O. Ulrych, Š. Kasal) od tohoto programu vlna. Jedná se o
+vylepšenou a zcela nově napsanou verzi, která není důsledně zpětně
+kompatibilní s původním programem vlnka.
+
+POUŽITÍ:
+--------
+
+vlna [opt] [jména souborů]
+
+[opt] jsou nepovinné přepínače, které musí být odděleny mezerou a uvozeny
+znakem "-". Mohou být uvedeny v libovolném pořadí.
+
+PŘEPÍNAČE:
+----------
+
+-f : Režim "filtr". V tomto režimu jsou jména souborů interpretována takto:
+ vlna -f soubor1 soubor2 ... soubor1 -> soubor2 (musí: in!=out)
+ vlna -f soubor1 ... soubor1 -> stdout
+ vlna -f ... stdin -> stdout
+ Není-li program v režimu filtr, pak jsou jména souborů interpretována
+ takto:
+ vlna soubor1 [soubor2 [soubor3...]]
+ Zde je každý soubor "ovlnkován" samostatně, tj. soubory jsou měněny.
+ Není-li uveden parametr -r, jsou vytvářeny zálohy k souborům
+ s vlnkou na konci jména.
+-s : Tichý režim. Program nevypisuje úvodní zprávu, varovné zprávy a
+ statistiky o změnách v souborech. Tyto texty se vypisují do stderr,
+ takže v režimu filtr není nutné -s zapínat, pokud umíme oddělit stderr
+ od stdout. V tichém režimu se vypíše jen chyba, která předčasně ukončí
+ činnost programu.
+-r : Nevytvářet (mazat) zálohy. Není-li program v režimu filtr, pak se ke
+ každému souboru vytváří záloha s vlnkou na konci jména. Takové soubory
+ se interně vytvářejí vždy při běhu programu v režimu ne-filtr. Je-li
+ uveden parametr -r, jsou na konci zpracování tyto zálohy mazány.
+ V režimu filtr nemá -r žádný vliv.
+-v znaky : Definice znaků, které budeme považovat za neslabičné předložky,
+ tj. k ovlnkování. Implicitní hodnota -v KkSsVvZzOoUuAI je použitím
+ tohoto parametru přepsána. Mezi -v a skupinou znaků musí být mezera.
+-m : Ignoruje přechody do matematického režimu ($...$ a $$...$$) a vlnkuje
+ i v těchto prostředích. Imlicitně v matematických prostředích nevlnkuje.
+-n : Ignoruje přechody do verbatim režimu (\verb<zn>...<zn>, \begtt...\endtt)
+ a vlnkuje i v těchto prostředích.
+-l : LaTeX mód. K výše uvedeným sekvencím ohraničující display math
+ mód je přidáno \begin{display}...\end{display} a
+ \begin{equation}...\end{equation}. K sekvencím ohraničující
+ verbatim mód je přidáno \begin{verbatim}...\end{verbatim}
+-w : web mód. K sekvencím ohraničujícím verbatim mód je přidáno
+ @< nebo @d ... @* nebo @mezera nebo @>| . To způsobí, že není
+ provlnkovaný kód programu ve web souborech, ale jenom komentáře.
+
+POZNÁMKY:
+---------
+
+* Před předložkou může být libovolné množství otevíracích závorek,
+ před kterými musí být mezera nebo začátek řádku. Před otevírací
+ svorkou může také být místo mezery TeXova "\sekvence" (od verze 1.2).
+ Např. ([{(V tomto případě bude vlnka za V. Stejně tak
+ se vlnka objeví \boldfont{V tomto případě}.
+* Veškeré aktivity programu je možné vypnout sekvencí %~- a zapnout
+ sekvencí %~+ (mezi uvedenými znaky může být libovoné množství mezer)
+* Program kontroluje konzistenci matematických režimů. Dá varování
+ v těchto případech:
+ Vstup do display uvnitř t-math (např. $ ...$$... $). -- přejde do display.
+ Prázdný řádek uvnitř t-math nebo display -- přejde do standardního režimu.
+ Poznamenejme, že uvnitř display se ignorují výskyty jednoho dolaru
+ naprosto bez varování, protože ty většinou mohou být součástí \hbox-u.
+ Při -m není konzistence math. módů kontrolována.
+* Program kontroluje konzistenci verbatim módů na konci souboru.
+ Nebyl-li verbatim mód ukončen, objeví se varování. Tento test
+ neprobíhá, pokud je nastaven přepínač -n nebo -w.
+* Program nedoplňuje vlnky za písmena, která vypadají "jako"
+ předložky, ale následují bezprostředně za sekvencemi \TeX nebo
+ \LaTeX, tj. např. v textu "Vlastnosti \TeX u jsou" nepřidá vlnku
+ mezi u a j. Sekvence \TeX a \LaTeX jsou zatím natvrdo implementovány
+ do programu. Otázka čtení množiny takových sekvencí z konf. souboru
+ (nebo odjinud) bude (možná) zahrnuta v další verzi.
+
+TIPY K POUŽITÍ PROGRAMU:
+------------------------
+
+vlna -m -n -s -r soubor ... odpovídá zhruba volání původního vlnka.
+Není to zcela přesné, protože program navíc nevlnkuje za slovy \TeX a
+\LaTeX a to se nedá vypnout.
+
+vlna *.tex ... provlnkuje všechny soubory s příponou .tex.
+Pracuje pouze na UNIXu.
+
+vlna -f soubor > /dev/null ... provede test konzistence math a
+verbatim módů a neudělá žádnou změnu.
+
+HISTORIE TOHOTO PRODUKTU:
+-------------------------
+
+Původní verzi programu vlnka vytvořil zhruba v roce 1990 Oldřich Ulrych
+v Pascalu. Další vylepšení v Pascalském programu udělal Štěpán Kasal.
+Tento Pascalský program je šířen v balíku CSTeX.
+
+Zde uvedená varianta programu (vlna) byla napsána v únoru 1995 pro
+použití v UNIXových prostředích, a proto v jazyce C. Přesněji byl
+použit prostředek CWEB, který umožňuje snadno číst zdrojový text a
+snadno jej modifikovat. Program byl zcela přepracován (z původního
+Pascalského kódu nebylo použito vůbec nic) a byl do něj implementován
+algoritmus rozpoznávání tzv. patternů (jednoduchých regulárních
+výrazů).
+
+Tato varianta programu byla testována na SUN OS a na MS DOS.
+
+V únoru 1998 mi poslal pan Rudof Čejka Makefile a manuálovou stránku
+k programu a ve zdrojovém kódu poravil drobné chyby.
+
+23.2.1995 Petr Olšák.
+
diff --git a/Build/source/utils/vlna/vlna.w b/Build/source/utils/vlna/vlna.w
new file mode 100644
index 00000000000..e366bffb146
--- /dev/null
+++ b/Build/source/utils/vlna/vlna.w
@@ -0,0 +1,1003 @@
+
+\input csmac % Makra pro češtinu
+\pageheight=9.5in \fullpageheight=9.8in \setpage
+%\nocon % omit table of contents
+\datethis % print date on listing
+
+\def\begitems{\medskip\bgroup\catcode`\*=13 \narrower\narrower}
+\def\enditems{\par\egroup\medskip}
+{\catcode`\*=13 \gdef*{\par\noindent\llap{$\bullet$\ }\ignorespaces}}
+
+
+@* PROGRAM VLNA.
+Program čte vstupní textový soubor a nahrazuje za specifikovanými
+jednopísmennými slovy (např.~v, k, u) mezery symbolem \uv{\.{\char126}}. To
+zabrání při následném zpracování \TeX{}em zlomit řádek na nevhodných
+místech, která jsou v rozporu s typografickou normou.
+
+Program sestává z těchto hlavních celků:
+@c
+@<Hlavičkové soubory k načtení@>@/
+@<Globální deklarace@>@/
+@<Pomocné funkce@>@/
+@<Vlnkovací funkce |tie|@>@/
+@<Hlavní program@>
+
+@ Definujeme |BANNER|, což je text, který se objevi při startu
+programu a obsahuje číslo verze programu.
+Zde je názorně vidět, že míchání dvou jazyků se nevyhneme. Při tisku
+textů na terminál nesmíme předpokládat, že tam budou české fonty.
+V~této dokumentaci se setkáme se třemi jazyky: angličtinou (většinou
+v~kódu programu, cestinou v~/* komentářích */ a češtinou jinde.
+Tu cestinu si vynutil fakt, že DOS-ovská varianta \.{tangle} a
+\.{weave} se nesnáší s~akcentovanými písmeny v~/* komentářích */.
+A~nyní už slíbený (vícejazyčný) |BANNER|.
+@d BANNER "This is program vlna, version 1.2, (c) 1995, 2002 Petr Olsak\n"
+
+@ V programu jsou použity knihovní funkce, jejíchž prototypy jsou
+definovány ve třech standardních hlavičkových souborech.
+@<Hlavičkové ...@>=
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+@ Definujeme konstanty pro návratový kód. |OK| pro úspěšný běh,
+|WARNING| při výskytu aspoň jedné varovné zprávy, |IO_ERR| pro chybu
+v~přístupu ke vtupním nebo výstupním souborům, |BAD_OPTIONS| pro
+syntaktickou chybu na příkazové řádce a |BAD_PROGRAM| pro případ
+havárie programu. Ta by neměla nikdy nastat. Proměnná |status| bude
+obsahovat návratový kód a proměnná |prog_name| bude ukazovat na text
+nultého parametru příkazové řádky.
+@d OK 0
+@d WARNING 1
+@d IO_ERR 2
+@d BAD_OPTIONS 3
+@d BAD_PROGRAM 4
+@<Globální deklarace@>=
+char *prog_name;
+int status;
+
+@ Základní rozvržení funkce |main|.
+@<Hlavní program@>=
+int main (argc,argv)
+ int argc;
+ char **argv;
+{
+ @<Lokální proměnné funkce |main|@>;
+ prog_name=argv[0]; status = OK;
+ @<Načtení parametrů příkazového řádku@>;
+ if (!silent) fprintf (stderr, BANNER);
+ @<Inicializace datových struktur@>;
+ @<Zpracování souborů@>;
+ return status;
+}
+
+@* Parametry příkazového řádku.
+Program čte z~příkazového řádku postupně (nepovinné) parametry,
+které začínají znakem \uv{\.{-}}. Pak následují jména vstupních a výstupních
+souborů.
+\begitems
+* \.{-f} \dots\ program pracuje jako filtr (viz sekce |@<Zpracování
+ souborů@>|). Není-li tento parametr použit, program pracuje v tzv.
+ standardním režimu, kdy jednotlivé soubory jsou vstupní i výstupní.
+* \.{-s} \dots\ program nevypíše |BANNER|, ani sumarizaci, ani varování,
+ při nichž není program předčasně ukončen. Všechny tyto výpisy
+ směřují do |stderr|, takže pokud program pracuje v režimu \uv{filtr},
+ není nutné tento parametr použít.
+* \.{-r} \dots\ program maže pracovní soubor (soubory), které vytváří
+ ve standardním režimu (tj. není použit \.{-f}). V reřimu filter nemá
+ tento parametr vliv.
+* \.{-v} \dots\ parametr definuje skupinu písmen, které budou
+ interpretovány jako neslabičné předložky.
+ Např. \.{-v KkSsVvZzOoUuAI}. Pokud není parametr uveden, je použita
+ skupina uvedená v tomto příkladě.
+* \.{-m} \dots\ program neprovádí kontrolu math/text módů, tj. vlnkuje i
+ uvnitř matematického módu \TeX{}u. (Implicite tam nevlnkuje).
+* \.{-n} \dots\ prorgram neprovádí kontrolu verbatim módu, tj. vlnkuje i
+ uvnitř verbatim módu definovaném běžnými prostředími. Imlicite ve
+ verbatim prostředí nevlnkuje.
+* \.{-l} \dots\ La\TeX{} režim. Při kontrole text-math-verbatim módů jsou
+ brány v úvahu další sekvence, obvyklé v La\TeX{}ových dokumentech.
+* \.{-w} \dots\ WEB režim. Ohraničení verbatim módu je doplněno znaky
+ používanými v dokumentech WEB (např. tento dokument). Důsledek: program
+ vlnkuje dokumentační část každé sekce, ale nikoli kód.
+\enditems
+
+Definujeme funkci |printusage|, které tiskne (při chybě) stručný přehled
+možných parametrů. Nepodařilo se mi zjistit, jak se ve WEBu napíše
+kulturně dlouhý string obsahující \.{\char92n} s formátovacími
+požadavky. Byl jsem nucen to takto nehezky zapsat.
+@<Pomocné funkce@>=
+void printusage ()
+{
+ fprintf(stderr,
+ "usage: vlna [opt] [filenames]\n"
+ " opt -f : filter mode: file1 file2 ... file1->file2\n"
+ " file1 ... file1->stdout\n"
+ " ... stdin->stdout\n"
+ " nofilter: file1 [file2 file3 ...] all are in/out\n"
+ " -s : silent: no messages to stderr\n"
+ " -r : rmbackup: if nofilter, removes temporary files\n"
+ " -v charset : set of lettres to add tie, default: KkSsVvZzOoUuAI\n"
+ " -m : nomath: ignores math modes\n"
+ " -n : noverb: ignores verbatim modes\n"
+ " -l : LaTeX mode\n"
+ " -w : web mode\n");
+}
+
+@ Proměnné |isfilter|, |silent|, |rmbackup|, |nomath|, |noverb|,
+|latex|, resp. |web| říkají, že je nastaven parametr \.{-f}, \.{-s},
+\.{-r}, \.{-m}, \.{-n}, \.{-l}, resp. \.{-w}. Proměnná |charset|
+ukazuje buď na implicitní skupinu znaků |charsetdefault|, nebo (při
+použití parametru \.{-v}) na text uvedený v příkazovém řádku.
+@<Globální deklarace@>=
+int isfilter=0, silent=0, rmbackup=0, nomath=0, noverb=0, web=0, latex=0;
+char charsetdefault[]="KkSsVvZzOoUuAI";
+char *charset=charsetdefault;
+
+@ @<Načtení parametrů ...@>=
+while (argc>1 && argv[1][0] == '-') {
+ if (argv[1][2] != 0) printusage (), exit (BAD_OPTIONS);
+ switch(argv[1][1]) {
+ case 'f': isfilter = 1; break;
+ case 's': silent = 1; break;
+ case 'r': rmbackup = 1; break;
+ case 'v': argv++; argc--; charset = argv[1]; break;
+ case 'm': nomath = 1; break;
+ case 'n': noverb = 1; break;
+ case 'l': latex = 1; break;
+ case 'w': web = 1; break;
+ default: printusage (), exit (BAD_OPTIONS);
+ /* nezn\'am\'y parametr */
+ }
+ argc--; argv++;
+}
+
+@* Zpracování souborů. Parametr |MAXLEN| definuje maximální možnou
+délku jména souboru, který vytvoříme jako přechodný, nebo zálohový.
+Dále deklarujeme proměnné typu \uv{stream}.
+@d MAXLEN 120
+@<Lokální proměnné funkce...@>=
+FILE *infile, *outfile;
+char backup[MAXLEN];
+int j;
+
+@ Definujeme funkci pro výpis chybového hlášení při neúspěšném otevření
+souboru.
+@<Pomocné funkce@>=
+void ioerr (f)
+ char *f;
+{
+ fprintf(stderr, "%s: cannot open file %s\n", prog_name, f);
+}
+
+@ Způsob zpracování souborů rozlišíme podle režimu daným přepínačem \.{-f}.
+@<Zpracování souborů@>=
+if (isfilter) @<Zpracování v režimu filter@> @/
+else @<Zpracování všech souborů příkazové řádky@>
+
+@ V režimu |isfilter==1| je další zpracování závislé na počtu souborů v
+příkazové řádce:
+\begitems
+* nula souborů -- vstup je |stdin| a výstup je |stdout|,
+* jeden soubor -- je vstupní, výstup je |stdout|,
+* dva soubory -- první je vstupní, druhý výstupní,
+* více souborů -- program skončí s chybou.
+\enditems
+@<Zpracování v režimu filter@>=
+{
+ if (argc > 3) printusage (), exit (BAD_OPTIONS) ;
+ infile = stdin; outfile = stdout;
+ if (argc >= 2) infile = fopen (argv[1], "r");
+ if (infile == NULL) ioerr (argv[1]), exit (IO_ERR);
+ if (argc == 3) outfile = fopen(argv[2], "w");
+ if (outfile == NULL) ioerr (argv[2]), exit (IO_ERR);
+ if (argc >= 2) filename = argv[1];
+ else filename = NULL;
+ tie (infile, outfile);
+ if (outfile != stdout) fclose (outfile);
+ if (infile != stdin) fclose (infile);
+}
+
+@ V~režimu |isfilter==0| jsou jednotlivé soubory v~příkazovém řádku
+interpretovány jako vstupní i výstupní. Více souborů v~příkazovém řádku má
+stejný efekt, jako opakované volání programu na jednotlivé soubory.
+V~\UNIX/u lze tedy např. napsat \.{\jobname\ *.tex} a program doplní vlnky do
+všech souborů s~příponou~\.{tex}. Toto neplatí v~DOSu, protože interpretace
+masky je v~\UNIX/u starostí shellu a nikoli programu samotného. Náš program
+masku nebude interpretovat. Je-li v~tomto režimu nulový počet souborů,
+program se ukončí s~chybou.
+@<Zpracování všech souborů příkazové řádky@>=
+{
+ if (argc==1) printusage (), exit(BAD_OPTIONS);
+ while (argc>1) {
+ argc--; argv++;
+ @<Přejmenuj vstup |argv[0]| na |backup| a otevři jej jako |infile|@>;
+ if (infile == NULL) {
+ ioerr (argv[0]); continue;
+ }
+ outfile = fopen (argv[0], "w");
+ if (outfile == NULL) {
+ ioerr (argv[0]);
+ rename (backup, argv[0]);
+ status = WARNING;
+ continue;
+ }
+ filename = argv[0];
+ tie (infile, outfile);
+ fclose (outfile), fclose (infile);
+ if (rmbackup) remove (backup);
+ }
+}
+
+@ Při |isfilter==0| program přejmenuje každý zpracovávaný soubor tak, že
+změní poslední písmeno názvu souboru na znak \.{\char126}. Tento
+přejmenovaný soubor bude otevřen jako vstupní a výstupem bude původní
+soubor. Vstupní soubor při |rmbackup==0| zůstane zachován jako záloha.
+
+Proč vlnku nepřidáváme na konec názvu souboru, ale měníme ji za poslední
+znak souboru? Protože chceme, aby program fungoval i v tak nemožných
+systémech, jako je DOS.
+@<Přejmenuj vstup...@>=
+infile = NULL;
+j = strlen (argv[0]) - 1;
+if (j >= MAXLEN || argv[0][j] == '~') {
+ if (!silent) fprintf (stderr, "%s: the conflict of file name %s\n",
+ prog_name, argv[0]);
+}
+else {
+ strcpy (backup, argv[0]);
+ backup[j] = '~';
+ remove (backup);
+ j = rename (argv[0], backup);
+ if (j == 0) infile = fopen (backup, "r");
+}
+
+@* Patterny. Abychom mohli účelně definovat chování programu
+v~různých situacích, zavedeme datovou strukturu |PATTERN|. Zhruba
+řečeno, budeme sledovat vstup znak po znaku a pokud bude část vstupu
+souhlasit s~definovaným patternem, provedeme námi požadovanou
+akci. Například nejčastější aktivitu, přidání vlnky uvnitř řádku,
+spustíme v~okamžiku, kdy vstupní text odpovídá patternu \uv{\.{\ (v\
+p}}, kde \uv{\.{\ }} znamená jedna nebo více mezer a tabelátorů,
+\uv{\.{(}} je nula nebo více otevíracích závorek všeho druhu,
+\uv{\.{v}} znamená jedno písmeno z~množiny předložek (viz |charset|) a
+\uv{\.{p}} zde znamená libovolné písmeno. Příklad zde není zcela přesný.
+Přesně jsou všechny patterny pro náš program definovány v~závěrečných
+sekcích tohoto povídání.
+
+Pattern bude znamenat konečnou sekvenci tzv. pozic patternu (|PATITEM|).
+Cykly uvnitř pozic pro jednoduchost nepřipustíme. Každá pozice obsahuje
+řetězec znaků, uvažovaný pro danou pozici (v~příkladu pozice~\uv{\.{\ }} by
+obsahovala mezeru a tabelátor, zatímco pozice \.{v} odpovídá |charset|).
+Každá pozice má svůj přepínač (|flag|), který obsahuje informaci o~tom,
+zda shodu testovaného znaku s~některým prvkem v~množině znaků
+budeme považovat za úspěch či neúspěch a zda pozice se ve zkoumaném
+řetězci může vyskytovat právě jednou nebo opakovaně. Jako druhý případ
+stačí implementovat \uv{nula nebo více} protože \uv{jedna nebo více} lze
+popsat pomocí dvou pozic, první \uv{právě jednou} a následující \uv{nula
+nebo více}. Jednotlivé pozice jsou zřetězeny ukazatelem |next|, poslední
+pozice má |next==NULL|. Stejně tak jednotlivé patterny budeme
+sestavovat do seznamů a budou rovněž zřetězeny ukazatelem |next|.
+
+Pattern kromě řetězu pozic obsahuje ukazatel na funkci (proceduru) |proc|,
+která se má vykonat v~případě, že testovaný řetězec vyhovuje patternu.
+
+@d ONE 1 /* flag: prave jeden vyskyt */
+@d ANY 2 /* flag: nula nebo vice */
+@d ONE_NOT -1 /* flag: prave jednou, znak nesmi byt v mnozine */
+@d ANY_NOT -2 /* flag: nula nebo vice, znak nesmi byt v mnozine */
+
+@<Globální deklarace@>=
+typedef struct PATITEM { /* jedna pozice patternu */
+ char *str; /* seznam znaku na teto pozici */
+ int flag; /* vyznam seznamu znaku */
+ struct PATITEM *next ; /* nasledujici pozice patternu */
+} PATITEM;
+typedef struct PATTERN { /* jeden pattern */
+ PATITEM *patt; /* ukazatel na prvni pozici */
+ void (*proc)(); /* procedura spustena pri souhlasu patternu */
+ struct PATTERN *next ; /* nasledujici v seznamu vsech patternu */
+} PATTERN;
+
+@ Deklarujeme některé globální proměnné pro práci s~patterny. |lapi| je pole
+obsahující ukazatele na aktuální pozice v~otevřených patternech. Říkáme,
+že \uv{pattern je otevřen}, pokud zkoumaný řetězec s~ním {\it začíná\/}
+souhlasit. Pattern se uzavře, pokud nastane jedna ze dvou možností:
+zkoumaný řetězec s~mím souhlasí až do konce (v~takovém případě se provede
+procedura |proc|), nebo při vyšetřování dalších znaků ze zkoumaného
+řetězce přestane řetězec s~patternem souhlasit.
+
+V~dané chvíli může být pattern otevřen několikrát. Např. pattern \.{abac}
+je při stringu \.{aba} při výskytu druhého \.{a} otevřen podruhé. Proto
+pole obsahuje ukazatele na právě aktuální pozici patternu a nikoli na
+pattern jako takový.
+
+V~poli |lapi| budou na počátku samá |NULL| (to se při překladu inicializuje
+samo) a přemazání ukazatele na pozici konstantou |NULL| budeme považovat
+za zavření patternu. Vedle pole |lapi| souměrně udržujeme pole |lapt|,
+do něhož budeme ukládat ukazatele na odpovídající otevřený pattern. Tuto
+informaci použijeme v~případě, že potřebujeme např, znát |proc|
+patternu.
+
+|listpatt| bude ukazovat na začátek aktuálního seznamu patternů. Seznamy
+budeme mít dva. Jeden se použije, nacházíme-li se mimo komentář a druhý
+v~případě, že se nacházíme v~prostoru \TeX{}ovského komentáře (tj. za
+procentem). Starty těchto seznamů patternů jsou |normallist| a
+|commentlist| a aktivní |listpatt| má vždy jednu z~těchto dvou hodnot.
+
+Proměnné |lastpt| a |lastpi| použijeme pro budování řetězové struktury
+patternů.
+
+Proměnná |c| obsahuje právě testovaný znak ze vstupu (který se rovněž
+přepíše do bufferu |buff|). Z~bufferu občas ukládáme data do výstupního
+proudu. Děláme to ale vždy jen v~okamžiku, kdy není otevřen žádný
+pattern. Tehdy totiž \uv{nehrozí} situace, že by nějaká procedura vyvolaná
+souhlasem patternu požadovala v~tomto bufferu nějaké změny se zpětnou
+platností. O~vyprázdnění bufferu se začneme zajímat až v~okamžiku, kdy je
+zaplněn aspoň na hodnotu |BUFI|, abychom proceduru přepisu bufferu do
+výstupního proudu neaktivovali zbytečně často.
+@d MAXPATT 200 /* maximalni pocet patternu */
+@d MAXBUFF 500 /* velikost bufferu pro operace */
+@d BUFI 300 /* velikost stredniho zaplneni */
+@<Globální deklarace@>=
+PATITEM *lapi[MAXPATT]; /* pole ukazatelu na aktualni pozice */
+PATTERN *lapt[MAXPATT]; /* pole odpovidajicich ukazatelu na patterny */
+PATTERN *listpatt, *normallist, *commentlist, *pt, *lastpt=NULL;
+PATITEM *pi, *lastpi=NULL;
+char c; /* zrovna nacetny znak */
+char buff[MAXBUFF]; /* prechodny buffer */
+int ind; /* aktualni pozice prechodneho bufferu */
+
+@ Nyní definujeme pomocné funkce |setpattern|, |setpi| a |normalpattern|.
+Tyto funkce alokují paměť pomocí standardní funkce |malloc|. Abychom mohli
+ohlídat případnou chybu při alokaci, budeme allokovat paměť zprostředkovaně
+pomocí funkce |myalloc|.
+@<Pomocné funkce@>=
+void *myalloc (size)
+ int size;
+{
+ void *p;
+ p = malloc (size);
+ if (p == NULL)
+ {
+ fprintf (stderr, "%s, no memory, malloc failed\n", prog_name);
+ exit (BAD_PROGRAM) ;
+ }
+ return p;
+}
+
+@ Funkce |setpattern| alokuje paměťové místo struktury |PATTERN| a napojí
+ji pomocí proměnné |lastpt| na už alokovaný řetěz patternů.
+Vrátí ukazatel na nově alokované místo. Jednotlivé pozice patternu se musí
+následovně alokovat pomocí |setpi|.
+@<Pomocné funkce@>=
+PATTERN *setpattern (proc) @/
+ void (*proc)();
+{
+ PATTERN *pp;
+ pp = myalloc (sizeof (PATTERN));
+ pp->proc = proc;
+ pp->next = NULL;
+ pp->patt = NULL;
+ if (lastpt != NULL) lastpt->next = pp;
+ lastpt = pp;
+ lastpi = NULL;
+ return pp;
+}
+
+@ Funkce |setpi| alokuje paměťové místo pro jednu pozici patternu. Provede
+zřetězení tak, aby první pozice řetězu pozic byla zaznamenána v položce
+|patt| ve struktuře |PATTERN| a další byly provázány položkou |next| ve
+struktuře |PATITEM|. Poslední pozice má |next==NULL|.
+@<Pomocné funkce@>=
+void setpi (str, flag)
+ char *str;
+ int flag;
+{
+ PATITEM* p;
+ p = myalloc (sizeof (PATITEM));
+ p->str = str; p->flag = flag;
+ p->next = NULL;
+ if (lastpi == NULL) lastpt->patt = p;
+ else lastpi->next = p;
+ lastpi = p;
+}
+
+@ Připravme si půdu pro funkci |normalpattern|. Tato funkce alokuje
+strukturu pro jeden pattern včetně pozic patternu na základě vstupního
+stringu. Každá pozice patternu obsahuje v~množině znaků jediný znak a má
+|flag=ONE|. Znaky ve vstupním stringu odpovídají po řadě jednotlivým
+pozicím. Vytvoří se vlastně jakýsi absolutní pattern, tj. testovaný řetězec
+se musí přesně shodovat s~uvedeným stringem. Výjimku tvoří znak |"."|,
+který se interpretuje jako nula nebo více mezer. Chceme-li tečku
+vnutit do patternu, napíšeme dvě tečky za sebou.
+
+Nejdříve deklarujeme pole všech možných jednopísmenných stringů.
+@<Globální deklarace@>=
+char strings[512];
+int i;
+
+@ Inicializujeme toto pole (znak, nula, znak, nula, atd...).
+@<Inicializace datových struktur@>=
+for (i=0; i<256; i++) {
+ strings[2*i] = (char) i; strings[2*i+1] = 0;
+}
+
+@ Definujme funkci |normalpattern|.
+@<Pomocné funkce@>=
+PATTERN *normalpattern (proc, str) @/
+ void (*proc)();
+ char *str;
+{
+ PATTERN *pp;
+ int j=0;
+ pp = setpattern (proc);
+ while (str[j]) {
+ if (str[j]=='.') {
+ j++;
+ if (str[j]!='.') {
+ setpi (blankscr, ANY);
+ continue;
+ }
+ }
+ setpi (&strings[(unsigned char)str[j]*2], ONE);
+ j++;
+ }
+ return pp;
+}
+
+@ Funkce |match|. Definujeme funkci, která na základě hodnoty znaku |c|
+(proměnná |c| je definována jako globální), a pozice patternu |p| (parametr
+funkce) vrátí informaci o tom, zda znak souhlasí s patternem. Záporná čísla
+|FOUND|, resp. |NOFOUND| znamenají, že je třeba uzavřít pattern s tím, že
+vzor odpovídá, resp. neodpovídá patternu. Nezáporné číslo vrátí v případě,
+že zkoumaný vstup stále souhlasí s patternem, ale není ještě
+rozhodnuto. Velikost návratové hodnoty v takovém případě udává, o kolik
+pozic je třeba se posunout v patternu, abychom měli ukazatel na pozici
+patternu v souhlase s novou situací, způsobenou znakem |c|.
+
+Pokud je |c| v množině znaků pro danou pozici |p->str|, bude |m==1|, jinak
+je |m==-1|. Pokud tímto číslem pronásobíme hodnotu |p->flag|, nemusíme
+větvení podle |p->flag| programovat dvakrát. Hodnoty |flag| jsou totiž
+symetrické podle nuly, např. |ANY==-ANY_NOT|.
+@d FOUND -1
+@d NOFOUND -2
+@<Pomocné funkce@>=
+int match (p)
+ PATITEM *p;
+{
+ int m;
+ if (strchr (p->str, c) != NULL) m = 1; /* Znak nalezen */
+ else m = -1; /* Znak nenalezen */
+ switch (m * p->flag) {
+ case ANY: return 0; /* Souhas, neni nutny posun */
+ case ONE: if (p->next == NULL) return FOUND;
+ return 1; /* Souhas, nutny posun o 1 */
+ case ONE_NOT: return NOFOUND; /* Nesouhlas */
+ case ANY_NOT: @<Vrať hodnotu podle následující...@>;
+ }
+ return 0; /* Tady bychom nikdy nemeli byt, return pro potlaceni varovani */
+}
+
+@ O kolik pozic je třeba se posunout a s jakým výsledkem zjistíme
+rekurzivním voláním funkce |match|.
+@<Vrať hodnotu podle následující pozice patternu@>=
+switch (m = match (p->next)) {
+case NOFOUND: return NOFOUND;
+case FOUND: return FOUND;
+default: return 1 + m;
+}
+
+@* Vlnkovací funkce.
+Nejprve připravíme globální deklarace pro \uv{vlnkovací} funkci |tie|.
+Funkce |tie| \uv{ovlnkuje} vstupní soubor |infile| a vytvoří soubor
+|outfile|. Při |silent=0| tiskne závěrečnou zprávu o zpracování. V této
+zprávě se objeví jméno souboru, které se funkce \uv{dozví} prostřednictvím
+globální proměnné |filename|. Proměnná |numline| počítá řádky, proměnná
+|numchanges| sčítá změny, tj. počet doplněných vlnek.
+Proměnná |mode| nabývý některé z hodnot |TEXTMODE|, |MATHMODE|,
+|DISPLAYMODE| a |VERBMODE| podle stavu ve čteném textu.
+@d TEXTMODE 0
+@d MATHMODE 1
+@d DISPLAYMODE 2
+@d VERBMODE 3
+@<Globální deklarace@>=
+char *filename; /* jmeno zpracovavaneho souboru */
+long int numline, numchanges; /* pro zaverecnou statistiku */
+int mode;
+
+@ Nyní definujeme vlnkovací funkci |tie|. Veškerá činnost se opírá o
+strukturu patternů. Výhodné je (z důvodu rychlosti) \uv{natvrdo} zde
+implementovat jen přepínání mezi stavem čtení z oblasti komentáře
+(|listpatt==commentlist|) a mimo komentář (|listpatt==normallist|);
+@<Vlnkovací funkce |tie|@>=
+void tie (input, output)
+ FILE *input, *output;
+{
+ int ap; /* ap je pocet otevrenych patternu */
+ register int k, m, n;
+ int ic;
+ PATTERN *pp;
+ PATITEM *pi;
+
+ @<Inicializace proměnných při startu funkce |tie|@>;
+
+ while (!feof(input)) {
+ @<Otevři nové patterny@>;
+ if (ap == 0 && ind > BUFI && c !='\\') @<Vyprázdni buffer@>;
+ if (ind >= MAXBUFF) {
+ fprintf (stderr, "Operating buffer overflow, is anything wrong?\n");
+ exit (BAD_PROGRAM);
+ }
+ if ((ic = getc(input)) == EOF) /* opravil Cejka Rudolf */
+ break;
+ buff[ind++] = c = ic;
+ if (c == '\n') numline++, listpatt = normallist;
+ if (c == '%' && mode!=VERBMODE && buff[ind-2] != '\\') listpatt = commentlist;
+ @<Projdi otevřené patterny@>;
+ }
+ @<Vyprázdni buffer@>;
+ if (!web) checkmode (); /* zaverecna kontrola modu */
+ if (!silent) @<Tiskni závěrečnou zprávu@>;
+}
+
+@ @<Inicializace proměnných při ...@>=
+for (k=0; k<MAXPATT; k++) lapi[k] = NULL;
+c = '\n';
+buff[0] = mode = ap = 0; ind = 1;
+numline = 1; numchanges = 0;
+mode = TEXTMODE;
+
+@ Při manipulaci s bufferem byl použit jeden trik. Veškeré načtené znaky
+začínají až od |buff[1]|, zatímco |buff[0]| je rovno nule. Je to proto, že
+některé algoritmy se vrací o jeden znak zpět za svůj pattern, aby zjistily,
+zda tam není symbol \uv{\.{\char92}} (například na výskyt sekvence
+\.{\char92\char37} je třeba reagovat jinak, než na výskyt obyčejného
+procenta). Kdybychm zazačali od |buff[0]|, v některých situacích
+bychom se ptali, zda |buff[-1]=='\\'|, tj. sahali bychom na neošetřené
+místo v paměti.
+@<Vyprázdni buffer@>=
+{
+ buff[ind] = 0;
+ fputs (&buff[1], output);
+ ind = 1;
+}
+
+@ Při procházení otevřenými patterny posunujeme v poli |lapi| pozice
+jednotlivých patternů podle pokynů funkce |match|, případně pattern zavřeme
+a případně vyvoláme proceduru patternu.
+
+Některé patterny v poli |lapi| už mohou být zavřeny, takže je nutno s tímto
+polem pracovat jako s jakýmsi děravým sýrem.
+@<Projdi otevřené patterny@>=
+n = ap; k = 0;
+while (n) {
+ while (lapi[k]==NULL) k++; /* zastav se na prvnim ukazateli na pattern */
+ switch (m = match (lapi[k])) {
+ case FOUND: (*lapt[k]->proc)(); /* Pattern nalezen, spustit proceduru */
+ case NOFOUND: lapi[k] = NULL; /* Deaktivace patternu */
+ ap--; break;
+ default: while (m--) lapi[k] = lapi[k]->next; /* dalsi pozice patternu */
+ }
+ k++; n--;
+}
+
+@ Při otevírání nových patternů, které nejsou v tuto chvíli zablokovány,
+se hned vypořádáme s takovými patterny, které nám dávají rovnou odpověď
+typu |FOUND| nebo |NOFOUND|. V takových případech ani nezanášíme ukazatel
+na pozici do pole |lapi|.
+@<Otevři nové patterny@>=
+pp = listpatt;
+while (pp != NULL) {
+ switch (m = match (pp->patt)) {
+ case FOUND: (*pp->proc)(); /* spustit proceduru */
+ case NOFOUND: break;
+ default: @<Vytvoř ukazatel na nový pattern a |break|@>;
+ }
+ pp=pp->next;
+}
+
+@ Není-li hned známa odpověď, zda pattern vyhovuje či nikoli,
+překontrolujeme nejdříve, zda už není pattern ve stejné pozici otevřený.
+Pak najdeme první \uv{díru} v tabulce |lapi| a tam uhnízdíme nový ukazatel
+na pozici v patternu.
+@<Vytvoř ukazatel na nový pattern...@>=
+pi = pp->patt;
+while (m--) pi = pi->next;
+n = ap; k = 0;
+while (n) {
+ if (lapi[k]==pi) break;
+ if (lapi[k++] != NULL) n--;
+}
+if (!n) {
+ k = 0;
+ while (lapi[k] != NULL) k++;
+ if (k >= MAXPATT) {
+ fprintf (stderr, "I cannot allocate pp, is anything wrong?\n");
+ exit (BAD_PROGRAM);
+ }
+ lapt[k] = pp; lapi[k] = pi; ap++;
+}
+
+@ Poslední věcí ve funci |tie| je tisk závěrečné statistiky zpracování.
+@<Tiskni závěrečnou zprávu@>=
+fprintf (stderr, "~~~ file: %s\t lines: %ld, changes: %ld\n",
+ filename, numline, numchanges);
+
+@* Inicializace patternů.
+Po vytvoření předchozího kódu opírajícího se o~patterny máme nyní v~ruce
+poměrně silný nástroj na definování různých činností programu prostým
+vytvořením patternu a příslušné jeho procedury. Pokud budeme chtít
+v~budoucnu nějaký rys programu přidat, pravděpodobně to bude snadné.
+
+Nejprve deklarujeme některé často používané skupiny znaků v~patternech.
+
+@<Globální deklarace@>=
+char tblanks[] = " ~\t";
+char blanks[] = " \t";
+char blankscr[] = " \t\n";
+char tblankscr[] = " ~\t\n";
+char nochar[] = "%~\n";
+char cr[] = "\n";
+char prefixes[] = "[({~";
+char dolar[] = "$";
+char backslash[] = "\\";
+char openbrace[] = "{";
+char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+PATTERN *vlnkalist, *mathlist, *parcheck, *verblist ;
+
+@ Začneme definicí nejčastěji používaného patternu na vlnkování uvnitř
+řádku. Připomeňme, že opakované volání funkce |setpattern| vytváří interně
+seznam patternů, přičemž o~jejich propojení se nemusíme starat. Vyzvedneme
+si z~návratového kódu funkce pouze ukazatel na první položku seznamu
+|normallist|. Stejně tak opakované volání funkce |setpi| vytváří seznam
+pozic pro naposledy deklarovaný pattern.
+@<Inicializace datových struktur@>=
+vlnkalist = setpattern (vlnkain);
+setpi (tblankscr, ONE);
+setpi (tblanks, ANY);
+setpi (prefixes, ANY);
+setpi (charset, ONE);
+setpi (blanks, ONE);
+setpi (blanks, ANY);
+setpi (nochar, ONE_NOT);
+
+@ @<Inicializace proměnných při ...@>=
+listpatt = normallist = vlnkalist;
+
+@ @<Pomocné funkce@>=
+void vlnkain()
+{
+ char p;
+ ind--;
+ p = buff[ind--];
+ while (strchr(blanks, buff[ind]) !=NULL) ind--;
+ ind++;
+ buff[ind++] = '~';
+ buff[ind++] = p;
+ numchanges++;
+}
+
+@ Podobně pro tvorbu vlnky \uv{přes řádek} vytvoříme pattern a kód
+procedury.
+@<Inicializace dat...@>=
+setpattern (vlnkacr);
+setpi (tblankscr, ONE);
+setpi (tblanks, ANY);
+setpi (prefixes, ANY);
+setpi (charset, ONE);
+setpi (blanks, ANY);
+setpi (cr, ONE);
+setpi (blanks, ANY);
+setpi (nochar, ONE_NOT);
+
+@ V proceduře k tomuto patternu musíme ošetřit případ typu
+\uv{\.{a\char126v\char92np}},
+kdy nelze prostě přehodit \uv{\.{\char92n}} za \uv{\.{v}}, protože
+bychom roztrhli
+mezeru svázanou vlnkou už dříve. Proto musíme vyhledat vhodné místo pro
+roztržení řádku, které bude až {\it před\/} znakem \uv{\.{a}}. Při důsledném
+ošetření tohoto fenoménu můžeme dokonce narazit na situaci
+\uv{\.{\char92n\ v\char126v\char126v\char92np}}, kde nemůžeme vložit
+\uv{\.{\char92n}} před první výskyt \uv{\.{v}}, protože bychom dostali
+\uv{\.{\char92n\char92n}}, tedy prázdný
+řádek. Ten je v \TeX{}u interperetován odlišně. V této výjimečné
+situaci pouze zrušíme stávající (v pořadí druhé) \uv{\.{\char92n}} a
+nebudeme vytvářet nové. Na výstupu bude soubor o jeden řádek kratší.
+@<Pomocné funkce@>=
+void vlnkacr()
+{
+ char p;
+ int i, j;
+ ind--;
+ p = buff[ind--];
+ while (strchr(blankscr, buff[ind]) !=NULL) ind--;
+ i = ind; /* misto predlozky, kterou chceme vazat */
+ while (i >= 0 && (strchr(blankscr, buff[i]) == NULL)) i--;
+ j = i;
+ while (i >= 0 && (strchr(blanks, buff[i]) != NULL)) i--;
+ if (i >= 0 && buff[i] == '\n') j = -1;
+ if (j >= 0) buff[j] = '\n';
+ else numline--;
+ ind++;
+ buff[ind++] = '~';
+ buff[ind++] = p;
+ numchanges++;
+}
+
+@ Nyní vytvoříme patterny pro případy typu \.{\char92uv\char`\{v lese\char`\}}.
+@<Inicializace dat...@>=
+setpattern (vlnkain); /* na radku */
+setpi (tblankscr, ONE);
+setpi (backslash, ONE);
+setpi (letters, ONE);
+setpi (letters, ANY);
+setpi (openbrace, ONE);
+setpi (prefixes, ANY);
+setpi (charset, ONE);
+setpi (blanks, ONE);
+setpi (blanks, ANY);
+setpi (nochar, ONE_NOT);
+
+setpattern (vlnkacr); /* pres radek */
+setpi (tblankscr, ONE);
+setpi (backslash, ONE);
+setpi (letters, ONE);
+setpi (letters, ANY);
+setpi (openbrace, ONE);
+setpi (prefixes, ANY);
+setpi (charset, ONE);
+setpi (blanks, ANY);
+setpi (cr, ONE);
+setpi (blanks, ANY);
+setpi (nochar, ONE_NOT);
+
+
+
+@ Vytvoříme patterny a proceduru pro potlatčení tvorby vlnky u písmen těsně
+následujících sekvence \.{\char92TeX} a \.{\char92LaTeX}. Tj. nechceme, aby
+např z textu \uv{\.{Vlastnosti~\char92TeX~u~jsou...}} jsme dostali text
+s nesprávně vázaným písmenem
+\uv{\.{Vlastnosti~\char92TeX~u\char126jsou...}}.
+@<Inicializace dat...@>=
+normalpattern (tielock, "\\TeX");
+setpi (blankscr, ONE);
+normalpattern (tielock, "\\LaTeX");
+setpi (blankscr, ONE);
+
+@ Procedura |tielock| obsahuje nečistý trik. Při provádění procedury je
+právě načten znak z |blankscr| a je uložen do buff. Testy na otevírání
+nových patternů pro tento znak teprve budou následovat a testují se na
+hodnotu proměnné |c|. Stačí tedy změnit hodnotu |c| a vlnkovací patterny se
+neotevřou.
+@<Pomocné funkce@>=
+void tielock ()
+{
+ c = 1;
+}
+
+@ Ošetříme nyní přechod do/z matematického režimu \TeX{}u. Uvnitř math
+módu vlnky neděláme. Při zjištěném nesouladu v přechodech mezi
+math-módy spustíme následující proceduru.
+@<Pomocné funkce@>=
+void printwarning ()
+{
+ if (!silent)
+ fprintf (stderr,
+ "~!~ warning: text/math/verb mode mismatch, file: %s, line: %ld\n",
+ filename, numline - (c=='\n'?1:0));
+ status = WARNING;
+}
+
+@ Začneme patterny pro přechod do/z matematického režimu, ohraničeného
+jedním dolarem, nebo v La\TeX{}u příslušnými sekvencemi. Sekvence
+La\TeX{}u \.{\char92(} a \.{\char92)} nejsou zahrnuty, protože bývají
+často předefinovány k jiným užitečnějším věcem.
+@<Inicializace datových ...@>=
+if (!nomath) {
+ mathlist = setpattern (onedollar);
+ setpi (dolar, ONE);
+ setpi (dolar, ONE_NOT);
+ if (latex) {
+ normalpattern (mathin, "\\begin.{math}");
+ normalpattern (mathout, "\\end.{math}");
+ }
+}
+
+@ @<Pomocné funkce@>=
+void mathin ()
+{
+ if (mode!=TEXTMODE) printwarning ();
+ mode = MATHMODE;
+ normallist = listpatt = mathlist;
+}
+void mathout ()
+{
+ if (mode!=MATHMODE) printwarning ();
+ mode = TEXTMODE;
+ normallist = listpatt = vlnkalist;
+}
+
+@ Při programování procedury |onedollar| nesmíme zapomenout na výskyt
+sekvence \.{\char92\$}. V tom případě akci ignorujeme. Podobně u sekvence
+\.{\$\$} souhlasí ten druhý dolar s naším patternem, ale to už jsme uvnitř
+display módu. V takovém případě také nic neděláme.
+@<Pomocné funkce@>=
+void onedollar ()
+{
+ if (buff[ind-3]=='\\' || (buff[ind-3]=='$' && buff[ind-4]!='\\')) return;
+ if (mode==DISPLAYMODE) printwarning ();
+ else {
+ if (mode==TEXTMODE) mathin();
+ else mathout();
+ }
+}
+
+@ Pokud najdeme prázdný řádek, překontrolujeme, zda náhodou nejsme v
+math-módu. Pokud ano, vypíšeme varování a přejdeme do textového módu.
+@<Inicializace dat...@>=
+parcheck = setpattern (checkmode);
+setpi (cr, ONE);
+setpi (blanks, ANY);
+setpi (cr, ONE);
+
+@ @<Pomocné funkce@>=
+void checkmode ()
+{
+ if (mode!=TEXTMODE) {
+ printwarning ();
+ mode = TEXTMODE;
+ normallist = listpatt = vlnkalist;
+ }
+}
+
+@ Nyní ošetříme výskyt dvou dolarů, tj. vstup do/z display módu.
+Rovněž mysleme na La\TeX{}isty a jejich prostředí pro display-mód. Protože
+je možná alternativa s hvězdičkou na konci názvu prostředí, raději už
+uzavírací závorku do patternu nezahrnujeme.
+
+@<Inicializace dat...@>=
+if (!nomath) {
+ normalpattern (twodollars, "$$");
+ if (latex) {
+ normalpattern (displayin, "\\begin.{displaymath");
+ normalpattern (displayin, "\\begin.{equation");
+ normalpattern (displayout, "\\end.{displaymath");
+ normalpattern (displayout, "\\end.{equation");
+ }
+}
+
+@ @<Pomocné funkce@>=
+void displayin ()
+{
+ if (mode!=TEXTMODE) printwarning ();
+ mode = DISPLAYMODE; normallist = listpatt = parcheck;
+}
+void displayout ()
+{
+ if (mode!=DISPLAYMODE) printwarning();
+ mode = TEXTMODE; normallist = listpatt = vlnkalist;
+}
+void twodollars ()
+{
+ if (buff[ind-3]=='\\') return;
+ if (mode==DISPLAYMODE) displayout ();
+ else displayin ();
+}
+
+@ Následuje ošetření tzv. verbatim módu. Pro plain i La\TeX{} jsou nejčastější
+závorky pro verbatim mod tyto (variantu s \.{\char92begtt} používám
+s oblibou já).
+@<Inicializace dat...@>=
+if (!noverb) {
+ verblist = normalpattern (verbinchar, "\\verb");
+ setpi (blankscr, ANY);
+ setpi (blankscr, ONE_NOT);
+ normalpattern (verbin, "\\begtt");
+ if (latex) normalpattern (verbin, "\\begin.{verbatim");
+}
+if (web) {
+ normalpattern (verbin, "@@<");
+ normalpattern (verbin, "@@d");
+}
+if (!noverb) {
+ verboutlist[0] = setpattern (verbout);
+ setpi (verbchar, ONE);
+ verboutlist[1] = normalpattern (verbout, "\\endtt");
+ if (latex) verboutlist[2] = normalpattern (verbout, "\\end{verbatim");
+}
+if (web) {
+ verboutlist[3] = normalpattern (verbout, "@@ ");
+ normalpattern (verbout, "@@*");
+ normalpattern (verbout, "@@>|");
+}
+
+
+@ Procedura |verbinchar| se od \uv{společné} procedury |verbin| liší v
+tom, že zavede do stringu |verbchar| momentální hodnotu proměnné |c|.
+Proto druhý výskyt této hodnoty verbatim režim ukončí.
+@<Pomocné funkce@>=
+int prevmode;
+PATTERN *prevlist, *verboutlist[4];
+char verbchar[2];
+void verbinchar ()
+{
+ prevmode = mode;
+ verbchar[0] = c;
+ c = 1;
+ listpatt = normallist = verboutlist[0];
+ prevlist = listpatt->next;
+ listpatt->next = NULL;
+ mode = VERBMODE;
+}
+
+@ Při programování \uv{obecné} funkce |verbin| musíme dbát na to, aby
+zůstal aktivní pouze odpovídající \uv{výstupní} pattern k danému
+vstupnímu. Také si zapamatujeme mód, ze kterého jsme do verbatim
+oblasti vstoupili, abychom se k němu mohli vrátit (např. uvnitř
+math. módu může být
+\.{\char92hbox} a v něm lokálně verbatim konstrukce).
+@<Pomocné funkce@>=
+void verbin ()
+{
+ int i;
+ i = 0;
+ prevmode = mode;
+ switch (c) {
+ case 't': i = 1; break;
+ case 'm': i = 2; break;
+ case '<': ;
+ case 'd': i = 3;
+ if (buff[ind-3]=='@@') return; /* dvojity @@ ignorovat */
+ break;
+ }
+ listpatt = normallist = verboutlist[i];
+ prevlist = listpatt->next;
+ if (c != '<' && c != 'd') listpatt->next = NULL;
+ mode = VERBMODE;
+}
+
+@ @<Pomocné funkce@>=
+void verbout ()
+{
+ if (mode!=VERBMODE) return;
+ if (web && buff[ind-2] == '@@' && buff[ind-3] == '@@') return;
+ mode = prevmode;
+ normallist->next = prevlist;
+ switch (mode) {
+ case DISPLAYMODE: normallist = listpatt = parcheck; break;
+ case MATHMODE: normallist = listpatt = mathlist; break ;
+ case TEXTMODE: normallist = listpatt = vlnkalist; break;
+ }
+}
+
+@ Nyní implementujeme vlastnost dříve používaného programu vlnka, tj. že
+lze jeho činnost vypnout a opět zapnout v komentářích. Vytváříme druhý
+nezávislý seznam patternů a proto nejprve pronulujeme |lastpt|.
+@<Inicializace dat...@>=
+lastpt = 0;
+commentlist = normalpattern (tieoff, "%.~.-");
+normalpattern (tieon, "%.~.+");
+
+@ @<Pomocné funkce@>=
+void tieoff ()
+{
+ normallist = NULL;
+}
+void tieon ()
+{
+ normallist = vlnkalist;
+}
+
+@ Další plánovaná vylepšení. Program by mohl číst definici svého chování
+nejen z~příkazové řádky, ale v~mnohem kompletnější podobě, včetně
+uživatelsky definovaných patternů, z komentářové oblasti ve čteném souboru.
+Parametry zde uvedené by mohly mít vyšší prioritu, než parametry
+z~příkazové řádky a mohl by se třeba rozšiřovat seznam sekvencí, za nimiž
+písmena nemají být vázana vlnkou (zatím je implemenováno na pevno jen
+\.{\char92TeX} a \.{\char92LaTeX}).
+
+@* Rejstřík.
+
+
diff --git a/Build/source/utils/vlna/win32.mak b/Build/source/utils/vlna/win32.mak
new file mode 100644
index 00000000000..a3b16760f1f
--- /dev/null
+++ b/Build/source/utils/vlna/win32.mak
@@ -0,0 +1,56 @@
+################################################################################
+#
+# Makefile : Vlna
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <02/06/03 15:10:30 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+programs = $(objdir)\vlna.exe
+manfiles = vlna.1
+infofiles =
+installinfoflags =
+
+objects= $(objdir)\vlna.obj
+
+default: all
+
+all: $(objdir) $(programs)
+
+$(objdir)\vlna.exe: $(objdir)\vlna.obj
+ $(link) $(**) $(conlibs)
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+vlna.1: vlna.man
+ -@$(sed) -e "s|@BINDIR@|$(bindir)|;\
+ s|@MANDIR@|$(mandir)|;\
+ s|@MANEXT@|$(manext)|" vlna.man > vlna.$(manext)
+
+install:: install-exec install-man
+
+
+!include <msvc/clean.mak>
+
+clean::
+ -@$(del) sample1.rb2 sample2.rb2 sample1.tst sample2.tst
+
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file
diff --git a/Build/source/utils/win32.mak b/Build/source/utils/win32.mak
new file mode 100644
index 00000000000..23becebf366
--- /dev/null
+++ b/Build/source/utils/win32.mak
@@ -0,0 +1,39 @@
+################################################################################
+#
+# Makefile : fpTeX utils subdirectory
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <03/08/21 11:49:39 popineau>
+#
+################################################################################
+root_srcdir = ..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+!include <msvc/common.mak>
+
+# Package subdirectories, the library, and all subdirectories.
+subdirs = \
+ bzip2 \
+ gzip \
+# dvipng \
+ jpeg2ps \
+ lcdf-typetools \
+ psutils \
+ t1utils \
+ texinfo \
+ vlna \
+ TeXSetup \
+ TeXLive
+
+!include <msvc/subdirs.mak>
+!include <msvc/clean.mak>
+
+#
+# Local Variables:
+# mode: Makefile
+# End:
+# DO NOT DELETE